diff --git a/README.md b/README.md index 7c20eb1..d8e8906 100644 --- a/README.md +++ b/README.md @@ -1,64 +1 @@ -# CodeIgniter 4 Application Starter - -## What is CodeIgniter? - -CodeIgniter is a PHP full-stack web framework that is light, fast, flexible, and secure. -More information can be found at the [official site](http://codeigniter.com). - -This repository holds a composer-installable app starter. -It has been built from the -[development repository](https://github.com/codeigniter4/CodeIgniter4). - -More information about the plans for version 4 can be found in [the announcement](http://forum.codeigniter.com/thread-62615.html) on the forums. - -The user guide corresponding to this version of the framework can be found -[here](https://codeigniter4.github.io/userguide/). - -## Installation & updates - -`composer create-project codeigniter4/appstarter` then `composer update` whenever -there is a new release of the framework. - -When updating, check the release notes to see if there are any changes you might need to apply -to your `app` folder. The affected files can be copied or merged from -`vendor/codeigniter4/framework/app`. - -## Setup - -Copy `env` to `.env` and tailor for your app, specifically the baseURL -and any database settings. - -## Important Change with index.php - -`index.php` is no longer in the root of the project! It has been moved inside the *public* folder, -for better security and separation of components. - -This means that you should configure your web server to "point" to your project's *public* folder, and -not to the project root. A better practice would be to configure a virtual host to point there. A poor practice would be to point your web server to the project root and expect to enter *public/...*, as the rest of your logic and the -framework are exposed. - -**Please** read the user guide for a better explanation of how CI4 works! -The user guide updating and deployment is a bit awkward at the moment, but we are working on it! - -## Repository Management - -We use Github issues, in our main repository, to track **BUGS** and to track approved **DEVELOPMENT** work packages. -We use our [forum](http://forum.codeigniter.com) to provide SUPPORT and to discuss -FEATURE REQUESTS. - -This repository is a "distribution" one, built by our release preparation script. -Problems with it can be raised on our forum, or as issues in the main repository. - -## Server Requirements - -PHP version 7.2 or higher is required, with the following extensions installed: - -- [intl](http://php.net/manual/en/intl.requirements.php) -- [libcurl](http://php.net/manual/en/curl.requirements.php) if you plan to use the HTTP\CURLRequest library - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- [mbstring](http://php.net/manual/en/mbstring.installation.php) -- [mysqlnd](http://php.net/manual/en/mysqlnd.install.php) -- xml (enabled by default - don't turn it off) +# Donation Management Reworked diff --git a/app/.htaccess b/app/.htaccess deleted file mode 100644 index f24db0a..0000000 --- a/app/.htaccess +++ /dev/null @@ -1,6 +0,0 @@ - - Require all denied - - - Deny from all - diff --git a/app/Common.php b/app/Common.php deleted file mode 100644 index 780ba3f..0000000 --- a/app/Common.php +++ /dev/null @@ -1,15 +0,0 @@ -baseURL = 'http://localhost/donation/'; - // } - // else - // { - // $allowed_domains = array('domain1.co.uk', 'domain1.com', 'domain1-preview.host.co.uk'); - // $default_domain = 'domain1.co.uk'; - - // if (in_array($_SERVER['HTTP_HOST'], $allowed_domains, true)) - // { - // $domain = $_SERVER['HTTP_HOST']; - // } - // else - // { - // $domain = $default_domain; - // } - - // if (!empty($_SERVER['HTTPS'])) - // { - // $this->baseURL = 'https://' . $domain; - // } - // else - // { - // $this->baseURL = 'http://' . $domain; - // } - // } - // parent::__construct(); - // } - // public $baseURL = BASE; - /* - |-------------------------------------------------------------------------- - | Index File - |-------------------------------------------------------------------------- - | - | Typically this will be your index.php file, unless you've renamed it to - | something else. If you are using mod_rewrite to remove the page set this - | variable so that it is blank. - | - */ - public $indexPage = 'index.php'; - - /* - |-------------------------------------------------------------------------- - | URI PROTOCOL - |-------------------------------------------------------------------------- - | - | This item determines which getServer global should be used to retrieve the - | URI string. The default setting of 'REQUEST_URI' works for most servers. - | If your links do not seem to work, try one of the other delicious flavors: - | - | 'REQUEST_URI' Uses $_SERVER['REQUEST_URI'] - | 'QUERY_STRING' Uses $_SERVER['QUERY_STRING'] - | 'PATH_INFO' Uses $_SERVER['PATH_INFO'] - | - | WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded! - */ - public $uriProtocol = 'PATH_INFO'; - // public $uriProtocol = 'REQUEST_URI'; - - /* - |-------------------------------------------------------------------------- - | Default Locale - |-------------------------------------------------------------------------- - | - | The Locale roughly represents the language and location that your visitor - | is viewing the site from. It affects the language strings and other - | strings (like currency markers, numbers, etc), that your program - | should run under for this request. - | - */ - public $defaultLocale = 'en'; - - /* - |-------------------------------------------------------------------------- - | Negotiate Locale - |-------------------------------------------------------------------------- - | - | If true, the current Request object will automatically determine the - | language to use based on the value of the Accept-Language header. - | - | If false, no automatic detection will be performed. - | - */ - public $negotiateLocale = false; - - /* - |-------------------------------------------------------------------------- - | Supported Locales - |-------------------------------------------------------------------------- - | - | If $negotiateLocale is true, this array lists the locales supported - | by the application in descending order of priority. If no match is - | found, the first locale will be used. - | - */ - public $supportedLocales = ['en']; - - /* - |-------------------------------------------------------------------------- - | Application Timezone - |-------------------------------------------------------------------------- - | - | The default timezone that will be used in your application to display - | dates with the date helper, and can be retrieved through app_timezone() - | - */ - public $appTimezone = 'America/Chicago'; - - /* - |-------------------------------------------------------------------------- - | Default Character Set - |-------------------------------------------------------------------------- - | - | This determines which character set is used by default in various methods - | that require a character set to be provided. - | - | See http://php.net/htmlspecialchars for a list of supported charsets. - | - */ - public $charset = 'UTF-8'; - - /* - |-------------------------------------------------------------------------- - | URI PROTOCOL - |-------------------------------------------------------------------------- - | - | If true, this will force every request made to this application to be - | made via a secure connection (HTTPS). If the incoming request is not - | secure, the user will be redirected to a secure version of the page - | and the HTTP Strict Transport Security header will be set. - */ - public $forceGlobalSecureRequests = false; - - /* - |-------------------------------------------------------------------------- - | Session Variables - |-------------------------------------------------------------------------- - | - | 'sessionDriver' - | - | The storage driver to use: files, database, redis, memcached - | - CodeIgniter\Session\Handlers\FileHandler - | - CodeIgniter\Session\Handlers\DatabaseHandler - | - CodeIgniter\Session\Handlers\MemcachedHandler - | - CodeIgniter\Session\Handlers\RedisHandler - | - | 'sessionCookieName' - | - | The session cookie name, must contain only [0-9a-z_-] characters - | - | 'sessionExpiration' - | - | The number of SECONDS you want the session to last. - | Setting to 0 (zero) means expire when the browser is closed. - | - | 'sessionSavePath' - | - | The location to save sessions to, driver dependent. - | - | For the 'files' driver, it's a path to a writable directory. - | WARNING: Only absolute paths are supported! - | - | For the 'database' driver, it's a table name. - | Please read up the manual for the format with other session drivers. - | - | IMPORTANT: You are REQUIRED to set a valid save path! - | - | 'sessionMatchIP' - | - | Whether to match the user's IP address when reading the session data. - | - | WARNING: If you're using the database driver, don't forget to update - | your session table's PRIMARY KEY when changing this setting. - | - | 'sessionTimeToUpdate' - | - | How many seconds between CI regenerating the session ID. - | - | 'sessionRegenerateDestroy' - | - | Whether to destroy session data associated with the old session ID - | when auto-regenerating the session ID. When set to FALSE, the data - | will be later deleted by the garbage collector. - | - | Other session cookie settings are shared with the rest of the application, - | except for 'cookie_prefix' and 'cookie_httponly', which are ignored here. - | - */ - public $sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler'; - public $sessionCookieName = 'ci_session'; - public $sessionExpiration = 7200; - public $sessionSavePath = WRITEPATH . 'session'; - public $sessionMatchIP = false; - public $sessionTimeToUpdate = 300; - public $sessionRegenerateDestroy = false; - - /* - |-------------------------------------------------------------------------- - | Cookie Related Variables - |-------------------------------------------------------------------------- - | - | 'cookiePrefix' = Set a cookie name prefix if you need to avoid collisions - | 'cookieDomain' = Set to .your-domain.com for site-wide cookies - | 'cookiePath' = Typically will be a forward slash - | 'cookieSecure' = Cookie will only be set if a secure HTTPS connection exists. - | 'cookieHTTPOnly' = Cookie will only be accessible via HTTP(S) (no javascript) - | - | Note: These settings (with the exception of 'cookie_prefix' and - | 'cookie_httponly') will also affect sessions. - | - */ - public $cookiePrefix = ''; - public $cookieDomain = ''; - public $cookiePath = '/'; - public $cookieSecure = false; - public $cookieHTTPOnly = false; - - /* - |-------------------------------------------------------------------------- - | Reverse Proxy IPs - |-------------------------------------------------------------------------- - | - | If your server is behind a reverse proxy, you must whitelist the proxy - | IP addresses from which CodeIgniter should trust headers such as - | HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify - | the visitor's IP address. - | - | You can use both an array or a comma-separated list of proxy addresses, - | as well as specifying whole subnets. Here are a few examples: - | - | Comma-separated: '10.0.1.200,192.168.5.0/24' - | Array: array('10.0.1.200', '192.168.5.0/24') - */ - public $proxyIPs = ''; - - /* - |-------------------------------------------------------------------------- - | Cross Site Request Forgery - |-------------------------------------------------------------------------- - | Enables a CSRF cookie token to be set. When set to TRUE, token will be - | checked on a submitted form. If you are accepting user data, it is strongly - | recommended CSRF protection be enabled. - | - | CSRFTokenName = The token name - | CSRFHeaderName = The header name - | CSRFCookieName = The cookie name - | CSRFExpire = The number in seconds the token should expire. - | CSRFRegenerate = Regenerate token on every submission - | CSRFRedirect = Redirect to previous page with error on failure - */ - public $CSRFTokenName = 'csrf_test_name'; - public $CSRFHeaderName = 'X-CSRF-TOKEN'; - public $CSRFCookieName = 'csrf_cookie_name'; - public $CSRFExpire = 7200; - public $CSRFRegenerate = true; - public $CSRFRedirect = true; - - /* - |-------------------------------------------------------------------------- - | Content Security Policy - |-------------------------------------------------------------------------- - | Enables the Response's Content Secure Policy to restrict the sources that - | can be used for images, scripts, CSS files, audio, video, etc. If enabled, - | the Response object will populate default values for the policy from the - | ContentSecurityPolicy.php file. Controllers can always add to those - | restrictions at run time. - | - | For a better understanding of CSP, see these documents: - | - http://www.html5rocks.com/en/tutorials/security/content-security-policy/ - | - http://www.w3.org/TR/CSP/ - */ - public $CSPEnabled = false; -} diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php deleted file mode 100644 index ca24aa7..0000000 --- a/app/Config/Autoload.php +++ /dev/null @@ -1,68 +0,0 @@ - SYSTEMPATH, - * 'App' => APPPATH - * ]; - * - * @var array - */ - public $psr4 = [ - APP_NAMESPACE => APPPATH, // For custom app namespace - 'Config' => APPPATH . 'Config', - 'Dompdf' => APPPATH . 'ThirdParty/dompdf/src', - ]; - - - /** - * ------------------------------------------------------------------- - * Class Map - * ------------------------------------------------------------------- - * The class map provides a map of class names and their exact - * location on the drive. Classes loaded in this manner will have - * slightly faster performance because they will not have to be - * searched for within one or more directories as they would if they - * were being autoloaded through a namespace. - * - * Prototype: - * - * $classmap = [ - * 'MyClass' => '/path/to/class/file.php' - * ]; - * - * @var array - */ - public $classmap = []; -} diff --git a/app/Config/Boot/development.php b/app/Config/Boot/development.php deleted file mode 100644 index 63fdd88..0000000 --- a/app/Config/Boot/development.php +++ /dev/null @@ -1,32 +0,0 @@ - '127.0.0.1', - 'port' => 11211, - 'weight' => 1, - 'raw' => false, - ]; - - /* - | ------------------------------------------------------------------------- - | Redis settings - | ------------------------------------------------------------------------- - | Your Redis server can be specified below, if you are using - | the Redis or Predis drivers. - | - */ - public $redis = [ - 'host' => '127.0.0.1', - 'password' => null, - 'port' => 6379, - 'timeout' => 0, - 'database' => 0, - ]; - - /* - |-------------------------------------------------------------------------- - | Available Cache Handlers - |-------------------------------------------------------------------------- - | - | This is an array of cache engine alias' and class names. Only engines - | that are listed here are allowed to be used. - | - */ - public $validHandlers = [ - 'dummy' => \CodeIgniter\Cache\Handlers\DummyHandler::class, - 'file' => \CodeIgniter\Cache\Handlers\FileHandler::class, - 'memcached' => \CodeIgniter\Cache\Handlers\MemcachedHandler::class, - 'predis' => \CodeIgniter\Cache\Handlers\PredisHandler::class, - 'redis' => \CodeIgniter\Cache\Handlers\RedisHandler::class, - 'wincache' => \CodeIgniter\Cache\Handlers\WincacheHandler::class, - ]; -} diff --git a/app/Config/Constants.php b/app/Config/Constants.php deleted file mode 100644 index 4c05961..0000000 --- a/app/Config/Constants.php +++ /dev/null @@ -1,92 +0,0 @@ - '', - 'hostname' => 'venbainfotech.com', - 'username' => 'kasirama_donr', - 'password' => 'gx2BEG=qc+D0', - 'database' => 'kasirama_donr', - 'DBDriver' => 'MySQLi', - 'DBPrefix' => '', - 'pConnect' => false, - 'DBDebug' => (ENVIRONMENT !== 'production'), - 'cacheOn' => false, - 'cacheDir' => '', - 'charset' => 'utf8', - 'DBCollat' => 'utf8_general_ci', - 'swapPre' => '', - 'encrypt' => false, - 'compress' => false, - 'strictOn' => false, - 'failover' => [], - 'port' => 3306, - ]; - - /** - * This database connection is used when - * running PHPUnit database tests. - * - * @var array - */ - public $tests = [ - 'DSN' => '', - 'hostname' => '127.0.0.1', - 'username' => '', - 'password' => '', - 'database' => ':memory:', - 'DBDriver' => 'SQLite3', - 'DBPrefix' => 'db_', // Needed to ensure we're working correctly with prefixes live. DO NOT REMOVE FOR CI DEVS - 'pConnect' => false, - 'DBDebug' => (ENVIRONMENT !== 'production'), - 'cacheOn' => false, - 'cacheDir' => '', - 'charset' => 'utf8', - 'DBCollat' => 'utf8_general_ci', - 'swapPre' => '', - 'encrypt' => false, - 'compress' => false, - 'strictOn' => false, - 'failover' => [], - 'port' => 3306, - ]; - - //-------------------------------------------------------------------- - - public function __construct() - { - parent::__construct(); - - // Ensure that we always set the database group to 'tests' if - // we are currently running an automated test suite, so that - // we don't overwrite live data on accident. - if (ENVIRONMENT === 'testing') - { - $this->defaultGroup = 'tests'; - - // Under Travis-CI, we can set an ENV var named 'DB_GROUP' - // so that we can test against multiple databases. - if ($group = getenv('DB')) - { - if (is_file(TESTPATH . 'travis/Database.php')) - { - require TESTPATH . 'travis/Database.php'; - - if (! empty($dbconfig) && array_key_exists($group, $dbconfig)) - { - $this->tests = $dbconfig[$group]; - } - } - } - } - } - - //-------------------------------------------------------------------- - -} diff --git a/app/Config/DocTypes.php b/app/Config/DocTypes.php deleted file mode 100644 index 67d5dd2..0000000 --- a/app/Config/DocTypes.php +++ /dev/null @@ -1,33 +0,0 @@ - '', - 'xhtml1-strict' => '', - 'xhtml1-trans' => '', - 'xhtml1-frame' => '', - 'xhtml-basic11' => '', - 'html5' => '', - 'html4-strict' => '', - 'html4-trans' => '', - 'html4-frame' => '', - 'mathml1' => '', - 'mathml2' => '', - 'svg10' => '', - 'svg11' => '', - 'svg11-basic' => '', - 'svg11-tiny' => '', - 'xhtml-math-svg-xh' => '', - 'xhtml-math-svg-sh' => '', - 'xhtml-rdfa-1' => '', - 'xhtml-rdfa-2' => '', - ]; -} diff --git a/app/Config/Email.php b/app/Config/Email.php deleted file mode 100644 index 41a2746..0000000 --- a/app/Config/Email.php +++ /dev/null @@ -1,172 +0,0 @@ - 0) - { - ob_end_flush(); - } - - ob_start(function ($buffer) { - return $buffer; - }); - } - - /* - * -------------------------------------------------------------------- - * Debug Toolbar Listeners. - * -------------------------------------------------------------------- - * If you delete, they will no longer be collected. - */ - if (ENVIRONMENT !== 'production') - { - Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect'); - Services::toolbar()->respond(); - } -}); diff --git a/app/Config/Exceptions.php b/app/Config/Exceptions.php deleted file mode 100644 index 5fe33d3..0000000 --- a/app/Config/Exceptions.php +++ /dev/null @@ -1,42 +0,0 @@ - \CodeIgniter\Filters\CSRF::class, - 'toolbar' => \CodeIgniter\Filters\DebugToolbar::class, - 'honeypot' => \CodeIgniter\Filters\Honeypot::class, - ]; - - // Always applied before every request - public $globals = [ - 'before' => [ - //'honeypot' - // 'csrf', - ], - 'after' => [ - 'toolbar', - //'honeypot' - ], - ]; - - // Works on all of a particular HTTP method - // (GET, POST, etc) as BEFORE filters only - // like: 'post' => ['CSRF', 'throttle'], - public $methods = []; - - // List filter aliases and any before/after uri patterns - // that they should run on, like: - // 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']], - public $filters = []; -} diff --git a/app/Config/ForeignCharacters.php b/app/Config/ForeignCharacters.php deleted file mode 100644 index 8ee6f11..0000000 --- a/app/Config/ForeignCharacters.php +++ /dev/null @@ -1,6 +0,0 @@ - \CodeIgniter\Format\JSONFormatter::class, - 'application/xml' => \CodeIgniter\Format\XMLFormatter::class, - 'text/xml' => \CodeIgniter\Format\XMLFormatter::class, - ]; - - /* - |-------------------------------------------------------------------------- - | Formatters Options - |-------------------------------------------------------------------------- - | - | Additional Options to adjust default formatters behaviour. - | For each mime type, list the additional options that should be used. - | - */ - public $formatterOptions = [ - 'application/json' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES, - 'application/xml' => 0, - 'text/xml' => 0, - ]; - //-------------------------------------------------------------------- - - /** - * A Factory method to return the appropriate formatter for the given mime type. - * - * @param string $mime - * - * @return \CodeIgniter\Format\FormatterInterface - */ - public function getFormatter(string $mime) - { - if (! array_key_exists($mime, $this->formatters)) - { - throw new \InvalidArgumentException('No Formatter defined for mime type: ' . $mime); - } - - $class = $this->formatters[$mime]; - - if (! class_exists($class)) - { - throw new \BadMethodCallException($class . ' is not a valid Formatter.'); - } - - return new $class(); - } - - //-------------------------------------------------------------------- - -} diff --git a/app/Config/Honeypot.php b/app/Config/Honeypot.php deleted file mode 100644 index 3d9e372..0000000 --- a/app/Config/Honeypot.php +++ /dev/null @@ -1,42 +0,0 @@ -{label}'; - - /** - * Honeypot container - * - * @var string - */ - public $container = '
{template}
'; -} diff --git a/app/Config/Images.php b/app/Config/Images.php deleted file mode 100644 index a416b8b..0000000 --- a/app/Config/Images.php +++ /dev/null @@ -1,31 +0,0 @@ - \CodeIgniter\Images\Handlers\GDHandler::class, - 'imagick' => \CodeIgniter\Images\Handlers\ImageMagickHandler::class, - ]; -} diff --git a/app/Config/Kint.php b/app/Config/Kint.php deleted file mode 100644 index 09db83d..0000000 --- a/app/Config/Kint.php +++ /dev/null @@ -1,62 +0,0 @@ - [ - - /* - * The log levels that this handler will handle. - */ - 'handles' => [ - 'critical', - 'alert', - 'emergency', - 'debug', - 'error', - 'info', - 'notice', - 'warning', - ], - - /* - * The default filename extension for log files. - * An extension of 'php' allows for protecting the log files via basic - * scripting, when they are to be stored under a publicly accessible directory. - * - * Note: Leaving it blank will default to 'log'. - */ - 'fileExtension' => '', - - /* - * The file system permissions to be applied on newly created log files. - * - * IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal - * integer notation (i.e. 0700, 0644, etc.) - */ - 'filePermissions' => 0644, - - /* - * Logging Directory Path - * - * By default, logs are written to WRITEPATH . 'logs/' - * Specify a different destination here, if desired. - */ - 'path' => '', - ], - - /** - * The ChromeLoggerHandler requires the use of the Chrome web browser - * and the ChromeLogger extension. Uncomment this block to use it. - */ - // 'CodeIgniter\Log\Handlers\ChromeLoggerHandler' => [ - // /* - // * The log levels that this handler will handle. - // */ - // 'handles' => ['critical', 'alert', 'emergency', 'debug', - // 'error', 'info', 'notice', 'warning'], - // ] - ]; -} diff --git a/app/Config/Migrations.php b/app/Config/Migrations.php deleted file mode 100644 index b83fe90..0000000 --- a/app/Config/Migrations.php +++ /dev/null @@ -1,50 +0,0 @@ - php spark migrate:create - | - | Typical formats: - | YmdHis_ - | Y-m-d-His_ - | Y_m_d_His_ - | - */ - public $timestampFormat = 'Y-m-d-His_'; - -} diff --git a/app/Config/Mimes.php b/app/Config/Mimes.php deleted file mode 100644 index 41014d4..0000000 --- a/app/Config/Mimes.php +++ /dev/null @@ -1,530 +0,0 @@ - [ - 'application/mac-binhex40', - 'application/mac-binhex', - 'application/x-binhex40', - 'application/x-mac-binhex40', - ], - 'cpt' => 'application/mac-compactpro', - 'csv' => [ - 'text/csv', - 'text/x-comma-separated-values', - 'text/comma-separated-values', - 'application/octet-stream', - 'application/vnd.ms-excel', - 'application/x-csv', - 'text/x-csv', - 'application/csv', - 'application/excel', - 'application/vnd.msexcel', - 'text/plain', - ], - 'bin' => [ - 'application/macbinary', - 'application/mac-binary', - 'application/octet-stream', - 'application/x-binary', - 'application/x-macbinary', - ], - 'dms' => 'application/octet-stream', - 'lha' => 'application/octet-stream', - 'lzh' => 'application/octet-stream', - 'exe' => [ - 'application/octet-stream', - 'application/x-msdownload', - ], - 'class' => 'application/octet-stream', - 'psd' => [ - 'application/x-photoshop', - 'image/vnd.adobe.photoshop', - ], - 'so' => 'application/octet-stream', - 'sea' => 'application/octet-stream', - 'dll' => 'application/octet-stream', - 'oda' => 'application/oda', - 'pdf' => [ - 'application/pdf', - 'application/force-download', - 'application/x-download', - 'binary/octet-stream', - ], - 'ai' => [ - 'application/pdf', - 'application/postscript', - ], - 'eps' => 'application/postscript', - 'ps' => 'application/postscript', - 'smi' => 'application/smil', - 'smil' => 'application/smil', - 'mif' => 'application/vnd.mif', - 'xls' => [ - 'application/vnd.ms-excel', - 'application/msexcel', - 'application/x-msexcel', - 'application/x-ms-excel', - 'application/x-excel', - 'application/x-dos_ms_excel', - 'application/xls', - 'application/x-xls', - 'application/excel', - 'application/download', - 'application/vnd.ms-office', - 'application/msword', - ], - 'ppt' => [ - 'application/vnd.ms-powerpoint', - 'application/powerpoint', - 'application/vnd.ms-office', - 'application/msword', - ], - 'pptx' => [ - 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'application/x-zip', - 'application/zip', - ], - 'wbxml' => 'application/wbxml', - 'wmlc' => 'application/wmlc', - 'dcr' => 'application/x-director', - 'dir' => 'application/x-director', - 'dxr' => 'application/x-director', - 'dvi' => 'application/x-dvi', - 'gtar' => 'application/x-gtar', - 'gz' => 'application/x-gzip', - 'gzip' => 'application/x-gzip', - 'php' => [ - 'application/x-php', - 'application/x-httpd-php', - 'application/php', - 'text/php', - 'text/x-php', - 'application/x-httpd-php-source', - ], - 'php4' => 'application/x-httpd-php', - 'php3' => 'application/x-httpd-php', - 'phtml' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'js' => [ - 'application/x-javascript', - 'text/plain', - ], - 'swf' => 'application/x-shockwave-flash', - 'sit' => 'application/x-stuffit', - 'tar' => 'application/x-tar', - 'tgz' => [ - 'application/x-tar', - 'application/x-gzip-compressed', - ], - 'z' => 'application/x-compress', - 'xhtml' => 'application/xhtml+xml', - 'xht' => 'application/xhtml+xml', - 'zip' => [ - 'application/x-zip', - 'application/zip', - 'application/x-zip-compressed', - 'application/s-compressed', - 'multipart/x-zip', - ], - 'rar' => [ - 'application/x-rar', - 'application/rar', - 'application/x-rar-compressed', - ], - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mpga' => 'audio/mpeg', - 'mp2' => 'audio/mpeg', - 'mp3' => [ - 'audio/mpeg', - 'audio/mpg', - 'audio/mpeg3', - 'audio/mp3', - ], - 'aif' => [ - 'audio/x-aiff', - 'audio/aiff', - ], - 'aiff' => [ - 'audio/x-aiff', - 'audio/aiff', - ], - 'aifc' => 'audio/x-aiff', - 'ram' => 'audio/x-pn-realaudio', - 'rm' => 'audio/x-pn-realaudio', - 'rpm' => 'audio/x-pn-realaudio-plugin', - 'ra' => 'audio/x-realaudio', - 'rv' => 'video/vnd.rn-realvideo', - 'wav' => [ - 'audio/x-wav', - 'audio/wave', - 'audio/wav', - ], - 'bmp' => [ - 'image/bmp', - 'image/x-bmp', - 'image/x-bitmap', - 'image/x-xbitmap', - 'image/x-win-bitmap', - 'image/x-windows-bmp', - 'image/ms-bmp', - 'image/x-ms-bmp', - 'application/bmp', - 'application/x-bmp', - 'application/x-win-bitmap', - ], - 'gif' => 'image/gif', - 'jpg' => [ - 'image/jpeg', - 'image/pjpeg', - ], - 'jpeg' => [ - 'image/jpeg', - 'image/pjpeg', - ], - 'jpe' => [ - 'image/jpeg', - 'image/pjpeg', - ], - 'jp2' => [ - 'image/jp2', - 'video/mj2', - 'image/jpx', - 'image/jpm', - ], - 'j2k' => [ - 'image/jp2', - 'video/mj2', - 'image/jpx', - 'image/jpm', - ], - 'jpf' => [ - 'image/jp2', - 'video/mj2', - 'image/jpx', - 'image/jpm', - ], - 'jpg2' => [ - 'image/jp2', - 'video/mj2', - 'image/jpx', - 'image/jpm', - ], - 'jpx' => [ - 'image/jp2', - 'video/mj2', - 'image/jpx', - 'image/jpm', - ], - 'jpm' => [ - 'image/jp2', - 'video/mj2', - 'image/jpx', - 'image/jpm', - ], - 'mj2' => [ - 'image/jp2', - 'video/mj2', - 'image/jpx', - 'image/jpm', - ], - 'mjp2' => [ - 'image/jp2', - 'video/mj2', - 'image/jpx', - 'image/jpm', - ], - 'png' => [ - 'image/png', - 'image/x-png', - ], - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'css' => [ - 'text/css', - 'text/plain', - ], - 'html' => [ - 'text/html', - 'text/plain', - ], - 'htm' => [ - 'text/html', - 'text/plain', - ], - 'shtml' => [ - 'text/html', - 'text/plain', - ], - 'txt' => 'text/plain', - 'text' => 'text/plain', - 'log' => [ - 'text/plain', - 'text/x-log', - ], - 'rtx' => 'text/richtext', - 'rtf' => 'text/rtf', - 'xml' => [ - 'application/xml', - 'text/xml', - 'text/plain', - ], - 'xsl' => [ - 'application/xml', - 'text/xsl', - 'text/xml', - ], - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpe' => 'video/mpeg', - 'qt' => 'video/quicktime', - 'mov' => 'video/quicktime', - 'avi' => [ - 'video/x-msvideo', - 'video/msvideo', - 'video/avi', - 'application/x-troff-msvideo', - ], - 'movie' => 'video/x-sgi-movie', - 'doc' => [ - 'application/msword', - 'application/vnd.ms-office', - ], - 'docx' => [ - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'application/zip', - 'application/msword', - 'application/x-zip', - ], - 'dot' => [ - 'application/msword', - 'application/vnd.ms-office', - ], - 'dotx' => [ - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'application/zip', - 'application/msword', - ], - 'xlsx' => [ - 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'application/zip', - 'application/vnd.ms-excel', - 'application/msword', - 'application/x-zip', - ], - 'word' => [ - 'application/msword', - 'application/octet-stream', - ], - 'xl' => 'application/excel', - 'eml' => 'message/rfc822', - 'json' => [ - 'application/json', - 'text/json', - ], - 'pem' => [ - 'application/x-x509-user-cert', - 'application/x-pem-file', - 'application/octet-stream', - ], - 'p10' => [ - 'application/x-pkcs10', - 'application/pkcs10', - ], - 'p12' => 'application/x-pkcs12', - 'p7a' => 'application/x-pkcs7-signature', - 'p7c' => [ - 'application/pkcs7-mime', - 'application/x-pkcs7-mime', - ], - 'p7m' => [ - 'application/pkcs7-mime', - 'application/x-pkcs7-mime', - ], - 'p7r' => 'application/x-pkcs7-certreqresp', - 'p7s' => 'application/pkcs7-signature', - 'crt' => [ - 'application/x-x509-ca-cert', - 'application/x-x509-user-cert', - 'application/pkix-cert', - ], - 'crl' => [ - 'application/pkix-crl', - 'application/pkcs-crl', - ], - 'der' => 'application/x-x509-ca-cert', - 'kdb' => 'application/octet-stream', - 'pgp' => 'application/pgp', - 'gpg' => 'application/gpg-keys', - 'sst' => 'application/octet-stream', - 'csr' => 'application/octet-stream', - 'rsa' => 'application/x-pkcs7', - 'cer' => [ - 'application/pkix-cert', - 'application/x-x509-ca-cert', - ], - '3g2' => 'video/3gpp2', - '3gp' => [ - 'video/3gp', - 'video/3gpp', - ], - 'mp4' => 'video/mp4', - 'm4a' => 'audio/x-m4a', - 'f4v' => [ - 'video/mp4', - 'video/x-f4v', - ], - 'flv' => 'video/x-flv', - 'webm' => 'video/webm', - 'aac' => 'audio/x-acc', - 'm4u' => 'application/vnd.mpegurl', - 'm3u' => 'text/plain', - 'xspf' => 'application/xspf+xml', - 'vlc' => 'application/videolan', - 'wmv' => [ - 'video/x-ms-wmv', - 'video/x-ms-asf', - ], - 'au' => 'audio/x-au', - 'ac3' => 'audio/ac3', - 'flac' => 'audio/x-flac', - 'ogg' => [ - 'audio/ogg', - 'video/ogg', - 'application/ogg', - ], - 'kmz' => [ - 'application/vnd.google-earth.kmz', - 'application/zip', - 'application/x-zip', - ], - 'kml' => [ - 'application/vnd.google-earth.kml+xml', - 'application/xml', - 'text/xml', - ], - 'ics' => 'text/calendar', - 'ical' => 'text/calendar', - 'zsh' => 'text/x-scriptzsh', - '7zip' => [ - 'application/x-compressed', - 'application/x-zip-compressed', - 'application/zip', - 'multipart/x-zip', - ], - 'cdr' => [ - 'application/cdr', - 'application/coreldraw', - 'application/x-cdr', - 'application/x-coreldraw', - 'image/cdr', - 'image/x-cdr', - 'zz-application/zz-winassoc-cdr', - ], - 'wma' => [ - 'audio/x-ms-wma', - 'video/x-ms-asf', - ], - 'jar' => [ - 'application/java-archive', - 'application/x-java-application', - 'application/x-jar', - 'application/x-compressed', - ], - 'svg' => [ - 'image/svg+xml', - 'application/xml', - 'text/xml', - ], - 'vcf' => 'text/x-vcard', - 'srt' => [ - 'text/srt', - 'text/plain', - ], - 'vtt' => [ - 'text/vtt', - 'text/plain', - ], - 'ico' => [ - 'image/x-icon', - 'image/x-ico', - 'image/vnd.microsoft.icon', - ], - ]; - - //-------------------------------------------------------------------- - - /** - * Attempts to determine the best mime type for the given file extension. - * - * @param string $extension - * - * @return string|null The mime type found, or none if unable to determine. - */ - public static function guessTypeFromExtension(string $extension) - { - $extension = trim(strtolower($extension), '. '); - - if (! array_key_exists($extension, static::$mimes)) - { - return null; - } - - return is_array(static::$mimes[$extension]) ? static::$mimes[$extension][0] : static::$mimes[$extension]; - } - - //-------------------------------------------------------------------- - - /** - * Attempts to determine the best file extension for a given mime type. - * - * @param string $type - * @param string $proposed_extension - default extension (in case there is more than one with the same mime type) - * - * @return string|null The extension determined, or null if unable to match. - */ - public static function guessExtensionFromType(string $type, ?string $proposed_extension = null) - { - $type = trim(strtolower($type), '. '); - - $proposed_extension = trim(strtolower($proposed_extension)); - - if (! is_null($proposed_extension) && array_key_exists($proposed_extension, static::$mimes) && in_array($type, is_string(static::$mimes[$proposed_extension]) ? [static::$mimes[$proposed_extension]] : static::$mimes[$proposed_extension])) - { - return $proposed_extension; - } - - foreach (static::$mimes as $ext => $types) - { - if ((is_string($types) && $types === $type) || (is_array($types) && in_array($type, $types))) - { - return $ext; - } - } - - return null; - } - - //-------------------------------------------------------------------- - -} diff --git a/app/Config/Modules.php b/app/Config/Modules.php deleted file mode 100644 index 40cb987..0000000 --- a/app/Config/Modules.php +++ /dev/null @@ -1,45 +0,0 @@ - 'CodeIgniter\Pager\Views\default_full', - 'default_simple' => 'CodeIgniter\Pager\Views\default_simple', - 'default_head' => 'CodeIgniter\Pager\Views\default_head', - ]; - - /* - |-------------------------------------------------------------------------- - | Items Per Page - |-------------------------------------------------------------------------- - | - | The default number of results shown in a single page. - | - */ - public $perPage = 20; -} diff --git a/app/Config/Paths.php b/app/Config/Paths.php deleted file mode 100644 index 6251124..0000000 --- a/app/Config/Paths.php +++ /dev/null @@ -1,77 +0,0 @@ -setDefaultNamespace('App\Controllers'); -$routes->setDefaultController('Donor_controller'); -$routes->setDefaultMethod('index'); -$routes->setTranslateURIDashes(false); -$routes->set404Override(); -$routes->setAutoRoute(true); - -/** - * -------------------------------------------------------------------- - * Route Definitions - * -------------------------------------------------------------------- - */ - -// We get a performance increase by specifying the default -// route since we don't have to scan directories. - -$routes->get('/', 'Donor_controller::index'); -$routes->match(['get','post'],'donor_register','My_controller::donor_register'); -$routes->match(['get','post'],'all_donor','My_controller::all_donor'); -$routes->match(['get','post'],'receipts','Dashboard::receipts'); -$routes->match(['get','post'],'all_receipt','Dashboard::all_receipt'); -$routes->match(['get','post'],'all_transaction','Dashboard::all_transaction'); -$routes->match(['get','post'],'transaction','Dashboard::transaction'); -$routes->match(['get','post'],'donation_data','Dashboard::donation_data'); -$routes->match(['get','post'],'all_donation_data','Dashboard::all_donation_data'); -$routes->match(['get','post'],'donation_cause','Dashboard::donation_cause'); -$routes->match(['get','post'],'all_donation_cause','Dashboard::all_donation_cause'); - -$routes->get('Send_mail/(:num)', 'Sendmail::Mail_to_donor/$1'); - -//$routes->add('edit_donor/(:num)', 'App\Catalog::productLookup'); -//$routes->match(['get'],'edit_donor/(:any)', 'My_controller::edit_donor'); -$routes->get('edit_donor/(:num)', 'My_controller::edit_donor/$1'); -$routes->get('edit_receipt/(:num)', 'Dashboard::edit_receipt/$1'); -$routes->get('view_receipt/(:num)', 'Dashboard::view_receipt/$1'); -$routes->match(['get','post'],'edit_transaction/(:num)', 'Dashboard::edit_transaction/$1'); -$routes->match(['get','post'],'edit_donation_data/(:num)', 'Dashboard::edit_donation_data/$1'); -$routes->match(['get','post'],'edit_donation_cause/(:num)', 'Dashboard::edit_donation_cause/$1'); - -$routes->match(['get','post'],'signup','Donor_controller::register'); -$routes->match(['get','post'],'login','Donor_controller::login'); -$routes->match(['get'],'fetch_country','Donor_controller::fetch_country'); -$routes->match(['get','post'],'fetch_state','Donor_controller::fetch_state'); -$routes->match(['get','post'],'fetch_city','Donor_controller::fetch_city'); -$routes->match(['get'],'profile','Donor_controller::profile'); - -$routes->match(['get','post'],'receipt','Dashboard::generate_receipts'); -$routes->match(['get','post'],'update_receipt','Dashboard::update_receipt'); -$routes->match(['get','post'],'transaction','Dashboard::transaction_upload'); -$routes->match(['get','post'],'donation_data','Dashboard::donation_data_upload'); -$routes->match(['get','post'],'donor_register','My_controller::donor_register'); -$routes->match(['get','post'],'update_donor','My_controller::update_donor'); - -$routes->match(['get'],'fetch_donor_id','Dashboard::fetch_donor_id'); -$routes->match(['get'],'edit_donor_id','Dashboard::edit_donor_id'); -$routes->match(['get'],'fetch_cause_name','Dashboard::fetch_cause_name'); -$routes->match(['get','post'],'add_donation_cause','Dashboard::add_donation_cause'); -$routes->match(['get'],'htmlToPDF','PdfController::htmlToPDF'); -$routes->match(['get'],'active_cause','Dashboard::active_cause'); -$routes->match(['get'],'inactive_cause','Dashboard::inactive_cause'); - - -$routes->match(['get','post'],'donation_data_excel','PhpspreadsheetController::import_donation_data'); -$routes->match(['get','post'],'transaction_data_excel','PhpspreadsheetController::import_transaction_data'); - -$routes->match(['get','post'],'transaction_file','PhpspreadsheetController::transaction_file'); -$routes->match(['get','post'],'donation_data_file','PhpspreadsheetController::donation_data_file'); - -$routes->add('logout','Dashboard::logout'); -// $routes->add('register','Donation::register'); -// $routes->add('list','Donation::edit_view'); -// $routes->add('store','Home::store'); - -/** - * -------------------------------------------------------------------- - * Additional Routing - * -------------------------------------------------------------------- - * - * There will often be times that you need additional routing and you - * need it to be able to override any defaults in this file. Environment - * based routes is one such time. require() additional route files here - * to make that happen. - * - * You will have access to the $routes object within that file without - * needing to reload it. - */ -if (file_exists(APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php')) -{ - require APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php'; -} diff --git a/app/Config/Services.php b/app/Config/Services.php deleted file mode 100644 index c58da70..0000000 --- a/app/Config/Services.php +++ /dev/null @@ -1,30 +0,0 @@ - 'Windows 10', - 'windows nt 6.3' => 'Windows 8.1', - 'windows nt 6.2' => 'Windows 8', - 'windows nt 6.1' => 'Windows 7', - 'windows nt 6.0' => 'Windows Vista', - 'windows nt 5.2' => 'Windows 2003', - 'windows nt 5.1' => 'Windows XP', - 'windows nt 5.0' => 'Windows 2000', - 'windows nt 4.0' => 'Windows NT 4.0', - 'winnt4.0' => 'Windows NT 4.0', - 'winnt 4.0' => 'Windows NT', - 'winnt' => 'Windows NT', - 'windows 98' => 'Windows 98', - 'win98' => 'Windows 98', - 'windows 95' => 'Windows 95', - 'win95' => 'Windows 95', - 'windows phone' => 'Windows Phone', - 'windows' => 'Unknown Windows OS', - 'android' => 'Android', - 'blackberry' => 'BlackBerry', - 'iphone' => 'iOS', - 'ipad' => 'iOS', - 'ipod' => 'iOS', - 'os x' => 'Mac OS X', - 'ppc mac' => 'Power PC Mac', - 'freebsd' => 'FreeBSD', - 'ppc' => 'Macintosh', - 'linux' => 'Linux', - 'debian' => 'Debian', - 'sunos' => 'Sun Solaris', - 'beos' => 'BeOS', - 'apachebench' => 'ApacheBench', - 'aix' => 'AIX', - 'irix' => 'Irix', - 'osf' => 'DEC OSF', - 'hp-ux' => 'HP-UX', - 'netbsd' => 'NetBSD', - 'bsdi' => 'BSDi', - 'openbsd' => 'OpenBSD', - 'gnu' => 'GNU/Linux', - 'unix' => 'Unknown Unix OS', - 'symbian' => 'Symbian OS', - ]; - - // The order of this array should NOT be changed. Many browsers return - // multiple browser types so we want to identify the sub-type first. - public $browsers = [ - 'OPR' => 'Opera', - 'Flock' => 'Flock', - 'Edge' => 'Spartan', - 'Chrome' => 'Chrome', - // Opera 10+ always reports Opera/9.80 and appends Version/ to the user agent string - 'Opera.*?Version' => 'Opera', - 'Opera' => 'Opera', - 'MSIE' => 'Internet Explorer', - 'Internet Explorer' => 'Internet Explorer', - 'Trident.* rv' => 'Internet Explorer', - 'Shiira' => 'Shiira', - 'Firefox' => 'Firefox', - 'Chimera' => 'Chimera', - 'Phoenix' => 'Phoenix', - 'Firebird' => 'Firebird', - 'Camino' => 'Camino', - 'Netscape' => 'Netscape', - 'OmniWeb' => 'OmniWeb', - 'Safari' => 'Safari', - 'Mozilla' => 'Mozilla', - 'Konqueror' => 'Konqueror', - 'icab' => 'iCab', - 'Lynx' => 'Lynx', - 'Links' => 'Links', - 'hotjava' => 'HotJava', - 'amaya' => 'Amaya', - 'IBrowse' => 'IBrowse', - 'Maxthon' => 'Maxthon', - 'Ubuntu' => 'Ubuntu Web Browser', - 'Vivaldi' => 'Vivaldi', - ]; - - public $mobiles = [ - // legacy array, old values commented out - 'mobileexplorer' => 'Mobile Explorer', - // 'openwave' => 'Open Wave', - // 'opera mini' => 'Opera Mini', - // 'operamini' => 'Opera Mini', - // 'elaine' => 'Palm', - 'palmsource' => 'Palm', - // 'digital paths' => 'Palm', - // 'avantgo' => 'Avantgo', - // 'xiino' => 'Xiino', - 'palmscape' => 'Palmscape', - // 'nokia' => 'Nokia', - // 'ericsson' => 'Ericsson', - // 'blackberry' => 'BlackBerry', - // 'motorola' => 'Motorola' - - // Phones and Manufacturers - 'motorola' => 'Motorola', - 'nokia' => 'Nokia', - 'palm' => 'Palm', - 'iphone' => 'Apple iPhone', - 'ipad' => 'iPad', - 'ipod' => 'Apple iPod Touch', - 'sony' => 'Sony Ericsson', - 'ericsson' => 'Sony Ericsson', - 'blackberry' => 'BlackBerry', - 'cocoon' => 'O2 Cocoon', - 'blazer' => 'Treo', - 'lg' => 'LG', - 'amoi' => 'Amoi', - 'xda' => 'XDA', - 'mda' => 'MDA', - 'vario' => 'Vario', - 'htc' => 'HTC', - 'samsung' => 'Samsung', - 'sharp' => 'Sharp', - 'sie-' => 'Siemens', - 'alcatel' => 'Alcatel', - 'benq' => 'BenQ', - 'ipaq' => 'HP iPaq', - 'mot-' => 'Motorola', - 'playstation portable' => 'PlayStation Portable', - 'playstation 3' => 'PlayStation 3', - 'playstation vita' => 'PlayStation Vita', - 'hiptop' => 'Danger Hiptop', - 'nec-' => 'NEC', - 'panasonic' => 'Panasonic', - 'philips' => 'Philips', - 'sagem' => 'Sagem', - 'sanyo' => 'Sanyo', - 'spv' => 'SPV', - 'zte' => 'ZTE', - 'sendo' => 'Sendo', - 'nintendo dsi' => 'Nintendo DSi', - 'nintendo ds' => 'Nintendo DS', - 'nintendo 3ds' => 'Nintendo 3DS', - 'wii' => 'Nintendo Wii', - 'open web' => 'Open Web', - 'openweb' => 'OpenWeb', - - // Operating Systems - 'android' => 'Android', - 'symbian' => 'Symbian', - 'SymbianOS' => 'SymbianOS', - 'elaine' => 'Palm', - 'series60' => 'Symbian S60', - 'windows ce' => 'Windows CE', - - // Browsers - 'obigo' => 'Obigo', - 'netfront' => 'Netfront Browser', - 'openwave' => 'Openwave Browser', - 'mobilexplorer' => 'Mobile Explorer', - 'operamini' => 'Opera Mini', - 'opera mini' => 'Opera Mini', - 'opera mobi' => 'Opera Mobile', - 'fennec' => 'Firefox Mobile', - - // Other - 'digital paths' => 'Digital Paths', - 'avantgo' => 'AvantGo', - 'xiino' => 'Xiino', - 'novarra' => 'Novarra Transcoder', - 'vodafone' => 'Vodafone', - 'docomo' => 'NTT DoCoMo', - 'o2' => 'O2', - - // Fallback - 'mobile' => 'Generic Mobile', - 'wireless' => 'Generic Mobile', - 'j2me' => 'Generic Mobile', - 'midp' => 'Generic Mobile', - 'cldc' => 'Generic Mobile', - 'up.link' => 'Generic Mobile', - 'up.browser' => 'Generic Mobile', - 'smartphone' => 'Generic Mobile', - 'cellphone' => 'Generic Mobile', - ]; - - // There are hundreds of bots but these are the most common. - public $robots = [ - 'googlebot' => 'Googlebot', - 'msnbot' => 'MSNBot', - 'baiduspider' => 'Baiduspider', - 'bingbot' => 'Bing', - 'slurp' => 'Inktomi Slurp', - 'yahoo' => 'Yahoo', - 'ask jeeves' => 'Ask Jeeves', - 'fastcrawler' => 'FastCrawler', - 'infoseek' => 'InfoSeek Robot 1.0', - 'lycos' => 'Lycos', - 'yandex' => 'YandexBot', - 'mediapartners-google' => 'MediaPartners Google', - 'CRAZYWEBCRAWLER' => 'Crazy Webcrawler', - 'adsbot-google' => 'AdsBot Google', - 'feedfetcher-google' => 'Feedfetcher Google', - 'curious george' => 'Curious George', - 'ia_archiver' => 'Alexa Crawler', - 'MJ12bot' => 'Majestic-12', - 'Uptimebot' => 'Uptimebot', - ]; -} diff --git a/app/Config/Validation.php b/app/Config/Validation.php deleted file mode 100644 index 97f08c7..0000000 --- a/app/Config/Validation.php +++ /dev/null @@ -1,36 +0,0 @@ - 'CodeIgniter\Validation\Views\list', - 'single' => 'CodeIgniter\Validation\Views\single', - ]; - - //-------------------------------------------------------------------- - // Rules - //-------------------------------------------------------------------- -} diff --git a/app/Config/View.php b/app/Config/View.php deleted file mode 100644 index f66b253..0000000 --- a/app/Config/View.php +++ /dev/null @@ -1,34 +0,0 @@ -session = \Config\Services::session(); - } - -} diff --git a/app/Controllers/Dashboard.php b/app/Controllers/Dashboard.php deleted file mode 100644 index 5f5a443..0000000 --- a/app/Controllers/Dashboard.php +++ /dev/null @@ -1,470 +0,0 @@ -dModel = new Dashboard_model(); - $this->rModel = new Receipt_model(); - $this->tModel = new Transaction_model(); - $this->ddModel = new Donation_data_model(); - $this->MyModel = new My_model(); - $this->dcModel = new Donation_cause(); - } - public function index() - { - - $data = []; - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - $id= session()->get('logged_user'); - $data['userdata']=$this->dModel->getLoggedInUserData($id); - // echo view('templates/header',$data); - // echo view('dashboard'); - // echo view('templates/footer'); - return view('dashboard'); - } - public function logout() - { - session()->remove('logged_user'); - session()->destroy(); - return redirect()->to(base_url()); - } - - function fetch_donor_id() - { - echo $this->MyModel->fetch_donor_id(); - } - function edit_donor_id($receipt_id) - { - echo $receipt_id; die(); - echo $this->MyModel->edit_donor_id(); - } - function fetch_cause_name() - { - echo $this->dcModel->fetch_cause_name(); - } - - public function receipts() - { - $data = []; - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - $name= session()->get('logged_user'); - return view('receipts'); - // echo view('templates/header'); - // echo view('receipts'); - // echo view('templates/footer'); - } - - - public function generate_receipts() - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - $donor_id=$this->request->getVar('donor_id'); - $mymodel = new My_model(); - $donor = $mymodel->find($donor_id); - $donor_name = $donor['name']; - - $cause_id=$this->request->getVar('cause_id'); - $causemodel = new Donation_cause(); - $cause = $causemodel->find($cause_id); - $cause_name = $cause['cause_name']; - - $receiptData=[ - - 'date' =>$this->request->getVar('date'), - 'donor_id' =>$this->request->getVar('donor_id'), - 'donor_name' =>$donor_name, - 'amount' =>$this->request->getVar('amount'), - 'mode_of_receipt' =>$this->request->getVar('mode_of_receipt'), - 'receipt_details' =>$this->request->getVar('receipt_details'), - 'cause_id' =>$this->request->getVar('cause_id'), - 'cause_name' =>$cause_name, - 'remarks' =>$this->request->getVar('remarks'), - ]; - //print_r($receiptData);die(); - $model = new Receipt_model(); - $model->save($receiptData); - return redirect()->to(base_url().'all_receipt'); - } - - function update_receipt() - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - $receipt_id=$this->request->getVar('receipt_id'); - - $donor_id=$this->request->getVar('donor_id'); - $mymodel = new My_model(); - $donor = $mymodel->find($donor_id); - $donor_name = $donor['name']; - - $cause_id=$this->request->getVar('cause_id'); - $causemodel = new Donation_cause(); - $cause = $causemodel->find($cause_id); - $cause_name = $cause['cause_name']; - - $receiptData=[ - - 'date' =>$this->request->getVar('date'), - 'donor_id' =>$this->request->getVar('donor_id'), - 'donor_name' =>$donor_name, - 'amount' =>$this->request->getVar('amount'), - 'mode_of_receipt' =>$this->request->getVar('mode_of_receipt'), - 'receipt_details' =>$this->request->getVar('receipt_details'), - 'cause_id' =>$this->request->getVar('cause_id'), - 'cause_name' =>$cause_name, - 'remarks' =>$this->request->getVar('remarks'), - ]; - $model = new Receipt_model(); - $model->update($receipt_id , $receiptData); - return redirect()->to(base_url().'/all_receipt'); - - } - - public function all_receipt() - { - $data = []; - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - $data['receiptdata']=$this->rModel->all_receipt(); - - return view('receipts_table',$data); - - } - - function edit_receipt($receipt_id) - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - $receipt_model = new Receipt_model(); - $receipt_data=$receipt_model->find($receipt_id); - - $donor_model = new My_model(); - $donor_data=$donor_model->findAll(); - - $cause_model = new Donation_cause(); - $cause_data=$cause_model->findAll(); - - $data= [ 'post'=>$receipt_data , 'donor'=>$donor_data , 'cause'=>$cause_data ]; - // if($this->request->getMethod() == 'post') - // { - // $model = new Receipt_model(); - // $_POST['receipt_id'] = $receipt_id; - // $model->save($_POST); - // return redirect()->to(base_url()."/Dashboard/all_receipt"); - // } - - return view('receipt_edit',$data); - - - } - function last_receipt() - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - // admin data - $dmodel = new Donor_model(); - $id= session()->get('logged_user'); - $admin_data=$dmodel->find($id); - // last receipt data - $receipt_data=$this->rModel->last_receipt(); - //print_r($receipt_data); - foreach($receipt_data as $key){ $key['receipt_id']; $key['donor_id'];} - //donation cause - $causemodel = new Donation_cause(); - $cause_id=$key['receipt_id']; - $cause_data=$causemodel->find($cause_id); - // donor data - $model = new My_model(); - $donor_id=$key['donor_id']; - $Donor_data=$model->find($donor_id); - // array for receipt - $data= [ 'donordata'=>$Donor_data , 'admindata' =>$admin_data , 'receipt'=>$receipt_data ,'causedata'=>$cause_data ]; - - echo view('templates/header'); - echo view('pdf_view',$data); - echo view('templates/footer'); - } - - function view_receipt($receiptid) - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - // admin data - $dmodel = new Donor_model(); - $id= session()->get('logged_user'); - $admin_data=$dmodel->find($id); - // receipt data - $rmodel = new Receipt_model(); - $receipt_id=$receiptid; - $receipt_data=$rmodel->find($receipt_id); - $donorid = $receipt_data['donor_id']; - $causeid = $receipt_data['cause_id']; - // donation cause - $causemodel = new Donation_cause(); - $cause_id=$causeid; - $cause_data=$causemodel->find($cause_id); - // donor data - $model = new My_model(); - $donor_id=$donorid; - $Donor_data=$model->find($donor_id); - // array for receipt - $data= [ 'donordata'=>$Donor_data , 'admindata' =>$admin_data , 'receipt'=>$receipt_data , 'causedata'=>$cause_data]; - - //print_r($data); die(); - return view('receipt_view',$data); - - } - - public function transaction() - { - $data = []; - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - $name= session()->get('logged_user'); - //$data['userdata']=$this->dModel->getLoggedInUserData($name); - - return view('transaction_upload'); - - } - // public function transaction_upload() - // { - // if(!session()->has('logged_user')) - // { - // return redirect()->to(base_url()); - // } - // $model = new Transaction_model(); - // $transactionData=[ - // 'date' =>$this->request->getVar('date'), - // 'ref_1' =>$this->request->getVar('ref_1'), - // 'remarks' =>$this->request->getVar('remarks'), - // 'amount' =>$this->request->getVar('amount'), - // 'donation_ref' =>$this->request->getVar('donation_ref'), - - // ]; - // $model->save($transactionData); - // return redirect()->to(base_url().'/Dashboard/all_transaction'); - // } - public function all_transaction() - { - $data = []; - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - - $data['receiptdata']=$this->tModel->all_transaction(); - - return view('transaction_table',$data); - - } - function edit_transaction($id) - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - $model = new Transaction_model(); - $transaction_data=$model->find($id); - $data= [ 'post'=>$transaction_data ]; - - if($this->request->getMethod() == 'post') - { - $model = new Transaction_model(); - $_POST['id'] = $id; - $model->save($_POST); - return redirect()->to(base_url()."/all_transaction"); - } - - return view('transaction_edit',$data); - - - } - - - - public function donation_data() - { - $data = []; - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - return view('donation_data'); - - } - // public function donation_data_upload() - // { - // if(!session()->has('logged_user')) - // { - // return redirect()->to(base_url()); - // } - // $model = new Donation_data_model(); - // $donationData=[ - // 'date' =>$this->request->getVar('date'), - // 'cause_name' =>$this->request->getVar('cause_name'), - // 'amount' =>$this->request->getVar('amount'), - // 'mode_of_payment' =>$this->request->getVar('mode_of_payment'), - // 'ref_1' =>$this->request->getVar('ref_1'), - // 'donation_ref' =>$this->request->getVar('donation_ref'), - // ]; - // $model->save($donationData); - // return redirect()->to(base_url().'/Dashboard'); - // } - public function all_donation_data() - { - $data = []; - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - - $data['donationdata']=$this->ddModel->all_donation_data(); - - return view('donation_data_table',$data); - - } - function edit_donation_data($id) - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - $model = new Donation_data_model(); - $donation_data=$model->find($id); - $data= [ 'post'=>$donation_data ]; - - if($this->request->getMethod() == 'post') - { - $model = new Donation_data_model(); - $_POST['id'] = $id; - $model->save($_POST); - return redirect()->to(base_url()."/all_donation_data"); - } - - return view('donation_data_edit',$data); - - - } - public function donation_cause() - { - $data = []; - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - $data['donationcause']=$this->dcModel->all_donation_cause(); - - return view('add_donation_cause'); - - } - public function all_donation_cause() - { - $data = []; - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - $data['donationcause']=$this->dcModel->all_donation_cause(); - - return view('all_donation_cause',$data); - - } - public function add_donation_cause() - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - $model = new Donation_cause(); - $active="Active"; - $donationCause=[ - 'cause_name' =>$this->request->getVar('cause_name'), - 'from_date' =>$this->request->getVar('from_date'), - 'to_date' =>$this->request->getVar('to_date'), - 'status' =>$active, - ]; - $model->save($donationCause); - return redirect()->to(base_url()."/Dashboard/donation_cause"); - } - function edit_donation_cause($id) - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - $model = new Donation_cause(); - $donation_cause=$model->find($id); - $data= [ 'post'=>$donation_cause ]; - - if($this->request->getMethod() == 'post') - { - $model = new Donation_cause(); - $_POST['id'] = $id; - $model->save($_POST); - return redirect()->to(base_url()."/all_donation_cause"); - } - - return view('donation_cause_edit',$data); - - - } - function inactive_cause($cause_id) - { $id = $cause_id; - $inactive="Inactive"; - $donationCause=['status' =>$inactive,]; - $model = new Donation_cause(); - $model->update($id , $donationCause); - return redirect()->to(base_url()."/all_donation_cause"); - - } - function active_cause($cause_id) - { $id = $cause_id; - $active="Active"; - $donationCause=['status' =>$active,]; - $model = new Donation_cause(); - $model->update($id , $donationCause); - return redirect()->to(base_url()."/all_donation_cause"); - - } - - -} \ No newline at end of file diff --git a/app/Controllers/Donation.php b/app/Controllers/Donation.php deleted file mode 100644 index 6ba5e60..0000000 --- a/app/Controllers/Donation.php +++ /dev/null @@ -1,41 +0,0 @@ -orderBy('id', 'DESC')->findAll(); - - return view('list', $data); - } - - public function test($type,$type2) - { - echo '

this is a product:'.$type.'and'.$type2.'

'; - //return view('show'); - } - public function register() - { - if($this->request->getMethod() == 'post'){ - $model = new Donation_model(); - $model->save($_POST); - } - return view('show'); - } - - - - - - //-------------------------------------------------------------------- - -} diff --git a/app/Controllers/Donor_controller.php b/app/Controllers/Donor_controller.php deleted file mode 100644 index 3ec8d34..0000000 --- a/app/Controllers/Donor_controller.php +++ /dev/null @@ -1,188 +0,0 @@ -session = session(); - $this->Donor_model = new Donor_model(); - $this->Dashboard_model = new Dashboard_model(); - } - public function index() - { - $data=[]; - helper(['form']); - - if($this->request->getmethod() == 'post') - { - - $email = $this->request->getVar('email'); - $password = $this->request->getVar('password'); - $userdata = $this->Donor_model->verifyEmail($email); - if($userdata) - { - if(password_verify($password, $userdata['password'])) - { - - $this->session->set('logged_user',$userdata['id']); - return redirect()->to(base_url().'/Dashboard'); - } - else{ - $this->session->setTempdata('error','sorry wrong password entered for the Email',3); - return redirect()->to(base_url()); - } - }else - { - $this->session->setTempdata('error','sorry Email does not existe',3); - return redirect()->to(base_url()); - } - - - } - - return view('login'); - -} - - - - - public function register() - { - - - $data['country']=$this->Dashboard_model->fetch_country(); - helper(['form']); - - if($this->request->getmethod() == 'post') - { - //validate - $rules=[ - 'name' =>'required|min_length[3]|max_length[30]', - 'phone' =>'required|min_length[10]|max_length[12]|is_unique[user_management.phone]', - 'email' =>'required|min_length[6]|max_length[50]|valid_email|is_unique[user_management.email]', - 'pan' =>'required|min_length[10]|max_length[10]|is_unique[user_management.pan]', - 'address' =>'required|min_length[3]|max_length[70]', - 'pin_code' =>'required|min_length[6]|max_length[6]', - 'org_name' =>'required|min_length[3]|max_length[20]', - 'gstin' =>'required|min_length[15]|max_length[15]|is_unique[user_management.gstin]', - 'password' =>'required|min_length[5]|max_length[20]', - 'password_confirm' =>'matches[password]', - 'userfile' => [ - 'uploaded[userfile]', - 'mime_in[userfile,image/jpg,image/png,image/jpeg]', - 'max_size[userfile,1000]', - ], - - ]; - - if(! $this->validate($rules)) - { - $data['validation'] = $this->validator; - }else{ - - - $Address_model = new Address_model(); - - $country_id=$this->request->getVar('country'); - $state_id=$this->request->getVar('state'); - $city_id=$this->request->getVar('city'); - - $country_name=$Address_model->country($country_id); - foreach($country_name as $key){ $key['country_name']; } - $country=$key['country_name']; - $state_name=$Address_model->state($state_id); - foreach($state_name as $key){ $key['state_name']; } - $state=$key['state_name']; - $city_name=$Address_model->city($city_id); - foreach($city_name as $key){ $key['city_name']; } - $city=$key['city_name']; - - $path="public/assets/uploads"; - if($img = $this->request->getFile('userfile')) - { - if ($img->isValid() && ! $img->hasMoved()) - { - //$newName = $img->getRandomName(); - $f_type=date('Y-m-d').time().$_FILES['userfile']['name']; - $img->move($path, $f_type); - $signature="public/assets/uploads/".$f_type; - } - } - - - //store the donor in database - $model = new Donor_model(); - $donorData=[ - 'name' =>$this->request->getVar('name'), - 'phone' =>$this->request->getVar('phone'), - 'email' =>$this->request->getVar('email'), - 'pan' =>$this->request->getVar('pan'), - 'address' =>$this->request->getVar('address'), - 'country' =>$country, - 'state' =>$state, - 'city' =>$city, - 'pin_code' =>$this->request->getVar('pin_code'), - 'date_of_birth' =>$this->request->getVar('date_of_birth'), - 'gender' =>$this->request->getVar('gender'), - 'org_name' =>$this->request->getVar('org_name'), - 'gstin' =>$this->request->getVar('gstin'), - 'foreign_key' =>$this->request->getVar('email'), - 'password' =>$this->request->getVar('password'), - 'signature' =>$signature, - ]; - //print_r($donorData);die(); - $model->save($donorData); - $session = session(); - $session ->setFlashdata('success','Successful Registration'); - return redirect()->to(base_url()); - } - } - - - //echo view('templates/header',$data); - return view('register',$data); - //echo view('templates/footer'); - - } - - function profile() - { - $id= session()->get('logged_user'); - $data['userdata']=$this->Dashboard_model->getLoggedInUserData($id); - return view('profile',$data); - } - - function fetch_country() - { - - echo $this->Dashboard_model->fetch_country(); - - } - function fetch_state() - { - - if($this->request->getVar('country_id')) - { - echo $this->Dashboard_model->fetch_state($this->request->getVar('country_id')); - } - } - - function fetch_city() - { - if($this->request->getVar('state_id')) - { - echo $this->Dashboard_model->fetch_city($this->request->getVar('state_id')); - } - } - - - //-------------------------------------------------------------------- - -} diff --git a/app/Controllers/Home.php b/app/Controllers/Home.php deleted file mode 100644 index b024394..0000000 --- a/app/Controllers/Home.php +++ /dev/null @@ -1,81 +0,0 @@ -test('7777','9999'); - // } - - public function store() - { - helper(['form', 'url']); - - $model = new Donation_model(); - - $data = [ - 'email' => $this->request->getVar('email'), - 'name' => $this->request->getVar('name'), - 'department' => $this->request->getVar('department'), - - ]; - - $save = $model->insert($data); - return redirect()->to( base_url('show') ); - } - - public function edit($id = null) - { - $model = new Donation_model(); - $post = $model->find($id); - $data=['post' => $post,]; - return view('edit_view', $data); - //return view('edit_view',['firstci4'=>$this->$model->find($id)]); - } - - public function update() - { - helper(['form', 'url']); - - $model = new Donation_model(); - - $id = $this->request->getVar('id'); - $data = [ - 'name' => $this->request->getVar('name'), - 'email' => $this->request->getVar('email'), - ]; - $save = $model->update($id,$data); - $donation = new Donation(); - echo $donation->edit_view(); - //return redirect()->to( base_url('users') ); - } - - public function userDelete($id = null) - { - $model = new Donation_model(); - $data['user'] = $model->where('id', $id)->delete(); - $donation = new Donation(); - echo $donation->edit_view(); - // return redirect()->to( base_url('users') ); - } - public function profile($id = null) - { - $model = new Donation_model(); - $post = $model->find($id); - $data=['post' => $post,]; - return view('profile_view', $data); - - } - - //-------------------------------------------------------------------- - -} diff --git a/app/Controllers/My_controller.php b/app/Controllers/My_controller.php deleted file mode 100644 index 96c6097..0000000 --- a/app/Controllers/My_controller.php +++ /dev/null @@ -1,230 +0,0 @@ -session = session(); - $this->My_model = new My_model(); - $this->Dashboard_model = new Dashboard_model(); - } - - // public function donor_register() { - // helper(['form', 'url']); - - // $input = $this->validate([ - // 'name' =>'required|min_length[3]|max_length[20]', - // 'phone' =>'required|min_length[3]|max_length[10]', - // 'email' =>'required|min_length[6]|max_length[50]|valid_email|is_unique[donar_management.email]', - // 'pan' =>'required|min_length[3]|max_length[20]', - // 'address' =>'required|min_length[3]|max_length[70]', - // 'country' =>'required', - // 'state' =>'required', - // 'city' =>'required', - // 'pin_code' =>'required|min_length[6]|max_length[6]', - // 'date_of_birth' =>'required|min_length[3]|max_length[20]', - // 'gender' =>'required', - // 'org_name' =>'required|min_length[3]|max_length[20]', - // 'gstin' =>'required|min_length[3]|max_length[20]', - // ]); - - // $formModel = new FormModel(); - - // if (!$input) { - // echo view('contact_form', [ - // 'validation' => $this->validator - // ]); - // } else { - // $formModel->save([ - // 'name' => $this->request->getVar('name'), - // 'email' => $this->request->getVar('email'), - // 'phone' => $this->request->getVar('phone'), - // ]); - - // return $this->response->redirect(site_url('/submit-form')); - // } - // } - - - - public function donor_register() - { - - $data['country']=$this->Dashboard_model->fetch_country(); - helper(['form', 'url']); - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - - - if($this->request->getmethod() == 'post') - { - // validate - $rules=[ - 'name' =>'required|min_length[3]|max_length[20]', - 'phone' =>'required|min_length[10]|max_length[12]|is_unique[donar_management.phone]', - 'email' =>'required|min_length[6]|max_length[50]|valid_email|is_unique[donar_management.email]', - 'pan' =>'required|min_length[10]|max_length[10]|is_unique[donar_management.pan]', - 'address' =>'required|min_length[3]|max_length[70]', - 'pin_code' =>'required|min_length[6]|max_length[6]', - 'date_of_birth' =>'required|min_length[6]|max_length[10]', - 'org_name' =>'required|min_length[3]|max_length[20]', - 'gstin' =>'required|min_length[15]|max_length[15]|is_unique[donar_management.gstin]', - ]; - - if(! $this->validate($rules)) - { - $data['validation'] = $this->validator; - //echo ''; - }else{ - $Address_model = new Address_model(); - - $country_id=$this->request->getVar('country'); - $state_id=$this->request->getVar('state'); - $city_id=$this->request->getVar('city'); - - $country_name=$Address_model->country($country_id); - foreach($country_name as $key){ $key['country_name']; } - $country=$key['country_name']; - $state_name=$Address_model->state($state_id); - foreach($state_name as $key){ $key['state_name']; } - $state=$key['state_name']; - $city_name=$Address_model->city($city_id); - foreach($city_name as $key){ $key['city_name']; } - $city=$key['city_name']; - - $model = new My_model(); - $donorData=[ - 'name' =>$this->request->getVar('name'), - 'phone' =>$this->request->getVar('phone'), - 'email' =>$this->request->getVar('email'), - 'pan' =>$this->request->getVar('pan'), - 'address' =>$this->request->getVar('address'), - 'country' =>$country, - 'state' =>$state, - 'city' =>$city, - 'pin_code' =>$this->request->getVar('pin_code'), - 'date_of_birth' =>$this->request->getVar('date_of_birth'), - 'gender' =>$this->request->getVar('gender'), - 'org_name' =>$this->request->getVar('org_name'), - 'gstin' =>$this->request->getVar('gstin'), - - - ]; - //print_r($donorData); die(); - $model->save($donorData); - $session = session(); - $session ->setFlashdata('success','Successful Added'); - return redirect()->to(base_url().'/all_donor'); - } - } - - // echo view('templates/header',$data); - return view('donor_registration'); - // echo view('templates/footer'); - - } - - public function all_donor() - { - $data = []; - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - - $data['receiptdata']=$this->My_model->all_donor(); - - return view('donor_table',$data); - - } - function edit_donor($id) - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - $model = new My_model(); - $donor_data=$model->find($id); - $data= [ 'post'=>$donor_data ]; - - if($this->request->getMethod() == 'post') - { - $model = new My_model(); - $_POST['id'] = $id; - $model->save($_POST); - return redirect()->to(base_url()."/all_donor"); - } - return view('donor_edit',$data); - - } - function update_donor() - { - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - $donor_id=$this->request->getVar('id'); - - - $DonorData=[ - - 'name' =>$this->request->getVar('name'), - 'phone' =>$this->request->getVar('phone'), - 'email' =>$this->request->getVar('email'), - 'pan' =>$this->request->getVar('pan'), - 'address' =>$this->request->getVar('address'), - 'country' =>$this->request->getVar('country'), - 'state' =>$this->request->getVar('state'), - 'city' =>$this->request->getVar('city'), - 'pin_code' =>$this->request->getVar('pin_code'), - 'date_of_birth' =>$this->request->getVar('date_of_birth'), - 'gender' =>$this->request->getVar('gender'), - 'org_name' =>$this->request->getVar('org_name'), - 'gstin' =>$this->request->getVar('gstin'), - ]; - //print_r($DonorData);die(); - $model = new My_model(); - $model->update($donor_id , $DonorData); - return redirect()->to(base_url().'/all_donor'); - - } - - function fetch_country() - { - - echo $this->Dashboard_model->fetch_country(); - - } - function fetch_state() - { - - if($this->request->getVar('country_id')) - { - echo $this->Dashboard_model->fetch_state($this->request->getVar('country_id')); - } - } - - function fetch_city() - { - if($this->request->getVar('state_id')) - { - echo $this->Dashboard_model->fetch_city($this->request->getVar('state_id')); - } - } - - - - - //-------------------------------------------------------------------- - -} diff --git a/app/Controllers/PdfController.php b/app/Controllers/PdfController.php deleted file mode 100644 index ad49b20..0000000 --- a/app/Controllers/PdfController.php +++ /dev/null @@ -1,75 +0,0 @@ -find($receipt_id); - $data= [ 'post'=>$receipt_data ]; - // $html = view('pdf_view',$data); - // $dompdf->loadHtml($html); - $dompdf = new \Dompdf\Dompdf(); - $dompdf->loadHtml(view('pdf_view',$data)); - $dompdf->setPaper('A4', 'landscape'); - $dompdf->render(); - $dompdf->stream(); - } - function download_receipt($receiptid) - { - // admin data - $dmodel = new Donor_model(); - $id= session()->get('logged_user'); - $admin_data=$dmodel->find($id); - // receipt data - $rmodel = new Receipt_model(); - $receipt_id=$receiptid; - $receipt_data=$rmodel->find($receipt_id); - $donorid = $receipt_data['donor_id']; - $causeid = $receipt_data['cause_id']; - // donation cause - $causemodel = new Donation_cause(); - $cause_id=$causeid; - $cause_data=$causemodel->find($cause_id); - // donor data - $model = new My_model(); - $donor_id=$donorid; - $Donor_data=$model->find($donor_id); - // array for receipt - $data= [ 'donordata'=>$Donor_data , 'admindata' =>$admin_data , 'receipt'=>$receipt_data , 'causedata'=>$cause_data]; - //echo view('download_receipt',$data); die(); - $html = view('download_receipt',$data); - - $dompdf = new \Dompdf\Dompdf(); - //$dompdf->loadHtml(view('download_receipt',$data)); - - - $options = $dompdf->getOptions(); - $options->set(array('isRemoteEnabled' => true)); - $dompdf->setOptions($options); - $dompdf->loadHtml($html); - $dompdf->setPaper('A4', 'portrait'); - $dompdf->render(); - $dompdf->stream(); - $pdfContent = $dompdf->output(); - - - - } - - - -} \ No newline at end of file diff --git a/app/Controllers/PhpspreadsheetController.php b/app/Controllers/PhpspreadsheetController.php deleted file mode 100644 index 3481b50..0000000 --- a/app/Controllers/PhpspreadsheetController.php +++ /dev/null @@ -1,270 +0,0 @@ -session = session(); - $this->Donation_data_model = new Donation_data_model(); - $this->Transaction_model = new Transaction_model(); - - } - -public function import_donation_data() -{ - if(!session()->has('logged_user')) - { - return redirect()->to(base_url()); - } - - - if($this->request->getmethod() == 'post') - { - //validate - $rules=[ - - 'upload_file' => [ - 'rules'=>'uploaded[upload_file]|max_size[upload_file,1024]|ext_in[upload_file,xlsx]', - 'lable'=>'upload file' - - ] - - ]; - - if(! $this->validate($rules)) - { - $data['validation'] = $this->validator; - }else{ - - $file= $this->request->getFile('upload_file'); - //echo $file->getName();exit(); - $ext=$file->getClientExtension(); - if($ext == 'xls'){ - $render = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); - } else { - $render = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); - } - $spreadsheet = $render->load($file); - $allDataInSheet = $spreadsheet->getActiveSheet()->toArray(null, true, true, true); - $arrayCount = count($allDataInSheet); - - $flag = 0; - $createArray = array('DATE', 'CAUSE_NAME', 'AMOUNT', 'PAYMENT_MODE' , 'REF' , 'DONATION_REF'); - - $makeArray = array('DATE' => 'DATE', 'CAUSE_NAME' => 'CAUSE_NAME', 'AMOUNT' => 'AMOUNT', 'PAYMENT_MODE' => 'PAYMENT_MODE', 'REF' => 'REF', 'DONATION_REF' => 'DONATION_REF'); - - $SheetDataKey = array(); - - foreach ($allDataInSheet as $dataInSheet) { - foreach ($dataInSheet as $key => $value) { - - if (in_array(trim($value), $createArray)) { - - $value = preg_replace('/\s+/', '', $value); - $SheetDataKey[trim($value)] = $key; - - } - - } - - } - $dataDiff = array_diff_key($makeArray, $SheetDataKey); - - if (empty($dataDiff)) { - $flag = 1; - } - // match excel sheet column - if ($flag == 1) - { - for ($i = 2; $i <= $arrayCount; $i++) - { - - $date = $SheetDataKey['DATE']; - $cause_name = $SheetDataKey['CAUSE_NAME']; - $amount = $SheetDataKey['AMOUNT']; - $payment_mode = $SheetDataKey['PAYMENT_MODE']; - $ref = $SheetDataKey['REF']; - $donation_ref = $SheetDataKey['DONATION_REF']; - - - $date = filter_var(trim($allDataInSheet[$i][$date]), FILTER_SANITIZE_STRING); - $cause_name = filter_var(trim($allDataInSheet[$i][$cause_name]), FILTER_SANITIZE_STRING); - $amount = filter_var(trim($allDataInSheet[$i][$amount]), FILTER_SANITIZE_EMAIL); - $payment_mode = filter_var(trim($allDataInSheet[$i][$payment_mode]), FILTER_SANITIZE_STRING); - $ref = filter_var(trim($allDataInSheet[$i][$ref]), FILTER_SANITIZE_EMAIL); - $donation_ref = filter_var(trim($allDataInSheet[$i][$donation_ref]), FILTER_SANITIZE_STRING); - - $fetchData= array('date' => $date, 'cause_name' => $cause_name, 'amount' => $amount, 'mode_of_payment' => $payment_mode, 'ref_1' => $ref, 'donation_ref' => $donation_ref); - - - $model = new Donation_data_model(); - $model->save($fetchData); - - } - - - - - - } else { - echo ''; - //echo "Please import correct file, did not match excel sheet column"; - } - - - } - } - //return redirect()->to(base_url().'/all_donation_data'); - return view('donation_data'); -} - - -// public function import_transaction_data() -// { - // $file_mimes = array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); - -// if(isset($_FILES['transacton_upload']['name']) && in_array($_FILES['transacton_upload']['type'], $file_mimes)) -// { -// $arr_file = explode('.', $_FILES['transacton_upload']['name']); -// $extension = end($arr_file); -// if('csv' == $extension){ -// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); -// } else { -// $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); -// } -// $spreadsheet = $reader->load($_FILES['transacton_upload']['tmp_name']); -// $sheetData = $spreadsheet->getActiveSheet()->toArray(); -// if(!empty($sheetData)) -// {echo "
";
-// print_r($sheetData);
-// }
-// }
-// }
-
-
-
-
-public function import_transaction_data()
-{
-     if(!session()->has('logged_user'))
-		{
-			return redirect()->to(base_url());
-		}
- 
-	if($this->request->getmethod() == 'post')
-		{
-			//validate 
-			$rules=[
-			
-			'transacton_upload' => [
-                'rules'=>'uploaded[transacton_upload]|max_size[transacton_upload,1024]|ext_in[transacton_upload,xlsx]',
-                'lable'=>'upload file'
-                
-            ]
-			
-			];
-			
-			if(! $this->validate($rules))
-			{
-				$data['validation'] = $this->validator;
-			}else{
-				
-		   $file= $this->request->getFile('transacton_upload');
-		   //echo $file->getName();exit();
-		   $ext=$file->getClientExtension();
-		   if($ext == 'xls'){
-		     $render = new \PhpOffice\PhpSpreadsheet\Reader\Xls();
-		   } else {
-			   $render = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
-		   }
-		   $spreadsheet = $render->load($file);
-		   $allDataInSheet = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
-		    $arrayCount = count($allDataInSheet);
-  print_r($arrayCount);die();
-                $flag = 0;
-                $createArray = array('DATE', 'REF_1', 'REF_2', 'REMARKS' , 'AMOUNT' , 'DONATION_REF');
-
-                $makeArray = array('DATE' => 'DATE', 'REF_1' => 'REF_1', 'REF_2' => 'REF_2', 'REMARKS' => 'REMARKS', 'AMOUNT' => 'AMOUNT', 'DONATION_REF' => 'DONATION_REF');
-
-                $SheetDataKey = array();
-				
-                foreach ($allDataInSheet as $dataInSheet) {
-                    foreach ($dataInSheet as $key => $value) {
-	
-                        if (in_array(trim($value), $createArray)) {
-				
-                            $value = preg_replace('/\s+/', '', $value);
-                            $SheetDataKey[trim($value)] = $key;
-							
-                        } 
-						
-                    }
-					 
-                }
-				$dataDiff = array_diff_key($makeArray, $SheetDataKey);
-		
-                if (empty($dataDiff)) {
-                    $flag = 1;
-                }
-                // match excel sheet column
-                if ($flag == 1) 
-				{
-                    for ($i = 2; $i <= $arrayCount; $i++) 
-					{
-                  
-                        $date = $SheetDataKey['DATE'];
-                        $ref_1 = $SheetDataKey['REF_1'];
-                        $ref_2 = $SheetDataKey['REF_2'];
-                        $remarks = $SheetDataKey['REMARKS'];
-						$amount = $SheetDataKey['AMOUNT'];
-                        $donation_ref 	= $SheetDataKey['DONATION_REF'];
-                        
- 
-                        $date = filter_var(trim($allDataInSheet[$i][$date]), FILTER_SANITIZE_STRING);
-                        $ref_1 = filter_var(trim($allDataInSheet[$i][$ref_1]), FILTER_SANITIZE_STRING);
-                        $ref_2 = filter_var(trim($allDataInSheet[$i][$ref_2]), FILTER_SANITIZE_EMAIL);
-                        $remarks = filter_var(trim($allDataInSheet[$i][$remarks]), FILTER_SANITIZE_STRING);
-						$amount = filter_var(trim($allDataInSheet[$i][$amount]), FILTER_SANITIZE_EMAIL);
-                        $donation_ref = filter_var(trim($allDataInSheet[$i][$donation_ref]), FILTER_SANITIZE_STRING);
-                        
-          $fetchData= array('date' => $date, 'ref_1' => $ref_1, 'ref_2' => $ref_2, 'remarks' => $remarks, 'amount' => $amount, 'donation_ref' => $donation_ref);
-					 // print_r($fetchData);
-					 $model = new Transaction_model();		 
-                     $model->save($fetchData);
-						
-                    }
-				
-                } else {
-					echo ''; 
-                    //echo "Please import correct file, did not match excel sheet column";
-                }
-			   
-				
-			}
-			
-			
-		}
-		// return redirect()->to(base_url().'/all_transaction');
-		return view('transaction_upload');
-
-}
-	public function transaction_file()
-{
-	return $this->response->download('public/assets/download/transaction_data_file.xlsx', NULL);
-}
-	public function donation_data_file()
-{
-	return $this->response->download('public/assets/download/donation_data_file.xlsx', NULL);
-}
-
-}
\ No newline at end of file
diff --git a/app/Controllers/Sendmail.php b/app/Controllers/Sendmail.php
deleted file mode 100644
index 1d48299..0000000
--- a/app/Controllers/Sendmail.php
+++ /dev/null
@@ -1,63 +0,0 @@
-setFrom('celine.forworkinphp96@gmail.com', 'Gowtham');
-        $email->setTo($to);
-        $email->setSubject($subject);
-        $email->setMessage($message);
-
-        if ($email->send()) 
-		{
-            echo 'Email successfully sent';
-        } 
-		else 
-		{
-            $data = $email->printDebugger(['headers']);
-            print_r($data);
-        }
-	 
-	 }
-
-    function sendMail() { 
-        $to = $this->request->getVar('mailTo');
-        $subject = $this->request->getVar('subject');
-        $message = $this->request->getVar('message');
-        
-        $email = \Config\Services::email();
-
-        $email->setTo($to);
-        $email->setFrom('johndoe@gmail.com', 'Confirm Registration');
-        
-        $email->setSubject($subject);
-        $email->setMessage($message);
-
-        if ($email->send()) 
-		{
-            echo 'Email successfully sent';
-        } 
-		else 
-		{
-            $data = $email->printDebugger(['headers']);
-            print_r($data);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/app/Controllers/UsersRules.php b/app/Controllers/UsersRules.php
deleted file mode 100644
index ca51a30..0000000
--- a/app/Controllers/UsersRules.php
+++ /dev/null
@@ -1,18 +0,0 @@
-where('email',$data['email'])
-		               ->first();
-		if($Donor)
-			return false;
-		return password_verify($data['password'],$Donor['password']);
-	}
-	
-}
\ No newline at end of file
diff --git a/app/Controllers/admin/Donation.php b/app/Controllers/admin/Donation.php
deleted file mode 100644
index 271d968..0000000
--- a/app/Controllers/admin/Donation.php
+++ /dev/null
@@ -1,20 +0,0 @@
-this is a product:'.$type.'and'.$type2.'';
-		//return view('show');
-	}
-
-	//--------------------------------------------------------------------
-
-}
diff --git a/app/Database/Migrations/.gitkeep b/app/Database/Migrations/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/app/Database/Seeds/.gitkeep b/app/Database/Seeds/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/app/Filters/.gitkeep b/app/Filters/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/app/Helpers/.gitkeep b/app/Helpers/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/app/Language/.gitkeep b/app/Language/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/app/Language/en/Validation.php b/app/Language/en/Validation.php
deleted file mode 100644
index 54d1e7a..0000000
--- a/app/Language/en/Validation.php
+++ /dev/null
@@ -1,4 +0,0 @@
-db->table('donation_cause');
-	 // $builder->where('status','Active');
-     $result   = $builder->get();
-	 $output = $result->getResultArray();
-     return $output;
-     }
-function inactive_donation_cause()
-     {
-	 $builder = $this->db->table('donation_cause');
-	 $builder->where('status','Inactive');
-     $result   = $builder->get();
-	 $output = $result->getResultArray();
-     return $output;
-     }
- function country($id)
-     {
-     $builder=$this->db->query("SELECT country_name FROM country WHERE  country_id = ".$id);
-	 $output = $builder->getResultArray();
-	 return $output;
-     }
-	 function state($id)
-     {
-     $builder=$this->db->query("SELECT state_name FROM state WHERE  state_id = ".$id);
-	 $output = $builder->getResultArray();
-	 return $output;
-     }
-	  function city($id)
-     {
-     $builder=$this->db->query("SELECT city_name FROM city WHERE  city_id = ".$id);
-	 $output = $builder->getResultArray();
-	 return $output;
-     }
-// function active_cause($id)
-     // {
-		 // $builder=$this->db->query("UPDATE donation_cause SET status ='Active' WHERE id = ".$id);
-     // }
- function fetch_cause_name()
-     {
-     $builder = $this->db->table('donation_cause');
-	 $builder->where('status','Active');
-     $query   = $builder->get();
-     $output = '';
-     foreach($query->getResult() as $row)
-       {
-     $output .= '';
-       }
-     return $output;
-     }
-
-     
-  
-}
\ No newline at end of file
diff --git a/app/Models/Dashboard_model.php b/app/Models/Dashboard_model.php
deleted file mode 100644
index 4ea8d25..0000000
--- a/app/Models/Dashboard_model.php
+++ /dev/null
@@ -1,65 +0,0 @@
-db->table('user_management');
-		$builder->where('id',$id);
-		$result = $builder->get();
-		if(count($result->getResultArray()) ==1)
-		{
-			return $result->getRow();
-		}else{
-			return false;
-		}
-		
-	}
-	
-	function fetch_country()
-     {
-		
-     $builder = $this->db->table('country');
-     $query   = $builder->get();
-  //print_r($query);die();
-   $output = '';
-  foreach($query->getResult() as $row)
-  {
-   $output .= '';
-  }
-  return $output;
- }
- function fetch_state($country_id)
-     {
-		
-     $builder = $this->db->table('state');
-	 $builder->where('country_id',$country_id);
-     $query   = $builder->get();
-  //print_r($query);die();
-   $output = '';
-  foreach($query->getResult() as $row)
-  {
-   $output .= '';
-  }
-  return $output;
- }
- function fetch_city($state_id)
-     {
-		
-     $builder = $this->db->table('city');
-	 $builder->where('state_id',$state_id);
-     $query   = $builder->get();
-  //print_r($query);die();
-   $output = '';
-  foreach($query->getResult() as $row)
-  {
-   $output .= '';
-  }
-  return $output;
- }
- 
-}
\ No newline at end of file
diff --git a/app/Models/Donation_cause.php b/app/Models/Donation_cause.php
deleted file mode 100644
index 4f671d2..0000000
--- a/app/Models/Donation_cause.php
+++ /dev/null
@@ -1,64 +0,0 @@
-db->table('donation_cause');
-	 // $builder->where('status','Active');
-     $result   = $builder->get();
-	 $output = $result->getResultArray();
-     return $output;
-     }
-function inactive_donation_cause()
-     {
-	 $builder = $this->db->table('donation_cause');
-	 $builder->where('status','Inactive');
-     $result   = $builder->get();
-	 $output = $result->getResultArray();
-     return $output;
-     }
- // function inactive_cause($id)
-     // {
-     // $builder=$this->db->query("UPDATE donation_cause SET status = Inactive  WHERE id = ".$id);
-     // }
-// function active_cause($id)
-     // {
-		 // $builder=$this->db->query("UPDATE donation_cause SET status ='Active' WHERE id = ".$id);
-     // }
- function fetch_cause_name()
-     {
-     $builder = $this->db->table('donation_cause');
-	 $builder->where('status','Active');
-     $query   = $builder->get();
-     $output = '';
-     foreach($query->getResult() as $row)
-       {
-     $output .= '';
-       }
-     return $output;
-     }
-
-     
-    // protected $returnType     = 'array';
-    // protected $useSoftDeletes = true;
-
-    
-
-    // protected $useTimestamps = false;
-    // protected $createdField  = 'created_at';
-    // protected $updatedField  = 'updated_at';
-    // protected $deletedField  = 'deleted_at';
-
-    // protected $validationRules    = [];
-    // protected $validationMessages = [];
-    // protected $skipValidation     = false;
-}
\ No newline at end of file
diff --git a/app/Models/Donation_data_model.php b/app/Models/Donation_data_model.php
deleted file mode 100644
index 9fc1410..0000000
--- a/app/Models/Donation_data_model.php
+++ /dev/null
@@ -1,37 +0,0 @@
-db->table('donation_data');
-     $result   = $builder->get();
-	 $output = $result->getResultArray();
-     return $output;
- }
-
-     
-    // protected $returnType     = 'array';
-    // protected $useSoftDeletes = true;
-
-    
-
-    // protected $useTimestamps = false;
-    // protected $createdField  = 'created_at';
-    // protected $updatedField  = 'updated_at';
-    // protected $deletedField  = 'deleted_at';
-
-    // protected $validationRules    = [];
-    // protected $validationMessages = [];
-    // protected $skipValidation     = false;
-}
\ No newline at end of file
diff --git a/app/Models/Donation_model.php b/app/Models/Donation_model.php
deleted file mode 100644
index ba30c18..0000000
--- a/app/Models/Donation_model.php
+++ /dev/null
@@ -1,25 +0,0 @@
-passwordHash($data);
-		return $data;
-	}
-	
-	protected function beforeUpdate(array $data){
-		$data= $this->passwordHash($data);
-		return $data;
-	}
-	
-	protected function passwordHash(array $data)
-	{
-		if(isset($data['data']['password']))
-		$data['data']['password'] = password_hash($data['data']['password'],PASSWORD_DEFAULT);
-		return $data;
-	}
-	public function verifyEmail($email)
-	{
-		
-		$builder = $this->db->table('user_management');
-		$builder -> select("id,phone,email,password");
-		$builder -> where('email',$email);
-		$result = $builder->get();
-		if(count($result->getResultArray()) ==1)
-		{
-			return $result->getRowArray();
-		}else{
-			return false;
-		}
-	}
-
-     
-    // protected $returnType     = 'array';
-    // protected $useSoftDeletes = true;
-
-    
-
-    // protected $useTimestamps = false;
-    // protected $createdField  = 'created_at';
-    // protected $updatedField  = 'updated_at';
-    // protected $deletedField  = 'deleted_at';
-
-    // protected $validationRules    = [];
-    // protected $validationMessages = [];
-    // protected $skipValidation     = false;
-}
\ No newline at end of file
diff --git a/app/Models/My_model.php b/app/Models/My_model.php
deleted file mode 100644
index edfd228..0000000
--- a/app/Models/My_model.php
+++ /dev/null
@@ -1,61 +0,0 @@
-db->table('donar_management');
-     $result   = $builder->get();
-	 $output = $result->getResultArray();
-     return $output;
- }
-function fetch_donor_id()
-     {
-		
-     $builder = $this->db->table('donar_management');
-     $query   = $builder->get();
-  //print_r($query);die();
-   $output = '';
-  foreach($query->getResult() as $row)
-  {
-   $output .= '';
-  }
-  return $output;
- }
- function edit_donor_id()
-     {
-		
-     $builder = $this->db->table('donar_management');
-     $query   = $builder->get();
-  //print_r($query);die();
-   $output = '';
-  foreach($query->getResult() as $row)
-  {
-   $output .= '';
-  }
-  return $output;
- }
-     
-    // protected $returnType     = 'array';
-    // protected $useSoftDeletes = true;
-
-    
-
-    // protected $useTimestamps = false;
-    // protected $createdField  = 'created_at';
-    // protected $updatedField  = 'updated_at';
-    // protected $deletedField  = 'deleted_at';
-
-    // protected $validationRules    = [];
-    // protected $validationMessages = [];
-    // protected $skipValidation     = false;
-}
\ No newline at end of file
diff --git a/app/Models/Receipt_model.php b/app/Models/Receipt_model.php
deleted file mode 100644
index efb4629..0000000
--- a/app/Models/Receipt_model.php
+++ /dev/null
@@ -1,42 +0,0 @@
-db->table('receipts');
-     $result   = $builder->get();
-	 $output = $result->getResultArray();
-     return $output;
-     }
-	
-	function last_receipt()
-	{
-    $builder=$this->db->query("SELECT receipt_id,receipt_no,date,donor_id,amount,mode_of_receipt,receipt_details,cause_name,remarks FROM receipts where receipt_id =(select max(receipt_id) from receipts) ");
-	$output = $builder->getResultArray();
-	return $output;
-	}
-
-     
-    // protected $returnType     = 'array';
-    // protected $useSoftDeletes = true;
-
-    
-
-    // protected $useTimestamps = false;
-    // protected $createdField  = 'created_at';
-    // protected $updatedField  = 'updated_at';
-    // protected $deletedField  = 'deleted_at';
-
-    // protected $validationRules    = [];
-    // protected $validationMessages = [];
-    // protected $skipValidation     = false;
-}
\ No newline at end of file
diff --git a/app/Models/Transaction_model.php b/app/Models/Transaction_model.php
deleted file mode 100644
index c9284c0..0000000
--- a/app/Models/Transaction_model.php
+++ /dev/null
@@ -1,37 +0,0 @@
-db->table('transactions_uploads');
-     $result   = $builder->get();
-	 $output = $result->getResultArray();
-     return $output;
- }
-
-     
-    // protected $returnType     = 'array';
-    // protected $useSoftDeletes = true;
-
-    
-
-    // protected $useTimestamps = false;
-    // protected $createdField  = 'created_at';
-    // protected $updatedField  = 'updated_at';
-    // protected $deletedField  = 'deleted_at';
-
-    // protected $validationRules    = [];
-    // protected $validationMessages = [];
-    // protected $skipValidation     = false;
-}
\ No newline at end of file
diff --git a/app/ThirdParty/.gitkeep b/app/ThirdParty/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/app/Validation/UsersRules.php b/app/Validation/UsersRules.php
deleted file mode 100644
index 8da50aa..0000000
--- a/app/Validation/UsersRules.php
+++ /dev/null
@@ -1,19 +0,0 @@
-where('email',$data['email'])
-		               ->first();
-		if(!$Donor)
-			return false;
-		
-		return password_verify($data['password'],$user['password']);
-	}
-	
-}
\ No newline at end of file
diff --git a/app/Views/add_donation_cause.php b/app/Views/add_donation_cause.php
deleted file mode 100644
index a0f5745..0000000
--- a/app/Views/add_donation_cause.php
+++ /dev/null
@@ -1,271 +0,0 @@
-
-
-
-
-
-
-
-
-    
-    
-
-    
-    
-    
-    
-    
-
-    
-    
-    
-    Donor App
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    
-    
-    
-
-    
-    
-    
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-   
-
\ No newline at end of file
diff --git a/app/Views/all_donation_cause.php b/app/Views/all_donation_cause.php
deleted file mode 100644
index 1a5634c..0000000
--- a/app/Views/all_donation_cause.php
+++ /dev/null
@@ -1,223 +0,0 @@
-
-
-
-
-
-    
-    
-    
-    
-    Donor App
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/Views/dashboard.php b/app/Views/dashboard.php
deleted file mode 100644
index 36485aa..0000000
--- a/app/Views/dashboard.php
+++ /dev/null
@@ -1,186 +0,0 @@
-
-
-
-
-
-
-    
-    
-    
-    
-    Donor App
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-
-
-     
-        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
diff --git a/app/Views/donation_cause_edit.php b/app/Views/donation_cause_edit.php
deleted file mode 100644
index 20c6a8b..0000000
--- a/app/Views/donation_cause_edit.php
+++ /dev/null
@@ -1,268 +0,0 @@
-
-
-
-
-
-
-    
-    
-    
-    
-    
-
-    
-    
-    
-    Donor App
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    
-    
-    
-
-    
-    
-    
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-    
-    
-    
-    
-    
-
-    
-    
-
diff --git a/app/Views/donation_data.php b/app/Views/donation_data.php
deleted file mode 100644
index 1042733..0000000
--- a/app/Views/donation_data.php
+++ /dev/null
@@ -1,247 +0,0 @@
-
-
-
-
-
-    
-    
-    
-    
-    
-
-    
-    
-    
-    Donor App
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    
-    
-    
-
-    
-    
-    
-
-
-
-
-
-    
- - -
- - -
-
- - - - - -
-
-
- -
-

Donation data upload

-
- -
" enctype="multipart/form-data"> -
- -
-
- -
-
- -
- - -
- - -
- - - - - -
-
- - -
-
-
- - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/Views/donation_data_edit.php b/app/Views/donation_data_edit.php deleted file mode 100644 index 7891991..0000000 --- a/app/Views/donation_data_edit.php +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - - - - - - - - - - - Donor App - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
- -
-
-
-

Edit Donation Data

-
-
-
- -
-
Date
-
-
-
-
- - -
-
- -
-
-
-
-
Donation Cause
-
-
-
-
- - -
-
- -
-
-
-
-
Amount
-
-
-
-
- - -
-
- -
-
-
-
-
Payment Mode
-
-
- -
-
-
- -
-
Payment Mode Ref
-
-
-
-
- - -
-
- -
-
-
-
-
Donation Referance
-
-
-
-
- - -
-
- -
-
-
- - - - - - - -
- -
-
-
-
-
-
-
-
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/donation_data_table.php b/app/Views/donation_data_table.php deleted file mode 100644 index fb3bbf4..0000000 --- a/app/Views/donation_data_table.php +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - Donor App - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/donor_edit.php b/app/Views/donor_edit.php deleted file mode 100644 index 5615804..0000000 --- a/app/Views/donor_edit.php +++ /dev/null @@ -1,465 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Donor App - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
- -
-
-
-

Donor Registration

-
-
-
" > - -
-
Name
-
-
-
-
- - -
-
- -
-
-
- -
-
Email
-
-
- -
-
-
-
-
Phone
-
-
-
-
- - -
-
- -
-
-
-
-
PAN No
-
-
-
-
- - -
-
- -
-
-
-
-
Address
-
-
- -
-
-
-
-
Country
-
-
- -
-
-
-
-
State
-
-
- -
-
-
-
-
City
-
-
- -
-
-
-
-
PinCode
-
-
- -
-
-
- -
-
Date Of Birth
-
-
- -
-
-
-
-
Gender
-
-
- -
-
-
- -
-
Org Name
-
-
- -
-
-
-
-
GSTIN
-
-
- -
-
-
- -
-
- -
- listErrors() ?> -
- -
-
- - - - -
- -
-
-
-
-
-
-
-
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/donor_registration.php b/app/Views/donor_registration.php deleted file mode 100644 index 10cf035..0000000 --- a/app/Views/donor_registration.php +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Donor App - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
- -
-
-
-

Donor Registration

-
-
-
" enctype="multipart/form-data"> - -
-
Name
-
-
-
-
- - -
-
- -
-
-
- -
-
Email
-
-
- -
-
-
-
-
Phone
-
-
-
-
- - -
-
- -
-
-
-
-
PAN No
-
-
-
-
- - -
-
- -
-
-
-
-
Address
-
-
- -
-
-
-
-
Country
-
-
- -
-
-
-
-
State
-
-
- -
-
-
-
-
City
-
-
- -
-
-
-
-
PinCode
-
-
- -
-
-
- -
-
Date Of Birth
-
-
- -
-
-
-
-
Gender
-
-
- -
-
-
- -
-
Org Name
-
-
- -
-
-
-
-
GSTIN
-
-
- -
-
-
- - - - - -
- listErrors() ?> -
- - - - - - -
- - -
- - -
- -
-
-
-
-
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/donor_table.php b/app/Views/donor_table.php deleted file mode 100644 index 9e4b228..0000000 --- a/app/Views/donor_table.php +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - - - - - - - - - - Donor App - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- -
-
-
-
-

Donor List

-
-
- - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Name Phone Email Pan Address DOB Gender Org Name GSTIN Action
,,,.
Edit
-
-
-
-
-
-
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/download_receipt.php b/app/Views/download_receipt.php deleted file mode 100644 index bc817d1..0000000 --- a/app/Views/download_receipt.php +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - A simple, clean, and responsive HTML invoice template - - - - - - - - - - - - - -
- - - - - - -
-
-

- -

-
,,
-
-.
-
Email :
-
GSTIN :
-
-

Donation Receipt


-Date :   -                     -             -Receipt No :    

-Donated by :   
-Street Address :  
-City :  - -State :  -Pin : 
-Amount Received By Charity :      -
- - Amount in Words : - - '', '1' => 'one', '2' => 'two', - '3' => 'three', '4' => 'four', '5' => 'five', '6' => 'six', - '7' => 'seven', '8' => 'eight', '9' => 'nine', - '10' => 'ten', '11' => 'eleven', '12' => 'twelve', - '13' => 'thirteen', '14' => 'fourteen', - '15' => 'fifteen', '16' => 'sixteen', '17' => 'seventeen', - '18' => 'eighteen', '19' =>'nineteen', '20' => 'twenty', - '30' => 'thirty', '40' => 'forty', '50' => 'fifty', - '60' => 'sixty', '70' => 'seventy', - '80' => 'eighty', '90' => 'ninety'); - $digits = array('', 'hundred', 'thousand', 'lakh', 'crore'); - while ($i < $digits_1) { - $divider = ($i == 2) ? 10 : 100; - $number = floor($no % $divider); - $no = floor($no / $divider); - $i += ($divider == 10) ? 1 : 2; - if ($number) { - $plural = (($counter = count($str)) && $number > 9) ? 's' : null; - $hundred = ($counter == 1 && $str[0]) ? ' and ' : null; - $str [] = ($number < 21) ? $words[$number] . - " " . $digits[$counter] . $plural . " " . $hundred - : - $words[floor($number / 10) * 10] - . " " . $words[$number % 10] . " " - . $digits[$counter] . $plural . " " . $hundred; - } else $str[] = null; - } - $str = array_reverse($str); - $result = implode('', $str); - $points = ($point) ? - "." . $words[$point / 10] . " " . - $words[$point = $point % 10] : ''; - $get_amount = $result . "Rupees " . $points; - ?> -
-Discription of Donation :      -

-                     -                     -                     -                       - -Authorized Signature :      -

-
"Thank You For Your Donation"
-
-
- - - diff --git a/app/Views/edit_view.php b/app/Views/edit_view.php deleted file mode 100644 index 9884a6a..0000000 --- a/app/Views/edit_view.php +++ /dev/null @@ -1,9 +0,0 @@ - -
- - - - -
- - \ No newline at end of file diff --git a/app/Views/errors/cli/error_404.php b/app/Views/errors/cli/error_404.php deleted file mode 100644 index d5bccb4..0000000 --- a/app/Views/errors/cli/error_404.php +++ /dev/null @@ -1,6 +0,0 @@ - -Message: -Filename: getFile(), "\n"; ?> -Line Number: getLine(); ?> - - - - Backtrace: - getTrace() as $error): ?> - - - - - - diff --git a/app/Views/errors/cli/production.php b/app/Views/errors/cli/production.php deleted file mode 100644 index 7db744e..0000000 --- a/app/Views/errors/cli/production.php +++ /dev/null @@ -1,5 +0,0 @@ - - - - - 404 Page Not Found - - - - -
-

404 - File Not Found

- -

- - - - Sorry! Cannot seem to find the page you were looking for. - -

-
- - diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php deleted file mode 100644 index 09fddcb..0000000 --- a/app/Views/errors/html/error_exception.php +++ /dev/null @@ -1,401 +0,0 @@ - - - - - - - - <?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8') ?> - - - - - - - -
-
-

getCode() ? ' #' . $exception->getCode() : '') ?>

-

- getMessage() ?> - getMessage())) ?>" - rel="noreferrer" target="_blank">search → -

-
-
- - -
-

at line

- - -
- -
- -
- -
- - - -
- - -
- -
    - $row) : ?> - -
  1. -

    - - - - - {PHP internal code} - - - - -   —   - - - ( arguments ) -

    - - - getParameters(); - } - foreach ($row['args'] as $key => $value) : ?> - - - - - - -
    name : "#$key", ENT_SUBSTITUTE, 'UTF-8') ?>
    -
    - - () - - - - -   —   () - -

    - - - -
    - -
    - -
  2. - - -
- -
- - -
- - - -

$

- - - - - - - - - - $value) : ?> - - - - - - -
KeyValue
- - - - ' . print_r($value, true) ?> - -
- - - - - - -

Constants

- - - - - - - - - - $value) : ?> - - - - - - -
KeyValue
- - - - ' . print_r($value, true) ?> - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Pathuri ?>
HTTP MethodgetMethod(true) ?>
IP AddressgetIPAddress() ?>
Is AJAX Request?isAJAX() ? 'yes' : 'no' ?>
Is CLI Request?isCLI() ? 'yes' : 'no' ?>
Is Secure Request?isSecure() ? 'yes' : 'no' ?>
User AgentgetUserAgent()->getAgentString() ?>
- - - - - - - - -

$

- - - - - - - - - - $value) : ?> - - - - - - -
KeyValue
- - - - ' . print_r($value, true) ?> - -
- - - - - -
- No $_GET, $_POST, or $_COOKIE Information to show. -
- - - - getHeaders(); ?> - - -

Headers

- - - - - - - - - - - - - - - - - - - - -
HeaderValue
getName(), 'html') ?>getValueLine(), 'html') ?>
- - -
- - - setStatusCode(http_response_code()); - ?> -
- - - - - -
Response StatusgetStatusCode() . ' - ' . $response->getReason() ?>
- - getHeaders(); ?> - - - -

Headers

- - - - - - - - - - $value) : ?> - - - - - - -
HeaderValue
getHeaderLine($name), 'html') ?>
- - -
- - -
- - -
    - -
  1. - -
-
- - -
- - - - - - - - - - - - - - - - -
Memory Usage
Peak Memory Usage:
Memory Limit:
- -
- -
- -
- - - - - diff --git a/app/Views/errors/html/production.php b/app/Views/errors/html/production.php deleted file mode 100644 index cca49c2..0000000 --- a/app/Views/errors/html/production.php +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - Whoops! - - - - - -
- -

Whoops!

- -

We seem to have hit a snag. Please try again later...

- -
- - - - diff --git a/app/Views/list.php b/app/Views/list.php deleted file mode 100644 index 9fe983a..0000000 --- a/app/Views/list.php +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - -
NameEmailAction
Edit - Delete - private view
-
-
- \ No newline at end of file diff --git a/app/Views/login.php b/app/Views/login.php deleted file mode 100644 index e8a2709..0000000 --- a/app/Views/login.php +++ /dev/null @@ -1,117 +0,0 @@ - - - - Login - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
"> - - - - LOG IN - - -
- - -
- -
- - -
-get('success')): ?> - - - - - -
-listErrors() ?> -
- - -getTempdata('error')):?> - -
-getTempdata('error'); ?> -
- - - - -
- -
- - -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/Views/pdf_view.php b/app/Views/pdf_view.php deleted file mode 100644 index 0aeb13c..0000000 --- a/app/Views/pdf_view.php +++ /dev/null @@ -1,333 +0,0 @@ -

RECEIPT

-
- - - - - - -
- - - - - A simple, clean, and responsive HTML invoice template - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - -
-

DONATION RECEIPT

-
- Receipt No #:
- Created:
- -
-
- -
- ,,
- -. -
- - Email :
- Phone :.
- -
- Donation Cause - - -
- Donation Cause Validity - - -to- -
- Payment Method - - Check # -
- Check - - - - -
- Item - - Price -
- Website design - - $300.00 -
- Hosting (3 months) - - $75.00 -
- Domain name (1 year) - - $10.00 -
- Total: $385.00 -
-
- - - - '', 1 => 'One', 2 => 'Two', - 3 => 'Three', 4 => 'Four', 5 => 'Five', 6 => 'Six', - 7 => 'Seven', 8 => 'Eight', 9 => 'Nine', - 10 => 'Ten', 11 => 'Eleven', 12 => 'Twelve', - 13 => 'Thirteen', 14 => 'Fourteen', 15 => 'Fifteen', - 16 => 'Sixteen', 17 => 'Seventeen', 18 => 'Eighteen', - 19 => 'Nineteen', 20 => 'Twenty', 30 => 'Thirty', - 40 => 'Forty', 50 => 'Fifty', 60 => 'Sixty', - 70 => 'Seventy', 80 => 'Eighty', 90 => 'Ninety'); - $here_digits = array('', 'Hundred','Thousand','Lakh', 'Crore'); - while( $x < $count_length ) { - $get_divider = ($x == 2) ? 10 : 100; - $amount = floor($num % $get_divider); - $num = floor($num / $get_divider); - $x += $get_divider == 10 ? 1 : 2; - if ($amount) { - $add_plural = (($counter = count($string)) && $amount > 9) ? 's' : null; - $amt_hundred = ($counter == 1 && $string[0]) ? ' and ' : null; - $string [] = ($amount < 21) ? $change_words[$amount].' '. $here_digits[$counter]. $add_plural.' - '.$amt_hundred:$change_words[floor($amount / 10) * 10].' '.$change_words[$amount % 10]. ' - '.$here_digits[$counter].$add_plural.' '.$amt_hundred; - } - else $string[] = null; - } - $implode_to_Rupees = implode('', array_reverse($string)); - $get_paise = ($amount_after_decimal > 0) ? "And " . ($change_words[$amount_after_decimal / 10] . " - " . $change_words[$amount_after_decimal % 10]) . ' Paise' : ''; - return ($implode_to_Rupees ? $implode_to_Rupees . 'Rupees ' : '') . $get_paise; -} -?> - - - \ No newline at end of file diff --git a/app/Views/profile.php b/app/Views/profile.php deleted file mode 100644 index 744f079..0000000 --- a/app/Views/profile.php +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
-
-
-

Welcome , name); ?>


-

Mobile:phone;?>


-

Email :email;?>


-

Organization Name :org_name;?>


- -


-
-
-
- diff --git a/app/Views/profile_view.php b/app/Views/profile_view.php deleted file mode 100644 index 3dd277d..0000000 --- a/app/Views/profile_view.php +++ /dev/null @@ -1,9 +0,0 @@ - - -


-


-


- - -
- \ No newline at end of file diff --git a/app/Views/receipt_edit.php b/app/Views/receipt_edit.php deleted file mode 100644 index b7cf19c..0000000 --- a/app/Views/receipt_edit.php +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Donar App - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- - - -
-
-
-

EDIT RECEIPTS

-
-
-
"> - - -
-
Date
-
-
- -
-
-
-
-
Select Donor Id
-
-
- -
-
-
- - - -
-
Amount
-
-
- -
-
-
- -
-
Mode Of Receipt
-
-
- -
-
-
-
-
Receipt Details
-
-
- -
-
-
- -
-
Select Cause Name
-
-
- -
-
-
- -
-
Remarks
-
-
- -
-
-
- -
- -
-
-
-
- -
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/receipt_view.php b/app/Views/receipt_view.php deleted file mode 100644 index 15141fe..0000000 --- a/app/Views/receipt_view.php +++ /dev/null @@ -1,567 +0,0 @@ - - - - - - - - A simple, clean, and responsive HTML invoice template - - - - - - - - Donar App - - - - - - - - - - - - -
- - -
- - -
- - -

RECEIPT

-
- -
-
- - - - - - -
- -
- -
- -
-


-
Girl in a jacket

-

-
,,
-
-.
-
Email :
-
GSTIN :
-
- - - -
- -
-

Donation Receipt


- Date :   -                      -              - Receipt No :    


- Donated by :
- Street Address :  
- City :  - - State :  - Pin : 
- Amount Received By Charity :      -
- - - Amount in Words : - - '', '1' => 'one', '2' => 'two', - '3' => 'three', '4' => 'four', '5' => 'five', '6' => 'six', - '7' => 'seven', '8' => 'eight', '9' => 'nine', - '10' => 'ten', '11' => 'eleven', '12' => 'twelve', - '13' => 'thirteen', '14' => 'fourteen', - '15' => 'fifteen', '16' => 'sixteen', '17' => 'seventeen', - '18' => 'eighteen', '19' =>'nineteen', '20' => 'twenty', - '30' => 'thirty', '40' => 'forty', '50' => 'fifty', - '60' => 'sixty', '70' => 'seventy', - '80' => 'eighty', '90' => 'ninety'); - $digits = array('', 'hundred', 'thousand', 'lakh', 'crore'); - while ($i < $digits_1) { - $divider = ($i == 2) ? 10 : 100; - $number = floor($no % $divider); - $no = floor($no / $divider); - $i += ($divider == 10) ? 1 : 2; - if ($number) { - $plural = (($counter = count($str)) && $number > 9) ? 's' : null; - $hundred = ($counter == 1 && $str[0]) ? ' and ' : null; - $str [] = ($number < 21) ? $words[$number] . - " " . $digits[$counter] . $plural . " " . $hundred - : - $words[floor($number / 10) * 10] - . " " . $words[$number % 10] . " " - . $digits[$counter] . $plural . " " . $hundred; - } else $str[] = null; - } - $str = array_reverse($str); - $result = implode('', $str); - $points = ($point) ? - "." . $words[$point / 10] . " " . - $words[$point = $point % 10] : ''; - $get_amount = $result . "Rupees " . $points; - ?> -
- - - Discription of Donation :      -
-
- -
-

Donation Receipt


-
Date :
- - -
Receipt No :



-
Donated by :
-
Street Address :
-
City :
-
-
State :
-
Pin :
-
Amount Received By Charity :
-
- - -
Amount in Words :
- - '', '1' => 'one', '2' => 'two', - '3' => 'three', '4' => 'four', '5' => 'five', '6' => 'six', - '7' => 'seven', '8' => 'eight', '9' => 'nine', - '10' => 'ten', '11' => 'eleven', '12' => 'twelve', - '13' => 'thirteen', '14' => 'fourteen', - '15' => 'fifteen', '16' => 'sixteen', '17' => 'seventeen', - '18' => 'eighteen', '19' =>'nineteen', '20' => 'twenty', - '30' => 'thirty', '40' => 'forty', '50' => 'fifty', - '60' => 'sixty', '70' => 'seventy', - '80' => 'eighty', '90' => 'ninety'); - $digits = array('', 'hundred', 'thousand', 'lakh', 'crore'); - while ($i < $digits_1) { - $divider = ($i == 2) ? 10 : 100; - $number = floor($no % $divider); - $no = floor($no / $divider); - $i += ($divider == 10) ? 1 : 2; - if ($number) { - $plural = (($counter = count($str)) && $number > 9) ? 's' : null; - $hundred = ($counter == 1 && $str[0]) ? ' and ' : null; - $str [] = ($number < 21) ? $words[$number] . - " " . $digits[$counter] . $plural . " " . $hundred - : - $words[floor($number / 10) * 10] - . " " . $words[$number % 10] . " " - . $digits[$counter] . $plural . " " . $hundred; - } else $str[] = null; - } - $str = array_reverse($str); - $result = implode('', $str); - $points = ($point) ? - "." . $words[$point / 10] . " " . - $words[$point = $point % 10] : ''; - $get_amount = $result . "Rupees " . $points; - ?> -
- - -
Discription of Donation :
-
-


-Authorized Signature :      - -

-
"Thank You For Your Donation"
-
-
-
- -
- - - -
-
- - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/receipts.php b/app/Views/receipts.php deleted file mode 100644 index 62b0b82..0000000 --- a/app/Views/receipts.php +++ /dev/null @@ -1,363 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Donor App - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- - - -
-
-
-

GENERATE RECEIPTS

-
-
-
"> -
-
Date
-
-
- -
-
-
-
-
Select Donor Id
-
-
- -
-
-
-
-
Amount
-
-
- -
-
-
-
-
Mode Of Receipt
-
-
- -
-
-
-
-
Receipt Details
-
-
- -
-
-
-
-
Select Cause Name
-
-
- -
-
-
- -
-
Remarks
-
-
- -
-
-
- -
- -
-
-
-
- -
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/receipts_table.php b/app/Views/receipts_table.php deleted file mode 100644 index 492eb2d..0000000 --- a/app/Views/receipts_table.php +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - - - - Donor App - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/register.php b/app/Views/register.php deleted file mode 100644 index 8018970..0000000 --- a/app/Views/register.php +++ /dev/null @@ -1,372 +0,0 @@ - - - - - - - - - - - - - - Login - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - - Sign UP - -
-
" enctype="multipart/form-data"> - -
- - -
-
- - -
-
- -
-
- - -
-
- -
-
- - -
-
- -
-
- - - -
-
- -
-
- - -
-
- -
-
- - -
-
- -
-
- - -
-
- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
- - -
-
- -
-
- - -
- -
- -
-
- - -
- -
- - - -
-
- - -
-
- -
-
- - -
-
- -
-
- - - -
-listErrors() ?> -
- - - - - -
- -
- -
- - - -
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/Views/sample.php b/app/Views/sample.php deleted file mode 100644 index 9b21c7d..0000000 --- a/app/Views/sample.php +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - -
-
- -
-
-
-
-
- iamgurdeeposahan -
-
-
-
-
TechiTouch.
-

+91 12345-6789

-

info@gmail.com

-

Australia

-
-
-
-
- -
-
-
-
-
Gurdeep Singh Ā  | Ā  Lucky Number : 156
-

Mobile : +91 12345-6789

-

Email : info@gmail.com

-

Address : Australia

-
-
-
-
-

Receipt

-
-
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DescriptionAmount
Payment for August 2016 15,000/-
Payment for June 2016 6,00/-
Payment for May 2016 35,00/-
-

- Total Amount: -

-

- Late Fees: -

-

- Payable Amount: -

-

- Balance Due: -

-
-

- 65,500/- -

-

- 500/- -

-

- 1300/- -

-

- 9500/- -

-

Total:

31.566/-

-
- -
- -
- -
-
-
\ No newline at end of file diff --git a/app/Views/show.php b/app/Views/show.php deleted file mode 100644 index 438eff2..0000000 --- a/app/Views/show.php +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - Form Validation - - -
-
"> -POSTS -
-POSTID -
- -
-
-
-
-

Form Validation

-
"> -
- - -
-
- - - We'll never share your email with anyone else. -
- -
- - -
- -
-
- - - - - - - - \ No newline at end of file diff --git a/app/Views/templates/footer.php b/app/Views/templates/footer.php deleted file mode 100644 index 691287b..0000000 --- a/app/Views/templates/footer.php +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/app/Views/templates/header.php b/app/Views/templates/header.php deleted file mode 100644 index ed9a4f9..0000000 --- a/app/Views/templates/header.php +++ /dev/null @@ -1,572 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -has('logged_user')): ?> - - \ No newline at end of file diff --git a/app/Views/transaction_edit.php b/app/Views/transaction_edit.php deleted file mode 100644 index fd9d4ad..0000000 --- a/app/Views/transaction_edit.php +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - - - - - - - - - - - Donor App - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
- -
-
- -
-
-
-

Edit Transaction Data

-
-
-
- -
-
Date
-
-
-
-
- - -
-
- -
-
-
-
-
Referance
-
-
-
-
- - -
-
- -
-
-
-
-
Amount
-
-
-
-
- - -
-
- -
-
-
-
-
Remark
-
-
-
-
- - -
-
- -
-
-
-
-
Donation Referance
-
-
-
-
- - -
-
- -
-
-
- - - - - - - -
- -
-
-
-
-
-
-
-
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/transaction_table.php b/app/Views/transaction_table.php deleted file mode 100644 index 2275e99..0000000 --- a/app/Views/transaction_table.php +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - Donor App - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Views/transaction_upload.php b/app/Views/transaction_upload.php deleted file mode 100644 index 3a099ac..0000000 --- a/app/Views/transaction_upload.php +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - - - - - - - - Donor App - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- - -
-
- - - - - -
-
-
- -
-

Transaction data upload

-
- -
" enctype="multipart/form-data"> -
- -
-
- -
-
- -
- - -
- - -
- - - - - -
-
- - -
-
-
- - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/Views/view_receipt.php b/app/Views/view_receipt.php deleted file mode 100644 index 78d15d5..0000000 --- a/app/Views/view_receipt.php +++ /dev/null @@ -1,321 +0,0 @@ -

RECEIPT

-
- -
- - -               - - -               - - -               - - -
- - - - - - - A simple, clean, and responsive HTML invoice template - - - - - - - - - -
-
-
-


-
Girl in a jacket

-

-
,,
-
-.
-
Email :
-
GSTIN :
-
- -
-

Donation Receipt


-Date :   -                     -             -Receipt No :    

-Donated by :   

-Street Address :  
-City :  - -State :  -Pin : 
-Amount Received By Charity :      -
- - Amount in Words : - -
-Discription of Donation :      -


-Authorized Signature :     Girl in a jacket -

-
"Thank You For Your Donation"
-
-
-
- - - - '', 1 => 'One', 2 => 'Two', - 3 => 'Three', 4 => 'Four', 5 => 'Five', 6 => 'Six', - 7 => 'Seven', 8 => 'Eight', 9 => 'Nine', - 10 => 'Ten', 11 => 'Eleven', 12 => 'Twelve', - 13 => 'Thirteen', 14 => 'Fourteen', 15 => 'Fifteen', - 16 => 'Sixteen', 17 => 'Seventeen', 18 => 'Eighteen', - 19 => 'Nineteen', 20 => 'Twenty', 30 => 'Thirty', - 40 => 'Forty', 50 => 'Fifty', 60 => 'Sixty', - 70 => 'Seventy', 80 => 'Eighty', 90 => 'Ninety'); - $here_digits = array('', 'Hundred','Thousand','Lakh', 'Crore'); - while( $x < $count_length ) { - $get_divider = ($x == 2) ? 10 : 100; - $amount = floor($num % $get_divider); - $num = floor($num / $get_divider); - $x += $get_divider == 10 ? 1 : 2; - if ($amount) { - $add_plural = (($counter = count($string)) && $amount > 9) ? 's' : null; - $amt_hundred = ($counter == 1 && $string[0]) ? ' and ' : null; - $string [] = ($amount < 21) ? $change_words[$amount].' '. $here_digits[$counter]. $add_plural.' - '.$amt_hundred:$change_words[floor($amount / 10) * 10].' '.$change_words[$amount % 10]. ' - '.$here_digits[$counter].$add_plural.' '.$amt_hundred; - } - else $string[] = null; - } - $implode_to_Rupees = implode('', array_reverse($string)); - $get_paise = ($amount_after_decimal > 0) ? "And " . ($change_words[$amount_after_decimal / 10] . " - " . $change_words[$amount_after_decimal % 10]) . ' Paise' : ''; - return ($implode_to_Rupees ? $implode_to_Rupees . 'Rupees ' : '') . $get_paise; -}?> - -"ZERO", -1 => "ONE", -2 => "TWO", -3 => "THREE", -4 => "FOUR", -5 => "FIVE", -6 => "SIX", -7 => "SEVEN", -8 => "EIGHT", -9 => "NINE", -10 => "TEN", -11 => "ELEVEN", -12 => "TWELVE", -13 => "THIRTEEN", -14 => "FOURTEEN", -15 => "FIFTEEN", -16 => "SIXTEEN", -17 => "SEVENTEEN", -18 => "EIGHTEEN", -19 => "NINETEEN", -"014" => "FOURTEEN" -); -$tens = array( -0 => "ZERO", -1 => "TEN", -2 => "TWENTY", -3 => "THIRTY", -4 => "FORTY", -5 => "FIFTY", -6 => "SIXTY", -7 => "SEVENTY", -8 => "EIGHTY", -9 => "NINETY" -); -$hundreds = array( -"HUNDRED", -"THOUSAND", -"MILLION", -"BILLION", -"TRILLION", -"QUARDRILLION" -); /*limit t quadrillion */ -$num = number_format($num,2,".",","); -$num_arr = explode(".",$num); -$wholenum = $num_arr[0]; -$decnum = $num_arr[1]; -$whole_arr = array_reverse(explode(",",$wholenum)); -krsort($whole_arr,1); -$rettxt = ""; -foreach($whole_arr as $key => $i){ - -while(substr($i,0,1)=="0") - $i=substr($i,1,5); -if($i < 20){ -/* echo "getting:".$i; */ -$rettxt .= $ones[$i]; -}elseif($i < 100){ -if(substr($i,0,1)!="0") $rettxt .= $tens[substr($i,0,1)]; -if(substr($i,1,1)!="0") $rettxt .= " ".$ones[substr($i,1,1)]; -}else{ -if(substr($i,0,1)!="0") $rettxt .= $ones[substr($i,0,1)]." ".$hundreds[0]; -if(substr($i,1,1)!="0")$rettxt .= " ".$tens[substr($i,1,1)]; -if(substr($i,2,1)!="0")$rettxt .= " ".$ones[substr($i,2,1)]; -} -if($key > 0){ -$rettxt .= " ".$hundreds[$key]." "; -} -} -if($decnum > 0){ -$rettxt .= " and "; -if($decnum < 20){ -$rettxt .= $ones[$decnum]; -}elseif($decnum < 100){ -$rettxt .= $tens[substr($decnum,0,1)]; -$rettxt .= " ".$ones[substr($decnum,1,1)]; -} -} -return $rettxt; -} -extract($_POST); -if(isset($convert)) -{ -echo "

".numberTowords("$num")."

"; -} -?> - diff --git a/app/Views/welcome_message.php b/app/Views/welcome_message.php deleted file mode 100644 index 1c88df0..0000000 --- a/app/Views/welcome_message.php +++ /dev/null @@ -1,324 +0,0 @@ - - - - - Welcome to CodeIgniter 4! - - - - - - - - - - -
- - - -
- -

Welcome to CodeIgniter Tutorial

- -

The small framework with powerful features

- -
- -
- - - -
- -

About this page

- -

The page you are looking at is being generated dynamically by CodeIgniter.

- -

If you would like to edit this page you will find it located at:

- -
app/Views/welcome_message.php
- -

The corresponding controller for this page can be found at:

- -
app/Controllers/Home.php
- -
- -
- -
- -

Go further

- -

- - Learn -

- -

The User Guide contains an introduction, tutorial, a number of "how to" - guides, and then reference documentation for the components that make up - the framework. Check the User Guide !

- -

- - Discuss -

- -

CodeIgniter is a community-developed open source project, with several - venues for the community members to gather and exchange ideas. View all - the threads on CodeIgniter's forum, or chat on Slack !

- -

- - Contribute -

- -

CodeIgniter is a community driven project and accepts contributions - of code and documentation from the community. Why not - - join us ?

- -
- -
- - - -
-
- -

Page rendered in {elapsed_time} seconds

- -

Environment:

- -
- -
- -

© CodeIgniter Foundation. CodeIgniter is open source project released under the MIT - open source licence.

- -
- -
- - - - - - - - - diff --git a/app/index.html b/app/index.html deleted file mode 100644 index b702fbc..0000000 --- a/app/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - diff --git a/builds b/builds deleted file mode 100644 index 268e7a8..0000000 --- a/builds +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env php - 'vcs', - 'url' => GITHUB_URL, - ]; - } - - // Define the "require" - $array['require']['codeigniter4/codeigniter4'] = 'dev-develop'; - unset($array['require']['codeigniter4/framework']); - } - - // Release - else - { - // Clear 'minimum-stability' - unset($array['minimum-stability']); - - // If the repo is configured then clear it - if (isset($array['repositories'])) - { - // Check for the CodeIgniter repo - foreach ($array['repositories'] as $i => $repository) - { - if ($repository['url'] == GITHUB_URL) - { - unset($array['repositories'][$i]); - break; - } - } - if (empty($array['repositories'])) - { - unset($array['repositories']); - } - } - - // Define the "require" - $array['require']['codeigniter4/framework'] = LATEST_RELEASE; - unset($array['require']['codeigniter4/codeigniter4']); - } - - // Write out a new composer.json - file_put_contents($file, json_encode($array, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES) . PHP_EOL); - $modified[] = $file; - } - else - { - echo 'Warning: Unable to decode composer.json! Skipping...' . PHP_EOL; - } - } - else - { - echo 'Warning: Unable to read composer.json! Skipping...' . PHP_EOL; - } -} - -// Paths config and PHPUnit XMLs -$files = [ - __DIR__ . DIRECTORY_SEPARATOR . 'app/Config/Paths.php', - __DIR__ . DIRECTORY_SEPARATOR . 'phpunit.xml.dist', - __DIR__ . DIRECTORY_SEPARATOR . 'phpunit.xml', -]; - -foreach ($files as $file) -{ - if (is_file($file)) - { - $contents = file_get_contents($file); - - // Development - if ($dev) - { - $contents = str_replace('vendor/codeigniter4/framework', 'vendor/codeigniter4/codeigniter4', $contents); - } - - // Release - else - { - $contents = str_replace('vendor/codeigniter4/codeigniter4', 'vendor/codeigniter4/framework', $contents); - } - - file_put_contents($file, $contents); - $modified[] = $file; - } -} - -if (empty($modified)) -{ - echo 'No files modified' . PHP_EOL; -} -else -{ - echo 'The following files were modified:' . PHP_EOL; - foreach ($modified as $file) - { - echo " * {$file}" . PHP_EOL; - } - echo 'Run `composer update` to sync changes with your vendor folder' . PHP_EOL; -} diff --git a/composer.json b/composer.json deleted file mode 100644 index c6e1466..0000000 --- a/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "codeigniter4/appstarter", - "type": "project", - "description": "CodeIgniter4 starter app", - "homepage": "https://codeigniter.com", - "license": "MIT", - "require": { - "php": ">=7.2", - "codeigniter4/framework": "^4", - "dompdf/dompdf": "^0.8.6", - "phpoffice/phpspreadsheet": "^1.15" - }, - "require-dev": { - "fzaninotto/faker": "^1.9@dev", - "mikey179/vfsstream": "1.6.*", - "phpunit/phpunit": "^8.5" - }, - "autoload-dev": { - "psr-4": { - "Tests\\Support\\": "tests/_support" - } - }, - "scripts": { - "post-update-cmd": [ - "@composer dump-autoload" - ], - "test": "phpunit" - }, - "support": { - "forum": "http://forum.codeigniter.com/", - "source": "https://github.com/codeigniter4/CodeIgniter4", - "slack": "https://codeigniterchat.slack.com" - } -} diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 84ef8ed..0000000 --- a/composer.lock +++ /dev/null @@ -1,2839 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "79e1aa187a9e68d7c58b009b1981db99", - "packages": [ - { - "name": "codeigniter4/framework", - "version": "v4.0.4", - "source": { - "type": "git", - "url": "https://github.com/codeigniter4/framework.git", - "reference": "1edcf84f77ff794640fddbfc59a10a024cd15b50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/framework/zipball/1edcf84f77ff794640fddbfc59a10a024cd15b50", - "reference": "1edcf84f77ff794640fddbfc59a10a024cd15b50", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-intl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "kint-php/kint": "^3.3", - "laminas/laminas-escaper": "^2.6", - "php": ">=7.2", - "psr/log": "^1.1" - }, - "require-dev": { - "codeigniter4/codeigniter4-standard": "^1.0", - "fzaninotto/faker": "^1.9@dev", - "mikey179/vfsstream": "1.6.*", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "squizlabs/php_codesniffer": "^3.3" - }, - "type": "project", - "autoload": { - "psr-4": { - "CodeIgniter\\": "system/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The CodeIgniter framework v4", - "homepage": "https://codeigniter.com", - "time": "2020-07-16T03:44:28+00:00" - }, - { - "name": "dompdf/dompdf", - "version": "v0.8.6", - "source": { - "type": "git", - "url": "https://github.com/dompdf/dompdf.git", - "reference": "db91d81866c69a42dad1d2926f61515a1e3f42c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dompdf/dompdf/zipball/db91d81866c69a42dad1d2926f61515a1e3f42c5", - "reference": "db91d81866c69a42dad1d2926f61515a1e3f42c5", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "phenx/php-font-lib": "^0.5.2", - "phenx/php-svg-lib": "^0.3.3", - "php": "^7.1" - }, - "require-dev": { - "mockery/mockery": "^1.3", - "phpunit/phpunit": "^7.5", - "squizlabs/php_codesniffer": "^3.5" - }, - "suggest": { - "ext-gd": "Needed to process images", - "ext-gmagick": "Improves image processing performance", - "ext-imagick": "Improves image processing performance", - "ext-zlib": "Needed for pdf stream compression" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-develop": "0.7-dev" - } - }, - "autoload": { - "psr-4": { - "Dompdf\\": "src/" - }, - "classmap": [ - "lib/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1" - ], - "authors": [ - { - "name": "Fabien Ménager", - "email": "fabien.menager@gmail.com" - }, - { - "name": "Brian Sweeney", - "email": "eclecticgeek@gmail.com" - }, - { - "name": "Gabriel Bull", - "email": "me@gabrielbull.com" - } - ], - "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", - "homepage": "https://github.com/dompdf/dompdf", - "time": "2020-08-30T22:54:22+00:00" - }, - { - "name": "kint-php/kint", - "version": "3.3", - "source": { - "type": "git", - "url": "https://github.com/kint-php/kint.git", - "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kint-php/kint/zipball/335ac1bcaf04d87df70d8aa51e8887ba2c6d203b", - "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b", - "shasum": "" - }, - "require": { - "php": ">=5.3.6" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "phpunit/phpunit": "^4.0", - "seld/phar-utils": "^1.0", - "symfony/finder": "^2.0 || ^3.0 || ^4.0", - "vimeo/psalm": "^3.0" - }, - "suggest": { - "ext-ctype": "Simple data type tests", - "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages", - "ext-mbstring": "Provides string encoding detection", - "kint-php/kint-js": "Provides a simplified dump to console.log()", - "kint-php/kint-twig": "Provides d() and s() functions in twig templates", - "symfony/polyfill-ctype": "Replacement for ext-ctype if missing", - "symfony/polyfill-iconv": "Replacement for ext-iconv if missing", - "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing" - }, - "type": "library", - "autoload": { - "files": [ - "init.php" - ], - "psr-4": { - "Kint\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Vollebregt", - "homepage": "https://github.com/jnvsor" - }, - { - "name": "Rokas Šleinius", - "homepage": "https://github.com/raveren" - }, - { - "name": "Contributors", - "homepage": "https://github.com/kint-php/kint/graphs/contributors" - } - ], - "description": "Kint - debugging tool for PHP developers", - "homepage": "https://kint-php.github.io/kint/", - "keywords": [ - "debug", - "kint", - "php" - ], - "time": "2019-10-17T18:05:24+00:00" - }, - { - "name": "laminas/laminas-escaper", - "version": "2.6.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-escaper.git", - "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/25f2a053eadfa92ddacb609dcbbc39362610da70", - "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70", - "shasum": "" - }, - "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^5.6 || ^7.0" - }, - "replace": { - "zendframework/zend-escaper": "self.version" - }, - "require-dev": { - "laminas/laminas-coding-standard": "~1.0.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev", - "dev-develop": "2.7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laminas\\Escaper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", - "homepage": "https://laminas.dev", - "keywords": [ - "escaper", - "laminas" - ], - "time": "2019-12-31T16:43:30+00:00" - }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2020-09-14T14:23:00+00:00" - }, - { - "name": "maennchen/zipstream-php", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", - "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", - "shasum": "" - }, - "require": { - "myclabs/php-enum": "^1.5", - "php": ">= 7.1", - "psr/http-message": "^1.0", - "symfony/polyfill-mbstring": "^1.0" - }, - "require-dev": { - "ext-zip": "*", - "guzzlehttp/guzzle": ">= 6.3", - "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": ">= 7.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "ZipStream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paul Duncan", - "email": "pabs@pablotron.org" - }, - { - "name": "Jonatan Männchen", - "email": "jonatan@maennchen.ch" - }, - { - "name": "Jesse Donat", - "email": "donatj@gmail.com" - }, - { - "name": "AndrÔs KolesÔr", - "email": "kolesar@kolesar.hu" - } - ], - "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", - "keywords": [ - "stream", - "zip" - ], - "support": { - "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/master" - }, - "funding": [ - { - "url": "https://opencollective.com/zipstream", - "type": "open_collective" - } - ], - "time": "2020-05-30T13:11:16+00:00" - }, - { - "name": "markbaker/complex", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPComplex.git", - "reference": "9999f1432fae467bc93c53f357105b4c31bb994c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/9999f1432fae467bc93c53f357105b4c31bb994c", - "reference": "9999f1432fae467bc93c53f357105b4c31bb994c", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", - "phpdocumentor/phpdocumentor": "2.*", - "phploc/phploc": "^4.0", - "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", - "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Complex\\": "classes/src/" - }, - "files": [ - "classes/src/functions/abs.php", - "classes/src/functions/acos.php", - "classes/src/functions/acosh.php", - "classes/src/functions/acot.php", - "classes/src/functions/acoth.php", - "classes/src/functions/acsc.php", - "classes/src/functions/acsch.php", - "classes/src/functions/argument.php", - "classes/src/functions/asec.php", - "classes/src/functions/asech.php", - "classes/src/functions/asin.php", - "classes/src/functions/asinh.php", - "classes/src/functions/atan.php", - "classes/src/functions/atanh.php", - "classes/src/functions/conjugate.php", - "classes/src/functions/cos.php", - "classes/src/functions/cosh.php", - "classes/src/functions/cot.php", - "classes/src/functions/coth.php", - "classes/src/functions/csc.php", - "classes/src/functions/csch.php", - "classes/src/functions/exp.php", - "classes/src/functions/inverse.php", - "classes/src/functions/ln.php", - "classes/src/functions/log2.php", - "classes/src/functions/log10.php", - "classes/src/functions/negative.php", - "classes/src/functions/pow.php", - "classes/src/functions/rho.php", - "classes/src/functions/sec.php", - "classes/src/functions/sech.php", - "classes/src/functions/sin.php", - "classes/src/functions/sinh.php", - "classes/src/functions/sqrt.php", - "classes/src/functions/tan.php", - "classes/src/functions/tanh.php", - "classes/src/functions/theta.php", - "classes/src/operations/add.php", - "classes/src/operations/subtract.php", - "classes/src/operations/multiply.php", - "classes/src/operations/divideby.php", - "classes/src/operations/divideinto.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@lange.demon.co.uk" - } - ], - "description": "PHP Class for working with complex numbers", - "homepage": "https://github.com/MarkBaker/PHPComplex", - "keywords": [ - "complex", - "mathematics" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPComplex/issues", - "source": "https://github.com/MarkBaker/PHPComplex/tree/PHP8" - }, - "time": "2020-08-26T10:42:07+00:00" - }, - { - "name": "markbaker/matrix", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPMatrix.git", - "reference": "9567d9c4c519fbe40de01dbd1e4469dbbb66f46a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/9567d9c4c519fbe40de01dbd1e4469dbbb66f46a", - "reference": "9567d9c4c519fbe40de01dbd1e4469dbbb66f46a", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", - "phpdocumentor/phpdocumentor": "2.*", - "phploc/phploc": "^4.0", - "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", - "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Matrix\\": "classes/src/" - }, - "files": [ - "classes/src/functions/adjoint.php", - "classes/src/functions/antidiagonal.php", - "classes/src/functions/cofactors.php", - "classes/src/functions/determinant.php", - "classes/src/functions/diagonal.php", - "classes/src/functions/identity.php", - "classes/src/functions/inverse.php", - "classes/src/functions/minors.php", - "classes/src/functions/trace.php", - "classes/src/functions/transpose.php", - "classes/src/operations/add.php", - "classes/src/operations/directsum.php", - "classes/src/operations/subtract.php", - "classes/src/operations/multiply.php", - "classes/src/operations/divideby.php", - "classes/src/operations/divideinto.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@demon-angel.eu" - } - ], - "description": "PHP Class for working with matrices", - "homepage": "https://github.com/MarkBaker/PHPMatrix", - "keywords": [ - "mathematics", - "matrix", - "vector" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPMatrix/issues", - "source": "https://github.com/MarkBaker/PHPMatrix/tree/PHP8" - }, - "time": "2020-08-28T17:11:00+00:00" - }, - { - "name": "myclabs/php-enum", - "version": "1.7.7", - "source": { - "type": "git", - "url": "https://github.com/myclabs/php-enum.git", - "reference": "d178027d1e679832db9f38248fcc7200647dc2b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/d178027d1e679832db9f38248fcc7200647dc2b7", - "reference": "d178027d1e679832db9f38248fcc7200647dc2b7", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7", - "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^3.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "MyCLabs\\Enum\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP Enum contributors", - "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" - } - ], - "description": "PHP Enum implementation", - "homepage": "http://github.com/myclabs/php-enum", - "keywords": [ - "enum" - ], - "support": { - "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.7.7" - }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", - "type": "tidelift" - } - ], - "time": "2020-11-14T18:14:52+00:00" - }, - { - "name": "phenx/php-font-lib", - "version": "0.5.2", - "source": { - "type": "git", - "url": "https://github.com/PhenX/php-font-lib.git", - "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8", - "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8", - "shasum": "" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7" - }, - "type": "library", - "autoload": { - "psr-4": { - "FontLib\\": "src/FontLib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "authors": [ - { - "name": "Fabien Ménager", - "email": "fabien.menager@gmail.com" - } - ], - "description": "A library to read, parse, export and make subsets of different types of font files.", - "homepage": "https://github.com/PhenX/php-font-lib", - "time": "2020-03-08T15:31:32+00:00" - }, - { - "name": "phenx/php-svg-lib", - "version": "v0.3.3", - "source": { - "type": "git", - "url": "https://github.com/PhenX/php-svg-lib.git", - "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/5fa61b65e612ce1ae15f69b3d223cb14ecc60e32", - "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32", - "shasum": "" - }, - "require": { - "sabberworm/php-css-parser": "^8.3" - }, - "require-dev": { - "phpunit/phpunit": "^5.5|^6.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Svg\\": "src/Svg" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "authors": [ - { - "name": "Fabien Ménager", - "email": "fabien.menager@gmail.com" - } - ], - "description": "A library to read, parse and export to PDF SVG files.", - "homepage": "https://github.com/PhenX/php-svg-lib", - "time": "2019-09-11T20:02:13+00:00" - }, - { - "name": "phpoffice/phpspreadsheet", - "version": "1.15.0", - "source": { - "type": "git", - "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "a8e8068b31b8119e1daa5b1eb5715a3a8ea8305f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a8e8068b31b8119e1daa5b1eb5715a3a8ea8305f", - "reference": "a8e8068b31b8119e1daa5b1eb5715a3a8ea8305f", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-dom": "*", - "ext-fileinfo": "*", - "ext-gd": "*", - "ext-iconv": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-xml": "*", - "ext-xmlreader": "*", - "ext-xmlwriter": "*", - "ext-zip": "*", - "ext-zlib": "*", - "maennchen/zipstream-php": "^2.1", - "markbaker/complex": "^1.5|^2.0", - "markbaker/matrix": "^1.2|^2.0", - "php": "^7.2|^8.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/simple-cache": "^1.0" - }, - "require-dev": { - "dompdf/dompdf": "^0.8.5", - "friendsofphp/php-cs-fixer": "^2.16", - "jpgraph/jpgraph": "^4.0", - "mpdf/mpdf": "^8.0", - "phpcompatibility/php-compatibility": "^9.3", - "phpunit/phpunit": "^8.5|^9.3", - "squizlabs/php_codesniffer": "^3.5", - "tecnickcom/tcpdf": "^6.3" - }, - "suggest": { - "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", - "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", - "mpdf/mpdf": "Option for rendering PDF with PDF Writer", - "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)" - }, - "type": "library", - "autoload": { - "psr-4": { - "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Maarten Balliauw", - "homepage": "https://blog.maartenballiauw.be" - }, - { - "name": "Mark Baker", - "homepage": "https://markbakeruk.net" - }, - { - "name": "Franck Lefevre", - "homepage": "https://rootslabs.net" - }, - { - "name": "Erik Tilt" - }, - { - "name": "Adrien Crivelli" - } - ], - "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", - "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", - "keywords": [ - "OpenXML", - "excel", - "gnumeric", - "ods", - "php", - "spreadsheet", - "xls", - "xlsx" - ], - "support": { - "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.15.0" - }, - "time": "2020-10-11T13:20:59+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client/tree/master" - }, - "time": "2020-06-29T06:28:15+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "shasum": "" - }, - "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" - }, - "time": "2019-04-30T12:38:16+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2020-03-23T09:12:05+00:00" - }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" - }, - "time": "2017-10-23T01:57:42+00:00" - }, - { - "name": "sabberworm/php-css-parser", - "version": "8.3.1", - "source": { - "type": "git", - "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", - "reference": "d217848e1396ef962fb1997cf3e2421acba7f796" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796", - "reference": "d217848e1396ef962fb1997cf3e2421acba7f796", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "codacy/coverage": "^1.4", - "phpunit/phpunit": "~4.8" - }, - "type": "library", - "autoload": { - "psr-0": { - "Sabberworm\\CSS": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Raphael Schweikert" - } - ], - "description": "Parser for CSS Files written in PHP", - "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser", - "keywords": [ - "css", - "parser", - "stylesheet" - ], - "time": "2020-06-01T09:10:00+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T14:02:19+00:00" - } - ], - "packages-dev": [ - { - "name": "doctrine/instantiator", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2020-05-29T17:27:14+00:00" - }, - { - "name": "fzaninotto/faker", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/fzaninotto/Faker.git", - "reference": "ac73e5287024f5e98dd6d0bf10e6a6f7877b7513" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/ac73e5287024f5e98dd6d0bf10e6a6f7877b7513", - "reference": "ac73e5287024f5e98dd6d0bf10e6a6f7877b7513", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "ext-intl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7", - "squizlabs/php_codesniffer": "^2.9.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "abandoned": true, - "time": "2020-10-27T14:15:58+00:00" - }, - { - "name": "mikey179/vfsstream", - "version": "v1.6.8", - "source": { - "type": "git", - "url": "https://github.com/bovigo/vfsStream.git", - "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe", - "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5|^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-0": { - "org\\bovigo\\vfs\\": "src/main/php" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Frank Kleine", - "homepage": "http://frankkleine.de/", - "role": "Developer" - } - ], - "description": "Virtual file system to mock the real file system in unit tests.", - "homepage": "http://vfs.bovigo.org/", - "time": "2019-10-30T15:31:00+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.10.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2020-06-29T13:22:24+00:00" - }, - { - "name": "phar-io/manifest", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2018-07-08T19:23:20+00:00" - }, - { - "name": "phar-io/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2018-07-08T19:19:57+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-09-03T19:13:55+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2020-09-17T18:55:26+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "1.12.1", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0 <9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2020-09-29T09:10:42+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "7.0.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", - "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.1", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" - }, - "require-dev": { - "phpunit/phpunit": "^8.2.2" - }, - "suggest": { - "ext-xdebug": "^2.7.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2019-11-20T13:55:58+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2018-09-13T20:33:42+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "2.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2019-06-07T04:22:29+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "abandoned": true, - "time": "2019-09-17T06:23:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "8.5.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997", - "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2.0", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.9.1", - "phar-io/manifest": "^1.0.3", - "phar-io/version": "^2.0.1", - "php": "^7.2", - "phpspec/prophecy": "^1.8.1", - "phpunit/php-code-coverage": "^7.0.7", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.2", - "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.2", - "sebastian/exporter": "^3.1.1", - "sebastian/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0.0" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "8.5-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "funding": [ - { - "url": "https://phpunit.de/donate.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-06-22T07:06:58+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" - }, - { - "name": "sebastian/comparator", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "shasum": "" - }, - "require": { - "php": "^7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2018-07-12T15:12:46+00:00" - }, - { - "name": "sebastian/diff", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "time": "2019-02-04T06:01:07+00:00" - }, - { - "name": "sebastian/environment", - "version": "4.2.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2019-11-20T08:46:58+00:00" - }, - { - "name": "sebastian/exporter", - "version": "3.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2019-09-14T09:02:43+00:00" - }, - { - "name": "sebastian/global-state", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", - "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", - "shasum": "" - }, - "require": { - "php": "^7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^8.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2019-02-01T05:30:01+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" - }, - { - "name": "sebastian/type", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", - "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", - "shasum": "" - }, - "require": { - "php": "^7.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "time": "2019-07-02T08:10:15+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.18.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-07-14T12:35:20+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2020-07-12T23:59:07+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.9.1", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" - }, - "type": "library", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2020-07-08T17:02:28+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": { - "fzaninotto/faker": 20 - }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=7.2" - }, - "platform-dev": [], - "plugin-api-version": "2.0.0" -} diff --git a/env b/env deleted file mode 100644 index 9b8720f..0000000 --- a/env +++ /dev/null @@ -1,101 +0,0 @@ -#-------------------------------------------------------------------- -# Example Environment Configuration file -# -# This file can be used as a starting point for your own -# custom .env files, and contains most of the possible settings -# available in a default install. -# -# By default, all of the settings are commented out. If you want -# to override the setting, you must un-comment it by removing the '#' -# at the beginning of the line. -#-------------------------------------------------------------------- - -#-------------------------------------------------------------------- -# ENVIRONMENT -#-------------------------------------------------------------------- - -#CI_ENVIRONMENT = production - -#-------------------------------------------------------------------- -# APP -#-------------------------------------------------------------------- - -#app.baseURL = '' -# app.forceGlobalSecureRequests = false - -# app.sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler' -# app.sessionCookieName = 'ci_session' -# app.sessionSavePath = NULL -# app.sessionMatchIP = false -# app.sessionTimeToUpdate = 300 -# app.sessionRegenerateDestroy = false - -# app.cookiePrefix = '' -# app.cookieDomain = '' -# app.cookiePath = '/' -# app.cookieSecure = false -# app.cookieHTTPOnly = false - -# app.CSRFProtection = false -# app.CSRFTokenName = 'csrf_test_name' -# app.CSRFCookieName = 'csrf_cookie_name' -# app.CSRFExpire = 7200 -# app.CSRFRegenerate = true -# app.CSRFExcludeURIs = [] - -# app.CSPEnabled = false - -#-------------------------------------------------------------------- -# DATABASE -#-------------------------------------------------------------------- - -# database.default.hostname = localhost -# database.default.database = ci4 -# database.default.username = root -# database.default.password = root -# database.default.DBDriver = MySQLi - -# database.tests.hostname = localhost -# database.tests.database = ci4 -# database.tests.username = root -# database.tests.password = root -# database.tests.DBDriver = MySQLi - -#-------------------------------------------------------------------- -# CONTENT SECURITY POLICY -#-------------------------------------------------------------------- - -# contentsecuritypolicy.reportOnly = false -# contentsecuritypolicy.defaultSrc = 'none' -# contentsecuritypolicy.scriptSrc = 'self' -# contentsecuritypolicy.styleSrc = 'self' -# contentsecuritypolicy.imageSrc = 'self' -# contentsecuritypolicy.base_uri = null -# contentsecuritypolicy.childSrc = null -# contentsecuritypolicy.connectSrc = 'self' -# contentsecuritypolicy.fontSrc = null -# contentsecuritypolicy.formAction = null -# contentsecuritypolicy.frameAncestors = null -# contentsecuritypolicy.mediaSrc = null -# contentsecuritypolicy.objectSrc = null -# contentsecuritypolicy.pluginTypes = null -# contentsecuritypolicy.reportURI = null -# contentsecuritypolicy.sandbox = false -# contentsecuritypolicy.upgradeInsecureRequests = false - -#-------------------------------------------------------------------- -# ENCRYPTION -#-------------------------------------------------------------------- - -# encryption.key = -# encryption.driver = OpenSSL - -#-------------------------------------------------------------------- -# HONEYPOT -#-------------------------------------------------------------------- - -# honeypot.hidden = 'true' -# honeypot.label = 'Fill This Field' -# honeypot.name = 'honeypot' -# honeypot.template = '' -# honeypot.container = '
{template}
' diff --git a/index.php b/index.php deleted file mode 100644 index 9f9b05b..0000000 --- a/index.php +++ /dev/null @@ -1,45 +0,0 @@ -systemDirectory, '/ ') . '/bootstrap.php'; - -/* - *--------------------------------------------------------------- - * LAUNCH THE APPLICATION - *--------------------------------------------------------------- - * Now that everything is setup, it's time to actually fire - * up the engines and make this app do its thang. - */ -$app->run(); diff --git a/license.txt b/license.txt deleted file mode 100644 index 2fb1bdd..0000000 --- a/license.txt +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2019 British Columbia Institute of Technology -Copyright (c) 2019-2020 CodeIgniter Foundation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/phpunit.xml.dist b/phpunit.xml.dist deleted file mode 100644 index 96947df..0000000 --- a/phpunit.xml.dist +++ /dev/null @@ -1,60 +0,0 @@ - - - - - ./tests - - - - - - ./app - - ./app/Views - ./app/Config/Routes.php - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/.htaccess b/public/.htaccess deleted file mode 100644 index 02026a3..0000000 --- a/public/.htaccess +++ /dev/null @@ -1,48 +0,0 @@ -# Disable directory browsing -Options All -Indexes - -# ---------------------------------------------------------------------- -# Rewrite engine -# ---------------------------------------------------------------------- - -# Turning on the rewrite engine is necessary for the following rules and features. -# FollowSymLinks must be enabled for this to work. - - Options +FollowSymlinks - RewriteEngine On - - # If you installed CodeIgniter in a subfolder, you will need to - # change the following line to match the subfolder you need. - # http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase - # RewriteBase / - - # Redirect Trailing Slashes... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.*)/$ /$1 [L,R=301] - - # Rewrite "www.example.com -> example.com" - RewriteCond %{HTTPS} !=on - RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] - RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L] - - # Checks to see if the user is attempting to access a valid file, - # such as an image or css document, if this isn't true it sends the - # request to the front controller, index.php - RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^([\s\S]*)$ index.php/$1 [L,NC,QSA] - - # Ensure Authorization header is passed along - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - - - # If we don't have mod_rewrite installed, all 404's - # can be sent to index.php, and everything works as normal. - ErrorDocument 404 index.php - - -# Disable server signature start - ServerSignature Off -# Disable server signature end diff --git a/public/assets/css/bootstrap.min.css b/public/assets/css/bootstrap.min.css deleted file mode 100644 index 7328418..0000000 --- a/public/assets/css/bootstrap.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v4.0.0-beta (https://getbootstrap.com) - * Copyright 2011-2017 The Bootstrap Authors - * Copyright 2011-2017 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}html{box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{box-sizing:inherit}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#868e96}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#868e96}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f8f9fa;border-radius:.25rem}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#212529}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #e9ecef}.table thead th{vertical-align:bottom;border-bottom:2px solid #e9ecef}.table tbody+tbody{border-top:2px solid #e9ecef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #e9ecef}.table-bordered td,.table-bordered th{border:1px solid #e9ecef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#dddfe2}.table-hover .table-secondary:hover{background-color:#cfd2d6}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#cfd2d6}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.thead-inverse th{color:#fff;background-color:#212529}.thead-default th{color:#495057;background-color:#e9ecef}.table-inverse{color:#fff;background-color:#212529}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#32383e}.table-inverse.table-bordered{border:0}.table-inverse.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-inverse.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:991px){.table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#495057;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0}.form-control::-webkit-input-placeholder{color:#868e96;opacity:1}.form-control:-ms-input-placeholder{color:#868e96;opacity:1}.form-control::placeholder{color:#868e96;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);margin-bottom:0}.col-form-label-lg{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem - 1px * 2);padding-bottom:calc(.25rem - 1px * 2);font-size:.875rem}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1rem}.form-control-plaintext{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.form-control-plaintext.input-group-addon,.input-group-lg>.input-group-btn>.form-control-plaintext.btn,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.form-control-plaintext.input-group-addon,.input-group-sm>.input-group-btn>.form-control-plaintext.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.3125rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;margin-bottom:.5rem}.form-check.disabled .form-check-label{color:#868e96}.form-check-label{padding-left:1.25rem;margin-bottom:0}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-input:only-child{position:static}.form-check-inline{display:inline-block}.form-check-inline .form-check-label{vertical-align:middle}.form-check-inline+.form-check-inline{margin-left:.75rem}.invalid-feedback{display:none;margin-top:.25rem;font-size:.875rem;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;width:250px;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.invalid-feedback,.custom-select.is-valid~.invalid-tooltip,.form-control.is-valid~.invalid-feedback,.form-control.is-valid~.invalid-tooltip,.was-validated .custom-select:valid~.invalid-feedback,.was-validated .custom-select:valid~.invalid-tooltip,.was-validated .form-control:valid~.invalid-feedback,.was-validated .form-control:valid~.invalid-tooltip{display:block}.form-check-input.is-valid+.form-check-label,.was-validated .form-check-input:valid+.form-check-label{color:#28a745}.custom-control-input.is-valid~.custom-control-indicator,.was-validated .custom-control-input:valid~.custom-control-indicator{background-color:rgba(40,167,69,.25)}.custom-control-input.is-valid~.custom-control-description,.was-validated .custom-control-input:valid~.custom-control-description{color:#28a745}.custom-file-input.is-valid~.custom-file-control,.was-validated .custom-file-input:valid~.custom-file-control{border-color:#28a745}.custom-file-input.is-valid~.custom-file-control::before,.was-validated .custom-file-input:valid~.custom-file-control::before{border-color:inherit}.custom-file-input.is-valid:focus,.was-validated .custom-file-input:valid:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid+.form-check-label,.was-validated .form-check-input:invalid+.form-check-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-indicator,.was-validated .custom-control-input:invalid~.custom-control-indicator{background-color:rgba(220,53,69,.25)}.custom-control-input.is-invalid~.custom-control-description,.was-validated .custom-control-input:invalid~.custom-control-description{color:#dc3545}.custom-file-input.is-invalid~.custom-file-control,.was-validated .custom-file-input:invalid~.custom-file-control{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-control::before,.was-validated .custom-file-input:invalid~.custom-file-control::before{border-color:inherit}.custom-file-input.is-invalid:focus,.was-validated .custom-file-input:invalid:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem .75rem;font-size:1rem;line-height:1.25;border-radius:.25rem;transition:all .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 3px rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn.active,.btn:active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 3px rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#007bff;border-color:#007bff}.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{background-color:#0069d9;background-image:none;border-color:#0062cc}.btn-secondary{color:#fff;background-color:#868e96;border-color:#868e96}.btn-secondary:hover{color:#fff;background-color:#727b84;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 3px rgba(134,142,150,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#868e96;border-color:#868e96}.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{background-color:#727b84;background-image:none;border-color:#6c757d}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 3px rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#28a745;border-color:#28a745}.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{background-color:#218838;background-image:none;border-color:#1e7e34}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 3px rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#17a2b8;border-color:#17a2b8}.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{background-color:#138496;background-image:none;border-color:#117a8b}.btn-warning{color:#111;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#111;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 3px rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#ffc107;border-color:#ffc107}.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{background-color:#e0a800;background-image:none;border-color:#d39e00}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 3px rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#dc3545;border-color:#dc3545}.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{background-color:#c82333;background-image:none;border-color:#bd2130}.btn-light{color:#111;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#111;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 3px rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{background-color:#e2e6ea;background-image:none;border-color:#dae0e5}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 3px rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#343a40;border-color:#343a40}.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{background-color:#23272b;background-image:none;border-color:#1d2124}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 3px rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary.active,.btn-outline-primary:active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-secondary{color:#868e96;background-color:transparent;background-image:none;border-color:#868e96}.btn-outline-secondary:hover{color:#fff;background-color:#868e96;border-color:#868e96}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 3px rgba(134,142,150,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#868e96;background-color:transparent}.btn-outline-secondary.active,.btn-outline-secondary:active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#868e96;border-color:#868e96}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 3px rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success.active,.btn-outline-success:active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 3px rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info.active,.btn-outline-info:active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#fff;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 3px rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning.active,.btn-outline-warning:active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#ffc107;border-color:#ffc107}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 3px rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger.active,.btn-outline-danger:active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#fff;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 3px rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light.active,.btn-outline-light:active,.show>.btn-outline-light.dropdown-toggle{color:#fff;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 3px rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark.active,.btn-outline-dark:active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-link{font-weight:400;color:#007bff;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent;box-shadow:none}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent}.btn-link:disabled{color:#868e96}.btn-link:disabled:focus,.btn-link:disabled:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#868e96;background-color:transparent}.show>a{outline:0}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#868e96;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;margin-bottom:0}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn+.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;width:100%}.input-group .form-control{position:relative;z-index:2;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#495057;text-align:center;background-color:#e9ecef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-indicator{box-shadow:0 0 0 1px #fff,0 0 0 3px #007bff}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-indicator{background-color:#e9ecef}.custom-control-input:disabled~.custom-control-description{color:#868e96}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#007bff;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.25;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;margin-bottom:0}.custom-file-input{min-width:14rem;max-width:100%;height:2.5rem;margin:0;opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#495057;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.custom-file-control:lang(en):empty::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#495057;background-color:#e9ecef;border:1px solid rgba(0,0,0,.15);border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#868e96}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #ddd}.nav-tabs .nav-link.disabled{color:#868e96;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.show>.nav-pills .nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-left:15px}}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-ms-flex:1 0 0%;flex:1 0 0%}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb::after{display:block;clear:both;content:""}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#868e96;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#868e96}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#868e96;pointer-events:none;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#868e96}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#6c757d}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#111;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#111;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#111;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#111;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:relative;top:-.75rem;right:-1.25rem;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#464a4e;background-color:#e7e8ea;border-color:#dddfe2}.alert-secondary hr{border-top-color:#cfd2d6}.alert-secondary .alert-link{color:#2e3133}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;overflow:hidden;font-size:.75rem;line-height:1rem;text-align:center;background-color:#e9ecef;border-radius:.25rem}.progress-bar{height:1rem;line-height:1rem;color:#fff;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#868e96;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}a.list-group-item-primary,button.list-group-item-primary{color:#004085}a.list-group-item-primary:focus,a.list-group-item-primary:hover,button.list-group-item-primary:focus,button.list-group-item-primary:hover{color:#004085;background-color:#9fcdff}a.list-group-item-primary.active,button.list-group-item-primary.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#464a4e;background-color:#dddfe2}a.list-group-item-secondary,button.list-group-item-secondary{color:#464a4e}a.list-group-item-secondary:focus,a.list-group-item-secondary:hover,button.list-group-item-secondary:focus,button.list-group-item-secondary:hover{color:#464a4e;background-color:#cfd2d6}a.list-group-item-secondary.active,button.list-group-item-secondary.active{color:#fff;background-color:#464a4e;border-color:#464a4e}.list-group-item-success{color:#155724;background-color:#c3e6cb}a.list-group-item-success,button.list-group-item-success{color:#155724}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#155724;background-color:#b1dfbb}a.list-group-item-success.active,button.list-group-item-success.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}a.list-group-item-info,button.list-group-item-info{color:#0c5460}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#0c5460;background-color:#abdde5}a.list-group-item-info.active,button.list-group-item-info.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}a.list-group-item-warning,button.list-group-item-warning{color:#856404}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#856404;background-color:#ffe8a1}a.list-group-item-warning.active,button.list-group-item-warning.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}a.list-group-item-danger,button.list-group-item-danger{color:#721c24}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#721c24;background-color:#f1b0b7}a.list-group-item-danger.active,button.list-group-item-danger.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}a.list-group-item-light,button.list-group-item-light{color:#818182}a.list-group-item-light:focus,a.list-group-item-light:hover,button.list-group-item-light:focus,button.list-group-item-light:hover{color:#818182;background-color:#ececf6}a.list-group-item-light.active,button.list-group-item-light.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}a.list-group-item-dark,button.list-group-item-dark{color:#1b1e21}a.list-group-item-dark:focus,a.list-group-item-dark:hover,button.list-group-item-dark:focus,button.list-group-item-dark:hover{color:#1b1e21;background-color:#b9bbbe}a.list-group-item-dark.active,button.list-group-item-dark.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #e9ecef}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:5px;height:5px}.tooltip.bs-tooltip-auto[x-placement^=top],.tooltip.bs-tooltip-top{padding:5px 0}.tooltip.bs-tooltip-auto[x-placement^=top] .arrow,.tooltip.bs-tooltip-top .arrow{bottom:0}.tooltip.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.bs-tooltip-top .arrow::before{margin-left:-3px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tooltip-auto[x-placement^=right],.tooltip.bs-tooltip-right{padding:0 5px}.tooltip.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.bs-tooltip-right .arrow{left:0}.tooltip.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.bs-tooltip-right .arrow::before{margin-top:-3px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tooltip-auto[x-placement^=bottom],.tooltip.bs-tooltip-bottom{padding:5px 0}.tooltip.bs-tooltip-auto[x-placement^=bottom] .arrow,.tooltip.bs-tooltip-bottom .arrow{top:0}.tooltip.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.bs-tooltip-bottom .arrow::before{margin-left:-3px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tooltip-auto[x-placement^=left],.tooltip.bs-tooltip-left{padding:0 5px}.tooltip.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.bs-tooltip-left .arrow{right:0}.tooltip.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.bs-tooltip-left .arrow::before{right:0;margin-top:-3px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip .arrow::before{position:absolute;border-color:transparent;border-style:solid}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:10px;height:5px}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;border-color:transparent;border-style:solid}.popover .arrow::before{content:"";border-width:11px}.popover .arrow::after{content:"";border-width:11px}.popover.bs-popover-auto[x-placement^=top],.popover.bs-popover-top{margin-bottom:10px}.popover.bs-popover-auto[x-placement^=top] .arrow,.popover.bs-popover-top .arrow{bottom:0}.popover.bs-popover-auto[x-placement^=top] .arrow::after,.popover.bs-popover-auto[x-placement^=top] .arrow::before,.popover.bs-popover-top .arrow::after,.popover.bs-popover-top .arrow::before{border-bottom-width:0}.popover.bs-popover-auto[x-placement^=top] .arrow::before,.popover.bs-popover-top .arrow::before{bottom:-11px;margin-left:-6px;border-top-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=top] .arrow::after,.popover.bs-popover-top .arrow::after{bottom:-10px;margin-left:-6px;border-top-color:#fff}.popover.bs-popover-auto[x-placement^=right],.popover.bs-popover-right{margin-left:10px}.popover.bs-popover-auto[x-placement^=right] .arrow,.popover.bs-popover-right .arrow{left:0}.popover.bs-popover-auto[x-placement^=right] .arrow::after,.popover.bs-popover-auto[x-placement^=right] .arrow::before,.popover.bs-popover-right .arrow::after,.popover.bs-popover-right .arrow::before{margin-top:-8px;border-left-width:0}.popover.bs-popover-auto[x-placement^=right] .arrow::before,.popover.bs-popover-right .arrow::before{left:-11px;border-right-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=right] .arrow::after,.popover.bs-popover-right .arrow::after{left:-10px;border-right-color:#fff}.popover.bs-popover-auto[x-placement^=bottom],.popover.bs-popover-bottom{margin-top:10px}.popover.bs-popover-auto[x-placement^=bottom] .arrow,.popover.bs-popover-bottom .arrow{top:0}.popover.bs-popover-auto[x-placement^=bottom] .arrow::after,.popover.bs-popover-auto[x-placement^=bottom] .arrow::before,.popover.bs-popover-bottom .arrow::after,.popover.bs-popover-bottom .arrow::before{margin-left:-7px;border-top-width:0}.popover.bs-popover-auto[x-placement^=bottom] .arrow::before,.popover.bs-popover-bottom .arrow::before{top:-11px;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=bottom] .arrow::after,.popover.bs-popover-bottom .arrow::after{top:-10px;border-bottom-color:#fff}.popover.bs-popover-auto[x-placement^=bottom] .popover-header::before,.popover.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-popover-auto[x-placement^=left],.popover.bs-popover-left{margin-right:10px}.popover.bs-popover-auto[x-placement^=left] .arrow,.popover.bs-popover-left .arrow{right:0}.popover.bs-popover-auto[x-placement^=left] .arrow::after,.popover.bs-popover-auto[x-placement^=left] .arrow::before,.popover.bs-popover-left .arrow::after,.popover.bs-popover-left .arrow::before{margin-top:-8px;border-right-width:0}.popover.bs-popover-auto[x-placement^=left] .arrow::before,.popover.bs-popover-left .arrow::before{right:-11px;border-left-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=left] .arrow::after,.popover.bs-popover-left .arrow::after{right:-10px;border-left-color:#fff}.popover-header{padding:8px 14px;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:9px 14px;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#868e96!important}a.bg-secondary:focus,a.bg-secondary:hover{background-color:#6c757d!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #e9ecef!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#868e96!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%}.rounded-0{border-radius:0}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.d-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}}@media print{.d-print-none{display:none!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:1rem!important}.mt-3{margin-top:1rem!important}.mr-3{margin-right:1rem!important}.mb-3{margin-bottom:1rem!important}.ml-3{margin-left:1rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-4{margin:1.5rem!important}.mt-4{margin-top:1.5rem!important}.mr-4{margin-right:1.5rem!important}.mb-4{margin-bottom:1.5rem!important}.ml-4{margin-left:1.5rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-5{margin:3rem!important}.mt-5{margin-top:3rem!important}.mr-5{margin-right:3rem!important}.mb-5{margin-bottom:3rem!important}.ml-5{margin-left:3rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:1rem!important}.pt-3{padding-top:1rem!important}.pr-3{padding-right:1rem!important}.pb-3{padding-bottom:1rem!important}.pl-3{padding-left:1rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-4{padding:1.5rem!important}.pt-4{padding-top:1.5rem!important}.pr-4{padding-right:1.5rem!important}.pb-4{padding-bottom:1.5rem!important}.pl-4{padding-left:1.5rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-5{padding:3rem!important}.pt-5{padding-top:3rem!important}.pr-5{padding-right:3rem!important}.pb-5{padding-bottom:3rem!important}.pl-5{padding-left:3rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1{margin-top:.25rem!important}.mr-sm-1{margin-right:.25rem!important}.mb-sm-1{margin-bottom:.25rem!important}.ml-sm-1{margin-left:.25rem!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2{margin-top:.5rem!important}.mr-sm-2{margin-right:.5rem!important}.mb-sm-2{margin-bottom:.5rem!important}.ml-sm-2{margin-left:.5rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3{margin-top:1rem!important}.mr-sm-3{margin-right:1rem!important}.mb-sm-3{margin-bottom:1rem!important}.ml-sm-3{margin-left:1rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4{margin-top:1.5rem!important}.mr-sm-4{margin-right:1.5rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.ml-sm-4{margin-left:1.5rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5{margin-top:3rem!important}.mr-sm-5{margin-right:3rem!important}.mb-sm-5{margin-bottom:3rem!important}.ml-sm-5{margin-left:3rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1{padding-top:.25rem!important}.pr-sm-1{padding-right:.25rem!important}.pb-sm-1{padding-bottom:.25rem!important}.pl-sm-1{padding-left:.25rem!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2{padding-top:.5rem!important}.pr-sm-2{padding-right:.5rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pl-sm-2{padding-left:.5rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3{padding-top:1rem!important}.pr-sm-3{padding-right:1rem!important}.pb-sm-3{padding-bottom:1rem!important}.pl-sm-3{padding-left:1rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4{padding-top:1.5rem!important}.pr-sm-4{padding-right:1.5rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pl-sm-4{padding-left:1.5rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5{padding-top:3rem!important}.pr-sm-5{padding-right:3rem!important}.pb-sm-5{padding-bottom:3rem!important}.pl-sm-5{padding-left:3rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto{margin-top:auto!important}.mr-sm-auto{margin-right:auto!important}.mb-sm-auto{margin-bottom:auto!important}.ml-sm-auto{margin-left:auto!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.m-md-1{margin:.25rem!important}.mt-md-1{margin-top:.25rem!important}.mr-md-1{margin-right:.25rem!important}.mb-md-1{margin-bottom:.25rem!important}.ml-md-1{margin-left:.25rem!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2{margin-top:.5rem!important}.mr-md-2{margin-right:.5rem!important}.mb-md-2{margin-bottom:.5rem!important}.ml-md-2{margin-left:.5rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3{margin-top:1rem!important}.mr-md-3{margin-right:1rem!important}.mb-md-3{margin-bottom:1rem!important}.ml-md-3{margin-left:1rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4{margin-top:1.5rem!important}.mr-md-4{margin-right:1.5rem!important}.mb-md-4{margin-bottom:1.5rem!important}.ml-md-4{margin-left:1.5rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5{margin-top:3rem!important}.mr-md-5{margin-right:3rem!important}.mb-md-5{margin-bottom:3rem!important}.ml-md-5{margin-left:3rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-md-0{padding:0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.p-md-1{padding:.25rem!important}.pt-md-1{padding-top:.25rem!important}.pr-md-1{padding-right:.25rem!important}.pb-md-1{padding-bottom:.25rem!important}.pl-md-1{padding-left:.25rem!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2{padding-top:.5rem!important}.pr-md-2{padding-right:.5rem!important}.pb-md-2{padding-bottom:.5rem!important}.pl-md-2{padding-left:.5rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3{padding-top:1rem!important}.pr-md-3{padding-right:1rem!important}.pb-md-3{padding-bottom:1rem!important}.pl-md-3{padding-left:1rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4{padding-top:1.5rem!important}.pr-md-4{padding-right:1.5rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pl-md-4{padding-left:1.5rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5{padding-top:3rem!important}.pr-md-5{padding-right:3rem!important}.pb-md-5{padding-bottom:3rem!important}.pl-md-5{padding-left:3rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto{margin-top:auto!important}.mr-md-auto{margin-right:auto!important}.mb-md-auto{margin-bottom:auto!important}.ml-md-auto{margin-left:auto!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1{margin-top:.25rem!important}.mr-lg-1{margin-right:.25rem!important}.mb-lg-1{margin-bottom:.25rem!important}.ml-lg-1{margin-left:.25rem!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2{margin-top:.5rem!important}.mr-lg-2{margin-right:.5rem!important}.mb-lg-2{margin-bottom:.5rem!important}.ml-lg-2{margin-left:.5rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3{margin-top:1rem!important}.mr-lg-3{margin-right:1rem!important}.mb-lg-3{margin-bottom:1rem!important}.ml-lg-3{margin-left:1rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4{margin-top:1.5rem!important}.mr-lg-4{margin-right:1.5rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.ml-lg-4{margin-left:1.5rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5{margin-top:3rem!important}.mr-lg-5{margin-right:3rem!important}.mb-lg-5{margin-bottom:3rem!important}.ml-lg-5{margin-left:3rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1{padding-top:.25rem!important}.pr-lg-1{padding-right:.25rem!important}.pb-lg-1{padding-bottom:.25rem!important}.pl-lg-1{padding-left:.25rem!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2{padding-top:.5rem!important}.pr-lg-2{padding-right:.5rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pl-lg-2{padding-left:.5rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3{padding-top:1rem!important}.pr-lg-3{padding-right:1rem!important}.pb-lg-3{padding-bottom:1rem!important}.pl-lg-3{padding-left:1rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4{padding-top:1.5rem!important}.pr-lg-4{padding-right:1.5rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pl-lg-4{padding-left:1.5rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5{padding-top:3rem!important}.pr-lg-5{padding-right:3rem!important}.pb-lg-5{padding-bottom:3rem!important}.pl-lg-5{padding-left:3rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto{margin-top:auto!important}.mr-lg-auto{margin-right:auto!important}.mb-lg-auto{margin-bottom:auto!important}.ml-lg-auto{margin-left:auto!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1{margin-top:.25rem!important}.mr-xl-1{margin-right:.25rem!important}.mb-xl-1{margin-bottom:.25rem!important}.ml-xl-1{margin-left:.25rem!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2{margin-top:.5rem!important}.mr-xl-2{margin-right:.5rem!important}.mb-xl-2{margin-bottom:.5rem!important}.ml-xl-2{margin-left:.5rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3{margin-top:1rem!important}.mr-xl-3{margin-right:1rem!important}.mb-xl-3{margin-bottom:1rem!important}.ml-xl-3{margin-left:1rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4{margin-top:1.5rem!important}.mr-xl-4{margin-right:1.5rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.ml-xl-4{margin-left:1.5rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5{margin-top:3rem!important}.mr-xl-5{margin-right:3rem!important}.mb-xl-5{margin-bottom:3rem!important}.ml-xl-5{margin-left:3rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1{padding-top:.25rem!important}.pr-xl-1{padding-right:.25rem!important}.pb-xl-1{padding-bottom:.25rem!important}.pl-xl-1{padding-left:.25rem!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2{padding-top:.5rem!important}.pr-xl-2{padding-right:.5rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pl-xl-2{padding-left:.5rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3{padding-top:1rem!important}.pr-xl-3{padding-right:1rem!important}.pb-xl-3{padding-bottom:1rem!important}.pl-xl-3{padding-left:1rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4{padding-top:1.5rem!important}.pr-xl-4{padding-right:1.5rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pl-xl-4{padding-left:1.5rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5{padding-top:3rem!important}.pr-xl-5{padding-right:3rem!important}.pb-xl-5{padding-bottom:3rem!important}.pl-xl-5{padding-left:3rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto{margin-top:auto!important}.mr-xl-auto{margin-right:auto!important}.mb-xl-auto{margin-bottom:auto!important}.ml-xl-auto{margin-left:auto!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#868e96!important}a.text-secondary:focus,a.text-secondary:hover{color:#6c757d!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#868e96!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important} diff --git a/public/assets/css/demo.css b/public/assets/css/demo.css deleted file mode 100644 index 5ad0114..0000000 --- a/public/assets/css/demo.css +++ /dev/null @@ -1,828 +0,0 @@ -.tim-row { - margin-bottom: 20px; -} - -.tim-white-buttons { - background-color: #777777; -} - -.typography-line { - padding-left: 15%; - margin-bottom: 35px; - position: relative; - display: block; - width: 100%; -} - -.typography-line span { - bottom: 10px; - color: #9A9A9A; - display: block; - font-weight: 400; - font-size: 14px; - line-height: 13px; - left: 5px; - position: absolute; - width: 260px; - text-transform: none; -} - -.tim-row { - padding-top: 60px; -} - -.tim-row h3 { - margin-top: 0; -} - -#navbar-full .navbar { - border-radius: 0 !important; - margin-bottom: 15px; - z-index: 2; -} - -#map { - position: relative; - width: 100%; - height: 100%; -} - -.fixed-plugin li>a, -.fixed-plugin .badge { - transition: all .34s; - -webkit-transition: all .34s; - -moz-transition: all .34s; -} - -.fixed-plugin { - position: fixed; - top: 200px; - right: 0; - width: 64px; - background: rgba(0, 0, 0, .3); - z-index: 1031; - border-radius: 8px 0 0 8px; - text-align: center; -} - -.fixed-plugin .fa-cog { - color: #FFFFFF; - padding: 10px; - border-radius: 0 0 6px 6px; - width: auto; -} - -.fixed-plugin .dropdown-menu { - right: 80px; - left: auto; - width: 290px; - border-radius: 0.1875rem; - padding: 0 10px; -} - -.fixed-plugin .dropdown-menu:after, -.fixed-plugin .dropdown-menu:before { - right: 10px; - margin-left: auto; - left: auto; -} - -.fixed-plugin .fa-circle-thin { - color: #FFFFFF; -} - -.fixed-plugin .active .fa-circle-thin { - color: #00bbff; -} - -.fixed-plugin .dropdown-menu>.active>a, -.fixed-plugin .dropdown-menu>.active>a:hover, -.fixed-plugin .dropdown-menu>.active>a:focus { - color: #777777; - text-align: center; -} - -.fixed-plugin img { - border-radius: 0; - width: 100%; - height: 100px; - margin: 0 auto; -} - -.fixed-plugin .dropdown-menu li>a:hover, -.fixed-plugin .dropdown-menu li>a:focus { - box-shadow: none; -} - -.fixed-plugin .badge { - border: 3px solid #FFFFFF; - border-radius: 50%; - cursor: pointer; - display: inline-block; - height: 23px; - margin-right: 5px; - position: relative; - width: 23px; -} - -.fixed-plugin .badge.active, -.fixed-plugin .badge:hover { - border-color: #00bbff; -} - -.fixed-plugin .badge-black { - background-color: #777; -} - -.fixed-plugin .badge-azure { - background-color: #2CA8FF; -} - -.fixed-plugin .badge-green { - background-color: #18ce0f; -} - -.fixed-plugin .badge-orange { - background-color: #f96332; -} - -.fixed-plugin .badge-yellow { - background-color: #FFB236; -} - -.fixed-plugin .badge-red { - background-color: #FF3636; -} - -.fixed-plugin .badge-purple { - background-color: #9368E9; -} - -.fixed-plugin h5 { - font-size: 14px; - margin: 10px; -} - -.fixed-plugin .dropdown-menu li { - display: block; - padding: 18px 2px; - width: 25%; - float: left; -} - -.fixed-plugin li.adjustments-line, -.fixed-plugin li.header-title, -.fixed-plugin li.button-container { - width: 100%; - height: 50px; - min-height: inherit; -} - -.fixed-plugin li.button-container { - height: auto; -} - -.fixed-plugin li.button-container div { - margin-bottom: 5px; -} - -.fixed-plugin #sharrreTitle { - text-align: center; - padding: 10px 0; - height: 50px; -} - -.fixed-plugin li.header-title { - height: 30px; - line-height: 25px; - font-size: 12px; - font-weight: 600; - text-transform: uppercase; -} - -.fixed-plugin .adjustments-line p { - float: left; - display: inline-block; - margin-bottom: 0; - font-size: 1em; - color: #3C4858; -} - -.fixed-plugin .adjustments-line a .badge-colors { - position: relative; - top: -2px; -} - -.fixed-plugin .adjustments-line .togglebutton { - float: right; -} - -.fixed-plugin .adjustments-line .togglebutton .toggle { - margin-right: 0; -} - -.fixed-plugin .dropdown-menu>li.adjustments-line>a { - padding-right: 0; - padding-left: 0; - /*border-bottom: 1px solid #ddd;*/ - border-radius: 0; - margin: 0; -} - -.fixed-plugin .dropdown-menu>li>a.img-holder { - font-size: 16px; - text-align: center; - border-radius: 10px; - background-color: #FFF; - border: 3px solid #FFF; - padding-left: 0; - padding-right: 0; - opacity: 1; - cursor: pointer; - display: block; - max-height: 100px; - overflow: hidden; - padding: 0; -} - -.fixed-plugin .dropdown-menu>li>a.switch-trigger:hover, -.fixed-plugin .dropdown-menu>li>a.switch-trigger:focus { - background-color: transparent; -} - -.fixed-plugin .dropdown-menu>li:hover>a.img-holder, -.fixed-plugin .dropdown-menu>li:focus>a.img-holder { - border-color: rgba(0, 187, 255, 0.53); - ; -} - -.fixed-plugin .dropdown-menu>.active>a.img-holder, -.fixed-plugin .dropdown-menu>.active>a.img-holder { - border-color: #00bbff; - background-color: #FFFFFF; -} - -.fixed-plugin .dropdown-menu>li>a img { - margin-top: auto; -} - -.fixed-plugin .btn-social { - width: 50%; - display: block; - width: 48%; - float: left; - font-weight: 600; -} - -.fixed-plugin .btn-social i { - margin-right: 5px; -} - -.fixed-plugin .btn-social:first-child { - margin-right: 2%; -} - -.fixed-plugin .adjustments-line a:hover, -.fixed-plugin .adjustments-line a:focus, -.fixed-plugin .adjustments-line a { - color: transparent; -} - -.fixed-plugin .dropdown .dropdown-menu { - -webkit-transform: translateY(-15%); - -moz-transform: translateY(-15%); - -o-transform: translateY(-15%); - -ms-transform: translateY(-15%); - transform: translateY(-15%); - top: 27px; - opacity: 0; - transform-origin: 0 0; -} - -.fixed-plugin .dropdown.show .dropdown-menu { - opacity: 1; - -webkit-transform: translateY(-13%); - -moz-transform: translateY(-13%); - -o-transform: translateY(-13%); - -ms-transform: translateY(-13%); - transform: translateY(-13%); - transform-origin: 0 0; -} - -.fixed-plugin .dropdown-menu:before, -.fixed-plugin .dropdown-menu:after { - content: ""; - display: inline-block; - position: absolute; - top: 65px; - width: 16px; - transform: translateY(-50%); - -webkit-transform: translateY(-50%); - -moz-transform: translateY(-50%); -} - -.fixed-plugin .dropdown-menu:before { - border-bottom: 16px solid rgba(0, 0, 0, 0); - border-left: 16px solid rgba(0, 0, 0, 0.2); - border-top: 16px solid rgba(0, 0, 0, 0); - right: -16px; -} - -.fixed-plugin .dropdown-menu:after { - border-bottom: 16px solid rgba(0, 0, 0, 0); - border-left: 16px solid #fff; - border-top: 16px solid rgba(0, 0, 0, 0); - right: -15px; -} - -.wrapper-full-page~.fixed-plugin .dropdown.open .dropdown-menu { - -webkit-transform: translateY(-17%); - -moz-transform: translateY(-17%); - -o-transform: translateY(-17%); - -ms-transform: translateY(-17%); - transform: translateY(-17%); -} - -.wrapper-full-page~.fixed-plugin .dropdown .dropdown-menu { - -webkit-transform: translateY(-19%); - -moz-transform: translateY(-19%); - -o-transform: translateY(-19%); - -ms-transform: translateY(-19%); - transform: translateY(-19%); -} - -.places-buttons .btn { - margin-bottom: 30px; -} - -.map-container { - width: 100%; - height: 100vh; - max-height: 100vh; -} - -#menu-dropdown .navbar { - border-radius: 3px; -} - -#pagination-row .pagination-container { - height: 100%; - max-height: 100%; - display: flex; - align-items: center; -} - -.all-icons .font-icon-detail { - text-align: center; - padding: 45px 0px 30px; - border: 1px solid #e5e5e5; - border-radius: 0.1875rem; - margin: 15px 0; - min-height: 168px; -} - -.all-icons [class*="now-ui-icons"] { - font-size: 32px; -} - -.all-icons .font-icon-detail p { - margin: 25px auto 0; - width: 100%; - text-align: center; - display: block; - color: #B8B8B8; - padding: 0 10px; - font-size: 0.7142em; -} - -#icons-row i.now-ui-icons { - font-size: 30px; -} - -.space { - height: 130px; - display: block; -} - -.space-110 { - height: 110px; - display: block; -} - -.space-50 { - height: 50px; - display: block; -} - -.space-70 { - height: 70px; - display: block; -} - -.navigation-example .img-src { - background-attachment: scroll; -} - -.navigation-example { - background-position: center center; - background-size: cover; - margin-top: 0; - min-height: 740px; -} - -#notifications { - background-color: #FFFFFF; - display: block; - width: 100%; - position: relative; -} - -.tim-note { - text-transform: capitalize; -} - -#buttons .btn, -#javascriptComponents .btn { - margin: 0 0px 10px; -} - -.space-100 { - height: 100px; - display: block; - width: 100%; -} - -.be-social { - padding-bottom: 20px; - /* border-bottom: 1px solid #aaa; */ - margin: 0 auto 40px; -} - -.txt-white { - color: #FFFFFF; -} - -.txt-gray { - color: #ddd !important; -} - -.parallax { - width: 100%; - height: 570px; - display: block; - background-attachment: fixed; - background-repeat: no-repeat; - background-size: cover; - background-position: center center; -} - -.logo-container .logo { - overflow: hidden; - border-radius: 50%; - border: 1px solid #333333; - width: 50px; - float: left; -} - -.logo-container .brand { - font-size: 16px; - color: #FFFFFF; - line-height: 18px; - float: left; - margin-left: 10px; - margin-top: 7px; - width: 70px; - height: 40px; - text-align: left; -} - -.logo-container .brand-material { - font-size: 18px; - margin-top: 15px; - height: 25px; - width: auto; -} - -.logo-container .logo img { - width: 100%; -} - -.navbar-small .logo-container .brand { - color: #333333; -} - -.fixed-section { - top: 90px; - max-height: 80vh; - overflow: scroll; - position: sticky; -} - -.fixed-section ul { - padding: 0; -} - -.fixed-section ul li { - list-style: none; -} - -.fixed-section li a { - font-size: 14px; - padding: 2px; - display: block; - color: #666666; -} - -.fixed-section li a.active { - color: #00bbff; -} - -.fixed-section.float { - position: fixed; - top: 100px; - width: 200px; - margin-top: 0; -} - -.parallax .parallax-image { - width: 100%; - overflow: hidden; - position: absolute; -} - -.parallax .parallax-image img { - width: 100%; -} - -@media (max-width: 768px) { - .parallax .parallax-image { - width: 100%; - height: 640px; - overflow: hidden; - } - .parallax .parallax-image img { - height: 100%; - width: auto; - } -} - -/*.separator{ - content: "Separator"; - color: #FFFFFF; - display: block; - width: 100%; - padding: 20px; -} -.separator-line{ - background-color: #EEE; - height: 1px; - width: 100%; - display: block; -} -.separator.separator-gray{ - background-color: #EEEEEE; -}*/ - -.social-buttons-demo .btn { - margin-right: 5px; - margin-bottom: 7px; -} - -.img-container { - width: 100%; - overflow: hidden; -} - -.img-container img { - width: 100%; -} - -.lightbox img { - width: 100%; -} - -.lightbox .modal-content { - overflow: hidden; -} - -.lightbox .modal-body { - padding: 0; -} - -@media screen and (min-width: 991px) { - .lightbox .modal-dialog { - width: 960px; - } -} - -@media (max-width: 991px) { - .fixed-section.affix { - position: relative; - margin-bottom: 100px; - } -} - -@media (max-width: 768px) { - .btn, - .btn-morphing { - margin-bottom: 10px; - } - .parallax .motto { - top: 170px; - margin-top: 0; - font-size: 60px; - width: 270px; - } -} - -/* Loading dots */ - -/* transitions */ - -.presentation .front, -.presentation .front:after, -.presentation .front .btn, -.logo-container .logo, -.logo-container .brand { - -webkit-transition: all .2s; - -moz-transition: all .2s; - -o-transition: all .2s; - transition: all .2s; -} - -#images h4 { - margin-bottom: 30px; -} - -#javascriptComponents { - padding-bottom: 0; -} - -/* layer animation */ - -.layers-container { - display: block; - margin-top: 50px; - position: relative; -} - -.layers-container img { - position: absolute; - width: 100%; - height: auto; - top: 0; - left: 0; - text-align: center; -} - -.animate { - transition: 1.5s ease-in-out; - -moz-transition: 1.5s ease-in-out; - -webkit-transition: 1.5s ease-in-out; -} - -.navbar-default.navbar-small .logo-container .brand { - color: #333333; -} - -.navbar-transparent.navbar-small .logo-container .brand { - color: #FFFFFF; -} - -.navbar-default.navbar-small .logo-container .brand { - color: #333333; -} - -.sharing-area { - margin-top: 80px; -} - -.sharing-area .btn { - margin: 15px 4px 0; -} - -.section-thin, -.section-notifications { - padding: 0; -} - -.section-navbars { - padding-top: 0; -} - -#navbar .navbar { - margin-bottom: 20px; -} - -#navbar .navbar-toggler, -#menu-dropdown .navbar-toggler { - pointer-events: none; -} - -.section-tabs { - background: #EEEEEE; -} - -.section-pagination { - padding-bottom: 0; -} - -.section-download { - padding-top: 130px; -} - -.section-download .description { - margin-bottom: 60px; -} - -.section-download h4 { - margin-bottom: 25px; -} - -.section-examples a { - text-decoration: none; -} - -.section-examples a+a { - margin-top: 30px; -} - -.section-examples h5 { - margin-top: 30px; -} - -.components-page .wrapper>.header, -.tutorial-page .wrapper>.header { - height: 500px; - padding-top: 128px; - background-size: cover; - background-position: center center; -} - -.components-page .title, -.tutorial-page .title { - color: #FFFFFF; -} - -.brand .h1-seo { - font-size: 2.8em; - text-transform: uppercase; - font-weight: 300; -} - -.brand .n-logo { - max-width: 100px; - margin-bottom: 40px; -} - -.invision-logo { - max-width: 70px; - top: -2px; - position: relative; -} - -.creative-tim-logo { - max-width: 140px; - top: -2px; - position: relative; -} - -.section-javascript .title { - margin-bottom: 0; -} - -.navbar .switch-background { - display: block; -} - -.navbar-transparent .switch-background { - display: none; -} - -.section-signup .col .btn { - margin-top: 30px; -} - -#buttons-row .btn { - margin-bottom: 10px; -} - -.section-navbars .navbar-collapse { - display: none; -} - -.section-basic { - padding-top: 0; -} - -.section-images { - padding-bottom: 0; -} - -.documentation .dropdown .dropdown-menu { - transform: translate3d(0, 0, 0) !important; -} - -.documentation .dropdown .dropdown-menu.show { - transform: translate3d(0, 39px, 0) !important; -} \ No newline at end of file diff --git a/public/assets/css/light-bootstrap-dashboard.css b/public/assets/css/light-bootstrap-dashboard.css deleted file mode 100644 index f572910..0000000 --- a/public/assets/css/light-bootstrap-dashboard.css +++ /dev/null @@ -1,5317 +0,0 @@ -/*========================================================= - Light Bootstrap Dashboard - v2.0.1 -========================================================= - - Product Page: https://www.creative-tim.com/product/light-bootstrap-dashboard - Copyright 2019 Creative Tim (https://www.creative-tim.com) - Licensed under MIT (https://github.com/creativetimofficial/light-bootstrap-dashboard/blob/master/LICENSE) - - Coded by Creative Tim - -========================================================= - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.*/ - -/* light colors */ - -@keyframes spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@-webkit-keyframes spin { - from { - -webkit-transform: rotate(0deg); - } - to { - -webkit-transform: rotate(360deg); - } -} - -@-moz-keyframes spin { - from { - -moz-transform: rotate(0deg); - } - to { - -moz-transform: rotate(360deg); - } -} - -@-ms-keyframes spin { - from { - -ms-transform: rotate(0deg); - } - to { - -ms-transform: rotate(360deg); - } -} - -/* Font Smoothing */ - -body, -h1, -.h1, -h2, -.h2, -h3, -.h3, -h4, -.h4, -h5, -.h5, -h6, -.h6, -p, -.navbar, -.brand, -.btn-simple, -.alert, -a, -.td-name, -td, -button.close { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-family: "Roboto", "Helvetica Neue", Arial, sans-serif; - font-weight: 400; -} - -h1, -.h1, -h2, -.h2, -h3, -.h3, -h4, -.h4 { - font-weight: 300; - margin: 30px 0 15px; -} - -h1, -.h1 { - font-size: 52px; -} - -h2, -.h2 { - font-size: 36px; -} - -h3, -.h3 { - font-size: 28px; - margin: 20px 0 10px; -} - -h4, -.h4 { - font-size: 22px; - line-height: 30px; -} - -h5, -.h5 { - font-size: 16px; - margin-bottom: 15px; -} - -h6, -.h6 { - font-size: 14px; - font-weight: 600; - text-transform: uppercase; -} - -p { - font-size: 16px; - line-height: 1.5; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - color: #9A9A9A; - font-weight: 300; - line-height: 1.5; -} - -h1 small, -h2 small, -h3 small, -h1 .small, -h2 .small, -h3 .small { - font-size: 60%; -} - -h1 .subtitle { - display: block; - margin: 0 0 30px; -} - -.text-muted { - color: #9A9A9A; -} - -.text-primary, -.text-primary:hover { - color: #1D62F0 !important; -} - -.text-info, -.text-info:hover { - color: #1DC7EA !important; -} - -.text-success, -.text-success:hover { - color: #87CB16 !important; -} - -.text-warning, -.text-warning:hover { - color: #FF9500 !important; -} - -.text-danger, -.text-danger:hover { - color: #FF4A55 !important; -} - -/* General overwrite */ - -body, -.wrapper { - min-height: 100vh; - position: relative; -} - -a { - color: #1DC7EA; -} - -a:hover, -a:focus { - color: #42d0ed; - text-decoration: none; -} - -a:focus, -a:active, -button::-moz-focus-inner, -input::-moz-focus-inner, -input[type="reset"]::-moz-focus-inner, -input[type="button"]::-moz-focus-inner, -input[type="submit"]::-moz-focus-inner, -select::-moz-focus-inner, -input[type="file"]>input[type="button"]::-moz-focus-inner { - outline: 0; -} - -.ui-slider-handle:focus, -.navbar-toggle, -input:focus { - outline: 0 !important; -} - -/* Animations */ - -.form-control, -.input-group-addon, -.tagsinput, -.navbar, -.navbar .alert { - -webkit-transition: all 300ms linear; - -moz-transition: all 300ms linear; - -o-transition: all 300ms linear; - -ms-transition: all 300ms linear; - transition: all 300ms linear; -} - -.sidebar .nav a, -.table>tbody>tr .td-actions .btn { - -webkit-transition: all 150ms ease-in; - -moz-transition: all 150ms ease-in; - -o-transition: all 150ms ease-in; - -ms-transition: all 150ms ease-in; - transition: all 150ms ease-in; -} - -.btn { - -webkit-transition: all 100ms ease-in; - -moz-transition: all 100ms ease-in; - -o-transition: all 100ms ease-in; - -ms-transition: all 100ms ease-in; - transition: all 100ms ease-in; -} - -.fa { - width: 18px; - text-align: center; -} - -.margin-top { - margin-top: 50px; -} - -.wrapper { - position: relative; - top: 0; - height: 100vh; -} - -.page-header .page-header-image { - background-position: center center; - background-size: cover; - overflow: hidden; - width: 100%; - z-index: 1; -} - -.page-header .title-container { - color: #fff; - position: relative; - top: 250px; - z-index: 3; -} - -.page-header .filter:after { - background: transparent linear-gradient(to bottom, #9368e9 0%, #943bea 100%) repeat scroll 0 0/150% 150%; - content: ""; - display: block; - height: 100%; - left: 0; - opacity: 0.77; - position: absolute; - top: 0; - width: 100%; - z-index: 2; -} - -.documentation .page-header, -.documentation .page-header-image, -.documentation .page-header-image .filter:after { - height: 100vh; -} - -.documentation .footer { - z-index: 3; -} - -.documentation .wrapper { - margin-top: -61px; - height: 100vh; -} - -.documentation .navbar { - z-index: 21; -} - -.sidebar, -body>.navbar-collapse { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 280px; - display: block; - z-index: 1; - color: rgb(26, 20, 20); - font-weight: 200; - background-size: cover; - background-position: center center; -} - -.sidebar .sidebar-wrapper, -body>.navbar-collapse .sidebar-wrapper { - position: relative; - max-height: calc(100vh - 75px); - min-height: 100%; - overflow: auto; - width: 280px; - z-index: 4; - padding-bottom: 100px; -} - -.sidebar .sidebar-background, -body>.navbar-collapse .sidebar-background { - position: absolute; - z-index: 1; - height: 100%; - width: 100%; - display: block; - top: 0; - left: 0; - background-size: cover; - background-position: center center; -} - -.sidebar .logo, -body>.navbar-collapse .logo { - padding: 10px 15px 9px 15px; - border-bottom: 1px solid rgba(255, 255, 255, 0.2); - position: relative; - z-index: 4; -} - -.sidebar .logo p, -body>.navbar-collapse .logo p { - float: left; - font-size: 20px; - margin: 10px 10px; - color: #FFFFFF; - line-height: 20px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -.sidebar .logo .simple-text, -body>.navbar-collapse .logo .simple-text { - text-transform: uppercase; - padding: 5px 0px; - display: block; - font-size: 18px; - color: #FFFFFF; - text-align: center; - font-weight: 400; - line-height: 30px; -} - -.sidebar .logo-tim, -body>.navbar-collapse .logo-tim { - border-radius: 50%; - border: 1px solid #333; - display: block; - height: 61px; - width: 61px; - float: left; - overflow: hidden; -} - -.sidebar .logo-tim img, -body>.navbar-collapse .logo-tim img { - width: 60px; - height: 60px; -} - -.sidebar .nav, -body>.navbar-collapse .nav { - margin-top: 20px; - float: none; - display: block; -} - -.sidebar .nav li .nav-link, -body>.navbar-collapse .nav li .nav-link { - color: #FFFFFF; - margin: 5px 15px; - opacity: .86; - border-radius: 4px; - display: block; - padding: 10px 15px; -} - -.sidebar .nav li .nav-link:hover, -body>.navbar-collapse .nav li .nav-link:hover { - background: rgba(255, 255, 255, 0.13); - opacity: 1; -} - -.sidebar .nav li .nav-link p, -body>.navbar-collapse .nav li .nav-link p { - margin: 0; - line-height: 31px; - font-size: 12px; - font-weight: 600; - text-transform: uppercase; - display: inline-flex; -} - -.sidebar .nav li .nav-link i, -body>.navbar-collapse .nav li .nav-link i { - font-size: 28px; - margin-right: 15px; - width: 30px; - text-align: center; - vertical-align: middle; - float: left; -} - -.sidebar .nav li:hover .nav-link, -body>.navbar-collapse .nav li:hover .nav-link { - background: rgba(255, 255, 255, 0.13); - opacity: 1; -} - -.sidebar .nav li.active .nav-link, -body>.navbar-collapse .nav li.active .nav-link { - color: #FFFFFF; - opacity: 1; - background: rgba(255, 255, 255, 0.23); -} - -.sidebar .nav li.separator, -body>.navbar-collapse .nav li.separator { - margin: 15px 0; - border-bottom: 1px solid rgba(255, 255, 255, 0.2); -} - -.sidebar .nav li.separator+.nav-item, -body>.navbar-collapse .nav li.separator+.nav-item { - margin-top: 31px; -} - -.sidebar .nav .caret, -body>.navbar-collapse .nav .caret { - margin-top: 13px; - position: absolute; - right: 30px; -} - -.sidebar .nav .active-pro, -body>.navbar-collapse .nav .active-pro { - position: absolute; - width: 100%; - bottom: 10px; -} - -.sidebar .nav .active-pro a, -body>.navbar-collapse .nav .active-pro a { - color: #FFFFFF !important; -} - -.sidebar .nav .nav-link, -body>.navbar-collapse .nav .nav-link { - color: #FFFFFF; - margin: 5px 15px; - opacity: .86; - border-radius: 4px; - text-transform: uppercase; - line-height: 30px; - font-size: 12px; - font-weight: 600; -} - -.sidebar .logo, -body>.navbar-collapse .logo { - padding: 10px 15px; - border-bottom: 1px solid rgba(255, 255, 255, 0.2); -} - -.sidebar .logo p, -body>.navbar-collapse .logo p { - float: left; - font-size: 20px; - margin: 10px 10px; - color: #FFFFFF; - line-height: 20px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -.sidebar .logo .simple-text, -body>.navbar-collapse .logo .simple-text { - text-transform: uppercase; - padding: 5px 0px; - display: block; - font-size: 18px; - color: #FFFFFF; - text-align: center; - font-weight: 400; - line-height: 30px; -} - -.sidebar .logo-tim, -body>.navbar-collapse .logo-tim { - border-radius: 50%; - border: 1px solid #333; - display: block; - height: 61px; - width: 61px; - float: left; - overflow: hidden; -} - -.sidebar .logo-tim img, -body>.navbar-collapse .logo-tim img { - width: 60px; - height: 60px; -} - -.sidebar:after, -.sidebar:before, -body>.navbar-collapse:after, -body>.navbar-collapse:before { - display: block; - content: ""; - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - z-index: 2; -} - -.sidebar:before, -body>.navbar-collapse:before { - opacity: .33; - background: #000000; -} - -.sidebar:after, -body>.navbar-collapse:after { - background: #9368E9; - background: -moz-linear-gradient(top, #9368E9 0%, #943bea 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #9368E9), color-stop(100%, #943bea)); - background: -webkit-linear-gradient(top, #9368E9 0%, #943bea 100%); - background: -o-linear-gradient(top, #9368E9 0%, #943bea 100%); - background: -ms-linear-gradient(top, #9368E9 0%, #943bea 100%); - background: linear-gradient(to bottom, #9368E9 0%, #943bea 100%); - background-size: 150% 150%; - z-index: 3; - opacity: 1; -} - -.sidebar[data-image]:after, -.sidebar.has-image:after, -body>.navbar-collapse[data-image]:after, -body>.navbar-collapse.has-image:after { - opacity: .77; -} - -.sidebar[data-color="black"]:after, -body>.navbar-collapse[data-color="black"]:after { - background: #777777; - background: -moz-linear-gradient(top, #777777 0%, #777777 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #777777), color-stop(100%, #777777)); - background: -webkit-linear-gradient(top, #777777 0%, #777777 100%); - background: -o-linear-gradient(top, #777777 0%, #777777 100%); - background: -ms-linear-gradient(top, #777777 0%, #777777 100%); - background: linear-gradient(to bottom, #777777 0%, #777777 100%); - background-size: 150% 150%; -} - -.sidebar[data-color="blue"]:after, -body>.navbar-collapse[data-color="blue"]:after { - background: #1F77D0; - background: -moz-linear-gradient(top, #1F77D0 0%, #533ce1 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1F77D0), color-stop(100%, #533ce1)); - background: -webkit-linear-gradient(top, #1F77D0 0%, #533ce1 100%); - background: -o-linear-gradient(top, #1F77D0 0%, #533ce1 100%); - background: -ms-linear-gradient(top, #1F77D0 0%, #533ce1 100%); - background: linear-gradient(to bottom, #1F77D0 0%, #533ce1 100%); - background-size: 150% 150%; -} - -.sidebar[data-color="azure"]:after, -body>.navbar-collapse[data-color="azure"]:after { - background: #1DC7EA; - background: -moz-linear-gradient(top, #1DC7EA 0%, #4091ff 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1DC7EA), color-stop(100%, #4091ff)); - background: -webkit-linear-gradient(top, #1DC7EA 0%, #4091ff 100%); - background: -o-linear-gradient(top, #1DC7EA 0%, #4091ff 100%); - background: -ms-linear-gradient(top, #1DC7EA 0%, #4091ff 100%); - background: linear-gradient(to bottom, #1DC7EA 0%, #4091ff 100%); - background-size: 150% 150%; -} - -.sidebar[data-color="green"]:after, -body>.navbar-collapse[data-color="green"]:after { - background: #87CB16; - background: -moz-linear-gradient(top, #87CB16 0%, #6dc030 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #87CB16), color-stop(100%, #6dc030)); - background: -webkit-linear-gradient(top, #87CB16 0%, #6dc030 100%); - background: -o-linear-gradient(top, #87CB16 0%, #6dc030 100%); - background: -ms-linear-gradient(top, #87CB16 0%, #6dc030 100%); - background: linear-gradient(to bottom, #87CB16 0%, #6dc030 100%); - background-size: 150% 150%; -} - -.sidebar[data-color="orange"]:after, -body>.navbar-collapse[data-color="orange"]:after { - background: #FFA534; - background: -moz-linear-gradient(top, #FFA534 0%, #ff5221 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #FFA534), color-stop(100%, #ff5221)); - background: -webkit-linear-gradient(top, #FFA534 0%, #ff5221 100%); - background: -o-linear-gradient(top, #FFA534 0%, #ff5221 100%); - background: -ms-linear-gradient(top, #FFA534 0%, #ff5221 100%); - background: linear-gradient(to bottom, #FFA534 0%, #ff5221 100%); - background-size: 150% 150%; -} - -.sidebar[data-color="red"]:after, -body>.navbar-collapse[data-color="red"]:after { - background: #FB404B; - background: -moz-linear-gradient(top, #FB404B 0%, #bb0502 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #FB404B), color-stop(100%, #bb0502)); - background: -webkit-linear-gradient(top, #FB404B 0%, #bb0502 100%); - background: -o-linear-gradient(top, #FB404B 0%, #bb0502 100%); - background: -ms-linear-gradient(top, #FB404B 0%, #bb0502 100%); - background: linear-gradient(to bottom, #FB404B 0%, #bb0502 100%); - background-size: 150% 150%; -} - -.sidebar[data-color="purple"]:after, -body>.navbar-collapse[data-color="purple"]:after { - background: #9368E9; - background: -moz-linear-gradient(top, #9368E9 0%, #943bea 100%); - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #9368E9), color-stop(100%, #943bea)); - background: -webkit-linear-gradient(top, #9368E9 0%, #943bea 100%); - background: -o-linear-gradient(top, #9368E9 0%, #943bea 100%); - background: -ms-linear-gradient(top, #9368E9 0%, #943bea 100%); - background: linear-gradient(to bottom, #9368E9 0%, #943bea 100%); - background-size: 150% 150%; -} - -.main-panel { - background: rgba(16, 16, 173, 0.15); - position: relative; - float: right; - width: calc(100% - 260px); - min-height: 100%; -} - -.main-panel>.content { - padding: 30px 15px; - min-height: calc(100% - 123px); -} - -.main-panel>.footer { - border-top: 1px solid #e7e7e7; -} - -.main-panel .navbar { - margin-bottom: 0; -} - -.sidebar, -.main-panel { - overflow: auto; - max-height: 100%; - height: 100%; - -webkit-transition-property: top, bottom; - transition-property: top, bottom; - -webkit-transition-duration: .2s, .2s; - transition-duration: .2s, .2s; - -webkit-transition-timing-function: linear, linear; - transition-timing-function: linear, linear; - -webkit-overflow-scrolling: touch; -} - -.fixed-plugin .dropdown .dropdown-menu { - -webkit-transform: translate3d(0, -5%, 0) !important; - -moz-transform: translate3d(0, -5%, 0) !important; - -o-transform: translate3d(0, -5%, 0) !important; - -ms-transform: translate3d(0, -5%, 0) !important; - transform: translate3d(0, -5%, 0) !important; - border-radius: 10px; -} - -.fixed-plugin .dropdown .dropdown-menu li.adjustments-line { - border-bottom: 1px solid #ddd; -} - -.fixed-plugin .dropdown .dropdown-menu li { - padding: 5px 2px !important; -} - -.fixed-plugin .dropdown .dropdown-menu .button-container a { - font-size: 14px; -} - -.fixed-plugin .dropdown .dropdown-menu .button-container.show { - -webkit-transform: translate3d(0, 0%, 0) !important; - -moz-transform: translate3d(0, 0%, 0) !important; - -o-transform: translate3d(0, 0%, 0) !important; - -ms-transform: translate3d(0, 0%, 0) !important; - transform: translate3d(0, 0%, 0) !important; - transform-origin: 0 0; - left: -303px !important; -} - -.fixed-plugin .dropdown .dropdown-menu { - -webkit-transform: translate3d(0, -5%, 0) !important; - -moz-transform: translate3d(0, -5%, 0) !important; - -o-transform: translate3d(0, -5%, 0) !important; - -ms-transform: translate3d(0, -5%, 0) !important; - transform: translate3d(0, -5%, 0) !important; - top: -40px !important; - opacity: 0; - left: -303px !important; - transform-origin: 0 0; -} - -.fixed-plugin .dropdown.show .dropdown-menu { - opacity: 1; - -webkit-transform: translate3d(0, 0%, 0) !important; - -moz-transform: translate3d(0, 0%, 0) !important; - -o-transform: translate3d(0, 0%, 0) !important; - -ms-transform: translate3d(0, 0%, 0) !important; - transform: translate3d(0, 0%, 0) !important; - transform-origin: 0 0; - left: -303px !important; -} - -.fixed-plugin .dropdown-menu:before, -.fixed-plugin .dropdown-menu:after { - content: ""; - display: inline-block; - position: absolute; - top: 100px; - width: 32px; - transform: translateY(-50%); - -webkit-transform: translateY(-50%); - -moz-transform: translateY(-50%); -} - -.fixed-plugin .dropdown-menu:before { - border-bottom: 16px solid transparent; - border-left: 16px solid rgba(0, 0, 0, 0.2); - border-top: 16px solid transparent; - right: -16px; -} - -.fixed-plugin .dropdown-menu:after { - border-bottom: 16px solid transparent; - border-left: 16px solid #fff; - border-top: 16px solid transparent; - right: -15px; -} - -.modal.show .modal-dialog { - -webkit-transform: translate(0, 30%); - -o-transform: translate(0, 30%); - transform: translate(0, 30%); -} - -.modal.modal-mini .modal-dialog { - max-width: 255px; - margin: 0 auto; -} - -.modal .modal-content .modal-header { - border-bottom: none; - padding-top: 24px; - padding-right: 24px; - padding-bottom: 0; - padding-left: 24px; -} - -.modal .modal-content .modal-header .modal-profile { - width: 80px; - height: 80px; - border-radius: 50%; - text-align: center; - line-height: 5.7; - box-shadow: 0px 5px 20px 0px rgba(0, 0, 0, 0.3); -} - -.modal .modal-content .modal-header .modal-profile i { - font-size: 32px; - padding-top: 24px; -} - -.modal .modal-content .modal-body { - padding-top: 24px; - padding-right: 24px; - padding-bottom: 16px; - padding-left: 24px; - line-height: 1.9; -} - -.modal .modal-content .modal-body+.modal-footer { - padding-top: 0; -} - -.modal .modal-content .modal-footer { - border-top: none; - padding-right: 24px; - padding-bottom: 16px; - padding-left: 24px; - -webkit-justify-content: space-between; - justify-content: space-between; -} - -.modal .modal-content .modal-footer .btn { - margin: 0; - padding-left: 16px; - padding-right: 16px; - width: auto; -} - -.modal .modal-content .modal-footer .btn:hover, -.modal .modal-content .modal-footer .btnfocus { - text-decoration: none; -} - -.btn { - border-width: 2px; - background-color: transparent; - font-weight: 400; - opacity: 0.8; - filter: alpha(opacity=80); - padding: 8px 16px; - border-color: #888888; - color: #888888; -} - -.btn:hover, -.btn:focus, -.btn:active, -.btn.active, -.open>.btn.dropdown-toggle { - background-color: transparent; - color: #777777; - border-color: #777777; -} - -.btn.disabled, -.btn.disabled:hover, -.btn.disabled:focus, -.btn.disabled.focus, -.btn.disabled:active, -.btn.disabled.active, -.btn:disabled, -.btn:disabled:hover, -.btn:disabled:focus, -.btn:disabled.focus, -.btn:disabled:active, -.btn:disabled.active, -.btn[disabled], -.btn[disabled]:hover, -.btn[disabled]:focus, -.btn[disabled].focus, -.btn[disabled]:active, -.btn[disabled].active, -fieldset[disabled] .btn, -fieldset[disabled] .btn:hover, -fieldset[disabled] .btn:focus, -fieldset[disabled] .btn.focus, -fieldset[disabled] .btn:active, -fieldset[disabled] .btn.active { - background-color: transparent; - border-color: #888888; -} - -.btn.btn-fill { - color: #FFFFFF; - background-color: #888888; - opacity: 1; - filter: alpha(opacity=100); -} - -.btn.btn-fill:hover, -.btn.btn-fill:focus, -.btn.btn-fill:active, -.btn.btn-fill.active, -.open>.btn.btn-fill.dropdown-toggle { - background-color: #777777; - color: #FFFFFF; -} - -.btn.btn-fill .caret { - border-top-color: #FFFFFF; -} - -.btn .caret { - border-top-color: #888888; -} - -.btn:hover, -.btn:focus { - opacity: 1; - filter: alpha(opacity=100); - outline: 0 !important; - box-shadow: none; -} - -.btn:active, -.btn.active, -.open>.btn.dropdown-toggle { - -webkit-box-shadow: none; - box-shadow: none; - outline: 0 !important; -} - -.btn.btn-icon { - padding: 8px; -} - -.btn-primary { - border-color: #3472F7; - color: #3472F7; -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open>.btn-primary.dropdown-toggle { - background-color: transparent; - color: #1D62F0; - border-color: #1D62F0; -} - -.btn-primary.disabled, -.btn-primary.disabled:hover, -.btn-primary.disabled:focus, -.btn-primary.disabled.focus, -.btn-primary.disabled:active, -.btn-primary.disabled.active, -.btn-primary:disabled, -.btn-primary:disabled:hover, -.btn-primary:disabled:focus, -.btn-primary:disabled.focus, -.btn-primary:disabled:active, -.btn-primary:disabled.active, -.btn-primary[disabled], -.btn-primary[disabled]:hover, -.btn-primary[disabled]:focus, -.btn-primary[disabled].focus, -.btn-primary[disabled]:active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary, -fieldset[disabled] .btn-primary:hover, -fieldset[disabled] .btn-primary:focus, -fieldset[disabled] .btn-primary.focus, -fieldset[disabled] .btn-primary:active, -fieldset[disabled] .btn-primary.active { - background-color: transparent; - border-color: #3472F7; -} - -.btn-primary.btn-fill { - color: #FFFFFF; - background-color: #3472F7; - opacity: 1; - filter: alpha(opacity=100); -} - -.btn-primary.btn-fill:hover, -.btn-primary.btn-fill:focus, -.btn-primary.btn-fill:active, -.btn-primary.btn-fill.active, -.open>.btn-primary.btn-fill.dropdown-toggle { - background-color: #1D62F0; - color: #FFFFFF; -} - -.btn-primary.btn-fill .caret { - border-top-color: #FFFFFF; -} - -.btn-primary .caret { - border-top-color: #3472F7; -} - -.btn-success { - border-color: #87CB16; - color: #87CB16; -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open>.btn-success.dropdown-toggle { - background-color: transparent; - color: #049F0C; - border-color: #049F0C; -} - -.btn-success.disabled, -.btn-success.disabled:hover, -.btn-success.disabled:focus, -.btn-success.disabled.focus, -.btn-success.disabled:active, -.btn-success.disabled.active, -.btn-success:disabled, -.btn-success:disabled:hover, -.btn-success:disabled:focus, -.btn-success:disabled.focus, -.btn-success:disabled:active, -.btn-success:disabled.active, -.btn-success[disabled], -.btn-success[disabled]:hover, -.btn-success[disabled]:focus, -.btn-success[disabled].focus, -.btn-success[disabled]:active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success, -fieldset[disabled] .btn-success:hover, -fieldset[disabled] .btn-success:focus, -fieldset[disabled] .btn-success.focus, -fieldset[disabled] .btn-success:active, -fieldset[disabled] .btn-success.active { - background-color: transparent; - border-color: #87CB16; -} - -.btn-success.btn-fill { - color: #FFFFFF; - background-color: #87CB16; - opacity: 1; - filter: alpha(opacity=100); -} - -.btn-success.btn-fill:hover, -.btn-success.btn-fill:focus, -.btn-success.btn-fill:active, -.btn-success.btn-fill.active, -.open>.btn-success.btn-fill.dropdown-toggle { - background-color: #049F0C; - color: #FFFFFF; -} - -.btn-success.btn-fill .caret { - border-top-color: #FFFFFF; -} - -.btn-success .caret { - border-top-color: #87CB16; -} - -.btn-info { - border-color: #1DC7EA; - color: #1DC7EA; -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open>.btn-info.dropdown-toggle { - background-color: transparent; - color: #42d0ed; - border-color: #42d0ed; -} - -.btn-info.disabled, -.btn-info.disabled:hover, -.btn-info.disabled:focus, -.btn-info.disabled.focus, -.btn-info.disabled:active, -.btn-info.disabled.active, -.btn-info:disabled, -.btn-info:disabled:hover, -.btn-info:disabled:focus, -.btn-info:disabled.focus, -.btn-info:disabled:active, -.btn-info:disabled.active, -.btn-info[disabled], -.btn-info[disabled]:hover, -.btn-info[disabled]:focus, -.btn-info[disabled].focus, -.btn-info[disabled]:active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info, -fieldset[disabled] .btn-info:hover, -fieldset[disabled] .btn-info:focus, -fieldset[disabled] .btn-info.focus, -fieldset[disabled] .btn-info:active, -fieldset[disabled] .btn-info.active { - background-color: transparent; - border-color: #1DC7EA; -} - -.btn-info.btn-fill { - color: #FFFFFF; - background-color: #1DC7EA; - opacity: 1; - filter: alpha(opacity=100); -} - -.btn-info.btn-fill:hover, -.btn-info.btn-fill:focus, -.btn-info.btn-fill:active, -.btn-info.btn-fill.active, -.open>.btn-info.btn-fill.dropdown-toggle { - background-color: #42d0ed; - color: #FFFFFF; -} - -.btn-info.btn-fill .caret { - border-top-color: #FFFFFF; -} - -.btn-info .caret { - border-top-color: #1DC7EA; -} - -.btn-warning { - border-color: #FF9500; - color: #FF9500; -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open>.btn-warning.dropdown-toggle { - background-color: transparent; - color: #ED8D00; - border-color: #ED8D00; -} - -.btn-warning.disabled, -.btn-warning.disabled:hover, -.btn-warning.disabled:focus, -.btn-warning.disabled.focus, -.btn-warning.disabled:active, -.btn-warning.disabled.active, -.btn-warning:disabled, -.btn-warning:disabled:hover, -.btn-warning:disabled:focus, -.btn-warning:disabled.focus, -.btn-warning:disabled:active, -.btn-warning:disabled.active, -.btn-warning[disabled], -.btn-warning[disabled]:hover, -.btn-warning[disabled]:focus, -.btn-warning[disabled].focus, -.btn-warning[disabled]:active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning, -fieldset[disabled] .btn-warning:hover, -fieldset[disabled] .btn-warning:focus, -fieldset[disabled] .btn-warning.focus, -fieldset[disabled] .btn-warning:active, -fieldset[disabled] .btn-warning.active { - background-color: transparent; - border-color: #FF9500; -} - -.btn-warning.btn-fill { - color: #FFFFFF; - background-color: #FF9500; - opacity: 1; - filter: alpha(opacity=100); -} - -.btn-warning.btn-fill:hover, -.btn-warning.btn-fill:focus, -.btn-warning.btn-fill:active, -.btn-warning.btn-fill.active, -.open>.btn-warning.btn-fill.dropdown-toggle { - background-color: #ED8D00; - color: #FFFFFF; -} - -.btn-warning.btn-fill .caret { - border-top-color: #FFFFFF; -} - -.btn-warning .caret { - border-top-color: #FF9500; -} - -.btn-danger { - border-color: #FF4A55; - color: #FF4A55; -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open>.btn-danger.dropdown-toggle { - background-color: transparent; - color: #EE2D20; - border-color: #EE2D20; -} - -.btn-danger.disabled, -.btn-danger.disabled:hover, -.btn-danger.disabled:focus, -.btn-danger.disabled.focus, -.btn-danger.disabled:active, -.btn-danger.disabled.active, -.btn-danger:disabled, -.btn-danger:disabled:hover, -.btn-danger:disabled:focus, -.btn-danger:disabled.focus, -.btn-danger:disabled:active, -.btn-danger:disabled.active, -.btn-danger[disabled], -.btn-danger[disabled]:hover, -.btn-danger[disabled]:focus, -.btn-danger[disabled].focus, -.btn-danger[disabled]:active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger, -fieldset[disabled] .btn-danger:hover, -fieldset[disabled] .btn-danger:focus, -fieldset[disabled] .btn-danger.focus, -fieldset[disabled] .btn-danger:active, -fieldset[disabled] .btn-danger.active { - background-color: transparent; - border-color: #FF4A55; -} - -.btn-danger.btn-fill { - color: #FFFFFF; - background-color: #FF4A55; - opacity: 1; - filter: alpha(opacity=100); -} - -.btn-danger.btn-fill:hover, -.btn-danger.btn-fill:focus, -.btn-danger.btn-fill:active, -.btn-danger.btn-fill.active, -.open>.btn-danger.btn-fill.dropdown-toggle { - background-color: #EE2D20; - color: #FFFFFF; -} - -.btn-danger.btn-fill .caret { - border-top-color: #FFFFFF; -} - -.btn-danger .caret { - border-top-color: #FF4A55; -} - -.btn-neutral { - border-color: #FFFFFF; - color: #FFFFFF; -} - -.btn-neutral:hover, -.btn-neutral:focus, -.btn-neutral:active, -.btn-neutral.active, -.open>.btn-neutral.dropdown-toggle { - background-color: transparent; - color: #FFFFFF; - border-color: #FFFFFF; -} - -.btn-neutral.disabled, -.btn-neutral.disabled:hover, -.btn-neutral.disabled:focus, -.btn-neutral.disabled.focus, -.btn-neutral.disabled:active, -.btn-neutral.disabled.active, -.btn-neutral:disabled, -.btn-neutral:disabled:hover, -.btn-neutral:disabled:focus, -.btn-neutral:disabled.focus, -.btn-neutral:disabled:active, -.btn-neutral:disabled.active, -.btn-neutral[disabled], -.btn-neutral[disabled]:hover, -.btn-neutral[disabled]:focus, -.btn-neutral[disabled].focus, -.btn-neutral[disabled]:active, -.btn-neutral[disabled].active, -fieldset[disabled] .btn-neutral, -fieldset[disabled] .btn-neutral:hover, -fieldset[disabled] .btn-neutral:focus, -fieldset[disabled] .btn-neutral.focus, -fieldset[disabled] .btn-neutral:active, -fieldset[disabled] .btn-neutral.active { - background-color: transparent; - border-color: #FFFFFF; -} - -.btn-neutral.btn-fill { - color: #FFFFFF; - background-color: #FFFFFF; - opacity: 1; - filter: alpha(opacity=100); -} - -.btn-neutral.btn-fill:hover, -.btn-neutral.btn-fill:focus, -.btn-neutral.btn-fill:active, -.btn-neutral.btn-fill.active, -.open>.btn-neutral.btn-fill.dropdown-toggle { - background-color: #FFFFFF; - color: #FFFFFF; -} - -.btn-neutral.btn-fill .caret { - border-top-color: #FFFFFF; -} - -.btn-neutral .caret { - border-top-color: #FFFFFF; -} - -.btn-neutral:active, -.btn-neutral.active, -.open>.btn-neutral.dropdown-toggle { - background-color: #FFFFFF; - color: #888888; -} - -.btn-neutral.btn-fill, -.btn-neutral.btn-fill:hover, -.btn-neutral.btn-fill:focus { - color: #888888; -} - -.btn-neutral.btn-simple:active, -.btn-neutral.btn-simple.active { - background-color: transparent; -} - -.btn:disabled, -.btn[disabled], -.btn.disabled { - opacity: 0.5; - filter: alpha(opacity=50); -} - -.btn-round { - border-width: 1px; - border-radius: 30px !important; - padding: 9px 18px; -} - -.btn-round.btn-icon { - padding: 9px; -} - -.btn-simple { - border: 0; - font-size: 16px; - padding: 8px 16px; -} - -.btn-simple.btn-icon { - padding: 8px; -} - -.btn-lg { - font-size: 18px; - border-radius: 6px; - padding: 14px 30px; - font-weight: 400; -} - -.btn-lg.btn-round { - padding: 15px 30px; -} - -.btn-lg.btn-simple { - padding: 16px 30px; -} - -.btn-sm { - font-size: 12px; - border-radius: 3px; - padding: 5px 10px; -} - -.btn-sm.btn-round { - padding: 6px 10px; -} - -.btn-sm.btn-simple { - padding: 7px 10px; -} - -.btn-xs { - font-size: 12px; - border-radius: 3px; - padding: 1px 5px; -} - -.btn-xs.btn-round { - padding: 2px 5px; -} - -.btn-xs.btn-simple { - padding: 3px 5px; -} - -.btn-wd { - min-width: 140px; -} - -.btn-group.select { - width: 100%; -} - -.btn-group.select .btn { - text-align: left; -} - -.btn-group.select .caret { - position: absolute; - top: 50%; - margin-top: -1px; - right: 8px; -} - -.btn-social { - opacity: 0.85; -} - -.btn-twitter { - border-color: #55acee; - color: #55acee; -} - -.btn-twitter:hover { - opacity: 1 !important; - border-color: #55acee; - color: #55acee; -} - -.btn-facebook { - border-color: #3b5998; - color: #3b5998; -} - -.btn-facebook:hover { - opacity: 1 !important; - border-color: #3b5998; - color: #3b5998; -} - -.form-control::-moz-placeholder { - color: #DDDDDD; - opacity: 1; - filter: alpha(opacity=100); -} - -.form-control:-moz-placeholder { - color: #DDDDDD; - opacity: 1; - filter: alpha(opacity=100); -} - -.form-control::-webkit-input-placeholder { - color: #DDDDDD; - opacity: 1; - filter: alpha(opacity=100); -} - -.form-control:-ms-input-placeholder { - color: #DDDDDD; - opacity: 1; - filter: alpha(opacity=100); -} - -.form-control { - background-color: #FFFFFF; - border: 1px solid #E3E3E3; - border-radius: 4px; - color: #565656; - padding: 8px 12px; - height: 40px; - -webkit-box-shadow: none; - box-shadow: none; -} - -.form-control:focus { - background-color: #FFFFFF; - border: 1px solid #AAAAAA; - -webkit-box-shadow: none; - box-shadow: none; - outline: 0 !important; - color: #333333; -} - -.has-success .form-control, -.has-error .form-control, -.has-success .form-control:focus, -.has-error .form-control:focus { - border-color: #E3E3E3; - -webkit-box-shadow: none; - box-shadow: none; -} - -.has-success .form-control { - color: #87CB16; -} - -.has-success .form-control:focus { - border-color: #87CB16; -} - -.has-error .form-control { - color: #FF4A55; -} - -.has-error .form-control:focus { - border-color: #FF4A55; -} - -.form-control+.form-control-feedback { - border-radius: 6px; - font-size: 14px; - margin-top: -7px; - position: absolute; - right: 10px; - top: 50%; - vertical-align: middle; -} - -.open .form-control { - border-radius: 4px 4px 0 0; - border-bottom-color: transparent; -} - -.input-lg { - height: 55px; - padding: 14px 30px; -} - -.has-error .form-control-feedback { - color: #FF4A55; -} - -.has-success .form-control-feedback { - color: #87CB16; -} -.input-group { - display: block; -} - -.input-group-addon { - background-color: #FFFFFF; - border: 1px solid #E3E3E3; - border-radius: 4px; -} - -.has-success .input-group-addon, -.has-error .input-group-addon { - background-color: #FFFFFF; - border: 1px solid #E3E3E3; -} - -.has-error .form-control:focus+.input-group-addon { - border-color: #FF4A55; - color: #FF4A55; -} - -.has-success .form-control:focus+.input-group-addon { - border-color: #87CB16; - color: #87CB16; -} - -.form-control:focus+.input-group-addon, -.form-control:focus~.input-group-addon { - background-color: #FFFFFF; - border-color: #9A9A9A; -} - -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child>.dropdown-toggle, -.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) { - border-right: 0 none; -} - -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child>.dropdown-toggle, -.input-group-btn:first-child>.btn:not(:first-child) { - border-left: 0 none; -} - -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - background-color: #F5F5F5; - color: #888888; - cursor: not-allowed; -} - -.input-group-btn .btn { - border-width: 1px; - padding: 9px 16px; -} - -.input-group-btn .btn-default:not(.btn-fill) { - border-color: #DDDDDD; -} - -.input-group-btn:last-child>.btn { - margin-left: 0; -} - -.input-group-focus .input-group-addon { - border-color: #9A9A9A; -} - -.alert { - border: 0; - border-radius: 0; - color: #FFFFFF; - padding: 10px 15px; - font-size: 14px; -} - -.container .alert { - border-radius: 4px; -} - -.navbar .alert { - border-radius: 0; - left: 0; - position: absolute; - right: 0; - top: 85px; - width: 100%; - z-index: 3; -} - -.navbar:not(.navbar-transparent) .alert { - top: 70px; -} - -.alert span[data-notify="icon"] { - font-size: 30px; - display: block; - left: 15px; - position: absolute; - top: 50%; - margin-top: -15px; -} - -.alert i.nc-simple-remove { - font-size: 12px !important; - font: bold normal normal 14px/1 'nucleo-icons'; -} - -.alert button.close { - position: absolute; - right: 10px; - top: 50%; - margin-top: -13px; - z-index: 1033; - background-color: #FFFFFF; - display: block; - border-radius: 50%; - opacity: .4; - line-height: 9px; - width: 25px; - height: 25px; - outline: 0 !important; - text-align: center; - padding: 3px; - font-weight: 300; -} - -.alert button.close:hover { - opacity: .55; -} - -.alert .close~span { - display: block; - max-width: 89%; -} - -.alert[data-notify="container"] { - padding: 10px 10px 10px 20px; - border-radius: 4px; -} - -.alert.alert-with-icon { - padding-left: 65px; -} - -.alert-primary { - background-color: #4091e2; -} - -.alert-info { - background-color: #63d8f1; -} - -.alert-success { - background-color: #a1e82c; -} - -.alert-warning { - background-color: #ffbc67; -} - -.alert-danger { - background-color: #fc727a; -} - -.table .radio, -.table .checkbox { - position: relative; - height: 20px; - display: block; - width: 20px; - padding: 0px 0px; - margin: 0px 5px; - text-align: center; -} - -.table .radio .icons, -.table .checkbox .icons { - left: 5px; -} - -.table>thead>tr>th, -.table>tbody>tr>th, -.table>tfoot>tr>th, -.table>thead>tr>td, -.table>tbody>tr>td, -.table>tfoot>tr>td { - padding: 12px 8px; - vertical-align: middle; -} - -.table>thead>tr>th { - border-bottom-width: 1px; - font-size: 12px; - text-transform: uppercase; - color: #9A9A9A; - font-weight: 400; - padding-bottom: 5px; - border-top: none !important; - border-bottom: none; - text-align: left !important; -} - -.table .td-actions .btn { - opacity: 0.36; - filter: alpha(opacity=36); -} - -.table .td-actions .btn.btn-xs { - padding-left: 3px; - padding-right: 3px; -} - -.table .td-actions { - min-width: 90px; -} - -.table>tbody>tr { - position: relative; -} - -.table>tbody>tr:hover .td-actions .btn { - opacity: 1; - filter: alpha(opacity=100); -} - -.table .btn:focus { - box-shadow: none !important; -} - -.table-upgrade .table tr td { - width: 100%; -} - -.from-check, -.form-check-radio { - margin-bottom: 12px; - position: relative; -} - -.form-check .form-check-label { - display: inline-block; - position: relative; - cursor: pointer; - padding-left: 35px; - line-height: 26px; - margin-bottom: 0; -} - -.form-check .form-check-sign::before, -.form-check .form-check-sign::after { - font-family: 'FontAwesome'; - content: "\f096"; - display: inline-block; - color: #1DC7EA; - position: absolute; - width: 19px; - height: 19px; - margin-top: -12px; - margin-left: -23px; - font-size: 21px; - cursor: pointer; - -webkit-transition: opacity 0.3s linear; - -moz-transition: opacity 0.3s linear; - -o-transition: opacity 0.3s linear; - -ms-transition: opacity 0.3s linear; - transition: opacity 0.3s linear; -} - -.form-check .form-check-sign::after { - font-family: 'FontAwesome'; - content: "\f046"; - text-align: center; - opacity: 0; - color: #1DC7EA; - border: 0; - background-color: inherit; -} - -.form-check.disabled .form-check-label { - color: #9A9A9A; - opacity: .5; - cursor: not-allowed; -} - -.form-check input[type="checkbox"], -.form-check-radio input[type="radio"] { - opacity: 0; - position: absolute; - visibility: hidden; -} - -.form-check input[type="checkbox"]:checked+.form-check-sign::after { - opacity: 1; -} - -.form-control input[type="checkbox"]:disabled+.form-check-sign::before, -.checkbox input[type="checkbox"]:disabled+.form-check-sign::after { - cursor: not-allowed; -} - -.form-check .form-check-label input[type="checkbox"]:disabled+.form-check-sign, -.form-check-radio input[type="radio"]:disabled+.form-check-sign { - pointer-events: none !important; -} - -.form-check-radio .form-check-label { - padding-left: 2rem; -} - -.form-check-radio.disabled .form-check-label { - color: #9A9A9A; - opacity: .5; - cursor: not-allowed; -} - -.form-check-radio .form-check-sign::before { - font-family: 'FontAwesome'; - content: "\f10c"; - font-size: 22px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - display: inline-block; - position: absolute; - opacity: .50; - left: 5px; - top: -5px; -} - -.form-check-radio input[type="radio"]+.form-check-sign:after, -.form-check-radio input[type="radio"] { - opacity: 0; - -webkit-transition: opacity 0.3s linear; - -moz-transition: opacity 0.3s linear; - -o-transition: opacity 0.3s linear; - -ms-transition: opacity 0.3s linear; - transition: opacity 0.3s linear; - content: " "; - display: block; -} - -.form-check-radio input[type="radio"]:checked+.form-check-sign::after { - font-family: 'FontAwesome'; - content: "\f192"; - top: -5px; - position: absolute; - left: 5px; - opacity: 1; - font-size: 22px; -} - -.form-check-radio input[type="radio"]:checked+.form-check-sign::after { - opacity: 1; -} - -.form-check-radio input[type="radio"]:disabled+.form-check-sign::before, -.form-check-radio input[type="radio"]:disabled+.form-check-sign::after { - color: #9A9A9A; -} - -.nav .nav-item .nav-link:hover, -.nav .nav-item .nav-link:focus { - background-color: transparent; -} - -.navbar { - border: 0; - font-size: 16px; - border-radius: 0; - min-height: 50px; - max-height: 61px; - background-color: rgba(255, 255, 255, 0.96); - border-bottom: 1px solid rgba(0, 0, 0, 0.1); -} - -.navbar .navbar-brand { - font-weight: 400; - margin: 5px 0px; - font-size: 20px; - color: #888888; -} - -.navbar .navbar-brand:hover { - color: #5e5e5e; -} - -.navbar .navbar-toggler { - width: 37px; - height: 27px; - vertical-align: middle; - outline: 0; - cursor: pointer; -} - -.navbar .navbar-toggler.navbar-toggler-left { - position: relative; - left: 0; - padding-left: 0; -} - -.navbar .navbar-toggler.navbar-toggler-right { - padding-right: 0; - top: 18px; -} - -.navbar .navbar-toggler .navbar-toggler-bar { - width: 3px; - height: 3px; - border-radius: 50%; - margin: 0 auto; -} - -.navbar .navbar-toggler .burger-lines { - display: block; - position: relative; - background-color: #888; - width: 24px; - height: 2px; - border-radius: 1px; - margin: 4px auto; -} - -.navbar .navbar-nav .nav-item .nav-link { - color: #888888; - padding: 10px 15px; - margin: 10px 3px; - position: relative; - display: inline-flex; - line-height: 40px; -} - -.navbar .navbar-nav .nav-item .nav-link.btn { - margin: 15px 3px; - padding: 8px 16px; -} - -.navbar .navbar-nav .nav-item .nav-link.btn-round { - margin: 16px 3px; -} - -.navbar .navbar-nav .nav-item .nav-link [class^="fa"] { - font-size: 19px; - position: relative; - line-height: 40px; - top: 1px; -} - -.navbar .navbar-nav .nav-item .nav-link:hover { - color: #1DC7EA; -} - -.navbar .navbar-nav .nav-item .dropdown-menu { - border-radius: 10px; - margin-top: -5px; -} - -.navbar .navbar-nav .nav-item .dropdown-menu .dropdown-item:first-child { - border-top-left-radius: 300px; - border-top-right-radius: 300px; -} - -.navbar .navbar-nav .nav-item .dropdown-menu .dropdown-item:last-child { - border-bottom-left-radius: 300px; - border-bottom-right-radius: 300px; -} - -.navbar .navbar-nav .nav-item .dropdown-menu .divider { - height: 1px; - margin: 5px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.navbar .navbar-nav .notification { - position: absolute; - background-color: #FB404B; - text-align: center; - border-radius: 10px; - min-width: 18px; - padding: 0 5px; - height: 18px; - font-size: 12px; - color: #FFFFFF; - font-weight: bold; - line-height: 18px; - top: 10px; - left: 7px; -} - -.navbar .navbar-nav .dropdown-toggle:after { - display: inline-block; - width: 0; - height: 0; - margin-left: 5px; - margin-top: 20px; - vertical-align: middle; - border-top: 4px dashed; - border-top: 4px solid\9; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} - -.navbar .btn { - margin: 15px 3px; - font-size: 14px; -} - -.navbar .btn-simple { - font-size: 16px; -} - -.navbar.fixed { - width: calc(100% - $sidebar-width); - right: 0; - left: auto; - border-radius: 0; -} - -.navbar .nc-icon { - font-weight: 700; - margin-top: 10px; -} - -.navbar-transparent .navbar-brand, -[class*="navbar-ct"] .navbar-brand { - color: #FFFFFF; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.navbar-transparent .navbar-brand:focus, -.navbar-transparent .navbar-brand:hover, -[class*="navbar-ct"] .navbar-brand:focus, -[class*="navbar-ct"] .navbar-brand:hover { - background-color: transparent; - opacity: 1; - filter: alpha(opacity=100); - color: #FFFFFF; -} - -.navbar-transparent .navbar-nav .nav-item .nav-link:not(.btn), -[class*="navbar-ct"] .navbar-nav .nav-item .nav-link:not(.btn) { - color: #FFFFFF; - border-color: #FFFFFF; - opacity: 0.8; - filter: alpha(opacity=80); -} - -.navbar-transparent .navbar-nav .active .nav-link:not(.btn), -.navbar-transparent .navbar-nav .active .nav-link:hover:not(.btn), -.navbar-transparent .navbar-nav .active .nav-link:focus:not(.btn), -.navbar-transparent .navbar-nav .nav-item .nav-link:not(.btn), -.navbar-transparent .navbar-nav .nav-item .nav-link:hover:not(.btn), -.navbar-transparent .navbar-nav .nav-item .nav-link:focus:not(.btn), -[class*="navbar-ct"] .navbar-nav .active .nav-link:not(.btn), -[class*="navbar-ct"] .navbar-nav .active .nav-link:hover:not(.btn), -[class*="navbar-ct"] .navbar-nav .active .nav-link:focus:not(.btn), -[class*="navbar-ct"] .navbar-nav .nav-item .nav-link:not(.btn), -[class*="navbar-ct"] .navbar-nav .nav-item .nav-link:hover:not(.btn), -[class*="navbar-ct"] .navbar-nav .nav-item .nav-link:focus:not(.btn) { - background-color: transparent; - border-radius: 3px; - color: #FFFFFF; - opacity: 1; - filter: alpha(opacity=100); -} - -.navbar-transparent .navbar-nav .nav .nav-item .nav-link.btn:hover, -[class*="navbar-ct"] .navbar-nav .nav .nav-item .nav-link.btn:hover { - background-color: transparent; -} - -.navbar-transparent .navbar-nav .show .nav-link, -.navbar-transparent .navbar-nav .show .nav-link:hover, -.navbar-transparent .navbar-nav .show .nav-link:focus, -[class*="navbar-ct"] .navbar-nav .show .nav-link, -[class*="navbar-ct"] .navbar-nav .show .nav-link:hover, -[class*="navbar-ct"] .navbar-nav .show .nav-link:focus { - background-color: transparent; - color: #FFFFFF; - opacity: 1; - filter: alpha(opacity=100); -} - -.navbar-transparent .btn-default, -[class*="navbar-ct"] .btn-default { - color: #FFFFFF; - border-color: #FFFFFF; -} - -.navbar-transparent .btn-default.btn-fill, -[class*="navbar-ct"] .btn-default.btn-fill { - color: #9A9A9A; - background-color: #FFFFFF; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.navbar-transparent .btn-default.btn-fill:hover, -.navbar-transparent .btn-default.btn-fill:focus, -.navbar-transparent .btn-default.btn-fill:active, -.navbar-transparent .btn-default.btn-fill.active, -.navbar-transparent .show .dropdown-toggle.btn-fill.btn-default, -[class*="navbar-ct"] .btn-default.btn-fill:hover, -[class*="navbar-ct"] .btn-default.btn-fill:focus, -[class*="navbar-ct"] .btn-default.btn-fill:active, -[class*="navbar-ct"] .btn-default.btn-fill.active, -[class*="navbar-ct"] .show .dropdown-toggle.btn-fill.btn-default { - border-color: #FFFFFF; - opacity: 1; - filter: alpha(opacity=100); -} - -.navbar-transparent .dropdown-menu .divider { - background-color: rgba(255, 255, 255, 0.2); -} - -.navbar-default { - background-color: rgba(255, 255, 255, 0.96); - border-bottom: 1px solid rgba(0, 0, 0, 0.1); -} - -.navbar-default .navbar-nav .nav-item .nav-link:not(.btn) { - color: #9A9A9A; -} - -.navbar-default .navbar-nav .active .nav-link, -.navbar-default .navbar-nav .active .nav-link:not(.btn):hover, -.navbar-default .navbar-nav .active .nav-link:not(.btn):focus, -.navbar-default .navbar-nav .nav-item .nav-link:not(.btn):hover, -.navbar-default .navbar-nav .nav-item .nav-link:not(.btn):focus { - background-color: transparent; - border-radius: 3px; - color: #1DC7EA; - opacity: 1; - filter: alpha(opacity=100); -} - -.navbar-default .navbar-nav .show .nav-link, -.navbar-default .navbar-nav .show .nav-link:hover, -.navbar-default .navbar-nav .show .nav-link:focus { - background-color: transparent; - color: #1DC7EA; -} - -.navbar-default .navbar-nav .navbar-toggle:hover, -.navbar-default .navbar-nav .navbar-toggle:focus { - background-color: transparent; -} - -.navbar-default:not(.navbar-transparent) .btn-default:hover { - color: #1DC7EA; - border-color: #1DC7EA; -} - -.navbar-default:not(.navbar-transparent) .btn-neutral, -.navbar-default:not(.navbar-transparent) .btn-neutral:hover, -.navbar-default:not(.navbar-transparent) .btn-neutral:active { - color: #9A9A9A; -} - -/* Navbar with icons */ - -.navbar-icons.navbar .navbar-brand { - margin-top: 12px; - margin-bottom: 12px; -} - -.navbar-icons .navbar-nav .nav-item .nav-link { - text-align: center; - padding: 6px 15px; - margin: 6px 3px; -} - -.navbar-icons .navbar-nav [class^="pe"] { - font-size: 30px; - position: relative; -} - -.navbar-icons .navbar-nav p { - margin: 3px 0 0; -} - -.navbar-form { - -webkit-box-shadow: none; - box-shadow: none; -} - -.navbar-form .form-control { - border-radius: 0; - border: 0; - padding: 0; - background-color: transparent; - height: 22px; - font-size: 16px; - line-height: 1.5; - color: #E3E3E3; -} - -.navbar-transparent .navbar-form .form-control, -[class*="navbar-ct"] .navbar-form .form-control { - color: #FFFFFF; - border: 0; - border-bottom: 1px solid rgba(255, 255, 255, 0.6); -} - -.navbar-ct-blue { - background-color: #4091e2; -} - -.navbar-ct-azure { - background-color: #63d8f1; -} - -.navbar-ct-green { - background-color: #a1e82c; -} - -.navbar-ct-orange { - background-color: #ffbc67; -} - -.navbar-ct-red { - background-color: #fc727a; -} - -.navbar-transparent { - padding-top: 15px; - background-color: transparent; - border-bottom: 1px solid transparent; -} - -.navbar-toggle { - margin-top: 19px; - margin-bottom: 19px; - border: 0; -} - -.navbar-toggle .icon-bar { - background-color: #FFFFFF; -} - -.navbar-toggle .navbar-collapse, -.navbar-toggle .navbar-form { - border-color: transparent; -} - -.navbar-toggle.navbar-default .navbar-toggle:hover, -.navbar-toggle.navbar-default .navbar-toggle:focus { - background-color: transparent; -} - -.footer { - background-color: #FFFFFF; -} - -.footer .footer-menu { - height: 41px; -} - -.footer nav>ul { - list-style: none; - margin: 0; - padding: 0; - font-weight: normal; -} - -.footer nav>ul a:not(.btn) { - color: #9A9A9A; - display: block; - margin-bottom: 3px; -} - -.footer nav>ul a:not(.btn):hover, -.footer nav>ul a:not(.btn):focus { - color: #777777; -} - -.footer .social-area { - padding: 15px 0; -} - -.footer .social-area h5 { - padding-bottom: 15px; -} - -.footer .social-area>a:not(.btn) { - color: #9A9A9A; - display: inline-block; - vertical-align: top; - padding: 10px 5px; - font-size: 20px; - font-weight: normal; - line-height: 20px; - text-align: center; -} - -.footer .social-area>a:not(.btn):hover, -.footer .social-area>a:not(.btn):focus { - color: #777777; -} - -.footer .copyright { - color: #777777; - padding: 10px 15px; - margin: 10px 3px; - line-height: 20px; - font-size: 14px; -} - -.footer hr { - border-color: #DDDDDD; -} - -.footer .title { - color: #777777; -} - -.footer-default { - background-color: #F5F5F5; -} - -.footer:not(.footer-big) nav>ul { - font-size: 14px; -} - -.footer:not(.footer-big) nav>ul li { - margin-left: 20px; - float: left; -} - -.footer:not(.footer-big) nav>ul a { - padding: 10px 0px; - margin: 10px 10px 10px 0px; -} - -/*! -Animate.css - http://daneden.me/animate -Licensed under the MIT license - http://opensource.org/licenses/MIT - -Copyright (c) 2015 Daniel Eden -*/ - -.animated { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} - -.animated.infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; -} - -.animated.hinge { - -webkit-animation-duration: 2s; - animation-duration: 2s; -} - -.animated.bounceIn, -.animated.bounceOut { - -webkit-animation-duration: .75s; - animation-duration: .75s; -} - -.animated.flipOutX, -.animated.flipOutY { - -webkit-animation-duration: .75s; - animation-duration: .75s; -} - -@-webkit-keyframes shake { - from, - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 10%, - 30%, - 50%, - 70%, - 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 20%, - 40%, - 60%, - 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} - -@keyframes shake { - from, - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - 10%, - 30%, - 50%, - 70%, - 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - 20%, - 40%, - 60%, - 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} - -.shake { - -webkit-animation-name: shake; - animation-name: shake; -} - -@-webkit-keyframes fadeInDown { - from { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -@keyframes fadeInDown { - from { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - to { - opacity: 1; - -webkit-transform: none; - transform: none; - } -} - -.fadeInDown { - -webkit-animation-name: fadeInDown; - animation-name: fadeInDown; -} - -@-webkit-keyframes fadeOut { - from { - opacity: 1; - } - to { - opacity: 0; - } -} - -@keyframes fadeOut { - from { - opacity: 1; - } - to { - opacity: 0; - } -} - -.fadeOut { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} - -@-webkit-keyframes fadeOutDown { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} - -@keyframes fadeOutDown { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} - -.fadeOutDown { - -webkit-animation-name: fadeOutDown; - animation-name: fadeOutDown; -} - -@-webkit-keyframes fadeOutUp { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} - -@keyframes fadeOutUp { - from { - opacity: 1; - } - to { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} - -.fadeOutUp { - -webkit-animation-name: fadeOutUp; - animation-name: fadeOutUp; -} - -.dropdown-menu { - visibility: hidden; - margin: 0; - padding: 0; - border-radius: 10px; - display: block; - z-index: 10000; - position: absolute; - opacity: 0; - filter: alpha(opacity=0); - -webkit-box-shadow: 1px 2px 3px rgba(0, 0, 0, 0.125); - box-shadow: 1px 2px 3px rgba(0, 0, 0, 0.125); -} - -.show .dropdown-menu { - opacity: 1; - filter: alpha(opacity=100); - visibility: visible; -} - -.select .dropdown-menu { - border-radius: 0 0 10px 10px; - -webkit-box-shadow: none; - box-shadow: none; - -webkit-transform-origin: 50% -40px; - -moz-transform-origin: 50% -40px; - -o-transform-origin: 50% -40px; - -ms-transform-origin: 50% -40px; - transform-origin: 50% -40px; - -webkit-transform: scale(1); - -moz-transform: scale(1); - -o-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - -webkit-transition: all 150ms linear; - -moz-transition: all 150ms linear; - -o-transition: all 150ms linear; - -ms-transition: all 150ms linear; - transition: all 150ms linear; - margin-top: -20px; -} - -.select.show .dropdown-menu { - margin-top: -1px; -} - -.dropdown-menu .dropdown-item { - padding: 16px 32px; - color: #333333; -} - -.dropdown-menu .dropdown-item img { - margin-top: -3px; -} - -.dropdown-menu .dropdown-item:focus { - outline: 0 !important; -} - -.btn-group.select .dropdown-menu { - min-width: 100%; -} - -.dropdown-menu>li:first-child>a { - border-top-left-radius: 10px; - border-top-right-radius: 10px; -} - -.dropdown-menu>li:last-child>a { - border-bottom-left-radius: 10px; - border-bottom-right-radius: 10px; -} - -.select .dropdown-menu>li:first-child>a { - border-radius: 0; - border-bottom: 0 none; -} - -.dropdown-menu .dropdown-item:hover, -.dropdown-menu .dropdown-item:focus { - background-color: #F5F5F5; - color: #333333; - opacity: 1; - text-decoration: none; -} - -.dropdown-menu.dropdown-blue>li>a:hover, -.dropdown-menu.dropdown-blue>li>a:focus { - background-color: rgba(52, 114, 247, 0.2); -} - -.dropdown-menu.dropdown-azure>li>a:hover, -.dropdown-menu.dropdown-azure>li>a:focus { - background-color: rgba(29, 199, 234, 0.2); -} - -.dropdown-menu.ct-green>li>a:hover, -.dropdown-menu.ct-green>li>a:focus { - background-color: rgba(135, 203, 22, 0.2); -} - -.dropdown-menu.dropdown-orange>li>a:hover, -.dropdown-menu.dropdown-orange>li>a:focus { - background-color: rgba(255, 149, 0, 0.2); -} - -.dropdown-menu.dropdown-red>li>a:hover, -.dropdown-menu.dropdown-red>li>a:focus { - background-color: rgba(255, 74, 85, 0.2); -} - -.dropdown-menu .dropdown-item i[class*="nc-icon"] { - font-size: 18px; - text-align: center; - line-height: 25px; - float: left; - padding-right: 50px; -} - -.dropdown-menu.dropdown-menu-right:before, -.dropdown-menu.dropdown-menu-right:after { - right: 12px !important; - left: auto !important; -} - -.dropdown-with-icons>li>a { - padding-left: 0px; - line-height: 28px; -} - -.dropdown-with-icons i { - text-align: center; - line-height: 28px; - float: left; -} - -.dropdown-with-icons i[class^="pe-"] { - font-size: 24px; - width: 46px; -} - -.dropdown-with-icons i[class^="fa"] { - font-size: 14px; - width: 38px; -} - -.btn-group.select { - overflow: hidden; -} - -.btn-group.select.show { - overflow: visible; -} - -.card { - border-radius: 4px; - background-color: white; - margin-bottom: 30px; - padding: 29px; -} - -.card .card-image { - width: 120%; - overflow: hidden; - height: 280px; - border-radius: 4px 4px 0 0; - position: relative; - -webkit-transform-style: preserve-3d; - -moz-transform-style: preserve-3d; - transform-style: preserve-3d; -} - -.card .card-image img { - width: 120%; -} - -.card .filter { - position: absolute; - z-index: 2; - background-color: rgba(0, 0, 0, 0.68); - top: 0; - left: 0; - width: 120%; - height: 100%; - text-align: center; - opacity: 0; - filter: alpha(opacity=0); -} - -.card .filter .btn { - position: relative; - top: 50%; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); -} - -.card:hover .filter { - opacity: 1; - filter: alpha(opacity=100); -} - -.card .btn-hover { - opacity: 0; - filter: alpha(opacity=0); -} - -.card:hover .btn-hover { - opacity: 1; - filter: alpha(opacity=100); -} - -.card .card-body { - padding: 15px 15px 10px 15px; -} - -.card .card-header { - padding: 15px 15px 0; - background-color: #FFFFFF; - border-bottom: none !important; -} - -.card .card-category, -.card label { - font-size: 14px; - font-weight: 400; - color: #9A9A9A; - margin-bottom: 0px; -} - -.card .card-category i, -.card label i { - font-size: 16px; -} - -.card label { - font-size: 12px; - margin-bottom: 5px; - text-transform: uppercase; -} - -.card .card-title { - margin: 0; - color: #333333; - font-weight: 300; -} - -.card .avatar { - width: 30px; - height: 30px; - overflow: hidden; - border-radius: 50%; - margin-right: 5px; -} - -.card .description { - font-size: 14px; - color: #333; -} - -.card .card-footer { - padding-top: 0; - background-color: transparent; - line-height: 30px; - border-top: none !important; - font-size: 14px; -} - -.card .card-footer .legend { - padding: 5px 0; -} - -.card .card-footer hr { - margin-top: 5px; - margin-bottom: 5px; -} - -.card .stats { - color: #a9a9a9; -} - -.card .card-footer div { - display: inline-block; -} - -.card .author { - font-size: 12px; - font-weight: 600; - text-transform: uppercase; -} - -.card .author i { - font-size: 14px; -} - -.card h6 { - font-size: 12px; - margin: 0; -} - -.card.card-separator:after { - height: 100%; - right: -15px; - top: 0; - width: 1px; - background-color: #DDDDDD; - card-body: ""; - position: absolute; -} - -.card .ct-chart { - margin: 30px 0 30px; - height: 245px; -} - -.card .ct-label { - font-size: 1rem !important; -} - -.card .table tbody td:first-child, -.card .table thead th:first-child { - padding-left: 15px; -} - -.card .table tbody td:last-child, -.card .table thead th:last-child { - padding-right: 15px; - display: inline-flex; -} - -.card .alert { - border-radius: 4px; - position: relative; -} - -.card .alert.alert-with-icon { - padding-left: 65px; -} - -.card-stats .card-body { - padding: 15px 15px 0px; -} - -.card-stats .card-body .numbers { - font-size: 1.8rem; - text-align: right; -} - -.card-stats .card-body .numbers p { - margin-bottom: 0; -} - -.card-stats .card-footer { - padding: 0px 15px 10px 15px; -} - -.card-stats .icon-big { - font-size: 3em; - min-height: 64px; -} - -.card-stats .icon-big i { - font-weight: 700; - line-height: 59px; -} - -.card-user .card-image { - height: 110px; -} - -.card-user .card-image-plain { - height: 0; - margin-top: 110px; -} - -.card-user .author { - text-align: center; - text-transform: none; - margin-top: -70px; -} - -.card-user .avatar { - width: 124px; - height: 124px; - border: 5px solid #FFFFFF; - position: relative; - margin-bottom: 15px; -} - -.card-user .avatar.border-gray { - border-color: #EEEEEE; -} - -.card-user .title { - line-height: 24px; -} - -.card-user .card-body { - min-height: 240px; -} - -.card-user .card-footer, -.card-price .card-footer { - padding: 5px 15px 10px; -} - -.card-user hr, -.card-price hr { - margin: 5px 15px; -} - -.card-plain { - background-color: transparent; - box-shadow: none; - border-radius: 0; -} - -.card-plain .card-image { - border-radius: 4px; -} - -.card.card-plain { - border: none !important; -} - -.card.card-plain .card-header { - background-color: transparent !important; -} - -.ct-label { - fill: rgba(0, 0, 0, 0.4); - color: rgba(0, 0, 0, 0.4); - font-size: 1.3rem; - line-height: 1; -} - -.ct-chart-line .ct-label, -.ct-chart-bar .ct-label { - display: block; - display: -webkit-box; - display: -moz-box; - display: -ms-flexbox; - display: -webkit-flex; - display: flex; -} - -.ct-label.ct-horizontal.ct-start { - -webkit-box-align: flex-end; - -webkit-align-items: flex-end; - -ms-flex-align: flex-end; - align-items: flex-end; - -webkit-box-pack: flex-start; - -webkit-justify-content: flex-start; - -ms-flex-pack: flex-start; - justify-content: flex-start; - text-align: left; - text-anchor: start; -} - -.ct-label.ct-horizontal.ct-end { - -webkit-box-align: flex-start; - -webkit-align-items: flex-start; - -ms-flex-align: flex-start; - align-items: flex-start; - -webkit-box-pack: flex-start; - -webkit-justify-content: flex-start; - -ms-flex-pack: flex-start; - justify-content: flex-start; - text-align: left; - text-anchor: start; -} - -.ct-label.ct-vertical.ct-start { - -webkit-box-align: flex-end; - -webkit-align-items: flex-end; - -ms-flex-align: flex-end; - align-items: flex-end; - -webkit-box-pack: flex-end; - -webkit-justify-content: flex-end; - -ms-flex-pack: flex-end; - justify-content: flex-end; - text-align: right; - text-anchor: end; -} - -.ct-label.ct-vertical.ct-end { - -webkit-box-align: flex-end; - -webkit-align-items: flex-end; - -ms-flex-align: flex-end; - align-items: flex-end; - -webkit-box-pack: flex-start; - -webkit-justify-content: flex-start; - -ms-flex-pack: flex-start; - justify-content: flex-start; - text-align: left; - text-anchor: start; -} - -.ct-chart-bar .ct-label.ct-horizontal.ct-start { - -webkit-box-align: flex-end; - -webkit-align-items: flex-end; - -ms-flex-align: flex-end; - align-items: flex-end; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - text-align: center; - text-anchor: start; -} - -.ct-chart-bar .ct-label.ct-horizontal.ct-end { - -webkit-box-align: flex-start; - -webkit-align-items: flex-start; - -ms-flex-align: flex-start; - align-items: flex-start; - -webkit-box-pack: center; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; - text-align: center; - text-anchor: start; -} - -.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start { - -webkit-box-align: flex-end; - -webkit-align-items: flex-end; - -ms-flex-align: flex-end; - align-items: flex-end; - -webkit-box-pack: flex-start; - -webkit-justify-content: flex-start; - -ms-flex-pack: flex-start; - justify-content: flex-start; - text-align: left; - text-anchor: start; -} - -.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end { - -webkit-box-align: flex-start; - -webkit-align-items: flex-start; - -ms-flex-align: flex-start; - align-items: flex-start; - -webkit-box-pack: flex-start; - -webkit-justify-content: flex-start; - -ms-flex-pack: flex-start; - justify-content: flex-start; - text-align: left; - text-anchor: start; -} - -.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start { - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: flex-end; - -webkit-justify-content: flex-end; - -ms-flex-pack: flex-end; - justify-content: flex-end; - text-align: right; - text-anchor: end; -} - -.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end { - -webkit-box-align: center; - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: flex-start; - -webkit-justify-content: flex-start; - -ms-flex-pack: flex-start; - justify-content: flex-start; - text-align: left; - text-anchor: end; -} - -.ct-grid { - stroke: rgba(0, 0, 0, 0.2); - stroke-width: 1px; - stroke-dasharray: 2px; -} - -.ct-point { - stroke-width: 8px; - stroke-linecap: round; -} - -.ct-line { - fill: none; - stroke-width: 3px; -} - -.ct-area { - stroke: none; - fill-opacity: 0.8; -} - -.ct-bar { - fill: none; - stroke-width: 10px; -} - -.ct-slice-donut { - fill: none; - stroke-width: 60px; -} - -.ct-series-a .ct-point, -.ct-series-a .ct-line, -.ct-series-a .ct-bar, -.ct-series-a .ct-slice-donut { - stroke: #1DC7EA; -} - -.ct-series-a .ct-slice-pie, -.ct-series-a .ct-area { - fill: #1DC7EA; -} - -.ct-series-b .ct-point, -.ct-series-b .ct-line, -.ct-series-b .ct-bar, -.ct-series-b .ct-slice-donut { - stroke: #FB404B; -} - -.ct-series-b .ct-slice-pie, -.ct-series-b .ct-area { - fill: #FB404B; -} - -.ct-series-c .ct-point, -.ct-series-c .ct-line, -.ct-series-c .ct-bar, -.ct-series-c .ct-slice-donut { - stroke: #FFA534; -} - -.ct-series-c .ct-slice-pie, -.ct-series-c .ct-area { - fill: #FFA534; -} - -.ct-series-d .ct-point, -.ct-series-d .ct-line, -.ct-series-d .ct-bar, -.ct-series-d .ct-slice-donut { - stroke: #9368E9; -} - -.ct-series-d .ct-slice-pie, -.ct-series-d .ct-area { - fill: #9368E9; -} - -.ct-series-e .ct-point, -.ct-series-e .ct-line, -.ct-series-e .ct-bar, -.ct-series-e .ct-slice-donut { - stroke: #87CB16; -} - -.ct-series-e .ct-slice-pie, -.ct-series-e .ct-area { - fill: #87CB16; -} - -.ct-series-f .ct-point, -.ct-series-f .ct-line, -.ct-series-f .ct-bar, -.ct-series-f .ct-slice-donut { - stroke: #1F77D0; -} - -.ct-series-f .ct-slice-pie, -.ct-series-f .ct-area { - fill: #1F77D0; -} - -.ct-series-g .ct-point, -.ct-series-g .ct-line, -.ct-series-g .ct-bar, -.ct-series-g .ct-slice-donut { - stroke: #5e5e5e; -} - -.ct-series-g .ct-slice-pie, -.ct-series-g .ct-area { - fill: #5e5e5e; -} - -.ct-series-h .ct-point, -.ct-series-h .ct-line, -.ct-series-h .ct-bar, -.ct-series-h .ct-slice-donut { - stroke: #dd4b39; -} - -.ct-series-h .ct-slice-pie, -.ct-series-h .ct-area { - fill: #dd4b39; -} - -.ct-series-i .ct-point, -.ct-series-i .ct-line, -.ct-series-i .ct-bar, -.ct-series-i .ct-slice-donut { - stroke: #35465c; -} - -.ct-series-i .ct-slice-pie, -.ct-series-i .ct-area { - fill: #35465c; -} - -.ct-series-j .ct-point, -.ct-series-j .ct-line, -.ct-series-j .ct-bar, -.ct-series-j .ct-slice-donut { - stroke: #e52d27; -} - -.ct-series-j .ct-slice-pie, -.ct-series-j .ct-area { - fill: #e52d27; -} - -.ct-series-k .ct-point, -.ct-series-k .ct-line, -.ct-series-k .ct-bar, -.ct-series-k .ct-slice-donut { - stroke: #55acee; -} - -.ct-series-k .ct-slice-pie, -.ct-series-k .ct-area { - fill: #55acee; -} - -.ct-series-l .ct-point, -.ct-series-l .ct-line, -.ct-series-l .ct-bar, -.ct-series-l .ct-slice-donut { - stroke: #cc2127; -} - -.ct-series-l .ct-slice-pie, -.ct-series-l .ct-area { - fill: #cc2127; -} - -.ct-series-m .ct-point, -.ct-series-m .ct-line, -.ct-series-m .ct-bar, -.ct-series-m .ct-slice-donut { - stroke: #1769ff; -} - -.ct-series-m .ct-slice-pie, -.ct-series-m .ct-area { - fill: #1769ff; -} - -.ct-series-n .ct-point, -.ct-series-n .ct-line, -.ct-series-n .ct-bar, -.ct-series-n .ct-slice-donut { - stroke: #6188e2; -} - -.ct-series-n .ct-slice-pie, -.ct-series-n .ct-area { - fill: #6188e2; -} - -.ct-series-o .ct-point, -.ct-series-o .ct-line, -.ct-series-o .ct-bar, -.ct-series-o .ct-slice-donut { - stroke: #a748ca; -} - -.ct-series-o .ct-slice-pie, -.ct-series-o .ct-area { - fill: #a748ca; -} - -.ct-square { - display: block; - position: relative; - width: 100%; -} - -.ct-square:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 100%; -} - -.ct-square:after { - content: ""; - display: table; - clear: both; -} - -.ct-square>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-minor-second { - display: block; - position: relative; - width: 100%; -} - -.ct-minor-second:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 93.75%; -} - -.ct-minor-second:after { - content: ""; - display: table; - clear: both; -} - -.ct-minor-second>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-major-second { - display: block; - position: relative; - width: 100%; -} - -.ct-major-second:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 88.88889%; -} - -.ct-major-second:after { - content: ""; - display: table; - clear: both; -} - -.ct-major-second>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-minor-third { - display: block; - position: relative; - width: 100%; -} - -.ct-minor-third:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 83.33333%; -} - -.ct-minor-third:after { - content: ""; - display: table; - clear: both; -} - -.ct-minor-third>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-major-third { - display: block; - position: relative; - width: 100%; -} - -.ct-major-third:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 80%; -} - -.ct-major-third:after { - content: ""; - display: table; - clear: both; -} - -.ct-major-third>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-perfect-fourth { - display: block; - position: relative; - width: 100%; -} - -.ct-perfect-fourth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 75%; -} - -.ct-perfect-fourth:after { - content: ""; - display: table; - clear: both; -} - -.ct-perfect-fourth>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-perfect-fifth { - display: block; - position: relative; - width: 100%; -} - -.ct-perfect-fifth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 66.66667%; -} - -.ct-perfect-fifth:after { - content: ""; - display: table; - clear: both; -} - -.ct-perfect-fifth>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-minor-sixth { - display: block; - position: relative; - width: 100%; -} - -.ct-minor-sixth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 62.5%; -} - -.ct-minor-sixth:after { - content: ""; - display: table; - clear: both; -} - -.ct-minor-sixth>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-golden-section { - display: block; - position: relative; - width: 100%; -} - -.ct-golden-section:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 61.8047%; -} - -.ct-golden-section:after { - content: ""; - display: table; - clear: both; -} - -.ct-golden-section>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-major-sixth { - display: block; - position: relative; - width: 100%; -} - -.ct-major-sixth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 60%; -} - -.ct-major-sixth:after { - content: ""; - display: table; - clear: both; -} - -.ct-major-sixth>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-minor-seventh { - display: block; - position: relative; - width: 100%; -} - -.ct-minor-seventh:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 56.25%; -} - -.ct-minor-seventh:after { - content: ""; - display: table; - clear: both; -} - -.ct-minor-seventh>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-major-seventh { - display: block; - position: relative; - width: 100%; -} - -.ct-major-seventh:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 53.33333%; -} - -.ct-major-seventh:after { - content: ""; - display: table; - clear: both; -} - -.ct-major-seventh>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-octave { - display: block; - position: relative; - width: 100%; -} - -.ct-octave:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 50%; -} - -.ct-octave:after { - content: ""; - display: table; - clear: both; -} - -.ct-octave>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-major-tenth { - display: block; - position: relative; - width: 100%; -} - -.ct-major-tenth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 40%; -} - -.ct-major-tenth:after { - content: ""; - display: table; - clear: both; -} - -.ct-major-tenth>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-major-eleventh { - display: block; - position: relative; - width: 100%; -} - -.ct-major-eleventh:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 37.5%; -} - -.ct-major-eleventh:after { - content: ""; - display: table; - clear: both; -} - -.ct-major-eleventh>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-major-twelfth { - display: block; - position: relative; - width: 100%; -} - -.ct-major-twelfth:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 33.33333%; -} - -.ct-major-twelfth:after { - content: ""; - display: table; - clear: both; -} - -.ct-major-twelfth>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -.ct-double-octave { - display: block; - position: relative; - width: 100%; -} - -.ct-double-octave:before { - display: block; - float: left; - content: ""; - width: 0; - height: 0; - padding-bottom: 25%; -} - -.ct-double-octave:after { - content: ""; - display: table; - clear: both; -} - -.ct-double-octave>svg { - display: block; - position: absolute; - top: 0; - left: 0; -} - -@media (min-width: 992px) { - .navbar-form { - margin-top: 21px; - margin-bottom: 21px; - padding-left: 5px; - padding-right: 5px; - } - .navbar-nav .nav-item .dropdown-menu, - .dropdown .dropdown-menu { - -webkit-transform: scale(0); - -moz-transform: scale(0); - -o-transform: scale(0); - -ms-transform: scale(0); - transform: scale(0); - -webkit-transition: all 370ms cubic-bezier(0.34, 1.61, 0.7, 1); - -moz-transition: all 370ms cubic-bezier(0.34, 1.61, 0.7, 1); - -o-transition: all 370ms cubic-bezier(0.34, 1.61, 0.7, 1); - -ms-transition: all 370ms cubic-bezier(0.34, 1.61, 0.7, 1); - transition: all 370ms cubic-bezier(0.34, 1.61, 0.7, 1); - } - .navbar-nav .nav-item.show .dropdown-menu, - .dropdown.show .dropdown-menu { - -webkit-transform: scale(1); - -moz-transform: scale(1); - -o-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - -webkit-transform-origin: 29px -50px; - -moz-transform-origin: 29px -50px; - -o-transform-origin: 29px -50px; - -ms-transform-origin: 29px -50px; - transform-origin: 29px -50px; - } - .footer { - height: 60px; - } - .footer .footer-menu { - float: left; - } - .footer .copyright { - float: right; - } - .navbar-nav .nav-item .dropdown-menu:before { - border-bottom: 11px solid rgba(0, 0, 0, 0.2); - border-left: 11px solid transparent; - border-right: 11px solid transparent; - content: ""; - display: inline-block; - position: absolute; - left: 12px; - top: -11px; - } - .navbar-nav .nav-item .dropdown-menu:after { - border-bottom: 11px solid #FFFFFF; - border-left: 11px solid transparent; - border-right: 11px solid transparent; - content: ""; - display: inline-block; - position: absolute; - left: 12px; - top: -10px; - } - .navbar-nav.navbar-right .nav-item .dropdown-menu:before { - left: auto; - right: 12px; - } - .navbar-nav.navbar-right .nav-item .dropdown-menu:after { - left: auto; - right: 12px; - } - .footer:not(.footer-big) nav>ul li:first-child { - margin-left: 0; - } - .card form [class*="col-"] { - padding: 6px; - } - .card form [class*="col-"]:first-child { - padding-left: 15px; - } - .card form [class*="col-"]:last-child { - padding-right: 15px; - } -} - -/* Changes for small display */ - -@media (max-width: 991px) { - .sidebar { - right: 0 !important; - left: auto; - position: absolute; - -webkit-transform: translate3d(282px, 0, 0); - -moz-transform: translate3d(282px, 0, 0); - -o-transform: translate3d(282px, 0, 0); - -ms-transform: translate3d(282px, 0, 0); - transform: translate3d(282px, 0, 0) !important; - -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - } - .nav-open .main-panel { - position: absolute; - left: 0; - -webkit-transform: translate3d(-250px, 0, 0); - -moz-transform: translate3d(-250px, 0, 0); - -o-transform: translate3d(-250px, 0, 0); - -ms-transform: translate3d(-250px, 0, 0); - transform: translate3d(-250px, 0, 0) !important; - -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - } - .nav-open .sidebar { - -webkit-transform: translate3d(10px, 0, 0); - -moz-transform: translate3d(10px, 0, 0); - -o-transform: translate3d(10px, 0, 0); - -ms-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0) !important; - -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - } - .main-panel { - -webkit-transform: translate3d(0px, 0, 0); - -moz-transform: translate3d(0px, 0, 0); - -o-transform: translate3d(0px, 0, 0); - -ms-transform: translate3d(0px, 0, 0); - transform: translate3d(0px, 0, 0) !important; - -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - } - .nav-item.active-pro { - position: relative !important; - } - .nav-mobile-menu { - border-bottom: 1px solid rgba(255, 255, 255, 0.2); - margin-bottom: 15px; - padding-bottom: 15px; - padding-top: 5px; - } - .nav-mobile-menu .dropdown .dropdown-menu { - position: static !important; - float: none; - width: auto; - color: #FFFFFF; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - -webkit-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -moz-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -o-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - -ms-transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - transition: all 0.5s cubic-bezier(0.685, 0.0473, 0.346, 1); - } - .nav-mobile-menu .dropdown .dropdown-menu .dropdown-item { - margin: 15px 45px 0px 100px; - border-radius: 4px; - color: #FFFFFF; - opacity: .86; - padding: 32px 150px; - } - .nav-mobile-menu .dropdown .dropdown-menu .dropdown-item:hover { - background-color: rgba(255, 255, 255, 0.23); - } - .nav-mobile-menu .nav-item .nav-link span { - display: inline-block !important; - } - .nav-mobile-menu .nav-item .nav-link .no-icon { - padding-left: 50px; - } - .main-panel { - width: 100%; - } - .navbar-brand { - padding: 15px 15px; - } - .navbar-transparent { - padding-top: 15px; - background-color: rgba(0, 0, 0, 0.45); - } - body { - position: relative; - } - .wrapper { - left: 0; - background-color: white; - } - .navbar .container { - left: 15px; - width: 100%; - position: relative; - top: -10px; - } - .navbar-nav .nav-item { - float: none; - position: relative; - display: block; - } - body>.navbar-collapse { - position: fixed; - display: block; - top: 0; - height: 100%; - right: 0; - left: auto; - z-index: 1032; - visibility: visible; - background-color: #999; - overflow-y: visible; - border-top: none; - text-align: left; - padding: 0; - -webkit-transform: translate3d(280px, 0, 0); - -moz-transform: translate3d(280px, 0, 0); - -o-transform: translate3d(280px, 0, 0); - -ms-transform: translate3d(280px, 0, 0); - transform: translate3d(280px, 0, 0); - -webkit-transition: all 0.33s cubic-bezier(0.685, 0.0473, 0.346, 1); - -moz-transition: all 0.33s cubic-bezier(0.685, 0.0473, 0.346, 1); - -o-transition: all 0.33s cubic-bezier(0.685, 0.0473, 0.346, 1); - -ms-transition: all 0.33s cubic-bezier(0.685, 0.0473, 0.346, 1); - transition: all 0.33s cubic-bezier(0.685, 0.0473, 0.346, 1); - } - body>.navbar-collapse>ul { - position: relative; - z-index: 4; - overflow-y: scroll; - height: calc(100vh - 61px); - width: 100%; - } - body>.navbar-collapse::before { - top: 0; - left: 0; - height: 100%; - width: 100%; - position: absolute; - background-color: #282828; - display: block; - content: ""; - z-index: 1; - } - body>.navbar-collapse .logo { - position: relative; - z-index: 4; - } - body>.navbar-collapse .nav li>a { - padding: 10px 15px; - } - .nav-show .navbar-collapse { - -webkit-transform: translate3d(0px, 0, 0); - -moz-transform: translate3d(0px, 0, 0); - -o-transform: translate3d(0px, 0, 0); - -ms-transform: translate3d(0px, 0, 0); - transform: translate3d(0px, 0, 0); - } - .nav-show .navbar .container { - left: -250px; - } - .nav-show .wrapper { - left: 0; - -webkit-transform: translate3d(-280px, 0, 0); - -moz-transform: translate3d(-280px, 0, 0); - -o-transform: translate3d(-280px, 0, 0); - -ms-transform: translate3d(-280px, 0, 0); - transform: translate3d(-280px, 0, 0); - } - .navbar-toggle .icon-bar { - display: block; - position: relative; - background: #fff; - width: 24px; - height: 2px; - border-radius: 1px; - margin: 0 auto; - } - .navbar-header .navbar-toggle { - margin: 10px 15px 10px 0; - width: 40px; - height: 40px; - } - .bar1, - .bar2, - .bar3 { - outline: 1px solid transparent; - } - .bar1 { - top: 0px; - -webkit-animation: topbar-back 500ms linear 0s; - -moz-animation: topbar-back 500ms linear 0s; - animation: topbar-back 500ms 0s; - -webkit-animation-fill-mode: forwards; - -moz-animation-fill-mode: forwards; - animation-fill-mode: forwards; - } - .bar2 { - opacity: 1; - } - .bar3 { - bottom: 0px; - -webkit-animation: bottombar-back 500ms linear 0s; - -moz-animation: bottombar-back 500ms linear 0s; - animation: bottombar-back 500ms 0s; - -webkit-animation-fill-mode: forwards; - -moz-animation-fill-mode: forwards; - animation-fill-mode: forwards; - } - .toggled .bar1 { - top: 6px; - -webkit-animation: topbar-x 500ms linear 0s; - -moz-animation: topbar-x 500ms linear 0s; - animation: topbar-x 500ms 0s; - -webkit-animation-fill-mode: forwards; - -moz-animation-fill-mode: forwards; - animation-fill-mode: forwards; - } - .toggled .bar2 { - opacity: 0; - } - .toggled .bar3 { - bottom: 6px; - -webkit-animation: bottombar-x 500ms linear 0s; - -moz-animation: bottombar-x 500ms linear 0s; - animation: bottombar-x 500ms 0s; - -webkit-animation-fill-mode: forwards; - -moz-animation-fill-mode: forwards; - animation-fill-mode: forwards; - } - @keyframes topbar-x { - 0% { - top: 0px; - transform: rotate(0deg); - } - 45% { - top: 6px; - transform: rotate(145deg); - } - 75% { - transform: rotate(130deg); - } - 100% { - transform: rotate(135deg); - } - } - @-webkit-keyframes topbar-x { - 0% { - top: 0px; - -webkit-transform: rotate(0deg); - } - 45% { - top: 6px; - -webkit-transform: rotate(145deg); - } - 75% { - -webkit-transform: rotate(130deg); - } - 100% { - -webkit-transform: rotate(135deg); - } - } - @-moz-keyframes topbar-x { - 0% { - top: 0px; - -moz-transform: rotate(0deg); - } - 45% { - top: 6px; - -moz-transform: rotate(145deg); - } - 75% { - -moz-transform: rotate(130deg); - } - 100% { - -moz-transform: rotate(135deg); - } - } - @keyframes topbar-back { - 0% { - top: 6px; - transform: rotate(135deg); - } - 45% { - transform: rotate(-10deg); - } - 75% { - transform: rotate(5deg); - } - 100% { - top: 0px; - transform: rotate(0); - } - } - @-webkit-keyframes topbar-back { - 0% { - top: 6px; - -webkit-transform: rotate(135deg); - } - 45% { - -webkit-transform: rotate(-10deg); - } - 75% { - -webkit-transform: rotate(5deg); - } - 100% { - top: 0px; - -webkit-transform: rotate(0); - } - } - @-moz-keyframes topbar-back { - 0% { - top: 6px; - -moz-transform: rotate(135deg); - } - 45% { - -moz-transform: rotate(-10deg); - } - 75% { - -moz-transform: rotate(5deg); - } - 100% { - top: 0px; - -moz-transform: rotate(0); - } - } - @keyframes bottombar-x { - 0% { - bottom: 0px; - transform: rotate(0deg); - } - 45% { - bottom: 6px; - transform: rotate(-145deg); - } - 75% { - transform: rotate(-130deg); - } - 100% { - transform: rotate(-135deg); - } - } - @-webkit-keyframes bottombar-x { - 0% { - bottom: 0px; - -webkit-transform: rotate(0deg); - } - 45% { - bottom: 6px; - -webkit-transform: rotate(-145deg); - } - 75% { - -webkit-transform: rotate(-130deg); - } - 100% { - -webkit-transform: rotate(-135deg); - } - } - @-moz-keyframes bottombar-x { - 0% { - bottom: 0px; - -moz-transform: rotate(0deg); - } - 45% { - bottom: 6px; - -moz-transform: rotate(-145deg); - } - 75% { - -moz-transform: rotate(-130deg); - } - 100% { - -moz-transform: rotate(-135deg); - } - } - @keyframes bottombar-back { - 0% { - bottom: 6px; - transform: rotate(-135deg); - } - 45% { - transform: rotate(10deg); - } - 75% { - transform: rotate(-5deg); - } - 100% { - bottom: 0px; - transform: rotate(0); - } - } - @-webkit-keyframes bottombar-back { - 0% { - bottom: 6px; - -webkit-transform: rotate(-135deg); - } - 45% { - -webkit-transform: rotate(10deg); - } - 75% { - -webkit-transform: rotate(-5deg); - } - 100% { - bottom: 0px; - -webkit-transform: rotate(0); - } - } - @-moz-keyframes bottombar-back { - 0% { - bottom: 6px; - -moz-transform: rotate(-135deg); - } - 45% { - -moz-transform: rotate(10deg); - } - 75% { - -moz-transform: rotate(-5deg); - } - 100% { - bottom: 0px; - -moz-transform: rotate(0); - } - } - @-webkit-keyframes fadeIn { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } - } - @-moz-keyframes fadeIn { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } - } - @keyframes fadeIn { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } - } - .dropdown-menu .divider { - background-color: rgba(229, 229, 229, 0.15); - } - .navbar-nav { - margin: 1px 0; - } - .navbar-nav .show .dropdown-menu .nav-item .nav-link { - padding: 10px 15px 10px 60px; - } - [class*="navbar-"] .navbar-nav>li>a, - [class*="navbar-"] .navbar-nav>li>a:hover, - [class*="navbar-"] .navbar-nav>li>a:focus, - [class*="navbar-"] .navbar-nav .active>a, - [class*="navbar-"] .navbar-nav .active>a:hover, - [class*="navbar-"] .navbar-nav .active>a:focus, - [class*="navbar-"] .navbar-nav .show .dropdown-menu>li>a, - [class*="navbar-"] .navbar-nav .show .dropdown-menu>li>a:hover, - [class*="navbar-"] .navbar-nav .show .dropdown-menu>li>a:focus, - [class*="navbar-"] .navbar-nav .show .dropdown-menu>li>a:active { - color: white; - } - [class*="navbar-"] .navbar-nav>li>a, - [class*="navbar-"] .navbar-nav>li>a:hover, - [class*="navbar-"] .navbar-nav>li>a:focus { - opacity: .7; - background-color: transparent; - outline: none; - } - [class*="navbar-"] .navbar-nav .show .dropdown-menu>li>a:hover, - [class*="navbar-"] .navbar-nav .show .dropdown-menu>li>a:focus { - background-color: rgba(255, 255, 255, 0.1); - } - [class*="navbar-"] .navbar-nav.navbar-nav .show .dropdown-menu>li>a:active { - opacity: 1; - } - [class*="navbar-"] .navbar-nav .dropdown>a:hover .caret { - border-bottom-color: #fff; - border-top-color: #fff; - } - [class*="navbar-"] .navbar-nav .dropdown>a:active .caret { - border-bottom-color: white; - border-top-color: white; - } - .dropdown-menu { - display: none; - } - .navbar-fixed-top { - -webkit-backface-visibility: hidden; - } - #bodyClick { - height: 100%; - width: 100%; - position: fixed; - opacity: 0; - top: 0; - left: auto; - right: 250px; - content: ""; - z-index: 9999; - overflow-x: hidden; - } - .social-line .btn { - margin: 0 0 10px 0; - } - .subscribe-line .form-control { - margin: 0 0 10px 0; - } - .social-line.pull-right { - float: none; - } - .social-area.pull-right { - float: none !important; - } - .form-control+.form-control-feedback { - margin-top: -8px; - } - .navbar-toggle:hover, - .navbar-toggle:focus { - background-color: transparent !important; - } - .btn.dropdown-toggle { - margin-bottom: 0; - } - .media-post .author { - width: 20%; - float: none !important; - display: block; - margin: 0 auto 10px; - } - .media-post .media-body { - width: 100%; - } - .navbar-collapse.collapse { - height: 100% !important; - } - .navbar-collapse.collapse.in { - display: block; - } - .navbar-header .collapse, - .navbar-toggle { - display: block !important; - } - .navbar-header { - float: none; - } - .navbar-nav .show .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse .navbar-nav p { - line-height: 40px !important; - margin: 0; - } - .navbar-collapse [class^="pe-7s-"] { - float: left; - font-size: 20px; - margin-right: 10px; - } -} - -@media (min-width: 992px) { - .table-full-width { - margin-left: -15px; - margin-right: -15px; - } - .table-responsive { - overflow: visible; - } -} - -@media (max-width: 991px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: scroll; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - -webkit-overflow-scrolling: touch; - } -} - -.bootstrap-switch { - display: inline-block; - direction: ltr; - cursor: pointer; - border-radius: 30px; - border: 0; - position: relative; - text-align: left; - overflow: hidden; - margin-bottom: 5px; - margin-left: 66px; - line-height: 8px; - width: 61px !important; - height: 26px; - outline: none; - z-index: 0; - margin-right: 1px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - vertical-align: middle; - -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} - -.bootstrap-switch .bootstrap-switch-container { - display: inline-flex; - top: 0; - height: 26px; - border-radius: 4px; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - width: 100px !important; -} - -.bootstrap-switch .bootstrap-switch-handle-on, -.bootstrap-switch .bootstrap-switch-handle-off, -.bootstrap-switch .bootstrap-switch-label { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer; - display: inline-block !important; - height: 100%; - color: #fff; - padding: 6px 10px; - font-size: 11px; - text-indent: -5px; - line-height: 15px; - -webkit-transition: 0.25s ease-out; - transition: 0.25s ease-out; -} - -.bootstrap-switch .bootstrap-switch-handle-on i, -.bootstrap-switch .bootstrap-switch-handle-off i, -.bootstrap-switch .bootstrap-switch-label i { - font-size: 12px; - line-height: 14px; -} - -.bootstrap-switch .bootstrap-switch-handle-on, -.bootstrap-switch .bootstrap-switch-handle-off { - text-align: center; - z-index: 1; - float: left; - width: 50% !important; - background-color: #1DC7EA; -} - -.bootstrap-switch .bootstrap-switch-label { - text-align: center; - z-index: 100; - color: #333333; - background: #ffffff; - width: 22px !important; - height: 22px; - margin: 2px -11px; - border-radius: 12px; - position: relative; - float: left; - padding: 0; - background-color: #FFFFFF; - box-shadow: 0 1px 1px #FFFFFF inset, 0 1px 1px rgba(0, 0, 0, 0.25); -} - -.bootstrap-switch .bootstrap-switch-handle-on { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.bootstrap-switch .bootstrap-switch-handle-off { - text-indent: 6px; -} - -.bootstrap-switch input[type='radio'], -.bootstrap-switch input[type='checkbox'] { - position: absolute !important; - top: 0; - left: 0; - opacity: 0; - filter: alpha(opacity=0); - z-index: -1; -} - -.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container { - -webkit-transition: margin-left 0.5s; - transition: margin-left 0.5s; -} - -.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-container { - margin-left: -2px !important; -} - -.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-container { - margin-left: -37px !important; -} - -.bootstrap-switch.bootstrap-switch-on:hover .bootstrap-switch-label { - width: 26px !important; - margin: 2px -15px; -} - -.bootstrap-switch.bootstrap-switch-off:hover .bootstrap-switch-label { - width: 26px !important; - margin: 2px -15px -13px -11px; -} - -/*-------------------------------- - -nucleo-icons Web Font - built using nucleoapp.com -License - nucleoapp.com/license/ - --------------------------------- */ - -@font-face { - font-family: 'nucleo-icons'; - src: url("../fonts/nucleo-icons.eot"); - src: url("../fonts/nucleo-icons.eot") format("embedded-opentype"), url("../fonts/nucleo-icons.woff2") format("woff2"), url("../fonts/nucleo-icons.woff") format("woff"), url("../fonts/nucleo-icons.ttf") format("truetype"), url("../fonts/nucleo-icons.svg") format("svg"); - font-weight: normal; - font-style: normal; -} - -/*------------------------ - base class definition --------------------------*/ - -.nc-icon { - display: inline-block; - font: normal normal normal 14px/1 'nucleo-icons'; - font-size: inherit; - speak: none; - text-transform: none; - /* Better Font Rendering */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -/*------------------------ - change icon size --------------------------*/ - -.nc-icon.lg { - font-size: 1.33333333em; - vertical-align: -16%; -} - -.nc-icon.x2 { - font-size: 2em; -} - -.nc-icon.x3 { - font-size: 3em; -} - -/*---------------------------------- - add a square/circle background ------------------------------------*/ - -.nc-icon.square, -.nc-icon.circle { - padding: 0.33333333em; - vertical-align: -16%; - background-color: #eee; -} - -.nc-icon.circle { - border-radius: 50%; -} - -/*------------------------ - list icons --------------------------*/ - -.nc-icon-ul { - padding-left: 0; - margin-left: 2.14285714em; - list-style-type: none; -} - -.nc-icon-ul>li { - position: relative; -} - -.nc-icon-ul>li>.nc-icon { - position: absolute; - left: -1.57142857em; - top: 0.14285714em; - text-align: center; -} - -.nc-icon-ul>li>.nc-icon.lg { - top: 0; - left: -1.35714286em; -} - -.nc-icon-ul>li>.nc-icon.circle, -.nc-icon-ul>li>.nc-icon.square { - top: -0.19047619em; - left: -1.9047619em; -} - -.all-icons .font-icon-list .font-icon-detail i { - font-size: 32px; -} - -/*------------------------ - spinning icons --------------------------*/ - -.nc-icon.spin { - -webkit-animation: nc-icon-spin 2s infinite linear; - -moz-animation: nc-icon-spin 2s infinite linear; - animation: nc-icon-spin 2s infinite linear; -} - -@-webkit-keyframes nc-icon-spin { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - } -} - -@-moz-keyframes nc-icon-spin { - 0% { - -moz-transform: rotate(0deg); - } - 100% { - -moz-transform: rotate(360deg); - } -} - -@keyframes nc-icon-spin { - 0% { - -webkit-transform: rotate(0deg); - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -o-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - -moz-transform: rotate(360deg); - -ms-transform: rotate(360deg); - -o-transform: rotate(360deg); - transform: rotate(360deg); - } -} - -/*------------------------ - rotated/flipped icons --------------------------*/ - -.nc-icon.rotate-90 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); - -webkit-transform: rotate(90deg); - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -o-transform: rotate(90deg); - transform: rotate(90deg); -} - -.nc-icon.rotate-180 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); - -webkit-transform: rotate(180deg); - -moz-transform: rotate(180deg); - -ms-transform: rotate(180deg); - -o-transform: rotate(180deg); - transform: rotate(180deg); -} - -.nc-icon.rotate-270 { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); - -webkit-transform: rotate(270deg); - -moz-transform: rotate(270deg); - -ms-transform: rotate(270deg); - -o-transform: rotate(270deg); - transform: rotate(270deg); -} - -.nc-icon.flip-y { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0); - -webkit-transform: scale(-1, 1); - -moz-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - -o-transform: scale(-1, 1); - transform: scale(-1, 1); -} - -.nc-icon.flip-x { - filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); - -webkit-transform: scale(1, -1); - -moz-transform: scale(1, -1); - -ms-transform: scale(1, -1); - -o-transform: scale(1, -1); - transform: scale(1, -1); -} - -/*------------------------ - font icons --------------------------*/ - -.nc-air-baloon::before { - content: "\ea01"; -} - -.nc-album-2::before { - content: "\ea02"; -} - -.nc-alien-33::before { - content: "\ea03"; -} - -.nc-align-center::before { - content: "\ea04"; -} - -.nc-align-left-2::before { - content: "\ea05"; -} - -.nc-ambulance::before { - content: "\ea06"; -} - -.nc-android::before { - content: "\ea07"; -} - -.nc-app::before { - content: "\ea08"; -} - -.nc-apple::before { - content: "\ea09"; -} - -.nc-atom::before { - content: "\ea0a"; -} - -.nc-attach-87::before { - content: "\ea0b"; -} - -.nc-audio-92::before { - content: "\ea0c"; -} - -.nc-backpack::before { - content: "\ea0d"; -} - -.nc-badge::before { - content: "\ea0e"; -} - -.nc-bag::before { - content: "\ea0f"; -} - -.nc-bank::before { - content: "\ea10"; -} - -.nc-battery-81::before { - content: "\ea11"; -} - -.nc-bell-55::before { - content: "\ea12"; -} - -.nc-bold::before { - content: "\ea13"; -} - -.nc-bulb-63::before { - content: "\ea14"; -} - -.nc-bullet-list-67::before { - content: "\ea15"; -} - -.nc-bus-front-12::before { - content: "\ea16"; -} - -.nc-button-pause::before { - content: "\ea17"; -} - -.nc-button-play::before { - content: "\ea18"; -} - -.nc-button-power::before { - content: "\ea19"; -} - -.nc-camera-20::before { - content: "\ea1a"; -} - -.nc-caps-small::before { - content: "\ea1b"; -} - -.nc-cart-simple::before { - content: "\ea1c"; -} - -.nc-cctv::before { - content: "\ea1d"; -} - -.nc-chart-bar-32::before { - content: "\ea1e"; -} - -.nc-chart-pie-35::before { - content: "\ea1f"; -} - -.nc-chart-pie-36::before { - content: "\ea20"; -} - -.nc-chart::before { - content: "\ea21"; -} - -.nc-chat-round::before { - content: "\ea22"; -} - -.nc-check-2::before { - content: "\ea23"; -} - -.nc-circle-09::before { - content: "\ea24"; -} - -.nc-circle::before { - content: "\ea25"; -} - -.nc-cloud-download-93::before { - content: "\ea26"; -} - -.nc-cloud-upload-94::before { - content: "\ea27"; -} - -.nc-compass-05::before { - content: "\ea28"; -} - -.nc-controller-modern::before { - content: "\ea29"; -} - -.nc-credit-card::before { - content: "\ea2a"; -} - -.nc-delivery-fast::before { - content: "\ea2b"; -} - -.nc-email-83::before { - content: "\ea2c"; -} - -.nc-email-85::before { - content: "\ea2d"; -} - -.nc-explore-2::before { - content: "\ea2e"; -} - -.nc-fav-remove::before { - content: "\ea2f"; -} - -.nc-favourite-28::before { - content: "\ea30"; -} - -.nc-globe-2::before { - content: "\ea31"; -} - -.nc-grid-45::before { - content: "\ea32"; -} - -.nc-headphones-2::before { - content: "\ea33"; -} - -.nc-html5::before { - content: "\ea34"; -} - -.nc-istanbul::before { - content: "\ea35"; -} - -.nc-key-25::before { - content: "\ea36"; -} - -.nc-layers-3::before { - content: "\ea37"; -} - -.nc-light-3::before { - content: "\ea38"; -} - -.nc-lock-circle-open::before { - content: "\ea39"; -} - -.nc-map-big::before { - content: "\ea3a"; -} - -.nc-mobile::before { - content: "\ea3c"; -} - -.nc-money-coins::before { - content: "\ea3b"; -} - -.nc-note-03::before { - content: "\ea3d"; -} - -.nc-notes::before { - content: "\ea3e"; -} - -.nc-notification-70::before { - content: "\ea3f"; -} - -.nc-palette::before { - content: "\ea40"; -} - -.nc-paper-2::before { - content: "\ea41"; -} - -.nc-pin-3::before { - content: "\ea42"; -} - -.nc-planet::before { - content: "\ea43"; -} - -.nc-preferences-circle-rotate::before { - content: "\ea44"; -} - -.nc-puzzle-10::before { - content: "\ea45"; -} - -.nc-quote::before { - content: "\ea46"; -} - -.nc-refresh-02::before { - content: "\ea47"; -} - -.nc-ruler-pencil::before { - content: "\ea48"; -} - -.nc-satisfied::before { - content: "\ea49"; -} - -.nc-scissors::before { - content: "\ea4a"; -} - -.nc-send::before { - content: "\ea4b"; -} - -.nc-settings-90::before { - content: "\ea4c"; -} - -.nc-settings-gear-64::before { - content: "\ea4d"; -} - -.nc-settings-tool-66::before { - content: "\ea4e"; -} - -.nc-simple-add::before { - content: "\ea4f"; -} - -.nc-simple-delete::before { - content: "\ea50"; -} - -.nc-simple-remove::before { - content: "\ea51"; -} - -.nc-single-02::before { - content: "\ea52"; -} - -.nc-single-copy-04::before { - content: "\ea53"; -} - -.nc-spaceship::before { - content: "\ea54"; -} - -.nc-square-pin::before { - content: "\ea55"; -} - -.nc-stre-down::before { - content: "\ea56"; -} - -.nc-stre-left::before { - content: "\ea57"; -} - -.nc-stre-right::before { - content: "\ea58"; -} - -.nc-stre-up::before { - content: "\ea59"; -} - -.nc-sun-fog-29::before { - content: "\ea5a"; -} - -.nc-support-17::before { - content: "\ea5b"; -} - -.nc-tablet-2::before { - content: "\ea5c"; -} - -.nc-tag-content::before { - content: "\ea5d"; -} - -.nc-tap-01::before { - content: "\ea5e"; -} - -.nc-time-alarm::before { - content: "\ea5f"; -} - -.nc-tv-2::before { - content: "\ea60"; -} - -.nc-umbrella-13::before { - content: "\ea61"; -} - -.nc-vector::before { - content: "\ea62"; -} - -.nc-watch-time::before { - content: "\ea63"; -} - -.nc-zoom-split::before { - content: "\ea64"; -} - -/* all icon font classes list here */ diff --git a/public/assets/css/main.css b/public/assets/css/main.css deleted file mode 100644 index a1da5d8..0000000 --- a/public/assets/css/main.css +++ /dev/null @@ -1,709 +0,0 @@ - - - - -/*////////////////////////////////////////////////////////////////// -[ FONT ]*/ - -@font-face { - font-family: Poppins-Regular; - src: url('../fonts/poppins/Poppins-Regular.ttf'); -} - -@font-face { - font-family: Poppins-Medium; - src: url('../fonts/poppins/Poppins-Medium.ttf'); -} - -@font-face { - font-family: Poppins-Bold; - src: url('../fonts/poppins/Poppins-Bold.ttf'); -} - -@font-face { - font-family: Poppins-SemiBold; - src: url('../fonts/poppins/Poppins-SemiBold.ttf'); -} - - - - -/*////////////////////////////////////////////////////////////////// -[ RESTYLE TAG ]*/ - -* { - margin: 0px; - padding: 0px; - box-sizing: border-box; -} - -body, html { - height: 100%; - font-family: Poppins-Regular, sans-serif; -} - -/*---------------------------------------------*/ -a { - font-family: Poppins-Regular; - font-size: 14px; - line-height: 1.7; - color: #666666; - margin: 0px; - transition: all 0.4s; - -webkit-transition: all 0.4s; - -o-transition: all 0.4s; - -moz-transition: all 0.4s; -} - -a:focus { - outline: none !important; -} - -a:hover { - text-decoration: none; - color: #fff; -} - -/*---------------------------------------------*/ -h1,h2,h3,h4,h5,h6 { - margin: 0px; -} - -p { - font-family: Poppins-Regular; - font-size: 14px; - line-height: 1.7; - color: #666666; - margin: 0px; -} - -ul, li { - margin: 0px; - list-style-type: none; -} - - -/*---------------------------------------------*/ -input { - outline: none; - border: none; -} - -textarea { - outline: none; - border: none; -} - -textarea:focus, input:focus { - border-color: transparent !important; -} - -input:focus::-webkit-input-placeholder { color:transparent; } -input:focus:-moz-placeholder { color:transparent; } -input:focus::-moz-placeholder { color:transparent; } -input:focus:-ms-input-placeholder { color:transparent; } - -textarea:focus::-webkit-input-placeholder { color:transparent; } -textarea:focus:-moz-placeholder { color:transparent; } -textarea:focus::-moz-placeholder { color:transparent; } -textarea:focus:-ms-input-placeholder { color:transparent; } - -input::-webkit-input-placeholder { color: #fff;} -input:-moz-placeholder { color: #fff;} -input::-moz-placeholder { color: #fff;} -input:-ms-input-placeholder { color: #fff;} - -textarea::-webkit-input-placeholder { color: #fff;} -textarea:-moz-placeholder { color: #fff;} -textarea::-moz-placeholder { color: #fff;} -textarea:-ms-input-placeholder { color: #fff;} - -label { - margin: 0; - display: block; -} - -/*---------------------------------------------*/ -button { - outline: none !important; - border: none; - background: transparent; -} - -button:hover { - cursor: pointer; -} - -iframe { - border: none !important; -} - - -/*////////////////////////////////////////////////////////////////// -[ Utility ]*/ -.txt1 { - font-family: Poppins-Regular; - font-size: 13px; - color: #e5e5e5; - line-height: 1.5; -} - - -/*////////////////////////////////////////////////////////////////// -[ login ]*/ - -.limiter { - width: 100%; - margin: 0 auto; -} - -.container-login100 { - width: 100%; - min-height: 100vh; - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - flex-wrap: wrap; - justify-content: center; - align-items: center; - padding: 15px; - - background-repeat: no-repeat; - background-position: center; - background-size: cover; - position: relative; - z-index: 1; -} - -.container-login100::before { - content: ""; - display: block; - position: absolute; - z-index: -1; - width: 100%; - height: 100%; - top: 0; - left: 0; - background-color: rgba(255,255,255,0.9); -} - -.wrap-login100 { - width: 500px; - border-radius: 10px; - overflow: hidden; - padding: 55px 55px 37px 55px; - - background: #9152f8; - background: -webkit-linear-gradient(top, #7579ff, #b224ef); - background: -o-linear-gradient(top, #7579ff, #b224ef); - background: -moz-linear-gradient(top, #7579ff, #b224ef); - background: linear-gradient(top, #7579ff, #b224ef); -} - -.wrap-login100-su { - width: 1500px; - border-radius: 10px; - overflow: hidden; - padding: 55px 55px 37px 55px; - - background: #9152f8; - background: -webkit-linear-gradient(top, #7579ff, #b224ef); - background: -o-linear-gradient(top, #7579ff, #b224ef); - background: -moz-linear-gradient(top, #7579ff, #b224ef); - background: linear-gradient(top, #7579ff, #b224ef); -} -.wrap-login100-re { - width: 800px; - border: 20px solid #969696; - background:white; - margin: 10px; - overflow: hidden; - padding: 40px 40px 32px 40px; - - -} - - - - - -/*------------------------------------------------------------------ -[ Form ]*/ - -.login100-form { - width: 100%; -} - -.login100-form-logo { - font-size: 60px; - color: #333333; - - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: center; - align-items: center; - width: 120px; - height: 120px; - border-radius: 50%; - background-color: #fff; - margin: 0 auto; -} - -.login100-form-title { - font-family: Poppins-Medium; - font-size: 30px; - color: #fff; - line-height: 1.2; - text-align: center; - text-transform: uppercase; - - display: block; -} - - -/*------------------------------------------------------------------ -[ Input ]*/ - -.wrap-input100 { - width: 100%; - position: relative; - border-bottom: 2px solid rgba(255,255,255,0.24); - margin-bottom: 30px; -} - -.input100 { - font-family: Poppins-Regular; - font-size: 16px; - color: rgb(214, 194, 194); - line-height: 1.2; - - display: block; - width: 100%; - height: 45px; - background: transparent; - padding: 0 5px 0 38px; -} -.input10 { - font-family:Arial, Helvetica, sans-serif; - font-size: 14px; - color: green; - line-height: 1; - background: transparent; - width: 40%; - height: 15px; - padding: 0 5px 0 38px; - -} -.wrap-input10 { - width: 32%; - position: relative; - border-bottom: 2px solid rgba(22, 14, 14, 0.24); - margin-bottom: 10px; -} -.input11 { - font-family:Arial, Helvetica, sans-serif; - font-size: 14px; - color: green; - line-height: 1; - background: transparent; - width: 50%; - height: 15px; - -} -.wrap-input11 { - width: 48%; - position: relative; - border-bottom: 2px solid rgba(22, 14, 14, 0.24); - margin-bottom: 10px; -} -.input12 { - font-family:Arial, Helvetica, sans-serif; - font-size: 14px; - color: green; - line-height: 1; - background: transparent; - width: 40%; - height: 15px; - padding: 0 5px 0 38px; - -} -.wrap-input12 { - width: 28%; - position: relative; - border-bottom: 2px solid rgba(22, 14, 14, 0.24); - margin-bottom: 10px; -} -.input13 { - font-family:Arial, Helvetica, sans-serif; - font-size: 14px; - color: green; - line-height: 1; - background: transparent; - width: 50%; - height: 15px; - -} -.wrap-input13 { - width: 74%; - position: relative; - border-bottom: 2px solid rgba(22, 14, 14, 0.24); - margin-bottom: 10px; -} - -.input14 { - font-family:Arial, Helvetica, sans-serif; - font-size: 14px; - color: green; - line-height: 1; - background: transparent; - width: 50%; - height: 15px; - -} -.wrap-input14 { - width: 65%; - position: relative; - border-bottom: 2px solid rgba(22, 14, 14, 0.24); - margin-bottom: 10px; -} -.input15 { - font-family:Arial, Helvetica, sans-serif; - font-size: 14px; - color: green; - line-height: 1; - background: transparent; - width: 50%; - height: 15px; - -} -.wrap-input15 { - width: 55%; - position: relative; - border-bottom: 2px solid rgba(22, 14, 14, 0.24); - margin-bottom: 10px; -} -.input16 { - font-family:Arial, Helvetica, sans-serif; - font-size: 14px; - color: green; - line-height: 1; - background: transparent; - width: 40%; - height: 15px; - padding: 0 5px 0 38px; - -} -.wrap-input16 { - width: 32%; - position: relative; - border-bottom: 2px solid rgba(22, 14, 14, 0.24); - margin-bottom: 10px; -} -.input17 { - font-family:Arial, Helvetica, sans-serif; - font-size: 14px; - color: green; - line-height: 1; - background: transparent; - width: 40%; - height: 15px; - padding: 0 5px 0 38px; - -} -.wrap-input17 { - width: 25%; - position: relative; - border-bottom: 2px solid rgba(22, 14, 14, 0.24); - margin-bottom: 10px; -} - -/*---------------------------------------------*/ -.focus-input100 { - position: absolute; - display: block; - width: 100%; - height: 100%; - top: 0; - left: 0; - pointer-events: none; -} - -.focus-input100::before { - content: ""; - display: block; - position: absolute; - bottom: -2px; - left: 0; - width: 0; - height: 2px; - - -webkit-transition: all 0.4s; - -o-transition: all 0.4s; - -moz-transition: all 0.4s; - transition: all 0.4s; - - background: #fff; -} - -.focus-input100::after { - font-family: Material-Design-Iconic-Font; - font-size: 22px; - color: #fff; - - content: attr(data-placeholder); - display: block; - width: 100%; - position: absolute; - top: 6px; - left: 0px; - padding-left: 5px; - - -webkit-transition: all 0.4s; - -o-transition: all 0.4s; - -moz-transition: all 0.4s; - transition: all 0.4s; -} - -.input100:focus { - padding-left: 5px; -} - -.input100:focus + .focus-input100::after { - top: -22px; - font-size: 18px; -} - -.input100:focus + .focus-input100::before { - width: 100%; -} - -.has-val.input100 + .focus-input100::after { - top: -22px; - font-size: 18px; -} - -.has-val.input100 + .focus-input100::before { - width: 100%; -} - -.has-val.input100 { - padding-left: 5px; -} - - -/*================================================================== -[ Restyle Checkbox ]*/ - -.contact100-form-checkbox { - padding-left: 5px; - padding-top: 5px; - padding-bottom: 35px; -} - -.input-checkbox100 { - display: none; -} - -.label-checkbox100 { - font-family: Poppins-Regular; - font-size: 13px; - color: #fff; - line-height: 1.2; - - display: block; - position: relative; - padding-left: 26px; - cursor: pointer; -} - -.label-checkbox100::before { - content: "\f26b"; - font-family: Material-Design-Iconic-Font; - font-size: 13px; - color: transparent; - - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: center; - align-items: center; - position: absolute; - width: 16px; - height: 16px; - border-radius: 2px; - background: #fff; - left: 0; - top: 50%; - -webkit-transform: translateY(-50%); - -moz-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); -} - -.input-checkbox100:checked + .label-checkbox100::before { - color: #555555; -} - - -/*------------------------------------------------------------------ -[ Button ]*/ -.container-login100-form-btn { - width: 100%; - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -.login100-form-btn { - font-family: Poppins-Medium; - font-size: 16px; - color: #555555; - line-height: 1.2; - - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: center; - align-items: center; - padding: 0 20px; - min-width: 120px; - height: 50px; - border-radius: 25px; - - background: #9152f8; - background: -webkit-linear-gradient(bottom, #7579ff, #b224ef); - background: -o-linear-gradient(bottom, #7579ff, #b224ef); - background: -moz-linear-gradient(bottom, #7579ff, #b224ef); - background: linear-gradient(bottom, #7579ff, #b224ef); - position: relative; - z-index: 1; - - -webkit-transition: all 0.4s; - -o-transition: all 0.4s; - -moz-transition: all 0.4s; - transition: all 0.4s; -} - -.login100-form-btn::before { - content: ""; - display: block; - position: absolute; - z-index: -1; - width: 100%; - height: 100%; - border-radius: 25px; - background-color: #fff; - top: 0; - left: 0; - opacity: 1; - - -webkit-transition: all 0.4s; - -o-transition: all 0.4s; - -moz-transition: all 0.4s; - transition: all 0.4s; -} - -.login100-form-btn:hover { - color: #fff; -} - -.login100-form-btn:hover:before { - opacity: 0; -} - - -/*------------------------------------------------------------------ -[ Responsive ]*/ - -@media (max-width: 576px) { - .wrap-login100 { - padding: 55px 15px 37px 15px; - } -} - - - -/*------------------------------------------------------------------ -[ Alert validate ]*/ - -.validate-input { - position: relative; -} - -.alert-validate::before { - content: attr(data-validate); - position: absolute; - max-width: 70%; - background-color: #fff; - border: 1px solid #c80000; - border-radius: 2px; - padding: 4px 25px 4px 10px; - top: 50%; - -webkit-transform: translateY(-50%); - -moz-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); - right: 0px; - pointer-events: none; - - font-family: Poppins-Regular; - color: #c80000; - font-size: 13px; - line-height: 1.4; - text-align: left; - - visibility: hidden; - opacity: 0; - - -webkit-transition: opacity 0.4s; - -o-transition: opacity 0.4s; - -moz-transition: opacity 0.4s; - transition: opacity 0.4s; -} - -.alert-validate::after { - content: "\f12a"; - font-family: FontAwesome; - font-size: 16px; - color: #c80000; - - display: block; - position: absolute; - top: 50%; - -webkit-transform: translateY(-50%); - -moz-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); - right: 5px; -} - -.alert-validate:hover:before { - visibility: visible; - opacity: 1; -} - -@media (max-width: 992px) { - .alert-validate::before { - visibility: visible; - opacity: 1; - } -} - - - diff --git a/public/assets/css/main.min.css b/public/assets/css/main.min.css deleted file mode 100644 index a85c922..0000000 --- a/public/assets/css/main.min.css +++ /dev/null @@ -1 +0,0 @@ -.daterangepicker,.select2-container--open .select2-dropdown--below{-webkit-box-shadow:0 8px 20px 0 rgba(0,0,0,.15);-moz-box-shadow:0 8px 20px 0 rgba(0,0,0,.15)}.font-robo{font-family:Roboto,Arial,"Helvetica Neue",sans-serif}.font-poppins{font-family:Poppins,Arial,"Helvetica Neue",sans-serif}.font-opensans,body{font-family:"Open Sans",Arial,"Helvetica Neue",sans-serif}.row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.row .col-2:last-child .input-group-desc{margin-bottom:0}.row-space{-webkit-box-pack:justify;-webkit-justify-content:space-between;-moz-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.row-refine{margin:0 -15px}.row-refine .col-3 .input-group-desc,.row-refine .col-9 .input-group-desc{margin-bottom:0}.col-2{width:-webkit-calc((100% - 30px)/ 2);width:-moz-calc((100% - 30px)/ 2);width:calc((100% - 30px)/ 2)}@media (max-width:767px){.col-2{width:100%}}.form-row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:40px}.form-row .name{width:125px;color:#555;font-size:15px;font-weight:700}body,h1,h2,h3,h4,h5,h6{font-weight:400}.form-row .value{width:-webkit-calc(100% - 125px);width:-moz-calc(100% - 125px);width:calc(100% - 125px)}@media (max-width:767px){.form-row{display:block}.form-row .name,.form-row .value{display:block;width:100%}.form-row .name{margin-bottom:7px}}.col-3,.col-9{padding:0 15px;position:relative;width:100%;min-height:1px}*,blockquote,body,dd,dl,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,legend,ol,p,pre,ul{margin:0;padding:0}.col-3{-webkit-box-flex:0;-webkit-flex:0 0 25%;-moz-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}@media (max-width:767px){.col-3{-webkit-box-flex:0;-webkit-flex:0 0 35%;-moz-box-flex:0;-ms-flex:0 0 35%;flex:0 0 35%;max-width:35%}}.col-9{-webkit-box-flex:0;-webkit-flex:0 0 75%;-moz-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}@media (max-width:767px){.col-9{-webkit-box-flex:0;-webkit-flex:0 0 65%;-moz-box-flex:0;-ms-flex:0 0 65%;flex:0 0 65%;max-width:65%}}html{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*,:after,:before{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}li>ol,li>ul{margin-bottom:0}table{border-collapse:collapse;border-spacing:0}fieldset{min-width:0;border:0}button{outline:0;background:0 0;border:none}.page-wrapper{min-height:100vh}body{font-size:14px}h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:18px}h5{font-size:15px}h6{font-size:13px}.bg-blue{background:#2c6ed5}.bg-red{background:#fa4251}.bg-gra-01{background:-webkit-gradient(linear,left bottom,left top,from(#fbc2eb),to(#a18cd1));background:-webkit-linear-gradient(bottom,#fbc2eb 0,#a18cd1 100%);background:-moz-linear-gradient(bottom,#fbc2eb 0,#a18cd1 100%);background:-o-linear-gradient(bottom,#fbc2eb 0,#a18cd1 100%);background:linear-gradient(to top,#fbc2eb 0,#a18cd1 100%)}.bg-gra-02{background:-webkit-gradient(linear,left bottom,right top,from(#fc2c77),to(#6c4079));background:-webkit-linear-gradient(bottom left,#fc2c77 0,#6c4079 100%);background:-moz-linear-gradient(bottom left,#fc2c77 0,#6c4079 100%);background:-o-linear-gradient(bottom left,#fc2c77 0,#6c4079 100%);background:linear-gradient(to top right,#fc2c77 0,#6c4079 100%)}.bg-gra-03{background:-webkit-gradient(linear,left bottom,right top,from(#08aeea),to(#b721ff));background:-webkit-linear-gradient(bottom left,#08aeea 0,#b721ff 100%);background:-moz-linear-gradient(bottom left,#08aeea 0,#b721ff 100%);background:-o-linear-gradient(bottom left,#08aeea 0,#b721ff 100%);background:linear-gradient(to top right,#08aeea 0,#b721ff 100%)}.p-t-100{padding-top:100px}.p-t-130{padding-top:130px}.p-t-180{padding-top:180px}.p-t-45{padding-top:45px}.p-t-20{padding-top:20px}.p-t-15{padding-top:15px}.p-t-10{padding-top:10px}.p-t-30{padding-top:30px}.p-b-100{padding-bottom:100px}.p-b-50{padding-bottom:50px}.m-r-45{margin-right:45px}.m-r-55{margin-right:55px}.m-b-55{margin-bottom:55px}.wrapper{margin:0 auto}.wrapper--w960{max-width:960px}.wrapper--w790{max-width:790px}.wrapper--w780{max-width:780px}.wrapper--w680{max-width:680px}.btn{display:inline-block;line-height:50px;padding:0 50px;-webkit-transition:all .4s ease;-o-transition:all .4s ease;-moz-transition:all .4s ease;transition:all .4s ease;cursor:pointer;font-size:15px;text-transform:uppercase;font-weight:700;color:#fff;font-family:inherit}.btn--radius{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn--radius-2{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn--pill{-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px}.btn--green{background:#57b846}.btn--green:hover{background:#4dae3c}.btn--blue{background:#4272d7}.btn--blue:hover{background:#3868cd}.btn--red{background:#ff4b5a}.btn--red:hover{background:#eb3746}td.active{background-color:#2c6ed5}input[type=datei]{padding:14px}.table-condensed td,.table-condensed th{font-size:14px;font-family:Roboto,Arial,"Helvetica Neue",sans-serif;font-weight:400}.label,.title{font-weight:700}.daterangepicker td{width:40px;height:30px}.daterangepicker{box-shadow:0 8px 20px 0 rgba(0,0,0,.15);display:none;border:1px solid #e0e0e0;margin-top:5px}.daterangepicker::after,.daterangepicker::before{display:none}.daterangepicker thead tr th{padding:10px 0}.daterangepicker .table-condensed th select{border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-size:14px;padding:5px;outline:0}input{outline:0;margin:0;border:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;width:100%;font-size:14px;font-family:inherit}.radio-container{display:inline-block;position:relative;padding-left:30px;cursor:pointer;font-size:16px;color:#666;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.radio-container input{position:absolute;opacity:0;cursor:pointer}.radio-container input:checked~.checkmark{background-color:#e5e5e5}.radio-container input:checked~.checkmark:after{display:block}.radio-container .checkmark:after{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:12px;height:12px;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;background:#57b846}.checkmark{position:absolute;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%);left:0;height:20px;width:20px;background-color:#e5e5e5;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;-webkit-box-shadow:inset 0 1px 3px 0 rgba(0,0,0,.08);-moz-box-shadow:inset 0 1px 3px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 3px 0 rgba(0,0,0,.08)}.checkmark:after{content:"";position:absolute;display:none}.input-group,.input-group-desc{position:relative}.input--style-5{background:#e5e5e5;line-height:50px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;padding:0 22px;font-size:16px;color:#555}@media (max-width:767px){.input-group-desc{margin-bottom:40px}}.input-group{margin:0}.label{color:#555;font-size:15px}.label--block{width:100%}.label--desc{position:absolute;text-transform:capitalize;display:block;color:#999;font-size:14px;margin:7px 0 0;left:0}.select--no-search .select2-search{display:none!important}.select2-container--open .select2-dropdown--below{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;box-shadow:0 8px 20px 0 rgba(0,0,0,.15);border:1px solid #e0e0e0;margin-top:5px;overflow:hidden}.select2-container--default .select2-results__option{padding-left:22px}.rs-select2 .select2-container{width:100%!important;outline:0;background:#e5e5e5;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.rs-select2 .select2-container .select2-selection--single{outline:0;border:none;height:50px;background:0 0}.card,.card-5{background:#fff}.rs-select2 .select2-container .select2-selection--single .select2-selection__rendered{line-height:50px;color:#555;font-size:16px;font-family:inherit;padding-left:22px;padding-right:50px}.rs-select2 .select2-container .select2-selection--single .select2-selection__arrow{height:50px;right:15px;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-moz-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center}.rs-select2 .select2-container .select2-selection--single .select2-selection__arrow b{display:none}.rs-select2 .select2-container .select2-selection--single .select2-selection__arrow:after{font-family:Material-Design-Iconic-Font;content:'\f2f9';font-size:24px;color:#999;-webkit-transition:all .4s ease;-o-transition:all .4s ease;-moz-transition:all .4s ease;transition:all .4s ease}.rs-select2 .select2-container.select2-container--open .select2-selection--single .select2-selection__arrow::after{-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);-o-transform:rotate(-180deg);transform:rotate(-180deg)}.title{font-size:24px;text-transform:uppercase;text-align:center;color:#fff}.card{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.card-5{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;-webkit-box-shadow:0 8px 20px 0 rgba(0,0,0,.15);-moz-box-shadow:0 8px 20px 0 rgba(0,0,0,.15);box-shadow:0 8px 20px 0 rgba(0,0,0,.15)}.card-5 .card-heading{padding:20px 0;background:#1a1a1a;-webkit-border-top-left-radius:10px;-moz-border-radius-topleft:10px;border-top-left-radius:10px;-webkit-border-top-right-radius:10px;-moz-border-radius-topright:10px;border-top-right-radius:10px}.card-5 .card-body{padding:52px 85px 73px}@media (max-width:767px){.card-5 .card-body{padding:40px 30px 50px}} \ No newline at end of file diff --git a/public/assets/css/main2.css b/public/assets/css/main2.css deleted file mode 100644 index 1fce14c..0000000 --- a/public/assets/css/main2.css +++ /dev/null @@ -1,780 +0,0 @@ - -/* ========================================================================== - #FONT - ========================================================================== */ -.font-robo { - font-family: "Roboto", "Arial", "Helvetica Neue", sans-serif; -} - -.font-poppins { - font-family: "Poppins", "Arial", "Helvetica Neue", sans-serif; -} - -.font-opensans { - font-family: "Open Sans", "Arial", "Helvetica Neue", sans-serif; -} - -/* ========================================================================== - #GRID - ========================================================================== */ -.row { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; -} - -.row .col-2:last-child .input-group-desc { - margin-bottom: 0; -} - -.row-space { - -webkit-box-pack: justify; - -webkit-justify-content: space-between; - -moz-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; -} - -.row-refine { - margin: 0 -15px; -} - -.row-refine .col-3 .input-group-desc, -.row-refine .col-9 .input-group-desc { - margin-bottom: 0; -} - -.col-2 { - width: -webkit-calc((100% - 30px) / 2); - width: -moz-calc((100% - 30px) / 2); - width: calc((100% - 30px) / 2); -} - -@media (max-width: 767px) { - .col-2 { - width: 100%; - } -} - -.form-row { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-wrap: wrap; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-align: center; - -webkit-align-items: center; - -moz-box-align: center; - -ms-flex-align: center; - align-items: center; - margin-bottom: 40px; -} - -.form-row .name { - width: 125px; - color: #555; - font-size: 15px; - font-weight: 700; -} - -.form-row .value { - width: -webkit-calc(100% - 125px); - width: -moz-calc(100% - 125px); - width: calc(100% - 125px); -} - -@media (max-width: 767px) { - .form-row { - display: block; - } - .form-row .name, - .form-row .value { - display: block; - width: 100%; - } - .form-row .name { - margin-bottom: 7px; - } -} - -.col-3, -.col-9 { - padding: 0 15px; - position: relative; - width: 100%; - min-height: 1px; -} - -.col-3 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 25%; - -moz-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25%; -} - -@media (max-width: 767px) { - .col-3 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 35%; - -moz-box-flex: 0; - -ms-flex: 0 0 35%; - flex: 0 0 35%; - max-width: 35%; - } -} - -.col-9 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 75%; - -moz-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75%; -} - -@media (max-width: 767px) { - .col-9 { - -webkit-box-flex: 0; - -webkit-flex: 0 0 65%; - -moz-box-flex: 0; - -ms-flex: 0 0 65%; - flex: 0 0 65%; - max-width: 65%; - } -} - -/* ========================================================================== - #BOX-SIZING - ========================================================================== */ -/** - * More sensible default box-sizing: - * css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice - */ -html { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -* { - padding: 0; - margin: 0; -} - -*, *:before, *:after { - -webkit-box-sizing: inherit; - -moz-box-sizing: inherit; - box-sizing: inherit; -} - -/* ========================================================================== - #RESET - ========================================================================== */ -/** - * A very simple reset that sits on top of Normalize.css. - */ -body, -h1, h2, h3, h4, h5, h6, -blockquote, p, pre, -dl, dd, ol, ul, -figure, -hr, -fieldset, legend { - margin: 0; - padding: 0; -} - -/** - * Remove trailing margins from nested lists. - */ -li > ol, -li > ul { - margin-bottom: 0; -} - -/** - * Remove default table spacing. - */ -table { - border-collapse: collapse; - border-spacing: 0; -} - -/** - * 1. Reset Chrome and Firefox behaviour which sets a `min-width: min-content;` - * on fieldsets. - */ -fieldset { - min-width: 0; - /* [1] */ - border: 0; -} - -button { - outline: none; - background: none; - border: none; -} - -/* ========================================================================== - #PAGE WRAPPER - ========================================================================== */ -.page-wrapper { - min-height: 100vh; -} - -body { - font-family: "Open Sans", "Arial", "Helvetica Neue", sans-serif; - font-weight: 400; - font-size: 14px; -} - -h1, h2, h3, h4, h5, h6 { - font-weight: 400; -} - -h1 { - font-size: 36px; -} - -h2 { - font-size: 30px; -} - -h3 { - font-size: 24px; -} - -h4 { - font-size: 18px; -} - -h5 { - font-size: 15px; -} - -h6 { - font-size: 13px; -} - -/* ========================================================================== - #BACKGROUND - ========================================================================== */ -.bg-blue { - background: #2c6ed5; -} - -.bg-red { - background: #fa4251; -} - -.bg-gra-01 { - background: -webkit-gradient(linear, left bottom, left top, from(#fbc2eb), to(#a18cd1)); - background: -webkit-linear-gradient(bottom, #fbc2eb 0%, #a18cd1 100%); - background: -moz-linear-gradient(bottom, #fbc2eb 0%, #a18cd1 100%); - background: -o-linear-gradient(bottom, #fbc2eb 0%, #a18cd1 100%); - background: linear-gradient(to top, #fbc2eb 0%, #a18cd1 100%); -} - -.bg-gra-02 { - background: -webkit-gradient(linear, left bottom, right top, from(#fc2c77), to(#6c4079)); - background: -webkit-linear-gradient(bottom left, #fc2c77 0%, #6c4079 100%); - background: -moz-linear-gradient(bottom left, #fc2c77 0%, #6c4079 100%); - background: -o-linear-gradient(bottom left, #fc2c77 0%, #6c4079 100%); - background: linear-gradient(to top right, #fc2c77 0%, #6c4079 100%); -} - -.bg-gra-03 { - background: -webkit-gradient(linear, left bottom, right top, from(#08aeea), to(#b721ff)); - background: -webkit-linear-gradient(bottom left, #08aeea 0%, #b721ff 100%); - background: -moz-linear-gradient(bottom left, #08aeea 0%, #b721ff 100%); - background: -o-linear-gradient(bottom left, #08aeea 0%, #b721ff 100%); - background: linear-gradient(to top right, #08aeea 0%, #b721ff 100%); -} - -/* ========================================================================== - #SPACING - ========================================================================== */ -.p-t-100 { - padding-top: 100px; -} - -.p-t-130 { - padding-top: 130px; -} - -.p-t-180 { - padding-top: 180px; -} - -.p-t-45 { - padding-top: 45px; -} - -.p-t-20 { - padding-top: 20px; -} - -.p-t-15 { - padding-top: 15px; -} - -.p-t-10 { - padding-top: 10px; -} - -.p-t-30 { - padding-top: 30px; -} - -.p-b-100 { - padding-bottom: 100px; -} - -.p-b-50 { - padding-bottom: 50px; -} - -.m-r-45 { - margin-right: 45px; -} - -.m-r-55 { - margin-right: 55px; -} - -.m-b-55 { - margin-bottom: 55px; -} - -/* ========================================================================== - #WRAPPER - ========================================================================== */ -.wrapper { - margin: 0 auto; -} - -.wrapper--w960 { - max-width: 960px; -} - -.wrapper--w790 { - max-width: 790px; -} - -.wrapper--w780 { - max-width: 780px; -} - -.wrapper--w680 { - max-width: 680px; -} - -/* ========================================================================== - #BUTTON - ========================================================================== */ -.btn { - display: inline-block; - line-height: 50px; - padding: 0 50px; - -webkit-transition: all 0.4s ease; - -o-transition: all 0.4s ease; - -moz-transition: all 0.4s ease; - transition: all 0.4s ease; - cursor: pointer; - font-size: 15px; - text-transform: uppercase; - font-weight: 700; - color: #fff; - font-family: inherit; -} - -.btn--radius { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn--radius-2 { - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.btn--pill { - -webkit-border-radius: 20px; - -moz-border-radius: 20px; - border-radius: 20px; -} - -.btn--green { - background: #57b846; -} - -.btn--green:hover { - background: #4dae3c; -} - -.btn--blue { - background: #4272d7; -} - -.btn--blue:hover { - background: #3868cd; -} - -.btn--red { - background: #ff4b5a; -} - -.btn--red:hover { - background: #eb3746; -} - -/* ========================================================================== - #DATE PICKER - ========================================================================== */ -td.active { - background-color: #2c6ed5; -} - -input[type="date" i] { - padding: 14px; -} - -.table-condensed td, .table-condensed th { - font-size: 14px; - font-family: "Roboto", "Arial", "Helvetica Neue", sans-serif; - font-weight: 400; -} - -.daterangepicker td { - width: 40px; - height: 30px; -} - -.daterangepicker { - border: none; - -webkit-box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.15); - box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.15); - display: none; - border: 1px solid #e0e0e0; - margin-top: 5px; -} - -.daterangepicker::after, .daterangepicker::before { - display: none; -} - -.daterangepicker thead tr th { - padding: 10px 0; -} - -.daterangepicker .table-condensed th select { - border: 1px solid #ccc; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - font-size: 14px; - padding: 5px; - outline: none; -} - -/* ========================================================================== - #FORM - ========================================================================== */ -input { - outline: none; - margin: 0; - border: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - width: 100%; - font-size: 14px; - font-family: inherit; -} - -.radio-container { - display: inline-block; - position: relative; - padding-left: 30px; - cursor: pointer; - font-size: 16px; - color: #666; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.radio-container input { - position: absolute; - opacity: 0; - cursor: pointer; -} - -.radio-container input:checked ~ .checkmark { - background-color: #e5e5e5; -} - -.radio-container input:checked ~ .checkmark:after { - display: block; -} - -.radio-container .checkmark:after { - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - -moz-transform: translate(-50%, -50%); - -ms-transform: translate(-50%, -50%); - -o-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - width: 12px; - height: 12px; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; - background: #57b846; -} - -.checkmark { - position: absolute; - top: 50%; - -webkit-transform: translateY(-50%); - -moz-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); - left: 0; - height: 20px; - width: 20px; - background-color: #e5e5e5; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - border-radius: 50%; - -webkit-box-shadow: inset 0px 1px 3px 0px rgba(0, 0, 0, 0.08); - -moz-box-shadow: inset 0px 1px 3px 0px rgba(0, 0, 0, 0.08); - box-shadow: inset 0px 1px 3px 0px rgba(0, 0, 0, 0.08); -} - -.checkmark:after { - content: ""; - position: absolute; - display: none; -} - -.input--style-5 { - background: #e5e5e5; - line-height: 50px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - padding: 0 22px; - font-size: 16px; - color: #555; -} - -.input-group-desc { - position: relative; -} - -@media (max-width: 767px) { - .input-group-desc { - margin-bottom: 40px; - } -} - -.input-group { - position: relative; - margin: 0; -} - -.label { - color: #555; - font-size: 15px; - font-weight: 700; -} - -.label--block { - width: 100%; -} - -.label--desc { - position: absolute; - text-transform: capitalize; - display: block; - color: #999; - font-size: 14px; - margin: 0; - margin-top: 7px; - left: 0; -} - -/* ========================================================================== - #SELECT2 - ========================================================================== */ -.select--no-search .select2-search { - display: none !important; -} - -.select2-container--open .select2-dropdown--below { - border: none; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.15); - box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.15); - border: 1px solid #e0e0e0; - margin-top: 5px; - overflow: hidden; -} - -.select2-container--default .select2-results__option { - padding-left: 22px; -} - -.rs-select2 .select2-container { - width: 100% !important; - outline: none; - background: #e5e5e5; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.rs-select2 .select2-container .select2-selection--single { - outline: none; - border: none; - height: 50px; - width: 500px; - background: transparent; -} - -.rs-select2 .select2-container .select2-selection--single .select2-selection__rendered { - line-height: 50px; - padding-left: 0; - color: #555; - font-size: 16px; - font-family: inherit; - padding-left: 22px; - padding-right: 50px; -} - -.rs-select2 .select2-container .select2-selection--single .select2-selection__arrow { - height: 50px; - right: 15px; - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: center; - -webkit-justify-content: center; - -moz-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - -webkit-box-align: center; - -webkit-align-items: center; - -moz-box-align: center; - -ms-flex-align: center; - align-items: center; -} - -.rs-select2 .select2-container .select2-selection--single .select2-selection__arrow b { - display: none; -} - -.rs-select2 .select2-container .select2-selection--single .select2-selection__arrow:after { - font-family: "Material-Design-Iconic-Font"; - content: '\f2f9'; - font-size: 24px; - color: #999; - -webkit-transition: all 0.4s ease; - -o-transition: all 0.4s ease; - -moz-transition: all 0.4s ease; - transition: all 0.4s ease; -} - -.rs-select2 .select2-container.select2-container--open .select2-selection--single .select2-selection__arrow::after { - -webkit-transform: rotate(-180deg); - -moz-transform: rotate(-180deg); - -ms-transform: rotate(-180deg); - -o-transform: rotate(-180deg); - transform: rotate(-180deg); -} - -/* ========================================================================== - #TITLE - ========================================================================== */ -.title { - font-size: 24px; - text-transform: uppercase; - font-weight: 700; - text-align: center; - color: #fff; -} - -/* ========================================================================== - #CARD - ========================================================================== */ -.card { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - background: #fff; - - -} - -.card-5 { - background: #fff; - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; - -webkit-box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.15); - box-shadow: 0px 8px 20px 0px rgba(0, 0, 0, 0.15); -} - -.card-5 .card-heading { - padding: 20px 0; - background: blueviolet; - -webkit-border-top-left-radius: 10px; - -moz-border-radius-topleft: 10px; - border-top-left-radius: 10px; - -webkit-border-top-right-radius: 10px; - -moz-border-radius-topright: 10px; - border-top-right-radius: 10px; -} - -.card-5 .card-body { - padding: 52px 85px; - padding-bottom: 73px; -} - -@media (max-width: 767px) { - .card-5 .card-body { - padding: 40px 30px; - padding-bottom: 50px; - - } -} -@media (min-width: 600px) { - .card1 { - - word-break: break-word; - } -} diff --git a/public/assets/css/styles.css b/public/assets/css/styles.css deleted file mode 100644 index ac52aa1..0000000 --- a/public/assets/css/styles.css +++ /dev/null @@ -1,10249 +0,0 @@ -@charset "UTF-8"; -/*! -* Start Bootstrap - SB Admin v6.0.2 (https://startbootstrap.com/template/sb-admin) -* Copyright 2013-2020 Start Bootstrap -* Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE) -*/ -/*! - * Bootstrap v4.5.3 (https://getbootstrap.com/) - * Copyright 2011-2020 The Bootstrap Authors - * Copyright 2011-2020 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -:root { - --blue: #007bff; - --indigo: #6610f2; - --purple: #6f42c1; - --pink: #e83e8c; - --red: #dc3545; - --orange: #fd7e14; - --yellow: #ffc107; - --green: #28a745; - --teal: #20c997; - --cyan: #17a2b8; - --white: #fff; - --gray: #6c757d; - --gray-dark: #343a40; - --primary: #007bff; - --secondary: #6c757d; - --success: #28a745; - --info: #17a2b8; - --warning: #ffc107; - --danger: #dc3545; - --light: #f8f9fa; - --dark: #343a40; - --breakpoint-xs: 0; - --breakpoint-sm: 576px; - --breakpoint-md: 768px; - --breakpoint-lg: 992px; - --breakpoint-xl: 1200px; - --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -*, -*::before, -*::after { - box-sizing: border-box; -} - -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { - display: block; -} - -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #212529; - text-align: left; - background-color: #fff; -} - -[tabindex="-1"]:focus:not(:focus-visible) { - outline: 0 !important; -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 0.5rem; -} - -p { - margin-top: 0; - margin-bottom: 1rem; -} - -abbr[title], -abbr[data-original-title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0; - -webkit-text-decoration-skip-ink: none; - text-decoration-skip-ink: none; -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit; -} - -ol, -ul, -dl { - margin-top: 0; - margin-bottom: 1rem; -} - -ol ol, -ul ul, -ol ul, -ul ol { - margin-bottom: 0; -} - -dt { - font-weight: 700; -} - -dd { - margin-bottom: 0.5rem; - margin-left: 0; -} - -blockquote { - margin: 0 0 1rem; -} - -b, -strong { - font-weight: bolder; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -a { - color: #007bff; - text-decoration: none; - background-color: transparent; -} -a:hover { - color: #0056b3; - text-decoration: underline; -} - -a:not([href]):not([class]) { - color: inherit; - text-decoration: none; -} -a:not([href]):not([class]):hover { - color: inherit; - text-decoration: none; -} - -pre, -code, -kbd, -samp { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 1em; -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - -ms-overflow-style: scrollbar; -} - -figure { - margin: 0 0 1rem; -} - -img { - vertical-align: middle; - border-style: none; -} - -svg { - overflow: hidden; - vertical-align: middle; -} - -table { - border-collapse: collapse; -} - -caption { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - color: #6c757d; - text-align: left; - caption-side: bottom; -} - -th { - text-align: inherit; - text-align: -webkit-match-parent; -} - -label { - display: inline-block; - margin-bottom: 0.5rem; -} - -button { - border-radius: 0; -} - -button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color; -} - -input, -button, -select, -optgroup, -textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -input { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -[role=button] { - cursor: pointer; -} - -select { - word-wrap: normal; -} - -button, -[type=button], -[type=reset], -[type=submit] { - -webkit-appearance: button; -} - -button:not(:disabled), -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled) { - cursor: pointer; -} - -button::-moz-focus-inner, -[type=button]::-moz-focus-inner, -[type=reset]::-moz-focus-inner, -[type=submit]::-moz-focus-inner { - padding: 0; - border-style: none; -} - -input[type=radio], -input[type=checkbox] { - box-sizing: border-box; - padding: 0; -} - -textarea { - overflow: auto; - resize: vertical; -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: 0.5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal; -} - -progress { - vertical-align: baseline; -} - -[type=number]::-webkit-inner-spin-button, -[type=number]::-webkit-outer-spin-button { - height: auto; -} - -[type=search] { - outline-offset: -2px; - -webkit-appearance: none; -} - -[type=search]::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button; -} - -output { - display: inline-block; -} - -summary { - display: list-item; - cursor: pointer; -} - -template { - display: none; -} - -[hidden] { - display: none !important; -} - -h1, h2, h3, h4, h5, h6, -.h1, .h2, .h3, .h4, .h5, .h6 { - margin-bottom: 0.5rem; - font-weight: 500; - line-height: 1.2; -} - -h1, .h1 { - font-size: 2.5rem; -} - -h2, .h2 { - font-size: 2rem; -} - -h3, .h3 { - font-size: 1.75rem; -} - -h4, .h4 { - font-size: 1.5rem; -} - -h5, .h5 { - font-size: 1.25rem; -} - -h6, .h6 { - font-size: 1rem; -} - -.lead { - font-size: 1.25rem; - font-weight: 300; -} - -.display-1 { - font-size: 6rem; - font-weight: 300; - line-height: 1.2; -} - -.display-2 { - font-size: 5.5rem; - font-weight: 300; - line-height: 1.2; -} - -.display-3 { - font-size: 4.5rem; - font-weight: 300; - line-height: 1.2; -} - -.display-4 { - font-size: 3.5rem; - font-weight: 300; - line-height: 1.2; -} - -hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid rgba(0, 0, 0, 0.1); -} - -small, -.small { - font-size: 80%; - font-weight: 400; -} - -mark, -.mark { - padding: 0.2em; - background-color: #fcf8e3; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline-item { - display: inline-block; -} -.list-inline-item:not(:last-child) { - margin-right: 0.5rem; -} - -.initialism { - font-size: 90%; - text-transform: uppercase; -} - -.blockquote { - margin-bottom: 1rem; - font-size: 1.25rem; -} - -.blockquote-footer { - display: block; - font-size: 80%; - color: #6c757d; -} -.blockquote-footer::before { - content: "— "; -} - -.img-fluid { - max-width: 100%; - height: auto; -} - -.img-thumbnail { - padding: 0.25rem; - background-color: #fff; - border: 1px solid #dee2e6; - border-radius: 0.25rem; - max-width: 100%; - height: auto; -} - -.figure { - display: inline-block; -} - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1; -} - -.figure-caption { - font-size: 90%; - color: #6c757d; -} - -code { - font-size: 87.5%; - color: #e83e8c; - word-wrap: break-word; -} -a > code { - color: inherit; -} - -kbd { - padding: 0.2rem 0.4rem; - font-size: 87.5%; - color: #fff; - background-color: #212529; - border-radius: 0.2rem; -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: 700; -} - -pre { - display: block; - font-size: 87.5%; - color: #212529; -} -pre code { - font-size: inherit; - color: inherit; - word-break: normal; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container, -.container-fluid, -.container-xl, -.container-lg, -.container-md, -.container-sm { - width: 100%; - padding-right: 0.75rem; - padding-left: 0.75rem; - margin-right: auto; - margin-left: auto; -} - -@media (min-width: 576px) { - .container-sm, .container { - max-width: 540px; - } -} -@media (min-width: 768px) { - .container-md, .container-sm, .container { - max-width: 720px; - } -} -@media (min-width: 992px) { - .container-lg, .container-md, .container-sm, .container { - max-width: 960px; - } -} -@media (min-width: 1200px) { - .container-xl, .container-lg, .container-md, .container-sm, .container { - max-width: 1140px; - } -} -.row { - display: flex; - flex-wrap: wrap; - margin-right: -0.75rem; - margin-left: -0.75rem; -} - -.no-gutters { - margin-right: 0; - margin-left: 0; -} -.no-gutters > .col, -.no-gutters > [class*=col-] { - padding-right: 0; - padding-left: 0; -} - -.col-xl, -.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg, -.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md, -.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm, -.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col, -.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { - position: relative; - width: 100%; - padding-right: 0.75rem; - padding-left: 0.75rem; -} - -.col { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; -} - -.row-cols-1 > * { - flex: 0 0 100%; - max-width: 100%; -} - -.row-cols-2 > * { - flex: 0 0 50%; - max-width: 50%; -} - -.row-cols-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; -} - -.row-cols-4 > * { - flex: 0 0 25%; - max-width: 25%; -} - -.row-cols-5 > * { - flex: 0 0 20%; - max-width: 20%; -} - -.row-cols-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; -} - -.col-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; -} - -.col-1 { - flex: 0 0 8.3333333333%; - max-width: 8.3333333333%; -} - -.col-2 { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; -} - -.col-3 { - flex: 0 0 25%; - max-width: 25%; -} - -.col-4 { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; -} - -.col-5 { - flex: 0 0 41.6666666667%; - max-width: 41.6666666667%; -} - -.col-6 { - flex: 0 0 50%; - max-width: 50%; -} - -.col-7 { - flex: 0 0 58.3333333333%; - max-width: 58.3333333333%; -} - -.col-8 { - flex: 0 0 66.6666666667%; - max-width: 66.6666666667%; -} - -.col-9 { - flex: 0 0 75%; - max-width: 75%; -} - -.col-10 { - flex: 0 0 83.3333333333%; - max-width: 83.3333333333%; -} - -.col-11 { - flex: 0 0 91.6666666667%; - max-width: 91.6666666667%; -} - -.col-12 { - flex: 0 0 100%; - max-width: 100%; -} - -.order-first { - order: -1; -} - -.order-last { - order: 13; -} - -.order-0 { - order: 0; -} - -.order-1 { - order: 1; -} - -.order-2 { - order: 2; -} - -.order-3 { - order: 3; -} - -.order-4 { - order: 4; -} - -.order-5 { - order: 5; -} - -.order-6 { - order: 6; -} - -.order-7 { - order: 7; -} - -.order-8 { - order: 8; -} - -.order-9 { - order: 9; -} - -.order-10 { - order: 10; -} - -.order-11 { - order: 11; -} - -.order-12 { - order: 12; -} - -.offset-1 { - margin-left: 8.3333333333%; -} - -.offset-2 { - margin-left: 16.6666666667%; -} - -.offset-3 { - margin-left: 25%; -} - -.offset-4 { - margin-left: 33.3333333333%; -} - -.offset-5 { - margin-left: 41.6666666667%; -} - -.offset-6 { - margin-left: 50%; -} - -.offset-7 { - margin-left: 58.3333333333%; -} - -.offset-8 { - margin-left: 66.6666666667%; -} - -.offset-9 { - margin-left: 75%; -} - -.offset-10 { - margin-left: 83.3333333333%; -} - -.offset-11 { - margin-left: 91.6666666667%; -} - -@media (min-width: 576px) { - .col-sm { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-sm-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-sm-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-sm-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .row-cols-sm-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-sm-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-sm-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-sm-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-sm-1 { - flex: 0 0 8.3333333333%; - max-width: 8.3333333333%; - } - - .col-sm-2 { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-sm-3 { - flex: 0 0 25%; - max-width: 25%; - } - - .col-sm-4 { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .col-sm-5 { - flex: 0 0 41.6666666667%; - max-width: 41.6666666667%; - } - - .col-sm-6 { - flex: 0 0 50%; - max-width: 50%; - } - - .col-sm-7 { - flex: 0 0 58.3333333333%; - max-width: 58.3333333333%; - } - - .col-sm-8 { - flex: 0 0 66.6666666667%; - max-width: 66.6666666667%; - } - - .col-sm-9 { - flex: 0 0 75%; - max-width: 75%; - } - - .col-sm-10 { - flex: 0 0 83.3333333333%; - max-width: 83.3333333333%; - } - - .col-sm-11 { - flex: 0 0 91.6666666667%; - max-width: 91.6666666667%; - } - - .col-sm-12 { - flex: 0 0 100%; - max-width: 100%; - } - - .order-sm-first { - order: -1; - } - - .order-sm-last { - order: 13; - } - - .order-sm-0 { - order: 0; - } - - .order-sm-1 { - order: 1; - } - - .order-sm-2 { - order: 2; - } - - .order-sm-3 { - order: 3; - } - - .order-sm-4 { - order: 4; - } - - .order-sm-5 { - order: 5; - } - - .order-sm-6 { - order: 6; - } - - .order-sm-7 { - order: 7; - } - - .order-sm-8 { - order: 8; - } - - .order-sm-9 { - order: 9; - } - - .order-sm-10 { - order: 10; - } - - .order-sm-11 { - order: 11; - } - - .order-sm-12 { - order: 12; - } - - .offset-sm-0 { - margin-left: 0; - } - - .offset-sm-1 { - margin-left: 8.3333333333%; - } - - .offset-sm-2 { - margin-left: 16.6666666667%; - } - - .offset-sm-3 { - margin-left: 25%; - } - - .offset-sm-4 { - margin-left: 33.3333333333%; - } - - .offset-sm-5 { - margin-left: 41.6666666667%; - } - - .offset-sm-6 { - margin-left: 50%; - } - - .offset-sm-7 { - margin-left: 58.3333333333%; - } - - .offset-sm-8 { - margin-left: 66.6666666667%; - } - - .offset-sm-9 { - margin-left: 75%; - } - - .offset-sm-10 { - margin-left: 83.3333333333%; - } - - .offset-sm-11 { - margin-left: 91.6666666667%; - } -} -@media (min-width: 768px) { - .col-md { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-md-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-md-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-md-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .row-cols-md-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-md-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-md-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-md-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-md-1 { - flex: 0 0 8.3333333333%; - max-width: 8.3333333333%; - } - - .col-md-2 { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-md-3 { - flex: 0 0 25%; - max-width: 25%; - } - - .col-md-4 { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .col-md-5 { - flex: 0 0 41.6666666667%; - max-width: 41.6666666667%; - } - - .col-md-6 { - flex: 0 0 50%; - max-width: 50%; - } - - .col-md-7 { - flex: 0 0 58.3333333333%; - max-width: 58.3333333333%; - } - - .col-md-8 { - flex: 0 0 66.6666666667%; - max-width: 66.6666666667%; - } - - .col-md-9 { - flex: 0 0 75%; - max-width: 75%; - } - - .col-md-10 { - flex: 0 0 83.3333333333%; - max-width: 83.3333333333%; - } - - .col-md-11 { - flex: 0 0 91.6666666667%; - max-width: 91.6666666667%; - } - - .col-md-12 { - flex: 0 0 100%; - max-width: 100%; - } - - .order-md-first { - order: -1; - } - - .order-md-last { - order: 13; - } - - .order-md-0 { - order: 0; - } - - .order-md-1 { - order: 1; - } - - .order-md-2 { - order: 2; - } - - .order-md-3 { - order: 3; - } - - .order-md-4 { - order: 4; - } - - .order-md-5 { - order: 5; - } - - .order-md-6 { - order: 6; - } - - .order-md-7 { - order: 7; - } - - .order-md-8 { - order: 8; - } - - .order-md-9 { - order: 9; - } - - .order-md-10 { - order: 10; - } - - .order-md-11 { - order: 11; - } - - .order-md-12 { - order: 12; - } - - .offset-md-0 { - margin-left: 0; - } - - .offset-md-1 { - margin-left: 8.3333333333%; - } - - .offset-md-2 { - margin-left: 16.6666666667%; - } - - .offset-md-3 { - margin-left: 25%; - } - - .offset-md-4 { - margin-left: 33.3333333333%; - } - - .offset-md-5 { - margin-left: 41.6666666667%; - } - - .offset-md-6 { - margin-left: 50%; - } - - .offset-md-7 { - margin-left: 58.3333333333%; - } - - .offset-md-8 { - margin-left: 66.6666666667%; - } - - .offset-md-9 { - margin-left: 75%; - } - - .offset-md-10 { - margin-left: 83.3333333333%; - } - - .offset-md-11 { - margin-left: 91.6666666667%; - } -} -@media (min-width: 992px) { - .col-lg { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-lg-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-lg-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-lg-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .row-cols-lg-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-lg-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-lg-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-lg-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-lg-1 { - flex: 0 0 8.3333333333%; - max-width: 8.3333333333%; - } - - .col-lg-2 { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-lg-3 { - flex: 0 0 25%; - max-width: 25%; - } - - .col-lg-4 { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .col-lg-5 { - flex: 0 0 41.6666666667%; - max-width: 41.6666666667%; - } - - .col-lg-6 { - flex: 0 0 50%; - max-width: 50%; - } - - .col-lg-7 { - flex: 0 0 58.3333333333%; - max-width: 58.3333333333%; - } - - .col-lg-8 { - flex: 0 0 66.6666666667%; - max-width: 66.6666666667%; - } - - .col-lg-9 { - flex: 0 0 75%; - max-width: 75%; - } - - .col-lg-10 { - flex: 0 0 83.3333333333%; - max-width: 83.3333333333%; - } - - .col-lg-11 { - flex: 0 0 91.6666666667%; - max-width: 91.6666666667%; - } - - .col-lg-12 { - flex: 0 0 100%; - max-width: 100%; - } - - .order-lg-first { - order: -1; - } - - .order-lg-last { - order: 13; - } - - .order-lg-0 { - order: 0; - } - - .order-lg-1 { - order: 1; - } - - .order-lg-2 { - order: 2; - } - - .order-lg-3 { - order: 3; - } - - .order-lg-4 { - order: 4; - } - - .order-lg-5 { - order: 5; - } - - .order-lg-6 { - order: 6; - } - - .order-lg-7 { - order: 7; - } - - .order-lg-8 { - order: 8; - } - - .order-lg-9 { - order: 9; - } - - .order-lg-10 { - order: 10; - } - - .order-lg-11 { - order: 11; - } - - .order-lg-12 { - order: 12; - } - - .offset-lg-0 { - margin-left: 0; - } - - .offset-lg-1 { - margin-left: 8.3333333333%; - } - - .offset-lg-2 { - margin-left: 16.6666666667%; - } - - .offset-lg-3 { - margin-left: 25%; - } - - .offset-lg-4 { - margin-left: 33.3333333333%; - } - - .offset-lg-5 { - margin-left: 41.6666666667%; - } - - .offset-lg-6 { - margin-left: 50%; - } - - .offset-lg-7 { - margin-left: 58.3333333333%; - } - - .offset-lg-8 { - margin-left: 66.6666666667%; - } - - .offset-lg-9 { - margin-left: 75%; - } - - .offset-lg-10 { - margin-left: 83.3333333333%; - } - - .offset-lg-11 { - margin-left: 91.6666666667%; - } -} -@media (min-width: 1200px) { - .col-xl { - flex-basis: 0; - flex-grow: 1; - max-width: 100%; - } - - .row-cols-xl-1 > * { - flex: 0 0 100%; - max-width: 100%; - } - - .row-cols-xl-2 > * { - flex: 0 0 50%; - max-width: 50%; - } - - .row-cols-xl-3 > * { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .row-cols-xl-4 > * { - flex: 0 0 25%; - max-width: 25%; - } - - .row-cols-xl-5 > * { - flex: 0 0 20%; - max-width: 20%; - } - - .row-cols-xl-6 > * { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-xl-auto { - flex: 0 0 auto; - width: auto; - max-width: 100%; - } - - .col-xl-1 { - flex: 0 0 8.3333333333%; - max-width: 8.3333333333%; - } - - .col-xl-2 { - flex: 0 0 16.6666666667%; - max-width: 16.6666666667%; - } - - .col-xl-3 { - flex: 0 0 25%; - max-width: 25%; - } - - .col-xl-4 { - flex: 0 0 33.3333333333%; - max-width: 33.3333333333%; - } - - .col-xl-5 { - flex: 0 0 41.6666666667%; - max-width: 41.6666666667%; - } - - .col-xl-6 { - flex: 0 0 50%; - max-width: 50%; - } - - .col-xl-7 { - flex: 0 0 58.3333333333%; - max-width: 58.3333333333%; - } - - .col-xl-8 { - flex: 0 0 66.6666666667%; - max-width: 66.6666666667%; - } - - .col-xl-9 { - flex: 0 0 75%; - max-width: 75%; - } - - .col-xl-10 { - flex: 0 0 83.3333333333%; - max-width: 83.3333333333%; - } - - .col-xl-11 { - flex: 0 0 91.6666666667%; - max-width: 91.6666666667%; - } - - .col-xl-12 { - flex: 0 0 100%; - max-width: 100%; - } - - .order-xl-first { - order: -1; - } - - .order-xl-last { - order: 13; - } - - .order-xl-0 { - order: 0; - } - - .order-xl-1 { - order: 1; - } - - .order-xl-2 { - order: 2; - } - - .order-xl-3 { - order: 3; - } - - .order-xl-4 { - order: 4; - } - - .order-xl-5 { - order: 5; - } - - .order-xl-6 { - order: 6; - } - - .order-xl-7 { - order: 7; - } - - .order-xl-8 { - order: 8; - } - - .order-xl-9 { - order: 9; - } - - .order-xl-10 { - order: 10; - } - - .order-xl-11 { - order: 11; - } - - .order-xl-12 { - order: 12; - } - - .offset-xl-0 { - margin-left: 0; - } - - .offset-xl-1 { - margin-left: 8.3333333333%; - } - - .offset-xl-2 { - margin-left: 16.6666666667%; - } - - .offset-xl-3 { - margin-left: 25%; - } - - .offset-xl-4 { - margin-left: 33.3333333333%; - } - - .offset-xl-5 { - margin-left: 41.6666666667%; - } - - .offset-xl-6 { - margin-left: 50%; - } - - .offset-xl-7 { - margin-left: 58.3333333333%; - } - - .offset-xl-8 { - margin-left: 66.6666666667%; - } - - .offset-xl-9 { - margin-left: 75%; - } - - .offset-xl-10 { - margin-left: 83.3333333333%; - } - - .offset-xl-11 { - margin-left: 91.6666666667%; - } -} -.table { - width: 100%; - margin-bottom: 1rem; - color: #212529; -} -.table th, -.table td { - padding: 0.75rem; - vertical-align: top; - border-top: 1px solid #dee2e6; -} -.table thead th { - vertical-align: bottom; - border-bottom: 2px solid #dee2e6; -} -.table tbody + tbody { - border-top: 2px solid #dee2e6; -} - -.table-sm th, -.table-sm td { - padding: 0.3rem; -} - -.table-bordered { - border: 1px solid #dee2e6; -} -.table-bordered th, -.table-bordered td { - border: 1px solid #dee2e6; -} -.table-bordered thead th, -.table-bordered thead td { - border-bottom-width: 2px; -} - -.table-borderless th, -.table-borderless td, -.table-borderless thead th, -.table-borderless tbody + tbody { - border: 0; -} - -.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(0, 0, 0, 0.05); -} - -.table-hover tbody tr:hover { - color: #212529; - background-color: rgba(0, 0, 0, 0.075); -} - -.table-primary, -.table-primary > th, -.table-primary > td { - background-color: #b8daff; -} -.table-primary th, -.table-primary td, -.table-primary thead th, -.table-primary tbody + tbody { - border-color: #7abaff; -} - -.table-hover .table-primary:hover { - background-color: #9fcdff; -} -.table-hover .table-primary:hover > td, -.table-hover .table-primary:hover > th { - background-color: #9fcdff; -} - -.table-secondary, -.table-secondary > th, -.table-secondary > td { - background-color: #d6d8db; -} -.table-secondary th, -.table-secondary td, -.table-secondary thead th, -.table-secondary tbody + tbody { - border-color: #b3b7bb; -} - -.table-hover .table-secondary:hover { - background-color: #c8cbcf; -} -.table-hover .table-secondary:hover > td, -.table-hover .table-secondary:hover > th { - background-color: #c8cbcf; -} - -.table-success, -.table-success > th, -.table-success > td { - background-color: #c3e6cb; -} -.table-success th, -.table-success td, -.table-success thead th, -.table-success tbody + tbody { - border-color: #8fd19e; -} - -.table-hover .table-success:hover { - background-color: #b1dfbb; -} -.table-hover .table-success:hover > td, -.table-hover .table-success:hover > th { - background-color: #b1dfbb; -} - -.table-info, -.table-info > th, -.table-info > td { - background-color: #bee5eb; -} -.table-info th, -.table-info td, -.table-info thead th, -.table-info tbody + tbody { - border-color: #86cfda; -} - -.table-hover .table-info:hover { - background-color: #abdde5; -} -.table-hover .table-info:hover > td, -.table-hover .table-info:hover > th { - background-color: #abdde5; -} - -.table-warning, -.table-warning > th, -.table-warning > td { - background-color: #ffeeba; -} -.table-warning th, -.table-warning td, -.table-warning thead th, -.table-warning tbody + tbody { - border-color: #ffdf7e; -} - -.table-hover .table-warning:hover { - background-color: #ffe8a1; -} -.table-hover .table-warning:hover > td, -.table-hover .table-warning:hover > th { - background-color: #ffe8a1; -} - -.table-danger, -.table-danger > th, -.table-danger > td { - background-color: #f5c6cb; -} -.table-danger th, -.table-danger td, -.table-danger thead th, -.table-danger tbody + tbody { - border-color: #ed969e; -} - -.table-hover .table-danger:hover { - background-color: #f1b0b7; -} -.table-hover .table-danger:hover > td, -.table-hover .table-danger:hover > th { - background-color: #f1b0b7; -} - -.table-light, -.table-light > th, -.table-light > td { - background-color: #fdfdfe; -} -.table-light th, -.table-light td, -.table-light thead th, -.table-light tbody + tbody { - border-color: #fbfcfc; -} - -.table-hover .table-light:hover { - background-color: #ececf6; -} -.table-hover .table-light:hover > td, -.table-hover .table-light:hover > th { - background-color: #ececf6; -} - -.table-dark, -.table-dark > th, -.table-dark > td { - background-color: #c6c8ca; -} -.table-dark th, -.table-dark td, -.table-dark thead th, -.table-dark tbody + tbody { - border-color: #95999c; -} - -.table-hover .table-dark:hover { - background-color: #b9bbbe; -} -.table-hover .table-dark:hover > td, -.table-hover .table-dark:hover > th { - background-color: #b9bbbe; -} - -.table-active, -.table-active > th, -.table-active > td { - background-color: rgba(0, 0, 0, 0.075); -} - -.table-hover .table-active:hover { - background-color: rgba(0, 0, 0, 0.075); -} -.table-hover .table-active:hover > td, -.table-hover .table-active:hover > th { - background-color: rgba(0, 0, 0, 0.075); -} - -.table .thead-dark th { - color: #fff; - background-color: #343a40; - border-color: #454d55; -} -.table .thead-light th { - color: #495057; - background-color: #e9ecef; - border-color: #dee2e6; -} - -.table-dark { - color: #fff; - background-color: #343a40; -} -.table-dark th, -.table-dark td, -.table-dark thead th { - border-color: #454d55; -} -.table-dark.table-bordered { - border: 0; -} -.table-dark.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(255, 255, 255, 0.05); -} -.table-dark.table-hover tbody tr:hover { - color: #fff; - background-color: rgba(255, 255, 255, 0.075); -} - -@media (max-width: 575.98px) { - .table-responsive-sm { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-sm > .table-bordered { - border: 0; - } -} -@media (max-width: 767.98px) { - .table-responsive-md { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-md > .table-bordered { - border: 0; - } -} -@media (max-width: 991.98px) { - .table-responsive-lg { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-lg > .table-bordered { - border: 0; - } -} -@media (max-width: 1199.98px) { - .table-responsive-xl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - } - .table-responsive-xl > .table-bordered { - border: 0; - } -} -.table-responsive { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; -} -.table-responsive > .table-bordered { - border: 0; -} - -.form-control { - display: block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - background-color: #fff; - background-clip: padding-box; - border: 1px solid #ced4da; - border-radius: 0.25rem; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .form-control { - transition: none; - } -} -.form-control::-ms-expand { - background-color: transparent; - border: 0; -} -.form-control:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 #495057; -} -.form-control:focus { - color: #495057; - background-color: #fff; - border-color: #80bdff; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.form-control::-webkit-input-placeholder { - color: #6c757d; - opacity: 1; -} -.form-control::-moz-placeholder { - color: #6c757d; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #6c757d; - opacity: 1; -} -.form-control::-ms-input-placeholder { - color: #6c757d; - opacity: 1; -} -.form-control::placeholder { - color: #6c757d; - opacity: 1; -} -.form-control:disabled, .form-control[readonly] { - background-color: #e9ecef; - opacity: 1; -} - -input[type=date].form-control, -input[type=time].form-control, -input[type=datetime-local].form-control, -input[type=month].form-control { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -select.form-control:focus::-ms-value { - color: #495057; - background-color: #fff; -} - -.form-control-file, -.form-control-range { - display: block; - width: 100%; -} - -.col-form-label { - padding-top: calc(0.375rem + 1px); - padding-bottom: calc(0.375rem + 1px); - margin-bottom: 0; - font-size: inherit; - line-height: 1.5; -} - -.col-form-label-lg { - padding-top: calc(0.5rem + 1px); - padding-bottom: calc(0.5rem + 1px); - font-size: 1.25rem; - line-height: 1.5; -} - -.col-form-label-sm { - padding-top: calc(0.25rem + 1px); - padding-bottom: calc(0.25rem + 1px); - font-size: 0.875rem; - line-height: 1.5; -} - -.form-control-plaintext { - display: block; - width: 100%; - padding: 0.375rem 0; - margin-bottom: 0; - font-size: 1rem; - line-height: 1.5; - color: #212529; - background-color: transparent; - border: solid transparent; - border-width: 1px 0; -} -.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { - padding-right: 0; - padding-left: 0; -} - -.form-control-sm { - height: calc(1.5em + 0.5rem + 2px); - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.form-control-lg { - height: calc(1.5em + 1rem + 2px); - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -select.form-control[size], select.form-control[multiple] { - height: auto; -} - -textarea.form-control { - height: auto; -} - -.form-group { - margin-bottom: 1rem; -} - -.form-text { - display: block; - margin-top: 0.25rem; -} - -.form-row { - display: flex; - flex-wrap: wrap; - margin-right: -5px; - margin-left: -5px; -} -.form-row > .col, -.form-row > [class*=col-] { - padding-right: 5px; - padding-left: 5px; -} - -.form-check { - position: relative; - display: block; - padding-left: 1.25rem; -} - -.form-check-input { - position: absolute; - margin-top: 0.3rem; - margin-left: -1.25rem; -} -.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { - color: #6c757d; -} - -.form-check-label { - margin-bottom: 0; -} - -.form-check-inline { - display: inline-flex; - align-items: center; - padding-left: 0; - margin-right: 0.75rem; -} -.form-check-inline .form-check-input { - position: static; - margin-top: 0; - margin-right: 0.3125rem; - margin-left: 0; -} - -.valid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 80%; - color: #28a745; -} - -.valid-tooltip { - position: absolute; - top: 100%; - left: 0; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(40, 167, 69, 0.9); - border-radius: 0.25rem; -} - -.was-validated :valid ~ .valid-feedback, -.was-validated :valid ~ .valid-tooltip, -.is-valid ~ .valid-feedback, -.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .form-control:valid, .form-control.is-valid { - border-color: #28a745; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:valid:focus, .form-control.is-valid:focus { - border-color: #28a745; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} - -.was-validated textarea.form-control:valid, textarea.form-control.is-valid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .custom-select:valid, .custom-select.is-valid { - border-color: #28a745; - padding-right: calc(0.75em + 2.3125rem); - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { - border-color: #28a745; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} - -.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { - color: #28a745; -} -.was-validated .form-check-input:valid ~ .valid-feedback, -.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, -.form-check-input.is-valid ~ .valid-tooltip { - display: block; -} - -.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { - color: #28a745; -} -.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { - border-color: #28a745; -} -.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { - border-color: #34ce57; - background-color: #34ce57; -} -.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} -.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { - border-color: #28a745; -} - -.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { - border-color: #28a745; -} -.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { - border-color: #28a745; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25); -} - -.invalid-feedback { - display: none; - width: 100%; - margin-top: 0.25rem; - font-size: 80%; - color: #dc3545; -} - -.invalid-tooltip { - position: absolute; - top: 100%; - left: 0; - z-index: 5; - display: none; - max-width: 100%; - padding: 0.25rem 0.5rem; - margin-top: 0.1rem; - font-size: 0.875rem; - line-height: 1.5; - color: #fff; - background-color: rgba(220, 53, 69, 0.9); - border-radius: 0.25rem; -} - -.was-validated :invalid ~ .invalid-feedback, -.was-validated :invalid ~ .invalid-tooltip, -.is-invalid ~ .invalid-feedback, -.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .form-control:invalid, .form-control.is-invalid { - border-color: #dc3545; - padding-right: calc(1.5em + 0.75rem); - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); - background-repeat: no-repeat; - background-position: right calc(0.375em + 0.1875rem) center; - background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} - -.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { - padding-right: calc(1.5em + 0.75rem); - background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); -} - -.was-validated .custom-select:invalid, .custom-select.is-invalid { - border-color: #dc3545; - padding-right: calc(0.75em + 2.3125rem); - background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); -} -.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { - border-color: #dc3545; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} - -.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { - color: #dc3545; -} -.was-validated .form-check-input:invalid ~ .invalid-feedback, -.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, -.form-check-input.is-invalid ~ .invalid-tooltip { - display: block; -} - -.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { - color: #dc3545; -} -.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { - border-color: #dc3545; -} -.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { - border-color: #e4606d; - background-color: #e4606d; -} -.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} -.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { - border-color: #dc3545; -} - -.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { - border-color: #dc3545; -} -.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { - border-color: #dc3545; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25); -} - -.form-inline { - display: flex; - flex-flow: row wrap; - align-items: center; -} -.form-inline .form-check { - width: 100%; -} -@media (min-width: 576px) { - .form-inline label { - display: flex; - align-items: center; - justify-content: center; - margin-bottom: 0; - } - .form-inline .form-group { - display: flex; - flex: 0 0 auto; - flex-flow: row wrap; - align-items: center; - margin-bottom: 0; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-plaintext { - display: inline-block; - } - .form-inline .input-group, -.form-inline .custom-select { - width: auto; - } - .form-inline .form-check { - display: flex; - align-items: center; - justify-content: center; - width: auto; - padding-left: 0; - } - .form-inline .form-check-input { - position: relative; - flex-shrink: 0; - margin-top: 0; - margin-right: 0.25rem; - margin-left: 0; - } - .form-inline .custom-control { - align-items: center; - justify-content: center; - } - .form-inline .custom-control-label { - margin-bottom: 0; - } -} - -.btn { - display: inline-block; - font-weight: 400; - color: #212529; - text-align: center; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: transparent; - border: 1px solid transparent; - padding: 0.375rem 0.75rem; - font-size: 1rem; - line-height: 1.5; - border-radius: 0.25rem; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .btn { - transition: none; - } -} -.btn:hover { - color: #212529; - text-decoration: none; -} -.btn:focus, .btn.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.btn.disabled, .btn:disabled { - opacity: 0.65; -} -.btn:not(:disabled):not(.disabled) { - cursor: pointer; -} -a.btn.disabled, -fieldset:disabled a.btn { - pointer-events: none; -} - -.btn-primary { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} -.btn-primary:hover { - color: #fff; - background-color: #0069d9; - border-color: #0062cc; -} -.btn-primary:focus, .btn-primary.focus { - color: #fff; - background-color: #0069d9; - border-color: #0062cc; - box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); -} -.btn-primary.disabled, .btn-primary:disabled { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} -.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #0062cc; - border-color: #005cbf; -} -.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5); -} - -.btn-secondary { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-secondary:hover { - color: #fff; - background-color: #5a6268; - border-color: #545b62; -} -.btn-secondary:focus, .btn-secondary.focus { - color: #fff; - background-color: #5a6268; - border-color: #545b62; - box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} -.btn-secondary.disabled, .btn-secondary:disabled { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { - color: #fff; - background-color: #545b62; - border-color: #4e555b; -} -.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} - -.btn-success { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-success:hover { - color: #fff; - background-color: #218838; - border-color: #1e7e34; -} -.btn-success:focus, .btn-success.focus { - color: #fff; - background-color: #218838; - border-color: #1e7e34; - box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); -} -.btn-success.disabled, .btn-success:disabled { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle { - color: #fff; - background-color: #1e7e34; - border-color: #1c7430; -} -.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5); -} - -.btn-info { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-info:hover { - color: #fff; - background-color: #138496; - border-color: #117a8b; -} -.btn-info:focus, .btn-info.focus { - color: #fff; - background-color: #138496; - border-color: #117a8b; - box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); -} -.btn-info.disabled, .btn-info:disabled { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle { - color: #fff; - background-color: #117a8b; - border-color: #10707f; -} -.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5); -} - -.btn-warning { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-warning:hover { - color: #212529; - background-color: #e0a800; - border-color: #d39e00; -} -.btn-warning:focus, .btn-warning.focus { - color: #212529; - background-color: #e0a800; - border-color: #d39e00; - box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); -} -.btn-warning.disabled, .btn-warning:disabled { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle { - color: #212529; - background-color: #d39e00; - border-color: #c69500; -} -.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5); -} - -.btn-danger { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-danger:hover { - color: #fff; - background-color: #c82333; - border-color: #bd2130; -} -.btn-danger:focus, .btn-danger.focus { - color: #fff; - background-color: #c82333; - border-color: #bd2130; - box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); -} -.btn-danger.disabled, .btn-danger:disabled { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #bd2130; - border-color: #b21f2d; -} -.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5); -} - -.btn-light { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-light:hover { - color: #212529; - background-color: #e2e6ea; - border-color: #dae0e5; -} -.btn-light:focus, .btn-light.focus { - color: #212529; - background-color: #e2e6ea; - border-color: #dae0e5; - box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} -.btn-light.disabled, .btn-light:disabled { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle { - color: #212529; - background-color: #dae0e5; - border-color: #d3d9df; -} -.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} - -.btn-dark { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-dark:hover { - color: #fff; - background-color: #23272b; - border-color: #1d2124; -} -.btn-dark:focus, .btn-dark.focus { - color: #fff; - background-color: #23272b; - border-color: #1d2124; - box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} -.btn-dark.disabled, .btn-dark:disabled { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, .show > .btn-dark.dropdown-toggle { - color: #fff; - background-color: #1d2124; - border-color: #171a1d; -} -.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} - -.btn-outline-primary { - color: #007bff; - border-color: #007bff; -} -.btn-outline-primary:hover { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} -.btn-outline-primary:focus, .btn-outline-primary.focus { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} -.btn-outline-primary.disabled, .btn-outline-primary:disabled { - color: #007bff; - background-color: transparent; -} -.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #007bff; - border-color: #007bff; -} -.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} - -.btn-outline-secondary { - color: #6c757d; - border-color: #6c757d; -} -.btn-outline-secondary:hover { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-outline-secondary:focus, .btn-outline-secondary.focus { - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} -.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { - color: #6c757d; - background-color: transparent; -} -.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: #6c757d; - border-color: #6c757d; -} -.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.btn-outline-success { - color: #28a745; - border-color: #28a745; -} -.btn-outline-success:hover { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-outline-success:focus, .btn-outline-success.focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} -.btn-outline-success.disabled, .btn-outline-success:disabled { - color: #28a745; - background-color: transparent; -} -.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #28a745; - border-color: #28a745; -} -.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.btn-outline-info { - color: #17a2b8; - border-color: #17a2b8; -} -.btn-outline-info:hover { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-outline-info:focus, .btn-outline-info.focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} -.btn-outline-info.disabled, .btn-outline-info:disabled { - color: #17a2b8; - background-color: transparent; -} -.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; -} -.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.btn-outline-warning { - color: #ffc107; - border-color: #ffc107; -} -.btn-outline-warning:hover { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-outline-warning:focus, .btn-outline-warning.focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} -.btn-outline-warning.disabled, .btn-outline-warning:disabled { - color: #ffc107; - background-color: transparent; -} -.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle { - color: #212529; - background-color: #ffc107; - border-color: #ffc107; -} -.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.btn-outline-danger { - color: #dc3545; - border-color: #dc3545; -} -.btn-outline-danger:hover { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-outline-danger:focus, .btn-outline-danger.focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} -.btn-outline-danger.disabled, .btn-outline-danger:disabled { - color: #dc3545; - background-color: transparent; -} -.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #dc3545; - border-color: #dc3545; -} -.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.btn-outline-light { - color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-outline-light:hover { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-outline-light:focus, .btn-outline-light.focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} -.btn-outline-light.disabled, .btn-outline-light:disabled { - color: #f8f9fa; - background-color: transparent; -} -.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; -} -.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.btn-outline-dark { - color: #343a40; - border-color: #343a40; -} -.btn-outline-dark:hover { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-outline-dark:focus, .btn-outline-dark.focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} -.btn-outline-dark.disabled, .btn-outline-dark:disabled { - color: #343a40; - background-color: transparent; -} -.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { - color: #fff; - background-color: #343a40; - border-color: #343a40; -} -.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus { - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.btn-link { - font-weight: 400; - color: #007bff; - text-decoration: none; -} -.btn-link:hover { - color: #0056b3; - text-decoration: underline; -} -.btn-link:focus, .btn-link.focus { - text-decoration: underline; -} -.btn-link:disabled, .btn-link.disabled { - color: #6c757d; - pointer-events: none; -} - -.btn-lg, .btn-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -.btn-sm, .btn-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 0.5rem; -} - -input[type=submit].btn-block, -input[type=reset].btn-block, -input[type=button].btn-block { - width: 100%; -} - -.fade { - transition: opacity 0.15s linear; -} -@media (prefers-reduced-motion: reduce) { - .fade { - transition: none; - } -} -.fade:not(.show) { - opacity: 0; -} - -.collapse:not(.show) { - display: none; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - transition: height 0.35s ease; -} -@media (prefers-reduced-motion: reduce) { - .collapsing { - transition: none; - } -} - -.dropup, -.dropright, -.dropdown, -.dropleft { - position: relative; -} - -.dropdown-toggle { - white-space: nowrap; -} -.dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent; -} -.dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: 0.5rem 0; - margin: 0.125rem 0 0; - font-size: 1rem; - color: #212529; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 0.25rem; -} - -.dropdown-menu-left { - right: auto; - left: 0; -} - -.dropdown-menu-right { - right: 0; - left: auto; -} - -@media (min-width: 576px) { - .dropdown-menu-sm-left { - right: auto; - left: 0; - } - - .dropdown-menu-sm-right { - right: 0; - left: auto; - } -} -@media (min-width: 768px) { - .dropdown-menu-md-left { - right: auto; - left: 0; - } - - .dropdown-menu-md-right { - right: 0; - left: auto; - } -} -@media (min-width: 992px) { - .dropdown-menu-lg-left { - right: auto; - left: 0; - } - - .dropdown-menu-lg-right { - right: 0; - left: auto; - } -} -@media (min-width: 1200px) { - .dropdown-menu-xl-left { - right: auto; - left: 0; - } - - .dropdown-menu-xl-right { - right: 0; - left: auto; - } -} -.dropup .dropdown-menu { - top: auto; - bottom: 100%; - margin-top: 0; - margin-bottom: 0.125rem; -} -.dropup .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent; -} -.dropup .dropdown-toggle:empty::after { - margin-left: 0; -} - -.dropright .dropdown-menu { - top: 0; - right: auto; - left: 100%; - margin-top: 0; - margin-left: 0.125rem; -} -.dropright .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0; - border-bottom: 0.3em solid transparent; - border-left: 0.3em solid; -} -.dropright .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropright .dropdown-toggle::after { - vertical-align: 0; -} - -.dropleft .dropdown-menu { - top: 0; - right: 100%; - left: auto; - margin-top: 0; - margin-right: 0.125rem; -} -.dropleft .dropdown-toggle::after { - display: inline-block; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; -} -.dropleft .dropdown-toggle::after { - display: none; -} -.dropleft .dropdown-toggle::before { - display: inline-block; - margin-right: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid transparent; - border-right: 0.3em solid; - border-bottom: 0.3em solid transparent; -} -.dropleft .dropdown-toggle:empty::after { - margin-left: 0; -} -.dropleft .dropdown-toggle::before { - vertical-align: 0; -} - -.dropdown-menu[x-placement^=top], .dropdown-menu[x-placement^=right], .dropdown-menu[x-placement^=bottom], .dropdown-menu[x-placement^=left] { - right: auto; - bottom: auto; -} - -.dropdown-divider { - height: 0; - margin: 0.5rem 0; - overflow: hidden; - border-top: 1px solid #e9ecef; -} - -.dropdown-item { - display: block; - width: 100%; - padding: 0.25rem 1.5rem; - clear: both; - font-weight: 400; - color: #212529; - text-align: inherit; - white-space: nowrap; - background-color: transparent; - border: 0; -} -.dropdown-item:hover, .dropdown-item:focus { - color: #16181b; - text-decoration: none; - background-color: #f8f9fa; -} -.dropdown-item.active, .dropdown-item:active { - color: #fff; - text-decoration: none; - background-color: #007bff; -} -.dropdown-item.disabled, .dropdown-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: transparent; -} - -.dropdown-menu.show { - display: block; -} - -.dropdown-header { - display: block; - padding: 0.5rem 1.5rem; - margin-bottom: 0; - font-size: 0.875rem; - color: #6c757d; - white-space: nowrap; -} - -.dropdown-item-text { - display: block; - padding: 0.25rem 1.5rem; - color: #212529; -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-flex; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - flex: 1 1 auto; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover { - z-index: 1; -} -.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, -.btn-group-vertical > .btn:focus, -.btn-group-vertical > .btn:active, -.btn-group-vertical > .btn.active { - z-index: 1; -} - -.btn-toolbar { - display: flex; - flex-wrap: wrap; - justify-content: flex-start; -} -.btn-toolbar .input-group { - width: auto; -} - -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) { - margin-left: -1px; -} -.btn-group > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.dropdown-toggle-split { - padding-right: 0.5625rem; - padding-left: 0.5625rem; -} -.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after { - margin-left: 0; -} -.dropleft .dropdown-toggle-split::before { - margin-right: 0; -} - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem; -} - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem; -} - -.btn-group-vertical { - flex-direction: column; - align-items: flex-start; - justify-content: center; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { - width: 100%; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) { - margin-top: -1px; -} -.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group-vertical > .btn-group:not(:last-child) > .btn { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.btn-group-toggle > .btn, -.btn-group-toggle > .btn-group > .btn { - margin-bottom: 0; -} -.btn-group-toggle > .btn input[type=radio], -.btn-group-toggle > .btn input[type=checkbox], -.btn-group-toggle > .btn-group > .btn input[type=radio], -.btn-group-toggle > .btn-group > .btn input[type=checkbox] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} - -.input-group { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: stretch; - width: 100%; -} -.input-group > .form-control, -.input-group > .form-control-plaintext, -.input-group > .custom-select, -.input-group > .custom-file { - position: relative; - flex: 1 1 auto; - width: 1%; - min-width: 0; - margin-bottom: 0; -} -.input-group > .form-control + .form-control, -.input-group > .form-control + .custom-select, -.input-group > .form-control + .custom-file, -.input-group > .form-control-plaintext + .form-control, -.input-group > .form-control-plaintext + .custom-select, -.input-group > .form-control-plaintext + .custom-file, -.input-group > .custom-select + .form-control, -.input-group > .custom-select + .custom-select, -.input-group > .custom-select + .custom-file, -.input-group > .custom-file + .form-control, -.input-group > .custom-file + .custom-select, -.input-group > .custom-file + .custom-file { - margin-left: -1px; -} -.input-group > .form-control:focus, -.input-group > .custom-select:focus, -.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { - z-index: 3; -} -.input-group > .custom-file .custom-file-input:focus { - z-index: 4; -} -.input-group > .form-control:not(:last-child), -.input-group > .custom-select:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group > .form-control:not(:first-child), -.input-group > .custom-select:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group > .custom-file { - display: flex; - align-items: center; -} -.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group > .custom-file:not(:first-child) .custom-file-label { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.input-group-prepend, -.input-group-append { - display: flex; -} -.input-group-prepend .btn, -.input-group-append .btn { - position: relative; - z-index: 2; -} -.input-group-prepend .btn:focus, -.input-group-append .btn:focus { - z-index: 3; -} -.input-group-prepend .btn + .btn, -.input-group-prepend .btn + .input-group-text, -.input-group-prepend .input-group-text + .input-group-text, -.input-group-prepend .input-group-text + .btn, -.input-group-append .btn + .btn, -.input-group-append .btn + .input-group-text, -.input-group-append .input-group-text + .input-group-text, -.input-group-append .input-group-text + .btn { - margin-left: -1px; -} - -.input-group-prepend { - margin-right: -1px; -} - -.input-group-append { - margin-left: -1px; -} - -.input-group-text { - display: flex; - align-items: center; - padding: 0.375rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - text-align: center; - white-space: nowrap; - background-color: #e9ecef; - border: 1px solid #ced4da; - border-radius: 0.25rem; -} -.input-group-text input[type=radio], -.input-group-text input[type=checkbox] { - margin-top: 0; -} - -.input-group-lg > .form-control:not(textarea), -.input-group-lg > .custom-select { - height: calc(1.5em + 1rem + 2px); -} - -.input-group-lg > .form-control, -.input-group-lg > .custom-select, -.input-group-lg > .input-group-prepend > .input-group-text, -.input-group-lg > .input-group-append > .input-group-text, -.input-group-lg > .input-group-prepend > .btn, -.input-group-lg > .input-group-append > .btn { - padding: 0.5rem 1rem; - font-size: 1.25rem; - line-height: 1.5; - border-radius: 0.3rem; -} - -.input-group-sm > .form-control:not(textarea), -.input-group-sm > .custom-select { - height: calc(1.5em + 0.5rem + 2px); -} - -.input-group-sm > .form-control, -.input-group-sm > .custom-select, -.input-group-sm > .input-group-prepend > .input-group-text, -.input-group-sm > .input-group-append > .input-group-text, -.input-group-sm > .input-group-prepend > .btn, -.input-group-sm > .input-group-append > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; - border-radius: 0.2rem; -} - -.input-group-lg > .custom-select, -.input-group-sm > .custom-select { - padding-right: 1.75rem; -} - -.input-group > .input-group-prepend > .btn, -.input-group > .input-group-prepend > .input-group-text, -.input-group > .input-group-append:not(:last-child) > .btn, -.input-group > .input-group-append:not(:last-child) > .input-group-text, -.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group > .input-group-append > .btn, -.input-group > .input-group-append > .input-group-text, -.input-group > .input-group-prepend:not(:first-child) > .btn, -.input-group > .input-group-prepend:not(:first-child) > .input-group-text, -.input-group > .input-group-prepend:first-child > .btn:not(:first-child), -.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.custom-control { - position: relative; - z-index: 1; - display: block; - min-height: 1.5rem; - padding-left: 1.5rem; - -webkit-print-color-adjust: exact; - color-adjust: exact; -} - -.custom-control-inline { - display: inline-flex; - margin-right: 1rem; -} - -.custom-control-input { - position: absolute; - left: 0; - z-index: -1; - width: 1rem; - height: 1.25rem; - opacity: 0; -} -.custom-control-input:checked ~ .custom-control-label::before { - color: #fff; - border-color: #007bff; - background-color: #007bff; -} -.custom-control-input:focus ~ .custom-control-label::before { - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { - border-color: #80bdff; -} -.custom-control-input:not(:disabled):active ~ .custom-control-label::before { - color: #fff; - background-color: #b3d7ff; - border-color: #b3d7ff; -} -.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label { - color: #6c757d; -} -.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before { - background-color: #e9ecef; -} - -.custom-control-label { - position: relative; - margin-bottom: 0; - vertical-align: top; -} -.custom-control-label::before { - position: absolute; - top: 0.25rem; - left: -1.5rem; - display: block; - width: 1rem; - height: 1rem; - pointer-events: none; - content: ""; - background-color: #fff; - border: #adb5bd solid 1px; -} -.custom-control-label::after { - position: absolute; - top: 0.25rem; - left: -1.5rem; - display: block; - width: 1rem; - height: 1rem; - content: ""; - background: no-repeat 50%/50% 50%; -} - -.custom-checkbox .custom-control-label::before { - border-radius: 0.25rem; -} -.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e"); -} -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { - border-color: #007bff; - background-color: #007bff; -} -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); -} -.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(0, 123, 255, 0.5); -} -.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { - background-color: rgba(0, 123, 255, 0.5); -} - -.custom-radio .custom-control-label::before { - border-radius: 50%; -} -.custom-radio .custom-control-input:checked ~ .custom-control-label::after { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); -} -.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(0, 123, 255, 0.5); -} - -.custom-switch { - padding-left: 2.25rem; -} -.custom-switch .custom-control-label::before { - left: -2.25rem; - width: 1.75rem; - pointer-events: all; - border-radius: 0.5rem; -} -.custom-switch .custom-control-label::after { - top: calc(0.25rem + 2px); - left: calc(-2.25rem + 2px); - width: calc(1rem - 4px); - height: calc(1rem - 4px); - background-color: #adb5bd; - border-radius: 0.5rem; - transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .custom-switch .custom-control-label::after { - transition: none; - } -} -.custom-switch .custom-control-input:checked ~ .custom-control-label::after { - background-color: #fff; - transform: translateX(0.75rem); -} -.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { - background-color: rgba(0, 123, 255, 0.5); -} - -.custom-select { - display: inline-block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 1.75rem 0.375rem 0.75rem; - font-size: 1rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - vertical-align: middle; - background: #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; - border: 1px solid #ced4da; - border-radius: 0.25rem; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} -.custom-select:focus { - border-color: #80bdff; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.custom-select:focus::-ms-value { - color: #495057; - background-color: #fff; -} -.custom-select[multiple], .custom-select[size]:not([size="1"]) { - height: auto; - padding-right: 0.75rem; - background-image: none; -} -.custom-select:disabled { - color: #6c757d; - background-color: #e9ecef; -} -.custom-select::-ms-expand { - display: none; -} -.custom-select:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 #495057; -} - -.custom-select-sm { - height: calc(1.5em + 0.5rem + 2px); - padding-top: 0.25rem; - padding-bottom: 0.25rem; - padding-left: 0.5rem; - font-size: 0.875rem; -} - -.custom-select-lg { - height: calc(1.5em + 1rem + 2px); - padding-top: 0.5rem; - padding-bottom: 0.5rem; - padding-left: 1rem; - font-size: 1.25rem; -} - -.custom-file { - position: relative; - display: inline-block; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - margin-bottom: 0; -} - -.custom-file-input { - position: relative; - z-index: 2; - width: 100%; - height: calc(1.5em + 0.75rem + 2px); - margin: 0; - opacity: 0; -} -.custom-file-input:focus ~ .custom-file-label { - border-color: #80bdff; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.custom-file-input[disabled] ~ .custom-file-label, .custom-file-input:disabled ~ .custom-file-label { - background-color: #e9ecef; -} -.custom-file-input:lang(en) ~ .custom-file-label::after { - content: "Browse"; -} -.custom-file-input ~ .custom-file-label[data-browse]::after { - content: attr(data-browse); -} - -.custom-file-label { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 1; - height: calc(1.5em + 0.75rem + 2px); - padding: 0.375rem 0.75rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - background-color: #fff; - border: 1px solid #ced4da; - border-radius: 0.25rem; -} -.custom-file-label::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - z-index: 3; - display: block; - height: calc(1.5em + 0.75rem); - padding: 0.375rem 0.75rem; - line-height: 1.5; - color: #495057; - content: "Browse"; - background-color: #e9ecef; - border-left: inherit; - border-radius: 0 0.25rem 0.25rem 0; -} - -.custom-range { - width: 100%; - height: 1.4rem; - padding: 0; - background-color: transparent; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} -.custom-range:focus { - outline: none; -} -.custom-range:focus::-webkit-slider-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.custom-range:focus::-moz-range-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.custom-range:focus::-ms-thumb { - box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} -.custom-range::-moz-focus-outer { - border: 0; -} -.custom-range::-webkit-slider-thumb { - width: 1rem; - height: 1rem; - margin-top: -0.25rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - -webkit-appearance: none; - appearance: none; -} -@media (prefers-reduced-motion: reduce) { - .custom-range::-webkit-slider-thumb { - -webkit-transition: none; - transition: none; - } -} -.custom-range::-webkit-slider-thumb:active { - background-color: #b3d7ff; -} -.custom-range::-webkit-slider-runnable-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; -} -.custom-range::-moz-range-thumb { - width: 1rem; - height: 1rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - -moz-appearance: none; - appearance: none; -} -@media (prefers-reduced-motion: reduce) { - .custom-range::-moz-range-thumb { - -moz-transition: none; - transition: none; - } -} -.custom-range::-moz-range-thumb:active { - background-color: #b3d7ff; -} -.custom-range::-moz-range-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: #dee2e6; - border-color: transparent; - border-radius: 1rem; -} -.custom-range::-ms-thumb { - width: 1rem; - height: 1rem; - margin-top: 0; - margin-right: 0.2rem; - margin-left: 0.2rem; - background-color: #007bff; - border: 0; - border-radius: 1rem; - -ms-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - appearance: none; -} -@media (prefers-reduced-motion: reduce) { - .custom-range::-ms-thumb { - -ms-transition: none; - transition: none; - } -} -.custom-range::-ms-thumb:active { - background-color: #b3d7ff; -} -.custom-range::-ms-track { - width: 100%; - height: 0.5rem; - color: transparent; - cursor: pointer; - background-color: transparent; - border-color: transparent; - border-width: 0.5rem; -} -.custom-range::-ms-fill-lower { - background-color: #dee2e6; - border-radius: 1rem; -} -.custom-range::-ms-fill-upper { - margin-right: 15px; - background-color: #dee2e6; - border-radius: 1rem; -} -.custom-range:disabled::-webkit-slider-thumb { - background-color: #adb5bd; -} -.custom-range:disabled::-webkit-slider-runnable-track { - cursor: default; -} -.custom-range:disabled::-moz-range-thumb { - background-color: #adb5bd; -} -.custom-range:disabled::-moz-range-track { - cursor: default; -} -.custom-range:disabled::-ms-thumb { - background-color: #adb5bd; -} - -.custom-control-label::before, -.custom-file-label, -.custom-select { - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .custom-control-label::before, -.custom-file-label, -.custom-select { - transition: none; - } -} - -.nav { - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav-link { - display: block; - padding: 0.5rem 1rem; -} -.nav-link:hover, .nav-link:focus { - text-decoration: none; -} -.nav-link.disabled { - color: #6c757d; - pointer-events: none; - cursor: default; -} - -.nav-tabs { - border-bottom: 1px solid #dee2e6; -} -.nav-tabs .nav-item { - margin-bottom: -1px; -} -.nav-tabs .nav-link { - border: 1px solid transparent; - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} -.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { - border-color: #e9ecef #e9ecef #dee2e6; -} -.nav-tabs .nav-link.disabled { - color: #6c757d; - background-color: transparent; - border-color: transparent; -} -.nav-tabs .nav-link.active, -.nav-tabs .nav-item.show .nav-link { - color: #495057; - background-color: #fff; - border-color: #dee2e6 #dee2e6 #fff; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.nav-pills .nav-link { - border-radius: 0.25rem; -} -.nav-pills .nav-link.active, -.nav-pills .show > .nav-link { - color: #fff; - background-color: #007bff; -} - -.nav-fill > .nav-link, -.nav-fill .nav-item { - flex: 1 1 auto; - text-align: center; -} - -.nav-justified > .nav-link, -.nav-justified .nav-item { - flex-basis: 0; - flex-grow: 1; - text-align: center; -} - -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} - -.navbar { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding: 0.5rem 1rem; -} -.navbar .container, -.navbar .container-fluid, -.navbar .container-sm, -.navbar .container-md, -.navbar .container-lg, -.navbar .container-xl { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; -} -.navbar-brand { - display: inline-block; - padding-top: 0.3125rem; - padding-bottom: 0.3125rem; - margin-right: 1rem; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap; -} -.navbar-brand:hover, .navbar-brand:focus { - text-decoration: none; -} - -.navbar-nav { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} -.navbar-nav .dropdown-menu { - position: static; - float: none; -} - -.navbar-text { - display: inline-block; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.navbar-collapse { - flex-basis: 100%; - flex-grow: 1; - align-items: center; -} - -.navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.25rem; - line-height: 1; - background-color: transparent; - border: 1px solid transparent; - border-radius: 0.25rem; -} -.navbar-toggler:hover, .navbar-toggler:focus { - text-decoration: none; -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: ""; - background: no-repeat center center; - background-size: 100% 100%; -} - -@media (max-width: 575.98px) { - .navbar-expand-sm > .container, -.navbar-expand-sm > .container-fluid, -.navbar-expand-sm > .container-sm, -.navbar-expand-sm > .container-md, -.navbar-expand-sm > .container-lg, -.navbar-expand-sm > .container-xl { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 576px) { - .navbar-expand-sm { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-sm .navbar-nav { - flex-direction: row; - } - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-sm > .container, -.navbar-expand-sm > .container-fluid, -.navbar-expand-sm > .container-sm, -.navbar-expand-sm > .container-md, -.navbar-expand-sm > .container-lg, -.navbar-expand-sm > .container-xl { - flex-wrap: nowrap; - } - .navbar-expand-sm .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-sm .navbar-toggler { - display: none; - } -} -@media (max-width: 767.98px) { - .navbar-expand-md > .container, -.navbar-expand-md > .container-fluid, -.navbar-expand-md > .container-sm, -.navbar-expand-md > .container-md, -.navbar-expand-md > .container-lg, -.navbar-expand-md > .container-xl { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 768px) { - .navbar-expand-md { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-md .navbar-nav { - flex-direction: row; - } - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-md .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-md > .container, -.navbar-expand-md > .container-fluid, -.navbar-expand-md > .container-sm, -.navbar-expand-md > .container-md, -.navbar-expand-md > .container-lg, -.navbar-expand-md > .container-xl { - flex-wrap: nowrap; - } - .navbar-expand-md .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-md .navbar-toggler { - display: none; - } -} -@media (max-width: 991.98px) { - .navbar-expand-lg > .container, -.navbar-expand-lg > .container-fluid, -.navbar-expand-lg > .container-sm, -.navbar-expand-lg > .container-md, -.navbar-expand-lg > .container-lg, -.navbar-expand-lg > .container-xl { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 992px) { - .navbar-expand-lg { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-lg .navbar-nav { - flex-direction: row; - } - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-lg > .container, -.navbar-expand-lg > .container-fluid, -.navbar-expand-lg > .container-sm, -.navbar-expand-lg > .container-md, -.navbar-expand-lg > .container-lg, -.navbar-expand-lg > .container-xl { - flex-wrap: nowrap; - } - .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-lg .navbar-toggler { - display: none; - } -} -@media (max-width: 1199.98px) { - .navbar-expand-xl > .container, -.navbar-expand-xl > .container-fluid, -.navbar-expand-xl > .container-sm, -.navbar-expand-xl > .container-md, -.navbar-expand-xl > .container-lg, -.navbar-expand-xl > .container-xl { - padding-right: 0; - padding-left: 0; - } -} -@media (min-width: 1200px) { - .navbar-expand-xl { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-xl .navbar-nav { - flex-direction: row; - } - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; - } - .navbar-expand-xl > .container, -.navbar-expand-xl > .container-fluid, -.navbar-expand-xl > .container-sm, -.navbar-expand-xl > .container-md, -.navbar-expand-xl > .container-lg, -.navbar-expand-xl > .container-xl { - flex-wrap: nowrap; - } - .navbar-expand-xl .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-xl .navbar-toggler { - display: none; - } -} -.navbar-expand { - flex-flow: row nowrap; - justify-content: flex-start; -} -.navbar-expand > .container, -.navbar-expand > .container-fluid, -.navbar-expand > .container-sm, -.navbar-expand > .container-md, -.navbar-expand > .container-lg, -.navbar-expand > .container-xl { - padding-right: 0; - padding-left: 0; -} -.navbar-expand .navbar-nav { - flex-direction: row; -} -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} -.navbar-expand .navbar-nav .nav-link { - padding-right: 0.5rem; - padding-left: 0.5rem; -} -.navbar-expand > .container, -.navbar-expand > .container-fluid, -.navbar-expand > .container-sm, -.navbar-expand > .container-md, -.navbar-expand > .container-lg, -.navbar-expand > .container-xl { - flex-wrap: nowrap; -} -.navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; -} -.navbar-expand .navbar-toggler { - display: none; -} - -.navbar-light .navbar-brand { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-nav .nav-link { - color: rgba(0, 0, 0, 0.5); -} -.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { - color: rgba(0, 0, 0, 0.7); -} -.navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0, 0, 0, 0.3); -} -.navbar-light .navbar-nav .show > .nav-link, -.navbar-light .navbar-nav .active > .nav-link, -.navbar-light .navbar-nav .nav-link.show, -.navbar-light .navbar-nav .nav-link.active { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-toggler { - color: rgba(0, 0, 0, 0.5); - border-color: rgba(0, 0, 0, 0.1); -} -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-light .navbar-text { - color: rgba(0, 0, 0, 0.5); -} -.navbar-light .navbar-text a { - color: rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { - color: rgba(0, 0, 0, 0.9); -} - -.navbar-dark .navbar-brand { - color: #fff; -} -.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { - color: #fff; -} -.navbar-dark .navbar-nav .nav-link { - color: rgba(255, 255, 255, 0.5); -} -.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { - color: rgba(255, 255, 255, 0.75); -} -.navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255, 255, 255, 0.25); -} -.navbar-dark .navbar-nav .show > .nav-link, -.navbar-dark .navbar-nav .active > .nav-link, -.navbar-dark .navbar-nav .nav-link.show, -.navbar-dark .navbar-nav .nav-link.active { - color: #fff; -} -.navbar-dark .navbar-toggler { - color: rgba(255, 255, 255, 0.5); - border-color: rgba(255, 255, 255, 0.1); -} -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-dark .navbar-text { - color: rgba(255, 255, 255, 0.5); -} -.navbar-dark .navbar-text a { - color: #fff; -} -.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { - color: #fff; -} - -.card { - position: relative; - display: flex; - flex-direction: column; - min-width: 0; - word-wrap: break-word; - background-color: #fff; - background-clip: border-box; - border: 1px solid rgba(0, 0, 0, 0.125); - border-radius: 0.25rem; -} -.card > hr { - margin-right: 0; - margin-left: 0; -} -.card > .list-group { - border-top: inherit; - border-bottom: inherit; -} -.card > .list-group:first-child { - border-top-width: 0; - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); -} -.card > .list-group:last-child { - border-bottom-width: 0; - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px); -} -.card > .card-header + .list-group, -.card > .list-group + .card-footer { - border-top: 0; -} - -.card-body { - flex: 1 1 auto; - min-height: 1px; - padding: 1.25rem; -} - -.card-title { - margin-bottom: 0.75rem; -} - -.card-subtitle { - margin-top: -0.375rem; - margin-bottom: 0; -} - -.card-text:last-child { - margin-bottom: 0; -} - -.card-link:hover { - text-decoration: none; -} -.card-link + .card-link { - margin-left: 1.25rem; -} - -.card-header { - padding: 0.75rem 1.25rem; - margin-bottom: 0; - background-color: rgba(0, 0, 0, 0.03); - border-bottom: 1px solid rgba(0, 0, 0, 0.125); -} -.card-header:first-child { - border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; -} - -.card-footer { - padding: 0.75rem 1.25rem; - background-color: rgba(0, 0, 0, 0.03); - border-top: 1px solid rgba(0, 0, 0, 0.125); -} -.card-footer:last-child { - border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); -} - -.card-header-tabs { - margin-right: -0.625rem; - margin-bottom: -0.75rem; - margin-left: -0.625rem; - border-bottom: 0; -} - -.card-header-pills { - margin-right: -0.625rem; - margin-left: -0.625rem; -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem; - border-radius: calc(0.25rem - 1px); -} - -.card-img, -.card-img-top, -.card-img-bottom { - flex-shrink: 0; - width: 100%; -} - -.card-img, -.card-img-top { - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); -} - -.card-img, -.card-img-bottom { - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px); -} - -.card-deck .card { - margin-bottom: 15px; -} -@media (min-width: 576px) { - .card-deck { - display: flex; - flex-flow: row wrap; - margin-right: -15px; - margin-left: -15px; - } - .card-deck .card { - flex: 1 0 0%; - margin-right: 15px; - margin-bottom: 0; - margin-left: 15px; - } -} - -.card-group > .card { - margin-bottom: 15px; -} -@media (min-width: 576px) { - .card-group { - display: flex; - flex-flow: row wrap; - } - .card-group > .card { - flex: 1 0 0%; - margin-bottom: 0; - } - .card-group > .card + .card { - margin-left: 0; - border-left: 0; - } - .card-group > .card:not(:last-child) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - .card-group > .card:not(:last-child) .card-img-top, -.card-group > .card:not(:last-child) .card-header { - border-top-right-radius: 0; - } - .card-group > .card:not(:last-child) .card-img-bottom, -.card-group > .card:not(:last-child) .card-footer { - border-bottom-right-radius: 0; - } - .card-group > .card:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - .card-group > .card:not(:first-child) .card-img-top, -.card-group > .card:not(:first-child) .card-header { - border-top-left-radius: 0; - } - .card-group > .card:not(:first-child) .card-img-bottom, -.card-group > .card:not(:first-child) .card-footer { - border-bottom-left-radius: 0; - } -} - -.card-columns .card { - margin-bottom: 0.75rem; -} -@media (min-width: 576px) { - .card-columns { - -moz-column-count: 3; - column-count: 3; - -moz-column-gap: 1.25rem; - column-gap: 1.25rem; - orphans: 1; - widows: 1; - } - .card-columns .card { - display: inline-block; - width: 100%; - } -} - -.accordion { - overflow-anchor: none; -} -.accordion > .card { - overflow: hidden; -} -.accordion > .card:not(:last-of-type) { - border-bottom: 0; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.accordion > .card:not(:first-of-type) { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.accordion > .card > .card-header { - border-radius: 0; - margin-bottom: -1px; -} - -.breadcrumb { - display: flex; - flex-wrap: wrap; - padding: 0.75rem 1rem; - margin-bottom: 1rem; - list-style: none; - background-color: #e9ecef; - border-radius: 0.25rem; -} - -.breadcrumb-item { - display: flex; -} -.breadcrumb-item + .breadcrumb-item { - padding-left: 0.5rem; -} -.breadcrumb-item + .breadcrumb-item::before { - display: inline-block; - padding-right: 0.5rem; - color: #6c757d; - content: "/"; -} -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: underline; -} -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: none; -} -.breadcrumb-item.active { - color: #6c757d; -} - -.pagination { - display: flex; - padding-left: 0; - list-style: none; - border-radius: 0.25rem; -} - -.page-link { - position: relative; - display: block; - padding: 0.5rem 0.75rem; - margin-left: -1px; - line-height: 1.25; - color: #007bff; - background-color: #fff; - border: 1px solid #dee2e6; -} -.page-link:hover { - z-index: 2; - color: #0056b3; - text-decoration: none; - background-color: #e9ecef; - border-color: #dee2e6; -} -.page-link:focus { - z-index: 3; - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); -} - -.page-item:first-child .page-link { - margin-left: 0; - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem; -} -.page-item:last-child .page-link { - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; -} -.page-item.active .page-link { - z-index: 3; - color: #fff; - background-color: #007bff; - border-color: #007bff; -} -.page-item.disabled .page-link { - color: #6c757d; - pointer-events: none; - cursor: auto; - background-color: #fff; - border-color: #dee2e6; -} - -.pagination-lg .page-link { - padding: 0.75rem 1.5rem; - font-size: 1.25rem; - line-height: 1.5; -} -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: 0.3rem; - border-bottom-left-radius: 0.3rem; -} -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: 0.3rem; - border-bottom-right-radius: 0.3rem; -} - -.pagination-sm .page-link { - padding: 0.25rem 0.5rem; - font-size: 0.875rem; - line-height: 1.5; -} -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: 0.2rem; - border-bottom-left-radius: 0.2rem; -} -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: 0.2rem; - border-bottom-right-radius: 0.2rem; -} - -.badge { - display: inline-block; - padding: 0.25em 0.4em; - font-size: 75%; - font-weight: 700; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: 0.25rem; - transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .badge { - transition: none; - } -} -a.badge:hover, a.badge:focus { - text-decoration: none; -} - -.badge:empty { - display: none; -} - -.btn .badge { - position: relative; - top: -1px; -} - -.badge-pill { - padding-right: 0.6em; - padding-left: 0.6em; - border-radius: 10rem; -} - -.badge-primary { - color: #fff; - background-color: #007bff; -} -a.badge-primary:hover, a.badge-primary:focus { - color: #fff; - background-color: #0062cc; -} -a.badge-primary:focus, a.badge-primary.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5); -} - -.badge-secondary { - color: #fff; - background-color: #6c757d; -} -a.badge-secondary:hover, a.badge-secondary:focus { - color: #fff; - background-color: #545b62; -} -a.badge-secondary:focus, a.badge-secondary.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.badge-success { - color: #fff; - background-color: #28a745; -} -a.badge-success:hover, a.badge-success:focus { - color: #fff; - background-color: #1e7e34; -} -a.badge-success:focus, a.badge-success.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5); -} - -.badge-info { - color: #fff; - background-color: #17a2b8; -} -a.badge-info:hover, a.badge-info:focus { - color: #fff; - background-color: #117a8b; -} -a.badge-info:focus, a.badge-info.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5); -} - -.badge-warning { - color: #212529; - background-color: #ffc107; -} -a.badge-warning:hover, a.badge-warning:focus { - color: #212529; - background-color: #d39e00; -} -a.badge-warning:focus, a.badge-warning.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5); -} - -.badge-danger { - color: #fff; - background-color: #dc3545; -} -a.badge-danger:hover, a.badge-danger:focus { - color: #fff; - background-color: #bd2130; -} -a.badge-danger:focus, a.badge-danger.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5); -} - -.badge-light { - color: #212529; - background-color: #f8f9fa; -} -a.badge-light:hover, a.badge-light:focus { - color: #212529; - background-color: #dae0e5; -} -a.badge-light:focus, a.badge-light.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.badge-dark { - color: #fff; - background-color: #343a40; -} -a.badge-dark:hover, a.badge-dark:focus { - color: #fff; - background-color: #1d2124; -} -a.badge-dark:focus, a.badge-dark.focus { - outline: 0; - box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #e9ecef; - border-radius: 0.3rem; -} -@media (min-width: 576px) { - .jumbotron { - padding: 4rem 2rem; - } -} - -.jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0; -} - -.alert { - position: relative; - padding: 0.75rem 1.25rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0.25rem; -} - -.alert-heading { - color: inherit; -} - -.alert-link { - font-weight: 700; -} - -.alert-dismissible { - padding-right: 4rem; -} -.alert-dismissible .close { - position: absolute; - top: 0; - right: 0; - z-index: 2; - padding: 0.75rem 1.25rem; - color: inherit; -} - -.alert-primary { - color: #004085; - background-color: #cce5ff; - border-color: #b8daff; -} -.alert-primary hr { - border-top-color: #9fcdff; -} -.alert-primary .alert-link { - color: #002752; -} - -.alert-secondary { - color: #383d41; - background-color: #e2e3e5; - border-color: #d6d8db; -} -.alert-secondary hr { - border-top-color: #c8cbcf; -} -.alert-secondary .alert-link { - color: #202326; -} - -.alert-success { - color: #155724; - background-color: #d4edda; - border-color: #c3e6cb; -} -.alert-success hr { - border-top-color: #b1dfbb; -} -.alert-success .alert-link { - color: #0b2e13; -} - -.alert-info { - color: #0c5460; - background-color: #d1ecf1; - border-color: #bee5eb; -} -.alert-info hr { - border-top-color: #abdde5; -} -.alert-info .alert-link { - color: #062c33; -} - -.alert-warning { - color: #856404; - background-color: #fff3cd; - border-color: #ffeeba; -} -.alert-warning hr { - border-top-color: #ffe8a1; -} -.alert-warning .alert-link { - color: #533f03; -} - -.alert-danger { - color: #721c24; - background-color: #f8d7da; - border-color: #f5c6cb; -} -.alert-danger hr { - border-top-color: #f1b0b7; -} -.alert-danger .alert-link { - color: #491217; -} - -.alert-light { - color: #818182; - background-color: #fefefe; - border-color: #fdfdfe; -} -.alert-light hr { - border-top-color: #ececf6; -} -.alert-light .alert-link { - color: #686868; -} - -.alert-dark { - color: #1b1e21; - background-color: #d6d8d9; - border-color: #c6c8ca; -} -.alert-dark hr { - border-top-color: #b9bbbe; -} -.alert-dark .alert-link { - color: #040505; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0; - } - to { - background-position: 0 0; - } -} -.progress { - display: flex; - height: 1rem; - overflow: hidden; - line-height: 0; - font-size: 0.75rem; - background-color: #e9ecef; - border-radius: 0.25rem; -} - -.progress-bar { - display: flex; - flex-direction: column; - justify-content: center; - overflow: hidden; - color: #fff; - text-align: center; - white-space: nowrap; - background-color: #007bff; - transition: width 0.6s ease; -} -@media (prefers-reduced-motion: reduce) { - .progress-bar { - transition: none; - } -} - -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem; -} - -.progress-bar-animated { - -webkit-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite; -} -@media (prefers-reduced-motion: reduce) { - .progress-bar-animated { - -webkit-animation: none; - animation: none; - } -} - -.media { - display: flex; - align-items: flex-start; -} - -.media-body { - flex: 1; -} - -.list-group { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - border-radius: 0.25rem; -} - -.list-group-item-action { - width: 100%; - color: #495057; - text-align: inherit; -} -.list-group-item-action:hover, .list-group-item-action:focus { - z-index: 1; - color: #495057; - text-decoration: none; - background-color: #f8f9fa; -} -.list-group-item-action:active { - color: #212529; - background-color: #e9ecef; -} - -.list-group-item { - position: relative; - display: block; - padding: 0.75rem 1.25rem; - background-color: #fff; - border: 1px solid rgba(0, 0, 0, 0.125); -} -.list-group-item:first-child { - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} -.list-group-item:last-child { - border-bottom-right-radius: inherit; - border-bottom-left-radius: inherit; -} -.list-group-item.disabled, .list-group-item:disabled { - color: #6c757d; - pointer-events: none; - background-color: #fff; -} -.list-group-item.active { - z-index: 2; - color: #fff; - background-color: #007bff; - border-color: #007bff; -} -.list-group-item + .list-group-item { - border-top-width: 0; -} -.list-group-item + .list-group-item.active { - margin-top: -1px; - border-top-width: 1px; -} - -.list-group-horizontal { - flex-direction: row; -} -.list-group-horizontal > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; -} -.list-group-horizontal > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; -} -.list-group-horizontal > .list-group-item.active { - margin-top: 0; -} -.list-group-horizontal > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; -} -.list-group-horizontal > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; -} - -@media (min-width: 576px) { - .list-group-horizontal-sm { - flex-direction: row; - } - .list-group-horizontal-sm > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-sm > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } - .list-group-horizontal-sm > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 768px) { - .list-group-horizontal-md { - flex-direction: row; - } - .list-group-horizontal-md > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-md > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } - .list-group-horizontal-md > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 992px) { - .list-group-horizontal-lg { - flex-direction: row; - } - .list-group-horizontal-lg > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-lg > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } - .list-group-horizontal-lg > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -@media (min-width: 1200px) { - .list-group-horizontal-xl { - flex-direction: row; - } - .list-group-horizontal-xl > .list-group-item:first-child { - border-bottom-left-radius: 0.25rem; - border-top-right-radius: 0; - } - .list-group-horizontal-xl > .list-group-item:last-child { - border-top-right-radius: 0.25rem; - border-bottom-left-radius: 0; - } - .list-group-horizontal-xl > .list-group-item.active { - margin-top: 0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item { - border-top-width: 1px; - border-left-width: 0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item.active { - margin-left: -1px; - border-left-width: 1px; - } -} -.list-group-flush { - border-radius: 0; -} -.list-group-flush > .list-group-item { - border-width: 0 0 1px; -} -.list-group-flush > .list-group-item:last-child { - border-bottom-width: 0; -} - -.list-group-item-primary { - color: #004085; - background-color: #b8daff; -} -.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { - color: #004085; - background-color: #9fcdff; -} -.list-group-item-primary.list-group-item-action.active { - color: #fff; - background-color: #004085; - border-color: #004085; -} - -.list-group-item-secondary { - color: #383d41; - background-color: #d6d8db; -} -.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { - color: #383d41; - background-color: #c8cbcf; -} -.list-group-item-secondary.list-group-item-action.active { - color: #fff; - background-color: #383d41; - border-color: #383d41; -} - -.list-group-item-success { - color: #155724; - background-color: #c3e6cb; -} -.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { - color: #155724; - background-color: #b1dfbb; -} -.list-group-item-success.list-group-item-action.active { - color: #fff; - background-color: #155724; - border-color: #155724; -} - -.list-group-item-info { - color: #0c5460; - background-color: #bee5eb; -} -.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { - color: #0c5460; - background-color: #abdde5; -} -.list-group-item-info.list-group-item-action.active { - color: #fff; - background-color: #0c5460; - border-color: #0c5460; -} - -.list-group-item-warning { - color: #856404; - background-color: #ffeeba; -} -.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { - color: #856404; - background-color: #ffe8a1; -} -.list-group-item-warning.list-group-item-action.active { - color: #fff; - background-color: #856404; - border-color: #856404; -} - -.list-group-item-danger { - color: #721c24; - background-color: #f5c6cb; -} -.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { - color: #721c24; - background-color: #f1b0b7; -} -.list-group-item-danger.list-group-item-action.active { - color: #fff; - background-color: #721c24; - border-color: #721c24; -} - -.list-group-item-light { - color: #818182; - background-color: #fdfdfe; -} -.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { - color: #818182; - background-color: #ececf6; -} -.list-group-item-light.list-group-item-action.active { - color: #fff; - background-color: #818182; - border-color: #818182; -} - -.list-group-item-dark { - color: #1b1e21; - background-color: #c6c8ca; -} -.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { - color: #1b1e21; - background-color: #b9bbbe; -} -.list-group-item-dark.list-group-item-action.active { - color: #fff; - background-color: #1b1e21; - border-color: #1b1e21; -} - -.close { - float: right; - font-size: 1.5rem; - font-weight: 700; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: 0.5; -} -.close:hover { - color: #000; - text-decoration: none; -} -.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { - opacity: 0.75; -} - -button.close { - padding: 0; - background-color: transparent; - border: 0; -} - -a.close.disabled { - pointer-events: none; -} - -.toast { - flex-basis: 350px; - max-width: 350px; - font-size: 0.875rem; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.1); - box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); - opacity: 0; - border-radius: 0.25rem; -} -.toast:not(:last-child) { - margin-bottom: 0.75rem; -} -.toast.showing { - opacity: 1; -} -.toast.show { - display: block; - opacity: 1; -} -.toast.hide { - display: none; -} - -.toast-header { - display: flex; - align-items: center; - padding: 0.25rem 0.75rem; - color: #6c757d; - background-color: rgba(255, 255, 255, 0.85); - background-clip: padding-box; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px); -} - -.toast-body { - padding: 0.75rem; -} - -.modal-open { - overflow: hidden; -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} - -.modal { - position: fixed; - top: 0; - left: 0; - z-index: 1050; - display: none; - width: 100%; - height: 100%; - overflow: hidden; - outline: 0; -} - -.modal-dialog { - position: relative; - width: auto; - margin: 0.5rem; - pointer-events: none; -} -.modal.fade .modal-dialog { - transition: transform 0.3s ease-out; - transform: translate(0, -50px); -} -@media (prefers-reduced-motion: reduce) { - .modal.fade .modal-dialog { - transition: none; - } -} -.modal.show .modal-dialog { - transform: none; -} -.modal.modal-static .modal-dialog { - transform: scale(1.02); -} - -.modal-dialog-scrollable { - display: flex; - max-height: calc(100% - 1rem); -} -.modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 1rem); - overflow: hidden; -} -.modal-dialog-scrollable .modal-header, -.modal-dialog-scrollable .modal-footer { - flex-shrink: 0; -} -.modal-dialog-scrollable .modal-body { - overflow-y: auto; -} - -.modal-dialog-centered { - display: flex; - align-items: center; - min-height: calc(100% - 1rem); -} -.modal-dialog-centered::before { - display: block; - height: calc(100vh - 1rem); - height: -webkit-min-content; - height: -moz-min-content; - height: min-content; - content: ""; -} -.modal-dialog-centered.modal-dialog-scrollable { - flex-direction: column; - justify-content: center; - height: 100%; -} -.modal-dialog-centered.modal-dialog-scrollable .modal-content { - max-height: none; -} -.modal-dialog-centered.modal-dialog-scrollable::before { - content: none; -} - -.modal-content { - position: relative; - display: flex; - flex-direction: column; - width: 100%; - pointer-events: auto; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; - outline: 0; -} - -.modal-backdrop { - position: fixed; - top: 0; - left: 0; - z-index: 1040; - width: 100vw; - height: 100vh; - background-color: #000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop.show { - opacity: 0.5; -} - -.modal-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - padding: 1rem 1rem; - border-bottom: 1px solid #dee2e6; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); -} -.modal-header .close { - padding: 1rem 1rem; - margin: -1rem -1rem -1rem auto; -} - -.modal-title { - margin-bottom: 0; - line-height: 1.5; -} - -.modal-body { - position: relative; - flex: 1 1 auto; - padding: 1rem; -} - -.modal-footer { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: flex-end; - padding: 0.75rem; - border-top: 1px solid #dee2e6; - border-bottom-right-radius: calc(0.3rem - 1px); - border-bottom-left-radius: calc(0.3rem - 1px); -} -.modal-footer > * { - margin: 0.25rem; -} - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} - -@media (min-width: 576px) { - .modal-dialog { - max-width: 500px; - margin: 1.75rem auto; - } - - .modal-dialog-scrollable { - max-height: calc(100% - 3.5rem); - } - .modal-dialog-scrollable .modal-content { - max-height: calc(100vh - 3.5rem); - } - - .modal-dialog-centered { - min-height: calc(100% - 3.5rem); - } - .modal-dialog-centered::before { - height: calc(100vh - 3.5rem); - height: -webkit-min-content; - height: -moz-min-content; - height: min-content; - } - - .modal-sm { - max-width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg, -.modal-xl { - max-width: 800px; - } -} -@media (min-width: 1200px) { - .modal-xl { - max-width: 1140px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 0.875rem; - word-wrap: break-word; - opacity: 0; -} -.tooltip.show { - opacity: 0.9; -} -.tooltip .arrow { - position: absolute; - display: block; - width: 0.8rem; - height: 0.4rem; -} -.tooltip .arrow::before { - position: absolute; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-tooltip-top, .bs-tooltip-auto[x-placement^=top] { - padding: 0.4rem 0; -} -.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=top] .arrow { - bottom: 0; -} -.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=top] .arrow::before { - top: 0; - border-width: 0.4rem 0.4rem 0; - border-top-color: #000; -} - -.bs-tooltip-right, .bs-tooltip-auto[x-placement^=right] { - padding: 0 0.4rem; -} -.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=right] .arrow { - left: 0; - width: 0.4rem; - height: 0.8rem; -} -.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=right] .arrow::before { - right: 0; - border-width: 0.4rem 0.4rem 0.4rem 0; - border-right-color: #000; -} - -.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=bottom] { - padding: 0.4rem 0; -} -.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=bottom] .arrow { - top: 0; -} -.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=bottom] .arrow::before { - bottom: 0; - border-width: 0 0.4rem 0.4rem; - border-bottom-color: #000; -} - -.bs-tooltip-left, .bs-tooltip-auto[x-placement^=left] { - padding: 0 0.4rem; -} -.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=left] .arrow { - right: 0; - width: 0.4rem; - height: 0.8rem; -} -.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=left] .arrow::before { - left: 0; - border-width: 0.4rem 0 0.4rem 0.4rem; - border-left-color: #000; -} - -.tooltip-inner { - max-width: 200px; - padding: 0.25rem 0.5rem; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 0.25rem; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 0.875rem; - word-wrap: break-word; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 0.3rem; -} -.popover .arrow { - position: absolute; - display: block; - width: 1rem; - height: 0.5rem; - margin: 0 0.3rem; -} -.popover .arrow::before, .popover .arrow::after { - position: absolute; - display: block; - content: ""; - border-color: transparent; - border-style: solid; -} - -.bs-popover-top, .bs-popover-auto[x-placement^=top] { - margin-bottom: 0.5rem; -} -.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=top] > .arrow { - bottom: calc(-0.5rem - 1px); -} -.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=top] > .arrow::before { - bottom: 0; - border-width: 0.5rem 0.5rem 0; - border-top-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=top] > .arrow::after { - bottom: 1px; - border-width: 0.5rem 0.5rem 0; - border-top-color: #fff; -} - -.bs-popover-right, .bs-popover-auto[x-placement^=right] { - margin-left: 0.5rem; -} -.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=right] > .arrow { - left: calc(-0.5rem - 1px); - width: 0.5rem; - height: 1rem; - margin: 0.3rem 0; -} -.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=right] > .arrow::before { - left: 0; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=right] > .arrow::after { - left: 1px; - border-width: 0.5rem 0.5rem 0.5rem 0; - border-right-color: #fff; -} - -.bs-popover-bottom, .bs-popover-auto[x-placement^=bottom] { - margin-top: 0.5rem; -} -.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=bottom] > .arrow { - top: calc(-0.5rem - 1px); -} -.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=bottom] > .arrow::before { - top: 0; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=bottom] > .arrow::after { - top: 1px; - border-width: 0 0.5rem 0.5rem 0.5rem; - border-bottom-color: #fff; -} -.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=bottom] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 1rem; - margin-left: -0.5rem; - content: ""; - border-bottom: 1px solid #f7f7f7; -} - -.bs-popover-left, .bs-popover-auto[x-placement^=left] { - margin-right: 0.5rem; -} -.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=left] > .arrow { - right: calc(-0.5rem - 1px); - width: 0.5rem; - height: 1rem; - margin: 0.3rem 0; -} -.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=left] > .arrow::before { - right: 0; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: rgba(0, 0, 0, 0.25); -} -.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=left] > .arrow::after { - right: 1px; - border-width: 0.5rem 0 0.5rem 0.5rem; - border-left-color: #fff; -} - -.popover-header { - padding: 0.5rem 0.75rem; - margin-bottom: 0; - font-size: 1rem; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px); -} -.popover-header:empty { - display: none; -} - -.popover-body { - padding: 0.5rem 0.75rem; - color: #212529; -} - -.carousel { - position: relative; -} - -.carousel.pointer-event { - touch-action: pan-y; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner::after { - display: block; - clear: both; - content: ""; -} - -.carousel-item { - position: relative; - display: none; - float: left; - width: 100%; - margin-right: -100%; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - transition: transform 0.6s ease-in-out; -} -@media (prefers-reduced-motion: reduce) { - .carousel-item { - transition: none; - } -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev { - display: block; -} - -.carousel-item-next:not(.carousel-item-left), -.active.carousel-item-right { - transform: translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-right), -.active.carousel-item-left { - transform: translateX(-100%); -} - -.carousel-fade .carousel-item { - opacity: 0; - transition-property: opacity; - transform: none; -} -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-left, -.carousel-fade .carousel-item-prev.carousel-item-right { - z-index: 1; - opacity: 1; -} -.carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-right { - z-index: 0; - opacity: 0; - transition: opacity 0s 0.6s; -} -@media (prefers-reduced-motion: reduce) { - .carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-right { - transition: none; - } -} - -.carousel-control-prev, -.carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - z-index: 1; - display: flex; - align-items: center; - justify-content: center; - width: 15%; - color: #fff; - text-align: center; - opacity: 0.5; - transition: opacity 0.15s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-control-prev, -.carousel-control-next { - transition: none; - } -} -.carousel-control-prev:hover, .carousel-control-prev:focus, -.carousel-control-next:hover, -.carousel-control-next:focus { - color: #fff; - text-decoration: none; - outline: 0; - opacity: 0.9; -} - -.carousel-control-prev { - left: 0; -} - -.carousel-control-next { - right: 0; -} - -.carousel-control-prev-icon, -.carousel-control-next-icon { - display: inline-block; - width: 20px; - height: 20px; - background: no-repeat 50%/100% 100%; -} - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e"); -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e"); -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 0; - left: 0; - z-index: 15; - display: flex; - justify-content: center; - padding-left: 0; - margin-right: 15%; - margin-left: 15%; - list-style: none; -} -.carousel-indicators li { - box-sizing: content-box; - flex: 0 1 auto; - width: 30px; - height: 3px; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - cursor: pointer; - background-color: #fff; - background-clip: padding-box; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - opacity: 0.5; - transition: opacity 0.6s ease; -} -@media (prefers-reduced-motion: reduce) { - .carousel-indicators li { - transition: none; - } -} -.carousel-indicators .active { - opacity: 1; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; -} - -@-webkit-keyframes spinner-border { - to { - transform: rotate(360deg); - } -} - -@keyframes spinner-border { - to { - transform: rotate(360deg); - } -} -.spinner-border { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - border: 0.25em solid currentColor; - border-right-color: transparent; - border-radius: 50%; - -webkit-animation: spinner-border 0.75s linear infinite; - animation: spinner-border 0.75s linear infinite; -} - -.spinner-border-sm { - width: 1rem; - height: 1rem; - border-width: 0.2em; -} - -@-webkit-keyframes spinner-grow { - 0% { - transform: scale(0); - } - 50% { - opacity: 1; - transform: none; - } -} - -@keyframes spinner-grow { - 0% { - transform: scale(0); - } - 50% { - opacity: 1; - transform: none; - } -} -.spinner-grow { - display: inline-block; - width: 2rem; - height: 2rem; - vertical-align: text-bottom; - background-color: currentColor; - border-radius: 50%; - opacity: 0; - -webkit-animation: spinner-grow 0.75s linear infinite; - animation: spinner-grow 0.75s linear infinite; -} - -.spinner-grow-sm { - width: 1rem; - height: 1rem; -} - -.align-baseline { - vertical-align: baseline !important; -} - -.align-top { - vertical-align: top !important; -} - -.align-middle { - vertical-align: middle !important; -} - -.align-bottom { - vertical-align: bottom !important; -} - -.align-text-bottom { - vertical-align: text-bottom !important; -} - -.align-text-top { - vertical-align: text-top !important; -} - -.bg-primary { - background-color: #007bff !important; -} - -a.bg-primary:hover, a.bg-primary:focus, -button.bg-primary:hover, -button.bg-primary:focus { - background-color: #0062cc !important; -} - -.bg-secondary { - background-color: #6c757d !important; -} - -a.bg-secondary:hover, a.bg-secondary:focus, -button.bg-secondary:hover, -button.bg-secondary:focus { - background-color: #545b62 !important; -} - -.bg-success { - background-color: #28a745 !important; -} - -a.bg-success:hover, a.bg-success:focus, -button.bg-success:hover, -button.bg-success:focus { - background-color: #1e7e34 !important; -} - -.bg-info { - background-color: #17a2b8 !important; -} - -a.bg-info:hover, a.bg-info:focus, -button.bg-info:hover, -button.bg-info:focus { - background-color: #117a8b !important; -} - -.bg-warning { - background-color: #ffc107 !important; -} - -a.bg-warning:hover, a.bg-warning:focus, -button.bg-warning:hover, -button.bg-warning:focus { - background-color: #d39e00 !important; -} - -.bg-danger { - background-color: #dc3545 !important; -} - -a.bg-danger:hover, a.bg-danger:focus, -button.bg-danger:hover, -button.bg-danger:focus { - background-color: #bd2130 !important; -} - -.bg-light { - background-color: #f8f9fa !important; -} - -a.bg-light:hover, a.bg-light:focus, -button.bg-light:hover, -button.bg-light:focus { - background-color: #dae0e5 !important; -} - -.bg-dark { - background-color: #343a40 !important; -} - -a.bg-dark:hover, a.bg-dark:focus, -button.bg-dark:hover, -button.bg-dark:focus { - background-color: #1d2124 !important; -} - -.bg-white { - background-color: #fff !important; -} - -.bg-transparent { - background-color: transparent !important; -} - -.border { - border: 1px solid #dee2e6 !important; -} - -.border-top { - border-top: 1px solid #dee2e6 !important; -} - -.border-right { - border-right: 1px solid #dee2e6 !important; -} - -.border-bottom { - border-bottom: 1px solid #dee2e6 !important; -} - -.border-left { - border-left: 1px solid #dee2e6 !important; -} - -.border-0 { - border: 0 !important; -} - -.border-top-0 { - border-top: 0 !important; -} - -.border-right-0 { - border-right: 0 !important; -} - -.border-bottom-0 { - border-bottom: 0 !important; -} - -.border-left-0 { - border-left: 0 !important; -} - -.border-primary { - border-color: #007bff !important; -} - -.border-secondary { - border-color: #6c757d !important; -} - -.border-success { - border-color: #28a745 !important; -} - -.border-info { - border-color: #17a2b8 !important; -} - -.border-warning { - border-color: #ffc107 !important; -} - -.border-danger { - border-color: #dc3545 !important; -} - -.border-light { - border-color: #f8f9fa !important; -} - -.border-dark { - border-color: #343a40 !important; -} - -.border-white { - border-color: #fff !important; -} - -.rounded-sm { - border-radius: 0.2rem !important; -} - -.rounded { - border-radius: 0.25rem !important; -} - -.rounded-top { - border-top-left-radius: 0.25rem !important; - border-top-right-radius: 0.25rem !important; -} - -.rounded-right { - border-top-right-radius: 0.25rem !important; - border-bottom-right-radius: 0.25rem !important; -} - -.rounded-bottom { - border-bottom-right-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important; -} - -.rounded-left { - border-top-left-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important; -} - -.rounded-lg { - border-radius: 0.3rem !important; -} - -.rounded-circle { - border-radius: 50% !important; -} - -.rounded-pill { - border-radius: 50rem !important; -} - -.rounded-0 { - border-radius: 0 !important; -} - -.clearfix::after { - display: block; - clear: both; - content: ""; -} - -.d-none { - display: none !important; -} - -.d-inline { - display: inline !important; -} - -.d-inline-block { - display: inline-block !important; -} - -.d-block { - display: block !important; -} - -.d-table { - display: table !important; -} - -.d-table-row { - display: table-row !important; -} - -.d-table-cell { - display: table-cell !important; -} - -.d-flex { - display: flex !important; -} - -.d-inline-flex { - display: inline-flex !important; -} - -@media (min-width: 576px) { - .d-sm-none { - display: none !important; - } - - .d-sm-inline { - display: inline !important; - } - - .d-sm-inline-block { - display: inline-block !important; - } - - .d-sm-block { - display: block !important; - } - - .d-sm-table { - display: table !important; - } - - .d-sm-table-row { - display: table-row !important; - } - - .d-sm-table-cell { - display: table-cell !important; - } - - .d-sm-flex { - display: flex !important; - } - - .d-sm-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 768px) { - .d-md-none { - display: none !important; - } - - .d-md-inline { - display: inline !important; - } - - .d-md-inline-block { - display: inline-block !important; - } - - .d-md-block { - display: block !important; - } - - .d-md-table { - display: table !important; - } - - .d-md-table-row { - display: table-row !important; - } - - .d-md-table-cell { - display: table-cell !important; - } - - .d-md-flex { - display: flex !important; - } - - .d-md-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 992px) { - .d-lg-none { - display: none !important; - } - - .d-lg-inline { - display: inline !important; - } - - .d-lg-inline-block { - display: inline-block !important; - } - - .d-lg-block { - display: block !important; - } - - .d-lg-table { - display: table !important; - } - - .d-lg-table-row { - display: table-row !important; - } - - .d-lg-table-cell { - display: table-cell !important; - } - - .d-lg-flex { - display: flex !important; - } - - .d-lg-inline-flex { - display: inline-flex !important; - } -} -@media (min-width: 1200px) { - .d-xl-none { - display: none !important; - } - - .d-xl-inline { - display: inline !important; - } - - .d-xl-inline-block { - display: inline-block !important; - } - - .d-xl-block { - display: block !important; - } - - .d-xl-table { - display: table !important; - } - - .d-xl-table-row { - display: table-row !important; - } - - .d-xl-table-cell { - display: table-cell !important; - } - - .d-xl-flex { - display: flex !important; - } - - .d-xl-inline-flex { - display: inline-flex !important; - } -} -@media print { - .d-print-none { - display: none !important; - } - - .d-print-inline { - display: inline !important; - } - - .d-print-inline-block { - display: inline-block !important; - } - - .d-print-block { - display: block !important; - } - - .d-print-table { - display: table !important; - } - - .d-print-table-row { - display: table-row !important; - } - - .d-print-table-cell { - display: table-cell !important; - } - - .d-print-flex { - display: flex !important; - } - - .d-print-inline-flex { - display: inline-flex !important; - } -} -.embed-responsive { - position: relative; - display: block; - width: 100%; - padding: 0; - overflow: hidden; -} -.embed-responsive::before { - display: block; - content: ""; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} - -.embed-responsive-21by9::before { - padding-top: 42.8571428571%; -} - -.embed-responsive-16by9::before { - padding-top: 56.25%; -} - -.embed-responsive-4by3::before { - padding-top: 75%; -} - -.embed-responsive-1by1::before { - padding-top: 100%; -} - -.embed-responsive-21by9::before { - padding-top: 42.8571428571%; -} - -.embed-responsive-16by9::before { - padding-top: 56.25%; -} - -.embed-responsive-4by3::before { - padding-top: 75%; -} - -.embed-responsive-1by1::before { - padding-top: 100%; -} - -.flex-row { - flex-direction: row !important; -} - -.flex-column { - flex-direction: column !important; -} - -.flex-row-reverse { - flex-direction: row-reverse !important; -} - -.flex-column-reverse { - flex-direction: column-reverse !important; -} - -.flex-wrap { - flex-wrap: wrap !important; -} - -.flex-nowrap { - flex-wrap: nowrap !important; -} - -.flex-wrap-reverse { - flex-wrap: wrap-reverse !important; -} - -.flex-fill { - flex: 1 1 auto !important; -} - -.flex-grow-0 { - flex-grow: 0 !important; -} - -.flex-grow-1 { - flex-grow: 1 !important; -} - -.flex-shrink-0 { - flex-shrink: 0 !important; -} - -.flex-shrink-1 { - flex-shrink: 1 !important; -} - -.justify-content-start { - justify-content: flex-start !important; -} - -.justify-content-end { - justify-content: flex-end !important; -} - -.justify-content-center { - justify-content: center !important; -} - -.justify-content-between { - justify-content: space-between !important; -} - -.justify-content-around { - justify-content: space-around !important; -} - -.align-items-start { - align-items: flex-start !important; -} - -.align-items-end { - align-items: flex-end !important; -} - -.align-items-center { - align-items: center !important; -} - -.align-items-baseline { - align-items: baseline !important; -} - -.align-items-stretch { - align-items: stretch !important; -} - -.align-content-start { - align-content: flex-start !important; -} - -.align-content-end { - align-content: flex-end !important; -} - -.align-content-center { - align-content: center !important; -} - -.align-content-between { - align-content: space-between !important; -} - -.align-content-around { - align-content: space-around !important; -} - -.align-content-stretch { - align-content: stretch !important; -} - -.align-self-auto { - align-self: auto !important; -} - -.align-self-start { - align-self: flex-start !important; -} - -.align-self-end { - align-self: flex-end !important; -} - -.align-self-center { - align-self: center !important; -} - -.align-self-baseline { - align-self: baseline !important; -} - -.align-self-stretch { - align-self: stretch !important; -} - -@media (min-width: 576px) { - .flex-sm-row { - flex-direction: row !important; - } - - .flex-sm-column { - flex-direction: column !important; - } - - .flex-sm-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-sm-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-sm-wrap { - flex-wrap: wrap !important; - } - - .flex-sm-nowrap { - flex-wrap: nowrap !important; - } - - .flex-sm-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .flex-sm-fill { - flex: 1 1 auto !important; - } - - .flex-sm-grow-0 { - flex-grow: 0 !important; - } - - .flex-sm-grow-1 { - flex-grow: 1 !important; - } - - .flex-sm-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-sm-shrink-1 { - flex-shrink: 1 !important; - } - - .justify-content-sm-start { - justify-content: flex-start !important; - } - - .justify-content-sm-end { - justify-content: flex-end !important; - } - - .justify-content-sm-center { - justify-content: center !important; - } - - .justify-content-sm-between { - justify-content: space-between !important; - } - - .justify-content-sm-around { - justify-content: space-around !important; - } - - .align-items-sm-start { - align-items: flex-start !important; - } - - .align-items-sm-end { - align-items: flex-end !important; - } - - .align-items-sm-center { - align-items: center !important; - } - - .align-items-sm-baseline { - align-items: baseline !important; - } - - .align-items-sm-stretch { - align-items: stretch !important; - } - - .align-content-sm-start { - align-content: flex-start !important; - } - - .align-content-sm-end { - align-content: flex-end !important; - } - - .align-content-sm-center { - align-content: center !important; - } - - .align-content-sm-between { - align-content: space-between !important; - } - - .align-content-sm-around { - align-content: space-around !important; - } - - .align-content-sm-stretch { - align-content: stretch !important; - } - - .align-self-sm-auto { - align-self: auto !important; - } - - .align-self-sm-start { - align-self: flex-start !important; - } - - .align-self-sm-end { - align-self: flex-end !important; - } - - .align-self-sm-center { - align-self: center !important; - } - - .align-self-sm-baseline { - align-self: baseline !important; - } - - .align-self-sm-stretch { - align-self: stretch !important; - } -} -@media (min-width: 768px) { - .flex-md-row { - flex-direction: row !important; - } - - .flex-md-column { - flex-direction: column !important; - } - - .flex-md-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-md-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-md-wrap { - flex-wrap: wrap !important; - } - - .flex-md-nowrap { - flex-wrap: nowrap !important; - } - - .flex-md-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .flex-md-fill { - flex: 1 1 auto !important; - } - - .flex-md-grow-0 { - flex-grow: 0 !important; - } - - .flex-md-grow-1 { - flex-grow: 1 !important; - } - - .flex-md-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-md-shrink-1 { - flex-shrink: 1 !important; - } - - .justify-content-md-start { - justify-content: flex-start !important; - } - - .justify-content-md-end { - justify-content: flex-end !important; - } - - .justify-content-md-center { - justify-content: center !important; - } - - .justify-content-md-between { - justify-content: space-between !important; - } - - .justify-content-md-around { - justify-content: space-around !important; - } - - .align-items-md-start { - align-items: flex-start !important; - } - - .align-items-md-end { - align-items: flex-end !important; - } - - .align-items-md-center { - align-items: center !important; - } - - .align-items-md-baseline { - align-items: baseline !important; - } - - .align-items-md-stretch { - align-items: stretch !important; - } - - .align-content-md-start { - align-content: flex-start !important; - } - - .align-content-md-end { - align-content: flex-end !important; - } - - .align-content-md-center { - align-content: center !important; - } - - .align-content-md-between { - align-content: space-between !important; - } - - .align-content-md-around { - align-content: space-around !important; - } - - .align-content-md-stretch { - align-content: stretch !important; - } - - .align-self-md-auto { - align-self: auto !important; - } - - .align-self-md-start { - align-self: flex-start !important; - } - - .align-self-md-end { - align-self: flex-end !important; - } - - .align-self-md-center { - align-self: center !important; - } - - .align-self-md-baseline { - align-self: baseline !important; - } - - .align-self-md-stretch { - align-self: stretch !important; - } -} -@media (min-width: 992px) { - .flex-lg-row { - flex-direction: row !important; - } - - .flex-lg-column { - flex-direction: column !important; - } - - .flex-lg-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-lg-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-lg-wrap { - flex-wrap: wrap !important; - } - - .flex-lg-nowrap { - flex-wrap: nowrap !important; - } - - .flex-lg-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .flex-lg-fill { - flex: 1 1 auto !important; - } - - .flex-lg-grow-0 { - flex-grow: 0 !important; - } - - .flex-lg-grow-1 { - flex-grow: 1 !important; - } - - .flex-lg-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-lg-shrink-1 { - flex-shrink: 1 !important; - } - - .justify-content-lg-start { - justify-content: flex-start !important; - } - - .justify-content-lg-end { - justify-content: flex-end !important; - } - - .justify-content-lg-center { - justify-content: center !important; - } - - .justify-content-lg-between { - justify-content: space-between !important; - } - - .justify-content-lg-around { - justify-content: space-around !important; - } - - .align-items-lg-start { - align-items: flex-start !important; - } - - .align-items-lg-end { - align-items: flex-end !important; - } - - .align-items-lg-center { - align-items: center !important; - } - - .align-items-lg-baseline { - align-items: baseline !important; - } - - .align-items-lg-stretch { - align-items: stretch !important; - } - - .align-content-lg-start { - align-content: flex-start !important; - } - - .align-content-lg-end { - align-content: flex-end !important; - } - - .align-content-lg-center { - align-content: center !important; - } - - .align-content-lg-between { - align-content: space-between !important; - } - - .align-content-lg-around { - align-content: space-around !important; - } - - .align-content-lg-stretch { - align-content: stretch !important; - } - - .align-self-lg-auto { - align-self: auto !important; - } - - .align-self-lg-start { - align-self: flex-start !important; - } - - .align-self-lg-end { - align-self: flex-end !important; - } - - .align-self-lg-center { - align-self: center !important; - } - - .align-self-lg-baseline { - align-self: baseline !important; - } - - .align-self-lg-stretch { - align-self: stretch !important; - } -} -@media (min-width: 1200px) { - .flex-xl-row { - flex-direction: row !important; - } - - .flex-xl-column { - flex-direction: column !important; - } - - .flex-xl-row-reverse { - flex-direction: row-reverse !important; - } - - .flex-xl-column-reverse { - flex-direction: column-reverse !important; - } - - .flex-xl-wrap { - flex-wrap: wrap !important; - } - - .flex-xl-nowrap { - flex-wrap: nowrap !important; - } - - .flex-xl-wrap-reverse { - flex-wrap: wrap-reverse !important; - } - - .flex-xl-fill { - flex: 1 1 auto !important; - } - - .flex-xl-grow-0 { - flex-grow: 0 !important; - } - - .flex-xl-grow-1 { - flex-grow: 1 !important; - } - - .flex-xl-shrink-0 { - flex-shrink: 0 !important; - } - - .flex-xl-shrink-1 { - flex-shrink: 1 !important; - } - - .justify-content-xl-start { - justify-content: flex-start !important; - } - - .justify-content-xl-end { - justify-content: flex-end !important; - } - - .justify-content-xl-center { - justify-content: center !important; - } - - .justify-content-xl-between { - justify-content: space-between !important; - } - - .justify-content-xl-around { - justify-content: space-around !important; - } - - .align-items-xl-start { - align-items: flex-start !important; - } - - .align-items-xl-end { - align-items: flex-end !important; - } - - .align-items-xl-center { - align-items: center !important; - } - - .align-items-xl-baseline { - align-items: baseline !important; - } - - .align-items-xl-stretch { - align-items: stretch !important; - } - - .align-content-xl-start { - align-content: flex-start !important; - } - - .align-content-xl-end { - align-content: flex-end !important; - } - - .align-content-xl-center { - align-content: center !important; - } - - .align-content-xl-between { - align-content: space-between !important; - } - - .align-content-xl-around { - align-content: space-around !important; - } - - .align-content-xl-stretch { - align-content: stretch !important; - } - - .align-self-xl-auto { - align-self: auto !important; - } - - .align-self-xl-start { - align-self: flex-start !important; - } - - .align-self-xl-end { - align-self: flex-end !important; - } - - .align-self-xl-center { - align-self: center !important; - } - - .align-self-xl-baseline { - align-self: baseline !important; - } - - .align-self-xl-stretch { - align-self: stretch !important; - } -} -.float-left { - float: left !important; -} - -.float-right { - float: right !important; -} - -.float-none { - float: none !important; -} - -@media (min-width: 576px) { - .float-sm-left { - float: left !important; - } - - .float-sm-right { - float: right !important; - } - - .float-sm-none { - float: none !important; - } -} -@media (min-width: 768px) { - .float-md-left { - float: left !important; - } - - .float-md-right { - float: right !important; - } - - .float-md-none { - float: none !important; - } -} -@media (min-width: 992px) { - .float-lg-left { - float: left !important; - } - - .float-lg-right { - float: right !important; - } - - .float-lg-none { - float: none !important; - } -} -@media (min-width: 1200px) { - .float-xl-left { - float: left !important; - } - - .float-xl-right { - float: right !important; - } - - .float-xl-none { - float: none !important; - } -} -.user-select-all { - -webkit-user-select: all !important; - -moz-user-select: all !important; - -ms-user-select: all !important; - user-select: all !important; -} - -.user-select-auto { - -webkit-user-select: auto !important; - -moz-user-select: auto !important; - -ms-user-select: auto !important; - user-select: auto !important; -} - -.user-select-none { - -webkit-user-select: none !important; - -moz-user-select: none !important; - -ms-user-select: none !important; - user-select: none !important; -} - -.overflow-auto { - overflow: auto !important; -} - -.overflow-hidden { - overflow: hidden !important; -} - -.position-static { - position: static !important; -} - -.position-relative { - position: relative !important; -} - -.position-absolute { - position: absolute !important; -} - -.position-fixed { - position: fixed !important; -} - -.position-sticky { - position: -webkit-sticky !important; - position: sticky !important; -} - -.fixed-top, .sb-nav-fixed #layoutSidenav #layoutSidenav_nav, .sb-nav-fixed .sb-topnav { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030; -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; -} - -@supports ((position: -webkit-sticky) or (position: sticky)) { - .sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020; - } -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -.sr-only-focusable:active, .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - overflow: visible; - clip: auto; - white-space: normal; -} - -.shadow-sm { - box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; -} - -.shadow { - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; -} - -.shadow-lg { - box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; -} - -.shadow-none { - box-shadow: none !important; -} - -.w-25 { - width: 25% !important; -} - -.w-50 { - width: 50% !important; -} - -.w-75 { - width: 75% !important; -} - -.w-100 { - width: 100% !important; -} - -.w-auto { - width: auto !important; -} - -.h-25 { - height: 25% !important; -} - -.h-50 { - height: 50% !important; -} - -.h-75 { - height: 75% !important; -} - -.h-100 { - height: 100% !important; -} - -.h-auto { - height: auto !important; -} - -.mw-100 { - max-width: 100% !important; -} - -.mh-100 { - max-height: 100% !important; -} - -.min-vw-100 { - min-width: 100vw !important; -} - -.min-vh-100 { - min-height: 100vh !important; -} - -.vw-100 { - width: 100vw !important; -} - -.vh-100 { - height: 100vh !important; -} - -.m-0 { - margin: 0 !important; -} - -.mt-0, -.my-0 { - margin-top: 0 !important; -} - -.mr-0, -.mx-0 { - margin-right: 0 !important; -} - -.mb-0, -.my-0 { - margin-bottom: 0 !important; -} - -.ml-0, -.mx-0 { - margin-left: 0 !important; -} - -.m-1 { - margin: 0.25rem !important; -} - -.mt-1, -.my-1 { - margin-top: 0.25rem !important; -} - -.mr-1, -.mx-1 { - margin-right: 0.25rem !important; -} - -.mb-1, -.my-1 { - margin-bottom: 0.25rem !important; -} - -.ml-1, -.mx-1 { - margin-left: 0.25rem !important; -} - -.m-2 { - margin: 0.5rem !important; -} - -.mt-2, -.my-2 { - margin-top: 0.5rem !important; -} - -.mr-2, -.mx-2 { - margin-right: 0.5rem !important; -} - -.mb-2, -.my-2 { - margin-bottom: 0.5rem !important; -} - -.ml-2, -.mx-2 { - margin-left: 0.5rem !important; -} - -.m-3 { - margin: 1rem !important; -} - -.mt-3, -.my-3 { - margin-top: 1rem !important; -} - -.mr-3, -.mx-3 { - margin-right: 1rem !important; -} - -.mb-3, -.my-3 { - margin-bottom: 1rem !important; -} - -.ml-3, -.mx-3 { - margin-left: 1rem !important; -} - -.m-4 { - margin: 1.5rem !important; -} - -.mt-4, -.my-4 { - margin-top: 1.5rem !important; -} - -.mr-4, -.mx-4 { - margin-right: 1.5rem !important; -} - -.mb-4, -.my-4 { - margin-bottom: 1.5rem !important; -} - -.ml-4, -.mx-4 { - margin-left: 1.5rem !important; -} - -.m-5 { - margin: 3rem !important; -} - -.mt-5, -.my-5 { - margin-top: 3rem !important; -} - -.mr-5, -.mx-5 { - margin-right: 3rem !important; -} - -.mb-5, -.my-5 { - margin-bottom: 3rem !important; -} - -.ml-5, -.mx-5 { - margin-left: 3rem !important; -} - -.p-0 { - padding: 0 !important; -} - -.pt-0, -.py-0 { - padding-top: 0 !important; -} - -.pr-0, -.px-0 { - padding-right: 0 !important; -} - -.pb-0, -.py-0 { - padding-bottom: 0 !important; -} - -.pl-0, -.px-0 { - padding-left: 0 !important; -} - -.p-1 { - padding: 0.25rem !important; -} - -.pt-1, -.py-1 { - padding-top: 0.25rem !important; -} - -.pr-1, -.px-1 { - padding-right: 0.25rem !important; -} - -.pb-1, -.py-1 { - padding-bottom: 0.25rem !important; -} - -.pl-1, -.px-1 { - padding-left: 0.25rem !important; -} - -.p-2 { - padding: 0.5rem !important; -} - -.pt-2, -.py-2 { - padding-top: 0.5rem !important; -} - -.pr-2, -.px-2 { - padding-right: 0.5rem !important; -} - -.pb-2, -.py-2 { - padding-bottom: 0.5rem !important; -} - -.pl-2, -.px-2 { - padding-left: 0.5rem !important; -} - -.p-3 { - padding: 1rem !important; -} - -.pt-3, -.py-3 { - padding-top: 1rem !important; -} - -.pr-3, -.px-3 { - padding-right: 1rem !important; -} - -.pb-3, -.py-3 { - padding-bottom: 1rem !important; -} - -.pl-3, -.px-3 { - padding-left: 1rem !important; -} - -.p-4 { - padding: 1.5rem !important; -} - -.pt-4, -.py-4 { - padding-top: 1.5rem !important; -} - -.pr-4, -.px-4 { - padding-right: 1.5rem !important; -} - -.pb-4, -.py-4 { - padding-bottom: 1.5rem !important; -} - -.pl-4, -.px-4 { - padding-left: 1.5rem !important; -} - -.p-5 { - padding: 3rem !important; -} - -.pt-5, -.py-5 { - padding-top: 3rem !important; -} - -.pr-5, -.px-5 { - padding-right: 3rem !important; -} - -.pb-5, -.py-5 { - padding-bottom: 3rem !important; -} - -.pl-5, -.px-5 { - padding-left: 3rem !important; -} - -.m-n1 { - margin: -0.25rem !important; -} - -.mt-n1, -.my-n1 { - margin-top: -0.25rem !important; -} - -.mr-n1, -.mx-n1 { - margin-right: -0.25rem !important; -} - -.mb-n1, -.my-n1 { - margin-bottom: -0.25rem !important; -} - -.ml-n1, -.mx-n1 { - margin-left: -0.25rem !important; -} - -.m-n2 { - margin: -0.5rem !important; -} - -.mt-n2, -.my-n2 { - margin-top: -0.5rem !important; -} - -.mr-n2, -.mx-n2 { - margin-right: -0.5rem !important; -} - -.mb-n2, -.my-n2 { - margin-bottom: -0.5rem !important; -} - -.ml-n2, -.mx-n2 { - margin-left: -0.5rem !important; -} - -.m-n3 { - margin: -1rem !important; -} - -.mt-n3, -.my-n3 { - margin-top: -1rem !important; -} - -.mr-n3, -.mx-n3 { - margin-right: -1rem !important; -} - -.mb-n3, -.my-n3 { - margin-bottom: -1rem !important; -} - -.ml-n3, -.mx-n3 { - margin-left: -1rem !important; -} - -.m-n4 { - margin: -1.5rem !important; -} - -.mt-n4, -.my-n4 { - margin-top: -1.5rem !important; -} - -.mr-n4, -.mx-n4 { - margin-right: -1.5rem !important; -} - -.mb-n4, -.my-n4 { - margin-bottom: -1.5rem !important; -} - -.ml-n4, -.mx-n4 { - margin-left: -1.5rem !important; -} - -.m-n5 { - margin: -3rem !important; -} - -.mt-n5, -.my-n5 { - margin-top: -3rem !important; -} - -.mr-n5, -.mx-n5 { - margin-right: -3rem !important; -} - -.mb-n5, -.my-n5 { - margin-bottom: -3rem !important; -} - -.ml-n5, -.mx-n5 { - margin-left: -3rem !important; -} - -.m-auto { - margin: auto !important; -} - -.mt-auto, -.my-auto { - margin-top: auto !important; -} - -.mr-auto, -.mx-auto { - margin-right: auto !important; -} - -.mb-auto, -.my-auto { - margin-bottom: auto !important; -} - -.ml-auto, -.mx-auto { - margin-left: auto !important; -} - -@media (min-width: 576px) { - .m-sm-0 { - margin: 0 !important; - } - - .mt-sm-0, -.my-sm-0 { - margin-top: 0 !important; - } - - .mr-sm-0, -.mx-sm-0 { - margin-right: 0 !important; - } - - .mb-sm-0, -.my-sm-0 { - margin-bottom: 0 !important; - } - - .ml-sm-0, -.mx-sm-0 { - margin-left: 0 !important; - } - - .m-sm-1 { - margin: 0.25rem !important; - } - - .mt-sm-1, -.my-sm-1 { - margin-top: 0.25rem !important; - } - - .mr-sm-1, -.mx-sm-1 { - margin-right: 0.25rem !important; - } - - .mb-sm-1, -.my-sm-1 { - margin-bottom: 0.25rem !important; - } - - .ml-sm-1, -.mx-sm-1 { - margin-left: 0.25rem !important; - } - - .m-sm-2 { - margin: 0.5rem !important; - } - - .mt-sm-2, -.my-sm-2 { - margin-top: 0.5rem !important; - } - - .mr-sm-2, -.mx-sm-2 { - margin-right: 0.5rem !important; - } - - .mb-sm-2, -.my-sm-2 { - margin-bottom: 0.5rem !important; - } - - .ml-sm-2, -.mx-sm-2 { - margin-left: 0.5rem !important; - } - - .m-sm-3 { - margin: 1rem !important; - } - - .mt-sm-3, -.my-sm-3 { - margin-top: 1rem !important; - } - - .mr-sm-3, -.mx-sm-3 { - margin-right: 1rem !important; - } - - .mb-sm-3, -.my-sm-3 { - margin-bottom: 1rem !important; - } - - .ml-sm-3, -.mx-sm-3 { - margin-left: 1rem !important; - } - - .m-sm-4 { - margin: 1.5rem !important; - } - - .mt-sm-4, -.my-sm-4 { - margin-top: 1.5rem !important; - } - - .mr-sm-4, -.mx-sm-4 { - margin-right: 1.5rem !important; - } - - .mb-sm-4, -.my-sm-4 { - margin-bottom: 1.5rem !important; - } - - .ml-sm-4, -.mx-sm-4 { - margin-left: 1.5rem !important; - } - - .m-sm-5 { - margin: 3rem !important; - } - - .mt-sm-5, -.my-sm-5 { - margin-top: 3rem !important; - } - - .mr-sm-5, -.mx-sm-5 { - margin-right: 3rem !important; - } - - .mb-sm-5, -.my-sm-5 { - margin-bottom: 3rem !important; - } - - .ml-sm-5, -.mx-sm-5 { - margin-left: 3rem !important; - } - - .p-sm-0 { - padding: 0 !important; - } - - .pt-sm-0, -.py-sm-0 { - padding-top: 0 !important; - } - - .pr-sm-0, -.px-sm-0 { - padding-right: 0 !important; - } - - .pb-sm-0, -.py-sm-0 { - padding-bottom: 0 !important; - } - - .pl-sm-0, -.px-sm-0 { - padding-left: 0 !important; - } - - .p-sm-1 { - padding: 0.25rem !important; - } - - .pt-sm-1, -.py-sm-1 { - padding-top: 0.25rem !important; - } - - .pr-sm-1, -.px-sm-1 { - padding-right: 0.25rem !important; - } - - .pb-sm-1, -.py-sm-1 { - padding-bottom: 0.25rem !important; - } - - .pl-sm-1, -.px-sm-1 { - padding-left: 0.25rem !important; - } - - .p-sm-2 { - padding: 0.5rem !important; - } - - .pt-sm-2, -.py-sm-2 { - padding-top: 0.5rem !important; - } - - .pr-sm-2, -.px-sm-2 { - padding-right: 0.5rem !important; - } - - .pb-sm-2, -.py-sm-2 { - padding-bottom: 0.5rem !important; - } - - .pl-sm-2, -.px-sm-2 { - padding-left: 0.5rem !important; - } - - .p-sm-3 { - padding: 1rem !important; - } - - .pt-sm-3, -.py-sm-3 { - padding-top: 1rem !important; - } - - .pr-sm-3, -.px-sm-3 { - padding-right: 1rem !important; - } - - .pb-sm-3, -.py-sm-3 { - padding-bottom: 1rem !important; - } - - .pl-sm-3, -.px-sm-3 { - padding-left: 1rem !important; - } - - .p-sm-4 { - padding: 1.5rem !important; - } - - .pt-sm-4, -.py-sm-4 { - padding-top: 1.5rem !important; - } - - .pr-sm-4, -.px-sm-4 { - padding-right: 1.5rem !important; - } - - .pb-sm-4, -.py-sm-4 { - padding-bottom: 1.5rem !important; - } - - .pl-sm-4, -.px-sm-4 { - padding-left: 1.5rem !important; - } - - .p-sm-5 { - padding: 3rem !important; - } - - .pt-sm-5, -.py-sm-5 { - padding-top: 3rem !important; - } - - .pr-sm-5, -.px-sm-5 { - padding-right: 3rem !important; - } - - .pb-sm-5, -.py-sm-5 { - padding-bottom: 3rem !important; - } - - .pl-sm-5, -.px-sm-5 { - padding-left: 3rem !important; - } - - .m-sm-n1 { - margin: -0.25rem !important; - } - - .mt-sm-n1, -.my-sm-n1 { - margin-top: -0.25rem !important; - } - - .mr-sm-n1, -.mx-sm-n1 { - margin-right: -0.25rem !important; - } - - .mb-sm-n1, -.my-sm-n1 { - margin-bottom: -0.25rem !important; - } - - .ml-sm-n1, -.mx-sm-n1 { - margin-left: -0.25rem !important; - } - - .m-sm-n2 { - margin: -0.5rem !important; - } - - .mt-sm-n2, -.my-sm-n2 { - margin-top: -0.5rem !important; - } - - .mr-sm-n2, -.mx-sm-n2 { - margin-right: -0.5rem !important; - } - - .mb-sm-n2, -.my-sm-n2 { - margin-bottom: -0.5rem !important; - } - - .ml-sm-n2, -.mx-sm-n2 { - margin-left: -0.5rem !important; - } - - .m-sm-n3 { - margin: -1rem !important; - } - - .mt-sm-n3, -.my-sm-n3 { - margin-top: -1rem !important; - } - - .mr-sm-n3, -.mx-sm-n3 { - margin-right: -1rem !important; - } - - .mb-sm-n3, -.my-sm-n3 { - margin-bottom: -1rem !important; - } - - .ml-sm-n3, -.mx-sm-n3 { - margin-left: -1rem !important; - } - - .m-sm-n4 { - margin: -1.5rem !important; - } - - .mt-sm-n4, -.my-sm-n4 { - margin-top: -1.5rem !important; - } - - .mr-sm-n4, -.mx-sm-n4 { - margin-right: -1.5rem !important; - } - - .mb-sm-n4, -.my-sm-n4 { - margin-bottom: -1.5rem !important; - } - - .ml-sm-n4, -.mx-sm-n4 { - margin-left: -1.5rem !important; - } - - .m-sm-n5 { - margin: -3rem !important; - } - - .mt-sm-n5, -.my-sm-n5 { - margin-top: -3rem !important; - } - - .mr-sm-n5, -.mx-sm-n5 { - margin-right: -3rem !important; - } - - .mb-sm-n5, -.my-sm-n5 { - margin-bottom: -3rem !important; - } - - .ml-sm-n5, -.mx-sm-n5 { - margin-left: -3rem !important; - } - - .m-sm-auto { - margin: auto !important; - } - - .mt-sm-auto, -.my-sm-auto { - margin-top: auto !important; - } - - .mr-sm-auto, -.mx-sm-auto { - margin-right: auto !important; - } - - .mb-sm-auto, -.my-sm-auto { - margin-bottom: auto !important; - } - - .ml-sm-auto, -.mx-sm-auto { - margin-left: auto !important; - } -} -@media (min-width: 768px) { - .m-md-0 { - margin: 0 !important; - } - - .mt-md-0, -.my-md-0 { - margin-top: 0 !important; - } - - .mr-md-0, -.mx-md-0 { - margin-right: 0 !important; - } - - .mb-md-0, -.my-md-0 { - margin-bottom: 0 !important; - } - - .ml-md-0, -.mx-md-0 { - margin-left: 0 !important; - } - - .m-md-1 { - margin: 0.25rem !important; - } - - .mt-md-1, -.my-md-1 { - margin-top: 0.25rem !important; - } - - .mr-md-1, -.mx-md-1 { - margin-right: 0.25rem !important; - } - - .mb-md-1, -.my-md-1 { - margin-bottom: 0.25rem !important; - } - - .ml-md-1, -.mx-md-1 { - margin-left: 0.25rem !important; - } - - .m-md-2 { - margin: 0.5rem !important; - } - - .mt-md-2, -.my-md-2 { - margin-top: 0.5rem !important; - } - - .mr-md-2, -.mx-md-2 { - margin-right: 0.5rem !important; - } - - .mb-md-2, -.my-md-2 { - margin-bottom: 0.5rem !important; - } - - .ml-md-2, -.mx-md-2 { - margin-left: 0.5rem !important; - } - - .m-md-3 { - margin: 1rem !important; - } - - .mt-md-3, -.my-md-3 { - margin-top: 1rem !important; - } - - .mr-md-3, -.mx-md-3 { - margin-right: 1rem !important; - } - - .mb-md-3, -.my-md-3 { - margin-bottom: 1rem !important; - } - - .ml-md-3, -.mx-md-3 { - margin-left: 1rem !important; - } - - .m-md-4 { - margin: 1.5rem !important; - } - - .mt-md-4, -.my-md-4 { - margin-top: 1.5rem !important; - } - - .mr-md-4, -.mx-md-4 { - margin-right: 1.5rem !important; - } - - .mb-md-4, -.my-md-4 { - margin-bottom: 1.5rem !important; - } - - .ml-md-4, -.mx-md-4 { - margin-left: 1.5rem !important; - } - - .m-md-5 { - margin: 3rem !important; - } - - .mt-md-5, -.my-md-5 { - margin-top: 3rem !important; - } - - .mr-md-5, -.mx-md-5 { - margin-right: 3rem !important; - } - - .mb-md-5, -.my-md-5 { - margin-bottom: 3rem !important; - } - - .ml-md-5, -.mx-md-5 { - margin-left: 3rem !important; - } - - .p-md-0 { - padding: 0 !important; - } - - .pt-md-0, -.py-md-0 { - padding-top: 0 !important; - } - - .pr-md-0, -.px-md-0 { - padding-right: 0 !important; - } - - .pb-md-0, -.py-md-0 { - padding-bottom: 0 !important; - } - - .pl-md-0, -.px-md-0 { - padding-left: 0 !important; - } - - .p-md-1 { - padding: 0.25rem !important; - } - - .pt-md-1, -.py-md-1 { - padding-top: 0.25rem !important; - } - - .pr-md-1, -.px-md-1 { - padding-right: 0.25rem !important; - } - - .pb-md-1, -.py-md-1 { - padding-bottom: 0.25rem !important; - } - - .pl-md-1, -.px-md-1 { - padding-left: 0.25rem !important; - } - - .p-md-2 { - padding: 0.5rem !important; - } - - .pt-md-2, -.py-md-2 { - padding-top: 0.5rem !important; - } - - .pr-md-2, -.px-md-2 { - padding-right: 0.5rem !important; - } - - .pb-md-2, -.py-md-2 { - padding-bottom: 0.5rem !important; - } - - .pl-md-2, -.px-md-2 { - padding-left: 0.5rem !important; - } - - .p-md-3 { - padding: 1rem !important; - } - - .pt-md-3, -.py-md-3 { - padding-top: 1rem !important; - } - - .pr-md-3, -.px-md-3 { - padding-right: 1rem !important; - } - - .pb-md-3, -.py-md-3 { - padding-bottom: 1rem !important; - } - - .pl-md-3, -.px-md-3 { - padding-left: 1rem !important; - } - - .p-md-4 { - padding: 1.5rem !important; - } - - .pt-md-4, -.py-md-4 { - padding-top: 1.5rem !important; - } - - .pr-md-4, -.px-md-4 { - padding-right: 1.5rem !important; - } - - .pb-md-4, -.py-md-4 { - padding-bottom: 1.5rem !important; - } - - .pl-md-4, -.px-md-4 { - padding-left: 1.5rem !important; - } - - .p-md-5 { - padding: 3rem !important; - } - - .pt-md-5, -.py-md-5 { - padding-top: 3rem !important; - } - - .pr-md-5, -.px-md-5 { - padding-right: 3rem !important; - } - - .pb-md-5, -.py-md-5 { - padding-bottom: 3rem !important; - } - - .pl-md-5, -.px-md-5 { - padding-left: 3rem !important; - } - - .m-md-n1 { - margin: -0.25rem !important; - } - - .mt-md-n1, -.my-md-n1 { - margin-top: -0.25rem !important; - } - - .mr-md-n1, -.mx-md-n1 { - margin-right: -0.25rem !important; - } - - .mb-md-n1, -.my-md-n1 { - margin-bottom: -0.25rem !important; - } - - .ml-md-n1, -.mx-md-n1 { - margin-left: -0.25rem !important; - } - - .m-md-n2 { - margin: -0.5rem !important; - } - - .mt-md-n2, -.my-md-n2 { - margin-top: -0.5rem !important; - } - - .mr-md-n2, -.mx-md-n2 { - margin-right: -0.5rem !important; - } - - .mb-md-n2, -.my-md-n2 { - margin-bottom: -0.5rem !important; - } - - .ml-md-n2, -.mx-md-n2 { - margin-left: -0.5rem !important; - } - - .m-md-n3 { - margin: -1rem !important; - } - - .mt-md-n3, -.my-md-n3 { - margin-top: -1rem !important; - } - - .mr-md-n3, -.mx-md-n3 { - margin-right: -1rem !important; - } - - .mb-md-n3, -.my-md-n3 { - margin-bottom: -1rem !important; - } - - .ml-md-n3, -.mx-md-n3 { - margin-left: -1rem !important; - } - - .m-md-n4 { - margin: -1.5rem !important; - } - - .mt-md-n4, -.my-md-n4 { - margin-top: -1.5rem !important; - } - - .mr-md-n4, -.mx-md-n4 { - margin-right: -1.5rem !important; - } - - .mb-md-n4, -.my-md-n4 { - margin-bottom: -1.5rem !important; - } - - .ml-md-n4, -.mx-md-n4 { - margin-left: -1.5rem !important; - } - - .m-md-n5 { - margin: -3rem !important; - } - - .mt-md-n5, -.my-md-n5 { - margin-top: -3rem !important; - } - - .mr-md-n5, -.mx-md-n5 { - margin-right: -3rem !important; - } - - .mb-md-n5, -.my-md-n5 { - margin-bottom: -3rem !important; - } - - .ml-md-n5, -.mx-md-n5 { - margin-left: -3rem !important; - } - - .m-md-auto { - margin: auto !important; - } - - .mt-md-auto, -.my-md-auto { - margin-top: auto !important; - } - - .mr-md-auto, -.mx-md-auto { - margin-right: auto !important; - } - - .mb-md-auto, -.my-md-auto { - margin-bottom: auto !important; - } - - .ml-md-auto, -.mx-md-auto { - margin-left: auto !important; - } -} -@media (min-width: 992px) { - .m-lg-0 { - margin: 0 !important; - } - - .mt-lg-0, -.my-lg-0 { - margin-top: 0 !important; - } - - .mr-lg-0, -.mx-lg-0 { - margin-right: 0 !important; - } - - .mb-lg-0, -.my-lg-0 { - margin-bottom: 0 !important; - } - - .ml-lg-0, -.mx-lg-0 { - margin-left: 0 !important; - } - - .m-lg-1 { - margin: 0.25rem !important; - } - - .mt-lg-1, -.my-lg-1 { - margin-top: 0.25rem !important; - } - - .mr-lg-1, -.mx-lg-1 { - margin-right: 0.25rem !important; - } - - .mb-lg-1, -.my-lg-1 { - margin-bottom: 0.25rem !important; - } - - .ml-lg-1, -.mx-lg-1 { - margin-left: 0.25rem !important; - } - - .m-lg-2 { - margin: 0.5rem !important; - } - - .mt-lg-2, -.my-lg-2 { - margin-top: 0.5rem !important; - } - - .mr-lg-2, -.mx-lg-2 { - margin-right: 0.5rem !important; - } - - .mb-lg-2, -.my-lg-2 { - margin-bottom: 0.5rem !important; - } - - .ml-lg-2, -.mx-lg-2 { - margin-left: 0.5rem !important; - } - - .m-lg-3 { - margin: 1rem !important; - } - - .mt-lg-3, -.my-lg-3 { - margin-top: 1rem !important; - } - - .mr-lg-3, -.mx-lg-3 { - margin-right: 1rem !important; - } - - .mb-lg-3, -.my-lg-3 { - margin-bottom: 1rem !important; - } - - .ml-lg-3, -.mx-lg-3 { - margin-left: 1rem !important; - } - - .m-lg-4 { - margin: 1.5rem !important; - } - - .mt-lg-4, -.my-lg-4 { - margin-top: 1.5rem !important; - } - - .mr-lg-4, -.mx-lg-4 { - margin-right: 1.5rem !important; - } - - .mb-lg-4, -.my-lg-4 { - margin-bottom: 1.5rem !important; - } - - .ml-lg-4, -.mx-lg-4 { - margin-left: 1.5rem !important; - } - - .m-lg-5 { - margin: 3rem !important; - } - - .mt-lg-5, -.my-lg-5 { - margin-top: 3rem !important; - } - - .mr-lg-5, -.mx-lg-5 { - margin-right: 3rem !important; - } - - .mb-lg-5, -.my-lg-5 { - margin-bottom: 3rem !important; - } - - .ml-lg-5, -.mx-lg-5 { - margin-left: 3rem !important; - } - - .p-lg-0 { - padding: 0 !important; - } - - .pt-lg-0, -.py-lg-0 { - padding-top: 0 !important; - } - - .pr-lg-0, -.px-lg-0 { - padding-right: 0 !important; - } - - .pb-lg-0, -.py-lg-0 { - padding-bottom: 0 !important; - } - - .pl-lg-0, -.px-lg-0 { - padding-left: 0 !important; - } - - .p-lg-1 { - padding: 0.25rem !important; - } - - .pt-lg-1, -.py-lg-1 { - padding-top: 0.25rem !important; - } - - .pr-lg-1, -.px-lg-1 { - padding-right: 0.25rem !important; - } - - .pb-lg-1, -.py-lg-1 { - padding-bottom: 0.25rem !important; - } - - .pl-lg-1, -.px-lg-1 { - padding-left: 0.25rem !important; - } - - .p-lg-2 { - padding: 0.5rem !important; - } - - .pt-lg-2, -.py-lg-2 { - padding-top: 0.5rem !important; - } - - .pr-lg-2, -.px-lg-2 { - padding-right: 0.5rem !important; - } - - .pb-lg-2, -.py-lg-2 { - padding-bottom: 0.5rem !important; - } - - .pl-lg-2, -.px-lg-2 { - padding-left: 0.5rem !important; - } - - .p-lg-3 { - padding: 1rem !important; - } - - .pt-lg-3, -.py-lg-3 { - padding-top: 1rem !important; - } - - .pr-lg-3, -.px-lg-3 { - padding-right: 1rem !important; - } - - .pb-lg-3, -.py-lg-3 { - padding-bottom: 1rem !important; - } - - .pl-lg-3, -.px-lg-3 { - padding-left: 1rem !important; - } - - .p-lg-4 { - padding: 1.5rem !important; - } - - .pt-lg-4, -.py-lg-4 { - padding-top: 1.5rem !important; - } - - .pr-lg-4, -.px-lg-4 { - padding-right: 1.5rem !important; - } - - .pb-lg-4, -.py-lg-4 { - padding-bottom: 1.5rem !important; - } - - .pl-lg-4, -.px-lg-4 { - padding-left: 1.5rem !important; - } - - .p-lg-5 { - padding: 3rem !important; - } - - .pt-lg-5, -.py-lg-5 { - padding-top: 3rem !important; - } - - .pr-lg-5, -.px-lg-5 { - padding-right: 3rem !important; - } - - .pb-lg-5, -.py-lg-5 { - padding-bottom: 3rem !important; - } - - .pl-lg-5, -.px-lg-5 { - padding-left: 3rem !important; - } - - .m-lg-n1 { - margin: -0.25rem !important; - } - - .mt-lg-n1, -.my-lg-n1 { - margin-top: -0.25rem !important; - } - - .mr-lg-n1, -.mx-lg-n1 { - margin-right: -0.25rem !important; - } - - .mb-lg-n1, -.my-lg-n1 { - margin-bottom: -0.25rem !important; - } - - .ml-lg-n1, -.mx-lg-n1 { - margin-left: -0.25rem !important; - } - - .m-lg-n2 { - margin: -0.5rem !important; - } - - .mt-lg-n2, -.my-lg-n2 { - margin-top: -0.5rem !important; - } - - .mr-lg-n2, -.mx-lg-n2 { - margin-right: -0.5rem !important; - } - - .mb-lg-n2, -.my-lg-n2 { - margin-bottom: -0.5rem !important; - } - - .ml-lg-n2, -.mx-lg-n2 { - margin-left: -0.5rem !important; - } - - .m-lg-n3 { - margin: -1rem !important; - } - - .mt-lg-n3, -.my-lg-n3 { - margin-top: -1rem !important; - } - - .mr-lg-n3, -.mx-lg-n3 { - margin-right: -1rem !important; - } - - .mb-lg-n3, -.my-lg-n3 { - margin-bottom: -1rem !important; - } - - .ml-lg-n3, -.mx-lg-n3 { - margin-left: -1rem !important; - } - - .m-lg-n4 { - margin: -1.5rem !important; - } - - .mt-lg-n4, -.my-lg-n4 { - margin-top: -1.5rem !important; - } - - .mr-lg-n4, -.mx-lg-n4 { - margin-right: -1.5rem !important; - } - - .mb-lg-n4, -.my-lg-n4 { - margin-bottom: -1.5rem !important; - } - - .ml-lg-n4, -.mx-lg-n4 { - margin-left: -1.5rem !important; - } - - .m-lg-n5 { - margin: -3rem !important; - } - - .mt-lg-n5, -.my-lg-n5 { - margin-top: -3rem !important; - } - - .mr-lg-n5, -.mx-lg-n5 { - margin-right: -3rem !important; - } - - .mb-lg-n5, -.my-lg-n5 { - margin-bottom: -3rem !important; - } - - .ml-lg-n5, -.mx-lg-n5 { - margin-left: -3rem !important; - } - - .m-lg-auto { - margin: auto !important; - } - - .mt-lg-auto, -.my-lg-auto { - margin-top: auto !important; - } - - .mr-lg-auto, -.mx-lg-auto { - margin-right: auto !important; - } - - .mb-lg-auto, -.my-lg-auto { - margin-bottom: auto !important; - } - - .ml-lg-auto, -.mx-lg-auto { - margin-left: auto !important; - } -} -@media (min-width: 1200px) { - .m-xl-0 { - margin: 0 !important; - } - - .mt-xl-0, -.my-xl-0 { - margin-top: 0 !important; - } - - .mr-xl-0, -.mx-xl-0 { - margin-right: 0 !important; - } - - .mb-xl-0, -.my-xl-0 { - margin-bottom: 0 !important; - } - - .ml-xl-0, -.mx-xl-0 { - margin-left: 0 !important; - } - - .m-xl-1 { - margin: 0.25rem !important; - } - - .mt-xl-1, -.my-xl-1 { - margin-top: 0.25rem !important; - } - - .mr-xl-1, -.mx-xl-1 { - margin-right: 0.25rem !important; - } - - .mb-xl-1, -.my-xl-1 { - margin-bottom: 0.25rem !important; - } - - .ml-xl-1, -.mx-xl-1 { - margin-left: 0.25rem !important; - } - - .m-xl-2 { - margin: 0.5rem !important; - } - - .mt-xl-2, -.my-xl-2 { - margin-top: 0.5rem !important; - } - - .mr-xl-2, -.mx-xl-2 { - margin-right: 0.5rem !important; - } - - .mb-xl-2, -.my-xl-2 { - margin-bottom: 0.5rem !important; - } - - .ml-xl-2, -.mx-xl-2 { - margin-left: 0.5rem !important; - } - - .m-xl-3 { - margin: 1rem !important; - } - - .mt-xl-3, -.my-xl-3 { - margin-top: 1rem !important; - } - - .mr-xl-3, -.mx-xl-3 { - margin-right: 1rem !important; - } - - .mb-xl-3, -.my-xl-3 { - margin-bottom: 1rem !important; - } - - .ml-xl-3, -.mx-xl-3 { - margin-left: 1rem !important; - } - - .m-xl-4 { - margin: 1.5rem !important; - } - - .mt-xl-4, -.my-xl-4 { - margin-top: 1.5rem !important; - } - - .mr-xl-4, -.mx-xl-4 { - margin-right: 1.5rem !important; - } - - .mb-xl-4, -.my-xl-4 { - margin-bottom: 1.5rem !important; - } - - .ml-xl-4, -.mx-xl-4 { - margin-left: 1.5rem !important; - } - - .m-xl-5 { - margin: 3rem !important; - } - - .mt-xl-5, -.my-xl-5 { - margin-top: 3rem !important; - } - - .mr-xl-5, -.mx-xl-5 { - margin-right: 3rem !important; - } - - .mb-xl-5, -.my-xl-5 { - margin-bottom: 3rem !important; - } - - .ml-xl-5, -.mx-xl-5 { - margin-left: 3rem !important; - } - - .p-xl-0 { - padding: 0 !important; - } - - .pt-xl-0, -.py-xl-0 { - padding-top: 0 !important; - } - - .pr-xl-0, -.px-xl-0 { - padding-right: 0 !important; - } - - .pb-xl-0, -.py-xl-0 { - padding-bottom: 0 !important; - } - - .pl-xl-0, -.px-xl-0 { - padding-left: 0 !important; - } - - .p-xl-1 { - padding: 0.25rem !important; - } - - .pt-xl-1, -.py-xl-1 { - padding-top: 0.25rem !important; - } - - .pr-xl-1, -.px-xl-1 { - padding-right: 0.25rem !important; - } - - .pb-xl-1, -.py-xl-1 { - padding-bottom: 0.25rem !important; - } - - .pl-xl-1, -.px-xl-1 { - padding-left: 0.25rem !important; - } - - .p-xl-2 { - padding: 0.5rem !important; - } - - .pt-xl-2, -.py-xl-2 { - padding-top: 0.5rem !important; - } - - .pr-xl-2, -.px-xl-2 { - padding-right: 0.5rem !important; - } - - .pb-xl-2, -.py-xl-2 { - padding-bottom: 0.5rem !important; - } - - .pl-xl-2, -.px-xl-2 { - padding-left: 0.5rem !important; - } - - .p-xl-3 { - padding: 1rem !important; - } - - .pt-xl-3, -.py-xl-3 { - padding-top: 1rem !important; - } - - .pr-xl-3, -.px-xl-3 { - padding-right: 1rem !important; - } - - .pb-xl-3, -.py-xl-3 { - padding-bottom: 1rem !important; - } - - .pl-xl-3, -.px-xl-3 { - padding-left: 1rem !important; - } - - .p-xl-4 { - padding: 1.5rem !important; - } - - .pt-xl-4, -.py-xl-4 { - padding-top: 1.5rem !important; - } - - .pr-xl-4, -.px-xl-4 { - padding-right: 1.5rem !important; - } - - .pb-xl-4, -.py-xl-4 { - padding-bottom: 1.5rem !important; - } - - .pl-xl-4, -.px-xl-4 { - padding-left: 1.5rem !important; - } - - .p-xl-5 { - padding: 3rem !important; - } - - .pt-xl-5, -.py-xl-5 { - padding-top: 3rem !important; - } - - .pr-xl-5, -.px-xl-5 { - padding-right: 3rem !important; - } - - .pb-xl-5, -.py-xl-5 { - padding-bottom: 3rem !important; - } - - .pl-xl-5, -.px-xl-5 { - padding-left: 3rem !important; - } - - .m-xl-n1 { - margin: -0.25rem !important; - } - - .mt-xl-n1, -.my-xl-n1 { - margin-top: -0.25rem !important; - } - - .mr-xl-n1, -.mx-xl-n1 { - margin-right: -0.25rem !important; - } - - .mb-xl-n1, -.my-xl-n1 { - margin-bottom: -0.25rem !important; - } - - .ml-xl-n1, -.mx-xl-n1 { - margin-left: -0.25rem !important; - } - - .m-xl-n2 { - margin: -0.5rem !important; - } - - .mt-xl-n2, -.my-xl-n2 { - margin-top: -0.5rem !important; - } - - .mr-xl-n2, -.mx-xl-n2 { - margin-right: -0.5rem !important; - } - - .mb-xl-n2, -.my-xl-n2 { - margin-bottom: -0.5rem !important; - } - - .ml-xl-n2, -.mx-xl-n2 { - margin-left: -0.5rem !important; - } - - .m-xl-n3 { - margin: -1rem !important; - } - - .mt-xl-n3, -.my-xl-n3 { - margin-top: -1rem !important; - } - - .mr-xl-n3, -.mx-xl-n3 { - margin-right: -1rem !important; - } - - .mb-xl-n3, -.my-xl-n3 { - margin-bottom: -1rem !important; - } - - .ml-xl-n3, -.mx-xl-n3 { - margin-left: -1rem !important; - } - - .m-xl-n4 { - margin: -1.5rem !important; - } - - .mt-xl-n4, -.my-xl-n4 { - margin-top: -1.5rem !important; - } - - .mr-xl-n4, -.mx-xl-n4 { - margin-right: -1.5rem !important; - } - - .mb-xl-n4, -.my-xl-n4 { - margin-bottom: -1.5rem !important; - } - - .ml-xl-n4, -.mx-xl-n4 { - margin-left: -1.5rem !important; - } - - .m-xl-n5 { - margin: -3rem !important; - } - - .mt-xl-n5, -.my-xl-n5 { - margin-top: -3rem !important; - } - - .mr-xl-n5, -.mx-xl-n5 { - margin-right: -3rem !important; - } - - .mb-xl-n5, -.my-xl-n5 { - margin-bottom: -3rem !important; - } - - .ml-xl-n5, -.mx-xl-n5 { - margin-left: -3rem !important; - } - - .m-xl-auto { - margin: auto !important; - } - - .mt-xl-auto, -.my-xl-auto { - margin-top: auto !important; - } - - .mr-xl-auto, -.mx-xl-auto { - margin-right: auto !important; - } - - .mb-xl-auto, -.my-xl-auto { - margin-bottom: auto !important; - } - - .ml-xl-auto, -.mx-xl-auto { - margin-left: auto !important; - } -} -.stretched-link::after { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1; - pointer-events: auto; - content: ""; - background-color: rgba(0, 0, 0, 0); -} - -.text-monospace { - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; -} - -.text-justify { - text-align: justify !important; -} - -.text-wrap { - white-space: normal !important; -} - -.text-nowrap { - white-space: nowrap !important; -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.text-left { - text-align: left !important; -} - -.text-right { - text-align: right !important; -} - -.text-center { - text-align: center !important; -} - -@media (min-width: 576px) { - .text-sm-left { - text-align: left !important; - } - - .text-sm-right { - text-align: right !important; - } - - .text-sm-center { - text-align: center !important; - } -} -@media (min-width: 768px) { - .text-md-left { - text-align: left !important; - } - - .text-md-right { - text-align: right !important; - } - - .text-md-center { - text-align: center !important; - } -} -@media (min-width: 992px) { - .text-lg-left { - text-align: left !important; - } - - .text-lg-right { - text-align: right !important; - } - - .text-lg-center { - text-align: center !important; - } -} -@media (min-width: 1200px) { - .text-xl-left { - text-align: left !important; - } - - .text-xl-right { - text-align: right !important; - } - - .text-xl-center { - text-align: center !important; - } -} -.text-lowercase { - text-transform: lowercase !important; -} - -.text-uppercase { - text-transform: uppercase !important; -} - -.text-capitalize { - text-transform: capitalize !important; -} - -.font-weight-light { - font-weight: 300 !important; -} - -.font-weight-lighter { - font-weight: lighter !important; -} - -.font-weight-normal { - font-weight: 400 !important; -} - -.font-weight-bold { - font-weight: 700 !important; -} - -.font-weight-bolder { - font-weight: bolder !important; -} - -.font-italic { - font-style: italic !important; -} - -.text-white { - color: #fff !important; -} - -.text-primary { - color: #007bff !important; -} - -a.text-primary:hover, a.text-primary:focus { - color: #0056b3 !important; -} - -.text-secondary { - color: #6c757d !important; -} - -a.text-secondary:hover, a.text-secondary:focus { - color: #494f54 !important; -} - -.text-success { - color: #28a745 !important; -} - -a.text-success:hover, a.text-success:focus { - color: #19692c !important; -} - -.text-info { - color: #17a2b8 !important; -} - -a.text-info:hover, a.text-info:focus { - color: #0f6674 !important; -} - -.text-warning { - color: #ffc107 !important; -} - -a.text-warning:hover, a.text-warning:focus { - color: #ba8b00 !important; -} - -.text-danger { - color: #dc3545 !important; -} - -a.text-danger:hover, a.text-danger:focus { - color: #a71d2a !important; -} - -.text-light { - color: #f8f9fa !important; -} - -a.text-light:hover, a.text-light:focus { - color: #cbd3da !important; -} - -.text-dark { - color: #343a40 !important; -} - -a.text-dark:hover, a.text-dark:focus { - color: #121416 !important; -} - -.text-body { - color: #212529 !important; -} - -.text-muted { - color: #6c757d !important; -} - -.text-black-50 { - color: rgba(0, 0, 0, 0.5) !important; -} - -.text-white-50 { - color: rgba(255, 255, 255, 0.5) !important; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.text-decoration-none { - text-decoration: none !important; -} - -.text-break { - word-break: break-word !important; - word-wrap: break-word !important; -} - -.text-reset { - color: inherit !important; -} - -.visible { - visibility: visible !important; -} - -.invisible { - visibility: hidden !important; -} - -@media print { - *, -*::before, -*::after { - text-shadow: none !important; - box-shadow: none !important; - } - - a:not(.btn) { - text-decoration: underline; - } - - abbr[title]::after { - content: " (" attr(title) ")"; - } - - pre { - white-space: pre-wrap !important; - } - - pre, -blockquote { - border: 1px solid #adb5bd; - page-break-inside: avoid; - } - - thead { - display: table-header-group; - } - - tr, -img { - page-break-inside: avoid; - } - - p, -h2, -h3 { - orphans: 3; - widows: 3; - } - - h2, -h3 { - page-break-after: avoid; - } - - @page { - size: a3; - } - body { - min-width: 992px !important; - } - - .container { - min-width: 992px !important; - } - - .navbar { - display: none; - } - - .badge { - border: 1px solid #000; - } - - .table { - border-collapse: collapse !important; - } - .table td, -.table th { - background-color: #fff !important; - } - - .table-bordered th, -.table-bordered td { - border: 1px solid #dee2e6 !important; - } - - .table-dark { - color: inherit; - } - .table-dark th, -.table-dark td, -.table-dark thead th, -.table-dark tbody + tbody { - border-color: #dee2e6; - } - - .table .thead-dark th { - color: inherit; - border-color: #dee2e6; - } -} -html, -body { - height: 100%; -} - -.container, -.container-fluid, -.container-sm, -.container-md, -.container-lg, -.container-xl { - padding-left: 1.5rem; - padding-right: 1.5rem; -} - -#layoutAuthentication { - display: flex; - flex-direction: column; - min-height: 100vh; -} -#layoutAuthentication #layoutAuthentication_content { - min-width: 0; - flex-grow: 1; -} -#layoutAuthentication #layoutAuthentication_footer { - min-width: 0; -} - -#layoutSidenav { - display: flex; -} -#layoutSidenav #layoutSidenav_nav { - flex-basis: 225px; - flex-shrink: 0; - transition: transform 0.15s ease-in-out; - z-index: 1038; - transform: translateX(-225px); -} -#layoutSidenav #layoutSidenav_content { - position: relative; - display: flex; - flex-direction: column; - justify-content: space-between; - min-width: 0; - flex-grow: 1; - min-height: calc(100vh - 56px); - margin-left: -225px; -} - -.sb-sidenav-toggled #layoutSidenav #layoutSidenav_nav { - transform: translateX(0); -} -.sb-sidenav-toggled #layoutSidenav #layoutSidenav_content:before { - content: ""; - display: block; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #000; - z-index: 1037; - opacity: 0.5; - transition: opacity 0.3s ease-in-out; -} - -@media (min-width: 992px) { - #layoutSidenav #layoutSidenav_nav { - transform: translateX(0); - } - #layoutSidenav #layoutSidenav_content { - margin-left: 0; - transition: margin 0.15s ease-in-out; - } - - .sb-sidenav-toggled #layoutSidenav #layoutSidenav_nav { - transform: translateX(-225px); - } - .sb-sidenav-toggled #layoutSidenav #layoutSidenav_content { - margin-left: -225px; - } - .sb-sidenav-toggled #layoutSidenav #layoutSidenav_content:before { - display: none; - } -} -.sb-nav-fixed .sb-topnav { - z-index: 1039; -} -.sb-nav-fixed #layoutSidenav #layoutSidenav_nav { - width: 225px; - height: 100vh; - z-index: 1038; -} -.sb-nav-fixed #layoutSidenav #layoutSidenav_nav .sb-sidenav { - padding-top: 56px; -} -.sb-nav-fixed #layoutSidenav #layoutSidenav_nav .sb-sidenav .sb-sidenav-menu { - overflow-y: auto; -} -.sb-nav-fixed #layoutSidenav #layoutSidenav_content { - padding-left: 225px; - top: 56px; -} - -#layoutError { - display: flex; - flex-direction: column; - min-height: 100vh; -} -#layoutError #layoutError_content { - min-width: 0; - flex-grow: 1; -} -#layoutError #layoutError_footer { - min-width: 0; -} - -.img-error { - max-width: 20rem; -} - -.nav .nav-link .sb-nav-link-icon, -.sb-sidenav-menu .nav-link .sb-nav-link-icon { - margin-right: 0.5rem; -} - -.sb-topnav { - padding-left: 0; - height: 56px; - z-index: 1039; -} -.sb-topnav .navbar-brand { - width: 225px; - padding-left: 1rem; - padding-right: 1rem; - margin: 0; -} -.sb-topnav.navbar-dark #sidebarToggle { - color: rgba(255, 255, 255, 0.5); -} -.sb-topnav.navbar-light #sidebarToggle { - color: #212529; -} - -.sb-sidenav { - display: flex; - flex-direction: column; - height: 100%; - flex-wrap: nowrap; -} -.sb-sidenav .sb-sidenav-menu { - flex-grow: 1; -} -.sb-sidenav .sb-sidenav-menu .nav { - flex-direction: column; - flex-wrap: nowrap; -} -.sb-sidenav .sb-sidenav-menu .nav .sb-sidenav-menu-heading { - padding: 1.75rem 1rem 0.75rem; - font-size: 0.75rem; - font-weight: bold; - text-transform: uppercase; -} -.sb-sidenav .sb-sidenav-menu .nav .nav-link { - display: flex; - align-items: center; - padding-top: 0.75rem; - padding-bottom: 0.75rem; - position: relative; -} -.sb-sidenav .sb-sidenav-menu .nav .nav-link .sb-nav-link-icon { - font-size: 0.9rem; -} -.sb-sidenav .sb-sidenav-menu .nav .nav-link .sb-sidenav-collapse-arrow { - display: inline-block; - margin-left: auto; - transition: transform 0.15s ease; -} -.sb-sidenav .sb-sidenav-menu .nav .nav-link.collapsed .sb-sidenav-collapse-arrow { - transform: rotate(-90deg); -} -.sb-sidenav .sb-sidenav-menu .nav .sb-sidenav-menu-nested { - margin-left: 1.5rem; - flex-direction: column; -} -.sb-sidenav .sb-sidenav-footer { - padding: 0.75rem; - flex-shrink: 0; -} - -.sb-sidenav-dark { - background-color: #212529; - color: rgba(255, 255, 255, 0.5); -} -.sb-sidenav-dark .sb-sidenav-menu .sb-sidenav-menu-heading { - color: rgba(255, 255, 255, 0.25); -} -.sb-sidenav-dark .sb-sidenav-menu .nav-link { - color: rgba(255, 255, 255, 0.5); -} -.sb-sidenav-dark .sb-sidenav-menu .nav-link .sb-nav-link-icon { - color: rgba(255, 255, 255, 0.25); -} -.sb-sidenav-dark .sb-sidenav-menu .nav-link .sb-sidenav-collapse-arrow { - color: rgba(255, 255, 255, 0.25); -} -.sb-sidenav-dark .sb-sidenav-menu .nav-link:hover { - color: #fff; -} -.sb-sidenav-dark .sb-sidenav-menu .nav-link.active { - color: #fff; -} -.sb-sidenav-dark .sb-sidenav-menu .nav-link.active .sb-nav-link-icon { - color: #fff; -} -.sb-sidenav-dark .sb-sidenav-footer { - background-color: #343a40; -} - -.sb-sidenav-light { - background-color: #f8f9fa; - color: #212529; -} -.sb-sidenav-light .sb-sidenav-menu .sb-sidenav-menu-heading { - color: #adb5bd; -} -.sb-sidenav-light .sb-sidenav-menu .nav-link { - color: #212529; -} -.sb-sidenav-light .sb-sidenav-menu .nav-link .sb-nav-link-icon { - color: #adb5bd; -} -.sb-sidenav-light .sb-sidenav-menu .nav-link .sb-sidenav-collapse-arrow { - color: #adb5bd; -} -.sb-sidenav-light .sb-sidenav-menu .nav-link:hover { - color: #007bff; -} -.sb-sidenav-light .sb-sidenav-menu .nav-link.active { - color: #007bff; -} -.sb-sidenav-light .sb-sidenav-menu .nav-link.active .sb-nav-link-icon { - color: #007bff; -} -.sb-sidenav-light .sb-sidenav-footer { - background-color: #e9ecef; -} \ No newline at end of file diff --git a/public/assets/css/util.css b/public/assets/css/util.css deleted file mode 100644 index 44d41a4..0000000 --- a/public/assets/css/util.css +++ /dev/null @@ -1,2993 +0,0 @@ -/*[ FONT SIZE ] -/////////////////////////////////////////////////////////// -*/ -.fs-1 {font-size: 1px;} -.fs-2 {font-size: 2px;} -.fs-3 {font-size: 3px;} -.fs-4 {font-size: 4px;} -.fs-5 {font-size: 5px;} -.fs-6 {font-size: 6px;} -.fs-7 {font-size: 7px;} -.fs-8 {font-size: 8px;} -.fs-9 {font-size: 9px;} -.fs-10 {font-size: 10px;} -.fs-11 {font-size: 11px;} -.fs-12 {font-size: 12px;} -.fs-13 {font-size: 13px;} -.fs-14 {font-size: 14px;} -.fs-15 {font-size: 15px;} -.fs-16 {font-size: 16px;} -.fs-17 {font-size: 17px;} -.fs-18 {font-size: 18px;} -.fs-19 {font-size: 19px;} -.fs-20 {font-size: 20px;} -.fs-21 {font-size: 21px;} -.fs-22 {font-size: 22px;} -.fs-23 {font-size: 23px;} -.fs-24 {font-size: 24px;} -.fs-25 {font-size: 25px;} -.fs-26 {font-size: 26px;} -.fs-27 {font-size: 27px;} -.fs-28 {font-size: 28px;} -.fs-29 {font-size: 29px;} -.fs-30 {font-size: 30px;} -.fs-31 {font-size: 31px;} -.fs-32 {font-size: 32px;} -.fs-33 {font-size: 33px;} -.fs-34 {font-size: 34px;} -.fs-35 {font-size: 35px;} -.fs-36 {font-size: 36px;} -.fs-37 {font-size: 37px;} -.fs-38 {font-size: 38px;} -.fs-39 {font-size: 39px;} -.fs-40 {font-size: 40px;} -.fs-41 {font-size: 41px;} -.fs-42 {font-size: 42px;} -.fs-43 {font-size: 43px;} -.fs-44 {font-size: 44px;} -.fs-45 {font-size: 45px;} -.fs-46 {font-size: 46px;} -.fs-47 {font-size: 47px;} -.fs-48 {font-size: 48px;} -.fs-49 {font-size: 49px;} -.fs-50 {font-size: 50px;} -.fs-51 {font-size: 51px;} -.fs-52 {font-size: 52px;} -.fs-53 {font-size: 53px;} -.fs-54 {font-size: 54px;} -.fs-55 {font-size: 55px;} -.fs-56 {font-size: 56px;} -.fs-57 {font-size: 57px;} -.fs-58 {font-size: 58px;} -.fs-59 {font-size: 59px;} -.fs-60 {font-size: 60px;} -.fs-61 {font-size: 61px;} -.fs-62 {font-size: 62px;} -.fs-63 {font-size: 63px;} -.fs-64 {font-size: 64px;} -.fs-65 {font-size: 65px;} -.fs-66 {font-size: 66px;} -.fs-67 {font-size: 67px;} -.fs-68 {font-size: 68px;} -.fs-69 {font-size: 69px;} -.fs-70 {font-size: 70px;} -.fs-71 {font-size: 71px;} -.fs-72 {font-size: 72px;} -.fs-73 {font-size: 73px;} -.fs-74 {font-size: 74px;} -.fs-75 {font-size: 75px;} -.fs-76 {font-size: 76px;} -.fs-77 {font-size: 77px;} -.fs-78 {font-size: 78px;} -.fs-79 {font-size: 79px;} -.fs-80 {font-size: 80px;} -.fs-81 {font-size: 81px;} -.fs-82 {font-size: 82px;} -.fs-83 {font-size: 83px;} -.fs-84 {font-size: 84px;} -.fs-85 {font-size: 85px;} -.fs-86 {font-size: 86px;} -.fs-87 {font-size: 87px;} -.fs-88 {font-size: 88px;} -.fs-89 {font-size: 89px;} -.fs-90 {font-size: 90px;} -.fs-91 {font-size: 91px;} -.fs-92 {font-size: 92px;} -.fs-93 {font-size: 93px;} -.fs-94 {font-size: 94px;} -.fs-95 {font-size: 95px;} -.fs-96 {font-size: 96px;} -.fs-97 {font-size: 97px;} -.fs-98 {font-size: 98px;} -.fs-99 {font-size: 99px;} -.fs-100 {font-size: 100px;} -.fs-101 {font-size: 101px;} -.fs-102 {font-size: 102px;} -.fs-103 {font-size: 103px;} -.fs-104 {font-size: 104px;} -.fs-105 {font-size: 105px;} -.fs-106 {font-size: 106px;} -.fs-107 {font-size: 107px;} -.fs-108 {font-size: 108px;} -.fs-109 {font-size: 109px;} -.fs-110 {font-size: 110px;} -.fs-111 {font-size: 111px;} -.fs-112 {font-size: 112px;} -.fs-113 {font-size: 113px;} -.fs-114 {font-size: 114px;} -.fs-115 {font-size: 115px;} -.fs-116 {font-size: 116px;} -.fs-117 {font-size: 117px;} -.fs-118 {font-size: 118px;} -.fs-119 {font-size: 119px;} -.fs-120 {font-size: 120px;} -.fs-121 {font-size: 121px;} -.fs-122 {font-size: 122px;} -.fs-123 {font-size: 123px;} -.fs-124 {font-size: 124px;} -.fs-125 {font-size: 125px;} -.fs-126 {font-size: 126px;} -.fs-127 {font-size: 127px;} -.fs-128 {font-size: 128px;} -.fs-129 {font-size: 129px;} -.fs-130 {font-size: 130px;} -.fs-131 {font-size: 131px;} -.fs-132 {font-size: 132px;} -.fs-133 {font-size: 133px;} -.fs-134 {font-size: 134px;} -.fs-135 {font-size: 135px;} -.fs-136 {font-size: 136px;} -.fs-137 {font-size: 137px;} -.fs-138 {font-size: 138px;} -.fs-139 {font-size: 139px;} -.fs-140 {font-size: 140px;} -.fs-141 {font-size: 141px;} -.fs-142 {font-size: 142px;} -.fs-143 {font-size: 143px;} -.fs-144 {font-size: 144px;} -.fs-145 {font-size: 145px;} -.fs-146 {font-size: 146px;} -.fs-147 {font-size: 147px;} -.fs-148 {font-size: 148px;} -.fs-149 {font-size: 149px;} -.fs-150 {font-size: 150px;} -.fs-151 {font-size: 151px;} -.fs-152 {font-size: 152px;} -.fs-153 {font-size: 153px;} -.fs-154 {font-size: 154px;} -.fs-155 {font-size: 155px;} -.fs-156 {font-size: 156px;} -.fs-157 {font-size: 157px;} -.fs-158 {font-size: 158px;} -.fs-159 {font-size: 159px;} -.fs-160 {font-size: 160px;} -.fs-161 {font-size: 161px;} -.fs-162 {font-size: 162px;} -.fs-163 {font-size: 163px;} -.fs-164 {font-size: 164px;} -.fs-165 {font-size: 165px;} -.fs-166 {font-size: 166px;} -.fs-167 {font-size: 167px;} -.fs-168 {font-size: 168px;} -.fs-169 {font-size: 169px;} -.fs-170 {font-size: 170px;} -.fs-171 {font-size: 171px;} -.fs-172 {font-size: 172px;} -.fs-173 {font-size: 173px;} -.fs-174 {font-size: 174px;} -.fs-175 {font-size: 175px;} -.fs-176 {font-size: 176px;} -.fs-177 {font-size: 177px;} -.fs-178 {font-size: 178px;} -.fs-179 {font-size: 179px;} -.fs-180 {font-size: 180px;} -.fs-181 {font-size: 181px;} -.fs-182 {font-size: 182px;} -.fs-183 {font-size: 183px;} -.fs-184 {font-size: 184px;} -.fs-185 {font-size: 185px;} -.fs-186 {font-size: 186px;} -.fs-187 {font-size: 187px;} -.fs-188 {font-size: 188px;} -.fs-189 {font-size: 189px;} -.fs-190 {font-size: 190px;} -.fs-191 {font-size: 191px;} -.fs-192 {font-size: 192px;} -.fs-193 {font-size: 193px;} -.fs-194 {font-size: 194px;} -.fs-195 {font-size: 195px;} -.fs-196 {font-size: 196px;} -.fs-197 {font-size: 197px;} -.fs-198 {font-size: 198px;} -.fs-199 {font-size: 199px;} -.fs-200 {font-size: 200px;} - -/*[ PADDING ] -/////////////////////////////////////////////////////////// -*/ -.p-t-0 {padding-top: 0px;} -.p-t-1 {padding-top: 1px;} -.p-t-2 {padding-top: 2px;} -.p-t-3 {padding-top: 3px;} -.p-t-4 {padding-top: 4px;} -.p-t-5 {padding-top: 5px;} -.p-t-6 {padding-top: 6px;} -.p-t-7 {padding-top: 7px;} -.p-t-8 {padding-top: 8px;} -.p-t-9 {padding-top: 9px;} -.p-t-10 {padding-top: 10px;} -.p-t-11 {padding-top: 11px;} -.p-t-12 {padding-top: 12px;} -.p-t-13 {padding-top: 13px;} -.p-t-14 {padding-top: 14px;} -.p-t-15 {padding-top: 15px;} -.p-t-16 {padding-top: 16px;} -.p-t-17 {padding-top: 17px;} -.p-t-18 {padding-top: 18px;} -.p-t-19 {padding-top: 19px;} -.p-t-20 {padding-top: 20px;} -.p-t-21 {padding-top: 21px;} -.p-t-22 {padding-top: 22px;} -.p-t-23 {padding-top: 23px;} -.p-t-24 {padding-top: 24px;} -.p-t-25 {padding-top: 25px;} -.p-t-26 {padding-top: 26px;} -.p-t-27 {padding-top: 27px;} -.p-t-28 {padding-top: 28px;} -.p-t-29 {padding-top: 29px;} -.p-t-30 {padding-top: 30px;} -.p-t-31 {padding-top: 31px;} -.p-t-32 {padding-top: 32px;} -.p-t-33 {padding-top: 33px;} -.p-t-34 {padding-top: 34px;} -.p-t-35 {padding-top: 35px;} -.p-t-36 {padding-top: 36px;} -.p-t-37 {padding-top: 37px;} -.p-t-38 {padding-top: 38px;} -.p-t-39 {padding-top: 39px;} -.p-t-40 {padding-top: 40px;} -.p-t-41 {padding-top: 41px;} -.p-t-42 {padding-top: 42px;} -.p-t-43 {padding-top: 43px;} -.p-t-44 {padding-top: 44px;} -.p-t-45 {padding-top: 45px;} -.p-t-46 {padding-top: 46px;} -.p-t-47 {padding-top: 47px;} -.p-t-48 {padding-top: 48px;} -.p-t-49 {padding-top: 49px;} -.p-t-50 {padding-top: 50px;} -.p-t-51 {padding-top: 51px;} -.p-t-52 {padding-top: 52px;} -.p-t-53 {padding-top: 53px;} -.p-t-54 {padding-top: 54px;} -.p-t-55 {padding-top: 55px;} -.p-t-56 {padding-top: 56px;} -.p-t-57 {padding-top: 57px;} -.p-t-58 {padding-top: 58px;} -.p-t-59 {padding-top: 59px;} -.p-t-60 {padding-top: 60px;} -.p-t-61 {padding-top: 61px;} -.p-t-62 {padding-top: 62px;} -.p-t-63 {padding-top: 63px;} -.p-t-64 {padding-top: 64px;} -.p-t-65 {padding-top: 65px;} -.p-t-66 {padding-top: 66px;} -.p-t-67 {padding-top: 67px;} -.p-t-68 {padding-top: 68px;} -.p-t-69 {padding-top: 69px;} -.p-t-70 {padding-top: 70px;} -.p-t-71 {padding-top: 71px;} -.p-t-72 {padding-top: 72px;} -.p-t-73 {padding-top: 73px;} -.p-t-74 {padding-top: 74px;} -.p-t-75 {padding-top: 75px;} -.p-t-76 {padding-top: 76px;} -.p-t-77 {padding-top: 77px;} -.p-t-78 {padding-top: 78px;} -.p-t-79 {padding-top: 79px;} -.p-t-80 {padding-top: 80px;} -.p-t-81 {padding-top: 81px;} -.p-t-82 {padding-top: 82px;} -.p-t-83 {padding-top: 83px;} -.p-t-84 {padding-top: 84px;} -.p-t-85 {padding-top: 85px;} -.p-t-86 {padding-top: 86px;} -.p-t-87 {padding-top: 87px;} -.p-t-88 {padding-top: 88px;} -.p-t-89 {padding-top: 89px;} -.p-t-90 {padding-top: 90px;} -.p-t-91 {padding-top: 91px;} -.p-t-92 {padding-top: 92px;} -.p-t-93 {padding-top: 93px;} -.p-t-94 {padding-top: 94px;} -.p-t-95 {padding-top: 95px;} -.p-t-96 {padding-top: 96px;} -.p-t-97 {padding-top: 97px;} -.p-t-98 {padding-top: 98px;} -.p-t-99 {padding-top: 99px;} -.p-t-100 {padding-top: 100px;} -.p-t-101 {padding-top: 101px;} -.p-t-102 {padding-top: 102px;} -.p-t-103 {padding-top: 103px;} -.p-t-104 {padding-top: 104px;} -.p-t-105 {padding-top: 105px;} -.p-t-106 {padding-top: 106px;} -.p-t-107 {padding-top: 107px;} -.p-t-108 {padding-top: 108px;} -.p-t-109 {padding-top: 109px;} -.p-t-110 {padding-top: 110px;} -.p-t-111 {padding-top: 111px;} -.p-t-112 {padding-top: 112px;} -.p-t-113 {padding-top: 113px;} -.p-t-114 {padding-top: 114px;} -.p-t-115 {padding-top: 115px;} -.p-t-116 {padding-top: 116px;} -.p-t-117 {padding-top: 117px;} -.p-t-118 {padding-top: 118px;} -.p-t-119 {padding-top: 119px;} -.p-t-120 {padding-top: 120px;} -.p-t-121 {padding-top: 121px;} -.p-t-122 {padding-top: 122px;} -.p-t-123 {padding-top: 123px;} -.p-t-124 {padding-top: 124px;} -.p-t-125 {padding-top: 125px;} -.p-t-126 {padding-top: 126px;} -.p-t-127 {padding-top: 127px;} -.p-t-128 {padding-top: 128px;} -.p-t-129 {padding-top: 129px;} -.p-t-130 {padding-top: 130px;} -.p-t-131 {padding-top: 131px;} -.p-t-132 {padding-top: 132px;} -.p-t-133 {padding-top: 133px;} -.p-t-134 {padding-top: 134px;} -.p-t-135 {padding-top: 135px;} -.p-t-136 {padding-top: 136px;} -.p-t-137 {padding-top: 137px;} -.p-t-138 {padding-top: 138px;} -.p-t-139 {padding-top: 139px;} -.p-t-140 {padding-top: 140px;} -.p-t-141 {padding-top: 141px;} -.p-t-142 {padding-top: 142px;} -.p-t-143 {padding-top: 143px;} -.p-t-144 {padding-top: 144px;} -.p-t-145 {padding-top: 145px;} -.p-t-146 {padding-top: 146px;} -.p-t-147 {padding-top: 147px;} -.p-t-148 {padding-top: 148px;} -.p-t-149 {padding-top: 149px;} -.p-t-150 {padding-top: 150px;} -.p-t-151 {padding-top: 151px;} -.p-t-152 {padding-top: 152px;} -.p-t-153 {padding-top: 153px;} -.p-t-154 {padding-top: 154px;} -.p-t-155 {padding-top: 155px;} -.p-t-156 {padding-top: 156px;} -.p-t-157 {padding-top: 157px;} -.p-t-158 {padding-top: 158px;} -.p-t-159 {padding-top: 159px;} -.p-t-160 {padding-top: 160px;} -.p-t-161 {padding-top: 161px;} -.p-t-162 {padding-top: 162px;} -.p-t-163 {padding-top: 163px;} -.p-t-164 {padding-top: 164px;} -.p-t-165 {padding-top: 165px;} -.p-t-166 {padding-top: 166px;} -.p-t-167 {padding-top: 167px;} -.p-t-168 {padding-top: 168px;} -.p-t-169 {padding-top: 169px;} -.p-t-170 {padding-top: 170px;} -.p-t-171 {padding-top: 171px;} -.p-t-172 {padding-top: 172px;} -.p-t-173 {padding-top: 173px;} -.p-t-174 {padding-top: 174px;} -.p-t-175 {padding-top: 175px;} -.p-t-176 {padding-top: 176px;} -.p-t-177 {padding-top: 177px;} -.p-t-178 {padding-top: 178px;} -.p-t-179 {padding-top: 179px;} -.p-t-180 {padding-top: 180px;} -.p-t-181 {padding-top: 181px;} -.p-t-182 {padding-top: 182px;} -.p-t-183 {padding-top: 183px;} -.p-t-184 {padding-top: 184px;} -.p-t-185 {padding-top: 185px;} -.p-t-186 {padding-top: 186px;} -.p-t-187 {padding-top: 187px;} -.p-t-188 {padding-top: 188px;} -.p-t-189 {padding-top: 189px;} -.p-t-190 {padding-top: 190px;} -.p-t-191 {padding-top: 191px;} -.p-t-192 {padding-top: 192px;} -.p-t-193 {padding-top: 193px;} -.p-t-194 {padding-top: 194px;} -.p-t-195 {padding-top: 195px;} -.p-t-196 {padding-top: 196px;} -.p-t-197 {padding-top: 197px;} -.p-t-198 {padding-top: 198px;} -.p-t-199 {padding-top: 199px;} -.p-t-200 {padding-top: 200px;} -.p-t-201 {padding-top: 201px;} -.p-t-202 {padding-top: 202px;} -.p-t-203 {padding-top: 203px;} -.p-t-204 {padding-top: 204px;} -.p-t-205 {padding-top: 205px;} -.p-t-206 {padding-top: 206px;} -.p-t-207 {padding-top: 207px;} -.p-t-208 {padding-top: 208px;} -.p-t-209 {padding-top: 209px;} -.p-t-210 {padding-top: 210px;} -.p-t-211 {padding-top: 211px;} -.p-t-212 {padding-top: 212px;} -.p-t-213 {padding-top: 213px;} -.p-t-214 {padding-top: 214px;} -.p-t-215 {padding-top: 215px;} -.p-t-216 {padding-top: 216px;} -.p-t-217 {padding-top: 217px;} -.p-t-218 {padding-top: 218px;} -.p-t-219 {padding-top: 219px;} -.p-t-220 {padding-top: 220px;} -.p-t-221 {padding-top: 221px;} -.p-t-222 {padding-top: 222px;} -.p-t-223 {padding-top: 223px;} -.p-t-224 {padding-top: 224px;} -.p-t-225 {padding-top: 225px;} -.p-t-226 {padding-top: 226px;} -.p-t-227 {padding-top: 227px;} -.p-t-228 {padding-top: 228px;} -.p-t-229 {padding-top: 229px;} -.p-t-230 {padding-top: 230px;} -.p-t-231 {padding-top: 231px;} -.p-t-232 {padding-top: 232px;} -.p-t-233 {padding-top: 233px;} -.p-t-234 {padding-top: 234px;} -.p-t-235 {padding-top: 235px;} -.p-t-236 {padding-top: 236px;} -.p-t-237 {padding-top: 237px;} -.p-t-238 {padding-top: 238px;} -.p-t-239 {padding-top: 239px;} -.p-t-240 {padding-top: 240px;} -.p-t-241 {padding-top: 241px;} -.p-t-242 {padding-top: 242px;} -.p-t-243 {padding-top: 243px;} -.p-t-244 {padding-top: 244px;} -.p-t-245 {padding-top: 245px;} -.p-t-246 {padding-top: 246px;} -.p-t-247 {padding-top: 247px;} -.p-t-248 {padding-top: 248px;} -.p-t-249 {padding-top: 249px;} -.p-t-250 {padding-top: 250px;} -.p-b-0 {padding-bottom: 0px;} -.p-b-1 {padding-bottom: 1px;} -.p-b-2 {padding-bottom: 2px;} -.p-b-3 {padding-bottom: 3px;} -.p-b-4 {padding-bottom: 4px;} -.p-b-5 {padding-bottom: 5px;} -.p-b-6 {padding-bottom: 6px;} -.p-b-7 {padding-bottom: 7px;} -.p-b-8 {padding-bottom: 8px;} -.p-b-9 {padding-bottom: 9px;} -.p-b-10 {padding-bottom: 10px;} -.p-b-11 {padding-bottom: 11px;} -.p-b-12 {padding-bottom: 12px;} -.p-b-13 {padding-bottom: 13px;} -.p-b-14 {padding-bottom: 14px;} -.p-b-15 {padding-bottom: 15px;} -.p-b-16 {padding-bottom: 16px;} -.p-b-17 {padding-bottom: 17px;} -.p-b-18 {padding-bottom: 18px;} -.p-b-19 {padding-bottom: 19px;} -.p-b-20 {padding-bottom: 20px;} -.p-b-21 {padding-bottom: 21px;} -.p-b-22 {padding-bottom: 22px;} -.p-b-23 {padding-bottom: 23px;} -.p-b-24 {padding-bottom: 24px;} -.p-b-25 {padding-bottom: 25px;} -.p-b-26 {padding-bottom: 26px;} -.p-b-27 {padding-bottom: 27px;} -.p-b-28 {padding-bottom: 28px;} -.p-b-29 {padding-bottom: 29px;} -.p-b-30 {padding-bottom: 30px;} -.p-b-31 {padding-bottom: 31px;} -.p-b-32 {padding-bottom: 32px;} -.p-b-33 {padding-bottom: 33px;} -.p-b-34 {padding-bottom: 34px;} -.p-b-35 {padding-bottom: 35px;} -.p-b-36 {padding-bottom: 36px;} -.p-b-37 {padding-bottom: 37px;} -.p-b-38 {padding-bottom: 38px;} -.p-b-39 {padding-bottom: 39px;} -.p-b-40 {padding-bottom: 40px;} -.p-b-41 {padding-bottom: 41px;} -.p-b-42 {padding-bottom: 42px;} -.p-b-43 {padding-bottom: 43px;} -.p-b-44 {padding-bottom: 44px;} -.p-b-45 {padding-bottom: 45px;} -.p-b-46 {padding-bottom: 46px;} -.p-b-47 {padding-bottom: 47px;} -.p-b-48 {padding-bottom: 48px;} -.p-b-49 {padding-bottom: 49px;} -.p-b-50 {padding-bottom: 50px;} -.p-b-51 {padding-bottom: 51px;} -.p-b-52 {padding-bottom: 52px;} -.p-b-53 {padding-bottom: 53px;} -.p-b-54 {padding-bottom: 54px;} -.p-b-55 {padding-bottom: 55px;} -.p-b-56 {padding-bottom: 56px;} -.p-b-57 {padding-bottom: 57px;} -.p-b-58 {padding-bottom: 58px;} -.p-b-59 {padding-bottom: 59px;} -.p-b-60 {padding-bottom: 60px;} -.p-b-61 {padding-bottom: 61px;} -.p-b-62 {padding-bottom: 62px;} -.p-b-63 {padding-bottom: 63px;} -.p-b-64 {padding-bottom: 64px;} -.p-b-65 {padding-bottom: 65px;} -.p-b-66 {padding-bottom: 66px;} -.p-b-67 {padding-bottom: 67px;} -.p-b-68 {padding-bottom: 68px;} -.p-b-69 {padding-bottom: 69px;} -.p-b-70 {padding-bottom: 70px;} -.p-b-71 {padding-bottom: 71px;} -.p-b-72 {padding-bottom: 72px;} -.p-b-73 {padding-bottom: 73px;} -.p-b-74 {padding-bottom: 74px;} -.p-b-75 {padding-bottom: 75px;} -.p-b-76 {padding-bottom: 76px;} -.p-b-77 {padding-bottom: 77px;} -.p-b-78 {padding-bottom: 78px;} -.p-b-79 {padding-bottom: 79px;} -.p-b-80 {padding-bottom: 80px;} -.p-b-81 {padding-bottom: 81px;} -.p-b-82 {padding-bottom: 82px;} -.p-b-83 {padding-bottom: 83px;} -.p-b-84 {padding-bottom: 84px;} -.p-b-85 {padding-bottom: 85px;} -.p-b-86 {padding-bottom: 86px;} -.p-b-87 {padding-bottom: 87px;} -.p-b-88 {padding-bottom: 88px;} -.p-b-89 {padding-bottom: 89px;} -.p-b-90 {padding-bottom: 90px;} -.p-b-91 {padding-bottom: 91px;} -.p-b-92 {padding-bottom: 92px;} -.p-b-93 {padding-bottom: 93px;} -.p-b-94 {padding-bottom: 94px;} -.p-b-95 {padding-bottom: 95px;} -.p-b-96 {padding-bottom: 96px;} -.p-b-97 {padding-bottom: 97px;} -.p-b-98 {padding-bottom: 98px;} -.p-b-99 {padding-bottom: 99px;} -.p-b-100 {padding-bottom: 100px;} -.p-b-101 {padding-bottom: 101px;} -.p-b-102 {padding-bottom: 102px;} -.p-b-103 {padding-bottom: 103px;} -.p-b-104 {padding-bottom: 104px;} -.p-b-105 {padding-bottom: 105px;} -.p-b-106 {padding-bottom: 106px;} -.p-b-107 {padding-bottom: 107px;} -.p-b-108 {padding-bottom: 108px;} -.p-b-109 {padding-bottom: 109px;} -.p-b-110 {padding-bottom: 110px;} -.p-b-111 {padding-bottom: 111px;} -.p-b-112 {padding-bottom: 112px;} -.p-b-113 {padding-bottom: 113px;} -.p-b-114 {padding-bottom: 114px;} -.p-b-115 {padding-bottom: 115px;} -.p-b-116 {padding-bottom: 116px;} -.p-b-117 {padding-bottom: 117px;} -.p-b-118 {padding-bottom: 118px;} -.p-b-119 {padding-bottom: 119px;} -.p-b-120 {padding-bottom: 120px;} -.p-b-121 {padding-bottom: 121px;} -.p-b-122 {padding-bottom: 122px;} -.p-b-123 {padding-bottom: 123px;} -.p-b-124 {padding-bottom: 124px;} -.p-b-125 {padding-bottom: 125px;} -.p-b-126 {padding-bottom: 126px;} -.p-b-127 {padding-bottom: 127px;} -.p-b-128 {padding-bottom: 128px;} -.p-b-129 {padding-bottom: 129px;} -.p-b-130 {padding-bottom: 130px;} -.p-b-131 {padding-bottom: 131px;} -.p-b-132 {padding-bottom: 132px;} -.p-b-133 {padding-bottom: 133px;} -.p-b-134 {padding-bottom: 134px;} -.p-b-135 {padding-bottom: 135px;} -.p-b-136 {padding-bottom: 136px;} -.p-b-137 {padding-bottom: 137px;} -.p-b-138 {padding-bottom: 138px;} -.p-b-139 {padding-bottom: 139px;} -.p-b-140 {padding-bottom: 140px;} -.p-b-141 {padding-bottom: 141px;} -.p-b-142 {padding-bottom: 142px;} -.p-b-143 {padding-bottom: 143px;} -.p-b-144 {padding-bottom: 144px;} -.p-b-145 {padding-bottom: 145px;} -.p-b-146 {padding-bottom: 146px;} -.p-b-147 {padding-bottom: 147px;} -.p-b-148 {padding-bottom: 148px;} -.p-b-149 {padding-bottom: 149px;} -.p-b-150 {padding-bottom: 150px;} -.p-b-151 {padding-bottom: 151px;} -.p-b-152 {padding-bottom: 152px;} -.p-b-153 {padding-bottom: 153px;} -.p-b-154 {padding-bottom: 154px;} -.p-b-155 {padding-bottom: 155px;} -.p-b-156 {padding-bottom: 156px;} -.p-b-157 {padding-bottom: 157px;} -.p-b-158 {padding-bottom: 158px;} -.p-b-159 {padding-bottom: 159px;} -.p-b-160 {padding-bottom: 160px;} -.p-b-161 {padding-bottom: 161px;} -.p-b-162 {padding-bottom: 162px;} -.p-b-163 {padding-bottom: 163px;} -.p-b-164 {padding-bottom: 164px;} -.p-b-165 {padding-bottom: 165px;} -.p-b-166 {padding-bottom: 166px;} -.p-b-167 {padding-bottom: 167px;} -.p-b-168 {padding-bottom: 168px;} -.p-b-169 {padding-bottom: 169px;} -.p-b-170 {padding-bottom: 170px;} -.p-b-171 {padding-bottom: 171px;} -.p-b-172 {padding-bottom: 172px;} -.p-b-173 {padding-bottom: 173px;} -.p-b-174 {padding-bottom: 174px;} -.p-b-175 {padding-bottom: 175px;} -.p-b-176 {padding-bottom: 176px;} -.p-b-177 {padding-bottom: 177px;} -.p-b-178 {padding-bottom: 178px;} -.p-b-179 {padding-bottom: 179px;} -.p-b-180 {padding-bottom: 180px;} -.p-b-181 {padding-bottom: 181px;} -.p-b-182 {padding-bottom: 182px;} -.p-b-183 {padding-bottom: 183px;} -.p-b-184 {padding-bottom: 184px;} -.p-b-185 {padding-bottom: 185px;} -.p-b-186 {padding-bottom: 186px;} -.p-b-187 {padding-bottom: 187px;} -.p-b-188 {padding-bottom: 188px;} -.p-b-189 {padding-bottom: 189px;} -.p-b-190 {padding-bottom: 190px;} -.p-b-191 {padding-bottom: 191px;} -.p-b-192 {padding-bottom: 192px;} -.p-b-193 {padding-bottom: 193px;} -.p-b-194 {padding-bottom: 194px;} -.p-b-195 {padding-bottom: 195px;} -.p-b-196 {padding-bottom: 196px;} -.p-b-197 {padding-bottom: 197px;} -.p-b-198 {padding-bottom: 198px;} -.p-b-199 {padding-bottom: 199px;} -.p-b-200 {padding-bottom: 200px;} -.p-b-201 {padding-bottom: 201px;} -.p-b-202 {padding-bottom: 202px;} -.p-b-203 {padding-bottom: 203px;} -.p-b-204 {padding-bottom: 204px;} -.p-b-205 {padding-bottom: 205px;} -.p-b-206 {padding-bottom: 206px;} -.p-b-207 {padding-bottom: 207px;} -.p-b-208 {padding-bottom: 208px;} -.p-b-209 {padding-bottom: 209px;} -.p-b-210 {padding-bottom: 210px;} -.p-b-211 {padding-bottom: 211px;} -.p-b-212 {padding-bottom: 212px;} -.p-b-213 {padding-bottom: 213px;} -.p-b-214 {padding-bottom: 214px;} -.p-b-215 {padding-bottom: 215px;} -.p-b-216 {padding-bottom: 216px;} -.p-b-217 {padding-bottom: 217px;} -.p-b-218 {padding-bottom: 218px;} -.p-b-219 {padding-bottom: 219px;} -.p-b-220 {padding-bottom: 220px;} -.p-b-221 {padding-bottom: 221px;} -.p-b-222 {padding-bottom: 222px;} -.p-b-223 {padding-bottom: 223px;} -.p-b-224 {padding-bottom: 224px;} -.p-b-225 {padding-bottom: 225px;} -.p-b-226 {padding-bottom: 226px;} -.p-b-227 {padding-bottom: 227px;} -.p-b-228 {padding-bottom: 228px;} -.p-b-229 {padding-bottom: 229px;} -.p-b-230 {padding-bottom: 230px;} -.p-b-231 {padding-bottom: 231px;} -.p-b-232 {padding-bottom: 232px;} -.p-b-233 {padding-bottom: 233px;} -.p-b-234 {padding-bottom: 234px;} -.p-b-235 {padding-bottom: 235px;} -.p-b-236 {padding-bottom: 236px;} -.p-b-237 {padding-bottom: 237px;} -.p-b-238 {padding-bottom: 238px;} -.p-b-239 {padding-bottom: 239px;} -.p-b-240 {padding-bottom: 240px;} -.p-b-241 {padding-bottom: 241px;} -.p-b-242 {padding-bottom: 242px;} -.p-b-243 {padding-bottom: 243px;} -.p-b-244 {padding-bottom: 244px;} -.p-b-245 {padding-bottom: 245px;} -.p-b-246 {padding-bottom: 246px;} -.p-b-247 {padding-bottom: 247px;} -.p-b-248 {padding-bottom: 248px;} -.p-b-249 {padding-bottom: 249px;} -.p-b-250 {padding-bottom: 250px;} -.p-l-0 {padding-left: 0px;} -.p-l-1 {padding-left: 1px;} -.p-l-2 {padding-left: 2px;} -.p-l-3 {padding-left: 3px;} -.p-l-4 {padding-left: 4px;} -.p-l-5 {padding-left: 5px;} -.p-l-6 {padding-left: 6px;} -.p-l-7 {padding-left: 7px;} -.p-l-8 {padding-left: 8px;} -.p-l-9 {padding-left: 9px;} -.p-l-10 {padding-left: 10px;} -.p-l-11 {padding-left: 11px;} -.p-l-12 {padding-left: 12px;} -.p-l-13 {padding-left: 13px;} -.p-l-14 {padding-left: 14px;} -.p-l-15 {padding-left: 15px;} -.p-l-16 {padding-left: 16px;} -.p-l-17 {padding-left: 17px;} -.p-l-18 {padding-left: 18px;} -.p-l-19 {padding-left: 19px;} -.p-l-20 {padding-left: 20px;} -.p-l-21 {padding-left: 21px;} -.p-l-22 {padding-left: 22px;} -.p-l-23 {padding-left: 23px;} -.p-l-24 {padding-left: 24px;} -.p-l-25 {padding-left: 25px;} -.p-l-26 {padding-left: 26px;} -.p-l-27 {padding-left: 27px;} -.p-l-28 {padding-left: 28px;} -.p-l-29 {padding-left: 29px;} -.p-l-30 {padding-left: 30px;} -.p-l-31 {padding-left: 31px;} -.p-l-32 {padding-left: 32px;} -.p-l-33 {padding-left: 33px;} -.p-l-34 {padding-left: 34px;} -.p-l-35 {padding-left: 35px;} -.p-l-36 {padding-left: 36px;} -.p-l-37 {padding-left: 37px;} -.p-l-38 {padding-left: 38px;} -.p-l-39 {padding-left: 39px;} -.p-l-40 {padding-left: 40px;} -.p-l-41 {padding-left: 41px;} -.p-l-42 {padding-left: 42px;} -.p-l-43 {padding-left: 43px;} -.p-l-44 {padding-left: 44px;} -.p-l-45 {padding-left: 45px;} -.p-l-46 {padding-left: 46px;} -.p-l-47 {padding-left: 47px;} -.p-l-48 {padding-left: 48px;} -.p-l-49 {padding-left: 49px;} -.p-l-50 {padding-left: 50px;} -.p-l-51 {padding-left: 51px;} -.p-l-52 {padding-left: 52px;} -.p-l-53 {padding-left: 53px;} -.p-l-54 {padding-left: 54px;} -.p-l-55 {padding-left: 55px;} -.p-l-56 {padding-left: 56px;} -.p-l-57 {padding-left: 57px;} -.p-l-58 {padding-left: 58px;} -.p-l-59 {padding-left: 59px;} -.p-l-60 {padding-left: 60px;} -.p-l-61 {padding-left: 61px;} -.p-l-62 {padding-left: 62px;} -.p-l-63 {padding-left: 63px;} -.p-l-64 {padding-left: 64px;} -.p-l-65 {padding-left: 65px;} -.p-l-66 {padding-left: 66px;} -.p-l-67 {padding-left: 67px;} -.p-l-68 {padding-left: 68px;} -.p-l-69 {padding-left: 69px;} -.p-l-70 {padding-left: 70px;} -.p-l-71 {padding-left: 71px;} -.p-l-72 {padding-left: 72px;} -.p-l-73 {padding-left: 73px;} -.p-l-74 {padding-left: 74px;} -.p-l-75 {padding-left: 75px;} -.p-l-76 {padding-left: 76px;} -.p-l-77 {padding-left: 77px;} -.p-l-78 {padding-left: 78px;} -.p-l-79 {padding-left: 79px;} -.p-l-80 {padding-left: 80px;} -.p-l-81 {padding-left: 81px;} -.p-l-82 {padding-left: 82px;} -.p-l-83 {padding-left: 83px;} -.p-l-84 {padding-left: 84px;} -.p-l-85 {padding-left: 85px;} -.p-l-86 {padding-left: 86px;} -.p-l-87 {padding-left: 87px;} -.p-l-88 {padding-left: 88px;} -.p-l-89 {padding-left: 89px;} -.p-l-90 {padding-left: 90px;} -.p-l-91 {padding-left: 91px;} -.p-l-92 {padding-left: 92px;} -.p-l-93 {padding-left: 93px;} -.p-l-94 {padding-left: 94px;} -.p-l-95 {padding-left: 95px;} -.p-l-96 {padding-left: 96px;} -.p-l-97 {padding-left: 97px;} -.p-l-98 {padding-left: 98px;} -.p-l-99 {padding-left: 99px;} -.p-l-100 {padding-left: 100px;} -.p-l-101 {padding-left: 101px;} -.p-l-102 {padding-left: 102px;} -.p-l-103 {padding-left: 103px;} -.p-l-104 {padding-left: 104px;} -.p-l-105 {padding-left: 105px;} -.p-l-106 {padding-left: 106px;} -.p-l-107 {padding-left: 107px;} -.p-l-108 {padding-left: 108px;} -.p-l-109 {padding-left: 109px;} -.p-l-110 {padding-left: 110px;} -.p-l-111 {padding-left: 111px;} -.p-l-112 {padding-left: 112px;} -.p-l-113 {padding-left: 113px;} -.p-l-114 {padding-left: 114px;} -.p-l-115 {padding-left: 115px;} -.p-l-116 {padding-left: 116px;} -.p-l-117 {padding-left: 117px;} -.p-l-118 {padding-left: 118px;} -.p-l-119 {padding-left: 119px;} -.p-l-120 {padding-left: 120px;} -.p-l-121 {padding-left: 121px;} -.p-l-122 {padding-left: 122px;} -.p-l-123 {padding-left: 123px;} -.p-l-124 {padding-left: 124px;} -.p-l-125 {padding-left: 125px;} -.p-l-126 {padding-left: 126px;} -.p-l-127 {padding-left: 127px;} -.p-l-128 {padding-left: 128px;} -.p-l-129 {padding-left: 129px;} -.p-l-130 {padding-left: 130px;} -.p-l-131 {padding-left: 131px;} -.p-l-132 {padding-left: 132px;} -.p-l-133 {padding-left: 133px;} -.p-l-134 {padding-left: 134px;} -.p-l-135 {padding-left: 135px;} -.p-l-136 {padding-left: 136px;} -.p-l-137 {padding-left: 137px;} -.p-l-138 {padding-left: 138px;} -.p-l-139 {padding-left: 139px;} -.p-l-140 {padding-left: 140px;} -.p-l-141 {padding-left: 141px;} -.p-l-142 {padding-left: 142px;} -.p-l-143 {padding-left: 143px;} -.p-l-144 {padding-left: 144px;} -.p-l-145 {padding-left: 145px;} -.p-l-146 {padding-left: 146px;} -.p-l-147 {padding-left: 147px;} -.p-l-148 {padding-left: 148px;} -.p-l-149 {padding-left: 149px;} -.p-l-150 {padding-left: 150px;} -.p-l-151 {padding-left: 151px;} -.p-l-152 {padding-left: 152px;} -.p-l-153 {padding-left: 153px;} -.p-l-154 {padding-left: 154px;} -.p-l-155 {padding-left: 155px;} -.p-l-156 {padding-left: 156px;} -.p-l-157 {padding-left: 157px;} -.p-l-158 {padding-left: 158px;} -.p-l-159 {padding-left: 159px;} -.p-l-160 {padding-left: 160px;} -.p-l-161 {padding-left: 161px;} -.p-l-162 {padding-left: 162px;} -.p-l-163 {padding-left: 163px;} -.p-l-164 {padding-left: 164px;} -.p-l-165 {padding-left: 165px;} -.p-l-166 {padding-left: 166px;} -.p-l-167 {padding-left: 167px;} -.p-l-168 {padding-left: 168px;} -.p-l-169 {padding-left: 169px;} -.p-l-170 {padding-left: 170px;} -.p-l-171 {padding-left: 171px;} -.p-l-172 {padding-left: 172px;} -.p-l-173 {padding-left: 173px;} -.p-l-174 {padding-left: 174px;} -.p-l-175 {padding-left: 175px;} -.p-l-176 {padding-left: 176px;} -.p-l-177 {padding-left: 177px;} -.p-l-178 {padding-left: 178px;} -.p-l-179 {padding-left: 179px;} -.p-l-180 {padding-left: 180px;} -.p-l-181 {padding-left: 181px;} -.p-l-182 {padding-left: 182px;} -.p-l-183 {padding-left: 183px;} -.p-l-184 {padding-left: 184px;} -.p-l-185 {padding-left: 185px;} -.p-l-186 {padding-left: 186px;} -.p-l-187 {padding-left: 187px;} -.p-l-188 {padding-left: 188px;} -.p-l-189 {padding-left: 189px;} -.p-l-190 {padding-left: 190px;} -.p-l-191 {padding-left: 191px;} -.p-l-192 {padding-left: 192px;} -.p-l-193 {padding-left: 193px;} -.p-l-194 {padding-left: 194px;} -.p-l-195 {padding-left: 195px;} -.p-l-196 {padding-left: 196px;} -.p-l-197 {padding-left: 197px;} -.p-l-198 {padding-left: 198px;} -.p-l-199 {padding-left: 199px;} -.p-l-200 {padding-left: 200px;} -.p-l-201 {padding-left: 201px;} -.p-l-202 {padding-left: 202px;} -.p-l-203 {padding-left: 203px;} -.p-l-204 {padding-left: 204px;} -.p-l-205 {padding-left: 205px;} -.p-l-206 {padding-left: 206px;} -.p-l-207 {padding-left: 207px;} -.p-l-208 {padding-left: 208px;} -.p-l-209 {padding-left: 209px;} -.p-l-210 {padding-left: 210px;} -.p-l-211 {padding-left: 211px;} -.p-l-212 {padding-left: 212px;} -.p-l-213 {padding-left: 213px;} -.p-l-214 {padding-left: 214px;} -.p-l-215 {padding-left: 215px;} -.p-l-216 {padding-left: 216px;} -.p-l-217 {padding-left: 217px;} -.p-l-218 {padding-left: 218px;} -.p-l-219 {padding-left: 219px;} -.p-l-220 {padding-left: 220px;} -.p-l-221 {padding-left: 221px;} -.p-l-222 {padding-left: 222px;} -.p-l-223 {padding-left: 223px;} -.p-l-224 {padding-left: 224px;} -.p-l-225 {padding-left: 225px;} -.p-l-226 {padding-left: 226px;} -.p-l-227 {padding-left: 227px;} -.p-l-228 {padding-left: 228px;} -.p-l-229 {padding-left: 229px;} -.p-l-230 {padding-left: 230px;} -.p-l-231 {padding-left: 231px;} -.p-l-232 {padding-left: 232px;} -.p-l-233 {padding-left: 233px;} -.p-l-234 {padding-left: 234px;} -.p-l-235 {padding-left: 235px;} -.p-l-236 {padding-left: 236px;} -.p-l-237 {padding-left: 237px;} -.p-l-238 {padding-left: 238px;} -.p-l-239 {padding-left: 239px;} -.p-l-240 {padding-left: 240px;} -.p-l-241 {padding-left: 241px;} -.p-l-242 {padding-left: 242px;} -.p-l-243 {padding-left: 243px;} -.p-l-244 {padding-left: 244px;} -.p-l-245 {padding-left: 245px;} -.p-l-246 {padding-left: 246px;} -.p-l-247 {padding-left: 247px;} -.p-l-248 {padding-left: 248px;} -.p-l-249 {padding-left: 249px;} -.p-l-250 {padding-left: 250px;} -.p-r-0 {padding-right: 0px;} -.p-r-1 {padding-right: 1px;} -.p-r-2 {padding-right: 2px;} -.p-r-3 {padding-right: 3px;} -.p-r-4 {padding-right: 4px;} -.p-r-5 {padding-right: 5px;} -.p-r-6 {padding-right: 6px;} -.p-r-7 {padding-right: 7px;} -.p-r-8 {padding-right: 8px;} -.p-r-9 {padding-right: 9px;} -.p-r-10 {padding-right: 10px;} -.p-r-11 {padding-right: 11px;} -.p-r-12 {padding-right: 12px;} -.p-r-13 {padding-right: 13px;} -.p-r-14 {padding-right: 14px;} -.p-r-15 {padding-right: 15px;} -.p-r-16 {padding-right: 16px;} -.p-r-17 {padding-right: 17px;} -.p-r-18 {padding-right: 18px;} -.p-r-19 {padding-right: 19px;} -.p-r-20 {padding-right: 20px;} -.p-r-21 {padding-right: 21px;} -.p-r-22 {padding-right: 22px;} -.p-r-23 {padding-right: 23px;} -.p-r-24 {padding-right: 24px;} -.p-r-25 {padding-right: 25px;} -.p-r-26 {padding-right: 26px;} -.p-r-27 {padding-right: 27px;} -.p-r-28 {padding-right: 28px;} -.p-r-29 {padding-right: 29px;} -.p-r-30 {padding-right: 30px;} -.p-r-31 {padding-right: 31px;} -.p-r-32 {padding-right: 32px;} -.p-r-33 {padding-right: 33px;} -.p-r-34 {padding-right: 34px;} -.p-r-35 {padding-right: 35px;} -.p-r-36 {padding-right: 36px;} -.p-r-37 {padding-right: 37px;} -.p-r-38 {padding-right: 38px;} -.p-r-39 {padding-right: 39px;} -.p-r-40 {padding-right: 40px;} -.p-r-41 {padding-right: 41px;} -.p-r-42 {padding-right: 42px;} -.p-r-43 {padding-right: 43px;} -.p-r-44 {padding-right: 44px;} -.p-r-45 {padding-right: 45px;} -.p-r-46 {padding-right: 46px;} -.p-r-47 {padding-right: 47px;} -.p-r-48 {padding-right: 48px;} -.p-r-49 {padding-right: 49px;} -.p-r-50 {padding-right: 50px;} -.p-r-51 {padding-right: 51px;} -.p-r-52 {padding-right: 52px;} -.p-r-53 {padding-right: 53px;} -.p-r-54 {padding-right: 54px;} -.p-r-55 {padding-right: 55px;} -.p-r-56 {padding-right: 56px;} -.p-r-57 {padding-right: 57px;} -.p-r-58 {padding-right: 58px;} -.p-r-59 {padding-right: 59px;} -.p-r-60 {padding-right: 60px;} -.p-r-61 {padding-right: 61px;} -.p-r-62 {padding-right: 62px;} -.p-r-63 {padding-right: 63px;} -.p-r-64 {padding-right: 64px;} -.p-r-65 {padding-right: 65px;} -.p-r-66 {padding-right: 66px;} -.p-r-67 {padding-right: 67px;} -.p-r-68 {padding-right: 68px;} -.p-r-69 {padding-right: 69px;} -.p-r-70 {padding-right: 70px;} -.p-r-71 {padding-right: 71px;} -.p-r-72 {padding-right: 72px;} -.p-r-73 {padding-right: 73px;} -.p-r-74 {padding-right: 74px;} -.p-r-75 {padding-right: 75px;} -.p-r-76 {padding-right: 76px;} -.p-r-77 {padding-right: 77px;} -.p-r-78 {padding-right: 78px;} -.p-r-79 {padding-right: 79px;} -.p-r-80 {padding-right: 80px;} -.p-r-81 {padding-right: 81px;} -.p-r-82 {padding-right: 82px;} -.p-r-83 {padding-right: 83px;} -.p-r-84 {padding-right: 84px;} -.p-r-85 {padding-right: 85px;} -.p-r-86 {padding-right: 86px;} -.p-r-87 {padding-right: 87px;} -.p-r-88 {padding-right: 88px;} -.p-r-89 {padding-right: 89px;} -.p-r-90 {padding-right: 90px;} -.p-r-91 {padding-right: 91px;} -.p-r-92 {padding-right: 92px;} -.p-r-93 {padding-right: 93px;} -.p-r-94 {padding-right: 94px;} -.p-r-95 {padding-right: 95px;} -.p-r-96 {padding-right: 96px;} -.p-r-97 {padding-right: 97px;} -.p-r-98 {padding-right: 98px;} -.p-r-99 {padding-right: 99px;} -.p-r-100 {padding-right: 100px;} -.p-r-101 {padding-right: 101px;} -.p-r-102 {padding-right: 102px;} -.p-r-103 {padding-right: 103px;} -.p-r-104 {padding-right: 104px;} -.p-r-105 {padding-right: 105px;} -.p-r-106 {padding-right: 106px;} -.p-r-107 {padding-right: 107px;} -.p-r-108 {padding-right: 108px;} -.p-r-109 {padding-right: 109px;} -.p-r-110 {padding-right: 110px;} -.p-r-111 {padding-right: 111px;} -.p-r-112 {padding-right: 112px;} -.p-r-113 {padding-right: 113px;} -.p-r-114 {padding-right: 114px;} -.p-r-115 {padding-right: 115px;} -.p-r-116 {padding-right: 116px;} -.p-r-117 {padding-right: 117px;} -.p-r-118 {padding-right: 118px;} -.p-r-119 {padding-right: 119px;} -.p-r-120 {padding-right: 120px;} -.p-r-121 {padding-right: 121px;} -.p-r-122 {padding-right: 122px;} -.p-r-123 {padding-right: 123px;} -.p-r-124 {padding-right: 124px;} -.p-r-125 {padding-right: 125px;} -.p-r-126 {padding-right: 126px;} -.p-r-127 {padding-right: 127px;} -.p-r-128 {padding-right: 128px;} -.p-r-129 {padding-right: 129px;} -.p-r-130 {padding-right: 130px;} -.p-r-131 {padding-right: 131px;} -.p-r-132 {padding-right: 132px;} -.p-r-133 {padding-right: 133px;} -.p-r-134 {padding-right: 134px;} -.p-r-135 {padding-right: 135px;} -.p-r-136 {padding-right: 136px;} -.p-r-137 {padding-right: 137px;} -.p-r-138 {padding-right: 138px;} -.p-r-139 {padding-right: 139px;} -.p-r-140 {padding-right: 140px;} -.p-r-141 {padding-right: 141px;} -.p-r-142 {padding-right: 142px;} -.p-r-143 {padding-right: 143px;} -.p-r-144 {padding-right: 144px;} -.p-r-145 {padding-right: 145px;} -.p-r-146 {padding-right: 146px;} -.p-r-147 {padding-right: 147px;} -.p-r-148 {padding-right: 148px;} -.p-r-149 {padding-right: 149px;} -.p-r-150 {padding-right: 150px;} -.p-r-151 {padding-right: 151px;} -.p-r-152 {padding-right: 152px;} -.p-r-153 {padding-right: 153px;} -.p-r-154 {padding-right: 154px;} -.p-r-155 {padding-right: 155px;} -.p-r-156 {padding-right: 156px;} -.p-r-157 {padding-right: 157px;} -.p-r-158 {padding-right: 158px;} -.p-r-159 {padding-right: 159px;} -.p-r-160 {padding-right: 160px;} -.p-r-161 {padding-right: 161px;} -.p-r-162 {padding-right: 162px;} -.p-r-163 {padding-right: 163px;} -.p-r-164 {padding-right: 164px;} -.p-r-165 {padding-right: 165px;} -.p-r-166 {padding-right: 166px;} -.p-r-167 {padding-right: 167px;} -.p-r-168 {padding-right: 168px;} -.p-r-169 {padding-right: 169px;} -.p-r-170 {padding-right: 170px;} -.p-r-171 {padding-right: 171px;} -.p-r-172 {padding-right: 172px;} -.p-r-173 {padding-right: 173px;} -.p-r-174 {padding-right: 174px;} -.p-r-175 {padding-right: 175px;} -.p-r-176 {padding-right: 176px;} -.p-r-177 {padding-right: 177px;} -.p-r-178 {padding-right: 178px;} -.p-r-179 {padding-right: 179px;} -.p-r-180 {padding-right: 180px;} -.p-r-181 {padding-right: 181px;} -.p-r-182 {padding-right: 182px;} -.p-r-183 {padding-right: 183px;} -.p-r-184 {padding-right: 184px;} -.p-r-185 {padding-right: 185px;} -.p-r-186 {padding-right: 186px;} -.p-r-187 {padding-right: 187px;} -.p-r-188 {padding-right: 188px;} -.p-r-189 {padding-right: 189px;} -.p-r-190 {padding-right: 190px;} -.p-r-191 {padding-right: 191px;} -.p-r-192 {padding-right: 192px;} -.p-r-193 {padding-right: 193px;} -.p-r-194 {padding-right: 194px;} -.p-r-195 {padding-right: 195px;} -.p-r-196 {padding-right: 196px;} -.p-r-197 {padding-right: 197px;} -.p-r-198 {padding-right: 198px;} -.p-r-199 {padding-right: 199px;} -.p-r-200 {padding-right: 200px;} -.p-r-201 {padding-right: 201px;} -.p-r-202 {padding-right: 202px;} -.p-r-203 {padding-right: 203px;} -.p-r-204 {padding-right: 204px;} -.p-r-205 {padding-right: 205px;} -.p-r-206 {padding-right: 206px;} -.p-r-207 {padding-right: 207px;} -.p-r-208 {padding-right: 208px;} -.p-r-209 {padding-right: 209px;} -.p-r-210 {padding-right: 210px;} -.p-r-211 {padding-right: 211px;} -.p-r-212 {padding-right: 212px;} -.p-r-213 {padding-right: 213px;} -.p-r-214 {padding-right: 214px;} -.p-r-215 {padding-right: 215px;} -.p-r-216 {padding-right: 216px;} -.p-r-217 {padding-right: 217px;} -.p-r-218 {padding-right: 218px;} -.p-r-219 {padding-right: 219px;} -.p-r-220 {padding-right: 220px;} -.p-r-221 {padding-right: 221px;} -.p-r-222 {padding-right: 222px;} -.p-r-223 {padding-right: 223px;} -.p-r-224 {padding-right: 224px;} -.p-r-225 {padding-right: 225px;} -.p-r-226 {padding-right: 226px;} -.p-r-227 {padding-right: 227px;} -.p-r-228 {padding-right: 228px;} -.p-r-229 {padding-right: 229px;} -.p-r-230 {padding-right: 230px;} -.p-r-231 {padding-right: 231px;} -.p-r-232 {padding-right: 232px;} -.p-r-233 {padding-right: 233px;} -.p-r-234 {padding-right: 234px;} -.p-r-235 {padding-right: 235px;} -.p-r-236 {padding-right: 236px;} -.p-r-237 {padding-right: 237px;} -.p-r-238 {padding-right: 238px;} -.p-r-239 {padding-right: 239px;} -.p-r-240 {padding-right: 240px;} -.p-r-241 {padding-right: 241px;} -.p-r-242 {padding-right: 242px;} -.p-r-243 {padding-right: 243px;} -.p-r-244 {padding-right: 244px;} -.p-r-245 {padding-right: 245px;} -.p-r-246 {padding-right: 246px;} -.p-r-247 {padding-right: 247px;} -.p-r-248 {padding-right: 248px;} -.p-r-249 {padding-right: 249px;} -.p-r-250 {padding-right: 250px;} - -/*[ MARGIN ] -/////////////////////////////////////////////////////////// -*/ -.m-t-0 {margin-top: 0px;} -.m-t-1 {margin-top: 1px;} -.m-t-2 {margin-top: 2px;} -.m-t-3 {margin-top: 3px;} -.m-t-4 {margin-top: 4px;} -.m-t-5 {margin-top: 5px;} -.m-t-6 {margin-top: 6px;} -.m-t-7 {margin-top: 7px;} -.m-t-8 {margin-top: 8px;} -.m-t-9 {margin-top: 9px;} -.m-t-10 {margin-top: 10px;} -.m-t-11 {margin-top: 11px;} -.m-t-12 {margin-top: 12px;} -.m-t-13 {margin-top: 13px;} -.m-t-14 {margin-top: 14px;} -.m-t-15 {margin-top: 15px;} -.m-t-16 {margin-top: 16px;} -.m-t-17 {margin-top: 17px;} -.m-t-18 {margin-top: 18px;} -.m-t-19 {margin-top: 19px;} -.m-t-20 {margin-top: 20px;} -.m-t-21 {margin-top: 21px;} -.m-t-22 {margin-top: 22px;} -.m-t-23 {margin-top: 23px;} -.m-t-24 {margin-top: 24px;} -.m-t-25 {margin-top: 25px;} -.m-t-26 {margin-top: 26px;} -.m-t-27 {margin-top: 27px;} -.m-t-28 {margin-top: 28px;} -.m-t-29 {margin-top: 29px;} -.m-t-30 {margin-top: 30px;} -.m-t-31 {margin-top: 31px;} -.m-t-32 {margin-top: 32px;} -.m-t-33 {margin-top: 33px;} -.m-t-34 {margin-top: 34px;} -.m-t-35 {margin-top: 35px;} -.m-t-36 {margin-top: 36px;} -.m-t-37 {margin-top: 37px;} -.m-t-38 {margin-top: 38px;} -.m-t-39 {margin-top: 39px;} -.m-t-40 {margin-top: 40px;} -.m-t-41 {margin-top: 41px;} -.m-t-42 {margin-top: 42px;} -.m-t-43 {margin-top: 43px;} -.m-t-44 {margin-top: 44px;} -.m-t-45 {margin-top: 45px;} -.m-t-46 {margin-top: 46px;} -.m-t-47 {margin-top: 47px;} -.m-t-48 {margin-top: 48px;} -.m-t-49 {margin-top: 49px;} -.m-t-50 {margin-top: 50px;} -.m-t-51 {margin-top: 51px;} -.m-t-52 {margin-top: 52px;} -.m-t-53 {margin-top: 53px;} -.m-t-54 {margin-top: 54px;} -.m-t-55 {margin-top: 55px;} -.m-t-56 {margin-top: 56px;} -.m-t-57 {margin-top: 57px;} -.m-t-58 {margin-top: 58px;} -.m-t-59 {margin-top: 59px;} -.m-t-60 {margin-top: 60px;} -.m-t-61 {margin-top: 61px;} -.m-t-62 {margin-top: 62px;} -.m-t-63 {margin-top: 63px;} -.m-t-64 {margin-top: 64px;} -.m-t-65 {margin-top: 65px;} -.m-t-66 {margin-top: 66px;} -.m-t-67 {margin-top: 67px;} -.m-t-68 {margin-top: 68px;} -.m-t-69 {margin-top: 69px;} -.m-t-70 {margin-top: 70px;} -.m-t-71 {margin-top: 71px;} -.m-t-72 {margin-top: 72px;} -.m-t-73 {margin-top: 73px;} -.m-t-74 {margin-top: 74px;} -.m-t-75 {margin-top: 75px;} -.m-t-76 {margin-top: 76px;} -.m-t-77 {margin-top: 77px;} -.m-t-78 {margin-top: 78px;} -.m-t-79 {margin-top: 79px;} -.m-t-80 {margin-top: 80px;} -.m-t-81 {margin-top: 81px;} -.m-t-82 {margin-top: 82px;} -.m-t-83 {margin-top: 83px;} -.m-t-84 {margin-top: 84px;} -.m-t-85 {margin-top: 85px;} -.m-t-86 {margin-top: 86px;} -.m-t-87 {margin-top: 87px;} -.m-t-88 {margin-top: 88px;} -.m-t-89 {margin-top: 89px;} -.m-t-90 {margin-top: 90px;} -.m-t-91 {margin-top: 91px;} -.m-t-92 {margin-top: 92px;} -.m-t-93 {margin-top: 93px;} -.m-t-94 {margin-top: 94px;} -.m-t-95 {margin-top: 95px;} -.m-t-96 {margin-top: 96px;} -.m-t-97 {margin-top: 97px;} -.m-t-98 {margin-top: 98px;} -.m-t-99 {margin-top: 99px;} -.m-t-100 {margin-top: 100px;} -.m-t-101 {margin-top: 101px;} -.m-t-102 {margin-top: 102px;} -.m-t-103 {margin-top: 103px;} -.m-t-104 {margin-top: 104px;} -.m-t-105 {margin-top: 105px;} -.m-t-106 {margin-top: 106px;} -.m-t-107 {margin-top: 107px;} -.m-t-108 {margin-top: 108px;} -.m-t-109 {margin-top: 109px;} -.m-t-110 {margin-top: 110px;} -.m-t-111 {margin-top: 111px;} -.m-t-112 {margin-top: 112px;} -.m-t-113 {margin-top: 113px;} -.m-t-114 {margin-top: 114px;} -.m-t-115 {margin-top: 115px;} -.m-t-116 {margin-top: 116px;} -.m-t-117 {margin-top: 117px;} -.m-t-118 {margin-top: 118px;} -.m-t-119 {margin-top: 119px;} -.m-t-120 {margin-top: 120px;} -.m-t-121 {margin-top: 121px;} -.m-t-122 {margin-top: 122px;} -.m-t-123 {margin-top: 123px;} -.m-t-124 {margin-top: 124px;} -.m-t-125 {margin-top: 125px;} -.m-t-126 {margin-top: 126px;} -.m-t-127 {margin-top: 127px;} -.m-t-128 {margin-top: 128px;} -.m-t-129 {margin-top: 129px;} -.m-t-130 {margin-top: 130px;} -.m-t-131 {margin-top: 131px;} -.m-t-132 {margin-top: 132px;} -.m-t-133 {margin-top: 133px;} -.m-t-134 {margin-top: 134px;} -.m-t-135 {margin-top: 135px;} -.m-t-136 {margin-top: 136px;} -.m-t-137 {margin-top: 137px;} -.m-t-138 {margin-top: 138px;} -.m-t-139 {margin-top: 139px;} -.m-t-140 {margin-top: 140px;} -.m-t-141 {margin-top: 141px;} -.m-t-142 {margin-top: 142px;} -.m-t-143 {margin-top: 143px;} -.m-t-144 {margin-top: 144px;} -.m-t-145 {margin-top: 145px;} -.m-t-146 {margin-top: 146px;} -.m-t-147 {margin-top: 147px;} -.m-t-148 {margin-top: 148px;} -.m-t-149 {margin-top: 149px;} -.m-t-150 {margin-top: 150px;} -.m-t-151 {margin-top: 151px;} -.m-t-152 {margin-top: 152px;} -.m-t-153 {margin-top: 153px;} -.m-t-154 {margin-top: 154px;} -.m-t-155 {margin-top: 155px;} -.m-t-156 {margin-top: 156px;} -.m-t-157 {margin-top: 157px;} -.m-t-158 {margin-top: 158px;} -.m-t-159 {margin-top: 159px;} -.m-t-160 {margin-top: 160px;} -.m-t-161 {margin-top: 161px;} -.m-t-162 {margin-top: 162px;} -.m-t-163 {margin-top: 163px;} -.m-t-164 {margin-top: 164px;} -.m-t-165 {margin-top: 165px;} -.m-t-166 {margin-top: 166px;} -.m-t-167 {margin-top: 167px;} -.m-t-168 {margin-top: 168px;} -.m-t-169 {margin-top: 169px;} -.m-t-170 {margin-top: 170px;} -.m-t-171 {margin-top: 171px;} -.m-t-172 {margin-top: 172px;} -.m-t-173 {margin-top: 173px;} -.m-t-174 {margin-top: 174px;} -.m-t-175 {margin-top: 175px;} -.m-t-176 {margin-top: 176px;} -.m-t-177 {margin-top: 177px;} -.m-t-178 {margin-top: 178px;} -.m-t-179 {margin-top: 179px;} -.m-t-180 {margin-top: 180px;} -.m-t-181 {margin-top: 181px;} -.m-t-182 {margin-top: 182px;} -.m-t-183 {margin-top: 183px;} -.m-t-184 {margin-top: 184px;} -.m-t-185 {margin-top: 185px;} -.m-t-186 {margin-top: 186px;} -.m-t-187 {margin-top: 187px;} -.m-t-188 {margin-top: 188px;} -.m-t-189 {margin-top: 189px;} -.m-t-190 {margin-top: 190px;} -.m-t-191 {margin-top: 191px;} -.m-t-192 {margin-top: 192px;} -.m-t-193 {margin-top: 193px;} -.m-t-194 {margin-top: 194px;} -.m-t-195 {margin-top: 195px;} -.m-t-196 {margin-top: 196px;} -.m-t-197 {margin-top: 197px;} -.m-t-198 {margin-top: 198px;} -.m-t-199 {margin-top: 199px;} -.m-t-200 {margin-top: 200px;} -.m-t-201 {margin-top: 201px;} -.m-t-202 {margin-top: 202px;} -.m-t-203 {margin-top: 203px;} -.m-t-204 {margin-top: 204px;} -.m-t-205 {margin-top: 205px;} -.m-t-206 {margin-top: 206px;} -.m-t-207 {margin-top: 207px;} -.m-t-208 {margin-top: 208px;} -.m-t-209 {margin-top: 209px;} -.m-t-210 {margin-top: 210px;} -.m-t-211 {margin-top: 211px;} -.m-t-212 {margin-top: 212px;} -.m-t-213 {margin-top: 213px;} -.m-t-214 {margin-top: 214px;} -.m-t-215 {margin-top: 215px;} -.m-t-216 {margin-top: 216px;} -.m-t-217 {margin-top: 217px;} -.m-t-218 {margin-top: 218px;} -.m-t-219 {margin-top: 219px;} -.m-t-220 {margin-top: 220px;} -.m-t-221 {margin-top: 221px;} -.m-t-222 {margin-top: 222px;} -.m-t-223 {margin-top: 223px;} -.m-t-224 {margin-top: 224px;} -.m-t-225 {margin-top: 225px;} -.m-t-226 {margin-top: 226px;} -.m-t-227 {margin-top: 227px;} -.m-t-228 {margin-top: 228px;} -.m-t-229 {margin-top: 229px;} -.m-t-230 {margin-top: 230px;} -.m-t-231 {margin-top: 231px;} -.m-t-232 {margin-top: 232px;} -.m-t-233 {margin-top: 233px;} -.m-t-234 {margin-top: 234px;} -.m-t-235 {margin-top: 235px;} -.m-t-236 {margin-top: 236px;} -.m-t-237 {margin-top: 237px;} -.m-t-238 {margin-top: 238px;} -.m-t-239 {margin-top: 239px;} -.m-t-240 {margin-top: 240px;} -.m-t-241 {margin-top: 241px;} -.m-t-242 {margin-top: 242px;} -.m-t-243 {margin-top: 243px;} -.m-t-244 {margin-top: 244px;} -.m-t-245 {margin-top: 245px;} -.m-t-246 {margin-top: 246px;} -.m-t-247 {margin-top: 247px;} -.m-t-248 {margin-top: 248px;} -.m-t-249 {margin-top: 249px;} -.m-t-250 {margin-top: 250px;} -.m-b-0 {margin-bottom: 0px;} -.m-b-1 {margin-bottom: 1px;} -.m-b-2 {margin-bottom: 2px;} -.m-b-3 {margin-bottom: 3px;} -.m-b-4 {margin-bottom: 4px;} -.m-b-5 {margin-bottom: 5px;} -.m-b-6 {margin-bottom: 6px;} -.m-b-7 {margin-bottom: 7px;} -.m-b-8 {margin-bottom: 8px;} -.m-b-9 {margin-bottom: 9px;} -.m-b-10 {margin-bottom: 10px;} -.m-b-11 {margin-bottom: 11px;} -.m-b-12 {margin-bottom: 12px;} -.m-b-13 {margin-bottom: 13px;} -.m-b-14 {margin-bottom: 14px;} -.m-b-15 {margin-bottom: 15px;} -.m-b-16 {margin-bottom: 16px;} -.m-b-17 {margin-bottom: 17px;} -.m-b-18 {margin-bottom: 18px;} -.m-b-19 {margin-bottom: 19px;} -.m-b-20 {margin-bottom: 20px;} -.m-b-21 {margin-bottom: 21px;} -.m-b-22 {margin-bottom: 22px;} -.m-b-23 {margin-bottom: 23px;} -.m-b-24 {margin-bottom: 24px;} -.m-b-25 {margin-bottom: 25px;} -.m-b-26 {margin-bottom: 26px;} -.m-b-27 {margin-bottom: 27px;} -.m-b-28 {margin-bottom: 28px;} -.m-b-29 {margin-bottom: 29px;} -.m-b-30 {margin-bottom: 30px;} -.m-b-31 {margin-bottom: 31px;} -.m-b-32 {margin-bottom: 32px;} -.m-b-33 {margin-bottom: 33px;} -.m-b-34 {margin-bottom: 34px;} -.m-b-35 {margin-bottom: 35px;} -.m-b-36 {margin-bottom: 36px;} -.m-b-37 {margin-bottom: 37px;} -.m-b-38 {margin-bottom: 38px;} -.m-b-39 {margin-bottom: 39px;} -.m-b-40 {margin-bottom: 40px;} -.m-b-41 {margin-bottom: 41px;} -.m-b-42 {margin-bottom: 42px;} -.m-b-43 {margin-bottom: 43px;} -.m-b-44 {margin-bottom: 44px;} -.m-b-45 {margin-bottom: 45px;} -.m-b-46 {margin-bottom: 46px;} -.m-b-47 {margin-bottom: 47px;} -.m-b-48 {margin-bottom: 48px;} -.m-b-49 {margin-bottom: 49px;} -.m-b-50 {margin-bottom: 50px;} -.m-b-51 {margin-bottom: 51px;} -.m-b-52 {margin-bottom: 52px;} -.m-b-53 {margin-bottom: 53px;} -.m-b-54 {margin-bottom: 54px;} -.m-b-55 {margin-bottom: 55px;} -.m-b-56 {margin-bottom: 56px;} -.m-b-57 {margin-bottom: 57px;} -.m-b-58 {margin-bottom: 58px;} -.m-b-59 {margin-bottom: 59px;} -.m-b-60 {margin-bottom: 60px;} -.m-b-61 {margin-bottom: 61px;} -.m-b-62 {margin-bottom: 62px;} -.m-b-63 {margin-bottom: 63px;} -.m-b-64 {margin-bottom: 64px;} -.m-b-65 {margin-bottom: 65px;} -.m-b-66 {margin-bottom: 66px;} -.m-b-67 {margin-bottom: 67px;} -.m-b-68 {margin-bottom: 68px;} -.m-b-69 {margin-bottom: 69px;} -.m-b-70 {margin-bottom: 70px;} -.m-b-71 {margin-bottom: 71px;} -.m-b-72 {margin-bottom: 72px;} -.m-b-73 {margin-bottom: 73px;} -.m-b-74 {margin-bottom: 74px;} -.m-b-75 {margin-bottom: 75px;} -.m-b-76 {margin-bottom: 76px;} -.m-b-77 {margin-bottom: 77px;} -.m-b-78 {margin-bottom: 78px;} -.m-b-79 {margin-bottom: 79px;} -.m-b-80 {margin-bottom: 80px;} -.m-b-81 {margin-bottom: 81px;} -.m-b-82 {margin-bottom: 82px;} -.m-b-83 {margin-bottom: 83px;} -.m-b-84 {margin-bottom: 84px;} -.m-b-85 {margin-bottom: 85px;} -.m-b-86 {margin-bottom: 86px;} -.m-b-87 {margin-bottom: 87px;} -.m-b-88 {margin-bottom: 88px;} -.m-b-89 {margin-bottom: 89px;} -.m-b-90 {margin-bottom: 90px;} -.m-b-91 {margin-bottom: 91px;} -.m-b-92 {margin-bottom: 92px;} -.m-b-93 {margin-bottom: 93px;} -.m-b-94 {margin-bottom: 94px;} -.m-b-95 {margin-bottom: 95px;} -.m-b-96 {margin-bottom: 96px;} -.m-b-97 {margin-bottom: 97px;} -.m-b-98 {margin-bottom: 98px;} -.m-b-99 {margin-bottom: 99px;} -.m-b-100 {margin-bottom: 100px;} -.m-b-101 {margin-bottom: 101px;} -.m-b-102 {margin-bottom: 102px;} -.m-b-103 {margin-bottom: 103px;} -.m-b-104 {margin-bottom: 104px;} -.m-b-105 {margin-bottom: 105px;} -.m-b-106 {margin-bottom: 106px;} -.m-b-107 {margin-bottom: 107px;} -.m-b-108 {margin-bottom: 108px;} -.m-b-109 {margin-bottom: 109px;} -.m-b-110 {margin-bottom: 110px;} -.m-b-111 {margin-bottom: 111px;} -.m-b-112 {margin-bottom: 112px;} -.m-b-113 {margin-bottom: 113px;} -.m-b-114 {margin-bottom: 114px;} -.m-b-115 {margin-bottom: 115px;} -.m-b-116 {margin-bottom: 116px;} -.m-b-117 {margin-bottom: 117px;} -.m-b-118 {margin-bottom: 118px;} -.m-b-119 {margin-bottom: 119px;} -.m-b-120 {margin-bottom: 120px;} -.m-b-121 {margin-bottom: 121px;} -.m-b-122 {margin-bottom: 122px;} -.m-b-123 {margin-bottom: 123px;} -.m-b-124 {margin-bottom: 124px;} -.m-b-125 {margin-bottom: 125px;} -.m-b-126 {margin-bottom: 126px;} -.m-b-127 {margin-bottom: 127px;} -.m-b-128 {margin-bottom: 128px;} -.m-b-129 {margin-bottom: 129px;} -.m-b-130 {margin-bottom: 130px;} -.m-b-131 {margin-bottom: 131px;} -.m-b-132 {margin-bottom: 132px;} -.m-b-133 {margin-bottom: 133px;} -.m-b-134 {margin-bottom: 134px;} -.m-b-135 {margin-bottom: 135px;} -.m-b-136 {margin-bottom: 136px;} -.m-b-137 {margin-bottom: 137px;} -.m-b-138 {margin-bottom: 138px;} -.m-b-139 {margin-bottom: 139px;} -.m-b-140 {margin-bottom: 140px;} -.m-b-141 {margin-bottom: 141px;} -.m-b-142 {margin-bottom: 142px;} -.m-b-143 {margin-bottom: 143px;} -.m-b-144 {margin-bottom: 144px;} -.m-b-145 {margin-bottom: 145px;} -.m-b-146 {margin-bottom: 146px;} -.m-b-147 {margin-bottom: 147px;} -.m-b-148 {margin-bottom: 148px;} -.m-b-149 {margin-bottom: 149px;} -.m-b-150 {margin-bottom: 150px;} -.m-b-151 {margin-bottom: 151px;} -.m-b-152 {margin-bottom: 152px;} -.m-b-153 {margin-bottom: 153px;} -.m-b-154 {margin-bottom: 154px;} -.m-b-155 {margin-bottom: 155px;} -.m-b-156 {margin-bottom: 156px;} -.m-b-157 {margin-bottom: 157px;} -.m-b-158 {margin-bottom: 158px;} -.m-b-159 {margin-bottom: 159px;} -.m-b-160 {margin-bottom: 160px;} -.m-b-161 {margin-bottom: 161px;} -.m-b-162 {margin-bottom: 162px;} -.m-b-163 {margin-bottom: 163px;} -.m-b-164 {margin-bottom: 164px;} -.m-b-165 {margin-bottom: 165px;} -.m-b-166 {margin-bottom: 166px;} -.m-b-167 {margin-bottom: 167px;} -.m-b-168 {margin-bottom: 168px;} -.m-b-169 {margin-bottom: 169px;} -.m-b-170 {margin-bottom: 170px;} -.m-b-171 {margin-bottom: 171px;} -.m-b-172 {margin-bottom: 172px;} -.m-b-173 {margin-bottom: 173px;} -.m-b-174 {margin-bottom: 174px;} -.m-b-175 {margin-bottom: 175px;} -.m-b-176 {margin-bottom: 176px;} -.m-b-177 {margin-bottom: 177px;} -.m-b-178 {margin-bottom: 178px;} -.m-b-179 {margin-bottom: 179px;} -.m-b-180 {margin-bottom: 180px;} -.m-b-181 {margin-bottom: 181px;} -.m-b-182 {margin-bottom: 182px;} -.m-b-183 {margin-bottom: 183px;} -.m-b-184 {margin-bottom: 184px;} -.m-b-185 {margin-bottom: 185px;} -.m-b-186 {margin-bottom: 186px;} -.m-b-187 {margin-bottom: 187px;} -.m-b-188 {margin-bottom: 188px;} -.m-b-189 {margin-bottom: 189px;} -.m-b-190 {margin-bottom: 190px;} -.m-b-191 {margin-bottom: 191px;} -.m-b-192 {margin-bottom: 192px;} -.m-b-193 {margin-bottom: 193px;} -.m-b-194 {margin-bottom: 194px;} -.m-b-195 {margin-bottom: 195px;} -.m-b-196 {margin-bottom: 196px;} -.m-b-197 {margin-bottom: 197px;} -.m-b-198 {margin-bottom: 198px;} -.m-b-199 {margin-bottom: 199px;} -.m-b-200 {margin-bottom: 200px;} -.m-b-201 {margin-bottom: 201px;} -.m-b-202 {margin-bottom: 202px;} -.m-b-203 {margin-bottom: 203px;} -.m-b-204 {margin-bottom: 204px;} -.m-b-205 {margin-bottom: 205px;} -.m-b-206 {margin-bottom: 206px;} -.m-b-207 {margin-bottom: 207px;} -.m-b-208 {margin-bottom: 208px;} -.m-b-209 {margin-bottom: 209px;} -.m-b-210 {margin-bottom: 210px;} -.m-b-211 {margin-bottom: 211px;} -.m-b-212 {margin-bottom: 212px;} -.m-b-213 {margin-bottom: 213px;} -.m-b-214 {margin-bottom: 214px;} -.m-b-215 {margin-bottom: 215px;} -.m-b-216 {margin-bottom: 216px;} -.m-b-217 {margin-bottom: 217px;} -.m-b-218 {margin-bottom: 218px;} -.m-b-219 {margin-bottom: 219px;} -.m-b-220 {margin-bottom: 220px;} -.m-b-221 {margin-bottom: 221px;} -.m-b-222 {margin-bottom: 222px;} -.m-b-223 {margin-bottom: 223px;} -.m-b-224 {margin-bottom: 224px;} -.m-b-225 {margin-bottom: 225px;} -.m-b-226 {margin-bottom: 226px;} -.m-b-227 {margin-bottom: 227px;} -.m-b-228 {margin-bottom: 228px;} -.m-b-229 {margin-bottom: 229px;} -.m-b-230 {margin-bottom: 230px;} -.m-b-231 {margin-bottom: 231px;} -.m-b-232 {margin-bottom: 232px;} -.m-b-233 {margin-bottom: 233px;} -.m-b-234 {margin-bottom: 234px;} -.m-b-235 {margin-bottom: 235px;} -.m-b-236 {margin-bottom: 236px;} -.m-b-237 {margin-bottom: 237px;} -.m-b-238 {margin-bottom: 238px;} -.m-b-239 {margin-bottom: 239px;} -.m-b-240 {margin-bottom: 240px;} -.m-b-241 {margin-bottom: 241px;} -.m-b-242 {margin-bottom: 242px;} -.m-b-243 {margin-bottom: 243px;} -.m-b-244 {margin-bottom: 244px;} -.m-b-245 {margin-bottom: 245px;} -.m-b-246 {margin-bottom: 246px;} -.m-b-247 {margin-bottom: 247px;} -.m-b-248 {margin-bottom: 248px;} -.m-b-249 {margin-bottom: 249px;} -.m-b-250 {margin-bottom: 250px;} -.m-l-0 {margin-left: 0px;} -.m-l-1 {margin-left: 1px;} -.m-l-2 {margin-left: 2px;} -.m-l-3 {margin-left: 3px;} -.m-l-4 {margin-left: 4px;} -.m-l-5 {margin-left: 5px;} -.m-l-6 {margin-left: 6px;} -.m-l-7 {margin-left: 7px;} -.m-l-8 {margin-left: 8px;} -.m-l-9 {margin-left: 9px;} -.m-l-10 {margin-left: 10px;} -.m-l-11 {margin-left: 11px;} -.m-l-12 {margin-left: 12px;} -.m-l-13 {margin-left: 13px;} -.m-l-14 {margin-left: 14px;} -.m-l-15 {margin-left: 15px;} -.m-l-16 {margin-left: 16px;} -.m-l-17 {margin-left: 17px;} -.m-l-18 {margin-left: 18px;} -.m-l-19 {margin-left: 19px;} -.m-l-20 {margin-left: 20px;} -.m-l-21 {margin-left: 21px;} -.m-l-22 {margin-left: 22px;} -.m-l-23 {margin-left: 23px;} -.m-l-24 {margin-left: 24px;} -.m-l-25 {margin-left: 25px;} -.m-l-26 {margin-left: 26px;} -.m-l-27 {margin-left: 27px;} -.m-l-28 {margin-left: 28px;} -.m-l-29 {margin-left: 29px;} -.m-l-30 {margin-left: 30px;} -.m-l-31 {margin-left: 31px;} -.m-l-32 {margin-left: 32px;} -.m-l-33 {margin-left: 33px;} -.m-l-34 {margin-left: 34px;} -.m-l-35 {margin-left: 35px;} -.m-l-36 {margin-left: 36px;} -.m-l-37 {margin-left: 37px;} -.m-l-38 {margin-left: 38px;} -.m-l-39 {margin-left: 39px;} -.m-l-40 {margin-left: 40px;} -.m-l-41 {margin-left: 41px;} -.m-l-42 {margin-left: 42px;} -.m-l-43 {margin-left: 43px;} -.m-l-44 {margin-left: 44px;} -.m-l-45 {margin-left: 45px;} -.m-l-46 {margin-left: 46px;} -.m-l-47 {margin-left: 47px;} -.m-l-48 {margin-left: 48px;} -.m-l-49 {margin-left: 49px;} -.m-l-50 {margin-left: 50px;} -.m-l-51 {margin-left: 51px;} -.m-l-52 {margin-left: 52px;} -.m-l-53 {margin-left: 53px;} -.m-l-54 {margin-left: 54px;} -.m-l-55 {margin-left: 55px;} -.m-l-56 {margin-left: 56px;} -.m-l-57 {margin-left: 57px;} -.m-l-58 {margin-left: 58px;} -.m-l-59 {margin-left: 59px;} -.m-l-60 {margin-left: 60px;} -.m-l-61 {margin-left: 61px;} -.m-l-62 {margin-left: 62px;} -.m-l-63 {margin-left: 63px;} -.m-l-64 {margin-left: 64px;} -.m-l-65 {margin-left: 65px;} -.m-l-66 {margin-left: 66px;} -.m-l-67 {margin-left: 67px;} -.m-l-68 {margin-left: 68px;} -.m-l-69 {margin-left: 69px;} -.m-l-70 {margin-left: 70px;} -.m-l-71 {margin-left: 71px;} -.m-l-72 {margin-left: 72px;} -.m-l-73 {margin-left: 73px;} -.m-l-74 {margin-left: 74px;} -.m-l-75 {margin-left: 75px;} -.m-l-76 {margin-left: 76px;} -.m-l-77 {margin-left: 77px;} -.m-l-78 {margin-left: 78px;} -.m-l-79 {margin-left: 79px;} -.m-l-80 {margin-left: 80px;} -.m-l-81 {margin-left: 81px;} -.m-l-82 {margin-left: 82px;} -.m-l-83 {margin-left: 83px;} -.m-l-84 {margin-left: 84px;} -.m-l-85 {margin-left: 85px;} -.m-l-86 {margin-left: 86px;} -.m-l-87 {margin-left: 87px;} -.m-l-88 {margin-left: 88px;} -.m-l-89 {margin-left: 89px;} -.m-l-90 {margin-left: 90px;} -.m-l-91 {margin-left: 91px;} -.m-l-92 {margin-left: 92px;} -.m-l-93 {margin-left: 93px;} -.m-l-94 {margin-left: 94px;} -.m-l-95 {margin-left: 95px;} -.m-l-96 {margin-left: 96px;} -.m-l-97 {margin-left: 97px;} -.m-l-98 {margin-left: 98px;} -.m-l-99 {margin-left: 99px;} -.m-l-100 {margin-left: 100px;} -.m-l-101 {margin-left: 101px;} -.m-l-102 {margin-left: 102px;} -.m-l-103 {margin-left: 103px;} -.m-l-104 {margin-left: 104px;} -.m-l-105 {margin-left: 105px;} -.m-l-106 {margin-left: 106px;} -.m-l-107 {margin-left: 107px;} -.m-l-108 {margin-left: 108px;} -.m-l-109 {margin-left: 109px;} -.m-l-110 {margin-left: 110px;} -.m-l-111 {margin-left: 111px;} -.m-l-112 {margin-left: 112px;} -.m-l-113 {margin-left: 113px;} -.m-l-114 {margin-left: 114px;} -.m-l-115 {margin-left: 115px;} -.m-l-116 {margin-left: 116px;} -.m-l-117 {margin-left: 117px;} -.m-l-118 {margin-left: 118px;} -.m-l-119 {margin-left: 119px;} -.m-l-120 {margin-left: 120px;} -.m-l-121 {margin-left: 121px;} -.m-l-122 {margin-left: 122px;} -.m-l-123 {margin-left: 123px;} -.m-l-124 {margin-left: 124px;} -.m-l-125 {margin-left: 125px;} -.m-l-126 {margin-left: 126px;} -.m-l-127 {margin-left: 127px;} -.m-l-128 {margin-left: 128px;} -.m-l-129 {margin-left: 129px;} -.m-l-130 {margin-left: 130px;} -.m-l-131 {margin-left: 131px;} -.m-l-132 {margin-left: 132px;} -.m-l-133 {margin-left: 133px;} -.m-l-134 {margin-left: 134px;} -.m-l-135 {margin-left: 135px;} -.m-l-136 {margin-left: 136px;} -.m-l-137 {margin-left: 137px;} -.m-l-138 {margin-left: 138px;} -.m-l-139 {margin-left: 139px;} -.m-l-140 {margin-left: 140px;} -.m-l-141 {margin-left: 141px;} -.m-l-142 {margin-left: 142px;} -.m-l-143 {margin-left: 143px;} -.m-l-144 {margin-left: 144px;} -.m-l-145 {margin-left: 145px;} -.m-l-146 {margin-left: 146px;} -.m-l-147 {margin-left: 147px;} -.m-l-148 {margin-left: 148px;} -.m-l-149 {margin-left: 149px;} -.m-l-150 {margin-left: 150px;} -.m-l-151 {margin-left: 151px;} -.m-l-152 {margin-left: 152px;} -.m-l-153 {margin-left: 153px;} -.m-l-154 {margin-left: 154px;} -.m-l-155 {margin-left: 155px;} -.m-l-156 {margin-left: 156px;} -.m-l-157 {margin-left: 157px;} -.m-l-158 {margin-left: 158px;} -.m-l-159 {margin-left: 159px;} -.m-l-160 {margin-left: 160px;} -.m-l-161 {margin-left: 161px;} -.m-l-162 {margin-left: 162px;} -.m-l-163 {margin-left: 163px;} -.m-l-164 {margin-left: 164px;} -.m-l-165 {margin-left: 165px;} -.m-l-166 {margin-left: 166px;} -.m-l-167 {margin-left: 167px;} -.m-l-168 {margin-left: 168px;} -.m-l-169 {margin-left: 169px;} -.m-l-170 {margin-left: 170px;} -.m-l-171 {margin-left: 171px;} -.m-l-172 {margin-left: 172px;} -.m-l-173 {margin-left: 173px;} -.m-l-174 {margin-left: 174px;} -.m-l-175 {margin-left: 175px;} -.m-l-176 {margin-left: 176px;} -.m-l-177 {margin-left: 177px;} -.m-l-178 {margin-left: 178px;} -.m-l-179 {margin-left: 179px;} -.m-l-180 {margin-left: 180px;} -.m-l-181 {margin-left: 181px;} -.m-l-182 {margin-left: 182px;} -.m-l-183 {margin-left: 183px;} -.m-l-184 {margin-left: 184px;} -.m-l-185 {margin-left: 185px;} -.m-l-186 {margin-left: 186px;} -.m-l-187 {margin-left: 187px;} -.m-l-188 {margin-left: 188px;} -.m-l-189 {margin-left: 189px;} -.m-l-190 {margin-left: 190px;} -.m-l-191 {margin-left: 191px;} -.m-l-192 {margin-left: 192px;} -.m-l-193 {margin-left: 193px;} -.m-l-194 {margin-left: 194px;} -.m-l-195 {margin-left: 195px;} -.m-l-196 {margin-left: 196px;} -.m-l-197 {margin-left: 197px;} -.m-l-198 {margin-left: 198px;} -.m-l-199 {margin-left: 199px;} -.m-l-200 {margin-left: 200px;} -.m-l-201 {margin-left: 201px;} -.m-l-202 {margin-left: 202px;} -.m-l-203 {margin-left: 203px;} -.m-l-204 {margin-left: 204px;} -.m-l-205 {margin-left: 205px;} -.m-l-206 {margin-left: 206px;} -.m-l-207 {margin-left: 207px;} -.m-l-208 {margin-left: 208px;} -.m-l-209 {margin-left: 209px;} -.m-l-210 {margin-left: 210px;} -.m-l-211 {margin-left: 211px;} -.m-l-212 {margin-left: 212px;} -.m-l-213 {margin-left: 213px;} -.m-l-214 {margin-left: 214px;} -.m-l-215 {margin-left: 215px;} -.m-l-216 {margin-left: 216px;} -.m-l-217 {margin-left: 217px;} -.m-l-218 {margin-left: 218px;} -.m-l-219 {margin-left: 219px;} -.m-l-220 {margin-left: 220px;} -.m-l-221 {margin-left: 221px;} -.m-l-222 {margin-left: 222px;} -.m-l-223 {margin-left: 223px;} -.m-l-224 {margin-left: 224px;} -.m-l-225 {margin-left: 225px;} -.m-l-226 {margin-left: 226px;} -.m-l-227 {margin-left: 227px;} -.m-l-228 {margin-left: 228px;} -.m-l-229 {margin-left: 229px;} -.m-l-230 {margin-left: 230px;} -.m-l-231 {margin-left: 231px;} -.m-l-232 {margin-left: 232px;} -.m-l-233 {margin-left: 233px;} -.m-l-234 {margin-left: 234px;} -.m-l-235 {margin-left: 235px;} -.m-l-236 {margin-left: 236px;} -.m-l-237 {margin-left: 237px;} -.m-l-238 {margin-left: 238px;} -.m-l-239 {margin-left: 239px;} -.m-l-240 {margin-left: 240px;} -.m-l-241 {margin-left: 241px;} -.m-l-242 {margin-left: 242px;} -.m-l-243 {margin-left: 243px;} -.m-l-244 {margin-left: 244px;} -.m-l-245 {margin-left: 245px;} -.m-l-246 {margin-left: 246px;} -.m-l-247 {margin-left: 247px;} -.m-l-248 {margin-left: 248px;} -.m-l-249 {margin-left: 249px;} -.m-l-250 {margin-left: 250px;} -.m-r-0 {margin-right: 0px;} -.m-r-1 {margin-right: 1px;} -.m-r-2 {margin-right: 2px;} -.m-r-3 {margin-right: 3px;} -.m-r-4 {margin-right: 4px;} -.m-r-5 {margin-right: 5px;} -.m-r-6 {margin-right: 6px;} -.m-r-7 {margin-right: 7px;} -.m-r-8 {margin-right: 8px;} -.m-r-9 {margin-right: 9px;} -.m-r-10 {margin-right: 10px;} -.m-r-11 {margin-right: 11px;} -.m-r-12 {margin-right: 12px;} -.m-r-13 {margin-right: 13px;} -.m-r-14 {margin-right: 14px;} -.m-r-15 {margin-right: 15px;} -.m-r-16 {margin-right: 16px;} -.m-r-17 {margin-right: 17px;} -.m-r-18 {margin-right: 18px;} -.m-r-19 {margin-right: 19px;} -.m-r-20 {margin-right: 20px;} -.m-r-21 {margin-right: 21px;} -.m-r-22 {margin-right: 22px;} -.m-r-23 {margin-right: 23px;} -.m-r-24 {margin-right: 24px;} -.m-r-25 {margin-right: 25px;} -.m-r-26 {margin-right: 26px;} -.m-r-27 {margin-right: 27px;} -.m-r-28 {margin-right: 28px;} -.m-r-29 {margin-right: 29px;} -.m-r-30 {margin-right: 30px;} -.m-r-31 {margin-right: 31px;} -.m-r-32 {margin-right: 32px;} -.m-r-33 {margin-right: 33px;} -.m-r-34 {margin-right: 34px;} -.m-r-35 {margin-right: 35px;} -.m-r-36 {margin-right: 36px;} -.m-r-37 {margin-right: 37px;} -.m-r-38 {margin-right: 38px;} -.m-r-39 {margin-right: 39px;} -.m-r-40 {margin-right: 40px;} -.m-r-41 {margin-right: 41px;} -.m-r-42 {margin-right: 42px;} -.m-r-43 {margin-right: 43px;} -.m-r-44 {margin-right: 44px;} -.m-r-45 {margin-right: 45px;} -.m-r-46 {margin-right: 46px;} -.m-r-47 {margin-right: 47px;} -.m-r-48 {margin-right: 48px;} -.m-r-49 {margin-right: 49px;} -.m-r-50 {margin-right: 50px;} -.m-r-51 {margin-right: 51px;} -.m-r-52 {margin-right: 52px;} -.m-r-53 {margin-right: 53px;} -.m-r-54 {margin-right: 54px;} -.m-r-55 {margin-right: 55px;} -.m-r-56 {margin-right: 56px;} -.m-r-57 {margin-right: 57px;} -.m-r-58 {margin-right: 58px;} -.m-r-59 {margin-right: 59px;} -.m-r-60 {margin-right: 60px;} -.m-r-61 {margin-right: 61px;} -.m-r-62 {margin-right: 62px;} -.m-r-63 {margin-right: 63px;} -.m-r-64 {margin-right: 64px;} -.m-r-65 {margin-right: 65px;} -.m-r-66 {margin-right: 66px;} -.m-r-67 {margin-right: 67px;} -.m-r-68 {margin-right: 68px;} -.m-r-69 {margin-right: 69px;} -.m-r-70 {margin-right: 70px;} -.m-r-71 {margin-right: 71px;} -.m-r-72 {margin-right: 72px;} -.m-r-73 {margin-right: 73px;} -.m-r-74 {margin-right: 74px;} -.m-r-75 {margin-right: 75px;} -.m-r-76 {margin-right: 76px;} -.m-r-77 {margin-right: 77px;} -.m-r-78 {margin-right: 78px;} -.m-r-79 {margin-right: 79px;} -.m-r-80 {margin-right: 80px;} -.m-r-81 {margin-right: 81px;} -.m-r-82 {margin-right: 82px;} -.m-r-83 {margin-right: 83px;} -.m-r-84 {margin-right: 84px;} -.m-r-85 {margin-right: 85px;} -.m-r-86 {margin-right: 86px;} -.m-r-87 {margin-right: 87px;} -.m-r-88 {margin-right: 88px;} -.m-r-89 {margin-right: 89px;} -.m-r-90 {margin-right: 90px;} -.m-r-91 {margin-right: 91px;} -.m-r-92 {margin-right: 92px;} -.m-r-93 {margin-right: 93px;} -.m-r-94 {margin-right: 94px;} -.m-r-95 {margin-right: 95px;} -.m-r-96 {margin-right: 96px;} -.m-r-97 {margin-right: 97px;} -.m-r-98 {margin-right: 98px;} -.m-r-99 {margin-right: 99px;} -.m-r-100 {margin-right: 100px;} -.m-r-101 {margin-right: 101px;} -.m-r-102 {margin-right: 102px;} -.m-r-103 {margin-right: 103px;} -.m-r-104 {margin-right: 104px;} -.m-r-105 {margin-right: 105px;} -.m-r-106 {margin-right: 106px;} -.m-r-107 {margin-right: 107px;} -.m-r-108 {margin-right: 108px;} -.m-r-109 {margin-right: 109px;} -.m-r-110 {margin-right: 110px;} -.m-r-111 {margin-right: 111px;} -.m-r-112 {margin-right: 112px;} -.m-r-113 {margin-right: 113px;} -.m-r-114 {margin-right: 114px;} -.m-r-115 {margin-right: 115px;} -.m-r-116 {margin-right: 116px;} -.m-r-117 {margin-right: 117px;} -.m-r-118 {margin-right: 118px;} -.m-r-119 {margin-right: 119px;} -.m-r-120 {margin-right: 120px;} -.m-r-121 {margin-right: 121px;} -.m-r-122 {margin-right: 122px;} -.m-r-123 {margin-right: 123px;} -.m-r-124 {margin-right: 124px;} -.m-r-125 {margin-right: 125px;} -.m-r-126 {margin-right: 126px;} -.m-r-127 {margin-right: 127px;} -.m-r-128 {margin-right: 128px;} -.m-r-129 {margin-right: 129px;} -.m-r-130 {margin-right: 130px;} -.m-r-131 {margin-right: 131px;} -.m-r-132 {margin-right: 132px;} -.m-r-133 {margin-right: 133px;} -.m-r-134 {margin-right: 134px;} -.m-r-135 {margin-right: 135px;} -.m-r-136 {margin-right: 136px;} -.m-r-137 {margin-right: 137px;} -.m-r-138 {margin-right: 138px;} -.m-r-139 {margin-right: 139px;} -.m-r-140 {margin-right: 140px;} -.m-r-141 {margin-right: 141px;} -.m-r-142 {margin-right: 142px;} -.m-r-143 {margin-right: 143px;} -.m-r-144 {margin-right: 144px;} -.m-r-145 {margin-right: 145px;} -.m-r-146 {margin-right: 146px;} -.m-r-147 {margin-right: 147px;} -.m-r-148 {margin-right: 148px;} -.m-r-149 {margin-right: 149px;} -.m-r-150 {margin-right: 150px;} -.m-r-151 {margin-right: 151px;} -.m-r-152 {margin-right: 152px;} -.m-r-153 {margin-right: 153px;} -.m-r-154 {margin-right: 154px;} -.m-r-155 {margin-right: 155px;} -.m-r-156 {margin-right: 156px;} -.m-r-157 {margin-right: 157px;} -.m-r-158 {margin-right: 158px;} -.m-r-159 {margin-right: 159px;} -.m-r-160 {margin-right: 160px;} -.m-r-161 {margin-right: 161px;} -.m-r-162 {margin-right: 162px;} -.m-r-163 {margin-right: 163px;} -.m-r-164 {margin-right: 164px;} -.m-r-165 {margin-right: 165px;} -.m-r-166 {margin-right: 166px;} -.m-r-167 {margin-right: 167px;} -.m-r-168 {margin-right: 168px;} -.m-r-169 {margin-right: 169px;} -.m-r-170 {margin-right: 170px;} -.m-r-171 {margin-right: 171px;} -.m-r-172 {margin-right: 172px;} -.m-r-173 {margin-right: 173px;} -.m-r-174 {margin-right: 174px;} -.m-r-175 {margin-right: 175px;} -.m-r-176 {margin-right: 176px;} -.m-r-177 {margin-right: 177px;} -.m-r-178 {margin-right: 178px;} -.m-r-179 {margin-right: 179px;} -.m-r-180 {margin-right: 180px;} -.m-r-181 {margin-right: 181px;} -.m-r-182 {margin-right: 182px;} -.m-r-183 {margin-right: 183px;} -.m-r-184 {margin-right: 184px;} -.m-r-185 {margin-right: 185px;} -.m-r-186 {margin-right: 186px;} -.m-r-187 {margin-right: 187px;} -.m-r-188 {margin-right: 188px;} -.m-r-189 {margin-right: 189px;} -.m-r-190 {margin-right: 190px;} -.m-r-191 {margin-right: 191px;} -.m-r-192 {margin-right: 192px;} -.m-r-193 {margin-right: 193px;} -.m-r-194 {margin-right: 194px;} -.m-r-195 {margin-right: 195px;} -.m-r-196 {margin-right: 196px;} -.m-r-197 {margin-right: 197px;} -.m-r-198 {margin-right: 198px;} -.m-r-199 {margin-right: 199px;} -.m-r-200 {margin-right: 200px;} -.m-r-201 {margin-right: 201px;} -.m-r-202 {margin-right: 202px;} -.m-r-203 {margin-right: 203px;} -.m-r-204 {margin-right: 204px;} -.m-r-205 {margin-right: 205px;} -.m-r-206 {margin-right: 206px;} -.m-r-207 {margin-right: 207px;} -.m-r-208 {margin-right: 208px;} -.m-r-209 {margin-right: 209px;} -.m-r-210 {margin-right: 210px;} -.m-r-211 {margin-right: 211px;} -.m-r-212 {margin-right: 212px;} -.m-r-213 {margin-right: 213px;} -.m-r-214 {margin-right: 214px;} -.m-r-215 {margin-right: 215px;} -.m-r-216 {margin-right: 216px;} -.m-r-217 {margin-right: 217px;} -.m-r-218 {margin-right: 218px;} -.m-r-219 {margin-right: 219px;} -.m-r-220 {margin-right: 220px;} -.m-r-221 {margin-right: 221px;} -.m-r-222 {margin-right: 222px;} -.m-r-223 {margin-right: 223px;} -.m-r-224 {margin-right: 224px;} -.m-r-225 {margin-right: 225px;} -.m-r-226 {margin-right: 226px;} -.m-r-227 {margin-right: 227px;} -.m-r-228 {margin-right: 228px;} -.m-r-229 {margin-right: 229px;} -.m-r-230 {margin-right: 230px;} -.m-r-231 {margin-right: 231px;} -.m-r-232 {margin-right: 232px;} -.m-r-233 {margin-right: 233px;} -.m-r-234 {margin-right: 234px;} -.m-r-235 {margin-right: 235px;} -.m-r-236 {margin-right: 236px;} -.m-r-237 {margin-right: 237px;} -.m-r-238 {margin-right: 238px;} -.m-r-239 {margin-right: 239px;} -.m-r-240 {margin-right: 240px;} -.m-r-241 {margin-right: 241px;} -.m-r-242 {margin-right: 242px;} -.m-r-243 {margin-right: 243px;} -.m-r-244 {margin-right: 244px;} -.m-r-245 {margin-right: 245px;} -.m-r-246 {margin-right: 246px;} -.m-r-247 {margin-right: 247px;} -.m-r-248 {margin-right: 248px;} -.m-r-249 {margin-right: 249px;} -.m-r-250 {margin-right: 250px;} -.m-l-r-auto {margin-left: auto; margin-right: auto;} -.m-l-auto {margin-left: auto;} -.m-r-auto {margin-right: auto;} - - - -/*[ TEXT ] -/////////////////////////////////////////////////////////// -*/ -/* ------------------------------------ */ -.text-white {color: white;} -.text-black {color: black;} - -.text-hov-white:hover {color: white;} - -/* ------------------------------------ */ -.text-up {text-transform: uppercase;} - -/* ------------------------------------ */ -.text-center {text-align: center;} -.text-left {text-align: left;} -.text-right {text-align: right;} -.text-middle {vertical-align: middle;} - -/* ------------------------------------ */ -.lh-1-0 {line-height: 1.0;} -.lh-1-1 {line-height: 1.1;} -.lh-1-2 {line-height: 1.2;} -.lh-1-3 {line-height: 1.3;} -.lh-1-4 {line-height: 1.4;} -.lh-1-5 {line-height: 1.5;} -.lh-1-6 {line-height: 1.6;} -.lh-1-7 {line-height: 1.7;} -.lh-1-8 {line-height: 1.8;} -.lh-1-9 {line-height: 1.9;} -.lh-2-0 {line-height: 2.0;} -.lh-2-1 {line-height: 2.1;} -.lh-2-2 {line-height: 2.2;} -.lh-2-3 {line-height: 2.3;} -.lh-2-4 {line-height: 2.4;} -.lh-2-5 {line-height: 2.5;} -.lh-2-6 {line-height: 2.6;} -.lh-2-7 {line-height: 2.7;} -.lh-2-8 {line-height: 2.8;} -.lh-2-9 {line-height: 2.9;} - - - - - -/*[ SHAPE ] -/////////////////////////////////////////////////////////// -*/ - -/*[ Display ] ------------------------------------------------------------ -*/ -.dis-none {display: none;} -.dis-block {display: block;} -.dis-inline {display: inline;} -.dis-inline-block {display: inline-block;} -.dis-flex { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; -} - -/*[ Position ] ------------------------------------------------------------ -*/ -.pos-relative {position: relative;} -.pos-absolute {position: absolute;} -.pos-fixed {position: fixed;} - -/*[ float ] ------------------------------------------------------------ -*/ -.float-l {float: left;} -.float-r {float: right;} - - -/*[ Width & Height ] ------------------------------------------------------------ -*/ -.sizefull { - width: 100%; - height: 100%; -} -.w-full {width: 100%;} -.h-full {height: 100%;} -.max-w-full {max-width: 100%;} -.max-h-full {max-height: 100%;} -.min-w-full {min-width: 100%;} -.min-h-full {min-height: 100%;} - -/*[ Top Bottom Left Right ] ------------------------------------------------------------ -*/ -.top-0 {top: 0;} -.bottom-0 {bottom: 0;} -.left-0 {left: 0;} -.right-0 {right: 0;} - -.top-auto {top: auto;} -.bottom-auto {bottom: auto;} -.left-auto {left: auto;} -.right-auto {right: auto;} - - -/*[ Opacity ] ------------------------------------------------------------ -*/ -.op-0-0 {opacity: 0;} -.op-0-1 {opacity: 0.1;} -.op-0-2 {opacity: 0.2;} -.op-0-3 {opacity: 0.3;} -.op-0-4 {opacity: 0.4;} -.op-0-5 {opacity: 0.5;} -.op-0-6 {opacity: 0.6;} -.op-0-7 {opacity: 0.7;} -.op-0-8 {opacity: 0.8;} -.op-0-9 {opacity: 0.9;} -.op-1-0 {opacity: 1;} - -/*[ Background ] ------------------------------------------------------------ -*/ -.bgwhite {background-color: white;} -.bgblack {background-color: black;} - - - -/*[ Wrap Picture ] ------------------------------------------------------------ -*/ -.wrap-pic-w img {width: 100%;} -.wrap-pic-max-w img {max-width: 100%;} - -/* ------------------------------------ */ -.wrap-pic-h img {height: 100%;} -.wrap-pic-max-h img {max-height: 100%;} - -/* ------------------------------------ */ -.wrap-pic-cir { - border-radius: 50%; - overflow: hidden; -} -.wrap-pic-cir img { - width: 100%; -} - - - -/*[ Hover ] ------------------------------------------------------------ -*/ -.hov-pointer:hover {cursor: pointer;} - -/* ------------------------------------ */ -.hov-img-zoom { - display: block; - overflow: hidden; -} -.hov-img-zoom img{ - width: 100%; - -webkit-transition: all 0.6s; - -o-transition: all 0.6s; - -moz-transition: all 0.6s; - transition: all 0.6s; -} -.hov-img-zoom:hover img { - -webkit-transform: scale(1.1); - -moz-transform: scale(1.1); - -ms-transform: scale(1.1); - -o-transform: scale(1.1); - transform: scale(1.1); -} - - - -/*[ ] ------------------------------------------------------------ -*/ -.bo-cir {border-radius: 50%;} - -.of-hidden {overflow: hidden;} - -.visible-false {visibility: hidden;} -.visible-true {visibility: visible;} - - - - -/*[ Transition ] ------------------------------------------------------------ -*/ -.trans-0-1 { - -webkit-transition: all 0.1s; - -o-transition: all 0.1s; - -moz-transition: all 0.1s; - transition: all 0.1s; -} -.trans-0-2 { - -webkit-transition: all 0.2s; - -o-transition: all 0.2s; - -moz-transition: all 0.2s; - transition: all 0.2s; -} -.trans-0-3 { - -webkit-transition: all 0.3s; - -o-transition: all 0.3s; - -moz-transition: all 0.3s; - transition: all 0.3s; -} -.trans-0-4 { - -webkit-transition: all 0.4s; - -o-transition: all 0.4s; - -moz-transition: all 0.4s; - transition: all 0.4s; -} -.trans-0-5 { - -webkit-transition: all 0.5s; - -o-transition: all 0.5s; - -moz-transition: all 0.5s; - transition: all 0.5s; -} -.trans-0-6 { - -webkit-transition: all 0.6s; - -o-transition: all 0.6s; - -moz-transition: all 0.6s; - transition: all 0.6s; -} -.trans-0-9 { - -webkit-transition: all 0.9s; - -o-transition: all 0.9s; - -moz-transition: all 0.9s; - transition: all 0.9s; -} -.trans-1-0 { - -webkit-transition: all 1s; - -o-transition: all 1s; - -moz-transition: all 1s; - transition: all 1s; -} - - - -/*[ Layout ] -/////////////////////////////////////////////////////////// -*/ - -/*[ Flex ] ------------------------------------------------------------ -*/ -/* ------------------------------------ */ -.flex-w { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-wrap: wrap; - -moz-flex-wrap: wrap; - -ms-flex-wrap: wrap; - -o-flex-wrap: wrap; - flex-wrap: wrap; -} - -/* ------------------------------------ */ -.flex-l { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: flex-start; -} - -.flex-r { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: flex-end; -} - -.flex-c { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: center; -} - -.flex-sa { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: space-around; -} - -.flex-sb { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: space-between; -} - -/* ------------------------------------ */ -.flex-t { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -ms-align-items: flex-start; - align-items: flex-start; -} - -.flex-b { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -ms-align-items: flex-end; - align-items: flex-end; -} - -.flex-m { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -ms-align-items: center; - align-items: center; -} - -.flex-str { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -ms-align-items: stretch; - align-items: stretch; -} - -/* ------------------------------------ */ -.flex-row { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row; - -moz-flex-direction: row; - -ms-flex-direction: row; - -o-flex-direction: row; - flex-direction: row; -} - -.flex-row-rev { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: row-reverse; - -moz-flex-direction: row-reverse; - -ms-flex-direction: row-reverse; - -o-flex-direction: row-reverse; - flex-direction: row-reverse; -} - -.flex-col { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - -o-flex-direction: column; - flex-direction: column; -} - -.flex-col-rev { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column-reverse; - -moz-flex-direction: column-reverse; - -ms-flex-direction: column-reverse; - -o-flex-direction: column-reverse; - flex-direction: column-reverse; -} - -/* ------------------------------------ */ -.flex-c-m { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: center; - -ms-align-items: center; - align-items: center; -} - -.flex-c-t { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: center; - -ms-align-items: flex-start; - align-items: flex-start; -} - -.flex-c-b { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: center; - -ms-align-items: flex-end; - align-items: flex-end; -} - -.flex-c-str { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: center; - -ms-align-items: stretch; - align-items: stretch; -} - -.flex-l-m { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: flex-start; - -ms-align-items: center; - align-items: center; -} - -.flex-r-m { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: flex-end; - -ms-align-items: center; - align-items: center; -} - -.flex-sa-m { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: space-around; - -ms-align-items: center; - align-items: center; -} - -.flex-sb-m { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - justify-content: space-between; - -ms-align-items: center; - align-items: center; -} - -/* ------------------------------------ */ -.flex-col-l { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - -o-flex-direction: column; - flex-direction: column; - -ms-align-items: flex-start; - align-items: flex-start; -} - -.flex-col-r { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - -o-flex-direction: column; - flex-direction: column; - -ms-align-items: flex-end; - align-items: flex-end; -} - -.flex-col-c { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - -o-flex-direction: column; - flex-direction: column; - -ms-align-items: center; - align-items: center; -} - -.flex-col-l-m { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - -o-flex-direction: column; - flex-direction: column; - -ms-align-items: flex-start; - align-items: flex-start; - justify-content: center; -} - -.flex-col-r-m { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - -o-flex-direction: column; - flex-direction: column; - -ms-align-items: flex-end; - align-items: flex-end; - justify-content: center; -} - -.flex-col-c-m { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - -o-flex-direction: column; - flex-direction: column; - -ms-align-items: center; - align-items: center; - justify-content: center; -} - -.flex-col-str { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - -o-flex-direction: column; - flex-direction: column; - -ms-align-items: stretch; - align-items: stretch; -} - -.flex-col-sb { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column; - -moz-flex-direction: column; - -ms-flex-direction: column; - -o-flex-direction: column; - flex-direction: column; - justify-content: space-between; -} - -/* ------------------------------------ */ -.flex-col-rev-l { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column-reverse; - -moz-flex-direction: column-reverse; - -ms-flex-direction: column-reverse; - -o-flex-direction: column-reverse; - flex-direction: column-reverse; - -ms-align-items: flex-start; - align-items: flex-start; -} - -.flex-col-rev-r { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column-reverse; - -moz-flex-direction: column-reverse; - -ms-flex-direction: column-reverse; - -o-flex-direction: column-reverse; - flex-direction: column-reverse; - -ms-align-items: flex-end; - align-items: flex-end; -} - -.flex-col-rev-c { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column-reverse; - -moz-flex-direction: column-reverse; - -ms-flex-direction: column-reverse; - -o-flex-direction: column-reverse; - flex-direction: column-reverse; - -ms-align-items: center; - align-items: center; -} - -.flex-col-rev-str { - display: -webkit-box; - display: -webkit-flex; - display: -moz-box; - display: -ms-flexbox; - display: flex; - -webkit-flex-direction: column-reverse; - -moz-flex-direction: column-reverse; - -ms-flex-direction: column-reverse; - -o-flex-direction: column-reverse; - flex-direction: column-reverse; - -ms-align-items: stretch; - align-items: stretch; -} - - -/*[ Absolute ] ------------------------------------------------------------ -*/ -.ab-c-m { - position: absolute; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - -moz-transform: translate(-50%, -50%); - -ms-transform: translate(-50%, -50%); - -o-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} - -.ab-c-t { - position: absolute; - top: 0px; - left: 50%; - -webkit-transform: translateX(-50%); - -moz-transform: translateX(-50%); - -ms-transform: translateX(-50%); - -o-transform: translateX(-50%); - transform: translateX(-50%); -} - -.ab-c-b { - position: absolute; - bottom: 0px; - left: 50%; - -webkit-transform: translateX(-50%); - -moz-transform: translateX(-50%); - -ms-transform: translateX(-50%); - -o-transform: translateX(-50%); - transform: translateX(-50%); -} - -.ab-l-m { - position: absolute; - left: 0px; - top: 50%; - -webkit-transform: translateY(-50%); - -moz-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); -} - -.ab-r-m { - position: absolute; - right: 0px; - top: 50%; - -webkit-transform: translateY(-50%); - -moz-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); -} - -.ab-t-l { - position: absolute; - left: 0px; - top: 0px; -} - -.ab-t-r { - position: absolute; - right: 0px; - top: 0px; -} - -.ab-b-l { - position: absolute; - left: 0px; - bottom: 0px; -} - -.ab-b-r { - position: absolute; - right: 0px; - bottom: 0px; -} - - - - - - - - - diff --git a/public/assets/demo/chart-area-demo.js b/public/assets/demo/chart-area-demo.js deleted file mode 100644 index f63ff91..0000000 --- a/public/assets/demo/chart-area-demo.js +++ /dev/null @@ -1,54 +0,0 @@ -// Set new default font family and font color to mimic Bootstrap's default styling -Chart.defaults.global.defaultFontFamily = '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif'; -Chart.defaults.global.defaultFontColor = '#292b2c'; - -// Area Chart Example -var ctx = document.getElementById("myAreaChart"); -var myLineChart = new Chart(ctx, { - type: 'line', - data: { - labels: ["Mar 1", "Mar 2", "Mar 3", "Mar 4", "Mar 5", "Mar 6", "Mar 7", "Mar 8", "Mar 9", "Mar 10", "Mar 11", "Mar 12", "Mar 13"], - datasets: [{ - label: "Sessions", - lineTension: 0.3, - backgroundColor: "rgba(2,117,216,0.2)", - borderColor: "rgba(2,117,216,1)", - pointRadius: 5, - pointBackgroundColor: "rgba(2,117,216,1)", - pointBorderColor: "rgba(255,255,255,0.8)", - pointHoverRadius: 5, - pointHoverBackgroundColor: "rgba(2,117,216,1)", - pointHitRadius: 50, - pointBorderWidth: 2, - data: [10000, 30162, 26263, 18394, 18287, 28682, 31274, 33259, 25849, 24159, 32651, 31984, 38451], - }], - }, - options: { - scales: { - xAxes: [{ - time: { - unit: 'date' - }, - gridLines: { - display: false - }, - ticks: { - maxTicksLimit: 7 - } - }], - yAxes: [{ - ticks: { - min: 0, - max: 40000, - maxTicksLimit: 5 - }, - gridLines: { - color: "rgba(0, 0, 0, .125)", - } - }], - }, - legend: { - display: false - } - } -}); diff --git a/public/assets/demo/chart-bar-demo.js b/public/assets/demo/chart-bar-demo.js deleted file mode 100644 index 049ad20..0000000 --- a/public/assets/demo/chart-bar-demo.js +++ /dev/null @@ -1,46 +0,0 @@ -// Set new default font family and font color to mimic Bootstrap's default styling -Chart.defaults.global.defaultFontFamily = '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif'; -Chart.defaults.global.defaultFontColor = '#292b2c'; - -// Bar Chart Example -var ctx = document.getElementById("myBarChart"); -var myLineChart = new Chart(ctx, { - type: 'bar', - data: { - labels: ["January", "February", "March", "April", "May", "June"], - datasets: [{ - label: "Revenue", - backgroundColor: "rgba(2,117,216,1)", - borderColor: "rgba(2,117,216,1)", - data: [4215, 5312, 6251, 7841, 9821, 14984], - }], - }, - options: { - scales: { - xAxes: [{ - time: { - unit: 'month' - }, - gridLines: { - display: false - }, - ticks: { - maxTicksLimit: 6 - } - }], - yAxes: [{ - ticks: { - min: 0, - max: 15000, - maxTicksLimit: 5 - }, - gridLines: { - display: true - } - }], - }, - legend: { - display: false - } - } -}); diff --git a/public/assets/demo/chart-pie-demo.js b/public/assets/demo/chart-pie-demo.js deleted file mode 100644 index 4e16c41..0000000 --- a/public/assets/demo/chart-pie-demo.js +++ /dev/null @@ -1,16 +0,0 @@ -// Set new default font family and font color to mimic Bootstrap's default styling -Chart.defaults.global.defaultFontFamily = '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif'; -Chart.defaults.global.defaultFontColor = '#292b2c'; - -// Pie Chart Example -var ctx = document.getElementById("myPieChart"); -var myPieChart = new Chart(ctx, { - type: 'pie', - data: { - labels: ["Blue", "Red", "Yellow", "Green"], - datasets: [{ - data: [12.21, 15.58, 11.25, 8.32], - backgroundColor: ['#007bff', '#dc3545', '#ffc107', '#28a745'], - }], - }, -}); diff --git a/public/assets/demo/datatables-demo.js b/public/assets/demo/datatables-demo.js deleted file mode 100644 index f2eecbf..0000000 --- a/public/assets/demo/datatables-demo.js +++ /dev/null @@ -1,4 +0,0 @@ -// Call the dataTables jQuery plugin -$(document).ready(function() { - $('#dataTable').DataTable(); -}); diff --git a/public/assets/donation.png b/public/assets/donation.png deleted file mode 100644 index 19cb45d..0000000 Binary files a/public/assets/donation.png and /dev/null differ diff --git a/public/assets/download/donation_data_file.xlsx b/public/assets/download/donation_data_file.xlsx deleted file mode 100644 index cdcf290..0000000 Binary files a/public/assets/download/donation_data_file.xlsx and /dev/null differ diff --git a/public/assets/download/donation_data_upload_file.xlsx b/public/assets/download/donation_data_upload_file.xlsx deleted file mode 100644 index 64a4f19..0000000 Binary files a/public/assets/download/donation_data_upload_file.xlsx and /dev/null differ diff --git a/public/assets/download/transaction_data_file.xlsx b/public/assets/download/transaction_data_file.xlsx deleted file mode 100644 index 513420e..0000000 Binary files a/public/assets/download/transaction_data_file.xlsx and /dev/null differ diff --git a/public/assets/download/transaction_upload_file.xlsx b/public/assets/download/transaction_upload_file.xlsx deleted file mode 100644 index 53cee18..0000000 Binary files a/public/assets/download/transaction_upload_file.xlsx and /dev/null differ diff --git a/public/assets/fonts/font-awesome-4.7.0/HELP-US-OUT.txt b/public/assets/fonts/font-awesome-4.7.0/HELP-US-OUT.txt deleted file mode 100644 index 83d083d..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/HELP-US-OUT.txt +++ /dev/null @@ -1,7 +0,0 @@ -I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, -Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, -comprehensive icon sets or copy and paste your own. - -Please. Check it out. - --Dave Gandy diff --git a/public/assets/fonts/font-awesome-4.7.0/css/font-awesome.css b/public/assets/fonts/font-awesome-4.7.0/css/font-awesome.css deleted file mode 100644 index ee906a8..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/css/font-awesome.css +++ /dev/null @@ -1,2337 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ -/* FONT PATH - * -------------------------- */ -@font-face { - font-family: 'FontAwesome'; - src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); - font-weight: normal; - font-style: normal; -} -.fa { - display: inline-block; - font: normal normal normal 14px/1 FontAwesome; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -/* makes the font 33% larger relative to the icon container */ -.fa-lg { - font-size: 1.33333333em; - line-height: 0.75em; - vertical-align: -15%; -} -.fa-2x { - font-size: 2em; -} -.fa-3x { - font-size: 3em; -} -.fa-4x { - font-size: 4em; -} -.fa-5x { - font-size: 5em; -} -.fa-fw { - width: 1.28571429em; - text-align: center; -} -.fa-ul { - padding-left: 0; - margin-left: 2.14285714em; - list-style-type: none; -} -.fa-ul > li { - position: relative; -} -.fa-li { - position: absolute; - left: -2.14285714em; - width: 2.14285714em; - top: 0.14285714em; - text-align: center; -} -.fa-li.fa-lg { - left: -1.85714286em; -} -.fa-border { - padding: .2em .25em .15em; - border: solid 0.08em #eeeeee; - border-radius: .1em; -} -.fa-pull-left { - float: left; -} -.fa-pull-right { - float: right; -} -.fa.fa-pull-left { - margin-right: .3em; -} -.fa.fa-pull-right { - margin-left: .3em; -} -/* Deprecated as of 4.4.0 */ -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.fa.pull-left { - margin-right: .3em; -} -.fa.pull-right { - margin-left: .3em; -} -.fa-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} -.fa-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); -} -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); -} -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - -ms-transform: rotate(270deg); - transform: rotate(270deg); -} -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - -ms-transform: scale(1, -1); - transform: scale(1, -1); -} -:root .fa-rotate-90, -:root .fa-rotate-180, -:root .fa-rotate-270, -:root .fa-flip-horizontal, -:root .fa-flip-vertical { - filter: none; -} -.fa-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.fa-stack-1x, -.fa-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.fa-stack-1x { - line-height: inherit; -} -.fa-stack-2x { - font-size: 2em; -} -.fa-inverse { - color: #ffffff; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.fa-glass:before { - content: "\f000"; -} -.fa-music:before { - content: "\f001"; -} -.fa-search:before { - content: "\f002"; -} -.fa-envelope-o:before { - content: "\f003"; -} -.fa-heart:before { - content: "\f004"; -} -.fa-star:before { - content: "\f005"; -} -.fa-star-o:before { - content: "\f006"; -} -.fa-user:before { - content: "\f007"; -} -.fa-film:before { - content: "\f008"; -} -.fa-th-large:before { - content: "\f009"; -} -.fa-th:before { - content: "\f00a"; -} -.fa-th-list:before { - content: "\f00b"; -} -.fa-check:before { - content: "\f00c"; -} -.fa-remove:before, -.fa-close:before, -.fa-times:before { - content: "\f00d"; -} -.fa-search-plus:before { - content: "\f00e"; -} -.fa-search-minus:before { - content: "\f010"; -} -.fa-power-off:before { - content: "\f011"; -} -.fa-signal:before { - content: "\f012"; -} -.fa-gear:before, -.fa-cog:before { - content: "\f013"; -} -.fa-trash-o:before { - content: "\f014"; -} -.fa-home:before { - content: "\f015"; -} -.fa-file-o:before { - content: "\f016"; -} -.fa-clock-o:before { - content: "\f017"; -} -.fa-road:before { - content: "\f018"; -} -.fa-download:before { - content: "\f019"; -} -.fa-arrow-circle-o-down:before { - content: "\f01a"; -} -.fa-arrow-circle-o-up:before { - content: "\f01b"; -} -.fa-inbox:before { - content: "\f01c"; -} -.fa-play-circle-o:before { - content: "\f01d"; -} -.fa-rotate-right:before, -.fa-repeat:before { - content: "\f01e"; -} -.fa-refresh:before { - content: "\f021"; -} -.fa-list-alt:before { - content: "\f022"; -} -.fa-lock:before { - content: "\f023"; -} -.fa-flag:before { - content: "\f024"; -} -.fa-headphones:before { - content: "\f025"; -} -.fa-volume-off:before { - content: "\f026"; -} -.fa-volume-down:before { - content: "\f027"; -} -.fa-volume-up:before { - content: "\f028"; -} -.fa-qrcode:before { - content: "\f029"; -} -.fa-barcode:before { - content: "\f02a"; -} -.fa-tag:before { - content: "\f02b"; -} -.fa-tags:before { - content: "\f02c"; -} -.fa-book:before { - content: "\f02d"; -} -.fa-bookmark:before { - content: "\f02e"; -} -.fa-print:before { - content: "\f02f"; -} -.fa-camera:before { - content: "\f030"; -} -.fa-font:before { - content: "\f031"; -} -.fa-bold:before { - content: "\f032"; -} -.fa-italic:before { - content: "\f033"; -} -.fa-text-height:before { - content: "\f034"; -} -.fa-text-width:before { - content: "\f035"; -} -.fa-align-left:before { - content: "\f036"; -} -.fa-align-center:before { - content: "\f037"; -} -.fa-align-right:before { - content: "\f038"; -} -.fa-align-justify:before { - content: "\f039"; -} -.fa-list:before { - content: "\f03a"; -} -.fa-dedent:before, -.fa-outdent:before { - content: "\f03b"; -} -.fa-indent:before { - content: "\f03c"; -} -.fa-video-camera:before { - content: "\f03d"; -} -.fa-photo:before, -.fa-image:before, -.fa-picture-o:before { - content: "\f03e"; -} -.fa-pencil:before { - content: "\f040"; -} -.fa-map-marker:before { - content: "\f041"; -} -.fa-adjust:before { - content: "\f042"; -} -.fa-tint:before { - content: "\f043"; -} -.fa-edit:before, -.fa-pencil-square-o:before { - content: "\f044"; -} -.fa-share-square-o:before { - content: "\f045"; -} -.fa-check-square-o:before { - content: "\f046"; -} -.fa-arrows:before { - content: "\f047"; -} -.fa-step-backward:before { - content: "\f048"; -} -.fa-fast-backward:before { - content: "\f049"; -} -.fa-backward:before { - content: "\f04a"; -} -.fa-play:before { - content: "\f04b"; -} -.fa-pause:before { - content: "\f04c"; -} -.fa-stop:before { - content: "\f04d"; -} -.fa-forward:before { - content: "\f04e"; -} -.fa-fast-forward:before { - content: "\f050"; -} -.fa-step-forward:before { - content: "\f051"; -} -.fa-eject:before { - content: "\f052"; -} -.fa-chevron-left:before { - content: "\f053"; -} -.fa-chevron-right:before { - content: "\f054"; -} -.fa-plus-circle:before { - content: "\f055"; -} -.fa-minus-circle:before { - content: "\f056"; -} -.fa-times-circle:before { - content: "\f057"; -} -.fa-check-circle:before { - content: "\f058"; -} -.fa-question-circle:before { - content: "\f059"; -} -.fa-info-circle:before { - content: "\f05a"; -} -.fa-crosshairs:before { - content: "\f05b"; -} -.fa-times-circle-o:before { - content: "\f05c"; -} -.fa-check-circle-o:before { - content: "\f05d"; -} -.fa-ban:before { - content: "\f05e"; -} -.fa-arrow-left:before { - content: "\f060"; -} -.fa-arrow-right:before { - content: "\f061"; -} -.fa-arrow-up:before { - content: "\f062"; -} -.fa-arrow-down:before { - content: "\f063"; -} -.fa-mail-forward:before, -.fa-share:before { - content: "\f064"; -} -.fa-expand:before { - content: "\f065"; -} -.fa-compress:before { - content: "\f066"; -} -.fa-plus:before { - content: "\f067"; -} -.fa-minus:before { - content: "\f068"; -} -.fa-asterisk:before { - content: "\f069"; -} -.fa-exclamation-circle:before { - content: "\f06a"; -} -.fa-gift:before { - content: "\f06b"; -} -.fa-leaf:before { - content: "\f06c"; -} -.fa-fire:before { - content: "\f06d"; -} -.fa-eye:before { - content: "\f06e"; -} -.fa-eye-slash:before { - content: "\f070"; -} -.fa-warning:before, -.fa-exclamation-triangle:before { - content: "\f071"; -} -.fa-plane:before { - content: "\f072"; -} -.fa-calendar:before { - content: "\f073"; -} -.fa-random:before { - content: "\f074"; -} -.fa-comment:before { - content: "\f075"; -} -.fa-magnet:before { - content: "\f076"; -} -.fa-chevron-up:before { - content: "\f077"; -} -.fa-chevron-down:before { - content: "\f078"; -} -.fa-retweet:before { - content: "\f079"; -} -.fa-shopping-cart:before { - content: "\f07a"; -} -.fa-folder:before { - content: "\f07b"; -} -.fa-folder-open:before { - content: "\f07c"; -} -.fa-arrows-v:before { - content: "\f07d"; -} -.fa-arrows-h:before { - content: "\f07e"; -} -.fa-bar-chart-o:before, -.fa-bar-chart:before { - content: "\f080"; -} -.fa-twitter-square:before { - content: "\f081"; -} -.fa-facebook-square:before { - content: "\f082"; -} -.fa-camera-retro:before { - content: "\f083"; -} -.fa-key:before { - content: "\f084"; -} -.fa-gears:before, -.fa-cogs:before { - content: "\f085"; -} -.fa-comments:before { - content: "\f086"; -} -.fa-thumbs-o-up:before { - content: "\f087"; -} -.fa-thumbs-o-down:before { - content: "\f088"; -} -.fa-star-half:before { - content: "\f089"; -} -.fa-heart-o:before { - content: "\f08a"; -} -.fa-sign-out:before { - content: "\f08b"; -} -.fa-linkedin-square:before { - content: "\f08c"; -} -.fa-thumb-tack:before { - content: "\f08d"; -} -.fa-external-link:before { - content: "\f08e"; -} -.fa-sign-in:before { - content: "\f090"; -} -.fa-trophy:before { - content: "\f091"; -} -.fa-github-square:before { - content: "\f092"; -} -.fa-upload:before { - content: "\f093"; -} -.fa-lemon-o:before { - content: "\f094"; -} -.fa-phone:before { - content: "\f095"; -} -.fa-square-o:before { - content: "\f096"; -} -.fa-bookmark-o:before { - content: "\f097"; -} -.fa-phone-square:before { - content: "\f098"; -} -.fa-twitter:before { - content: "\f099"; -} -.fa-facebook-f:before, -.fa-facebook:before { - content: "\f09a"; -} -.fa-github:before { - content: "\f09b"; -} -.fa-unlock:before { - content: "\f09c"; -} -.fa-credit-card:before { - content: "\f09d"; -} -.fa-feed:before, -.fa-rss:before { - content: "\f09e"; -} -.fa-hdd-o:before { - content: "\f0a0"; -} -.fa-bullhorn:before { - content: "\f0a1"; -} -.fa-bell:before { - content: "\f0f3"; -} -.fa-certificate:before { - content: "\f0a3"; -} -.fa-hand-o-right:before { - content: "\f0a4"; -} -.fa-hand-o-left:before { - content: "\f0a5"; -} -.fa-hand-o-up:before { - content: "\f0a6"; -} -.fa-hand-o-down:before { - content: "\f0a7"; -} -.fa-arrow-circle-left:before { - content: "\f0a8"; -} -.fa-arrow-circle-right:before { - content: "\f0a9"; -} -.fa-arrow-circle-up:before { - content: "\f0aa"; -} -.fa-arrow-circle-down:before { - content: "\f0ab"; -} -.fa-globe:before { - content: "\f0ac"; -} -.fa-wrench:before { - content: "\f0ad"; -} -.fa-tasks:before { - content: "\f0ae"; -} -.fa-filter:before { - content: "\f0b0"; -} -.fa-briefcase:before { - content: "\f0b1"; -} -.fa-arrows-alt:before { - content: "\f0b2"; -} -.fa-group:before, -.fa-users:before { - content: "\f0c0"; -} -.fa-chain:before, -.fa-link:before { - content: "\f0c1"; -} -.fa-cloud:before { - content: "\f0c2"; -} -.fa-flask:before { - content: "\f0c3"; -} -.fa-cut:before, -.fa-scissors:before { - content: "\f0c4"; -} -.fa-copy:before, -.fa-files-o:before { - content: "\f0c5"; -} -.fa-paperclip:before { - content: "\f0c6"; -} -.fa-save:before, -.fa-floppy-o:before { - content: "\f0c7"; -} -.fa-square:before { - content: "\f0c8"; -} -.fa-navicon:before, -.fa-reorder:before, -.fa-bars:before { - content: "\f0c9"; -} -.fa-list-ul:before { - content: "\f0ca"; -} -.fa-list-ol:before { - content: "\f0cb"; -} -.fa-strikethrough:before { - content: "\f0cc"; -} -.fa-underline:before { - content: "\f0cd"; -} -.fa-table:before { - content: "\f0ce"; -} -.fa-magic:before { - content: "\f0d0"; -} -.fa-truck:before { - content: "\f0d1"; -} -.fa-pinterest:before { - content: "\f0d2"; -} -.fa-pinterest-square:before { - content: "\f0d3"; -} -.fa-google-plus-square:before { - content: "\f0d4"; -} -.fa-google-plus:before { - content: "\f0d5"; -} -.fa-money:before { - content: "\f0d6"; -} -.fa-caret-down:before { - content: "\f0d7"; -} -.fa-caret-up:before { - content: "\f0d8"; -} -.fa-caret-left:before { - content: "\f0d9"; -} -.fa-caret-right:before { - content: "\f0da"; -} -.fa-columns:before { - content: "\f0db"; -} -.fa-unsorted:before, -.fa-sort:before { - content: "\f0dc"; -} -.fa-sort-down:before, -.fa-sort-desc:before { - content: "\f0dd"; -} -.fa-sort-up:before, -.fa-sort-asc:before { - content: "\f0de"; -} -.fa-envelope:before { - content: "\f0e0"; -} -.fa-linkedin:before { - content: "\f0e1"; -} -.fa-rotate-left:before, -.fa-undo:before { - content: "\f0e2"; -} -.fa-legal:before, -.fa-gavel:before { - content: "\f0e3"; -} -.fa-dashboard:before, -.fa-tachometer:before { - content: "\f0e4"; -} -.fa-comment-o:before { - content: "\f0e5"; -} -.fa-comments-o:before { - content: "\f0e6"; -} -.fa-flash:before, -.fa-bolt:before { - content: "\f0e7"; -} -.fa-sitemap:before { - content: "\f0e8"; -} -.fa-umbrella:before { - content: "\f0e9"; -} -.fa-paste:before, -.fa-clipboard:before { - content: "\f0ea"; -} -.fa-lightbulb-o:before { - content: "\f0eb"; -} -.fa-exchange:before { - content: "\f0ec"; -} -.fa-cloud-download:before { - content: "\f0ed"; -} -.fa-cloud-upload:before { - content: "\f0ee"; -} -.fa-user-md:before { - content: "\f0f0"; -} -.fa-stethoscope:before { - content: "\f0f1"; -} -.fa-suitcase:before { - content: "\f0f2"; -} -.fa-bell-o:before { - content: "\f0a2"; -} -.fa-coffee:before { - content: "\f0f4"; -} -.fa-cutlery:before { - content: "\f0f5"; -} -.fa-file-text-o:before { - content: "\f0f6"; -} -.fa-building-o:before { - content: "\f0f7"; -} -.fa-hospital-o:before { - content: "\f0f8"; -} -.fa-ambulance:before { - content: "\f0f9"; -} -.fa-medkit:before { - content: "\f0fa"; -} -.fa-fighter-jet:before { - content: "\f0fb"; -} -.fa-beer:before { - content: "\f0fc"; -} -.fa-h-square:before { - content: "\f0fd"; -} -.fa-plus-square:before { - content: "\f0fe"; -} -.fa-angle-double-left:before { - content: "\f100"; -} -.fa-angle-double-right:before { - content: "\f101"; -} -.fa-angle-double-up:before { - content: "\f102"; -} -.fa-angle-double-down:before { - content: "\f103"; -} -.fa-angle-left:before { - content: "\f104"; -} -.fa-angle-right:before { - content: "\f105"; -} -.fa-angle-up:before { - content: "\f106"; -} -.fa-angle-down:before { - content: "\f107"; -} -.fa-desktop:before { - content: "\f108"; -} -.fa-laptop:before { - content: "\f109"; -} -.fa-tablet:before { - content: "\f10a"; -} -.fa-mobile-phone:before, -.fa-mobile:before { - content: "\f10b"; -} -.fa-circle-o:before { - content: "\f10c"; -} -.fa-quote-left:before { - content: "\f10d"; -} -.fa-quote-right:before { - content: "\f10e"; -} -.fa-spinner:before { - content: "\f110"; -} -.fa-circle:before { - content: "\f111"; -} -.fa-mail-reply:before, -.fa-reply:before { - content: "\f112"; -} -.fa-github-alt:before { - content: "\f113"; -} -.fa-folder-o:before { - content: "\f114"; -} -.fa-folder-open-o:before { - content: "\f115"; -} -.fa-smile-o:before { - content: "\f118"; -} -.fa-frown-o:before { - content: "\f119"; -} -.fa-meh-o:before { - content: "\f11a"; -} -.fa-gamepad:before { - content: "\f11b"; -} -.fa-keyboard-o:before { - content: "\f11c"; -} -.fa-flag-o:before { - content: "\f11d"; -} -.fa-flag-checkered:before { - content: "\f11e"; -} -.fa-terminal:before { - content: "\f120"; -} -.fa-code:before { - content: "\f121"; -} -.fa-mail-reply-all:before, -.fa-reply-all:before { - content: "\f122"; -} -.fa-star-half-empty:before, -.fa-star-half-full:before, -.fa-star-half-o:before { - content: "\f123"; -} -.fa-location-arrow:before { - content: "\f124"; -} -.fa-crop:before { - content: "\f125"; -} -.fa-code-fork:before { - content: "\f126"; -} -.fa-unlink:before, -.fa-chain-broken:before { - content: "\f127"; -} -.fa-question:before { - content: "\f128"; -} -.fa-info:before { - content: "\f129"; -} -.fa-exclamation:before { - content: "\f12a"; -} -.fa-superscript:before { - content: "\f12b"; -} -.fa-subscript:before { - content: "\f12c"; -} -.fa-eraser:before { - content: "\f12d"; -} -.fa-puzzle-piece:before { - content: "\f12e"; -} -.fa-microphone:before { - content: "\f130"; -} -.fa-microphone-slash:before { - content: "\f131"; -} -.fa-shield:before { - content: "\f132"; -} -.fa-calendar-o:before { - content: "\f133"; -} -.fa-fire-extinguisher:before { - content: "\f134"; -} -.fa-rocket:before { - content: "\f135"; -} -.fa-maxcdn:before { - content: "\f136"; -} -.fa-chevron-circle-left:before { - content: "\f137"; -} -.fa-chevron-circle-right:before { - content: "\f138"; -} -.fa-chevron-circle-up:before { - content: "\f139"; -} -.fa-chevron-circle-down:before { - content: "\f13a"; -} -.fa-html5:before { - content: "\f13b"; -} -.fa-css3:before { - content: "\f13c"; -} -.fa-anchor:before { - content: "\f13d"; -} -.fa-unlock-alt:before { - content: "\f13e"; -} -.fa-bullseye:before { - content: "\f140"; -} -.fa-ellipsis-h:before { - content: "\f141"; -} -.fa-ellipsis-v:before { - content: "\f142"; -} -.fa-rss-square:before { - content: "\f143"; -} -.fa-play-circle:before { - content: "\f144"; -} -.fa-ticket:before { - content: "\f145"; -} -.fa-minus-square:before { - content: "\f146"; -} -.fa-minus-square-o:before { - content: "\f147"; -} -.fa-level-up:before { - content: "\f148"; -} -.fa-level-down:before { - content: "\f149"; -} -.fa-check-square:before { - content: "\f14a"; -} -.fa-pencil-square:before { - content: "\f14b"; -} -.fa-external-link-square:before { - content: "\f14c"; -} -.fa-share-square:before { - content: "\f14d"; -} -.fa-compass:before { - content: "\f14e"; -} -.fa-toggle-down:before, -.fa-caret-square-o-down:before { - content: "\f150"; -} -.fa-toggle-up:before, -.fa-caret-square-o-up:before { - content: "\f151"; -} -.fa-toggle-right:before, -.fa-caret-square-o-right:before { - content: "\f152"; -} -.fa-euro:before, -.fa-eur:before { - content: "\f153"; -} -.fa-gbp:before { - content: "\f154"; -} -.fa-dollar:before, -.fa-usd:before { - content: "\f155"; -} -.fa-rupee:before, -.fa-inr:before { - content: "\f156"; -} -.fa-cny:before, -.fa-rmb:before, -.fa-yen:before, -.fa-jpy:before { - content: "\f157"; -} -.fa-ruble:before, -.fa-rouble:before, -.fa-rub:before { - content: "\f158"; -} -.fa-won:before, -.fa-krw:before { - content: "\f159"; -} -.fa-bitcoin:before, -.fa-btc:before { - content: "\f15a"; -} -.fa-file:before { - content: "\f15b"; -} -.fa-file-text:before { - content: "\f15c"; -} -.fa-sort-alpha-asc:before { - content: "\f15d"; -} -.fa-sort-alpha-desc:before { - content: "\f15e"; -} -.fa-sort-amount-asc:before { - content: "\f160"; -} -.fa-sort-amount-desc:before { - content: "\f161"; -} -.fa-sort-numeric-asc:before { - content: "\f162"; -} -.fa-sort-numeric-desc:before { - content: "\f163"; -} -.fa-thumbs-up:before { - content: "\f164"; -} -.fa-thumbs-down:before { - content: "\f165"; -} -.fa-youtube-square:before { - content: "\f166"; -} -.fa-youtube:before { - content: "\f167"; -} -.fa-xing:before { - content: "\f168"; -} -.fa-xing-square:before { - content: "\f169"; -} -.fa-youtube-play:before { - content: "\f16a"; -} -.fa-dropbox:before { - content: "\f16b"; -} -.fa-stack-overflow:before { - content: "\f16c"; -} -.fa-instagram:before { - content: "\f16d"; -} -.fa-flickr:before { - content: "\f16e"; -} -.fa-adn:before { - content: "\f170"; -} -.fa-bitbucket:before { - content: "\f171"; -} -.fa-bitbucket-square:before { - content: "\f172"; -} -.fa-tumblr:before { - content: "\f173"; -} -.fa-tumblr-square:before { - content: "\f174"; -} -.fa-long-arrow-down:before { - content: "\f175"; -} -.fa-long-arrow-up:before { - content: "\f176"; -} -.fa-long-arrow-left:before { - content: "\f177"; -} -.fa-long-arrow-right:before { - content: "\f178"; -} -.fa-apple:before { - content: "\f179"; -} -.fa-windows:before { - content: "\f17a"; -} -.fa-android:before { - content: "\f17b"; -} -.fa-linux:before { - content: "\f17c"; -} -.fa-dribbble:before { - content: "\f17d"; -} -.fa-skype:before { - content: "\f17e"; -} -.fa-foursquare:before { - content: "\f180"; -} -.fa-trello:before { - content: "\f181"; -} -.fa-female:before { - content: "\f182"; -} -.fa-male:before { - content: "\f183"; -} -.fa-gittip:before, -.fa-gratipay:before { - content: "\f184"; -} -.fa-sun-o:before { - content: "\f185"; -} -.fa-moon-o:before { - content: "\f186"; -} -.fa-archive:before { - content: "\f187"; -} -.fa-bug:before { - content: "\f188"; -} -.fa-vk:before { - content: "\f189"; -} -.fa-weibo:before { - content: "\f18a"; -} -.fa-renren:before { - content: "\f18b"; -} -.fa-pagelines:before { - content: "\f18c"; -} -.fa-stack-exchange:before { - content: "\f18d"; -} -.fa-arrow-circle-o-right:before { - content: "\f18e"; -} -.fa-arrow-circle-o-left:before { - content: "\f190"; -} -.fa-toggle-left:before, -.fa-caret-square-o-left:before { - content: "\f191"; -} -.fa-dot-circle-o:before { - content: "\f192"; -} -.fa-wheelchair:before { - content: "\f193"; -} -.fa-vimeo-square:before { - content: "\f194"; -} -.fa-turkish-lira:before, -.fa-try:before { - content: "\f195"; -} -.fa-plus-square-o:before { - content: "\f196"; -} -.fa-space-shuttle:before { - content: "\f197"; -} -.fa-slack:before { - content: "\f198"; -} -.fa-envelope-square:before { - content: "\f199"; -} -.fa-wordpress:before { - content: "\f19a"; -} -.fa-openid:before { - content: "\f19b"; -} -.fa-institution:before, -.fa-bank:before, -.fa-university:before { - content: "\f19c"; -} -.fa-mortar-board:before, -.fa-graduation-cap:before { - content: "\f19d"; -} -.fa-yahoo:before { - content: "\f19e"; -} -.fa-google:before { - content: "\f1a0"; -} -.fa-reddit:before { - content: "\f1a1"; -} -.fa-reddit-square:before { - content: "\f1a2"; -} -.fa-stumbleupon-circle:before { - content: "\f1a3"; -} -.fa-stumbleupon:before { - content: "\f1a4"; -} -.fa-delicious:before { - content: "\f1a5"; -} -.fa-digg:before { - content: "\f1a6"; -} -.fa-pied-piper-pp:before { - content: "\f1a7"; -} -.fa-pied-piper-alt:before { - content: "\f1a8"; -} -.fa-drupal:before { - content: "\f1a9"; -} -.fa-joomla:before { - content: "\f1aa"; -} -.fa-language:before { - content: "\f1ab"; -} -.fa-fax:before { - content: "\f1ac"; -} -.fa-building:before { - content: "\f1ad"; -} -.fa-child:before { - content: "\f1ae"; -} -.fa-paw:before { - content: "\f1b0"; -} -.fa-spoon:before { - content: "\f1b1"; -} -.fa-cube:before { - content: "\f1b2"; -} -.fa-cubes:before { - content: "\f1b3"; -} -.fa-behance:before { - content: "\f1b4"; -} -.fa-behance-square:before { - content: "\f1b5"; -} -.fa-steam:before { - content: "\f1b6"; -} -.fa-steam-square:before { - content: "\f1b7"; -} -.fa-recycle:before { - content: "\f1b8"; -} -.fa-automobile:before, -.fa-car:before { - content: "\f1b9"; -} -.fa-cab:before, -.fa-taxi:before { - content: "\f1ba"; -} -.fa-tree:before { - content: "\f1bb"; -} -.fa-spotify:before { - content: "\f1bc"; -} -.fa-deviantart:before { - content: "\f1bd"; -} -.fa-soundcloud:before { - content: "\f1be"; -} -.fa-database:before { - content: "\f1c0"; -} -.fa-file-pdf-o:before { - content: "\f1c1"; -} -.fa-file-word-o:before { - content: "\f1c2"; -} -.fa-file-excel-o:before { - content: "\f1c3"; -} -.fa-file-powerpoint-o:before { - content: "\f1c4"; -} -.fa-file-photo-o:before, -.fa-file-picture-o:before, -.fa-file-image-o:before { - content: "\f1c5"; -} -.fa-file-zip-o:before, -.fa-file-archive-o:before { - content: "\f1c6"; -} -.fa-file-sound-o:before, -.fa-file-audio-o:before { - content: "\f1c7"; -} -.fa-file-movie-o:before, -.fa-file-video-o:before { - content: "\f1c8"; -} -.fa-file-code-o:before { - content: "\f1c9"; -} -.fa-vine:before { - content: "\f1ca"; -} -.fa-codepen:before { - content: "\f1cb"; -} -.fa-jsfiddle:before { - content: "\f1cc"; -} -.fa-life-bouy:before, -.fa-life-buoy:before, -.fa-life-saver:before, -.fa-support:before, -.fa-life-ring:before { - content: "\f1cd"; -} -.fa-circle-o-notch:before { - content: "\f1ce"; -} -.fa-ra:before, -.fa-resistance:before, -.fa-rebel:before { - content: "\f1d0"; -} -.fa-ge:before, -.fa-empire:before { - content: "\f1d1"; -} -.fa-git-square:before { - content: "\f1d2"; -} -.fa-git:before { - content: "\f1d3"; -} -.fa-y-combinator-square:before, -.fa-yc-square:before, -.fa-hacker-news:before { - content: "\f1d4"; -} -.fa-tencent-weibo:before { - content: "\f1d5"; -} -.fa-qq:before { - content: "\f1d6"; -} -.fa-wechat:before, -.fa-weixin:before { - content: "\f1d7"; -} -.fa-send:before, -.fa-paper-plane:before { - content: "\f1d8"; -} -.fa-send-o:before, -.fa-paper-plane-o:before { - content: "\f1d9"; -} -.fa-history:before { - content: "\f1da"; -} -.fa-circle-thin:before { - content: "\f1db"; -} -.fa-header:before { - content: "\f1dc"; -} -.fa-paragraph:before { - content: "\f1dd"; -} -.fa-sliders:before { - content: "\f1de"; -} -.fa-share-alt:before { - content: "\f1e0"; -} -.fa-share-alt-square:before { - content: "\f1e1"; -} -.fa-bomb:before { - content: "\f1e2"; -} -.fa-soccer-ball-o:before, -.fa-futbol-o:before { - content: "\f1e3"; -} -.fa-tty:before { - content: "\f1e4"; -} -.fa-binoculars:before { - content: "\f1e5"; -} -.fa-plug:before { - content: "\f1e6"; -} -.fa-slideshare:before { - content: "\f1e7"; -} -.fa-twitch:before { - content: "\f1e8"; -} -.fa-yelp:before { - content: "\f1e9"; -} -.fa-newspaper-o:before { - content: "\f1ea"; -} -.fa-wifi:before { - content: "\f1eb"; -} -.fa-calculator:before { - content: "\f1ec"; -} -.fa-paypal:before { - content: "\f1ed"; -} -.fa-google-wallet:before { - content: "\f1ee"; -} -.fa-cc-visa:before { - content: "\f1f0"; -} -.fa-cc-mastercard:before { - content: "\f1f1"; -} -.fa-cc-discover:before { - content: "\f1f2"; -} -.fa-cc-amex:before { - content: "\f1f3"; -} -.fa-cc-paypal:before { - content: "\f1f4"; -} -.fa-cc-stripe:before { - content: "\f1f5"; -} -.fa-bell-slash:before { - content: "\f1f6"; -} -.fa-bell-slash-o:before { - content: "\f1f7"; -} -.fa-trash:before { - content: "\f1f8"; -} -.fa-copyright:before { - content: "\f1f9"; -} -.fa-at:before { - content: "\f1fa"; -} -.fa-eyedropper:before { - content: "\f1fb"; -} -.fa-paint-brush:before { - content: "\f1fc"; -} -.fa-birthday-cake:before { - content: "\f1fd"; -} -.fa-area-chart:before { - content: "\f1fe"; -} -.fa-pie-chart:before { - content: "\f200"; -} -.fa-line-chart:before { - content: "\f201"; -} -.fa-lastfm:before { - content: "\f202"; -} -.fa-lastfm-square:before { - content: "\f203"; -} -.fa-toggle-off:before { - content: "\f204"; -} -.fa-toggle-on:before { - content: "\f205"; -} -.fa-bicycle:before { - content: "\f206"; -} -.fa-bus:before { - content: "\f207"; -} -.fa-ioxhost:before { - content: "\f208"; -} -.fa-angellist:before { - content: "\f209"; -} -.fa-cc:before { - content: "\f20a"; -} -.fa-shekel:before, -.fa-sheqel:before, -.fa-ils:before { - content: "\f20b"; -} -.fa-meanpath:before { - content: "\f20c"; -} -.fa-buysellads:before { - content: "\f20d"; -} -.fa-connectdevelop:before { - content: "\f20e"; -} -.fa-dashcube:before { - content: "\f210"; -} -.fa-forumbee:before { - content: "\f211"; -} -.fa-leanpub:before { - content: "\f212"; -} -.fa-sellsy:before { - content: "\f213"; -} -.fa-shirtsinbulk:before { - content: "\f214"; -} -.fa-simplybuilt:before { - content: "\f215"; -} -.fa-skyatlas:before { - content: "\f216"; -} -.fa-cart-plus:before { - content: "\f217"; -} -.fa-cart-arrow-down:before { - content: "\f218"; -} -.fa-diamond:before { - content: "\f219"; -} -.fa-ship:before { - content: "\f21a"; -} -.fa-user-secret:before { - content: "\f21b"; -} -.fa-motorcycle:before { - content: "\f21c"; -} -.fa-street-view:before { - content: "\f21d"; -} -.fa-heartbeat:before { - content: "\f21e"; -} -.fa-venus:before { - content: "\f221"; -} -.fa-mars:before { - content: "\f222"; -} -.fa-mercury:before { - content: "\f223"; -} -.fa-intersex:before, -.fa-transgender:before { - content: "\f224"; -} -.fa-transgender-alt:before { - content: "\f225"; -} -.fa-venus-double:before { - content: "\f226"; -} -.fa-mars-double:before { - content: "\f227"; -} -.fa-venus-mars:before { - content: "\f228"; -} -.fa-mars-stroke:before { - content: "\f229"; -} -.fa-mars-stroke-v:before { - content: "\f22a"; -} -.fa-mars-stroke-h:before { - content: "\f22b"; -} -.fa-neuter:before { - content: "\f22c"; -} -.fa-genderless:before { - content: "\f22d"; -} -.fa-facebook-official:before { - content: "\f230"; -} -.fa-pinterest-p:before { - content: "\f231"; -} -.fa-whatsapp:before { - content: "\f232"; -} -.fa-server:before { - content: "\f233"; -} -.fa-user-plus:before { - content: "\f234"; -} -.fa-user-times:before { - content: "\f235"; -} -.fa-hotel:before, -.fa-bed:before { - content: "\f236"; -} -.fa-viacoin:before { - content: "\f237"; -} -.fa-train:before { - content: "\f238"; -} -.fa-subway:before { - content: "\f239"; -} -.fa-medium:before { - content: "\f23a"; -} -.fa-yc:before, -.fa-y-combinator:before { - content: "\f23b"; -} -.fa-optin-monster:before { - content: "\f23c"; -} -.fa-opencart:before { - content: "\f23d"; -} -.fa-expeditedssl:before { - content: "\f23e"; -} -.fa-battery-4:before, -.fa-battery:before, -.fa-battery-full:before { - content: "\f240"; -} -.fa-battery-3:before, -.fa-battery-three-quarters:before { - content: "\f241"; -} -.fa-battery-2:before, -.fa-battery-half:before { - content: "\f242"; -} -.fa-battery-1:before, -.fa-battery-quarter:before { - content: "\f243"; -} -.fa-battery-0:before, -.fa-battery-empty:before { - content: "\f244"; -} -.fa-mouse-pointer:before { - content: "\f245"; -} -.fa-i-cursor:before { - content: "\f246"; -} -.fa-object-group:before { - content: "\f247"; -} -.fa-object-ungroup:before { - content: "\f248"; -} -.fa-sticky-note:before { - content: "\f249"; -} -.fa-sticky-note-o:before { - content: "\f24a"; -} -.fa-cc-jcb:before { - content: "\f24b"; -} -.fa-cc-diners-club:before { - content: "\f24c"; -} -.fa-clone:before { - content: "\f24d"; -} -.fa-balance-scale:before { - content: "\f24e"; -} -.fa-hourglass-o:before { - content: "\f250"; -} -.fa-hourglass-1:before, -.fa-hourglass-start:before { - content: "\f251"; -} -.fa-hourglass-2:before, -.fa-hourglass-half:before { - content: "\f252"; -} -.fa-hourglass-3:before, -.fa-hourglass-end:before { - content: "\f253"; -} -.fa-hourglass:before { - content: "\f254"; -} -.fa-hand-grab-o:before, -.fa-hand-rock-o:before { - content: "\f255"; -} -.fa-hand-stop-o:before, -.fa-hand-paper-o:before { - content: "\f256"; -} -.fa-hand-scissors-o:before { - content: "\f257"; -} -.fa-hand-lizard-o:before { - content: "\f258"; -} -.fa-hand-spock-o:before { - content: "\f259"; -} -.fa-hand-pointer-o:before { - content: "\f25a"; -} -.fa-hand-peace-o:before { - content: "\f25b"; -} -.fa-trademark:before { - content: "\f25c"; -} -.fa-registered:before { - content: "\f25d"; -} -.fa-creative-commons:before { - content: "\f25e"; -} -.fa-gg:before { - content: "\f260"; -} -.fa-gg-circle:before { - content: "\f261"; -} -.fa-tripadvisor:before { - content: "\f262"; -} -.fa-odnoklassniki:before { - content: "\f263"; -} -.fa-odnoklassniki-square:before { - content: "\f264"; -} -.fa-get-pocket:before { - content: "\f265"; -} -.fa-wikipedia-w:before { - content: "\f266"; -} -.fa-safari:before { - content: "\f267"; -} -.fa-chrome:before { - content: "\f268"; -} -.fa-firefox:before { - content: "\f269"; -} -.fa-opera:before { - content: "\f26a"; -} -.fa-internet-explorer:before { - content: "\f26b"; -} -.fa-tv:before, -.fa-television:before { - content: "\f26c"; -} -.fa-contao:before { - content: "\f26d"; -} -.fa-500px:before { - content: "\f26e"; -} -.fa-amazon:before { - content: "\f270"; -} -.fa-calendar-plus-o:before { - content: "\f271"; -} -.fa-calendar-minus-o:before { - content: "\f272"; -} -.fa-calendar-times-o:before { - content: "\f273"; -} -.fa-calendar-check-o:before { - content: "\f274"; -} -.fa-industry:before { - content: "\f275"; -} -.fa-map-pin:before { - content: "\f276"; -} -.fa-map-signs:before { - content: "\f277"; -} -.fa-map-o:before { - content: "\f278"; -} -.fa-map:before { - content: "\f279"; -} -.fa-commenting:before { - content: "\f27a"; -} -.fa-commenting-o:before { - content: "\f27b"; -} -.fa-houzz:before { - content: "\f27c"; -} -.fa-vimeo:before { - content: "\f27d"; -} -.fa-black-tie:before { - content: "\f27e"; -} -.fa-fonticons:before { - content: "\f280"; -} -.fa-reddit-alien:before { - content: "\f281"; -} -.fa-edge:before { - content: "\f282"; -} -.fa-credit-card-alt:before { - content: "\f283"; -} -.fa-codiepie:before { - content: "\f284"; -} -.fa-modx:before { - content: "\f285"; -} -.fa-fort-awesome:before { - content: "\f286"; -} -.fa-usb:before { - content: "\f287"; -} -.fa-product-hunt:before { - content: "\f288"; -} -.fa-mixcloud:before { - content: "\f289"; -} -.fa-scribd:before { - content: "\f28a"; -} -.fa-pause-circle:before { - content: "\f28b"; -} -.fa-pause-circle-o:before { - content: "\f28c"; -} -.fa-stop-circle:before { - content: "\f28d"; -} -.fa-stop-circle-o:before { - content: "\f28e"; -} -.fa-shopping-bag:before { - content: "\f290"; -} -.fa-shopping-basket:before { - content: "\f291"; -} -.fa-hashtag:before { - content: "\f292"; -} -.fa-bluetooth:before { - content: "\f293"; -} -.fa-bluetooth-b:before { - content: "\f294"; -} -.fa-percent:before { - content: "\f295"; -} -.fa-gitlab:before { - content: "\f296"; -} -.fa-wpbeginner:before { - content: "\f297"; -} -.fa-wpforms:before { - content: "\f298"; -} -.fa-envira:before { - content: "\f299"; -} -.fa-universal-access:before { - content: "\f29a"; -} -.fa-wheelchair-alt:before { - content: "\f29b"; -} -.fa-question-circle-o:before { - content: "\f29c"; -} -.fa-blind:before { - content: "\f29d"; -} -.fa-audio-description:before { - content: "\f29e"; -} -.fa-volume-control-phone:before { - content: "\f2a0"; -} -.fa-braille:before { - content: "\f2a1"; -} -.fa-assistive-listening-systems:before { - content: "\f2a2"; -} -.fa-asl-interpreting:before, -.fa-american-sign-language-interpreting:before { - content: "\f2a3"; -} -.fa-deafness:before, -.fa-hard-of-hearing:before, -.fa-deaf:before { - content: "\f2a4"; -} -.fa-glide:before { - content: "\f2a5"; -} -.fa-glide-g:before { - content: "\f2a6"; -} -.fa-signing:before, -.fa-sign-language:before { - content: "\f2a7"; -} -.fa-low-vision:before { - content: "\f2a8"; -} -.fa-viadeo:before { - content: "\f2a9"; -} -.fa-viadeo-square:before { - content: "\f2aa"; -} -.fa-snapchat:before { - content: "\f2ab"; -} -.fa-snapchat-ghost:before { - content: "\f2ac"; -} -.fa-snapchat-square:before { - content: "\f2ad"; -} -.fa-pied-piper:before { - content: "\f2ae"; -} -.fa-first-order:before { - content: "\f2b0"; -} -.fa-yoast:before { - content: "\f2b1"; -} -.fa-themeisle:before { - content: "\f2b2"; -} -.fa-google-plus-circle:before, -.fa-google-plus-official:before { - content: "\f2b3"; -} -.fa-fa:before, -.fa-font-awesome:before { - content: "\f2b4"; -} -.fa-handshake-o:before { - content: "\f2b5"; -} -.fa-envelope-open:before { - content: "\f2b6"; -} -.fa-envelope-open-o:before { - content: "\f2b7"; -} -.fa-linode:before { - content: "\f2b8"; -} -.fa-address-book:before { - content: "\f2b9"; -} -.fa-address-book-o:before { - content: "\f2ba"; -} -.fa-vcard:before, -.fa-address-card:before { - content: "\f2bb"; -} -.fa-vcard-o:before, -.fa-address-card-o:before { - content: "\f2bc"; -} -.fa-user-circle:before { - content: "\f2bd"; -} -.fa-user-circle-o:before { - content: "\f2be"; -} -.fa-user-o:before { - content: "\f2c0"; -} -.fa-id-badge:before { - content: "\f2c1"; -} -.fa-drivers-license:before, -.fa-id-card:before { - content: "\f2c2"; -} -.fa-drivers-license-o:before, -.fa-id-card-o:before { - content: "\f2c3"; -} -.fa-quora:before { - content: "\f2c4"; -} -.fa-free-code-camp:before { - content: "\f2c5"; -} -.fa-telegram:before { - content: "\f2c6"; -} -.fa-thermometer-4:before, -.fa-thermometer:before, -.fa-thermometer-full:before { - content: "\f2c7"; -} -.fa-thermometer-3:before, -.fa-thermometer-three-quarters:before { - content: "\f2c8"; -} -.fa-thermometer-2:before, -.fa-thermometer-half:before { - content: "\f2c9"; -} -.fa-thermometer-1:before, -.fa-thermometer-quarter:before { - content: "\f2ca"; -} -.fa-thermometer-0:before, -.fa-thermometer-empty:before { - content: "\f2cb"; -} -.fa-shower:before { - content: "\f2cc"; -} -.fa-bathtub:before, -.fa-s15:before, -.fa-bath:before { - content: "\f2cd"; -} -.fa-podcast:before { - content: "\f2ce"; -} -.fa-window-maximize:before { - content: "\f2d0"; -} -.fa-window-minimize:before { - content: "\f2d1"; -} -.fa-window-restore:before { - content: "\f2d2"; -} -.fa-times-rectangle:before, -.fa-window-close:before { - content: "\f2d3"; -} -.fa-times-rectangle-o:before, -.fa-window-close-o:before { - content: "\f2d4"; -} -.fa-bandcamp:before { - content: "\f2d5"; -} -.fa-grav:before { - content: "\f2d6"; -} -.fa-etsy:before { - content: "\f2d7"; -} -.fa-imdb:before { - content: "\f2d8"; -} -.fa-ravelry:before { - content: "\f2d9"; -} -.fa-eercast:before { - content: "\f2da"; -} -.fa-microchip:before { - content: "\f2db"; -} -.fa-snowflake-o:before { - content: "\f2dc"; -} -.fa-superpowers:before { - content: "\f2dd"; -} -.fa-wpexplorer:before { - content: "\f2de"; -} -.fa-meetup:before { - content: "\f2e0"; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} diff --git a/public/assets/fonts/font-awesome-4.7.0/css/font-awesome.min.css b/public/assets/fonts/font-awesome-4.7.0/css/font-awesome.min.css deleted file mode 100644 index 540440c..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/public/assets/fonts/font-awesome-4.7.0/fonts/FontAwesome.otf b/public/assets/fonts/font-awesome-4.7.0/fonts/FontAwesome.otf deleted file mode 100644 index 401ec0f..0000000 Binary files a/public/assets/fonts/font-awesome-4.7.0/fonts/FontAwesome.otf and /dev/null differ diff --git a/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.eot b/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.eot deleted file mode 100644 index e9f60ca..0000000 Binary files a/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.svg b/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.svg deleted file mode 100644 index 855c845..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,2671 +0,0 @@ - - - - -Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 - By ,,, -Copyright Dave Gandy 2016. All rights reserved. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf b/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 35acda2..0000000 Binary files a/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.woff b/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.woff deleted file mode 100644 index 400014a4..0000000 Binary files a/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 b/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 4d13fc6..0000000 Binary files a/public/assets/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 and /dev/null differ diff --git a/public/assets/fonts/font-awesome-4.7.0/less/animated.less b/public/assets/fonts/font-awesome-4.7.0/less/animated.less deleted file mode 100644 index 66ad52a..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/animated.less +++ /dev/null @@ -1,34 +0,0 @@ -// Animated Icons -// -------------------------- - -.@{fa-css-prefix}-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} - -.@{fa-css-prefix}-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} diff --git a/public/assets/fonts/font-awesome-4.7.0/less/bordered-pulled.less b/public/assets/fonts/font-awesome-4.7.0/less/bordered-pulled.less deleted file mode 100644 index f1c8ad7..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/bordered-pulled.less +++ /dev/null @@ -1,25 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.@{fa-css-prefix}-border { - padding: .2em .25em .15em; - border: solid .08em @fa-border-color; - border-radius: .1em; -} - -.@{fa-css-prefix}-pull-left { float: left; } -.@{fa-css-prefix}-pull-right { float: right; } - -.@{fa-css-prefix} { - &.@{fa-css-prefix}-pull-left { margin-right: .3em; } - &.@{fa-css-prefix}-pull-right { margin-left: .3em; } -} - -/* Deprecated as of 4.4.0 */ -.pull-right { float: right; } -.pull-left { float: left; } - -.@{fa-css-prefix} { - &.pull-left { margin-right: .3em; } - &.pull-right { margin-left: .3em; } -} diff --git a/public/assets/fonts/font-awesome-4.7.0/less/core.less b/public/assets/fonts/font-awesome-4.7.0/less/core.less deleted file mode 100644 index c577ac8..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/core.less +++ /dev/null @@ -1,12 +0,0 @@ -// Base Class Definition -// ------------------------- - -.@{fa-css-prefix} { - display: inline-block; - font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} diff --git a/public/assets/fonts/font-awesome-4.7.0/less/fixed-width.less b/public/assets/fonts/font-awesome-4.7.0/less/fixed-width.less deleted file mode 100644 index 110289f..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/fixed-width.less +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.@{fa-css-prefix}-fw { - width: (18em / 14); - text-align: center; -} diff --git a/public/assets/fonts/font-awesome-4.7.0/less/font-awesome.less b/public/assets/fonts/font-awesome-4.7.0/less/font-awesome.less deleted file mode 100644 index c3677de..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/font-awesome.less +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ - -@import "variables.less"; -@import "mixins.less"; -@import "path.less"; -@import "core.less"; -@import "larger.less"; -@import "fixed-width.less"; -@import "list.less"; -@import "bordered-pulled.less"; -@import "animated.less"; -@import "rotated-flipped.less"; -@import "stacked.less"; -@import "icons.less"; -@import "screen-reader.less"; diff --git a/public/assets/fonts/font-awesome-4.7.0/less/icons.less b/public/assets/fonts/font-awesome-4.7.0/less/icons.less deleted file mode 100644 index 159d600..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/icons.less +++ /dev/null @@ -1,789 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - -.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } -.@{fa-css-prefix}-music:before { content: @fa-var-music; } -.@{fa-css-prefix}-search:before { content: @fa-var-search; } -.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } -.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } -.@{fa-css-prefix}-star:before { content: @fa-var-star; } -.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } -.@{fa-css-prefix}-user:before { content: @fa-var-user; } -.@{fa-css-prefix}-film:before { content: @fa-var-film; } -.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } -.@{fa-css-prefix}-th:before { content: @fa-var-th; } -.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } -.@{fa-css-prefix}-check:before { content: @fa-var-check; } -.@{fa-css-prefix}-remove:before, -.@{fa-css-prefix}-close:before, -.@{fa-css-prefix}-times:before { content: @fa-var-times; } -.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } -.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } -.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } -.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } -.@{fa-css-prefix}-gear:before, -.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } -.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } -.@{fa-css-prefix}-home:before { content: @fa-var-home; } -.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } -.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } -.@{fa-css-prefix}-road:before { content: @fa-var-road; } -.@{fa-css-prefix}-download:before { content: @fa-var-download; } -.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } -.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } -.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } -.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } -.@{fa-css-prefix}-rotate-right:before, -.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } -.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } -.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } -.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } -.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } -.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } -.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } -.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } -.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } -.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } -.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } -.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } -.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } -.@{fa-css-prefix}-book:before { content: @fa-var-book; } -.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } -.@{fa-css-prefix}-print:before { content: @fa-var-print; } -.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } -.@{fa-css-prefix}-font:before { content: @fa-var-font; } -.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } -.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } -.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } -.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } -.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } -.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } -.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } -.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } -.@{fa-css-prefix}-list:before { content: @fa-var-list; } -.@{fa-css-prefix}-dedent:before, -.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } -.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } -.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } -.@{fa-css-prefix}-photo:before, -.@{fa-css-prefix}-image:before, -.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } -.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } -.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } -.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } -.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } -.@{fa-css-prefix}-edit:before, -.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } -.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } -.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } -.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } -.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } -.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } -.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } -.@{fa-css-prefix}-play:before { content: @fa-var-play; } -.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } -.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } -.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } -.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } -.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } -.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } -.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } -.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } -.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } -.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } -.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } -.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } -.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } -.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } -.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } -.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } -.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } -.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } -.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } -.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } -.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } -.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } -.@{fa-css-prefix}-mail-forward:before, -.@{fa-css-prefix}-share:before { content: @fa-var-share; } -.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } -.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } -.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } -.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } -.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } -.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } -.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } -.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } -.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } -.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } -.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } -.@{fa-css-prefix}-warning:before, -.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } -.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } -.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } -.@{fa-css-prefix}-random:before { content: @fa-var-random; } -.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } -.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } -.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } -.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } -.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } -.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } -.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } -.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } -.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } -.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } -.@{fa-css-prefix}-bar-chart-o:before, -.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } -.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } -.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } -.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } -.@{fa-css-prefix}-key:before { content: @fa-var-key; } -.@{fa-css-prefix}-gears:before, -.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } -.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } -.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } -.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } -.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } -.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } -.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } -.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } -.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } -.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } -.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } -.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } -.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } -.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } -.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } -.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } -.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } -.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } -.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } -.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } -.@{fa-css-prefix}-facebook-f:before, -.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } -.@{fa-css-prefix}-github:before { content: @fa-var-github; } -.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } -.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } -.@{fa-css-prefix}-feed:before, -.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } -.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } -.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } -.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } -.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } -.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } -.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } -.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } -.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } -.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } -.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } -.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } -.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } -.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } -.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } -.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } -.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } -.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } -.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } -.@{fa-css-prefix}-group:before, -.@{fa-css-prefix}-users:before { content: @fa-var-users; } -.@{fa-css-prefix}-chain:before, -.@{fa-css-prefix}-link:before { content: @fa-var-link; } -.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } -.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } -.@{fa-css-prefix}-cut:before, -.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } -.@{fa-css-prefix}-copy:before, -.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } -.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } -.@{fa-css-prefix}-save:before, -.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } -.@{fa-css-prefix}-square:before { content: @fa-var-square; } -.@{fa-css-prefix}-navicon:before, -.@{fa-css-prefix}-reorder:before, -.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } -.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } -.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } -.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } -.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } -.@{fa-css-prefix}-table:before { content: @fa-var-table; } -.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } -.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } -.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } -.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } -.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } -.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } -.@{fa-css-prefix}-money:before { content: @fa-var-money; } -.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } -.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } -.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } -.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } -.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } -.@{fa-css-prefix}-unsorted:before, -.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } -.@{fa-css-prefix}-sort-down:before, -.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } -.@{fa-css-prefix}-sort-up:before, -.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } -.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } -.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } -.@{fa-css-prefix}-rotate-left:before, -.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } -.@{fa-css-prefix}-legal:before, -.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } -.@{fa-css-prefix}-dashboard:before, -.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } -.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } -.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } -.@{fa-css-prefix}-flash:before, -.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } -.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } -.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } -.@{fa-css-prefix}-paste:before, -.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } -.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } -.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } -.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } -.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } -.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } -.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } -.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } -.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } -.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } -.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } -.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } -.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } -.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } -.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } -.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } -.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } -.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } -.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } -.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } -.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } -.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } -.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } -.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } -.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } -.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } -.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } -.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } -.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } -.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } -.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } -.@{fa-css-prefix}-mobile-phone:before, -.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } -.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } -.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } -.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } -.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } -.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } -.@{fa-css-prefix}-mail-reply:before, -.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } -.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } -.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } -.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } -.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } -.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } -.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } -.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } -.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } -.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } -.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } -.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } -.@{fa-css-prefix}-code:before { content: @fa-var-code; } -.@{fa-css-prefix}-mail-reply-all:before, -.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } -.@{fa-css-prefix}-star-half-empty:before, -.@{fa-css-prefix}-star-half-full:before, -.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } -.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } -.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } -.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } -.@{fa-css-prefix}-unlink:before, -.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } -.@{fa-css-prefix}-question:before { content: @fa-var-question; } -.@{fa-css-prefix}-info:before { content: @fa-var-info; } -.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } -.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } -.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } -.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } -.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } -.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } -.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } -.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } -.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } -.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } -.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } -.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } -.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } -.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } -.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } -.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } -.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } -.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } -.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } -.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } -.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } -.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } -.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } -.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } -.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } -.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } -.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } -.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } -.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } -.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } -.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } -.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } -.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } -.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } -.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } -.@{fa-css-prefix}-toggle-down:before, -.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } -.@{fa-css-prefix}-toggle-up:before, -.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } -.@{fa-css-prefix}-toggle-right:before, -.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } -.@{fa-css-prefix}-euro:before, -.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } -.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } -.@{fa-css-prefix}-dollar:before, -.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } -.@{fa-css-prefix}-rupee:before, -.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } -.@{fa-css-prefix}-cny:before, -.@{fa-css-prefix}-rmb:before, -.@{fa-css-prefix}-yen:before, -.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } -.@{fa-css-prefix}-ruble:before, -.@{fa-css-prefix}-rouble:before, -.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } -.@{fa-css-prefix}-won:before, -.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } -.@{fa-css-prefix}-bitcoin:before, -.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } -.@{fa-css-prefix}-file:before { content: @fa-var-file; } -.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } -.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } -.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } -.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } -.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } -.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } -.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } -.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } -.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } -.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } -.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } -.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } -.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } -.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } -.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } -.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } -.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } -.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } -.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } -.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } -.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } -.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } -.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } -.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } -.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } -.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } -.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } -.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } -.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } -.@{fa-css-prefix}-android:before { content: @fa-var-android; } -.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } -.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } -.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } -.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } -.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } -.@{fa-css-prefix}-female:before { content: @fa-var-female; } -.@{fa-css-prefix}-male:before { content: @fa-var-male; } -.@{fa-css-prefix}-gittip:before, -.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } -.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } -.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } -.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } -.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } -.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } -.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } -.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } -.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } -.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } -.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } -.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } -.@{fa-css-prefix}-toggle-left:before, -.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } -.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } -.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } -.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } -.@{fa-css-prefix}-turkish-lira:before, -.@{fa-css-prefix}-try:before { content: @fa-var-try; } -.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } -.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } -.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } -.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } -.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } -.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } -.@{fa-css-prefix}-institution:before, -.@{fa-css-prefix}-bank:before, -.@{fa-css-prefix}-university:before { content: @fa-var-university; } -.@{fa-css-prefix}-mortar-board:before, -.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } -.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } -.@{fa-css-prefix}-google:before { content: @fa-var-google; } -.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } -.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } -.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } -.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } -.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } -.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } -.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } -.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } -.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } -.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } -.@{fa-css-prefix}-language:before { content: @fa-var-language; } -.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } -.@{fa-css-prefix}-building:before { content: @fa-var-building; } -.@{fa-css-prefix}-child:before { content: @fa-var-child; } -.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } -.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } -.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } -.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } -.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } -.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } -.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } -.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } -.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } -.@{fa-css-prefix}-automobile:before, -.@{fa-css-prefix}-car:before { content: @fa-var-car; } -.@{fa-css-prefix}-cab:before, -.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } -.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } -.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } -.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } -.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } -.@{fa-css-prefix}-database:before { content: @fa-var-database; } -.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } -.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } -.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } -.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } -.@{fa-css-prefix}-file-photo-o:before, -.@{fa-css-prefix}-file-picture-o:before, -.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } -.@{fa-css-prefix}-file-zip-o:before, -.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } -.@{fa-css-prefix}-file-sound-o:before, -.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } -.@{fa-css-prefix}-file-movie-o:before, -.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } -.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } -.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } -.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } -.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } -.@{fa-css-prefix}-life-bouy:before, -.@{fa-css-prefix}-life-buoy:before, -.@{fa-css-prefix}-life-saver:before, -.@{fa-css-prefix}-support:before, -.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } -.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } -.@{fa-css-prefix}-ra:before, -.@{fa-css-prefix}-resistance:before, -.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } -.@{fa-css-prefix}-ge:before, -.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } -.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } -.@{fa-css-prefix}-git:before { content: @fa-var-git; } -.@{fa-css-prefix}-y-combinator-square:before, -.@{fa-css-prefix}-yc-square:before, -.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } -.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } -.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } -.@{fa-css-prefix}-wechat:before, -.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } -.@{fa-css-prefix}-send:before, -.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } -.@{fa-css-prefix}-send-o:before, -.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } -.@{fa-css-prefix}-history:before { content: @fa-var-history; } -.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } -.@{fa-css-prefix}-header:before { content: @fa-var-header; } -.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } -.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } -.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } -.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } -.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } -.@{fa-css-prefix}-soccer-ball-o:before, -.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } -.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } -.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } -.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } -.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } -.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } -.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } -.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } -.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } -.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } -.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } -.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } -.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } -.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } -.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } -.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } -.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } -.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } -.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } -.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } -.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } -.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } -.@{fa-css-prefix}-at:before { content: @fa-var-at; } -.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } -.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } -.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } -.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } -.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } -.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } -.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } -.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } -.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } -.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } -.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } -.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } -.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } -.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } -.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } -.@{fa-css-prefix}-shekel:before, -.@{fa-css-prefix}-sheqel:before, -.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } -.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } -.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } -.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } -.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } -.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } -.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } -.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } -.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } -.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } -.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } -.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } -.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } -.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } -.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } -.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } -.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } -.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } -.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } -.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } -.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } -.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } -.@{fa-css-prefix}-intersex:before, -.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } -.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } -.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } -.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } -.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } -.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } -.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } -.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } -.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } -.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } -.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } -.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } -.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } -.@{fa-css-prefix}-server:before { content: @fa-var-server; } -.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } -.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } -.@{fa-css-prefix}-hotel:before, -.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } -.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } -.@{fa-css-prefix}-train:before { content: @fa-var-train; } -.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } -.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } -.@{fa-css-prefix}-yc:before, -.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } -.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } -.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } -.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } -.@{fa-css-prefix}-battery-4:before, -.@{fa-css-prefix}-battery:before, -.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } -.@{fa-css-prefix}-battery-3:before, -.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } -.@{fa-css-prefix}-battery-2:before, -.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } -.@{fa-css-prefix}-battery-1:before, -.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } -.@{fa-css-prefix}-battery-0:before, -.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } -.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } -.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } -.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } -.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } -.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } -.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } -.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } -.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } -.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } -.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } -.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } -.@{fa-css-prefix}-hourglass-1:before, -.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } -.@{fa-css-prefix}-hourglass-2:before, -.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } -.@{fa-css-prefix}-hourglass-3:before, -.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } -.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } -.@{fa-css-prefix}-hand-grab-o:before, -.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } -.@{fa-css-prefix}-hand-stop-o:before, -.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } -.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } -.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } -.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } -.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } -.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } -.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } -.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } -.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } -.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } -.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } -.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } -.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } -.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } -.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } -.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } -.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } -.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } -.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } -.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } -.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } -.@{fa-css-prefix}-tv:before, -.@{fa-css-prefix}-television:before { content: @fa-var-television; } -.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } -.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } -.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } -.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } -.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } -.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } -.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } -.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } -.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } -.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } -.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } -.@{fa-css-prefix}-map:before { content: @fa-var-map; } -.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } -.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } -.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } -.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } -.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } -.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } -.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } -.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } -.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } -.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } -.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } -.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } -.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } -.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } -.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } -.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } -.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } -.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } -.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } -.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } -.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } -.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } -.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } -.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } -.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } -.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } -.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } -.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } -.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } -.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } -.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } -.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } -.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } -.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } -.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } -.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } -.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } -.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } -.@{fa-css-prefix}-asl-interpreting:before, -.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } -.@{fa-css-prefix}-deafness:before, -.@{fa-css-prefix}-hard-of-hearing:before, -.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } -.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } -.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } -.@{fa-css-prefix}-signing:before, -.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } -.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } -.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } -.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } -.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } -.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } -.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } -.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } -.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } -.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } -.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } -.@{fa-css-prefix}-google-plus-circle:before, -.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } -.@{fa-css-prefix}-fa:before, -.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } -.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; } -.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; } -.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; } -.@{fa-css-prefix}-linode:before { content: @fa-var-linode; } -.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; } -.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; } -.@{fa-css-prefix}-vcard:before, -.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; } -.@{fa-css-prefix}-vcard-o:before, -.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; } -.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; } -.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; } -.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; } -.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; } -.@{fa-css-prefix}-drivers-license:before, -.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; } -.@{fa-css-prefix}-drivers-license-o:before, -.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; } -.@{fa-css-prefix}-quora:before { content: @fa-var-quora; } -.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; } -.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; } -.@{fa-css-prefix}-thermometer-4:before, -.@{fa-css-prefix}-thermometer:before, -.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; } -.@{fa-css-prefix}-thermometer-3:before, -.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; } -.@{fa-css-prefix}-thermometer-2:before, -.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; } -.@{fa-css-prefix}-thermometer-1:before, -.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; } -.@{fa-css-prefix}-thermometer-0:before, -.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; } -.@{fa-css-prefix}-shower:before { content: @fa-var-shower; } -.@{fa-css-prefix}-bathtub:before, -.@{fa-css-prefix}-s15:before, -.@{fa-css-prefix}-bath:before { content: @fa-var-bath; } -.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; } -.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; } -.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; } -.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; } -.@{fa-css-prefix}-times-rectangle:before, -.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; } -.@{fa-css-prefix}-times-rectangle-o:before, -.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; } -.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; } -.@{fa-css-prefix}-grav:before { content: @fa-var-grav; } -.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; } -.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; } -.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; } -.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; } -.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; } -.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; } -.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; } -.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; } -.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; } diff --git a/public/assets/fonts/font-awesome-4.7.0/less/larger.less b/public/assets/fonts/font-awesome-4.7.0/less/larger.less deleted file mode 100644 index c9d6467..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/larger.less +++ /dev/null @@ -1,13 +0,0 @@ -// Icon Sizes -// ------------------------- - -/* makes the font 33% larger relative to the icon container */ -.@{fa-css-prefix}-lg { - font-size: (4em / 3); - line-height: (3em / 4); - vertical-align: -15%; -} -.@{fa-css-prefix}-2x { font-size: 2em; } -.@{fa-css-prefix}-3x { font-size: 3em; } -.@{fa-css-prefix}-4x { font-size: 4em; } -.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/public/assets/fonts/font-awesome-4.7.0/less/list.less b/public/assets/fonts/font-awesome-4.7.0/less/list.less deleted file mode 100644 index 0b44038..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/list.less +++ /dev/null @@ -1,19 +0,0 @@ -// List Icons -// ------------------------- - -.@{fa-css-prefix}-ul { - padding-left: 0; - margin-left: @fa-li-width; - list-style-type: none; - > li { position: relative; } -} -.@{fa-css-prefix}-li { - position: absolute; - left: -@fa-li-width; - width: @fa-li-width; - top: (2em / 14); - text-align: center; - &.@{fa-css-prefix}-lg { - left: (-@fa-li-width + (4em / 14)); - } -} diff --git a/public/assets/fonts/font-awesome-4.7.0/less/mixins.less b/public/assets/fonts/font-awesome-4.7.0/less/mixins.less deleted file mode 100644 index beef231..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/mixins.less +++ /dev/null @@ -1,60 +0,0 @@ -// Mixins -// -------------------------- - -.fa-icon() { - display: inline-block; - font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} - -.fa-icon-rotate(@degrees, @rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; - -webkit-transform: rotate(@degrees); - -ms-transform: rotate(@degrees); - transform: rotate(@degrees); -} - -.fa-icon-flip(@horiz, @vert, @rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; - -webkit-transform: scale(@horiz, @vert); - -ms-transform: scale(@horiz, @vert); - transform: scale(@horiz, @vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -.sr-only() { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - border: 0; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -.sr-only-focusable() { - &:active, - &:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; - } -} diff --git a/public/assets/fonts/font-awesome-4.7.0/less/path.less b/public/assets/fonts/font-awesome-4.7.0/less/path.less deleted file mode 100644 index 835be41..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/path.less +++ /dev/null @@ -1,15 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); - src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), - url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), - url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), - url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), - url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); - // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; -} diff --git a/public/assets/fonts/font-awesome-4.7.0/less/rotated-flipped.less b/public/assets/fonts/font-awesome-4.7.0/less/rotated-flipped.less deleted file mode 100644 index f6ba814..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/rotated-flipped.less +++ /dev/null @@ -1,20 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } -.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } -.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } - -.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } -.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root .@{fa-css-prefix}-rotate-90, -:root .@{fa-css-prefix}-rotate-180, -:root .@{fa-css-prefix}-rotate-270, -:root .@{fa-css-prefix}-flip-horizontal, -:root .@{fa-css-prefix}-flip-vertical { - filter: none; -} diff --git a/public/assets/fonts/font-awesome-4.7.0/less/screen-reader.less b/public/assets/fonts/font-awesome-4.7.0/less/screen-reader.less deleted file mode 100644 index 11c1881..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/screen-reader.less +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { .sr-only(); } -.sr-only-focusable { .sr-only-focusable(); } diff --git a/public/assets/fonts/font-awesome-4.7.0/less/stacked.less b/public/assets/fonts/font-awesome-4.7.0/less/stacked.less deleted file mode 100644 index fc53fb0..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/stacked.less +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.@{fa-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.@{fa-css-prefix}-stack-1x { line-height: inherit; } -.@{fa-css-prefix}-stack-2x { font-size: 2em; } -.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/public/assets/fonts/font-awesome-4.7.0/less/variables.less b/public/assets/fonts/font-awesome-4.7.0/less/variables.less deleted file mode 100644 index 7ddbbc0..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/less/variables.less +++ /dev/null @@ -1,800 +0,0 @@ -// Variables -// -------------------------- - -@fa-font-path: "../fonts"; -@fa-font-size-base: 14px; -@fa-line-height-base: 1; -//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly -@fa-css-prefix: fa; -@fa-version: "4.7.0"; -@fa-border-color: #eee; -@fa-inverse: #fff; -@fa-li-width: (30em / 14); - -@fa-var-500px: "\f26e"; -@fa-var-address-book: "\f2b9"; -@fa-var-address-book-o: "\f2ba"; -@fa-var-address-card: "\f2bb"; -@fa-var-address-card-o: "\f2bc"; -@fa-var-adjust: "\f042"; -@fa-var-adn: "\f170"; -@fa-var-align-center: "\f037"; -@fa-var-align-justify: "\f039"; -@fa-var-align-left: "\f036"; -@fa-var-align-right: "\f038"; -@fa-var-amazon: "\f270"; -@fa-var-ambulance: "\f0f9"; -@fa-var-american-sign-language-interpreting: "\f2a3"; -@fa-var-anchor: "\f13d"; -@fa-var-android: "\f17b"; -@fa-var-angellist: "\f209"; -@fa-var-angle-double-down: "\f103"; -@fa-var-angle-double-left: "\f100"; -@fa-var-angle-double-right: "\f101"; -@fa-var-angle-double-up: "\f102"; -@fa-var-angle-down: "\f107"; -@fa-var-angle-left: "\f104"; -@fa-var-angle-right: "\f105"; -@fa-var-angle-up: "\f106"; -@fa-var-apple: "\f179"; -@fa-var-archive: "\f187"; -@fa-var-area-chart: "\f1fe"; -@fa-var-arrow-circle-down: "\f0ab"; -@fa-var-arrow-circle-left: "\f0a8"; -@fa-var-arrow-circle-o-down: "\f01a"; -@fa-var-arrow-circle-o-left: "\f190"; -@fa-var-arrow-circle-o-right: "\f18e"; -@fa-var-arrow-circle-o-up: "\f01b"; -@fa-var-arrow-circle-right: "\f0a9"; -@fa-var-arrow-circle-up: "\f0aa"; -@fa-var-arrow-down: "\f063"; -@fa-var-arrow-left: "\f060"; -@fa-var-arrow-right: "\f061"; -@fa-var-arrow-up: "\f062"; -@fa-var-arrows: "\f047"; -@fa-var-arrows-alt: "\f0b2"; -@fa-var-arrows-h: "\f07e"; -@fa-var-arrows-v: "\f07d"; -@fa-var-asl-interpreting: "\f2a3"; -@fa-var-assistive-listening-systems: "\f2a2"; -@fa-var-asterisk: "\f069"; -@fa-var-at: "\f1fa"; -@fa-var-audio-description: "\f29e"; -@fa-var-automobile: "\f1b9"; -@fa-var-backward: "\f04a"; -@fa-var-balance-scale: "\f24e"; -@fa-var-ban: "\f05e"; -@fa-var-bandcamp: "\f2d5"; -@fa-var-bank: "\f19c"; -@fa-var-bar-chart: "\f080"; -@fa-var-bar-chart-o: "\f080"; -@fa-var-barcode: "\f02a"; -@fa-var-bars: "\f0c9"; -@fa-var-bath: "\f2cd"; -@fa-var-bathtub: "\f2cd"; -@fa-var-battery: "\f240"; -@fa-var-battery-0: "\f244"; -@fa-var-battery-1: "\f243"; -@fa-var-battery-2: "\f242"; -@fa-var-battery-3: "\f241"; -@fa-var-battery-4: "\f240"; -@fa-var-battery-empty: "\f244"; -@fa-var-battery-full: "\f240"; -@fa-var-battery-half: "\f242"; -@fa-var-battery-quarter: "\f243"; -@fa-var-battery-three-quarters: "\f241"; -@fa-var-bed: "\f236"; -@fa-var-beer: "\f0fc"; -@fa-var-behance: "\f1b4"; -@fa-var-behance-square: "\f1b5"; -@fa-var-bell: "\f0f3"; -@fa-var-bell-o: "\f0a2"; -@fa-var-bell-slash: "\f1f6"; -@fa-var-bell-slash-o: "\f1f7"; -@fa-var-bicycle: "\f206"; -@fa-var-binoculars: "\f1e5"; -@fa-var-birthday-cake: "\f1fd"; -@fa-var-bitbucket: "\f171"; -@fa-var-bitbucket-square: "\f172"; -@fa-var-bitcoin: "\f15a"; -@fa-var-black-tie: "\f27e"; -@fa-var-blind: "\f29d"; -@fa-var-bluetooth: "\f293"; -@fa-var-bluetooth-b: "\f294"; -@fa-var-bold: "\f032"; -@fa-var-bolt: "\f0e7"; -@fa-var-bomb: "\f1e2"; -@fa-var-book: "\f02d"; -@fa-var-bookmark: "\f02e"; -@fa-var-bookmark-o: "\f097"; -@fa-var-braille: "\f2a1"; -@fa-var-briefcase: "\f0b1"; -@fa-var-btc: "\f15a"; -@fa-var-bug: "\f188"; -@fa-var-building: "\f1ad"; -@fa-var-building-o: "\f0f7"; -@fa-var-bullhorn: "\f0a1"; -@fa-var-bullseye: "\f140"; -@fa-var-bus: "\f207"; -@fa-var-buysellads: "\f20d"; -@fa-var-cab: "\f1ba"; -@fa-var-calculator: "\f1ec"; -@fa-var-calendar: "\f073"; -@fa-var-calendar-check-o: "\f274"; -@fa-var-calendar-minus-o: "\f272"; -@fa-var-calendar-o: "\f133"; -@fa-var-calendar-plus-o: "\f271"; -@fa-var-calendar-times-o: "\f273"; -@fa-var-camera: "\f030"; -@fa-var-camera-retro: "\f083"; -@fa-var-car: "\f1b9"; -@fa-var-caret-down: "\f0d7"; -@fa-var-caret-left: "\f0d9"; -@fa-var-caret-right: "\f0da"; -@fa-var-caret-square-o-down: "\f150"; -@fa-var-caret-square-o-left: "\f191"; -@fa-var-caret-square-o-right: "\f152"; -@fa-var-caret-square-o-up: "\f151"; -@fa-var-caret-up: "\f0d8"; -@fa-var-cart-arrow-down: "\f218"; -@fa-var-cart-plus: "\f217"; -@fa-var-cc: "\f20a"; -@fa-var-cc-amex: "\f1f3"; -@fa-var-cc-diners-club: "\f24c"; -@fa-var-cc-discover: "\f1f2"; -@fa-var-cc-jcb: "\f24b"; -@fa-var-cc-mastercard: "\f1f1"; -@fa-var-cc-paypal: "\f1f4"; -@fa-var-cc-stripe: "\f1f5"; -@fa-var-cc-visa: "\f1f0"; -@fa-var-certificate: "\f0a3"; -@fa-var-chain: "\f0c1"; -@fa-var-chain-broken: "\f127"; -@fa-var-check: "\f00c"; -@fa-var-check-circle: "\f058"; -@fa-var-check-circle-o: "\f05d"; -@fa-var-check-square: "\f14a"; -@fa-var-check-square-o: "\f046"; -@fa-var-chevron-circle-down: "\f13a"; -@fa-var-chevron-circle-left: "\f137"; -@fa-var-chevron-circle-right: "\f138"; -@fa-var-chevron-circle-up: "\f139"; -@fa-var-chevron-down: "\f078"; -@fa-var-chevron-left: "\f053"; -@fa-var-chevron-right: "\f054"; -@fa-var-chevron-up: "\f077"; -@fa-var-child: "\f1ae"; -@fa-var-chrome: "\f268"; -@fa-var-circle: "\f111"; -@fa-var-circle-o: "\f10c"; -@fa-var-circle-o-notch: "\f1ce"; -@fa-var-circle-thin: "\f1db"; -@fa-var-clipboard: "\f0ea"; -@fa-var-clock-o: "\f017"; -@fa-var-clone: "\f24d"; -@fa-var-close: "\f00d"; -@fa-var-cloud: "\f0c2"; -@fa-var-cloud-download: "\f0ed"; -@fa-var-cloud-upload: "\f0ee"; -@fa-var-cny: "\f157"; -@fa-var-code: "\f121"; -@fa-var-code-fork: "\f126"; -@fa-var-codepen: "\f1cb"; -@fa-var-codiepie: "\f284"; -@fa-var-coffee: "\f0f4"; -@fa-var-cog: "\f013"; -@fa-var-cogs: "\f085"; -@fa-var-columns: "\f0db"; -@fa-var-comment: "\f075"; -@fa-var-comment-o: "\f0e5"; -@fa-var-commenting: "\f27a"; -@fa-var-commenting-o: "\f27b"; -@fa-var-comments: "\f086"; -@fa-var-comments-o: "\f0e6"; -@fa-var-compass: "\f14e"; -@fa-var-compress: "\f066"; -@fa-var-connectdevelop: "\f20e"; -@fa-var-contao: "\f26d"; -@fa-var-copy: "\f0c5"; -@fa-var-copyright: "\f1f9"; -@fa-var-creative-commons: "\f25e"; -@fa-var-credit-card: "\f09d"; -@fa-var-credit-card-alt: "\f283"; -@fa-var-crop: "\f125"; -@fa-var-crosshairs: "\f05b"; -@fa-var-css3: "\f13c"; -@fa-var-cube: "\f1b2"; -@fa-var-cubes: "\f1b3"; -@fa-var-cut: "\f0c4"; -@fa-var-cutlery: "\f0f5"; -@fa-var-dashboard: "\f0e4"; -@fa-var-dashcube: "\f210"; -@fa-var-database: "\f1c0"; -@fa-var-deaf: "\f2a4"; -@fa-var-deafness: "\f2a4"; -@fa-var-dedent: "\f03b"; -@fa-var-delicious: "\f1a5"; -@fa-var-desktop: "\f108"; -@fa-var-deviantart: "\f1bd"; -@fa-var-diamond: "\f219"; -@fa-var-digg: "\f1a6"; -@fa-var-dollar: "\f155"; -@fa-var-dot-circle-o: "\f192"; -@fa-var-download: "\f019"; -@fa-var-dribbble: "\f17d"; -@fa-var-drivers-license: "\f2c2"; -@fa-var-drivers-license-o: "\f2c3"; -@fa-var-dropbox: "\f16b"; -@fa-var-drupal: "\f1a9"; -@fa-var-edge: "\f282"; -@fa-var-edit: "\f044"; -@fa-var-eercast: "\f2da"; -@fa-var-eject: "\f052"; -@fa-var-ellipsis-h: "\f141"; -@fa-var-ellipsis-v: "\f142"; -@fa-var-empire: "\f1d1"; -@fa-var-envelope: "\f0e0"; -@fa-var-envelope-o: "\f003"; -@fa-var-envelope-open: "\f2b6"; -@fa-var-envelope-open-o: "\f2b7"; -@fa-var-envelope-square: "\f199"; -@fa-var-envira: "\f299"; -@fa-var-eraser: "\f12d"; -@fa-var-etsy: "\f2d7"; -@fa-var-eur: "\f153"; -@fa-var-euro: "\f153"; -@fa-var-exchange: "\f0ec"; -@fa-var-exclamation: "\f12a"; -@fa-var-exclamation-circle: "\f06a"; -@fa-var-exclamation-triangle: "\f071"; -@fa-var-expand: "\f065"; -@fa-var-expeditedssl: "\f23e"; -@fa-var-external-link: "\f08e"; -@fa-var-external-link-square: "\f14c"; -@fa-var-eye: "\f06e"; -@fa-var-eye-slash: "\f070"; -@fa-var-eyedropper: "\f1fb"; -@fa-var-fa: "\f2b4"; -@fa-var-facebook: "\f09a"; -@fa-var-facebook-f: "\f09a"; -@fa-var-facebook-official: "\f230"; -@fa-var-facebook-square: "\f082"; -@fa-var-fast-backward: "\f049"; -@fa-var-fast-forward: "\f050"; -@fa-var-fax: "\f1ac"; -@fa-var-feed: "\f09e"; -@fa-var-female: "\f182"; -@fa-var-fighter-jet: "\f0fb"; -@fa-var-file: "\f15b"; -@fa-var-file-archive-o: "\f1c6"; -@fa-var-file-audio-o: "\f1c7"; -@fa-var-file-code-o: "\f1c9"; -@fa-var-file-excel-o: "\f1c3"; -@fa-var-file-image-o: "\f1c5"; -@fa-var-file-movie-o: "\f1c8"; -@fa-var-file-o: "\f016"; -@fa-var-file-pdf-o: "\f1c1"; -@fa-var-file-photo-o: "\f1c5"; -@fa-var-file-picture-o: "\f1c5"; -@fa-var-file-powerpoint-o: "\f1c4"; -@fa-var-file-sound-o: "\f1c7"; -@fa-var-file-text: "\f15c"; -@fa-var-file-text-o: "\f0f6"; -@fa-var-file-video-o: "\f1c8"; -@fa-var-file-word-o: "\f1c2"; -@fa-var-file-zip-o: "\f1c6"; -@fa-var-files-o: "\f0c5"; -@fa-var-film: "\f008"; -@fa-var-filter: "\f0b0"; -@fa-var-fire: "\f06d"; -@fa-var-fire-extinguisher: "\f134"; -@fa-var-firefox: "\f269"; -@fa-var-first-order: "\f2b0"; -@fa-var-flag: "\f024"; -@fa-var-flag-checkered: "\f11e"; -@fa-var-flag-o: "\f11d"; -@fa-var-flash: "\f0e7"; -@fa-var-flask: "\f0c3"; -@fa-var-flickr: "\f16e"; -@fa-var-floppy-o: "\f0c7"; -@fa-var-folder: "\f07b"; -@fa-var-folder-o: "\f114"; -@fa-var-folder-open: "\f07c"; -@fa-var-folder-open-o: "\f115"; -@fa-var-font: "\f031"; -@fa-var-font-awesome: "\f2b4"; -@fa-var-fonticons: "\f280"; -@fa-var-fort-awesome: "\f286"; -@fa-var-forumbee: "\f211"; -@fa-var-forward: "\f04e"; -@fa-var-foursquare: "\f180"; -@fa-var-free-code-camp: "\f2c5"; -@fa-var-frown-o: "\f119"; -@fa-var-futbol-o: "\f1e3"; -@fa-var-gamepad: "\f11b"; -@fa-var-gavel: "\f0e3"; -@fa-var-gbp: "\f154"; -@fa-var-ge: "\f1d1"; -@fa-var-gear: "\f013"; -@fa-var-gears: "\f085"; -@fa-var-genderless: "\f22d"; -@fa-var-get-pocket: "\f265"; -@fa-var-gg: "\f260"; -@fa-var-gg-circle: "\f261"; -@fa-var-gift: "\f06b"; -@fa-var-git: "\f1d3"; -@fa-var-git-square: "\f1d2"; -@fa-var-github: "\f09b"; -@fa-var-github-alt: "\f113"; -@fa-var-github-square: "\f092"; -@fa-var-gitlab: "\f296"; -@fa-var-gittip: "\f184"; -@fa-var-glass: "\f000"; -@fa-var-glide: "\f2a5"; -@fa-var-glide-g: "\f2a6"; -@fa-var-globe: "\f0ac"; -@fa-var-google: "\f1a0"; -@fa-var-google-plus: "\f0d5"; -@fa-var-google-plus-circle: "\f2b3"; -@fa-var-google-plus-official: "\f2b3"; -@fa-var-google-plus-square: "\f0d4"; -@fa-var-google-wallet: "\f1ee"; -@fa-var-graduation-cap: "\f19d"; -@fa-var-gratipay: "\f184"; -@fa-var-grav: "\f2d6"; -@fa-var-group: "\f0c0"; -@fa-var-h-square: "\f0fd"; -@fa-var-hacker-news: "\f1d4"; -@fa-var-hand-grab-o: "\f255"; -@fa-var-hand-lizard-o: "\f258"; -@fa-var-hand-o-down: "\f0a7"; -@fa-var-hand-o-left: "\f0a5"; -@fa-var-hand-o-right: "\f0a4"; -@fa-var-hand-o-up: "\f0a6"; -@fa-var-hand-paper-o: "\f256"; -@fa-var-hand-peace-o: "\f25b"; -@fa-var-hand-pointer-o: "\f25a"; -@fa-var-hand-rock-o: "\f255"; -@fa-var-hand-scissors-o: "\f257"; -@fa-var-hand-spock-o: "\f259"; -@fa-var-hand-stop-o: "\f256"; -@fa-var-handshake-o: "\f2b5"; -@fa-var-hard-of-hearing: "\f2a4"; -@fa-var-hashtag: "\f292"; -@fa-var-hdd-o: "\f0a0"; -@fa-var-header: "\f1dc"; -@fa-var-headphones: "\f025"; -@fa-var-heart: "\f004"; -@fa-var-heart-o: "\f08a"; -@fa-var-heartbeat: "\f21e"; -@fa-var-history: "\f1da"; -@fa-var-home: "\f015"; -@fa-var-hospital-o: "\f0f8"; -@fa-var-hotel: "\f236"; -@fa-var-hourglass: "\f254"; -@fa-var-hourglass-1: "\f251"; -@fa-var-hourglass-2: "\f252"; -@fa-var-hourglass-3: "\f253"; -@fa-var-hourglass-end: "\f253"; -@fa-var-hourglass-half: "\f252"; -@fa-var-hourglass-o: "\f250"; -@fa-var-hourglass-start: "\f251"; -@fa-var-houzz: "\f27c"; -@fa-var-html5: "\f13b"; -@fa-var-i-cursor: "\f246"; -@fa-var-id-badge: "\f2c1"; -@fa-var-id-card: "\f2c2"; -@fa-var-id-card-o: "\f2c3"; -@fa-var-ils: "\f20b"; -@fa-var-image: "\f03e"; -@fa-var-imdb: "\f2d8"; -@fa-var-inbox: "\f01c"; -@fa-var-indent: "\f03c"; -@fa-var-industry: "\f275"; -@fa-var-info: "\f129"; -@fa-var-info-circle: "\f05a"; -@fa-var-inr: "\f156"; -@fa-var-instagram: "\f16d"; -@fa-var-institution: "\f19c"; -@fa-var-internet-explorer: "\f26b"; -@fa-var-intersex: "\f224"; -@fa-var-ioxhost: "\f208"; -@fa-var-italic: "\f033"; -@fa-var-joomla: "\f1aa"; -@fa-var-jpy: "\f157"; -@fa-var-jsfiddle: "\f1cc"; -@fa-var-key: "\f084"; -@fa-var-keyboard-o: "\f11c"; -@fa-var-krw: "\f159"; -@fa-var-language: "\f1ab"; -@fa-var-laptop: "\f109"; -@fa-var-lastfm: "\f202"; -@fa-var-lastfm-square: "\f203"; -@fa-var-leaf: "\f06c"; -@fa-var-leanpub: "\f212"; -@fa-var-legal: "\f0e3"; -@fa-var-lemon-o: "\f094"; -@fa-var-level-down: "\f149"; -@fa-var-level-up: "\f148"; -@fa-var-life-bouy: "\f1cd"; -@fa-var-life-buoy: "\f1cd"; -@fa-var-life-ring: "\f1cd"; -@fa-var-life-saver: "\f1cd"; -@fa-var-lightbulb-o: "\f0eb"; -@fa-var-line-chart: "\f201"; -@fa-var-link: "\f0c1"; -@fa-var-linkedin: "\f0e1"; -@fa-var-linkedin-square: "\f08c"; -@fa-var-linode: "\f2b8"; -@fa-var-linux: "\f17c"; -@fa-var-list: "\f03a"; -@fa-var-list-alt: "\f022"; -@fa-var-list-ol: "\f0cb"; -@fa-var-list-ul: "\f0ca"; -@fa-var-location-arrow: "\f124"; -@fa-var-lock: "\f023"; -@fa-var-long-arrow-down: "\f175"; -@fa-var-long-arrow-left: "\f177"; -@fa-var-long-arrow-right: "\f178"; -@fa-var-long-arrow-up: "\f176"; -@fa-var-low-vision: "\f2a8"; -@fa-var-magic: "\f0d0"; -@fa-var-magnet: "\f076"; -@fa-var-mail-forward: "\f064"; -@fa-var-mail-reply: "\f112"; -@fa-var-mail-reply-all: "\f122"; -@fa-var-male: "\f183"; -@fa-var-map: "\f279"; -@fa-var-map-marker: "\f041"; -@fa-var-map-o: "\f278"; -@fa-var-map-pin: "\f276"; -@fa-var-map-signs: "\f277"; -@fa-var-mars: "\f222"; -@fa-var-mars-double: "\f227"; -@fa-var-mars-stroke: "\f229"; -@fa-var-mars-stroke-h: "\f22b"; -@fa-var-mars-stroke-v: "\f22a"; -@fa-var-maxcdn: "\f136"; -@fa-var-meanpath: "\f20c"; -@fa-var-medium: "\f23a"; -@fa-var-medkit: "\f0fa"; -@fa-var-meetup: "\f2e0"; -@fa-var-meh-o: "\f11a"; -@fa-var-mercury: "\f223"; -@fa-var-microchip: "\f2db"; -@fa-var-microphone: "\f130"; -@fa-var-microphone-slash: "\f131"; -@fa-var-minus: "\f068"; -@fa-var-minus-circle: "\f056"; -@fa-var-minus-square: "\f146"; -@fa-var-minus-square-o: "\f147"; -@fa-var-mixcloud: "\f289"; -@fa-var-mobile: "\f10b"; -@fa-var-mobile-phone: "\f10b"; -@fa-var-modx: "\f285"; -@fa-var-money: "\f0d6"; -@fa-var-moon-o: "\f186"; -@fa-var-mortar-board: "\f19d"; -@fa-var-motorcycle: "\f21c"; -@fa-var-mouse-pointer: "\f245"; -@fa-var-music: "\f001"; -@fa-var-navicon: "\f0c9"; -@fa-var-neuter: "\f22c"; -@fa-var-newspaper-o: "\f1ea"; -@fa-var-object-group: "\f247"; -@fa-var-object-ungroup: "\f248"; -@fa-var-odnoklassniki: "\f263"; -@fa-var-odnoklassniki-square: "\f264"; -@fa-var-opencart: "\f23d"; -@fa-var-openid: "\f19b"; -@fa-var-opera: "\f26a"; -@fa-var-optin-monster: "\f23c"; -@fa-var-outdent: "\f03b"; -@fa-var-pagelines: "\f18c"; -@fa-var-paint-brush: "\f1fc"; -@fa-var-paper-plane: "\f1d8"; -@fa-var-paper-plane-o: "\f1d9"; -@fa-var-paperclip: "\f0c6"; -@fa-var-paragraph: "\f1dd"; -@fa-var-paste: "\f0ea"; -@fa-var-pause: "\f04c"; -@fa-var-pause-circle: "\f28b"; -@fa-var-pause-circle-o: "\f28c"; -@fa-var-paw: "\f1b0"; -@fa-var-paypal: "\f1ed"; -@fa-var-pencil: "\f040"; -@fa-var-pencil-square: "\f14b"; -@fa-var-pencil-square-o: "\f044"; -@fa-var-percent: "\f295"; -@fa-var-phone: "\f095"; -@fa-var-phone-square: "\f098"; -@fa-var-photo: "\f03e"; -@fa-var-picture-o: "\f03e"; -@fa-var-pie-chart: "\f200"; -@fa-var-pied-piper: "\f2ae"; -@fa-var-pied-piper-alt: "\f1a8"; -@fa-var-pied-piper-pp: "\f1a7"; -@fa-var-pinterest: "\f0d2"; -@fa-var-pinterest-p: "\f231"; -@fa-var-pinterest-square: "\f0d3"; -@fa-var-plane: "\f072"; -@fa-var-play: "\f04b"; -@fa-var-play-circle: "\f144"; -@fa-var-play-circle-o: "\f01d"; -@fa-var-plug: "\f1e6"; -@fa-var-plus: "\f067"; -@fa-var-plus-circle: "\f055"; -@fa-var-plus-square: "\f0fe"; -@fa-var-plus-square-o: "\f196"; -@fa-var-podcast: "\f2ce"; -@fa-var-power-off: "\f011"; -@fa-var-print: "\f02f"; -@fa-var-product-hunt: "\f288"; -@fa-var-puzzle-piece: "\f12e"; -@fa-var-qq: "\f1d6"; -@fa-var-qrcode: "\f029"; -@fa-var-question: "\f128"; -@fa-var-question-circle: "\f059"; -@fa-var-question-circle-o: "\f29c"; -@fa-var-quora: "\f2c4"; -@fa-var-quote-left: "\f10d"; -@fa-var-quote-right: "\f10e"; -@fa-var-ra: "\f1d0"; -@fa-var-random: "\f074"; -@fa-var-ravelry: "\f2d9"; -@fa-var-rebel: "\f1d0"; -@fa-var-recycle: "\f1b8"; -@fa-var-reddit: "\f1a1"; -@fa-var-reddit-alien: "\f281"; -@fa-var-reddit-square: "\f1a2"; -@fa-var-refresh: "\f021"; -@fa-var-registered: "\f25d"; -@fa-var-remove: "\f00d"; -@fa-var-renren: "\f18b"; -@fa-var-reorder: "\f0c9"; -@fa-var-repeat: "\f01e"; -@fa-var-reply: "\f112"; -@fa-var-reply-all: "\f122"; -@fa-var-resistance: "\f1d0"; -@fa-var-retweet: "\f079"; -@fa-var-rmb: "\f157"; -@fa-var-road: "\f018"; -@fa-var-rocket: "\f135"; -@fa-var-rotate-left: "\f0e2"; -@fa-var-rotate-right: "\f01e"; -@fa-var-rouble: "\f158"; -@fa-var-rss: "\f09e"; -@fa-var-rss-square: "\f143"; -@fa-var-rub: "\f158"; -@fa-var-ruble: "\f158"; -@fa-var-rupee: "\f156"; -@fa-var-s15: "\f2cd"; -@fa-var-safari: "\f267"; -@fa-var-save: "\f0c7"; -@fa-var-scissors: "\f0c4"; -@fa-var-scribd: "\f28a"; -@fa-var-search: "\f002"; -@fa-var-search-minus: "\f010"; -@fa-var-search-plus: "\f00e"; -@fa-var-sellsy: "\f213"; -@fa-var-send: "\f1d8"; -@fa-var-send-o: "\f1d9"; -@fa-var-server: "\f233"; -@fa-var-share: "\f064"; -@fa-var-share-alt: "\f1e0"; -@fa-var-share-alt-square: "\f1e1"; -@fa-var-share-square: "\f14d"; -@fa-var-share-square-o: "\f045"; -@fa-var-shekel: "\f20b"; -@fa-var-sheqel: "\f20b"; -@fa-var-shield: "\f132"; -@fa-var-ship: "\f21a"; -@fa-var-shirtsinbulk: "\f214"; -@fa-var-shopping-bag: "\f290"; -@fa-var-shopping-basket: "\f291"; -@fa-var-shopping-cart: "\f07a"; -@fa-var-shower: "\f2cc"; -@fa-var-sign-in: "\f090"; -@fa-var-sign-language: "\f2a7"; -@fa-var-sign-out: "\f08b"; -@fa-var-signal: "\f012"; -@fa-var-signing: "\f2a7"; -@fa-var-simplybuilt: "\f215"; -@fa-var-sitemap: "\f0e8"; -@fa-var-skyatlas: "\f216"; -@fa-var-skype: "\f17e"; -@fa-var-slack: "\f198"; -@fa-var-sliders: "\f1de"; -@fa-var-slideshare: "\f1e7"; -@fa-var-smile-o: "\f118"; -@fa-var-snapchat: "\f2ab"; -@fa-var-snapchat-ghost: "\f2ac"; -@fa-var-snapchat-square: "\f2ad"; -@fa-var-snowflake-o: "\f2dc"; -@fa-var-soccer-ball-o: "\f1e3"; -@fa-var-sort: "\f0dc"; -@fa-var-sort-alpha-asc: "\f15d"; -@fa-var-sort-alpha-desc: "\f15e"; -@fa-var-sort-amount-asc: "\f160"; -@fa-var-sort-amount-desc: "\f161"; -@fa-var-sort-asc: "\f0de"; -@fa-var-sort-desc: "\f0dd"; -@fa-var-sort-down: "\f0dd"; -@fa-var-sort-numeric-asc: "\f162"; -@fa-var-sort-numeric-desc: "\f163"; -@fa-var-sort-up: "\f0de"; -@fa-var-soundcloud: "\f1be"; -@fa-var-space-shuttle: "\f197"; -@fa-var-spinner: "\f110"; -@fa-var-spoon: "\f1b1"; -@fa-var-spotify: "\f1bc"; -@fa-var-square: "\f0c8"; -@fa-var-square-o: "\f096"; -@fa-var-stack-exchange: "\f18d"; -@fa-var-stack-overflow: "\f16c"; -@fa-var-star: "\f005"; -@fa-var-star-half: "\f089"; -@fa-var-star-half-empty: "\f123"; -@fa-var-star-half-full: "\f123"; -@fa-var-star-half-o: "\f123"; -@fa-var-star-o: "\f006"; -@fa-var-steam: "\f1b6"; -@fa-var-steam-square: "\f1b7"; -@fa-var-step-backward: "\f048"; -@fa-var-step-forward: "\f051"; -@fa-var-stethoscope: "\f0f1"; -@fa-var-sticky-note: "\f249"; -@fa-var-sticky-note-o: "\f24a"; -@fa-var-stop: "\f04d"; -@fa-var-stop-circle: "\f28d"; -@fa-var-stop-circle-o: "\f28e"; -@fa-var-street-view: "\f21d"; -@fa-var-strikethrough: "\f0cc"; -@fa-var-stumbleupon: "\f1a4"; -@fa-var-stumbleupon-circle: "\f1a3"; -@fa-var-subscript: "\f12c"; -@fa-var-subway: "\f239"; -@fa-var-suitcase: "\f0f2"; -@fa-var-sun-o: "\f185"; -@fa-var-superpowers: "\f2dd"; -@fa-var-superscript: "\f12b"; -@fa-var-support: "\f1cd"; -@fa-var-table: "\f0ce"; -@fa-var-tablet: "\f10a"; -@fa-var-tachometer: "\f0e4"; -@fa-var-tag: "\f02b"; -@fa-var-tags: "\f02c"; -@fa-var-tasks: "\f0ae"; -@fa-var-taxi: "\f1ba"; -@fa-var-telegram: "\f2c6"; -@fa-var-television: "\f26c"; -@fa-var-tencent-weibo: "\f1d5"; -@fa-var-terminal: "\f120"; -@fa-var-text-height: "\f034"; -@fa-var-text-width: "\f035"; -@fa-var-th: "\f00a"; -@fa-var-th-large: "\f009"; -@fa-var-th-list: "\f00b"; -@fa-var-themeisle: "\f2b2"; -@fa-var-thermometer: "\f2c7"; -@fa-var-thermometer-0: "\f2cb"; -@fa-var-thermometer-1: "\f2ca"; -@fa-var-thermometer-2: "\f2c9"; -@fa-var-thermometer-3: "\f2c8"; -@fa-var-thermometer-4: "\f2c7"; -@fa-var-thermometer-empty: "\f2cb"; -@fa-var-thermometer-full: "\f2c7"; -@fa-var-thermometer-half: "\f2c9"; -@fa-var-thermometer-quarter: "\f2ca"; -@fa-var-thermometer-three-quarters: "\f2c8"; -@fa-var-thumb-tack: "\f08d"; -@fa-var-thumbs-down: "\f165"; -@fa-var-thumbs-o-down: "\f088"; -@fa-var-thumbs-o-up: "\f087"; -@fa-var-thumbs-up: "\f164"; -@fa-var-ticket: "\f145"; -@fa-var-times: "\f00d"; -@fa-var-times-circle: "\f057"; -@fa-var-times-circle-o: "\f05c"; -@fa-var-times-rectangle: "\f2d3"; -@fa-var-times-rectangle-o: "\f2d4"; -@fa-var-tint: "\f043"; -@fa-var-toggle-down: "\f150"; -@fa-var-toggle-left: "\f191"; -@fa-var-toggle-off: "\f204"; -@fa-var-toggle-on: "\f205"; -@fa-var-toggle-right: "\f152"; -@fa-var-toggle-up: "\f151"; -@fa-var-trademark: "\f25c"; -@fa-var-train: "\f238"; -@fa-var-transgender: "\f224"; -@fa-var-transgender-alt: "\f225"; -@fa-var-trash: "\f1f8"; -@fa-var-trash-o: "\f014"; -@fa-var-tree: "\f1bb"; -@fa-var-trello: "\f181"; -@fa-var-tripadvisor: "\f262"; -@fa-var-trophy: "\f091"; -@fa-var-truck: "\f0d1"; -@fa-var-try: "\f195"; -@fa-var-tty: "\f1e4"; -@fa-var-tumblr: "\f173"; -@fa-var-tumblr-square: "\f174"; -@fa-var-turkish-lira: "\f195"; -@fa-var-tv: "\f26c"; -@fa-var-twitch: "\f1e8"; -@fa-var-twitter: "\f099"; -@fa-var-twitter-square: "\f081"; -@fa-var-umbrella: "\f0e9"; -@fa-var-underline: "\f0cd"; -@fa-var-undo: "\f0e2"; -@fa-var-universal-access: "\f29a"; -@fa-var-university: "\f19c"; -@fa-var-unlink: "\f127"; -@fa-var-unlock: "\f09c"; -@fa-var-unlock-alt: "\f13e"; -@fa-var-unsorted: "\f0dc"; -@fa-var-upload: "\f093"; -@fa-var-usb: "\f287"; -@fa-var-usd: "\f155"; -@fa-var-user: "\f007"; -@fa-var-user-circle: "\f2bd"; -@fa-var-user-circle-o: "\f2be"; -@fa-var-user-md: "\f0f0"; -@fa-var-user-o: "\f2c0"; -@fa-var-user-plus: "\f234"; -@fa-var-user-secret: "\f21b"; -@fa-var-user-times: "\f235"; -@fa-var-users: "\f0c0"; -@fa-var-vcard: "\f2bb"; -@fa-var-vcard-o: "\f2bc"; -@fa-var-venus: "\f221"; -@fa-var-venus-double: "\f226"; -@fa-var-venus-mars: "\f228"; -@fa-var-viacoin: "\f237"; -@fa-var-viadeo: "\f2a9"; -@fa-var-viadeo-square: "\f2aa"; -@fa-var-video-camera: "\f03d"; -@fa-var-vimeo: "\f27d"; -@fa-var-vimeo-square: "\f194"; -@fa-var-vine: "\f1ca"; -@fa-var-vk: "\f189"; -@fa-var-volume-control-phone: "\f2a0"; -@fa-var-volume-down: "\f027"; -@fa-var-volume-off: "\f026"; -@fa-var-volume-up: "\f028"; -@fa-var-warning: "\f071"; -@fa-var-wechat: "\f1d7"; -@fa-var-weibo: "\f18a"; -@fa-var-weixin: "\f1d7"; -@fa-var-whatsapp: "\f232"; -@fa-var-wheelchair: "\f193"; -@fa-var-wheelchair-alt: "\f29b"; -@fa-var-wifi: "\f1eb"; -@fa-var-wikipedia-w: "\f266"; -@fa-var-window-close: "\f2d3"; -@fa-var-window-close-o: "\f2d4"; -@fa-var-window-maximize: "\f2d0"; -@fa-var-window-minimize: "\f2d1"; -@fa-var-window-restore: "\f2d2"; -@fa-var-windows: "\f17a"; -@fa-var-won: "\f159"; -@fa-var-wordpress: "\f19a"; -@fa-var-wpbeginner: "\f297"; -@fa-var-wpexplorer: "\f2de"; -@fa-var-wpforms: "\f298"; -@fa-var-wrench: "\f0ad"; -@fa-var-xing: "\f168"; -@fa-var-xing-square: "\f169"; -@fa-var-y-combinator: "\f23b"; -@fa-var-y-combinator-square: "\f1d4"; -@fa-var-yahoo: "\f19e"; -@fa-var-yc: "\f23b"; -@fa-var-yc-square: "\f1d4"; -@fa-var-yelp: "\f1e9"; -@fa-var-yen: "\f157"; -@fa-var-yoast: "\f2b1"; -@fa-var-youtube: "\f167"; -@fa-var-youtube-play: "\f16a"; -@fa-var-youtube-square: "\f166"; - diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_animated.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_animated.scss deleted file mode 100644 index 8a020db..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_animated.scss +++ /dev/null @@ -1,34 +0,0 @@ -// Spinning Icons -// -------------------------- - -.#{$fa-css-prefix}-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} - -.#{$fa-css-prefix}-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_bordered-pulled.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_bordered-pulled.scss deleted file mode 100644 index d4b85a0..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_bordered-pulled.scss +++ /dev/null @@ -1,25 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.#{$fa-css-prefix}-border { - padding: .2em .25em .15em; - border: solid .08em $fa-border-color; - border-radius: .1em; -} - -.#{$fa-css-prefix}-pull-left { float: left; } -.#{$fa-css-prefix}-pull-right { float: right; } - -.#{$fa-css-prefix} { - &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } - &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } -} - -/* Deprecated as of 4.4.0 */ -.pull-right { float: right; } -.pull-left { float: left; } - -.#{$fa-css-prefix} { - &.pull-left { margin-right: .3em; } - &.pull-right { margin-left: .3em; } -} diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_core.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_core.scss deleted file mode 100644 index 7425ef8..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_core.scss +++ /dev/null @@ -1,12 +0,0 @@ -// Base Class Definition -// ------------------------- - -.#{$fa-css-prefix} { - display: inline-block; - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_fixed-width.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_fixed-width.scss deleted file mode 100644 index b221c98..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_fixed-width.scss +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.#{$fa-css-prefix}-fw { - width: (18em / 14); - text-align: center; -} diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_icons.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_icons.scss deleted file mode 100644 index e63e702..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_icons.scss +++ /dev/null @@ -1,789 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - -.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } -.#{$fa-css-prefix}-music:before { content: $fa-var-music; } -.#{$fa-css-prefix}-search:before { content: $fa-var-search; } -.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } -.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } -.#{$fa-css-prefix}-star:before { content: $fa-var-star; } -.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } -.#{$fa-css-prefix}-user:before { content: $fa-var-user; } -.#{$fa-css-prefix}-film:before { content: $fa-var-film; } -.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } -.#{$fa-css-prefix}-th:before { content: $fa-var-th; } -.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } -.#{$fa-css-prefix}-check:before { content: $fa-var-check; } -.#{$fa-css-prefix}-remove:before, -.#{$fa-css-prefix}-close:before, -.#{$fa-css-prefix}-times:before { content: $fa-var-times; } -.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } -.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } -.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } -.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } -.#{$fa-css-prefix}-gear:before, -.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } -.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } -.#{$fa-css-prefix}-home:before { content: $fa-var-home; } -.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } -.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } -.#{$fa-css-prefix}-road:before { content: $fa-var-road; } -.#{$fa-css-prefix}-download:before { content: $fa-var-download; } -.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } -.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } -.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } -.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } -.#{$fa-css-prefix}-rotate-right:before, -.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } -.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } -.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } -.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } -.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } -.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } -.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } -.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } -.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } -.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } -.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } -.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } -.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } -.#{$fa-css-prefix}-book:before { content: $fa-var-book; } -.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } -.#{$fa-css-prefix}-print:before { content: $fa-var-print; } -.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } -.#{$fa-css-prefix}-font:before { content: $fa-var-font; } -.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } -.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } -.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } -.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } -.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } -.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } -.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } -.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } -.#{$fa-css-prefix}-list:before { content: $fa-var-list; } -.#{$fa-css-prefix}-dedent:before, -.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } -.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } -.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } -.#{$fa-css-prefix}-photo:before, -.#{$fa-css-prefix}-image:before, -.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } -.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } -.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } -.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } -.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } -.#{$fa-css-prefix}-edit:before, -.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } -.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } -.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } -.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } -.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } -.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } -.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } -.#{$fa-css-prefix}-play:before { content: $fa-var-play; } -.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } -.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } -.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } -.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } -.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } -.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } -.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } -.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } -.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } -.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } -.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } -.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } -.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } -.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } -.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } -.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } -.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } -.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } -.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } -.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } -.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } -.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } -.#{$fa-css-prefix}-mail-forward:before, -.#{$fa-css-prefix}-share:before { content: $fa-var-share; } -.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } -.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } -.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } -.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } -.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } -.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } -.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } -.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } -.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } -.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } -.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } -.#{$fa-css-prefix}-warning:before, -.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } -.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } -.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } -.#{$fa-css-prefix}-random:before { content: $fa-var-random; } -.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } -.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } -.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } -.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } -.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } -.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } -.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } -.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } -.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } -.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } -.#{$fa-css-prefix}-bar-chart-o:before, -.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } -.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } -.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } -.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } -.#{$fa-css-prefix}-key:before { content: $fa-var-key; } -.#{$fa-css-prefix}-gears:before, -.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } -.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } -.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } -.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } -.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } -.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } -.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } -.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } -.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } -.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } -.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } -.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } -.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } -.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } -.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } -.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } -.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } -.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } -.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } -.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } -.#{$fa-css-prefix}-facebook-f:before, -.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } -.#{$fa-css-prefix}-github:before { content: $fa-var-github; } -.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } -.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } -.#{$fa-css-prefix}-feed:before, -.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } -.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } -.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } -.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } -.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } -.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } -.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } -.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } -.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } -.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } -.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } -.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } -.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } -.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } -.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } -.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } -.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } -.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } -.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } -.#{$fa-css-prefix}-group:before, -.#{$fa-css-prefix}-users:before { content: $fa-var-users; } -.#{$fa-css-prefix}-chain:before, -.#{$fa-css-prefix}-link:before { content: $fa-var-link; } -.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } -.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } -.#{$fa-css-prefix}-cut:before, -.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } -.#{$fa-css-prefix}-copy:before, -.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } -.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } -.#{$fa-css-prefix}-save:before, -.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } -.#{$fa-css-prefix}-square:before { content: $fa-var-square; } -.#{$fa-css-prefix}-navicon:before, -.#{$fa-css-prefix}-reorder:before, -.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } -.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } -.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } -.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } -.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } -.#{$fa-css-prefix}-table:before { content: $fa-var-table; } -.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } -.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } -.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } -.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } -.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } -.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } -.#{$fa-css-prefix}-money:before { content: $fa-var-money; } -.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } -.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } -.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } -.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } -.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } -.#{$fa-css-prefix}-unsorted:before, -.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } -.#{$fa-css-prefix}-sort-down:before, -.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } -.#{$fa-css-prefix}-sort-up:before, -.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } -.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } -.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } -.#{$fa-css-prefix}-rotate-left:before, -.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } -.#{$fa-css-prefix}-legal:before, -.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } -.#{$fa-css-prefix}-dashboard:before, -.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } -.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } -.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } -.#{$fa-css-prefix}-flash:before, -.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } -.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } -.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } -.#{$fa-css-prefix}-paste:before, -.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } -.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } -.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } -.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } -.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } -.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } -.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } -.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } -.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } -.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } -.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } -.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } -.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } -.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } -.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } -.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } -.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } -.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } -.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } -.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } -.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } -.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } -.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } -.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } -.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } -.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } -.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } -.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } -.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } -.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } -.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } -.#{$fa-css-prefix}-mobile-phone:before, -.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } -.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } -.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } -.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } -.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } -.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } -.#{$fa-css-prefix}-mail-reply:before, -.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } -.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } -.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } -.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } -.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } -.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } -.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } -.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } -.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } -.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } -.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } -.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } -.#{$fa-css-prefix}-code:before { content: $fa-var-code; } -.#{$fa-css-prefix}-mail-reply-all:before, -.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } -.#{$fa-css-prefix}-star-half-empty:before, -.#{$fa-css-prefix}-star-half-full:before, -.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } -.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } -.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } -.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } -.#{$fa-css-prefix}-unlink:before, -.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } -.#{$fa-css-prefix}-question:before { content: $fa-var-question; } -.#{$fa-css-prefix}-info:before { content: $fa-var-info; } -.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } -.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } -.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } -.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } -.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } -.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } -.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } -.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } -.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } -.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } -.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } -.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } -.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } -.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } -.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } -.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } -.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } -.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } -.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } -.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } -.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } -.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } -.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } -.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } -.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } -.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } -.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } -.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } -.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } -.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } -.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } -.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } -.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } -.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } -.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } -.#{$fa-css-prefix}-toggle-down:before, -.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } -.#{$fa-css-prefix}-toggle-up:before, -.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } -.#{$fa-css-prefix}-toggle-right:before, -.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } -.#{$fa-css-prefix}-euro:before, -.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } -.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } -.#{$fa-css-prefix}-dollar:before, -.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } -.#{$fa-css-prefix}-rupee:before, -.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } -.#{$fa-css-prefix}-cny:before, -.#{$fa-css-prefix}-rmb:before, -.#{$fa-css-prefix}-yen:before, -.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } -.#{$fa-css-prefix}-ruble:before, -.#{$fa-css-prefix}-rouble:before, -.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } -.#{$fa-css-prefix}-won:before, -.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } -.#{$fa-css-prefix}-bitcoin:before, -.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } -.#{$fa-css-prefix}-file:before { content: $fa-var-file; } -.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } -.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } -.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } -.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } -.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } -.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } -.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } -.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } -.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } -.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } -.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } -.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } -.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } -.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } -.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } -.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } -.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } -.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } -.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } -.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } -.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } -.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } -.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } -.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } -.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } -.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } -.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } -.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } -.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } -.#{$fa-css-prefix}-android:before { content: $fa-var-android; } -.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } -.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } -.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } -.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } -.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } -.#{$fa-css-prefix}-female:before { content: $fa-var-female; } -.#{$fa-css-prefix}-male:before { content: $fa-var-male; } -.#{$fa-css-prefix}-gittip:before, -.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } -.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } -.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } -.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } -.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } -.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } -.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } -.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } -.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } -.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } -.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } -.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } -.#{$fa-css-prefix}-toggle-left:before, -.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } -.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } -.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } -.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } -.#{$fa-css-prefix}-turkish-lira:before, -.#{$fa-css-prefix}-try:before { content: $fa-var-try; } -.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } -.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } -.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } -.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } -.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } -.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } -.#{$fa-css-prefix}-institution:before, -.#{$fa-css-prefix}-bank:before, -.#{$fa-css-prefix}-university:before { content: $fa-var-university; } -.#{$fa-css-prefix}-mortar-board:before, -.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } -.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } -.#{$fa-css-prefix}-google:before { content: $fa-var-google; } -.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } -.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } -.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } -.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } -.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } -.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } -.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } -.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } -.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } -.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } -.#{$fa-css-prefix}-language:before { content: $fa-var-language; } -.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } -.#{$fa-css-prefix}-building:before { content: $fa-var-building; } -.#{$fa-css-prefix}-child:before { content: $fa-var-child; } -.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } -.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } -.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } -.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } -.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } -.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } -.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } -.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } -.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } -.#{$fa-css-prefix}-automobile:before, -.#{$fa-css-prefix}-car:before { content: $fa-var-car; } -.#{$fa-css-prefix}-cab:before, -.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } -.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } -.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } -.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } -.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } -.#{$fa-css-prefix}-database:before { content: $fa-var-database; } -.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } -.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } -.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } -.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } -.#{$fa-css-prefix}-file-photo-o:before, -.#{$fa-css-prefix}-file-picture-o:before, -.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } -.#{$fa-css-prefix}-file-zip-o:before, -.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } -.#{$fa-css-prefix}-file-sound-o:before, -.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } -.#{$fa-css-prefix}-file-movie-o:before, -.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } -.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } -.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } -.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } -.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } -.#{$fa-css-prefix}-life-bouy:before, -.#{$fa-css-prefix}-life-buoy:before, -.#{$fa-css-prefix}-life-saver:before, -.#{$fa-css-prefix}-support:before, -.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } -.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } -.#{$fa-css-prefix}-ra:before, -.#{$fa-css-prefix}-resistance:before, -.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } -.#{$fa-css-prefix}-ge:before, -.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } -.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } -.#{$fa-css-prefix}-git:before { content: $fa-var-git; } -.#{$fa-css-prefix}-y-combinator-square:before, -.#{$fa-css-prefix}-yc-square:before, -.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } -.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } -.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } -.#{$fa-css-prefix}-wechat:before, -.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } -.#{$fa-css-prefix}-send:before, -.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } -.#{$fa-css-prefix}-send-o:before, -.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } -.#{$fa-css-prefix}-history:before { content: $fa-var-history; } -.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } -.#{$fa-css-prefix}-header:before { content: $fa-var-header; } -.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } -.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } -.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } -.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } -.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } -.#{$fa-css-prefix}-soccer-ball-o:before, -.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } -.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } -.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } -.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } -.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } -.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } -.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } -.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } -.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } -.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } -.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } -.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } -.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } -.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } -.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } -.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } -.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } -.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } -.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } -.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } -.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } -.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } -.#{$fa-css-prefix}-at:before { content: $fa-var-at; } -.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } -.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } -.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } -.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } -.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } -.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } -.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } -.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } -.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } -.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } -.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } -.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } -.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } -.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } -.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } -.#{$fa-css-prefix}-shekel:before, -.#{$fa-css-prefix}-sheqel:before, -.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } -.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } -.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } -.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } -.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } -.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } -.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } -.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } -.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } -.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } -.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } -.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } -.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } -.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } -.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } -.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } -.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } -.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } -.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } -.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } -.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } -.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } -.#{$fa-css-prefix}-intersex:before, -.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } -.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } -.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } -.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } -.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } -.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } -.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } -.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } -.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } -.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } -.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } -.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } -.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } -.#{$fa-css-prefix}-server:before { content: $fa-var-server; } -.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } -.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } -.#{$fa-css-prefix}-hotel:before, -.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } -.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } -.#{$fa-css-prefix}-train:before { content: $fa-var-train; } -.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } -.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } -.#{$fa-css-prefix}-yc:before, -.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } -.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } -.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } -.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } -.#{$fa-css-prefix}-battery-4:before, -.#{$fa-css-prefix}-battery:before, -.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } -.#{$fa-css-prefix}-battery-3:before, -.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } -.#{$fa-css-prefix}-battery-2:before, -.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } -.#{$fa-css-prefix}-battery-1:before, -.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } -.#{$fa-css-prefix}-battery-0:before, -.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } -.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } -.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } -.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } -.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } -.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } -.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } -.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } -.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } -.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } -.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } -.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } -.#{$fa-css-prefix}-hourglass-1:before, -.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } -.#{$fa-css-prefix}-hourglass-2:before, -.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } -.#{$fa-css-prefix}-hourglass-3:before, -.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } -.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } -.#{$fa-css-prefix}-hand-grab-o:before, -.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } -.#{$fa-css-prefix}-hand-stop-o:before, -.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } -.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } -.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } -.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } -.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } -.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } -.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } -.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } -.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } -.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } -.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } -.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } -.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } -.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } -.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } -.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } -.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } -.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } -.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } -.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } -.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } -.#{$fa-css-prefix}-tv:before, -.#{$fa-css-prefix}-television:before { content: $fa-var-television; } -.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } -.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } -.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } -.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } -.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } -.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } -.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } -.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } -.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } -.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } -.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } -.#{$fa-css-prefix}-map:before { content: $fa-var-map; } -.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } -.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } -.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } -.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } -.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } -.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } -.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } -.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } -.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } -.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } -.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } -.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } -.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } -.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } -.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } -.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } -.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } -.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } -.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } -.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } -.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } -.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } -.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } -.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } -.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } -.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } -.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } -.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } -.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } -.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } -.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } -.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } -.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } -.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } -.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } -.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } -.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } -.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } -.#{$fa-css-prefix}-asl-interpreting:before, -.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } -.#{$fa-css-prefix}-deafness:before, -.#{$fa-css-prefix}-hard-of-hearing:before, -.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } -.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } -.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } -.#{$fa-css-prefix}-signing:before, -.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } -.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } -.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } -.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } -.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } -.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } -.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } -.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } -.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } -.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } -.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } -.#{$fa-css-prefix}-google-plus-circle:before, -.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } -.#{$fa-css-prefix}-fa:before, -.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } -.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } -.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } -.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } -.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } -.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } -.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } -.#{$fa-css-prefix}-vcard:before, -.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } -.#{$fa-css-prefix}-vcard-o:before, -.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } -.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } -.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } -.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } -.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } -.#{$fa-css-prefix}-drivers-license:before, -.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } -.#{$fa-css-prefix}-drivers-license-o:before, -.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } -.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } -.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } -.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } -.#{$fa-css-prefix}-thermometer-4:before, -.#{$fa-css-prefix}-thermometer:before, -.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } -.#{$fa-css-prefix}-thermometer-3:before, -.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } -.#{$fa-css-prefix}-thermometer-2:before, -.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } -.#{$fa-css-prefix}-thermometer-1:before, -.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } -.#{$fa-css-prefix}-thermometer-0:before, -.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } -.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } -.#{$fa-css-prefix}-bathtub:before, -.#{$fa-css-prefix}-s15:before, -.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } -.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } -.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } -.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } -.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } -.#{$fa-css-prefix}-times-rectangle:before, -.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } -.#{$fa-css-prefix}-times-rectangle-o:before, -.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } -.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } -.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } -.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } -.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } -.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } -.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } -.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } -.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } -.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } -.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } -.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_larger.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_larger.scss deleted file mode 100644 index 41e9a81..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_larger.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Icon Sizes -// ------------------------- - -/* makes the font 33% larger relative to the icon container */ -.#{$fa-css-prefix}-lg { - font-size: (4em / 3); - line-height: (3em / 4); - vertical-align: -15%; -} -.#{$fa-css-prefix}-2x { font-size: 2em; } -.#{$fa-css-prefix}-3x { font-size: 3em; } -.#{$fa-css-prefix}-4x { font-size: 4em; } -.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_list.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_list.scss deleted file mode 100644 index 7d1e4d5..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_list.scss +++ /dev/null @@ -1,19 +0,0 @@ -// List Icons -// ------------------------- - -.#{$fa-css-prefix}-ul { - padding-left: 0; - margin-left: $fa-li-width; - list-style-type: none; - > li { position: relative; } -} -.#{$fa-css-prefix}-li { - position: absolute; - left: -$fa-li-width; - width: $fa-li-width; - top: (2em / 14); - text-align: center; - &.#{$fa-css-prefix}-lg { - left: -$fa-li-width + (4em / 14); - } -} diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_mixins.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_mixins.scss deleted file mode 100644 index c3bbd57..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_mixins.scss +++ /dev/null @@ -1,60 +0,0 @@ -// Mixins -// -------------------------- - -@mixin fa-icon() { - display: inline-block; - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} - -@mixin fa-icon-rotate($degrees, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; - -webkit-transform: rotate($degrees); - -ms-transform: rotate($degrees); - transform: rotate($degrees); -} - -@mixin fa-icon-flip($horiz, $vert, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; - -webkit-transform: scale($horiz, $vert); - -ms-transform: scale($horiz, $vert); - transform: scale($horiz, $vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -@mixin sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - border: 0; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -@mixin sr-only-focusable { - &:active, - &:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; - } -} diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_path.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_path.scss deleted file mode 100644 index bb457c2..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_path.scss +++ /dev/null @@ -1,15 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); - src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), - url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), - url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), - url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), - url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); -// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; -} diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_rotated-flipped.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_rotated-flipped.scss deleted file mode 100644 index a3558fd..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_rotated-flipped.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } -.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } -.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } - -.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } -.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root .#{$fa-css-prefix}-rotate-90, -:root .#{$fa-css-prefix}-rotate-180, -:root .#{$fa-css-prefix}-rotate-270, -:root .#{$fa-css-prefix}-flip-horizontal, -:root .#{$fa-css-prefix}-flip-vertical { - filter: none; -} diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_screen-reader.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_screen-reader.scss deleted file mode 100644 index 637426f..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_screen-reader.scss +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { @include sr-only(); } -.sr-only-focusable { @include sr-only-focusable(); } diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_stacked.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_stacked.scss deleted file mode 100644 index aef7403..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_stacked.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.#{$fa-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.#{$fa-css-prefix}-stack-1x { line-height: inherit; } -.#{$fa-css-prefix}-stack-2x { font-size: 2em; } -.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/_variables.scss b/public/assets/fonts/font-awesome-4.7.0/scss/_variables.scss deleted file mode 100644 index 498fc4a..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/_variables.scss +++ /dev/null @@ -1,800 +0,0 @@ -// Variables -// -------------------------- - -$fa-font-path: "../fonts" !default; -$fa-font-size-base: 14px !default; -$fa-line-height-base: 1 !default; -//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly -$fa-css-prefix: fa !default; -$fa-version: "4.7.0" !default; -$fa-border-color: #eee !default; -$fa-inverse: #fff !default; -$fa-li-width: (30em / 14) !default; - -$fa-var-500px: "\f26e"; -$fa-var-address-book: "\f2b9"; -$fa-var-address-book-o: "\f2ba"; -$fa-var-address-card: "\f2bb"; -$fa-var-address-card-o: "\f2bc"; -$fa-var-adjust: "\f042"; -$fa-var-adn: "\f170"; -$fa-var-align-center: "\f037"; -$fa-var-align-justify: "\f039"; -$fa-var-align-left: "\f036"; -$fa-var-align-right: "\f038"; -$fa-var-amazon: "\f270"; -$fa-var-ambulance: "\f0f9"; -$fa-var-american-sign-language-interpreting: "\f2a3"; -$fa-var-anchor: "\f13d"; -$fa-var-android: "\f17b"; -$fa-var-angellist: "\f209"; -$fa-var-angle-double-down: "\f103"; -$fa-var-angle-double-left: "\f100"; -$fa-var-angle-double-right: "\f101"; -$fa-var-angle-double-up: "\f102"; -$fa-var-angle-down: "\f107"; -$fa-var-angle-left: "\f104"; -$fa-var-angle-right: "\f105"; -$fa-var-angle-up: "\f106"; -$fa-var-apple: "\f179"; -$fa-var-archive: "\f187"; -$fa-var-area-chart: "\f1fe"; -$fa-var-arrow-circle-down: "\f0ab"; -$fa-var-arrow-circle-left: "\f0a8"; -$fa-var-arrow-circle-o-down: "\f01a"; -$fa-var-arrow-circle-o-left: "\f190"; -$fa-var-arrow-circle-o-right: "\f18e"; -$fa-var-arrow-circle-o-up: "\f01b"; -$fa-var-arrow-circle-right: "\f0a9"; -$fa-var-arrow-circle-up: "\f0aa"; -$fa-var-arrow-down: "\f063"; -$fa-var-arrow-left: "\f060"; -$fa-var-arrow-right: "\f061"; -$fa-var-arrow-up: "\f062"; -$fa-var-arrows: "\f047"; -$fa-var-arrows-alt: "\f0b2"; -$fa-var-arrows-h: "\f07e"; -$fa-var-arrows-v: "\f07d"; -$fa-var-asl-interpreting: "\f2a3"; -$fa-var-assistive-listening-systems: "\f2a2"; -$fa-var-asterisk: "\f069"; -$fa-var-at: "\f1fa"; -$fa-var-audio-description: "\f29e"; -$fa-var-automobile: "\f1b9"; -$fa-var-backward: "\f04a"; -$fa-var-balance-scale: "\f24e"; -$fa-var-ban: "\f05e"; -$fa-var-bandcamp: "\f2d5"; -$fa-var-bank: "\f19c"; -$fa-var-bar-chart: "\f080"; -$fa-var-bar-chart-o: "\f080"; -$fa-var-barcode: "\f02a"; -$fa-var-bars: "\f0c9"; -$fa-var-bath: "\f2cd"; -$fa-var-bathtub: "\f2cd"; -$fa-var-battery: "\f240"; -$fa-var-battery-0: "\f244"; -$fa-var-battery-1: "\f243"; -$fa-var-battery-2: "\f242"; -$fa-var-battery-3: "\f241"; -$fa-var-battery-4: "\f240"; -$fa-var-battery-empty: "\f244"; -$fa-var-battery-full: "\f240"; -$fa-var-battery-half: "\f242"; -$fa-var-battery-quarter: "\f243"; -$fa-var-battery-three-quarters: "\f241"; -$fa-var-bed: "\f236"; -$fa-var-beer: "\f0fc"; -$fa-var-behance: "\f1b4"; -$fa-var-behance-square: "\f1b5"; -$fa-var-bell: "\f0f3"; -$fa-var-bell-o: "\f0a2"; -$fa-var-bell-slash: "\f1f6"; -$fa-var-bell-slash-o: "\f1f7"; -$fa-var-bicycle: "\f206"; -$fa-var-binoculars: "\f1e5"; -$fa-var-birthday-cake: "\f1fd"; -$fa-var-bitbucket: "\f171"; -$fa-var-bitbucket-square: "\f172"; -$fa-var-bitcoin: "\f15a"; -$fa-var-black-tie: "\f27e"; -$fa-var-blind: "\f29d"; -$fa-var-bluetooth: "\f293"; -$fa-var-bluetooth-b: "\f294"; -$fa-var-bold: "\f032"; -$fa-var-bolt: "\f0e7"; -$fa-var-bomb: "\f1e2"; -$fa-var-book: "\f02d"; -$fa-var-bookmark: "\f02e"; -$fa-var-bookmark-o: "\f097"; -$fa-var-braille: "\f2a1"; -$fa-var-briefcase: "\f0b1"; -$fa-var-btc: "\f15a"; -$fa-var-bug: "\f188"; -$fa-var-building: "\f1ad"; -$fa-var-building-o: "\f0f7"; -$fa-var-bullhorn: "\f0a1"; -$fa-var-bullseye: "\f140"; -$fa-var-bus: "\f207"; -$fa-var-buysellads: "\f20d"; -$fa-var-cab: "\f1ba"; -$fa-var-calculator: "\f1ec"; -$fa-var-calendar: "\f073"; -$fa-var-calendar-check-o: "\f274"; -$fa-var-calendar-minus-o: "\f272"; -$fa-var-calendar-o: "\f133"; -$fa-var-calendar-plus-o: "\f271"; -$fa-var-calendar-times-o: "\f273"; -$fa-var-camera: "\f030"; -$fa-var-camera-retro: "\f083"; -$fa-var-car: "\f1b9"; -$fa-var-caret-down: "\f0d7"; -$fa-var-caret-left: "\f0d9"; -$fa-var-caret-right: "\f0da"; -$fa-var-caret-square-o-down: "\f150"; -$fa-var-caret-square-o-left: "\f191"; -$fa-var-caret-square-o-right: "\f152"; -$fa-var-caret-square-o-up: "\f151"; -$fa-var-caret-up: "\f0d8"; -$fa-var-cart-arrow-down: "\f218"; -$fa-var-cart-plus: "\f217"; -$fa-var-cc: "\f20a"; -$fa-var-cc-amex: "\f1f3"; -$fa-var-cc-diners-club: "\f24c"; -$fa-var-cc-discover: "\f1f2"; -$fa-var-cc-jcb: "\f24b"; -$fa-var-cc-mastercard: "\f1f1"; -$fa-var-cc-paypal: "\f1f4"; -$fa-var-cc-stripe: "\f1f5"; -$fa-var-cc-visa: "\f1f0"; -$fa-var-certificate: "\f0a3"; -$fa-var-chain: "\f0c1"; -$fa-var-chain-broken: "\f127"; -$fa-var-check: "\f00c"; -$fa-var-check-circle: "\f058"; -$fa-var-check-circle-o: "\f05d"; -$fa-var-check-square: "\f14a"; -$fa-var-check-square-o: "\f046"; -$fa-var-chevron-circle-down: "\f13a"; -$fa-var-chevron-circle-left: "\f137"; -$fa-var-chevron-circle-right: "\f138"; -$fa-var-chevron-circle-up: "\f139"; -$fa-var-chevron-down: "\f078"; -$fa-var-chevron-left: "\f053"; -$fa-var-chevron-right: "\f054"; -$fa-var-chevron-up: "\f077"; -$fa-var-child: "\f1ae"; -$fa-var-chrome: "\f268"; -$fa-var-circle: "\f111"; -$fa-var-circle-o: "\f10c"; -$fa-var-circle-o-notch: "\f1ce"; -$fa-var-circle-thin: "\f1db"; -$fa-var-clipboard: "\f0ea"; -$fa-var-clock-o: "\f017"; -$fa-var-clone: "\f24d"; -$fa-var-close: "\f00d"; -$fa-var-cloud: "\f0c2"; -$fa-var-cloud-download: "\f0ed"; -$fa-var-cloud-upload: "\f0ee"; -$fa-var-cny: "\f157"; -$fa-var-code: "\f121"; -$fa-var-code-fork: "\f126"; -$fa-var-codepen: "\f1cb"; -$fa-var-codiepie: "\f284"; -$fa-var-coffee: "\f0f4"; -$fa-var-cog: "\f013"; -$fa-var-cogs: "\f085"; -$fa-var-columns: "\f0db"; -$fa-var-comment: "\f075"; -$fa-var-comment-o: "\f0e5"; -$fa-var-commenting: "\f27a"; -$fa-var-commenting-o: "\f27b"; -$fa-var-comments: "\f086"; -$fa-var-comments-o: "\f0e6"; -$fa-var-compass: "\f14e"; -$fa-var-compress: "\f066"; -$fa-var-connectdevelop: "\f20e"; -$fa-var-contao: "\f26d"; -$fa-var-copy: "\f0c5"; -$fa-var-copyright: "\f1f9"; -$fa-var-creative-commons: "\f25e"; -$fa-var-credit-card: "\f09d"; -$fa-var-credit-card-alt: "\f283"; -$fa-var-crop: "\f125"; -$fa-var-crosshairs: "\f05b"; -$fa-var-css3: "\f13c"; -$fa-var-cube: "\f1b2"; -$fa-var-cubes: "\f1b3"; -$fa-var-cut: "\f0c4"; -$fa-var-cutlery: "\f0f5"; -$fa-var-dashboard: "\f0e4"; -$fa-var-dashcube: "\f210"; -$fa-var-database: "\f1c0"; -$fa-var-deaf: "\f2a4"; -$fa-var-deafness: "\f2a4"; -$fa-var-dedent: "\f03b"; -$fa-var-delicious: "\f1a5"; -$fa-var-desktop: "\f108"; -$fa-var-deviantart: "\f1bd"; -$fa-var-diamond: "\f219"; -$fa-var-digg: "\f1a6"; -$fa-var-dollar: "\f155"; -$fa-var-dot-circle-o: "\f192"; -$fa-var-download: "\f019"; -$fa-var-dribbble: "\f17d"; -$fa-var-drivers-license: "\f2c2"; -$fa-var-drivers-license-o: "\f2c3"; -$fa-var-dropbox: "\f16b"; -$fa-var-drupal: "\f1a9"; -$fa-var-edge: "\f282"; -$fa-var-edit: "\f044"; -$fa-var-eercast: "\f2da"; -$fa-var-eject: "\f052"; -$fa-var-ellipsis-h: "\f141"; -$fa-var-ellipsis-v: "\f142"; -$fa-var-empire: "\f1d1"; -$fa-var-envelope: "\f0e0"; -$fa-var-envelope-o: "\f003"; -$fa-var-envelope-open: "\f2b6"; -$fa-var-envelope-open-o: "\f2b7"; -$fa-var-envelope-square: "\f199"; -$fa-var-envira: "\f299"; -$fa-var-eraser: "\f12d"; -$fa-var-etsy: "\f2d7"; -$fa-var-eur: "\f153"; -$fa-var-euro: "\f153"; -$fa-var-exchange: "\f0ec"; -$fa-var-exclamation: "\f12a"; -$fa-var-exclamation-circle: "\f06a"; -$fa-var-exclamation-triangle: "\f071"; -$fa-var-expand: "\f065"; -$fa-var-expeditedssl: "\f23e"; -$fa-var-external-link: "\f08e"; -$fa-var-external-link-square: "\f14c"; -$fa-var-eye: "\f06e"; -$fa-var-eye-slash: "\f070"; -$fa-var-eyedropper: "\f1fb"; -$fa-var-fa: "\f2b4"; -$fa-var-facebook: "\f09a"; -$fa-var-facebook-f: "\f09a"; -$fa-var-facebook-official: "\f230"; -$fa-var-facebook-square: "\f082"; -$fa-var-fast-backward: "\f049"; -$fa-var-fast-forward: "\f050"; -$fa-var-fax: "\f1ac"; -$fa-var-feed: "\f09e"; -$fa-var-female: "\f182"; -$fa-var-fighter-jet: "\f0fb"; -$fa-var-file: "\f15b"; -$fa-var-file-archive-o: "\f1c6"; -$fa-var-file-audio-o: "\f1c7"; -$fa-var-file-code-o: "\f1c9"; -$fa-var-file-excel-o: "\f1c3"; -$fa-var-file-image-o: "\f1c5"; -$fa-var-file-movie-o: "\f1c8"; -$fa-var-file-o: "\f016"; -$fa-var-file-pdf-o: "\f1c1"; -$fa-var-file-photo-o: "\f1c5"; -$fa-var-file-picture-o: "\f1c5"; -$fa-var-file-powerpoint-o: "\f1c4"; -$fa-var-file-sound-o: "\f1c7"; -$fa-var-file-text: "\f15c"; -$fa-var-file-text-o: "\f0f6"; -$fa-var-file-video-o: "\f1c8"; -$fa-var-file-word-o: "\f1c2"; -$fa-var-file-zip-o: "\f1c6"; -$fa-var-files-o: "\f0c5"; -$fa-var-film: "\f008"; -$fa-var-filter: "\f0b0"; -$fa-var-fire: "\f06d"; -$fa-var-fire-extinguisher: "\f134"; -$fa-var-firefox: "\f269"; -$fa-var-first-order: "\f2b0"; -$fa-var-flag: "\f024"; -$fa-var-flag-checkered: "\f11e"; -$fa-var-flag-o: "\f11d"; -$fa-var-flash: "\f0e7"; -$fa-var-flask: "\f0c3"; -$fa-var-flickr: "\f16e"; -$fa-var-floppy-o: "\f0c7"; -$fa-var-folder: "\f07b"; -$fa-var-folder-o: "\f114"; -$fa-var-folder-open: "\f07c"; -$fa-var-folder-open-o: "\f115"; -$fa-var-font: "\f031"; -$fa-var-font-awesome: "\f2b4"; -$fa-var-fonticons: "\f280"; -$fa-var-fort-awesome: "\f286"; -$fa-var-forumbee: "\f211"; -$fa-var-forward: "\f04e"; -$fa-var-foursquare: "\f180"; -$fa-var-free-code-camp: "\f2c5"; -$fa-var-frown-o: "\f119"; -$fa-var-futbol-o: "\f1e3"; -$fa-var-gamepad: "\f11b"; -$fa-var-gavel: "\f0e3"; -$fa-var-gbp: "\f154"; -$fa-var-ge: "\f1d1"; -$fa-var-gear: "\f013"; -$fa-var-gears: "\f085"; -$fa-var-genderless: "\f22d"; -$fa-var-get-pocket: "\f265"; -$fa-var-gg: "\f260"; -$fa-var-gg-circle: "\f261"; -$fa-var-gift: "\f06b"; -$fa-var-git: "\f1d3"; -$fa-var-git-square: "\f1d2"; -$fa-var-github: "\f09b"; -$fa-var-github-alt: "\f113"; -$fa-var-github-square: "\f092"; -$fa-var-gitlab: "\f296"; -$fa-var-gittip: "\f184"; -$fa-var-glass: "\f000"; -$fa-var-glide: "\f2a5"; -$fa-var-glide-g: "\f2a6"; -$fa-var-globe: "\f0ac"; -$fa-var-google: "\f1a0"; -$fa-var-google-plus: "\f0d5"; -$fa-var-google-plus-circle: "\f2b3"; -$fa-var-google-plus-official: "\f2b3"; -$fa-var-google-plus-square: "\f0d4"; -$fa-var-google-wallet: "\f1ee"; -$fa-var-graduation-cap: "\f19d"; -$fa-var-gratipay: "\f184"; -$fa-var-grav: "\f2d6"; -$fa-var-group: "\f0c0"; -$fa-var-h-square: "\f0fd"; -$fa-var-hacker-news: "\f1d4"; -$fa-var-hand-grab-o: "\f255"; -$fa-var-hand-lizard-o: "\f258"; -$fa-var-hand-o-down: "\f0a7"; -$fa-var-hand-o-left: "\f0a5"; -$fa-var-hand-o-right: "\f0a4"; -$fa-var-hand-o-up: "\f0a6"; -$fa-var-hand-paper-o: "\f256"; -$fa-var-hand-peace-o: "\f25b"; -$fa-var-hand-pointer-o: "\f25a"; -$fa-var-hand-rock-o: "\f255"; -$fa-var-hand-scissors-o: "\f257"; -$fa-var-hand-spock-o: "\f259"; -$fa-var-hand-stop-o: "\f256"; -$fa-var-handshake-o: "\f2b5"; -$fa-var-hard-of-hearing: "\f2a4"; -$fa-var-hashtag: "\f292"; -$fa-var-hdd-o: "\f0a0"; -$fa-var-header: "\f1dc"; -$fa-var-headphones: "\f025"; -$fa-var-heart: "\f004"; -$fa-var-heart-o: "\f08a"; -$fa-var-heartbeat: "\f21e"; -$fa-var-history: "\f1da"; -$fa-var-home: "\f015"; -$fa-var-hospital-o: "\f0f8"; -$fa-var-hotel: "\f236"; -$fa-var-hourglass: "\f254"; -$fa-var-hourglass-1: "\f251"; -$fa-var-hourglass-2: "\f252"; -$fa-var-hourglass-3: "\f253"; -$fa-var-hourglass-end: "\f253"; -$fa-var-hourglass-half: "\f252"; -$fa-var-hourglass-o: "\f250"; -$fa-var-hourglass-start: "\f251"; -$fa-var-houzz: "\f27c"; -$fa-var-html5: "\f13b"; -$fa-var-i-cursor: "\f246"; -$fa-var-id-badge: "\f2c1"; -$fa-var-id-card: "\f2c2"; -$fa-var-id-card-o: "\f2c3"; -$fa-var-ils: "\f20b"; -$fa-var-image: "\f03e"; -$fa-var-imdb: "\f2d8"; -$fa-var-inbox: "\f01c"; -$fa-var-indent: "\f03c"; -$fa-var-industry: "\f275"; -$fa-var-info: "\f129"; -$fa-var-info-circle: "\f05a"; -$fa-var-inr: "\f156"; -$fa-var-instagram: "\f16d"; -$fa-var-institution: "\f19c"; -$fa-var-internet-explorer: "\f26b"; -$fa-var-intersex: "\f224"; -$fa-var-ioxhost: "\f208"; -$fa-var-italic: "\f033"; -$fa-var-joomla: "\f1aa"; -$fa-var-jpy: "\f157"; -$fa-var-jsfiddle: "\f1cc"; -$fa-var-key: "\f084"; -$fa-var-keyboard-o: "\f11c"; -$fa-var-krw: "\f159"; -$fa-var-language: "\f1ab"; -$fa-var-laptop: "\f109"; -$fa-var-lastfm: "\f202"; -$fa-var-lastfm-square: "\f203"; -$fa-var-leaf: "\f06c"; -$fa-var-leanpub: "\f212"; -$fa-var-legal: "\f0e3"; -$fa-var-lemon-o: "\f094"; -$fa-var-level-down: "\f149"; -$fa-var-level-up: "\f148"; -$fa-var-life-bouy: "\f1cd"; -$fa-var-life-buoy: "\f1cd"; -$fa-var-life-ring: "\f1cd"; -$fa-var-life-saver: "\f1cd"; -$fa-var-lightbulb-o: "\f0eb"; -$fa-var-line-chart: "\f201"; -$fa-var-link: "\f0c1"; -$fa-var-linkedin: "\f0e1"; -$fa-var-linkedin-square: "\f08c"; -$fa-var-linode: "\f2b8"; -$fa-var-linux: "\f17c"; -$fa-var-list: "\f03a"; -$fa-var-list-alt: "\f022"; -$fa-var-list-ol: "\f0cb"; -$fa-var-list-ul: "\f0ca"; -$fa-var-location-arrow: "\f124"; -$fa-var-lock: "\f023"; -$fa-var-long-arrow-down: "\f175"; -$fa-var-long-arrow-left: "\f177"; -$fa-var-long-arrow-right: "\f178"; -$fa-var-long-arrow-up: "\f176"; -$fa-var-low-vision: "\f2a8"; -$fa-var-magic: "\f0d0"; -$fa-var-magnet: "\f076"; -$fa-var-mail-forward: "\f064"; -$fa-var-mail-reply: "\f112"; -$fa-var-mail-reply-all: "\f122"; -$fa-var-male: "\f183"; -$fa-var-map: "\f279"; -$fa-var-map-marker: "\f041"; -$fa-var-map-o: "\f278"; -$fa-var-map-pin: "\f276"; -$fa-var-map-signs: "\f277"; -$fa-var-mars: "\f222"; -$fa-var-mars-double: "\f227"; -$fa-var-mars-stroke: "\f229"; -$fa-var-mars-stroke-h: "\f22b"; -$fa-var-mars-stroke-v: "\f22a"; -$fa-var-maxcdn: "\f136"; -$fa-var-meanpath: "\f20c"; -$fa-var-medium: "\f23a"; -$fa-var-medkit: "\f0fa"; -$fa-var-meetup: "\f2e0"; -$fa-var-meh-o: "\f11a"; -$fa-var-mercury: "\f223"; -$fa-var-microchip: "\f2db"; -$fa-var-microphone: "\f130"; -$fa-var-microphone-slash: "\f131"; -$fa-var-minus: "\f068"; -$fa-var-minus-circle: "\f056"; -$fa-var-minus-square: "\f146"; -$fa-var-minus-square-o: "\f147"; -$fa-var-mixcloud: "\f289"; -$fa-var-mobile: "\f10b"; -$fa-var-mobile-phone: "\f10b"; -$fa-var-modx: "\f285"; -$fa-var-money: "\f0d6"; -$fa-var-moon-o: "\f186"; -$fa-var-mortar-board: "\f19d"; -$fa-var-motorcycle: "\f21c"; -$fa-var-mouse-pointer: "\f245"; -$fa-var-music: "\f001"; -$fa-var-navicon: "\f0c9"; -$fa-var-neuter: "\f22c"; -$fa-var-newspaper-o: "\f1ea"; -$fa-var-object-group: "\f247"; -$fa-var-object-ungroup: "\f248"; -$fa-var-odnoklassniki: "\f263"; -$fa-var-odnoklassniki-square: "\f264"; -$fa-var-opencart: "\f23d"; -$fa-var-openid: "\f19b"; -$fa-var-opera: "\f26a"; -$fa-var-optin-monster: "\f23c"; -$fa-var-outdent: "\f03b"; -$fa-var-pagelines: "\f18c"; -$fa-var-paint-brush: "\f1fc"; -$fa-var-paper-plane: "\f1d8"; -$fa-var-paper-plane-o: "\f1d9"; -$fa-var-paperclip: "\f0c6"; -$fa-var-paragraph: "\f1dd"; -$fa-var-paste: "\f0ea"; -$fa-var-pause: "\f04c"; -$fa-var-pause-circle: "\f28b"; -$fa-var-pause-circle-o: "\f28c"; -$fa-var-paw: "\f1b0"; -$fa-var-paypal: "\f1ed"; -$fa-var-pencil: "\f040"; -$fa-var-pencil-square: "\f14b"; -$fa-var-pencil-square-o: "\f044"; -$fa-var-percent: "\f295"; -$fa-var-phone: "\f095"; -$fa-var-phone-square: "\f098"; -$fa-var-photo: "\f03e"; -$fa-var-picture-o: "\f03e"; -$fa-var-pie-chart: "\f200"; -$fa-var-pied-piper: "\f2ae"; -$fa-var-pied-piper-alt: "\f1a8"; -$fa-var-pied-piper-pp: "\f1a7"; -$fa-var-pinterest: "\f0d2"; -$fa-var-pinterest-p: "\f231"; -$fa-var-pinterest-square: "\f0d3"; -$fa-var-plane: "\f072"; -$fa-var-play: "\f04b"; -$fa-var-play-circle: "\f144"; -$fa-var-play-circle-o: "\f01d"; -$fa-var-plug: "\f1e6"; -$fa-var-plus: "\f067"; -$fa-var-plus-circle: "\f055"; -$fa-var-plus-square: "\f0fe"; -$fa-var-plus-square-o: "\f196"; -$fa-var-podcast: "\f2ce"; -$fa-var-power-off: "\f011"; -$fa-var-print: "\f02f"; -$fa-var-product-hunt: "\f288"; -$fa-var-puzzle-piece: "\f12e"; -$fa-var-qq: "\f1d6"; -$fa-var-qrcode: "\f029"; -$fa-var-question: "\f128"; -$fa-var-question-circle: "\f059"; -$fa-var-question-circle-o: "\f29c"; -$fa-var-quora: "\f2c4"; -$fa-var-quote-left: "\f10d"; -$fa-var-quote-right: "\f10e"; -$fa-var-ra: "\f1d0"; -$fa-var-random: "\f074"; -$fa-var-ravelry: "\f2d9"; -$fa-var-rebel: "\f1d0"; -$fa-var-recycle: "\f1b8"; -$fa-var-reddit: "\f1a1"; -$fa-var-reddit-alien: "\f281"; -$fa-var-reddit-square: "\f1a2"; -$fa-var-refresh: "\f021"; -$fa-var-registered: "\f25d"; -$fa-var-remove: "\f00d"; -$fa-var-renren: "\f18b"; -$fa-var-reorder: "\f0c9"; -$fa-var-repeat: "\f01e"; -$fa-var-reply: "\f112"; -$fa-var-reply-all: "\f122"; -$fa-var-resistance: "\f1d0"; -$fa-var-retweet: "\f079"; -$fa-var-rmb: "\f157"; -$fa-var-road: "\f018"; -$fa-var-rocket: "\f135"; -$fa-var-rotate-left: "\f0e2"; -$fa-var-rotate-right: "\f01e"; -$fa-var-rouble: "\f158"; -$fa-var-rss: "\f09e"; -$fa-var-rss-square: "\f143"; -$fa-var-rub: "\f158"; -$fa-var-ruble: "\f158"; -$fa-var-rupee: "\f156"; -$fa-var-s15: "\f2cd"; -$fa-var-safari: "\f267"; -$fa-var-save: "\f0c7"; -$fa-var-scissors: "\f0c4"; -$fa-var-scribd: "\f28a"; -$fa-var-search: "\f002"; -$fa-var-search-minus: "\f010"; -$fa-var-search-plus: "\f00e"; -$fa-var-sellsy: "\f213"; -$fa-var-send: "\f1d8"; -$fa-var-send-o: "\f1d9"; -$fa-var-server: "\f233"; -$fa-var-share: "\f064"; -$fa-var-share-alt: "\f1e0"; -$fa-var-share-alt-square: "\f1e1"; -$fa-var-share-square: "\f14d"; -$fa-var-share-square-o: "\f045"; -$fa-var-shekel: "\f20b"; -$fa-var-sheqel: "\f20b"; -$fa-var-shield: "\f132"; -$fa-var-ship: "\f21a"; -$fa-var-shirtsinbulk: "\f214"; -$fa-var-shopping-bag: "\f290"; -$fa-var-shopping-basket: "\f291"; -$fa-var-shopping-cart: "\f07a"; -$fa-var-shower: "\f2cc"; -$fa-var-sign-in: "\f090"; -$fa-var-sign-language: "\f2a7"; -$fa-var-sign-out: "\f08b"; -$fa-var-signal: "\f012"; -$fa-var-signing: "\f2a7"; -$fa-var-simplybuilt: "\f215"; -$fa-var-sitemap: "\f0e8"; -$fa-var-skyatlas: "\f216"; -$fa-var-skype: "\f17e"; -$fa-var-slack: "\f198"; -$fa-var-sliders: "\f1de"; -$fa-var-slideshare: "\f1e7"; -$fa-var-smile-o: "\f118"; -$fa-var-snapchat: "\f2ab"; -$fa-var-snapchat-ghost: "\f2ac"; -$fa-var-snapchat-square: "\f2ad"; -$fa-var-snowflake-o: "\f2dc"; -$fa-var-soccer-ball-o: "\f1e3"; -$fa-var-sort: "\f0dc"; -$fa-var-sort-alpha-asc: "\f15d"; -$fa-var-sort-alpha-desc: "\f15e"; -$fa-var-sort-amount-asc: "\f160"; -$fa-var-sort-amount-desc: "\f161"; -$fa-var-sort-asc: "\f0de"; -$fa-var-sort-desc: "\f0dd"; -$fa-var-sort-down: "\f0dd"; -$fa-var-sort-numeric-asc: "\f162"; -$fa-var-sort-numeric-desc: "\f163"; -$fa-var-sort-up: "\f0de"; -$fa-var-soundcloud: "\f1be"; -$fa-var-space-shuttle: "\f197"; -$fa-var-spinner: "\f110"; -$fa-var-spoon: "\f1b1"; -$fa-var-spotify: "\f1bc"; -$fa-var-square: "\f0c8"; -$fa-var-square-o: "\f096"; -$fa-var-stack-exchange: "\f18d"; -$fa-var-stack-overflow: "\f16c"; -$fa-var-star: "\f005"; -$fa-var-star-half: "\f089"; -$fa-var-star-half-empty: "\f123"; -$fa-var-star-half-full: "\f123"; -$fa-var-star-half-o: "\f123"; -$fa-var-star-o: "\f006"; -$fa-var-steam: "\f1b6"; -$fa-var-steam-square: "\f1b7"; -$fa-var-step-backward: "\f048"; -$fa-var-step-forward: "\f051"; -$fa-var-stethoscope: "\f0f1"; -$fa-var-sticky-note: "\f249"; -$fa-var-sticky-note-o: "\f24a"; -$fa-var-stop: "\f04d"; -$fa-var-stop-circle: "\f28d"; -$fa-var-stop-circle-o: "\f28e"; -$fa-var-street-view: "\f21d"; -$fa-var-strikethrough: "\f0cc"; -$fa-var-stumbleupon: "\f1a4"; -$fa-var-stumbleupon-circle: "\f1a3"; -$fa-var-subscript: "\f12c"; -$fa-var-subway: "\f239"; -$fa-var-suitcase: "\f0f2"; -$fa-var-sun-o: "\f185"; -$fa-var-superpowers: "\f2dd"; -$fa-var-superscript: "\f12b"; -$fa-var-support: "\f1cd"; -$fa-var-table: "\f0ce"; -$fa-var-tablet: "\f10a"; -$fa-var-tachometer: "\f0e4"; -$fa-var-tag: "\f02b"; -$fa-var-tags: "\f02c"; -$fa-var-tasks: "\f0ae"; -$fa-var-taxi: "\f1ba"; -$fa-var-telegram: "\f2c6"; -$fa-var-television: "\f26c"; -$fa-var-tencent-weibo: "\f1d5"; -$fa-var-terminal: "\f120"; -$fa-var-text-height: "\f034"; -$fa-var-text-width: "\f035"; -$fa-var-th: "\f00a"; -$fa-var-th-large: "\f009"; -$fa-var-th-list: "\f00b"; -$fa-var-themeisle: "\f2b2"; -$fa-var-thermometer: "\f2c7"; -$fa-var-thermometer-0: "\f2cb"; -$fa-var-thermometer-1: "\f2ca"; -$fa-var-thermometer-2: "\f2c9"; -$fa-var-thermometer-3: "\f2c8"; -$fa-var-thermometer-4: "\f2c7"; -$fa-var-thermometer-empty: "\f2cb"; -$fa-var-thermometer-full: "\f2c7"; -$fa-var-thermometer-half: "\f2c9"; -$fa-var-thermometer-quarter: "\f2ca"; -$fa-var-thermometer-three-quarters: "\f2c8"; -$fa-var-thumb-tack: "\f08d"; -$fa-var-thumbs-down: "\f165"; -$fa-var-thumbs-o-down: "\f088"; -$fa-var-thumbs-o-up: "\f087"; -$fa-var-thumbs-up: "\f164"; -$fa-var-ticket: "\f145"; -$fa-var-times: "\f00d"; -$fa-var-times-circle: "\f057"; -$fa-var-times-circle-o: "\f05c"; -$fa-var-times-rectangle: "\f2d3"; -$fa-var-times-rectangle-o: "\f2d4"; -$fa-var-tint: "\f043"; -$fa-var-toggle-down: "\f150"; -$fa-var-toggle-left: "\f191"; -$fa-var-toggle-off: "\f204"; -$fa-var-toggle-on: "\f205"; -$fa-var-toggle-right: "\f152"; -$fa-var-toggle-up: "\f151"; -$fa-var-trademark: "\f25c"; -$fa-var-train: "\f238"; -$fa-var-transgender: "\f224"; -$fa-var-transgender-alt: "\f225"; -$fa-var-trash: "\f1f8"; -$fa-var-trash-o: "\f014"; -$fa-var-tree: "\f1bb"; -$fa-var-trello: "\f181"; -$fa-var-tripadvisor: "\f262"; -$fa-var-trophy: "\f091"; -$fa-var-truck: "\f0d1"; -$fa-var-try: "\f195"; -$fa-var-tty: "\f1e4"; -$fa-var-tumblr: "\f173"; -$fa-var-tumblr-square: "\f174"; -$fa-var-turkish-lira: "\f195"; -$fa-var-tv: "\f26c"; -$fa-var-twitch: "\f1e8"; -$fa-var-twitter: "\f099"; -$fa-var-twitter-square: "\f081"; -$fa-var-umbrella: "\f0e9"; -$fa-var-underline: "\f0cd"; -$fa-var-undo: "\f0e2"; -$fa-var-universal-access: "\f29a"; -$fa-var-university: "\f19c"; -$fa-var-unlink: "\f127"; -$fa-var-unlock: "\f09c"; -$fa-var-unlock-alt: "\f13e"; -$fa-var-unsorted: "\f0dc"; -$fa-var-upload: "\f093"; -$fa-var-usb: "\f287"; -$fa-var-usd: "\f155"; -$fa-var-user: "\f007"; -$fa-var-user-circle: "\f2bd"; -$fa-var-user-circle-o: "\f2be"; -$fa-var-user-md: "\f0f0"; -$fa-var-user-o: "\f2c0"; -$fa-var-user-plus: "\f234"; -$fa-var-user-secret: "\f21b"; -$fa-var-user-times: "\f235"; -$fa-var-users: "\f0c0"; -$fa-var-vcard: "\f2bb"; -$fa-var-vcard-o: "\f2bc"; -$fa-var-venus: "\f221"; -$fa-var-venus-double: "\f226"; -$fa-var-venus-mars: "\f228"; -$fa-var-viacoin: "\f237"; -$fa-var-viadeo: "\f2a9"; -$fa-var-viadeo-square: "\f2aa"; -$fa-var-video-camera: "\f03d"; -$fa-var-vimeo: "\f27d"; -$fa-var-vimeo-square: "\f194"; -$fa-var-vine: "\f1ca"; -$fa-var-vk: "\f189"; -$fa-var-volume-control-phone: "\f2a0"; -$fa-var-volume-down: "\f027"; -$fa-var-volume-off: "\f026"; -$fa-var-volume-up: "\f028"; -$fa-var-warning: "\f071"; -$fa-var-wechat: "\f1d7"; -$fa-var-weibo: "\f18a"; -$fa-var-weixin: "\f1d7"; -$fa-var-whatsapp: "\f232"; -$fa-var-wheelchair: "\f193"; -$fa-var-wheelchair-alt: "\f29b"; -$fa-var-wifi: "\f1eb"; -$fa-var-wikipedia-w: "\f266"; -$fa-var-window-close: "\f2d3"; -$fa-var-window-close-o: "\f2d4"; -$fa-var-window-maximize: "\f2d0"; -$fa-var-window-minimize: "\f2d1"; -$fa-var-window-restore: "\f2d2"; -$fa-var-windows: "\f17a"; -$fa-var-won: "\f159"; -$fa-var-wordpress: "\f19a"; -$fa-var-wpbeginner: "\f297"; -$fa-var-wpexplorer: "\f2de"; -$fa-var-wpforms: "\f298"; -$fa-var-wrench: "\f0ad"; -$fa-var-xing: "\f168"; -$fa-var-xing-square: "\f169"; -$fa-var-y-combinator: "\f23b"; -$fa-var-y-combinator-square: "\f1d4"; -$fa-var-yahoo: "\f19e"; -$fa-var-yc: "\f23b"; -$fa-var-yc-square: "\f1d4"; -$fa-var-yelp: "\f1e9"; -$fa-var-yen: "\f157"; -$fa-var-yoast: "\f2b1"; -$fa-var-youtube: "\f167"; -$fa-var-youtube-play: "\f16a"; -$fa-var-youtube-square: "\f166"; - diff --git a/public/assets/fonts/font-awesome-4.7.0/scss/font-awesome.scss b/public/assets/fonts/font-awesome-4.7.0/scss/font-awesome.scss deleted file mode 100644 index f1c83aa..0000000 --- a/public/assets/fonts/font-awesome-4.7.0/scss/font-awesome.scss +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ - -@import "variables"; -@import "mixins"; -@import "path"; -@import "core"; -@import "larger"; -@import "fixed-width"; -@import "list"; -@import "bordered-pulled"; -@import "animated"; -@import "rotated-flipped"; -@import "stacked"; -@import "icons"; -@import "screen-reader"; diff --git a/public/assets/fonts/iconic/css/material-design-iconic-font.css b/public/assets/fonts/iconic/css/material-design-iconic-font.css deleted file mode 100644 index 2525008..0000000 --- a/public/assets/fonts/iconic/css/material-design-iconic-font.css +++ /dev/null @@ -1,5166 +0,0 @@ -/*! - * Material Design Iconic Font by Sergey Kupletsky (@zavoloklom) - http://zavoloklom.github.io/material-design-iconic-font/ - * License - http://zavoloklom.github.io/material-design-iconic-font/license (Font: SIL OFL 1.1, CSS: MIT License) - */ -@font-face { - font-family: 'Material-Design-Iconic-Font'; - src: url('../fonts/Material-Design-Iconic-Font.woff2?v=2.2.0') format('woff2'), url('../fonts/Material-Design-Iconic-Font.woff?v=2.2.0') format('woff'), url('../fonts/Material-Design-Iconic-Font.ttf?v=2.2.0') format('truetype'); - font-weight: normal; - font-style: normal; -} -.zmdi { - display: inline-block; - font: normal normal normal 14px/1 'Material-Design-Iconic-Font'; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.zmdi-hc-lg { - font-size: 1.33333333em; - line-height: 0.75em; - vertical-align: -15%; -} -.zmdi-hc-2x { - font-size: 2em; -} -.zmdi-hc-3x { - font-size: 3em; -} -.zmdi-hc-4x { - font-size: 4em; -} -.zmdi-hc-5x { - font-size: 5em; -} -.zmdi-hc-fw { - width: 1.28571429em; - text-align: center; -} -.zmdi-hc-ul { - padding-left: 0; - margin-left: 2.14285714em; - list-style-type: none; -} -.zmdi-hc-ul > li { - position: relative; -} -.zmdi-hc-li { - position: absolute; - left: -2.14285714em; - width: 2.14285714em; - top: 0.14285714em; - text-align: center; -} -.zmdi-hc-li.zmdi-hc-lg { - left: -1.85714286em; -} -.zmdi-hc-border { - padding: .1em .25em; - border: solid 0.1em #9e9e9e; - border-radius: 2px; -} -.zmdi-hc-border-circle { - padding: .1em .25em; - border: solid 0.1em #9e9e9e; - border-radius: 50%; -} -.zmdi.pull-left { - float: left; - margin-right: .15em; -} -.zmdi.pull-right { - float: right; - margin-left: .15em; -} -.zmdi-hc-spin { - -webkit-animation: zmdi-spin 1.5s infinite linear; - animation: zmdi-spin 1.5s infinite linear; -} -.zmdi-hc-spin-reverse { - -webkit-animation: zmdi-spin-reverse 1.5s infinite linear; - animation: zmdi-spin-reverse 1.5s infinite linear; -} -@-webkit-keyframes zmdi-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -@keyframes zmdi-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -@-webkit-keyframes zmdi-spin-reverse { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(-359deg); - transform: rotate(-359deg); - } -} -@keyframes zmdi-spin-reverse { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(-359deg); - transform: rotate(-359deg); - } -} -.zmdi-hc-rotate-90 { - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); -} -.zmdi-hc-rotate-180 { - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); -} -.zmdi-hc-rotate-270 { - -webkit-transform: rotate(270deg); - -ms-transform: rotate(270deg); - transform: rotate(270deg); -} -.zmdi-hc-flip-horizontal { - -webkit-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.zmdi-hc-flip-vertical { - -webkit-transform: scale(1, -1); - -ms-transform: scale(1, -1); - transform: scale(1, -1); -} -.zmdi-hc-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.zmdi-hc-stack-1x, -.zmdi-hc-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.zmdi-hc-stack-1x { - line-height: inherit; -} -.zmdi-hc-stack-2x { - font-size: 2em; -} -.zmdi-hc-inverse { - color: #ffffff; -} -/* Material Design Iconic Font uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.zmdi-3d-rotation:before { - content: '\f101'; -} -.zmdi-airplane-off:before { - content: '\f102'; -} -.zmdi-airplane:before { - content: '\f103'; -} -.zmdi-album:before { - content: '\f104'; -} -.zmdi-archive:before { - content: '\f105'; -} -.zmdi-assignment-account:before { - content: '\f106'; -} -.zmdi-assignment-alert:before { - content: '\f107'; -} -.zmdi-assignment-check:before { - content: '\f108'; -} -.zmdi-assignment-o:before { - content: '\f109'; -} -.zmdi-assignment-return:before { - content: '\f10a'; -} -.zmdi-assignment-returned:before { - content: '\f10b'; -} -.zmdi-assignment:before { - content: '\f10c'; -} -.zmdi-attachment-alt:before { - content: '\f10d'; -} -.zmdi-attachment:before { - content: '\f10e'; -} -.zmdi-audio:before { - content: '\f10f'; -} -.zmdi-badge-check:before { - content: '\f110'; -} -.zmdi-balance-wallet:before { - content: '\f111'; -} -.zmdi-balance:before { - content: '\f112'; -} -.zmdi-battery-alert:before { - content: '\f113'; -} -.zmdi-battery-flash:before { - content: '\f114'; -} -.zmdi-battery-unknown:before { - content: '\f115'; -} -.zmdi-battery:before { - content: '\f116'; -} -.zmdi-bike:before { - content: '\f117'; -} -.zmdi-block-alt:before { - content: '\f118'; -} -.zmdi-block:before { - content: '\f119'; -} -.zmdi-boat:before { - content: '\f11a'; -} -.zmdi-book-image:before { - content: '\f11b'; -} -.zmdi-book:before { - content: '\f11c'; -} -.zmdi-bookmark-outline:before { - content: '\f11d'; -} -.zmdi-bookmark:before { - content: '\f11e'; -} -.zmdi-brush:before { - content: '\f11f'; -} -.zmdi-bug:before { - content: '\f120'; -} -.zmdi-bus:before { - content: '\f121'; -} -.zmdi-cake:before { - content: '\f122'; -} -.zmdi-car-taxi:before { - content: '\f123'; -} -.zmdi-car-wash:before { - content: '\f124'; -} -.zmdi-car:before { - content: '\f125'; -} -.zmdi-card-giftcard:before { - content: '\f126'; -} -.zmdi-card-membership:before { - content: '\f127'; -} -.zmdi-card-travel:before { - content: '\f128'; -} -.zmdi-card:before { - content: '\f129'; -} -.zmdi-case-check:before { - content: '\f12a'; -} -.zmdi-case-download:before { - content: '\f12b'; -} -.zmdi-case-play:before { - content: '\f12c'; -} -.zmdi-case:before { - content: '\f12d'; -} -.zmdi-cast-connected:before { - content: '\f12e'; -} -.zmdi-cast:before { - content: '\f12f'; -} -.zmdi-chart-donut:before { - content: '\f130'; -} -.zmdi-chart:before { - content: '\f131'; -} -.zmdi-city-alt:before { - content: '\f132'; -} -.zmdi-city:before { - content: '\f133'; -} -.zmdi-close-circle-o:before { - content: '\f134'; -} -.zmdi-close-circle:before { - content: '\f135'; -} -.zmdi-close:before { - content: '\f136'; -} -.zmdi-cocktail:before { - content: '\f137'; -} -.zmdi-code-setting:before { - content: '\f138'; -} -.zmdi-code-smartphone:before { - content: '\f139'; -} -.zmdi-code:before { - content: '\f13a'; -} -.zmdi-coffee:before { - content: '\f13b'; -} -.zmdi-collection-bookmark:before { - content: '\f13c'; -} -.zmdi-collection-case-play:before { - content: '\f13d'; -} -.zmdi-collection-folder-image:before { - content: '\f13e'; -} -.zmdi-collection-image-o:before { - content: '\f13f'; -} -.zmdi-collection-image:before { - content: '\f140'; -} -.zmdi-collection-item-1:before { - content: '\f141'; -} -.zmdi-collection-item-2:before { - content: '\f142'; -} -.zmdi-collection-item-3:before { - content: '\f143'; -} -.zmdi-collection-item-4:before { - content: '\f144'; -} -.zmdi-collection-item-5:before { - content: '\f145'; -} -.zmdi-collection-item-6:before { - content: '\f146'; -} -.zmdi-collection-item-7:before { - content: '\f147'; -} -.zmdi-collection-item-8:before { - content: '\f148'; -} -.zmdi-collection-item-9-plus:before { - content: '\f149'; -} -.zmdi-collection-item-9:before { - content: '\f14a'; -} -.zmdi-collection-item:before { - content: '\f14b'; -} -.zmdi-collection-music:before { - content: '\f14c'; -} -.zmdi-collection-pdf:before { - content: '\f14d'; -} -.zmdi-collection-plus:before { - content: '\f14e'; -} -.zmdi-collection-speaker:before { - content: '\f14f'; -} -.zmdi-collection-text:before { - content: '\f150'; -} -.zmdi-collection-video:before { - content: '\f151'; -} -.zmdi-compass:before { - content: '\f152'; -} -.zmdi-cutlery:before { - content: '\f153'; -} -.zmdi-delete:before { - content: '\f154'; -} -.zmdi-dialpad:before { - content: '\f155'; -} -.zmdi-dns:before { - content: '\f156'; -} -.zmdi-drink:before { - content: '\f157'; -} -.zmdi-edit:before { - content: '\f158'; -} -.zmdi-email-open:before { - content: '\f159'; -} -.zmdi-email:before { - content: '\f15a'; -} -.zmdi-eye-off:before { - content: '\f15b'; -} -.zmdi-eye:before { - content: '\f15c'; -} -.zmdi-eyedropper:before { - content: '\f15d'; -} -.zmdi-favorite-outline:before { - content: '\f15e'; -} -.zmdi-favorite:before { - content: '\f15f'; -} -.zmdi-filter-list:before { - content: '\f160'; -} -.zmdi-fire:before { - content: '\f161'; -} -.zmdi-flag:before { - content: '\f162'; -} -.zmdi-flare:before { - content: '\f163'; -} -.zmdi-flash-auto:before { - content: '\f164'; -} -.zmdi-flash-off:before { - content: '\f165'; -} -.zmdi-flash:before { - content: '\f166'; -} -.zmdi-flip:before { - content: '\f167'; -} -.zmdi-flower-alt:before { - content: '\f168'; -} -.zmdi-flower:before { - content: '\f169'; -} -.zmdi-font:before { - content: '\f16a'; -} -.zmdi-fullscreen-alt:before { - content: '\f16b'; -} -.zmdi-fullscreen-exit:before { - content: '\f16c'; -} -.zmdi-fullscreen:before { - content: '\f16d'; -} -.zmdi-functions:before { - content: '\f16e'; -} -.zmdi-gas-station:before { - content: '\f16f'; -} -.zmdi-gesture:before { - content: '\f170'; -} -.zmdi-globe-alt:before { - content: '\f171'; -} -.zmdi-globe-lock:before { - content: '\f172'; -} -.zmdi-globe:before { - content: '\f173'; -} -.zmdi-graduation-cap:before { - content: '\f174'; -} -.zmdi-home:before { - content: '\f175'; -} -.zmdi-hospital-alt:before { - content: '\f176'; -} -.zmdi-hospital:before { - content: '\f177'; -} -.zmdi-hotel:before { - content: '\f178'; -} -.zmdi-hourglass-alt:before { - content: '\f179'; -} -.zmdi-hourglass-outline:before { - content: '\f17a'; -} -.zmdi-hourglass:before { - content: '\f17b'; -} -.zmdi-http:before { - content: '\f17c'; -} -.zmdi-image-alt:before { - content: '\f17d'; -} -.zmdi-image-o:before { - content: '\f17e'; -} -.zmdi-image:before { - content: '\f17f'; -} -.zmdi-inbox:before { - content: '\f180'; -} -.zmdi-invert-colors-off:before { - content: '\f181'; -} -.zmdi-invert-colors:before { - content: '\f182'; -} -.zmdi-key:before { - content: '\f183'; -} -.zmdi-label-alt-outline:before { - content: '\f184'; -} -.zmdi-label-alt:before { - content: '\f185'; -} -.zmdi-label-heart:before { - content: '\f186'; -} -.zmdi-label:before { - content: '\f187'; -} -.zmdi-labels:before { - content: '\f188'; -} -.zmdi-lamp:before { - content: '\f189'; -} -.zmdi-landscape:before { - content: '\f18a'; -} -.zmdi-layers-off:before { - content: '\f18b'; -} -.zmdi-layers:before { - content: '\f18c'; -} -.zmdi-library:before { - content: '\f18d'; -} -.zmdi-link:before { - content: '\f18e'; -} -.zmdi-lock-open:before { - content: '\f18f'; -} -.zmdi-lock-outline:before { - content: '\f190'; -} -.zmdi-lock:before { - content: '\f191'; -} -.zmdi-mail-reply-all:before { - content: '\f192'; -} -.zmdi-mail-reply:before { - content: '\f193'; -} -.zmdi-mail-send:before { - content: '\f194'; -} -.zmdi-mall:before { - content: '\f195'; -} -.zmdi-map:before { - content: '\f196'; -} -.zmdi-menu:before { - content: '\f197'; -} -.zmdi-money-box:before { - content: '\f198'; -} -.zmdi-money-off:before { - content: '\f199'; -} -.zmdi-money:before { - content: '\f19a'; -} -.zmdi-more-vert:before { - content: '\f19b'; -} -.zmdi-more:before { - content: '\f19c'; -} -.zmdi-movie-alt:before { - content: '\f19d'; -} -.zmdi-movie:before { - content: '\f19e'; -} -.zmdi-nature-people:before { - content: '\f19f'; -} -.zmdi-nature:before { - content: '\f1a0'; -} -.zmdi-navigation:before { - content: '\f1a1'; -} -.zmdi-open-in-browser:before { - content: '\f1a2'; -} -.zmdi-open-in-new:before { - content: '\f1a3'; -} -.zmdi-palette:before { - content: '\f1a4'; -} -.zmdi-parking:before { - content: '\f1a5'; -} -.zmdi-pin-account:before { - content: '\f1a6'; -} -.zmdi-pin-assistant:before { - content: '\f1a7'; -} -.zmdi-pin-drop:before { - content: '\f1a8'; -} -.zmdi-pin-help:before { - content: '\f1a9'; -} -.zmdi-pin-off:before { - content: '\f1aa'; -} -.zmdi-pin:before { - content: '\f1ab'; -} -.zmdi-pizza:before { - content: '\f1ac'; -} -.zmdi-plaster:before { - content: '\f1ad'; -} -.zmdi-power-setting:before { - content: '\f1ae'; -} -.zmdi-power:before { - content: '\f1af'; -} -.zmdi-print:before { - content: '\f1b0'; -} -.zmdi-puzzle-piece:before { - content: '\f1b1'; -} -.zmdi-quote:before { - content: '\f1b2'; -} -.zmdi-railway:before { - content: '\f1b3'; -} -.zmdi-receipt:before { - content: '\f1b4'; -} -.zmdi-refresh-alt:before { - content: '\f1b5'; -} -.zmdi-refresh-sync-alert:before { - content: '\f1b6'; -} -.zmdi-refresh-sync-off:before { - content: '\f1b7'; -} -.zmdi-refresh-sync:before { - content: '\f1b8'; -} -.zmdi-refresh:before { - content: '\f1b9'; -} -.zmdi-roller:before { - content: '\f1ba'; -} -.zmdi-ruler:before { - content: '\f1bb'; -} -.zmdi-scissors:before { - content: '\f1bc'; -} -.zmdi-screen-rotation-lock:before { - content: '\f1bd'; -} -.zmdi-screen-rotation:before { - content: '\f1be'; -} -.zmdi-search-for:before { - content: '\f1bf'; -} -.zmdi-search-in-file:before { - content: '\f1c0'; -} -.zmdi-search-in-page:before { - content: '\f1c1'; -} -.zmdi-search-replace:before { - content: '\f1c2'; -} -.zmdi-search:before { - content: '\f1c3'; -} -.zmdi-seat:before { - content: '\f1c4'; -} -.zmdi-settings-square:before { - content: '\f1c5'; -} -.zmdi-settings:before { - content: '\f1c6'; -} -.zmdi-shield-check:before { - content: '\f1c7'; -} -.zmdi-shield-security:before { - content: '\f1c8'; -} -.zmdi-shopping-basket:before { - content: '\f1c9'; -} -.zmdi-shopping-cart-plus:before { - content: '\f1ca'; -} -.zmdi-shopping-cart:before { - content: '\f1cb'; -} -.zmdi-sign-in:before { - content: '\f1cc'; -} -.zmdi-sort-amount-asc:before { - content: '\f1cd'; -} -.zmdi-sort-amount-desc:before { - content: '\f1ce'; -} -.zmdi-sort-asc:before { - content: '\f1cf'; -} -.zmdi-sort-desc:before { - content: '\f1d0'; -} -.zmdi-spellcheck:before { - content: '\f1d1'; -} -.zmdi-storage:before { - content: '\f1d2'; -} -.zmdi-store-24:before { - content: '\f1d3'; -} -.zmdi-store:before { - content: '\f1d4'; -} -.zmdi-subway:before { - content: '\f1d5'; -} -.zmdi-sun:before { - content: '\f1d6'; -} -.zmdi-tab-unselected:before { - content: '\f1d7'; -} -.zmdi-tab:before { - content: '\f1d8'; -} -.zmdi-tag-close:before { - content: '\f1d9'; -} -.zmdi-tag-more:before { - content: '\f1da'; -} -.zmdi-tag:before { - content: '\f1db'; -} -.zmdi-thumb-down:before { - content: '\f1dc'; -} -.zmdi-thumb-up-down:before { - content: '\f1dd'; -} -.zmdi-thumb-up:before { - content: '\f1de'; -} -.zmdi-ticket-star:before { - content: '\f1df'; -} -.zmdi-toll:before { - content: '\f1e0'; -} -.zmdi-toys:before { - content: '\f1e1'; -} -.zmdi-traffic:before { - content: '\f1e2'; -} -.zmdi-translate:before { - content: '\f1e3'; -} -.zmdi-triangle-down:before { - content: '\f1e4'; -} -.zmdi-triangle-up:before { - content: '\f1e5'; -} -.zmdi-truck:before { - content: '\f1e6'; -} -.zmdi-turning-sign:before { - content: '\f1e7'; -} -.zmdi-wallpaper:before { - content: '\f1e8'; -} -.zmdi-washing-machine:before { - content: '\f1e9'; -} -.zmdi-window-maximize:before { - content: '\f1ea'; -} -.zmdi-window-minimize:before { - content: '\f1eb'; -} -.zmdi-window-restore:before { - content: '\f1ec'; -} -.zmdi-wrench:before { - content: '\f1ed'; -} -.zmdi-zoom-in:before { - content: '\f1ee'; -} -.zmdi-zoom-out:before { - content: '\f1ef'; -} -.zmdi-alert-circle-o:before { - content: '\f1f0'; -} -.zmdi-alert-circle:before { - content: '\f1f1'; -} -.zmdi-alert-octagon:before { - content: '\f1f2'; -} -.zmdi-alert-polygon:before { - content: '\f1f3'; -} -.zmdi-alert-triangle:before { - content: '\f1f4'; -} -.zmdi-help-outline:before { - content: '\f1f5'; -} -.zmdi-help:before { - content: '\f1f6'; -} -.zmdi-info-outline:before { - content: '\f1f7'; -} -.zmdi-info:before { - content: '\f1f8'; -} -.zmdi-notifications-active:before { - content: '\f1f9'; -} -.zmdi-notifications-add:before { - content: '\f1fa'; -} -.zmdi-notifications-none:before { - content: '\f1fb'; -} -.zmdi-notifications-off:before { - content: '\f1fc'; -} -.zmdi-notifications-paused:before { - content: '\f1fd'; -} -.zmdi-notifications:before { - content: '\f1fe'; -} -.zmdi-account-add:before { - content: '\f1ff'; -} -.zmdi-account-box-mail:before { - content: '\f200'; -} -.zmdi-account-box-o:before { - content: '\f201'; -} -.zmdi-account-box-phone:before { - content: '\f202'; -} -.zmdi-account-box:before { - content: '\f203'; -} -.zmdi-account-calendar:before { - content: '\f204'; -} -.zmdi-account-circle:before { - content: '\f205'; -} -.zmdi-account-o:before { - content: '\f206'; -} -.zmdi-account:before { - content: '\f207'; -} -.zmdi-accounts-add:before { - content: '\f208'; -} -.zmdi-accounts-alt:before { - content: '\f209'; -} -.zmdi-accounts-list-alt:before { - content: '\f20a'; -} -.zmdi-accounts-list:before { - content: '\f20b'; -} -.zmdi-accounts-outline:before { - content: '\f20c'; -} -.zmdi-accounts:before { - content: '\f20d'; -} -.zmdi-face:before { - content: '\f20e'; -} -.zmdi-female:before { - content: '\f20f'; -} -.zmdi-male-alt:before { - content: '\f210'; -} -.zmdi-male-female:before { - content: '\f211'; -} -.zmdi-male:before { - content: '\f212'; -} -.zmdi-mood-bad:before { - content: '\f213'; -} -.zmdi-mood:before { - content: '\f214'; -} -.zmdi-run:before { - content: '\f215'; -} -.zmdi-walk:before { - content: '\f216'; -} -.zmdi-cloud-box:before { - content: '\f217'; -} -.zmdi-cloud-circle:before { - content: '\f218'; -} -.zmdi-cloud-done:before { - content: '\f219'; -} -.zmdi-cloud-download:before { - content: '\f21a'; -} -.zmdi-cloud-off:before { - content: '\f21b'; -} -.zmdi-cloud-outline-alt:before { - content: '\f21c'; -} -.zmdi-cloud-outline:before { - content: '\f21d'; -} -.zmdi-cloud-upload:before { - content: '\f21e'; -} -.zmdi-cloud:before { - content: '\f21f'; -} -.zmdi-download:before { - content: '\f220'; -} -.zmdi-file-plus:before { - content: '\f221'; -} -.zmdi-file-text:before { - content: '\f222'; -} -.zmdi-file:before { - content: '\f223'; -} -.zmdi-folder-outline:before { - content: '\f224'; -} -.zmdi-folder-person:before { - content: '\f225'; -} -.zmdi-folder-star-alt:before { - content: '\f226'; -} -.zmdi-folder-star:before { - content: '\f227'; -} -.zmdi-folder:before { - content: '\f228'; -} -.zmdi-gif:before { - content: '\f229'; -} -.zmdi-upload:before { - content: '\f22a'; -} -.zmdi-border-all:before { - content: '\f22b'; -} -.zmdi-border-bottom:before { - content: '\f22c'; -} -.zmdi-border-clear:before { - content: '\f22d'; -} -.zmdi-border-color:before { - content: '\f22e'; -} -.zmdi-border-horizontal:before { - content: '\f22f'; -} -.zmdi-border-inner:before { - content: '\f230'; -} -.zmdi-border-left:before { - content: '\f231'; -} -.zmdi-border-outer:before { - content: '\f232'; -} -.zmdi-border-right:before { - content: '\f233'; -} -.zmdi-border-style:before { - content: '\f234'; -} -.zmdi-border-top:before { - content: '\f235'; -} -.zmdi-border-vertical:before { - content: '\f236'; -} -.zmdi-copy:before { - content: '\f237'; -} -.zmdi-crop:before { - content: '\f238'; -} -.zmdi-format-align-center:before { - content: '\f239'; -} -.zmdi-format-align-justify:before { - content: '\f23a'; -} -.zmdi-format-align-left:before { - content: '\f23b'; -} -.zmdi-format-align-right:before { - content: '\f23c'; -} -.zmdi-format-bold:before { - content: '\f23d'; -} -.zmdi-format-clear-all:before { - content: '\f23e'; -} -.zmdi-format-clear:before { - content: '\f23f'; -} -.zmdi-format-color-fill:before { - content: '\f240'; -} -.zmdi-format-color-reset:before { - content: '\f241'; -} -.zmdi-format-color-text:before { - content: '\f242'; -} -.zmdi-format-indent-decrease:before { - content: '\f243'; -} -.zmdi-format-indent-increase:before { - content: '\f244'; -} -.zmdi-format-italic:before { - content: '\f245'; -} -.zmdi-format-line-spacing:before { - content: '\f246'; -} -.zmdi-format-list-bulleted:before { - content: '\f247'; -} -.zmdi-format-list-numbered:before { - content: '\f248'; -} -.zmdi-format-ltr:before { - content: '\f249'; -} -.zmdi-format-rtl:before { - content: '\f24a'; -} -.zmdi-format-size:before { - content: '\f24b'; -} -.zmdi-format-strikethrough-s:before { - content: '\f24c'; -} -.zmdi-format-strikethrough:before { - content: '\f24d'; -} -.zmdi-format-subject:before { - content: '\f24e'; -} -.zmdi-format-underlined:before { - content: '\f24f'; -} -.zmdi-format-valign-bottom:before { - content: '\f250'; -} -.zmdi-format-valign-center:before { - content: '\f251'; -} -.zmdi-format-valign-top:before { - content: '\f252'; -} -.zmdi-redo:before { - content: '\f253'; -} -.zmdi-select-all:before { - content: '\f254'; -} -.zmdi-space-bar:before { - content: '\f255'; -} -.zmdi-text-format:before { - content: '\f256'; -} -.zmdi-transform:before { - content: '\f257'; -} -.zmdi-undo:before { - content: '\f258'; -} -.zmdi-wrap-text:before { - content: '\f259'; -} -.zmdi-comment-alert:before { - content: '\f25a'; -} -.zmdi-comment-alt-text:before { - content: '\f25b'; -} -.zmdi-comment-alt:before { - content: '\f25c'; -} -.zmdi-comment-edit:before { - content: '\f25d'; -} -.zmdi-comment-image:before { - content: '\f25e'; -} -.zmdi-comment-list:before { - content: '\f25f'; -} -.zmdi-comment-more:before { - content: '\f260'; -} -.zmdi-comment-outline:before { - content: '\f261'; -} -.zmdi-comment-text-alt:before { - content: '\f262'; -} -.zmdi-comment-text:before { - content: '\f263'; -} -.zmdi-comment-video:before { - content: '\f264'; -} -.zmdi-comment:before { - content: '\f265'; -} -.zmdi-comments:before { - content: '\f266'; -} -.zmdi-check-all:before { - content: '\f267'; -} -.zmdi-check-circle-u:before { - content: '\f268'; -} -.zmdi-check-circle:before { - content: '\f269'; -} -.zmdi-check-square:before { - content: '\f26a'; -} -.zmdi-check:before { - content: '\f26b'; -} -.zmdi-circle-o:before { - content: '\f26c'; -} -.zmdi-circle:before { - content: '\f26d'; -} -.zmdi-dot-circle-alt:before { - content: '\f26e'; -} -.zmdi-dot-circle:before { - content: '\f26f'; -} -.zmdi-minus-circle-outline:before { - content: '\f270'; -} -.zmdi-minus-circle:before { - content: '\f271'; -} -.zmdi-minus-square:before { - content: '\f272'; -} -.zmdi-minus:before { - content: '\f273'; -} -.zmdi-plus-circle-o-duplicate:before { - content: '\f274'; -} -.zmdi-plus-circle-o:before { - content: '\f275'; -} -.zmdi-plus-circle:before { - content: '\f276'; -} -.zmdi-plus-square:before { - content: '\f277'; -} -.zmdi-plus:before { - content: '\f278'; -} -.zmdi-square-o:before { - content: '\f279'; -} -.zmdi-star-circle:before { - content: '\f27a'; -} -.zmdi-star-half:before { - content: '\f27b'; -} -.zmdi-star-outline:before { - content: '\f27c'; -} -.zmdi-star:before { - content: '\f27d'; -} -.zmdi-bluetooth-connected:before { - content: '\f27e'; -} -.zmdi-bluetooth-off:before { - content: '\f27f'; -} -.zmdi-bluetooth-search:before { - content: '\f280'; -} -.zmdi-bluetooth-setting:before { - content: '\f281'; -} -.zmdi-bluetooth:before { - content: '\f282'; -} -.zmdi-camera-add:before { - content: '\f283'; -} -.zmdi-camera-alt:before { - content: '\f284'; -} -.zmdi-camera-bw:before { - content: '\f285'; -} -.zmdi-camera-front:before { - content: '\f286'; -} -.zmdi-camera-mic:before { - content: '\f287'; -} -.zmdi-camera-party-mode:before { - content: '\f288'; -} -.zmdi-camera-rear:before { - content: '\f289'; -} -.zmdi-camera-roll:before { - content: '\f28a'; -} -.zmdi-camera-switch:before { - content: '\f28b'; -} -.zmdi-camera:before { - content: '\f28c'; -} -.zmdi-card-alert:before { - content: '\f28d'; -} -.zmdi-card-off:before { - content: '\f28e'; -} -.zmdi-card-sd:before { - content: '\f28f'; -} -.zmdi-card-sim:before { - content: '\f290'; -} -.zmdi-desktop-mac:before { - content: '\f291'; -} -.zmdi-desktop-windows:before { - content: '\f292'; -} -.zmdi-device-hub:before { - content: '\f293'; -} -.zmdi-devices-off:before { - content: '\f294'; -} -.zmdi-devices:before { - content: '\f295'; -} -.zmdi-dock:before { - content: '\f296'; -} -.zmdi-floppy:before { - content: '\f297'; -} -.zmdi-gamepad:before { - content: '\f298'; -} -.zmdi-gps-dot:before { - content: '\f299'; -} -.zmdi-gps-off:before { - content: '\f29a'; -} -.zmdi-gps:before { - content: '\f29b'; -} -.zmdi-headset-mic:before { - content: '\f29c'; -} -.zmdi-headset:before { - content: '\f29d'; -} -.zmdi-input-antenna:before { - content: '\f29e'; -} -.zmdi-input-composite:before { - content: '\f29f'; -} -.zmdi-input-hdmi:before { - content: '\f2a0'; -} -.zmdi-input-power:before { - content: '\f2a1'; -} -.zmdi-input-svideo:before { - content: '\f2a2'; -} -.zmdi-keyboard-hide:before { - content: '\f2a3'; -} -.zmdi-keyboard:before { - content: '\f2a4'; -} -.zmdi-laptop-chromebook:before { - content: '\f2a5'; -} -.zmdi-laptop-mac:before { - content: '\f2a6'; -} -.zmdi-laptop:before { - content: '\f2a7'; -} -.zmdi-mic-off:before { - content: '\f2a8'; -} -.zmdi-mic-outline:before { - content: '\f2a9'; -} -.zmdi-mic-setting:before { - content: '\f2aa'; -} -.zmdi-mic:before { - content: '\f2ab'; -} -.zmdi-mouse:before { - content: '\f2ac'; -} -.zmdi-network-alert:before { - content: '\f2ad'; -} -.zmdi-network-locked:before { - content: '\f2ae'; -} -.zmdi-network-off:before { - content: '\f2af'; -} -.zmdi-network-outline:before { - content: '\f2b0'; -} -.zmdi-network-setting:before { - content: '\f2b1'; -} -.zmdi-network:before { - content: '\f2b2'; -} -.zmdi-phone-bluetooth:before { - content: '\f2b3'; -} -.zmdi-phone-end:before { - content: '\f2b4'; -} -.zmdi-phone-forwarded:before { - content: '\f2b5'; -} -.zmdi-phone-in-talk:before { - content: '\f2b6'; -} -.zmdi-phone-locked:before { - content: '\f2b7'; -} -.zmdi-phone-missed:before { - content: '\f2b8'; -} -.zmdi-phone-msg:before { - content: '\f2b9'; -} -.zmdi-phone-paused:before { - content: '\f2ba'; -} -.zmdi-phone-ring:before { - content: '\f2bb'; -} -.zmdi-phone-setting:before { - content: '\f2bc'; -} -.zmdi-phone-sip:before { - content: '\f2bd'; -} -.zmdi-phone:before { - content: '\f2be'; -} -.zmdi-portable-wifi-changes:before { - content: '\f2bf'; -} -.zmdi-portable-wifi-off:before { - content: '\f2c0'; -} -.zmdi-portable-wifi:before { - content: '\f2c1'; -} -.zmdi-radio:before { - content: '\f2c2'; -} -.zmdi-reader:before { - content: '\f2c3'; -} -.zmdi-remote-control-alt:before { - content: '\f2c4'; -} -.zmdi-remote-control:before { - content: '\f2c5'; -} -.zmdi-router:before { - content: '\f2c6'; -} -.zmdi-scanner:before { - content: '\f2c7'; -} -.zmdi-smartphone-android:before { - content: '\f2c8'; -} -.zmdi-smartphone-download:before { - content: '\f2c9'; -} -.zmdi-smartphone-erase:before { - content: '\f2ca'; -} -.zmdi-smartphone-info:before { - content: '\f2cb'; -} -.zmdi-smartphone-iphone:before { - content: '\f2cc'; -} -.zmdi-smartphone-landscape-lock:before { - content: '\f2cd'; -} -.zmdi-smartphone-landscape:before { - content: '\f2ce'; -} -.zmdi-smartphone-lock:before { - content: '\f2cf'; -} -.zmdi-smartphone-portrait-lock:before { - content: '\f2d0'; -} -.zmdi-smartphone-ring:before { - content: '\f2d1'; -} -.zmdi-smartphone-setting:before { - content: '\f2d2'; -} -.zmdi-smartphone-setup:before { - content: '\f2d3'; -} -.zmdi-smartphone:before { - content: '\f2d4'; -} -.zmdi-speaker:before { - content: '\f2d5'; -} -.zmdi-tablet-android:before { - content: '\f2d6'; -} -.zmdi-tablet-mac:before { - content: '\f2d7'; -} -.zmdi-tablet:before { - content: '\f2d8'; -} -.zmdi-tv-alt-play:before { - content: '\f2d9'; -} -.zmdi-tv-list:before { - content: '\f2da'; -} -.zmdi-tv-play:before { - content: '\f2db'; -} -.zmdi-tv:before { - content: '\f2dc'; -} -.zmdi-usb:before { - content: '\f2dd'; -} -.zmdi-videocam-off:before { - content: '\f2de'; -} -.zmdi-videocam-switch:before { - content: '\f2df'; -} -.zmdi-videocam:before { - content: '\f2e0'; -} -.zmdi-watch:before { - content: '\f2e1'; -} -.zmdi-wifi-alt-2:before { - content: '\f2e2'; -} -.zmdi-wifi-alt:before { - content: '\f2e3'; -} -.zmdi-wifi-info:before { - content: '\f2e4'; -} -.zmdi-wifi-lock:before { - content: '\f2e5'; -} -.zmdi-wifi-off:before { - content: '\f2e6'; -} -.zmdi-wifi-outline:before { - content: '\f2e7'; -} -.zmdi-wifi:before { - content: '\f2e8'; -} -.zmdi-arrow-left-bottom:before { - content: '\f2e9'; -} -.zmdi-arrow-left:before { - content: '\f2ea'; -} -.zmdi-arrow-merge:before { - content: '\f2eb'; -} -.zmdi-arrow-missed:before { - content: '\f2ec'; -} -.zmdi-arrow-right-top:before { - content: '\f2ed'; -} -.zmdi-arrow-right:before { - content: '\f2ee'; -} -.zmdi-arrow-split:before { - content: '\f2ef'; -} -.zmdi-arrows:before { - content: '\f2f0'; -} -.zmdi-caret-down-circle:before { - content: '\f2f1'; -} -.zmdi-caret-down:before { - content: '\f2f2'; -} -.zmdi-caret-left-circle:before { - content: '\f2f3'; -} -.zmdi-caret-left:before { - content: '\f2f4'; -} -.zmdi-caret-right-circle:before { - content: '\f2f5'; -} -.zmdi-caret-right:before { - content: '\f2f6'; -} -.zmdi-caret-up-circle:before { - content: '\f2f7'; -} -.zmdi-caret-up:before { - content: '\f2f8'; -} -.zmdi-chevron-down:before { - content: '\f2f9'; -} -.zmdi-chevron-left:before { - content: '\f2fa'; -} -.zmdi-chevron-right:before { - content: '\f2fb'; -} -.zmdi-chevron-up:before { - content: '\f2fc'; -} -.zmdi-forward:before { - content: '\f2fd'; -} -.zmdi-long-arrow-down:before { - content: '\f2fe'; -} -.zmdi-long-arrow-left:before { - content: '\f2ff'; -} -.zmdi-long-arrow-return:before { - content: '\f300'; -} -.zmdi-long-arrow-right:before { - content: '\f301'; -} -.zmdi-long-arrow-tab:before { - content: '\f302'; -} -.zmdi-long-arrow-up:before { - content: '\f303'; -} -.zmdi-rotate-ccw:before { - content: '\f304'; -} -.zmdi-rotate-cw:before { - content: '\f305'; -} -.zmdi-rotate-left:before { - content: '\f306'; -} -.zmdi-rotate-right:before { - content: '\f307'; -} -.zmdi-square-down:before { - content: '\f308'; -} -.zmdi-square-right:before { - content: '\f309'; -} -.zmdi-swap-alt:before { - content: '\f30a'; -} -.zmdi-swap-vertical-circle:before { - content: '\f30b'; -} -.zmdi-swap-vertical:before { - content: '\f30c'; -} -.zmdi-swap:before { - content: '\f30d'; -} -.zmdi-trending-down:before { - content: '\f30e'; -} -.zmdi-trending-flat:before { - content: '\f30f'; -} -.zmdi-trending-up:before { - content: '\f310'; -} -.zmdi-unfold-less:before { - content: '\f311'; -} -.zmdi-unfold-more:before { - content: '\f312'; -} -.zmdi-apps:before { - content: '\f313'; -} -.zmdi-grid-off:before { - content: '\f314'; -} -.zmdi-grid:before { - content: '\f315'; -} -.zmdi-view-agenda:before { - content: '\f316'; -} -.zmdi-view-array:before { - content: '\f317'; -} -.zmdi-view-carousel:before { - content: '\f318'; -} -.zmdi-view-column:before { - content: '\f319'; -} -.zmdi-view-comfy:before { - content: '\f31a'; -} -.zmdi-view-compact:before { - content: '\f31b'; -} -.zmdi-view-dashboard:before { - content: '\f31c'; -} -.zmdi-view-day:before { - content: '\f31d'; -} -.zmdi-view-headline:before { - content: '\f31e'; -} -.zmdi-view-list-alt:before { - content: '\f31f'; -} -.zmdi-view-list:before { - content: '\f320'; -} -.zmdi-view-module:before { - content: '\f321'; -} -.zmdi-view-quilt:before { - content: '\f322'; -} -.zmdi-view-stream:before { - content: '\f323'; -} -.zmdi-view-subtitles:before { - content: '\f324'; -} -.zmdi-view-toc:before { - content: '\f325'; -} -.zmdi-view-web:before { - content: '\f326'; -} -.zmdi-view-week:before { - content: '\f327'; -} -.zmdi-widgets:before { - content: '\f328'; -} -.zmdi-alarm-check:before { - content: '\f329'; -} -.zmdi-alarm-off:before { - content: '\f32a'; -} -.zmdi-alarm-plus:before { - content: '\f32b'; -} -.zmdi-alarm-snooze:before { - content: '\f32c'; -} -.zmdi-alarm:before { - content: '\f32d'; -} -.zmdi-calendar-alt:before { - content: '\f32e'; -} -.zmdi-calendar-check:before { - content: '\f32f'; -} -.zmdi-calendar-close:before { - content: '\f330'; -} -.zmdi-calendar-note:before { - content: '\f331'; -} -.zmdi-calendar:before { - content: '\f332'; -} -.zmdi-time-countdown:before { - content: '\f333'; -} -.zmdi-time-interval:before { - content: '\f334'; -} -.zmdi-time-restore-setting:before { - content: '\f335'; -} -.zmdi-time-restore:before { - content: '\f336'; -} -.zmdi-time:before { - content: '\f337'; -} -.zmdi-timer-off:before { - content: '\f338'; -} -.zmdi-timer:before { - content: '\f339'; -} -.zmdi-android-alt:before { - content: '\f33a'; -} -.zmdi-android:before { - content: '\f33b'; -} -.zmdi-apple:before { - content: '\f33c'; -} -.zmdi-behance:before { - content: '\f33d'; -} -.zmdi-codepen:before { - content: '\f33e'; -} -.zmdi-dribbble:before { - content: '\f33f'; -} -.zmdi-dropbox:before { - content: '\f340'; -} -.zmdi-evernote:before { - content: '\f341'; -} -.zmdi-facebook-box:before { - content: '\f342'; -} -.zmdi-facebook:before { - content: '\f343'; -} -.zmdi-github-box:before { - content: '\f344'; -} -.zmdi-github:before { - content: '\f345'; -} -.zmdi-google-drive:before { - content: '\f346'; -} -.zmdi-google-earth:before { - content: '\f347'; -} -.zmdi-google-glass:before { - content: '\f348'; -} -.zmdi-google-maps:before { - content: '\f349'; -} -.zmdi-google-pages:before { - content: '\f34a'; -} -.zmdi-google-play:before { - content: '\f34b'; -} -.zmdi-google-plus-box:before { - content: '\f34c'; -} -.zmdi-google-plus:before { - content: '\f34d'; -} -.zmdi-google:before { - content: '\f34e'; -} -.zmdi-instagram:before { - content: '\f34f'; -} -.zmdi-language-css3:before { - content: '\f350'; -} -.zmdi-language-html5:before { - content: '\f351'; -} -.zmdi-language-javascript:before { - content: '\f352'; -} -.zmdi-language-python-alt:before { - content: '\f353'; -} -.zmdi-language-python:before { - content: '\f354'; -} -.zmdi-lastfm:before { - content: '\f355'; -} -.zmdi-linkedin-box:before { - content: '\f356'; -} -.zmdi-paypal:before { - content: '\f357'; -} -.zmdi-pinterest-box:before { - content: '\f358'; -} -.zmdi-pocket:before { - content: '\f359'; -} -.zmdi-polymer:before { - content: '\f35a'; -} -.zmdi-share:before { - content: '\f35b'; -} -.zmdi-stackoverflow:before { - content: '\f35c'; -} -.zmdi-steam-square:before { - content: '\f35d'; -} -.zmdi-steam:before { - content: '\f35e'; -} -.zmdi-twitter-box:before { - content: '\f35f'; -} -.zmdi-twitter:before { - content: '\f360'; -} -.zmdi-vk:before { - content: '\f361'; -} -.zmdi-wikipedia:before { - content: '\f362'; -} -.zmdi-windows:before { - content: '\f363'; -} -.zmdi-aspect-ratio-alt:before { - content: '\f364'; -} -.zmdi-aspect-ratio:before { - content: '\f365'; -} -.zmdi-blur-circular:before { - content: '\f366'; -} -.zmdi-blur-linear:before { - content: '\f367'; -} -.zmdi-blur-off:before { - content: '\f368'; -} -.zmdi-blur:before { - content: '\f369'; -} -.zmdi-brightness-2:before { - content: '\f36a'; -} -.zmdi-brightness-3:before { - content: '\f36b'; -} -.zmdi-brightness-4:before { - content: '\f36c'; -} -.zmdi-brightness-5:before { - content: '\f36d'; -} -.zmdi-brightness-6:before { - content: '\f36e'; -} -.zmdi-brightness-7:before { - content: '\f36f'; -} -.zmdi-brightness-auto:before { - content: '\f370'; -} -.zmdi-brightness-setting:before { - content: '\f371'; -} -.zmdi-broken-image:before { - content: '\f372'; -} -.zmdi-center-focus-strong:before { - content: '\f373'; -} -.zmdi-center-focus-weak:before { - content: '\f374'; -} -.zmdi-compare:before { - content: '\f375'; -} -.zmdi-crop-16-9:before { - content: '\f376'; -} -.zmdi-crop-3-2:before { - content: '\f377'; -} -.zmdi-crop-5-4:before { - content: '\f378'; -} -.zmdi-crop-7-5:before { - content: '\f379'; -} -.zmdi-crop-din:before { - content: '\f37a'; -} -.zmdi-crop-free:before { - content: '\f37b'; -} -.zmdi-crop-landscape:before { - content: '\f37c'; -} -.zmdi-crop-portrait:before { - content: '\f37d'; -} -.zmdi-crop-square:before { - content: '\f37e'; -} -.zmdi-exposure-alt:before { - content: '\f37f'; -} -.zmdi-exposure:before { - content: '\f380'; -} -.zmdi-filter-b-and-w:before { - content: '\f381'; -} -.zmdi-filter-center-focus:before { - content: '\f382'; -} -.zmdi-filter-frames:before { - content: '\f383'; -} -.zmdi-filter-tilt-shift:before { - content: '\f384'; -} -.zmdi-gradient:before { - content: '\f385'; -} -.zmdi-grain:before { - content: '\f386'; -} -.zmdi-graphic-eq:before { - content: '\f387'; -} -.zmdi-hdr-off:before { - content: '\f388'; -} -.zmdi-hdr-strong:before { - content: '\f389'; -} -.zmdi-hdr-weak:before { - content: '\f38a'; -} -.zmdi-hdr:before { - content: '\f38b'; -} -.zmdi-iridescent:before { - content: '\f38c'; -} -.zmdi-leak-off:before { - content: '\f38d'; -} -.zmdi-leak:before { - content: '\f38e'; -} -.zmdi-looks:before { - content: '\f38f'; -} -.zmdi-loupe:before { - content: '\f390'; -} -.zmdi-panorama-horizontal:before { - content: '\f391'; -} -.zmdi-panorama-vertical:before { - content: '\f392'; -} -.zmdi-panorama-wide-angle:before { - content: '\f393'; -} -.zmdi-photo-size-select-large:before { - content: '\f394'; -} -.zmdi-photo-size-select-small:before { - content: '\f395'; -} -.zmdi-picture-in-picture:before { - content: '\f396'; -} -.zmdi-slideshow:before { - content: '\f397'; -} -.zmdi-texture:before { - content: '\f398'; -} -.zmdi-tonality:before { - content: '\f399'; -} -.zmdi-vignette:before { - content: '\f39a'; -} -.zmdi-wb-auto:before { - content: '\f39b'; -} -.zmdi-eject-alt:before { - content: '\f39c'; -} -.zmdi-eject:before { - content: '\f39d'; -} -.zmdi-equalizer:before { - content: '\f39e'; -} -.zmdi-fast-forward:before { - content: '\f39f'; -} -.zmdi-fast-rewind:before { - content: '\f3a0'; -} -.zmdi-forward-10:before { - content: '\f3a1'; -} -.zmdi-forward-30:before { - content: '\f3a2'; -} -.zmdi-forward-5:before { - content: '\f3a3'; -} -.zmdi-hearing:before { - content: '\f3a4'; -} -.zmdi-pause-circle-outline:before { - content: '\f3a5'; -} -.zmdi-pause-circle:before { - content: '\f3a6'; -} -.zmdi-pause:before { - content: '\f3a7'; -} -.zmdi-play-circle-outline:before { - content: '\f3a8'; -} -.zmdi-play-circle:before { - content: '\f3a9'; -} -.zmdi-play:before { - content: '\f3aa'; -} -.zmdi-playlist-audio:before { - content: '\f3ab'; -} -.zmdi-playlist-plus:before { - content: '\f3ac'; -} -.zmdi-repeat-one:before { - content: '\f3ad'; -} -.zmdi-repeat:before { - content: '\f3ae'; -} -.zmdi-replay-10:before { - content: '\f3af'; -} -.zmdi-replay-30:before { - content: '\f3b0'; -} -.zmdi-replay-5:before { - content: '\f3b1'; -} -.zmdi-replay:before { - content: '\f3b2'; -} -.zmdi-shuffle:before { - content: '\f3b3'; -} -.zmdi-skip-next:before { - content: '\f3b4'; -} -.zmdi-skip-previous:before { - content: '\f3b5'; -} -.zmdi-stop:before { - content: '\f3b6'; -} -.zmdi-surround-sound:before { - content: '\f3b7'; -} -.zmdi-tune:before { - content: '\f3b8'; -} -.zmdi-volume-down:before { - content: '\f3b9'; -} -.zmdi-volume-mute:before { - content: '\f3ba'; -} -.zmdi-volume-off:before { - content: '\f3bb'; -} -.zmdi-volume-up:before { - content: '\f3bc'; -} -.zmdi-n-1-square:before { - content: '\f3bd'; -} -.zmdi-n-2-square:before { - content: '\f3be'; -} -.zmdi-n-3-square:before { - content: '\f3bf'; -} -.zmdi-n-4-square:before { - content: '\f3c0'; -} -.zmdi-n-5-square:before { - content: '\f3c1'; -} -.zmdi-n-6-square:before { - content: '\f3c2'; -} -.zmdi-neg-1:before { - content: '\f3c3'; -} -.zmdi-neg-2:before { - content: '\f3c4'; -} -.zmdi-plus-1:before { - content: '\f3c5'; -} -.zmdi-plus-2:before { - content: '\f3c6'; -} -.zmdi-sec-10:before { - content: '\f3c7'; -} -.zmdi-sec-3:before { - content: '\f3c8'; -} -.zmdi-zero:before { - content: '\f3c9'; -} -.zmdi-airline-seat-flat-angled:before { - content: '\f3ca'; -} -.zmdi-airline-seat-flat:before { - content: '\f3cb'; -} -.zmdi-airline-seat-individual-suite:before { - content: '\f3cc'; -} -.zmdi-airline-seat-legroom-extra:before { - content: '\f3cd'; -} -.zmdi-airline-seat-legroom-normal:before { - content: '\f3ce'; -} -.zmdi-airline-seat-legroom-reduced:before { - content: '\f3cf'; -} -.zmdi-airline-seat-recline-extra:before { - content: '\f3d0'; -} -.zmdi-airline-seat-recline-normal:before { - content: '\f3d1'; -} -.zmdi-airplay:before { - content: '\f3d2'; -} -.zmdi-closed-caption:before { - content: '\f3d3'; -} -.zmdi-confirmation-number:before { - content: '\f3d4'; -} -.zmdi-developer-board:before { - content: '\f3d5'; -} -.zmdi-disc-full:before { - content: '\f3d6'; -} -.zmdi-explicit:before { - content: '\f3d7'; -} -.zmdi-flight-land:before { - content: '\f3d8'; -} -.zmdi-flight-takeoff:before { - content: '\f3d9'; -} -.zmdi-flip-to-back:before { - content: '\f3da'; -} -.zmdi-flip-to-front:before { - content: '\f3db'; -} -.zmdi-group-work:before { - content: '\f3dc'; -} -.zmdi-hd:before { - content: '\f3dd'; -} -.zmdi-hq:before { - content: '\f3de'; -} -.zmdi-markunread-mailbox:before { - content: '\f3df'; -} -.zmdi-memory:before { - content: '\f3e0'; -} -.zmdi-nfc:before { - content: '\f3e1'; -} -.zmdi-play-for-work:before { - content: '\f3e2'; -} -.zmdi-power-input:before { - content: '\f3e3'; -} -.zmdi-present-to-all:before { - content: '\f3e4'; -} -.zmdi-satellite:before { - content: '\f3e5'; -} -.zmdi-tap-and-play:before { - content: '\f3e6'; -} -.zmdi-vibration:before { - content: '\f3e7'; -} -.zmdi-voicemail:before { - content: '\f3e8'; -} -.zmdi-group:before { - content: '\f3e9'; -} -.zmdi-rss:before { - content: '\f3ea'; -} -.zmdi-shape:before { - content: '\f3eb'; -} -.zmdi-spinner:before { - content: '\f3ec'; -} -.zmdi-ungroup:before { - content: '\f3ed'; -} -.zmdi-500px:before { - content: '\f3ee'; -} -.zmdi-8tracks:before { - content: '\f3ef'; -} -.zmdi-amazon:before { - content: '\f3f0'; -} -.zmdi-blogger:before { - content: '\f3f1'; -} -.zmdi-delicious:before { - content: '\f3f2'; -} -.zmdi-disqus:before { - content: '\f3f3'; -} -.zmdi-flattr:before { - content: '\f3f4'; -} -.zmdi-flickr:before { - content: '\f3f5'; -} -.zmdi-github-alt:before { - content: '\f3f6'; -} -.zmdi-google-old:before { - content: '\f3f7'; -} -.zmdi-linkedin:before { - content: '\f3f8'; -} -.zmdi-odnoklassniki:before { - content: '\f3f9'; -} -.zmdi-outlook:before { - content: '\f3fa'; -} -.zmdi-paypal-alt:before { - content: '\f3fb'; -} -.zmdi-pinterest:before { - content: '\f3fc'; -} -.zmdi-playstation:before { - content: '\f3fd'; -} -.zmdi-reddit:before { - content: '\f3fe'; -} -.zmdi-skype:before { - content: '\f3ff'; -} -.zmdi-slideshare:before { - content: '\f400'; -} -.zmdi-soundcloud:before { - content: '\f401'; -} -.zmdi-tumblr:before { - content: '\f402'; -} -.zmdi-twitch:before { - content: '\f403'; -} -.zmdi-vimeo:before { - content: '\f404'; -} -.zmdi-whatsapp:before { - content: '\f405'; -} -.zmdi-xbox:before { - content: '\f406'; -} -.zmdi-yahoo:before { - content: '\f407'; -} -.zmdi-youtube-play:before { - content: '\f408'; -} -.zmdi-youtube:before { - content: '\f409'; -} -.zmdi-3d-rotation:before { - content: '\f101'; -} -.zmdi-airplane-off:before { - content: '\f102'; -} -.zmdi-airplane:before { - content: '\f103'; -} -.zmdi-album:before { - content: '\f104'; -} -.zmdi-archive:before { - content: '\f105'; -} -.zmdi-assignment-account:before { - content: '\f106'; -} -.zmdi-assignment-alert:before { - content: '\f107'; -} -.zmdi-assignment-check:before { - content: '\f108'; -} -.zmdi-assignment-o:before { - content: '\f109'; -} -.zmdi-assignment-return:before { - content: '\f10a'; -} -.zmdi-assignment-returned:before { - content: '\f10b'; -} -.zmdi-assignment:before { - content: '\f10c'; -} -.zmdi-attachment-alt:before { - content: '\f10d'; -} -.zmdi-attachment:before { - content: '\f10e'; -} -.zmdi-audio:before { - content: '\f10f'; -} -.zmdi-badge-check:before { - content: '\f110'; -} -.zmdi-balance-wallet:before { - content: '\f111'; -} -.zmdi-balance:before { - content: '\f112'; -} -.zmdi-battery-alert:before { - content: '\f113'; -} -.zmdi-battery-flash:before { - content: '\f114'; -} -.zmdi-battery-unknown:before { - content: '\f115'; -} -.zmdi-battery:before { - content: '\f116'; -} -.zmdi-bike:before { - content: '\f117'; -} -.zmdi-block-alt:before { - content: '\f118'; -} -.zmdi-block:before { - content: '\f119'; -} -.zmdi-boat:before { - content: '\f11a'; -} -.zmdi-book-image:before { - content: '\f11b'; -} -.zmdi-book:before { - content: '\f11c'; -} -.zmdi-bookmark-outline:before { - content: '\f11d'; -} -.zmdi-bookmark:before { - content: '\f11e'; -} -.zmdi-brush:before { - content: '\f11f'; -} -.zmdi-bug:before { - content: '\f120'; -} -.zmdi-bus:before { - content: '\f121'; -} -.zmdi-cake:before { - content: '\f122'; -} -.zmdi-car-taxi:before { - content: '\f123'; -} -.zmdi-car-wash:before { - content: '\f124'; -} -.zmdi-car:before { - content: '\f125'; -} -.zmdi-card-giftcard:before { - content: '\f126'; -} -.zmdi-card-membership:before { - content: '\f127'; -} -.zmdi-card-travel:before { - content: '\f128'; -} -.zmdi-card:before { - content: '\f129'; -} -.zmdi-case-check:before { - content: '\f12a'; -} -.zmdi-case-download:before { - content: '\f12b'; -} -.zmdi-case-play:before { - content: '\f12c'; -} -.zmdi-case:before { - content: '\f12d'; -} -.zmdi-cast-connected:before { - content: '\f12e'; -} -.zmdi-cast:before { - content: '\f12f'; -} -.zmdi-chart-donut:before { - content: '\f130'; -} -.zmdi-chart:before { - content: '\f131'; -} -.zmdi-city-alt:before { - content: '\f132'; -} -.zmdi-city:before { - content: '\f133'; -} -.zmdi-close-circle-o:before { - content: '\f134'; -} -.zmdi-close-circle:before { - content: '\f135'; -} -.zmdi-close:before { - content: '\f136'; -} -.zmdi-cocktail:before { - content: '\f137'; -} -.zmdi-code-setting:before { - content: '\f138'; -} -.zmdi-code-smartphone:before { - content: '\f139'; -} -.zmdi-code:before { - content: '\f13a'; -} -.zmdi-coffee:before { - content: '\f13b'; -} -.zmdi-collection-bookmark:before { - content: '\f13c'; -} -.zmdi-collection-case-play:before { - content: '\f13d'; -} -.zmdi-collection-folder-image:before { - content: '\f13e'; -} -.zmdi-collection-image-o:before { - content: '\f13f'; -} -.zmdi-collection-image:before { - content: '\f140'; -} -.zmdi-collection-item-1:before { - content: '\f141'; -} -.zmdi-collection-item-2:before { - content: '\f142'; -} -.zmdi-collection-item-3:before { - content: '\f143'; -} -.zmdi-collection-item-4:before { - content: '\f144'; -} -.zmdi-collection-item-5:before { - content: '\f145'; -} -.zmdi-collection-item-6:before { - content: '\f146'; -} -.zmdi-collection-item-7:before { - content: '\f147'; -} -.zmdi-collection-item-8:before { - content: '\f148'; -} -.zmdi-collection-item-9-plus:before { - content: '\f149'; -} -.zmdi-collection-item-9:before { - content: '\f14a'; -} -.zmdi-collection-item:before { - content: '\f14b'; -} -.zmdi-collection-music:before { - content: '\f14c'; -} -.zmdi-collection-pdf:before { - content: '\f14d'; -} -.zmdi-collection-plus:before { - content: '\f14e'; -} -.zmdi-collection-speaker:before { - content: '\f14f'; -} -.zmdi-collection-text:before { - content: '\f150'; -} -.zmdi-collection-video:before { - content: '\f151'; -} -.zmdi-compass:before { - content: '\f152'; -} -.zmdi-cutlery:before { - content: '\f153'; -} -.zmdi-delete:before { - content: '\f154'; -} -.zmdi-dialpad:before { - content: '\f155'; -} -.zmdi-dns:before { - content: '\f156'; -} -.zmdi-drink:before { - content: '\f157'; -} -.zmdi-edit:before { - content: '\f158'; -} -.zmdi-email-open:before { - content: '\f159'; -} -.zmdi-email:before { - content: '\f15a'; -} -.zmdi-eye-off:before { - content: '\f15b'; -} -.zmdi-eye:before { - content: '\f15c'; -} -.zmdi-eyedropper:before { - content: '\f15d'; -} -.zmdi-favorite-outline:before { - content: '\f15e'; -} -.zmdi-favorite:before { - content: '\f15f'; -} -.zmdi-filter-list:before { - content: '\f160'; -} -.zmdi-fire:before { - content: '\f161'; -} -.zmdi-flag:before { - content: '\f162'; -} -.zmdi-flare:before { - content: '\f163'; -} -.zmdi-flash-auto:before { - content: '\f164'; -} -.zmdi-flash-off:before { - content: '\f165'; -} -.zmdi-flash:before { - content: '\f166'; -} -.zmdi-flip:before { - content: '\f167'; -} -.zmdi-flower-alt:before { - content: '\f168'; -} -.zmdi-flower:before { - content: '\f169'; -} -.zmdi-font:before { - content: '\f16a'; -} -.zmdi-fullscreen-alt:before { - content: '\f16b'; -} -.zmdi-fullscreen-exit:before { - content: '\f16c'; -} -.zmdi-fullscreen:before { - content: '\f16d'; -} -.zmdi-functions:before { - content: '\f16e'; -} -.zmdi-gas-station:before { - content: '\f16f'; -} -.zmdi-gesture:before { - content: '\f170'; -} -.zmdi-globe-alt:before { - content: '\f171'; -} -.zmdi-globe-lock:before { - content: '\f172'; -} -.zmdi-globe:before { - content: '\f173'; -} -.zmdi-graduation-cap:before { - content: '\f174'; -} -.zmdi-home:before { - content: '\f175'; -} -.zmdi-hospital-alt:before { - content: '\f176'; -} -.zmdi-hospital:before { - content: '\f177'; -} -.zmdi-hotel:before { - content: '\f178'; -} -.zmdi-hourglass-alt:before { - content: '\f179'; -} -.zmdi-hourglass-outline:before { - content: '\f17a'; -} -.zmdi-hourglass:before { - content: '\f17b'; -} -.zmdi-http:before { - content: '\f17c'; -} -.zmdi-image-alt:before { - content: '\f17d'; -} -.zmdi-image-o:before { - content: '\f17e'; -} -.zmdi-image:before { - content: '\f17f'; -} -.zmdi-inbox:before { - content: '\f180'; -} -.zmdi-invert-colors-off:before { - content: '\f181'; -} -.zmdi-invert-colors:before { - content: '\f182'; -} -.zmdi-key:before { - content: '\f183'; -} -.zmdi-label-alt-outline:before { - content: '\f184'; -} -.zmdi-label-alt:before { - content: '\f185'; -} -.zmdi-label-heart:before { - content: '\f186'; -} -.zmdi-label:before { - content: '\f187'; -} -.zmdi-labels:before { - content: '\f188'; -} -.zmdi-lamp:before { - content: '\f189'; -} -.zmdi-landscape:before { - content: '\f18a'; -} -.zmdi-layers-off:before { - content: '\f18b'; -} -.zmdi-layers:before { - content: '\f18c'; -} -.zmdi-library:before { - content: '\f18d'; -} -.zmdi-link:before { - content: '\f18e'; -} -.zmdi-lock-open:before { - content: '\f18f'; -} -.zmdi-lock-outline:before { - content: '\f190'; -} -.zmdi-lock:before { - content: '\f191'; -} -.zmdi-mail-reply-all:before { - content: '\f192'; -} -.zmdi-mail-reply:before { - content: '\f193'; -} -.zmdi-mail-send:before { - content: '\f194'; -} -.zmdi-mall:before { - content: '\f195'; -} -.zmdi-map:before { - content: '\f196'; -} -.zmdi-menu:before { - content: '\f197'; -} -.zmdi-money-box:before { - content: '\f198'; -} -.zmdi-money-off:before { - content: '\f199'; -} -.zmdi-money:before { - content: '\f19a'; -} -.zmdi-more-vert:before { - content: '\f19b'; -} -.zmdi-more:before { - content: '\f19c'; -} -.zmdi-movie-alt:before { - content: '\f19d'; -} -.zmdi-movie:before { - content: '\f19e'; -} -.zmdi-nature-people:before { - content: '\f19f'; -} -.zmdi-nature:before { - content: '\f1a0'; -} -.zmdi-navigation:before { - content: '\f1a1'; -} -.zmdi-open-in-browser:before { - content: '\f1a2'; -} -.zmdi-open-in-new:before { - content: '\f1a3'; -} -.zmdi-palette:before { - content: '\f1a4'; -} -.zmdi-parking:before { - content: '\f1a5'; -} -.zmdi-pin-account:before { - content: '\f1a6'; -} -.zmdi-pin-assistant:before { - content: '\f1a7'; -} -.zmdi-pin-drop:before { - content: '\f1a8'; -} -.zmdi-pin-help:before { - content: '\f1a9'; -} -.zmdi-pin-off:before { - content: '\f1aa'; -} -.zmdi-pin:before { - content: '\f1ab'; -} -.zmdi-pizza:before { - content: '\f1ac'; -} -.zmdi-plaster:before { - content: '\f1ad'; -} -.zmdi-power-setting:before { - content: '\f1ae'; -} -.zmdi-power:before { - content: '\f1af'; -} -.zmdi-print:before { - content: '\f1b0'; -} -.zmdi-puzzle-piece:before { - content: '\f1b1'; -} -.zmdi-quote:before { - content: '\f1b2'; -} -.zmdi-railway:before { - content: '\f1b3'; -} -.zmdi-receipt:before { - content: '\f1b4'; -} -.zmdi-refresh-alt:before { - content: '\f1b5'; -} -.zmdi-refresh-sync-alert:before { - content: '\f1b6'; -} -.zmdi-refresh-sync-off:before { - content: '\f1b7'; -} -.zmdi-refresh-sync:before { - content: '\f1b8'; -} -.zmdi-refresh:before { - content: '\f1b9'; -} -.zmdi-roller:before { - content: '\f1ba'; -} -.zmdi-ruler:before { - content: '\f1bb'; -} -.zmdi-scissors:before { - content: '\f1bc'; -} -.zmdi-screen-rotation-lock:before { - content: '\f1bd'; -} -.zmdi-screen-rotation:before { - content: '\f1be'; -} -.zmdi-search-for:before { - content: '\f1bf'; -} -.zmdi-search-in-file:before { - content: '\f1c0'; -} -.zmdi-search-in-page:before { - content: '\f1c1'; -} -.zmdi-search-replace:before { - content: '\f1c2'; -} -.zmdi-search:before { - content: '\f1c3'; -} -.zmdi-seat:before { - content: '\f1c4'; -} -.zmdi-settings-square:before { - content: '\f1c5'; -} -.zmdi-settings:before { - content: '\f1c6'; -} -.zmdi-shield-check:before { - content: '\f1c7'; -} -.zmdi-shield-security:before { - content: '\f1c8'; -} -.zmdi-shopping-basket:before { - content: '\f1c9'; -} -.zmdi-shopping-cart-plus:before { - content: '\f1ca'; -} -.zmdi-shopping-cart:before { - content: '\f1cb'; -} -.zmdi-sign-in:before { - content: '\f1cc'; -} -.zmdi-sort-amount-asc:before { - content: '\f1cd'; -} -.zmdi-sort-amount-desc:before { - content: '\f1ce'; -} -.zmdi-sort-asc:before { - content: '\f1cf'; -} -.zmdi-sort-desc:before { - content: '\f1d0'; -} -.zmdi-spellcheck:before { - content: '\f1d1'; -} -.zmdi-storage:before { - content: '\f1d2'; -} -.zmdi-store-24:before { - content: '\f1d3'; -} -.zmdi-store:before { - content: '\f1d4'; -} -.zmdi-subway:before { - content: '\f1d5'; -} -.zmdi-sun:before { - content: '\f1d6'; -} -.zmdi-tab-unselected:before { - content: '\f1d7'; -} -.zmdi-tab:before { - content: '\f1d8'; -} -.zmdi-tag-close:before { - content: '\f1d9'; -} -.zmdi-tag-more:before { - content: '\f1da'; -} -.zmdi-tag:before { - content: '\f1db'; -} -.zmdi-thumb-down:before { - content: '\f1dc'; -} -.zmdi-thumb-up-down:before { - content: '\f1dd'; -} -.zmdi-thumb-up:before { - content: '\f1de'; -} -.zmdi-ticket-star:before { - content: '\f1df'; -} -.zmdi-toll:before { - content: '\f1e0'; -} -.zmdi-toys:before { - content: '\f1e1'; -} -.zmdi-traffic:before { - content: '\f1e2'; -} -.zmdi-translate:before { - content: '\f1e3'; -} -.zmdi-triangle-down:before { - content: '\f1e4'; -} -.zmdi-triangle-up:before { - content: '\f1e5'; -} -.zmdi-truck:before { - content: '\f1e6'; -} -.zmdi-turning-sign:before { - content: '\f1e7'; -} -.zmdi-wallpaper:before { - content: '\f1e8'; -} -.zmdi-washing-machine:before { - content: '\f1e9'; -} -.zmdi-window-maximize:before { - content: '\f1ea'; -} -.zmdi-window-minimize:before { - content: '\f1eb'; -} -.zmdi-window-restore:before { - content: '\f1ec'; -} -.zmdi-wrench:before { - content: '\f1ed'; -} -.zmdi-zoom-in:before { - content: '\f1ee'; -} -.zmdi-zoom-out:before { - content: '\f1ef'; -} -.zmdi-alert-circle-o:before { - content: '\f1f0'; -} -.zmdi-alert-circle:before { - content: '\f1f1'; -} -.zmdi-alert-octagon:before { - content: '\f1f2'; -} -.zmdi-alert-polygon:before { - content: '\f1f3'; -} -.zmdi-alert-triangle:before { - content: '\f1f4'; -} -.zmdi-help-outline:before { - content: '\f1f5'; -} -.zmdi-help:before { - content: '\f1f6'; -} -.zmdi-info-outline:before { - content: '\f1f7'; -} -.zmdi-info:before { - content: '\f1f8'; -} -.zmdi-notifications-active:before { - content: '\f1f9'; -} -.zmdi-notifications-add:before { - content: '\f1fa'; -} -.zmdi-notifications-none:before { - content: '\f1fb'; -} -.zmdi-notifications-off:before { - content: '\f1fc'; -} -.zmdi-notifications-paused:before { - content: '\f1fd'; -} -.zmdi-notifications:before { - content: '\f1fe'; -} -.zmdi-account-add:before { - content: '\f1ff'; -} -.zmdi-account-box-mail:before { - content: '\f200'; -} -.zmdi-account-box-o:before { - content: '\f201'; -} -.zmdi-account-box-phone:before { - content: '\f202'; -} -.zmdi-account-box:before { - content: '\f203'; -} -.zmdi-account-calendar:before { - content: '\f204'; -} -.zmdi-account-circle:before { - content: '\f205'; -} -.zmdi-account-o:before { - content: '\f206'; -} -.zmdi-account:before { - content: '\f207'; -} -.zmdi-accounts-add:before { - content: '\f208'; -} -.zmdi-accounts-alt:before { - content: '\f209'; -} -.zmdi-accounts-list-alt:before { - content: '\f20a'; -} -.zmdi-accounts-list:before { - content: '\f20b'; -} -.zmdi-accounts-outline:before { - content: '\f20c'; -} -.zmdi-accounts:before { - content: '\f20d'; -} -.zmdi-face:before { - content: '\f20e'; -} -.zmdi-female:before { - content: '\f20f'; -} -.zmdi-male-alt:before { - content: '\f210'; -} -.zmdi-male-female:before { - content: '\f211'; -} -.zmdi-male:before { - content: '\f212'; -} -.zmdi-mood-bad:before { - content: '\f213'; -} -.zmdi-mood:before { - content: '\f214'; -} -.zmdi-run:before { - content: '\f215'; -} -.zmdi-walk:before { - content: '\f216'; -} -.zmdi-cloud-box:before { - content: '\f217'; -} -.zmdi-cloud-circle:before { - content: '\f218'; -} -.zmdi-cloud-done:before { - content: '\f219'; -} -.zmdi-cloud-download:before { - content: '\f21a'; -} -.zmdi-cloud-off:before { - content: '\f21b'; -} -.zmdi-cloud-outline-alt:before { - content: '\f21c'; -} -.zmdi-cloud-outline:before { - content: '\f21d'; -} -.zmdi-cloud-upload:before { - content: '\f21e'; -} -.zmdi-cloud:before { - content: '\f21f'; -} -.zmdi-download:before { - content: '\f220'; -} -.zmdi-file-plus:before { - content: '\f221'; -} -.zmdi-file-text:before { - content: '\f222'; -} -.zmdi-file:before { - content: '\f223'; -} -.zmdi-folder-outline:before { - content: '\f224'; -} -.zmdi-folder-person:before { - content: '\f225'; -} -.zmdi-folder-star-alt:before { - content: '\f226'; -} -.zmdi-folder-star:before { - content: '\f227'; -} -.zmdi-folder:before { - content: '\f228'; -} -.zmdi-gif:before { - content: '\f229'; -} -.zmdi-upload:before { - content: '\f22a'; -} -.zmdi-border-all:before { - content: '\f22b'; -} -.zmdi-border-bottom:before { - content: '\f22c'; -} -.zmdi-border-clear:before { - content: '\f22d'; -} -.zmdi-border-color:before { - content: '\f22e'; -} -.zmdi-border-horizontal:before { - content: '\f22f'; -} -.zmdi-border-inner:before { - content: '\f230'; -} -.zmdi-border-left:before { - content: '\f231'; -} -.zmdi-border-outer:before { - content: '\f232'; -} -.zmdi-border-right:before { - content: '\f233'; -} -.zmdi-border-style:before { - content: '\f234'; -} -.zmdi-border-top:before { - content: '\f235'; -} -.zmdi-border-vertical:before { - content: '\f236'; -} -.zmdi-copy:before { - content: '\f237'; -} -.zmdi-crop:before { - content: '\f238'; -} -.zmdi-format-align-center:before { - content: '\f239'; -} -.zmdi-format-align-justify:before { - content: '\f23a'; -} -.zmdi-format-align-left:before { - content: '\f23b'; -} -.zmdi-format-align-right:before { - content: '\f23c'; -} -.zmdi-format-bold:before { - content: '\f23d'; -} -.zmdi-format-clear-all:before { - content: '\f23e'; -} -.zmdi-format-clear:before { - content: '\f23f'; -} -.zmdi-format-color-fill:before { - content: '\f240'; -} -.zmdi-format-color-reset:before { - content: '\f241'; -} -.zmdi-format-color-text:before { - content: '\f242'; -} -.zmdi-format-indent-decrease:before { - content: '\f243'; -} -.zmdi-format-indent-increase:before { - content: '\f244'; -} -.zmdi-format-italic:before { - content: '\f245'; -} -.zmdi-format-line-spacing:before { - content: '\f246'; -} -.zmdi-format-list-bulleted:before { - content: '\f247'; -} -.zmdi-format-list-numbered:before { - content: '\f248'; -} -.zmdi-format-ltr:before { - content: '\f249'; -} -.zmdi-format-rtl:before { - content: '\f24a'; -} -.zmdi-format-size:before { - content: '\f24b'; -} -.zmdi-format-strikethrough-s:before { - content: '\f24c'; -} -.zmdi-format-strikethrough:before { - content: '\f24d'; -} -.zmdi-format-subject:before { - content: '\f24e'; -} -.zmdi-format-underlined:before { - content: '\f24f'; -} -.zmdi-format-valign-bottom:before { - content: '\f250'; -} -.zmdi-format-valign-center:before { - content: '\f251'; -} -.zmdi-format-valign-top:before { - content: '\f252'; -} -.zmdi-redo:before { - content: '\f253'; -} -.zmdi-select-all:before { - content: '\f254'; -} -.zmdi-space-bar:before { - content: '\f255'; -} -.zmdi-text-format:before { - content: '\f256'; -} -.zmdi-transform:before { - content: '\f257'; -} -.zmdi-undo:before { - content: '\f258'; -} -.zmdi-wrap-text:before { - content: '\f259'; -} -.zmdi-comment-alert:before { - content: '\f25a'; -} -.zmdi-comment-alt-text:before { - content: '\f25b'; -} -.zmdi-comment-alt:before { - content: '\f25c'; -} -.zmdi-comment-edit:before { - content: '\f25d'; -} -.zmdi-comment-image:before { - content: '\f25e'; -} -.zmdi-comment-list:before { - content: '\f25f'; -} -.zmdi-comment-more:before { - content: '\f260'; -} -.zmdi-comment-outline:before { - content: '\f261'; -} -.zmdi-comment-text-alt:before { - content: '\f262'; -} -.zmdi-comment-text:before { - content: '\f263'; -} -.zmdi-comment-video:before { - content: '\f264'; -} -.zmdi-comment:before { - content: '\f265'; -} -.zmdi-comments:before { - content: '\f266'; -} -.zmdi-check-all:before { - content: '\f267'; -} -.zmdi-check-circle-u:before { - content: '\f268'; -} -.zmdi-check-circle:before { - content: '\f269'; -} -.zmdi-check-square:before { - content: '\f26a'; -} -.zmdi-check:before { - content: '\f26b'; -} -.zmdi-circle-o:before { - content: '\f26c'; -} -.zmdi-circle:before { - content: '\f26d'; -} -.zmdi-dot-circle-alt:before { - content: '\f26e'; -} -.zmdi-dot-circle:before { - content: '\f26f'; -} -.zmdi-minus-circle-outline:before { - content: '\f270'; -} -.zmdi-minus-circle:before { - content: '\f271'; -} -.zmdi-minus-square:before { - content: '\f272'; -} -.zmdi-minus:before { - content: '\f273'; -} -.zmdi-plus-circle-o-duplicate:before { - content: '\f274'; -} -.zmdi-plus-circle-o:before { - content: '\f275'; -} -.zmdi-plus-circle:before { - content: '\f276'; -} -.zmdi-plus-square:before { - content: '\f277'; -} -.zmdi-plus:before { - content: '\f278'; -} -.zmdi-square-o:before { - content: '\f279'; -} -.zmdi-star-circle:before { - content: '\f27a'; -} -.zmdi-star-half:before { - content: '\f27b'; -} -.zmdi-star-outline:before { - content: '\f27c'; -} -.zmdi-star:before { - content: '\f27d'; -} -.zmdi-bluetooth-connected:before { - content: '\f27e'; -} -.zmdi-bluetooth-off:before { - content: '\f27f'; -} -.zmdi-bluetooth-search:before { - content: '\f280'; -} -.zmdi-bluetooth-setting:before { - content: '\f281'; -} -.zmdi-bluetooth:before { - content: '\f282'; -} -.zmdi-camera-add:before { - content: '\f283'; -} -.zmdi-camera-alt:before { - content: '\f284'; -} -.zmdi-camera-bw:before { - content: '\f285'; -} -.zmdi-camera-front:before { - content: '\f286'; -} -.zmdi-camera-mic:before { - content: '\f287'; -} -.zmdi-camera-party-mode:before { - content: '\f288'; -} -.zmdi-camera-rear:before { - content: '\f289'; -} -.zmdi-camera-roll:before { - content: '\f28a'; -} -.zmdi-camera-switch:before { - content: '\f28b'; -} -.zmdi-camera:before { - content: '\f28c'; -} -.zmdi-card-alert:before { - content: '\f28d'; -} -.zmdi-card-off:before { - content: '\f28e'; -} -.zmdi-card-sd:before { - content: '\f28f'; -} -.zmdi-card-sim:before { - content: '\f290'; -} -.zmdi-desktop-mac:before { - content: '\f291'; -} -.zmdi-desktop-windows:before { - content: '\f292'; -} -.zmdi-device-hub:before { - content: '\f293'; -} -.zmdi-devices-off:before { - content: '\f294'; -} -.zmdi-devices:before { - content: '\f295'; -} -.zmdi-dock:before { - content: '\f296'; -} -.zmdi-floppy:before { - content: '\f297'; -} -.zmdi-gamepad:before { - content: '\f298'; -} -.zmdi-gps-dot:before { - content: '\f299'; -} -.zmdi-gps-off:before { - content: '\f29a'; -} -.zmdi-gps:before { - content: '\f29b'; -} -.zmdi-headset-mic:before { - content: '\f29c'; -} -.zmdi-headset:before { - content: '\f29d'; -} -.zmdi-input-antenna:before { - content: '\f29e'; -} -.zmdi-input-composite:before { - content: '\f29f'; -} -.zmdi-input-hdmi:before { - content: '\f2a0'; -} -.zmdi-input-power:before { - content: '\f2a1'; -} -.zmdi-input-svideo:before { - content: '\f2a2'; -} -.zmdi-keyboard-hide:before { - content: '\f2a3'; -} -.zmdi-keyboard:before { - content: '\f2a4'; -} -.zmdi-laptop-chromebook:before { - content: '\f2a5'; -} -.zmdi-laptop-mac:before { - content: '\f2a6'; -} -.zmdi-laptop:before { - content: '\f2a7'; -} -.zmdi-mic-off:before { - content: '\f2a8'; -} -.zmdi-mic-outline:before { - content: '\f2a9'; -} -.zmdi-mic-setting:before { - content: '\f2aa'; -} -.zmdi-mic:before { - content: '\f2ab'; -} -.zmdi-mouse:before { - content: '\f2ac'; -} -.zmdi-network-alert:before { - content: '\f2ad'; -} -.zmdi-network-locked:before { - content: '\f2ae'; -} -.zmdi-network-off:before { - content: '\f2af'; -} -.zmdi-network-outline:before { - content: '\f2b0'; -} -.zmdi-network-setting:before { - content: '\f2b1'; -} -.zmdi-network:before { - content: '\f2b2'; -} -.zmdi-phone-bluetooth:before { - content: '\f2b3'; -} -.zmdi-phone-end:before { - content: '\f2b4'; -} -.zmdi-phone-forwarded:before { - content: '\f2b5'; -} -.zmdi-phone-in-talk:before { - content: '\f2b6'; -} -.zmdi-phone-locked:before { - content: '\f2b7'; -} -.zmdi-phone-missed:before { - content: '\f2b8'; -} -.zmdi-phone-msg:before { - content: '\f2b9'; -} -.zmdi-phone-paused:before { - content: '\f2ba'; -} -.zmdi-phone-ring:before { - content: '\f2bb'; -} -.zmdi-phone-setting:before { - content: '\f2bc'; -} -.zmdi-phone-sip:before { - content: '\f2bd'; -} -.zmdi-phone:before { - content: '\f2be'; -} -.zmdi-portable-wifi-changes:before { - content: '\f2bf'; -} -.zmdi-portable-wifi-off:before { - content: '\f2c0'; -} -.zmdi-portable-wifi:before { - content: '\f2c1'; -} -.zmdi-radio:before { - content: '\f2c2'; -} -.zmdi-reader:before { - content: '\f2c3'; -} -.zmdi-remote-control-alt:before { - content: '\f2c4'; -} -.zmdi-remote-control:before { - content: '\f2c5'; -} -.zmdi-router:before { - content: '\f2c6'; -} -.zmdi-scanner:before { - content: '\f2c7'; -} -.zmdi-smartphone-android:before { - content: '\f2c8'; -} -.zmdi-smartphone-download:before { - content: '\f2c9'; -} -.zmdi-smartphone-erase:before { - content: '\f2ca'; -} -.zmdi-smartphone-info:before { - content: '\f2cb'; -} -.zmdi-smartphone-iphone:before { - content: '\f2cc'; -} -.zmdi-smartphone-landscape-lock:before { - content: '\f2cd'; -} -.zmdi-smartphone-landscape:before { - content: '\f2ce'; -} -.zmdi-smartphone-lock:before { - content: '\f2cf'; -} -.zmdi-smartphone-portrait-lock:before { - content: '\f2d0'; -} -.zmdi-smartphone-ring:before { - content: '\f2d1'; -} -.zmdi-smartphone-setting:before { - content: '\f2d2'; -} -.zmdi-smartphone-setup:before { - content: '\f2d3'; -} -.zmdi-smartphone:before { - content: '\f2d4'; -} -.zmdi-speaker:before { - content: '\f2d5'; -} -.zmdi-tablet-android:before { - content: '\f2d6'; -} -.zmdi-tablet-mac:before { - content: '\f2d7'; -} -.zmdi-tablet:before { - content: '\f2d8'; -} -.zmdi-tv-alt-play:before { - content: '\f2d9'; -} -.zmdi-tv-list:before { - content: '\f2da'; -} -.zmdi-tv-play:before { - content: '\f2db'; -} -.zmdi-tv:before { - content: '\f2dc'; -} -.zmdi-usb:before { - content: '\f2dd'; -} -.zmdi-videocam-off:before { - content: '\f2de'; -} -.zmdi-videocam-switch:before { - content: '\f2df'; -} -.zmdi-videocam:before { - content: '\f2e0'; -} -.zmdi-watch:before { - content: '\f2e1'; -} -.zmdi-wifi-alt-2:before { - content: '\f2e2'; -} -.zmdi-wifi-alt:before { - content: '\f2e3'; -} -.zmdi-wifi-info:before { - content: '\f2e4'; -} -.zmdi-wifi-lock:before { - content: '\f2e5'; -} -.zmdi-wifi-off:before { - content: '\f2e6'; -} -.zmdi-wifi-outline:before { - content: '\f2e7'; -} -.zmdi-wifi:before { - content: '\f2e8'; -} -.zmdi-arrow-left-bottom:before { - content: '\f2e9'; -} -.zmdi-arrow-left:before { - content: '\f2ea'; -} -.zmdi-arrow-merge:before { - content: '\f2eb'; -} -.zmdi-arrow-missed:before { - content: '\f2ec'; -} -.zmdi-arrow-right-top:before { - content: '\f2ed'; -} -.zmdi-arrow-right:before { - content: '\f2ee'; -} -.zmdi-arrow-split:before { - content: '\f2ef'; -} -.zmdi-arrows:before { - content: '\f2f0'; -} -.zmdi-caret-down-circle:before { - content: '\f2f1'; -} -.zmdi-caret-down:before { - content: '\f2f2'; -} -.zmdi-caret-left-circle:before { - content: '\f2f3'; -} -.zmdi-caret-left:before { - content: '\f2f4'; -} -.zmdi-caret-right-circle:before { - content: '\f2f5'; -} -.zmdi-caret-right:before { - content: '\f2f6'; -} -.zmdi-caret-up-circle:before { - content: '\f2f7'; -} -.zmdi-caret-up:before { - content: '\f2f8'; -} -.zmdi-chevron-down:before { - content: '\f2f9'; -} -.zmdi-chevron-left:before { - content: '\f2fa'; -} -.zmdi-chevron-right:before { - content: '\f2fb'; -} -.zmdi-chevron-up:before { - content: '\f2fc'; -} -.zmdi-forward:before { - content: '\f2fd'; -} -.zmdi-long-arrow-down:before { - content: '\f2fe'; -} -.zmdi-long-arrow-left:before { - content: '\f2ff'; -} -.zmdi-long-arrow-return:before { - content: '\f300'; -} -.zmdi-long-arrow-right:before { - content: '\f301'; -} -.zmdi-long-arrow-tab:before { - content: '\f302'; -} -.zmdi-long-arrow-up:before { - content: '\f303'; -} -.zmdi-rotate-ccw:before { - content: '\f304'; -} -.zmdi-rotate-cw:before { - content: '\f305'; -} -.zmdi-rotate-left:before { - content: '\f306'; -} -.zmdi-rotate-right:before { - content: '\f307'; -} -.zmdi-square-down:before { - content: '\f308'; -} -.zmdi-square-right:before { - content: '\f309'; -} -.zmdi-swap-alt:before { - content: '\f30a'; -} -.zmdi-swap-vertical-circle:before { - content: '\f30b'; -} -.zmdi-swap-vertical:before { - content: '\f30c'; -} -.zmdi-swap:before { - content: '\f30d'; -} -.zmdi-trending-down:before { - content: '\f30e'; -} -.zmdi-trending-flat:before { - content: '\f30f'; -} -.zmdi-trending-up:before { - content: '\f310'; -} -.zmdi-unfold-less:before { - content: '\f311'; -} -.zmdi-unfold-more:before { - content: '\f312'; -} -.zmdi-apps:before { - content: '\f313'; -} -.zmdi-grid-off:before { - content: '\f314'; -} -.zmdi-grid:before { - content: '\f315'; -} -.zmdi-view-agenda:before { - content: '\f316'; -} -.zmdi-view-array:before { - content: '\f317'; -} -.zmdi-view-carousel:before { - content: '\f318'; -} -.zmdi-view-column:before { - content: '\f319'; -} -.zmdi-view-comfy:before { - content: '\f31a'; -} -.zmdi-view-compact:before { - content: '\f31b'; -} -.zmdi-view-dashboard:before { - content: '\f31c'; -} -.zmdi-view-day:before { - content: '\f31d'; -} -.zmdi-view-headline:before { - content: '\f31e'; -} -.zmdi-view-list-alt:before { - content: '\f31f'; -} -.zmdi-view-list:before { - content: '\f320'; -} -.zmdi-view-module:before { - content: '\f321'; -} -.zmdi-view-quilt:before { - content: '\f322'; -} -.zmdi-view-stream:before { - content: '\f323'; -} -.zmdi-view-subtitles:before { - content: '\f324'; -} -.zmdi-view-toc:before { - content: '\f325'; -} -.zmdi-view-web:before { - content: '\f326'; -} -.zmdi-view-week:before { - content: '\f327'; -} -.zmdi-widgets:before { - content: '\f328'; -} -.zmdi-alarm-check:before { - content: '\f329'; -} -.zmdi-alarm-off:before { - content: '\f32a'; -} -.zmdi-alarm-plus:before { - content: '\f32b'; -} -.zmdi-alarm-snooze:before { - content: '\f32c'; -} -.zmdi-alarm:before { - content: '\f32d'; -} -.zmdi-calendar-alt:before { - content: '\f32e'; -} -.zmdi-calendar-check:before { - content: '\f32f'; -} -.zmdi-calendar-close:before { - content: '\f330'; -} -.zmdi-calendar-note:before { - content: '\f331'; -} -.zmdi-calendar:before { - content: '\f332'; -} -.zmdi-time-countdown:before { - content: '\f333'; -} -.zmdi-time-interval:before { - content: '\f334'; -} -.zmdi-time-restore-setting:before { - content: '\f335'; -} -.zmdi-time-restore:before { - content: '\f336'; -} -.zmdi-time:before { - content: '\f337'; -} -.zmdi-timer-off:before { - content: '\f338'; -} -.zmdi-timer:before { - content: '\f339'; -} -.zmdi-android-alt:before { - content: '\f33a'; -} -.zmdi-android:before { - content: '\f33b'; -} -.zmdi-apple:before { - content: '\f33c'; -} -.zmdi-behance:before { - content: '\f33d'; -} -.zmdi-codepen:before { - content: '\f33e'; -} -.zmdi-dribbble:before { - content: '\f33f'; -} -.zmdi-dropbox:before { - content: '\f340'; -} -.zmdi-evernote:before { - content: '\f341'; -} -.zmdi-facebook-box:before { - content: '\f342'; -} -.zmdi-facebook:before { - content: '\f343'; -} -.zmdi-github-box:before { - content: '\f344'; -} -.zmdi-github:before { - content: '\f345'; -} -.zmdi-google-drive:before { - content: '\f346'; -} -.zmdi-google-earth:before { - content: '\f347'; -} -.zmdi-google-glass:before { - content: '\f348'; -} -.zmdi-google-maps:before { - content: '\f349'; -} -.zmdi-google-pages:before { - content: '\f34a'; -} -.zmdi-google-play:before { - content: '\f34b'; -} -.zmdi-google-plus-box:before { - content: '\f34c'; -} -.zmdi-google-plus:before { - content: '\f34d'; -} -.zmdi-google:before { - content: '\f34e'; -} -.zmdi-instagram:before { - content: '\f34f'; -} -.zmdi-language-css3:before { - content: '\f350'; -} -.zmdi-language-html5:before { - content: '\f351'; -} -.zmdi-language-javascript:before { - content: '\f352'; -} -.zmdi-language-python-alt:before { - content: '\f353'; -} -.zmdi-language-python:before { - content: '\f354'; -} -.zmdi-lastfm:before { - content: '\f355'; -} -.zmdi-linkedin-box:before { - content: '\f356'; -} -.zmdi-paypal:before { - content: '\f357'; -} -.zmdi-pinterest-box:before { - content: '\f358'; -} -.zmdi-pocket:before { - content: '\f359'; -} -.zmdi-polymer:before { - content: '\f35a'; -} -.zmdi-share:before { - content: '\f35b'; -} -.zmdi-stackoverflow:before { - content: '\f35c'; -} -.zmdi-steam-square:before { - content: '\f35d'; -} -.zmdi-steam:before { - content: '\f35e'; -} -.zmdi-twitter-box:before { - content: '\f35f'; -} -.zmdi-twitter:before { - content: '\f360'; -} -.zmdi-vk:before { - content: '\f361'; -} -.zmdi-wikipedia:before { - content: '\f362'; -} -.zmdi-windows:before { - content: '\f363'; -} -.zmdi-aspect-ratio-alt:before { - content: '\f364'; -} -.zmdi-aspect-ratio:before { - content: '\f365'; -} -.zmdi-blur-circular:before { - content: '\f366'; -} -.zmdi-blur-linear:before { - content: '\f367'; -} -.zmdi-blur-off:before { - content: '\f368'; -} -.zmdi-blur:before { - content: '\f369'; -} -.zmdi-brightness-2:before { - content: '\f36a'; -} -.zmdi-brightness-3:before { - content: '\f36b'; -} -.zmdi-brightness-4:before { - content: '\f36c'; -} -.zmdi-brightness-5:before { - content: '\f36d'; -} -.zmdi-brightness-6:before { - content: '\f36e'; -} -.zmdi-brightness-7:before { - content: '\f36f'; -} -.zmdi-brightness-auto:before { - content: '\f370'; -} -.zmdi-brightness-setting:before { - content: '\f371'; -} -.zmdi-broken-image:before { - content: '\f372'; -} -.zmdi-center-focus-strong:before { - content: '\f373'; -} -.zmdi-center-focus-weak:before { - content: '\f374'; -} -.zmdi-compare:before { - content: '\f375'; -} -.zmdi-crop-16-9:before { - content: '\f376'; -} -.zmdi-crop-3-2:before { - content: '\f377'; -} -.zmdi-crop-5-4:before { - content: '\f378'; -} -.zmdi-crop-7-5:before { - content: '\f379'; -} -.zmdi-crop-din:before { - content: '\f37a'; -} -.zmdi-crop-free:before { - content: '\f37b'; -} -.zmdi-crop-landscape:before { - content: '\f37c'; -} -.zmdi-crop-portrait:before { - content: '\f37d'; -} -.zmdi-crop-square:before { - content: '\f37e'; -} -.zmdi-exposure-alt:before { - content: '\f37f'; -} -.zmdi-exposure:before { - content: '\f380'; -} -.zmdi-filter-b-and-w:before { - content: '\f381'; -} -.zmdi-filter-center-focus:before { - content: '\f382'; -} -.zmdi-filter-frames:before { - content: '\f383'; -} -.zmdi-filter-tilt-shift:before { - content: '\f384'; -} -.zmdi-gradient:before { - content: '\f385'; -} -.zmdi-grain:before { - content: '\f386'; -} -.zmdi-graphic-eq:before { - content: '\f387'; -} -.zmdi-hdr-off:before { - content: '\f388'; -} -.zmdi-hdr-strong:before { - content: '\f389'; -} -.zmdi-hdr-weak:before { - content: '\f38a'; -} -.zmdi-hdr:before { - content: '\f38b'; -} -.zmdi-iridescent:before { - content: '\f38c'; -} -.zmdi-leak-off:before { - content: '\f38d'; -} -.zmdi-leak:before { - content: '\f38e'; -} -.zmdi-looks:before { - content: '\f38f'; -} -.zmdi-loupe:before { - content: '\f390'; -} -.zmdi-panorama-horizontal:before { - content: '\f391'; -} -.zmdi-panorama-vertical:before { - content: '\f392'; -} -.zmdi-panorama-wide-angle:before { - content: '\f393'; -} -.zmdi-photo-size-select-large:before { - content: '\f394'; -} -.zmdi-photo-size-select-small:before { - content: '\f395'; -} -.zmdi-picture-in-picture:before { - content: '\f396'; -} -.zmdi-slideshow:before { - content: '\f397'; -} -.zmdi-texture:before { - content: '\f398'; -} -.zmdi-tonality:before { - content: '\f399'; -} -.zmdi-vignette:before { - content: '\f39a'; -} -.zmdi-wb-auto:before { - content: '\f39b'; -} -.zmdi-eject-alt:before { - content: '\f39c'; -} -.zmdi-eject:before { - content: '\f39d'; -} -.zmdi-equalizer:before { - content: '\f39e'; -} -.zmdi-fast-forward:before { - content: '\f39f'; -} -.zmdi-fast-rewind:before { - content: '\f3a0'; -} -.zmdi-forward-10:before { - content: '\f3a1'; -} -.zmdi-forward-30:before { - content: '\f3a2'; -} -.zmdi-forward-5:before { - content: '\f3a3'; -} -.zmdi-hearing:before { - content: '\f3a4'; -} -.zmdi-pause-circle-outline:before { - content: '\f3a5'; -} -.zmdi-pause-circle:before { - content: '\f3a6'; -} -.zmdi-pause:before { - content: '\f3a7'; -} -.zmdi-play-circle-outline:before { - content: '\f3a8'; -} -.zmdi-play-circle:before { - content: '\f3a9'; -} -.zmdi-play:before { - content: '\f3aa'; -} -.zmdi-playlist-audio:before { - content: '\f3ab'; -} -.zmdi-playlist-plus:before { - content: '\f3ac'; -} -.zmdi-repeat-one:before { - content: '\f3ad'; -} -.zmdi-repeat:before { - content: '\f3ae'; -} -.zmdi-replay-10:before { - content: '\f3af'; -} -.zmdi-replay-30:before { - content: '\f3b0'; -} -.zmdi-replay-5:before { - content: '\f3b1'; -} -.zmdi-replay:before { - content: '\f3b2'; -} -.zmdi-shuffle:before { - content: '\f3b3'; -} -.zmdi-skip-next:before { - content: '\f3b4'; -} -.zmdi-skip-previous:before { - content: '\f3b5'; -} -.zmdi-stop:before { - content: '\f3b6'; -} -.zmdi-surround-sound:before { - content: '\f3b7'; -} -.zmdi-tune:before { - content: '\f3b8'; -} -.zmdi-volume-down:before { - content: '\f3b9'; -} -.zmdi-volume-mute:before { - content: '\f3ba'; -} -.zmdi-volume-off:before { - content: '\f3bb'; -} -.zmdi-volume-up:before { - content: '\f3bc'; -} -.zmdi-n-1-square:before { - content: '\f3bd'; -} -.zmdi-n-2-square:before { - content: '\f3be'; -} -.zmdi-n-3-square:before { - content: '\f3bf'; -} -.zmdi-n-4-square:before { - content: '\f3c0'; -} -.zmdi-n-5-square:before { - content: '\f3c1'; -} -.zmdi-n-6-square:before { - content: '\f3c2'; -} -.zmdi-neg-1:before { - content: '\f3c3'; -} -.zmdi-neg-2:before { - content: '\f3c4'; -} -.zmdi-plus-1:before { - content: '\f3c5'; -} -.zmdi-plus-2:before { - content: '\f3c6'; -} -.zmdi-sec-10:before { - content: '\f3c7'; -} -.zmdi-sec-3:before { - content: '\f3c8'; -} -.zmdi-zero:before { - content: '\f3c9'; -} -.zmdi-airline-seat-flat-angled:before { - content: '\f3ca'; -} -.zmdi-airline-seat-flat:before { - content: '\f3cb'; -} -.zmdi-airline-seat-individual-suite:before { - content: '\f3cc'; -} -.zmdi-airline-seat-legroom-extra:before { - content: '\f3cd'; -} -.zmdi-airline-seat-legroom-normal:before { - content: '\f3ce'; -} -.zmdi-airline-seat-legroom-reduced:before { - content: '\f3cf'; -} -.zmdi-airline-seat-recline-extra:before { - content: '\f3d0'; -} -.zmdi-airline-seat-recline-normal:before { - content: '\f3d1'; -} -.zmdi-airplay:before { - content: '\f3d2'; -} -.zmdi-closed-caption:before { - content: '\f3d3'; -} -.zmdi-confirmation-number:before { - content: '\f3d4'; -} -.zmdi-developer-board:before { - content: '\f3d5'; -} -.zmdi-disc-full:before { - content: '\f3d6'; -} -.zmdi-explicit:before { - content: '\f3d7'; -} -.zmdi-flight-land:before { - content: '\f3d8'; -} -.zmdi-flight-takeoff:before { - content: '\f3d9'; -} -.zmdi-flip-to-back:before { - content: '\f3da'; -} -.zmdi-flip-to-front:before { - content: '\f3db'; -} -.zmdi-group-work:before { - content: '\f3dc'; -} -.zmdi-hd:before { - content: '\f3dd'; -} -.zmdi-hq:before { - content: '\f3de'; -} -.zmdi-markunread-mailbox:before { - content: '\f3df'; -} -.zmdi-memory:before { - content: '\f3e0'; -} -.zmdi-nfc:before { - content: '\f3e1'; -} -.zmdi-play-for-work:before { - content: '\f3e2'; -} -.zmdi-power-input:before { - content: '\f3e3'; -} -.zmdi-present-to-all:before { - content: '\f3e4'; -} -.zmdi-satellite:before { - content: '\f3e5'; -} -.zmdi-tap-and-play:before { - content: '\f3e6'; -} -.zmdi-vibration:before { - content: '\f3e7'; -} -.zmdi-voicemail:before { - content: '\f3e8'; -} -.zmdi-group:before { - content: '\f3e9'; -} -.zmdi-rss:before { - content: '\f3ea'; -} -.zmdi-shape:before { - content: '\f3eb'; -} -.zmdi-spinner:before { - content: '\f3ec'; -} -.zmdi-ungroup:before { - content: '\f3ed'; -} -.zmdi-500px:before { - content: '\f3ee'; -} -.zmdi-8tracks:before { - content: '\f3ef'; -} -.zmdi-amazon:before { - content: '\f3f0'; -} -.zmdi-blogger:before { - content: '\f3f1'; -} -.zmdi-delicious:before { - content: '\f3f2'; -} -.zmdi-disqus:before { - content: '\f3f3'; -} -.zmdi-flattr:before { - content: '\f3f4'; -} -.zmdi-flickr:before { - content: '\f3f5'; -} -.zmdi-github-alt:before { - content: '\f3f6'; -} -.zmdi-google-old:before { - content: '\f3f7'; -} -.zmdi-linkedin:before { - content: '\f3f8'; -} -.zmdi-odnoklassniki:before { - content: '\f3f9'; -} -.zmdi-outlook:before { - content: '\f3fa'; -} -.zmdi-paypal-alt:before { - content: '\f3fb'; -} -.zmdi-pinterest:before { - content: '\f3fc'; -} -.zmdi-playstation:before { - content: '\f3fd'; -} -.zmdi-reddit:before { - content: '\f3fe'; -} -.zmdi-skype:before { - content: '\f3ff'; -} -.zmdi-slideshare:before { - content: '\f400'; -} -.zmdi-soundcloud:before { - content: '\f401'; -} -.zmdi-tumblr:before { - content: '\f402'; -} -.zmdi-twitch:before { - content: '\f403'; -} -.zmdi-vimeo:before { - content: '\f404'; -} -.zmdi-whatsapp:before { - content: '\f405'; -} -.zmdi-xbox:before { - content: '\f406'; -} -.zmdi-yahoo:before { - content: '\f407'; -} -.zmdi-youtube-play:before { - content: '\f408'; -} -.zmdi-youtube:before { - content: '\f409'; -} -.zmdi-import-export:before { - content: '\f30c'; -} -.zmdi-swap-vertical-:before { - content: '\f30c'; -} -.zmdi-airplanemode-inactive:before { - content: '\f102'; -} -.zmdi-airplanemode-active:before { - content: '\f103'; -} -.zmdi-rate-review:before { - content: '\f103'; -} -.zmdi-comment-sign:before { - content: '\f25a'; -} -.zmdi-network-warning:before { - content: '\f2ad'; -} -.zmdi-shopping-cart-add:before { - content: '\f1ca'; -} -.zmdi-file-add:before { - content: '\f221'; -} -.zmdi-network-wifi-scan:before { - content: '\f2e4'; -} -.zmdi-collection-add:before { - content: '\f14e'; -} -.zmdi-format-playlist-add:before { - content: '\f3ac'; -} -.zmdi-format-queue-music:before { - content: '\f3ab'; -} -.zmdi-plus-box:before { - content: '\f277'; -} -.zmdi-tag-backspace:before { - content: '\f1d9'; -} -.zmdi-alarm-add:before { - content: '\f32b'; -} -.zmdi-battery-charging:before { - content: '\f114'; -} -.zmdi-daydream-setting:before { - content: '\f217'; -} -.zmdi-more-horiz:before { - content: '\f19c'; -} -.zmdi-book-photo:before { - content: '\f11b'; -} -.zmdi-incandescent:before { - content: '\f189'; -} -.zmdi-wb-iridescent:before { - content: '\f38c'; -} -.zmdi-calendar-remove:before { - content: '\f330'; -} -.zmdi-refresh-sync-disabled:before { - content: '\f1b7'; -} -.zmdi-refresh-sync-problem:before { - content: '\f1b6'; -} -.zmdi-crop-original:before { - content: '\f17e'; -} -.zmdi-power-off:before { - content: '\f1af'; -} -.zmdi-power-off-setting:before { - content: '\f1ae'; -} -.zmdi-leak-remove:before { - content: '\f38d'; -} -.zmdi-star-border:before { - content: '\f27c'; -} -.zmdi-brightness-low:before { - content: '\f36d'; -} -.zmdi-brightness-medium:before { - content: '\f36e'; -} -.zmdi-brightness-high:before { - content: '\f36f'; -} -.zmdi-smartphone-portrait:before { - content: '\f2d4'; -} -.zmdi-live-tv:before { - content: '\f2d9'; -} -.zmdi-format-textdirection-l-to-r:before { - content: '\f249'; -} -.zmdi-format-textdirection-r-to-l:before { - content: '\f24a'; -} -.zmdi-arrow-back:before { - content: '\f2ea'; -} -.zmdi-arrow-forward:before { - content: '\f2ee'; -} -.zmdi-arrow-in:before { - content: '\f2e9'; -} -.zmdi-arrow-out:before { - content: '\f2ed'; -} -.zmdi-rotate-90-degrees-ccw:before { - content: '\f304'; -} -.zmdi-adb:before { - content: '\f33a'; -} -.zmdi-network-wifi:before { - content: '\f2e8'; -} -.zmdi-network-wifi-alt:before { - content: '\f2e3'; -} -.zmdi-network-wifi-lock:before { - content: '\f2e5'; -} -.zmdi-network-wifi-off:before { - content: '\f2e6'; -} -.zmdi-network-wifi-outline:before { - content: '\f2e7'; -} -.zmdi-network-wifi-info:before { - content: '\f2e4'; -} -.zmdi-layers-clear:before { - content: '\f18b'; -} -.zmdi-colorize:before { - content: '\f15d'; -} -.zmdi-format-paint:before { - content: '\f1ba'; -} -.zmdi-format-quote:before { - content: '\f1b2'; -} -.zmdi-camera-monochrome-photos:before { - content: '\f285'; -} -.zmdi-sort-by-alpha:before { - content: '\f1cf'; -} -.zmdi-folder-shared:before { - content: '\f225'; -} -.zmdi-folder-special:before { - content: '\f226'; -} -.zmdi-comment-dots:before { - content: '\f260'; -} -.zmdi-reorder:before { - content: '\f31e'; -} -.zmdi-dehaze:before { - content: '\f197'; -} -.zmdi-sort:before { - content: '\f1ce'; -} -.zmdi-pages:before { - content: '\f34a'; -} -.zmdi-stack-overflow:before { - content: '\f35c'; -} -.zmdi-calendar-account:before { - content: '\f204'; -} -.zmdi-paste:before { - content: '\f109'; -} -.zmdi-cut:before { - content: '\f1bc'; -} -.zmdi-save:before { - content: '\f297'; -} -.zmdi-smartphone-code:before { - content: '\f139'; -} -.zmdi-directions-bike:before { - content: '\f117'; -} -.zmdi-directions-boat:before { - content: '\f11a'; -} -.zmdi-directions-bus:before { - content: '\f121'; -} -.zmdi-directions-car:before { - content: '\f125'; -} -.zmdi-directions-railway:before { - content: '\f1b3'; -} -.zmdi-directions-run:before { - content: '\f215'; -} -.zmdi-directions-subway:before { - content: '\f1d5'; -} -.zmdi-directions-walk:before { - content: '\f216'; -} -.zmdi-local-hotel:before { - content: '\f178'; -} -.zmdi-local-activity:before { - content: '\f1df'; -} -.zmdi-local-play:before { - content: '\f1df'; -} -.zmdi-local-airport:before { - content: '\f103'; -} -.zmdi-local-atm:before { - content: '\f198'; -} -.zmdi-local-bar:before { - content: '\f137'; -} -.zmdi-local-cafe:before { - content: '\f13b'; -} -.zmdi-local-car-wash:before { - content: '\f124'; -} -.zmdi-local-convenience-store:before { - content: '\f1d3'; -} -.zmdi-local-dining:before { - content: '\f153'; -} -.zmdi-local-drink:before { - content: '\f157'; -} -.zmdi-local-florist:before { - content: '\f168'; -} -.zmdi-local-gas-station:before { - content: '\f16f'; -} -.zmdi-local-grocery-store:before { - content: '\f1cb'; -} -.zmdi-local-hospital:before { - content: '\f177'; -} -.zmdi-local-laundry-service:before { - content: '\f1e9'; -} -.zmdi-local-library:before { - content: '\f18d'; -} -.zmdi-local-mall:before { - content: '\f195'; -} -.zmdi-local-movies:before { - content: '\f19d'; -} -.zmdi-local-offer:before { - content: '\f187'; -} -.zmdi-local-parking:before { - content: '\f1a5'; -} -.zmdi-local-parking:before { - content: '\f1a5'; -} -.zmdi-local-pharmacy:before { - content: '\f176'; -} -.zmdi-local-phone:before { - content: '\f2be'; -} -.zmdi-local-pizza:before { - content: '\f1ac'; -} -.zmdi-local-post-office:before { - content: '\f15a'; -} -.zmdi-local-printshop:before { - content: '\f1b0'; -} -.zmdi-local-see:before { - content: '\f28c'; -} -.zmdi-local-shipping:before { - content: '\f1e6'; -} -.zmdi-local-store:before { - content: '\f1d4'; -} -.zmdi-local-taxi:before { - content: '\f123'; -} -.zmdi-local-wc:before { - content: '\f211'; -} -.zmdi-my-location:before { - content: '\f299'; -} -.zmdi-directions:before { - content: '\f1e7'; -} diff --git a/public/assets/fonts/iconic/css/material-design-iconic-font.min.css b/public/assets/fonts/iconic/css/material-design-iconic-font.min.css deleted file mode 100644 index e1a58fe..0000000 --- a/public/assets/fonts/iconic/css/material-design-iconic-font.min.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Material-Design-Iconic-Font;src:url(../fonts/Material-Design-Iconic-Font.woff2?v=2.2.0) format('woff2'),url(../fonts/Material-Design-Iconic-Font.woff?v=2.2.0) format('woff'),url(../fonts/Material-Design-Iconic-Font.ttf?v=2.2.0) format('truetype')}.zmdi{display:inline-block;font:normal normal normal 14px/1 'Material-Design-Iconic-Font';font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.zmdi-hc-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.zmdi-hc-2x{font-size:2em}.zmdi-hc-3x{font-size:3em}.zmdi-hc-4x{font-size:4em}.zmdi-hc-5x{font-size:5em}.zmdi-hc-fw{width:1.28571429em;text-align:center}.zmdi-hc-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.zmdi-hc-ul>li{position:relative}.zmdi-hc-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.zmdi-hc-li.zmdi-hc-lg{left:-1.85714286em}.zmdi-hc-border{padding:.1em .25em;border:solid .1em #9e9e9e;border-radius:2px}.zmdi-hc-border-circle{padding:.1em .25em;border:solid .1em #9e9e9e;border-radius:50%}.zmdi.pull-left{float:left;margin-right:.15em}.zmdi.pull-right{float:right;margin-left:.15em}.zmdi-hc-spin{-webkit-animation:zmdi-spin 1.5s infinite linear;animation:zmdi-spin 1.5s infinite linear}.zmdi-hc-spin-reverse{-webkit-animation:zmdi-spin-reverse 1.5s infinite linear;animation:zmdi-spin-reverse 1.5s infinite linear}@-webkit-keyframes zmdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes zmdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes zmdi-spin-reverse{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(-359deg);transform:rotate(-359deg)}}@keyframes zmdi-spin-reverse{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(-359deg);transform:rotate(-359deg)}}.zmdi-hc-rotate-90{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.zmdi-hc-rotate-180{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.zmdi-hc-rotate-270{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.zmdi-hc-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.zmdi-hc-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}.zmdi-hc-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.zmdi-hc-stack-1x,.zmdi-hc-stack-2x{position:absolute;left:0;width:100%;text-align:center}.zmdi-hc-stack-1x{line-height:inherit}.zmdi-hc-stack-2x{font-size:2em}.zmdi-hc-inverse{color:#fff}.zmdi-3d-rotation:before{content:'\f101'}.zmdi-airplane-off:before{content:'\f102'}.zmdi-airplane:before{content:'\f103'}.zmdi-album:before{content:'\f104'}.zmdi-archive:before{content:'\f105'}.zmdi-assignment-account:before{content:'\f106'}.zmdi-assignment-alert:before{content:'\f107'}.zmdi-assignment-check:before{content:'\f108'}.zmdi-assignment-o:before{content:'\f109'}.zmdi-assignment-return:before{content:'\f10a'}.zmdi-assignment-returned:before{content:'\f10b'}.zmdi-assignment:before{content:'\f10c'}.zmdi-attachment-alt:before{content:'\f10d'}.zmdi-attachment:before{content:'\f10e'}.zmdi-audio:before{content:'\f10f'}.zmdi-badge-check:before{content:'\f110'}.zmdi-balance-wallet:before{content:'\f111'}.zmdi-balance:before{content:'\f112'}.zmdi-battery-alert:before{content:'\f113'}.zmdi-battery-flash:before{content:'\f114'}.zmdi-battery-unknown:before{content:'\f115'}.zmdi-battery:before{content:'\f116'}.zmdi-bike:before{content:'\f117'}.zmdi-block-alt:before{content:'\f118'}.zmdi-block:before{content:'\f119'}.zmdi-boat:before{content:'\f11a'}.zmdi-book-image:before{content:'\f11b'}.zmdi-book:before{content:'\f11c'}.zmdi-bookmark-outline:before{content:'\f11d'}.zmdi-bookmark:before{content:'\f11e'}.zmdi-brush:before{content:'\f11f'}.zmdi-bug:before{content:'\f120'}.zmdi-bus:before{content:'\f121'}.zmdi-cake:before{content:'\f122'}.zmdi-car-taxi:before{content:'\f123'}.zmdi-car-wash:before{content:'\f124'}.zmdi-car:before{content:'\f125'}.zmdi-card-giftcard:before{content:'\f126'}.zmdi-card-membership:before{content:'\f127'}.zmdi-card-travel:before{content:'\f128'}.zmdi-card:before{content:'\f129'}.zmdi-case-check:before{content:'\f12a'}.zmdi-case-download:before{content:'\f12b'}.zmdi-case-play:before{content:'\f12c'}.zmdi-case:before{content:'\f12d'}.zmdi-cast-connected:before{content:'\f12e'}.zmdi-cast:before{content:'\f12f'}.zmdi-chart-donut:before{content:'\f130'}.zmdi-chart:before{content:'\f131'}.zmdi-city-alt:before{content:'\f132'}.zmdi-city:before{content:'\f133'}.zmdi-close-circle-o:before{content:'\f134'}.zmdi-close-circle:before{content:'\f135'}.zmdi-close:before{content:'\f136'}.zmdi-cocktail:before{content:'\f137'}.zmdi-code-setting:before{content:'\f138'}.zmdi-code-smartphone:before{content:'\f139'}.zmdi-code:before{content:'\f13a'}.zmdi-coffee:before{content:'\f13b'}.zmdi-collection-bookmark:before{content:'\f13c'}.zmdi-collection-case-play:before{content:'\f13d'}.zmdi-collection-folder-image:before{content:'\f13e'}.zmdi-collection-image-o:before{content:'\f13f'}.zmdi-collection-image:before{content:'\f140'}.zmdi-collection-item-1:before{content:'\f141'}.zmdi-collection-item-2:before{content:'\f142'}.zmdi-collection-item-3:before{content:'\f143'}.zmdi-collection-item-4:before{content:'\f144'}.zmdi-collection-item-5:before{content:'\f145'}.zmdi-collection-item-6:before{content:'\f146'}.zmdi-collection-item-7:before{content:'\f147'}.zmdi-collection-item-8:before{content:'\f148'}.zmdi-collection-item-9-plus:before{content:'\f149'}.zmdi-collection-item-9:before{content:'\f14a'}.zmdi-collection-item:before{content:'\f14b'}.zmdi-collection-music:before{content:'\f14c'}.zmdi-collection-pdf:before{content:'\f14d'}.zmdi-collection-plus:before{content:'\f14e'}.zmdi-collection-speaker:before{content:'\f14f'}.zmdi-collection-text:before{content:'\f150'}.zmdi-collection-video:before{content:'\f151'}.zmdi-compass:before{content:'\f152'}.zmdi-cutlery:before{content:'\f153'}.zmdi-delete:before{content:'\f154'}.zmdi-dialpad:before{content:'\f155'}.zmdi-dns:before{content:'\f156'}.zmdi-drink:before{content:'\f157'}.zmdi-edit:before{content:'\f158'}.zmdi-email-open:before{content:'\f159'}.zmdi-email:before{content:'\f15a'}.zmdi-eye-off:before{content:'\f15b'}.zmdi-eye:before{content:'\f15c'}.zmdi-eyedropper:before{content:'\f15d'}.zmdi-favorite-outline:before{content:'\f15e'}.zmdi-favorite:before{content:'\f15f'}.zmdi-filter-list:before{content:'\f160'}.zmdi-fire:before{content:'\f161'}.zmdi-flag:before{content:'\f162'}.zmdi-flare:before{content:'\f163'}.zmdi-flash-auto:before{content:'\f164'}.zmdi-flash-off:before{content:'\f165'}.zmdi-flash:before{content:'\f166'}.zmdi-flip:before{content:'\f167'}.zmdi-flower-alt:before{content:'\f168'}.zmdi-flower:before{content:'\f169'}.zmdi-font:before{content:'\f16a'}.zmdi-fullscreen-alt:before{content:'\f16b'}.zmdi-fullscreen-exit:before{content:'\f16c'}.zmdi-fullscreen:before{content:'\f16d'}.zmdi-functions:before{content:'\f16e'}.zmdi-gas-station:before{content:'\f16f'}.zmdi-gesture:before{content:'\f170'}.zmdi-globe-alt:before{content:'\f171'}.zmdi-globe-lock:before{content:'\f172'}.zmdi-globe:before{content:'\f173'}.zmdi-graduation-cap:before{content:'\f174'}.zmdi-home:before{content:'\f175'}.zmdi-hospital-alt:before{content:'\f176'}.zmdi-hospital:before{content:'\f177'}.zmdi-hotel:before{content:'\f178'}.zmdi-hourglass-alt:before{content:'\f179'}.zmdi-hourglass-outline:before{content:'\f17a'}.zmdi-hourglass:before{content:'\f17b'}.zmdi-http:before{content:'\f17c'}.zmdi-image-alt:before{content:'\f17d'}.zmdi-image-o:before{content:'\f17e'}.zmdi-image:before{content:'\f17f'}.zmdi-inbox:before{content:'\f180'}.zmdi-invert-colors-off:before{content:'\f181'}.zmdi-invert-colors:before{content:'\f182'}.zmdi-key:before{content:'\f183'}.zmdi-label-alt-outline:before{content:'\f184'}.zmdi-label-alt:before{content:'\f185'}.zmdi-label-heart:before{content:'\f186'}.zmdi-label:before{content:'\f187'}.zmdi-labels:before{content:'\f188'}.zmdi-lamp:before{content:'\f189'}.zmdi-landscape:before{content:'\f18a'}.zmdi-layers-off:before{content:'\f18b'}.zmdi-layers:before{content:'\f18c'}.zmdi-library:before{content:'\f18d'}.zmdi-link:before{content:'\f18e'}.zmdi-lock-open:before{content:'\f18f'}.zmdi-lock-outline:before{content:'\f190'}.zmdi-lock:before{content:'\f191'}.zmdi-mail-reply-all:before{content:'\f192'}.zmdi-mail-reply:before{content:'\f193'}.zmdi-mail-send:before{content:'\f194'}.zmdi-mall:before{content:'\f195'}.zmdi-map:before{content:'\f196'}.zmdi-menu:before{content:'\f197'}.zmdi-money-box:before{content:'\f198'}.zmdi-money-off:before{content:'\f199'}.zmdi-money:before{content:'\f19a'}.zmdi-more-vert:before{content:'\f19b'}.zmdi-more:before{content:'\f19c'}.zmdi-movie-alt:before{content:'\f19d'}.zmdi-movie:before{content:'\f19e'}.zmdi-nature-people:before{content:'\f19f'}.zmdi-nature:before{content:'\f1a0'}.zmdi-navigation:before{content:'\f1a1'}.zmdi-open-in-browser:before{content:'\f1a2'}.zmdi-open-in-new:before{content:'\f1a3'}.zmdi-palette:before{content:'\f1a4'}.zmdi-parking:before{content:'\f1a5'}.zmdi-pin-account:before{content:'\f1a6'}.zmdi-pin-assistant:before{content:'\f1a7'}.zmdi-pin-drop:before{content:'\f1a8'}.zmdi-pin-help:before{content:'\f1a9'}.zmdi-pin-off:before{content:'\f1aa'}.zmdi-pin:before{content:'\f1ab'}.zmdi-pizza:before{content:'\f1ac'}.zmdi-plaster:before{content:'\f1ad'}.zmdi-power-setting:before{content:'\f1ae'}.zmdi-power:before{content:'\f1af'}.zmdi-print:before{content:'\f1b0'}.zmdi-puzzle-piece:before{content:'\f1b1'}.zmdi-quote:before{content:'\f1b2'}.zmdi-railway:before{content:'\f1b3'}.zmdi-receipt:before{content:'\f1b4'}.zmdi-refresh-alt:before{content:'\f1b5'}.zmdi-refresh-sync-alert:before{content:'\f1b6'}.zmdi-refresh-sync-off:before{content:'\f1b7'}.zmdi-refresh-sync:before{content:'\f1b8'}.zmdi-refresh:before{content:'\f1b9'}.zmdi-roller:before{content:'\f1ba'}.zmdi-ruler:before{content:'\f1bb'}.zmdi-scissors:before{content:'\f1bc'}.zmdi-screen-rotation-lock:before{content:'\f1bd'}.zmdi-screen-rotation:before{content:'\f1be'}.zmdi-search-for:before{content:'\f1bf'}.zmdi-search-in-file:before{content:'\f1c0'}.zmdi-search-in-page:before{content:'\f1c1'}.zmdi-search-replace:before{content:'\f1c2'}.zmdi-search:before{content:'\f1c3'}.zmdi-seat:before{content:'\f1c4'}.zmdi-settings-square:before{content:'\f1c5'}.zmdi-settings:before{content:'\f1c6'}.zmdi-shield-check:before{content:'\f1c7'}.zmdi-shield-security:before{content:'\f1c8'}.zmdi-shopping-basket:before{content:'\f1c9'}.zmdi-shopping-cart-plus:before{content:'\f1ca'}.zmdi-shopping-cart:before{content:'\f1cb'}.zmdi-sign-in:before{content:'\f1cc'}.zmdi-sort-amount-asc:before{content:'\f1cd'}.zmdi-sort-amount-desc:before{content:'\f1ce'}.zmdi-sort-asc:before{content:'\f1cf'}.zmdi-sort-desc:before{content:'\f1d0'}.zmdi-spellcheck:before{content:'\f1d1'}.zmdi-storage:before{content:'\f1d2'}.zmdi-store-24:before{content:'\f1d3'}.zmdi-store:before{content:'\f1d4'}.zmdi-subway:before{content:'\f1d5'}.zmdi-sun:before{content:'\f1d6'}.zmdi-tab-unselected:before{content:'\f1d7'}.zmdi-tab:before{content:'\f1d8'}.zmdi-tag-close:before{content:'\f1d9'}.zmdi-tag-more:before{content:'\f1da'}.zmdi-tag:before{content:'\f1db'}.zmdi-thumb-down:before{content:'\f1dc'}.zmdi-thumb-up-down:before{content:'\f1dd'}.zmdi-thumb-up:before{content:'\f1de'}.zmdi-ticket-star:before{content:'\f1df'}.zmdi-toll:before{content:'\f1e0'}.zmdi-toys:before{content:'\f1e1'}.zmdi-traffic:before{content:'\f1e2'}.zmdi-translate:before{content:'\f1e3'}.zmdi-triangle-down:before{content:'\f1e4'}.zmdi-triangle-up:before{content:'\f1e5'}.zmdi-truck:before{content:'\f1e6'}.zmdi-turning-sign:before{content:'\f1e7'}.zmdi-wallpaper:before{content:'\f1e8'}.zmdi-washing-machine:before{content:'\f1e9'}.zmdi-window-maximize:before{content:'\f1ea'}.zmdi-window-minimize:before{content:'\f1eb'}.zmdi-window-restore:before{content:'\f1ec'}.zmdi-wrench:before{content:'\f1ed'}.zmdi-zoom-in:before{content:'\f1ee'}.zmdi-zoom-out:before{content:'\f1ef'}.zmdi-alert-circle-o:before{content:'\f1f0'}.zmdi-alert-circle:before{content:'\f1f1'}.zmdi-alert-octagon:before{content:'\f1f2'}.zmdi-alert-polygon:before{content:'\f1f3'}.zmdi-alert-triangle:before{content:'\f1f4'}.zmdi-help-outline:before{content:'\f1f5'}.zmdi-help:before{content:'\f1f6'}.zmdi-info-outline:before{content:'\f1f7'}.zmdi-info:before{content:'\f1f8'}.zmdi-notifications-active:before{content:'\f1f9'}.zmdi-notifications-add:before{content:'\f1fa'}.zmdi-notifications-none:before{content:'\f1fb'}.zmdi-notifications-off:before{content:'\f1fc'}.zmdi-notifications-paused:before{content:'\f1fd'}.zmdi-notifications:before{content:'\f1fe'}.zmdi-account-add:before{content:'\f1ff'}.zmdi-account-box-mail:before{content:'\f200'}.zmdi-account-box-o:before{content:'\f201'}.zmdi-account-box-phone:before{content:'\f202'}.zmdi-account-box:before{content:'\f203'}.zmdi-account-calendar:before{content:'\f204'}.zmdi-account-circle:before{content:'\f205'}.zmdi-account-o:before{content:'\f206'}.zmdi-account:before{content:'\f207'}.zmdi-accounts-add:before{content:'\f208'}.zmdi-accounts-alt:before{content:'\f209'}.zmdi-accounts-list-alt:before{content:'\f20a'}.zmdi-accounts-list:before{content:'\f20b'}.zmdi-accounts-outline:before{content:'\f20c'}.zmdi-accounts:before{content:'\f20d'}.zmdi-face:before{content:'\f20e'}.zmdi-female:before{content:'\f20f'}.zmdi-male-alt:before{content:'\f210'}.zmdi-male-female:before{content:'\f211'}.zmdi-male:before{content:'\f212'}.zmdi-mood-bad:before{content:'\f213'}.zmdi-mood:before{content:'\f214'}.zmdi-run:before{content:'\f215'}.zmdi-walk:before{content:'\f216'}.zmdi-cloud-box:before{content:'\f217'}.zmdi-cloud-circle:before{content:'\f218'}.zmdi-cloud-done:before{content:'\f219'}.zmdi-cloud-download:before{content:'\f21a'}.zmdi-cloud-off:before{content:'\f21b'}.zmdi-cloud-outline-alt:before{content:'\f21c'}.zmdi-cloud-outline:before{content:'\f21d'}.zmdi-cloud-upload:before{content:'\f21e'}.zmdi-cloud:before{content:'\f21f'}.zmdi-download:before{content:'\f220'}.zmdi-file-plus:before{content:'\f221'}.zmdi-file-text:before{content:'\f222'}.zmdi-file:before{content:'\f223'}.zmdi-folder-outline:before{content:'\f224'}.zmdi-folder-person:before{content:'\f225'}.zmdi-folder-star-alt:before{content:'\f226'}.zmdi-folder-star:before{content:'\f227'}.zmdi-folder:before{content:'\f228'}.zmdi-gif:before{content:'\f229'}.zmdi-upload:before{content:'\f22a'}.zmdi-border-all:before{content:'\f22b'}.zmdi-border-bottom:before{content:'\f22c'}.zmdi-border-clear:before{content:'\f22d'}.zmdi-border-color:before{content:'\f22e'}.zmdi-border-horizontal:before{content:'\f22f'}.zmdi-border-inner:before{content:'\f230'}.zmdi-border-left:before{content:'\f231'}.zmdi-border-outer:before{content:'\f232'}.zmdi-border-right:before{content:'\f233'}.zmdi-border-style:before{content:'\f234'}.zmdi-border-top:before{content:'\f235'}.zmdi-border-vertical:before{content:'\f236'}.zmdi-copy:before{content:'\f237'}.zmdi-crop:before{content:'\f238'}.zmdi-format-align-center:before{content:'\f239'}.zmdi-format-align-justify:before{content:'\f23a'}.zmdi-format-align-left:before{content:'\f23b'}.zmdi-format-align-right:before{content:'\f23c'}.zmdi-format-bold:before{content:'\f23d'}.zmdi-format-clear-all:before{content:'\f23e'}.zmdi-format-clear:before{content:'\f23f'}.zmdi-format-color-fill:before{content:'\f240'}.zmdi-format-color-reset:before{content:'\f241'}.zmdi-format-color-text:before{content:'\f242'}.zmdi-format-indent-decrease:before{content:'\f243'}.zmdi-format-indent-increase:before{content:'\f244'}.zmdi-format-italic:before{content:'\f245'}.zmdi-format-line-spacing:before{content:'\f246'}.zmdi-format-list-bulleted:before{content:'\f247'}.zmdi-format-list-numbered:before{content:'\f248'}.zmdi-format-ltr:before{content:'\f249'}.zmdi-format-rtl:before{content:'\f24a'}.zmdi-format-size:before{content:'\f24b'}.zmdi-format-strikethrough-s:before{content:'\f24c'}.zmdi-format-strikethrough:before{content:'\f24d'}.zmdi-format-subject:before{content:'\f24e'}.zmdi-format-underlined:before{content:'\f24f'}.zmdi-format-valign-bottom:before{content:'\f250'}.zmdi-format-valign-center:before{content:'\f251'}.zmdi-format-valign-top:before{content:'\f252'}.zmdi-redo:before{content:'\f253'}.zmdi-select-all:before{content:'\f254'}.zmdi-space-bar:before{content:'\f255'}.zmdi-text-format:before{content:'\f256'}.zmdi-transform:before{content:'\f257'}.zmdi-undo:before{content:'\f258'}.zmdi-wrap-text:before{content:'\f259'}.zmdi-comment-alert:before{content:'\f25a'}.zmdi-comment-alt-text:before{content:'\f25b'}.zmdi-comment-alt:before{content:'\f25c'}.zmdi-comment-edit:before{content:'\f25d'}.zmdi-comment-image:before{content:'\f25e'}.zmdi-comment-list:before{content:'\f25f'}.zmdi-comment-more:before{content:'\f260'}.zmdi-comment-outline:before{content:'\f261'}.zmdi-comment-text-alt:before{content:'\f262'}.zmdi-comment-text:before{content:'\f263'}.zmdi-comment-video:before{content:'\f264'}.zmdi-comment:before{content:'\f265'}.zmdi-comments:before{content:'\f266'}.zmdi-check-all:before{content:'\f267'}.zmdi-check-circle-u:before{content:'\f268'}.zmdi-check-circle:before{content:'\f269'}.zmdi-check-square:before{content:'\f26a'}.zmdi-check:before{content:'\f26b'}.zmdi-circle-o:before{content:'\f26c'}.zmdi-circle:before{content:'\f26d'}.zmdi-dot-circle-alt:before{content:'\f26e'}.zmdi-dot-circle:before{content:'\f26f'}.zmdi-minus-circle-outline:before{content:'\f270'}.zmdi-minus-circle:before{content:'\f271'}.zmdi-minus-square:before{content:'\f272'}.zmdi-minus:before{content:'\f273'}.zmdi-plus-circle-o-duplicate:before{content:'\f274'}.zmdi-plus-circle-o:before{content:'\f275'}.zmdi-plus-circle:before{content:'\f276'}.zmdi-plus-square:before{content:'\f277'}.zmdi-plus:before{content:'\f278'}.zmdi-square-o:before{content:'\f279'}.zmdi-star-circle:before{content:'\f27a'}.zmdi-star-half:before{content:'\f27b'}.zmdi-star-outline:before{content:'\f27c'}.zmdi-star:before{content:'\f27d'}.zmdi-bluetooth-connected:before{content:'\f27e'}.zmdi-bluetooth-off:before{content:'\f27f'}.zmdi-bluetooth-search:before{content:'\f280'}.zmdi-bluetooth-setting:before{content:'\f281'}.zmdi-bluetooth:before{content:'\f282'}.zmdi-camera-add:before{content:'\f283'}.zmdi-camera-alt:before{content:'\f284'}.zmdi-camera-bw:before{content:'\f285'}.zmdi-camera-front:before{content:'\f286'}.zmdi-camera-mic:before{content:'\f287'}.zmdi-camera-party-mode:before{content:'\f288'}.zmdi-camera-rear:before{content:'\f289'}.zmdi-camera-roll:before{content:'\f28a'}.zmdi-camera-switch:before{content:'\f28b'}.zmdi-camera:before{content:'\f28c'}.zmdi-card-alert:before{content:'\f28d'}.zmdi-card-off:before{content:'\f28e'}.zmdi-card-sd:before{content:'\f28f'}.zmdi-card-sim:before{content:'\f290'}.zmdi-desktop-mac:before{content:'\f291'}.zmdi-desktop-windows:before{content:'\f292'}.zmdi-device-hub:before{content:'\f293'}.zmdi-devices-off:before{content:'\f294'}.zmdi-devices:before{content:'\f295'}.zmdi-dock:before{content:'\f296'}.zmdi-floppy:before{content:'\f297'}.zmdi-gamepad:before{content:'\f298'}.zmdi-gps-dot:before{content:'\f299'}.zmdi-gps-off:before{content:'\f29a'}.zmdi-gps:before{content:'\f29b'}.zmdi-headset-mic:before{content:'\f29c'}.zmdi-headset:before{content:'\f29d'}.zmdi-input-antenna:before{content:'\f29e'}.zmdi-input-composite:before{content:'\f29f'}.zmdi-input-hdmi:before{content:'\f2a0'}.zmdi-input-power:before{content:'\f2a1'}.zmdi-input-svideo:before{content:'\f2a2'}.zmdi-keyboard-hide:before{content:'\f2a3'}.zmdi-keyboard:before{content:'\f2a4'}.zmdi-laptop-chromebook:before{content:'\f2a5'}.zmdi-laptop-mac:before{content:'\f2a6'}.zmdi-laptop:before{content:'\f2a7'}.zmdi-mic-off:before{content:'\f2a8'}.zmdi-mic-outline:before{content:'\f2a9'}.zmdi-mic-setting:before{content:'\f2aa'}.zmdi-mic:before{content:'\f2ab'}.zmdi-mouse:before{content:'\f2ac'}.zmdi-network-alert:before{content:'\f2ad'}.zmdi-network-locked:before{content:'\f2ae'}.zmdi-network-off:before{content:'\f2af'}.zmdi-network-outline:before{content:'\f2b0'}.zmdi-network-setting:before{content:'\f2b1'}.zmdi-network:before{content:'\f2b2'}.zmdi-phone-bluetooth:before{content:'\f2b3'}.zmdi-phone-end:before{content:'\f2b4'}.zmdi-phone-forwarded:before{content:'\f2b5'}.zmdi-phone-in-talk:before{content:'\f2b6'}.zmdi-phone-locked:before{content:'\f2b7'}.zmdi-phone-missed:before{content:'\f2b8'}.zmdi-phone-msg:before{content:'\f2b9'}.zmdi-phone-paused:before{content:'\f2ba'}.zmdi-phone-ring:before{content:'\f2bb'}.zmdi-phone-setting:before{content:'\f2bc'}.zmdi-phone-sip:before{content:'\f2bd'}.zmdi-phone:before{content:'\f2be'}.zmdi-portable-wifi-changes:before{content:'\f2bf'}.zmdi-portable-wifi-off:before{content:'\f2c0'}.zmdi-portable-wifi:before{content:'\f2c1'}.zmdi-radio:before{content:'\f2c2'}.zmdi-reader:before{content:'\f2c3'}.zmdi-remote-control-alt:before{content:'\f2c4'}.zmdi-remote-control:before{content:'\f2c5'}.zmdi-router:before{content:'\f2c6'}.zmdi-scanner:before{content:'\f2c7'}.zmdi-smartphone-android:before{content:'\f2c8'}.zmdi-smartphone-download:before{content:'\f2c9'}.zmdi-smartphone-erase:before{content:'\f2ca'}.zmdi-smartphone-info:before{content:'\f2cb'}.zmdi-smartphone-iphone:before{content:'\f2cc'}.zmdi-smartphone-landscape-lock:before{content:'\f2cd'}.zmdi-smartphone-landscape:before{content:'\f2ce'}.zmdi-smartphone-lock:before{content:'\f2cf'}.zmdi-smartphone-portrait-lock:before{content:'\f2d0'}.zmdi-smartphone-ring:before{content:'\f2d1'}.zmdi-smartphone-setting:before{content:'\f2d2'}.zmdi-smartphone-setup:before{content:'\f2d3'}.zmdi-smartphone:before{content:'\f2d4'}.zmdi-speaker:before{content:'\f2d5'}.zmdi-tablet-android:before{content:'\f2d6'}.zmdi-tablet-mac:before{content:'\f2d7'}.zmdi-tablet:before{content:'\f2d8'}.zmdi-tv-alt-play:before{content:'\f2d9'}.zmdi-tv-list:before{content:'\f2da'}.zmdi-tv-play:before{content:'\f2db'}.zmdi-tv:before{content:'\f2dc'}.zmdi-usb:before{content:'\f2dd'}.zmdi-videocam-off:before{content:'\f2de'}.zmdi-videocam-switch:before{content:'\f2df'}.zmdi-videocam:before{content:'\f2e0'}.zmdi-watch:before{content:'\f2e1'}.zmdi-wifi-alt-2:before{content:'\f2e2'}.zmdi-wifi-alt:before{content:'\f2e3'}.zmdi-wifi-info:before{content:'\f2e4'}.zmdi-wifi-lock:before{content:'\f2e5'}.zmdi-wifi-off:before{content:'\f2e6'}.zmdi-wifi-outline:before{content:'\f2e7'}.zmdi-wifi:before{content:'\f2e8'}.zmdi-arrow-left-bottom:before{content:'\f2e9'}.zmdi-arrow-left:before{content:'\f2ea'}.zmdi-arrow-merge:before{content:'\f2eb'}.zmdi-arrow-missed:before{content:'\f2ec'}.zmdi-arrow-right-top:before{content:'\f2ed'}.zmdi-arrow-right:before{content:'\f2ee'}.zmdi-arrow-split:before{content:'\f2ef'}.zmdi-arrows:before{content:'\f2f0'}.zmdi-caret-down-circle:before{content:'\f2f1'}.zmdi-caret-down:before{content:'\f2f2'}.zmdi-caret-left-circle:before{content:'\f2f3'}.zmdi-caret-left:before{content:'\f2f4'}.zmdi-caret-right-circle:before{content:'\f2f5'}.zmdi-caret-right:before{content:'\f2f6'}.zmdi-caret-up-circle:before{content:'\f2f7'}.zmdi-caret-up:before{content:'\f2f8'}.zmdi-chevron-down:before{content:'\f2f9'}.zmdi-chevron-left:before{content:'\f2fa'}.zmdi-chevron-right:before{content:'\f2fb'}.zmdi-chevron-up:before{content:'\f2fc'}.zmdi-forward:before{content:'\f2fd'}.zmdi-long-arrow-down:before{content:'\f2fe'}.zmdi-long-arrow-left:before{content:'\f2ff'}.zmdi-long-arrow-return:before{content:'\f300'}.zmdi-long-arrow-right:before{content:'\f301'}.zmdi-long-arrow-tab:before{content:'\f302'}.zmdi-long-arrow-up:before{content:'\f303'}.zmdi-rotate-ccw:before{content:'\f304'}.zmdi-rotate-cw:before{content:'\f305'}.zmdi-rotate-left:before{content:'\f306'}.zmdi-rotate-right:before{content:'\f307'}.zmdi-square-down:before{content:'\f308'}.zmdi-square-right:before{content:'\f309'}.zmdi-swap-alt:before{content:'\f30a'}.zmdi-swap-vertical-circle:before{content:'\f30b'}.zmdi-swap-vertical:before{content:'\f30c'}.zmdi-swap:before{content:'\f30d'}.zmdi-trending-down:before{content:'\f30e'}.zmdi-trending-flat:before{content:'\f30f'}.zmdi-trending-up:before{content:'\f310'}.zmdi-unfold-less:before{content:'\f311'}.zmdi-unfold-more:before{content:'\f312'}.zmdi-apps:before{content:'\f313'}.zmdi-grid-off:before{content:'\f314'}.zmdi-grid:before{content:'\f315'}.zmdi-view-agenda:before{content:'\f316'}.zmdi-view-array:before{content:'\f317'}.zmdi-view-carousel:before{content:'\f318'}.zmdi-view-column:before{content:'\f319'}.zmdi-view-comfy:before{content:'\f31a'}.zmdi-view-compact:before{content:'\f31b'}.zmdi-view-dashboard:before{content:'\f31c'}.zmdi-view-day:before{content:'\f31d'}.zmdi-view-headline:before{content:'\f31e'}.zmdi-view-list-alt:before{content:'\f31f'}.zmdi-view-list:before{content:'\f320'}.zmdi-view-module:before{content:'\f321'}.zmdi-view-quilt:before{content:'\f322'}.zmdi-view-stream:before{content:'\f323'}.zmdi-view-subtitles:before{content:'\f324'}.zmdi-view-toc:before{content:'\f325'}.zmdi-view-web:before{content:'\f326'}.zmdi-view-week:before{content:'\f327'}.zmdi-widgets:before{content:'\f328'}.zmdi-alarm-check:before{content:'\f329'}.zmdi-alarm-off:before{content:'\f32a'}.zmdi-alarm-plus:before{content:'\f32b'}.zmdi-alarm-snooze:before{content:'\f32c'}.zmdi-alarm:before{content:'\f32d'}.zmdi-calendar-alt:before{content:'\f32e'}.zmdi-calendar-check:before{content:'\f32f'}.zmdi-calendar-close:before{content:'\f330'}.zmdi-calendar-note:before{content:'\f331'}.zmdi-calendar:before{content:'\f332'}.zmdi-time-countdown:before{content:'\f333'}.zmdi-time-interval:before{content:'\f334'}.zmdi-time-restore-setting:before{content:'\f335'}.zmdi-time-restore:before{content:'\f336'}.zmdi-time:before{content:'\f337'}.zmdi-timer-off:before{content:'\f338'}.zmdi-timer:before{content:'\f339'}.zmdi-android-alt:before{content:'\f33a'}.zmdi-android:before{content:'\f33b'}.zmdi-apple:before{content:'\f33c'}.zmdi-behance:before{content:'\f33d'}.zmdi-codepen:before{content:'\f33e'}.zmdi-dribbble:before{content:'\f33f'}.zmdi-dropbox:before{content:'\f340'}.zmdi-evernote:before{content:'\f341'}.zmdi-facebook-box:before{content:'\f342'}.zmdi-facebook:before{content:'\f343'}.zmdi-github-box:before{content:'\f344'}.zmdi-github:before{content:'\f345'}.zmdi-google-drive:before{content:'\f346'}.zmdi-google-earth:before{content:'\f347'}.zmdi-google-glass:before{content:'\f348'}.zmdi-google-maps:before{content:'\f349'}.zmdi-google-pages:before{content:'\f34a'}.zmdi-google-play:before{content:'\f34b'}.zmdi-google-plus-box:before{content:'\f34c'}.zmdi-google-plus:before{content:'\f34d'}.zmdi-google:before{content:'\f34e'}.zmdi-instagram:before{content:'\f34f'}.zmdi-language-css3:before{content:'\f350'}.zmdi-language-html5:before{content:'\f351'}.zmdi-language-javascript:before{content:'\f352'}.zmdi-language-python-alt:before{content:'\f353'}.zmdi-language-python:before{content:'\f354'}.zmdi-lastfm:before{content:'\f355'}.zmdi-linkedin-box:before{content:'\f356'}.zmdi-paypal:before{content:'\f357'}.zmdi-pinterest-box:before{content:'\f358'}.zmdi-pocket:before{content:'\f359'}.zmdi-polymer:before{content:'\f35a'}.zmdi-share:before{content:'\f35b'}.zmdi-stackoverflow:before{content:'\f35c'}.zmdi-steam-square:before{content:'\f35d'}.zmdi-steam:before{content:'\f35e'}.zmdi-twitter-box:before{content:'\f35f'}.zmdi-twitter:before{content:'\f360'}.zmdi-vk:before{content:'\f361'}.zmdi-wikipedia:before{content:'\f362'}.zmdi-windows:before{content:'\f363'}.zmdi-aspect-ratio-alt:before{content:'\f364'}.zmdi-aspect-ratio:before{content:'\f365'}.zmdi-blur-circular:before{content:'\f366'}.zmdi-blur-linear:before{content:'\f367'}.zmdi-blur-off:before{content:'\f368'}.zmdi-blur:before{content:'\f369'}.zmdi-brightness-2:before{content:'\f36a'}.zmdi-brightness-3:before{content:'\f36b'}.zmdi-brightness-4:before{content:'\f36c'}.zmdi-brightness-5:before{content:'\f36d'}.zmdi-brightness-6:before{content:'\f36e'}.zmdi-brightness-7:before{content:'\f36f'}.zmdi-brightness-auto:before{content:'\f370'}.zmdi-brightness-setting:before{content:'\f371'}.zmdi-broken-image:before{content:'\f372'}.zmdi-center-focus-strong:before{content:'\f373'}.zmdi-center-focus-weak:before{content:'\f374'}.zmdi-compare:before{content:'\f375'}.zmdi-crop-16-9:before{content:'\f376'}.zmdi-crop-3-2:before{content:'\f377'}.zmdi-crop-5-4:before{content:'\f378'}.zmdi-crop-7-5:before{content:'\f379'}.zmdi-crop-din:before{content:'\f37a'}.zmdi-crop-free:before{content:'\f37b'}.zmdi-crop-landscape:before{content:'\f37c'}.zmdi-crop-portrait:before{content:'\f37d'}.zmdi-crop-square:before{content:'\f37e'}.zmdi-exposure-alt:before{content:'\f37f'}.zmdi-exposure:before{content:'\f380'}.zmdi-filter-b-and-w:before{content:'\f381'}.zmdi-filter-center-focus:before{content:'\f382'}.zmdi-filter-frames:before{content:'\f383'}.zmdi-filter-tilt-shift:before{content:'\f384'}.zmdi-gradient:before{content:'\f385'}.zmdi-grain:before{content:'\f386'}.zmdi-graphic-eq:before{content:'\f387'}.zmdi-hdr-off:before{content:'\f388'}.zmdi-hdr-strong:before{content:'\f389'}.zmdi-hdr-weak:before{content:'\f38a'}.zmdi-hdr:before{content:'\f38b'}.zmdi-iridescent:before{content:'\f38c'}.zmdi-leak-off:before{content:'\f38d'}.zmdi-leak:before{content:'\f38e'}.zmdi-looks:before{content:'\f38f'}.zmdi-loupe:before{content:'\f390'}.zmdi-panorama-horizontal:before{content:'\f391'}.zmdi-panorama-vertical:before{content:'\f392'}.zmdi-panorama-wide-angle:before{content:'\f393'}.zmdi-photo-size-select-large:before{content:'\f394'}.zmdi-photo-size-select-small:before{content:'\f395'}.zmdi-picture-in-picture:before{content:'\f396'}.zmdi-slideshow:before{content:'\f397'}.zmdi-texture:before{content:'\f398'}.zmdi-tonality:before{content:'\f399'}.zmdi-vignette:before{content:'\f39a'}.zmdi-wb-auto:before{content:'\f39b'}.zmdi-eject-alt:before{content:'\f39c'}.zmdi-eject:before{content:'\f39d'}.zmdi-equalizer:before{content:'\f39e'}.zmdi-fast-forward:before{content:'\f39f'}.zmdi-fast-rewind:before{content:'\f3a0'}.zmdi-forward-10:before{content:'\f3a1'}.zmdi-forward-30:before{content:'\f3a2'}.zmdi-forward-5:before{content:'\f3a3'}.zmdi-hearing:before{content:'\f3a4'}.zmdi-pause-circle-outline:before{content:'\f3a5'}.zmdi-pause-circle:before{content:'\f3a6'}.zmdi-pause:before{content:'\f3a7'}.zmdi-play-circle-outline:before{content:'\f3a8'}.zmdi-play-circle:before{content:'\f3a9'}.zmdi-play:before{content:'\f3aa'}.zmdi-playlist-audio:before{content:'\f3ab'}.zmdi-playlist-plus:before{content:'\f3ac'}.zmdi-repeat-one:before{content:'\f3ad'}.zmdi-repeat:before{content:'\f3ae'}.zmdi-replay-10:before{content:'\f3af'}.zmdi-replay-30:before{content:'\f3b0'}.zmdi-replay-5:before{content:'\f3b1'}.zmdi-replay:before{content:'\f3b2'}.zmdi-shuffle:before{content:'\f3b3'}.zmdi-skip-next:before{content:'\f3b4'}.zmdi-skip-previous:before{content:'\f3b5'}.zmdi-stop:before{content:'\f3b6'}.zmdi-surround-sound:before{content:'\f3b7'}.zmdi-tune:before{content:'\f3b8'}.zmdi-volume-down:before{content:'\f3b9'}.zmdi-volume-mute:before{content:'\f3ba'}.zmdi-volume-off:before{content:'\f3bb'}.zmdi-volume-up:before{content:'\f3bc'}.zmdi-n-1-square:before{content:'\f3bd'}.zmdi-n-2-square:before{content:'\f3be'}.zmdi-n-3-square:before{content:'\f3bf'}.zmdi-n-4-square:before{content:'\f3c0'}.zmdi-n-5-square:before{content:'\f3c1'}.zmdi-n-6-square:before{content:'\f3c2'}.zmdi-neg-1:before{content:'\f3c3'}.zmdi-neg-2:before{content:'\f3c4'}.zmdi-plus-1:before{content:'\f3c5'}.zmdi-plus-2:before{content:'\f3c6'}.zmdi-sec-10:before{content:'\f3c7'}.zmdi-sec-3:before{content:'\f3c8'}.zmdi-zero:before{content:'\f3c9'}.zmdi-airline-seat-flat-angled:before{content:'\f3ca'}.zmdi-airline-seat-flat:before{content:'\f3cb'}.zmdi-airline-seat-individual-suite:before{content:'\f3cc'}.zmdi-airline-seat-legroom-extra:before{content:'\f3cd'}.zmdi-airline-seat-legroom-normal:before{content:'\f3ce'}.zmdi-airline-seat-legroom-reduced:before{content:'\f3cf'}.zmdi-airline-seat-recline-extra:before{content:'\f3d0'}.zmdi-airline-seat-recline-normal:before{content:'\f3d1'}.zmdi-airplay:before{content:'\f3d2'}.zmdi-closed-caption:before{content:'\f3d3'}.zmdi-confirmation-number:before{content:'\f3d4'}.zmdi-developer-board:before{content:'\f3d5'}.zmdi-disc-full:before{content:'\f3d6'}.zmdi-explicit:before{content:'\f3d7'}.zmdi-flight-land:before{content:'\f3d8'}.zmdi-flight-takeoff:before{content:'\f3d9'}.zmdi-flip-to-back:before{content:'\f3da'}.zmdi-flip-to-front:before{content:'\f3db'}.zmdi-group-work:before{content:'\f3dc'}.zmdi-hd:before{content:'\f3dd'}.zmdi-hq:before{content:'\f3de'}.zmdi-markunread-mailbox:before{content:'\f3df'}.zmdi-memory:before{content:'\f3e0'}.zmdi-nfc:before{content:'\f3e1'}.zmdi-play-for-work:before{content:'\f3e2'}.zmdi-power-input:before{content:'\f3e3'}.zmdi-present-to-all:before{content:'\f3e4'}.zmdi-satellite:before{content:'\f3e5'}.zmdi-tap-and-play:before{content:'\f3e6'}.zmdi-vibration:before{content:'\f3e7'}.zmdi-voicemail:before{content:'\f3e8'}.zmdi-group:before{content:'\f3e9'}.zmdi-rss:before{content:'\f3ea'}.zmdi-shape:before{content:'\f3eb'}.zmdi-spinner:before{content:'\f3ec'}.zmdi-ungroup:before{content:'\f3ed'}.zmdi-500px:before{content:'\f3ee'}.zmdi-8tracks:before{content:'\f3ef'}.zmdi-amazon:before{content:'\f3f0'}.zmdi-blogger:before{content:'\f3f1'}.zmdi-delicious:before{content:'\f3f2'}.zmdi-disqus:before{content:'\f3f3'}.zmdi-flattr:before{content:'\f3f4'}.zmdi-flickr:before{content:'\f3f5'}.zmdi-github-alt:before{content:'\f3f6'}.zmdi-google-old:before{content:'\f3f7'}.zmdi-linkedin:before{content:'\f3f8'}.zmdi-odnoklassniki:before{content:'\f3f9'}.zmdi-outlook:before{content:'\f3fa'}.zmdi-paypal-alt:before{content:'\f3fb'}.zmdi-pinterest:before{content:'\f3fc'}.zmdi-playstation:before{content:'\f3fd'}.zmdi-reddit:before{content:'\f3fe'}.zmdi-skype:before{content:'\f3ff'}.zmdi-slideshare:before{content:'\f400'}.zmdi-soundcloud:before{content:'\f401'}.zmdi-tumblr:before{content:'\f402'}.zmdi-twitch:before{content:'\f403'}.zmdi-vimeo:before{content:'\f404'}.zmdi-whatsapp:before{content:'\f405'}.zmdi-xbox:before{content:'\f406'}.zmdi-yahoo:before{content:'\f407'}.zmdi-youtube-play:before{content:'\f408'}.zmdi-youtube:before{content:'\f409'}.zmdi-3d-rotation:before{content:'\f101'}.zmdi-airplane-off:before{content:'\f102'}.zmdi-airplane:before{content:'\f103'}.zmdi-album:before{content:'\f104'}.zmdi-archive:before{content:'\f105'}.zmdi-assignment-account:before{content:'\f106'}.zmdi-assignment-alert:before{content:'\f107'}.zmdi-assignment-check:before{content:'\f108'}.zmdi-assignment-o:before{content:'\f109'}.zmdi-assignment-return:before{content:'\f10a'}.zmdi-assignment-returned:before{content:'\f10b'}.zmdi-assignment:before{content:'\f10c'}.zmdi-attachment-alt:before{content:'\f10d'}.zmdi-attachment:before{content:'\f10e'}.zmdi-audio:before{content:'\f10f'}.zmdi-badge-check:before{content:'\f110'}.zmdi-balance-wallet:before{content:'\f111'}.zmdi-balance:before{content:'\f112'}.zmdi-battery-alert:before{content:'\f113'}.zmdi-battery-flash:before{content:'\f114'}.zmdi-battery-unknown:before{content:'\f115'}.zmdi-battery:before{content:'\f116'}.zmdi-bike:before{content:'\f117'}.zmdi-block-alt:before{content:'\f118'}.zmdi-block:before{content:'\f119'}.zmdi-boat:before{content:'\f11a'}.zmdi-book-image:before{content:'\f11b'}.zmdi-book:before{content:'\f11c'}.zmdi-bookmark-outline:before{content:'\f11d'}.zmdi-bookmark:before{content:'\f11e'}.zmdi-brush:before{content:'\f11f'}.zmdi-bug:before{content:'\f120'}.zmdi-bus:before{content:'\f121'}.zmdi-cake:before{content:'\f122'}.zmdi-car-taxi:before{content:'\f123'}.zmdi-car-wash:before{content:'\f124'}.zmdi-car:before{content:'\f125'}.zmdi-card-giftcard:before{content:'\f126'}.zmdi-card-membership:before{content:'\f127'}.zmdi-card-travel:before{content:'\f128'}.zmdi-card:before{content:'\f129'}.zmdi-case-check:before{content:'\f12a'}.zmdi-case-download:before{content:'\f12b'}.zmdi-case-play:before{content:'\f12c'}.zmdi-case:before{content:'\f12d'}.zmdi-cast-connected:before{content:'\f12e'}.zmdi-cast:before{content:'\f12f'}.zmdi-chart-donut:before{content:'\f130'}.zmdi-chart:before{content:'\f131'}.zmdi-city-alt:before{content:'\f132'}.zmdi-city:before{content:'\f133'}.zmdi-close-circle-o:before{content:'\f134'}.zmdi-close-circle:before{content:'\f135'}.zmdi-close:before{content:'\f136'}.zmdi-cocktail:before{content:'\f137'}.zmdi-code-setting:before{content:'\f138'}.zmdi-code-smartphone:before{content:'\f139'}.zmdi-code:before{content:'\f13a'}.zmdi-coffee:before{content:'\f13b'}.zmdi-collection-bookmark:before{content:'\f13c'}.zmdi-collection-case-play:before{content:'\f13d'}.zmdi-collection-folder-image:before{content:'\f13e'}.zmdi-collection-image-o:before{content:'\f13f'}.zmdi-collection-image:before{content:'\f140'}.zmdi-collection-item-1:before{content:'\f141'}.zmdi-collection-item-2:before{content:'\f142'}.zmdi-collection-item-3:before{content:'\f143'}.zmdi-collection-item-4:before{content:'\f144'}.zmdi-collection-item-5:before{content:'\f145'}.zmdi-collection-item-6:before{content:'\f146'}.zmdi-collection-item-7:before{content:'\f147'}.zmdi-collection-item-8:before{content:'\f148'}.zmdi-collection-item-9-plus:before{content:'\f149'}.zmdi-collection-item-9:before{content:'\f14a'}.zmdi-collection-item:before{content:'\f14b'}.zmdi-collection-music:before{content:'\f14c'}.zmdi-collection-pdf:before{content:'\f14d'}.zmdi-collection-plus:before{content:'\f14e'}.zmdi-collection-speaker:before{content:'\f14f'}.zmdi-collection-text:before{content:'\f150'}.zmdi-collection-video:before{content:'\f151'}.zmdi-compass:before{content:'\f152'}.zmdi-cutlery:before{content:'\f153'}.zmdi-delete:before{content:'\f154'}.zmdi-dialpad:before{content:'\f155'}.zmdi-dns:before{content:'\f156'}.zmdi-drink:before{content:'\f157'}.zmdi-edit:before{content:'\f158'}.zmdi-email-open:before{content:'\f159'}.zmdi-email:before{content:'\f15a'}.zmdi-eye-off:before{content:'\f15b'}.zmdi-eye:before{content:'\f15c'}.zmdi-eyedropper:before{content:'\f15d'}.zmdi-favorite-outline:before{content:'\f15e'}.zmdi-favorite:before{content:'\f15f'}.zmdi-filter-list:before{content:'\f160'}.zmdi-fire:before{content:'\f161'}.zmdi-flag:before{content:'\f162'}.zmdi-flare:before{content:'\f163'}.zmdi-flash-auto:before{content:'\f164'}.zmdi-flash-off:before{content:'\f165'}.zmdi-flash:before{content:'\f166'}.zmdi-flip:before{content:'\f167'}.zmdi-flower-alt:before{content:'\f168'}.zmdi-flower:before{content:'\f169'}.zmdi-font:before{content:'\f16a'}.zmdi-fullscreen-alt:before{content:'\f16b'}.zmdi-fullscreen-exit:before{content:'\f16c'}.zmdi-fullscreen:before{content:'\f16d'}.zmdi-functions:before{content:'\f16e'}.zmdi-gas-station:before{content:'\f16f'}.zmdi-gesture:before{content:'\f170'}.zmdi-globe-alt:before{content:'\f171'}.zmdi-globe-lock:before{content:'\f172'}.zmdi-globe:before{content:'\f173'}.zmdi-graduation-cap:before{content:'\f174'}.zmdi-home:before{content:'\f175'}.zmdi-hospital-alt:before{content:'\f176'}.zmdi-hospital:before{content:'\f177'}.zmdi-hotel:before{content:'\f178'}.zmdi-hourglass-alt:before{content:'\f179'}.zmdi-hourglass-outline:before{content:'\f17a'}.zmdi-hourglass:before{content:'\f17b'}.zmdi-http:before{content:'\f17c'}.zmdi-image-alt:before{content:'\f17d'}.zmdi-image-o:before{content:'\f17e'}.zmdi-image:before{content:'\f17f'}.zmdi-inbox:before{content:'\f180'}.zmdi-invert-colors-off:before{content:'\f181'}.zmdi-invert-colors:before{content:'\f182'}.zmdi-key:before{content:'\f183'}.zmdi-label-alt-outline:before{content:'\f184'}.zmdi-label-alt:before{content:'\f185'}.zmdi-label-heart:before{content:'\f186'}.zmdi-label:before{content:'\f187'}.zmdi-labels:before{content:'\f188'}.zmdi-lamp:before{content:'\f189'}.zmdi-landscape:before{content:'\f18a'}.zmdi-layers-off:before{content:'\f18b'}.zmdi-layers:before{content:'\f18c'}.zmdi-library:before{content:'\f18d'}.zmdi-link:before{content:'\f18e'}.zmdi-lock-open:before{content:'\f18f'}.zmdi-lock-outline:before{content:'\f190'}.zmdi-lock:before{content:'\f191'}.zmdi-mail-reply-all:before{content:'\f192'}.zmdi-mail-reply:before{content:'\f193'}.zmdi-mail-send:before{content:'\f194'}.zmdi-mall:before{content:'\f195'}.zmdi-map:before{content:'\f196'}.zmdi-menu:before{content:'\f197'}.zmdi-money-box:before{content:'\f198'}.zmdi-money-off:before{content:'\f199'}.zmdi-money:before{content:'\f19a'}.zmdi-more-vert:before{content:'\f19b'}.zmdi-more:before{content:'\f19c'}.zmdi-movie-alt:before{content:'\f19d'}.zmdi-movie:before{content:'\f19e'}.zmdi-nature-people:before{content:'\f19f'}.zmdi-nature:before{content:'\f1a0'}.zmdi-navigation:before{content:'\f1a1'}.zmdi-open-in-browser:before{content:'\f1a2'}.zmdi-open-in-new:before{content:'\f1a3'}.zmdi-palette:before{content:'\f1a4'}.zmdi-parking:before{content:'\f1a5'}.zmdi-pin-account:before{content:'\f1a6'}.zmdi-pin-assistant:before{content:'\f1a7'}.zmdi-pin-drop:before{content:'\f1a8'}.zmdi-pin-help:before{content:'\f1a9'}.zmdi-pin-off:before{content:'\f1aa'}.zmdi-pin:before{content:'\f1ab'}.zmdi-pizza:before{content:'\f1ac'}.zmdi-plaster:before{content:'\f1ad'}.zmdi-power-setting:before{content:'\f1ae'}.zmdi-power:before{content:'\f1af'}.zmdi-print:before{content:'\f1b0'}.zmdi-puzzle-piece:before{content:'\f1b1'}.zmdi-quote:before{content:'\f1b2'}.zmdi-railway:before{content:'\f1b3'}.zmdi-receipt:before{content:'\f1b4'}.zmdi-refresh-alt:before{content:'\f1b5'}.zmdi-refresh-sync-alert:before{content:'\f1b6'}.zmdi-refresh-sync-off:before{content:'\f1b7'}.zmdi-refresh-sync:before{content:'\f1b8'}.zmdi-refresh:before{content:'\f1b9'}.zmdi-roller:before{content:'\f1ba'}.zmdi-ruler:before{content:'\f1bb'}.zmdi-scissors:before{content:'\f1bc'}.zmdi-screen-rotation-lock:before{content:'\f1bd'}.zmdi-screen-rotation:before{content:'\f1be'}.zmdi-search-for:before{content:'\f1bf'}.zmdi-search-in-file:before{content:'\f1c0'}.zmdi-search-in-page:before{content:'\f1c1'}.zmdi-search-replace:before{content:'\f1c2'}.zmdi-search:before{content:'\f1c3'}.zmdi-seat:before{content:'\f1c4'}.zmdi-settings-square:before{content:'\f1c5'}.zmdi-settings:before{content:'\f1c6'}.zmdi-shield-check:before{content:'\f1c7'}.zmdi-shield-security:before{content:'\f1c8'}.zmdi-shopping-basket:before{content:'\f1c9'}.zmdi-shopping-cart-plus:before{content:'\f1ca'}.zmdi-shopping-cart:before{content:'\f1cb'}.zmdi-sign-in:before{content:'\f1cc'}.zmdi-sort-amount-asc:before{content:'\f1cd'}.zmdi-sort-amount-desc:before{content:'\f1ce'}.zmdi-sort-asc:before{content:'\f1cf'}.zmdi-sort-desc:before{content:'\f1d0'}.zmdi-spellcheck:before{content:'\f1d1'}.zmdi-storage:before{content:'\f1d2'}.zmdi-store-24:before{content:'\f1d3'}.zmdi-store:before{content:'\f1d4'}.zmdi-subway:before{content:'\f1d5'}.zmdi-sun:before{content:'\f1d6'}.zmdi-tab-unselected:before{content:'\f1d7'}.zmdi-tab:before{content:'\f1d8'}.zmdi-tag-close:before{content:'\f1d9'}.zmdi-tag-more:before{content:'\f1da'}.zmdi-tag:before{content:'\f1db'}.zmdi-thumb-down:before{content:'\f1dc'}.zmdi-thumb-up-down:before{content:'\f1dd'}.zmdi-thumb-up:before{content:'\f1de'}.zmdi-ticket-star:before{content:'\f1df'}.zmdi-toll:before{content:'\f1e0'}.zmdi-toys:before{content:'\f1e1'}.zmdi-traffic:before{content:'\f1e2'}.zmdi-translate:before{content:'\f1e3'}.zmdi-triangle-down:before{content:'\f1e4'}.zmdi-triangle-up:before{content:'\f1e5'}.zmdi-truck:before{content:'\f1e6'}.zmdi-turning-sign:before{content:'\f1e7'}.zmdi-wallpaper:before{content:'\f1e8'}.zmdi-washing-machine:before{content:'\f1e9'}.zmdi-window-maximize:before{content:'\f1ea'}.zmdi-window-minimize:before{content:'\f1eb'}.zmdi-window-restore:before{content:'\f1ec'}.zmdi-wrench:before{content:'\f1ed'}.zmdi-zoom-in:before{content:'\f1ee'}.zmdi-zoom-out:before{content:'\f1ef'}.zmdi-alert-circle-o:before{content:'\f1f0'}.zmdi-alert-circle:before{content:'\f1f1'}.zmdi-alert-octagon:before{content:'\f1f2'}.zmdi-alert-polygon:before{content:'\f1f3'}.zmdi-alert-triangle:before{content:'\f1f4'}.zmdi-help-outline:before{content:'\f1f5'}.zmdi-help:before{content:'\f1f6'}.zmdi-info-outline:before{content:'\f1f7'}.zmdi-info:before{content:'\f1f8'}.zmdi-notifications-active:before{content:'\f1f9'}.zmdi-notifications-add:before{content:'\f1fa'}.zmdi-notifications-none:before{content:'\f1fb'}.zmdi-notifications-off:before{content:'\f1fc'}.zmdi-notifications-paused:before{content:'\f1fd'}.zmdi-notifications:before{content:'\f1fe'}.zmdi-account-add:before{content:'\f1ff'}.zmdi-account-box-mail:before{content:'\f200'}.zmdi-account-box-o:before{content:'\f201'}.zmdi-account-box-phone:before{content:'\f202'}.zmdi-account-box:before{content:'\f203'}.zmdi-account-calendar:before{content:'\f204'}.zmdi-account-circle:before{content:'\f205'}.zmdi-account-o:before{content:'\f206'}.zmdi-account:before{content:'\f207'}.zmdi-accounts-add:before{content:'\f208'}.zmdi-accounts-alt:before{content:'\f209'}.zmdi-accounts-list-alt:before{content:'\f20a'}.zmdi-accounts-list:before{content:'\f20b'}.zmdi-accounts-outline:before{content:'\f20c'}.zmdi-accounts:before{content:'\f20d'}.zmdi-face:before{content:'\f20e'}.zmdi-female:before{content:'\f20f'}.zmdi-male-alt:before{content:'\f210'}.zmdi-male-female:before{content:'\f211'}.zmdi-male:before{content:'\f212'}.zmdi-mood-bad:before{content:'\f213'}.zmdi-mood:before{content:'\f214'}.zmdi-run:before{content:'\f215'}.zmdi-walk:before{content:'\f216'}.zmdi-cloud-box:before{content:'\f217'}.zmdi-cloud-circle:before{content:'\f218'}.zmdi-cloud-done:before{content:'\f219'}.zmdi-cloud-download:before{content:'\f21a'}.zmdi-cloud-off:before{content:'\f21b'}.zmdi-cloud-outline-alt:before{content:'\f21c'}.zmdi-cloud-outline:before{content:'\f21d'}.zmdi-cloud-upload:before{content:'\f21e'}.zmdi-cloud:before{content:'\f21f'}.zmdi-download:before{content:'\f220'}.zmdi-file-plus:before{content:'\f221'}.zmdi-file-text:before{content:'\f222'}.zmdi-file:before{content:'\f223'}.zmdi-folder-outline:before{content:'\f224'}.zmdi-folder-person:before{content:'\f225'}.zmdi-folder-star-alt:before{content:'\f226'}.zmdi-folder-star:before{content:'\f227'}.zmdi-folder:before{content:'\f228'}.zmdi-gif:before{content:'\f229'}.zmdi-upload:before{content:'\f22a'}.zmdi-border-all:before{content:'\f22b'}.zmdi-border-bottom:before{content:'\f22c'}.zmdi-border-clear:before{content:'\f22d'}.zmdi-border-color:before{content:'\f22e'}.zmdi-border-horizontal:before{content:'\f22f'}.zmdi-border-inner:before{content:'\f230'}.zmdi-border-left:before{content:'\f231'}.zmdi-border-outer:before{content:'\f232'}.zmdi-border-right:before{content:'\f233'}.zmdi-border-style:before{content:'\f234'}.zmdi-border-top:before{content:'\f235'}.zmdi-border-vertical:before{content:'\f236'}.zmdi-copy:before{content:'\f237'}.zmdi-crop:before{content:'\f238'}.zmdi-format-align-center:before{content:'\f239'}.zmdi-format-align-justify:before{content:'\f23a'}.zmdi-format-align-left:before{content:'\f23b'}.zmdi-format-align-right:before{content:'\f23c'}.zmdi-format-bold:before{content:'\f23d'}.zmdi-format-clear-all:before{content:'\f23e'}.zmdi-format-clear:before{content:'\f23f'}.zmdi-format-color-fill:before{content:'\f240'}.zmdi-format-color-reset:before{content:'\f241'}.zmdi-format-color-text:before{content:'\f242'}.zmdi-format-indent-decrease:before{content:'\f243'}.zmdi-format-indent-increase:before{content:'\f244'}.zmdi-format-italic:before{content:'\f245'}.zmdi-format-line-spacing:before{content:'\f246'}.zmdi-format-list-bulleted:before{content:'\f247'}.zmdi-format-list-numbered:before{content:'\f248'}.zmdi-format-ltr:before{content:'\f249'}.zmdi-format-rtl:before{content:'\f24a'}.zmdi-format-size:before{content:'\f24b'}.zmdi-format-strikethrough-s:before{content:'\f24c'}.zmdi-format-strikethrough:before{content:'\f24d'}.zmdi-format-subject:before{content:'\f24e'}.zmdi-format-underlined:before{content:'\f24f'}.zmdi-format-valign-bottom:before{content:'\f250'}.zmdi-format-valign-center:before{content:'\f251'}.zmdi-format-valign-top:before{content:'\f252'}.zmdi-redo:before{content:'\f253'}.zmdi-select-all:before{content:'\f254'}.zmdi-space-bar:before{content:'\f255'}.zmdi-text-format:before{content:'\f256'}.zmdi-transform:before{content:'\f257'}.zmdi-undo:before{content:'\f258'}.zmdi-wrap-text:before{content:'\f259'}.zmdi-comment-alert:before{content:'\f25a'}.zmdi-comment-alt-text:before{content:'\f25b'}.zmdi-comment-alt:before{content:'\f25c'}.zmdi-comment-edit:before{content:'\f25d'}.zmdi-comment-image:before{content:'\f25e'}.zmdi-comment-list:before{content:'\f25f'}.zmdi-comment-more:before{content:'\f260'}.zmdi-comment-outline:before{content:'\f261'}.zmdi-comment-text-alt:before{content:'\f262'}.zmdi-comment-text:before{content:'\f263'}.zmdi-comment-video:before{content:'\f264'}.zmdi-comment:before{content:'\f265'}.zmdi-comments:before{content:'\f266'}.zmdi-check-all:before{content:'\f267'}.zmdi-check-circle-u:before{content:'\f268'}.zmdi-check-circle:before{content:'\f269'}.zmdi-check-square:before{content:'\f26a'}.zmdi-check:before{content:'\f26b'}.zmdi-circle-o:before{content:'\f26c'}.zmdi-circle:before{content:'\f26d'}.zmdi-dot-circle-alt:before{content:'\f26e'}.zmdi-dot-circle:before{content:'\f26f'}.zmdi-minus-circle-outline:before{content:'\f270'}.zmdi-minus-circle:before{content:'\f271'}.zmdi-minus-square:before{content:'\f272'}.zmdi-minus:before{content:'\f273'}.zmdi-plus-circle-o-duplicate:before{content:'\f274'}.zmdi-plus-circle-o:before{content:'\f275'}.zmdi-plus-circle:before{content:'\f276'}.zmdi-plus-square:before{content:'\f277'}.zmdi-plus:before{content:'\f278'}.zmdi-square-o:before{content:'\f279'}.zmdi-star-circle:before{content:'\f27a'}.zmdi-star-half:before{content:'\f27b'}.zmdi-star-outline:before{content:'\f27c'}.zmdi-star:before{content:'\f27d'}.zmdi-bluetooth-connected:before{content:'\f27e'}.zmdi-bluetooth-off:before{content:'\f27f'}.zmdi-bluetooth-search:before{content:'\f280'}.zmdi-bluetooth-setting:before{content:'\f281'}.zmdi-bluetooth:before{content:'\f282'}.zmdi-camera-add:before{content:'\f283'}.zmdi-camera-alt:before{content:'\f284'}.zmdi-camera-bw:before{content:'\f285'}.zmdi-camera-front:before{content:'\f286'}.zmdi-camera-mic:before{content:'\f287'}.zmdi-camera-party-mode:before{content:'\f288'}.zmdi-camera-rear:before{content:'\f289'}.zmdi-camera-roll:before{content:'\f28a'}.zmdi-camera-switch:before{content:'\f28b'}.zmdi-camera:before{content:'\f28c'}.zmdi-card-alert:before{content:'\f28d'}.zmdi-card-off:before{content:'\f28e'}.zmdi-card-sd:before{content:'\f28f'}.zmdi-card-sim:before{content:'\f290'}.zmdi-desktop-mac:before{content:'\f291'}.zmdi-desktop-windows:before{content:'\f292'}.zmdi-device-hub:before{content:'\f293'}.zmdi-devices-off:before{content:'\f294'}.zmdi-devices:before{content:'\f295'}.zmdi-dock:before{content:'\f296'}.zmdi-floppy:before{content:'\f297'}.zmdi-gamepad:before{content:'\f298'}.zmdi-gps-dot:before{content:'\f299'}.zmdi-gps-off:before{content:'\f29a'}.zmdi-gps:before{content:'\f29b'}.zmdi-headset-mic:before{content:'\f29c'}.zmdi-headset:before{content:'\f29d'}.zmdi-input-antenna:before{content:'\f29e'}.zmdi-input-composite:before{content:'\f29f'}.zmdi-input-hdmi:before{content:'\f2a0'}.zmdi-input-power:before{content:'\f2a1'}.zmdi-input-svideo:before{content:'\f2a2'}.zmdi-keyboard-hide:before{content:'\f2a3'}.zmdi-keyboard:before{content:'\f2a4'}.zmdi-laptop-chromebook:before{content:'\f2a5'}.zmdi-laptop-mac:before{content:'\f2a6'}.zmdi-laptop:before{content:'\f2a7'}.zmdi-mic-off:before{content:'\f2a8'}.zmdi-mic-outline:before{content:'\f2a9'}.zmdi-mic-setting:before{content:'\f2aa'}.zmdi-mic:before{content:'\f2ab'}.zmdi-mouse:before{content:'\f2ac'}.zmdi-network-alert:before{content:'\f2ad'}.zmdi-network-locked:before{content:'\f2ae'}.zmdi-network-off:before{content:'\f2af'}.zmdi-network-outline:before{content:'\f2b0'}.zmdi-network-setting:before{content:'\f2b1'}.zmdi-network:before{content:'\f2b2'}.zmdi-phone-bluetooth:before{content:'\f2b3'}.zmdi-phone-end:before{content:'\f2b4'}.zmdi-phone-forwarded:before{content:'\f2b5'}.zmdi-phone-in-talk:before{content:'\f2b6'}.zmdi-phone-locked:before{content:'\f2b7'}.zmdi-phone-missed:before{content:'\f2b8'}.zmdi-phone-msg:before{content:'\f2b9'}.zmdi-phone-paused:before{content:'\f2ba'}.zmdi-phone-ring:before{content:'\f2bb'}.zmdi-phone-setting:before{content:'\f2bc'}.zmdi-phone-sip:before{content:'\f2bd'}.zmdi-phone:before{content:'\f2be'}.zmdi-portable-wifi-changes:before{content:'\f2bf'}.zmdi-portable-wifi-off:before{content:'\f2c0'}.zmdi-portable-wifi:before{content:'\f2c1'}.zmdi-radio:before{content:'\f2c2'}.zmdi-reader:before{content:'\f2c3'}.zmdi-remote-control-alt:before{content:'\f2c4'}.zmdi-remote-control:before{content:'\f2c5'}.zmdi-router:before{content:'\f2c6'}.zmdi-scanner:before{content:'\f2c7'}.zmdi-smartphone-android:before{content:'\f2c8'}.zmdi-smartphone-download:before{content:'\f2c9'}.zmdi-smartphone-erase:before{content:'\f2ca'}.zmdi-smartphone-info:before{content:'\f2cb'}.zmdi-smartphone-iphone:before{content:'\f2cc'}.zmdi-smartphone-landscape-lock:before{content:'\f2cd'}.zmdi-smartphone-landscape:before{content:'\f2ce'}.zmdi-smartphone-lock:before{content:'\f2cf'}.zmdi-smartphone-portrait-lock:before{content:'\f2d0'}.zmdi-smartphone-ring:before{content:'\f2d1'}.zmdi-smartphone-setting:before{content:'\f2d2'}.zmdi-smartphone-setup:before{content:'\f2d3'}.zmdi-smartphone:before{content:'\f2d4'}.zmdi-speaker:before{content:'\f2d5'}.zmdi-tablet-android:before{content:'\f2d6'}.zmdi-tablet-mac:before{content:'\f2d7'}.zmdi-tablet:before{content:'\f2d8'}.zmdi-tv-alt-play:before{content:'\f2d9'}.zmdi-tv-list:before{content:'\f2da'}.zmdi-tv-play:before{content:'\f2db'}.zmdi-tv:before{content:'\f2dc'}.zmdi-usb:before{content:'\f2dd'}.zmdi-videocam-off:before{content:'\f2de'}.zmdi-videocam-switch:before{content:'\f2df'}.zmdi-videocam:before{content:'\f2e0'}.zmdi-watch:before{content:'\f2e1'}.zmdi-wifi-alt-2:before{content:'\f2e2'}.zmdi-wifi-alt:before{content:'\f2e3'}.zmdi-wifi-info:before{content:'\f2e4'}.zmdi-wifi-lock:before{content:'\f2e5'}.zmdi-wifi-off:before{content:'\f2e6'}.zmdi-wifi-outline:before{content:'\f2e7'}.zmdi-wifi:before{content:'\f2e8'}.zmdi-arrow-left-bottom:before{content:'\f2e9'}.zmdi-arrow-left:before{content:'\f2ea'}.zmdi-arrow-merge:before{content:'\f2eb'}.zmdi-arrow-missed:before{content:'\f2ec'}.zmdi-arrow-right-top:before{content:'\f2ed'}.zmdi-arrow-right:before{content:'\f2ee'}.zmdi-arrow-split:before{content:'\f2ef'}.zmdi-arrows:before{content:'\f2f0'}.zmdi-caret-down-circle:before{content:'\f2f1'}.zmdi-caret-down:before{content:'\f2f2'}.zmdi-caret-left-circle:before{content:'\f2f3'}.zmdi-caret-left:before{content:'\f2f4'}.zmdi-caret-right-circle:before{content:'\f2f5'}.zmdi-caret-right:before{content:'\f2f6'}.zmdi-caret-up-circle:before{content:'\f2f7'}.zmdi-caret-up:before{content:'\f2f8'}.zmdi-chevron-down:before{content:'\f2f9'}.zmdi-chevron-left:before{content:'\f2fa'}.zmdi-chevron-right:before{content:'\f2fb'}.zmdi-chevron-up:before{content:'\f2fc'}.zmdi-forward:before{content:'\f2fd'}.zmdi-long-arrow-down:before{content:'\f2fe'}.zmdi-long-arrow-left:before{content:'\f2ff'}.zmdi-long-arrow-return:before{content:'\f300'}.zmdi-long-arrow-right:before{content:'\f301'}.zmdi-long-arrow-tab:before{content:'\f302'}.zmdi-long-arrow-up:before{content:'\f303'}.zmdi-rotate-ccw:before{content:'\f304'}.zmdi-rotate-cw:before{content:'\f305'}.zmdi-rotate-left:before{content:'\f306'}.zmdi-rotate-right:before{content:'\f307'}.zmdi-square-down:before{content:'\f308'}.zmdi-square-right:before{content:'\f309'}.zmdi-swap-alt:before{content:'\f30a'}.zmdi-swap-vertical-circle:before{content:'\f30b'}.zmdi-swap-vertical:before{content:'\f30c'}.zmdi-swap:before{content:'\f30d'}.zmdi-trending-down:before{content:'\f30e'}.zmdi-trending-flat:before{content:'\f30f'}.zmdi-trending-up:before{content:'\f310'}.zmdi-unfold-less:before{content:'\f311'}.zmdi-unfold-more:before{content:'\f312'}.zmdi-apps:before{content:'\f313'}.zmdi-grid-off:before{content:'\f314'}.zmdi-grid:before{content:'\f315'}.zmdi-view-agenda:before{content:'\f316'}.zmdi-view-array:before{content:'\f317'}.zmdi-view-carousel:before{content:'\f318'}.zmdi-view-column:before{content:'\f319'}.zmdi-view-comfy:before{content:'\f31a'}.zmdi-view-compact:before{content:'\f31b'}.zmdi-view-dashboard:before{content:'\f31c'}.zmdi-view-day:before{content:'\f31d'}.zmdi-view-headline:before{content:'\f31e'}.zmdi-view-list-alt:before{content:'\f31f'}.zmdi-view-list:before{content:'\f320'}.zmdi-view-module:before{content:'\f321'}.zmdi-view-quilt:before{content:'\f322'}.zmdi-view-stream:before{content:'\f323'}.zmdi-view-subtitles:before{content:'\f324'}.zmdi-view-toc:before{content:'\f325'}.zmdi-view-web:before{content:'\f326'}.zmdi-view-week:before{content:'\f327'}.zmdi-widgets:before{content:'\f328'}.zmdi-alarm-check:before{content:'\f329'}.zmdi-alarm-off:before{content:'\f32a'}.zmdi-alarm-plus:before{content:'\f32b'}.zmdi-alarm-snooze:before{content:'\f32c'}.zmdi-alarm:before{content:'\f32d'}.zmdi-calendar-alt:before{content:'\f32e'}.zmdi-calendar-check:before{content:'\f32f'}.zmdi-calendar-close:before{content:'\f330'}.zmdi-calendar-note:before{content:'\f331'}.zmdi-calendar:before{content:'\f332'}.zmdi-time-countdown:before{content:'\f333'}.zmdi-time-interval:before{content:'\f334'}.zmdi-time-restore-setting:before{content:'\f335'}.zmdi-time-restore:before{content:'\f336'}.zmdi-time:before{content:'\f337'}.zmdi-timer-off:before{content:'\f338'}.zmdi-timer:before{content:'\f339'}.zmdi-android-alt:before{content:'\f33a'}.zmdi-android:before{content:'\f33b'}.zmdi-apple:before{content:'\f33c'}.zmdi-behance:before{content:'\f33d'}.zmdi-codepen:before{content:'\f33e'}.zmdi-dribbble:before{content:'\f33f'}.zmdi-dropbox:before{content:'\f340'}.zmdi-evernote:before{content:'\f341'}.zmdi-facebook-box:before{content:'\f342'}.zmdi-facebook:before{content:'\f343'}.zmdi-github-box:before{content:'\f344'}.zmdi-github:before{content:'\f345'}.zmdi-google-drive:before{content:'\f346'}.zmdi-google-earth:before{content:'\f347'}.zmdi-google-glass:before{content:'\f348'}.zmdi-google-maps:before{content:'\f349'}.zmdi-google-pages:before{content:'\f34a'}.zmdi-google-play:before{content:'\f34b'}.zmdi-google-plus-box:before{content:'\f34c'}.zmdi-google-plus:before{content:'\f34d'}.zmdi-google:before{content:'\f34e'}.zmdi-instagram:before{content:'\f34f'}.zmdi-language-css3:before{content:'\f350'}.zmdi-language-html5:before{content:'\f351'}.zmdi-language-javascript:before{content:'\f352'}.zmdi-language-python-alt:before{content:'\f353'}.zmdi-language-python:before{content:'\f354'}.zmdi-lastfm:before{content:'\f355'}.zmdi-linkedin-box:before{content:'\f356'}.zmdi-paypal:before{content:'\f357'}.zmdi-pinterest-box:before{content:'\f358'}.zmdi-pocket:before{content:'\f359'}.zmdi-polymer:before{content:'\f35a'}.zmdi-share:before{content:'\f35b'}.zmdi-stackoverflow:before{content:'\f35c'}.zmdi-steam-square:before{content:'\f35d'}.zmdi-steam:before{content:'\f35e'}.zmdi-twitter-box:before{content:'\f35f'}.zmdi-twitter:before{content:'\f360'}.zmdi-vk:before{content:'\f361'}.zmdi-wikipedia:before{content:'\f362'}.zmdi-windows:before{content:'\f363'}.zmdi-aspect-ratio-alt:before{content:'\f364'}.zmdi-aspect-ratio:before{content:'\f365'}.zmdi-blur-circular:before{content:'\f366'}.zmdi-blur-linear:before{content:'\f367'}.zmdi-blur-off:before{content:'\f368'}.zmdi-blur:before{content:'\f369'}.zmdi-brightness-2:before{content:'\f36a'}.zmdi-brightness-3:before{content:'\f36b'}.zmdi-brightness-4:before{content:'\f36c'}.zmdi-brightness-5:before{content:'\f36d'}.zmdi-brightness-6:before{content:'\f36e'}.zmdi-brightness-7:before{content:'\f36f'}.zmdi-brightness-auto:before{content:'\f370'}.zmdi-brightness-setting:before{content:'\f371'}.zmdi-broken-image:before{content:'\f372'}.zmdi-center-focus-strong:before{content:'\f373'}.zmdi-center-focus-weak:before{content:'\f374'}.zmdi-compare:before{content:'\f375'}.zmdi-crop-16-9:before{content:'\f376'}.zmdi-crop-3-2:before{content:'\f377'}.zmdi-crop-5-4:before{content:'\f378'}.zmdi-crop-7-5:before{content:'\f379'}.zmdi-crop-din:before{content:'\f37a'}.zmdi-crop-free:before{content:'\f37b'}.zmdi-crop-landscape:before{content:'\f37c'}.zmdi-crop-portrait:before{content:'\f37d'}.zmdi-crop-square:before{content:'\f37e'}.zmdi-exposure-alt:before{content:'\f37f'}.zmdi-exposure:before{content:'\f380'}.zmdi-filter-b-and-w:before{content:'\f381'}.zmdi-filter-center-focus:before{content:'\f382'}.zmdi-filter-frames:before{content:'\f383'}.zmdi-filter-tilt-shift:before{content:'\f384'}.zmdi-gradient:before{content:'\f385'}.zmdi-grain:before{content:'\f386'}.zmdi-graphic-eq:before{content:'\f387'}.zmdi-hdr-off:before{content:'\f388'}.zmdi-hdr-strong:before{content:'\f389'}.zmdi-hdr-weak:before{content:'\f38a'}.zmdi-hdr:before{content:'\f38b'}.zmdi-iridescent:before{content:'\f38c'}.zmdi-leak-off:before{content:'\f38d'}.zmdi-leak:before{content:'\f38e'}.zmdi-looks:before{content:'\f38f'}.zmdi-loupe:before{content:'\f390'}.zmdi-panorama-horizontal:before{content:'\f391'}.zmdi-panorama-vertical:before{content:'\f392'}.zmdi-panorama-wide-angle:before{content:'\f393'}.zmdi-photo-size-select-large:before{content:'\f394'}.zmdi-photo-size-select-small:before{content:'\f395'}.zmdi-picture-in-picture:before{content:'\f396'}.zmdi-slideshow:before{content:'\f397'}.zmdi-texture:before{content:'\f398'}.zmdi-tonality:before{content:'\f399'}.zmdi-vignette:before{content:'\f39a'}.zmdi-wb-auto:before{content:'\f39b'}.zmdi-eject-alt:before{content:'\f39c'}.zmdi-eject:before{content:'\f39d'}.zmdi-equalizer:before{content:'\f39e'}.zmdi-fast-forward:before{content:'\f39f'}.zmdi-fast-rewind:before{content:'\f3a0'}.zmdi-forward-10:before{content:'\f3a1'}.zmdi-forward-30:before{content:'\f3a2'}.zmdi-forward-5:before{content:'\f3a3'}.zmdi-hearing:before{content:'\f3a4'}.zmdi-pause-circle-outline:before{content:'\f3a5'}.zmdi-pause-circle:before{content:'\f3a6'}.zmdi-pause:before{content:'\f3a7'}.zmdi-play-circle-outline:before{content:'\f3a8'}.zmdi-play-circle:before{content:'\f3a9'}.zmdi-play:before{content:'\f3aa'}.zmdi-playlist-audio:before{content:'\f3ab'}.zmdi-playlist-plus:before{content:'\f3ac'}.zmdi-repeat-one:before{content:'\f3ad'}.zmdi-repeat:before{content:'\f3ae'}.zmdi-replay-10:before{content:'\f3af'}.zmdi-replay-30:before{content:'\f3b0'}.zmdi-replay-5:before{content:'\f3b1'}.zmdi-replay:before{content:'\f3b2'}.zmdi-shuffle:before{content:'\f3b3'}.zmdi-skip-next:before{content:'\f3b4'}.zmdi-skip-previous:before{content:'\f3b5'}.zmdi-stop:before{content:'\f3b6'}.zmdi-surround-sound:before{content:'\f3b7'}.zmdi-tune:before{content:'\f3b8'}.zmdi-volume-down:before{content:'\f3b9'}.zmdi-volume-mute:before{content:'\f3ba'}.zmdi-volume-off:before{content:'\f3bb'}.zmdi-volume-up:before{content:'\f3bc'}.zmdi-n-1-square:before{content:'\f3bd'}.zmdi-n-2-square:before{content:'\f3be'}.zmdi-n-3-square:before{content:'\f3bf'}.zmdi-n-4-square:before{content:'\f3c0'}.zmdi-n-5-square:before{content:'\f3c1'}.zmdi-n-6-square:before{content:'\f3c2'}.zmdi-neg-1:before{content:'\f3c3'}.zmdi-neg-2:before{content:'\f3c4'}.zmdi-plus-1:before{content:'\f3c5'}.zmdi-plus-2:before{content:'\f3c6'}.zmdi-sec-10:before{content:'\f3c7'}.zmdi-sec-3:before{content:'\f3c8'}.zmdi-zero:before{content:'\f3c9'}.zmdi-airline-seat-flat-angled:before{content:'\f3ca'}.zmdi-airline-seat-flat:before{content:'\f3cb'}.zmdi-airline-seat-individual-suite:before{content:'\f3cc'}.zmdi-airline-seat-legroom-extra:before{content:'\f3cd'}.zmdi-airline-seat-legroom-normal:before{content:'\f3ce'}.zmdi-airline-seat-legroom-reduced:before{content:'\f3cf'}.zmdi-airline-seat-recline-extra:before{content:'\f3d0'}.zmdi-airline-seat-recline-normal:before{content:'\f3d1'}.zmdi-airplay:before{content:'\f3d2'}.zmdi-closed-caption:before{content:'\f3d3'}.zmdi-confirmation-number:before{content:'\f3d4'}.zmdi-developer-board:before{content:'\f3d5'}.zmdi-disc-full:before{content:'\f3d6'}.zmdi-explicit:before{content:'\f3d7'}.zmdi-flight-land:before{content:'\f3d8'}.zmdi-flight-takeoff:before{content:'\f3d9'}.zmdi-flip-to-back:before{content:'\f3da'}.zmdi-flip-to-front:before{content:'\f3db'}.zmdi-group-work:before{content:'\f3dc'}.zmdi-hd:before{content:'\f3dd'}.zmdi-hq:before{content:'\f3de'}.zmdi-markunread-mailbox:before{content:'\f3df'}.zmdi-memory:before{content:'\f3e0'}.zmdi-nfc:before{content:'\f3e1'}.zmdi-play-for-work:before{content:'\f3e2'}.zmdi-power-input:before{content:'\f3e3'}.zmdi-present-to-all:before{content:'\f3e4'}.zmdi-satellite:before{content:'\f3e5'}.zmdi-tap-and-play:before{content:'\f3e6'}.zmdi-vibration:before{content:'\f3e7'}.zmdi-voicemail:before{content:'\f3e8'}.zmdi-group:before{content:'\f3e9'}.zmdi-rss:before{content:'\f3ea'}.zmdi-shape:before{content:'\f3eb'}.zmdi-spinner:before{content:'\f3ec'}.zmdi-ungroup:before{content:'\f3ed'}.zmdi-500px:before{content:'\f3ee'}.zmdi-8tracks:before{content:'\f3ef'}.zmdi-amazon:before{content:'\f3f0'}.zmdi-blogger:before{content:'\f3f1'}.zmdi-delicious:before{content:'\f3f2'}.zmdi-disqus:before{content:'\f3f3'}.zmdi-flattr:before{content:'\f3f4'}.zmdi-flickr:before{content:'\f3f5'}.zmdi-github-alt:before{content:'\f3f6'}.zmdi-google-old:before{content:'\f3f7'}.zmdi-linkedin:before{content:'\f3f8'}.zmdi-odnoklassniki:before{content:'\f3f9'}.zmdi-outlook:before{content:'\f3fa'}.zmdi-paypal-alt:before{content:'\f3fb'}.zmdi-pinterest:before{content:'\f3fc'}.zmdi-playstation:before{content:'\f3fd'}.zmdi-reddit:before{content:'\f3fe'}.zmdi-skype:before{content:'\f3ff'}.zmdi-slideshare:before{content:'\f400'}.zmdi-soundcloud:before{content:'\f401'}.zmdi-tumblr:before{content:'\f402'}.zmdi-twitch:before{content:'\f403'}.zmdi-vimeo:before{content:'\f404'}.zmdi-whatsapp:before{content:'\f405'}.zmdi-xbox:before{content:'\f406'}.zmdi-yahoo:before{content:'\f407'}.zmdi-youtube-play:before{content:'\f408'}.zmdi-youtube:before{content:'\f409'}.zmdi-import-export:before{content:'\f30c'}.zmdi-swap-vertical-:before{content:'\f30c'}.zmdi-airplanemode-inactive:before{content:'\f102'}.zmdi-airplanemode-active:before{content:'\f103'}.zmdi-rate-review:before{content:'\f103'}.zmdi-comment-sign:before{content:'\f25a'}.zmdi-network-warning:before{content:'\f2ad'}.zmdi-shopping-cart-add:before{content:'\f1ca'}.zmdi-file-add:before{content:'\f221'}.zmdi-network-wifi-scan:before{content:'\f2e4'}.zmdi-collection-add:before{content:'\f14e'}.zmdi-format-playlist-add:before{content:'\f3ac'}.zmdi-format-queue-music:before{content:'\f3ab'}.zmdi-plus-box:before{content:'\f277'}.zmdi-tag-backspace:before{content:'\f1d9'}.zmdi-alarm-add:before{content:'\f32b'}.zmdi-battery-charging:before{content:'\f114'}.zmdi-daydream-setting:before{content:'\f217'}.zmdi-more-horiz:before{content:'\f19c'}.zmdi-book-photo:before{content:'\f11b'}.zmdi-incandescent:before{content:'\f189'}.zmdi-wb-iridescent:before{content:'\f38c'}.zmdi-calendar-remove:before{content:'\f330'}.zmdi-refresh-sync-disabled:before{content:'\f1b7'}.zmdi-refresh-sync-problem:before{content:'\f1b6'}.zmdi-crop-original:before{content:'\f17e'}.zmdi-power-off:before{content:'\f1af'}.zmdi-power-off-setting:before{content:'\f1ae'}.zmdi-leak-remove:before{content:'\f38d'}.zmdi-star-border:before{content:'\f27c'}.zmdi-brightness-low:before{content:'\f36d'}.zmdi-brightness-medium:before{content:'\f36e'}.zmdi-brightness-high:before{content:'\f36f'}.zmdi-smartphone-portrait:before{content:'\f2d4'}.zmdi-live-tv:before{content:'\f2d9'}.zmdi-format-textdirection-l-to-r:before{content:'\f249'}.zmdi-format-textdirection-r-to-l:before{content:'\f24a'}.zmdi-arrow-back:before{content:'\f2ea'}.zmdi-arrow-forward:before{content:'\f2ee'}.zmdi-arrow-in:before{content:'\f2e9'}.zmdi-arrow-out:before{content:'\f2ed'}.zmdi-rotate-90-degrees-ccw:before{content:'\f304'}.zmdi-adb:before{content:'\f33a'}.zmdi-network-wifi:before{content:'\f2e8'}.zmdi-network-wifi-alt:before{content:'\f2e3'}.zmdi-network-wifi-lock:before{content:'\f2e5'}.zmdi-network-wifi-off:before{content:'\f2e6'}.zmdi-network-wifi-outline:before{content:'\f2e7'}.zmdi-network-wifi-info:before{content:'\f2e4'}.zmdi-layers-clear:before{content:'\f18b'}.zmdi-colorize:before{content:'\f15d'}.zmdi-format-paint:before{content:'\f1ba'}.zmdi-format-quote:before{content:'\f1b2'}.zmdi-camera-monochrome-photos:before{content:'\f285'}.zmdi-sort-by-alpha:before{content:'\f1cf'}.zmdi-folder-shared:before{content:'\f225'}.zmdi-folder-special:before{content:'\f226'}.zmdi-comment-dots:before{content:'\f260'}.zmdi-reorder:before{content:'\f31e'}.zmdi-dehaze:before{content:'\f197'}.zmdi-sort:before{content:'\f1ce'}.zmdi-pages:before{content:'\f34a'}.zmdi-stack-overflow:before{content:'\f35c'}.zmdi-calendar-account:before{content:'\f204'}.zmdi-paste:before{content:'\f109'}.zmdi-cut:before{content:'\f1bc'}.zmdi-save:before{content:'\f297'}.zmdi-smartphone-code:before{content:'\f139'}.zmdi-directions-bike:before{content:'\f117'}.zmdi-directions-boat:before{content:'\f11a'}.zmdi-directions-bus:before{content:'\f121'}.zmdi-directions-car:before{content:'\f125'}.zmdi-directions-railway:before{content:'\f1b3'}.zmdi-directions-run:before{content:'\f215'}.zmdi-directions-subway:before{content:'\f1d5'}.zmdi-directions-walk:before{content:'\f216'}.zmdi-local-hotel:before{content:'\f178'}.zmdi-local-activity:before{content:'\f1df'}.zmdi-local-play:before{content:'\f1df'}.zmdi-local-airport:before{content:'\f103'}.zmdi-local-atm:before{content:'\f198'}.zmdi-local-bar:before{content:'\f137'}.zmdi-local-cafe:before{content:'\f13b'}.zmdi-local-car-wash:before{content:'\f124'}.zmdi-local-convenience-store:before{content:'\f1d3'}.zmdi-local-dining:before{content:'\f153'}.zmdi-local-drink:before{content:'\f157'}.zmdi-local-florist:before{content:'\f168'}.zmdi-local-gas-station:before{content:'\f16f'}.zmdi-local-grocery-store:before{content:'\f1cb'}.zmdi-local-hospital:before{content:'\f177'}.zmdi-local-laundry-service:before{content:'\f1e9'}.zmdi-local-library:before{content:'\f18d'}.zmdi-local-mall:before{content:'\f195'}.zmdi-local-movies:before{content:'\f19d'}.zmdi-local-offer:before{content:'\f187'}.zmdi-local-parking:before{content:'\f1a5'}.zmdi-local-parking:before{content:'\f1a5'}.zmdi-local-pharmacy:before{content:'\f176'}.zmdi-local-phone:before{content:'\f2be'}.zmdi-local-pizza:before{content:'\f1ac'}.zmdi-local-post-office:before{content:'\f15a'}.zmdi-local-printshop:before{content:'\f1b0'}.zmdi-local-see:before{content:'\f28c'}.zmdi-local-shipping:before{content:'\f1e6'}.zmdi-local-store:before{content:'\f1d4'}.zmdi-local-taxi:before{content:'\f123'}.zmdi-local-wc:before{content:'\f211'}.zmdi-my-location:before{content:'\f299'}.zmdi-directions:before{content:'\f1e7'} \ No newline at end of file diff --git a/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.eot b/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.eot deleted file mode 100644 index 5e25191..0000000 Binary files a/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.eot and /dev/null differ diff --git a/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.svg b/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.svg deleted file mode 100644 index 8cb2673..0000000 --- a/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.svg +++ /dev/null @@ -1,787 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.ttf b/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.ttf deleted file mode 100644 index 5d489fd..0000000 Binary files a/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.ttf and /dev/null differ diff --git a/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.woff b/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.woff deleted file mode 100644 index 933b2bf..0000000 Binary files a/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.woff and /dev/null differ diff --git a/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.woff2 b/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.woff2 deleted file mode 100644 index 35970e2..0000000 Binary files a/public/assets/fonts/iconic/fonts/Material-Design-Iconic-Font.woff2 and /dev/null differ diff --git a/public/assets/fonts/nucleo-icons.eot b/public/assets/fonts/nucleo-icons.eot deleted file mode 100644 index cd4c781..0000000 Binary files a/public/assets/fonts/nucleo-icons.eot and /dev/null differ diff --git a/public/assets/fonts/nucleo-icons.svg b/public/assets/fonts/nucleo-icons.svg deleted file mode 100644 index 93c6dba..0000000 --- a/public/assets/fonts/nucleo-icons.svg +++ /dev/null @@ -1,312 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/assets/fonts/nucleo-icons.ttf b/public/assets/fonts/nucleo-icons.ttf deleted file mode 100644 index fdbc77a..0000000 Binary files a/public/assets/fonts/nucleo-icons.ttf and /dev/null differ diff --git a/public/assets/fonts/nucleo-icons.woff b/public/assets/fonts/nucleo-icons.woff deleted file mode 100644 index 66f39ab..0000000 Binary files a/public/assets/fonts/nucleo-icons.woff and /dev/null differ diff --git a/public/assets/fonts/nucleo-icons.woff2 b/public/assets/fonts/nucleo-icons.woff2 deleted file mode 100644 index ffb5bef..0000000 Binary files a/public/assets/fonts/nucleo-icons.woff2 and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-Black.ttf b/public/assets/fonts/poppins/Poppins-Black.ttf deleted file mode 100644 index 4d409e0..0000000 Binary files a/public/assets/fonts/poppins/Poppins-Black.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-BlackItalic.ttf b/public/assets/fonts/poppins/Poppins-BlackItalic.ttf deleted file mode 100644 index f3c5e0a..0000000 Binary files a/public/assets/fonts/poppins/Poppins-BlackItalic.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-Bold.ttf b/public/assets/fonts/poppins/Poppins-Bold.ttf deleted file mode 100644 index 44313ca..0000000 Binary files a/public/assets/fonts/poppins/Poppins-Bold.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-BoldItalic.ttf b/public/assets/fonts/poppins/Poppins-BoldItalic.ttf deleted file mode 100644 index 939fc7d..0000000 Binary files a/public/assets/fonts/poppins/Poppins-BoldItalic.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-ExtraBold.ttf b/public/assets/fonts/poppins/Poppins-ExtraBold.ttf deleted file mode 100644 index 88d0f1e..0000000 Binary files a/public/assets/fonts/poppins/Poppins-ExtraBold.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-ExtraBoldItalic.ttf b/public/assets/fonts/poppins/Poppins-ExtraBoldItalic.ttf deleted file mode 100644 index da7a257..0000000 Binary files a/public/assets/fonts/poppins/Poppins-ExtraBoldItalic.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-ExtraLight.ttf b/public/assets/fonts/poppins/Poppins-ExtraLight.ttf deleted file mode 100644 index 4620a42..0000000 Binary files a/public/assets/fonts/poppins/Poppins-ExtraLight.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-ExtraLightItalic.ttf b/public/assets/fonts/poppins/Poppins-ExtraLightItalic.ttf deleted file mode 100644 index 2c5ad2f..0000000 Binary files a/public/assets/fonts/poppins/Poppins-ExtraLightItalic.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-Italic.ttf b/public/assets/fonts/poppins/Poppins-Italic.ttf deleted file mode 100644 index 8efebbf..0000000 Binary files a/public/assets/fonts/poppins/Poppins-Italic.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-Light.ttf b/public/assets/fonts/poppins/Poppins-Light.ttf deleted file mode 100644 index 8a6ac68..0000000 Binary files a/public/assets/fonts/poppins/Poppins-Light.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-LightItalic.ttf b/public/assets/fonts/poppins/Poppins-LightItalic.ttf deleted file mode 100644 index b8f46a6..0000000 Binary files a/public/assets/fonts/poppins/Poppins-LightItalic.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-Medium.ttf b/public/assets/fonts/poppins/Poppins-Medium.ttf deleted file mode 100644 index 5b46f19..0000000 Binary files a/public/assets/fonts/poppins/Poppins-Medium.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-MediumItalic.ttf b/public/assets/fonts/poppins/Poppins-MediumItalic.ttf deleted file mode 100644 index e362e57..0000000 Binary files a/public/assets/fonts/poppins/Poppins-MediumItalic.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-Regular.ttf b/public/assets/fonts/poppins/Poppins-Regular.ttf deleted file mode 100644 index 246a861..0000000 Binary files a/public/assets/fonts/poppins/Poppins-Regular.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-SemiBold.ttf b/public/assets/fonts/poppins/Poppins-SemiBold.ttf deleted file mode 100644 index 3bbad2a..0000000 Binary files a/public/assets/fonts/poppins/Poppins-SemiBold.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-SemiBoldItalic.ttf b/public/assets/fonts/poppins/Poppins-SemiBoldItalic.ttf deleted file mode 100644 index 74a7c43..0000000 Binary files a/public/assets/fonts/poppins/Poppins-SemiBoldItalic.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-Thin.ttf b/public/assets/fonts/poppins/Poppins-Thin.ttf deleted file mode 100644 index 205b284..0000000 Binary files a/public/assets/fonts/poppins/Poppins-Thin.ttf and /dev/null differ diff --git a/public/assets/fonts/poppins/Poppins-ThinItalic.ttf b/public/assets/fonts/poppins/Poppins-ThinItalic.ttf deleted file mode 100644 index 2f4b05e..0000000 Binary files a/public/assets/fonts/poppins/Poppins-ThinItalic.ttf and /dev/null differ diff --git a/public/assets/img/apple-icon.png b/public/assets/img/apple-icon.png deleted file mode 100644 index a20470f..0000000 Binary files a/public/assets/img/apple-icon.png and /dev/null differ diff --git a/public/assets/img/bg-01.jpg b/public/assets/img/bg-01.jpg deleted file mode 100644 index c895bc6..0000000 Binary files a/public/assets/img/bg-01.jpg and /dev/null differ diff --git a/public/assets/img/default-avatar.png b/public/assets/img/default-avatar.png deleted file mode 100644 index ca9fa88..0000000 Binary files a/public/assets/img/default-avatar.png and /dev/null differ diff --git a/public/assets/img/faces/face-0.jpg b/public/assets/img/faces/face-0.jpg deleted file mode 100644 index ca9fa88..0000000 Binary files a/public/assets/img/faces/face-0.jpg and /dev/null differ diff --git a/public/assets/img/faces/face-1.jpg b/public/assets/img/faces/face-1.jpg deleted file mode 100644 index bc74fea..0000000 Binary files a/public/assets/img/faces/face-1.jpg and /dev/null differ diff --git a/public/assets/img/faces/face-2.jpg b/public/assets/img/faces/face-2.jpg deleted file mode 100644 index 4a6637c..0000000 Binary files a/public/assets/img/faces/face-2.jpg and /dev/null differ diff --git a/public/assets/img/faces/face-3.jpg b/public/assets/img/faces/face-3.jpg deleted file mode 100644 index 81a238a..0000000 Binary files a/public/assets/img/faces/face-3.jpg and /dev/null differ diff --git a/public/assets/img/faces/face-4.jpg b/public/assets/img/faces/face-4.jpg deleted file mode 100644 index c23359b..0000000 Binary files a/public/assets/img/faces/face-4.jpg and /dev/null differ diff --git a/public/assets/img/faces/face-5.jpg b/public/assets/img/faces/face-5.jpg deleted file mode 100644 index f5bb581..0000000 Binary files a/public/assets/img/faces/face-5.jpg and /dev/null differ diff --git a/public/assets/img/faces/face-6.jpg b/public/assets/img/faces/face-6.jpg deleted file mode 100644 index 9735106..0000000 Binary files a/public/assets/img/faces/face-6.jpg and /dev/null differ diff --git a/public/assets/img/faces/face-7.jpg b/public/assets/img/faces/face-7.jpg deleted file mode 100644 index cba3665..0000000 Binary files a/public/assets/img/faces/face-7.jpg and /dev/null differ diff --git a/public/assets/img/faces/tim_vector.jpe b/public/assets/img/faces/tim_vector.jpe deleted file mode 100644 index dbcc410..0000000 Binary files a/public/assets/img/faces/tim_vector.jpe and /dev/null differ diff --git a/public/assets/img/favicon.ico b/public/assets/img/favicon.ico deleted file mode 100644 index 7482a65..0000000 Binary files a/public/assets/img/favicon.ico and /dev/null differ diff --git a/public/assets/img/full-screen-image-3.jpg b/public/assets/img/full-screen-image-3.jpg deleted file mode 100644 index 6a59ec6..0000000 Binary files a/public/assets/img/full-screen-image-3.jpg and /dev/null differ diff --git a/public/assets/img/icons/favicon.ico b/public/assets/img/icons/favicon.ico deleted file mode 100644 index b2bff33..0000000 Binary files a/public/assets/img/icons/favicon.ico and /dev/null differ diff --git a/public/assets/img/loading-bubbles.svg b/public/assets/img/loading-bubbles.svg deleted file mode 100644 index 4020b4d..0000000 --- a/public/assets/img/loading-bubbles.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - diff --git a/public/assets/img/mask.png b/public/assets/img/mask.png deleted file mode 100644 index 429360d..0000000 Binary files a/public/assets/img/mask.png and /dev/null differ diff --git a/public/assets/img/new_logo.png b/public/assets/img/new_logo.png deleted file mode 100644 index 8e2192b..0000000 Binary files a/public/assets/img/new_logo.png and /dev/null differ diff --git a/public/assets/img/sidebar-1.jpg b/public/assets/img/sidebar-1.jpg deleted file mode 100644 index a7ad3d7..0000000 Binary files a/public/assets/img/sidebar-1.jpg and /dev/null differ diff --git a/public/assets/img/sidebar-2.jpg b/public/assets/img/sidebar-2.jpg deleted file mode 100644 index 146abe8..0000000 Binary files a/public/assets/img/sidebar-2.jpg and /dev/null differ diff --git a/public/assets/img/sidebar-3.jpg b/public/assets/img/sidebar-3.jpg deleted file mode 100644 index bbddc09..0000000 Binary files a/public/assets/img/sidebar-3.jpg and /dev/null differ diff --git a/public/assets/img/sidebar-4.jpg b/public/assets/img/sidebar-4.jpg deleted file mode 100644 index 53fd996..0000000 Binary files a/public/assets/img/sidebar-4.jpg and /dev/null differ diff --git a/public/assets/img/sidebar-5.jpg b/public/assets/img/sidebar-5.jpg deleted file mode 100644 index f9d9964..0000000 Binary files a/public/assets/img/sidebar-5.jpg and /dev/null differ diff --git a/public/assets/img/tim_80x80.png b/public/assets/img/tim_80x80.png deleted file mode 100644 index 1f7aa0d..0000000 Binary files a/public/assets/img/tim_80x80.png and /dev/null differ diff --git a/public/assets/js/core/bootstrap.min.js b/public/assets/js/core/bootstrap.min.js deleted file mode 100644 index 3d9c6a1..0000000 --- a/public/assets/js/core/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v4.0.0-beta (https://getbootstrap.com) - * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");!function(t){var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),function(){function t(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function e(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(s.end)},supportsTransitionEnd:function(){return Boolean(s)},typeCheckConfig:function(t,i,o){for(var r in o)if(o.hasOwnProperty(r)){var s=o[r],a=i[r],l=a&&n(a)?"element":e(a);if(!new RegExp(s).test(l))throw new Error(t.toUpperCase()+': Option "'+r+'" provided type "'+l+'" but expected type "'+s+'".')}}};return s=o(),t.fn.emulateTransitionEnd=r,l.supportsTransitionEnd()&&(t.event.special[l.TRANSITION_END]=i()),l}(jQuery),s=(function(t){var e="alert",i=t.fn[e],s={DISMISS:'[data-dismiss="alert"]'},a={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},l={ALERT:"alert",FADE:"fade",SHOW:"show"},h=function(){function e(t){n(this,e),this._element=t}return e.prototype.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.prototype.dispose=function(){t.removeData(this._element,"bs.alert"),this._element=null},e.prototype._getRootElement=function(e){var n=r.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+l.ALERT)[0]),i},e.prototype._triggerCloseEvent=function(e){var n=t.Event(a.CLOSE);return t(e).trigger(n),n},e.prototype._removeElement=function(e){var n=this;t(e).removeClass(l.SHOW),r.supportsTransitionEnd()&&t(e).hasClass(l.FADE)?t(e).one(r.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(150):this._destroyElement(e)},e.prototype._destroyElement=function(e){t(e).detach().trigger(a.CLOSED).remove()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.alert");o||(o=new e(this),i.data("bs.alert",o)),"close"===n&&o[n](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DISMISS,h._handleDismiss(new h)),t.fn[e]=h._jQueryInterface,t.fn[e].Constructor=h,t.fn[e].noConflict=function(){return t.fn[e]=i,h._jQueryInterface}}(jQuery),function(t){var e="button",i=t.fn[e],r={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},s={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},a={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.toggle=function(){var e=!0,n=!0,i=t(this._element).closest(s.DATA_TOGGLE)[0];if(i){var o=t(this._element).find(s.INPUT)[0];if(o){if("radio"===o.type)if(o.checked&&t(this._element).hasClass(r.ACTIVE))e=!1;else{var a=t(i).find(s.ACTIVE)[0];a&&t(a).removeClass(r.ACTIVE)}if(e){if(o.hasAttribute("disabled")||i.hasAttribute("disabled")||o.classList.contains("disabled")||i.classList.contains("disabled"))return;o.checked=!t(this._element).hasClass(r.ACTIVE),t(o).trigger("change")}o.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!t(this._element).hasClass(r.ACTIVE)),e&&t(this._element).toggleClass(r.ACTIVE)},e.prototype.dispose=function(){t.removeData(this._element,"bs.button"),this._element=null},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data("bs.button");i||(i=new e(this),t(this).data("bs.button",i)),"toggle"===n&&i[n]()})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DATA_TOGGLE_CARROT,function(e){e.preventDefault();var n=e.target;t(n).hasClass(r.BUTTON)||(n=t(n).closest(s.BUTTON)),l._jQueryInterface.call(t(n),"toggle")}).on(a.FOCUS_BLUR_DATA_API,s.DATA_TOGGLE_CARROT,function(e){var n=t(e.target).closest(s.BUTTON)[0];t(n).toggleClass(r.FOCUS,/^focus(in)?$/.test(e.type))}),t.fn[e]=l._jQueryInterface,t.fn[e].Constructor=l,t.fn[e].noConflict=function(){return t.fn[e]=i,l._jQueryInterface}}(jQuery),function(t){var e="carousel",s="bs.carousel",a="."+s,l=t.fn[e],h={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},c={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},u={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},d={SLIDE:"slide"+a,SLID:"slid"+a,KEYDOWN:"keydown"+a,MOUSEENTER:"mouseenter"+a,MOUSELEAVE:"mouseleave"+a,TOUCHEND:"touchend"+a,LOAD_DATA_API:"load.bs.carousel.data-api",CLICK_DATA_API:"click.bs.carousel.data-api"},f={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},p={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},_=function(){function l(e,i){n(this,l),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(i),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(p.INDICATORS)[0],this._addEventListeners()}return l.prototype.next=function(){this._isSliding||this._slide(u.NEXT)},l.prototype.nextWhenVisible=function(){document.hidden||this.next()},l.prototype.prev=function(){this._isSliding||this._slide(u.PREV)},l.prototype.pause=function(e){e||(this._isPaused=!0),t(this._element).find(p.NEXT_PREV)[0]&&r.supportsTransitionEnd()&&(r.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},l.prototype.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},l.prototype.to=function(e){var n=this;this._activeElement=t(this._element).find(p.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var o=e>i?u.NEXT:u.PREV;this._slide(o,this._items[e])}},l.prototype.dispose=function(){t(this._element).off(a),t.removeData(this._element,s),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},l.prototype._getConfig=function(n){return n=t.extend({},h,n),r.typeCheckConfig(e,n,c),n},l.prototype._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},l.prototype._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},l.prototype._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(p.ITEM)),this._items.indexOf(e)},l.prototype._getItemByDirection=function(t,e){var n=t===u.NEXT,i=t===u.PREV,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===u.PREV?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},l.prototype._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),o=this._getItemIndex(t(this._element).find(p.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:o,to:i});return t(this._element).trigger(r),r},l.prototype._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(p.ACTIVE).removeClass(f.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(f.ACTIVE)}},l.prototype._slide=function(e,n){var i=this,o=t(this._element).find(p.ACTIVE_ITEM)[0],s=this._getItemIndex(o),a=n||o&&this._getItemByDirection(e,o),l=this._getItemIndex(a),h=Boolean(this._interval),c=void 0,_=void 0,g=void 0;if(e===u.NEXT?(c=f.LEFT,_=f.NEXT,g=u.LEFT):(c=f.RIGHT,_=f.PREV,g=u.RIGHT),a&&t(a).hasClass(f.ACTIVE))this._isSliding=!1;else if(!this._triggerSlideEvent(a,g).isDefaultPrevented()&&o&&a){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(a);var m=t.Event(d.SLID,{relatedTarget:a,direction:g,from:s,to:l});r.supportsTransitionEnd()&&t(this._element).hasClass(f.SLIDE)?(t(a).addClass(_),r.reflow(a),t(o).addClass(c),t(a).addClass(c),t(o).one(r.TRANSITION_END,function(){t(a).removeClass(c+" "+_).addClass(f.ACTIVE),t(o).removeClass(f.ACTIVE+" "+_+" "+c),i._isSliding=!1,setTimeout(function(){return t(i._element).trigger(m)},0)}).emulateTransitionEnd(600)):(t(o).removeClass(f.ACTIVE),t(a).addClass(f.ACTIVE),this._isSliding=!1,t(this._element).trigger(m)),h&&this.cycle()}},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o=t.extend({},h,t(this).data());"object"===(void 0===e?"undefined":i(e))&&t.extend(o,e);var r="string"==typeof e?e:o.slide;if(n||(n=new l(this,o),t(this).data(s,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new Error('No method named "'+r+'"');n[r]()}else o.interval&&(n.pause(),n.cycle())})},l._dataApiClickHandler=function(e){var n=r.getSelectorFromElement(this);if(n){var i=t(n)[0];if(i&&t(i).hasClass(f.CAROUSEL)){var o=t.extend({},t(i).data(),t(this).data()),a=this.getAttribute("data-slide-to");a&&(o.interval=!1),l._jQueryInterface.call(t(i),o),a&&t(i).data(s).to(a),e.preventDefault()}}},o(l,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return h}}]),l}();t(document).on(d.CLICK_DATA_API,p.DATA_SLIDE,_._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(p.DATA_RIDE).each(function(){var e=t(this);_._jQueryInterface.call(e,e.data())})}),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=l,_._jQueryInterface}}(jQuery),function(t){var e="collapse",s="bs.collapse",a=t.fn[e],l={toggle:!0,parent:""},h={toggle:"boolean",parent:"string"},c={SHOW:"show.bs.collapse",SHOWN:"shown.bs.collapse",HIDE:"hide.bs.collapse",HIDDEN:"hidden.bs.collapse",CLICK_DATA_API:"click.bs.collapse.data-api"},u={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},d={WIDTH:"width",HEIGHT:"height"},f={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},p=function(){function a(e,i){n(this,a),this._isTransitioning=!1,this._element=e,this._config=this._getConfig(i),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var o=t(f.DATA_TOGGLE),s=0;s0&&this._triggerArray.push(l)}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}return a.prototype.toggle=function(){t(this._element).hasClass(u.SHOW)?this.hide():this.show()},a.prototype.show=function(){var e=this;if(!this._isTransitioning&&!t(this._element).hasClass(u.SHOW)){var n=void 0,i=void 0;if(this._parent&&((n=t.makeArray(t(this._parent).children().children(f.ACTIVES))).length||(n=null)),!(n&&(i=t(n).data(s))&&i._isTransitioning)){var o=t.Event(c.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(a._jQueryInterface.call(t(n),"hide"),i||t(n).data(s,null));var l=this._getDimension();t(this._element).removeClass(u.COLLAPSE).addClass(u.COLLAPSING),this._element.style[l]=0,this._triggerArray.length&&t(this._triggerArray).removeClass(u.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).addClass(u.SHOW),e._element.style[l]="",e.setTransitioning(!1),t(e._element).trigger(c.SHOWN)};if(r.supportsTransitionEnd()){var d="scroll"+(l[0].toUpperCase()+l.slice(1));t(this._element).one(r.TRANSITION_END,h).emulateTransitionEnd(600),this._element.style[l]=this._element[d]+"px"}else h()}}}},a.prototype.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(u.SHOW)){var n=t.Event(c.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",r.reflow(this._element),t(this._element).addClass(u.COLLAPSING).removeClass(u.COLLAPSE).removeClass(u.SHOW),this._triggerArray.length)for(var o=0;o0},l.prototype._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:{offset:this._config.offset},flip:{enabled:this._config.flip}}};return this._inNavbar&&(t.modifiers.applyStyle={enabled:!this._inNavbar}),t},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o="object"===(void 0===e?"undefined":i(e))?e:null;if(n||(n=new l(this,o),t(this).data(s,n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},l._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(d.DATA_TOGGLE)),i=0;i0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},a.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},a.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t .dropdown-menu .active"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(s.ACTIVE)||t(this._element).hasClass(s.DISABLED))){var n=void 0,o=void 0,l=t(this._element).closest(a.NAV_LIST_GROUP)[0],h=r.getSelectorFromElement(this._element);l&&(o=t.makeArray(t(l).find(a.ACTIVE)),o=o[o.length-1]);var c=t.Event(i.HIDE,{relatedTarget:this._element}),u=t.Event(i.SHOW,{relatedTarget:o});if(o&&t(o).trigger(c),t(this._element).trigger(u),!u.isDefaultPrevented()&&!c.isDefaultPrevented()){h&&(n=t(h)[0]),this._activate(this._element,l);var d=function(){var n=t.Event(i.HIDDEN,{relatedTarget:e._element}),r=t.Event(i.SHOWN,{relatedTarget:o});t(o).trigger(n),t(e._element).trigger(r)};n?this._activate(n,n.parentNode,d):d()}}},e.prototype.dispose=function(){t.removeData(this._element,"bs.tab"),this._element=null},e.prototype._activate=function(e,n,i){var o=this,l=t(n).find(a.ACTIVE)[0],h=i&&r.supportsTransitionEnd()&&l&&t(l).hasClass(s.FADE),c=function(){return o._transitionComplete(e,l,h,i)};l&&h?t(l).one(r.TRANSITION_END,c).emulateTransitionEnd(150):c(),l&&t(l).removeClass(s.SHOW)},e.prototype._transitionComplete=function(e,n,i,o){if(n){t(n).removeClass(s.ACTIVE);var l=t(n.parentNode).find(a.DROPDOWN_ACTIVE_CHILD)[0];l&&t(l).removeClass(s.ACTIVE),n.setAttribute("aria-expanded",!1)}if(t(e).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0),i?(r.reflow(e),t(e).addClass(s.SHOW)):t(e).removeClass(s.FADE),e.parentNode&&t(e.parentNode).hasClass(s.DROPDOWN_MENU)){var h=t(e).closest(a.DROPDOWN)[0];h&&t(h).find(a.DROPDOWN_TOGGLE).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0)}o&&o()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.tab");if(o||(o=new e(this),i.data("bs.tab",o)),"string"==typeof n){if(void 0===o[n])throw new Error('No method named "'+n+'"');o[n]()}})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(i.CLICK_DATA_API,a.DATA_TOGGLE,function(e){e.preventDefault(),l._jQueryInterface.call(t(this),"show")}),t.fn.tab=l._jQueryInterface,t.fn.tab.Constructor=l,t.fn.tab.noConflict=function(){return t.fn.tab=e,l._jQueryInterface}}(jQuery),function(t){if("undefined"==typeof Popper)throw new Error("Bootstrap tooltips require Popper.js (https://popper.js.org)");var e="tooltip",s=".bs.tooltip",a=t.fn[e],l=new RegExp("(^|\\s)bs-tooltip\\S+","g"),h={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)"},c={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},u={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip"},d={SHOW:"show",OUT:"out"},f={HIDE:"hide"+s,HIDDEN:"hidden"+s,SHOW:"show"+s,SHOWN:"shown"+s,INSERTED:"inserted"+s,CLICK:"click"+s,FOCUSIN:"focusin"+s,FOCUSOUT:"focusout"+s,MOUSEENTER:"mouseenter"+s,MOUSELEAVE:"mouseleave"+s},p={FADE:"fade",SHOW:"show"},_={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner",ARROW:".arrow"},g={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},m=function(){function a(t,e){n(this,a),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return a.prototype.enable=function(){this._isEnabled=!0},a.prototype.disable=function(){this._isEnabled=!1},a.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},a.prototype.toggle=function(e){if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p.SHOW))return void this._leave(null,this);this._enter(null,this)}},a.prototype.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},a.prototype.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(n);var i=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!i)return;var o=this.getTipElement(),s=r.getUID(this.constructor.NAME);o.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(o).addClass(p.FADE);var l="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(o).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(o).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Popper(this.element,o,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:_.ARROW}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(o).addClass(p.SHOW),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d.OUT&&e._leave(null,e)};r.supportsTransitionEnd()&&t(this.tip).hasClass(p.FADE)?t(this.tip).one(r.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},a.prototype.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE),s=function(){n._hoverState!==d.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(p.SHOW),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[g.CLICK]=!1,this._activeTrigger[g.FOCUS]=!1,this._activeTrigger[g.HOVER]=!1,r.supportsTransitionEnd()&&t(this.tip).hasClass(p.FADE)?t(i).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s(),this._hoverState="")},a.prototype.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},a.prototype.isWithContent=function(){return Boolean(this.getTitle())},a.prototype.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},a.prototype.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0]},a.prototype.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(_.TOOLTIP_INNER),this.getTitle()),e.removeClass(p.FADE+" "+p.SHOW)},a.prototype.setElementContent=function(e,n){var o=this.config.html;"object"===(void 0===n?"undefined":i(n))&&(n.nodeType||n.jquery)?o?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[o?"html":"text"](n)},a.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},a.prototype._getAttachment=function(t){return c[t.toUpperCase()]},a.prototype._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==g.MANUAL){var i=n===g.HOVER?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===g.HOVER?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=t.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},a.prototype._fixTitle=function(){var t=i(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},a.prototype._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?g.FOCUS:g.HOVER]=!0),t(n.getTipElement()).hasClass(p.SHOW)||n._hoverState===d.SHOW?n._hoverState=d.SHOW:(clearTimeout(n._timeout),n._hoverState=d.SHOW,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===d.SHOW&&n.show()},n.config.delay.show):n.show())},a.prototype._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?g.FOCUS:g.HOVER]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d.OUT,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d.OUT&&n.hide()},n.config.delay.hide):n.hide())},a.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},a.prototype._getConfig=function(n){return(n=t.extend({},this.constructor.Default,t(this.element).data(),n)).delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.title&&"number"==typeof n.title&&(n.title=n.title.toString()),n.content&&"number"==typeof n.content&&(n.content=n.content.toString()),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},a.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},a.prototype._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},a.prototype._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},a.prototype._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(p.FADE),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.tooltip"),o="object"===(void 0===e?"undefined":i(e))&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,o),t(this).data("bs.tooltip",n)),"string"==typeof e)){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return f}},{key:"EVENT_KEY",get:function(){return s}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=a,m._jQueryInterface},m}(jQuery));!function(r){var a="popover",l=".bs.popover",h=r.fn[a],c=new RegExp("(^|\\s)bs-popover\\S+","g"),u=r.extend({},s.Default,{placement:"right",trigger:"click",content:"",template:''}),d=r.extend({},s.DefaultType,{content:"(string|element|function)"}),f={FADE:"fade",SHOW:"show"},p={TITLE:".popover-header",CONTENT:".popover-body"},_={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,INSERTED:"inserted"+l,CLICK:"click"+l,FOCUSIN:"focusin"+l,FOCUSOUT:"focusout"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l},g=function(s){function h(){return n(this,h),t(this,s.apply(this,arguments))}return e(h,s),h.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},h.prototype.addAttachmentClass=function(t){r(this.getTipElement()).addClass("bs-popover-"+t)},h.prototype.getTipElement=function(){return this.tip=this.tip||r(this.config.template)[0]},h.prototype.setContent=function(){var t=r(this.getTipElement());this.setElementContent(t.find(p.TITLE),this.getTitle()),this.setElementContent(t.find(p.CONTENT),this._getContent()),t.removeClass(f.FADE+" "+f.SHOW)},h.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},h.prototype._cleanTipClass=function(){var t=r(this.getTipElement()),e=t.attr("class").match(c);null!==e&&e.length>0&&t.removeClass(e.join(""))},h._jQueryInterface=function(t){return this.each(function(){var e=r(this).data("bs.popover"),n="object"===(void 0===t?"undefined":i(t))?t:null;if((e||!/destroy|hide/.test(t))&&(e||(e=new h(this,n),r(this).data("bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new Error('No method named "'+t+'"');e[t]()}})},o(h,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return a}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return l}},{key:"DefaultType",get:function(){return d}}]),h}(s);r.fn[a]=g._jQueryInterface,r.fn[a].Constructor=g,r.fn[a].noConflict=function(){return r.fn[a]=h,g._jQueryInterface}}(jQuery)}(); diff --git a/public/assets/js/core/jquery.3.2.1.min.js b/public/assets/js/core/jquery.3.2.1.min.js deleted file mode 100644 index 644d35e..0000000 --- a/public/assets/js/core/jquery.3.2.1.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), -a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), -null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" - - - - -
-
-

getCode() ? ' #' . $exception->getCode() : '') ?>

-

- getMessage() ?> - getMessage())) ?>" - rel="noreferrer" target="_blank">search → -

-
-
- - -
-

at line

- - -
- -
- -
- -
- - - -
- - -
- -
    - $row) : ?> - -
  1. -

    - - - - - {PHP internal code} - - - - -   —   - - - ( arguments ) -

    - - - getParameters(); - } - foreach ($row['args'] as $key => $value) : ?> - - - - - - -
    name : "#$key", ENT_SUBSTITUTE, 'UTF-8') ?>
    -
    - - () - - - - -   —   () - -

    - - - -
    - -
    - -
  2. - - -
- -
- - -
- - - -

$

- - - - - - - - - - $value) : ?> - - - - - - -
KeyValue
- - - - ' . print_r($value, true) ?> - -
- - - - - - -

Constants

- - - - - - - - - - $value) : ?> - - - - - - -
KeyValue
- - - - ' . print_r($value, true) ?> - -
- -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Pathuri ?>
HTTP MethodgetMethod(true) ?>
IP AddressgetIPAddress() ?>
Is AJAX Request?isAJAX() ? 'yes' : 'no' ?>
Is CLI Request?isCLI() ? 'yes' : 'no' ?>
Is Secure Request?isSecure() ? 'yes' : 'no' ?>
User AgentgetUserAgent()->getAgentString() ?>
- - - - - - - - -

$

- - - - - - - - - - $value) : ?> - - - - - - -
KeyValue
- - - - ' . print_r($value, true) ?> - -
- - - - - -
- No $_GET, $_POST, or $_COOKIE Information to show. -
- - - - getHeaders(); ?> - - -

Headers

- - - - - - - - - - - - - - - - - - - - -
HeaderValue
getName(), 'html') ?>getValueLine(), 'html') ?>
- - -
- - - setStatusCode(http_response_code()); - ?> -
- - - - - -
Response StatusgetStatusCode() . ' - ' . $response->getReason() ?>
- - getHeaders(); ?> - - - -

Headers

- - - - - - - - - - $value) : ?> - - - - - - -
HeaderValue
getHeaderLine($name), 'html') ?>
- - -
- - -
- - -
    - -
  1. - -
-
- - -
- - - - - - - - - - - - - - - - -
Memory Usage
Peak Memory Usage:
Memory Limit:
- -
- -
- -
- - - - - diff --git a/vendor/codeigniter4/framework/app/Views/errors/html/production.php b/vendor/codeigniter4/framework/app/Views/errors/html/production.php deleted file mode 100644 index cca49c2..0000000 --- a/vendor/codeigniter4/framework/app/Views/errors/html/production.php +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - Whoops! - - - - - -
- -

Whoops!

- -

We seem to have hit a snag. Please try again later...

- -
- - - - diff --git a/vendor/codeigniter4/framework/app/Views/welcome_message.php b/vendor/codeigniter4/framework/app/Views/welcome_message.php deleted file mode 100644 index f2a7389..0000000 --- a/vendor/codeigniter4/framework/app/Views/welcome_message.php +++ /dev/null @@ -1,324 +0,0 @@ - - - - - Welcome to CodeIgniter 4! - - - - - - - - - - - -
- - - -
- -

Welcome to CodeIgniter

- -

The small framework with powerful features

- -
- -
- - - -
- -

About this page

- -

The page you are looking at is being generated dynamically by CodeIgniter.

- -

If you would like to edit this page you will find it located at:

- -
app/Views/welcome_message.php
- -

The corresponding controller for this page can be found at:

- -
app/Controllers/Home.php
- -
- -
- -
- -

Go further

- -

- - Learn -

- -

The User Guide contains an introduction, tutorial, a number of "how to" - guides, and then reference documentation for the components that make up - the framework. Check the User Guide !

- -

- - Discuss -

- -

CodeIgniter is a community-developed open source project, with several - venues for the community members to gather and exchange ideas. View all - the threads on CodeIgniter's forum, or chat on Slack !

- -

- - Contribute -

- -

CodeIgniter is a community driven project and accepts contributions - of code and documentation from the community. Why not - - join us ?

- -
- -
- - - -
-
- -

Page rendered in {elapsed_time} seconds

- -

Environment:

- -
- -
- -

© CodeIgniter Foundation. CodeIgniter is open source project released under the MIT - open source licence.

- -
- -
- - - - - - - - - diff --git a/vendor/codeigniter4/framework/app/index.html b/vendor/codeigniter4/framework/app/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor/codeigniter4/framework/app/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - diff --git a/vendor/codeigniter4/framework/composer.json b/vendor/codeigniter4/framework/composer.json deleted file mode 100644 index 3f3b9d5..0000000 --- a/vendor/codeigniter4/framework/composer.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "codeigniter4/framework", - "type": "project", - "description": "The CodeIgniter framework v4", - "homepage": "https://codeigniter.com", - "license": "MIT", - "require": { - "php": ">=7.2", - "ext-curl": "*", - "ext-intl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "kint-php/kint": "^3.3", - "laminas/laminas-escaper": "^2.6", - "psr/log": "^1.1" - }, - "require-dev": { - "codeigniter4/codeigniter4-standard": "^1.0", - "fzaninotto/faker": "^1.9@dev", - "mikey179/vfsstream": "1.6.*", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "squizlabs/php_codesniffer": "^3.3" - }, - "autoload": { - "psr-4": { - "CodeIgniter\\": "system/" - } - }, - "scripts": { - "post-update-cmd": [ - "@composer dump-autoload", - "CodeIgniter\\ComposerScripts::postUpdate" - ], - "test": "phpunit" - }, - "support": { - "forum": "http://forum.codeigniter.com/", - "source": "https://github.com/codeigniter4/CodeIgniter4", - "slack": "https://codeigniterchat.slack.com" - } -} diff --git a/vendor/codeigniter4/framework/env b/vendor/codeigniter4/framework/env deleted file mode 100644 index 11f4161..0000000 --- a/vendor/codeigniter4/framework/env +++ /dev/null @@ -1,101 +0,0 @@ -#-------------------------------------------------------------------- -# Example Environment Configuration file -# -# This file can be used as a starting point for your own -# custom .env files, and contains most of the possible settings -# available in a default install. -# -# By default, all of the settings are commented out. If you want -# to override the setting, you must un-comment it by removing the '#' -# at the beginning of the line. -#-------------------------------------------------------------------- - -#-------------------------------------------------------------------- -# ENVIRONMENT -#-------------------------------------------------------------------- - -# CI_ENVIRONMENT = production - -#-------------------------------------------------------------------- -# APP -#-------------------------------------------------------------------- - -# app.baseURL = '' -# app.forceGlobalSecureRequests = false - -# app.sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler' -# app.sessionCookieName = 'ci_session' -# app.sessionSavePath = NULL -# app.sessionMatchIP = false -# app.sessionTimeToUpdate = 300 -# app.sessionRegenerateDestroy = false - -# app.cookiePrefix = '' -# app.cookieDomain = '' -# app.cookiePath = '/' -# app.cookieSecure = false -# app.cookieHTTPOnly = false - -# app.CSRFProtection = false -# app.CSRFTokenName = 'csrf_test_name' -# app.CSRFCookieName = 'csrf_cookie_name' -# app.CSRFExpire = 7200 -# app.CSRFRegenerate = true -# app.CSRFExcludeURIs = [] - -# app.CSPEnabled = false - -#-------------------------------------------------------------------- -# DATABASE -#-------------------------------------------------------------------- - -# database.default.hostname = localhost -# database.default.database = ci4 -# database.default.username = root -# database.default.password = root -# database.default.DBDriver = MySQLi - -# database.tests.hostname = localhost -# database.tests.database = ci4 -# database.tests.username = root -# database.tests.password = root -# database.tests.DBDriver = MySQLi - -#-------------------------------------------------------------------- -# CONTENT SECURITY POLICY -#-------------------------------------------------------------------- - -# contentsecuritypolicy.reportOnly = false -# contentsecuritypolicy.defaultSrc = 'none' -# contentsecuritypolicy.scriptSrc = 'self' -# contentsecuritypolicy.styleSrc = 'self' -# contentsecuritypolicy.imageSrc = 'self' -# contentsecuritypolicy.base_uri = null -# contentsecuritypolicy.childSrc = null -# contentsecuritypolicy.connectSrc = 'self' -# contentsecuritypolicy.fontSrc = null -# contentsecuritypolicy.formAction = null -# contentsecuritypolicy.frameAncestors = null -# contentsecuritypolicy.mediaSrc = null -# contentsecuritypolicy.objectSrc = null -# contentsecuritypolicy.pluginTypes = null -# contentsecuritypolicy.reportURI = null -# contentsecuritypolicy.sandbox = false -# contentsecuritypolicy.upgradeInsecureRequests = false - -#-------------------------------------------------------------------- -# ENCRYPTION -#-------------------------------------------------------------------- - -# encryption.key = -# encryption.driver = OpenSSL - -#-------------------------------------------------------------------- -# HONEYPOT -#-------------------------------------------------------------------- - -# honeypot.hidden = 'true' -# honeypot.label = 'Fill This Field' -# honeypot.name = 'honeypot' -# honeypot.template = '' -# honeypot.container = '
{template}
' diff --git a/vendor/codeigniter4/framework/license.txt b/vendor/codeigniter4/framework/license.txt deleted file mode 100644 index 2fb1bdd..0000000 --- a/vendor/codeigniter4/framework/license.txt +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2019 British Columbia Institute of Technology -Copyright (c) 2019-2020 CodeIgniter Foundation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/codeigniter4/framework/phpunit.xml.dist b/vendor/codeigniter4/framework/phpunit.xml.dist deleted file mode 100644 index 88aca1f..0000000 --- a/vendor/codeigniter4/framework/phpunit.xml.dist +++ /dev/null @@ -1,60 +0,0 @@ - - - - - ./tests - - - - - - ./app - - ./app/Views - ./app/Config/Routes.php - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/codeigniter4/framework/public/.htaccess b/vendor/codeigniter4/framework/public/.htaccess deleted file mode 100644 index 02026a3..0000000 --- a/vendor/codeigniter4/framework/public/.htaccess +++ /dev/null @@ -1,48 +0,0 @@ -# Disable directory browsing -Options All -Indexes - -# ---------------------------------------------------------------------- -# Rewrite engine -# ---------------------------------------------------------------------- - -# Turning on the rewrite engine is necessary for the following rules and features. -# FollowSymLinks must be enabled for this to work. - - Options +FollowSymlinks - RewriteEngine On - - # If you installed CodeIgniter in a subfolder, you will need to - # change the following line to match the subfolder you need. - # http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase - # RewriteBase / - - # Redirect Trailing Slashes... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.*)/$ /$1 [L,R=301] - - # Rewrite "www.example.com -> example.com" - RewriteCond %{HTTPS} !=on - RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] - RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L] - - # Checks to see if the user is attempting to access a valid file, - # such as an image or css document, if this isn't true it sends the - # request to the front controller, index.php - RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^([\s\S]*)$ index.php/$1 [L,NC,QSA] - - # Ensure Authorization header is passed along - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - - - # If we don't have mod_rewrite installed, all 404's - # can be sent to index.php, and everything works as normal. - ErrorDocument 404 index.php - - -# Disable server signature start - ServerSignature Off -# Disable server signature end diff --git a/vendor/codeigniter4/framework/public/favicon.ico b/vendor/codeigniter4/framework/public/favicon.ico deleted file mode 100644 index 7ecfce2..0000000 Binary files a/vendor/codeigniter4/framework/public/favicon.ico and /dev/null differ diff --git a/vendor/codeigniter4/framework/public/index.php b/vendor/codeigniter4/framework/public/index.php deleted file mode 100644 index 3eaa592..0000000 --- a/vendor/codeigniter4/framework/public/index.php +++ /dev/null @@ -1,45 +0,0 @@ -systemDirectory, '/ ') . '/bootstrap.php'; - -/* - *--------------------------------------------------------------- - * LAUNCH THE APPLICATION - *--------------------------------------------------------------- - * Now that everything is setup, it's time to actually fire - * up the engines and make this app do its thang. - */ -$app->run(); diff --git a/vendor/codeigniter4/framework/public/robots.txt b/vendor/codeigniter4/framework/public/robots.txt deleted file mode 100644 index 9e60f97..0000000 --- a/vendor/codeigniter4/framework/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: diff --git a/vendor/codeigniter4/framework/spark b/vendor/codeigniter4/framework/spark deleted file mode 100644 index 0a0908d..0000000 --- a/vendor/codeigniter4/framework/spark +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env php -systemDirectory, '/ ') . '/bootstrap.php'; - -// Grab our Console -$console = new \CodeIgniter\CLI\Console($app); - -// We want errors to be shown when using it from the CLI. -error_reporting(-1); -ini_set('display_errors', 1); - -// Show basic information before we do anything else. -$console->showHeader(); - -// fire off the command in the main framework. -$response = $console->run(); -if ($response->getStatusCode() >= 300) -{ - exit($response->getStatusCode()); -} diff --git a/vendor/codeigniter4/framework/system/.htaccess b/vendor/codeigniter4/framework/system/.htaccess deleted file mode 100644 index 3462048..0000000 --- a/vendor/codeigniter4/framework/system/.htaccess +++ /dev/null @@ -1,6 +0,0 @@ - - Require all denied - - - Deny from all - diff --git a/vendor/codeigniter4/framework/system/API/ResponseTrait.php b/vendor/codeigniter4/framework/system/API/ResponseTrait.php deleted file mode 100644 index 49248eb..0000000 --- a/vendor/codeigniter4/framework/system/API/ResponseTrait.php +++ /dev/null @@ -1,430 +0,0 @@ - 201, - 'deleted' => 200, - 'updated' => 200, - 'no_content' => 204, - 'invalid_request' => 400, - 'unsupported_response_type' => 400, - 'invalid_scope' => 400, - 'temporarily_unavailable' => 400, - 'invalid_grant' => 400, - 'invalid_credentials' => 400, - 'invalid_refresh' => 400, - 'no_data' => 400, - 'invalid_data' => 400, - 'access_denied' => 401, - 'unauthorized' => 401, - 'invalid_client' => 401, - 'forbidden' => 403, - 'resource_not_found' => 404, - 'not_acceptable' => 406, - 'resource_exists' => 409, - 'conflict' => 409, - 'resource_gone' => 410, - 'payload_too_large' => 413, - 'unsupported_media_type' => 415, - 'too_many_requests' => 429, - 'server_error' => 500, - 'unsupported_grant_type' => 501, - 'not_implemented' => 501, - ]; - - /** - * How to format the response data. - * Either 'json' or 'xml'. If blank will be - * determine through content negotiation. - * - * @var string - */ - protected $format = 'json'; - - //-------------------------------------------------------------------- - - /** - * Provides a single, simple method to return an API response, formatted - * to match the requested format, with proper content-type and status code. - * - * @param array|string|null $data - * @param integer $status - * @param string $message - * - * @return mixed - */ - public function respond($data = null, int $status = null, string $message = '') - { - // If data is null and status code not provided, exit and bail - if ($data === null && $status === null) - { - $status = 404; - - // Create the output var here in case of $this->response([]); - $output = null; - } // If data is null but status provided, keep the output empty. - elseif ($data === null && is_numeric($status)) - { - $output = null; - } - else - { - $status = empty($status) ? 200 : $status; - $output = $this->format($data); - } - - return $this->response->setBody($output) - ->setStatusCode($status, $message); - } - - //-------------------------------------------------------------------- - - /** - * Used for generic failures that no custom methods exist for. - * - * @param string|array $messages - * @param integer|null $status HTTP status code - * @param string|null $code Custom, API-specific, error code - * @param string $customMessage - * - * @return mixed - */ - public function fail($messages, int $status = 400, string $code = null, string $customMessage = '') - { - if (! is_array($messages)) - { - $messages = ['error' => $messages]; - } - - $response = [ - 'status' => $status, - 'error' => $code === null ? $status : $code, - 'messages' => $messages, - ]; - - return $this->respond($response, $status, $customMessage); - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // Response Helpers - //-------------------------------------------------------------------- - - /** - * Used after successfully creating a new resource. - * - * @param mixed $data Data. - * @param string $message Message. - * - * @return mixed - */ - public function respondCreated($data = null, string $message = '') - { - return $this->respond($data, $this->codes['created'], $message); - } - - //-------------------------------------------------------------------- - - /** - * Used after a resource has been successfully deleted. - * - * @param mixed $data Data. - * @param string $message Message. - * - * @return mixed - */ - public function respondDeleted($data = null, string $message = '') - { - return $this->respond($data, $this->codes['deleted'], $message); - } - - /** - * Used after a resource has been successfully updated. - * - * @param mixed $data Data. - * @param string $message Message. - * - * @return mixed - */ - public function respondUpdated($data = null, string $message = '') - { - return $this->respond($data, $this->codes['updated'], $message); - } - - //-------------------------------------------------------------------- - - /** - * Used after a command has been successfully executed but there is no - * meaningful reply to send back to the client. - * - * @param string $message Message. - * - * @return mixed - */ - public function respondNoContent(string $message = 'No Content') - { - return $this->respond(null, $this->codes['no_content'], $message); - } - - //-------------------------------------------------------------------- - - /** - * Used when the client is either didn't send authorization information, - * or had bad authorization credentials. User is encouraged to try again - * with the proper information. - * - * @param string $description - * @param string $code - * @param string $message - * - * @return mixed - */ - public function failUnauthorized(string $description = 'Unauthorized', string $code = null, string $message = '') - { - return $this->fail($description, $this->codes['unauthorized'], $code, $message); - } - - //-------------------------------------------------------------------- - - /** - * Used when access is always denied to this resource and no amount - * of trying again will help. - * - * @param string $description - * @param string $code - * @param string $message - * - * @return mixed - */ - public function failForbidden(string $description = 'Forbidden', string $code = null, string $message = '') - { - return $this->fail($description, $this->codes['forbidden'], $code, $message); - } - - //-------------------------------------------------------------------- - - /** - * Used when a specified resource cannot be found. - * - * @param string $description - * @param string $code - * @param string $message - * - * @return mixed - */ - public function failNotFound(string $description = 'Not Found', string $code = null, string $message = '') - { - return $this->fail($description, $this->codes['resource_not_found'], $code, $message); - } - - //-------------------------------------------------------------------- - - /** - * Used when the data provided by the client cannot be validated. - * - * @param string $description - * @param string $code - * @param string $message - * - * @return mixed - */ - public function failValidationError(string $description = 'Bad Request', string $code = null, string $message = '') - { - return $this->fail($description, $this->codes['invalid_data'], $code, $message); - } - - //-------------------------------------------------------------------- - - /** - * Use when trying to create a new resource and it already exists. - * - * @param string $description - * @param string $code - * @param string $message - * - * @return mixed - */ - public function failResourceExists(string $description = 'Conflict', string $code = null, string $message = '') - { - return $this->fail($description, $this->codes['resource_exists'], $code, $message); - } - - //-------------------------------------------------------------------- - - /** - * Use when a resource was previously deleted. This is different than - * Not Found, because here we know the data previously existed, but is now gone, - * where Not Found means we simply cannot find any information about it. - * - * @param string $description - * @param string $code - * @param string $message - * - * @return mixed - */ - public function failResourceGone(string $description = 'Gone', string $code = null, string $message = '') - { - return $this->fail($description, $this->codes['resource_gone'], $code, $message); - } - - //-------------------------------------------------------------------- - - /** - * Used when the user has made too many requests for the resource recently. - * - * @param string $description - * @param string $code - * @param string $message - * - * @return mixed - */ - public function failTooManyRequests(string $description = 'Too Many Requests', string $code = null, string $message = '') - { - return $this->fail($description, $this->codes['too_many_requests'], $code, $message); - } - - //-------------------------------------------------------------------- - - /** - * Used when there is a server error. - * - * @param string $description The error message to show the user. - * @param string|null $code A custom, API-specific, error code. - * @param string $message A custom "reason" message to return. - * - * @return Response The value of the Response's send() method. - */ - public function failServerError(string $description = 'Internal Server Error', string $code = null, string $message = ''): Response - { - return $this->fail($description, $this->codes['server_error'], $code, $message); - } - - //-------------------------------------------------------------------- - // Utility Methods - //-------------------------------------------------------------------- - - /** - * Handles formatting a response. Currently makes some heavy assumptions - * and needs updating! :) - * - * @param string|array|null $data - * - * @return string|null - */ - protected function format($data = null) - { - // If the data is a string, there's not much we can do to it... - if (is_string($data)) - { - // The content type should be text/... and not application/... - $contentType = $this->response->getHeaderLine('Content-Type'); - $contentType = str_replace('application/json', 'text/html', $contentType); - $contentType = str_replace('application/', 'text/', $contentType); - $this->response->setContentType($contentType); - - return $data; - } - - $config = new Format(); - $format = "application/$this->format"; - - // Determine correct response type through content negotiation if not explicitly declared - if (empty($this->format) || ! in_array($this->format, ['json', 'xml'])) - { - $format = $this->request->negotiate('media', $config->supportedResponseFormats, false); - } - - $this->response->setContentType($format); - - // if we don't have a formatter, make one - if (! isset($this->formatter)) - { - // if no formatter, use the default - $this->formatter = $config->getFormatter($format); - } - - if ($format !== 'application/json') - { - // Recursively convert objects into associative arrays - // Conversion not required for JSONFormatter - $data = json_decode(json_encode($data), true); - } - - return $this->formatter->format($data); - } - - /** - * Sets the format the response should be in. - * - * @param string $format - * - * @return $this - */ - public function setResponseFormat(string $format = null) - { - $this->format = strtolower($format); - - return $this; - } -} diff --git a/vendor/codeigniter4/framework/system/Autoloader/Autoloader.php b/vendor/codeigniter4/framework/system/Autoloader/Autoloader.php deleted file mode 100644 index fa5c9a2..0000000 --- a/vendor/codeigniter4/framework/system/Autoloader/Autoloader.php +++ /dev/null @@ -1,435 +0,0 @@ - [ - * 'Foo\Bar' => '/path/to/packages/foo-bar' - * ], - * 'classmap' => [ - * 'MyClass' => '/path/to/class/file.php' - * ] - * ]; - * - * Example: - * - * register(); - * - * @package CodeIgniter\Autoloader - */ -class Autoloader -{ - /** - * Stores namespaces as key, and path as values. - * - * @var array - */ - protected $prefixes = []; - - /** - * Stores class name as key, and path as values. - * - * @var array - */ - protected $classmap = []; - - //-------------------------------------------------------------------- - - /** - * Reads in the configuration array (described above) and stores - * the valid parts that we'll need. - * - * @param \Config\Autoload $config - * @param \Config\Modules $moduleConfig - * - * @return $this - */ - public function initialize(\Config\Autoload $config, \Config\Modules $moduleConfig) - { - // We have to have one or the other, though we don't enforce the need - // to have both present in order to work. - if (empty($config->psr4) && empty($config->classmap)) - { - throw new \InvalidArgumentException('Config array must contain either the \'psr4\' key or the \'classmap\' key.'); - } - - if (isset($config->psr4)) - { - $this->addNamespace($config->psr4); - } - - if (isset($config->classmap)) - { - $this->classmap = $config->classmap; - } - - // Should we load through Composer's namespaces, also? - if ($moduleConfig->discoverInComposer) - { - $this->discoverComposerNamespaces(); - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Register the loader with the SPL autoloader stack. - */ - public function register() - { - // Since the default file extensions are searched - // in order of .inc then .php, but we always use .php, - // put the .php extension first to eek out a bit - // better performance. - // http://php.net/manual/en/function.spl-autoload.php#78053 - spl_autoload_extensions('.php,.inc'); - - // Prepend the PSR4 autoloader for maximum performance. - spl_autoload_register([$this, 'loadClass'], true, true); - - // Now prepend another loader for the files in our class map. - $config = is_array($this->classmap) ? $this->classmap : []; - - spl_autoload_register(function ($class) use ($config) { - if (empty($config[$class])) - { - return false; - } - - include_once $config[$class]; - }, true, // Throw exception - true // Prepend - ); - } - - //-------------------------------------------------------------------- - - /** - * Registers namespaces with the autoloader. - * - * @param array|string $namespace - * @param string $path - * - * @return Autoloader - */ - public function addNamespace($namespace, string $path = null) - { - if (is_array($namespace)) - { - foreach ($namespace as $prefix => $path) - { - $prefix = trim($prefix, '\\'); - - if (is_array($path)) - { - foreach ($path as $dir) - { - $this->prefixes[$prefix][] = rtrim($dir, '/') . '/'; - } - - continue; - } - - $this->prefixes[$prefix][] = rtrim($path, '/') . '/'; - } - } - else - { - $this->prefixes[trim($namespace, '\\')][] = rtrim($path, '/') . '/'; - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Get namespaces with prefixes as keys and paths as values. - * - * If a prefix param is set, returns only paths to the given prefix. - * - * @var string|null $prefix - * - * @return array - */ - public function getNamespace(string $prefix = null) - { - if ($prefix === null) - { - return $this->prefixes; - } - - return $this->prefixes[trim($prefix, '\\')] ?? []; - } - - //-------------------------------------------------------------------- - - /** - * Removes a single namespace from the psr4 settings. - * - * @param string $namespace - * - * @return Autoloader - */ - public function removeNamespace(string $namespace) - { - unset($this->prefixes[trim($namespace, '\\')]); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Loads the class file for a given class name. - * - * @param string $class The fully qualified class name. - * - * @return string|false The mapped file on success, or boolean false - * on failure. - */ - public function loadClass(string $class) - { - $class = trim($class, '\\'); - $class = str_ireplace('.php', '', $class); - - $mapped_file = $this->loadInNamespace($class); - - // Nothing? One last chance by looking - // in common CodeIgniter folders. - if (! $mapped_file) - { - $mapped_file = $this->loadLegacy($class); - } - - return $mapped_file; - } - - //-------------------------------------------------------------------- - - /** - * Loads the class file for a given class name. - * - * @param string $class The fully-qualified class name - * - * @return string|false The mapped file name on success, or boolean false on fail - */ - protected function loadInNamespace(string $class) - { - if (strpos($class, '\\') === false) - { - return false; - } - - foreach ($this->prefixes as $namespace => $directories) - { - foreach ($directories as $directory) - { - $directory = rtrim($directory, '/'); - - if (strpos($class, $namespace) === 0) - { - $filePath = $directory . str_replace('\\', '/', - substr($class, strlen($namespace))) . '.php'; - $filename = $this->requireFile($filePath); - - if ($filename) - { - return $filename; - } - } - } - } - - // never found a mapped file - return false; - } - - //-------------------------------------------------------------------- - - /** - * Attempts to load the class from common locations in previous - * version of CodeIgniter, namely 'app/Libraries', and - * 'app/Models'. - * - * @param string $class The class name. This typically should NOT have a namespace. - * - * @return mixed The mapped file name on success, or boolean false on failure - */ - protected function loadLegacy(string $class) - { - // If there is a namespace on this class, then - // we cannot load it from traditional locations. - if (strpos($class, '\\') !== false) - { - return false; - } - - $paths = [ - APPPATH . 'Controllers/', - APPPATH . 'Libraries/', - APPPATH . 'Models/', - ]; - - $class = str_replace('\\', '/', $class) . '.php'; - - foreach ($paths as $path) - { - if ($file = $this->requireFile($path . $class)) - { - return $file; - } - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * A central way to require a file is loaded. Split out primarily - * for testing purposes. - * - * @param string $file - * - * @return string|false The filename on success, false if the file is not loaded - */ - protected function requireFile(string $file) - { - $file = $this->sanitizeFilename($file); - - if (is_file($file)) - { - require_once $file; - - return $file; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Sanitizes a filename, replacing spaces with dashes. - * - * Removes special characters that are illegal in filenames on certain - * operating systems and special characters requiring special escaping - * to manipulate at the command line. Replaces spaces and consecutive - * dashes with a single dash. Trim period, dash and underscore from beginning - * and end of filename. - * - * @param string $filename - * - * @return string The sanitized filename - */ - public function sanitizeFilename(string $filename): string - { - // Only allow characters deemed safe for POSIX portable filenames. - // Plus the forward slash for directory separators since this might - // be a path. - // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_278 - // Modified to allow backslash and colons for on Windows machines. - $filename = preg_replace('/[^0-9\p{L}\s\/\-\_\.\:\\\\]/u', '', $filename); - - // Clean up our filename edges. - $filename = trim($filename, '.-_'); - - return $filename; - } - - //-------------------------------------------------------------------- - - /** - * Locates all PSR4 compatible namespaces from Composer. - */ - protected function discoverComposerNamespaces() - { - if (! is_file(COMPOSER_PATH)) - { - return false; - } - - $composer = include COMPOSER_PATH; - - $paths = $composer->getPrefixesPsr4(); - unset($composer); - - // Get rid of CodeIgniter so we don't have duplicates - if (isset($paths['CodeIgniter\\'])) - { - unset($paths['CodeIgniter\\']); - } - - // Composer stores namespaces with trailing slash. We don't. - $newPaths = []; - foreach ($paths as $key => $value) - { - $newPaths[rtrim($key, '\\ ')] = $value; - } - - $this->prefixes = array_merge($this->prefixes, $newPaths); - } -} diff --git a/vendor/codeigniter4/framework/system/Autoloader/FileLocator.php b/vendor/codeigniter4/framework/system/Autoloader/FileLocator.php deleted file mode 100644 index c9d2b78..0000000 --- a/vendor/codeigniter4/framework/system/Autoloader/FileLocator.php +++ /dev/null @@ -1,505 +0,0 @@ -autoloader = $autoloader; - } - - //-------------------------------------------------------------------- - - /** - * Attempts to locate a file by examining the name for a namespace - * and looking through the PSR-4 namespaced files that we know about. - * - * @param string $file The namespaced file to locate - * @param string $folder The folder within the namespace that we should look for the file. - * @param string $ext The file extension the file should have. - * - * @return string|false The path to the file, or false if not found. - */ - public function locateFile(string $file, string $folder = null, string $ext = 'php') - { - $file = $this->ensureExt($file, $ext); - - // Clears the folder name if it is at the beginning of the filename - if (! empty($folder) && ($pos = strpos($file, $folder)) === 0) - { - $file = substr($file, strlen($folder . '/')); - } - - // Is not namespaced? Try the application folder. - if (strpos($file, '\\') === false) - { - return $this->legacyLocate($file, $folder); - } - - // Standardize slashes to handle nested directories. - $file = strtr($file, '/', '\\'); - - $segments = explode('\\', $file); - - // The first segment will be empty if a slash started the filename. - if (empty($segments[0])) - { - unset($segments[0]); - } - - $paths = []; - $prefix = ''; - $filename = ''; - - // Namespaces always comes with arrays of paths - $namespaces = $this->autoloader->getNamespace(); - - while (! empty($segments)) - { - $prefix .= empty($prefix) ? array_shift($segments) : '\\' . array_shift($segments); - - if (empty($namespaces[$prefix])) - { - continue; - } - $paths = $namespaces[$prefix]; - - $filename = implode('/', $segments); - break; - } - - // if no namespaces matched then quit - if (empty($paths)) - { - return false; - } - - // Check each path in the namespace - foreach ($paths as $path) - { - // Ensure trailing slash - $path = rtrim($path, '/') . '/'; - - // If we have a folder name, then the calling function - // expects this file to be within that folder, like 'Views', - // or 'libraries'. - if (! empty($folder) && strpos($path . $filename, '/' . $folder . '/') === false) - { - $path .= trim($folder, '/') . '/'; - } - - $path .= $filename; - if (is_file($path)) - { - return $path; - } - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Examines a file and returns the fully qualified domain name. - * - * @param string $file - * - * @return string - */ - public function getClassname(string $file) : string - { - $php = file_get_contents($file); - $tokens = token_get_all($php); - $dlm = false; - $namespace = ''; - $class_name = ''; - - foreach ($tokens as $i => $token) - { - if ($i < 2) - { - continue; - } - - if ((isset($tokens[$i - 2][1]) && ($tokens[$i - 2][1] === 'phpnamespace' || $tokens[$i - 2][1] === 'namespace')) || ($dlm && $tokens[$i - 1][0] === T_NS_SEPARATOR && $token[0] === T_STRING)) - { - if (! $dlm) - { - $namespace = 0; - } - if (isset($token[1])) - { - $namespace = $namespace ? $namespace . '\\' . $token[1] : $token[1]; - $dlm = true; - } - } - elseif ($dlm && ($token[0] !== T_NS_SEPARATOR) && ($token[0] !== T_STRING)) - { - $dlm = false; - } - if (($tokens[$i - 2][0] === T_CLASS || (isset($tokens[$i - 2][1]) && $tokens[$i - 2][1] === 'phpclass')) - && $tokens[$i - 1][0] === T_WHITESPACE - && $token[0] === T_STRING) - { - $class_name = $token[1]; - break; - } - } - - if (empty( $class_name )) - { - return ''; - } - - return $namespace . '\\' . $class_name; - } - - //-------------------------------------------------------------------- - - /** - * Searches through all of the defined namespaces looking for a file. - * Returns an array of all found locations for the defined file. - * - * Example: - * - * $locator->search('Config/Routes.php'); - * // Assuming PSR4 namespaces include foo and bar, might return: - * [ - * 'app/Modules/foo/Config/Routes.php', - * 'app/Modules/bar/Config/Routes.php', - * ] - * - * @param string $path - * @param string $ext - * @param boolean $prioritizeApp - * - * @return array - */ - public function search(string $path, string $ext = 'php', bool $prioritizeApp = true): array - { - $path = $this->ensureExt($path, $ext); - - $foundPaths = []; - $appPaths = []; - - foreach ($this->getNamespaces() as $namespace) - { - if (isset($namespace['path']) && is_file($namespace['path'] . $path)) - { - $fullPath = $namespace['path'] . $path; - if ($prioritizeApp) - { - $foundPaths[] = $fullPath; - } - else - { - if (strpos($fullPath, APPPATH) === 0) - { - $appPaths[] = $fullPath; - } - else - { - $foundPaths[] = $fullPath; - } - } - } - } - - if (! $prioritizeApp && ! empty($appPaths)) - { - $foundPaths = array_merge($foundPaths, $appPaths); - } - - // Remove any duplicates - $foundPaths = array_unique($foundPaths); - - return $foundPaths; - } - - //-------------------------------------------------------------------- - - /** - * Ensures a extension is at the end of a filename - * - * @param string $path - * @param string $ext - * - * @return string - */ - protected function ensureExt(string $path, string $ext): string - { - if ($ext) - { - $ext = '.' . $ext; - - if (substr($path, -strlen($ext)) !== $ext) - { - $path .= $ext; - } - } - - return $path; - } - - //-------------------------------------------------------------------- - - /** - * Return the namespace mappings we know about. - * - * @return array|string - */ - protected function getNamespaces() - { - $namespaces = []; - - // Save system for last - $system = []; - - foreach ($this->autoloader->getNamespace() as $prefix => $paths) - { - foreach ($paths as $path) - { - if ($prefix === 'CodeIgniter') - { - $system = [ - 'prefix' => $prefix, - 'path' => rtrim($path, '\\/') . DIRECTORY_SEPARATOR, - ]; - - continue; - } - - $namespaces[] = [ - 'prefix' => $prefix, - 'path' => rtrim($path, '\\/') . DIRECTORY_SEPARATOR, - ]; - } - } - - $namespaces[] = $system; - - return $namespaces; - } - - //-------------------------------------------------------------------- - - /** - * Find the qualified name of a file according to - * the namespace of the first matched namespace path. - * - * @param string $path - * - * @return string|false The qualified name or false if the path is not found - */ - public function findQualifiedNameFromPath(string $path) - { - $path = realpath($path); - - if (! $path) - { - return false; - } - - foreach ($this->getNamespaces() as $namespace) - { - $namespace['path'] = realpath($namespace['path']); - - if (empty($namespace['path'])) - { - continue; - } - - if (mb_strpos($path, $namespace['path']) === 0) - { - $className = '\\' . $namespace['prefix'] . '\\' . - ltrim(str_replace('/', '\\', mb_substr( - $path, mb_strlen($namespace['path'])) - ), '\\'); - // Remove the file extension (.php) - $className = mb_substr($className, 0, -4); - - // Check if this exists - if (class_exists($className)) - { - return $className; - } - } - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Scans the defined namespaces, returning a list of all files - * that are contained within the subpath specified by $path. - * - * @param string $path - * - * @return array - */ - public function listFiles(string $path): array - { - if (empty($path)) - { - return []; - } - - $files = []; - helper('filesystem'); - - foreach ($this->getNamespaces() as $namespace) - { - $fullPath = realpath($namespace['path'] . $path); - - if (! is_dir($fullPath)) - { - continue; - } - - $tempFiles = get_filenames($fullPath, true); - - if (! empty($tempFiles)) - { - $files = array_merge($files, $tempFiles); - } - } - - return $files; - } - - //-------------------------------------------------------------------- - - /** - * Scans the provided namespace, returning a list of all files - * that are contained within the subpath specified by $path. - * - * @param string $prefix - * @param string $path - * - * @return array - */ - public function listNamespaceFiles(string $prefix, string $path): array - { - if (empty($path) || empty($prefix)) - { - return []; - } - - $files = []; - helper('filesystem'); - - // autoloader->getNamespace($prefix) returns an array of paths for that namespace - foreach ($this->autoloader->getNamespace($prefix) as $namespacePath) - { - $fullPath = realpath(rtrim($namespacePath, '/') . '/' . $path); - - if (! is_dir($fullPath)) - { - continue; - } - - $tempFiles = get_filenames($fullPath, true); - - if (! empty($tempFiles)) - { - $files = array_merge($files, $tempFiles); - } - } - - return $files; - } - - //-------------------------------------------------------------------- - - /** - * Checks the application folder to see if the file can be found. - * Only for use with filenames that DO NOT include namespacing. - * - * @param string $file - * @param string|null $folder - * - * @return string|false The path to the file, or false if not found. - */ - protected function legacyLocate(string $file, string $folder = null) - { - $paths = [ - APPPATH, - SYSTEMPATH, - ]; - - foreach ($paths as $path) - { - $path .= empty($folder) ? $file : $folder . '/' . $file; - - if (is_file($path)) - { - return $path; - } - } - - return false; - } -} diff --git a/vendor/codeigniter4/framework/system/CLI/BaseCommand.php b/vendor/codeigniter4/framework/system/CLI/BaseCommand.php deleted file mode 100644 index 024daf1..0000000 --- a/vendor/codeigniter4/framework/system/CLI/BaseCommand.php +++ /dev/null @@ -1,269 +0,0 @@ -logger = $logger; - $this->commands = $commands; - } - - //-------------------------------------------------------------------- - - /** - * Actually execute a command. - * This has to be over-ridden in any concrete implementation. - * - * @param array $params - */ - abstract public function run(array $params); - - //-------------------------------------------------------------------- - - /** - * Can be used by a command to run other commands. - * - * @param string $command - * @param array $params - * - * @return mixed - * @throws \ReflectionException - */ - protected function call(string $command, array $params = []) - { - // The CommandRunner will grab the first element - // for the command name. - array_unshift($params, $command); - - return $this->commands->run($command, $params); - } - - //-------------------------------------------------------------------- - - /** - * A simple method to display an error with line/file, - * in child commands. - * - * @param \Exception $e - */ - protected function showError(\Exception $e) - { - CLI::newLine(); - CLI::error($e->getMessage()); - CLI::write($e->getFile() . ' - ' . $e->getLine()); - CLI::newLine(); - } - - //-------------------------------------------------------------------- - - /** - * Makes it simple to access our protected properties. - * - * @param string $key - * - * @return mixed - */ - public function __get(string $key) - { - if (isset($this->$key)) - { - return $this->$key; - } - - return null; - } - - //-------------------------------------------------------------------- - - /** - * Makes it simple to check our protected properties. - * - * @param string $key - * - * @return boolean - */ - public function __isset(string $key): bool - { - return isset($this->$key); - } - - //-------------------------------------------------------------------- - - /** - * show Help include (usage,arguments,description,options) - */ - public function showHelp() - { - // 4 spaces instead of tab - $tab = ' '; - CLI::write(lang('CLI.helpDescription'), 'yellow'); - CLI::write($tab . $this->description); - CLI::newLine(); - - CLI::write(lang('CLI.helpUsage'), 'yellow'); - $usage = empty($this->usage) ? $this->name . ' [arguments]' : $this->usage; - CLI::write($tab . $usage); - CLI::newLine(); - - $pad = max($this->getPad($this->options, 6), $this->getPad($this->arguments, 6)); - - if (! empty($this->arguments)) - { - CLI::write(lang('CLI.helpArguments'), 'yellow'); - foreach ($this->arguments as $argument => $description) - { - CLI::write($tab . CLI::color(str_pad($argument, $pad), 'green') . $description, 'yellow'); - } - CLI::newLine(); - } - - if (! empty($this->options)) - { - CLI::write(lang('CLI.helpOptions'), 'yellow'); - foreach ($this->options as $option => $description) - { - CLI::write($tab . CLI::color(str_pad($option, $pad), 'green') . $description, 'yellow'); - } - CLI::newLine(); - } - } - - //-------------------------------------------------------------------- - - /** - * Get pad for $key => $value array output - * - * @param array $array - * @param integer $pad - * - * @return integer - */ - public function getPad(array $array, int $pad): int - { - $max = 0; - foreach ($array as $key => $value) - { - $max = max($max, strlen($key)); - } - return $max + $pad; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/CLI/CLI.php b/vendor/codeigniter4/framework/system/CLI/CLI.php deleted file mode 100644 index 4b6d3d2..0000000 --- a/vendor/codeigniter4/framework/system/CLI/CLI.php +++ /dev/null @@ -1,1169 +0,0 @@ - '0;30', - 'dark_gray' => '1;30', - 'blue' => '0;34', - 'dark_blue' => '0;34', - 'light_blue' => '1;34', - 'green' => '0;32', - 'light_green' => '1;32', - 'cyan' => '0;36', - 'light_cyan' => '1;36', - 'red' => '0;31', - 'light_red' => '1;31', - 'purple' => '0;35', - 'light_purple' => '1;35', - 'yellow' => '0;33', - 'light_yellow' => '1;33', - 'light_gray' => '0;37', - 'white' => '1;37', - ]; - - /** - * Background color list - * - * @var array - */ - protected static $background_colors = [ - 'black' => '40', - 'red' => '41', - 'green' => '42', - 'yellow' => '43', - 'blue' => '44', - 'magenta' => '45', - 'cyan' => '46', - 'light_gray' => '47', - ]; - - /** - * List of array segments. - * - * @var array - */ - protected static $segments = []; - - /** - * @var array - */ - protected static $options = []; - - /** - * Helps track internally whether the last - * output was a "write" or a "print" to - * keep the output clean and as expected. - * - * @var string - */ - protected static $lastWrite; - - /** - * Height of the CLI window - * - * @var integer - */ - protected static $height; - - /** - * Width of the CLI window - * - * @var integer - */ - protected static $width; - - /** - * Whether the current stream supports colored output. - * - * @var boolean - */ - protected static $isColored = false; - - //-------------------------------------------------------------------- - - /** - * Static "constructor". - */ - public static function init() - { - if (is_cli()) - { - // Readline is an extension for PHP that makes interactivity with PHP - // much more bash-like. - // http://www.php.net/manual/en/readline.installation.php - static::$readline_support = extension_loaded('readline'); - - // clear segments & options to keep testing clean - static::$segments = []; - static::$options = []; - - // Check our stream resource for color support - static::$isColored = static::hasColorSupport(STDOUT); - - static::parseCommandLine(); - - static::$initialized = true; - } - else - { - // If the command is being called from a controller - // we need to define STDOUT ourselves - // @codeCoverageIgnoreStart - define('STDOUT', 'php://output'); - // @codeCoverageIgnoreEnd - } - } - - //-------------------------------------------------------------------- - - /** - * Get input from the shell, using readline or the standard STDIN - * - * Named options must be in the following formats: - * php index.php user -v --v -name=John --name=John - * - * @param string $prefix - * @return string - * - * @codeCoverageIgnore - */ - public static function input(string $prefix = null): string - { - if (static::$readline_support) - { - return readline($prefix); - } - - echo $prefix; - - return fgets(STDIN); - } - - //-------------------------------------------------------------------- - - /** - * Asks the user for input. - * - * Usage: - * - * // Takes any input - * $color = CLI::prompt('What is your favorite color?'); - * - * // Takes any input, but offers default - * $color = CLI::prompt('What is your favourite color?', 'white'); - * - * // Will validate options with the in_list rule and accept only if one of the list - * $color = CLI::prompt('What is your favourite color?', array('red','blue')); - * - * // Do not provide options but requires a valid email - * $email = CLI::prompt('What is your email?', null, 'required|valid_email'); - * - * @param string $field Output "field" question - * @param string|array $options String to a default value, array to a list of options (the first option will be the default value) - * @param string $validation Validation rules - * - * @return string The user input - * - * @codeCoverageIgnore - */ - public static function prompt(string $field, $options = null, string $validation = null): string - { - $extra_output = ''; - $default = ''; - - if (is_string($options)) - { - $extra_output = ' [' . static::color($options, 'white') . ']'; - $default = $options; - } - - if (is_array($options) && $options) - { - $opts = $options; - $extra_output_default = static::color($opts[0], 'white'); - - unset($opts[0]); - - if (empty($opts)) - { - $extra_output = $extra_output_default; - } - else - { - $extra_output = ' [' . $extra_output_default . ', ' . implode(', ', $opts) . ']'; - $validation .= '|in_list[' . implode(',', $options) . ']'; - $validation = trim($validation, '|'); - } - - $default = $options[0]; - } - - static::fwrite(STDOUT, $field . $extra_output . ': '); - - // Read the input from keyboard. - $input = trim(static::input()) ?: $default; - - if (isset($validation)) - { - while (! static::validate($field, $input, $validation)) - { - $input = static::prompt($field, $options, $validation); - } - } - - return empty($input) ? '' : $input; - } - - //-------------------------------------------------------------------- - - /** - * Validate one prompt "field" at a time - * - * @param string $field Prompt "field" output - * @param string $value Input value - * @param string $rules Validation rules - * - * @return boolean - * - * @codeCoverageIgnore - */ - protected static function validate(string $field, string $value, string $rules): bool - { - $label = $field; - $field = 'temp'; - $validation = \Config\Services::validation(null, false); - $validation->setRule($field, $label, $rules); - $validation->run([$field => $value]); - - if ($validation->hasError($field)) - { - static::error($validation->getError($field)); - - return false; - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Outputs a string to the CLI without any surrounding newlines. - * Useful for showing repeating elements on a single line. - * - * @param string $text - * @param string|null $foreground - * @param string|null $background - */ - public static function print(string $text = '', string $foreground = null, string $background = null) - { - if ($foreground || $background) - { - $text = static::color($text, $foreground, $background); - } - - static::$lastWrite = null; - - static::fwrite(STDOUT, $text); - } - - /** - * Outputs a string to the cli on it's own line. - * - * @param string $text The text to output - * @param string $foreground - * @param string $background - */ - public static function write(string $text = '', string $foreground = null, string $background = null) - { - if ($foreground || $background) - { - $text = static::color($text, $foreground, $background); - } - - if (static::$lastWrite !== 'write') - { - $text = PHP_EOL . $text; - static::$lastWrite = 'write'; - } - - static::fwrite(STDOUT, $text . PHP_EOL); - } - - //-------------------------------------------------------------------- - - /** - * Outputs an error to the CLI using STDERR instead of STDOUT - * - * @param string|array $text The text to output, or array of errors - * @param string $foreground - * @param string $background - */ - public static function error(string $text, string $foreground = 'light_red', string $background = null) - { - // Check color support for STDERR - $stdout = static::$isColored; - static::$isColored = static::hasColorSupport(STDERR); - - if ($foreground || $background) - { - $text = static::color($text, $foreground, $background); - } - - static::fwrite(STDERR, $text . PHP_EOL); - - // return STDOUT color support - static::$isColored = $stdout; - } - - //-------------------------------------------------------------------- - - /** - * Beeps a certain number of times. - * - * @param integer $num The number of times to beep - */ - public static function beep(int $num = 1) - { - echo str_repeat("\x07", $num); - } - - //-------------------------------------------------------------------- - - /** - * Waits a certain number of seconds, optionally showing a wait message and - * waiting for a key press. - * - * @param integer $seconds Number of seconds - * @param boolean $countdown Show a countdown or not - */ - public static function wait(int $seconds, bool $countdown = false) - { - if ($countdown === true) - { - $time = $seconds; - - while ($time > 0) - { - static::fwrite(STDOUT, $time . '... '); - sleep(1); - $time --; - } - static::write(); - } - else - { - if ($seconds > 0) - { - sleep($seconds); - } - else - { - // this chunk cannot be tested because of keyboard input - // @codeCoverageIgnoreStart - static::write(static::$wait_msg); - static::input(); - // @codeCoverageIgnoreEnd - } - } - } - - //-------------------------------------------------------------------- - - /** - * if operating system === windows - * - * @return boolean - */ - public static function isWindows(): bool - { - return stripos(PHP_OS, 'WIN') === 0; - } - - //-------------------------------------------------------------------- - - /** - * Enter a number of empty lines - * - * @param integer $num Number of lines to output - * - * @return void - */ - public static function newLine(int $num = 1) - { - // Do it once or more, write with empty string gives us a new line - for ($i = 0; $i < $num; $i ++) - { - static::write(); - } - } - - //-------------------------------------------------------------------- - - /** - * Clears the screen of output - * - * @return void - * - * @codeCoverageIgnore - */ - public static function clearScreen() - { - // Unix systems, and Windows with VT100 Terminal support (i.e. Win10) - // can handle CSI sequences. For lower than Win10 we just shove in 40 new lines. - static::isWindows() && ! static::streamSupports('sapi_windows_vt100_support', STDOUT) - ? static::newLine(40) - : static::fwrite(STDOUT, "\033[H\033[2J"); - } - - //-------------------------------------------------------------------- - - /** - * Returns the given text with the correct color codes for a foreground and - * optionally a background color. - * - * @param string $text The text to color - * @param string $foreground The foreground color - * @param string $background The background color - * @param string $format Other formatting to apply. Currently only 'underline' is understood - * - * @return string The color coded string - */ - public static function color(string $text, string $foreground, string $background = null, string $format = null): string - { - if (! static::$isColored) - { - return $text; - } - - if (! array_key_exists($foreground, static::$foreground_colors)) - { - throw CLIException::forInvalidColor('foreground', $foreground); - } - - if ($background !== null && ! array_key_exists($background, static::$background_colors)) - { - throw CLIException::forInvalidColor('background', $background); - } - - $string = "\033[" . static::$foreground_colors[$foreground] . 'm'; - - if ($background !== null) - { - $string .= "\033[" . static::$background_colors[$background] . 'm'; - } - - if ($format === 'underline') - { - $string .= "\033[4m"; - } - - // Detect if color method was already in use with this text - if (strpos($text, "\033[0m") !== false) - { - // Split the text into parts so that we can see - // if any part missing the color definition - $chunks = mb_split("\\033\[0m", $text); - // Reset text - $text = ''; - - foreach ($chunks as $chunk) - { - if ($chunk === '') - { - continue; - } - - // If chunk doesn't have colors defined we need to add them - if (strpos($chunk, "\033[") === false) - { - $chunk = static::color($chunk, $foreground, $background, $format); - // Add color reset before chunk and clear end of the string - $text .= rtrim("\033[0m" . $chunk, "\033[0m"); - } - else - { - $text .= $chunk; - } - } - } - - return $string . $text . "\033[0m"; - } - - //-------------------------------------------------------------------- - - /** - * Get the number of characters in string having encoded characters - * and ignores styles set by the color() function - * - * @param string $string - * - * @return integer - */ - public static function strlen(?string $string): int - { - if (is_null($string)) - { - return 0; - } - - foreach (static::$foreground_colors as $color) - { - $string = strtr($string, ["\033[" . $color . 'm' => '']); - } - - foreach (static::$background_colors as $color) - { - $string = strtr($string, ["\033[" . $color . 'm' => '']); - } - - $string = strtr($string, ["\033[4m" => '', "\033[0m" => '']); - - return mb_strlen($string); - } - - //-------------------------------------------------------------------- - - /** - * Checks whether the current stream resource supports or - * refers to a valid terminal type device. - * - * @param string $function - * @param resource $resource - * - * @return boolean - */ - public static function streamSupports(string $function, $resource): bool - { - if (ENVIRONMENT === 'testing') - { - // In the current setup of the tests we cannot fully check - // if the stream supports the function since we are using - // filtered streams. - return function_exists($function); - } - - // @codeCoverageIgnoreStart - return function_exists($function) && @$function($resource); - // @codeCoverageIgnoreEnd - } - - //-------------------------------------------------------------------- - - /** - * Returns true if the stream resource supports colors. - * - * This is tricky on Windows, because Cygwin, Msys2 etc. emulate pseudo - * terminals via named pipes, so we can only check the environment. - * - * Reference: https://github.com/composer/xdebug-handler/blob/master/src/Process.php - * - * @param resource $resource - * - * @return boolean - */ - public static function hasColorSupport($resource): bool - { - // Follow https://no-color.org/ - if (isset($_SERVER['NO_COLOR']) || getenv('NO_COLOR') !== false) - { - return false; - } - - if (getenv('TERM_PROGRAM') === 'Hyper') - { - return true; - } - - if (static::isWindows()) - { - // @codeCoverageIgnoreStart - return static::streamSupports('sapi_windows_vt100_support', $resource) - || isset($_SERVER['ANSICON']) - || getenv('ANSICON') !== false - || getenv('ConEmuANSI') === 'ON' - || getenv('TERM') === 'xterm'; - // @codeCoverageIgnoreEnd - } - - return static::streamSupports('stream_isatty', $resource); - } - - //-------------------------------------------------------------------- - - /** - * Attempts to determine the width of the viewable CLI window. - * - * @param integer $default - * - * @return integer - */ - public static function getWidth(int $default = 80): int - { - if (\is_null(static::$width)) - { - static::generateDimensions(); - } - - return static::$width ?: $default; - } - - //-------------------------------------------------------------------- - - /** - * Attempts to determine the height of the viewable CLI window. - * - * @param integer $default - * - * @return integer - */ - public static function getHeight(int $default = 32): int - { - if (\is_null(static::$height)) - { - static::generateDimensions(); - } - - return static::$height ?: $default; - } - - //-------------------------------------------------------------------- - - /** - * Populates the CLI's dimensions. - * - * @return void - */ - public static function generateDimensions() - { - if (static::isWindows()) - { - // Shells such as `Cygwin` and `Git bash` returns incorrect values - // when executing `mode CON`, so we use `tput` instead - // @codeCoverageIgnoreStart - if (($shell = getenv('SHELL')) && preg_match('/(?:bash|zsh)(?:\.exe)?$/', $shell) || getenv('TERM')) - { - static::$height = (int) exec('tput lines'); - static::$width = (int) exec('tput cols'); - } - else - { - $return = -1; - $output = []; - exec('mode CON', $output, $return); - - if ($return === 0 && $output) - { - // Look for the next lines ending in ": " - // Searching for "Columns:" or "Lines:" will fail on non-English locales - if (preg_match('/:\s*(\d+)\n[^:]+:\s*(\d+)\n/', implode("\n", $output), $matches)) - { - static::$height = (int) $matches[1]; - static::$width = (int) $matches[2]; - } - } - } - // @codeCoverageIgnoreEnd - } - else - { - if (($size = exec('stty size')) && preg_match('/(\d+)\s+(\d+)/', $size, $matches)) - { - static::$height = (int) $matches[1]; - static::$width = (int) $matches[2]; - } - else - { - // @codeCoverageIgnoreStart - static::$height = (int) exec('tput lines'); - static::$width = (int) exec('tput cols'); - // @codeCoverageIgnoreEnd - } - } - } - - //-------------------------------------------------------------------- - - /** - * Displays a progress bar on the CLI. You must call it repeatedly - * to update it. Set $thisStep = false to erase the progress bar. - * - * @param integer|boolean $thisStep - * @param integer $totalSteps - */ - public static function showProgress($thisStep = 1, int $totalSteps = 10) - { - static $inProgress = false; - - // restore cursor position when progress is continuing. - if ($inProgress !== false && $inProgress <= $thisStep) - { - static::fwrite(STDOUT, "\033[1A"); - } - $inProgress = $thisStep; - - if ($thisStep !== false) - { - // Don't allow div by zero or negative numbers.... - $thisStep = abs($thisStep); - $totalSteps = $totalSteps < 1 ? 1 : $totalSteps; - - $percent = intval(($thisStep / $totalSteps) * 100); - $step = (int) round($percent / 10); - - // Write the progress bar - static::fwrite(STDOUT, "[\033[32m" . str_repeat('#', $step) . str_repeat('.', 10 - $step) . "\033[0m]"); - // Textual representation... - static::fwrite(STDOUT, sprintf(' %3d%% Complete', $percent) . PHP_EOL); - } - else - { - static::fwrite(STDOUT, "\007"); - } - } - - //-------------------------------------------------------------------- - - /** - * Takes a string and writes it to the command line, wrapping to a maximum - * width. If no maximum width is specified, will wrap to the window's max - * width. - * - * If an int is passed into $pad_left, then all strings after the first - * will padded with that many spaces to the left. Useful when printing - * short descriptions that need to start on an existing line. - * - * @param string $string - * @param integer $max - * @param integer $pad_left - * - * @return string - */ - public static function wrap(string $string = null, int $max = 0, int $pad_left = 0): string - { - if (empty($string)) - { - return ''; - } - - if ($max === 0) - { - $max = CLI::getWidth(); - } - - if (CLI::getWidth() < $max) - { - $max = CLI::getWidth(); - } - - $max = $max - $pad_left; - - $lines = wordwrap($string, $max, PHP_EOL); - - if ($pad_left > 0) - { - $lines = explode(PHP_EOL, $lines); - - $first = true; - - array_walk($lines, function (&$line, $index) use ($pad_left, &$first) { - if (! $first) - { - $line = str_repeat(' ', $pad_left) . $line; - } - else - { - $first = false; - } - }); - - $lines = implode(PHP_EOL, $lines); - } - - return $lines; - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // Command-Line 'URI' support - //-------------------------------------------------------------------- - - /** - * Parses the command line it was called from and collects all - * options and valid segments. - * - * I tried to use getopt but had it fail occasionally to find any - * options but argc has always had our back. We don't have all of the power - * of getopt but this does us just fine. - */ - protected static function parseCommandLine() - { - // start picking segments off from #1, ignoring the invoking program - for ($i = 1; $i < $_SERVER['argc']; $i ++) - { - // If there's no '-' at the beginning of the argument - // then add it to our segments. - if (mb_strpos($_SERVER['argv'][$i], '-') !== 0) - { - static::$segments[] = $_SERVER['argv'][$i]; - continue; - } - - $arg = str_replace('-', '', $_SERVER['argv'][$i]); - $value = null; - - // if there is a following segment, and it doesn't start with a dash, it's a value. - if (isset($_SERVER['argv'][$i + 1]) && mb_strpos($_SERVER['argv'][$i + 1], '-') !== 0) - { - $value = $_SERVER['argv'][$i + 1]; - $i ++; - } - - static::$options[$arg] = $value; - } - } - - //-------------------------------------------------------------------- - - /** - * Returns the command line string portions of the arguments, minus - * any options, as a string. This is used to pass along to the main - * CodeIgniter application. - * - * @return string - */ - public static function getURI(): string - { - return implode('/', static::$segments); - } - - //-------------------------------------------------------------------- - - /** - * Returns an individual segment. - * - * This ignores any options that might have been dispersed between - * valid segments in the command: - * - * // segment(3) is 'three', not '-f' or 'anOption' - * > php spark one two -f anOption three - * - * @param integer $index - * - * @return mixed|null - */ - public static function getSegment(int $index) - { - if (! isset(static::$segments[$index - 1])) - { - return null; - } - - return static::$segments[$index - 1]; - } - - //-------------------------------------------------------------------- - - /** - * Returns the raw array of segments found. - * - * @return array - */ - public static function getSegments(): array - { - return static::$segments; - } - - //-------------------------------------------------------------------- - - /** - * Gets a single command-line option. Returns TRUE if the option - * exists, but doesn't have a value, and is simply acting as a flag. - * - * @param string $name - * - * @return boolean|mixed|null - */ - public static function getOption(string $name) - { - if (! array_key_exists($name, static::$options)) - { - return null; - } - - // If the option didn't have a value, simply return TRUE - // so they know it was set, otherwise return the actual value. - $val = static::$options[$name] === null ? true : static::$options[$name]; - - return $val; - } - - //-------------------------------------------------------------------- - - /** - * Returns the raw array of options found. - * - * @return array - */ - public static function getOptions(): array - { - return static::$options; - } - - //-------------------------------------------------------------------- - - /** - * Returns the options as a string, suitable for passing along on - * the CLI to other commands. - * - * @return string - */ - public static function getOptionString(): string - { - if (empty(static::$options)) - { - return ''; - } - - $out = ''; - - foreach (static::$options as $name => $value) - { - // If there's a space, we need to group - // so it will pass correctly. - if (mb_strpos($value, ' ') !== false) - { - $value = '"' . $value . '"'; - } - - $out .= "-{$name} $value "; - } - - return $out; - } - - //-------------------------------------------------------------------- - - /** - * Returns a well formatted table - * - * @param array $tbody List of rows - * @param array $thead List of columns - * - * @return void - */ - public static function table(array $tbody, array $thead = []) - { - // All the rows in the table will be here until the end - $table_rows = []; - - // We need only indexes and not keys - if (! empty($thead)) - { - $table_rows[] = array_values($thead); - } - - foreach ($tbody as $tr) - { - $table_rows[] = array_values($tr); - } - - // Yes, it really is necessary to know this count - $total_rows = count($table_rows); - - // Store all columns lengths - // $all_cols_lengths[row][column] = length - $all_cols_lengths = []; - - // Store maximum lengths by column - // $max_cols_lengths[column] = length - $max_cols_lengths = []; - - // Read row by row and define the longest columns - for ($row = 0; $row < $total_rows; $row ++) - { - $column = 0; // Current column index - foreach ($table_rows[$row] as $col) - { - // Sets the size of this column in the current row - $all_cols_lengths[$row][$column] = static::strlen($col); - - // If the current column does not have a value among the larger ones - // or the value of this is greater than the existing one - // then, now, this assumes the maximum length - if (! isset($max_cols_lengths[$column]) || $all_cols_lengths[$row][$column] > $max_cols_lengths[$column]) - { - $max_cols_lengths[$column] = $all_cols_lengths[$row][$column]; - } - - // We can go check the size of the next column... - $column ++; - } - } - - // Read row by row and add spaces at the end of the columns - // to match the exact column length - for ($row = 0; $row < $total_rows; $row ++) - { - $column = 0; - foreach ($table_rows[$row] as $col) - { - $diff = $max_cols_lengths[$column] - static::strlen($col); - if ($diff) - { - $table_rows[$row][$column] = $table_rows[$row][$column] . str_repeat(' ', $diff); - } - $column ++; - } - } - - $table = ''; - - // Joins columns and append the well formatted rows to the table - for ($row = 0; $row < $total_rows; $row ++) - { - // Set the table border-top - if ($row === 0) - { - $cols = '+'; - foreach ($table_rows[$row] as $col) - { - $cols .= str_repeat('-', static::strlen($col) + 2) . '+'; - } - $table .= $cols . PHP_EOL; - } - - // Set the columns borders - $table .= '| ' . implode(' | ', $table_rows[$row]) . ' |' . PHP_EOL; - - // Set the thead and table borders-bottom - if ($row === 0 && ! empty($thead) || $row + 1 === $total_rows) - { - $table .= $cols . PHP_EOL; - } - } - - static::write($table); - } - - //-------------------------------------------------------------------- - - /** - * While the library is intended for use on CLI commands, - * commands can be called from controllers and elsewhere - * so we need a way to allow them to still work. - * - * For now, just echo the content, but look into a better - * solution down the road. - * - * @param resource $handle - * @param string $string - */ - protected static function fwrite($handle, string $string) - { - if (is_cli()) - { - fwrite($handle, $string); - return; - } - - // @codeCoverageIgnoreStart - echo $string; - // @codeCoverageIgnoreEnd - } -} - -// Ensure the class is initialized. Done outside of code coverage -// @codeCoverageIgnoreStart -CLI::init(); -// @codeCoverageIgnoreEnd diff --git a/vendor/codeigniter4/framework/system/CLI/CommandRunner.php b/vendor/codeigniter4/framework/system/CLI/CommandRunner.php deleted file mode 100644 index 466ef33..0000000 --- a/vendor/codeigniter4/framework/system/CLI/CommandRunner.php +++ /dev/null @@ -1,119 +0,0 @@ -commands = service('commands'); - } - - /** - * We map all un-routed CLI methods through this function - * so we have the chance to look for a Command first. - * - * @param string $method - * @param array ...$params - * - * @return mixed - * @throws \ReflectionException - */ - public function _remap($method, ...$params) - { - // The first param is usually empty, so scrap it. - if (empty($params[0])) - { - array_shift($params); - } - - return $this->index($params); - } - - //-------------------------------------------------------------------- - - /** - * Default command. - * - * @param array $params - * - * @return mixed - * @throws \ReflectionException - */ - public function index(array $params) - { - $command = array_shift($params); - - if (is_null($command)) - { - $command = 'list'; - } - - return service('commands')->run($command, $params); - } - - /** - * Allows access to the current commands that have been found. - * - * @return array - */ - public function getCommands(): array - { - return $this->commands->getCommands(); - } -} diff --git a/vendor/codeigniter4/framework/system/CLI/Commands.php b/vendor/codeigniter4/framework/system/CLI/Commands.php deleted file mode 100644 index cb6d8fd..0000000 --- a/vendor/codeigniter4/framework/system/CLI/Commands.php +++ /dev/null @@ -1,181 +0,0 @@ -logger = $logger ?? service('logger'); - } - - /** - * Runs a command given - * - * @param string $command - * @param array $params - */ - public function run(string $command, array $params) - { - $this->discoverCommands(); - - if (! isset($this->commands[$command])) - { - CLI::error(lang('CLI.commandNotFound', [$command])); - CLI::newLine(); - return; - } - - // The file would have already been loaded during the - // createCommandList function... - $className = $this->commands[$command]['class']; - $class = new $className($this->logger, $this); - - return $class->run($params); - } - - /** - * Provide access to the list of commands. - * - * @return array - */ - public function getCommands() - { - $this->discoverCommands(); - - return $this->commands; - } - - /** - * Discovers all commands in the framework and within user code, - * and collects instances of them to work with. - */ - public function discoverCommands() - { - if (! empty($this->commands)) - { - return; - } - - $files = service('locator')->listFiles('Commands/'); - - // If no matching command files were found, bail - if (empty($files)) - { - // This should never happen in unit testing. - // if it does, we have far bigger problems! - // @codeCoverageIgnoreStart - return; - // @codeCoverageIgnoreEnd - } - - // Loop over each file checking to see if a command with that - // alias exists in the class. If so, return it. Otherwise, try the next. - foreach ($files as $file) - { - $className = Services::locator()->findQualifiedNameFromPath($file); - if (empty($className) || ! class_exists($className)) - { - continue; - } - - try - { - $class = new \ReflectionClass($className); - - if (! $class->isInstantiable() || ! $class->isSubclassOf(BaseCommand::class)) - { - continue; - } - - $class = new $className($this->logger, $this); - - // Store it! - if ($class->group !== null) - { - $this->commands[$class->name] = [ - 'class' => $className, - 'file' => $file, - 'group' => $class->group, - 'description' => $class->description, - ]; - } - - $class = null; - unset($class); - } - catch (\ReflectionException $e) - { - $this->logger->error($e->getMessage()); - } - } - - asort($this->commands); - } -} diff --git a/vendor/codeigniter4/framework/system/CLI/Console.php b/vendor/codeigniter4/framework/system/CLI/Console.php deleted file mode 100644 index cf50384..0000000 --- a/vendor/codeigniter4/framework/system/CLI/Console.php +++ /dev/null @@ -1,106 +0,0 @@ -app = $app; - } - - //-------------------------------------------------------------------- - - /** - * Runs the current command discovered on the CLI. - * - * @param boolean $useSafeOutput - * - * @return \CodeIgniter\HTTP\RequestInterface|\CodeIgniter\HTTP\Response|\CodeIgniter\HTTP\ResponseInterface|mixed - * @throws \Exception - */ - public function run(bool $useSafeOutput = false) - { - $path = CLI::getURI() ?: 'list'; - - // Set the path for the application to route to. - $this->app->setPath("ci{$path}"); - - return $this->app->useSafeOutput($useSafeOutput)->run(); - } - - //-------------------------------------------------------------------- - - /** - * Displays basic information about the Console. - */ - public function showHeader() - { - CLI::newLine(1); - - CLI::write(CLI::color('CodeIgniter CLI Tool', 'green') - . ' - Version ' . CodeIgniter::CI_VERSION - . ' - Server-Time: ' . date('Y-m-d H:i:sa')); - - CLI::newLine(1); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/CLI/Exceptions/CLIException.php b/vendor/codeigniter4/framework/system/CLI/Exceptions/CLIException.php deleted file mode 100644 index 474064e..0000000 --- a/vendor/codeigniter4/framework/system/CLI/Exceptions/CLIException.php +++ /dev/null @@ -1,60 +0,0 @@ -validHandlers) || ! is_array($config->validHandlers)) - { - throw CacheException::forInvalidHandlers(); - } - - if (! isset($config->handler) || ! isset($config->backupHandler)) - { - throw CacheException::forNoBackup(); - } - - $handler = ! empty($handler) ? $handler : $config->handler; - $backup = ! empty($backup) ? $backup : $config->backupHandler; - - if (! array_key_exists($handler, $config->validHandlers) || ! array_key_exists($backup, $config->validHandlers)) - { - throw CacheException::forHandlerNotFound(); - } - - // Get an instance of our handler. - $adapter = new $config->validHandlers[$handler]($config); - - if (! $adapter->isSupported()) - { - $adapter = new $config->validHandlers[$backup]($config); - - if (! $adapter->isSupported()) - { - // Log stuff here, don't throw exception. No need to raise a fuss. - // Fall back to the dummy adapter. - $adapter = new $config->validHandlers['dummy'](); - } - } - - // If $adapter->initialization throws a CriticalError exception, we will attempt to - // use the $backup handler, if that also fails, we resort to the dummy handler. - try - { - $adapter->initialize(); - } - catch (CriticalError $e) - { - // log the fact that an exception occurred as well what handler we are resorting to - log_message('critical', $e->getMessage() . ' Resorting to using ' . $backup . ' handler.'); - - // get the next best cache handler (or dummy if the $backup also fails) - $adapter = self::getHandler($config, $backup, 'dummy'); - } - - return $adapter; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Cache/CacheInterface.php b/vendor/codeigniter4/framework/system/Cache/CacheInterface.php deleted file mode 100644 index 108c63d..0000000 --- a/vendor/codeigniter4/framework/system/Cache/CacheInterface.php +++ /dev/null @@ -1,154 +0,0 @@ -storePath) ? $config->storePath : WRITEPATH . 'cache'; - if (! is_really_writable($path)) - { - throw CacheException::forUnableToWrite($path); - } - - $this->prefix = $config->prefix ?: ''; - $this->path = rtrim($path, '/') . '/'; - } - - //-------------------------------------------------------------------- - - /** - * Takes care of any handler-specific setup that must be done. - */ - public function initialize() - { - // Not to see here... - } - - //-------------------------------------------------------------------- - - /** - * Attempts to fetch an item from the cache store. - * - * @param string $key Cache item name - * - * @return mixed - */ - public function get(string $key) - { - $key = $this->prefix . $key; - - $data = $this->getItem($key); - - return is_array($data) ? $data['data'] : null; - } - - //-------------------------------------------------------------------- - - /** - * Saves an item to the cache store. - * - * @param string $key Cache item name - * @param mixed $value The data to save - * @param integer $ttl Time To Live, in seconds (default 60) - * - * @return mixed - */ - public function save(string $key, $value, int $ttl = 60) - { - $key = $this->prefix . $key; - - $contents = [ - 'time' => time(), - 'ttl' => $ttl, - 'data' => $value, - ]; - - if ($this->writeFile($this->path . $key, serialize($contents))) - { - chmod($this->path . $key, 0640); - - return true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Deletes a specific item from the cache store. - * - * @param string $key Cache item name - * - * @return boolean - */ - public function delete(string $key) - { - $key = $this->prefix . $key; - - return is_file($this->path . $key) && unlink($this->path . $key); - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic incrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - */ - public function increment(string $key, int $offset = 1) - { - $key = $this->prefix . $key; - - $data = $this->getItem($key); - - if ($data === false) - { - $data = [ - 'data' => 0, - 'ttl' => 60, - ]; - } - elseif (! is_int($data['data'])) - { - return false; - } - - $new_value = $data['data'] + $offset; - - return $this->save($key, $new_value, $data['ttl']) ? $new_value : false; - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic decrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - */ - public function decrement(string $key, int $offset = 1) - { - $key = $this->prefix . $key; - - $data = $this->getItem($key); - - if ($data === false) - { - $data = [ - 'data' => 0, - 'ttl' => 60, - ]; - } - elseif (! is_int($data['data'])) - { - return false; - } - - $new_value = $data['data'] - $offset; - - return $this->save($key, $new_value, $data['ttl']) ? $new_value : false; - } - - //-------------------------------------------------------------------- - - /** - * Will delete all items in the entire cache. - * - * @return boolean - */ - public function clean() - { - return $this->deleteFiles($this->path, false, true); - } - - //-------------------------------------------------------------------- - - /** - * Returns information on the entire cache. - * - * The information returned and the structure of the data - * varies depending on the handler. - * - * @return mixed - */ - public function getCacheInfo() - { - return $this->getDirFileInfo($this->path); - } - - //-------------------------------------------------------------------- - - /** - * Returns detailed information about the specific item in the cache. - * - * @param string $key Cache item name. - * - * @return mixed - */ - public function getMetaData(string $key) - { - $key = $this->prefix . $key; - - if (! is_file($this->path . $key)) - { - return false; - } - - $data = @unserialize(file_get_contents($this->path . $key)); - - if (is_array($data)) - { - $mtime = filemtime($this->path . $key); - - if (! isset($data['ttl'])) - { - return false; - } - - return [ - 'expire' => $mtime + $data['ttl'], - 'mtime' => $mtime, - 'data' => $data['data'], - ]; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Determines if the driver is supported on this system. - * - * @return boolean - */ - public function isSupported(): bool - { - return is_writable($this->path); - } - - //-------------------------------------------------------------------- - - /** - * Does the heavy lifting of actually retrieving the file and - * verifying it's age. - * - * @param string $key - * - * @return boolean|mixed - */ - protected function getItem(string $key) - { - if (! is_file($this->path . $key)) - { - return false; - } - - $data = unserialize(file_get_contents($this->path . $key)); - - if ($data['ttl'] > 0 && time() > $data['time'] + $data['ttl']) - { - // If the file is still there then remove it - if (is_file($this->path . $key)) - { - unlink($this->path . $key); - } - - return false; - } - - return $data; - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // SUPPORT METHODS FOR FILES - //-------------------------------------------------------------------- - - /** - * Writes a file to disk, or returns false if not successful. - * - * @param string $path - * @param string $data - * @param string $mode - * - * @return boolean - */ - protected function writeFile($path, $data, $mode = 'wb') - { - if (($fp = @fopen($path, $mode)) === false) - { - return false; - } - - flock($fp, LOCK_EX); - - for ($result = $written = 0, $length = strlen($data); $written < $length; $written += $result) - { - if (($result = fwrite($fp, substr($data, $written))) === false) - { - break; - } - } - - flock($fp, LOCK_UN); - fclose($fp); - - return is_int($result); - } - - //-------------------------------------------------------------------- - - /** - * Delete Files - * - * Deletes all files contained in the supplied directory path. - * Files must be writable or owned by the system in order to be deleted. - * If the second parameter is set to TRUE, any directories contained - * within the supplied base directory will be nuked as well. - * - * @param string $path File path - * @param boolean $del_dir Whether to delete any directories found in the path - * @param boolean $htdocs Whether to skip deleting .htaccess and index page files - * @param integer $_level Current directory depth level (default: 0; internal use only) - * - * @return boolean - */ - protected function deleteFiles(string $path, bool $del_dir = false, bool $htdocs = false, int $_level = 0): bool - { - // Trim the trailing slash - $path = rtrim($path, '/\\'); - - if (! $current_dir = @opendir($path)) - { - return false; - } - - while (false !== ($filename = @readdir($current_dir))) - { - if ($filename !== '.' && $filename !== '..') - { - if (is_dir($path . DIRECTORY_SEPARATOR . $filename) && $filename[0] !== '.') - { - $this->deleteFiles($path . DIRECTORY_SEPARATOR . $filename, $del_dir, $htdocs, $_level + 1); - } - elseif ($htdocs !== true || ! preg_match('/^(\.htaccess|index\.(html|htm|php)|web\.config)$/i', $filename)) - { - @unlink($path . DIRECTORY_SEPARATOR . $filename); - } - } - } - - closedir($current_dir); - - return ($del_dir === true && $_level > 0) ? @rmdir($path) : true; - } - - //-------------------------------------------------------------------- - - /** - * Get Directory File Information - * - * Reads the specified directory and builds an array containing the filenames, - * filesize, dates, and permissions - * - * Any sub-folders contained within the specified path are read as well. - * - * @param string $source_dir Path to source - * @param boolean $top_level_only Look only at the top level directory specified? - * @param boolean $_recursion Internal variable to determine recursion status - do not use in calls - * - * @return array|false - */ - protected function getDirFileInfo(string $source_dir, bool $top_level_only = true, bool $_recursion = false) - { - static $_filedata = []; - $relative_path = $source_dir; - - if ($fp = @opendir($source_dir)) - { - // reset the array and make sure $source_dir has a trailing slash on the initial call - if ($_recursion === false) - { - $_filedata = []; - $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; - } - - // Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast - while (false !== ($file = readdir($fp))) - { - if (is_dir($source_dir . $file) && $file[0] !== '.' && $top_level_only === false) - { - $this->getDirFileInfo($source_dir . $file . DIRECTORY_SEPARATOR, $top_level_only, true); - } - elseif ($file[0] !== '.') - { - $_filedata[$file] = $this->getFileInfo($source_dir . $file); - $_filedata[$file]['relative_path'] = $relative_path; - } - } - - closedir($fp); - - return $_filedata; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Get File Info - * - * Given a file and path, returns the name, path, size, date modified - * Second parameter allows you to explicitly declare what information you want returned - * Options are: name, server_path, size, date, readable, writable, executable, fileperms - * Returns FALSE if the file cannot be found. - * - * @param string $file Path to file - * @param mixed $returned_values Array or comma separated string of information returned - * - * @return array|false - */ - protected function getFileInfo(string $file, $returned_values = ['name', 'server_path', 'size', 'date']) - { - if (! is_file($file)) - { - return false; - } - - if (is_string($returned_values)) - { - $returned_values = explode(',', $returned_values); - } - - foreach ($returned_values as $key) - { - switch ($key) - { - case 'name': - $fileInfo['name'] = basename($file); - break; - case 'server_path': - $fileInfo['server_path'] = $file; - break; - case 'size': - $fileInfo['size'] = filesize($file); - break; - case 'date': - $fileInfo['date'] = filemtime($file); - break; - case 'readable': - $fileInfo['readable'] = is_readable($file); - break; - case 'writable': - $fileInfo['writable'] = is_writable($file); - break; - case 'executable': - $fileInfo['executable'] = is_executable($file); - break; - case 'fileperms': - $fileInfo['fileperms'] = fileperms($file); - break; - } - } - - return $fileInfo; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Cache/Handlers/MemcachedHandler.php b/vendor/codeigniter4/framework/system/Cache/Handlers/MemcachedHandler.php deleted file mode 100644 index b729a20..0000000 --- a/vendor/codeigniter4/framework/system/Cache/Handlers/MemcachedHandler.php +++ /dev/null @@ -1,388 +0,0 @@ - '127.0.0.1', - 'port' => 11211, - 'weight' => 1, - 'raw' => false, - ]; - - //-------------------------------------------------------------------- - - /** - * Constructor. - * - * @param \Config\Cache $config - */ - public function __construct($config) - { - $this->prefix = $config->prefix ?: ''; - - if (! empty($config)) - { - $this->config = array_merge($this->config, $config->memcached); - } - } - - /** - * Class destructor - * - * Closes the connection to Memcache(d) if present. - */ - public function __destruct() - { - if ($this->memcached instanceof \Memcached) - { - $this->memcached->quit(); - } - elseif ($this->memcached instanceof \Memcache) - { - $this->memcached->close(); - } - } - - //-------------------------------------------------------------------- - - /** - * Takes care of any handler-specific setup that must be done. - */ - public function initialize() - { - // Try to connect to Memcache or Memcached, if an issue occurs throw a CriticalError exception, - // so that the CacheFactory can attempt to initiate the next cache handler. - try - { - if (class_exists('\Memcached')) - { - // Create new instance of \Memcached - $this->memcached = new \Memcached(); - if ($this->config['raw']) - { - $this->memcached->setOption(\Memcached::OPT_BINARY_PROTOCOL, true); - } - - // Add server - $this->memcached->addServer( - $this->config['host'], $this->config['port'], $this->config['weight'] - ); - - // attempt to get status of servers - $stats = $this->memcached->getStats(); - - // $stats should be an associate array with a key in the format of host:port. - // If it doesn't have the key, we know the server is not working as expected. - if (! isset($stats[$this->config['host'] . ':' . $this->config['port']])) - { - throw new CriticalError('Cache: Memcached connection failed.'); - } - } - elseif (class_exists('\Memcache')) - { - // Create new instance of \Memcache - $this->memcached = new \Memcache(); - - // Check if we can connect to the server - $can_connect = $this->memcached->connect( - $this->config['host'], $this->config['port'] - ); - - // If we can't connect, throw a CriticalError exception - if ($can_connect === false) - { - throw new CriticalError('Cache: Memcache connection failed.'); - } - - // Add server, third parameter is persistence and defaults to TRUE. - $this->memcached->addServer( - $this->config['host'], $this->config['port'], true, $this->config['weight'] - ); - } - else - { - throw new CriticalError('Cache: Not support Memcache(d) extension.'); - } - } - catch (CriticalError $e) - { - // If a CriticalError exception occurs, throw it up. - throw $e; - } - catch (\Exception $e) - { - // If an \Exception occurs, convert it into a CriticalError exception and throw it. - throw new CriticalError('Cache: Memcache(d) connection refused (' . $e->getMessage() . ').'); - } - } - - //-------------------------------------------------------------------- - - /** - * Attempts to fetch an item from the cache store. - * - * @param string $key Cache item name - * - * @return mixed - */ - public function get(string $key) - { - $key = $this->prefix . $key; - - if ($this->memcached instanceof \Memcached) - { - $data = $this->memcached->get($key); - - // check for unmatched key - if ($this->memcached->getResultCode() === \Memcached::RES_NOTFOUND) - { - return null; - } - } - elseif ($this->memcached instanceof \Memcache) - { - $flags = false; - $data = $this->memcached->get($key, $flags); - - // check for unmatched key (i.e. $flags is untouched) - if ($flags === false) - { - return null; - } - } - - return is_array($data) ? $data[0] : $data; - } - - //-------------------------------------------------------------------- - - /** - * Saves an item to the cache store. - * - * @param string $key Cache item name - * @param mixed $value The data to save - * @param integer $ttl Time To Live, in seconds (default 60) - * - * @return mixed - */ - public function save(string $key, $value, int $ttl = 60) - { - $key = $this->prefix . $key; - - if (! $this->config['raw']) - { - $value = [ - $value, - time(), - $ttl, - ]; - } - - if ($this->memcached instanceof \Memcached) - { - return $this->memcached->set($key, $value, $ttl); - } - - if ($this->memcached instanceof \Memcache) - { - return $this->memcached->set($key, $value, 0, $ttl); - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Deletes a specific item from the cache store. - * - * @param string $key Cache item name - * - * @return boolean - */ - public function delete(string $key) - { - $key = $this->prefix . $key; - - return $this->memcached->delete($key); - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic incrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - */ - public function increment(string $key, int $offset = 1) - { - if (! $this->config['raw']) - { - return false; - } - - $key = $this->prefix . $key; - - return $this->memcached->increment($key, $offset, $offset, 60); - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic decrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - */ - public function decrement(string $key, int $offset = 1) - { - if (! $this->config['raw']) - { - return false; - } - - $key = $this->prefix . $key; - - //FIXME: third parameter isn't other handler actions. - return $this->memcached->decrement($key, $offset, $offset, 60); - } - - //-------------------------------------------------------------------- - - /** - * Will delete all items in the entire cache. - * - * @return boolean - */ - public function clean() - { - return $this->memcached->flush(); - } - - //-------------------------------------------------------------------- - - /** - * Returns information on the entire cache. - * - * The information returned and the structure of the data - * varies depending on the handler. - * - * @return mixed - */ - public function getCacheInfo() - { - return $this->memcached->getStats(); - } - - //-------------------------------------------------------------------- - - /** - * Returns detailed information about the specific item in the cache. - * - * @param string $key Cache item name. - * - * @return mixed - */ - public function getMetaData(string $key) - { - $key = $this->prefix . $key; - - $stored = $this->memcached->get($key); - - // if not an array, don't try to count for PHP7.2 - if (! is_array($stored) || count($stored) !== 3) - { - return false; - } - - list($data, $time, $ttl) = $stored; - - return [ - 'expire' => $time + $ttl, - 'mtime' => $time, - 'data' => $data, - ]; - } - - //-------------------------------------------------------------------- - - /** - * Determines if the driver is supported on this system. - * - * @return boolean - */ - public function isSupported(): bool - { - return (extension_loaded('memcached') || extension_loaded('memcache')); - } - -} diff --git a/vendor/codeigniter4/framework/system/Cache/Handlers/PredisHandler.php b/vendor/codeigniter4/framework/system/Cache/Handlers/PredisHandler.php deleted file mode 100644 index bdfcea0..0000000 --- a/vendor/codeigniter4/framework/system/Cache/Handlers/PredisHandler.php +++ /dev/null @@ -1,306 +0,0 @@ - 'tcp', - 'host' => '127.0.0.1', - 'password' => null, - 'port' => 6379, - 'timeout' => 0, - ]; - - /** - * Predis connection - * - * @var \Predis\Client - */ - protected $redis; - - //-------------------------------------------------------------------- - - /** - * Constructor. - * - * @param \Config\Cache $config - */ - public function __construct($config) - { - $this->prefix = $config->prefix ?: ''; - - if (isset($config->redis)) - { - $this->config = array_merge($this->config, $config->redis); - } - } - - //-------------------------------------------------------------------- - - /** - * Takes care of any handler-specific setup that must be done. - */ - public function initialize() - { - // Try to connect to Redis, if an issue occurs throw a CriticalError exception, - // so that the CacheFactory can attempt to initiate the next cache handler. - try - { - // Create a new instance of Predis\Client - $this->redis = new \Predis\Client($this->config, ['prefix' => $this->prefix]); - - // Check if the connection is valid by trying to get the time. - $this->redis->time(); - } - catch (\Exception $e) - { - // thrown if can't connect to redis server. - throw new CriticalError('Cache: Predis connection refused (' . $e->getMessage() . ').'); - } - } - - //-------------------------------------------------------------------- - - /** - * Attempts to fetch an item from the cache store. - * - * @param string $key Cache item name - * - * @return mixed - */ - public function get(string $key) - { - $data = array_combine([ - '__ci_type', - '__ci_value', - ], $this->redis->hmget($key, ['__ci_type', '__ci_value']) - ); - - if (! isset($data['__ci_type'], $data['__ci_value']) || $data['__ci_value'] === false) - { - return null; - } - - switch ($data['__ci_type']) - { - case 'array': - case 'object': - return unserialize($data['__ci_value']); - case 'boolean': - case 'integer': - case 'double': // Yes, 'double' is returned and NOT 'float' - case 'string': - case 'NULL': - return settype($data['__ci_value'], $data['__ci_type']) ? $data['__ci_value'] : null; - case 'resource': - default: - return null; - } - } - - //-------------------------------------------------------------------- - - /** - * Saves an item to the cache store. - * - * @param string $key Cache item name - * @param mixed $value The data to save - * @param integer $ttl Time To Live, in seconds (default 60) - * - * @return mixed - */ - public function save(string $key, $value, int $ttl = 60) - { - switch ($data_type = gettype($value)) - { - case 'array': - case 'object': - $value = serialize($value); - break; - case 'boolean': - case 'integer': - case 'double': // Yes, 'double' is returned and NOT 'float' - case 'string': - case 'NULL': - break; - case 'resource': - default: - return false; - } - - if (! $this->redis->hmset($key, ['__ci_type' => $data_type, '__ci_value' => $value])) - { - return false; - } - - $this->redis->expireat($key, time() + $ttl); - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Deletes a specific item from the cache store. - * - * @param string $key Cache item name - * - * @return boolean - */ - public function delete(string $key) - { - return ($this->redis->del($key) === 1); - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic incrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - */ - public function increment(string $key, int $offset = 1) - { - return $this->redis->hincrby($key, 'data', $offset); - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic decrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - */ - public function decrement(string $key, int $offset = 1) - { - return $this->redis->hincrby($key, 'data', -$offset); - } - - //-------------------------------------------------------------------- - - /** - * Will delete all items in the entire cache. - * - * @return boolean - */ - public function clean() - { - return $this->redis->flushdb()->getPayload() === 'OK'; - } - - //-------------------------------------------------------------------- - - /** - * Returns information on the entire cache. - * - * The information returned and the structure of the data - * varies depending on the handler. - * - * @return mixed - */ - public function getCacheInfo() - { - return $this->redis->info(); - } - - //-------------------------------------------------------------------- - - /** - * Returns detailed information about the specific item in the cache. - * - * @param string $key Cache item name. - * - * @return mixed - */ - public function getMetaData(string $key) - { - $data = array_combine(['__ci_value'], $this->redis->hmget($key, ['__ci_value'])); - - if (isset($data['__ci_value']) && $data['__ci_value'] !== false) - { - $time = time(); - return [ - 'expire' => $time + $this->redis->ttl($key), - 'mtime' => $time, - 'data' => $data['__ci_value'], - ]; - } - - return null; - } - - //-------------------------------------------------------------------- - - /** - * Determines if the driver is supported on this system. - * - * @return boolean - */ - public function isSupported(): bool - { - return class_exists('\Predis\Client'); - } - -} diff --git a/vendor/codeigniter4/framework/system/Cache/Handlers/RedisHandler.php b/vendor/codeigniter4/framework/system/Cache/Handlers/RedisHandler.php deleted file mode 100644 index 639d5f5..0000000 --- a/vendor/codeigniter4/framework/system/Cache/Handlers/RedisHandler.php +++ /dev/null @@ -1,352 +0,0 @@ - '127.0.0.1', - 'password' => null, - 'port' => 6379, - 'timeout' => 0, - 'database' => 0, - ]; - - /** - * Redis connection - * - * @var \Redis - */ - protected $redis; - - //-------------------------------------------------------------------- - - /** - * Constructor. - * - * @param \Config\Cache $config - */ - public function __construct($config) - { - $this->prefix = $config->prefix ?: ''; - - if (! empty($config)) - { - $this->config = array_merge($this->config, $config->redis); - } - } - - /** - * Class destructor - * - * Closes the connection to Redis if present. - */ - public function __destruct() - { - if ($this->redis) - { - $this->redis->close(); - } - } - - //-------------------------------------------------------------------- - - /** - * Takes care of any handler-specific setup that must be done. - */ - public function initialize() - { - $config = $this->config; - - $this->redis = new \Redis(); - - // Try to connect to Redis, if an issue occurs throw a CriticalError exception, - // so that the CacheFactory can attempt to initiate the next cache handler. - try - { - // Note:: If Redis is your primary cache choice, and it is "offline", every page load will end up been delayed by the timeout duration. - // I feel like some sort of temporary flag should be set, to indicate that we think Redis is "offline", allowing us to bypass the timeout for a set period of time. - - if (! $this->redis->connect($config['host'], ($config['host'][0] === '/' ? 0 : $config['port']), $config['timeout'])) - { - // Note:: I'm unsure if log_message() is necessary, however I'm not 100% comfortable removing it. - log_message('error', 'Cache: Redis connection failed. Check your configuration.'); - throw new CriticalError('Cache: Redis connection failed. Check your configuration.'); - } - - if (isset($config['password']) && ! $this->redis->auth($config['password'])) - { - log_message('error', 'Cache: Redis authentication failed.'); - throw new CriticalError('Cache: Redis authentication failed.'); - } - - if (isset($config['database']) && ! $this->redis->select($config['database'])) - { - log_message('error', 'Cache: Redis select database failed.'); - throw new CriticalError('Cache: Redis select database failed.'); - } - } - catch (\RedisException $e) - { - // $this->redis->connect() can sometimes throw a RedisException. - // We need to convert the exception into a CriticalError exception and throw it. - throw new CriticalError('Cache: RedisException occurred with message (' . $e->getMessage() . ').'); - } - } - - //-------------------------------------------------------------------- - - /** - * Attempts to fetch an item from the cache store. - * - * @param string $key Cache item name - * - * @return mixed - */ - public function get(string $key) - { - $key = $this->prefix . $key; - - $data = $this->redis->hMGet($key, ['__ci_type', '__ci_value']); - - if (! isset($data['__ci_type'], $data['__ci_value']) || $data['__ci_value'] === false) - { - return null; - } - - switch ($data['__ci_type']) - { - case 'array': - case 'object': - return unserialize($data['__ci_value']); - case 'boolean': - case 'integer': - case 'double': // Yes, 'double' is returned and NOT 'float' - case 'string': - case 'NULL': - return settype($data['__ci_value'], $data['__ci_type']) ? $data['__ci_value'] : null; - case 'resource': - default: - return null; - } - } - - //-------------------------------------------------------------------- - - /** - * Saves an item to the cache store. - * - * @param string $key Cache item name - * @param mixed $value The data to save - * @param integer $ttl Time To Live, in seconds (default 60) - * - * @return mixed - */ - public function save(string $key, $value, int $ttl = 60) - { - $key = $this->prefix . $key; - - switch ($data_type = gettype($value)) - { - case 'array': - case 'object': - $value = serialize($value); - break; - case 'boolean': - case 'integer': - case 'double': // Yes, 'double' is returned and NOT 'float' - case 'string': - case 'NULL': - break; - case 'resource': - default: - return false; - } - - if (! $this->redis->hMSet($key, ['__ci_type' => $data_type, '__ci_value' => $value])) - { - return false; - } - elseif ($ttl) - { - $this->redis->expireAt($key, time() + $ttl); - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Deletes a specific item from the cache store. - * - * @param string $key Cache item name - * - * @return boolean - */ - public function delete(string $key) - { - $key = $this->prefix . $key; - - return ($this->redis->del($key) === 1); - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic incrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - */ - public function increment(string $key, int $offset = 1) - { - $key = $this->prefix . $key; - - return $this->redis->hIncrBy($key, 'data', $offset); - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic decrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - */ - public function decrement(string $key, int $offset = 1) - { - $key = $this->prefix . $key; - - return $this->redis->hIncrBy($key, 'data', -$offset); - } - - //-------------------------------------------------------------------- - - /** - * Will delete all items in the entire cache. - * - * @return boolean - */ - public function clean() - { - return $this->redis->flushDB(); - } - - //-------------------------------------------------------------------- - - /** - * Returns information on the entire cache. - * - * The information returned and the structure of the data - * varies depending on the handler. - * - * @return mixed - */ - public function getCacheInfo() - { - return $this->redis->info(); - } - - //-------------------------------------------------------------------- - - /** - * Returns detailed information about the specific item in the cache. - * - * @param string $key Cache item name. - * - * @return mixed - */ - public function getMetaData(string $key) - { - $key = $this->prefix . $key; - - $value = $this->get($key); - - if ($value !== null) - { - $time = time(); - return [ - 'expire' => $time + $this->redis->ttl($key), - 'mtime' => $time, - 'data' => $value, - ]; - } - - return null; - } - - //-------------------------------------------------------------------- - - /** - * Determines if the driver is supported on this system. - * - * @return boolean - */ - public function isSupported(): bool - { - return extension_loaded('redis'); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Cache/Handlers/WincacheHandler.php b/vendor/codeigniter4/framework/system/Cache/Handlers/WincacheHandler.php deleted file mode 100644 index 2adf812..0000000 --- a/vendor/codeigniter4/framework/system/Cache/Handlers/WincacheHandler.php +++ /dev/null @@ -1,263 +0,0 @@ -prefix = $config->prefix ?: ''; - } - - //-------------------------------------------------------------------- - - /** - * Takes care of any handler-specific setup that must be done. - * - * @codeCoverageIgnore - */ - public function initialize() - { - // Nothing to see here... - } - - //-------------------------------------------------------------------- - - /** - * Attempts to fetch an item from the cache store. - * - * @param string $key Cache item name - * - * @return mixed - * - * @codeCoverageIgnore - */ - public function get(string $key) - { - $key = $this->prefix . $key; - - $success = false; - $data = wincache_ucache_get($key, $success); - - // Success returned by reference from wincache_ucache_get() - return ($success) ? $data : null; - } - - //-------------------------------------------------------------------- - - /** - * Saves an item to the cache store. - * - * @param string $key Cache item name - * @param mixed $value The data to save - * @param integer $ttl Time To Live, in seconds (default 60) - * - * @return mixed - * - * @codeCoverageIgnore - */ - public function save(string $key, $value, int $ttl = 60) - { - $key = $this->prefix . $key; - - return wincache_ucache_set($key, $value, $ttl); - } - - //-------------------------------------------------------------------- - - /** - * Deletes a specific item from the cache store. - * - * @param string $key Cache item name - * - * @return boolean - * - * @codeCoverageIgnore - */ - public function delete(string $key) - { - $key = $this->prefix . $key; - - return wincache_ucache_delete($key); - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic incrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - * - * @codeCoverageIgnore - */ - public function increment(string $key, int $offset = 1) - { - $key = $this->prefix . $key; - - $success = false; - $value = wincache_ucache_inc($key, $offset, $success); - - return ($success === true) ? $value : false; - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic decrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - * - * @codeCoverageIgnore - */ - public function decrement(string $key, int $offset = 1) - { - $key = $this->prefix . $key; - - $success = false; - $value = wincache_ucache_dec($key, $offset, $success); - - return ($success === true) ? $value : false; - } - - //-------------------------------------------------------------------- - - /** - * Will delete all items in the entire cache. - * - * @return boolean - * - * @codeCoverageIgnore - */ - public function clean() - { - return wincache_ucache_clear(); - } - - //-------------------------------------------------------------------- - - /** - * Returns information on the entire cache. - * - * The information returned and the structure of the data - * varies depending on the handler. - * - * @return mixed - * - * @codeCoverageIgnore - */ - public function getCacheInfo() - { - return wincache_ucache_info(true); - } - - //-------------------------------------------------------------------- - - /** - * Returns detailed information about the specific item in the cache. - * - * @param string $key Cache item name. - * - * @return mixed - * - * @codeCoverageIgnore - */ - public function getMetaData(string $key) - { - $key = $this->prefix . $key; - - if ($stored = wincache_ucache_info(false, $key)) - { - $age = $stored['ucache_entries'][1]['age_seconds']; - $ttl = $stored['ucache_entries'][1]['ttl_seconds']; - $hitcount = $stored['ucache_entries'][1]['hitcount']; - - return [ - 'expire' => $ttl - $age, - 'hitcount' => $hitcount, - 'age' => $age, - 'ttl' => $ttl, - ]; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Determines if the driver is supported on this system. - * - * @return boolean - */ - public function isSupported(): bool - { - return (extension_loaded('wincache') && ini_get('wincache.ucenabled')); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/CodeIgniter.php b/vendor/codeigniter4/framework/system/CodeIgniter.php deleted file mode 100644 index 5859268..0000000 --- a/vendor/codeigniter4/framework/system/CodeIgniter.php +++ /dev/null @@ -1,1129 +0,0 @@ -startTime = microtime(true); - $this->config = $config; - } - - //-------------------------------------------------------------------- - - /** - * Handles some basic app and environment setup. - */ - public function initialize() - { - // Set default locale on the server - locale_set_default($this->config->defaultLocale ?? 'en'); - - // Set default timezone on the server - date_default_timezone_set($this->config->appTimezone ?? 'UTC'); - - // Define environment variables - $this->detectEnvironment(); - $this->bootstrapEnvironment(); - - // Setup Exception Handling - Services::exceptions() - ->initialize(); - - $this->initializeKint(); - - if (! CI_DEBUG) - { - // @codeCoverageIgnoreStart - \Kint::$enabled_mode = false; - // @codeCoverageIgnoreEnd - } - } - - //-------------------------------------------------------------------- - - /** - * Initializes Kint - */ - protected function initializeKint() - { - // If we have KINT_DIR it means it's already loaded via composer - if (! defined('KINT_DIR')) - { - spl_autoload_register(function ($class) { - $class = explode('\\', $class); - - if ('Kint' !== array_shift($class)) - { - return; - } - - $file = SYSTEMPATH . 'ThirdParty/Kint/' . implode('/', $class) . '.php'; - - file_exists($file) && require_once $file; - }); - - require_once SYSTEMPATH . 'ThirdParty/Kint/init.php'; - } - - /** - * Config\Kint - */ - $config = config('Config\Kint'); - - \Kint::$max_depth = $config->maxDepth; - \Kint::$display_called_from = $config->displayCalledFrom; - \Kint::$expanded = $config->expanded; - - if (! empty($config->plugins) && is_array($config->plugins)) - { - \Kint::$plugins = $config->plugins; - } - - \Kint\Renderer\RichRenderer::$theme = $config->richTheme; - \Kint\Renderer\RichRenderer::$folder = $config->richFolder; - \Kint\Renderer\RichRenderer::$sort = $config->richSort; - if (! empty($config->richObjectPlugins) && is_array($config->richObjectPlugins)) - { - \Kint\Renderer\RichRenderer::$object_plugins = $config->richObjectPlugins; - } - if (! empty($config->richTabPlugins) && is_array($config->richTabPlugins)) - { - \Kint\Renderer\RichRenderer::$tab_plugins = $config->richTabPlugins; - } - - \Kint\Renderer\CliRenderer::$cli_colors = $config->cliColors; - \Kint\Renderer\CliRenderer::$force_utf8 = $config->cliForceUTF8; - \Kint\Renderer\CliRenderer::$detect_width = $config->cliDetectWidth; - \Kint\Renderer\CliRenderer::$min_terminal_width = $config->cliMinWidth; - } - - //-------------------------------------------------------------------- - - /** - * Launch the application! - * - * This is "the loop" if you will. The main entry point into the script - * that gets the required class instances, fires off the filters, - * tries to route the response, loads the controller and generally - * makes all of the pieces work together. - * - * @param \CodeIgniter\Router\RouteCollectionInterface $routes - * @param boolean $returnResponse - * - * @return boolean|\CodeIgniter\HTTP\RequestInterface|\CodeIgniter\HTTP\Response|\CodeIgniter\HTTP\ResponseInterface|mixed - * @throws \CodeIgniter\Router\Exceptions\RedirectException - * @throws \Exception - */ - public function run(RouteCollectionInterface $routes = null, bool $returnResponse = false) - { - $this->startBenchmark(); - - $this->getRequestObject(); - $this->getResponseObject(); - - $this->forceSecureAccess(); - - $this->spoofRequestMethod(); - - Events::trigger('pre_system'); - - // Check for a cached page. Execution will stop - // if the page has been cached. - $cacheConfig = new Cache(); - $response = $this->displayCache($cacheConfig); - if ($response instanceof ResponseInterface) - { - if ($returnResponse) - { - return $response; - } - - $this->response->pretend($this->useSafeOutput)->send(); - $this->callExit(EXIT_SUCCESS); - } - - try - { - return $this->handleRequest($routes, $cacheConfig, $returnResponse); - } - catch (RedirectException $e) - { - $logger = Services::logger(); - $logger->info('REDIRECTED ROUTE at ' . $e->getMessage()); - - // If the route is a 'redirect' route, it throws - // the exception with the $to as the message - $this->response->redirect(base_url($e->getMessage()), 'auto', $e->getCode()); - $this->sendResponse(); - - $this->callExit(EXIT_SUCCESS); - } - catch (PageNotFoundException $e) - { - $this->display404errors($e); - } - } - - //-------------------------------------------------------------------- - - /** - * Set our Response instance to "pretend" mode so that things like - * cookies and headers are not actually sent, allowing PHP 7.2+ to - * not complain when ini_set() function is used. - * - * @param boolean $safe - * - * @return $this - */ - public function useSafeOutput(bool $safe = true) - { - $this->useSafeOutput = $safe; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Handles the main request logic and fires the controller. - * - * @param \CodeIgniter\Router\RouteCollectionInterface $routes - * @param $cacheConfig - * @param boolean $returnResponse - * - * @return \CodeIgniter\HTTP\RequestInterface|\CodeIgniter\HTTP\Response|\CodeIgniter\HTTP\ResponseInterface|mixed - * @throws \CodeIgniter\Router\Exceptions\RedirectException - */ - protected function handleRequest(RouteCollectionInterface $routes = null, $cacheConfig, bool $returnResponse = false) - { - $routeFilter = $this->tryToRouteIt($routes); - - // Run "before" filters - $filters = Services::filters(); - - // If any filters were specified within the routes file, - // we need to ensure it's active for the current request - if (! is_null($routeFilter)) - { - $filters->enableFilter($routeFilter, 'before'); - $filters->enableFilter($routeFilter, 'after'); - } - - $uri = $this->request instanceof CLIRequest ? $this->request->getPath() : $this->request->uri->getPath(); - - // Never run filters when running through Spark cli - if (! defined('SPARKED')) - { - $possibleRedirect = $filters->run($uri, 'before'); - if ($possibleRedirect instanceof RedirectResponse) - { - return $possibleRedirect->send(); - } - // If a Response instance is returned, the Response will be sent back to the client and script execution will stop - if ($possibleRedirect instanceof ResponseInterface) - { - return $possibleRedirect->send(); - } - } - - $returned = $this->startController(); - - // Closure controller has run in startController(). - if (! is_callable($this->controller)) - { - $controller = $this->createController(); - - // Is there a "post_controller_constructor" event? - Events::trigger('post_controller_constructor'); - - $returned = $this->runController($controller); - } - else - { - $this->benchmark->stop('controller_constructor'); - $this->benchmark->stop('controller'); - } - - // If $returned is a string, then the controller output something, - // probably a view, instead of echoing it directly. Send it along - // so it can be used with the output. - $this->gatherOutput($cacheConfig, $returned); - - // Never run filters when running through Spark cli - if (! defined('SPARKED')) - { - $filters->setResponse($this->response); - // Run "after" filters - $response = $filters->run($uri, 'after'); - } - else - { - $response = $this->response; - - // Set response code for CLI command failures - if (is_numeric($returned) || $returned === false) - { - $response->setStatusCode(400); - } - } - - if ($response instanceof Response) - { - $this->response = $response; - } - - // Save our current URI as the previous URI in the session - // for safer, more accurate use with `previous_url()` helper function. - $this->storePreviousURL((string)current_url(true)); - - unset($uri); - - if (! $returnResponse) - { - $this->sendResponse(); - } - - //-------------------------------------------------------------------- - // Is there a post-system event? - //-------------------------------------------------------------------- - Events::trigger('post_system'); - - return $this->response; - } - - //-------------------------------------------------------------------- - - /** - * You can load different configurations depending on your - * current environment. Setting the environment also influences - * things like logging and error reporting. - * - * This can be set to anything, but default usage is: - * - * development - * testing - * production - */ - protected function detectEnvironment() - { - // Make sure ENVIRONMENT isn't already set by other means. - if (! defined('ENVIRONMENT')) - { - // running under Continuous Integration server? - if (getenv('CI') !== false) - { - define('ENVIRONMENT', 'testing'); - } - else - { - define('ENVIRONMENT', $_SERVER['CI_ENVIRONMENT'] ?? 'production'); - } - } - } - - //-------------------------------------------------------------------- - - /** - * Load any custom boot files based upon the current environment. - * - * If no boot file exists, we shouldn't continue because something - * is wrong. At the very least, they should have error reporting setup. - */ - protected function bootstrapEnvironment() - { - if (is_file(APPPATH . 'Config/Boot/' . ENVIRONMENT . '.php')) - { - require_once APPPATH . 'Config/Boot/' . ENVIRONMENT . '.php'; - } - else - { - // @codeCoverageIgnoreStart - header('HTTP/1.1 503 Service Unavailable.', true, 503); - echo 'The application environment is not set correctly.'; - exit(1); // EXIT_ERROR - // @codeCoverageIgnoreEnd - } - } - - //-------------------------------------------------------------------- - - /** - * Start the Benchmark - * - * The timer is used to display total script execution both in the - * debug toolbar, and potentially on the displayed page. - */ - protected function startBenchmark() - { - $this->startTime = microtime(true); - - $this->benchmark = Services::timer(); - $this->benchmark->start('total_execution', $this->startTime); - $this->benchmark->start('bootstrap'); - } - - //-------------------------------------------------------------------- - - /** - * Sets a Request object to be used for this request. - * Used when running certain tests. - * - * @param \CodeIgniter\HTTP\Request $request - * - * @return \CodeIgniter\CodeIgniter - */ - public function setRequest(Request $request) - { - $this->request = $request; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Get our Request object, (either IncomingRequest or CLIRequest) - * and set the server protocol based on the information provided - * by the server. - */ - protected function getRequestObject() - { - if ($this->request instanceof Request) - { - return; - } - - if (is_cli() && ENVIRONMENT !== 'testing') - { - // @codeCoverageIgnoreStart - $this->request = Services::clirequest($this->config); - // @codeCoverageIgnoreEnd - } - else - { - $this->request = Services::request($this->config); - // guess at protocol if needed - $this->request->setProtocolVersion($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1'); - } - } - - //-------------------------------------------------------------------- - - /** - * Get our Response object, and set some default values, including - * the HTTP protocol version and a default successful response. - */ - protected function getResponseObject() - { - $this->response = Services::response($this->config); - - if (! is_cli() || ENVIRONMENT === 'testing') - { - $this->response->setProtocolVersion($this->request->getProtocolVersion()); - } - - // Assume success until proven otherwise. - $this->response->setStatusCode(200); - } - - //-------------------------------------------------------------------- - - /** - * Force Secure Site Access? If the config value 'forceGlobalSecureRequests' - * is true, will enforce that all requests to this site are made through - * HTTPS. Will redirect the user to the current page with HTTPS, as well - * as set the HTTP Strict Transport Security header for those browsers - * that support it. - * - * @param integer $duration How long the Strict Transport Security - * should be enforced for this URL. - */ - protected function forceSecureAccess($duration = 31536000) - { - if ($this->config->forceGlobalSecureRequests !== true) - { - return; - } - - force_https($duration, $this->request, $this->response); - } - - //-------------------------------------------------------------------- - - /** - * Determines if a response has been cached for the given URI. - * - * @param \Config\Cache $config - * - * @throws \Exception - * - * @return boolean|\CodeIgniter\HTTP\ResponseInterface - */ - public function displayCache($config) - { - if ($cachedResponse = cache()->get($this->generateCacheName($config))) - { - $cachedResponse = unserialize($cachedResponse); - if (! is_array($cachedResponse) || ! isset($cachedResponse['output']) || ! isset($cachedResponse['headers'])) - { - throw new Exception('Error unserializing page cache'); - } - - $headers = $cachedResponse['headers']; - $output = $cachedResponse['output']; - - // Clear all default headers - foreach ($this->response->getHeaders() as $key => $val) - { - $this->response->removeHeader($key); - } - - // Set cached headers - foreach ($headers as $name => $value) - { - $this->response->setHeader($name, $value); - } - - $output = $this->displayPerformanceMetrics($output); - $this->response->setBody($output); - - return $this->response; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Tells the app that the final output should be cached. - * - * @param integer $time - * - * @return void - */ - public static function cache(int $time) - { - static::$cacheTTL = $time; - } - - //-------------------------------------------------------------------- - - /** - * Caches the full response from the current request. Used for - * full-page caching for very high performance. - * - * @param \Config\Cache $config - * - * @return mixed - */ - public function cachePage(Cache $config) - { - $headers = []; - foreach ($this->response->getHeaders() as $header) - { - $headers[$header->getName()] = $header->getValueLine(); - } - - return cache()->save( - $this->generateCacheName($config), serialize(['headers' => $headers, 'output' => $this->output]), static::$cacheTTL - ); - } - - //-------------------------------------------------------------------- - - /** - * Returns an array with our basic performance stats collected. - * - * @return array - */ - public function getPerformanceStats(): array - { - return [ - 'startTime' => $this->startTime, - 'totalTime' => $this->totalTime, - ]; - } - - //-------------------------------------------------------------------- - - /** - * Generates the cache name to use for our full-page caching. - * - * @param $config - * - * @return string - */ - protected function generateCacheName($config): string - { - if (get_class($this->request) === CLIRequest::class) - { - return md5($this->request->getPath()); - } - - $uri = $this->request->uri; - - if ($config->cacheQueryString) - { - $name = URI::createURIString( - $uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery() - ); - } - else - { - $name = URI::createURIString( - $uri->getScheme(), $uri->getAuthority(), $uri->getPath() - ); - } - - return md5($name); - } - - //-------------------------------------------------------------------- - - /** - * Replaces the memory_usage and elapsed_time tags. - * - * @param string $output - * - * @return string - */ - public function displayPerformanceMetrics(string $output): string - { - $this->totalTime = $this->benchmark->getElapsedTime('total_execution'); - - return str_replace('{elapsed_time}', $this->totalTime, $output); - } - - //-------------------------------------------------------------------- - - /** - * Try to Route It - As it sounds like, works with the router to - * match a route against the current URI. If the route is a - * "redirect route", will also handle the redirect. - * - * @param RouteCollectionInterface $routes An collection interface to use in place - * of the config file. - * - * @return string - * @throws \CodeIgniter\Router\Exceptions\RedirectException - */ - protected function tryToRouteIt(RouteCollectionInterface $routes = null) - { - if (empty($routes) || ! $routes instanceof RouteCollectionInterface) - { - require APPPATH . 'Config/Routes.php'; - } - - // $routes is defined in Config/Routes.php - $this->router = Services::router($routes, $this->request); - - $path = $this->determinePath(); - - $this->benchmark->stop('bootstrap'); - $this->benchmark->start('routing'); - - ob_start(); - - $this->controller = $this->router->handle($path); - $this->method = $this->router->methodName(); - - // If a {locale} segment was matched in the final route, - // then we need to set the correct locale on our Request. - if ($this->router->hasLocale()) - { - $this->request->setLocale($this->router->getLocale()); - } - - $this->benchmark->stop('routing'); - - return $this->router->getFilter(); - } - - //-------------------------------------------------------------------- - - /** - * Determines the path to use for us to try to route to, based - * on user input (setPath), or the CLI/IncomingRequest path. - */ - protected function determinePath() - { - if (! empty($this->path)) - { - return $this->path; - } - - return (is_cli() && ! (ENVIRONMENT === 'testing')) ? $this->request->getPath() : $this->request->uri->getPath(); - } - - //-------------------------------------------------------------------- - - /** - * Allows the request path to be set from outside the class, - * instead of relying on CLIRequest or IncomingRequest for the path. - * - * This is primarily used by the Console. - * - * @param string $path - * - * @return $this - */ - public function setPath(string $path) - { - $this->path = $path; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Now that everything has been setup, this method attempts to run the - * controller method and make the script go. If it's not able to, will - * show the appropriate Page Not Found error. - */ - protected function startController() - { - $this->benchmark->start('controller'); - $this->benchmark->start('controller_constructor'); - - // Is it routed to a Closure? - if (is_object($this->controller) && (get_class($this->controller) === 'Closure')) - { - $controller = $this->controller; - return $controller(...$this->router->params()); - } - - // No controller specified - we don't know what to do now. - if (empty($this->controller)) - { - throw PageNotFoundException::forEmptyController(); - } - - // Try to autoload the class - if (! class_exists($this->controller, true) || $this->method[0] === '_') - { - throw PageNotFoundException::forControllerNotFound($this->controller, $this->method); - } - else if (! method_exists($this->controller, '_remap') && - ! is_callable([$this->controller, $this->method], false) - ) - { - throw PageNotFoundException::forMethodNotFound($this->method); - } - } - - //-------------------------------------------------------------------- - - /** - * Instantiates the controller class. - * - * @return mixed - */ - protected function createController() - { - $class = new $this->controller(); - $class->initController($this->request, $this->response, Services::logger()); - - $this->benchmark->stop('controller_constructor'); - - return $class; - } - - //-------------------------------------------------------------------- - - /** - * Runs the controller, allowing for _remap methods to function. - * - * @param mixed $class - * - * @return mixed - */ - protected function runController($class) - { - // If this is a console request then use the input segments as parameters - $params = defined('SPARKED') ? $this->request->getSegments() : $this->router->params(); - - if (method_exists($class, '_remap')) - { - $output = $class->_remap($this->method, ...$params); - } - else - { - $output = $class->{$this->method}(...$params); - } - - $this->benchmark->stop('controller'); - - return $output; - } - - //-------------------------------------------------------------------- - - /** - * Displays a 404 Page Not Found error. If set, will try to - * call the 404Override controller/method that was set in routing config. - * - * @param PageNotFoundException $e - */ - protected function display404errors(PageNotFoundException $e) - { - // Is there a 404 Override available? - if ($override = $this->router->get404Override()) - { - if ($override instanceof Closure) - { - echo $override($e->getMessage()); - } - else if (is_array($override)) - { - $this->benchmark->start('controller'); - $this->benchmark->start('controller_constructor'); - - $this->controller = $override[0]; - $this->method = $override[1]; - - unset($override); - - $controller = $this->createController(); - $this->runController($controller); - } - - $cacheConfig = new Cache(); - $this->gatherOutput($cacheConfig); - $this->sendResponse(); - - return; - } - - // Display 404 Errors - $this->response->setStatusCode($e->getCode()); - - if (ENVIRONMENT !== 'testing') - { - // @codeCoverageIgnoreStart - if (ob_get_level() > 0) - { - ob_end_flush(); - } - // @codeCoverageIgnoreEnd - } - else - { - // When testing, one is for phpunit, another is for test case. - if (ob_get_level() > 2) - { - ob_end_flush(); - } - } - - throw PageNotFoundException::forPageNotFound(ENVIRONMENT !== 'production' || is_cli() ? $e->getMessage() : ''); - } - - //-------------------------------------------------------------------- - - /** - * Gathers the script output from the buffer, replaces some execution - * time tag in the output and displays the debug toolbar, if required. - * - * @param null $cacheConfig - * @param null $returned - */ - protected function gatherOutput($cacheConfig = null, $returned = null) - { - $this->output = ob_get_contents(); - // If buffering is not null. - // Clean (erase) the output buffer and turn off output buffering - if (ob_get_length()) - { - ob_end_clean(); - } - - if ($returned instanceof DownloadResponse) - { - $this->response = $returned; - return; - } - // If the controller returned a response object, - // we need to grab the body from it so it can - // be added to anything else that might have been - // echoed already. - // We also need to save the instance locally - // so that any status code changes, etc, take place. - if ($returned instanceof Response) - { - $this->response = $returned; - $returned = $returned->getBody(); - } - - if (is_string($returned)) - { - $this->output .= $returned; - } - - // Cache it without the performance metrics replaced - // so that we can have live speed updates along the way. - if (static::$cacheTTL > 0) - { - $this->cachePage($cacheConfig); - } - - $this->output = $this->displayPerformanceMetrics($this->output); - - $this->response->setBody($this->output); - } - - //-------------------------------------------------------------------- - - /** - * If we have a session object to use, store the current URI - * as the previous URI. This is called just prior to sending the - * response to the client, and will make it available next request. - * - * This helps provider safer, more reliable previous_url() detection. - * - * @param \CodeIgniter\HTTP\URI $uri - */ - public function storePreviousURL($uri) - { - // Ignore CLI requests - if (is_cli()) - { - return; - } - // Ignore AJAX requests - if (method_exists($this->request, 'isAJAX') && $this->request->isAJAX()) - { - return; - } - - // This is mainly needed during testing... - if (is_string($uri)) - { - $uri = new URI($uri); - } - - if (isset($_SESSION)) - { - $_SESSION['_ci_previous_url'] = (string) $uri; - } - } - - //-------------------------------------------------------------------- - - /** - * Modifies the Request Object to use a different method if a POST - * variable called _method is found. - */ - public function spoofRequestMethod() - { - // Only works with POSTED forms - if ($this->request->getMethod() !== 'post') - { - return; - } - - $method = $this->request->getPost('_method'); - - if (empty($method)) - { - return; - } - - $this->request = $this->request->setMethod($method); - } - - /** - * Sends the output of this request back to the client. - * This is what they've been waiting for! - */ - protected function sendResponse() - { - $this->response->pretend($this->useSafeOutput)->send(); - } - - //-------------------------------------------------------------------- - - /** - * Exits the application, setting the exit code for CLI-based applications - * that might be watching. - * - * Made into a separate method so that it can be mocked during testing - * without actually stopping script execution. - * - * @param $code - */ - protected function callExit($code) - { - // @codeCoverageIgnoreStart - exit($code); - // @codeCoverageIgnoreEnd - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Commands/Cache/ClearCache.php b/vendor/codeigniter4/framework/system/Commands/Cache/ClearCache.php deleted file mode 100644 index 35c6581..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Cache/ClearCache.php +++ /dev/null @@ -1,73 +0,0 @@ - 'The cache driver to use', - ]; - - /** - * Creates a new migration file with the current timestamp. - * - * @param array $params - */ - public function run(array $params = []) - { - $config = config('Cache'); - - $handler = $params[0] ?? $config->handler; - if (! array_key_exists($handler, $config->validHandlers)) - { - CLI::error($handler . ' is not a valid cache handler.'); - return; - } - - $config->handler = $handler; - $cache = CacheFactory::getHandler($config); - - if (! $cache->clean()) - { - CLI::error('Error while clearing the cache.'); - return; - } - - CLI::write(CLI::color('Done', 'green')); - } -} diff --git a/vendor/codeigniter4/framework/system/Commands/Database/CreateMigration.php b/vendor/codeigniter4/framework/system/Commands/Database/CreateMigration.php deleted file mode 100644 index 3983d67..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Database/CreateMigration.php +++ /dev/null @@ -1,186 +0,0 @@ - 'The migration file name', - ]; - - /** - * the Command's Options - * - * @var array - */ - protected $options = [ - '-n' => 'Set migration namespace', - ]; - - /** - * Creates a new migration file with the current timestamp. - * - * @param array $params - */ - public function run(array $params = []) - { - helper('inflector'); - $name = array_shift($params); - - if (empty($name)) - { - $name = CLI::prompt(lang('Migrations.nameMigration')); - } - - if (empty($name)) - { - CLI::error(lang('Migrations.badCreateName')); - return; - } - - $ns = $params['-n'] ?? CLI::getOption('n'); - $homepath = APPPATH; - - if (! empty($ns)) - { - // Get all namespaces - $namespaces = Services::autoloader()->getNamespace(); - - foreach ($namespaces as $namespace => $path) - { - if ($namespace === $ns) - { - $homepath = realpath(reset($path)); - break; - } - } - } - else - { - $ns = 'App'; - } - - // Always use UTC/GMT so global teams can work together - $config = config('Migrations'); - $fileName = gmdate($config->timestampFormat) . $name; - - // full path - $path = $homepath . '/Database/Migrations/' . $fileName . '.php'; - - // Class name should be pascal case now (camel case with upper first letter) - $name = pascalize($name); - - $template = << 'The seeder file name', - ]; - - /** - * the Command's Options - * - * @var array - */ - protected $options = [ - '-n' => 'Set seeder namespace', - ]; - - /** - * Creates a new migration file with the current timestamp. - * - * @param array $params - */ - public function run(array $params = []) - { - helper('inflector'); - - $name = array_shift($params); - - if (empty($name)) - { - $name = CLI::prompt(lang('Seed.nameFile'), null, 'required'); - } - - $ns = $params['-n'] ?? CLI::getOption('n'); - $homepath = APPPATH; - - if (! empty($ns)) - { - // Get all namespaces - $namespaces = Services::autoloader()->getNamespace(); - - foreach ($namespaces as $namespace => $path) - { - if ($namespace === $ns) - { - $homepath = realpath(reset($path)) . DIRECTORY_SEPARATOR; - break; - } - } - } - else - { - $ns = defined('APP_NAMESPACE') ? APP_NAMESPACE : 'App'; - } - - // full path - $path = $homepath . 'Database/Seeds/' . $name . '.php'; - - // Class name should be pascal case now (camel case with upper first letter) - $name = pascalize($name); - - $template = << 'Set migration namespace', - '-g' => 'Set database group', - '-all' => 'Set for all namespaces, will ignore (-n) option', - ]; - - /** - * Ensures that all migrations have been run. - * - * @param array $params - */ - public function run(array $params = []) - { - $runner = Services::migrations(); - $runner->clearCliMessages(); - - CLI::write(lang('Migrations.latest'), 'yellow'); - - $namespace = $params['-n'] ?? CLI::getOption('n'); - $group = $params['-g'] ?? CLI::getOption('g'); - - try - { - // Check for 'all' namespaces - if ($this->isAllNamespace($params)) - { - $runner->setNamespace(null); - } - // Check for a specified namespace - elseif ($namespace) - { - $runner->setNamespace($namespace); - } - - if (! $runner->latest($group)) - { - CLI::write(lang('Migrations.generalFault'), 'red'); - } - - $messages = $runner->getCliMessages(); - foreach ($messages as $message) - { - CLI::write($message); - } - - CLI::write('Done'); - } - catch (\Exception $e) - { - $this->showError($e); - } - } - - /** - * To migrate all namespaces to the latest migration - * - * Demo: - * 1. command line: php spark migrate:latest -all - * 2. command file: $this->call('migrate:latest', ['-g' => 'test','-all']); - * - * @param array $params - * @return boolean - */ - private function isAllNamespace(array $params): bool - { - if (array_search('-all', $params) !== false) - { - return true; - } - - return ! is_null(CLI::getOption('all')); - } - -} diff --git a/vendor/codeigniter4/framework/system/Commands/Database/MigrateRefresh.php b/vendor/codeigniter4/framework/system/Commands/Database/MigrateRefresh.php deleted file mode 100644 index bf6b4f8..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Database/MigrateRefresh.php +++ /dev/null @@ -1,127 +0,0 @@ - 'Set migration namespace', - '-g' => 'Set database group', - '-all' => 'Set latest for all namespace, will ignore (-n) option', - '-f' => 'Force command - this option allows you to bypass the confirmation question when running this command in a production environment', - ]; - - /** - * Does a rollback followed by a latest to refresh the current state - * of the database. - * - * @param array $params - */ - public function run(array $params = []) - { - $params = ['-b' => 0]; - - if (ENVIRONMENT === 'production') - { - $force = $params['-f'] ?? CLI::getOption('f'); - if (is_null($force) && CLI::prompt(lang('Migrations.refreshConfirm'), ['y', 'n']) === 'n') - { - return; - } - - $params['-f'] = ''; - } - - $this->call('migrate:rollback', $params); - $this->call('migrate'); - } - -} diff --git a/vendor/codeigniter4/framework/system/Commands/Database/MigrateRollback.php b/vendor/codeigniter4/framework/system/Commands/Database/MigrateRollback.php deleted file mode 100644 index b2dca1c..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Database/MigrateRollback.php +++ /dev/null @@ -1,151 +0,0 @@ - 'Specify a batch to roll back to; e.g. "3" to return to batch #3 or "-2" to roll back twice', - '-g' => 'Set database group', - '-f' => 'Force command - this option allows you to bypass the confirmation question when running this command in a production environment', - ]; - - /** - * Runs all of the migrations in reverse order, until they have - * all been un-applied. - * - * @param array $params - */ - public function run(array $params = []) - { - if (ENVIRONMENT === 'production') - { - $force = $params['-f'] ?? CLI::getOption('f'); - if (is_null($force) && CLI::prompt(lang('Migrations.rollBackConfirm'), ['y', 'n']) === 'n') - { - return; - } - } - - $runner = Services::migrations(); - - $group = $params['-g'] ?? CLI::getOption('g'); - - if (! is_null($group)) - { - $runner->setGroup($group); - } - - try - { - $batch = $params['-b'] ?? CLI::getOption('b') ?? $runner->getLastBatch() - 1; - CLI::write(lang('Migrations.rollingBack') . ' ' . $batch, 'yellow'); - - if (! $runner->regress($batch)) - { - CLI::write(lang('Migrations.generalFault'), 'red'); - } - - $messages = $runner->getCliMessages(); - foreach ($messages as $message) - { - CLI::write($message); - } - - CLI::write('Done'); - } - catch (\Exception $e) - { - $this->showError($e); - } - } -} diff --git a/vendor/codeigniter4/framework/system/Commands/Database/MigrateStatus.php b/vendor/codeigniter4/framework/system/Commands/Database/MigrateStatus.php deleted file mode 100644 index 94ad3ea..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Database/MigrateStatus.php +++ /dev/null @@ -1,192 +0,0 @@ - 'Set database group', - ]; - - /** - * Namespaces to ignore when looking for migrations. - * - * @var type - */ - protected $ignoredNamespaces = [ - 'CodeIgniter', - 'Config', - 'Tests\Support', - 'Kint', - 'Laminas\ZendFrameworkBridge', - 'Laminas\Escaper', - 'Psr\Log', - ]; - - /** - * Displays a list of all migrations and whether they've been run or not. - * - * @param array $params - */ - public function run(array $params = []) - { - $runner = Services::migrations(); - - $group = $params['-g'] ?? CLI::getOption('g'); - - if (! is_null($group)) - { - $runner->setGroup($group); - } - - // Get all namespaces - $namespaces = Services::autoloader()->getNamespace(); - - // Determines whether any migrations were found - $found = false; - - // Loop for all $namespaces - foreach ($namespaces as $namespace => $path) - { - if (in_array($namespace, $this->ignoredNamespaces)) - { - continue; - } - - $runner->setNamespace($namespace); - $migrations = $runner->findMigrations(); - - if (empty($migrations)) - { - continue; - } - - $found = true; - $history = $runner->getHistory(); - - CLI::write($namespace); - - ksort($migrations); - - $max = 0; - foreach ($migrations as $version => $migration) - { - $file = substr($migration->name, strpos($migration->name, $version . '_')); - $migrations[$version]->name = $file; - - $max = max($max, strlen($file)); - } - - CLI::write(' ' . str_pad(lang('Migrations.filename'), $max + 4) . lang('Migrations.on'), 'yellow'); - - foreach ($migrations as $uid => $migration) - { - $date = ''; - foreach ($history as $row) - { - if ($runner->getObjectUid($row) !== $uid) - { - continue; - } - - $date = date('Y-m-d H:i:s', $row->time); - } - CLI::write(str_pad(' ' . $migration->name, $max + 6) . ($date ? $date : '---')); - } - } - - if (! $found) - { - CLI::error(lang('Migrations.noneFound')); - } - } - -} diff --git a/vendor/codeigniter4/framework/system/Commands/Database/Seed.php b/vendor/codeigniter4/framework/system/Commands/Database/Seed.php deleted file mode 100644 index ee09e0a..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Database/Seed.php +++ /dev/null @@ -1,132 +0,0 @@ - 'The seeder name to run', - ]; - - /** - * the Command's Options - * - * @var array - */ - protected $options = []; - - /** - * Passes to Seeder to populate the database. - * - * @param array $params - */ - public function run(array $params = []) - { - $seeder = new Seeder(new \Config\Database()); - - $seedName = array_shift($params); - - if (empty($seedName)) - { - $seedName = CLI::prompt(lang('Migrations.migSeeder'), 'DatabaseSeeder'); - } - - if (empty($seedName)) - { - CLI::error(lang('Migrations.migMissingSeeder')); - return; - } - - try - { - $seeder->call($seedName); - } - catch (\Exception $e) - { - $this->showError($e); - } - } - -} diff --git a/vendor/codeigniter4/framework/system/Commands/Help.php b/vendor/codeigniter4/framework/system/Commands/Help.php deleted file mode 100644 index 5769685..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Help.php +++ /dev/null @@ -1,121 +0,0 @@ - 'The command name [default: "help"]', - ]; - - /** - * the Command's Options - * - * @var array - */ - protected $options = []; - - //-------------------------------------------------------------------- - - /** - * Displays the help for the spark cli script itself. - * - * @param array $params - */ - public function run(array $params) - { - $command = array_shift($params); - if (is_null($command)) - { - $command = 'help'; - } - - $commands = $this->commands->getCommands(); - $class = new $commands[$command]['class']($this->logger, $this->commands); - - $class->showHelp(); - } - -} diff --git a/vendor/codeigniter4/framework/system/Commands/ListCommands.php b/vendor/codeigniter4/framework/system/Commands/ListCommands.php deleted file mode 100644 index c20fe32..0000000 --- a/vendor/codeigniter4/framework/system/Commands/ListCommands.php +++ /dev/null @@ -1,196 +0,0 @@ -commands->getCommands(); - - $this->describeCommands($commands); - - CLI::newLine(); - } - - //-------------------------------------------------------------------- - - /** - * Displays the commands on the CLI. - * - * @param array $commands - */ - protected function describeCommands(array $commands = []) - { - ksort($commands); - - // Sort into buckets by group - $sorted = []; - $maxTitleLength = 0; - - foreach ($commands as $title => $command) - { - if (! isset($sorted[$command['group']])) - { - $sorted[$command['group']] = []; - } - - $sorted[$command['group']][$title] = $command; - - $maxTitleLength = max($maxTitleLength, strlen($title)); - } - - ksort($sorted); - - // Display it all... - foreach ($sorted as $group => $items) - { - CLI::newLine(); - CLI::write($group); - - foreach ($items as $title => $item) - { - $title = $this->padTitle($title, $maxTitleLength, 2, 2); - - $out = CLI::color($title, 'yellow'); - - if (isset($item['description'])) - { - $out .= CLI::wrap($item['description'], 125, strlen($title)); - } - - CLI::write($out); - } - } - } - - //-------------------------------------------------------------------- - - /** - * Pads our string out so that all titles are the same length to nicely line up descriptions. - * - * @param string $item - * @param integer $max - * @param integer $extra // How many extra spaces to add at the end - * @param integer $indent - * - * @return string - */ - protected function padTitle(string $item, int $max, int $extra = 2, int $indent = 0): string - { - $max += $extra + $indent; - - $item = str_repeat(' ', $indent) . $item; - - return str_pad($item, $max); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Commands/Server/Serve.php b/vendor/codeigniter4/framework/system/Commands/Server/Serve.php deleted file mode 100644 index 9e65862..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Server/Serve.php +++ /dev/null @@ -1,168 +0,0 @@ - 'The PHP Binary [default: "PHP_BINARY"]', - '-host' => 'The HTTP Host [default: "localhost"]', - '-port' => 'The HTTP Host Port [default: "8080"]', - ]; - - /** - * Run the server - * - * @param array $params Parameters - * - * @return void - */ - public function run(array $params) - { - // Valid PHP Version? - if (phpversion() < $this->minPHPVersion) - { - // @codeCoverageIgnoreStart - die('Your PHP version must be ' . $this->minPHPVersion . - ' or higher to run CodeIgniter. Current version: ' . phpversion()); - // @codeCoverageIgnoreEnd - } - - // Collect any user-supplied options and apply them. - $php = escapeshellarg(CLI::getOption('php') ?? PHP_BINARY); - $host = CLI::getOption('host') ?? 'localhost'; - $port = (int) (CLI::getOption('port') ?? '8080') + $this->portOffset; - - // Get the party started. - CLI::write('CodeIgniter development server started on http://' . $host . ':' . $port, 'green'); - CLI::write('Press Control-C to stop.'); - - // Set the Front Controller path as Document Root. - $docroot = escapeshellarg(FCPATH); - - // Mimic Apache's mod_rewrite functionality with user settings. - $rewrite = escapeshellarg(__DIR__ . '/rewrite.php'); - - // Call PHP's built-in webserver, making sure to set our - // base path to the public folder, and to use the rewrite file - // to ensure our environment is set and it simulates basic mod_rewrite. - passthru($php . ' -S ' . $host . ':' . $port . ' -t ' . $docroot . ' ' . $rewrite, $status); - - if ($status && $this->portOffset < $this->tries) - { - $this->portOffset += 1; - - $this->run($params); - } - } - -} diff --git a/vendor/codeigniter4/framework/system/Commands/Server/rewrite.php b/vendor/codeigniter4/framework/system/Commands/Server/rewrite.php deleted file mode 100644 index 94b7d15..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Server/rewrite.php +++ /dev/null @@ -1,35 +0,0 @@ - 'Set migration namespace', - '-g' => 'Set database group', - '-t' => 'Set table name', - ]; - - /** - * Creates a new migration file with the current timestamp. - * - * @param array $params - */ - public function run(array $params = []) - { - $config = new App(); - - $tableName = CLI::getOption('t') ?? 'ci_sessions'; - - $path = APPPATH . 'Database/Migrations/' . date('YmdHis_') . 'create_' . $tableName . '_table' . '.php'; - - $data = [ - 'namespace' => CLI::getOption('n') ?? APP_NAMESPACE ?? 'App', - 'DBGroup' => CLI::getOption('g'), - 'tableName' => $tableName, - 'matchIP' => $config->sessionMatchIP ?? false, - ]; - - $template = view('\CodeIgniter\Commands\Sessions\Views\migration.tpl.php', $data, ['debug' => false]); - $template = str_replace('@php', '\Database\Migrations; - -use CodeIgniter\Database\Migration; - -class Migration_create__table extends Migration -{ - - protected $DBGroup = ''; - - - public function up() - { - $this->forge->addField([ - 'id' => [ - 'type' => 'VARCHAR', - 'constraint' => 128, - 'null' => false - ], - 'ip_address' => [ - 'type' => 'VARCHAR', - 'constraint' => 45, - 'null' => false - ], - 'timestamp' => [ - 'type' => 'INT', - 'constraint' => 10, - 'unsigned' => true, - 'null' => false, - 'default' => 0 - ], - 'data' => [ - 'type' => 'TEXT', - 'null' => false, - 'default' => '' - ], - ]); - - $this->forge->addKey(['id', 'ip_address'], true); - - $this->forge->addKey('id', true); - - $this->forge->addKey('timestamp'); - $this->forge->createTable('', true); - } - - //-------------------------------------------------------------------- - - public function down() - { - $this->forge->dropTable('', true); - } -} diff --git a/vendor/codeigniter4/framework/system/Commands/Utilities/Namespaces.php b/vendor/codeigniter4/framework/system/Commands/Utilities/Namespaces.php deleted file mode 100644 index 0472277..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Utilities/Namespaces.php +++ /dev/null @@ -1,131 +0,0 @@ -psr4 as $ns => $path) - { - $path = realpath($path) ?: $path; - - $tbody[] = [ - $ns, - realpath($path) ?: $path, - is_dir($path) ? 'Yes' : 'MISSING', - ]; - } - - $thead = [ - 'Namespace', - 'Path', - 'Found?', - ]; - - CLI::table($tbody, $thead); - } - -} diff --git a/vendor/codeigniter4/framework/system/Commands/Utilities/Routes.php b/vendor/codeigniter4/framework/system/Commands/Utilities/Routes.php deleted file mode 100644 index 4d4a2ef..0000000 --- a/vendor/codeigniter4/framework/system/Commands/Utilities/Routes.php +++ /dev/null @@ -1,150 +0,0 @@ -getRoutes($method); - - foreach ($routes as $route => $handler) - { - // filter for strings, as callbacks aren't displayable - if (is_string($handler)) - { - $tbody[] = [ - strtoupper($method), - $route, - $handler, - ]; - } - } - } - - $thead = [ - 'Method', - 'Route', - 'Handler', - ]; - - CLI::table($tbody, $thead); - } - -} diff --git a/vendor/codeigniter4/framework/system/Common.php b/vendor/codeigniter4/framework/system/Common.php deleted file mode 100644 index 22dd413..0000000 --- a/vendor/codeigniter4/framework/system/Common.php +++ /dev/null @@ -1,1142 +0,0 @@ -appTimezone; - } -} - -if (! function_exists('cache')) -{ - /** - * A convenience method that provides access to the Cache - * object. If no parameter is provided, will return the object, - * otherwise, will attempt to return the cached value. - * - * Examples: - * cache()->save('foo', 'bar'); - * $foo = cache('bar'); - * - * @param string|null $key - * - * @return \CodeIgniter\Cache\CacheInterface|mixed - */ - function cache(string $key = null) - { - $cache = Services::cache(); - - // No params - return cache object - if (is_null($key)) - { - return $cache; - } - - // Still here? Retrieve the value. - return $cache->get($key); - } -} - -if (! function_exists('command')) -{ - /** - * Runs a single command. - * Input expected in a single string as would - * be used on the command line itself: - * - * > command('migrate:create SomeMigration'); - * - * @param string $command - * - * @return false|string - */ - function command(string $command) - { - $runner = service('commands'); - - $params = explode(' ', $command); - $command = array_shift($params); - - ob_start(); - $runner->run($command, $params); - $output = ob_get_clean(); - - return $output; - } -} - -if (! function_exists('config')) -{ - /** - * More simple way of getting config instances - * - * @param string $name - * @param boolean $getShared - * - * @return mixed - */ - function config(string $name, bool $getShared = true) - { - return Config::get($name, $getShared); - } -} - -if (! function_exists('csrf_token')) -{ - /** - * Returns the CSRF token name. - * Can be used in Views when building hidden inputs manually, - * or used in javascript vars when using APIs. - * - * @return string - */ - function csrf_token(): string - { - $config = config(App::class); - - return $config->CSRFTokenName; - } -} - -if (! function_exists('csrf_header')) -{ - /** - * Returns the CSRF header name. - * Can be used in Views by adding it to the meta tag - * or used in javascript to define a header name when using APIs. - * - * @return string - */ - function csrf_header(): string - { - $config = config(App::class); - - return $config->CSRFHeaderName; - } -} - -if (! function_exists('csrf_hash')) -{ - /** - * Returns the current hash value for the CSRF protection. - * Can be used in Views when building hidden inputs manually, - * or used in javascript vars for API usage. - * - * @return string - */ - function csrf_hash(): string - { - $security = Services::security(null, true); - - return $security->getCSRFHash(); - } -} - -if (! function_exists('csrf_field')) -{ - /** - * Generates a hidden input field for use within manually generated forms. - * - * @param string|null $id - * - * @return string - */ - function csrf_field(string $id = null): string - { - return ''; - } -} - -if (! function_exists('csrf_meta')) -{ - /** - * Generates a meta tag for use within javascript calls. - * - * @param string|null $id - * - * @return string - */ - function csrf_meta(string $id = null): string - { - return ''; - } -} - -if (! function_exists('db_connect')) -{ - /** - * Grabs a database connection and returns it to the user. - * - * This is a convenience wrapper for \Config\Database::connect() - * and supports the same parameters. Namely: - * - * When passing in $db, you may pass any of the following to connect: - * - group name - * - existing connection instance - * - array of database configuration values - * - * If $getShared === false then a new connection instance will be provided, - * otherwise it will all calls will return the same instance. - * - * @param \CodeIgniter\Database\ConnectionInterface|array|string $db - * @param boolean $getShared - * - * @return \CodeIgniter\Database\BaseConnection - */ - function db_connect($db = null, bool $getShared = true) - { - return Database::connect($db, $getShared); - } -} - -if (! function_exists('dd')) -{ - /** - * Prints a Kint debug report and exits. - * - * @param array ...$vars - * - * @codeCoverageIgnore Can't be tested ... exits - */ - function dd(...$vars) - { - // @codeCoverageIgnoreStart - Kint::$aliases[] = 'dd'; - Kint::dump(...$vars); - exit; - // @codeCoverageIgnoreEnd - } -} - -if (! function_exists('env')) -{ - /** - * Allows user to retrieve values from the environment - * variables that have been set. Especially useful for - * retrieving values set from the .env file for - * use in config files. - * - * @param string $key - * @param null $default - * - * @return mixed - */ - function env(string $key, $default = null) - { - $value = getenv($key); - if ($value === false) - { - $value = $_ENV[$key] ?? $_SERVER[$key] ?? false; - } - - // Not found? Return the default value - if ($value === false) - { - return $default; - } - - // Handle any boolean values - switch (strtolower($value)) - { - case 'true': - return true; - case 'false': - return false; - case 'empty': - return ''; - case 'null': - return null; - } - - return $value; - } -} - -if (! function_exists('esc')) -{ - /** - * Performs simple auto-escaping of data for security reasons. - * Might consider making this more complex at a later date. - * - * If $data is a string, then it simply escapes and returns it. - * If $data is an array, then it loops over it, escaping each - * 'value' of the key/value pairs. - * - * Valid context values: html, js, css, url, attr, raw, null - * - * @param string|array $data - * @param string $context - * @param string $encoding - * - * @return string|array - * @throws \InvalidArgumentException - */ - function esc($data, string $context = 'html', string $encoding = null) - { - if (is_array($data)) - { - foreach ($data as &$value) - { - $value = esc($value, $context); - } - } - - if (is_string($data)) - { - $context = strtolower($context); - - // Provide a way to NOT escape data since - // this could be called automatically by - // the View library. - if (empty($context) || $context === 'raw') - { - return $data; - } - - if (! in_array($context, ['html', 'js', 'css', 'url', 'attr'])) - { - throw new InvalidArgumentException('Invalid escape context provided.'); - } - - if ($context === 'attr') - { - $method = 'escapeHtmlAttr'; - } - else - { - $method = 'escape' . ucfirst($context); - } - - static $escaper; - if (! $escaper) - { - $escaper = new Escaper($encoding); - } - - if ($encoding && $escaper->getEncoding() !== $encoding) - { - $escaper = new Escaper($encoding); - } - - $data = $escaper->$method($data); - } - - return $data; - } -} - -if (! function_exists('force_https')) -{ - /** - * Used to force a page to be accessed in via HTTPS. - * Uses a standard redirect, plus will set the HSTS header - * for modern browsers that support, which gives best - * protection against man-in-the-middle attacks. - * - * @see https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security - * - * @param integer $duration How long should the SSL header be set for? (in seconds) - * Defaults to 1 year. - * @param RequestInterface $request - * @param ResponseInterface $response - * - * @throws \CodeIgniter\HTTP\Exceptions\HTTPException - */ - function force_https(int $duration = 31536000, RequestInterface $request = null, ResponseInterface $response = null) - { - if (is_null($request)) - { - $request = Services::request(null, true); - } - if (is_null($response)) - { - $response = Services::response(null, true); - } - - if ((ENVIRONMENT !== 'testing' && (is_cli() || $request->isSecure())) || (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'test')) - { - // @codeCoverageIgnoreStart - return; - // @codeCoverageIgnoreEnd - } - - // If the session status is active, we should regenerate - // the session ID for safety sake. - if (ENVIRONMENT !== 'testing' && session_status() === PHP_SESSION_ACTIVE) - { - // @codeCoverageIgnoreStart - Services::session(null, true) - ->regenerate(); - // @codeCoverageIgnoreEnd - } - - $baseURL = config(App::class)->baseURL; - - if (strpos($baseURL, 'https://') === 0) - { - $baseURL = (string) substr($baseURL, strlen('https://')); - } - elseif (strpos($baseURL, 'http://') === 0) - { - $baseURL = (string) substr($baseURL, strlen('http://')); - } - - $uri = URI::createURIString( - 'https', $baseURL, $request->uri->getPath(), // Absolute URIs should use a "/" for an empty path - $request->uri->getQuery(), $request->uri->getFragment() - ); - - // Set an HSTS header - $response->setHeader('Strict-Transport-Security', 'max-age=' . $duration); - $response->redirect($uri); - $response->sendHeaders(); - - if (ENVIRONMENT !== 'testing') - { - // @codeCoverageIgnoreStart - exit(); - // @codeCoverageIgnoreEnd - } - } -} - -if (! function_exists('function_usable')) -{ - /** - * Function usable - * - * Executes a function_exists() check, and if the Suhosin PHP - * extension is loaded - checks whether the function that is - * checked might be disabled in there as well. - * - * This is useful as function_exists() will return FALSE for - * functions disabled via the *disable_functions* php.ini - * setting, but not for *suhosin.executor.func.blacklist* and - * *suhosin.executor.disable_eval*. These settings will just - * terminate script execution if a disabled function is executed. - * - * The above described behavior turned out to be a bug in Suhosin, - * but even though a fix was committed for 0.9.34 on 2012-02-12, - * that version is yet to be released. This function will therefore - * be just temporary, but would probably be kept for a few years. - * - * @link http://www.hardened-php.net/suhosin/ - * @param string $function_name Function to check for - * @return boolean TRUE if the function exists and is safe to call, - * FALSE otherwise. - * - * @codeCoverageIgnore This is too exotic - */ - function function_usable(string $function_name): bool - { - static $_suhosin_func_blacklist; - - if (function_exists($function_name)) - { - if (! isset($_suhosin_func_blacklist)) - { - $_suhosin_func_blacklist = extension_loaded('suhosin') ? explode(',', trim(ini_get('suhosin.executor.func.blacklist'))) : []; - } - - return ! in_array($function_name, $_suhosin_func_blacklist, true); - } - - return false; - } -} - -if (! function_exists('helper')) -{ - /** - * Loads a helper file into memory. Supports namespaced helpers, - * both in and out of the 'helpers' directory of a namespaced directory. - * - * Will load ALL helpers of the matching name, in the following order: - * 1. app/Helpers - * 2. {namespace}/Helpers - * 3. system/Helpers - * - * @param string|array $filenames - * @throws \CodeIgniter\Files\Exceptions\FileNotFoundException - */ - function helper($filenames) - { - $loader = Services::locator(true); - - if (! is_array($filenames)) - { - $filenames = [$filenames]; - } - - // Store a list of all files to include... - $includes = []; - - foreach ($filenames as $filename) - { - // Store our system and application helper - // versions so that we can control the load ordering. - $systemHelper = null; - $appHelper = null; - $localIncludes = []; - - if (strpos($filename, '_helper') === false) - { - $filename .= '_helper'; - } - - // If the file is namespaced, we'll just grab that - // file and not search for any others - if (strpos($filename, '\\') !== false) - { - $path = $loader->locateFile($filename, 'Helpers'); - - if (empty($path)) - { - throw FileNotFoundException::forFileNotFound($filename); - } - - $includes[] = $path; - } - - // No namespaces, so search in all available locations - else - { - $paths = $loader->search('Helpers/' . $filename); - - if (! empty($paths)) - { - foreach ($paths as $path) - { - if (strpos($path, APPPATH) === 0) - { - // @codeCoverageIgnoreStart - $appHelper = $path; - // @codeCoverageIgnoreEnd - } - elseif (strpos($path, SYSTEMPATH) === 0) - { - $systemHelper = $path; - } - else - { - $localIncludes[] = $path; - } - } - } - - // App-level helpers should override all others - if (! empty($appHelper)) - { - // @codeCoverageIgnoreStart - $includes[] = $appHelper; - // @codeCoverageIgnoreEnd - } - - // All namespaced files get added in next - $includes = array_merge($includes, $localIncludes); - - // And the system default one should be added in last. - if (! empty($systemHelper)) - { - $includes[] = $systemHelper; - } - } - } - - // Now actually include all of the files - if (! empty($includes)) - { - foreach ($includes as $path) - { - include_once($path); - } - } - } -} - -if (! function_exists('is_cli')) -{ - /** - * Is CLI? - * - * Test to see if a request was made from the command line. - * - * @return boolean - */ - function is_cli(): bool - { - return (PHP_SAPI === 'cli' || defined('STDIN')); - } -} - -if (! function_exists('is_really_writable')) -{ - /** - * Tests for file writability - * - * is_writable() returns TRUE on Windows servers when you really can't write to - * the file, based on the read-only attribute. is_writable() is also unreliable - * on Unix servers if safe_mode is on. - * - * @link https://bugs.php.net/bug.php?id=54709 - * - * @param string $file - * - * @return boolean - * - * @throws \Exception - * @codeCoverageIgnore Not practical to test, as travis runs on linux - */ - function is_really_writable(string $file): bool - { - // If we're on a Unix server with safe_mode off we call is_writable - if (DIRECTORY_SEPARATOR === '/' || ! ini_get('safe_mode')) - { - return is_writable($file); - } - - /* For Windows servers and safe_mode "on" installations we'll actually - * write a file then read it. Bah... - */ - if (is_dir($file)) - { - $file = rtrim($file, '/') . '/' . bin2hex(random_bytes(16)); - if (($fp = @fopen($file, 'ab')) === false) - { - return false; - } - - fclose($fp); - @chmod($file, 0777); - @unlink($file); - - return true; - } - elseif (! is_file($file) || ( $fp = @fopen($file, 'ab')) === false) - { - return false; - } - - fclose($fp); - - return true; - } -} - -if (! function_exists('lang')) -{ - /** - * A convenience method to translate a string or array of them and format - * the result with the intl extension's MessageFormatter. - * - * @param string|[] $line - * @param array $args - * @param string $locale - * - * @return string - */ - function lang(string $line, array $args = [], string $locale = null) - { - return Services::language($locale) - ->getLine($line, $args); - } -} - -if (! function_exists('log_message')) -{ - /** - * A convenience/compatibility method for logging events through - * the Log system. - * - * Allowed log levels are: - * - emergency - * - alert - * - critical - * - error - * - warning - * - notice - * - info - * - debug - * - * @param string $level - * @param string $message - * @param array|null $context - * - * @return mixed - */ - function log_message(string $level, string $message, array $context = []) - { - // When running tests, we want to always ensure that the - // TestLogger is running, which provides utilities for - // for asserting that logs were called in the test code. - if (ENVIRONMENT === 'testing') - { - $logger = new TestLogger(new Logger()); - - return $logger->log($level, $message, $context); - } - - // @codeCoverageIgnoreStart - return Services::logger(true) - ->log($level, $message, $context); - // @codeCoverageIgnoreEnd - } -} - -if (! function_exists('model')) -{ - /** - * More simple way of getting model instances - * - * @param string $name - * @param boolean $getShared - * @param ConnectionInterface|null $conn - * - * @return mixed - */ - function model(string $name, bool $getShared = true, ConnectionInterface &$conn = null) - { - return \CodeIgniter\Database\ModelFactory::get($name, $getShared, $conn); - } -} - -if (! function_exists('old')) -{ - /** - * Provides access to "old input" that was set in the session - * during a redirect()->withInput(). - * - * @param string $key - * @param null $default - * @param string|boolean $escape - * - * @return mixed|null - */ - function old(string $key, $default = null, $escape = 'html') - { - // Ensure the session is loaded - if (session_status() === PHP_SESSION_NONE && ENVIRONMENT !== 'testing') - { - // @codeCoverageIgnoreStart - session(); - // @codeCoverageIgnoreEnd - } - - $request = Services::request(); - - $value = $request->getOldInput($key); - - // Return the default value if nothing - // found in the old input. - if (is_null($value)) - { - return $default; - } - - // If the result was serialized array or string, then unserialize it for use... - if (is_string($value)) - { - if (strpos($value, 'a:') === 0 || strpos($value, 's:') === 0) - { - $value = unserialize($value); - } - } - - return $escape === false ? $value : esc($value, $escape); - } -} - -if (! function_exists('redirect')) -{ - /** - * Convenience method that works with the current global $request and - * $router instances to redirect using named/reverse-routed routes - * to determine the URL to go to. If nothing is found, will treat - * as a traditional redirect and pass the string in, letting - * $response->redirect() determine the correct method and code. - * - * If more control is needed, you must use $response->redirect explicitly. - * - * @param string $uri - * - * @return \CodeIgniter\HTTP\RedirectResponse - */ - function redirect(string $uri = null): RedirectResponse - { - $response = Services::redirectResponse(null, true); - - if (! empty($uri)) - { - return $response->route($uri); - } - - return $response; - } -} - -if (! function_exists('remove_invisible_characters')) -{ - /** - * Remove Invisible Characters - * - * This prevents sandwiching null characters - * between ascii characters, like Java\0script. - * - * @param string $str - * @param boolean $urlEncoded - * - * @return string - */ - function remove_invisible_characters(string $str, bool $urlEncoded = true): string - { - $nonDisplayables = []; - - // every control character except newline (dec 10), - // carriage return (dec 13) and horizontal tab (dec 09) - if ($urlEncoded) - { - $nonDisplayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 - $nonDisplayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 - } - - $nonDisplayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 - - do - { - $str = preg_replace($nonDisplayables, '', $str, -1, $count); - } - while ($count); - - return $str; - } -} - -if (! function_exists('route_to')) -{ - /** - * Given a controller/method string and any params, - * will attempt to build the relative URL to the - * matching route. - * - * NOTE: This requires the controller/method to - * have a route defined in the routes Config file. - * - * @param string $method - * @param array ...$params - * - * @return false|string - */ - function route_to(string $method, ...$params) - { - return Services::routes()->reverseRoute($method, ...$params); - } -} - -if (! function_exists('session')) -{ - /** - * A convenience method for accessing the session instance, - * or an item that has been set in the session. - * - * Examples: - * session()->set('foo', 'bar'); - * $foo = session('bar'); - * - * @param string $val - * - * @return \CodeIgniter\Session\Session|mixed|null - */ - function session(string $val = null) - { - $session = Services::session(); - - // Returning a single item? - if (is_string($val)) - { - return $session->get($val); - } - - return $session; - } -} - -if (! function_exists('service')) -{ - /** - * Allows cleaner access to the Services Config file. - * Always returns a SHARED instance of the class, so - * calling the function multiple times should always - * return the same instance. - * - * These are equal: - * - $timer = service('timer') - * - $timer = \CodeIgniter\Config\Services::timer(); - * - * @param string $name - * @param array ...$params - * - * @return mixed - */ - function service(string $name, ...$params) - { - return Services::$name(...$params); - } -} - -if (! function_exists('single_service')) -{ - /** - * Allow cleaner access to a Service. - * Always returns a new instance of the class. - * - * @param string $name - * @param array|null $params - * - * @return mixed - */ - function single_service(string $name, ...$params) - { - // Ensure it's NOT a shared instance - array_push($params, false); - - return Services::$name(...$params); - } -} - -if (! function_exists('slash_item')) -{ - //Unlike CI3, this function is placed here because - //it's not a config, or part of a config. - /** - * Fetch a config file item with slash appended (if not empty) - * - * @param string $item Config item name - * - * @return string|null The configuration item or NULL if - * the item doesn't exist - */ - function slash_item(string $item): ?string - { - $config = config(App::class); - $configItem = $config->{$item}; - - if (! isset($configItem) || empty(trim($configItem))) - { - return $configItem; - } - - return rtrim($configItem, '/') . '/'; - } -} - -if (! function_exists('stringify_attributes')) -{ - /** - * Stringify attributes for use in HTML tags. - * - * Helper function used to convert a string, array, or object - * of attributes to a string. - * - * @param mixed $attributes string, array, object - * @param boolean $js - * - * @return string - */ - function stringify_attributes($attributes, bool $js = false): string - { - $atts = ''; - - if (empty($attributes)) - { - return $atts; - } - - if (is_string($attributes)) - { - return ' ' . $attributes; - } - - $attributes = (array) $attributes; - - foreach ($attributes as $key => $val) - { - $atts .= ($js) ? $key . '=' . esc($val, 'js') . ',' : ' ' . $key . '="' . esc($val, 'attr') . '"'; - } - - return rtrim($atts, ','); - } -} - -if (! function_exists('timer')) -{ - /** - * A convenience method for working with the timer. - * If no parameter is passed, it will return the timer instance, - * otherwise will start or stop the timer intelligently. - * - * @param string|null $name - * - * @return \CodeIgniter\Debug\Timer|mixed - */ - function timer(string $name = null) - { - $timer = Services::timer(); - - if (empty($name)) - { - return $timer; - } - - if ($timer->has($name)) - { - return $timer->stop($name); - } - - return $timer->start($name); - } -} - -if (! function_exists('trace')) -{ - /** - * Provides a backtrace to the current execution point, from Kint. - */ - function trace() - { - Kint::$aliases[] = 'trace'; - Kint::trace(); - } -} - -if (! function_exists('view')) -{ - /** - * Grabs the current RendererInterface-compatible class - * and tells it to render the specified view. Simply provides - * a convenience method that can be used in Controllers, - * libraries, and routed closures. - * - * NOTE: Does not provide any escaping of the data, so that must - * all be handled manually by the developer. - * - * @param string $name - * @param array $data - * @param array $options Unused - reserved for third-party extensions. - * - * @return string - */ - function view(string $name, array $data = [], array $options = []): string - { - /** - * @var CodeIgniter\View\View $renderer - */ - $renderer = Services::renderer(); - - $saveData = config(View::class)->saveData; - - if (array_key_exists('saveData', $options)) - { - $saveData = (bool) $options['saveData']; - unset($options['saveData']); - } - - return $renderer->setData($data, 'raw') - ->render($name, $options, $saveData); - } -} - -if (! function_exists('view_cell')) -{ - /** - * View cells are used within views to insert HTML chunks that are managed - * by other classes. - * - * @param string $library - * @param null $params - * @param integer $ttl - * @param string|null $cacheName - * - * @return string - * @throws \ReflectionException - */ - function view_cell(string $library, $params = null, int $ttl = 0, string $cacheName = null): string - { - return Services::viewcell() - ->render($library, $params, $ttl, $cacheName); - } -} diff --git a/vendor/codeigniter4/framework/system/ComposerScripts.php b/vendor/codeigniter4/framework/system/ComposerScripts.php deleted file mode 100644 index 6ebb122..0000000 --- a/vendor/codeigniter4/framework/system/ComposerScripts.php +++ /dev/null @@ -1,248 +0,0 @@ -getFileName(); - } - - //-------------------------------------------------------------------- - - /** - * A recursive remove directory method. - * - * @param $dir - */ - protected static function removeDir($dir) - { - if (is_dir($dir)) - { - $objects = scandir($dir); - foreach ($objects as $object) - { - if ($object !== '.' && $object !== '..') - { - if (filetype($dir . '/' . $object) === 'dir') - { - static::removeDir($dir . '/' . $object); - } - else - { - unlink($dir . '/' . $object); - } - } - } - reset($objects); - rmdir($dir); - } - } - - protected static function copyDir($source, $dest) - { - $dir = opendir($source); - @mkdir($dest); - - while (false !== ( $file = readdir($dir))) - { - if (( $file !== '.' ) && ( $file !== '..' )) - { - if (is_dir($source . '/' . $file)) - { - static::copyDir($source . '/' . $file, $dest . '/' . $file); - } - else - { - copy($source . '/' . $file, $dest . '/' . $file); - } - } - } - - closedir($dir); - } - - /** - * Moves the Laminas Escaper files into our base repo so that it's - * available for packaged releases where the users don't user Composer. - * - * @throws \ReflectionException - */ - public static function moveEscaper() - { - if (class_exists('\\Laminas\\Escaper\\Escaper') && is_file(static::getClassFilePath('\\Laminas\\Escaper\\Escaper'))) - { - $base = basename(__DIR__) . '/' . static::$basePath . 'Escaper'; - - foreach ([$base, $base . '/Exception'] as $path) - { - if (! is_dir($path)) - { - mkdir($path, 0755); - } - } - - $files = [ - static::getClassFilePath('\\Laminas\\Escaper\\Exception\\ExceptionInterface') => $base . '/Exception/ExceptionInterface.php', - static::getClassFilePath('\\Laminas\\Escaper\\Exception\\InvalidArgumentException') => $base . '/Exception/InvalidArgumentException.php', - static::getClassFilePath('\\Laminas\\Escaper\\Exception\\RuntimeException') => $base . '/Exception/RuntimeException.php', - static::getClassFilePath('\\Laminas\\Escaper\\Escaper') => $base . '/Escaper.php', - ]; - - foreach ($files as $source => $dest) - { - if (! static::moveFile($source, $dest)) - { - // @codeCoverageIgnoreStart - die('Error moving: ' . $source); - // @codeCoverageIgnoreEnd - } - } - } - } - - //-------------------------------------------------------------------- - - /** - * Moves the Kint file into our base repo so that it's - * available for packaged releases where the users don't user Composer. - */ - public static function moveKint() - { - $dir = 'vendor/kint-php/kint/src'; - - if (is_dir($dir)) - { - $base = basename(__DIR__) . '/' . static::$basePath . 'Kint'; - - // Remove the contents of the previous Kint folder, if any. - if (is_dir($base)) - { - static::removeDir($base); - } - - // Create Kint if it doesn't exist already - if (! is_dir($base)) - { - mkdir($base, 0755); - } - - static::copyDir($dir, $base); - static::copyDir($dir . '/../resources', $base . '/resources'); - copy($dir . '/../init.php', $base . '/init.php'); - copy($dir . '/../init_helpers.php', $base . '/init_helpers.php'); - } - } -} diff --git a/vendor/codeigniter4/framework/system/Config/AutoloadConfig.php b/vendor/codeigniter4/framework/system/Config/AutoloadConfig.php deleted file mode 100644 index 349fcb0..0000000 --- a/vendor/codeigniter4/framework/system/Config/AutoloadConfig.php +++ /dev/null @@ -1,113 +0,0 @@ - SYSTEMPATH, - 'App' => APPPATH // To ensure filters, etc still found, - ]; - - /** - * ------------------------------------------------------------------- - * Class Map - * ------------------------------------------------------------------- - * The class map provides a map of class names and their exact - * location on the drive. Classes loaded in this manner will have - * slightly faster performance because they will not have to be - * searched for within one or more directories as they would if they - * were being autoloaded through a namespace. - * - * @var array - */ - protected $coreClassmap = [ - 'Psr\Log\AbstractLogger' => SYSTEMPATH . 'ThirdParty/PSR/Log/AbstractLogger.php', - 'Psr\Log\InvalidArgumentException' => SYSTEMPATH . 'ThirdParty/PSR/Log/InvalidArgumentException.php', - 'Psr\Log\LoggerAwareInterface' => SYSTEMPATH . 'ThirdParty/PSR/Log/LoggerAwareInterface.php', - 'Psr\Log\LoggerAwareTrait' => SYSTEMPATH . 'ThirdParty/PSR/Log/LoggerAwareTrait.php', - 'Psr\Log\LoggerInterface' => SYSTEMPATH . 'ThirdParty/PSR/Log/LoggerInterface.php', - 'Psr\Log\LoggerTrait' => SYSTEMPATH . 'ThirdParty/PSR/Log/LoggerTrait.php', - 'Psr\Log\LogLevel' => SYSTEMPATH . 'ThirdParty/PSR/Log/LogLevel.php', - 'Psr\Log\NullLogger' => SYSTEMPATH . 'ThirdParty/PSR/Log/NullLogger.php', - 'Laminas\Escaper\Escaper' => SYSTEMPATH . 'ThirdParty/Escaper/Escaper.php' - ]; - - //-------------------------------------------------------------------- - - /** - * Constructor. - * - * Merge the built-in and developer-configured psr4 and classmap, - * with preference to the developer ones. - */ - public function __construct() - { - if (isset($_SERVER['CI_ENVIRONMENT']) && $_SERVER['CI_ENVIRONMENT'] === 'testing') - { - $this->psr4['Tests\Support'] = SUPPORTPATH; - $this->classmap['CodeIgniter\Log\TestLogger'] = SYSTEMPATH . 'Test/TestLogger.php'; - $this->classmap['CIDatabaseTestCase'] = SYSTEMPATH . 'Test/CIDatabaseTestCase.php'; - } - - $this->psr4 = array_merge($this->corePsr4, $this->psr4); - $this->classmap = array_merge($this->coreClassmap, $this->classmap); - } -} diff --git a/vendor/codeigniter4/framework/system/Config/BaseConfig.php b/vendor/codeigniter4/framework/system/Config/BaseConfig.php deleted file mode 100644 index 256f376..0000000 --- a/vendor/codeigniter4/framework/system/Config/BaseConfig.php +++ /dev/null @@ -1,247 +0,0 @@ -initEnvValue($this->$property, $property, $prefix, $shortPrefix); - - // Handle hex2bin prefix - if ($shortPrefix === 'encryption' && $property === 'key' && strpos($this->$property, 'hex2bin:') === 0) - { - $this->$property = hex2bin(substr($this->$property, 8)); - } - } - - if (defined('ENVIRONMENT') && ENVIRONMENT !== 'testing') - { - // well, this won't happen during unit testing - // @codeCoverageIgnoreStart - $this->registerProperties(); - // @codeCoverageIgnoreEnd - } - } - - //-------------------------------------------------------------------- - - /** - * Initialization an environment-specific configuration setting - * - * @param mixed &$property - * @param string $name - * @param string $prefix - * @param string $shortPrefix - * - * @return mixed - */ - protected function initEnvValue(&$property, string $name, string $prefix, string $shortPrefix) - { - if (is_array($property)) - { - foreach ($property as $key => $val) - { - $this->initEnvValue($property[$key], "{$name}.{$key}", $prefix, $shortPrefix); - } - } - else - { - if (($value = $this->getEnvValue($name, $prefix, $shortPrefix)) !== false) - { - if (! is_null($value)) - { - if ($value === 'false') - { - $value = false; - } - elseif ($value === 'true') - { - $value = true; - } - - $property = is_bool($value) ? $value : trim($value, '\'"'); - } - } - } - return $property; - } - - //-------------------------------------------------------------------- - - /** - * Retrieve an environment-specific configuration setting - * - * @param string $property - * @param string $prefix - * @param string $shortPrefix - * - * @return mixed - */ - protected function getEnvValue(string $property, string $prefix, string $shortPrefix) - { - $shortPrefix = ltrim($shortPrefix, '\\'); - switch (true) - { - case array_key_exists("{$shortPrefix}.{$property}", $_ENV): - return $_ENV["{$shortPrefix}.{$property}"]; - case array_key_exists("{$shortPrefix}.{$property}", $_SERVER): - return $_SERVER["{$shortPrefix}.{$property}"]; - case array_key_exists("{$prefix}.{$property}", $_ENV): - return $_ENV["{$prefix}.{$property}"]; - case array_key_exists("{$prefix}.{$property}", $_SERVER): - return $_SERVER["{$prefix}.{$property}"]; - default: - $value = getenv($property); - return $value === false ? null : $value; - } - } - - //-------------------------------------------------------------------- - - /** - * Provides external libraries a simple way to register one or more - * options into a config file. - * - * @throws \ReflectionException - */ - protected function registerProperties() - { - if (! static::$moduleConfig->shouldDiscover('registrars')) - { - return; - } - - if (! static::$didDiscovery) - { - $locator = \Config\Services::locator(); - $registrarsFiles = $locator->search('Config/Registrar.php'); - - foreach ($registrarsFiles as $file) - { - $className = $locator->getClassname($file); - static::$registrars[] = new $className(); - } - - static::$didDiscovery = true; - } - - $shortName = (new \ReflectionClass($this))->getShortName(); - - // Check the registrar class for a method named after this class' shortName - foreach (static::$registrars as $callable) - { - // ignore non-applicable registrars - if (! method_exists($callable, $shortName)) - { - continue; - } - - $properties = $callable::$shortName(); - - if (! is_array($properties)) - { - throw new \RuntimeException('Registrars must return an array of properties and their values.'); - } - - foreach ($properties as $property => $value) - { - if (isset($this->$property) && is_array($this->$property) && is_array($value)) - { - $this->$property = array_merge($this->$property, $value); - } - else - { - $this->$property = $value; - } - } - } - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Config/BaseService.php b/vendor/codeigniter4/framework/system/Config/BaseService.php deleted file mode 100644 index 65aceb1..0000000 --- a/vendor/codeigniter4/framework/system/Config/BaseService.php +++ /dev/null @@ -1,300 +0,0 @@ -initialize(new Autoload(), new Modules()); - } - } - - //-------------------------------------------------------------------- - - /** - * Inject mock object for testing. - * - * @param string $name - * @param $mock - */ - public static function injectMock(string $name, $mock) - { - $name = strtolower($name); - static::$mocks[$name] = $mock; - } - - //-------------------------------------------------------------------- - - /** - * Will scan all psr4 namespaces registered with system to look - * for new Config\Services files. Caches a copy of each one, then - * looks for the service method in each, returning an instance of - * the service, if available. - * - * @param string $name - * @param array $arguments - * - * @return mixed - */ - protected static function discoverServices(string $name, array $arguments) - { - if (! static::$discovered) - { - $config = config('Modules'); - - if ($config->shouldDiscover('services')) - { - $locator = static::locator(); - $files = $locator->search('Config/Services'); - - if (empty($files)) - { - // no files at all found - this would be really, really bad - return null; - } - - // Get instances of all service classes and cache them locally. - foreach ($files as $file) - { - $classname = $locator->getClassname($file); - - if (! in_array($classname, ['CodeIgniter\\Config\\Services'])) - { - static::$services[] = new $classname(); - } - } - } - - static::$discovered = true; - } - - if (! static::$services) - { - // we found stuff, but no services - this would be really bad - return null; - } - - // Try to find the desired service method - foreach (static::$services as $class) - { - if (method_exists(get_class($class), $name)) - { - return $class::$name(...$arguments); - } - } - - return null; - } -} diff --git a/vendor/codeigniter4/framework/system/Config/Config.php b/vendor/codeigniter4/framework/system/Config/Config.php deleted file mode 100644 index 1e425d3..0000000 --- a/vendor/codeigniter4/framework/system/Config/Config.php +++ /dev/null @@ -1,161 +0,0 @@ -locateFile($name, 'Config'); - - if (empty($file)) - { - // No file found - check if the class was namespaced - if (strpos($name, '\\') !== false) - { - // Class was namespaced and locateFile couldn't find it - return null; - } - - // Check all namespaces - $files = $locator->search('Config/' . $name); - if (empty($files)) - { - return null; - } - - // Get the first match (prioritizes user and framework) - $file = reset($files); - } - - $name = $locator->getClassname($file); - - if (empty($name)) - { - return null; - } - - return new $name(); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Config/DotEnv.php b/vendor/codeigniter4/framework/system/Config/DotEnv.php deleted file mode 100644 index 2b7d912..0000000 --- a/vendor/codeigniter4/framework/system/Config/DotEnv.php +++ /dev/null @@ -1,325 +0,0 @@ -path = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $file; - } - - //-------------------------------------------------------------------- - - /** - * The main entry point, will load the .env file and process it - * so that we end up with all settings in the PHP environment vars - * (i.e. getenv(), $_ENV, and $_SERVER) - * - * @return boolean - */ - public function load(): bool - { - $vars = $this->parse(); - - return ($vars === null ? false : true); - } - - //-------------------------------------------------------------------- - - /** - * Parse the .env file into an array of key => value - * - * @return array|null - */ - public function parse(): ?array - { - // We don't want to enforce the presence of a .env file, they should be optional. - if (! is_file($this->path)) - { - return null; - } - - // Ensure the file is readable - if (! is_readable($this->path)) - { - throw new \InvalidArgumentException("The .env file is not readable: {$this->path}"); - } - - $vars = []; - - $lines = file($this->path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - - foreach ($lines as $line) - { - // Is it a comment? - if (strpos(trim($line), '#') === 0) - { - continue; - } - - // If there is an equal sign, then we know we are assigning a variable. - if (strpos($line, '=') !== false) - { - list($name, $value) = $this->normaliseVariable($line); - $vars[$name] = $value; - $this->setVariable($name, $value); - } - } - - return $vars; - } - - //-------------------------------------------------------------------- - - /** - * Sets the variable into the environment. Will parse the string - * first to look for {name}={value} pattern, ensure that nested - * variables are handled, and strip it of single and double quotes. - * - * @param string $name - * @param string $value - */ - protected function setVariable(string $name, string $value = '') - { - if (! getenv($name, true)) - { - putenv("$name=$value"); - } - if (empty($_ENV[$name])) - { - $_ENV[$name] = $value; - } - if (empty($_SERVER[$name])) - { - $_SERVER[$name] = $value; - } - } - - //-------------------------------------------------------------------- - - /** - * Parses for assignment, cleans the $name and $value, and ensures - * that nested variables are handled. - * - * @param string $name - * @param string $value - * - * @return array - */ - public function normaliseVariable(string $name, string $value = ''): array - { - // Split our compound string into it's parts. - if (strpos($name, '=') !== false) - { - list($name, $value) = explode('=', $name, 2); - } - - $name = trim($name); - $value = trim($value); - - // Sanitize the name - $name = str_replace(['export', '\'', '"'], '', $name); - - // Sanitize the value - $value = $this->sanitizeValue($value); - - $value = $this->resolveNestedVariables($value); - - // Handle hex2bin prefix - if ($name === 'encryption.key' && strpos($value, 'hex2bin:') === 0) - { - $value = hex2bin(substr($value, 8)); - } - - return [ - $name, - $value, - ]; - } - - //-------------------------------------------------------------------- - - /** - * Strips quotes from the environment variable value. - * - * This was borrowed from the excellent phpdotenv with very few changes. - * https://github.com/vlucas/phpdotenv - * - * @param string $value - * - * @return string - * @throws \InvalidArgumentException - */ - protected function sanitizeValue(string $value): string - { - if (! $value) - { - return $value; - } - - // Does it begin with a quote? - if (strpbrk($value[0], '"\'') !== false) - { - // value starts with a quote - $quote = $value[0]; - $regexPattern = sprintf( - '/^ - %1$s # match a quote at the start of the value - ( # capturing sub-pattern used - (?: # we do not need to capture this - [^%1$s\\\\] # any character other than a quote or backslash - |\\\\\\\\ # or two backslashes together - |\\\\%1$s # or an escaped quote e.g \" - )* # as many characters that match the previous rules - ) # end of the capturing sub-pattern - %1$s # and the closing quote - .*$ # and discard any string after the closing quote - /mx', $quote - ); - $value = preg_replace($regexPattern, '$1', $value); - $value = str_replace("\\$quote", $quote, $value); - $value = str_replace('\\\\', '\\', $value); - } - else - { - $parts = explode(' #', $value, 2); - - $value = trim($parts[0]); - - // Unquoted values cannot contain whitespace - if (preg_match('/\s+/', $value) > 0) - { - throw new \InvalidArgumentException('.env values containing spaces must be surrounded by quotes.'); - } - } - - return $value; - } - - //-------------------------------------------------------------------- - - /** - * Resolve the nested variables. - * - * Look for ${varname} patterns in the variable value and replace with an existing - * environment variable. - * - * This was borrowed from the excellent phpdotenv with very few changes. - * https://github.com/vlucas/phpdotenv - * - * @param $value - * - * @return string - */ - protected function resolveNestedVariables(string $value): string - { - if (strpos($value, '$') !== false) - { - $loader = $this; - - $value = preg_replace_callback( - '/\${([a-zA-Z0-9_]+)}/', - function ($matchedPatterns) use ($loader) { - $nestedVariable = $loader->getVariable($matchedPatterns[1]); - - if (is_null($nestedVariable)) - { - return $matchedPatterns[0]; - } - - return $nestedVariable; - }, - $value - ); - } - - return $value; - } - - //-------------------------------------------------------------------- - - /** - * Search the different places for environment variables and return first value found. - * - * This was borrowed from the excellent phpdotenv with very few changes. - * https://github.com/vlucas/phpdotenv - * - * @param string $name - * - * @return string|null - */ - protected function getVariable(string $name) - { - switch (true) - { - case array_key_exists($name, $_ENV): - return $_ENV[$name]; - case array_key_exists($name, $_SERVER): - return $_SERVER[$name]; - default: - $value = getenv($name); - - // switch getenv default to null - return $value === false ? null : $value; - } - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Config/ForeignCharacters.php b/vendor/codeigniter4/framework/system/Config/ForeignCharacters.php deleted file mode 100644 index 11d0f6c..0000000 --- a/vendor/codeigniter4/framework/system/Config/ForeignCharacters.php +++ /dev/null @@ -1,143 +0,0 @@ - 'ae', - '/ƶ|œ/' => 'oe', - '/ü/' => 'ue', - '/Ƅ/' => 'Ae', - '/Ü/' => 'Ue', - '/Ɩ/' => 'Oe', - '/ƀ|Ɓ|Ƃ|ƃ|Ƅ|ƅ|Ēŗ|Ā|Ă|Ą|Ē|Ī‘|Ά|įŗ¢|įŗ |įŗ¦|įŗŖ|įŗØ|įŗ¬|įŗ°|įŗ®|įŗ“|įŗ²|įŗ¶|А/' => 'A', - '/Ć |Ć”|Ć¢|Ć£|Ć„|Ē»|ā|ă|ą|ĒŽ|ĀŖ|α|ά|įŗ£|įŗ”|įŗ§|įŗ„|įŗ«|įŗ©|įŗ­|įŗ±|įŗÆ|įŗµ|įŗ³|įŗ·|а/' => 'a', - '/Š‘/' => 'B', - '/б/' => 'b', - '/Ƈ|Ć|Ĉ|Ċ|Č/' => 'C', - '/Ƨ|ć|ĉ|ċ|č/' => 'c', - '/Š”/' => 'D', - '/Š“/' => 'd', - '/Ɛ|Ď|Đ|Ī”/' => 'Dj', - '/ư|ď|đ|Ī“/' => 'dj', - '/ƈ|Ɖ|Ê|Ƌ|Ē|Ĕ|Ė|Ę|Ě|Ī•|Έ|įŗ¼|įŗŗ|įŗø|Ề|įŗ¾|Ễ|Ể|Ệ|Š•|Š­/' => 'E', - '/ĆØ|Ć©|ĆŖ|Ć«|ē|ĕ|ė|ę|ě|Ī­|ε|įŗ½|įŗ»|įŗ¹|ề|įŗæ|į»…|ể|ệ|е|э/' => 'e', - '/Ф/' => 'F', - '/ф/' => 'f', - '/Ĝ|Ğ|Ä |Ä¢|Ī“|Š“|Ґ/' => 'G', - '/ĝ|ğ|Ä”|Ä£|γ|г|Ņ‘/' => 'g', - '/Ĥ|Ħ/' => 'H', - '/Ä„|ħ/' => 'h', - '/Ì|ƍ|Ǝ|Ə|ÄØ|ÄŖ|Ĭ|Ē|Ä®|İ|Ī—|Ή|Ί|Ī™|ĪŖ|Ỉ|Ị|И|Š«/' => 'I', - '/Ƭ|Ć­|Ć®|ĆÆ|Ä©|Ä«|Ä­|ǐ|ÄÆ|ı|Ī·|Ī®|ĪÆ|ι|ϊ|ỉ|ị|Šø|ы|ї/' => 'i', - '/Ä“/' => 'J', - '/ĵ/' => 'j', - '/Ķ|Κ|К/' => 'K', - '/Ä·|Īŗ|Šŗ/' => 'k', - '/Ĺ|Ä»|Ľ|Äæ|Ł|Ī›|Š›/' => 'L', - '/Äŗ|ļ|ľ|ŀ|ł|Ī»|Š»/' => 'l', - '/М/' => 'M', - '/м/' => 'm', - '/Ƒ|Ń|Ņ|Ň|Ī|Š/' => 'N', - '/Ʊ|ń|ņ|ň|ʼn|ν|н/' => 'n', - '/ƒ|Ɠ|Ɣ|ƕ|Ō|Ŏ|Ē‘|Ő|Ę |Ƙ|Ǿ|Ο|Ό|Ī©|Ī|į»Ž|Ọ|į»’|Ố|į»–|į»”|Ộ|Ờ|Ớ|į» |į»ž|Ợ|Šž/' => 'O', - '/ò|ó|Ć“|Ƶ|ō|ŏ|Ē’|ő|Ę”|Ćø|Ēæ|Āŗ|Īæ|ό|ω|ĻŽ|į»|į»|ồ|ố|į»—|ổ|į»™|į»|į»›|į»”|ở|ợ|о/' => 'o', - '/П/' => 'P', - '/Šæ/' => 'p', - '/Ŕ|Ŗ|Ř|Ī”|Š /' => 'R', - '/ŕ|ŗ|ř|ρ|р/' => 'r', - '/Ś|Ŝ|Ş|Ș|Å |Ī£|Š”/' => 'S', - '/ś|ŝ|ş|ș|Å”|Åæ|σ|Ļ‚|с/' => 's', - '/Ț|Å¢|Ť|Ŧ|Ļ„|Š¢/' => 'T', - '/ț|Å£|Å„|ŧ|т/' => 't', - '/ƙ|Ú|ƛ|ÅØ|ÅŖ|Ŭ|Å®|Ű|Ų|ĘÆ|Ē“|Ē•|Ē—|Ē™|Ē›|ÅØ|Ủ|Ụ|Ừ|Ứ|į»®|Ử|į»°|Š£/' => 'U', - '/ù|Ćŗ|Ć»|Å©|Å«|Å­|ÅÆ|ű|ų|ʰ|Ē”|Ē–|ǘ|ǚ|ǜ|Ļ…|Ļ|Ļ‹|į»§|Ễ|ừ|ứ|ữ|į»­|į»±|у/' => 'u', - '/Ƴ|Ɏ|ồ|įŗŽ|Ó²|Ó®|ŠŽ|Ɲ|Åø|Ŷ|Ī„|ĪŽ|Ī«|Ỳ|Ỹ|į»¶|ồ|Š™/' => 'Y', - '/įŗ™|Ź|Ę“|ɏ|ỵ|įŗ|Ó³|ÓÆ|ў|ý|Ćæ|Å·|ỳ|ỹ|į»·|ỵ|й/' => 'y', - '/Š’/' => 'V', - '/в/' => 'v', - '/Å“/' => 'W', - '/ŵ/' => 'w', - '/Ź|Å»|Ž|Ī–|Š—/' => 'Z', - '/Åŗ|ż|ž|ζ|Š·/' => 'z', - '/Ɔ|Ǽ/' => 'AE', - '/ß/' => 'ss', - '/IJ/' => 'IJ', - '/ij/' => 'ij', - '/Œ/' => 'OE', - '/ʒ/' => 'f', - '/ξ/' => 'ks', - '/Ļ€/' => 'p', - '/β/' => 'v', - '/μ/' => 'm', - '/ψ/' => 'ps', - '/Ё/' => 'Yo', - '/ё/' => 'yo', - '/Š„/' => 'Ye', - '/є/' => 'ye', - '/Ї/' => 'Yi', - '/Š–/' => 'Zh', - '/ж/' => 'zh', - '/Š„/' => 'Kh', - '/х/' => 'kh', - '/Ц/' => 'Ts', - '/ц/' => 'ts', - '/Ч/' => 'Ch', - '/ч/' => 'ch', - '/ŠØ/' => 'Sh', - '/ш/' => 'sh', - '/Š©/' => 'Shch', - '/щ/' => 'shch', - '/ŠŖ|ъ|Ь|ь/' => '', - '/Š®/' => 'Yu', - '/ю/' => 'yu', - '/ŠÆ/' => 'Ya', - '/я/' => 'ya', - ]; - -} diff --git a/vendor/codeigniter4/framework/system/Config/Routes.php b/vendor/codeigniter4/framework/system/Config/Routes.php deleted file mode 100644 index c891ec3..0000000 --- a/vendor/codeigniter4/framework/system/Config/Routes.php +++ /dev/null @@ -1,66 +0,0 @@ -add('basecontroller(:any)', function () { - throw PageNotFoundException::forPageNotFound(); -}); - -// Migrations -$routes->cli('migrations/(:segment)/(:segment)', '\CodeIgniter\Commands\MigrationsCommand::$1/$2'); -$routes->cli('migrations/(:segment)', '\CodeIgniter\Commands\MigrationsCommand::$1'); -$routes->cli('migrations', '\CodeIgniter\Commands\MigrationsCommand::index'); - -// CLI Catchall - uses a _remap to call Commands -$routes->cli('ci(:any)', '\CodeIgniter\CLI\CommandRunner::index/$1'); - -// Prevent access to initController method -$routes->add('(:any)/initController', function () { - throw PageNotFoundException::forPageNotFound(); -}); diff --git a/vendor/codeigniter4/framework/system/Config/Services.php b/vendor/codeigniter4/framework/system/Config/Services.php deleted file mode 100644 index b3c9854..0000000 --- a/vendor/codeigniter4/framework/system/Config/Services.php +++ /dev/null @@ -1,944 +0,0 @@ -initialize($config); - } - - //-------------------------------------------------------------------- - - /** - * The Exceptions class holds the methods that handle: - * - * - set_exception_handler - * - set_error_handler - * - register_shutdown_function - * - * @param \Config\Exceptions $config - * @param \CodeIgniter\HTTP\IncomingRequest $request - * @param \CodeIgniter\HTTP\Response $response - * @param boolean $getShared - * - * @return \CodeIgniter\Debug\Exceptions - */ - public static function exceptions( - \Config\Exceptions $config = null, - IncomingRequest $request = null, - Response $response = null, - bool $getShared = true - ) - { - if ($getShared) - { - return static::getSharedInstance('exceptions', $config, $request, $response); - } - - if (empty($config)) - { - $config = new \Config\Exceptions(); - } - - if (empty($request)) - { - $request = static::request(); - } - - if (empty($response)) - { - $response = static::response(); - } - - return (new Exceptions($config, $request, $response)); - } - - //-------------------------------------------------------------------- - - /** - * Filters allow you to run tasks before and/or after a controller - * is executed. During before filters, the request can be modified, - * and actions taken based on the request, while after filters can - * act on or modify the response itself before it is sent to the client. - * - * @param mixed $config - * @param boolean $getShared - * - * @return \CodeIgniter\Filters\Filters - */ - public static function filters($config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('filters', $config); - } - - if (empty($config)) - { - $config = new \Config\Filters(); - } - - return new Filters($config, static::request(), static::response()); - } - - //-------------------------------------------------------------------- - - /** - * The Honeypot provides a secret input on forms that bots should NOT - * fill in, providing an additional safeguard when accepting user input. - * - * @param \CodeIgniter\Config\BaseConfig|null $config - * @param boolean $getShared - * - * @return \CodeIgniter\Honeypot\Honeypot|mixed - */ - public static function honeypot(BaseConfig $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('honeypot', $config); - } - - if (is_null($config)) - { - $config = new \Config\Honeypot(); - } - - return new Honeypot($config); - } - - //-------------------------------------------------------------------- - - /** - * Acts as a factory for ImageHandler classes and returns an instance - * of the handler. Used like Services::image()->withFile($path)->rotate(90)->save(); - * - * @param string|null $handler - * @param \Config\Images|null $config - * @param boolean $getShared - * - * @return \CodeIgniter\Images\Handlers\BaseHandler - */ - public static function image(string $handler = null, $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('image', $handler, $config); - } - - if (empty($config)) - { - $config = new Images(); - } - - $handler = is_null($handler) ? $config->defaultHandler : $handler; - - $class = $config->handlers[$handler]; - - return new $class($config); - } - - //-------------------------------------------------------------------- - - /** - * The Iterator class provides a simple way of looping over a function - * and timing the results and memory usage. Used when debugging and - * optimizing applications. - * - * @param boolean $getShared - * - * @return \CodeIgniter\Debug\Iterator - */ - public static function iterator(bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('iterator'); - } - - return new Iterator(); - } - - //-------------------------------------------------------------------- - - /** - * Responsible for loading the language string translations. - * - * @param string $locale - * @param boolean $getShared - * - * @return \CodeIgniter\Language\Language - */ - public static function language(string $locale = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('language', $locale) - ->setLocale($locale); - } - - $locale = ! empty($locale) ? $locale : static::request() - ->getLocale(); - - return new Language($locale); - } - - //-------------------------------------------------------------------- - - /** - * The Logger class is a PSR-3 compatible Logging class that supports - * multiple handlers that process the actual logging. - * - * @param boolean $getShared - * - * @return \CodeIgniter\Log\Logger - */ - public static function logger(bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('logger'); - } - - return new \CodeIgniter\Log\Logger(new Logger()); - } - - //-------------------------------------------------------------------- - - /** - * Return the appropriate Migration runner. - * - * @param \CodeIgniter\Config\BaseConfig $config - * @param \CodeIgniter\Database\ConnectionInterface $db - * @param boolean $getShared - * - * @return \CodeIgniter\Database\MigrationRunner - */ - public static function migrations(BaseConfig $config = null, ConnectionInterface $db = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('migrations', $config, $db); - } - - $config = empty($config) ? new Migrations() : $config; - - return new MigrationRunner($config, $db); - } - - //-------------------------------------------------------------------- - - /** - * The Negotiate class provides the content negotiation features for - * working the request to determine correct language, encoding, charset, - * and more. - * - * @param \CodeIgniter\HTTP\RequestInterface $request - * @param boolean $getShared - * - * @return \CodeIgniter\HTTP\Negotiate - */ - public static function negotiator(RequestInterface $request = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('negotiator', $request); - } - - if (is_null($request)) - { - $request = static::request(); - } - - return new Negotiate($request); - } - - //-------------------------------------------------------------------- - - /** - * Return the appropriate pagination handler. - * - * @param mixed $config - * @param \CodeIgniter\View\RendererInterface $view - * @param boolean $getShared - * - * @return \CodeIgniter\Pager\Pager - */ - public static function pager($config = null, RendererInterface $view = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('pager', $config, $view); - } - - if (empty($config)) - { - $config = config('Pager'); - } - - if (! $view instanceof RendererInterface) - { - $view = static::renderer(); - } - - return new Pager($config, $view); - } - - //-------------------------------------------------------------------- - - /** - * The Parser is a simple template parser. - * - * @param string $viewPath - * @param mixed $config - * @param boolean $getShared - * - * @return \CodeIgniter\View\Parser - */ - public static function parser(string $viewPath = null, $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('parser', $viewPath, $config); - } - - if (is_null($config)) - { - $config = new \Config\View(); - } - - if (is_null($viewPath)) - { - $paths = config('Paths'); - $viewPath = $paths->viewDirectory; - } - - return new Parser($config, $viewPath, static::locator(), CI_DEBUG, static::logger()); - } - - //-------------------------------------------------------------------- - - /** - * The Renderer class is the class that actually displays a file to the user. - * The default View class within CodeIgniter is intentionally simple, but this - * service could easily be replaced by a template engine if the user needed to. - * - * @param string $viewPath - * @param mixed $config - * @param boolean $getShared - * - * @return \CodeIgniter\View\View - */ - public static function renderer(string $viewPath = null, $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('renderer', $viewPath, $config); - } - - if (is_null($config)) - { - $config = new \Config\View(); - } - - if (is_null($viewPath)) - { - $paths = config('Paths'); - - $viewPath = $paths->viewDirectory; - } - - return new \CodeIgniter\View\View($config, $viewPath, static::locator(), CI_DEBUG, static::logger()); - } - - //-------------------------------------------------------------------- - - /** - * The Request class models an HTTP request. - * - * @param \Config\App $config - * @param boolean $getShared - * - * @return \CodeIgniter\HTTP\IncomingRequest - */ - public static function request(App $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('request', $config); - } - - if (! is_object($config)) - { - $config = config(App::class); - } - - return new IncomingRequest( - $config, - static::uri(), - 'php://input', - new UserAgent() - ); - } - - //-------------------------------------------------------------------- - - /** - * The Response class models an HTTP response. - * - * @param \Config\App $config - * @param boolean $getShared - * - * @return \CodeIgniter\HTTP\Response - */ - public static function response(App $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('response', $config); - } - - if (! is_object($config)) - { - $config = config(App::class); - } - - return new Response($config); - } - - //-------------------------------------------------------------------- - - /** - * The Redirect class provides nice way of working with redirects. - * - * @param \Config\App $config - * @param boolean $getShared - * - * @return \CodeIgniter\HTTP\Response - */ - public static function redirectResponse(App $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('redirectResponse', $config); - } - - if (! is_object($config)) - { - $config = config(App::class); - } - - $response = new RedirectResponse($config); - $response->setProtocolVersion(static::request() - ->getProtocolVersion()); - - return $response; - } - - //-------------------------------------------------------------------- - - /** - * The Routes service is a class that allows for easily building - * a collection of routes. - * - * @param boolean $getShared - * - * @return \CodeIgniter\Router\RouteCollection - */ - public static function routes(bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('routes'); - } - - return new RouteCollection(static::locator(), config('Modules')); - } - - //-------------------------------------------------------------------- - - /** - * The Router class uses a RouteCollection's array of routes, and determines - * the correct Controller and Method to execute. - * - * @param \CodeIgniter\Router\RouteCollectionInterface $routes - * @param \CodeIgniter\HTTP\Request $request - * @param boolean $getShared - * - * @return \CodeIgniter\Router\Router - */ - public static function router(RouteCollectionInterface $routes = null, Request $request = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('router', $routes, $request); - } - - if (empty($routes)) - { - $routes = static::routes(); - } - - return new Router($routes, $request); - } - - //-------------------------------------------------------------------- - - /** - * The Security class provides a few handy tools for keeping the site - * secure, most notably the CSRF protection tools. - * - * @param \Config\App $config - * @param boolean $getShared - * - * @return \CodeIgniter\Security\Security - */ - public static function security(App $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('security', $config); - } - - if (! is_object($config)) - { - $config = config(App::class); - } - - return new Security($config); - } - - //-------------------------------------------------------------------- - - /** - * Return the session manager. - * - * @param \Config\App $config - * @param boolean $getShared - * - * @return \CodeIgniter\Session\Session - */ - public static function session(App $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('session', $config); - } - - if (! is_object($config)) - { - $config = config(App::class); - } - - $logger = static::logger(); - - $driverName = $config->sessionDriver; - $driver = new $driverName($config, static::request()->getIPAddress()); - $driver->setLogger($logger); - - $session = new Session($driver, $config); - $session->setLogger($logger); - - if (session_status() === PHP_SESSION_NONE) - { - $session->start(); - } - - return $session; - } - - //-------------------------------------------------------------------- - - /** - * The Throttler class provides a simple method for implementing - * rate limiting in your applications. - * - * @param boolean $getShared - * - * @return \CodeIgniter\Throttle\Throttler - */ - public static function throttler(bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('throttler'); - } - - return new Throttler(static::cache()); - } - - //-------------------------------------------------------------------- - - /** - * The Timer class provides a simple way to Benchmark portions of your - * application. - * - * @param boolean $getShared - * - * @return \CodeIgniter\Debug\Timer - */ - public static function timer(bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('timer'); - } - - return new Timer(); - } - - //-------------------------------------------------------------------- - - /** - * Return the debug toolbar. - * - * @param \Config\Toolbar $config - * @param boolean $getShared - * - * @return \CodeIgniter\Debug\Toolbar - */ - public static function toolbar(\Config\Toolbar $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('toolbar', $config); - } - - if (! is_object($config)) - { - $config = config('Toolbar'); - } - - return new Toolbar($config); - } - - //-------------------------------------------------------------------- - - /** - * The URI class provides a way to model and manipulate URIs. - * - * @param string $uri - * @param boolean $getShared - * - * @return \CodeIgniter\HTTP\URI - */ - public static function uri(string $uri = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('uri', $uri); - } - - return new URI($uri); - } - - //-------------------------------------------------------------------- - - /** - * The Validation class provides tools for validating input data. - * - * @param \Config\Validation $config - * @param boolean $getShared - * - * @return \CodeIgniter\Validation\Validation - */ - public static function validation(\Config\Validation $config = null, bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('validation', $config); - } - - if (is_null($config)) - { - $config = config('Validation'); - } - - return new Validation($config, static::renderer()); - } - - //-------------------------------------------------------------------- - - /** - * View cells are intended to let you insert HTML into view - * that has been generated by any callable in the system. - * - * @param boolean $getShared - * - * @return \CodeIgniter\View\Cell - */ - public static function viewcell(bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('viewcell'); - } - - return new Cell(static::cache()); - } - - //-------------------------------------------------------------------- - - /** - * The Typography class provides a way to format text in semantically relevant ways. - * - * @param boolean $getShared - * - * @return \CodeIgniter\Typography\Typography - */ - public static function typography(bool $getShared = true) - { - if ($getShared) - { - return static::getSharedInstance('typography'); - } - - return new Typography(); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Config/View.php b/vendor/codeigniter4/framework/system/Config/View.php deleted file mode 100644 index e9cafa6..0000000 --- a/vendor/codeigniter4/framework/system/Config/View.php +++ /dev/null @@ -1,107 +0,0 @@ - '\abs', - 'capitalize' => '\CodeIgniter\View\Filters::capitalize', - 'date' => '\CodeIgniter\View\Filters::date', - 'date_modify' => '\CodeIgniter\View\Filters::date_modify', - 'default' => '\CodeIgniter\View\Filters::default', - 'esc' => '\CodeIgniter\View\Filters::esc', - 'excerpt' => '\CodeIgniter\View\Filters::excerpt', - 'highlight' => '\CodeIgniter\View\Filters::highlight', - 'highlight_code' => '\CodeIgniter\View\Filters::highlight_code', - 'limit_words' => '\CodeIgniter\View\Filters::limit_words', - 'limit_chars' => '\CodeIgniter\View\Filters::limit_chars', - 'local_currency' => '\CodeIgniter\View\Filters::local_currency', - 'local_number' => '\CodeIgniter\View\Filters::local_number', - 'lower' => '\strtolower', - 'nl2br' => '\CodeIgniter\View\Filters::nl2br', - 'number_format' => '\number_format', - 'prose' => '\CodeIgniter\View\Filters::prose', - 'round' => '\CodeIgniter\View\Filters::round', - 'strip_tags' => '\strip_tags', - 'title' => '\CodeIgniter\View\Filters::title', - 'upper' => '\strtoupper', - ]; - - /** - * Built-in View plugins. - * - * @var type - */ - protected $corePlugins = [ - 'current_url' => '\CodeIgniter\View\Plugins::currentURL', - 'previous_url' => '\CodeIgniter\View\Plugins::previousURL', - 'mailto' => '\CodeIgniter\View\Plugins::mailto', - 'safe_mailto' => '\CodeIgniter\View\Plugins::safeMailto', - 'lang' => '\CodeIgniter\View\Plugins::lang', - 'validation_errors' => '\CodeIgniter\View\Plugins::validationErrors', - 'route' => '\CodeIgniter\View\Plugins::route', - 'siteURL' => '\CodeIgniter\View\Plugins::siteURL', - ]; - - /** - * Constructor. - * - * Merge the built-in and developer-configured filters and plugins, - * with preference to the developer ones. - */ - public function __construct() - { - $this->filters = array_merge($this->coreFilters, $this->filters); - $this->plugins = array_merge($this->corePlugins, $this->plugins); - - parent::__construct(); - } - -} diff --git a/vendor/codeigniter4/framework/system/Controller.php b/vendor/codeigniter4/framework/system/Controller.php deleted file mode 100644 index 985d828..0000000 --- a/vendor/codeigniter4/framework/system/Controller.php +++ /dev/null @@ -1,223 +0,0 @@ -request = $request; - $this->response = $response; - $this->logger = $logger; - - if ($this->forceHTTPS > 0) - { - $this->forceHTTPS($this->forceHTTPS); - } - - $this->loadHelpers(); - } - - //-------------------------------------------------------------------- - - /** - * A convenience method to use when you need to ensure that a single - * method is reached only via HTTPS. If it isn't, then a redirect - * will happen back to this method and HSTS header will be sent - * to have modern browsers transform requests automatically. - * - * @param integer $duration The number of seconds this link should be - * considered secure for. Only with HSTS header. - * Default value is 1 year. - * - * @throws \CodeIgniter\HTTP\Exceptions\HTTPException - */ - protected function forceHTTPS(int $duration = 31536000) - { - force_https($duration, $this->request, $this->response); - } - - //-------------------------------------------------------------------- - - /** - * Provides a simple way to tie into the main CodeIgniter class - * and tell it how long to cache the current page for. - * - * @param integer $time - */ - protected function cachePage(int $time) - { - CodeIgniter::cache($time); - } - - //-------------------------------------------------------------------- - - /** - * Handles "auto-loading" helper files. - */ - protected function loadHelpers() - { - if (empty($this->helpers)) - { - return; - } - - foreach ($this->helpers as $helper) - { - helper($helper); - } - } - - //-------------------------------------------------------------------- - - /** - * A shortcut to performing validation on input data. If validation - * is not successful, a $errors property will be set on this class. - * - * @param array|string $rules - * @param array $messages An array of custom error messages - * - * @return boolean - */ - protected function validate($rules, array $messages = []): bool - { - $this->validator = Services::validation(); - - // If you replace the $rules array with the name of the group - if (is_string($rules)) - { - $validation = config('Validation'); - - // If the rule wasn't found in the \Config\Validation, we - // should throw an exception so the developer can find it. - if (! isset($validation->$rules)) - { - throw ValidationException::forRuleNotFound($rules); - } - - // If no error message is defined, use the error message in the Config\Validation file - if (! $messages) - { - $errorName = $rules . '_errors'; - $messages = $validation->$errorName ?? []; - } - - $rules = $validation->$rules; - } - - return $this->validator - ->withRequest($this->request) - ->setRules($rules, $messages) - ->run(); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/BaseBuilder.php b/vendor/codeigniter4/framework/system/Database/BaseBuilder.php deleted file mode 100644 index 9e2f3eb..0000000 --- a/vendor/codeigniter4/framework/system/Database/BaseBuilder.php +++ /dev/null @@ -1,3492 +0,0 @@ -db = $db; - - $this->from($tableName); - - if (! empty($options)) - { - foreach ($options as $key => $value) - { - if (property_exists($this, $key)) - { - $this->$key = $value; - } - } - } - } - - //-------------------------------------------------------------------- - - /** - * Sets a test mode status. - * - * @param boolean $mode Mode to set - * - * @return BaseBuilder - */ - public function testMode(bool $mode = true) - { - $this->testMode = $mode; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of bind values and their - * named parameters for binding in the Query object later. - * - * @return array - */ - public function getBinds(): array - { - return $this->binds; - } - - //-------------------------------------------------------------------- - - /** - * Ignore - * - * Set ignore Flag for next insert, - * update or delete query. - * - * @param boolean $ignore - * - * @return BaseBuilder - */ - public function ignore(bool $ignore = true) - { - $this->QBIgnore = $ignore; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Select - * - * Generates the SELECT portion of the query - * - * @param string|array $select - * @param boolean $escape - * - * @return BaseBuilder - */ - public function select($select = '*', bool $escape = null) - { - if (is_string($select)) - { - $select = explode(',', $select); - } - - // If the escape value was not set, we will base it on the global setting - is_bool($escape) || $escape = $this->db->protectIdentifiers; - - foreach ($select as $val) - { - $val = trim($val); - - if ($val !== '') - { - $this->QBSelect[] = $val; - - /* - * When doing 'SELECT NULL as field_alias FROM table' - * null gets taken as a field, and therefore escaped - * with backticks. - * This prevents NULL being escaped - * @see https://github.com/codeigniter4/CodeIgniter4/issues/1169 - */ - if (mb_stripos(trim($val), 'NULL') === 0) - { - $escape = false; - } - - $this->QBNoEscape[] = $escape; - } - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Select Max - * - * Generates a SELECT MAX(field) portion of a query - * - * @param string $select The field - * @param string $alias An alias - * - * @return BaseBuilder - */ - public function selectMax(string $select = '', string $alias = '') - { - return $this->maxMinAvgSum($select, $alias); - } - - //-------------------------------------------------------------------- - - /** - * Select Min - * - * Generates a SELECT MIN(field) portion of a query - * - * @param string $select The field - * @param string $alias An alias - * - * @return BaseBuilder - */ - public function selectMin(string $select = '', string $alias = '') - { - return $this->maxMinAvgSum($select, $alias, 'MIN'); - } - - //-------------------------------------------------------------------- - - /** - * Select Average - * - * Generates a SELECT AVG(field) portion of a query - * - * @param string $select The field - * @param string $alias An alias - * - * @return BaseBuilder - */ - public function selectAvg(string $select = '', string $alias = '') - { - return $this->maxMinAvgSum($select, $alias, 'AVG'); - } - - //-------------------------------------------------------------------- - - /** - * Select Sum - * - * Generates a SELECT SUM(field) portion of a query - * - * @param string $select The field - * @param string $alias An alias - * - * @return BaseBuilder - */ - public function selectSum(string $select = '', string $alias = '') - { - return $this->maxMinAvgSum($select, $alias, 'SUM'); - } - - //-------------------------------------------------------------------- - - /** - * Select Count - * - * Generates a SELECT COUNT(field) portion of a query - * - * @param string $select The field - * @param string $alias An alias - * - * @return BaseBuilder - */ - public function selectCount(string $select = '', string $alias = '') - { - return $this->maxMinAvgSum($select, $alias, 'COUNT'); - } - - //-------------------------------------------------------------------- - - /** - * SELECT [MAX|MIN|AVG|SUM|COUNT]() - * - * @used-by selectMax() - * @used-by selectMin() - * @used-by selectAvg() - * @used-by selectSum() - * - * @param string $select Field name - * @param string $alias - * @param string $type - * - * @return BaseBuilder - * @throws \CodeIgniter\Database\Exceptions\DataException - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - protected function maxMinAvgSum(string $select = '', string $alias = '', string $type = 'MAX') - { - if ($select === '') - { - throw DataException::forEmptyInputGiven('Select'); - } - - if (strpos($select, ',') !== false) - { - throw DataException::forInvalidArgument('column name not separated by comma'); - } - - $type = strtoupper($type); - - if (! in_array($type, ['MAX', 'MIN', 'AVG', 'SUM', 'COUNT'])) - { - throw new DatabaseException('Invalid function type: ' . $type); - } - - if ($alias === '') - { - $alias = $this->createAliasFromTable(trim($select)); - } - - $sql = $type . '(' . $this->db->protectIdentifiers(trim($select)) . ') AS ' . $this->db->escapeIdentifiers(trim($alias)); - - $this->QBSelect[] = $sql; - $this->QBNoEscape[] = null; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Determines the alias name based on the table - * - * @param string $item - * - * @return string - */ - protected function createAliasFromTable(string $item): string - { - if (strpos($item, '.') !== false) - { - $item = explode('.', $item); - - return end($item); - } - - return $item; - } - - //-------------------------------------------------------------------- - - /** - * DISTINCT - * - * Sets a flag which tells the query string compiler to add DISTINCT - * - * @param boolean $val - * - * @return BaseBuilder - */ - public function distinct(bool $val = true) - { - $this->QBDistinct = $val; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * From - * - * Generates the FROM portion of the query - * - * @param mixed $from can be a string or array - * @param boolean $overwrite Should we remove the first table existing? - * - * @return BaseBuilder - */ - public function from($from, bool $overwrite = false) - { - if ($overwrite === true) - { - $this->QBFrom = []; - $this->db->setAliasedTables([]); - } - - foreach ((array) $from as $val) - { - if (strpos($val, ',') !== false) - { - foreach (explode(',', $val) as $v) - { - $v = trim($v); - $this->trackAliases($v); - - $this->QBFrom[] = $v = $this->db->protectIdentifiers($v, true, null, false); - } - } - else - { - $val = trim($val); - - // Extract any aliases that might exist. We use this information - // in the protectIdentifiers to know whether to add a table prefix - $this->trackAliases($val); - - $this->QBFrom[] = $this->db->protectIdentifiers($val, true, null, false); - } - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * JOIN - * - * Generates the JOIN portion of the query - * - * @param string $table - * @param string $cond The join condition - * @param string $type The type of join - * @param boolean $escape Whether not to try to escape identifiers - * - * @return BaseBuilder - */ - public function join(string $table, string $cond, string $type = '', bool $escape = null) - { - if ($type !== '') - { - $type = strtoupper(trim($type)); - - if (! in_array($type, $this->joinTypes, true)) - { - $type = ''; - } - else - { - $type .= ' '; - } - } - - // Extract any aliases that might exist. We use this information - // in the protectIdentifiers to know whether to add a table prefix - $this->trackAliases($table); - - is_bool($escape) || $escape = $this->db->protectIdentifiers; - - if (! $this->hasOperator($cond)) - { - $cond = ' USING (' . ($escape ? $this->db->escapeIdentifiers($cond) : $cond) . ')'; - } - elseif ($escape === false) - { - $cond = ' ON ' . $cond; - } - else - { - // Split multiple conditions - if (preg_match_all('/\sAND\s|\sOR\s/i', $cond, $joints, PREG_OFFSET_CAPTURE)) - { - $conditions = []; - $joints = $joints[0]; - array_unshift($joints, ['', 0]); - - for ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i --) - { - $joints[$i][1] += strlen($joints[$i][0]); // offset - $conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]); - $pos = $joints[$i][1] - strlen($joints[$i][0]); - $joints[$i] = $joints[$i][0]; - } - ksort($conditions); - } - else - { - $conditions = [$cond]; - $joints = ['']; - } - - $cond = ' ON '; - foreach ($conditions as $i => $condition) - { - $operator = $this->getOperator($condition); - $cond .= $joints[$i]; - $cond .= preg_match("/(\(*)?([\[\]\w\.'-]+)" . preg_quote($operator) . '(.*)/i', $condition, $match) ? $match[1] . $this->db->protectIdentifiers($match[2]) . $operator . $this->db->protectIdentifiers($match[3]) : $condition; - } - } - - // Do we want to escape the table name? - if ($escape === true) - { - $table = $this->db->protectIdentifiers($table, true, null, false); - } - - // Assemble the JOIN statement - $this->QBJoin[] = $join = $type . 'JOIN ' . $table . $cond; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * WHERE - * - * Generates the WHERE portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed $key - * @param mixed $value - * @param boolean $escape - * - * @return BaseBuilder - */ - public function where($key, $value = null, bool $escape = null) - { - return $this->whereHaving('QBWhere', $key, $value, 'AND ', $escape); - } - - //-------------------------------------------------------------------- - - /** - * OR WHERE - * - * Generates the WHERE portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed $key - * @param mixed $value - * @param boolean $escape - * - * @return BaseBuilder - */ - public function orWhere($key, $value = null, bool $escape = null) - { - return $this->whereHaving('QBWhere', $key, $value, 'OR ', $escape); - } - - //-------------------------------------------------------------------- - - /** - * WHERE, HAVING - * - * @used-by where() - * @used-by orWhere() - * @used-by having() - * @used-by orHaving() - * - * @param string $qb_key 'QBWhere' or 'QBHaving' - * @param mixed $key - * @param mixed $value - * @param string $type - * @param boolean $escape - * - * @return BaseBuilder - */ - protected function whereHaving(string $qb_key, $key, $value = null, string $type = 'AND ', bool $escape = null) - { - if (! is_array($key)) - { - $key = [$key => $value]; - } - - // If the escape value was not set will base it on the global setting - is_bool($escape) || $escape = $this->db->protectIdentifiers; - - foreach ($key as $k => $v) - { - $prefix = empty($this->$qb_key) ? $this->groupGetType('') : $this->groupGetType($type); - - if ($v !== null) - { - $op = $this->getOperator($k, true); - - if (! empty($op)) - { - $k = trim($k); - - end($op); - - $op = trim(current($op)); - - if (substr($k, -1 * strlen($op)) === $op) - { - $k = rtrim(strrev(preg_replace(strrev('/' . $op . '/'), strrev(''), strrev($k), 1))); - } - } - - $bind = $this->setBind($k, $v, $escape); - - if (empty($op)) - { - $k .= ' ='; - } - else - { - $k .= " $op"; - } - - if ($v instanceof Closure) - { - $builder = $this->cleanClone(); - $v = '(' . str_replace("\n", ' ', $v($builder)->getCompiledSelect()) . ')'; - } - else - { - $v = " :$bind:"; - } - } - elseif (! $this->hasOperator($k) && $qb_key !== 'QBHaving') - { - // value appears not to have been set, assign the test to IS NULL - $k .= ' IS NULL'; - } - elseif (preg_match('/\s*(!?=|<>|IS(?:\s+NOT)?)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) - { - $k = substr($k, 0, $match[0][1]) . ($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL'); - } - - $this->{$qb_key}[] = [ - 'condition' => $prefix . $k . $v, - 'escape' => $escape, - ]; - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * WHERE IN - * - * Generates a WHERE field IN('item', 'item') SQL query, - * joined with 'AND' if appropriate. - * - * @param string $key The field to search - * @param array|string|Closure $values The values searched on, or anonymous function with subquery - * @param boolean $escape - * - * @return BaseBuilder - */ - public function whereIn(string $key = null, $values = null, bool $escape = null) - { - return $this->_whereIn($key, $values, false, 'AND ', $escape); - } - - //-------------------------------------------------------------------- - - /** - * OR WHERE IN - * - * Generates a WHERE field IN('item', 'item') SQL query, - * joined with 'OR' if appropriate. - * - * @param string $key The field to search - * @param array|string|Closure $values The values searched on, or anonymous function with subquery - * @param boolean $escape - * - * @return BaseBuilder - */ - public function orWhereIn(string $key = null, $values = null, bool $escape = null) - { - return $this->_whereIn($key, $values, false, 'OR ', $escape); - } - - //-------------------------------------------------------------------- - - /** - * WHERE NOT IN - * - * Generates a WHERE field NOT IN('item', 'item') SQL query, - * joined with 'AND' if appropriate. - * - * @param string $key The field to search - * @param array|string|Closure $values The values searched on, or anonymous function with subquery - * @param boolean $escape - * - * @return BaseBuilder - */ - public function whereNotIn(string $key = null, $values = null, bool $escape = null) - { - return $this->_whereIn($key, $values, true, 'AND ', $escape); - } - - //-------------------------------------------------------------------- - - /** - * OR WHERE NOT IN - * - * Generates a WHERE field NOT IN('item', 'item') SQL query, - * joined with 'OR' if appropriate. - * - * @param string $key The field to search - * @param array|string|Closure $values The values searched on, or anonymous function with subquery - * @param boolean $escape - * - * @return BaseBuilder - */ - public function orWhereNotIn(string $key = null, $values = null, bool $escape = null) - { - return $this->_whereIn($key, $values, true, 'OR ', $escape); - } - - //-------------------------------------------------------------------- - - /** - * HAVING IN - * - * Generates a HAVING field IN('item', 'item') SQL query, - * joined with 'AND' if appropriate. - * - * @param string $key The field to search - * @param array|string|Closure $values The values searched on, or anonymous function with subquery - * @param boolean $escape - * - * @return BaseBuilder - */ - public function havingIn(string $key = null, $values = null, bool $escape = null) - { - return $this->_whereIn($key, $values, false, 'AND ', $escape, 'QBHaving'); - } - - //-------------------------------------------------------------------- - - /** - * OR HAVING IN - * - * Generates a HAVING field IN('item', 'item') SQL query, - * joined with 'OR' if appropriate. - * - * @param string $key The field to search - * @param array|string|Closure $values The values searched on, or anonymous function with subquery - * @param boolean $escape - * - * @return BaseBuilder - */ - public function orHavingIn(string $key = null, $values = null, bool $escape = null) - { - return $this->_whereIn($key, $values, false, 'OR ', $escape, 'QBHaving'); - } - - //-------------------------------------------------------------------- - - /** - * HAVING NOT IN - * - * Generates a HAVING field NOT IN('item', 'item') SQL query, - * joined with 'AND' if appropriate. - * - * @param string $key The field to search - * @param array|string|Closure $values The values searched on, or anonymous function with subquery - * @param boolean $escape - * - * @return BaseBuilder - */ - public function havingNotIn(string $key = null, $values = null, bool $escape = null) - { - return $this->_whereIn($key, $values, true, 'AND ', $escape, 'QBHaving'); - } - - //-------------------------------------------------------------------- - - /** - * OR HAVING NOT IN - * - * Generates a HAVING field NOT IN('item', 'item') SQL query, - * joined with 'OR' if appropriate. - * - * @param string $key The field to search - * @param array|string|Closure $values The values searched on, or anonymous function with subquery - * @param boolean $escape - * - * @return BaseBuilder - */ - public function orHavingNotIn(string $key = null, $values = null, bool $escape = null) - { - return $this->_whereIn($key, $values, true, 'OR ', $escape, 'QBHaving'); - } - - //-------------------------------------------------------------------- - - /** - * Internal WHERE IN - * - * @used-by WhereIn() - * @used-by orWhereIn() - * @used-by whereNotIn() - * @used-by orWhereNotIn() - * - * @param string $key The field to search - * @param array|Closure $values The values searched on, or anonymous function with subquery - * @param boolean $not If the statement would be IN or NOT IN - * @param string $type - * @param boolean $escape - * @param string $clause (Internal use only) - * @throws InvalidArgumentException - * - * @return BaseBuilder - */ - protected function _whereIn(string $key = null, $values = null, bool $not = false, string $type = 'AND ', bool $escape = null, string $clause = 'QBWhere') - { - if (empty($key) || ! is_string($key)) - { - if (CI_DEBUG) - { - throw new \InvalidArgumentException(sprintf('%s() expects $key to be a non-empty string', debug_backtrace(0, 2)[1]['function'])); - } - // @codeCoverageIgnoreStart - return $this; - // @codeCoverageIgnoreEnd - } - - if ($values === null || (! is_array($values) && ! ($values instanceof Closure))) - { - if (CI_DEBUG) - { - throw new \InvalidArgumentException(sprintf('%s() expects $values to be of type array or closure', debug_backtrace(0, 2)[1]['function'])); - } - // @codeCoverageIgnoreStart - return $this; - // @codeCoverageIgnoreEnd - } - - is_bool($escape) || $escape = $this->db->protectIdentifiers; - - $ok = $key; - - if ($escape === true) - { - $key = $this->db->protectIdentifiers($key); - } - - $not = ($not) ? ' NOT' : ''; - - if ($values instanceof Closure) - { - $builder = $this->cleanClone(); - $ok = str_replace("\n", ' ', $values($builder)->getCompiledSelect()); - } - else - { - $whereIn = is_array($values) ? array_values($values) : $values; - $ok = $this->setBind($ok, $whereIn, $escape); - } - - $prefix = empty($this->$clause) ? $this->groupGetType('') : $this->groupGetType($type); - - $whereIn = [ - 'condition' => $prefix . $key . $not . ($values instanceof Closure ? " IN ($ok)" : " IN :{$ok}:"), - 'escape' => false, - ]; - - $this->{$clause}[] = $whereIn; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * LIKE - * - * Generates a %LIKE% portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param boolean $escape - * @param boolean $insensitiveSearch IF true, will force a case-insensitive search - * - * @return BaseBuilder - */ - public function like($field, string $match = '', string $side = 'both', bool $escape = null, bool $insensitiveSearch = false) - { - return $this->_like($field, $match, 'AND ', $side, '', $escape, $insensitiveSearch); - } - - //-------------------------------------------------------------------- - - /** - * NOT LIKE - * - * Generates a NOT LIKE portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param boolean $escape - * @param boolean $insensitiveSearch IF true, will force a case-insensitive search - * - * @return BaseBuilder - */ - public function notLike($field, string $match = '', string $side = 'both', bool $escape = null, bool $insensitiveSearch = false) - { - return $this->_like($field, $match, 'AND ', $side, 'NOT', $escape, $insensitiveSearch); - } - - //-------------------------------------------------------------------- - - /** - * OR LIKE - * - * Generates a %LIKE% portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param boolean $escape - * @param boolean $insensitiveSearch IF true, will force a case-insensitive search - * - * @return BaseBuilder - */ - public function orLike($field, string $match = '', string $side = 'both', bool $escape = null, bool $insensitiveSearch = false) - { - return $this->_like($field, $match, 'OR ', $side, '', $escape, $insensitiveSearch); - } - - //-------------------------------------------------------------------- - - /** - * OR NOT LIKE - * - * Generates a NOT LIKE portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param boolean $escape - * @param boolean $insensitiveSearch IF true, will force a case-insensitive search - * - * @return BaseBuilder - */ - public function orNotLike($field, string $match = '', string $side = 'both', bool $escape = null, bool $insensitiveSearch = false) - { - return $this->_like($field, $match, 'OR ', $side, 'NOT', $escape, $insensitiveSearch); - } - - // -------------------------------------------------------------------- - - /** - * LIKE with HAVING clause - * - * Generates a %LIKE% portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param boolean $escape - * - * @return BaseBuilder - */ - public function havingLike($field, string $match = '', string $side = 'both', bool $escape = null, bool $insensitiveSearch = false) - { - return $this->_like($field, $match, 'AND ', $side, '', $escape, $insensitiveSearch, 'QBHaving'); - } - - // -------------------------------------------------------------------- - - /** - * NOT LIKE with HAVING clause - * - * Generates a NOT LIKE portion of the query. - * Separates multiple calls with 'AND'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param boolean $escape - * - * @return BaseBuilder - */ - public function notHavingLike($field, string $match = '', string $side = 'both', bool $escape = null, bool $insensitiveSearch = false) - { - return $this->_like($field, $match, 'AND ', $side, 'NOT', $escape, $insensitiveSearch, 'QBHaving'); - } - - // -------------------------------------------------------------------- - - /** - * OR LIKE with HAVING clause - * - * Generates a %LIKE% portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param boolean $escape - * - * @return BaseBuilder - */ - public function orHavingLike($field, string $match = '', string $side = 'both', bool $escape = null, bool $insensitiveSearch = false) - { - return $this->_like($field, $match, 'OR ', $side, '', $escape, $insensitiveSearch, 'QBHaving'); - } - - // -------------------------------------------------------------------- - - /** - * OR NOT LIKE with HAVING clause - * - * Generates a NOT LIKE portion of the query. - * Separates multiple calls with 'OR'. - * - * @param mixed $field - * @param string $match - * @param string $side - * @param boolean $escape - * - * @return BaseBuilder - */ - public function orNotHavingLike($field, string $match = '', string $side = 'both', bool $escape = null, bool $insensitiveSearch = false) - { - return $this->_like($field, $match, 'OR ', $side, 'NOT', $escape, $insensitiveSearch, 'QBHaving'); - } - - //-------------------------------------------------------------------- - - /** - * Internal LIKE - * - * @used-by like() - * @used-by orLike() - * @used-by notLike() - * @used-by orNotLike() - * @used-by havingLike() - * @used-by orHavingLike() - * @used-by notHavingLike() - * @used-by orNotHavingLike() - * - * @param mixed $field - * @param string $match - * @param string $type - * @param string $side - * @param string $not - * @param boolean $escape - * @param boolean $insensitiveSearch IF true, will force a case-insensitive search - * @param string $clause (Internal use only) - * - * @return BaseBuilder - */ - protected function _like($field, string $match = '', string $type = 'AND ', string $side = 'both', string $not = '', bool $escape = null, bool $insensitiveSearch = false, string $clause = 'QBWhere') - { - if (! is_array($field)) - { - $field = [$field => $match]; - } - - $escape = is_bool($escape) ? $escape : $this->db->protectIdentifiers; - - // lowercase $side in case somebody writes e.g. 'BEFORE' instead of 'before' (doh) - $side = strtolower($side); - - foreach ($field as $k => $v) - { - if ($insensitiveSearch === true) - { - $v = strtolower($v); - } - - $prefix = empty($this->$clause) ? $this->groupGetType('') : $this->groupGetType($type); - - if ($side === 'none') - { - $bind = $this->setBind($k, $v, $escape); - } - elseif ($side === 'before') - { - $bind = $this->setBind($k, "%$v", $escape); - } - elseif ($side === 'after') - { - $bind = $this->setBind($k, "$v%", $escape); - } - else - { - $bind = $this->setBind($k, "%$v%", $escape); - } - - $like_statement = $this->_like_statement($prefix, $k, $not, $bind, $insensitiveSearch); - - // some platforms require an escape sequence definition for LIKE wildcards - if ($escape === true && $this->db->likeEscapeStr !== '') - { - $like_statement .= sprintf($this->db->likeEscapeStr, $this->db->likeEscapeChar); - } - - $this->{$clause}[] = [ - 'condition' => $like_statement, - 'escape' => $escape, - ]; - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Platform independent LIKE statement builder. - * - * @param string $prefix - * @param string $column - * @param string $not - * @param string $bind - * @param boolean $insensitiveSearch - * - * @return string $like_statement - */ - protected function _like_statement(string $prefix = null, string $column, string $not = null, string $bind, bool $insensitiveSearch = false): string - { - $like_statement = "{$prefix} {$column} {$not} LIKE :{$bind}:"; - - if ($insensitiveSearch === true) - { - $like_statement = "{$prefix} LOWER({$column}) {$not} LIKE :{$bind}:"; - } - - return $like_statement; - } - - //-------------------------------------------------------------------- - - /** - * Starts a query group. - * - * @return BaseBuilder - */ - public function groupStart() - { - return $this->groupStartPrepare(); - } - - //-------------------------------------------------------------------- - - /** - * Starts a query group, but ORs the group - * - * @return BaseBuilder - */ - public function orGroupStart() - { - return $this->groupStartPrepare('', 'OR '); - } - - //-------------------------------------------------------------------- - - /** - * Starts a query group, but NOTs the group - * - * @return BaseBuilder - */ - public function notGroupStart() - { - return $this->groupStartPrepare('NOT '); - } - - //-------------------------------------------------------------------- - - /** - * Starts a query group, but OR NOTs the group - * - * @return BaseBuilder - */ - public function orNotGroupStart() - { - return $this->groupStartPrepare('NOT ', 'OR '); - } - - //-------------------------------------------------------------------- - - /** - * Ends a query group - * - * @return BaseBuilder - */ - public function groupEnd() - { - return $this->groupEndPrepare(); - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group for HAVING clause. - * - * @return BaseBuilder - */ - public function havingGroupStart() - { - return $this->groupStartPrepare('', 'AND ', 'QBHaving'); - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group for HAVING clause, but ORs the group. - * - * @return BaseBuilder - */ - public function orHavingGroupStart() - { - return $this->groupStartPrepare('', 'OR ', 'QBHaving'); - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group for HAVING clause, but NOTs the group. - * - * @return BaseBuilder - */ - public function notHavingGroupStart() - { - return $this->groupStartPrepare('NOT ', 'AND ', 'QBHaving'); - } - - // -------------------------------------------------------------------- - - /** - * Starts a query group for HAVING clause, but OR NOTs the group. - * - * @return BaseBuilder - */ - public function orNotHavingGroupStart() - { - return $this->groupStartPrepare('NOT ', 'OR ', 'QBHaving'); - } - - // -------------------------------------------------------------------- - - /** - * Ends a query group for HAVING clause. - * - * @return BaseBuilder - */ - public function havingGroupEnd() - { - return $this->groupEndPrepare('QBHaving'); - } - - //-------------------------------------------------------------------- - - /** - * Prepate a query group start. - * - * @param string $not - * @param string $type - * @param string $clause - * - * @return BaseBuilder - */ - protected function groupStartPrepare(string $not = '', string $type = 'AND ', string $clause = 'QBWhere') - { - $type = $this->groupGetType($type); - - $this->QBWhereGroupStarted = true; - $prefix = empty($this->$clause) ? '' : $type; - $where = [ - 'condition' => $prefix . $not . str_repeat(' ', ++ $this->QBWhereGroupCount) . ' (', - 'escape' => false, - ]; - - $this->{$clause}[] = $where; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Prepate a query group end. - * - * @param string $clause - * - * @return BaseBuilder - */ - protected function groupEndPrepare(string $clause = 'QBWhere') - { - $this->QBWhereGroupStarted = false; - $where = [ - 'condition' => str_repeat(' ', $this->QBWhereGroupCount -- ) . ')', - 'escape' => false, - ]; - - $this->{$clause}[] = $where; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Group_get_type - * - * @used-by groupStart() - * @used-by _like() - * @used-by whereHaving() - * @used-by _whereIn() - * @used-by havingGroupStart() - * - * @param string $type - * - * @return string - */ - protected function groupGetType(string $type): string - { - if ($this->QBWhereGroupStarted) - { - $type = ''; - $this->QBWhereGroupStarted = false; - } - - return $type; - } - - //-------------------------------------------------------------------- - - /** - * GROUP BY - * - * @param string|array $by - * @param boolean $escape - * - * @return BaseBuilder - */ - public function groupBy($by, bool $escape = null) - { - is_bool($escape) || $escape = $this->db->protectIdentifiers; - - if (is_string($by)) - { - $by = ($escape === true) ? explode(',', $by) : [$by]; - } - - foreach ($by as $val) - { - $val = trim($val); - - if ($val !== '') - { - $val = [ - 'field' => $val, - 'escape' => $escape, - ]; - - $this->QBGroupBy[] = $val; - } - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * HAVING - * - * Separates multiple calls with 'AND'. - * - * @param string|array $key - * @param mixed $value - * @param boolean $escape - * - * @return BaseBuilder - */ - public function having($key, $value = null, bool $escape = null) - { - return $this->whereHaving('QBHaving', $key, $value, 'AND ', $escape); - } - - //-------------------------------------------------------------------- - - /** - * OR HAVING - * - * Separates multiple calls with 'OR'. - * - * @param string|array $key - * @param mixed $value - * @param boolean $escape - * - * @return BaseBuilder - */ - public function orHaving($key, $value = null, bool $escape = null) - { - return $this->whereHaving('QBHaving', $key, $value, 'OR ', $escape); - } - - //-------------------------------------------------------------------- - - /** - * ORDER BY - * - * @param string $orderBy - * @param string $direction ASC, DESC or RANDOM - * @param boolean $escape - * - * @return BaseBuilder - */ - public function orderBy(string $orderBy, string $direction = '', bool $escape = null) - { - $direction = strtoupper(trim($direction)); - - if ($direction === 'RANDOM') - { - $direction = ''; - - // Do we have a seed value? - $orderBy = ctype_digit((string) $orderBy) ? sprintf($this->randomKeyword[1], $orderBy) : $this->randomKeyword[0]; - } - elseif (empty($orderBy)) - { - return $this; - } - elseif ($direction !== '') - { - $direction = in_array($direction, ['ASC', 'DESC'], true) ? ' ' . $direction : ''; - } - - is_bool($escape) || $escape = $this->db->protectIdentifiers; - - if ($escape === false) - { - $qb_orderBy[] = [ - 'field' => $orderBy, - 'direction' => $direction, - 'escape' => false, - ]; - } - else - { - $qb_orderBy = []; - foreach (explode(',', $orderBy) as $field) - { - $qb_orderBy[] = ($direction === '' && preg_match('/\s+(ASC|DESC)$/i', rtrim($field), $match, PREG_OFFSET_CAPTURE)) - ? - [ - 'field' => ltrim(substr($field, 0, $match[0][1])), - 'direction' => ' ' . $match[1][0], - 'escape' => true, - ] - : - [ - 'field' => trim($field), - 'direction' => $direction, - 'escape' => true, - ]; - } - } - - $this->QBOrderBy = array_merge($this->QBOrderBy, $qb_orderBy); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * LIMIT - * - * @param integer $value LIMIT value - * @param integer $offset OFFSET value - * - * @return BaseBuilder - */ - public function limit(int $value = null, ?int $offset = 0) - { - if (! is_null($value)) - { - $this->QBLimit = $value; - } - - if (! empty($offset)) - { - $this->QBOffset = $offset; - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Sets the OFFSET value - * - * @param integer $offset OFFSET value - * - * @return BaseBuilder - */ - public function offset(int $offset) - { - if (! empty($offset)) - { - $this->QBOffset = (int) $offset; - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * LIMIT string - * - * Generates a platform-specific LIMIT clause. - * - * @param string $sql SQL Query - * - * @return string - */ - protected function _limit(string $sql, bool $offsetIgnore = false): string - { - return $sql . ' LIMIT ' . (false === $offsetIgnore && $this->QBOffset ? $this->QBOffset . ', ' : '') . $this->QBLimit; - } - - //-------------------------------------------------------------------- - - /** - * The "set" function. - * - * Allows key/value pairs to be set for insert(), update() or replace(). - * - * @param string|array|object $key Field name, or an array of field/value pairs - * @param string $value Field value, if $key is a single field - * @param boolean $escape Whether to escape values and identifiers - * - * @return BaseBuilder - */ - public function set($key, ?string $value = '', bool $escape = null) - { - $key = $this->objectToArray($key); - - if (! is_array($key)) - { - $key = [$key => $value]; - } - - $escape = is_bool($escape) ? $escape : $this->db->protectIdentifiers; - - foreach ($key as $k => $v) - { - if ($escape) - { - $bind = $this->setBind($k, $v, $escape); - $this->QBSet[$this->db->protectIdentifiers($k, false, $escape)] = ":$bind:"; - } - else - { - $this->QBSet[$this->db->protectIdentifiers($k, false, $escape)] = $v; - } - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the previously set() data, alternatively resetting it - * if needed. - * - * @param boolean $clean - * - * @return array - */ - public function getSetData(bool $clean = false): array - { - $data = $this->QBSet; - - if ($clean) - { - $this->QBSet = []; - } - - return $data; - } - - //-------------------------------------------------------------------- - - /** - * Get SELECT query string - * - * Compiles a SELECT query string and returns the sql. - * - * @param boolean $reset TRUE: resets QB values; FALSE: leave QB values alone - * - * @return string - */ - public function getCompiledSelect(bool $reset = true): string - { - $select = $this->compileSelect(); - - if ($reset === true) - { - $this->resetSelect(); - } - - return $this->compileFinalQuery($select); - } - - //-------------------------------------------------------------------- - - /** - * Returns a finalized, compiled query string with the bindings - * inserted and prefixes swapped out. - * - * @param string $sql - * - * @return string - */ - protected function compileFinalQuery(string $sql): string - { - $query = new Query($this->db); - $query->setQuery($sql, $this->binds, false); - - if (! empty($this->db->swapPre) && ! empty($this->db->DBPrefix)) - { - $query->swapPrefix($this->db->DBPrefix, $this->db->swapPre); - } - - return $query->getQuery(); - } - - /** - * Get - * - * Compiles the select statement based on the other functions called - * and runs the query - * - * @param integer $limit The limit clause - * @param integer $offset The offset clause - * @param boolean $reset Are we want to clear query builder values? - * - * @return ResultInterface - */ - public function get(int $limit = null, int $offset = 0, bool $reset = true) - { - if (! is_null($limit)) - { - $this->limit($limit, $offset); - } - - $result = $this->testMode - ? $this->getCompiledSelect($reset) - : $this->db->query($this->compileSelect(), $this->binds, false); - - if ($reset === true) - { - $this->resetSelect(); - - // Clear our binds so we don't eat up memory - $this->binds = []; - } - - return $result; - } - - //-------------------------------------------------------------------- - - /** - * "Count All" query - * - * Generates a platform-specific query string that counts all records in - * the specified database - * - * @param boolean $reset Are we want to clear query builder values? - * - * @return integer|string when $test = true - */ - public function countAll(bool $reset = true) - { - $table = $this->QBFrom[0]; - - $sql = $this->countString . $this->db->escapeIdentifiers('numrows') . ' FROM ' . - $this->db->protectIdentifiers($table, true, null, false); - - if ($this->testMode) - { - return $sql; - } - - $query = $this->db->query($sql, null, false); - if (empty($query->getResult())) - { - return 0; - } - - $query = $query->getRow(); - - if ($reset === true) - { - $this->resetSelect(); - } - - return (int) $query->numrows; - } - - //-------------------------------------------------------------------- - - /** - * "Count All Results" query - * - * Generates a platform-specific query string that counts all records - * returned by an Query Builder query. - * - * @param boolean $reset - * - * @return integer|string when $test = true - */ - public function countAllResults(bool $reset = true) - { - // ORDER BY usage is often problematic here (most notably - // on Microsoft SQL Server) and ultimately unnecessary - // for selecting COUNT(*) ... - $orderBy = []; - if (! empty($this->QBOrderBy)) - { - $orderBy = $this->QBOrderBy; - $this->QBOrderBy = null; - } - - // We cannot use a LIMIT when getting the single row COUNT(*) result - $limit = $this->QBLimit; - $this->QBLimit = false; - - $sql = ($this->QBDistinct === true || ! empty($this->QBGroupBy)) - ? - $this->countString . $this->db->protectIdentifiers('numrows') . "\nFROM (\n" . $this->compileSelect() . "\n) CI_count_all_results" - : - $this->compileSelect($this->countString . $this->db->protectIdentifiers('numrows')); - - if ($this->testMode) - { - return $sql; - } - - $result = $this->db->query($sql, $this->binds, false); - - if ($reset === true) - { - $this->resetSelect(); - } - // If we've previously reset the QBOrderBy values, get them back - elseif (! isset($this->QBOrderBy)) - { - $this->QBOrderBy = $orderBy ?? []; - } - - // Restore the LIMIT setting - $this->QBLimit = $limit; - - $row = (! $result instanceof ResultInterface) - ? null - : $result->getRow(); - - if (empty($row)) - { - return 0; - } - - return (int) $row->numrows; - } - - //-------------------------------------------------------------------- - /** - * Get compiled 'where' condition string - * - * Compiles the set conditions and returns the sql statement - * - * @return string - */ - public function getCompiledQBWhere() - { - return $this->QBWhere; - } - //-------------------------------------------------------------------- - - /** - * Get_Where - * - * Allows the where clause, limit and offset to be added directly - * - * @param string|array $where Where condition - * @param integer $limit Limit value - * @param integer $offset Offset value - * @param boolean $reset Are we want to clear query builder values? - * - * @return ResultInterface - */ - public function getWhere($where = null, int $limit = null, ?int $offset = 0, bool $reset = true) - { - if ($where !== null) - { - $this->where($where); - } - - if (! empty($limit)) - { - $this->limit($limit, $offset); - } - - $result = $this->testMode - ? $this->getCompiledSelect($reset) - : $this->db->query($this->compileSelect(), $this->binds, false); - - if ($reset === true) - { - $this->resetSelect(); - - // Clear our binds so we don't eat up memory - $this->binds = []; - } - - return $result; - } - - //-------------------------------------------------------------------- - - /** - * Insert_Batch - * - * Compiles batch insert strings and runs the queries - * - * @param array $set An associative array of insert values - * @param boolean $escape Whether to escape values and identifiers - * @param integer $batchSize Batch size - * - * @return integer Number of rows inserted or FALSE on failure - * @throws DatabaseException - */ - public function insertBatch(array $set = null, bool $escape = null, int $batchSize = 100) - { - if ($set === null) - { - if (empty($this->QBSet)) - { - if (CI_DEBUG) - { - throw new DatabaseException('You must use the "set" method to update an entry.'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - } - else - { - if (empty($set)) - { - if (CI_DEBUG) - { - throw new DatabaseException('insertBatch() called with no data'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - $this->setInsertBatch($set, '', $escape); - } - - $table = $this->QBFrom[0]; - - // Batch this baby - $affected_rows = 0; - for ($i = 0, $total = count($this->QBSet); $i < $total; $i += $batchSize) - { - $sql = $this->_insertBatch($this->db->protectIdentifiers($table, true, $escape, false), $this->QBKeys, array_slice($this->QBSet, $i, $batchSize)); - - if ($this->testMode) - { - ++ $affected_rows; - } - else - { - $this->db->query($sql, $this->binds, false); - $affected_rows += $this->db->affectedRows(); - } - } - - if (! $this->testMode) - { - $this->resetWrite(); - } - - return $affected_rows; - } - - //-------------------------------------------------------------------- - - /** - * Insert batch statement - * - * Generates a platform-specific insert string from the supplied data. - * - * @param string $table Table name - * @param array $keys INSERT keys - * @param array $values INSERT values - * - * @return string - */ - protected function _insertBatch(string $table, array $keys, array $values): string - { - return 'INSERT ' . $this->compileIgnore('insert') . 'INTO ' . $table . ' (' . implode(', ', $keys) . ') VALUES ' . implode(', ', $values); - } - - //-------------------------------------------------------------------- - - /** - * The "setInsertBatch" function. Allows key/value pairs to be set for batch inserts - * - * @param mixed $key - * @param string $value - * @param boolean $escape - * - * @return BaseBuilder|null - */ - public function setInsertBatch($key, string $value = '', bool $escape = null) - { - $key = $this->batchObjectToArray($key); - - if (! is_array($key)) - { - $key = [$key => $value]; - } - - $escape = is_bool($escape) ? $escape : $this->db->protectIdentifiers; - - $keys = array_keys($this->objectToArray(current($key))); - sort($keys); - - foreach ($key as $row) - { - $row = $this->objectToArray($row); - if (count(array_diff($keys, array_keys($row))) > 0 || count(array_diff(array_keys($row), $keys)) > 0) - { - // batch function above returns an error on an empty array - $this->QBSet[] = []; - - return null; - } - - ksort($row); // puts $row in the same order as our keys - - $clean = []; - foreach ($row as $k => $value) - { - $clean[] = ':' . $this->setBind($k, $value, $escape) . ':'; - } - - $row = $clean; - - $this->QBSet[] = '(' . implode(',', $row) . ')'; - } - - foreach ($keys as $k) - { - $this->QBKeys[] = $this->db->protectIdentifiers($k, false, $escape); - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Get INSERT query string - * - * Compiles an insert query and returns the sql - * - * @param boolean $reset TRUE: reset QB values; FALSE: leave QB values alone - * - * @throws DatabaseException - * - * @return string - */ - public function getCompiledInsert(bool $reset = true): string - { - if ($this->validateInsert() === false) - { - return false; - } - - $sql = $this->_insert( - $this->db->protectIdentifiers( - $this->QBFrom[0], true, null, false - ), array_keys($this->QBSet), array_values($this->QBSet) - ); - - if ($reset === true) - { - $this->resetWrite(); - } - - return $this->compileFinalQuery($sql); - } - - //-------------------------------------------------------------------- - - /** - * Insert - * - * Compiles an insert string and runs the query - * - * @param array $set An associative array of insert values - * @param boolean $escape Whether to escape values and identifiers - * - * @throws DatabaseException - * - * @return BaseResult|Query|false - */ - public function insert(array $set = null, bool $escape = null) - { - if ($set !== null) - { - $this->set($set, '', $escape); - } - - if ($this->validateInsert() === false) - { - return false; - } - - $sql = $this->_insert( - $this->db->protectIdentifiers( - $this->QBFrom[0], true, $escape, false - ), array_keys($this->QBSet), array_values($this->QBSet) - ); - - if (! $this->testMode) - { - $this->resetWrite(); - - $result = $this->db->query($sql, $this->binds, false); - - // Clear our binds so we don't eat up memory - $this->binds = []; - - return $result; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Validate Insert - * - * This method is used by both insert() and getCompiledInsert() to - * validate that the there data is actually being set and that table - * has been chosen to be inserted into. - * - * @return boolean - * @throws DatabaseException - */ - protected function validateInsert(): bool - { - if (empty($this->QBSet)) - { - if (CI_DEBUG) - { - throw new DatabaseException('You must use the "set" method to update an entry.'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Insert statement - * - * Generates a platform-specific insert string from the supplied data - * - * @param string $table The table name - * @param array $keys The insert keys - * @param array $unescapedKeys The insert values - * - * @return string - */ - protected function _insert(string $table, array $keys, array $unescapedKeys): string - { - return 'INSERT ' . $this->compileIgnore('insert') . 'INTO ' . $table . ' (' . implode(', ', $keys) . ') VALUES (' . implode(', ', $unescapedKeys) . ')'; - } - - //-------------------------------------------------------------------- - - /** - * Replace - * - * Compiles an replace into string and runs the query - * - * @param array $set An associative array of insert values - * - * @return BaseResult|Query|string|false - * @throws DatabaseException - */ - public function replace(array $set = null) - { - if ($set !== null) - { - $this->set($set); - } - - if (empty($this->QBSet)) - { - if (CI_DEBUG) - { - throw new DatabaseException('You must use the "set" method to update an entry.'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - $table = $this->QBFrom[0]; - - $sql = $this->_replace($table, array_keys($this->QBSet), array_values($this->QBSet)); - - $this->resetWrite(); - - return $this->testMode ? $sql : $this->db->query($sql, $this->binds, false); - } - - //-------------------------------------------------------------------- - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @param string $table The table name - * @param array $keys The insert keys - * @param array $values The insert values - * - * @return string - */ - protected function _replace(string $table, array $keys, array $values): string - { - return 'REPLACE INTO ' . $table . ' (' . implode(', ', $keys) . ') VALUES (' . implode(', ', $values) . ')'; - } - - //-------------------------------------------------------------------- - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * Note: This is only used (and overridden) by MySQL and CUBRID. - * - * @return string - */ - protected function _fromTables(): string - { - return implode(', ', $this->QBFrom); - } - - //-------------------------------------------------------------------- - - /** - * Get UPDATE query string - * - * Compiles an update query and returns the sql - * - * @param boolean $reset TRUE: reset QB values; FALSE: leave QB values alone - * - * @return string - */ - public function getCompiledUpdate(bool $reset = true): string - { - if ($this->validateUpdate() === false) - { - return false; - } - - $sql = $this->_update($this->QBFrom[0], $this->QBSet); - - if ($reset === true) - { - $this->resetWrite(); - } - - return $this->compileFinalQuery($sql); - } - - //-------------------------------------------------------------------- - - /** - * UPDATE - * - * Compiles an update string and runs the query. - * - * @param array $set An associative array of update values - * @param mixed $where - * @param integer $limit - * - * @throws DatabaseException - * - * @return boolean TRUE on success, FALSE on failure - */ - public function update(array $set = null, $where = null, int $limit = null): bool - { - if ($set !== null) - { - $this->set($set); - } - - if ($this->validateUpdate() === false) - { - return false; - } - - if ($where !== null) - { - $this->where($where); - } - - if (! empty($limit)) - { - if (! $this->canLimitWhereUpdates) - { - throw new DatabaseException('This driver does not allow LIMITs on UPDATE queries using WHERE.'); - } - - $this->limit($limit); - } - - $sql = $this->_update($this->QBFrom[0], $this->QBSet); - - if (! $this->testMode) - { - $this->resetWrite(); - - $result = $this->db->query($sql, $this->binds, false); - - if ($result->resultID !== false) - { - // Clear our binds so we don't eat up memory - $this->binds = []; - - return true; - } - - return false; - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table the Table name - * @param array $values the Update data - * - * @return string - */ - protected function _update(string $table, array $values): string - { - $valStr = []; - - foreach ($values as $key => $val) - { - $valStr[] = $key . ' = ' . $val; - } - - return 'UPDATE ' . $this->compileIgnore('update') . $table . ' SET ' . implode(', ', $valStr) - . $this->compileWhereHaving('QBWhere') - . $this->compileOrderBy() - . ($this->QBLimit ? $this->_limit(' ', true) : ''); - } - - //-------------------------------------------------------------------- - - /** - * Validate Update - * - * This method is used by both update() and getCompiledUpdate() to - * validate that data is actually being set and that a table has been - * chosen to be update. - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - protected function validateUpdate(): bool - { - if (empty($this->QBSet)) - { - if (CI_DEBUG) - { - throw new DatabaseException('You must use the "set" method to update an entry.'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Update_Batch - * - * Compiles an update string and runs the query - * - * @param array $set An associative array of update values - * @param string $index The where key - * @param integer $batchSize The size of the batch to run - * - * @return mixed Number of rows affected, SQL string, or FALSE on failure - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function updateBatch(array $set = null, string $index = null, int $batchSize = 100) - { - if ($index === null) - { - if (CI_DEBUG) - { - throw new DatabaseException('You must specify an index to match on for batch updates.'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - if ($set === null) - { - if (empty($this->QBSet)) - { - if (CI_DEBUG) - { - throw new DatabaseException('You must use the "set" method to update an entry.'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - } - else - { - if (empty($set)) - { - if (CI_DEBUG) - { - throw new DatabaseException('updateBatch() called with no data'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - $this->setUpdateBatch($set, $index); - } - - $table = $this->QBFrom[0]; - - // Batch this baby - $affected_rows = 0; - $savedSQL = []; - $savedQBWhere = $this->QBWhere; - for ($i = 0, $total = count($this->QBSet); $i < $total; $i += $batchSize) - { - $sql = $this->_updateBatch($table, array_slice($this->QBSet, $i, $batchSize), $this->db->protectIdentifiers($index) - ); - - if ($this->testMode) - { - $savedSQL[] = $sql; - } - else - { - $this->db->query($sql, $this->binds, false); - $affected_rows += $this->db->affectedRows(); - } - - $this->QBWhere = $savedQBWhere; - } - - $this->resetWrite(); - - return $this->testMode ? $savedSQL : $affected_rows; - } - - //-------------------------------------------------------------------- - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * - * @return string - */ - protected function _updateBatch(string $table, array $values, string $index): string - { - $ids = []; - $final = []; - - foreach ($values as $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$field][] = 'WHEN ' . $index . ' = ' . $val[$index] . ' THEN ' . $val[$field]; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= $k . " = CASE \n" - . implode("\n", $v) . "\n" - . 'ELSE ' . $k . ' END, '; - } - - $this->where($index . ' IN(' . implode(',', $ids) . ')', null, false); - - return 'UPDATE ' . $this->compileIgnore('update') . $table . ' SET ' . substr($cases, 0, -2) . $this->compileWhereHaving('QBWhere'); - } - - //-------------------------------------------------------------------- - - /** - * The "setUpdateBatch" function. Allows key/value pairs to be set for batch updating - * - * @param array|object $key - * @param string $index - * @param boolean $escape - * - * @return BaseBuilder|null - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function setUpdateBatch($key, string $index = '', bool $escape = null) - { - $key = $this->batchObjectToArray($key); - - if (! is_array($key)) - { - return null; - } - - is_bool($escape) || $escape = $this->db->protectIdentifiers; - - foreach ($key as $v) - { - $index_set = false; - $clean = []; - foreach ($v as $k2 => $v2) - { - if ($k2 === $index) - { - $index_set = true; - } - - $bind = $this->setBind($k2, $v2, $escape); - - $clean[$this->db->protectIdentifiers($k2, false, $escape)] = ":$bind:"; - } - - if ($index_set === false) - { - throw new DatabaseException('One or more rows submitted for batch updating is missing the specified index.'); - } - - $this->QBSet[] = $clean; - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Empty Table - * - * Compiles a delete string and runs "DELETE FROM table" - * - * @return boolean TRUE on success, FALSE on failure - */ - public function emptyTable() - { - $table = $this->QBFrom[0]; - - $sql = $this->_delete($table); - - if ($this->testMode) - { - return $sql; - } - - $this->resetWrite(); - - return $this->db->query($sql, null, false); - } - - //-------------------------------------------------------------------- - - /** - * Truncate - * - * Compiles a truncate string and runs the query - * If the database does not support the truncate() command - * This function maps to "DELETE FROM table" - * - * @return boolean TRUE on success, FALSE on failure - */ - public function truncate() - { - $table = $this->QBFrom[0]; - - $sql = $this->_truncate($table); - - if ($this->testMode) - { - return $sql; - } - - $this->resetWrite(); - - return $this->db->query($sql, null, false); - } - - //-------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the truncate() command, - * then this method maps to 'DELETE FROM table' - * - * @param string $table The table name - * - * @return string - */ - protected function _truncate(string $table): string - { - return 'TRUNCATE ' . $table; - } - - //-------------------------------------------------------------------- - - /** - * Get DELETE query string - * - * Compiles a delete query string and returns the sql - * - * @param boolean $reset TRUE: reset QB values; FALSE: leave QB values alone - * - * @return string - */ - public function getCompiledDelete(bool $reset = true): string - { - $table = $this->QBFrom[0]; - - $sql = $this->delete($table, null, $reset, true); - - return $this->compileFinalQuery($sql); - } - - //-------------------------------------------------------------------- - - /** - * Delete - * - * Compiles a delete string and runs the query - * - * @param mixed $where The where clause - * @param integer $limit The limit clause - * @param boolean $reset_data - * - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function delete($where = '', int $limit = null, bool $reset_data = true) - { - $table = $this->db->protectIdentifiers($this->QBFrom[0], true, null, false); - - if ($where !== '') - { - $this->where($where); - } - - if (empty($this->QBWhere)) - { - if (CI_DEBUG) - { - throw new DatabaseException('Deletes are not allowed unless they contain a "where" or "like" clause.'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - $sql = $this->_delete($table); - - if (! empty($limit)) - { - $this->QBLimit = $limit; - } - - if (! empty($this->QBLimit)) - { - if (! $this->canLimitDeletes) - { - throw new DatabaseException('SQLite3 does not allow LIMITs on DELETE queries.'); - } - - $sql = $this->_limit($sql, true); - } - - if ($reset_data) - { - $this->resetWrite(); - } - - return $this->testMode ? $sql : $this->db->query($sql, $this->binds, false); - } - - //-------------------------------------------------------------------- - - /** - * Increments a numeric column by the specified value. - * - * @param string $column - * @param integer $value - * - * @return boolean - */ - public function increment(string $column, int $value = 1) - { - $column = $this->db->protectIdentifiers($column); - - $sql = $this->_update($this->QBFrom[0], [$column => "{$column} + {$value}"]); - - return $this->db->query($sql, $this->binds, false); - } - - //-------------------------------------------------------------------- - - /** - * Decrements a numeric column by the specified value. - * - * @param string $column - * @param integer $value - * - * @return boolean - */ - public function decrement(string $column, int $value = 1) - { - $column = $this->db->protectIdentifiers($column); - - $sql = $this->_update($this->QBFrom[0], [$column => "{$column}-{$value}"]); - - return $this->db->query($sql, $this->binds, false); - } - - //-------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table The table name - * - * @return string - */ - protected function _delete(string $table): string - { - return 'DELETE ' . $this->compileIgnore('delete') . 'FROM ' . $table . $this->compileWhereHaving('QBWhere'); - } - - //-------------------------------------------------------------------- - - /** - * Track Aliases - * - * Used to track SQL statements written with aliased tables. - * - * @param string|array $table The table to inspect - * - * @return string|void - */ - protected function trackAliases($table) - { - if (is_array($table)) - { - foreach ($table as $t) - { - $this->trackAliases($t); - } - return; - } - - // Does the string contain a comma? If so, we need to separate - // the string into discreet statements - if (strpos($table, ',') !== false) - { - return $this->trackAliases(explode(',', $table)); - } - - // if a table alias is used we can recognize it by a space - if (strpos($table, ' ') !== false) - { - // if the alias is written with the AS keyword, remove it - $table = preg_replace('/\s+AS\s+/i', ' ', $table); - - // Grab the alias - $table = trim(strrchr($table, ' ')); - - // Store the alias, if it doesn't already exist - $this->db->addTableAlias($table); - } - } - - //-------------------------------------------------------------------- - - /** - * Compile the SELECT statement - * - * Generates a query string based on which functions were used. - * Should not be called directly. - * - * @param mixed $select_override - * - * @return string - */ - protected function compileSelect($select_override = false): string - { - // Write the "select" portion of the query - if ($select_override !== false) - { - $sql = $select_override; - } - else - { - $sql = ( ! $this->QBDistinct) ? 'SELECT ' : 'SELECT DISTINCT '; - - if (empty($this->QBSelect)) - { - $sql .= '*'; - } - else - { - // Cycle through the "select" portion of the query and prep each column name. - // The reason we protect identifiers here rather than in the select() function - // is because until the user calls the from() function we don't know if there are aliases - foreach ($this->QBSelect as $key => $val) - { - $no_escape = $this->QBNoEscape[$key] ?? null; - $this->QBSelect[$key] = $this->db->protectIdentifiers($val, false, $no_escape); - } - - $sql .= implode(', ', $this->QBSelect); - } - } - - // Write the "FROM" portion of the query - if (! empty($this->QBFrom)) - { - $sql .= "\nFROM " . $this->_fromTables(); - } - - // Write the "JOIN" portion of the query - if (! empty($this->QBJoin)) - { - $sql .= "\n" . implode("\n", $this->QBJoin); - } - - $sql .= $this->compileWhereHaving('QBWhere') - . $this->compileGroupBy() - . $this->compileWhereHaving('QBHaving') - . $this->compileOrderBy(); // ORDER BY - // LIMIT - if ($this->QBLimit) - { - return $this->_limit($sql . "\n"); - } - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * Compile Ignore Statement - * - * Checks if the ignore option is supported by - * the Database Driver for the specific statement. - * - * @param string $statement - * - * @return string - */ - protected function compileIgnore(string $statement) - { - $sql = ''; - - if ($this->QBIgnore && - isset($this->supportedIgnoreStatements[$statement]) - ) - { - $sql = trim($this->supportedIgnoreStatements[$statement]) . ' '; - } - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * Compile WHERE, HAVING statements - * - * Escapes identifiers in WHERE and HAVING statements at execution time. - * - * Required so that aliases are tracked properly, regardless of whether - * where(), orWhere(), having(), orHaving are called prior to from(), - * join() and prefixTable is added only if needed. - * - * @param string $qb_key 'QBWhere' or 'QBHaving' - * - * @return string SQL statement - */ - protected function compileWhereHaving(string $qb_key): string - { - if (! empty($this->$qb_key)) - { - foreach ($this->$qb_key as &$qbkey) - { - // Is this condition already compiled? - if (is_string($qbkey)) - { - continue; - } - elseif ($qbkey['escape'] === false) - { - $qbkey = $qbkey['condition']; - continue; - } - - // Split multiple conditions - $conditions = preg_split( - '/((?:^|\s+)AND\s+|(?:^|\s+)OR\s+)/i', $qbkey['condition'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY - ); - - foreach ($conditions as &$condition) - { - if (($op = $this->getOperator($condition)) === false - || ! preg_match('/^(\(?)(.*)(' . preg_quote($op, '/') . ')\s*(.*(? '(test <= foo)', /* the whole thing */ - // 1 => '(', /* optional */ - // 2 => 'test', /* the field name */ - // 3 => ' <= ', /* $op */ - // 4 => 'foo', /* optional, if $op is e.g. 'IS NULL' */ - // 5 => ')' /* optional */ - // ); - - if (! empty($matches[4])) - { - $protectIdentifiers = false; - if (strpos($matches[4], '.') !== false) - { - $protectIdentifiers = true; - } - - if (strpos($matches[4], ':') === false) - { - $matches[4] = $this->db->protectIdentifiers(trim($matches[4]), false, $protectIdentifiers); - } - - $matches[4] = ' ' . $matches[4]; - } - - $condition = $matches[1] . $this->db->protectIdentifiers(trim($matches[2])) - . ' ' . trim($matches[3]) . $matches[4] . $matches[5]; - } - - $qbkey = implode('', $conditions); - } - - return ($qb_key === 'QBHaving' ? "\nHAVING " : "\nWHERE ") - . implode("\n", $this->$qb_key); - } - - return ''; - } - - //-------------------------------------------------------------------- - - /** - * Compile GROUP BY - * - * Escapes identifiers in GROUP BY statements at execution time. - * - * Required so that aliases are tracked properly, regardless of whether - * groupBy() is called prior to from(), join() and prefixTable is added - * only if needed. - * - * @return string SQL statement - */ - protected function compileGroupBy(): string - { - if (! empty($this->QBGroupBy)) - { - foreach ($this->QBGroupBy as &$groupBy) - { - // Is it already compiled? - if (is_string($groupBy)) - { - continue; - } - - $groupBy = ($groupBy['escape'] === false || - $this->isLiteral($groupBy['field'])) ? $groupBy['field'] : $this->db->protectIdentifiers($groupBy['field']); - } - - return "\nGROUP BY " . implode(', ', $this->QBGroupBy); - } - - return ''; - } - - //-------------------------------------------------------------------- - - /** - * Compile ORDER BY - * - * Escapes identifiers in ORDER BY statements at execution time. - * - * Required so that aliases are tracked properly, regardless of whether - * orderBy() is called prior to from(), join() and prefixTable is added - * only if needed. - * - * @return string SQL statement - */ - protected function compileOrderBy(): string - { - if (is_array($this->QBOrderBy) && ! empty($this->QBOrderBy)) - { - foreach ($this->QBOrderBy as &$orderBy) - { - if ($orderBy['escape'] !== false && ! $this->isLiteral($orderBy['field'])) - { - $orderBy['field'] = $this->db->protectIdentifiers($orderBy['field']); - } - - $orderBy = $orderBy['field'] . $orderBy['direction']; - } - - return $this->QBOrderBy = "\nORDER BY " . implode(', ', $this->QBOrderBy); - } - elseif (is_string($this->QBOrderBy)) - { - return $this->QBOrderBy; - } - - return ''; - } - - //-------------------------------------------------------------------- - - /** - * Object to Array - * - * Takes an object as input and converts the class variables to array key/vals - * - * @param mixed $object - * - * @return mixed - */ - protected function objectToArray($object) - { - if (! is_object($object)) - { - return $object; - } - - $array = []; - foreach (get_object_vars($object) as $key => $val) - { - // There are some built in keys we need to ignore for this conversion - if (! is_object($val) && ! is_array($val) && $key !== '_parent_name') - { - $array[$key] = $val; - } - } - - return $array; - } - - //-------------------------------------------------------------------- - - /** - * Object to Array - * - * Takes an object as input and converts the class variables to array key/vals - * - * @param mixed $object - * - * @return mixed - */ - protected function batchObjectToArray($object) - { - if (! is_object($object)) - { - return $object; - } - - $array = []; - $out = get_object_vars($object); - $fields = array_keys($out); - - foreach ($fields as $val) - { - // There are some built in keys we need to ignore for this conversion - if ($val !== '_parent_name') - { - $i = 0; - foreach ($out[$val] as $data) - { - $array[$i ++][$val] = $data; - } - } - } - - return $array; - } - - //-------------------------------------------------------------------- - - /** - * Is literal - * - * Determines if a string represents a literal value or a field name - * - * @param string $str - * - * @return boolean - */ - protected function isLiteral(string $str): bool - { - $str = trim($str); - - if (empty($str) || ctype_digit($str) || (string) (float) $str === $str || - in_array(strtoupper($str), ['TRUE', 'FALSE'], true) - ) - { - return true; - } - - static $_str; - - if (empty($_str)) - { - $_str = ($this->db->escapeChar !== '"') ? ['"', "'"] : ["'"]; - } - - return in_array($str[0], $_str, true); - } - - //-------------------------------------------------------------------- - - /** - * Reset Query Builder values. - * - * Publicly-visible method to reset the QB values. - * - * @return BaseBuilder - */ - public function resetQuery() - { - $this->resetSelect(); - $this->resetWrite(); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Resets the query builder values. Called by the get() function - * - * @param array $qb_reset_items An array of fields to reset - * - * @return void - */ - protected function resetRun(array $qb_reset_items) - { - foreach ($qb_reset_items as $item => $default_value) - { - $this->$item = $default_value; - } - } - - //-------------------------------------------------------------------- - - /** - * Resets the query builder values. Called by the get() function - */ - protected function resetSelect() - { - $this->resetRun([ - 'QBSelect' => [], - 'QBJoin' => [], - 'QBWhere' => [], - 'QBGroupBy' => [], - 'QBHaving' => [], - 'QBOrderBy' => [], - 'QBNoEscape' => [], - 'QBDistinct' => false, - 'QBLimit' => false, - 'QBOffset' => false, - ]); - - if (! empty($this->db)) - { - $this->db->setAliasedTables([]); - } - - // Reset QBFrom part - if (! empty($this->QBFrom)) - { - $this->from(array_shift($this->QBFrom), true); - } - } - - //-------------------------------------------------------------------- - - /** - * Resets the query builder "write" values. - * - * Called by the insert() update() insertBatch() updateBatch() and delete() functions - */ - protected function resetWrite() - { - $this->resetRun([ - 'QBSet' => [], - 'QBJoin' => [], - 'QBWhere' => [], - 'QBOrderBy' => [], - 'QBKeys' => [], - 'QBLimit' => false, - 'QBIgnore' => false, - ]); - } - - //-------------------------------------------------------------------- - - /** - * Tests whether the string has an SQL operator - * - * @param string $str - * - * @return boolean - */ - protected function hasOperator(string $str): bool - { - return (bool) preg_match('/(<|>|!|=|\sIS NULL|\sIS NOT NULL|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', trim($str)); - } - - // -------------------------------------------------------------------- - - /** - * Returns the SQL string operator - * - * @param string $str - * @param boolean $list - * - * @return mixed - */ - protected function getOperator(string $str, bool $list = false) - { - static $_operators; - - if (empty($_operators)) - { - $_les = ($this->db->likeEscapeStr !== '') ? '\s+' . preg_quote(trim(sprintf($this->db->likeEscapeStr, $this->db->likeEscapeChar)), '/') : ''; - $_operators = [ - '\s*(?:<|>|!)?=\s*', // =, <=, >=, != - '\s*<>?\s*', // <, <> - '\s*>\s*', // > - '\s+IS NULL', // IS NULL - '\s+IS NOT NULL', // IS NOT NULL - '\s+EXISTS\s*\(.*\)', // EXISTS(sql) - '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql) - '\s+BETWEEN\s+', // BETWEEN value AND value - '\s+IN\s*\(.*\)', // IN(list) - '\s+NOT IN\s*\(.*\)', // NOT IN (list) - '\s+LIKE\s+\S.*(' . $_les . ')?', // LIKE 'expr'[ ESCAPE '%s'] - '\s+NOT LIKE\s+\S.*(' . $_les . ')?', // NOT LIKE 'expr'[ ESCAPE '%s'] - ]; - } - - return preg_match_all('/' . implode('|', $_operators) . '/i', $str, $match) ? ($list ? $match[0] : $match[0][0]) : false; - } - - // -------------------------------------------------------------------- - - /** - * Stores a bind value after ensuring that it's unique. - * While it might be nicer to have named keys for our binds array - * with PHP 7+ we get a huge memory/performance gain with indexed - * arrays instead, so lets take advantage of that here. - * - * @param string $key - * @param mixed $value - * @param boolean $escape - * - * @return string - */ - protected function setBind(string $key, $value = null, bool $escape = true): string - { - if (! array_key_exists($key, $this->binds)) - { - $this->binds[$key] = [ - $value, - $escape, - ]; - - return $key; - } - - if (! array_key_exists($key, $this->bindsKeyCount)) - { - $this->bindsKeyCount[$key] = 0; - } - $count = $this->bindsKeyCount[$key]++; - - $this->binds[$key . $count] = [ - $value, - $escape, - ]; - - return $key . $count; - } - - //-------------------------------------------------------------------- - - /** - * Returns a clone of a Base Builder with reset query builder values. - * - * @return BaseBuilder - */ - protected function cleanClone() - { - return (clone $this)->from([], true)->resetQuery(); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/BaseConnection.php b/vendor/codeigniter4/framework/system/Database/BaseConnection.php deleted file mode 100644 index e1c4f7a..0000000 --- a/vendor/codeigniter4/framework/system/Database/BaseConnection.php +++ /dev/null @@ -1,1883 +0,0 @@ - $value) - { - if (property_exists($this, $key)) - { - $this->$key = $value; - } - } - } - - //-------------------------------------------------------------------- - - /** - * Initializes the database connection/settings. - * - * @return mixed|void - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function initialize() - { - /* If an established connection is available, then there's - * no need to connect and select the database. - * - * Depending on the database driver, conn_id can be either - * boolean TRUE, a resource or an object. - */ - if ($this->connID) - { - return; - } - - //-------------------------------------------------------------------- - - $this->connectTime = microtime(true); - - try - { - // Connect to the database and set the connection ID - $this->connID = $this->connect($this->pConnect); - } - catch (\Throwable $e) - { - log_message('error', 'Error connecting to the database: ' . $e->getMessage()); - } - - // No connection resource? Check if there is a failover else throw an error - if (! $this->connID) - { - // Check if there is a failover set - if (! empty($this->failover) && is_array($this->failover)) - { - // Go over all the failovers - foreach ($this->failover as $failover) - { - // Replace the current settings with those of the failover - foreach ($failover as $key => $val) - { - if (property_exists($this, $key)) - { - $this->$key = $val; - } - } - - try - { - // Try to connect - $this->connID = $this->connect($this->pConnect); - } - catch (\Throwable $e) - { - log_message('error', 'Error connecting to the database: ' . $e->getMessage()); - } - - // If a connection is made break the foreach loop - if ($this->connID) - { - break; - } - } - } - - // We still don't have a connection? - if (! $this->connID) - { - throw new DatabaseException('Unable to connect to the database.'); - } - } - - $this->connectDuration = microtime(true) - $this->connectTime; - } - - //-------------------------------------------------------------------- - - /** - * Connect to the database. - * - * @param boolean $persistent - * @return mixed - */ - abstract public function connect(bool $persistent = false); - - //-------------------------------------------------------------------- - - /** - * Close the database connection. - * - * @return void - */ - public function close() - { - if ($this->connID) - { - $this->_close(); - $this->connID = false; - } - } - - //-------------------------------------------------------------------- - - /** - * Platform dependent way method for closing the connection. - * - * @return mixed - */ - abstract protected function _close(); - - //-------------------------------------------------------------------- - - /** - * Create a persistent database connection. - * - * @return mixed - */ - public function persistentConnect() - { - return $this->connect(true); - } - - //-------------------------------------------------------------------- - - /** - * Keep or establish the connection if no queries have been sent for - * a length of time exceeding the server's idle timeout. - * - * @return mixed - */ - abstract public function reconnect(); - - //-------------------------------------------------------------------- - - /** - * Returns the actual connection object. If both a 'read' and 'write' - * connection has been specified, you can pass either term in to - * get that connection. If you pass either alias in and only a single - * connection is present, it must return the sole connection. - * - * @param string|null $alias - * - * @return mixed - */ - public function getConnection(string $alias = null) - { - //@todo work with read/write connections - return $this->connID; - } - - //-------------------------------------------------------------------- - - /** - * Select a specific database table to use. - * - * @param string $databaseName - * - * @return mixed - */ - abstract public function setDatabase(string $databaseName); - - //-------------------------------------------------------------------- - - /** - * Returns the name of the current database being used. - * - * @return string - */ - public function getDatabase(): string - { - return empty($this->database) ? '' : $this->database; - } - - //-------------------------------------------------------------------- - - /** - * Set DB Prefix - * - * Set's the DB Prefix to something new without needing to reconnect - * - * @param string $prefix The prefix - * - * @return string - */ - public function setPrefix(string $prefix = ''): string - { - return $this->DBPrefix = $prefix; - } - - //-------------------------------------------------------------------- - - /** - * Returns the database prefix. - * - * @return string - */ - public function getPrefix(): string - { - return $this->DBPrefix; - } - - //-------------------------------------------------------------------- - - /** - * The name of the platform in use (MySQLi, mssql, etc) - * - * @return string - */ - public function getPlatform(): string - { - return $this->DBDriver; - } - - //-------------------------------------------------------------------- - - /** - * Returns a string containing the version of the database being used. - * - * @return string - */ - abstract public function getVersion(): string; - - //-------------------------------------------------------------------- - - /** - * Sets the Table Aliases to use. These are typically - * collected during use of the Builder, and set here - * so queries are built correctly. - * - * @param array $aliases - * - * @return $this - */ - public function setAliasedTables(array $aliases) - { - $this->aliasedTables = $aliases; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Add a table alias to our list. - * - * @param string $table - * - * @return $this - */ - public function addTableAlias(string $table) - { - if (! in_array($table, $this->aliasedTables)) - { - $this->aliasedTables[] = $table; - } - - return $this; - } - - /** - * Executes the query against the database. - * - * @param $sql - * - * @return mixed - */ - abstract protected function execute(string $sql); - - //-------------------------------------------------------------------- - - /** - * Orchestrates a query against the database. Queries must use - * Database\Statement objects to store the query and build it. - * This method works with the cache. - * - * Should automatically handle different connections for read/write - * queries if needed. - * - * @param string $sql - * @param mixed ...$binds - * @param boolean $setEscapeFlags - * @param string $queryClass - * - * @return BaseResult|Query|false - */ - public function query(string $sql, $binds = null, bool $setEscapeFlags = true, string $queryClass = 'CodeIgniter\\Database\\Query') - { - if (empty($this->connID)) - { - $this->initialize(); - } - - $resultClass = str_replace('Connection', 'Result', get_class($this)); - /** - * @var Query $query - */ - $query = new $queryClass($this); - - $query->setQuery($sql, $binds, $setEscapeFlags); - - if (! empty($this->swapPre) && ! empty($this->DBPrefix)) - { - $query->swapPrefix($this->DBPrefix, $this->swapPre); - } - - $startTime = microtime(true); - - // Always save the last query so we can use - // the getLastQuery() method. - $this->lastQuery = $query; - - // Run the query for real - if (! $this->pretend && false === ($this->resultID = $this->simpleQuery($query->getQuery()))) - { - $query->setDuration($startTime, $startTime); - - // This will trigger a rollback if transactions are being used - if ($this->transDepth !== 0) - { - $this->transStatus = false; - } - - if ($this->DBDebug) - { - // We call this function in order to roll-back queries - // if transactions are enabled. If we don't call this here - // the error message will trigger an exit, causing the - // transactions to remain in limbo. - while ($this->transDepth !== 0) - { - $transDepth = $this->transDepth; - $this->transComplete(); - - if ($transDepth === $this->transDepth) - { - log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); - break; - } - } - - return false; - } - - if (! $this->pretend) - { - // Let others do something with this query. - Events::trigger('DBQuery', $query); - } - - return new $resultClass($this->connID, $this->resultID); - } - - $query->setDuration($startTime); - - if (! $this->pretend) - { - // Let others do something with this query - Events::trigger('DBQuery', $query); - } - - // If $pretend is true, then we just want to return - // the actual query object here. There won't be - // any results to return. - return $this->pretend ? $query : new $resultClass($this->connID, $this->resultID); - } - - //-------------------------------------------------------------------- - - /** - * Performs a basic query against the database. No binding or caching - * is performed, nor are transactions handled. Simply takes a raw - * query string and returns the database-specific result id. - * - * @param string $sql - * - * @return mixed - */ - public function simpleQuery(string $sql) - { - if (empty($this->connID)) - { - $this->initialize(); - } - - return $this->execute($sql); - } - - //-------------------------------------------------------------------- - - /** - * Disable Transactions - * - * This permits transactions to be disabled at run-time. - * - * @return void - */ - public function transOff() - { - $this->transEnabled = false; - } - - //-------------------------------------------------------------------- - - /** - * Enable/disable Transaction Strict Mode - * - * When strict mode is enabled, if you are running multiple groups of - * transactions, if one group fails all subsequent groups will be - * rolled back. - * - * If strict mode is disabled, each group is treated autonomously, - * meaning a failure of one group will not affect any others - * - * @param boolean $mode = true - * - * @return $this - */ - public function transStrict(bool $mode = true) - { - $this->transStrict = $mode; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Start Transaction - * - * @param boolean $test_mode = FALSE - * @return boolean - */ - public function transStart(bool $test_mode = false): bool - { - if (! $this->transEnabled) - { - return false; - } - - return $this->transBegin($test_mode); - } - - //-------------------------------------------------------------------- - - /** - * Complete Transaction - * - * @return boolean - */ - public function transComplete(): bool - { - if (! $this->transEnabled) - { - return false; - } - - // The query() function will set this flag to FALSE in the event that a query failed - if ($this->transStatus === false || $this->transFailure === true) - { - $this->transRollback(); - - // If we are NOT running in strict mode, we will reset - // the _trans_status flag so that subsequent groups of - // transactions will be permitted. - if ($this->transStrict === false) - { - $this->transStatus = true; - } - - // log_message('debug', 'DB Transaction Failure'); - return false; - } - - return $this->transCommit(); - } - - //-------------------------------------------------------------------- - - /** - * Lets you retrieve the transaction flag to determine if it has failed - * - * @return boolean - */ - public function transStatus(): bool - { - return $this->transStatus; - } - - //-------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @param boolean $test_mode - * @return boolean - */ - public function transBegin(bool $test_mode = false): bool - { - if (! $this->transEnabled) - { - return false; - } - // When transactions are nested we only begin/commit/rollback the outermost ones - elseif ($this->transDepth > 0) - { - $this->transDepth ++; - return true; - } - - if (empty($this->connID)) - { - $this->initialize(); - } - - // Reset the transaction failure flag. - // If the $test_mode flag is set to TRUE transactions will be rolled back - // even if the queries produce a successful result. - $this->transFailure = ($test_mode === true); - - if ($this->_transBegin()) - { - $this->transDepth ++; - return true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return boolean - */ - public function transCommit(): bool - { - if (! $this->transEnabled || $this->transDepth === 0) - { - return false; - } - // When transactions are nested we only begin/commit/rollback the outermost ones - elseif ($this->transDepth > 1 || $this->_transCommit()) - { - $this->transDepth --; - return true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return boolean - */ - public function transRollback(): bool - { - if (! $this->transEnabled || $this->transDepth === 0) - { - return false; - } - // When transactions are nested we only begin/commit/rollback the outermost ones - elseif ($this->transDepth > 1 || $this->_transRollback()) - { - $this->transDepth --; - return true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return boolean - */ - abstract protected function _transBegin(): bool; - - //-------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return boolean - */ - abstract protected function _transCommit(): bool; - - //-------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return boolean - */ - abstract protected function _transRollback(): bool; - - //-------------------------------------------------------------------- - - /** - * Returns an instance of the query builder for this connection. - * - * @param string|array $tableName - * - * @return BaseBuilder - * @throws DatabaseException - */ - public function table($tableName) - { - if (empty($tableName)) - { - throw new DatabaseException('You must set the database table to be used with your query.'); - } - - $className = str_replace('Connection', 'Builder', get_class($this)); - - return new $className($tableName, $this); - } - - //-------------------------------------------------------------------- - - /** - * Creates a prepared statement with the database that can then - * be used to execute multiple statements against. Within the - * closure, you would build the query in any normal way, though - * the Query Builder is the expected manner. - * - * Example: - * $stmt = $db->prepare(function($db) - * { - * return $db->table('users') - * ->where('id', 1) - * ->get(); - * }) - * - * @param \Closure $func - * @param array $options Passed to the prepare() method - * - * @return BasePreparedQuery|null - */ - public function prepare(\Closure $func, array $options = []) - { - if (empty($this->connID)) - { - $this->initialize(); - } - - $this->pretend(); - - $sql = $func($this); - - $this->pretend(false); - - if ($sql instanceof QueryInterface) - { - $sql = $sql->getOriginalQuery(); - } - - $class = str_ireplace('Connection', 'PreparedQuery', get_class($this)); - /** - * @var BasePreparedQuery $class - */ - $class = new $class($this); - - return $class->prepare($sql, $options); - } - - //-------------------------------------------------------------------- - - /** - * Returns the last query's statement object. - * - * @return mixed - */ - public function getLastQuery() - { - return $this->lastQuery; - } - - //-------------------------------------------------------------------- - - /** - * Returns a string representation of the last query's statement object. - * - * @return string - */ - public function showLastQuery(): string - { - return (string) $this->lastQuery; - } - - //-------------------------------------------------------------------- - - /** - * Returns the time we started to connect to this database in - * seconds with microseconds. - * - * Used by the Debug Toolbar's timeline. - * - * @return float|null - */ - public function getConnectStart(): ?float - { - return $this->connectTime; - } - - //-------------------------------------------------------------------- - - /** - * Returns the number of seconds with microseconds that it took - * to connect to the database. - * - * Used by the Debug Toolbar's timeline. - * - * @param integer $decimals - * - * @return string - */ - public function getConnectDuration(int $decimals = 6): string - { - return number_format($this->connectDuration, $decimals); - } - - //-------------------------------------------------------------------- - - /** - * Protect Identifiers - * - * This function is used extensively by the Query Builder class, and by - * a couple functions in this class. - * It takes a column or table name (optionally with an alias) and inserts - * the table prefix onto it. Some logic is necessary in order to deal with - * column names that include the path. Consider a query like this: - * - * SELECT hostname.database.table.column AS c FROM hostname.database.table - * - * Or a query with aliasing: - * - * SELECT m.member_id, m.member_name FROM members AS m - * - * Since the column name can include up to four segments (host, DB, table, column) - * or also have an alias prefix, we need to do a bit of work to figure this out and - * insert the table prefix (if it exists) in the proper position, and escape only - * the correct identifiers. - * - * @param string|array $item - * @param boolean $prefixSingle - * @param boolean $protectIdentifiers - * @param boolean $fieldExists - * - * @return string|array - */ - public function protectIdentifiers($item, bool $prefixSingle = false, bool $protectIdentifiers = null, bool $fieldExists = true) - { - if (! is_bool($protectIdentifiers)) - { - $protectIdentifiers = $this->protectIdentifiers; - } - - if (is_array($item)) - { - $escaped_array = []; - foreach ($item as $k => $v) - { - $escaped_array[$this->protectIdentifiers($k)] = $this->protectIdentifiers($v, $prefixSingle, $protectIdentifiers, $fieldExists); - } - - return $escaped_array; - } - - // This is basically a bug fix for queries that use MAX, MIN, etc. - // If a parenthesis is found we know that we do not need to - // escape the data or add a prefix. There's probably a more graceful - // way to deal with this, but I'm not thinking of it - // - // Added exception for single quotes as well, we don't want to alter - // literal strings. - if (strcspn($item, "()'") !== strlen($item)) - { - return $item; - } - - // Convert tabs or multiple spaces into single spaces - $item = preg_replace('/\s+/', ' ', trim($item)); - - // If the item has an alias declaration we remove it and set it aside. - // Note: strripos() is used in order to support spaces in table names - if ($offset = strripos($item, ' AS ')) - { - $alias = ($protectIdentifiers) ? substr($item, $offset, 4) . $this->escapeIdentifiers(substr($item, $offset + 4)) : substr($item, $offset); - $item = substr($item, 0, $offset); - } - elseif ($offset = strrpos($item, ' ')) - { - $alias = ($protectIdentifiers) ? ' ' . $this->escapeIdentifiers(substr($item, $offset + 1)) : substr($item, $offset); - $item = substr($item, 0, $offset); - } - else - { - $alias = ''; - } - - // Break the string apart if it contains periods, then insert the table prefix - // in the correct location, assuming the period doesn't indicate that we're dealing - // with an alias. While we're at it, we will escape the components - if (strpos($item, '.') !== false) - { - $parts = explode('.', $item); - - // Does the first segment of the exploded item match - // one of the aliases previously identified? If so, - // we have nothing more to do other than escape the item - // - // NOTE: The ! empty() condition prevents this method - // from breaking when QB isn't enabled. - if (! empty($this->aliasedTables) && in_array($parts[0], $this->aliasedTables)) - { - if ($protectIdentifiers === true) - { - foreach ($parts as $key => $val) - { - if (! in_array($val, $this->reservedIdentifiers)) - { - $parts[$key] = $this->escapeIdentifiers($val); - } - } - - $item = implode('.', $parts); - } - - return $item . $alias; - } - - // Is there a table prefix defined in the config file? If not, no need to do anything - if ($this->DBPrefix !== '') - { - // We now add the table prefix based on some logic. - // Do we have 4 segments (hostname.database.table.column)? - // If so, we add the table prefix to the column name in the 3rd segment. - if (isset($parts[3])) - { - $i = 2; - } - // Do we have 3 segments (database.table.column)? - // If so, we add the table prefix to the column name in 2nd position - elseif (isset($parts[2])) - { - $i = 1; - } - // Do we have 2 segments (table.column)? - // If so, we add the table prefix to the column name in 1st segment - else - { - $i = 0; - } - - // This flag is set when the supplied $item does not contain a field name. - // This can happen when this function is being called from a JOIN. - if ($fieldExists === false) - { - $i++; - } - - // Verify table prefix and replace if necessary - if ($this->swapPre !== '' && strpos($parts[$i], $this->swapPre) === 0) - { - $parts[$i] = preg_replace('/^' . $this->swapPre . '(\S+?)/', $this->DBPrefix . '\\1', $parts[$i]); - } - // We only add the table prefix if it does not already exist - elseif (strpos($parts[$i], $this->DBPrefix) !== 0) - { - $parts[$i] = $this->DBPrefix . $parts[$i]; - } - - // Put the parts back together - $item = implode('.', $parts); - } - - if ($protectIdentifiers === true) - { - $item = $this->escapeIdentifiers($item); - } - - return $item . $alias; - } - - // In some cases, especially 'from', we end up running through - // protect_identifiers twice. This algorithm won't work when - // it contains the escapeChar so strip it out. - $item = trim($item, $this->escapeChar); - - // Is there a table prefix? If not, no need to insert it - if ($this->DBPrefix !== '') - { - // Verify table prefix and replace if necessary - if ($this->swapPre !== '' && strpos($item, $this->swapPre) === 0) - { - $item = preg_replace('/^' . $this->swapPre . '(\S+?)/', $this->DBPrefix . '\\1', $item); - } - // Do we prefix an item with no segments? - elseif ($prefixSingle === true && strpos($item, $this->DBPrefix) !== 0) - { - $item = $this->DBPrefix . $item; - } - } - - if ($protectIdentifiers === true && ! in_array($item, $this->reservedIdentifiers)) - { - $item = $this->escapeIdentifiers($item); - } - - return $item . $alias; - } - - //-------------------------------------------------------------------- - - /** - * Escape the SQL Identifiers - * - * This function escapes column and table names - * - * @param mixed $item - * - * @return mixed - */ - public function escapeIdentifiers($item) - { - if ($this->escapeChar === '' || empty($item) || in_array($item, $this->reservedIdentifiers)) - { - return $item; - } - elseif (is_array($item)) - { - foreach ($item as $key => $value) - { - $item[$key] = $this->escapeIdentifiers($value); - } - - return $item; - } - // Avoid breaking functions and literal values inside queries - elseif (ctype_digit($item) || $item[0] === "'" || ( $this->escapeChar !== '"' && $item[0] === '"') || - strpos($item, '(') !== false - ) - { - return $item; - } - - static $preg_ec = []; - - if (empty($preg_ec)) - { - if (is_array($this->escapeChar)) - { - $preg_ec = [ - preg_quote($this->escapeChar[0], '/'), - preg_quote($this->escapeChar[1], '/'), - $this->escapeChar[0], - $this->escapeChar[1], - ]; - } - else - { - $preg_ec[0] = $preg_ec[1] = preg_quote($this->escapeChar, '/'); - $preg_ec[2] = $preg_ec[3] = $this->escapeChar; - } - } - - foreach ($this->reservedIdentifiers as $id) - { - if (strpos($item, '.' . $id) !== false) - { - return preg_replace('/' . $preg_ec[0] . '?([^' . $preg_ec[1] . '\.]+)' . $preg_ec[1] . '?\./i', $preg_ec[2] . '$1' . $preg_ec[3] . '.', $item); - } - } - - return preg_replace('/' . $preg_ec[0] . '?([^' . $preg_ec[1] . '\.]+)' . $preg_ec[1] . '?(\.)?/i', $preg_ec[2] . '$1' . $preg_ec[3] . '$2', $item); - } - - //-------------------------------------------------------------------- - - /** - * DB Prefix - * - * Prepends a database prefix if one exists in configuration - * - * @param string $table the table - * - * @return string - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function prefixTable(string $table = ''): string - { - if ($table === '') - { - throw new DatabaseException('A table name is required for that operation.'); - } - - return $this->DBPrefix . $table; - } - - //-------------------------------------------------------------------- - - /** - * Returns the total number of rows affected by this query. - * - * @return mixed - */ - abstract public function affectedRows(): int; - - //-------------------------------------------------------------------- - - /** - * "Smart" Escape String - * - * Escapes data based on type. - * Sets boolean and null types - * - * @param mixed $str - * - * @return mixed - */ - public function escape($str) - { - if (is_array($str)) - { - return array_map([&$this, 'escape'], $str); - } - else if (is_string($str) || ( is_object($str) && method_exists($str, '__toString'))) - { - return "'" . $this->escapeString($str) . "'"; - } - else if (is_bool($str)) - { - return ($str === false) ? 0 : 1; - } - else if (is_numeric($str) && $str < 0) - { - return "'{$str}'"; - } - else if ($str === null) - { - return 'NULL'; - } - - return $str; - } - - //-------------------------------------------------------------------- - - /** - * Escape String - * - * @param string|string[] $str Input string - * @param boolean $like Whether or not the string will be used in a LIKE condition - * @return string|string[] - */ - public function escapeString($str, bool $like = false) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escapeString($val, $like); - } - - return $str; - } - - $str = $this->_escapeString($str); - - // escape LIKE condition wildcards - if ($like === true) - { - return str_replace([ - $this->likeEscapeChar, - '%', - '_', - ], [ - $this->likeEscapeChar . $this->likeEscapeChar, - $this->likeEscapeChar . '%', - $this->likeEscapeChar . '_', - ], $str - ); - } - - return $str; - } - - //-------------------------------------------------------------------- - - /** - * Escape LIKE String - * - * Calls the individual driver for platform - * specific escaping for LIKE conditions - * - * @param string|string[] - * @return string|string[] - */ - public function escapeLikeString($str) - { - return $this->escapeString($str, true); - } - - //-------------------------------------------------------------------- - - /** - * Platform independent string escape. - * - * Will likely be overridden in child classes. - * - * @param string $str - * - * @return string - */ - protected function _escapeString(string $str): string - { - return str_replace("'", "''", remove_invisible_characters($str, false)); - } - - //-------------------------------------------------------------------- - - /** - * This function enables you to call PHP database functions that are not natively included - * in CodeIgniter, in a platform independent manner. - * - * @param string $functionName - * @param array ...$params - * - * @return boolean - * @throws DatabaseException - */ - public function callFunction(string $functionName, ...$params): bool - { - $driver = ($this->DBDriver === 'postgre' ? 'pg' : strtolower($this->DBDriver)) . '_'; - - if (false === strpos($driver, $functionName)) - { - $functionName = $driver . $functionName; - } - - if (! function_exists($functionName)) - { - if ($this->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - - return false; - } - - return $functionName(...$params); - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // META Methods - //-------------------------------------------------------------------- - - /** - * Returns an array of table names - * - * @param boolean $constrainByPrefix = FALSE - * @return boolean|array - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function listTables(bool $constrainByPrefix = false) - { - // Is there a cached result? - if (isset($this->dataCache['table_names']) && $this->dataCache['table_names']) - { - return $constrainByPrefix ? - preg_grep("/^{$this->DBPrefix}/", $this->dataCache['table_names']) - : $this->dataCache['table_names']; - } - - if (false === ($sql = $this->_listTables($constrainByPrefix))) - { - if ($this->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - return false; - } - - $this->dataCache['table_names'] = []; - $query = $this->query($sql); - - foreach ($query->getResultArray() as $row) - { - // Do we know from which column to get the table name? - if (! isset($key)) - { - if (isset($row['table_name'])) - { - $key = 'table_name'; - } - elseif (isset($row['TABLE_NAME'])) - { - $key = 'TABLE_NAME'; - } - else - { - /* We have no other choice but to just get the first element's key. - * Due to array_shift() accepting its argument by reference, if - * E_STRICT is on, this would trigger a warning. So we'll have to - * assign it first. - */ - $key = array_keys($row); - $key = array_shift($key); - } - } - - $this->dataCache['table_names'][] = $row[$key]; - } - - return $this->dataCache['table_names']; - } - - //-------------------------------------------------------------------- - - /** - * Determine if a particular table exists - * - * @param string $tableName - * @return boolean - */ - public function tableExists(string $tableName): bool - { - return in_array($this->protectIdentifiers($tableName, true, false, false), $this->listTables()); - } - - //-------------------------------------------------------------------- - - /** - * Fetch Field Names - * - * @param string $table Table name - * - * @return array|false - * @throws DatabaseException - */ - public function getFieldNames(string $table) - { - // Is there a cached result? - if (isset($this->dataCache['field_names'][$table])) - { - return $this->dataCache['field_names'][$table]; - } - - if (empty($this->connID)) - { - $this->initialize(); - } - - if (false === ($sql = $this->_listColumns($table))) - { - if ($this->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - return false; - } - - $query = $this->query($sql); - $this->dataCache['field_names'][$table] = []; - - foreach ($query->getResultArray() as $row) - { - // Do we know from where to get the column's name? - if (! isset($key)) - { - if (isset($row['column_name'])) - { - $key = 'column_name'; - } - elseif (isset($row['COLUMN_NAME'])) - { - $key = 'COLUMN_NAME'; - } - else - { - // We have no other choice but to just get the first element's key. - $key = key($row); - } - } - - $this->dataCache['field_names'][$table][] = $row[$key]; - } - - return $this->dataCache['field_names'][$table]; - } - - //-------------------------------------------------------------------- - - /** - * Determine if a particular field exists - * - * @param string $fieldName - * @param string $tableName - * @return boolean - */ - public function fieldExists(string $fieldName, string $tableName): bool - { - return in_array($fieldName, $this->getFieldNames($tableName)); - } - - //-------------------------------------------------------------------- - - /** - * Returns an object with field data - * - * @param string $table the table name - * @return array|false - */ - public function getFieldData(string $table) - { - $fields = $this->_fieldData($this->protectIdentifiers($table, true, false, false)); - - return $fields ?? false; - } - - //-------------------------------------------------------------------- - - /** - * Returns an object with key data - * - * @param string $table the table name - * @return array|false - */ - public function getIndexData(string $table) - { - $fields = $this->_indexData($this->protectIdentifiers($table, true, false, false)); - - return $fields ?? false; - } - - //-------------------------------------------------------------------- - - /** - * Returns an object with foreign key data - * - * @param string $table the table name - * @return array|false - */ - public function getForeignKeyData(string $table) - { - $fields = $this->_foreignKeyData($this->protectIdentifiers($table, true, false, false)); - - return $fields ?? false; - } - - //-------------------------------------------------------------------- - - /** - * Disables foreign key checks temporarily. - */ - public function disableForeignKeyChecks() - { - $sql = $this->_disableForeignKeyChecks(); - - return $this->query($sql); - } - - //-------------------------------------------------------------------- - - /** - * Enables foreign key checks temporarily. - */ - public function enableForeignKeyChecks() - { - $sql = $this->_enableForeignKeyChecks(); - - return $this->query($sql); - } - - //-------------------------------------------------------------------- - - /** - * Allows the engine to be set into a mode where queries are not - * actually executed, but they are still generated, timed, etc. - * - * This is primarily used by the prepared query functionality. - * - * @param boolean $pretend - * - * @return $this - */ - public function pretend(bool $pretend = true) - { - $this->pretend = $pretend; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Empties our data cache. Especially helpful during testing. - * - * @return $this - */ - public function resetDataCache() - { - $this->dataCache = []; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the last error code and message. - * - * Must return an array with keys 'code' and 'message': - * - * return ['code' => null, 'message' => null); - * - * @return array - */ - abstract public function error(): array; - - //-------------------------------------------------------------------- - - /** - * Insert ID - * - * @return integer - */ - abstract public function insertID(): int; - - //-------------------------------------------------------------------- - - /** - * Generates the SQL for listing tables in a platform-dependent manner. - * - * @param boolean $constrainByPrefix - * - * @return string - */ - abstract protected function _listTables(bool $constrainByPrefix = false): string; - - //-------------------------------------------------------------------- - - /** - * Generates a platform-specific query string so that the column names can be fetched. - * - * @param string $table - * - * @return string - */ - abstract protected function _listColumns(string $table = ''): string; - - //-------------------------------------------------------------------- - - /** - * Platform-specific field data information. - * - * @param string $table - * @see getFieldData() - * @return array - */ - abstract protected function _fieldData(string $table): array; - - //-------------------------------------------------------------------- - - /** - * Platform-specific index data. - * - * @param string $table - * @see getIndexData() - * @return array - */ - abstract protected function _indexData(string $table): array; - - //-------------------------------------------------------------------- - - /** - * Platform-specific foreign keys data. - * - * @param string $table - * @see getForeignKeyData() - * @return array - */ - abstract protected function _foreignKeyData(string $table): array; - - //-------------------------------------------------------------------- - - /** - * Accessor for properties if they exist. - * - * @param string $key - * - * @return mixed - */ - public function __get(string $key) - { - if (property_exists($this, $key)) - { - return $this->$key; - } - - return null; - } - - //-------------------------------------------------------------------- - - /** - * Checker for properties existence. - * - * @param string $key - * - * @return boolean - */ - public function __isset(string $key): bool - { - return property_exists($this, $key); - } - - //-------------------------------------------------------------------- - -} diff --git a/vendor/codeigniter4/framework/system/Database/BasePreparedQuery.php b/vendor/codeigniter4/framework/system/Database/BasePreparedQuery.php deleted file mode 100644 index 247d68c..0000000 --- a/vendor/codeigniter4/framework/system/Database/BasePreparedQuery.php +++ /dev/null @@ -1,274 +0,0 @@ -db = &$db; - } - - //-------------------------------------------------------------------- - - /** - * Prepares the query against the database, and saves the connection - * info necessary to execute the query later. - * - * NOTE: This version is based on SQL code. Child classes should - * override this method. - * - * @param string $sql - * @param array $options Passed to the connection's prepare statement. - * @param string $queryClass - * - * @return mixed - */ - public function prepare(string $sql, array $options = [], string $queryClass = 'CodeIgniter\\Database\\Query') - { - // We only supports positional placeholders (?) - // in order to work with the execute method below, so we - // need to replace our named placeholders (:name) - $sql = preg_replace('/:[^\s,)]+/', '?', $sql); - - /** - * @var \CodeIgniter\Database\Query $query - */ - $query = new $queryClass($this->db); - - $query->setQuery($sql); - - if (! empty($this->db->swapPre) && ! empty($this->db->DBPrefix)) - { - $query->swapPrefix($this->db->DBPrefix, $this->db->swapPre); - } - - $this->query = $query; - - return $this->_prepare($query->getOriginalQuery(), $options); - } - - //-------------------------------------------------------------------- - - /** - * The database-dependent portion of the prepare statement. - * - * @param string $sql - * @param array $options Passed to the connection's prepare statement. - * - * @return mixed - */ - abstract public function _prepare(string $sql, array $options = []); - - //-------------------------------------------------------------------- - - /** - * Takes a new set of data and runs it against the currently - * prepared query. Upon success, will return a Results object. - * - * @param array $data - * - * @return ResultInterface - */ - public function execute(...$data) - { - // Execute the Query. - $startTime = microtime(true); - - $result = $this->_execute($data); - - // Update our query object - $query = clone $this->query; - $query->setBinds($data); - - $query->setDuration($startTime); - - // Let others do something with this query - Events::trigger('DBQuery', $query); - - // Return a result object - $resultClass = str_replace('PreparedQuery', 'Result', get_class($this)); - - $resultID = $this->_getResult(); - - return new $resultClass($this->db->connID, $resultID); - } - - //-------------------------------------------------------------------- - - /** - * The database dependant version of the execute method. - * - * @param array $data - * - * @return boolean - */ - abstract public function _execute(array $data): bool; - - //-------------------------------------------------------------------- - - /** - * Returns the result object for the prepared query. - * - * @return mixed - */ - abstract public function _getResult(); - - //-------------------------------------------------------------------- - - /** - * Explicitly closes the statement. - * - * @return null|void - */ - public function close() - { - if (! is_object($this->statement)) - { - return; - } - - $this->statement->close(); - } - - //-------------------------------------------------------------------- - - /** - * Returns the SQL that has been prepared. - * - * @return string - */ - public function getQueryString(): string - { - if (! $this->query instanceof QueryInterface) - { - throw new \BadMethodCallException('Cannot call getQueryString on a prepared query until after the query has been prepared.'); - } - - return $this->query->getQuery(); - } - - //-------------------------------------------------------------------- - - /** - * A helper to determine if any error exists. - * - * @return boolean - */ - public function hasError(): bool - { - return ! empty($this->errorString); - } - - //-------------------------------------------------------------------- - - /** - * Returns the error code created while executing this statement. - * - * @return integer - */ - public function getErrorCode(): int - { - return $this->errorCode; - } - - //-------------------------------------------------------------------- - - /** - * Returns the error message created while executing this statement. - * - * @return string - */ - public function getErrorMessage(): string - { - return $this->errorString; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/BaseResult.php b/vendor/codeigniter4/framework/system/Database/BaseResult.php deleted file mode 100644 index 5c6500e..0000000 --- a/vendor/codeigniter4/framework/system/Database/BaseResult.php +++ /dev/null @@ -1,631 +0,0 @@ -connID = $connID; - $this->resultID = $resultID; - } - - //-------------------------------------------------------------------- - - /** - * Retrieve the results of the query. Typically an array of - * individual data rows, which can be either an 'array', an - * 'object', or a custom class name. - * - * @param string $type The row type. Either 'array', 'object', or a class name to use - * - * @return array - */ - public function getResult(string $type = 'object'): array - { - if ($type === 'array') - { - return $this->getResultArray(); - } - elseif ($type === 'object') - { - return $this->getResultObject(); - } - - return $this->getCustomResultObject($type); - } - - //-------------------------------------------------------------------- - - /** - * Returns the results as an array of custom objects. - * - * @param string $className The name of the class to use. - * - * @return mixed - */ - public function getCustomResultObject(string $className) - { - if (isset($this->customResultObject[$className])) - { - return $this->customResultObject[$className]; - } - - if (is_bool($this->resultID) || ! $this->resultID || $this->numRows === 0) - { - return []; - } - - // Don't fetch the result set again if we already have it - $_data = null; - if (($c = count($this->resultArray)) > 0) - { - $_data = 'resultArray'; - } - elseif (($c = count($this->resultObject)) > 0) - { - $_data = 'resultObject'; - } - - if ($_data !== null) - { - for ($i = 0; $i < $c; $i ++) - { - $this->customResultObject[$className][$i] = new $className(); - - foreach ($this->{$_data}[$i] as $key => $value) - { - $this->customResultObject[$className][$i]->$key = $value; - } - } - - return $this->customResultObject[$className]; - } - - is_null($this->rowData) || $this->dataSeek(); - $this->customResultObject[$className] = []; - - while ($row = $this->fetchObject($className)) - { - if (! is_subclass_of($row, Entity::class) && method_exists($row, 'syncOriginal')) - { - $row->syncOriginal(); - } - - $this->customResultObject[$className][] = $row; - } - - return $this->customResultObject[$className]; - } - - //-------------------------------------------------------------------- - - /** - * Returns the results as an array of arrays. - * - * If no results, an empty array is returned. - * - * @return array - */ - public function getResultArray(): array - { - if (! empty($this->resultArray)) - { - return $this->resultArray; - } - - // In the event that query caching is on, the result_id variable - // will not be a valid resource so we'll simply return an empty - // array. - if (is_bool($this->resultID) || ! $this->resultID || $this->numRows === 0) - { - return []; - } - - if ($this->resultObject) - { - foreach ($this->resultObject as $row) - { - $this->resultArray[] = (array) $row; - } - - return $this->resultArray; - } - - is_null($this->rowData) || $this->dataSeek(); - while ($row = $this->fetchAssoc()) - { - $this->resultArray[] = $row; - } - - return $this->resultArray; - } - - //-------------------------------------------------------------------- - - /** - * Returns the results as an array of objects. - * - * If no results, an empty array is returned. - * - * @return array - */ - public function getResultObject(): array - { - if (! empty($this->resultObject)) - { - return $this->resultObject; - } - - // In the event that query caching is on, the result_id variable - // will not be a valid resource so we'll simply return an empty - // array. - if (is_bool($this->resultID) || ! $this->resultID || $this->numRows === 0) - { - return []; - } - - if ($this->resultArray) - { - foreach ($this->resultArray as $row) - { - $this->resultObject[] = (object) $row; - } - - return $this->resultObject; - } - - is_null($this->rowData) || $this->dataSeek(); - while ($row = $this->fetchObject()) - { - if (! is_subclass_of($row, Entity::class) && method_exists($row, 'syncOriginal')) - { - $row->syncOriginal(); - } - - $this->resultObject[] = $row; - } - - return $this->resultObject; - } - - //-------------------------------------------------------------------- - - /** - * Wrapper object to return a row as either an array, an object, or - * a custom class. - * - * If row doesn't exist, returns null. - * - * @param mixed $n The index of the results to return - * @param string $type The type of result object. 'array', 'object' or class name. - * - * @return mixed - */ - public function getRow($n = 0, string $type = 'object') - { - if (! is_numeric($n)) - { - // We cache the row data for subsequent uses - is_array($this->rowData) || $this->rowData = $this->getRowArray(); - - // array_key_exists() instead of isset() to allow for NULL values - if (empty($this->rowData) || ! array_key_exists($n, $this->rowData)) - { - return null; - } - - return $this->rowData[$n]; - } - - if ($type === 'object') - { - return $this->getRowObject($n); - } - elseif ($type === 'array') - { - return $this->getRowArray($n); - } - - return $this->getCustomRowObject($n, $type); - } - - //-------------------------------------------------------------------- - - /** - * Returns a row as a custom class instance. - * - * If row doesn't exists, returns null. - * - * @param integer $n - * @param string $className - * - * @return mixed - */ - public function getCustomRowObject(int $n, string $className) - { - isset($this->customResultObject[$className]) || $this->getCustomResultObject($className); - - if (empty($this->customResultObject[$className])) - { - return null; - } - - if ($n !== $this->currentRow && isset($this->customResultObject[$className][$n])) - { - $this->currentRow = $n; - } - - return $this->customResultObject[$className][$this->currentRow]; - } - - //-------------------------------------------------------------------- - - /** - * Returns a single row from the results as an array. - * - * If row doesn't exist, returns null. - * - * @param integer $n - * - * @return mixed - */ - public function getRowArray(int $n = 0) - { - $result = $this->getResultArray(); - if (empty($result)) - { - return null; - } - - if ($n !== $this->currentRow && isset($result[$n])) - { - $this->currentRow = $n; - } - - return $result[$this->currentRow]; - } - - //-------------------------------------------------------------------- - - /** - * Returns a single row from the results as an object. - * - * If row doesn't exist, returns null. - * - * @param integer $n - * - * @return mixed - */ - public function getRowObject(int $n = 0) - { - $result = $this->getResultObject(); - if (empty($result)) - { - return null; - } - - if ($n !== $this->customResultObject && isset($result[$n])) - { - $this->currentRow = $n; - } - - return $result[$this->currentRow]; - } - - //-------------------------------------------------------------------- - - /** - * Assigns an item into a particular column slot. - * - * @param mixed $key - * @param mixed $value - * - * @return mixed - */ - public function setRow($key, $value = null) - { - // We cache the row data for subsequent uses - if (! is_array($this->rowData)) - { - $this->rowData = $this->getRowArray(); - } - - if (is_array($key)) - { - foreach ($key as $k => $v) - { - $this->rowData[$k] = $v; - } - - return; - } - - if ($key !== '' && $value !== null) - { - $this->rowData[$key] = $value; - } - } - - //-------------------------------------------------------------------- - - /** - * Returns the "first" row of the current results. - * - * @param string $type - * - * @return mixed - */ - public function getFirstRow(string $type = 'object') - { - $result = $this->getResult($type); - - return (empty($result)) ? null : $result[0]; - } - - //-------------------------------------------------------------------- - - /** - * Returns the "last" row of the current results. - * - * @param string $type - * - * @return mixed - */ - public function getLastRow(string $type = 'object') - { - $result = $this->getResult($type); - - return (empty($result)) ? null : $result[count($result) - 1]; - } - - //-------------------------------------------------------------------- - - /** - * Returns the "next" row of the current results. - * - * @param string $type - * - * @return mixed - */ - public function getNextRow(string $type = 'object') - { - $result = $this->getResult($type); - if (empty($result)) - { - return null; - } - - return isset($result[$this->currentRow + 1]) ? $result[++ $this->currentRow] : null; - } - - //-------------------------------------------------------------------- - - /** - * Returns the "previous" row of the current results. - * - * @param string $type - * - * @return mixed - */ - public function getPreviousRow(string $type = 'object') - { - $result = $this->getResult($type); - if (empty($result)) - { - return null; - } - - if (isset($result[$this->currentRow - 1])) - { - -- $this->currentRow; - } - - return $result[$this->currentRow]; - } - - //-------------------------------------------------------------------- - - /** - * Returns an unbuffered row and move the pointer to the next row. - * - * @param string $type - * - * @return mixed - */ - public function getUnbufferedRow(string $type = 'object') - { - if ($type === 'array') - { - return $this->fetchAssoc(); - } - elseif ($type === 'object') - { - return $this->fetchObject(); - } - - return $this->fetchObject($type); - } - - //-------------------------------------------------------------------- - - /** - * Gets the number of fields in the result set. - * - * @return integer - */ - abstract public function getFieldCount(): int; - - //-------------------------------------------------------------------- - - /** - * Generates an array of column names in the result set. - * - * @return array - */ - abstract public function getFieldNames(): array; - - //-------------------------------------------------------------------- - - /** - * Generates an array of objects representing field meta-data. - * - * @return array - */ - abstract public function getFieldData(): array; - - //-------------------------------------------------------------------- - - /** - * Frees the current result. - * - * @return void - */ - abstract public function freeResult(); - - //-------------------------------------------------------------------- - - /** - * Moves the internal pointer to the desired offset. This is called - * internally before fetching results to make sure the result set - * starts at zero. - * - * @param integer $n - * - * @return mixed - */ - abstract public function dataSeek(int $n = 0); - - //-------------------------------------------------------------------- - - /** - * Returns the result set as an array. - * - * Overridden by driver classes. - * - * @return mixed - */ - abstract protected function fetchAssoc(); - - //-------------------------------------------------------------------- - - /** - * Returns the result set as an object. - * - * Overridden by child classes. - * - * @param string $className - * - * @return object - */ - abstract protected function fetchObject(string $className = 'stdClass'); - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/BaseUtils.php b/vendor/codeigniter4/framework/system/Database/BaseUtils.php deleted file mode 100644 index e9a4dd6..0000000 --- a/vendor/codeigniter4/framework/system/Database/BaseUtils.php +++ /dev/null @@ -1,423 +0,0 @@ -db = & $db; - } - - //-------------------------------------------------------------------- - - /** - * List databases - * - * @return array|boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function listDatabases() - { - // Is there a cached result? - if (isset($this->db->dataCache['db_names'])) - { - return $this->db->dataCache['db_names']; - } - elseif ($this->listDatabases === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('Unsupported feature of the database platform you are using.'); - } - return false; - } - - $this->db->dataCache['db_names'] = []; - - $query = $this->db->query($this->listDatabases); - if ($query === false) - { - return $this->db->dataCache['db_names']; - } - - for ($i = 0, $query = $query->getResultArray(), $c = count($query); $i < $c; $i ++) - { - $this->db->dataCache['db_names'][] = current($query[$i]); - } - - return $this->db->dataCache['db_names']; - } - - //-------------------------------------------------------------------- - - /** - * Determine if a particular database exists - * - * @param string $database_name - * @return boolean - */ - public function databaseExists(string $database_name): bool - { - return in_array($database_name, $this->listDatabases()); - } - - //-------------------------------------------------------------------- - - /** - * Optimize Table - * - * @param string $table_name - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function optimizeTable(string $table_name) - { - if ($this->optimizeTable === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('Unsupported feature of the database platform you are using.'); - } - return false; - } - - $query = $this->db->query(sprintf($this->optimizeTable, $this->db->escapeIdentifiers($table_name))); - if ($query !== false) - { - $query = $query->getResultArray(); - return current($query); - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Optimize Database - * - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function optimizeDatabase() - { - if ($this->optimizeTable === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('Unsupported feature of the database platform you are using.'); - } - return false; - } - - $result = []; - foreach ($this->db->listTables() as $table_name) - { - $res = $this->db->query(sprintf($this->optimizeTable, $this->db->escapeIdentifiers($table_name))); - if (is_bool($res)) - { - return $res; - } - - // Build the result array... - - $res = $res->getResultArray(); - - // Postgre & SQLite3 returns empty array - if (empty($res)) - { - $key = $table_name; - } - else - { - $res = current($res); - $key = str_replace($this->db->database . '.', '', current($res)); - $keys = array_keys($res); - unset($res[$keys[0]]); - } - - $result[$key] = $res; - } - - return $result; - } - - //-------------------------------------------------------------------- - - /** - * Repair Table - * - * @param string $table_name - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function repairTable(string $table_name) - { - if ($this->repairTable === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('Unsupported feature of the database platform you are using.'); - } - return false; - } - - $query = $this->db->query(sprintf($this->repairTable, $this->db->escapeIdentifiers($table_name))); - if (is_bool($query)) - { - return $query; - } - - $query = $query->getResultArray(); - return current($query); - } - - //-------------------------------------------------------------------- - - /** - * Generate CSV from a query result object - * - * @param ResultInterface $query Query result object - * @param string $delim Delimiter (default: ,) - * @param string $newline Newline character (default: \n) - * @param string $enclosure Enclosure (default: ") - * - * @return string - */ - public function getCSVFromResult(ResultInterface $query, string $delim = ',', string $newline = "\n", string $enclosure = '"') - { - $out = ''; - // First generate the headings from the table column names - foreach ($query->getFieldNames() as $name) - { - $out .= $enclosure . str_replace($enclosure, $enclosure . $enclosure, $name) . $enclosure . $delim; - } - - $out = substr($out, 0, -strlen($delim)) . $newline; - - // Next blast through the result array and build out the rows - while ($row = $query->getUnbufferedRow('array')) - { - $line = []; - foreach ($row as $item) - { - $line[] = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $item) . $enclosure; - } - $out .= implode($delim, $line) . $newline; - } - - return $out; - } - - //-------------------------------------------------------------------- - - /** - * Generate XML data from a query result object - * - * @param ResultInterface $query Query result object - * @param array $params Any preferences - * - * @return string - */ - public function getXMLFromResult(ResultInterface $query, array $params = []): string - { - // Set our default values - foreach (['root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t"] as $key => $val) - { - if (! isset($params[$key])) - { - $params[$key] = $val; - } - } - - // Create variables for convenience - extract($params); - - // Load the xml helper - helper('xml'); - // Generate the result - $xml = '<' . $root . '>' . $newline; - while ($row = $query->getUnbufferedRow()) - { - $xml .= $tab . '<' . $element . '>' . $newline; - foreach ($row as $key => $val) - { - $val = (! empty($val)) ? xml_convert($val) : ''; - $xml .= $tab . $tab . '<' . $key . '>' . $val . '' . $newline; - } - $xml .= $tab . '' . $newline; - } - - return $xml . '' . $newline; - } - - //-------------------------------------------------------------------- - - /** - * Database Backup - * - * @param array|string $params - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function backup($params = []) - { - // If the parameters have not been submitted as an - // array then we know that it is simply the table - // name, which is a valid short cut. - if (is_string($params)) - { - $params = ['tables' => $params]; - } - - // Set up our default preferences - $prefs = [ - 'tables' => [], - 'ignore' => [], - 'filename' => '', - 'format' => 'gzip', // gzip, txt - 'add_drop' => true, - 'add_insert' => true, - 'newline' => "\n", - 'foreign_key_checks' => true, - ]; - - // Did the user submit any preferences? If so set them.... - if (! empty($params)) - { - foreach ($prefs as $key => $val) - { - if (isset($params[$key])) - { - $prefs[$key] = $params[$key]; - } - } - } - - // Are we backing up a complete database or individual tables? - // If no table names were submitted we'll fetch the entire table list - if (empty($prefs['tables'])) - { - $prefs['tables'] = $this->db->listTables(); - } - - // Validate the format - if (! in_array($prefs['format'], ['gzip', 'txt'], true)) - { - $prefs['format'] = 'txt'; - } - - // Is the encoder supported? If not, we'll either issue an - // error or use plain text depending on the debug settings - if ($prefs['format'] === 'gzip' && ! function_exists('gzencode')) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('The file compression format you chose is not supported by your server.'); - } - - $prefs['format'] = 'txt'; - } - - if ($prefs['format'] === 'txt') // Was a text file requested? - { - return $this->_backup($prefs); - } - - return gzencode($this->_backup($prefs)); - } - - //-------------------------------------------------------------------- - - /** - * Platform dependent version of the backup function. - * - * @param array|null $prefs - * - * @return mixed - */ - abstract public function _backup(array $prefs = null); - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/Config.php b/vendor/codeigniter4/framework/system/Database/Config.php deleted file mode 100644 index 89dd495..0000000 --- a/vendor/codeigniter4/framework/system/Database/Config.php +++ /dev/null @@ -1,199 +0,0 @@ -defaultGroup; - } - - if (is_string($group) && ! isset($config->$group) && strpos($group, 'custom-') !== 0) - { - throw new \InvalidArgumentException($group . ' is not a valid database connection group.'); - } - - if ($getShared && isset(static::$instances[$group])) - { - return static::$instances[$group]; - } - - static::ensureFactory(); - - if (isset($config->$group)) - { - $config = $config->$group; - } - - $connection = static::$factory->load($config, $group); - - static::$instances[$group] = & $connection; - - return $connection; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of all db connections currently made. - * - * @return array - */ - public static function getConnections(): array - { - return static::$instances; - } - - //-------------------------------------------------------------------- - - /** - * Loads and returns an instance of the Forge for the specified - * database group, and loads the group if it hasn't been loaded yet. - * - * @param string|array|null $group - * - * @return Forge - */ - public static function forge($group = null) - { - $db = static::connect($group); - - return static::$factory->loadForge($db); - } - - //-------------------------------------------------------------------- - - /** - * Returns a new instance of the Database Utilities class. - * - * @param string|array|null $group - * - * @return BaseUtils - */ - public static function utils($group = null) - { - $db = static::connect($group); - - return static::$factory->loadUtils($db); - } - - //-------------------------------------------------------------------- - - /** - * Returns a new instance of the Database Seeder. - * - * @param string|null $group - * - * @return Seeder - */ - public static function seeder(string $group = null) - { - $config = config('Database'); - - return new Seeder($config, static::connect($group)); - } - - //-------------------------------------------------------------------- - - /** - * Ensures the database Connection Manager/Factory is loaded and ready to use. - */ - protected static function ensureFactory() - { - if (static::$factory instanceof Database) - { - return; - } - - static::$factory = new Database(); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/ConnectionInterface.php b/vendor/codeigniter4/framework/system/Database/ConnectionInterface.php deleted file mode 100644 index 2df836e..0000000 --- a/vendor/codeigniter4/framework/system/Database/ConnectionInterface.php +++ /dev/null @@ -1,225 +0,0 @@ -connections[$alias] = $class; - - return $this->connections[$alias]; - } - - //-------------------------------------------------------------------- - - /** - * Creates a new Forge instance for the current database type. - * - * @param ConnectionInterface|BaseConnection $db - * - * @return mixed - */ - public function loadForge(ConnectionInterface $db) - { - $className = strpos($db->DBDriver, '\\') === false ? '\CodeIgniter\Database\\' . $db->DBDriver . '\\Forge' : $db->DBDriver . '\\Forge'; - - // Make sure a connection exists - if (! $db->connID) - { - $db->initialize(); - } - - return new $className($db); - } - - //-------------------------------------------------------------------- - - /** - * Loads the Database Utilities class. - * - * @param ConnectionInterface|BaseConnection $db - * - * @return mixed - */ - public function loadUtils(ConnectionInterface $db) - { - $className = strpos($db->DBDriver, '\\') === false ? '\CodeIgniter\Database\\' . $db->DBDriver . '\\Utils' : $db->DBDriver . '\\Utils'; - - // Make sure a connection exists - if (! $db->connID) - { - $db->initialize(); - } - - return new $className($db); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/Exceptions/DataException.php b/vendor/codeigniter4/framework/system/Database/Exceptions/DataException.php deleted file mode 100644 index 2af1793..0000000 --- a/vendor/codeigniter4/framework/system/Database/Exceptions/DataException.php +++ /dev/null @@ -1,65 +0,0 @@ -db = &$db; - } - - //-------------------------------------------------------------------- - - /** - * Provides access to the forge's current database connection. - * - * @return ConnectionInterface - */ - public function getConnection() - { - return $this->db; - } - - //-------------------------------------------------------------------- - - /** - * Create database - * - * @param string $dbName - * @param boolean $ifNotExists Whether to add IF NOT EXISTS condition - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function createDatabase(string $dbName, bool $ifNotExists = false): bool - { - if ($ifNotExists && $this->createDatabaseIfStr === null) - { - if ($this->databaseExists($dbName)) - { - return true; - } - $ifNotExists = false; - } - - if ($this->createDatabaseStr === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - - return false; - } - elseif (! $this->db->query(sprintf($ifNotExists ? $this->createDatabaseIfStr : $this->createDatabaseStr, $dbName, $this->db->charset, $this->db->DBCollat)) - ) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('Unable to create the specified database.'); - } - - return false; - } - - if (! empty($this->db->dataCache['db_names'])) - { - $this->db->dataCache['db_names'][] = $dbName; - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Determine if a database exists - * - * @param string $dbName - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - private function databaseExists(string $dbName): bool - { - if ($this->checkDatabaseExistStr === null) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - - return false; - } - - return $this->db->query($this->checkDatabaseExistStr, $dbName)->getRow() !== null; - } - - //-------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $dbName - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function dropDatabase(string $dbName): bool - { - if ($this->dropDatabaseStr === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - - return false; - } - elseif (! $this->db->query(sprintf($this->dropDatabaseStr, $dbName))) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('Unable to drop the specified database.'); - } - - return false; - } - - if (! empty($this->db->dataCache['db_names'])) - { - $key = array_search(strtolower($dbName), array_map('strtolower', $this->db->dataCache['db_names']), true); - if ($key !== false) - { - unset($this->db->dataCache['db_names'][$key]); - } - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Add Key - * - * @param string|array $key - * @param boolean $primary - * @param boolean $unique - * - * @return Forge - */ - public function addKey($key, bool $primary = false, bool $unique = false) - { - if ($primary === true) - { - foreach ((array)$key as $one) - { - $this->primaryKeys[] = $one; - } - } - else - { - $this->keys[] = $key; - if ($unique === true) - { - $this->uniqueKeys[] = ($c = count($this->keys)) ? $c - 1 : 0; - } - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Add Primary Key - * - * @param string|array $key - * - * @return Forge - */ - public function addPrimaryKey($key) - { - return $this->addKey($key, true); - } - - //-------------------------------------------------------------------- - - /** - * Add Unique Key - * - * @param string|array $key - * - * @return Forge - */ - public function addUniqueKey($key) - { - return $this->addKey($key, false, true); - } - - //-------------------------------------------------------------------- - - /** - * Add Field - * - * @param array|string $field - * - * @return Forge - */ - public function addField($field) - { - if (is_string($field)) - { - if ($field === 'id') - { - $this->addField([ - 'id' => [ - 'type' => 'INT', - 'constraint' => 9, - 'auto_increment' => true, - ], - ]); - $this->addKey('id', true); - } - else - { - if (strpos($field, ' ') === false) - { - throw new \InvalidArgumentException('Field information is required for that operation.'); - } - - $this->fields[] = $field; - } - } - - if (is_array($field)) - { - $this->fields = array_merge($this->fields, $field); - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Add Foreign Key - * - * @param string $fieldName - * @param string $tableName - * @param string $tableField - * @param string $onUpdate - * @param string $onDelete - * - * @return \CodeIgniter\Database\Forge - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function addForeignKey(string $fieldName = '', string $tableName = '', string $tableField = '', string $onUpdate = '', string $onDelete = '') - { - if (! isset($this->fields[$fieldName])) - { - throw new DatabaseException(lang('Database.fieldNotExists', [$fieldName])); - } - - $this->foreignKeys[$fieldName] = [ - 'table' => $tableName, - 'field' => $tableField, - 'onDelete' => strtoupper($onDelete), - 'onUpdate' => strtoupper($onUpdate), - ]; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Foreign Key Drop - * - * @param string $table Table name - * @param string $foreignName Foreign name - * - * @return boolean|\CodeIgniter\Database\BaseResult|\CodeIgniter\Database\Query|false|mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function dropForeignKey(string $table, string $foreignName) - { - $sql = sprintf($this->dropConstraintStr, $this->db->escapeIdentifiers($this->db->DBPrefix . $table), - $this->db->escapeIdentifiers($this->db->DBPrefix . $foreignName)); - - if ($sql === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - - return false; - } - - return $this->db->query($sql); - } - - //-------------------------------------------------------------------- - - /** - * Create Table - * - * @param string $table Table name - * @param boolean $if_not_exists Whether to add IF NOT EXISTS condition - * @param array $attributes Associative array of table attributes - * - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function createTable(string $table, bool $if_not_exists = false, array $attributes = []) - { - if ($table === '') - { - throw new \InvalidArgumentException('A table name is required for that operation.'); - } - - $table = $this->db->DBPrefix . $table; - - if (count($this->fields) === 0) - { - throw new \RuntimeException('Field information is required.'); - } - - $sql = $this->_createTable($table, $if_not_exists, $attributes); - - if (is_bool($sql)) - { - $this->reset(); - if ($sql === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - - return false; - } - } - - if (($result = $this->db->query($sql)) !== false) - { - if (! isset($this->db->dataCache['table_names'][$table])) - { - $this->db->dataCache['table_names'][] = $table; - } - - // Most databases don't support creating indexes from within the CREATE TABLE statement - if (! empty($this->keys)) - { - for ($i = 0, $sqls = $this->_processIndexes($table), $c = count($sqls); $i < $c; $i++) - { - $this->db->query($sqls[$i]); - } - } - } - - $this->reset(); - - return $result; - } - - //-------------------------------------------------------------------- - - /** - * Create Table - * - * @param string $table Table name - * @param boolean $if_not_exists Whether to add 'IF NOT EXISTS' condition - * @param array $attributes Associative array of table attributes - * - * @return mixed - */ - protected function _createTable(string $table, bool $if_not_exists, array $attributes) - { - // For any platforms that don't support Create If Not Exists... - if ($if_not_exists === true && $this->createTableIfStr === false) - { - if ($this->db->tableExists($table)) - { - return true; - } - - $if_not_exists = false; - } - - $sql = ($if_not_exists) ? sprintf($this->createTableIfStr, $this->db->escapeIdentifiers($table)) - : 'CREATE TABLE'; - - $columns = $this->_processFields(true); - for ($i = 0, $c = count($columns); $i < $c; $i++) - { - $columns[$i] = ($columns[$i]['_literal'] !== false) ? "\n\t" . $columns[$i]['_literal'] - : "\n\t" . $this->_processColumn($columns[$i]); - } - - $columns = implode(',', $columns); - - $columns .= $this->_processPrimaryKeys($table); - $columns .= $this->_processForeignKeys($table); - - // Are indexes created from within the CREATE TABLE statement? (e.g. in MySQL) - if ($this->createTableKeys === true) - { - $columns .= $this->_processIndexes($table); - } - - // createTableStr will usually have the following format: "%s %s (%s\n)" - $sql = sprintf($this->createTableStr . '%s', $sql, $this->db->escapeIdentifiers($table), $columns, - $this->_createTableAttributes($attributes)); - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * CREATE TABLE attributes - * - * @param array $attributes Associative array of table attributes - * - * @return string - */ - protected function _createTableAttributes(array $attributes): string - { - $sql = ''; - - foreach (array_keys($attributes) as $key) - { - if (is_string($key)) - { - $sql .= ' ' . strtoupper($key) . ' ' . $this->db->escape($attributes[$key]); - } - } - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * Drop Table - * - * @param string $tableName Table name - * @param boolean $ifExists Whether to add an IF EXISTS condition - * @param boolean $cascade Whether to add an CASCADE condition - * - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function dropTable(string $tableName, bool $ifExists = false, bool $cascade = false) - { - if ($tableName === '') - { - if ($this->db->DBDebug) - { - throw new DatabaseException('A table name is required for that operation.'); - } - - return false; - } - - // If the prefix is already starting the table name, remove it... - if ($this->db->DBPrefix && strpos($tableName, $this->db->DBPrefix) === 0) - { - $tableName = substr($tableName, strlen($this->db->DBPrefix)); - } - - if (($query = $this->_dropTable($this->db->DBPrefix . $tableName, $ifExists, $cascade)) === true) - { - return true; - } - - $this->db->disableForeignKeyChecks(); - - $query = $this->db->query($query); - - $this->db->enableForeignKeyChecks(); - - // Update table list cache - if ($query && ! empty($this->db->dataCache['table_names'])) - { - $key = array_search(strtolower($this->db->DBPrefix . $tableName), - array_map('strtolower', $this->db->dataCache['table_names']), true); - if ($key !== false) - { - unset($this->db->dataCache['table_names'][$key]); - } - } - - return $query; - } - - //-------------------------------------------------------------------- - - /** - * Drop Table - * - * Generates a platform-specific DROP TABLE string - * - * @param string $table Table name - * @param boolean $if_exists Whether to add an IF EXISTS condition - * @param boolean $cascade Whether to add an CASCADE condition - * - * @return string - */ - protected function _dropTable(string $table, bool $if_exists, bool $cascade): string - { - $sql = 'DROP TABLE'; - - if ($if_exists) - { - if ($this->dropTableIfStr === false) - { - if (! $this->db->tableExists($table)) - { - return true; - } - } - else - { - $sql = sprintf($this->dropTableIfStr, $this->db->escapeIdentifiers($table)); - } - } - - return $sql . ' ' . $this->db->escapeIdentifiers($table); - } - - //-------------------------------------------------------------------- - - /** - * Rename Table - * - * @param string $table_name Old table name - * @param string $new_table_name New table name - * - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function renameTable(string $table_name, string $new_table_name) - { - if ($table_name === '' || $new_table_name === '') - { - throw new \InvalidArgumentException('A table name is required for that operation.'); - } - elseif ($this->renameTableStr === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - - return false; - } - - $result = $this->db->query(sprintf($this->renameTableStr, - $this->db->escapeIdentifiers($this->db->DBPrefix . $table_name), - $this->db->escapeIdentifiers($this->db->DBPrefix . $new_table_name)) - ); - - if ($result && ! empty($this->db->dataCache['table_names'])) - { - $key = array_search(strtolower($this->db->DBPrefix . $table_name), - array_map('strtolower', $this->db->dataCache['table_names']), true); - if ($key !== false) - { - $this->db->dataCache['table_names'][$key] = $this->db->DBPrefix . $new_table_name; - } - } - - return $result; - } - - //-------------------------------------------------------------------- - - /** - * Column Add - * - * @param string $table Table name - * @param string|array $field Column definition - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function addColumn(string $table, $field): bool - { - // Work-around for literal column definitions - is_array($field) || $field = [$field]; - - foreach (array_keys($field) as $k) - { - $this->addField([$k => $field[$k]]); - } - - $sqls = $this->_alterTable('ADD', $this->db->DBPrefix . $table, $this->_processFields()); - $this->reset(); - if ($sqls === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - - return false; - } - - for ($i = 0, $c = count($sqls); $i < $c; $i++) - { - if ($this->db->query($sqls[$i]) === false) - { - return false; - } - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Column Drop - * - * @param string $table Table name - * @param string|array $column_name Column name Array or comma separated - * - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function dropColumn(string $table, $column_name) - { - $sql = $this->_alterTable('DROP', $this->db->DBPrefix . $table, $column_name); - if ($sql === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - - return false; - } - - return $this->db->query($sql); - } - - //-------------------------------------------------------------------- - - /** - * Column Modify - * - * @param string $table Table name - * @param string|array $field Column definition - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function modifyColumn(string $table, $field): bool - { - // Work-around for literal column definitions - is_array($field) || $field = [$field]; - - foreach (array_keys($field) as $k) - { - $this->addField([$k => $field[$k]]); - } - - if (count($this->fields) === 0) - { - throw new \RuntimeException('Field information is required'); - } - - $sqls = $this->_alterTable('CHANGE', $this->db->DBPrefix . $table, $this->_processFields()); - $this->reset(); - if ($sqls === false) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('This feature is not available for the database you are using.'); - } - - return false; - } - - if ($sqls !== null) - { - for ($i = 0, $c = count($sqls); $i < $c; $i++) - { - if ($this->db->query($sqls[$i]) === false) - { - return false; - } - } - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $fields Column definition - * - * @return string|string[] - */ - protected function _alterTable(string $alter_type, string $table, $fields) - { - $sql = 'ALTER TABLE ' . $this->db->escapeIdentifiers($table) . ' '; - - // DROP has everything it needs now. - if ($alter_type === 'DROP') - { - if (is_string($fields)) - { - $fields = explode(',', $fields); - } - - $fields = array_map(function ($field) { - return 'DROP COLUMN ' . $this->db->escapeIdentifiers(trim($field)); - }, $fields); - - return $sql . implode(', ', $fields); - } - - $sql .= ($alter_type === 'ADD') ? 'ADD ' : $alter_type . ' COLUMN '; - - $sqls = []; - foreach ($fields as $data) - { - $sqls[] = $sql - . ($data['_literal'] !== false ? $data['_literal'] : $this->_processColumn($data)); - } - - return $sqls; - } - - //-------------------------------------------------------------------- - - /** - * Process fields - * - * @param boolean $create_table - * - * @return array - */ - protected function _processFields(bool $create_table = false): array - { - $fields = []; - - foreach ($this->fields as $key => $attributes) - { - if (is_int($key) && ! is_array($attributes)) - { - $fields[] = ['_literal' => $attributes]; - continue; - } - - $attributes = array_change_key_case($attributes, CASE_UPPER); - - if ($create_table === true && empty($attributes['TYPE'])) - { - continue; - } - - isset($attributes['TYPE']) && $this->_attributeType($attributes); - - $field = [ - 'name' => $key, - 'new_name' => isset($attributes['NAME']) ? $attributes['NAME'] : null, - 'type' => isset($attributes['TYPE']) ? $attributes['TYPE'] : null, - 'length' => '', - 'unsigned' => '', - 'null' => '', - 'unique' => '', - 'default' => '', - 'auto_increment' => '', - '_literal' => false, - ]; - - isset($attributes['TYPE']) && $this->_attributeUnsigned($attributes, $field); - - if ($create_table === false) - { - if (isset($attributes['AFTER'])) - { - $field['after'] = $attributes['AFTER']; - } - elseif (isset($attributes['FIRST'])) - { - $field['first'] = (bool)$attributes['FIRST']; - } - } - - $this->_attributeDefault($attributes, $field); - - if (isset($attributes['NULL'])) - { - if ($attributes['NULL'] === true) - { - $field['null'] = empty($this->null) ? '' : ' ' . $this->null; - } - else - { - $field['null'] = ' NOT NULL'; - } - } - elseif ($create_table === true) - { - $field['null'] = ' NOT NULL'; - } - - $this->_attributeAutoIncrement($attributes, $field); - $this->_attributeUnique($attributes, $field); - - if (isset($attributes['COMMENT'])) - { - $field['comment'] = $this->db->escape($attributes['COMMENT']); - } - - if (isset($attributes['TYPE']) && ! empty($attributes['CONSTRAINT'])) - { - if (is_array($attributes['CONSTRAINT'])) - { - $attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']); - $attributes['CONSTRAINT'] = implode(',', $attributes['CONSTRAINT']); - } - - $field['length'] = '(' . $attributes['CONSTRAINT'] . ')'; - } - - $fields[] = $field; - } - - return $fields; - } - - //-------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * - * @return string - */ - protected function _processColumn(array $field): string - { - return $this->db->escapeIdentifiers($field['name']) - . ' ' . $field['type'] . $field['length'] - . $field['unsigned'] - . $field['default'] - . $field['null'] - . $field['auto_increment'] - . $field['unique']; - } - - //-------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * - * @return void - */ - protected function _attributeType(array &$attributes) - { - // Usually overridden by drivers - } - - //-------------------------------------------------------------------- - - /** - * Field attribute UNSIGNED - * - * Depending on the unsigned property value: - * - * - TRUE will always set $field['unsigned'] to 'UNSIGNED' - * - FALSE will always set $field['unsigned'] to '' - * - array(TYPE) will set $field['unsigned'] to 'UNSIGNED', - * if $attributes['TYPE'] is found in the array - * - array(TYPE => UTYPE) will change $field['type'], - * from TYPE to UTYPE in case of a match - * - * @param array &$attributes - * @param array &$field - * - * @return null|void - */ - protected function _attributeUnsigned(array &$attributes, array &$field) - { - if (empty($attributes['UNSIGNED']) || $attributes['UNSIGNED'] !== true) - { - return; - } - - // Reset the attribute in order to avoid issues if we do type conversion - $attributes['UNSIGNED'] = false; - - if (is_array($this->unsigned)) - { - foreach (array_keys($this->unsigned) as $key) - { - if (is_int($key) && strcasecmp($attributes['TYPE'], $this->unsigned[$key]) === 0) - { - $field['unsigned'] = ' UNSIGNED'; - - return; - } - elseif (is_string($key) && strcasecmp($attributes['TYPE'], $key) === 0) - { - $field['type'] = $key; - - return; - } - } - - return; - } - - $field['unsigned'] = ($this->unsigned === true) ? ' UNSIGNED' : ''; - } - - //-------------------------------------------------------------------- - - /** - * Field attribute DEFAULT - * - * @param array &$attributes - * @param array &$field - * - * @return null|void - */ - protected function _attributeDefault(array &$attributes, array &$field) - { - if ($this->default === false) - { - return; - } - - if (array_key_exists('DEFAULT', $attributes)) - { - if ($attributes['DEFAULT'] === null) - { - $field['default'] = empty($this->null) ? '' : $this->default . $this->null; - - // Override the NULL attribute if that's our default - $attributes['NULL'] = true; - $field['null'] = empty($this->null) ? '' : ' ' . $this->null; - } - else - { - $field['default'] = $this->default . $this->db->escape($attributes['DEFAULT']); - } - } - } - - //-------------------------------------------------------------------- - - /** - * Field attribute UNIQUE - * - * @param array &$attributes - * @param array &$field - * - * @return void - */ - protected function _attributeUnique(array &$attributes, array &$field) - { - if (! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === true) - { - $field['unique'] = ' UNIQUE'; - } - } - - //-------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * - * @return void - */ - protected function _attributeAutoIncrement(array &$attributes, array &$field) - { - if (! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === true - && stripos($field['type'], 'int') !== false - ) - { - $field['auto_increment'] = ' AUTO_INCREMENT'; - } - } - - //-------------------------------------------------------------------- - - /** - * Process primary keys - * - * @param string $table Table name - * - * @return string - */ - protected function _processPrimaryKeys(string $table): string - { - $sql = ''; - - for ($i = 0, $c = count($this->primaryKeys); $i < $c; $i++) - { - if (! isset($this->fields[$this->primaryKeys[$i]])) - { - unset($this->primaryKeys[$i]); - } - } - - if (count($this->primaryKeys) > 0) - { - $sql .= ",\n\tCONSTRAINT " . $this->db->escapeIdentifiers('pk_' . $table) - . ' PRIMARY KEY(' . implode(', ', $this->db->escapeIdentifiers($this->primaryKeys)) . ')'; - } - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table - * - * @return array - */ - protected function _processIndexes(string $table) - { - $sqls = []; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - $this->keys[$i] = (array)$this->keys[$i]; - - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if (! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - } - } - if (count($this->keys[$i]) <= 0) - { - continue; - } - - if (in_array($i, $this->uniqueKeys)) - { - $sqls[] = 'ALTER TABLE ' . $this->db->escapeIdentifiers($table) - . ' ADD CONSTRAINT ' . $this->db->escapeIdentifiers($table . '_' . implode('_', $this->keys[$i])) - . ' UNIQUE (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ');'; - continue; - } - - $sqls[] = 'CREATE INDEX ' . $this->db->escapeIdentifiers($table . '_' . implode('_', $this->keys[$i])) - . ' ON ' . $this->db->escapeIdentifiers($table) - . ' (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ');'; - } - - return $sqls; - } - - //-------------------------------------------------------------------- - - /** - * Process foreign keys - * - * @param string $table Table name - * - * @return string - */ - protected function _processForeignKeys(string $table): string - { - $sql = ''; - - $allowActions = [ - 'CASCADE', - 'SET NULL', - 'NO ACTION', - 'RESTRICT', - 'SET DEFAULT', - ]; - - if (count($this->foreignKeys) > 0) - { - foreach ($this->foreignKeys as $field => $fkey) - { - $name_index = $table . '_' . $field . '_foreign'; - - $sql .= ",\n\tCONSTRAINT " . $this->db->escapeIdentifiers($name_index) - . ' FOREIGN KEY(' . $this->db->escapeIdentifiers($field) . ') REFERENCES ' . $this->db->escapeIdentifiers($this->db->DBPrefix . $fkey['table']) . ' (' . $this->db->escapeIdentifiers($fkey['field']) . ')'; - - if ($fkey['onDelete'] !== false && in_array($fkey['onDelete'], $allowActions)) - { - $sql .= ' ON DELETE ' . $fkey['onDelete']; - } - - if ($fkey['onUpdate'] !== false && in_array($fkey['onUpdate'], $allowActions)) - { - $sql .= ' ON UPDATE ' . $fkey['onUpdate']; - } - } - } - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * Reset - * - * Resets table creation vars - * - * @return void - */ - public function reset() - { - $this->fields = $this->keys = $this->uniqueKeys = $this->primaryKeys = $this->foreignKeys = []; - } - -} diff --git a/vendor/codeigniter4/framework/system/Database/Migration.php b/vendor/codeigniter4/framework/system/Database/Migration.php deleted file mode 100644 index 3af3229..0000000 --- a/vendor/codeigniter4/framework/system/Database/Migration.php +++ /dev/null @@ -1,110 +0,0 @@ -forge = ! is_null($forge) ? $forge : \Config\Database::forge($this->DBGroup ?? config('Database')->defaultGroup); - - $this->db = $this->forge->getConnection(); - } - - //-------------------------------------------------------------------- - - /** - * Returns the database group name this migration uses. - * - * @return string - */ - public function getDBGroup(): ?string - { - return $this->DBGroup; - } - - //-------------------------------------------------------------------- - - /** - * Perform a migration step. - */ - abstract public function up(); - - //-------------------------------------------------------------------- - - /** - * Revert a migration step. - */ - abstract public function down(); - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/MigrationRunner.php b/vendor/codeigniter4/framework/system/Database/MigrationRunner.php deleted file mode 100644 index 55350c8..0000000 --- a/vendor/codeigniter4/framework/system/Database/MigrationRunner.php +++ /dev/null @@ -1,1064 +0,0 @@ -enabled = $config->enabled ?? false; - $this->table = $config->table ?? 'migrations'; - - // Default name space is the app namespace - $this->namespace = APP_NAMESPACE; - - // get default database group - $config = config('Database'); - $this->group = $config->defaultGroup; - unset($config); - - // If no db connection passed in, use - // default database group. - $this->db = db_connect($db); - } - - //-------------------------------------------------------------------- - - /** - * Locate and run all new migrations - * - * @param string|null $group - */ - public function latest(string $group = null) - { - if (! $this->enabled) - { - throw ConfigException::forDisabledMigrations(); - } - - $this->ensureTable(); - - // Set database group if not null - if (! is_null($group)) - { - $this->groupFilter = $group; - $this->setGroup($group); - } - - // Locate the migrations - $migrations = $this->findMigrations(); - - // If nothing was found then we're done - if (empty($migrations)) - { - return true; - } - - // Remove any migrations already in the history - foreach ($this->getHistory($this->group) as $history) - { - unset($migrations[$this->getObjectUid($history)]); - } - - // Start a new batch - $batch = $this->getLastBatch() + 1; - - // Run each migration - foreach ($migrations as $migration) - { - if ($this->migrate('up', $migration)) - { - if ($this->groupSkip === true) - { - $this->groupSkip = false; - continue; - } - - $this->addHistory($migration, $batch); - } - // If a migration failed then try to back out what was done - else - { - $this->regress(-1); - - $message = lang('Migrations.generalFault'); - - if ($this->silent) - { - $this->cliMessages[] = "\t" . CLI::color($message, 'red'); - return false; - } - throw new \RuntimeException($message); - } - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Migrate down to a previous batch - * - * Calls each migration step required to get to the provided batch - * - * @param integer $targetBatch Target batch number, or negative for a relative batch, 0 for all - * @param string|null $group - * - * @return mixed Current batch number on success, FALSE on failure or no migrations are found - * @throws ConfigException - */ - public function regress(int $targetBatch = 0, string $group = null) - { - if (! $this->enabled) - { - throw ConfigException::forDisabledMigrations(); - } - - // Set database group if not null - if (! is_null($group)) - { - $this->setGroup($group); - } - - $this->ensureTable(); - - // Get all the batches - $batches = $this->getBatches(); - - // Convert a relative batch to its absolute - if ($targetBatch < 0) - { - $targetBatch = $batches[count($batches) - 1 + $targetBatch] ?? 0; - } - - // If the goal was rollback then check if it is done - if (empty($batches) && $targetBatch === 0) - { - return true; - } - - // Make sure $targetBatch is found - if ($targetBatch !== 0 && ! in_array($targetBatch, $batches)) - { - $message = lang('Migrations.batchNotFound') . $targetBatch; - - if ($this->silent) - { - $this->cliMessages[] = "\t" . CLI::color($message, 'red'); - return false; - } - throw new \RuntimeException($message); - } - - // Save the namespace to restore it after loading migrations - $tmpNamespace = $this->namespace; - - // Get all migrations - $this->namespace = null; - $allMigrations = $this->findMigrations(); - - // Gather migrations down through each batch until reaching the target - $migrations = []; - while ($batch = array_pop($batches)) - { - // Check if reached target - if ($batch <= $targetBatch) - { - break; - } - - // Get the migrations from each history - foreach ($this->getBatchHistory($batch, 'desc') as $history) - { - // Create a UID from the history to match its migration - $uid = $this->getObjectUid($history); - - // Make sure the migration is still available - if (! isset($allMigrations[$uid])) - { - $message = lang('Migrations.gap') . ' ' . $history->version; - - if ($this->silent) - { - $this->cliMessages[] = "\t" . CLI::color($message, 'red'); - return false; - } - throw new \RuntimeException($message); - } - - // Add the history and put it on the list - $migration = $allMigrations[$uid]; - $migration->history = $history; - $migrations[] = $migration; - } - } - - // Run each migration - foreach ($migrations as $migration) - { - if ($this->migrate('down', $migration)) - { - $this->removeHistory($migration->history); - } - // If a migration failed then quit so as not to ruin the whole batch - else - { - $message = lang('Migrations.generalFault'); - - if ($this->silent) - { - $this->cliMessages[] = "\t" . CLI::color($message, 'red'); - return false; - } - throw new \RuntimeException($message); - } - } - - // Restore the namespace - $this->namespace = $tmpNamespace; - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Migrate a single file regardless of order or batches. - * Method "up" or "down" determined by presence in history. - * NOTE: This is not recommended and provided mostly for testing. - * - * @param string $path Full path to a valid migration file - * @param string $path Namespace of the target migration - * @param string|null $group - */ - public function force(string $path, string $namespace, string $group = null) - { - if (! $this->enabled) - { - throw ConfigException::forDisabledMigrations(); - } - - $this->ensureTable(); - - // Set database group if not null - if (! is_null($group)) - { - $this->groupFilter = $group; - $this->setGroup($group); - } - - // Create and validate the migration - $migration = $this->migrationFromFile($path, $namespace); - if (empty($migration)) - { - $message = lang('Migrations.notFound'); - - if ($this->silent) - { - $this->cliMessages[] = "\t" . CLI::color($message, 'red'); - return false; - } - throw new \RuntimeException($message); - } - - // Check the history for a match - $method = 'up'; - $this->setNamespace($migration->namespace); - foreach ($this->getHistory($this->group) as $history) - { - if ($this->getObjectUid($history) === $migration->uid) - { - $method = 'down'; - $migration->history = $history; - break; - } - } - - // up - if ($method === 'up') - { - // Start a new batch - $batch = $this->getLastBatch() + 1; - - if ($this->migrate('up', $migration) && $this->groupSkip === false) - { - $this->addHistory($migration, $batch); - return true; - } - - $this->groupSkip = false; - } - - // down - elseif ($this->migrate('down', $migration)) - { - $this->removeHistory($migration->history); - return true; - } - - // If it came this far the migration failed - $message = lang('Migrations.generalFault'); - - if ($this->silent) - { - $this->cliMessages[] = "\t" . CLI::color($message, 'red'); - return false; - } - throw new \RuntimeException($message); - } - - //-------------------------------------------------------------------- - - /** - * Retrieves list of available migration scripts - * - * @return array List of all located migrations by their UID - */ - public function findMigrations(): array - { - // If a namespace is set then use it, otherwise load all namespaces from the autoloader - $namespaces = $this->namespace ? [$this->namespace] : array_keys(Services::autoloader()->getNamespace()); - - // Collect the migrations to run by their sortable UID - $migrations = []; - foreach ($namespaces as $namespace) - { - foreach ($this->findNamespaceMigrations($namespace) as $migration) - { - $migrations[$migration->uid] = $migration; - } - } - - // Sort migrations ascending by their UID (version) - ksort($migrations); - - return $migrations; - } - - //-------------------------------------------------------------------- - - /** - * Retrieves a list of available migration scripts for one namespace - * - * @param string $namespace The namespace to search for migrations - * - * @return array List of unsorted migrations from the namespace - */ - public function findNamespaceMigrations(string $namespace): array - { - $migrations = []; - $locator = Services::locator(true); - - // If $this->path contains a valid directory use it. - if (! empty($this->path)) - { - helper('filesystem'); - $dir = rtrim($this->path, DIRECTORY_SEPARATOR) . '/'; - $files = get_filenames($dir, true); - } - // Otherwise use FileLocator to search files in the subdirectory of the namespace - else - { - $files = $locator->listNamespaceFiles($namespace, '/Database/Migrations/'); - } - - // Load all *_*.php files in the migrations path - // We can't use glob if we want it to be testable.... - foreach ($files as $file) - { - // Clean up the file path - $file = empty($this->path) ? $file : $this->path . str_replace($this->path, '', $file); - - // Create the migration object from the file and save it - if ($migration = $this->migrationFromFile($file, $namespace)) - { - $migrations[] = $migration; - } - } - - return $migrations; - } - - //-------------------------------------------------------------------- - - /** - * Create a migration object from a file path. - * - * @param string $path The path to the file - * @param string $path The namespace of the target migration - * - * @return object|false Returns the migration object, or false on failure - */ - protected function migrationFromFile(string $path, string $namespace) - { - if (substr($path, -4) !== '.php') - { - return false; - } - - // Remove the extension - $name = basename($path, '.php'); - - // Filter out non-migration files - if (! preg_match($this->regex, $name)) - { - return false; - } - - $locator = Services::locator(true); - - // Create migration object using stdClass - $migration = new \stdClass(); - - // Get migration version number - $migration->version = $this->getMigrationNumber($name); - $migration->name = $this->getMigrationName($name); - $migration->path = $path; - $migration->class = $locator->getClassname($path); - $migration->namespace = $namespace; - $migration->uid = $this->getObjectUid($migration); - - return $migration; - } - - //-------------------------------------------------------------------- - - /** - * Set namespace. - * Allows other scripts to modify on the fly as needed. - * - * @param string $namespace or null for "all" - * - * @return MigrationRunner - */ - public function setNamespace(?string $namespace) - { - $this->namespace = $namespace; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Set database Group. - * Allows other scripts to modify on the fly as needed. - * - * @param string $group - * - * @return MigrationRunner - */ - public function setGroup(string $group) - { - $this->group = $group; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Set migration Name. - * - * @param string $name - * - * @return \CodeIgniter\Database\MigrationRunner - */ - public function setName(string $name) - { - $this->name = $name; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * If $silent == true, then will not throw exceptions and will - * attempt to continue gracefully. - * - * @param boolean $silent - * - * @return MigrationRunner - */ - public function setSilent(bool $silent) - { - $this->silent = $silent; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Extracts the migration number from a filename - * - * @param string $migration - * - * @return string Numeric portion of a migration filename - */ - protected function getMigrationNumber(string $migration): string - { - preg_match('/^\d{4}[_-]?\d{2}[_-]?\d{2}[_-]?\d{6}/', $migration, $matches); - - return count($matches) ? $matches[0] : '0'; - } - - //-------------------------------------------------------------------- - - /** - * Extracts the migration class name from a filename - * - * @param string $migration - * - * @return string text portion of a migration filename - */ - protected function getMigrationName(string $migration): string - { - $parts = explode('_', $migration); - array_shift($parts); - - return implode('_', $parts); - } - - //-------------------------------------------------------------------- - - /** - * Uses the non-repeatable portions of a migration or history - * to create a sortable unique key - * - * @param object $migration or $history - * - * @return string - */ - public function getObjectUid($object): string - { - return preg_replace('/[^0-9]/', '', $object->version) . $object->class; - } - - //-------------------------------------------------------------------- - - /** - * Retrieves messages formatted for CLI output - * - * @return array Current migration version - */ - public function getCliMessages(): array - { - return $this->cliMessages; - } - - //-------------------------------------------------------------------- - - /** - * Clears any CLI messages. - * - * @return MigrationRunner - */ - public function clearCliMessages() - { - $this->cliMessages = []; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Truncates the history table. - * - * @return boolean - */ - public function clearHistory() - { - if ($this->db->tableExists($this->table)) - { - $this->db->table($this->table) - ->truncate(); - } - } - - //-------------------------------------------------------------------- - - /** - * Add a history to the table. - * - * @param object $migration - * @param integer $batch - * - * @return void - */ - protected function addHistory($migration, int $batch) - { - $this->db->table($this->table) - ->insert([ - 'version' => $migration->version, - 'class' => $migration->class, - 'group' => $this->group, - 'namespace' => $migration->namespace, - 'time' => time(), - 'batch' => $batch, - ]); - - if (is_cli()) - { - $this->cliMessages[] = "\t" . CLI::color(lang('Migrations.added'), - 'yellow') . "($migration->namespace) " . $migration->version . '_' . $migration->class; - } - } - - //-------------------------------------------------------------------- - - /** - * Removes a single history - * - * @param string $version - * - * @return void - */ - protected function removeHistory($history) - { - $this->db->table($this->table)->where('id', $history->id)->delete(); - - if (is_cli()) - { - $this->cliMessages[] = "\t" . CLI::color(lang('Migrations.removed'), - 'yellow') . "($history->namespace) " . $history->version . '_' . $this->getMigrationName($history->class); - } - } - - //-------------------------------------------------------------------- - - /** - * Grabs the full migration history from the database for a group - * - * @param string $group - * - * @return array - */ - public function getHistory(string $group = 'default'): array - { - $this->ensureTable(); - - $criteria = ['group' => $group]; - - // If a namespace was specified then use it - if ($this->namespace) - { - $criteria['namespace'] = $this->namespace; - } - - $query = $this->db->table($this->table) - ->where($criteria) - ->orderBy('id', 'ASC') - ->get(); - - return $query ? $query->getResultObject() : []; - } - - //-------------------------------------------------------------------- - - /** - * Returns the migration history for a single batch. - * - * @param integer $batch - * - * @return array - */ - public function getBatchHistory(int $batch, $order = 'asc'): array - { - $this->ensureTable(); - - $query = $this->db->table($this->table) - ->where('batch', $batch) - ->orderBy('id', $order) - ->get(); - - return $query ? $query->getResultObject() : []; - } - - //-------------------------------------------------------------------- - - /** - * Returns all the batches from the database history in order - * - * @return array - */ - public function getBatches(): array - { - $this->ensureTable(); - - $batches = $this->db->table($this->table) - ->select('batch') - ->distinct() - ->orderBy('batch', 'asc') - ->get() - ->getResultArray(); - - return array_column($batches, 'batch'); - } - - //-------------------------------------------------------------------- - - /** - * Returns the value of the last batch in the database. - * - * @return integer - */ - public function getLastBatch(): int - { - $this->ensureTable(); - - $batch = $this->db->table($this->table) - ->selectMax('batch') - ->get() - ->getResultObject(); - - $batch = is_array($batch) && count($batch) - ? end($batch)->batch - : 0; - - return (int)$batch; - } - - //-------------------------------------------------------------------- - - /** - * Returns the version number of the first migration for a batch. - * Mostly just for tests. - * - * @param integer $batch - * - * @return string - */ - public function getBatchStart(int $batch): string - { - // Convert a relative batch to its absolute - if ($batch < 0) - { - $batches = $this->getBatches(); - $batch = $batches[count($batches) - 1 + $targetBatch] ?? 0; - } - - $migration = $this->db->table($this->table) - ->where('batch', $batch) - ->orderBy('id', 'asc') - ->limit(1) - ->get() - ->getResultObject(); - - return count($migration) ? $migration[0]->version : '0'; - } - - //-------------------------------------------------------------------- - - /** - * Returns the version number of the last migration for a batch. - * Mostly just for tests. - * - * @param integer $batch - * - * @return string - */ - public function getBatchEnd(int $batch): string - { - // Convert a relative batch to its absolute - if ($batch < 0) - { - $batches = $this->getBatches(); - $batch = $batches[count($batches) - 1 + $targetBatch] ?? 0; - } - - $migration = $this->db->table($this->table) - ->where('batch', $batch) - ->orderBy('id', 'desc') - ->limit(1) - ->get() - ->getResultObject(); - - return count($migration) ? $migration[0]->version : 0; - } - - //-------------------------------------------------------------------- - - /** - * Ensures that we have created our migrations table - * in the database. - */ - public function ensureTable() - { - if ($this->tableChecked || $this->db->tableExists($this->table)) - { - return; - } - - $forge = \Config\Database::forge($this->db); - - $forge->addField([ - 'id' => [ - 'type' => 'BIGINT', - 'constraint' => 20, - 'unsigned' => true, - 'auto_increment' => true, - ], - 'version' => [ - 'type' => 'VARCHAR', - 'constraint' => 255, - 'null' => false, - ], - 'class' => [ - 'type' => 'TEXT', - 'null' => false, - ], - 'group' => [ - 'type' => 'VARCHAR', - 'constraint' => 255, - 'null' => false, - ], - 'namespace' => [ - 'type' => 'VARCHAR', - 'constraint' => 255, - 'null' => false, - ], - 'time' => [ - 'type' => 'INT', - 'constraint' => 11, - 'null' => false, - ], - 'batch' => [ - 'type' => 'INT', - 'constraint' => 11, - 'unsigned' => true, - 'null' => false, - ], - ]); - - $forge->addPrimaryKey('id'); - $forge->createTable($this->table, true); - - $this->tableChecked = true; - } - - /** - * Handles the actual running of a migration. - * - * @param $direction "up" or "down" - * @param $migration The migration to run - * - * @return boolean - */ - protected function migrate($direction, $migration): bool - { - include_once $migration->path; - - $class = $migration->class; - $this->setName($migration->name); - - // Validate the migration file structure - if (! class_exists($class, false)) - { - $message = sprintf(lang('Migrations.classNotFound'), $class); - - if ($this->silent) - { - $this->cliMessages[] = "\t" . CLI::color($message, 'red'); - return false; - } - throw new \RuntimeException($message); - } - - // Initialize migration - $instance = new $class(); - // Determine DBGroup to use - $group = $instance->getDBGroup() ?? config('Database')->defaultGroup; - - // Skip tests db group when not running in testing environment - if (ENVIRONMENT !== 'testing' && $group === 'tests' && $this->groupFilter !== 'tests') - { - // @codeCoverageIgnoreStart - $this->groupSkip = true; - return true; - // @codeCoverageIgnoreEnd - } - - // Skip migration if group filtering was set - if ($direction === 'up' && ! is_null($this->groupFilter) && $this->groupFilter !== $group) - { - $this->groupSkip = true; - return true; - } - - $this->setGroup($group); - - if (! is_callable([$instance, $direction])) - { - $message = sprintf(lang('Migrations.missingMethod'), $direction); - - if ($this->silent) - { - $this->cliMessages[] = "\t" . CLI::color($message, 'red'); - return false; - } - throw new \RuntimeException($message); - } - - $instance->{$direction}(); - - return true; - } -} diff --git a/vendor/codeigniter4/framework/system/Database/ModelFactory.php b/vendor/codeigniter4/framework/system/Database/ModelFactory.php deleted file mode 100644 index b2b4362..0000000 --- a/vendor/codeigniter4/framework/system/Database/ModelFactory.php +++ /dev/null @@ -1,111 +0,0 @@ -locateFile($name, 'Models'); - - if (empty($file)) - { - // No file found - check if the class was namespaced - if (strpos($name, '\\') !== false) - { - // Class was namespaced and locateFile couldn't find it - return null; - } - - // Check all namespaces - $files = $locator->search('Models/' . $name); - if (empty($files)) - { - return null; - } - - // Get the first match (prioritizes user and framework) - $file = reset($files); - } - - $name = $locator->getClassname($file); - - if (empty($name)) - { - return null; - } - - return new $name($connection); - } -} diff --git a/vendor/codeigniter4/framework/system/Database/MySQLi/Builder.php b/vendor/codeigniter4/framework/system/Database/MySQLi/Builder.php deleted file mode 100644 index d2eb6e6..0000000 --- a/vendor/codeigniter4/framework/system/Database/MySQLi/Builder.php +++ /dev/null @@ -1,88 +0,0 @@ - 'IGNORE', - 'insert' => 'IGNORE', - 'delete' => 'IGNORE', - ]; - - /** - * FROM tables - * - * Groups tables in FROM clauses if needed, so there is no confusion - * about operator precedence. - * - * Note: This is only used (and overridden) by MySQL. - * - * @return string - */ - protected function _fromTables(): string - { - if (! empty($this->QBJoin) && count($this->QBFrom) > 1) - { - return '(' . implode(', ', $this->QBFrom) . ')'; - } - - return implode(', ', $this->QBFrom); - } -} diff --git a/vendor/codeigniter4/framework/system/Database/MySQLi/Connection.php b/vendor/codeigniter4/framework/system/Database/MySQLi/Connection.php deleted file mode 100644 index 206b9f0..0000000 --- a/vendor/codeigniter4/framework/system/Database/MySQLi/Connection.php +++ /dev/null @@ -1,742 +0,0 @@ -hostname[0] === '/') - { - $hostname = null; - $port = null; - $socket = $this->hostname; - } - else - { - $hostname = ($persistent === true) ? 'p:' . $this->hostname : $this->hostname; - $port = empty($this->port) ? null : $this->port; - $socket = ''; - } - - $client_flags = ($this->compress === true) ? MYSQLI_CLIENT_COMPRESS : 0; - $this->mysqli = mysqli_init(); - - mysqli_report(MYSQLI_REPORT_ALL & ~MYSQLI_REPORT_INDEX); - - $this->mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); - - if (isset($this->strictOn)) - { - if ($this->strictOn) - { - $this->mysqli->options(MYSQLI_INIT_COMMAND, - 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); - } - else - { - $this->mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = - REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( - @@sql_mode, - "STRICT_ALL_TABLES,", ""), - ",STRICT_ALL_TABLES", ""), - "STRICT_ALL_TABLES", ""), - "STRICT_TRANS_TABLES,", ""), - ",STRICT_TRANS_TABLES", ""), - "STRICT_TRANS_TABLES", "")' - ); - } - } - - if (is_array($this->encrypt)) - { - $ssl = []; - empty($this->encrypt['ssl_key']) || $ssl['key'] = $this->encrypt['ssl_key']; - empty($this->encrypt['ssl_cert']) || $ssl['cert'] = $this->encrypt['ssl_cert']; - empty($this->encrypt['ssl_ca']) || $ssl['ca'] = $this->encrypt['ssl_ca']; - empty($this->encrypt['ssl_capath']) || $ssl['capath'] = $this->encrypt['ssl_capath']; - empty($this->encrypt['ssl_cipher']) || $ssl['cipher'] = $this->encrypt['ssl_cipher']; - - if (! empty($ssl)) - { - if (isset($this->encrypt['ssl_verify'])) - { - if ($this->encrypt['ssl_verify']) - { - defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT') && - $this->mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true); - } - // Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT - // to FALSE didn't do anything, so PHP 5.6.16 introduced yet another - // constant ... - // - // https://secure.php.net/ChangeLog-5.php#5.6.16 - // https://bugs.php.net/bug.php?id=68344 - elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT') && version_compare($this->mysqli->client_info, '5.6', '>=')) - { - $client_flags += MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT; - } - } - - $client_flags += MYSQLI_CLIENT_SSL; - $this->mysqli->ssl_set( - $ssl['key'] ?? null, $ssl['cert'] ?? null, $ssl['ca'] ?? null, - $ssl['capath'] ?? null, $ssl['cipher'] ?? null - ); - } - } - - try - { - if ($this->mysqli->real_connect($hostname, $this->username, $this->password, - $this->database, $port, $socket, $client_flags) - ) - { - // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails - if (($client_flags & MYSQLI_CLIENT_SSL) && version_compare($this->mysqli->client_info, '5.7.3', '<=') - && empty($this->mysqli->query("SHOW STATUS LIKE 'ssl_cipher'") - ->fetch_object()->Value) - ) - { - $this->mysqli->close(); - $message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!'; - log_message('error', $message); - - if ($this->DBDebug) - { - throw new DatabaseException($message); - } - - return false; - } - - if (! $this->mysqli->set_charset($this->charset)) - { - log_message('error', - "Database: Unable to set the configured connection charset ('{$this->charset}')."); - $this->mysqli->close(); - - if ($this->DBDebug) - { - throw new DatabaseException('Unable to set client connection character set: ' . $this->charset); - } - - return false; - } - - return $this->mysqli; - } - } - catch (\Throwable $e) - { - // Clean sensitive information from errors. - $msg = $e->getMessage(); - - $msg = str_replace($this->username, '****', $msg); - $msg = str_replace($this->password, '****', $msg); - - throw new \mysqli_sql_exception($msg, $e->getCode(), $e); - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Keep or establish the connection if no queries have been sent for - * a length of time exceeding the server's idle timeout. - * - * @return void - */ - public function reconnect() - { - $this->close(); - $this->initialize(); - } - - //-------------------------------------------------------------------- - - /** - * Close the database connection. - * - * @return void - */ - protected function _close() - { - $this->connID->close(); - } - - //-------------------------------------------------------------------- - - /** - * Select a specific database table to use. - * - * @param string $databaseName - * - * @return boolean - */ - public function setDatabase(string $databaseName): bool - { - if ($databaseName === '') - { - $databaseName = $this->database; - } - - if (empty($this->connID)) - { - $this->initialize(); - } - - if ($this->connID->select_db($databaseName)) - { - $this->database = $databaseName; - - return true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Returns a string containing the version of the database being used. - * - * @return string - */ - public function getVersion(): string - { - if (isset($this->dataCache['version'])) - { - return $this->dataCache['version']; - } - - if (empty($this->mysqli)) - { - $this->initialize(); - } - - return $this->dataCache['version'] = $this->mysqli->server_info; - } - - //-------------------------------------------------------------------- - - /** - * Executes the query against the database. - * - * @param string $sql - * - * @return mixed - */ - public function execute(string $sql) - { - while ($this->connID->more_results()) - { - $this->connID->next_result(); - if ($res = $this->connID->store_result()) - { - $res->free(); - } - } - try - { - return $this->connID->query($this->prepQuery($sql)); - } - catch (\mysqli_sql_exception $e) - { - log_message('error', $e); - if ($this->DBDebug) - { - throw $e; - } - } - return false; - } - - //-------------------------------------------------------------------- - - /** - * Prep the query - * - * If needed, each database adapter can prep the query string - * - * @param string $sql an SQL query - * - * @return string - */ - protected function prepQuery(string $sql): string - { - // mysqli_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack - // modifies the query so that it a proper number of affected rows is returned. - if ($this->deleteHack === true && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) - { - return trim($sql) . ' WHERE 1=1'; - } - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * Returns the total number of rows affected by this query. - * - * @return integer - */ - public function affectedRows(): int - { - return $this->connID->affected_rows ?? 0; - } - - //-------------------------------------------------------------------- - - /** - * Platform-dependant string escape - * - * @param string $str - * @return string - */ - protected function _escapeString(string $str): string - { - if (is_bool($str)) - { - return $str; - } - - if (! $this->connID) - { - $this->initialize(); - } - - return $this->connID->real_escape_string($str); - } - - //-------------------------------------------------------------------- - - /** - * Escape Like String Direct - * There are a few instances where MySQLi queries cannot take the - * additional "ESCAPE x" parameter for specifying the escape character - * in "LIKE" strings, and this handles those directly with a backslash. - * - * @param string|string[] $str Input string - * @return string|string[] - */ - public function escapeLikeStringDirect($str) - { - if (is_array($str)) - { - foreach ($str as $key => $val) - { - $str[$key] = $this->escapeLikeStringDirect($val); - } - - return $str; - } - - $str = $this->_escapeString($str); - - // Escape LIKE condition wildcards - return str_replace([ - $this->likeEscapeChar, - '%', - '_', - ], [ - '\\' . $this->likeEscapeChar, - '\\' . '%', - '\\' . '_', - ], $str - ); - } - - //-------------------------------------------------------------------- - - /** - * Generates the SQL for listing tables in a platform-dependent manner. - * Uses escapeLikeStringDirect(). - * - * @param boolean $prefixLimit - * - * @return string - */ - protected function _listTables(bool $prefixLimit = false): string - { - $sql = 'SHOW TABLES FROM ' . $this->escapeIdentifiers($this->database); - - if ($prefixLimit !== false && $this->DBPrefix !== '') - { - return $sql . " LIKE '" . $this->escapeLikeStringDirect($this->DBPrefix) . "%'"; - } - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * Generates a platform-specific query string so that the column names can be fetched. - * - * @param string $table - * - * @return string - */ - protected function _listColumns(string $table = ''): string - { - return 'SHOW COLUMNS FROM ' . $this->protectIdentifiers($table, true, null, false); - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of objects with field data - * - * @param string $table - * @return \stdClass[] - * @throws DatabaseException - */ - public function _fieldData(string $table): array - { - $table = $this->protectIdentifiers($table, true, null, false); - - if (($query = $this->query('SHOW COLUMNS FROM ' . $table)) === false) - { - throw new DatabaseException(lang('Database.failGetFieldData')); - } - $query = $query->getResultObject(); - - $retVal = []; - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retVal[$i] = new \stdClass(); - $retVal[$i]->name = $query[$i]->Field; - - sscanf($query[$i]->Type, '%[a-z](%d)', $retVal[$i]->type, $retVal[$i]->max_length); - - $retVal[$i]->nullable = $query[$i]->Null === 'YES'; - $retVal[$i]->default = $query[$i]->Default; - $retVal[$i]->primary_key = (int)($query[$i]->Key === 'PRI'); - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of objects with index data - * - * @param string $table - * @return \stdClass[] - * @throws DatabaseException - * @throws \LogicException - */ - public function _indexData(string $table): array - { - $table = $this->protectIdentifiers($table, true, null, false); - - if (($query = $this->query('SHOW INDEX FROM ' . $table)) === false) - { - throw new DatabaseException(lang('Database.failGetIndexData')); - } - - if (! $indexes = $query->getResultArray()) - { - return []; - } - - $keys = []; - - foreach ($indexes as $index) - { - if (empty($keys[$index['Key_name']])) - { - $keys[$index['Key_name']] = new \stdClass(); - $keys[$index['Key_name']]->name = $index['Key_name']; - - if ($index['Key_name'] === 'PRIMARY') - { - $type = 'PRIMARY'; - } - elseif ($index['Index_type'] === 'FULLTEXT') - { - $type = 'FULLTEXT'; - } - elseif ($index['Non_unique']) - { - if ($index['Index_type'] === 'SPATIAL') - { - $type = 'SPATIAL'; - } - else - { - $type = 'INDEX'; - } - } - else - { - $type = 'UNIQUE'; - } - - $keys[$index['Key_name']]->type = $type; - } - - $keys[$index['Key_name']]->fields[] = $index['Column_name']; - } - - return $keys; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of objects with Foreign key data - * - * @param string $table - * @return \stdClass[] - * @throws DatabaseException - */ - public function _foreignKeyData(string $table): array - { - $sql = ' - SELECT - tc.CONSTRAINT_NAME, - tc.TABLE_NAME, - kcu.COLUMN_NAME, - rc.REFERENCED_TABLE_NAME, - kcu.REFERENCED_COLUMN_NAME - FROM information_schema.TABLE_CONSTRAINTS AS tc - INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS AS rc - ON tc.CONSTRAINT_NAME = rc.CONSTRAINT_NAME - INNER JOIN information_schema.KEY_COLUMN_USAGE AS kcu - ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME - WHERE - tc.CONSTRAINT_TYPE = ' . $this->escape('FOREIGN KEY') . ' AND - tc.TABLE_SCHEMA = ' . $this->escape($this->database) . ' AND - tc.TABLE_NAME = ' . $this->escape($table); - - if (($query = $this->query($sql)) === false) - { - throw new DatabaseException(lang('Database.failGetForeignKeyData')); - } - $query = $query->getResultObject(); - - $retVal = []; - foreach ($query as $row) - { - $obj = new \stdClass(); - $obj->constraint_name = $row->CONSTRAINT_NAME; - $obj->table_name = $row->TABLE_NAME; - $obj->column_name = $row->COLUMN_NAME; - $obj->foreign_table_name = $row->REFERENCED_TABLE_NAME; - $obj->foreign_column_name = $row->REFERENCED_COLUMN_NAME; - - $retVal[] = $obj; - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Returns platform-specific SQL to disable foreign key checks. - * - * @return string - */ - protected function _disableForeignKeyChecks() - { - return 'SET FOREIGN_KEY_CHECKS=0'; - } - - //-------------------------------------------------------------------- - - /** - * Returns platform-specific SQL to enable foreign key checks. - * - * @return string - */ - protected function _enableForeignKeyChecks() - { - return 'SET FOREIGN_KEY_CHECKS=1'; - } - - //-------------------------------------------------------------------- - - /** - * Returns the last error code and message. - * - * Must return an array with keys 'code' and 'message': - * - * return ['code' => null, 'message' => null); - * - * @return array - */ - public function error(): array - { - if (! empty($this->mysqli->connect_errno)) - { - return [ - 'code' => $this->mysqli->connect_errno, - 'message' => $this->mysqli->connect_error, - ]; - } - - return [ - 'code' => $this->connID->errno, - 'message' => $this->connID->error, - ]; - } - - //-------------------------------------------------------------------- - - /** - * Insert ID - * - * @return integer - */ - public function insertID(): int - { - return $this->connID->insert_id; - } - - //-------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return boolean - */ - protected function _transBegin(): bool - { - $this->connID->autocommit(false); - - return $this->connID->begin_transaction(); - } - - //-------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return boolean - */ - protected function _transCommit(): bool - { - if ($this->connID->commit()) - { - $this->connID->autocommit(true); - - return true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return boolean - */ - protected function _transRollback(): bool - { - if ($this->connID->rollback()) - { - $this->connID->autocommit(true); - - return true; - } - - return false; - } - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/MySQLi/Forge.php b/vendor/codeigniter4/framework/system/Database/MySQLi/Forge.php deleted file mode 100644 index 7e7e0a2..0000000 --- a/vendor/codeigniter4/framework/system/Database/MySQLi/Forge.php +++ /dev/null @@ -1,279 +0,0 @@ -_quoted_table_options)) - { - $sql .= $this->db->escape($attributes[$key]); - } - else - { - $sql .= $this->db->escapeString($attributes[$key]); - } - } - } - - if (! empty($this->db->charset) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) - { - $sql .= ' DEFAULT CHARACTER SET = ' . $this->db->escapeString($this->db->charset); - } - - if (! empty($this->db->DBCollat) && ! strpos($sql, 'COLLATE')) - { - $sql .= ' COLLATE = ' . $this->db->escapeString($this->db->DBCollat); - } - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * @return string|string[] - */ - protected function _alterTable(string $alter_type, string $table, $field) - { - if ($alter_type === 'DROP') - { - return parent::_alterTable($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE ' . $this->db->escapeIdentifiers($table); - foreach ($field as $i => $data) - { - if ($data['_literal'] !== false) - { - $field[$i] = ($alter_type === 'ADD') ? "\n\tADD " . $data['_literal'] : "\n\tMODIFY " . $data['_literal']; - } - else - { - if ($alter_type === 'ADD') - { - $field[$i]['_literal'] = "\n\tADD "; - } - else - { - $field[$i]['_literal'] = empty($data['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; - } - - $field[$i] = $field[$i]['_literal'] . $this->_processColumn($field[$i]); - } - } - - return [$sql . implode(',', $field)]; - } - - //-------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _processColumn(array $field): string - { - $extra_clause = isset($field['after']) ? ' AFTER ' . $this->db->escapeIdentifiers($field['after']) : ''; - - if (empty($extra_clause) && isset($field['first']) && $field['first'] === true) - { - $extra_clause = ' FIRST'; - } - - return $this->db->escapeIdentifiers($field['name']) - . (empty($field['new_name']) ? '' : ' ' . $this->db->escapeIdentifiers($field['new_name'])) - . ' ' . $field['type'] . $field['length'] - . $field['unsigned'] - . $field['null'] - . $field['default'] - . $field['auto_increment'] - . $field['unique'] - . (empty($field['comment']) ? '' : ' COMMENT ' . $field['comment']) - . $extra_clause; - } - - //-------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table (ignored) - * @return string - */ - protected function _processIndexes(string $table): string - { - $sql = ''; - - for ($i = 0, $c = count($this->keys); $i < $c; $i ++) - { - if (is_array($this->keys[$i])) - { - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2 ++) - { - if (! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - continue; - } - } - } - elseif (! isset($this->fields[$this->keys[$i]])) - { - unset($this->keys[$i]); - continue; - } - - is_array($this->keys[$i]) || $this->keys[$i] = [$this->keys[$i]]; - - $unique = in_array($i, $this->uniqueKeys) ? 'UNIQUE ' : ''; - - $sql .= ",\n\t{$unique}KEY " . $this->db->escapeIdentifiers(implode('_', $this->keys[$i])) - . ' (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ')'; - } - - $this->keys = []; - - return $sql; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/MySQLi/PreparedQuery.php b/vendor/codeigniter4/framework/system/Database/MySQLi/PreparedQuery.php deleted file mode 100644 index 3ef4104..0000000 --- a/vendor/codeigniter4/framework/system/Database/MySQLi/PreparedQuery.php +++ /dev/null @@ -1,135 +0,0 @@ -statement = $this->db->mysqli->prepare($sql)) - { - $this->errorCode = $this->db->mysqli->errno; - $this->errorString = $this->db->mysqli->error; - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Takes a new set of data and runs it against the currently - * prepared query. Upon success, will return a Results object. - * - * @param array $data - * - * @return boolean - */ - public function _execute(array $data): bool - { - if (is_null($this->statement)) - { - throw new \BadMethodCallException('You must call prepare before trying to execute a prepared statement.'); - } - - // First off -bind the parameters - $bindTypes = ''; - - // Determine the type string - foreach ($data as $item) - { - if (is_integer($item)) - { - $bindTypes .= 'i'; - } - elseif (is_numeric($item)) - { - $bindTypes .= 'd'; - } - else - { - $bindTypes .= 's'; - } - } - - // Bind it - $this->statement->bind_param($bindTypes, ...$data); - - return $this->statement->execute(); - } - - //-------------------------------------------------------------------- - - /** - * Returns the result object for the prepared query. - * - * @return mixed - */ - public function _getResult() - { - return $this->statement->get_result(); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/MySQLi/Result.php b/vendor/codeigniter4/framework/system/Database/MySQLi/Result.php deleted file mode 100644 index 7a7c585..0000000 --- a/vendor/codeigniter4/framework/system/Database/MySQLi/Result.php +++ /dev/null @@ -1,211 +0,0 @@ -resultID->field_count; - } - - //-------------------------------------------------------------------- - - /** - * Generates an array of column names in the result set. - * - * @return array - */ - public function getFieldNames(): array - { - $fieldNames = []; - $this->resultID->field_seek(0); - while ($field = $this->resultID->fetch_field()) - { - $fieldNames[] = $field->name; - } - - return $fieldNames; - } - - //-------------------------------------------------------------------- - - /** - * Generates an array of objects representing field meta-data. - * - * @return array - */ - public function getFieldData(): array - { - static $data_types = [ - MYSQLI_TYPE_DECIMAL => 'decimal', - MYSQLI_TYPE_NEWDECIMAL => 'newdecimal', - MYSQLI_TYPE_FLOAT => 'float', - MYSQLI_TYPE_DOUBLE => 'double', - - MYSQLI_TYPE_BIT => 'bit', - MYSQLI_TYPE_TINY => 'tiny', - MYSQLI_TYPE_SHORT => 'short', - MYSQLI_TYPE_LONG => 'long', - MYSQLI_TYPE_LONGLONG => 'longlong', - MYSQLI_TYPE_INT24 => 'int24', - - MYSQLI_TYPE_YEAR => 'year', - - MYSQLI_TYPE_TIMESTAMP => 'timestamp', - MYSQLI_TYPE_DATE => 'date', - MYSQLI_TYPE_TIME => 'time', - MYSQLI_TYPE_DATETIME => 'datetime', - MYSQLI_TYPE_NEWDATE => 'newdate', - - MYSQLI_TYPE_INTERVAL => 'interval', - MYSQLI_TYPE_SET => 'set', - MYSQLI_TYPE_ENUM => 'enum', - - MYSQLI_TYPE_VAR_STRING => 'var_string', - MYSQLI_TYPE_STRING => 'string', - MYSQLI_TYPE_CHAR => 'char', - - MYSQLI_TYPE_GEOMETRY => 'geometry', - MYSQLI_TYPE_TINY_BLOB => 'tiny_blob', - MYSQLI_TYPE_MEDIUM_BLOB => 'medium_blob', - MYSQLI_TYPE_LONG_BLOB => 'long_blob', - MYSQLI_TYPE_BLOB => 'blob', - ]; - - $retVal = []; - $fieldData = $this->resultID->fetch_fields(); - - foreach ($fieldData as $i => $data) - { - $retVal[$i] = new \stdClass(); - $retVal[$i]->name = $data->name; - $retVal[$i]->type = $data->type; - $retVal[$i]->type_name = isset($data_types[$data->type]) ? $data_types[$data->type] : null; - $retVal[$i]->max_length = $data->max_length; - $retVal[$i]->primary_key = (int) ($data->flags & 2); - $retVal[$i]->length = $data->length; - $retVal[$i]->default = $data->def; - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Frees the current result. - * - * @return void - */ - public function freeResult() - { - if (is_object($this->resultID)) - { - $this->resultID->free(); - $this->resultID = false; - } - } - - //-------------------------------------------------------------------- - - /** - * Moves the internal pointer to the desired offset. This is called - * internally before fetching results to make sure the result set - * starts at zero. - * - * @param integer $n - * - * @return mixed - */ - public function dataSeek(int $n = 0) - { - return $this->resultID->data_seek($n); - } - - //-------------------------------------------------------------------- - - /** - * Returns the result set as an array. - * - * Overridden by driver classes. - * - * @return mixed - */ - protected function fetchAssoc() - { - return $this->resultID->fetch_assoc(); - } - - //-------------------------------------------------------------------- - - /** - * Returns the result set as an object. - * - * Overridden by child classes. - * - * @param string $className - * - * @return object|boolean|Entity - */ - protected function fetchObject(string $className = 'stdClass') - { - if (is_subclass_of($className, Entity::class)) - { - return empty($data = $this->fetchAssoc()) ? false : (new $className())->setAttributes($data); - } - return $this->resultID->fetch_object($className); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/MySQLi/Utils.php b/vendor/codeigniter4/framework/system/Database/MySQLi/Utils.php deleted file mode 100644 index e5056d1..0000000 --- a/vendor/codeigniter4/framework/system/Database/MySQLi/Utils.php +++ /dev/null @@ -1,80 +0,0 @@ - 'ON CONFLICT DO NOTHING', - ]; - - //-------------------------------------------------------------------- - - /** - * Compile Ignore Statement - * - * Checks if the ignore option is supported by - * the Database Driver for the specific statement. - * - * @param string $statement - * - * @return string - */ - protected function compileIgnore(string $statement) - { - $sql = parent::compileIgnore($statement); - - if (! empty($sql)) - { - $sql = ' ' . trim($sql); - } - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * ORDER BY - * - * @param string $orderBy - * @param string $direction ASC, DESC or RANDOM - * @param boolean $escape - * - * @return BaseBuilder - */ - public function orderBy(string $orderBy, string $direction = '', bool $escape = null) - { - $direction = strtoupper(trim($direction)); - if ($direction === 'RANDOM') - { - if (! is_float($orderBy) && ctype_digit((string) $orderBy)) - { - $orderBy = (float) ($orderBy > 1 ? "0.{$orderBy}" : $orderBy); - } - - if (is_float($orderBy)) - { - $this->db->simpleQuery("SET SEED {$orderBy}"); - } - - $orderBy = $this->randomKeyword[0]; - $direction = ''; - $escape = false; - } - - return parent::orderBy($orderBy, $direction, $escape); - } - - //-------------------------------------------------------------------- - - /** - * Increments a numeric column by the specified value. - * - * @param string $column - * @param integer $value - * - * @throws DatabaseException - * - * @return mixed - */ - public function increment(string $column, int $value = 1) - { - $column = $this->db->protectIdentifiers($column); - - $sql = $this->_update($this->QBFrom[0], [$column => "to_number({$column}, '9999999') + {$value}"]); - - return $this->db->query($sql, $this->binds, false); - } - - //-------------------------------------------------------------------- - - /** - * Decrements a numeric column by the specified value. - * - * @param string $column - * @param integer $value - * - * @throws DatabaseException - * - * @return mixed - */ - public function decrement(string $column, int $value = 1) - { - $column = $this->db->protectIdentifiers($column); - - $sql = $this->_update($this->QBFrom[0], [$column => "to_number({$column}, '9999999') - {$value}"]); - - return $this->db->query($sql, $this->binds, false); - } - - //-------------------------------------------------------------------- - - /** - * Replace - * - * Compiles an replace into string and runs the query. - * Because PostgreSQL doesn't support the replace into command, - * we simply do a DELETE and an INSERT on the first key/value - * combo, assuming that it's either the primary key or a unique key. - * - * @param array $set An associative array of insert values - * - * @return mixed - * @throws DatabaseException - * @internal param true $bool returns the generated SQL, false executes the query. - */ - public function replace(array $set = null) - { - if ($set !== null) - { - $this->set($set); - } - - if (! $this->QBSet) - { - if (CI_DEBUG) - { - throw new DatabaseException('You must use the "set" method to update an entry.'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - - $table = $this->QBFrom[0]; - - $set = $this->binds; - - // We need to grab out the actual values from - // the way binds are stored with escape flag. - array_walk($set, function (&$item) { - $item = $item[0]; - }); - - $keys = array_keys($set); - $values = array_values($set); - - $builder = $this->db->table($table); - $exists = $builder->where("$keys[0] = $values[0]", null, false)->get()->getFirstRow(); - - if (empty($exists)) - { - $result = $builder->insert($set); - } - else - { - array_pop($set); - $result = $builder->update($set, "$keys[0] = $values[0]"); - } - - unset($builder); - $this->resetWrite(); - - return $result; - } - - //-------------------------------------------------------------------- - - /** - * Delete - * - * Compiles a delete string and runs the query - * - * @param mixed $where - * @param integer $limit - * @param boolean $reset_data - * - * @return mixed - * @throws DatabaseException - * @internal param the $mixed where clause - * @internal param the $mixed limit clause - * @internal param $bool - */ - public function delete($where = '', int $limit = null, bool $reset_data = true) - { - if (! empty($limit) || ! empty($this->QBLimit)) - { - throw new DatabaseException('PostgreSQL does not allow LIMITs on DELETE queries.'); - } - - return parent::delete($where, $limit, $reset_data); - } - - //-------------------------------------------------------------------- - - /** - * LIMIT string - * - * Generates a platform-specific LIMIT clause. - * - * @param string $sql SQL Query - * - * @return string - */ - protected function _limit(string $sql, bool $offsetIgnore = false): string - { - return $sql . ' LIMIT ' . $this->QBLimit . ($this->QBOffset ? " OFFSET {$this->QBOffset}" : ''); - } - - //-------------------------------------------------------------------- - - /** - * Update statement - * - * Generates a platform-specific update string from the supplied data - * - * @param string $table - * @param array $values - * - * @return string - * @throws DatabaseException - * @internal param the $string table name - * @internal param the $array update data - */ - protected function _update(string $table, array $values): string - { - if (! empty($this->QBLimit)) - { - throw new DatabaseException('Postgres does not support LIMITs with UPDATE queries.'); - } - - $this->QBOrderBy = []; - return parent::_update($table, $values); - } - - //-------------------------------------------------------------------- - - /** - * Update_Batch statement - * - * Generates a platform-specific batch update string from the supplied data - * - * @param string $table Table name - * @param array $values Update data - * @param string $index WHERE key - * - * @return string - */ - protected function _updateBatch(string $table, array $values, string $index): string - { - $ids = []; - foreach ($values as $val) - { - $ids[] = $val[$index]; - - foreach (array_keys($val) as $field) - { - if ($field !== $index) - { - $final[$field][] = "WHEN {$val[$index]} THEN {$val[$field]}"; - } - } - } - - $cases = ''; - foreach ($final as $k => $v) - { - $cases .= "{$k} = (CASE {$index}\n" - . implode("\n", $v) - . "\nELSE {$k} END), "; - } - - $this->where("{$index} IN(" . implode(',', $ids) . ')', null, false); - - return "UPDATE {$table} SET " . substr($cases, 0, -2) . $this->compileWhereHaving('QBWhere'); - } - - //-------------------------------------------------------------------- - - /** - * Delete statement - * - * Generates a platform-specific delete string from the supplied data - * - * @param string $table The table name - * - * @return string - */ - protected function _delete(string $table): string - { - $this->QBLimit = false; - return parent::_delete($table); - } - - //-------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the truncate() command, - * then this method maps to 'DELETE FROM table' - * - * @param string $table The table name - * - * @return string - */ - protected function _truncate(string $table): string - { - return 'TRUNCATE ' . $table . ' RESTART IDENTITY'; - } - - //-------------------------------------------------------------------- - - /** - * Platform independent LIKE statement builder. - * - * In PostgreSQL, the ILIKE operator will perform case insensitive - * searches according to the current locale. - * - * @see https://www.postgresql.org/docs/9.2/static/functions-matching.html - * - * @param string $prefix - * @param string $column - * @param string $not - * @param string $bind - * @param boolean $insensitiveSearch - * - * @return string $like_statement - */ - public function _like_statement(string $prefix = null, string $column, string $not = null, string $bind, bool $insensitiveSearch = false): string - { - $op = $insensitiveSearch === true ? 'ILIKE' : 'LIKE'; - - return "{$prefix} {$column} {$not} {$op} :{$bind}:"; - } - - //-------------------------------------------------------------------- - - /** - * JOIN - * - * Generates the JOIN portion of the query - * - * @param string $table - * @param string $cond The join condition - * @param string $type The type of join - * @param boolean $escape Whether not to try to escape identifiers - * - * @return BaseBuilder - */ - public function join(string $table, string $cond, string $type = '', bool $escape = null) - { - if (! in_array('FULL OUTER', $this->joinTypes, true)) - { - $this->joinTypes = array_merge($this->joinTypes, ['FULL OUTER']); - } - - return parent::join($table, $cond, $type, $escape); - } - - //-------------------------------------------------------------------- - -} diff --git a/vendor/codeigniter4/framework/system/Database/Postgre/Connection.php b/vendor/codeigniter4/framework/system/Database/Postgre/Connection.php deleted file mode 100644 index c3d6db6..0000000 --- a/vendor/codeigniter4/framework/system/Database/Postgre/Connection.php +++ /dev/null @@ -1,626 +0,0 @@ -DSN)) - { - $this->buildDSN(); - } - - // Strip pgsql if exists - if (mb_strpos($this->DSN, 'pgsql:') === 0) - { - $this->DSN = mb_substr($this->DSN, 6); - } - - // Convert semicolons to spaces. - $this->DSN = str_replace(';', ' ', $this->DSN); - - $this->connID = $persistent === true ? pg_pconnect($this->DSN) : pg_connect($this->DSN); - - if ($this->connID !== false) - { - if ($persistent === true && pg_connection_status($this->connID) === PGSQL_CONNECTION_BAD && pg_ping($this->connID) === false - ) - { - return false; - } - - empty($this->schema) || $this->simpleQuery("SET search_path TO {$this->schema},public"); - - if ($this->setClientEncoding($this->charset) === false) - { - return false; - } - } - - return $this->connID; - } - - //-------------------------------------------------------------------- - - /** - * Keep or establish the connection if no queries have been sent for - * a length of time exceeding the server's idle timeout. - * - * @return void - */ - public function reconnect() - { - if (pg_ping($this->connID) === false) - { - $this->connID = false; - } - } - - //-------------------------------------------------------------------- - - /** - * Close the database connection. - * - * @return void - */ - protected function _close() - { - pg_close($this->connID); - } - - //-------------------------------------------------------------------- - - /** - * Select a specific database table to use. - * - * @param string $databaseName - * - * @return boolean - */ - public function setDatabase(string $databaseName): bool - { - return false; - } - - //-------------------------------------------------------------------- - - /** - * Returns a string containing the version of the database being used. - * - * @return string - */ - public function getVersion(): string - { - if (isset($this->dataCache['version'])) - { - return $this->dataCache['version']; - } - - if (! $this->connID || ( $pgVersion = pg_version($this->connID)) === false) - { - $this->initialize(); - } - - return isset($pgVersion['server']) ? $this->dataCache['version'] = $pgVersion['server'] : false; - } - - //-------------------------------------------------------------------- - - /** - * Executes the query against the database. - * - * @param string $sql - * - * @return mixed - */ - public function execute(string $sql) - { - try - { - return pg_query($this->connID, $sql); - } - catch (\ErrorException $e) - { - log_message('error', $e); - if ($this->DBDebug) - { - throw $e; - } - } - return false; - } - - //-------------------------------------------------------------------- - - /** - * Returns the total number of rows affected by this query. - * - * @return integer - */ - public function affectedRows(): int - { - return pg_affected_rows($this->resultID); - } - - //-------------------------------------------------------------------- - - /** - * "Smart" Escape String - * - * Escapes data based on type - * - * @param mixed $str - * @return mixed - */ - public function escape($str) - { - if (! $this->connID) - { - $this->initialize(); - } - - if (is_string($str) || ( is_object($str) && method_exists($str, '__toString'))) - { - return pg_escape_literal($this->connID, $str); - } - elseif (is_bool($str)) - { - return $str ? 'TRUE' : 'FALSE'; - } - - return parent::escape($str); - } - - //-------------------------------------------------------------------- - - /** - * Platform-dependant string escape - * - * @param string $str - * @return string - */ - protected function _escapeString(string $str): string - { - if (! $this->connID) - { - $this->initialize(); - } - - return pg_escape_string($this->connID, $str); - } - - //-------------------------------------------------------------------- - - /** - * Generates the SQL for listing tables in a platform-dependent manner. - * - * @param boolean $prefixLimit - * - * @return string - */ - protected function _listTables(bool $prefixLimit = false): string - { - $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \'' . $this->schema . "'"; - - if ($prefixLimit !== false && $this->DBPrefix !== '') - { - return $sql . ' AND "table_name" LIKE \'' - . $this->escapeLikeString($this->DBPrefix) . "%' " - . sprintf($this->likeEscapeStr, $this->likeEscapeChar); - } - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * Generates a platform-specific query string so that the column names can be fetched. - * - * @param string $table - * - * @return string - */ - protected function _listColumns(string $table = ''): string - { - return 'SELECT "column_name" - FROM "information_schema"."columns" - WHERE LOWER("table_name") = ' - . $this->escape($this->DBPrefix . strtolower($table)); - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of objects with field data - * - * @param string $table - * @return \stdClass[] - * @throws DatabaseException - */ - public function _fieldData(string $table): array - { - $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" - FROM "information_schema"."columns" - WHERE LOWER("table_name") = ' - . $this->escape(strtolower($table)); - - if (($query = $this->query($sql)) === false) - { - throw new DatabaseException(lang('Database.failGetFieldData')); - } - $query = $query->getResultObject(); - - $retVal = []; - for ($i = 0, $c = count($query); $i < $c; $i ++) - { - $retVal[$i] = new \stdClass(); - $retVal[$i]->name = $query[$i]->column_name; - $retVal[$i]->type = $query[$i]->data_type; - $retVal[$i]->default = $query[$i]->column_default; - $retVal[$i]->max_length = $query[$i]->character_maximum_length > 0 ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of objects with index data - * - * @param string $table - * @return \stdClass[] - * @throws DatabaseException - */ - public function _indexData(string $table): array - { - $sql = 'SELECT "indexname", "indexdef" - FROM "pg_indexes" - WHERE LOWER("tablename") = ' . $this->escape(strtolower($table)) . ' - AND "schemaname" = ' . $this->escape('public'); - - if (($query = $this->query($sql)) === false) - { - throw new DatabaseException(lang('Database.failGetIndexData')); - } - $query = $query->getResultObject(); - - $retVal = []; - foreach ($query as $row) - { - $obj = new \stdClass(); - $obj->name = $row->indexname; - $_fields = explode(',', preg_replace('/^.*\((.+?)\)$/', '$1', trim($row->indexdef))); - $obj->fields = array_map(function ($v) { - return trim($v); - }, $_fields); - - if (strpos($row->indexdef, 'CREATE UNIQUE INDEX pk') === 0) - { - $obj->type = 'PRIMARY'; - } - else - { - $obj->type = (strpos($row->indexdef, 'CREATE UNIQUE') === 0) ? 'UNIQUE' : 'INDEX'; - } - - $retVal[$obj->name] = $obj; - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of objects with Foreign key data - * - * @param string $table - * @return \stdClass[] - * @throws DatabaseException - */ - public function _foreignKeyData(string $table): array - { - $sql = 'SELECT - tc.constraint_name, tc.table_name, kcu.column_name, - ccu.table_name AS foreign_table_name, - ccu.column_name AS foreign_column_name - FROM information_schema.table_constraints AS tc - JOIN information_schema.key_column_usage AS kcu - ON tc.constraint_name = kcu.constraint_name - JOIN information_schema.constraint_column_usage AS ccu - ON ccu.constraint_name = tc.constraint_name - WHERE constraint_type = ' . $this->escape('FOREIGN KEY') . ' AND - tc.table_name = ' . $this->escape($table); - - if (($query = $this->query($sql)) === false) - { - throw new DatabaseException(lang('Database.failGetForeignKeyData')); - } - $query = $query->getResultObject(); - - $retVal = []; - foreach ($query as $row) - { - $obj = new \stdClass(); - $obj->constraint_name = $row->constraint_name; - $obj->table_name = $row->table_name; - $obj->column_name = $row->column_name; - $obj->foreign_table_name = $row->foreign_table_name; - $obj->foreign_column_name = $row->foreign_column_name; - $retVal[] = $obj; - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Returns platform-specific SQL to disable foreign key checks. - * - * @return string - */ - protected function _disableForeignKeyChecks() - { - return 'SET CONSTRAINTS ALL DEFERRED'; - } - - //-------------------------------------------------------------------- - - /** - * Returns platform-specific SQL to enable foreign key checks. - * - * @return string - */ - protected function _enableForeignKeyChecks() - { - return 'SET CONSTRAINTS ALL IMMEDIATE;'; - } - - //-------------------------------------------------------------------- - - /** - * Returns the last error code and message. - * - * Must return an array with keys 'code' and 'message': - * - * return ['code' => null, 'message' => null); - * - * @return array - */ - public function error(): array - { - return [ - 'code' => '', - 'message' => pg_last_error($this->connID), - ]; - } - - //-------------------------------------------------------------------- - - /** - * Insert ID - * - * @return integer - */ - public function insertID(): int - { - $v = pg_version($this->connID); - // 'server' key is only available since PostgreSQL 7.4 - $v = explode(' ', $v['server'])[0] ?? 0; - - $table = func_num_args() > 0 ? func_get_arg(0) : null; - $column = func_num_args() > 1 ? func_get_arg(1) : null; - - if ($table === null && $v >= '8.1') - { - $sql = 'SELECT LASTVAL() AS ins_id'; - } - elseif ($table !== null) - { - if ($column !== null && $v >= '8.0') - { - $sql = "SELECT pg_get_serial_sequence('{$table}', '{$column}') AS seq"; - $query = $this->query($sql); - $query = $query->getRow(); - $seq = $query->seq; - } - else - { - // seq_name passed in table parameter - $seq = $table; - } - - $sql = "SELECT CURRVAL('{$seq}') AS ins_id"; - } - else - { - return pg_last_oid($this->resultID); - } - - $query = $this->query($sql); - $query = $query->getRow(); - return (int) $query->ins_id; - } - - //-------------------------------------------------------------------- - - /** - * Build a DSN from the provided parameters - * - * @return void - */ - protected function buildDSN() - { - $this->DSN === '' || $this->DSN = ''; - - // If UNIX sockets are used, we shouldn't set a port - if (strpos($this->hostname, '/') !== false) - { - $this->port = ''; - } - - $this->hostname === '' || $this->DSN = "host={$this->hostname} "; - - if (! empty($this->port) && ctype_digit($this->port)) - { - $this->DSN .= "port={$this->port} "; - } - - if ($this->username !== '') - { - $this->DSN .= "user={$this->username} "; - - // An empty password is valid! - // password must be set to null to ignore it. - - $this->password === null || $this->DSN .= "password='{$this->password}' "; - } - - $this->database === '' || $this->DSN .= "dbname={$this->database} "; - - // We don't have these options as elements in our standard configuration - // array, but they might be set by parse_url() if the configuration was - // provided via string> Example: - // - // postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1 - foreach (['connect_timeout', 'options', 'sslmode', 'service'] as $key) - { - if (isset($this->{$key}) && is_string($this->{$key}) && $this->{$key} !== '') - { - $this->DSN .= "{$key}='{$this->{$key}}' "; - } - } - - $this->DSN = rtrim($this->DSN); - } - - //-------------------------------------------------------------------- - - /** - * Set client encoding - * - * @param string $charset The client encoding to which the data will be converted. - * @return boolean - */ - protected function setClientEncoding(string $charset): bool - { - return pg_set_client_encoding($this->connID, $charset) === 0; - } - - //-------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return boolean - */ - protected function _transBegin(): bool - { - return (bool) pg_query($this->connID, 'BEGIN'); - } - - // -------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return boolean - */ - protected function _transCommit(): bool - { - return (bool) pg_query($this->connID, 'COMMIT'); - } - - // -------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return boolean - */ - protected function _transRollback(): bool - { - return (bool) pg_query($this->connID, 'ROLLBACK'); - } - - // -------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/Postgre/Forge.php b/vendor/codeigniter4/framework/system/Database/Postgre/Forge.php deleted file mode 100644 index 9b0bbdb..0000000 --- a/vendor/codeigniter4/framework/system/Database/Postgre/Forge.php +++ /dev/null @@ -1,261 +0,0 @@ - 'INTEGER', - 'SMALLINT' => 'INTEGER', - 'INT' => 'BIGINT', - 'INT4' => 'BIGINT', - 'INTEGER' => 'BIGINT', - 'INT8' => 'NUMERIC', - 'BIGINT' => 'NUMERIC', - 'REAL' => 'DOUBLE PRECISION', - 'FLOAT' => 'DOUBLE PRECISION', - ]; - - /** - * NULL value representation in CREATE/ALTER TABLE statements - * - * @var string - */ - protected $_null = 'NULL'; - - //-------------------------------------------------------------------- - - /** - * CREATE TABLE attributes - * - * @param array $attributes Associative array of table attributes - * @return string - */ - protected function _createTableAttributes(array $attributes): string - { - return ''; - } - - //-------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * - * @return string|array - */ - protected function _alterTable(string $alter_type, string $table, $field) - { - if (in_array($alter_type, ['DROP', 'ADD'], true)) - { - return parent::_alterTable($alter_type, $table, $field); - } - - $sql = 'ALTER TABLE ' . $this->db->escapeIdentifiers($table); - $sqls = []; - foreach ($field as $data) - { - if ($data['_literal'] !== false) - { - return false; - } - - if (version_compare($this->db->getVersion(), '8', '>=') && isset($data['type'])) - { - $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name']) - . " TYPE {$data['type']}{$data['length']}"; - } - - if (! empty($data['default'])) - { - $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name']) - . " SET DEFAULT {$data['default']}"; - } - - if (isset($data['null'])) - { - $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name']) - . ($data['null'] === true ? ' DROP' : ' SET') . ' NOT NULL'; - } - - if (! empty($data['new_name'])) - { - $sqls[] = $sql . ' RENAME COLUMN ' . $this->db->escapeIdentifiers($data['name']) - . ' TO ' . $this->db->escapeIdentifiers($data['new_name']); - } - - if (! empty($data['comment'])) - { - $sqls[] = 'COMMENT ON COLUMN' . $this->db->escapeIdentifiers($table) - . '.' . $this->db->escapeIdentifiers($data['name']) - . " IS {$data['comment']}"; - } - } - - return $sqls; - } - - //-------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * @return string - */ - protected function _processColumn(array $field): string - { - return $this->db->escapeIdentifiers($field['name']) - . ' ' . $field['type'] . $field['length'] - . $field['default'] - . $field['null'] - . $field['auto_increment'] - . $field['unique']; - } - - //-------------------------------------------------------------------- - - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * - * @return void - */ - protected function _attributeType(array &$attributes) - { - // Reset field lengths for data types that don't support it - if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== false) - { - $attributes['CONSTRAINT'] = null; - } - - switch (strtoupper($attributes['TYPE'])) - { - case 'TINYINT': - $attributes['TYPE'] = 'SMALLINT'; - $attributes['UNSIGNED'] = false; - break; - case 'MEDIUMINT': - $attributes['TYPE'] = 'INTEGER'; - $attributes['UNSIGNED'] = false; - break; - case 'DATETIME': - $attributes['TYPE'] = 'TIMESTAMP'; - break; - default: - break; - } - } - - //-------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * - * @return void - */ - protected function _attributeAutoIncrement(array &$attributes, array &$field) - { - if (! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === true) - { - $field['type'] = $field['type'] === 'NUMERIC' || $field['type'] === 'BIGINT' ? 'BIGSERIAL' : 'SERIAL'; - } - } - - //-------------------------------------------------------------------- - - /** - * Drop Table - * - * Generates a platform-specific DROP TABLE string - * - * @param string $table Table name - * @param boolean $if_exists Whether to add an IF EXISTS condition - * @param boolean $cascade - * - * @return string - */ - protected function _dropTable(string $table, bool $if_exists, bool $cascade): string - { - $sql = parent::_dropTable($table, $if_exists, $cascade); - - if ($cascade === true) - { - $sql .= ' CASCADE'; - } - - return $sql; - } - - //-------------------------------------------------------------------- - -} diff --git a/vendor/codeigniter4/framework/system/Database/Postgre/PreparedQuery.php b/vendor/codeigniter4/framework/system/Database/Postgre/PreparedQuery.php deleted file mode 100644 index 27e3da2..0000000 --- a/vendor/codeigniter4/framework/system/Database/Postgre/PreparedQuery.php +++ /dev/null @@ -1,158 +0,0 @@ -name = random_int(1, 10000000000000000); - - $sql = $this->parameterize($sql); - - // Update the query object since the parameters are slightly different - // than what was put in. - $this->query->setQuery($sql); - - if (! $this->statement = pg_prepare($this->db->connID, $this->name, $sql)) - { - $this->errorCode = 0; - $this->errorString = pg_last_error($this->db->connID); - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Takes a new set of data and runs it against the currently - * prepared query. Upon success, will return a Results object. - * - * @param array $data - * - * @return boolean - */ - public function _execute(array $data): bool - { - if (is_null($this->statement)) - { - throw new \BadMethodCallException('You must call prepare before trying to execute a prepared statement.'); - } - - $this->result = pg_execute($this->db->connID, $this->name, $data); - - return (bool) $this->result; - } - - //-------------------------------------------------------------------- - - /** - * Returns the result object for the prepared query. - * - * @return mixed - */ - public function _getResult() - { - return $this->result; - } - - //-------------------------------------------------------------------- - - /** - * Replaces the ? placeholders with $1, $2, etc parameters for use - * within the prepared query. - * - * @param string $sql - * - * @return string - */ - public function parameterize(string $sql): string - { - // Track our current value - $count = 0; - - return preg_replace_callback('/\?/', function ($matches) use (&$count) { - $count ++; - return "\${$count}"; - }, $sql); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/Postgre/Result.php b/vendor/codeigniter4/framework/system/Database/Postgre/Result.php deleted file mode 100644 index fcdd509..0000000 --- a/vendor/codeigniter4/framework/system/Database/Postgre/Result.php +++ /dev/null @@ -1,173 +0,0 @@ -resultID); - } - - //-------------------------------------------------------------------- - - /** - * Generates an array of column names in the result set. - * - * @return array - */ - public function getFieldNames(): array - { - $fieldNames = []; - for ($i = 0, $c = $this->getFieldCount(); $i < $c; $i ++) - { - $fieldNames[] = pg_field_name($this->resultID, $i); - } - - return $fieldNames; - } - - //-------------------------------------------------------------------- - - /** - * Generates an array of objects representing field meta-data. - * - * @return array - */ - public function getFieldData(): array - { - $retVal = []; - - for ($i = 0, $c = $this->getFieldCount(); $i < $c; $i ++) - { - $retVal[$i] = new \stdClass(); - $retVal[$i]->name = pg_field_name($this->resultID, $i); - $retVal[$i]->type = pg_field_type_oid($this->resultID, $i); - $retVal[$i]->type_name = pg_field_type($this->resultID, $i); - $retVal[$i]->max_length = pg_field_size($this->resultID, $i); - $retVal[$i]->length = $retVal[$i]->max_length; - // $retVal[$i]->primary_key = (int)($fieldData[$i]->flags & 2); - // $retVal[$i]->default = $fieldData[$i]->def; - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Frees the current result. - * - * @return void - */ - public function freeResult() - { - if (is_resource($this->resultID)) - { - pg_free_result($this->resultID); - $this->resultID = false; - } - } - - //-------------------------------------------------------------------- - - /** - * Moves the internal pointer to the desired offset. This is called - * internally before fetching results to make sure the result set - * starts at zero. - * - * @param integer $n - * - * @return mixed - */ - public function dataSeek(int $n = 0) - { - return pg_result_seek($this->resultID, $n); - } - - //-------------------------------------------------------------------- - - /** - * Returns the result set as an array. - * - * Overridden by driver classes. - * - * @return mixed - */ - protected function fetchAssoc() - { - return pg_fetch_assoc($this->resultID); - } - - //-------------------------------------------------------------------- - - /** - * Returns the result set as an object. - * - * Overridden by child classes. - * - * @param string $className - * - * @return object|boolean|Entity - */ - protected function fetchObject(string $className = 'stdClass') - { - if (is_subclass_of($className, Entity::class)) - { - return empty($data = $this->fetchAssoc()) ? false : (new $className())->setAttributes($data); - } - return pg_fetch_object($this->resultID, null, $className); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/Postgre/Utils.php b/vendor/codeigniter4/framework/system/Database/Postgre/Utils.php deleted file mode 100644 index dd45de1..0000000 --- a/vendor/codeigniter4/framework/system/Database/Postgre/Utils.php +++ /dev/null @@ -1,79 +0,0 @@ -db = $db; - } - - //-------------------------------------------------------------------- - - /** - * Sets the raw query string to use for this statement. - * - * @param string $sql - * @param mixed $binds - * @param boolean $setEscape - * - * @return $this - */ - public function setQuery(string $sql, $binds = null, bool $setEscape = true) - { - $this->originalQueryString = $sql; - - if (! is_null($binds)) - { - if (! is_array($binds)) - { - $binds = [$binds]; - } - - if ($setEscape) - { - array_walk($binds, function (&$item) { - $item = [ - $item, - true, - ]; - }); - } - $this->binds = $binds; - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Will store the variables to bind into the query later. - * - * @param array $binds - * - * @return $this - */ - public function setBinds(array $binds) - { - $this->binds = $binds; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the final, processed query string after binding, etal - * has been performed. - * - * @return string - */ - public function getQuery(): string - { - if (empty($this->finalQueryString)) - { - $this->finalQueryString = $this->originalQueryString; - } - - $this->compileBinds(); - - return $this->finalQueryString; - } - - //-------------------------------------------------------------------- - - /** - * Records the execution time of the statement using microtime(true) - * for it's start and end values. If no end value is present, will - * use the current time to determine total duration. - * - * @param float $start - * @param float $end - * - * @return $this - */ - public function setDuration(float $start, float $end = null) - { - $this->startTime = $start; - - if (is_null($end)) - { - $end = microtime(true); - } - - $this->endTime = $end; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the start time in seconds with microseconds. - * - * @param boolean $returnRaw - * @param integer $decimals - * - * @return string - */ - public function getStartTime(bool $returnRaw = false, int $decimals = 6): string - { - if ($returnRaw) - { - return $this->startTime; - } - - return number_format($this->startTime, $decimals); - } - - //-------------------------------------------------------------------- - /** - * Returns the duration of this query during execution, or null if - * the query has not been executed yet. - * - * @param integer $decimals The accuracy of the returned time. - * - * @return string - */ - public function getDuration(int $decimals = 6): string - { - return number_format(($this->endTime - $this->startTime), $decimals); - } - - //-------------------------------------------------------------------- - - /** - * Stores the error description that happened for this query. - * - * @param integer $code - * @param string $error - * - * @return $this - */ - public function setError(int $code, string $error) - { - $this->errorCode = $code; - $this->errorString = $error; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Reports whether this statement created an error not. - * - * @return boolean - */ - public function hasError(): bool - { - return ! empty($this->errorString); - } - - //-------------------------------------------------------------------- - - /** - * Returns the error code created while executing this statement. - * - * @return integer - */ - public function getErrorCode(): int - { - return $this->errorCode; - } - - //-------------------------------------------------------------------- - - /** - * Returns the error message created while executing this statement. - * - * @return string - */ - public function getErrorMessage(): string - { - return $this->errorString; - } - - //-------------------------------------------------------------------- - - /** - * Determines if the statement is a write-type query or not. - * - * @return boolean - */ - public function isWriteType(): bool - { - return (bool) preg_match( - '/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', $this->originalQueryString); - } - - //-------------------------------------------------------------------- - - /** - * Swaps out one table prefix for a new one. - * - * @param string $orig - * @param string $swap - * - * @return $this - */ - public function swapPrefix(string $orig, string $swap) - { - $sql = empty($this->finalQueryString) ? $this->originalQueryString : $this->finalQueryString; - - $this->finalQueryString = preg_replace('/(\W)' . $orig . '(\S+?)/', '\\1' . $swap . '\\2', $sql); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the original SQL that was passed into the system. - * - * @return string - */ - public function getOriginalQuery(): string - { - return $this->originalQueryString; - } - - //-------------------------------------------------------------------- - - /** - * Escapes and inserts any binds into the finalQueryString object. - * - * @return null|void - */ - protected function compileBinds() - { - $sql = $this->finalQueryString; - - $hasNamedBinds = strpos($sql, ':') !== false && strpos($sql, ':=') === false; - - if (empty($this->binds) || empty($this->bindMarker) || - (strpos($sql, $this->bindMarker) === false && - $hasNamedBinds === false) - ) - { - return; - } - - if (! is_array($this->binds)) - { - $binds = [$this->binds]; - $bindCount = 1; - } - else - { - $binds = $this->binds; - $bindCount = count($binds); - } - - // Reverse the binds so that duplicate named binds - // will be processed prior to the original binds. - if (! is_numeric(key(array_slice($binds, 0, 1)))) - { - $binds = array_reverse($binds); - } - - // We'll need marker length later - $ml = strlen($this->bindMarker); - - if ($hasNamedBinds) - { - $sql = $this->matchNamedBinds($sql, $binds); - } - else - { - $sql = $this->matchSimpleBinds($sql, $binds, $bindCount, $ml); - } - - $this->finalQueryString = $sql; - } - - //-------------------------------------------------------------------- - - /** - * Match bindings - * - * @param string $sql - * @param array $binds - * @return string - */ - protected function matchNamedBinds(string $sql, array $binds): string - { - $replacers = []; - - foreach ($binds as $placeholder => $value) - { - // $value[1] contains the boolean whether should be escaped or not - $escapedValue = $value[1] ? $this->db->escape($value[0]) : $value[0]; - - // In order to correctly handle backlashes in saved strings - // we will need to preg_quote, so remove the wrapping escape characters - // otherwise it will get escaped. - if (is_array($value[0])) - { - $escapedValue = '(' . implode(',', $escapedValue) . ')'; - } - - $replacers[":{$placeholder}:"] = $escapedValue; - } - - return strtr($sql, $replacers); - } - - //-------------------------------------------------------------------- - - /** - * Match bindings - * - * @param string $sql - * @param array $binds - * @param integer $bindCount - * @param integer $ml - * @return string - */ - protected function matchSimpleBinds(string $sql, array $binds, int $bindCount, int $ml): string - { - // Make sure not to replace a chunk inside a string that happens to match the bind marker - if ($c = preg_match_all("/'[^']*'/i", $sql, $matches)) - { - $c = preg_match_all('/' . preg_quote($this->bindMarker, '/') . '/i', str_replace($matches[0], str_replace($this->bindMarker, str_repeat(' ', $ml), $matches[0]), $sql, $c), $matches, PREG_OFFSET_CAPTURE); - - // Bind values' count must match the count of markers in the query - if ($bindCount !== $c) - { - return $sql; - } - } - // Number of binds must match bindMarkers in the string. - else if (($c = preg_match_all('/' . preg_quote($this->bindMarker, '/') . '/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bindCount) - { - return $sql; - } - - do - { - $c--; - $escapedValue = $binds[$c][1] ? $this->db->escape($binds[$c][0]) : $binds[$c][0]; - if (is_array($escapedValue)) - { - $escapedValue = '(' . implode(',', $escapedValue) . ')'; - } - $sql = substr_replace($sql, $escapedValue, $matches[0][$c][1], $ml); - } - while ($c !== 0); - - return $sql; - } - - //-------------------------------------------------------------------- - - /** - * Return text representation of the query - * - * @return string - */ - public function __toString(): string - { - return $this->getQuery(); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/QueryInterface.php b/vendor/codeigniter4/framework/system/Database/QueryInterface.php deleted file mode 100644 index 4a2781e..0000000 --- a/vendor/codeigniter4/framework/system/Database/QueryInterface.php +++ /dev/null @@ -1,159 +0,0 @@ - 'OR IGNORE', - ]; - - //-------------------------------------------------------------------- - - /** - * Replace statement - * - * Generates a platform-specific replace string from the supplied data - * - * @param string $table the table name - * @param array $keys the insert keys - * @param array $values the insert values - * - * @return string - */ - protected function _replace(string $table, array $keys, array $values): string - { - return 'INSERT OR ' . parent::_replace($table, $keys, $values); - } - - //-------------------------------------------------------------------- - - /** - * Truncate statement - * - * Generates a platform-specific truncate string from the supplied data - * - * If the database does not support the TRUNCATE statement, - * then this method maps to 'DELETE FROM table' - * - * @param string $table - * @return string - */ - protected function _truncate(string $table): string - { - return 'DELETE FROM ' . $table; - } - -} diff --git a/vendor/codeigniter4/framework/system/Database/SQLite3/Connection.php b/vendor/codeigniter4/framework/system/Database/SQLite3/Connection.php deleted file mode 100644 index b9851e3..0000000 --- a/vendor/codeigniter4/framework/system/Database/SQLite3/Connection.php +++ /dev/null @@ -1,566 +0,0 @@ -db->DBDebug) - { - throw new DatabaseException('SQLite3 doesn\'t support persistent connections.'); - } - try - { - if ($this->database !== ':memory:' && strpos($this->database, DIRECTORY_SEPARATOR) === false) - { - $this->database = WRITEPATH . $this->database; - } - - return (! $this->password) - ? new \SQLite3($this->database) - : new \SQLite3($this->database, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $this->password); - } - catch (\Exception $e) - { - throw new DatabaseException('SQLite3 error: ' . $e->getMessage()); - } - } - - //-------------------------------------------------------------------- - - /** - * Keep or establish the connection if no queries have been sent for - * a length of time exceeding the server's idle timeout. - * - * @return void - */ - public function reconnect() - { - $this->close(); - $this->initialize(); - } - - //-------------------------------------------------------------------- - - /** - * Close the database connection. - * - * @return void - */ - protected function _close() - { - $this->connID->close(); - } - - //-------------------------------------------------------------------- - - /** - * Select a specific database table to use. - * - * @param string $databaseName - * - * @return boolean - */ - public function setDatabase(string $databaseName): bool - { - return false; - } - - //-------------------------------------------------------------------- - - /** - * Returns a string containing the version of the database being used. - * - * @return string - */ - public function getVersion(): string - { - if (isset($this->dataCache['version'])) - { - return $this->dataCache['version']; - } - - $version = \SQLite3::version(); - - return $this->dataCache['version'] = $version['versionString']; - } - - //-------------------------------------------------------------------- - - /** - * Execute the query - * - * @param string $sql - * - * @return mixed \SQLite3Result object or bool - */ - public function execute(string $sql) - { - try - { - return $this->isWriteType($sql) - ? $this->connID->exec($sql) - : $this->connID->query($sql); - } - catch (\ErrorException $e) - { - log_message('error', $e); - if ($this->DBDebug) - { - throw $e; - } - } - return false; - } - - //-------------------------------------------------------------------- - - /** - * Returns the total number of rows affected by this query. - * - * @return integer - */ - public function affectedRows(): int - { - return $this->connID->changes(); - } - - //-------------------------------------------------------------------- - - /** - * Platform-dependant string escape - * - * @param string $str - * - * @return string - */ - protected function _escapeString(string $str): string - { - return $this->connID->escapeString($str); - } - - //-------------------------------------------------------------------- - - /** - * Generates the SQL for listing tables in a platform-dependent manner. - * - * @param boolean $prefixLimit - * - * @return string - */ - protected function _listTables(bool $prefixLimit = false): string - { - return 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\'' - . ' AND "NAME" NOT LIKE \'sqlite!_%\' ESCAPE \'!\'' - . (($prefixLimit !== false && $this->DBPrefix !== '') - ? ' AND "NAME" LIKE \'' . $this->escapeLikeString($this->DBPrefix) . '%\' ' . sprintf($this->likeEscapeStr, - $this->likeEscapeChar) - : ''); - } - - //-------------------------------------------------------------------- - - /** - * Generates a platform-specific query string so that the column names can be fetched. - * - * @param string $table - * - * @return string - */ - protected function _listColumns(string $table = ''): string - { - return 'PRAGMA TABLE_INFO(' . $this->protectIdentifiers($table, true, null, false) . ')'; - } - - /** - * Fetch Field Names - * - * @param string $table Table name - * - * @return array|false - * @throws DatabaseException - */ - public function getFieldNames(string $table) - { - // Is there a cached result? - if (isset($this->dataCache['field_names'][$table])) - { - return $this->dataCache['field_names'][$table]; - } - - if (empty($this->connID)) - { - $this->initialize(); - } - - if (false === ($sql = $this->_listColumns($table))) - { - if ($this->DBDebug) - { - throw new DatabaseException(lang('Database.featureUnavailable')); - } - - return false; - } - - $query = $this->query($sql); - $this->dataCache['field_names'][$table] = []; - - foreach ($query->getResultArray() as $row) - { - // Do we know from where to get the column's name? - if (! isset($key)) - { - if (isset($row['column_name'])) - { - $key = 'column_name'; - } - elseif (isset($row['COLUMN_NAME'])) - { - $key = 'COLUMN_NAME'; - } - elseif (isset($row['name'])) - { - $key = 'name'; - } - else - { - // We have no other choice but to just get the first element's key. - $key = key($row); - } - } - - $this->dataCache['field_names'][$table][] = $row[$key]; - } - - return $this->dataCache['field_names'][$table]; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of objects with field data - * - * @param string $table - * @return \stdClass[] - * @throws DatabaseException - */ - public function _fieldData(string $table): array - { - if (($query = $this->query('PRAGMA TABLE_INFO(' . $this->protectIdentifiers($table, true, null, - false) . ')')) === false) - { - throw new DatabaseException(lang('Database.failGetFieldData')); - } - $query = $query->getResultObject(); - - if (empty($query)) - { - return []; - } - $retVal = []; - for ($i = 0, $c = count($query); $i < $c; $i++) - { - $retVal[$i] = new \stdClass(); - $retVal[$i]->name = $query[$i]->name; - $retVal[$i]->type = $query[$i]->type; - $retVal[$i]->max_length = null; - $retVal[$i]->default = $query[$i]->dflt_value; - $retVal[$i]->primary_key = isset($query[$i]->pk) && (bool)$query[$i]->pk; - $retVal[$i]->nullable = isset($query[$i]->notnull) && ! (bool)$query[$i]->notnull; - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of objects with index data - * - * @param string $table - * @return \stdClass[] - * @throws DatabaseException - */ - public function _indexData(string $table): array - { - // Get indexes - // Don't use PRAGMA index_list, so we can preserve index order - $sql = "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name=" . $this->escape(strtolower($table)); - if (($query = $this->query($sql)) === false) - { - throw new DatabaseException(lang('Database.failGetIndexData')); - } - $query = $query->getResultObject(); - - $retVal = []; - foreach ($query as $row) - { - $obj = new \stdClass(); - $obj->name = $row->name; - - // Get fields for index - $obj->fields = []; - if (($fields = $this->query('PRAGMA index_info(' . $this->escape(strtolower($row->name)) . ')')) === false) - { - throw new DatabaseException(lang('Database.failGetIndexData')); - } - $fields = $fields->getResultObject(); - - foreach ($fields as $field) - { - $obj->fields[] = $field->name; - } - - $retVal[$obj->name] = $obj; - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of objects with Foreign key data - * - * @param string $table - * @return \stdClass[] - */ - public function _foreignKeyData(string $table): array - { - if ($this->supportsForeignKeys() !== true) - { - return []; - } - - $tables = $this->listTables(); - - if (empty($tables)) - { - return []; - } - - $retVal = []; - - foreach ($tables as $table) - { - $query = $this->query("PRAGMA foreign_key_list({$table})")->getResult(); - - foreach ($query as $row) - { - $obj = new \stdClass(); - $obj->constraint_name = $row->from . ' to ' . $row->table . '.' . $row->to; - $obj->table_name = $table; - $obj->foreign_table_name = $row->table; - $obj->sequence = $row->seq; - - $retVal[] = $obj; - } - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Returns platform-specific SQL to disable foreign key checks. - * - * @return string - */ - protected function _disableForeignKeyChecks() - { - return 'PRAGMA foreign_keys = OFF'; - } - - //-------------------------------------------------------------------- - - /** - * Returns platform-specific SQL to enable foreign key checks. - * - * @return string - */ - protected function _enableForeignKeyChecks() - { - return 'PRAGMA foreign_keys = ON'; - } - - //-------------------------------------------------------------------- - - /** - * Returns the last error code and message. - * - * Must return an array with keys 'code' and 'message': - * - * return ['code' => null, 'message' => null); - * - * @return array - */ - public function error(): array - { - return [ - 'code' => $this->connID->lastErrorCode(), - 'message' => $this->connID->lastErrorMsg(), - ]; - } - - //-------------------------------------------------------------------- - - /** - * Insert ID - * - * @return integer - */ - public function insertID(): int - { - return $this->connID->lastInsertRowID(); - } - - //-------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return boolean - */ - protected function _transBegin(): bool - { - return $this->connID->exec('BEGIN TRANSACTION'); - } - - //-------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return boolean - */ - protected function _transCommit(): bool - { - return $this->connID->exec('END TRANSACTION'); - } - - //-------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return boolean - */ - protected function _transRollback(): bool - { - return $this->connID->exec('ROLLBACK'); - } - - //-------------------------------------------------------------------- - - /** - * Determines if the statement is a write-type query or not. - * - * @return boolean - */ - public function isWriteType($sql): bool - { - return (bool)preg_match( - '/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s/i', - $sql); - } - - //-------------------------------------------------------------------- - - /** - * Checks to see if the current install supports Foreign Keys - * and has them enabled. - * - * @return boolean - */ - public function supportsForeignKeys(): bool - { - $result = $this->simpleQuery('PRAGMA foreign_keys'); - - return (bool)$result; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/SQLite3/Forge.php b/vendor/codeigniter4/framework/system/Database/SQLite3/Forge.php deleted file mode 100644 index bb6f482..0000000 --- a/vendor/codeigniter4/framework/system/Database/SQLite3/Forge.php +++ /dev/null @@ -1,331 +0,0 @@ -db->getVersion(), '3.3', '<')) - { - $this->createTableIfStr = false; - $this->dropTableIfStr = false; - } - } - - //-------------------------------------------------------------------- - - /** - * Create database - * - * @param string $dbName - * @param boolean $ifNotExists Whether to add IF NOT EXISTS condition - * - * @return boolean - */ - public function createDatabase(string $dbName, bool $ifNotExists = false): bool - { - // In SQLite, a database is created when you connect to the database. - // We'll return TRUE so that an error isn't generated. - return true; - } - - //-------------------------------------------------------------------- - - /** - * Drop database - * - * @param string $dbName - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function dropDatabase(string $dbName): bool - { - // In SQLite, a database is dropped when we delete a file - if (! is_file($dbName)) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('Unable to drop the specified database.'); - } - - return false; - } - - // We need to close the pseudo-connection first - $this->db->close(); - if (! @unlink($dbName)) - { - if ($this->db->DBDebug) - { - throw new DatabaseException('Unable to drop the specified database.'); - } - - return false; - } - - if (! empty($this->db->dataCache['db_names'])) - { - $key = array_search(strtolower($dbName), array_map('strtolower', $this->db->dataCache['db_names']), true); - if ($key !== false) - { - unset($this->db->dataCache['db_names'][$key]); - } - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * ALTER TABLE - * - * @param string $alter_type ALTER type - * @param string $table Table name - * @param mixed $field Column definition - * - * @return string|array - */ - protected function _alterTable(string $alter_type, string $table, $field) - { - switch ($alter_type) - { - case 'DROP': - $sqlTable = new Table($this->db, $this); - - $sqlTable->fromTable($table) - ->dropColumn($field) - ->run(); - - return ''; - case 'CHANGE': - $sqlTable = new Table($this->db, $this); - - $sqlTable->fromTable($table) - ->modifyColumn($field) - ->run(); - - return null; - default: - return parent::_alterTable($alter_type, $table, $field); - } - } - - //-------------------------------------------------------------------- - - /** - * Process column - * - * @param array $field - * - * @return string - */ - protected function _processColumn(array $field): string - { - if ($field['type'] === 'TEXT' && strpos($field['length'], "('") === 0) - { - $field['type'] .= ' CHECK(' . $this->db->escapeIdentifiers($field['name']) - . ' IN ' . $field['length'] . ')'; - } - - return $this->db->escapeIdentifiers($field['name']) - . ' ' . $field['type'] - . $field['auto_increment'] - . $field['null'] - . $field['unique'] - . $field['default']; - } - - //-------------------------------------------------------------------- - - /** - * Process indexes - * - * @param string $table - * - * @return array - */ - protected function _processIndexes(string $table): array - { - $sqls = []; - - for ($i = 0, $c = count($this->keys); $i < $c; $i++) - { - $this->keys[$i] = (array)$this->keys[$i]; - - for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) - { - if (! isset($this->fields[$this->keys[$i][$i2]])) - { - unset($this->keys[$i][$i2]); - } - } - if (count($this->keys[$i]) <= 0) - { - continue; - } - - if (in_array($i, $this->uniqueKeys)) - { - $sqls[] = 'CREATE UNIQUE INDEX ' . $this->db->escapeIdentifiers($table . '_' . implode('_', $this->keys[$i])) - . ' ON ' . $this->db->escapeIdentifiers($table) - . ' (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ');'; - continue; - } - - $sqls[] = 'CREATE INDEX ' . $this->db->escapeIdentifiers($table . '_' . implode('_', $this->keys[$i])) - . ' ON ' . $this->db->escapeIdentifiers($table) - . ' (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ');'; - } - - return $sqls; - } - - //-------------------------------------------------------------------- - /** - * Field attribute TYPE - * - * Performs a data type mapping between different databases. - * - * @param array &$attributes - * - * @return void - */ - protected function _attributeType(array &$attributes) - { - switch (strtoupper($attributes['TYPE'])) - { - case 'ENUM': - case 'SET': - $attributes['TYPE'] = 'TEXT'; - break; - default: - break; - } - } - - //-------------------------------------------------------------------- - - /** - * Field attribute AUTO_INCREMENT - * - * @param array &$attributes - * @param array &$field - * - * @return void - */ - protected function _attributeAutoIncrement(array &$attributes, array &$field) - { - if (! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === true - && stripos($field['type'], 'int') !== false) - { - $field['type'] = 'INTEGER PRIMARY KEY'; - $field['default'] = ''; - $field['null'] = ''; - $field['unique'] = ''; - $field['auto_increment'] = ' AUTOINCREMENT'; - - $this->primaryKeys = []; - } - } - - //-------------------------------------------------------------------- - - /** - * Foreign Key Drop - * - * @param string $table Table name - * @param string $foreignName Foreign name - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function dropForeignKey(string $table, string $foreignName): bool - { - // If this version of SQLite doesn't support it, we're done here - if ($this->db->supportsForeignKeys() !== true) - { - return true; - } - - // Otherwise we have to copy the table and recreate - // without the foreign key being involved now - $sqlTable = new Table($this->db, $this); - - return $sqlTable->fromTable($this->db->DBPrefix . $table) - ->dropForeignKey($foreignName) - ->run(); - } - - //-------------------------------------------------------------------- - -} diff --git a/vendor/codeigniter4/framework/system/Database/SQLite3/PreparedQuery.php b/vendor/codeigniter4/framework/system/Database/SQLite3/PreparedQuery.php deleted file mode 100644 index 22202c3..0000000 --- a/vendor/codeigniter4/framework/system/Database/SQLite3/PreparedQuery.php +++ /dev/null @@ -1,143 +0,0 @@ -statement = $this->db->connID->prepare($sql))) - { - $this->errorCode = $this->db->connID->lastErrorCode(); - $this->errorString = $this->db->connID->lastErrorMsg(); - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Takes a new set of data and runs it against the currently - * prepared query. Upon success, will return a Results object. - * - * @todo finalize() - * - * @param array $data - * - * @return boolean - */ - public function _execute(array $data): bool - { - if (is_null($this->statement)) - { - throw new \BadMethodCallException('You must call prepare before trying to execute a prepared statement.'); - } - - foreach ($data as $key => $item) - { - // Determine the type string - if (is_integer($item)) - { - $bindType = SQLITE3_INTEGER; - } - elseif (is_float($item)) - { - $bindType = SQLITE3_FLOAT; - } - else - { - $bindType = SQLITE3_TEXT; - } - - // Bind it - $this->statement->bindValue($key + 1, $item, $bindType); - } - - $this->result = $this->statement->execute(); - - return $this->result !== false; - } - - //-------------------------------------------------------------------- - - /** - * Returns the result object for the prepared query. - * - * @return mixed - */ - public function _getResult() - { - return $this->result; - } - - //-------------------------------------------------------------------- - -} diff --git a/vendor/codeigniter4/framework/system/Database/SQLite3/Result.php b/vendor/codeigniter4/framework/system/Database/SQLite3/Result.php deleted file mode 100644 index ae293d6..0000000 --- a/vendor/codeigniter4/framework/system/Database/SQLite3/Result.php +++ /dev/null @@ -1,207 +0,0 @@ -resultID->numColumns(); - } - - //-------------------------------------------------------------------- - - /** - * Generates an array of column names in the result set. - * - * @return array - */ - public function getFieldNames(): array - { - $fieldNames = []; - for ($i = 0, $c = $this->getFieldCount(); $i < $c; $i ++) - { - $fieldNames[] = $this->resultID->columnName($i); - } - - return $fieldNames; - } - - //-------------------------------------------------------------------- - - /** - * Generates an array of objects representing field meta-data. - * - * @return array - */ - public function getFieldData(): array - { - static $data_types = [ - SQLITE3_INTEGER => 'integer', - SQLITE3_FLOAT => 'float', - SQLITE3_TEXT => 'text', - SQLITE3_BLOB => 'blob', - SQLITE3_NULL => 'null', - ]; - - $retVal = []; - - for ($i = 0, $c = $this->getFieldCount(); $i < $c; $i ++) - { - $retVal[$i] = new \stdClass(); - $retVal[$i]->name = $this->resultID->columnName($i); - $type = $this->resultID->columnType($i); - $retVal[$i]->type = $type; - $retVal[$i]->type_name = isset($data_types[$type]) ? $data_types[$type] : null; - $retVal[$i]->max_length = null; - $retVal[$i]->length = null; - } - - return $retVal; - } - - //-------------------------------------------------------------------- - - /** - * Frees the current result. - * - * @return void - */ - public function freeResult() - { - if (is_object($this->resultID)) - { - $this->resultID->finalize(); - $this->resultID = false; - } - } - - //-------------------------------------------------------------------- - - /** - * Moves the internal pointer to the desired offset. This is called - * internally before fetching results to make sure the result set - * starts at zero. - * - * @param integer $n - * - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function dataSeek(int $n = 0) - { - if ($n !== 0) - { - throw new DatabaseException('SQLite3 doesn\'t support seeking to other offset.'); - } - - return $this->resultID->reset(); - } - - //-------------------------------------------------------------------- - - /** - * Returns the result set as an array. - * - * Overridden by driver classes. - * - * @return mixed - */ - protected function fetchAssoc() - { - return $this->resultID->fetchArray(SQLITE3_ASSOC); - } - - //-------------------------------------------------------------------- - - /** - * Returns the result set as an object. - * - * Overridden by child classes. - * - * @param string $className - * - * @return object|boolean - */ - protected function fetchObject(string $className = 'stdClass') - { - // No native support for fetching rows as objects - if (($row = $this->fetchAssoc()) === false) - { - return false; - } - elseif ($className === 'stdClass') - { - return (object) $row; - } - - $classObj = new $className(); - - if (is_subclass_of($className, Entity::class)) - { - return $classObj->setAttributes($row); - } - - $classSet = \Closure::bind(function ($key, $value) { - $this->$key = $value; - }, $classObj, $className - ); - foreach (array_keys($row) as $key) - { - $classSet($key, $row[$key]); - } - return $classObj; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Database/SQLite3/Table.php b/vendor/codeigniter4/framework/system/Database/SQLite3/Table.php deleted file mode 100644 index 0845a35..0000000 --- a/vendor/codeigniter4/framework/system/Database/SQLite3/Table.php +++ /dev/null @@ -1,440 +0,0 @@ -db = $db; - $this->forge = $forge; - } - - /** - * Reads an existing database table and - * collects all of the information needed to - * recreate this table. - * - * @param string $table - * - * @return \CodeIgniter\Database\SQLite3\Table - */ - public function fromTable(string $table) - { - $this->prefixedTableName = $table; - - // Remove the prefix, if any, since it's - // already been added by the time we get here... - $prefix = $this->db->DBPrefix; - if (! empty($prefix)) - { - if (strpos($table, $prefix) === 0) - { - $table = substr($table, strlen($prefix)); - } - } - - if (! $this->db->tableExists($this->prefixedTableName)) - { - throw DataException::forTableNotFound($this->prefixedTableName); - } - - $this->tableName = $table; - - $this->fields = $this->formatFields($this->db->getFieldData($table)); - - $this->keys = array_merge($this->keys, $this->formatKeys($this->db->getIndexData($table))); - - $this->foreignKeys = $this->db->getForeignKeyData($table); - - return $this; - } - - /** - * Called after `fromTable` and any actions, like `dropColumn`, etc, - * to finalize the action. It creates a temp table, creates the new - * table with modifications, and copies the data over to the new table. - * - * @return boolean - */ - public function run(): bool - { - $this->db->query('PRAGMA foreign_keys = OFF'); - - $this->db->transStart(); - - $this->forge->renameTable($this->tableName, "temp_{$this->tableName}"); - - $this->forge->reset(); - - $this->createTable(); - - $this->copyData(); - - $this->forge->dropTable("temp_{$this->tableName}"); - - $success = $this->db->transComplete(); - - $this->db->query('PRAGMA foreign_keys = ON'); - - return $success; - } - - /** - * Drops columns from the table. - * - * @param string|array $columns - * - * @return \CodeIgniter\Database\SQLite3\Table - */ - public function dropColumn($columns) - { - //unset($this->fields[$column]); - - if (is_string($columns)) - { - $columns = explode(',', $columns); - } - - foreach ($columns as $column) - { - $column = trim($column); - if (isset($this->fields[$column])) - { - unset($this->fields[$column]); - } - } - - return $this; - } - - /** - * Modifies a field, including changing data type, - * renaming, etc. - * - * @param array $field - * - * @return \CodeIgniter\Database\SQLite3\Table - */ - public function modifyColumn(array $field) - { - $field = $field[0]; - - $oldName = $field['name']; - unset($field['name']); - - $this->fields[$oldName] = $field; - - return $this; - } - - /** - * Drops a foreign key from this table so that - * it won't be recreated in the future. - * - * @param string $column - * - * @return \CodeIgniter\Database\SQLite3\Table - */ - public function dropForeignKey(string $column) - { - if (empty($this->foreignKeys)) - { - return $this; - } - - for ($i = 0; $i < count($this->foreignKeys); $i++) - { - if ($this->foreignKeys[$i]->table_name !== $this->tableName) - { - continue; - } - - // The column name should be the first thing in the constraint name - if (strpos($this->foreignKeys[$i]->constraint_name, $column) !== 0) - { - continue; - } - - unset($this->foreignKeys[$i]); - } - - return $this; - } - - /** - * Creates the new table based on our current fields. - * - * @return mixed - */ - protected function createTable() - { - $this->dropIndexes(); - $this->db->resetDataCache(); - - // Handle any modified columns. - $fields = []; - foreach ($this->fields as $name => $field) - { - if (isset($field['new_name'])) - { - $fields[$field['new_name']] = $field; - continue; - } - - $fields[$name] = $field; - } - - $this->forge->addField($fields); - - // Unique/Index keys - if (is_array($this->keys)) - { - foreach ($this->keys as $key) - { - switch ($key['type']) - { - case 'primary': - $this->forge->addPrimaryKey($key['fields']); - break; - case 'unique': - $this->forge->addUniqueKey($key['fields']); - break; - case 'index': - $this->forge->addKey($key['fields']); - break; - } - } - } - - // Foreign Keys - - return $this->forge->createTable($this->tableName); - } - - /** - * Copies data from our old table to the new one, - * taking care map data correctly based on any columns - * that have been renamed. - * - * @return void - */ - protected function copyData() - { - $exFields = []; - $newFields = []; - - foreach ($this->fields as $name => $details) - { - // Are we modifying the column? - if (isset($details['new_name'])) - { - $newFields[] = $details['new_name']; - } - else - { - $newFields[] = $name; - } - - $exFields[] = $name; - } - - $exFields = implode(', ', $exFields); - $newFields = implode(', ', $newFields); - - $this->db->query("INSERT INTO {$this->prefixedTableName}({$newFields}) SELECT {$exFields} FROM {$this->db->DBPrefix}temp_{$this->tableName}"); - } - - /** - * Converts fields retrieved from the database to - * the format needed for creating fields with Forge. - * - * @param array|boolean $fields - * - * @return mixed - */ - protected function formatFields($fields) - { - if (! is_array($fields)) - { - return $fields; - } - - $return = []; - - foreach ($fields as $field) - { - $return[$field->name] = [ - 'type' => $field->type, - 'default' => $field->default, - 'nullable' => $field->nullable, - ]; - - if ($field->primary_key) - { - $this->keys[$field->name] = [ - 'fields' => [$field->name], - 'type' => 'primary', - ]; - } - } - - return $return; - } - - /** - * Converts keys retrieved from the database to - * the format needed to create later. - * - * @param mixed $keys - * - * @return mixed - */ - protected function formatKeys($keys) - { - if (! is_array($keys)) - { - return $keys; - } - - $return = []; - - foreach ($keys as $name => $key) - { - $return[$name] = [ - 'fields' => $key->fields, - 'type' => 'index', - ]; - } - - return $return; - } - - /** - * Attempts to drop all indexes and constraints - * from the database for this table. - * - * @return null|void - */ - protected function dropIndexes() - { - if (! is_array($this->keys) || ! count($this->keys)) - { - return; - } - - foreach ($this->keys as $name => $key) - { - if ($key['type'] === 'primary' || $key['type'] === 'unique') - { - continue; - } - - $this->db->query("DROP INDEX IF EXISTS '{$name}'"); - } - } -} diff --git a/vendor/codeigniter4/framework/system/Database/SQLite3/Utils.php b/vendor/codeigniter4/framework/system/Database/SQLite3/Utils.php deleted file mode 100644 index 72f8d4b..0000000 --- a/vendor/codeigniter4/framework/system/Database/SQLite3/Utils.php +++ /dev/null @@ -1,73 +0,0 @@ -seedPath = $config->filesPath ?? APPPATH . 'Database/'; - - if (empty($this->seedPath)) - { - throw new \InvalidArgumentException('Invalid filesPath set in the Config\Database.'); - } - - $this->seedPath = rtrim($this->seedPath, '/') . '/Seeds/'; - - if (! is_dir($this->seedPath)) - { - throw new \InvalidArgumentException('Unable to locate the seeds directory. Please check Config\Database::filesPath'); - } - - $this->config = & $config; - - if (is_null($db)) - { - $db = \Config\Database::connect($this->DBGroup); - } - - $this->db = & $db; - - $this->forge = \Config\Database::forge($this->DBGroup); - } - - //-------------------------------------------------------------------- - - /** - * Loads the specified seeder and runs it. - * - * @param string $class - * - * @throws \InvalidArgumentException - */ - public function call(string $class) - { - if (empty($class)) - { - throw new \InvalidArgumentException('No Seeder was specified.'); - } - - $path = str_replace('.php', '', $class) . '.php'; - - // If we have namespaced class, simply try to load it. - if (strpos($class, '\\') !== false) - { - $seeder = new $class($this->config); - } - // Otherwise, try to load the class manually. - else - { - $path = $this->seedPath . $path; - - if (! is_file($path)) - { - throw new \InvalidArgumentException('The specified Seeder is not a valid file: ' . $path); - } - - // Assume the class has the correct namespace - $class = APP_NAMESPACE . '\Database\Seeds\\' . $class; - - if (! class_exists($class, false)) - { - require_once $path; - } - - $seeder = new $class($this->config); - } - - $seeder->setSilent($this->silent); - $seeder->run(); - - unset($seeder); - - if (is_cli() && ! $this->silent) - { - CLI::write("Seeded: {$class}", 'green'); - } - } - - //-------------------------------------------------------------------- - - /** - * Sets the location of the directory that seed files can be located in. - * - * @param string $path - * - * @return Seeder - */ - public function setPath(string $path) - { - $this->seedPath = rtrim($path, '/') . '/'; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Sets the silent treatment. - * - * @param boolean $silent - * - * @return Seeder - */ - public function setSilent(bool $silent) - { - $this->silent = $silent; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Run the database seeds. This is where the magic happens. - * - * Child classes must implement this method and take care - * of inserting their data here. - * - * @return mixed - */ - public function run() - { - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Debug/Exceptions.php b/vendor/codeigniter4/framework/system/Debug/Exceptions.php deleted file mode 100644 index 3b915e3..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Exceptions.php +++ /dev/null @@ -1,513 +0,0 @@ -ob_level = ob_get_level(); - - $this->viewPath = rtrim($config->errorViewPath, '\\/ ') . DIRECTORY_SEPARATOR; - - $this->config = $config; - - $this->request = $request; - $this->response = $response; - } - - //-------------------------------------------------------------------- - - /** - * Responsible for registering the error, exception and shutdown - * handling of our application. - */ - public function initialize() - { - //Set the Exception Handler - set_exception_handler([$this, 'exceptionHandler']); - - // Set the Error Handler - set_error_handler([$this, 'errorHandler']); - - // Set the handler for shutdown to catch Parse errors - // Do we need this in PHP7? - register_shutdown_function([$this, 'shutdownHandler']); - } - - //-------------------------------------------------------------------- - - /** - * Catches any uncaught errors and exceptions, including most Fatal errors - * (Yay PHP7!). Will log the error, display it if display_errors is on, - * and fire an event that allows custom actions to be taken at this point. - * - * @param \Throwable $exception - * - * @codeCoverageIgnore - */ - public function exceptionHandler(Throwable $exception) - { - [ - $statusCode, - $exitCode, - ] = $this->determineCodes($exception); - - // Log it - if ($this->config->log === true && ! in_array($statusCode, $this->config->ignoreCodes)) - { - log_message('critical', $exception->getMessage() . "\n{trace}", [ - 'trace' => $exception->getTraceAsString(), - ]); - } - - if (! is_cli()) - { - $this->response->setStatusCode($statusCode); - $header = "HTTP/{$this->request->getProtocolVersion()} {$this->response->getStatusCode()} {$this->response->getReason()}"; - header($header, true, $statusCode); - - if (strpos($this->request->getHeaderLine('accept'), 'text/html') === false) - { - $this->respond(ENVIRONMENT === 'development' ? $this->collectVars($exception, $statusCode) : '', $statusCode)->send(); - - exit($exitCode); - } - } - - $this->render($exception, $statusCode); - - exit($exitCode); - } - - //-------------------------------------------------------------------- - - /** - * Even in PHP7, some errors make it through to the errorHandler, so - * convert these to Exceptions and let the exception handler log it and - * display it. - * - * This seems to be primarily when a user triggers it with trigger_error(). - * - * @param integer $severity - * @param string $message - * @param string|null $file - * @param integer|null $line - * - * @throws \ErrorException - */ - public function errorHandler(int $severity, string $message, string $file = null, int $line = null) - { - if (! (error_reporting() & $severity)) - { - return; - } - - // Convert it to an exception and pass it along. - throw new ErrorException($message, 0, $severity, $file, $line); - } - - //-------------------------------------------------------------------- - - /** - * Checks to see if any errors have happened during shutdown that - * need to be caught and handle them. - */ - public function shutdownHandler() - { - $error = error_get_last(); - - // If we've got an error that hasn't been displayed, then convert - // it to an Exception and use the Exception handler to display it - // to the user. - if (! is_null($error)) - { - // Fatal Error? - if (in_array($error['type'], [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE])) - { - $this->exceptionHandler(new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line'])); - } - } - } - - //-------------------------------------------------------------------- - - /** - * Determines the view to display based on the exception thrown, - * whether an HTTP or CLI request, etc. - * - * @param \Throwable $exception - * @param string $template_path - * - * @return string The path and filename of the view file to use - */ - protected function determineView(Throwable $exception, string $template_path): string - { - // Production environments should have a custom exception file. - $view = 'production.php'; - $template_path = rtrim($template_path, '\\/ ') . DIRECTORY_SEPARATOR; - - if (str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors'))) - { - $view = 'error_exception.php'; - } - - // 404 Errors - if ($exception instanceof PageNotFoundException) - { - return 'error_404.php'; - } - - // Allow for custom views based upon the status code - if (is_file($template_path . 'error_' . $exception->getCode() . '.php')) - { - return 'error_' . $exception->getCode() . '.php'; - } - - return $view; - } - - //-------------------------------------------------------------------- - - /** - * Given an exception and status code will display the error to the client. - * - * @param \Throwable $exception - * @param integer $statusCode - */ - protected function render(Throwable $exception, int $statusCode) - { - // Determine possible directories of error views - $path = $this->viewPath; - $altPath = rtrim((new Paths())->viewDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'errors' . DIRECTORY_SEPARATOR; - - $path .= (is_cli() ? 'cli' : 'html') . DIRECTORY_SEPARATOR; - $altPath .= (is_cli() ? 'cli' : 'html') . DIRECTORY_SEPARATOR; - - // Determine the views - $view = $this->determineView($exception, $path); - $altView = $this->determineView($exception, $altPath); - - // Check if the view exists - if (is_file($path . $view)) - { - $viewFile = $path . $view; - } - elseif (is_file($altPath . $altView)) - { - $viewFile = $altPath . $altView; - } - - // Prepare the vars - $vars = $this->collectVars($exception, $statusCode); - extract($vars); - - // Render it - if (ob_get_level() > $this->ob_level + 1) - { - ob_end_clean(); - } - - ob_start(); - include $viewFile; - $buffer = ob_get_contents(); - ob_end_clean(); - echo $buffer; - } - - //-------------------------------------------------------------------- - - /** - * Gathers the variables that will be made available to the view. - * - * @param \Throwable $exception - * @param integer $statusCode - * - * @return array - */ - protected function collectVars(Throwable $exception, int $statusCode): array - { - return [ - 'title' => get_class($exception), - 'type' => get_class($exception), - 'code' => $statusCode, - 'message' => $exception->getMessage() ?? '(null)', - 'file' => $exception->getFile(), - 'line' => $exception->getLine(), - 'trace' => $exception->getTrace(), - ]; - } - - /** - * Determines the HTTP status code and the exit status code for this request. - * - * @param \Throwable $exception - * - * @return array - */ - protected function determineCodes(Throwable $exception): array - { - $statusCode = abs($exception->getCode()); - - if ($statusCode < 100 || $statusCode > 599) - { - $exitStatus = $statusCode + EXIT__AUTO_MIN; // 9 is EXIT__AUTO_MIN - if ($exitStatus > EXIT__AUTO_MAX) // 125 is EXIT__AUTO_MAX - { - $exitStatus = EXIT_ERROR; // EXIT_ERROR - } - $statusCode = 500; - } - else - { - $exitStatus = 1; // EXIT_ERROR - } - - return [ - $statusCode ?? 500, - $exitStatus, - ]; - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // Display Methods - //-------------------------------------------------------------------- - - /** - * Clean Path - * - * This makes nicer looking paths for the error output. - * - * @param string $file - * - * @return string - */ - public static function cleanPath(string $file): string - { - switch (true) - { - case strpos($file, APPPATH) === 0: - $file = 'APPPATH' . DIRECTORY_SEPARATOR . substr($file, strlen(APPPATH)); - break; - case strpos($file, SYSTEMPATH) === 0: - $file = 'SYSTEMPATH' . DIRECTORY_SEPARATOR . substr($file, strlen(SYSTEMPATH)); - break; - case strpos($file, FCPATH) === 0: - $file = 'FCPATH' . DIRECTORY_SEPARATOR . substr($file, strlen(FCPATH)); - break; - case defined('VENDORPATH') && strpos($file, VENDORPATH) === 0: - $file = 'VENDORPATH' . DIRECTORY_SEPARATOR . substr($file, strlen(VENDORPATH)); - break; - } - - return $file; - } - - //-------------------------------------------------------------------- - - /** - * Describes memory usage in real-world units. Intended for use - * with memory_get_usage, etc. - * - * @param $bytes - * - * @return string - */ - public static function describeMemory(int $bytes): string - { - if ($bytes < 1024) - { - return $bytes . 'B'; - } - else if ($bytes < 1048576) - { - return round($bytes / 1024, 2) . 'KB'; - } - - return round($bytes / 1048576, 2) . 'MB'; - } - - //-------------------------------------------------------------------- - - /** - * Creates a syntax-highlighted version of a PHP file. - * - * @param string $file - * @param integer $lineNumber - * @param integer $lines - * - * @return boolean|string - */ - public static function highlightFile(string $file, int $lineNumber, int $lines = 15) - { - if (empty($file) || ! is_readable($file)) - { - return false; - } - - // Set our highlight colors: - if (function_exists('ini_set')) - { - ini_set('highlight.comment', '#767a7e; font-style: italic'); - ini_set('highlight.default', '#c7c7c7'); - ini_set('highlight.html', '#06B'); - ini_set('highlight.keyword', '#f1ce61;'); - ini_set('highlight.string', '#869d6a'); - } - - try - { - $source = file_get_contents($file); - } - catch (Throwable $e) - { - return false; - } - - $source = str_replace(["\r\n", "\r"], "\n", $source); - $source = explode("\n", highlight_string($source, true)); - $source = str_replace('
', "\n", $source[1]); - - $source = explode("\n", str_replace("\r\n", "\n", $source)); - - // Get just the part to show - $start = $lineNumber - (int) round($lines / 2); - $start = $start < 0 ? 0 : $start; - - // Get just the lines we need to display, while keeping line numbers... - $source = array_splice($source, $start, $lines, true); - - // Used to format the line number in the source - $format = '% ' . strlen(sprintf('%s', $start + $lines)) . 'd'; - - $out = ''; - // Because the highlighting may have an uneven number - // of open and close span tags on one line, we need - // to ensure we can close them all to get the lines - // showing correctly. - $spans = 1; - - foreach ($source as $n => $row) - { - $spans += substr_count($row, ']+>#', $row, $tags); - $out .= sprintf("{$format} %s\n%s", $n + $start + 1, strip_tags($row), implode('', $tags[0]) - ); - } - else - { - $out .= sprintf('' . $format . ' %s', $n + $start + 1, $row) . "\n"; - } - } - - if ($spans > 0) - { - $out .= str_repeat('', $spans); - } - - return '
' . $out . '
'; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Debug/Iterator.php b/vendor/codeigniter4/framework/system/Debug/Iterator.php deleted file mode 100644 index c9101df..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Iterator.php +++ /dev/null @@ -1,179 +0,0 @@ -tests[$name] = $closure; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Runs through all of the tests that have been added, recording - * time to execute the desired number of iterations, and the approximate - * memory usage used during those iterations. - * - * @param integer $iterations - * @param boolean $output - * - * @return string|null - */ - public function run(int $iterations = 1000, bool $output = true) - { - foreach ($this->tests as $name => $test) - { - // clear memory before start - gc_collect_cycles(); - - $start = microtime(true); - $start_mem = $max_memory = memory_get_usage(true); - - for ($i = 0; $i < $iterations; $i ++) - { - $result = $test(); - - $max_memory = max($max_memory, memory_get_usage(true)); - - unset($result); - } - - $this->results[$name] = [ - 'time' => microtime(true) - $start, - 'memory' => $max_memory - $start_mem, - 'n' => $iterations, - ]; - } - - if ($output) - { - return $this->getReport(); - } - - return null; - } - - //-------------------------------------------------------------------- - - /** - * Get results. - * - * @return string - */ - public function getReport(): string - { - if (empty($this->results)) - { - return 'No results to display.'; - } - - helper('number'); - - // Template - $tpl = ' - - - - - - - - - {rows} - -
TestTimeMemory
'; - - $rows = ''; - - foreach ($this->results as $name => $result) - { - $memory = number_to_size($result['memory'], 4); - - $rows .= " - {$name} - " . number_format($result['time'], 4) . " - {$memory} - "; - } - - $tpl = str_replace('{rows}', $rows, $tpl); - - return $tpl . '
'; - } - - //-------------------------------------------------------------------- - -} diff --git a/vendor/codeigniter4/framework/system/Debug/Timer.php b/vendor/codeigniter4/framework/system/Debug/Timer.php deleted file mode 100644 index 736f558..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Timer.php +++ /dev/null @@ -1,181 +0,0 @@ -timers[strtolower($name)] = [ - 'start' => ! empty($time) ? $time : microtime(true), - 'end' => null, - ]; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Stops a running timer. - * - * If the timer is not stopped before the timers() method is called, - * it will be automatically stopped at that point. - * - * @param string $name The name of this timer. - * - * @return Timer - */ - public function stop(string $name) - { - $name = strtolower($name); - - if (empty($this->timers[$name])) - { - throw new \RuntimeException('Cannot stop timer: invalid name given.'); - } - - $this->timers[$name]['end'] = microtime(true); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the duration of a recorded timer. - * - * @param string $name The name of the timer. - * @param integer $decimals Number of decimal places. - * - * @return null|float Returns null if timer exists by that name. - * Returns a float representing the number of - * seconds elapsed while that timer was running. - */ - public function getElapsedTime(string $name, int $decimals = 4) - { - $name = strtolower($name); - - if (empty($this->timers[$name])) - { - return null; - } - - $timer = $this->timers[$name]; - - if (empty($timer['end'])) - { - $timer['end'] = microtime(true); - } - - return (float) number_format($timer['end'] - $timer['start'], $decimals); - } - - //-------------------------------------------------------------------- - - /** - * Returns the array of timers, with the duration pre-calculated for you. - * - * @param integer $decimals Number of decimal places - * - * @return array - */ - public function getTimers(int $decimals = 4): array - { - $timers = $this->timers; - - foreach ($timers as &$timer) - { - if (empty($timer['end'])) - { - $timer['end'] = microtime(true); - } - - $timer['duration'] = (float) number_format($timer['end'] - $timer['start'], $decimals); - } - - return $timers; - } - - //-------------------------------------------------------------------- - - /** - * Checks whether or not a timer with the specified name exists. - * - * @param string $name - * - * @return boolean - */ - public function has(string $name): bool - { - return array_key_exists(strtolower($name), $this->timers); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar.php b/vendor/codeigniter4/framework/system/Debug/Toolbar.php deleted file mode 100644 index ff2be35..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar.php +++ /dev/null @@ -1,514 +0,0 @@ -config = $config; - - foreach ($config->collectors as $collector) - { - if (! class_exists($collector)) - { - log_message('critical', 'Toolbar collector does not exists(' . $collector . ').' . - 'please check $collectors in the Config\Toolbar.php file.'); - continue; - } - - $this->collectors[] = new $collector(); - } - } - - //-------------------------------------------------------------------- - - /** - * Returns all the data required by Debug Bar - * - * @param float $startTime App start time - * @param float $totalTime - * @param \CodeIgniter\HTTP\RequestInterface $request - * @param \CodeIgniter\HTTP\ResponseInterface $response - * - * @return string JSON encoded data - */ - public function run(float $startTime, float $totalTime, RequestInterface $request, ResponseInterface $response): string - { - // Data items used within the view. - $data['url'] = current_url(); - $data['method'] = $request->getMethod(true); - $data['isAJAX'] = $request->isAJAX(); - $data['startTime'] = $startTime; - $data['totalTime'] = $totalTime * 1000; - $data['totalMemory'] = number_format((memory_get_peak_usage()) / 1024 / 1024, 3); - $data['segmentDuration'] = $this->roundTo($data['totalTime'] / 7); - $data['segmentCount'] = (int) ceil($data['totalTime'] / $data['segmentDuration']); - $data['CI_VERSION'] = \CodeIgniter\CodeIgniter::CI_VERSION; - $data['collectors'] = []; - - foreach ($this->collectors as $collector) - { - $data['collectors'][] = $collector->getAsArray(); - } - - foreach ($this->collectVarData() as $heading => $items) - { - $varData = []; - - if (is_array($items)) - { - foreach ($items as $key => $value) - { - $varData[esc($key)] = is_string($value) ? esc($value) : '
' . esc(print_r($value, true)) . '
'; - } - } - - $data['vars']['varData'][esc($heading)] = $varData; - } - - if (! empty($_SESSION)) - { - foreach ($_SESSION as $key => $value) - { - // Replace the binary data with string to avoid json_encode failure. - if (is_string($value) && preg_match('~[^\x20-\x7E\t\r\n]~', $value)) - { - $value = 'binary data'; - } - - $data['vars']['session'][esc($key)] = is_string($value) ? esc($value) : '
' . esc(print_r($value, true)) . '
'; - } - } - - foreach ($request->getGet() as $name => $value) - { - $data['vars']['get'][esc($name)] = is_array($value) ? '
' . esc(print_r($value, true)) . '
' : esc($value); - } - - foreach ($request->getPost() as $name => $value) - { - $data['vars']['post'][esc($name)] = is_array($value) ? '
' . esc(print_r($value, true)) . '
' : esc($value); - } - - foreach ($request->getHeaders() as $value) - { - if (empty($value)) - { - continue; - } - - if (! is_array($value)) - { - $value = [$value]; - } - - foreach ($value as $h) - { - $data['vars']['headers'][esc($h->getName())] = esc($h->getValueLine()); - } - } - - foreach ($request->getCookie() as $name => $value) - { - $data['vars']['cookies'][esc($name)] = esc($value); - } - - $data['vars']['request'] = ($request->isSecure() ? 'HTTPS' : 'HTTP') . '/' . $request->getProtocolVersion(); - - $data['vars']['response'] = [ - 'statusCode' => $response->getStatusCode(), - 'reason' => esc($response->getReason()), - 'contentType' => esc($response->getHeaderLine('content-type')), - ]; - - $data['config'] = \CodeIgniter\Debug\Toolbar\Collectors\Config::display(); - - if ($response->CSP !== null) - { - $response->CSP->addImageSrc('data:'); - } - - return json_encode($data); - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - - /** - * Called within the view to display the timeline itself. - * - * @param array $collectors - * @param float $startTime - * @param integer $segmentCount - * @param integer $segmentDuration - * @param array $styles - * - * @return string - */ - protected function renderTimeline(array $collectors, float $startTime, int $segmentCount, int $segmentDuration, array &$styles): string - { - $displayTime = $segmentCount * $segmentDuration; - $rows = $this->collectTimelineData($collectors); - $output = ''; - $styleCount = 0; - - foreach ($rows as $row) - { - $output .= ''; - $output .= "{$row['name']}"; - $output .= "{$row['component']}"; - $output .= "" . number_format($row['duration'] * 1000, 2) . ' ms'; - $output .= ""; - - $offset = ((((float) $row['start'] - $startTime) * 1000) / $displayTime) * 100; - $length = (((float) $row['duration'] * 1000) / $displayTime) * 100; - - $styles['debug-bar-timeline-' . $styleCount] = "left: {$offset}%; width: {$length}%;"; - $output .= ""; - $output .= ''; - $output .= ''; - - $styleCount ++; - } - - return $output; - } - - //-------------------------------------------------------------------- - - /** - * Returns a sorted array of timeline data arrays from the collectors. - * - * @param array $collectors - * - * @return array - */ - protected function collectTimelineData($collectors): array - { - $data = []; - - // Collect it - foreach ($collectors as $collector) - { - if (! $collector['hasTimelineData']) - { - continue; - } - - $data = array_merge($data, $collector['timelineData']); - } - - // Sort it - - return $data; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of data from all of the modules - * that should be displayed in the 'Vars' tab. - * - * @return array - */ - protected function collectVarData(): array - { - $data = []; - - foreach ($this->collectors as $collector) - { - if (! $collector->hasVarData()) - { - continue; - } - - $data = array_merge($data, $collector->getVarData()); - } - - return $data; - } - - //-------------------------------------------------------------------- - - /** - * Rounds a number to the nearest incremental value. - * - * @param float $number - * @param integer $increments - * - * @return float - */ - protected function roundTo(float $number, int $increments = 5): float - { - $increments = 1 / $increments; - - return (ceil($number * $increments) / $increments); - } - - //-------------------------------------------------------------------- - - /** - * Prepare for debugging.. - * - * @param RequestInterface $request - * @param ResponseInterface $response - * @global type $app - * @return type - */ - public function prepare(RequestInterface $request = null, ResponseInterface $response = null) - { - if (CI_DEBUG && ! is_cli()) - { - global $app; - - $request = $request ?? Services::request(); - $response = $response ?? Services::response(); - - // Disable the toolbar for downloads - if ($response instanceof DownloadResponse) - { - return; - } - - $toolbar = Services::toolbar(config(Toolbar::class)); - $stats = $app->getPerformanceStats(); - $data = $toolbar->run( - $stats['startTime'], - $stats['totalTime'], - $request, - $response - ); - - helper('filesystem'); - - // Updated to time() so we can get history - $time = time(); - - if (! is_dir(WRITEPATH . 'debugbar')) - { - mkdir(WRITEPATH . 'debugbar', 0777); - } - - write_file(WRITEPATH . 'debugbar/' . 'debugbar_' . $time . '.json', $data, 'w+'); - - $format = $response->getHeaderLine('content-type'); - - // Non-HTML formats should not include the debugbar - // then we send headers saying where to find the debug data - // for this response - if ($request->isAJAX() || strpos($format, 'html') === false) - { - $response->setHeader('Debugbar-Time', "$time") - ->setHeader('Debugbar-Link', site_url("?debugbar_time={$time}")) - ->getBody(); - - return; - } - - $script = PHP_EOL - . '' - . '' - . '' - . PHP_EOL; - - if (strpos($response->getBody(), '') !== false) - { - $response->setBody( - str_replace('', '' . $script, $response->getBody()) - ); - - return; - } - - $response->appendBody($script); - } - } - - //-------------------------------------------------------------------- - - /** - * Inject debug toolbar into the response. - */ - public function respond() - { - if (ENVIRONMENT === 'testing') - { - return; - } - - // @codeCoverageIgnoreStart - $request = Services::request(); - - // If the request contains '?debugbar then we're - // simply returning the loading script - if ($request->getGet('debugbar') !== null) - { - // Let the browser know that we are sending javascript - header('Content-Type: application/javascript'); - - ob_start(); - include($this->config->viewsPath . 'toolbarloader.js.php'); - $output = ob_get_clean(); - - exit($output); - } - - // Otherwise, if it includes ?debugbar_time, then - // we should return the entire debugbar. - if ($request->getGet('debugbar_time')) - { - helper('security'); - - // Negotiate the content-type to format the output - $format = $request->negotiate('media', [ - 'text/html', - 'application/json', - 'application/xml', - ]); - $format = explode('/', $format)[1]; - - $file = sanitize_filename('debugbar_' . $request->getGet('debugbar_time')); - $filename = WRITEPATH . 'debugbar/' . $file . '.json'; - - // Show the toolbar - if (is_file($filename)) - { - $contents = $this->format(file_get_contents($filename), $format); - exit($contents); - } - - // File was not written or do not exists - http_response_code(404); - exit; // Exit here is needed to avoid load the index page - } - // @codeCoverageIgnoreEnd - } - - /** - * Format output - * - * @param string $data JSON encoded Toolbar data - * @param string $format html, json, xml - * - * @return string - */ - protected function format(string $data, string $format = 'html'): string - { - $data = json_decode($data, true); - - if ($this->config->maxHistory !== 0) - { - $history = new History(); - $history->setFiles( - Services::request()->getGet('debugbar_time'), - $this->config->maxHistory - ); - - $data['collectors'][] = $history->getAsArray(); - } - - $output = ''; - - switch ($format) - { - case 'html': - $data['styles'] = []; - extract($data); - $parser = Services::parser($this->config->viewsPath, null, false); - ob_start(); - include($this->config->viewsPath . 'toolbar.tpl.php'); - $output = ob_get_clean(); - break; - case 'json': - $formatter = new JSONFormatter(); - $output = $formatter->format($data); - break; - case 'xml': - $formatter = new XMLFormatter; - $output = $formatter->format($data); - break; - } - - return $output; - } - -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/BaseCollector.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/BaseCollector.php deleted file mode 100644 index a403b4c..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/BaseCollector.php +++ /dev/null @@ -1,318 +0,0 @@ -title)); - } - - return $this->title; - } - - //-------------------------------------------------------------------- - - /** - * Returns any information that should be shown next to the title. - * - * @return string - */ - public function getTitleDetails(): string - { - return ''; - } - - //-------------------------------------------------------------------- - - /** - * Does this collector need it's own tab? - * - * @return boolean - */ - public function hasTabContent(): bool - { - return (bool) $this->hasTabContent; - } - - //-------------------------------------------------------------------- - - /** - * Does this collector have a label? - * - * @return boolean - */ - public function hasLabel(): bool - { - return (bool) $this->hasLabel; - } - - //-------------------------------------------------------------------- - - /** - * Does this collector have information for the timeline? - * - * @return boolean - */ - public function hasTimelineData(): bool - { - return (bool) $this->hasTimeline; - } - - //-------------------------------------------------------------------- - - /** - * Grabs the data for the timeline, properly formatted, - * or returns an empty array. - * - * @return array - */ - public function timelineData(): array - { - if (! $this->hasTimeline) - { - return []; - } - - return $this->formatTimelineData(); - } - - //-------------------------------------------------------------------- - - /** - * Does this Collector have data that should be shown in the - * 'Vars' tab? - * - * @return boolean - */ - public function hasVarData(): bool - { - return (bool) $this->hasVarData; - } - - //-------------------------------------------------------------------- - - /** - * Gets a collection of data that should be shown in the 'Vars' tab. - * The format is an array of sections, each with their own array - * of key/value pairs: - * - * $data = [ - * 'section 1' => [ - * 'foo' => 'bar, - * 'bar' => 'baz' - * ], - * 'section 2' => [ - * 'foo' => 'bar, - * 'bar' => 'baz' - * ], - * ]; - * - * @return null - */ - public function getVarData() - { - return null; - } - - //-------------------------------------------------------------------- - - /** - * Child classes should implement this to return the timeline data - * formatted for correct usage. - * - * Timeline data should be formatted into arrays that look like: - * - * [ - * 'name' => 'Database::Query', - * 'component' => 'Database', - * 'start' => 10 // milliseconds - * 'duration' => 15 // milliseconds - * ] - * - * @return array - */ - protected function formatTimelineData(): array - { - return []; - } - - //-------------------------------------------------------------------- - - /** - * Returns the data of this collector to be formatted in the toolbar - * - * @return array|string - */ - public function display() - { - return []; - } - - //-------------------------------------------------------------------- - - /** - * Clean Path - * - * This makes nicer looking paths for the error output. - * - * @param string $file - * - * @return string - */ - public function cleanPath(string $file): string - { - return Exceptions::cleanPath($file); - } - - /** - * Gets the "badge" value for the button. - * - * @return null - */ - public function getBadgeValue() - { - return null; - } - - /** - * Does this collector have any data collected? - * - * If not, then the toolbar button won't get shown. - * - * @return boolean - */ - public function isEmpty(): bool - { - return false; - } - - /** - * Returns the HTML to display the icon. Should either - * be SVG, or a base-64 encoded. - * - * Recommended dimensions are 24px x 24px - * - * @return string - */ - public function icon(): string - { - return ''; - } - - /** - * Return settings as an array. - * - * @return array - */ - public function getAsArray(): array - { - return [ - 'title' => $this->getTitle(), - 'titleSafe' => $this->getTitle(true), - 'titleDetails' => $this->getTitleDetails(), - 'display' => $this->display(), - 'badgeValue' => $this->getBadgeValue(), - 'isEmpty' => $this->isEmpty(), - 'hasTabContent' => $this->hasTabContent(), - 'hasLabel' => $this->hasLabel(), - 'icon' => $this->icon(), - 'hasTimelineData' => $this->hasTimelineData(), - 'timelineData' => $this->timelineData(), - ]; - } - -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Config.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Config.php deleted file mode 100644 index 82ef634..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Config.php +++ /dev/null @@ -1,71 +0,0 @@ - CodeIgniter::CI_VERSION, - 'phpVersion' => phpversion(), - 'phpSAPI' => php_sapi_name(), - 'environment' => ENVIRONMENT, - 'baseURL' => $config->baseURL, - 'timezone' => app_timezone(), - 'locale' => Services::request()->getLocale(), - 'cspEnabled' => $config->CSPEnabled, - ]; - } -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Database.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Database.php deleted file mode 100644 index 00aa740..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Database.php +++ /dev/null @@ -1,278 +0,0 @@ -connections = \Config\Database::getConnections(); - } - - //-------------------------------------------------------------------- - - /** - * The static method used during Events to collect - * data. - * - * @param \CodeIgniter\Database\Query $query - * - * @internal param $ array \CodeIgniter\Database\Query - */ - public static function collect(Query $query) - { - $config = config('Toolbar'); - - // Provide default in case it's not set - $max = $config->maxQueries ?: 100; - - if (count(static::$queries) < $max) - { - static::$queries[] = $query; - } - } - - //-------------------------------------------------------------------- - - /** - * Returns timeline data formatted for the toolbar. - * - * @return array The formatted data or an empty array. - */ - protected function formatTimelineData(): array - { - $data = []; - - foreach ($this->connections as $alias => $connection) - { - // Connection Time - $data[] = [ - 'name' => 'Connecting to Database: "' . $alias . '"', - 'component' => 'Database', - 'start' => $connection->getConnectStart(), - 'duration' => $connection->getConnectDuration(), - ]; - } - - foreach (static::$queries as $query) - { - $data[] = [ - 'name' => 'Query', - 'component' => 'Database', - 'start' => $query->getStartTime(true), - 'duration' => $query->getDuration(), - ]; - } - - return $data; - } - - //-------------------------------------------------------------------- - - /** - * Returns the data of this collector to be formatted in the toolbar - * - * @return array - */ - public function display(): array - { - // Key words we want bolded - $highlight = [ - 'SELECT', - 'DISTINCT', - 'FROM', - 'WHERE', - 'AND', - 'LEFT JOIN', - 'RIGHT JOIN', - 'JOIN', - 'ORDER BY', - 'GROUP BY', - 'LIMIT', - 'INSERT', - 'INTO', - 'VALUES', - 'UPDATE', - 'OR ', - 'HAVING', - 'OFFSET', - 'NOT IN', - 'IN', - 'LIKE', - 'NOT LIKE', - 'COUNT', - 'MAX', - 'MIN', - 'ON', - 'AS', - 'AVG', - 'SUM', - '(', - ')', - ]; - - $data = [ - 'queries' => [], - ]; - - foreach (static::$queries as $query) - { - $sql = $query->getQuery(); - - foreach ($highlight as $term) - { - $sql = str_replace($term, "{$term}", $sql); - } - - $data['queries'][] = [ - 'duration' => ($query->getDuration(5) * 1000) . ' ms', - 'sql' => $sql, - ]; - } - - return $data; - } - - //-------------------------------------------------------------------- - - /** - * Gets the "badge" value for the button. - * - * @return integer - */ - public function getBadgeValue(): int - { - return count(static::$queries); - } - - //-------------------------------------------------------------------- - - /** - * Information to be displayed next to the title. - * - * @return string The number of queries (in parentheses) or an empty string. - */ - public function getTitleDetails(): string - { - return '(' . count(static::$queries) . ' Queries across ' . ($countConnection = count($this->connections)) . ' Connection' . - ($countConnection > 1 ? 's' : '') . ')'; - } - - //-------------------------------------------------------------------- - - /** - * Does this collector have any data collected? - * - * @return boolean - */ - public function isEmpty(): bool - { - return empty(static::$queries); - } - - //-------------------------------------------------------------------- - - /** - * Display the icon. - * - * Icon from https://icons8.com - 1em package - * - * @return string - */ - public function icon(): string - { - return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADMSURBVEhLY6A3YExLSwsA4nIycQDIDIhRWEBqamo/UNF/SjDQjF6ocZgAKPkRiFeEhoYyQ4WIBiA9QAuWAPEHqBAmgLqgHcolGQD1V4DMgHIxwbCxYD+QBqcKINseKo6eWrBioPrtQBq/BcgY5ht0cUIYbBg2AJKkRxCNWkDQgtFUNJwtABr+F6igE8olGQD114HMgHIxAVDyAhA/AlpSA8RYUwoeXAPVex5qHCbIyMgwBCkAuQJIY00huDBUz/mUlBQDqHGjgBjAwAAACexpph6oHSQAAAAASUVORK5CYII='; - } - -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Events.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Events.php deleted file mode 100644 index 41c9f00..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Events.php +++ /dev/null @@ -1,187 +0,0 @@ -viewer = Services::renderer(); - } - - //-------------------------------------------------------------------- - - /** - * Child classes should implement this to return the timeline data - * formatted for correct usage. - * - * @return array - */ - protected function formatTimelineData(): array - { - $data = []; - - $rows = $this->viewer->getPerformanceData(); - - foreach ($rows as $info) - { - $data[] = [ - 'name' => 'View: ' . $info['view'], - 'component' => 'Views', - 'start' => $info['start'], - 'duration' => $info['end'] - $info['start'], - ]; - } - - return $data; - } - - //-------------------------------------------------------------------- - - /** - * Returns the data of this collector to be formatted in the toolbar - * - * @return array - */ - public function display(): array - { - $data = [ - 'events' => [], - ]; - - foreach (\CodeIgniter\Events\Events::getPerformanceLogs() as $row) - { - $key = $row['event']; - - if (! array_key_exists($key, $data['events'])) - { - $data['events'][$key] = [ - 'event' => $key, - 'duration' => number_format(($row['end'] - $row['start']) * 1000, 2), - 'count' => 1, - ]; - - continue; - } - - $data['events'][$key]['duration'] += number_format(($row['end'] - $row['start']) * 1000, 2); - $data['events'][$key]['count']++; - } - - return $data; - } - - //-------------------------------------------------------------------- - - /** - * Gets the "badge" value for the button. - * - * @return integer - */ - public function getBadgeValue(): int - { - return count(\CodeIgniter\Events\Events::getPerformanceLogs()); - } - - //-------------------------------------------------------------------- - - /** - * Display the icon. - * - * Icon from https://icons8.com - 1em package - * - * @return string - */ - public function icon(): string - { - return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEASURBVEhL7ZXNDcIwDIVTsRBH1uDQDdquUA6IM1xgCA6MwJUN2hk6AQzAz0vl0ETUxC5VT3zSU5w81/mRMGZysixbFEVR0jSKNt8geQU9aRpFmp/keX6AbjZ5oB74vsaN5lSzA4tLSjpBFxsjeSuRy4d2mDdQTWU7YLbXTNN05mKyovj5KL6B7q3hoy3KwdZxBlT+Ipz+jPHrBqOIynZgcZonoukb/0ckiTHqNvDXtXEAaygRbaB9FvUTjRUHsIYS0QaSp+Dw6wT4hiTmYHOcYZsdLQ2CbXa4ftuuYR4x9vYZgdb4vsFYUdmABMYeukK9/SUme3KMFQ77+Yfzh8eYF8+orDuDWU5LAAAAAElFTkSuQmCC'; - } -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Files.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Files.php deleted file mode 100644 index 36b0132..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Files.php +++ /dev/null @@ -1,151 +0,0 @@ -cleanPath($file); - - if (strpos($path, 'SYSTEMPATH') !== false) - { - $coreFiles[] = [ - 'name' => basename($file), - 'path' => $path, - ]; - } - else - { - $userFiles[] = [ - 'name' => basename($file), - 'path' => $path, - ]; - } - } - - sort($userFiles); - sort($coreFiles); - - return [ - 'coreFiles' => $coreFiles, - 'userFiles' => $userFiles, - ]; - } - - //-------------------------------------------------------------------- - - /** - * Displays the number of included files as a badge in the tab button. - * - * @return integer - */ - public function getBadgeValue(): int - { - return count(get_included_files()); - } - - //-------------------------------------------------------------------- - - /** - * Display the icon. - * - * Icon from https://icons8.com - 1em package - * - * @return string - */ - public function icon(): string - { - return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGBSURBVEhL7ZQ9S8NQGIVTBQUncfMfCO4uLgoKbuKQOWg+OkXERRE1IAXrIHbVDrqIDuLiJgj+gro7S3dnpfq88b1FMTE3VZx64HBzzvvZWxKnj15QCcPwCD5HUfSWR+JtzgmtsUcQBEva5IIm9SwSu+95CAWbUuy67qBa32ByZEDpIaZYZSZMjjQuPcQUq8yEyYEb8FSerYeQVGbAFzJkX1PyQWLhgCz0BxTCekC1Wp0hsa6yokzhed4oje6Iz6rlJEkyIKfUEFtITVtQdAibn5rMyaYsMS+a5wTv8qeXMhcU16QZbKgl3hbs+L4/pnpdc87MElZgq10p5DxGdq8I7xrvUWUKvG3NbSK7ubngYzdJwSsF7TiOh9VOgfcEz1UayNe3JUPM1RWC5GXYgTfc75B4NBmXJnAtTfpABX0iPvEd9ezALwkplCFXcr9styiNOKc1RRZpaPM9tcqBwlWzGY1qPL9wjqRBgF5BH6j8HWh2S7MHlX8PrmbK+k/8PzjOOzx1D3i1pKTTAAAAAElFTkSuQmCC'; - } -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/History.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/History.php deleted file mode 100644 index 3112e07..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/History.php +++ /dev/null @@ -1,183 +0,0 @@ -= 0 && $counter > $limit) - { - unlink($filename); - continue; - } - - // Get the contents of this specific history request - $contents = file_get_contents($filename); - - $contents = @json_decode($contents); - if (json_last_error() === JSON_ERROR_NONE) - { - preg_match_all('/\d+/', $filename, $time); - $time = (int)end($time[0]); - - // Debugbar files shown in History Collector - $files[] = [ - 'time' => $time, - 'datetime' => date('Y-m-d H:i:s', $time), - 'active' => $time === $current, - 'status' => $contents->vars->response->statusCode, - 'method' => $contents->method, - 'url' => $contents->url, - 'isAJAX' => $contents->isAJAX ? 'Yes' : 'No', - 'contentType' => $contents->vars->response->contentType, - ]; - } - } - - $this->files = $files; - } - - //-------------------------------------------------------------------- - - /** - * Returns the data of this collector to be formatted in the toolbar - * - * @return array - */ - public function display(): array - { - return ['files' => $this->files]; - } - - //-------------------------------------------------------------------- - - /** - * Displays the number of included files as a badge in the tab button. - * - * @return integer - */ - public function getBadgeValue(): int - { - return count($this->files); - } - - /** - * Return true if there are no history files. - * - * @return boolean - */ - public function isEmpty(): bool - { - return empty($this->files); - } - - //-------------------------------------------------------------------- - - /** - * Display the icon. - * - * Icon from https://icons8.com - 1em package - * - * @return string - */ - public function icon(): string - { - return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJySURBVEhL3ZU7aJNhGIVTpV6i4qCIgkIHxcXLErS4FBwUFNwiCKGhuTYJGaIgnRoo4qRu6iCiiIuIXXTTIkIpuqoFwaGgonUQlC5KafU5ycmNP0lTdPLA4fu+8573/a4/f6hXpFKpwUwmc9fDfweKbk+n07fgEv33TLSbtt/hvwNFT1PsG/zdTE0Gp+GFfD6/2fbVIxqNrqPIRbjg4t/hY8aztcngfDabHXbKyiiXy2vcrcPH8oDCry2FKDrA+Ar6L01E/ypyXzXaARjDGGcoeNxSDZXE0dHRA5VRE5LJ5CFy5jzJuOX2wHRHRnjbklZ6isQ3tIctBaAd4vlK3jLtkOVWqABBXd47jGHLmjTmSScttQV5J+SjfcUweFQEbsjAas5aqoCLXutJl7vtQsAzpRowYqkBinyCC8Vicb2lOih8zoldd0F8RD7qTFiqAnGrAy8stUAvi/hbqDM+YzkAFrLPdR5ZqoLXsd+Bh5YCIH7JniVdquUWxOPxDfboHhrI5XJ7HHhiqQXox+APe/Qk64+gGYVCYZs8cMpSFQj9JOoFzVqqo7k4HIvFYpscCoAjOmLffUsNUGRaQUwDlmofUa34ecsdgXdcXo4wbakBgiUFafXJV8A4DJ/2UrxUKm3E95H8RbjLcgOJRGILhnmCP+FBy5XvwN2uIPcy1AJvWgqC4xm2aU4Xb3lF4I+Tpyf8hRe5w3J7YLymSeA8Z3nSclv4WLRyFdfOjzrUFX0klJUEtZtntCNc+F69cz/FiDzEPtjzmcUMOr83kDQEX6pAJxJfpL3OX22n01YN7SZCoQnaSdoZ+Jz+PZihH3wt/xlCoT9M6nEtmRSPCQAAAABJRU5ErkJggg=='; - } -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Logs.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Logs.php deleted file mode 100644 index ed279c7..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Logs.php +++ /dev/null @@ -1,139 +0,0 @@ - $this->collectLogs(), - ]; - } - - //-------------------------------------------------------------------- - - /** - * Does this collector actually have any data to display? - * - * @return boolean - */ - public function isEmpty(): bool - { - $this->collectLogs(); - - return empty($this->data); - } - - //-------------------------------------------------------------------- - - /** - * Display the icon. - * - * Icon from https://icons8.com - 1em package - * - * @return string - */ - public function icon(): string - { - return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACYSURBVEhLYxgFJIHU1FSjtLS0i0D8AYj7gEKMEBkqAaAFF4D4ERCvAFrwH4gDoFIMKSkpFkB+OTEYqgUTACXfA/GqjIwMQyD9H2hRHlQKJFcBEiMGQ7VgAqCBvUgK32dmZspCpagGGNPT0/1BLqeF4bQHQJePpiIwhmrBBEADR1MRfgB0+WgqAmOoFkwANHA0FY0CUgEDAwCQ0PUpNB3kqwAAAABJRU5ErkJggg=='; - } - - //-------------------------------------------------------------------- - - /** - * Ensures the data has been collected. - */ - protected function collectLogs() - { - if (! is_null($this->data)) - { - return $this->data; - } - - return $this->data = Services::logger(true)->logCache ?? []; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Routes.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Routes.php deleted file mode 100644 index f75374d..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Routes.php +++ /dev/null @@ -1,202 +0,0 @@ -getMatchedRoute(); - - // Get our parameters - // Closure routes - if (is_callable($router->controllerName())) - { - $method = new \ReflectionFunction($router->controllerName()); - } - else - { - try - { - $method = new \ReflectionMethod($router->controllerName(), $router->methodName()); - } - catch (\ReflectionException $e) - { - // If we're here, the method doesn't exist - // and is likely calculated in _remap. - $method = new \ReflectionMethod($router->controllerName(), '_remap'); - } - } - - $rawParams = $method->getParameters(); - - $params = []; - foreach ($rawParams as $key => $param) - { - $params[] = [ - 'name' => $param->getName(), - 'value' => $router->params()[$key] ?? - '<empty> | default: ' . var_export($param->isDefaultValueAvailable() ? $param->getDefaultValue() : null, true), - ]; - } - - $matchedRoute = [ - [ - 'directory' => $router->directory(), - 'controller' => $router->controllerName(), - 'method' => $router->methodName(), - 'paramCount' => count($router->params()), - 'truePCount' => count($params), - 'params' => $params ?? [], - ], - ]; - - /* - * Defined Routes - */ - $routes = []; - $methods = [ - 'get', - 'head', - 'post', - 'patch', - 'put', - 'delete', - 'options', - 'trace', - 'connect', - 'cli', - ]; - - foreach ($methods as $method) - { - $raw = $rawRoutes->getRoutes($method); - - foreach ($raw as $route => $handler) - { - // filter for strings, as callbacks aren't displayable - if (is_string($handler)) - { - $routes[] = [ - 'method' => strtoupper($method), - 'route' => $route, - 'handler' => $handler, - ]; - } - } - } - - return [ - 'matchedRoute' => $matchedRoute, - 'routes' => $routes, - ]; - } - - //-------------------------------------------------------------------- - - /** - * Returns a count of all the routes in the system. - * - * @return integer - */ - public function getBadgeValue(): int - { - $rawRoutes = Services::routes(true); - - return count($rawRoutes->getRoutes()); - } - - //-------------------------------------------------------------------- - - /** - * Display the icon. - * - * Icon from https://icons8.com - 1em package - * - * @return string - */ - public function icon(): string - { - return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFDSURBVEhL7ZRNSsNQFIUjVXSiOFEcuQIHDpzpxC0IGYeE/BEInbWlCHEDLsSiuANdhKDjgm6ggtSJ+l25ldrmmTwIgtgDh/t37r1J+16cX0dRFMtpmu5pWAkrvYjjOB7AETzStBFW+inxu3KUJMmhludQpoflS1zXban4LYqiO224h6VLTHr8Z+z8EpIHFF9gG78nDVmW7UgTHKjsCyY98QP+pcq+g8Ku2s8G8X3f3/I8b038WZTp+bO38zxfFd+I6YY6sNUvFlSDk9CRhiAI1jX1I9Cfw7GG1UB8LAuwbU0ZwQnbRDeEN5qqBxZMLtE1ti9LtbREnMIuOXnyIf5rGIb7Wq8HmlZgwYBH7ORTcKH5E4mpjeGt9fBZcHE2GCQ3Vt7oTNPNg+FXLHnSsHkw/FR+Gg2bB8Ptzrst/v6C/wrH+QB+duli6MYJdQAAAABJRU5ErkJggg=='; - } -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Timers.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Timers.php deleted file mode 100644 index d6168c6..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Timers.php +++ /dev/null @@ -1,107 +0,0 @@ -getTimers(6); - - foreach ($rows as $name => $info) - { - if ($name === 'total_execution') - { - continue; - } - - $data[] = [ - 'name' => ucwords(str_replace('_', ' ', $name)), - 'component' => 'Timer', - 'start' => $info['start'], - 'duration' => $info['end'] - $info['start'], - ]; - } - - return $data; - } - -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Views.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Views.php deleted file mode 100644 index bf0c110..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Collectors/Views.php +++ /dev/null @@ -1,192 +0,0 @@ -viewer = Services::renderer(); - } - - //-------------------------------------------------------------------- - - /** - * Child classes should implement this to return the timeline data - * formatted for correct usage. - * - * @return array - */ - protected function formatTimelineData(): array - { - $data = []; - - $rows = $this->viewer->getPerformanceData(); - - foreach ($rows as $info) - { - $data[] = [ - 'name' => 'View: ' . $info['view'], - 'component' => 'Views', - 'start' => $info['start'], - 'duration' => $info['end'] - $info['start'], - ]; - } - - return $data; - } - - //-------------------------------------------------------------------- - - /** - * Gets a collection of data that should be shown in the 'Vars' tab. - * The format is an array of sections, each with their own array - * of key/value pairs: - * - * $data = [ - * 'section 1' => [ - * 'foo' => 'bar, - * 'bar' => 'baz' - * ], - * 'section 2' => [ - * 'foo' => 'bar, - * 'bar' => 'baz' - * ], - * ]; - * - * @return array - */ - public function getVarData(): array - { - return [ - 'View Data' => $this->viewer->getData(), - ]; - } - - //-------------------------------------------------------------------- - - /** - * Returns a count of all views. - * - * @return integer - */ - public function getBadgeValue(): int - { - return count($this->viewer->getPerformanceData()); - } - - /** - * Display the icon. - * - * Icon from https://icons8.com - 1em package - * - * @return string - */ - public function icon(): string - { - return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADeSURBVEhL7ZSxDcIwEEWNYA0YgGmgyAaJLTcUaaBzQQEVjMEabBQxAdw53zTHiThEovGTfnE/9rsoRUxhKLOmaa6Uh7X2+UvguLCzVxN1XW9x4EYHzik033Hp3X0LO+DaQG8MDQcuq6qao4qkHuMgQggLvkPLjqh00ZgFDBacMJYFkuwFlH1mshdkZ5JPJERA9JpI6xNCBESvibQ+IURA9JpI6xNCBESvibQ+IURA9DTsuHTOrVFFxixgB/eUFlU8uKJ0eDBFOu/9EvoeKnlJS2/08Tc8NOwQ8sIfMeYFjqKDjdU2sp4AAAAASUVORK5CYII='; - } -} diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_config.tpl b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_config.tpl deleted file mode 100644 index 4247e81..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_config.tpl +++ /dev/null @@ -1,48 +0,0 @@ -

- Read the CodeIgniter docs... -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CodeIgniter Version:{ ciVersion }
PHP Version:{ phpVersion }
PHP SAPI:{ phpSAPI }
Environment:{ environment }
Base URL: - { if $baseURL == '' } -
- The $baseURL should always be set manually to prevent possible URL personification from external parties. -
- { else } - { baseURL } - { endif } -
TimeZone:{ timezone }
Locale:{ locale }
Content Security Policy Enabled:{ if $cspEnabled } Yes { else } No { endif }
diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_database.tpl b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_database.tpl deleted file mode 100644 index b5cf1a4..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_database.tpl +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - {queries} - - - - - {/queries} - -
TimeQuery String
{duration}{! sql !}
diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_events.tpl b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_events.tpl deleted file mode 100644 index 88d732f..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_events.tpl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - {events} - - - - - - {/events} - -
TimeEvent NameTimes Called
{ duration } ms{event}{count}
diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_files.tpl b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_files.tpl deleted file mode 100644 index 9c992ab..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_files.tpl +++ /dev/null @@ -1,16 +0,0 @@ - - - {userFiles} - - - - - {/userFiles} - {coreFiles} - - - - - {/coreFiles} - -
{name}{path}
{name}{path}
diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_history.tpl b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_history.tpl deleted file mode 100644 index 9db00ec..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_history.tpl +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - {files} - - - - - - - - - - {/files} - -
ActionDatetimeStatusMethodURLContent-TypeIs AJAX?
- - {datetime}{status}{method}{url}{contentType}{isAJAX}
diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_logs.tpl b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_logs.tpl deleted file mode 100644 index 7c80d84..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_logs.tpl +++ /dev/null @@ -1,20 +0,0 @@ -{ if $logs == [] } -

Nothing was logged. If you were expecting logged items, ensure that LoggerConfig file has the correct threshold set.

-{ else } - - - - - - - - - {logs} - - - - - {/logs} - -
SeverityMessage
{level}{msg}
-{ endif } diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_routes.tpl b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_routes.tpl deleted file mode 100644 index e277046..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/_routes.tpl +++ /dev/null @@ -1,52 +0,0 @@ -

Matched Route

- - - - {matchedRoute} - - - - - - - - - - - - - - - - - {params} - - - - - {/params} - {/matchedRoute} - -
Directory:{directory}
Controller:{controller}
Method:{method}
Params:{paramCount} / {truePCount}
{name}{value}
- - -

Defined Routes

- - - - - - - - - - - {routes} - - - - - - {/routes} - -
MethodRouteHandler
{method}{route}{handler}
diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbar.css b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbar.css deleted file mode 100644 index e2abb4c..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbar.css +++ /dev/null @@ -1,609 +0,0 @@ -/* CodeIgniter 4 - Debug bar - ============================================================================ */ -/* Forum: https://forum.codeigniter.com - * Github: https://github.com/codeigniter4/codeigniter4 - * Slack: https://codeigniterchat.slack.com - * Website: https://codeigniter.com - */ -#debug-icon { - bottom: 0; - position: fixed; - right: 0; - z-index: 10000; - height: 36px; - width: 36px; - margin: 0px; - padding: 0px; - clear: both; - text-align: center; } - #debug-icon a svg { - margin: 8px; - max-width: 20px; - max-height: 20px; } - #debug-icon.fixed-top { - bottom: auto; - top: 0; } - #debug-icon .debug-bar-ndisplay { - display: none; } - -#debug-bar { - bottom: 0; - left: 0; - position: fixed; - right: 0; - z-index: 10000; - height: 36px; - line-height: 36px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; - font-size: 16px; - font-weight: 400; } - #debug-bar h1 { - bottom: 0; - display: inline-block; - font-size: 14px; - font-weight: normal; - margin: 0 16px 0 0; - padding: 0; - position: absolute; - right: 30px; - text-align: left; - top: 0; } - #debug-bar h2 { - font-size: 16px; - margin: 0; - padding: 5px 0 10px 0; } - #debug-bar h2 span { - font-size: 13px; } - #debug-bar h3 { - font-size: 12px; - font-weight: 200; - margin: 0 0 0 10px; - padding: 0; - text-transform: uppercase; } - #debug-bar p { - font-size: 12px; - margin: 0 0 0 15px; - padding: 0; } - #debug-bar a { - text-decoration: none; } - #debug-bar a:hover { - text-decoration: underline; } - #debug-bar button { - border: 1px solid; - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - cursor: pointer; - line-height: 15px; } - #debug-bar button:hover { - text-decoration: underline; } - #debug-bar table { - border-collapse: collapse; - font-size: 14px; - line-height: normal; - margin: 5px 10px 15px 10px; - width: calc(100% - 10px); } - #debug-bar table strong { - font-weight: 500; } - #debug-bar table th { - display: table-cell; - font-weight: 600; - padding-bottom: 0.7em; - text-align: left; } - #debug-bar table tr { - border: none; } - #debug-bar table td { - border: none; - display: table-cell; - margin: 0; - text-align: left; } - #debug-bar table td:first-child { - max-width: 20%; } - #debug-bar table td:first-child.narrow { - width: 7em; } - #debug-bar .toolbar { - display: block; - overflow: hidden; - overflow-y: auto; - padding: 0 12px 0 12px; - /* give room for OS X scrollbar */ - white-space: nowrap; - z-index: 10000; } - #debug-bar.fixed-top { - bottom: auto; - top: 0; } - #debug-bar.fixed-top .tab { - bottom: auto; - top: 36px; } - #debug-bar #toolbar-position a, - #debug-bar #toolbar-theme a { - float: left; - padding: 0 6px; } - #debug-bar #toolbar-position a:hover, - #debug-bar #toolbar-theme a:hover { - text-decoration: none; } - #debug-bar #debug-bar-link { - bottom: 0; - display: inline-block; - font-size: 16px; - line-height: 36px; - padding: 6px; - position: absolute; - right: 10px; - top: 0; - width: 24px; } - #debug-bar .ci-label { - display: inline-block; - font-size: 14px; - vertical-align: baseline; } - #debug-bar .ci-label:hover { - cursor: pointer; } - #debug-bar .ci-label a { - color: inherit; - display: block; - letter-spacing: normal; - padding: 0 10px; - text-decoration: none; } - #debug-bar .ci-label img { - clear: left; - display: inline-block; - float: left; - margin: 6px 3px 6px 0; - width: 16px !important; - } - #debug-bar .ci-label .badge { - border-radius: 12px; - -moz-border-radius: 12px; - -webkit-border-radius: 12px; - display: inline-block; - font-size: 75%; - font-weight: bold; - line-height: 12px; - margin-left: 5px; - padding: 2px 5px; - text-align: center; - vertical-align: baseline; - white-space: nowrap; } - #debug-bar .tab { - bottom: 35px; - display: none; - left: 0; - max-height: 62%; - overflow: hidden; - overflow-y: auto; - padding: 1em 2em; - position: fixed; - right: 0; - z-index: 9999; } - #debug-bar .timeline { - margin-left: 0; - width: 100%; } - #debug-bar .timeline th { - border-left: 1px solid; - font-size: 12px; - font-weight: 200; - padding: 5px 5px 10px 5px; - position: relative; - text-align: left; } - #debug-bar .timeline th:first-child { - border-left: 0; } - #debug-bar .timeline td { - border-left: 1px solid; - padding: 5px; - position: relative; } - #debug-bar .timeline td:first-child { - border-left: 0; } - #debug-bar .timeline .timer { - border-radius: 4px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - display: inline-block; - padding: 5px; - position: absolute; - top: 30%; } - #debug-bar .route-params, - #debug-bar .route-params-item { - vertical-align: top; } - #debug-bar .route-params td:first-child, - #debug-bar .route-params-item td:first-child { - font-style: italic; - padding-left: 1em; - text-align: right; } - -.debug-view.show-view { - border: 1px solid; - margin: 4px; } - -.debug-view-path { - font-family: monospace; - font-size: 12px; - letter-spacing: normal; - min-height: 16px; - padding: 2px; - text-align: left; } - -.show-view .debug-view-path { - display: block !important; } - -@media screen and (max-width: 1024px) { - .hide-sm { - display: none !important; } } -#debug-icon { - background-color: #FFFFFF; - box-shadow: 0 0 4px #DFDFDF; - -moz-box-shadow: 0 0 4px #DFDFDF; - -webkit-box-shadow: 0 0 4px #DFDFDF; } - #debug-icon a:active, #debug-icon a:link, #debug-icon a:visited { - color: #DD8615; } - -#debug-bar { - background-color: #FFFFFF; - color: #434343; } - #debug-bar h1, - #debug-bar h2, - #debug-bar h3, - #debug-bar p, - #debug-bar a, - #debug-bar button, - #debug-bar table, - #debug-bar thead, - #debug-bar tr, - #debug-bar td, - #debug-bar button, - #debug-bar .toolbar { - background-color: transparent; - color: #434343; } - #debug-bar button { - background-color: #FFFFFF; } - #debug-bar table strong { - color: #FDC894; } - #debug-bar table tbody tr:hover { - background-color: #DFDFDF; } - #debug-bar table tbody tr.current { - background-color: #FDC894; } - #debug-bar table tbody tr.current:hover td { - background-color: #DD4814; - color: #FFFFFF; } - #debug-bar .toolbar { - background-color: #FFFFFF; - box-shadow: 0 0 4px #DFDFDF; - -moz-box-shadow: 0 0 4px #DFDFDF; - -webkit-box-shadow: 0 0 4px #DFDFDF; } - #debug-bar .toolbar img { - filter: brightness(0) invert(0.4); } - #debug-bar.fixed-top .toolbar { - box-shadow: 0 0 4px #DFDFDF; - -moz-box-shadow: 0 0 4px #DFDFDF; - -webkit-box-shadow: 0 0 4px #DFDFDF; } - #debug-bar.fixed-top .tab { - box-shadow: 0 1px 4px #DFDFDF; - -moz-box-shadow: 0 1px 4px #DFDFDF; - -webkit-box-shadow: 0 1px 4px #DFDFDF; } - #debug-bar .muted { - color: #434343; } - #debug-bar .muted td { - color: #DFDFDF; } - #debug-bar .muted:hover td { - color: #434343; } - #debug-bar #toolbar-position, - #debug-bar #toolbar-theme { - filter: brightness(0) invert(0.6); } - #debug-bar .ci-label.active { - background-color: #DFDFDF; } - #debug-bar .ci-label:hover { - background-color: #DFDFDF; } - #debug-bar .ci-label .badge { - background-color: #5BC0DE; - color: #FFFFFF; } - #debug-bar .tab { - background-color: #FFFFFF; - box-shadow: 0 -1px 4px #DFDFDF; - -moz-box-shadow: 0 -1px 4px #DFDFDF; - -webkit-box-shadow: 0 -1px 4px #DFDFDF; } - #debug-bar .timeline th, - #debug-bar .timeline td { - border-color: #DFDFDF; } - #debug-bar .timeline .timer { - background-color: #DD8615; } - -.debug-view.show-view { - border-color: #DD8615; } - -.debug-view-path { - background-color: #FDC894; - color: #434343; } - -@media (prefers-color-scheme: dark) { - #debug-icon { - background-color: #252525; - box-shadow: 0 0 4px #DFDFDF; - -moz-box-shadow: 0 0 4px #DFDFDF; - -webkit-box-shadow: 0 0 4px #DFDFDF; } - #debug-icon a:active, #debug-icon a:link, #debug-icon a:visited { - color: #DD8615; } - - #debug-bar { - background-color: #252525; - color: #DFDFDF; } - #debug-bar h1, - #debug-bar h2, - #debug-bar h3, - #debug-bar p, - #debug-bar a, - #debug-bar button, - #debug-bar table, - #debug-bar thead, - #debug-bar tr, - #debug-bar td, - #debug-bar button, - #debug-bar .toolbar { - background-color: transparent; - color: #DFDFDF; } - #debug-bar button { - background-color: #252525; } - #debug-bar table strong { - color: #FDC894; } - #debug-bar table tbody tr:hover { - background-color: #434343; } - #debug-bar table tbody tr.current { - background-color: #FDC894; } - #debug-bar table tbody tr.current td { - color: #252525; } - #debug-bar table tbody tr.current:hover td { - background-color: #DD4814; - color: #FFFFFF; } - #debug-bar .toolbar { - background-color: #434343; - box-shadow: 0 0 4px #434343; - -moz-box-shadow: 0 0 4px #434343; - -webkit-box-shadow: 0 0 4px #434343; } - #debug-bar .toolbar img { - filter: brightness(0) invert(1); } - #debug-bar.fixed-top .toolbar { - box-shadow: 0 0 4px #434343; - -moz-box-shadow: 0 0 4px #434343; - -webkit-box-shadow: 0 0 4px #434343; } - #debug-bar.fixed-top .tab { - box-shadow: 0 1px 4px #434343; - -moz-box-shadow: 0 1px 4px #434343; - -webkit-box-shadow: 0 1px 4px #434343; } - #debug-bar .muted { - color: #DFDFDF; } - #debug-bar .muted td { - color: #434343; } - #debug-bar .muted:hover td { - color: #DFDFDF; } - #debug-bar #toolbar-position, - #debug-bar #toolbar-theme { - filter: brightness(0) invert(0.6); } - #debug-bar .ci-label.active { - background-color: #252525; } - #debug-bar .ci-label:hover { - background-color: #252525; } - #debug-bar .ci-label .badge { - background-color: #5BC0DE; - color: #DFDFDF; } - #debug-bar .tab { - background-color: #252525; - box-shadow: 0 -1px 4px #434343; - -moz-box-shadow: 0 -1px 4px #434343; - -webkit-box-shadow: 0 -1px 4px #434343; } - #debug-bar .timeline th, - #debug-bar .timeline td { - border-color: #434343; } - #debug-bar .timeline .timer { - background-color: #DD8615; } - - .debug-view.show-view { - border-color: #DD8615; } - - .debug-view-path { - background-color: #FDC894; - color: #434343; } } -#toolbarContainer.dark #debug-icon { - background-color: #252525; - box-shadow: 0 0 4px #DFDFDF; - -moz-box-shadow: 0 0 4px #DFDFDF; - -webkit-box-shadow: 0 0 4px #DFDFDF; } - #toolbarContainer.dark #debug-icon a:active, #toolbarContainer.dark #debug-icon a:link, #toolbarContainer.dark #debug-icon a:visited { - color: #DD8615; } -#toolbarContainer.dark #debug-bar { - background-color: #252525; - color: #DFDFDF; } - #toolbarContainer.dark #debug-bar h1, - #toolbarContainer.dark #debug-bar h2, - #toolbarContainer.dark #debug-bar h3, - #toolbarContainer.dark #debug-bar p, - #toolbarContainer.dark #debug-bar a, - #toolbarContainer.dark #debug-bar button, - #toolbarContainer.dark #debug-bar table, - #toolbarContainer.dark #debug-bar thead, - #toolbarContainer.dark #debug-bar tr, - #toolbarContainer.dark #debug-bar td, - #toolbarContainer.dark #debug-bar button, - #toolbarContainer.dark #debug-bar .toolbar { - background-color: transparent; - color: #DFDFDF; } - #toolbarContainer.dark #debug-bar button { - background-color: #252525; } - #toolbarContainer.dark #debug-bar table strong { - color: #FDC894; } - #toolbarContainer.dark #debug-bar table tbody tr:hover { - background-color: #434343; } - #toolbarContainer.dark #debug-bar table tbody tr.current { - background-color: #FDC894; } - #toolbarContainer.dark #debug-bar table tbody tr.current td { - color: #252525; } - #toolbarContainer.dark #debug-bar table tbody tr.current:hover td { - background-color: #DD4814; - color: #FFFFFF; } - #toolbarContainer.dark #debug-bar .toolbar { - background-color: #434343; - box-shadow: 0 0 4px #434343; - -moz-box-shadow: 0 0 4px #434343; - -webkit-box-shadow: 0 0 4px #434343; } - #toolbarContainer.dark #debug-bar .toolbar img { - filter: brightness(0) invert(1); } - #toolbarContainer.dark #debug-bar.fixed-top .toolbar { - box-shadow: 0 0 4px #434343; - -moz-box-shadow: 0 0 4px #434343; - -webkit-box-shadow: 0 0 4px #434343; } - #toolbarContainer.dark #debug-bar.fixed-top .tab { - box-shadow: 0 1px 4px #434343; - -moz-box-shadow: 0 1px 4px #434343; - -webkit-box-shadow: 0 1px 4px #434343; } - #toolbarContainer.dark #debug-bar .muted { - color: #DFDFDF; } - #toolbarContainer.dark #debug-bar .muted td { - color: #434343; } - #toolbarContainer.dark #debug-bar .muted:hover td { - color: #DFDFDF; } - #toolbarContainer.dark #debug-bar #toolbar-position, - #toolbarContainer.dark #debug-bar #toolbar-theme { - filter: brightness(0) invert(0.6); } - #toolbarContainer.dark #debug-bar .ci-label.active { - background-color: #252525; } - #toolbarContainer.dark #debug-bar .ci-label:hover { - background-color: #252525; } - #toolbarContainer.dark #debug-bar .ci-label .badge { - background-color: #5BC0DE; - color: #DFDFDF; } - #toolbarContainer.dark #debug-bar .tab { - background-color: #252525; - box-shadow: 0 -1px 4px #434343; - -moz-box-shadow: 0 -1px 4px #434343; - -webkit-box-shadow: 0 -1px 4px #434343; } - #toolbarContainer.dark #debug-bar .timeline th, - #toolbarContainer.dark #debug-bar .timeline td { - border-color: #434343; } - #toolbarContainer.dark #debug-bar .timeline .timer { - background-color: #DD8615; } -#toolbarContainer.dark .debug-view.show-view { - border-color: #DD8615; } -#toolbarContainer.dark .debug-view-path { - background-color: #FDC894; - color: #434343; } - -#toolbarContainer.light #debug-icon { - background-color: #FFFFFF; - box-shadow: 0 0 4px #DFDFDF; - -moz-box-shadow: 0 0 4px #DFDFDF; - -webkit-box-shadow: 0 0 4px #DFDFDF; } - #toolbarContainer.light #debug-icon a:active, #toolbarContainer.light #debug-icon a:link, #toolbarContainer.light #debug-icon a:visited { - color: #DD8615; } -#toolbarContainer.light #debug-bar { - background-color: #FFFFFF; - color: #434343; } - #toolbarContainer.light #debug-bar h1, - #toolbarContainer.light #debug-bar h2, - #toolbarContainer.light #debug-bar h3, - #toolbarContainer.light #debug-bar p, - #toolbarContainer.light #debug-bar a, - #toolbarContainer.light #debug-bar button, - #toolbarContainer.light #debug-bar table, - #toolbarContainer.light #debug-bar thead, - #toolbarContainer.light #debug-bar tr, - #toolbarContainer.light #debug-bar td, - #toolbarContainer.light #debug-bar button, - #toolbarContainer.light #debug-bar .toolbar { - background-color: transparent; - color: #434343; } - #toolbarContainer.light #debug-bar button { - background-color: #FFFFFF; } - #toolbarContainer.light #debug-bar table strong { - color: #FDC894; } - #toolbarContainer.light #debug-bar table tbody tr:hover { - background-color: #DFDFDF; } - #toolbarContainer.light #debug-bar table tbody tr.current { - background-color: #FDC894; } - #toolbarContainer.light #debug-bar table tbody tr.current:hover td { - background-color: #DD4814; - color: #FFFFFF; } - #toolbarContainer.light #debug-bar .toolbar { - background-color: #FFFFFF; - box-shadow: 0 0 4px #DFDFDF; - -moz-box-shadow: 0 0 4px #DFDFDF; - -webkit-box-shadow: 0 0 4px #DFDFDF; } - #toolbarContainer.light #debug-bar .toolbar img { - filter: brightness(0) invert(0.4); } - #toolbarContainer.light #debug-bar.fixed-top .toolbar { - box-shadow: 0 0 4px #DFDFDF; - -moz-box-shadow: 0 0 4px #DFDFDF; - -webkit-box-shadow: 0 0 4px #DFDFDF; } - #toolbarContainer.light #debug-bar.fixed-top .tab { - box-shadow: 0 1px 4px #DFDFDF; - -moz-box-shadow: 0 1px 4px #DFDFDF; - -webkit-box-shadow: 0 1px 4px #DFDFDF; } - #toolbarContainer.light #debug-bar .muted { - color: #434343; } - #toolbarContainer.light #debug-bar .muted td { - color: #DFDFDF; } - #toolbarContainer.light #debug-bar .muted:hover td { - color: #434343; } - #toolbarContainer.light #debug-bar #toolbar-position, - #toolbarContainer.light #debug-bar #toolbar-theme { - filter: brightness(0) invert(0.6); } - #toolbarContainer.light #debug-bar .ci-label.active { - background-color: #DFDFDF; } - #toolbarContainer.light #debug-bar .ci-label:hover { - background-color: #DFDFDF; } - #toolbarContainer.light #debug-bar .ci-label .badge { - background-color: #5BC0DE; - color: #FFFFFF; } - #toolbarContainer.light #debug-bar .tab { - background-color: #FFFFFF; - box-shadow: 0 -1px 4px #DFDFDF; - -moz-box-shadow: 0 -1px 4px #DFDFDF; - -webkit-box-shadow: 0 -1px 4px #DFDFDF; } - #toolbarContainer.light #debug-bar .timeline th, - #toolbarContainer.light #debug-bar .timeline td { - border-color: #DFDFDF; } - #toolbarContainer.light #debug-bar .timeline .timer { - background-color: #DD8615; } -#toolbarContainer.light .debug-view.show-view { - border-color: #DD8615; } -#toolbarContainer.light .debug-view-path { - background-color: #FDC894; - color: #434343; } - -.debug-bar-width30 { - width: 30%; } - -.debug-bar-width10 { - width: 10%; } - -.debug-bar-width70p { - width: 70px; } - -.debug-bar-width140p { - width: 140px; } - -.debug-bar-width20e { - width: 20em; } - -.debug-bar-width6r { - width: 6rem; } - -.debug-bar-ndisplay { - display: none; } - -.debug-bar-alignRight { - text-align: right; } - -.debug-bar-alignLeft { - text-align: left; } - -.debug-bar-noverflow { - overflow: hidden; } - -#debug-bar td[data-debugbar-route] form { - display: none; } -#debug-bar td[data-debugbar-route]:hover form { - display: block; } -#debug-bar td[data-debugbar-route]:hover > div { - display: none; } -#debug-bar td[data-debugbar-route] input[type=text] { - padding: 2px; } -#toolbarContainer.dark td[data-debugbar-route] input[type=text] { - background: #000; - color: #fff; } diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbar.js b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbar.js deleted file mode 100644 index 15fa668..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbar.js +++ /dev/null @@ -1,661 +0,0 @@ -/* - * Functionality for the CodeIgniter Debug Toolbar. - */ - -var ciDebugBar = { - - toolbarContainer : null, - toolbar : null, - icon : null, - - //-------------------------------------------------------------------- - - init : function () { - this.toolbarContainer = document.getElementById('toolbarContainer'); - this.toolbar = document.getElementById('debug-bar'); - this.icon = document.getElementById('debug-icon'); - - ciDebugBar.createListeners(); - ciDebugBar.setToolbarState(); - ciDebugBar.setToolbarPosition(); - ciDebugBar.setToolbarTheme(); - ciDebugBar.toggleViewsHints(); - ciDebugBar.routerLink(); - - document.getElementById('debug-bar-link').addEventListener('click', ciDebugBar.toggleToolbar, true); - document.getElementById('debug-icon-link').addEventListener('click', ciDebugBar.toggleToolbar, true); - - // Allows to highlight the row of the current history request - var btn = document.querySelector('button[data-time="' + localStorage.getItem('debugbar-time') + '"]'); - ciDebugBar.addClass(btn.parentNode.parentNode, 'current'); - - historyLoad = document.getElementsByClassName('ci-history-load'); - - for (var i = 0; i < historyLoad.length; i++) - { - historyLoad[i].addEventListener('click', function () { - loadDoc(this.getAttribute('data-time')); - }, true); - } - - // Display the active Tab on page load - var tab = ciDebugBar.readCookie('debug-bar-tab'); - if (document.getElementById(tab)) - { - var el = document.getElementById(tab); - el.style.display = 'block'; - ciDebugBar.addClass(el, 'active'); - tab = document.querySelector('[data-tab=' + tab + ']'); - if (tab) - { - ciDebugBar.addClass(tab.parentNode, 'active'); - } - } - }, - - //-------------------------------------------------------------------- - - createListeners : function () { - var buttons = [].slice.call(document.querySelectorAll('#debug-bar .ci-label a')); - - for (var i = 0; i < buttons.length; i++) - { - buttons[i].addEventListener('click', ciDebugBar.showTab, true); - } - }, - - //-------------------------------------------------------------------- - - showTab: function () { - // Get the target tab, if any - var tab = document.getElementById(this.getAttribute('data-tab')); - - // If the label have not a tab stops here - if (! tab) - { - return; - } - - // Remove debug-bar-tab cookie - ciDebugBar.createCookie('debug-bar-tab', '', -1); - - // Check our current state. - var state = tab.style.display; - - // Hide all tabs - var tabs = document.querySelectorAll('#debug-bar .tab'); - - for (var i = 0; i < tabs.length; i++) - { - tabs[i].style.display = 'none'; - } - - // Mark all labels as inactive - var labels = document.querySelectorAll('#debug-bar .ci-label'); - - for (var i = 0; i < labels.length; i++) - { - ciDebugBar.removeClass(labels[i], 'active'); - } - - // Show/hide the selected tab - if (state != 'block') - { - tab.style.display = 'block'; - ciDebugBar.addClass(this.parentNode, 'active'); - // Create debug-bar-tab cookie to persistent state - ciDebugBar.createCookie('debug-bar-tab', this.getAttribute('data-tab'), 365); - } - }, - - //-------------------------------------------------------------------- - - addClass : function (el, className) { - if (el.classList) - { - el.classList.add(className); - } - else - { - el.className += ' ' + className; - } - }, - - //-------------------------------------------------------------------- - - removeClass : function (el, className) { - if (el.classList) - { - el.classList.remove(className); - } - else - { - el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); - } - }, - - //-------------------------------------------------------------------- - - /** - * Toggle display of a data table - * - * @param obj - */ - toggleDataTable : function (obj) { - if (typeof obj == 'string') - { - obj = document.getElementById(obj + '_table'); - } - - if (obj) - { - obj.style.display = obj.style.display == 'none' ? 'block' : 'none'; - } - }, - - //-------------------------------------------------------------------- - - /** - * Toggle tool bar from full to icon and icon to full - */ - toggleToolbar : function () { - var open = ciDebugBar.toolbar.style.display != 'none'; - - ciDebugBar.icon.style.display = open == true ? 'inline-block' : 'none'; - ciDebugBar.toolbar.style.display = open == false ? 'inline-block' : 'none'; - - // Remember it for other page loads on this site - ciDebugBar.createCookie('debug-bar-state', '', -1); - ciDebugBar.createCookie('debug-bar-state', open == true ? 'minimized' : 'open' , 365); - }, - - //-------------------------------------------------------------------- - - /** - * Sets the initial state of the toolbar (open or minimized) when - * the page is first loaded to allow it to remember the state between refreshes. - */ - setToolbarState: function () { - var open = ciDebugBar.readCookie('debug-bar-state'); - - ciDebugBar.icon.style.display = open != 'open' ? 'inline-block' : 'none'; - ciDebugBar.toolbar.style.display = open == 'open' ? 'inline-block' : 'none'; - }, - - //-------------------------------------------------------------------- - - toggleViewsHints: function () { - // Avoid toggle hints on history requests that are not the initial - if (localStorage.getItem('debugbar-time') != localStorage.getItem('debugbar-time-new')) - { - var a = document.querySelector('a[data-tab="ci-views"]'); - a.href = '#'; - return; - } - - var nodeList = []; // [ Element, NewElement( 1 )/OldElement( 0 ) ] - var sortedComments = []; - var comments = []; - - var getComments = function () { - var nodes = []; - var result = []; - var xpathResults = document.evaluate( "//comment()[starts-with(., ' DEBUG-VIEW')]", document, null, XPathResult.ANY_TYPE, null); - var nextNode = xpathResults.iterateNext(); - while ( nextNode ) - { - nodes.push( nextNode ); - nextNode = xpathResults.iterateNext(); - } - - // sort comment by opening and closing tags - for (var i = 0; i < nodes.length; ++i) - { - // get file path + name to use as key - var path = nodes[i].nodeValue.substring( 18, nodes[i].nodeValue.length - 1 ); - - if ( nodes[i].nodeValue[12] === 'S' ) // simple check for start comment - { - // create new entry - result[path] = [ nodes[i], null ]; - } - else if (result[path]) - { - // add to existing entry - result[path][1] = nodes[i]; - } - } - - return result; - }; - - // find node that has TargetNode as parentNode - var getParentNode = function ( node, targetNode ) { - if ( node.parentNode === null ) - { - return null; - } - - if ( node.parentNode !== targetNode ) - { - return getParentNode( node.parentNode, targetNode ); - } - - return node; - }; - - // define invalid & outer ( also invalid ) elements - const INVALID_ELEMENTS = [ 'NOSCRIPT', 'SCRIPT', 'STYLE' ]; - const OUTER_ELEMENTS = [ 'HTML', 'BODY', 'HEAD' ]; - - var getValidElementInner = function ( node, reverse ) { - // handle invalid tags - if ( OUTER_ELEMENTS.indexOf( node.nodeName ) !== -1 ) - { - for (var i = 0; i < document.body.children.length; ++i) - { - var index = reverse ? document.body.children.length - ( i + 1 ) : i; - var element = document.body.children[index]; - - // skip invalid tags - if ( INVALID_ELEMENTS.indexOf( element.nodeName ) !== -1 ) - { - continue; - } - - return [ element, reverse ]; - } - - return null; - } - - // get to next valid element - while ( node !== null && INVALID_ELEMENTS.indexOf( node.nodeName ) !== -1 ) - { - node = reverse ? node.previousElementSibling : node.nextElementSibling; - } - - // return non array if we couldnt find something - if ( node === null ) - { - return null; - } - - return [ node, reverse ]; - }; - - // get next valid element ( to be safe to add divs ) - // @return [ element, skip element ] or null if we couldnt find a valid place - var getValidElement = function ( nodeElement ) { - if (nodeElement) - { - if ( nodeElement.nextElementSibling !== null ) - { - return getValidElementInner( nodeElement.nextElementSibling, false ) - || getValidElementInner( nodeElement.previousElementSibling, true ); - } - if ( nodeElement.previousElementSibling !== null ) - { - return getValidElementInner( nodeElement.previousElementSibling, true ); - } - } - - // something went wrong! -> element is not in DOM - return null; - }; - - function showHints() - { - // Had AJAX? Reset view blocks - sortedComments = getComments(); - - for (var key in sortedComments) - { - var startElement = getValidElement( sortedComments[key][0] ); - var endElement = getValidElement( sortedComments[key][1] ); - - // skip if we couldnt get a valid element - if ( startElement === null || endElement === null ) - { - continue; - } - - // find element which has same parent as startelement - var jointParent = getParentNode( endElement[0], startElement[0].parentNode ); - if ( jointParent === null ) - { - // find element which has same parent as endelement - jointParent = getParentNode( startElement[0], endElement[0].parentNode ); - if ( jointParent === null ) - { - // both tries failed - continue; - } - else - { - startElement[0] = jointParent; - } - } - else - { - endElement[0] = jointParent; - } - - var debugDiv = document.createElement( 'div' ); // holder - var debugPath = document.createElement( 'div' ); // path - var childArray = startElement[0].parentNode.childNodes; // target child array - var parent = startElement[0].parentNode; - var start, end; - - // setup container - debugDiv.classList.add( 'debug-view' ); - debugDiv.classList.add( 'show-view' ); - debugPath.classList.add( 'debug-view-path' ); - debugPath.innerText = key; - debugDiv.appendChild( debugPath ); - - // calc distance between them - // start - for (var i = 0; i < childArray.length; ++i) - { - // check for comment ( start & end ) -> if its before valid start element - if ( childArray[i] === sortedComments[key][1] || - childArray[i] === sortedComments[key][0] || - childArray[i] === startElement[0] ) - { - start = i; - if ( childArray[i] === sortedComments[key][0] ) - { - start++; // increase to skip the start comment - } - break; - } - } - // adjust if we want to skip the start element - if ( startElement[1] ) - { - start++; - } - - // end - for (var i = start; i < childArray.length; ++i) - { - if ( childArray[i] === endElement[0] ) - { - end = i; - // dont break to check for end comment after end valid element - } - else if ( childArray[i] === sortedComments[key][1] ) - { - // if we found the end comment, we can break - end = i; - break; - } - } - - // move elements - var number = end - start; - if ( endElement[1] ) - { - number++; - } - for (var i = 0; i < number; ++i) - { - if ( INVALID_ELEMENTS.indexOf( childArray[start] ) !== -1 ) - { - // skip invalid childs that can cause problems if moved - start++; - continue; - } - debugDiv.appendChild( childArray[start] ); - } - - // add container to DOM - nodeList.push( parent.insertBefore( debugDiv, childArray[start] ) ); - } - - ciDebugBar.createCookie('debug-view', 'show', 365); - ciDebugBar.addClass(btn, 'active'); - } - - function hideHints() - { - for (var i = 0; i < nodeList.length; ++i) - { - var index; - - // find index - for (var j = 0; j < nodeList[i].parentNode.childNodes.length; ++j) - { - if ( nodeList[i].parentNode.childNodes[j] === nodeList[i] ) - { - index = j; - break; - } - } - - // move child back - while ( nodeList[i].childNodes.length !== 1 ) - { - nodeList[i].parentNode.insertBefore( nodeList[i].childNodes[1], nodeList[i].parentNode.childNodes[index].nextSibling ); - index++; - } - - nodeList[i].parentNode.removeChild( nodeList[i] ); - } - nodeList.length = 0; - - ciDebugBar.createCookie('debug-view', '', -1); - ciDebugBar.removeClass(btn, 'active'); - } - - var btn = document.querySelector('[data-tab=ci-views]'); - - // If the Views Collector is inactive stops here - if (! btn) - { - return; - } - - btn.parentNode.onclick = function () { - if (ciDebugBar.readCookie('debug-view')) - { - hideHints(); - } - else - { - showHints(); - } - }; - - // Determine Hints state on page load - if (ciDebugBar.readCookie('debug-view')) - { - showHints(); - } - }, - - //-------------------------------------------------------------------- - - setToolbarPosition: function () { - var btnPosition = document.getElementById('toolbar-position'); - - if (ciDebugBar.readCookie('debug-bar-position') === 'top') - { - ciDebugBar.addClass(ciDebugBar.icon, 'fixed-top'); - ciDebugBar.addClass(ciDebugBar.toolbar, 'fixed-top'); - } - - btnPosition.addEventListener('click', function () { - var position = ciDebugBar.readCookie('debug-bar-position'); - - ciDebugBar.createCookie('debug-bar-position', '', -1); - - if (!position || position === 'bottom') - { - ciDebugBar.createCookie('debug-bar-position', 'top', 365); - ciDebugBar.addClass(ciDebugBar.icon, 'fixed-top'); - ciDebugBar.addClass(ciDebugBar.toolbar, 'fixed-top'); - } - else - { - ciDebugBar.createCookie('debug-bar-position', 'bottom', 365); - ciDebugBar.removeClass(ciDebugBar.icon, 'fixed-top'); - ciDebugBar.removeClass(ciDebugBar.toolbar, 'fixed-top'); - } - }, true); - }, - - //-------------------------------------------------------------------- - - setToolbarTheme: function () { - var btnTheme = document.getElementById('toolbar-theme'); - var isDarkMode = window.matchMedia("(prefers-color-scheme: dark)").matches; - var isLightMode = window.matchMedia("(prefers-color-scheme: light)").matches; - - // If a cookie is set with a value, we force the color scheme - if (ciDebugBar.readCookie('debug-bar-theme') === 'dark') - { - ciDebugBar.removeClass(ciDebugBar.toolbarContainer, 'light'); - ciDebugBar.addClass(ciDebugBar.toolbarContainer, 'dark'); - } - else if (ciDebugBar.readCookie('debug-bar-theme') === 'light') - { - ciDebugBar.removeClass(ciDebugBar.toolbarContainer, 'dark'); - ciDebugBar.addClass(ciDebugBar.toolbarContainer, 'light'); - } - - btnTheme.addEventListener('click', function () { - var theme = ciDebugBar.readCookie('debug-bar-theme'); - - if (!theme && window.matchMedia("(prefers-color-scheme: dark)").matches) - { - // If there is no cookie, and "prefers-color-scheme" is set to "dark" - // It means that the user wants to switch to light mode - ciDebugBar.createCookie('debug-bar-theme', 'light', 365); - ciDebugBar.removeClass(ciDebugBar.toolbarContainer, 'dark'); - ciDebugBar.addClass(ciDebugBar.toolbarContainer, 'light'); - } - else - { - if (theme === 'dark') - { - ciDebugBar.createCookie('debug-bar-theme', 'light', 365); - ciDebugBar.removeClass(ciDebugBar.toolbarContainer, 'dark'); - ciDebugBar.addClass(ciDebugBar.toolbarContainer, 'light'); - } - else - { - // In any other cases: if there is no cookie, or the cookie is set to - // "light", or the "prefers-color-scheme" is "light"... - ciDebugBar.createCookie('debug-bar-theme', 'dark', 365); - ciDebugBar.removeClass(ciDebugBar.toolbarContainer, 'light'); - ciDebugBar.addClass(ciDebugBar.toolbarContainer, 'dark'); - } - } - }, true); - }, - - //-------------------------------------------------------------------- - - /** - * Helper to create a cookie. - * - * @param name - * @param value - * @param days - */ - createCookie : function (name,value,days) { - if (days) - { - var date = new Date(); - - date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); - - var expires = "; expires=" + date.toGMTString(); - } - else - { - var expires = ""; - } - - document.cookie = name + "=" + value + expires + "; path=/"; - }, - - //-------------------------------------------------------------------- - - readCookie : function (name) { - var nameEQ = name + "="; - var ca = document.cookie.split(';'); - - for (var i = 0; i < ca.length; i++) - { - var c = ca[i]; - while (c.charAt(0) == ' ') - { - c = c.substring(1,c.length); - } - if (c.indexOf(nameEQ) == 0) - { - return c.substring(nameEQ.length,c.length); - } - } - return null; - }, - - //-------------------------------------------------------------------- - - trimSlash: function(text) { - return text.replace(/^\/|\/$/g, ''); - }, - - routerLink: function() { - var row, _location; - var rowGet = document.querySelectorAll('#debug-bar td[data-debugbar-route="GET"]'); - var patt = /\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)/; - - for (var i = 0; i < rowGet.length; i++) { - row = rowGet[i]; - if (!/\/\(.+?\)/.test(rowGet[i].innerText)) { - row.style = 'cursor: pointer;'; - row.setAttribute('title', location.origin + '/' + ciDebugBar.trimSlash(row.innerText)); - row.addEventListener('click', function(ev) { - _location = location.origin + '/' + ciDebugBar.trimSlash(ev.target.innerText); - var redirectWindow = window.open(_location, '_blank'); - redirectWindow.location; - }); - } - else { - row.innerHTML = '
' + row.innerText + '
' - + '
' - + row.innerText.replace(patt, '') - + '' - + '
'; - } - } - - rowGet = document.querySelectorAll('#debug-bar td[data-debugbar-route="GET"] form'); - for (var i = 0; i < rowGet.length; i++) { - row = rowGet[i]; - - row.addEventListener('submit', function(event) { - event.preventDefault() - var inputArray = [], t = 0; - var input = event.target.querySelectorAll('input[type=text]'); - var tpl = event.target.getAttribute('data-debugbar-route-tpl'); - - for (var n = 0; n < input.length; n++) { - if (input[n].value.length > 0) inputArray.push(input[n].value); - } - - if (inputArray.length > 0) { - _location = location.origin + '/' + tpl.replace(/\?/g, function() {return inputArray[t++]}); - var redirectWindow = window.open(_location, '_blank'); - redirectWindow.location; - } - }) - } - - } - -}; diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbar.tpl.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbar.tpl.php deleted file mode 100644 index 5f5d7c4..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbar.tpl.php +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -
-
- - 🔅 - - - - ms   MB - - - - - - - - - - - - - - - - - - - - - - - Vars - - - -

- - - - - - - - - - -

- - - - - -
- - -
- - - - - - - - - - - - - renderTimeline($collectors, $startTime, $segmentCount, $segmentDuration, - $styles) ?> - -
NAMECOMPONENTDURATION ms
-
- - - - - -
-

- - setData($c['display'])->render("_{$c['titleSafe']}.tpl") ?> -
- - - - - -
- - - - $items) : ?> - - -

-
- - - - - - $value) : ?> - - - - - - -
- - -

No data to display.

- - - - - - -

Session User Data

-
- - - - - - $value) : ?> - - - - - - -
- -

No data to display.

- - -

Session doesn't seem to be active.

- - -

Request ( )

- - - -

$_GET

-
- - - - $value) : ?> - - - - - - -
- - - - -

$_POST

-
- - - - $value) : ?> - - - - - - -
- - - - -

Headers

-
- - - - $value) : ?> - - - - - - -
- - - - -

Cookies

-
- - - - $value) : ?> - - - - - - - - - -

Response - ( ) -

- - - -

Headers

-
- - - - $value) : ?> - - - - - - -
- -
- - -
-

System Configuration

- - setData($config)->render('_config.tpl') ?> -
-
- diff --git a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbarloader.js.php b/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbarloader.js.php deleted file mode 100644 index af69338..0000000 --- a/vendor/codeigniter4/framework/system/Debug/Toolbar/Views/toolbarloader.js.php +++ /dev/null @@ -1,90 +0,0 @@ - -document.addEventListener('DOMContentLoaded', loadDoc, false); - -function loadDoc(time) { - if (isNaN(time)) { - time = document.getElementById("debugbar_loader").getAttribute("data-time"); - localStorage.setItem('debugbar-time', time); - } - - localStorage.setItem('debugbar-time-new', time); - - var url = ""; - - var xhttp = new XMLHttpRequest(); - xhttp.onreadystatechange = function() { - if (this.readyState === 4 && this.status === 200) { - var toolbar = document.getElementById("toolbarContainer"); - if (!toolbar) { - toolbar = document.createElement('div'); - toolbar.setAttribute('id', 'toolbarContainer'); - document.body.appendChild(toolbar); - } - - // copy for easier manipulation - let responseText = this.responseText; - - // get csp blocked parts - // the style block is the first and starts at 0 - { - let PosBeg = responseText.indexOf( '>', responseText.indexOf( '', PosBeg ); - document.getElementById( 'debugbar_dynamic_style' ).innerHTML = responseText.substr( PosBeg, PosEnd - PosBeg ); - responseText = responseText.substr( PosEnd + 8 ); - } - // the script block starts right after style blocks ended - { - let PosBeg = responseText.indexOf( '>', responseText.indexOf( '' ); - document.getElementById( 'debugbar_dynamic_script' ).innerHTML = responseText.substr( PosBeg, PosEnd - PosBeg ); - responseText = responseText.substr( PosEnd + 9 ); - } - // check for last style block - { - let PosBeg = responseText.indexOf( '>', responseText.lastIndexOf( '', PosBeg ); - document.getElementById( 'debugbar_dynamic_style' ).innerHTML += responseText.substr( PosBeg, PosEnd - PosBeg ); - responseText = responseText.substr( 0, PosBeg + 8 ); - } - - toolbar.innerHTML = responseText; - if (typeof ciDebugBar === 'object') { - ciDebugBar.init(); - } - } else if (this.readyState === 4 && this.status === 404) { - console.log('CodeIgniter DebugBar: File "WRITEPATH/debugbar/debugbar_' + time + '" not found.'); - } - }; - - xhttp.open("GET", url + "?debugbar_time=" + time, true); - xhttp.send(); -} - -// Track all AJAX requests -if (window.ActiveXObject) { - var oldXHR = new ActiveXObject('Microsoft.XMLHTTP'); -} else { - var oldXHR = window.XMLHttpRequest; -} - -function newXHR() { - var realXHR = new oldXHR(); - realXHR.addEventListener("readystatechange", function() { - // Only success responses and URLs that do not contains "debugbar_time" are tracked - if (realXHR.readyState === 4 && realXHR.status.toString()[0] === '2' && realXHR.responseURL.indexOf('debugbar_time') === -1) { - var debugbarTime = realXHR.getResponseHeader('Debugbar-Time'); - if (debugbarTime) { - var h2 = document.querySelector('#ci-history > h2'); - if(h2) { - h2.innerHTML = 'History You have new debug data. '; - var badge = document.querySelector('a[data-tab="ci-history"] > span > .badge'); - badge.className += ' active'; - } - } - } - }, false); - return realXHR; -} - -window.XMLHttpRequest = newXHR; - diff --git a/vendor/codeigniter4/framework/system/Email/Email.php b/vendor/codeigniter4/framework/system/Email/Email.php deleted file mode 100644 index b3a3dcd..0000000 --- a/vendor/codeigniter4/framework/system/Email/Email.php +++ /dev/null @@ -1,2188 +0,0 @@ - '1 (Highest)', - 2 => '2 (High)', - 3 => '3 (Normal)', - 4 => '4 (Low)', - 5 => '5 (Lowest)', - ]; - /** - * mbstring.func_overload flag - * - * @var boolean - */ - protected static $func_overload; - //-------------------------------------------------------------------- - /** - * Constructor - Sets Email Preferences - * - * The constructor can be passed an array of config values - * - * @param array|null $config - */ - public function __construct($config = null) - { - $this->initialize($config); - isset(static::$func_overload) || static::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); - } - //-------------------------------------------------------------------- - /** - * Initialize preferences - * - * @param array|\Config\Email $config - * - * @return Email - */ - public function initialize($config) - { - $this->clear(); - if ($config instanceof \Config\Email) - { - $config = get_object_vars($config); - } - foreach (get_class_vars(get_class($this)) as $key => $value) - { - if (property_exists($this, $key) && isset($config[$key])) - { - $method = 'set' . ucfirst($key); - if (method_exists($this, $method)) - { - $this->$method($config[$key]); - } - else - { - $this->$key = $config[$key]; - } - } - } - $this->charset = strtoupper($this->charset); - $this->SMTPAuth = isset($this->SMTPUser[0], $this->SMTPPass[0]); - return $this; - } - //-------------------------------------------------------------------- - /** - * Initialize the Email Data - * - * @param boolean $clearAttachments - * - * @return Email - */ - public function clear($clearAttachments = false) - { - $this->subject = ''; - $this->body = ''; - $this->finalBody = ''; - $this->headerStr = ''; - $this->replyToFlag = false; - $this->recipients = []; - $this->CCArray = []; - $this->BCCArray = []; - $this->headers = []; - $this->debugMessage = []; - $this->setHeader('Date', $this->setDate()); - if ($clearAttachments !== false) - { - $this->attachments = []; - } - return $this; - } - //-------------------------------------------------------------------- - /** - * Set FROM - * - * @param string $from - * @param string $name - * @param string|null $returnPath Return-Path - * - * @return Email - */ - public function setFrom($from, $name = '', $returnPath = null) - { - if (preg_match('/\<(.*)\>/', $from, $match)) - { - $from = $match[1]; - } - if ($this->validate) - { - $this->validateEmail($this->stringToArray($from)); - if ($returnPath) - { - $this->validateEmail($this->stringToArray($returnPath)); - } - } - - // Store the plain text values - $this->tmpArchive['fromEmail'] = $from; - $this->tmpArchive['fromName'] = $name; - - // prepare the display name - if ($name !== '') - { - // only use Q encoding if there are characters that would require it - if (! preg_match('/[\200-\377]/', $name)) - { - // add slashes for non-printing characters, slashes, and double quotes, and surround it in double quotes - $name = '"' . addcslashes($name, "\0..\37\177'\"\\") . '"'; - } - else - { - $name = $this->prepQEncoding($name); - } - } - $this->setHeader('From', $name . ' <' . $from . '>'); - isset($returnPath) || $returnPath = $from; - $this->setHeader('Return-Path', '<' . $returnPath . '>'); - $this->tmpArchive['returnPath'] = $returnPath; - - return $this; - } - //-------------------------------------------------------------------- - /** - * Set Reply-to - * - * @param string $replyto - * @param string $name - * - * @return Email - */ - public function setReplyTo($replyto, $name = '') - { - if (preg_match('/\<(.*)\>/', $replyto, $match)) - { - $replyto = $match[1]; - } - if ($this->validate) - { - $this->validateEmail($this->stringToArray($replyto)); - } - if ($name !== '') - { - $this->tmpArchive['replyName'] = $name; - - // only use Q encoding if there are characters that would require it - if (! preg_match('/[\200-\377]/', $name)) - { - // add slashes for non-printing characters, slashes, and double quotes, and surround it in double quotes - $name = '"' . addcslashes($name, "\0..\37\177'\"\\") . '"'; - } - else - { - $name = $this->prepQEncoding($name); - } - } - $this->setHeader('Reply-To', $name . ' <' . $replyto . '>'); - $this->replyToFlag = true; - $this->tmpArchive['replyTo'] = $replyto; - - return $this; - } - //-------------------------------------------------------------------- - /** - * Set Recipients - * - * @param string|array $to - * - * @return Email - */ - public function setTo($to) - { - $to = $this->stringToArray($to); - $to = $this->cleanEmail($to); - if ($this->validate) - { - $this->validateEmail($to); - } - if ($this->getProtocol() !== 'mail') - { - $this->setHeader('To', implode(', ', $to)); - } - $this->recipients = $to; - return $this; - } - //-------------------------------------------------------------------- - /** - * Set CC - * - * @param string $cc - * - * @return Email - */ - public function setCC($cc) - { - $cc = $this->cleanEmail($this->stringToArray($cc)); - if ($this->validate) - { - $this->validateEmail($cc); - } - $this->setHeader('Cc', implode(', ', $cc)); - if ($this->getProtocol() === 'smtp') - { - $this->CCArray = $cc; - } - $this->tmpArchive['CCArray'] = $cc; - return $this; - } - //-------------------------------------------------------------------- - /** - * Set BCC - * - * @param string $bcc - * @param string $limit - * - * @return Email - */ - public function setBCC($bcc, $limit = '') - { - if ($limit !== '' && is_numeric($limit)) - { - $this->BCCBatchMode = true; - $this->BCCBatchSize = $limit; - } - $bcc = $this->cleanEmail($this->stringToArray($bcc)); - if ($this->validate) - { - $this->validateEmail($bcc); - } - if ($this->getProtocol() === 'smtp' || ($this->BCCBatchMode && count($bcc) > $this->BCCBatchSize)) - { - $this->BCCArray = $bcc; - } - else - { - $this->setHeader('Bcc', implode(', ', $bcc)); - $this->tmpArchive['BCCArray'] = $bcc; - } - return $this; - } - //-------------------------------------------------------------------- - /** - * Set Email Subject - * - * @param string $subject - * - * @return Email - */ - public function setSubject($subject) - { - $this->tmpArchive['subject'] = $subject; - - $subject = $this->prepQEncoding($subject); - $this->setHeader('Subject', $subject); - return $this; - } - //-------------------------------------------------------------------- - /** - * Set Body - * - * @param string $body - * - * @return Email - */ - public function setMessage($body) - { - $this->body = rtrim(str_replace("\r", '', $body)); - return $this; - } - //-------------------------------------------------------------------- - /** - * Assign file attachments - * - * @param string $file Can be local path, URL or buffered content - * @param string $disposition 'attachment' - * @param string|null $newname - * @param string $mime - * - * @return Email - */ - public function attach($file, $disposition = '', $newname = null, $mime = '') - { - if ($mime === '') - { - if (strpos($file, '://') === false && ! is_file($file)) - { - $this->setErrorMessage(lang('Email.attachmentMissing', [$file])); - return false; - } - if (! $fp = @fopen($file, 'rb')) - { - $this->setErrorMessage(lang('Email.attachmentUnreadable', [$file])); - return false; - } - $fileContent = stream_get_contents($fp); - $mime = $this->mimeTypes(pathinfo($file, PATHINFO_EXTENSION)); - fclose($fp); - } - else - { - $fileContent = & $file; // buffered file - } - // declare names on their own, to make phpcbf happy - $namesAttached = [ - $file, - $newname, - ]; - $this->attachments[] = [ - 'name' => $namesAttached, - 'disposition' => empty($disposition) ? 'attachment' : $disposition, - // Can also be 'inline' Not sure if it matters - 'type' => $mime, - 'content' => chunk_split(base64_encode($fileContent)), - 'multipart' => 'mixed', - ]; - return $this; - } - //-------------------------------------------------------------------- - /** - * Set and return attachment Content-ID - * - * Useful for attached inline pictures - * - * @param string $filename - * - * @return string - */ - public function setAttachmentCID($filename) - { - for ($i = 0, $c = count($this->attachments); $i < $c; $i ++) - { - if ($this->attachments[$i]['name'][0] === $filename) - { - $this->attachments[$i]['multipart'] = 'related'; - $this->attachments[$i]['cid'] = uniqid(basename($this->attachments[$i]['name'][0]) . '@', true); - return $this->attachments[$i]['cid']; - } - } - return false; - } - //-------------------------------------------------------------------- - /** - * Add a Header Item - * - * @param string $header - * @param string $value - * - * @return Email - */ - public function setHeader($header, $value) - { - $this->headers[$header] = str_replace(["\n", "\r"], '', $value); - return $this; - } - //-------------------------------------------------------------------- - /** - * Convert a String to an Array - * - * @param string $email - * - * @return array - */ - protected function stringToArray($email) - { - if (! is_array($email)) - { - return (strpos($email, ',') !== false) ? preg_split('/[\s,]/', $email, -1, PREG_SPLIT_NO_EMPTY) : (array) trim($email); - } - return $email; - } - //-------------------------------------------------------------------- - /** - * Set Multipart Value - * - * @param string $str - * - * @return Email - */ - public function setAltMessage($str) - { - $this->altMessage = (string) $str; - return $this; - } - //-------------------------------------------------------------------- - /** - * Set Mailtype - * - * @param string $type - * - * @return Email - */ - public function setMailType($type = 'text') - { - $this->mailType = ($type === 'html') ? 'html' : 'text'; - return $this; - } - //-------------------------------------------------------------------- - /** - * Set Wordwrap - * - * @param boolean $wordWrap - * - * @return Email - */ - public function setWordWrap($wordWrap = true) - { - $this->wordWrap = (bool) $wordWrap; - return $this; - } - //-------------------------------------------------------------------- - /** - * Set Protocol - * - * @param string $protocol - * - * @return Email - */ - public function setProtocol($protocol = 'mail') - { - $this->protocol = in_array($protocol, $this->protocols, true) ? strtolower($protocol) : 'mail'; - return $this; - } - //-------------------------------------------------------------------- - /** - * Set Priority - * - * @param integer $n - * - * @return Email - */ - public function setPriority($n = 3) - { - $this->priority = preg_match('/^[1-5]$/', $n) ? (int) $n : 3; - return $this; - } - //-------------------------------------------------------------------- - /** - * Set Newline Character - * - * @param string $newline - * - * @return Email - */ - public function setNewline($newline = "\n") - { - $this->newline = in_array($newline, ["\n", "\r\n", "\r"]) ? $newline : "\n"; - return $this; - } - //-------------------------------------------------------------------- - /** - * Set CRLF - * - * @param string $CRLF - * - * @return Email - */ - public function setCRLF($CRLF = "\n") - { - $this->CRLF = ($CRLF !== "\n" && $CRLF !== "\r\n" && $CRLF !== "\r") ? "\n" : $CRLF; - return $this; - } - //-------------------------------------------------------------------- - /** - * Get the Message ID - * - * @return string - */ - protected function getMessageID() - { - $from = str_replace(['>', '<'], '', $this->headers['Return-Path']); - return '<' . uniqid('', true) . strstr($from, '@') . '>'; - } - //-------------------------------------------------------------------- - /** - * Get Mail Protocol - * - * @return string - */ - protected function getProtocol() - { - $this->protocol = strtolower($this->protocol); - in_array($this->protocol, $this->protocols, true) || $this->protocol = 'mail'; - return $this->protocol; - } - //-------------------------------------------------------------------- - /** - * Get Mail Encoding - * - * @return string - */ - protected function getEncoding() - { - in_array($this->encoding, $this->bitDepths) || $this->encoding = '8bit'; - foreach ($this->baseCharsets as $charset) - { - if (strpos($this->charset, $charset) === 0) - { - $this->encoding = '7bit'; - break; - } - } - return $this->encoding; - } - //-------------------------------------------------------------------- - /** - * Get content type (text/html/attachment) - * - * @return string - */ - protected function getContentType() - { - if ($this->mailType === 'html') - { - return empty($this->attachments) ? 'html' : 'html-attach'; - } - elseif ($this->mailType === 'text' && ! empty($this->attachments)) - { - return 'plain-attach'; - } - else - { - return 'plain'; - } - } - //-------------------------------------------------------------------- - /** - * Set RFC 822 Date - * - * @return string - */ - protected function setDate() - { - $timezone = date('Z'); - $operator = ($timezone[0] === '-') ? '-' : '+'; - $timezone = abs($timezone); - $timezone = floor($timezone / 3600) * 100 + ($timezone % 3600) / 60; - return sprintf('%s %s%04d', date('D, j M Y H:i:s'), $operator, $timezone); - } - //-------------------------------------------------------------------- - /** - * Mime message - * - * @return string - */ - protected function getMimeMessage() - { - return 'This is a multi-part message in MIME format.' . $this->newline . 'Your email application may not support this format.'; - } - //-------------------------------------------------------------------- - /** - * Validate Email Address - * - * @param string|array $email - * - * @return boolean - */ - public function validateEmail($email) - { - if (! is_array($email)) - { - $this->setErrorMessage(lang('Email.mustBeArray')); - return false; - } - foreach ($email as $val) - { - if (! $this->isValidEmail($val)) - { - $this->setErrorMessage(lang('Email.invalidAddress', [$val])); - return false; - } - } - return true; - } - //-------------------------------------------------------------------- - /** - * Email Validation - * - * @param string $email - * - * @return boolean - */ - public function isValidEmail($email) - { - if (function_exists('idn_to_ascii') && defined('INTL_IDNA_VARIANT_UTS46') && $atpos = strpos($email, '@')) - { - $email = static::substr($email, 0, ++ $atpos) . idn_to_ascii( - static::substr($email, $atpos), 0, INTL_IDNA_VARIANT_UTS46 - ); - } - return (bool) filter_var($email, FILTER_VALIDATE_EMAIL); - } - //-------------------------------------------------------------------- - /** - * Clean Extended Email Address: Joe Smith - * - * @param string $email - * - * @return string - */ - public function cleanEmail($email) - { - if (! is_array($email)) - { - return preg_match('/\<(.*)\>/', $email, $match) ? $match[1] : $email; - } - $cleanEmail = []; - foreach ($email as $addy) - { - $cleanEmail[] = preg_match('/\<(.*)\>/', $addy, $match) ? $match[1] : $addy; - } - return $cleanEmail; - } - //-------------------------------------------------------------------- - /** - * Build alternative plain text message - * - * Provides the raw message for use in plain-text headers of - * HTML-formatted emails. - * If the user hasn't specified his own alternative message - * it creates one by stripping the HTML - * - * @return string - */ - protected function getAltMessage() - { - if (! empty($this->altMessage)) - { - return ($this->wordWrap) ? $this->wordWrap($this->altMessage, 76) : $this->altMessage; - } - $body = preg_match('/\(.*)\<\/body\>/si', $this->body, $match) ? $match[1] : $this->body; - $body = str_replace("\t", '', preg_replace('# ' . $message . "\n"; - - flock($fp, LOCK_EX); - - for ($written = 0, $length = strlen($msg); $written < $length; $written += $result) - { - if (($result = fwrite($fp, substr($msg, $written))) === false) - { - // if we get this far, we'll never see this during travis-ci - // @codeCoverageIgnoreStart - break; - // @codeCoverageIgnoreEnd - } - } - - flock($fp, LOCK_UN); - fclose($fp); - - if (isset($newfile) && $newfile === true) - { - chmod($filepath, $this->filePermissions); - } - - return is_int($result); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Log/Handlers/HandlerInterface.php b/vendor/codeigniter4/framework/system/Log/Handlers/HandlerInterface.php deleted file mode 100644 index 6778a46..0000000 --- a/vendor/codeigniter4/framework/system/Log/Handlers/HandlerInterface.php +++ /dev/null @@ -1,85 +0,0 @@ - 1, - 'alert' => 2, - 'critical' => 3, - 'error' => 4, - 'warning' => 5, - 'notice' => 6, - 'info' => 7, - 'debug' => 8, - ]; - - /** - * Array of levels to be logged. - * The rest will be ignored. - * Set in Config/logger.php - * - * @var array - */ - protected $loggableLevels = []; - - /** - * File permissions - * - * @var integer - */ - protected $filePermissions = 0644; - - /** - * Format of the timestamp for log files. - * - * @var string - */ - protected $dateFormat = 'Y-m-d H:i:s'; - - /** - * Filename Extension - * - * @var string - */ - protected $fileExt; - - /** - * Caches instances of the handlers. - * - * @var array - */ - protected $handlers = []; - - /** - * Holds the configuration for each handler. - * The key is the handler's class name. The - * value is an associative array of configuration - * items. - * - * @var array - */ - protected $handlerConfig = []; - - /** - * Caches logging calls for debugbar. - * - * @var array - */ - public $logCache; - - /** - * Should we cache our logged items? - * - * @var boolean - */ - protected $cacheLogs = false; - - //-------------------------------------------------------------------- - - /** - * Constructor. - * - * @param \Config\Logger $config - * @param boolean $debug - * @throws \RuntimeException - */ - public function __construct($config, bool $debug = CI_DEBUG) - { - $this->loggableLevels = is_array($config->threshold) ? $config->threshold : range(1, (int) $config->threshold); - - // Now convert loggable levels to strings. - // We only use numbers to make the threshold setting convenient for users. - if ($this->loggableLevels) - { - $temp = []; - foreach ($this->loggableLevels as $level) - { - $temp[] = array_search((int) $level, $this->logLevels); - } - - $this->loggableLevels = $temp; - unset($temp); - } - - $this->dateFormat = $config->dateFormat ?? $this->dateFormat; - - if (! is_array($config->handlers) || empty($config->handlers)) - { - throw LogException::forNoHandlers('LoggerConfig'); - } - - // Save the handler configuration for later. - // Instances will be created on demand. - $this->handlerConfig = $config->handlers; - - $this->cacheLogs = $debug; - if ($this->cacheLogs) - { - $this->logCache = []; - } - } - - //-------------------------------------------------------------------- - - /** - * System is unusable. - * - * @param string $message - * @param array $context - * - * @return boolean - */ - public function emergency($message, array $context = []): bool - { - return $this->log('emergency', $message, $context); - } - - //-------------------------------------------------------------------- - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * - * @return boolean - */ - public function alert($message, array $context = []): bool - { - return $this->log('alert', $message, $context); - } - - //-------------------------------------------------------------------- - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * - * @return boolean - */ - public function critical($message, array $context = []): bool - { - return $this->log('critical', $message, $context); - } - - //-------------------------------------------------------------------- - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * - * @return boolean - */ - public function error($message, array $context = []): bool - { - return $this->log('error', $message, $context); - } - - //-------------------------------------------------------------------- - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * - * @return boolean - */ - public function warning($message, array $context = []): bool - { - return $this->log('warning', $message, $context); - } - - //-------------------------------------------------------------------- - - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * - * @return boolean - */ - public function notice($message, array $context = []): bool - { - return $this->log('notice', $message, $context); - } - - //-------------------------------------------------------------------- - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * - * @return boolean - */ - public function info($message, array $context = []): bool - { - return $this->log('info', $message, $context); - } - - //-------------------------------------------------------------------- - - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * - * @return boolean - */ - public function debug($message, array $context = []): bool - { - return $this->log('debug', $message, $context); - } - - //-------------------------------------------------------------------- - - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * - * @return boolean - */ - public function log($level, $message, array $context = []): bool - { - if (is_numeric($level)) - { - $level = array_search((int) $level, $this->logLevels); - } - - // Is the level a valid level? - if (! array_key_exists($level, $this->logLevels)) - { - throw LogException::forInvalidLogLevel($level); - } - - // Does the app want to log this right now? - if (! in_array($level, $this->loggableLevels)) - { - return false; - } - - // Parse our placeholders - $message = $this->interpolate($message, $context); - - if (! is_string($message)) - { - $message = print_r($message, true); - } - - if ($this->cacheLogs) - { - $this->logCache[] = [ - 'level' => $level, - 'msg' => $message, - ]; - } - - foreach ($this->handlerConfig as $className => $config) - { - if (! array_key_exists($className, $this->handlers)) - { - $this->handlers[$className] = new $className($config); - } - - /** - * @var \CodeIgniter\Log\Handlers\HandlerInterface - */ - $handler = $this->handlers[$className]; - - if (! $handler->canHandle($level)) - { - continue; - } - - // If the handler returns false, then we - // don't execute any other handlers. - if (! $handler->setDateFormat($this->dateFormat)->handle($level, $message)) - { - break; - } - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Replaces any placeholders in the message with variables - * from the context, as well as a few special items like: - * - * {session_vars} - * {post_vars} - * {get_vars} - * {env} - * {env:foo} - * {file} - * {line} - * - * @param mixed $message - * @param array $context - * - * @return mixed - */ - protected function interpolate($message, array $context = []) - { - if (! is_string($message)) - { - return $message; - } - - // build a replacement array with braces around the context keys - $replace = []; - - foreach ($context as $key => $val) - { - // Verify that the 'exception' key is actually an exception - // or error, both of which implement the 'Throwable' interface. - if ($key === 'exception' && $val instanceof \Throwable) - { - $val = $val->getMessage() . ' ' . $this->cleanFileNames($val->getFile()) . ':' . $val->getLine(); - } - - // todo - sanitize input before writing to file? - $replace['{' . $key . '}'] = $val; - } - - // Add special placeholders - $replace['{post_vars}'] = '$_POST: ' . print_r($_POST, true); - $replace['{get_vars}'] = '$_GET: ' . print_r($_GET, true); - $replace['{env}'] = ENVIRONMENT; - - // Allow us to log the file/line that we are logging from - if (strpos($message, '{file}') !== false) - { - list($file, $line) = $this->determineFile(); - - $replace['{file}'] = $file; - $replace['{line}'] = $line; - } - - // Match up environment variables in {env:foo} tags. - if (strpos($message, 'env:') !== false) - { - preg_match('/env:[^}]+/', $message, $matches); - - if ($matches) - { - foreach ($matches as $str) - { - $key = str_replace('env:', '', $str); - $replace["{{$str}}"] = $_ENV[$key] ?? 'n/a'; - } - } - } - - if (isset($_SESSION)) - { - $replace['{session_vars}'] = '$_SESSION: ' . print_r($_SESSION, true); - } - - // interpolate replacement values into the message and return - return strtr($message, $replace); - } - - /** - * Determines the file and line that the logging call - * was made from by analyzing the backtrace. - * Find the earliest stack frame that is part of our logging system. - * - * @return array - */ - public function determineFile(): array - { - $logFunctions = [ - 'log_message', - 'log', - 'error', - 'debug', - 'info', - 'warning', - 'critical', - 'emergency', - 'alert', - 'notice', - ]; - - // Generate Backtrace info - $trace = \debug_backtrace(false); - - // So we search from the bottom (earliest) of the stack frames - $stackFrames = \array_reverse($trace); - - // Find the first reference to a Logger class method - foreach ($stackFrames as $frame) - { - if (\in_array($frame['function'], $logFunctions)) - { - $file = isset($frame['file']) ? $this->cleanFileNames($frame['file']) : 'unknown'; - $line = $frame['line'] ?? 'unknown'; - return [ - $file, - $line, - ]; - } - } - - return [ - 'unknown', - 'unknown', - ]; - } - - //-------------------------------------------------------------------- - - /** - * Cleans the paths of filenames by replacing APPPATH, SYSTEMPATH, FCPATH - * with the actual var. i.e. - * - * /var/www/site/app/Controllers/Home.php - * becomes: - * APPPATH/Controllers/Home.php - * - * @param $file - * - * @return string - */ - protected function cleanFileNames(string $file): string - { - $file = str_replace(APPPATH, 'APPPATH/', $file); - $file = str_replace(SYSTEMPATH, 'SYSTEMPATH/', $file); - - return str_replace(FCPATH, 'FCPATH/', $file); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Model.php b/vendor/codeigniter4/framework/system/Model.php deleted file mode 100644 index 8245fba..0000000 --- a/vendor/codeigniter4/framework/system/Model.php +++ /dev/null @@ -1,1842 +0,0 @@ -paginate() - * - * @var Pager - */ - public $pager; - - /** - * Name of database table - * - * @var string - */ - protected $table; - - /** - * The table's primary key. - * - * @var string - */ - protected $primaryKey = 'id'; - - /** - * Last insert ID - * - * @var integer - */ - protected $insertID = 0; - - /** - * The Database connection group that - * should be instantiated. - * - * @var string - */ - protected $DBGroup; - - /** - * The format that the results should be returned as. - * Will be overridden if the as* methods are used. - * - * @var string - */ - protected $returnType = 'array'; - - /** - * If this model should use "softDeletes" and - * simply set a date when rows are deleted, or - * do hard deletes. - * - * @var boolean - */ - protected $useSoftDeletes = false; - - /** - * An array of field names that are allowed - * to be set by the user in inserts/updates. - * - * @var array - */ - protected $allowedFields = []; - - /** - * If true, will set created_at, and updated_at - * values during insert and update routines. - * - * @var boolean - */ - protected $useTimestamps = false; - - /** - * The type of column that created_at and updated_at - * are expected to. - * - * Allowed: 'datetime', 'date', 'int' - * - * @var string - */ - protected $dateFormat = 'datetime'; - - //-------------------------------------------------------------------- - - /** - * The column used for insert timestamps - * - * @var string - */ - protected $createdField = 'created_at'; - - /** - * The column used for update timestamps - * - * @var string - */ - protected $updatedField = 'updated_at'; - - /** - * Used by withDeleted to override the - * model's softDelete setting. - * - * @var boolean - */ - protected $tempUseSoftDeletes; - - /** - * The column used to save soft delete state - * - * @var string - */ - protected $deletedField = 'deleted_at'; - - /** - * Used by asArray and asObject to provide - * temporary overrides of model default. - * - * @var string - */ - protected $tempReturnType; - - /** - * Whether we should limit fields in inserts - * and updates to those available in $allowedFields or not. - * - * @var boolean - */ - protected $protectFields = true; - - /** - * Database Connection - * - * @var ConnectionInterface - */ - protected $db; - - /** - * Query Builder object - * - * @var BaseBuilder - */ - protected $builder; - - /** - * Rules used to validate data in insert, update, and save methods. - * The array must match the format of data passed to the Validation - * library. - * - * @var array - */ - protected $validationRules = []; - - /** - * Contains any custom error messages to be - * used during data validation. - * - * @var array - */ - protected $validationMessages = []; - - /** - * Skip the model's validation. Used in conjunction with skipValidation() - * to skip data validation for any future calls. - * - * @var boolean - */ - protected $skipValidation = false; - - /** - * Whether rules should be removed that do not exist - * in the passed in data. Used between inserts/updates. - * - * @var boolean - */ - protected $cleanValidationRules = true; - - /** - * Our validator instance. - * - * @var \CodeIgniter\Validation\Validation - */ - protected $validation; - - /* - * Callbacks. Each array should contain the method - * names (within the model) that should be called - * when those events are triggered. With the exception - * of 'afterFind', all methods are passed the same - * items that are given to the update/insert method. - * 'afterFind' will also include the results that were found. - */ - - /** - * Whether to trigger the defined callbacks - * - * @var boolean - */ - protected $allowCallbacks = true; - - /** - * Used by allowCallbacks() to override the - * model's allowCallbacks setting. - * - * @var boolean - */ - protected $tempAllowCallbacks; - - /** - * Callbacks for beforeInsert - * - * @var array - */ - protected $beforeInsert = []; - /** - * Callbacks for afterInsert - * - * @var array - */ - protected $afterInsert = []; - /** - * Callbacks for beforeUpdate - * - * @var array - */ - protected $beforeUpdate = []; - /** - * Callbacks for afterUpdate - * - * @var array - */ - protected $afterUpdate = []; - /** - * Callbacks for afterFind - * - * @var array - */ - protected $afterFind = []; - /** - * Callbacks for beforeDelete - * - * @var array - */ - protected $beforeDelete = []; - /** - * Callbacks for afterDelete - * - * @var array - */ - protected $afterDelete = []; - - /** - * Holds information passed in via 'set' - * so that we can capture it (not the builder) - * and ensure it gets validated first. - * - * @var array - */ - protected $tempData = []; - - //-------------------------------------------------------------------- - - /** - * Model constructor. - * - * @param ConnectionInterface $db - * @param ValidationInterface $validation - */ - public function __construct(ConnectionInterface &$db = null, ValidationInterface $validation = null) - { - if ($db instanceof ConnectionInterface) - { - $this->db = & $db; - } - else - { - $this->db = Database::connect($this->DBGroup); - } - - $this->tempReturnType = $this->returnType; - $this->tempUseSoftDeletes = $this->useSoftDeletes; - $this->tempAllowCallbacks = $this->allowCallbacks; - - if (is_null($validation)) - { - $validation = \Config\Services::validation(null, false); - } - - $this->validation = $validation; - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // CRUD & FINDERS - //-------------------------------------------------------------------- - - /** - * Fetches the row of database from $this->table with a primary key - * matching $id. - * - * @param mixed|array|null $id One primary key or an array of primary keys - * - * @return array|object|null The resulting row of data, or null. - */ - public function find($id = null) - { - $builder = $this->builder(); - - if ($this->tempUseSoftDeletes === true) - { - $builder->where($this->table . '.' . $this->deletedField, null); - } - - if (is_array($id)) - { - $row = $builder->whereIn($this->table . '.' . $this->primaryKey, $id) - ->get(); - $row = $row->getResult($this->tempReturnType); - } - elseif (is_numeric($id) || is_string($id)) - { - $row = $builder->where($this->table . '.' . $this->primaryKey, $id) - ->get(); - - $row = $row->getFirstRow($this->tempReturnType); - } - else - { - $row = $builder->get(); - - $row = $row->getResult($this->tempReturnType); - } - - $eventData = $this->trigger('afterFind', ['id' => $id, 'data' => $row]); - - $this->tempReturnType = $this->returnType; - $this->tempUseSoftDeletes = $this->useSoftDeletes; - - return $eventData['data']; - } - - //-------------------------------------------------------------------- - - /** - * Fetches the column of database from $this->table - * - * @param string $columnName - * - * @return array|null The resulting row of data, or null if no data found. - * @throws \CodeIgniter\Database\Exceptions\DataException - */ - public function findColumn(string $columnName) - { - if (strpos($columnName, ',') !== false) - { - throw DataException::forFindColumnHaveMultipleColumns(); - } - - $resultSet = $this->select($columnName) - ->asArray() - ->find(); - - return (! empty($resultSet)) ? array_column($resultSet, $columnName) : null; - } - - //-------------------------------------------------------------------- - - /** - * Works with the current Query Builder instance to return - * all results, while optionally limiting them. - * - * @param integer $limit - * @param integer $offset - * - * @return array - */ - public function findAll(int $limit = 0, int $offset = 0) - { - $builder = $this->builder(); - - if ($this->tempUseSoftDeletes === true) - { - $builder->where($this->table . '.' . $this->deletedField, null); - } - - $row = $builder->limit($limit, $offset) - ->get(); - - $row = $row->getResult($this->tempReturnType); - - $eventData = $this->trigger('afterFind', ['data' => $row, 'limit' => $limit, 'offset' => $offset]); - - $this->tempReturnType = $this->returnType; - $this->tempUseSoftDeletes = $this->useSoftDeletes; - - return $eventData['data']; - } - - //-------------------------------------------------------------------- - - /** - * Returns the first row of the result set. Will take any previous - * Query Builder calls into account when determining the result set. - * - * @return array|object|null - */ - public function first() - { - $builder = $this->builder(); - - if ($this->tempUseSoftDeletes === true) - { - $builder->where($this->table . '.' . $this->deletedField, null); - } - else - { - if ($this->useSoftDeletes === true && empty($builder->QBGroupBy) && ! empty($this->primaryKey)) - { - $builder->groupBy($this->table . '.' . $this->primaryKey); - } - } - - // Some databases, like PostgreSQL, need order - // information to consistently return correct results. - if (! empty($builder->QBGroupBy) && empty($builder->QBOrderBy) && ! empty($this->primaryKey)) - { - $builder->orderBy($this->table . '.' . $this->primaryKey, 'asc'); - } - - $row = $builder->limit(1, 0) - ->get(); - - $row = $row->getFirstRow($this->tempReturnType); - - $eventData = $this->trigger('afterFind', ['data' => $row]); - - $this->tempReturnType = $this->returnType; - $this->tempUseSoftDeletes = $this->useSoftDeletes; - - return $eventData['data']; - } - - //-------------------------------------------------------------------- - - /** - * Captures the builder's set() method so that we can validate the - * data here. This allows it to be used with any of the other - * builder methods and still get validated data, like replace. - * - * @param mixed $key Field name, or an array of field/value pairs - * @param string $value Field value, if $key is a single field - * @param boolean $escape Whether to escape values and identifiers - * - * @return $this - */ - public function set($key, ?string $value = '', bool $escape = null) - { - $data = is_array($key) - ? $key - : [$key => $value]; - - $this->tempData['escape'] = $escape; - $this->tempData['data'] = array_merge($this->tempData['data'] ?? [], $data); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * A convenience method that will attempt to determine whether the - * data should be inserted or updated. Will work with either - * an array or object. When using with custom class objects, - * you must ensure that the class will provide access to the class - * variables, even if through a magic method. - * - * @param array|object $data - * - * @return boolean - * @throws \ReflectionException - */ - public function save($data): bool - { - if (empty($data)) - { - return true; - } - - if (is_object($data) && isset($data->{$this->primaryKey})) - { - $response = $this->update($data->{$this->primaryKey}, $data); - } - elseif (is_array($data) && ! empty($data[$this->primaryKey])) - { - $response = $this->update($data[$this->primaryKey], $data); - } - else - { - $response = $this->insert($data, false); - - if ($response instanceof BaseResult) - { - $response = $response->resultID !== false; - } - elseif ($response !== false) - { - $response = true; - } - } - - return $response; - } - - /** - * Takes a class an returns an array of it's public and protected - * properties as an array suitable for use in creates and updates. - * - * @param string|object $data - * @param string|null $primaryKey - * @param string $dateFormat - * @param boolean $onlyChanged - * - * @return array - * @throws \ReflectionException - */ - public static function classToArray($data, $primaryKey = null, string $dateFormat = 'datetime', bool $onlyChanged = true): array - { - if (method_exists($data, 'toRawArray')) - { - $properties = $data->toRawArray($onlyChanged); - - // Always grab the primary key otherwise updates will fail. - if (! empty($properties) && ! empty($primaryKey) && ! in_array($primaryKey, $properties) && ! empty($data->{$primaryKey})) - { - $properties[$primaryKey] = $data->{$primaryKey}; - } - } - else - { - $mirror = new ReflectionClass($data); - $props = $mirror->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED); - - $properties = []; - - // Loop over each property, - // saving the name/value in a new array we can return. - foreach ($props as $prop) - { - // Must make protected values accessible. - $prop->setAccessible(true); - $propName = $prop->getName(); - $properties[$propName] = $prop->getValue($data); - } - } - - // Convert any Time instances to appropriate $dateFormat - if ($properties) - { - foreach ($properties as $key => $value) - { - if ($value instanceof Time) - { - switch ($dateFormat) - { - case 'datetime': - $converted = $value->format('Y-m-d H:i:s'); - break; - case 'date': - $converted = $value->format('Y-m-d'); - break; - case 'int': - $converted = $value->getTimestamp(); - break; - default: - $converted = (string)$value; - } - - $properties[$key] = $converted; - } - } - } - - return $properties; - } - - //-------------------------------------------------------------------- - - /** - * Returns last insert ID or 0. - * - * @return integer - */ - public function getInsertID(): int - { - return $this->insertID; - } - - //-------------------------------------------------------------------- - - /** - * Inserts data into the current table. If an object is provided, - * it will attempt to convert it to an array. - * - * @param array|object $data - * @param boolean $returnID Whether insert ID should be returned or not. - * - * @return BaseResult|integer|string|false - * @throws \ReflectionException - */ - public function insert($data = null, bool $returnID = true) - { - $escape = null; - - $this->insertID = 0; - - if (empty($data)) - { - $data = $this->tempData['data'] ?? null; - $escape = $this->tempData['escape'] ?? null; - $this->tempData = []; - } - - if (empty($data)) - { - throw DataException::forEmptyDataset('insert'); - } - - // If $data is using a custom class with public or protected - // properties representing the table elements, we need to grab - // them as an array. - if (is_object($data) && ! $data instanceof stdClass) - { - $data = static::classToArray($data, $this->primaryKey, $this->dateFormat, false); - } - - // If it's still a stdClass, go ahead and convert to - // an array so doProtectFields and other model methods - // don't have to do special checks. - if (is_object($data)) - { - $data = (array) $data; - } - - if (empty($data)) - { - throw DataException::forEmptyDataset('insert'); - } - - // Validate data before saving. - if ($this->skipValidation === false) - { - if ($this->cleanRules()->validate($data) === false) - { - return false; - } - } - - // Must be called first so we don't - // strip out created_at values. - $data = $this->doProtectFields($data); - - // Set created_at and updated_at with same time - $date = $this->setDate(); - - if ($this->useTimestamps && ! empty($this->createdField) && ! array_key_exists($this->createdField, $data)) - { - $data[$this->createdField] = $date; - } - - if ($this->useTimestamps && ! empty($this->updatedField) && ! array_key_exists($this->updatedField, $data)) - { - $data[$this->updatedField] = $date; - } - - $eventData = $this->trigger('beforeInsert', ['data' => $data]); - - // Must use the set() method to ensure objects get converted to arrays - $result = $this->builder() - ->set($eventData['data'], '', $escape) - ->insert(); - - // If insertion succeeded then save the insert ID - if ($result->resultID) - { - $this->insertID = $this->db->insertID(); - } - - // Trigger afterInsert events with the inserted data and new ID - $this->trigger('afterInsert', ['id' => $this->insertID, 'data' => $eventData['data'], 'result' => $result]); - - // If insertion failed, get out of here - if (! $result) - { - return $result; - } - - // otherwise return the insertID, if requested. - return $returnID ? $this->insertID : $result; - } - - //-------------------------------------------------------------------- - - /** - * Compiles batch insert strings and runs the queries, validating each row prior. - * - * @param array $set An associative array of insert values - * @param boolean $escape Whether to escape values and identifiers - * @param integer $batchSize The size of the batch to run - * @param boolean $testing True means only number of records is returned, false will execute the query - * - * @return integer|boolean Number of rows inserted or FALSE on failure - */ - public function insertBatch(array $set = null, bool $escape = null, int $batchSize = 100, bool $testing = false) - { - if (is_array($set) && $this->skipValidation === false) - { - foreach ($set as $row) - { - if ($this->cleanRules()->validate($row) === false) - { - return false; - } - } - } - - return $this->builder()->testMode($testing)->insertBatch($set, $escape, $batchSize); - } - - //-------------------------------------------------------------------- - - /** - * Updates a single record in $this->table. If an object is provided, - * it will attempt to convert it into an array. - * - * @param integer|array|string $id - * @param array|object $data - * - * @return boolean - * @throws \ReflectionException - */ - public function update($id = null, $data = null): bool - { - $escape = null; - - if (is_numeric($id) || is_string($id)) - { - $id = [$id]; - } - - if (empty($data)) - { - $data = $this->tempData['data'] ?? null; - $escape = $this->tempData['escape'] ?? null; - $this->tempData = []; - } - - if (empty($data)) - { - throw DataException::forEmptyDataset('update'); - } - - // If $data is using a custom class with public or protected - // properties representing the table elements, we need to grab - // them as an array. - if (is_object($data) && ! $data instanceof stdClass) - { - $data = static::classToArray($data, $this->primaryKey, $this->dateFormat); - } - - // If it's still a stdClass, go ahead and convert to - // an array so doProtectFields and other model methods - // don't have to do special checks. - if (is_object($data)) - { - $data = (array) $data; - } - - // If it's still empty here, means $data is no change or is empty object - if (empty($data)) - { - throw DataException::forEmptyDataset('update'); - } - - // Validate data before saving. - if ($this->skipValidation === false) - { - if ($this->cleanRules(true)->validate($data) === false) - { - return false; - } - } - - // Must be called first so we don't - // strip out updated_at values. - $data = $this->doProtectFields($data); - - if ($this->useTimestamps && ! empty($this->updatedField) && ! array_key_exists($this->updatedField, $data)) - { - $data[$this->updatedField] = $this->setDate(); - } - - $eventData = $this->trigger('beforeUpdate', ['id' => $id, 'data' => $data]); - - $builder = $this->builder(); - - if ($id) - { - $builder = $builder->whereIn($this->table . '.' . $this->primaryKey, $id); - } - - // Must use the set() method to ensure objects get converted to arrays - $result = $builder - ->set($eventData['data'], '', $escape) - ->update(); - - $this->trigger('afterUpdate', ['id' => $id, 'data' => $eventData['data'], 'result' => $result]); - - return $result; - } - - //-------------------------------------------------------------------- - - /** - * Update_Batch - * - * Compiles an update string and runs the query - * - * @param array $set An associative array of update values - * @param string $index The where key - * @param integer $batchSize The size of the batch to run - * @param boolean $returnSQL True means SQL is returned, false will execute the query - * - * @return mixed Number of rows affected or FALSE on failure - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function updateBatch(array $set = null, string $index = null, int $batchSize = 100, bool $returnSQL = false) - { - if (is_array($set) && $this->skipValidation === false) - { - foreach ($set as $row) - { - if ($this->cleanRules(true)->validate($row) === false) - { - return false; - } - } - } - - return $this->builder()->testMode($returnSQL)->updateBatch($set, $index, $batchSize); - } - - //-------------------------------------------------------------------- - - /** - * Deletes a single record from $this->table where $id matches - * the table's primaryKey - * - * @param integer|string|array|null $id The rows primary key(s) - * @param boolean $purge Allows overriding the soft deletes setting. - * - * @return BaseResult|boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function delete($id = null, bool $purge = false) - { - if (! empty($id) && (is_numeric($id) || is_string($id))) - { - $id = [$id]; - } - - $builder = $this->builder(); - if (! empty($id)) - { - $builder = $builder->whereIn($this->primaryKey, $id); - } - - $this->trigger('beforeDelete', ['id' => $id, 'purge' => $purge]); - - if ($this->useSoftDeletes && ! $purge) - { - if (empty($builder->getCompiledQBWhere())) - { - if (CI_DEBUG) - { - throw new DatabaseException('Deletes are not allowed unless they contain a "where" or "like" clause.'); - } - // @codeCoverageIgnoreStart - return false; - // @codeCoverageIgnoreEnd - } - $set[$this->deletedField] = $this->setDate(); - - if ($this->useTimestamps && ! empty($this->updatedField)) - { - $set[$this->updatedField] = $this->setDate(); - } - - $result = $builder->update($set); - } - else - { - $result = $builder->delete(); - } - - $this->trigger('afterDelete', ['id' => $id, 'purge' => $purge, 'result' => $result, 'data' => null]); - - return $result; - } - - //-------------------------------------------------------------------- - - /** - * Permanently deletes all rows that have been marked as deleted - * through soft deletes (deleted = 1) - * - * @return boolean|mixed - */ - public function purgeDeleted() - { - if (! $this->useSoftDeletes) - { - return true; - } - - return $this->builder() - ->where($this->table . '.' . $this->deletedField . ' IS NOT NULL') - ->delete(); - } - - //-------------------------------------------------------------------- - - /** - * Sets $useSoftDeletes value so that we can temporarily override - * the softdeletes settings. Can be used for all find* methods. - * - * @param boolean $val - * - * @return Model - */ - public function withDeleted($val = true) - { - $this->tempUseSoftDeletes = ! $val; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Works with the find* methods to return only the rows that - * have been deleted. - * - * @return Model - */ - public function onlyDeleted() - { - $this->tempUseSoftDeletes = false; - - $this->builder() - ->where($this->table . '.' . $this->deletedField . ' IS NOT NULL'); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Replace - * - * Compiles an replace into string and runs the query - * - * @param null $data - * @param boolean $returnSQL - * - * @return mixed - */ - public function replace($data = null, bool $returnSQL = false) - { - // Validate data before saving. - if (! empty($data) && $this->skipValidation === false) - { - if ($this->cleanRules(true)->validate($data) === false) - { - return false; - } - } - - return $this->builder()->replace($data, $returnSQL); - } - - //-------------------------------------------------------------------- - // Utility - //-------------------------------------------------------------------- - - /** - * Sets the return type of the results to be as an associative array. - * - * @return Model - */ - public function asArray() - { - $this->tempReturnType = 'array'; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Sets the return type to be of the specified type of object. - * Defaults to a simple object, but can be any class that has - * class vars with the same name as the table columns, or at least - * allows them to be created. - * - * @param string $class - * - * @return Model - */ - public function asObject(string $class = 'object') - { - $this->tempReturnType = $class; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Loops over records in batches, allowing you to operate on them. - * Works with $this->builder to get the Compiled select to - * determine the rows to operate on. - * - * @param integer $size - * @param \Closure $userFunc - * - * @throws \CodeIgniter\Database\Exceptions\DataException - */ - public function chunk(int $size, Closure $userFunc) - { - $total = $this->builder() - ->countAllResults(false); - - $offset = 0; - - while ($offset <= $total) - { - $builder = clone($this->builder()); - - $rows = $builder->get($size, $offset); - - if ($rows === false) - { - throw DataException::forEmptyDataset('chunk'); - } - - $rows = $rows->getResult($this->tempReturnType); - - $offset += $size; - - if (empty($rows)) - { - continue; - } - - foreach ($rows as $row) - { - if ($userFunc($row) === false) - { - return; - } - } - } - } - - //-------------------------------------------------------------------- - - /** - * Works with $this->builder to get the Compiled Select to operate on. - * Expects a GET variable (?page=2) that specifies the page of results - * to display. - * - * @param integer $perPage - * @param string $group Will be used by the pagination library - * to identify a unique pagination set. - * @param integer $page Optional page number (useful when the page number is provided in different way) - * @param integer $segment Optional URI segment number (if page number is provided by URI segment) - * - * @return array|null - */ - public function paginate(int $perPage = null, string $group = 'default', int $page = null, int $segment = 0) - { - $pager = \Config\Services::pager(null, null, false); - - if ($segment) - { - $pager->setSegment($segment); - } - - $page = $page >= 1 ? $page : $pager->getCurrentPage($group); - - $total = $this->countAllResults(false); - - // Store it in the Pager library so it can be - // paginated in the views. - $this->pager = $pager->store($group, $page, $perPage, $total, $segment); - $perPage = $this->pager->getPerPage($group); - $offset = ($page - 1) * $perPage; - - return $this->findAll($perPage, $offset); - } - - //-------------------------------------------------------------------- - - /** - * Sets whether or not we should whitelist data set during - * updates or inserts against $this->availableFields. - * - * @param boolean $protect - * - * @return Model - */ - public function protect(bool $protect = true) - { - $this->protectFields = $protect; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Provides a shared instance of the Query Builder. - * - * @param string $table - * - * @return BaseBuilder - * @throws \CodeIgniter\Exceptions\ModelException; - */ - protected function builder(string $table = null) - { - if ($this->builder instanceof BaseBuilder) - { - return $this->builder; - } - - // We're going to force a primary key to exist - // so we don't have overly convoluted code, - // and future features are likely to require them. - if (empty($this->primaryKey)) - { - throw ModelException::forNoPrimaryKey(get_class($this)); - } - - $table = empty($table) ? $this->table : $table; - - // Ensure we have a good db connection - if (! $this->db instanceof BaseConnection) - { - $this->db = Database::connect($this->DBGroup); - } - - $this->builder = $this->db->table($table); - - return $this->builder; - } - - //-------------------------------------------------------------------- - - /** - * Ensures that only the fields that are allowed to be updated - * are in the data array. - * - * Used by insert() and update() to protect against mass assignment - * vulnerabilities. - * - * @param array $data - * - * @return array - * @throws \CodeIgniter\Database\Exceptions\DataException - */ - protected function doProtectFields(array $data): array - { - if ($this->protectFields === false) - { - return $data; - } - - if (empty($this->allowedFields)) - { - throw DataException::forInvalidAllowedFields(get_class($this)); - } - - if (is_array($data) && count($data)) - { - foreach ($data as $key => $val) - { - if (! in_array($key, $this->allowedFields)) - { - unset($data[$key]); - } - } - } - - return $data; - } - - //-------------------------------------------------------------------- - - /** - * A utility function to allow child models to use the type of - * date/time format that they prefer. This is primarily used for - * setting created_at, updated_at and deleted_at values, but can be - * used by inheriting classes. - * - * The available time formats are: - * - 'int' - Stores the date as an integer timestamp - * - 'datetime' - Stores the data in the SQL datetime format - * - 'date' - Stores the date (only) in the SQL date format. - * - * @param integer $userData An optional PHP timestamp to be converted. - * - * @return mixed - * @throws \CodeIgniter\Exceptions\ModelException; - */ - protected function setDate(int $userData = null) - { - $currentDate = is_numeric($userData) ? (int) $userData : time(); - - switch ($this->dateFormat) - { - case 'int': - return $currentDate; - case 'datetime': - return date('Y-m-d H:i:s', $currentDate); - case 'date': - return date('Y-m-d', $currentDate); - default: - throw ModelException::forNoDateFormat(get_class($this)); - } - } - - //-------------------------------------------------------------------- - - /** - * Specify the table associated with a model - * - * @param string $table - * - * @return Model - */ - public function setTable(string $table) - { - $this->table = $table; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Grabs the last error(s) that occurred. If data was validated, - * it will first check for errors there, otherwise will try to - * grab the last error from the Database connection. - * - * @param boolean $forceDB Always grab the db error, not validation - * - * @return array|null - */ - public function errors(bool $forceDB = false) - { - // Do we have validation errors? - if ($forceDB === false && $this->skipValidation === false) - { - $errors = $this->validation->getErrors(); - - if (! empty($errors)) - { - return $errors; - } - } - - // Still here? Grab the database-specific error, if any. - $error = $this->db->error(); - - return $error['message'] ?? null; - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // Validation - //-------------------------------------------------------------------- - - /** - * Set the value of the skipValidation flag. - * - * @param boolean $skip - * - * @return Model - */ - public function skipValidation(bool $skip = true) - { - $this->skipValidation = $skip; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Allows to set validation messages. - * It could be used when you have to change default or override current validate messages. - * - * @param array $validationMessages - * - * @return void - */ - public function setValidationMessages(array $validationMessages) - { - $this->validationMessages = $validationMessages; - } - //-------------------------------------------------------------------- - - /** - * Allows to set field wise validation message. - * It could be used when you have to change default or override current validate messages. - * - * @param string $field - * @param array $fieldMessages - * - * @return void - */ - public function setValidationMessage(string $field, array $fieldMessages) - { - $this->validationMessages[$field] = $fieldMessages; - } - - //-------------------------------------------------------------------- - - /** - * Allows to set validation rules. - * It could be used when you have to change default or override current validate rules. - * - * @param array $validationRules - * - * @return void - */ - public function setValidationRules(array $validationRules) - { - $this->validationRules = $validationRules; - } - - //-------------------------------------------------------------------- - - /** - * Allows to set field wise validation rules. - * It could be used when you have to change default or override current validate rules. - * - * @param string $field - * @param string|array $fieldRules - * - * @return void - */ - public function setValidationRule(string $field, $fieldRules) - { - $this->validationRules[$field] = $fieldRules; - } - - //-------------------------------------------------------------------- - - /** - * Should validation rules be removed before saving? - * Most handy when doing updates. - * - * @param boolean $choice - * - * @return $this - */ - public function cleanRules(bool $choice = false) - { - $this->cleanValidationRules = $choice; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Validate the data against the validation rules (or the validation group) - * specified in the class property, $validationRules. - * - * @param array|object $data - * - * @return boolean - */ - public function validate($data): bool - { - $rules = $this->getValidationRules(); - - if ($this->skipValidation === true || empty($rules) || empty($data)) - { - return true; - } - - // Query Builder works with objects as well as arrays, - // but validation requires array, so cast away. - if (is_object($data)) - { - $data = (array) $data; - } - - // ValidationRules can be either a string, which is the group name, - // or an array of rules. - if (is_string($rules)) - { - $rules = $this->validation->loadRuleGroup($rules); - } - - $rules = $this->cleanValidationRules - ? $this->cleanValidationRules($rules, $data) - : $rules; - - // If no data existed that needs validation - // our job is done here. - if (empty($rules)) - { - return true; - } - - $this->validation->setRules($rules, $this->validationMessages); - $valid = $this->validation->run($data, null, $this->DBGroup); - - return (bool) $valid; - } - - //-------------------------------------------------------------------- - - /** - * Removes any rules that apply to fields that have not been set - * currently so that rules don't block updating when only updating - * a partial row. - * - * @param array $rules - * - * @param array|null $data - * - * @return array - */ - protected function cleanValidationRules(array $rules, array $data = null): array - { - if (empty($data)) - { - return []; - } - - foreach ($rules as $field => $rule) - { - if (! array_key_exists($field, $data)) - { - unset($rules[$field]); - } - } - - return $rules; - } - - /** - * Replace any placeholders within the rules with the values that - * match the 'key' of any properties being set. For example, if - * we had the following $data array: - * - * [ 'id' => 13 ] - * - * and the following rule: - * - * 'required|is_unique[users,email,id,{id}]' - * - * The value of {id} would be replaced with the actual id in the form data: - * - * 'required|is_unique[users,email,id,13]' - * - * @codeCoverageIgnore - * - * @deprecated use fillPlaceholders($rules, $data) from Validation instead - * - * @param array $rules - * @param array $data - * - * @return array - */ - protected function fillPlaceholders(array $rules, array $data): array - { - $replacements = []; - - foreach ($data as $key => $value) - { - $replacements["{{$key}}"] = $value; - } - - if (! empty($replacements)) - { - foreach ($rules as &$rule) - { - if (is_array($rule)) - { - foreach ($rule as &$row) - { - // Should only be an `errors` array - // which doesn't take placeholders. - if (is_array($row)) - { - continue; - } - - $row = strtr($row, $replacements); - } - continue; - } - - $rule = strtr($rule, $replacements); - } - } - - return $rules; - } - - //-------------------------------------------------------------------- - - /** - * Returns the model's defined validation rules so that they - * can be used elsewhere, if needed. - * - * @param array $options - * - * @return array - */ - public function getValidationRules(array $options = []): array - { - $rules = $this->validationRules; - - // ValidationRules can be either a string, which is the group name, - // or an array of rules. - if (is_string($rules)) - { - $rules = $this->validation->loadRuleGroup($rules); - } - - if (isset($options['except'])) - { - $rules = array_diff_key($rules, array_flip($options['except'])); - } - elseif (isset($options['only'])) - { - $rules = array_intersect_key($rules, array_flip($options['only'])); - } - - return $rules; - } - - //-------------------------------------------------------------------- - - /** - * Returns the model's define validation messages so they - * can be used elsewhere, if needed. - * - * @return array - */ - public function getValidationMessages(): array - { - return $this->validationMessages; - } - - //-------------------------------------------------------------------- - - /** - * Override countAllResults to account for soft deleted accounts. - * - * @param boolean $reset - * @param boolean $test - * - * @return mixed - */ - public function countAllResults(bool $reset = true, bool $test = false) - { - if ($this->tempUseSoftDeletes === true) - { - $this->builder()->where($this->table . '.' . $this->deletedField, null); - } - - // When $reset === false, the $tempUseSoftDeletes will be - // dependant on $useSoftDeletes value because we don't - // want to add the same "where" condition for the second time - $this->tempUseSoftDeletes = ($reset === true) - ? $this->useSoftDeletes - : ($this->useSoftDeletes === true - ? false - : $this->useSoftDeletes); - - return $this->builder()->testMode($test)->countAllResults($reset); - } - - /** - * Sets $tempAllowCallbacks value so that we can temporarily override - * the setting. Resets after the next trigger. - * - * @param boolean $val - * - * @return Model - */ - public function allowCallbacks(bool $val = true) - { - $this->tempAllowCallbacks = $val; - - return $this; - } - - /** - * A simple event trigger for Model Events that allows additional - * data manipulation within the model. Specifically intended for - * usage by child models this can be used to format data, - * save/load related classes, etc. - * - * It is the responsibility of the callback methods to return - * the data itself. - * - * Each $eventData array MUST have a 'data' key with the relevant - * data for callback methods (like an array of key/value pairs to insert - * or update, an array of results, etc) - * - * If callbacks are not allowed then returns $eventData immediately. - * - * @param string $event - * @param array $eventData - * - * @return mixed - * @throws \CodeIgniter\Database\Exceptions\DataException - */ - protected function trigger(string $event, array $eventData) - { - $allowed = $this->tempAllowCallbacks; - $this->tempAllowCallbacks = $this->allowCallbacks; - - if (! $allowed) - { - return $eventData; - } - - // Ensure it's a valid event - if (! isset($this->{$event}) || empty($this->{$event})) - { - return $eventData; - } - - foreach ($this->{$event} as $callback) - { - if (! method_exists($this, $callback)) - { - throw DataException::forInvalidMethodTriggered($callback); - } - - $eventData = $this->{$callback}($eventData); - } - - return $eventData; - } - - //-------------------------------------------------------------------- - - //-------------------------------------------------------------------- - // Magic - //-------------------------------------------------------------------- - - /** - * Provides/instantiates the builder/db connection and model's table/primary key names and return type. - * - * @param string $name - * - * @return mixed - */ - public function __get(string $name) - { - if (property_exists($this, $name)) - { - return $this->{$name}; - } - elseif (isset($this->db->$name)) - { - return $this->db->$name; - } - elseif (isset($this->builder()->$name)) - { - return $this->builder()->$name; - } - - return null; - } - - /** - * Checks for the existence of properties across this model, builder, and db connection. - * - * @param string $name - * - * @return boolean - */ - public function __isset(string $name): bool - { - if (property_exists($this, $name)) - { - return true; - } - elseif (isset($this->db->$name)) - { - return true; - } - elseif (isset($this->builder()->$name)) - { - return true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Provides direct access to method in the builder (if available) - * and the database connection. - * - * @param string $name - * @param array $params - * - * @return Model|null - */ - public function __call(string $name, array $params) - { - $result = null; - - if (method_exists($this->db, $name)) - { - $result = $this->db->$name(...$params); - } - elseif (method_exists($builder = $this->builder(), $name)) - { - $result = $builder->$name(...$params); - } - - // Don't return the builder object unless specifically requested - //, since that will interrupt the usability flow - // and break intermingling of model and builder methods. - if ($name !== 'builder' && empty($result)) - { - if (! method_exists($this->builder(), $name)) - { - $className = get_class($this); - throw new \BadMethodCallException("Call to undefined method $className::$name"); - } - return $result; - } - if ($name !== 'builder' && ! $result instanceof BaseBuilder) - { - return $result; - } - - return $this; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Modules/Modules.php b/vendor/codeigniter4/framework/system/Modules/Modules.php deleted file mode 100644 index 73d6835..0000000 --- a/vendor/codeigniter4/framework/system/Modules/Modules.php +++ /dev/null @@ -1,88 +0,0 @@ -enabled) - { - return false; - } - - return in_array(strtolower($alias), $this->aliases); - } -} diff --git a/vendor/codeigniter4/framework/system/Pager/Exceptions/PagerException.php b/vendor/codeigniter4/framework/system/Pager/Exceptions/PagerException.php deleted file mode 100644 index fe2b62c..0000000 --- a/vendor/codeigniter4/framework/system/Pager/Exceptions/PagerException.php +++ /dev/null @@ -1,17 +0,0 @@ -config = $config; - $this->view = $view; - } - - //-------------------------------------------------------------------- - - /** - * Handles creating and displaying the - * - * @param string $group - * @param string $template The output template alias to render. - * - * @return string - */ - public function links(string $group = 'default', string $template = 'default_full'): string - { - $this->ensureGroup($group); - - return $this->displayLinks($group, $template); - } - - //-------------------------------------------------------------------- - - /** - * Creates simple Next/Previous links, instead of full pagination. - * - * @param string $group - * @param string $template - * - * @return string - */ - public function simpleLinks(string $group = 'default', string $template = 'default_simple'): string - { - $this->ensureGroup($group); - - return $this->displayLinks($group, $template); - } - - //-------------------------------------------------------------------- - - /** - * Allows for a simple, manual, form of pagination where all of the data - * is provided by the user. The URL is the current URI. - * - * @param integer $page - * @param integer $perPage - * @param integer $total - * @param string $template The output template alias to render. - * @param integer $segment (if page number is provided by URI segment) - * - * @param string $group optional group (i.e. if we'd like to define custom path) - * @return string - */ - public function makeLinks(int $page, int $perPage = null, int $total, string $template = 'default_full', int $segment = 0, ?string $group = 'default'): string - { - $group = $group === '' ? 'default' : $group; - - $this->store($group, $page, $perPage ?? $this->config->perPage, $total, $segment); - - return $this->displayLinks($group, $template); - } - - //-------------------------------------------------------------------- - - /** - * Does the actual work of displaying the view file. Used internally - * by links(), simpleLinks(), and makeLinks(). - * - * @param string $group - * @param string $template - * - * @return string - */ - protected function displayLinks(string $group, string $template): string - { - $pager = new PagerRenderer($this->getDetails($group)); - - if (! array_key_exists($template, $this->config->templates)) - { - throw PagerException::forInvalidTemplate($template); - } - - return $this->view->setVar('pager', $pager) - ->render($this->config->templates[$template]); - } - - //-------------------------------------------------------------------- - - /** - * Stores a set of pagination data for later display. Most commonly used - * by the model to automate the process. - * - * @param string $group - * @param integer $page - * @param integer $perPage - * @param integer $total - * @param integer $segment - * - * @return $this - */ - public function store(string $group, int $page, int $perPage = null, int $total, int $segment = 0) - { - if ($segment) - { - $this->setSegment($segment, $group); - } - - $this->ensureGroup($group, $perPage); - - if ($segment > 0 && $this->groups[$group]['currentPage'] > 0) - { - $page = $this->groups[$group]['currentPage']; - } - - $perPage = $perPage ?? $this->config->perPage; - $pageCount = (int)ceil($total / $perPage); - $this->groups[$group]['currentPage'] = $page > $pageCount ? $pageCount : $page; - $this->groups[$group]['perPage'] = $perPage; - $this->groups[$group]['total'] = $total; - $this->groups[$group]['pageCount'] = $pageCount; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Sets segment for a group. - * - * @param integer $number - * @param string $group - * - * @return mixed - */ - public function setSegment(int $number, string $group = 'default') - { - $this->segment[$group] = $number; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Sets the path that an aliased group of links will use. - * - * @param string $path - * @param string $group - * - * @return mixed - */ - public function setPath(string $path, string $group = 'default') - { - $this->ensureGroup($group); - - $this->groups[$group]['uri']->setPath($path); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the total number of pages. - * - * @param string|null $group - * - * @return integer - */ - public function getPageCount(string $group = 'default'): int - { - $this->ensureGroup($group); - - return $this->groups[$group]['pageCount']; - } - - //-------------------------------------------------------------------- - - /** - * Returns the number of the current page of results. - * - * @param string|null $group - * - * @return integer - */ - public function getCurrentPage(string $group = 'default'): int - { - $this->ensureGroup($group); - - return $this->groups[$group]['currentPage'] ?: 1; - } - - //-------------------------------------------------------------------- - - /** - * Tells whether this group of results has any more pages of results. - * - * @param string|null $group - * - * @return boolean - */ - public function hasMore(string $group = 'default'): bool - { - $this->ensureGroup($group); - - return ($this->groups[$group]['currentPage'] * $this->groups[$group]['perPage']) < $this->groups[$group]['total']; - } - - //-------------------------------------------------------------------- - - /** - * Returns the last page, if we have a total that we can calculate with. - * - * @param string $group - * - * @return integer|null - */ - public function getLastPage(string $group = 'default') - { - $this->ensureGroup($group); - - if (! is_numeric($this->groups[$group]['total']) || ! is_numeric($this->groups[$group]['perPage'])) - { - return null; - } - - return (int)ceil($this->groups[$group]['total'] / $this->groups[$group]['perPage']); - } - - //-------------------------------------------------------------------- - - /** - * Determines the first page # that should be shown. - * - * @param string $group - * - * @return integer - */ - public function getFirstPage(string $group = 'default'): int - { - $this->ensureGroup($group); - - // @todo determine based on a 'surroundCount' value - return 1; - } - - //-------------------------------------------------------------------- - - /** - * Returns the URI for a specific page for the specified group. - * - * @param integer|null $page - * @param string $group - * @param boolean $returnObject - * - * @return string|\CodeIgniter\HTTP\URI - */ - public function getPageURI(int $page = null, string $group = 'default', bool $returnObject = false) - { - $this->ensureGroup($group); - - /** - * @var \CodeIgniter\HTTP\URI $uri - */ - $uri = $this->groups[$group]['uri']; - - $segment = $this->segment[$group] ?? 0; - - if ($segment) - { - $uri->setSegment($segment, $page); - } - else - { - $uri->addQuery($this->groups[$group]['pageSelector'], $page); - } - - if ($this->only) - { - $query = array_intersect_key($_GET, array_flip($this->only)); - - if (! $segment) - { - $query[$this->groups[$group]['pageSelector']] = $page; - } - - $uri->setQueryArray($query); - } - - return $returnObject === true ? $uri : (string) $uri; - } - - //-------------------------------------------------------------------- - - /** - * Returns the full URI to the next page of results, or null. - * - * @param string $group - * @param boolean $returnObject - * - * @return string|null - */ - public function getNextPageURI(string $group = 'default', bool $returnObject = false) - { - $this->ensureGroup($group); - - $last = $this->getLastPage($group); - $curr = $this->getCurrentPage($group); - $page = null; - - if (! empty($last) && ! empty($curr) && $last === $curr) - { - return null; - } - - if ($last > $curr) - { - $page = $curr + 1; - } - - return $this->getPageURI($page, $group, $returnObject); - } - - //-------------------------------------------------------------------- - - /** - * Returns the full URL to the previous page of results, or null. - * - * @param string $group - * @param boolean $returnObject - * - * @return string|null - */ - public function getPreviousPageURI(string $group = 'default', bool $returnObject = false) - { - $this->ensureGroup($group); - - $first = $this->getFirstPage($group); - $curr = $this->getCurrentPage($group); - $page = null; - - if (! empty($first) && ! empty($curr) && $first === $curr) - { - return null; - } - - if ($first < $curr) - { - $page = $curr - 1; - } - - return $this->getPageURI($page, $group, $returnObject); - } - - //-------------------------------------------------------------------- - - /** - * Returns the number of results per page that should be shown. - * - * @param string $group - * - * @return integer - */ - public function getPerPage(string $group = 'default'): int - { - $this->ensureGroup($group); - - return (int) $this->groups[$group]['perPage']; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array with details about the results, including - * total, per_page, current_page, last_page, next_url, prev_url, from, to. - * Does not include the actual data. This data is suitable for adding - * a 'data' object to with the result set and converting to JSON. - * - * @param string $group - * - * @return array - */ - public function getDetails(string $group = 'default'): array - { - if (! array_key_exists($group, $this->groups)) - { - throw PagerException::forInvalidPaginationGroup($group); - } - - $newGroup = $this->groups[$group]; - - $newGroup['next'] = $this->getNextPageURI($group); - $newGroup['previous'] = $this->getPreviousPageURI($group); - $newGroup['segment'] = $this->segment[$group] ?? 0; - - return $newGroup; - } - - //-------------------------------------------------------------------- - - /** - * Sets only allowed queries on pagination links. - * - * @param array $queries - * - * @return Pager - */ - public function only(array $queries):Pager - { - $this->only = $queries; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Ensures that an array exists for the group specified. - * - * @param string $group - * @param integer $perPage - */ - protected function ensureGroup(string $group, int $perPage = null) - { - if (array_key_exists($group, $this->groups)) - { - return; - } - - $this->groups[$group] = [ - 'uri' => clone current_url(true), - 'hasMore' => false, - 'total' => null, - 'perPage' => $perPage ?? $this->config->perPage, - 'pageCount' => 1, - 'pageSelector' => $group === 'default' ? 'page' : 'page_' . $group, - ]; - - $this->calculateCurrentPage($group); - - if ($_GET) - { - $this->groups[$group]['uri'] = $this->groups[$group]['uri']->setQueryArray($_GET); - } - } - - //-------------------------------------------------------------------- - - /** - * Calculating the current page - * - * @param string $group - */ - protected function calculateCurrentPage(string $group) - { - if (array_key_exists($group, $this->segment)) - { - try - { - $this->groups[$group]['currentPage'] = (int) $this->groups[$group]['uri']->setSilent(false)->getSegment($this->segment[$group]); - } - catch (\CodeIgniter\HTTP\Exceptions\HTTPException $e) - { - $this->groups[$group]['currentPage'] = 1; - } - } - else - { - $pageSelector = $this->groups[$group]['pageSelector']; - - $page = (int) ($_GET[$pageSelector] ?? 1); - - $this->groups[$group]['currentPage'] = $page < 1 ? 1 : $page; - } - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Pager/PagerInterface.php b/vendor/codeigniter4/framework/system/Pager/PagerInterface.php deleted file mode 100644 index 9f975b5..0000000 --- a/vendor/codeigniter4/framework/system/Pager/PagerInterface.php +++ /dev/null @@ -1,228 +0,0 @@ -first = 1; - $this->last = $details['pageCount']; - $this->current = $details['currentPage']; - $this->total = $details['total']; - $this->uri = $details['uri']; - $this->pageCount = $details['pageCount']; - $this->segment = $details['segment'] ?? 0; - $this->pageSelector = $details['pageSelector'] ?? 'page'; - } - - //-------------------------------------------------------------------- - - /** - * Sets the total number of links that should appear on either - * side of the current page. Adjusts the first and last counts - * to reflect it. - * - * @param integer|null $count - * - * @return PagerRenderer - */ - public function setSurroundCount(int $count = null) - { - $this->updatePages($count); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Checks to see if there is a "previous" page before our "first" page. - * - * @return boolean - */ - public function hasPrevious(): bool - { - return $this->first > 1; - } - - //-------------------------------------------------------------------- - - /** - * Returns a URL to the "previous" page. The previous page is NOT the - * page before the current page, but is the page just before the - * "first" page. - * - * You MUST call hasPrevious() first, or this value may be invalid. - * - * @return string|null - */ - public function getPrevious() - { - if (! $this->hasPrevious()) - { - return null; - } - - $uri = clone $this->uri; - - if ($this->segment === 0) - { - $uri->addQuery($this->pageSelector, $this->first - 1); - } - else - { - $uri->setSegment($this->segment, $this->first - 1); - } - - return (string) $uri; - } - - //-------------------------------------------------------------------- - - /** - * Checks to see if there is a "next" page after our "last" page. - * - * @return boolean - */ - public function hasNext(): bool - { - return $this->pageCount > $this->last; - } - - //-------------------------------------------------------------------- - - /** - * Returns a URL to the "next" page. The next page is NOT, the - * page after the current page, but is the page that follows the - * "last" page. - * - * You MUST call hasNext() first, or this value may be invalid. - * - * @return string|null - */ - public function getNext() - { - if (! $this->hasNext()) - { - return null; - } - - $uri = clone $this->uri; - - if ($this->segment === 0) - { - $uri->addQuery($this->pageSelector, $this->last + 1); - } - else - { - $uri->setSegment($this->segment, $this->last + 1); - } - - return (string) $uri; - } - - //-------------------------------------------------------------------- - - /** - * Returns the URI of the first page. - * - * @return string - */ - public function getFirst(): string - { - $uri = clone $this->uri; - - if ($this->segment === 0) - { - $uri->addQuery($this->pageSelector, 1); - } - else - { - $uri->setSegment($this->segment, 1); - } - - return (string) $uri; - } - - //-------------------------------------------------------------------- - - /** - * Returns the URI of the last page. - * - * @return string - */ - public function getLast(): string - { - $uri = clone $this->uri; - - if ($this->segment === 0) - { - $uri->addQuery($this->pageSelector, $this->pageCount); - } - else - { - $uri->setSegment($this->segment, $this->pageCount); - } - - return (string) $uri; - } - - //-------------------------------------------------------------------- - - /** - * Returns the URI of the current page. - * - * @return string - */ - public function getCurrent(): string - { - $uri = clone $this->uri; - - if ($this->segment === 0) - { - $uri->addQuery($this->pageSelector, $this->current); - } - else - { - $uri->setSegment($this->segment, $this->current); - } - - return (string) $uri; - } - - //-------------------------------------------------------------------- - - /** - * Returns an array of links that should be displayed. Each link - * is represented by another array containing of the URI the link - * should go to, the title (number) of the link, and a boolean - * value representing whether this link is active or not. - * - * @return array - */ - public function links(): array - { - $links = []; - - $uri = clone $this->uri; - - for ($i = $this->first; $i <= $this->last; $i ++) - { - $links[] = [ - 'uri' => (string) ($this->segment === 0 ? $uri->addQuery($this->pageSelector, $i) : $uri->setSegment($this->segment, $i)), - 'title' => (int) $i, - 'active' => ($i === $this->current), - ]; - } - - return $links; - } - - //-------------------------------------------------------------------- - - /** - * Updates the first and last pages based on $surroundCount, - * which is the number of links surrounding the active page - * to show. - * - * @param integer|null $count The new "surroundCount" - */ - protected function updatePages(int $count = null) - { - if (is_null($count)) - { - return; - } - - $this->first = $this->current - $count > 0 ? (int) ($this->current - $count) : 1; - $this->last = $this->current + $count <= $this->pageCount ? (int) ($this->current + $count) : (int) $this->pageCount; - } - - //-------------------------------------------------------------------- - - /** - * Checks to see if there is a "previous" page before our "first" page. - * - * @return boolean - */ - public function hasPreviousPage(): bool - { - return $this->current > 1; - } - - //-------------------------------------------------------------------- - - /** - * Returns a URL to the "previous" page. - * - * You MUST call hasPreviousPage() first, or this value may be invalid. - * - * @return string|null - */ - public function getPreviousPage() - { - if (! $this->hasPreviousPage()) - { - return null; - } - - $uri = clone $this->uri; - - if ($this->segment === 0) - { - $uri->addQuery($this->pageSelector, $this->current - 1); - } - else - { - $uri->setSegment($this->segment, $this->current - 1); - } - - return (string) $uri; - } - - //-------------------------------------------------------------------- - - /** - * Checks to see if there is a "next" page after our "last" page. - * - * @return boolean - */ - public function hasNextPage(): bool - { - return $this->current < $this->last; - } - - //-------------------------------------------------------------------- - - /** - * Returns a URL to the "next" page. - * - * You MUST call hasNextPage() first, or this value may be invalid. - * - * @return string|null - */ - public function getNextPage() - { - if (! $this->hasNextPage()) - { - return null; - } - - $uri = clone $this->uri; - - if ($this->segment === 0) - { - $uri->addQuery($this->pageSelector, $this->current + 1); - } - else - { - $uri->setSegment($this->segment, $this->current + 1); - } - - return (string) $uri; - } -} diff --git a/vendor/codeigniter4/framework/system/Pager/Views/default_full.php b/vendor/codeigniter4/framework/system/Pager/Views/default_full.php deleted file mode 100644 index ef446e9..0000000 --- a/vendor/codeigniter4/framework/system/Pager/Views/default_full.php +++ /dev/null @@ -1,46 +0,0 @@ -setSurroundCount(2); -?> - - diff --git a/vendor/codeigniter4/framework/system/Pager/Views/default_head.php b/vendor/codeigniter4/framework/system/Pager/Views/default_head.php deleted file mode 100644 index 8f9dc69..0000000 --- a/vendor/codeigniter4/framework/system/Pager/Views/default_head.php +++ /dev/null @@ -1,18 +0,0 @@ -setSurroundCount(0); - -if ($pager->hasPrevious()) -{ - echo '' . PHP_EOL; -} - -echo '' . PHP_EOL; - -if ($pager->hasNext()) -{ - echo '' . PHP_EOL; -} diff --git a/vendor/codeigniter4/framework/system/Pager/Views/default_simple.php b/vendor/codeigniter4/framework/system/Pager/Views/default_simple.php deleted file mode 100644 index 3bfa8d9..0000000 --- a/vendor/codeigniter4/framework/system/Pager/Views/default_simple.php +++ /dev/null @@ -1,21 +0,0 @@ -setSurroundCount(0); -?> - diff --git a/vendor/codeigniter4/framework/system/RESTful/ResourceController.php b/vendor/codeigniter4/framework/system/RESTful/ResourceController.php deleted file mode 100644 index d13218c..0000000 --- a/vendor/codeigniter4/framework/system/RESTful/ResourceController.php +++ /dev/null @@ -1,203 +0,0 @@ -setModel($this->modelName); - } - - //-------------------------------------------------------------------- - - /** - * Return an array of resource objects, themselves in array format - * - * @return array an array - */ - public function index() - { - return $this->fail(lang('RESTful.notImplemented', ['index']), 501); - } - - /** - * Return the properties of a resource object - * - * @return array an array - */ - public function show($id = null) - { - return $this->fail(lang('RESTful.notImplemented', ['show']), 501); - } - - /** - * Return a new resource object, with default properties - * - * @return array an array - */ - public function new() - { - return $this->fail(lang('RESTful.notImplemented', ['new']), 501); - } - - /** - * Create a new resource object, from "posted" parameters - * - * @return array an array - */ - public function create() - { - return $this->fail(lang('RESTful.notImplemented', ['create']), 501); - } - - /** - * Return the editable properties of a resource object - * - * @return array an array - */ - public function edit($id = null) - { - return $this->fail(lang('RESTful.notImplemented', ['edit']), 501); - } - - /** - * Add or update a model resource, from "posted" properties - * - * @return array an array - */ - public function update($id = null) - { - return $this->fail(lang('RESTful.notImplemented', ['update']), 501); - } - - /** - * Delete the designated resource object from the model - * - * @return array an array - */ - public function delete($id = null) - { - return $this->fail(lang('RESTful.notImplemented', ['delete']), 501); - } - - //-------------------------------------------------------------------- - - /** - * Set or change the model this controller is bound to. - * Given either the name or the object, determine the other. - * - * @param string|object $which - */ - public function setModel($which = null) - { - // save what we have been given - if (! empty($which)) - { - if (is_object($which)) - { - $this->model = $which; - } - else - { - $this->modelName = $which; - } - } - - // make a model object if needed - if (empty($this->model) && ! empty($this->modelName)) - { - if (class_exists($this->modelName)) - { - $this->model = model($this->modelName); - } - } - - // determine model name if needed - if (empty($this->modelName) && ! empty($this->model)) - { - $this->modelName = get_class($this->model); - } - } - - /** - * Set/change the expected response representation for returned objects - * - * @param string $format - */ - public function setFormat(string $format = 'json') - { - if (in_array($format, ['json', 'xml'])) - { - $this->format = $format; - } - } - -} diff --git a/vendor/codeigniter4/framework/system/RESTful/ResourcePresenter.php b/vendor/codeigniter4/framework/system/RESTful/ResourcePresenter.php deleted file mode 100644 index 91fdeb0..0000000 --- a/vendor/codeigniter4/framework/system/RESTful/ResourcePresenter.php +++ /dev/null @@ -1,206 +0,0 @@ -setModel($this->modelName); - } - - //-------------------------------------------------------------------- - - /** - * Present a view of resource objects - * - * @return string - */ - public function index() - { - return lang('RESTful.notImplemented', ['index']); - } - - /** - * Present a view to present a specific resource object - * - * @param type $id - * @return string - */ - public function show($id = null) - { - return lang('RESTful.notImplemented', ['show']); - } - - /** - * Present a view to present a new single resource object - * - * @return string - */ - public function new() - { - return lang('RESTful.notImplemented', ['new']); - } - - /** - * Process the creation/insertion of a new resource object. - * This should be a POST. - * - * @return string - */ - public function create() - { - return lang('RESTful.notImplemented', ['create']); - } - - /** - * Present a view to confirm the deletion of a specific resource object - * - * @param type $id - * @return string - */ - public function remove($id = null) - { - return lang('RESTful.notImplemented', ['remove']); - } - - /** - * Process the deletion of a specific resource object - * - * @param type $id - * @return string - */ - public function delete($id = null) - { - return lang('RESTful.notImplemented', ['delete']); - } - - /** - * Present a view to edit the properties of a specific resource object - * - * @param type $id - * @return string - */ - public function edit($id = null) - { - return lang('RESTful.notImplemented', ['edit']); - } - - /** - * Process the updating, full or partial, of a specific resource object. - * This should be a POST. - * - * @param type $id - * @return string - */ - public function update($id = null) - { - return lang('RESTful.notImplemented', ['update']); - } - - //-------------------------------------------------------------------- - - /** - * Set or change the model this controller is bound to. - * Given either the name or the object, determine the other. - * - * @param string|object $which - */ - public function setModel($which = null) - { - // save what we have been given - if (! empty($which)) - { - if (is_object($which)) - { - $this->model = $which; - $this->modelName = null; - } - else - { - $this->model = null; - $this->modelName = $which; - } - } - - // make a model object if needed - if (empty($this->model) && ! empty($this->modelName)) - { - if (class_exists($this->modelName)) - { - $this->model = model($this->modelName); - } - } - - // determine model name if needed - if (empty($this->modelName) && ! empty($this->model)) - { - $this->modelName = get_class($this->model); - } - } - -} diff --git a/vendor/codeigniter4/framework/system/Router/Exceptions/RedirectException.php b/vendor/codeigniter4/framework/system/Router/Exceptions/RedirectException.php deleted file mode 100644 index 6114207..0000000 --- a/vendor/codeigniter4/framework/system/Router/Exceptions/RedirectException.php +++ /dev/null @@ -1,53 +0,0 @@ - '.*', - 'segment' => '[^/]+', - 'alphanum' => '[a-zA-Z0-9]+', - 'num' => '[0-9]+', - 'alpha' => '[a-zA-Z]+', - 'hash' => '[^/]+', - ]; - - /** - * An array of all routes and their mappings. - * - * @var array - */ - protected $routes = [ - '*' => [], - 'options' => [], - 'get' => [], - 'head' => [], - 'post' => [], - 'put' => [], - 'delete' => [], - 'trace' => [], - 'connect' => [], - 'cli' => [], - ]; - - /** - * Array of routes options - * - * @var array - */ - protected $routesOptions = []; - - /** - * The current method that the script is being called by. - * - * @var string - */ - protected $HTTPVerb; - - /** - * The default list of HTTP methods (and CLI for command line usage) - * that is allowed if no other method is provided. - * - * @var array - */ - protected $defaultHTTPMethods = [ - 'options', - 'get', - 'head', - 'post', - 'put', - 'delete', - 'trace', - 'connect', - 'cli', - ]; - - /** - * The name of the current group, if any. - * - * @var string - */ - protected $group; - - /** - * The current subdomain. - * - * @var string - */ - protected $currentSubdomain; - - /** - * Stores copy of current options being - * applied during creation. - * - * @var null - */ - protected $currentOptions; - - /** - * A little performance booster. - * - * @var boolean - */ - protected $didDiscover = false; - - /** - * Handle to the file locator to use. - * - * @var \CodeIgniter\Autoloader\FileLocator - */ - protected $fileLocator; - - /** - * Handle to the modules config. - * - * @var \Config\Modules - */ - protected $moduleConfig; - - //-------------------------------------------------------------------- - - /** - * Constructor - * - * @param \CodeIgniter\Autoloader\FileLocator $locator - * @param \Config\Modules $moduleConfig - */ - public function __construct(FileLocator $locator, $moduleConfig) - { - $this->fileLocator = $locator; - $this->moduleConfig = $moduleConfig; - } - - //-------------------------------------------------------------------- - - /** - * Registers a new constraint with the system. Constraints are used - * by the routes as placeholders for regular expressions to make defining - * the routes more human-friendly. - * - * You can pass an associative array as $placeholder, and have - * multiple placeholders added at once. - * - * @param string|array $placeholder - * @param string $pattern - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function addPlaceholder($placeholder, string $pattern = null): RouteCollectionInterface - { - if (! is_array($placeholder)) - { - $placeholder = [$placeholder => $pattern]; - } - - $this->placeholders = array_merge($this->placeholders, $placeholder); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Sets the default namespace to use for Controllers when no other - * namespace has been specified. - * - * @param string $value - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function setDefaultNamespace(string $value): RouteCollectionInterface - { - $this->defaultNamespace = filter_var($value, FILTER_SANITIZE_STRING); - $this->defaultNamespace = rtrim($this->defaultNamespace, '\\') . '\\'; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Sets the default controller to use when no other controller has been - * specified. - * - * @param string $value - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function setDefaultController(string $value): RouteCollectionInterface - { - $this->defaultController = filter_var($value, FILTER_SANITIZE_STRING); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Sets the default method to call on the controller when no other - * method has been set in the route. - * - * @param string $value - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function setDefaultMethod(string $value): RouteCollectionInterface - { - $this->defaultMethod = filter_var($value, FILTER_SANITIZE_STRING); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Tells the system whether to convert dashes in URI strings into - * underscores. In some search engines, including Google, dashes - * create more meaning and make it easier for the search engine to - * find words and meaning in the URI for better SEO. But it - * doesn't work well with PHP method names.... - * - * @param boolean $value - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function setTranslateURIDashes(bool $value): RouteCollectionInterface - { - $this->translateURIDashes = $value; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * If TRUE, the system will attempt to match the URI against - * Controllers by matching each segment against folders/files - * in APPPATH/Controllers, when a match wasn't found against - * defined routes. - * - * If FALSE, will stop searching and do NO automatic routing. - * - * @param boolean $value - * - * @return RouteCollectionInterface - */ - public function setAutoRoute(bool $value): RouteCollectionInterface - { - $this->autoRoute = $value; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Sets the class/method that should be called if routing doesn't - * find a match. It can be either a closure or the controller/method - * name exactly like a route is defined: Users::index - * - * This setting is passed to the Router class and handled there. - * - * @param callable|null $callable - * - * @return RouteCollectionInterface - */ - public function set404Override($callable = null): RouteCollectionInterface - { - $this->override404 = $callable; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the 404 Override setting, which can be null, a closure - * or the controller/string. - * - * @return string|\Closure|null - */ - public function get404Override() - { - return $this->override404; - } - - //-------------------------------------------------------------------- - - /** - * Will attempt to discover any additional routes, either through - * the local PSR4 namespaces, or through selected Composer packages. - */ - protected function discoverRoutes() - { - if ($this->didDiscover) - { - return; - } - - // We need this var in local scope - // so route files can access it. - $routes = $this; - - if ($this->moduleConfig->shouldDiscover('routes')) - { - $files = $this->fileLocator->search('Config/Routes.php'); - - foreach ($files as $file) - { - // Don't include our main file again... - if ($file === APPPATH . 'Config/Routes.php') - { - continue; - } - - include $file; - } - } - - $this->didDiscover = true; - } - - //-------------------------------------------------------------------- - - /** - * Sets the default constraint to be used in the system. Typically - * for use with the 'resource' method. - * - * @param string $placeholder - * - * @return RouteCollectionInterface - */ - public function setDefaultConstraint(string $placeholder): RouteCollectionInterface - { - if (array_key_exists($placeholder, $this->placeholders)) - { - $this->defaultPlaceholder = $placeholder; - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the name of the default controller. With Namespace. - * - * @return string - */ - public function getDefaultController(): string - { - return $this->defaultController; - } - - //-------------------------------------------------------------------- - - /** - * Returns the name of the default method to use within the controller. - * - * @return string - */ - public function getDefaultMethod(): string - { - return $this->defaultMethod; - } - - //-------------------------------------------------------------------- - - /** - * Returns the default namespace as set in the Routes config file. - * - * @return string - */ - public function getDefaultNamespace(): string - { - return $this->defaultNamespace; - } - - //-------------------------------------------------------------------- - - /** - * Returns the current value of the translateURIDashes setting. - * - * @return boolean - */ - public function shouldTranslateURIDashes(): bool - { - return $this->translateURIDashes; - } - - //-------------------------------------------------------------------- - - /** - * Returns the flag that tells whether to autoRoute URI against Controllers. - * - * @return boolean - */ - public function shouldAutoRoute(): bool - { - return $this->autoRoute; - } - - //-------------------------------------------------------------------- - - /** - * Returns the raw array of available routes. - * - * @param mixed $verb - * - * @return array - */ - public function getRoutes($verb = null): array - { - if (empty($verb)) - { - $verb = $this->getHTTPVerb(); - } - - // Since this is the entry point for the Router, - // take a moment to do any route discovery - // we might need to do. - $this->discoverRoutes(); - - $routes = []; - - if (isset($this->routes[$verb])) - { - // Keep current verb's routes at the beginning so they're matched - // before any of the generic, "add" routes. - if (isset($this->routes['*'])) - { - $extraRules = array_diff_key($this->routes['*'], $this->routes[$verb]); - $collection = array_merge($this->routes[$verb], $extraRules); - } - foreach ($collection as $r) - { - $key = key($r['route']); - $routes[$key] = $r['route'][$key]; - } - } - - return $routes; - } - - //-------------------------------------------------------------------- - - /** - * Returns one or all routes options - * - * @param string $from - * - * @return array - */ - public function getRoutesOptions(string $from = null): array - { - return $from ? $this->routesOptions[$from] ?? [] : $this->routesOptions; - } - - //-------------------------------------------------------------------- - - /** - * Returns the current HTTP Verb being used. - * - * @return string - */ - public function getHTTPVerb(): string - { - return $this->HTTPVerb; - } - - //-------------------------------------------------------------------- - - /** - * Sets the current HTTP verb. - * Used primarily for testing. - * - * @param string $verb - * - * @return $this - */ - public function setHTTPVerb(string $verb) - { - $this->HTTPVerb = $verb; - - return $this; - } - - /** - * A shortcut method to add a number of routes at a single time. - * It does not allow any options to be set on the route, or to - * define the method used. - * - * @param array $routes - * @param array $options - * - * @return RouteCollectionInterface - */ - public function map(array $routes = [], array $options = null): RouteCollectionInterface - { - foreach ($routes as $from => $to) - { - $this->add($from, $to, $options); - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Adds a single route to the collection. - * - * Example: - * $routes->add('news', 'Posts::index'); - * - * @param string $from - * @param array|string $to - * @param array|null $options - * - * @return RouteCollectionInterface - */ - public function add(string $from, $to, array $options = null): RouteCollectionInterface - { - $this->create('*', $from, $to, $options); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Adds a temporary redirect from one route to another. Used for - * redirecting traffic from old, non-existing routes to the new - * moved routes. - * - * @param string $from The pattern to match against - * @param string $to Either a route name or a URI to redirect to - * @param integer $status The HTTP status code that should be returned with this redirect - * - * @return RouteCollection - */ - public function addRedirect(string $from, string $to, int $status = 302) - { - // Use the named route's pattern if this is a named route. - if (array_key_exists($to, $this->routes['*'])) - { - $to = $this->routes['*'][$to]['route']; - } - elseif (array_key_exists($to, $this->routes['get'])) - { - $to = $this->routes['get'][$to]['route']; - } - - $this->create('*', $from, $to, ['redirect' => $status]); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Determines if the route is a redirecting route. - * - * @param string $from - * - * @return boolean - */ - public function isRedirect(string $from): bool - { - foreach ($this->routes['*'] as $name => $route) - { - // Named route? - if ($name === $from || key($route['route']) === $from) - { - return isset($route['redirect']) && is_numeric($route['redirect']); - } - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Grabs the HTTP status code from a redirecting Route. - * - * @param string $from - * - * @return integer - */ - public function getRedirectCode(string $from): int - { - foreach ($this->routes['*'] as $name => $route) - { - // Named route? - if ($name === $from || key($route['route']) === $from) - { - return $route['redirect'] ?? 0; - } - } - - return 0; - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // Grouping Routes - //-------------------------------------------------------------------- - - /** - * Group a series of routes under a single URL segment. This is handy - * for grouping items into an admin area, like: - * - * Example: - * // Creates route: admin/users - * $route->group('admin', function() { - * $route->resource('users'); - * }); - * - * @param string $name The name to group/prefix the routes with. - * @param array ...$params - * - * @return void - */ - public function group(string $name, ...$params) - { - $oldGroup = $this->group; - $oldOptions = $this->currentOptions; - - // To register a route, we'll set a flag so that our router - // so it will see the group name. - $this->group = ltrim($oldGroup . '/' . $name, '/'); - - $callback = array_pop($params); - - if ($params && is_array($params[0])) - { - $this->currentOptions = array_shift($params); - } - - if (is_callable($callback)) - { - $callback($this); - } - - $this->group = $oldGroup; - $this->currentOptions = $oldOptions; - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // HTTP Verb-based routing - //-------------------------------------------------------------------- - // Routing works here because, as the routes Config file is read in, - // the various HTTP verb-based routes will only be added to the in-memory - // routes if it is a call that should respond to that verb. - // - // The options array is typically used to pass in an 'as' or var, but may - // be expanded in the future. See the docblock for 'add' method above for - // current list of globally available options. - // - - /** - * Creates a collections of HTTP-verb based routes for a controller. - * - * Possible Options: - * 'controller' - Customize the name of the controller used in the 'to' route - * 'placeholder' - The regex used by the Router. Defaults to '(:any)' - * 'websafe' - - '1' if only GET and POST HTTP verbs are supported - * - * Example: - * - * $route->resource('photos'); - * - * // Generates the following routes: - * HTTP Verb | Path | Action | Used for... - * ----------+-------------+---------------+----------------- - * GET /photos index an array of photo objects - * GET /photos/new new an empty photo object, with default properties - * GET /photos/{id}/edit edit a specific photo object, editable properties - * GET /photos/{id} show a specific photo object, all properties - * POST /photos create a new photo object, to add to the resource - * DELETE /photos/{id} delete deletes the specified photo object - * PUT/PATCH /photos/{id} update replacement properties for existing photo - * - * If 'websafe' option is present, the following paths are also available: - * - * POST /photos/{id}/delete delete - * POST /photos/{id} update - * - * @param string $name The name of the resource/controller to route to. - * @param array|null $options An list of possible ways to customize the routing. - * - * @return RouteCollectionInterface - */ - public function resource(string $name, array $options = null): RouteCollectionInterface - { - // In order to allow customization of the route the - // resources are sent to, we need to have a new name - // to store the values in. - $new_name = ucfirst($name); - - // If a new controller is specified, then we replace the - // $name value with the name of the new controller. - if (isset($options['controller'])) - { - $new_name = ucfirst(filter_var($options['controller'], FILTER_SANITIZE_STRING)); - } - - // In order to allow customization of allowed id values - // we need someplace to store them. - $id = $this->placeholders[$this->defaultPlaceholder] ?? '(:segment)'; - - if (isset($options['placeholder'])) - { - $id = $options['placeholder']; - } - - // Make sure we capture back-references - $id = '(' . trim($id, '()') . ')'; - - $methods = isset($options['only']) ? (is_string($options['only']) ? explode(',', $options['only']) : $options['only']) : ['index', 'show', 'create', 'update', 'delete', 'new', 'edit']; - - if (isset($options['except'])) - { - $options['except'] = is_array($options['except']) ? $options['except'] : explode(',', $options['except']); - foreach ($methods as $i => $method) - { - if (in_array($method, $options['except'])) - { - unset($methods[$i]); - } - } - } - - if (in_array('index', $methods)) - { - $this->get($name, $new_name . '::index', $options); - } - if (in_array('new', $methods)) - { - $this->get($name . '/new', $new_name . '::new', $options); - } - if (in_array('edit', $methods)) - { - $this->get($name . '/' . $id . '/edit', $new_name . '::edit/$1', $options); - } - if (in_array('show', $methods)) - { - $this->get($name . '/' . $id, $new_name . '::show/$1', $options); - } - if (in_array('create', $methods)) - { - $this->post($name, $new_name . '::create', $options); - } - if (in_array('update', $methods)) - { - $this->put($name . '/' . $id, $new_name . '::update/$1', $options); - $this->patch($name . '/' . $id, $new_name . '::update/$1', $options); - } - if (in_array('delete', $methods)) - { - $this->delete($name . '/' . $id, $new_name . '::delete/$1', $options); - } - - // Web Safe? delete needs checking before update because of method name - if (isset($options['websafe'])) - { - if (in_array('delete', $methods)) - { - $this->post($name . '/' . $id . '/delete', $new_name . '::delete/$1', $options); - } - if (in_array('update', $methods)) - { - $this->post($name . '/' . $id, $new_name . '::update/$1', $options); - } - } - - return $this; - } - - /** - * Creates a collections of HTTP-verb based routes for a presenter controller. - * - * Possible Options: - * 'controller' - Customize the name of the controller used in the 'to' route - * 'placeholder' - The regex used by the Router. Defaults to '(:any)' - * - * Example: - * - * $route->presenter('photos'); - * - * // Generates the following routes: - * HTTP Verb | Path | Action | Used for... - * ----------+-------------+---------------+----------------- - * GET /photos index showing all array of photo objects - * GET /photos/show/{id} show showing a specific photo object, all properties - * GET /photos/new new showing a form for an empty photo object, with default properties - * POST /photos/create create processing the form for a new photo - * GET /photos/edit/{id} edit show an editing form for a specific photo object, editable properties - * POST /photos/update/{id} update process the editing form data - * GET /photos/remove/{id} remove show a form to confirm deletion of a specific photo object - * POST /photos/delete/{id} delete deleting the specified photo object - * - * @param string $name The name of the controller to route to. - * @param array|null $options An list of possible ways to customize the routing. - * - * @return RouteCollectionInterface - */ - public function presenter(string $name, array $options = null): RouteCollectionInterface - { - // In order to allow customization of the route the - // resources are sent to, we need to have a new name - // to store the values in. - $newName = ucfirst($name); - - // If a new controller is specified, then we replace the - // $name value with the name of the new controller. - if (isset($options['controller'])) - { - $newName = ucfirst(filter_var($options['controller'], FILTER_SANITIZE_STRING)); - } - - // In order to allow customization of allowed id values - // we need someplace to store them. - $id = $this->placeholders[$this->defaultPlaceholder] ?? '(:segment)'; - - if (isset($options['placeholder'])) - { - $id = $options['placeholder']; - } - - // Make sure we capture back-references - $id = '(' . trim($id, '()') . ')'; - - $methods = isset($options['only']) ? (is_string($options['only']) ? explode(',', $options['only']) : $options['only']) : ['index', 'show', 'new', 'create', 'edit', 'update', 'remove', 'delete']; - - if (isset($options['except'])) - { - $options['except'] = is_array($options['except']) ? $options['except'] : explode(',', $options['except']); - foreach ($methods as $i => $method) - { - if (in_array($method, $options['except'])) - { - unset($methods[$i]); - } - } - } - - if (in_array('index', $methods)) - { - $this->get($name, $newName . '::index', $options); - } - if (in_array('show', $methods)) - { - $this->get($name . '/show/' . $id, $newName . '::show/$1', $options); - } - if (in_array('new', $methods)) - { - $this->get($name . '/new', $newName . '::new', $options); - } - if (in_array('create', $methods)) - { - $this->post($name . '/create', $newName . '::create', $options); - } - if (in_array('edit', $methods)) - { - $this->get($name . '/edit/' . $id, $newName . '::edit/$1', $options); - } - if (in_array('update', $methods)) - { - $this->post($name . '/update/' . $id, $newName . '::update/$1', $options); - } - if (in_array('remove', $methods)) - { - $this->get($name . '/remove/' . $id, $newName . '::remove/$1', $options); - } - if (in_array('delete', $methods)) - { - $this->post($name . '/delete/' . $id, $newName . '::delete/$1', $options); - } - if (in_array('show', $methods)) - { - $this->get($name . '/' . $id, $newName . '::show/$1', $options); - } - if (in_array('create', $methods)) - { - $this->post($name, $newName . '::create', $options); - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Specifies a single route to match for multiple HTTP Verbs. - * - * Example: - * $route->match( ['get', 'post'], 'users/(:num)', 'users/$1); - * - * @param array $verbs - * @param string $from - * @param string|array $to - * @param array|null $options - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function match(array $verbs = [], string $from, $to, array $options = null): RouteCollectionInterface - { - foreach ($verbs as $verb) - { - $verb = strtolower($verb); - - $this->{$verb}($from, $to, $options); - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Specifies a route that is only available to GET requests. - * - * @param string $from - * @param string|array $to - * @param array|null $options - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function get(string $from, $to, array $options = null): RouteCollectionInterface - { - $this->create('get', $from, $to, $options); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Specifies a route that is only available to POST requests. - * - * @param string $from - * @param string|array $to - * @param array|null $options - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function post(string $from, $to, array $options = null): RouteCollectionInterface - { - $this->create('post', $from, $to, $options); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Specifies a route that is only available to PUT requests. - * - * @param string $from - * @param string|array $to - * @param array|null $options - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function put(string $from, $to, array $options = null): RouteCollectionInterface - { - $this->create('put', $from, $to, $options); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Specifies a route that is only available to DELETE requests. - * - * @param string $from - * @param string|array $to - * @param array|null $options - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function delete(string $from, $to, array $options = null): RouteCollectionInterface - { - $this->create('delete', $from, $to, $options); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Specifies a route that is only available to HEAD requests. - * - * @param string $from - * @param string|array $to - * @param array|null $options - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function head(string $from, $to, array $options = null): RouteCollectionInterface - { - $this->create('head', $from, $to, $options); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Specifies a route that is only available to PATCH requests. - * - * @param string $from - * @param string|array $to - * @param array|null $options - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function patch(string $from, $to, array $options = null): RouteCollectionInterface - { - $this->create('patch', $from, $to, $options); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Specifies a route that is only available to OPTIONS requests. - * - * @param string $from - * @param string|array $to - * @param array|null $options - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function options(string $from, $to, array $options = null): RouteCollectionInterface - { - $this->create('options', $from, $to, $options); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Specifies a route that is only available to command-line requests. - * - * @param string $from - * @param string|array $to - * @param array|null $options - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function cli(string $from, $to, array $options = null): RouteCollectionInterface - { - $this->create('cli', $from, $to, $options); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Limits the routes to a specified ENVIRONMENT or they won't run. - * - * @param string $env - * @param \Closure $callback - * - * @return \CodeIgniter\Router\RouteCollectionInterface - */ - public function environment(string $env, \Closure $callback): RouteCollectionInterface - { - if (ENVIRONMENT === $env) - { - $callback($this); - } - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Attempts to look up a route based on its destination. - * - * If a route exists: - * - * 'path/(:any)/(:any)' => 'Controller::method/$1/$2' - * - * This method allows you to know the Controller and method - * and get the route that leads to it. - * - * // Equals 'path/$param1/$param2' - * reverseRoute('Controller::method', $param1, $param2); - * - * @param string $search - * @param array ...$params - * - * @return string|false - */ - public function reverseRoute(string $search, ...$params) - { - // Named routes get higher priority. - foreach ($this->routes as $collection) - { - if (array_key_exists($search, $collection)) - { - $route = $this->fillRouteParams(key($collection[$search]['route']), $params); - return $this->localizeRoute($route); - } - } - - // If it's not a named route, then loop over - // all routes to find a match. - foreach ($this->routes as $collection) - { - foreach ($collection as $route) - { - $from = key($route['route']); - $to = $route['route'][$from]; - - // ignore closures - if (! is_string($to)) - { - continue; - } - - // Lose any namespace slash at beginning of strings - // to ensure more consistent match. - $to = ltrim($to, '\\'); - $search = ltrim($search, '\\'); - - // If there's any chance of a match, then it will - // be with $search at the beginning of the $to string. - if (strpos($to, $search) !== 0) - { - continue; - } - - // Ensure that the number of $params given here - // matches the number of back-references in the route - if (substr_count($to, '$') !== count($params)) - { - continue; - } - - $route = $this->fillRouteParams($from, $params); - return $this->localizeRoute($route); - } - } - - // If we're still here, then we did not find a match. - return false; - } - - //-------------------------------------------------------------------- - - /** - * Replaces the {locale} tag with the current application locale - * - * @param string $route - * - * @return string - */ - protected function localizeRoute(string $route) :string - { - return strtr($route, ['{locale}' => Services::request()->getLocale()]); - } - - //-------------------------------------------------------------------- - - /** - * Checks a route (using the "from") to see if it's filtered or not. - * - * @param string $search - * - * @return boolean - */ - public function isFiltered(string $search): bool - { - return isset($this->routesOptions[$search]['filter']); - } - - //-------------------------------------------------------------------- - - /** - * Returns the filter that should be applied for a single route, along - * with any parameters it might have. Parameters are found by splitting - * the parameter name on a colon to separate the filter name from the parameter list, - * and the splitting the result on commas. So: - * - * 'role:admin,manager' - * - * has a filter of "role", with parameters of ['admin', 'manager']. - * - * @param string $search - * - * @return string - */ - public function getFilterForRoute(string $search): string - { - if (! $this->isFiltered($search)) - { - return ''; - } - - return $this->routesOptions[$search]['filter']; - } - - //-------------------------------------------------------------------- - - /** - * Given a - * - * @param string $from - * @param array|null $params - * - * @return string - * @throws \CodeIgniter\Router\Exceptions\RouterException - */ - protected function fillRouteParams(string $from, array $params = null): string - { - // Find all of our back-references in the original route - preg_match_all('/\(([^)]+)\)/', $from, $matches); - - if (empty($matches[0])) - { - return '/' . ltrim($from, '/'); - } - - // Build our resulting string, inserting the $params in - // the appropriate places. - foreach ($matches[0] as $index => $pattern) - { - // Ensure that the param we're inserting matches - // the expected param type. - $pos = strpos($from, $pattern); - - if (preg_match('#^' . $pattern . '$#u', $params[$index])) - { - $from = substr_replace($from, $params[$index], $pos, strlen($pattern)); - } - else - { - throw RouterException::forInvalidParameterType(); - } - } - - return '/' . ltrim($from, '/'); - } - - //-------------------------------------------------------------------- - - /** - * Does the heavy lifting of creating an actual route. You must specify - * the request method(s) that this route will work for. They can be separated - * by a pipe character "|" if there is more than one. - * - * @param string $verb - * @param string $from - * @param string|array $to - * @param array|null $options - */ - protected function create(string $verb, string $from, $to, array $options = null) - { - $overwrite = false; - $prefix = is_null($this->group) ? '' : $this->group . '/'; - - $from = filter_var($prefix . $from, FILTER_SANITIZE_STRING); - - // While we want to add a route within a group of '/', - // it doesn't work with matching, so remove them... - if ($from !== '/') - { - $from = trim($from, '/'); - } - - $options = array_merge((array) $this->currentOptions, (array) $options); - - // Hostname limiting? - if (! empty($options['hostname'])) - { - // @todo determine if there's a way to whitelist hosts? - if (isset($_SERVER['HTTP_HOST']) && strtolower($_SERVER['HTTP_HOST']) !== strtolower($options['hostname'])) - { - return; - } - - $overwrite = true; - } - - // Limiting to subdomains? - else if (! empty($options['subdomain'])) - { - // If we don't match the current subdomain, then - // we don't need to add the route. - if (! $this->checkSubdomains($options['subdomain'])) - { - return; - } - - $overwrite = true; - } - - // Are we offsetting the binds? - // If so, take care of them here in one - // fell swoop. - if (isset($options['offset']) && is_string($to)) - { - // Get a constant string to work with. - $to = preg_replace('/(\$\d+)/', '$X', $to); - - for ($i = (int) $options['offset'] + 1; $i < (int) $options['offset'] + 7; $i ++) - { - $to = preg_replace_callback( - '/\$X/', function ($m) use ($i) { - return '$' . $i; - }, $to, 1 - ); - } - } - - // Replace our regex pattern placeholders with the actual thing - // so that the Router doesn't need to know about any of this. - foreach ($this->placeholders as $tag => $pattern) - { - $from = str_ireplace(':' . $tag, $pattern, $from); - } - - //If is redirect, No processing - if (! isset($options['redirect'])) - { - // If no namespace found, add the default namespace - if (is_string($to) && (strpos($to, '\\') === false || strpos($to, '\\') > 0)) - { - $namespace = $options['namespace'] ?? $this->defaultNamespace; - $to = trim($namespace, '\\') . '\\' . $to; - } - - // Always ensure that we escape our namespace so we're not pointing to - // \CodeIgniter\Routes\Controller::method. - if (is_string($to)) - { - $to = '\\' . ltrim($to, '\\'); - } - } - - $name = $options['as'] ?? $from; - - // Don't overwrite any existing 'froms' so that auto-discovered routes - // do not overwrite any app/Config/Routes settings. The app - // routes should always be the "source of truth". - // this works only because discovered routes are added just prior - // to attempting to route the request. - if (isset($this->routes[$verb][$name]) && ! $overwrite) - { - return; - } - - $this->routes[$verb][$name] = [ - 'route' => [$from => $to], - ]; - - $this->routesOptions[$from] = $options; - - // Is this a redirect? - if (isset($options['redirect']) && is_numeric($options['redirect'])) - { - $this->routes['*'][$name]['redirect'] = $options['redirect']; - } - } - - //-------------------------------------------------------------------- - - /** - * Compares the subdomain(s) passed in against the current subdomain - * on this page request. - * - * @param mixed $subdomains - * - * @return boolean - */ - private function checkSubdomains($subdomains): bool - { - // CLI calls can't be on subdomain. - if (! isset($_SERVER['HTTP_HOST'])) - { - return false; - } - - if (is_null($this->currentSubdomain)) - { - $this->currentSubdomain = $this->determineCurrentSubdomain(); - } - - if (! is_array($subdomains)) - { - $subdomains = [$subdomains]; - } - - // Routes can be limited to any sub-domain. In that case, though, - // it does require a sub-domain to be present. - if (! empty($this->currentSubdomain) && in_array('*', $subdomains)) - { - return true; - } - - return in_array($this->currentSubdomain, $subdomains, true); - } - - //-------------------------------------------------------------------- - - /** - * Examines the HTTP_HOST to get a best match for the subdomain. It - * won't be perfect, but should work for our needs. - * - * It's especially not perfect since it's possible to register a domain - * with a period (.) as part of the domain name. - * - * @return mixed - */ - private function determineCurrentSubdomain() - { - // We have to ensure that a scheme exists - // on the URL else parse_url will mis-interpret - // 'host' as the 'path'. - $url = $_SERVER['HTTP_HOST']; - if (strpos($url, 'http') !== 0) - { - $url = 'http://' . $url; - } - - $parsedUrl = parse_url($url); - - $host = explode('.', $parsedUrl['host']); - - if ($host[0] === 'www') - { - unset($host[0]); - } - - // Get rid of any domains, which will be the last - unset($host[count($host)]); - - // Account for .co.uk, .co.nz, etc. domains - if (end($host) === 'co') - { - $host = array_slice($host, 0, -1); - } - - // If we only have 1 part left, then we don't have a sub-domain. - if (count($host) === 1) - { - // Set it to false so we don't make it back here again. - return false; - } - - return array_shift($host); - } - - //-------------------------------------------------------------------- - - /** - * Reset the routes, so that a FeatureTestCase can provide the - * explicit ones needed for it. - */ - public function resetRoutes() - { - $this->routes = ['*' => []]; - foreach ($this->defaultHTTPMethods as $verb) - { - $this->routes[$verb] = []; - } - } - -} diff --git a/vendor/codeigniter4/framework/system/Router/RouteCollectionInterface.php b/vendor/codeigniter4/framework/system/Router/RouteCollectionInterface.php deleted file mode 100644 index b25e93d..0000000 --- a/vendor/codeigniter4/framework/system/Router/RouteCollectionInterface.php +++ /dev/null @@ -1,276 +0,0 @@ - 'Controller::method/$1/$2' - * - * This method allows you to know the Controller and method - * and get the route that leads to it. - * - * // Equals 'path/$param1/$param2' - * reverseRoute('Controller::method', $param1, $param2); - * - * @param string $search - * @param array ...$params - * - * @return string|false - */ - public function reverseRoute(string $search, ...$params); - - //-------------------------------------------------------------------- - - /** - * Determines if the route is a redirecting route. - * - * @param string $from - * - * @return boolean - */ - public function isRedirect(string $from): bool; - - //-------------------------------------------------------------------- - - /** - * Grabs the HTTP status code from a redirecting Route. - * - * @param string $from - * - * @return integer - */ - public function getRedirectCode(string $from): int; - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Router/Router.php b/vendor/codeigniter4/framework/system/Router/Router.php deleted file mode 100644 index 3ef9150..0000000 --- a/vendor/codeigniter4/framework/system/Router/Router.php +++ /dev/null @@ -1,725 +0,0 @@ -collection = $routes; - - $this->controller = $this->collection->getDefaultController(); - $this->method = $this->collection->getDefaultMethod(); - - $this->collection->setHTTPVerb($request->getMethod() ?? strtolower($_SERVER['REQUEST_METHOD'])); - } - - //-------------------------------------------------------------------- - - /** - * @param string|null $uri - * - * @return mixed|string - * @throws \CodeIgniter\Router\Exceptions\RedirectException - * @throws \CodeIgniter\Exceptions\PageNotFoundException - */ - public function handle(string $uri = null) - { - $this->translateURIDashes = $this->collection->shouldTranslateURIDashes(); - - // If we cannot find a URI to match against, then - // everything runs off of it's default settings. - if ($uri === null || $uri === '') - { - return strpos($this->controller, '\\') === false - ? $this->collection->getDefaultNamespace() . $this->controller - : $this->controller; - } - - // Decode URL-encoded string - $uri = urldecode($uri); - - if ($this->checkRoutes($uri)) - { - if ($this->collection->isFiltered($this->matchedRoute[0])) - { - $this->filterInfo = $this->collection->getFilterForRoute($this->matchedRoute[0]); - } - - return $this->controller; - } - - // Still here? Then we can try to match the URI against - // Controllers/directories, but the application may not - // want this, like in the case of API's. - if (! $this->collection->shouldAutoRoute()) - { - throw new PageNotFoundException("Can't find a route for '{$uri}'."); - } - - $this->autoRoute($uri); - - return $this->controllerName(); - } - - //-------------------------------------------------------------------- - - /** - * Returns the filter info for the matched route, if any. - * - * @return string - */ - public function getFilter() - { - return $this->filterInfo; - } - - //-------------------------------------------------------------------- - - /** - * Returns the name of the matched controller. - * - * @return mixed - */ - public function controllerName() - { - return $this->translateURIDashes - ? str_replace('-', '_', $this->controller) - : $this->controller; - } - - //-------------------------------------------------------------------- - - /** - * Returns the name of the method to run in the - * chosen container. - * - * @return mixed - */ - public function methodName(): string - { - return $this->translateURIDashes - ? str_replace('-', '_', $this->method) - : $this->method; - } - - //-------------------------------------------------------------------- - - /** - * Returns the 404 Override settings from the Collection. - * If the override is a string, will split to controller/index array. - */ - public function get404Override() - { - $route = $this->collection->get404Override(); - - if (is_string($route)) - { - $routeArray = explode('::', $route); - - return [ - $routeArray[0], // Controller - $routeArray[1] ?? 'index', // Method - ]; - } - - if (is_callable($route)) - { - return $route; - } - - return null; - } - - //-------------------------------------------------------------------- - - /** - * Returns the binds that have been matched and collected - * during the parsing process as an array, ready to send to - * instance->method(...$params). - * - * @return mixed - */ - public function params(): array - { - return $this->params; - } - - //-------------------------------------------------------------------- - - /** - * Returns the name of the sub-directory the controller is in, - * if any. Relative to APPPATH.'Controllers'. - * - * Only used when auto-routing is turned on. - * - * @return string - */ - public function directory(): string - { - return ! empty($this->directory) ? $this->directory : ''; - } - - //-------------------------------------------------------------------- - - /** - * Returns the routing information that was matched for this - * request, if a route was defined. - * - * @return array|null - */ - public function getMatchedRoute() - { - return $this->matchedRoute; - } - - //-------------------------------------------------------------------- - - /** - * Returns all options set for the matched route - * - * @return array|null - */ - public function getMatchedRouteOptions() - { - return $this->matchedRouteOptions; - } - - //-------------------------------------------------------------------- - - /** - * Sets the value that should be used to match the index.php file. Defaults - * to index.php but this allows you to modify it in case your are using - * something like mod_rewrite to remove the page. This allows you to set - * it a blank. - * - * @param $page - * - * @return mixed - */ - public function setIndexPage($page): self - { - $this->indexPage = $page; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Tells the system whether we should translate URI dashes or not - * in the URI from a dash to an underscore. - * - * @param boolean|false $val - * - * @return $this - */ - public function setTranslateURIDashes(bool $val = false): self - { - $this->translateURIDashes = $val; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns true/false based on whether the current route contained - * a {locale} placeholder. - * - * @return boolean - */ - public function hasLocale() - { - return (bool) $this->detectedLocale; - } - - //-------------------------------------------------------------------- - - /** - * Returns the detected locale, if any, or null. - * - * @return string - */ - public function getLocale() - { - return $this->detectedLocale; - } - - //-------------------------------------------------------------------- - - /** - * Compares the uri string against the routes that the - * RouteCollection class defined for us, attempting to find a match. - * This method will modify $this->controller, etal as needed. - * - * @param string $uri The URI path to compare against the routes - * - * @return boolean Whether the route was matched or not. - * @throws \CodeIgniter\Router\Exceptions\RedirectException - */ - protected function checkRoutes(string $uri): bool - { - $routes = $this->collection->getRoutes($this->collection->getHTTPVerb()); - - $uri = $uri === '/' - ? $uri - : ltrim($uri, '/ '); - - // Don't waste any time - if (empty($routes)) - { - return false; - } - - // Loop through the route array looking for wildcards - foreach ($routes as $key => $val) - { - $key = $key === '/' - ? $key - : ltrim($key, '/ '); - - $matchedKey = $key; - - // Are we dealing with a locale? - if (strpos($key, '{locale}') !== false) - { - $localeSegment = array_search('{locale}', preg_split('/[\/]*((^[a-zA-Z0-9])|\(([^()]*)\))*[\/]+/m', $key)); - - // Replace it with a regex so it - // will actually match. - $key = str_replace('/', '\/', $key); - $key = str_replace('{locale}', '[^\/]+', $key); - } - - // Does the RegEx match? - if (preg_match('#^' . $key . '$#u', $uri, $matches)) - { - // Is this route supposed to redirect to another? - if ($this->collection->isRedirect($key)) - { - throw new RedirectException(is_array($val) ? key($val) : $val, $this->collection->getRedirectCode($key)); - } - // Store our locale so CodeIgniter object can - // assign it to the Request. - if (isset($localeSegment)) - { - // The following may be inefficient, but doesn't upset NetBeans :-/ - $temp = (explode('/', $uri)); - $this->detectedLocale = $temp[$localeSegment]; - unset($localeSegment); - } - - // Are we using Closures? If so, then we need - // to collect the params into an array - // so it can be passed to the controller method later. - if (! is_string($val) && is_callable($val)) - { - $this->controller = $val; - - // Remove the original string from the matches array - array_shift($matches); - - $this->params = $matches; - - $this->matchedRoute = [ - $matchedKey, - $val, - ]; - - $this->matchedRouteOptions = $this->collection->getRoutesOptions($matchedKey); - - return true; - } - // Are we using the default method for back-references? - - // Support resource route when function with subdirectory - // ex: $routes->resource('Admin/Admins'); - if (strpos($val, '$') !== false && strpos($key, '(') !== false && strpos($key, '/') !== false) - { - $replacekey = str_replace('/(.*)', '', $key); - $val = preg_replace('#^' . $key . '$#u', $val, $uri); - $val = str_replace($replacekey, str_replace('/', '\\', $replacekey), $val); - } - elseif (strpos($val, '$') !== false && strpos($key, '(') !== false) - { - $val = preg_replace('#^' . $key . '$#u', $val, $uri); - } - elseif (strpos($val, '/') !== false) - { - [ - $controller, - $method, - ] = explode( '::', $val ); - - // Only replace slashes in the controller, not in the method. - $controller = str_replace('/', '\\', $controller); - - $val = $controller . '::' . $method; - } - - $this->setRequest(explode('/', $val)); - - $this->matchedRoute = [ - $matchedKey, - $val, - ]; - - $this->matchedRouteOptions = $this->collection->getRoutesOptions($matchedKey); - - return true; - } - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Attempts to match a URI path against Controllers and directories - * found in APPPATH/Controllers, to find a matching route. - * - * @param string $uri - */ - public function autoRoute(string $uri) - { - $segments = explode('/', $uri); - - $segments = $this->validateRequest($segments); - - // If we don't have any segments left - try the default controller; - // WARNING: Directories get shifted out of the segments array. - if (empty($segments)) - { - $this->setDefaultController(); - } - // If not empty, then the first segment should be the controller - else - { - $this->controller = ucfirst(array_shift($segments)); - } - - // Use the method name if it exists. - // If it doesn't, no biggie - the default method name - // has already been set. - if (! empty($segments)) - { - $this->method = array_shift($segments) ?: $this->method; - } - - if (! empty($segments)) - { - $this->params = $segments; - } - - $defaultNamespace = $this->collection->getDefaultNamespace(); - $controllerName = $this->controllerName(); - if ($this->collection->getHTTPVerb() !== 'cli') - { - $controller = '\\' . $defaultNamespace; - $controller .= $this->directory ? str_replace('/', '\\', $this->directory) : ''; - $controller .= $controllerName; - $controller = strtolower($controller); - $methodName = strtolower($this->methodName()); - - foreach ($this->collection->getRoutes('cli') as $route) - { - if (is_string($route)) - { - $route = strtolower($route); - if (strpos($route, $controller . '::' . $methodName) === 0) - { - throw new PageNotFoundException(); - } - - if ($route === $controller) - { - throw new PageNotFoundException(); - } - } - } - } - - // Load the file so that it's available for CodeIgniter. - $file = APPPATH . 'Controllers/' . $this->directory . $controllerName . '.php'; - if (is_file($file)) - { - include_once $file; - } - - // Ensure the controller stores the fully-qualified class name - // We have to check for a length over 1, since by default it will be '\' - if (strpos($this->controller, '\\') === false && strlen($defaultNamespace) > 1) - { - $this->controller = '\\' . ltrim(str_replace('/', '\\', $defaultNamespace . $this->directory . $controllerName), '\\'); - } - } - - //-------------------------------------------------------------------- - - /** - * Attempts to validate the URI request and determine the controller path. - * - * @param array $segments URI segments - * - * @return array URI segments - */ - protected function validateRequest(array $segments): array - { - $segments = array_filter($segments, function ($segment) { - return ! empty($segment) || ($segment !== '0' || $segment !== 0); - }); - $segments = array_values($segments); - - $c = count($segments); - $directory_override = isset($this->directory); - - // Loop through our segments and return as soon as a controller - // is found or when such a directory doesn't exist - while ($c-- > 0) - { - $test = $this->directory . ucfirst($this->translateURIDashes === true ? str_replace('-', '_', $segments[0]) : $segments[0]); - - if (! is_file(APPPATH . 'Controllers/' . $test . '.php') && $directory_override === false && is_dir(APPPATH . 'Controllers/' . $this->directory . ucfirst($segments[0]))) - { - $this->setDirectory(array_shift($segments), true); - continue; - } - - return $segments; - } - - // This means that all segments were actually directories - return $segments; - } - - //-------------------------------------------------------------------- - - /** - * Sets the sub-directory that the controller is in. - * - * @param string|null $dir - * @param boolean|false $append - */ - public function setDirectory(string $dir = null, bool $append = false) - { - if (empty($dir)) - { - $this->directory = null; - return; - } - - $dir = ucfirst($dir); - - if ($append !== true || empty($this->directory)) - { - $this->directory = str_replace('.', '', trim($dir, '/')) . '/'; - } - else - { - $this->directory .= str_replace('.', '', trim($dir, '/')) . '/'; - } - } - - //-------------------------------------------------------------------- - - /** - * Set request route - * - * Takes an array of URI segments as input and sets the class/method - * to be called. - * - * @param array $segments URI segments - */ - protected function setRequest(array $segments = []) - { - // If we don't have any segments - try the default controller; - if (empty($segments)) - { - $this->setDefaultController(); - - return; - } - - list($controller, $method) = array_pad(explode('::', $segments[0]), 2, null); - - $this->controller = $controller; - - // $this->method already contains the default method name, - // so don't overwrite it with emptiness. - if (! empty($method)) - { - $this->method = $method; - } - - array_shift($segments); - - $this->params = $segments; - } - - //-------------------------------------------------------------------- - - /** - * Sets the default controller based on the info set in the RouteCollection. - */ - protected function setDefaultController() - { - if (empty($this->controller)) - { - throw RouterException::forMissingDefaultRoute(); - } - - // Is the method being specified? - if (sscanf($this->controller, '%[^/]/%s', $class, $this->method) !== 2) - { - $this->method = 'index'; - } - - if (! is_file(APPPATH . 'Controllers/' . $this->directory . ucfirst($class) . '.php')) - { - return; - } - - $this->controller = ucfirst($class); - - log_message('info', 'Used the default controller.'); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Router/RouterInterface.php b/vendor/codeigniter4/framework/system/Router/RouterInterface.php deleted file mode 100644 index 46cb285..0000000 --- a/vendor/codeigniter4/framework/system/Router/RouterInterface.php +++ /dev/null @@ -1,115 +0,0 @@ -method(...$params). - * - * @return mixed - */ - public function params(); - - //-------------------------------------------------------------------- - - /** - * Sets the value that should be used to match the index.php file. Defaults - * to index.php but this allows you to modify it in case your are using - * something like mod_rewrite to remove the page. This allows you to set - * it a blank. - * - * @param $page - * - * @return mixed - */ - public function setIndexPage($page); - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Security/Exceptions/SecurityException.php b/vendor/codeigniter4/framework/system/Security/Exceptions/SecurityException.php deleted file mode 100644 index dda6a9d..0000000 --- a/vendor/codeigniter4/framework/system/Security/Exceptions/SecurityException.php +++ /dev/null @@ -1,12 +0,0 @@ -', - '<', - '>', - "'", - '"', - '&', - '$', - '#', - '{', - '}', - '[', - ']', - '=', - ';', - '?', - '%20', - '%22', - '%3c', // < - '%253c', // < - '%3e', // > - '%0e', // > - '%28', // ( - '%29', // ) - '%2528', // ( - '%26', // & - '%24', // $ - '%3f', // ? - '%3b', // ; - '%3d', // = - ]; - - //-------------------------------------------------------------------- - - /** - * Security constructor. - * - * Stores our configuration and fires off the init() method to - * setup initial state. - * - * @param \Config\App $config - * - * @throws \Exception - */ - public function __construct($config) - { - // Store our CSRF-related settings - $this->CSRFExpire = $config->CSRFExpire; - $this->CSRFTokenName = $config->CSRFTokenName; - $this->CSRFHeaderName = $config->CSRFHeaderName; - $this->CSRFCookieName = $config->CSRFCookieName; - $this->CSRFRegenerate = $config->CSRFRegenerate; - - if (isset($config->cookiePrefix)) - { - $this->CSRFCookieName = $config->cookiePrefix . $this->CSRFCookieName; - } - - // Store cookie-related settings - $this->cookiePath = $config->cookiePath; - $this->cookieDomain = $config->cookieDomain; - $this->cookieSecure = $config->cookieSecure; - - $this->CSRFSetHash(); - - unset($config); - } - - //-------------------------------------------------------------------- - - /** - * CSRF Verify - * - * @param RequestInterface $request - * - * @return $this|false - * @throws \Exception - */ - public function CSRFVerify(RequestInterface $request) - { - // If it's not a POST request we will set the CSRF cookie - if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') - { - return $this->CSRFSetCookie($request); - } - - // Do the tokens exist in _POST, HEADER or optionally php:://input - json data - $CSRFTokenValue = $_POST[$this->CSRFTokenName] ?? - (! is_null($request->getHeader($this->CSRFHeaderName)) && ! empty($request->getHeader($this->CSRFHeaderName)->getValue()) ? - $request->getHeader($this->CSRFHeaderName)->getValue() : - (! empty($request->getBody()) && ! empty($json = json_decode($request->getBody())) && json_last_error() === JSON_ERROR_NONE ? - ($json->{$this->CSRFTokenName} ?? null) : - null)); - - // Do the tokens exist in both the _POST/POSTed JSON and _COOKIE arrays? - if (! isset($CSRFTokenValue, $_COOKIE[$this->CSRFCookieName]) || $CSRFTokenValue !== $_COOKIE[$this->CSRFCookieName] - ) // Do the tokens match? - { - throw SecurityException::forDisallowedAction(); - } - - // We kill this since we're done and we don't want to pollute the _POST array - if (isset($_POST[$this->CSRFTokenName])) - { - unset($_POST[$this->CSRFTokenName]); - $request->setGlobal('post', $_POST); - } - // We kill this since we're done and we don't want to pollute the JSON data - elseif (isset($json->{$this->CSRFTokenName})) - { - unset($json->{$this->CSRFTokenName}); - $request->setBody(json_encode($json)); - } - - // Regenerate on every submission? - if ($this->CSRFRegenerate) - { - // Nothing should last forever - $this->CSRFHash = null; - unset($_COOKIE[$this->CSRFCookieName]); - } - - $this->CSRFSetHash(); - $this->CSRFSetCookie($request); - - log_message('info', 'CSRF token verified'); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * CSRF Set Cookie - * - * @codeCoverageIgnore - * - * @param RequestInterface|\CodeIgniter\HTTP\IncomingRequest $request - * - * @return Security|false - */ - public function CSRFSetCookie(RequestInterface $request) - { - $expire = time() + $this->CSRFExpire; - $secure_cookie = (bool) $this->cookieSecure; - - if ($secure_cookie && ! $request->isSecure()) - { - return false; - } - - setcookie( - $this->CSRFCookieName, $this->CSRFHash, $expire, $this->cookiePath, $this->cookieDomain, $secure_cookie, true // Enforce HTTP only cookie for security - ); - - log_message('info', 'CSRF cookie sent'); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the current CSRF Hash. - * - * @return string - */ - public function getCSRFHash(): string - { - return $this->CSRFHash; - } - - //-------------------------------------------------------------------- - - /** - * Returns the CSRF Token Name. - * - * @return string - */ - public function getCSRFTokenName(): string - { - return $this->CSRFTokenName; - } - - //-------------------------------------------------------------------- - - /** - * Sets the CSRF Hash and cookie. - * - * @return string - * @throws \Exception - */ - protected function CSRFSetHash(): string - { - if ($this->CSRFHash === null) - { - // If the cookie exists we will use its value. - // We don't necessarily want to regenerate it with - // each page load since a page could contain embedded - // sub-pages causing this feature to fail - if (isset($_COOKIE[$this->CSRFCookieName]) && is_string($_COOKIE[$this->CSRFCookieName]) && preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->CSRFCookieName]) === 1 - ) - { - return $this->CSRFHash = $_COOKIE[$this->CSRFCookieName]; - } - - $rand = random_bytes(16); - $this->CSRFHash = bin2hex($rand); - } - - return $this->CSRFHash; - } - - //-------------------------------------------------------------------- - - /** - * Sanitize Filename - * - * Tries to sanitize filenames in order to prevent directory traversal attempts - * and other security threats, which is particularly useful for files that - * were supplied via user input. - * - * If it is acceptable for the user input to include relative paths, - * e.g. file/in/some/approved/folder.txt, you can set the second optional - * parameter, $relative_path to TRUE. - * - * @param string $str Input file name - * @param boolean $relative_path Whether to preserve paths - * - * @return string - */ - public function sanitizeFilename(string $str, bool $relative_path = false): string - { - $bad = $this->filenameBadChars; - - if (! $relative_path) - { - $bad[] = './'; - $bad[] = '/'; - } - - $str = remove_invisible_characters($str, false); - - do - { - $old = $str; - $str = str_replace($bad, '', $str); - } - while ($old !== $str); - - return stripslashes($str); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Session/Exceptions/SessionException.php b/vendor/codeigniter4/framework/system/Session/Exceptions/SessionException.php deleted file mode 100644 index f4733c0..0000000 --- a/vendor/codeigniter4/framework/system/Session/Exceptions/SessionException.php +++ /dev/null @@ -1,32 +0,0 @@ -cookiePrefix = $config->cookiePrefix; - $this->cookieDomain = $config->cookieDomain; - $this->cookiePath = $config->cookiePath; - $this->cookieSecure = $config->cookieSecure; - $this->cookieName = $config->sessionCookieName; - $this->matchIP = $config->sessionMatchIP; - $this->savePath = $config->sessionSavePath; - $this->ipAddress = $ipAddress; - } - - //-------------------------------------------------------------------- - - /** - * Internal method to force removal of a cookie by the client - * when session_destroy() is called. - * - * @return boolean - */ - protected function destroyCookie(): bool - { - return setcookie( - $this->cookieName, null, 1, $this->cookiePath, $this->cookieDomain, $this->cookieSecure, true - ); - } - - //-------------------------------------------------------------------- - - /** - * A dummy method allowing drivers with no locking functionality - * (databases other than PostgreSQL and MySQL) to act as if they - * do acquire a lock. - * - * @param string $sessionID - * - * @return boolean - */ - protected function lockSession(string $sessionID): bool - { - $this->lock = true; - return true; - } - - //-------------------------------------------------------------------- - - /** - * Releases the lock, if any. - * - * @return boolean - */ - protected function releaseLock(): bool - { - $this->lock = false; - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Fail - * - * Drivers other than the 'files' one don't (need to) use the - * session.save_path INI setting, but that leads to confusing - * error messages emitted by PHP when open() or write() fail, - * as the message contains session.save_path ... - * To work around the problem, the drivers will call this method - * so that the INI is set just in time for the error message to - * be properly generated. - * - * @return boolean - */ - protected function fail(): bool - { - ini_set('session.save_path', $this->savePath); - - return false; - } -} diff --git a/vendor/codeigniter4/framework/system/Session/Handlers/DatabaseHandler.php b/vendor/codeigniter4/framework/system/Session/Handlers/DatabaseHandler.php deleted file mode 100644 index 71ecbde..0000000 --- a/vendor/codeigniter4/framework/system/Session/Handlers/DatabaseHandler.php +++ /dev/null @@ -1,430 +0,0 @@ -table = $config->sessionSavePath; - - if (empty($this->table)) - { - throw SessionException::forMissingDatabaseTable(); - } - - // Get DB Connection - $this->DBGroup = $config->sessionDBGroup ?? config(Database::class)->defaultGroup; - - $this->db = Database::connect($this->DBGroup); - - // Determine Database type - $driver = strtolower(get_class($this->db)); - if (strpos($driver, 'mysql') !== false) - { - $this->platform = 'mysql'; - } - elseif (strpos($driver, 'postgre') !== false) - { - $this->platform = 'postgre'; - } - } - - //-------------------------------------------------------------------- - - /** - * Open - * - * Ensures we have an initialized database connection. - * - * @param string $savePath Path to session files' directory - * @param string $name Session cookie name - * - * @return boolean - * @throws \Exception - */ - public function open($savePath, $name): bool - { - if (empty($this->db->connID)) - { - $this->db->initialize(); - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Read - * - * Reads session data and acquires a lock - * - * @param string $sessionID Session ID - * - * @return string Serialized session data - */ - public function read($sessionID): string - { - if ($this->lockSession($sessionID) === false) - { - $this->fingerprint = md5(''); - return ''; - } - - // Needed by write() to detect session_regenerate_id() calls - if (is_null($this->sessionID)) - { - $this->sessionID = $sessionID; - } - - $builder = $this->db->table($this->table) - ->select('data') - ->where('id', $sessionID); - - if ($this->matchIP) - { - $builder = $builder->where('ip_address', $this->ipAddress); - } - - $result = $builder->get()->getRow(); - - if ($result === null) - { - // PHP7 will reuse the same SessionHandler object after - // ID regeneration, so we need to explicitly set this to - // FALSE instead of relying on the default ... - $this->rowExists = false; - $this->fingerprint = md5(''); - - return ''; - } - - // PostgreSQL's variant of a BLOB datatype is Bytea, which is a - // PITA to work with, so we use base64-encoded data in a TEXT - // field instead. - if (is_bool($result)) - { - $result = ''; - } - else - { - $result = ($this->platform === 'postgre') ? base64_decode(rtrim($result->data)) : $result->data; - } - - $this->fingerprint = md5($result); - $this->rowExists = true; - - return $result; - } - - //-------------------------------------------------------------------- - - /** - * Write - * - * Writes (create / update) session data - * - * @param string $sessionID Session ID - * @param string $sessionData Serialized session data - * - * @return boolean - */ - public function write($sessionID, $sessionData): bool - { - if ($this->lock === false) - { - return $this->fail(); - } - - // Was the ID regenerated? - elseif ($sessionID !== $this->sessionID) - { - $this->rowExists = false; - $this->sessionID = $sessionID; - } - - if ($this->rowExists === false) - { - $insertData = [ - 'id' => $sessionID, - 'ip_address' => $this->ipAddress, - 'timestamp' => time(), - 'data' => $this->platform === 'postgre' ? base64_encode($sessionData) : $sessionData, - ]; - - if (! $this->db->table($this->table)->insert($insertData)) - { - return $this->fail(); - } - - $this->fingerprint = md5($sessionData); - $this->rowExists = true; - - return true; - } - - $builder = $this->db->table($this->table)->where('id', $sessionID); - - if ($this->matchIP) - { - $builder = $builder->where('ip_address', $this->ipAddress); - } - - $updateData = [ - 'timestamp' => time(), - ]; - - if ($this->fingerprint !== md5($sessionData)) - { - $updateData['data'] = ($this->platform === 'postgre') ? base64_encode($sessionData) : $sessionData; - } - - if (! $builder->update($updateData)) - { - return $this->fail(); - } - - $this->fingerprint = md5($sessionData); - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Close - * - * Releases locks and closes file descriptor. - * - * @return boolean - */ - public function close(): bool - { - return ($this->lock && ! $this->releaseLock()) ? $this->fail() : true; - } - - //-------------------------------------------------------------------- - - /** - * Destroy - * - * Destroys the current session. - * - * @param string $sessionID - * - * @return boolean - */ - public function destroy($sessionID): bool - { - if ($this->lock) - { - $builder = $this->db->table($this->table)->where('id', $sessionID); - - if ($this->matchIP) - { - $builder = $builder->where('ip_address', $this->ipAddress); - } - - if (! $builder->delete()) - { - return $this->fail(); - } - } - - if ($this->close()) - { - $this->destroyCookie(); - - return true; - } - - return $this->fail(); - } - - //-------------------------------------------------------------------- - - /** - * Garbage Collector - * - * Deletes expired sessions - * - * @param integer $maxlifetime Maximum lifetime of sessions - * - * @return boolean - */ - public function gc($maxlifetime): bool - { - return ($this->db->table($this->table)->delete('timestamp < ' . (time() - $maxlifetime))) ? true : $this->fail(); - } - - //-------------------------------------------------------------------- - - /** - * Lock the session. - * - * @param string $sessionID - * @return boolean - */ - protected function lockSession(string $sessionID): bool - { - if ($this->platform === 'mysql') - { - $arg = md5($sessionID . ($this->matchIP ? '_' . $this->ipAddress : '')); - if ($this->db->query("SELECT GET_LOCK('{$arg}', 300) AS ci_session_lock")->getRow()->ci_session_lock) - { - $this->lock = $arg; - return true; - } - - return $this->fail(); - } - elseif ($this->platform === 'postgre') - { - $arg = "hashtext('{$sessionID}')" . ($this->matchIP ? ", hashtext('{$this->ipAddress}')" : ''); - if ($this->db->simpleQuery("SELECT pg_advisory_lock({$arg})")) - { - $this->lock = $arg; - return true; - } - - return $this->fail(); - } - - // Unsupported DB? Let the parent handle the simplified version. - return parent::lockSession($sessionID); - } - - //-------------------------------------------------------------------- - - /** - * Releases the lock, if any. - * - * @return boolean - */ - protected function releaseLock(): bool - { - if (! $this->lock) - { - return true; - } - - if ($this->platform === 'mysql') - { - if ($this->db->query("SELECT RELEASE_LOCK('{$this->lock}') AS ci_session_lock")->getRow()->ci_session_lock) - { - $this->lock = false; - return true; - } - - return $this->fail(); - } - elseif ($this->platform === 'postgre') - { - if ($this->db->simpleQuery("SELECT pg_advisory_unlock({$this->lock})")) - { - $this->lock = false; - return true; - } - - return $this->fail(); - } - - // Unsupported DB? Let the parent handle the simple version. - return parent::releaseLock(); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Session/Handlers/FileHandler.php b/vendor/codeigniter4/framework/system/Session/Handlers/FileHandler.php deleted file mode 100644 index 19fc57f..0000000 --- a/vendor/codeigniter4/framework/system/Session/Handlers/FileHandler.php +++ /dev/null @@ -1,422 +0,0 @@ -sessionSavePath)) - { - $this->savePath = rtrim($config->sessionSavePath, '/\\'); - ini_set('session.save_path', $config->sessionSavePath); - } - else - { - $sessionPath = rtrim(ini_get('session.save_path'), '/\\'); - - if (! $sessionPath) - { - $sessionPath = WRITEPATH . 'session'; - } - - $this->savePath = $sessionPath; - } - - $this->matchIP = $config->sessionMatchIP; - - $this->configureSessionIDRegex(); - } - - //-------------------------------------------------------------------- - - /** - * Open - * - * Sanitizes the save_path directory. - * - * @param string $savePath Path to session files' directory - * @param string $name Session cookie name - * - * @return boolean - * @throws \Exception - */ - public function open($savePath, $name): bool - { - if (! is_dir($savePath)) - { - if (! mkdir($savePath, 0700, true)) - { - throw SessionException::forInvalidSavePath($this->savePath); - } - } - elseif (! is_writable($savePath)) - { - throw SessionException::forWriteProtectedSavePath($this->savePath); - } - - $this->savePath = $savePath; - $this->filePath = $this->savePath . '/' - . $name // we'll use the session cookie name as a prefix to avoid collisions - . ($this->matchIP ? md5($this->ipAddress) : ''); - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Read - * - * Reads session data and acquires a lock - * - * @param string $sessionID Session ID - * - * @return string Serialized session data - */ - public function read($sessionID): string - { - // This might seem weird, but PHP 5.6 introduced session_reset(), - // which re-reads session data - if ($this->fileHandle === null) - { - $this->fileNew = ! is_file($this->filePath . $sessionID); - - if (($this->fileHandle = fopen($this->filePath . $sessionID, 'c+b')) === false) - { - $this->logger->error("Session: Unable to open file '" . $this->filePath . $sessionID . "'."); - - return false; - } - - if (flock($this->fileHandle, LOCK_EX) === false) - { - $this->logger->error("Session: Unable to obtain lock for file '" . $this->filePath . $sessionID . "'."); - fclose($this->fileHandle); - $this->fileHandle = null; - - return false; - } - - // Needed by write() to detect session_regenerate_id() calls - if (is_null($this->sessionID)) - { - $this->sessionID = $sessionID; - } - - if ($this->fileNew) - { - chmod($this->filePath . $sessionID, 0600); - $this->fingerprint = md5(''); - - return ''; - } - } - else - { - rewind($this->fileHandle); - } - - $session_data = ''; - clearstatcache(); // Address https://github.com/codeigniter4/CodeIgniter4/issues/2056 - for ($read = 0, $length = filesize($this->filePath . $sessionID); $read < $length; $read += strlen($buffer)) - { - if (($buffer = fread($this->fileHandle, $length - $read)) === false) - { - break; - } - - $session_data .= $buffer; - } - - $this->fingerprint = md5($session_data); - - return $session_data; - } - - //-------------------------------------------------------------------- - - /** - * Write - * - * Writes (create / update) session data - * - * @param string $sessionID Session ID - * @param string $sessionData Serialized session data - * - * @return boolean - */ - public function write($sessionID, $sessionData): bool - { - // If the two IDs don't match, we have a session_regenerate_id() call - if ($sessionID !== $this->sessionID) - { - $this->sessionID = $sessionID; - } - - if (! is_resource($this->fileHandle)) - { - return false; - } - elseif ($this->fingerprint === md5($sessionData)) - { - return ($this->fileNew) ? true : touch($this->filePath . $sessionID); - } - - if (! $this->fileNew) - { - ftruncate($this->fileHandle, 0); - rewind($this->fileHandle); - } - - if (($length = strlen($sessionData)) > 0) - { - for ($written = 0; $written < $length; $written += $result) - { - if (($result = fwrite($this->fileHandle, substr($sessionData, $written))) === false) - { - break; - } - } - - if (! is_int($result)) - { - $this->fingerprint = md5(substr($sessionData, 0, $written)); - $this->logger->error('Session: Unable to write data.'); - - return false; - } - } - - $this->fingerprint = md5($sessionData); - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Close - * - * Releases locks and closes file descriptor. - * - * @return boolean - */ - public function close(): bool - { - if (is_resource($this->fileHandle)) - { - flock($this->fileHandle, LOCK_UN); - fclose($this->fileHandle); - - $this->fileHandle = $this->fileNew = null; - - return true; - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Destroy - * - * Destroys the current session. - * - * @param string $session_id Session ID - * - * @return boolean - */ - public function destroy($session_id): bool - { - if ($this->close()) - { - return is_file($this->filePath . $session_id) - ? (unlink($this->filePath . $session_id) && $this->destroyCookie()) : true; - } - elseif ($this->filePath !== null) - { - clearstatcache(); - - return is_file($this->filePath . $session_id) - ? (unlink($this->filePath . $session_id) && $this->destroyCookie()) : true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Garbage Collector - * - * Deletes expired sessions - * - * @param integer $maxlifetime Maximum lifetime of sessions - * - * @return boolean - */ - public function gc($maxlifetime): bool - { - if (! is_dir($this->savePath) || ($directory = opendir($this->savePath)) === false) - { - $this->logger->debug("Session: Garbage collector couldn't list files under directory '" . $this->savePath . "'."); - - return false; - } - - $ts = time() - $maxlifetime; - - $pattern = $this->matchIP === true - ? '[0-9a-f]{32}' - : ''; - - $pattern = sprintf( - '#\A%s' . $pattern . $this->sessionIDRegex . '\z#', - preg_quote($this->cookieName) - ); - - while (($file = readdir($directory)) !== false) - { - // If the filename doesn't match this pattern, it's either not a session file or is not ours - if (! preg_match($pattern, $file) - || ! is_file($this->savePath . DIRECTORY_SEPARATOR . $file) - || ($mtime = filemtime($this->savePath . DIRECTORY_SEPARATOR . $file)) === false - || $mtime > $ts - ) - { - continue; - } - - unlink($this->savePath . DIRECTORY_SEPARATOR . $file); - } - - closedir($directory); - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Configure Session ID regular expression - */ - protected function configureSessionIDRegex() - { - $bitsPerCharacter = (int)ini_get('session.sid_bits_per_character'); - $SIDLength = (int)ini_get('session.sid_length'); - - if (($bits = $SIDLength * $bitsPerCharacter) < 160) - { - // Add as many more characters as necessary to reach at least 160 bits - $SIDLength += (int)ceil((160 % $bits) / $bitsPerCharacter); - ini_set('session.sid_length', $SIDLength); - } - - // Yes, 4,5,6 are the only known possible values as of 2016-10-27 - switch ($bitsPerCharacter) - { - case 4: - $this->sessionIDRegex = '[0-9a-f]'; - break; - case 5: - $this->sessionIDRegex = '[0-9a-v]'; - break; - case 6: - $this->sessionIDRegex = '[0-9a-zA-Z,-]'; - break; - } - - $this->sessionIDRegex .= '{' . $SIDLength . '}'; - } -} diff --git a/vendor/codeigniter4/framework/system/Session/Handlers/MemcachedHandler.php b/vendor/codeigniter4/framework/system/Session/Handlers/MemcachedHandler.php deleted file mode 100644 index f35405e..0000000 --- a/vendor/codeigniter4/framework/system/Session/Handlers/MemcachedHandler.php +++ /dev/null @@ -1,405 +0,0 @@ -savePath)) - { - throw SessionException::forEmptySavepath(); - } - - if ($this->matchIP === true) - { - $this->keyPrefix .= $this->ipAddress . ':'; - } - - if (! empty($this->keyPrefix)) - { - ini_set('memcached.sess_prefix', $this->keyPrefix); - } - - $this->sessionExpiration = $config->sessionExpiration; - } - - //-------------------------------------------------------------------- - - /** - * Open - * - * Sanitizes save_path and initializes connections. - * - * @param string $save_path Server path(s) - * @param string $name Session cookie name, unused - * - * @return boolean - */ - public function open($save_path, $name): bool - { - $this->memcached = new \Memcached(); - $this->memcached->setOption(\Memcached::OPT_BINARY_PROTOCOL, true); // required for touch() usage - - $server_list = []; - - foreach ($this->memcached->getServerList() as $server) - { - $server_list[] = $server['host'] . ':' . $server['port']; - } - - if (! preg_match_all('#,?([^,:]+)\:(\d{1,5})(?:\:(\d+))?#', $this->savePath, $matches, PREG_SET_ORDER) - ) - { - $this->memcached = null; - $this->logger->error('Session: Invalid Memcached save path format: ' . $this->savePath); - - return false; - } - - foreach ($matches as $match) - { - // If Memcached already has this server (or if the port is invalid), skip it - if (in_array($match[1] . ':' . $match[2], $server_list, true)) - { - $this->logger->debug('Session: Memcached server pool already has ' . $match[1] . ':' . $match[2]); - continue; - } - - if (! $this->memcached->addServer($match[1], $match[2], $match[3] ?? 0)) - { - $this->logger->error('Could not add ' . $match[1] . ':' . $match[2] . ' to Memcached server pool.'); - } - else - { - $server_list[] = $match[1] . ':' . $match[2]; - } - } - - if (empty($server_list)) - { - $this->logger->error('Session: Memcached server pool is empty.'); - - return false; - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Read - * - * Reads session data and acquires a lock - * - * @param string $sessionID Session ID - * - * @return string Serialized session data - */ - public function read($sessionID): string - { - if (isset($this->memcached) && $this->lockSession($sessionID)) - { - // Needed by write() to detect session_regenerate_id() calls - if (is_null($this->sessionID)) - { - $this->sessionID = $sessionID; - } - - $session_data = (string) $this->memcached->get($this->keyPrefix . $sessionID); - $this->fingerprint = md5($session_data); - - return $session_data; - } - - return ''; - } - - //-------------------------------------------------------------------- - - /** - * Write - * - * Writes (create / update) session data - * - * @param string $sessionID Session ID - * @param string $sessionData Serialized session data - * - * @return boolean - */ - public function write($sessionID, $sessionData): bool - { - if (! isset($this->memcached)) - { - return false; - } - // Was the ID regenerated? - elseif ($sessionID !== $this->sessionID) - { - if (! $this->releaseLock() || ! $this->lockSession($sessionID)) - { - return false; - } - - $this->fingerprint = md5(''); - $this->sessionID = $sessionID; - } - - if (isset($this->lockKey)) - { - $this->memcached->replace($this->lockKey, time(), 300); - - if ($this->fingerprint !== ($fingerprint = md5($sessionData))) - { - if ($this->memcached->set($this->keyPrefix . $sessionID, $sessionData, $this->sessionExpiration)) - { - $this->fingerprint = $fingerprint; - - return true; - } - - return false; - } - - return $this->memcached->touch($this->keyPrefix . $sessionID, $this->sessionExpiration); - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Close - * - * Releases locks and closes connection. - * - * @return boolean - */ - public function close(): bool - { - if (isset($this->memcached)) - { - isset($this->lockKey) && $this->memcached->delete($this->lockKey); - - if (! $this->memcached->quit()) - { - return false; - } - - $this->memcached = null; - - return true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Destroy - * - * Destroys the current session. - * - * @param string $session_id Session ID - * - * @return boolean - */ - public function destroy($session_id): bool - { - if (isset($this->memcached, $this->lockKey)) - { - $this->memcached->delete($this->keyPrefix . $session_id); - - return $this->destroyCookie(); - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Garbage Collector - * - * Deletes expired sessions - * - * @param integer $maxlifetime Maximum lifetime of sessions - * - * @return boolean - */ - public function gc($maxlifetime): bool - { - // Not necessary, Memcached takes care of that. - return true; - } - - //-------------------------------------------------------------------- - - /** - * Get lock - * - * Acquires an (emulated) lock. - * - * @param string $sessionID Session ID - * - * @return boolean - */ - protected function lockSession(string $sessionID): bool - { - if (isset($this->lockKey)) - { - return $this->memcached->replace($this->lockKey, time(), 300); - } - - // 30 attempts to obtain a lock, in case another request already has it - $lock_key = $this->keyPrefix . $sessionID . ':lock'; - $attempt = 0; - - do - { - if ($this->memcached->get($lock_key)) - { - sleep(1); - continue; - } - - if (! $this->memcached->set($lock_key, time(), 300)) - { - $this->logger->error('Session: Error while trying to obtain lock for ' . $this->keyPrefix . $sessionID); - - return false; - } - - $this->lockKey = $lock_key; - break; - } - while (++ $attempt < 30); - - if ($attempt === 30) - { - $this->logger->error('Session: Unable to obtain lock for ' . $this->keyPrefix . $sessionID . ' after 30 attempts, aborting.'); - - return false; - } - - $this->lock = true; - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Release lock - * - * Releases a previously acquired lock - * - * @return boolean - */ - protected function releaseLock(): bool - { - if (isset($this->memcached, $this->lockKey) && $this->lock) - { - if (! $this->memcached->delete($this->lockKey) && - $this->memcached->getResultCode() !== \Memcached::RES_NOTFOUND - ) - { - $this->logger->error('Session: Error while trying to free lock for ' . $this->lockKey); - - return false; - } - - $this->lockKey = null; - $this->lock = false; - } - - return true; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Session/Handlers/RedisHandler.php b/vendor/codeigniter4/framework/system/Session/Handlers/RedisHandler.php deleted file mode 100644 index a6fcb33..0000000 --- a/vendor/codeigniter4/framework/system/Session/Handlers/RedisHandler.php +++ /dev/null @@ -1,424 +0,0 @@ -savePath)) - { - throw SessionException::forEmptySavepath(); - } - elseif (preg_match('#(?:tcp://)?([^:?]+)(?:\:(\d+))?(\?.+)?#', $this->savePath, $matches)) - { - isset($matches[3]) || $matches[3] = ''; // Just to avoid undefined index notices below - - $this->savePath = [ - 'host' => $matches[1], - 'port' => empty($matches[2]) ? null : $matches[2], - 'password' => preg_match('#auth=([^\s&]+)#', $matches[3], $match) ? $match[1] : null, - 'database' => preg_match('#database=(\d+)#', $matches[3], $match) ? (int) $match[1] : null, - 'timeout' => preg_match('#timeout=(\d+\.\d+)#', $matches[3], $match) ? (float) $match[1] : null, - ]; - - preg_match('#prefix=([^\s&]+)#', $matches[3], $match) && $this->keyPrefix = $match[1]; - } - else - { - throw SessionException::forInvalidSavePathFormat($this->savePath); - } - - if ($this->matchIP === true) - { - $this->keyPrefix .= $this->ipAddress . ':'; - } - - $this->sessionExpiration = empty($config->sessionExpiration) - ? (int) ini_get('session.gc_maxlifetime') - : (int) $config->sessionExpiration; - } - - //-------------------------------------------------------------------- - - /** - * Open - * - * Sanitizes save_path and initializes connection. - * - * @param string $save_path Server path - * @param string $name Session cookie name, unused - * @return boolean - */ - public function open($save_path, $name): bool - { - if (empty($this->savePath)) - { - return false; - } - - $redis = new \Redis(); - - if (! $redis->connect($this->savePath['host'], $this->savePath['port'], $this->savePath['timeout'])) - { - $this->logger->error('Session: Unable to connect to Redis with the configured settings.'); - } - elseif (isset($this->savePath['password']) && ! $redis->auth($this->savePath['password'])) - { - $this->logger->error('Session: Unable to authenticate to Redis instance.'); - } - elseif (isset($this->savePath['database']) && ! $redis->select($this->savePath['database'])) - { - $this->logger->error('Session: Unable to select Redis database with index ' . $this->savePath['database']); - } - else - { - $this->redis = $redis; - return true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Read - * - * Reads session data and acquires a lock - * - * @param string $sessionID Session ID - * - * @return string|false Serialized session data - */ - public function read($sessionID): string - { - if (isset($this->redis) && $this->lockSession($sessionID)) - { - // Needed by write() to detect session_regenerate_id() calls - if (is_null($this->sessionID)) - { - $this->sessionID = $sessionID; - } - - $session_data = $this->redis->get($this->keyPrefix . $sessionID); - is_string($session_data) ? $this->keyExists = true : $session_data = ''; - - $this->fingerprint = md5($session_data); - - return $session_data; - } - - return ''; - } - - //-------------------------------------------------------------------- - - /** - * Write - * - * Writes (create / update) session data - * - * @param string $sessionID Session ID - * @param string $sessionData Serialized session data - * - * @return boolean - */ - public function write($sessionID, $sessionData): bool - { - if (! isset($this->redis)) - { - return false; - } - // Was the ID regenerated? - elseif ($sessionID !== $this->sessionID) - { - if (! $this->releaseLock() || ! $this->lockSession($sessionID)) - { - return false; - } - - $this->keyExists = false; - $this->sessionID = $sessionID; - } - - if (isset($this->lockKey)) - { - $this->redis->expire($this->lockKey, 300); - - if ($this->fingerprint !== ($fingerprint = md5($sessionData)) || $this->keyExists === false) - { - if ($this->redis->set($this->keyPrefix . $sessionID, $sessionData, $this->sessionExpiration)) - { - $this->fingerprint = $fingerprint; - $this->keyExists = true; - return true; - } - - return false; - } - - return $this->redis->expire($this->keyPrefix . $sessionID, $this->sessionExpiration); - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Close - * - * Releases locks and closes connection. - * - * @return boolean - */ - public function close(): bool - { - if (isset($this->redis)) - { - try - { - $ping_reply = $this->redis->ping(); - if (($ping_reply === true) || ($ping_reply === '+PONG')) - { - isset($this->lockKey) && $this->redis->del($this->lockKey); - - if (! $this->redis->close()) - { - return false; - } - } - } - catch (\RedisException $e) - { - $this->logger->error('Session: Got RedisException on close(): ' . $e->getMessage()); - } - - $this->redis = null; - - return true; - } - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Destroy - * - * Destroys the current session. - * - * @param string $sessionID - * - * @return boolean - */ - public function destroy($sessionID): bool - { - if (isset($this->redis, $this->lockKey)) - { - if (($result = $this->redis->del($this->keyPrefix . $sessionID)) !== 1) - { - $this->logger->debug('Session: Redis::del() expected to return 1, got ' . var_export($result, true) . ' instead.'); - } - - return $this->destroyCookie(); - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Garbage Collector - * - * Deletes expired sessions - * - * @param integer $maxlifetime Maximum lifetime of sessions - * @return boolean - */ - public function gc($maxlifetime): bool - { - // Not necessary, Redis takes care of that. - return true; - } - - //-------------------------------------------------------------------- - - /** - * Get lock - * - * Acquires an (emulated) lock. - * - * @param string $sessionID Session ID - * - * @return boolean - */ - protected function lockSession(string $sessionID): bool - { - // PHP 7 reuses the SessionHandler object on regeneration, - // so we need to check here if the lock key is for the - // correct session ID. - if ($this->lockKey === $this->keyPrefix . $sessionID . ':lock') - { - return $this->redis->expire($this->lockKey, 300); - } - - // 30 attempts to obtain a lock, in case another request already has it - $lock_key = $this->keyPrefix . $sessionID . ':lock'; - $attempt = 0; - - do - { - if (($ttl = $this->redis->ttl($lock_key)) > 0) - { - sleep(1); - continue; - } - - if (! $this->redis->setex($lock_key, 300, time())) - { - $this->logger->error('Session: Error while trying to obtain lock for ' . $this->keyPrefix . $sessionID); - return false; - } - - $this->lockKey = $lock_key; - break; - } - while (++ $attempt < 30); - - if ($attempt === 30) - { - log_message('error', 'Session: Unable to obtain lock for ' . $this->keyPrefix . $sessionID . ' after 30 attempts, aborting.'); - return false; - } - elseif ($ttl === -1) - { - log_message('debug', 'Session: Lock for ' . $this->keyPrefix . $sessionID . ' had no TTL, overriding.'); - } - - $this->lock = true; - return true; - } - - //-------------------------------------------------------------------- - - /** - * Release lock - * - * Releases a previously acquired lock - * - * @return boolean - */ - protected function releaseLock(): bool - { - if (isset($this->redis, $this->lockKey) && $this->lock) - { - if (! $this->redis->del($this->lockKey)) - { - $this->logger->error('Session: Error while trying to free lock for ' . $this->lockKey); - return false; - } - - $this->lockKey = null; - $this->lock = false; - } - - return true; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Session/Session.php b/vendor/codeigniter4/framework/system/Session/Session.php deleted file mode 100644 index d925bd7..0000000 --- a/vendor/codeigniter4/framework/system/Session/Session.php +++ /dev/null @@ -1,1023 +0,0 @@ -driver = $driver; - - $this->sessionDriverName = $config->sessionDriver; - $this->sessionCookieName = $config->sessionCookieName; - $this->sessionExpiration = $config->sessionExpiration; - $this->sessionSavePath = $config->sessionSavePath; - $this->sessionMatchIP = $config->sessionMatchIP; - $this->sessionTimeToUpdate = $config->sessionTimeToUpdate; - $this->sessionRegenerateDestroy = $config->sessionRegenerateDestroy; - - $this->cookieDomain = $config->cookieDomain; - $this->cookiePath = $config->cookiePath; - $this->cookieSecure = $config->cookieSecure; - - helper('array'); - } - - //-------------------------------------------------------------------- - - /** - * Initialize the session container and starts up the session. - * - * @return mixed - */ - public function start() - { - if (is_cli() && ENVIRONMENT !== 'testing') - { - // @codeCoverageIgnoreStart - $this->logger->debug('Session: Initialization under CLI aborted.'); - - return; - // @codeCoverageIgnoreEnd - } - elseif ((bool) ini_get('session.auto_start')) - { - $this->logger->error('Session: session.auto_start is enabled in php.ini. Aborting.'); - - return; - } - elseif (session_status() === PHP_SESSION_ACTIVE) - { - $this->logger->warning('Session: Sessions is enabled, and one exists.Please don\'t $session->start();'); - - return; - } - - if (! $this->driver instanceof \SessionHandlerInterface) - { - $this->logger->error("Session: Handler '" . $this->driver . - "' doesn't implement SessionHandlerInterface. Aborting."); - } - - $this->configure(); - - $this->setSaveHandler(); - - // Sanitize the cookie, because apparently PHP doesn't do that for userspace handlers - if (isset($_COOKIE[$this->sessionCookieName]) && ( - ! is_string($_COOKIE[$this->sessionCookieName]) || ! preg_match('#\A' . $this->sidRegexp . '\z#', $_COOKIE[$this->sessionCookieName]) - ) - ) - { - unset($_COOKIE[$this->sessionCookieName]); - } - - $this->startSession(); - - // Is session ID auto-regeneration configured? (ignoring ajax requests) - if ((empty($_SERVER['HTTP_X_REQUESTED_WITH']) || - strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') && ($regenerate_time = $this->sessionTimeToUpdate) > 0 - ) - { - if (! isset($_SESSION['__ci_last_regenerate'])) - { - $_SESSION['__ci_last_regenerate'] = time(); - } - elseif ($_SESSION['__ci_last_regenerate'] < (time() - $regenerate_time)) - { - $this->regenerate((bool) $this->sessionRegenerateDestroy); - } - } - // Another work-around ... PHP doesn't seem to send the session cookie - // unless it is being currently created or regenerated - elseif (isset($_COOKIE[$this->sessionCookieName]) && $_COOKIE[$this->sessionCookieName] === session_id()) - { - $this->setCookie(); - } - - $this->initVars(); - - $this->logger->info("Session: Class initialized using '" . $this->sessionDriverName . "' driver."); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Does a full stop of the session: - * - * - destroys the session - * - unsets the session id - * - destroys the session cookie - */ - public function stop() - { - setcookie( - $this->sessionCookieName, session_id(), 1, $this->cookiePath, $this->cookieDomain, $this->cookieSecure, true - ); - - session_regenerate_id(true); - } - - //-------------------------------------------------------------------- - - /** - * Configuration. - * - * Handle input binds and configuration defaults. - */ - protected function configure() - { - if (empty($this->sessionCookieName)) - { - $this->sessionCookieName = ini_get('session.name'); - } - else - { - ini_set('session.name', $this->sessionCookieName); - } - - session_set_cookie_params( - $this->sessionExpiration, $this->cookiePath, $this->cookieDomain, $this->cookieSecure, true // HTTP only; Yes, this is intentional and not configurable for security reasons. - ); - - //if (empty($this->sessionExpiration)) - if (! isset($this->sessionExpiration)) - { - $this->sessionExpiration = (int) ini_get('session.gc_maxlifetime'); - } - else - { - ini_set('session.gc_maxlifetime', (int) $this->sessionExpiration); - } - - if (! empty($this->sessionSavePath)) - { - ini_set('session.save_path', $this->sessionSavePath); - } - - // Security is king - ini_set('session.use_trans_sid', 0); - ini_set('session.use_strict_mode', 1); - ini_set('session.use_cookies', 1); - ini_set('session.use_only_cookies', 1); - - $this->configureSidLength(); - } - - // ------------------------------------------------------------------------ - - /** - * Configure session ID length - * - * To make life easier, we used to force SHA-1 and 4 bits per - * character on everyone. And of course, someone was unhappy. - * - * Then PHP 7.1 broke backwards-compatibility because ext/session - * is such a mess that nobody wants to touch it with a pole stick, - * and the one guy who does, nobody has the energy to argue with. - * - * So we were forced to make changes, and OF COURSE something was - * going to break and now we have this pile of shit. -- Narf - * - * @return void - */ - protected function configureSidLength() - { - $bits_per_character = (int) (ini_get('session.sid_bits_per_character') !== false - ? ini_get('session.sid_bits_per_character') - : 4); - $sid_length = (int) (ini_get('session.sid_length') !== false - ? ini_get('session.sid_length') - : 40); - if (($sid_length * $bits_per_character) < 160) - { - $bits = ($sid_length * $bits_per_character); - // Add as many more characters as necessary to reach at least 160 bits - $sid_length += (int) ceil((160 % $bits) / $bits_per_character); - ini_set('session.sid_length', $sid_length); - } - - // Yes, 4,5,6 are the only known possible values as of 2016-10-27 - switch ($bits_per_character) - { - case 4: - $this->sidRegexp = '[0-9a-f]'; - break; - case 5: - $this->sidRegexp = '[0-9a-v]'; - break; - case 6: - $this->sidRegexp = '[0-9a-zA-Z,-]'; - break; - } - - $this->sidRegexp .= '{' . $sid_length . '}'; - } - - //-------------------------------------------------------------------- - - /** - * Handle temporary variables - * - * Clears old "flash" data, marks the new one for deletion and handles - * "temp" data deletion. - */ - protected function initVars() - { - if (empty($_SESSION['__ci_vars'])) - { - return; - } - - $current_time = time(); - - foreach ($_SESSION['__ci_vars'] as $key => &$value) - { - if ($value === 'new') - { - $_SESSION['__ci_vars'][$key] = 'old'; - } - // Hacky, but 'old' will (implicitly) always be less than time() ;) - // DO NOT move this above the 'new' check! - elseif ($value < $current_time) - { - unset($_SESSION[$key], $_SESSION['__ci_vars'][$key]); - } - } - - if (empty($_SESSION['__ci_vars'])) - { - unset($_SESSION['__ci_vars']); - } - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // Session Utility Methods - //-------------------------------------------------------------------- - - /** - * Regenerates the session ID. - * - * @param boolean $destroy Should old session data be destroyed? - */ - public function regenerate(bool $destroy = false) - { - $_SESSION['__ci_last_regenerate'] = time(); - session_regenerate_id($destroy); - } - - //-------------------------------------------------------------------- - - /** - * Destroys the current session. - */ - public function destroy() - { - session_destroy(); - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // Basic Setters and Getters - //-------------------------------------------------------------------- - - /** - * Sets user data into the session. - * - * If $data is a string, then it is interpreted as a session property - * key, and $value is expected to be non-null. - * - * If $data is an array, it is expected to be an array of key/value pairs - * to be set as session properties. - * - * @param string|array $data Property name or associative array of properties - * @param string|array $value Property value if single key provided - */ - public function set($data, $value = null) - { - if (is_array($data)) - { - foreach ($data as $key => &$value) - { - if (is_int($key)) - { - $_SESSION[$value] = null; - } - else - { - $_SESSION[$key] = $value; - } - } - - return; - } - - $_SESSION[$data] = $value; - } - - //-------------------------------------------------------------------- - - /** - * Get user data that has been set in the session. - * - * If the property exists as "normal", returns it. - * Otherwise, returns an array of any temp or flash data values with the - * property key. - * - * Replaces the legacy method $session->userdata(); - * - * @param string $key Identifier of the session property to retrieve - * @return array|null The property value(s) - */ - public function get(string $key = null) - { - if (! empty($key) && (! is_null($value = isset($_SESSION[$key]) ? $_SESSION[$key] : null) || ! is_null($value = dot_array_search($key, $_SESSION ?? [])))) - { - return $value; - } - elseif (empty($_SESSION)) - { - return $key === null ? [] : null; - } - - if (! empty($key)) - { - return null; - } - - $userdata = []; - $_exclude = array_merge( - ['__ci_vars'], $this->getFlashKeys(), $this->getTempKeys() - ); - - $keys = array_keys($_SESSION); - foreach ($keys as $key) - { - if (! in_array($key, $_exclude, true)) - { - $userdata[$key] = $_SESSION[$key]; - } - } - - return $userdata; - } - - //-------------------------------------------------------------------- - - /** - * Returns whether an index exists in the session array. - * - * @param string $key Identifier of the session property we are interested in. - * - * @return boolean - */ - public function has(string $key): bool - { - return isset($_SESSION[$key]); - } - - //-------------------------------------------------------------------- - - /** - * Push new value onto session value that is array. - * - * @param string $key Identifier of the session property we are interested in. - * @param array $data value to be pushed to existing session key. - * - * @return void - */ - public function push(string $key, array $data) - { - if ($this->has($key) && is_array($value = $this->get($key))) - { - $this->set($key, array_merge($value, $data)); - } - } - - //-------------------------------------------------------------------- - - /** - * Remove one or more session properties. - * - * If $key is an array, it is interpreted as an array of string property - * identifiers to remove. Otherwise, it is interpreted as the identifier - * of a specific session property to remove. - * - * @param string|array $key Identifier of the session property or properties to remove. - */ - public function remove($key) - { - if (is_array($key)) - { - foreach ($key as $k) - { - unset($_SESSION[$k]); - } - - return; - } - - unset($_SESSION[$key]); - } - - //-------------------------------------------------------------------- - - /** - * Magic method to set variables in the session by simply calling - * $session->foo = bar; - * - * @param string $key Identifier of the session property to set. - * @param string|array $value - */ - public function __set(string $key, $value) - { - $_SESSION[$key] = $value; - } - - //-------------------------------------------------------------------- - - /** - * Magic method to get session variables by simply calling - * $foo = $session->foo; - * - * @param string $key Identifier of the session property to remove. - * - * @return null|string - */ - public function __get(string $key) - { - // Note: Keep this order the same, just in case somebody wants to - // use 'session_id' as a session data key, for whatever reason - if (isset($_SESSION[$key])) - { - return $_SESSION[$key]; - } - elseif ($key === 'session_id') - { - return session_id(); - } - - return null; - } - - //-------------------------------------------------------------------- - - /** - * Magic method to check for session variables. - * Different from has() in that it will validate 'session_id' as well. - * Mostly used by internal PHP functions, users should stick to has() - * - * @param string $key Identifier of the session property to remove. - * - * @return boolean - */ - public function __isset(string $key): bool - { - return isset($_SESSION[$key]) || ($key === 'session_id'); - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // Flash Data Methods - //-------------------------------------------------------------------- - - /** - * Sets data into the session that will only last for a single request. - * Perfect for use with single-use status update messages. - * - * If $data is an array, it is interpreted as an associative array of - * key/value pairs for flashdata properties. - * Otherwise, it is interpreted as the identifier of a specific - * flashdata property, with $value containing the property value. - * - * @param array|string $data Property identifier or associative array of properties - * @param string|array $value Property value if $data is a scalar - */ - public function setFlashdata($data, $value = null) - { - $this->set($data, $value); - $this->markAsFlashdata(is_array($data) ? array_keys($data) : $data); - } - - //-------------------------------------------------------------------- - - /** - * Retrieve one or more items of flash data from the session. - * - * If the item key is null, return all flashdata. - * - * @param string $key Property identifier - * @return array|null The requested property value, or an associative array of them - */ - public function getFlashdata(string $key = null) - { - if (isset($key)) - { - return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && - ! is_int($_SESSION['__ci_vars'][$key])) ? $_SESSION[$key] : null; - } - - $flashdata = []; - - if (! empty($_SESSION['__ci_vars'])) - { - foreach ($_SESSION['__ci_vars'] as $key => &$value) - { - is_int($value) || $flashdata[$key] = $_SESSION[$key]; - } - } - - return $flashdata; - } - - //-------------------------------------------------------------------- - - /** - * Keeps a single piece of flash data alive for one more request. - * - * @param array|string $key Property identifier or array of them - */ - public function keepFlashdata($key) - { - $this->markAsFlashdata($key); - } - - //-------------------------------------------------------------------- - - /** - * Mark a session property or properties as flashdata. - * - * @param array|string $key Property identifier or array of them - * - * @return boolean False if any of the properties are not already set - */ - public function markAsFlashdata($key): bool - { - if (is_array($key)) - { - foreach ($key as $sessionKey) - { - if (! isset($_SESSION[$sessionKey])) - { - return false; - } - } - - $new = array_fill_keys($key, 'new'); - - $_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? array_merge($_SESSION['__ci_vars'], $new) : $new; - - return true; - } - - if (! isset($_SESSION[$key])) - { - return false; - } - - $_SESSION['__ci_vars'][$key] = 'new'; - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Unmark data in the session as flashdata. - * - * @param mixed $key Property identifier or array of them - */ - public function unmarkFlashdata($key) - { - if (empty($_SESSION['__ci_vars'])) - { - return; - } - - is_array($key) || $key = [$key]; - - foreach ($key as $k) - { - if (isset($_SESSION['__ci_vars'][$k]) && ! is_int($_SESSION['__ci_vars'][$k])) - { - unset($_SESSION['__ci_vars'][$k]); - } - } - - if (empty($_SESSION['__ci_vars'])) - { - unset($_SESSION['__ci_vars']); - } - } - - //-------------------------------------------------------------------- - - /** - * Retrieve all of the keys for session data marked as flashdata. - * - * @return array The property names of all flashdata - */ - public function getFlashKeys(): array - { - if (! isset($_SESSION['__ci_vars'])) - { - return []; - } - - $keys = []; - foreach (array_keys($_SESSION['__ci_vars']) as $key) - { - is_int($_SESSION['__ci_vars'][$key]) || $keys[] = $key; - } - - return $keys; - } - - //-------------------------------------------------------------------- - //-------------------------------------------------------------------- - // Temp Data Methods - //-------------------------------------------------------------------- - - /** - * Sets new data into the session, and marks it as temporary data - * with a set lifespan. - * - * @param string|array $data Session data key or associative array of items - * @param null $value Value to store - * @param integer $ttl Time-to-live in seconds - */ - public function setTempdata($data, $value = null, int $ttl = 300) - { - $this->set($data, $value); - $this->markAsTempdata($data, $ttl); - } - - //-------------------------------------------------------------------- - - /** - * Returns either a single piece of tempdata, or all temp data currently - * in the session. - * - * @param string $key Session data key - * @return mixed Session data value or null if not found. - */ - public function getTempdata(string $key = null) - { - if (isset($key)) - { - return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && - is_int($_SESSION['__ci_vars'][$key])) ? $_SESSION[$key] : null; - } - - $tempdata = []; - - if (! empty($_SESSION['__ci_vars'])) - { - foreach ($_SESSION['__ci_vars'] as $key => &$value) - { - is_int($value) && $tempdata[$key] = $_SESSION[$key]; - } - } - - return $tempdata; - } - - //-------------------------------------------------------------------- - - /** - * Removes a single piece of temporary data from the session. - * - * @param string $key Session data key - */ - public function removeTempdata(string $key) - { - $this->unmarkTempdata($key); - unset($_SESSION[$key]); - } - - //-------------------------------------------------------------------- - - /** - * Mark one of more pieces of data as being temporary, meaning that - * it has a set lifespan within the session. - * - * @param string|array $key Property identifier or array of them - * @param integer $ttl Time to live, in seconds - * - * @return boolean False if any of the properties were not set - */ - public function markAsTempdata($key, int $ttl = 300): bool - { - $ttl += time(); - - if (is_array($key)) - { - $temp = []; - - foreach ($key as $k => $v) - { - // Do we have a key => ttl pair, or just a key? - if (is_int($k)) - { - $k = $v; - $v = $ttl; - } - elseif (is_string($v)) - { - $v = time() + $ttl; - } - else - { - $v += time(); - } - - if (! array_key_exists($k, $_SESSION)) - { - return false; - } - - $temp[$k] = $v; - } - - $_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? array_merge($_SESSION['__ci_vars'], $temp) : $temp; - - return true; - } - - if (! isset($_SESSION[$key])) - { - return false; - } - - $_SESSION['__ci_vars'][$key] = $ttl; - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Unmarks temporary data in the session, effectively removing its - * lifespan and allowing it to live as long as the session does. - * - * @param string|array $key Property identifier or array of them - */ - public function unmarkTempdata($key) - { - if (empty($_SESSION['__ci_vars'])) - { - return; - } - - is_array($key) || $key = [$key]; - - foreach ($key as $k) - { - if (isset($_SESSION['__ci_vars'][$k]) && is_int($_SESSION['__ci_vars'][$k])) - { - unset($_SESSION['__ci_vars'][$k]); - } - } - - if (empty($_SESSION['__ci_vars'])) - { - unset($_SESSION['__ci_vars']); - } - } - - //-------------------------------------------------------------------- - - /** - * Retrieve the keys of all session data that have been marked as temporary data. - * - * @return array - */ - public function getTempKeys(): array - { - if (! isset($_SESSION['__ci_vars'])) - { - return []; - } - - $keys = []; - foreach (array_keys($_SESSION['__ci_vars']) as $key) - { - is_int($_SESSION['__ci_vars'][$key]) && $keys[] = $key; - } - - return $keys; - } - - //-------------------------------------------------------------------- - - /** - * Sets the driver as the session handler in PHP. - * Extracted for easier testing. - */ - protected function setSaveHandler() - { - session_set_save_handler($this->driver, true); - } - - //-------------------------------------------------------------------- - - /** - * Starts the session. - * Extracted for testing reasons. - */ - protected function startSession() - { - if (ENVIRONMENT === 'testing') - { - $_SESSION = []; - return; - } - - // @codeCoverageIgnoreStart - session_start(); - // @codeCoverageIgnoreEnd - } - - //-------------------------------------------------------------------- - - /** - * Takes care of setting the cookie on the client side. - * Extracted for testing reasons. - */ - protected function setCookie() - { - setcookie( - $this->sessionCookieName, session_id(), (empty($this->sessionExpiration) ? 0 : time() + $this->sessionExpiration), $this->cookiePath, $this->cookieDomain, $this->cookieSecure, true - ); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Session/SessionInterface.php b/vendor/codeigniter4/framework/system/Session/SessionInterface.php deleted file mode 100644 index e098514..0000000 --- a/vendor/codeigniter4/framework/system/Session/SessionInterface.php +++ /dev/null @@ -1,251 +0,0 @@ -userdata(); - * - * @param string $key Identifier of the session property to retrieve - * - * @return array|null The property value(s) - */ - public function get(string $key = null); - - //-------------------------------------------------------------------- - - /** - * Returns whether an index exists in the session array. - * - * @param string $key Identifier of the session property we are interested in. - * - * @return boolean - */ - public function has(string $key): bool; - - //-------------------------------------------------------------------- - - /** - * Remove one or more session properties. - * - * If $key is an array, it is interpreted as an array of string property - * identifiers to remove. Otherwise, it is interpreted as the identifier - * of a specific session property to remove. - * - * @param string|array $key Identifier of the session property or properties to remove. - */ - public function remove($key); - - //-------------------------------------------------------------------- - - /** - * Sets data into the session that will only last for a single request. - * Perfect for use with single-use status update messages. - * - * If $data is an array, it is interpreted as an associative array of - * key/value pairs for flashdata properties. - * Otherwise, it is interpreted as the identifier of a specific - * flashdata property, with $value containing the property value. - * - * @param string|array $data Property identifier or associative array of properties - * @param string|array $value Property value if $data is a scalar - */ - public function setFlashdata($data, $value = null); - - //-------------------------------------------------------------------- - - /** - * Retrieve one or more items of flash data from the session. - * - * If the item key is null, return all flashdata. - * - * @param string $key Property identifier - * @return array|null The requested property value, or an associative - * array of them - */ - public function getFlashdata(string $key = null); - - //-------------------------------------------------------------------- - - /** - * Keeps a single piece of flash data alive for one more request. - * - * @param array|string $key Property identifier or array of them - */ - public function keepFlashdata($key); - - //-------------------------------------------------------------------- - - /** - * Mark a session property or properties as flashdata. - * - * @param string|array $key Property identifier or array of them - * - * @return False if any of the properties are not already set - */ - public function markAsFlashdata($key); - - //-------------------------------------------------------------------- - - /** - * Unmark data in the session as flashdata. - * - * @param string|array $key Property identifier or array of them - */ - public function unmarkFlashdata($key); - - //-------------------------------------------------------------------- - - /** - * Retrieve all of the keys for session data marked as flashdata. - * - * @return array The property names of all flashdata - */ - public function getFlashKeys(): array; - - //-------------------------------------------------------------------- - - /** - * Sets new data into the session, and marks it as temporary data - * with a set lifespan. - * - * @param string|array $data Session data key or associative array of items - * @param mixed $value Value to store - * @param integer $ttl Time-to-live in seconds - */ - public function setTempdata($data, $value = null, int $ttl = 300); - - //-------------------------------------------------------------------- - - /** - * Returns either a single piece of tempdata, or all temp data currently - * in the session. - * - * @param string $key Session data key - * @return mixed Session data value or null if not found. - */ - public function getTempdata(string $key = null); - - //-------------------------------------------------------------------- - - /** - * Removes a single piece of temporary data from the session. - * - * @param string $key Session data key - */ - public function removeTempdata(string $key); - - //-------------------------------------------------------------------- - - /** - * Mark one of more pieces of data as being temporary, meaning that - * it has a set lifespan within the session. - * - * @param string|array $key Property identifier or array of them - * @param integer $ttl Time to live, in seconds - * - * @return boolean False if any of the properties were not set - */ - public function markAsTempdata($key, int $ttl = 300); - - //-------------------------------------------------------------------- - - /** - * Unmarks temporary data in the session, effectively removing its - * lifespan and allowing it to live as long as the session does. - * - * @param string|array $key Property identifier or array of them - */ - public function unmarkTempdata($key); - - //-------------------------------------------------------------------- - - /** - * Retrieve the keys of all session data that have been marked as temporary data. - * - * @return array - */ - public function getTempKeys(): array; - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Test/CIDatabaseTestCase.php b/vendor/codeigniter4/framework/system/Test/CIDatabaseTestCase.php deleted file mode 100644 index 3d11ce3..0000000 --- a/vendor/codeigniter4/framework/system/Test/CIDatabaseTestCase.php +++ /dev/null @@ -1,388 +0,0 @@ -hasInDatabase(); - * - * @var array - */ - protected $insertCache = []; - - //-------------------------------------------------------------------- - - /** - * Load any database test dependencies. - */ - public function loadDependencies() - { - if ($this->db === null) - { - $this->db = Database::connect($this->DBGroup); - $this->db->initialize(); - } - - if ($this->migrations === null) - { - // Ensure that we can run migrations - $config = new Migrations(); - $config->enabled = true; - - $this->migrations = Services::migrations($config, $this->db); - $this->migrations->setSilent(false); - } - - if ($this->seeder === null) - { - $this->seeder = Database::seeder($this->DBGroup); - $this->seeder->setSilent(true); - } - } - - //-------------------------------------------------------------------- - - /** - * Ensures that the database is cleaned up to a known state - * before each test runs. - * - * @throws ConfigException - */ - protected function setUp(): void - { - parent::setUp(); - - $this->loadDependencies(); - - if ($this->refresh === true) - { - $this->regressDatabase(); - - // Reset counts on faked items - Fabricator::resetCounts(); - } - - $this->migrateDatabase(); - - if (! empty($this->seed)) - { - if (! empty($this->basePath)) - { - $this->seeder->setPath(rtrim($this->basePath, '/') . '/Seeds'); - } - - $seeds = is_array($this->seed) ? $this->seed : [$this->seed]; - foreach ($seeds as $seed) - { - $this->seed($seed); - } - } - } - - //-------------------------------------------------------------------- - - /** - * Takes care of any required cleanup after the test, like - * removing any rows inserted via $this->hasInDatabase() - */ - protected function tearDown(): void - { - parent::tearDown(); - - if (! empty($this->insertCache)) - { - foreach ($this->insertCache as $row) - { - $this->db->table($row[0]) - ->where($row[1]) - ->delete(); - } - } - } - - //-------------------------------------------------------------------- - - /** - * Regress migrations as defined by the class - */ - protected function regressDatabase() - { - // If no namespace was specified then rollback all - if (empty($this->namespace)) - { - $this->migrations->setNamespace(null); - $this->migrations->regress(0, 'tests'); - } - - // Regress each specified namespace - else - { - $namespaces = is_array($this->namespace) ? $this->namespace : [$this->namespace]; - - foreach ($namespaces as $namespace) - { - $this->migrations->setNamespace($namespace); - $this->migrations->regress(0, 'tests'); - } - } - } - - /** - * Run migrations as defined by the class - */ - protected function migrateDatabase() - { - // If no namespace was specified then migrate all - if (empty($this->namespace)) - { - $this->migrations->setNamespace(null); - $this->migrations->latest('tests'); - } - // Run migrations for each specified namespace - else - { - $namespaces = is_array($this->namespace) ? $this->namespace : [$this->namespace]; - - foreach ($namespaces as $namespace) - { - $this->migrations->setNamespace($namespace); - $this->migrations->latest('tests'); - } - } - } - - /** - * Seeds that database with a specific seeder. - * - * @param string $name - */ - public function seed(string $name) - { - return $this->seeder->call($name); - } - - //-------------------------------------------------------------------- - // Database Test Helpers - //-------------------------------------------------------------------- - - /** - * Asserts that records that match the conditions in $where do - * not exist in the database. - * - * @param string $table - * @param array $where - * - * @return boolean - */ - public function dontSeeInDatabase(string $table, array $where) - { - $count = $this->db->table($table) - ->where($where) - ->countAllResults(); - - $this->assertTrue($count === 0, 'Row was found in database'); - } - - //-------------------------------------------------------------------- - - /** - * Asserts that records that match the conditions in $where DO - * exist in the database. - * - * @param string $table - * @param array $where - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function seeInDatabase(string $table, array $where) - { - $count = $this->db->table($table) - ->where($where) - ->countAllResults(); - - $this->assertTrue($count > 0, 'Row not found in database: ' . $this->db->showLastQuery()); - } - - //-------------------------------------------------------------------- - - /** - * Fetches a single column from a database row with criteria - * matching $where. - * - * @param string $table - * @param string $column - * @param array $where - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function grabFromDatabase(string $table, string $column, array $where) - { - $query = $this->db->table($table) - ->select($column) - ->where($where) - ->get(); - - $query = $query->getRow(); - - return $query->$column ?? false; - } - - //-------------------------------------------------------------------- - - /** - * Inserts a row into to the database. This row will be removed - * after the test has run. - * - * @param string $table - * @param array $data - * - * @return boolean - */ - public function hasInDatabase(string $table, array $data) - { - $this->insertCache[] = [ - $table, - $data, - ]; - - return $this->db->table($table) - ->insert($data); - } - - //-------------------------------------------------------------------- - - /** - * Asserts that the number of rows in the database that match $where - * is equal to $expected. - * - * @param integer $expected - * @param string $table - * @param array $where - * - * @return boolean - * @throws \CodeIgniter\Database\Exceptions\DatabaseException - */ - public function seeNumRecords(int $expected, string $table, array $where) - { - $count = $this->db->table($table) - ->where($where) - ->countAllResults(); - - $this->assertEquals($expected, $count, 'Wrong number of matching rows in database.'); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Test/CIUnitTestCase.php b/vendor/codeigniter4/framework/system/Test/CIUnitTestCase.php deleted file mode 100644 index d90b2e0..0000000 --- a/vendor/codeigniter4/framework/system/Test/CIUnitTestCase.php +++ /dev/null @@ -1,361 +0,0 @@ -app) - { - $this->app = $this->createApplication(); - } - - foreach ($this->setUpMethods as $method) - { - $this->$method(); - } - } - - protected function tearDown(): void - { - parent::tearDown(); - - foreach ($this->tearDownMethods as $method) - { - $this->$method(); - } - } - - //-------------------------------------------------------------------- - // Mocking - //-------------------------------------------------------------------- - - /** - * Injects the mock session driver into Services - */ - protected function mockSession() - { - $_SESSION = []; - - $config = config('App'); - $session = new MockSession(new ArrayHandler($config, '0.0.0.0'), $config); - - Services::injectMock('session', $session); - } - - /** - * Injects the mock email driver so no emails really send - */ - protected function mockEmail() - { - Services::injectMock('email', new MockEmail(config('Email'))); - } - - //-------------------------------------------------------------------- - // Assertions - //-------------------------------------------------------------------- - - /** - * Custom function to hook into CodeIgniter's Logging mechanism - * to check if certain messages were logged during code execution. - * - * @param string $level - * @param null $expectedMessage - * - * @return boolean - * @throws \Exception - */ - public function assertLogged(string $level, $expectedMessage = null) - { - $result = TestLogger::didLog($level, $expectedMessage); - - $this->assertTrue($result); - return $result; - } - - /** - * Hooks into CodeIgniter's Events system to check if a specific - * event was triggered or not. - * - * @param string $eventName - * - * @return boolean - * @throws \Exception - */ - public function assertEventTriggered(string $eventName): bool - { - $found = false; - $eventName = strtolower($eventName); - - foreach (Events::getPerformanceLogs() as $log) - { - if ($log['event'] !== $eventName) - { - continue; - } - - $found = true; - break; - } - - $this->assertTrue($found); - return $found; - } - - /** - * Hooks into xdebug's headers capture, looking for a specific header - * emitted - * - * @param string $header The leading portion of the header we are looking for - * @param boolean $ignoreCase - * - * @throws \Exception - */ - public function assertHeaderEmitted(string $header, bool $ignoreCase = false): void - { - $found = false; - - if (! function_exists('xdebug_get_headers')) - { - $this->markTestSkipped('XDebug not found.'); - } - - foreach (xdebug_get_headers() as $emitted) - { - $found = $ignoreCase ? - (stripos($emitted, $header) === 0) : - (strpos($emitted, $header) === 0); - if ($found) - { - break; - } - } - - $this->assertTrue($found, "Didn't find header for {$header}"); - } - - /** - * Hooks into xdebug's headers capture, looking for a specific header - * emitted - * - * @param string $header The leading portion of the header we don't want to find - * @param boolean $ignoreCase - * - * @throws \Exception - */ - public function assertHeaderNotEmitted(string $header, bool $ignoreCase = false): void - { - $found = false; - - if (! function_exists('xdebug_get_headers')) - { - $this->markTestSkipped('XDebug not found.'); - } - - foreach (xdebug_get_headers() as $emitted) - { - $found = $ignoreCase ? - (stripos($emitted, $header) === 0) : - (strpos($emitted, $header) === 0); - if ($found) - { - break; - } - } - - $success = ! $found; - $this->assertTrue($success, "Found header for {$header}"); - } - - /** - * Custom function to test that two values are "close enough". - * This is intended for extended execution time testing, - * where the result is close but not exactly equal to the - * expected time, for reasons beyond our control. - * - * @param integer $expected - * @param mixed $actual - * @param string $message - * @param integer $tolerance - * - * @throws \Exception - */ - public function assertCloseEnough(int $expected, $actual, string $message = '', int $tolerance = 1) - { - $difference = abs($expected - (int) floor($actual)); - - $this->assertLessThanOrEqual($tolerance, $difference, $message); - } - - /** - * Custom function to test that two values are "close enough". - * This is intended for extended execution time testing, - * where the result is close but not exactly equal to the - * expected time, for reasons beyond our control. - * - * @param mixed $expected - * @param mixed $actual - * @param string $message - * @param integer $tolerance - * - * @return boolean - * @throws \Exception - */ - public function assertCloseEnoughString($expected, $actual, string $message = '', int $tolerance = 1) - { - $expected = (string) $expected; - $actual = (string) $actual; - if (strlen($expected) !== strlen($actual)) - { - return false; - } - - try - { - $expected = (int) substr($expected, -2); - $actual = (int) substr($actual, -2); - $difference = abs($expected - $actual); - - $this->assertLessThanOrEqual($tolerance, $difference, $message); - } - catch (\Exception $e) - { - return false; - } - } - - //-------------------------------------------------------------------- - // Utility - //-------------------------------------------------------------------- - - /** - * Loads up an instance of CodeIgniter - * and gets the environment setup. - * - * @return \CodeIgniter\CodeIgniter - */ - protected function createApplication() - { - return require realpath(__DIR__ . '/../') . '/bootstrap.php'; - } - - /** - * Return first matching emitted header. - * - * @param string $header Identifier of the header of interest - * @param boolean $ignoreCase - * - * @return string|null The value of the header found, null if not found - */ - protected function getHeaderEmitted(string $header, bool $ignoreCase = false): ?string - { - $found = false; - - if (! function_exists('xdebug_get_headers')) - { - $this->markTestSkipped('XDebug not found.'); - } - - foreach (xdebug_get_headers() as $emitted) - { - $found = $ignoreCase ? - (stripos($emitted, $header) === 0) : - (strpos($emitted, $header) === 0); - if ($found) - { - return $emitted; - } - } - - return null; - } -} diff --git a/vendor/codeigniter4/framework/system/Test/ControllerResponse.php b/vendor/codeigniter4/framework/system/Test/ControllerResponse.php deleted file mode 100644 index a187ce7..0000000 --- a/vendor/codeigniter4/framework/system/Test/ControllerResponse.php +++ /dev/null @@ -1,227 +0,0 @@ -dom = new DOMParser(); - } - - //-------------------------------------------------------------------- - // Getters / Setters - //-------------------------------------------------------------------- - - /** - * Set the body & DOM. - * - * @param string $body - * - * @return $this - */ - public function setBody(string $body) - { - $this->body = $body; - - if (! empty($body)) - { - $this->dom = $this->dom->withString($body); - } - - return $this; - } - - /** - * Retrieve the body. - * - * @return string - */ - public function getBody() - { - return $this->body; - } - - /** - * Set the request. - * - * @param \CodeIgniter\HTTP\RequestInterface $request - * - * @return $this - */ - public function setRequest(RequestInterface $request) - { - $this->request = $request; - - return $this; - } - - /** - * Set the response. - * - * @param \CodeIgniter\HTTP\ResponseInterface $response - * - * @return $this - */ - public function setResponse(ResponseInterface $response) - { - $this->response = $response; - - $this->setBody($response->getBody() ?? ''); - - return $this; - } - - /** - * Request accessor. - * - * @return \CodeIgniter\HTTP\IncomingRequest - */ - public function request() - { - return $this->request; - } - - /** - * Response accessor. - * - * @return \CodeIgniter\HTTP\Response - */ - public function response() - { - return $this->response; - } - - //-------------------------------------------------------------------- - // Simple Response Checks - //-------------------------------------------------------------------- - - /** - * Boils down the possible responses into a boolean valid/not-valid - * response type. - * - * @return boolean - */ - public function isOK(): bool - { - // Only 200 and 300 range status codes - // are considered valid. - if ($this->response->getStatusCode() >= 400 || $this->response->getStatusCode() < 200) - { - return false; - } - - // Empty bodies are not considered valid. - if (empty($this->response->getBody())) - { - return false; - } - - return true; - } - - /** - * Returns whether or not the Response was a redirect response - * - * @return boolean - */ - public function isRedirect(): bool - { - return $this->response instanceof RedirectResponse; - } - - //-------------------------------------------------------------------- - // Utility - //-------------------------------------------------------------------- - - /** - * Forward any unrecognized method calls to our DOMParser instance. - * - * @param string $function Method name - * @param mixed $params Any method parameters - * @return mixed - */ - public function __call($function, $params) - { - if (method_exists($this->dom, $function)) - { - return $this->dom->{$function}(...$params); - } - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/ControllerTester.php b/vendor/codeigniter4/framework/system/Test/ControllerTester.php deleted file mode 100644 index 89d4431..0000000 --- a/vendor/codeigniter4/framework/system/Test/ControllerTester.php +++ /dev/null @@ -1,316 +0,0 @@ -withRequest($request) - * ->withResponse($response) - * ->withURI($uri) - * ->withBody($body) - * ->controller('App\Controllers\Home') - * ->run('methodName'); - */ -trait ControllerTester -{ - - /** - * Controller configuration. - * - * @var BaseConfig - */ - protected $appConfig; - - /** - * Request. - * - * @var Request - */ - protected $request; - /** - * Response. - * - * @var Response - */ - protected $response; - /** - * Message logger. - * - * @var LoggerInterface - */ - protected $logger; - /** - * Initialized controller. - * - * @var Controller - */ - protected $controller; - /** - * URI of this request. - * - * @var string - */ - protected $uri = 'http://example.com'; - /** - * Request or response body. - * - * @var string - */ - protected $body; - - /** - * Loads the specified controller, and generates any needed dependencies. - * - * @param string $name - * - * @return mixed - */ - public function controller(string $name) - { - if (! class_exists($name)) - { - throw new InvalidArgumentException('Invalid Controller: ' . $name); - } - - if (empty($this->appConfig)) - { - $this->appConfig = new App(); - } - - if (! $this->uri instanceof URI) - { - $this->uri = new URI($this->appConfig->baseURL ?? 'http://example.com'); - } - - if (empty($this->request)) - { - $this->request = new IncomingRequest($this->appConfig, $this->uri, $this->body, new UserAgent()); - } - - if (empty($this->response)) - { - $this->response = new Response($this->appConfig); - } - - if (empty($this->logger)) - { - $this->logger = Services::logger(); - } - - $this->controller = new $name(); - $this->controller->initController($this->request, $this->response, $this->logger); - - return $this; - } - - /** - * Runs the specified method on the controller and returns the results. - * - * @param string $method - * @param array $params - * - * @return \CodeIgniter\Test\ControllerResponse|\InvalidArgumentException - */ - public function execute(string $method, ...$params) - { - if (! method_exists($this->controller, $method) || ! is_callable([$this->controller, $method])) - { - throw new InvalidArgumentException('Method does not exist or is not callable in controller: ' . $method); - } - - // The URL helper is always loaded by the system - // so ensure it's available. - helper('url'); - - $result = (new ControllerResponse()) - ->setRequest($this->request) - ->setResponse($this->response); - - $response = null; - try - { - ob_start(); - - $response = $this->controller->{$method}(...$params); - } - catch (Throwable $e) - { - $result->response() - ->setStatusCode($e->getCode()); - } - finally - { - $output = ob_get_clean(); - - // If the controller returned a response, use it - if (isset($response) && $response instanceof Response) - { - $result->setResponse($response); - } - - // check if controller returned a view rather than echoing it - if (is_string($response)) - { - $output = $response; - $result->response()->setBody($output); - $result->setBody($output); - } - elseif (! empty($response) && ! empty($response->getBody())) - { - $result->setBody($response->getBody()); - } - else - { - $result->setBody(''); - } - } - - // If not response code has been sent, assume a success - if (empty($result->response()->getStatusCode())) - { - $result->response()->setStatusCode(200); - } - - return $result; - } - - /** - * Set controller's config, with method chaining. - * - * @param mixed $appConfig - * - * @return mixed - */ - public function withConfig($appConfig) - { - $this->appConfig = $appConfig; - - return $this; - } - - /** - * Set controller's request, with method chaining. - * - * @param mixed $request - * - * @return mixed - */ - public function withRequest($request) - { - $this->request = $request; - - // Make sure it's available for other classes - Services::injectMock('request', $request); - - return $this; - } - - /** - * Set controller's response, with method chaining. - * - * @param mixed $response - * - * @return mixed - */ - public function withResponse($response) - { - $this->response = $response; - - return $this; - } - - /** - * Set controller's logger, with method chaining. - * - * @param mixed $logger - * - * @return mixed - */ - public function withLogger($logger) - { - $this->logger = $logger; - - return $this; - } - - /** - * Set the controller's URI, with method chaining. - * - * @param string $uri - * - * @return mixed - */ - public function withUri(string $uri) - { - $this->uri = new URI($uri); - - return $this; - } - - /** - * Set the method's body, with method chaining. - * - * @param mixed $body - * - * @return mixed - */ - public function withBody($body) - { - $this->body = $body; - - return $this; - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/DOMParser.php b/vendor/codeigniter4/framework/system/Test/DOMParser.php deleted file mode 100644 index 95b8896..0000000 --- a/vendor/codeigniter4/framework/system/Test/DOMParser.php +++ /dev/null @@ -1,359 +0,0 @@ -dom = new \DOMDocument('1.0', 'utf-8'); - } - - /** - * Returns the body of the current document. - * - * @return string - */ - public function getBody(): string - { - return $this->dom->saveHTML(); - } - - /** - * Sets a string as the body that we want to work with. - * - * @param string $content - * - * @return $this - */ - public function withString(string $content) - { - // converts all special characters to utf-8 - $content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'); - - //turning off some errors - libxml_use_internal_errors(true); - - if (! $this->dom->loadHTML($content)) - { - // unclear how we would get here, given that we are trapping libxml errors - // @codeCoverageIgnoreStart - libxml_clear_errors(); - throw new \BadMethodCallException('Invalid HTML'); - // @codeCoverageIgnoreEnd - } - - // ignore the whitespace. - $this->dom->preserveWhiteSpace = false; - - return $this; - } - - /** - * Loads the contents of a file as a string - * so that we can work with it. - * - * @param string $path - * - * @return \CodeIgniter\Test\DOMParser - */ - public function withFile(string $path) - { - if (! is_file($path)) - { - throw new \InvalidArgumentException(basename($path) . ' is not a valid file.'); - } - - $content = file_get_contents($path); - - return $this->withString($content); - } - - /** - * Checks to see if the text is found within the result. - * - * @param string $search - * @param string $element - * - * @return boolean - */ - public function see(string $search = null, string $element = null): bool - { - // If Element is null, we're just scanning for text - if (is_null($element)) - { - $content = $this->dom->saveHTML($this->dom->documentElement); - return mb_strpos($content, $search) !== false; - } - - $result = $this->doXPath($search, $element); - - return (bool)$result->length; - } - - /** - * Checks to see if the text is NOT found within the result. - * - * @param string $search - * @param string|null $element - * - * @return boolean - */ - public function dontSee(string $search = null, string $element = null): bool - { - return ! $this->see($search, $element); - } - - /** - * Checks to see if an element with the matching CSS specifier - * is found within the current DOM. - * - * @param string $element - * - * @return boolean - */ - public function seeElement(string $element): bool - { - return $this->see(null, $element); - } - - /** - * Checks to see if the element is available within the result. - * - * @param string $element - * - * @return boolean - */ - public function dontSeeElement(string $element): bool - { - return $this->dontSee(null, $element); - } - - /** - * Determines if a link with the specified text is found - * within the results. - * - * @param string $text - * @param string|null $details - * - * @return boolean - */ - public function seeLink(string $text, string $details = null): bool - { - return $this->see($text, 'a' . $details); - } - - /** - * Checks for an input named $field with a value of $value. - * - * @param string $field - * @param string $value - * - * @return boolean - */ - public function seeInField(string $field, string $value): bool - { - $result = $this->doXPath(null, 'input', ["[@value=\"{$value}\"][@name=\"{$field}\"]"]); - - return (bool)$result->length; - } - - /** - * Checks for checkboxes that are currently checked. - * - * @param string $element - * - * @return boolean - */ - public function seeCheckboxIsChecked(string $element): bool - { - $result = $this->doXPath(null, 'input' . $element, [ - '[@type="checkbox"]', - '[@checked="checked"]', - ]); - - return (bool)$result->length; - } - - //-------------------------------------------------------------------- - /** - * Search the DOM using an XPath expression. - * - * @param string $search - * @param string $element - * @param array $paths - * @return type - */ - - protected function doXPath(string $search = null, string $element, array $paths = []) - { - // Otherwise, grab any elements that match - // the selector - $selector = $this->parseSelector($element); - - $path = ''; - - // By ID - if (! empty($selector['id'])) - { - $path = empty($selector['tag']) - ? "id(\"{$selector['id']}\")" - : "//body//{$selector['tag']}[@id=\"{$selector['id']}\"]"; - } - // By Class - else if (! empty($selector['class'])) - { - $path = empty($selector['tag']) - ? "//*[@class=\"{$selector['class']}\"]" - : "//body//{$selector['tag']}[@class=\"{$selector['class']}\"]"; - } - // By tag only - else if (! empty($selector['tag'])) - { - $path = "//body//{$selector['tag']}"; - } - - if (! empty($selector['attr'])) - { - foreach ($selector['attr'] as $key => $value) - { - $path .= "[@{$key}=\"{$value}\"]"; - } - } - - // $paths might contain a number of different - // ready to go xpath portions to tack on. - if (! empty($paths) && is_array($paths)) - { - foreach ($paths as $extra) - { - $path .= $extra; - } - } - - if (! is_null($search)) - { - $path .= "[contains(., \"{$search}\")]"; - } - - $xpath = new \DOMXPath($this->dom); - - return $xpath->query($path); - } - - /** - * Look for the a selector in the passed text. - * - * @param string $selector - * @return type - */ - public function parseSelector(string $selector) - { - $tag = null; - $id = null; - $class = null; - $attr = null; - - // ID? - if ($pos = strpos($selector, '#') !== false) - { - list($tag, $id) = explode('#', $selector); - } - // Attribute - elseif (strpos($selector, '[') !== false && strpos($selector, ']') !== false) - { - $open = strpos($selector, '['); - $close = strpos($selector, ']'); - - $tag = substr($selector, 0, $open); - $text = substr($selector, $open + 1, $close - 2); - - // We only support a single attribute currently - $text = explode(',', $text); - $text = trim(array_shift($text)); - - list($name, $value) = explode('=', $text); - $name = trim($name); - $value = trim($value); - $attr = [$name => trim($value, '] ')]; - } - // Class? - elseif ($pos = strpos($selector, '.') !== false) - { - list($tag, $class) = explode('.', $selector); - } - // Otherwise, assume the entire string is our tag - else - { - $tag = $selector; - } - - return [ - 'tag' => $tag, - 'id' => $id, - 'class' => $class, - 'attr' => $attr, - ]; - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/Fabricator.php b/vendor/codeigniter4/framework/system/Test/Fabricator.php deleted file mode 100644 index 3791a37..0000000 --- a/vendor/codeigniter4/framework/system/Test/Fabricator.php +++ /dev/null @@ -1,648 +0,0 @@ - formatter - * @param string|null $locale Locale for Faker provider - * - * @throws \InvalidArgumentException - */ - public function __construct($model, array $formatters = null, string $locale = null) - { - if (is_string($model)) - { - // Create a new model instance - $model = model($model, false); - } - - if (! is_object($model)) - { - throw new \InvalidArgumentException(lang('Fabricator.invalidModel')); - } - - $this->model = $model; - - // If no locale was specified then use the App default - if (is_null($locale)) - { - $locale = config('App')->defaultLocale; - } - - // There is no easy way to retrieve the locale from Faker so we will store it - $this->locale = $locale; - - // Create the locale-specific Generator - $this->faker = Factory::create($this->locale); - - // Determine eligible date fields - foreach (['createdField', 'updatedField', 'deletedField'] as $field) - { - if (! empty($this->model->$field)) - { - $this->dateFields[] = $this->model->$field; - } - } - - // Set the formatters - $this->setFormatters($formatters); - } - - //-------------------------------------------------------------------- - - /** - * Reset internal counts - */ - public static function resetCounts() - { - self::$tableCounts = []; - } - - /** - * Get the count for a specific table - * - * @param string $table Name of the target table - * - * @return integer - */ - public static function getCount(string $table): int - { - return empty(self::$tableCounts[$table]) ? 0 : self::$tableCounts[$table]; - } - - /** - * Set the count for a specific table - * - * @param string $table Name of the target table - * @param integer $count Count value - * - * @return integer The new count value - */ - public static function setCount(string $table, int $count): int - { - self::$tableCounts[$table] = $count; - return $count; - } - - /** - * Increment the count for a table - * - * @param string $table Name of the target table - * - * @return integer The new count value - */ - public static function upCount(string $table): int - { - return self::setCount($table, self::getCount($table) + 1); - } - - /** - * Decrement the count for a table - * - * @param string $table Name of the target table - * - * @return integer The new count value - */ - public static function downCount(string $table): int - { - return self::setCount($table, self::getCount($table) - 1); - } - - //-------------------------------------------------------------------- - - /** - * Returns the model instance - * - * @return object Framework or compatible model - */ - public function getModel() - { - return $this->model; - } - - /** - * Returns the locale - * - * @return string - */ - public function getLocale(): string - { - return $this->locale; - } - - /** - * Returns the Faker generator - * - * @return Faker\Generator - */ - public function getFaker(): Generator - { - return $this->faker; - } - - //-------------------------------------------------------------------- - - /** - * Return and reset tempOverrides - * - * @return array - */ - public function getOverrides(): array - { - $overrides = $this->tempOverrides ?? $this->overrides; - - $this->tempOverrides = $this->overrides; - - return $overrides; - } - - /** - * Set the overrides, once or persistent - * - * @param array $overrides Array of [field => value] - * @param boolean $persist Whether these overrides should persist through the next operation - * - * @return $this - */ - public function setOverrides(array $overrides = [], $persist = true): self - { - if ($persist) - { - $this->overrides = $overrides; - } - - $this->tempOverrides = $overrides; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the current formatters - * - * @return array|null - */ - public function getFormatters(): ?array - { - return $this->formatters; - } - - /** - * Set the formatters to use. Will attempt to autodetect if none are available. - * - * @param array|null $formatters Array of [field => formatter], or null to detect - * - * @return $this - */ - public function setFormatters(array $formatters = null): self - { - if (! is_null($formatters)) - { - $this->formatters = $formatters; - } - elseif (method_exists($this->model, 'fake')) - { - $this->formatters = null; - } - else - { - $formatters = $this->detectFormatters(); - } - - return $this; - } - - /** - * Try to identify the appropriate Faker formatter for each field. - * - * @return $this - */ - protected function detectFormatters(): self - { - $this->formatters = []; - - if (! empty($this->model->allowedFields)) - { - foreach ($this->model->allowedFields as $field) - { - $this->formatters[$field] = $this->guessFormatter($field); - } - } - - return $this; - } - - /** - * Guess at the correct formatter to match a field name. - * - * @param $field Name of the field - * - * @return string Name of the formatter - */ - protected function guessFormatter($field): string - { - // First check for a Faker formatter of the same name - covers things like "email" - try - { - $this->faker->getFormatter($field); - return $field; - } - catch (\InvalidArgumentException $e) - { - // No match, keep going - } - - // Next look for known model fields - if (in_array($field, $this->dateFields)) - { - switch ($this->model->dateFormat) - { - case 'datetime': - return 'date'; - break; - - case 'date': - return 'date'; - break; - - case 'int': - return 'unixTime'; - break; - } - } - elseif ($field === $this->model->primaryKey) - { - return 'numberBetween'; - } - - // Check some common partials - foreach (['email', 'name', 'title', 'text', 'date', 'url'] as $term) - { - if (stripos($field, $term) !== false) - { - return $term; - } - } - - if (stripos($field, 'phone') !== false) - { - return 'phoneNumber'; - } - - // Nothing left, use the default - return $this->defaultFormatter; - } - - //-------------------------------------------------------------------- - - /** - * Generate new entities with faked data - * - * @param integer|null $count Optional number to create a collection - * - * @return array|object An array or object (based on returnType), or an array of returnTypes - */ - public function make(int $count = null) - { - // If a singleton was requested then go straight to it - if (is_null($count)) - { - return $this->model->returnType === 'array' - ? $this->makeArray() - : $this->makeObject(); - } - - $return = []; - - for ($i = 0; $i < $count; $i++) - { - $return[] = $this->model->returnType === 'array' - ? $this->makeArray() - : $this->makeObject(); - } - - return $return; - } - - /** - * Generate an array of faked data - * - * @return array An array of faked data - * - * @throws \RuntimeException - */ - public function makeArray() - { - if (! is_null($this->formatters)) - { - $result = []; - - foreach ($this->formatters as $field => $formatter) - { - $result[$field] = $this->faker->{$formatter}; - } - } - - // If no formatters were defined then look for a model fake() method - elseif (method_exists($this->model, 'fake')) - { - $result = $this->model->fake($this->faker); - - // This should cover entities - if (method_exists($result, 'toArray')) - { - $result = $result->toArray(); - } - // Try to cast it - else - { - $result = (array) $result; - } - } - - // Nothing left to do but give up - else - { - throw new \RuntimeException(lang('Fabricator.missingFormatters')); - } - - // Replace overridden fields - return array_merge($result, $this->getOverrides()); - } - - /** - * Generate an object of faked data - * - * @param string|null $className Class name of the object to create; null to use model default - * - * @return object An instance of the class with faked data - * - * @throws \RuntimeException - */ - public function makeObject(string $className = null): object - { - if (is_null($className)) - { - if ($this->model->returnType === 'object' || $this->model->returnType === 'array') - { - $className = 'stdClass'; - } - else - { - $className = $this->model->returnType; - } - } - - // If using the model's fake() method then check it for the correct return type - if (is_null($this->formatters) && method_exists($this->model, 'fake')) - { - $result = $this->model->fake($this->faker); - - if ($result instanceof $className) - { - // Set overrides manually - foreach ($this->getOverrides() as $key => $value) - { - $result->{$key} = $value; - } - - return $result; - } - } - - // Get the array values and apply them to the object - $array = $this->makeArray(); - $object = new $className(); - - // Check for the entity method - if (method_exists($object, 'fill')) - { - $object->fill($array); - } - else - { - foreach ($array as $key => $value) - { - $object->{$key} = $value; - } - } - - return $object; - } - - //-------------------------------------------------------------------- - - /** - * Generate new entities from the database - * - * @param integer|null $count Optional number to create a collection - * @param array $override Array of data to add/override - * @param boolean $mock Whether to execute or mock the insertion - * - * @return array|object An array or object (based on returnType), or an array of returnTypes - */ - public function create(int $count = null, bool $mock = false) - { - // Intercept mock requests - if ($mock) - { - return $this->createMock($count); - } - - $ids = []; - - // Iterate over new entities and insert each one, storing insert IDs - foreach ($this->make($count ?? 1) as $result) - { - if ($id = $this->model->insert($result, true)) - { - $ids[] = $id; - self::upCount($this->model->table); - } - } - - // If the model defines a "withDeleted" method for handling soft deletes then use it - if (method_exists($this->model, 'withDeleted')) - { - $this->model->withDeleted(); - } - - return $this->model->find(is_null($count) ? reset($ids) : $ids); - } - - /** - * Generate new database entities without actually inserting them - * - * @param integer|null $count Optional number to create a collection - * - * @return array|object An array or object (based on returnType), or an array of returnTypes - */ - protected function createMock(int $count = null) - { - switch ($this->model->dateFormat) - { - case 'datetime': - $datetime = date('Y-m-d H:i:s'); - case 'date': - $datetime = date('Y-m-d'); - default: - $datetime = time(); - } - - // Determine which fields we will need - $fields = []; - - if (! empty($this->model->useTimestamps)) - { - $fields[$this->model->createdField] = $datetime; - $fields[$this->model->updatedField] = $datetime; - } - - if (! empty($this->model->useSoftDeletes)) - { - $fields[$this->model->deletedField] = null; - } - - // Iterate over new entities and add the necessary fields - $return = []; - foreach ($this->make($count ?? 1) as $i => $result) - { - // Set the ID - $fields[$this->model->primaryKey] = $i; - - // Merge fields - if (is_array($result)) - { - $result = array_merge($result, $fields); - } - else - { - foreach ($fields as $key => $value) - { - $result->{$key} = $value; - } - } - - $return[] = $result; - } - - return is_null($count) ? reset($return) : $return; - } -} diff --git a/vendor/codeigniter4/framework/system/Test/FeatureResponse.php b/vendor/codeigniter4/framework/system/Test/FeatureResponse.php deleted file mode 100644 index 6c919b7..0000000 --- a/vendor/codeigniter4/framework/system/Test/FeatureResponse.php +++ /dev/null @@ -1,439 +0,0 @@ -response = $response; - - $body = $response->getBody(); - if (! empty($body) && is_string($body)) - { - $this->domParser = (new DOMParser())->withString($body); - } - } - - //-------------------------------------------------------------------- - // Simple Response Checks - //-------------------------------------------------------------------- - - /** - * Boils down the possible responses into a bolean valid/not-valid - * response type. - * - * @return boolean - */ - public function isOK(): bool - { - $status = $this->response->getStatusCode(); - - // Only 200 and 300 range status codes - // are considered valid. - if ($status >= 400 || $status < 200) - { - return false; - } - - // Empty bodies are not considered valid, unless in redirects - if ($status < 300 && empty($this->response->getBody())) - { - return false; - } - - return true; - } - - /** - * Returns whether or not the Response was a redirect response - * - * @return boolean - */ - public function isRedirect(): bool - { - return $this->response instanceof RedirectResponse; - } - - /** - * Assert that the given response was a redirect. - * - * @throws \Exception - */ - public function assertRedirect() - { - $this->assertTrue($this->isRedirect(), 'Response is not a RedirectResponse.'); - } - - /** - * Returns the URL set for redirection. - * - * @return string|null - */ - public function getRedirectUrl(): ?string - { - if (! $this->isRedirect()) - { - return null; - } - - if ($this->response->hasHeader('Location')) - { - return $this->response->getHeaderLine('Location'); - } - elseif ($this->response->hasHeader('Refresh')) - { - return str_replace('0;url=', '', $this->response->getHeaderLine('Refresh')); - } - - return null; - } - - /** - * Asserts that the status is a specific value. - * - * @param integer $code - * - * @throws \Exception - */ - public function assertStatus(int $code) - { - $this->assertEquals($code, (int) $this->response->getStatusCode()); - } - - /** - * Asserts that the Response is considered OK. - * - * @throws \Exception - */ - public function assertOK() - { - $this->assertTrue($this->isOK(), "{$this->response->getStatusCode()} is not a successful status code, or the Response has an empty body."); - } - - //-------------------------------------------------------------------- - // Session Assertions - //-------------------------------------------------------------------- - - /** - * Asserts that an SESSION key has been set and, optionally, test it's value. - * - * @param string $key - * @param null $value - * - * @throws \Exception - */ - public function assertSessionHas(string $key, $value = null) - { - $this->assertTrue(array_key_exists($key, $_SESSION), "'{$key}' is not in the current \$_SESSION"); - - if ($value !== null) - { - $this->assertEquals($value, $_SESSION[$key], "The value of '{$key}' ({$value}) does not match expected value."); - } - } - - /** - * Asserts the session is missing $key. - * - * @param string $key - * - * @throws \Exception - */ - public function assertSessionMissing(string $key) - { - $this->assertFalse(array_key_exists($key, $_SESSION), "'{$key}' should not be present in \$_SESSION."); - } - - //-------------------------------------------------------------------- - // Header Assertions - //-------------------------------------------------------------------- - - /** - * Asserts that the Response contains a specific header. - * - * @param string $key - * @param null $value - * - * @throws \Exception - */ - public function assertHeader(string $key, $value = null) - { - $this->assertTrue($this->response->hasHeader($key), "'{$key}' is not a valid Response header."); - - if ($value !== null) - { - $this->assertEquals($value, $this->response->getHeaderLine($key), "The value of '{$key}' header ({$this->response->getHeaderLine($key)}) does not match expected value."); - } - } - - /** - * Asserts the Response headers does not contain the specified header. - * - * @param string $key - * - * @throws \Exception - */ - public function assertHeaderMissing(string $key) - { - $this->assertFalse($this->response->hasHeader($key), "'{$key}' should not be in the Response headers."); - } - - //-------------------------------------------------------------------- - // Cookie Assertions - //-------------------------------------------------------------------- - - /** - * Asserts that the response has the specified cookie. - * - * @param string $key - * @param null $value - * @param string|null $prefix - * - * @throws \Exception - */ - public function assertCookie(string $key, $value = null, string $prefix = '') - { - $this->assertTrue($this->response->hasCookie($key, $value, $prefix), "No cookie found named '{$key}'."); - } - - /** - * Assert the Response does not have the specified cookie set. - * - * @param string $key - */ - public function assertCookieMissing(string $key) - { - $this->assertFalse($this->response->hasCookie($key), "Cookie named '{$key}' should not be set."); - } - - /** - * Asserts that a cookie exists and has an expired time. - * - * @param string $key - * @param string $prefix - * - * @throws \Exception - */ - public function assertCookieExpired(string $key, string $prefix = '') - { - $this->assertTrue($this->response->hasCookie($key, null, $prefix)); - $this->assertGreaterThan(time(), $this->response->getCookie($key, $prefix)['expires']); - } - - //-------------------------------------------------------------------- - // DomParser Assertions - //-------------------------------------------------------------------- - - /** - * Assert that the desired text can be found in the result body. - * - * @param string|null $search - * @param string|null $element - * - * @throws \Exception - */ - public function assertSee(string $search = null, string $element = null) - { - $this->assertTrue($this->domParser->see($search, $element), "Do not see '{$search}' in response."); - } - - /** - * Asserts that we do not see the specified text. - * - * @param string|null $search - * @param string|null $element - * - * @throws \Exception - */ - public function assertDontSee(string $search = null, string $element = null) - { - $this->assertTrue($this->domParser->dontSee($search, $element), "I should not see '{$search}' in response."); - } - - /** - * Assert that we see an element selected via a CSS selector. - * - * @param string $search - * - * @throws \Exception - */ - public function assertSeeElement(string $search) - { - $this->assertTrue($this->domParser->seeElement($search), "Do not see element with selector '{$search} in response.'"); - } - - /** - * Assert that we do not see an element selected via a CSS selector. - * - * @param string $search - * - * @throws \Exception - */ - public function assertDontSeeElement(string $search) - { - $this->assertTrue($this->domParser->dontSeeElement($search), "I should not see an element with selector '{$search}' in response.'"); - } - - /** - * Assert that we see a link with the matching text and/or class. - * - * @param string $text - * @param string|null $details - * - * @throws \Exception - */ - public function assertSeeLink(string $text, string $details = null) - { - $this->assertTrue($this->domParser->seeLink($text, $details), "Do no see anchor tag with the text {$text} in response."); - } - - /** - * Assert that we see an input with name/value. - * - * @param string $field - * @param string|null $value - * - * @throws \Exception - */ - public function assertSeeInField(string $field, string $value = null) - { - $this->assertTrue($this->domParser->seeInField($field, $value), "Do no see input named {$field} with value {$value} in response."); - } - - //-------------------------------------------------------------------- - // JSON Methods - //-------------------------------------------------------------------- - - /** - * Returns the response's body as JSON - * - * @return mixed|false - */ - public function getJSON() - { - $response = $this->response->getJSON(); - - if (is_null($response)) - { - return false; - } - - return $response; - } - - /** - * Test that the response contains a matching JSON fragment. - * - * @param array $fragment - * - * @throws \Exception - */ - public function assertJSONFragment(array $fragment) - { - $json = json_decode($this->getJSON(), true); - - $this->assertArraySubset($fragment, $json, false, 'Response does not contain a matching JSON fragment.'); - } - - /** - * Asserts that the JSON exactly matches the passed in data. - * If the value being passed in is a string, it must be a json_encoded string. - * - * @param string|array $test - * - * @throws \Exception - */ - public function assertJSONExact($test) - { - $json = $this->getJSON(); - - if (is_array($test)) - { - $config = new Format(); - $formatter = $config->getFormatter('application/json'); - $test = $formatter->format($test); - } - - $this->assertJsonStringEqualsJsonString($test, $json, 'Response does not contain matching JSON.'); - } - - //-------------------------------------------------------------------- - // XML Methods - //-------------------------------------------------------------------- - - /** - * Returns the response' body as XML - * - * @return mixed|string - */ - public function getXML() - { - return $this->response->getXML(); - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/FeatureTestCase.php b/vendor/codeigniter4/framework/system/Test/FeatureTestCase.php deleted file mode 100644 index ee70910..0000000 --- a/vendor/codeigniter4/framework/system/Test/FeatureTestCase.php +++ /dev/null @@ -1,75 +0,0 @@ -resetRoutes(); - foreach ($routes as $route) - { - $collection->{$route[0]}($route[1], $route[2]); - } - } - - $this->routes = $collection; - - return $this; - } - - /** - * Sets any values that should exist during this session. - * - * @param array|null Array of values, or null to use the current $_SESSION - * - * @return $this - */ - public function withSession(array $values = null) - { - $this->session = is_null($values) ? $_SESSION : $values; - - return $this; - } - - /** - * Don't run any events while running this test. - * - * @return $this - */ - public function skipEvents() - { - Events::simulate(true); - - return $this; - } - - /** - * Calls a single URI, executes it, and returns a FeatureResponse - * instance that can be used to run many assertions against. - * - * @param string $method - * @param string $path - * @param array|null $params - * - * @return \CodeIgniter\Test\FeatureResponse - * @throws \CodeIgniter\Router\Exceptions\RedirectException - * @throws \Exception - */ - public function call(string $method, string $path, array $params = null) - { - $buffer = \ob_get_level(); - - // Clean up any open output buffers - // not relevant to unit testing - // @codeCoverageIgnoreStart - if (\ob_get_level() > 0 && (! isset($this->clean) || $this->clean === true)) - { - \ob_end_clean(); - } - // @codeCoverageIgnoreEnd - - // Simulate having a blank session - $_SESSION = []; - $_SERVER['REQUEST_METHOD'] = $method; - - $request = $this->setupRequest($method, $path); - $request = $this->populateGlobals($method, $request, $params); - - // Make sure the RouteCollection knows what method we're using... - $routes = $this->routes ?: Services::routes(); - $routes->setHTTPVerb($method); - - // Make sure any other classes that might call the request - // instance get the right one. - Services::injectMock('request', $request); - - // Make sure filters are reset between tests - Services::injectMock('filters', Services::filters(null, false)); - - $response = $this->app - ->setRequest($request) - ->run($routes, true); - - $output = \ob_get_contents(); - if (empty($response->getBody()) && ! empty($output)) - { - $response->setBody($output); - } - - // Reset directory if it has been set - Services::router()->setDirectory(null); - - // Ensure the output buffer is identical so no tests are risky - // @codeCoverageIgnoreStart - while (\ob_get_level() > $buffer) - { - \ob_end_clean(); - } - while (\ob_get_level() < $buffer) - { - \ob_start(); - } - // @codeCoverageIgnoreEnd - - return new FeatureResponse($response); - } - - /** - * Performs a GET request. - * - * @param string $path - * @param array|null $params - * - * @return \CodeIgniter\Test\FeatureResponse - * @throws \CodeIgniter\Router\Exceptions\RedirectException - * @throws \Exception - */ - public function get(string $path, array $params = null) - { - return $this->call('get', $path, $params); - } - - /** - * Performs a POST request. - * - * @param string $path - * @param array|null $params - * - * @return \CodeIgniter\Test\FeatureResponse - * @throws \CodeIgniter\Router\Exceptions\RedirectException - * @throws \Exception - */ - public function post(string $path, array $params = null) - { - return $this->call('post', $path, $params); - } - - /** - * Performs a PUT request - * - * @param string $path - * @param array|null $params - * - * @return \CodeIgniter\Test\FeatureResponse - * @throws \CodeIgniter\Router\Exceptions\RedirectException - * @throws \Exception - */ - public function put(string $path, array $params = null) - { - return $this->call('put', $path, $params); - } - - /** - * Performss a PATCH request - * - * @param string $path - * @param array|null $params - * - * @return \CodeIgniter\Test\FeatureResponse - * @throws \CodeIgniter\Router\Exceptions\RedirectException - * @throws \Exception - */ - public function patch(string $path, array $params = null) - { - return $this->call('patch', $path, $params); - } - - /** - * Performs a DELETE request. - * - * @param string $path - * @param array|null $params - * - * @return \CodeIgniter\Test\FeatureResponse - * @throws \CodeIgniter\Router\Exceptions\RedirectException - * @throws \Exception - */ - public function delete(string $path, array $params = null) - { - return $this->call('delete', $path, $params); - } - - /** - * Performs an OPTIONS request. - * - * @param string $path - * @param array|null $params - * - * @return \CodeIgniter\Test\FeatureResponse - * @throws \CodeIgniter\Router\Exceptions\RedirectException - * @throws \Exception - */ - public function options(string $path, array $params = null) - { - return $this->call('options', $path, $params); - } - - /** - * Setup a Request object to use so that CodeIgniter - * won't try to auto-populate some of the items. - * - * @param string $method - * @param string|null $path - * - * @return \CodeIgniter\HTTP\IncomingRequest - */ - protected function setupRequest(string $method, string $path = null): IncomingRequest - { - $config = config(App::class); - $uri = new URI(rtrim($config->baseURL, '/') . '/' . trim($path, '/ ')); - - $request = new IncomingRequest($config, clone($uri), null, new UserAgent()); - $request->uri = $uri; - - $request->setMethod($method); - $request->setProtocolVersion('1.1'); - - if ($config->forceGlobalSecureRequests) - { - $_SERVER['HTTPS'] = 'test'; - } - - return $request; - } - - /** - * Populates the data of our Request with "global" data - * relevant to the request, like $_POST data. - * - * Always populate the GET vars based on the URI. - * - * @param string $method - * @param \CodeIgniter\HTTP\Request $request - * @param array|null $params - * - * @return \CodeIgniter\HTTP\Request - * @throws \ReflectionException - */ - protected function populateGlobals(string $method, Request $request, array $params = null) - { - // $params should set the query vars if present, - // otherwise set it from the URL. - $get = ! empty($params) && $method === 'get' - ? $params - : $this->getPrivateProperty($request->uri, 'query'); - - $request->setGlobal('get', $get); - if ($method !== 'get') - { - $request->setGlobal($method, $params); - } - - $request->setGlobal('request', $params); - - $_SESSION = $this->session ?? []; - - return $request; - } -} diff --git a/vendor/codeigniter4/framework/system/Test/Filters/CITestStreamFilter.php b/vendor/codeigniter4/framework/system/Test/Filters/CITestStreamFilter.php deleted file mode 100644 index 4310a7f..0000000 --- a/vendor/codeigniter4/framework/system/Test/Filters/CITestStreamFilter.php +++ /dev/null @@ -1,81 +0,0 @@ -data; - $consumed += $bucket->datalen; - } - return PSFS_PASS_ON; - } - -} - -// @codeCoverageIgnoreStart -stream_filter_register('CITestStreamFilter', 'CodeIgniter\Test\Filters\CITestStreamFilter'); -// @codeCoverageIgnoreEnd diff --git a/vendor/codeigniter4/framework/system/Test/Interfaces/FabricatorModel.php b/vendor/codeigniter4/framework/system/Test/Interfaces/FabricatorModel.php deleted file mode 100644 index fdf7500..0000000 --- a/vendor/codeigniter4/framework/system/Test/Interfaces/FabricatorModel.php +++ /dev/null @@ -1,109 +0,0 @@ -table with a primary key - * matching $id. - * - * @param mixed|array|null $id One primary key or an array of primary keys - * - * @return array|object|null The resulting row of data, or null. - */ - public function find($id = null); - - /** - * Inserts data into the current table. If an object is provided, - * it will attempt to convert it to an array. - * - * @param array|object $data - * @param boolean $returnID Whether insert ID should be returned or not. - * - * @return integer|string|boolean - * @throws \ReflectionException - */ - public function insert($data = null, bool $returnID = true); - - /** - * The following properties and methods are optional, but if present should - * adhere to their definitions. - * - * @property array $allowedFields - * @property string $useSoftDeletes - * @property string $useTimestamps - * @property string $createdField - * @property string $updatedField - * @property string $deletedField - */ - - /* - * Sets $useSoftDeletes value so that we can temporarily override - * the softdeletes settings. Can be used for all find* methods. - * - * @param boolean $val - * - * @return Model - */ - // public function withDeleted($val = true); - - /** - * Faked data for Fabricator. - * - * @param Generator $faker - * - * @return array|object - */ - // public function fake(Generator &$faker); -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockAppConfig.php b/vendor/codeigniter4/framework/system/Test/Mock/MockAppConfig.php deleted file mode 100644 index fba7b76..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockAppConfig.php +++ /dev/null @@ -1,34 +0,0 @@ -output = $output; - - return $this; - } - - //-------------------------------------------------------------------- - - protected function sendRequest(array $curl_options = []): string - { - // Save so we can access later. - $this->curl_options = $curl_options; - - return $this->output; - } - - //-------------------------------------------------------------------- - // for testing purposes only - public function getBaseURI() - { - return $this->baseURI; - } - - // for testing purposes only - public function getDelay() - { - return $this->delay; - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockCache.php b/vendor/codeigniter4/framework/system/Test/Mock/MockCache.php deleted file mode 100644 index 855cb7b..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockCache.php +++ /dev/null @@ -1,198 +0,0 @@ -prefix . $key; - - return array_key_exists($key, $this->cache) - ? $this->cache[$key] - : null; - } - - //-------------------------------------------------------------------- - - /** - * Saves an item to the cache store. - * - * The $raw parameter is only utilized by Mamcache in order to - * allow usage of increment() and decrement(). - * - * @param string $key Cache item name - * @param $value the data to save - * @param null $ttl Time To Live, in seconds (default 60) - * @param boolean $raw Whether to store the raw value. - * - * @return mixed - */ - public function save(string $key, $value, int $ttl = 60, bool $raw = false) - { - $key = $this->prefix . $key; - - $this->cache[$key] = $value; - - return true; - } - - //-------------------------------------------------------------------- - - /** - * Deletes a specific item from the cache store. - * - * @param string $key Cache item name - * - * @return mixed - */ - public function delete(string $key) - { - unset($this->cache[$key]); - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic incrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - */ - public function increment(string $key, int $offset = 1) - { - $key = $this->prefix . $key; - - $data = $this->cache[$key] ?: null; - - if (empty($data)) - { - $data = 0; - } - elseif (! is_int($data)) - { - return false; - } - - return $this->save($key, $data + $offset); - } - - //-------------------------------------------------------------------- - - /** - * Performs atomic decrementation of a raw stored value. - * - * @param string $key Cache ID - * @param integer $offset Step/value to increase by - * - * @return mixed - */ - public function decrement(string $key, int $offset = 1) - { - $key = $this->prefix . $key; - - $data = $this->cache[$key] ?: null; - - if (empty($data)) - { - $data = 0; - } - elseif (! is_int($data)) - { - return false; - } - - return $this->save($key, $data - $offset); - } - - //-------------------------------------------------------------------- - - /** - * Will delete all items in the entire cache. - * - * @return mixed - */ - public function clean() - { - $this->cache = []; - } - - //-------------------------------------------------------------------- - - /** - * Returns information on the entire cache. - * - * The information returned and the structure of the data - * varies depending on the handler. - * - * @return mixed - */ - public function getCacheInfo() - { - return []; - } - - //-------------------------------------------------------------------- - - /** - * Returns detailed information about the specific item in the cache. - * - * @param string $key Cache item name. - * - * @return mixed - */ - public function getMetaData(string $key) - { - return false; - } - - //-------------------------------------------------------------------- - - /** - * Determines if the driver is supported on this system. - * - * @return boolean - */ - public function isSupported(): bool - { - return true; - } - - //-------------------------------------------------------------------- - -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockCodeIgniter.php b/vendor/codeigniter4/framework/system/Test/Mock/MockCodeIgniter.php deleted file mode 100644 index 5580fd1..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockCodeIgniter.php +++ /dev/null @@ -1,11 +0,0 @@ -returnValues[$method] = $return; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Orchestrates a query against the database. Queries must use - * Database\Statement objects to store the query and build it. - * This method works with the cache. - * - * Should automatically handle different connections for read/write - * queries if needed. - * - * @param string $sql - * @param mixed ...$binds - * @param boolean $setEscapeFlags - * @param string $queryClass - * - * @return \CodeIgniter\Database\BaseResult|\CodeIgniter\Database\Query|false - */ - - public function query(string $sql, $binds = null, bool $setEscapeFlags = true, string $queryClass = 'CodeIgniter\\Database\\Query') - { - $queryClass = str_replace('Connection', 'Query', get_class($this)); - - $query = new $queryClass($this); - - $query->setQuery($sql, $binds, $setEscapeFlags); - - if (! empty($this->swapPre) && ! empty($this->DBPrefix)) - { - $query->swapPrefix($this->DBPrefix, $this->swapPre); - } - - $startTime = microtime(true); - - $this->lastQuery = $query; - - // Run the query - if (false === ($this->resultID = $this->simpleQuery($query->getQuery()))) - { - $query->setDuration($startTime, $startTime); - - // @todo deal with errors - - return false; - } - - $query->setDuration($startTime); - - $resultClass = str_replace('Connection', 'Result', get_class($this)); - - return new $resultClass($this->connID, $this->resultID); - } - - //-------------------------------------------------------------------- - - /** - * Connect to the database. - * - * @param boolean $persistent - * - * @return mixed - */ - public function connect(bool $persistent = false) - { - $return = $this->returnValues['connect'] ?? true; - - if (is_array($return)) - { - // By removing the top item here, we can - // get a different value for, say, testing failover connections. - $return = array_shift($this->returnValues['connect']); - } - - return $return; - } - - //-------------------------------------------------------------------- - - /** - * Keep or establish the connection if no queries have been sent for - * a length of time exceeding the server's idle timeout. - * - * @return boolean - */ - public function reconnect(): bool - { - return true; - } - - //-------------------------------------------------------------------- - - /** - * Select a specific database table to use. - * - * @param string $databaseName - * - * @return mixed - */ - public function setDatabase(string $databaseName) - { - $this->database = $databaseName; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns a string containing the version of the database being used. - * - * @return string - */ - public function getVersion(): string - { - return CodeIgniter::CI_VERSION; - } - - //-------------------------------------------------------------------- - - /** - * Executes the query against the database. - * - * @param string $sql - * - * @return mixed - */ - protected function execute(string $sql) - { - return $this->returnValues['execute']; - } - - //-------------------------------------------------------------------- - - /** - * Returns the total number of rows affected by this query. - * - * @return integer - */ - public function affectedRows(): int - { - return 1; - } - - //-------------------------------------------------------------------- - - /** - * Returns the last error code and message. - * - * Must return an array with keys 'code' and 'message': - * - * return ['code' => null, 'message' => null); - * - * @return array - */ - public function error(): array - { - return [ - 'code' => null, - 'message' => null, - ]; - } - - //-------------------------------------------------------------------- - - /** - * Insert ID - * - * @return integer - */ - public function insertID(): int - { - return $this->connID->insert_id; - } - - //-------------------------------------------------------------------- - - /** - * Generates the SQL for listing tables in a platform-dependent manner. - * - * @param boolean $constrainByPrefix - * - * @return string - */ - protected function _listTables(bool $constrainByPrefix = false): string - { - return ''; - } - - //-------------------------------------------------------------------- - - /** - * Generates a platform-specific query string so that the column names can be fetched. - * - * @param string $table - * - * @return string - */ - protected function _listColumns(string $table = ''): string - { - return ''; - } - - /** - * @param string $table - * @return array - */ - protected function _fieldData(string $table): array - { - return []; - } - - /** - * @param string $table - * @return array - */ - protected function _indexData(string $table): array - { - return []; - } - - /** - * @param string $table - * @return array - */ - protected function _foreignKeyData(string $table): array - { - return []; - } - - //-------------------------------------------------------------------- - - /** - * Close the connection. - */ - protected function _close() - { - } - - //-------------------------------------------------------------------- - - /** - * Begin Transaction - * - * @return boolean - */ - protected function _transBegin(): bool - { - return true; - } - - //-------------------------------------------------------------------- - - /** - * Commit Transaction - * - * @return boolean - */ - protected function _transCommit(): bool - { - return true; - } - - //-------------------------------------------------------------------- - - /** - * Rollback Transaction - * - * @return boolean - */ - protected function _transRollback(): bool - { - return true; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockEmail.php b/vendor/codeigniter4/framework/system/Test/Mock/MockEmail.php deleted file mode 100644 index ab62a77..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockEmail.php +++ /dev/null @@ -1,31 +0,0 @@ -returnValue) - { - $this->setArchiveValues(); - - if ($autoClear) - { - $this->clear(); - } - - Events::trigger('email', $this->archive); - } - - return $this->returnValue; - } -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockEvents.php b/vendor/codeigniter4/framework/system/Test/Mock/MockEvents.php deleted file mode 100644 index e8b3f43..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockEvents.php +++ /dev/null @@ -1,66 +0,0 @@ -handles = $config['handles'] ?? []; - $this->destination = $this->path . 'log-' . date('Y-m-d') . '.' . $this->fileExtension; - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockIncomingRequest.php b/vendor/codeigniter4/framework/system/Test/Mock/MockIncomingRequest.php deleted file mode 100644 index 64d7b2e..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockIncomingRequest.php +++ /dev/null @@ -1,17 +0,0 @@ -language[$locale ?? $this->locale][$file] = $data; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Provides an override that allows us to set custom - * data to be returned easily during testing. - * - * @param string $path - * - * @return array|mixed - */ - protected function requireFile(string $path): array - { - return $this->data ?? []; - } - - //-------------------------------------------------------------------- - - /** - * Arbitrarily turnoff internationalization support for testing - */ - public function disableIntlSupport() - { - $this->intlSupport = false; - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockLogger.php b/vendor/codeigniter4/framework/system/Test/Mock/MockLogger.php deleted file mode 100644 index 239dab5..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockLogger.php +++ /dev/null @@ -1,98 +0,0 @@ - [ - /* - * The log levels that this handler will handle. - */ - 'handles' => [ - 'critical', - 'alert', - 'emergency', - 'debug', - 'error', - 'info', - 'notice', - 'warning', - ], - - /* - * Logging Directory Path - */ - 'path' => '', - ], - ]; - -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockQuery.php b/vendor/codeigniter4/framework/system/Test/Mock/MockQuery.php deleted file mode 100644 index 851ad3e..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockQuery.php +++ /dev/null @@ -1,8 +0,0 @@ -model; - } - - public function getModelName() - { - return $this->modelName; - } - - public function getFormat() - { - return $this->format; - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockResourcePresenter.php b/vendor/codeigniter4/framework/system/Test/Mock/MockResourcePresenter.php deleted file mode 100644 index 84f831c..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockResourcePresenter.php +++ /dev/null @@ -1,23 +0,0 @@ -model; - } - - public function getModelName() - { - return $this->modelName; - } - - public function getFormat() - { - return $this->format; - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockResponse.php b/vendor/codeigniter4/framework/system/Test/Mock/MockResponse.php deleted file mode 100644 index 67f1a7d..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockResponse.php +++ /dev/null @@ -1,30 +0,0 @@ -pretend; - } - - // artificial error for testing - public function misbehave() - { - $this->statusCode = 0; - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockResult.php b/vendor/codeigniter4/framework/system/Test/Mock/MockResult.php deleted file mode 100644 index a76e9dd..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockResult.php +++ /dev/null @@ -1,93 +0,0 @@ -CSRFHash; - - return $this; - } - - //-------------------------------------------------------------------- - -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockServices.php b/vendor/codeigniter4/framework/system/Test/Mock/MockServices.php deleted file mode 100644 index 5d9e736..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockServices.php +++ /dev/null @@ -1,27 +0,0 @@ - TESTPATH . '_support/', - ]; - public $classmap = []; - - //-------------------------------------------------------------------- - - public function __construct() - { - // Don't call the parent since we don't want the default mappings. - // parent::__construct(); - } - - //-------------------------------------------------------------------- - public static function locator(bool $getShared = true) - { - return new \CodeIgniter\Autoloader\FileLocator(static::autoloader()); - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockSession.php b/vendor/codeigniter4/framework/system/Test/Mock/MockSession.php deleted file mode 100644 index e69183e..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockSession.php +++ /dev/null @@ -1,72 +0,0 @@ -driver, true); - } - - //-------------------------------------------------------------------- - - /** - * Starts the session. - * Extracted for testing reasons. - */ - protected function startSession() - { - // session_start(); - } - - //-------------------------------------------------------------------- - - /** - * Takes care of setting the cookie on the client side. - * Extracted for testing reasons. - */ - protected function setCookie() - { - $this->cookies[] = [ - $this->sessionCookieName, - session_id(), - (empty($this->sessionExpiration) ? 0 : time() + $this->sessionExpiration), - $this->cookiePath, - $this->cookieDomain, - $this->cookieSecure, - true, - ]; - } - - //-------------------------------------------------------------------- - - public function regenerate(bool $destroy = false) - { - $this->didRegenerate = true; - $_SESSION['__ci_last_regenerate'] = time(); - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/Test/Mock/MockTable.php b/vendor/codeigniter4/framework/system/Test/Mock/MockTable.php deleted file mode 100644 index 3e5758b..0000000 --- a/vendor/codeigniter4/framework/system/Test/Mock/MockTable.php +++ /dev/null @@ -1,16 +0,0 @@ -setAccessible(true); - $obj = (gettype($obj) === 'object') ? $obj : null; - - return function () use ($obj, $ref_method) { - $args = func_get_args(); - return $ref_method->invokeArgs($obj, $args); - }; - } - - /** - * Find an accessible property. - * - * @param object $obj - * @param string $property - * - * @return \ReflectionProperty - * @throws \ReflectionException - */ - private static function getAccessibleRefProperty($obj, $property) - { - if (is_object($obj)) - { - $ref_class = new ReflectionObject($obj); - } - else - { - $ref_class = new ReflectionClass($obj); - } - - $ref_property = $ref_class->getProperty($property); - $ref_property->setAccessible(true); - - return $ref_property; - } - - /** - * Set a private property. - * - * @param object|string $obj object or class name - * @param string $property property name - * @param mixed $value value - * - * @throws \ReflectionException - */ - public static function setPrivateProperty($obj, $property, $value) - { - $ref_property = self::getAccessibleRefProperty($obj, $property); - $ref_property->setValue($obj, $value); - } - - /** - * Retrieve a private property. - * - * @param object|string $obj object or class name - * @param string $property property name - * - * @return mixed value - * @throws \ReflectionException - */ - public static function getPrivateProperty($obj, $property) - { - $ref_property = self::getAccessibleRefProperty($obj, $property); - return $ref_property->getValue($obj); - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/TestLogger.php b/vendor/codeigniter4/framework/system/Test/TestLogger.php deleted file mode 100644 index f0c1c94..0000000 --- a/vendor/codeigniter4/framework/system/Test/TestLogger.php +++ /dev/null @@ -1,82 +0,0 @@ -assertLogged() methods. - * - * @param string $level - * @param string $message - * @param array $context - * - * @return boolean - */ - public function log($level, $message, array $context = []): bool - { - // While this requires duplicate work, we want to ensure - // we have the final message to test against. - $log_message = $this->interpolate($message, $context); - - // Determine the file and line by finding the first - // backtrace that is not part of our logging system. - $trace = debug_backtrace(); - $file = null; - - foreach ($trace as $row) - { - if (! in_array($row['function'], ['log', 'log_message'])) - { - $file = basename($row['file'] ?? ''); - break; - } - } - - self::$op_logs[] = [ - 'level' => $level, - 'message' => $log_message, - 'file' => $file, - ]; - - // Let the parent do it's thing. - return parent::log($level, $message, $context); - } - - //-------------------------------------------------------------------- - - /** - * Used by CIUnitTestCase class to provide ->assertLogged() methods. - * - * @param string $level - * @param string $message - * - * @return boolean - */ - public static function didLog(string $level, $message) - { - foreach (self::$op_logs as $log) - { - if (strtolower($log['level']) === strtolower($level) && $message === $log['message']) - { - return true; - } - } - - return false; - } - - //-------------------------------------------------------------------- - // Expose cleanFileNames() - public function cleanup($file) - { - return $this->cleanFileNames($file); - } - -} diff --git a/vendor/codeigniter4/framework/system/Test/bootstrap.php b/vendor/codeigniter4/framework/system/Test/bootstrap.php deleted file mode 100644 index 89bdc7b..0000000 --- a/vendor/codeigniter4/framework/system/Test/bootstrap.php +++ /dev/null @@ -1,67 +0,0 @@ -appDirectory) . DIRECTORY_SEPARATOR); -defined('WRITEPATH') || define('WRITEPATH', realpath($paths->writableDirectory) . DIRECTORY_SEPARATOR); -defined('SYSTEMPATH') || define('SYSTEMPATH', realpath($paths->systemDirectory) . DIRECTORY_SEPARATOR); -defined('ROOTPATH') || define('ROOTPATH', realpath(APPPATH . '../') . DIRECTORY_SEPARATOR); -defined('CIPATH') || define('CIPATH', realpath(SYSTEMPATH . '../') . DIRECTORY_SEPARATOR); -defined('FCPATH') || define('FCPATH', realpath(PUBLICPATH) . DIRECTORY_SEPARATOR); -defined('TESTPATH') || define('TESTPATH', realpath(HOMEPATH . 'tests/') . DIRECTORY_SEPARATOR); -defined('SUPPORTPATH') || define('SUPPORTPATH', realpath(TESTPATH . '_support/') . DIRECTORY_SEPARATOR); -defined('COMPOSER_PATH') || define('COMPOSER_PATH', realpath(HOMEPATH . 'vendor/autoload.php')); -defined('VENDORPATH') || define('VENDORPATH', realpath(HOMEPATH . 'vendor') . DIRECTORY_SEPARATOR); - -// Load Common.php from App then System -if (file_exists(APPPATH . 'Common.php')) -{ - require_once APPPATH . 'Common.php'; -} - -require_once SYSTEMPATH . 'Common.php'; - -// Set environment values that would otherwise stop the framework from functioning during tests. -if (! isset($_SERVER['app.baseURL'])) -{ - $_SERVER['app.baseURL'] = 'http://example.com'; -} - -// Load necessary components -require_once SYSTEMPATH . 'Config/AutoloadConfig.php'; -require_once APPPATH . 'Config/Autoload.php'; -require_once APPPATH . 'Config/Constants.php'; -require_once SYSTEMPATH . 'Modules/Modules.php'; -require_once APPPATH . 'Config/Modules.php'; - -require_once SYSTEMPATH . 'Autoloader/Autoloader.php'; -require_once SYSTEMPATH . 'Config/BaseService.php'; -require_once SYSTEMPATH . 'Config/Services.php'; -require_once APPPATH . 'Config/Services.php'; - -// Use Config\Services as CodeIgniter\Services -if (! class_exists('CodeIgniter\Services', false)) -{ - class_alias('Config\Services', 'CodeIgniter\Services'); -} - -// Launch the autoloader to gather namespaces (includes composer.json's "autoload-dev") -$loader = \CodeIgniter\Services::autoloader(); -$loader->initialize(new Config\Autoload(), new Config\Modules()); - -// Register the loader with the SPL autoloader stack. -$loader->register(); - -require_once APPPATH . 'Config/Routes.php'; -$routes->getRoutes('*'); diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Escaper/Escaper.php b/vendor/codeigniter4/framework/system/ThirdParty/Escaper/Escaper.php deleted file mode 100644 index 9f903a5..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Escaper/Escaper.php +++ /dev/null @@ -1,391 +0,0 @@ - 'quot', // quotation mark - 38 => 'amp', // ampersand - 60 => 'lt', // less-than sign - 62 => 'gt', // greater-than sign - ]; - - /** - * Current encoding for escaping. If not UTF-8, we convert strings from this encoding - * pre-escaping and back to this encoding post-escaping. - * - * @var string - */ - protected $encoding = 'utf-8'; - - /** - * Holds the value of the special flags passed as second parameter to - * htmlspecialchars(). - * - * @var int - */ - protected $htmlSpecialCharsFlags; - - /** - * Static Matcher which escapes characters for HTML Attribute contexts - * - * @var callable - */ - protected $htmlAttrMatcher; - - /** - * Static Matcher which escapes characters for Javascript contexts - * - * @var callable - */ - protected $jsMatcher; - - /** - * Static Matcher which escapes characters for CSS Attribute contexts - * - * @var callable - */ - protected $cssMatcher; - - /** - * List of all encoding supported by this class - * - * @var array - */ - protected $supportedEncodings = [ - 'iso-8859-1', 'iso8859-1', 'iso-8859-5', 'iso8859-5', - 'iso-8859-15', 'iso8859-15', 'utf-8', 'cp866', - 'ibm866', '866', 'cp1251', 'windows-1251', - 'win-1251', '1251', 'cp1252', 'windows-1252', - '1252', 'koi8-r', 'koi8-ru', 'koi8r', - 'big5', '950', 'gb2312', '936', - 'big5-hkscs', 'shift_jis', 'sjis', 'sjis-win', - 'cp932', '932', 'euc-jp', 'eucjp', - 'eucjp-win', 'macroman' - ]; - - /** - * Constructor: Single parameter allows setting of global encoding for use by - * the current object. - * - * @param string $encoding - * @throws Exception\InvalidArgumentException - */ - public function __construct($encoding = null) - { - if ($encoding !== null) { - if (! is_string($encoding)) { - throw new Exception\InvalidArgumentException( - get_class($this) . ' constructor parameter must be a string, received ' . gettype($encoding) - ); - } - if ($encoding === '') { - throw new Exception\InvalidArgumentException( - get_class($this) . ' constructor parameter does not allow a blank value' - ); - } - - $encoding = strtolower($encoding); - if (! in_array($encoding, $this->supportedEncodings)) { - throw new Exception\InvalidArgumentException( - 'Value of \'' . $encoding . '\' passed to ' . get_class($this) - . ' constructor parameter is invalid. Provide an encoding supported by htmlspecialchars()' - ); - } - - $this->encoding = $encoding; - } - - // We take advantage of ENT_SUBSTITUTE flag to correctly deal with invalid UTF-8 sequences. - $this->htmlSpecialCharsFlags = ENT_QUOTES | ENT_SUBSTITUTE; - - // set matcher callbacks - $this->htmlAttrMatcher = [$this, 'htmlAttrMatcher']; - $this->jsMatcher = [$this, 'jsMatcher']; - $this->cssMatcher = [$this, 'cssMatcher']; - } - - /** - * Return the encoding that all output/input is expected to be encoded in. - * - * @return string - */ - public function getEncoding() - { - return $this->encoding; - } - - /** - * Escape a string for the HTML Body context where there are very few characters - * of special meaning. Internally this will use htmlspecialchars(). - * - * @param string $string - * @return string - */ - public function escapeHtml($string) - { - return htmlspecialchars($string, $this->htmlSpecialCharsFlags, $this->encoding); - } - - /** - * Escape a string for the HTML Attribute context. We use an extended set of characters - * to escape that are not covered by htmlspecialchars() to cover cases where an attribute - * might be unquoted or quoted illegally (e.g. backticks are valid quotes for IE). - * - * @param string $string - * @return string - */ - public function escapeHtmlAttr($string) - { - $string = $this->toUtf8($string); - if ($string === '' || ctype_digit($string)) { - return $string; - } - - $result = preg_replace_callback('/[^a-z0-9,\.\-_]/iSu', $this->htmlAttrMatcher, $string); - return $this->fromUtf8($result); - } - - /** - * Escape a string for the Javascript context. This does not use json_encode(). An extended - * set of characters are escaped beyond ECMAScript's rules for Javascript literal string - * escaping in order to prevent misinterpretation of Javascript as HTML leading to the - * injection of special characters and entities. The escaping used should be tolerant - * of cases where HTML escaping was not applied on top of Javascript escaping correctly. - * Backslash escaping is not used as it still leaves the escaped character as-is and so - * is not useful in a HTML context. - * - * @param string $string - * @return string - */ - public function escapeJs($string) - { - $string = $this->toUtf8($string); - if ($string === '' || ctype_digit($string)) { - return $string; - } - - $result = preg_replace_callback('/[^a-z0-9,\._]/iSu', $this->jsMatcher, $string); - return $this->fromUtf8($result); - } - - /** - * Escape a string for the URI or Parameter contexts. This should not be used to escape - * an entire URI - only a subcomponent being inserted. The function is a simple proxy - * to rawurlencode() which now implements RFC 3986 since PHP 5.3 completely. - * - * @param string $string - * @return string - */ - public function escapeUrl($string) - { - return rawurlencode($string); - } - - /** - * Escape a string for the CSS context. CSS escaping can be applied to any string being - * inserted into CSS and escapes everything except alphanumerics. - * - * @param string $string - * @return string - */ - public function escapeCss($string) - { - $string = $this->toUtf8($string); - if ($string === '' || ctype_digit($string)) { - return $string; - } - - $result = preg_replace_callback('/[^a-z0-9]/iSu', $this->cssMatcher, $string); - return $this->fromUtf8($result); - } - - /** - * Callback function for preg_replace_callback that applies HTML Attribute - * escaping to all matches. - * - * @param array $matches - * @return string - */ - protected function htmlAttrMatcher($matches) - { - $chr = $matches[0]; - $ord = ord($chr); - - /** - * The following replaces characters undefined in HTML with the - * hex entity for the Unicode replacement character. - */ - if (($ord <= 0x1f && $chr != "\t" && $chr != "\n" && $chr != "\r") - || ($ord >= 0x7f && $ord <= 0x9f) - ) { - return '�'; - } - - /** - * Check if the current character to escape has a name entity we should - * replace it with while grabbing the integer value of the character. - */ - if (strlen($chr) > 1) { - $chr = $this->convertEncoding($chr, 'UTF-32BE', 'UTF-8'); - } - - $hex = bin2hex($chr); - $ord = hexdec($hex); - if (isset(static::$htmlNamedEntityMap[$ord])) { - return '&' . static::$htmlNamedEntityMap[$ord] . ';'; - } - - /** - * Per OWASP recommendations, we'll use upper hex entities - * for any other characters where a named entity does not exist. - */ - if ($ord > 255) { - return sprintf('&#x%04X;', $ord); - } - return sprintf('&#x%02X;', $ord); - } - - /** - * Callback function for preg_replace_callback that applies Javascript - * escaping to all matches. - * - * @param array $matches - * @return string - */ - protected function jsMatcher($matches) - { - $chr = $matches[0]; - if (strlen($chr) == 1) { - return sprintf('\\x%02X', ord($chr)); - } - $chr = $this->convertEncoding($chr, 'UTF-16BE', 'UTF-8'); - $hex = strtoupper(bin2hex($chr)); - if (strlen($hex) <= 4) { - return sprintf('\\u%04s', $hex); - } - $highSurrogate = substr($hex, 0, 4); - $lowSurrogate = substr($hex, 4, 4); - return sprintf('\\u%04s\\u%04s', $highSurrogate, $lowSurrogate); - } - - /** - * Callback function for preg_replace_callback that applies CSS - * escaping to all matches. - * - * @param array $matches - * @return string - */ - protected function cssMatcher($matches) - { - $chr = $matches[0]; - if (strlen($chr) == 1) { - $ord = ord($chr); - } else { - $chr = $this->convertEncoding($chr, 'UTF-32BE', 'UTF-8'); - $ord = hexdec(bin2hex($chr)); - } - return sprintf('\\%X ', $ord); - } - - /** - * Converts a string to UTF-8 from the base encoding. The base encoding is set via this - * class' constructor. - * - * @param string $string - * @throws Exception\RuntimeException - * @return string - */ - protected function toUtf8($string) - { - if ($this->getEncoding() === 'utf-8') { - $result = $string; - } else { - $result = $this->convertEncoding($string, 'UTF-8', $this->getEncoding()); - } - - if (! $this->isUtf8($result)) { - throw new Exception\RuntimeException( - sprintf('String to be escaped was not valid UTF-8 or could not be converted: %s', $result) - ); - } - - return $result; - } - - /** - * Converts a string from UTF-8 to the base encoding. The base encoding is set via this - * class' constructor. - * @param string $string - * @return string - */ - protected function fromUtf8($string) - { - if ($this->getEncoding() === 'utf-8') { - return $string; - } - - return $this->convertEncoding($string, $this->getEncoding(), 'UTF-8'); - } - - /** - * Checks if a given string appears to be valid UTF-8 or not. - * - * @param string $string - * @return bool - */ - protected function isUtf8($string) - { - return ($string === '' || preg_match('/^./su', $string)); - } - - /** - * Encoding conversion helper which wraps iconv and mbstring where they exist or throws - * and exception where neither is available. - * - * @param string $string - * @param string $to - * @param array|string $from - * @throws Exception\RuntimeException - * @return string - */ - protected function convertEncoding($string, $to, $from) - { - if (function_exists('iconv')) { - $result = iconv($from, $to, $string); - } elseif (function_exists('mb_convert_encoding')) { - $result = mb_convert_encoding($string, $to, $from); - } else { - throw new Exception\RuntimeException( - get_class($this) - . ' requires either the iconv or mbstring extension to be installed' - . ' when escaping for non UTF-8 strings.' - ); - } - - if ($result === false) { - return ''; // return non-fatal blank string on encoding errors from users - } - return $result; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Escaper/Exception/ExceptionInterface.php b/vendor/codeigniter4/framework/system/ThirdParty/Escaper/Exception/ExceptionInterface.php deleted file mode 100644 index 7ebe04e..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Escaper/Exception/ExceptionInterface.php +++ /dev/null @@ -1,13 +0,0 @@ - true, - T_COMMENT => true, - T_DOC_COMMENT => true, - T_INLINE_HTML => true, - T_OPEN_TAG => true, - T_OPEN_TAG_WITH_ECHO => true, - T_WHITESPACE => true, - ); - - /** - * Things we need to do specially for operator tokens: - * - Refuse to strip spaces around them - * - Wrap the access path in parentheses if there - * are any of these in the final short parameter. - */ - private static $operator = array( - T_AND_EQUAL => true, - T_BOOLEAN_AND => true, - T_BOOLEAN_OR => true, - T_ARRAY_CAST => true, - T_BOOL_CAST => true, - T_CLONE => true, - T_CONCAT_EQUAL => true, - T_DEC => true, - T_DIV_EQUAL => true, - T_DOUBLE_CAST => true, - T_INC => true, - T_INCLUDE => true, - T_INCLUDE_ONCE => true, - T_INSTANCEOF => true, - T_INT_CAST => true, - T_IS_EQUAL => true, - T_IS_GREATER_OR_EQUAL => true, - T_IS_IDENTICAL => true, - T_IS_NOT_EQUAL => true, - T_IS_NOT_IDENTICAL => true, - T_IS_SMALLER_OR_EQUAL => true, - T_LOGICAL_AND => true, - T_LOGICAL_OR => true, - T_LOGICAL_XOR => true, - T_MINUS_EQUAL => true, - T_MOD_EQUAL => true, - T_MUL_EQUAL => true, - T_NEW => true, - T_OBJECT_CAST => true, - T_OR_EQUAL => true, - T_PLUS_EQUAL => true, - T_REQUIRE => true, - T_REQUIRE_ONCE => true, - T_SL => true, - T_SL_EQUAL => true, - T_SR => true, - T_SR_EQUAL => true, - T_STRING_CAST => true, - T_UNSET_CAST => true, - T_XOR_EQUAL => true, - '!' => true, - '%' => true, - '&' => true, - '*' => true, - '+' => true, - '-' => true, - '.' => true, - '/' => true, - ':' => true, - '<' => true, - '=' => true, - '>' => true, - '?' => true, - '^' => true, - '|' => true, - '~' => true, - ); - - private static $strip = array( - '(' => true, - ')' => true, - '[' => true, - ']' => true, - '{' => true, - '}' => true, - T_OBJECT_OPERATOR => true, - T_DOUBLE_COLON => true, - T_NS_SEPARATOR => true, - ); - - public static function getFunctionCalls($source, $line, $function) - { - static $up = array( - '(' => true, - '[' => true, - '{' => true, - T_CURLY_OPEN => true, - T_DOLLAR_OPEN_CURLY_BRACES => true, - ); - static $down = array( - ')' => true, - ']' => true, - '}' => true, - ); - static $modifiers = array( - '!' => true, - '@' => true, - '~' => true, - '+' => true, - '-' => true, - ); - static $identifier = array( - T_DOUBLE_COLON => true, - T_STRING => true, - T_NS_SEPARATOR => true, - ); - - if (KINT_PHP56) { - self::$operator[T_POW] = true; - self::$operator[T_POW_EQUAL] = true; - } - - if (KINT_PHP70) { - self::$operator[T_SPACESHIP] = true; - } - - if (KINT_PHP74) { - self::$operator[T_COALESCE_EQUAL] = true; - } - - $tokens = \token_get_all($source); - $cursor = 1; - $function_calls = array(); - /** @var array Performance optimization preventing backwards loops */ - $prev_tokens = array(null, null, null); - - if (\is_array($function)) { - $class = \explode('\\', $function[0]); - $class = \strtolower(\end($class)); - $function = \strtolower($function[1]); - } else { - $class = null; - $function = \strtolower($function); - } - - // Loop through tokens - foreach ($tokens as $index => $token) { - if (!\is_array($token)) { - continue; - } - - // Count newlines for line number instead of using $token[2] - // since certain situations (String tokens after whitespace) may - // not have the correct line number unless you do this manually - $cursor += \substr_count($token[1], "\n"); - if ($cursor > $line) { - break; - } - - // Store the last real tokens for later - if (isset(self::$ignore[$token[0]])) { - continue; - } - - $prev_tokens = array($prev_tokens[1], $prev_tokens[2], $token); - - // Check if it's the right type to be the function we're looking for - if (T_STRING !== $token[0] || \strtolower($token[1]) !== $function) { - continue; - } - - // Check if it's a function call - $nextReal = self::realTokenIndex($tokens, $index); - if (!isset($nextReal, $tokens[$nextReal]) || '(' !== $tokens[$nextReal]) { - continue; - } - - // Check if it matches the signature - if (null === $class) { - if ($prev_tokens[1] && \in_array($prev_tokens[1][0], array(T_DOUBLE_COLON, T_OBJECT_OPERATOR), true)) { - continue; - } - } else { - if (!$prev_tokens[1] || T_DOUBLE_COLON !== $prev_tokens[1][0]) { - continue; - } - - if (!$prev_tokens[0] || T_STRING !== $prev_tokens[0][0] || \strtolower($prev_tokens[0][1]) !== $class) { - continue; - } - } - - $inner_cursor = $cursor; - $depth = 1; // The depth respective to the function call - $offset = $nextReal + 1; // The start of the function call - $instring = false; // Whether we're in a string or not - $realtokens = false; // Whether the current scope contains anything meaningful or not - $paramrealtokens = false; // Whether the current parameter contains anything meaningful - $params = array(); // All our collected parameters - $shortparam = array(); // The short version of the parameter - $param_start = $offset; // The distance to the start of the parameter - - // Loop through the following tokens until the function call ends - while (isset($tokens[$offset])) { - $token = $tokens[$offset]; - - // Ensure that the $inner_cursor is correct and - // that $token is either a T_ constant or a string - if (\is_array($token)) { - $inner_cursor += \substr_count($token[1], "\n"); - } - - if (!isset(self::$ignore[$token[0]]) && !isset($down[$token[0]])) { - $paramrealtokens = $realtokens = true; - } - - // If it's a token that makes us to up a level, increase the depth - if (isset($up[$token[0]])) { - if (1 === $depth) { - $shortparam[] = $token; - $realtokens = false; - } - - ++$depth; - } elseif (isset($down[$token[0]])) { - --$depth; - - // If this brings us down to the parameter level, and we've had - // real tokens since going up, fill the $shortparam with an ellipsis - if (1 === $depth) { - if ($realtokens) { - $shortparam[] = '...'; - } - $shortparam[] = $token; - } - } elseif ('"' === $token[0]) { - // Strings use the same symbol for up and down, but we can - // only ever be inside one string, so just use a bool for that - if ($instring) { - --$depth; - if (1 === $depth) { - $shortparam[] = '...'; - } - } else { - ++$depth; - } - - $instring = !$instring; - - $shortparam[] = '"'; - } elseif (1 === $depth) { - if (',' === $token[0]) { - $params[] = array( - 'full' => \array_slice($tokens, $param_start, $offset - $param_start), - 'short' => $shortparam, - ); - $shortparam = array(); - $paramrealtokens = false; - $param_start = $offset + 1; - } elseif (T_CONSTANT_ENCAPSED_STRING === $token[0] && \strlen($token[1]) > 2) { - $shortparam[] = $token[1][0].'...'.$token[1][0]; - } else { - $shortparam[] = $token; - } - } - - // Depth has dropped to 0 (So we've hit the closing paren) - if ($depth <= 0) { - if ($paramrealtokens) { - $params[] = array( - 'full' => \array_slice($tokens, $param_start, $offset - $param_start), - 'short' => $shortparam, - ); - } - - break; - } - - ++$offset; - } - - // If we're not passed (or at) the line at the end - // of the function call, we're too early so skip it - if ($inner_cursor < $line) { - continue; - } - - // Format the final output parameters - foreach ($params as &$param) { - $name = self::tokensFormatted($param['short']); - $expression = false; - foreach ($name as $token) { - if (self::tokenIsOperator($token)) { - $expression = true; - break; - } - } - - $param = array( - 'name' => self::tokensToString($name), - 'path' => self::tokensToString(self::tokensTrim($param['full'])), - 'expression' => $expression, - ); - } - - // Get the modifiers - --$index; - - while (isset($tokens[$index])) { - if (!isset(self::$ignore[$tokens[$index][0]]) && !isset($identifier[$tokens[$index][0]])) { - break; - } - - --$index; - } - - $mods = array(); - - while (isset($tokens[$index])) { - if (isset(self::$ignore[$tokens[$index][0]])) { - --$index; - continue; - } - - if (isset($modifiers[$tokens[$index][0]])) { - $mods[] = $tokens[$index]; - --$index; - continue; - } - - break; - } - - $function_calls[] = array( - 'parameters' => $params, - 'modifiers' => $mods, - ); - } - - return $function_calls; - } - - private static function realTokenIndex(array $tokens, $index) - { - ++$index; - - while (isset($tokens[$index])) { - if (!isset(self::$ignore[$tokens[$index][0]])) { - return $index; - } - - ++$index; - } - - return null; - } - - /** - * We need a separate method to check if tokens are operators because we - * occasionally add "..." to short parameter versions. If we simply check - * for `$token[0]` then "..." will incorrectly match the "." operator. - * - * @param array|string $token The token to check - * - * @return bool - */ - private static function tokenIsOperator($token) - { - return '...' !== $token && isset(self::$operator[$token[0]]); - } - - private static function tokensToString(array $tokens) - { - $out = ''; - - foreach ($tokens as $token) { - if (\is_string($token)) { - $out .= $token; - } elseif (\is_array($token)) { - $out .= $token[1]; - } - } - - return $out; - } - - private static function tokensTrim(array $tokens) - { - foreach ($tokens as $index => $token) { - if (isset(self::$ignore[$token[0]])) { - unset($tokens[$index]); - } else { - break; - } - } - - $tokens = \array_reverse($tokens); - - foreach ($tokens as $index => $token) { - if (isset(self::$ignore[$token[0]])) { - unset($tokens[$index]); - } else { - break; - } - } - - return \array_reverse($tokens); - } - - private static function tokensFormatted(array $tokens) - { - $space = false; - - $tokens = self::tokensTrim($tokens); - - $output = array(); - $last = null; - - foreach ($tokens as $index => $token) { - if (isset(self::$ignore[$token[0]])) { - if ($space) { - continue; - } - - $next = $tokens[self::realTokenIndex($tokens, $index)]; - - if (isset(self::$strip[$last[0]]) && !self::tokenIsOperator($next)) { - continue; - } - - if (isset(self::$strip[$next[0]]) && $last && !self::tokenIsOperator($last)) { - continue; - } - - $token = ' '; - $space = true; - } else { - $space = false; - $last = $token; - } - - $output[] = $token; - } - - return $output; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Kint.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Kint.php deleted file mode 100644 index e0ce963..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Kint.php +++ /dev/null @@ -1,756 +0,0 @@ - '', - * app_path() => '', - * config_path() => '', - * database_path() => '', - * public_path() => '', - * resource_path() => '', - * storage_path() => '', - * ]; - * - * Defaults to [$_SERVER['DOCUMENT_ROOT'] => ''] - */ - public static $app_root_dirs = array(); - - /** - * @var int max array/object levels to go deep, if zero no limits are applied - */ - public static $max_depth = 6; - - /** - * @var bool expand all trees by default for rich view - */ - public static $expanded = false; - - /** - * @var bool enable detection when Kint is command line. - * - * Formats output with whitespace only; does not HTML-escape it - */ - public static $cli_detection = true; - - /** - * @var array Kint aliases. Add debug functions in Kint wrappers here to fix modifiers and backtraces - */ - public static $aliases = array( - array('Kint\\Kint', 'dump'), - array('Kint\\Kint', 'trace'), - array('Kint\\Kint', 'dumpArray'), - ); - - /** - * @var array Array of modes to renderer class names - */ - public static $renderers = array( - self::MODE_RICH => 'Kint\\Renderer\\RichRenderer', - self::MODE_PLAIN => 'Kint\\Renderer\\PlainRenderer', - self::MODE_TEXT => 'Kint\\Renderer\\TextRenderer', - self::MODE_CLI => 'Kint\\Renderer\\CliRenderer', - ); - - public static $plugins = array( - 'Kint\\Parser\\ArrayObjectPlugin', - 'Kint\\Parser\\Base64Plugin', - 'Kint\\Parser\\BlacklistPlugin', - 'Kint\\Parser\\ClassMethodsPlugin', - 'Kint\\Parser\\ClassStaticsPlugin', - 'Kint\\Parser\\ClosurePlugin', - 'Kint\\Parser\\ColorPlugin', - 'Kint\\Parser\\DateTimePlugin', - 'Kint\\Parser\\FsPathPlugin', - 'Kint\\Parser\\IteratorPlugin', - 'Kint\\Parser\\JsonPlugin', - 'Kint\\Parser\\MicrotimePlugin', - 'Kint\\Parser\\SimpleXMLElementPlugin', - 'Kint\\Parser\\SplFileInfoPlugin', - 'Kint\\Parser\\SplObjectStoragePlugin', - 'Kint\\Parser\\StreamPlugin', - 'Kint\\Parser\\TablePlugin', - 'Kint\\Parser\\ThrowablePlugin', - 'Kint\\Parser\\TimestampPlugin', - 'Kint\\Parser\\TracePlugin', - 'Kint\\Parser\\XmlPlugin', - ); - - protected static $plugin_pool = array(); - - protected $parser; - protected $renderer; - - public function __construct(Parser $p, Renderer $r) - { - $this->parser = $p; - $this->renderer = $r; - } - - public function setParser(Parser $p) - { - $this->parser = $p; - } - - public function getParser() - { - return $this->parser; - } - - public function setRenderer(Renderer $r) - { - $this->renderer = $r; - } - - public function getRenderer() - { - return $this->renderer; - } - - public function setStatesFromStatics(array $statics) - { - $this->renderer->setStatics($statics); - - $this->parser->setDepthLimit(isset($statics['max_depth']) ? $statics['max_depth'] : false); - $this->parser->clearPlugins(); - - if (!isset($statics['plugins'])) { - return; - } - - $plugins = array(); - - foreach ($statics['plugins'] as $plugin) { - if ($plugin instanceof Plugin) { - $plugins[] = $plugin; - } elseif (\is_string($plugin) && \is_subclass_of($plugin, 'Kint\\Parser\\Plugin')) { - if (!isset(self::$plugin_pool[$plugin])) { - $p = new $plugin(); - self::$plugin_pool[$plugin] = $p; - } - $plugins[] = self::$plugin_pool[$plugin]; - } - } - - $plugins = $this->renderer->filterParserPlugins($plugins); - - foreach ($plugins as $plugin) { - $this->parser->addPlugin($plugin); - } - } - - public function setStatesFromCallInfo(array $info) - { - $this->renderer->setCallInfo($info); - - if (isset($info['modifiers']) && \is_array($info['modifiers']) && \in_array('+', $info['modifiers'], true)) { - $this->parser->setDepthLimit(false); - } - - $this->parser->setCallerClass(isset($info['caller']['class']) ? $info['caller']['class'] : null); - } - - /** - * Renders a list of vars including the pre and post renders. - * - * @param array $vars Data to dump - * @param BasicObject[] $base Base objects - * - * @return string - */ - public function dumpAll(array $vars, array $base) - { - if (\array_keys($vars) !== \array_keys($base)) { - throw new InvalidArgumentException('Kint::dumpAll requires arrays of identical size and keys as arguments'); - } - - $output = $this->renderer->preRender(); - - if ($vars === array()) { - $output .= $this->renderer->renderNothing(); - } - - foreach ($vars as $key => $arg) { - if (!$base[$key] instanceof BasicObject) { - throw new InvalidArgumentException('Kint::dumpAll requires all elements of the second argument to be BasicObject instances'); - } - $output .= $this->dumpVar($arg, $base[$key]); - } - - $output .= $this->renderer->postRender(); - - return $output; - } - - /** - * Dumps and renders a var. - * - * @param mixed $var Data to dump - * @param BasicObject $base Base object - * - * @return string - */ - public function dumpVar(&$var, BasicObject $base) - { - return $this->renderer->render( - $this->parser->parse($var, $base) - ); - } - - /** - * Gets all static settings at once. - * - * @return array Current static settings - */ - public static function getStatics() - { - return array( - 'aliases' => self::$aliases, - 'app_root_dirs' => self::$app_root_dirs, - 'cli_detection' => self::$cli_detection, - 'display_called_from' => self::$display_called_from, - 'enabled_mode' => self::$enabled_mode, - 'expanded' => self::$expanded, - 'file_link_format' => self::$file_link_format, - 'max_depth' => self::$max_depth, - 'mode_default' => self::$mode_default, - 'mode_default_cli' => self::$mode_default_cli, - 'plugins' => self::$plugins, - 'renderers' => self::$renderers, - 'return' => self::$return, - ); - } - - /** - * Creates a Kint instances based on static settings. - * - * Also calls setStatesFromStatics for you - * - * @param array $statics array of statics as returned by getStatics - * - * @return null|\Kint\Kint - */ - public static function createFromStatics(array $statics) - { - $mode = false; - - if (isset($statics['enabled_mode'])) { - $mode = $statics['enabled_mode']; - - if (true === $statics['enabled_mode'] && isset($statics['mode_default'])) { - $mode = $statics['mode_default']; - - if (PHP_SAPI === 'cli' && !empty($statics['cli_detection']) && isset($statics['mode_default_cli'])) { - $mode = $statics['mode_default_cli']; - } - } - } - - if (!$mode) { - return null; - } - - if (!isset($statics['renderers'][$mode])) { - $renderer = new TextRenderer(); - } else { - /** @var Renderer */ - $renderer = new $statics['renderers'][$mode](); - } - - return new self(new Parser(), $renderer); - } - - /** - * Creates base objects given parameter info. - * - * @param array $params Parameters as returned from getCallInfo - * @param int $argc Number of arguments the helper was called with - * - * @return BasicObject[] Base objects for the arguments - */ - public static function getBasesFromParamInfo(array $params, $argc) - { - static $blacklist = array( - 'null', - 'true', - 'false', - 'array(...)', - 'array()', - '[...]', - '[]', - '(...)', - '()', - '"..."', - 'b"..."', - "'...'", - "b'...'", - ); - - $params = \array_values($params); - $bases = array(); - - for ($i = 0; $i < $argc; ++$i) { - if (isset($params[$i])) { - $param = $params[$i]; - } else { - $param = null; - } - - if (!isset($param['name']) || \is_numeric($param['name'])) { - $name = null; - } elseif (\in_array(\strtolower($param['name']), $blacklist, true)) { - $name = null; - } else { - $name = $param['name']; - } - - if (isset($param['path'])) { - $access_path = $param['path']; - - if (!empty($param['expression'])) { - $access_path = '('.$access_path.')'; - } - } else { - $access_path = '$'.$i; - } - - $bases[] = BasicObject::blank($name, $access_path); - } - - return $bases; - } - - /** - * Gets call info from the backtrace, alias, and argument count. - * - * Aliases must be normalized beforehand (Utils::normalizeAliases) - * - * @param array $aliases Call aliases as found in Kint::$aliases - * @param array[] $trace Backtrace - * @param int $argc Number of arguments - * - * @return array{params:null|array, modifiers:array, callee:null|array, caller:null|array, trace:array[]} Call info - */ - public static function getCallInfo(array $aliases, array $trace, $argc) - { - $found = false; - $callee = null; - $caller = null; - $miniTrace = array(); - - foreach ($trace as $index => $frame) { - if (Utils::traceFrameIsListed($frame, $aliases)) { - $found = true; - $miniTrace = array(); - } - - if (!Utils::traceFrameIsListed($frame, array('spl_autoload_call'))) { - $miniTrace[] = $frame; - } - } - - if ($found) { - $callee = \reset($miniTrace) ?: null; - - /** @var null|array Psalm bug workaround */ - $caller = \next($miniTrace) ?: null; - } - - foreach ($miniTrace as $index => $frame) { - if ((0 === $index && $callee === $frame) || isset($frame['file'], $frame['line'])) { - unset($frame['object'], $frame['args']); - $miniTrace[$index] = $frame; - } else { - unset($miniTrace[$index]); - } - } - - $miniTrace = \array_values($miniTrace); - - $call = self::getSingleCall($callee ?: array(), $argc); - - $ret = array( - 'params' => null, - 'modifiers' => array(), - 'callee' => $callee, - 'caller' => $caller, - 'trace' => $miniTrace, - ); - - if ($call) { - $ret['params'] = $call['parameters']; - $ret['modifiers'] = $call['modifiers']; - } - - return $ret; - } - - /** - * Dumps a backtrace. - * - * Functionally equivalent to Kint::dump(1) or Kint::dump(debug_backtrace(true)) - * - * @return int|string - */ - public static function trace() - { - if (!self::$enabled_mode) { - return 0; - } - - Utils::normalizeAliases(self::$aliases); - - $args = \func_get_args(); - - $call_info = self::getCallInfo(self::$aliases, \debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), \count($args)); - - $statics = self::getStatics(); - - if (\in_array('~', $call_info['modifiers'], true)) { - $statics['enabled_mode'] = self::MODE_TEXT; - } - - $kintstance = self::createFromStatics($statics); - if (!$kintstance) { - // Should never happen - return 0; // @codeCoverageIgnore - } - - if (\in_array('-', $call_info['modifiers'], true)) { - while (\ob_get_level()) { - \ob_end_clean(); - } - } - - $kintstance->setStatesFromStatics($statics); - $kintstance->setStatesFromCallInfo($call_info); - - $trimmed_trace = array(); - $trace = \debug_backtrace(true); - - foreach ($trace as $frame) { - if (Utils::traceFrameIsListed($frame, self::$aliases)) { - $trimmed_trace = array(); - } - - $trimmed_trace[] = $frame; - } - - $output = $kintstance->dumpAll( - array($trimmed_trace), - array(BasicObject::blank('Kint\\Kint::trace()', 'debug_backtrace(true)')) - ); - - if (self::$return || \in_array('@', $call_info['modifiers'], true)) { - return $output; - } - - echo $output; - - if (\in_array('-', $call_info['modifiers'], true)) { - \flush(); // @codeCoverageIgnore - } - - return 0; - } - - /** - * Dumps some data. - * - * Functionally equivalent to Kint::dump(1) or Kint::dump(debug_backtrace(true)) - * - * @return int|string - */ - public static function dump() - { - if (!self::$enabled_mode) { - return 0; - } - - Utils::normalizeAliases(self::$aliases); - - $args = \func_get_args(); - - $call_info = self::getCallInfo(self::$aliases, \debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), \count($args)); - - $statics = self::getStatics(); - - if (\in_array('~', $call_info['modifiers'], true)) { - $statics['enabled_mode'] = self::MODE_TEXT; - } - - $kintstance = self::createFromStatics($statics); - if (!$kintstance) { - // Should never happen - return 0; // @codeCoverageIgnore - } - - if (\in_array('-', $call_info['modifiers'], true)) { - while (\ob_get_level()) { - \ob_end_clean(); - } - } - - $kintstance->setStatesFromStatics($statics); - $kintstance->setStatesFromCallInfo($call_info); - - // If the call is Kint::dump(1) then dump a backtrace instead - if ($args === array(1) && (!isset($call_info['params'][0]['name']) || '1' === $call_info['params'][0]['name'])) { - $args = \debug_backtrace(true); - $trace = array(); - - foreach ($args as $index => $frame) { - if (Utils::traceFrameIsListed($frame, self::$aliases)) { - $trace = array(); - } - - $trace[] = $frame; - } - - if (isset($call_info['callee']['function'])) { - $tracename = $call_info['callee']['function'].'(1)'; - if (isset($call_info['callee']['class'], $call_info['callee']['type'])) { - $tracename = $call_info['callee']['class'].$call_info['callee']['type'].$tracename; - } - } else { - $tracename = 'Kint\\Kint::dump(1)'; - } - - $tracebase = BasicObject::blank($tracename, 'debug_backtrace(true)'); - - $output = $kintstance->dumpAll(array($trace), array($tracebase)); - } else { - $bases = self::getBasesFromParamInfo( - isset($call_info['params']) ? $call_info['params'] : array(), - \count($args) - ); - $output = $kintstance->dumpAll($args, $bases); - } - - if (self::$return || \in_array('@', $call_info['modifiers'], true)) { - return $output; - } - - echo $output; - - if (\in_array('-', $call_info['modifiers'], true)) { - \flush(); // @codeCoverageIgnore - } - - return 0; - } - - /** - * generic path display callback, can be configured in app_root_dirs; purpose is - * to show relevant path info and hide as much of the path as possible. - * - * @param string $file - * - * @return string - */ - public static function shortenPath($file) - { - $file = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', $file)), 'strlen')); - - $longest_match = 0; - $match = '/'; - - foreach (self::$app_root_dirs as $path => $alias) { - if (empty($path)) { - continue; - } - - $path = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', $path)), 'strlen')); - - if (\array_slice($file, 0, \count($path)) === $path && \count($path) > $longest_match) { - $longest_match = \count($path); - $match = $alias; - } - } - - if ($longest_match) { - $file = \array_merge(array($match), \array_slice($file, $longest_match)); - - return \implode('/', $file); - } - - // fallback to find common path with Kint dir - $kint = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', KINT_DIR)), 'strlen')); - - foreach ($file as $i => $part) { - if (!isset($kint[$i]) || $kint[$i] !== $part) { - return ($i ? '.../' : '/').\implode('/', \array_slice($file, $i)); - } - } - - return '/'.\implode('/', $file); - } - - public static function getIdeLink($file, $line) - { - return \str_replace(array('%f', '%l'), array($file, $line), self::$file_link_format); - } - - /** - * Returns specific function call info from a stack trace frame, or null if no match could be found. - * - * @param array $frame The stack trace frame in question - * @param int $argc The amount of arguments received - * - * @return null|array{parameters:array, modifiers:array} params and modifiers, or null if a specific call could not be determined - */ - protected static function getSingleCall(array $frame, $argc) - { - if (!isset($frame['file'], $frame['line'], $frame['function']) || !\is_readable($frame['file'])) { - return null; - } - - if (empty($frame['class'])) { - $callfunc = $frame['function']; - } else { - $callfunc = array($frame['class'], $frame['function']); - } - - $calls = CallFinder::getFunctionCalls( - \file_get_contents($frame['file']), - $frame['line'], - $callfunc - ); - - $return = null; - - foreach ($calls as $call) { - $is_unpack = false; - - // Handle argument unpacking as a last resort - if (KINT_PHP56) { - foreach ($call['parameters'] as $i => &$param) { - if (0 === \strpos($param['name'], '...')) { - if ($i < $argc && $i === \count($call['parameters']) - 1) { - for ($j = 1; $j + $i < $argc; ++$j) { - $call['parameters'][] = array( - 'name' => 'array_values('.\substr($param['name'], 3).')['.$j.']', - 'path' => 'array_values('.\substr($param['path'], 3).')['.$j.']', - 'expression' => false, - ); - } - - $param['name'] = 'reset('.\substr($param['name'], 3).')'; - $param['path'] = 'reset('.\substr($param['path'], 3).')'; - $param['expression'] = false; - } else { - $call['parameters'] = \array_slice($call['parameters'], 0, $i); - } - - $is_unpack = true; - break; - } - - if ($i >= $argc) { - continue 2; - } - } - } - - if ($is_unpack || \count($call['parameters']) === $argc) { - if (null === $return) { - $return = $call; - } else { - // If we have multiple calls on the same line with the same amount of arguments, - // we can't be sure which it is so just return null and let them figure it out - return null; - } - } - } - - return $return; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/BasicObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/BasicObject.php deleted file mode 100644 index d69347e..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/BasicObject.php +++ /dev/null @@ -1,248 +0,0 @@ -representations[$rep->getName()])) { - return false; - } - - if (null === $pos) { - $this->representations[$rep->getName()] = $rep; - } else { - $this->representations = \array_merge( - \array_slice($this->representations, 0, $pos), - array($rep->getName() => $rep), - \array_slice($this->representations, $pos) - ); - } - - return true; - } - - public function replaceRepresentation(Representation $rep, $pos = null) - { - if (null === $pos) { - $this->representations[$rep->getName()] = $rep; - } else { - $this->removeRepresentation($rep); - $this->addRepresentation($rep, $pos); - } - } - - public function removeRepresentation($rep) - { - if ($rep instanceof Representation) { - unset($this->representations[$rep->getName()]); - } elseif (\is_string($rep)) { - unset($this->representations[$rep]); - } - } - - public function getRepresentation($name) - { - if (isset($this->representations[$name])) { - return $this->representations[$name]; - } - } - - public function getRepresentations() - { - return $this->representations; - } - - public function clearRepresentations() - { - $this->representations = array(); - } - - public function getType() - { - return $this->type; - } - - public function getModifiers() - { - $out = $this->getAccess(); - - if ($this->const) { - $out .= ' const'; - } - - if ($this->static) { - $out .= ' static'; - } - - if (\strlen($out)) { - return \ltrim($out); - } - } - - public function getAccess() - { - switch ($this->access) { - case self::ACCESS_PRIVATE: - return 'private'; - case self::ACCESS_PROTECTED: - return 'protected'; - case self::ACCESS_PUBLIC: - return 'public'; - } - } - - public function getName() - { - return $this->name; - } - - public function getOperator() - { - switch ($this->operator) { - case self::OPERATOR_ARRAY: - return '=>'; - case self::OPERATOR_OBJECT: - return '->'; - case self::OPERATOR_STATIC: - return '::'; - } - } - - public function getSize() - { - return $this->size; - } - - public function getValueShort() - { - if ($rep = $this->value) { - if ('boolean' === $this->type) { - return $rep->contents ? 'true' : 'false'; - } - - if ('integer' === $this->type || 'double' === $this->type) { - return $rep->contents; - } - } - } - - public function getAccessPath() - { - return $this->access_path; - } - - public function transplant(BasicObject $old) - { - $this->name = $old->name; - $this->size = $old->size; - $this->access_path = $old->access_path; - $this->access = $old->access; - $this->static = $old->static; - $this->const = $old->const; - $this->type = $old->type; - $this->depth = $old->depth; - $this->owner_class = $old->owner_class; - $this->operator = $old->operator; - $this->reference = $old->reference; - $this->value = $old->value; - $this->representations += $old->representations; - $this->hints = \array_merge($this->hints, $old->hints); - } - - /** - * Creates a new basic object with a name and access path. - * - * @param null|string $name - * @param null|string $access_path - * - * @return \Kint\Object\BasicObject - */ - public static function blank($name = null, $access_path = null) - { - $o = new self(); - $o->name = $name; - $o->access_path = $access_path; - - return $o; - } - - public static function sortByAccess(BasicObject $a, BasicObject $b) - { - static $sorts = array( - self::ACCESS_PUBLIC => 1, - self::ACCESS_PROTECTED => 2, - self::ACCESS_PRIVATE => 3, - self::ACCESS_NONE => 4, - ); - - return $sorts[$a->access] - $sorts[$b->access]; - } - - public static function sortByName(BasicObject $a, BasicObject $b) - { - $ret = \strnatcasecmp($a->name, $b->name); - - if (0 === $ret) { - return (int) \is_int($b->name) - (int) \is_int($a->name); - } - - return $ret; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/BlobObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/BlobObject.php deleted file mode 100644 index 66d508f..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/BlobObject.php +++ /dev/null @@ -1,177 +0,0 @@ -encoding) { - return 'binary '.$this->type; - } - - if ('ASCII' === $this->encoding) { - return $this->type; - } - - return $this->encoding.' '.$this->type; - } - - public function getValueShort() - { - if ($rep = $this->value) { - return '"'.$rep->contents.'"'; - } - } - - public function transplant(BasicObject $old) - { - parent::transplant($old); - - if ($old instanceof self) { - $this->encoding = $old->encoding; - } - } - - public static function strlen($string, $encoding = false) - { - if (\function_exists('mb_strlen')) { - if (false === $encoding) { - $encoding = self::detectEncoding($string); - } - - if ($encoding && 'ASCII' !== $encoding) { - return \mb_strlen($string, $encoding); - } - } - - return \strlen($string); - } - - public static function substr($string, $start, $length = null, $encoding = false) - { - if (\function_exists('mb_substr')) { - if (false === $encoding) { - $encoding = self::detectEncoding($string); - } - - if ($encoding && 'ASCII' !== $encoding) { - return \mb_substr($string, $start, $length, $encoding); - } - } - - // Special case for substr/mb_substr discrepancy - if ('' === $string) { - return ''; - } - - return \substr($string, $start, isset($length) ? $length : PHP_INT_MAX); - } - - public static function detectEncoding($string) - { - if (\function_exists('mb_detect_encoding')) { - if ($ret = \mb_detect_encoding($string, self::$char_encodings, true)) { - return $ret; - } - } - - // Pretty much every character encoding uses first 32 bytes as control - // characters. If it's not a multi-byte format it's safe to say matching - // any control character besides tab, nl, and cr means it's binary. - if (\preg_match('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/', $string)) { - return false; - } - - if (\function_exists('iconv')) { - foreach (self::$legacy_encodings as $encoding) { - if (@\iconv($encoding, $encoding, $string) === $string) { - return $encoding; - } - } - } elseif (!\function_exists('mb_detect_encoding')) { // @codeCoverageIgnore - // If a user has neither mb_detect_encoding, nor iconv, nor the - // polyfills, there's not much we can do about it... - // Pretend it's ASCII and pray the browser renders it properly. - return 'ASCII'; // @codeCoverageIgnore - } - - return false; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ClosureObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ClosureObject.php deleted file mode 100644 index 344eceb..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ClosureObject.php +++ /dev/null @@ -1,68 +0,0 @@ -access_path) { - return parent::getAccessPath().'('.$this->getParams().')'; - } - } - - public function getSize() - { - } - - public function getParams() - { - if (null !== $this->paramcache) { - return $this->paramcache; - } - - $out = array(); - - foreach ($this->parameters as $p) { - $type = $p->getType(); - - $ref = $p->reference ? '&' : ''; - - if ($type) { - $out[] = $type.' '.$ref.$p->getName(); - } else { - $out[] = $ref.$p->getName(); - } - } - - return $this->paramcache = \implode(', ', $out); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/DateTimeObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/DateTimeObject.php deleted file mode 100644 index f8b1b3f..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/DateTimeObject.php +++ /dev/null @@ -1,53 +0,0 @@ -dt = clone $dt; - } - - public function getValueShort() - { - $stamp = $this->dt->format('Y-m-d H:i:s'); - if ((int) ($micro = $this->dt->format('u'))) { - $stamp .= '.'.$micro; - } - $stamp .= $this->dt->format('P T'); - - return $stamp; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/InstanceObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/InstanceObject.php deleted file mode 100644 index 943b33d..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/InstanceObject.php +++ /dev/null @@ -1,78 +0,0 @@ -classname; - } - - public function transplant(BasicObject $old) - { - parent::transplant($old); - - if ($old instanceof self) { - $this->classname = $old->classname; - $this->hash = $old->hash; - $this->filename = $old->filename; - $this->startline = $old->startline; - } - } - - public static function sortByHierarchy($a, $b) - { - if (\is_string($a) && \is_string($b)) { - $aclass = $a; - $bclass = $b; - } elseif (!($a instanceof BasicObject) || !($b instanceof BasicObject)) { - return 0; - } elseif ($a instanceof self && $b instanceof self) { - $aclass = $a->classname; - $bclass = $b->classname; - } else { - return 0; - } - - if (\is_subclass_of($aclass, $bclass)) { - return -1; - } - - if (\is_subclass_of($bclass, $aclass)) { - return 1; - } - - return 0; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/MethodObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/MethodObject.php deleted file mode 100644 index 78d49de..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/MethodObject.php +++ /dev/null @@ -1,253 +0,0 @@ -name = $method->getName(); - $this->filename = $method->getFileName(); - $this->startline = $method->getStartLine(); - $this->endline = $method->getEndLine(); - $this->internal = $method->isInternal(); - $this->docstring = $method->getDocComment(); - $this->return_reference = $method->returnsReference(); - - foreach ($method->getParameters() as $param) { - $this->parameters[] = new ParameterObject($param); - } - - if (KINT_PHP70) { - $this->returntype = $method->getReturnType(); - if ($this->returntype) { - $this->returntype = Utils::getTypeString($this->returntype); - } - } - - if ($method instanceof ReflectionMethod) { - $this->static = $method->isStatic(); - $this->operator = $this->static ? BasicObject::OPERATOR_STATIC : BasicObject::OPERATOR_OBJECT; - $this->abstract = $method->isAbstract(); - $this->final = $method->isFinal(); - $this->owner_class = $method->getDeclaringClass()->name; - $this->access = BasicObject::ACCESS_PUBLIC; - if ($method->isProtected()) { - $this->access = BasicObject::ACCESS_PROTECTED; - } elseif ($method->isPrivate()) { - $this->access = BasicObject::ACCESS_PRIVATE; - } - } - - if ($this->internal) { - return; - } - - $docstring = new DocstringRepresentation( - $this->docstring, - $this->filename, - $this->startline - ); - - $docstring->implicit_label = true; - $this->addRepresentation($docstring); - $this->value = $docstring; - } - - public function setAccessPathFrom(InstanceObject $parent) - { - static $magic = array( - '__call' => true, - '__callstatic' => true, - '__clone' => true, - '__construct' => true, - '__debuginfo' => true, - '__destruct' => true, - '__get' => true, - '__invoke' => true, - '__isset' => true, - '__set' => true, - '__set_state' => true, - '__sleep' => true, - '__tostring' => true, - '__unset' => true, - '__wakeup' => true, - ); - - $name = \strtolower($this->name); - - if ('__construct' === $name) { - $this->access_path = 'new \\'.$parent->getType(); - } elseif ('__invoke' === $name) { - $this->access_path = $parent->access_path; - } elseif ('__clone' === $name) { - $this->access_path = 'clone '.$parent->access_path; - $this->showparams = false; - } elseif ('__tostring' === $name) { - $this->access_path = '(string) '.$parent->access_path; - $this->showparams = false; - } elseif (isset($magic[$name])) { - $this->access_path = null; - } elseif ($this->static) { - $this->access_path = '\\'.$this->owner_class.'::'.$this->name; - } else { - $this->access_path = $parent->access_path.'->'.$this->name; - } - } - - public function getValueShort() - { - if (!$this->value || !($this->value instanceof DocstringRepresentation)) { - return parent::getValueShort(); - } - - $ds = $this->value->getDocstringWithoutComments(); - - if (!$ds) { - return null; - } - - $ds = \explode("\n", $ds); - - $out = ''; - - foreach ($ds as $line) { - if (0 === \strlen(\trim($line)) || '@' === $line[0]) { - break; - } - - $out .= $line.' '; - } - - if (\strlen($out)) { - return \rtrim($out); - } - } - - public function getModifiers() - { - $mods = array( - $this->abstract ? 'abstract' : null, - $this->final ? 'final' : null, - $this->getAccess(), - $this->static ? 'static' : null, - ); - - $out = ''; - - foreach ($mods as $word) { - if (null !== $word) { - $out .= $word.' '; - } - } - - if (\strlen($out)) { - return \rtrim($out); - } - } - - public function getAccessPath() - { - if (null !== $this->access_path) { - if ($this->showparams) { - return parent::getAccessPath().'('.$this->getParams().')'; - } - - return parent::getAccessPath(); - } - } - - public function getParams() - { - if (null !== $this->paramcache) { - return $this->paramcache; - } - - $out = array(); - - foreach ($this->parameters as $p) { - $type = $p->getType(); - if ($type) { - $type .= ' '; - } - - $default = $p->getDefault(); - if ($default) { - $default = ' = '.$default; - } - - $ref = $p->reference ? '&' : ''; - - $out[] = $type.$ref.$p->getName().$default; - } - - return $this->paramcache = \implode(', ', $out); - } - - public function getPhpDocUrl() - { - if (!$this->internal) { - return null; - } - - if ($this->owner_class) { - $class = \strtolower($this->owner_class); - } else { - $class = 'function'; - } - - $funcname = \str_replace('_', '-', \strtolower($this->name)); - - if (0 === \strpos($funcname, '--') && 0 !== \strpos($funcname, '-', 2)) { - $funcname = \substr($funcname, 2); - } - - return 'https://secure.php.net/'.$class.'.'.$funcname; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ParameterObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ParameterObject.php deleted file mode 100644 index 4bed551..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ParameterObject.php +++ /dev/null @@ -1,100 +0,0 @@ -getType()) { - $this->type_hint = Utils::getTypeString($type); - } - } else { - if ($param->isArray()) { - $this->type_hint = 'array'; - } else { - try { - if ($this->type_hint = $param->getClass()) { - $this->type_hint = $this->type_hint->name; - } - } catch (ReflectionException $e) { - \preg_match('/\\[\\s\\<\\w+?>\\s([\\w]+)/s', $param->__toString(), $matches); - $this->type_hint = isset($matches[1]) ? $matches[1] : ''; - } - } - } - - $this->reference = $param->isPassedByReference(); - $this->name = $param->getName(); - $this->position = $param->getPosition(); - - if ($param->isDefaultValueAvailable()) { - /** @var mixed Psalm bug workaround */ - $default = $param->getDefaultValue(); - switch (\gettype($default)) { - case 'NULL': - $this->default = 'null'; - break; - case 'boolean': - $this->default = $default ? 'true' : 'false'; - break; - case 'array': - $this->default = \count($default) ? 'array(...)' : 'array()'; - break; - default: - $this->default = \var_export($default, true); - break; - } - } - } - - public function getType() - { - return $this->type_hint; - } - - public function getName() - { - return '$'.$this->name; - } - - public function getDefault() - { - return $this->default; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/ColorRepresentation.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/ColorRepresentation.php deleted file mode 100644 index d6a072f..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/ColorRepresentation.php +++ /dev/null @@ -1,576 +0,0 @@ - 'f0f8ff', - 'antiquewhite' => 'faebd7', - 'aqua' => '00ffff', - 'aquamarine' => '7fffd4', - 'azure' => 'f0ffff', - 'beige' => 'f5f5dc', - 'bisque' => 'ffe4c4', - 'black' => '000000', - 'blanchedalmond' => 'ffebcd', - 'blue' => '0000ff', - 'blueviolet' => '8a2be2', - 'brown' => 'a52a2a', - 'burlywood' => 'deb887', - 'cadetblue' => '5f9ea0', - 'chartreuse' => '7fff00', - 'chocolate' => 'd2691e', - 'coral' => 'ff7f50', - 'cornflowerblue' => '6495ed', - 'cornsilk' => 'fff8dc', - 'crimson' => 'dc143c', - 'cyan' => '00ffff', - 'darkblue' => '00008b', - 'darkcyan' => '008b8b', - 'darkgoldenrod' => 'b8860b', - 'darkgray' => 'a9a9a9', - 'darkgreen' => '006400', - 'darkgrey' => 'a9a9a9', - 'darkkhaki' => 'bdb76b', - 'darkmagenta' => '8b008b', - 'darkolivegreen' => '556b2f', - 'darkorange' => 'ff8c00', - 'darkorchid' => '9932cc', - 'darkred' => '8b0000', - 'darksalmon' => 'e9967a', - 'darkseagreen' => '8fbc8f', - 'darkslateblue' => '483d8b', - 'darkslategray' => '2f4f4f', - 'darkslategrey' => '2f4f4f', - 'darkturquoise' => '00ced1', - 'darkviolet' => '9400d3', - 'deeppink' => 'ff1493', - 'deepskyblue' => '00bfff', - 'dimgray' => '696969', - 'dimgrey' => '696969', - 'dodgerblue' => '1e90ff', - 'firebrick' => 'b22222', - 'floralwhite' => 'fffaf0', - 'forestgreen' => '228b22', - 'fuchsia' => 'ff00ff', - 'gainsboro' => 'dcdcdc', - 'ghostwhite' => 'f8f8ff', - 'gold' => 'ffd700', - 'goldenrod' => 'daa520', - 'gray' => '808080', - 'green' => '008000', - 'greenyellow' => 'adff2f', - 'grey' => '808080', - 'honeydew' => 'f0fff0', - 'hotpink' => 'ff69b4', - 'indianred' => 'cd5c5c', - 'indigo' => '4b0082', - 'ivory' => 'fffff0', - 'khaki' => 'f0e68c', - 'lavender' => 'e6e6fa', - 'lavenderblush' => 'fff0f5', - 'lawngreen' => '7cfc00', - 'lemonchiffon' => 'fffacd', - 'lightblue' => 'add8e6', - 'lightcoral' => 'f08080', - 'lightcyan' => 'e0ffff', - 'lightgoldenrodyellow' => 'fafad2', - 'lightgray' => 'd3d3d3', - 'lightgreen' => '90ee90', - 'lightgrey' => 'd3d3d3', - 'lightpink' => 'ffb6c1', - 'lightsalmon' => 'ffa07a', - 'lightseagreen' => '20b2aa', - 'lightskyblue' => '87cefa', - 'lightslategray' => '778899', - 'lightslategrey' => '778899', - 'lightsteelblue' => 'b0c4de', - 'lightyellow' => 'ffffe0', - 'lime' => '00ff00', - 'limegreen' => '32cd32', - 'linen' => 'faf0e6', - 'magenta' => 'ff00ff', - 'maroon' => '800000', - 'mediumaquamarine' => '66cdaa', - 'mediumblue' => '0000cd', - 'mediumorchid' => 'ba55d3', - 'mediumpurple' => '9370db', - 'mediumseagreen' => '3cb371', - 'mediumslateblue' => '7b68ee', - 'mediumspringgreen' => '00fa9a', - 'mediumturquoise' => '48d1cc', - 'mediumvioletred' => 'c71585', - 'midnightblue' => '191970', - 'mintcream' => 'f5fffa', - 'mistyrose' => 'ffe4e1', - 'moccasin' => 'ffe4b5', - 'navajowhite' => 'ffdead', - 'navy' => '000080', - 'oldlace' => 'fdf5e6', - 'olive' => '808000', - 'olivedrab' => '6b8e23', - 'orange' => 'ffa500', - 'orangered' => 'ff4500', - 'orchid' => 'da70d6', - 'palegoldenrod' => 'eee8aa', - 'palegreen' => '98fb98', - 'paleturquoise' => 'afeeee', - 'palevioletred' => 'db7093', - 'papayawhip' => 'ffefd5', - 'peachpuff' => 'ffdab9', - 'peru' => 'cd853f', - 'pink' => 'ffc0cb', - 'plum' => 'dda0dd', - 'powderblue' => 'b0e0e6', - 'purple' => '800080', - 'rebeccapurple' => '663399', - 'red' => 'ff0000', - 'rosybrown' => 'bc8f8f', - 'royalblue' => '4169e1', - 'saddlebrown' => '8b4513', - 'salmon' => 'fa8072', - 'sandybrown' => 'f4a460', - 'seagreen' => '2e8b57', - 'seashell' => 'fff5ee', - 'sienna' => 'a0522d', - 'silver' => 'c0c0c0', - 'skyblue' => '87ceeb', - 'slateblue' => '6a5acd', - 'slategray' => '708090', - 'slategrey' => '708090', - 'snow' => 'fffafa', - 'springgreen' => '00ff7f', - 'steelblue' => '4682b4', - 'tan' => 'd2b48c', - 'teal' => '008080', - 'thistle' => 'd8bfd8', - 'tomato' => 'ff6347', - // To quote MDN: - // "Technically, transparent is a shortcut for rgba(0,0,0,0)." - 'transparent' => '00000000', - 'turquoise' => '40e0d0', - 'violet' => 'ee82ee', - 'wheat' => 'f5deb3', - 'white' => 'ffffff', - 'whitesmoke' => 'f5f5f5', - 'yellow' => 'ffff00', - 'yellowgreen' => '9acd32', - ); - - public $r = 0; - public $g = 0; - public $b = 0; - public $a = 1.0; - public $variant; - public $implicit_label = true; - public $hints = array('color'); - - public function __construct($value) - { - parent::__construct('Color'); - - $this->contents = $value; - $this->setValues($value); - } - - public function getColor($variant = null) - { - if (!$variant) { - $variant = $this->variant; - } - - switch ($variant) { - case self::COLOR_NAME: - $hex = \sprintf('%02x%02x%02x', $this->r, $this->g, $this->b); - $hex_alpha = \sprintf('%02x%02x%02x%02x', $this->r, $this->g, $this->b, \round($this->a * 0xFF)); - - return \array_search($hex, self::$color_map, true) ?: \array_search($hex_alpha, self::$color_map, true); - case self::COLOR_HEX_3: - if (0 === $this->r % 0x11 && 0 === $this->g % 0x11 && 0 === $this->b % 0x11) { - return \sprintf( - '#%1X%1X%1X', - \round($this->r / 0x11), - \round($this->g / 0x11), - \round($this->b / 0x11) - ); - } - - return false; - case self::COLOR_HEX_6: - return \sprintf('#%02X%02X%02X', $this->r, $this->g, $this->b); - case self::COLOR_RGB: - if (1.0 === $this->a) { - return \sprintf('rgb(%d, %d, %d)', $this->r, $this->g, $this->b); - } - - return \sprintf('rgb(%d, %d, %d, %s)', $this->r, $this->g, $this->b, \round($this->a, 4)); - case self::COLOR_RGBA: - return \sprintf('rgba(%d, %d, %d, %s)', $this->r, $this->g, $this->b, \round($this->a, 4)); - case self::COLOR_HSL: - $val = self::rgbToHsl($this->r, $this->g, $this->b); - if (1.0 === $this->a) { - return \vsprintf('hsl(%d, %d%%, %d%%)', $val); - } - - return \sprintf('hsl(%d, %d%%, %d%%, %s)', $val[0], $val[1], $val[2], \round($this->a, 4)); - case self::COLOR_HSLA: - $val = self::rgbToHsl($this->r, $this->g, $this->b); - - return \sprintf('hsla(%d, %d%%, %d%%, %s)', $val[0], $val[1], $val[2], \round($this->a, 4)); - case self::COLOR_HEX_4: - if (0 === $this->r % 0x11 && 0 === $this->g % 0x11 && 0 === $this->b % 0x11 && 0 === ($this->a * 255) % 0x11) { - return \sprintf( - '#%1X%1X%1X%1X', - \round($this->r / 0x11), - \round($this->g / 0x11), - \round($this->b / 0x11), - \round($this->a * 0xF) - ); - } - - return false; - - case self::COLOR_HEX_8: - return \sprintf('#%02X%02X%02X%02X', $this->r, $this->g, $this->b, \round($this->a * 0xFF)); - } - - return false; - } - - public function hasAlpha($variant = null) - { - if (null === $variant) { - $variant = $this->variant; - } - - switch ($variant) { - case self::COLOR_NAME: - case self::COLOR_RGB: - case self::COLOR_HSL: - return \abs($this->a - 1) >= 0.0001; - case self::COLOR_RGBA: - case self::COLOR_HSLA: - case self::COLOR_HEX_4: - case self::COLOR_HEX_8: - return true; - default: - return false; - } - } - - protected function setValues($value) - { - $value = \strtolower(\trim($value)); - // Find out which variant of color input it is - if (isset(self::$color_map[$value])) { - if (!$this->setValuesFromHex(self::$color_map[$value])) { - return; - } - - $variant = self::COLOR_NAME; - } elseif ('#' === $value[0]) { - $variant = $this->setValuesFromHex(\substr($value, 1)); - - if (!$variant) { - return; - } - } else { - $variant = $this->setValuesFromFunction($value); - - if (!$variant) { - return; - } - } - - // If something has gone horribly wrong - if ($this->r > 0xFF || $this->g > 0xFF || $this->b > 0xFF || $this->a > 1) { - $this->variant = null; // @codeCoverageIgnore - } else { - $this->variant = $variant; - $this->r = (int) $this->r; - $this->g = (int) $this->g; - $this->b = (int) $this->b; - $this->a = (float) $this->a; - } - } - - protected function setValuesFromHex($hex) - { - if (!\ctype_xdigit($hex)) { - return null; - } - - switch (\strlen($hex)) { - case 3: - $variant = self::COLOR_HEX_3; - break; - case 6: - $variant = self::COLOR_HEX_6; - break; - case 4: - $variant = self::COLOR_HEX_4; - break; - case 8: - $variant = self::COLOR_HEX_8; - break; - default: - return null; - } - - switch ($variant) { - case self::COLOR_HEX_4: - $this->a = \hexdec($hex[3]) / 0xF; - // no break - case self::COLOR_HEX_3: - $this->r = \hexdec($hex[0]) * 0x11; - $this->g = \hexdec($hex[1]) * 0x11; - $this->b = \hexdec($hex[2]) * 0x11; - break; - case self::COLOR_HEX_8: - $this->a = \hexdec(\substr($hex, 6, 2)) / 0xFF; - // no break - case self::COLOR_HEX_6: - $hex = \str_split($hex, 2); - $this->r = \hexdec($hex[0]); - $this->g = \hexdec($hex[1]); - $this->b = \hexdec($hex[2]); - break; - } - - return $variant; - } - - protected function setValuesFromFunction($value) - { - if (!\preg_match('/^((?:rgb|hsl)a?)\\s*\\(([0-9\\.%,\\s\\/\\-]+)\\)$/i', $value, $match)) { - return null; - } - - switch (\strtolower($match[1])) { - case 'rgb': - $variant = self::COLOR_RGB; - break; - case 'rgba': - $variant = self::COLOR_RGBA; - break; - case 'hsl': - $variant = self::COLOR_HSL; - break; - case 'hsla': - $variant = self::COLOR_HSLA; - break; - default: - return null; // @codeCoverageIgnore - } - - $params = \preg_replace('/[,\\s\\/]+/', ',', \trim($match[2])); - $params = \explode(',', $params); - $params = \array_map('trim', $params); - - if (\count($params) < 3 || \count($params) > 4) { - return null; - } - - foreach ($params as $i => &$color) { - if (false !== \strpos($color, '%')) { - $color = (float) \str_replace('%', '', $color); - - if (3 === $i) { - $color = $color / 100; - } elseif (\in_array($variant, array(self::COLOR_RGB, self::COLOR_RGBA), true)) { - $color = \round($color / 100 * 0xFF); - } - } - - $color = (float) $color; - - if (0 === $i && \in_array($variant, array(self::COLOR_HSL, self::COLOR_HSLA), true)) { - $color = ($color % 360 + 360) % 360; - } - } - - /** @var float[] Psalm bug workaround */ - $params = \array_map('floatval', $params); - - switch ($variant) { - case self::COLOR_RGBA: - case self::COLOR_RGB: - if (\min($params) < 0 || \max($params) > 0xFF) { - return null; - } - break; - case self::COLOR_HSLA: - case self::COLOR_HSL: - if (\min($params) < 0 || $params[0] > 360 || \max($params[1], $params[2]) > 100) { - return null; - } - break; - } - - if (4 === \count($params)) { - if ($params[3] > 1) { - return null; - } - - $this->a = $params[3]; - } - - if (self::COLOR_HSLA === $variant || self::COLOR_HSL === $variant) { - $params = self::hslToRgb($params[0], $params[1], $params[2]); - } - - list($this->r, $this->g, $this->b) = $params; - - return $variant; - } - - /** - * Turns HSL color to RGB. Black magic. - * - * @param float $h Hue - * @param float $s Saturation - * @param float $l Lightness - * - * @return int[] RGB array - */ - public static function hslToRgb($h, $s, $l) - { - if (\min($h, $s, $l) < 0) { - throw new InvalidArgumentException('The parameters for hslToRgb should be no less than 0'); - } - - if ($h > 360 || \max($s, $l) > 100) { - throw new InvalidArgumentException('The parameters for hslToRgb should be no more than 360, 100, and 100 respectively'); - } - - $h /= 360; - $s /= 100; - $l /= 100; - - $m2 = ($l <= 0.5) ? $l * ($s + 1) : $l + $s - $l * $s; - $m1 = $l * 2 - $m2; - - return array( - (int) \round(self::hueToRgb($m1, $m2, $h + 1 / 3) * 0xFF), - (int) \round(self::hueToRgb($m1, $m2, $h) * 0xFF), - (int) \round(self::hueToRgb($m1, $m2, $h - 1 / 3) * 0xFF), - ); - } - - /** - * Converts RGB to HSL. Color inversion of previous black magic is white magic? - * - * @param float|int $red Red - * @param float|int $green Green - * @param float|int $blue Blue - * - * @return float[] HSL array - */ - public static function rgbToHsl($red, $green, $blue) - { - if (\min($red, $green, $blue) < 0) { - throw new InvalidArgumentException('The parameters for rgbToHsl should be no less than 0'); - } - - if (\max($red, $green, $blue) > 0xFF) { - throw new InvalidArgumentException('The parameters for rgbToHsl should be no more than 255'); - } - - $clrMin = \min($red, $green, $blue); - $clrMax = \max($red, $green, $blue); - $deltaMax = $clrMax - $clrMin; - - $L = ($clrMax + $clrMin) / 510; - - if (0 == $deltaMax) { - $H = 0; - $S = 0; - } else { - if (0.5 > $L) { - $S = $deltaMax / ($clrMax + $clrMin); - } else { - $S = $deltaMax / (510 - $clrMax - $clrMin); - } - - if ($clrMax === $red) { - $H = ($green - $blue) / (6.0 * $deltaMax); - - if (0 > $H) { - $H += 1.0; - } - } elseif ($clrMax === $green) { - $H = 1 / 3 + ($blue - $red) / (6.0 * $deltaMax); - } else { - $H = 2 / 3 + ($red - $green) / (6.0 * $deltaMax); - } - } - - return array( - (float) ($H * 360 % 360), - (float) ($S * 100), - (float) ($L * 100), - ); - } - - /** - * Helper function for hslToRgb. Even blacker magic. - * - * - * @param float $m1 - * @param float $m2 - * @param float $hue - * - * @return float Color value - */ - private static function hueToRgb($m1, $m2, $hue) - { - $hue = ($hue < 0) ? $hue + 1 : (($hue > 1) ? $hue - 1 : $hue); - if ($hue * 6 < 1) { - return $m1 + ($m2 - $m1) * $hue * 6; - } - if ($hue * 2 < 1) { - return $m2; - } - if ($hue * 3 < 2) { - return $m1 + ($m2 - $m1) * (2 / 3 - $hue) * 6; - } - - return $m1; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/DocstringRepresentation.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/DocstringRepresentation.php deleted file mode 100644 index 488d8d6..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/DocstringRepresentation.php +++ /dev/null @@ -1,73 +0,0 @@ -file = $file; - $this->line = $line; - $this->class = $class; - $this->contents = $docstring; - } - - /** - * Returns the representation's docstring without surrounding comments. - * - * Note that this will not work flawlessly. - * - * On comments with whitespace after the stars the lines will begin with - * whitespace, since we can't accurately guess how much of an indentation - * is required. - * - * And on lines without stars on the left this may eat bullet points. - * - * Long story short: If you want the docstring read the contents. If you - * absolutely must have it without comments (ie renderValueShort) this will - * probably do. - * - * @return null|string Docstring with comments stripped - */ - public function getDocstringWithoutComments() - { - if (!$this->contents) { - return null; - } - - $string = \substr($this->contents, 3, -2); - $string = \preg_replace('/^\\s*\\*\\s*?(\\S|$)/m', '\\1', $string); - - return \trim($string); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/MicrotimeRepresentation.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/MicrotimeRepresentation.php deleted file mode 100644 index b9f4dac..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/MicrotimeRepresentation.php +++ /dev/null @@ -1,71 +0,0 @@ -seconds = (int) $seconds; - $this->microseconds = (int) $microseconds; - - $this->group = $group; - $this->lap = $lap; - $this->total = $total; - $this->i = $i; - - if ($i) { - $this->avg = $total / $i; - } - - $this->mem = \memory_get_usage(); - $this->mem_real = \memory_get_usage(true); - $this->mem_peak = \memory_get_peak_usage(); - $this->mem_peak_real = \memory_get_peak_usage(true); - } - - public function getDateTime() - { - return DateTime::createFromFormat('U u', $this->seconds.' '.\str_pad($this->microseconds, 6, '0', STR_PAD_LEFT)); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/Representation.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/Representation.php deleted file mode 100644 index 0c911a4..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/Representation.php +++ /dev/null @@ -1,71 +0,0 @@ -label = $label; - - if (null === $name) { - $name = $label; - } - - $this->setName($name); - } - - public function getLabel() - { - if (\is_array($this->contents) && \count($this->contents) > 1) { - return $this->label.' ('.\count($this->contents).')'; - } - - return $this->label; - } - - public function getName() - { - return $this->name; - } - - public function setName($name) - { - $this->name = \preg_replace('/[^a-z0-9]+/', '_', \strtolower($name)); - } - - public function labelIsImplicit() - { - return $this->implicit_label; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/SourceRepresentation.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/SourceRepresentation.php deleted file mode 100644 index c2cf120..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/SourceRepresentation.php +++ /dev/null @@ -1,72 +0,0 @@ -filename = $filename; - $this->line = $line; - - $start_line = \max($line - $padding, 1); - $length = $line + $padding + 1 - $start_line; - $this->source = self::getSource($filename, $start_line, $length); - if (null !== $this->source) { - $this->contents = \implode("\n", $this->source); - } - } - - /** - * Gets section of source code. - * - * @param string $filename Full path to file - * @param int $start_line The first line to display (1 based) - * @param null|int $length Amount of lines to show - * - * @return null|array - */ - public static function getSource($filename, $start_line = 1, $length = null) - { - if (!$filename || !\file_exists($filename) || !\is_readable($filename)) { - return null; - } - - $source = \preg_split("/\r\n|\n|\r/", \file_get_contents($filename)); - $source = \array_combine(\range(1, \count($source)), $source); - $source = \array_slice($source, $start_line - 1, $length, true); - - return $source; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/SplFileInfoRepresentation.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/SplFileInfoRepresentation.php deleted file mode 100644 index 3df50e6..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/Representation/SplFileInfoRepresentation.php +++ /dev/null @@ -1,177 +0,0 @@ -getRealPath()) { - $this->realpath = $fileInfo->getRealPath(); - $this->perms = $fileInfo->getPerms(); - $this->size = $fileInfo->getSize(); - $this->owner = $fileInfo->getOwner(); - $this->group = $fileInfo->getGroup(); - $this->ctime = $fileInfo->getCTime(); - $this->mtime = $fileInfo->getMTime(); - } - - $this->path = $fileInfo->getPathname(); - - $this->is_dir = $fileInfo->isDir(); - $this->is_file = $fileInfo->isFile(); - $this->is_link = $fileInfo->isLink(); - - if ($this->is_link) { - $this->linktarget = $fileInfo->getLinkTarget(); - } - - switch ($this->perms & 0xF000) { - case 0xC000: - $this->typename = 'Socket'; - $this->typeflag = 's'; - break; - case 0x6000: - $this->typename = 'Block device'; - $this->typeflag = 'b'; - break; - case 0x2000: - $this->typename = 'Character device'; - $this->typeflag = 'c'; - break; - case 0x1000: - $this->typename = 'Named pipe'; - $this->typeflag = 'p'; - break; - default: - if ($this->is_file) { - if ($this->is_link) { - $this->typename = 'File symlink'; - $this->typeflag = 'l'; - } else { - $this->typename = 'File'; - $this->typeflag = '-'; - } - } elseif ($this->is_dir) { - if ($this->is_link) { - $this->typename = 'Directory symlink'; - $this->typeflag = 'l'; - } else { - $this->typename = 'Directory'; - $this->typeflag = 'd'; - } - } - break; - } - - $this->flags = array($this->typeflag); - - // User - $this->flags[] = (($this->perms & 0400) ? 'r' : '-'); - $this->flags[] = (($this->perms & 0200) ? 'w' : '-'); - if ($this->perms & 0100) { - $this->flags[] = ($this->perms & 04000) ? 's' : 'x'; - } else { - $this->flags[] = ($this->perms & 04000) ? 'S' : '-'; - } - - // Group - $this->flags[] = (($this->perms & 0040) ? 'r' : '-'); - $this->flags[] = (($this->perms & 0020) ? 'w' : '-'); - if ($this->perms & 0010) { - $this->flags[] = ($this->perms & 02000) ? 's' : 'x'; - } else { - $this->flags[] = ($this->perms & 02000) ? 'S' : '-'; - } - - // Other - $this->flags[] = (($this->perms & 0004) ? 'r' : '-'); - $this->flags[] = (($this->perms & 0002) ? 'w' : '-'); - if ($this->perms & 0001) { - $this->flags[] = ($this->perms & 01000) ? 's' : 'x'; - } else { - $this->flags[] = ($this->perms & 01000) ? 'S' : '-'; - } - - $this->contents = \implode($this->flags).' '.$this->owner.' '.$this->group; - $this->contents .= ' '.$this->getSize().' '.$this->getMTime().' '; - - if ($this->is_link && $this->linktarget) { - $this->contents .= $this->path.' -> '.$this->linktarget; - } elseif (null !== $this->realpath && \strlen($this->realpath) < \strlen($this->path)) { - $this->contents .= $this->realpath; - } else { - $this->contents .= $this->path; - } - } - - public function getLabel() - { - return $this->typename.' ('.$this->getSize().')'; - } - - public function getSize() - { - if ($this->size) { - $size = Utils::getHumanReadableBytes($this->size); - - return \round($size['value'], 2).$size['unit']; - } - } - - public function getMTime() - { - $year = \date('Y', $this->mtime); - - if ($year !== \date('Y')) { - return \date('M d Y', $this->mtime); - } - - return \date('M d H:i', $this->mtime); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ResourceObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ResourceObject.php deleted file mode 100644 index a43f85d..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ResourceObject.php +++ /dev/null @@ -1,49 +0,0 @@ -resource_type) { - return $this->resource_type.' resource'; - } - - return 'resource'; - } - - public function transplant(BasicObject $old) - { - parent::transplant($old); - - if ($old instanceof self) { - $this->resource_type = $old->resource_type; - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/StreamObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/StreamObject.php deleted file mode 100644 index 358f274..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/StreamObject.php +++ /dev/null @@ -1,54 +0,0 @@ -stream_meta = $meta; - } - - public function getValueShort() - { - if (empty($this->stream_meta['uri'])) { - return; - } - - $uri = $this->stream_meta['uri']; - - if (\stream_is_local($uri)) { - return Kint::shortenPath($uri); - } - - return $uri; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ThrowableObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ThrowableObject.php deleted file mode 100644 index 2a86d57..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/ThrowableObject.php +++ /dev/null @@ -1,54 +0,0 @@ -message = $throw->getMessage(); - } - - public function getValueShort() - { - if (\strlen($this->message)) { - return '"'.$this->message.'"'; - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/TraceFrameObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/TraceFrameObject.php deleted file mode 100644 index 4259aee..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/TraceFrameObject.php +++ /dev/null @@ -1,100 +0,0 @@ -transplant($base); - - $this->trace = array( - 'function' => isset($raw_frame['function']) ? $raw_frame['function'] : null, - 'line' => isset($raw_frame['line']) ? $raw_frame['line'] : null, - 'file' => isset($raw_frame['file']) ? $raw_frame['file'] : null, - 'class' => isset($raw_frame['class']) ? $raw_frame['class'] : null, - 'type' => isset($raw_frame['type']) ? $raw_frame['type'] : null, - 'object' => null, - 'args' => null, - ); - - if ($this->trace['class'] && \method_exists($this->trace['class'], $this->trace['function'])) { - $func = new ReflectionMethod($this->trace['class'], $this->trace['function']); - $this->trace['function'] = new MethodObject($func); - } elseif (!$this->trace['class'] && \function_exists($this->trace['function'])) { - $func = new ReflectionFunction($this->trace['function']); - $this->trace['function'] = new MethodObject($func); - } - - foreach ($this->value->contents as $frame_prop) { - if ('object' === $frame_prop->name) { - $this->trace['object'] = $frame_prop; - $this->trace['object']->name = null; - $this->trace['object']->operator = BasicObject::OPERATOR_NONE; - } - if ('args' === $frame_prop->name) { - $this->trace['args'] = $frame_prop->value->contents; - - if ($this->trace['function'] instanceof MethodObject) { - foreach (\array_values($this->trace['function']->parameters) as $param) { - if (isset($this->trace['args'][$param->position])) { - $this->trace['args'][$param->position]->name = $param->getName(); - } - } - } - } - } - - $this->clearRepresentations(); - - if (isset($this->trace['file'], $this->trace['line']) && \is_readable($this->trace['file'])) { - $this->addRepresentation(new SourceRepresentation($this->trace['file'], $this->trace['line'])); - } - - if ($this->trace['args']) { - $args = new Representation('Arguments'); - $args->contents = $this->trace['args']; - $this->addRepresentation($args); - } - - if ($this->trace['object']) { - $callee = new Representation('object'); - $callee->label = 'Callee object ['.$this->trace['object']->classname.']'; - $callee->contents[] = $this->trace['object']; - $this->addRepresentation($callee); - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/TraceObject.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/TraceObject.php deleted file mode 100644 index a780b08..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Object/TraceObject.php +++ /dev/null @@ -1,45 +0,0 @@ -size) { - return 'empty'; - } - - return parent::getSize(); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ArrayObjectPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ArrayObjectPlugin.php deleted file mode 100644 index 286d255..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ArrayObjectPlugin.php +++ /dev/null @@ -1,63 +0,0 @@ -getFlags(); - - if (ArrayObject::STD_PROP_LIST === $flags) { - return; - } - - $var->setFlags(ArrayObject::STD_PROP_LIST); - - $o = $this->parser->parse($var, $o); - - $var->setFlags($flags); - - $this->parser->haltParse(); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/Base64Plugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/Base64Plugin.php deleted file mode 100644 index 3d7d6bc..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/Base64Plugin.php +++ /dev/null @@ -1,95 +0,0 @@ -depth = $o->depth + 1; - $base_obj->name = 'base64_decode('.$o->name.')'; - - if ($o->access_path) { - $base_obj->access_path = 'base64_decode('.$o->access_path.')'; - } - - $r = new Representation('Base64'); - $r->contents = $this->parser->parse($data, $base_obj); - - if (\strlen($var) > self::$min_length_soft) { - $o->addRepresentation($r, 0); - } else { - $o->addRepresentation($r); - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/BinaryPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/BinaryPlugin.php deleted file mode 100644 index 327c297..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/BinaryPlugin.php +++ /dev/null @@ -1,49 +0,0 @@ -encoding, array('ASCII', 'UTF-8'), true)) { - $o->value->hints[] = 'binary'; - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/BlacklistPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/BlacklistPlugin.php deleted file mode 100644 index b37e45f..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/BlacklistPlugin.php +++ /dev/null @@ -1,143 +0,0 @@ -parseObject($var, $o); - } - if (\is_array($var)) { - return $this->parseArray($var, $o); - } - } - - protected function parseObject(&$var, BasicObject &$o) - { - foreach (self::$blacklist as $class) { - if ($var instanceof $class) { - return $this->blacklistObject($var, $o); - } - } - - if ($o->depth <= 0) { - return; - } - - foreach (self::$shallow_blacklist as $class) { - if ($var instanceof $class) { - return $this->blacklistObject($var, $o); - } - } - } - - protected function blacklistObject(&$var, BasicObject &$o) - { - $object = new InstanceObject(); - $object->transplant($o); - $object->classname = \get_class($var); - $object->hash = \spl_object_hash($var); - $object->clearRepresentations(); - $object->value = null; - $object->size = null; - $object->hints[] = 'blacklist'; - - $o = $object; - - $this->parser->haltParse(); - } - - protected function parseArray(array &$var, BasicObject &$o) - { - if (\count($var) > self::$array_limit) { - return $this->blacklistArray($var, $o); - } - - if ($o->depth <= 0) { - return; - } - - if (\count($var) > self::$shallow_array_limit) { - return $this->blacklistArray($var, $o); - } - } - - protected function blacklistArray(array &$var, BasicObject &$o) - { - $object = new BasicObject(); - $object->transplant($o); - $object->value = null; - $object->size = \count($var); - $object->hints[] = 'blacklist'; - - $o = $object; - - $this->parser->haltParse(); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ClassMethodsPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ClassMethodsPlugin.php deleted file mode 100644 index e4c2371..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ClassMethodsPlugin.php +++ /dev/null @@ -1,113 +0,0 @@ -getMethods() as $method) { - $methods[] = new MethodObject($method); - } - - \usort($methods, array('Kint\\Parser\\ClassMethodsPlugin', 'sort')); - - self::$cache[$class] = $methods; - } - - if (!empty(self::$cache[$class])) { - $rep = new Representation('Available methods', 'methods'); - - // Can't cache access paths - foreach (self::$cache[$class] as $m) { - $method = clone $m; - $method->depth = $o->depth + 1; - - if (!$this->parser->childHasPath($o, $method)) { - $method->access_path = null; - } else { - $method->setAccessPathFrom($o); - } - - if ($method->owner_class !== $class && $ds = $method->getRepresentation('docstring')) { - $ds = clone $ds; - $ds->class = $method->owner_class; - $method->replaceRepresentation($ds); - } - - $rep->contents[] = $method; - } - - $o->addRepresentation($rep); - } - } - - private static function sort(MethodObject $a, MethodObject $b) - { - $sort = ((int) $a->static) - ((int) $b->static); - if ($sort) { - return $sort; - } - - $sort = BasicObject::sortByAccess($a, $b); - if ($sort) { - return $sort; - } - - $sort = InstanceObject::sortByHierarchy($a->owner_class, $b->owner_class); - if ($sort) { - return $sort; - } - - return $a->startline - $b->startline; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ClassStaticsPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ClassStaticsPlugin.php deleted file mode 100644 index 0ba58ca..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ClassStaticsPlugin.php +++ /dev/null @@ -1,122 +0,0 @@ -getConstants() as $name => $val) { - $const = BasicObject::blank($name, '\\'.$class.'::'.$name); - $const->const = true; - $const->depth = $o->depth + 1; - $const->owner_class = $class; - $const->operator = BasicObject::OPERATOR_STATIC; - $const = $this->parser->parse($val, $const); - - $consts[] = $const; - } - - self::$cache[$class] = $consts; - } - - $statics = new Representation('Static class properties', 'statics'); - $statics->contents = self::$cache[$class]; - - foreach ($reflection->getProperties(ReflectionProperty::IS_STATIC) as $static) { - $prop = new BasicObject(); - $prop->name = '$'.$static->getName(); - $prop->depth = $o->depth + 1; - $prop->static = true; - $prop->operator = BasicObject::OPERATOR_STATIC; - $prop->owner_class = $static->getDeclaringClass()->name; - - $prop->access = BasicObject::ACCESS_PUBLIC; - if ($static->isProtected()) { - $prop->access = BasicObject::ACCESS_PROTECTED; - } elseif ($static->isPrivate()) { - $prop->access = BasicObject::ACCESS_PRIVATE; - } - - if ($this->parser->childHasPath($o, $prop)) { - $prop->access_path = '\\'.$prop->owner_class.'::'.$prop->name; - } - - $static->setAccessible(true); - $static = $static->getValue(); - $statics->contents[] = $this->parser->parse($static, $prop); - } - - if (empty($statics->contents)) { - return; - } - - \usort($statics->contents, array('Kint\\Parser\\ClassStaticsPlugin', 'sort')); - - $o->addRepresentation($statics); - } - - private static function sort(BasicObject $a, BasicObject $b) - { - $sort = ((int) $a->const) - ((int) $b->const); - if ($sort) { - return $sort; - } - - $sort = BasicObject::sortByAccess($a, $b); - if ($sort) { - return $sort; - } - - return InstanceObject::sortByHierarchy($a->owner_class, $b->owner_class); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ClosurePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ClosurePlugin.php deleted file mode 100644 index 73e367b..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ClosurePlugin.php +++ /dev/null @@ -1,94 +0,0 @@ -transplant($o); - $o = $object; - $object->removeRepresentation('properties'); - - $closure = new ReflectionFunction($var); - - $o->filename = $closure->getFileName(); - $o->startline = $closure->getStartLine(); - - foreach ($closure->getParameters() as $param) { - $o->parameters[] = new ParameterObject($param); - } - - $p = new Representation('Parameters'); - $p->contents = &$o->parameters; - $o->addRepresentation($p, 0); - - $statics = array(); - - if (\method_exists($closure, 'getClosureThis') && $v = $closure->getClosureThis()) { - $statics = array('this' => $v); - } - - if (\count($statics = $statics + $closure->getStaticVariables())) { - $statics_parsed = array(); - - foreach ($statics as $name => &$static) { - $obj = BasicObject::blank('$'.$name); - $obj->depth = $o->depth + 1; - $statics_parsed[$name] = $this->parser->parse($static, $obj); - if (null === $statics_parsed[$name]->value) { - $statics_parsed[$name]->access_path = null; - } - } - - $r = new Representation('Uses'); - $r->contents = $statics_parsed; - $o->addRepresentation($r, 0); - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ColorPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ColorPlugin.php deleted file mode 100644 index 0d748f2..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ColorPlugin.php +++ /dev/null @@ -1,63 +0,0 @@ - 32) { - return; - } - - $trimmed = \strtolower(\trim($var)); - - if (!isset(ColorRepresentation::$color_map[$trimmed]) && !\preg_match('/^(?:(?:rgb|hsl)[^\\)]{6,}\\)|#[0-9a-fA-F]{3,8})$/', $trimmed)) { - return; - } - - $rep = new ColorRepresentation($var); - - if ($rep->variant) { - $o->removeRepresentation($o->value); - $o->addRepresentation($rep, 0); - $o->hints[] = 'color'; - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/DOMDocumentPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/DOMDocumentPlugin.php deleted file mode 100644 index ec08d31..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/DOMDocumentPlugin.php +++ /dev/null @@ -1,328 +0,0 @@ - 'DOMNode', - 'firstChild' => 'DOMNode', - 'lastChild' => 'DOMNode', - 'previousSibling' => 'DOMNode', - 'nextSibling' => 'DOMNode', - 'ownerDocument' => 'DOMDocument', - ); - - /** - * Show all properties and methods. - * - * @var bool - */ - public static $verbose = false; - - public function getTypes() - { - return array('object'); - } - - public function getTriggers() - { - return Parser::TRIGGER_SUCCESS; - } - - public function parse(&$var, BasicObject &$o, $trigger) - { - if (!$o instanceof InstanceObject) { - return; - } - - if ($var instanceof DOMNamedNodeMap || $var instanceof DOMNodeList) { - return $this->parseList($var, $o, $trigger); - } - - if ($var instanceof DOMNode) { - return $this->parseNode($var, $o); - } - } - - protected function parseList(&$var, InstanceObject &$o, $trigger) - { - // Recursion should never happen, should always be stopped at the parent - // DOMNode. Depth limit on the other hand we're going to skip since - // that would show an empty iterator and rather useless. Let the depth - // limit hit the children (DOMNodeList only has DOMNode as children) - if ($trigger & Parser::TRIGGER_RECURSION) { - return; - } - - $o->size = $var->length; - if (0 === $o->size) { - $o->replaceRepresentation(new Representation('Iterator')); - $o->size = null; - - return; - } - - // Depth limit - // Make empty iterator representation since we need it in DOMNode to point out depth limits - if ($this->parser->getDepthLimit() && $o->depth + 1 >= $this->parser->getDepthLimit()) { - $b = new BasicObject(); - $b->name = $o->classname.' Iterator Contents'; - $b->access_path = 'iterator_to_array('.$o->access_path.')'; - $b->depth = $o->depth + 1; - $b->hints[] = 'depth_limit'; - - $r = new Representation('Iterator'); - $r->contents = array($b); - $o->replaceRepresentation($r, 0); - - return; - } - - $data = \iterator_to_array($var); - - $r = new Representation('Iterator'); - $o->replaceRepresentation($r, 0); - - foreach ($data as $key => $item) { - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->name = $item->nodeName; - - if ($o->access_path) { - if ($var instanceof DOMNamedNodeMap) { - $base_obj->access_path = $o->access_path.'->getNamedItem('.\var_export($key, true).')'; - } elseif ($var instanceof DOMNodeList) { - $base_obj->access_path = $o->access_path.'->item('.\var_export($key, true).')'; - } else { - $base_obj->access_path = 'iterator_to_array('.$o->access_path.')'; - } - } - - $r->contents[] = $this->parser->parse($item, $base_obj); - } - } - - protected function parseNode(&$var, InstanceObject &$o) - { - // Fill the properties - // They can't be enumerated through reflection or casting, - // so we have to trust the docs and try them one at a time - $known_properties = array( - 'nodeValue', - 'childNodes', - 'attributes', - ); - - if (self::$verbose) { - $known_properties = array( - 'nodeName', - 'nodeValue', - 'nodeType', - 'parentNode', - 'childNodes', - 'firstChild', - 'lastChild', - 'previousSibling', - 'nextSibling', - 'attributes', - 'ownerDocument', - 'namespaceURI', - 'prefix', - 'localName', - 'baseURI', - 'textContent', - ); - } - - $childNodes = array(); - $attributes = array(); - - $rep = $o->value; - - foreach ($known_properties as $prop) { - $prop_obj = $this->parseProperty($o, $prop, $var); - $rep->contents[] = $prop_obj; - - if ('childNodes' === $prop) { - $childNodes = $prop_obj->getRepresentation('iterator'); - } elseif ('attributes' === $prop) { - $attributes = $prop_obj->getRepresentation('iterator'); - } - } - - if (!self::$verbose) { - $o->removeRepresentation('methods'); - $o->removeRepresentation('properties'); - } - - // Attributes and comments and text nodes don't - // need children or attributes of their own - if (\in_array($o->classname, array('DOMAttr', 'DOMText', 'DOMComment'), true)) { - return; - } - - // Set the attributes - if ($attributes) { - $a = new Representation('Attributes'); - foreach ($attributes->contents as $attribute) { - $a->contents[] = self::textualNodeToString($attribute); - } - $o->addRepresentation($a, 0); - } - - // Set the children - if ($childNodes) { - $c = new Representation('Children'); - - if (1 === \count($childNodes->contents) && ($node = \reset($childNodes->contents)) && \in_array('depth_limit', $node->hints, true)) { - $n = new InstanceObject(); - $n->transplant($node); - $n->name = 'childNodes'; - $n->classname = 'DOMNodeList'; - $c->contents = array($n); - } else { - foreach ($childNodes->contents as $index => $node) { - // Shortcircuit text nodes to plain strings - if ('DOMText' === $node->classname || 'DOMComment' === $node->classname) { - $node = self::textualNodeToString($node); - - // And remove them if they're empty - if (\ctype_space($node->value->contents) || '' === $node->value->contents) { - continue; - } - } - - $c->contents[] = $node; - } - } - - $o->addRepresentation($c, 0); - } - - if (isset($c) && \count($c->contents)) { - $o->size = \count($c->contents); - } - - if (!$o->size) { - $o->size = null; - } - } - - protected function parseProperty(InstanceObject $o, $prop, &$var) - { - // Duplicating (And slightly optimizing) the Parser::parseObject() code here - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->owner_class = $o->classname; - $base_obj->name = $prop; - $base_obj->operator = BasicObject::OPERATOR_OBJECT; - $base_obj->access = BasicObject::ACCESS_PUBLIC; - - if (null !== $o->access_path) { - $base_obj->access_path = $o->access_path; - - if (\preg_match('/^[A-Za-z0-9_]+$/', $base_obj->name)) { - $base_obj->access_path .= '->'.$base_obj->name; - } else { - $base_obj->access_path .= '->{'.\var_export($base_obj->name, true).'}'; - } - } - - if (!isset($var->{$prop})) { - $base_obj->type = 'null'; - } elseif (isset(self::$blacklist[$prop])) { - $b = new InstanceObject(); - $b->transplant($base_obj); - $base_obj = $b; - - $base_obj->hints[] = 'blacklist'; - $base_obj->classname = self::$blacklist[$prop]; - } elseif ('attributes' === $prop) { - $base_obj = $this->parser->parseDeep($var->{$prop}, $base_obj); - } else { - $base_obj = $this->parser->parse($var->{$prop}, $base_obj); - } - - return $base_obj; - } - - protected static function textualNodeToString(InstanceObject $o) - { - if (empty($o->value) || empty($o->value->contents) || empty($o->classname)) { - return; - } - - if (!\in_array($o->classname, array('DOMText', 'DOMAttr', 'DOMComment'), true)) { - return; - } - - foreach ($o->value->contents as $property) { - if ('nodeValue' === $property->name) { - $ret = clone $property; - $ret->name = $o->name; - - return $ret; - } - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/DateTimePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/DateTimePlugin.php deleted file mode 100644 index f2cebb6..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/DateTimePlugin.php +++ /dev/null @@ -1,55 +0,0 @@ -transplant($o); - - $o = $object; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/FsPathPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/FsPathPlugin.php deleted file mode 100644 index 3a8d1e0..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/FsPathPlugin.php +++ /dev/null @@ -1,72 +0,0 @@ - 2048) { - return; - } - - if (!\preg_match('/[\\/\\'.DIRECTORY_SEPARATOR.']/', $var)) { - return; - } - - if (\preg_match('/[?<>"*|]/', $var)) { - return; - } - - if (!@\file_exists($var)) { - return; - } - - if (\in_array($var, self::$blacklist, true)) { - return; - } - - $r = new SplFileInfoRepresentation(new SplFileInfo($var)); - $r->hints[] = 'fspath'; - $o->addRepresentation($r, 0); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/IteratorPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/IteratorPlugin.php deleted file mode 100644 index 0487a38..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/IteratorPlugin.php +++ /dev/null @@ -1,110 +0,0 @@ -name = $class.' Iterator Contents'; - $b->access_path = 'iterator_to_array('.$o->access_path.', true)'; - $b->depth = $o->depth + 1; - $b->hints[] = 'blacklist'; - - $r = new Representation('Iterator'); - $r->contents = array($b); - - $o->addRepresentation($r); - - return; - } - } - - /** @var array|false */ - $data = \iterator_to_array($var); - - if (false === $data) { - return; - } - - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth; - - if ($o->access_path) { - $base_obj->access_path = 'iterator_to_array('.$o->access_path.')'; - } - - $r = new Representation('Iterator'); - $r->contents = $this->parser->parse($data, $base_obj); - $r->contents = $r->contents->value->contents; - - $primary = $o->getRepresentations(); - $primary = \reset($primary); - if ($primary && $primary === $o->value && $primary->contents === array()) { - $o->addRepresentation($r, 0); - } else { - $o->addRepresentation($r); - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/JsonPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/JsonPlugin.php deleted file mode 100644 index 84b2519..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/JsonPlugin.php +++ /dev/null @@ -1,73 +0,0 @@ -depth = $o->depth; - - if ($o->access_path) { - $base_obj->access_path = 'json_decode('.$o->access_path.', true)'; - } - - $r = new Representation('Json'); - $r->contents = $this->parser->parse($json, $base_obj); - - if (!\in_array('depth_limit', $r->contents->hints, true)) { - $r->contents = $r->contents->value->contents; - } - - $o->addRepresentation($r, 0); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/MicrotimePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/MicrotimePlugin.php deleted file mode 100644 index 5062b59..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/MicrotimePlugin.php +++ /dev/null @@ -1,105 +0,0 @@ -depth) { - return; - } - - if (\is_string($var)) { - if ('microtime()' !== $o->name || !\preg_match('/^0\\.[0-9]{8} [0-9]{10}$/', $var)) { - return; - } - - $usec = (int) \substr($var, 2, 6); - $sec = (int) \substr($var, 11, 10); - } else { - if ('microtime(...)' !== $o->name) { - return; - } - - $sec = \floor($var); - $usec = $var - $sec; - $usec = \floor($usec * 1000000); - } - - $time = $sec + ($usec / 1000000); - - if (null !== self::$last) { - $last_time = self::$last[0] + (self::$last[1] / 1000000); - $lap = $time - $last_time; - ++self::$times; - } else { - $lap = null; - self::$start = $time; - } - - self::$last = array($sec, $usec); - - if (null !== $lap) { - $total = $time - self::$start; - $r = new MicrotimeRepresentation($sec, $usec, self::$group, $lap, $total, self::$times); - } else { - $r = new MicrotimeRepresentation($sec, $usec, self::$group); - } - $r->contents = $var; - $r->implicit_label = true; - - $o->removeRepresentation($o->value); - $o->addRepresentation($r); - $o->hints[] = 'microtime'; - } - - public static function clean() - { - self::$last = null; - self::$start = null; - self::$times = 0; - ++self::$group; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/MysqliPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/MysqliPlugin.php deleted file mode 100644 index 265299b..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/MysqliPlugin.php +++ /dev/null @@ -1,129 +0,0 @@ - true, - 'connect_errno' => true, - 'connect_error' => true, - ); - - // These are readable on empty mysqli objects, but not on failed connections - protected $empty_readable = array( - 'client_info' => true, - 'errno' => true, - 'error' => true, - ); - - // These are only readable on connected mysqli objects - protected $connected_readable = array( - 'affected_rows' => true, - 'error_list' => true, - 'field_count' => true, - 'host_info' => true, - 'info' => true, - 'insert_id' => true, - 'server_info' => true, - 'server_version' => true, - 'stat' => true, - 'sqlstate' => true, - 'protocol_version' => true, - 'thread_id' => true, - 'warning_count' => true, - ); - - public function getTypes() - { - return array('object'); - } - - public function getTriggers() - { - return Parser::TRIGGER_COMPLETE; - } - - public function parse(&$var, BasicObject &$o, $trigger) - { - if (!$var instanceof Mysqli) { - return; - } - - $connected = false; - $empty = false; - - if (\is_string(@$var->sqlstate)) { - $connected = true; - } elseif (\is_string(@$var->client_info)) { - $empty = true; - } - - foreach ($o->value->contents as $key => $obj) { - if (isset($this->connected_readable[$obj->name])) { - if (!$connected) { - continue; - } - } elseif (isset($this->empty_readable[$obj->name])) { - if (!$connected && !$empty) { - continue; - } - } elseif (!isset($this->always_readable[$obj->name])) { - continue; - } - - if ('null' !== $obj->type) { - continue; - } - - $param = $var->{$obj->name}; - - if (null === $param) { - continue; - } - - $base = BasicObject::blank($obj->name, $obj->access_path); - - $base->depth = $obj->depth; - $base->owner_class = $obj->owner_class; - $base->operator = $obj->operator; - $base->access = $obj->access; - $base->reference = $obj->reference; - - $o->value->contents[$key] = $this->parser->parse($param, $base); - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/Parser.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/Parser.php deleted file mode 100644 index b7f81c6..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/Parser.php +++ /dev/null @@ -1,604 +0,0 @@ -marker = \uniqid("kint\0", true); - - $this->caller_class = $caller; - - if ($depth_limit) { - $this->depth_limit = $depth_limit; - } - } - - /** - * Set the caller class. - * - * @param null|string $caller Caller class name - */ - public function setCallerClass($caller = null) - { - $this->noRecurseCall(); - - $this->caller_class = $caller; - } - - public function getCallerClass() - { - return $this->caller_class; - } - - /** - * Set the depth limit. - * - * @param false|int $depth_limit Maximum depth to parse data - */ - public function setDepthLimit($depth_limit = false) - { - $this->noRecurseCall(); - - $this->depth_limit = $depth_limit; - } - - public function getDepthLimit() - { - return $this->depth_limit; - } - - /** - * Disables the depth limit and parses a variable. - * - * This should not be used unless you know what you're doing! - * - * @param mixed $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - public function parseDeep(&$var, BasicObject $o) - { - $depth_limit = $this->depth_limit; - $this->depth_limit = false; - - $out = $this->parse($var, $o); - - $this->depth_limit = $depth_limit; - - return $out; - } - - /** - * Parses a variable into a Kint object structure. - * - * @param mixed $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - public function parse(&$var, BasicObject $o) - { - $o->type = \strtolower(\gettype($var)); - - if (!$this->applyPlugins($var, $o, self::TRIGGER_BEGIN)) { - return $o; - } - - switch ($o->type) { - case 'array': - return $this->parseArray($var, $o); - case 'boolean': - case 'double': - case 'integer': - case 'null': - return $this->parseGeneric($var, $o); - case 'object': - return $this->parseObject($var, $o); - case 'resource': - return $this->parseResource($var, $o); - case 'string': - return $this->parseString($var, $o); - default: - return $this->parseUnknown($var, $o); - } - } - - public function addPlugin(Plugin $p) - { - if (!$types = $p->getTypes()) { - return false; - } - - if (!$triggers = $p->getTriggers()) { - return false; - } - - $p->setParser($this); - - foreach ($types as $type) { - if (!isset($this->plugins[$type])) { - $this->plugins[$type] = array( - self::TRIGGER_BEGIN => array(), - self::TRIGGER_SUCCESS => array(), - self::TRIGGER_RECURSION => array(), - self::TRIGGER_DEPTH_LIMIT => array(), - ); - } - - foreach ($this->plugins[$type] as $trigger => &$pool) { - if ($triggers & $trigger) { - $pool[] = $p; - } - } - } - - return true; - } - - public function clearPlugins() - { - $this->plugins = array(); - } - - public function haltParse() - { - $this->parse_break = true; - } - - public function childHasPath(InstanceObject $parent, BasicObject $child) - { - if ('object' === $parent->type && (null !== $parent->access_path || $child->static || $child->const)) { - if (BasicObject::ACCESS_PUBLIC === $child->access) { - return true; - } - - if (BasicObject::ACCESS_PRIVATE === $child->access && $this->caller_class) { - if ($this->caller_class === $child->owner_class) { - return true; - } - } elseif (BasicObject::ACCESS_PROTECTED === $child->access && $this->caller_class) { - if ($this->caller_class === $child->owner_class) { - return true; - } - - if (\is_subclass_of($this->caller_class, $child->owner_class)) { - return true; - } - - if (\is_subclass_of($child->owner_class, $this->caller_class)) { - return true; - } - } - } - - return false; - } - - /** - * Returns an array without the recursion marker in it. - * - * DO NOT pass an array that has had it's marker removed back - * into the parser, it will result in an extra recursion - * - * @param array $array Array potentially containing a recursion marker - * - * @return array Array with recursion marker removed - */ - public function getCleanArray(array $array) - { - unset($array[$this->marker]); - - return $array; - } - - protected function noRecurseCall() - { - $bt = \debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS); - - $caller_frame = array( - 'function' => __FUNCTION__, - ); - - while (isset($bt[0]['object']) && $bt[0]['object'] === $this) { - $caller_frame = \array_shift($bt); - } - - foreach ($bt as $frame) { - if (isset($frame['object']) && $frame['object'] === $this) { - throw new DomainException(__CLASS__.'::'.$caller_frame['function'].' cannot be called from inside a parse'); - } - } - } - - private function parseGeneric(&$var, BasicObject $o) - { - $rep = new Representation('Contents'); - $rep->contents = $var; - $rep->implicit_label = true; - $o->addRepresentation($rep); - $o->value = $rep; - - $this->applyPlugins($var, $o, self::TRIGGER_SUCCESS); - - return $o; - } - - /** - * Parses a string into a Kint BlobObject structure. - * - * @param string $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - private function parseString(&$var, BasicObject $o) - { - $string = new BlobObject(); - $string->transplant($o); - $string->encoding = BlobObject::detectEncoding($var); - $string->size = BlobObject::strlen($var, $string->encoding); - - $rep = new Representation('Contents'); - $rep->contents = $var; - $rep->implicit_label = true; - - $string->addRepresentation($rep); - $string->value = $rep; - - $this->applyPlugins($var, $string, self::TRIGGER_SUCCESS); - - return $string; - } - - /** - * Parses an array into a Kint object structure. - * - * @param array $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - private function parseArray(array &$var, BasicObject $o) - { - $array = new BasicObject(); - $array->transplant($o); - $array->size = \count($var); - - if (isset($var[$this->marker])) { - --$array->size; - $array->hints[] = 'recursion'; - - $this->applyPlugins($var, $array, self::TRIGGER_RECURSION); - - return $array; - } - - $rep = new Representation('Contents'); - $rep->implicit_label = true; - $array->addRepresentation($rep); - $array->value = $rep; - - if (!$array->size) { - $this->applyPlugins($var, $array, self::TRIGGER_SUCCESS); - - return $array; - } - - if ($this->depth_limit && $o->depth >= $this->depth_limit) { - $array->hints[] = 'depth_limit'; - - $this->applyPlugins($var, $array, self::TRIGGER_DEPTH_LIMIT); - - return $array; - } - - $copy = \array_values($var); - - // It's really really hard to access numeric string keys in arrays, - // and it's really really hard to access integer properties in - // objects, so we just use array_values and index by counter to get - // at it reliably for reference testing. This also affects access - // paths since it's pretty much impossible to access these things - // without complicated stuff you should never need to do. - $i = 0; - - // Set the marker for recursion - $var[$this->marker] = $array->depth; - - $refmarker = new stdClass(); - - foreach ($var as $key => &$val) { - if ($key === $this->marker) { - continue; - } - - $child = new BasicObject(); - $child->name = $key; - $child->depth = $array->depth + 1; - $child->access = BasicObject::ACCESS_NONE; - $child->operator = BasicObject::OPERATOR_ARRAY; - - if (null !== $array->access_path) { - if (\is_string($key) && (string) (int) $key === $key) { - $child->access_path = 'array_values('.$array->access_path.')['.$i.']'; // @codeCoverageIgnore - } else { - $child->access_path = $array->access_path.'['.\var_export($key, true).']'; - } - } - - $stash = $val; - $copy[$i] = $refmarker; - if ($val === $refmarker) { - $child->reference = true; - $val = $stash; - } - - $rep->contents[] = $this->parse($val, $child); - ++$i; - } - - $this->applyPlugins($var, $array, self::TRIGGER_SUCCESS); - unset($var[$this->marker]); - - return $array; - } - - /** - * Parses an object into a Kint InstanceObject structure. - * - * @param object $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - private function parseObject(&$var, BasicObject $o) - { - $hash = \spl_object_hash($var); - $values = (array) $var; - - $object = new InstanceObject(); - $object->transplant($o); - $object->classname = \get_class($var); - $object->hash = $hash; - $object->size = \count($values); - - if (isset($this->object_hashes[$hash])) { - $object->hints[] = 'recursion'; - - $this->applyPlugins($var, $object, self::TRIGGER_RECURSION); - - return $object; - } - - $this->object_hashes[$hash] = $object; - - if ($this->depth_limit && $o->depth >= $this->depth_limit) { - $object->hints[] = 'depth_limit'; - - $this->applyPlugins($var, $object, self::TRIGGER_DEPTH_LIMIT); - unset($this->object_hashes[$hash]); - - return $object; - } - - $reflector = new ReflectionObject($var); - - if ($reflector->isUserDefined()) { - $object->filename = $reflector->getFileName(); - $object->startline = $reflector->getStartLine(); - } - - $rep = new Representation('Properties'); - - $copy = \array_values($values); - $refmarker = new stdClass(); - $i = 0; - - // Reflection will not show parent classes private properties, and if a - // property was unset it will happly trigger a notice looking for it. - foreach ($values as $key => &$val) { - // Casting object to array: - // private properties show in the form "\0$owner_class_name\0$property_name"; - // protected properties show in the form "\0*\0$property_name"; - // public properties show in the form "$property_name"; - // http://www.php.net/manual/en/language.types.array.php#language.types.array.casting - - $child = new BasicObject(); - $child->depth = $object->depth + 1; - $child->owner_class = $object->classname; - $child->operator = BasicObject::OPERATOR_OBJECT; - $child->access = BasicObject::ACCESS_PUBLIC; - - $split_key = \explode("\0", $key, 3); - - if (3 === \count($split_key) && '' === $split_key[0]) { - $child->name = $split_key[2]; - if ('*' === $split_key[1]) { - $child->access = BasicObject::ACCESS_PROTECTED; - } else { - $child->access = BasicObject::ACCESS_PRIVATE; - $child->owner_class = $split_key[1]; - } - } elseif (KINT_PHP72) { - $child->name = (string) $key; - } else { - $child->name = $key; // @codeCoverageIgnore - } - - if ($this->childHasPath($object, $child)) { - $child->access_path = $object->access_path; - - if (!KINT_PHP72 && \is_int($child->name)) { - $child->access_path = 'array_values((array) '.$child->access_path.')['.$i.']'; // @codeCoverageIgnore - } elseif (\preg_match('/^[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*$/', $child->name)) { - $child->access_path .= '->'.$child->name; - } else { - $child->access_path .= '->{'.\var_export((string) $child->name, true).'}'; - } - } - - $stash = $val; - $copy[$i] = $refmarker; - if ($val === $refmarker) { - $child->reference = true; - $val = $stash; - } - - $rep->contents[] = $this->parse($val, $child); - ++$i; - } - - $object->addRepresentation($rep); - $object->value = $rep; - $this->applyPlugins($var, $object, self::TRIGGER_SUCCESS); - unset($this->object_hashes[$hash]); - - return $object; - } - - /** - * Parses a resource into a Kint ResourceObject structure. - * - * @param resource $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - private function parseResource(&$var, BasicObject $o) - { - $resource = new ResourceObject(); - $resource->transplant($o); - $resource->resource_type = \get_resource_type($var); - - $this->applyPlugins($var, $resource, self::TRIGGER_SUCCESS); - - return $resource; - } - - /** - * Parses an unknown into a Kint object structure. - * - * @param mixed $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - private function parseUnknown(&$var, BasicObject $o) - { - $o->type = 'unknown'; - $this->applyPlugins($var, $o, self::TRIGGER_SUCCESS); - - return $o; - } - - /** - * Applies plugins for an object type. - * - * @param mixed $var variable - * @param BasicObject $o Kint object parsed so far - * @param int $trigger The trigger to check for the plugins - * - * @return bool Continue parsing - */ - private function applyPlugins(&$var, BasicObject &$o, $trigger) - { - $break_stash = $this->parse_break; - - /** @var bool Psalm bug workaround */ - $this->parse_break = false; - - $plugins = array(); - - if (isset($this->plugins[$o->type][$trigger])) { - $plugins = $this->plugins[$o->type][$trigger]; - } - - foreach ($plugins as $plugin) { - try { - $plugin->parse($var, $o, $trigger); - } catch (Exception $e) { - \trigger_error( - 'An exception ('.\get_class($e).') was thrown in '.$e->getFile().' on line '.$e->getLine().' while executing Kint Parser Plugin "'.\get_class($plugin).'". Error message: '.$e->getMessage(), - E_USER_WARNING - ); - } - - if ($this->parse_break) { - $this->parse_break = $break_stash; - - return false; - } - } - - $this->parse_break = $break_stash; - - return true; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/Plugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/Plugin.php deleted file mode 100644 index 51d5f0b..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/Plugin.php +++ /dev/null @@ -1,55 +0,0 @@ -parser = $p; - } - - /** - * An array of types (As returned by gettype) for all data this plugin can operate on. - * - * @return array List of types - */ - public function getTypes() - { - return array(); - } - - public function getTriggers() - { - return Parser::TRIGGER_NONE; - } - - abstract public function parse(&$variable, BasicObject &$o, $trigger); -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ProxyPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ProxyPlugin.php deleted file mode 100644 index 3376d3a..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ProxyPlugin.php +++ /dev/null @@ -1,66 +0,0 @@ -types = $types; - $this->triggers = $triggers; - $this->callback = $callback; - } - - public function getTypes() - { - return $this->types; - } - - public function getTriggers() - { - return $this->triggers; - } - - public function parse(&$var, BasicObject &$o, $trigger) - { - return \call_user_func_array($this->callback, array(&$var, &$o, $trigger, $this->parser)); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SerializePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SerializePlugin.php deleted file mode 100644 index c5dadb8..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SerializePlugin.php +++ /dev/null @@ -1,108 +0,0 @@ - Unserialization can result in code being loaded and executed due to - * > object instantiation and autoloading, and a malicious user may be able - * > to exploit this. - * - * The natural way to stop that from happening is to just refuse to unserialize - * stuff by default. Which is what we're doing for anything that's not scalar. - * - * @var bool - */ - public static $safe_mode = true; - public static $options = array(true); - - public function getTypes() - { - return array('string'); - } - - public function getTriggers() - { - return Parser::TRIGGER_SUCCESS; - } - - public function parse(&$var, BasicObject &$o, $trigger) - { - $trimmed = \rtrim($var); - - if ('N;' !== $trimmed && !\preg_match('/^(?:[COabis]:\\d+[:;]|d:\\d+(?:\\.\\d+);)/', $trimmed)) { - return; - } - - if (!self::$safe_mode || !\in_array($trimmed[0], array('C', 'O', 'a'), true)) { - // Second parameter only supported on PHP 7 - if (KINT_PHP70) { - // Suppress warnings on unserializeable variable - $data = @\unserialize($trimmed, self::$options); - } else { - $data = @\unserialize($trimmed); - } - - if (false === $data && 'b:0;' !== \substr($trimmed, 0, 4)) { - return; - } - } - - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->name = 'unserialize('.$o->name.')'; - - if ($o->access_path) { - $base_obj->access_path = 'unserialize('.$o->access_path; - if (!KINT_PHP70 || self::$options === array(true)) { - $base_obj->access_path .= ')'; - } elseif (self::$options === array(false)) { - $base_obj->access_path .= ', false)'; - } else { - $base_obj->access_path .= ', Serialize::$options)'; - } - } - - $r = new Representation('Serialized'); - - if (isset($data)) { - $r->contents = $this->parser->parse($data, $base_obj); - } else { - $base_obj->hints[] = 'blacklist'; - $r->contents = $base_obj; - } - - $o->addRepresentation($r, 0); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SimpleXMLElementPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SimpleXMLElementPlugin.php deleted file mode 100644 index b90c863..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SimpleXMLElementPlugin.php +++ /dev/null @@ -1,154 +0,0 @@ -hints[] = 'simplexml_element'; - - if (!self::$verbose) { - $o->removeRepresentation('properties'); - $o->removeRepresentation('iterator'); - $o->removeRepresentation('methods'); - } - - // Attributes - $a = new Representation('Attributes'); - - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth; - - if ($o->access_path) { - $base_obj->access_path = '(string) '.$o->access_path; - } - - if ($attribs = $var->attributes()) { - $attribs = \iterator_to_array($attribs); - $attribs = \array_map('strval', $attribs); - } else { - $attribs = array(); - } - - // XML attributes are by definition strings and don't have children, - // so up the depth limit in case we're just below the limit since - // there won't be any recursive stuff anyway. - $a->contents = $this->parser->parseDeep($attribs, $base_obj)->value->contents; - - $o->addRepresentation($a, 0); - - // Children - // We need to check children() separately from the values we already parsed because - // text contents won't show up in children() but they will show up in properties. - // - // Why do we still need to check for attributes if we already have an attributes() - // method? Hell if I know! - $children = $var->children(); - - if ($o->value) { - $c = new Representation('Children'); - - foreach ($o->value->contents as $value) { - if ('@attributes' === $value->name) { - continue; - } - - if (isset($children->{$value->name})) { - $i = 0; - - while (isset($children->{$value->name}[$i])) { - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->name = $value->name; - if ($value->access_path) { - $base_obj->access_path = $value->access_path.'['.$i.']'; - } - - $value = $this->parser->parse($children->{$value->name}[$i], $base_obj); - - if ($value->access_path && 'string' === $value->type) { - $value->access_path = '(string) '.$value->access_path; - } - - $c->contents[] = $value; - - ++$i; - } - } - } - - $o->size = \count($c->contents); - - if (!$o->size) { - $o->size = null; - - if (\strlen((string) $var)) { - $base_obj = new BlobObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->name = $o->name; - if ($o->access_path) { - $base_obj->access_path = '(string) '.$o->access_path; - } - - $value = (string) $var; - - $c = new Representation('Contents'); - $c->implicit_label = true; - $c->contents = array($this->parser->parseDeep($value, $base_obj)); - } - } - - $o->addRepresentation($c, 0); - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SplFileInfoPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SplFileInfoPlugin.php deleted file mode 100644 index 8b72193..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SplFileInfoPlugin.php +++ /dev/null @@ -1,55 +0,0 @@ -addRepresentation($r, 0); - $o->size = $r->getSize(); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SplObjectStoragePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SplObjectStoragePlugin.php deleted file mode 100644 index 03ff301..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/SplObjectStoragePlugin.php +++ /dev/null @@ -1,54 +0,0 @@ -getRepresentation('iterator'))) { - return; - } - - $r = $o->getRepresentation('iterator'); - if ($r) { - $o->size = !\is_array($r->contents) ? null : \count($r->contents); - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/StreamPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/StreamPlugin.php deleted file mode 100644 index 464a3ff..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/StreamPlugin.php +++ /dev/null @@ -1,78 +0,0 @@ -resource_type) { - return; - } - - if (!$meta = \stream_get_meta_data($var)) { - return; - } - - $rep = new Representation('Stream'); - $rep->implicit_label = true; - - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth; - - if ($o->access_path) { - $base_obj->access_path = 'stream_get_meta_data('.$o->access_path.')'; - } - - $rep->contents = $this->parser->parse($meta, $base_obj); - - if (!\in_array('depth_limit', $rep->contents->hints, true)) { - $rep->contents = $rep->contents->value->contents; - } - - $o->addRepresentation($rep, 0); - $o->value = $rep; - - $stream = new StreamObject($meta); - $stream->transplant($o); - $o = $stream; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/TablePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/TablePlugin.php deleted file mode 100644 index 510c4ff..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/TablePlugin.php +++ /dev/null @@ -1,87 +0,0 @@ -value->contents)) { - return; - } - - $array = $this->parser->getCleanArray($var); - - if (\count($array) < 2) { - return; - } - - // Ensure this is an array of arrays and that all child arrays have the - // same keys. We don't care about their children - if there's another - // "table" inside we'll just make another one down the value tab - $keys = null; - foreach ($array as $elem) { - if (!\is_array($elem) || \count($elem) < 2) { - return; - } - - if (null === $keys) { - $keys = \array_keys($elem); - } elseif (\array_keys($elem) !== $keys) { - return; - } - } - - // Ensure none of the child arrays are recursion or depth limit. We - // don't care if their children are since they are the table cells - foreach ($o->value->contents as $childarray) { - if (empty($childarray->value->contents)) { - return; - } - } - - // Objects by reference for the win! We can do a copy-paste of the value - // representation contents and just slap a new hint on there and hey - // presto we have our table representation with no extra memory used! - $table = new Representation('Table'); - $table->contents = $o->value->contents; - $table->hints[] = 'table'; - $o->addRepresentation($table, 0); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ThrowablePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ThrowablePlugin.php deleted file mode 100644 index 8490d1d..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ThrowablePlugin.php +++ /dev/null @@ -1,60 +0,0 @@ -transplant($o); - $r = new SourceRepresentation($var->getFile(), $var->getLine()); - $r->showfilename = true; - $throw->addRepresentation($r, 0); - - $o = $throw; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/TimestampPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/TimestampPlugin.php deleted file mode 100644 index 72958d6..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/TimestampPlugin.php +++ /dev/null @@ -1,71 +0,0 @@ -value->label = 'Timestamp'; - $o->value->hints[] = 'timestamp'; - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ToStringPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ToStringPlugin.php deleted file mode 100644 index 8b7a65f..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/ToStringPlugin.php +++ /dev/null @@ -1,67 +0,0 @@ -hasMethod('__toString')) { - return; - } - - foreach (self::$blacklist as $class) { - if ($var instanceof $class) { - return; - } - } - - $r = new Representation('toString'); - $r->contents = (string) $var; - - $o->addRepresentation($r); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/TracePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/TracePlugin.php deleted file mode 100644 index 3554993..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/TracePlugin.php +++ /dev/null @@ -1,92 +0,0 @@ -value) { - return; - } - - $trace = $this->parser->getCleanArray($var); - - if (\count($trace) !== \count($o->value->contents) || !Utils::isTrace($trace)) { - return; - } - - $traceobj = new TraceObject(); - $traceobj->transplant($o); - $rep = $traceobj->value; - - $old_trace = $rep->contents; - - Utils::normalizeAliases(self::$blacklist); - - $rep->contents = array(); - - foreach ($old_trace as $frame) { - $index = $frame->name; - - if (!isset($trace[$index]['function'])) { - // Something's very very wrong here, but it's probably a plugin's fault - continue; - } - - if (Utils::traceFrameIsListed($trace[$index], self::$blacklist)) { - continue; - } - - $rep->contents[$index] = new TraceFrameObject($frame, $trace[$index]); - } - - \ksort($rep->contents); - $rep->contents = \array_values($rep->contents); - - $traceobj->clearRepresentations(); - $traceobj->addRepresentation($rep); - $traceobj->size = \count($rep->contents); - $o = $traceobj; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/XmlPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/XmlPlugin.php deleted file mode 100644 index 0947e9a..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Parser/XmlPlugin.php +++ /dev/null @@ -1,150 +0,0 @@ -access_path); - - if (empty($xml)) { - return; - } - - list($xml, $access_path, $name) = $xml; - - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->name = $name; - $base_obj->access_path = $access_path; - - $r = new Representation('XML'); - $r->contents = $this->parser->parse($xml, $base_obj); - - $o->addRepresentation($r, 0); - } - - protected static function xmlToSimpleXML($var, $parent_path) - { - try { - $errors = \libxml_use_internal_errors(true); - $xml = \simplexml_load_string($var); - \libxml_use_internal_errors($errors); - } catch (Exception $e) { - if (isset($errors)) { - \libxml_use_internal_errors($errors); - } - - return; - } - - if (!$xml) { - return; - } - - if (null === $parent_path) { - $access_path = null; - } else { - $access_path = 'simplexml_load_string('.$parent_path.')'; - } - - $name = $xml->getName(); - - return array($xml, $access_path, $name); - } - - /** - * Get the DOMDocument info. - * - * The documentation of DOMDocument::loadXML() states that while you can - * call it statically, it will give an E_STRICT warning. On my system it - * actually gives an E_DEPRECATED warning, but it works so we'll just add - * an error-silencing '@' to the access path. - * - * If it errors loading then we wouldn't have gotten this far in the first place. - * - * @param string $var The XML string - * @param null|string $parent_path The path to the parent, in this case the XML string - * - * @return null|array The root element DOMNode, the access path, and the root element name - */ - protected static function xmlToDOMDocument($var, $parent_path) - { - // There's no way to check validity in DOMDocument without making errors. For shame! - if (!self::xmlToSimpleXML($var, $parent_path)) { - return null; - } - - $xml = new DOMDocument(); - $xml->loadXML($var); - $xml = $xml->firstChild; - - if (null === $parent_path) { - $access_path = null; - } else { - $access_path = '@\\DOMDocument::loadXML('.$parent_path.')->firstChild'; - } - - $name = $xml->nodeName; - - return array($xml, $access_path, $name); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/CliRenderer.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/CliRenderer.php deleted file mode 100644 index 0d0846a..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/CliRenderer.php +++ /dev/null @@ -1,152 +0,0 @@ -windows_output = KINT_WIN; - } - - if (!self::$terminal_width) { - if (!KINT_WIN && self::$detect_width) { - self::$terminal_width = \exec('tput cols'); - } - - if (self::$terminal_width < self::$min_terminal_width) { - self::$terminal_width = self::$default_width; - } - } - - $this->colors = $this->windows_output ? false : self::$cli_colors; - - $this->header_width = self::$terminal_width; - } - - public function colorValue($string) - { - if (!$this->colors) { - return $string; - } - - return "\x1b[32m".\str_replace("\n", "\x1b[0m\n\x1b[32m", $string)."\x1b[0m"; - } - - public function colorType($string) - { - if (!$this->colors) { - return $string; - } - - return "\x1b[35;1m".\str_replace("\n", "\x1b[0m\n\x1b[35;1m", $string)."\x1b[0m"; - } - - public function colorTitle($string) - { - if (!$this->colors) { - return $string; - } - - return "\x1b[36m".\str_replace("\n", "\x1b[0m\n\x1b[36m", $string)."\x1b[0m"; - } - - public function renderTitle(BasicObject $o) - { - if ($this->windows_output) { - return $this->utf8ToWindows(parent::renderTitle($o)); - } - - return parent::renderTitle($o); - } - - public function preRender() - { - return PHP_EOL; - } - - public function postRender() - { - if ($this->windows_output) { - return $this->utf8ToWindows(parent::postRender()); - } - - return parent::postRender(); - } - - public function escape($string, $encoding = false) - { - return \str_replace("\x1b", '\\x1b', $string); - } - - protected function utf8ToWindows($string) - { - return \str_replace( - array('ā”Œ', '═', '┐', '│', 'ā””', '─', 'ā”˜'), - array("\xda", "\xdc", "\xbf", "\xb3", "\xc0", "\xc4", "\xd9"), - $string - ); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/PlainRenderer.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/PlainRenderer.php deleted file mode 100644 index 493a774..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/PlainRenderer.php +++ /dev/null @@ -1,237 +0,0 @@ - array( - array('Kint\\Renderer\\PlainRenderer', 'renderJs'), - array('Kint\\Renderer\\Text\\MicrotimePlugin', 'renderJs'), - ), - 'style' => array( - array('Kint\\Renderer\\PlainRenderer', 'renderCss'), - ), - 'raw' => array(), - ); - - /** - * Path to the CSS file to load by default. - * - * @var string - */ - public static $theme = 'plain.css'; - - /** - * Output htmlentities instead of utf8. - * - * @var bool - */ - public static $disable_utf8 = false; - - public static $needs_pre_render = true; - - public static $always_pre_render = false; - - protected $force_pre_render = false; - protected $pre_render; - - public function __construct() - { - parent::__construct(); - - $this->pre_render = self::$needs_pre_render; - - if (self::$always_pre_render) { - $this->setPreRender(true); - } - } - - public function setCallInfo(array $info) - { - parent::setCallInfo($info); - - if (\in_array('@', $this->call_info['modifiers'], true)) { - $this->setPreRender(true); - } - } - - public function setStatics(array $statics) - { - parent::setStatics($statics); - - if (!empty($statics['return'])) { - $this->setPreRender(true); - } - } - - public function setPreRender($pre_render) - { - $this->pre_render = $pre_render; - $this->force_pre_render = true; - } - - public function getPreRender() - { - return $this->pre_render; - } - - public function colorValue($string) - { - return ''.$string.''; - } - - public function colorType($string) - { - return ''.$string.''; - } - - public function colorTitle($string) - { - return ''.$string.''; - } - - public function renderTitle(BasicObject $o) - { - if (self::$disable_utf8) { - return $this->utf8ToHtmlentity(parent::renderTitle($o)); - } - - return parent::renderTitle($o); - } - - public function preRender() - { - $output = ''; - - if ($this->pre_render) { - foreach (self::$pre_render_sources as $type => $values) { - $contents = ''; - foreach ($values as $v) { - $contents .= \call_user_func($v, $this); - } - - if (!\strlen($contents)) { - continue; - } - - switch ($type) { - case 'script': - $output .= ''; - break; - case 'style': - $output .= ''; - break; - default: - $output .= $contents; - } - } - - // Don't pre-render on every dump - if (!$this->force_pre_render) { - self::$needs_pre_render = false; - } - } - - return $output.'
'; - } - - public function postRender() - { - if (self::$disable_utf8) { - return $this->utf8ToHtmlentity(parent::postRender()).'
'; - } - - return parent::postRender().'
'; - } - - public function ideLink($file, $line) - { - $path = $this->escape(Kint::shortenPath($file)).':'.$line; - $ideLink = Kint::getIdeLink($file, $line); - - if (!$ideLink) { - return $path; - } - - $class = ''; - - if (\preg_match('/https?:\\/\\//i', $ideLink)) { - $class = 'class="kint-ide-link" '; - } - - return ''.$path.''; - } - - public function escape($string, $encoding = false) - { - if (false === $encoding) { - $encoding = BlobObject::detectEncoding($string); - } - - $original_encoding = $encoding; - - if (false === $encoding || 'ASCII' === $encoding) { - $encoding = 'UTF-8'; - } - - $string = \htmlspecialchars($string, ENT_NOQUOTES, $encoding); - - // this call converts all non-ASCII characters into numeirc htmlentities - if (\function_exists('mb_encode_numericentity') && 'ASCII' !== $original_encoding) { - $string = \mb_encode_numericentity($string, array(0x80, 0xffff, 0, 0xffff), $encoding); - } - - return $string; - } - - protected function utf8ToHtmlentity($string) - { - return \str_replace( - array('ā”Œ', '═', '┐', '│', 'ā””', '─', 'ā”˜'), - array('┌', '═', '┐', '│', '└', '─', '┘'), - $string - ); - } - - protected static function renderJs() - { - return \file_get_contents(KINT_DIR.'/resources/compiled/shared.js').\file_get_contents(KINT_DIR.'/resources/compiled/plain.js'); - } - - protected static function renderCss() - { - if (\file_exists(KINT_DIR.'/resources/compiled/'.self::$theme)) { - return \file_get_contents(KINT_DIR.'/resources/compiled/'.self::$theme); - } - - return \file_get_contents(self::$theme); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Renderer.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Renderer.php deleted file mode 100644 index cf8b0a7..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Renderer.php +++ /dev/null @@ -1,185 +0,0 @@ -call_info = array( - 'params' => $info['params'], - 'modifiers' => $info['modifiers'], - 'callee' => $info['callee'], - 'caller' => $info['caller'], - 'trace' => $info['trace'], - ); - } - - public function getCallInfo() - { - return $this->call_info; - } - - public function setStatics(array $statics) - { - $this->statics = $statics; - $this->setShowTrace(!empty($statics['display_called_from'])); - } - - public function getStatics() - { - return $this->statics; - } - - public function setShowTrace($show_trace) - { - $this->show_trace = $show_trace; - } - - public function getShowTrace() - { - return $this->show_trace; - } - - /** - * Returns the first compatible plugin available. - * - * @param array $plugins Array of hints to class strings - * @param array $hints Array of object hints - * - * @return array Array of hints to class strings filtered and sorted by object hints - */ - public function matchPlugins(array $plugins, array $hints) - { - $out = array(); - - foreach ($hints as $key) { - if (isset($plugins[$key])) { - $out[$key] = $plugins[$key]; - } - } - - return $out; - } - - public function filterParserPlugins(array $plugins) - { - return $plugins; - } - - public function preRender() - { - return ''; - } - - public function postRender() - { - return ''; - } - - public static function sortPropertiesFull(BasicObject $a, BasicObject $b) - { - $sort = BasicObject::sortByAccess($a, $b); - if ($sort) { - return $sort; - } - - $sort = BasicObject::sortByName($a, $b); - if ($sort) { - return $sort; - } - - return InstanceObject::sortByHierarchy($a->owner_class, $b->owner_class); - } - - /** - * Sorts an array of BasicObject. - * - * @param BasicObject[] $contents Object properties to sort - * @param int $sort - * - * @return BasicObject[] - */ - public static function sortProperties(array $contents, $sort) - { - switch ($sort) { - case self::SORT_VISIBILITY: - /** @var array Containers to quickly stable sort by type */ - $containers = array( - BasicObject::ACCESS_PUBLIC => array(), - BasicObject::ACCESS_PROTECTED => array(), - BasicObject::ACCESS_PRIVATE => array(), - BasicObject::ACCESS_NONE => array(), - ); - - foreach ($contents as $item) { - $containers[$item->access][] = $item; - } - - return \call_user_func_array('array_merge', $containers); - case self::SORT_FULL: - \usort($contents, array('Kint\\Renderer\\Renderer', 'sortPropertiesFull')); - // no break - default: - return $contents; - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/BinaryPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/BinaryPlugin.php deleted file mode 100644 index 5b4d613..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/BinaryPlugin.php +++ /dev/null @@ -1,51 +0,0 @@ -'; - - $chunks = \str_split($r->contents, self::$line_length); - - foreach ($chunks as $index => $chunk) { - $out .= \sprintf('%08X', $index * self::$line_length).":\t"; - $out .= \implode(' ', \str_split(\str_pad(\bin2hex($chunk), 2 * self::$line_length, ' '), self::$chunk_length)); - $out .= "\t".\preg_replace('/[^\\x20-\\x7E]/', '.', $chunk)."\n"; - } - - $out .= '
'; - - return $out; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/BlacklistPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/BlacklistPlugin.php deleted file mode 100644 index fcfedc1..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/BlacklistPlugin.php +++ /dev/null @@ -1,36 +0,0 @@ -'.$this->renderLockedHeader($o, 'Blacklisted').''; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/CallablePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/CallablePlugin.php deleted file mode 100644 index 5834017..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/CallablePlugin.php +++ /dev/null @@ -1,174 +0,0 @@ -renderMethod($o); - } - - if ($o instanceof ClosureObject) { - return $this->renderClosure($o); - } - - return $this->renderCallable($o); - } - - protected function renderClosure(ClosureObject $o) - { - $children = $this->renderer->renderChildren($o); - - $header = ''; - - if (null !== ($s = $o->getModifiers())) { - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $header .= ''.$this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).')'; - } - - if (null !== ($s = $o->getValueShort())) { - if (RichRenderer::$strlen_max && BlobObject::strlen($s) > RichRenderer::$strlen_max) { - $s = \substr($s, 0, RichRenderer::$strlen_max).'...'; - } - $header .= ' '.$this->renderer->escape($s); - } - - return '
'.$this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header).$children.'
'; - } - - protected function renderCallable(BasicObject $o) - { - $children = $this->renderer->renderChildren($o); - - $header = ''; - - if (null !== ($s = $o->getModifiers())) { - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $header .= ''.$this->renderer->escape($s).''; - } - - if (null !== ($s = $o->getValueShort())) { - if (RichRenderer::$strlen_max && BlobObject::strlen($s) > RichRenderer::$strlen_max) { - $s = \substr($s, 0, RichRenderer::$strlen_max).'...'; - } - $header .= ' '.$this->renderer->escape($s); - } - - return '
'.$this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header).$children.'
'; - } - - protected function renderMethod(MethodObject $o) - { - if (!empty(self::$method_cache[$o->owner_class][$o->name])) { - $children = self::$method_cache[$o->owner_class][$o->name]['children']; - - $header = $this->renderer->renderHeaderWrapper( - $o, - (bool) \strlen($children), - self::$method_cache[$o->owner_class][$o->name]['header'] - ); - - return '
'.$header.$children.'
'; - } - - $children = $this->renderer->renderChildren($o); - - $header = ''; - - if (null !== ($s = $o->getModifiers()) || $o->return_reference) { - $header .= ''.$s; - - if ($o->return_reference) { - if ($s) { - $header .= ' '; - } - $header .= $this->renderer->escape('&'); - } - - $header .= ' '; - } - - if (null !== ($s = $o->getName())) { - $function = $this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).')'; - - if (null !== ($url = $o->getPhpDocUrl())) { - $function = ''.$function.''; - } - - $header .= ''.$function.''; - } - - if (!empty($o->returntype)) { - $header .= ': '; - - if ($o->return_reference) { - $header .= $this->renderer->escape('&'); - } - - $header .= $this->renderer->escape($o->returntype).''; - } elseif ($o->docstring) { - if (\preg_match('/@return\\s+(.*)\\r?\\n/m', $o->docstring, $matches)) { - if (\trim($matches[1])) { - $header .= ': '.$this->renderer->escape(\trim($matches[1])).''; - } - } - } - - if (null !== ($s = $o->getValueShort())) { - if (RichRenderer::$strlen_max && BlobObject::strlen($s) > RichRenderer::$strlen_max) { - $s = \substr($s, 0, RichRenderer::$strlen_max).'...'; - } - $header .= ' '.$this->renderer->escape($s); - } - - if (\strlen($o->owner_class) && \strlen($o->name)) { - self::$method_cache[$o->owner_class][$o->name] = array( - 'header' => $header, - 'children' => $children, - ); - } - - $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); - - return '
'.$header.$children.'
'; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/ClosurePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/ClosurePlugin.php deleted file mode 100644 index 79a9926..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/ClosurePlugin.php +++ /dev/null @@ -1,59 +0,0 @@ -renderer->renderChildren($o); - - if (!($o instanceof ClosureObject)) { - $header = $this->renderer->renderHeader($o); - } else { - $header = ''; - - if (null !== ($s = $o->getModifiers())) { - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $header .= ''.$this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).') '; - } - - $header .= 'Closure '; - $header .= $this->renderer->escape(Kint::shortenPath($o->filename)).':'.(int) $o->startline; - } - - $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); - - return '
'.$header.$children.'
'; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/ColorPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/ColorPlugin.php deleted file mode 100644 index 241a815..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/ColorPlugin.php +++ /dev/null @@ -1,100 +0,0 @@ -getRepresentation('color'); - - if (!$r instanceof ColorRepresentation) { - return; - } - - $children = $this->renderer->renderChildren($o); - - $header = $this->renderer->renderHeader($o); - $header .= '
'; - - $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); - - return '
'.$header.$children.'
'; - } - - public function renderTab(Representation $r) - { - if (!$r instanceof ColorRepresentation) { - return; - } - - $out = ''; - - if ($color = $r->getColor(ColorRepresentation::COLOR_NAME)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_3)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_6)) { - $out .= ''.$color."\n"; - } - - if ($r->hasAlpha()) { - if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_4)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_8)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_RGBA)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_HSLA)) { - $out .= ''.$color."\n"; - } - } else { - if ($color = $r->getColor(ColorRepresentation::COLOR_RGB)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_HSL)) { - $out .= ''.$color."\n"; - } - } - - if (!\strlen($out)) { - return false; - } - - return '
'.$out.'
'; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/DepthLimitPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/DepthLimitPlugin.php deleted file mode 100644 index cd92b41..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/DepthLimitPlugin.php +++ /dev/null @@ -1,36 +0,0 @@ -'.$this->renderLockedHeader($o, 'Depth Limit').''; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/DocstringPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/DocstringPlugin.php deleted file mode 100644 index 19c5309..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/DocstringPlugin.php +++ /dev/null @@ -1,70 +0,0 @@ -contents) as $line) { - $docstring[] = \trim($line); - } - - $docstring = \implode("\n", $docstring); - - $location = array(); - - if ($r->class) { - $location[] = 'Inherited from '.$this->renderer->escape($r->class); - } - if ($r->file && $r->line) { - $location[] = 'Defined in '.$this->renderer->escape(Kint::shortenPath($r->file)).':'.((int) $r->line); - } - - $location = \implode("\n", $location); - - if ($location) { - if (\strlen($docstring)) { - $docstring .= "\n\n"; - } - - $location = ''.$location.''; - } elseif (0 === \strlen($docstring)) { - return ''; - } - - return '
'.$this->renderer->escape($docstring).$location.'
'; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/MicrotimePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/MicrotimePlugin.php deleted file mode 100644 index a56bb23..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/MicrotimePlugin.php +++ /dev/null @@ -1,68 +0,0 @@ -getDateTime()->format('Y-m-d H:i:s.u'); - if (null !== $r->lap) { - $out .= '
SINCE LAST CALL: '.\round($r->lap, 4).'s.'; - } - if (null !== $r->total) { - $out .= '
SINCE START: '.\round($r->total, 4).'s.'; - } - if (null !== $r->avg) { - $out .= '
AVERAGE DURATION: '.\round($r->avg, 4).'s.'; - } - - $bytes = Utils::getHumanReadableBytes($r->mem); - $out .= '
MEMORY USAGE: '.$r->mem.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - $bytes = Utils::getHumanReadableBytes($r->mem_real); - $out .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - - $bytes = Utils::getHumanReadableBytes($r->mem_peak); - $out .= '
PEAK MEMORY USAGE: '.$r->mem_peak.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - $bytes = Utils::getHumanReadableBytes($r->mem_peak_real); - $out .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - - return '
'.$out.'
'; - } - - public static function renderJs() - { - return \file_get_contents(KINT_DIR.'/resources/compiled/microtime.js'); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/ObjectPluginInterface.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/ObjectPluginInterface.php deleted file mode 100644 index f46aa29..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/ObjectPluginInterface.php +++ /dev/null @@ -1,33 +0,0 @@ -renderer = $r; - } - - /** - * Renders a locked header. - * - * @param BasicObject $o - * @param string $content - */ - public function renderLockedHeader(BasicObject $o, $content) - { - $header = '
'; - - if (RichRenderer::$access_paths && $o->depth > 0 && $ap = $o->getAccessPath()) { - $header .= ''; - } - - $header .= ''; - - if (null !== ($s = $o->getModifiers())) { - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $header .= ''.$this->renderer->escape($s).' '; - - if ($s = $o->getOperator()) { - $header .= $this->renderer->escape($s, 'ASCII').' '; - } - } - - if (null !== ($s = $o->getType())) { - $s = $this->renderer->escape($s); - - if ($o->reference) { - $s = '&'.$s; - } - - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getSize())) { - $header .= '('.$this->renderer->escape($s).') '; - } - - $header .= $content; - - if (!empty($ap)) { - $header .= '
'.$this->renderer->escape($ap).'
'; - } - - return $header.'
'; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/PluginInterface.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/PluginInterface.php deleted file mode 100644 index 79828e7..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/PluginInterface.php +++ /dev/null @@ -1,33 +0,0 @@ -'.$this->renderLockedHeader($o, 'Recursion').''; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/SimpleXMLElementPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/SimpleXMLElementPlugin.php deleted file mode 100644 index 6c18931..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/SimpleXMLElementPlugin.php +++ /dev/null @@ -1,81 +0,0 @@ -renderer->renderChildren($o); - - $header = ''; - - if (null !== ($s = $o->getModifiers())) { - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $header .= ''.$this->renderer->escape($s).' '; - - if ($s = $o->getOperator()) { - $header .= $this->renderer->escape($s, 'ASCII').' '; - } - } - - if (null !== ($s = $o->getType())) { - $s = $this->renderer->escape($s); - - if ($o->reference) { - $s = '&'.$s; - } - - $header .= ''.$this->renderer->escape($s).' '; - } - - if (null !== ($s = $o->getSize())) { - $header .= '('.$this->renderer->escape($s).') '; - } - - if (null === $s && $c = $o->getRepresentation('contents')) { - $c = \reset($c->contents); - - if ($c && null !== ($s = $c->getValueShort())) { - if (RichRenderer::$strlen_max && BlobObject::strlen($s) > RichRenderer::$strlen_max) { - $s = \substr($s, 0, RichRenderer::$strlen_max).'...'; - } - $header .= $this->renderer->escape($s); - } - } - - $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); - - return '
'.$header.$children.'
'; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/SourcePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/SourcePlugin.php deleted file mode 100644 index 5443dbf..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/SourcePlugin.php +++ /dev/null @@ -1,79 +0,0 @@ -source)) { - return false; - } - - $source = $r->source; - - // Trim empty lines from the start and end of the source - foreach ($source as $linenum => $line) { - if (\strlen(\trim($line)) || $linenum === $r->line) { - break; - } - - unset($source[$linenum]); - } - - foreach (\array_reverse($source, true) as $linenum => $line) { - if (\strlen(\trim($line)) || $linenum === $r->line) { - break; - } - - unset($source[$linenum]); - } - - $output = ''; - - foreach ($source as $linenum => $line) { - if ($linenum === $r->line) { - $output .= '
'.$this->renderer->escape($line)."\n".'
'; - } else { - $output .= '
'.$this->renderer->escape($line)."\n".'
'; - } - } - - if ($output) { - \reset($source); - - $data = ''; - if ($r->showfilename) { - $data = ' data-kint-filename="'.$this->renderer->escape($r->filename).'"'; - } - - return '
'.$output.'
'; - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/TabPluginInterface.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/TabPluginInterface.php deleted file mode 100644 index 7cdbde7..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/TabPluginInterface.php +++ /dev/null @@ -1,33 +0,0 @@ -'; - - $firstrow = \reset($r->contents); - - foreach ($firstrow->value->contents as $field) { - $out .= ''; - } - - $out .= ''; - - foreach ($r->contents as $row) { - $out .= ''; - - foreach ($row->value->contents as $field) { - $out .= 'getType())) { - $type = $this->renderer->escape($s); - - if ($field->reference) { - $ref = '&'; - $type = $ref.$type; - } - - if (null !== ($s = $field->getSize())) { - $size .= ' ('.$this->renderer->escape($s).')'; - } - } - - if ($type) { - $out .= ' title="'.$type.$size.'"'; - } - - $out .= '>'; - - switch ($field->type) { - case 'boolean': - $out .= $field->value->contents ? ''.$ref.'true' : ''.$ref.'false'; - break; - case 'integer': - case 'double': - $out .= (string) $field->value->contents; - break; - case 'null': - $out .= ''.$ref.'null'; - break; - case 'string': - if ($field->encoding) { - $val = $field->value->contents; - if (RichRenderer::$strlen_max && self::$respect_str_length && BlobObject::strlen($val) > RichRenderer::$strlen_max) { - $val = \substr($val, 0, RichRenderer::$strlen_max).'...'; - } - - $out .= $this->renderer->escape($val); - } else { - $out .= ''.$type.''; - } - break; - case 'array': - $out .= ''.$ref.'array'.$size; - break; - case 'object': - $out .= ''.$ref.$this->renderer->escape($field->classname).''.$size; - break; - case 'resource': - $out .= ''.$ref.'resource'; - break; - default: - $out .= ''.$ref.'unknown'; - break; - } - - if (\in_array('blacklist', $field->hints, true)) { - $out .= ' Blacklisted'; - } elseif (\in_array('recursion', $field->hints, true)) { - $out .= ' Recursion'; - } elseif (\in_array('depth_limit', $field->hints, true)) { - $out .= ' Depth Limit'; - } - - $out .= ''; - } - - $out .= ''; - } - - $out .= '
'.$this->renderer->escape($field->name).'
'; - $out .= $this->renderer->escape($row->name); - $out .= '
'; - - return $out; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/TimestampPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/TimestampPlugin.php deleted file mode 100644 index 6e3a2f8..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/TimestampPlugin.php +++ /dev/null @@ -1,42 +0,0 @@ -contents); - - if ($dt) { - return '
'.$dt->setTimeZone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s T').'
'; - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/TraceFramePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/TraceFramePlugin.php deleted file mode 100644 index 6ca19bb..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Rich/TraceFramePlugin.php +++ /dev/null @@ -1,68 +0,0 @@ -trace['file']) && !empty($o->trace['line'])) { - $header = ''.$this->renderer->ideLink($o->trace['file'], (int) $o->trace['line']).' '; - } else { - $header = 'PHP internal call '; - } - - if ($o->trace['class']) { - $header .= $this->renderer->escape($o->trace['class'].$o->trace['type']); - } - - if (\is_string($o->trace['function'])) { - $function = $this->renderer->escape($o->trace['function'].'()'); - } else { - $function = $this->renderer->escape( - $o->trace['function']->getName().'('.$o->trace['function']->getParams().')' - ); - - if (null !== ($url = $o->trace['function']->getPhpDocUrl())) { - $function = ''.$function.''; - } - } - - $header .= ''.$function.''; - - $children = $this->renderer->renderChildren($o); - $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); - - return '
'.$header.$children.'
'; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/RichRenderer.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/RichRenderer.php deleted file mode 100644 index dcd39ee..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/RichRenderer.php +++ /dev/null @@ -1,612 +0,0 @@ - 'Kint\\Renderer\\Rich\\BlacklistPlugin', - 'callable' => 'Kint\\Renderer\\Rich\\CallablePlugin', - 'closure' => 'Kint\\Renderer\\Rich\\ClosurePlugin', - 'color' => 'Kint\\Renderer\\Rich\\ColorPlugin', - 'depth_limit' => 'Kint\\Renderer\\Rich\\DepthLimitPlugin', - 'recursion' => 'Kint\\Renderer\\Rich\\RecursionPlugin', - 'simplexml_element' => 'Kint\\Renderer\\Rich\\SimpleXMLElementPlugin', - 'trace_frame' => 'Kint\\Renderer\\Rich\\TraceFramePlugin', - ); - - /** - * RichRenderer tab plugins should implement Kint\Renderer\Rich\TabPluginInterface. - */ - public static $tab_plugins = array( - 'binary' => 'Kint\\Renderer\\Rich\\BinaryPlugin', - 'color' => 'Kint\\Renderer\\Rich\\ColorPlugin', - 'docstring' => 'Kint\\Renderer\\Rich\\DocstringPlugin', - 'microtime' => 'Kint\\Renderer\\Rich\\MicrotimePlugin', - 'source' => 'Kint\\Renderer\\Rich\\SourcePlugin', - 'table' => 'Kint\\Renderer\\Rich\\TablePlugin', - 'timestamp' => 'Kint\\Renderer\\Rich\\TimestampPlugin', - ); - - public static $pre_render_sources = array( - 'script' => array( - array('Kint\\Renderer\\RichRenderer', 'renderJs'), - array('Kint\\Renderer\\Rich\\MicrotimePlugin', 'renderJs'), - ), - 'style' => array( - array('Kint\\Renderer\\RichRenderer', 'renderCss'), - ), - 'raw' => array(), - ); - - /** - * Whether or not to render access paths. - * - * Access paths can become incredibly heavy with very deep and wide - * structures. Given mostly public variables it will typically make - * up one quarter of the output HTML size. - * - * If this is an unacceptably large amount and your browser is groaning - * under the weight of the access paths - your first order of buisiness - * should be to get a new browser. Failing that, use this to turn them off. - * - * @var bool - */ - public static $access_paths = true; - - /** - * The maximum length of a string before it is truncated. - * - * Falsey to disable - * - * @var int - */ - public static $strlen_max = 80; - - /** - * Path to the CSS file to load by default. - * - * @var string - */ - public static $theme = 'original.css'; - - /** - * Assume types and sizes don't need to be escaped. - * - * Turn this off if you use anything but ascii in your class names, - * but it'll cause a slowdown of around 10% - * - * @var bool - */ - public static $escape_types = false; - - /** - * Move all dumps to a folder at the bottom of the body. - * - * @var bool - */ - public static $folder = true; - - /** - * Sort mode for object properties. - * - * @var int - */ - public static $sort = self::SORT_NONE; - - public static $needs_pre_render = true; - public static $needs_folder_render = true; - - public static $always_pre_render = false; - - protected $plugin_objs = array(); - protected $expand = false; - protected $force_pre_render = false; - protected $pre_render; - protected $use_folder; - - public function __construct() - { - $this->pre_render = self::$needs_pre_render; - $this->use_folder = self::$folder; - - if (self::$always_pre_render) { - $this->setForcePreRender(); - } - } - - public function setCallInfo(array $info) - { - parent::setCallInfo($info); - - if (\in_array('!', $this->call_info['modifiers'], true)) { - $this->setExpand(true); - $this->use_folder = false; - } - - if (\in_array('@', $this->call_info['modifiers'], true)) { - $this->setForcePreRender(); - } - } - - public function setStatics(array $statics) - { - parent::setStatics($statics); - - if (!empty($statics['expanded'])) { - $this->setExpand(true); - } - - if (!empty($statics['return'])) { - $this->setForcePreRender(); - } - } - - public function setExpand($expand) - { - $this->expand = $expand; - } - - public function getExpand() - { - return $this->expand; - } - - public function setForcePreRender() - { - $this->force_pre_render = true; - $this->pre_render = true; - } - - public function setPreRender($pre_render) - { - $this->setForcePreRender(); // TODO: Remove line in next major version - $this->pre_render = $pre_render; - } - - public function getPreRender() - { - return $this->pre_render; - } - - public function setUseFolder($use_folder) - { - $this->use_folder = $use_folder; - } - - public function getUseFolder() - { - return $this->use_folder; - } - - public function render(BasicObject $o) - { - if ($plugin = $this->getPlugin(self::$object_plugins, $o->hints)) { - if (\strlen($output = $plugin->renderObject($o))) { - return $output; - } - } - - $children = $this->renderChildren($o); - $header = $this->renderHeaderWrapper($o, (bool) \strlen($children), $this->renderHeader($o)); - - return '
'.$header.$children.'
'; - } - - public function renderNothing() - { - return '
No argument
'; - } - - public function renderHeaderWrapper(BasicObject $o, $has_children, $contents) - { - $out = 'expand) { - $out .= ' kint-show'; - } - - $out .= '"'; - } - - $out .= '>'; - - if (self::$access_paths && $o->depth > 0 && $ap = $o->getAccessPath()) { - $out .= ''; - } - - if ($has_children) { - $out .= ''; - - if (0 === $o->depth) { - $out .= ''; - $out .= ''; - } - - $out .= ''; - } - - $out .= $contents; - - if (!empty($ap)) { - $out .= '
'.$this->escape($ap).'
'; - } - - return $out.''; - } - - public function renderHeader(BasicObject $o) - { - $output = ''; - - if (null !== ($s = $o->getModifiers())) { - $output .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $output .= ''.$this->escape($s).' '; - - if ($s = $o->getOperator()) { - $output .= $this->escape($s, 'ASCII').' '; - } - } - - if (null !== ($s = $o->getType())) { - if (self::$escape_types) { - $s = $this->escape($s); - } - - if ($o->reference) { - $s = '&'.$s; - } - - $output .= ''.$s.' '; - } - - if (null !== ($s = $o->getSize())) { - if (self::$escape_types) { - $s = $this->escape($s); - } - $output .= '('.$s.') '; - } - - if (null !== ($s = $o->getValueShort())) { - $s = \preg_replace('/\\s+/', ' ', $s); - - if (self::$strlen_max) { - $s = Utils::truncateString($s, self::$strlen_max); - } - - $output .= $this->escape($s); - } - - return \trim($output); - } - - public function renderChildren(BasicObject $o) - { - $contents = array(); - $tabs = array(); - - foreach ($o->getRepresentations() as $rep) { - $result = $this->renderTab($o, $rep); - if (\strlen($result)) { - $contents[] = $result; - $tabs[] = $rep; - } - } - - if (empty($tabs)) { - return ''; - } - - $output = '
'; - - if (1 === \count($tabs) && $tabs[0]->labelIsImplicit()) { - $output .= \reset($contents); - } else { - $output .= '
    '; - - foreach ($tabs as $i => $tab) { - if (0 === $i) { - $output .= '
  • '; - } else { - $output .= '
  • '; - } - - $output .= $this->escape($tab->getLabel()).'
  • '; - } - - $output .= '
    '; - - foreach ($contents as $tab) { - $output .= '
  • '.$tab.'
  • '; - } - - $output .= '
'; - } - - return $output.'
'; - } - - public function preRender() - { - $output = ''; - - if ($this->pre_render) { - foreach (self::$pre_render_sources as $type => $values) { - $contents = ''; - foreach ($values as $v) { - $contents .= \call_user_func($v, $this); - } - - if (!\strlen($contents)) { - continue; - } - - switch ($type) { - case 'script': - $output .= ''; - break; - case 'style': - $output .= ''; - break; - default: - $output .= $contents; - } - } - - // Don't pre-render on every dump - if (!$this->force_pre_render) { - self::$needs_pre_render = false; - } - } - - $output .= '
'; - - return $output; - } - - public function postRender() - { - if (!$this->show_trace) { - return '
'; - } - - $output = '
'; - $output .= ' '; - - if (!empty($this->call_info['trace']) && \count($this->call_info['trace']) > 1) { - $output .= ''; - } - - if (isset($this->call_info['callee']['file'])) { - $output .= 'Called from '.$this->ideLink( - $this->call_info['callee']['file'], - $this->call_info['callee']['line'] - ); - } - - if (isset($this->call_info['callee']['function']) && ( - !empty($this->call_info['callee']['class']) || - !\in_array( - $this->call_info['callee']['function'], - array('include', 'include_once', 'require', 'require_once'), - true - ) - ) - ) { - $output .= ' ['; - if (isset($this->call_info['callee']['class'])) { - $output .= $this->call_info['callee']['class']; - } - if (isset($this->call_info['callee']['type'])) { - $output .= $this->call_info['callee']['type']; - } - $output .= $this->call_info['callee']['function'].'()]'; - } - - if (!empty($this->call_info['trace']) && \count($this->call_info['trace']) > 1) { - $output .= '
    '; - foreach ($this->call_info['trace'] as $index => $step) { - if (!$index) { - continue; - } - - $output .= '
  1. '.$this->ideLink($step['file'], $step['line']); // closing tag not required - if (isset($step['function']) - && !\in_array($step['function'], array('include', 'include_once', 'require', 'require_once'), true) - ) { - $output .= ' ['; - if (isset($step['class'])) { - $output .= $step['class']; - } - if (isset($step['type'])) { - $output .= $step['type']; - } - $output .= $step['function'].'()]'; - } - } - $output .= '
'; - } - - $output .= '
'; - - return $output; - } - - public function escape($string, $encoding = false) - { - if (false === $encoding) { - $encoding = BlobObject::detectEncoding($string); - } - - $original_encoding = $encoding; - - if (false === $encoding || 'ASCII' === $encoding) { - $encoding = 'UTF-8'; - } - - $string = \htmlspecialchars($string, ENT_NOQUOTES, $encoding); - - // this call converts all non-ASCII characters into numeirc htmlentities - if (\function_exists('mb_encode_numericentity') && 'ASCII' !== $original_encoding) { - $string = \mb_encode_numericentity($string, array(0x80, 0xffff, 0, 0xffff), $encoding); - } - - return $string; - } - - public function ideLink($file, $line) - { - $path = $this->escape(Kint::shortenPath($file)).':'.$line; - $ideLink = Kint::getIdeLink($file, $line); - - if (!$ideLink) { - return $path; - } - - $class = ''; - - if (\preg_match('/https?:\\/\\//i', $ideLink)) { - $class = 'class="kint-ide-link" '; - } - - return ''.$path.''; - } - - protected function renderTab(BasicObject $o, Representation $rep) - { - if ($plugin = $this->getPlugin(self::$tab_plugins, $rep->hints)) { - if (\strlen($output = $plugin->renderTab($rep))) { - return $output; - } - } - - if (\is_array($rep->contents)) { - $output = ''; - - if ($o instanceof InstanceObject && 'properties' === $rep->getName()) { - foreach (self::sortProperties($rep->contents, self::$sort) as $obj) { - $output .= $this->render($obj); - } - } else { - foreach ($rep->contents as $obj) { - $output .= $this->render($obj); - } - } - - return $output; - } - - if (\is_string($rep->contents)) { - $show_contents = false; - - // If it is the value representation of a string and its whitespace - // was truncated in the header, always display the full string - if ('string' !== $o->type || $o->value !== $rep) { - $show_contents = true; - } else { - if (\preg_match('/(:?[\\r\\n\\t\\f\\v]| {2})/', $rep->contents)) { - $show_contents = true; - } elseif (self::$strlen_max && BlobObject::strlen($o->getValueShort()) > self::$strlen_max) { - $show_contents = true; - } - - if (empty($o->encoding)) { - $show_contents = false; - } - } - - if ($show_contents) { - return '
'.$this->escape($rep->contents)."\n
"; - } - } - - if ($rep->contents instanceof BasicObject) { - return $this->render($rep->contents); - } - } - - protected function getPlugin(array $plugins, array $hints) - { - if ($plugins = $this->matchPlugins($plugins, $hints)) { - $plugin = \end($plugins); - - if (!isset($this->plugin_objs[$plugin])) { - $this->plugin_objs[$plugin] = new $plugin($this); - } - - return $this->plugin_objs[$plugin]; - } - } - - protected static function renderJs() - { - return \file_get_contents(KINT_DIR.'/resources/compiled/shared.js').\file_get_contents(KINT_DIR.'/resources/compiled/rich.js'); - } - - protected static function renderCss() - { - if (\file_exists(KINT_DIR.'/resources/compiled/'.self::$theme)) { - return \file_get_contents(KINT_DIR.'/resources/compiled/'.self::$theme); - } - - return \file_get_contents(self::$theme); - } - - protected static function renderFolder() - { - return '
Kint
'; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/BlacklistPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/BlacklistPlugin.php deleted file mode 100644 index 127d32a..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/BlacklistPlugin.php +++ /dev/null @@ -1,44 +0,0 @@ -depth) { - $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderer->renderHeader($o).' '.$this->renderer->colorValue('BLACKLISTED').PHP_EOL; - - return $out; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/DepthLimitPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/DepthLimitPlugin.php deleted file mode 100644 index 310b87e..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/DepthLimitPlugin.php +++ /dev/null @@ -1,44 +0,0 @@ -depth) { - $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderer->renderHeader($o).' '.$this->renderer->colorValue('DEPTH LIMIT').PHP_EOL; - - return $out; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/MicrotimePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/MicrotimePlugin.php deleted file mode 100644 index 9128032..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/MicrotimePlugin.php +++ /dev/null @@ -1,128 +0,0 @@ -renderer instanceof PlainRenderer) { - $this->useJs = true; - } - } - - public function render(BasicObject $o) - { - $r = $o->getRepresentation('microtime'); - - if (!$r instanceof MicrotimeRepresentation) { - return false; - } - - $out = ''; - - if (0 == $o->depth) { - $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderer->renderHeader($o); - $out .= $this->renderer->renderChildren($o).PHP_EOL; - - $indent = \str_repeat(' ', ($o->depth + 1) * $this->renderer->indent_width); - - if ($this->useJs) { - $out .= ''; - } - - $out .= $indent.$this->renderer->colorType('TIME:').' '; - $out .= $this->renderer->colorValue($r->getDateTime()->format('Y-m-d H:i:s.u')).PHP_EOL; - - if (null !== $r->lap) { - $out .= $indent.$this->renderer->colorType('SINCE LAST CALL:').' '; - - $lap = \round($r->lap, 4); - - if ($this->useJs) { - $lap = ''.$lap.''; - } - - $out .= $this->renderer->colorValue($lap.'s').'.'.PHP_EOL; - } - if (null !== $r->total) { - $out .= $indent.$this->renderer->colorType('SINCE START:').' '; - $out .= $this->renderer->colorValue(\round($r->total, 4).'s').'.'.PHP_EOL; - } - if (null !== $r->avg) { - $out .= $indent.$this->renderer->colorType('AVERAGE DURATION:').' '; - - $avg = \round($r->avg, 4); - - if ($this->useJs) { - $avg = ''.$avg.''; - } - - $out .= $this->renderer->colorValue($avg.'s').'.'.PHP_EOL; - } - - $bytes = Utils::getHumanReadableBytes($r->mem); - $mem = $r->mem.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - $bytes = Utils::getHumanReadableBytes($r->mem_real); - $mem .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - - $out .= $indent.$this->renderer->colorType('MEMORY USAGE:').' '; - $out .= $this->renderer->colorValue($mem).'.'.PHP_EOL; - - $bytes = Utils::getHumanReadableBytes($r->mem_peak); - $mem = $r->mem_peak.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - $bytes = Utils::getHumanReadableBytes($r->mem_peak_real); - $mem .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - - $out .= $indent.$this->renderer->colorType('PEAK MEMORY USAGE:').' '; - $out .= $this->renderer->colorValue($mem).'.'.PHP_EOL; - - if ($this->useJs) { - $out .= ''; - } - - return $out; - } - - public static function renderJs() - { - return RichPlugin::renderJs(); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/Plugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/Plugin.php deleted file mode 100644 index 9de25c1..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/Plugin.php +++ /dev/null @@ -1,41 +0,0 @@ -renderer = $r; - } - - abstract public function render(BasicObject $o); -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/RecursionPlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/RecursionPlugin.php deleted file mode 100644 index 72c2257..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/RecursionPlugin.php +++ /dev/null @@ -1,44 +0,0 @@ -depth) { - $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderer->renderHeader($o).' '.$this->renderer->colorValue('RECURSION').PHP_EOL; - - return $out; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/TracePlugin.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/TracePlugin.php deleted file mode 100644 index 5833840..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/Text/TracePlugin.php +++ /dev/null @@ -1,111 +0,0 @@ -depth) { - $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderer->renderHeader($o).':'.PHP_EOL; - - $indent = \str_repeat(' ', ($o->depth + 1) * $this->renderer->indent_width); - - $i = 1; - foreach ($o->value->contents as $frame) { - $framedesc = $indent.\str_pad($i.': ', 4, ' '); - - if ($frame->trace['file']) { - $framedesc .= $this->renderer->ideLink($frame->trace['file'], $frame->trace['line']).PHP_EOL; - } else { - $framedesc .= 'PHP internal call'.PHP_EOL; - } - - $framedesc .= $indent.' '; - - if ($frame->trace['class']) { - $framedesc .= $this->renderer->escape($frame->trace['class']); - - if ($frame->trace['object']) { - $framedesc .= $this->renderer->escape('->'); - } else { - $framedesc .= '::'; - } - } - - if (\is_string($frame->trace['function'])) { - $framedesc .= $this->renderer->escape($frame->trace['function']).'(...)'; - } elseif ($frame->trace['function'] instanceof MethodObject) { - $framedesc .= $this->renderer->escape($frame->trace['function']->getName()); - $framedesc .= '('.$this->renderer->escape($frame->trace['function']->getParams()).')'; - } - - $out .= $this->renderer->colorType($framedesc).PHP_EOL.PHP_EOL; - - if ($source = $frame->getRepresentation('source')) { - $line_wanted = $source->line; - $source = $source->source; - - // Trim empty lines from the start and end of the source - foreach ($source as $linenum => $line) { - if (\trim($line) || $linenum === $line_wanted) { - break; - } - - unset($source[$linenum]); - } - - foreach (\array_reverse($source, true) as $linenum => $line) { - if (\trim($line) || $linenum === $line_wanted) { - break; - } - - unset($source[$linenum]); - } - - foreach ($source as $lineno => $line) { - if ($lineno == $line_wanted) { - $out .= $indent.$this->renderer->colorValue($this->renderer->escape($line)).PHP_EOL; - } else { - $out .= $indent.$this->renderer->escape($line).PHP_EOL; - } - } - } - - ++$i; - } - - return $out; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/TextRenderer.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/TextRenderer.php deleted file mode 100644 index 43b6c40..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Renderer/TextRenderer.php +++ /dev/null @@ -1,346 +0,0 @@ - 'Kint\\Renderer\\Text\\BlacklistPlugin', - 'depth_limit' => 'Kint\\Renderer\\Text\\DepthLimitPlugin', - 'microtime' => 'Kint\\Renderer\\Text\\MicrotimePlugin', - 'recursion' => 'Kint\\Renderer\\Text\\RecursionPlugin', - 'trace' => 'Kint\\Renderer\\Text\\TracePlugin', - ); - - /** - * Parser plugins must be instanceof one of these or - * it will be removed for performance reasons. - */ - public static $parser_plugin_whitelist = array( - 'Kint\\Parser\\BlacklistPlugin', - 'Kint\\Parser\\MicrotimePlugin', - 'Kint\\Parser\\StreamPlugin', - 'Kint\\Parser\\TracePlugin', - ); - - /** - * The maximum length of a string before it is truncated. - * - * Falsey to disable - * - * @var int - */ - public static $strlen_max = 0; - - /** - * The default width of the terminal for headers. - * - * @var int - */ - public static $default_width = 80; - - /** - * Indentation width. - * - * @var int - */ - public static $default_indent = 4; - - /** - * Decorate the header and footer. - * - * @var bool - */ - public static $decorations = true; - - /** - * Sort mode for object properties. - * - * @var int - */ - public static $sort = self::SORT_NONE; - - public $header_width = 80; - public $indent_width = 4; - - protected $plugin_objs = array(); - - public function __construct() - { - $this->header_width = self::$default_width; - $this->indent_width = self::$default_indent; - } - - public function render(BasicObject $o) - { - if ($plugin = $this->getPlugin(self::$plugins, $o->hints)) { - if (\strlen($output = $plugin->render($o))) { - return $output; - } - } - - $out = ''; - - if (0 == $o->depth) { - $out .= $this->colorTitle($this->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderHeader($o); - $out .= $this->renderChildren($o).PHP_EOL; - - return $out; - } - - public function renderNothing() - { - if (self::$decorations) { - return $this->colorTitle( - $this->boxText('No argument', $this->header_width) - ).PHP_EOL; - } - - return $this->colorTitle('No argument').PHP_EOL; - } - - public function boxText($text, $width) - { - $out = 'ā”Œ'.\str_repeat('─', $width - 2).'┐'.PHP_EOL; - - if (\strlen($text)) { - $text = Utils::truncateString($text, $width - 4); - $text = \str_pad($text, $width - 4); - - $out .= '│ '.$this->escape($text).' │'.PHP_EOL; - } - - $out .= 'ā””'.\str_repeat('─', $width - 2).'ā”˜'; - - return $out; - } - - public function renderTitle(BasicObject $o) - { - $name = (string) $o->getName(); - - if (self::$decorations) { - return $this->boxText($name, $this->header_width); - } - - return Utils::truncateString($name, $this->header_width); - } - - public function renderHeader(BasicObject $o) - { - $output = array(); - - if ($o->depth) { - if (null !== ($s = $o->getModifiers())) { - $output[] = $s; - } - - if (null !== $o->name) { - $output[] = $this->escape(\var_export($o->name, true)); - - if (null !== ($s = $o->getOperator())) { - $output[] = $this->escape($s); - } - } - } - - if (null !== ($s = $o->getType())) { - if ($o->reference) { - $s = '&'.$s; - } - - $output[] = $this->colorType($this->escape($s)); - } - - if (null !== ($s = $o->getSize())) { - $output[] = '('.$this->escape($s).')'; - } - - if (null !== ($s = $o->getValueShort())) { - if (self::$strlen_max) { - $s = Utils::truncateString($s, self::$strlen_max); - } - $output[] = $this->colorValue($this->escape($s)); - } - - return \str_repeat(' ', $o->depth * $this->indent_width).\implode(' ', $output); - } - - public function renderChildren(BasicObject $o) - { - if ('array' === $o->type) { - $output = ' ['; - } elseif ('object' === $o->type) { - $output = ' ('; - } else { - return ''; - } - - $children = ''; - - if ($o->value && \is_array($o->value->contents)) { - if ($o instanceof InstanceObject && 'properties' === $o->value->getName()) { - foreach (self::sortProperties($o->value->contents, self::$sort) as $obj) { - $children .= $this->render($obj); - } - } else { - foreach ($o->value->contents as $child) { - $children .= $this->render($child); - } - } - } - - if ($children) { - $output .= PHP_EOL.$children; - $output .= \str_repeat(' ', $o->depth * $this->indent_width); - } - - if ('array' === $o->type) { - $output .= ']'; - } else { - $output .= ')'; - } - - return $output; - } - - public function colorValue($string) - { - return $string; - } - - public function colorType($string) - { - return $string; - } - - public function colorTitle($string) - { - return $string; - } - - public function postRender() - { - if (self::$decorations) { - $output = \str_repeat('═', $this->header_width); - } else { - $output = ''; - } - - if (!$this->show_trace) { - return $this->colorTitle($output); - } - - if ($output) { - $output .= PHP_EOL; - } - - return $this->colorTitle($output.$this->calledFrom().PHP_EOL); - } - - public function filterParserPlugins(array $plugins) - { - $return = array(); - - foreach ($plugins as $index => $plugin) { - foreach (self::$parser_plugin_whitelist as $whitelist) { - if ($plugin instanceof $whitelist) { - $return[] = $plugin; - continue 2; - } - } - } - - return $return; - } - - public function ideLink($file, $line) - { - return $this->escape(Kint::shortenPath($file)).':'.$line; - } - - public function escape($string, $encoding = false) - { - return $string; - } - - protected function calledFrom() - { - $output = ''; - - if (isset($this->call_info['callee']['file'])) { - $output .= 'Called from '.$this->ideLink( - $this->call_info['callee']['file'], - $this->call_info['callee']['line'] - ); - } - - if (isset($this->call_info['callee']['function']) && ( - !empty($this->call_info['callee']['class']) || - !\in_array( - $this->call_info['callee']['function'], - array('include', 'include_once', 'require', 'require_once'), - true - ) - ) - ) { - $output .= ' ['; - if (isset($this->call_info['callee']['class'])) { - $output .= $this->call_info['callee']['class']; - } - if (isset($this->call_info['callee']['type'])) { - $output .= $this->call_info['callee']['type']; - } - $output .= $this->call_info['callee']['function'].'()]'; - } - - return $output; - } - - protected function getPlugin(array $plugins, array $hints) - { - if ($plugins = $this->matchPlugins($plugins, $hints)) { - $plugin = \end($plugins); - - if (!isset($this->plugin_objs[$plugin])) { - $this->plugin_objs[$plugin] = new $plugin($this); - } - - return $this->plugin_objs[$plugin]; - } - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Utils.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/Utils.php deleted file mode 100644 index 27a2491..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/Utils.php +++ /dev/null @@ -1,240 +0,0 @@ - (float) ($value / \pow(1024, $i)), - 'unit' => $unit[$i], - ); - } - - public static function isSequential(array $array) - { - return \array_keys($array) === \range(0, \count($array) - 1); - } - - public static function composerGetExtras($key = 'kint') - { - $extras = array(); - - if (0 === \strpos(KINT_DIR, 'phar://')) { - // Only run inside phar file, so skip for code coverage - return $extras; // @codeCoverageIgnore - } - - $folder = KINT_DIR.'/vendor'; - - for ($i = 0; $i < 4; ++$i) { - $installed = $folder.'/composer/installed.json'; - - if (\file_exists($installed) && \is_readable($installed)) { - $packages = \json_decode(\file_get_contents($installed), true); - - foreach ($packages as $package) { - if (isset($package['extra'][$key]) && \is_array($package['extra'][$key])) { - $extras = \array_replace($extras, $package['extra'][$key]); - } - } - - $folder = \dirname($folder); - - if (\file_exists($folder.'/composer.json') && \is_readable($folder.'/composer.json')) { - $composer = \json_decode(\file_get_contents($folder.'/composer.json'), true); - - if (isset($composer['extra'][$key]) && \is_array($composer['extra'][$key])) { - $extras = \array_replace($extras, $composer['extra'][$key]); - } - } - - break; - } - - $folder = \dirname($folder); - } - - return $extras; - } - - /** - * @codeCoverageIgnore - */ - public static function composerSkipFlags() - { - $extras = self::composerGetExtras(); - - if (!empty($extras['disable-facade']) && !\defined('KINT_SKIP_FACADE')) { - \define('KINT_SKIP_FACADE', true); - } - - if (!empty($extras['disable-helpers']) && !\defined('KINT_SKIP_HELPERS')) { - \define('KINT_SKIP_HELPERS', true); - } - } - - public static function isTrace(array $trace) - { - if (!self::isSequential($trace)) { - return false; - } - - static $bt_structure = array( - 'function' => 'string', - 'line' => 'integer', - 'file' => 'string', - 'class' => 'string', - 'object' => 'object', - 'type' => 'string', - 'args' => 'array', - ); - - $file_found = false; - - foreach ($trace as $frame) { - if (!\is_array($frame) || !isset($frame['function'])) { - return false; - } - - foreach ($frame as $key => $val) { - if (!isset($bt_structure[$key])) { - return false; - } - - if (\gettype($val) !== $bt_structure[$key]) { - return false; - } - - if ('file' === $key) { - $file_found = true; - } - } - } - - return $file_found; - } - - public static function traceFrameIsListed(array $frame, array $matches) - { - if (isset($frame['class'])) { - $called = array(\strtolower($frame['class']), \strtolower($frame['function'])); - } else { - $called = \strtolower($frame['function']); - } - - return \in_array($called, $matches, true); - } - - public static function normalizeAliases(array &$aliases) - { - static $name_regex = '[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*'; - - foreach ($aliases as $index => &$alias) { - if (\is_array($alias) && 2 === \count($alias)) { - $alias = \array_values(\array_filter($alias, 'is_string')); - - if (2 === \count($alias) && - \preg_match('/^'.$name_regex.'$/', $alias[1]) && - \preg_match('/^\\\\?('.$name_regex.'\\\\)*'.$name_regex.'$/', $alias[0]) - ) { - $alias = array( - \strtolower(\ltrim($alias[0], '\\')), - \strtolower($alias[1]), - ); - } else { - unset($aliases[$index]); - continue; - } - } elseif (\is_string($alias)) { - if (\preg_match('/^\\\\?('.$name_regex.'\\\\)*'.$name_regex.'$/', $alias)) { - $alias = \explode('\\', \strtolower($alias)); - $alias = \end($alias); - } else { - unset($aliases[$index]); - continue; - } - } else { - unset($aliases[$index]); - } - } - - $aliases = \array_values($aliases); - } - - public static function truncateString($input, $length = PHP_INT_MAX, $end = '...', $encoding = false) - { - $length = (int) $length; - $endlength = BlobObject::strlen($end); - - if ($endlength >= $length) { - throw new InvalidArgumentException('Can\'t truncate a string to '.$length.' characters if ending with string '.$endlength.' characters long'); - } - - if (BlobObject::strlen($input, $encoding) > $length) { - return BlobObject::substr($input, 0, $length - $endlength, $encoding).$end; - } - - return $input; - } - - public static function getTypeString(ReflectionType $type) - { - if ($type instanceof ReflectionNamedType) { - return $type->getName(); - } - - return (string) $type; // @codeCoverageIgnore - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/init.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/init.php deleted file mode 100644 index 952e041..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/init.php +++ /dev/null @@ -1,62 +0,0 @@ -= 0)); -\define('KINT_PHP70', (\version_compare(PHP_VERSION, '7.0') >= 0)); -\define('KINT_PHP72', (\version_compare(PHP_VERSION, '7.2') >= 0)); -\define('KINT_PHP73', (\version_compare(PHP_VERSION, '7.3') >= 0)); -\define('KINT_PHP74', (\version_compare(PHP_VERSION, '7.4') >= 0)); - -// Dynamic default settings -Kint::$file_link_format = \ini_get('xdebug.file_link_format'); -if (isset($_SERVER['DOCUMENT_ROOT'])) { - Kint::$app_root_dirs = array( - $_SERVER['DOCUMENT_ROOT'] => '', - \realpath($_SERVER['DOCUMENT_ROOT']) => '', - ); -} - -Utils::composerSkipFlags(); - -if ((!\defined('KINT_SKIP_FACADE') || !KINT_SKIP_FACADE) && !\class_exists('Kint')) { - \class_alias('Kint\\Kint', 'Kint'); -} - -if (!\defined('KINT_SKIP_HELPERS') || !KINT_SKIP_HELPERS) { - require_once __DIR__.'/init_helpers.php'; -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/init_helpers.php b/vendor/codeigniter4/framework/system/ThirdParty/Kint/init_helpers.php deleted file mode 100644 index b961d67..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/init_helpers.php +++ /dev/null @@ -1,84 +0,0 @@ -dl dl{padding:0 0 0 12px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMCAxNTAiPjxwYXRoIGQ9Ik02IDdoMThsLTkgMTV6bTAgMzBoMThsLTkgMTV6bTAgNDVoMThsLTktMTV6bTAgMzBoMThsLTktMTV6bTAgMTJsMTggMThtLTE4IDBsMTgtMTgiIGZpbGw9IiM1NTUiLz48cGF0aCBkPSJNNiAxMjZsMTggMThtLTE4IDBsMTgtMTgiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSIjNTU1Ii8+PC9zdmc+") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #d7d7d7}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#06f;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:red}.kint-rich dfn{font-style:normal;font-family:monospace;color:#1d1e1e}.kint-rich pre{color:#1d1e1e;margin:0 0 0 12px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #d7d7d7;background:#f8f8f8;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(29,30,30,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#f8f8f8;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#1d1e1e;background:#f8f8f8}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #d7d7d7;border-top-width:0;border-bottom-width:0;padding:4px;float:right !important;margin:-4px 0;color:#1d1e1e;background:#f8f8f8;height:24px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#f8f8f8;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#f8f8f8}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#f8f8f8;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#1d1e1e}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#1d1e1e;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#1d1e1e;border-bottom:1px dotted #1d1e1e}.kint-rich ul{list-style:none;padding-left:12px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #d7d7d7}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 12px;padding-left:0;background:#f8f8f8;border:1px solid #d7d7d7;border-top:0}.kint-rich ul.kint-tabs>li{background:#f8f8f8;border:1px solid #d7d7d7;cursor:pointer;display:inline-block;height:24px;margin:2px;padding:0 12px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#aaa;color:red}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#f8f8f8;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:20px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#aaa;color:red}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #d7d7d7;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#aaa}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #d7d7d7;padding:2px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#f8f8f8;color:#1d1e1e}.kint-rich table td{background:#f8f8f8;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #aaa inset}.kint-rich table tr:hover var{color:red}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:4px;padding-bottom:4px;border-bottom:1px solid #f8f8f8}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #aaa;padding-right:8px;margin-right:8px}.kint-rich pre.kint-source>div.kint-highlight{background:#f8f8f8}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #aaa,0 1px #aaa,1px 0 #aaa,0 -1px #aaa;color:#f8f8f8;font-weight:bold}.kint-rich .kint-focused{box-shadow:0 0 3px 2px red}.kint-rich dt{font-weight:normal}.kint-rich dt.kint-parent{margin-top:4px}.kint-rich dl dl{margin-top:4px;padding-left:25px;border-left:none}.kint-rich>dl>dt{background:#f8f8f8}.kint-rich ul{margin:0;padding-left:0}.kint-rich ul:not(.kint-tabs)>li{border-left:0}.kint-rich ul.kint-tabs{background:#f8f8f8;border:1px solid #d7d7d7;border-width:0 1px 1px 1px;padding:4px 0 0 12px;margin-left:-1px;margin-top:-1px}.kint-rich ul.kint-tabs li,.kint-rich ul.kint-tabs li+li{margin:0 0 0 4px}.kint-rich ul.kint-tabs li{border-bottom-width:0;height:25px}.kint-rich ul.kint-tabs li:first-child{margin-left:0}.kint-rich ul.kint-tabs li.kint-active-tab{border-top:1px solid #d7d7d7;background:#fff;font-weight:bold;padding-top:0;border-bottom:1px solid #fff !important;margin-bottom:-1px}.kint-rich ul.kint-tabs li.kint-active-tab:hover{border-bottom:1px solid #fff}.kint-rich ul>li>pre{border:1px solid #d7d7d7}.kint-rich dt:hover+dd>ul{border-color:#aaa}.kint-rich pre{background:#fff;margin-top:4px;margin-left:25px}.kint-rich .kint-source{margin-left:-1px}.kint-rich .kint-source .kint-highlight{background:#cfc}.kint-rich .kint-parent.kint-show>.kint-search{border-bottom-width:1px}.kint-rich table td{background:#fff}.kint-rich table td>dl{padding:0;margin:0}.kint-rich table td>dl>dt.kint-parent{margin:0}.kint-rich table td:first-child,.kint-rich table td,.kint-rich table th{padding:2px 4px}.kint-rich table dd,.kint-rich table dt{background:#fff}.kint-rich table tr:hover>td{box-shadow:none;background:#cfc} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/microtime.js b/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/microtime.js deleted file mode 100644 index 20e3445..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/microtime.js +++ /dev/null @@ -1 +0,0 @@ -void 0===window.kintMicrotimeInitialized&&(window.kintMicrotimeInitialized=1,window.addEventListener("load",function(){"use strict";var c={},i=Array.prototype.slice.call(document.querySelectorAll("[data-kint-microtime-group]"),0);i.forEach(function(i){if(i.querySelector(".kint-microtime-lap")){var t=i.getAttribute("data-kint-microtime-group"),e=parseFloat(i.querySelector(".kint-microtime-lap").innerHTML),r=parseFloat(i.querySelector(".kint-microtime-avg").innerHTML);void 0===c[t]&&(c[t]={}),(void 0===c[t].min||c[t].min>e)&&(c[t].min=e),(void 0===c[t].max||c[t].maxdl dl{padding:0 0 0 12px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMCAxNTAiPjxnIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0iI0ZGRiI+PHBhdGggZD0iTTEgMWgyOHYyOEgxem01IDE0aDE4bS05IDlWNk0xIDYxaDI4djI4SDF6bTUgMTRoMTgiIHN0cm9rZT0iIzM3OSIvPjxwYXRoIGQ9Ik0xIDMxaDI4djI4SDF6bTUgMTRoMThtLTkgOVYzNk0xIDkxaDI4djI4SDF6bTUgMTRoMTgiIHN0cm9rZT0iIzVBMyIvPjxwYXRoIGQ9Ik0xIDEyMWgyOHYyOEgxem01IDVsMTggMThtLTE4IDBsMTgtMTgiIHN0cm9rZT0iI0NDQyIvPjwvZz48L3N2Zz4=") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #b6cedb}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#0092db;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:#5cb730}.kint-rich dfn{font-style:normal;font-family:monospace;color:#1d1e1e}.kint-rich pre{color:#1d1e1e;margin:0 0 0 12px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #b6cedb;background:#e0eaef;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(29,30,30,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#e0eaef;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#1d1e1e;background:#e0eaef}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #b6cedb;border-top-width:0;border-bottom-width:0;padding:4px;float:right !important;margin:-4px 0;color:#1d1e1e;background:#c1d4df;height:24px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#d0d0d0;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#e8e8e8}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#c1d4df;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#1d1e1e}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#1d1e1e;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#1d1e1e;border-bottom:1px dotted #1d1e1e}.kint-rich ul{list-style:none;padding-left:12px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #b6cedb}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 12px;padding-left:0;background:#e0eaef;border:1px solid #b6cedb;border-top:0}.kint-rich ul.kint-tabs>li{background:#c1d4df;border:1px solid #b6cedb;cursor:pointer;display:inline-block;height:24px;margin:2px;padding:0 12px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#0092db;color:#5cb730}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#e0eaef;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:20px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#0092db;color:#5cb730}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #b6cedb;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#0092db}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #b6cedb;padding:2px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#c1d4df;color:#1d1e1e}.kint-rich table td{background:#e0eaef;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #0092db inset}.kint-rich table tr:hover var{color:#5cb730}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:4px;padding-bottom:4px;border-bottom:1px solid #c1d4df}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #0092db;padding-right:8px;margin-right:8px}.kint-rich pre.kint-source>div.kint-highlight{background:#c1d4df}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #0092db,0 1px #0092db,1px 0 #0092db,0 -1px #0092db;color:#e0eaef;font-weight:bold}.kint-rich>dl>dt{background:linear-gradient(to bottom, #e3ecf0 0, #c0d4df 100%)}.kint-rich ul.kint-tabs{background:linear-gradient(to bottom, #9dbed0 0px, #b2ccda 100%)}.kint-rich>dl:not(.kint-trace)>dd>ul.kint-tabs li{background:#e0eaef}.kint-rich>dl:not(.kint-trace)>dd>ul.kint-tabs li.kint-active-tab{background:#c1d4df}.kint-rich>dl.kint-trace>dt{background:linear-gradient(to bottom, #c0d4df 0px, #e3ecf0 100%)}.kint-rich .kint-source .kint-highlight{background:#f0eb96} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/plain.css b/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/plain.css deleted file mode 100644 index ba1eba0..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/plain.css +++ /dev/null @@ -1 +0,0 @@ -.kint-plain{background:rgba(255,255,255,0.9);white-space:pre;display:block;font-family:monospace;color:#222}.kint-plain i{color:#d00;font-style:normal}.kint-plain u{color:#030;text-decoration:none;font-weight:bold}.kint-plain .kint-microtime-lap{font-weight:bold;text-shadow:1px 0 #fff, 0 1px #fff, -1px 0 #fff, 0 -1px #fff} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/plain.js b/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/plain.js deleted file mode 100644 index 9791fc9..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/plain.js +++ /dev/null @@ -1 +0,0 @@ -void 0===window.kintPlain&&(window.kintPlain=function(){"use strict";var i={initLoad:function(){i.style=window.kintShared.dedupe("style.kint-plain-style",i.style),i.script=window.kintShared.dedupe("script.kint-plain-script",i.script)},style:null,script:null};return i}()),window.kintShared.runOnce(window.kintPlain.initLoad); diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/rich.js b/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/rich.js deleted file mode 100644 index 18fb072..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/rich.js +++ /dev/null @@ -1 +0,0 @@ -void 0===window.kintRich&&(window.kintRich=function(){"use strict";var n={selectText:function(e){var t=window.getSelection(),a=document.createRange();a.selectNodeContents(e),t.removeAllRanges(),t.addRange(a)},each:function(e,t){Array.prototype.slice.call(document.querySelectorAll(e),0).forEach(t)},hasClass:function(e,t){return!!e.classList&&(void 0===t&&(t="kint-show"),e.classList.contains(t))},addClass:function(e,t){void 0===t&&(t="kint-show"),e.classList.add(t)},removeClass:function(e,t){return void 0===t&&(t="kint-show"),e.classList.remove(t),e},toggle:function(e,t){var a=n.getChildren(e);a&&(void 0===t&&(t=n.hasClass(e)),t?n.removeClass(e):n.addClass(e),1===a.childNodes.length&&(a=a.childNodes[0].childNodes[0])&&n.hasClass(a,"kint-parent")&&n.toggle(a,t))},toggleChildren:function(e,t){var a=n.getChildren(e);if(a){var r=a.getElementsByClassName("kint-parent"),o=r.length;for(void 0===t&&(t=!n.hasClass(e));o--;)n.toggle(r[o],t)}},toggleAll:function(e){for(var t=document.getElementsByClassName("kint-parent"),a=t.length,r=!n.hasClass(e.parentNode);a--;)n.toggle(t[a],r)},switchTab:function(e){var t,a=e.previousSibling,r=0;for(n.removeClass(e.parentNode.getElementsByClassName("kint-active-tab")[0],"kint-active-tab"),n.addClass(e,"kint-active-tab");a;)1===a.nodeType&&r++,a=a.previousSibling;t=e.parentNode.nextSibling.childNodes;for(var o=0;o"},openInNewWindow:function(e){var t=window.open();t&&(t.document.open(),t.document.write(n.mktag("html")+n.mktag("head")+n.mktag("title")+"Kint ("+(new Date).toISOString()+")"+n.mktag("/title")+n.mktag('meta charset="utf-8"')+document.getElementsByClassName("kint-rich-script")[0].outerHTML+document.getElementsByClassName("kint-rich-style")[0].outerHTML+n.mktag("/head")+n.mktag("body")+'
'+e.parentNode.outerHTML+"
"+n.mktag("/body")),t.document.close())},sortTable:function(e,a){var t=e.tBodies[0];[].slice.call(e.tBodies[0].rows).sort(function(e,t){if(e=e.cells[a].textContent.trim().toLocaleLowerCase(),t=t.cells[a].textContent.trim().toLocaleLowerCase(),isNaN(e)||isNaN(t)){if(isNaN(e)&&!isNaN(t))return 1;if(isNaN(t)&&!isNaN(e))return-1}else e=parseFloat(e),t=parseFloat(t);return eli:not(.kint-active-tab)",function(e){0===e.offsetWidth&&0===e.offsetHeight||n.keyboardNav.targets.push(e)})},sync:function(e){var t=document.querySelector(".kint-focused");if(t&&n.removeClass(t,"kint-focused"),n.keyboardNav.active){var a=n.keyboardNav.targets[n.keyboardNav.target];n.addClass(a,"kint-focused"),e||n.keyboardNav.scroll(a)}},scroll:function(e){var t=function(e){return e.offsetTop+(e.offsetParent?t(e.offsetParent):0)},a=t(e);if(n.folder){var r=n.folder.querySelector("dd.kint-folder");r.scrollTo(0,a-r.clientHeight/2)}else window.scrollTo(0,a-window.innerHeight/2)},moveCursor:function(e){for(n.keyboardNav.target+=e;n.keyboardNav.target<0;)n.keyboardNav.target+=n.keyboardNav.targets.length;for(;n.keyboardNav.target>=n.keyboardNav.targets.length;)n.keyboardNav.target-=n.keyboardNav.targets.length;n.keyboardNav.sync()},setCursor:function(e){n.keyboardNav.fetchTargets();for(var t=0;tdl dl{padding:0 0 0 15px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMzAgMTUwIj48ZGVmcz48cGF0aCBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNNCAzYTI0IDMyIDAgMCAxIDAgMjQgNDAgMjAtMTAgMCAxIDIzLTEyQTQwIDIwIDEwIDAgMSA0IDN6IiBpZD0iYSIvPjwvZGVmcz48ZyBmaWxsPSIjOTNhMWExIiBzdHJva2U9IiM5M2ExYTEiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxnIGZpbGw9IiM1ODZlNzUiIHN0cm9rZT0iIzU4NmU3NSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzMCkiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxwYXRoIGQ9Ik02IDEyNmwxOCAxOG0tMTggMGwxOC0xOCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9IiM1ODZlNzUiLz48L3N2Zz4=") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #586e75}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#268bd2;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:#2aa198}.kint-rich dfn{font-style:normal;font-family:monospace;color:#93a1a1}.kint-rich pre{color:#839496;margin:0 0 0 15px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #586e75;background:#002b36;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(131,148,150,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#002b36;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#839496;background:#002b36}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #586e75;border-top-width:0;border-bottom-width:0;padding:5px;float:right !important;margin:-5px 0;color:#93a1a1;background:#073642;height:26px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#252525;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#1b1b1b}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#073642;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#839496}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#839496;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#93a1a1;border-bottom:1px dotted #93a1a1}.kint-rich ul{list-style:none;padding-left:15px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #586e75}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 15px;padding-left:0;background:#002b36;border:1px solid #586e75;border-top:0}.kint-rich ul.kint-tabs>li{background:#073642;border:1px solid #586e75;cursor:pointer;display:inline-block;height:30px;margin:3px;padding:0 15px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#268bd2;color:#2aa198}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#002b36;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:25px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#268bd2;color:#2aa198}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #586e75;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#268bd2}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2.5px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #586e75;padding:2.5px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#073642;color:#93a1a1}.kint-rich table td{background:#002b36;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #268bd2 inset}.kint-rich table tr:hover var{color:#2aa198}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:5px;padding-bottom:5px;border-bottom:1px solid #073642}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #268bd2;padding-right:10px;margin-right:10px}.kint-rich pre.kint-source>div.kint-highlight{background:#073642}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #268bd2,0 1px #268bd2,1px 0 #268bd2,0 -1px #268bd2;color:#002b36;font-weight:bold}body{background:#073642;color:#fff}.kint-rich{box-shadow:0 0 5px 3px #073642}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #859900 inset;border-radius:7px}.kint-rich>dl>dt,.kint-rich ul.kint-tabs{box-shadow:4px 0 2px -3px #268bd2 inset}.kint-rich ul.kint-tabs li.kint-active-tab{padding-top:7px;height:34px}.kint-rich footer li{color:#ddd} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/solarized.css b/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/solarized.css deleted file mode 100644 index db5da0d..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/Kint/resources/compiled/solarized.css +++ /dev/null @@ -1 +0,0 @@ -.kint-rich{font-size:13px;overflow-x:auto;white-space:nowrap;background:rgba(255,255,255,0.9)}.kint-rich.kint-folder{position:fixed;bottom:0;left:0;right:0;z-index:999999;width:100%;margin:0;display:none}.kint-rich.kint-folder.kint-show{display:block}.kint-rich.kint-folder dd.kint-folder{max-height:calc(100vh - 100px);padding-right:10px;overflow-y:scroll}.kint-rich::selection,.kint-rich::-moz-selection,.kint-rich::-webkit-selection{background:#268bd2;color:#657b83}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #2aa198}.kint-rich,.kint-rich::before,.kint-rich::after,.kint-rich *,.kint-rich *::before,.kint-rich *::after{box-sizing:border-box;border-radius:0;color:#657b83;float:none !important;font-family:Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;line-height:15px;margin:0;padding:0;text-align:left}.kint-rich{margin:10px 0}.kint-rich dt,.kint-rich dl{width:auto}.kint-rich dt,.kint-rich div.access-path{background:#fdf6e3;border:1px solid #93a1a1;color:#657b83;display:block;font-weight:bold;list-style:none outside none;overflow:auto;padding:5px}.kint-rich dt:hover,.kint-rich div.access-path:hover{border-color:#268bd2}.kint-rich>dl dl{padding:0 0 0 15px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMzAgMTUwIj48ZGVmcz48cGF0aCBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNNCAzYTI0IDMyIDAgMCAxIDAgMjQgNDAgMjAtMTAgMCAxIDIzLTEyQTQwIDIwIDEwIDAgMSA0IDN6IiBpZD0iYSIvPjwvZGVmcz48ZyBmaWxsPSIjOTNhMWExIiBzdHJva2U9IiM5M2ExYTEiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxnIGZpbGw9IiM1ODZlNzUiIHN0cm9rZT0iIzU4NmU3NSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzMCkiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxwYXRoIGQ9Ik02IDEyNmwxOCAxOG0tMTggMGwxOC0xOCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9IiM1ODZlNzUiLz48L3N2Zz4=") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #93a1a1}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#268bd2;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:#2aa198}.kint-rich dfn{font-style:normal;font-family:monospace;color:#586e75}.kint-rich pre{color:#657b83;margin:0 0 0 15px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #93a1a1;background:#fdf6e3;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(101,123,131,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#fdf6e3;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#657b83;background:#fdf6e3}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #93a1a1;border-top-width:0;border-bottom-width:0;padding:5px;float:right !important;margin:-5px 0;color:#586e75;background:#eee8d5;height:26px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#e2e2e2;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#f0f0f0}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#eee8d5;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#657b83}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#657b83;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#586e75;border-bottom:1px dotted #586e75}.kint-rich ul{list-style:none;padding-left:15px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #93a1a1}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 15px;padding-left:0;background:#fdf6e3;border:1px solid #93a1a1;border-top:0}.kint-rich ul.kint-tabs>li{background:#eee8d5;border:1px solid #93a1a1;cursor:pointer;display:inline-block;height:30px;margin:3px;padding:0 15px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#268bd2;color:#2aa198}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#fdf6e3;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:25px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#268bd2;color:#2aa198}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #93a1a1;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#268bd2}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2.5px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #93a1a1;padding:2.5px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#eee8d5;color:#586e75}.kint-rich table td{background:#fdf6e3;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #268bd2 inset}.kint-rich table tr:hover var{color:#2aa198}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:5px;padding-bottom:5px;border-bottom:1px solid #eee8d5}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #268bd2;padding-right:10px;margin-right:10px}.kint-rich pre.kint-source>div.kint-highlight{background:#eee8d5}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #268bd2,0 1px #268bd2,1px 0 #268bd2,0 -1px #268bd2;color:#fdf6e3;font-weight:bold}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #859900 inset;border-radius:7px}.kint-rich>dl>dt,.kint-rich ul.kint-tabs{box-shadow:4px 0 2px -3px #268bd2 inset}.kint-rich ul.kint-tabs li.kint-active-tab{padding-top:7px;height:34px} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/AbstractLogger.php b/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/AbstractLogger.php deleted file mode 100644 index d5106da..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/AbstractLogger.php +++ /dev/null @@ -1,120 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * @return null - */ - public function alert($message, array $context = []) - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * @return null - */ - public function critical($message, array $context = []) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * @return null - */ - public function error($message, array $context = []) - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * @return null - */ - public function warning($message, array $context = []) - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * @return null - */ - public function notice($message, array $context = []) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * @return null - */ - public function info($message, array $context = []) - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * @return null - */ - public function debug($message, array $context = []) - { - $this->log(LogLevel::DEBUG, $message, $context); - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/InvalidArgumentException.php b/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/InvalidArgumentException.php deleted file mode 100644 index 67f852d..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/InvalidArgumentException.php +++ /dev/null @@ -1,7 +0,0 @@ -logger = $logger; - } -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/LoggerInterface.php b/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/LoggerInterface.php deleted file mode 100644 index 20c7ff0..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/LoggerInterface.php +++ /dev/null @@ -1,112 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * @return null - */ - public function alert($message, array $context = []) - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * @return null - */ - public function critical($message, array $context = []) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * @return null - */ - public function error($message, array $context = []) - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * @return null - */ - public function warning($message, array $context = []) - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * @return null - */ - public function notice($message, array $context = []) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * @return null - */ - public function info($message, array $context = []) - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * @return null - */ - public function debug($message, array $context = []) - { - $this->log(LogLevel::DEBUG, $message, $context); - } - - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * @return null - */ - abstract public function log($level, $message, array $context = []); -} diff --git a/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/NullLogger.php b/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/NullLogger.php deleted file mode 100644 index e47d4b9..0000000 --- a/vendor/codeigniter4/framework/system/ThirdParty/PSR/Log/NullLogger.php +++ /dev/null @@ -1,27 +0,0 @@ -logger) { }` - * blocks. - */ -class NullLogger extends AbstractLogger -{ - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * @return null - */ - public function log($level, $message, array $context = []) - { - // noop - } -} diff --git a/vendor/codeigniter4/framework/system/Throttle/Throttler.php b/vendor/codeigniter4/framework/system/Throttle/Throttler.php deleted file mode 100644 index c843434..0000000 --- a/vendor/codeigniter4/framework/system/Throttle/Throttler.php +++ /dev/null @@ -1,212 +0,0 @@ -cache = $cache; - } - - //-------------------------------------------------------------------- - - /** - * Returns the number of seconds until the next available token will - * be released for usage. - * - * @return integer - */ - public function getTokenTime(): int - { - return $this->tokenTime; - } - - //-------------------------------------------------------------------- - - /** - * Restricts the number of requests made by a single IP address within - * a set number of seconds. - * - * Example: - * - * if (! $throttler->check($request->ipAddress(), 60, MINUTE)) - * { - * die('You submitted over 60 requests within a minute.'); - * } - * - * @param string $key The name to use as the "bucket" name. - * @param integer $capacity The number of requests the "bucket" can hold - * @param integer $seconds The time it takes the "bucket" to completely refill - * @param integer $cost The number of tokens this action uses. - * - * @return boolean - * @internal param int $maxRequests - */ - public function check(string $key, int $capacity, int $seconds, int $cost = 1): bool - { - $tokenName = $this->prefix . $key; - - // Check to see if the bucket has even been created yet. - if (($tokens = $this->cache->get($tokenName)) === null) - { - // If it hasn't been created, then we'll set it to the maximum - // capacity - 1, and save it to the cache. - $this->cache->save($tokenName, $capacity - $cost, $seconds); - $this->cache->save($tokenName . 'Time', time(), $seconds); - - return true; - } - - // If $tokens > 0, then we need to replenish the bucket - // based on how long it's been since the last update. - $throttleTime = $this->cache->get($tokenName . 'Time'); - $elapsed = $this->time() - $throttleTime; - - // Number of tokens to add back per second - $rate = $capacity / $seconds; - - // How many seconds till a new token is available. - // We must have a minimum wait of 1 second for a new token. - // Primarily stored to allow devs to report back to users. - $newTokenAvailable = (1 / $rate) - $elapsed; - $this->tokenTime = max(1, $newTokenAvailable); - - // Add tokens based up on number per second that - // should be refilled, then checked against capacity - // to be sure the bucket didn't overflow. - $tokens += $rate * $elapsed; - $tokens = $tokens > $capacity ? $capacity : $tokens; - - // If $tokens >= 1, then we are safe to perform the action, but - // we need to decrement the number of available tokens. - if ($tokens >= 1) - { - $this->cache->save($tokenName, $tokens - $cost, $seconds); - $this->cache->save($tokenName . 'Time', time(), $seconds); - - return true; - } - - return false; - } - - //-------------------------------------------------------------------- - - /** - * Used during testing to set the current timestamp to use. - * - * @param integer $time - * - * @return $this - */ - public function setTestTime(int $time) - { - $this->testTime = $time; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Return the test time, defaulting to current. - * - * @return integer - */ - public function time(): int - { - return $this->testTime ?? time(); - } -} diff --git a/vendor/codeigniter4/framework/system/Throttle/ThrottlerInterface.php b/vendor/codeigniter4/framework/system/Throttle/ThrottlerInterface.php deleted file mode 100644 index ef7d787..0000000 --- a/vendor/codeigniter4/framework/system/Throttle/ThrottlerInterface.php +++ /dev/null @@ -1,76 +0,0 @@ -checkIPAddress($request->ipAddress(), 60, MINUTE)) - * { - * die('You submitted over 60 requests within a minute.'); - * } - * - * @param string $key The name to use as the "bucket" name. - * @param integer $capacity The number of requests the "bucket" can hold - * @param integer $seconds The time it takes the "bucket" to completely refill - * @param integer $cost The number of tokens this action uses. - * - * @return boolean - */ - public function check(string $key, int $capacity, int $seconds, int $cost); - - //-------------------------------------------------------------------- - - /** - * Returns the number of seconds until the next available token will - * be released for usage. - * - * @return integer - */ - public function getTokenTime(): int; -} diff --git a/vendor/codeigniter4/framework/system/Typography/Typography.php b/vendor/codeigniter4/framework/system/Typography/Typography.php deleted file mode 100644 index 4e632d2..0000000 --- a/vendor/codeigniter4/framework/system/Typography/Typography.php +++ /dev/null @@ -1,408 +0,0 @@ - tags - * - * @var string - */ - public $blockElements = 'address|blockquote|div|dl|fieldset|form|h\d|hr|noscript|object|ol|p|pre|script|table|ul'; - - /** - * Elements that should not have

and
tags within them. - * - * @var string - */ - public $skipElements = 'p|pre|ol|ul|dl|object|table|h\d'; - - /** - * Tags we want the parser to completely ignore when splitting the string. - * - * @var string - */ - public $inlineElements = 'a|abbr|acronym|b|bdo|big|br|button|cite|code|del|dfn|em|i|img|ins|input|label|map|kbd|q|samp|select|small|span|strong|sub|sup|textarea|tt|var'; - - /** - * array of block level elements that require inner content to be within another block level element - * - * @var array - */ - public $innerBlockRequired = ['blockquote']; - - /** - * the last block element parsed - * - * @var string - */ - public $lastBlockElement = ''; - - /** - * whether or not to protect quotes within { curly braces } - * - * @var boolean - */ - public $protectBracedQuotes = false; - - /** - * Auto Typography - * - * This function converts text, making it typographically correct: - * - Converts double spaces into paragraphs. - * - Converts single line breaks into
tags - * - Converts single and double quotes into correctly facing curly quote entities. - * - Converts three dots into ellipsis. - * - Converts double dashes into em-dashes. - * - Converts two spaces into entities - * - * @param string $str - * @param boolean $reduce_linebreaks whether to reduce more then two consecutive newlines to two - * - * @return string - */ - public function autoTypography(string $str, bool $reduce_linebreaks = false): string - { - if ($str === '') - { - return ''; - } - - // Standardize Newlines to make matching easier - if (strpos($str, "\r") !== false) - { - $str = str_replace(["\r\n", "\r"], "\n", $str); - } - - // Reduce line breaks. If there are more than two consecutive linebreaks - // we'll compress them down to a maximum of two since there's no benefit to more. - if ($reduce_linebreaks === false) - { - $str = preg_replace("/\n\n+/", "\n\n", $str); - } - - // HTML comment tags don't conform to patterns of normal tags, so pull them out separately, only if needed - $html_comments = []; - if (strpos($str, '' . PHP_EOL - . $output . PHP_EOL - . '' . PHP_EOL; - } - } - - // Should we cache? - if (isset($this->renderVars['options']['cache'])) - { - cache()->save($this->renderVars['cacheName'], $output, (int) $this->renderVars['options']['cache']); - } - - $this->tempData = null; - - return $output; - } - - //-------------------------------------------------------------------- - - /** - * Builds the output based upon a string and any - * data that has already been set. - * Cache does not apply, because there is no "key". - * - * @param string $view The view contents - * @param array $options Reserved for 3rd-party uses since - * it might be needed to pass additional info - * to other template engines. - * @param boolean $saveData If true, will save data for use with any other calls, - * if false, will clean the data after displaying the view, - * if not specified, use the config setting. - * - * @return string - */ - public function renderString(string $view, array $options = null, bool $saveData = null): string - { - $start = microtime(true); - - if (is_null($saveData)) - { - $saveData = $this->saveData; - } - - if (is_null($this->tempData)) - { - $this->tempData = $this->data; - } - - extract($this->tempData); - - if ($saveData) - { - $this->data = $this->tempData; - } - - ob_start(); - $incoming = '?>' . $view; - eval($incoming); - $output = ob_get_contents(); - @ob_end_clean(); - - $this->logPerformance($start, microtime(true), $this->excerpt($view)); - - $this->tempData = null; - - return $output; - } - - //-------------------------------------------------------------------- - - /** - * Extract first bit of a long string and add ellipsis - * - * @param string $string - * @param integer $length - * @return string - */ - public function excerpt(string $string, int $length = 20): string - { - return (strlen($string) > $length) ? substr($string, 0, $length - 3) . '...' : $string; - } - - //-------------------------------------------------------------------- - - /** - * Sets several pieces of view data at once. - * - * @param array $data - * @param string $context The context to escape it for: html, css, js, url - * If null, no escaping will happen - * - * @return RendererInterface - */ - public function setData(array $data = [], string $context = null): RendererInterface - { - if (! empty($context)) - { - $data = \esc($data, $context); - } - - $this->tempData = $this->tempData ?? $this->data; - $this->tempData = array_merge($this->tempData, $data); - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Sets a single piece of view data. - * - * @param string $name - * @param mixed $value - * @param string $context The context to escape it for: html, css, js, url - * If null, no escaping will happen - * - * @return RendererInterface - */ - public function setVar(string $name, $value = null, string $context = null): RendererInterface - { - if (! empty($context)) - { - $value = \esc($value, $context); - } - - $this->tempData = $this->tempData ?? $this->data; - $this->tempData[$name] = $value; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Removes all of the view data from the system. - * - * @return RendererInterface - */ - public function resetData(): RendererInterface - { - $this->data = []; - - return $this; - } - - //-------------------------------------------------------------------- - - /** - * Returns the current data that will be displayed in the view. - * - * @return array - */ - public function getData(): array - { - return is_null($this->tempData) ? $this->data : $this->tempData; - } - - //-------------------------------------------------------------------- - - /** - * Specifies that the current view should extend an existing layout. - * - * @param string $layout - * - * @return void - */ - public function extend(string $layout) - { - $this->layout = $layout; - } - - //-------------------------------------------------------------------- - - /** - * Starts holds content for a section within the layout. - * - * @param string $name - */ - public function section(string $name) - { - $this->currentSection = $name; - - ob_start(); - } - - //-------------------------------------------------------------------- - - /** - * - * - * @throws \Laminas\Escaper\Exception\RuntimeException - */ - public function endSection() - { - $contents = ob_get_clean(); - - if (empty($this->currentSection)) - { - throw new \RuntimeException('View themes, no current section.'); - } - - // Ensure an array exists so we can store multiple entries for this. - if (! array_key_exists($this->currentSection, $this->sections)) - { - $this->sections[$this->currentSection] = []; - } - $this->sections[$this->currentSection][] = $contents; - - $this->currentSection = null; - } - - //-------------------------------------------------------------------- - - /** - * Renders a section's contents. - * - * @param string $sectionName - */ - public function renderSection(string $sectionName) - { - if (! isset($this->sections[$sectionName])) - { - echo ''; - - return; - } - - foreach ($this->sections[$sectionName] as $key => $contents) - { - echo $contents; - unset($this->sections[$sectionName][$key]); - } - } - - //-------------------------------------------------------------------- - - /** - * Used within layout views to include additional views. - * - * @param string $view - * @param array|null $options - * @param null $saveData - * - * @return string - */ - public function include(string $view, array $options = null, $saveData = true): string - { - return $this->render($view, $options, $saveData); - } - - //-------------------------------------------------------------------- - - /** - * Returns the performance data that might have been collected - * during the execution. Used primarily in the Debug Toolbar. - * - * @return array - */ - public function getPerformanceData(): array - { - return $this->performanceData; - } - - //-------------------------------------------------------------------- - - /** - * Logs performance data for rendering a view. - * - * @param float $start - * @param float $end - * @param string $view - */ - protected function logPerformance(float $start, float $end, string $view) - { - if (! $this->debug) - { - return; - } - - $this->performanceData[] = [ - 'start' => $start, - 'end' => $end, - 'view' => $view, - ]; - } - - //-------------------------------------------------------------------- -} diff --git a/vendor/codeigniter4/framework/system/bootstrap.php b/vendor/codeigniter4/framework/system/bootstrap.php deleted file mode 100644 index 9298baf..0000000 --- a/vendor/codeigniter4/framework/system/bootstrap.php +++ /dev/null @@ -1,183 +0,0 @@ -appDirectory) . DIRECTORY_SEPARATOR); -} - -/** - * The path to the project root directory. Just above APPPATH. - */ -if (! defined('ROOTPATH')) -{ - define('ROOTPATH', realpath(APPPATH . '../') . DIRECTORY_SEPARATOR); -} - -/** - * The path to the system directory. - */ -if (! defined('SYSTEMPATH')) -{ - define('SYSTEMPATH', realpath($paths->systemDirectory) . DIRECTORY_SEPARATOR); -} - -/** - * The path to the writable directory. - */ -if (! defined('WRITEPATH')) -{ - define('WRITEPATH', realpath($paths->writableDirectory) . DIRECTORY_SEPARATOR); -} - -/** - * The path to the tests directory - */ -if (! defined('TESTPATH')) -{ - define('TESTPATH', realpath($paths->testsDirectory) . DIRECTORY_SEPARATOR); -} - -/* - * --------------------------------------------------------------- - * GRAB OUR CONSTANTS & COMMON - * --------------------------------------------------------------- - */ -if (! defined('APP_NAMESPACE')) -{ - require_once APPPATH . 'Config/Constants.php'; -} - -// Let's see if an app/Common.php file exists -if (file_exists(APPPATH . 'Common.php')) -{ - require_once APPPATH . 'Common.php'; -} - -// Require system/Common.php -require_once SYSTEMPATH . 'Common.php'; - -/* - * --------------------------------------------------------------- - * LOAD OUR AUTOLOADER - * --------------------------------------------------------------- - * - * The autoloader allows all of the pieces to work together - * in the framework. We have to load it here, though, so - * that the config files can use the path constants. - */ - -if (! class_exists(Config\Autoload::class, false)) -{ - require_once SYSTEMPATH . 'Config/AutoloadConfig.php'; - require_once APPPATH . 'Config/Autoload.php'; - require_once SYSTEMPATH . 'Modules/Modules.php'; - require_once APPPATH . 'Config/Modules.php'; -} - -require_once SYSTEMPATH . 'Autoloader/Autoloader.php'; -require_once SYSTEMPATH . 'Config/BaseService.php'; -require_once SYSTEMPATH . 'Config/Services.php'; -require_once APPPATH . 'Config/Services.php'; - -// Use Config\Services as CodeIgniter\Services -if (! class_exists('CodeIgniter\Services', false)) -{ - class_alias('Config\Services', 'CodeIgniter\Services'); -} - -$loader = CodeIgniter\Services::autoloader(); -$loader->initialize(new Config\Autoload(), new Config\Modules()); -$loader->register(); // Register the loader with the SPL autoloader stack. - -// Now load Composer's if it's available -if (is_file(COMPOSER_PATH)) -{ - /** - * The path to the vendor directory. - * - * We do not want to enforce this, so set the constant if Composer was used. - */ - if (! defined('VENDORPATH')) - { - define('VENDORPATH', realpath(ROOTPATH . 'vendor') . DIRECTORY_SEPARATOR); - } - - require_once COMPOSER_PATH; -} - -// Load environment settings from .env files -// into $_SERVER and $_ENV -require_once SYSTEMPATH . 'Config/DotEnv.php'; - -$env = new \CodeIgniter\Config\DotEnv(ROOTPATH); -$env->load(); - -// Always load the URL helper - -// it should be used in 90% of apps. -helper('url'); - -/* - * --------------------------------------------------------------- - * GRAB OUR CODEIGNITER INSTANCE - * --------------------------------------------------------------- - * - * The CodeIgniter class contains the core functionality to make - * the application run, and does all of the dirty work to get - * the pieces all working together. - */ - -$appConfig = config(\Config\App::class); -$app = new \CodeIgniter\CodeIgniter($appConfig); -$app->initialize(); - -return $app; diff --git a/vendor/codeigniter4/framework/system/index.html b/vendor/codeigniter4/framework/system/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor/codeigniter4/framework/system/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - diff --git a/vendor/codeigniter4/framework/writable/.htaccess b/vendor/codeigniter4/framework/writable/.htaccess deleted file mode 100644 index f24db0a..0000000 --- a/vendor/codeigniter4/framework/writable/.htaccess +++ /dev/null @@ -1,6 +0,0 @@ - - Require all denied - - - Deny from all - diff --git a/vendor/codeigniter4/framework/writable/cache/index.html b/vendor/codeigniter4/framework/writable/cache/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor/codeigniter4/framework/writable/cache/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - diff --git a/vendor/codeigniter4/framework/writable/logs/index.html b/vendor/codeigniter4/framework/writable/logs/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor/codeigniter4/framework/writable/logs/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - diff --git a/vendor/codeigniter4/framework/writable/session/index.html b/vendor/codeigniter4/framework/writable/session/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor/codeigniter4/framework/writable/session/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - diff --git a/vendor/codeigniter4/framework/writable/uploads/index.html b/vendor/codeigniter4/framework/writable/uploads/index.html deleted file mode 100644 index b702fbc..0000000 --- a/vendor/codeigniter4/framework/writable/uploads/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 403 Forbidden - - - -

Directory access is forbidden.

- - - diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php deleted file mode 100644 index 1a58957..0000000 --- a/vendor/composer/ClassLoader.php +++ /dev/null @@ -1,445 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see https://www.php-fig.org/psr/psr-0/ - * @see https://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - private $classMapAuthoritative = false; - private $missingClasses = array(); - private $apcuPrefix; - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php deleted file mode 100644 index 868816a..0000000 --- a/vendor/composer/InstalledVersions.php +++ /dev/null @@ -1,671 +0,0 @@ - - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '564771da7a8141a515df1af578a2f793f6b03d37', - 'name' => 'codeigniter4/appstarter', - ), - 'versions' => - array ( - 'codeigniter4/appstarter' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '564771da7a8141a515df1af578a2f793f6b03d37', - ), - 'codeigniter4/framework' => - array ( - 'pretty_version' => 'v4.0.4', - 'version' => '4.0.4.0', - 'aliases' => - array ( - ), - 'reference' => '1edcf84f77ff794640fddbfc59a10a024cd15b50', - ), - 'doctrine/instantiator' => - array ( - 'pretty_version' => '1.3.1', - 'version' => '1.3.1.0', - 'aliases' => - array ( - ), - 'reference' => 'f350df0268e904597e3bd9c4685c53e0e333feea', - ), - 'dompdf/dompdf' => - array ( - 'pretty_version' => 'v0.8.6', - 'version' => '0.8.6.0', - 'aliases' => - array ( - ), - 'reference' => 'db91d81866c69a42dad1d2926f61515a1e3f42c5', - ), - 'fzaninotto/faker' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - 0 => '1.9.x-dev', - ), - 'reference' => 'ac73e5287024f5e98dd6d0bf10e6a6f7877b7513', - ), - 'kint-php/kint' => - array ( - 'pretty_version' => '3.3', - 'version' => '3.3.0.0', - 'aliases' => - array ( - ), - 'reference' => '335ac1bcaf04d87df70d8aa51e8887ba2c6d203b', - ), - 'laminas/laminas-escaper' => - array ( - 'pretty_version' => '2.6.1', - 'version' => '2.6.1.0', - 'aliases' => - array ( - ), - 'reference' => '25f2a053eadfa92ddacb609dcbbc39362610da70', - ), - 'laminas/laminas-zendframework-bridge' => - array ( - 'pretty_version' => '1.1.1', - 'version' => '1.1.1.0', - 'aliases' => - array ( - ), - 'reference' => '6ede70583e101030bcace4dcddd648f760ddf642', - ), - 'maennchen/zipstream-php' => - array ( - 'pretty_version' => '2.1.0', - 'version' => '2.1.0.0', - 'aliases' => - array ( - ), - 'reference' => 'c4c5803cc1f93df3d2448478ef79394a5981cc58', - ), - 'markbaker/complex' => - array ( - 'pretty_version' => '2.0.0', - 'version' => '2.0.0.0', - 'aliases' => - array ( - ), - 'reference' => '9999f1432fae467bc93c53f357105b4c31bb994c', - ), - 'markbaker/matrix' => - array ( - 'pretty_version' => '2.0.0', - 'version' => '2.0.0.0', - 'aliases' => - array ( - ), - 'reference' => '9567d9c4c519fbe40de01dbd1e4469dbbb66f46a', - ), - 'mikey179/vfsstream' => - array ( - 'pretty_version' => 'v1.6.8', - 'version' => '1.6.8.0', - 'aliases' => - array ( - ), - 'reference' => '231c73783ebb7dd9ec77916c10037eff5a2b6efe', - ), - 'myclabs/deep-copy' => - array ( - 'pretty_version' => '1.10.1', - 'version' => '1.10.1.0', - 'aliases' => - array ( - ), - 'reference' => '969b211f9a51aa1f6c01d1d2aef56d3bd91598e5', - 'replaced' => - array ( - 0 => '1.10.1', - ), - ), - 'myclabs/php-enum' => - array ( - 'pretty_version' => '1.7.7', - 'version' => '1.7.7.0', - 'aliases' => - array ( - ), - 'reference' => 'd178027d1e679832db9f38248fcc7200647dc2b7', - ), - 'phar-io/manifest' => - array ( - 'pretty_version' => '1.0.3', - 'version' => '1.0.3.0', - 'aliases' => - array ( - ), - 'reference' => '7761fcacf03b4d4f16e7ccb606d4879ca431fcf4', - ), - 'phar-io/version' => - array ( - 'pretty_version' => '2.0.1', - 'version' => '2.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '45a2ec53a73c70ce41d55cedef9063630abaf1b6', - ), - 'phenx/php-font-lib' => - array ( - 'pretty_version' => '0.5.2', - 'version' => '0.5.2.0', - 'aliases' => - array ( - ), - 'reference' => 'ca6ad461f032145fff5971b5985e5af9e7fa88d8', - ), - 'phenx/php-svg-lib' => - array ( - 'pretty_version' => 'v0.3.3', - 'version' => '0.3.3.0', - 'aliases' => - array ( - ), - 'reference' => '5fa61b65e612ce1ae15f69b3d223cb14ecc60e32', - ), - 'phpdocumentor/reflection-common' => - array ( - 'pretty_version' => '2.2.0', - 'version' => '2.2.0.0', - 'aliases' => - array ( - ), - 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', - ), - 'phpdocumentor/reflection-docblock' => - array ( - 'pretty_version' => '5.2.2', - 'version' => '5.2.2.0', - 'aliases' => - array ( - ), - 'reference' => '069a785b2141f5bcf49f3e353548dc1cce6df556', - ), - 'phpdocumentor/type-resolver' => - array ( - 'pretty_version' => '1.4.0', - 'version' => '1.4.0.0', - 'aliases' => - array ( - ), - 'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0', - ), - 'phpoffice/phpspreadsheet' => - array ( - 'pretty_version' => '1.15.0', - 'version' => '1.15.0.0', - 'aliases' => - array ( - ), - 'reference' => 'a8e8068b31b8119e1daa5b1eb5715a3a8ea8305f', - ), - 'phpspec/prophecy' => - array ( - 'pretty_version' => '1.12.1', - 'version' => '1.12.1.0', - 'aliases' => - array ( - ), - 'reference' => '8ce87516be71aae9b956f81906aaf0338e0d8a2d', - ), - 'phpunit/php-code-coverage' => - array ( - 'pretty_version' => '7.0.10', - 'version' => '7.0.10.0', - 'aliases' => - array ( - ), - 'reference' => 'f1884187926fbb755a9aaf0b3836ad3165b478bf', - ), - 'phpunit/php-file-iterator' => - array ( - 'pretty_version' => '2.0.2', - 'version' => '2.0.2.0', - 'aliases' => - array ( - ), - 'reference' => '050bedf145a257b1ff02746c31894800e5122946', - ), - 'phpunit/php-text-template' => - array ( - 'pretty_version' => '1.2.1', - 'version' => '1.2.1.0', - 'aliases' => - array ( - ), - 'reference' => '31f8b717e51d9a2afca6c9f046f5d69fc27c8686', - ), - 'phpunit/php-timer' => - array ( - 'pretty_version' => '2.1.2', - 'version' => '2.1.2.0', - 'aliases' => - array ( - ), - 'reference' => '1038454804406b0b5f5f520358e78c1c2f71501e', - ), - 'phpunit/php-token-stream' => - array ( - 'pretty_version' => '3.1.1', - 'version' => '3.1.1.0', - 'aliases' => - array ( - ), - 'reference' => '995192df77f63a59e47f025390d2d1fdf8f425ff', - ), - 'phpunit/phpunit' => - array ( - 'pretty_version' => '8.5.8', - 'version' => '8.5.8.0', - 'aliases' => - array ( - ), - 'reference' => '34c18baa6a44f1d1fbf0338907139e9dce95b997', - ), - 'psr/http-client' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621', - ), - 'psr/http-factory' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be', - ), - 'psr/http-message' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', - ), - 'psr/log' => - array ( - 'pretty_version' => '1.1.3', - 'version' => '1.1.3.0', - 'aliases' => - array ( - ), - 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', - ), - 'psr/simple-cache' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', - ), - 'sabberworm/php-css-parser' => - array ( - 'pretty_version' => '8.3.1', - 'version' => '8.3.1.0', - 'aliases' => - array ( - ), - 'reference' => 'd217848e1396ef962fb1997cf3e2421acba7f796', - ), - 'sebastian/code-unit-reverse-lookup' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '4419fcdb5eabb9caa61a27c7a1db532a6b55dd18', - ), - 'sebastian/comparator' => - array ( - 'pretty_version' => '3.0.2', - 'version' => '3.0.2.0', - 'aliases' => - array ( - ), - 'reference' => '5de4fc177adf9bce8df98d8d141a7559d7ccf6da', - ), - 'sebastian/diff' => - array ( - 'pretty_version' => '3.0.2', - 'version' => '3.0.2.0', - 'aliases' => - array ( - ), - 'reference' => '720fcc7e9b5cf384ea68d9d930d480907a0c1a29', - ), - 'sebastian/environment' => - array ( - 'pretty_version' => '4.2.3', - 'version' => '4.2.3.0', - 'aliases' => - array ( - ), - 'reference' => '464c90d7bdf5ad4e8a6aea15c091fec0603d4368', - ), - 'sebastian/exporter' => - array ( - 'pretty_version' => '3.1.2', - 'version' => '3.1.2.0', - 'aliases' => - array ( - ), - 'reference' => '68609e1261d215ea5b21b7987539cbfbe156ec3e', - ), - 'sebastian/global-state' => - array ( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'aliases' => - array ( - ), - 'reference' => 'edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4', - ), - 'sebastian/object-enumerator' => - array ( - 'pretty_version' => '3.0.3', - 'version' => '3.0.3.0', - 'aliases' => - array ( - ), - 'reference' => '7cfd9e65d11ffb5af41198476395774d4c8a84c5', - ), - 'sebastian/object-reflector' => - array ( - 'pretty_version' => '1.1.1', - 'version' => '1.1.1.0', - 'aliases' => - array ( - ), - 'reference' => '773f97c67f28de00d397be301821b06708fca0be', - ), - 'sebastian/recursion-context' => - array ( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'aliases' => - array ( - ), - 'reference' => '5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8', - ), - 'sebastian/resource-operations' => - array ( - 'pretty_version' => '2.0.1', - 'version' => '2.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '4d7a795d35b889bf80a0cc04e08d77cedfa917a9', - ), - 'sebastian/type' => - array ( - 'pretty_version' => '1.1.3', - 'version' => '1.1.3.0', - 'aliases' => - array ( - ), - 'reference' => '3aaaa15fa71d27650d62a948be022fe3b48541a3', - ), - 'sebastian/version' => - array ( - 'pretty_version' => '2.0.1', - 'version' => '2.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '99732be0ddb3361e16ad77b68ba41efc8e979019', - ), - 'symfony/polyfill-ctype' => - array ( - 'pretty_version' => 'v1.18.1', - 'version' => '1.18.1.0', - 'aliases' => - array ( - ), - 'reference' => '1c302646f6efc070cd46856e600e5e0684d6b454', - ), - 'symfony/polyfill-mbstring' => - array ( - 'pretty_version' => 'v1.20.0', - 'version' => '1.20.0.0', - 'aliases' => - array ( - ), - 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531', - ), - 'theseer/tokenizer' => - array ( - 'pretty_version' => '1.2.0', - 'version' => '1.2.0.0', - 'aliases' => - array ( - ), - 'reference' => '75a63c33a8577608444246075ea0af0d052e452a', - ), - 'webmozart/assert' => - array ( - 'pretty_version' => '1.9.1', - 'version' => '1.9.1.0', - 'aliases' => - array ( - ), - 'reference' => 'bafc69caeb4d49c39fd0779086c03a3738cbb389', - ), - 'zendframework/zend-escaper' => - array ( - 'replaced' => - array ( - 0 => '2.6.1', - ), - ), - ), -); - - - - - - - -public static function getInstalledPackages() -{ -return array_keys(self::$installed['versions']); -} - - - - - - - - - -public static function isInstalled($packageName) -{ -return isset(self::$installed['versions'][$packageName]); -} - - - - - - - - - - - - - - -public static function satisfies(VersionParser $parser, $packageName, $constraint) -{ -$constraint = $parser->parseConstraints($constraint); -$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - -return $provided->matches($constraint); -} - - - - - - - - - - -public static function getVersionRanges($packageName) -{ -if (!isset(self::$installed['versions'][$packageName])) { -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - -$ranges = array(); -if (isset(self::$installed['versions'][$packageName]['pretty_version'])) { -$ranges[] = self::$installed['versions'][$packageName]['pretty_version']; -} -if (array_key_exists('aliases', self::$installed['versions'][$packageName])) { -$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']); -} -if (array_key_exists('replaced', self::$installed['versions'][$packageName])) { -$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']); -} -if (array_key_exists('provided', self::$installed['versions'][$packageName])) { -$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']); -} - -return implode(' || ', $ranges); -} - - - - - -public static function getVersion($packageName) -{ -if (!isset(self::$installed['versions'][$packageName])) { -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - -if (!isset(self::$installed['versions'][$packageName]['version'])) { -return null; -} - -return self::$installed['versions'][$packageName]['version']; -} - - - - - -public static function getPrettyVersion($packageName) -{ -if (!isset(self::$installed['versions'][$packageName])) { -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - -if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) { -return null; -} - -return self::$installed['versions'][$packageName]['pretty_version']; -} - - - - - -public static function getReference($packageName) -{ -if (!isset(self::$installed['versions'][$packageName])) { -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - -if (!isset(self::$installed['versions'][$packageName]['reference'])) { -return null; -} - -return self::$installed['versions'][$packageName]['reference']; -} - - - - - -public static function getRootPackage() -{ -return self::$installed['root']; -} - - - - - - - -public static function getRawData() -{ -return self::$installed; -} - - - - - - - - - - - - - - - - - - - -public static function reload($data) -{ -self::$installed = $data; -} -} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE deleted file mode 100644 index f27399a..0000000 --- a/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php deleted file mode 100644 index b026fc7..0000000 --- a/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,595 +0,0 @@ - $vendorDir . '/composer/InstalledVersions.php', - 'Dompdf\\Cpdf' => $vendorDir . '/dompdf/dompdf/lib/Cpdf.php', - 'HTML5_Data' => $vendorDir . '/dompdf/dompdf/lib/html5lib/Data.php', - 'HTML5_InputStream' => $vendorDir . '/dompdf/dompdf/lib/html5lib/InputStream.php', - 'HTML5_Parser' => $vendorDir . '/dompdf/dompdf/lib/html5lib/Parser.php', - 'HTML5_Tokenizer' => $vendorDir . '/dompdf/dompdf/lib/html5lib/Tokenizer.php', - 'HTML5_TreeBuilder' => $vendorDir . '/dompdf/dompdf/lib/html5lib/TreeBuilder.php', - 'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', - 'PHPUnit\\Framework\\Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', - 'PHPUnit\\Framework\\AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', - 'PHPUnit\\Framework\\CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', - 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', - 'PHPUnit\\Framework\\Constraint\\ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', - 'PHPUnit\\Framework\\Constraint\\Attribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', - 'PHPUnit\\Framework\\Constraint\\Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', - 'PHPUnit\\Framework\\Constraint\\ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', - 'PHPUnit\\Framework\\Constraint\\ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', - 'PHPUnit\\Framework\\Constraint\\Composite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', - 'PHPUnit\\Framework\\Constraint\\Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', - 'PHPUnit\\Framework\\Constraint\\Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Count.php', - 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php', - 'PHPUnit\\Framework\\Constraint\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessageRegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', - 'PHPUnit\\Framework\\Constraint\\GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', - 'PHPUnit\\Framework\\Constraint\\IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', - 'PHPUnit\\Framework\\Constraint\\IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', - 'PHPUnit\\Framework\\Constraint\\IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', - 'PHPUnit\\Framework\\Constraint\\IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', - 'PHPUnit\\Framework\\Constraint\\IsFinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php', - 'PHPUnit\\Framework\\Constraint\\IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\IsInfinite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php', - 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', - 'PHPUnit\\Framework\\Constraint\\IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', - 'PHPUnit\\Framework\\Constraint\\IsNan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php', - 'PHPUnit\\Framework\\Constraint\\IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', - 'PHPUnit\\Framework\\Constraint\\IsReadable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php', - 'PHPUnit\\Framework\\Constraint\\IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', - 'PHPUnit\\Framework\\Constraint\\IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', - 'PHPUnit\\Framework\\Constraint\\IsWritable' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php', - 'PHPUnit\\Framework\\Constraint\\JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', - 'PHPUnit\\Framework\\Constraint\\JsonMatchesErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php', - 'PHPUnit\\Framework\\Constraint\\LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', - 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php', - 'PHPUnit\\Framework\\Constraint\\LogicalNot' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php', - 'PHPUnit\\Framework\\Constraint\\LogicalOr' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php', - 'PHPUnit\\Framework\\Constraint\\LogicalXor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php', - 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', - 'PHPUnit\\Framework\\Constraint\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', - 'PHPUnit\\Framework\\Constraint\\StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', - 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', - 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php', - 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', - 'PHPUnit\\Framework\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php', - 'PHPUnit\\Framework\\DataProviderTestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', - 'PHPUnit\\Framework\\Error\\Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', - 'PHPUnit\\Framework\\Error\\Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Error.php', - 'PHPUnit\\Framework\\Error\\Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php', - 'PHPUnit\\Framework\\Error\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php', - 'PHPUnit\\Framework\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Exception.php', - 'PHPUnit\\Framework\\ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', - 'PHPUnit\\Framework\\ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', - 'PHPUnit\\Framework\\IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php', - 'PHPUnit\\Framework\\IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', - 'PHPUnit\\Framework\\IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php', - 'PHPUnit\\Framework\\InvalidArgumentException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', - 'PHPUnit\\Framework\\InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', - 'PHPUnit\\Framework\\InvalidDataProviderException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', - 'PHPUnit\\Framework\\InvalidParameterGroupException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php', - 'PHPUnit\\Framework\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php', - 'PHPUnit\\Framework\\MockObject\\Api' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/Api.php', - 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', - 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', - 'PHPUnit\\Framework\\MockObject\\ConfigurableMethodsAlreadyInitializedException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php', - 'PHPUnit\\Framework\\MockObject\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Generator' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', - 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', - 'PHPUnit\\Framework\\MockObject\\Invocation' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Invocation.php', - 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php', - 'PHPUnit\\Framework\\MockObject\\Matcher' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', - 'PHPUnit\\Framework\\MockObject\\Method' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/Method.php', - 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php', - 'PHPUnit\\Framework\\MockObject\\MockBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', - 'PHPUnit\\Framework\\MockObject\\MockClass' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockClass.php', - 'PHPUnit\\Framework\\MockObject\\MockMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockMethod.php', - 'PHPUnit\\Framework\\MockObject\\MockMethodSet' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php', - 'PHPUnit\\Framework\\MockObject\\MockObject' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', - 'PHPUnit\\Framework\\MockObject\\MockTrait' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockTrait.php', - 'PHPUnit\\Framework\\MockObject\\MockType' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/MockType.php', - 'PHPUnit\\Framework\\MockObject\\MockedCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtIndex' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php', - 'PHPUnit\\Framework\\MockObject\\RuntimeException' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', - 'PHPUnit\\Framework\\MockObject\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php', - 'PHPUnit\\Framework\\MockObject\\UnmockedCloneMethod' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\Verifiable' => $vendorDir . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', - 'PHPUnit\\Framework\\NoChildTestSuiteException' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', - 'PHPUnit\\Framework\\OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/OutputError.php', - 'PHPUnit\\Framework\\PHPTAssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php', - 'PHPUnit\\Framework\\RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php', - 'PHPUnit\\Framework\\SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', - 'PHPUnit\\Framework\\SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php', - 'PHPUnit\\Framework\\SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', - 'PHPUnit\\Framework\\SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php', - 'PHPUnit\\Framework\\SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php', - 'PHPUnit\\Framework\\SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SyntheticError.php', - 'PHPUnit\\Framework\\SyntheticSkippedError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php', - 'PHPUnit\\Framework\\Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php', - 'PHPUnit\\Framework\\TestBuilder' => $vendorDir . '/phpunit/phpunit/src/Framework/TestBuilder.php', - 'PHPUnit\\Framework\\TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php', - 'PHPUnit\\Framework\\TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php', - 'PHPUnit\\Framework\\TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php', - 'PHPUnit\\Framework\\TestListenerDefaultImplementation' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php', - 'PHPUnit\\Framework\\TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php', - 'PHPUnit\\Framework\\TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php', - 'PHPUnit\\Framework\\TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', - 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php', - 'PHPUnit\\Framework\\Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception/Warning.php', - 'PHPUnit\\Framework\\WarningTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/WarningTestCase.php', - 'PHPUnit\\Runner\\AfterIncompleteTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', - 'PHPUnit\\Runner\\AfterLastTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', - 'PHPUnit\\Runner\\AfterRiskyTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', - 'PHPUnit\\Runner\\AfterSkippedTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', - 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', - 'PHPUnit\\Runner\\AfterTestErrorHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', - 'PHPUnit\\Runner\\AfterTestFailureHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', - 'PHPUnit\\Runner\\AfterTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php', - 'PHPUnit\\Runner\\AfterTestWarningHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', - 'PHPUnit\\Runner\\BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', - 'PHPUnit\\Runner\\BeforeFirstTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', - 'PHPUnit\\Runner\\BeforeTestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', - 'PHPUnit\\Runner\\DefaultTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/DefaultTestResultCache.php', - 'PHPUnit\\Runner\\Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php', - 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', - 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', - 'PHPUnit\\Runner\\Hook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/Hook.php', - 'PHPUnit\\Runner\\NullTestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/NullTestResultCache.php', - 'PHPUnit\\Runner\\PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Runner/PhptTestCase.php', - 'PHPUnit\\Runner\\ResultCacheExtension' => $vendorDir . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', - 'PHPUnit\\Runner\\StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', - 'PHPUnit\\Runner\\TestHook' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', - 'PHPUnit\\Runner\\TestListenerAdapter' => $vendorDir . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', - 'PHPUnit\\Runner\\TestResultCache' => $vendorDir . '/phpunit/phpunit/src/Runner/TestResultCache.php', - 'PHPUnit\\Runner\\TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', - 'PHPUnit\\Runner\\TestSuiteSorter' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', - 'PHPUnit\\Runner\\Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', - 'PHPUnit\\TextUI\\Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php', - 'PHPUnit\\TextUI\\Exception' => $vendorDir . '/phpunit/phpunit/src/TextUI/Exception.php', - 'PHPUnit\\TextUI\\Help' => $vendorDir . '/phpunit/phpunit/src/TextUI/Help.php', - 'PHPUnit\\TextUI\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', - 'PHPUnit\\TextUI\\TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php', - 'PHPUnit\\Util\\Annotation\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', - 'PHPUnit\\Util\\Annotation\\Registry' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/Registry.php', - 'PHPUnit\\Util\\Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php', - 'PHPUnit\\Util\\Color' => $vendorDir . '/phpunit/phpunit/src/Util/Color.php', - 'PHPUnit\\Util\\Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php', - 'PHPUnit\\Util\\ConfigurationGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', - 'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', - 'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception.php', - 'PHPUnit\\Util\\FileLoader' => $vendorDir . '/phpunit/phpunit/src/Util/FileLoader.php', - 'PHPUnit\\Util\\Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', - 'PHPUnit\\Util\\Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', - 'PHPUnit\\Util\\Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php', - 'PHPUnit\\Util\\GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', - 'PHPUnit\\Util\\InvalidDataSetException' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidDataSetException.php', - 'PHPUnit\\Util\\Json' => $vendorDir . '/phpunit/phpunit/src/Util/Json.php', - 'PHPUnit\\Util\\Log\\JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php', - 'PHPUnit\\Util\\Log\\TeamCity' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TeamCity.php', - 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', - 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', - 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', - 'PHPUnit\\Util\\Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', - 'PHPUnit\\Util\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Util/RegularExpression.php', - 'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', - 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', - 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', - 'PHPUnit\\Util\\TestDox\\ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\TestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php', - 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', - 'PHPUnit\\Util\\TextTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', - 'PHPUnit\\Util\\Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php', - 'PHPUnit\\Util\\VersionComparisonOperator' => $vendorDir . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', - 'PHPUnit\\Util\\XdebugFilterScriptGenerator' => $vendorDir . '/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php', - 'PHPUnit\\Util\\Xml' => $vendorDir . '/phpunit/phpunit/src/Util/Xml.php', - 'PHPUnit\\Util\\XmlTestListRenderer' => $vendorDir . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', - 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ABSTRACT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AMPERSAND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AND_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOLEAN_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOL_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BREAK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CALLABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CARET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CASE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CATCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS_NAME_CONSTANT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLONE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COALESCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COALESCE_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONTINUE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CURLY_OPEN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DEC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DEFAULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIV' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIV_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOC_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOLLAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_QUOTES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELLIPSIS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELSE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELSEIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EMPTY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENCAPSED_AND_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDDECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDFOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDFOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXTENDS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FINAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FINALLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FUNC_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GLOBAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GOTO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INLINE_HTML' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INSTANCEOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INSTEADOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INTERFACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ISSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_GREATER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_NOT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_XOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_METHOD_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MINUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MINUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MOD_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MUL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NAMESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_TAG_WITH_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PERCENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PIPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PLUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PLUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_POW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_POW_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PRINT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PRIVATE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PROTECTED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PUBLIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_QUESTION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_REQUIRE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_START_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STATIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php', - 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', - 'PHP_Token_THROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TILDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_USE_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Util' => $vendorDir . '/phpunit/php-token-stream/src/Token/Util.php', - 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', - 'PharIo\\Manifest\\Application' => $vendorDir . '/phar-io/manifest/src/values/Application.php', - 'PharIo\\Manifest\\ApplicationName' => $vendorDir . '/phar-io/manifest/src/values/ApplicationName.php', - 'PharIo\\Manifest\\Author' => $vendorDir . '/phar-io/manifest/src/values/Author.php', - 'PharIo\\Manifest\\AuthorCollection' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollection.php', - 'PharIo\\Manifest\\AuthorCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', - 'PharIo\\Manifest\\AuthorElement' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElement.php', - 'PharIo\\Manifest\\AuthorElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/AuthorElementCollection.php', - 'PharIo\\Manifest\\BundledComponent' => $vendorDir . '/phar-io/manifest/src/values/BundledComponent.php', - 'PharIo\\Manifest\\BundledComponentCollection' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollection.php', - 'PharIo\\Manifest\\BundledComponentCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', - 'PharIo\\Manifest\\BundlesElement' => $vendorDir . '/phar-io/manifest/src/xml/BundlesElement.php', - 'PharIo\\Manifest\\ComponentElement' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElement.php', - 'PharIo\\Manifest\\ComponentElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ComponentElementCollection.php', - 'PharIo\\Manifest\\ContainsElement' => $vendorDir . '/phar-io/manifest/src/xml/ContainsElement.php', - 'PharIo\\Manifest\\CopyrightElement' => $vendorDir . '/phar-io/manifest/src/xml/CopyrightElement.php', - 'PharIo\\Manifest\\CopyrightInformation' => $vendorDir . '/phar-io/manifest/src/values/CopyrightInformation.php', - 'PharIo\\Manifest\\ElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ElementCollection.php', - 'PharIo\\Manifest\\Email' => $vendorDir . '/phar-io/manifest/src/values/Email.php', - 'PharIo\\Manifest\\Exception' => $vendorDir . '/phar-io/manifest/src/exceptions/Exception.php', - 'PharIo\\Manifest\\ExtElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtElement.php', - 'PharIo\\Manifest\\ExtElementCollection' => $vendorDir . '/phar-io/manifest/src/xml/ExtElementCollection.php', - 'PharIo\\Manifest\\Extension' => $vendorDir . '/phar-io/manifest/src/values/Extension.php', - 'PharIo\\Manifest\\ExtensionElement' => $vendorDir . '/phar-io/manifest/src/xml/ExtensionElement.php', - 'PharIo\\Manifest\\InvalidApplicationNameException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', - 'PharIo\\Manifest\\InvalidEmailException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', - 'PharIo\\Manifest\\InvalidUrlException' => $vendorDir . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', - 'PharIo\\Manifest\\Library' => $vendorDir . '/phar-io/manifest/src/values/Library.php', - 'PharIo\\Manifest\\License' => $vendorDir . '/phar-io/manifest/src/values/License.php', - 'PharIo\\Manifest\\LicenseElement' => $vendorDir . '/phar-io/manifest/src/xml/LicenseElement.php', - 'PharIo\\Manifest\\Manifest' => $vendorDir . '/phar-io/manifest/src/values/Manifest.php', - 'PharIo\\Manifest\\ManifestDocument' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocument.php', - 'PharIo\\Manifest\\ManifestDocumentException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', - 'PharIo\\Manifest\\ManifestDocumentLoadingException' => $vendorDir . '/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php', - 'PharIo\\Manifest\\ManifestDocumentMapper' => $vendorDir . '/phar-io/manifest/src/ManifestDocumentMapper.php', - 'PharIo\\Manifest\\ManifestDocumentMapperException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', - 'PharIo\\Manifest\\ManifestElement' => $vendorDir . '/phar-io/manifest/src/xml/ManifestElement.php', - 'PharIo\\Manifest\\ManifestElementException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestElementException.php', - 'PharIo\\Manifest\\ManifestLoader' => $vendorDir . '/phar-io/manifest/src/ManifestLoader.php', - 'PharIo\\Manifest\\ManifestLoaderException' => $vendorDir . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', - 'PharIo\\Manifest\\ManifestSerializer' => $vendorDir . '/phar-io/manifest/src/ManifestSerializer.php', - 'PharIo\\Manifest\\PhpElement' => $vendorDir . '/phar-io/manifest/src/xml/PhpElement.php', - 'PharIo\\Manifest\\PhpExtensionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', - 'PharIo\\Manifest\\PhpVersionRequirement' => $vendorDir . '/phar-io/manifest/src/values/PhpVersionRequirement.php', - 'PharIo\\Manifest\\Requirement' => $vendorDir . '/phar-io/manifest/src/values/Requirement.php', - 'PharIo\\Manifest\\RequirementCollection' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollection.php', - 'PharIo\\Manifest\\RequirementCollectionIterator' => $vendorDir . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', - 'PharIo\\Manifest\\RequiresElement' => $vendorDir . '/phar-io/manifest/src/xml/RequiresElement.php', - 'PharIo\\Manifest\\Type' => $vendorDir . '/phar-io/manifest/src/values/Type.php', - 'PharIo\\Manifest\\Url' => $vendorDir . '/phar-io/manifest/src/values/Url.php', - 'PharIo\\Version\\AbstractVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', - 'PharIo\\Version\\AndVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', - 'PharIo\\Version\\AnyVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/AnyVersionConstraint.php', - 'PharIo\\Version\\ExactVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/ExactVersionConstraint.php', - 'PharIo\\Version\\Exception' => $vendorDir . '/phar-io/version/src/exceptions/Exception.php', - 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', - 'PharIo\\Version\\InvalidPreReleaseSuffixException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', - 'PharIo\\Version\\InvalidVersionException' => $vendorDir . '/phar-io/version/src/exceptions/InvalidVersionException.php', - 'PharIo\\Version\\OrVersionConstraintGroup' => $vendorDir . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', - 'PharIo\\Version\\PreReleaseSuffix' => $vendorDir . '/phar-io/version/src/PreReleaseSuffix.php', - 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', - 'PharIo\\Version\\SpecificMajorVersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', - 'PharIo\\Version\\UnsupportedVersionConstraintException' => $vendorDir . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', - 'PharIo\\Version\\Version' => $vendorDir . '/phar-io/version/src/Version.php', - 'PharIo\\Version\\VersionConstraint' => $vendorDir . '/phar-io/version/src/constraints/VersionConstraint.php', - 'PharIo\\Version\\VersionConstraintParser' => $vendorDir . '/phar-io/version/src/VersionConstraintParser.php', - 'PharIo\\Version\\VersionConstraintValue' => $vendorDir . '/phar-io/version/src/VersionConstraintValue.php', - 'PharIo\\Version\\VersionNumber' => $vendorDir . '/phar-io/version/src/VersionNumber.php', - 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', - 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Driver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PCOV' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PCOV.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', - 'SebastianBergmann\\CodeCoverage\\Exception' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/Exception.php', - 'SebastianBergmann\\CodeCoverage\\Filter' => $vendorDir . '/phpunit/php-code-coverage/src/Filter.php', - 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php', - 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => $vendorDir . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Builder.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Node\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Node/File.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/Node/Iterator.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Clover.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Crap4j.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', - 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => $vendorDir . '/phpunit/php-code-coverage/src/Report/PHP.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Text' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Text.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => $vendorDir . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', - 'SebastianBergmann\\CodeCoverage\\RuntimeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php', - 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', - 'SebastianBergmann\\CodeCoverage\\Util' => $vendorDir . '/phpunit/php-code-coverage/src/Util.php', - 'SebastianBergmann\\CodeCoverage\\Version' => $vendorDir . '/phpunit/php-code-coverage/src/Version.php', - 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => $vendorDir . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', - 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php', - 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php', - 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php', - 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php', - 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php', - 'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php', - 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php', - 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php', - 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php', - 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php', - 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php', - 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php', - 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php', - 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', - 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', - 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', - 'SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', - 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', - 'SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', - 'SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', - 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', - 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php', - 'SebastianBergmann\\Environment\\OperatingSystem' => $vendorDir . '/sebastian/environment/src/OperatingSystem.php', - 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', - 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', - 'SebastianBergmann\\FileIterator\\Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php', - 'SebastianBergmann\\FileIterator\\Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php', - 'SebastianBergmann\\FileIterator\\Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php', - 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php', - 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.php', - 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/exceptions/Exception.php', - 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php', - 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php', - 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => $vendorDir . '/sebastian/object-enumerator/src/Enumerator.php', - 'SebastianBergmann\\ObjectEnumerator\\Exception' => $vendorDir . '/sebastian/object-enumerator/src/Exception.php', - 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => $vendorDir . '/sebastian/object-enumerator/src/InvalidArgumentException.php', - 'SebastianBergmann\\ObjectReflector\\Exception' => $vendorDir . '/sebastian/object-reflector/src/Exception.php', - 'SebastianBergmann\\ObjectReflector\\InvalidArgumentException' => $vendorDir . '/sebastian/object-reflector/src/InvalidArgumentException.php', - 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => $vendorDir . '/sebastian/object-reflector/src/ObjectReflector.php', - 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php', - 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php', - 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php', - 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php', - 'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/Exception.php', - 'SebastianBergmann\\Timer\\RuntimeException' => $vendorDir . '/phpunit/php-timer/src/RuntimeException.php', - 'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php', - 'SebastianBergmann\\Type\\CallableType' => $vendorDir . '/sebastian/type/src/CallableType.php', - 'SebastianBergmann\\Type\\Exception' => $vendorDir . '/sebastian/type/src/exception/Exception.php', - 'SebastianBergmann\\Type\\GenericObjectType' => $vendorDir . '/sebastian/type/src/GenericObjectType.php', - 'SebastianBergmann\\Type\\IterableType' => $vendorDir . '/sebastian/type/src/IterableType.php', - 'SebastianBergmann\\Type\\NullType' => $vendorDir . '/sebastian/type/src/NullType.php', - 'SebastianBergmann\\Type\\ObjectType' => $vendorDir . '/sebastian/type/src/ObjectType.php', - 'SebastianBergmann\\Type\\RuntimeException' => $vendorDir . '/sebastian/type/src/exception/RuntimeException.php', - 'SebastianBergmann\\Type\\SimpleType' => $vendorDir . '/sebastian/type/src/SimpleType.php', - 'SebastianBergmann\\Type\\Type' => $vendorDir . '/sebastian/type/src/Type.php', - 'SebastianBergmann\\Type\\TypeName' => $vendorDir . '/sebastian/type/src/TypeName.php', - 'SebastianBergmann\\Type\\UnknownType' => $vendorDir . '/sebastian/type/src/UnknownType.php', - 'SebastianBergmann\\Type\\VoidType' => $vendorDir . '/sebastian/type/src/VoidType.php', - 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', - 'Text_Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php', - 'TheSeer\\Tokenizer\\Exception' => $vendorDir . '/theseer/tokenizer/src/Exception.php', - 'TheSeer\\Tokenizer\\NamespaceUri' => $vendorDir . '/theseer/tokenizer/src/NamespaceUri.php', - 'TheSeer\\Tokenizer\\NamespaceUriException' => $vendorDir . '/theseer/tokenizer/src/NamespaceUriException.php', - 'TheSeer\\Tokenizer\\Token' => $vendorDir . '/theseer/tokenizer/src/Token.php', - 'TheSeer\\Tokenizer\\TokenCollection' => $vendorDir . '/theseer/tokenizer/src/TokenCollection.php', - 'TheSeer\\Tokenizer\\TokenCollectionException' => $vendorDir . '/theseer/tokenizer/src/TokenCollectionException.php', - 'TheSeer\\Tokenizer\\Tokenizer' => $vendorDir . '/theseer/tokenizer/src/Tokenizer.php', - 'TheSeer\\Tokenizer\\XMLSerializer' => $vendorDir . '/theseer/tokenizer/src/XMLSerializer.php', -); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php deleted file mode 100644 index 48957ce..0000000 --- a/vendor/composer/autoload_files.php +++ /dev/null @@ -1,72 +0,0 @@ - $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', - '7e9bd612cc444b3eed788ebbe46263a0' => $vendorDir . '/laminas/laminas-zendframework-bridge/src/autoload.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', - '3917c79c5052b270641b5a200963dbc2' => $vendorDir . '/kint-php/kint/init.php', - 'abede361264e2ae69ec1eee813a101af' => $vendorDir . '/markbaker/complex/classes/src/functions/abs.php', - '21a5860fbef5be28db5ddfbc3cca67c4' => $vendorDir . '/markbaker/complex/classes/src/functions/acos.php', - '1546e3f9d127f2a9bb2d1b6c31c26ef1' => $vendorDir . '/markbaker/complex/classes/src/functions/acosh.php', - 'd2516f7f4fba5ea5905f494b4a8262e0' => $vendorDir . '/markbaker/complex/classes/src/functions/acot.php', - '4511163d560956219b96882c0980b65e' => $vendorDir . '/markbaker/complex/classes/src/functions/acoth.php', - 'c361f5616dc2a8da4fa3e137077cd4ea' => $vendorDir . '/markbaker/complex/classes/src/functions/acsc.php', - '02d68920fc98da71991ce569c91df0f6' => $vendorDir . '/markbaker/complex/classes/src/functions/acsch.php', - '88e19525eae308b4a6aa3419364875d3' => $vendorDir . '/markbaker/complex/classes/src/functions/argument.php', - '60e8e2d0827b58bfc904f13957e51849' => $vendorDir . '/markbaker/complex/classes/src/functions/asec.php', - '13d2f040713999eab66c359b4d79871d' => $vendorDir . '/markbaker/complex/classes/src/functions/asech.php', - '838ab38beb32c68a79d3cd2c007d5a04' => $vendorDir . '/markbaker/complex/classes/src/functions/asin.php', - 'bb28eccd0f8f008333a1b3c163d604ac' => $vendorDir . '/markbaker/complex/classes/src/functions/asinh.php', - '9e483de83558c98f7d3feaa402c78cb3' => $vendorDir . '/markbaker/complex/classes/src/functions/atan.php', - '36b74b5b765ded91ee58c8ee3c0e85e3' => $vendorDir . '/markbaker/complex/classes/src/functions/atanh.php', - '05c15ee9510da7fd6bf6136f436500c0' => $vendorDir . '/markbaker/complex/classes/src/functions/conjugate.php', - 'd3208dfbce2505e370788f9f22f6785f' => $vendorDir . '/markbaker/complex/classes/src/functions/cos.php', - '141cf1fb3a3046f8b64534b0ebab33ca' => $vendorDir . '/markbaker/complex/classes/src/functions/cosh.php', - 'be660df75fd0dbe7fa7c03b7434b3294' => $vendorDir . '/markbaker/complex/classes/src/functions/cot.php', - '01e31ea298a51bc9e91517e3ce6b9e76' => $vendorDir . '/markbaker/complex/classes/src/functions/coth.php', - '803ddd97f7b1da68982a7b087c3476f6' => $vendorDir . '/markbaker/complex/classes/src/functions/csc.php', - '3001cdfd101ec3c32da34ee43c2e149b' => $vendorDir . '/markbaker/complex/classes/src/functions/csch.php', - '77b2d7629ef2a93fabb8c56754a91051' => $vendorDir . '/markbaker/complex/classes/src/functions/exp.php', - '4a4471296dec796c21d4f4b6552396a9' => $vendorDir . '/markbaker/complex/classes/src/functions/inverse.php', - 'c3e9897e1744b88deb56fcdc39d34d85' => $vendorDir . '/markbaker/complex/classes/src/functions/ln.php', - 'a83cacf2de942cff288de15a83afd26d' => $vendorDir . '/markbaker/complex/classes/src/functions/log2.php', - '6a861dacc9ee2f3061241d4c7772fa21' => $vendorDir . '/markbaker/complex/classes/src/functions/log10.php', - '4d2522d968c8ba78d6c13548a1b4200e' => $vendorDir . '/markbaker/complex/classes/src/functions/negative.php', - 'fd587ca933fc0447fa5ab4843bdd97f7' => $vendorDir . '/markbaker/complex/classes/src/functions/pow.php', - '383ef01c62028fc78cd4388082fce3c2' => $vendorDir . '/markbaker/complex/classes/src/functions/rho.php', - '150fbd1b95029dc47292da97ecab9375' => $vendorDir . '/markbaker/complex/classes/src/functions/sec.php', - '549abd9bae174286d660bdaa07407c68' => $vendorDir . '/markbaker/complex/classes/src/functions/sech.php', - '6bfbf5eaea6b17a0ed85cb21ba80370c' => $vendorDir . '/markbaker/complex/classes/src/functions/sin.php', - '22efe13f1a497b8e199540ae2d9dc59c' => $vendorDir . '/markbaker/complex/classes/src/functions/sinh.php', - 'e90135ab8e787795a509ed7147de207d' => $vendorDir . '/markbaker/complex/classes/src/functions/sqrt.php', - 'bb0a7923ffc6a90919cd64ec54ff06bc' => $vendorDir . '/markbaker/complex/classes/src/functions/tan.php', - '2d302f32ce0fd4e433dd91c5bb404a28' => $vendorDir . '/markbaker/complex/classes/src/functions/tanh.php', - '24dd4658a952171a4ee79218c4f9fd06' => $vendorDir . '/markbaker/complex/classes/src/functions/theta.php', - 'e49b7876281d6f5bc39536dde96d1f4a' => $vendorDir . '/markbaker/complex/classes/src/operations/add.php', - '47596e02b43cd6da7700134fd08f88cf' => $vendorDir . '/markbaker/complex/classes/src/operations/subtract.php', - '883af48563631547925fa4c3b48ead07' => $vendorDir . '/markbaker/complex/classes/src/operations/multiply.php', - 'f190e3308e6ca23234a2875edc985c03' => $vendorDir . '/markbaker/complex/classes/src/operations/divideby.php', - 'ac9e33ce6841aa5bf5d16d465a2f03a7' => $vendorDir . '/markbaker/complex/classes/src/operations/divideinto.php', - '9d8e013a5160a09477beb8e44f8ae97b' => $vendorDir . '/markbaker/matrix/classes/src/functions/adjoint.php', - '6e78d1bdea6248d6aa117229efae50f2' => $vendorDir . '/markbaker/matrix/classes/src/functions/antidiagonal.php', - '4623d87924d94f5412fe5afbf1cef31d' => $vendorDir . '/markbaker/matrix/classes/src/functions/cofactors.php', - '901fd1f6950a637ca85f66b701a45e13' => $vendorDir . '/markbaker/matrix/classes/src/functions/determinant.php', - '83057abc0e4acc99ba80154ee5d02a49' => $vendorDir . '/markbaker/matrix/classes/src/functions/diagonal.php', - '07b7fd7a434451149b4fd477fca0ce06' => $vendorDir . '/markbaker/matrix/classes/src/functions/identity.php', - 'c8d43b340583e07ae89f2a3baef2cf89' => $vendorDir . '/markbaker/matrix/classes/src/functions/inverse.php', - '499bb10ed7a3aee2ba4c09a31a85e8d1' => $vendorDir . '/markbaker/matrix/classes/src/functions/minors.php', - '1cad2e6414d652e8b1c64e8967f6f37d' => $vendorDir . '/markbaker/matrix/classes/src/functions/trace.php', - '95a7f134ac17161d07def442b3b737e8' => $vendorDir . '/markbaker/matrix/classes/src/functions/transpose.php', - 'b3a6bc628377118d4b4b8ba08d1eb949' => $vendorDir . '/markbaker/matrix/classes/src/operations/add.php', - '5fef6d0e407f3f8887266dfa4a6c534c' => $vendorDir . '/markbaker/matrix/classes/src/operations/directsum.php', - '684ba247e1385946e3babdaa054119de' => $vendorDir . '/markbaker/matrix/classes/src/operations/subtract.php', - 'aa53dcba601214d17ad405b7c291b7e8' => $vendorDir . '/markbaker/matrix/classes/src/operations/multiply.php', - '75c79eb1b25749b05a47976f32b0d8a2' => $vendorDir . '/markbaker/matrix/classes/src/operations/divideby.php', - '6ab8ad87a734f276a6bcd5a0fe1289be' => $vendorDir . '/markbaker/matrix/classes/src/operations/divideinto.php', - '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', -); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php deleted file mode 100644 index 484189f..0000000 --- a/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,11 +0,0 @@ - array($vendorDir . '/mikey179/vfsstream/src/main/php'), - 'Sabberworm\\CSS' => array($vendorDir . '/sabberworm/php-css-parser/lib'), -); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php deleted file mode 100644 index 929271d..0000000 --- a/vendor/composer/autoload_psr4.php +++ /dev/null @@ -1,34 +0,0 @@ - array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'), - 'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'), - 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), - 'Tests\\Support\\' => array($baseDir . '/tests/_support'), - 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), - 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), - 'Svg\\' => array($vendorDir . '/phenx/php-svg-lib/src/Svg'), - 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), - 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), - 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), - 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'), - 'PhpOffice\\PhpSpreadsheet\\' => array($vendorDir . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet'), - 'MyCLabs\\Enum\\' => array($vendorDir . '/myclabs/php-enum/src'), - 'Matrix\\' => array($vendorDir . '/markbaker/matrix/classes/src'), - 'Laminas\\ZendFrameworkBridge\\' => array($vendorDir . '/laminas/laminas-zendframework-bridge/src'), - 'Laminas\\Escaper\\' => array($vendorDir . '/laminas/laminas-escaper/src'), - 'Kint\\' => array($vendorDir . '/kint-php/kint/src'), - 'FontLib\\' => array($vendorDir . '/phenx/php-font-lib/src/FontLib'), - 'Faker\\' => array($vendorDir . '/fzaninotto/faker/src/Faker'), - 'Dompdf\\' => array($vendorDir . '/dompdf/dompdf/src'), - 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), - 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), - 'Complex\\' => array($vendorDir . '/markbaker/complex/classes/src'), - 'CodeIgniter\\' => array($vendorDir . '/codeigniter4/framework/system'), -); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php deleted file mode 100644 index e275883..0000000 --- a/vendor/composer/autoload_real.php +++ /dev/null @@ -1,75 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInitbbfefea263758c542cf1b7e1de76aa47::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - if ($useStaticLoader) { - $includeFiles = Composer\Autoload\ComposerStaticInitbbfefea263758c542cf1b7e1de76aa47::$files; - } else { - $includeFiles = require __DIR__ . '/autoload_files.php'; - } - foreach ($includeFiles as $fileIdentifier => $file) { - composerRequirebbfefea263758c542cf1b7e1de76aa47($fileIdentifier, $file); - } - - return $loader; - } -} - -function composerRequirebbfefea263758c542cf1b7e1de76aa47($fileIdentifier, $file) -{ - if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - require $file; - - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - } -} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php deleted file mode 100644 index 3c8ef8c..0000000 --- a/vendor/composer/autoload_static.php +++ /dev/null @@ -1,861 +0,0 @@ - __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', - '7e9bd612cc444b3eed788ebbe46263a0' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/autoload.php', - '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', - '3917c79c5052b270641b5a200963dbc2' => __DIR__ . '/..' . '/kint-php/kint/init.php', - 'abede361264e2ae69ec1eee813a101af' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/abs.php', - '21a5860fbef5be28db5ddfbc3cca67c4' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acos.php', - '1546e3f9d127f2a9bb2d1b6c31c26ef1' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acosh.php', - 'd2516f7f4fba5ea5905f494b4a8262e0' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acot.php', - '4511163d560956219b96882c0980b65e' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acoth.php', - 'c361f5616dc2a8da4fa3e137077cd4ea' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acsc.php', - '02d68920fc98da71991ce569c91df0f6' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/acsch.php', - '88e19525eae308b4a6aa3419364875d3' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/argument.php', - '60e8e2d0827b58bfc904f13957e51849' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/asec.php', - '13d2f040713999eab66c359b4d79871d' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/asech.php', - '838ab38beb32c68a79d3cd2c007d5a04' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/asin.php', - 'bb28eccd0f8f008333a1b3c163d604ac' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/asinh.php', - '9e483de83558c98f7d3feaa402c78cb3' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/atan.php', - '36b74b5b765ded91ee58c8ee3c0e85e3' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/atanh.php', - '05c15ee9510da7fd6bf6136f436500c0' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/conjugate.php', - 'd3208dfbce2505e370788f9f22f6785f' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/cos.php', - '141cf1fb3a3046f8b64534b0ebab33ca' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/cosh.php', - 'be660df75fd0dbe7fa7c03b7434b3294' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/cot.php', - '01e31ea298a51bc9e91517e3ce6b9e76' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/coth.php', - '803ddd97f7b1da68982a7b087c3476f6' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/csc.php', - '3001cdfd101ec3c32da34ee43c2e149b' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/csch.php', - '77b2d7629ef2a93fabb8c56754a91051' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/exp.php', - '4a4471296dec796c21d4f4b6552396a9' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/inverse.php', - 'c3e9897e1744b88deb56fcdc39d34d85' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/ln.php', - 'a83cacf2de942cff288de15a83afd26d' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/log2.php', - '6a861dacc9ee2f3061241d4c7772fa21' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/log10.php', - '4d2522d968c8ba78d6c13548a1b4200e' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/negative.php', - 'fd587ca933fc0447fa5ab4843bdd97f7' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/pow.php', - '383ef01c62028fc78cd4388082fce3c2' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/rho.php', - '150fbd1b95029dc47292da97ecab9375' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/sec.php', - '549abd9bae174286d660bdaa07407c68' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/sech.php', - '6bfbf5eaea6b17a0ed85cb21ba80370c' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/sin.php', - '22efe13f1a497b8e199540ae2d9dc59c' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/sinh.php', - 'e90135ab8e787795a509ed7147de207d' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/sqrt.php', - 'bb0a7923ffc6a90919cd64ec54ff06bc' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/tan.php', - '2d302f32ce0fd4e433dd91c5bb404a28' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/tanh.php', - '24dd4658a952171a4ee79218c4f9fd06' => __DIR__ . '/..' . '/markbaker/complex/classes/src/functions/theta.php', - 'e49b7876281d6f5bc39536dde96d1f4a' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/add.php', - '47596e02b43cd6da7700134fd08f88cf' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/subtract.php', - '883af48563631547925fa4c3b48ead07' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/multiply.php', - 'f190e3308e6ca23234a2875edc985c03' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/divideby.php', - 'ac9e33ce6841aa5bf5d16d465a2f03a7' => __DIR__ . '/..' . '/markbaker/complex/classes/src/operations/divideinto.php', - '9d8e013a5160a09477beb8e44f8ae97b' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/adjoint.php', - '6e78d1bdea6248d6aa117229efae50f2' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/antidiagonal.php', - '4623d87924d94f5412fe5afbf1cef31d' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/cofactors.php', - '901fd1f6950a637ca85f66b701a45e13' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/determinant.php', - '83057abc0e4acc99ba80154ee5d02a49' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/diagonal.php', - '07b7fd7a434451149b4fd477fca0ce06' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/identity.php', - 'c8d43b340583e07ae89f2a3baef2cf89' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/inverse.php', - '499bb10ed7a3aee2ba4c09a31a85e8d1' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/minors.php', - '1cad2e6414d652e8b1c64e8967f6f37d' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/trace.php', - '95a7f134ac17161d07def442b3b737e8' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/functions/transpose.php', - 'b3a6bc628377118d4b4b8ba08d1eb949' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/add.php', - '5fef6d0e407f3f8887266dfa4a6c534c' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/directsum.php', - '684ba247e1385946e3babdaa054119de' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/subtract.php', - 'aa53dcba601214d17ad405b7c291b7e8' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/multiply.php', - '75c79eb1b25749b05a47976f32b0d8a2' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/divideby.php', - '6ab8ad87a734f276a6bcd5a0fe1289be' => __DIR__ . '/..' . '/markbaker/matrix/classes/src/operations/divideinto.php', - '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', - ); - - public static $prefixLengthsPsr4 = array ( - 'p' => - array ( - 'phpDocumentor\\Reflection\\' => 25, - ), - 'Z' => - array ( - 'ZipStream\\' => 10, - ), - 'W' => - array ( - 'Webmozart\\Assert\\' => 17, - ), - 'T' => - array ( - 'Tests\\Support\\' => 14, - ), - 'S' => - array ( - 'Symfony\\Polyfill\\Mbstring\\' => 26, - 'Symfony\\Polyfill\\Ctype\\' => 23, - 'Svg\\' => 4, - ), - 'P' => - array ( - 'Psr\\SimpleCache\\' => 16, - 'Psr\\Log\\' => 8, - 'Psr\\Http\\Message\\' => 17, - 'Psr\\Http\\Client\\' => 16, - 'Prophecy\\' => 9, - 'PhpOffice\\PhpSpreadsheet\\' => 25, - ), - 'M' => - array ( - 'MyCLabs\\Enum\\' => 13, - 'Matrix\\' => 7, - ), - 'L' => - array ( - 'Laminas\\ZendFrameworkBridge\\' => 28, - 'Laminas\\Escaper\\' => 16, - ), - 'K' => - array ( - 'Kint\\' => 5, - ), - 'F' => - array ( - 'FontLib\\' => 8, - 'Faker\\' => 6, - ), - 'D' => - array ( - 'Dompdf\\' => 7, - 'Doctrine\\Instantiator\\' => 22, - 'DeepCopy\\' => 9, - ), - 'C' => - array ( - 'Complex\\' => 8, - 'CodeIgniter\\' => 12, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'phpDocumentor\\Reflection\\' => - array ( - 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', - 1 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', - 2 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', - ), - 'ZipStream\\' => - array ( - 0 => __DIR__ . '/..' . '/maennchen/zipstream-php/src', - ), - 'Webmozart\\Assert\\' => - array ( - 0 => __DIR__ . '/..' . '/webmozart/assert/src', - ), - 'Tests\\Support\\' => - array ( - 0 => __DIR__ . '/../..' . '/tests/_support', - ), - 'Symfony\\Polyfill\\Mbstring\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', - ), - 'Symfony\\Polyfill\\Ctype\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', - ), - 'Svg\\' => - array ( - 0 => __DIR__ . '/..' . '/phenx/php-svg-lib/src/Svg', - ), - 'Psr\\SimpleCache\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/simple-cache/src', - ), - 'Psr\\Log\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', - ), - 'Psr\\Http\\Message\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/http-factory/src', - 1 => __DIR__ . '/..' . '/psr/http-message/src', - ), - 'Psr\\Http\\Client\\' => - array ( - 0 => __DIR__ . '/..' . '/psr/http-client/src', - ), - 'Prophecy\\' => - array ( - 0 => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy', - ), - 'PhpOffice\\PhpSpreadsheet\\' => - array ( - 0 => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet', - ), - 'MyCLabs\\Enum\\' => - array ( - 0 => __DIR__ . '/..' . '/myclabs/php-enum/src', - ), - 'Matrix\\' => - array ( - 0 => __DIR__ . '/..' . '/markbaker/matrix/classes/src', - ), - 'Laminas\\ZendFrameworkBridge\\' => - array ( - 0 => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src', - ), - 'Laminas\\Escaper\\' => - array ( - 0 => __DIR__ . '/..' . '/laminas/laminas-escaper/src', - ), - 'Kint\\' => - array ( - 0 => __DIR__ . '/..' . '/kint-php/kint/src', - ), - 'FontLib\\' => - array ( - 0 => __DIR__ . '/..' . '/phenx/php-font-lib/src/FontLib', - ), - 'Faker\\' => - array ( - 0 => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker', - ), - 'Dompdf\\' => - array ( - 0 => __DIR__ . '/..' . '/dompdf/dompdf/src', - ), - 'Doctrine\\Instantiator\\' => - array ( - 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator', - ), - 'DeepCopy\\' => - array ( - 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', - ), - 'Complex\\' => - array ( - 0 => __DIR__ . '/..' . '/markbaker/complex/classes/src', - ), - 'CodeIgniter\\' => - array ( - 0 => __DIR__ . '/..' . '/codeigniter4/framework/system', - ), - ); - - public static $prefixesPsr0 = array ( - 'o' => - array ( - 'org\\bovigo\\vfs\\' => - array ( - 0 => __DIR__ . '/..' . '/mikey179/vfsstream/src/main/php', - ), - ), - 'S' => - array ( - 'Sabberworm\\CSS' => - array ( - 0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib', - ), - ), - ); - - public static $classMap = array ( - 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'Dompdf\\Cpdf' => __DIR__ . '/..' . '/dompdf/dompdf/lib/Cpdf.php', - 'HTML5_Data' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/Data.php', - 'HTML5_InputStream' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/InputStream.php', - 'HTML5_Parser' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/Parser.php', - 'HTML5_Tokenizer' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/Tokenizer.php', - 'HTML5_TreeBuilder' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/TreeBuilder.php', - 'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', - 'PHPUnit\\Framework\\Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', - 'PHPUnit\\Framework\\AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php', - 'PHPUnit\\Framework\\CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php', - 'PHPUnit\\Framework\\Constraint\\ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', - 'PHPUnit\\Framework\\Constraint\\ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', - 'PHPUnit\\Framework\\Constraint\\Attribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', - 'PHPUnit\\Framework\\Constraint\\Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', - 'PHPUnit\\Framework\\Constraint\\ClassHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', - 'PHPUnit\\Framework\\Constraint\\ClassHasStaticAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', - 'PHPUnit\\Framework\\Constraint\\Composite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', - 'PHPUnit\\Framework\\Constraint\\Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Constraint.php', - 'PHPUnit\\Framework\\Constraint\\Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Count.php', - 'PHPUnit\\Framework\\Constraint\\DirectoryExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php', - 'PHPUnit\\Framework\\Constraint\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', - 'PHPUnit\\Framework\\Constraint\\ExceptionMessageRegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', - 'PHPUnit\\Framework\\Constraint\\GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', - 'PHPUnit\\Framework\\Constraint\\IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', - 'PHPUnit\\Framework\\Constraint\\IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', - 'PHPUnit\\Framework\\Constraint\\IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', - 'PHPUnit\\Framework\\Constraint\\IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', - 'PHPUnit\\Framework\\Constraint\\IsFinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFinite.php', - 'PHPUnit\\Framework\\Constraint\\IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\IsInfinite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php', - 'PHPUnit\\Framework\\Constraint\\IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', - 'PHPUnit\\Framework\\Constraint\\IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', - 'PHPUnit\\Framework\\Constraint\\IsNan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNan.php', - 'PHPUnit\\Framework\\Constraint\\IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', - 'PHPUnit\\Framework\\Constraint\\IsReadable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsReadable.php', - 'PHPUnit\\Framework\\Constraint\\IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', - 'PHPUnit\\Framework\\Constraint\\IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', - 'PHPUnit\\Framework\\Constraint\\IsWritable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsWritable.php', - 'PHPUnit\\Framework\\Constraint\\JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', - 'PHPUnit\\Framework\\Constraint\\JsonMatchesErrorMessageProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php', - 'PHPUnit\\Framework\\Constraint\\LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', - 'PHPUnit\\Framework\\Constraint\\LogicalAnd' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php', - 'PHPUnit\\Framework\\Constraint\\LogicalNot' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php', - 'PHPUnit\\Framework\\Constraint\\LogicalOr' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php', - 'PHPUnit\\Framework\\Constraint\\LogicalXor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php', - 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', - 'PHPUnit\\Framework\\Constraint\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php', - 'PHPUnit\\Framework\\Constraint\\SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', - 'PHPUnit\\Framework\\Constraint\\StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', - 'PHPUnit\\Framework\\Constraint\\StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', - 'PHPUnit\\Framework\\Constraint\\StringMatchesFormatDescription' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php', - 'PHPUnit\\Framework\\Constraint\\StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php', - 'PHPUnit\\Framework\\Constraint\\TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', - 'PHPUnit\\Framework\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php', - 'PHPUnit\\Framework\\DataProviderTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/DataProviderTestSuite.php', - 'PHPUnit\\Framework\\Error\\Deprecated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', - 'PHPUnit\\Framework\\Error\\Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Error.php', - 'PHPUnit\\Framework\\Error\\Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Notice.php', - 'PHPUnit\\Framework\\Error\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Warning.php', - 'PHPUnit\\Framework\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Exception.php', - 'PHPUnit\\Framework\\ExceptionWrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', - 'PHPUnit\\Framework\\ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php', - 'PHPUnit\\Framework\\IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTest.php', - 'PHPUnit\\Framework\\IncompleteTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', - 'PHPUnit\\Framework\\IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php', - 'PHPUnit\\Framework\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php', - 'PHPUnit\\Framework\\InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php', - 'PHPUnit\\Framework\\InvalidDataProviderException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php', - 'PHPUnit\\Framework\\InvalidParameterGroupException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php', - 'PHPUnit\\Framework\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php', - 'PHPUnit\\Framework\\MockObject\\Api' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/Api.php', - 'PHPUnit\\Framework\\MockObject\\BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Identity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\InvocationStubber' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Match' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php', - 'PHPUnit\\Framework\\MockObject\\Builder\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php', - 'PHPUnit\\Framework\\MockObject\\ConfigurableMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php', - 'PHPUnit\\Framework\\MockObject\\ConfigurableMethodsAlreadyInitializedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php', - 'PHPUnit\\Framework\\MockObject\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Generator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Generator.php', - 'PHPUnit\\Framework\\MockObject\\IncompatibleReturnValueException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php', - 'PHPUnit\\Framework\\MockObject\\Invocation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Invocation.php', - 'PHPUnit\\Framework\\MockObject\\InvocationHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php', - 'PHPUnit\\Framework\\MockObject\\Matcher' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Matcher.php', - 'PHPUnit\\Framework\\MockObject\\Method' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/Method.php', - 'PHPUnit\\Framework\\MockObject\\MethodNameConstraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php', - 'PHPUnit\\Framework\\MockObject\\MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php', - 'PHPUnit\\Framework\\MockObject\\MockClass' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockClass.php', - 'PHPUnit\\Framework\\MockObject\\MockMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockMethod.php', - 'PHPUnit\\Framework\\MockObject\\MockMethodSet' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php', - 'PHPUnit\\Framework\\MockObject\\MockObject' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockObject.php', - 'PHPUnit\\Framework\\MockObject\\MockTrait' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockTrait.php', - 'PHPUnit\\Framework\\MockObject\\MockType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/MockType.php', - 'PHPUnit\\Framework\\MockObject\\MockedCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\MethodName' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\Parameters' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php', - 'PHPUnit\\Framework\\MockObject\\Rule\\ParametersRule' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php', - 'PHPUnit\\Framework\\MockObject\\RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php', - 'PHPUnit\\Framework\\MockObject\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnReference' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnStub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php', - 'PHPUnit\\Framework\\MockObject\\Stub\\Stub' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php', - 'PHPUnit\\Framework\\MockObject\\UnmockedCloneMethod' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php', - 'PHPUnit\\Framework\\MockObject\\Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/MockObject/Verifiable.php', - 'PHPUnit\\Framework\\NoChildTestSuiteException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php', - 'PHPUnit\\Framework\\OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/OutputError.php', - 'PHPUnit\\Framework\\PHPTAssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php', - 'PHPUnit\\Framework\\RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php', - 'PHPUnit\\Framework\\SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php', - 'PHPUnit\\Framework\\SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTest.php', - 'PHPUnit\\Framework\\SkippedTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', - 'PHPUnit\\Framework\\SkippedTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php', - 'PHPUnit\\Framework\\SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php', - 'PHPUnit\\Framework\\SyntheticError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SyntheticError.php', - 'PHPUnit\\Framework\\SyntheticSkippedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php', - 'PHPUnit\\Framework\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php', - 'PHPUnit\\Framework\\TestBuilder' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestBuilder.php', - 'PHPUnit\\Framework\\TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php', - 'PHPUnit\\Framework\\TestFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestFailure.php', - 'PHPUnit\\Framework\\TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListener.php', - 'PHPUnit\\Framework\\TestListenerDefaultImplementation' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php', - 'PHPUnit\\Framework\\TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestResult.php', - 'PHPUnit\\Framework\\TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php', - 'PHPUnit\\Framework\\TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuiteIterator.php', - 'PHPUnit\\Framework\\UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php', - 'PHPUnit\\Framework\\Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception/Warning.php', - 'PHPUnit\\Framework\\WarningTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/WarningTestCase.php', - 'PHPUnit\\Runner\\AfterIncompleteTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php', - 'PHPUnit\\Runner\\AfterLastTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php', - 'PHPUnit\\Runner\\AfterRiskyTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php', - 'PHPUnit\\Runner\\AfterSkippedTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php', - 'PHPUnit\\Runner\\AfterSuccessfulTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php', - 'PHPUnit\\Runner\\AfterTestErrorHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php', - 'PHPUnit\\Runner\\AfterTestFailureHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php', - 'PHPUnit\\Runner\\AfterTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php', - 'PHPUnit\\Runner\\AfterTestWarningHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php', - 'PHPUnit\\Runner\\BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', - 'PHPUnit\\Runner\\BeforeFirstTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php', - 'PHPUnit\\Runner\\BeforeTestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php', - 'PHPUnit\\Runner\\DefaultTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/DefaultTestResultCache.php', - 'PHPUnit\\Runner\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php', - 'PHPUnit\\Runner\\Filter\\ExcludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', - 'PHPUnit\\Runner\\Filter\\GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\IncludeGroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php', - 'PHPUnit\\Runner\\Filter\\NameFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php', - 'PHPUnit\\Runner\\Hook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/Hook.php', - 'PHPUnit\\Runner\\NullTestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/NullTestResultCache.php', - 'PHPUnit\\Runner\\PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/PhptTestCase.php', - 'PHPUnit\\Runner\\ResultCacheExtension' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/ResultCacheExtension.php', - 'PHPUnit\\Runner\\StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', - 'PHPUnit\\Runner\\TestHook' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestHook.php', - 'PHPUnit\\Runner\\TestListenerAdapter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php', - 'PHPUnit\\Runner\\TestResultCache' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestResultCache.php', - 'PHPUnit\\Runner\\TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', - 'PHPUnit\\Runner\\TestSuiteSorter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteSorter.php', - 'PHPUnit\\Runner\\Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', - 'PHPUnit\\TextUI\\Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php', - 'PHPUnit\\TextUI\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Exception.php', - 'PHPUnit\\TextUI\\Help' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Help.php', - 'PHPUnit\\TextUI\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', - 'PHPUnit\\TextUI\\TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php', - 'PHPUnit\\Util\\Annotation\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', - 'PHPUnit\\Util\\Annotation\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/Registry.php', - 'PHPUnit\\Util\\Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php', - 'PHPUnit\\Util\\Color' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Color.php', - 'PHPUnit\\Util\\Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php', - 'PHPUnit\\Util\\ConfigurationGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ConfigurationGenerator.php', - 'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', - 'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception.php', - 'PHPUnit\\Util\\FileLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/FileLoader.php', - 'PHPUnit\\Util\\Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', - 'PHPUnit\\Util\\Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', - 'PHPUnit\\Util\\Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php', - 'PHPUnit\\Util\\GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php', - 'PHPUnit\\Util\\InvalidDataSetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/InvalidDataSetException.php', - 'PHPUnit\\Util\\Json' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Json.php', - 'PHPUnit\\Util\\Log\\JUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JUnit.php', - 'PHPUnit\\Util\\Log\\TeamCity' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TeamCity.php', - 'PHPUnit\\Util\\PHP\\AbstractPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php', - 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', - 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', - 'PHPUnit\\Util\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php', - 'PHPUnit\\Util\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/RegularExpression.php', - 'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', - 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', - 'PHPUnit\\Util\\TestDox\\HtmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', - 'PHPUnit\\Util\\TestDox\\ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\TestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php', - 'PHPUnit\\Util\\TestDox\\TextResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php', - 'PHPUnit\\Util\\TestDox\\XmlResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php', - 'PHPUnit\\Util\\TextTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TextTestListRenderer.php', - 'PHPUnit\\Util\\Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php', - 'PHPUnit\\Util\\VersionComparisonOperator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/VersionComparisonOperator.php', - 'PHPUnit\\Util\\XdebugFilterScriptGenerator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php', - 'PHPUnit\\Util\\Xml' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Xml.php', - 'PHPUnit\\Util\\XmlTestListRenderer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XmlTestListRenderer.php', - 'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ABSTRACT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AMPERSAND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AND_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOLEAN_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BOOL_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_BREAK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CALLABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CARET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CASE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CATCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLASS_NAME_CONSTANT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLONE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CLOSE_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COALESCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COALESCE_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CONTINUE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_CURLY_OPEN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DEC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DEFAULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIV' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DIV_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOC_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOLLAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_DOUBLE_QUOTES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELLIPSIS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELSE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ELSEIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EMPTY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENCAPSED_AND_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDDECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDFOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDFOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_EXTENDS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FINAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FINALLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_FUNC_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GLOBAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GOTO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INLINE_HTML' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INSTANCEOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INSTEADOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INTERFACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_INT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_ISSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_GREATER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_NOT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LOGICAL_XOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_METHOD_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MINUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MINUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MOD_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_MUL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NAMESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OPEN_TAG_WITH_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PERCENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PIPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PLUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PLUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_POW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_POW_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PRINT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PRIVATE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PROTECTED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_PUBLIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_QUESTION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_REQUIRE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_START_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STATIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php', - 'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', - 'PHP_Token_THROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TILDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_USE_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_Util' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Util.php', - 'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', - 'PharIo\\Manifest\\Application' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Application.php', - 'PharIo\\Manifest\\ApplicationName' => __DIR__ . '/..' . '/phar-io/manifest/src/values/ApplicationName.php', - 'PharIo\\Manifest\\Author' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Author.php', - 'PharIo\\Manifest\\AuthorCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollection.php', - 'PharIo\\Manifest\\AuthorCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/AuthorCollectionIterator.php', - 'PharIo\\Manifest\\AuthorElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElement.php', - 'PharIo\\Manifest\\AuthorElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/AuthorElementCollection.php', - 'PharIo\\Manifest\\BundledComponent' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponent.php', - 'PharIo\\Manifest\\BundledComponentCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollection.php', - 'PharIo\\Manifest\\BundledComponentCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/BundledComponentCollectionIterator.php', - 'PharIo\\Manifest\\BundlesElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/BundlesElement.php', - 'PharIo\\Manifest\\ComponentElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElement.php', - 'PharIo\\Manifest\\ComponentElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ComponentElementCollection.php', - 'PharIo\\Manifest\\ContainsElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ContainsElement.php', - 'PharIo\\Manifest\\CopyrightElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/CopyrightElement.php', - 'PharIo\\Manifest\\CopyrightInformation' => __DIR__ . '/..' . '/phar-io/manifest/src/values/CopyrightInformation.php', - 'PharIo\\Manifest\\ElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ElementCollection.php', - 'PharIo\\Manifest\\Email' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Email.php', - 'PharIo\\Manifest\\Exception' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/Exception.php', - 'PharIo\\Manifest\\ExtElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElement.php', - 'PharIo\\Manifest\\ExtElementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtElementCollection.php', - 'PharIo\\Manifest\\Extension' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Extension.php', - 'PharIo\\Manifest\\ExtensionElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ExtensionElement.php', - 'PharIo\\Manifest\\InvalidApplicationNameException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php', - 'PharIo\\Manifest\\InvalidEmailException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidEmailException.php', - 'PharIo\\Manifest\\InvalidUrlException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/InvalidUrlException.php', - 'PharIo\\Manifest\\Library' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Library.php', - 'PharIo\\Manifest\\License' => __DIR__ . '/..' . '/phar-io/manifest/src/values/License.php', - 'PharIo\\Manifest\\LicenseElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/LicenseElement.php', - 'PharIo\\Manifest\\Manifest' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Manifest.php', - 'PharIo\\Manifest\\ManifestDocument' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocument.php', - 'PharIo\\Manifest\\ManifestDocumentException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentException.php', - 'PharIo\\Manifest\\ManifestDocumentLoadingException' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php', - 'PharIo\\Manifest\\ManifestDocumentMapper' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestDocumentMapper.php', - 'PharIo\\Manifest\\ManifestDocumentMapperException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php', - 'PharIo\\Manifest\\ManifestElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/ManifestElement.php', - 'PharIo\\Manifest\\ManifestElementException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestElementException.php', - 'PharIo\\Manifest\\ManifestLoader' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestLoader.php', - 'PharIo\\Manifest\\ManifestLoaderException' => __DIR__ . '/..' . '/phar-io/manifest/src/exceptions/ManifestLoaderException.php', - 'PharIo\\Manifest\\ManifestSerializer' => __DIR__ . '/..' . '/phar-io/manifest/src/ManifestSerializer.php', - 'PharIo\\Manifest\\PhpElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/PhpElement.php', - 'PharIo\\Manifest\\PhpExtensionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpExtensionRequirement.php', - 'PharIo\\Manifest\\PhpVersionRequirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/PhpVersionRequirement.php', - 'PharIo\\Manifest\\Requirement' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Requirement.php', - 'PharIo\\Manifest\\RequirementCollection' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollection.php', - 'PharIo\\Manifest\\RequirementCollectionIterator' => __DIR__ . '/..' . '/phar-io/manifest/src/values/RequirementCollectionIterator.php', - 'PharIo\\Manifest\\RequiresElement' => __DIR__ . '/..' . '/phar-io/manifest/src/xml/RequiresElement.php', - 'PharIo\\Manifest\\Type' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Type.php', - 'PharIo\\Manifest\\Url' => __DIR__ . '/..' . '/phar-io/manifest/src/values/Url.php', - 'PharIo\\Version\\AbstractVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AbstractVersionConstraint.php', - 'PharIo\\Version\\AndVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AndVersionConstraintGroup.php', - 'PharIo\\Version\\AnyVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/AnyVersionConstraint.php', - 'PharIo\\Version\\ExactVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/ExactVersionConstraint.php', - 'PharIo\\Version\\Exception' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/Exception.php', - 'PharIo\\Version\\GreaterThanOrEqualToVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php', - 'PharIo\\Version\\InvalidPreReleaseSuffixException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php', - 'PharIo\\Version\\InvalidVersionException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/InvalidVersionException.php', - 'PharIo\\Version\\OrVersionConstraintGroup' => __DIR__ . '/..' . '/phar-io/version/src/constraints/OrVersionConstraintGroup.php', - 'PharIo\\Version\\PreReleaseSuffix' => __DIR__ . '/..' . '/phar-io/version/src/PreReleaseSuffix.php', - 'PharIo\\Version\\SpecificMajorAndMinorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php', - 'PharIo\\Version\\SpecificMajorVersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php', - 'PharIo\\Version\\UnsupportedVersionConstraintException' => __DIR__ . '/..' . '/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php', - 'PharIo\\Version\\Version' => __DIR__ . '/..' . '/phar-io/version/src/Version.php', - 'PharIo\\Version\\VersionConstraint' => __DIR__ . '/..' . '/phar-io/version/src/constraints/VersionConstraint.php', - 'PharIo\\Version\\VersionConstraintParser' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintParser.php', - 'PharIo\\Version\\VersionConstraintValue' => __DIR__ . '/..' . '/phar-io/version/src/VersionConstraintValue.php', - 'PharIo\\Version\\VersionNumber' => __DIR__ . '/..' . '/phar-io/version/src/VersionNumber.php', - 'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', - 'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Driver.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PCOV' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PCOV.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/PHPDBG.php', - 'SebastianBergmann\\CodeCoverage\\Driver\\Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Driver/Xdebug.php', - 'SebastianBergmann\\CodeCoverage\\Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/Exception.php', - 'SebastianBergmann\\CodeCoverage\\Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Filter.php', - 'SebastianBergmann\\CodeCoverage\\InvalidArgumentException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\CodeCoverage\\MissingCoversAnnotationException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php', - 'SebastianBergmann\\CodeCoverage\\Node\\AbstractNode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/AbstractNode.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Builder' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Builder.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Node\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/File.php', - 'SebastianBergmann\\CodeCoverage\\Node\\Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Node/Iterator.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Clover.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Crap4j.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Html\\Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Html/Renderer.php', - 'SebastianBergmann\\CodeCoverage\\Report\\PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/PHP.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Text.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\BuildInformation' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Coverage.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Directory.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Facade' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Facade.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/File.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Method.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Node.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Project.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Report.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Source' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Source.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Tests.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Totals.php', - 'SebastianBergmann\\CodeCoverage\\Report\\Xml\\Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Report/Xml/Unit.php', - 'SebastianBergmann\\CodeCoverage\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/RuntimeException.php', - 'SebastianBergmann\\CodeCoverage\\UnintentionallyCoveredCodeException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php', - 'SebastianBergmann\\CodeCoverage\\Util' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Util.php', - 'SebastianBergmann\\CodeCoverage\\Version' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Version.php', - 'SebastianBergmann\\CodeUnitReverseLookup\\Wizard' => __DIR__ . '/..' . '/sebastian/code-unit-reverse-lookup/src/Wizard.php', - 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php', - 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php', - 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php', - 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php', - 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php', - 'SebastianBergmann\\Comparator\\DoubleComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DoubleComparator.php', - 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php', - 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php', - 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php', - 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php', - 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php', - 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php', - 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php', - 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', - 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', - 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', - 'SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', - 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', - 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', - 'SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', - 'SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', - 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', - 'SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', - 'SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', - 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', - 'SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', - 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php', - 'SebastianBergmann\\Environment\\OperatingSystem' => __DIR__ . '/..' . '/sebastian/environment/src/OperatingSystem.php', - 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', - 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', - 'SebastianBergmann\\FileIterator\\Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', - 'SebastianBergmann\\FileIterator\\Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', - 'SebastianBergmann\\FileIterator\\Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', - 'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php', - 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', - 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/Exception.php', - 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php', - 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/exceptions/RuntimeException.php', - 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php', - 'SebastianBergmann\\ObjectEnumerator\\Enumerator' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Enumerator.php', - 'SebastianBergmann\\ObjectEnumerator\\Exception' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/Exception.php', - 'SebastianBergmann\\ObjectEnumerator\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-enumerator/src/InvalidArgumentException.php', - 'SebastianBergmann\\ObjectReflector\\Exception' => __DIR__ . '/..' . '/sebastian/object-reflector/src/Exception.php', - 'SebastianBergmann\\ObjectReflector\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/object-reflector/src/InvalidArgumentException.php', - 'SebastianBergmann\\ObjectReflector\\ObjectReflector' => __DIR__ . '/..' . '/sebastian/object-reflector/src/ObjectReflector.php', - 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php', - 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php', - 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php', - 'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php', - 'SebastianBergmann\\Timer\\Exception' => __DIR__ . '/..' . '/phpunit/php-timer/src/Exception.php', - 'SebastianBergmann\\Timer\\RuntimeException' => __DIR__ . '/..' . '/phpunit/php-timer/src/RuntimeException.php', - 'SebastianBergmann\\Timer\\Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', - 'SebastianBergmann\\Type\\CallableType' => __DIR__ . '/..' . '/sebastian/type/src/CallableType.php', - 'SebastianBergmann\\Type\\Exception' => __DIR__ . '/..' . '/sebastian/type/src/exception/Exception.php', - 'SebastianBergmann\\Type\\GenericObjectType' => __DIR__ . '/..' . '/sebastian/type/src/GenericObjectType.php', - 'SebastianBergmann\\Type\\IterableType' => __DIR__ . '/..' . '/sebastian/type/src/IterableType.php', - 'SebastianBergmann\\Type\\NullType' => __DIR__ . '/..' . '/sebastian/type/src/NullType.php', - 'SebastianBergmann\\Type\\ObjectType' => __DIR__ . '/..' . '/sebastian/type/src/ObjectType.php', - 'SebastianBergmann\\Type\\RuntimeException' => __DIR__ . '/..' . '/sebastian/type/src/exception/RuntimeException.php', - 'SebastianBergmann\\Type\\SimpleType' => __DIR__ . '/..' . '/sebastian/type/src/SimpleType.php', - 'SebastianBergmann\\Type\\Type' => __DIR__ . '/..' . '/sebastian/type/src/Type.php', - 'SebastianBergmann\\Type\\TypeName' => __DIR__ . '/..' . '/sebastian/type/src/TypeName.php', - 'SebastianBergmann\\Type\\UnknownType' => __DIR__ . '/..' . '/sebastian/type/src/UnknownType.php', - 'SebastianBergmann\\Type\\VoidType' => __DIR__ . '/..' . '/sebastian/type/src/VoidType.php', - 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', - 'Text_Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php', - 'TheSeer\\Tokenizer\\Exception' => __DIR__ . '/..' . '/theseer/tokenizer/src/Exception.php', - 'TheSeer\\Tokenizer\\NamespaceUri' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUri.php', - 'TheSeer\\Tokenizer\\NamespaceUriException' => __DIR__ . '/..' . '/theseer/tokenizer/src/NamespaceUriException.php', - 'TheSeer\\Tokenizer\\Token' => __DIR__ . '/..' . '/theseer/tokenizer/src/Token.php', - 'TheSeer\\Tokenizer\\TokenCollection' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollection.php', - 'TheSeer\\Tokenizer\\TokenCollectionException' => __DIR__ . '/..' . '/theseer/tokenizer/src/TokenCollectionException.php', - 'TheSeer\\Tokenizer\\Tokenizer' => __DIR__ . '/..' . '/theseer/tokenizer/src/Tokenizer.php', - 'TheSeer\\Tokenizer\\XMLSerializer' => __DIR__ . '/..' . '/theseer/tokenizer/src/XMLSerializer.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitbbfefea263758c542cf1b7e1de76aa47::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitbbfefea263758c542cf1b7e1de76aa47::$prefixDirsPsr4; - $loader->prefixesPsr0 = ComposerStaticInitbbfefea263758c542cf1b7e1de76aa47::$prefixesPsr0; - $loader->classMap = ComposerStaticInitbbfefea263758c542cf1b7e1de76aa47::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json deleted file mode 100644 index 9ae9da8..0000000 --- a/vendor/composer/installed.json +++ /dev/null @@ -1,3003 +0,0 @@ -{ - "packages": [ - { - "name": "codeigniter4/framework", - "version": "v4.0.4", - "version_normalized": "4.0.4.0", - "source": { - "type": "git", - "url": "https://github.com/codeigniter4/framework.git", - "reference": "1edcf84f77ff794640fddbfc59a10a024cd15b50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/codeigniter4/framework/zipball/1edcf84f77ff794640fddbfc59a10a024cd15b50", - "reference": "1edcf84f77ff794640fddbfc59a10a024cd15b50", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-intl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "kint-php/kint": "^3.3", - "laminas/laminas-escaper": "^2.6", - "php": ">=7.2", - "psr/log": "^1.1" - }, - "require-dev": { - "codeigniter4/codeigniter4-standard": "^1.0", - "fzaninotto/faker": "^1.9@dev", - "mikey179/vfsstream": "1.6.*", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "squizlabs/php_codesniffer": "^3.3" - }, - "time": "2020-07-16T03:44:28+00:00", - "type": "project", - "installation-source": "dist", - "autoload": { - "psr-4": { - "CodeIgniter\\": "system/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The CodeIgniter framework v4", - "homepage": "https://codeigniter.com", - "install-path": "../codeigniter4/framework" - }, - { - "name": "doctrine/instantiator", - "version": "1.3.1", - "version_normalized": "1.3.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea", - "reference": "f350df0268e904597e3bd9c4685c53e0e333feea", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "time": "2020-05-29T17:27:14+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "install-path": "../doctrine/instantiator" - }, - { - "name": "dompdf/dompdf", - "version": "v0.8.6", - "version_normalized": "0.8.6.0", - "source": { - "type": "git", - "url": "https://github.com/dompdf/dompdf.git", - "reference": "db91d81866c69a42dad1d2926f61515a1e3f42c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dompdf/dompdf/zipball/db91d81866c69a42dad1d2926f61515a1e3f42c5", - "reference": "db91d81866c69a42dad1d2926f61515a1e3f42c5", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "phenx/php-font-lib": "^0.5.2", - "phenx/php-svg-lib": "^0.3.3", - "php": "^7.1" - }, - "require-dev": { - "mockery/mockery": "^1.3", - "phpunit/phpunit": "^7.5", - "squizlabs/php_codesniffer": "^3.5" - }, - "suggest": { - "ext-gd": "Needed to process images", - "ext-gmagick": "Improves image processing performance", - "ext-imagick": "Improves image processing performance", - "ext-zlib": "Needed for pdf stream compression" - }, - "time": "2020-08-30T22:54:22+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-develop": "0.7-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Dompdf\\": "src/" - }, - "classmap": [ - "lib/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1" - ], - "authors": [ - { - "name": "Fabien MĆ©nager", - "email": "fabien.menager@gmail.com" - }, - { - "name": "Brian Sweeney", - "email": "eclecticgeek@gmail.com" - }, - { - "name": "Gabriel Bull", - "email": "me@gabrielbull.com" - } - ], - "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", - "homepage": "https://github.com/dompdf/dompdf", - "install-path": "../dompdf/dompdf" - }, - { - "name": "fzaninotto/faker", - "version": "dev-master", - "version_normalized": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/fzaninotto/Faker.git", - "reference": "ac73e5287024f5e98dd6d0bf10e6a6f7877b7513" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/ac73e5287024f5e98dd6d0bf10e6a6f7877b7513", - "reference": "ac73e5287024f5e98dd6d0bf10e6a6f7877b7513", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "ext-intl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7", - "squizlabs/php_codesniffer": "^2.9.2" - }, - "time": "2020-10-27T14:15:58+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9-dev" - } - }, - "installation-source": "source", - "autoload": { - "psr-4": { - "Faker\\": "src/Faker/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "FranƧois Zaninotto" - } - ], - "description": "Faker is a PHP library that generates fake data for you.", - "keywords": [ - "data", - "faker", - "fixtures" - ], - "abandoned": true, - "install-path": "../fzaninotto/faker" - }, - { - "name": "kint-php/kint", - "version": "3.3", - "version_normalized": "3.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/kint-php/kint.git", - "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kint-php/kint/zipball/335ac1bcaf04d87df70d8aa51e8887ba2c6d203b", - "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b", - "shasum": "" - }, - "require": { - "php": ">=5.3.6" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "phpunit/phpunit": "^4.0", - "seld/phar-utils": "^1.0", - "symfony/finder": "^2.0 || ^3.0 || ^4.0", - "vimeo/psalm": "^3.0" - }, - "suggest": { - "ext-ctype": "Simple data type tests", - "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages", - "ext-mbstring": "Provides string encoding detection", - "kint-php/kint-js": "Provides a simplified dump to console.log()", - "kint-php/kint-twig": "Provides d() and s() functions in twig templates", - "symfony/polyfill-ctype": "Replacement for ext-ctype if missing", - "symfony/polyfill-iconv": "Replacement for ext-iconv if missing", - "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing" - }, - "time": "2019-10-17T18:05:24+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "init.php" - ], - "psr-4": { - "Kint\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Vollebregt", - "homepage": "https://github.com/jnvsor" - }, - { - "name": "Rokas Å leinius", - "homepage": "https://github.com/raveren" - }, - { - "name": "Contributors", - "homepage": "https://github.com/kint-php/kint/graphs/contributors" - } - ], - "description": "Kint - debugging tool for PHP developers", - "homepage": "https://kint-php.github.io/kint/", - "keywords": [ - "debug", - "kint", - "php" - ], - "install-path": "../kint-php/kint" - }, - { - "name": "laminas/laminas-escaper", - "version": "2.6.1", - "version_normalized": "2.6.1.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-escaper.git", - "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/25f2a053eadfa92ddacb609dcbbc39362610da70", - "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70", - "shasum": "" - }, - "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^5.6 || ^7.0" - }, - "replace": { - "zendframework/zend-escaper": "self.version" - }, - "require-dev": { - "laminas/laminas-coding-standard": "~1.0.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" - }, - "time": "2019-12-31T16:43:30+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev", - "dev-develop": "2.7.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Laminas\\Escaper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", - "homepage": "https://laminas.dev", - "keywords": [ - "escaper", - "laminas" - ], - "install-path": "../laminas/laminas-escaper" - }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", - "version_normalized": "1.1.1.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" - }, - "time": "2020-09-14T14:23:00+00:00", - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "install-path": "../laminas/laminas-zendframework-bridge" - }, - { - "name": "maennchen/zipstream-php", - "version": "2.1.0", - "version_normalized": "2.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", - "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", - "shasum": "" - }, - "require": { - "myclabs/php-enum": "^1.5", - "php": ">= 7.1", - "psr/http-message": "^1.0", - "symfony/polyfill-mbstring": "^1.0" - }, - "require-dev": { - "ext-zip": "*", - "guzzlehttp/guzzle": ">= 6.3", - "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": ">= 7.5" - }, - "time": "2020-05-30T13:11:16+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "ZipStream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paul Duncan", - "email": "pabs@pablotron.org" - }, - { - "name": "Jonatan MƤnnchen", - "email": "jonatan@maennchen.ch" - }, - { - "name": "Jesse Donat", - "email": "donatj@gmail.com" - }, - { - "name": "AndrĆ”s KolesĆ”r", - "email": "kolesar@kolesar.hu" - } - ], - "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", - "keywords": [ - "stream", - "zip" - ], - "support": { - "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/master" - }, - "funding": [ - { - "url": "https://opencollective.com/zipstream", - "type": "open_collective" - } - ], - "install-path": "../maennchen/zipstream-php" - }, - { - "name": "markbaker/complex", - "version": "2.0.0", - "version_normalized": "2.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPComplex.git", - "reference": "9999f1432fae467bc93c53f357105b4c31bb994c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/9999f1432fae467bc93c53f357105b4c31bb994c", - "reference": "9999f1432fae467bc93c53f357105b4c31bb994c", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", - "phpdocumentor/phpdocumentor": "2.*", - "phploc/phploc": "^4.0", - "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", - "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.4" - }, - "time": "2020-08-26T10:42:07+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Complex\\": "classes/src/" - }, - "files": [ - "classes/src/functions/abs.php", - "classes/src/functions/acos.php", - "classes/src/functions/acosh.php", - "classes/src/functions/acot.php", - "classes/src/functions/acoth.php", - "classes/src/functions/acsc.php", - "classes/src/functions/acsch.php", - "classes/src/functions/argument.php", - "classes/src/functions/asec.php", - "classes/src/functions/asech.php", - "classes/src/functions/asin.php", - "classes/src/functions/asinh.php", - "classes/src/functions/atan.php", - "classes/src/functions/atanh.php", - "classes/src/functions/conjugate.php", - "classes/src/functions/cos.php", - "classes/src/functions/cosh.php", - "classes/src/functions/cot.php", - "classes/src/functions/coth.php", - "classes/src/functions/csc.php", - "classes/src/functions/csch.php", - "classes/src/functions/exp.php", - "classes/src/functions/inverse.php", - "classes/src/functions/ln.php", - "classes/src/functions/log2.php", - "classes/src/functions/log10.php", - "classes/src/functions/negative.php", - "classes/src/functions/pow.php", - "classes/src/functions/rho.php", - "classes/src/functions/sec.php", - "classes/src/functions/sech.php", - "classes/src/functions/sin.php", - "classes/src/functions/sinh.php", - "classes/src/functions/sqrt.php", - "classes/src/functions/tan.php", - "classes/src/functions/tanh.php", - "classes/src/functions/theta.php", - "classes/src/operations/add.php", - "classes/src/operations/subtract.php", - "classes/src/operations/multiply.php", - "classes/src/operations/divideby.php", - "classes/src/operations/divideinto.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@lange.demon.co.uk" - } - ], - "description": "PHP Class for working with complex numbers", - "homepage": "https://github.com/MarkBaker/PHPComplex", - "keywords": [ - "complex", - "mathematics" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPComplex/issues", - "source": "https://github.com/MarkBaker/PHPComplex/tree/PHP8" - }, - "install-path": "../markbaker/complex" - }, - { - "name": "markbaker/matrix", - "version": "2.0.0", - "version_normalized": "2.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/MarkBaker/PHPMatrix.git", - "reference": "9567d9c4c519fbe40de01dbd1e4469dbbb66f46a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/9567d9c4c519fbe40de01dbd1e4469dbbb66f46a", - "reference": "9567d9c4c519fbe40de01dbd1e4469dbbb66f46a", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "phpcompatibility/php-compatibility": "^9.0", - "phpdocumentor/phpdocumentor": "2.*", - "phploc/phploc": "^4.0", - "phpmd/phpmd": "2.*", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", - "sebastian/phpcpd": "^4.0", - "squizlabs/php_codesniffer": "^3.4" - }, - "time": "2020-08-28T17:11:00+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Matrix\\": "classes/src/" - }, - "files": [ - "classes/src/functions/adjoint.php", - "classes/src/functions/antidiagonal.php", - "classes/src/functions/cofactors.php", - "classes/src/functions/determinant.php", - "classes/src/functions/diagonal.php", - "classes/src/functions/identity.php", - "classes/src/functions/inverse.php", - "classes/src/functions/minors.php", - "classes/src/functions/trace.php", - "classes/src/functions/transpose.php", - "classes/src/operations/add.php", - "classes/src/operations/directsum.php", - "classes/src/operations/subtract.php", - "classes/src/operations/multiply.php", - "classes/src/operations/divideby.php", - "classes/src/operations/divideinto.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mark Baker", - "email": "mark@demon-angel.eu" - } - ], - "description": "PHP Class for working with matrices", - "homepage": "https://github.com/MarkBaker/PHPMatrix", - "keywords": [ - "mathematics", - "matrix", - "vector" - ], - "support": { - "issues": "https://github.com/MarkBaker/PHPMatrix/issues", - "source": "https://github.com/MarkBaker/PHPMatrix/tree/PHP8" - }, - "install-path": "../markbaker/matrix" - }, - { - "name": "mikey179/vfsstream", - "version": "v1.6.8", - "version_normalized": "1.6.8.0", - "source": { - "type": "git", - "url": "https://github.com/bovigo/vfsStream.git", - "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe", - "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5|^5.0" - }, - "time": "2019-10-30T15:31:00+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "org\\bovigo\\vfs\\": "src/main/php" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Frank Kleine", - "homepage": "http://frankkleine.de/", - "role": "Developer" - } - ], - "description": "Virtual file system to mock the real file system in unit tests.", - "homepage": "http://vfs.bovigo.org/", - "install-path": "../mikey179/vfsstream" - }, - { - "name": "myclabs/deep-copy", - "version": "1.10.1", - "version_normalized": "1.10.1.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "time": "2020-06-29T13:22:24+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "install-path": "../myclabs/deep-copy" - }, - { - "name": "myclabs/php-enum", - "version": "1.7.7", - "version_normalized": "1.7.7.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/php-enum.git", - "reference": "d178027d1e679832db9f38248fcc7200647dc2b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/d178027d1e679832db9f38248fcc7200647dc2b7", - "reference": "d178027d1e679832db9f38248fcc7200647dc2b7", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7", - "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^3.8" - }, - "time": "2020-11-14T18:14:52+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "MyCLabs\\Enum\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP Enum contributors", - "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" - } - ], - "description": "PHP Enum implementation", - "homepage": "http://github.com/myclabs/php-enum", - "keywords": [ - "enum" - ], - "support": { - "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.7.7" - }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", - "type": "tidelift" - } - ], - "install-path": "../myclabs/php-enum" - }, - { - "name": "phar-io/manifest", - "version": "1.0.3", - "version_normalized": "1.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" - }, - "time": "2018-07-08T19:23:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "install-path": "../phar-io/manifest" - }, - { - "name": "phar-io/version", - "version": "2.0.1", - "version_normalized": "2.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "time": "2018-07-08T19:19:57+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "install-path": "../phar-io/version" - }, - { - "name": "phenx/php-font-lib", - "version": "0.5.2", - "version_normalized": "0.5.2.0", - "source": { - "type": "git", - "url": "https://github.com/PhenX/php-font-lib.git", - "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8", - "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8", - "shasum": "" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7" - }, - "time": "2020-03-08T15:31:32+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "FontLib\\": "src/FontLib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "authors": [ - { - "name": "Fabien MĆ©nager", - "email": "fabien.menager@gmail.com" - } - ], - "description": "A library to read, parse, export and make subsets of different types of font files.", - "homepage": "https://github.com/PhenX/php-font-lib", - "install-path": "../phenx/php-font-lib" - }, - { - "name": "phenx/php-svg-lib", - "version": "v0.3.3", - "version_normalized": "0.3.3.0", - "source": { - "type": "git", - "url": "https://github.com/PhenX/php-svg-lib.git", - "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/5fa61b65e612ce1ae15f69b3d223cb14ecc60e32", - "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32", - "shasum": "" - }, - "require": { - "sabberworm/php-css-parser": "^8.3" - }, - "require-dev": { - "phpunit/phpunit": "^5.5|^6.5" - }, - "time": "2019-09-11T20:02:13+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Svg\\": "src/Svg" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "authors": [ - { - "name": "Fabien MĆ©nager", - "email": "fabien.menager@gmail.com" - } - ], - "description": "A library to read, parse and export to PDF SVG files.", - "homepage": "https://github.com/PhenX/php-svg-lib", - "install-path": "../phenx/php-svg-lib" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "version_normalized": "2.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "time": "2020-06-27T09:03:43+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "install-path": "../phpdocumentor/reflection-common" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.2.2", - "version_normalized": "5.2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "time": "2020-09-03T19:13:55+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "install-path": "../phpdocumentor/reflection-docblock" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.4.0", - "version_normalized": "1.4.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "time": "2020-09-17T18:55:26+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "install-path": "../phpdocumentor/type-resolver" - }, - { - "name": "phpoffice/phpspreadsheet", - "version": "1.15.0", - "version_normalized": "1.15.0.0", - "source": { - "type": "git", - "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "a8e8068b31b8119e1daa5b1eb5715a3a8ea8305f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a8e8068b31b8119e1daa5b1eb5715a3a8ea8305f", - "reference": "a8e8068b31b8119e1daa5b1eb5715a3a8ea8305f", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-dom": "*", - "ext-fileinfo": "*", - "ext-gd": "*", - "ext-iconv": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "ext-xml": "*", - "ext-xmlreader": "*", - "ext-xmlwriter": "*", - "ext-zip": "*", - "ext-zlib": "*", - "maennchen/zipstream-php": "^2.1", - "markbaker/complex": "^1.5|^2.0", - "markbaker/matrix": "^1.2|^2.0", - "php": "^7.2|^8.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/simple-cache": "^1.0" - }, - "require-dev": { - "dompdf/dompdf": "^0.8.5", - "friendsofphp/php-cs-fixer": "^2.16", - "jpgraph/jpgraph": "^4.0", - "mpdf/mpdf": "^8.0", - "phpcompatibility/php-compatibility": "^9.3", - "phpunit/phpunit": "^8.5|^9.3", - "squizlabs/php_codesniffer": "^3.5", - "tecnickcom/tcpdf": "^6.3" - }, - "suggest": { - "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", - "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", - "mpdf/mpdf": "Option for rendering PDF with PDF Writer", - "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)" - }, - "time": "2020-10-11T13:20:59+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Maarten Balliauw", - "homepage": "https://blog.maartenballiauw.be" - }, - { - "name": "Mark Baker", - "homepage": "https://markbakeruk.net" - }, - { - "name": "Franck Lefevre", - "homepage": "https://rootslabs.net" - }, - { - "name": "Erik Tilt" - }, - { - "name": "Adrien Crivelli" - } - ], - "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", - "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", - "keywords": [ - "OpenXML", - "excel", - "gnumeric", - "ods", - "php", - "spreadsheet", - "xls", - "xlsx" - ], - "support": { - "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", - "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.15.0" - }, - "install-path": "../phpoffice/phpspreadsheet" - }, - { - "name": "phpspec/prophecy", - "version": "1.12.1", - "version_normalized": "1.12.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0 <9.3" - }, - "time": "2020-09-29T09:10:42+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "install-path": "../phpspec/prophecy" - }, - { - "name": "phpunit/php-code-coverage", - "version": "7.0.10", - "version_normalized": "7.0.10.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf", - "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.1", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" - }, - "require-dev": { - "phpunit/phpunit": "^8.2.2" - }, - "suggest": { - "ext-xdebug": "^2.7.2" - }, - "time": "2019-11-20T13:55:58+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "install-path": "../phpunit/php-code-coverage" - }, - { - "name": "phpunit/php-file-iterator", - "version": "2.0.2", - "version_normalized": "2.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "time": "2018-09-13T20:33:42+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "install-path": "../phpunit/php-file-iterator" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "version_normalized": "1.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "time": "2015-06-21T13:50:34+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "install-path": "../phpunit/php-text-template" - }, - { - "name": "phpunit/php-timer", - "version": "2.1.2", - "version_normalized": "2.1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "time": "2019-06-07T04:22:29+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "install-path": "../phpunit/php-timer" - }, - { - "name": "phpunit/php-token-stream", - "version": "3.1.1", - "version_normalized": "3.1.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "time": "2019-09-17T06:23:10+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "abandoned": true, - "install-path": "../phpunit/php-token-stream" - }, - { - "name": "phpunit/phpunit", - "version": "8.5.8", - "version_normalized": "8.5.8.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997", - "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2.0", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.9.1", - "phar-io/manifest": "^1.0.3", - "phar-io/version": "^2.0.1", - "php": "^7.2", - "phpspec/prophecy": "^1.8.1", - "phpunit/php-code-coverage": "^7.0.7", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.2", - "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.2", - "sebastian/exporter": "^3.1.1", - "sebastian/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0.0" - }, - "time": "2020-06-22T07:06:58+00:00", - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "8.5-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "funding": [ - { - "url": "https://phpunit.de/donate.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "install-path": "../phpunit/phpunit" - }, - { - "name": "psr/http-client", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" - }, - "time": "2020-06-29T06:28:15+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client/tree/master" - }, - "install-path": "../psr/http-client" - }, - { - "name": "psr/http-factory", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "shasum": "" - }, - "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0" - }, - "time": "2019-04-30T12:38:16+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" - }, - "install-path": "../psr/http-factory" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2016-08-06T14:39:51+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "install-path": "../psr/http-message" - }, - { - "name": "psr/log", - "version": "1.1.3", - "version_normalized": "1.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2020-03-23T09:12:05+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "install-path": "../psr/log" - }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2017-10-23T01:57:42+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" - }, - "install-path": "../psr/simple-cache" - }, - { - "name": "sabberworm/php-css-parser", - "version": "8.3.1", - "version_normalized": "8.3.1.0", - "source": { - "type": "git", - "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", - "reference": "d217848e1396ef962fb1997cf3e2421acba7f796" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796", - "reference": "d217848e1396ef962fb1997cf3e2421acba7f796", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "codacy/coverage": "^1.4", - "phpunit/phpunit": "~4.8" - }, - "time": "2020-06-01T09:10:00+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "Sabberworm\\CSS": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Raphael Schweikert" - } - ], - "description": "Parser for CSS Files written in PHP", - "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser", - "keywords": [ - "css", - "parser", - "stylesheet" - ], - "install-path": "../sabberworm/php-css-parser" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "time": "2017-03-04T06:30:41+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "install-path": "../sebastian/code-unit-reverse-lookup" - }, - { - "name": "sebastian/comparator", - "version": "3.0.2", - "version_normalized": "3.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "shasum": "" - }, - "require": { - "php": "^7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "time": "2018-07-12T15:12:46+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "install-path": "../sebastian/comparator" - }, - { - "name": "sebastian/diff", - "version": "3.0.2", - "version_normalized": "3.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" - }, - "time": "2019-02-04T06:01:07+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "install-path": "../sebastian/diff" - }, - { - "name": "sebastian/environment", - "version": "4.2.3", - "version_normalized": "4.2.3.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.5" - }, - "suggest": { - "ext-posix": "*" - }, - "time": "2019-11-20T08:46:58+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.2-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "install-path": "../sebastian/environment" - }, - { - "name": "sebastian/exporter", - "version": "3.1.2", - "version_normalized": "3.1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" - }, - "time": "2019-09-14T09:02:43+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "install-path": "../sebastian/exporter" - }, - { - "name": "sebastian/global-state", - "version": "3.0.0", - "version_normalized": "3.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", - "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4", - "shasum": "" - }, - "require": { - "php": "^7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^8.0" - }, - "suggest": { - "ext-uopz": "*" - }, - "time": "2019-02-01T05:30:01+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "install-path": "../sebastian/global-state" - }, - { - "name": "sebastian/object-enumerator", - "version": "3.0.3", - "version_normalized": "3.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "shasum": "" - }, - "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "time": "2017-08-03T12:35:26+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "install-path": "../sebastian/object-enumerator" - }, - { - "name": "sebastian/object-reflector", - "version": "1.1.1", - "version_normalized": "1.1.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "time": "2017-03-29T09:07:27+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "install-path": "../sebastian/object-reflector" - }, - { - "name": "sebastian/recursion-context", - "version": "3.0.0", - "version_normalized": "3.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "shasum": "" - }, - "require": { - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "time": "2017-03-03T06:23:57+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "install-path": "../sebastian/recursion-context" - }, - { - "name": "sebastian/resource-operations", - "version": "2.0.1", - "version_normalized": "2.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "time": "2018-10-04T04:07:39+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "install-path": "../sebastian/resource-operations" - }, - { - "name": "sebastian/type", - "version": "1.1.3", - "version_normalized": "1.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3", - "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3", - "shasum": "" - }, - "require": { - "php": "^7.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.2" - }, - "time": "2019-07-02T08:10:15+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "install-path": "../sebastian/type" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "version_normalized": "2.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "time": "2016-10-03T07:35:21+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "install-path": "../sebastian/version" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.18.1", - "version_normalized": "1.18.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "time": "2020-07-14T12:35:20+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-ctype" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.20.0", - "version_normalized": "1.20.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "time": "2020-10-23T14:02:19+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-mbstring" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.0", - "version_normalized": "1.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "time": "2020-07-12T23:59:07+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "install-path": "../theseer/tokenizer" - }, - { - "name": "webmozart/assert", - "version": "1.9.1", - "version_normalized": "1.9.1.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" - }, - "time": "2020-07-08T17:02:28+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "install-path": "../webmozart/assert" - } - ], - "dev": true, - "dev-package-names": [ - "doctrine/instantiator", - "fzaninotto/faker", - "mikey179/vfsstream", - "myclabs/deep-copy", - "phar-io/manifest", - "phar-io/version", - "phpdocumentor/reflection-common", - "phpdocumentor/reflection-docblock", - "phpdocumentor/type-resolver", - "phpspec/prophecy", - "phpunit/php-code-coverage", - "phpunit/php-file-iterator", - "phpunit/php-text-template", - "phpunit/php-timer", - "phpunit/php-token-stream", - "phpunit/phpunit", - "sebastian/code-unit-reverse-lookup", - "sebastian/comparator", - "sebastian/diff", - "sebastian/environment", - "sebastian/exporter", - "sebastian/global-state", - "sebastian/object-enumerator", - "sebastian/object-reflector", - "sebastian/recursion-context", - "sebastian/resource-operations", - "sebastian/type", - "sebastian/version", - "symfony/polyfill-ctype", - "theseer/tokenizer", - "webmozart/assert" - ] -} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php deleted file mode 100644 index 16ec92a..0000000 --- a/vendor/composer/installed.php +++ /dev/null @@ -1,486 +0,0 @@ - - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '564771da7a8141a515df1af578a2f793f6b03d37', - 'name' => 'codeigniter4/appstarter', - ), - 'versions' => - array ( - 'codeigniter4/appstarter' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '564771da7a8141a515df1af578a2f793f6b03d37', - ), - 'codeigniter4/framework' => - array ( - 'pretty_version' => 'v4.0.4', - 'version' => '4.0.4.0', - 'aliases' => - array ( - ), - 'reference' => '1edcf84f77ff794640fddbfc59a10a024cd15b50', - ), - 'doctrine/instantiator' => - array ( - 'pretty_version' => '1.3.1', - 'version' => '1.3.1.0', - 'aliases' => - array ( - ), - 'reference' => 'f350df0268e904597e3bd9c4685c53e0e333feea', - ), - 'dompdf/dompdf' => - array ( - 'pretty_version' => 'v0.8.6', - 'version' => '0.8.6.0', - 'aliases' => - array ( - ), - 'reference' => 'db91d81866c69a42dad1d2926f61515a1e3f42c5', - ), - 'fzaninotto/faker' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - 0 => '1.9.x-dev', - ), - 'reference' => 'ac73e5287024f5e98dd6d0bf10e6a6f7877b7513', - ), - 'kint-php/kint' => - array ( - 'pretty_version' => '3.3', - 'version' => '3.3.0.0', - 'aliases' => - array ( - ), - 'reference' => '335ac1bcaf04d87df70d8aa51e8887ba2c6d203b', - ), - 'laminas/laminas-escaper' => - array ( - 'pretty_version' => '2.6.1', - 'version' => '2.6.1.0', - 'aliases' => - array ( - ), - 'reference' => '25f2a053eadfa92ddacb609dcbbc39362610da70', - ), - 'laminas/laminas-zendframework-bridge' => - array ( - 'pretty_version' => '1.1.1', - 'version' => '1.1.1.0', - 'aliases' => - array ( - ), - 'reference' => '6ede70583e101030bcace4dcddd648f760ddf642', - ), - 'maennchen/zipstream-php' => - array ( - 'pretty_version' => '2.1.0', - 'version' => '2.1.0.0', - 'aliases' => - array ( - ), - 'reference' => 'c4c5803cc1f93df3d2448478ef79394a5981cc58', - ), - 'markbaker/complex' => - array ( - 'pretty_version' => '2.0.0', - 'version' => '2.0.0.0', - 'aliases' => - array ( - ), - 'reference' => '9999f1432fae467bc93c53f357105b4c31bb994c', - ), - 'markbaker/matrix' => - array ( - 'pretty_version' => '2.0.0', - 'version' => '2.0.0.0', - 'aliases' => - array ( - ), - 'reference' => '9567d9c4c519fbe40de01dbd1e4469dbbb66f46a', - ), - 'mikey179/vfsstream' => - array ( - 'pretty_version' => 'v1.6.8', - 'version' => '1.6.8.0', - 'aliases' => - array ( - ), - 'reference' => '231c73783ebb7dd9ec77916c10037eff5a2b6efe', - ), - 'myclabs/deep-copy' => - array ( - 'pretty_version' => '1.10.1', - 'version' => '1.10.1.0', - 'aliases' => - array ( - ), - 'reference' => '969b211f9a51aa1f6c01d1d2aef56d3bd91598e5', - 'replaced' => - array ( - 0 => '1.10.1', - ), - ), - 'myclabs/php-enum' => - array ( - 'pretty_version' => '1.7.7', - 'version' => '1.7.7.0', - 'aliases' => - array ( - ), - 'reference' => 'd178027d1e679832db9f38248fcc7200647dc2b7', - ), - 'phar-io/manifest' => - array ( - 'pretty_version' => '1.0.3', - 'version' => '1.0.3.0', - 'aliases' => - array ( - ), - 'reference' => '7761fcacf03b4d4f16e7ccb606d4879ca431fcf4', - ), - 'phar-io/version' => - array ( - 'pretty_version' => '2.0.1', - 'version' => '2.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '45a2ec53a73c70ce41d55cedef9063630abaf1b6', - ), - 'phenx/php-font-lib' => - array ( - 'pretty_version' => '0.5.2', - 'version' => '0.5.2.0', - 'aliases' => - array ( - ), - 'reference' => 'ca6ad461f032145fff5971b5985e5af9e7fa88d8', - ), - 'phenx/php-svg-lib' => - array ( - 'pretty_version' => 'v0.3.3', - 'version' => '0.3.3.0', - 'aliases' => - array ( - ), - 'reference' => '5fa61b65e612ce1ae15f69b3d223cb14ecc60e32', - ), - 'phpdocumentor/reflection-common' => - array ( - 'pretty_version' => '2.2.0', - 'version' => '2.2.0.0', - 'aliases' => - array ( - ), - 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', - ), - 'phpdocumentor/reflection-docblock' => - array ( - 'pretty_version' => '5.2.2', - 'version' => '5.2.2.0', - 'aliases' => - array ( - ), - 'reference' => '069a785b2141f5bcf49f3e353548dc1cce6df556', - ), - 'phpdocumentor/type-resolver' => - array ( - 'pretty_version' => '1.4.0', - 'version' => '1.4.0.0', - 'aliases' => - array ( - ), - 'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0', - ), - 'phpoffice/phpspreadsheet' => - array ( - 'pretty_version' => '1.15.0', - 'version' => '1.15.0.0', - 'aliases' => - array ( - ), - 'reference' => 'a8e8068b31b8119e1daa5b1eb5715a3a8ea8305f', - ), - 'phpspec/prophecy' => - array ( - 'pretty_version' => '1.12.1', - 'version' => '1.12.1.0', - 'aliases' => - array ( - ), - 'reference' => '8ce87516be71aae9b956f81906aaf0338e0d8a2d', - ), - 'phpunit/php-code-coverage' => - array ( - 'pretty_version' => '7.0.10', - 'version' => '7.0.10.0', - 'aliases' => - array ( - ), - 'reference' => 'f1884187926fbb755a9aaf0b3836ad3165b478bf', - ), - 'phpunit/php-file-iterator' => - array ( - 'pretty_version' => '2.0.2', - 'version' => '2.0.2.0', - 'aliases' => - array ( - ), - 'reference' => '050bedf145a257b1ff02746c31894800e5122946', - ), - 'phpunit/php-text-template' => - array ( - 'pretty_version' => '1.2.1', - 'version' => '1.2.1.0', - 'aliases' => - array ( - ), - 'reference' => '31f8b717e51d9a2afca6c9f046f5d69fc27c8686', - ), - 'phpunit/php-timer' => - array ( - 'pretty_version' => '2.1.2', - 'version' => '2.1.2.0', - 'aliases' => - array ( - ), - 'reference' => '1038454804406b0b5f5f520358e78c1c2f71501e', - ), - 'phpunit/php-token-stream' => - array ( - 'pretty_version' => '3.1.1', - 'version' => '3.1.1.0', - 'aliases' => - array ( - ), - 'reference' => '995192df77f63a59e47f025390d2d1fdf8f425ff', - ), - 'phpunit/phpunit' => - array ( - 'pretty_version' => '8.5.8', - 'version' => '8.5.8.0', - 'aliases' => - array ( - ), - 'reference' => '34c18baa6a44f1d1fbf0338907139e9dce95b997', - ), - 'psr/http-client' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621', - ), - 'psr/http-factory' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be', - ), - 'psr/http-message' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', - ), - 'psr/log' => - array ( - 'pretty_version' => '1.1.3', - 'version' => '1.1.3.0', - 'aliases' => - array ( - ), - 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', - ), - 'psr/simple-cache' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', - ), - 'sabberworm/php-css-parser' => - array ( - 'pretty_version' => '8.3.1', - 'version' => '8.3.1.0', - 'aliases' => - array ( - ), - 'reference' => 'd217848e1396ef962fb1997cf3e2421acba7f796', - ), - 'sebastian/code-unit-reverse-lookup' => - array ( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '4419fcdb5eabb9caa61a27c7a1db532a6b55dd18', - ), - 'sebastian/comparator' => - array ( - 'pretty_version' => '3.0.2', - 'version' => '3.0.2.0', - 'aliases' => - array ( - ), - 'reference' => '5de4fc177adf9bce8df98d8d141a7559d7ccf6da', - ), - 'sebastian/diff' => - array ( - 'pretty_version' => '3.0.2', - 'version' => '3.0.2.0', - 'aliases' => - array ( - ), - 'reference' => '720fcc7e9b5cf384ea68d9d930d480907a0c1a29', - ), - 'sebastian/environment' => - array ( - 'pretty_version' => '4.2.3', - 'version' => '4.2.3.0', - 'aliases' => - array ( - ), - 'reference' => '464c90d7bdf5ad4e8a6aea15c091fec0603d4368', - ), - 'sebastian/exporter' => - array ( - 'pretty_version' => '3.1.2', - 'version' => '3.1.2.0', - 'aliases' => - array ( - ), - 'reference' => '68609e1261d215ea5b21b7987539cbfbe156ec3e', - ), - 'sebastian/global-state' => - array ( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'aliases' => - array ( - ), - 'reference' => 'edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4', - ), - 'sebastian/object-enumerator' => - array ( - 'pretty_version' => '3.0.3', - 'version' => '3.0.3.0', - 'aliases' => - array ( - ), - 'reference' => '7cfd9e65d11ffb5af41198476395774d4c8a84c5', - ), - 'sebastian/object-reflector' => - array ( - 'pretty_version' => '1.1.1', - 'version' => '1.1.1.0', - 'aliases' => - array ( - ), - 'reference' => '773f97c67f28de00d397be301821b06708fca0be', - ), - 'sebastian/recursion-context' => - array ( - 'pretty_version' => '3.0.0', - 'version' => '3.0.0.0', - 'aliases' => - array ( - ), - 'reference' => '5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8', - ), - 'sebastian/resource-operations' => - array ( - 'pretty_version' => '2.0.1', - 'version' => '2.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '4d7a795d35b889bf80a0cc04e08d77cedfa917a9', - ), - 'sebastian/type' => - array ( - 'pretty_version' => '1.1.3', - 'version' => '1.1.3.0', - 'aliases' => - array ( - ), - 'reference' => '3aaaa15fa71d27650d62a948be022fe3b48541a3', - ), - 'sebastian/version' => - array ( - 'pretty_version' => '2.0.1', - 'version' => '2.0.1.0', - 'aliases' => - array ( - ), - 'reference' => '99732be0ddb3361e16ad77b68ba41efc8e979019', - ), - 'symfony/polyfill-ctype' => - array ( - 'pretty_version' => 'v1.18.1', - 'version' => '1.18.1.0', - 'aliases' => - array ( - ), - 'reference' => '1c302646f6efc070cd46856e600e5e0684d6b454', - ), - 'symfony/polyfill-mbstring' => - array ( - 'pretty_version' => 'v1.20.0', - 'version' => '1.20.0.0', - 'aliases' => - array ( - ), - 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531', - ), - 'theseer/tokenizer' => - array ( - 'pretty_version' => '1.2.0', - 'version' => '1.2.0.0', - 'aliases' => - array ( - ), - 'reference' => '75a63c33a8577608444246075ea0af0d052e452a', - ), - 'webmozart/assert' => - array ( - 'pretty_version' => '1.9.1', - 'version' => '1.9.1.0', - 'aliases' => - array ( - ), - 'reference' => 'bafc69caeb4d49c39fd0779086c03a3738cbb389', - ), - 'zendframework/zend-escaper' => - array ( - 'replaced' => - array ( - 0 => '2.6.1', - ), - ), - ), -); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php deleted file mode 100644 index 589e9e7..0000000 --- a/vendor/composer/platform_check.php +++ /dev/null @@ -1,26 +0,0 @@ -= 70200)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.0". You are running ' . PHP_VERSION . '.'; -} - -if ($issues) { - if (!headers_sent()) { - header('HTTP/1.1 500 Internal Server Error'); - } - if (!ini_get('display_errors')) { - if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { - fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); - } elseif (!headers_sent()) { - echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; - } - } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR - ); -} diff --git a/vendor/doctrine/instantiator/.doctrine-project.json b/vendor/doctrine/instantiator/.doctrine-project.json deleted file mode 100644 index 4fe86ee..0000000 --- a/vendor/doctrine/instantiator/.doctrine-project.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "active": true, - "name": "Instantiator", - "slug": "instantiator", - "docsSlug": "doctrine-instantiator", - "codePath": "/src", - "versions": [ - { - "name": "1.1", - "branchName": "master", - "slug": "latest", - "aliases": [ - "current", - "stable" - ], - "maintained": true, - "current": true - }, - { - "name": "1.0", - "branchName": "1.0.x", - "slug": "1.0" - } - ] -} - diff --git a/vendor/doctrine/instantiator/.github/FUNDING.yml b/vendor/doctrine/instantiator/.github/FUNDING.yml deleted file mode 100644 index 9a35064..0000000 --- a/vendor/doctrine/instantiator/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -patreon: phpdoctrine -tidelift: packagist/doctrine%2Finstantiator -custom: https://www.doctrine-project.org/sponsorship.html diff --git a/vendor/doctrine/instantiator/CONTRIBUTING.md b/vendor/doctrine/instantiator/CONTRIBUTING.md deleted file mode 100644 index c1a2c42..0000000 --- a/vendor/doctrine/instantiator/CONTRIBUTING.md +++ /dev/null @@ -1,35 +0,0 @@ -# Contributing - - * Follow the [Doctrine Coding Standard](https://github.com/doctrine/coding-standard) - * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php) - * Any contribution must provide tests for additional introduced conditions - * Any un-confirmed issue needs a failing test case before being accepted - * Pull requests must be sent from a new hotfix/feature branch, not from `master`. - -## Installation - -To install the project and run the tests, you need to clone it first: - -```sh -$ git clone git://github.com/doctrine/instantiator.git -``` - -You will then need to run a composer installation: - -```sh -$ cd Instantiator -$ curl -s https://getcomposer.org/installer | php -$ php composer.phar update -``` - -## Testing - -The PHPUnit version to be used is the one installed as a dev- dependency via composer: - -```sh -$ ./vendor/bin/phpunit -``` - -Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement -won't be merged. - diff --git a/vendor/doctrine/instantiator/LICENSE b/vendor/doctrine/instantiator/LICENSE deleted file mode 100644 index 4d983d1..0000000 --- a/vendor/doctrine/instantiator/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014 Doctrine Project - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/doctrine/instantiator/README.md b/vendor/doctrine/instantiator/README.md deleted file mode 100644 index eff5a0c..0000000 --- a/vendor/doctrine/instantiator/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Instantiator - -This library provides a way of avoiding usage of constructors when instantiating PHP classes. - -[![Build Status](https://travis-ci.org/doctrine/instantiator.svg?branch=master)](https://travis-ci.org/doctrine/instantiator) -[![Code Coverage](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master) -[![Dependency Status](https://www.versioneye.com/package/php--doctrine--instantiator/badge.svg)](https://www.versioneye.com/package/php--doctrine--instantiator) - -[![Latest Stable Version](https://poser.pugx.org/doctrine/instantiator/v/stable.png)](https://packagist.org/packages/doctrine/instantiator) -[![Latest Unstable Version](https://poser.pugx.org/doctrine/instantiator/v/unstable.png)](https://packagist.org/packages/doctrine/instantiator) - -## Installation - -The suggested installation method is via [composer](https://getcomposer.org/): - -```sh -php composer.phar require "doctrine/instantiator:~1.0.3" -``` - -## Usage - -The instantiator is able to create new instances of any class without using the constructor or any API of the class -itself: - -```php -$instantiator = new \Doctrine\Instantiator\Instantiator(); - -$instance = $instantiator->instantiate(\My\ClassName\Here::class); -``` - -## Contributing - -Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out! - -## Credits - -This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which -has been donated to the doctrine organization, and which is now deprecated in favour of this package. diff --git a/vendor/doctrine/instantiator/composer.json b/vendor/doctrine/instantiator/composer.json deleted file mode 100644 index a84baa7..0000000 --- a/vendor/doctrine/instantiator/composer.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "doctrine/instantiator", - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "type": "library", - "license": "MIT", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "instantiate", - "constructor" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "config": { - "platform": { - "php": "7.1.27" - } - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "ext-phar": "*", - "ext-pdo": "*", - "doctrine/coding-standard": "^6.0", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "autoload-dev": { - "psr-0": { - "DoctrineTest\\InstantiatorPerformance\\": "tests", - "DoctrineTest\\InstantiatorTest\\": "tests", - "DoctrineTest\\InstantiatorTestAsset\\": "tests" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - } -} diff --git a/vendor/doctrine/instantiator/docs/en/index.rst b/vendor/doctrine/instantiator/docs/en/index.rst deleted file mode 100644 index 0c85da0..0000000 --- a/vendor/doctrine/instantiator/docs/en/index.rst +++ /dev/null @@ -1,68 +0,0 @@ -Introduction -============ - -This library provides a way of avoiding usage of constructors when instantiating PHP classes. - -Installation -============ - -The suggested installation method is via `composer`_: - -.. code-block:: console - - $ composer require doctrine/instantiator - -Usage -===== - -The instantiator is able to create new instances of any class without -using the constructor or any API of the class itself: - -.. code-block:: php - - instantiate(User::class); - -Contributing -============ - -- Follow the `Doctrine Coding Standard`_ -- The project will follow strict `object calisthenics`_ -- Any contribution must provide tests for additional introduced - conditions -- Any un-confirmed issue needs a failing test case before being - accepted -- Pull requests must be sent from a new hotfix/feature branch, not from - ``master``. - -Testing -======= - -The PHPUnit version to be used is the one installed as a dev- dependency -via composer: - -.. code-block:: console - - $ ./vendor/bin/phpunit - -Accepted coverage for new contributions is 80%. Any contribution not -satisfying this requirement won’t be merged. - -Credits -======= - -This library was migrated from `ocramius/instantiator`_, which has been -donated to the doctrine organization, and which is now deprecated in -favour of this package. - -.. _composer: https://getcomposer.org/ -.. _CONTRIBUTING.md: CONTRIBUTING.md -.. _ocramius/instantiator: https://github.com/Ocramius/Instantiator -.. _Doctrine Coding Standard: https://github.com/doctrine/coding-standard -.. _object calisthenics: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php diff --git a/vendor/doctrine/instantiator/docs/en/sidebar.rst b/vendor/doctrine/instantiator/docs/en/sidebar.rst deleted file mode 100644 index 0c36479..0000000 --- a/vendor/doctrine/instantiator/docs/en/sidebar.rst +++ /dev/null @@ -1,4 +0,0 @@ -.. toctree:: - :depth: 3 - - index diff --git a/vendor/doctrine/instantiator/phpbench.json b/vendor/doctrine/instantiator/phpbench.json deleted file mode 100644 index fce5dd6..0000000 --- a/vendor/doctrine/instantiator/phpbench.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "bootstrap": "vendor/autoload.php", - "path": "tests/DoctrineTest/InstantiatorPerformance" -} diff --git a/vendor/doctrine/instantiator/phpcs.xml.dist b/vendor/doctrine/instantiator/phpcs.xml.dist deleted file mode 100644 index 1fcac4a..0000000 --- a/vendor/doctrine/instantiator/phpcs.xml.dist +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - src - tests - - - - - - - - - - tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php - - - - src/Doctrine/Instantiator/Exception/UnexpectedValueException.php - src/Doctrine/Instantiator/Exception/InvalidArgumentException.php - - - - src/Doctrine/Instantiator/Exception/ExceptionInterface.php - src/Doctrine/Instantiator/InstantiatorInterface.php - - diff --git a/vendor/doctrine/instantiator/phpstan.neon.dist b/vendor/doctrine/instantiator/phpstan.neon.dist deleted file mode 100644 index ecc38ef..0000000 --- a/vendor/doctrine/instantiator/phpstan.neon.dist +++ /dev/null @@ -1,19 +0,0 @@ -includes: - - vendor/phpstan/phpstan-phpunit/extension.neon - - vendor/phpstan/phpstan-phpunit/rules.neon - -parameters: - level: max - paths: - - src - - tests - - ignoreErrors: - - - message: '#::__construct\(\) does not call parent constructor from#' - path: '*/tests/DoctrineTest/InstantiatorTestAsset/*.php' - - # dynamic properties confuse static analysis - - - message: '#Access to an undefined property object::\$foo\.#' - path: '*/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php' diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php deleted file mode 100644 index e6a5195..0000000 --- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php +++ /dev/null @@ -1,12 +0,0 @@ -= 50400 && trait_exists($className)) { - return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className)); - } - - return new self(sprintf('The provided class "%s" does not exist', $className)); - } - - public static function fromAbstractClass(ReflectionClass $reflectionClass) : self - { - return new self(sprintf( - 'The provided class "%s" is abstract, and can not be instantiated', - $reflectionClass->getName() - )); - } -} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php deleted file mode 100644 index d946731..0000000 --- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php +++ /dev/null @@ -1,48 +0,0 @@ -getName() - ), - 0, - $exception - ); - } - - public static function fromUncleanUnSerialization( - ReflectionClass $reflectionClass, - string $errorString, - int $errorCode, - string $errorFile, - int $errorLine - ) : self { - return new self( - sprintf( - 'Could not produce an instance of "%s" via un-serialization, since an error was triggered ' - . 'in file "%s" at line "%d"', - $reflectionClass->getName(), - $errorFile, - $errorLine - ), - 0, - new Exception($errorString, $errorCode) - ); - } -} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php deleted file mode 100644 index 9c67862..0000000 --- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php +++ /dev/null @@ -1,203 +0,0 @@ -buildAndCacheFromFactory($className); - } - - /** - * Builds the requested object and caches it in static properties for performance - * - * @return object - */ - private function buildAndCacheFromFactory(string $className) - { - $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className); - $instance = $factory(); - - if ($this->isSafeToClone(new ReflectionClass($instance))) { - self::$cachedCloneables[$className] = clone $instance; - } - - return $instance; - } - - /** - * Builds a callable capable of instantiating the given $className without - * invoking its constructor. - * - * @throws InvalidArgumentException - * @throws UnexpectedValueException - * @throws ReflectionException - */ - private function buildFactory(string $className) : callable - { - $reflectionClass = $this->getReflectionClass($className); - - if ($this->isInstantiableViaReflection($reflectionClass)) { - return [$reflectionClass, 'newInstanceWithoutConstructor']; - } - - $serializedString = sprintf( - '%s:%d:"%s":0:{}', - is_subclass_of($className, Serializable::class) ? self::SERIALIZATION_FORMAT_USE_UNSERIALIZER : self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER, - strlen($className), - $className - ); - - $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString); - - return static function () use ($serializedString) { - return unserialize($serializedString); - }; - } - - /** - * @throws InvalidArgumentException - * @throws ReflectionException - */ - private function getReflectionClass(string $className) : ReflectionClass - { - if (! class_exists($className)) { - throw InvalidArgumentException::fromNonExistingClass($className); - } - - $reflection = new ReflectionClass($className); - - if ($reflection->isAbstract()) { - throw InvalidArgumentException::fromAbstractClass($reflection); - } - - return $reflection; - } - - /** - * @throws UnexpectedValueException - */ - private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString) : void - { - set_error_handler(static function (int $code, string $message, string $file, int $line) use ($reflectionClass, &$error) : bool { - $error = UnexpectedValueException::fromUncleanUnSerialization( - $reflectionClass, - $message, - $code, - $file, - $line - ); - - return true; - }); - - try { - $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString); - } finally { - restore_error_handler(); - } - - if ($error) { - throw $error; - } - } - - /** - * @throws UnexpectedValueException - */ - private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString) : void - { - try { - unserialize($serializedString); - } catch (Exception $exception) { - throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception); - } - } - - private function isInstantiableViaReflection(ReflectionClass $reflectionClass) : bool - { - return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal()); - } - - /** - * Verifies whether the given class is to be considered internal - */ - private function hasInternalAncestors(ReflectionClass $reflectionClass) : bool - { - do { - if ($reflectionClass->isInternal()) { - return true; - } - - $reflectionClass = $reflectionClass->getParentClass(); - } while ($reflectionClass); - - return false; - } - - /** - * Checks if a class is cloneable - * - * Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects. - */ - private function isSafeToClone(ReflectionClass $reflection) : bool - { - return $reflection->isCloneable() - && ! $reflection->hasMethod('__clone') - && ! $reflection->isSubclassOf(ArrayIterator::class); - } -} diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php deleted file mode 100644 index 95299f4..0000000 --- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php +++ /dev/null @@ -1,20 +0,0 @@ -loadHtml('hello world'); - -// (Optional) Setup the paper size and orientation -$dompdf->setPaper('A4', 'landscape'); - -// Render the HTML as PDF -$dompdf->render(); - -// Output the generated PDF to Browser -$dompdf->stream(); -``` - -### Setting Options - -Set options during dompdf instantiation: - -```php -use Dompdf\Dompdf; -use Dompdf\Options; - -$options = new Options(); -$options->set('defaultFont', 'Courier'); -$dompdf = new Dompdf($options); -``` - -or at run time - -```php -use Dompdf\Dompdf; - -$dompdf = new Dompdf(); -$options = $dompdf->getOptions(); -$options->setDefaultFont('Courier'); -$dompdf->setOptions($options); -``` - -See [Dompdf\Options](src/Options.php) for a list of available options. - - -## Limitations (Known Issues) - - * Dompdf is not particularly tolerant to poorly-formed HTML input. To avoid - any unexpected rendering issues you should either enable the built-in HTML5 - parser at runtime (`$options->setIsHtml5ParserEnabled(true);`) - or run your HTML through a HTML validator/cleaner (such as - [Tidy](http://tidy.sourceforge.net) or the - [W3C Markup Validation Service](http://validator.w3.org)). - * Table cells are not pageable, meaning a table row must fit on a single page. - * Elements are rendered on the active page when they are parsed. - * Embedding "raw" SVG's (``) isn't working yet, you need to - either link to an external SVG file, or use a DataURI like this: - ```php - $html = ''; - ``` - Watch https://github.com/dompdf/dompdf/issues/320 for progress - ---- - -[![Donate button](https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif)](http://goo.gl/DSvWf) - -*If you find this project useful, please consider making a donation. Any funds donated will be used to help further development on this project.)* diff --git a/vendor/dompdf/dompdf/VERSION b/vendor/dompdf/dompdf/VERSION deleted file mode 100644 index 7fc2521..0000000 --- a/vendor/dompdf/dompdf/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.8.6 diff --git a/vendor/dompdf/dompdf/composer.json b/vendor/dompdf/dompdf/composer.json deleted file mode 100644 index 262614d..0000000 --- a/vendor/dompdf/dompdf/composer.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "dompdf/dompdf", - "type": "library", - "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", - "homepage": "https://github.com/dompdf/dompdf", - "license": "LGPL-2.1", - "authors": [ - { - "name": "Fabien MĆ©nager", - "email": "fabien.menager@gmail.com" - }, - { - "name": "Brian Sweeney", - "email": "eclecticgeek@gmail.com" - }, - { - "name": "Gabriel Bull", - "email": "me@gabrielbull.com" - } - ], - "autoload": { - "psr-4": { - "Dompdf\\": "src/" - }, - "classmap": [ - "lib/" - ] - }, - "autoload-dev": { - "psr-4": { - "Dompdf\\Tests\\": "tests/" - } - }, - "require": { - "php": "^7.1", - "ext-dom": "*", - "ext-mbstring": "*", - "phenx/php-font-lib": "^0.5.2", - "phenx/php-svg-lib": "^0.3.3" - }, - "require-dev": { - "phpunit/phpunit": "^7.5", - "squizlabs/php_codesniffer": "^3.5", - "mockery/mockery": "^1.3" - }, - "suggest": { - "ext-gd": "Needed to process images", - "ext-imagick": "Improves image processing performance", - "ext-gmagick": "Improves image processing performance", - "ext-zlib": "Needed for pdf stream compression" - }, - "extra": { - "branch-alias": { - "dev-develop": "0.7-dev" - } - } -} diff --git a/vendor/dompdf/dompdf/lib/Cpdf.php b/vendor/dompdf/dompdf/lib/Cpdf.php deleted file mode 100644 index 0a6e9b5..0000000 --- a/vendor/dompdf/dompdf/lib/Cpdf.php +++ /dev/null @@ -1,6466 +0,0 @@ - - * @author Orion Richardson - * @author Helmut Tischer - * @author Ryan H. Masten - * @author Brian Sweeney - * @author Fabien MĆ©nager - * @license Public Domain http://creativecommons.org/licenses/publicdomain/ - * @package Cpdf - */ - -namespace Dompdf; - -use FontLib\Exception\FontNotFoundException; -use FontLib\Font; -use FontLib\BinaryStream; - -class Cpdf -{ - - const ACROFORM_SIG_SIGNATURESEXISTS = 0x0001; - const ACROFORM_SIG_APPENDONLY = 0x0002; - - const ACROFORM_FIELD_BUTTON = 'Btn'; - const ACROFORM_FIELD_TEXT = 'Tx'; - const ACROFORM_FIELD_CHOICE = 'Ch'; - const ACROFORM_FIELD_SIG = 'Sig'; - - const ACROFORM_FIELD_READONLY = 0x0001; - const ACROFORM_FIELD_REQUIRED = 0x0002; - - const ACROFORM_FIELD_TEXT_MULTILINE = 0x1000; - const ACROFORM_FIELD_TEXT_PASSWORD = 0x2000; - const ACROFORM_FIELD_TEXT_RICHTEXT = 0x10000; - - const ACROFORM_FIELD_CHOICE_COMBO = 0x20000; - const ACROFORM_FIELD_CHOICE_EDIT = 0x40000; - const ACROFORM_FIELD_CHOICE_SORT = 0x80000; - const ACROFORM_FIELD_CHOICE_MULTISELECT = 0x200000; - - const XOBJECT_SUBTYPE_FORM = 'Form'; - - /** - * @var integer The current number of pdf objects in the document - */ - public $numObj = 0; - - /** - * @var array This array contains all of the pdf objects, ready for final assembly - */ - public $objects = []; - - /** - * @var integer The objectId (number within the objects array) of the document catalog - */ - public $catalogId; - - /** - * @var integer The objectId (number within the objects array) of indirect references (Javascript EmbeddedFiles) - */ - protected $indirectReferenceId = 0; - - /** - * @var integer The objectId (number within the objects array) - */ - protected $embeddedFilesId = 0; - - /** - * AcroForm objectId - * - * @var integer - */ - public $acroFormId; - - /** - * @var int - */ - public $signatureMaxLen = 5000; - - /** - * @var array Array carrying information about the fonts that the system currently knows about - * Used to ensure that a font is not loaded twice, among other things - */ - public $fonts = []; - - /** - * @var string The default font metrics file to use if no other font has been loaded. - * The path to the directory containing the font metrics should be included - */ - public $defaultFont = './fonts/Helvetica.afm'; - - /** - * @string A record of the current font - */ - public $currentFont = ''; - - /** - * @var string The current base font - */ - public $currentBaseFont = ''; - - /** - * @var integer The number of the current font within the font array - */ - public $currentFontNum = 0; - - /** - * @var integer - */ - public $currentNode; - - /** - * @var integer Object number of the current page - */ - public $currentPage; - - /** - * @var integer Object number of the currently active contents block - */ - public $currentContents; - - /** - * @var integer Number of fonts within the system - */ - public $numFonts = 0; - - /** - * @var integer Number of graphic state resources used - */ - private $numStates = 0; - - /** - * @var array Number of graphic state resources used - */ - private $gstates = []; - - /** - * @var array Current color for fill operations, defaults to inactive value, - * all three components should be between 0 and 1 inclusive when active - */ - public $currentColor = null; - - /** - * @var array Current color for stroke operations (lines etc.) - */ - public $currentStrokeColor = null; - - /** - * @var string Fill rule (nonzero or evenodd) - */ - public $fillRule = "nonzero"; - - /** - * @var string Current style that lines are drawn in - */ - public $currentLineStyle = ''; - - /** - * @var array Current line transparency (partial graphics state) - */ - public $currentLineTransparency = ["mode" => "Normal", "opacity" => 1.0]; - - /** - * array Current fill transparency (partial graphics state) - */ - public $currentFillTransparency = ["mode" => "Normal", "opacity" => 1.0]; - - /** - * @var array An array which is used to save the state of the document, mainly the colors and styles - * it is used to temporarily change to another state, then change back to what it was before - */ - public $stateStack = []; - - /** - * @var integer Number of elements within the state stack - */ - public $nStateStack = 0; - - /** - * @var integer Number of page objects within the document - */ - public $numPages = 0; - - /** - * @var array Object Id storage stack - */ - public $stack = []; - - /** - * @var integer Number of elements within the object Id storage stack - */ - public $nStack = 0; - - /** - * an array which contains information about the objects which are not firmly attached to pages - * these have been added with the addObject function - */ - public $looseObjects = []; - - /** - * array contains information about how the loose objects are to be added to the document - */ - public $addLooseObjects = []; - - /** - * @var integer The objectId of the information object for the document - * this contains authorship, title etc. - */ - public $infoObject = 0; - - /** - * @var integer Number of images being tracked within the document - */ - public $numImages = 0; - - /** - * @var array An array containing options about the document - * it defaults to turning on the compression of the objects - */ - public $options = ['compression' => true]; - - /** - * @var integer The objectId of the first page of the document - */ - public $firstPageId; - - /** - * @var integer The object Id of the procset object - */ - public $procsetObjectId; - - /** - * @var array Store the information about the relationship between font families - * this used so that the code knows which font is the bold version of another font, etc. - * the value of this array is initialised in the constructor function. - */ - public $fontFamilies = []; - - /** - * @var string Folder for php serialized formats of font metrics files. - * If empty string, use same folder as original metrics files. - * This can be passed in from class creator. - * If this folder does not exist or is not writable, Cpdf will be **much** slower. - * Because of potential trouble with php safe mode, folder cannot be created at runtime. - */ - public $fontcache = ''; - - /** - * @var integer The version of the font metrics cache file. - * This value must be manually incremented whenever the internal font data structure is modified. - */ - public $fontcacheVersion = 6; - - /** - * @var string Temporary folder. - * If empty string, will attempt system tmp folder. - * This can be passed in from class creator. - */ - public $tmp = ''; - - /** - * @var string Track if the current font is bolded or italicised - */ - public $currentTextState = ''; - - /** - * @var string Messages are stored here during processing, these can be selected afterwards to give some useful debug information - */ - public $messages = ''; - - /** - * @var string The encryption array for the document encryption is stored here - */ - public $arc4 = ''; - - /** - * @var integer The object Id of the encryption information - */ - public $arc4_objnum = 0; - - /** - * @var string The file identifier, used to uniquely identify a pdf document - */ - public $fileIdentifier = ''; - - /** - * @var boolean A flag to say if a document is to be encrypted or not - */ - public $encrypted = false; - - /** - * @var string The encryption key for the encryption of all the document content (structure is not encrypted) - */ - public $encryptionKey = ''; - - /** - * @var array Array which forms a stack to keep track of nested callback functions - */ - public $callback = []; - - /** - * @var integer The number of callback functions in the callback array - */ - public $nCallback = 0; - - /** - * @var array Store label->id pairs for named destinations, these will be used to replace internal links - * done this way so that destinations can be defined after the location that links to them - */ - public $destinations = []; - - /** - * @var array Store the stack for the transaction commands, each item in here is a record of the values of all the - * publiciables within the class, so that the user can rollback at will (from each 'start' command) - * note that this includes the objects array, so these can be large. - */ - public $checkpoint = ''; - - /** - * @var array Table of Image origin filenames and image labels which were already added with o_image(). - * Allows to merge identical images - */ - public $imagelist = []; - - /** - * @var boolean Whether the text passed in should be treated as Unicode or just local character set. - */ - public $isUnicode = false; - - /** - * @var string the JavaScript code of the document - */ - public $javascript = ''; - - /** - * @var boolean whether the compression is possible - */ - protected $compressionReady = false; - - /** - * @var array Current page size - */ - protected $currentPageSize = ["width" => 0, "height" => 0]; - - /** - * @var array All the chars that will be required in the font subsets - */ - protected $stringSubsets = []; - - /** - * @var string The target internal encoding - */ - protected static $targetEncoding = 'Windows-1252'; - - /** - * @var array - */ - protected $byteRange = array(); - - /** - * @var array The list of the core fonts - */ - protected static $coreFonts = [ - 'courier', - 'courier-bold', - 'courier-oblique', - 'courier-boldoblique', - 'helvetica', - 'helvetica-bold', - 'helvetica-oblique', - 'helvetica-boldoblique', - 'times-roman', - 'times-bold', - 'times-italic', - 'times-bolditalic', - 'symbol', - 'zapfdingbats' - ]; - - /** - * Class constructor - * This will start a new document - * - * @param array $pageSize Array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero. - * @param boolean $isUnicode Whether text will be treated as Unicode or not. - * @param string $fontcache The font cache folder - * @param string $tmp The temporary folder - */ - function __construct($pageSize = [0, 0, 612, 792], $isUnicode = false, $fontcache = '', $tmp = '') - { - $this->isUnicode = $isUnicode; - $this->fontcache = rtrim($fontcache, DIRECTORY_SEPARATOR."/\\"); - $this->tmp = ($tmp !== '' ? $tmp : sys_get_temp_dir()); - $this->newDocument($pageSize); - - $this->compressionReady = function_exists('gzcompress'); - - if (in_array('Windows-1252', mb_list_encodings())) { - self::$targetEncoding = 'Windows-1252'; - } - - // also initialize the font families that are known about already - $this->setFontFamily('init'); - } - - /** - * Document object methods (internal use only) - * - * There is about one object method for each type of object in the pdf document - * Each function has the same call list ($id,$action,$options). - * $id = the object ID of the object, or what it is to be if it is being created - * $action = a string specifying the action to be performed, though ALL must support: - * 'new' - create the object with the id $id - * 'out' - produce the output for the pdf object - * $options = optional, a string or array containing the various parameters for the object - * - * These, in conjunction with the output function are the ONLY way for output to be produced - * within the pdf 'file'. - */ - - /** - * Destination object, used to specify the location for the user to jump to, presently on opening - * - * @param $id - * @param $action - * @param string $options - * @return string|null - */ - protected function o_destination($id, $action, $options = '') - { - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'destination', 'info' => []]; - $tmp = ''; - switch ($options['type']) { - case 'XYZ': - /** @noinspection PhpMissingBreakStatementInspection */ - case 'FitR': - $tmp = ' ' . $options['p3'] . $tmp; - case 'FitH': - case 'FitV': - case 'FitBH': - /** @noinspection PhpMissingBreakStatementInspection */ - case 'FitBV': - $tmp = ' ' . $options['p1'] . ' ' . $options['p2'] . $tmp; - case 'Fit': - case 'FitB': - $tmp = $options['type'] . $tmp; - $this->objects[$id]['info']['string'] = $tmp; - $this->objects[$id]['info']['page'] = $options['page']; - } - break; - - case 'out': - $o = &$this->objects[$id]; - - $tmp = $o['info']; - $res = "\n$id 0 obj\n" . '[' . $tmp['page'] . ' 0 R /' . $tmp['string'] . "]\nendobj"; - - return $res; - } - - return null; - } - - /** - * set the viewer preferences - * - * @param $id - * @param $action - * @param string|array $options - * @return string|null - */ - protected function o_viewerPreferences($id, $action, $options = '') - { - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'viewerPreferences', 'info' => []]; - break; - - case 'add': - $o = &$this->objects[$id]; - - foreach ($options as $k => $v) { - switch ($k) { - // Boolean keys - case 'HideToolbar': - case 'HideMenubar': - case 'HideWindowUI': - case 'FitWindow': - case 'CenterWindow': - case 'DisplayDocTitle': - case 'PickTrayByPDFSize': - $o['info'][$k] = (bool)$v; - break; - - // Integer keys - case 'NumCopies': - $o['info'][$k] = (int)$v; - break; - - // Name keys - case 'ViewArea': - case 'ViewClip': - case 'PrintClip': - case 'PrintArea': - $o['info'][$k] = (string)$v; - break; - - // Named with limited valid values - case 'NonFullScreenPageMode': - if (!in_array($v, ['UseNone', 'UseOutlines', 'UseThumbs', 'UseOC'])) { - break; - } - $o['info'][$k] = $v; - break; - - case 'Direction': - if (!in_array($v, ['L2R', 'R2L'])) { - break; - } - $o['info'][$k] = $v; - break; - - case 'PrintScaling': - if (!in_array($v, ['None', 'AppDefault'])) { - break; - } - $o['info'][$k] = $v; - break; - - case 'Duplex': - if (!in_array($v, ['None', 'Simplex', 'DuplexFlipShortEdge', 'DuplexFlipLongEdge'])) { - break; - } - $o['info'][$k] = $v; - break; - - // Integer array - case 'PrintPageRange': - // Cast to integer array - foreach ($v as $vK => $vV) { - $v[$vK] = (int)$vV; - } - $o['info'][$k] = array_values($v); - break; - } - } - break; - - case 'out': - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< "; - - foreach ($o['info'] as $k => $v) { - if (is_string($v)) { - $v = '/' . $v; - } elseif (is_int($v)) { - $v = (string) $v; - } elseif (is_bool($v)) { - $v = ($v ? 'true' : 'false'); - } elseif (is_array($v)) { - $v = '[' . implode(' ', $v) . ']'; - } - $res .= "\n/$k $v"; - } - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * define the document catalog, the overall controller for the document - * - * @param $id - * @param $action - * @param string|array $options - * @return string|null - */ - protected function o_catalog($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'catalog', 'info' => []]; - $this->catalogId = $id; - break; - - case 'acroform': - case 'outlines': - case 'pages': - case 'openHere': - case 'names': - $o['info'][$action] = $options; - break; - - case 'viewerPreferences': - if (!isset($o['info']['viewerPreferences'])) { - $this->numObj++; - $this->o_viewerPreferences($this->numObj, 'new'); - $o['info']['viewerPreferences'] = $this->numObj; - } - - $vp = $o['info']['viewerPreferences']; - $this->o_viewerPreferences($vp, 'add', $options); - - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Catalog"; - - foreach ($o['info'] as $k => $v) { - switch ($k) { - case 'outlines': - $res .= "\n/Outlines $v 0 R"; - break; - - case 'pages': - $res .= "\n/Pages $v 0 R"; - break; - - case 'viewerPreferences': - $res .= "\n/ViewerPreferences $v 0 R"; - break; - - case 'openHere': - $res .= "\n/OpenAction $v 0 R"; - break; - - case 'names': - $res .= "\n/Names $v 0 R"; - break; - - case 'acroform': - $res .= "\n/AcroForm $v 0 R"; - break; - } - } - - $res .= " >>\nendobj"; - - return $res; - } - - return null; - } - - /** - * object which is a parent to the pages in the document - * - * @param $id - * @param $action - * @param string $options - * @return string|null - */ - protected function o_pages($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'pages', 'info' => []]; - $this->o_catalog($this->catalogId, 'pages', $id); - break; - - case 'page': - if (!is_array($options)) { - // then it will just be the id of the new page - $o['info']['pages'][] = $options; - } else { - // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative - // and pos is either 'before' or 'after', saying where this page will fit. - if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) { - $i = array_search($options['rid'], $o['info']['pages']); - if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) { - - // then there is a match - // make a space - switch ($options['pos']) { - case 'before': - $k = $i; - break; - - case 'after': - $k = $i + 1; - break; - - default: - $k = -1; - break; - } - - if ($k >= 0) { - for ($j = count($o['info']['pages']) - 1; $j >= $k; $j--) { - $o['info']['pages'][$j + 1] = $o['info']['pages'][$j]; - } - - $o['info']['pages'][$k] = $options['id']; - } - } - } - } - break; - - case 'procset': - $o['info']['procset'] = $options; - break; - - case 'mediaBox': - $o['info']['mediaBox'] = $options; - // which should be an array of 4 numbers - $this->currentPageSize = ['width' => $options[2], 'height' => $options[3]]; - break; - - case 'font': - $o['info']['fonts'][] = ['objNum' => $options['objNum'], 'fontNum' => $options['fontNum']]; - break; - - case 'extGState': - $o['info']['extGStates'][] = ['objNum' => $options['objNum'], 'stateNum' => $options['stateNum']]; - break; - - case 'xObject': - $o['info']['xObjects'][] = ['objNum' => $options['objNum'], 'label' => $options['label']]; - break; - - case 'out': - if (count($o['info']['pages'])) { - $res = "\n$id 0 obj\n<< /Type /Pages\n/Kids ["; - foreach ($o['info']['pages'] as $v) { - $res .= "$v 0 R\n"; - } - - $res .= "]\n/Count " . count($this->objects[$id]['info']['pages']); - - if ((isset($o['info']['fonts']) && count($o['info']['fonts'])) || - isset($o['info']['procset']) || - (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) - ) { - $res .= "\n/Resources <<"; - - if (isset($o['info']['procset'])) { - $res .= "\n/ProcSet " . $o['info']['procset'] . " 0 R"; - } - - if (isset($o['info']['fonts']) && count($o['info']['fonts'])) { - $res .= "\n/Font << "; - foreach ($o['info']['fonts'] as $finfo) { - $res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - - if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) { - $res .= "\n/XObject << "; - foreach ($o['info']['xObjects'] as $finfo) { - $res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - - if (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) { - $res .= "\n/ExtGState << "; - foreach ($o['info']['extGStates'] as $gstate) { - $res .= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - - $res .= "\n>>"; - if (isset($o['info']['mediaBox'])) { - $tmp = $o['info']['mediaBox']; - $res .= "\n/MediaBox [" . sprintf( - '%.3F %.3F %.3F %.3F', - $tmp[0], - $tmp[1], - $tmp[2], - $tmp[3] - ) . ']'; - } - } - - $res .= "\n >>\nendobj"; - } else { - $res = "\n$id 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj"; - } - - return $res; - } - - return null; - } - - /** - * define the outlines in the doc, empty for now - * - * @param $id - * @param $action - * @param string $options - * @return string|null - */ - protected function o_outlines($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'outlines', 'info' => ['outlines' => []]]; - $this->o_catalog($this->catalogId, 'outlines', $id); - break; - - case 'outline': - $o['info']['outlines'][] = $options; - break; - - case 'out': - if (count($o['info']['outlines'])) { - $res = "\n$id 0 obj\n<< /Type /Outlines /Kids ["; - foreach ($o['info']['outlines'] as $v) { - $res .= "$v 0 R "; - } - - $res .= "] /Count " . count($o['info']['outlines']) . " >>\nendobj"; - } else { - $res = "\n$id 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj"; - } - - return $res; - } - - return null; - } - - /** - * an object to hold the font description - * - * @param $id - * @param $action - * @param string|array $options - * @return string|null - * @throws FontNotFoundException - */ - protected function o_font($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = [ - 't' => 'font', - 'info' => [ - 'name' => $options['name'], - 'fontFileName' => $options['fontFileName'], - 'SubType' => 'Type1', - 'isSubsetting' => $options['isSubsetting'] - ] - ]; - $fontNum = $this->numFonts; - $this->objects[$id]['info']['fontNum'] = $fontNum; - - // deal with the encoding and the differences - if (isset($options['differences'])) { - // then we'll need an encoding dictionary - $this->numObj++; - $this->o_fontEncoding($this->numObj, 'new', $options); - $this->objects[$id]['info']['encodingDictionary'] = $this->numObj; - } else { - if (isset($options['encoding'])) { - // we can specify encoding here - switch ($options['encoding']) { - case 'WinAnsiEncoding': - case 'MacRomanEncoding': - case 'MacExpertEncoding': - $this->objects[$id]['info']['encoding'] = $options['encoding']; - break; - - case 'none': - break; - - default: - $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; - break; - } - } else { - $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; - } - } - - if ($this->fonts[$options['fontFileName']]['isUnicode']) { - // For Unicode fonts, we need to incorporate font data into - // sub-sections that are linked from the primary font section. - // Look at o_fontGIDtoCID and o_fontDescendentCID functions - // for more information. - // - // All of this code is adapted from the excellent changes made to - // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) - - $toUnicodeId = ++$this->numObj; - $this->o_toUnicode($toUnicodeId, 'new'); - $this->objects[$id]['info']['toUnicode'] = $toUnicodeId; - - $cidFontId = ++$this->numObj; - $this->o_fontDescendentCID($cidFontId, 'new', $options); - $this->objects[$id]['info']['cidFont'] = $cidFontId; - } - - // also tell the pages node about the new font - $this->o_pages($this->currentNode, 'font', ['fontNum' => $fontNum, 'objNum' => $id]); - break; - - case 'add': - $font_options = $this->processFont($id, $o['info']); - - if ($font_options !== false) { - foreach ($font_options as $k => $v) { - switch ($k) { - case 'BaseFont': - $o['info']['name'] = $v; - break; - case 'FirstChar': - case 'LastChar': - case 'Widths': - case 'FontDescriptor': - case 'SubType': - $this->addMessage('o_font ' . $k . " : " . $v); - $o['info'][$k] = $v; - break; - } - } - - // pass values down to descendent font - if (isset($o['info']['cidFont'])) { - $this->o_fontDescendentCID($o['info']['cidFont'], 'add', $font_options); - } - } - break; - - case 'out': - if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) { - // For Unicode fonts, we need to incorporate font data into - // sub-sections that are linked from the primary font section. - // Look at o_fontGIDtoCID and o_fontDescendentCID functions - // for more information. - // - // All of this code is adapted from the excellent changes made to - // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) - - $res = "\n$id 0 obj\n<fonts[$fontFileName])) { - return false; - } - - $font = &$this->fonts[$fontFileName]; - - $fileSuffix = $font['fileSuffix']; - $fileSuffixLower = strtolower($font['fileSuffix']); - $fbfile = "$fontFileName.$fileSuffix"; - $isTtfFont = $fileSuffixLower === 'ttf'; - $isPfbFont = $fileSuffixLower === 'pfb'; - - $this->addMessage('selectFont: checking for - ' . $fbfile); - - if (!$fileSuffix) { - $this->addMessage( - 'selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts' - ); - - return false; - } else { - $adobeFontName = isset($font['PostScriptName']) ? $font['PostScriptName'] : $font['FontName']; - // $fontObj = $this->numObj; - $this->addMessage("selectFont: adding font file - $fbfile - $adobeFontName"); - - // find the array of font widths, and put that into an object. - $firstChar = -1; - $lastChar = 0; - $widths = []; - $cid_widths = []; - - foreach ($font['C'] as $num => $d) { - if (intval($num) > 0 || $num == '0') { - if (!$font['isUnicode']) { - // With Unicode, widths array isn't used - if ($lastChar > 0 && $num > $lastChar + 1) { - for ($i = $lastChar + 1; $i < $num; $i++) { - $widths[] = 0; - } - } - } - - $widths[] = $d; - - if ($font['isUnicode']) { - $cid_widths[$num] = $d; - } - - if ($firstChar == -1) { - $firstChar = $num; - } - - $lastChar = $num; - } - } - - // also need to adjust the widths for the differences array - if (isset($object['differences'])) { - foreach ($object['differences'] as $charNum => $charName) { - if ($charNum > $lastChar) { - if (!$object['isUnicode']) { - // With Unicode, widths array isn't used - for ($i = $lastChar + 1; $i <= $charNum; $i++) { - $widths[] = 0; - } - } - - $lastChar = $charNum; - } - - if (isset($font['C'][$charName])) { - $widths[$charNum - $firstChar] = $font['C'][$charName]; - if ($font['isUnicode']) { - $cid_widths[$charName] = $font['C'][$charName]; - } - } - } - } - - if ($font['isUnicode']) { - $font['CIDWidths'] = $cid_widths; - } - - $this->addMessage('selectFont: FirstChar = ' . $firstChar); - $this->addMessage('selectFont: LastChar = ' . $lastChar); - - $widthid = -1; - - if (!$font['isUnicode']) { - // With Unicode, widths array isn't used - - $this->numObj++; - $this->o_contents($this->numObj, 'new', 'raw'); - $this->objects[$this->numObj]['c'] .= '[' . implode(' ', $widths) . ']'; - $widthid = $this->numObj; - } - - $missing_width = 500; - $stemV = 70; - - if (isset($font['MissingWidth'])) { - $missing_width = $font['MissingWidth']; - } - if (isset($font['StdVW'])) { - $stemV = $font['StdVW']; - } else { - if (isset($font['Weight']) && preg_match('!(bold|black)!i', $font['Weight'])) { - $stemV = 120; - } - } - - // load the pfb file, and put that into an object too. - // note that pdf supports only binary format type 1 font files, though there is a - // simple utility to convert them from pfa to pfb. - if (!$font['isSubsetting']) { - $data = file_get_contents($fbfile); - } else { - $adobeFontName = $this->getFontSubsettingTag($font) . '+' . $adobeFontName; - $this->stringSubsets[$fontFileName][] = 32; // Force space if not in yet - - $subset = $this->stringSubsets[$fontFileName]; - sort($subset); - - // Load font - $font_obj = Font::load($fbfile); - $font_obj->parse(); - - // Define subset - $font_obj->setSubset($subset); - $font_obj->reduce(); - - // Write new font - $tmp_name = $this->tmp . "/" . basename($fbfile) . ".tmp." . uniqid(); - touch($tmp_name); - $font_obj->open($tmp_name, BinaryStream::modeReadWrite); - $font_obj->encode(["OS/2"]); - $font_obj->close(); - - // Parse the new font to get cid2gid and widths - $font_obj = Font::load($tmp_name); - - // Find Unicode char map table - $subtable = null; - foreach ($font_obj->getData("cmap", "subtables") as $_subtable) { - if ($_subtable["platformID"] == 0 || $_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1) { - $subtable = $_subtable; - break; - } - } - - if ($subtable) { - $glyphIndexArray = $subtable["glyphIndexArray"]; - $hmtx = $font_obj->getData("hmtx"); - - unset($glyphIndexArray[0xFFFF]); - - $cidtogid = str_pad('', max(array_keys($glyphIndexArray)) * 2 + 1, "\x00"); - $font['CIDWidths'] = []; - foreach ($glyphIndexArray as $cid => $gid) { - if ($cid >= 0 && $cid < 0xFFFF && $gid) { - $cidtogid[$cid * 2] = chr($gid >> 8); - $cidtogid[$cid * 2 + 1] = chr($gid & 0xFF); - } - - $width = $font_obj->normalizeFUnit(isset($hmtx[$gid]) ? $hmtx[$gid][0] : $hmtx[0][0]); - $font['CIDWidths'][$cid] = $width; - } - - $font['CIDtoGID'] = base64_encode(gzcompress($cidtogid)); - $font['CIDtoGID_Compressed'] = true; - - $data = file_get_contents($tmp_name); - } else { - $data = file_get_contents($fbfile); - } - - $font_obj->close(); - unlink($tmp_name); - } - - // create the font descriptor - $this->numObj++; - $fontDescriptorId = $this->numObj; - - $this->numObj++; - $pfbid = $this->numObj; - - // determine flags (more than a little flakey, hopefully will not matter much) - $flags = 0; - - if ($font['ItalicAngle'] != 0) { - $flags += pow(2, 6); - } - - if ($font['IsFixedPitch'] === 'true') { - $flags += 1; - } - - $flags += pow(2, 5); // assume non-sybolic - $list = [ - 'Ascent' => 'Ascender', - 'CapHeight' => 'Ascender', //FIXME: php-font-lib is not grabbing this value, so we'll fake it and use the Ascender value // 'CapHeight' - 'MissingWidth' => 'MissingWidth', - 'Descent' => 'Descender', - 'FontBBox' => 'FontBBox', - 'ItalicAngle' => 'ItalicAngle' - ]; - $fdopt = [ - 'Flags' => $flags, - 'FontName' => $adobeFontName, - 'StemV' => $stemV - ]; - - foreach ($list as $k => $v) { - if (isset($font[$v])) { - $fdopt[$k] = $font[$v]; - } - } - - if ($isPfbFont) { - $fdopt['FontFile'] = $pfbid; - } elseif ($isTtfFont) { - $fdopt['FontFile2'] = $pfbid; - } - - $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt); - - // embed the font program - $this->o_contents($this->numObj, 'new'); - $this->objects[$pfbid]['c'] .= $data; - - // determine the cruicial lengths within this file - if ($isPfbFont) { - $l1 = strpos($data, 'eexec') + 6; - $l2 = strpos($data, '00000000') - $l1; - $l3 = mb_strlen($data, '8bit') - $l2 - $l1; - $this->o_contents( - $this->numObj, - 'add', - ['Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3] - ); - } elseif ($isTtfFont) { - $l1 = mb_strlen($data, '8bit'); - $this->o_contents($this->numObj, 'add', ['Length1' => $l1]); - } - - // tell the font object about all this new stuff - $options = [ - 'BaseFont' => $adobeFontName, - 'MissingWidth' => $missing_width, - 'Widths' => $widthid, - 'FirstChar' => $firstChar, - 'LastChar' => $lastChar, - 'FontDescriptor' => $fontDescriptorId - ]; - - if ($isTtfFont) { - $options['SubType'] = 'TrueType'; - } - - $this->addMessage("adding extra info to font.($fontObjId)"); - - foreach ($options as $fk => $fv) { - $this->addMessage("$fk : $fv"); - } - } - - return $options; - } - - /** - * A toUnicode section, needed for unicode fonts - * - * @param $id - * @param $action - * @return null|string - */ - protected function o_toUnicode($id, $action) - { - switch ($action) { - case 'new': - $this->objects[$id] = [ - 't' => 'toUnicode' - ]; - break; - case 'add': - break; - case 'out': - $ordering = 'UCS'; - $registry = 'Adobe'; - - if ($this->encrypted) { - $this->encryptInit($id); - $ordering = $this->ARC4($ordering); - $registry = $this->filterText($this->ARC4($registry), false, false); - } - - $stream = <<> def -/CMapName /Adobe-Identity-UCS def -/CMapType 2 def -1 begincodespacerange -<0000> -endcodespacerange -1 beginbfrange -<0000> <0000> -endbfrange -endcmap -CMapName currentdict /CMap defineresource pop -end -end -EOT; - - $res = "\n$id 0 obj\n"; - $res .= "<>\n"; - $res .= "stream\n" . $stream . "\nendstream" . "\nendobj";; - - return $res; - } - - return null; - } - - /** - * a font descriptor, needed for including additional fonts - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_fontDescriptor($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'fontDescriptor', 'info' => $options]; - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /FontDescriptor\n"; - foreach ($o['info'] as $label => $value) { - switch ($label) { - case 'Ascent': - case 'CapHeight': - case 'Descent': - case 'Flags': - case 'ItalicAngle': - case 'StemV': - case 'AvgWidth': - case 'Leading': - case 'MaxWidth': - case 'MissingWidth': - case 'StemH': - case 'XHeight': - case 'CharSet': - if (mb_strlen($value, '8bit')) { - $res .= "/$label $value\n"; - } - - break; - case 'FontFile': - case 'FontFile2': - case 'FontFile3': - $res .= "/$label $value 0 R\n"; - break; - - case 'FontBBox': - $res .= "/$label [$value[0] $value[1] $value[2] $value[3]]\n"; - break; - - case 'FontName': - $res .= "/$label /$value\n"; - break; - } - } - - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * the font encoding - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_fontEncoding($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - // the options array should contain 'differences' and maybe 'encoding' - $this->objects[$id] = ['t' => 'fontEncoding', 'info' => $options]; - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Encoding\n"; - if (!isset($o['info']['encoding'])) { - $o['info']['encoding'] = 'WinAnsiEncoding'; - } - - if ($o['info']['encoding'] !== 'none') { - $res .= "/BaseEncoding /" . $o['info']['encoding'] . "\n"; - } - - $res .= "/Differences \n["; - - $onum = -100; - - foreach ($o['info']['differences'] as $num => $label) { - if ($num != $onum + 1) { - // we cannot make use of consecutive numbering - $res .= "\n$num /$label"; - } else { - $res .= " /$label"; - } - - $onum = $num; - } - - $res .= "\n]\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * a descendent cid font, needed for unicode fonts - * - * @param $id - * @param $action - * @param string|array $options - * @return null|string - */ - protected function o_fontDescendentCID($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'fontDescendentCID', 'info' => $options]; - - // we need a CID system info section - $cidSystemInfoId = ++$this->numObj; - $this->o_cidSystemInfo($cidSystemInfoId, 'new'); - $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId; - - // and a CID to GID map - $cidToGidMapId = ++$this->numObj; - $this->o_fontGIDtoCIDMap($cidToGidMapId, 'new', $options); - $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId; - break; - - case 'add': - foreach ($options as $k => $v) { - switch ($k) { - case 'BaseFont': - $o['info']['name'] = $v; - break; - - case 'FirstChar': - case 'LastChar': - case 'MissingWidth': - case 'FontDescriptor': - case 'SubType': - $this->addMessage("o_fontDescendentCID $k : $v"); - $o['info'][$k] = $v; - break; - } - } - - // pass values down to cid to gid map - $this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options); - break; - - case 'out': - $res = "\n$id 0 obj\n"; - $res .= "<fonts[$o['info']['fontFileName']]['CIDWidths'])) { - $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths']; - $w = ''; - foreach ($cid_widths as $cid => $width) { - $w .= "$cid [$width] "; - } - $res .= "/W [$w]\n"; - } - - $res .= "/CIDToGIDMap " . $o['info']['cidToGidMap'] . " 0 R\n"; - $res .= ">>\n"; - $res .= "endobj"; - - return $res; - } - - return null; - } - - /** - * CID system info section, needed for unicode fonts - * - * @param $id - * @param $action - * @return null|string - */ - protected function o_cidSystemInfo($id, $action) - { - switch ($action) { - case 'new': - $this->objects[$id] = [ - 't' => 'cidSystemInfo' - ]; - break; - case 'add': - break; - case 'out': - $ordering = 'UCS'; - $registry = 'Adobe'; - - if ($this->encrypted) { - $this->encryptInit($id); - $ordering = $this->ARC4($ordering); - $registry = $this->ARC4($registry); - } - - - $res = "\n$id 0 obj\n"; - - $res .= '<objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'fontGIDtoCIDMap', 'info' => $options]; - break; - - case 'out': - $res = "\n$id 0 obj\n"; - $fontFileName = $o['info']['fontFileName']; - $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']); - - $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) && - $this->fonts[$fontFileName]['CIDtoGID_Compressed']; - - if (!$compressed && isset($o['raw'])) { - $res .= $tmp; - } else { - $res .= "<<"; - - if (!$compressed && $this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on this content stream - $compressed = true; - $tmp = gzcompress($tmp, 6); - } - if ($compressed) { - $res .= "\n/Filter /FlateDecode"; - } - - if ($this->encrypted) { - $this->encryptInit($id); - $tmp = $this->ARC4($tmp); - } - - $res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream"; - } - - $res .= "\nendobj"; - - return $res; - } - - return null; - } - - /** - * the document procset, solves some problems with printing to old PS printers - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_procset($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'procset', 'info' => ['PDF' => 1, 'Text' => 1]]; - $this->o_pages($this->currentNode, 'procset', $id); - $this->procsetObjectId = $id; - break; - - case 'add': - // this is to add new items to the procset list, despite the fact that this is considered - // obsolete, the items are required for printing to some postscript printers - switch ($options) { - case 'ImageB': - case 'ImageC': - case 'ImageI': - $o['info'][$options] = 1; - break; - } - break; - - case 'out': - $res = "\n$id 0 obj\n["; - foreach ($o['info'] as $label => $val) { - $res .= "/$label "; - } - $res .= "]\nendobj"; - - return $res; - } - - return null; - } - - /** - * define the document information - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_info($id, $action, $options = '') - { - switch ($action) { - case 'new': - $this->infoObject = $id; - $date = 'D:' . @date('Ymd'); - $this->objects[$id] = [ - 't' => 'info', - 'info' => [ - 'Producer' => 'CPDF (dompdf)', - 'CreationDate' => $date - ] - ]; - break; - case 'Title': - case 'Author': - case 'Subject': - case 'Keywords': - case 'Creator': - case 'Producer': - case 'CreationDate': - case 'ModDate': - case 'Trapped': - $this->objects[$id]['info'][$action] = $options; - break; - - case 'out': - $encrypted = $this->encrypted; - if ($encrypted) { - $this->encryptInit($id); - } - - $res = "\n$id 0 obj\n<<\n"; - $o = &$this->objects[$id]; - foreach ($o['info'] as $k => $v) { - $res .= "/$k ("; - - // dates must be outputted as-is, without Unicode transformations - if ($k !== 'CreationDate' && $k !== 'ModDate') { - $v = $this->filterText($v, true, false); - } - - if ($encrypted) { - $v = $this->ARC4($v); - } - - $res .= $v; - $res .= ")\n"; - } - - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * an action object, used to link to URLS initially - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_action($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - if (is_array($options)) { - $this->objects[$id] = ['t' => 'action', 'info' => $options, 'type' => $options['type']]; - } else { - // then assume a URI action - $this->objects[$id] = ['t' => 'action', 'info' => $options, 'type' => 'URI']; - } - break; - - case 'out': - if ($this->encrypted) { - $this->encryptInit($id); - } - - $res = "\n$id 0 obj\n<< /Type /Action"; - switch ($o['type']) { - case 'ilink': - if (!isset($this->destinations[(string)$o['info']['label']])) { - break; - } - - // there will be an 'label' setting, this is the name of the destination - $res .= "\n/S /GoTo\n/D " . $this->destinations[(string)$o['info']['label']] . " 0 R"; - break; - - case 'URI': - $res .= "\n/S /URI\n/URI ("; - if ($this->encrypted) { - $res .= $this->filterText($this->ARC4($o['info']), false, false); - } else { - $res .= $this->filterText($o['info'], false, false); - } - - $res .= ")"; - break; - } - - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * an annotation object, this will add an annotation to the current page. - * initially will support just link annotations - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_annotation($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - // add the annotation to the current page - $pageId = $this->currentPage; - $this->o_page($pageId, 'annot', $id); - - // and add the action object which is going to be required - switch ($options['type']) { - case 'link': - $this->objects[$id] = ['t' => 'annotation', 'info' => $options]; - $this->numObj++; - $this->o_action($this->numObj, 'new', $options['url']); - $this->objects[$id]['info']['actionId'] = $this->numObj; - break; - - case 'ilink': - // this is to a named internal link - $label = $options['label']; - $this->objects[$id] = ['t' => 'annotation', 'info' => $options]; - $this->numObj++; - $this->o_action($this->numObj, 'new', ['type' => 'ilink', 'label' => $label]); - $this->objects[$id]['info']['actionId'] = $this->numObj; - break; - } - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Annot"; - switch ($o['info']['type']) { - case 'link': - case 'ilink': - $res .= "\n/Subtype /Link"; - break; - } - $res .= "\n/A " . $o['info']['actionId'] . " 0 R"; - $res .= "\n/Border [0 0 0]"; - $res .= "\n/H /I"; - $res .= "\n/Rect [ "; - - foreach ($o['info']['rect'] as $v) { - $res .= sprintf("%.4F ", $v); - } - - $res .= "]"; - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * a page object, it also creates a contents object to hold its contents - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_page($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->numPages++; - $this->objects[$id] = [ - 't' => 'page', - 'info' => [ - 'parent' => $this->currentNode, - 'pageNum' => $this->numPages, - 'mediaBox' => $this->objects[$this->currentNode]['info']['mediaBox'] - ] - ]; - - if (is_array($options)) { - // then this must be a page insertion, array should contain 'rid','pos'=[before|after] - $options['id'] = $id; - $this->o_pages($this->currentNode, 'page', $options); - } else { - $this->o_pages($this->currentNode, 'page', $id); - } - - $this->currentPage = $id; - //make a contents object to go with this page - $this->numObj++; - $this->o_contents($this->numObj, 'new', $id); - $this->currentContents = $this->numObj; - $this->objects[$id]['info']['contents'] = []; - $this->objects[$id]['info']['contents'][] = $this->numObj; - - $match = ($this->numPages % 2 ? 'odd' : 'even'); - foreach ($this->addLooseObjects as $oId => $target) { - if ($target === 'all' || $match === $target) { - $this->objects[$id]['info']['contents'][] = $oId; - } - } - break; - - case 'content': - $o['info']['contents'][] = $options; - break; - - case 'annot': - // add an annotation to this page - if (!isset($o['info']['annot'])) { - $o['info']['annot'] = []; - } - - // $options should contain the id of the annotation dictionary - $o['info']['annot'][] = $options; - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Page"; - if (isset($o['info']['mediaBox'])) { - $tmp = $o['info']['mediaBox']; - $res .= "\n/MediaBox [" . sprintf( - '%.3F %.3F %.3F %.3F', - $tmp[0], - $tmp[1], - $tmp[2], - $tmp[3] - ) . ']'; - } - $res .= "\n/Parent " . $o['info']['parent'] . " 0 R"; - - if (isset($o['info']['annot'])) { - $res .= "\n/Annots ["; - foreach ($o['info']['annot'] as $aId) { - $res .= " $aId 0 R"; - } - $res .= " ]"; - } - - $count = count($o['info']['contents']); - if ($count == 1) { - $res .= "\n/Contents " . $o['info']['contents'][0] . " 0 R"; - } else { - if ($count > 1) { - $res .= "\n/Contents [\n"; - - // reverse the page contents so added objects are below normal content - //foreach (array_reverse($o['info']['contents']) as $cId) { - // Back to normal now that I've got transparency working --Benj - foreach ($o['info']['contents'] as $cId) { - $res .= "$cId 0 R\n"; - } - $res .= "]"; - } - } - - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * the contents objects hold all of the content which appears on pages - * - * @param $id - * @param $action - * @param string|array $options - * @return null|string - */ - protected function o_contents($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'contents', 'c' => '', 'info' => []]; - if (mb_strlen($options, '8bit') && intval($options)) { - // then this contents is the primary for a page - $this->objects[$id]['onPage'] = $options; - } else { - if ($options === 'raw') { - // then this page contains some other type of system object - $this->objects[$id]['raw'] = 1; - } - } - break; - - case 'add': - // add more options to the declaration - foreach ($options as $k => $v) { - $o['info'][$k] = $v; - } - - case 'out': - $tmp = $o['c']; - $res = "\n$id 0 obj\n"; - - if (isset($this->objects[$id]['raw'])) { - $res .= $tmp; - } else { - $res .= "<<"; - if ($this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on this content stream - $res .= " /Filter /FlateDecode"; - $tmp = gzcompress($tmp, 6); - } - - if ($this->encrypted) { - $this->encryptInit($id); - $tmp = $this->ARC4($tmp); - } - - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - - $res .= "\n/Length " . mb_strlen($tmp, '8bit') . " >>\nstream\n$tmp\nendstream"; - } - - $res .= "\nendobj"; - - return $res; - } - - return null; - } - - /** - * @param $id - * @param $action - * @return string|null - */ - protected function o_embedjs($id, $action) - { - switch ($action) { - case 'new': - $this->objects[$id] = [ - 't' => 'embedjs', - 'info' => [ - 'Names' => '[(EmbeddedJS) ' . ($id + 1) . ' 0 R]' - ] - ]; - break; - - case 'out': - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< "; - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * @param $id - * @param $action - * @param string $code - * @return null|string - */ - protected function o_javascript($id, $action, $code = '') - { - switch ($action) { - case 'new': - $this->objects[$id] = [ - 't' => 'javascript', - 'info' => [ - 'S' => '/JavaScript', - 'JS' => '(' . $this->filterText($code, true, false) . ')', - ] - ]; - break; - - case 'out': - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< "; - - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - /** - * an image object, will be an XObject in the document, includes description and data - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_image($id, $action, $options = '') - { - switch ($action) { - case 'new': - // make the new object - $this->objects[$id] = ['t' => 'image', 'data' => &$options['data'], 'info' => []]; - - $info =& $this->objects[$id]['info']; - - $info['Type'] = '/XObject'; - $info['Subtype'] = '/Image'; - $info['Width'] = $options['iw']; - $info['Height'] = $options['ih']; - - if (isset($options['masked']) && $options['masked']) { - $info['SMask'] = ($this->numObj - 1) . ' 0 R'; - } - - if (!isset($options['type']) || $options['type'] === 'jpg') { - if (!isset($options['channels'])) { - $options['channels'] = 3; - } - - switch ($options['channels']) { - case 1: - $info['ColorSpace'] = '/DeviceGray'; - break; - case 4: - $info['ColorSpace'] = '/DeviceCMYK'; - break; - default: - $info['ColorSpace'] = '/DeviceRGB'; - break; - } - - if ($info['ColorSpace'] === '/DeviceCMYK') { - $info['Decode'] = '[1 0 1 0 1 0 1 0]'; - } - - $info['Filter'] = '/DCTDecode'; - $info['BitsPerComponent'] = 8; - } else { - if ($options['type'] === 'png') { - $info['Filter'] = '/FlateDecode'; - $info['DecodeParms'] = '<< /Predictor 15 /Colors ' . $options['ncolor'] . ' /Columns ' . $options['iw'] . ' /BitsPerComponent ' . $options['bitsPerComponent'] . '>>'; - - if ($options['isMask']) { - $info['ColorSpace'] = '/DeviceGray'; - } else { - if (mb_strlen($options['pdata'], '8bit')) { - $tmp = ' [ /Indexed /DeviceRGB ' . (mb_strlen($options['pdata'], '8bit') / 3 - 1) . ' '; - $this->numObj++; - $this->o_contents($this->numObj, 'new'); - $this->objects[$this->numObj]['c'] = $options['pdata']; - $tmp .= $this->numObj . ' 0 R'; - $tmp .= ' ]'; - $info['ColorSpace'] = $tmp; - - if (isset($options['transparency'])) { - $transparency = $options['transparency']; - switch ($transparency['type']) { - case 'indexed': - $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] '; - $info['Mask'] = $tmp; - break; - - case 'color-key': - $tmp = ' [ ' . - $transparency['r'] . ' ' . $transparency['r'] . - $transparency['g'] . ' ' . $transparency['g'] . - $transparency['b'] . ' ' . $transparency['b'] . - ' ] '; - $info['Mask'] = $tmp; - break; - } - } - } else { - if (isset($options['transparency'])) { - $transparency = $options['transparency']; - - switch ($transparency['type']) { - case 'indexed': - $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] '; - $info['Mask'] = $tmp; - break; - - case 'color-key': - $tmp = ' [ ' . - $transparency['r'] . ' ' . $transparency['r'] . ' ' . - $transparency['g'] . ' ' . $transparency['g'] . ' ' . - $transparency['b'] . ' ' . $transparency['b'] . - ' ] '; - $info['Mask'] = $tmp; - break; - } - } - $info['ColorSpace'] = '/' . $options['color']; - } - } - - $info['BitsPerComponent'] = $options['bitsPerComponent']; - } - } - - // assign it a place in the named resource dictionary as an external object, according to - // the label passed in with it. - $this->o_pages($this->currentNode, 'xObject', ['label' => $options['label'], 'objNum' => $id]); - - // also make sure that we have the right procset object for it. - $this->o_procset($this->procsetObjectId, 'add', 'ImageC'); - break; - - case 'out': - $o = &$this->objects[$id]; - $tmp = &$o['data']; - $res = "\n$id 0 obj\n<<"; - - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - - if ($this->encrypted) { - $this->encryptInit($id); - $tmp = $this->ARC4($tmp); - } - - $res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream\nendobj"; - - return $res; - } - - return null; - } - - /** - * graphics state object - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_extGState($id, $action, $options = "") - { - static $valid_params = [ - "LW", - "LC", - "LC", - "LJ", - "ML", - "D", - "RI", - "OP", - "op", - "OPM", - "Font", - "BG", - "BG2", - "UCR", - "TR", - "TR2", - "HT", - "FL", - "SM", - "SA", - "BM", - "SMask", - "CA", - "ca", - "AIS", - "TK" - ]; - - switch ($action) { - case "new": - $this->objects[$id] = ['t' => 'extGState', 'info' => $options]; - - // Tell the pages about the new resource - $this->numStates++; - $this->o_pages($this->currentNode, 'extGState', ["objNum" => $id, "stateNum" => $this->numStates]); - break; - - case "out": - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< /Type /ExtGState\n"; - - foreach ($o["info"] as $k => $v) { - if (!in_array($k, $valid_params)) { - continue; - } - $res .= "/$k $v\n"; - } - - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * @param integer $id - * @param string $action - * @param mixed $options - * @return string - */ - protected function o_xobject($id, $action, $options = '') - { - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'xobject', 'info' => $options, 'c' => '']; - break; - - case 'procset': - $this->objects[$id]['procset'] = $options; - break; - - case 'font': - $this->objects[$id]['fonts'][$options['fontNum']] = [ - 'objNum' => $options['objNum'], - 'fontNum' => $options['fontNum'] - ]; - break; - - case 'xObject': - $this->objects[$id]['xObjects'][] = ['objNum' => $options['objNum'], 'label' => $options['label']]; - break; - - case 'out': - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< /Type /XObject\n"; - - foreach ($o["info"] as $k => $v) { - switch($k) - { - case 'Subtype': - $res .= "/Subtype /$v\n"; - break; - case 'bbox': - $res .= "/BBox ["; - foreach ($v as $value) { - $res .= sprintf("%.4F ", $value); - } - $res .= "]\n"; - break; - default: - $res .= "/$k $v\n"; - break; - } - } - $res .= "/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]\n"; - - $res .= "/Resources <<"; - if (isset($o['procset'])) { - $res .= "\n/ProcSet " . $o['procset'] . " 0 R"; - } else { - $res .= "\n/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]"; - } - if (isset($o['fonts']) && count($o['fonts'])) { - $res .= "\n/Font << "; - foreach ($o['fonts'] as $finfo) { - $res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - if (isset($o['xObjects']) && count($o['xObjects'])) { - $res .= "\n/XObject << "; - foreach ($o['xObjects'] as $finfo) { - $res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - $res .= "\n>>\n"; - - $tmp = $o["c"]; - if ($this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on this content stream - $res .= " /Filter /FlateDecode\n"; - $tmp = gzcompress($tmp, 6); - } - - if ($this->encrypted) { - $this->encryptInit($id); - $tmp = $this->ARC4($tmp); - } - - $res .= "/Length " . mb_strlen($tmp, '8bit') . " >>\n"; - $res .= "stream\n" . $tmp . "\nendstream" . "\nendobj";; - - return $res; - } - - return null; - } - - /** - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_acroform($id, $action, $options = '') - { - switch ($action) { - case "new": - $this->o_catalog($this->catalogId, 'acroform', $id); - $this->objects[$id] = array('t' => 'acroform', 'info' => $options); - break; - - case 'addfield': - $this->objects[$id]['info']['Fields'][] = $options; - break; - - case 'font': - $this->objects[$id]['fonts'][$options['fontNum']] = [ - 'objNum' => $options['objNum'], - 'fontNum' => $options['fontNum'] - ]; - break; - - case "out": - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<<"; - - foreach ($o["info"] as $k => $v) { - switch($k) { - case 'Fields': - $res .= " /Fields ["; - foreach ($v as $i) { - $res .= "$i 0 R "; - } - $res .= "]\n"; - break; - default: - $res .= "/$k $v\n"; - } - } - - $res .= "/DR <<\n"; - if (isset($o['fonts']) && count($o['fonts'])) { - $res .= "/Font << \n"; - foreach ($o['fonts'] as $finfo) { - $res .= "/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R\n"; - } - $res .= ">>\n"; - } - $res .= ">>\n"; - - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * @param $id - * @param $action - * @param mixed $options - * @return null|string - */ - protected function o_field($id, $action, $options = '') - { - switch ($action) { - case "new": - $this->o_page($options['pageid'], 'annot', $id); - $this->o_acroform($this->acroFormId, 'addfield', $id); - $this->objects[$id] = ['t' => 'field', 'info' => $options]; - break; - - case 'set': - $this->objects[$id]['info'] = array_merge($this->objects[$id]['info'], $options); - break; - - case "out": - $o = &$this->objects[$id]; - $res = "\n$id 0 obj\n<< /Type /Annot /Subtype /Widget \n"; - - $encrypted = $this->encrypted; - if ($encrypted) { - $this->encryptInit($id); - } - - foreach ($o["info"] as $k => $v) { - switch ($k) { - case 'pageid': - $res .= "/P $v 0 R\n"; - break; - case 'value': - if ($encrypted) { - $v = $this->filterText($this->ARC4($v), false, false); - } - $res .= "/V ($v)\n"; - break; - case 'refvalue': - $res .= "/V $v 0 R\n"; - break; - case 'da': - if ($encrypted) { - $v = $this->filterText($this->ARC4($v), false, false); - } - $res .= "/DA ($v)\n"; - break; - case 'options': - $res .= "/Opt [\n"; - foreach ($v as $opt) { - if ($encrypted) { - $opt = $this->filterText($this->ARC4($opt), false, false); - } - $res .= "($opt)\n"; - } - $res .= "]\n"; - break; - case 'rect': - $res .= "/Rect ["; - foreach ($v as $value) { - $res .= sprintf("%.4F ", $value); - } - $res .= "]\n"; - break; - case 'appearance': - $res .= "/AP << "; - foreach ($v as $a => $ref) { - $res .= "/$a $ref 0 R "; - } - $res .= ">>\n"; - break; - case 'T': - if($encrypted) { - $v = $this->filterText($this->ARC4($v), false, false); - } - $res .= "/T ($v)\n"; - break; - default: - $res .= "/$k $v\n"; - } - - } - - $res .= ">>\nendobj"; - - return $res; - } - - return null; - - } - - /** - * - * @param $id - * @param $action - * @param string $options - * @return null|string - */ - protected function o_sig($id, $action, $options = '') - { - $sign_maxlen = $this->signatureMaxLen; - - switch ($action) { - case "new": - $this->objects[$id] = array('t' => 'sig', 'info' => $options); - $this->byteRange[$id] = ['t' => 'sig']; - break; - - case 'byterange': - $o = &$this->objects[$id]; - $content =& $options['content']; - $content_len = strlen($content); - $pos = strpos($content, sprintf("/ByteRange [ %'.010d", $id)); - $len = strlen('/ByteRange [ ********** ********** ********** ********** ]'); - $rangeStartPos = $pos + $len + 1 + 10; // before '<' - $content = substr_replace($content, str_pad(sprintf('/ByteRange [ 0 %u %u %u ]', $rangeStartPos, $rangeStartPos + $sign_maxlen + 2, $content_len - 2 - $sign_maxlen - $rangeStartPos ), $len, ' ', STR_PAD_RIGHT), $pos, $len); - - $fuid = uniqid(); - $tmpInput = $this->tmp . "/pkcs7.tmp." . $fuid . '.in'; - $tmpOutput = $this->tmp . "/pkcs7.tmp." . $fuid . '.out'; - - if (file_put_contents($tmpInput, substr($content, 0, $rangeStartPos)) === false) { - throw new \Exception("Unable to write temporary file for signing."); - } - if (file_put_contents($tmpInput, substr($content, $rangeStartPos + 2 + $sign_maxlen), - FILE_APPEND) === false) { - throw new \Exception("Unable to write temporary file for signing."); - } - - if (openssl_pkcs7_sign($tmpInput, $tmpOutput, - $o['info']['SignCert'], - array($o['info']['PrivKey'], $o['info']['Password']), - array(), PKCS7_BINARY | PKCS7_DETACHED) === false) { - throw new \Exception("Failed to prepare signature."); - } - - $signature = file_get_contents($tmpOutput); - - unlink($tmpInput); - unlink($tmpOutput); - - $sign = substr($signature, (strpos($signature, "%%EOF\n\n------") + 13)); - list($head, $signature) = explode("\n\n", $sign); - - $signature = base64_decode(trim($signature)); - - $signature = current(unpack('H*', $signature)); - $signature = str_pad($signature, $sign_maxlen, '0'); - $siglen = strlen($signature); - if (strlen($signature) > $sign_maxlen) { - throw new \Exception("Signature length ($siglen) exceeds the $sign_maxlen limit."); - } - - $content = substr_replace($content, $signature, $rangeStartPos + 1, $sign_maxlen); - break; - - case "out": - $res = "\n$id 0 obj\n<<\n"; - - $encrypted = $this->encrypted; - if ($encrypted) { - $this->encryptInit($id); - } - - $res .= "/ByteRange " .sprintf("[ %'.010d ********** ********** ********** ]\n", $id); - $res .= "/Contents <" . str_pad('', $sign_maxlen, '0') . ">\n"; - $res .= "/Filter/Adobe.PPKLite\n"; //PPKMS \n"; - $res .= "/Type/Sig/SubFilter/adbe.pkcs7.detached \n"; - - $date = "D:" . substr_replace(date('YmdHisO'), '\'', -2, 0) . '\''; - if ($encrypted) { - $date = $this->ARC4($date); - } - - $res .= "/M ($date)\n"; - $res .= "/Prop_Build << /App << /Name /DomPDF >> /Filter << /Name /Adobe.PPKLite >> >>\n"; - - $o = &$this->objects[$id]; - foreach ($o['info'] as $k => $v) { - switch($k) { - case 'Name': - case 'Location': - case 'Reason': - case 'ContactInfo': - if ($v !== null && $v !== '') { - $res .= "/$k (" . - ($encrypted ? $this->filterText($this->ARC4($v), false, false) : $v) . ") \n"; - } - break; - } - } - $res .= ">>\nendobj"; - - return $res; - } - - return null; - } - - /** - * encryption object. - * - * @param $id - * @param $action - * @param string $options - * @return string|null - */ - protected function o_encryption($id, $action, $options = '') - { - switch ($action) { - case 'new': - // make the new object - $this->objects[$id] = ['t' => 'encryption', 'info' => $options]; - $this->arc4_objnum = $id; - break; - - case 'keys': - // figure out the additional parameters required - $pad = chr(0x28) . chr(0xBF) . chr(0x4E) . chr(0x5E) . chr(0x4E) . chr(0x75) . chr(0x8A) . chr(0x41) - . chr(0x64) . chr(0x00) . chr(0x4E) . chr(0x56) . chr(0xFF) . chr(0xFA) . chr(0x01) . chr(0x08) - . chr(0x2E) . chr(0x2E) . chr(0x00) . chr(0xB6) . chr(0xD0) . chr(0x68) . chr(0x3E) . chr(0x80) - . chr(0x2F) . chr(0x0C) . chr(0xA9) . chr(0xFE) . chr(0x64) . chr(0x53) . chr(0x69) . chr(0x7A); - - $info = $this->objects[$id]['info']; - - $len = mb_strlen($info['owner'], '8bit'); - - if ($len > 32) { - $owner = substr($info['owner'], 0, 32); - } else { - if ($len < 32) { - $owner = $info['owner'] . substr($pad, 0, 32 - $len); - } else { - $owner = $info['owner']; - } - } - - $len = mb_strlen($info['user'], '8bit'); - if ($len > 32) { - $user = substr($info['user'], 0, 32); - } else { - if ($len < 32) { - $user = $info['user'] . substr($pad, 0, 32 - $len); - } else { - $user = $info['user']; - } - } - - $tmp = $this->md5_16($owner); - $okey = substr($tmp, 0, 5); - $this->ARC4_init($okey); - $ovalue = $this->ARC4($user); - $this->objects[$id]['info']['O'] = $ovalue; - - // now make the u value, phew. - $tmp = $this->md5_16( - $user . $ovalue . chr($info['p']) . chr(255) . chr(255) . chr(255) . hex2bin($this->fileIdentifier) - ); - - $ukey = substr($tmp, 0, 5); - $this->ARC4_init($ukey); - $this->encryptionKey = $ukey; - $this->encrypted = true; - $uvalue = $this->ARC4($pad); - $this->objects[$id]['info']['U'] = $uvalue; - // initialize the arc4 array - break; - - case 'out': - $o = &$this->objects[$id]; - - $res = "\n$id 0 obj\n<<"; - $res .= "\n/Filter /Standard"; - $res .= "\n/V 1"; - $res .= "\n/R 2"; - $res .= "\n/O (" . $this->filterText($o['info']['O'], false, false) . ')'; - $res .= "\n/U (" . $this->filterText($o['info']['U'], false, false) . ')'; - // and the p-value needs to be converted to account for the twos-complement approach - $o['info']['p'] = (($o['info']['p'] ^ 255) + 1) * -1; - $res .= "\n/P " . ($o['info']['p']); - $res .= "\n>>\nendobj"; - - return $res; - } - - return null; - } - - protected function o_indirect_references($id, $action, $options = null) - { - switch ($action) { - case 'new': - case 'add': - if ($id === 0) { - $id = ++$this->numObj; - $this->o_catalog($this->catalogId, 'names', $id); - $this->objects[$id] = ['t' => 'indirect_references', 'info' => $options]; - $this->indirectReferenceId = $id; - } else { - $this->objects[$id]['info'] = array_merge($this->objects[$id]['info'], $options); - } - break; - case 'out': - $res = "\n$id 0 obj << "; - - foreach($this->objects[$id]['info'] as $referenceObjName => $referenceObjId) { - $res .= "/$referenceObjName $referenceObjId 0 R "; - } - - $res .= ">> endobj"; - return $res; - } - - return null; - } - - protected function o_names($id, $action, $options = null) - { - switch ($action) { - case 'new': - case 'add': - if ($id === 0) { - $id = ++$this->numObj; - $this->objects[$id] = ['t' => 'names', 'info' => [$options]]; - $this->o_indirect_references($this->indirectReferenceId, 'add', ['EmbeddedFiles' => $id]); - $this->embeddedFilesId = $id; - } else { - $this->objects[$id]['info'][] = $options; - } - break; - case 'out': - $info = &$this->objects[$id]['info']; - $res = ''; - if (count($info) > 0) { - $res = "\n$id 0 obj << /Names [ "; - - if ($this->encrypted) { - $this->encryptInit($id); - } - - foreach ($info as $entry) { - if ($this->encrypted) { - $filename = $this->ARC4($entry['filename']); - } else { - $filename = $entry['filename']; - } - - $res .= "($filename) " . $entry['dict_reference'] . " 0 R "; - } - - $res .= "] >> endobj"; - } - return $res; - } - - return null; - } - - protected function o_embedded_file_dictionary($id, $action, $options = null) - { - switch ($action) { - case 'new': - $embeddedFileId = ++$this->numObj; - $options['embedded_reference'] = $embeddedFileId; - $this->objects[$id] = ['t' => 'embedded_file_dictionary', 'info' => $options]; - $this->o_embedded_file($embeddedFileId, 'new', $options); - $options['dict_reference'] = $id; - $this->o_names($this->embeddedFilesId, 'add', $options); - break; - case 'out': - $info = &$this->objects[$id]['info']; - - if ($this->encrypted) { - $this->encryptInit($id); - $filename = $this->ARC4($info['filename']); - $description = $this->ARC4($info['description']); - } else { - $filename = $info['filename']; - $description = $info['description']; - } - - $res = "\n$id 0 obj <>"; - $res .= " /F ($filename) /UF ($filename) /Desc ($description)"; - $res .= " >> endobj"; - return $res; - } - - return null; - } - - protected function o_embedded_file($id, $action, $options = null): ?string - { - switch ($action) { - case 'new': - $this->objects[$id] = ['t' => 'embedded_file', 'info' => $options]; - break; - case 'out': - $info = &$this->objects[$id]['info']; - - if ($this->compressionReady) { - $filepath = $info['filepath']; - $checksum = md5_file($filepath); - $f = fopen($filepath, "rb"); - - $file_content_compressed = ''; - $deflateContext = deflate_init(ZLIB_ENCODING_DEFLATE, ['level' => 6]); - while (($block = fread($f, 8192))) { - $file_content_compressed .= deflate_add($deflateContext, $block, ZLIB_NO_FLUSH); - } - $file_content_compressed .= deflate_add($deflateContext, '', ZLIB_FINISH); - $file_size_uncompressed = ftell($f); - fclose($f); - } else { - $file_content = file_get_contents($info['filepath']); - $file_size_uncompressed = mb_strlen($file_content, '8bit'); - $checksum = md5($file_content); - } - - if ($this->encrypted) { - $this->encryptInit($id); - $checksum = $this->ARC4($checksum); - $file_content_compressed = $this->ARC4($file_content_compressed); - } - $file_size_compressed = mb_strlen($file_content_compressed, '8bit'); - - $res = "\n$id 0 obj <>" . - " /Type/EmbeddedFile /Filter/FlateDecode" . - " /Length $file_size_compressed >> stream\n$file_content_compressed\nendstream\nendobj"; - - return $res; - } - - return null; - } - - /** - * ARC4 functions - * A series of function to implement ARC4 encoding in PHP - */ - - /** - * calculate the 16 byte version of the 128 bit md5 digest of the string - * - * @param $string - * @return string - */ - function md5_16($string) - { - $tmp = md5($string); - $out = ''; - for ($i = 0; $i <= 30; $i = $i + 2) { - $out .= chr(hexdec(substr($tmp, $i, 2))); - } - - return $out; - } - - /** - * initialize the encryption for processing a particular object - * - * @param $id - */ - function encryptInit($id) - { - $tmp = $this->encryptionKey; - $hex = dechex($id); - if (mb_strlen($hex, '8bit') < 6) { - $hex = substr('000000', 0, 6 - mb_strlen($hex, '8bit')) . $hex; - } - $tmp .= chr(hexdec(substr($hex, 4, 2))) - . chr(hexdec(substr($hex, 2, 2))) - . chr(hexdec(substr($hex, 0, 2))) - . chr(0) - . chr(0) - ; - $key = $this->md5_16($tmp); - $this->ARC4_init(substr($key, 0, 10)); - } - - /** - * initialize the ARC4 encryption - * - * @param string $key - */ - function ARC4_init($key = '') - { - $this->arc4 = ''; - - // setup the control array - if (mb_strlen($key, '8bit') == 0) { - return; - } - - $k = ''; - while (mb_strlen($k, '8bit') < 256) { - $k .= $key; - } - - $k = substr($k, 0, 256); - for ($i = 0; $i < 256; $i++) { - $this->arc4 .= chr($i); - } - - $j = 0; - - for ($i = 0; $i < 256; $i++) { - $t = $this->arc4[$i]; - $j = ($j + ord($t) + ord($k[$i])) % 256; - $this->arc4[$i] = $this->arc4[$j]; - $this->arc4[$j] = $t; - } - } - - /** - * ARC4 encrypt a text string - * - * @param $text - * @return string - */ - function ARC4($text) - { - $len = mb_strlen($text, '8bit'); - $a = 0; - $b = 0; - $c = $this->arc4; - $out = ''; - for ($i = 0; $i < $len; $i++) { - $a = ($a + 1) % 256; - $t = $c[$a]; - $b = ($b + ord($t)) % 256; - $c[$a] = $c[$b]; - $c[$b] = $t; - $k = ord($c[(ord($c[$a]) + ord($c[$b])) % 256]); - $out .= chr(ord($text[$i]) ^ $k); - } - - return $out; - } - - /** - * functions which can be called to adjust or add to the document - */ - - /** - * add a link in the document to an external URL - * - * @param $url - * @param $x0 - * @param $y0 - * @param $x1 - * @param $y1 - */ - function addLink($url, $x0, $y0, $x1, $y1) - { - $this->numObj++; - $info = ['type' => 'link', 'url' => $url, 'rect' => [$x0, $y0, $x1, $y1]]; - $this->o_annotation($this->numObj, 'new', $info); - } - - /** - * add a link in the document to an internal destination (ie. within the document) - * - * @param $label - * @param $x0 - * @param $y0 - * @param $x1 - * @param $y1 - */ - function addInternalLink($label, $x0, $y0, $x1, $y1) - { - $this->numObj++; - $info = ['type' => 'ilink', 'label' => $label, 'rect' => [$x0, $y0, $x1, $y1]]; - $this->o_annotation($this->numObj, 'new', $info); - } - - /** - * set the encryption of the document - * can be used to turn it on and/or set the passwords which it will have. - * also the functions that the user will have are set here, such as print, modify, add - * - * @param string $userPass - * @param string $ownerPass - * @param array $pc - */ - function setEncryption($userPass = '', $ownerPass = '', $pc = []) - { - $p = bindec("11000000"); - - $options = ['print' => 4, 'modify' => 8, 'copy' => 16, 'add' => 32]; - - foreach ($pc as $k => $v) { - if ($v && isset($options[$k])) { - $p += $options[$k]; - } else { - if (isset($options[$v])) { - $p += $options[$v]; - } - } - } - - // implement encryption on the document - if ($this->arc4_objnum == 0) { - // then the block does not exist already, add it. - $this->numObj++; - if (mb_strlen($ownerPass) == 0) { - $ownerPass = $userPass; - } - - $this->o_encryption($this->numObj, 'new', ['user' => $userPass, 'owner' => $ownerPass, 'p' => $p]); - } - } - - /** - * should be used for internal checks, not implemented as yet - */ - function checkAllHere() - { - } - - /** - * return the pdf stream as a string returned from the function - * - * @param bool $debug - * @return string - */ - function output($debug = false) - { - if ($debug) { - // turn compression off - $this->options['compression'] = false; - } - - if ($this->javascript) { - $this->numObj++; - - $js_id = $this->numObj; - $this->o_embedjs($js_id, 'new'); - $this->o_javascript(++$this->numObj, 'new', $this->javascript); - - $id = $this->catalogId; - - $this->o_indirect_references($this->indirectReferenceId, 'add', ['Javascript' => $js_id]); - } - - if ($this->fileIdentifier === '') { - $tmp = implode('', $this->objects[$this->infoObject]['info']); - $this->fileIdentifier = md5('DOMPDF' . __FILE__ . $tmp . microtime() . mt_rand()); - } - - if ($this->arc4_objnum) { - $this->o_encryption($this->arc4_objnum, 'keys'); - $this->ARC4_init($this->encryptionKey); - } - - $this->checkAllHere(); - - $xref = []; - $content = '%PDF-1.7'; - $pos = mb_strlen($content, '8bit'); - - // pre-process o_font objects before output of all objects - foreach ($this->objects as $k => $v) { - if ($v['t'] === 'font') { - $this->o_font($k, 'add'); - } - } - - foreach ($this->objects as $k => $v) { - $tmp = 'o_' . $v['t']; - $cont = $this->$tmp($k, 'out'); - $content .= $cont; - $xref[] = $pos + 1; //+1 to account for \n at the start of each object - $pos += mb_strlen($cont, '8bit'); - } - - $content .= "\nxref\n0 " . (count($xref) + 1) . "\n0000000000 65535 f \n"; - - foreach ($xref as $p) { - $content .= str_pad($p, 10, "0", STR_PAD_LEFT) . " 00000 n \n"; - } - - $content .= "trailer\n<<\n" . - '/Size ' . (count($xref) + 1) . "\n" . - '/Root 1 0 R' . "\n" . - '/Info ' . $this->infoObject . " 0 R\n" - ; - - // if encryption has been applied to this document then add the marker for this dictionary - if ($this->arc4_objnum > 0) { - $content .= '/Encrypt ' . $this->arc4_objnum . " 0 R\n"; - } - - $content .= '/ID[<' . $this->fileIdentifier . '><' . $this->fileIdentifier . ">]\n"; - - // account for \n added at start of xref table - $pos++; - - $content .= ">>\nstartxref\n$pos\n%%EOF\n"; - - if (count($this->byteRange) > 0) { - foreach ($this->byteRange as $k => $v) { - $tmp = 'o_' . $v['t']; - $this->$tmp($k, 'byterange', ['content' => &$content]); - } - } - - return $content; - } - - /** - * initialize a new document - * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum - * this function is called automatically by the constructor function - * - * @param array $pageSize - */ - private function newDocument($pageSize = [0, 0, 612, 792]) - { - $this->numObj = 0; - $this->objects = []; - - $this->numObj++; - $this->o_catalog($this->numObj, 'new'); - - $this->numObj++; - $this->o_outlines($this->numObj, 'new'); - - $this->numObj++; - $this->o_pages($this->numObj, 'new'); - - $this->o_pages($this->numObj, 'mediaBox', $pageSize); - $this->currentNode = 3; - - $this->numObj++; - $this->o_procset($this->numObj, 'new'); - - $this->numObj++; - $this->o_info($this->numObj, 'new'); - - $this->numObj++; - $this->o_page($this->numObj, 'new'); - - // need to store the first page id as there is no way to get it to the user during - // startup - $this->firstPageId = $this->currentContents; - } - - /** - * open the font file and return a php structure containing it. - * first check if this one has been done before and saved in a form more suited to php - * note that if a php serialized version does not exist it will try and make one, but will - * require write access to the directory to do it... it is MUCH faster to have these serialized - * files. - * - * @param $font - */ - private function openFont($font) - { - // assume that $font contains the path and file but not the extension - $name = basename($font); - $dir = dirname($font) . '/'; - - $fontcache = $this->fontcache; - if ($fontcache == '') { - $fontcache = rtrim($dir, DIRECTORY_SEPARATOR."/\\"); - } - - //$name filename without folder and extension of font metrics - //$dir folder of font metrics - //$fontcache folder of runtime created php serialized version of font metrics. - // If this is not given, the same folder as the font metrics will be used. - // Storing and reusing serialized versions improves speed much - - $this->addMessage("openFont: $font - $name"); - - if (!$this->isUnicode || in_array(mb_strtolower(basename($name)), self::$coreFonts)) { - $metrics_name = "$name.afm"; - } else { - $metrics_name = "$name.ufm"; - } - - $cache_name = "$metrics_name.php"; - $this->addMessage("metrics: $metrics_name, cache: $cache_name"); - - if (file_exists($fontcache . '/' . $cache_name)) { - $this->addMessage("openFont: php file exists $fontcache/$cache_name"); - $this->fonts[$font] = require($fontcache . '/' . $cache_name); - - if (!isset($this->fonts[$font]['_version_']) || $this->fonts[$font]['_version_'] != $this->fontcacheVersion) { - // if the font file is old, then clear it out and prepare for re-creation - $this->addMessage('openFont: clear out, make way for new version.'); - $this->fonts[$font] = null; - unset($this->fonts[$font]); - } - } else { - $old_cache_name = "php_$metrics_name"; - if (file_exists($fontcache . '/' . $old_cache_name)) { - $this->addMessage( - "openFont: php file doesn't exist $fontcache/$cache_name, creating it from the old format" - ); - $old_cache = file_get_contents($fontcache . '/' . $old_cache_name); - file_put_contents($fontcache . '/' . $cache_name, 'openFont($font); - return; - } - } - - if (!isset($this->fonts[$font]) && file_exists($dir . $metrics_name)) { - // then rebuild the php_.afm file from the .afm file - $this->addMessage("openFont: build php file from $dir$metrics_name"); - $data = []; - - // 20 => 'space' - $data['codeToName'] = []; - - // Since we're not going to enable Unicode for the core fonts we need to use a font-based - // setting for Unicode support rather than a global setting. - $data['isUnicode'] = (strtolower(substr($metrics_name, -3)) !== 'afm'); - - $cidtogid = ''; - if ($data['isUnicode']) { - $cidtogid = str_pad('', 256 * 256 * 2, "\x00"); - } - - $file = file($dir . $metrics_name); - - foreach ($file as $rowA) { - $row = trim($rowA); - $pos = strpos($row, ' '); - - if ($pos) { - // then there must be some keyword - $key = substr($row, 0, $pos); - switch ($key) { - case 'FontName': - case 'FullName': - case 'FamilyName': - case 'PostScriptName': - case 'Weight': - case 'ItalicAngle': - case 'IsFixedPitch': - case 'CharacterSet': - case 'UnderlinePosition': - case 'UnderlineThickness': - case 'Version': - case 'EncodingScheme': - case 'CapHeight': - case 'XHeight': - case 'Ascender': - case 'Descender': - case 'StdHW': - case 'StdVW': - case 'StartCharMetrics': - case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font. Otherwise it's too big. - $data[$key] = trim(substr($row, $pos)); - break; - - case 'FontBBox': - $data[$key] = explode(' ', trim(substr($row, $pos))); - break; - - //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; - case 'C': // Found in AFM files - $bits = explode(';', trim($row)); - $dtmp = ['C' => null, 'N' => null, 'WX' => null, 'B' => []]; - - foreach ($bits as $bit) { - $bits2 = explode(' ', trim($bit)); - if (mb_strlen($bits2[0], '8bit') == 0) { - continue; - } - - if (count($bits2) > 2) { - $dtmp[$bits2[0]] = []; - for ($i = 1; $i < count($bits2); $i++) { - $dtmp[$bits2[0]][] = $bits2[$i]; - } - } else { - if (count($bits2) == 2) { - $dtmp[$bits2[0]] = $bits2[1]; - } - } - } - - $c = (int)$dtmp['C']; - $n = $dtmp['N']; - $width = floatval($dtmp['WX']); - - if ($c >= 0) { - if (!ctype_xdigit($n) || $c != hexdec($n)) { - $data['codeToName'][$c] = $n; - } - $data['C'][$c] = $width; - } elseif (isset($n)) { - $data['C'][$n] = $width; - } - - if (!isset($data['MissingWidth']) && $c === -1 && $n === '.notdef') { - $data['MissingWidth'] = $width; - } - - break; - - // U 827 ; WX 0 ; N squaresubnosp ; G 675 ; - case 'U': // Found in UFM files - if (!$data['isUnicode']) { - break; - } - - $bits = explode(';', trim($row)); - $dtmp = ['G' => null, 'N' => null, 'U' => null, 'WX' => null]; - - foreach ($bits as $bit) { - $bits2 = explode(' ', trim($bit)); - if (mb_strlen($bits2[0], '8bit') === 0) { - continue; - } - - if (count($bits2) > 2) { - $dtmp[$bits2[0]] = []; - for ($i = 1; $i < count($bits2); $i++) { - $dtmp[$bits2[0]][] = $bits2[$i]; - } - } else { - if (count($bits2) == 2) { - $dtmp[$bits2[0]] = $bits2[1]; - } - } - } - - $c = (int)$dtmp['U']; - $n = $dtmp['N']; - $glyph = $dtmp['G']; - $width = floatval($dtmp['WX']); - - if ($c >= 0) { - // Set values in CID to GID map - if ($c >= 0 && $c < 0xFFFF && $glyph) { - $cidtogid[$c * 2] = chr($glyph >> 8); - $cidtogid[$c * 2 + 1] = chr($glyph & 0xFF); - } - - if (!ctype_xdigit($n) || $c != hexdec($n)) { - $data['codeToName'][$c] = $n; - } - $data['C'][$c] = $width; - } elseif (isset($n)) { - $data['C'][$n] = $width; - } - - if (!isset($data['MissingWidth']) && $c === -1 && $n === '.notdef') { - $data['MissingWidth'] = $width; - } - - break; - - case 'KPX': - break; // don't include them as they are not used yet - //KPX Adieresis yacute -40 - /*$bits = explode(' ', trim($row)); - $data['KPX'][$bits[1]][$bits[2]] = $bits[3]; - break;*/ - } - } - } - - if ($this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on CIDtoGID string - $data['CIDtoGID_Compressed'] = true; - $cidtogid = gzcompress($cidtogid, 6); - } - $data['CIDtoGID'] = base64_encode($cidtogid); - $data['_version_'] = $this->fontcacheVersion; - $this->fonts[$font] = $data; - - //Because of potential trouble with php safe mode, expect that the folder already exists. - //If not existing, this will hit performance because of missing cached results. - if (is_dir($fontcache) && is_writable($fontcache)) { - file_put_contents($fontcache . '/' . $cache_name, 'fonts[$font])) { - $this->addMessage("openFont: no font file found for $font. Do you need to run load_font.php?"); - } - - //pre_r($this->messages); - } - - /** - * if the font is not loaded then load it and make the required object - * else just make it the current font - * the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding' - * note that encoding='none' will need to be used for symbolic fonts - * and 'differences' => an array of mappings between numbers 0->255 and character names. - * - * @param $fontName - * @param string $encoding - * @param bool $set - * @param bool $isSubsetting - * @return int - * @throws FontNotFoundException - */ - function selectFont($fontName, $encoding = '', $set = true, $isSubsetting = true) - { - $ext = substr($fontName, -4); - if ($ext === '.afm' || $ext === '.ufm') { - $fontName = substr($fontName, 0, mb_strlen($fontName) - 4); - } - - if (!isset($this->fonts[$fontName])) { - $this->addMessage("selectFont: selecting - $fontName - $encoding, $set"); - - // load the file - $this->openFont($fontName); - - if (isset($this->fonts[$fontName])) { - $this->numObj++; - $this->numFonts++; - - $font = &$this->fonts[$fontName]; - - $name = basename($fontName); - $options = ['name' => $name, 'fontFileName' => $fontName, 'isSubsetting' => $isSubsetting]; - - if (is_array($encoding)) { - // then encoding and differences might be set - if (isset($encoding['encoding'])) { - $options['encoding'] = $encoding['encoding']; - } - - if (isset($encoding['differences'])) { - $options['differences'] = $encoding['differences']; - } - } else { - if (mb_strlen($encoding, '8bit')) { - // then perhaps only the encoding has been set - $options['encoding'] = $encoding; - } - } - - $this->o_font($this->numObj, 'new', $options); - - if (file_exists("$fontName.ttf")) { - $fileSuffix = 'ttf'; - } elseif (file_exists("$fontName.TTF")) { - $fileSuffix = 'TTF'; - } elseif (file_exists("$fontName.pfb")) { - $fileSuffix = 'pfb'; - } elseif (file_exists("$fontName.PFB")) { - $fileSuffix = 'PFB'; - } else { - $fileSuffix = ''; - } - - $font['fileSuffix'] = $fileSuffix; - - $font['fontNum'] = $this->numFonts; - $font['isSubsetting'] = $isSubsetting && $font['isUnicode'] && strtolower($fileSuffix) === 'ttf'; - - // also set the differences here, note that this means that these will take effect only the - //first time that a font is selected, else they are ignored - if (isset($options['differences'])) { - $font['differences'] = $options['differences']; - } - } - } - - if ($set && isset($this->fonts[$fontName])) { - // so if for some reason the font was not set in the last one then it will not be selected - $this->currentBaseFont = $fontName; - - // the next lines mean that if a new font is selected, then the current text state will be - // applied to it as well. - $this->currentFont = $this->currentBaseFont; - $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; - } - - return $this->currentFontNum; - } - - /** - * sets up the current font, based on the font families, and the current text state - * note that this system is quite flexible, a bold-italic font can be completely different to a - * italic-bold font, and even bold-bold will have to be defined within the family to have meaning - * This function is to be called whenever the currentTextState is changed, it will update - * the currentFont setting to whatever the appropriate family one is. - * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont - * This function will change the currentFont to whatever it should be, but will not change the - * currentBaseFont. - */ - private function setCurrentFont() - { - // if (strlen($this->currentBaseFont) == 0){ - // // then assume an initial font - // $this->selectFont($this->defaultFont); - // } - // $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1); - // if (strlen($this->currentTextState) - // && isset($this->fontFamilies[$cf]) - // && isset($this->fontFamilies[$cf][$this->currentTextState])){ - // // then we are in some state or another - // // and this font has a family, and the current setting exists within it - // // select the font, then return it - // $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState]; - // $this->selectFont($nf,'',0); - // $this->currentFont = $nf; - // $this->currentFontNum = $this->fonts[$nf]['fontNum']; - // } else { - // // the this font must not have the right family member for the current state - // // simply assume the base font - $this->currentFont = $this->currentBaseFont; - $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; - // } - } - - /** - * function for the user to find out what the ID is of the first page that was created during - * startup - useful if they wish to add something to it later. - * - * @return int - */ - function getFirstPageId() - { - return $this->firstPageId; - } - - /** - * add content to the currently active object - * - * @param $content - */ - private function addContent($content) - { - $this->objects[$this->currentContents]['c'] .= $content; - } - - /** - * sets the color for fill operations - * - * @param $color - * @param bool $force - */ - function setColor($color, $force = false) - { - $new_color = [$color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null]; - - if (!$force && $this->currentColor == $new_color) { - return; - } - - if (isset($new_color[3])) { - $this->currentColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F k", $this->currentColor)); - } else { - if (isset($new_color[2])) { - $this->currentColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F rg", $this->currentColor)); - } - } - } - - /** - * sets the color for fill operations - * - * @param $fillRule - */ - function setFillRule($fillRule) - { - if (!in_array($fillRule, ["nonzero", "evenodd"])) { - return; - } - - $this->fillRule = $fillRule; - } - - /** - * sets the color for stroke operations - * - * @param $color - * @param bool $force - */ - function setStrokeColor($color, $force = false) - { - $new_color = [$color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null]; - - if (!$force && $this->currentStrokeColor == $new_color) { - return; - } - - if (isset($new_color[3])) { - $this->currentStrokeColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F K", $this->currentStrokeColor)); - } else { - if (isset($new_color[2])) { - $this->currentStrokeColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F RG", $this->currentStrokeColor)); - } - } - } - - /** - * Set the graphics state for compositions - * - * @param $parameters - */ - function setGraphicsState($parameters) - { - // Create a new graphics state object if necessary - if (($gstate = array_search($parameters, $this->gstates)) === false) { - $this->numObj++; - $this->o_extGState($this->numObj, 'new', $parameters); - $gstate = $this->numStates; - $this->gstates[$gstate] = $parameters; - } - $this->addContent("\n/GS$gstate gs"); - } - - /** - * Set current blend mode & opacity for lines. - * - * Valid blend modes are: - * - * Normal, Multiply, Screen, Overlay, Darken, Lighten, - * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, - * Exclusion - * - * @param string $mode the blend mode to use - * @param float $opacity 0.0 fully transparent, 1.0 fully opaque - */ - function setLineTransparency($mode, $opacity) - { - static $blend_modes = [ - "Normal", - "Multiply", - "Screen", - "Overlay", - "Darken", - "Lighten", - "ColorDogde", - "ColorBurn", - "HardLight", - "SoftLight", - "Difference", - "Exclusion" - ]; - - if (!in_array($mode, $blend_modes)) { - $mode = "Normal"; - } - - // Only create a new graphics state if required - if ($mode === $this->currentLineTransparency["mode"] && - $opacity == $this->currentLineTransparency["opacity"] - ) { - return; - } - - $this->currentLineTransparency["mode"] = $mode; - $this->currentLineTransparency["opacity"] = $opacity; - - $options = [ - "BM" => "/$mode", - "CA" => (float)$opacity - ]; - - $this->setGraphicsState($options); - } - - /** - * Set current blend mode & opacity for filled objects. - * - * Valid blend modes are: - * - * Normal, Multiply, Screen, Overlay, Darken, Lighten, - * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, - * Exclusion - * - * @param string $mode the blend mode to use - * @param float $opacity 0.0 fully transparent, 1.0 fully opaque - */ - function setFillTransparency($mode, $opacity) - { - static $blend_modes = [ - "Normal", - "Multiply", - "Screen", - "Overlay", - "Darken", - "Lighten", - "ColorDogde", - "ColorBurn", - "HardLight", - "SoftLight", - "Difference", - "Exclusion" - ]; - - if (!in_array($mode, $blend_modes)) { - $mode = "Normal"; - } - - if ($mode === $this->currentFillTransparency["mode"] && - $opacity == $this->currentFillTransparency["opacity"] - ) { - return; - } - - $this->currentFillTransparency["mode"] = $mode; - $this->currentFillTransparency["opacity"] = $opacity; - - $options = [ - "BM" => "/$mode", - "ca" => (float)$opacity, - ]; - - $this->setGraphicsState($options); - } - - /** - * draw a line from one set of coordinates to another - * - * @param $x1 - * @param $y1 - * @param $x2 - * @param $y2 - * @param bool $stroke - */ - function line($x1, $y1, $x2, $y2, $stroke = true) - { - $this->addContent(sprintf("\n%.3F %.3F m %.3F %.3F l", $x1, $y1, $x2, $y2)); - - if ($stroke) { - $this->addContent(' S'); - } - } - - /** - * draw a bezier curve based on 4 control points - * - * @param $x0 - * @param $y0 - * @param $x1 - * @param $y1 - * @param $x2 - * @param $y2 - * @param $x3 - * @param $y3 - */ - function curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) - { - // in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points - // as the control points for the curve. - $this->addContent( - sprintf("\n%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c S", $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) - ); - } - - /** - * draw a part of an ellipse - * - * @param $x0 - * @param $y0 - * @param $astart - * @param $afinish - * @param $r1 - * @param int $r2 - * @param int $angle - * @param int $nSeg - */ - function partEllipse($x0, $y0, $astart, $afinish, $r1, $r2 = 0, $angle = 0, $nSeg = 8) - { - $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, false); - } - - /** - * draw a filled ellipse - * - * @param $x0 - * @param $y0 - * @param $r1 - * @param int $r2 - * @param int $angle - * @param int $nSeg - * @param int $astart - * @param int $afinish - */ - function filledEllipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360) - { - $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, true, true); - } - - /** - * @param $x - * @param $y - */ - function lineTo($x, $y) - { - $this->addContent(sprintf("\n%.3F %.3F l", $x, $y)); - } - - /** - * @param $x - * @param $y - */ - function moveTo($x, $y) - { - $this->addContent(sprintf("\n%.3F %.3F m", $x, $y)); - } - - /** - * draw a bezier curve based on 4 control points - * - * @param $x1 - * @param $y1 - * @param $x2 - * @param $y2 - * @param $x3 - * @param $y3 - */ - function curveTo($x1, $y1, $x2, $y2, $x3, $y3) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F %.3F %.3F c", $x1, $y1, $x2, $y2, $x3, $y3)); - } - - /** - * draw a bezier curve based on 4 control points - */ - function quadTo($cpx, $cpy, $x, $y) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F v", $cpx, $cpy, $x, $y)); - } - - function closePath() - { - $this->addContent(' h'); - } - - function endPath() - { - $this->addContent(' n'); - } - - /** - * draw an ellipse - * note that the part and filled ellipse are just special cases of this function - * - * draws an ellipse in the current line style - * centered at $x0,$y0, radii $r1,$r2 - * if $r2 is not set, then a circle is drawn - * from $astart to $afinish, measured in degrees, running anti-clockwise from the right hand side of the ellipse. - * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a - * pretty crappy shape at 2, as we are approximating with bezier curves. - * - * @param $x0 - * @param $y0 - * @param $r1 - * @param int $r2 - * @param int $angle - * @param int $nSeg - * @param int $astart - * @param int $afinish - * @param bool $close - * @param bool $fill - * @param bool $stroke - * @param bool $incomplete - */ - function ellipse( - $x0, - $y0, - $r1, - $r2 = 0, - $angle = 0, - $nSeg = 8, - $astart = 0, - $afinish = 360, - $close = true, - $fill = false, - $stroke = true, - $incomplete = false - ) { - if ($r1 == 0) { - return; - } - - if ($r2 == 0) { - $r2 = $r1; - } - - if ($nSeg < 2) { - $nSeg = 2; - } - - $astart = deg2rad((float)$astart); - $afinish = deg2rad((float)$afinish); - $totalAngle = $afinish - $astart; - - $dt = $totalAngle / $nSeg; - $dtm = $dt / 3; - - if ($angle != 0) { - $a = -1 * deg2rad((float)$angle); - - $this->addContent( - sprintf("\n q %.3F %.3F %.3F %.3F %.3F %.3F cm", cos($a), -sin($a), sin($a), cos($a), $x0, $y0) - ); - - $x0 = 0; - $y0 = 0; - } - - $t1 = $astart; - $a0 = $x0 + $r1 * cos($t1); - $b0 = $y0 + $r2 * sin($t1); - $c0 = -$r1 * sin($t1); - $d0 = $r2 * cos($t1); - - if (!$incomplete) { - $this->addContent(sprintf("\n%.3F %.3F m ", $a0, $b0)); - } - - for ($i = 1; $i <= $nSeg; $i++) { - // draw this bit of the total curve - $t1 = $i * $dt + $astart; - $a1 = $x0 + $r1 * cos($t1); - $b1 = $y0 + $r2 * sin($t1); - $c1 = -$r1 * sin($t1); - $d1 = $r2 * cos($t1); - - $this->addContent( - sprintf( - "\n%.3F %.3F %.3F %.3F %.3F %.3F c", - ($a0 + $c0 * $dtm), - ($b0 + $d0 * $dtm), - ($a1 - $c1 * $dtm), - ($b1 - $d1 * $dtm), - $a1, - $b1 - ) - ); - - $a0 = $a1; - $b0 = $b1; - $c0 = $c1; - $d0 = $d1; - } - - if (!$incomplete) { - if ($fill) { - $this->addContent(' f'); - } - - if ($stroke) { - if ($close) { - $this->addContent(' s'); // small 's' signifies closing the path as well - } else { - $this->addContent(' S'); - } - } - } - - if ($angle != 0) { - $this->addContent(' Q'); - } - } - - /** - * this sets the line drawing style. - * width, is the thickness of the line in user units - * cap is the type of cap to put on the line, values can be 'butt','round','square' - * where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the - * end of the line. - * join can be 'miter', 'round', 'bevel' - * dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the - * on and off dashes. - * (2) represents 2 on, 2 off, 2 on , 2 off ... - * (2,1) is 2 on, 1 off, 2 on, 1 off.. etc - * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts. - * - * @param int $width - * @param string $cap - * @param string $join - * @param string $dash - * @param int $phase - */ - function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0) - { - // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day - $string = ''; - - if ($width > 0) { - $string .= "$width w"; - } - - $ca = ['butt' => 0, 'round' => 1, 'square' => 2]; - - if (isset($ca[$cap])) { - $string .= " $ca[$cap] J"; - } - - $ja = ['miter' => 0, 'round' => 1, 'bevel' => 2]; - - if (isset($ja[$join])) { - $string .= " $ja[$join] j"; - } - - if (is_array($dash)) { - $string .= ' [ ' . implode(' ', $dash) . " ] $phase d"; - } - - $this->currentLineStyle = $string; - $this->addContent("\n$string"); - } - - /** - * draw a polygon, the syntax for this is similar to the GD polygon command - * - * @param $p - * @param $np - * @param bool $f - */ - function polygon($p, $np, $f = false) - { - $this->addContent(sprintf("\n%.3F %.3F m ", $p[0], $p[1])); - - for ($i = 2; $i < $np * 2; $i = $i + 2) { - $this->addContent(sprintf("%.3F %.3F l ", $p[$i], $p[$i + 1])); - } - - if ($f) { - $this->addContent(' f'); - } else { - $this->addContent(' S'); - } - } - - /** - * a filled rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not - * the coordinates of the upper-right corner - * - * @param $x1 - * @param $y1 - * @param $width - * @param $height - */ - function filledRectangle($x1, $y1, $width, $height) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re f", $x1, $y1, $width, $height)); - } - - /** - * draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not - * the coordinates of the upper-right corner - * - * @param $x1 - * @param $y1 - * @param $width - * @param $height - */ - function rectangle($x1, $y1, $width, $height) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re S", $x1, $y1, $width, $height)); - } - - /** - * draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not - * the coordinates of the upper-right corner - * - * @param $x1 - * @param $y1 - * @param $width - * @param $height - */ - function rect($x1, $y1, $width, $height) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re", $x1, $y1, $width, $height)); - } - - function stroke() - { - $this->addContent("\nS"); - } - - function fill() - { - $this->addContent("\nf" . ($this->fillRule === "evenodd" ? "*" : "")); - } - - function fillStroke() - { - $this->addContent("\nb" . ($this->fillRule === "evenodd" ? "*" : "")); - } - - /** - * @param string $subtype - * @param integer $x - * @param integer $y - * @param integer $w - * @param integer $h - * @return int - */ - function addXObject($subtype, $x, $y, $w, $h) - { - $id = ++$this->numObj; - $this->o_xobject($id, 'new', ['Subtype' => $subtype, 'bbox' => [$x, $y, $w, $h]]); - return $id; - } - - /** - * @param integer $numXObject - * @param string $type - * @param array $options - */ - function setXObjectResource($numXObject, $type, $options) - { - if (in_array($type, ['procset', 'font', 'xObject'])) { - $this->o_xobject($numXObject, $type, $options); - } - } - - /** - * add signature - * - * $fieldSigId = $cpdf->addFormField(Cpdf::ACROFORM_FIELD_SIG, 'Signature1', 0, 0, 0, 0, 0); - * - * $signatureId = $cpdf->addSignature([ - * 'signcert' => file_get_contents('dompdf.crt'), - * 'privkey' => file_get_contents('dompdf.key'), - * 'password' => 'password', - * 'name' => 'DomPDF DEMO', - * 'location' => 'Home', - * 'reason' => 'First Form', - * 'contactinfo' => 'info' - * ]); - * $cpdf->setFormFieldValue($fieldSigId, "$signatureId 0 R"); - * - * @param string $signcert - * @param string $privkey - * @param string $password - * @param string|null $name - * @param string|null $location - * @param string|null $reason - * @param string|null $contactinfo - * @return int - */ - function addSignature($signcert, $privkey, $password = '', - $name = null, $location = null, $reason = null, $contactinfo = null - ) { - $sigId = ++$this->numObj; - $this->o_sig($sigId, 'new', [ - 'SignCert' => $signcert, - 'PrivKey' => $privkey, - 'Password' => $password, - 'Name' => $name, - 'Location' => $location, - 'Reason' => $reason, - 'ContactInfo' => $contactinfo - ]); - - return $sigId; - } - - /** - * add field to form - * - * @param string $type ACROFORM_FIELD_* - * @param string $name - * @param $x0 - * @param $y0 - * @param $x1 - * @param $y1 - * @param integer $ff Field Flag ACROFORM_FIELD_*_* - * @param float $size - * @param array $color - * @return int - */ - public function addFormField($type, $name, $x0, $y0, $x1, $y1, $ff = 0, $size = 10.0, $color = [0, 0, 0]) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $color = implode(' ', $color) . ' rg'; - - $currentFontNum = $this->currentFontNum; - $font = array_filter($this->objects[$this->currentNode]['info']['fonts'], - function($item) use ($currentFontNum) { return $item['fontNum'] == $currentFontNum; }); - - $this->o_acroform($this->acroFormId, 'font', - ['objNum' => $font[0]['objNum'], 'fontNum' => $font[0]['fontNum']]); - - $fieldId = ++$this->numObj; - $this->o_field($fieldId, 'new', [ - 'rect' => [$x0, $y0, $x1, $y1], - 'F' => 4, - 'FT' => "/$type", - 'T' => $name, - 'Ff' => $ff, - 'pageid' => $this->currentPage, - 'da' => "$color /F$this->currentFontNum " . sprintf('%.1F Tf ', $size) - ]); - - return $fieldId; - } - - /** - * set Field value - * - * @param integer $numFieldObj - * @param string $value - */ - public function setFormFieldValue($numFieldObj, $value) - { - $this->o_field($numFieldObj, 'set', ['value' => $value]); - } - - /** - * set Field value (reference) - * - * @param integer $numFieldObj - * @param integer $numObj Object number - */ - public function setFormFieldRefValue($numFieldObj, $numObj) - { - $this->o_field($numFieldObj, 'set', ['refvalue' => $numObj]); - } - - /** - * set Field Appearanc (reference) - * - * @param integer $numFieldObj - * @param integer $normalNumObj - * @param integer|null $rolloverNumObj - * @param integer|null $downNumObj - */ - public function setFormFieldAppearance($numFieldObj, $normalNumObj, $rolloverNumObj = null, $downNumObj = null) - { - $appearance['N'] = $normalNumObj; - - if ($rolloverNumObj !== null) { - $appearance['R'] = $rolloverNumObj; - } - - if ($downNumObj !== null) { - $appearance['D'] = $downNumObj; - } - - $this->o_field($numFieldObj, 'set', ['appearance' => $appearance]); - } - - /** - * set Choice Field option values - * - * @param integer $numFieldObj - * @param array $value - */ - public function setFormFieldOpt($numFieldObj, $value) - { - $this->o_field($numFieldObj, 'set', ['options' => $value]); - } - - /** - * add form to document - * - * @param integer $sigFlags - * @param boolean $needAppearances - */ - public function addForm($sigFlags = 0, $needAppearances = false) - { - $this->acroFormId = ++$this->numObj; - $this->o_acroform($this->acroFormId, 'new', [ - 'NeedAppearances' => $needAppearances ? 'true' : 'false', - 'SigFlags' => $sigFlags - ]); - } - - /** - * save the current graphic state - */ - function save() - { - // we must reset the color cache or it will keep bad colors after clipping - $this->currentColor = null; - $this->currentStrokeColor = null; - $this->addContent("\nq"); - } - - /** - * restore the last graphic state - */ - function restore() - { - // we must reset the color cache or it will keep bad colors after clipping - $this->currentColor = null; - $this->currentStrokeColor = null; - $this->addContent("\nQ"); - } - - /** - * draw a clipping rectangle, all the elements added after this will be clipped - * - * @param $x1 - * @param $y1 - * @param $width - * @param $height - */ - function clippingRectangle($x1, $y1, $width, $height) - { - $this->save(); - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re W n", $x1, $y1, $width, $height)); - } - - /** - * draw a clipping rounded rectangle, all the elements added after this will be clipped - * - * @param $x1 - * @param $y1 - * @param $w - * @param $h - * @param $rTL - * @param $rTR - * @param $rBR - * @param $rBL - */ - function clippingRectangleRounded($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) - { - $this->save(); - - // start: top edge, left end - $this->addContent(sprintf("\n%.3F %.3F m ", $x1, $y1 - $rTL + $h)); - - // line: bottom edge, left end - $this->addContent(sprintf("\n%.3F %.3F l ", $x1, $y1 + $rBL)); - - // curve: bottom-left corner - $this->ellipse($x1 + $rBL, $y1 + $rBL, $rBL, 0, 0, 8, 180, 270, false, false, false, true); - - // line: right edge, bottom end - $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w - $rBR, $y1)); - - // curve: bottom-right corner - $this->ellipse($x1 + $w - $rBR, $y1 + $rBR, $rBR, 0, 0, 8, 270, 360, false, false, false, true); - - // line: right edge, top end - $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w, $y1 + $h - $rTR)); - - // curve: bottom-right corner - $this->ellipse($x1 + $w - $rTR, $y1 + $h - $rTR, $rTR, 0, 0, 8, 0, 90, false, false, false, true); - - // line: bottom edge, right end - $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rTL, $y1 + $h)); - - // curve: top-right corner - $this->ellipse($x1 + $rTL, $y1 + $h - $rTL, $rTL, 0, 0, 8, 90, 180, false, false, false, true); - - // line: top edge, left end - $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rBL, $y1)); - - // Close & clip - $this->addContent(" W n"); - } - - /** - * ends the last clipping shape - */ - function clippingEnd() - { - $this->restore(); - } - - /** - * scale - * - * @param float $s_x scaling factor for width as percent - * @param float $s_y scaling factor for height as percent - * @param float $x Origin abscissa - * @param float $y Origin ordinate - */ - function scale($s_x, $s_y, $x, $y) - { - $y = $this->currentPageSize["height"] - $y; - - $tm = [ - $s_x, - 0, - 0, - $s_y, - $x * (1 - $s_x), - $y * (1 - $s_y) - ]; - - $this->transform($tm); - } - - /** - * translate - * - * @param float $t_x movement to the right - * @param float $t_y movement to the bottom - */ - function translate($t_x, $t_y) - { - $tm = [ - 1, - 0, - 0, - 1, - $t_x, - -$t_y - ]; - - $this->transform($tm); - } - - /** - * rotate - * - * @param float $angle angle in degrees for counter-clockwise rotation - * @param float $x Origin abscissa - * @param float $y Origin ordinate - */ - function rotate($angle, $x, $y) - { - $y = $this->currentPageSize["height"] - $y; - - $a = deg2rad($angle); - $cos_a = cos($a); - $sin_a = sin($a); - - $tm = [ - $cos_a, - -$sin_a, - $sin_a, - $cos_a, - $x - $sin_a * $y - $cos_a * $x, - $y - $cos_a * $y + $sin_a * $x, - ]; - - $this->transform($tm); - } - - /** - * skew - * - * @param float $angle_x - * @param float $angle_y - * @param float $x Origin abscissa - * @param float $y Origin ordinate - */ - function skew($angle_x, $angle_y, $x, $y) - { - $y = $this->currentPageSize["height"] - $y; - - $tan_x = tan(deg2rad($angle_x)); - $tan_y = tan(deg2rad($angle_y)); - - $tm = [ - 1, - -$tan_y, - -$tan_x, - 1, - $tan_x * $y, - $tan_y * $x, - ]; - - $this->transform($tm); - } - - /** - * apply graphic transformations - * - * @param array $tm transformation matrix - */ - function transform($tm) - { - $this->addContent(vsprintf("\n %.3F %.3F %.3F %.3F %.3F %.3F cm", $tm)); - } - - /** - * add a new page to the document - * this also makes the new page the current active object - * - * @param int $insert - * @param int $id - * @param string $pos - * @return int - */ - function newPage($insert = 0, $id = 0, $pos = 'after') - { - // if there is a state saved, then go up the stack closing them - // then on the new page, re-open them with the right setings - - if ($this->nStateStack) { - for ($i = $this->nStateStack; $i >= 1; $i--) { - $this->restoreState($i); - } - } - - $this->numObj++; - - if ($insert) { - // the id from the ezPdf class is the id of the contents of the page, not the page object itself - // query that object to find the parent - $rid = $this->objects[$id]['onPage']; - $opt = ['rid' => $rid, 'pos' => $pos]; - $this->o_page($this->numObj, 'new', $opt); - } else { - $this->o_page($this->numObj, 'new'); - } - - // if there is a stack saved, then put that onto the page - if ($this->nStateStack) { - for ($i = 1; $i <= $this->nStateStack; $i++) { - $this->saveState($i); - } - } - - // and if there has been a stroke or fill color set, then transfer them - if (isset($this->currentColor)) { - $this->setColor($this->currentColor, true); - } - - if (isset($this->currentStrokeColor)) { - $this->setStrokeColor($this->currentStrokeColor, true); - } - - // if there is a line style set, then put this in too - if (mb_strlen($this->currentLineStyle, '8bit')) { - $this->addContent("\n$this->currentLineStyle"); - } - - // the call to the o_page object set currentContents to the present page, so this can be returned as the page id - return $this->currentContents; - } - - /** - * Streams the PDF to the client. - * - * @param string $filename The filename to present to the client. - * @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1). - */ - function stream($filename = "document.pdf", $options = []) - { - if (headers_sent()) { - die("Unable to stream pdf: headers already sent"); - } - - if (!isset($options["compress"])) $options["compress"] = true; - if (!isset($options["Attachment"])) $options["Attachment"] = true; - - $debug = !$options['compress']; - $tmp = ltrim($this->output($debug)); - - header("Cache-Control: private"); - header("Content-Type: application/pdf"); - header("Content-Length: " . mb_strlen($tmp, "8bit")); - - $filename = str_replace(["\n", "'"], "", basename($filename, ".pdf")) . ".pdf"; - $attachment = $options["Attachment"] ? "attachment" : "inline"; - - $encoding = mb_detect_encoding($filename); - $fallbackfilename = mb_convert_encoding($filename, "ISO-8859-1", $encoding); - $fallbackfilename = str_replace("\"", "", $fallbackfilename); - $encodedfilename = rawurlencode($filename); - - $contentDisposition = "Content-Disposition: $attachment; filename=\"$fallbackfilename\""; - if ($fallbackfilename !== $filename) { - $contentDisposition .= "; filename*=UTF-8''$encodedfilename"; - } - header($contentDisposition); - - echo $tmp; - flush(); - } - - /** - * return the height in units of the current font in the given size - * - * @param $size - * @return float|int - */ - function getFontHeight($size) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $font = $this->fonts[$this->currentFont]; - - // for the current font, and the given size, what is the height of the font in user units - if (isset($font['Ascender']) && isset($font['Descender'])) { - $h = $font['Ascender'] - $font['Descender']; - } else { - $h = $font['FontBBox'][3] - $font['FontBBox'][1]; - } - - // have to adjust by a font offset for Windows fonts. unfortunately it looks like - // the bounding box calculations are wrong and I don't know why. - if (isset($font['FontHeightOffset'])) { - // For CourierNew from Windows this needs to be -646 to match the - // Adobe native Courier font. - // - // For FreeMono from GNU this needs to be -337 to match the - // Courier font. - // - // Both have been added manually to the .afm and .ufm files. - $h += (int)$font['FontHeightOffset']; - } - - return $size * $h / 1000; - } - - /** - * @param $size - * @return float|int - */ - function getFontXHeight($size) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $font = $this->fonts[$this->currentFont]; - - // for the current font, and the given size, what is the height of the font in user units - if (isset($font['XHeight'])) { - $xh = $font['Ascender'] - $font['Descender']; - } else { - $xh = $this->getFontHeight($size) / 2; - } - - return $size * $xh / 1000; - } - - /** - * return the font descender, this will normally return a negative number - * if you add this number to the baseline, you get the level of the bottom of the font - * it is in the pdf user units - * - * @param $size - * @return float|int - */ - function getFontDescender($size) - { - // note that this will most likely return a negative value - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - //$h = $this->fonts[$this->currentFont]['FontBBox'][1]; - $h = $this->fonts[$this->currentFont]['Descender']; - - return $size * $h / 1000; - } - - /** - * filter the text, this is applied to all text just before being inserted into the pdf document - * it escapes the various things that need to be escaped, and so on - * - * @access private - * - * @param $text - * @param bool $bom - * @param bool $convert_encoding - * @return string - */ - function filterText($text, $bom = true, $convert_encoding = true) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - if ($convert_encoding) { - $cf = $this->currentFont; - if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) { - $text = $this->utf8toUtf16BE($text, $bom); - } else { - //$text = html_entity_decode($text, ENT_QUOTES); - $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8'); - } - } else if ($bom) { - $text = $this->utf8toUtf16BE($text, $bom); - } - - // the chr(13) substitution fixes a bug seen in TCPDF (bug #1421290) - return strtr($text, [')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r']); - } - - /** - * return array containing codepoints (UTF-8 character values) for the - * string passed in. - * - * based on the excellent TCPDF code by Nicola Asuni and the - * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html - * - * @access private - * @author Orion Richardson - * @since January 5, 2008 - * - * @param string $text UTF-8 string to process - * - * @return array UTF-8 codepoints array for the string - */ - function utf8toCodePointsArray(&$text) - { - $length = mb_strlen($text, '8bit'); // http://www.php.net/manual/en/function.mb-strlen.php#77040 - $unicode = []; // array containing unicode values - $bytes = []; // array containing single character byte sequences - $numbytes = 1; // number of octets needed to represent the UTF-8 character - - for ($i = 0; $i < $length; $i++) { - $c = ord($text[$i]); // get one string character at time - if (count($bytes) === 0) { // get starting octect - if ($c <= 0x7F) { - $unicode[] = $c; // use the character "as is" because is ASCII - $numbytes = 1; - } elseif (($c >> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN) - $bytes[] = ($c - 0xC0) << 0x06; - $numbytes = 2; - } elseif (($c >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN) - $bytes[] = ($c - 0xE0) << 0x0C; - $numbytes = 3; - } elseif (($c >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN) - $bytes[] = ($c - 0xF0) << 0x12; - $numbytes = 4; - } else { - // use replacement character for other invalid sequences - $unicode[] = 0xFFFD; - $bytes = []; - $numbytes = 1; - } - } elseif (($c >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN - $bytes[] = $c - 0x80; - if (count($bytes) === $numbytes) { - // compose UTF-8 bytes to a single unicode value - $c = $bytes[0]; - for ($j = 1; $j < $numbytes; $j++) { - $c += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); - } - if ((($c >= 0xD800) and ($c <= 0xDFFF)) or ($c >= 0x10FFFF)) { - // The definition of UTF-8 prohibits encoding character numbers between - // U+D800 and U+DFFF, which are reserved for use with the UTF-16 - // encoding form (as surrogate pairs) and do not directly represent - // characters. - $unicode[] = 0xFFFD; // use replacement character - } else { - $unicode[] = $c; // add char to array - } - // reset data for next char - $bytes = []; - $numbytes = 1; - } - } else { - // use replacement character for other invalid sequences - $unicode[] = 0xFFFD; - $bytes = []; - $numbytes = 1; - } - } - - return $unicode; - } - - /** - * convert UTF-8 to UTF-16 with an additional byte order marker - * at the front if required. - * - * based on the excellent TCPDF code by Nicola Asuni and the - * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html - * - * @access private - * @author Orion Richardson - * @since January 5, 2008 - * - * @param string $text UTF-8 string to process - * @param boolean $bom whether to add the byte order marker - * - * @return string UTF-16 result string - */ - function utf8toUtf16BE(&$text, $bom = true) - { - $out = $bom ? "\xFE\xFF" : ''; - - $unicode = $this->utf8toCodePointsArray($text); - foreach ($unicode as $c) { - if ($c === 0xFFFD) { - $out .= "\xFF\xFD"; // replacement character - } elseif ($c < 0x10000) { - $out .= chr($c >> 0x08) . chr($c & 0xFF); - } else { - $c -= 0x10000; - $w1 = 0xD800 | ($c >> 0x10); - $w2 = 0xDC00 | ($c & 0x3FF); - $out .= chr($w1 >> 0x08) . chr($w1 & 0xFF) . chr($w2 >> 0x08) . chr($w2 & 0xFF); - } - } - - return $out; - } - - /** - * given a start position and information about how text is to be laid out, calculate where - * on the page the text will end - * - * @param $x - * @param $y - * @param $angle - * @param $size - * @param $wa - * @param $text - * @return array - */ - private function getTextPosition($x, $y, $angle, $size, $wa, $text) - { - // given this information return an array containing x and y for the end position as elements 0 and 1 - $w = $this->getTextWidth($size, $text); - - // need to adjust for the number of spaces in this text - $words = explode(' ', $text); - $nspaces = count($words) - 1; - $w += $wa * $nspaces; - $a = deg2rad((float)$angle); - - return [cos($a) * $w + $x, -sin($a) * $w + $y]; - } - - /** - * Callback method used by smallCaps - * - * @param array $matches - * - * @return string - */ - function toUpper($matches) - { - return mb_strtoupper($matches[0]); - } - - function concatMatches($matches) - { - $str = ""; - foreach ($matches as $match) { - $str .= $match[0]; - } - - return $str; - } - - /** - * register text for font subsetting - * - * @param $font - * @param $text - */ - function registerText($font, $text) - { - if (!$this->isUnicode || in_array(mb_strtolower(basename($font)), self::$coreFonts)) { - return; - } - - if (!isset($this->stringSubsets[$font])) { - $this->stringSubsets[$font] = []; - } - - $this->stringSubsets[$font] = array_unique( - array_merge($this->stringSubsets[$font], $this->utf8toCodePointsArray($text)) - ); - } - - /** - * add text to the document, at a specified location, size and angle on the page - * - * @param $x - * @param $y - * @param $size - * @param $text - * @param int $angle - * @param int $wordSpaceAdjust - * @param int $charSpaceAdjust - * @param bool $smallCaps - */ - function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $text = str_replace(["\r", "\n"], "", $text); - - if ($smallCaps) { - preg_match_all("/(\P{Ll}+)/u", $text, $matches, PREG_SET_ORDER); - $lower = $this->concatMatches($matches); - d($lower); - - preg_match_all("/(\p{Ll}+)/u", $text, $matches, PREG_SET_ORDER); - $other = $this->concatMatches($matches); - d($other); - - //$text = preg_replace_callback("/\p{Ll}/u", array($this, "toUpper"), $text); - } - - // if there are any open callbacks, then they should be called, to show the start of the line - if ($this->nCallback > 0) { - for ($i = $this->nCallback; $i > 0; $i--) { - // call each function - $info = [ - 'x' => $x, - 'y' => $y, - 'angle' => $angle, - 'status' => 'sol', - 'p' => $this->callback[$i]['p'], - 'nCallback' => $this->callback[$i]['nCallback'], - 'height' => $this->callback[$i]['height'], - 'descender' => $this->callback[$i]['descender'] - ]; - - $func = $this->callback[$i]['f']; - $this->$func($info); - } - } - - if ($angle == 0) { - $this->addContent(sprintf("\nBT %.3F %.3F Td", $x, $y)); - } else { - $a = deg2rad((float)$angle); - $this->addContent( - sprintf("\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm", cos($a), -sin($a), sin($a), cos($a), $x, $y) - ); - } - - if ($wordSpaceAdjust != 0) { - $this->addContent(sprintf(" %.3F Tw", $wordSpaceAdjust)); - } - - if ($charSpaceAdjust != 0) { - $this->addContent(sprintf(" %.3F Tc", $charSpaceAdjust)); - } - - $len = mb_strlen($text); - $start = 0; - - if ($start < $len) { - $part = $text; // OAR - Don't need this anymore, given that $start always equals zero. substr($text, $start); - $place_text = $this->filterText($part, false); - // modify unicode text so that extra word spacing is manually implemented (bug #) - if ($this->fonts[$this->currentFont]['isUnicode'] && $wordSpaceAdjust != 0) { - $space_scale = 1000 / $size; - $place_text = str_replace("\x00\x20", "\x00\x20)\x00\x20" . (-round($space_scale * $wordSpaceAdjust)) . "\x00\x20(", $place_text); - } - $this->addContent(" /F$this->currentFontNum " . sprintf('%.1F Tf ', $size)); - $this->addContent(" [($place_text)] TJ"); - } - - if ($wordSpaceAdjust != 0) { - $this->addContent(sprintf(" %.3F Tw", 0)); - } - - if ($charSpaceAdjust != 0) { - $this->addContent(sprintf(" %.3F Tc", 0)); - } - - $this->addContent(' ET'); - - // if there are any open callbacks, then they should be called, to show the end of the line - if ($this->nCallback > 0) { - for ($i = $this->nCallback; $i > 0; $i--) { - // call each function - $tmp = $this->getTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text); - $info = [ - 'x' => $tmp[0], - 'y' => $tmp[1], - 'angle' => $angle, - 'status' => 'eol', - 'p' => $this->callback[$i]['p'], - 'nCallback' => $this->callback[$i]['nCallback'], - 'height' => $this->callback[$i]['height'], - 'descender' => $this->callback[$i]['descender'] - ]; - $func = $this->callback[$i]['f']; - $this->$func($info); - } - } - - if ($this->fonts[$this->currentFont]['isSubsetting']) { - $this->registerText($this->currentFont, $text); - } - } - - /** - * calculate how wide a given text string will be on a page, at a given size. - * this can be called externally, but is also used by the other class functions - * - * @param $size - * @param $text - * @param int $word_spacing - * @param int $char_spacing - * @return float|int - */ - function getTextWidth($size, $text, $word_spacing = 0, $char_spacing = 0) - { - static $ord_cache = []; - - // this function should not change any of the settings, though it will need to - // track any directives which change during calculation, so copy them at the start - // and put them back at the end. - $store_currentTextState = $this->currentTextState; - - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $text = str_replace(["\r", "\n"], "", $text); - - // converts a number or a float to a string so it can get the width - $text = "$text"; - - // hmm, this is where it all starts to get tricky - use the font information to - // calculate the width of each character, add them up and convert to user units - $w = 0; - $cf = $this->currentFont; - $current_font = $this->fonts[$cf]; - $space_scale = 1000 / ($size > 0 ? $size : 1); - $n_spaces = 0; - - if ($current_font['isUnicode']) { - // for Unicode, use the code points array to calculate width rather - // than just the string itself - $unicode = $this->utf8toCodePointsArray($text); - - foreach ($unicode as $char) { - // check if we have to replace character - if (isset($current_font['differences'][$char])) { - $char = $current_font['differences'][$char]; - } - - if (isset($current_font['C'][$char])) { - $char_width = $current_font['C'][$char]; - - // add the character width - $w += $char_width; - - // add additional padding for space - if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space - $w += $word_spacing * $space_scale; - $n_spaces++; - } - } - } - - // add additional char spacing - if ($char_spacing != 0) { - $w += $char_spacing * $space_scale * (count($unicode) + $n_spaces); - } - - } else { - // If CPDF is in Unicode mode but the current font does not support Unicode we need to convert the character set to Windows-1252 - if ($this->isUnicode) { - $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8'); - } - - $len = mb_strlen($text, 'Windows-1252'); - - for ($i = 0; $i < $len; $i++) { - $c = $text[$i]; - $char = isset($ord_cache[$c]) ? $ord_cache[$c] : ($ord_cache[$c] = ord($c)); - - // check if we have to replace character - if (isset($current_font['differences'][$char])) { - $char = $current_font['differences'][$char]; - } - - if (isset($current_font['C'][$char])) { - $char_width = $current_font['C'][$char]; - - // add the character width - $w += $char_width; - - // add additional padding for space - if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space - $w += $word_spacing * $space_scale; - $n_spaces++; - } - } - } - - // add additional char spacing - if ($char_spacing != 0) { - $w += $char_spacing * $space_scale * ($len + $n_spaces); - } - } - - $this->currentTextState = $store_currentTextState; - $this->setCurrentFont(); - - return $w * $size / 1000; - } - - /** - * this will be called at a new page to return the state to what it was on the - * end of the previous page, before the stack was closed down - * This is to get around not being able to have open 'q' across pages - * - * @param int $pageEnd - */ - function saveState($pageEnd = 0) - { - if ($pageEnd) { - // this will be called at a new page to return the state to what it was on the - // end of the previous page, before the stack was closed down - // This is to get around not being able to have open 'q' across pages - $opt = $this->stateStack[$pageEnd]; - // ok to use this as stack starts numbering at 1 - $this->setColor($opt['col'], true); - $this->setStrokeColor($opt['str'], true); - $this->addContent("\n" . $opt['lin']); - // $this->currentLineStyle = $opt['lin']; - } else { - $this->nStateStack++; - $this->stateStack[$this->nStateStack] = [ - 'col' => $this->currentColor, - 'str' => $this->currentStrokeColor, - 'lin' => $this->currentLineStyle - ]; - } - - $this->save(); - } - - /** - * restore a previously saved state - * - * @param int $pageEnd - */ - function restoreState($pageEnd = 0) - { - if (!$pageEnd) { - $n = $this->nStateStack; - $this->currentColor = $this->stateStack[$n]['col']; - $this->currentStrokeColor = $this->stateStack[$n]['str']; - $this->addContent("\n" . $this->stateStack[$n]['lin']); - $this->currentLineStyle = $this->stateStack[$n]['lin']; - $this->stateStack[$n] = null; - unset($this->stateStack[$n]); - $this->nStateStack--; - } - - $this->restore(); - } - - /** - * make a loose object, the output will go into this object, until it is closed, then will revert to - * the current one. - * this object will not appear until it is included within a page. - * the function will return the object number - * - * @return int - */ - function openObject() - { - $this->nStack++; - $this->stack[$this->nStack] = ['c' => $this->currentContents, 'p' => $this->currentPage]; - // add a new object of the content type, to hold the data flow - $this->numObj++; - $this->o_contents($this->numObj, 'new'); - $this->currentContents = $this->numObj; - $this->looseObjects[$this->numObj] = 1; - - return $this->numObj; - } - - /** - * open an existing object for editing - * - * @param $id - */ - function reopenObject($id) - { - $this->nStack++; - $this->stack[$this->nStack] = ['c' => $this->currentContents, 'p' => $this->currentPage]; - $this->currentContents = $id; - - // also if this object is the primary contents for a page, then set the current page to its parent - if (isset($this->objects[$id]['onPage'])) { - $this->currentPage = $this->objects[$id]['onPage']; - } - } - - /** - * close an object - */ - function closeObject() - { - // close the object, as long as there was one open in the first place, which will be indicated by - // an objectId on the stack. - if ($this->nStack > 0) { - $this->currentContents = $this->stack[$this->nStack]['c']; - $this->currentPage = $this->stack[$this->nStack]['p']; - $this->nStack--; - // easier to probably not worry about removing the old entries, they will be overwritten - // if there are new ones. - } - } - - /** - * stop an object from appearing on pages from this point on - * - * @param $id - */ - function stopObject($id) - { - // if an object has been appearing on pages up to now, then stop it, this page will - // be the last one that could contain it. - if (isset($this->addLooseObjects[$id])) { - $this->addLooseObjects[$id] = ''; - } - } - - /** - * after an object has been created, it wil only show if it has been added, using this function. - * - * @param $id - * @param string $options - */ - function addObject($id, $options = 'add') - { - // add the specified object to the page - if (isset($this->looseObjects[$id]) && $this->currentContents != $id) { - // then it is a valid object, and it is not being added to itself - switch ($options) { - case 'all': - // then this object is to be added to this page (done in the next block) and - // all future new pages. - $this->addLooseObjects[$id] = 'all'; - - case 'add': - if (isset($this->objects[$this->currentContents]['onPage'])) { - // then the destination contents is the primary for the page - // (though this object is actually added to that page) - $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id); - } - break; - - case 'even': - $this->addLooseObjects[$id] = 'even'; - $pageObjectId = $this->objects[$this->currentContents]['onPage']; - if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 0) { - $this->addObject($id); - // hacky huh :) - } - break; - - case 'odd': - $this->addLooseObjects[$id] = 'odd'; - $pageObjectId = $this->objects[$this->currentContents]['onPage']; - if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 1) { - $this->addObject($id); - // hacky huh :) - } - break; - - case 'next': - $this->addLooseObjects[$id] = 'all'; - break; - - case 'nexteven': - $this->addLooseObjects[$id] = 'even'; - break; - - case 'nextodd': - $this->addLooseObjects[$id] = 'odd'; - break; - } - } - } - - /** - * return a storable representation of a specific object - * - * @param $id - * @return string|null - */ - function serializeObject($id) - { - if (array_key_exists($id, $this->objects)) { - return serialize($this->objects[$id]); - } - - return null; - } - - /** - * restore an object from its stored representation. Returns its new object id. - * - * @param $obj - * @return int - */ - function restoreSerializedObject($obj) - { - $obj_id = $this->openObject(); - $this->objects[$obj_id] = unserialize($obj); - $this->closeObject(); - - return $obj_id; - } - - /** - * Embeds a file inside the PDF - * - * @param string $filepath path to the file to store inside the PDF - * @param string $embeddedFilename the filename displayed in the list of embedded files - * @param string $description a description in the list of embedded files - */ - public function addEmbeddedFile(string $filepath, string $embeddedFilename, string $description): void - { - $this->numObj++; - $this->o_embedded_file_dictionary( - $this->numObj, - 'new', - [ - 'filepath' => $filepath, - 'filename' => $embeddedFilename, - 'description' => $description - ] - ); - } - - /** - * add content to the documents info object - * - * @param $label - * @param int $value - */ - function addInfo($label, $value = 0) - { - // this will only work if the label is one of the valid ones. - // modify this so that arrays can be passed as well. - // if $label is an array then assume that it is key => value pairs - // else assume that they are both scalar, anything else will probably error - if (is_array($label)) { - foreach ($label as $l => $v) { - $this->o_info($this->infoObject, $l, $v); - } - } else { - $this->o_info($this->infoObject, $label, $value); - } - } - - /** - * set the viewer preferences of the document, it is up to the browser to obey these. - * - * @param $label - * @param int $value - */ - function setPreferences($label, $value = 0) - { - // this will only work if the label is one of the valid ones. - if (is_array($label)) { - foreach ($label as $l => $v) { - $this->o_catalog($this->catalogId, 'viewerPreferences', [$l => $v]); - } - } else { - $this->o_catalog($this->catalogId, 'viewerPreferences', [$label => $value]); - } - } - - /** - * extract an integer from a position in a byte stream - * - * @param $data - * @param $pos - * @param $num - * @return int - */ - private function getBytes(&$data, $pos, $num) - { - // return the integer represented by $num bytes from $pos within $data - $ret = 0; - for ($i = 0; $i < $num; $i++) { - $ret *= 256; - $ret += ord($data[$pos + $i]); - } - - return $ret; - } - - /** - * Check if image already added to pdf image directory. - * If yes, need not to create again (pass empty data) - * - * @param $imgname - * @return bool - */ - function image_iscached($imgname) - { - return isset($this->imagelist[$imgname]); - } - - /** - * add a PNG image into the document, from a GD object - * this should work with remote files - * - * @param string $file The PNG file - * @param float $x X position - * @param float $y Y position - * @param float $w Width - * @param float $h Height - * @param resource $img A GD resource - * @param bool $is_mask true if the image is a mask - * @param bool $mask true if the image is masked - * @throws Exception - */ - function addImagePng($file, $x, $y, $w = 0.0, $h = 0.0, &$img, $is_mask = false, $mask = null) - { - if (!function_exists("imagepng")) { - throw new \Exception("The PHP GD extension is required, but is not installed."); - } - - //if already cached, need not to read again - if (isset($this->imagelist[$file])) { - $data = null; - } else { - // Example for transparency handling on new image. Retain for current image - // $tIndex = imagecolortransparent($img); - // if ($tIndex > 0) { - // $tColor = imagecolorsforindex($img, $tIndex); - // $new_tIndex = imagecolorallocate($new_img, $tColor['red'], $tColor['green'], $tColor['blue']); - // imagefill($new_img, 0, 0, $new_tIndex); - // imagecolortransparent($new_img, $new_tIndex); - // } - // blending mode (literal/blending) on drawing into current image. not relevant when not saved or not drawn - //imagealphablending($img, true); - - //default, but explicitely set to ensure pdf compatibility - imagesavealpha($img, false/*!$is_mask && !$mask*/); - - $error = 0; - //DEBUG_IMG_TEMP - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addImagePng ' . $file . ']'; - } - - ob_start(); - @imagepng($img); - $data = ob_get_clean(); - - if ($data == '') { - $error = 1; - $errormsg = 'trouble writing file from GD'; - //DEBUG_IMG_TEMP - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print 'trouble writing file from GD'; - } - } - - if ($error) { - $this->addMessage('PNG error - (' . $file . ') ' . $errormsg); - - return; - } - } //End isset($this->imagelist[$file]) (png Duplicate removal) - - $this->addPngFromBuf($file, $x, $y, $w, $h, $data, $is_mask, $mask); - } - - /** - * @param $file - * @param $x - * @param $y - * @param $w - * @param $h - * @param $byte - */ - protected function addImagePngAlpha($file, $x, $y, $w, $h, $byte) - { - // generate images - $img = imagecreatefrompng($file); - - if ($img === false) { - return; - } - - // FIXME The pixel transformation doesn't work well with 8bit PNGs - $eight_bit = ($byte & 4) !== 4; - - $wpx = imagesx($img); - $hpx = imagesy($img); - - imagesavealpha($img, false); - - // create temp alpha file - $tempfile_alpha = @tempnam($this->tmp, "cpdf_img_"); - @unlink($tempfile_alpha); - $tempfile_alpha = "$tempfile_alpha.png"; - - // create temp plain file - $tempfile_plain = @tempnam($this->tmp, "cpdf_img_"); - @unlink($tempfile_plain); - $tempfile_plain = "$tempfile_plain.png"; - - $imgalpha = imagecreate($wpx, $hpx); - imagesavealpha($imgalpha, false); - - // generate gray scale palette (0 -> 255) - for ($c = 0; $c < 256; ++$c) { - imagecolorallocate($imgalpha, $c, $c, $c); - } - - // Use PECL gmagick + Graphics Magic to process transparent PNG images - if (extension_loaded("gmagick")) { - $gmagick = new \Gmagick($file); - $gmagick->setimageformat('png'); - - // Get opacity channel (negative of alpha channel) - $alpha_channel_neg = clone $gmagick; - $alpha_channel_neg->separateimagechannel(\Gmagick::CHANNEL_OPACITY); - - // Negate opacity channel - $alpha_channel = new \Gmagick(); - $alpha_channel->newimage($wpx, $hpx, "#FFFFFF", "png"); - $alpha_channel->compositeimage($alpha_channel_neg, \Gmagick::COMPOSITE_DIFFERENCE, 0, 0); - $alpha_channel->separateimagechannel(\Gmagick::CHANNEL_RED); - $alpha_channel->writeimage($tempfile_alpha); - - // Cast to 8bit+palette - $imgalpha_ = imagecreatefrompng($tempfile_alpha); - imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx); - imagedestroy($imgalpha_); - imagepng($imgalpha, $tempfile_alpha); - - // Make opaque image - $color_channels = new \Gmagick(); - $color_channels->newimage($wpx, $hpx, "#FFFFFF", "png"); - $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYRED, 0, 0); - $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYGREEN, 0, 0); - $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYBLUE, 0, 0); - $color_channels->writeimage($tempfile_plain); - - $imgplain = imagecreatefrompng($tempfile_plain); - } - // Use PECL imagick + ImageMagic to process transparent PNG images - elseif (extension_loaded("imagick")) { - // Native cloning was added to pecl-imagick in svn commit 263814 - // the first version containing it was 3.0.1RC1 - static $imagickClonable = null; - if ($imagickClonable === null) { - $imagickClonable = version_compare(\Imagick::IMAGICK_EXTVER, '3.0.1rc1') > 0; - } - - $imagick = new \Imagick($file); - $imagick->setFormat('png'); - - // Get opacity channel (negative of alpha channel) - if ($imagick->getImageAlphaChannel() !== 0) { - $alpha_channel = $imagickClonable ? clone $imagick : $imagick->clone(); - $alpha_channel->separateImageChannel(\Imagick::CHANNEL_ALPHA); - // Since ImageMagick7 negate invert transparency as default - if (\Imagick::getVersion()['versionNumber'] < 1800) { - $alpha_channel->negateImage(true); - } - $alpha_channel->writeImage($tempfile_alpha); - - // Cast to 8bit+palette - $imgalpha_ = imagecreatefrompng($tempfile_alpha); - imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx); - imagedestroy($imgalpha_); - imagepng($imgalpha, $tempfile_alpha); - } else { - $tempfile_alpha = null; - } - - // Make opaque image - $color_channels = new \Imagick(); - $color_channels->newImage($wpx, $hpx, "#FFFFFF", "png"); - $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYRED, 0, 0); - $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYGREEN, 0, 0); - $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYBLUE, 0, 0); - $color_channels->writeImage($tempfile_plain); - - $imgplain = imagecreatefrompng($tempfile_plain); - } else { - // allocated colors cache - $allocated_colors = []; - - // extract alpha channel - for ($xpx = 0; $xpx < $wpx; ++$xpx) { - for ($ypx = 0; $ypx < $hpx; ++$ypx) { - $color = imagecolorat($img, $xpx, $ypx); - $col = imagecolorsforindex($img, $color); - $alpha = $col['alpha']; - - if ($eight_bit) { - // with gamma correction - $gammacorr = 2.2; - $pixel = pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255; - } else { - // without gamma correction - $pixel = (127 - $alpha) * 2; - - $key = $col['red'] . $col['green'] . $col['blue']; - - if (!isset($allocated_colors[$key])) { - $pixel_img = imagecolorallocate($img, $col['red'], $col['green'], $col['blue']); - $allocated_colors[$key] = $pixel_img; - } else { - $pixel_img = $allocated_colors[$key]; - } - - imagesetpixel($img, $xpx, $ypx, $pixel_img); - } - - imagesetpixel($imgalpha, $xpx, $ypx, $pixel); - } - } - - // extract image without alpha channel - $imgplain = imagecreatetruecolor($wpx, $hpx); - imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx); - imagedestroy($img); - - imagepng($imgalpha, $tempfile_alpha); - imagepng($imgplain, $tempfile_plain); - } - - // embed mask image - if ($tempfile_alpha) { - $this->addImagePng($tempfile_alpha, $x, $y, $w, $h, $imgalpha, true); - imagedestroy($imgalpha); - } - - // embed image, masked with previously embedded mask - $this->addImagePng($tempfile_plain, $x, $y, $w, $h, $imgplain, false, ($tempfile_alpha !== null)); - imagedestroy($imgplain); - - // remove temp files - if ($tempfile_alpha) { - unlink($tempfile_alpha); - } - unlink($tempfile_plain); - } - - /** - * add a PNG image into the document, from a file - * this should work with remote files - * - * @param $file - * @param $x - * @param $y - * @param int $w - * @param int $h - * @throws Exception - */ - function addPngFromFile($file, $x, $y, $w = 0, $h = 0) - { - if (!function_exists("imagecreatefrompng")) { - throw new \Exception("The PHP GD extension is required, but is not installed."); - } - - //if already cached, need not to read again - if (isset($this->imagelist[$file])) { - $img = null; - } else { - $info = file_get_contents($file, false, null, 24, 5); - $meta = unpack("CbitDepth/CcolorType/CcompressionMethod/CfilterMethod/CinterlaceMethod", $info); - $bit_depth = $meta["bitDepth"]; - $color_type = $meta["colorType"]; - - // http://www.w3.org/TR/PNG/#11IHDR - // 3 => indexed - // 4 => greyscale with alpha - // 6 => fullcolor with alpha - $is_alpha = in_array($color_type, [4, 6]) || ($color_type == 3 && $bit_depth != 4); - - if ($is_alpha) { // exclude grayscale alpha - $this->addImagePngAlpha($file, $x, $y, $w, $h, $color_type); - return; - } - - //png files typically contain an alpha channel. - //pdf file format or class.pdf does not support alpha blending. - //on alpha blended images, more transparent areas have a color near black. - //This appears in the result on not storing the alpha channel. - //Correct would be the box background image or its parent when transparent. - //But this would make the image dependent on the background. - //Therefore create an image with white background and copy in - //A more natural background than black is white. - //Therefore create an empty image with white background and merge the - //image in with alpha blending. - $imgtmp = @imagecreatefrompng($file); - if (!$imgtmp) { - return; - } - $sx = imagesx($imgtmp); - $sy = imagesy($imgtmp); - $img = imagecreatetruecolor($sx, $sy); - imagealphablending($img, true); - - // @todo is it still needed ?? - $ti = imagecolortransparent($imgtmp); - if ($ti >= 0) { - $tc = imagecolorsforindex($imgtmp, $ti); - $ti = imagecolorallocate($img, $tc['red'], $tc['green'], $tc['blue']); - imagefill($img, 0, 0, $ti); - imagecolortransparent($img, $ti); - } else { - imagefill($img, 1, 1, imagecolorallocate($img, 255, 255, 255)); - } - - imagecopy($img, $imgtmp, 0, 0, 0, 0, $sx, $sy); - imagedestroy($imgtmp); - } - $this->addImagePng($file, $x, $y, $w, $h, $img); - - if ($img) { - imagedestroy($img); - } - } - - /** - * add a PNG image into the document, from a file - * this should work with remote files - * - * @param $file - * @param $x - * @param $y - * @param int $w - * @param int $h - */ - function addSvgFromFile($file, $x, $y, $w = 0, $h = 0) - { - $doc = new \Svg\Document(); - $doc->loadFile($file); - $dimensions = $doc->getDimensions(); - - $this->save(); - - $this->transform([$w / $dimensions["width"], 0, 0, $h / $dimensions["height"], $x, $y]); - - $surface = new \Svg\Surface\SurfaceCpdf($doc, $this); - $doc->render($surface); - - $this->restore(); - } - - /** - * add a PNG image into the document, from a memory buffer of the file - * - * @param $file - * @param $x - * @param $y - * @param float $w - * @param float $h - * @param $data - * @param bool $is_mask - * @param null $mask - */ - function addPngFromBuf($file, $x, $y, $w = 0.0, $h = 0.0, &$data, $is_mask = false, $mask = null) - { - if (isset($this->imagelist[$file])) { - $data = null; - $info['width'] = $this->imagelist[$file]['w']; - $info['height'] = $this->imagelist[$file]['h']; - $label = $this->imagelist[$file]['label']; - } else { - if ($data == null) { - $this->addMessage('addPngFromBuf error - data not present!'); - - return; - } - - $error = 0; - - if (!$error) { - $header = chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10); - - if (mb_substr($data, 0, 8, '8bit') != $header) { - $error = 1; - - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile this file does not have a valid header ' . $file . ']'; - } - - $errormsg = 'this file does not have a valid header'; - } - } - - if (!$error) { - // set pointer - $p = 8; - $len = mb_strlen($data, '8bit'); - - // cycle through the file, identifying chunks - $haveHeader = 0; - $info = []; - $idata = ''; - $pdata = ''; - - while ($p < $len) { - $chunkLen = $this->getBytes($data, $p, 4); - $chunkType = mb_substr($data, $p + 4, 4, '8bit'); - - switch ($chunkType) { - case 'IHDR': - // this is where all the file information comes from - $info['width'] = $this->getBytes($data, $p + 8, 4); - $info['height'] = $this->getBytes($data, $p + 12, 4); - $info['bitDepth'] = ord($data[$p + 16]); - $info['colorType'] = ord($data[$p + 17]); - $info['compressionMethod'] = ord($data[$p + 18]); - $info['filterMethod'] = ord($data[$p + 19]); - $info['interlaceMethod'] = ord($data[$p + 20]); - - //print_r($info); - $haveHeader = 1; - if ($info['compressionMethod'] != 0) { - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile unsupported compression method ' . $file . ']'; - } - - $errormsg = 'unsupported compression method'; - } - - if ($info['filterMethod'] != 0) { - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile unsupported filter method ' . $file . ']'; - } - - $errormsg = 'unsupported filter method'; - } - break; - - case 'PLTE': - $pdata .= mb_substr($data, $p + 8, $chunkLen, '8bit'); - break; - - case 'IDAT': - $idata .= mb_substr($data, $p + 8, $chunkLen, '8bit'); - break; - - case 'tRNS': - //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk - //print "tRNS found, color type = ".$info['colorType']."\n"; - $transparency = []; - - switch ($info['colorType']) { - // indexed color, rbg - case 3: - /* corresponding to entries in the plte chunk - Alpha for palette index 0: 1 byte - Alpha for palette index 1: 1 byte - ...etc... - */ - // there will be one entry for each palette entry. up until the last non-opaque entry. - // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent) - $transparency['type'] = 'indexed'; - $trans = 0; - - for ($i = $chunkLen; $i >= 0; $i--) { - if (ord($data[$p + 8 + $i]) == 0) { - $trans = $i; - } - } - - $transparency['data'] = $trans; - break; - - // grayscale - case 0: - /* corresponding to entries in the plte chunk - Gray: 2 bytes, range 0 .. (2^bitdepth)-1 - */ - // $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale - $transparency['type'] = 'indexed'; - $transparency['data'] = ord($data[$p + 8 + 1]); - break; - - // truecolor - case 2: - /* corresponding to entries in the plte chunk - Red: 2 bytes, range 0 .. (2^bitdepth)-1 - Green: 2 bytes, range 0 .. (2^bitdepth)-1 - Blue: 2 bytes, range 0 .. (2^bitdepth)-1 - */ - $transparency['r'] = $this->getBytes($data, $p + 8, 2); - // r from truecolor - $transparency['g'] = $this->getBytes($data, $p + 10, 2); - // g from truecolor - $transparency['b'] = $this->getBytes($data, $p + 12, 2); - // b from truecolor - - $transparency['type'] = 'color-key'; - break; - - //unsupported transparency type - default: - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile unsupported transparency type ' . $file . ']'; - } - break; - } - - // KS End new code - break; - - default: - break; - } - - $p += $chunkLen + 12; - } - - if (!$haveHeader) { - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile information header is missing ' . $file . ']'; - } - - $errormsg = 'information header is missing'; - } - - if (isset($info['interlaceMethod']) && $info['interlaceMethod']) { - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile no support for interlaced images in pdf ' . $file . ']'; - } - - $errormsg = 'There appears to be no support for interlaced images in pdf.'; - } - } - - if (!$error && $info['bitDepth'] > 8) { - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile bit depth of 8 or less is supported ' . $file . ']'; - } - - $errormsg = 'only bit depth of 8 or less is supported'; - } - - if (!$error) { - switch ($info['colorType']) { - case 3: - $color = 'DeviceRGB'; - $ncolor = 1; - break; - - case 2: - $color = 'DeviceRGB'; - $ncolor = 3; - break; - - case 0: - $color = 'DeviceGray'; - $ncolor = 1; - break; - - default: - $error = 1; - - //debugpng - if (defined("DEBUGPNG") && DEBUGPNG) { - print '[addPngFromFile alpha channel not supported: ' . $info['colorType'] . ' ' . $file . ']'; - } - - $errormsg = 'transparency alpha channel not supported, transparency only supported for palette images.'; - } - } - - if ($error) { - $this->addMessage('PNG error - (' . $file . ') ' . $errormsg); - - return; - } - - //print_r($info); - // so this image is ok... add it in. - $this->numImages++; - $im = $this->numImages; - $label = "I$im"; - $this->numObj++; - - // $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width'])); - $options = [ - 'label' => $label, - 'data' => $idata, - 'bitsPerComponent' => $info['bitDepth'], - 'pdata' => $pdata, - 'iw' => $info['width'], - 'ih' => $info['height'], - 'type' => 'png', - 'color' => $color, - 'ncolor' => $ncolor, - 'masked' => $mask, - 'isMask' => $is_mask - ]; - - if (isset($transparency)) { - $options['transparency'] = $transparency; - } - - $this->o_image($this->numObj, 'new', $options); - $this->imagelist[$file] = ['label' => $label, 'w' => $info['width'], 'h' => $info['height']]; - } - - if ($is_mask) { - return; - } - - if ($w <= 0 && $h <= 0) { - $w = $info['width']; - $h = $info['height']; - } - - if ($w <= 0) { - $w = $h / $info['height'] * $info['width']; - } - - if ($h <= 0) { - $h = $w * $info['height'] / $info['width']; - } - - $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ", $w, $h, $x, $y, $label)); - } - - /** - * add a JPEG image into the document, from a file - * - * @param $img - * @param $x - * @param $y - * @param int $w - * @param int $h - */ - function addJpegFromFile($img, $x, $y, $w = 0, $h = 0) - { - // attempt to add a jpeg image straight from a file, using no GD commands - // note that this function is unable to operate on a remote file. - - if (!file_exists($img)) { - return; - } - - if ($this->image_iscached($img)) { - $data = null; - $imageWidth = $this->imagelist[$img]['w']; - $imageHeight = $this->imagelist[$img]['h']; - $channels = $this->imagelist[$img]['c']; - } else { - $tmp = getimagesize($img); - $imageWidth = $tmp[0]; - $imageHeight = $tmp[1]; - - if (isset($tmp['channels'])) { - $channels = $tmp['channels']; - } else { - $channels = 3; - } - - $data = file_get_contents($img); - } - - if ($w <= 0 && $h <= 0) { - $w = $imageWidth; - } - - if ($w == 0) { - $w = $h / $imageHeight * $imageWidth; - } - - if ($h == 0) { - $h = $w * $imageHeight / $imageWidth; - } - - $this->addJpegImage_common($data, $x, $y, $w, $h, $imageWidth, $imageHeight, $channels, $img); - } - - /** - * common code used by the two JPEG adding functions - * @param $data - * @param $x - * @param $y - * @param int $w - * @param int $h - * @param $imageWidth - * @param $imageHeight - * @param int $channels - * @param $imgname - */ - private function addJpegImage_common( - &$data, - $x, - $y, - $w = 0, - $h = 0, - $imageWidth, - $imageHeight, - $channels = 3, - $imgname - ) { - if ($this->image_iscached($imgname)) { - $label = $this->imagelist[$imgname]['label']; - //debugpng - //if (DEBUGPNG) print '[addJpegImage_common Duplicate '.$imgname.']'; - - } else { - if ($data == null) { - $this->addMessage('addJpegImage_common error - (' . $imgname . ') data not present!'); - - return; - } - - // note that this function is not to be called externally - // it is just the common code between the GD and the file options - $this->numImages++; - $im = $this->numImages; - $label = "I$im"; - $this->numObj++; - - $this->o_image( - $this->numObj, - 'new', - [ - 'label' => $label, - 'data' => &$data, - 'iw' => $imageWidth, - 'ih' => $imageHeight, - 'channels' => $channels - ] - ); - - $this->imagelist[$imgname] = [ - 'label' => $label, - 'w' => $imageWidth, - 'h' => $imageHeight, - 'c' => $channels - ]; - } - - $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ ", $w, $h, $x, $y, $label)); - } - - /** - * specify where the document should open when it first starts - * - * @param $style - * @param int $a - * @param int $b - * @param int $c - */ - function openHere($style, $a = 0, $b = 0, $c = 0) - { - // this function will open the document at a specified page, in a specified style - // the values for style, and the required parameters are: - // 'XYZ' left, top, zoom - // 'Fit' - // 'FitH' top - // 'FitV' left - // 'FitR' left,bottom,right - // 'FitB' - // 'FitBH' top - // 'FitBV' left - $this->numObj++; - $this->o_destination( - $this->numObj, - 'new', - ['page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c] - ); - $id = $this->catalogId; - $this->o_catalog($id, 'openHere', $this->numObj); - } - - /** - * Add JavaScript code to the PDF document - * - * @param string $code - */ - function addJavascript($code) - { - $this->javascript .= $code; - } - - /** - * create a labelled destination within the document - * - * @param $label - * @param $style - * @param int $a - * @param int $b - * @param int $c - */ - function addDestination($label, $style, $a = 0, $b = 0, $c = 0) - { - // associates the given label with the destination, it is done this way so that a destination can be specified after - // it has been linked to - // styles are the same as the 'openHere' function - $this->numObj++; - $this->o_destination( - $this->numObj, - 'new', - ['page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c] - ); - $id = $this->numObj; - - // store the label->idf relationship, note that this means that labels can be used only once - $this->destinations["$label"] = $id; - } - - /** - * define font families, this is used to initialize the font families for the default fonts - * and for the user to add new ones for their fonts. The default bahavious can be overridden should - * that be desired. - * - * @param $family - * @param string $options - */ - function setFontFamily($family, $options = '') - { - if (!is_array($options)) { - if ($family === 'init') { - // set the known family groups - // these font families will be used to enable bold and italic markers to be included - // within text streams. html forms will be used... - $this->fontFamilies['Helvetica.afm'] = - [ - 'b' => 'Helvetica-Bold.afm', - 'i' => 'Helvetica-Oblique.afm', - 'bi' => 'Helvetica-BoldOblique.afm', - 'ib' => 'Helvetica-BoldOblique.afm' - ]; - - $this->fontFamilies['Courier.afm'] = - [ - 'b' => 'Courier-Bold.afm', - 'i' => 'Courier-Oblique.afm', - 'bi' => 'Courier-BoldOblique.afm', - 'ib' => 'Courier-BoldOblique.afm' - ]; - - $this->fontFamilies['Times-Roman.afm'] = - [ - 'b' => 'Times-Bold.afm', - 'i' => 'Times-Italic.afm', - 'bi' => 'Times-BoldItalic.afm', - 'ib' => 'Times-BoldItalic.afm' - ]; - } - } else { - - // the user is trying to set a font family - // note that this can also be used to set the base ones to something else - if (mb_strlen($family)) { - $this->fontFamilies[$family] = $options; - } - } - } - - /** - * used to add messages for use in debugging - * - * @param $message - */ - function addMessage($message) - { - $this->messages .= $message . "\n"; - } - - /** - * a few functions which should allow the document to be treated transactionally. - * - * @param $action - */ - function transaction($action) - { - switch ($action) { - case 'start': - // store all the data away into the checkpoint variable - $data = get_object_vars($this); - $this->checkpoint = $data; - unset($data); - break; - - case 'commit': - if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) { - $tmp = $this->checkpoint['checkpoint']; - $this->checkpoint = $tmp; - unset($tmp); - } else { - $this->checkpoint = ''; - } - break; - - case 'rewind': - // do not destroy the current checkpoint, but move us back to the state then, so that we can try again - if (is_array($this->checkpoint)) { - // can only abort if were inside a checkpoint - $tmp = $this->checkpoint; - - foreach ($tmp as $k => $v) { - if ($k !== 'checkpoint') { - $this->$k = $v; - } - } - unset($tmp); - } - break; - - case 'abort': - if (is_array($this->checkpoint)) { - // can only abort if were inside a checkpoint - $tmp = $this->checkpoint; - foreach ($tmp as $k => $v) { - $this->$k = $v; - } - unset($tmp); - } - break; - } - } -} diff --git a/vendor/dompdf/dompdf/lib/fonts/Courier-Bold.afm b/vendor/dompdf/dompdf/lib/fonts/Courier-Bold.afm deleted file mode 100644 index 84adbf5..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Courier-Bold.afm +++ /dev/null @@ -1,344 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Mon Jun 23 16:28:00 0:00:00 -Comment UniqueID 43048 -Comment VMusage 41139 52164 -FontName Courier-Bold -FullName Courier Bold -FamilyName Courier -Weight Bold -ItalicAngle 0 -IsFixedPitch true -CharacterSet ExtendedRoman -FontBBox -113 -250 749 801 -UnderlinePosition -100 -UnderlineThickness 50 -Version 003.000 -Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -EncodingScheme WinAnsiEncoding -CapHeight 562 -XHeight 439 -Ascender 629 -Descender -157 -StdHW 84 -StdVW 106 -StartCharMetrics 317 -C 32 ; WX 600 ; N space ; B 0 0 0 0 ; -C 160 ; WX 600 ; N space ; B 0 0 0 0 ; -C 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ; -C 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ; -C 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ; -C 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ; -C 37 ; WX 600 ; N percent ; B 5 -15 595 616 ; -C 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ; -C 146 ; WX 600 ; N quoteright ; B 171 277 423 562 ; -C 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ; -C 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ; -C 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ; -C 43 ; WX 600 ; N plus ; B 71 39 529 478 ; -C 44 ; WX 600 ; N comma ; B 123 -111 393 174 ; -C 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ; -C 173 ; WX 600 ; N hyphen ; B 100 203 500 313 ; -C 46 ; WX 600 ; N period ; B 192 -15 408 171 ; -C 47 ; WX 600 ; N slash ; B 98 -77 502 626 ; -C 48 ; WX 600 ; N zero ; B 87 -15 513 616 ; -C 49 ; WX 600 ; N one ; B 81 0 539 616 ; -C 50 ; WX 600 ; N two ; B 61 0 499 616 ; -C 51 ; WX 600 ; N three ; B 63 -15 501 616 ; -C 52 ; WX 600 ; N four ; B 53 0 507 616 ; -C 53 ; WX 600 ; N five ; B 70 -15 521 601 ; -C 54 ; WX 600 ; N six ; B 90 -15 521 616 ; -C 55 ; WX 600 ; N seven ; B 55 0 494 601 ; -C 56 ; WX 600 ; N eight ; B 83 -15 517 616 ; -C 57 ; WX 600 ; N nine ; B 79 -15 510 616 ; -C 58 ; WX 600 ; N colon ; B 191 -15 407 425 ; -C 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ; -C 60 ; WX 600 ; N less ; B 66 15 523 501 ; -C 61 ; WX 600 ; N equal ; B 71 118 529 398 ; -C 62 ; WX 600 ; N greater ; B 77 15 534 501 ; -C 63 ; WX 600 ; N question ; B 98 -14 501 580 ; -C 64 ; WX 600 ; N at ; B 16 -15 584 616 ; -C 65 ; WX 600 ; N A ; B -9 0 609 562 ; -C 66 ; WX 600 ; N B ; B 30 0 573 562 ; -C 67 ; WX 600 ; N C ; B 22 -18 560 580 ; -C 68 ; WX 600 ; N D ; B 30 0 594 562 ; -C 69 ; WX 600 ; N E ; B 25 0 560 562 ; -C 70 ; WX 600 ; N F ; B 39 0 570 562 ; -C 71 ; WX 600 ; N G ; B 22 -18 594 580 ; -C 72 ; WX 600 ; N H ; B 20 0 580 562 ; -C 73 ; WX 600 ; N I ; B 77 0 523 562 ; -C 74 ; WX 600 ; N J ; B 37 -18 601 562 ; -C 75 ; WX 600 ; N K ; B 21 0 599 562 ; -C 76 ; WX 600 ; N L ; B 39 0 578 562 ; -C 77 ; WX 600 ; N M ; B -2 0 602 562 ; -C 78 ; WX 600 ; N N ; B 8 -12 610 562 ; -C 79 ; WX 600 ; N O ; B 22 -18 578 580 ; -C 80 ; WX 600 ; N P ; B 48 0 559 562 ; -C 81 ; WX 600 ; N Q ; B 32 -138 578 580 ; -C 82 ; WX 600 ; N R ; B 24 0 599 562 ; -C 83 ; WX 600 ; N S ; B 47 -22 553 582 ; -C 84 ; WX 600 ; N T ; B 21 0 579 562 ; -C 85 ; WX 600 ; N U ; B 4 -18 596 562 ; -C 86 ; WX 600 ; N V ; B -13 0 613 562 ; -C 87 ; WX 600 ; N W ; B -18 0 618 562 ; -C 88 ; WX 600 ; N X ; B 12 0 588 562 ; -C 89 ; WX 600 ; N Y ; B 12 0 589 562 ; -C 90 ; WX 600 ; N Z ; B 62 0 539 562 ; -C 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ; -C 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ; -C 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ; -C 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ; -C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; -C 145 ; WX 600 ; N quoteleft ; B 178 277 428 562 ; -C 97 ; WX 600 ; N a ; B 35 -15 570 454 ; -C 98 ; WX 600 ; N b ; B 0 -15 584 626 ; -C 99 ; WX 600 ; N c ; B 40 -15 545 459 ; -C 100 ; WX 600 ; N d ; B 20 -15 591 626 ; -C 101 ; WX 600 ; N e ; B 40 -15 563 454 ; -C 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ; -C 103 ; WX 600 ; N g ; B 30 -146 580 454 ; -C 104 ; WX 600 ; N h ; B 5 0 592 626 ; -C 105 ; WX 600 ; N i ; B 77 0 523 658 ; -C 106 ; WX 600 ; N j ; B 63 -146 440 658 ; -C 107 ; WX 600 ; N k ; B 20 0 585 626 ; -C 108 ; WX 600 ; N l ; B 77 0 523 626 ; -C 109 ; WX 600 ; N m ; B -22 0 626 454 ; -C 110 ; WX 600 ; N n ; B 18 0 592 454 ; -C 111 ; WX 600 ; N o ; B 30 -15 570 454 ; -C 112 ; WX 600 ; N p ; B -1 -142 570 454 ; -C 113 ; WX 600 ; N q ; B 20 -142 591 454 ; -C 114 ; WX 600 ; N r ; B 47 0 580 454 ; -C 115 ; WX 600 ; N s ; B 68 -17 535 459 ; -C 116 ; WX 600 ; N t ; B 47 -15 532 562 ; -C 117 ; WX 600 ; N u ; B -1 -15 569 439 ; -C 118 ; WX 600 ; N v ; B -1 0 601 439 ; -C 119 ; WX 600 ; N w ; B -18 0 618 439 ; -C 120 ; WX 600 ; N x ; B 6 0 594 439 ; -C 121 ; WX 600 ; N y ; B -4 -142 601 439 ; -C 122 ; WX 600 ; N z ; B 81 0 520 439 ; -C 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ; -C 124 ; WX 600 ; N bar ; B 255 -250 345 750 ; -C 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ; -C 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ; -C 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ; -C 162 ; WX 600 ; N cent ; B 66 -49 518 614 ; -C 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ; -C -1 ; WX 600 ; N fraction ; B 25 -60 576 661 ; -C 165 ; WX 600 ; N yen ; B 10 0 590 562 ; -C 131 ; WX 600 ; N florin ; B -30 -131 572 616 ; -C 167 ; WX 600 ; N section ; B 83 -70 517 580 ; -C 164 ; WX 600 ; N currency ; B 54 49 546 517 ; -C 39 ; WX 600 ; N quotesingle ; B 227 277 373 562 ; -C 147 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ; -C 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ; -C 139 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ; -C 155 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ; -C -1 ; WX 600 ; N fi ; B 12 0 593 626 ; -C -1 ; WX 600 ; N fl ; B 12 0 593 626 ; -C 150 ; WX 600 ; N endash ; B 65 203 535 313 ; -C 134 ; WX 600 ; N dagger ; B 106 -70 494 580 ; -C 135 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ; -C 183 ; WX 600 ; N periodcentered ; B 196 165 404 351 ; -C 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ; -C 149 ; WX 600 ; N bullet ; B 140 132 460 430 ; -C 130 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ; -C 132 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ; -C 148 ; WX 600 ; N quotedblright ; B 61 277 525 562 ; -C 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ; -C 133 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ; -C 137 ; WX 600 ; N perthousand ; B -113 -15 713 616 ; -C 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ; -C 96 ; WX 600 ; N grave ; B 132 508 395 661 ; -C 180 ; WX 600 ; N acute ; B 205 508 468 661 ; -C 136 ; WX 600 ; N circumflex ; B 103 483 497 657 ; -C 152 ; WX 600 ; N tilde ; B 89 493 512 636 ; -C 175 ; WX 600 ; N macron ; B 88 505 512 585 ; -C -1 ; WX 600 ; N breve ; B 83 468 517 631 ; -C -1 ; WX 600 ; N dotaccent ; B 230 498 370 638 ; -C 168 ; WX 600 ; N dieresis ; B 128 498 472 638 ; -C -1 ; WX 600 ; N ring ; B 198 481 402 678 ; -C 184 ; WX 600 ; N cedilla ; B 205 -206 387 0 ; -C -1 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ; -C -1 ; WX 600 ; N ogonek ; B 169 -199 400 0 ; -C -1 ; WX 600 ; N caron ; B 103 493 497 667 ; -C 151 ; WX 600 ; N emdash ; B -10 203 610 313 ; -C 198 ; WX 600 ; N AE ; B -29 0 602 562 ; -C 170 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ; -C -1 ; WX 600 ; N Lslash ; B 39 0 578 562 ; -C 216 ; WX 600 ; N Oslash ; B 22 -22 578 584 ; -C 140 ; WX 600 ; N OE ; B -25 0 595 562 ; -C 186 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ; -C 230 ; WX 600 ; N ae ; B -4 -15 601 454 ; -C -1 ; WX 600 ; N dotlessi ; B 77 0 523 439 ; -C -1 ; WX 600 ; N lslash ; B 77 0 523 626 ; -C 248 ; WX 600 ; N oslash ; B 30 -24 570 463 ; -C 156 ; WX 600 ; N oe ; B -18 -15 611 454 ; -C 223 ; WX 600 ; N germandbls ; B 22 -15 596 626 ; -C 207 ; WX 600 ; N Idieresis ; B 77 0 523 761 ; -C 233 ; WX 600 ; N eacute ; B 40 -15 563 661 ; -C -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ; -C -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ; -C -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ; -C 159 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ; -C 247 ; WX 600 ; N divide ; B 71 16 529 500 ; -C 221 ; WX 600 ; N Yacute ; B 12 0 589 784 ; -C 194 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ; -C 225 ; WX 600 ; N aacute ; B 35 -15 570 661 ; -C 219 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ; -C 253 ; WX 600 ; N yacute ; B -4 -142 601 661 ; -C -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ; -C 234 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ; -C -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ; -C 220 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ; -C -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ; -C 218 ; WX 600 ; N Uacute ; B 4 -18 596 784 ; -C -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ; -C 203 ; WX 600 ; N Edieresis ; B 25 0 560 761 ; -C -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ; -C -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ; -C 169 ; WX 600 ; N copyright ; B 0 -18 600 580 ; -C -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ; -C -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ; -C 229 ; WX 600 ; N aring ; B 35 -15 570 678 ; -C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ; -C -1 ; WX 600 ; N lacute ; B 77 0 523 801 ; -C 224 ; WX 600 ; N agrave ; B 35 -15 570 661 ; -C -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ; -C -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ; -C 227 ; WX 600 ; N atilde ; B 35 -15 570 636 ; -C -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ; -C 154 ; WX 600 ; N scaron ; B 68 -17 535 667 ; -C -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ; -C 237 ; WX 600 ; N iacute ; B 77 0 523 661 ; -C -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ; -C -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ; -C -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ; -C 251 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ; -C 226 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ; -C -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ; -C -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ; -C 231 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ; -C -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ; -C 222 ; WX 600 ; N Thorn ; B 48 0 557 562 ; -C -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ; -C -1 ; WX 600 ; N Racute ; B 24 0 599 784 ; -C -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ; -C -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ; -C -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ; -C -1 ; WX 600 ; N uring ; B -1 -15 569 678 ; -C 179 ; WX 600 ; N threesuperior ; B 138 222 433 616 ; -C 210 ; WX 600 ; N Ograve ; B 22 -18 578 784 ; -C 192 ; WX 600 ; N Agrave ; B -9 0 609 784 ; -C -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ; -C 215 ; WX 600 ; N multiply ; B 81 39 520 478 ; -C 250 ; WX 600 ; N uacute ; B -1 -15 569 661 ; -C -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ; -C -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ; -C 255 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ; -C -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ; -C 238 ; WX 600 ; N icircumflex ; B 73 0 523 657 ; -C 202 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ; -C 228 ; WX 600 ; N adieresis ; B 35 -15 570 638 ; -C 235 ; WX 600 ; N edieresis ; B 40 -15 563 638 ; -C -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ; -C -1 ; WX 600 ; N nacute ; B 18 0 592 661 ; -C -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ; -C -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ; -C 205 ; WX 600 ; N Iacute ; B 77 0 523 784 ; -C 177 ; WX 600 ; N plusminus ; B 71 24 529 515 ; -C 166 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ; -C 174 ; WX 600 ; N registered ; B 0 -18 600 580 ; -C -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ; -C -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ; -C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; -C 200 ; WX 600 ; N Egrave ; B 25 0 560 784 ; -C -1 ; WX 600 ; N racute ; B 47 0 580 661 ; -C -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ; -C -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ; -C 142 ; WX 600 ; N Zcaron ; B 62 0 539 790 ; -C -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ; -C 208 ; WX 600 ; N Eth ; B 30 0 594 562 ; -C 199 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ; -C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ; -C -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ; -C -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ; -C -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ; -C 193 ; WX 600 ; N Aacute ; B -9 0 609 784 ; -C 196 ; WX 600 ; N Adieresis ; B -9 0 609 761 ; -C 232 ; WX 600 ; N egrave ; B 40 -15 563 661 ; -C -1 ; WX 600 ; N zacute ; B 81 0 520 661 ; -C -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ; -C 211 ; WX 600 ; N Oacute ; B 22 -18 578 784 ; -C 243 ; WX 600 ; N oacute ; B 30 -15 570 661 ; -C -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ; -C -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ; -C 239 ; WX 600 ; N idieresis ; B 77 0 523 618 ; -C 212 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ; -C 217 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ; -C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; -C 254 ; WX 600 ; N thorn ; B -14 -142 570 626 ; -C 178 ; WX 600 ; N twosuperior ; B 143 230 436 616 ; -C 214 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ; -C 181 ; WX 600 ; N mu ; B -1 -142 569 439 ; -C 236 ; WX 600 ; N igrave ; B 77 0 523 661 ; -C -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ; -C -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ; -C -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ; -C 190 ; WX 600 ; N threequarters ; B -47 -60 648 661 ; -C -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ; -C -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ; -C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ; -C -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ; -C 153 ; WX 600 ; N trademark ; B -9 230 749 562 ; -C -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ; -C 204 ; WX 600 ; N Igrave ; B 77 0 523 784 ; -C -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ; -C -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ; -C 189 ; WX 600 ; N onehalf ; B -47 -60 648 661 ; -C -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ; -C 244 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ; -C 241 ; WX 600 ; N ntilde ; B 18 0 592 636 ; -C -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ; -C 201 ; WX 600 ; N Eacute ; B 25 0 560 784 ; -C -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ; -C -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ; -C 188 ; WX 600 ; N onequarter ; B -56 -60 656 661 ; -C 138 ; WX 600 ; N Scaron ; B 47 -22 553 790 ; -C -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ; -C -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ; -C 176 ; WX 600 ; N degree ; B 86 243 474 616 ; -C 242 ; WX 600 ; N ograve ; B 30 -15 570 661 ; -C -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ; -C 249 ; WX 600 ; N ugrave ; B -1 -15 569 661 ; -C -1 ; WX 600 ; N radical ; B -19 -104 473 778 ; -C -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ; -C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ; -C 209 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ; -C 245 ; WX 600 ; N otilde ; B 30 -15 570 636 ; -C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ; -C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ; -C 195 ; WX 600 ; N Atilde ; B -9 0 609 759 ; -C -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ; -C 197 ; WX 600 ; N Aring ; B -9 0 609 801 ; -C 213 ; WX 600 ; N Otilde ; B 22 -18 578 759 ; -C -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ; -C -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ; -C -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ; -C -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ; -C -1 ; WX 600 ; N minus ; B 71 203 529 313 ; -C 206 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ; -C -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ; -C -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ; -C 172 ; WX 600 ; N logicalnot ; B 71 103 529 413 ; -C 246 ; WX 600 ; N odieresis ; B 30 -15 570 638 ; -C 252 ; WX 600 ; N udieresis ; B -1 -15 569 638 ; -C -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ; -C -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ; -C 240 ; WX 600 ; N eth ; B 58 -27 543 626 ; -C 158 ; WX 600 ; N zcaron ; B 81 0 520 667 ; -C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ; -C 185 ; WX 600 ; N onesuperior ; B 153 230 447 616 ; -C -1 ; WX 600 ; N imacron ; B 77 0 523 585 ; -C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Courier-BoldOblique.afm b/vendor/dompdf/dompdf/lib/fonts/Courier-BoldOblique.afm deleted file mode 100644 index d5b616e..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Courier-BoldOblique.afm +++ /dev/null @@ -1,344 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Mon Jun 23 16:28:46 0:00:00 -Comment UniqueID 43049 -Comment VMusage 17529 79244 -FontName Courier-BoldOblique -FullName Courier Bold Oblique -FamilyName Courier -Weight Bold -ItalicAngle -12 -IsFixedPitch true -CharacterSet ExtendedRoman -FontBBox -57 -250 869 801 -UnderlinePosition -100 -UnderlineThickness 50 -Version 3 -Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -EncodingScheme WinAnsiEncoding -CapHeight 562 -XHeight 439 -Ascender 629 -Descender -157 -StdHW 84 -StdVW 106 -StartCharMetrics 317 -C 32 ; WX 600 ; N space ; B 0 0 0 0 ; -C 160 ; WX 600 ; N space ; B 0 0 0 0 ; -C 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ; -C 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ; -C 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ; -C 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ; -C 37 ; WX 600 ; N percent ; B 101 -15 625 616 ; -C 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ; -C 146 ; WX 600 ; N quoteright ; B 229 277 543 562 ; -C 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ; -C 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ; -C 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ; -C 43 ; WX 600 ; N plus ; B 114 39 596 478 ; -C 44 ; WX 600 ; N comma ; B 99 -111 430 174 ; -C 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ; -C 173 ; WX 600 ; N hyphen ; B 143 203 567 313 ; -C 46 ; WX 600 ; N period ; B 206 -15 427 171 ; -C 47 ; WX 600 ; N slash ; B 90 -77 626 626 ; -C 48 ; WX 600 ; N zero ; B 135 -15 593 616 ; -C 49 ; WX 600 ; N one ; B 93 0 562 616 ; -C 50 ; WX 600 ; N two ; B 61 0 594 616 ; -C 51 ; WX 600 ; N three ; B 71 -15 571 616 ; -C 52 ; WX 600 ; N four ; B 81 0 559 616 ; -C 53 ; WX 600 ; N five ; B 77 -15 621 601 ; -C 54 ; WX 600 ; N six ; B 135 -15 652 616 ; -C 55 ; WX 600 ; N seven ; B 147 0 622 601 ; -C 56 ; WX 600 ; N eight ; B 115 -15 604 616 ; -C 57 ; WX 600 ; N nine ; B 75 -15 592 616 ; -C 58 ; WX 600 ; N colon ; B 205 -15 480 425 ; -C 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ; -C 60 ; WX 600 ; N less ; B 120 15 613 501 ; -C 61 ; WX 600 ; N equal ; B 96 118 614 398 ; -C 62 ; WX 600 ; N greater ; B 97 15 589 501 ; -C 63 ; WX 600 ; N question ; B 183 -14 592 580 ; -C 64 ; WX 600 ; N at ; B 65 -15 642 616 ; -C 65 ; WX 600 ; N A ; B -9 0 632 562 ; -C 66 ; WX 600 ; N B ; B 30 0 630 562 ; -C 67 ; WX 600 ; N C ; B 74 -18 675 580 ; -C 68 ; WX 600 ; N D ; B 30 0 664 562 ; -C 69 ; WX 600 ; N E ; B 25 0 670 562 ; -C 70 ; WX 600 ; N F ; B 39 0 684 562 ; -C 71 ; WX 600 ; N G ; B 74 -18 675 580 ; -C 72 ; WX 600 ; N H ; B 20 0 700 562 ; -C 73 ; WX 600 ; N I ; B 77 0 643 562 ; -C 74 ; WX 600 ; N J ; B 58 -18 721 562 ; -C 75 ; WX 600 ; N K ; B 21 0 692 562 ; -C 76 ; WX 600 ; N L ; B 39 0 636 562 ; -C 77 ; WX 600 ; N M ; B -2 0 722 562 ; -C 78 ; WX 600 ; N N ; B 8 -12 730 562 ; -C 79 ; WX 600 ; N O ; B 74 -18 645 580 ; -C 80 ; WX 600 ; N P ; B 48 0 643 562 ; -C 81 ; WX 600 ; N Q ; B 83 -138 636 580 ; -C 82 ; WX 600 ; N R ; B 24 0 617 562 ; -C 83 ; WX 600 ; N S ; B 54 -22 673 582 ; -C 84 ; WX 600 ; N T ; B 86 0 679 562 ; -C 85 ; WX 600 ; N U ; B 101 -18 716 562 ; -C 86 ; WX 600 ; N V ; B 84 0 733 562 ; -C 87 ; WX 600 ; N W ; B 79 0 738 562 ; -C 88 ; WX 600 ; N X ; B 12 0 690 562 ; -C 89 ; WX 600 ; N Y ; B 109 0 709 562 ; -C 90 ; WX 600 ; N Z ; B 62 0 637 562 ; -C 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ; -C 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ; -C 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ; -C 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ; -C 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ; -C 145 ; WX 600 ; N quoteleft ; B 297 277 487 562 ; -C 97 ; WX 600 ; N a ; B 61 -15 593 454 ; -C 98 ; WX 600 ; N b ; B 13 -15 636 626 ; -C 99 ; WX 600 ; N c ; B 81 -15 631 459 ; -C 100 ; WX 600 ; N d ; B 60 -15 645 626 ; -C 101 ; WX 600 ; N e ; B 81 -15 605 454 ; -C 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ; -C 103 ; WX 600 ; N g ; B 40 -146 674 454 ; -C 104 ; WX 600 ; N h ; B 18 0 615 626 ; -C 105 ; WX 600 ; N i ; B 77 0 546 658 ; -C 106 ; WX 600 ; N j ; B 36 -146 580 658 ; -C 107 ; WX 600 ; N k ; B 33 0 643 626 ; -C 108 ; WX 600 ; N l ; B 77 0 546 626 ; -C 109 ; WX 600 ; N m ; B -22 0 649 454 ; -C 110 ; WX 600 ; N n ; B 18 0 615 454 ; -C 111 ; WX 600 ; N o ; B 71 -15 622 454 ; -C 112 ; WX 600 ; N p ; B -32 -142 622 454 ; -C 113 ; WX 600 ; N q ; B 60 -142 685 454 ; -C 114 ; WX 600 ; N r ; B 47 0 655 454 ; -C 115 ; WX 600 ; N s ; B 66 -17 608 459 ; -C 116 ; WX 600 ; N t ; B 118 -15 567 562 ; -C 117 ; WX 600 ; N u ; B 70 -15 592 439 ; -C 118 ; WX 600 ; N v ; B 70 0 695 439 ; -C 119 ; WX 600 ; N w ; B 53 0 712 439 ; -C 120 ; WX 600 ; N x ; B 6 0 671 439 ; -C 121 ; WX 600 ; N y ; B -21 -142 695 439 ; -C 122 ; WX 600 ; N z ; B 81 0 614 439 ; -C 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ; -C 124 ; WX 600 ; N bar ; B 201 -250 505 750 ; -C 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ; -C 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ; -C 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ; -C 162 ; WX 600 ; N cent ; B 121 -49 605 614 ; -C 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ; -C -1 ; WX 600 ; N fraction ; B 22 -60 708 661 ; -C 165 ; WX 600 ; N yen ; B 98 0 710 562 ; -C 131 ; WX 600 ; N florin ; B -57 -131 702 616 ; -C 167 ; WX 600 ; N section ; B 74 -70 620 580 ; -C 164 ; WX 600 ; N currency ; B 77 49 644 517 ; -C 39 ; WX 600 ; N quotesingle ; B 303 277 493 562 ; -C 147 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ; -C 171 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ; -C 139 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ; -C 155 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ; -C -1 ; WX 600 ; N fi ; B 12 0 644 626 ; -C -1 ; WX 600 ; N fl ; B 12 0 644 626 ; -C 150 ; WX 600 ; N endash ; B 108 203 602 313 ; -C 134 ; WX 600 ; N dagger ; B 175 -70 586 580 ; -C 135 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ; -C 183 ; WX 600 ; N periodcentered ; B 248 165 461 351 ; -C 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ; -C 149 ; WX 600 ; N bullet ; B 196 132 523 430 ; -C 130 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ; -C 132 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ; -C 148 ; WX 600 ; N quotedblright ; B 119 277 645 562 ; -C 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ; -C 133 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ; -C 137 ; WX 600 ; N perthousand ; B -45 -15 743 616 ; -C 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ; -C 96 ; WX 600 ; N grave ; B 272 508 503 661 ; -C 180 ; WX 600 ; N acute ; B 312 508 609 661 ; -C 136 ; WX 600 ; N circumflex ; B 212 483 607 657 ; -C 152 ; WX 600 ; N tilde ; B 199 493 643 636 ; -C 175 ; WX 600 ; N macron ; B 195 505 637 585 ; -C -1 ; WX 600 ; N breve ; B 217 468 652 631 ; -C -1 ; WX 600 ; N dotaccent ; B 348 498 493 638 ; -C 168 ; WX 600 ; N dieresis ; B 246 498 595 638 ; -C -1 ; WX 600 ; N ring ; B 319 481 528 678 ; -C 184 ; WX 600 ; N cedilla ; B 168 -206 368 0 ; -C -1 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ; -C -1 ; WX 600 ; N ogonek ; B 143 -199 367 0 ; -C -1 ; WX 600 ; N caron ; B 238 493 633 667 ; -C 151 ; WX 600 ; N emdash ; B 33 203 677 313 ; -C 198 ; WX 600 ; N AE ; B -29 0 708 562 ; -C 170 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ; -C -1 ; WX 600 ; N Lslash ; B 39 0 636 562 ; -C 216 ; WX 600 ; N Oslash ; B 48 -22 673 584 ; -C 140 ; WX 600 ; N OE ; B 26 0 701 562 ; -C 186 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ; -C 230 ; WX 600 ; N ae ; B 21 -15 652 454 ; -C -1 ; WX 600 ; N dotlessi ; B 77 0 546 439 ; -C -1 ; WX 600 ; N lslash ; B 77 0 587 626 ; -C 248 ; WX 600 ; N oslash ; B 54 -24 638 463 ; -C 156 ; WX 600 ; N oe ; B 18 -15 662 454 ; -C 223 ; WX 600 ; N germandbls ; B 22 -15 629 626 ; -C 207 ; WX 600 ; N Idieresis ; B 77 0 643 761 ; -C 233 ; WX 600 ; N eacute ; B 81 -15 609 661 ; -C -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ; -C -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ; -C -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ; -C 159 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ; -C 247 ; WX 600 ; N divide ; B 114 16 596 500 ; -C 221 ; WX 600 ; N Yacute ; B 109 0 709 784 ; -C 194 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ; -C 225 ; WX 600 ; N aacute ; B 61 -15 609 661 ; -C 219 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ; -C 253 ; WX 600 ; N yacute ; B -21 -142 695 661 ; -C -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ; -C 234 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ; -C -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ; -C 220 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ; -C -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ; -C 218 ; WX 600 ; N Uacute ; B 101 -18 716 784 ; -C -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ; -C 203 ; WX 600 ; N Edieresis ; B 25 0 670 761 ; -C -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ; -C -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ; -C 169 ; WX 600 ; N copyright ; B 53 -18 667 580 ; -C -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ; -C -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ; -C 229 ; WX 600 ; N aring ; B 61 -15 593 678 ; -C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ; -C -1 ; WX 600 ; N lacute ; B 77 0 639 801 ; -C 224 ; WX 600 ; N agrave ; B 61 -15 593 661 ; -C -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ; -C -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ; -C 227 ; WX 600 ; N atilde ; B 61 -15 643 636 ; -C -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ; -C 154 ; WX 600 ; N scaron ; B 66 -17 633 667 ; -C -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ; -C 237 ; WX 600 ; N iacute ; B 77 0 609 661 ; -C -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ; -C -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ; -C -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ; -C 251 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ; -C 226 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ; -C -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ; -C -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ; -C 231 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ; -C -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ; -C 222 ; WX 600 ; N Thorn ; B 48 0 620 562 ; -C -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ; -C -1 ; WX 600 ; N Racute ; B 24 0 665 784 ; -C -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ; -C -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ; -C -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ; -C -1 ; WX 600 ; N uring ; B 70 -15 592 678 ; -C 179 ; WX 600 ; N threesuperior ; B 193 222 526 616 ; -C 210 ; WX 600 ; N Ograve ; B 74 -18 645 784 ; -C 192 ; WX 600 ; N Agrave ; B -9 0 632 784 ; -C -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ; -C 215 ; WX 600 ; N multiply ; B 104 39 606 478 ; -C 250 ; WX 600 ; N uacute ; B 70 -15 599 661 ; -C -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ; -C -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ; -C 255 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ; -C -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ; -C 238 ; WX 600 ; N icircumflex ; B 77 0 577 657 ; -C 202 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ; -C 228 ; WX 600 ; N adieresis ; B 61 -15 595 638 ; -C 235 ; WX 600 ; N edieresis ; B 81 -15 605 638 ; -C -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ; -C -1 ; WX 600 ; N nacute ; B 18 0 639 661 ; -C -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ; -C -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ; -C 205 ; WX 600 ; N Iacute ; B 77 0 643 784 ; -C 177 ; WX 600 ; N plusminus ; B 76 24 614 515 ; -C 166 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ; -C 174 ; WX 600 ; N registered ; B 53 -18 667 580 ; -C -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ; -C -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ; -C -1 ; WX 600 ; N summation ; B 15 -10 672 706 ; -C 200 ; WX 600 ; N Egrave ; B 25 0 670 784 ; -C -1 ; WX 600 ; N racute ; B 47 0 655 661 ; -C -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ; -C -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ; -C 142 ; WX 600 ; N Zcaron ; B 62 0 659 790 ; -C -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ; -C 208 ; WX 600 ; N Eth ; B 30 0 664 562 ; -C 199 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ; -C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ; -C -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ; -C -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ; -C -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ; -C 193 ; WX 600 ; N Aacute ; B -9 0 655 784 ; -C 196 ; WX 600 ; N Adieresis ; B -9 0 632 761 ; -C 232 ; WX 600 ; N egrave ; B 81 -15 605 661 ; -C -1 ; WX 600 ; N zacute ; B 81 0 614 661 ; -C -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ; -C 211 ; WX 600 ; N Oacute ; B 74 -18 645 784 ; -C 243 ; WX 600 ; N oacute ; B 71 -15 649 661 ; -C -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ; -C -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ; -C 239 ; WX 600 ; N idieresis ; B 77 0 561 618 ; -C 212 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ; -C 217 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ; -C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; -C 254 ; WX 600 ; N thorn ; B -32 -142 622 626 ; -C 178 ; WX 600 ; N twosuperior ; B 191 230 542 616 ; -C 214 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ; -C 181 ; WX 600 ; N mu ; B 49 -142 592 439 ; -C 236 ; WX 600 ; N igrave ; B 77 0 546 661 ; -C -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ; -C -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ; -C -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ; -C 190 ; WX 600 ; N threequarters ; B 8 -60 699 661 ; -C -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ; -C -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ; -C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ; -C -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ; -C 153 ; WX 600 ; N trademark ; B 86 230 869 562 ; -C -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ; -C 204 ; WX 600 ; N Igrave ; B 77 0 643 784 ; -C -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ; -C -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ; -C 189 ; WX 600 ; N onehalf ; B 22 -60 716 661 ; -C -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ; -C 244 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ; -C 241 ; WX 600 ; N ntilde ; B 18 0 643 636 ; -C -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ; -C 201 ; WX 600 ; N Eacute ; B 25 0 670 784 ; -C -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ; -C -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ; -C 188 ; WX 600 ; N onequarter ; B 13 -60 707 661 ; -C 138 ; WX 600 ; N Scaron ; B 54 -22 689 790 ; -C -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ; -C -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ; -C 176 ; WX 600 ; N degree ; B 173 243 570 616 ; -C 242 ; WX 600 ; N ograve ; B 71 -15 622 661 ; -C -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ; -C 249 ; WX 600 ; N ugrave ; B 70 -15 592 661 ; -C -1 ; WX 600 ; N radical ; B 67 -104 635 778 ; -C -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ; -C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ; -C 209 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ; -C 245 ; WX 600 ; N otilde ; B 71 -15 643 636 ; -C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ; -C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ; -C 195 ; WX 600 ; N Atilde ; B -9 0 669 759 ; -C -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ; -C 197 ; WX 600 ; N Aring ; B -9 0 632 801 ; -C 213 ; WX 600 ; N Otilde ; B 74 -18 669 759 ; -C -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ; -C -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ; -C -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ; -C -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ; -C -1 ; WX 600 ; N minus ; B 114 203 596 313 ; -C 206 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ; -C -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ; -C -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ; -C 172 ; WX 600 ; N logicalnot ; B 135 103 617 413 ; -C 246 ; WX 600 ; N odieresis ; B 71 -15 622 638 ; -C 252 ; WX 600 ; N udieresis ; B 70 -15 595 638 ; -C -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ; -C -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ; -C 240 ; WX 600 ; N eth ; B 93 -27 661 626 ; -C 158 ; WX 600 ; N zcaron ; B 81 0 643 667 ; -C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ; -C 185 ; WX 600 ; N onesuperior ; B 212 230 514 616 ; -C -1 ; WX 600 ; N imacron ; B 77 0 575 585 ; -C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Courier-Oblique.afm b/vendor/dompdf/dompdf/lib/fonts/Courier-Oblique.afm deleted file mode 100644 index c8893ff..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Courier-Oblique.afm +++ /dev/null @@ -1,344 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 0:00:00 17:37:52 1997 -Comment UniqueID 43051 -Comment VMusage 16248 75829 -FontName Courier-Oblique -FullName Courier Oblique -FamilyName Courier -Weight Medium -ItalicAngle -12 -IsFixedPitch true -CharacterSet ExtendedRoman -FontBBox -27 -250 849 805 -UnderlinePosition -100 -UnderlineThickness 50 -Version 003.000 -Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -EncodingScheme WinAnsiEncoding -CapHeight 562 -XHeight 426 -Ascender 629 -Descender -157 -StdHW 51 -StdVW 51 -StartCharMetrics 317 -C 32 ; WX 600 ; N space ; B 0 0 0 0 ; -C 160 ; WX 600 ; N space ; B 0 0 0 0 ; -C 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ; -C 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ; -C 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ; -C 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ; -C 37 ; WX 600 ; N percent ; B 134 -15 599 622 ; -C 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ; -C 146 ; WX 600 ; N quoteright ; B 283 328 495 562 ; -C 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ; -C 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ; -C 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ; -C 43 ; WX 600 ; N plus ; B 129 44 580 470 ; -C 44 ; WX 600 ; N comma ; B 157 -112 370 122 ; -C 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ; -C 173 ; WX 600 ; N hyphen ; B 152 231 558 285 ; -C 46 ; WX 600 ; N period ; B 238 -15 382 109 ; -C 47 ; WX 600 ; N slash ; B 112 -80 604 629 ; -C 48 ; WX 600 ; N zero ; B 154 -15 575 622 ; -C 49 ; WX 600 ; N one ; B 98 0 515 622 ; -C 50 ; WX 600 ; N two ; B 70 0 568 622 ; -C 51 ; WX 600 ; N three ; B 82 -15 538 622 ; -C 52 ; WX 600 ; N four ; B 108 0 541 622 ; -C 53 ; WX 600 ; N five ; B 99 -15 589 607 ; -C 54 ; WX 600 ; N six ; B 155 -15 629 622 ; -C 55 ; WX 600 ; N seven ; B 182 0 612 607 ; -C 56 ; WX 600 ; N eight ; B 132 -15 588 622 ; -C 57 ; WX 600 ; N nine ; B 93 -15 574 622 ; -C 58 ; WX 600 ; N colon ; B 238 -15 441 385 ; -C 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ; -C 60 ; WX 600 ; N less ; B 96 42 610 472 ; -C 61 ; WX 600 ; N equal ; B 109 138 600 376 ; -C 62 ; WX 600 ; N greater ; B 85 42 599 472 ; -C 63 ; WX 600 ; N question ; B 222 -15 583 572 ; -C 64 ; WX 600 ; N at ; B 127 -15 582 622 ; -C 65 ; WX 600 ; N A ; B 3 0 607 562 ; -C 66 ; WX 600 ; N B ; B 43 0 616 562 ; -C 67 ; WX 600 ; N C ; B 93 -18 655 580 ; -C 68 ; WX 600 ; N D ; B 43 0 645 562 ; -C 69 ; WX 600 ; N E ; B 53 0 660 562 ; -C 70 ; WX 600 ; N F ; B 53 0 660 562 ; -C 71 ; WX 600 ; N G ; B 83 -18 645 580 ; -C 72 ; WX 600 ; N H ; B 32 0 687 562 ; -C 73 ; WX 600 ; N I ; B 96 0 623 562 ; -C 74 ; WX 600 ; N J ; B 52 -18 685 562 ; -C 75 ; WX 600 ; N K ; B 38 0 671 562 ; -C 76 ; WX 600 ; N L ; B 47 0 607 562 ; -C 77 ; WX 600 ; N M ; B 4 0 715 562 ; -C 78 ; WX 600 ; N N ; B 7 -13 712 562 ; -C 79 ; WX 600 ; N O ; B 94 -18 625 580 ; -C 80 ; WX 600 ; N P ; B 79 0 644 562 ; -C 81 ; WX 600 ; N Q ; B 95 -138 625 580 ; -C 82 ; WX 600 ; N R ; B 38 0 598 562 ; -C 83 ; WX 600 ; N S ; B 76 -20 650 580 ; -C 84 ; WX 600 ; N T ; B 108 0 665 562 ; -C 85 ; WX 600 ; N U ; B 125 -18 702 562 ; -C 86 ; WX 600 ; N V ; B 105 -13 723 562 ; -C 87 ; WX 600 ; N W ; B 106 -13 722 562 ; -C 88 ; WX 600 ; N X ; B 23 0 675 562 ; -C 89 ; WX 600 ; N Y ; B 133 0 695 562 ; -C 90 ; WX 600 ; N Z ; B 86 0 610 562 ; -C 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ; -C 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ; -C 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ; -C 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ; -C 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ; -C 145 ; WX 600 ; N quoteleft ; B 343 328 457 562 ; -C 97 ; WX 600 ; N a ; B 76 -15 569 441 ; -C 98 ; WX 600 ; N b ; B 29 -15 625 629 ; -C 99 ; WX 600 ; N c ; B 106 -15 608 441 ; -C 100 ; WX 600 ; N d ; B 85 -15 640 629 ; -C 101 ; WX 600 ; N e ; B 106 -15 598 441 ; -C 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ; -C 103 ; WX 600 ; N g ; B 61 -157 657 441 ; -C 104 ; WX 600 ; N h ; B 33 0 592 629 ; -C 105 ; WX 600 ; N i ; B 95 0 515 657 ; -C 106 ; WX 600 ; N j ; B 52 -157 550 657 ; -C 107 ; WX 600 ; N k ; B 58 0 633 629 ; -C 108 ; WX 600 ; N l ; B 95 0 515 629 ; -C 109 ; WX 600 ; N m ; B -5 0 615 441 ; -C 110 ; WX 600 ; N n ; B 26 0 585 441 ; -C 111 ; WX 600 ; N o ; B 102 -15 588 441 ; -C 112 ; WX 600 ; N p ; B -24 -157 605 441 ; -C 113 ; WX 600 ; N q ; B 85 -157 682 441 ; -C 114 ; WX 600 ; N r ; B 60 0 636 441 ; -C 115 ; WX 600 ; N s ; B 78 -15 584 441 ; -C 116 ; WX 600 ; N t ; B 167 -15 561 561 ; -C 117 ; WX 600 ; N u ; B 101 -15 572 426 ; -C 118 ; WX 600 ; N v ; B 90 -10 681 426 ; -C 119 ; WX 600 ; N w ; B 76 -10 695 426 ; -C 120 ; WX 600 ; N x ; B 20 0 655 426 ; -C 121 ; WX 600 ; N y ; B -4 -157 683 426 ; -C 122 ; WX 600 ; N z ; B 99 0 593 426 ; -C 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ; -C 124 ; WX 600 ; N bar ; B 222 -250 485 750 ; -C 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ; -C 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ; -C 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ; -C 162 ; WX 600 ; N cent ; B 151 -49 588 614 ; -C 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ; -C -1 ; WX 600 ; N fraction ; B 84 -57 646 665 ; -C 165 ; WX 600 ; N yen ; B 120 0 693 562 ; -C 131 ; WX 600 ; N florin ; B -26 -143 671 622 ; -C 167 ; WX 600 ; N section ; B 104 -78 590 580 ; -C 164 ; WX 600 ; N currency ; B 94 58 628 506 ; -C 39 ; WX 600 ; N quotesingle ; B 345 328 460 562 ; -C 147 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ; -C 171 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ; -C 139 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ; -C 155 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ; -C -1 ; WX 600 ; N fi ; B 3 0 619 629 ; -C -1 ; WX 600 ; N fl ; B 3 0 619 629 ; -C 150 ; WX 600 ; N endash ; B 124 231 586 285 ; -C 134 ; WX 600 ; N dagger ; B 217 -78 546 580 ; -C 135 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ; -C 183 ; WX 600 ; N periodcentered ; B 275 189 434 327 ; -C 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ; -C 149 ; WX 600 ; N bullet ; B 224 130 485 383 ; -C 130 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ; -C 132 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ; -C 148 ; WX 600 ; N quotedblright ; B 213 328 576 562 ; -C 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ; -C 133 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ; -C 137 ; WX 600 ; N perthousand ; B 59 -15 627 622 ; -C 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ; -C 96 ; WX 600 ; N grave ; B 294 497 484 672 ; -C 180 ; WX 600 ; N acute ; B 348 497 612 672 ; -C 136 ; WX 600 ; N circumflex ; B 229 477 581 654 ; -C 152 ; WX 600 ; N tilde ; B 212 489 629 606 ; -C 175 ; WX 600 ; N macron ; B 232 525 600 565 ; -C -1 ; WX 600 ; N breve ; B 279 501 576 609 ; -C -1 ; WX 600 ; N dotaccent ; B 373 537 478 640 ; -C 168 ; WX 600 ; N dieresis ; B 272 537 579 640 ; -C -1 ; WX 600 ; N ring ; B 332 463 500 627 ; -C 184 ; WX 600 ; N cedilla ; B 197 -151 344 10 ; -C -1 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ; -C -1 ; WX 600 ; N ogonek ; B 189 -172 377 4 ; -C -1 ; WX 600 ; N caron ; B 262 492 614 669 ; -C 151 ; WX 600 ; N emdash ; B 49 231 661 285 ; -C 198 ; WX 600 ; N AE ; B 3 0 655 562 ; -C 170 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ; -C -1 ; WX 600 ; N Lslash ; B 47 0 607 562 ; -C 216 ; WX 600 ; N Oslash ; B 94 -80 625 629 ; -C 140 ; WX 600 ; N OE ; B 59 0 672 562 ; -C 186 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ; -C 230 ; WX 600 ; N ae ; B 41 -15 626 441 ; -C -1 ; WX 600 ; N dotlessi ; B 95 0 515 426 ; -C -1 ; WX 600 ; N lslash ; B 95 0 587 629 ; -C 248 ; WX 600 ; N oslash ; B 102 -80 588 506 ; -C 156 ; WX 600 ; N oe ; B 54 -15 615 441 ; -C 223 ; WX 600 ; N germandbls ; B 48 -15 617 629 ; -C 207 ; WX 600 ; N Idieresis ; B 96 0 623 753 ; -C 233 ; WX 600 ; N eacute ; B 106 -15 612 672 ; -C -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ; -C -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ; -C -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ; -C 159 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ; -C 247 ; WX 600 ; N divide ; B 136 48 573 467 ; -C 221 ; WX 600 ; N Yacute ; B 133 0 695 805 ; -C 194 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ; -C 225 ; WX 600 ; N aacute ; B 76 -15 612 672 ; -C 219 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ; -C 253 ; WX 600 ; N yacute ; B -4 -157 683 672 ; -C -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ; -C 234 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ; -C -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ; -C 220 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ; -C -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ; -C 218 ; WX 600 ; N Uacute ; B 125 -18 702 805 ; -C -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ; -C 203 ; WX 600 ; N Edieresis ; B 53 0 660 753 ; -C -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ; -C -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ; -C 169 ; WX 600 ; N copyright ; B 53 -18 667 580 ; -C -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ; -C -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ; -C 229 ; WX 600 ; N aring ; B 76 -15 569 627 ; -C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ; -C -1 ; WX 600 ; N lacute ; B 95 0 640 805 ; -C 224 ; WX 600 ; N agrave ; B 76 -15 569 672 ; -C -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ; -C -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ; -C 227 ; WX 600 ; N atilde ; B 76 -15 629 606 ; -C -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ; -C 154 ; WX 600 ; N scaron ; B 78 -15 614 669 ; -C -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ; -C 237 ; WX 600 ; N iacute ; B 95 0 612 672 ; -C -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ; -C -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ; -C -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ; -C 251 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ; -C 226 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ; -C -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ; -C -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ; -C 231 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ; -C -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ; -C 222 ; WX 600 ; N Thorn ; B 79 0 606 562 ; -C -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ; -C -1 ; WX 600 ; N Racute ; B 38 0 670 805 ; -C -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ; -C -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ; -C -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ; -C -1 ; WX 600 ; N uring ; B 101 -15 572 627 ; -C 179 ; WX 600 ; N threesuperior ; B 213 240 501 622 ; -C 210 ; WX 600 ; N Ograve ; B 94 -18 625 805 ; -C 192 ; WX 600 ; N Agrave ; B 3 0 607 805 ; -C -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ; -C 215 ; WX 600 ; N multiply ; B 103 43 607 470 ; -C 250 ; WX 600 ; N uacute ; B 101 -15 602 672 ; -C -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ; -C -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ; -C 255 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ; -C -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ; -C 238 ; WX 600 ; N icircumflex ; B 95 0 551 654 ; -C 202 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ; -C 228 ; WX 600 ; N adieresis ; B 76 -15 575 620 ; -C 235 ; WX 600 ; N edieresis ; B 106 -15 598 620 ; -C -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ; -C -1 ; WX 600 ; N nacute ; B 26 0 602 672 ; -C -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ; -C -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ; -C 205 ; WX 600 ; N Iacute ; B 96 0 640 805 ; -C 177 ; WX 600 ; N plusminus ; B 96 44 594 558 ; -C 166 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ; -C 174 ; WX 600 ; N registered ; B 53 -18 667 580 ; -C -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ; -C -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ; -C -1 ; WX 600 ; N summation ; B 15 -10 670 706 ; -C 200 ; WX 600 ; N Egrave ; B 53 0 660 805 ; -C -1 ; WX 600 ; N racute ; B 60 0 636 672 ; -C -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ; -C -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ; -C 142 ; WX 600 ; N Zcaron ; B 86 0 642 802 ; -C -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ; -C 208 ; WX 600 ; N Eth ; B 43 0 645 562 ; -C 199 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ; -C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ; -C -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ; -C -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ; -C -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ; -C 193 ; WX 600 ; N Aacute ; B 3 0 660 805 ; -C 196 ; WX 600 ; N Adieresis ; B 3 0 607 753 ; -C 232 ; WX 600 ; N egrave ; B 106 -15 598 672 ; -C -1 ; WX 600 ; N zacute ; B 99 0 612 672 ; -C -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ; -C 211 ; WX 600 ; N Oacute ; B 94 -18 640 805 ; -C 243 ; WX 600 ; N oacute ; B 102 -15 612 672 ; -C -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ; -C -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ; -C 239 ; WX 600 ; N idieresis ; B 95 0 545 620 ; -C 212 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ; -C 217 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ; -C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; -C 254 ; WX 600 ; N thorn ; B -24 -157 605 629 ; -C 178 ; WX 600 ; N twosuperior ; B 230 249 535 622 ; -C 214 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ; -C 181 ; WX 600 ; N mu ; B 72 -157 572 426 ; -C 236 ; WX 600 ; N igrave ; B 95 0 515 672 ; -C -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ; -C -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ; -C -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ; -C 190 ; WX 600 ; N threequarters ; B 73 -56 659 666 ; -C -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ; -C -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ; -C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ; -C -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ; -C 153 ; WX 600 ; N trademark ; B 75 263 742 562 ; -C -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ; -C 204 ; WX 600 ; N Igrave ; B 96 0 623 805 ; -C -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ; -C -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ; -C 189 ; WX 600 ; N onehalf ; B 65 -57 669 665 ; -C -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ; -C 244 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ; -C 241 ; WX 600 ; N ntilde ; B 26 0 629 606 ; -C -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ; -C 201 ; WX 600 ; N Eacute ; B 53 0 670 805 ; -C -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ; -C -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ; -C 188 ; WX 600 ; N onequarter ; B 65 -57 674 665 ; -C 138 ; WX 600 ; N Scaron ; B 76 -20 672 802 ; -C -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ; -C -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ; -C 176 ; WX 600 ; N degree ; B 214 269 576 622 ; -C 242 ; WX 600 ; N ograve ; B 102 -15 588 672 ; -C -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ; -C 249 ; WX 600 ; N ugrave ; B 101 -15 572 672 ; -C -1 ; WX 600 ; N radical ; B 85 -15 765 792 ; -C -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ; -C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ; -C 209 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ; -C 245 ; WX 600 ; N otilde ; B 102 -15 629 606 ; -C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ; -C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ; -C 195 ; WX 600 ; N Atilde ; B 3 0 655 729 ; -C -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ; -C 197 ; WX 600 ; N Aring ; B 3 0 607 750 ; -C 213 ; WX 600 ; N Otilde ; B 94 -18 655 729 ; -C -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ; -C -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ; -C -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ; -C -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ; -C -1 ; WX 600 ; N minus ; B 129 232 580 283 ; -C 206 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ; -C -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ; -C -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ; -C 172 ; WX 600 ; N logicalnot ; B 155 108 591 369 ; -C 246 ; WX 600 ; N odieresis ; B 102 -15 588 620 ; -C 252 ; WX 600 ; N udieresis ; B 101 -15 575 620 ; -C -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ; -C -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ; -C 240 ; WX 600 ; N eth ; B 102 -15 639 629 ; -C 158 ; WX 600 ; N zcaron ; B 99 0 624 669 ; -C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ; -C 185 ; WX 600 ; N onesuperior ; B 231 249 491 622 ; -C -1 ; WX 600 ; N imacron ; B 95 0 543 565 ; -C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Courier.afm b/vendor/dompdf/dompdf/lib/fonts/Courier.afm deleted file mode 100644 index fb77a74..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Courier.afm +++ /dev/null @@ -1,344 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 1 17:27:09 1997 -Comment UniqueID 43050 -Comment VMusage 39754 50779 -FontName Courier -FullName Courier -FamilyName Courier -Weight Medium -ItalicAngle 0 -IsFixedPitch true -CharacterSet ExtendedRoman -FontBBox -23 -250 715 805 -UnderlinePosition -100 -UnderlineThickness 50 -Version 003.000 -Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -EncodingScheme WinAnsiEncoding -CapHeight 562 -XHeight 426 -Ascender 629 -Descender -157 -StdHW 51 -StdVW 51 -StartCharMetrics 317 -C 32 ; WX 600 ; N space ; B 0 0 0 0 ; -C 160 ; WX 600 ; N space ; B 0 0 0 0 ; -C 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ; -C 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ; -C 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ; -C 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ; -C 37 ; WX 600 ; N percent ; B 81 -15 518 622 ; -C 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ; -C 146 ; WX 600 ; N quoteright ; B 213 328 376 562 ; -C 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ; -C 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ; -C 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ; -C 43 ; WX 600 ; N plus ; B 80 44 520 470 ; -C 44 ; WX 600 ; N comma ; B 181 -112 344 122 ; -C 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ; -C 173 ; WX 600 ; N hyphen ; B 103 231 497 285 ; -C 46 ; WX 600 ; N period ; B 229 -15 371 109 ; -C 47 ; WX 600 ; N slash ; B 125 -80 475 629 ; -C 48 ; WX 600 ; N zero ; B 106 -15 494 622 ; -C 49 ; WX 600 ; N one ; B 96 0 505 622 ; -C 50 ; WX 600 ; N two ; B 70 0 471 622 ; -C 51 ; WX 600 ; N three ; B 75 -15 466 622 ; -C 52 ; WX 600 ; N four ; B 78 0 500 622 ; -C 53 ; WX 600 ; N five ; B 92 -15 497 607 ; -C 54 ; WX 600 ; N six ; B 111 -15 497 622 ; -C 55 ; WX 600 ; N seven ; B 82 0 483 607 ; -C 56 ; WX 600 ; N eight ; B 102 -15 498 622 ; -C 57 ; WX 600 ; N nine ; B 96 -15 489 622 ; -C 58 ; WX 600 ; N colon ; B 229 -15 371 385 ; -C 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ; -C 60 ; WX 600 ; N less ; B 41 42 519 472 ; -C 61 ; WX 600 ; N equal ; B 80 138 520 376 ; -C 62 ; WX 600 ; N greater ; B 66 42 544 472 ; -C 63 ; WX 600 ; N question ; B 129 -15 492 572 ; -C 64 ; WX 600 ; N at ; B 77 -15 533 622 ; -C 65 ; WX 600 ; N A ; B 3 0 597 562 ; -C 66 ; WX 600 ; N B ; B 43 0 559 562 ; -C 67 ; WX 600 ; N C ; B 41 -18 540 580 ; -C 68 ; WX 600 ; N D ; B 43 0 574 562 ; -C 69 ; WX 600 ; N E ; B 53 0 550 562 ; -C 70 ; WX 600 ; N F ; B 53 0 545 562 ; -C 71 ; WX 600 ; N G ; B 31 -18 575 580 ; -C 72 ; WX 600 ; N H ; B 32 0 568 562 ; -C 73 ; WX 600 ; N I ; B 96 0 504 562 ; -C 74 ; WX 600 ; N J ; B 34 -18 566 562 ; -C 75 ; WX 600 ; N K ; B 38 0 582 562 ; -C 76 ; WX 600 ; N L ; B 47 0 554 562 ; -C 77 ; WX 600 ; N M ; B 4 0 596 562 ; -C 78 ; WX 600 ; N N ; B 7 -13 593 562 ; -C 79 ; WX 600 ; N O ; B 43 -18 557 580 ; -C 80 ; WX 600 ; N P ; B 79 0 558 562 ; -C 81 ; WX 600 ; N Q ; B 43 -138 557 580 ; -C 82 ; WX 600 ; N R ; B 38 0 588 562 ; -C 83 ; WX 600 ; N S ; B 72 -20 529 580 ; -C 84 ; WX 600 ; N T ; B 38 0 563 562 ; -C 85 ; WX 600 ; N U ; B 17 -18 583 562 ; -C 86 ; WX 600 ; N V ; B -4 -13 604 562 ; -C 87 ; WX 600 ; N W ; B -3 -13 603 562 ; -C 88 ; WX 600 ; N X ; B 23 0 577 562 ; -C 89 ; WX 600 ; N Y ; B 24 0 576 562 ; -C 90 ; WX 600 ; N Z ; B 86 0 514 562 ; -C 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ; -C 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ; -C 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ; -C 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ; -C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; -C 145 ; WX 600 ; N quoteleft ; B 224 328 387 562 ; -C 97 ; WX 600 ; N a ; B 53 -15 559 441 ; -C 98 ; WX 600 ; N b ; B 14 -15 575 629 ; -C 99 ; WX 600 ; N c ; B 66 -15 529 441 ; -C 100 ; WX 600 ; N d ; B 45 -15 591 629 ; -C 101 ; WX 600 ; N e ; B 66 -15 548 441 ; -C 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ; -C 103 ; WX 600 ; N g ; B 45 -157 566 441 ; -C 104 ; WX 600 ; N h ; B 18 0 582 629 ; -C 105 ; WX 600 ; N i ; B 95 0 505 657 ; -C 106 ; WX 600 ; N j ; B 82 -157 410 657 ; -C 107 ; WX 600 ; N k ; B 43 0 580 629 ; -C 108 ; WX 600 ; N l ; B 95 0 505 629 ; -C 109 ; WX 600 ; N m ; B -5 0 605 441 ; -C 110 ; WX 600 ; N n ; B 26 0 575 441 ; -C 111 ; WX 600 ; N o ; B 62 -15 538 441 ; -C 112 ; WX 600 ; N p ; B 9 -157 555 441 ; -C 113 ; WX 600 ; N q ; B 45 -157 591 441 ; -C 114 ; WX 600 ; N r ; B 60 0 559 441 ; -C 115 ; WX 600 ; N s ; B 80 -15 513 441 ; -C 116 ; WX 600 ; N t ; B 87 -15 530 561 ; -C 117 ; WX 600 ; N u ; B 21 -15 562 426 ; -C 118 ; WX 600 ; N v ; B 10 -10 590 426 ; -C 119 ; WX 600 ; N w ; B -4 -10 604 426 ; -C 120 ; WX 600 ; N x ; B 20 0 580 426 ; -C 121 ; WX 600 ; N y ; B 7 -157 592 426 ; -C 122 ; WX 600 ; N z ; B 99 0 502 426 ; -C 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ; -C 124 ; WX 600 ; N bar ; B 275 -250 326 750 ; -C 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ; -C 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ; -C 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ; -C 162 ; WX 600 ; N cent ; B 96 -49 500 614 ; -C 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ; -C -1 ; WX 600 ; N fraction ; B 92 -57 509 665 ; -C 165 ; WX 600 ; N yen ; B 26 0 574 562 ; -C 131 ; WX 600 ; N florin ; B 4 -143 539 622 ; -C 167 ; WX 600 ; N section ; B 113 -78 488 580 ; -C 164 ; WX 600 ; N currency ; B 73 58 527 506 ; -C 39 ; WX 600 ; N quotesingle ; B 259 328 341 562 ; -C 147 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ; -C 171 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ; -C 139 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ; -C 155 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ; -C -1 ; WX 600 ; N fi ; B 3 0 597 629 ; -C -1 ; WX 600 ; N fl ; B 3 0 597 629 ; -C 150 ; WX 600 ; N endash ; B 75 231 525 285 ; -C 134 ; WX 600 ; N dagger ; B 141 -78 459 580 ; -C 135 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ; -C 183 ; WX 600 ; N periodcentered ; B 222 189 378 327 ; -C 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ; -C 149 ; WX 600 ; N bullet ; B 172 130 428 383 ; -C 130 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ; -C 132 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ; -C 148 ; WX 600 ; N quotedblright ; B 143 328 457 562 ; -C 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ; -C 133 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ; -C 137 ; WX 600 ; N perthousand ; B 3 -15 600 622 ; -C 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ; -C 96 ; WX 600 ; N grave ; B 151 497 378 672 ; -C 180 ; WX 600 ; N acute ; B 242 497 469 672 ; -C 136 ; WX 600 ; N circumflex ; B 124 477 476 654 ; -C 152 ; WX 600 ; N tilde ; B 105 489 503 606 ; -C 175 ; WX 600 ; N macron ; B 120 525 480 565 ; -C -1 ; WX 600 ; N breve ; B 153 501 447 609 ; -C -1 ; WX 600 ; N dotaccent ; B 249 537 352 640 ; -C 168 ; WX 600 ; N dieresis ; B 148 537 453 640 ; -C -1 ; WX 600 ; N ring ; B 218 463 382 627 ; -C 184 ; WX 600 ; N cedilla ; B 224 -151 362 10 ; -C -1 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ; -C -1 ; WX 600 ; N ogonek ; B 211 -172 407 4 ; -C -1 ; WX 600 ; N caron ; B 124 492 476 669 ; -C 151 ; WX 600 ; N emdash ; B 0 231 600 285 ; -C 198 ; WX 600 ; N AE ; B 3 0 550 562 ; -C 170 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ; -C -1 ; WX 600 ; N Lslash ; B 47 0 554 562 ; -C 216 ; WX 600 ; N Oslash ; B 43 -80 557 629 ; -C 140 ; WX 600 ; N OE ; B 7 0 567 562 ; -C 186 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ; -C 230 ; WX 600 ; N ae ; B 19 -15 570 441 ; -C -1 ; WX 600 ; N dotlessi ; B 95 0 505 426 ; -C -1 ; WX 600 ; N lslash ; B 95 0 505 629 ; -C 248 ; WX 600 ; N oslash ; B 62 -80 538 506 ; -C 156 ; WX 600 ; N oe ; B 19 -15 559 441 ; -C 223 ; WX 600 ; N germandbls ; B 48 -15 588 629 ; -C 207 ; WX 600 ; N Idieresis ; B 96 0 504 753 ; -C 233 ; WX 600 ; N eacute ; B 66 -15 548 672 ; -C -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ; -C -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ; -C -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ; -C 159 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ; -C 247 ; WX 600 ; N divide ; B 87 48 513 467 ; -C 221 ; WX 600 ; N Yacute ; B 24 0 576 805 ; -C 194 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ; -C 225 ; WX 600 ; N aacute ; B 53 -15 559 672 ; -C 219 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ; -C 253 ; WX 600 ; N yacute ; B 7 -157 592 672 ; -C -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ; -C 234 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ; -C -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ; -C 220 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ; -C -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ; -C 218 ; WX 600 ; N Uacute ; B 17 -18 583 805 ; -C -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ; -C 203 ; WX 600 ; N Edieresis ; B 53 0 550 753 ; -C -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ; -C -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ; -C 169 ; WX 600 ; N copyright ; B 0 -18 600 580 ; -C -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ; -C -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ; -C 229 ; WX 600 ; N aring ; B 53 -15 559 627 ; -C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ; -C -1 ; WX 600 ; N lacute ; B 95 0 505 805 ; -C 224 ; WX 600 ; N agrave ; B 53 -15 559 672 ; -C -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ; -C -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ; -C 227 ; WX 600 ; N atilde ; B 53 -15 559 606 ; -C -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ; -C 154 ; WX 600 ; N scaron ; B 80 -15 513 669 ; -C -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ; -C 237 ; WX 600 ; N iacute ; B 95 0 505 672 ; -C -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ; -C -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ; -C -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ; -C 251 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ; -C 226 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ; -C -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ; -C -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ; -C 231 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ; -C -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ; -C 222 ; WX 600 ; N Thorn ; B 79 0 538 562 ; -C -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ; -C -1 ; WX 600 ; N Racute ; B 38 0 588 805 ; -C -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ; -C -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ; -C -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ; -C -1 ; WX 600 ; N uring ; B 21 -15 562 627 ; -C 179 ; WX 600 ; N threesuperior ; B 155 240 406 622 ; -C 210 ; WX 600 ; N Ograve ; B 43 -18 557 805 ; -C 192 ; WX 600 ; N Agrave ; B 3 0 597 805 ; -C -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ; -C 215 ; WX 600 ; N multiply ; B 87 43 515 470 ; -C 250 ; WX 600 ; N uacute ; B 21 -15 562 672 ; -C -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ; -C -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ; -C 255 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ; -C -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ; -C 238 ; WX 600 ; N icircumflex ; B 94 0 505 654 ; -C 202 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ; -C 228 ; WX 600 ; N adieresis ; B 53 -15 559 620 ; -C 235 ; WX 600 ; N edieresis ; B 66 -15 548 620 ; -C -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ; -C -1 ; WX 600 ; N nacute ; B 26 0 575 672 ; -C -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ; -C -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ; -C 205 ; WX 600 ; N Iacute ; B 96 0 504 805 ; -C 177 ; WX 600 ; N plusminus ; B 87 44 513 558 ; -C 166 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ; -C 174 ; WX 600 ; N registered ; B 0 -18 600 580 ; -C -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ; -C -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ; -C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; -C 200 ; WX 600 ; N Egrave ; B 53 0 550 805 ; -C -1 ; WX 600 ; N racute ; B 60 0 559 672 ; -C -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ; -C -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ; -C 142 ; WX 600 ; N Zcaron ; B 86 0 514 802 ; -C -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ; -C 208 ; WX 600 ; N Eth ; B 30 0 574 562 ; -C 199 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ; -C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ; -C -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ; -C -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ; -C -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ; -C 193 ; WX 600 ; N Aacute ; B 3 0 597 805 ; -C 196 ; WX 600 ; N Adieresis ; B 3 0 597 753 ; -C 232 ; WX 600 ; N egrave ; B 66 -15 548 672 ; -C -1 ; WX 600 ; N zacute ; B 99 0 502 672 ; -C -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ; -C 211 ; WX 600 ; N Oacute ; B 43 -18 557 805 ; -C 243 ; WX 600 ; N oacute ; B 62 -15 538 672 ; -C -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ; -C -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ; -C 239 ; WX 600 ; N idieresis ; B 95 0 505 620 ; -C 212 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ; -C 217 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ; -C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; -C 254 ; WX 600 ; N thorn ; B -6 -157 555 629 ; -C 178 ; WX 600 ; N twosuperior ; B 177 249 424 622 ; -C 214 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ; -C 181 ; WX 600 ; N mu ; B 21 -157 562 426 ; -C 236 ; WX 600 ; N igrave ; B 95 0 505 672 ; -C -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ; -C -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ; -C -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ; -C 190 ; WX 600 ; N threequarters ; B 8 -56 593 666 ; -C -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ; -C -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ; -C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ; -C -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ; -C 153 ; WX 600 ; N trademark ; B -23 263 623 562 ; -C -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ; -C 204 ; WX 600 ; N Igrave ; B 96 0 504 805 ; -C -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ; -C -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ; -C 189 ; WX 600 ; N onehalf ; B 0 -57 611 665 ; -C -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ; -C 244 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ; -C 241 ; WX 600 ; N ntilde ; B 26 0 575 606 ; -C -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ; -C 201 ; WX 600 ; N Eacute ; B 53 0 550 805 ; -C -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ; -C -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ; -C 188 ; WX 600 ; N onequarter ; B 0 -57 600 665 ; -C 138 ; WX 600 ; N Scaron ; B 72 -20 529 802 ; -C -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ; -C -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ; -C 176 ; WX 600 ; N degree ; B 123 269 477 622 ; -C 242 ; WX 600 ; N ograve ; B 62 -15 538 672 ; -C -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ; -C 249 ; WX 600 ; N ugrave ; B 21 -15 562 672 ; -C -1 ; WX 600 ; N radical ; B 3 -15 597 792 ; -C -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ; -C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ; -C 209 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ; -C 245 ; WX 600 ; N otilde ; B 62 -15 538 606 ; -C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ; -C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ; -C 195 ; WX 600 ; N Atilde ; B 3 0 597 729 ; -C -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ; -C 197 ; WX 600 ; N Aring ; B 3 0 597 750 ; -C 213 ; WX 600 ; N Otilde ; B 43 -18 557 729 ; -C -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ; -C -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ; -C -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ; -C -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ; -C -1 ; WX 600 ; N minus ; B 80 232 520 283 ; -C 206 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ; -C -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ; -C -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ; -C 172 ; WX 600 ; N logicalnot ; B 87 108 513 369 ; -C 246 ; WX 600 ; N odieresis ; B 62 -15 538 620 ; -C 252 ; WX 600 ; N udieresis ; B 21 -15 562 620 ; -C -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ; -C -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ; -C 240 ; WX 600 ; N eth ; B 62 -15 538 629 ; -C 158 ; WX 600 ; N zcaron ; B 99 0 502 669 ; -C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ; -C 185 ; WX 600 ; N onesuperior ; B 172 249 428 622 ; -C -1 ; WX 600 ; N imacron ; B 95 0 505 565 ; -C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ttf deleted file mode 100644 index 6d65fa7..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ufm deleted file mode 100644 index e927992..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ufm +++ /dev/null @@ -1,6067 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Sans -FontSubfamily Bold -UniqueID DejaVu Sans Bold -FullName DejaVu Sans Bold -Version Version 2.37 -PostScriptName DejaVuSans-Bold -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -PreferredFamily DejaVu Sans -PreferredSubfamily Bold -Weight Bold -ItalicAngle 0 -IsFixedPitch false -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 928 -Descender -236 -FontBBox -1069 -415 1975 1174 -StartCharMetrics 6196 -U 32 ; WX 348 ; N space ; G 3 -U 33 ; WX 456 ; N exclam ; G 4 -U 34 ; WX 521 ; N quotedbl ; G 5 -U 35 ; WX 838 ; N numbersign ; G 6 -U 36 ; WX 696 ; N dollar ; G 7 -U 37 ; WX 1002 ; N percent ; G 8 -U 38 ; WX 872 ; N ampersand ; G 9 -U 39 ; WX 306 ; N quotesingle ; G 10 -U 40 ; WX 457 ; N parenleft ; G 11 -U 41 ; WX 457 ; N parenright ; G 12 -U 42 ; WX 523 ; N asterisk ; G 13 -U 43 ; WX 838 ; N plus ; G 14 -U 44 ; WX 380 ; N comma ; G 15 -U 45 ; WX 415 ; N hyphen ; G 16 -U 46 ; WX 380 ; N period ; G 17 -U 47 ; WX 365 ; N slash ; G 18 -U 48 ; WX 696 ; N zero ; G 19 -U 49 ; WX 696 ; N one ; G 20 -U 50 ; WX 696 ; N two ; G 21 -U 51 ; WX 696 ; N three ; G 22 -U 52 ; WX 696 ; N four ; G 23 -U 53 ; WX 696 ; N five ; G 24 -U 54 ; WX 696 ; N six ; G 25 -U 55 ; WX 696 ; N seven ; G 26 -U 56 ; WX 696 ; N eight ; G 27 -U 57 ; WX 696 ; N nine ; G 28 -U 58 ; WX 400 ; N colon ; G 29 -U 59 ; WX 400 ; N semicolon ; G 30 -U 60 ; WX 838 ; N less ; G 31 -U 61 ; WX 838 ; N equal ; G 32 -U 62 ; WX 838 ; N greater ; G 33 -U 63 ; WX 580 ; N question ; G 34 -U 64 ; WX 1000 ; N at ; G 35 -U 65 ; WX 774 ; N A ; G 36 -U 66 ; WX 762 ; N B ; G 37 -U 67 ; WX 734 ; N C ; G 38 -U 68 ; WX 830 ; N D ; G 39 -U 69 ; WX 683 ; N E ; G 40 -U 70 ; WX 683 ; N F ; G 41 -U 71 ; WX 821 ; N G ; G 42 -U 72 ; WX 837 ; N H ; G 43 -U 73 ; WX 372 ; N I ; G 44 -U 74 ; WX 372 ; N J ; G 45 -U 75 ; WX 775 ; N K ; G 46 -U 76 ; WX 637 ; N L ; G 47 -U 77 ; WX 995 ; N M ; G 48 -U 78 ; WX 837 ; N N ; G 49 -U 79 ; WX 850 ; N O ; G 50 -U 80 ; WX 733 ; N P ; G 51 -U 81 ; WX 850 ; N Q ; G 52 -U 82 ; WX 770 ; N R ; G 53 -U 83 ; WX 720 ; N S ; G 54 -U 84 ; WX 682 ; N T ; G 55 -U 85 ; WX 812 ; N U ; G 56 -U 86 ; WX 774 ; N V ; G 57 -U 87 ; WX 1103 ; N W ; G 58 -U 88 ; WX 771 ; N X ; G 59 -U 89 ; WX 724 ; N Y ; G 60 -U 90 ; WX 725 ; N Z ; G 61 -U 91 ; WX 457 ; N bracketleft ; G 62 -U 92 ; WX 365 ; N backslash ; G 63 -U 93 ; WX 457 ; N bracketright ; G 64 -U 94 ; WX 838 ; N asciicircum ; G 65 -U 95 ; WX 500 ; N underscore ; G 66 -U 96 ; WX 500 ; N grave ; G 67 -U 97 ; WX 675 ; N a ; G 68 -U 98 ; WX 716 ; N b ; G 69 -U 99 ; WX 593 ; N c ; G 70 -U 100 ; WX 716 ; N d ; G 71 -U 101 ; WX 678 ; N e ; G 72 -U 102 ; WX 435 ; N f ; G 73 -U 103 ; WX 716 ; N g ; G 74 -U 104 ; WX 712 ; N h ; G 75 -U 105 ; WX 343 ; N i ; G 76 -U 106 ; WX 343 ; N j ; G 77 -U 107 ; WX 665 ; N k ; G 78 -U 108 ; WX 343 ; N l ; G 79 -U 109 ; WX 1042 ; N m ; G 80 -U 110 ; WX 712 ; N n ; G 81 -U 111 ; WX 687 ; N o ; G 82 -U 112 ; WX 716 ; N p ; G 83 -U 113 ; WX 716 ; N q ; G 84 -U 114 ; WX 493 ; N r ; G 85 -U 115 ; WX 595 ; N s ; G 86 -U 116 ; WX 478 ; N t ; G 87 -U 117 ; WX 712 ; N u ; G 88 -U 118 ; WX 652 ; N v ; G 89 -U 119 ; WX 924 ; N w ; G 90 -U 120 ; WX 645 ; N x ; G 91 -U 121 ; WX 652 ; N y ; G 92 -U 122 ; WX 582 ; N z ; G 93 -U 123 ; WX 712 ; N braceleft ; G 94 -U 124 ; WX 365 ; N bar ; G 95 -U 125 ; WX 712 ; N braceright ; G 96 -U 126 ; WX 838 ; N asciitilde ; G 97 -U 160 ; WX 348 ; N nbspace ; G 98 -U 161 ; WX 456 ; N exclamdown ; G 99 -U 162 ; WX 696 ; N cent ; G 100 -U 163 ; WX 696 ; N sterling ; G 101 -U 164 ; WX 636 ; N currency ; G 102 -U 165 ; WX 696 ; N yen ; G 103 -U 166 ; WX 365 ; N brokenbar ; G 104 -U 167 ; WX 500 ; N section ; G 105 -U 168 ; WX 500 ; N dieresis ; G 106 -U 169 ; WX 1000 ; N copyright ; G 107 -U 170 ; WX 564 ; N ordfeminine ; G 108 -U 171 ; WX 646 ; N guillemotleft ; G 109 -U 172 ; WX 838 ; N logicalnot ; G 110 -U 173 ; WX 415 ; N sfthyphen ; G 111 -U 174 ; WX 1000 ; N registered ; G 112 -U 175 ; WX 500 ; N macron ; G 113 -U 176 ; WX 500 ; N degree ; G 114 -U 177 ; WX 838 ; N plusminus ; G 115 -U 178 ; WX 438 ; N twosuperior ; G 116 -U 179 ; WX 438 ; N threesuperior ; G 117 -U 180 ; WX 500 ; N acute ; G 118 -U 181 ; WX 736 ; N mu ; G 119 -U 182 ; WX 636 ; N paragraph ; G 120 -U 183 ; WX 380 ; N periodcentered ; G 121 -U 184 ; WX 500 ; N cedilla ; G 122 -U 185 ; WX 438 ; N onesuperior ; G 123 -U 186 ; WX 564 ; N ordmasculine ; G 124 -U 187 ; WX 646 ; N guillemotright ; G 125 -U 188 ; WX 1035 ; N onequarter ; G 126 -U 189 ; WX 1035 ; N onehalf ; G 127 -U 190 ; WX 1035 ; N threequarters ; G 128 -U 191 ; WX 580 ; N questiondown ; G 129 -U 192 ; WX 774 ; N Agrave ; G 130 -U 193 ; WX 774 ; N Aacute ; G 131 -U 194 ; WX 774 ; N Acircumflex ; G 132 -U 195 ; WX 774 ; N Atilde ; G 133 -U 196 ; WX 774 ; N Adieresis ; G 134 -U 197 ; WX 774 ; N Aring ; G 135 -U 198 ; WX 1085 ; N AE ; G 136 -U 199 ; WX 734 ; N Ccedilla ; G 137 -U 200 ; WX 683 ; N Egrave ; G 138 -U 201 ; WX 683 ; N Eacute ; G 139 -U 202 ; WX 683 ; N Ecircumflex ; G 140 -U 203 ; WX 683 ; N Edieresis ; G 141 -U 204 ; WX 372 ; N Igrave ; G 142 -U 205 ; WX 372 ; N Iacute ; G 143 -U 206 ; WX 372 ; N Icircumflex ; G 144 -U 207 ; WX 372 ; N Idieresis ; G 145 -U 208 ; WX 838 ; N Eth ; G 146 -U 209 ; WX 837 ; N Ntilde ; G 147 -U 210 ; WX 850 ; N Ograve ; G 148 -U 211 ; WX 850 ; N Oacute ; G 149 -U 212 ; WX 850 ; N Ocircumflex ; G 150 -U 213 ; WX 850 ; N Otilde ; G 151 -U 214 ; WX 850 ; N Odieresis ; G 152 -U 215 ; WX 838 ; N multiply ; G 153 -U 216 ; WX 850 ; N Oslash ; G 154 -U 217 ; WX 812 ; N Ugrave ; G 155 -U 218 ; WX 812 ; N Uacute ; G 156 -U 219 ; WX 812 ; N Ucircumflex ; G 157 -U 220 ; WX 812 ; N Udieresis ; G 158 -U 221 ; WX 724 ; N Yacute ; G 159 -U 222 ; WX 738 ; N Thorn ; G 160 -U 223 ; WX 719 ; N germandbls ; G 161 -U 224 ; WX 675 ; N agrave ; G 162 -U 225 ; WX 675 ; N aacute ; G 163 -U 226 ; WX 675 ; N acircumflex ; G 164 -U 227 ; WX 675 ; N atilde ; G 165 -U 228 ; WX 675 ; N adieresis ; G 166 -U 229 ; WX 675 ; N aring ; G 167 -U 230 ; WX 1048 ; N ae ; G 168 -U 231 ; WX 593 ; N ccedilla ; G 169 -U 232 ; WX 678 ; N egrave ; G 170 -U 233 ; WX 678 ; N eacute ; G 171 -U 234 ; WX 678 ; N ecircumflex ; G 172 -U 235 ; WX 678 ; N edieresis ; G 173 -U 236 ; WX 343 ; N igrave ; G 174 -U 237 ; WX 343 ; N iacute ; G 175 -U 238 ; WX 343 ; N icircumflex ; G 176 -U 239 ; WX 343 ; N idieresis ; G 177 -U 240 ; WX 687 ; N eth ; G 178 -U 241 ; WX 712 ; N ntilde ; G 179 -U 242 ; WX 687 ; N ograve ; G 180 -U 243 ; WX 687 ; N oacute ; G 181 -U 244 ; WX 687 ; N ocircumflex ; G 182 -U 245 ; WX 687 ; N otilde ; G 183 -U 246 ; WX 687 ; N odieresis ; G 184 -U 247 ; WX 838 ; N divide ; G 185 -U 248 ; WX 687 ; N oslash ; G 186 -U 249 ; WX 712 ; N ugrave ; G 187 -U 250 ; WX 712 ; N uacute ; G 188 -U 251 ; WX 712 ; N ucircumflex ; G 189 -U 252 ; WX 712 ; N udieresis ; G 190 -U 253 ; WX 652 ; N yacute ; G 191 -U 254 ; WX 716 ; N thorn ; G 192 -U 255 ; WX 652 ; N ydieresis ; G 193 -U 256 ; WX 774 ; N Amacron ; G 194 -U 257 ; WX 675 ; N amacron ; G 195 -U 258 ; WX 774 ; N Abreve ; G 196 -U 259 ; WX 675 ; N abreve ; G 197 -U 260 ; WX 774 ; N Aogonek ; G 198 -U 261 ; WX 675 ; N aogonek ; G 199 -U 262 ; WX 734 ; N Cacute ; G 200 -U 263 ; WX 593 ; N cacute ; G 201 -U 264 ; WX 734 ; N Ccircumflex ; G 202 -U 265 ; WX 593 ; N ccircumflex ; G 203 -U 266 ; WX 734 ; N Cdotaccent ; G 204 -U 267 ; WX 593 ; N cdotaccent ; G 205 -U 268 ; WX 734 ; N Ccaron ; G 206 -U 269 ; WX 593 ; N ccaron ; G 207 -U 270 ; WX 830 ; N Dcaron ; G 208 -U 271 ; WX 716 ; N dcaron ; G 209 -U 272 ; WX 838 ; N Dcroat ; G 210 -U 273 ; WX 716 ; N dmacron ; G 211 -U 274 ; WX 683 ; N Emacron ; G 212 -U 275 ; WX 678 ; N emacron ; G 213 -U 276 ; WX 683 ; N Ebreve ; G 214 -U 277 ; WX 678 ; N ebreve ; G 215 -U 278 ; WX 683 ; N Edotaccent ; G 216 -U 279 ; WX 678 ; N edotaccent ; G 217 -U 280 ; WX 683 ; N Eogonek ; G 218 -U 281 ; WX 678 ; N eogonek ; G 219 -U 282 ; WX 683 ; N Ecaron ; G 220 -U 283 ; WX 678 ; N ecaron ; G 221 -U 284 ; WX 821 ; N Gcircumflex ; G 222 -U 285 ; WX 716 ; N gcircumflex ; G 223 -U 286 ; WX 821 ; N Gbreve ; G 224 -U 287 ; WX 716 ; N gbreve ; G 225 -U 288 ; WX 821 ; N Gdotaccent ; G 226 -U 289 ; WX 716 ; N gdotaccent ; G 227 -U 290 ; WX 821 ; N Gcommaaccent ; G 228 -U 291 ; WX 716 ; N gcommaaccent ; G 229 -U 292 ; WX 837 ; N Hcircumflex ; G 230 -U 293 ; WX 712 ; N hcircumflex ; G 231 -U 294 ; WX 974 ; N Hbar ; G 232 -U 295 ; WX 790 ; N hbar ; G 233 -U 296 ; WX 372 ; N Itilde ; G 234 -U 297 ; WX 343 ; N itilde ; G 235 -U 298 ; WX 372 ; N Imacron ; G 236 -U 299 ; WX 343 ; N imacron ; G 237 -U 300 ; WX 372 ; N Ibreve ; G 238 -U 301 ; WX 343 ; N ibreve ; G 239 -U 302 ; WX 372 ; N Iogonek ; G 240 -U 303 ; WX 343 ; N iogonek ; G 241 -U 304 ; WX 372 ; N Idot ; G 242 -U 305 ; WX 343 ; N dotlessi ; G 243 -U 306 ; WX 744 ; N IJ ; G 244 -U 307 ; WX 686 ; N ij ; G 245 -U 308 ; WX 372 ; N Jcircumflex ; G 246 -U 309 ; WX 343 ; N jcircumflex ; G 247 -U 310 ; WX 775 ; N Kcommaaccent ; G 248 -U 311 ; WX 665 ; N kcommaaccent ; G 249 -U 312 ; WX 665 ; N kgreenlandic ; G 250 -U 313 ; WX 637 ; N Lacute ; G 251 -U 314 ; WX 343 ; N lacute ; G 252 -U 315 ; WX 637 ; N Lcommaaccent ; G 253 -U 316 ; WX 343 ; N lcommaaccent ; G 254 -U 317 ; WX 637 ; N Lcaron ; G 255 -U 318 ; WX 479 ; N lcaron ; G 256 -U 319 ; WX 637 ; N Ldot ; G 257 -U 320 ; WX 557 ; N ldot ; G 258 -U 321 ; WX 642 ; N Lslash ; G 259 -U 322 ; WX 371 ; N lslash ; G 260 -U 323 ; WX 837 ; N Nacute ; G 261 -U 324 ; WX 712 ; N nacute ; G 262 -U 325 ; WX 837 ; N Ncommaaccent ; G 263 -U 326 ; WX 712 ; N ncommaaccent ; G 264 -U 327 ; WX 837 ; N Ncaron ; G 265 -U 328 ; WX 712 ; N ncaron ; G 266 -U 329 ; WX 983 ; N napostrophe ; G 267 -U 330 ; WX 837 ; N Eng ; G 268 -U 331 ; WX 712 ; N eng ; G 269 -U 332 ; WX 850 ; N Omacron ; G 270 -U 333 ; WX 687 ; N omacron ; G 271 -U 334 ; WX 850 ; N Obreve ; G 272 -U 335 ; WX 687 ; N obreve ; G 273 -U 336 ; WX 850 ; N Ohungarumlaut ; G 274 -U 337 ; WX 687 ; N ohungarumlaut ; G 275 -U 338 ; WX 1167 ; N OE ; G 276 -U 339 ; WX 1094 ; N oe ; G 277 -U 340 ; WX 770 ; N Racute ; G 278 -U 341 ; WX 493 ; N racute ; G 279 -U 342 ; WX 770 ; N Rcommaaccent ; G 280 -U 343 ; WX 493 ; N rcommaaccent ; G 281 -U 344 ; WX 770 ; N Rcaron ; G 282 -U 345 ; WX 493 ; N rcaron ; G 283 -U 346 ; WX 720 ; N Sacute ; G 284 -U 347 ; WX 595 ; N sacute ; G 285 -U 348 ; WX 720 ; N Scircumflex ; G 286 -U 349 ; WX 595 ; N scircumflex ; G 287 -U 350 ; WX 720 ; N Scedilla ; G 288 -U 351 ; WX 595 ; N scedilla ; G 289 -U 352 ; WX 720 ; N Scaron ; G 290 -U 353 ; WX 595 ; N scaron ; G 291 -U 354 ; WX 682 ; N Tcommaaccent ; G 292 -U 355 ; WX 478 ; N tcommaaccent ; G 293 -U 356 ; WX 682 ; N Tcaron ; G 294 -U 357 ; WX 478 ; N tcaron ; G 295 -U 358 ; WX 682 ; N Tbar ; G 296 -U 359 ; WX 478 ; N tbar ; G 297 -U 360 ; WX 812 ; N Utilde ; G 298 -U 361 ; WX 712 ; N utilde ; G 299 -U 362 ; WX 812 ; N Umacron ; G 300 -U 363 ; WX 712 ; N umacron ; G 301 -U 364 ; WX 812 ; N Ubreve ; G 302 -U 365 ; WX 712 ; N ubreve ; G 303 -U 366 ; WX 812 ; N Uring ; G 304 -U 367 ; WX 712 ; N uring ; G 305 -U 368 ; WX 812 ; N Uhungarumlaut ; G 306 -U 369 ; WX 712 ; N uhungarumlaut ; G 307 -U 370 ; WX 812 ; N Uogonek ; G 308 -U 371 ; WX 712 ; N uogonek ; G 309 -U 372 ; WX 1103 ; N Wcircumflex ; G 310 -U 373 ; WX 924 ; N wcircumflex ; G 311 -U 374 ; WX 724 ; N Ycircumflex ; G 312 -U 375 ; WX 652 ; N ycircumflex ; G 313 -U 376 ; WX 724 ; N Ydieresis ; G 314 -U 377 ; WX 725 ; N Zacute ; G 315 -U 378 ; WX 582 ; N zacute ; G 316 -U 379 ; WX 725 ; N Zdotaccent ; G 317 -U 380 ; WX 582 ; N zdotaccent ; G 318 -U 381 ; WX 725 ; N Zcaron ; G 319 -U 382 ; WX 582 ; N zcaron ; G 320 -U 383 ; WX 435 ; N longs ; G 321 -U 384 ; WX 716 ; N uni0180 ; G 322 -U 385 ; WX 811 ; N uni0181 ; G 323 -U 386 ; WX 762 ; N uni0182 ; G 324 -U 387 ; WX 716 ; N uni0183 ; G 325 -U 388 ; WX 762 ; N uni0184 ; G 326 -U 389 ; WX 716 ; N uni0185 ; G 327 -U 390 ; WX 734 ; N uni0186 ; G 328 -U 391 ; WX 734 ; N uni0187 ; G 329 -U 392 ; WX 593 ; N uni0188 ; G 330 -U 393 ; WX 838 ; N uni0189 ; G 331 -U 394 ; WX 879 ; N uni018A ; G 332 -U 395 ; WX 757 ; N uni018B ; G 333 -U 396 ; WX 716 ; N uni018C ; G 334 -U 397 ; WX 688 ; N uni018D ; G 335 -U 398 ; WX 683 ; N uni018E ; G 336 -U 399 ; WX 849 ; N uni018F ; G 337 -U 400 ; WX 696 ; N uni0190 ; G 338 -U 401 ; WX 683 ; N uni0191 ; G 339 -U 402 ; WX 435 ; N florin ; G 340 -U 403 ; WX 821 ; N uni0193 ; G 341 -U 404 ; WX 793 ; N uni0194 ; G 342 -U 405 ; WX 1045 ; N uni0195 ; G 343 -U 406 ; WX 436 ; N uni0196 ; G 344 -U 407 ; WX 389 ; N uni0197 ; G 345 -U 408 ; WX 775 ; N uni0198 ; G 346 -U 409 ; WX 665 ; N uni0199 ; G 347 -U 410 ; WX 360 ; N uni019A ; G 348 -U 411 ; WX 592 ; N uni019B ; G 349 -U 412 ; WX 1042 ; N uni019C ; G 350 -U 413 ; WX 837 ; N uni019D ; G 351 -U 414 ; WX 712 ; N uni019E ; G 352 -U 415 ; WX 850 ; N uni019F ; G 353 -U 416 ; WX 874 ; N Ohorn ; G 354 -U 417 ; WX 687 ; N ohorn ; G 355 -U 418 ; WX 1083 ; N uni01A2 ; G 356 -U 419 ; WX 912 ; N uni01A3 ; G 357 -U 420 ; WX 782 ; N uni01A4 ; G 358 -U 421 ; WX 716 ; N uni01A5 ; G 359 -U 422 ; WX 770 ; N uni01A6 ; G 360 -U 423 ; WX 720 ; N uni01A7 ; G 361 -U 424 ; WX 595 ; N uni01A8 ; G 362 -U 425 ; WX 683 ; N uni01A9 ; G 363 -U 426 ; WX 552 ; N uni01AA ; G 364 -U 427 ; WX 478 ; N uni01AB ; G 365 -U 428 ; WX 707 ; N uni01AC ; G 366 -U 429 ; WX 478 ; N uni01AD ; G 367 -U 430 ; WX 682 ; N uni01AE ; G 368 -U 431 ; WX 835 ; N Uhorn ; G 369 -U 432 ; WX 712 ; N uhorn ; G 370 -U 433 ; WX 850 ; N uni01B1 ; G 371 -U 434 ; WX 813 ; N uni01B2 ; G 372 -U 435 ; WX 797 ; N uni01B3 ; G 373 -U 436 ; WX 778 ; N uni01B4 ; G 374 -U 437 ; WX 725 ; N uni01B5 ; G 375 -U 438 ; WX 582 ; N uni01B6 ; G 376 -U 439 ; WX 772 ; N uni01B7 ; G 377 -U 440 ; WX 772 ; N uni01B8 ; G 378 -U 441 ; WX 641 ; N uni01B9 ; G 379 -U 442 ; WX 582 ; N uni01BA ; G 380 -U 443 ; WX 696 ; N uni01BB ; G 381 -U 444 ; WX 772 ; N uni01BC ; G 382 -U 445 ; WX 641 ; N uni01BD ; G 383 -U 446 ; WX 573 ; N uni01BE ; G 384 -U 447 ; WX 716 ; N uni01BF ; G 385 -U 448 ; WX 372 ; N uni01C0 ; G 386 -U 449 ; WX 659 ; N uni01C1 ; G 387 -U 450 ; WX 544 ; N uni01C2 ; G 388 -U 451 ; WX 372 ; N uni01C3 ; G 389 -U 452 ; WX 1555 ; N uni01C4 ; G 390 -U 453 ; WX 1412 ; N uni01C5 ; G 391 -U 454 ; WX 1298 ; N uni01C6 ; G 392 -U 455 ; WX 1009 ; N uni01C7 ; G 393 -U 456 ; WX 980 ; N uni01C8 ; G 394 -U 457 ; WX 686 ; N uni01C9 ; G 395 -U 458 ; WX 1209 ; N uni01CA ; G 396 -U 459 ; WX 1180 ; N uni01CB ; G 397 -U 460 ; WX 1055 ; N uni01CC ; G 398 -U 461 ; WX 774 ; N uni01CD ; G 399 -U 462 ; WX 675 ; N uni01CE ; G 400 -U 463 ; WX 372 ; N uni01CF ; G 401 -U 464 ; WX 343 ; N uni01D0 ; G 402 -U 465 ; WX 850 ; N uni01D1 ; G 403 -U 466 ; WX 687 ; N uni01D2 ; G 404 -U 467 ; WX 812 ; N uni01D3 ; G 405 -U 468 ; WX 712 ; N uni01D4 ; G 406 -U 469 ; WX 812 ; N uni01D5 ; G 407 -U 470 ; WX 712 ; N uni01D6 ; G 408 -U 471 ; WX 812 ; N uni01D7 ; G 409 -U 472 ; WX 712 ; N uni01D8 ; G 410 -U 473 ; WX 812 ; N uni01D9 ; G 411 -U 474 ; WX 712 ; N uni01DA ; G 412 -U 475 ; WX 812 ; N uni01DB ; G 413 -U 476 ; WX 712 ; N uni01DC ; G 414 -U 477 ; WX 678 ; N uni01DD ; G 415 -U 478 ; WX 774 ; N uni01DE ; G 416 -U 479 ; WX 675 ; N uni01DF ; G 417 -U 480 ; WX 774 ; N uni01E0 ; G 418 -U 481 ; WX 675 ; N uni01E1 ; G 419 -U 482 ; WX 1085 ; N uni01E2 ; G 420 -U 483 ; WX 1048 ; N uni01E3 ; G 421 -U 484 ; WX 821 ; N uni01E4 ; G 422 -U 485 ; WX 716 ; N uni01E5 ; G 423 -U 486 ; WX 821 ; N Gcaron ; G 424 -U 487 ; WX 716 ; N gcaron ; G 425 -U 488 ; WX 775 ; N uni01E8 ; G 426 -U 489 ; WX 665 ; N uni01E9 ; G 427 -U 490 ; WX 850 ; N uni01EA ; G 428 -U 491 ; WX 687 ; N uni01EB ; G 429 -U 492 ; WX 850 ; N uni01EC ; G 430 -U 493 ; WX 687 ; N uni01ED ; G 431 -U 494 ; WX 772 ; N uni01EE ; G 432 -U 495 ; WX 582 ; N uni01EF ; G 433 -U 496 ; WX 343 ; N uni01F0 ; G 434 -U 497 ; WX 1555 ; N uni01F1 ; G 435 -U 498 ; WX 1412 ; N uni01F2 ; G 436 -U 499 ; WX 1298 ; N uni01F3 ; G 437 -U 500 ; WX 821 ; N uni01F4 ; G 438 -U 501 ; WX 716 ; N uni01F5 ; G 439 -U 502 ; WX 1289 ; N uni01F6 ; G 440 -U 503 ; WX 787 ; N uni01F7 ; G 441 -U 504 ; WX 837 ; N uni01F8 ; G 442 -U 505 ; WX 712 ; N uni01F9 ; G 443 -U 506 ; WX 774 ; N Aringacute ; G 444 -U 507 ; WX 675 ; N aringacute ; G 445 -U 508 ; WX 1085 ; N AEacute ; G 446 -U 509 ; WX 1048 ; N aeacute ; G 447 -U 510 ; WX 850 ; N Oslashacute ; G 448 -U 511 ; WX 687 ; N oslashacute ; G 449 -U 512 ; WX 774 ; N uni0200 ; G 450 -U 513 ; WX 675 ; N uni0201 ; G 451 -U 514 ; WX 774 ; N uni0202 ; G 452 -U 515 ; WX 675 ; N uni0203 ; G 453 -U 516 ; WX 683 ; N uni0204 ; G 454 -U 517 ; WX 678 ; N uni0205 ; G 455 -U 518 ; WX 683 ; N uni0206 ; G 456 -U 519 ; WX 678 ; N uni0207 ; G 457 -U 520 ; WX 372 ; N uni0208 ; G 458 -U 521 ; WX 343 ; N uni0209 ; G 459 -U 522 ; WX 372 ; N uni020A ; G 460 -U 523 ; WX 343 ; N uni020B ; G 461 -U 524 ; WX 850 ; N uni020C ; G 462 -U 525 ; WX 687 ; N uni020D ; G 463 -U 526 ; WX 850 ; N uni020E ; G 464 -U 527 ; WX 687 ; N uni020F ; G 465 -U 528 ; WX 770 ; N uni0210 ; G 466 -U 529 ; WX 493 ; N uni0211 ; G 467 -U 530 ; WX 770 ; N uni0212 ; G 468 -U 531 ; WX 493 ; N uni0213 ; G 469 -U 532 ; WX 812 ; N uni0214 ; G 470 -U 533 ; WX 712 ; N uni0215 ; G 471 -U 534 ; WX 812 ; N uni0216 ; G 472 -U 535 ; WX 712 ; N uni0217 ; G 473 -U 536 ; WX 720 ; N Scommaaccent ; G 474 -U 537 ; WX 595 ; N scommaaccent ; G 475 -U 538 ; WX 682 ; N uni021A ; G 476 -U 539 ; WX 478 ; N uni021B ; G 477 -U 540 ; WX 690 ; N uni021C ; G 478 -U 541 ; WX 607 ; N uni021D ; G 479 -U 542 ; WX 837 ; N uni021E ; G 480 -U 543 ; WX 712 ; N uni021F ; G 481 -U 544 ; WX 837 ; N uni0220 ; G 482 -U 545 ; WX 865 ; N uni0221 ; G 483 -U 546 ; WX 809 ; N uni0222 ; G 484 -U 547 ; WX 659 ; N uni0223 ; G 485 -U 548 ; WX 725 ; N uni0224 ; G 486 -U 549 ; WX 582 ; N uni0225 ; G 487 -U 550 ; WX 774 ; N uni0226 ; G 488 -U 551 ; WX 675 ; N uni0227 ; G 489 -U 552 ; WX 683 ; N uni0228 ; G 490 -U 553 ; WX 678 ; N uni0229 ; G 491 -U 554 ; WX 850 ; N uni022A ; G 492 -U 555 ; WX 687 ; N uni022B ; G 493 -U 556 ; WX 850 ; N uni022C ; G 494 -U 557 ; WX 687 ; N uni022D ; G 495 -U 558 ; WX 850 ; N uni022E ; G 496 -U 559 ; WX 687 ; N uni022F ; G 497 -U 560 ; WX 850 ; N uni0230 ; G 498 -U 561 ; WX 687 ; N uni0231 ; G 499 -U 562 ; WX 724 ; N uni0232 ; G 500 -U 563 ; WX 652 ; N uni0233 ; G 501 -U 564 ; WX 492 ; N uni0234 ; G 502 -U 565 ; WX 867 ; N uni0235 ; G 503 -U 566 ; WX 512 ; N uni0236 ; G 504 -U 567 ; WX 343 ; N dotlessj ; G 505 -U 568 ; WX 1088 ; N uni0238 ; G 506 -U 569 ; WX 1088 ; N uni0239 ; G 507 -U 570 ; WX 774 ; N uni023A ; G 508 -U 571 ; WX 734 ; N uni023B ; G 509 -U 572 ; WX 593 ; N uni023C ; G 510 -U 573 ; WX 637 ; N uni023D ; G 511 -U 574 ; WX 682 ; N uni023E ; G 512 -U 575 ; WX 595 ; N uni023F ; G 513 -U 576 ; WX 582 ; N uni0240 ; G 514 -U 577 ; WX 782 ; N uni0241 ; G 515 -U 578 ; WX 614 ; N uni0242 ; G 516 -U 579 ; WX 762 ; N uni0243 ; G 517 -U 580 ; WX 812 ; N uni0244 ; G 518 -U 581 ; WX 774 ; N uni0245 ; G 519 -U 582 ; WX 683 ; N uni0246 ; G 520 -U 583 ; WX 678 ; N uni0247 ; G 521 -U 584 ; WX 372 ; N uni0248 ; G 522 -U 585 ; WX 343 ; N uni0249 ; G 523 -U 586 ; WX 860 ; N uni024A ; G 524 -U 587 ; WX 791 ; N uni024B ; G 525 -U 588 ; WX 770 ; N uni024C ; G 526 -U 589 ; WX 493 ; N uni024D ; G 527 -U 590 ; WX 724 ; N uni024E ; G 528 -U 591 ; WX 652 ; N uni024F ; G 529 -U 592 ; WX 675 ; N uni0250 ; G 530 -U 593 ; WX 716 ; N uni0251 ; G 531 -U 594 ; WX 716 ; N uni0252 ; G 532 -U 595 ; WX 716 ; N uni0253 ; G 533 -U 596 ; WX 593 ; N uni0254 ; G 534 -U 597 ; WX 593 ; N uni0255 ; G 535 -U 598 ; WX 717 ; N uni0256 ; G 536 -U 599 ; WX 792 ; N uni0257 ; G 537 -U 600 ; WX 678 ; N uni0258 ; G 538 -U 601 ; WX 678 ; N uni0259 ; G 539 -U 602 ; WX 876 ; N uni025A ; G 540 -U 603 ; WX 557 ; N uni025B ; G 541 -U 604 ; WX 545 ; N uni025C ; G 542 -U 605 ; WX 815 ; N uni025D ; G 543 -U 606 ; WX 731 ; N uni025E ; G 544 -U 607 ; WX 343 ; N uni025F ; G 545 -U 608 ; WX 792 ; N uni0260 ; G 546 -U 609 ; WX 716 ; N uni0261 ; G 547 -U 610 ; WX 627 ; N uni0262 ; G 548 -U 611 ; WX 644 ; N uni0263 ; G 549 -U 612 ; WX 635 ; N uni0264 ; G 550 -U 613 ; WX 712 ; N uni0265 ; G 551 -U 614 ; WX 712 ; N uni0266 ; G 552 -U 615 ; WX 712 ; N uni0267 ; G 553 -U 616 ; WX 545 ; N uni0268 ; G 554 -U 617 ; WX 440 ; N uni0269 ; G 555 -U 618 ; WX 545 ; N uni026A ; G 556 -U 619 ; WX 559 ; N uni026B ; G 557 -U 620 ; WX 693 ; N uni026C ; G 558 -U 621 ; WX 343 ; N uni026D ; G 559 -U 622 ; WX 841 ; N uni026E ; G 560 -U 623 ; WX 1042 ; N uni026F ; G 561 -U 624 ; WX 1042 ; N uni0270 ; G 562 -U 625 ; WX 1042 ; N uni0271 ; G 563 -U 626 ; WX 712 ; N uni0272 ; G 564 -U 627 ; WX 793 ; N uni0273 ; G 565 -U 628 ; WX 707 ; N uni0274 ; G 566 -U 629 ; WX 687 ; N uni0275 ; G 567 -U 630 ; WX 909 ; N uni0276 ; G 568 -U 631 ; WX 681 ; N uni0277 ; G 569 -U 632 ; WX 796 ; N uni0278 ; G 570 -U 633 ; WX 538 ; N uni0279 ; G 571 -U 634 ; WX 538 ; N uni027A ; G 572 -U 635 ; WX 650 ; N uni027B ; G 573 -U 636 ; WX 493 ; N uni027C ; G 574 -U 637 ; WX 493 ; N uni027D ; G 575 -U 638 ; WX 596 ; N uni027E ; G 576 -U 639 ; WX 596 ; N uni027F ; G 577 -U 640 ; WX 642 ; N uni0280 ; G 578 -U 641 ; WX 642 ; N uni0281 ; G 579 -U 642 ; WX 595 ; N uni0282 ; G 580 -U 643 ; WX 415 ; N uni0283 ; G 581 -U 644 ; WX 435 ; N uni0284 ; G 582 -U 645 ; WX 605 ; N uni0285 ; G 583 -U 646 ; WX 552 ; N uni0286 ; G 584 -U 647 ; WX 478 ; N uni0287 ; G 585 -U 648 ; WX 478 ; N uni0288 ; G 586 -U 649 ; WX 920 ; N uni0289 ; G 587 -U 650 ; WX 772 ; N uni028A ; G 588 -U 651 ; WX 670 ; N uni028B ; G 589 -U 652 ; WX 652 ; N uni028C ; G 590 -U 653 ; WX 924 ; N uni028D ; G 591 -U 654 ; WX 652 ; N uni028E ; G 592 -U 655 ; WX 724 ; N uni028F ; G 593 -U 656 ; WX 694 ; N uni0290 ; G 594 -U 657 ; WX 684 ; N uni0291 ; G 595 -U 658 ; WX 641 ; N uni0292 ; G 596 -U 659 ; WX 641 ; N uni0293 ; G 597 -U 660 ; WX 573 ; N uni0294 ; G 598 -U 661 ; WX 573 ; N uni0295 ; G 599 -U 662 ; WX 573 ; N uni0296 ; G 600 -U 663 ; WX 573 ; N uni0297 ; G 601 -U 664 ; WX 850 ; N uni0298 ; G 602 -U 665 ; WX 633 ; N uni0299 ; G 603 -U 666 ; WX 731 ; N uni029A ; G 604 -U 667 ; WX 685 ; N uni029B ; G 605 -U 668 ; WX 691 ; N uni029C ; G 606 -U 669 ; WX 343 ; N uni029D ; G 607 -U 670 ; WX 732 ; N uni029E ; G 608 -U 671 ; WX 539 ; N uni029F ; G 609 -U 672 ; WX 792 ; N uni02A0 ; G 610 -U 673 ; WX 573 ; N uni02A1 ; G 611 -U 674 ; WX 573 ; N uni02A2 ; G 612 -U 675 ; WX 1156 ; N uni02A3 ; G 613 -U 676 ; WX 1214 ; N uni02A4 ; G 614 -U 677 ; WX 1155 ; N uni02A5 ; G 615 -U 678 ; WX 975 ; N uni02A6 ; G 616 -U 679 ; WX 769 ; N uni02A7 ; G 617 -U 680 ; WX 929 ; N uni02A8 ; G 618 -U 681 ; WX 1026 ; N uni02A9 ; G 619 -U 682 ; WX 862 ; N uni02AA ; G 620 -U 683 ; WX 780 ; N uni02AB ; G 621 -U 684 ; WX 591 ; N uni02AC ; G 622 -U 685 ; WX 415 ; N uni02AD ; G 623 -U 686 ; WX 677 ; N uni02AE ; G 624 -U 687 ; WX 789 ; N uni02AF ; G 625 -U 688 ; WX 456 ; N uni02B0 ; G 626 -U 689 ; WX 456 ; N uni02B1 ; G 627 -U 690 ; WX 219 ; N uni02B2 ; G 628 -U 691 ; WX 315 ; N uni02B3 ; G 629 -U 692 ; WX 315 ; N uni02B4 ; G 630 -U 693 ; WX 315 ; N uni02B5 ; G 631 -U 694 ; WX 411 ; N uni02B6 ; G 632 -U 695 ; WX 591 ; N uni02B7 ; G 633 -U 696 ; WX 417 ; N uni02B8 ; G 634 -U 697 ; WX 302 ; N uni02B9 ; G 635 -U 698 ; WX 521 ; N uni02BA ; G 636 -U 699 ; WX 380 ; N uni02BB ; G 637 -U 700 ; WX 380 ; N uni02BC ; G 638 -U 701 ; WX 380 ; N uni02BD ; G 639 -U 702 ; WX 366 ; N uni02BE ; G 640 -U 703 ; WX 366 ; N uni02BF ; G 641 -U 704 ; WX 326 ; N uni02C0 ; G 642 -U 705 ; WX 326 ; N uni02C1 ; G 643 -U 706 ; WX 500 ; N uni02C2 ; G 644 -U 707 ; WX 500 ; N uni02C3 ; G 645 -U 708 ; WX 500 ; N uni02C4 ; G 646 -U 709 ; WX 500 ; N uni02C5 ; G 647 -U 710 ; WX 500 ; N circumflex ; G 648 -U 711 ; WX 500 ; N caron ; G 649 -U 712 ; WX 306 ; N uni02C8 ; G 650 -U 713 ; WX 500 ; N uni02C9 ; G 651 -U 714 ; WX 500 ; N uni02CA ; G 652 -U 715 ; WX 500 ; N uni02CB ; G 653 -U 716 ; WX 306 ; N uni02CC ; G 654 -U 717 ; WX 500 ; N uni02CD ; G 655 -U 718 ; WX 500 ; N uni02CE ; G 656 -U 719 ; WX 500 ; N uni02CF ; G 657 -U 720 ; WX 337 ; N uni02D0 ; G 658 -U 721 ; WX 337 ; N uni02D1 ; G 659 -U 722 ; WX 366 ; N uni02D2 ; G 660 -U 723 ; WX 366 ; N uni02D3 ; G 661 -U 724 ; WX 500 ; N uni02D4 ; G 662 -U 725 ; WX 500 ; N uni02D5 ; G 663 -U 726 ; WX 416 ; N uni02D6 ; G 664 -U 727 ; WX 328 ; N uni02D7 ; G 665 -U 728 ; WX 500 ; N breve ; G 666 -U 729 ; WX 500 ; N dotaccent ; G 667 -U 730 ; WX 500 ; N ring ; G 668 -U 731 ; WX 500 ; N ogonek ; G 669 -U 732 ; WX 500 ; N tilde ; G 670 -U 733 ; WX 500 ; N hungarumlaut ; G 671 -U 734 ; WX 351 ; N uni02DE ; G 672 -U 735 ; WX 500 ; N uni02DF ; G 673 -U 736 ; WX 412 ; N uni02E0 ; G 674 -U 737 ; WX 219 ; N uni02E1 ; G 675 -U 738 ; WX 381 ; N uni02E2 ; G 676 -U 739 ; WX 413 ; N uni02E3 ; G 677 -U 740 ; WX 326 ; N uni02E4 ; G 678 -U 741 ; WX 500 ; N uni02E5 ; G 679 -U 742 ; WX 500 ; N uni02E6 ; G 680 -U 743 ; WX 500 ; N uni02E7 ; G 681 -U 744 ; WX 500 ; N uni02E8 ; G 682 -U 745 ; WX 500 ; N uni02E9 ; G 683 -U 748 ; WX 500 ; N uni02EC ; G 684 -U 749 ; WX 500 ; N uni02ED ; G 685 -U 750 ; WX 657 ; N uni02EE ; G 686 -U 755 ; WX 500 ; N uni02F3 ; G 687 -U 759 ; WX 500 ; N uni02F7 ; G 688 -U 768 ; WX 0 ; N gravecomb ; G 689 -U 769 ; WX 0 ; N acutecomb ; G 690 -U 770 ; WX 0 ; N uni0302 ; G 691 -U 771 ; WX 0 ; N tildecomb ; G 692 -U 772 ; WX 0 ; N uni0304 ; G 693 -U 773 ; WX 0 ; N uni0305 ; G 694 -U 774 ; WX 0 ; N uni0306 ; G 695 -U 775 ; WX 0 ; N uni0307 ; G 696 -U 776 ; WX 0 ; N uni0308 ; G 697 -U 777 ; WX 0 ; N hookabovecomb ; G 698 -U 778 ; WX 0 ; N uni030A ; G 699 -U 779 ; WX 0 ; N uni030B ; G 700 -U 780 ; WX 0 ; N uni030C ; G 701 -U 781 ; WX 0 ; N uni030D ; G 702 -U 782 ; WX 0 ; N uni030E ; G 703 -U 783 ; WX 0 ; N uni030F ; G 704 -U 784 ; WX 0 ; N uni0310 ; G 705 -U 785 ; WX 0 ; N uni0311 ; G 706 -U 786 ; WX 0 ; N uni0312 ; G 707 -U 787 ; WX 0 ; N uni0313 ; G 708 -U 788 ; WX 0 ; N uni0314 ; G 709 -U 789 ; WX 0 ; N uni0315 ; G 710 -U 790 ; WX 0 ; N uni0316 ; G 711 -U 791 ; WX 0 ; N uni0317 ; G 712 -U 792 ; WX 0 ; N uni0318 ; G 713 -U 793 ; WX 0 ; N uni0319 ; G 714 -U 794 ; WX 0 ; N uni031A ; G 715 -U 795 ; WX 0 ; N uni031B ; G 716 -U 796 ; WX 0 ; N uni031C ; G 717 -U 797 ; WX 0 ; N uni031D ; G 718 -U 798 ; WX 0 ; N uni031E ; G 719 -U 799 ; WX 0 ; N uni031F ; G 720 -U 800 ; WX 0 ; N uni0320 ; G 721 -U 801 ; WX 0 ; N uni0321 ; G 722 -U 802 ; WX 0 ; N uni0322 ; G 723 -U 803 ; WX 0 ; N dotbelowcomb ; G 724 -U 804 ; WX 0 ; N uni0324 ; G 725 -U 805 ; WX 0 ; N uni0325 ; G 726 -U 806 ; WX 0 ; N uni0326 ; G 727 -U 807 ; WX 0 ; N uni0327 ; G 728 -U 808 ; WX 0 ; N uni0328 ; G 729 -U 809 ; WX 0 ; N uni0329 ; G 730 -U 810 ; WX 0 ; N uni032A ; G 731 -U 811 ; WX 0 ; N uni032B ; G 732 -U 812 ; WX 0 ; N uni032C ; G 733 -U 813 ; WX 0 ; N uni032D ; G 734 -U 814 ; WX 0 ; N uni032E ; G 735 -U 815 ; WX 0 ; N uni032F ; G 736 -U 816 ; WX 0 ; N uni0330 ; G 737 -U 817 ; WX 0 ; N uni0331 ; G 738 -U 818 ; WX 0 ; N uni0332 ; G 739 -U 819 ; WX 0 ; N uni0333 ; G 740 -U 820 ; WX 0 ; N uni0334 ; G 741 -U 821 ; WX 0 ; N uni0335 ; G 742 -U 822 ; WX 0 ; N uni0336 ; G 743 -U 823 ; WX 0 ; N uni0337 ; G 744 -U 824 ; WX 0 ; N uni0338 ; G 745 -U 825 ; WX 0 ; N uni0339 ; G 746 -U 826 ; WX 0 ; N uni033A ; G 747 -U 827 ; WX 0 ; N uni033B ; G 748 -U 828 ; WX 0 ; N uni033C ; G 749 -U 829 ; WX 0 ; N uni033D ; G 750 -U 830 ; WX 0 ; N uni033E ; G 751 -U 831 ; WX 0 ; N uni033F ; G 752 -U 832 ; WX 0 ; N uni0340 ; G 753 -U 833 ; WX 0 ; N uni0341 ; G 754 -U 834 ; WX 0 ; N uni0342 ; G 755 -U 835 ; WX 0 ; N uni0343 ; G 756 -U 836 ; WX 0 ; N uni0344 ; G 757 -U 837 ; WX 0 ; N uni0345 ; G 758 -U 838 ; WX 0 ; N uni0346 ; G 759 -U 839 ; WX 0 ; N uni0347 ; G 760 -U 840 ; WX 0 ; N uni0348 ; G 761 -U 841 ; WX 0 ; N uni0349 ; G 762 -U 842 ; WX 0 ; N uni034A ; G 763 -U 843 ; WX 0 ; N uni034B ; G 764 -U 844 ; WX 0 ; N uni034C ; G 765 -U 845 ; WX 0 ; N uni034D ; G 766 -U 846 ; WX 0 ; N uni034E ; G 767 -U 847 ; WX 0 ; N uni034F ; G 768 -U 849 ; WX 0 ; N uni0351 ; G 769 -U 850 ; WX 0 ; N uni0352 ; G 770 -U 851 ; WX 0 ; N uni0353 ; G 771 -U 855 ; WX 0 ; N uni0357 ; G 772 -U 856 ; WX 0 ; N uni0358 ; G 773 -U 858 ; WX 0 ; N uni035A ; G 774 -U 860 ; WX 0 ; N uni035C ; G 775 -U 861 ; WX 0 ; N uni035D ; G 776 -U 862 ; WX 0 ; N uni035E ; G 777 -U 863 ; WX 0 ; N uni035F ; G 778 -U 864 ; WX 0 ; N uni0360 ; G 779 -U 865 ; WX 0 ; N uni0361 ; G 780 -U 866 ; WX 0 ; N uni0362 ; G 781 -U 880 ; WX 698 ; N uni0370 ; G 782 -U 881 ; WX 565 ; N uni0371 ; G 783 -U 882 ; WX 1022 ; N uni0372 ; G 784 -U 883 ; WX 836 ; N uni0373 ; G 785 -U 884 ; WX 302 ; N uni0374 ; G 786 -U 885 ; WX 302 ; N uni0375 ; G 787 -U 886 ; WX 837 ; N uni0376 ; G 788 -U 887 ; WX 701 ; N uni0377 ; G 789 -U 890 ; WX 500 ; N uni037A ; G 790 -U 891 ; WX 593 ; N uni037B ; G 791 -U 892 ; WX 550 ; N uni037C ; G 792 -U 893 ; WX 549 ; N uni037D ; G 793 -U 894 ; WX 400 ; N uni037E ; G 794 -U 895 ; WX 372 ; N uni037F ; G 795 -U 900 ; WX 441 ; N tonos ; G 796 -U 901 ; WX 500 ; N dieresistonos ; G 797 -U 902 ; WX 797 ; N Alphatonos ; G 798 -U 903 ; WX 380 ; N anoteleia ; G 799 -U 904 ; WX 846 ; N Epsilontonos ; G 800 -U 905 ; WX 1009 ; N Etatonos ; G 801 -U 906 ; WX 563 ; N Iotatonos ; G 802 -U 908 ; WX 891 ; N Omicrontonos ; G 803 -U 910 ; WX 980 ; N Upsilontonos ; G 804 -U 911 ; WX 894 ; N Omegatonos ; G 805 -U 912 ; WX 390 ; N iotadieresistonos ; G 806 -U 913 ; WX 774 ; N Alpha ; G 807 -U 914 ; WX 762 ; N Beta ; G 808 -U 915 ; WX 637 ; N Gamma ; G 809 -U 916 ; WX 774 ; N uni0394 ; G 810 -U 917 ; WX 683 ; N Epsilon ; G 811 -U 918 ; WX 725 ; N Zeta ; G 812 -U 919 ; WX 837 ; N Eta ; G 813 -U 920 ; WX 850 ; N Theta ; G 814 -U 921 ; WX 372 ; N Iota ; G 815 -U 922 ; WX 775 ; N Kappa ; G 816 -U 923 ; WX 774 ; N Lambda ; G 817 -U 924 ; WX 995 ; N Mu ; G 818 -U 925 ; WX 837 ; N Nu ; G 819 -U 926 ; WX 632 ; N Xi ; G 820 -U 927 ; WX 850 ; N Omicron ; G 821 -U 928 ; WX 837 ; N Pi ; G 822 -U 929 ; WX 733 ; N Rho ; G 823 -U 931 ; WX 683 ; N Sigma ; G 824 -U 932 ; WX 682 ; N Tau ; G 825 -U 933 ; WX 724 ; N Upsilon ; G 826 -U 934 ; WX 850 ; N Phi ; G 827 -U 935 ; WX 771 ; N Chi ; G 828 -U 936 ; WX 850 ; N Psi ; G 829 -U 937 ; WX 850 ; N Omega ; G 830 -U 938 ; WX 372 ; N Iotadieresis ; G 831 -U 939 ; WX 724 ; N Upsilondieresis ; G 832 -U 940 ; WX 687 ; N alphatonos ; G 833 -U 941 ; WX 557 ; N epsilontonos ; G 834 -U 942 ; WX 712 ; N etatonos ; G 835 -U 943 ; WX 390 ; N iotatonos ; G 836 -U 944 ; WX 675 ; N upsilondieresistonos ; G 837 -U 945 ; WX 687 ; N alpha ; G 838 -U 946 ; WX 716 ; N beta ; G 839 -U 947 ; WX 681 ; N gamma ; G 840 -U 948 ; WX 687 ; N delta ; G 841 -U 949 ; WX 557 ; N epsilon ; G 842 -U 950 ; WX 591 ; N zeta ; G 843 -U 951 ; WX 712 ; N eta ; G 844 -U 952 ; WX 687 ; N theta ; G 845 -U 953 ; WX 390 ; N iota ; G 846 -U 954 ; WX 710 ; N kappa ; G 847 -U 955 ; WX 633 ; N lambda ; G 848 -U 956 ; WX 736 ; N uni03BC ; G 849 -U 957 ; WX 681 ; N nu ; G 850 -U 958 ; WX 591 ; N xi ; G 851 -U 959 ; WX 687 ; N omicron ; G 852 -U 960 ; WX 791 ; N pi ; G 853 -U 961 ; WX 716 ; N rho ; G 854 -U 962 ; WX 593 ; N sigma1 ; G 855 -U 963 ; WX 779 ; N sigma ; G 856 -U 964 ; WX 638 ; N tau ; G 857 -U 965 ; WX 675 ; N upsilon ; G 858 -U 966 ; WX 782 ; N phi ; G 859 -U 967 ; WX 645 ; N chi ; G 860 -U 968 ; WX 794 ; N psi ; G 861 -U 969 ; WX 869 ; N omega ; G 862 -U 970 ; WX 390 ; N iotadieresis ; G 863 -U 971 ; WX 675 ; N upsilondieresis ; G 864 -U 972 ; WX 687 ; N omicrontonos ; G 865 -U 973 ; WX 675 ; N upsilontonos ; G 866 -U 974 ; WX 869 ; N omegatonos ; G 867 -U 975 ; WX 775 ; N uni03CF ; G 868 -U 976 ; WX 651 ; N uni03D0 ; G 869 -U 977 ; WX 661 ; N theta1 ; G 870 -U 978 ; WX 746 ; N Upsilon1 ; G 871 -U 979 ; WX 981 ; N uni03D3 ; G 872 -U 980 ; WX 746 ; N uni03D4 ; G 873 -U 981 ; WX 796 ; N phi1 ; G 874 -U 982 ; WX 869 ; N omega1 ; G 875 -U 983 ; WX 744 ; N uni03D7 ; G 876 -U 984 ; WX 850 ; N uni03D8 ; G 877 -U 985 ; WX 687 ; N uni03D9 ; G 878 -U 986 ; WX 734 ; N uni03DA ; G 879 -U 987 ; WX 593 ; N uni03DB ; G 880 -U 988 ; WX 683 ; N uni03DC ; G 881 -U 989 ; WX 494 ; N uni03DD ; G 882 -U 990 ; WX 702 ; N uni03DE ; G 883 -U 991 ; WX 660 ; N uni03DF ; G 884 -U 992 ; WX 919 ; N uni03E0 ; G 885 -U 993 ; WX 627 ; N uni03E1 ; G 886 -U 994 ; WX 1093 ; N uni03E2 ; G 887 -U 995 ; WX 837 ; N uni03E3 ; G 888 -U 996 ; WX 832 ; N uni03E4 ; G 889 -U 997 ; WX 716 ; N uni03E5 ; G 890 -U 998 ; WX 928 ; N uni03E6 ; G 891 -U 999 ; WX 744 ; N uni03E7 ; G 892 -U 1000 ; WX 733 ; N uni03E8 ; G 893 -U 1001 ; WX 650 ; N uni03E9 ; G 894 -U 1002 ; WX 789 ; N uni03EA ; G 895 -U 1003 ; WX 671 ; N uni03EB ; G 896 -U 1004 ; WX 752 ; N uni03EC ; G 897 -U 1005 ; WX 716 ; N uni03ED ; G 898 -U 1006 ; WX 682 ; N uni03EE ; G 899 -U 1007 ; WX 590 ; N uni03EF ; G 900 -U 1008 ; WX 744 ; N uni03F0 ; G 901 -U 1009 ; WX 716 ; N uni03F1 ; G 902 -U 1010 ; WX 593 ; N uni03F2 ; G 903 -U 1011 ; WX 343 ; N uni03F3 ; G 904 -U 1012 ; WX 850 ; N uni03F4 ; G 905 -U 1013 ; WX 645 ; N uni03F5 ; G 906 -U 1014 ; WX 644 ; N uni03F6 ; G 907 -U 1015 ; WX 738 ; N uni03F7 ; G 908 -U 1016 ; WX 716 ; N uni03F8 ; G 909 -U 1017 ; WX 734 ; N uni03F9 ; G 910 -U 1018 ; WX 995 ; N uni03FA ; G 911 -U 1019 ; WX 732 ; N uni03FB ; G 912 -U 1020 ; WX 716 ; N uni03FC ; G 913 -U 1021 ; WX 698 ; N uni03FD ; G 914 -U 1022 ; WX 734 ; N uni03FE ; G 915 -U 1023 ; WX 698 ; N uni03FF ; G 916 -U 1024 ; WX 683 ; N uni0400 ; G 917 -U 1025 ; WX 683 ; N uni0401 ; G 918 -U 1026 ; WX 878 ; N uni0402 ; G 919 -U 1027 ; WX 637 ; N uni0403 ; G 920 -U 1028 ; WX 734 ; N uni0404 ; G 921 -U 1029 ; WX 720 ; N uni0405 ; G 922 -U 1030 ; WX 372 ; N uni0406 ; G 923 -U 1031 ; WX 372 ; N uni0407 ; G 924 -U 1032 ; WX 372 ; N uni0408 ; G 925 -U 1033 ; WX 1154 ; N uni0409 ; G 926 -U 1034 ; WX 1130 ; N uni040A ; G 927 -U 1035 ; WX 878 ; N uni040B ; G 928 -U 1036 ; WX 817 ; N uni040C ; G 929 -U 1037 ; WX 837 ; N uni040D ; G 930 -U 1038 ; WX 771 ; N uni040E ; G 931 -U 1039 ; WX 837 ; N uni040F ; G 932 -U 1040 ; WX 774 ; N uni0410 ; G 933 -U 1041 ; WX 762 ; N uni0411 ; G 934 -U 1042 ; WX 762 ; N uni0412 ; G 935 -U 1043 ; WX 637 ; N uni0413 ; G 936 -U 1044 ; WX 891 ; N uni0414 ; G 937 -U 1045 ; WX 683 ; N uni0415 ; G 938 -U 1046 ; WX 1224 ; N uni0416 ; G 939 -U 1047 ; WX 710 ; N uni0417 ; G 940 -U 1048 ; WX 837 ; N uni0418 ; G 941 -U 1049 ; WX 837 ; N uni0419 ; G 942 -U 1050 ; WX 817 ; N uni041A ; G 943 -U 1051 ; WX 831 ; N uni041B ; G 944 -U 1052 ; WX 995 ; N uni041C ; G 945 -U 1053 ; WX 837 ; N uni041D ; G 946 -U 1054 ; WX 850 ; N uni041E ; G 947 -U 1055 ; WX 837 ; N uni041F ; G 948 -U 1056 ; WX 733 ; N uni0420 ; G 949 -U 1057 ; WX 734 ; N uni0421 ; G 950 -U 1058 ; WX 682 ; N uni0422 ; G 951 -U 1059 ; WX 771 ; N uni0423 ; G 952 -U 1060 ; WX 992 ; N uni0424 ; G 953 -U 1061 ; WX 771 ; N uni0425 ; G 954 -U 1062 ; WX 928 ; N uni0426 ; G 955 -U 1063 ; WX 808 ; N uni0427 ; G 956 -U 1064 ; WX 1235 ; N uni0428 ; G 957 -U 1065 ; WX 1326 ; N uni0429 ; G 958 -U 1066 ; WX 939 ; N uni042A ; G 959 -U 1067 ; WX 1036 ; N uni042B ; G 960 -U 1068 ; WX 762 ; N uni042C ; G 961 -U 1069 ; WX 734 ; N uni042D ; G 962 -U 1070 ; WX 1174 ; N uni042E ; G 963 -U 1071 ; WX 770 ; N uni042F ; G 964 -U 1072 ; WX 675 ; N uni0430 ; G 965 -U 1073 ; WX 698 ; N uni0431 ; G 966 -U 1074 ; WX 633 ; N uni0432 ; G 967 -U 1075 ; WX 522 ; N uni0433 ; G 968 -U 1076 ; WX 808 ; N uni0434 ; G 969 -U 1077 ; WX 678 ; N uni0435 ; G 970 -U 1078 ; WX 995 ; N uni0436 ; G 971 -U 1079 ; WX 581 ; N uni0437 ; G 972 -U 1080 ; WX 701 ; N uni0438 ; G 973 -U 1081 ; WX 701 ; N uni0439 ; G 974 -U 1082 ; WX 679 ; N uni043A ; G 975 -U 1083 ; WX 732 ; N uni043B ; G 976 -U 1084 ; WX 817 ; N uni043C ; G 977 -U 1085 ; WX 691 ; N uni043D ; G 978 -U 1086 ; WX 687 ; N uni043E ; G 979 -U 1087 ; WX 691 ; N uni043F ; G 980 -U 1088 ; WX 716 ; N uni0440 ; G 981 -U 1089 ; WX 593 ; N uni0441 ; G 982 -U 1090 ; WX 580 ; N uni0442 ; G 983 -U 1091 ; WX 652 ; N uni0443 ; G 984 -U 1092 ; WX 992 ; N uni0444 ; G 985 -U 1093 ; WX 645 ; N uni0445 ; G 986 -U 1094 ; WX 741 ; N uni0446 ; G 987 -U 1095 ; WX 687 ; N uni0447 ; G 988 -U 1096 ; WX 1062 ; N uni0448 ; G 989 -U 1097 ; WX 1105 ; N uni0449 ; G 990 -U 1098 ; WX 751 ; N uni044A ; G 991 -U 1099 ; WX 904 ; N uni044B ; G 992 -U 1100 ; WX 632 ; N uni044C ; G 993 -U 1101 ; WX 593 ; N uni044D ; G 994 -U 1102 ; WX 972 ; N uni044E ; G 995 -U 1103 ; WX 642 ; N uni044F ; G 996 -U 1104 ; WX 678 ; N uni0450 ; G 997 -U 1105 ; WX 678 ; N uni0451 ; G 998 -U 1106 ; WX 714 ; N uni0452 ; G 999 -U 1107 ; WX 522 ; N uni0453 ; G 1000 -U 1108 ; WX 593 ; N uni0454 ; G 1001 -U 1109 ; WX 595 ; N uni0455 ; G 1002 -U 1110 ; WX 343 ; N uni0456 ; G 1003 -U 1111 ; WX 343 ; N uni0457 ; G 1004 -U 1112 ; WX 343 ; N uni0458 ; G 1005 -U 1113 ; WX 991 ; N uni0459 ; G 1006 -U 1114 ; WX 956 ; N uni045A ; G 1007 -U 1115 ; WX 734 ; N uni045B ; G 1008 -U 1116 ; WX 679 ; N uni045C ; G 1009 -U 1117 ; WX 701 ; N uni045D ; G 1010 -U 1118 ; WX 652 ; N uni045E ; G 1011 -U 1119 ; WX 691 ; N uni045F ; G 1012 -U 1120 ; WX 1093 ; N uni0460 ; G 1013 -U 1121 ; WX 869 ; N uni0461 ; G 1014 -U 1122 ; WX 840 ; N uni0462 ; G 1015 -U 1123 ; WX 736 ; N uni0463 ; G 1016 -U 1124 ; WX 1012 ; N uni0464 ; G 1017 -U 1125 ; WX 839 ; N uni0465 ; G 1018 -U 1126 ; WX 992 ; N uni0466 ; G 1019 -U 1127 ; WX 832 ; N uni0467 ; G 1020 -U 1128 ; WX 1358 ; N uni0468 ; G 1021 -U 1129 ; WX 1121 ; N uni0469 ; G 1022 -U 1130 ; WX 850 ; N uni046A ; G 1023 -U 1131 ; WX 687 ; N uni046B ; G 1024 -U 1132 ; WX 1236 ; N uni046C ; G 1025 -U 1133 ; WX 1007 ; N uni046D ; G 1026 -U 1134 ; WX 696 ; N uni046E ; G 1027 -U 1135 ; WX 557 ; N uni046F ; G 1028 -U 1136 ; WX 1075 ; N uni0470 ; G 1029 -U 1137 ; WX 1061 ; N uni0471 ; G 1030 -U 1138 ; WX 850 ; N uni0472 ; G 1031 -U 1139 ; WX 687 ; N uni0473 ; G 1032 -U 1140 ; WX 850 ; N uni0474 ; G 1033 -U 1141 ; WX 695 ; N uni0475 ; G 1034 -U 1142 ; WX 850 ; N uni0476 ; G 1035 -U 1143 ; WX 695 ; N uni0477 ; G 1036 -U 1144 ; WX 1148 ; N uni0478 ; G 1037 -U 1145 ; WX 1043 ; N uni0479 ; G 1038 -U 1146 ; WX 1074 ; N uni047A ; G 1039 -U 1147 ; WX 863 ; N uni047B ; G 1040 -U 1148 ; WX 1405 ; N uni047C ; G 1041 -U 1149 ; WX 1173 ; N uni047D ; G 1042 -U 1150 ; WX 1093 ; N uni047E ; G 1043 -U 1151 ; WX 869 ; N uni047F ; G 1044 -U 1152 ; WX 734 ; N uni0480 ; G 1045 -U 1153 ; WX 593 ; N uni0481 ; G 1046 -U 1154 ; WX 652 ; N uni0482 ; G 1047 -U 1155 ; WX 0 ; N uni0483 ; G 1048 -U 1156 ; WX 0 ; N uni0484 ; G 1049 -U 1157 ; WX 0 ; N uni0485 ; G 1050 -U 1158 ; WX 0 ; N uni0486 ; G 1051 -U 1159 ; WX 0 ; N uni0487 ; G 1052 -U 1160 ; WX 418 ; N uni0488 ; G 1053 -U 1161 ; WX 418 ; N uni0489 ; G 1054 -U 1162 ; WX 957 ; N uni048A ; G 1055 -U 1163 ; WX 807 ; N uni048B ; G 1056 -U 1164 ; WX 762 ; N uni048C ; G 1057 -U 1165 ; WX 611 ; N uni048D ; G 1058 -U 1166 ; WX 733 ; N uni048E ; G 1059 -U 1167 ; WX 716 ; N uni048F ; G 1060 -U 1168 ; WX 637 ; N uni0490 ; G 1061 -U 1169 ; WX 522 ; N uni0491 ; G 1062 -U 1170 ; WX 666 ; N uni0492 ; G 1063 -U 1171 ; WX 543 ; N uni0493 ; G 1064 -U 1172 ; WX 808 ; N uni0494 ; G 1065 -U 1173 ; WX 669 ; N uni0495 ; G 1066 -U 1174 ; WX 1224 ; N uni0496 ; G 1067 -U 1175 ; WX 995 ; N uni0497 ; G 1068 -U 1176 ; WX 710 ; N uni0498 ; G 1069 -U 1177 ; WX 581 ; N uni0499 ; G 1070 -U 1178 ; WX 775 ; N uni049A ; G 1071 -U 1179 ; WX 679 ; N uni049B ; G 1072 -U 1180 ; WX 817 ; N uni049C ; G 1073 -U 1181 ; WX 679 ; N uni049D ; G 1074 -U 1182 ; WX 817 ; N uni049E ; G 1075 -U 1183 ; WX 679 ; N uni049F ; G 1076 -U 1184 ; WX 1015 ; N uni04A0 ; G 1077 -U 1185 ; WX 826 ; N uni04A1 ; G 1078 -U 1186 ; WX 956 ; N uni04A2 ; G 1079 -U 1187 ; WX 808 ; N uni04A3 ; G 1080 -U 1188 ; WX 1103 ; N uni04A4 ; G 1081 -U 1189 ; WX 874 ; N uni04A5 ; G 1082 -U 1190 ; WX 1273 ; N uni04A6 ; G 1083 -U 1191 ; WX 1017 ; N uni04A7 ; G 1084 -U 1192 ; WX 952 ; N uni04A8 ; G 1085 -U 1193 ; WX 858 ; N uni04A9 ; G 1086 -U 1194 ; WX 734 ; N uni04AA ; G 1087 -U 1195 ; WX 593 ; N uni04AB ; G 1088 -U 1196 ; WX 682 ; N uni04AC ; G 1089 -U 1197 ; WX 580 ; N uni04AD ; G 1090 -U 1198 ; WX 724 ; N uni04AE ; G 1091 -U 1199 ; WX 652 ; N uni04AF ; G 1092 -U 1200 ; WX 724 ; N uni04B0 ; G 1093 -U 1201 ; WX 652 ; N uni04B1 ; G 1094 -U 1202 ; WX 771 ; N uni04B2 ; G 1095 -U 1203 ; WX 645 ; N uni04B3 ; G 1096 -U 1204 ; WX 1112 ; N uni04B4 ; G 1097 -U 1205 ; WX 1000 ; N uni04B5 ; G 1098 -U 1206 ; WX 808 ; N uni04B6 ; G 1099 -U 1207 ; WX 687 ; N uni04B7 ; G 1100 -U 1208 ; WX 808 ; N uni04B8 ; G 1101 -U 1209 ; WX 687 ; N uni04B9 ; G 1102 -U 1210 ; WX 808 ; N uni04BA ; G 1103 -U 1211 ; WX 712 ; N uni04BB ; G 1104 -U 1212 ; WX 1026 ; N uni04BC ; G 1105 -U 1213 ; WX 810 ; N uni04BD ; G 1106 -U 1214 ; WX 1026 ; N uni04BE ; G 1107 -U 1215 ; WX 810 ; N uni04BF ; G 1108 -U 1216 ; WX 372 ; N uni04C0 ; G 1109 -U 1217 ; WX 1224 ; N uni04C1 ; G 1110 -U 1218 ; WX 995 ; N uni04C2 ; G 1111 -U 1219 ; WX 775 ; N uni04C3 ; G 1112 -U 1220 ; WX 630 ; N uni04C4 ; G 1113 -U 1221 ; WX 951 ; N uni04C5 ; G 1114 -U 1222 ; WX 805 ; N uni04C6 ; G 1115 -U 1223 ; WX 837 ; N uni04C7 ; G 1116 -U 1224 ; WX 691 ; N uni04C8 ; G 1117 -U 1225 ; WX 957 ; N uni04C9 ; G 1118 -U 1226 ; WX 807 ; N uni04CA ; G 1119 -U 1227 ; WX 808 ; N uni04CB ; G 1120 -U 1228 ; WX 687 ; N uni04CC ; G 1121 -U 1229 ; WX 1115 ; N uni04CD ; G 1122 -U 1230 ; WX 933 ; N uni04CE ; G 1123 -U 1231 ; WX 343 ; N uni04CF ; G 1124 -U 1232 ; WX 774 ; N uni04D0 ; G 1125 -U 1233 ; WX 675 ; N uni04D1 ; G 1126 -U 1234 ; WX 774 ; N uni04D2 ; G 1127 -U 1235 ; WX 675 ; N uni04D3 ; G 1128 -U 1236 ; WX 1085 ; N uni04D4 ; G 1129 -U 1237 ; WX 1048 ; N uni04D5 ; G 1130 -U 1238 ; WX 683 ; N uni04D6 ; G 1131 -U 1239 ; WX 678 ; N uni04D7 ; G 1132 -U 1240 ; WX 849 ; N uni04D8 ; G 1133 -U 1241 ; WX 678 ; N uni04D9 ; G 1134 -U 1242 ; WX 849 ; N uni04DA ; G 1135 -U 1243 ; WX 678 ; N uni04DB ; G 1136 -U 1244 ; WX 1224 ; N uni04DC ; G 1137 -U 1245 ; WX 995 ; N uni04DD ; G 1138 -U 1246 ; WX 710 ; N uni04DE ; G 1139 -U 1247 ; WX 581 ; N uni04DF ; G 1140 -U 1248 ; WX 772 ; N uni04E0 ; G 1141 -U 1249 ; WX 641 ; N uni04E1 ; G 1142 -U 1250 ; WX 837 ; N uni04E2 ; G 1143 -U 1251 ; WX 701 ; N uni04E3 ; G 1144 -U 1252 ; WX 837 ; N uni04E4 ; G 1145 -U 1253 ; WX 701 ; N uni04E5 ; G 1146 -U 1254 ; WX 850 ; N uni04E6 ; G 1147 -U 1255 ; WX 687 ; N uni04E7 ; G 1148 -U 1256 ; WX 850 ; N uni04E8 ; G 1149 -U 1257 ; WX 687 ; N uni04E9 ; G 1150 -U 1258 ; WX 850 ; N uni04EA ; G 1151 -U 1259 ; WX 687 ; N uni04EB ; G 1152 -U 1260 ; WX 734 ; N uni04EC ; G 1153 -U 1261 ; WX 593 ; N uni04ED ; G 1154 -U 1262 ; WX 771 ; N uni04EE ; G 1155 -U 1263 ; WX 652 ; N uni04EF ; G 1156 -U 1264 ; WX 771 ; N uni04F0 ; G 1157 -U 1265 ; WX 652 ; N uni04F1 ; G 1158 -U 1266 ; WX 771 ; N uni04F2 ; G 1159 -U 1267 ; WX 652 ; N uni04F3 ; G 1160 -U 1268 ; WX 808 ; N uni04F4 ; G 1161 -U 1269 ; WX 687 ; N uni04F5 ; G 1162 -U 1270 ; WX 637 ; N uni04F6 ; G 1163 -U 1271 ; WX 522 ; N uni04F7 ; G 1164 -U 1272 ; WX 1036 ; N uni04F8 ; G 1165 -U 1273 ; WX 904 ; N uni04F9 ; G 1166 -U 1274 ; WX 666 ; N uni04FA ; G 1167 -U 1275 ; WX 543 ; N uni04FB ; G 1168 -U 1276 ; WX 771 ; N uni04FC ; G 1169 -U 1277 ; WX 645 ; N uni04FD ; G 1170 -U 1278 ; WX 771 ; N uni04FE ; G 1171 -U 1279 ; WX 645 ; N uni04FF ; G 1172 -U 1280 ; WX 762 ; N uni0500 ; G 1173 -U 1281 ; WX 608 ; N uni0501 ; G 1174 -U 1282 ; WX 1159 ; N uni0502 ; G 1175 -U 1283 ; WX 893 ; N uni0503 ; G 1176 -U 1284 ; WX 1119 ; N uni0504 ; G 1177 -U 1285 ; WX 920 ; N uni0505 ; G 1178 -U 1286 ; WX 828 ; N uni0506 ; G 1179 -U 1287 ; WX 693 ; N uni0507 ; G 1180 -U 1288 ; WX 1242 ; N uni0508 ; G 1181 -U 1289 ; WX 1017 ; N uni0509 ; G 1182 -U 1290 ; WX 1289 ; N uni050A ; G 1183 -U 1291 ; WX 1013 ; N uni050B ; G 1184 -U 1292 ; WX 839 ; N uni050C ; G 1185 -U 1293 ; WX 638 ; N uni050D ; G 1186 -U 1294 ; WX 938 ; N uni050E ; G 1187 -U 1295 ; WX 803 ; N uni050F ; G 1188 -U 1296 ; WX 696 ; N uni0510 ; G 1189 -U 1297 ; WX 557 ; N uni0511 ; G 1190 -U 1298 ; WX 831 ; N uni0512 ; G 1191 -U 1299 ; WX 732 ; N uni0513 ; G 1192 -U 1300 ; WX 1286 ; N uni0514 ; G 1193 -U 1301 ; WX 1068 ; N uni0515 ; G 1194 -U 1302 ; WX 1065 ; N uni0516 ; G 1195 -U 1303 ; WX 979 ; N uni0517 ; G 1196 -U 1304 ; WX 1082 ; N uni0518 ; G 1197 -U 1305 ; WX 1013 ; N uni0519 ; G 1198 -U 1306 ; WX 850 ; N uni051A ; G 1199 -U 1307 ; WX 716 ; N uni051B ; G 1200 -U 1308 ; WX 1103 ; N uni051C ; G 1201 -U 1309 ; WX 924 ; N uni051D ; G 1202 -U 1310 ; WX 817 ; N uni051E ; G 1203 -U 1311 ; WX 679 ; N uni051F ; G 1204 -U 1312 ; WX 1267 ; N uni0520 ; G 1205 -U 1313 ; WX 1059 ; N uni0521 ; G 1206 -U 1314 ; WX 1273 ; N uni0522 ; G 1207 -U 1315 ; WX 1017 ; N uni0523 ; G 1208 -U 1316 ; WX 957 ; N uni0524 ; G 1209 -U 1317 ; WX 807 ; N uni0525 ; G 1210 -U 1329 ; WX 813 ; N uni0531 ; G 1211 -U 1330 ; WX 729 ; N uni0532 ; G 1212 -U 1331 ; WX 728 ; N uni0533 ; G 1213 -U 1332 ; WX 731 ; N uni0534 ; G 1214 -U 1333 ; WX 729 ; N uni0535 ; G 1215 -U 1334 ; WX 733 ; N uni0536 ; G 1216 -U 1335 ; WX 652 ; N uni0537 ; G 1217 -U 1336 ; WX 720 ; N uni0538 ; G 1218 -U 1337 ; WX 903 ; N uni0539 ; G 1219 -U 1338 ; WX 728 ; N uni053A ; G 1220 -U 1339 ; WX 666 ; N uni053B ; G 1221 -U 1340 ; WX 558 ; N uni053C ; G 1222 -U 1341 ; WX 961 ; N uni053D ; G 1223 -U 1342 ; WX 788 ; N uni053E ; G 1224 -U 1343 ; WX 713 ; N uni053F ; G 1225 -U 1344 ; WX 651 ; N uni0540 ; G 1226 -U 1345 ; WX 730 ; N uni0541 ; G 1227 -U 1346 ; WX 715 ; N uni0542 ; G 1228 -U 1347 ; WX 704 ; N uni0543 ; G 1229 -U 1348 ; WX 780 ; N uni0544 ; G 1230 -U 1349 ; WX 689 ; N uni0545 ; G 1231 -U 1350 ; WX 715 ; N uni0546 ; G 1232 -U 1351 ; WX 708 ; N uni0547 ; G 1233 -U 1352 ; WX 731 ; N uni0548 ; G 1234 -U 1353 ; WX 677 ; N uni0549 ; G 1235 -U 1354 ; WX 867 ; N uni054A ; G 1236 -U 1355 ; WX 711 ; N uni054B ; G 1237 -U 1356 ; WX 780 ; N uni054C ; G 1238 -U 1357 ; WX 731 ; N uni054D ; G 1239 -U 1358 ; WX 715 ; N uni054E ; G 1240 -U 1359 ; WX 693 ; N uni054F ; G 1241 -U 1360 ; WX 666 ; N uni0550 ; G 1242 -U 1361 ; WX 698 ; N uni0551 ; G 1243 -U 1362 ; WX 576 ; N uni0552 ; G 1244 -U 1363 ; WX 833 ; N uni0553 ; G 1245 -U 1364 ; WX 698 ; N uni0554 ; G 1246 -U 1365 ; WX 763 ; N uni0555 ; G 1247 -U 1366 ; WX 855 ; N uni0556 ; G 1248 -U 1369 ; WX 330 ; N uni0559 ; G 1249 -U 1370 ; WX 342 ; N uni055A ; G 1250 -U 1371 ; WX 308 ; N uni055B ; G 1251 -U 1372 ; WX 374 ; N uni055C ; G 1252 -U 1373 ; WX 313 ; N uni055D ; G 1253 -U 1374 ; WX 461 ; N uni055E ; G 1254 -U 1375 ; WX 468 ; N uni055F ; G 1255 -U 1377 ; WX 938 ; N uni0561 ; G 1256 -U 1378 ; WX 642 ; N uni0562 ; G 1257 -U 1379 ; WX 704 ; N uni0563 ; G 1258 -U 1380 ; WX 708 ; N uni0564 ; G 1259 -U 1381 ; WX 642 ; N uni0565 ; G 1260 -U 1382 ; WX 644 ; N uni0566 ; G 1261 -U 1383 ; WX 565 ; N uni0567 ; G 1262 -U 1384 ; WX 642 ; N uni0568 ; G 1263 -U 1385 ; WX 756 ; N uni0569 ; G 1264 -U 1386 ; WX 704 ; N uni056A ; G 1265 -U 1387 ; WX 643 ; N uni056B ; G 1266 -U 1388 ; WX 310 ; N uni056C ; G 1267 -U 1389 ; WX 984 ; N uni056D ; G 1268 -U 1390 ; WX 638 ; N uni056E ; G 1269 -U 1391 ; WX 643 ; N uni056F ; G 1270 -U 1392 ; WX 643 ; N uni0570 ; G 1271 -U 1393 ; WX 603 ; N uni0571 ; G 1272 -U 1394 ; WX 643 ; N uni0572 ; G 1273 -U 1395 ; WX 642 ; N uni0573 ; G 1274 -U 1396 ; WX 643 ; N uni0574 ; G 1275 -U 1397 ; WX 309 ; N uni0575 ; G 1276 -U 1398 ; WX 643 ; N uni0576 ; G 1277 -U 1399 ; WX 486 ; N uni0577 ; G 1278 -U 1400 ; WX 643 ; N uni0578 ; G 1279 -U 1401 ; WX 366 ; N uni0579 ; G 1280 -U 1402 ; WX 938 ; N uni057A ; G 1281 -U 1403 ; WX 573 ; N uni057B ; G 1282 -U 1404 ; WX 666 ; N uni057C ; G 1283 -U 1405 ; WX 643 ; N uni057D ; G 1284 -U 1406 ; WX 643 ; N uni057E ; G 1285 -U 1407 ; WX 934 ; N uni057F ; G 1286 -U 1408 ; WX 643 ; N uni0580 ; G 1287 -U 1409 ; WX 643 ; N uni0581 ; G 1288 -U 1410 ; WX 479 ; N uni0582 ; G 1289 -U 1411 ; WX 934 ; N uni0583 ; G 1290 -U 1412 ; WX 648 ; N uni0584 ; G 1291 -U 1413 ; WX 620 ; N uni0585 ; G 1292 -U 1414 ; WX 813 ; N uni0586 ; G 1293 -U 1415 ; WX 812 ; N uni0587 ; G 1294 -U 1417 ; WX 360 ; N uni0589 ; G 1295 -U 1418 ; WX 374 ; N uni058A ; G 1296 -U 1456 ; WX 0 ; N uni05B0 ; G 1297 -U 1457 ; WX 0 ; N uni05B1 ; G 1298 -U 1458 ; WX 0 ; N uni05B2 ; G 1299 -U 1459 ; WX 0 ; N uni05B3 ; G 1300 -U 1460 ; WX 0 ; N uni05B4 ; G 1301 -U 1461 ; WX 0 ; N uni05B5 ; G 1302 -U 1462 ; WX 0 ; N uni05B6 ; G 1303 -U 1463 ; WX 0 ; N uni05B7 ; G 1304 -U 1464 ; WX 0 ; N uni05B8 ; G 1305 -U 1465 ; WX 0 ; N uni05B9 ; G 1306 -U 1466 ; WX 0 ; N uni05BA ; G 1307 -U 1467 ; WX 0 ; N uni05BB ; G 1308 -U 1468 ; WX 0 ; N uni05BC ; G 1309 -U 1469 ; WX 0 ; N uni05BD ; G 1310 -U 1470 ; WX 415 ; N uni05BE ; G 1311 -U 1471 ; WX 0 ; N uni05BF ; G 1312 -U 1472 ; WX 372 ; N uni05C0 ; G 1313 -U 1473 ; WX 0 ; N uni05C1 ; G 1314 -U 1474 ; WX 0 ; N uni05C2 ; G 1315 -U 1475 ; WX 372 ; N uni05C3 ; G 1316 -U 1478 ; WX 497 ; N uni05C6 ; G 1317 -U 1479 ; WX 0 ; N uni05C7 ; G 1318 -U 1488 ; WX 728 ; N uni05D0 ; G 1319 -U 1489 ; WX 610 ; N uni05D1 ; G 1320 -U 1490 ; WX 447 ; N uni05D2 ; G 1321 -U 1491 ; WX 588 ; N uni05D3 ; G 1322 -U 1492 ; WX 687 ; N uni05D4 ; G 1323 -U 1493 ; WX 343 ; N uni05D5 ; G 1324 -U 1494 ; WX 400 ; N uni05D6 ; G 1325 -U 1495 ; WX 687 ; N uni05D7 ; G 1326 -U 1496 ; WX 679 ; N uni05D8 ; G 1327 -U 1497 ; WX 294 ; N uni05D9 ; G 1328 -U 1498 ; WX 578 ; N uni05DA ; G 1329 -U 1499 ; WX 566 ; N uni05DB ; G 1330 -U 1500 ; WX 605 ; N uni05DC ; G 1331 -U 1501 ; WX 696 ; N uni05DD ; G 1332 -U 1502 ; WX 724 ; N uni05DE ; G 1333 -U 1503 ; WX 343 ; N uni05DF ; G 1334 -U 1504 ; WX 453 ; N uni05E0 ; G 1335 -U 1505 ; WX 680 ; N uni05E1 ; G 1336 -U 1506 ; WX 666 ; N uni05E2 ; G 1337 -U 1507 ; WX 675 ; N uni05E3 ; G 1338 -U 1508 ; WX 658 ; N uni05E4 ; G 1339 -U 1509 ; WX 661 ; N uni05E5 ; G 1340 -U 1510 ; WX 653 ; N uni05E6 ; G 1341 -U 1511 ; WX 736 ; N uni05E7 ; G 1342 -U 1512 ; WX 602 ; N uni05E8 ; G 1343 -U 1513 ; WX 758 ; N uni05E9 ; G 1344 -U 1514 ; WX 683 ; N uni05EA ; G 1345 -U 1520 ; WX 664 ; N uni05F0 ; G 1346 -U 1521 ; WX 567 ; N uni05F1 ; G 1347 -U 1522 ; WX 519 ; N uni05F2 ; G 1348 -U 1523 ; WX 444 ; N uni05F3 ; G 1349 -U 1524 ; WX 710 ; N uni05F4 ; G 1350 -U 1542 ; WX 667 ; N uni0606 ; G 1351 -U 1543 ; WX 667 ; N uni0607 ; G 1352 -U 1545 ; WX 884 ; N uni0609 ; G 1353 -U 1546 ; WX 1157 ; N uni060A ; G 1354 -U 1548 ; WX 380 ; N uni060C ; G 1355 -U 1557 ; WX 0 ; N uni0615 ; G 1356 -U 1563 ; WX 400 ; N uni061B ; G 1357 -U 1567 ; WX 580 ; N uni061F ; G 1358 -U 1569 ; WX 511 ; N uni0621 ; G 1359 -U 1570 ; WX 343 ; N uni0622 ; G 1360 -U 1571 ; WX 343 ; N uni0623 ; G 1361 -U 1572 ; WX 622 ; N uni0624 ; G 1362 -U 1573 ; WX 343 ; N uni0625 ; G 1363 -U 1574 ; WX 917 ; N uni0626 ; G 1364 -U 1575 ; WX 343 ; N uni0627 ; G 1365 -U 1576 ; WX 1005 ; N uni0628 ; G 1366 -U 1577 ; WX 590 ; N uni0629 ; G 1367 -U 1578 ; WX 1005 ; N uni062A ; G 1368 -U 1579 ; WX 1005 ; N uni062B ; G 1369 -U 1580 ; WX 721 ; N uni062C ; G 1370 -U 1581 ; WX 721 ; N uni062D ; G 1371 -U 1582 ; WX 721 ; N uni062E ; G 1372 -U 1583 ; WX 513 ; N uni062F ; G 1373 -U 1584 ; WX 513 ; N uni0630 ; G 1374 -U 1585 ; WX 576 ; N uni0631 ; G 1375 -U 1586 ; WX 576 ; N uni0632 ; G 1376 -U 1587 ; WX 1380 ; N uni0633 ; G 1377 -U 1588 ; WX 1380 ; N uni0634 ; G 1378 -U 1589 ; WX 1345 ; N uni0635 ; G 1379 -U 1590 ; WX 1345 ; N uni0636 ; G 1380 -U 1591 ; WX 1039 ; N uni0637 ; G 1381 -U 1592 ; WX 1039 ; N uni0638 ; G 1382 -U 1593 ; WX 683 ; N uni0639 ; G 1383 -U 1594 ; WX 683 ; N uni063A ; G 1384 -U 1600 ; WX 342 ; N uni0640 ; G 1385 -U 1601 ; WX 1162 ; N uni0641 ; G 1386 -U 1602 ; WX 894 ; N uni0642 ; G 1387 -U 1603 ; WX 917 ; N uni0643 ; G 1388 -U 1604 ; WX 868 ; N uni0644 ; G 1389 -U 1605 ; WX 733 ; N uni0645 ; G 1390 -U 1606 ; WX 854 ; N uni0646 ; G 1391 -U 1607 ; WX 590 ; N uni0647 ; G 1392 -U 1608 ; WX 622 ; N uni0648 ; G 1393 -U 1609 ; WX 917 ; N uni0649 ; G 1394 -U 1610 ; WX 917 ; N uni064A ; G 1395 -U 1611 ; WX 0 ; N uni064B ; G 1396 -U 1612 ; WX 0 ; N uni064C ; G 1397 -U 1613 ; WX 0 ; N uni064D ; G 1398 -U 1614 ; WX 0 ; N uni064E ; G 1399 -U 1615 ; WX 0 ; N uni064F ; G 1400 -U 1616 ; WX 0 ; N uni0650 ; G 1401 -U 1617 ; WX 0 ; N uni0651 ; G 1402 -U 1618 ; WX 0 ; N uni0652 ; G 1403 -U 1619 ; WX 0 ; N uni0653 ; G 1404 -U 1620 ; WX 0 ; N uni0654 ; G 1405 -U 1621 ; WX 0 ; N uni0655 ; G 1406 -U 1623 ; WX 0 ; N uni0657 ; G 1407 -U 1626 ; WX 500 ; N uni065A ; G 1408 -U 1632 ; WX 610 ; N uni0660 ; G 1409 -U 1633 ; WX 610 ; N uni0661 ; G 1410 -U 1634 ; WX 610 ; N uni0662 ; G 1411 -U 1635 ; WX 610 ; N uni0663 ; G 1412 -U 1636 ; WX 610 ; N uni0664 ; G 1413 -U 1637 ; WX 610 ; N uni0665 ; G 1414 -U 1638 ; WX 610 ; N uni0666 ; G 1415 -U 1639 ; WX 610 ; N uni0667 ; G 1416 -U 1640 ; WX 610 ; N uni0668 ; G 1417 -U 1641 ; WX 610 ; N uni0669 ; G 1418 -U 1642 ; WX 610 ; N uni066A ; G 1419 -U 1643 ; WX 374 ; N uni066B ; G 1420 -U 1644 ; WX 380 ; N uni066C ; G 1421 -U 1645 ; WX 545 ; N uni066D ; G 1422 -U 1646 ; WX 1005 ; N uni066E ; G 1423 -U 1647 ; WX 894 ; N uni066F ; G 1424 -U 1648 ; WX 0 ; N uni0670 ; G 1425 -U 1652 ; WX 292 ; N uni0674 ; G 1426 -U 1657 ; WX 1005 ; N uni0679 ; G 1427 -U 1658 ; WX 1005 ; N uni067A ; G 1428 -U 1659 ; WX 1005 ; N uni067B ; G 1429 -U 1660 ; WX 1005 ; N uni067C ; G 1430 -U 1661 ; WX 1005 ; N uni067D ; G 1431 -U 1662 ; WX 1005 ; N uni067E ; G 1432 -U 1663 ; WX 1005 ; N uni067F ; G 1433 -U 1664 ; WX 1005 ; N uni0680 ; G 1434 -U 1665 ; WX 721 ; N uni0681 ; G 1435 -U 1666 ; WX 721 ; N uni0682 ; G 1436 -U 1667 ; WX 721 ; N uni0683 ; G 1437 -U 1668 ; WX 721 ; N uni0684 ; G 1438 -U 1669 ; WX 721 ; N uni0685 ; G 1439 -U 1670 ; WX 721 ; N uni0686 ; G 1440 -U 1671 ; WX 721 ; N uni0687 ; G 1441 -U 1672 ; WX 445 ; N uni0688 ; G 1442 -U 1673 ; WX 445 ; N uni0689 ; G 1443 -U 1674 ; WX 445 ; N uni068A ; G 1444 -U 1675 ; WX 445 ; N uni068B ; G 1445 -U 1676 ; WX 445 ; N uni068C ; G 1446 -U 1677 ; WX 445 ; N uni068D ; G 1447 -U 1678 ; WX 445 ; N uni068E ; G 1448 -U 1679 ; WX 445 ; N uni068F ; G 1449 -U 1680 ; WX 445 ; N uni0690 ; G 1450 -U 1681 ; WX 576 ; N uni0691 ; G 1451 -U 1682 ; WX 576 ; N uni0692 ; G 1452 -U 1683 ; WX 576 ; N uni0693 ; G 1453 -U 1684 ; WX 576 ; N uni0694 ; G 1454 -U 1685 ; WX 681 ; N uni0695 ; G 1455 -U 1686 ; WX 576 ; N uni0696 ; G 1456 -U 1687 ; WX 576 ; N uni0697 ; G 1457 -U 1688 ; WX 576 ; N uni0698 ; G 1458 -U 1689 ; WX 576 ; N uni0699 ; G 1459 -U 1690 ; WX 1380 ; N uni069A ; G 1460 -U 1691 ; WX 1380 ; N uni069B ; G 1461 -U 1692 ; WX 1380 ; N uni069C ; G 1462 -U 1693 ; WX 1345 ; N uni069D ; G 1463 -U 1694 ; WX 1345 ; N uni069E ; G 1464 -U 1695 ; WX 1039 ; N uni069F ; G 1465 -U 1696 ; WX 683 ; N uni06A0 ; G 1466 -U 1697 ; WX 1162 ; N uni06A1 ; G 1467 -U 1698 ; WX 1162 ; N uni06A2 ; G 1468 -U 1699 ; WX 1162 ; N uni06A3 ; G 1469 -U 1700 ; WX 1162 ; N uni06A4 ; G 1470 -U 1701 ; WX 1162 ; N uni06A5 ; G 1471 -U 1702 ; WX 1162 ; N uni06A6 ; G 1472 -U 1703 ; WX 894 ; N uni06A7 ; G 1473 -U 1704 ; WX 894 ; N uni06A8 ; G 1474 -U 1705 ; WX 1024 ; N uni06A9 ; G 1475 -U 1706 ; WX 1271 ; N uni06AA ; G 1476 -U 1707 ; WX 1024 ; N uni06AB ; G 1477 -U 1708 ; WX 917 ; N uni06AC ; G 1478 -U 1709 ; WX 917 ; N uni06AD ; G 1479 -U 1710 ; WX 917 ; N uni06AE ; G 1480 -U 1711 ; WX 1024 ; N uni06AF ; G 1481 -U 1712 ; WX 1024 ; N uni06B0 ; G 1482 -U 1713 ; WX 1024 ; N uni06B1 ; G 1483 -U 1714 ; WX 1024 ; N uni06B2 ; G 1484 -U 1715 ; WX 1024 ; N uni06B3 ; G 1485 -U 1716 ; WX 1024 ; N uni06B4 ; G 1486 -U 1717 ; WX 868 ; N uni06B5 ; G 1487 -U 1718 ; WX 868 ; N uni06B6 ; G 1488 -U 1719 ; WX 868 ; N uni06B7 ; G 1489 -U 1720 ; WX 868 ; N uni06B8 ; G 1490 -U 1721 ; WX 854 ; N uni06B9 ; G 1491 -U 1722 ; WX 854 ; N uni06BA ; G 1492 -U 1723 ; WX 854 ; N uni06BB ; G 1493 -U 1724 ; WX 854 ; N uni06BC ; G 1494 -U 1725 ; WX 854 ; N uni06BD ; G 1495 -U 1726 ; WX 938 ; N uni06BE ; G 1496 -U 1727 ; WX 721 ; N uni06BF ; G 1497 -U 1734 ; WX 622 ; N uni06C6 ; G 1498 -U 1735 ; WX 622 ; N uni06C7 ; G 1499 -U 1736 ; WX 622 ; N uni06C8 ; G 1500 -U 1739 ; WX 622 ; N uni06CB ; G 1501 -U 1740 ; WX 917 ; N uni06CC ; G 1502 -U 1742 ; WX 917 ; N uni06CE ; G 1503 -U 1744 ; WX 917 ; N uni06D0 ; G 1504 -U 1749 ; WX 590 ; N uni06D5 ; G 1505 -U 1776 ; WX 610 ; N uni06F0 ; G 1506 -U 1777 ; WX 610 ; N uni06F1 ; G 1507 -U 1778 ; WX 610 ; N uni06F2 ; G 1508 -U 1779 ; WX 610 ; N uni06F3 ; G 1509 -U 1780 ; WX 610 ; N uni06F4 ; G 1510 -U 1781 ; WX 610 ; N uni06F5 ; G 1511 -U 1782 ; WX 610 ; N uni06F6 ; G 1512 -U 1783 ; WX 610 ; N uni06F7 ; G 1513 -U 1784 ; WX 610 ; N uni06F8 ; G 1514 -U 1785 ; WX 610 ; N uni06F9 ; G 1515 -U 1984 ; WX 696 ; N uni07C0 ; G 1516 -U 1985 ; WX 696 ; N uni07C1 ; G 1517 -U 1986 ; WX 696 ; N uni07C2 ; G 1518 -U 1987 ; WX 696 ; N uni07C3 ; G 1519 -U 1988 ; WX 696 ; N uni07C4 ; G 1520 -U 1989 ; WX 696 ; N uni07C5 ; G 1521 -U 1990 ; WX 696 ; N uni07C6 ; G 1522 -U 1991 ; WX 696 ; N uni07C7 ; G 1523 -U 1992 ; WX 696 ; N uni07C8 ; G 1524 -U 1993 ; WX 696 ; N uni07C9 ; G 1525 -U 1994 ; WX 343 ; N uni07CA ; G 1526 -U 1995 ; WX 547 ; N uni07CB ; G 1527 -U 1996 ; WX 543 ; N uni07CC ; G 1528 -U 1997 ; WX 652 ; N uni07CD ; G 1529 -U 1998 ; WX 691 ; N uni07CE ; G 1530 -U 1999 ; WX 691 ; N uni07CF ; G 1531 -U 2000 ; WX 594 ; N uni07D0 ; G 1532 -U 2001 ; WX 691 ; N uni07D1 ; G 1533 -U 2002 ; WX 904 ; N uni07D2 ; G 1534 -U 2003 ; WX 551 ; N uni07D3 ; G 1535 -U 2004 ; WX 551 ; N uni07D4 ; G 1536 -U 2005 ; WX 627 ; N uni07D5 ; G 1537 -U 2006 ; WX 688 ; N uni07D6 ; G 1538 -U 2007 ; WX 444 ; N uni07D7 ; G 1539 -U 2008 ; WX 1022 ; N uni07D8 ; G 1540 -U 2009 ; WX 506 ; N uni07D9 ; G 1541 -U 2010 ; WX 826 ; N uni07DA ; G 1542 -U 2011 ; WX 691 ; N uni07DB ; G 1543 -U 2012 ; WX 652 ; N uni07DC ; G 1544 -U 2013 ; WX 912 ; N uni07DD ; G 1545 -U 2014 ; WX 627 ; N uni07DE ; G 1546 -U 2015 ; WX 707 ; N uni07DF ; G 1547 -U 2016 ; WX 506 ; N uni07E0 ; G 1548 -U 2017 ; WX 652 ; N uni07E1 ; G 1549 -U 2018 ; WX 574 ; N uni07E2 ; G 1550 -U 2019 ; WX 627 ; N uni07E3 ; G 1551 -U 2020 ; WX 627 ; N uni07E4 ; G 1552 -U 2021 ; WX 627 ; N uni07E5 ; G 1553 -U 2022 ; WX 574 ; N uni07E6 ; G 1554 -U 2023 ; WX 574 ; N uni07E7 ; G 1555 -U 2027 ; WX 0 ; N uni07EB ; G 1556 -U 2028 ; WX 0 ; N uni07EC ; G 1557 -U 2029 ; WX 0 ; N uni07ED ; G 1558 -U 2030 ; WX 0 ; N uni07EE ; G 1559 -U 2031 ; WX 0 ; N uni07EF ; G 1560 -U 2032 ; WX 0 ; N uni07F0 ; G 1561 -U 2033 ; WX 0 ; N uni07F1 ; G 1562 -U 2034 ; WX 0 ; N uni07F2 ; G 1563 -U 2035 ; WX 0 ; N uni07F3 ; G 1564 -U 2036 ; WX 380 ; N uni07F4 ; G 1565 -U 2037 ; WX 380 ; N uni07F5 ; G 1566 -U 2040 ; WX 691 ; N uni07F8 ; G 1567 -U 2041 ; WX 691 ; N uni07F9 ; G 1568 -U 2042 ; WX 415 ; N uni07FA ; G 1569 -U 3647 ; WX 696 ; N uni0E3F ; G 1570 -U 3713 ; WX 790 ; N uni0E81 ; G 1571 -U 3714 ; WX 748 ; N uni0E82 ; G 1572 -U 3716 ; WX 749 ; N uni0E84 ; G 1573 -U 3719 ; WX 569 ; N uni0E87 ; G 1574 -U 3720 ; WX 742 ; N uni0E88 ; G 1575 -U 3722 ; WX 744 ; N uni0E8A ; G 1576 -U 3725 ; WX 761 ; N uni0E8D ; G 1577 -U 3732 ; WX 706 ; N uni0E94 ; G 1578 -U 3733 ; WX 704 ; N uni0E95 ; G 1579 -U 3734 ; WX 747 ; N uni0E96 ; G 1580 -U 3735 ; WX 819 ; N uni0E97 ; G 1581 -U 3737 ; WX 730 ; N uni0E99 ; G 1582 -U 3738 ; WX 727 ; N uni0E9A ; G 1583 -U 3739 ; WX 727 ; N uni0E9B ; G 1584 -U 3740 ; WX 922 ; N uni0E9C ; G 1585 -U 3741 ; WX 827 ; N uni0E9D ; G 1586 -U 3742 ; WX 866 ; N uni0E9E ; G 1587 -U 3743 ; WX 866 ; N uni0E9F ; G 1588 -U 3745 ; WX 836 ; N uni0EA1 ; G 1589 -U 3746 ; WX 761 ; N uni0EA2 ; G 1590 -U 3747 ; WX 770 ; N uni0EA3 ; G 1591 -U 3749 ; WX 769 ; N uni0EA5 ; G 1592 -U 3751 ; WX 713 ; N uni0EA7 ; G 1593 -U 3754 ; WX 827 ; N uni0EAA ; G 1594 -U 3755 ; WX 1031 ; N uni0EAB ; G 1595 -U 3757 ; WX 724 ; N uni0EAD ; G 1596 -U 3758 ; WX 784 ; N uni0EAE ; G 1597 -U 3759 ; WX 934 ; N uni0EAF ; G 1598 -U 3760 ; WX 688 ; N uni0EB0 ; G 1599 -U 3761 ; WX 0 ; N uni0EB1 ; G 1600 -U 3762 ; WX 610 ; N uni0EB2 ; G 1601 -U 3763 ; WX 610 ; N uni0EB3 ; G 1602 -U 3764 ; WX 0 ; N uni0EB4 ; G 1603 -U 3765 ; WX 0 ; N uni0EB5 ; G 1604 -U 3766 ; WX 0 ; N uni0EB6 ; G 1605 -U 3767 ; WX 0 ; N uni0EB7 ; G 1606 -U 3768 ; WX 0 ; N uni0EB8 ; G 1607 -U 3769 ; WX 0 ; N uni0EB9 ; G 1608 -U 3771 ; WX 0 ; N uni0EBB ; G 1609 -U 3772 ; WX 0 ; N uni0EBC ; G 1610 -U 3773 ; WX 670 ; N uni0EBD ; G 1611 -U 3776 ; WX 516 ; N uni0EC0 ; G 1612 -U 3777 ; WX 860 ; N uni0EC1 ; G 1613 -U 3778 ; WX 516 ; N uni0EC2 ; G 1614 -U 3779 ; WX 650 ; N uni0EC3 ; G 1615 -U 3780 ; WX 632 ; N uni0EC4 ; G 1616 -U 3782 ; WX 759 ; N uni0EC6 ; G 1617 -U 3784 ; WX 0 ; N uni0EC8 ; G 1618 -U 3785 ; WX 0 ; N uni0EC9 ; G 1619 -U 3786 ; WX 0 ; N uni0ECA ; G 1620 -U 3787 ; WX 0 ; N uni0ECB ; G 1621 -U 3788 ; WX 0 ; N uni0ECC ; G 1622 -U 3789 ; WX 0 ; N uni0ECD ; G 1623 -U 3792 ; WX 771 ; N uni0ED0 ; G 1624 -U 3793 ; WX 771 ; N uni0ED1 ; G 1625 -U 3794 ; WX 693 ; N uni0ED2 ; G 1626 -U 3795 ; WX 836 ; N uni0ED3 ; G 1627 -U 3796 ; WX 729 ; N uni0ED4 ; G 1628 -U 3797 ; WX 729 ; N uni0ED5 ; G 1629 -U 3798 ; WX 849 ; N uni0ED6 ; G 1630 -U 3799 ; WX 790 ; N uni0ED7 ; G 1631 -U 3800 ; WX 759 ; N uni0ED8 ; G 1632 -U 3801 ; WX 910 ; N uni0ED9 ; G 1633 -U 3804 ; WX 1363 ; N uni0EDC ; G 1634 -U 3805 ; WX 1363 ; N uni0EDD ; G 1635 -U 4256 ; WX 874 ; N uni10A0 ; G 1636 -U 4257 ; WX 733 ; N uni10A1 ; G 1637 -U 4258 ; WX 679 ; N uni10A2 ; G 1638 -U 4259 ; WX 834 ; N uni10A3 ; G 1639 -U 4260 ; WX 615 ; N uni10A4 ; G 1640 -U 4261 ; WX 768 ; N uni10A5 ; G 1641 -U 4262 ; WX 753 ; N uni10A6 ; G 1642 -U 4263 ; WX 914 ; N uni10A7 ; G 1643 -U 4264 ; WX 453 ; N uni10A8 ; G 1644 -U 4265 ; WX 620 ; N uni10A9 ; G 1645 -U 4266 ; WX 843 ; N uni10AA ; G 1646 -U 4267 ; WX 882 ; N uni10AB ; G 1647 -U 4268 ; WX 625 ; N uni10AC ; G 1648 -U 4269 ; WX 854 ; N uni10AD ; G 1649 -U 4270 ; WX 781 ; N uni10AE ; G 1650 -U 4271 ; WX 629 ; N uni10AF ; G 1651 -U 4272 ; WX 912 ; N uni10B0 ; G 1652 -U 4273 ; WX 621 ; N uni10B1 ; G 1653 -U 4274 ; WX 620 ; N uni10B2 ; G 1654 -U 4275 ; WX 854 ; N uni10B3 ; G 1655 -U 4276 ; WX 866 ; N uni10B4 ; G 1656 -U 4277 ; WX 724 ; N uni10B5 ; G 1657 -U 4278 ; WX 630 ; N uni10B6 ; G 1658 -U 4279 ; WX 621 ; N uni10B7 ; G 1659 -U 4280 ; WX 625 ; N uni10B8 ; G 1660 -U 4281 ; WX 620 ; N uni10B9 ; G 1661 -U 4282 ; WX 818 ; N uni10BA ; G 1662 -U 4283 ; WX 874 ; N uni10BB ; G 1663 -U 4284 ; WX 615 ; N uni10BC ; G 1664 -U 4285 ; WX 623 ; N uni10BD ; G 1665 -U 4286 ; WX 625 ; N uni10BE ; G 1666 -U 4287 ; WX 725 ; N uni10BF ; G 1667 -U 4288 ; WX 844 ; N uni10C0 ; G 1668 -U 4289 ; WX 596 ; N uni10C1 ; G 1669 -U 4290 ; WX 688 ; N uni10C2 ; G 1670 -U 4291 ; WX 596 ; N uni10C3 ; G 1671 -U 4292 ; WX 594 ; N uni10C4 ; G 1672 -U 4293 ; WX 738 ; N uni10C5 ; G 1673 -U 4304 ; WX 554 ; N uni10D0 ; G 1674 -U 4305 ; WX 563 ; N uni10D1 ; G 1675 -U 4306 ; WX 622 ; N uni10D2 ; G 1676 -U 4307 ; WX 834 ; N uni10D3 ; G 1677 -U 4308 ; WX 555 ; N uni10D4 ; G 1678 -U 4309 ; WX 564 ; N uni10D5 ; G 1679 -U 4310 ; WX 551 ; N uni10D6 ; G 1680 -U 4311 ; WX 828 ; N uni10D7 ; G 1681 -U 4312 ; WX 563 ; N uni10D8 ; G 1682 -U 4313 ; WX 556 ; N uni10D9 ; G 1683 -U 4314 ; WX 1074 ; N uni10DA ; G 1684 -U 4315 ; WX 568 ; N uni10DB ; G 1685 -U 4316 ; WX 568 ; N uni10DC ; G 1686 -U 4317 ; WX 814 ; N uni10DD ; G 1687 -U 4318 ; WX 554 ; N uni10DE ; G 1688 -U 4319 ; WX 563 ; N uni10DF ; G 1689 -U 4320 ; WX 823 ; N uni10E0 ; G 1690 -U 4321 ; WX 568 ; N uni10E1 ; G 1691 -U 4322 ; WX 700 ; N uni10E2 ; G 1692 -U 4323 ; WX 591 ; N uni10E3 ; G 1693 -U 4324 ; WX 852 ; N uni10E4 ; G 1694 -U 4325 ; WX 560 ; N uni10E5 ; G 1695 -U 4326 ; WX 814 ; N uni10E6 ; G 1696 -U 4327 ; WX 563 ; N uni10E7 ; G 1697 -U 4328 ; WX 553 ; N uni10E8 ; G 1698 -U 4329 ; WX 568 ; N uni10E9 ; G 1699 -U 4330 ; WX 622 ; N uni10EA ; G 1700 -U 4331 ; WX 568 ; N uni10EB ; G 1701 -U 4332 ; WX 553 ; N uni10EC ; G 1702 -U 4333 ; WX 566 ; N uni10ED ; G 1703 -U 4334 ; WX 568 ; N uni10EE ; G 1704 -U 4335 ; WX 540 ; N uni10EF ; G 1705 -U 4336 ; WX 554 ; N uni10F0 ; G 1706 -U 4337 ; WX 559 ; N uni10F1 ; G 1707 -U 4338 ; WX 553 ; N uni10F2 ; G 1708 -U 4339 ; WX 554 ; N uni10F3 ; G 1709 -U 4340 ; WX 553 ; N uni10F4 ; G 1710 -U 4341 ; WX 587 ; N uni10F5 ; G 1711 -U 4342 ; WX 853 ; N uni10F6 ; G 1712 -U 4343 ; WX 604 ; N uni10F7 ; G 1713 -U 4344 ; WX 563 ; N uni10F8 ; G 1714 -U 4345 ; WX 622 ; N uni10F9 ; G 1715 -U 4346 ; WX 554 ; N uni10FA ; G 1716 -U 4347 ; WX 448 ; N uni10FB ; G 1717 -U 4348 ; WX 324 ; N uni10FC ; G 1718 -U 5121 ; WX 774 ; N uni1401 ; G 1719 -U 5122 ; WX 774 ; N uni1402 ; G 1720 -U 5123 ; WX 774 ; N uni1403 ; G 1721 -U 5124 ; WX 774 ; N uni1404 ; G 1722 -U 5125 ; WX 905 ; N uni1405 ; G 1723 -U 5126 ; WX 905 ; N uni1406 ; G 1724 -U 5127 ; WX 905 ; N uni1407 ; G 1725 -U 5129 ; WX 905 ; N uni1409 ; G 1726 -U 5130 ; WX 905 ; N uni140A ; G 1727 -U 5131 ; WX 905 ; N uni140B ; G 1728 -U 5132 ; WX 1018 ; N uni140C ; G 1729 -U 5133 ; WX 1009 ; N uni140D ; G 1730 -U 5134 ; WX 1018 ; N uni140E ; G 1731 -U 5135 ; WX 1009 ; N uni140F ; G 1732 -U 5136 ; WX 1018 ; N uni1410 ; G 1733 -U 5137 ; WX 1009 ; N uni1411 ; G 1734 -U 5138 ; WX 1149 ; N uni1412 ; G 1735 -U 5139 ; WX 1140 ; N uni1413 ; G 1736 -U 5140 ; WX 1149 ; N uni1414 ; G 1737 -U 5141 ; WX 1140 ; N uni1415 ; G 1738 -U 5142 ; WX 905 ; N uni1416 ; G 1739 -U 5143 ; WX 1149 ; N uni1417 ; G 1740 -U 5144 ; WX 1142 ; N uni1418 ; G 1741 -U 5145 ; WX 1149 ; N uni1419 ; G 1742 -U 5146 ; WX 1142 ; N uni141A ; G 1743 -U 5147 ; WX 905 ; N uni141B ; G 1744 -U 5149 ; WX 310 ; N uni141D ; G 1745 -U 5150 ; WX 529 ; N uni141E ; G 1746 -U 5151 ; WX 425 ; N uni141F ; G 1747 -U 5152 ; WX 425 ; N uni1420 ; G 1748 -U 5153 ; WX 395 ; N uni1421 ; G 1749 -U 5154 ; WX 395 ; N uni1422 ; G 1750 -U 5155 ; WX 395 ; N uni1423 ; G 1751 -U 5156 ; WX 395 ; N uni1424 ; G 1752 -U 5157 ; WX 564 ; N uni1425 ; G 1753 -U 5158 ; WX 470 ; N uni1426 ; G 1754 -U 5159 ; WX 310 ; N uni1427 ; G 1755 -U 5160 ; WX 395 ; N uni1428 ; G 1756 -U 5161 ; WX 395 ; N uni1429 ; G 1757 -U 5162 ; WX 395 ; N uni142A ; G 1758 -U 5163 ; WX 1213 ; N uni142B ; G 1759 -U 5164 ; WX 986 ; N uni142C ; G 1760 -U 5165 ; WX 1216 ; N uni142D ; G 1761 -U 5166 ; WX 1297 ; N uni142E ; G 1762 -U 5167 ; WX 774 ; N uni142F ; G 1763 -U 5168 ; WX 774 ; N uni1430 ; G 1764 -U 5169 ; WX 774 ; N uni1431 ; G 1765 -U 5170 ; WX 774 ; N uni1432 ; G 1766 -U 5171 ; WX 886 ; N uni1433 ; G 1767 -U 5172 ; WX 886 ; N uni1434 ; G 1768 -U 5173 ; WX 886 ; N uni1435 ; G 1769 -U 5175 ; WX 886 ; N uni1437 ; G 1770 -U 5176 ; WX 886 ; N uni1438 ; G 1771 -U 5177 ; WX 886 ; N uni1439 ; G 1772 -U 5178 ; WX 1018 ; N uni143A ; G 1773 -U 5179 ; WX 1009 ; N uni143B ; G 1774 -U 5180 ; WX 1018 ; N uni143C ; G 1775 -U 5181 ; WX 1009 ; N uni143D ; G 1776 -U 5182 ; WX 1018 ; N uni143E ; G 1777 -U 5183 ; WX 1009 ; N uni143F ; G 1778 -U 5184 ; WX 1149 ; N uni1440 ; G 1779 -U 5185 ; WX 1140 ; N uni1441 ; G 1780 -U 5186 ; WX 1149 ; N uni1442 ; G 1781 -U 5187 ; WX 1140 ; N uni1443 ; G 1782 -U 5188 ; WX 1149 ; N uni1444 ; G 1783 -U 5189 ; WX 1142 ; N uni1445 ; G 1784 -U 5190 ; WX 1149 ; N uni1446 ; G 1785 -U 5191 ; WX 1142 ; N uni1447 ; G 1786 -U 5192 ; WX 886 ; N uni1448 ; G 1787 -U 5193 ; WX 576 ; N uni1449 ; G 1788 -U 5194 ; WX 229 ; N uni144A ; G 1789 -U 5196 ; WX 812 ; N uni144C ; G 1790 -U 5197 ; WX 812 ; N uni144D ; G 1791 -U 5198 ; WX 812 ; N uni144E ; G 1792 -U 5199 ; WX 812 ; N uni144F ; G 1793 -U 5200 ; WX 815 ; N uni1450 ; G 1794 -U 5201 ; WX 815 ; N uni1451 ; G 1795 -U 5202 ; WX 815 ; N uni1452 ; G 1796 -U 5204 ; WX 815 ; N uni1454 ; G 1797 -U 5205 ; WX 815 ; N uni1455 ; G 1798 -U 5206 ; WX 815 ; N uni1456 ; G 1799 -U 5207 ; WX 1056 ; N uni1457 ; G 1800 -U 5208 ; WX 1048 ; N uni1458 ; G 1801 -U 5209 ; WX 1056 ; N uni1459 ; G 1802 -U 5210 ; WX 1048 ; N uni145A ; G 1803 -U 5211 ; WX 1056 ; N uni145B ; G 1804 -U 5212 ; WX 1048 ; N uni145C ; G 1805 -U 5213 ; WX 1060 ; N uni145D ; G 1806 -U 5214 ; WX 1054 ; N uni145E ; G 1807 -U 5215 ; WX 1060 ; N uni145F ; G 1808 -U 5216 ; WX 1054 ; N uni1460 ; G 1809 -U 5217 ; WX 1060 ; N uni1461 ; G 1810 -U 5218 ; WX 1052 ; N uni1462 ; G 1811 -U 5219 ; WX 1060 ; N uni1463 ; G 1812 -U 5220 ; WX 1052 ; N uni1464 ; G 1813 -U 5221 ; WX 1060 ; N uni1465 ; G 1814 -U 5222 ; WX 483 ; N uni1466 ; G 1815 -U 5223 ; WX 1005 ; N uni1467 ; G 1816 -U 5224 ; WX 1005 ; N uni1468 ; G 1817 -U 5225 ; WX 1023 ; N uni1469 ; G 1818 -U 5226 ; WX 1017 ; N uni146A ; G 1819 -U 5227 ; WX 743 ; N uni146B ; G 1820 -U 5228 ; WX 743 ; N uni146C ; G 1821 -U 5229 ; WX 743 ; N uni146D ; G 1822 -U 5230 ; WX 743 ; N uni146E ; G 1823 -U 5231 ; WX 743 ; N uni146F ; G 1824 -U 5232 ; WX 743 ; N uni1470 ; G 1825 -U 5233 ; WX 743 ; N uni1471 ; G 1826 -U 5234 ; WX 743 ; N uni1472 ; G 1827 -U 5235 ; WX 743 ; N uni1473 ; G 1828 -U 5236 ; WX 1029 ; N uni1474 ; G 1829 -U 5237 ; WX 975 ; N uni1475 ; G 1830 -U 5238 ; WX 980 ; N uni1476 ; G 1831 -U 5239 ; WX 975 ; N uni1477 ; G 1832 -U 5240 ; WX 980 ; N uni1478 ; G 1833 -U 5241 ; WX 975 ; N uni1479 ; G 1834 -U 5242 ; WX 1029 ; N uni147A ; G 1835 -U 5243 ; WX 975 ; N uni147B ; G 1836 -U 5244 ; WX 1029 ; N uni147C ; G 1837 -U 5245 ; WX 975 ; N uni147D ; G 1838 -U 5246 ; WX 980 ; N uni147E ; G 1839 -U 5247 ; WX 975 ; N uni147F ; G 1840 -U 5248 ; WX 980 ; N uni1480 ; G 1841 -U 5249 ; WX 975 ; N uni1481 ; G 1842 -U 5250 ; WX 980 ; N uni1482 ; G 1843 -U 5251 ; WX 501 ; N uni1483 ; G 1844 -U 5252 ; WX 501 ; N uni1484 ; G 1845 -U 5253 ; WX 938 ; N uni1485 ; G 1846 -U 5254 ; WX 938 ; N uni1486 ; G 1847 -U 5255 ; WX 938 ; N uni1487 ; G 1848 -U 5256 ; WX 938 ; N uni1488 ; G 1849 -U 5257 ; WX 743 ; N uni1489 ; G 1850 -U 5258 ; WX 743 ; N uni148A ; G 1851 -U 5259 ; WX 743 ; N uni148B ; G 1852 -U 5260 ; WX 743 ; N uni148C ; G 1853 -U 5261 ; WX 743 ; N uni148D ; G 1854 -U 5262 ; WX 743 ; N uni148E ; G 1855 -U 5263 ; WX 743 ; N uni148F ; G 1856 -U 5264 ; WX 743 ; N uni1490 ; G 1857 -U 5265 ; WX 743 ; N uni1491 ; G 1858 -U 5266 ; WX 1029 ; N uni1492 ; G 1859 -U 5267 ; WX 975 ; N uni1493 ; G 1860 -U 5268 ; WX 1029 ; N uni1494 ; G 1861 -U 5269 ; WX 975 ; N uni1495 ; G 1862 -U 5270 ; WX 1029 ; N uni1496 ; G 1863 -U 5271 ; WX 975 ; N uni1497 ; G 1864 -U 5272 ; WX 1029 ; N uni1498 ; G 1865 -U 5273 ; WX 975 ; N uni1499 ; G 1866 -U 5274 ; WX 1029 ; N uni149A ; G 1867 -U 5275 ; WX 975 ; N uni149B ; G 1868 -U 5276 ; WX 1029 ; N uni149C ; G 1869 -U 5277 ; WX 975 ; N uni149D ; G 1870 -U 5278 ; WX 1029 ; N uni149E ; G 1871 -U 5279 ; WX 975 ; N uni149F ; G 1872 -U 5280 ; WX 1029 ; N uni14A0 ; G 1873 -U 5281 ; WX 501 ; N uni14A1 ; G 1874 -U 5282 ; WX 501 ; N uni14A2 ; G 1875 -U 5283 ; WX 626 ; N uni14A3 ; G 1876 -U 5284 ; WX 626 ; N uni14A4 ; G 1877 -U 5285 ; WX 626 ; N uni14A5 ; G 1878 -U 5286 ; WX 626 ; N uni14A6 ; G 1879 -U 5287 ; WX 626 ; N uni14A7 ; G 1880 -U 5288 ; WX 626 ; N uni14A8 ; G 1881 -U 5289 ; WX 626 ; N uni14A9 ; G 1882 -U 5290 ; WX 626 ; N uni14AA ; G 1883 -U 5291 ; WX 626 ; N uni14AB ; G 1884 -U 5292 ; WX 881 ; N uni14AC ; G 1885 -U 5293 ; WX 854 ; N uni14AD ; G 1886 -U 5294 ; WX 863 ; N uni14AE ; G 1887 -U 5295 ; WX 874 ; N uni14AF ; G 1888 -U 5296 ; WX 863 ; N uni14B0 ; G 1889 -U 5297 ; WX 874 ; N uni14B1 ; G 1890 -U 5298 ; WX 881 ; N uni14B2 ; G 1891 -U 5299 ; WX 874 ; N uni14B3 ; G 1892 -U 5300 ; WX 881 ; N uni14B4 ; G 1893 -U 5301 ; WX 874 ; N uni14B5 ; G 1894 -U 5302 ; WX 863 ; N uni14B6 ; G 1895 -U 5303 ; WX 874 ; N uni14B7 ; G 1896 -U 5304 ; WX 863 ; N uni14B8 ; G 1897 -U 5305 ; WX 874 ; N uni14B9 ; G 1898 -U 5306 ; WX 863 ; N uni14BA ; G 1899 -U 5307 ; WX 436 ; N uni14BB ; G 1900 -U 5308 ; WX 548 ; N uni14BC ; G 1901 -U 5309 ; WX 436 ; N uni14BD ; G 1902 -U 5312 ; WX 988 ; N uni14C0 ; G 1903 -U 5313 ; WX 988 ; N uni14C1 ; G 1904 -U 5314 ; WX 988 ; N uni14C2 ; G 1905 -U 5315 ; WX 988 ; N uni14C3 ; G 1906 -U 5316 ; WX 931 ; N uni14C4 ; G 1907 -U 5317 ; WX 931 ; N uni14C5 ; G 1908 -U 5318 ; WX 931 ; N uni14C6 ; G 1909 -U 5319 ; WX 931 ; N uni14C7 ; G 1910 -U 5320 ; WX 931 ; N uni14C8 ; G 1911 -U 5321 ; WX 1238 ; N uni14C9 ; G 1912 -U 5322 ; WX 1247 ; N uni14CA ; G 1913 -U 5323 ; WX 1200 ; N uni14CB ; G 1914 -U 5324 ; WX 1228 ; N uni14CC ; G 1915 -U 5325 ; WX 1200 ; N uni14CD ; G 1916 -U 5326 ; WX 1228 ; N uni14CE ; G 1917 -U 5327 ; WX 931 ; N uni14CF ; G 1918 -U 5328 ; WX 660 ; N uni14D0 ; G 1919 -U 5329 ; WX 497 ; N uni14D1 ; G 1920 -U 5330 ; WX 660 ; N uni14D2 ; G 1921 -U 5331 ; WX 988 ; N uni14D3 ; G 1922 -U 5332 ; WX 988 ; N uni14D4 ; G 1923 -U 5333 ; WX 988 ; N uni14D5 ; G 1924 -U 5334 ; WX 988 ; N uni14D6 ; G 1925 -U 5335 ; WX 931 ; N uni14D7 ; G 1926 -U 5336 ; WX 931 ; N uni14D8 ; G 1927 -U 5337 ; WX 931 ; N uni14D9 ; G 1928 -U 5338 ; WX 931 ; N uni14DA ; G 1929 -U 5339 ; WX 931 ; N uni14DB ; G 1930 -U 5340 ; WX 1231 ; N uni14DC ; G 1931 -U 5341 ; WX 1247 ; N uni14DD ; G 1932 -U 5342 ; WX 1283 ; N uni14DE ; G 1933 -U 5343 ; WX 1228 ; N uni14DF ; G 1934 -U 5344 ; WX 1283 ; N uni14E0 ; G 1935 -U 5345 ; WX 1228 ; N uni14E1 ; G 1936 -U 5346 ; WX 1228 ; N uni14E2 ; G 1937 -U 5347 ; WX 1214 ; N uni14E3 ; G 1938 -U 5348 ; WX 1228 ; N uni14E4 ; G 1939 -U 5349 ; WX 1214 ; N uni14E5 ; G 1940 -U 5350 ; WX 1283 ; N uni14E6 ; G 1941 -U 5351 ; WX 1228 ; N uni14E7 ; G 1942 -U 5352 ; WX 1283 ; N uni14E8 ; G 1943 -U 5353 ; WX 1228 ; N uni14E9 ; G 1944 -U 5354 ; WX 660 ; N uni14EA ; G 1945 -U 5356 ; WX 886 ; N uni14EC ; G 1946 -U 5357 ; WX 730 ; N uni14ED ; G 1947 -U 5358 ; WX 730 ; N uni14EE ; G 1948 -U 5359 ; WX 730 ; N uni14EF ; G 1949 -U 5360 ; WX 730 ; N uni14F0 ; G 1950 -U 5361 ; WX 730 ; N uni14F1 ; G 1951 -U 5362 ; WX 730 ; N uni14F2 ; G 1952 -U 5363 ; WX 730 ; N uni14F3 ; G 1953 -U 5364 ; WX 730 ; N uni14F4 ; G 1954 -U 5365 ; WX 730 ; N uni14F5 ; G 1955 -U 5366 ; WX 998 ; N uni14F6 ; G 1956 -U 5367 ; WX 958 ; N uni14F7 ; G 1957 -U 5368 ; WX 967 ; N uni14F8 ; G 1958 -U 5369 ; WX 989 ; N uni14F9 ; G 1959 -U 5370 ; WX 967 ; N uni14FA ; G 1960 -U 5371 ; WX 989 ; N uni14FB ; G 1961 -U 5372 ; WX 998 ; N uni14FC ; G 1962 -U 5373 ; WX 958 ; N uni14FD ; G 1963 -U 5374 ; WX 998 ; N uni14FE ; G 1964 -U 5375 ; WX 958 ; N uni14FF ; G 1965 -U 5376 ; WX 967 ; N uni1500 ; G 1966 -U 5377 ; WX 989 ; N uni1501 ; G 1967 -U 5378 ; WX 967 ; N uni1502 ; G 1968 -U 5379 ; WX 989 ; N uni1503 ; G 1969 -U 5380 ; WX 967 ; N uni1504 ; G 1970 -U 5381 ; WX 493 ; N uni1505 ; G 1971 -U 5382 ; WX 460 ; N uni1506 ; G 1972 -U 5383 ; WX 493 ; N uni1507 ; G 1973 -U 5392 ; WX 923 ; N uni1510 ; G 1974 -U 5393 ; WX 923 ; N uni1511 ; G 1975 -U 5394 ; WX 923 ; N uni1512 ; G 1976 -U 5395 ; WX 1136 ; N uni1513 ; G 1977 -U 5396 ; WX 1136 ; N uni1514 ; G 1978 -U 5397 ; WX 1136 ; N uni1515 ; G 1979 -U 5398 ; WX 1136 ; N uni1516 ; G 1980 -U 5399 ; WX 1209 ; N uni1517 ; G 1981 -U 5400 ; WX 1202 ; N uni1518 ; G 1982 -U 5401 ; WX 1209 ; N uni1519 ; G 1983 -U 5402 ; WX 1202 ; N uni151A ; G 1984 -U 5403 ; WX 1209 ; N uni151B ; G 1985 -U 5404 ; WX 1202 ; N uni151C ; G 1986 -U 5405 ; WX 1431 ; N uni151D ; G 1987 -U 5406 ; WX 1420 ; N uni151E ; G 1988 -U 5407 ; WX 1431 ; N uni151F ; G 1989 -U 5408 ; WX 1420 ; N uni1520 ; G 1990 -U 5409 ; WX 1431 ; N uni1521 ; G 1991 -U 5410 ; WX 1420 ; N uni1522 ; G 1992 -U 5411 ; WX 1431 ; N uni1523 ; G 1993 -U 5412 ; WX 1420 ; N uni1524 ; G 1994 -U 5413 ; WX 746 ; N uni1525 ; G 1995 -U 5414 ; WX 776 ; N uni1526 ; G 1996 -U 5415 ; WX 776 ; N uni1527 ; G 1997 -U 5416 ; WX 776 ; N uni1528 ; G 1998 -U 5417 ; WX 776 ; N uni1529 ; G 1999 -U 5418 ; WX 776 ; N uni152A ; G 2000 -U 5419 ; WX 776 ; N uni152B ; G 2001 -U 5420 ; WX 776 ; N uni152C ; G 2002 -U 5421 ; WX 776 ; N uni152D ; G 2003 -U 5422 ; WX 776 ; N uni152E ; G 2004 -U 5423 ; WX 1003 ; N uni152F ; G 2005 -U 5424 ; WX 1003 ; N uni1530 ; G 2006 -U 5425 ; WX 1013 ; N uni1531 ; G 2007 -U 5426 ; WX 996 ; N uni1532 ; G 2008 -U 5427 ; WX 1013 ; N uni1533 ; G 2009 -U 5428 ; WX 996 ; N uni1534 ; G 2010 -U 5429 ; WX 1003 ; N uni1535 ; G 2011 -U 5430 ; WX 1003 ; N uni1536 ; G 2012 -U 5431 ; WX 1003 ; N uni1537 ; G 2013 -U 5432 ; WX 1003 ; N uni1538 ; G 2014 -U 5433 ; WX 1013 ; N uni1539 ; G 2015 -U 5434 ; WX 996 ; N uni153A ; G 2016 -U 5435 ; WX 1013 ; N uni153B ; G 2017 -U 5436 ; WX 996 ; N uni153C ; G 2018 -U 5437 ; WX 1013 ; N uni153D ; G 2019 -U 5438 ; WX 495 ; N uni153E ; G 2020 -U 5440 ; WX 395 ; N uni1540 ; G 2021 -U 5441 ; WX 510 ; N uni1541 ; G 2022 -U 5442 ; WX 1033 ; N uni1542 ; G 2023 -U 5443 ; WX 1033 ; N uni1543 ; G 2024 -U 5444 ; WX 976 ; N uni1544 ; G 2025 -U 5445 ; WX 976 ; N uni1545 ; G 2026 -U 5446 ; WX 976 ; N uni1546 ; G 2027 -U 5447 ; WX 976 ; N uni1547 ; G 2028 -U 5448 ; WX 733 ; N uni1548 ; G 2029 -U 5449 ; WX 733 ; N uni1549 ; G 2030 -U 5450 ; WX 733 ; N uni154A ; G 2031 -U 5451 ; WX 733 ; N uni154B ; G 2032 -U 5452 ; WX 733 ; N uni154C ; G 2033 -U 5453 ; WX 733 ; N uni154D ; G 2034 -U 5454 ; WX 1003 ; N uni154E ; G 2035 -U 5455 ; WX 959 ; N uni154F ; G 2036 -U 5456 ; WX 495 ; N uni1550 ; G 2037 -U 5458 ; WX 886 ; N uni1552 ; G 2038 -U 5459 ; WX 774 ; N uni1553 ; G 2039 -U 5460 ; WX 774 ; N uni1554 ; G 2040 -U 5461 ; WX 774 ; N uni1555 ; G 2041 -U 5462 ; WX 774 ; N uni1556 ; G 2042 -U 5463 ; WX 928 ; N uni1557 ; G 2043 -U 5464 ; WX 928 ; N uni1558 ; G 2044 -U 5465 ; WX 928 ; N uni1559 ; G 2045 -U 5466 ; WX 928 ; N uni155A ; G 2046 -U 5467 ; WX 1172 ; N uni155B ; G 2047 -U 5468 ; WX 1142 ; N uni155C ; G 2048 -U 5469 ; WX 602 ; N uni155D ; G 2049 -U 5470 ; WX 812 ; N uni155E ; G 2050 -U 5471 ; WX 812 ; N uni155F ; G 2051 -U 5472 ; WX 812 ; N uni1560 ; G 2052 -U 5473 ; WX 812 ; N uni1561 ; G 2053 -U 5474 ; WX 812 ; N uni1562 ; G 2054 -U 5475 ; WX 812 ; N uni1563 ; G 2055 -U 5476 ; WX 815 ; N uni1564 ; G 2056 -U 5477 ; WX 815 ; N uni1565 ; G 2057 -U 5478 ; WX 815 ; N uni1566 ; G 2058 -U 5479 ; WX 815 ; N uni1567 ; G 2059 -U 5480 ; WX 1060 ; N uni1568 ; G 2060 -U 5481 ; WX 1052 ; N uni1569 ; G 2061 -U 5482 ; WX 548 ; N uni156A ; G 2062 -U 5492 ; WX 977 ; N uni1574 ; G 2063 -U 5493 ; WX 977 ; N uni1575 ; G 2064 -U 5494 ; WX 977 ; N uni1576 ; G 2065 -U 5495 ; WX 977 ; N uni1577 ; G 2066 -U 5496 ; WX 977 ; N uni1578 ; G 2067 -U 5497 ; WX 977 ; N uni1579 ; G 2068 -U 5498 ; WX 977 ; N uni157A ; G 2069 -U 5499 ; WX 618 ; N uni157B ; G 2070 -U 5500 ; WX 837 ; N uni157C ; G 2071 -U 5501 ; WX 510 ; N uni157D ; G 2072 -U 5502 ; WX 1238 ; N uni157E ; G 2073 -U 5503 ; WX 1238 ; N uni157F ; G 2074 -U 5504 ; WX 1238 ; N uni1580 ; G 2075 -U 5505 ; WX 1238 ; N uni1581 ; G 2076 -U 5506 ; WX 1238 ; N uni1582 ; G 2077 -U 5507 ; WX 1238 ; N uni1583 ; G 2078 -U 5508 ; WX 1238 ; N uni1584 ; G 2079 -U 5509 ; WX 989 ; N uni1585 ; G 2080 -U 5514 ; WX 977 ; N uni158A ; G 2081 -U 5515 ; WX 977 ; N uni158B ; G 2082 -U 5516 ; WX 977 ; N uni158C ; G 2083 -U 5517 ; WX 977 ; N uni158D ; G 2084 -U 5518 ; WX 1591 ; N uni158E ; G 2085 -U 5519 ; WX 1591 ; N uni158F ; G 2086 -U 5520 ; WX 1591 ; N uni1590 ; G 2087 -U 5521 ; WX 1295 ; N uni1591 ; G 2088 -U 5522 ; WX 1295 ; N uni1592 ; G 2089 -U 5523 ; WX 1591 ; N uni1593 ; G 2090 -U 5524 ; WX 1591 ; N uni1594 ; G 2091 -U 5525 ; WX 848 ; N uni1595 ; G 2092 -U 5526 ; WX 1273 ; N uni1596 ; G 2093 -U 5536 ; WX 988 ; N uni15A0 ; G 2094 -U 5537 ; WX 988 ; N uni15A1 ; G 2095 -U 5538 ; WX 931 ; N uni15A2 ; G 2096 -U 5539 ; WX 931 ; N uni15A3 ; G 2097 -U 5540 ; WX 931 ; N uni15A4 ; G 2098 -U 5541 ; WX 931 ; N uni15A5 ; G 2099 -U 5542 ; WX 660 ; N uni15A6 ; G 2100 -U 5543 ; WX 776 ; N uni15A7 ; G 2101 -U 5544 ; WX 776 ; N uni15A8 ; G 2102 -U 5545 ; WX 776 ; N uni15A9 ; G 2103 -U 5546 ; WX 776 ; N uni15AA ; G 2104 -U 5547 ; WX 776 ; N uni15AB ; G 2105 -U 5548 ; WX 776 ; N uni15AC ; G 2106 -U 5549 ; WX 776 ; N uni15AD ; G 2107 -U 5550 ; WX 495 ; N uni15AE ; G 2108 -U 5551 ; WX 743 ; N uni15AF ; G 2109 -U 5598 ; WX 830 ; N uni15DE ; G 2110 -U 5601 ; WX 830 ; N uni15E1 ; G 2111 -U 5702 ; WX 496 ; N uni1646 ; G 2112 -U 5703 ; WX 496 ; N uni1647 ; G 2113 -U 5742 ; WX 413 ; N uni166E ; G 2114 -U 5743 ; WX 1238 ; N uni166F ; G 2115 -U 5744 ; WX 1591 ; N uni1670 ; G 2116 -U 5745 ; WX 2016 ; N uni1671 ; G 2117 -U 5746 ; WX 2016 ; N uni1672 ; G 2118 -U 5747 ; WX 1720 ; N uni1673 ; G 2119 -U 5748 ; WX 1678 ; N uni1674 ; G 2120 -U 5749 ; WX 2016 ; N uni1675 ; G 2121 -U 5750 ; WX 2016 ; N uni1676 ; G 2122 -U 5760 ; WX 543 ; N uni1680 ; G 2123 -U 5761 ; WX 637 ; N uni1681 ; G 2124 -U 5762 ; WX 945 ; N uni1682 ; G 2125 -U 5763 ; WX 1254 ; N uni1683 ; G 2126 -U 5764 ; WX 1563 ; N uni1684 ; G 2127 -U 5765 ; WX 1871 ; N uni1685 ; G 2128 -U 5766 ; WX 627 ; N uni1686 ; G 2129 -U 5767 ; WX 936 ; N uni1687 ; G 2130 -U 5768 ; WX 1254 ; N uni1688 ; G 2131 -U 5769 ; WX 1559 ; N uni1689 ; G 2132 -U 5770 ; WX 1871 ; N uni168A ; G 2133 -U 5771 ; WX 569 ; N uni168B ; G 2134 -U 5772 ; WX 877 ; N uni168C ; G 2135 -U 5773 ; WX 1187 ; N uni168D ; G 2136 -U 5774 ; WX 1497 ; N uni168E ; G 2137 -U 5775 ; WX 1807 ; N uni168F ; G 2138 -U 5776 ; WX 637 ; N uni1690 ; G 2139 -U 5777 ; WX 945 ; N uni1691 ; G 2140 -U 5778 ; WX 1240 ; N uni1692 ; G 2141 -U 5779 ; WX 1555 ; N uni1693 ; G 2142 -U 5780 ; WX 1871 ; N uni1694 ; G 2143 -U 5781 ; WX 569 ; N uni1695 ; G 2144 -U 5782 ; WX 569 ; N uni1696 ; G 2145 -U 5783 ; WX 789 ; N uni1697 ; G 2146 -U 5784 ; WX 1234 ; N uni1698 ; G 2147 -U 5785 ; WX 1559 ; N uni1699 ; G 2148 -U 5786 ; WX 740 ; N uni169A ; G 2149 -U 5787 ; WX 638 ; N uni169B ; G 2150 -U 5788 ; WX 638 ; N uni169C ; G 2151 -U 7424 ; WX 652 ; N uni1D00 ; G 2152 -U 7425 ; WX 833 ; N uni1D01 ; G 2153 -U 7426 ; WX 1048 ; N uni1D02 ; G 2154 -U 7427 ; WX 608 ; N uni1D03 ; G 2155 -U 7428 ; WX 593 ; N uni1D04 ; G 2156 -U 7429 ; WX 676 ; N uni1D05 ; G 2157 -U 7430 ; WX 676 ; N uni1D06 ; G 2158 -U 7431 ; WX 559 ; N uni1D07 ; G 2159 -U 7432 ; WX 557 ; N uni1D08 ; G 2160 -U 7433 ; WX 343 ; N uni1D09 ; G 2161 -U 7434 ; WX 494 ; N uni1D0A ; G 2162 -U 7435 ; WX 665 ; N uni1D0B ; G 2163 -U 7436 ; WX 539 ; N uni1D0C ; G 2164 -U 7437 ; WX 817 ; N uni1D0D ; G 2165 -U 7438 ; WX 701 ; N uni1D0E ; G 2166 -U 7439 ; WX 687 ; N uni1D0F ; G 2167 -U 7440 ; WX 593 ; N uni1D10 ; G 2168 -U 7441 ; WX 660 ; N uni1D11 ; G 2169 -U 7442 ; WX 660 ; N uni1D12 ; G 2170 -U 7443 ; WX 660 ; N uni1D13 ; G 2171 -U 7444 ; WX 1094 ; N uni1D14 ; G 2172 -U 7446 ; WX 687 ; N uni1D16 ; G 2173 -U 7447 ; WX 687 ; N uni1D17 ; G 2174 -U 7448 ; WX 556 ; N uni1D18 ; G 2175 -U 7449 ; WX 642 ; N uni1D19 ; G 2176 -U 7450 ; WX 642 ; N uni1D1A ; G 2177 -U 7451 ; WX 580 ; N uni1D1B ; G 2178 -U 7452 ; WX 634 ; N uni1D1C ; G 2179 -U 7453 ; WX 737 ; N uni1D1D ; G 2180 -U 7454 ; WX 948 ; N uni1D1E ; G 2181 -U 7455 ; WX 695 ; N uni1D1F ; G 2182 -U 7456 ; WX 652 ; N uni1D20 ; G 2183 -U 7457 ; WX 924 ; N uni1D21 ; G 2184 -U 7458 ; WX 582 ; N uni1D22 ; G 2185 -U 7459 ; WX 646 ; N uni1D23 ; G 2186 -U 7462 ; WX 539 ; N uni1D26 ; G 2187 -U 7463 ; WX 652 ; N uni1D27 ; G 2188 -U 7464 ; WX 691 ; N uni1D28 ; G 2189 -U 7465 ; WX 556 ; N uni1D29 ; G 2190 -U 7466 ; WX 781 ; N uni1D2A ; G 2191 -U 7467 ; WX 732 ; N uni1D2B ; G 2192 -U 7468 ; WX 487 ; N uni1D2C ; G 2193 -U 7469 ; WX 683 ; N uni1D2D ; G 2194 -U 7470 ; WX 480 ; N uni1D2E ; G 2195 -U 7472 ; WX 523 ; N uni1D30 ; G 2196 -U 7473 ; WX 430 ; N uni1D31 ; G 2197 -U 7474 ; WX 430 ; N uni1D32 ; G 2198 -U 7475 ; WX 517 ; N uni1D33 ; G 2199 -U 7476 ; WX 527 ; N uni1D34 ; G 2200 -U 7477 ; WX 234 ; N uni1D35 ; G 2201 -U 7478 ; WX 234 ; N uni1D36 ; G 2202 -U 7479 ; WX 488 ; N uni1D37 ; G 2203 -U 7480 ; WX 401 ; N uni1D38 ; G 2204 -U 7481 ; WX 626 ; N uni1D39 ; G 2205 -U 7482 ; WX 527 ; N uni1D3A ; G 2206 -U 7483 ; WX 527 ; N uni1D3B ; G 2207 -U 7484 ; WX 535 ; N uni1D3C ; G 2208 -U 7485 ; WX 509 ; N uni1D3D ; G 2209 -U 7486 ; WX 461 ; N uni1D3E ; G 2210 -U 7487 ; WX 485 ; N uni1D3F ; G 2211 -U 7488 ; WX 430 ; N uni1D40 ; G 2212 -U 7489 ; WX 511 ; N uni1D41 ; G 2213 -U 7490 ; WX 695 ; N uni1D42 ; G 2214 -U 7491 ; WX 458 ; N uni1D43 ; G 2215 -U 7492 ; WX 458 ; N uni1D44 ; G 2216 -U 7493 ; WX 479 ; N uni1D45 ; G 2217 -U 7494 ; WX 712 ; N uni1D46 ; G 2218 -U 7495 ; WX 479 ; N uni1D47 ; G 2219 -U 7496 ; WX 479 ; N uni1D48 ; G 2220 -U 7497 ; WX 479 ; N uni1D49 ; G 2221 -U 7498 ; WX 479 ; N uni1D4A ; G 2222 -U 7499 ; WX 386 ; N uni1D4B ; G 2223 -U 7500 ; WX 386 ; N uni1D4C ; G 2224 -U 7501 ; WX 479 ; N uni1D4D ; G 2225 -U 7502 ; WX 219 ; N uni1D4E ; G 2226 -U 7503 ; WX 487 ; N uni1D4F ; G 2227 -U 7504 ; WX 664 ; N uni1D50 ; G 2228 -U 7505 ; WX 456 ; N uni1D51 ; G 2229 -U 7506 ; WX 488 ; N uni1D52 ; G 2230 -U 7507 ; WX 414 ; N uni1D53 ; G 2231 -U 7508 ; WX 488 ; N uni1D54 ; G 2232 -U 7509 ; WX 488 ; N uni1D55 ; G 2233 -U 7510 ; WX 479 ; N uni1D56 ; G 2234 -U 7511 ; WX 388 ; N uni1D57 ; G 2235 -U 7512 ; WX 456 ; N uni1D58 ; G 2236 -U 7513 ; WX 462 ; N uni1D59 ; G 2237 -U 7514 ; WX 664 ; N uni1D5A ; G 2238 -U 7515 ; WX 501 ; N uni1D5B ; G 2239 -U 7517 ; WX 451 ; N uni1D5D ; G 2240 -U 7518 ; WX 429 ; N uni1D5E ; G 2241 -U 7519 ; WX 433 ; N uni1D5F ; G 2242 -U 7520 ; WX 493 ; N uni1D60 ; G 2243 -U 7521 ; WX 406 ; N uni1D61 ; G 2244 -U 7522 ; WX 219 ; N uni1D62 ; G 2245 -U 7523 ; WX 315 ; N uni1D63 ; G 2246 -U 7524 ; WX 456 ; N uni1D64 ; G 2247 -U 7525 ; WX 501 ; N uni1D65 ; G 2248 -U 7526 ; WX 451 ; N uni1D66 ; G 2249 -U 7527 ; WX 429 ; N uni1D67 ; G 2250 -U 7528 ; WX 451 ; N uni1D68 ; G 2251 -U 7529 ; WX 493 ; N uni1D69 ; G 2252 -U 7530 ; WX 406 ; N uni1D6A ; G 2253 -U 7543 ; WX 716 ; N uni1D77 ; G 2254 -U 7544 ; WX 527 ; N uni1D78 ; G 2255 -U 7547 ; WX 545 ; N uni1D7B ; G 2256 -U 7549 ; WX 747 ; N uni1D7D ; G 2257 -U 7557 ; WX 514 ; N uni1D85 ; G 2258 -U 7579 ; WX 479 ; N uni1D9B ; G 2259 -U 7580 ; WX 414 ; N uni1D9C ; G 2260 -U 7581 ; WX 414 ; N uni1D9D ; G 2261 -U 7582 ; WX 488 ; N uni1D9E ; G 2262 -U 7583 ; WX 386 ; N uni1D9F ; G 2263 -U 7584 ; WX 377 ; N uni1DA0 ; G 2264 -U 7585 ; WX 348 ; N uni1DA1 ; G 2265 -U 7586 ; WX 479 ; N uni1DA2 ; G 2266 -U 7587 ; WX 456 ; N uni1DA3 ; G 2267 -U 7588 ; WX 347 ; N uni1DA4 ; G 2268 -U 7589 ; WX 281 ; N uni1DA5 ; G 2269 -U 7590 ; WX 347 ; N uni1DA6 ; G 2270 -U 7591 ; WX 347 ; N uni1DA7 ; G 2271 -U 7592 ; WX 431 ; N uni1DA8 ; G 2272 -U 7593 ; WX 326 ; N uni1DA9 ; G 2273 -U 7594 ; WX 330 ; N uni1DAA ; G 2274 -U 7595 ; WX 370 ; N uni1DAB ; G 2275 -U 7596 ; WX 664 ; N uni1DAC ; G 2276 -U 7597 ; WX 664 ; N uni1DAD ; G 2277 -U 7598 ; WX 562 ; N uni1DAE ; G 2278 -U 7599 ; WX 562 ; N uni1DAF ; G 2279 -U 7600 ; WX 448 ; N uni1DB0 ; G 2280 -U 7601 ; WX 488 ; N uni1DB1 ; G 2281 -U 7602 ; WX 542 ; N uni1DB2 ; G 2282 -U 7603 ; WX 422 ; N uni1DB3 ; G 2283 -U 7604 ; WX 396 ; N uni1DB4 ; G 2284 -U 7605 ; WX 388 ; N uni1DB5 ; G 2285 -U 7606 ; WX 583 ; N uni1DB6 ; G 2286 -U 7607 ; WX 494 ; N uni1DB7 ; G 2287 -U 7608 ; WX 399 ; N uni1DB8 ; G 2288 -U 7609 ; WX 451 ; N uni1DB9 ; G 2289 -U 7610 ; WX 501 ; N uni1DBA ; G 2290 -U 7611 ; WX 417 ; N uni1DBB ; G 2291 -U 7612 ; WX 523 ; N uni1DBC ; G 2292 -U 7613 ; WX 470 ; N uni1DBD ; G 2293 -U 7614 ; WX 455 ; N uni1DBE ; G 2294 -U 7615 ; WX 425 ; N uni1DBF ; G 2295 -U 7620 ; WX 0 ; N uni1DC4 ; G 2296 -U 7621 ; WX 0 ; N uni1DC5 ; G 2297 -U 7622 ; WX 0 ; N uni1DC6 ; G 2298 -U 7623 ; WX 0 ; N uni1DC7 ; G 2299 -U 7624 ; WX 0 ; N uni1DC8 ; G 2300 -U 7625 ; WX 0 ; N uni1DC9 ; G 2301 -U 7680 ; WX 774 ; N uni1E00 ; G 2302 -U 7681 ; WX 675 ; N uni1E01 ; G 2303 -U 7682 ; WX 762 ; N uni1E02 ; G 2304 -U 7683 ; WX 716 ; N uni1E03 ; G 2305 -U 7684 ; WX 762 ; N uni1E04 ; G 2306 -U 7685 ; WX 716 ; N uni1E05 ; G 2307 -U 7686 ; WX 762 ; N uni1E06 ; G 2308 -U 7687 ; WX 716 ; N uni1E07 ; G 2309 -U 7688 ; WX 734 ; N uni1E08 ; G 2310 -U 7689 ; WX 593 ; N uni1E09 ; G 2311 -U 7690 ; WX 830 ; N uni1E0A ; G 2312 -U 7691 ; WX 716 ; N uni1E0B ; G 2313 -U 7692 ; WX 830 ; N uni1E0C ; G 2314 -U 7693 ; WX 716 ; N uni1E0D ; G 2315 -U 7694 ; WX 830 ; N uni1E0E ; G 2316 -U 7695 ; WX 716 ; N uni1E0F ; G 2317 -U 7696 ; WX 830 ; N uni1E10 ; G 2318 -U 7697 ; WX 716 ; N uni1E11 ; G 2319 -U 7698 ; WX 830 ; N uni1E12 ; G 2320 -U 7699 ; WX 716 ; N uni1E13 ; G 2321 -U 7700 ; WX 683 ; N uni1E14 ; G 2322 -U 7701 ; WX 678 ; N uni1E15 ; G 2323 -U 7702 ; WX 683 ; N uni1E16 ; G 2324 -U 7703 ; WX 678 ; N uni1E17 ; G 2325 -U 7704 ; WX 683 ; N uni1E18 ; G 2326 -U 7705 ; WX 678 ; N uni1E19 ; G 2327 -U 7706 ; WX 683 ; N uni1E1A ; G 2328 -U 7707 ; WX 678 ; N uni1E1B ; G 2329 -U 7708 ; WX 683 ; N uni1E1C ; G 2330 -U 7709 ; WX 678 ; N uni1E1D ; G 2331 -U 7710 ; WX 683 ; N uni1E1E ; G 2332 -U 7711 ; WX 435 ; N uni1E1F ; G 2333 -U 7712 ; WX 821 ; N uni1E20 ; G 2334 -U 7713 ; WX 716 ; N uni1E21 ; G 2335 -U 7714 ; WX 837 ; N uni1E22 ; G 2336 -U 7715 ; WX 712 ; N uni1E23 ; G 2337 -U 7716 ; WX 837 ; N uni1E24 ; G 2338 -U 7717 ; WX 712 ; N uni1E25 ; G 2339 -U 7718 ; WX 837 ; N uni1E26 ; G 2340 -U 7719 ; WX 712 ; N uni1E27 ; G 2341 -U 7720 ; WX 837 ; N uni1E28 ; G 2342 -U 7721 ; WX 712 ; N uni1E29 ; G 2343 -U 7722 ; WX 837 ; N uni1E2A ; G 2344 -U 7723 ; WX 712 ; N uni1E2B ; G 2345 -U 7724 ; WX 372 ; N uni1E2C ; G 2346 -U 7725 ; WX 343 ; N uni1E2D ; G 2347 -U 7726 ; WX 372 ; N uni1E2E ; G 2348 -U 7727 ; WX 343 ; N uni1E2F ; G 2349 -U 7728 ; WX 775 ; N uni1E30 ; G 2350 -U 7729 ; WX 665 ; N uni1E31 ; G 2351 -U 7730 ; WX 775 ; N uni1E32 ; G 2352 -U 7731 ; WX 665 ; N uni1E33 ; G 2353 -U 7732 ; WX 775 ; N uni1E34 ; G 2354 -U 7733 ; WX 665 ; N uni1E35 ; G 2355 -U 7734 ; WX 637 ; N uni1E36 ; G 2356 -U 7735 ; WX 343 ; N uni1E37 ; G 2357 -U 7736 ; WX 637 ; N uni1E38 ; G 2358 -U 7737 ; WX 343 ; N uni1E39 ; G 2359 -U 7738 ; WX 637 ; N uni1E3A ; G 2360 -U 7739 ; WX 343 ; N uni1E3B ; G 2361 -U 7740 ; WX 637 ; N uni1E3C ; G 2362 -U 7741 ; WX 343 ; N uni1E3D ; G 2363 -U 7742 ; WX 995 ; N uni1E3E ; G 2364 -U 7743 ; WX 1042 ; N uni1E3F ; G 2365 -U 7744 ; WX 995 ; N uni1E40 ; G 2366 -U 7745 ; WX 1042 ; N uni1E41 ; G 2367 -U 7746 ; WX 995 ; N uni1E42 ; G 2368 -U 7747 ; WX 1042 ; N uni1E43 ; G 2369 -U 7748 ; WX 837 ; N uni1E44 ; G 2370 -U 7749 ; WX 712 ; N uni1E45 ; G 2371 -U 7750 ; WX 837 ; N uni1E46 ; G 2372 -U 7751 ; WX 712 ; N uni1E47 ; G 2373 -U 7752 ; WX 837 ; N uni1E48 ; G 2374 -U 7753 ; WX 712 ; N uni1E49 ; G 2375 -U 7754 ; WX 837 ; N uni1E4A ; G 2376 -U 7755 ; WX 712 ; N uni1E4B ; G 2377 -U 7756 ; WX 850 ; N uni1E4C ; G 2378 -U 7757 ; WX 687 ; N uni1E4D ; G 2379 -U 7758 ; WX 850 ; N uni1E4E ; G 2380 -U 7759 ; WX 687 ; N uni1E4F ; G 2381 -U 7760 ; WX 850 ; N uni1E50 ; G 2382 -U 7761 ; WX 687 ; N uni1E51 ; G 2383 -U 7762 ; WX 850 ; N uni1E52 ; G 2384 -U 7763 ; WX 687 ; N uni1E53 ; G 2385 -U 7764 ; WX 733 ; N uni1E54 ; G 2386 -U 7765 ; WX 716 ; N uni1E55 ; G 2387 -U 7766 ; WX 733 ; N uni1E56 ; G 2388 -U 7767 ; WX 716 ; N uni1E57 ; G 2389 -U 7768 ; WX 770 ; N uni1E58 ; G 2390 -U 7769 ; WX 493 ; N uni1E59 ; G 2391 -U 7770 ; WX 770 ; N uni1E5A ; G 2392 -U 7771 ; WX 493 ; N uni1E5B ; G 2393 -U 7772 ; WX 770 ; N uni1E5C ; G 2394 -U 7773 ; WX 493 ; N uni1E5D ; G 2395 -U 7774 ; WX 770 ; N uni1E5E ; G 2396 -U 7775 ; WX 493 ; N uni1E5F ; G 2397 -U 7776 ; WX 720 ; N uni1E60 ; G 2398 -U 7777 ; WX 595 ; N uni1E61 ; G 2399 -U 7778 ; WX 720 ; N uni1E62 ; G 2400 -U 7779 ; WX 595 ; N uni1E63 ; G 2401 -U 7780 ; WX 720 ; N uni1E64 ; G 2402 -U 7781 ; WX 595 ; N uni1E65 ; G 2403 -U 7782 ; WX 720 ; N uni1E66 ; G 2404 -U 7783 ; WX 595 ; N uni1E67 ; G 2405 -U 7784 ; WX 720 ; N uni1E68 ; G 2406 -U 7785 ; WX 595 ; N uni1E69 ; G 2407 -U 7786 ; WX 682 ; N uni1E6A ; G 2408 -U 7787 ; WX 478 ; N uni1E6B ; G 2409 -U 7788 ; WX 682 ; N uni1E6C ; G 2410 -U 7789 ; WX 478 ; N uni1E6D ; G 2411 -U 7790 ; WX 682 ; N uni1E6E ; G 2412 -U 7791 ; WX 478 ; N uni1E6F ; G 2413 -U 7792 ; WX 682 ; N uni1E70 ; G 2414 -U 7793 ; WX 478 ; N uni1E71 ; G 2415 -U 7794 ; WX 812 ; N uni1E72 ; G 2416 -U 7795 ; WX 712 ; N uni1E73 ; G 2417 -U 7796 ; WX 812 ; N uni1E74 ; G 2418 -U 7797 ; WX 712 ; N uni1E75 ; G 2419 -U 7798 ; WX 812 ; N uni1E76 ; G 2420 -U 7799 ; WX 712 ; N uni1E77 ; G 2421 -U 7800 ; WX 812 ; N uni1E78 ; G 2422 -U 7801 ; WX 712 ; N uni1E79 ; G 2423 -U 7802 ; WX 812 ; N uni1E7A ; G 2424 -U 7803 ; WX 712 ; N uni1E7B ; G 2425 -U 7804 ; WX 774 ; N uni1E7C ; G 2426 -U 7805 ; WX 652 ; N uni1E7D ; G 2427 -U 7806 ; WX 774 ; N uni1E7E ; G 2428 -U 7807 ; WX 652 ; N uni1E7F ; G 2429 -U 7808 ; WX 1103 ; N Wgrave ; G 2430 -U 7809 ; WX 924 ; N wgrave ; G 2431 -U 7810 ; WX 1103 ; N Wacute ; G 2432 -U 7811 ; WX 924 ; N wacute ; G 2433 -U 7812 ; WX 1103 ; N Wdieresis ; G 2434 -U 7813 ; WX 924 ; N wdieresis ; G 2435 -U 7814 ; WX 1103 ; N uni1E86 ; G 2436 -U 7815 ; WX 924 ; N uni1E87 ; G 2437 -U 7816 ; WX 1103 ; N uni1E88 ; G 2438 -U 7817 ; WX 924 ; N uni1E89 ; G 2439 -U 7818 ; WX 771 ; N uni1E8A ; G 2440 -U 7819 ; WX 645 ; N uni1E8B ; G 2441 -U 7820 ; WX 771 ; N uni1E8C ; G 2442 -U 7821 ; WX 645 ; N uni1E8D ; G 2443 -U 7822 ; WX 724 ; N uni1E8E ; G 2444 -U 7823 ; WX 652 ; N uni1E8F ; G 2445 -U 7824 ; WX 725 ; N uni1E90 ; G 2446 -U 7825 ; WX 582 ; N uni1E91 ; G 2447 -U 7826 ; WX 725 ; N uni1E92 ; G 2448 -U 7827 ; WX 582 ; N uni1E93 ; G 2449 -U 7828 ; WX 725 ; N uni1E94 ; G 2450 -U 7829 ; WX 582 ; N uni1E95 ; G 2451 -U 7830 ; WX 712 ; N uni1E96 ; G 2452 -U 7831 ; WX 478 ; N uni1E97 ; G 2453 -U 7832 ; WX 924 ; N uni1E98 ; G 2454 -U 7833 ; WX 652 ; N uni1E99 ; G 2455 -U 7834 ; WX 675 ; N uni1E9A ; G 2456 -U 7835 ; WX 435 ; N uni1E9B ; G 2457 -U 7836 ; WX 435 ; N uni1E9C ; G 2458 -U 7837 ; WX 435 ; N uni1E9D ; G 2459 -U 7838 ; WX 896 ; N uni1E9E ; G 2460 -U 7839 ; WX 687 ; N uni1E9F ; G 2461 -U 7840 ; WX 774 ; N uni1EA0 ; G 2462 -U 7841 ; WX 675 ; N uni1EA1 ; G 2463 -U 7842 ; WX 774 ; N uni1EA2 ; G 2464 -U 7843 ; WX 675 ; N uni1EA3 ; G 2465 -U 7844 ; WX 774 ; N uni1EA4 ; G 2466 -U 7845 ; WX 675 ; N uni1EA5 ; G 2467 -U 7846 ; WX 774 ; N uni1EA6 ; G 2468 -U 7847 ; WX 675 ; N uni1EA7 ; G 2469 -U 7848 ; WX 774 ; N uni1EA8 ; G 2470 -U 7849 ; WX 675 ; N uni1EA9 ; G 2471 -U 7850 ; WX 774 ; N uni1EAA ; G 2472 -U 7851 ; WX 675 ; N uni1EAB ; G 2473 -U 7852 ; WX 774 ; N uni1EAC ; G 2474 -U 7853 ; WX 675 ; N uni1EAD ; G 2475 -U 7854 ; WX 774 ; N uni1EAE ; G 2476 -U 7855 ; WX 675 ; N uni1EAF ; G 2477 -U 7856 ; WX 774 ; N uni1EB0 ; G 2478 -U 7857 ; WX 675 ; N uni1EB1 ; G 2479 -U 7858 ; WX 774 ; N uni1EB2 ; G 2480 -U 7859 ; WX 675 ; N uni1EB3 ; G 2481 -U 7860 ; WX 774 ; N uni1EB4 ; G 2482 -U 7861 ; WX 675 ; N uni1EB5 ; G 2483 -U 7862 ; WX 774 ; N uni1EB6 ; G 2484 -U 7863 ; WX 675 ; N uni1EB7 ; G 2485 -U 7864 ; WX 683 ; N uni1EB8 ; G 2486 -U 7865 ; WX 678 ; N uni1EB9 ; G 2487 -U 7866 ; WX 683 ; N uni1EBA ; G 2488 -U 7867 ; WX 678 ; N uni1EBB ; G 2489 -U 7868 ; WX 683 ; N uni1EBC ; G 2490 -U 7869 ; WX 678 ; N uni1EBD ; G 2491 -U 7870 ; WX 683 ; N uni1EBE ; G 2492 -U 7871 ; WX 678 ; N uni1EBF ; G 2493 -U 7872 ; WX 683 ; N uni1EC0 ; G 2494 -U 7873 ; WX 678 ; N uni1EC1 ; G 2495 -U 7874 ; WX 683 ; N uni1EC2 ; G 2496 -U 7875 ; WX 678 ; N uni1EC3 ; G 2497 -U 7876 ; WX 683 ; N uni1EC4 ; G 2498 -U 7877 ; WX 678 ; N uni1EC5 ; G 2499 -U 7878 ; WX 683 ; N uni1EC6 ; G 2500 -U 7879 ; WX 678 ; N uni1EC7 ; G 2501 -U 7880 ; WX 372 ; N uni1EC8 ; G 2502 -U 7881 ; WX 343 ; N uni1EC9 ; G 2503 -U 7882 ; WX 372 ; N uni1ECA ; G 2504 -U 7883 ; WX 343 ; N uni1ECB ; G 2505 -U 7884 ; WX 850 ; N uni1ECC ; G 2506 -U 7885 ; WX 687 ; N uni1ECD ; G 2507 -U 7886 ; WX 850 ; N uni1ECE ; G 2508 -U 7887 ; WX 687 ; N uni1ECF ; G 2509 -U 7888 ; WX 850 ; N uni1ED0 ; G 2510 -U 7889 ; WX 687 ; N uni1ED1 ; G 2511 -U 7890 ; WX 850 ; N uni1ED2 ; G 2512 -U 7891 ; WX 687 ; N uni1ED3 ; G 2513 -U 7892 ; WX 850 ; N uni1ED4 ; G 2514 -U 7893 ; WX 687 ; N uni1ED5 ; G 2515 -U 7894 ; WX 850 ; N uni1ED6 ; G 2516 -U 7895 ; WX 687 ; N uni1ED7 ; G 2517 -U 7896 ; WX 850 ; N uni1ED8 ; G 2518 -U 7897 ; WX 687 ; N uni1ED9 ; G 2519 -U 7898 ; WX 874 ; N uni1EDA ; G 2520 -U 7899 ; WX 687 ; N uni1EDB ; G 2521 -U 7900 ; WX 874 ; N uni1EDC ; G 2522 -U 7901 ; WX 687 ; N uni1EDD ; G 2523 -U 7902 ; WX 874 ; N uni1EDE ; G 2524 -U 7903 ; WX 687 ; N uni1EDF ; G 2525 -U 7904 ; WX 874 ; N uni1EE0 ; G 2526 -U 7905 ; WX 687 ; N uni1EE1 ; G 2527 -U 7906 ; WX 874 ; N uni1EE2 ; G 2528 -U 7907 ; WX 687 ; N uni1EE3 ; G 2529 -U 7908 ; WX 812 ; N uni1EE4 ; G 2530 -U 7909 ; WX 712 ; N uni1EE5 ; G 2531 -U 7910 ; WX 812 ; N uni1EE6 ; G 2532 -U 7911 ; WX 712 ; N uni1EE7 ; G 2533 -U 7912 ; WX 835 ; N uni1EE8 ; G 2534 -U 7913 ; WX 712 ; N uni1EE9 ; G 2535 -U 7914 ; WX 835 ; N uni1EEA ; G 2536 -U 7915 ; WX 712 ; N uni1EEB ; G 2537 -U 7916 ; WX 835 ; N uni1EEC ; G 2538 -U 7917 ; WX 712 ; N uni1EED ; G 2539 -U 7918 ; WX 835 ; N uni1EEE ; G 2540 -U 7919 ; WX 712 ; N uni1EEF ; G 2541 -U 7920 ; WX 835 ; N uni1EF0 ; G 2542 -U 7921 ; WX 712 ; N uni1EF1 ; G 2543 -U 7922 ; WX 724 ; N Ygrave ; G 2544 -U 7923 ; WX 652 ; N ygrave ; G 2545 -U 7924 ; WX 724 ; N uni1EF4 ; G 2546 -U 7925 ; WX 652 ; N uni1EF5 ; G 2547 -U 7926 ; WX 724 ; N uni1EF6 ; G 2548 -U 7927 ; WX 652 ; N uni1EF7 ; G 2549 -U 7928 ; WX 724 ; N uni1EF8 ; G 2550 -U 7929 ; WX 652 ; N uni1EF9 ; G 2551 -U 7930 ; WX 953 ; N uni1EFA ; G 2552 -U 7931 ; WX 644 ; N uni1EFB ; G 2553 -U 7936 ; WX 687 ; N uni1F00 ; G 2554 -U 7937 ; WX 687 ; N uni1F01 ; G 2555 -U 7938 ; WX 687 ; N uni1F02 ; G 2556 -U 7939 ; WX 687 ; N uni1F03 ; G 2557 -U 7940 ; WX 687 ; N uni1F04 ; G 2558 -U 7941 ; WX 687 ; N uni1F05 ; G 2559 -U 7942 ; WX 687 ; N uni1F06 ; G 2560 -U 7943 ; WX 687 ; N uni1F07 ; G 2561 -U 7944 ; WX 774 ; N uni1F08 ; G 2562 -U 7945 ; WX 774 ; N uni1F09 ; G 2563 -U 7946 ; WX 1041 ; N uni1F0A ; G 2564 -U 7947 ; WX 1043 ; N uni1F0B ; G 2565 -U 7948 ; WX 935 ; N uni1F0C ; G 2566 -U 7949 ; WX 963 ; N uni1F0D ; G 2567 -U 7950 ; WX 835 ; N uni1F0E ; G 2568 -U 7951 ; WX 859 ; N uni1F0F ; G 2569 -U 7952 ; WX 557 ; N uni1F10 ; G 2570 -U 7953 ; WX 557 ; N uni1F11 ; G 2571 -U 7954 ; WX 557 ; N uni1F12 ; G 2572 -U 7955 ; WX 557 ; N uni1F13 ; G 2573 -U 7956 ; WX 557 ; N uni1F14 ; G 2574 -U 7957 ; WX 557 ; N uni1F15 ; G 2575 -U 7960 ; WX 792 ; N uni1F18 ; G 2576 -U 7961 ; WX 794 ; N uni1F19 ; G 2577 -U 7962 ; WX 1100 ; N uni1F1A ; G 2578 -U 7963 ; WX 1096 ; N uni1F1B ; G 2579 -U 7964 ; WX 1023 ; N uni1F1C ; G 2580 -U 7965 ; WX 1052 ; N uni1F1D ; G 2581 -U 7968 ; WX 712 ; N uni1F20 ; G 2582 -U 7969 ; WX 712 ; N uni1F21 ; G 2583 -U 7970 ; WX 712 ; N uni1F22 ; G 2584 -U 7971 ; WX 712 ; N uni1F23 ; G 2585 -U 7972 ; WX 712 ; N uni1F24 ; G 2586 -U 7973 ; WX 712 ; N uni1F25 ; G 2587 -U 7974 ; WX 712 ; N uni1F26 ; G 2588 -U 7975 ; WX 712 ; N uni1F27 ; G 2589 -U 7976 ; WX 945 ; N uni1F28 ; G 2590 -U 7977 ; WX 951 ; N uni1F29 ; G 2591 -U 7978 ; WX 1250 ; N uni1F2A ; G 2592 -U 7979 ; WX 1250 ; N uni1F2B ; G 2593 -U 7980 ; WX 1180 ; N uni1F2C ; G 2594 -U 7981 ; WX 1206 ; N uni1F2D ; G 2595 -U 7982 ; WX 1054 ; N uni1F2E ; G 2596 -U 7983 ; WX 1063 ; N uni1F2F ; G 2597 -U 7984 ; WX 390 ; N uni1F30 ; G 2598 -U 7985 ; WX 390 ; N uni1F31 ; G 2599 -U 7986 ; WX 390 ; N uni1F32 ; G 2600 -U 7987 ; WX 390 ; N uni1F33 ; G 2601 -U 7988 ; WX 390 ; N uni1F34 ; G 2602 -U 7989 ; WX 390 ; N uni1F35 ; G 2603 -U 7990 ; WX 390 ; N uni1F36 ; G 2604 -U 7991 ; WX 390 ; N uni1F37 ; G 2605 -U 7992 ; WX 483 ; N uni1F38 ; G 2606 -U 7993 ; WX 489 ; N uni1F39 ; G 2607 -U 7994 ; WX 777 ; N uni1F3A ; G 2608 -U 7995 ; WX 785 ; N uni1F3B ; G 2609 -U 7996 ; WX 712 ; N uni1F3C ; G 2610 -U 7997 ; WX 738 ; N uni1F3D ; G 2611 -U 7998 ; WX 604 ; N uni1F3E ; G 2612 -U 7999 ; WX 604 ; N uni1F3F ; G 2613 -U 8000 ; WX 687 ; N uni1F40 ; G 2614 -U 8001 ; WX 687 ; N uni1F41 ; G 2615 -U 8002 ; WX 687 ; N uni1F42 ; G 2616 -U 8003 ; WX 687 ; N uni1F43 ; G 2617 -U 8004 ; WX 687 ; N uni1F44 ; G 2618 -U 8005 ; WX 687 ; N uni1F45 ; G 2619 -U 8008 ; WX 892 ; N uni1F48 ; G 2620 -U 8009 ; WX 933 ; N uni1F49 ; G 2621 -U 8010 ; WX 1221 ; N uni1F4A ; G 2622 -U 8011 ; WX 1224 ; N uni1F4B ; G 2623 -U 8012 ; WX 1053 ; N uni1F4C ; G 2624 -U 8013 ; WX 1082 ; N uni1F4D ; G 2625 -U 8016 ; WX 675 ; N uni1F50 ; G 2626 -U 8017 ; WX 675 ; N uni1F51 ; G 2627 -U 8018 ; WX 675 ; N uni1F52 ; G 2628 -U 8019 ; WX 675 ; N uni1F53 ; G 2629 -U 8020 ; WX 675 ; N uni1F54 ; G 2630 -U 8021 ; WX 675 ; N uni1F55 ; G 2631 -U 8022 ; WX 675 ; N uni1F56 ; G 2632 -U 8023 ; WX 675 ; N uni1F57 ; G 2633 -U 8025 ; WX 930 ; N uni1F59 ; G 2634 -U 8027 ; WX 1184 ; N uni1F5B ; G 2635 -U 8029 ; WX 1199 ; N uni1F5D ; G 2636 -U 8031 ; WX 1049 ; N uni1F5F ; G 2637 -U 8032 ; WX 869 ; N uni1F60 ; G 2638 -U 8033 ; WX 869 ; N uni1F61 ; G 2639 -U 8034 ; WX 869 ; N uni1F62 ; G 2640 -U 8035 ; WX 869 ; N uni1F63 ; G 2641 -U 8036 ; WX 869 ; N uni1F64 ; G 2642 -U 8037 ; WX 869 ; N uni1F65 ; G 2643 -U 8038 ; WX 869 ; N uni1F66 ; G 2644 -U 8039 ; WX 869 ; N uni1F67 ; G 2645 -U 8040 ; WX 909 ; N uni1F68 ; G 2646 -U 8041 ; WX 958 ; N uni1F69 ; G 2647 -U 8042 ; WX 1246 ; N uni1F6A ; G 2648 -U 8043 ; WX 1251 ; N uni1F6B ; G 2649 -U 8044 ; WX 1076 ; N uni1F6C ; G 2650 -U 8045 ; WX 1105 ; N uni1F6D ; G 2651 -U 8046 ; WX 1028 ; N uni1F6E ; G 2652 -U 8047 ; WX 1076 ; N uni1F6F ; G 2653 -U 8048 ; WX 687 ; N uni1F70 ; G 2654 -U 8049 ; WX 687 ; N uni1F71 ; G 2655 -U 8050 ; WX 557 ; N uni1F72 ; G 2656 -U 8051 ; WX 557 ; N uni1F73 ; G 2657 -U 8052 ; WX 712 ; N uni1F74 ; G 2658 -U 8053 ; WX 712 ; N uni1F75 ; G 2659 -U 8054 ; WX 390 ; N uni1F76 ; G 2660 -U 8055 ; WX 390 ; N uni1F77 ; G 2661 -U 8056 ; WX 687 ; N uni1F78 ; G 2662 -U 8057 ; WX 687 ; N uni1F79 ; G 2663 -U 8058 ; WX 675 ; N uni1F7A ; G 2664 -U 8059 ; WX 675 ; N uni1F7B ; G 2665 -U 8060 ; WX 869 ; N uni1F7C ; G 2666 -U 8061 ; WX 869 ; N uni1F7D ; G 2667 -U 8064 ; WX 687 ; N uni1F80 ; G 2668 -U 8065 ; WX 687 ; N uni1F81 ; G 2669 -U 8066 ; WX 687 ; N uni1F82 ; G 2670 -U 8067 ; WX 687 ; N uni1F83 ; G 2671 -U 8068 ; WX 687 ; N uni1F84 ; G 2672 -U 8069 ; WX 687 ; N uni1F85 ; G 2673 -U 8070 ; WX 687 ; N uni1F86 ; G 2674 -U 8071 ; WX 687 ; N uni1F87 ; G 2675 -U 8072 ; WX 774 ; N uni1F88 ; G 2676 -U 8073 ; WX 774 ; N uni1F89 ; G 2677 -U 8074 ; WX 1041 ; N uni1F8A ; G 2678 -U 8075 ; WX 1043 ; N uni1F8B ; G 2679 -U 8076 ; WX 935 ; N uni1F8C ; G 2680 -U 8077 ; WX 963 ; N uni1F8D ; G 2681 -U 8078 ; WX 835 ; N uni1F8E ; G 2682 -U 8079 ; WX 859 ; N uni1F8F ; G 2683 -U 8080 ; WX 712 ; N uni1F90 ; G 2684 -U 8081 ; WX 712 ; N uni1F91 ; G 2685 -U 8082 ; WX 712 ; N uni1F92 ; G 2686 -U 8083 ; WX 712 ; N uni1F93 ; G 2687 -U 8084 ; WX 712 ; N uni1F94 ; G 2688 -U 8085 ; WX 712 ; N uni1F95 ; G 2689 -U 8086 ; WX 712 ; N uni1F96 ; G 2690 -U 8087 ; WX 712 ; N uni1F97 ; G 2691 -U 8088 ; WX 945 ; N uni1F98 ; G 2692 -U 8089 ; WX 951 ; N uni1F99 ; G 2693 -U 8090 ; WX 1250 ; N uni1F9A ; G 2694 -U 8091 ; WX 1250 ; N uni1F9B ; G 2695 -U 8092 ; WX 1180 ; N uni1F9C ; G 2696 -U 8093 ; WX 1206 ; N uni1F9D ; G 2697 -U 8094 ; WX 1054 ; N uni1F9E ; G 2698 -U 8095 ; WX 1063 ; N uni1F9F ; G 2699 -U 8096 ; WX 869 ; N uni1FA0 ; G 2700 -U 8097 ; WX 869 ; N uni1FA1 ; G 2701 -U 8098 ; WX 869 ; N uni1FA2 ; G 2702 -U 8099 ; WX 869 ; N uni1FA3 ; G 2703 -U 8100 ; WX 869 ; N uni1FA4 ; G 2704 -U 8101 ; WX 869 ; N uni1FA5 ; G 2705 -U 8102 ; WX 869 ; N uni1FA6 ; G 2706 -U 8103 ; WX 869 ; N uni1FA7 ; G 2707 -U 8104 ; WX 909 ; N uni1FA8 ; G 2708 -U 8105 ; WX 958 ; N uni1FA9 ; G 2709 -U 8106 ; WX 1246 ; N uni1FAA ; G 2710 -U 8107 ; WX 1251 ; N uni1FAB ; G 2711 -U 8108 ; WX 1076 ; N uni1FAC ; G 2712 -U 8109 ; WX 1105 ; N uni1FAD ; G 2713 -U 8110 ; WX 1028 ; N uni1FAE ; G 2714 -U 8111 ; WX 1076 ; N uni1FAF ; G 2715 -U 8112 ; WX 687 ; N uni1FB0 ; G 2716 -U 8113 ; WX 687 ; N uni1FB1 ; G 2717 -U 8114 ; WX 687 ; N uni1FB2 ; G 2718 -U 8115 ; WX 687 ; N uni1FB3 ; G 2719 -U 8116 ; WX 687 ; N uni1FB4 ; G 2720 -U 8118 ; WX 687 ; N uni1FB6 ; G 2721 -U 8119 ; WX 687 ; N uni1FB7 ; G 2722 -U 8120 ; WX 774 ; N uni1FB8 ; G 2723 -U 8121 ; WX 774 ; N uni1FB9 ; G 2724 -U 8122 ; WX 876 ; N uni1FBA ; G 2725 -U 8123 ; WX 797 ; N uni1FBB ; G 2726 -U 8124 ; WX 774 ; N uni1FBC ; G 2727 -U 8125 ; WX 500 ; N uni1FBD ; G 2728 -U 8126 ; WX 500 ; N uni1FBE ; G 2729 -U 8127 ; WX 500 ; N uni1FBF ; G 2730 -U 8128 ; WX 500 ; N uni1FC0 ; G 2731 -U 8129 ; WX 500 ; N uni1FC1 ; G 2732 -U 8130 ; WX 712 ; N uni1FC2 ; G 2733 -U 8131 ; WX 712 ; N uni1FC3 ; G 2734 -U 8132 ; WX 712 ; N uni1FC4 ; G 2735 -U 8134 ; WX 712 ; N uni1FC6 ; G 2736 -U 8135 ; WX 712 ; N uni1FC7 ; G 2737 -U 8136 ; WX 929 ; N uni1FC8 ; G 2738 -U 8137 ; WX 846 ; N uni1FC9 ; G 2739 -U 8138 ; WX 1080 ; N uni1FCA ; G 2740 -U 8139 ; WX 1009 ; N uni1FCB ; G 2741 -U 8140 ; WX 837 ; N uni1FCC ; G 2742 -U 8141 ; WX 500 ; N uni1FCD ; G 2743 -U 8142 ; WX 500 ; N uni1FCE ; G 2744 -U 8143 ; WX 500 ; N uni1FCF ; G 2745 -U 8144 ; WX 390 ; N uni1FD0 ; G 2746 -U 8145 ; WX 390 ; N uni1FD1 ; G 2747 -U 8146 ; WX 390 ; N uni1FD2 ; G 2748 -U 8147 ; WX 390 ; N uni1FD3 ; G 2749 -U 8150 ; WX 390 ; N uni1FD6 ; G 2750 -U 8151 ; WX 390 ; N uni1FD7 ; G 2751 -U 8152 ; WX 372 ; N uni1FD8 ; G 2752 -U 8153 ; WX 372 ; N uni1FD9 ; G 2753 -U 8154 ; WX 621 ; N uni1FDA ; G 2754 -U 8155 ; WX 563 ; N uni1FDB ; G 2755 -U 8157 ; WX 500 ; N uni1FDD ; G 2756 -U 8158 ; WX 500 ; N uni1FDE ; G 2757 -U 8159 ; WX 500 ; N uni1FDF ; G 2758 -U 8160 ; WX 675 ; N uni1FE0 ; G 2759 -U 8161 ; WX 675 ; N uni1FE1 ; G 2760 -U 8162 ; WX 675 ; N uni1FE2 ; G 2761 -U 8163 ; WX 675 ; N uni1FE3 ; G 2762 -U 8164 ; WX 716 ; N uni1FE4 ; G 2763 -U 8165 ; WX 716 ; N uni1FE5 ; G 2764 -U 8166 ; WX 675 ; N uni1FE6 ; G 2765 -U 8167 ; WX 675 ; N uni1FE7 ; G 2766 -U 8168 ; WX 724 ; N uni1FE8 ; G 2767 -U 8169 ; WX 724 ; N uni1FE9 ; G 2768 -U 8170 ; WX 1020 ; N uni1FEA ; G 2769 -U 8171 ; WX 980 ; N uni1FEB ; G 2770 -U 8172 ; WX 838 ; N uni1FEC ; G 2771 -U 8173 ; WX 500 ; N uni1FED ; G 2772 -U 8174 ; WX 500 ; N uni1FEE ; G 2773 -U 8175 ; WX 500 ; N uni1FEF ; G 2774 -U 8178 ; WX 869 ; N uni1FF2 ; G 2775 -U 8179 ; WX 869 ; N uni1FF3 ; G 2776 -U 8180 ; WX 869 ; N uni1FF4 ; G 2777 -U 8182 ; WX 869 ; N uni1FF6 ; G 2778 -U 8183 ; WX 869 ; N uni1FF7 ; G 2779 -U 8184 ; WX 1065 ; N uni1FF8 ; G 2780 -U 8185 ; WX 891 ; N uni1FF9 ; G 2781 -U 8186 ; WX 1084 ; N uni1FFA ; G 2782 -U 8187 ; WX 894 ; N uni1FFB ; G 2783 -U 8188 ; WX 850 ; N uni1FFC ; G 2784 -U 8189 ; WX 500 ; N uni1FFD ; G 2785 -U 8190 ; WX 500 ; N uni1FFE ; G 2786 -U 8192 ; WX 500 ; N uni2000 ; G 2787 -U 8193 ; WX 1000 ; N uni2001 ; G 2788 -U 8194 ; WX 500 ; N uni2002 ; G 2789 -U 8195 ; WX 1000 ; N uni2003 ; G 2790 -U 8196 ; WX 330 ; N uni2004 ; G 2791 -U 8197 ; WX 250 ; N uni2005 ; G 2792 -U 8198 ; WX 167 ; N uni2006 ; G 2793 -U 8199 ; WX 696 ; N uni2007 ; G 2794 -U 8200 ; WX 380 ; N uni2008 ; G 2795 -U 8201 ; WX 200 ; N uni2009 ; G 2796 -U 8202 ; WX 100 ; N uni200A ; G 2797 -U 8203 ; WX 0 ; N uni200B ; G 2798 -U 8204 ; WX 0 ; N uni200C ; G 2799 -U 8205 ; WX 0 ; N uni200D ; G 2800 -U 8206 ; WX 0 ; N uni200E ; G 2801 -U 8207 ; WX 0 ; N uni200F ; G 2802 -U 8208 ; WX 415 ; N uni2010 ; G 2803 -U 8209 ; WX 415 ; N uni2011 ; G 2804 -U 8210 ; WX 696 ; N figuredash ; G 2805 -U 8211 ; WX 500 ; N endash ; G 2806 -U 8212 ; WX 1000 ; N emdash ; G 2807 -U 8213 ; WX 1000 ; N uni2015 ; G 2808 -U 8214 ; WX 500 ; N uni2016 ; G 2809 -U 8215 ; WX 500 ; N underscoredbl ; G 2810 -U 8216 ; WX 380 ; N quoteleft ; G 2811 -U 8217 ; WX 380 ; N quoteright ; G 2812 -U 8218 ; WX 380 ; N quotesinglbase ; G 2813 -U 8219 ; WX 380 ; N quotereversed ; G 2814 -U 8220 ; WX 657 ; N quotedblleft ; G 2815 -U 8221 ; WX 657 ; N quotedblright ; G 2816 -U 8222 ; WX 657 ; N quotedblbase ; G 2817 -U 8223 ; WX 657 ; N uni201F ; G 2818 -U 8224 ; WX 500 ; N dagger ; G 2819 -U 8225 ; WX 500 ; N daggerdbl ; G 2820 -U 8226 ; WX 639 ; N bullet ; G 2821 -U 8227 ; WX 639 ; N uni2023 ; G 2822 -U 8228 ; WX 333 ; N onedotenleader ; G 2823 -U 8229 ; WX 667 ; N twodotenleader ; G 2824 -U 8230 ; WX 1000 ; N ellipsis ; G 2825 -U 8231 ; WX 348 ; N uni2027 ; G 2826 -U 8232 ; WX 0 ; N uni2028 ; G 2827 -U 8233 ; WX 0 ; N uni2029 ; G 2828 -U 8234 ; WX 0 ; N uni202A ; G 2829 -U 8235 ; WX 0 ; N uni202B ; G 2830 -U 8236 ; WX 0 ; N uni202C ; G 2831 -U 8237 ; WX 0 ; N uni202D ; G 2832 -U 8238 ; WX 0 ; N uni202E ; G 2833 -U 8239 ; WX 200 ; N uni202F ; G 2834 -U 8240 ; WX 1440 ; N perthousand ; G 2835 -U 8241 ; WX 1887 ; N uni2031 ; G 2836 -U 8242 ; WX 264 ; N minute ; G 2837 -U 8243 ; WX 447 ; N second ; G 2838 -U 8244 ; WX 630 ; N uni2034 ; G 2839 -U 8245 ; WX 264 ; N uni2035 ; G 2840 -U 8246 ; WX 447 ; N uni2036 ; G 2841 -U 8247 ; WX 630 ; N uni2037 ; G 2842 -U 8248 ; WX 733 ; N uni2038 ; G 2843 -U 8249 ; WX 412 ; N guilsinglleft ; G 2844 -U 8250 ; WX 412 ; N guilsinglright ; G 2845 -U 8251 ; WX 972 ; N uni203B ; G 2846 -U 8252 ; WX 627 ; N exclamdbl ; G 2847 -U 8253 ; WX 580 ; N uni203D ; G 2848 -U 8254 ; WX 500 ; N uni203E ; G 2849 -U 8255 ; WX 828 ; N uni203F ; G 2850 -U 8256 ; WX 828 ; N uni2040 ; G 2851 -U 8257 ; WX 329 ; N uni2041 ; G 2852 -U 8258 ; WX 1023 ; N uni2042 ; G 2853 -U 8259 ; WX 500 ; N uni2043 ; G 2854 -U 8260 ; WX 167 ; N fraction ; G 2855 -U 8261 ; WX 457 ; N uni2045 ; G 2856 -U 8262 ; WX 457 ; N uni2046 ; G 2857 -U 8263 ; WX 1030 ; N uni2047 ; G 2858 -U 8264 ; WX 829 ; N uni2048 ; G 2859 -U 8265 ; WX 829 ; N uni2049 ; G 2860 -U 8266 ; WX 513 ; N uni204A ; G 2861 -U 8267 ; WX 636 ; N uni204B ; G 2862 -U 8268 ; WX 500 ; N uni204C ; G 2863 -U 8269 ; WX 500 ; N uni204D ; G 2864 -U 8270 ; WX 523 ; N uni204E ; G 2865 -U 8271 ; WX 400 ; N uni204F ; G 2866 -U 8272 ; WX 828 ; N uni2050 ; G 2867 -U 8273 ; WX 523 ; N uni2051 ; G 2868 -U 8274 ; WX 556 ; N uni2052 ; G 2869 -U 8275 ; WX 1000 ; N uni2053 ; G 2870 -U 8276 ; WX 828 ; N uni2054 ; G 2871 -U 8277 ; WX 838 ; N uni2055 ; G 2872 -U 8278 ; WX 684 ; N uni2056 ; G 2873 -U 8279 ; WX 813 ; N uni2057 ; G 2874 -U 8280 ; WX 838 ; N uni2058 ; G 2875 -U 8281 ; WX 838 ; N uni2059 ; G 2876 -U 8282 ; WX 380 ; N uni205A ; G 2877 -U 8283 ; WX 872 ; N uni205B ; G 2878 -U 8284 ; WX 838 ; N uni205C ; G 2879 -U 8285 ; WX 380 ; N uni205D ; G 2880 -U 8286 ; WX 380 ; N uni205E ; G 2881 -U 8287 ; WX 222 ; N uni205F ; G 2882 -U 8288 ; WX 0 ; N uni2060 ; G 2883 -U 8289 ; WX 0 ; N uni2061 ; G 2884 -U 8290 ; WX 0 ; N uni2062 ; G 2885 -U 8291 ; WX 0 ; N uni2063 ; G 2886 -U 8292 ; WX 0 ; N uni2064 ; G 2887 -U 8298 ; WX 0 ; N uni206A ; G 2888 -U 8299 ; WX 0 ; N uni206B ; G 2889 -U 8300 ; WX 0 ; N uni206C ; G 2890 -U 8301 ; WX 0 ; N uni206D ; G 2891 -U 8302 ; WX 0 ; N uni206E ; G 2892 -U 8303 ; WX 0 ; N uni206F ; G 2893 -U 8304 ; WX 438 ; N uni2070 ; G 2894 -U 8305 ; WX 219 ; N uni2071 ; G 2895 -U 8308 ; WX 438 ; N uni2074 ; G 2896 -U 8309 ; WX 438 ; N uni2075 ; G 2897 -U 8310 ; WX 438 ; N uni2076 ; G 2898 -U 8311 ; WX 438 ; N uni2077 ; G 2899 -U 8312 ; WX 438 ; N uni2078 ; G 2900 -U 8313 ; WX 438 ; N uni2079 ; G 2901 -U 8314 ; WX 528 ; N uni207A ; G 2902 -U 8315 ; WX 528 ; N uni207B ; G 2903 -U 8316 ; WX 528 ; N uni207C ; G 2904 -U 8317 ; WX 288 ; N uni207D ; G 2905 -U 8318 ; WX 288 ; N uni207E ; G 2906 -U 8319 ; WX 456 ; N uni207F ; G 2907 -U 8320 ; WX 438 ; N uni2080 ; G 2908 -U 8321 ; WX 438 ; N uni2081 ; G 2909 -U 8322 ; WX 438 ; N uni2082 ; G 2910 -U 8323 ; WX 438 ; N uni2083 ; G 2911 -U 8324 ; WX 438 ; N uni2084 ; G 2912 -U 8325 ; WX 438 ; N uni2085 ; G 2913 -U 8326 ; WX 438 ; N uni2086 ; G 2914 -U 8327 ; WX 438 ; N uni2087 ; G 2915 -U 8328 ; WX 438 ; N uni2088 ; G 2916 -U 8329 ; WX 438 ; N uni2089 ; G 2917 -U 8330 ; WX 528 ; N uni208A ; G 2918 -U 8331 ; WX 528 ; N uni208B ; G 2919 -U 8332 ; WX 528 ; N uni208C ; G 2920 -U 8333 ; WX 288 ; N uni208D ; G 2921 -U 8334 ; WX 288 ; N uni208E ; G 2922 -U 8336 ; WX 458 ; N uni2090 ; G 2923 -U 8337 ; WX 479 ; N uni2091 ; G 2924 -U 8338 ; WX 488 ; N uni2092 ; G 2925 -U 8339 ; WX 413 ; N uni2093 ; G 2926 -U 8340 ; WX 479 ; N uni2094 ; G 2927 -U 8341 ; WX 456 ; N uni2095 ; G 2928 -U 8342 ; WX 487 ; N uni2096 ; G 2929 -U 8343 ; WX 219 ; N uni2097 ; G 2930 -U 8344 ; WX 664 ; N uni2098 ; G 2931 -U 8345 ; WX 456 ; N uni2099 ; G 2932 -U 8346 ; WX 479 ; N uni209A ; G 2933 -U 8347 ; WX 381 ; N uni209B ; G 2934 -U 8348 ; WX 388 ; N uni209C ; G 2935 -U 8352 ; WX 929 ; N uni20A0 ; G 2936 -U 8353 ; WX 696 ; N colonmonetary ; G 2937 -U 8354 ; WX 696 ; N uni20A2 ; G 2938 -U 8355 ; WX 696 ; N franc ; G 2939 -U 8356 ; WX 696 ; N lira ; G 2940 -U 8357 ; WX 1042 ; N uni20A5 ; G 2941 -U 8358 ; WX 696 ; N uni20A6 ; G 2942 -U 8359 ; WX 1518 ; N peseta ; G 2943 -U 8360 ; WX 1205 ; N uni20A8 ; G 2944 -U 8361 ; WX 1103 ; N uni20A9 ; G 2945 -U 8362 ; WX 904 ; N uni20AA ; G 2946 -U 8363 ; WX 696 ; N dong ; G 2947 -U 8364 ; WX 696 ; N Euro ; G 2948 -U 8365 ; WX 696 ; N uni20AD ; G 2949 -U 8366 ; WX 696 ; N uni20AE ; G 2950 -U 8367 ; WX 1392 ; N uni20AF ; G 2951 -U 8368 ; WX 696 ; N uni20B0 ; G 2952 -U 8369 ; WX 696 ; N uni20B1 ; G 2953 -U 8370 ; WX 696 ; N uni20B2 ; G 2954 -U 8371 ; WX 696 ; N uni20B3 ; G 2955 -U 8372 ; WX 859 ; N uni20B4 ; G 2956 -U 8373 ; WX 696 ; N uni20B5 ; G 2957 -U 8376 ; WX 696 ; N uni20B8 ; G 2958 -U 8377 ; WX 696 ; N uni20B9 ; G 2959 -U 8378 ; WX 696 ; N uni20BA ; G 2960 -U 8381 ; WX 696 ; N uni20BD ; G 2961 -U 8400 ; WX 0 ; N uni20D0 ; G 2962 -U 8401 ; WX 0 ; N uni20D1 ; G 2963 -U 8406 ; WX 0 ; N uni20D6 ; G 2964 -U 8407 ; WX 0 ; N uni20D7 ; G 2965 -U 8411 ; WX 0 ; N uni20DB ; G 2966 -U 8412 ; WX 0 ; N uni20DC ; G 2967 -U 8417 ; WX 0 ; N uni20E1 ; G 2968 -U 8448 ; WX 1120 ; N uni2100 ; G 2969 -U 8449 ; WX 1170 ; N uni2101 ; G 2970 -U 8450 ; WX 734 ; N uni2102 ; G 2971 -U 8451 ; WX 1211 ; N uni2103 ; G 2972 -U 8452 ; WX 896 ; N uni2104 ; G 2973 -U 8453 ; WX 1091 ; N uni2105 ; G 2974 -U 8454 ; WX 1144 ; N uni2106 ; G 2975 -U 8455 ; WX 614 ; N uni2107 ; G 2976 -U 8456 ; WX 698 ; N uni2108 ; G 2977 -U 8457 ; WX 1086 ; N uni2109 ; G 2978 -U 8459 ; WX 1073 ; N uni210B ; G 2979 -U 8460 ; WX 913 ; N uni210C ; G 2980 -U 8461 ; WX 888 ; N uni210D ; G 2981 -U 8462 ; WX 712 ; N uni210E ; G 2982 -U 8463 ; WX 712 ; N uni210F ; G 2983 -U 8464 ; WX 597 ; N uni2110 ; G 2984 -U 8465 ; WX 697 ; N Ifraktur ; G 2985 -U 8466 ; WX 856 ; N uni2112 ; G 2986 -U 8467 ; WX 472 ; N uni2113 ; G 2987 -U 8468 ; WX 974 ; N uni2114 ; G 2988 -U 8469 ; WX 837 ; N uni2115 ; G 2989 -U 8470 ; WX 1203 ; N uni2116 ; G 2990 -U 8471 ; WX 1000 ; N uni2117 ; G 2991 -U 8472 ; WX 697 ; N weierstrass ; G 2992 -U 8473 ; WX 750 ; N uni2119 ; G 2993 -U 8474 ; WX 850 ; N uni211A ; G 2994 -U 8475 ; WX 938 ; N uni211B ; G 2995 -U 8476 ; WX 814 ; N Rfraktur ; G 2996 -U 8477 ; WX 801 ; N uni211D ; G 2997 -U 8478 ; WX 896 ; N prescription ; G 2998 -U 8479 ; WX 710 ; N uni211F ; G 2999 -U 8480 ; WX 1020 ; N uni2120 ; G 3000 -U 8481 ; WX 1281 ; N uni2121 ; G 3001 -U 8482 ; WX 1000 ; N trademark ; G 3002 -U 8483 ; WX 755 ; N uni2123 ; G 3003 -U 8484 ; WX 754 ; N uni2124 ; G 3004 -U 8485 ; WX 578 ; N uni2125 ; G 3005 -U 8486 ; WX 850 ; N uni2126 ; G 3006 -U 8487 ; WX 850 ; N uni2127 ; G 3007 -U 8488 ; WX 763 ; N uni2128 ; G 3008 -U 8489 ; WX 338 ; N uni2129 ; G 3009 -U 8490 ; WX 775 ; N uni212A ; G 3010 -U 8491 ; WX 774 ; N uni212B ; G 3011 -U 8492 ; WX 928 ; N uni212C ; G 3012 -U 8493 ; WX 818 ; N uni212D ; G 3013 -U 8494 ; WX 854 ; N estimated ; G 3014 -U 8495 ; WX 636 ; N uni212F ; G 3015 -U 8496 ; WX 729 ; N uni2130 ; G 3016 -U 8497 ; WX 808 ; N uni2131 ; G 3017 -U 8498 ; WX 683 ; N uni2132 ; G 3018 -U 8499 ; WX 1184 ; N uni2133 ; G 3019 -U 8500 ; WX 465 ; N uni2134 ; G 3020 -U 8501 ; WX 794 ; N aleph ; G 3021 -U 8502 ; WX 731 ; N uni2136 ; G 3022 -U 8503 ; WX 494 ; N uni2137 ; G 3023 -U 8504 ; WX 684 ; N uni2138 ; G 3024 -U 8505 ; WX 380 ; N uni2139 ; G 3025 -U 8506 ; WX 945 ; N uni213A ; G 3026 -U 8507 ; WX 1348 ; N uni213B ; G 3027 -U 8508 ; WX 790 ; N uni213C ; G 3028 -U 8509 ; WX 737 ; N uni213D ; G 3029 -U 8510 ; WX 654 ; N uni213E ; G 3030 -U 8511 ; WX 863 ; N uni213F ; G 3031 -U 8512 ; WX 840 ; N uni2140 ; G 3032 -U 8513 ; WX 775 ; N uni2141 ; G 3033 -U 8514 ; WX 557 ; N uni2142 ; G 3034 -U 8515 ; WX 637 ; N uni2143 ; G 3035 -U 8516 ; WX 760 ; N uni2144 ; G 3036 -U 8517 ; WX 830 ; N uni2145 ; G 3037 -U 8518 ; WX 716 ; N uni2146 ; G 3038 -U 8519 ; WX 678 ; N uni2147 ; G 3039 -U 8520 ; WX 343 ; N uni2148 ; G 3040 -U 8521 ; WX 343 ; N uni2149 ; G 3041 -U 8523 ; WX 872 ; N uni214B ; G 3042 -U 8526 ; WX 547 ; N uni214E ; G 3043 -U 8528 ; WX 1035 ; N uni2150 ; G 3044 -U 8529 ; WX 1035 ; N uni2151 ; G 3045 -U 8530 ; WX 1483 ; N uni2152 ; G 3046 -U 8531 ; WX 1035 ; N onethird ; G 3047 -U 8532 ; WX 1035 ; N twothirds ; G 3048 -U 8533 ; WX 1035 ; N uni2155 ; G 3049 -U 8534 ; WX 1035 ; N uni2156 ; G 3050 -U 8535 ; WX 1035 ; N uni2157 ; G 3051 -U 8536 ; WX 1035 ; N uni2158 ; G 3052 -U 8537 ; WX 1035 ; N uni2159 ; G 3053 -U 8538 ; WX 1035 ; N uni215A ; G 3054 -U 8539 ; WX 1035 ; N oneeighth ; G 3055 -U 8540 ; WX 1035 ; N threeeighths ; G 3056 -U 8541 ; WX 1035 ; N fiveeighths ; G 3057 -U 8542 ; WX 1035 ; N seveneighths ; G 3058 -U 8543 ; WX 615 ; N uni215F ; G 3059 -U 8544 ; WX 372 ; N uni2160 ; G 3060 -U 8545 ; WX 659 ; N uni2161 ; G 3061 -U 8546 ; WX 945 ; N uni2162 ; G 3062 -U 8547 ; WX 1099 ; N uni2163 ; G 3063 -U 8548 ; WX 774 ; N uni2164 ; G 3064 -U 8549 ; WX 1099 ; N uni2165 ; G 3065 -U 8550 ; WX 1386 ; N uni2166 ; G 3066 -U 8551 ; WX 1672 ; N uni2167 ; G 3067 -U 8552 ; WX 1121 ; N uni2168 ; G 3068 -U 8553 ; WX 771 ; N uni2169 ; G 3069 -U 8554 ; WX 1120 ; N uni216A ; G 3070 -U 8555 ; WX 1407 ; N uni216B ; G 3071 -U 8556 ; WX 637 ; N uni216C ; G 3072 -U 8557 ; WX 734 ; N uni216D ; G 3073 -U 8558 ; WX 830 ; N uni216E ; G 3074 -U 8559 ; WX 995 ; N uni216F ; G 3075 -U 8560 ; WX 343 ; N uni2170 ; G 3076 -U 8561 ; WX 607 ; N uni2171 ; G 3077 -U 8562 ; WX 872 ; N uni2172 ; G 3078 -U 8563 ; WX 984 ; N uni2173 ; G 3079 -U 8564 ; WX 652 ; N uni2174 ; G 3080 -U 8565 ; WX 962 ; N uni2175 ; G 3081 -U 8566 ; WX 1227 ; N uni2176 ; G 3082 -U 8567 ; WX 1491 ; N uni2177 ; G 3083 -U 8568 ; WX 969 ; N uni2178 ; G 3084 -U 8569 ; WX 645 ; N uni2179 ; G 3085 -U 8570 ; WX 969 ; N uni217A ; G 3086 -U 8571 ; WX 1233 ; N uni217B ; G 3087 -U 8572 ; WX 343 ; N uni217C ; G 3088 -U 8573 ; WX 593 ; N uni217D ; G 3089 -U 8574 ; WX 716 ; N uni217E ; G 3090 -U 8575 ; WX 1042 ; N uni217F ; G 3091 -U 8576 ; WX 1289 ; N uni2180 ; G 3092 -U 8577 ; WX 830 ; N uni2181 ; G 3093 -U 8578 ; WX 1289 ; N uni2182 ; G 3094 -U 8579 ; WX 734 ; N uni2183 ; G 3095 -U 8580 ; WX 593 ; N uni2184 ; G 3096 -U 8581 ; WX 734 ; N uni2185 ; G 3097 -U 8585 ; WX 1035 ; N uni2189 ; G 3098 -U 8592 ; WX 838 ; N arrowleft ; G 3099 -U 8593 ; WX 838 ; N arrowup ; G 3100 -U 8594 ; WX 838 ; N arrowright ; G 3101 -U 8595 ; WX 838 ; N arrowdown ; G 3102 -U 8596 ; WX 838 ; N arrowboth ; G 3103 -U 8597 ; WX 838 ; N arrowupdn ; G 3104 -U 8598 ; WX 838 ; N uni2196 ; G 3105 -U 8599 ; WX 838 ; N uni2197 ; G 3106 -U 8600 ; WX 838 ; N uni2198 ; G 3107 -U 8601 ; WX 838 ; N uni2199 ; G 3108 -U 8602 ; WX 838 ; N uni219A ; G 3109 -U 8603 ; WX 838 ; N uni219B ; G 3110 -U 8604 ; WX 838 ; N uni219C ; G 3111 -U 8605 ; WX 838 ; N uni219D ; G 3112 -U 8606 ; WX 838 ; N uni219E ; G 3113 -U 8607 ; WX 838 ; N uni219F ; G 3114 -U 8608 ; WX 838 ; N uni21A0 ; G 3115 -U 8609 ; WX 838 ; N uni21A1 ; G 3116 -U 8610 ; WX 838 ; N uni21A2 ; G 3117 -U 8611 ; WX 838 ; N uni21A3 ; G 3118 -U 8612 ; WX 838 ; N uni21A4 ; G 3119 -U 8613 ; WX 838 ; N uni21A5 ; G 3120 -U 8614 ; WX 838 ; N uni21A6 ; G 3121 -U 8615 ; WX 838 ; N uni21A7 ; G 3122 -U 8616 ; WX 838 ; N arrowupdnbse ; G 3123 -U 8617 ; WX 838 ; N uni21A9 ; G 3124 -U 8618 ; WX 838 ; N uni21AA ; G 3125 -U 8619 ; WX 838 ; N uni21AB ; G 3126 -U 8620 ; WX 838 ; N uni21AC ; G 3127 -U 8621 ; WX 838 ; N uni21AD ; G 3128 -U 8622 ; WX 838 ; N uni21AE ; G 3129 -U 8623 ; WX 838 ; N uni21AF ; G 3130 -U 8624 ; WX 838 ; N uni21B0 ; G 3131 -U 8625 ; WX 838 ; N uni21B1 ; G 3132 -U 8626 ; WX 838 ; N uni21B2 ; G 3133 -U 8627 ; WX 838 ; N uni21B3 ; G 3134 -U 8628 ; WX 838 ; N uni21B4 ; G 3135 -U 8629 ; WX 838 ; N carriagereturn ; G 3136 -U 8630 ; WX 838 ; N uni21B6 ; G 3137 -U 8631 ; WX 838 ; N uni21B7 ; G 3138 -U 8632 ; WX 838 ; N uni21B8 ; G 3139 -U 8633 ; WX 838 ; N uni21B9 ; G 3140 -U 8634 ; WX 838 ; N uni21BA ; G 3141 -U 8635 ; WX 838 ; N uni21BB ; G 3142 -U 8636 ; WX 838 ; N uni21BC ; G 3143 -U 8637 ; WX 838 ; N uni21BD ; G 3144 -U 8638 ; WX 838 ; N uni21BE ; G 3145 -U 8639 ; WX 838 ; N uni21BF ; G 3146 -U 8640 ; WX 838 ; N uni21C0 ; G 3147 -U 8641 ; WX 838 ; N uni21C1 ; G 3148 -U 8642 ; WX 838 ; N uni21C2 ; G 3149 -U 8643 ; WX 838 ; N uni21C3 ; G 3150 -U 8644 ; WX 838 ; N uni21C4 ; G 3151 -U 8645 ; WX 838 ; N uni21C5 ; G 3152 -U 8646 ; WX 838 ; N uni21C6 ; G 3153 -U 8647 ; WX 838 ; N uni21C7 ; G 3154 -U 8648 ; WX 838 ; N uni21C8 ; G 3155 -U 8649 ; WX 838 ; N uni21C9 ; G 3156 -U 8650 ; WX 838 ; N uni21CA ; G 3157 -U 8651 ; WX 838 ; N uni21CB ; G 3158 -U 8652 ; WX 838 ; N uni21CC ; G 3159 -U 8653 ; WX 838 ; N uni21CD ; G 3160 -U 8654 ; WX 838 ; N uni21CE ; G 3161 -U 8655 ; WX 838 ; N uni21CF ; G 3162 -U 8656 ; WX 838 ; N arrowdblleft ; G 3163 -U 8657 ; WX 838 ; N arrowdblup ; G 3164 -U 8658 ; WX 838 ; N arrowdblright ; G 3165 -U 8659 ; WX 838 ; N arrowdbldown ; G 3166 -U 8660 ; WX 838 ; N arrowdblboth ; G 3167 -U 8661 ; WX 838 ; N uni21D5 ; G 3168 -U 8662 ; WX 838 ; N uni21D6 ; G 3169 -U 8663 ; WX 838 ; N uni21D7 ; G 3170 -U 8664 ; WX 838 ; N uni21D8 ; G 3171 -U 8665 ; WX 838 ; N uni21D9 ; G 3172 -U 8666 ; WX 838 ; N uni21DA ; G 3173 -U 8667 ; WX 838 ; N uni21DB ; G 3174 -U 8668 ; WX 838 ; N uni21DC ; G 3175 -U 8669 ; WX 838 ; N uni21DD ; G 3176 -U 8670 ; WX 838 ; N uni21DE ; G 3177 -U 8671 ; WX 838 ; N uni21DF ; G 3178 -U 8672 ; WX 838 ; N uni21E0 ; G 3179 -U 8673 ; WX 838 ; N uni21E1 ; G 3180 -U 8674 ; WX 838 ; N uni21E2 ; G 3181 -U 8675 ; WX 838 ; N uni21E3 ; G 3182 -U 8676 ; WX 838 ; N uni21E4 ; G 3183 -U 8677 ; WX 838 ; N uni21E5 ; G 3184 -U 8678 ; WX 838 ; N uni21E6 ; G 3185 -U 8679 ; WX 838 ; N uni21E7 ; G 3186 -U 8680 ; WX 838 ; N uni21E8 ; G 3187 -U 8681 ; WX 838 ; N uni21E9 ; G 3188 -U 8682 ; WX 838 ; N uni21EA ; G 3189 -U 8683 ; WX 838 ; N uni21EB ; G 3190 -U 8684 ; WX 838 ; N uni21EC ; G 3191 -U 8685 ; WX 838 ; N uni21ED ; G 3192 -U 8686 ; WX 838 ; N uni21EE ; G 3193 -U 8687 ; WX 838 ; N uni21EF ; G 3194 -U 8688 ; WX 838 ; N uni21F0 ; G 3195 -U 8689 ; WX 838 ; N uni21F1 ; G 3196 -U 8690 ; WX 838 ; N uni21F2 ; G 3197 -U 8691 ; WX 838 ; N uni21F3 ; G 3198 -U 8692 ; WX 838 ; N uni21F4 ; G 3199 -U 8693 ; WX 838 ; N uni21F5 ; G 3200 -U 8694 ; WX 838 ; N uni21F6 ; G 3201 -U 8695 ; WX 838 ; N uni21F7 ; G 3202 -U 8696 ; WX 838 ; N uni21F8 ; G 3203 -U 8697 ; WX 838 ; N uni21F9 ; G 3204 -U 8698 ; WX 838 ; N uni21FA ; G 3205 -U 8699 ; WX 838 ; N uni21FB ; G 3206 -U 8700 ; WX 838 ; N uni21FC ; G 3207 -U 8701 ; WX 838 ; N uni21FD ; G 3208 -U 8702 ; WX 838 ; N uni21FE ; G 3209 -U 8703 ; WX 838 ; N uni21FF ; G 3210 -U 8704 ; WX 774 ; N universal ; G 3211 -U 8705 ; WX 696 ; N uni2201 ; G 3212 -U 8706 ; WX 544 ; N partialdiff ; G 3213 -U 8707 ; WX 683 ; N existential ; G 3214 -U 8708 ; WX 683 ; N uni2204 ; G 3215 -U 8709 ; WX 856 ; N emptyset ; G 3216 -U 8710 ; WX 697 ; N increment ; G 3217 -U 8711 ; WX 697 ; N gradient ; G 3218 -U 8712 ; WX 896 ; N element ; G 3219 -U 8713 ; WX 896 ; N notelement ; G 3220 -U 8714 ; WX 750 ; N uni220A ; G 3221 -U 8715 ; WX 896 ; N suchthat ; G 3222 -U 8716 ; WX 896 ; N uni220C ; G 3223 -U 8717 ; WX 750 ; N uni220D ; G 3224 -U 8718 ; WX 636 ; N uni220E ; G 3225 -U 8719 ; WX 787 ; N product ; G 3226 -U 8720 ; WX 787 ; N uni2210 ; G 3227 -U 8721 ; WX 718 ; N summation ; G 3228 -U 8722 ; WX 838 ; N minus ; G 3229 -U 8723 ; WX 838 ; N uni2213 ; G 3230 -U 8724 ; WX 696 ; N uni2214 ; G 3231 -U 8725 ; WX 365 ; N uni2215 ; G 3232 -U 8726 ; WX 696 ; N uni2216 ; G 3233 -U 8727 ; WX 838 ; N asteriskmath ; G 3234 -U 8728 ; WX 626 ; N uni2218 ; G 3235 -U 8729 ; WX 380 ; N uni2219 ; G 3236 -U 8730 ; WX 667 ; N radical ; G 3237 -U 8731 ; WX 667 ; N uni221B ; G 3238 -U 8732 ; WX 667 ; N uni221C ; G 3239 -U 8733 ; WX 712 ; N proportional ; G 3240 -U 8734 ; WX 833 ; N infinity ; G 3241 -U 8735 ; WX 838 ; N orthogonal ; G 3242 -U 8736 ; WX 896 ; N angle ; G 3243 -U 8737 ; WX 896 ; N uni2221 ; G 3244 -U 8738 ; WX 838 ; N uni2222 ; G 3245 -U 8739 ; WX 500 ; N uni2223 ; G 3246 -U 8740 ; WX 500 ; N uni2224 ; G 3247 -U 8741 ; WX 500 ; N uni2225 ; G 3248 -U 8742 ; WX 500 ; N uni2226 ; G 3249 -U 8743 ; WX 812 ; N logicaland ; G 3250 -U 8744 ; WX 812 ; N logicalor ; G 3251 -U 8745 ; WX 812 ; N intersection ; G 3252 -U 8746 ; WX 812 ; N union ; G 3253 -U 8747 ; WX 610 ; N integral ; G 3254 -U 8748 ; WX 929 ; N uni222C ; G 3255 -U 8749 ; WX 1295 ; N uni222D ; G 3256 -U 8750 ; WX 563 ; N uni222E ; G 3257 -U 8751 ; WX 977 ; N uni222F ; G 3258 -U 8752 ; WX 1313 ; N uni2230 ; G 3259 -U 8753 ; WX 563 ; N uni2231 ; G 3260 -U 8754 ; WX 563 ; N uni2232 ; G 3261 -U 8755 ; WX 563 ; N uni2233 ; G 3262 -U 8756 ; WX 696 ; N therefore ; G 3263 -U 8757 ; WX 696 ; N uni2235 ; G 3264 -U 8758 ; WX 294 ; N uni2236 ; G 3265 -U 8759 ; WX 696 ; N uni2237 ; G 3266 -U 8760 ; WX 838 ; N uni2238 ; G 3267 -U 8761 ; WX 838 ; N uni2239 ; G 3268 -U 8762 ; WX 838 ; N uni223A ; G 3269 -U 8763 ; WX 838 ; N uni223B ; G 3270 -U 8764 ; WX 838 ; N similar ; G 3271 -U 8765 ; WX 838 ; N uni223D ; G 3272 -U 8766 ; WX 838 ; N uni223E ; G 3273 -U 8767 ; WX 838 ; N uni223F ; G 3274 -U 8768 ; WX 375 ; N uni2240 ; G 3275 -U 8769 ; WX 838 ; N uni2241 ; G 3276 -U 8770 ; WX 838 ; N uni2242 ; G 3277 -U 8771 ; WX 838 ; N uni2243 ; G 3278 -U 8772 ; WX 838 ; N uni2244 ; G 3279 -U 8773 ; WX 838 ; N congruent ; G 3280 -U 8774 ; WX 838 ; N uni2246 ; G 3281 -U 8775 ; WX 838 ; N uni2247 ; G 3282 -U 8776 ; WX 838 ; N approxequal ; G 3283 -U 8777 ; WX 838 ; N uni2249 ; G 3284 -U 8778 ; WX 838 ; N uni224A ; G 3285 -U 8779 ; WX 838 ; N uni224B ; G 3286 -U 8780 ; WX 838 ; N uni224C ; G 3287 -U 8781 ; WX 838 ; N uni224D ; G 3288 -U 8782 ; WX 838 ; N uni224E ; G 3289 -U 8783 ; WX 838 ; N uni224F ; G 3290 -U 8784 ; WX 838 ; N uni2250 ; G 3291 -U 8785 ; WX 838 ; N uni2251 ; G 3292 -U 8786 ; WX 838 ; N uni2252 ; G 3293 -U 8787 ; WX 838 ; N uni2253 ; G 3294 -U 8788 ; WX 1063 ; N uni2254 ; G 3295 -U 8789 ; WX 1063 ; N uni2255 ; G 3296 -U 8790 ; WX 838 ; N uni2256 ; G 3297 -U 8791 ; WX 838 ; N uni2257 ; G 3298 -U 8792 ; WX 838 ; N uni2258 ; G 3299 -U 8793 ; WX 838 ; N uni2259 ; G 3300 -U 8794 ; WX 838 ; N uni225A ; G 3301 -U 8795 ; WX 838 ; N uni225B ; G 3302 -U 8796 ; WX 838 ; N uni225C ; G 3303 -U 8797 ; WX 838 ; N uni225D ; G 3304 -U 8798 ; WX 838 ; N uni225E ; G 3305 -U 8799 ; WX 838 ; N uni225F ; G 3306 -U 8800 ; WX 838 ; N notequal ; G 3307 -U 8801 ; WX 838 ; N equivalence ; G 3308 -U 8802 ; WX 838 ; N uni2262 ; G 3309 -U 8803 ; WX 838 ; N uni2263 ; G 3310 -U 8804 ; WX 838 ; N lessequal ; G 3311 -U 8805 ; WX 838 ; N greaterequal ; G 3312 -U 8806 ; WX 838 ; N uni2266 ; G 3313 -U 8807 ; WX 838 ; N uni2267 ; G 3314 -U 8808 ; WX 841 ; N uni2268 ; G 3315 -U 8809 ; WX 841 ; N uni2269 ; G 3316 -U 8810 ; WX 1047 ; N uni226A ; G 3317 -U 8811 ; WX 1047 ; N uni226B ; G 3318 -U 8812 ; WX 500 ; N uni226C ; G 3319 -U 8813 ; WX 838 ; N uni226D ; G 3320 -U 8814 ; WX 838 ; N uni226E ; G 3321 -U 8815 ; WX 838 ; N uni226F ; G 3322 -U 8816 ; WX 838 ; N uni2270 ; G 3323 -U 8817 ; WX 838 ; N uni2271 ; G 3324 -U 8818 ; WX 838 ; N uni2272 ; G 3325 -U 8819 ; WX 838 ; N uni2273 ; G 3326 -U 8820 ; WX 838 ; N uni2274 ; G 3327 -U 8821 ; WX 838 ; N uni2275 ; G 3328 -U 8822 ; WX 838 ; N uni2276 ; G 3329 -U 8823 ; WX 838 ; N uni2277 ; G 3330 -U 8824 ; WX 838 ; N uni2278 ; G 3331 -U 8825 ; WX 838 ; N uni2279 ; G 3332 -U 8826 ; WX 838 ; N uni227A ; G 3333 -U 8827 ; WX 838 ; N uni227B ; G 3334 -U 8828 ; WX 838 ; N uni227C ; G 3335 -U 8829 ; WX 838 ; N uni227D ; G 3336 -U 8830 ; WX 838 ; N uni227E ; G 3337 -U 8831 ; WX 838 ; N uni227F ; G 3338 -U 8832 ; WX 838 ; N uni2280 ; G 3339 -U 8833 ; WX 838 ; N uni2281 ; G 3340 -U 8834 ; WX 838 ; N propersubset ; G 3341 -U 8835 ; WX 838 ; N propersuperset ; G 3342 -U 8836 ; WX 838 ; N notsubset ; G 3343 -U 8837 ; WX 838 ; N uni2285 ; G 3344 -U 8838 ; WX 838 ; N reflexsubset ; G 3345 -U 8839 ; WX 838 ; N reflexsuperset ; G 3346 -U 8840 ; WX 838 ; N uni2288 ; G 3347 -U 8841 ; WX 838 ; N uni2289 ; G 3348 -U 8842 ; WX 838 ; N uni228A ; G 3349 -U 8843 ; WX 838 ; N uni228B ; G 3350 -U 8844 ; WX 812 ; N uni228C ; G 3351 -U 8845 ; WX 812 ; N uni228D ; G 3352 -U 8846 ; WX 812 ; N uni228E ; G 3353 -U 8847 ; WX 838 ; N uni228F ; G 3354 -U 8848 ; WX 838 ; N uni2290 ; G 3355 -U 8849 ; WX 838 ; N uni2291 ; G 3356 -U 8850 ; WX 838 ; N uni2292 ; G 3357 -U 8851 ; WX 796 ; N uni2293 ; G 3358 -U 8852 ; WX 796 ; N uni2294 ; G 3359 -U 8853 ; WX 838 ; N circleplus ; G 3360 -U 8854 ; WX 838 ; N uni2296 ; G 3361 -U 8855 ; WX 838 ; N circlemultiply ; G 3362 -U 8856 ; WX 838 ; N uni2298 ; G 3363 -U 8857 ; WX 838 ; N uni2299 ; G 3364 -U 8858 ; WX 838 ; N uni229A ; G 3365 -U 8859 ; WX 838 ; N uni229B ; G 3366 -U 8860 ; WX 838 ; N uni229C ; G 3367 -U 8861 ; WX 838 ; N uni229D ; G 3368 -U 8862 ; WX 838 ; N uni229E ; G 3369 -U 8863 ; WX 838 ; N uni229F ; G 3370 -U 8864 ; WX 838 ; N uni22A0 ; G 3371 -U 8865 ; WX 838 ; N uni22A1 ; G 3372 -U 8866 ; WX 914 ; N uni22A2 ; G 3373 -U 8867 ; WX 914 ; N uni22A3 ; G 3374 -U 8868 ; WX 914 ; N uni22A4 ; G 3375 -U 8869 ; WX 914 ; N perpendicular ; G 3376 -U 8870 ; WX 542 ; N uni22A6 ; G 3377 -U 8871 ; WX 542 ; N uni22A7 ; G 3378 -U 8872 ; WX 914 ; N uni22A8 ; G 3379 -U 8873 ; WX 914 ; N uni22A9 ; G 3380 -U 8874 ; WX 914 ; N uni22AA ; G 3381 -U 8875 ; WX 914 ; N uni22AB ; G 3382 -U 8876 ; WX 914 ; N uni22AC ; G 3383 -U 8877 ; WX 914 ; N uni22AD ; G 3384 -U 8878 ; WX 914 ; N uni22AE ; G 3385 -U 8879 ; WX 914 ; N uni22AF ; G 3386 -U 8880 ; WX 838 ; N uni22B0 ; G 3387 -U 8881 ; WX 838 ; N uni22B1 ; G 3388 -U 8882 ; WX 838 ; N uni22B2 ; G 3389 -U 8883 ; WX 838 ; N uni22B3 ; G 3390 -U 8884 ; WX 838 ; N uni22B4 ; G 3391 -U 8885 ; WX 838 ; N uni22B5 ; G 3392 -U 8886 ; WX 1000 ; N uni22B6 ; G 3393 -U 8887 ; WX 1000 ; N uni22B7 ; G 3394 -U 8888 ; WX 838 ; N uni22B8 ; G 3395 -U 8889 ; WX 838 ; N uni22B9 ; G 3396 -U 8890 ; WX 542 ; N uni22BA ; G 3397 -U 8891 ; WX 812 ; N uni22BB ; G 3398 -U 8892 ; WX 812 ; N uni22BC ; G 3399 -U 8893 ; WX 812 ; N uni22BD ; G 3400 -U 8894 ; WX 838 ; N uni22BE ; G 3401 -U 8895 ; WX 838 ; N uni22BF ; G 3402 -U 8896 ; WX 843 ; N uni22C0 ; G 3403 -U 8897 ; WX 843 ; N uni22C1 ; G 3404 -U 8898 ; WX 843 ; N uni22C2 ; G 3405 -U 8899 ; WX 843 ; N uni22C3 ; G 3406 -U 8900 ; WX 626 ; N uni22C4 ; G 3407 -U 8901 ; WX 380 ; N dotmath ; G 3408 -U 8902 ; WX 626 ; N uni22C6 ; G 3409 -U 8903 ; WX 838 ; N uni22C7 ; G 3410 -U 8904 ; WX 1000 ; N uni22C8 ; G 3411 -U 8905 ; WX 1000 ; N uni22C9 ; G 3412 -U 8906 ; WX 1000 ; N uni22CA ; G 3413 -U 8907 ; WX 1000 ; N uni22CB ; G 3414 -U 8908 ; WX 1000 ; N uni22CC ; G 3415 -U 8909 ; WX 838 ; N uni22CD ; G 3416 -U 8910 ; WX 812 ; N uni22CE ; G 3417 -U 8911 ; WX 812 ; N uni22CF ; G 3418 -U 8912 ; WX 838 ; N uni22D0 ; G 3419 -U 8913 ; WX 838 ; N uni22D1 ; G 3420 -U 8914 ; WX 838 ; N uni22D2 ; G 3421 -U 8915 ; WX 838 ; N uni22D3 ; G 3422 -U 8916 ; WX 838 ; N uni22D4 ; G 3423 -U 8917 ; WX 838 ; N uni22D5 ; G 3424 -U 8918 ; WX 838 ; N uni22D6 ; G 3425 -U 8919 ; WX 838 ; N uni22D7 ; G 3426 -U 8920 ; WX 1422 ; N uni22D8 ; G 3427 -U 8921 ; WX 1422 ; N uni22D9 ; G 3428 -U 8922 ; WX 838 ; N uni22DA ; G 3429 -U 8923 ; WX 838 ; N uni22DB ; G 3430 -U 8924 ; WX 838 ; N uni22DC ; G 3431 -U 8925 ; WX 838 ; N uni22DD ; G 3432 -U 8926 ; WX 838 ; N uni22DE ; G 3433 -U 8927 ; WX 838 ; N uni22DF ; G 3434 -U 8928 ; WX 838 ; N uni22E0 ; G 3435 -U 8929 ; WX 838 ; N uni22E1 ; G 3436 -U 8930 ; WX 838 ; N uni22E2 ; G 3437 -U 8931 ; WX 838 ; N uni22E3 ; G 3438 -U 8932 ; WX 838 ; N uni22E4 ; G 3439 -U 8933 ; WX 838 ; N uni22E5 ; G 3440 -U 8934 ; WX 838 ; N uni22E6 ; G 3441 -U 8935 ; WX 838 ; N uni22E7 ; G 3442 -U 8936 ; WX 838 ; N uni22E8 ; G 3443 -U 8937 ; WX 838 ; N uni22E9 ; G 3444 -U 8938 ; WX 838 ; N uni22EA ; G 3445 -U 8939 ; WX 838 ; N uni22EB ; G 3446 -U 8940 ; WX 838 ; N uni22EC ; G 3447 -U 8941 ; WX 838 ; N uni22ED ; G 3448 -U 8942 ; WX 1000 ; N uni22EE ; G 3449 -U 8943 ; WX 1000 ; N uni22EF ; G 3450 -U 8944 ; WX 1000 ; N uni22F0 ; G 3451 -U 8945 ; WX 1000 ; N uni22F1 ; G 3452 -U 8946 ; WX 1158 ; N uni22F2 ; G 3453 -U 8947 ; WX 896 ; N uni22F3 ; G 3454 -U 8948 ; WX 750 ; N uni22F4 ; G 3455 -U 8949 ; WX 896 ; N uni22F5 ; G 3456 -U 8950 ; WX 896 ; N uni22F6 ; G 3457 -U 8951 ; WX 750 ; N uni22F7 ; G 3458 -U 8952 ; WX 896 ; N uni22F8 ; G 3459 -U 8953 ; WX 896 ; N uni22F9 ; G 3460 -U 8954 ; WX 1158 ; N uni22FA ; G 3461 -U 8955 ; WX 896 ; N uni22FB ; G 3462 -U 8956 ; WX 750 ; N uni22FC ; G 3463 -U 8957 ; WX 896 ; N uni22FD ; G 3464 -U 8958 ; WX 750 ; N uni22FE ; G 3465 -U 8959 ; WX 896 ; N uni22FF ; G 3466 -U 8960 ; WX 602 ; N uni2300 ; G 3467 -U 8961 ; WX 602 ; N uni2301 ; G 3468 -U 8962 ; WX 716 ; N house ; G 3469 -U 8963 ; WX 838 ; N uni2303 ; G 3470 -U 8964 ; WX 838 ; N uni2304 ; G 3471 -U 8965 ; WX 838 ; N uni2305 ; G 3472 -U 8966 ; WX 838 ; N uni2306 ; G 3473 -U 8967 ; WX 488 ; N uni2307 ; G 3474 -U 8968 ; WX 457 ; N uni2308 ; G 3475 -U 8969 ; WX 457 ; N uni2309 ; G 3476 -U 8970 ; WX 457 ; N uni230A ; G 3477 -U 8971 ; WX 457 ; N uni230B ; G 3478 -U 8972 ; WX 809 ; N uni230C ; G 3479 -U 8973 ; WX 809 ; N uni230D ; G 3480 -U 8974 ; WX 809 ; N uni230E ; G 3481 -U 8975 ; WX 809 ; N uni230F ; G 3482 -U 8976 ; WX 838 ; N revlogicalnot ; G 3483 -U 8977 ; WX 539 ; N uni2311 ; G 3484 -U 8984 ; WX 928 ; N uni2318 ; G 3485 -U 8985 ; WX 838 ; N uni2319 ; G 3486 -U 8988 ; WX 469 ; N uni231C ; G 3487 -U 8989 ; WX 469 ; N uni231D ; G 3488 -U 8990 ; WX 469 ; N uni231E ; G 3489 -U 8991 ; WX 469 ; N uni231F ; G 3490 -U 8992 ; WX 610 ; N integraltp ; G 3491 -U 8993 ; WX 610 ; N integralbt ; G 3492 -U 8996 ; WX 1152 ; N uni2324 ; G 3493 -U 8997 ; WX 1152 ; N uni2325 ; G 3494 -U 8998 ; WX 1414 ; N uni2326 ; G 3495 -U 8999 ; WX 1152 ; N uni2327 ; G 3496 -U 9000 ; WX 1443 ; N uni2328 ; G 3497 -U 9003 ; WX 1414 ; N uni232B ; G 3498 -U 9004 ; WX 873 ; N uni232C ; G 3499 -U 9075 ; WX 390 ; N uni2373 ; G 3500 -U 9076 ; WX 716 ; N uni2374 ; G 3501 -U 9077 ; WX 869 ; N uni2375 ; G 3502 -U 9082 ; WX 687 ; N uni237A ; G 3503 -U 9085 ; WX 863 ; N uni237D ; G 3504 -U 9095 ; WX 1152 ; N uni2387 ; G 3505 -U 9108 ; WX 873 ; N uni2394 ; G 3506 -U 9115 ; WX 500 ; N uni239B ; G 3507 -U 9116 ; WX 500 ; N uni239C ; G 3508 -U 9117 ; WX 500 ; N uni239D ; G 3509 -U 9118 ; WX 500 ; N uni239E ; G 3510 -U 9119 ; WX 500 ; N uni239F ; G 3511 -U 9120 ; WX 500 ; N uni23A0 ; G 3512 -U 9121 ; WX 500 ; N uni23A1 ; G 3513 -U 9122 ; WX 500 ; N uni23A2 ; G 3514 -U 9123 ; WX 500 ; N uni23A3 ; G 3515 -U 9124 ; WX 500 ; N uni23A4 ; G 3516 -U 9125 ; WX 500 ; N uni23A5 ; G 3517 -U 9126 ; WX 500 ; N uni23A6 ; G 3518 -U 9127 ; WX 750 ; N uni23A7 ; G 3519 -U 9128 ; WX 750 ; N uni23A8 ; G 3520 -U 9129 ; WX 750 ; N uni23A9 ; G 3521 -U 9130 ; WX 750 ; N uni23AA ; G 3522 -U 9131 ; WX 750 ; N uni23AB ; G 3523 -U 9132 ; WX 750 ; N uni23AC ; G 3524 -U 9133 ; WX 750 ; N uni23AD ; G 3525 -U 9134 ; WX 610 ; N uni23AE ; G 3526 -U 9166 ; WX 838 ; N uni23CE ; G 3527 -U 9167 ; WX 945 ; N uni23CF ; G 3528 -U 9187 ; WX 873 ; N uni23E3 ; G 3529 -U 9189 ; WX 769 ; N uni23E5 ; G 3530 -U 9192 ; WX 696 ; N uni23E8 ; G 3531 -U 9250 ; WX 716 ; N uni2422 ; G 3532 -U 9251 ; WX 716 ; N uni2423 ; G 3533 -U 9312 ; WX 847 ; N uni2460 ; G 3534 -U 9313 ; WX 847 ; N uni2461 ; G 3535 -U 9314 ; WX 847 ; N uni2462 ; G 3536 -U 9315 ; WX 847 ; N uni2463 ; G 3537 -U 9316 ; WX 847 ; N uni2464 ; G 3538 -U 9317 ; WX 847 ; N uni2465 ; G 3539 -U 9318 ; WX 847 ; N uni2466 ; G 3540 -U 9319 ; WX 847 ; N uni2467 ; G 3541 -U 9320 ; WX 847 ; N uni2468 ; G 3542 -U 9321 ; WX 847 ; N uni2469 ; G 3543 -U 9472 ; WX 602 ; N SF100000 ; G 3544 -U 9473 ; WX 602 ; N uni2501 ; G 3545 -U 9474 ; WX 602 ; N SF110000 ; G 3546 -U 9475 ; WX 602 ; N uni2503 ; G 3547 -U 9476 ; WX 602 ; N uni2504 ; G 3548 -U 9477 ; WX 602 ; N uni2505 ; G 3549 -U 9478 ; WX 602 ; N uni2506 ; G 3550 -U 9479 ; WX 602 ; N uni2507 ; G 3551 -U 9480 ; WX 602 ; N uni2508 ; G 3552 -U 9481 ; WX 602 ; N uni2509 ; G 3553 -U 9482 ; WX 602 ; N uni250A ; G 3554 -U 9483 ; WX 602 ; N uni250B ; G 3555 -U 9484 ; WX 602 ; N SF010000 ; G 3556 -U 9485 ; WX 602 ; N uni250D ; G 3557 -U 9486 ; WX 602 ; N uni250E ; G 3558 -U 9487 ; WX 602 ; N uni250F ; G 3559 -U 9488 ; WX 602 ; N SF030000 ; G 3560 -U 9489 ; WX 602 ; N uni2511 ; G 3561 -U 9490 ; WX 602 ; N uni2512 ; G 3562 -U 9491 ; WX 602 ; N uni2513 ; G 3563 -U 9492 ; WX 602 ; N SF020000 ; G 3564 -U 9493 ; WX 602 ; N uni2515 ; G 3565 -U 9494 ; WX 602 ; N uni2516 ; G 3566 -U 9495 ; WX 602 ; N uni2517 ; G 3567 -U 9496 ; WX 602 ; N SF040000 ; G 3568 -U 9497 ; WX 602 ; N uni2519 ; G 3569 -U 9498 ; WX 602 ; N uni251A ; G 3570 -U 9499 ; WX 602 ; N uni251B ; G 3571 -U 9500 ; WX 602 ; N SF080000 ; G 3572 -U 9501 ; WX 602 ; N uni251D ; G 3573 -U 9502 ; WX 602 ; N uni251E ; G 3574 -U 9503 ; WX 602 ; N uni251F ; G 3575 -U 9504 ; WX 602 ; N uni2520 ; G 3576 -U 9505 ; WX 602 ; N uni2521 ; G 3577 -U 9506 ; WX 602 ; N uni2522 ; G 3578 -U 9507 ; WX 602 ; N uni2523 ; G 3579 -U 9508 ; WX 602 ; N SF090000 ; G 3580 -U 9509 ; WX 602 ; N uni2525 ; G 3581 -U 9510 ; WX 602 ; N uni2526 ; G 3582 -U 9511 ; WX 602 ; N uni2527 ; G 3583 -U 9512 ; WX 602 ; N uni2528 ; G 3584 -U 9513 ; WX 602 ; N uni2529 ; G 3585 -U 9514 ; WX 602 ; N uni252A ; G 3586 -U 9515 ; WX 602 ; N uni252B ; G 3587 -U 9516 ; WX 602 ; N SF060000 ; G 3588 -U 9517 ; WX 602 ; N uni252D ; G 3589 -U 9518 ; WX 602 ; N uni252E ; G 3590 -U 9519 ; WX 602 ; N uni252F ; G 3591 -U 9520 ; WX 602 ; N uni2530 ; G 3592 -U 9521 ; WX 602 ; N uni2531 ; G 3593 -U 9522 ; WX 602 ; N uni2532 ; G 3594 -U 9523 ; WX 602 ; N uni2533 ; G 3595 -U 9524 ; WX 602 ; N SF070000 ; G 3596 -U 9525 ; WX 602 ; N uni2535 ; G 3597 -U 9526 ; WX 602 ; N uni2536 ; G 3598 -U 9527 ; WX 602 ; N uni2537 ; G 3599 -U 9528 ; WX 602 ; N uni2538 ; G 3600 -U 9529 ; WX 602 ; N uni2539 ; G 3601 -U 9530 ; WX 602 ; N uni253A ; G 3602 -U 9531 ; WX 602 ; N uni253B ; G 3603 -U 9532 ; WX 602 ; N SF050000 ; G 3604 -U 9533 ; WX 602 ; N uni253D ; G 3605 -U 9534 ; WX 602 ; N uni253E ; G 3606 -U 9535 ; WX 602 ; N uni253F ; G 3607 -U 9536 ; WX 602 ; N uni2540 ; G 3608 -U 9537 ; WX 602 ; N uni2541 ; G 3609 -U 9538 ; WX 602 ; N uni2542 ; G 3610 -U 9539 ; WX 602 ; N uni2543 ; G 3611 -U 9540 ; WX 602 ; N uni2544 ; G 3612 -U 9541 ; WX 602 ; N uni2545 ; G 3613 -U 9542 ; WX 602 ; N uni2546 ; G 3614 -U 9543 ; WX 602 ; N uni2547 ; G 3615 -U 9544 ; WX 602 ; N uni2548 ; G 3616 -U 9545 ; WX 602 ; N uni2549 ; G 3617 -U 9546 ; WX 602 ; N uni254A ; G 3618 -U 9547 ; WX 602 ; N uni254B ; G 3619 -U 9548 ; WX 602 ; N uni254C ; G 3620 -U 9549 ; WX 602 ; N uni254D ; G 3621 -U 9550 ; WX 602 ; N uni254E ; G 3622 -U 9551 ; WX 602 ; N uni254F ; G 3623 -U 9552 ; WX 602 ; N SF430000 ; G 3624 -U 9553 ; WX 602 ; N SF240000 ; G 3625 -U 9554 ; WX 602 ; N SF510000 ; G 3626 -U 9555 ; WX 602 ; N SF520000 ; G 3627 -U 9556 ; WX 602 ; N SF390000 ; G 3628 -U 9557 ; WX 602 ; N SF220000 ; G 3629 -U 9558 ; WX 602 ; N SF210000 ; G 3630 -U 9559 ; WX 602 ; N SF250000 ; G 3631 -U 9560 ; WX 602 ; N SF500000 ; G 3632 -U 9561 ; WX 602 ; N SF490000 ; G 3633 -U 9562 ; WX 602 ; N SF380000 ; G 3634 -U 9563 ; WX 602 ; N SF280000 ; G 3635 -U 9564 ; WX 602 ; N SF270000 ; G 3636 -U 9565 ; WX 602 ; N SF260000 ; G 3637 -U 9566 ; WX 602 ; N SF360000 ; G 3638 -U 9567 ; WX 602 ; N SF370000 ; G 3639 -U 9568 ; WX 602 ; N SF420000 ; G 3640 -U 9569 ; WX 602 ; N SF190000 ; G 3641 -U 9570 ; WX 602 ; N SF200000 ; G 3642 -U 9571 ; WX 602 ; N SF230000 ; G 3643 -U 9572 ; WX 602 ; N SF470000 ; G 3644 -U 9573 ; WX 602 ; N SF480000 ; G 3645 -U 9574 ; WX 602 ; N SF410000 ; G 3646 -U 9575 ; WX 602 ; N SF450000 ; G 3647 -U 9576 ; WX 602 ; N SF460000 ; G 3648 -U 9577 ; WX 602 ; N SF400000 ; G 3649 -U 9578 ; WX 602 ; N SF540000 ; G 3650 -U 9579 ; WX 602 ; N SF530000 ; G 3651 -U 9580 ; WX 602 ; N SF440000 ; G 3652 -U 9581 ; WX 602 ; N uni256D ; G 3653 -U 9582 ; WX 602 ; N uni256E ; G 3654 -U 9583 ; WX 602 ; N uni256F ; G 3655 -U 9584 ; WX 602 ; N uni2570 ; G 3656 -U 9585 ; WX 602 ; N uni2571 ; G 3657 -U 9586 ; WX 602 ; N uni2572 ; G 3658 -U 9587 ; WX 602 ; N uni2573 ; G 3659 -U 9588 ; WX 602 ; N uni2574 ; G 3660 -U 9589 ; WX 602 ; N uni2575 ; G 3661 -U 9590 ; WX 602 ; N uni2576 ; G 3662 -U 9591 ; WX 602 ; N uni2577 ; G 3663 -U 9592 ; WX 602 ; N uni2578 ; G 3664 -U 9593 ; WX 602 ; N uni2579 ; G 3665 -U 9594 ; WX 602 ; N uni257A ; G 3666 -U 9595 ; WX 602 ; N uni257B ; G 3667 -U 9596 ; WX 602 ; N uni257C ; G 3668 -U 9597 ; WX 602 ; N uni257D ; G 3669 -U 9598 ; WX 602 ; N uni257E ; G 3670 -U 9599 ; WX 602 ; N uni257F ; G 3671 -U 9600 ; WX 769 ; N upblock ; G 3672 -U 9601 ; WX 769 ; N uni2581 ; G 3673 -U 9602 ; WX 769 ; N uni2582 ; G 3674 -U 9603 ; WX 769 ; N uni2583 ; G 3675 -U 9604 ; WX 769 ; N dnblock ; G 3676 -U 9605 ; WX 769 ; N uni2585 ; G 3677 -U 9606 ; WX 769 ; N uni2586 ; G 3678 -U 9607 ; WX 769 ; N uni2587 ; G 3679 -U 9608 ; WX 769 ; N block ; G 3680 -U 9609 ; WX 769 ; N uni2589 ; G 3681 -U 9610 ; WX 769 ; N uni258A ; G 3682 -U 9611 ; WX 769 ; N uni258B ; G 3683 -U 9612 ; WX 769 ; N lfblock ; G 3684 -U 9613 ; WX 769 ; N uni258D ; G 3685 -U 9614 ; WX 769 ; N uni258E ; G 3686 -U 9615 ; WX 769 ; N uni258F ; G 3687 -U 9616 ; WX 769 ; N rtblock ; G 3688 -U 9617 ; WX 769 ; N ltshade ; G 3689 -U 9618 ; WX 769 ; N shade ; G 3690 -U 9619 ; WX 769 ; N dkshade ; G 3691 -U 9620 ; WX 769 ; N uni2594 ; G 3692 -U 9621 ; WX 769 ; N uni2595 ; G 3693 -U 9622 ; WX 769 ; N uni2596 ; G 3694 -U 9623 ; WX 769 ; N uni2597 ; G 3695 -U 9624 ; WX 769 ; N uni2598 ; G 3696 -U 9625 ; WX 769 ; N uni2599 ; G 3697 -U 9626 ; WX 769 ; N uni259A ; G 3698 -U 9627 ; WX 769 ; N uni259B ; G 3699 -U 9628 ; WX 769 ; N uni259C ; G 3700 -U 9629 ; WX 769 ; N uni259D ; G 3701 -U 9630 ; WX 769 ; N uni259E ; G 3702 -U 9631 ; WX 769 ; N uni259F ; G 3703 -U 9632 ; WX 945 ; N filledbox ; G 3704 -U 9633 ; WX 945 ; N H22073 ; G 3705 -U 9634 ; WX 945 ; N uni25A2 ; G 3706 -U 9635 ; WX 945 ; N uni25A3 ; G 3707 -U 9636 ; WX 945 ; N uni25A4 ; G 3708 -U 9637 ; WX 945 ; N uni25A5 ; G 3709 -U 9638 ; WX 945 ; N uni25A6 ; G 3710 -U 9639 ; WX 945 ; N uni25A7 ; G 3711 -U 9640 ; WX 945 ; N uni25A8 ; G 3712 -U 9641 ; WX 945 ; N uni25A9 ; G 3713 -U 9642 ; WX 678 ; N H18543 ; G 3714 -U 9643 ; WX 678 ; N H18551 ; G 3715 -U 9644 ; WX 945 ; N filledrect ; G 3716 -U 9645 ; WX 945 ; N uni25AD ; G 3717 -U 9646 ; WX 550 ; N uni25AE ; G 3718 -U 9647 ; WX 550 ; N uni25AF ; G 3719 -U 9648 ; WX 769 ; N uni25B0 ; G 3720 -U 9649 ; WX 769 ; N uni25B1 ; G 3721 -U 9650 ; WX 769 ; N triagup ; G 3722 -U 9651 ; WX 769 ; N uni25B3 ; G 3723 -U 9652 ; WX 502 ; N uni25B4 ; G 3724 -U 9653 ; WX 502 ; N uni25B5 ; G 3725 -U 9654 ; WX 769 ; N uni25B6 ; G 3726 -U 9655 ; WX 769 ; N uni25B7 ; G 3727 -U 9656 ; WX 502 ; N uni25B8 ; G 3728 -U 9657 ; WX 502 ; N uni25B9 ; G 3729 -U 9658 ; WX 769 ; N triagrt ; G 3730 -U 9659 ; WX 769 ; N uni25BB ; G 3731 -U 9660 ; WX 769 ; N triagdn ; G 3732 -U 9661 ; WX 769 ; N uni25BD ; G 3733 -U 9662 ; WX 502 ; N uni25BE ; G 3734 -U 9663 ; WX 502 ; N uni25BF ; G 3735 -U 9664 ; WX 769 ; N uni25C0 ; G 3736 -U 9665 ; WX 769 ; N uni25C1 ; G 3737 -U 9666 ; WX 502 ; N uni25C2 ; G 3738 -U 9667 ; WX 502 ; N uni25C3 ; G 3739 -U 9668 ; WX 769 ; N triaglf ; G 3740 -U 9669 ; WX 769 ; N uni25C5 ; G 3741 -U 9670 ; WX 769 ; N uni25C6 ; G 3742 -U 9671 ; WX 769 ; N uni25C7 ; G 3743 -U 9672 ; WX 769 ; N uni25C8 ; G 3744 -U 9673 ; WX 873 ; N uni25C9 ; G 3745 -U 9674 ; WX 494 ; N lozenge ; G 3746 -U 9675 ; WX 873 ; N circle ; G 3747 -U 9676 ; WX 873 ; N uni25CC ; G 3748 -U 9677 ; WX 873 ; N uni25CD ; G 3749 -U 9678 ; WX 873 ; N uni25CE ; G 3750 -U 9679 ; WX 873 ; N H18533 ; G 3751 -U 9680 ; WX 873 ; N uni25D0 ; G 3752 -U 9681 ; WX 873 ; N uni25D1 ; G 3753 -U 9682 ; WX 873 ; N uni25D2 ; G 3754 -U 9683 ; WX 873 ; N uni25D3 ; G 3755 -U 9684 ; WX 873 ; N uni25D4 ; G 3756 -U 9685 ; WX 873 ; N uni25D5 ; G 3757 -U 9686 ; WX 527 ; N uni25D6 ; G 3758 -U 9687 ; WX 527 ; N uni25D7 ; G 3759 -U 9688 ; WX 840 ; N invbullet ; G 3760 -U 9689 ; WX 970 ; N invcircle ; G 3761 -U 9690 ; WX 970 ; N uni25DA ; G 3762 -U 9691 ; WX 970 ; N uni25DB ; G 3763 -U 9692 ; WX 387 ; N uni25DC ; G 3764 -U 9693 ; WX 387 ; N uni25DD ; G 3765 -U 9694 ; WX 387 ; N uni25DE ; G 3766 -U 9695 ; WX 387 ; N uni25DF ; G 3767 -U 9696 ; WX 769 ; N uni25E0 ; G 3768 -U 9697 ; WX 769 ; N uni25E1 ; G 3769 -U 9698 ; WX 769 ; N uni25E2 ; G 3770 -U 9699 ; WX 769 ; N uni25E3 ; G 3771 -U 9700 ; WX 769 ; N uni25E4 ; G 3772 -U 9701 ; WX 769 ; N uni25E5 ; G 3773 -U 9702 ; WX 639 ; N openbullet ; G 3774 -U 9703 ; WX 945 ; N uni25E7 ; G 3775 -U 9704 ; WX 945 ; N uni25E8 ; G 3776 -U 9705 ; WX 945 ; N uni25E9 ; G 3777 -U 9706 ; WX 945 ; N uni25EA ; G 3778 -U 9707 ; WX 945 ; N uni25EB ; G 3779 -U 9708 ; WX 769 ; N uni25EC ; G 3780 -U 9709 ; WX 769 ; N uni25ED ; G 3781 -U 9710 ; WX 769 ; N uni25EE ; G 3782 -U 9711 ; WX 1119 ; N uni25EF ; G 3783 -U 9712 ; WX 945 ; N uni25F0 ; G 3784 -U 9713 ; WX 945 ; N uni25F1 ; G 3785 -U 9714 ; WX 945 ; N uni25F2 ; G 3786 -U 9715 ; WX 945 ; N uni25F3 ; G 3787 -U 9716 ; WX 873 ; N uni25F4 ; G 3788 -U 9717 ; WX 873 ; N uni25F5 ; G 3789 -U 9718 ; WX 873 ; N uni25F6 ; G 3790 -U 9719 ; WX 873 ; N uni25F7 ; G 3791 -U 9720 ; WX 769 ; N uni25F8 ; G 3792 -U 9721 ; WX 769 ; N uni25F9 ; G 3793 -U 9722 ; WX 769 ; N uni25FA ; G 3794 -U 9723 ; WX 830 ; N uni25FB ; G 3795 -U 9724 ; WX 830 ; N uni25FC ; G 3796 -U 9725 ; WX 732 ; N uni25FD ; G 3797 -U 9726 ; WX 732 ; N uni25FE ; G 3798 -U 9727 ; WX 769 ; N uni25FF ; G 3799 -U 9728 ; WX 896 ; N uni2600 ; G 3800 -U 9729 ; WX 1000 ; N uni2601 ; G 3801 -U 9730 ; WX 896 ; N uni2602 ; G 3802 -U 9731 ; WX 896 ; N uni2603 ; G 3803 -U 9732 ; WX 896 ; N uni2604 ; G 3804 -U 9733 ; WX 896 ; N uni2605 ; G 3805 -U 9734 ; WX 896 ; N uni2606 ; G 3806 -U 9735 ; WX 573 ; N uni2607 ; G 3807 -U 9736 ; WX 896 ; N uni2608 ; G 3808 -U 9737 ; WX 896 ; N uni2609 ; G 3809 -U 9738 ; WX 888 ; N uni260A ; G 3810 -U 9739 ; WX 888 ; N uni260B ; G 3811 -U 9740 ; WX 671 ; N uni260C ; G 3812 -U 9741 ; WX 1013 ; N uni260D ; G 3813 -U 9742 ; WX 1246 ; N uni260E ; G 3814 -U 9743 ; WX 1250 ; N uni260F ; G 3815 -U 9744 ; WX 896 ; N uni2610 ; G 3816 -U 9745 ; WX 896 ; N uni2611 ; G 3817 -U 9746 ; WX 896 ; N uni2612 ; G 3818 -U 9747 ; WX 532 ; N uni2613 ; G 3819 -U 9748 ; WX 896 ; N uni2614 ; G 3820 -U 9749 ; WX 896 ; N uni2615 ; G 3821 -U 9750 ; WX 896 ; N uni2616 ; G 3822 -U 9751 ; WX 896 ; N uni2617 ; G 3823 -U 9752 ; WX 896 ; N uni2618 ; G 3824 -U 9753 ; WX 896 ; N uni2619 ; G 3825 -U 9754 ; WX 896 ; N uni261A ; G 3826 -U 9755 ; WX 896 ; N uni261B ; G 3827 -U 9756 ; WX 896 ; N uni261C ; G 3828 -U 9757 ; WX 609 ; N uni261D ; G 3829 -U 9758 ; WX 896 ; N uni261E ; G 3830 -U 9759 ; WX 609 ; N uni261F ; G 3831 -U 9760 ; WX 896 ; N uni2620 ; G 3832 -U 9761 ; WX 896 ; N uni2621 ; G 3833 -U 9762 ; WX 896 ; N uni2622 ; G 3834 -U 9763 ; WX 896 ; N uni2623 ; G 3835 -U 9764 ; WX 669 ; N uni2624 ; G 3836 -U 9765 ; WX 746 ; N uni2625 ; G 3837 -U 9766 ; WX 649 ; N uni2626 ; G 3838 -U 9767 ; WX 784 ; N uni2627 ; G 3839 -U 9768 ; WX 545 ; N uni2628 ; G 3840 -U 9769 ; WX 896 ; N uni2629 ; G 3841 -U 9770 ; WX 896 ; N uni262A ; G 3842 -U 9771 ; WX 896 ; N uni262B ; G 3843 -U 9772 ; WX 710 ; N uni262C ; G 3844 -U 9773 ; WX 896 ; N uni262D ; G 3845 -U 9774 ; WX 896 ; N uni262E ; G 3846 -U 9775 ; WX 896 ; N uni262F ; G 3847 -U 9776 ; WX 896 ; N uni2630 ; G 3848 -U 9777 ; WX 896 ; N uni2631 ; G 3849 -U 9778 ; WX 896 ; N uni2632 ; G 3850 -U 9779 ; WX 896 ; N uni2633 ; G 3851 -U 9780 ; WX 896 ; N uni2634 ; G 3852 -U 9781 ; WX 896 ; N uni2635 ; G 3853 -U 9782 ; WX 896 ; N uni2636 ; G 3854 -U 9783 ; WX 896 ; N uni2637 ; G 3855 -U 9784 ; WX 896 ; N uni2638 ; G 3856 -U 9785 ; WX 1042 ; N uni2639 ; G 3857 -U 9786 ; WX 1042 ; N smileface ; G 3858 -U 9787 ; WX 1042 ; N invsmileface ; G 3859 -U 9788 ; WX 896 ; N sun ; G 3860 -U 9789 ; WX 896 ; N uni263D ; G 3861 -U 9790 ; WX 896 ; N uni263E ; G 3862 -U 9791 ; WX 614 ; N uni263F ; G 3863 -U 9792 ; WX 732 ; N female ; G 3864 -U 9793 ; WX 732 ; N uni2641 ; G 3865 -U 9794 ; WX 896 ; N male ; G 3866 -U 9795 ; WX 896 ; N uni2643 ; G 3867 -U 9796 ; WX 896 ; N uni2644 ; G 3868 -U 9797 ; WX 896 ; N uni2645 ; G 3869 -U 9798 ; WX 896 ; N uni2646 ; G 3870 -U 9799 ; WX 896 ; N uni2647 ; G 3871 -U 9800 ; WX 896 ; N uni2648 ; G 3872 -U 9801 ; WX 896 ; N uni2649 ; G 3873 -U 9802 ; WX 896 ; N uni264A ; G 3874 -U 9803 ; WX 896 ; N uni264B ; G 3875 -U 9804 ; WX 896 ; N uni264C ; G 3876 -U 9805 ; WX 896 ; N uni264D ; G 3877 -U 9806 ; WX 896 ; N uni264E ; G 3878 -U 9807 ; WX 896 ; N uni264F ; G 3879 -U 9808 ; WX 896 ; N uni2650 ; G 3880 -U 9809 ; WX 896 ; N uni2651 ; G 3881 -U 9810 ; WX 896 ; N uni2652 ; G 3882 -U 9811 ; WX 896 ; N uni2653 ; G 3883 -U 9812 ; WX 896 ; N uni2654 ; G 3884 -U 9813 ; WX 896 ; N uni2655 ; G 3885 -U 9814 ; WX 896 ; N uni2656 ; G 3886 -U 9815 ; WX 896 ; N uni2657 ; G 3887 -U 9816 ; WX 896 ; N uni2658 ; G 3888 -U 9817 ; WX 896 ; N uni2659 ; G 3889 -U 9818 ; WX 896 ; N uni265A ; G 3890 -U 9819 ; WX 896 ; N uni265B ; G 3891 -U 9820 ; WX 896 ; N uni265C ; G 3892 -U 9821 ; WX 896 ; N uni265D ; G 3893 -U 9822 ; WX 896 ; N uni265E ; G 3894 -U 9823 ; WX 896 ; N uni265F ; G 3895 -U 9824 ; WX 896 ; N spade ; G 3896 -U 9825 ; WX 896 ; N uni2661 ; G 3897 -U 9826 ; WX 896 ; N uni2662 ; G 3898 -U 9827 ; WX 896 ; N club ; G 3899 -U 9828 ; WX 896 ; N uni2664 ; G 3900 -U 9829 ; WX 896 ; N heart ; G 3901 -U 9830 ; WX 896 ; N diamond ; G 3902 -U 9831 ; WX 896 ; N uni2667 ; G 3903 -U 9832 ; WX 896 ; N uni2668 ; G 3904 -U 9833 ; WX 472 ; N uni2669 ; G 3905 -U 9834 ; WX 638 ; N musicalnote ; G 3906 -U 9835 ; WX 896 ; N musicalnotedbl ; G 3907 -U 9836 ; WX 896 ; N uni266C ; G 3908 -U 9837 ; WX 472 ; N uni266D ; G 3909 -U 9838 ; WX 357 ; N uni266E ; G 3910 -U 9839 ; WX 484 ; N uni266F ; G 3911 -U 9840 ; WX 748 ; N uni2670 ; G 3912 -U 9841 ; WX 766 ; N uni2671 ; G 3913 -U 9842 ; WX 896 ; N uni2672 ; G 3914 -U 9843 ; WX 896 ; N uni2673 ; G 3915 -U 9844 ; WX 896 ; N uni2674 ; G 3916 -U 9845 ; WX 896 ; N uni2675 ; G 3917 -U 9846 ; WX 896 ; N uni2676 ; G 3918 -U 9847 ; WX 896 ; N uni2677 ; G 3919 -U 9848 ; WX 896 ; N uni2678 ; G 3920 -U 9849 ; WX 896 ; N uni2679 ; G 3921 -U 9850 ; WX 896 ; N uni267A ; G 3922 -U 9851 ; WX 896 ; N uni267B ; G 3923 -U 9852 ; WX 896 ; N uni267C ; G 3924 -U 9853 ; WX 896 ; N uni267D ; G 3925 -U 9854 ; WX 896 ; N uni267E ; G 3926 -U 9855 ; WX 896 ; N uni267F ; G 3927 -U 9856 ; WX 869 ; N uni2680 ; G 3928 -U 9857 ; WX 869 ; N uni2681 ; G 3929 -U 9858 ; WX 869 ; N uni2682 ; G 3930 -U 9859 ; WX 869 ; N uni2683 ; G 3931 -U 9860 ; WX 869 ; N uni2684 ; G 3932 -U 9861 ; WX 869 ; N uni2685 ; G 3933 -U 9862 ; WX 896 ; N uni2686 ; G 3934 -U 9863 ; WX 896 ; N uni2687 ; G 3935 -U 9864 ; WX 896 ; N uni2688 ; G 3936 -U 9865 ; WX 896 ; N uni2689 ; G 3937 -U 9866 ; WX 896 ; N uni268A ; G 3938 -U 9867 ; WX 896 ; N uni268B ; G 3939 -U 9868 ; WX 896 ; N uni268C ; G 3940 -U 9869 ; WX 896 ; N uni268D ; G 3941 -U 9870 ; WX 896 ; N uni268E ; G 3942 -U 9871 ; WX 896 ; N uni268F ; G 3943 -U 9872 ; WX 896 ; N uni2690 ; G 3944 -U 9873 ; WX 896 ; N uni2691 ; G 3945 -U 9874 ; WX 896 ; N uni2692 ; G 3946 -U 9875 ; WX 896 ; N uni2693 ; G 3947 -U 9876 ; WX 896 ; N uni2694 ; G 3948 -U 9877 ; WX 541 ; N uni2695 ; G 3949 -U 9878 ; WX 896 ; N uni2696 ; G 3950 -U 9879 ; WX 896 ; N uni2697 ; G 3951 -U 9880 ; WX 896 ; N uni2698 ; G 3952 -U 9881 ; WX 896 ; N uni2699 ; G 3953 -U 9882 ; WX 896 ; N uni269A ; G 3954 -U 9883 ; WX 896 ; N uni269B ; G 3955 -U 9884 ; WX 896 ; N uni269C ; G 3956 -U 9886 ; WX 896 ; N uni269E ; G 3957 -U 9887 ; WX 896 ; N uni269F ; G 3958 -U 9888 ; WX 896 ; N uni26A0 ; G 3959 -U 9889 ; WX 702 ; N uni26A1 ; G 3960 -U 9890 ; WX 1004 ; N uni26A2 ; G 3961 -U 9891 ; WX 1089 ; N uni26A3 ; G 3962 -U 9892 ; WX 1175 ; N uni26A4 ; G 3963 -U 9893 ; WX 903 ; N uni26A5 ; G 3964 -U 9894 ; WX 838 ; N uni26A6 ; G 3965 -U 9895 ; WX 838 ; N uni26A7 ; G 3966 -U 9896 ; WX 838 ; N uni26A8 ; G 3967 -U 9897 ; WX 838 ; N uni26A9 ; G 3968 -U 9898 ; WX 838 ; N uni26AA ; G 3969 -U 9899 ; WX 838 ; N uni26AB ; G 3970 -U 9900 ; WX 838 ; N uni26AC ; G 3971 -U 9901 ; WX 838 ; N uni26AD ; G 3972 -U 9902 ; WX 838 ; N uni26AE ; G 3973 -U 9903 ; WX 838 ; N uni26AF ; G 3974 -U 9904 ; WX 844 ; N uni26B0 ; G 3975 -U 9905 ; WX 838 ; N uni26B1 ; G 3976 -U 9906 ; WX 732 ; N uni26B2 ; G 3977 -U 9907 ; WX 732 ; N uni26B3 ; G 3978 -U 9908 ; WX 732 ; N uni26B4 ; G 3979 -U 9909 ; WX 732 ; N uni26B5 ; G 3980 -U 9910 ; WX 850 ; N uni26B6 ; G 3981 -U 9911 ; WX 732 ; N uni26B7 ; G 3982 -U 9912 ; WX 732 ; N uni26B8 ; G 3983 -U 9920 ; WX 838 ; N uni26C0 ; G 3984 -U 9921 ; WX 838 ; N uni26C1 ; G 3985 -U 9922 ; WX 838 ; N uni26C2 ; G 3986 -U 9923 ; WX 838 ; N uni26C3 ; G 3987 -U 9954 ; WX 732 ; N uni26E2 ; G 3988 -U 9985 ; WX 838 ; N uni2701 ; G 3989 -U 9986 ; WX 838 ; N uni2702 ; G 3990 -U 9987 ; WX 838 ; N uni2703 ; G 3991 -U 9988 ; WX 838 ; N uni2704 ; G 3992 -U 9990 ; WX 838 ; N uni2706 ; G 3993 -U 9991 ; WX 838 ; N uni2707 ; G 3994 -U 9992 ; WX 838 ; N uni2708 ; G 3995 -U 9993 ; WX 838 ; N uni2709 ; G 3996 -U 9996 ; WX 838 ; N uni270C ; G 3997 -U 9997 ; WX 838 ; N uni270D ; G 3998 -U 9998 ; WX 838 ; N uni270E ; G 3999 -U 9999 ; WX 838 ; N uni270F ; G 4000 -U 10000 ; WX 838 ; N uni2710 ; G 4001 -U 10001 ; WX 838 ; N uni2711 ; G 4002 -U 10002 ; WX 838 ; N uni2712 ; G 4003 -U 10003 ; WX 838 ; N uni2713 ; G 4004 -U 10004 ; WX 838 ; N uni2714 ; G 4005 -U 10005 ; WX 838 ; N uni2715 ; G 4006 -U 10006 ; WX 838 ; N uni2716 ; G 4007 -U 10007 ; WX 838 ; N uni2717 ; G 4008 -U 10008 ; WX 838 ; N uni2718 ; G 4009 -U 10009 ; WX 838 ; N uni2719 ; G 4010 -U 10010 ; WX 838 ; N uni271A ; G 4011 -U 10011 ; WX 838 ; N uni271B ; G 4012 -U 10012 ; WX 838 ; N uni271C ; G 4013 -U 10013 ; WX 838 ; N uni271D ; G 4014 -U 10014 ; WX 838 ; N uni271E ; G 4015 -U 10015 ; WX 838 ; N uni271F ; G 4016 -U 10016 ; WX 838 ; N uni2720 ; G 4017 -U 10017 ; WX 838 ; N uni2721 ; G 4018 -U 10018 ; WX 838 ; N uni2722 ; G 4019 -U 10019 ; WX 838 ; N uni2723 ; G 4020 -U 10020 ; WX 838 ; N uni2724 ; G 4021 -U 10021 ; WX 838 ; N uni2725 ; G 4022 -U 10022 ; WX 838 ; N uni2726 ; G 4023 -U 10023 ; WX 838 ; N uni2727 ; G 4024 -U 10025 ; WX 838 ; N uni2729 ; G 4025 -U 10026 ; WX 838 ; N uni272A ; G 4026 -U 10027 ; WX 838 ; N uni272B ; G 4027 -U 10028 ; WX 838 ; N uni272C ; G 4028 -U 10029 ; WX 838 ; N uni272D ; G 4029 -U 10030 ; WX 838 ; N uni272E ; G 4030 -U 10031 ; WX 838 ; N uni272F ; G 4031 -U 10032 ; WX 838 ; N uni2730 ; G 4032 -U 10033 ; WX 838 ; N uni2731 ; G 4033 -U 10034 ; WX 838 ; N uni2732 ; G 4034 -U 10035 ; WX 838 ; N uni2733 ; G 4035 -U 10036 ; WX 838 ; N uni2734 ; G 4036 -U 10037 ; WX 838 ; N uni2735 ; G 4037 -U 10038 ; WX 838 ; N uni2736 ; G 4038 -U 10039 ; WX 838 ; N uni2737 ; G 4039 -U 10040 ; WX 838 ; N uni2738 ; G 4040 -U 10041 ; WX 838 ; N uni2739 ; G 4041 -U 10042 ; WX 838 ; N uni273A ; G 4042 -U 10043 ; WX 838 ; N uni273B ; G 4043 -U 10044 ; WX 838 ; N uni273C ; G 4044 -U 10045 ; WX 838 ; N uni273D ; G 4045 -U 10046 ; WX 838 ; N uni273E ; G 4046 -U 10047 ; WX 838 ; N uni273F ; G 4047 -U 10048 ; WX 838 ; N uni2740 ; G 4048 -U 10049 ; WX 838 ; N uni2741 ; G 4049 -U 10050 ; WX 838 ; N uni2742 ; G 4050 -U 10051 ; WX 838 ; N uni2743 ; G 4051 -U 10052 ; WX 838 ; N uni2744 ; G 4052 -U 10053 ; WX 838 ; N uni2745 ; G 4053 -U 10054 ; WX 838 ; N uni2746 ; G 4054 -U 10055 ; WX 838 ; N uni2747 ; G 4055 -U 10056 ; WX 838 ; N uni2748 ; G 4056 -U 10057 ; WX 838 ; N uni2749 ; G 4057 -U 10058 ; WX 838 ; N uni274A ; G 4058 -U 10059 ; WX 838 ; N uni274B ; G 4059 -U 10061 ; WX 896 ; N uni274D ; G 4060 -U 10063 ; WX 896 ; N uni274F ; G 4061 -U 10064 ; WX 896 ; N uni2750 ; G 4062 -U 10065 ; WX 896 ; N uni2751 ; G 4063 -U 10066 ; WX 896 ; N uni2752 ; G 4064 -U 10070 ; WX 896 ; N uni2756 ; G 4065 -U 10072 ; WX 838 ; N uni2758 ; G 4066 -U 10073 ; WX 838 ; N uni2759 ; G 4067 -U 10074 ; WX 838 ; N uni275A ; G 4068 -U 10075 ; WX 347 ; N uni275B ; G 4069 -U 10076 ; WX 347 ; N uni275C ; G 4070 -U 10077 ; WX 587 ; N uni275D ; G 4071 -U 10078 ; WX 587 ; N uni275E ; G 4072 -U 10081 ; WX 838 ; N uni2761 ; G 4073 -U 10082 ; WX 838 ; N uni2762 ; G 4074 -U 10083 ; WX 838 ; N uni2763 ; G 4075 -U 10084 ; WX 838 ; N uni2764 ; G 4076 -U 10085 ; WX 838 ; N uni2765 ; G 4077 -U 10086 ; WX 838 ; N uni2766 ; G 4078 -U 10087 ; WX 838 ; N uni2767 ; G 4079 -U 10088 ; WX 838 ; N uni2768 ; G 4080 -U 10089 ; WX 838 ; N uni2769 ; G 4081 -U 10090 ; WX 838 ; N uni276A ; G 4082 -U 10091 ; WX 838 ; N uni276B ; G 4083 -U 10092 ; WX 838 ; N uni276C ; G 4084 -U 10093 ; WX 838 ; N uni276D ; G 4085 -U 10094 ; WX 838 ; N uni276E ; G 4086 -U 10095 ; WX 838 ; N uni276F ; G 4087 -U 10096 ; WX 838 ; N uni2770 ; G 4088 -U 10097 ; WX 838 ; N uni2771 ; G 4089 -U 10098 ; WX 838 ; N uni2772 ; G 4090 -U 10099 ; WX 838 ; N uni2773 ; G 4091 -U 10100 ; WX 838 ; N uni2774 ; G 4092 -U 10101 ; WX 838 ; N uni2775 ; G 4093 -U 10102 ; WX 847 ; N uni2776 ; G 4094 -U 10103 ; WX 847 ; N uni2777 ; G 4095 -U 10104 ; WX 847 ; N uni2778 ; G 4096 -U 10105 ; WX 847 ; N uni2779 ; G 4097 -U 10106 ; WX 847 ; N uni277A ; G 4098 -U 10107 ; WX 847 ; N uni277B ; G 4099 -U 10108 ; WX 847 ; N uni277C ; G 4100 -U 10109 ; WX 847 ; N uni277D ; G 4101 -U 10110 ; WX 847 ; N uni277E ; G 4102 -U 10111 ; WX 847 ; N uni277F ; G 4103 -U 10112 ; WX 838 ; N uni2780 ; G 4104 -U 10113 ; WX 838 ; N uni2781 ; G 4105 -U 10114 ; WX 838 ; N uni2782 ; G 4106 -U 10115 ; WX 838 ; N uni2783 ; G 4107 -U 10116 ; WX 838 ; N uni2784 ; G 4108 -U 10117 ; WX 838 ; N uni2785 ; G 4109 -U 10118 ; WX 838 ; N uni2786 ; G 4110 -U 10119 ; WX 838 ; N uni2787 ; G 4111 -U 10120 ; WX 838 ; N uni2788 ; G 4112 -U 10121 ; WX 838 ; N uni2789 ; G 4113 -U 10122 ; WX 838 ; N uni278A ; G 4114 -U 10123 ; WX 838 ; N uni278B ; G 4115 -U 10124 ; WX 838 ; N uni278C ; G 4116 -U 10125 ; WX 838 ; N uni278D ; G 4117 -U 10126 ; WX 838 ; N uni278E ; G 4118 -U 10127 ; WX 838 ; N uni278F ; G 4119 -U 10128 ; WX 838 ; N uni2790 ; G 4120 -U 10129 ; WX 838 ; N uni2791 ; G 4121 -U 10130 ; WX 838 ; N uni2792 ; G 4122 -U 10131 ; WX 838 ; N uni2793 ; G 4123 -U 10132 ; WX 838 ; N uni2794 ; G 4124 -U 10136 ; WX 838 ; N uni2798 ; G 4125 -U 10137 ; WX 838 ; N uni2799 ; G 4126 -U 10138 ; WX 838 ; N uni279A ; G 4127 -U 10139 ; WX 838 ; N uni279B ; G 4128 -U 10140 ; WX 838 ; N uni279C ; G 4129 -U 10141 ; WX 838 ; N uni279D ; G 4130 -U 10142 ; WX 838 ; N uni279E ; G 4131 -U 10143 ; WX 838 ; N uni279F ; G 4132 -U 10144 ; WX 838 ; N uni27A0 ; G 4133 -U 10145 ; WX 838 ; N uni27A1 ; G 4134 -U 10146 ; WX 838 ; N uni27A2 ; G 4135 -U 10147 ; WX 838 ; N uni27A3 ; G 4136 -U 10148 ; WX 838 ; N uni27A4 ; G 4137 -U 10149 ; WX 838 ; N uni27A5 ; G 4138 -U 10150 ; WX 838 ; N uni27A6 ; G 4139 -U 10151 ; WX 838 ; N uni27A7 ; G 4140 -U 10152 ; WX 838 ; N uni27A8 ; G 4141 -U 10153 ; WX 838 ; N uni27A9 ; G 4142 -U 10154 ; WX 838 ; N uni27AA ; G 4143 -U 10155 ; WX 838 ; N uni27AB ; G 4144 -U 10156 ; WX 838 ; N uni27AC ; G 4145 -U 10157 ; WX 838 ; N uni27AD ; G 4146 -U 10158 ; WX 838 ; N uni27AE ; G 4147 -U 10159 ; WX 838 ; N uni27AF ; G 4148 -U 10161 ; WX 838 ; N uni27B1 ; G 4149 -U 10162 ; WX 838 ; N uni27B2 ; G 4150 -U 10163 ; WX 838 ; N uni27B3 ; G 4151 -U 10164 ; WX 838 ; N uni27B4 ; G 4152 -U 10165 ; WX 838 ; N uni27B5 ; G 4153 -U 10166 ; WX 838 ; N uni27B6 ; G 4154 -U 10167 ; WX 838 ; N uni27B7 ; G 4155 -U 10168 ; WX 838 ; N uni27B8 ; G 4156 -U 10169 ; WX 838 ; N uni27B9 ; G 4157 -U 10170 ; WX 838 ; N uni27BA ; G 4158 -U 10171 ; WX 838 ; N uni27BB ; G 4159 -U 10172 ; WX 838 ; N uni27BC ; G 4160 -U 10173 ; WX 838 ; N uni27BD ; G 4161 -U 10174 ; WX 838 ; N uni27BE ; G 4162 -U 10181 ; WX 457 ; N uni27C5 ; G 4163 -U 10182 ; WX 457 ; N uni27C6 ; G 4164 -U 10208 ; WX 494 ; N uni27E0 ; G 4165 -U 10214 ; WX 487 ; N uni27E6 ; G 4166 -U 10215 ; WX 487 ; N uni27E7 ; G 4167 -U 10216 ; WX 457 ; N uni27E8 ; G 4168 -U 10217 ; WX 457 ; N uni27E9 ; G 4169 -U 10218 ; WX 721 ; N uni27EA ; G 4170 -U 10219 ; WX 721 ; N uni27EB ; G 4171 -U 10224 ; WX 838 ; N uni27F0 ; G 4172 -U 10225 ; WX 838 ; N uni27F1 ; G 4173 -U 10226 ; WX 838 ; N uni27F2 ; G 4174 -U 10227 ; WX 838 ; N uni27F3 ; G 4175 -U 10228 ; WX 1157 ; N uni27F4 ; G 4176 -U 10229 ; WX 1434 ; N uni27F5 ; G 4177 -U 10230 ; WX 1434 ; N uni27F6 ; G 4178 -U 10231 ; WX 1434 ; N uni27F7 ; G 4179 -U 10232 ; WX 1434 ; N uni27F8 ; G 4180 -U 10233 ; WX 1434 ; N uni27F9 ; G 4181 -U 10234 ; WX 1434 ; N uni27FA ; G 4182 -U 10235 ; WX 1434 ; N uni27FB ; G 4183 -U 10236 ; WX 1434 ; N uni27FC ; G 4184 -U 10237 ; WX 1434 ; N uni27FD ; G 4185 -U 10238 ; WX 1434 ; N uni27FE ; G 4186 -U 10239 ; WX 1434 ; N uni27FF ; G 4187 -U 10240 ; WX 781 ; N uni2800 ; G 4188 -U 10241 ; WX 781 ; N uni2801 ; G 4189 -U 10242 ; WX 781 ; N uni2802 ; G 4190 -U 10243 ; WX 781 ; N uni2803 ; G 4191 -U 10244 ; WX 781 ; N uni2804 ; G 4192 -U 10245 ; WX 781 ; N uni2805 ; G 4193 -U 10246 ; WX 781 ; N uni2806 ; G 4194 -U 10247 ; WX 781 ; N uni2807 ; G 4195 -U 10248 ; WX 781 ; N uni2808 ; G 4196 -U 10249 ; WX 781 ; N uni2809 ; G 4197 -U 10250 ; WX 781 ; N uni280A ; G 4198 -U 10251 ; WX 781 ; N uni280B ; G 4199 -U 10252 ; WX 781 ; N uni280C ; G 4200 -U 10253 ; WX 781 ; N uni280D ; G 4201 -U 10254 ; WX 781 ; N uni280E ; G 4202 -U 10255 ; WX 781 ; N uni280F ; G 4203 -U 10256 ; WX 781 ; N uni2810 ; G 4204 -U 10257 ; WX 781 ; N uni2811 ; G 4205 -U 10258 ; WX 781 ; N uni2812 ; G 4206 -U 10259 ; WX 781 ; N uni2813 ; G 4207 -U 10260 ; WX 781 ; N uni2814 ; G 4208 -U 10261 ; WX 781 ; N uni2815 ; G 4209 -U 10262 ; WX 781 ; N uni2816 ; G 4210 -U 10263 ; WX 781 ; N uni2817 ; G 4211 -U 10264 ; WX 781 ; N uni2818 ; G 4212 -U 10265 ; WX 781 ; N uni2819 ; G 4213 -U 10266 ; WX 781 ; N uni281A ; G 4214 -U 10267 ; WX 781 ; N uni281B ; G 4215 -U 10268 ; WX 781 ; N uni281C ; G 4216 -U 10269 ; WX 781 ; N uni281D ; G 4217 -U 10270 ; WX 781 ; N uni281E ; G 4218 -U 10271 ; WX 781 ; N uni281F ; G 4219 -U 10272 ; WX 781 ; N uni2820 ; G 4220 -U 10273 ; WX 781 ; N uni2821 ; G 4221 -U 10274 ; WX 781 ; N uni2822 ; G 4222 -U 10275 ; WX 781 ; N uni2823 ; G 4223 -U 10276 ; WX 781 ; N uni2824 ; G 4224 -U 10277 ; WX 781 ; N uni2825 ; G 4225 -U 10278 ; WX 781 ; N uni2826 ; G 4226 -U 10279 ; WX 781 ; N uni2827 ; G 4227 -U 10280 ; WX 781 ; N uni2828 ; G 4228 -U 10281 ; WX 781 ; N uni2829 ; G 4229 -U 10282 ; WX 781 ; N uni282A ; G 4230 -U 10283 ; WX 781 ; N uni282B ; G 4231 -U 10284 ; WX 781 ; N uni282C ; G 4232 -U 10285 ; WX 781 ; N uni282D ; G 4233 -U 10286 ; WX 781 ; N uni282E ; G 4234 -U 10287 ; WX 781 ; N uni282F ; G 4235 -U 10288 ; WX 781 ; N uni2830 ; G 4236 -U 10289 ; WX 781 ; N uni2831 ; G 4237 -U 10290 ; WX 781 ; N uni2832 ; G 4238 -U 10291 ; WX 781 ; N uni2833 ; G 4239 -U 10292 ; WX 781 ; N uni2834 ; G 4240 -U 10293 ; WX 781 ; N uni2835 ; G 4241 -U 10294 ; WX 781 ; N uni2836 ; G 4242 -U 10295 ; WX 781 ; N uni2837 ; G 4243 -U 10296 ; WX 781 ; N uni2838 ; G 4244 -U 10297 ; WX 781 ; N uni2839 ; G 4245 -U 10298 ; WX 781 ; N uni283A ; G 4246 -U 10299 ; WX 781 ; N uni283B ; G 4247 -U 10300 ; WX 781 ; N uni283C ; G 4248 -U 10301 ; WX 781 ; N uni283D ; G 4249 -U 10302 ; WX 781 ; N uni283E ; G 4250 -U 10303 ; WX 781 ; N uni283F ; G 4251 -U 10304 ; WX 781 ; N uni2840 ; G 4252 -U 10305 ; WX 781 ; N uni2841 ; G 4253 -U 10306 ; WX 781 ; N uni2842 ; G 4254 -U 10307 ; WX 781 ; N uni2843 ; G 4255 -U 10308 ; WX 781 ; N uni2844 ; G 4256 -U 10309 ; WX 781 ; N uni2845 ; G 4257 -U 10310 ; WX 781 ; N uni2846 ; G 4258 -U 10311 ; WX 781 ; N uni2847 ; G 4259 -U 10312 ; WX 781 ; N uni2848 ; G 4260 -U 10313 ; WX 781 ; N uni2849 ; G 4261 -U 10314 ; WX 781 ; N uni284A ; G 4262 -U 10315 ; WX 781 ; N uni284B ; G 4263 -U 10316 ; WX 781 ; N uni284C ; G 4264 -U 10317 ; WX 781 ; N uni284D ; G 4265 -U 10318 ; WX 781 ; N uni284E ; G 4266 -U 10319 ; WX 781 ; N uni284F ; G 4267 -U 10320 ; WX 781 ; N uni2850 ; G 4268 -U 10321 ; WX 781 ; N uni2851 ; G 4269 -U 10322 ; WX 781 ; N uni2852 ; G 4270 -U 10323 ; WX 781 ; N uni2853 ; G 4271 -U 10324 ; WX 781 ; N uni2854 ; G 4272 -U 10325 ; WX 781 ; N uni2855 ; G 4273 -U 10326 ; WX 781 ; N uni2856 ; G 4274 -U 10327 ; WX 781 ; N uni2857 ; G 4275 -U 10328 ; WX 781 ; N uni2858 ; G 4276 -U 10329 ; WX 781 ; N uni2859 ; G 4277 -U 10330 ; WX 781 ; N uni285A ; G 4278 -U 10331 ; WX 781 ; N uni285B ; G 4279 -U 10332 ; WX 781 ; N uni285C ; G 4280 -U 10333 ; WX 781 ; N uni285D ; G 4281 -U 10334 ; WX 781 ; N uni285E ; G 4282 -U 10335 ; WX 781 ; N uni285F ; G 4283 -U 10336 ; WX 781 ; N uni2860 ; G 4284 -U 10337 ; WX 781 ; N uni2861 ; G 4285 -U 10338 ; WX 781 ; N uni2862 ; G 4286 -U 10339 ; WX 781 ; N uni2863 ; G 4287 -U 10340 ; WX 781 ; N uni2864 ; G 4288 -U 10341 ; WX 781 ; N uni2865 ; G 4289 -U 10342 ; WX 781 ; N uni2866 ; G 4290 -U 10343 ; WX 781 ; N uni2867 ; G 4291 -U 10344 ; WX 781 ; N uni2868 ; G 4292 -U 10345 ; WX 781 ; N uni2869 ; G 4293 -U 10346 ; WX 781 ; N uni286A ; G 4294 -U 10347 ; WX 781 ; N uni286B ; G 4295 -U 10348 ; WX 781 ; N uni286C ; G 4296 -U 10349 ; WX 781 ; N uni286D ; G 4297 -U 10350 ; WX 781 ; N uni286E ; G 4298 -U 10351 ; WX 781 ; N uni286F ; G 4299 -U 10352 ; WX 781 ; N uni2870 ; G 4300 -U 10353 ; WX 781 ; N uni2871 ; G 4301 -U 10354 ; WX 781 ; N uni2872 ; G 4302 -U 10355 ; WX 781 ; N uni2873 ; G 4303 -U 10356 ; WX 781 ; N uni2874 ; G 4304 -U 10357 ; WX 781 ; N uni2875 ; G 4305 -U 10358 ; WX 781 ; N uni2876 ; G 4306 -U 10359 ; WX 781 ; N uni2877 ; G 4307 -U 10360 ; WX 781 ; N uni2878 ; G 4308 -U 10361 ; WX 781 ; N uni2879 ; G 4309 -U 10362 ; WX 781 ; N uni287A ; G 4310 -U 10363 ; WX 781 ; N uni287B ; G 4311 -U 10364 ; WX 781 ; N uni287C ; G 4312 -U 10365 ; WX 781 ; N uni287D ; G 4313 -U 10366 ; WX 781 ; N uni287E ; G 4314 -U 10367 ; WX 781 ; N uni287F ; G 4315 -U 10368 ; WX 781 ; N uni2880 ; G 4316 -U 10369 ; WX 781 ; N uni2881 ; G 4317 -U 10370 ; WX 781 ; N uni2882 ; G 4318 -U 10371 ; WX 781 ; N uni2883 ; G 4319 -U 10372 ; WX 781 ; N uni2884 ; G 4320 -U 10373 ; WX 781 ; N uni2885 ; G 4321 -U 10374 ; WX 781 ; N uni2886 ; G 4322 -U 10375 ; WX 781 ; N uni2887 ; G 4323 -U 10376 ; WX 781 ; N uni2888 ; G 4324 -U 10377 ; WX 781 ; N uni2889 ; G 4325 -U 10378 ; WX 781 ; N uni288A ; G 4326 -U 10379 ; WX 781 ; N uni288B ; G 4327 -U 10380 ; WX 781 ; N uni288C ; G 4328 -U 10381 ; WX 781 ; N uni288D ; G 4329 -U 10382 ; WX 781 ; N uni288E ; G 4330 -U 10383 ; WX 781 ; N uni288F ; G 4331 -U 10384 ; WX 781 ; N uni2890 ; G 4332 -U 10385 ; WX 781 ; N uni2891 ; G 4333 -U 10386 ; WX 781 ; N uni2892 ; G 4334 -U 10387 ; WX 781 ; N uni2893 ; G 4335 -U 10388 ; WX 781 ; N uni2894 ; G 4336 -U 10389 ; WX 781 ; N uni2895 ; G 4337 -U 10390 ; WX 781 ; N uni2896 ; G 4338 -U 10391 ; WX 781 ; N uni2897 ; G 4339 -U 10392 ; WX 781 ; N uni2898 ; G 4340 -U 10393 ; WX 781 ; N uni2899 ; G 4341 -U 10394 ; WX 781 ; N uni289A ; G 4342 -U 10395 ; WX 781 ; N uni289B ; G 4343 -U 10396 ; WX 781 ; N uni289C ; G 4344 -U 10397 ; WX 781 ; N uni289D ; G 4345 -U 10398 ; WX 781 ; N uni289E ; G 4346 -U 10399 ; WX 781 ; N uni289F ; G 4347 -U 10400 ; WX 781 ; N uni28A0 ; G 4348 -U 10401 ; WX 781 ; N uni28A1 ; G 4349 -U 10402 ; WX 781 ; N uni28A2 ; G 4350 -U 10403 ; WX 781 ; N uni28A3 ; G 4351 -U 10404 ; WX 781 ; N uni28A4 ; G 4352 -U 10405 ; WX 781 ; N uni28A5 ; G 4353 -U 10406 ; WX 781 ; N uni28A6 ; G 4354 -U 10407 ; WX 781 ; N uni28A7 ; G 4355 -U 10408 ; WX 781 ; N uni28A8 ; G 4356 -U 10409 ; WX 781 ; N uni28A9 ; G 4357 -U 10410 ; WX 781 ; N uni28AA ; G 4358 -U 10411 ; WX 781 ; N uni28AB ; G 4359 -U 10412 ; WX 781 ; N uni28AC ; G 4360 -U 10413 ; WX 781 ; N uni28AD ; G 4361 -U 10414 ; WX 781 ; N uni28AE ; G 4362 -U 10415 ; WX 781 ; N uni28AF ; G 4363 -U 10416 ; WX 781 ; N uni28B0 ; G 4364 -U 10417 ; WX 781 ; N uni28B1 ; G 4365 -U 10418 ; WX 781 ; N uni28B2 ; G 4366 -U 10419 ; WX 781 ; N uni28B3 ; G 4367 -U 10420 ; WX 781 ; N uni28B4 ; G 4368 -U 10421 ; WX 781 ; N uni28B5 ; G 4369 -U 10422 ; WX 781 ; N uni28B6 ; G 4370 -U 10423 ; WX 781 ; N uni28B7 ; G 4371 -U 10424 ; WX 781 ; N uni28B8 ; G 4372 -U 10425 ; WX 781 ; N uni28B9 ; G 4373 -U 10426 ; WX 781 ; N uni28BA ; G 4374 -U 10427 ; WX 781 ; N uni28BB ; G 4375 -U 10428 ; WX 781 ; N uni28BC ; G 4376 -U 10429 ; WX 781 ; N uni28BD ; G 4377 -U 10430 ; WX 781 ; N uni28BE ; G 4378 -U 10431 ; WX 781 ; N uni28BF ; G 4379 -U 10432 ; WX 781 ; N uni28C0 ; G 4380 -U 10433 ; WX 781 ; N uni28C1 ; G 4381 -U 10434 ; WX 781 ; N uni28C2 ; G 4382 -U 10435 ; WX 781 ; N uni28C3 ; G 4383 -U 10436 ; WX 781 ; N uni28C4 ; G 4384 -U 10437 ; WX 781 ; N uni28C5 ; G 4385 -U 10438 ; WX 781 ; N uni28C6 ; G 4386 -U 10439 ; WX 781 ; N uni28C7 ; G 4387 -U 10440 ; WX 781 ; N uni28C8 ; G 4388 -U 10441 ; WX 781 ; N uni28C9 ; G 4389 -U 10442 ; WX 781 ; N uni28CA ; G 4390 -U 10443 ; WX 781 ; N uni28CB ; G 4391 -U 10444 ; WX 781 ; N uni28CC ; G 4392 -U 10445 ; WX 781 ; N uni28CD ; G 4393 -U 10446 ; WX 781 ; N uni28CE ; G 4394 -U 10447 ; WX 781 ; N uni28CF ; G 4395 -U 10448 ; WX 781 ; N uni28D0 ; G 4396 -U 10449 ; WX 781 ; N uni28D1 ; G 4397 -U 10450 ; WX 781 ; N uni28D2 ; G 4398 -U 10451 ; WX 781 ; N uni28D3 ; G 4399 -U 10452 ; WX 781 ; N uni28D4 ; G 4400 -U 10453 ; WX 781 ; N uni28D5 ; G 4401 -U 10454 ; WX 781 ; N uni28D6 ; G 4402 -U 10455 ; WX 781 ; N uni28D7 ; G 4403 -U 10456 ; WX 781 ; N uni28D8 ; G 4404 -U 10457 ; WX 781 ; N uni28D9 ; G 4405 -U 10458 ; WX 781 ; N uni28DA ; G 4406 -U 10459 ; WX 781 ; N uni28DB ; G 4407 -U 10460 ; WX 781 ; N uni28DC ; G 4408 -U 10461 ; WX 781 ; N uni28DD ; G 4409 -U 10462 ; WX 781 ; N uni28DE ; G 4410 -U 10463 ; WX 781 ; N uni28DF ; G 4411 -U 10464 ; WX 781 ; N uni28E0 ; G 4412 -U 10465 ; WX 781 ; N uni28E1 ; G 4413 -U 10466 ; WX 781 ; N uni28E2 ; G 4414 -U 10467 ; WX 781 ; N uni28E3 ; G 4415 -U 10468 ; WX 781 ; N uni28E4 ; G 4416 -U 10469 ; WX 781 ; N uni28E5 ; G 4417 -U 10470 ; WX 781 ; N uni28E6 ; G 4418 -U 10471 ; WX 781 ; N uni28E7 ; G 4419 -U 10472 ; WX 781 ; N uni28E8 ; G 4420 -U 10473 ; WX 781 ; N uni28E9 ; G 4421 -U 10474 ; WX 781 ; N uni28EA ; G 4422 -U 10475 ; WX 781 ; N uni28EB ; G 4423 -U 10476 ; WX 781 ; N uni28EC ; G 4424 -U 10477 ; WX 781 ; N uni28ED ; G 4425 -U 10478 ; WX 781 ; N uni28EE ; G 4426 -U 10479 ; WX 781 ; N uni28EF ; G 4427 -U 10480 ; WX 781 ; N uni28F0 ; G 4428 -U 10481 ; WX 781 ; N uni28F1 ; G 4429 -U 10482 ; WX 781 ; N uni28F2 ; G 4430 -U 10483 ; WX 781 ; N uni28F3 ; G 4431 -U 10484 ; WX 781 ; N uni28F4 ; G 4432 -U 10485 ; WX 781 ; N uni28F5 ; G 4433 -U 10486 ; WX 781 ; N uni28F6 ; G 4434 -U 10487 ; WX 781 ; N uni28F7 ; G 4435 -U 10488 ; WX 781 ; N uni28F8 ; G 4436 -U 10489 ; WX 781 ; N uni28F9 ; G 4437 -U 10490 ; WX 781 ; N uni28FA ; G 4438 -U 10491 ; WX 781 ; N uni28FB ; G 4439 -U 10492 ; WX 781 ; N uni28FC ; G 4440 -U 10493 ; WX 781 ; N uni28FD ; G 4441 -U 10494 ; WX 781 ; N uni28FE ; G 4442 -U 10495 ; WX 781 ; N uni28FF ; G 4443 -U 10502 ; WX 838 ; N uni2906 ; G 4444 -U 10503 ; WX 838 ; N uni2907 ; G 4445 -U 10506 ; WX 838 ; N uni290A ; G 4446 -U 10507 ; WX 838 ; N uni290B ; G 4447 -U 10560 ; WX 838 ; N uni2940 ; G 4448 -U 10561 ; WX 838 ; N uni2941 ; G 4449 -U 10627 ; WX 753 ; N uni2983 ; G 4450 -U 10628 ; WX 753 ; N uni2984 ; G 4451 -U 10702 ; WX 838 ; N uni29CE ; G 4452 -U 10703 ; WX 1046 ; N uni29CF ; G 4453 -U 10704 ; WX 1046 ; N uni29D0 ; G 4454 -U 10705 ; WX 1000 ; N uni29D1 ; G 4455 -U 10706 ; WX 1000 ; N uni29D2 ; G 4456 -U 10707 ; WX 1000 ; N uni29D3 ; G 4457 -U 10708 ; WX 1000 ; N uni29D4 ; G 4458 -U 10709 ; WX 1000 ; N uni29D5 ; G 4459 -U 10731 ; WX 494 ; N uni29EB ; G 4460 -U 10746 ; WX 838 ; N uni29FA ; G 4461 -U 10747 ; WX 838 ; N uni29FB ; G 4462 -U 10752 ; WX 1000 ; N uni2A00 ; G 4463 -U 10753 ; WX 1000 ; N uni2A01 ; G 4464 -U 10754 ; WX 1000 ; N uni2A02 ; G 4465 -U 10764 ; WX 1661 ; N uni2A0C ; G 4466 -U 10765 ; WX 563 ; N uni2A0D ; G 4467 -U 10766 ; WX 563 ; N uni2A0E ; G 4468 -U 10767 ; WX 563 ; N uni2A0F ; G 4469 -U 10768 ; WX 563 ; N uni2A10 ; G 4470 -U 10769 ; WX 563 ; N uni2A11 ; G 4471 -U 10770 ; WX 563 ; N uni2A12 ; G 4472 -U 10771 ; WX 563 ; N uni2A13 ; G 4473 -U 10772 ; WX 563 ; N uni2A14 ; G 4474 -U 10773 ; WX 563 ; N uni2A15 ; G 4475 -U 10774 ; WX 563 ; N uni2A16 ; G 4476 -U 10775 ; WX 563 ; N uni2A17 ; G 4477 -U 10776 ; WX 563 ; N uni2A18 ; G 4478 -U 10777 ; WX 563 ; N uni2A19 ; G 4479 -U 10778 ; WX 563 ; N uni2A1A ; G 4480 -U 10779 ; WX 563 ; N uni2A1B ; G 4481 -U 10780 ; WX 563 ; N uni2A1C ; G 4482 -U 10799 ; WX 838 ; N uni2A2F ; G 4483 -U 10858 ; WX 838 ; N uni2A6A ; G 4484 -U 10859 ; WX 838 ; N uni2A6B ; G 4485 -U 10877 ; WX 838 ; N uni2A7D ; G 4486 -U 10878 ; WX 838 ; N uni2A7E ; G 4487 -U 10879 ; WX 838 ; N uni2A7F ; G 4488 -U 10880 ; WX 838 ; N uni2A80 ; G 4489 -U 10881 ; WX 838 ; N uni2A81 ; G 4490 -U 10882 ; WX 838 ; N uni2A82 ; G 4491 -U 10883 ; WX 838 ; N uni2A83 ; G 4492 -U 10884 ; WX 838 ; N uni2A84 ; G 4493 -U 10885 ; WX 838 ; N uni2A85 ; G 4494 -U 10886 ; WX 838 ; N uni2A86 ; G 4495 -U 10887 ; WX 838 ; N uni2A87 ; G 4496 -U 10888 ; WX 838 ; N uni2A88 ; G 4497 -U 10889 ; WX 838 ; N uni2A89 ; G 4498 -U 10890 ; WX 838 ; N uni2A8A ; G 4499 -U 10891 ; WX 838 ; N uni2A8B ; G 4500 -U 10892 ; WX 838 ; N uni2A8C ; G 4501 -U 10893 ; WX 838 ; N uni2A8D ; G 4502 -U 10894 ; WX 838 ; N uni2A8E ; G 4503 -U 10895 ; WX 838 ; N uni2A8F ; G 4504 -U 10896 ; WX 838 ; N uni2A90 ; G 4505 -U 10897 ; WX 838 ; N uni2A91 ; G 4506 -U 10898 ; WX 838 ; N uni2A92 ; G 4507 -U 10899 ; WX 838 ; N uni2A93 ; G 4508 -U 10900 ; WX 838 ; N uni2A94 ; G 4509 -U 10901 ; WX 838 ; N uni2A95 ; G 4510 -U 10902 ; WX 838 ; N uni2A96 ; G 4511 -U 10903 ; WX 838 ; N uni2A97 ; G 4512 -U 10904 ; WX 838 ; N uni2A98 ; G 4513 -U 10905 ; WX 838 ; N uni2A99 ; G 4514 -U 10906 ; WX 838 ; N uni2A9A ; G 4515 -U 10907 ; WX 838 ; N uni2A9B ; G 4516 -U 10908 ; WX 838 ; N uni2A9C ; G 4517 -U 10909 ; WX 838 ; N uni2A9D ; G 4518 -U 10910 ; WX 838 ; N uni2A9E ; G 4519 -U 10911 ; WX 838 ; N uni2A9F ; G 4520 -U 10912 ; WX 838 ; N uni2AA0 ; G 4521 -U 10926 ; WX 838 ; N uni2AAE ; G 4522 -U 10927 ; WX 838 ; N uni2AAF ; G 4523 -U 10928 ; WX 838 ; N uni2AB0 ; G 4524 -U 10929 ; WX 838 ; N uni2AB1 ; G 4525 -U 10930 ; WX 838 ; N uni2AB2 ; G 4526 -U 10931 ; WX 838 ; N uni2AB3 ; G 4527 -U 10932 ; WX 838 ; N uni2AB4 ; G 4528 -U 10933 ; WX 838 ; N uni2AB5 ; G 4529 -U 10934 ; WX 838 ; N uni2AB6 ; G 4530 -U 10935 ; WX 838 ; N uni2AB7 ; G 4531 -U 10936 ; WX 838 ; N uni2AB8 ; G 4532 -U 10937 ; WX 838 ; N uni2AB9 ; G 4533 -U 10938 ; WX 838 ; N uni2ABA ; G 4534 -U 11001 ; WX 838 ; N uni2AF9 ; G 4535 -U 11002 ; WX 838 ; N uni2AFA ; G 4536 -U 11008 ; WX 838 ; N uni2B00 ; G 4537 -U 11009 ; WX 838 ; N uni2B01 ; G 4538 -U 11010 ; WX 838 ; N uni2B02 ; G 4539 -U 11011 ; WX 838 ; N uni2B03 ; G 4540 -U 11012 ; WX 838 ; N uni2B04 ; G 4541 -U 11013 ; WX 838 ; N uni2B05 ; G 4542 -U 11014 ; WX 838 ; N uni2B06 ; G 4543 -U 11015 ; WX 838 ; N uni2B07 ; G 4544 -U 11016 ; WX 838 ; N uni2B08 ; G 4545 -U 11017 ; WX 838 ; N uni2B09 ; G 4546 -U 11018 ; WX 838 ; N uni2B0A ; G 4547 -U 11019 ; WX 838 ; N uni2B0B ; G 4548 -U 11020 ; WX 838 ; N uni2B0C ; G 4549 -U 11021 ; WX 838 ; N uni2B0D ; G 4550 -U 11022 ; WX 838 ; N uni2B0E ; G 4551 -U 11023 ; WX 838 ; N uni2B0F ; G 4552 -U 11024 ; WX 838 ; N uni2B10 ; G 4553 -U 11025 ; WX 838 ; N uni2B11 ; G 4554 -U 11026 ; WX 945 ; N uni2B12 ; G 4555 -U 11027 ; WX 945 ; N uni2B13 ; G 4556 -U 11028 ; WX 945 ; N uni2B14 ; G 4557 -U 11029 ; WX 945 ; N uni2B15 ; G 4558 -U 11030 ; WX 769 ; N uni2B16 ; G 4559 -U 11031 ; WX 769 ; N uni2B17 ; G 4560 -U 11032 ; WX 769 ; N uni2B18 ; G 4561 -U 11033 ; WX 769 ; N uni2B19 ; G 4562 -U 11034 ; WX 945 ; N uni2B1A ; G 4563 -U 11039 ; WX 869 ; N uni2B1F ; G 4564 -U 11040 ; WX 869 ; N uni2B20 ; G 4565 -U 11041 ; WX 873 ; N uni2B21 ; G 4566 -U 11042 ; WX 873 ; N uni2B22 ; G 4567 -U 11043 ; WX 873 ; N uni2B23 ; G 4568 -U 11044 ; WX 1119 ; N uni2B24 ; G 4569 -U 11091 ; WX 869 ; N uni2B53 ; G 4570 -U 11092 ; WX 869 ; N uni2B54 ; G 4571 -U 11360 ; WX 637 ; N uni2C60 ; G 4572 -U 11361 ; WX 360 ; N uni2C61 ; G 4573 -U 11362 ; WX 637 ; N uni2C62 ; G 4574 -U 11363 ; WX 733 ; N uni2C63 ; G 4575 -U 11364 ; WX 770 ; N uni2C64 ; G 4576 -U 11365 ; WX 675 ; N uni2C65 ; G 4577 -U 11366 ; WX 478 ; N uni2C66 ; G 4578 -U 11367 ; WX 956 ; N uni2C67 ; G 4579 -U 11368 ; WX 712 ; N uni2C68 ; G 4580 -U 11369 ; WX 775 ; N uni2C69 ; G 4581 -U 11370 ; WX 665 ; N uni2C6A ; G 4582 -U 11371 ; WX 725 ; N uni2C6B ; G 4583 -U 11372 ; WX 582 ; N uni2C6C ; G 4584 -U 11373 ; WX 860 ; N uni2C6D ; G 4585 -U 11374 ; WX 995 ; N uni2C6E ; G 4586 -U 11375 ; WX 774 ; N uni2C6F ; G 4587 -U 11376 ; WX 860 ; N uni2C70 ; G 4588 -U 11377 ; WX 778 ; N uni2C71 ; G 4589 -U 11378 ; WX 1221 ; N uni2C72 ; G 4590 -U 11379 ; WX 1056 ; N uni2C73 ; G 4591 -U 11380 ; WX 652 ; N uni2C74 ; G 4592 -U 11381 ; WX 698 ; N uni2C75 ; G 4593 -U 11382 ; WX 565 ; N uni2C76 ; G 4594 -U 11383 ; WX 782 ; N uni2C77 ; G 4595 -U 11385 ; WX 538 ; N uni2C79 ; G 4596 -U 11386 ; WX 687 ; N uni2C7A ; G 4597 -U 11387 ; WX 559 ; N uni2C7B ; G 4598 -U 11388 ; WX 219 ; N uni2C7C ; G 4599 -U 11389 ; WX 487 ; N uni2C7D ; G 4600 -U 11390 ; WX 720 ; N uni2C7E ; G 4601 -U 11391 ; WX 725 ; N uni2C7F ; G 4602 -U 11520 ; WX 663 ; N uni2D00 ; G 4603 -U 11521 ; WX 676 ; N uni2D01 ; G 4604 -U 11522 ; WX 661 ; N uni2D02 ; G 4605 -U 11523 ; WX 629 ; N uni2D03 ; G 4606 -U 11524 ; WX 661 ; N uni2D04 ; G 4607 -U 11525 ; WX 1032 ; N uni2D05 ; G 4608 -U 11526 ; WX 718 ; N uni2D06 ; G 4609 -U 11527 ; WX 1032 ; N uni2D07 ; G 4610 -U 11528 ; WX 648 ; N uni2D08 ; G 4611 -U 11529 ; WX 667 ; N uni2D09 ; G 4612 -U 11530 ; WX 1032 ; N uni2D0A ; G 4613 -U 11531 ; WX 673 ; N uni2D0B ; G 4614 -U 11532 ; WX 677 ; N uni2D0C ; G 4615 -U 11533 ; WX 1036 ; N uni2D0D ; G 4616 -U 11534 ; WX 680 ; N uni2D0E ; G 4617 -U 11535 ; WX 886 ; N uni2D0F ; G 4618 -U 11536 ; WX 1032 ; N uni2D10 ; G 4619 -U 11537 ; WX 683 ; N uni2D11 ; G 4620 -U 11538 ; WX 674 ; N uni2D12 ; G 4621 -U 11539 ; WX 1035 ; N uni2D13 ; G 4622 -U 11540 ; WX 1033 ; N uni2D14 ; G 4623 -U 11541 ; WX 1027 ; N uni2D15 ; G 4624 -U 11542 ; WX 676 ; N uni2D16 ; G 4625 -U 11543 ; WX 673 ; N uni2D17 ; G 4626 -U 11544 ; WX 667 ; N uni2D18 ; G 4627 -U 11545 ; WX 667 ; N uni2D19 ; G 4628 -U 11546 ; WX 660 ; N uni2D1A ; G 4629 -U 11547 ; WX 671 ; N uni2D1B ; G 4630 -U 11548 ; WX 1039 ; N uni2D1C ; G 4631 -U 11549 ; WX 673 ; N uni2D1D ; G 4632 -U 11550 ; WX 692 ; N uni2D1E ; G 4633 -U 11551 ; WX 659 ; N uni2D1F ; G 4634 -U 11552 ; WX 1048 ; N uni2D20 ; G 4635 -U 11553 ; WX 660 ; N uni2D21 ; G 4636 -U 11554 ; WX 654 ; N uni2D22 ; G 4637 -U 11555 ; WX 670 ; N uni2D23 ; G 4638 -U 11556 ; WX 733 ; N uni2D24 ; G 4639 -U 11557 ; WX 1017 ; N uni2D25 ; G 4640 -U 11568 ; WX 691 ; N uni2D30 ; G 4641 -U 11569 ; WX 941 ; N uni2D31 ; G 4642 -U 11570 ; WX 941 ; N uni2D32 ; G 4643 -U 11571 ; WX 725 ; N uni2D33 ; G 4644 -U 11572 ; WX 725 ; N uni2D34 ; G 4645 -U 11573 ; WX 725 ; N uni2D35 ; G 4646 -U 11574 ; WX 676 ; N uni2D36 ; G 4647 -U 11575 ; WX 774 ; N uni2D37 ; G 4648 -U 11576 ; WX 774 ; N uni2D38 ; G 4649 -U 11577 ; WX 683 ; N uni2D39 ; G 4650 -U 11578 ; WX 683 ; N uni2D3A ; G 4651 -U 11579 ; WX 802 ; N uni2D3B ; G 4652 -U 11580 ; WX 989 ; N uni2D3C ; G 4653 -U 11581 ; WX 761 ; N uni2D3D ; G 4654 -U 11582 ; WX 623 ; N uni2D3E ; G 4655 -U 11583 ; WX 761 ; N uni2D3F ; G 4656 -U 11584 ; WX 941 ; N uni2D40 ; G 4657 -U 11585 ; WX 941 ; N uni2D41 ; G 4658 -U 11586 ; WX 373 ; N uni2D42 ; G 4659 -U 11587 ; WX 740 ; N uni2D43 ; G 4660 -U 11588 ; WX 837 ; N uni2D44 ; G 4661 -U 11589 ; WX 914 ; N uni2D45 ; G 4662 -U 11590 ; WX 672 ; N uni2D46 ; G 4663 -U 11591 ; WX 737 ; N uni2D47 ; G 4664 -U 11592 ; WX 680 ; N uni2D48 ; G 4665 -U 11593 ; WX 683 ; N uni2D49 ; G 4666 -U 11594 ; WX 602 ; N uni2D4A ; G 4667 -U 11595 ; WX 1039 ; N uni2D4B ; G 4668 -U 11596 ; WX 778 ; N uni2D4C ; G 4669 -U 11597 ; WX 837 ; N uni2D4D ; G 4670 -U 11598 ; WX 683 ; N uni2D4E ; G 4671 -U 11599 ; WX 372 ; N uni2D4F ; G 4672 -U 11600 ; WX 778 ; N uni2D50 ; G 4673 -U 11601 ; WX 373 ; N uni2D51 ; G 4674 -U 11602 ; WX 725 ; N uni2D52 ; G 4675 -U 11603 ; WX 691 ; N uni2D53 ; G 4676 -U 11604 ; WX 941 ; N uni2D54 ; G 4677 -U 11605 ; WX 941 ; N uni2D55 ; G 4678 -U 11606 ; WX 837 ; N uni2D56 ; G 4679 -U 11607 ; WX 373 ; N uni2D57 ; G 4680 -U 11608 ; WX 836 ; N uni2D58 ; G 4681 -U 11609 ; WX 941 ; N uni2D59 ; G 4682 -U 11610 ; WX 941 ; N uni2D5A ; G 4683 -U 11611 ; WX 734 ; N uni2D5B ; G 4684 -U 11612 ; WX 876 ; N uni2D5C ; G 4685 -U 11613 ; WX 771 ; N uni2D5D ; G 4686 -U 11614 ; WX 734 ; N uni2D5E ; G 4687 -U 11615 ; WX 683 ; N uni2D5F ; G 4688 -U 11616 ; WX 774 ; N uni2D60 ; G 4689 -U 11617 ; WX 837 ; N uni2D61 ; G 4690 -U 11618 ; WX 683 ; N uni2D62 ; G 4691 -U 11619 ; WX 850 ; N uni2D63 ; G 4692 -U 11620 ; WX 697 ; N uni2D64 ; G 4693 -U 11621 ; WX 850 ; N uni2D65 ; G 4694 -U 11631 ; WX 716 ; N uni2D6F ; G 4695 -U 11800 ; WX 580 ; N uni2E18 ; G 4696 -U 11807 ; WX 838 ; N uni2E1F ; G 4697 -U 11810 ; WX 457 ; N uni2E22 ; G 4698 -U 11811 ; WX 457 ; N uni2E23 ; G 4699 -U 11812 ; WX 457 ; N uni2E24 ; G 4700 -U 11813 ; WX 457 ; N uni2E25 ; G 4701 -U 11822 ; WX 580 ; N uni2E2E ; G 4702 -U 19904 ; WX 896 ; N uni4DC0 ; G 4703 -U 19905 ; WX 896 ; N uni4DC1 ; G 4704 -U 19906 ; WX 896 ; N uni4DC2 ; G 4705 -U 19907 ; WX 896 ; N uni4DC3 ; G 4706 -U 19908 ; WX 896 ; N uni4DC4 ; G 4707 -U 19909 ; WX 896 ; N uni4DC5 ; G 4708 -U 19910 ; WX 896 ; N uni4DC6 ; G 4709 -U 19911 ; WX 896 ; N uni4DC7 ; G 4710 -U 19912 ; WX 896 ; N uni4DC8 ; G 4711 -U 19913 ; WX 896 ; N uni4DC9 ; G 4712 -U 19914 ; WX 896 ; N uni4DCA ; G 4713 -U 19915 ; WX 896 ; N uni4DCB ; G 4714 -U 19916 ; WX 896 ; N uni4DCC ; G 4715 -U 19917 ; WX 896 ; N uni4DCD ; G 4716 -U 19918 ; WX 896 ; N uni4DCE ; G 4717 -U 19919 ; WX 896 ; N uni4DCF ; G 4718 -U 19920 ; WX 896 ; N uni4DD0 ; G 4719 -U 19921 ; WX 896 ; N uni4DD1 ; G 4720 -U 19922 ; WX 896 ; N uni4DD2 ; G 4721 -U 19923 ; WX 896 ; N uni4DD3 ; G 4722 -U 19924 ; WX 896 ; N uni4DD4 ; G 4723 -U 19925 ; WX 896 ; N uni4DD5 ; G 4724 -U 19926 ; WX 896 ; N uni4DD6 ; G 4725 -U 19927 ; WX 896 ; N uni4DD7 ; G 4726 -U 19928 ; WX 896 ; N uni4DD8 ; G 4727 -U 19929 ; WX 896 ; N uni4DD9 ; G 4728 -U 19930 ; WX 896 ; N uni4DDA ; G 4729 -U 19931 ; WX 896 ; N uni4DDB ; G 4730 -U 19932 ; WX 896 ; N uni4DDC ; G 4731 -U 19933 ; WX 896 ; N uni4DDD ; G 4732 -U 19934 ; WX 896 ; N uni4DDE ; G 4733 -U 19935 ; WX 896 ; N uni4DDF ; G 4734 -U 19936 ; WX 896 ; N uni4DE0 ; G 4735 -U 19937 ; WX 896 ; N uni4DE1 ; G 4736 -U 19938 ; WX 896 ; N uni4DE2 ; G 4737 -U 19939 ; WX 896 ; N uni4DE3 ; G 4738 -U 19940 ; WX 896 ; N uni4DE4 ; G 4739 -U 19941 ; WX 896 ; N uni4DE5 ; G 4740 -U 19942 ; WX 896 ; N uni4DE6 ; G 4741 -U 19943 ; WX 896 ; N uni4DE7 ; G 4742 -U 19944 ; WX 896 ; N uni4DE8 ; G 4743 -U 19945 ; WX 896 ; N uni4DE9 ; G 4744 -U 19946 ; WX 896 ; N uni4DEA ; G 4745 -U 19947 ; WX 896 ; N uni4DEB ; G 4746 -U 19948 ; WX 896 ; N uni4DEC ; G 4747 -U 19949 ; WX 896 ; N uni4DED ; G 4748 -U 19950 ; WX 896 ; N uni4DEE ; G 4749 -U 19951 ; WX 896 ; N uni4DEF ; G 4750 -U 19952 ; WX 896 ; N uni4DF0 ; G 4751 -U 19953 ; WX 896 ; N uni4DF1 ; G 4752 -U 19954 ; WX 896 ; N uni4DF2 ; G 4753 -U 19955 ; WX 896 ; N uni4DF3 ; G 4754 -U 19956 ; WX 896 ; N uni4DF4 ; G 4755 -U 19957 ; WX 896 ; N uni4DF5 ; G 4756 -U 19958 ; WX 896 ; N uni4DF6 ; G 4757 -U 19959 ; WX 896 ; N uni4DF7 ; G 4758 -U 19960 ; WX 896 ; N uni4DF8 ; G 4759 -U 19961 ; WX 896 ; N uni4DF9 ; G 4760 -U 19962 ; WX 896 ; N uni4DFA ; G 4761 -U 19963 ; WX 896 ; N uni4DFB ; G 4762 -U 19964 ; WX 896 ; N uni4DFC ; G 4763 -U 19965 ; WX 896 ; N uni4DFD ; G 4764 -U 19966 ; WX 896 ; N uni4DFE ; G 4765 -U 19967 ; WX 896 ; N uni4DFF ; G 4766 -U 42192 ; WX 762 ; N uniA4D0 ; G 4767 -U 42193 ; WX 733 ; N uniA4D1 ; G 4768 -U 42194 ; WX 733 ; N uniA4D2 ; G 4769 -U 42195 ; WX 830 ; N uniA4D3 ; G 4770 -U 42196 ; WX 682 ; N uniA4D4 ; G 4771 -U 42197 ; WX 682 ; N uniA4D5 ; G 4772 -U 42198 ; WX 821 ; N uniA4D6 ; G 4773 -U 42199 ; WX 775 ; N uniA4D7 ; G 4774 -U 42200 ; WX 775 ; N uniA4D8 ; G 4775 -U 42201 ; WX 530 ; N uniA4D9 ; G 4776 -U 42202 ; WX 734 ; N uniA4DA ; G 4777 -U 42203 ; WX 734 ; N uniA4DB ; G 4778 -U 42204 ; WX 725 ; N uniA4DC ; G 4779 -U 42205 ; WX 683 ; N uniA4DD ; G 4780 -U 42206 ; WX 683 ; N uniA4DE ; G 4781 -U 42207 ; WX 995 ; N uniA4DF ; G 4782 -U 42208 ; WX 837 ; N uniA4E0 ; G 4783 -U 42209 ; WX 637 ; N uniA4E1 ; G 4784 -U 42210 ; WX 720 ; N uniA4E2 ; G 4785 -U 42211 ; WX 770 ; N uniA4E3 ; G 4786 -U 42212 ; WX 770 ; N uniA4E4 ; G 4787 -U 42213 ; WX 774 ; N uniA4E5 ; G 4788 -U 42214 ; WX 774 ; N uniA4E6 ; G 4789 -U 42215 ; WX 837 ; N uniA4E7 ; G 4790 -U 42216 ; WX 775 ; N uniA4E8 ; G 4791 -U 42217 ; WX 530 ; N uniA4E9 ; G 4792 -U 42218 ; WX 1103 ; N uniA4EA ; G 4793 -U 42219 ; WX 771 ; N uniA4EB ; G 4794 -U 42220 ; WX 724 ; N uniA4EC ; G 4795 -U 42221 ; WX 762 ; N uniA4ED ; G 4796 -U 42222 ; WX 774 ; N uniA4EE ; G 4797 -U 42223 ; WX 774 ; N uniA4EF ; G 4798 -U 42224 ; WX 683 ; N uniA4F0 ; G 4799 -U 42225 ; WX 683 ; N uniA4F1 ; G 4800 -U 42226 ; WX 372 ; N uniA4F2 ; G 4801 -U 42227 ; WX 850 ; N uniA4F3 ; G 4802 -U 42228 ; WX 812 ; N uniA4F4 ; G 4803 -U 42229 ; WX 812 ; N uniA4F5 ; G 4804 -U 42230 ; WX 557 ; N uniA4F6 ; G 4805 -U 42231 ; WX 830 ; N uniA4F7 ; G 4806 -U 42232 ; WX 322 ; N uniA4F8 ; G 4807 -U 42233 ; WX 322 ; N uniA4F9 ; G 4808 -U 42234 ; WX 674 ; N uniA4FA ; G 4809 -U 42235 ; WX 674 ; N uniA4FB ; G 4810 -U 42236 ; WX 322 ; N uniA4FC ; G 4811 -U 42237 ; WX 322 ; N uniA4FD ; G 4812 -U 42238 ; WX 588 ; N uniA4FE ; G 4813 -U 42239 ; WX 588 ; N uniA4FF ; G 4814 -U 42564 ; WX 720 ; N uniA644 ; G 4815 -U 42565 ; WX 595 ; N uniA645 ; G 4816 -U 42566 ; WX 436 ; N uniA646 ; G 4817 -U 42567 ; WX 440 ; N uniA647 ; G 4818 -U 42572 ; WX 1405 ; N uniA64C ; G 4819 -U 42573 ; WX 1173 ; N uniA64D ; G 4820 -U 42576 ; WX 1234 ; N uniA650 ; G 4821 -U 42577 ; WX 1027 ; N uniA651 ; G 4822 -U 42580 ; WX 1174 ; N uniA654 ; G 4823 -U 42581 ; WX 972 ; N uniA655 ; G 4824 -U 42582 ; WX 1093 ; N uniA656 ; G 4825 -U 42583 ; WX 958 ; N uniA657 ; G 4826 -U 42594 ; WX 1085 ; N uniA662 ; G 4827 -U 42595 ; WX 924 ; N uniA663 ; G 4828 -U 42596 ; WX 1096 ; N uniA664 ; G 4829 -U 42597 ; WX 912 ; N uniA665 ; G 4830 -U 42598 ; WX 1260 ; N uniA666 ; G 4831 -U 42599 ; WX 997 ; N uniA667 ; G 4832 -U 42600 ; WX 850 ; N uniA668 ; G 4833 -U 42601 ; WX 687 ; N uniA669 ; G 4834 -U 42602 ; WX 1037 ; N uniA66A ; G 4835 -U 42603 ; WX 868 ; N uniA66B ; G 4836 -U 42604 ; WX 1406 ; N uniA66C ; G 4837 -U 42605 ; WX 1106 ; N uniA66D ; G 4838 -U 42606 ; WX 961 ; N uniA66E ; G 4839 -U 42634 ; WX 963 ; N uniA68A ; G 4840 -U 42635 ; WX 787 ; N uniA68B ; G 4841 -U 42636 ; WX 682 ; N uniA68C ; G 4842 -U 42637 ; WX 580 ; N uniA68D ; G 4843 -U 42644 ; WX 808 ; N uniA694 ; G 4844 -U 42645 ; WX 712 ; N uniA695 ; G 4845 -U 42648 ; WX 1406 ; N uniA698 ; G 4846 -U 42649 ; WX 1106 ; N uniA699 ; G 4847 -U 42760 ; WX 500 ; N uniA708 ; G 4848 -U 42761 ; WX 500 ; N uniA709 ; G 4849 -U 42762 ; WX 500 ; N uniA70A ; G 4850 -U 42763 ; WX 500 ; N uniA70B ; G 4851 -U 42764 ; WX 500 ; N uniA70C ; G 4852 -U 42765 ; WX 500 ; N uniA70D ; G 4853 -U 42766 ; WX 500 ; N uniA70E ; G 4854 -U 42767 ; WX 500 ; N uniA70F ; G 4855 -U 42768 ; WX 500 ; N uniA710 ; G 4856 -U 42769 ; WX 500 ; N uniA711 ; G 4857 -U 42770 ; WX 500 ; N uniA712 ; G 4858 -U 42771 ; WX 500 ; N uniA713 ; G 4859 -U 42772 ; WX 500 ; N uniA714 ; G 4860 -U 42773 ; WX 500 ; N uniA715 ; G 4861 -U 42774 ; WX 500 ; N uniA716 ; G 4862 -U 42779 ; WX 400 ; N uniA71B ; G 4863 -U 42780 ; WX 400 ; N uniA71C ; G 4864 -U 42781 ; WX 287 ; N uniA71D ; G 4865 -U 42782 ; WX 287 ; N uniA71E ; G 4866 -U 42783 ; WX 287 ; N uniA71F ; G 4867 -U 42786 ; WX 444 ; N uniA722 ; G 4868 -U 42787 ; WX 390 ; N uniA723 ; G 4869 -U 42788 ; WX 540 ; N uniA724 ; G 4870 -U 42789 ; WX 540 ; N uniA725 ; G 4871 -U 42790 ; WX 837 ; N uniA726 ; G 4872 -U 42791 ; WX 712 ; N uniA727 ; G 4873 -U 42792 ; WX 1031 ; N uniA728 ; G 4874 -U 42793 ; WX 857 ; N uniA729 ; G 4875 -U 42794 ; WX 696 ; N uniA72A ; G 4876 -U 42795 ; WX 557 ; N uniA72B ; G 4877 -U 42800 ; WX 559 ; N uniA730 ; G 4878 -U 42801 ; WX 595 ; N uniA731 ; G 4879 -U 42802 ; WX 1349 ; N uniA732 ; G 4880 -U 42803 ; WX 1052 ; N uniA733 ; G 4881 -U 42804 ; WX 1284 ; N uniA734 ; G 4882 -U 42805 ; WX 1064 ; N uniA735 ; G 4883 -U 42806 ; WX 1216 ; N uniA736 ; G 4884 -U 42807 ; WX 1054 ; N uniA737 ; G 4885 -U 42808 ; WX 1079 ; N uniA738 ; G 4886 -U 42809 ; WX 922 ; N uniA739 ; G 4887 -U 42810 ; WX 1079 ; N uniA73A ; G 4888 -U 42811 ; WX 922 ; N uniA73B ; G 4889 -U 42812 ; WX 1035 ; N uniA73C ; G 4890 -U 42813 ; WX 922 ; N uniA73D ; G 4891 -U 42814 ; WX 698 ; N uniA73E ; G 4892 -U 42815 ; WX 549 ; N uniA73F ; G 4893 -U 42816 ; WX 656 ; N uniA740 ; G 4894 -U 42817 ; WX 688 ; N uniA741 ; G 4895 -U 42822 ; WX 850 ; N uniA746 ; G 4896 -U 42823 ; WX 542 ; N uniA747 ; G 4897 -U 42824 ; WX 683 ; N uniA748 ; G 4898 -U 42825 ; WX 531 ; N uniA749 ; G 4899 -U 42826 ; WX 918 ; N uniA74A ; G 4900 -U 42827 ; WX 814 ; N uniA74B ; G 4901 -U 42830 ; WX 1406 ; N uniA74E ; G 4902 -U 42831 ; WX 1106 ; N uniA74F ; G 4903 -U 42832 ; WX 733 ; N uniA750 ; G 4904 -U 42833 ; WX 716 ; N uniA751 ; G 4905 -U 42834 ; WX 948 ; N uniA752 ; G 4906 -U 42835 ; WX 937 ; N uniA753 ; G 4907 -U 42838 ; WX 850 ; N uniA756 ; G 4908 -U 42839 ; WX 716 ; N uniA757 ; G 4909 -U 42852 ; WX 738 ; N uniA764 ; G 4910 -U 42853 ; WX 716 ; N uniA765 ; G 4911 -U 42854 ; WX 738 ; N uniA766 ; G 4912 -U 42855 ; WX 716 ; N uniA767 ; G 4913 -U 42880 ; WX 637 ; N uniA780 ; G 4914 -U 42881 ; WX 343 ; N uniA781 ; G 4915 -U 42882 ; WX 837 ; N uniA782 ; G 4916 -U 42883 ; WX 712 ; N uniA783 ; G 4917 -U 42889 ; WX 400 ; N uniA789 ; G 4918 -U 42890 ; WX 386 ; N uniA78A ; G 4919 -U 42891 ; WX 456 ; N uniA78B ; G 4920 -U 42892 ; WX 306 ; N uniA78C ; G 4921 -U 42893 ; WX 808 ; N uniA78D ; G 4922 -U 42894 ; WX 693 ; N uniA78E ; G 4923 -U 42896 ; WX 928 ; N uniA790 ; G 4924 -U 42897 ; WX 768 ; N uniA791 ; G 4925 -U 42912 ; WX 821 ; N uniA7A0 ; G 4926 -U 42913 ; WX 716 ; N uniA7A1 ; G 4927 -U 42914 ; WX 775 ; N uniA7A2 ; G 4928 -U 42915 ; WX 665 ; N uniA7A3 ; G 4929 -U 42916 ; WX 837 ; N uniA7A4 ; G 4930 -U 42917 ; WX 712 ; N uniA7A5 ; G 4931 -U 42918 ; WX 770 ; N uniA7A6 ; G 4932 -U 42919 ; WX 493 ; N uniA7A7 ; G 4933 -U 42920 ; WX 720 ; N uniA7A8 ; G 4934 -U 42921 ; WX 595 ; N uniA7A9 ; G 4935 -U 42922 ; WX 886 ; N uniA7AA ; G 4936 -U 43000 ; WX 613 ; N uniA7F8 ; G 4937 -U 43001 ; WX 689 ; N uniA7F9 ; G 4938 -U 43002 ; WX 1062 ; N uniA7FA ; G 4939 -U 43003 ; WX 683 ; N uniA7FB ; G 4940 -U 43004 ; WX 733 ; N uniA7FC ; G 4941 -U 43005 ; WX 995 ; N uniA7FD ; G 4942 -U 43006 ; WX 372 ; N uniA7FE ; G 4943 -U 43007 ; WX 1325 ; N uniA7FF ; G 4944 -U 61184 ; WX 216 ; N uni02E5.5 ; G 4945 -U 61185 ; WX 242 ; N uni02E6.5 ; G 4946 -U 61186 ; WX 267 ; N uni02E7.5 ; G 4947 -U 61187 ; WX 277 ; N uni02E8.5 ; G 4948 -U 61188 ; WX 282 ; N uni02E9.5 ; G 4949 -U 61189 ; WX 242 ; N uni02E5.4 ; G 4950 -U 61190 ; WX 216 ; N uni02E6.4 ; G 4951 -U 61191 ; WX 242 ; N uni02E7.4 ; G 4952 -U 61192 ; WX 267 ; N uni02E8.4 ; G 4953 -U 61193 ; WX 277 ; N uni02E9.4 ; G 4954 -U 61194 ; WX 267 ; N uni02E5.3 ; G 4955 -U 61195 ; WX 242 ; N uni02E6.3 ; G 4956 -U 61196 ; WX 216 ; N uni02E7.3 ; G 4957 -U 61197 ; WX 242 ; N uni02E8.3 ; G 4958 -U 61198 ; WX 267 ; N uni02E9.3 ; G 4959 -U 61199 ; WX 277 ; N uni02E5.2 ; G 4960 -U 61200 ; WX 267 ; N uni02E6.2 ; G 4961 -U 61201 ; WX 242 ; N uni02E7.2 ; G 4962 -U 61202 ; WX 216 ; N uni02E8.2 ; G 4963 -U 61203 ; WX 242 ; N uni02E9.2 ; G 4964 -U 61204 ; WX 282 ; N uni02E5.1 ; G 4965 -U 61205 ; WX 277 ; N uni02E6.1 ; G 4966 -U 61206 ; WX 267 ; N uni02E7.1 ; G 4967 -U 61207 ; WX 242 ; N uni02E8.1 ; G 4968 -U 61208 ; WX 216 ; N uni02E9.1 ; G 4969 -U 61209 ; WX 282 ; N stem ; G 4970 -U 62464 ; WX 612 ; N uniF400 ; G 4971 -U 62465 ; WX 612 ; N uniF401 ; G 4972 -U 62466 ; WX 653 ; N uniF402 ; G 4973 -U 62467 ; WX 902 ; N uniF403 ; G 4974 -U 62468 ; WX 622 ; N uniF404 ; G 4975 -U 62469 ; WX 622 ; N uniF405 ; G 4976 -U 62470 ; WX 661 ; N uniF406 ; G 4977 -U 62471 ; WX 895 ; N uniF407 ; G 4978 -U 62472 ; WX 589 ; N uniF408 ; G 4979 -U 62473 ; WX 622 ; N uniF409 ; G 4980 -U 62474 ; WX 1163 ; N uniF40A ; G 4981 -U 62475 ; WX 626 ; N uniF40B ; G 4982 -U 62476 ; WX 627 ; N uniF40C ; G 4983 -U 62477 ; WX 893 ; N uniF40D ; G 4984 -U 62478 ; WX 612 ; N uniF40E ; G 4985 -U 62479 ; WX 626 ; N uniF40F ; G 4986 -U 62480 ; WX 924 ; N uniF410 ; G 4987 -U 62481 ; WX 627 ; N uniF411 ; G 4988 -U 62482 ; WX 744 ; N uniF412 ; G 4989 -U 62483 ; WX 634 ; N uniF413 ; G 4990 -U 62484 ; WX 886 ; N uniF414 ; G 4991 -U 62485 ; WX 626 ; N uniF415 ; G 4992 -U 62486 ; WX 907 ; N uniF416 ; G 4993 -U 62487 ; WX 626 ; N uniF417 ; G 4994 -U 62488 ; WX 621 ; N uniF418 ; G 4995 -U 62489 ; WX 628 ; N uniF419 ; G 4996 -U 62490 ; WX 677 ; N uniF41A ; G 4997 -U 62491 ; WX 626 ; N uniF41B ; G 4998 -U 62492 ; WX 621 ; N uniF41C ; G 4999 -U 62493 ; WX 630 ; N uniF41D ; G 5000 -U 62494 ; WX 627 ; N uniF41E ; G 5001 -U 62495 ; WX 571 ; N uniF41F ; G 5002 -U 62496 ; WX 622 ; N uniF420 ; G 5003 -U 62497 ; WX 631 ; N uniF421 ; G 5004 -U 62498 ; WX 612 ; N uniF422 ; G 5005 -U 62499 ; WX 611 ; N uniF423 ; G 5006 -U 62500 ; WX 618 ; N uniF424 ; G 5007 -U 62501 ; WX 671 ; N uniF425 ; G 5008 -U 62502 ; WX 963 ; N uniF426 ; G 5009 -U 62504 ; WX 1023 ; N uniF428 ; G 5010 -U 62505 ; WX 844 ; N uniF429 ; G 5011 -U 62506 ; WX 563 ; N uniF42A ; G 5012 -U 62507 ; WX 563 ; N uniF42B ; G 5013 -U 62508 ; WX 563 ; N uniF42C ; G 5014 -U 62509 ; WX 563 ; N uniF42D ; G 5015 -U 62510 ; WX 563 ; N uniF42E ; G 5016 -U 62511 ; WX 563 ; N uniF42F ; G 5017 -U 62512 ; WX 555 ; N uniF430 ; G 5018 -U 62513 ; WX 555 ; N uniF431 ; G 5019 -U 62514 ; WX 555 ; N uniF432 ; G 5020 -U 62515 ; WX 555 ; N uniF433 ; G 5021 -U 62516 ; WX 573 ; N uniF434 ; G 5022 -U 62517 ; WX 573 ; N uniF435 ; G 5023 -U 62518 ; WX 573 ; N uniF436 ; G 5024 -U 62519 ; WX 824 ; N uniF437 ; G 5025 -U 62520 ; WX 824 ; N uniF438 ; G 5026 -U 62521 ; WX 824 ; N uniF439 ; G 5027 -U 62522 ; WX 824 ; N uniF43A ; G 5028 -U 62523 ; WX 824 ; N uniF43B ; G 5029 -U 62524 ; WX 611 ; N uniF43C ; G 5030 -U 62525 ; WX 611 ; N uniF43D ; G 5031 -U 62526 ; WX 611 ; N uniF43E ; G 5032 -U 62527 ; WX 611 ; N uniF43F ; G 5033 -U 62528 ; WX 611 ; N uniF440 ; G 5034 -U 62529 ; WX 611 ; N uniF441 ; G 5035 -U 63173 ; WX 687 ; N uniF6C5 ; G 5036 -U 64256 ; WX 810 ; N uniFB00 ; G 5037 -U 64257 ; WX 741 ; N fi ; G 5038 -U 64258 ; WX 741 ; N fl ; G 5039 -U 64259 ; WX 1115 ; N uniFB03 ; G 5040 -U 64260 ; WX 1116 ; N uniFB04 ; G 5041 -U 64261 ; WX 808 ; N uniFB05 ; G 5042 -U 64262 ; WX 1020 ; N uniFB06 ; G 5043 -U 64275 ; WX 1388 ; N uniFB13 ; G 5044 -U 64276 ; WX 1384 ; N uniFB14 ; G 5045 -U 64277 ; WX 1378 ; N uniFB15 ; G 5046 -U 64278 ; WX 1384 ; N uniFB16 ; G 5047 -U 64279 ; WX 1713 ; N uniFB17 ; G 5048 -U 64285 ; WX 294 ; N uniFB1D ; G 5049 -U 64286 ; WX 0 ; N uniFB1E ; G 5050 -U 64287 ; WX 519 ; N uniFB1F ; G 5051 -U 64288 ; WX 665 ; N uniFB20 ; G 5052 -U 64289 ; WX 939 ; N uniFB21 ; G 5053 -U 64290 ; WX 788 ; N uniFB22 ; G 5054 -U 64291 ; WX 920 ; N uniFB23 ; G 5055 -U 64292 ; WX 786 ; N uniFB24 ; G 5056 -U 64293 ; WX 857 ; N uniFB25 ; G 5057 -U 64294 ; WX 869 ; N uniFB26 ; G 5058 -U 64295 ; WX 821 ; N uniFB27 ; G 5059 -U 64296 ; WX 890 ; N uniFB28 ; G 5060 -U 64297 ; WX 838 ; N uniFB29 ; G 5061 -U 64298 ; WX 758 ; N uniFB2A ; G 5062 -U 64299 ; WX 758 ; N uniFB2B ; G 5063 -U 64300 ; WX 758 ; N uniFB2C ; G 5064 -U 64301 ; WX 758 ; N uniFB2D ; G 5065 -U 64302 ; WX 728 ; N uniFB2E ; G 5066 -U 64303 ; WX 728 ; N uniFB2F ; G 5067 -U 64304 ; WX 728 ; N uniFB30 ; G 5068 -U 64305 ; WX 610 ; N uniFB31 ; G 5069 -U 64306 ; WX 447 ; N uniFB32 ; G 5070 -U 64307 ; WX 588 ; N uniFB33 ; G 5071 -U 64308 ; WX 687 ; N uniFB34 ; G 5072 -U 64309 ; WX 437 ; N uniFB35 ; G 5073 -U 64310 ; WX 485 ; N uniFB36 ; G 5074 -U 64312 ; WX 679 ; N uniFB38 ; G 5075 -U 64313 ; WX 435 ; N uniFB39 ; G 5076 -U 64314 ; WX 578 ; N uniFB3A ; G 5077 -U 64315 ; WX 566 ; N uniFB3B ; G 5078 -U 64316 ; WX 605 ; N uniFB3C ; G 5079 -U 64318 ; WX 724 ; N uniFB3E ; G 5080 -U 64320 ; WX 453 ; N uniFB40 ; G 5081 -U 64321 ; WX 680 ; N uniFB41 ; G 5082 -U 64323 ; WX 675 ; N uniFB43 ; G 5083 -U 64324 ; WX 658 ; N uniFB44 ; G 5084 -U 64326 ; WX 653 ; N uniFB46 ; G 5085 -U 64327 ; WX 736 ; N uniFB47 ; G 5086 -U 64328 ; WX 602 ; N uniFB48 ; G 5087 -U 64329 ; WX 758 ; N uniFB49 ; G 5088 -U 64330 ; WX 683 ; N uniFB4A ; G 5089 -U 64331 ; WX 343 ; N uniFB4B ; G 5090 -U 64332 ; WX 610 ; N uniFB4C ; G 5091 -U 64333 ; WX 566 ; N uniFB4D ; G 5092 -U 64334 ; WX 658 ; N uniFB4E ; G 5093 -U 64335 ; WX 710 ; N uniFB4F ; G 5094 -U 64338 ; WX 1005 ; N uniFB52 ; G 5095 -U 64339 ; WX 1059 ; N uniFB53 ; G 5096 -U 64340 ; WX 375 ; N uniFB54 ; G 5097 -U 64341 ; WX 408 ; N uniFB55 ; G 5098 -U 64342 ; WX 1005 ; N uniFB56 ; G 5099 -U 64343 ; WX 1059 ; N uniFB57 ; G 5100 -U 64344 ; WX 375 ; N uniFB58 ; G 5101 -U 64345 ; WX 408 ; N uniFB59 ; G 5102 -U 64346 ; WX 1005 ; N uniFB5A ; G 5103 -U 64347 ; WX 1059 ; N uniFB5B ; G 5104 -U 64348 ; WX 375 ; N uniFB5C ; G 5105 -U 64349 ; WX 408 ; N uniFB5D ; G 5106 -U 64350 ; WX 1005 ; N uniFB5E ; G 5107 -U 64351 ; WX 1059 ; N uniFB5F ; G 5108 -U 64352 ; WX 375 ; N uniFB60 ; G 5109 -U 64353 ; WX 408 ; N uniFB61 ; G 5110 -U 64354 ; WX 1005 ; N uniFB62 ; G 5111 -U 64355 ; WX 1059 ; N uniFB63 ; G 5112 -U 64356 ; WX 375 ; N uniFB64 ; G 5113 -U 64357 ; WX 408 ; N uniFB65 ; G 5114 -U 64358 ; WX 1005 ; N uniFB66 ; G 5115 -U 64359 ; WX 1059 ; N uniFB67 ; G 5116 -U 64360 ; WX 375 ; N uniFB68 ; G 5117 -U 64361 ; WX 408 ; N uniFB69 ; G 5118 -U 64362 ; WX 1162 ; N uniFB6A ; G 5119 -U 64363 ; WX 1191 ; N uniFB6B ; G 5120 -U 64364 ; WX 655 ; N uniFB6C ; G 5121 -U 64365 ; WX 720 ; N uniFB6D ; G 5122 -U 64366 ; WX 1162 ; N uniFB6E ; G 5123 -U 64367 ; WX 1191 ; N uniFB6F ; G 5124 -U 64368 ; WX 655 ; N uniFB70 ; G 5125 -U 64369 ; WX 720 ; N uniFB71 ; G 5126 -U 64370 ; WX 721 ; N uniFB72 ; G 5127 -U 64371 ; WX 721 ; N uniFB73 ; G 5128 -U 64372 ; WX 721 ; N uniFB74 ; G 5129 -U 64373 ; WX 721 ; N uniFB75 ; G 5130 -U 64374 ; WX 721 ; N uniFB76 ; G 5131 -U 64375 ; WX 721 ; N uniFB77 ; G 5132 -U 64376 ; WX 721 ; N uniFB78 ; G 5133 -U 64377 ; WX 721 ; N uniFB79 ; G 5134 -U 64378 ; WX 721 ; N uniFB7A ; G 5135 -U 64379 ; WX 721 ; N uniFB7B ; G 5136 -U 64380 ; WX 721 ; N uniFB7C ; G 5137 -U 64381 ; WX 721 ; N uniFB7D ; G 5138 -U 64382 ; WX 721 ; N uniFB7E ; G 5139 -U 64383 ; WX 721 ; N uniFB7F ; G 5140 -U 64384 ; WX 721 ; N uniFB80 ; G 5141 -U 64385 ; WX 721 ; N uniFB81 ; G 5142 -U 64386 ; WX 513 ; N uniFB82 ; G 5143 -U 64387 ; WX 578 ; N uniFB83 ; G 5144 -U 64388 ; WX 513 ; N uniFB84 ; G 5145 -U 64389 ; WX 578 ; N uniFB85 ; G 5146 -U 64390 ; WX 513 ; N uniFB86 ; G 5147 -U 64391 ; WX 578 ; N uniFB87 ; G 5148 -U 64392 ; WX 513 ; N uniFB88 ; G 5149 -U 64393 ; WX 578 ; N uniFB89 ; G 5150 -U 64394 ; WX 576 ; N uniFB8A ; G 5151 -U 64395 ; WX 622 ; N uniFB8B ; G 5152 -U 64396 ; WX 576 ; N uniFB8C ; G 5153 -U 64397 ; WX 622 ; N uniFB8D ; G 5154 -U 64398 ; WX 1024 ; N uniFB8E ; G 5155 -U 64399 ; WX 1024 ; N uniFB8F ; G 5156 -U 64400 ; WX 582 ; N uniFB90 ; G 5157 -U 64401 ; WX 582 ; N uniFB91 ; G 5158 -U 64402 ; WX 1024 ; N uniFB92 ; G 5159 -U 64403 ; WX 1024 ; N uniFB93 ; G 5160 -U 64404 ; WX 582 ; N uniFB94 ; G 5161 -U 64405 ; WX 582 ; N uniFB95 ; G 5162 -U 64406 ; WX 1024 ; N uniFB96 ; G 5163 -U 64407 ; WX 1024 ; N uniFB97 ; G 5164 -U 64408 ; WX 582 ; N uniFB98 ; G 5165 -U 64409 ; WX 582 ; N uniFB99 ; G 5166 -U 64410 ; WX 1024 ; N uniFB9A ; G 5167 -U 64411 ; WX 1024 ; N uniFB9B ; G 5168 -U 64412 ; WX 582 ; N uniFB9C ; G 5169 -U 64413 ; WX 582 ; N uniFB9D ; G 5170 -U 64414 ; WX 854 ; N uniFB9E ; G 5171 -U 64415 ; WX 900 ; N uniFB9F ; G 5172 -U 64416 ; WX 854 ; N uniFBA0 ; G 5173 -U 64417 ; WX 900 ; N uniFBA1 ; G 5174 -U 64418 ; WX 375 ; N uniFBA2 ; G 5175 -U 64419 ; WX 408 ; N uniFBA3 ; G 5176 -U 64426 ; WX 938 ; N uniFBAA ; G 5177 -U 64427 ; WX 880 ; N uniFBAB ; G 5178 -U 64428 ; WX 693 ; N uniFBAC ; G 5179 -U 64429 ; WX 660 ; N uniFBAD ; G 5180 -U 64467 ; WX 824 ; N uniFBD3 ; G 5181 -U 64468 ; WX 843 ; N uniFBD4 ; G 5182 -U 64469 ; WX 476 ; N uniFBD5 ; G 5183 -U 64470 ; WX 552 ; N uniFBD6 ; G 5184 -U 64471 ; WX 622 ; N uniFBD7 ; G 5185 -U 64472 ; WX 627 ; N uniFBD8 ; G 5186 -U 64473 ; WX 622 ; N uniFBD9 ; G 5187 -U 64474 ; WX 627 ; N uniFBDA ; G 5188 -U 64475 ; WX 622 ; N uniFBDB ; G 5189 -U 64476 ; WX 627 ; N uniFBDC ; G 5190 -U 64478 ; WX 622 ; N uniFBDE ; G 5191 -U 64479 ; WX 627 ; N uniFBDF ; G 5192 -U 64484 ; WX 917 ; N uniFBE4 ; G 5193 -U 64485 ; WX 1012 ; N uniFBE5 ; G 5194 -U 64486 ; WX 375 ; N uniFBE6 ; G 5195 -U 64487 ; WX 408 ; N uniFBE7 ; G 5196 -U 64488 ; WX 375 ; N uniFBE8 ; G 5197 -U 64489 ; WX 408 ; N uniFBE9 ; G 5198 -U 64508 ; WX 917 ; N uniFBFC ; G 5199 -U 64509 ; WX 1012 ; N uniFBFD ; G 5200 -U 64510 ; WX 375 ; N uniFBFE ; G 5201 -U 64511 ; WX 408 ; N uniFBFF ; G 5202 -U 65024 ; WX 0 ; N uniFE00 ; G 5203 -U 65025 ; WX 0 ; N uniFE01 ; G 5204 -U 65026 ; WX 0 ; N uniFE02 ; G 5205 -U 65027 ; WX 0 ; N uniFE03 ; G 5206 -U 65028 ; WX 0 ; N uniFE04 ; G 5207 -U 65029 ; WX 0 ; N uniFE05 ; G 5208 -U 65030 ; WX 0 ; N uniFE06 ; G 5209 -U 65031 ; WX 0 ; N uniFE07 ; G 5210 -U 65032 ; WX 0 ; N uniFE08 ; G 5211 -U 65033 ; WX 0 ; N uniFE09 ; G 5212 -U 65034 ; WX 0 ; N uniFE0A ; G 5213 -U 65035 ; WX 0 ; N uniFE0B ; G 5214 -U 65036 ; WX 0 ; N uniFE0C ; G 5215 -U 65037 ; WX 0 ; N uniFE0D ; G 5216 -U 65038 ; WX 0 ; N uniFE0E ; G 5217 -U 65039 ; WX 0 ; N uniFE0F ; G 5218 -U 65056 ; WX 0 ; N uniFE20 ; G 5219 -U 65057 ; WX 0 ; N uniFE21 ; G 5220 -U 65058 ; WX 0 ; N uniFE22 ; G 5221 -U 65059 ; WX 0 ; N uniFE23 ; G 5222 -U 65136 ; WX 342 ; N uniFE70 ; G 5223 -U 65137 ; WX 342 ; N uniFE71 ; G 5224 -U 65138 ; WX 342 ; N uniFE72 ; G 5225 -U 65139 ; WX 346 ; N uniFE73 ; G 5226 -U 65140 ; WX 342 ; N uniFE74 ; G 5227 -U 65142 ; WX 342 ; N uniFE76 ; G 5228 -U 65143 ; WX 342 ; N uniFE77 ; G 5229 -U 65144 ; WX 342 ; N uniFE78 ; G 5230 -U 65145 ; WX 342 ; N uniFE79 ; G 5231 -U 65146 ; WX 342 ; N uniFE7A ; G 5232 -U 65147 ; WX 342 ; N uniFE7B ; G 5233 -U 65148 ; WX 342 ; N uniFE7C ; G 5234 -U 65149 ; WX 342 ; N uniFE7D ; G 5235 -U 65150 ; WX 342 ; N uniFE7E ; G 5236 -U 65151 ; WX 342 ; N uniFE7F ; G 5237 -U 65152 ; WX 511 ; N uniFE80 ; G 5238 -U 65153 ; WX 343 ; N uniFE81 ; G 5239 -U 65154 ; WX 375 ; N uniFE82 ; G 5240 -U 65155 ; WX 343 ; N uniFE83 ; G 5241 -U 65156 ; WX 375 ; N uniFE84 ; G 5242 -U 65157 ; WX 622 ; N uniFE85 ; G 5243 -U 65158 ; WX 627 ; N uniFE86 ; G 5244 -U 65159 ; WX 343 ; N uniFE87 ; G 5245 -U 65160 ; WX 375 ; N uniFE88 ; G 5246 -U 65161 ; WX 917 ; N uniFE89 ; G 5247 -U 65162 ; WX 917 ; N uniFE8A ; G 5248 -U 65163 ; WX 375 ; N uniFE8B ; G 5249 -U 65164 ; WX 408 ; N uniFE8C ; G 5250 -U 65165 ; WX 343 ; N uniFE8D ; G 5251 -U 65166 ; WX 375 ; N uniFE8E ; G 5252 -U 65167 ; WX 1005 ; N uniFE8F ; G 5253 -U 65168 ; WX 1059 ; N uniFE90 ; G 5254 -U 65169 ; WX 375 ; N uniFE91 ; G 5255 -U 65170 ; WX 408 ; N uniFE92 ; G 5256 -U 65171 ; WX 590 ; N uniFE93 ; G 5257 -U 65172 ; WX 606 ; N uniFE94 ; G 5258 -U 65173 ; WX 1005 ; N uniFE95 ; G 5259 -U 65174 ; WX 1059 ; N uniFE96 ; G 5260 -U 65175 ; WX 375 ; N uniFE97 ; G 5261 -U 65176 ; WX 408 ; N uniFE98 ; G 5262 -U 65177 ; WX 1005 ; N uniFE99 ; G 5263 -U 65178 ; WX 1059 ; N uniFE9A ; G 5264 -U 65179 ; WX 375 ; N uniFE9B ; G 5265 -U 65180 ; WX 408 ; N uniFE9C ; G 5266 -U 65181 ; WX 721 ; N uniFE9D ; G 5267 -U 65182 ; WX 721 ; N uniFE9E ; G 5268 -U 65183 ; WX 721 ; N uniFE9F ; G 5269 -U 65184 ; WX 721 ; N uniFEA0 ; G 5270 -U 65185 ; WX 721 ; N uniFEA1 ; G 5271 -U 65186 ; WX 721 ; N uniFEA2 ; G 5272 -U 65187 ; WX 721 ; N uniFEA3 ; G 5273 -U 65188 ; WX 721 ; N uniFEA4 ; G 5274 -U 65189 ; WX 721 ; N uniFEA5 ; G 5275 -U 65190 ; WX 721 ; N uniFEA6 ; G 5276 -U 65191 ; WX 721 ; N uniFEA7 ; G 5277 -U 65192 ; WX 721 ; N uniFEA8 ; G 5278 -U 65193 ; WX 513 ; N uniFEA9 ; G 5279 -U 65194 ; WX 578 ; N uniFEAA ; G 5280 -U 65195 ; WX 513 ; N uniFEAB ; G 5281 -U 65196 ; WX 578 ; N uniFEAC ; G 5282 -U 65197 ; WX 576 ; N uniFEAD ; G 5283 -U 65198 ; WX 622 ; N uniFEAE ; G 5284 -U 65199 ; WX 576 ; N uniFEAF ; G 5285 -U 65200 ; WX 622 ; N uniFEB0 ; G 5286 -U 65201 ; WX 1380 ; N uniFEB1 ; G 5287 -U 65202 ; WX 1414 ; N uniFEB2 ; G 5288 -U 65203 ; WX 983 ; N uniFEB3 ; G 5289 -U 65204 ; WX 1018 ; N uniFEB4 ; G 5290 -U 65205 ; WX 1380 ; N uniFEB5 ; G 5291 -U 65206 ; WX 1414 ; N uniFEB6 ; G 5292 -U 65207 ; WX 983 ; N uniFEB7 ; G 5293 -U 65208 ; WX 1018 ; N uniFEB8 ; G 5294 -U 65209 ; WX 1345 ; N uniFEB9 ; G 5295 -U 65210 ; WX 1364 ; N uniFEBA ; G 5296 -U 65211 ; WX 966 ; N uniFEBB ; G 5297 -U 65212 ; WX 985 ; N uniFEBC ; G 5298 -U 65213 ; WX 1345 ; N uniFEBD ; G 5299 -U 65214 ; WX 1364 ; N uniFEBE ; G 5300 -U 65215 ; WX 966 ; N uniFEBF ; G 5301 -U 65216 ; WX 985 ; N uniFEC0 ; G 5302 -U 65217 ; WX 1039 ; N uniFEC1 ; G 5303 -U 65218 ; WX 1071 ; N uniFEC2 ; G 5304 -U 65219 ; WX 942 ; N uniFEC3 ; G 5305 -U 65220 ; WX 974 ; N uniFEC4 ; G 5306 -U 65221 ; WX 1039 ; N uniFEC5 ; G 5307 -U 65222 ; WX 1071 ; N uniFEC6 ; G 5308 -U 65223 ; WX 942 ; N uniFEC7 ; G 5309 -U 65224 ; WX 974 ; N uniFEC8 ; G 5310 -U 65225 ; WX 683 ; N uniFEC9 ; G 5311 -U 65226 ; WX 683 ; N uniFECA ; G 5312 -U 65227 ; WX 683 ; N uniFECB ; G 5313 -U 65228 ; WX 564 ; N uniFECC ; G 5314 -U 65229 ; WX 683 ; N uniFECD ; G 5315 -U 65230 ; WX 683 ; N uniFECE ; G 5316 -U 65231 ; WX 683 ; N uniFECF ; G 5317 -U 65232 ; WX 564 ; N uniFED0 ; G 5318 -U 65233 ; WX 1162 ; N uniFED1 ; G 5319 -U 65234 ; WX 1191 ; N uniFED2 ; G 5320 -U 65235 ; WX 655 ; N uniFED3 ; G 5321 -U 65236 ; WX 720 ; N uniFED4 ; G 5322 -U 65237 ; WX 894 ; N uniFED5 ; G 5323 -U 65238 ; WX 901 ; N uniFED6 ; G 5324 -U 65239 ; WX 655 ; N uniFED7 ; G 5325 -U 65240 ; WX 720 ; N uniFED8 ; G 5326 -U 65241 ; WX 917 ; N uniFED9 ; G 5327 -U 65242 ; WX 931 ; N uniFEDA ; G 5328 -U 65243 ; WX 582 ; N uniFEDB ; G 5329 -U 65244 ; WX 582 ; N uniFEDC ; G 5330 -U 65245 ; WX 868 ; N uniFEDD ; G 5331 -U 65246 ; WX 893 ; N uniFEDE ; G 5332 -U 65247 ; WX 375 ; N uniFEDF ; G 5333 -U 65248 ; WX 408 ; N uniFEE0 ; G 5334 -U 65249 ; WX 733 ; N uniFEE1 ; G 5335 -U 65250 ; WX 784 ; N uniFEE2 ; G 5336 -U 65251 ; WX 619 ; N uniFEE3 ; G 5337 -U 65252 ; WX 670 ; N uniFEE4 ; G 5338 -U 65253 ; WX 854 ; N uniFEE5 ; G 5339 -U 65254 ; WX 900 ; N uniFEE6 ; G 5340 -U 65255 ; WX 375 ; N uniFEE7 ; G 5341 -U 65256 ; WX 408 ; N uniFEE8 ; G 5342 -U 65257 ; WX 590 ; N uniFEE9 ; G 5343 -U 65258 ; WX 606 ; N uniFEEA ; G 5344 -U 65259 ; WX 693 ; N uniFEEB ; G 5345 -U 65260 ; WX 660 ; N uniFEEC ; G 5346 -U 65261 ; WX 622 ; N uniFEED ; G 5347 -U 65262 ; WX 627 ; N uniFEEE ; G 5348 -U 65263 ; WX 917 ; N uniFEEF ; G 5349 -U 65264 ; WX 1012 ; N uniFEF0 ; G 5350 -U 65265 ; WX 917 ; N uniFEF1 ; G 5351 -U 65266 ; WX 1012 ; N uniFEF2 ; G 5352 -U 65267 ; WX 375 ; N uniFEF3 ; G 5353 -U 65268 ; WX 408 ; N uniFEF4 ; G 5354 -U 65269 ; WX 745 ; N uniFEF5 ; G 5355 -U 65270 ; WX 759 ; N uniFEF6 ; G 5356 -U 65271 ; WX 745 ; N uniFEF7 ; G 5357 -U 65272 ; WX 759 ; N uniFEF8 ; G 5358 -U 65273 ; WX 745 ; N uniFEF9 ; G 5359 -U 65274 ; WX 759 ; N uniFEFA ; G 5360 -U 65275 ; WX 745 ; N uniFEFB ; G 5361 -U 65276 ; WX 759 ; N uniFEFC ; G 5362 -U 65279 ; WX 0 ; N uniFEFF ; G 5363 -U 65529 ; WX 0 ; N uniFFF9 ; G 5364 -U 65530 ; WX 0 ; N uniFFFA ; G 5365 -U 65531 ; WX 0 ; N uniFFFB ; G 5366 -U 65532 ; WX 0 ; N uniFFFC ; G 5367 -U 65533 ; WX 1113 ; N uniFFFD ; G 5368 -EndCharMetrics -StartKernData -StartKernPairs 1538 - -KPX dollar seven -159 -KPX dollar eight -63 -KPX dollar nine -139 -KPX dollar colon -92 -KPX dollar less -196 -KPX dollar Y -73 -KPX dollar backslash -73 -KPX dollar questiondown -73 -KPX dollar Aacute -73 -KPX dollar Hcircumflex -159 -KPX dollar Hbar -159 -KPX dollar Imacron -63 -KPX dollar Ibreve -63 -KPX dollar Iogonek -63 -KPX dollar Idot -63 -KPX dollar IJ -63 -KPX dollar Kcommaaccent -92 -KPX dollar kgreenlandic -196 -KPX dollar Lacute -73 -KPX dollar lacute -196 -KPX dollar uni01DC -159 -KPX dollar uni01F4 -196 -KPX dollar uni01F5 -73 - -KPX percent nine -83 -KPX percent colon -112 -KPX percent less -112 -KPX percent Kcommaaccent -112 -KPX percent kgreenlandic -112 -KPX percent lacute -112 -KPX percent uni01F4 -112 - -KPX ampersand six 38 -KPX ampersand Gcircumflex 38 -KPX ampersand Gbreve 38 -KPX ampersand Gdotaccent 38 -KPX ampersand Gcommaaccent 38 -KPX ampersand uni01DA 38 - -KPX quotesingle less -149 -KPX quotesingle kgreenlandic -149 -KPX quotesingle lacute -149 -KPX quotesingle uni01F4 -149 - -KPX parenright dollar -235 -KPX parenright D -120 -KPX parenright H -83 -KPX parenright R -83 -KPX parenright U -131 -KPX parenright X -102 -KPX parenright backslash -112 -KPX parenright cent -120 -KPX parenright sterling -120 -KPX parenright currency -120 -KPX parenright yen -120 -KPX parenright brokenbar -120 -KPX parenright section -120 -KPX parenright dieresis -120 -KPX parenright ordfeminine -83 -KPX parenright guillemotleft -83 -KPX parenright logicalnot -83 -KPX parenright sfthyphen -83 -KPX parenright acute -83 -KPX parenright mu -83 -KPX parenright paragraph -83 -KPX parenright periodcentered -83 -KPX parenright cedilla -83 -KPX parenright ordmasculine -83 -KPX parenright guillemotright -102 -KPX parenright onequarter -102 -KPX parenright onehalf -102 -KPX parenright threequarters -102 -KPX parenright questiondown -112 -KPX parenright Aacute -112 -KPX parenright Acircumflex -235 -KPX parenright Atilde -120 -KPX parenright Adieresis -235 -KPX parenright Aring -120 -KPX parenright AE -235 -KPX parenright Ccedilla -120 -KPX parenright Otilde -83 -KPX parenright multiply -83 -KPX parenright Ugrave -83 -KPX parenright Ucircumflex -83 -KPX parenright Yacute -83 -KPX parenright dcaron -83 -KPX parenright dmacron -83 -KPX parenright emacron -83 -KPX parenright ebreve -83 -KPX parenright edotaccent -131 -KPX parenright eogonek -131 -KPX parenright ecaron -131 -KPX parenright imacron -102 -KPX parenright ibreve -102 -KPX parenright iogonek -102 -KPX parenright dotlessi -102 -KPX parenright ij -102 -KPX parenright jcircumflex -102 -KPX parenright Lacute -112 -KPX parenright uni01A5 -120 -KPX parenright uni01AD -83 -KPX parenright Uhorn -83 -KPX parenright uni01F1 -83 -KPX parenright uni01F5 -112 - -KPX asterisk seven -36 -KPX asterisk less -45 -KPX asterisk Hbar -36 -KPX asterisk lacute -45 - -KPX period ampersand -92 -KPX period two -92 -KPX period eight -36 -KPX period H -36 -KPX period R -36 -KPX period X -36 -KPX period backslash -131 -KPX period ordfeminine -36 -KPX period guillemotleft -36 -KPX period logicalnot -36 -KPX period sfthyphen -36 -KPX period acute -36 -KPX period mu -36 -KPX period paragraph -36 -KPX period periodcentered -36 -KPX period cedilla -36 -KPX period ordmasculine -36 -KPX period guillemotright -36 -KPX period onequarter -36 -KPX period onehalf -36 -KPX period threequarters -36 -KPX period questiondown -131 -KPX period Aacute -131 -KPX period Egrave -92 -KPX period Icircumflex -92 -KPX period Yacute -36 -KPX period Ebreve -102 -KPX period ebreve -36 -KPX period Idot -36 -KPX period dotlessi -36 - -KPX slash two -73 -KPX slash seven -339 -KPX slash eight -73 -KPX slash nine -282 -KPX slash colon -159 -KPX slash less -319 -KPX slash backslash -139 -KPX slash questiondown -139 -KPX slash Aacute -139 -KPX slash Ebreve -73 -KPX slash Hbar -339 -KPX slash Idot -73 -KPX slash lacute -319 - -KPX two dollar -55 -KPX two nine -55 -KPX two semicolon -73 -KPX two less -73 -KPX two lacute -73 - -KPX three dollar -188 -KPX three D -55 -KPX three V -36 -KPX three backslash 38 -KPX three cent -55 -KPX three sterling -55 -KPX three currency -55 -KPX three yen -55 -KPX three brokenbar -55 -KPX three section -55 -KPX three dieresis -55 -KPX three questiondown 38 -KPX three Aacute 38 -KPX three gdotaccent -36 -KPX three gcommaaccent -36 - - -KPX five seven -92 -KPX five less -112 -KPX five backslash -92 -KPX five questiondown -92 -KPX five Aacute -92 -KPX five Hbar -92 -KPX five lacute -112 - -KPX six six -92 -KPX six Gdotaccent -92 -KPX six Gcommaaccent -92 - -KPX seven dollar -159 -KPX seven seven 47 -KPX seven D -264 -KPX seven F -272 -KPX seven H -272 -KPX seven R -272 -KPX seven U -225 -KPX seven V -272 -KPX seven X -225 -KPX seven Z -225 -KPX seven backslash -243 -KPX seven cent -164 -KPX seven sterling -264 -KPX seven currency -164 -KPX seven yen -164 -KPX seven brokenbar -164 -KPX seven section -164 -KPX seven dieresis -196 -KPX seven copyright -272 -KPX seven ordfeminine -212 -KPX seven guillemotleft -272 -KPX seven logicalnot -212 -KPX seven sfthyphen -212 -KPX seven acute -192 -KPX seven mu -272 -KPX seven paragraph -192 -KPX seven periodcentered -192 -KPX seven cedilla -192 -KPX seven ordmasculine -159 -KPX seven guillemotright -195 -KPX seven onequarter -225 -KPX seven onehalf -195 -KPX seven threequarters -195 -KPX seven questiondown -243 -KPX seven Aacute -243 -KPX seven Eacute -272 -KPX seven Idieresis -272 -KPX seven Yacute -272 -KPX seven ebreve -159 -KPX seven edotaccent -225 -KPX seven ecaron -225 -KPX seven gdotaccent -272 -KPX seven gcommaaccent -272 -KPX seven dotlessi -225 - -KPX eight dollar -63 - -KPX nine dollar -139 -KPX nine two -36 -KPX nine D -112 -KPX nine H -112 -KPX nine L -36 -KPX nine R -112 -KPX nine X -73 -KPX nine cent -112 -KPX nine sterling -112 -KPX nine currency -112 -KPX nine yen -112 -KPX nine brokenbar -112 -KPX nine section -112 -KPX nine dieresis -112 -KPX nine ordfeminine -112 -KPX nine guillemotleft -112 -KPX nine logicalnot -112 -KPX nine sfthyphen -112 -KPX nine acute -112 -KPX nine mu -112 -KPX nine paragraph -112 -KPX nine periodcentered -112 -KPX nine cedilla -112 -KPX nine ordmasculine -112 -KPX nine guillemotright -73 -KPX nine onequarter -73 -KPX nine onehalf -73 -KPX nine threequarters -73 -KPX nine Yacute -112 -KPX nine Ebreve -36 -KPX nine ebreve -112 -KPX nine dotlessi -73 - -KPX colon dollar -92 -KPX colon D -73 -KPX colon H -73 -KPX colon R -73 -KPX colon U -36 -KPX colon cent -73 -KPX colon sterling -73 -KPX colon currency -73 -KPX colon yen -73 -KPX colon brokenbar -73 -KPX colon section -73 -KPX colon dieresis -73 -KPX colon ordfeminine -73 -KPX colon guillemotleft -73 -KPX colon logicalnot -73 -KPX colon sfthyphen -73 -KPX colon acute -73 -KPX colon mu -73 -KPX colon paragraph -73 -KPX colon periodcentered -73 -KPX colon cedilla -73 -KPX colon ordmasculine -73 -KPX colon Yacute -73 -KPX colon ebreve -73 -KPX colon edotaccent -36 -KPX colon ecaron -36 - -KPX semicolon ampersand -73 -KPX semicolon two -73 -KPX semicolon H -55 -KPX semicolon ordfeminine -55 -KPX semicolon guillemotleft -55 -KPX semicolon logicalnot -55 -KPX semicolon sfthyphen -55 -KPX semicolon Egrave -73 -KPX semicolon Icircumflex -73 -KPX semicolon Yacute -55 -KPX semicolon Ebreve -73 - -KPX less dollar -196 -KPX less ampersand -73 -KPX less two -73 -KPX less D -188 -KPX less H -188 -KPX less R -188 -KPX less X -149 -KPX less cent -188 -KPX less sterling -188 -KPX less currency -188 -KPX less yen -188 -KPX less brokenbar -188 -KPX less section -188 -KPX less dieresis -188 -KPX less ordfeminine -188 -KPX less guillemotleft -188 -KPX less logicalnot -188 -KPX less sfthyphen -188 -KPX less acute -188 -KPX less mu -188 -KPX less paragraph -188 -KPX less periodcentered -188 -KPX less cedilla -188 -KPX less ordmasculine -188 -KPX less guillemotright -149 -KPX less onequarter -149 -KPX less onehalf -149 -KPX less threequarters -149 -KPX less Egrave -73 -KPX less Icircumflex -73 -KPX less Yacute -188 -KPX less Ebreve -92 -KPX less ebreve -188 -KPX less dotlessi -149 - - -KPX D backslash -63 -KPX D questiondown -63 -KPX D Aacute -63 - - -KPX N H -55 -KPX N R -55 -KPX N ordfeminine -55 -KPX N guillemotleft -55 -KPX N logicalnot -55 -KPX N sfthyphen -55 -KPX N acute -55 -KPX N mu -55 -KPX N paragraph -55 -KPX N periodcentered -55 -KPX N cedilla -55 -KPX N ordmasculine -45 -KPX N Yacute -55 -KPX N ebreve -55 - - - - - -KPX cent backslash -63 -KPX cent questiondown -63 -KPX cent Aacute -63 - -KPX sterling backslash -63 -KPX sterling questiondown -63 -KPX sterling Aacute -63 - -KPX currency backslash -63 -KPX currency questiondown -63 -KPX currency Aacute -63 - -KPX yen backslash -63 -KPX yen questiondown -63 -KPX yen Aacute -63 - -KPX brokenbar backslash -63 -KPX brokenbar questiondown -63 -KPX brokenbar Aacute -63 - -KPX section backslash -63 -KPX section questiondown -63 -KPX section Aacute -63 - - - -KPX Acircumflex seven -159 -KPX Acircumflex eight -63 -KPX Acircumflex nine -139 -KPX Acircumflex colon -92 -KPX Acircumflex less -196 -KPX Acircumflex Y -73 -KPX Acircumflex backslash -73 -KPX Acircumflex questiondown -73 -KPX Acircumflex Aacute -73 -KPX Acircumflex Hcircumflex -159 -KPX Acircumflex Hbar -159 -KPX Acircumflex Imacron -63 -KPX Acircumflex Ibreve -63 -KPX Acircumflex Iogonek -63 -KPX Acircumflex Idot -63 -KPX Acircumflex IJ -63 -KPX Acircumflex Kcommaaccent -92 -KPX Acircumflex kgreenlandic -196 -KPX Acircumflex Lacute -73 -KPX Acircumflex lacute -196 -KPX Acircumflex uni01DC -159 -KPX Acircumflex uni01F4 -196 -KPX Acircumflex uni01F5 -73 - -KPX Adieresis seven -159 -KPX Adieresis eight -63 -KPX Adieresis nine -139 -KPX Adieresis colon -92 -KPX Adieresis less -196 -KPX Adieresis Y -73 -KPX Adieresis backslash -73 -KPX Adieresis questiondown -73 -KPX Adieresis Aacute -73 -KPX Adieresis Hcircumflex -159 -KPX Adieresis Hbar -159 -KPX Adieresis Imacron -63 -KPX Adieresis Ibreve -63 -KPX Adieresis Iogonek -63 -KPX Adieresis Idot -63 -KPX Adieresis IJ -63 -KPX Adieresis Kcommaaccent -92 -KPX Adieresis kgreenlandic -196 -KPX Adieresis Lacute -73 -KPX Adieresis lacute -196 -KPX Adieresis uni01DC -159 -KPX Adieresis uni01F4 -196 -KPX Adieresis uni01F5 -73 - -KPX AE seven -159 -KPX AE eight -63 -KPX AE nine -139 -KPX AE colon -92 -KPX AE less -196 -KPX AE Y -73 -KPX AE backslash -73 -KPX AE questiondown -73 -KPX AE Aacute -73 -KPX AE Hcircumflex -159 -KPX AE Hbar -159 -KPX AE Imacron -63 -KPX AE Ibreve -63 -KPX AE Iogonek -63 -KPX AE Idot -63 -KPX AE IJ -63 -KPX AE Kcommaaccent -92 -KPX AE kgreenlandic -196 -KPX AE Lacute -73 -KPX AE lacute -196 -KPX AE uni01DC -159 -KPX AE uni01F4 -196 -KPX AE uni01F5 -73 - -KPX Egrave six 38 -KPX Egrave Gcircumflex 38 -KPX Egrave Gbreve 38 -KPX Egrave Gdotaccent 38 -KPX Egrave Gcommaaccent 38 -KPX Egrave uni01DA 38 - -KPX Ecircumflex six 38 -KPX Ecircumflex Gcircumflex 38 -KPX Ecircumflex Gbreve 38 -KPX Ecircumflex Gdotaccent 38 -KPX Ecircumflex Gcommaaccent 38 -KPX Ecircumflex uni01DA 38 - -KPX Igrave six 38 -KPX Igrave Gcircumflex 38 -KPX Igrave Gbreve 38 -KPX Igrave Gdotaccent 38 -KPX Igrave Gcommaaccent 38 -KPX Igrave uni01DA 38 - -KPX Icircumflex six 38 -KPX Icircumflex Gcircumflex 38 -KPX Icircumflex Gbreve 38 -KPX Icircumflex Gdotaccent 38 -KPX Icircumflex Gcommaaccent 38 -KPX Icircumflex uni01DA 38 - -KPX Eth less -149 -KPX Eth kgreenlandic -149 -KPX Eth lacute -149 -KPX Eth uni01F4 -149 - -KPX Ograve less -149 -KPX Ograve kgreenlandic -149 -KPX Ograve lacute -149 -KPX Ograve uni01F4 -149 - -KPX agrave seven -36 -KPX agrave less -45 -KPX agrave Hbar -36 -KPX agrave lacute -45 - -KPX ucircumflex two -73 -KPX ucircumflex seven -339 -KPX ucircumflex eight -73 -KPX ucircumflex nine -282 -KPX ucircumflex colon -159 -KPX ucircumflex less -319 -KPX ucircumflex backslash -139 -KPX ucircumflex questiondown -139 -KPX ucircumflex Aacute -139 -KPX ucircumflex Ebreve -73 -KPX ucircumflex Hbar -339 -KPX ucircumflex Idot -73 -KPX ucircumflex lacute -319 - -KPX ydieresis two -73 -KPX ydieresis seven -339 -KPX ydieresis eight -73 -KPX ydieresis nine -282 -KPX ydieresis colon -159 -KPX ydieresis less -319 -KPX ydieresis backslash -139 -KPX ydieresis questiondown -139 -KPX ydieresis Aacute -139 -KPX ydieresis Ebreve -73 -KPX ydieresis Hbar -339 -KPX ydieresis Idot -73 -KPX ydieresis lacute -319 - -KPX Abreve O -246 - -KPX abreve two -73 -KPX abreve seven -339 -KPX abreve eight -73 -KPX abreve nine -282 -KPX abreve colon -159 -KPX abreve less -319 -KPX abreve backslash -139 -KPX abreve questiondown -139 -KPX abreve Aacute -139 -KPX abreve Ebreve -73 -KPX abreve Hbar -339 -KPX abreve Idot -73 -KPX abreve lacute -319 - -KPX Edotaccent seven -92 -KPX Edotaccent less -112 -KPX Edotaccent backslash -92 -KPX Edotaccent questiondown -92 -KPX Edotaccent Aacute -92 -KPX Edotaccent Hbar -92 -KPX Edotaccent lacute -112 - - -KPX Ecaron seven -92 -KPX Ecaron less -112 -KPX Ecaron backslash -92 -KPX Ecaron questiondown -92 -KPX Ecaron Aacute -92 -KPX Ecaron Hbar -92 -KPX Ecaron lacute -112 - - -KPX Gdotaccent six -92 -KPX Gdotaccent Gdotaccent -92 -KPX Gdotaccent Gcommaaccent -92 - -KPX Gcommaaccent six -92 -KPX Gcommaaccent Gdotaccent -92 -KPX Gcommaaccent Gcommaaccent -92 - -KPX Hbar dollar -159 -KPX Hbar seven 47 -KPX Hbar D -264 -KPX Hbar F -272 -KPX Hbar H -272 -KPX Hbar R -272 -KPX Hbar U -225 -KPX Hbar V -272 -KPX Hbar X -225 -KPX Hbar Z -225 -KPX Hbar backslash -243 -KPX Hbar cent -264 -KPX Hbar sterling -264 -KPX Hbar currency -264 -KPX Hbar yen -264 -KPX Hbar brokenbar -264 -KPX Hbar section -264 -KPX Hbar dieresis -196 -KPX Hbar copyright -272 -KPX Hbar ordfeminine -272 -KPX Hbar guillemotleft -272 -KPX Hbar logicalnot -272 -KPX Hbar sfthyphen -272 -KPX Hbar acute -272 -KPX Hbar mu -272 -KPX Hbar paragraph -272 -KPX Hbar periodcentered -272 -KPX Hbar cedilla -272 -KPX Hbar ordmasculine -159 -KPX Hbar guillemotright -225 -KPX Hbar onequarter -225 -KPX Hbar onehalf -225 -KPX Hbar threequarters -225 -KPX Hbar questiondown -243 -KPX Hbar Aacute -243 -KPX Hbar Eacute -272 -KPX Hbar Idieresis -272 -KPX Hbar Yacute -272 -KPX Hbar ebreve -159 -KPX Hbar edotaccent -225 -KPX Hbar ecaron -225 -KPX Hbar gdotaccent -272 -KPX Hbar gcommaaccent -272 -KPX Hbar Hbar 47 -KPX Hbar dotlessi -225 - -KPX Idot dollar -63 - -KPX lacute dollar -196 -KPX lacute ampersand -73 -KPX lacute two -73 -KPX lacute D -188 -KPX lacute H -188 -KPX lacute R -188 -KPX lacute X -149 -KPX lacute cent -188 -KPX lacute sterling -188 -KPX lacute currency -188 -KPX lacute yen -188 -KPX lacute brokenbar -188 -KPX lacute section -188 -KPX lacute dieresis -188 -KPX lacute ordfeminine -188 -KPX lacute guillemotleft -188 -KPX lacute logicalnot -188 -KPX lacute sfthyphen -188 -KPX lacute acute -188 -KPX lacute mu -188 -KPX lacute paragraph -188 -KPX lacute periodcentered -188 -KPX lacute cedilla -188 -KPX lacute ordmasculine -188 -KPX lacute guillemotright -149 -KPX lacute onequarter -149 -KPX lacute onehalf -149 -KPX lacute threequarters -149 -KPX lacute Egrave -73 -KPX lacute Icircumflex -73 -KPX lacute Yacute -188 -KPX lacute Ebreve -92 -KPX lacute ebreve -188 -KPX lacute dotlessi -149 - - -KPX uni027D dollar -235 -KPX uni027D hyphen -92 -KPX uni027D nine 38 -KPX uni027D less 75 -KPX uni027D lacute 75 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ttf deleted file mode 100644 index 753f2d8..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ufm deleted file mode 100644 index 5f4dd7c..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ufm +++ /dev/null @@ -1,5712 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Sans -FontSubfamily Bold Oblique -UniqueID DejaVu Sans Bold Oblique -FullName DejaVu Sans Bold Oblique -Version Version 2.37 -PostScriptName DejaVuSans-BoldOblique -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -PreferredFamily DejaVu Sans -PreferredSubfamily Bold Oblique -Weight Bold -ItalicAngle -11 -IsFixedPitch false -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 928 -Descender -236 -FontBBox -1067 -385 1999 1121 -StartCharMetrics 5413 -U 32 ; WX 348 ; N space ; G 3 -U 33 ; WX 456 ; N exclam ; G 4 -U 34 ; WX 521 ; N quotedbl ; G 5 -U 35 ; WX 696 ; N numbersign ; G 6 -U 36 ; WX 696 ; N dollar ; G 7 -U 37 ; WX 1002 ; N percent ; G 8 -U 38 ; WX 872 ; N ampersand ; G 9 -U 39 ; WX 306 ; N quotesingle ; G 10 -U 40 ; WX 457 ; N parenleft ; G 11 -U 41 ; WX 457 ; N parenright ; G 12 -U 42 ; WX 523 ; N asterisk ; G 13 -U 43 ; WX 838 ; N plus ; G 14 -U 44 ; WX 380 ; N comma ; G 15 -U 45 ; WX 415 ; N hyphen ; G 16 -U 46 ; WX 380 ; N period ; G 17 -U 47 ; WX 365 ; N slash ; G 18 -U 48 ; WX 696 ; N zero ; G 19 -U 49 ; WX 696 ; N one ; G 20 -U 50 ; WX 696 ; N two ; G 21 -U 51 ; WX 696 ; N three ; G 22 -U 52 ; WX 696 ; N four ; G 23 -U 53 ; WX 696 ; N five ; G 24 -U 54 ; WX 696 ; N six ; G 25 -U 55 ; WX 696 ; N seven ; G 26 -U 56 ; WX 696 ; N eight ; G 27 -U 57 ; WX 696 ; N nine ; G 28 -U 58 ; WX 400 ; N colon ; G 29 -U 59 ; WX 400 ; N semicolon ; G 30 -U 60 ; WX 838 ; N less ; G 31 -U 61 ; WX 838 ; N equal ; G 32 -U 62 ; WX 838 ; N greater ; G 33 -U 63 ; WX 580 ; N question ; G 34 -U 64 ; WX 1000 ; N at ; G 35 -U 65 ; WX 774 ; N A ; G 36 -U 66 ; WX 762 ; N B ; G 37 -U 67 ; WX 734 ; N C ; G 38 -U 68 ; WX 830 ; N D ; G 39 -U 69 ; WX 683 ; N E ; G 40 -U 70 ; WX 683 ; N F ; G 41 -U 71 ; WX 821 ; N G ; G 42 -U 72 ; WX 837 ; N H ; G 43 -U 73 ; WX 372 ; N I ; G 44 -U 74 ; WX 372 ; N J ; G 45 -U 75 ; WX 775 ; N K ; G 46 -U 76 ; WX 637 ; N L ; G 47 -U 77 ; WX 995 ; N M ; G 48 -U 78 ; WX 837 ; N N ; G 49 -U 79 ; WX 850 ; N O ; G 50 -U 80 ; WX 733 ; N P ; G 51 -U 81 ; WX 850 ; N Q ; G 52 -U 82 ; WX 770 ; N R ; G 53 -U 83 ; WX 720 ; N S ; G 54 -U 84 ; WX 682 ; N T ; G 55 -U 85 ; WX 812 ; N U ; G 56 -U 86 ; WX 774 ; N V ; G 57 -U 87 ; WX 1103 ; N W ; G 58 -U 88 ; WX 771 ; N X ; G 59 -U 89 ; WX 724 ; N Y ; G 60 -U 90 ; WX 725 ; N Z ; G 61 -U 91 ; WX 457 ; N bracketleft ; G 62 -U 92 ; WX 365 ; N backslash ; G 63 -U 93 ; WX 457 ; N bracketright ; G 64 -U 94 ; WX 838 ; N asciicircum ; G 65 -U 95 ; WX 500 ; N underscore ; G 66 -U 96 ; WX 500 ; N grave ; G 67 -U 97 ; WX 675 ; N a ; G 68 -U 98 ; WX 716 ; N b ; G 69 -U 99 ; WX 593 ; N c ; G 70 -U 100 ; WX 716 ; N d ; G 71 -U 101 ; WX 678 ; N e ; G 72 -U 102 ; WX 435 ; N f ; G 73 -U 103 ; WX 716 ; N g ; G 74 -U 104 ; WX 712 ; N h ; G 75 -U 105 ; WX 343 ; N i ; G 76 -U 106 ; WX 343 ; N j ; G 77 -U 107 ; WX 665 ; N k ; G 78 -U 108 ; WX 343 ; N l ; G 79 -U 109 ; WX 1042 ; N m ; G 80 -U 110 ; WX 712 ; N n ; G 81 -U 111 ; WX 687 ; N o ; G 82 -U 112 ; WX 716 ; N p ; G 83 -U 113 ; WX 716 ; N q ; G 84 -U 114 ; WX 493 ; N r ; G 85 -U 115 ; WX 595 ; N s ; G 86 -U 116 ; WX 478 ; N t ; G 87 -U 117 ; WX 712 ; N u ; G 88 -U 118 ; WX 652 ; N v ; G 89 -U 119 ; WX 924 ; N w ; G 90 -U 120 ; WX 645 ; N x ; G 91 -U 121 ; WX 652 ; N y ; G 92 -U 122 ; WX 582 ; N z ; G 93 -U 123 ; WX 712 ; N braceleft ; G 94 -U 124 ; WX 365 ; N bar ; G 95 -U 125 ; WX 712 ; N braceright ; G 96 -U 126 ; WX 838 ; N asciitilde ; G 97 -U 160 ; WX 348 ; N nbspace ; G 98 -U 161 ; WX 456 ; N exclamdown ; G 99 -U 162 ; WX 696 ; N cent ; G 100 -U 163 ; WX 696 ; N sterling ; G 101 -U 164 ; WX 636 ; N currency ; G 102 -U 165 ; WX 696 ; N yen ; G 103 -U 166 ; WX 365 ; N brokenbar ; G 104 -U 167 ; WX 500 ; N section ; G 105 -U 168 ; WX 500 ; N dieresis ; G 106 -U 169 ; WX 1000 ; N copyright ; G 107 -U 170 ; WX 564 ; N ordfeminine ; G 108 -U 171 ; WX 650 ; N guillemotleft ; G 109 -U 172 ; WX 838 ; N logicalnot ; G 110 -U 173 ; WX 415 ; N sfthyphen ; G 111 -U 174 ; WX 1000 ; N registered ; G 112 -U 175 ; WX 500 ; N macron ; G 113 -U 176 ; WX 500 ; N degree ; G 114 -U 177 ; WX 838 ; N plusminus ; G 115 -U 178 ; WX 438 ; N twosuperior ; G 116 -U 179 ; WX 438 ; N threesuperior ; G 117 -U 180 ; WX 500 ; N acute ; G 118 -U 181 ; WX 736 ; N mu ; G 119 -U 182 ; WX 636 ; N paragraph ; G 120 -U 183 ; WX 380 ; N periodcentered ; G 121 -U 184 ; WX 500 ; N cedilla ; G 122 -U 185 ; WX 438 ; N onesuperior ; G 123 -U 186 ; WX 564 ; N ordmasculine ; G 124 -U 187 ; WX 650 ; N guillemotright ; G 125 -U 188 ; WX 1035 ; N onequarter ; G 126 -U 189 ; WX 1035 ; N onehalf ; G 127 -U 190 ; WX 1035 ; N threequarters ; G 128 -U 191 ; WX 580 ; N questiondown ; G 129 -U 192 ; WX 774 ; N Agrave ; G 130 -U 193 ; WX 774 ; N Aacute ; G 131 -U 194 ; WX 774 ; N Acircumflex ; G 132 -U 195 ; WX 774 ; N Atilde ; G 133 -U 196 ; WX 774 ; N Adieresis ; G 134 -U 197 ; WX 774 ; N Aring ; G 135 -U 198 ; WX 1085 ; N AE ; G 136 -U 199 ; WX 734 ; N Ccedilla ; G 137 -U 200 ; WX 683 ; N Egrave ; G 138 -U 201 ; WX 683 ; N Eacute ; G 139 -U 202 ; WX 683 ; N Ecircumflex ; G 140 -U 203 ; WX 683 ; N Edieresis ; G 141 -U 204 ; WX 372 ; N Igrave ; G 142 -U 205 ; WX 372 ; N Iacute ; G 143 -U 206 ; WX 372 ; N Icircumflex ; G 144 -U 207 ; WX 372 ; N Idieresis ; G 145 -U 208 ; WX 845 ; N Eth ; G 146 -U 209 ; WX 837 ; N Ntilde ; G 147 -U 210 ; WX 850 ; N Ograve ; G 148 -U 211 ; WX 850 ; N Oacute ; G 149 -U 212 ; WX 850 ; N Ocircumflex ; G 150 -U 213 ; WX 850 ; N Otilde ; G 151 -U 214 ; WX 850 ; N Odieresis ; G 152 -U 215 ; WX 838 ; N multiply ; G 153 -U 216 ; WX 850 ; N Oslash ; G 154 -U 217 ; WX 812 ; N Ugrave ; G 155 -U 218 ; WX 812 ; N Uacute ; G 156 -U 219 ; WX 812 ; N Ucircumflex ; G 157 -U 220 ; WX 812 ; N Udieresis ; G 158 -U 221 ; WX 724 ; N Yacute ; G 159 -U 222 ; WX 742 ; N Thorn ; G 160 -U 223 ; WX 719 ; N germandbls ; G 161 -U 224 ; WX 675 ; N agrave ; G 162 -U 225 ; WX 675 ; N aacute ; G 163 -U 226 ; WX 675 ; N acircumflex ; G 164 -U 227 ; WX 675 ; N atilde ; G 165 -U 228 ; WX 675 ; N adieresis ; G 166 -U 229 ; WX 675 ; N aring ; G 167 -U 230 ; WX 1048 ; N ae ; G 168 -U 231 ; WX 593 ; N ccedilla ; G 169 -U 232 ; WX 678 ; N egrave ; G 170 -U 233 ; WX 678 ; N eacute ; G 171 -U 234 ; WX 678 ; N ecircumflex ; G 172 -U 235 ; WX 678 ; N edieresis ; G 173 -U 236 ; WX 343 ; N igrave ; G 174 -U 237 ; WX 343 ; N iacute ; G 175 -U 238 ; WX 343 ; N icircumflex ; G 176 -U 239 ; WX 343 ; N idieresis ; G 177 -U 240 ; WX 687 ; N eth ; G 178 -U 241 ; WX 712 ; N ntilde ; G 179 -U 242 ; WX 687 ; N ograve ; G 180 -U 243 ; WX 687 ; N oacute ; G 181 -U 244 ; WX 687 ; N ocircumflex ; G 182 -U 245 ; WX 687 ; N otilde ; G 183 -U 246 ; WX 687 ; N odieresis ; G 184 -U 247 ; WX 838 ; N divide ; G 185 -U 248 ; WX 687 ; N oslash ; G 186 -U 249 ; WX 712 ; N ugrave ; G 187 -U 250 ; WX 712 ; N uacute ; G 188 -U 251 ; WX 712 ; N ucircumflex ; G 189 -U 252 ; WX 712 ; N udieresis ; G 190 -U 253 ; WX 652 ; N yacute ; G 191 -U 254 ; WX 716 ; N thorn ; G 192 -U 255 ; WX 652 ; N ydieresis ; G 193 -U 256 ; WX 774 ; N Amacron ; G 194 -U 257 ; WX 675 ; N amacron ; G 195 -U 258 ; WX 774 ; N Abreve ; G 196 -U 259 ; WX 675 ; N abreve ; G 197 -U 260 ; WX 774 ; N Aogonek ; G 198 -U 261 ; WX 675 ; N aogonek ; G 199 -U 262 ; WX 734 ; N Cacute ; G 200 -U 263 ; WX 593 ; N cacute ; G 201 -U 264 ; WX 734 ; N Ccircumflex ; G 202 -U 265 ; WX 593 ; N ccircumflex ; G 203 -U 266 ; WX 734 ; N Cdotaccent ; G 204 -U 267 ; WX 593 ; N cdotaccent ; G 205 -U 268 ; WX 734 ; N Ccaron ; G 206 -U 269 ; WX 593 ; N ccaron ; G 207 -U 270 ; WX 830 ; N Dcaron ; G 208 -U 271 ; WX 716 ; N dcaron ; G 209 -U 272 ; WX 845 ; N Dcroat ; G 210 -U 273 ; WX 716 ; N dmacron ; G 211 -U 274 ; WX 683 ; N Emacron ; G 212 -U 275 ; WX 678 ; N emacron ; G 213 -U 276 ; WX 683 ; N Ebreve ; G 214 -U 277 ; WX 678 ; N ebreve ; G 215 -U 278 ; WX 683 ; N Edotaccent ; G 216 -U 279 ; WX 678 ; N edotaccent ; G 217 -U 280 ; WX 683 ; N Eogonek ; G 218 -U 281 ; WX 678 ; N eogonek ; G 219 -U 282 ; WX 683 ; N Ecaron ; G 220 -U 283 ; WX 678 ; N ecaron ; G 221 -U 284 ; WX 821 ; N Gcircumflex ; G 222 -U 285 ; WX 716 ; N gcircumflex ; G 223 -U 286 ; WX 821 ; N Gbreve ; G 224 -U 287 ; WX 716 ; N gbreve ; G 225 -U 288 ; WX 821 ; N Gdotaccent ; G 226 -U 289 ; WX 716 ; N gdotaccent ; G 227 -U 290 ; WX 821 ; N Gcommaaccent ; G 228 -U 291 ; WX 716 ; N gcommaaccent ; G 229 -U 292 ; WX 837 ; N Hcircumflex ; G 230 -U 293 ; WX 712 ; N hcircumflex ; G 231 -U 294 ; WX 974 ; N Hbar ; G 232 -U 295 ; WX 790 ; N hbar ; G 233 -U 296 ; WX 372 ; N Itilde ; G 234 -U 297 ; WX 343 ; N itilde ; G 235 -U 298 ; WX 372 ; N Imacron ; G 236 -U 299 ; WX 343 ; N imacron ; G 237 -U 300 ; WX 372 ; N Ibreve ; G 238 -U 301 ; WX 343 ; N ibreve ; G 239 -U 302 ; WX 372 ; N Iogonek ; G 240 -U 303 ; WX 343 ; N iogonek ; G 241 -U 304 ; WX 372 ; N Idot ; G 242 -U 305 ; WX 343 ; N dotlessi ; G 243 -U 306 ; WX 744 ; N IJ ; G 244 -U 307 ; WX 686 ; N ij ; G 245 -U 308 ; WX 372 ; N Jcircumflex ; G 246 -U 309 ; WX 343 ; N jcircumflex ; G 247 -U 310 ; WX 775 ; N Kcommaaccent ; G 248 -U 311 ; WX 665 ; N kcommaaccent ; G 249 -U 312 ; WX 665 ; N kgreenlandic ; G 250 -U 313 ; WX 637 ; N Lacute ; G 251 -U 314 ; WX 343 ; N lacute ; G 252 -U 315 ; WX 637 ; N Lcommaaccent ; G 253 -U 316 ; WX 343 ; N lcommaaccent ; G 254 -U 317 ; WX 637 ; N Lcaron ; G 255 -U 318 ; WX 343 ; N lcaron ; G 256 -U 319 ; WX 637 ; N Ldot ; G 257 -U 320 ; WX 343 ; N ldot ; G 258 -U 321 ; WX 660 ; N Lslash ; G 259 -U 322 ; WX 375 ; N lslash ; G 260 -U 323 ; WX 837 ; N Nacute ; G 261 -U 324 ; WX 712 ; N nacute ; G 262 -U 325 ; WX 837 ; N Ncommaaccent ; G 263 -U 326 ; WX 712 ; N ncommaaccent ; G 264 -U 327 ; WX 837 ; N Ncaron ; G 265 -U 328 ; WX 712 ; N ncaron ; G 266 -U 329 ; WX 983 ; N napostrophe ; G 267 -U 330 ; WX 837 ; N Eng ; G 268 -U 331 ; WX 712 ; N eng ; G 269 -U 332 ; WX 850 ; N Omacron ; G 270 -U 333 ; WX 687 ; N omacron ; G 271 -U 334 ; WX 850 ; N Obreve ; G 272 -U 335 ; WX 687 ; N obreve ; G 273 -U 336 ; WX 850 ; N Ohungarumlaut ; G 274 -U 337 ; WX 687 ; N ohungarumlaut ; G 275 -U 338 ; WX 1167 ; N OE ; G 276 -U 339 ; WX 1094 ; N oe ; G 277 -U 340 ; WX 770 ; N Racute ; G 278 -U 341 ; WX 493 ; N racute ; G 279 -U 342 ; WX 770 ; N Rcommaaccent ; G 280 -U 343 ; WX 493 ; N rcommaaccent ; G 281 -U 344 ; WX 770 ; N Rcaron ; G 282 -U 345 ; WX 493 ; N rcaron ; G 283 -U 346 ; WX 720 ; N Sacute ; G 284 -U 347 ; WX 595 ; N sacute ; G 285 -U 348 ; WX 720 ; N Scircumflex ; G 286 -U 349 ; WX 595 ; N scircumflex ; G 287 -U 350 ; WX 720 ; N Scedilla ; G 288 -U 351 ; WX 595 ; N scedilla ; G 289 -U 352 ; WX 720 ; N Scaron ; G 290 -U 353 ; WX 595 ; N scaron ; G 291 -U 354 ; WX 682 ; N Tcommaaccent ; G 292 -U 355 ; WX 478 ; N tcommaaccent ; G 293 -U 356 ; WX 682 ; N Tcaron ; G 294 -U 357 ; WX 478 ; N tcaron ; G 295 -U 358 ; WX 682 ; N Tbar ; G 296 -U 359 ; WX 478 ; N tbar ; G 297 -U 360 ; WX 812 ; N Utilde ; G 298 -U 361 ; WX 712 ; N utilde ; G 299 -U 362 ; WX 812 ; N Umacron ; G 300 -U 363 ; WX 712 ; N umacron ; G 301 -U 364 ; WX 812 ; N Ubreve ; G 302 -U 365 ; WX 712 ; N ubreve ; G 303 -U 366 ; WX 812 ; N Uring ; G 304 -U 367 ; WX 712 ; N uring ; G 305 -U 368 ; WX 812 ; N Uhungarumlaut ; G 306 -U 369 ; WX 712 ; N uhungarumlaut ; G 307 -U 370 ; WX 812 ; N Uogonek ; G 308 -U 371 ; WX 712 ; N uogonek ; G 309 -U 372 ; WX 1103 ; N Wcircumflex ; G 310 -U 373 ; WX 924 ; N wcircumflex ; G 311 -U 374 ; WX 724 ; N Ycircumflex ; G 312 -U 375 ; WX 652 ; N ycircumflex ; G 313 -U 376 ; WX 724 ; N Ydieresis ; G 314 -U 377 ; WX 725 ; N Zacute ; G 315 -U 378 ; WX 582 ; N zacute ; G 316 -U 379 ; WX 725 ; N Zdotaccent ; G 317 -U 380 ; WX 582 ; N zdotaccent ; G 318 -U 381 ; WX 725 ; N Zcaron ; G 319 -U 382 ; WX 582 ; N zcaron ; G 320 -U 383 ; WX 435 ; N longs ; G 321 -U 384 ; WX 716 ; N uni0180 ; G 322 -U 385 ; WX 811 ; N uni0181 ; G 323 -U 386 ; WX 762 ; N uni0182 ; G 324 -U 387 ; WX 716 ; N uni0183 ; G 325 -U 388 ; WX 762 ; N uni0184 ; G 326 -U 389 ; WX 716 ; N uni0185 ; G 327 -U 390 ; WX 734 ; N uni0186 ; G 328 -U 391 ; WX 734 ; N uni0187 ; G 329 -U 392 ; WX 593 ; N uni0188 ; G 330 -U 393 ; WX 845 ; N uni0189 ; G 331 -U 394 ; WX 879 ; N uni018A ; G 332 -U 395 ; WX 762 ; N uni018B ; G 333 -U 396 ; WX 716 ; N uni018C ; G 334 -U 397 ; WX 687 ; N uni018D ; G 335 -U 398 ; WX 683 ; N uni018E ; G 336 -U 399 ; WX 850 ; N uni018F ; G 337 -U 400 ; WX 696 ; N uni0190 ; G 338 -U 401 ; WX 683 ; N uni0191 ; G 339 -U 402 ; WX 435 ; N florin ; G 340 -U 403 ; WX 821 ; N uni0193 ; G 341 -U 404 ; WX 793 ; N uni0194 ; G 342 -U 405 ; WX 1045 ; N uni0195 ; G 343 -U 406 ; WX 436 ; N uni0196 ; G 344 -U 407 ; WX 389 ; N uni0197 ; G 345 -U 408 ; WX 775 ; N uni0198 ; G 346 -U 409 ; WX 665 ; N uni0199 ; G 347 -U 410 ; WX 360 ; N uni019A ; G 348 -U 411 ; WX 592 ; N uni019B ; G 349 -U 412 ; WX 1042 ; N uni019C ; G 350 -U 413 ; WX 837 ; N uni019D ; G 351 -U 414 ; WX 712 ; N uni019E ; G 352 -U 415 ; WX 850 ; N uni019F ; G 353 -U 416 ; WX 850 ; N Ohorn ; G 354 -U 417 ; WX 687 ; N ohorn ; G 355 -U 418 ; WX 1114 ; N uni01A2 ; G 356 -U 419 ; WX 962 ; N uni01A3 ; G 357 -U 420 ; WX 782 ; N uni01A4 ; G 358 -U 421 ; WX 716 ; N uni01A5 ; G 359 -U 422 ; WX 770 ; N uni01A6 ; G 360 -U 423 ; WX 720 ; N uni01A7 ; G 361 -U 424 ; WX 595 ; N uni01A8 ; G 362 -U 425 ; WX 683 ; N uni01A9 ; G 363 -U 426 ; WX 552 ; N uni01AA ; G 364 -U 427 ; WX 478 ; N uni01AB ; G 365 -U 428 ; WX 707 ; N uni01AC ; G 366 -U 429 ; WX 478 ; N uni01AD ; G 367 -U 430 ; WX 682 ; N uni01AE ; G 368 -U 431 ; WX 812 ; N Uhorn ; G 369 -U 432 ; WX 712 ; N uhorn ; G 370 -U 433 ; WX 769 ; N uni01B1 ; G 371 -U 434 ; WX 813 ; N uni01B2 ; G 372 -U 435 ; WX 797 ; N uni01B3 ; G 373 -U 436 ; WX 778 ; N uni01B4 ; G 374 -U 437 ; WX 725 ; N uni01B5 ; G 375 -U 438 ; WX 582 ; N uni01B6 ; G 376 -U 439 ; WX 772 ; N uni01B7 ; G 377 -U 440 ; WX 772 ; N uni01B8 ; G 378 -U 441 ; WX 641 ; N uni01B9 ; G 379 -U 442 ; WX 582 ; N uni01BA ; G 380 -U 443 ; WX 696 ; N uni01BB ; G 381 -U 444 ; WX 772 ; N uni01BC ; G 382 -U 445 ; WX 641 ; N uni01BD ; G 383 -U 446 ; WX 573 ; N uni01BE ; G 384 -U 447 ; WX 716 ; N uni01BF ; G 385 -U 448 ; WX 372 ; N uni01C0 ; G 386 -U 449 ; WX 659 ; N uni01C1 ; G 387 -U 450 ; WX 544 ; N uni01C2 ; G 388 -U 451 ; WX 372 ; N uni01C3 ; G 389 -U 452 ; WX 1548 ; N uni01C4 ; G 390 -U 453 ; WX 1450 ; N uni01C5 ; G 391 -U 454 ; WX 1307 ; N uni01C6 ; G 392 -U 455 ; WX 977 ; N uni01C7 ; G 393 -U 456 ; WX 979 ; N uni01C8 ; G 394 -U 457 ; WX 670 ; N uni01C9 ; G 395 -U 458 ; WX 1193 ; N uni01CA ; G 396 -U 459 ; WX 1213 ; N uni01CB ; G 397 -U 460 ; WX 1063 ; N uni01CC ; G 398 -U 461 ; WX 774 ; N uni01CD ; G 399 -U 462 ; WX 675 ; N uni01CE ; G 400 -U 463 ; WX 372 ; N uni01CF ; G 401 -U 464 ; WX 343 ; N uni01D0 ; G 402 -U 465 ; WX 850 ; N uni01D1 ; G 403 -U 466 ; WX 687 ; N uni01D2 ; G 404 -U 467 ; WX 812 ; N uni01D3 ; G 405 -U 468 ; WX 712 ; N uni01D4 ; G 406 -U 469 ; WX 812 ; N uni01D5 ; G 407 -U 470 ; WX 712 ; N uni01D6 ; G 408 -U 471 ; WX 812 ; N uni01D7 ; G 409 -U 472 ; WX 712 ; N uni01D8 ; G 410 -U 473 ; WX 812 ; N uni01D9 ; G 411 -U 474 ; WX 712 ; N uni01DA ; G 412 -U 475 ; WX 812 ; N uni01DB ; G 413 -U 476 ; WX 712 ; N uni01DC ; G 414 -U 477 ; WX 678 ; N uni01DD ; G 415 -U 478 ; WX 774 ; N uni01DE ; G 416 -U 479 ; WX 675 ; N uni01DF ; G 417 -U 480 ; WX 774 ; N uni01E0 ; G 418 -U 481 ; WX 675 ; N uni01E1 ; G 419 -U 482 ; WX 1085 ; N uni01E2 ; G 420 -U 483 ; WX 1048 ; N uni01E3 ; G 421 -U 484 ; WX 821 ; N uni01E4 ; G 422 -U 485 ; WX 716 ; N uni01E5 ; G 423 -U 486 ; WX 821 ; N Gcaron ; G 424 -U 487 ; WX 716 ; N gcaron ; G 425 -U 488 ; WX 775 ; N uni01E8 ; G 426 -U 489 ; WX 665 ; N uni01E9 ; G 427 -U 490 ; WX 850 ; N uni01EA ; G 428 -U 491 ; WX 687 ; N uni01EB ; G 429 -U 492 ; WX 850 ; N uni01EC ; G 430 -U 493 ; WX 687 ; N uni01ED ; G 431 -U 494 ; WX 772 ; N uni01EE ; G 432 -U 495 ; WX 582 ; N uni01EF ; G 433 -U 496 ; WX 343 ; N uni01F0 ; G 434 -U 497 ; WX 1548 ; N uni01F1 ; G 435 -U 498 ; WX 1450 ; N uni01F2 ; G 436 -U 499 ; WX 1307 ; N uni01F3 ; G 437 -U 500 ; WX 821 ; N uni01F4 ; G 438 -U 501 ; WX 716 ; N uni01F5 ; G 439 -U 502 ; WX 1289 ; N uni01F6 ; G 440 -U 503 ; WX 787 ; N uni01F7 ; G 441 -U 504 ; WX 837 ; N uni01F8 ; G 442 -U 505 ; WX 712 ; N uni01F9 ; G 443 -U 506 ; WX 774 ; N Aringacute ; G 444 -U 507 ; WX 675 ; N aringacute ; G 445 -U 508 ; WX 1085 ; N AEacute ; G 446 -U 509 ; WX 1048 ; N aeacute ; G 447 -U 510 ; WX 850 ; N Oslashacute ; G 448 -U 511 ; WX 687 ; N oslashacute ; G 449 -U 512 ; WX 774 ; N uni0200 ; G 450 -U 513 ; WX 675 ; N uni0201 ; G 451 -U 514 ; WX 774 ; N uni0202 ; G 452 -U 515 ; WX 675 ; N uni0203 ; G 453 -U 516 ; WX 683 ; N uni0204 ; G 454 -U 517 ; WX 678 ; N uni0205 ; G 455 -U 518 ; WX 683 ; N uni0206 ; G 456 -U 519 ; WX 678 ; N uni0207 ; G 457 -U 520 ; WX 372 ; N uni0208 ; G 458 -U 521 ; WX 343 ; N uni0209 ; G 459 -U 522 ; WX 372 ; N uni020A ; G 460 -U 523 ; WX 343 ; N uni020B ; G 461 -U 524 ; WX 850 ; N uni020C ; G 462 -U 525 ; WX 687 ; N uni020D ; G 463 -U 526 ; WX 850 ; N uni020E ; G 464 -U 527 ; WX 687 ; N uni020F ; G 465 -U 528 ; WX 770 ; N uni0210 ; G 466 -U 529 ; WX 493 ; N uni0211 ; G 467 -U 530 ; WX 770 ; N uni0212 ; G 468 -U 531 ; WX 493 ; N uni0213 ; G 469 -U 532 ; WX 812 ; N uni0214 ; G 470 -U 533 ; WX 712 ; N uni0215 ; G 471 -U 534 ; WX 812 ; N uni0216 ; G 472 -U 535 ; WX 712 ; N uni0217 ; G 473 -U 536 ; WX 720 ; N Scommaaccent ; G 474 -U 537 ; WX 595 ; N scommaaccent ; G 475 -U 538 ; WX 682 ; N uni021A ; G 476 -U 539 ; WX 478 ; N uni021B ; G 477 -U 540 ; WX 690 ; N uni021C ; G 478 -U 541 ; WX 607 ; N uni021D ; G 479 -U 542 ; WX 837 ; N uni021E ; G 480 -U 543 ; WX 712 ; N uni021F ; G 481 -U 544 ; WX 837 ; N uni0220 ; G 482 -U 545 ; WX 865 ; N uni0221 ; G 483 -U 546 ; WX 809 ; N uni0222 ; G 484 -U 547 ; WX 659 ; N uni0223 ; G 485 -U 548 ; WX 725 ; N uni0224 ; G 486 -U 549 ; WX 582 ; N uni0225 ; G 487 -U 550 ; WX 774 ; N uni0226 ; G 488 -U 551 ; WX 675 ; N uni0227 ; G 489 -U 552 ; WX 683 ; N uni0228 ; G 490 -U 553 ; WX 678 ; N uni0229 ; G 491 -U 554 ; WX 850 ; N uni022A ; G 492 -U 555 ; WX 687 ; N uni022B ; G 493 -U 556 ; WX 850 ; N uni022C ; G 494 -U 557 ; WX 687 ; N uni022D ; G 495 -U 558 ; WX 850 ; N uni022E ; G 496 -U 559 ; WX 687 ; N uni022F ; G 497 -U 560 ; WX 850 ; N uni0230 ; G 498 -U 561 ; WX 687 ; N uni0231 ; G 499 -U 562 ; WX 724 ; N uni0232 ; G 500 -U 563 ; WX 652 ; N uni0233 ; G 501 -U 564 ; WX 492 ; N uni0234 ; G 502 -U 565 ; WX 867 ; N uni0235 ; G 503 -U 566 ; WX 512 ; N uni0236 ; G 504 -U 567 ; WX 343 ; N dotlessj ; G 505 -U 568 ; WX 1088 ; N uni0238 ; G 506 -U 569 ; WX 1088 ; N uni0239 ; G 507 -U 570 ; WX 774 ; N uni023A ; G 508 -U 571 ; WX 734 ; N uni023B ; G 509 -U 572 ; WX 593 ; N uni023C ; G 510 -U 573 ; WX 637 ; N uni023D ; G 511 -U 574 ; WX 682 ; N uni023E ; G 512 -U 575 ; WX 595 ; N uni023F ; G 513 -U 576 ; WX 582 ; N uni0240 ; G 514 -U 577 ; WX 782 ; N uni0241 ; G 515 -U 578 ; WX 614 ; N uni0242 ; G 516 -U 579 ; WX 762 ; N uni0243 ; G 517 -U 580 ; WX 812 ; N uni0244 ; G 518 -U 581 ; WX 774 ; N uni0245 ; G 519 -U 582 ; WX 683 ; N uni0246 ; G 520 -U 583 ; WX 678 ; N uni0247 ; G 521 -U 584 ; WX 372 ; N uni0248 ; G 522 -U 585 ; WX 343 ; N uni0249 ; G 523 -U 586 ; WX 860 ; N uni024A ; G 524 -U 587 ; WX 791 ; N uni024B ; G 525 -U 588 ; WX 770 ; N uni024C ; G 526 -U 589 ; WX 493 ; N uni024D ; G 527 -U 590 ; WX 724 ; N uni024E ; G 528 -U 591 ; WX 652 ; N uni024F ; G 529 -U 592 ; WX 675 ; N uni0250 ; G 530 -U 593 ; WX 716 ; N uni0251 ; G 531 -U 594 ; WX 716 ; N uni0252 ; G 532 -U 595 ; WX 716 ; N uni0253 ; G 533 -U 596 ; WX 593 ; N uni0254 ; G 534 -U 597 ; WX 593 ; N uni0255 ; G 535 -U 598 ; WX 791 ; N uni0256 ; G 536 -U 599 ; WX 792 ; N uni0257 ; G 537 -U 600 ; WX 678 ; N uni0258 ; G 538 -U 601 ; WX 678 ; N uni0259 ; G 539 -U 602 ; WX 876 ; N uni025A ; G 540 -U 603 ; WX 557 ; N uni025B ; G 541 -U 604 ; WX 545 ; N uni025C ; G 542 -U 605 ; WX 774 ; N uni025D ; G 543 -U 606 ; WX 731 ; N uni025E ; G 544 -U 607 ; WX 343 ; N uni025F ; G 545 -U 608 ; WX 792 ; N uni0260 ; G 546 -U 609 ; WX 716 ; N uni0261 ; G 547 -U 610 ; WX 627 ; N uni0262 ; G 548 -U 611 ; WX 735 ; N uni0263 ; G 549 -U 612 ; WX 635 ; N uni0264 ; G 550 -U 613 ; WX 712 ; N uni0265 ; G 551 -U 614 ; WX 712 ; N uni0266 ; G 552 -U 615 ; WX 712 ; N uni0267 ; G 553 -U 616 ; WX 545 ; N uni0268 ; G 554 -U 617 ; WX 440 ; N uni0269 ; G 555 -U 618 ; WX 545 ; N uni026A ; G 556 -U 619 ; WX 559 ; N uni026B ; G 557 -U 620 ; WX 693 ; N uni026C ; G 558 -U 621 ; WX 343 ; N uni026D ; G 559 -U 622 ; WX 841 ; N uni026E ; G 560 -U 623 ; WX 1042 ; N uni026F ; G 561 -U 624 ; WX 1042 ; N uni0270 ; G 562 -U 625 ; WX 1042 ; N uni0271 ; G 563 -U 626 ; WX 712 ; N uni0272 ; G 564 -U 627 ; WX 793 ; N uni0273 ; G 565 -U 628 ; WX 642 ; N uni0274 ; G 566 -U 629 ; WX 687 ; N uni0275 ; G 567 -U 630 ; WX 909 ; N uni0276 ; G 568 -U 631 ; WX 682 ; N uni0277 ; G 569 -U 632 ; WX 796 ; N uni0278 ; G 570 -U 633 ; WX 538 ; N uni0279 ; G 571 -U 634 ; WX 538 ; N uni027A ; G 572 -U 635 ; WX 650 ; N uni027B ; G 573 -U 636 ; WX 493 ; N uni027C ; G 574 -U 637 ; WX 493 ; N uni027D ; G 575 -U 638 ; WX 596 ; N uni027E ; G 576 -U 639 ; WX 596 ; N uni027F ; G 577 -U 640 ; WX 642 ; N uni0280 ; G 578 -U 641 ; WX 642 ; N uni0281 ; G 579 -U 642 ; WX 595 ; N uni0282 ; G 580 -U 643 ; WX 415 ; N uni0283 ; G 581 -U 644 ; WX 435 ; N uni0284 ; G 582 -U 645 ; WX 605 ; N uni0285 ; G 583 -U 646 ; WX 552 ; N uni0286 ; G 584 -U 647 ; WX 478 ; N uni0287 ; G 585 -U 648 ; WX 478 ; N uni0288 ; G 586 -U 649 ; WX 920 ; N uni0289 ; G 587 -U 650 ; WX 769 ; N uni028A ; G 588 -U 651 ; WX 670 ; N uni028B ; G 589 -U 652 ; WX 652 ; N uni028C ; G 590 -U 653 ; WX 924 ; N uni028D ; G 591 -U 654 ; WX 652 ; N uni028E ; G 592 -U 655 ; WX 724 ; N uni028F ; G 593 -U 656 ; WX 694 ; N uni0290 ; G 594 -U 657 ; WX 684 ; N uni0291 ; G 595 -U 658 ; WX 641 ; N uni0292 ; G 596 -U 659 ; WX 641 ; N uni0293 ; G 597 -U 660 ; WX 573 ; N uni0294 ; G 598 -U 661 ; WX 573 ; N uni0295 ; G 599 -U 662 ; WX 573 ; N uni0296 ; G 600 -U 663 ; WX 573 ; N uni0297 ; G 601 -U 664 ; WX 850 ; N uni0298 ; G 602 -U 665 ; WX 633 ; N uni0299 ; G 603 -U 666 ; WX 731 ; N uni029A ; G 604 -U 667 ; WX 685 ; N uni029B ; G 605 -U 668 ; WX 691 ; N uni029C ; G 606 -U 669 ; WX 343 ; N uni029D ; G 607 -U 670 ; WX 732 ; N uni029E ; G 608 -U 671 ; WX 539 ; N uni029F ; G 609 -U 672 ; WX 792 ; N uni02A0 ; G 610 -U 673 ; WX 573 ; N uni02A1 ; G 611 -U 674 ; WX 573 ; N uni02A2 ; G 612 -U 675 ; WX 1156 ; N uni02A3 ; G 613 -U 676 ; WX 1214 ; N uni02A4 ; G 614 -U 677 ; WX 1155 ; N uni02A5 ; G 615 -U 678 ; WX 975 ; N uni02A6 ; G 616 -U 679 ; WX 769 ; N uni02A7 ; G 617 -U 680 ; WX 929 ; N uni02A8 ; G 618 -U 681 ; WX 1026 ; N uni02A9 ; G 619 -U 682 ; WX 862 ; N uni02AA ; G 620 -U 683 ; WX 780 ; N uni02AB ; G 621 -U 684 ; WX 591 ; N uni02AC ; G 622 -U 685 ; WX 415 ; N uni02AD ; G 623 -U 686 ; WX 677 ; N uni02AE ; G 624 -U 687 ; WX 789 ; N uni02AF ; G 625 -U 688 ; WX 456 ; N uni02B0 ; G 626 -U 689 ; WX 456 ; N uni02B1 ; G 627 -U 690 ; WX 219 ; N uni02B2 ; G 628 -U 691 ; WX 315 ; N uni02B3 ; G 629 -U 692 ; WX 315 ; N uni02B4 ; G 630 -U 693 ; WX 315 ; N uni02B5 ; G 631 -U 694 ; WX 411 ; N uni02B6 ; G 632 -U 695 ; WX 591 ; N uni02B7 ; G 633 -U 696 ; WX 417 ; N uni02B8 ; G 634 -U 697 ; WX 302 ; N uni02B9 ; G 635 -U 698 ; WX 521 ; N uni02BA ; G 636 -U 699 ; WX 380 ; N uni02BB ; G 637 -U 700 ; WX 380 ; N uni02BC ; G 638 -U 701 ; WX 380 ; N uni02BD ; G 639 -U 702 ; WX 366 ; N uni02BE ; G 640 -U 703 ; WX 366 ; N uni02BF ; G 641 -U 704 ; WX 326 ; N uni02C0 ; G 642 -U 705 ; WX 326 ; N uni02C1 ; G 643 -U 706 ; WX 500 ; N uni02C2 ; G 644 -U 707 ; WX 500 ; N uni02C3 ; G 645 -U 708 ; WX 500 ; N uni02C4 ; G 646 -U 709 ; WX 500 ; N uni02C5 ; G 647 -U 710 ; WX 500 ; N circumflex ; G 648 -U 711 ; WX 500 ; N caron ; G 649 -U 712 ; WX 306 ; N uni02C8 ; G 650 -U 713 ; WX 500 ; N uni02C9 ; G 651 -U 714 ; WX 500 ; N uni02CA ; G 652 -U 715 ; WX 500 ; N uni02CB ; G 653 -U 716 ; WX 306 ; N uni02CC ; G 654 -U 717 ; WX 500 ; N uni02CD ; G 655 -U 718 ; WX 500 ; N uni02CE ; G 656 -U 719 ; WX 500 ; N uni02CF ; G 657 -U 720 ; WX 337 ; N uni02D0 ; G 658 -U 721 ; WX 337 ; N uni02D1 ; G 659 -U 722 ; WX 366 ; N uni02D2 ; G 660 -U 723 ; WX 366 ; N uni02D3 ; G 661 -U 724 ; WX 500 ; N uni02D4 ; G 662 -U 725 ; WX 500 ; N uni02D5 ; G 663 -U 726 ; WX 416 ; N uni02D6 ; G 664 -U 727 ; WX 328 ; N uni02D7 ; G 665 -U 728 ; WX 500 ; N breve ; G 666 -U 729 ; WX 500 ; N dotaccent ; G 667 -U 730 ; WX 500 ; N ring ; G 668 -U 731 ; WX 500 ; N ogonek ; G 669 -U 732 ; WX 500 ; N tilde ; G 670 -U 733 ; WX 500 ; N hungarumlaut ; G 671 -U 734 ; WX 351 ; N uni02DE ; G 672 -U 735 ; WX 500 ; N uni02DF ; G 673 -U 736 ; WX 412 ; N uni02E0 ; G 674 -U 737 ; WX 219 ; N uni02E1 ; G 675 -U 738 ; WX 381 ; N uni02E2 ; G 676 -U 739 ; WX 413 ; N uni02E3 ; G 677 -U 740 ; WX 326 ; N uni02E4 ; G 678 -U 741 ; WX 500 ; N uni02E5 ; G 679 -U 742 ; WX 500 ; N uni02E6 ; G 680 -U 743 ; WX 500 ; N uni02E7 ; G 681 -U 744 ; WX 500 ; N uni02E8 ; G 682 -U 745 ; WX 500 ; N uni02E9 ; G 683 -U 748 ; WX 500 ; N uni02EC ; G 684 -U 749 ; WX 500 ; N uni02ED ; G 685 -U 750 ; WX 644 ; N uni02EE ; G 686 -U 755 ; WX 500 ; N uni02F3 ; G 687 -U 759 ; WX 500 ; N uni02F7 ; G 688 -U 768 ; WX 0 ; N gravecomb ; G 689 -U 769 ; WX 0 ; N acutecomb ; G 690 -U 770 ; WX 0 ; N uni0302 ; G 691 -U 771 ; WX 0 ; N tildecomb ; G 692 -U 772 ; WX 0 ; N uni0304 ; G 693 -U 773 ; WX 0 ; N uni0305 ; G 694 -U 774 ; WX 0 ; N uni0306 ; G 695 -U 775 ; WX 0 ; N uni0307 ; G 696 -U 776 ; WX 0 ; N uni0308 ; G 697 -U 777 ; WX 0 ; N hookabovecomb ; G 698 -U 778 ; WX 0 ; N uni030A ; G 699 -U 779 ; WX 0 ; N uni030B ; G 700 -U 780 ; WX 0 ; N uni030C ; G 701 -U 781 ; WX 0 ; N uni030D ; G 702 -U 782 ; WX 0 ; N uni030E ; G 703 -U 783 ; WX 0 ; N uni030F ; G 704 -U 784 ; WX 0 ; N uni0310 ; G 705 -U 785 ; WX 0 ; N uni0311 ; G 706 -U 786 ; WX 0 ; N uni0312 ; G 707 -U 787 ; WX 0 ; N uni0313 ; G 708 -U 788 ; WX 0 ; N uni0314 ; G 709 -U 789 ; WX 0 ; N uni0315 ; G 710 -U 790 ; WX 0 ; N uni0316 ; G 711 -U 791 ; WX 0 ; N uni0317 ; G 712 -U 792 ; WX 0 ; N uni0318 ; G 713 -U 793 ; WX 0 ; N uni0319 ; G 714 -U 794 ; WX 0 ; N uni031A ; G 715 -U 795 ; WX 0 ; N uni031B ; G 716 -U 796 ; WX 0 ; N uni031C ; G 717 -U 797 ; WX 0 ; N uni031D ; G 718 -U 798 ; WX 0 ; N uni031E ; G 719 -U 799 ; WX 0 ; N uni031F ; G 720 -U 800 ; WX 0 ; N uni0320 ; G 721 -U 801 ; WX 0 ; N uni0321 ; G 722 -U 802 ; WX 0 ; N uni0322 ; G 723 -U 803 ; WX 0 ; N dotbelowcomb ; G 724 -U 804 ; WX 0 ; N uni0324 ; G 725 -U 805 ; WX 0 ; N uni0325 ; G 726 -U 806 ; WX 0 ; N uni0326 ; G 727 -U 807 ; WX 0 ; N uni0327 ; G 728 -U 808 ; WX 0 ; N uni0328 ; G 729 -U 809 ; WX 0 ; N uni0329 ; G 730 -U 810 ; WX 0 ; N uni032A ; G 731 -U 811 ; WX 0 ; N uni032B ; G 732 -U 812 ; WX 0 ; N uni032C ; G 733 -U 813 ; WX 0 ; N uni032D ; G 734 -U 814 ; WX 0 ; N uni032E ; G 735 -U 815 ; WX 0 ; N uni032F ; G 736 -U 816 ; WX 0 ; N uni0330 ; G 737 -U 817 ; WX 0 ; N uni0331 ; G 738 -U 818 ; WX 0 ; N uni0332 ; G 739 -U 819 ; WX 0 ; N uni0333 ; G 740 -U 820 ; WX 0 ; N uni0334 ; G 741 -U 821 ; WX 0 ; N uni0335 ; G 742 -U 822 ; WX 0 ; N uni0336 ; G 743 -U 823 ; WX 0 ; N uni0337 ; G 744 -U 824 ; WX 0 ; N uni0338 ; G 745 -U 825 ; WX 0 ; N uni0339 ; G 746 -U 826 ; WX 0 ; N uni033A ; G 747 -U 827 ; WX 0 ; N uni033B ; G 748 -U 828 ; WX 0 ; N uni033C ; G 749 -U 829 ; WX 0 ; N uni033D ; G 750 -U 830 ; WX 0 ; N uni033E ; G 751 -U 831 ; WX 0 ; N uni033F ; G 752 -U 832 ; WX 0 ; N uni0340 ; G 753 -U 833 ; WX 0 ; N uni0341 ; G 754 -U 834 ; WX 0 ; N uni0342 ; G 755 -U 835 ; WX 0 ; N uni0343 ; G 756 -U 836 ; WX 0 ; N uni0344 ; G 757 -U 837 ; WX 0 ; N uni0345 ; G 758 -U 838 ; WX 0 ; N uni0346 ; G 759 -U 839 ; WX 0 ; N uni0347 ; G 760 -U 840 ; WX 0 ; N uni0348 ; G 761 -U 841 ; WX 0 ; N uni0349 ; G 762 -U 842 ; WX 0 ; N uni034A ; G 763 -U 843 ; WX 0 ; N uni034B ; G 764 -U 844 ; WX 0 ; N uni034C ; G 765 -U 845 ; WX 0 ; N uni034D ; G 766 -U 846 ; WX 0 ; N uni034E ; G 767 -U 847 ; WX 0 ; N uni034F ; G 768 -U 849 ; WX 0 ; N uni0351 ; G 769 -U 850 ; WX 0 ; N uni0352 ; G 770 -U 851 ; WX 0 ; N uni0353 ; G 771 -U 855 ; WX 0 ; N uni0357 ; G 772 -U 856 ; WX 0 ; N uni0358 ; G 773 -U 858 ; WX 0 ; N uni035A ; G 774 -U 860 ; WX 0 ; N uni035C ; G 775 -U 861 ; WX 0 ; N uni035D ; G 776 -U 862 ; WX 0 ; N uni035E ; G 777 -U 863 ; WX 0 ; N uni035F ; G 778 -U 864 ; WX 0 ; N uni0360 ; G 779 -U 865 ; WX 0 ; N uni0361 ; G 780 -U 866 ; WX 0 ; N uni0362 ; G 781 -U 880 ; WX 698 ; N uni0370 ; G 782 -U 881 ; WX 565 ; N uni0371 ; G 783 -U 882 ; WX 1022 ; N uni0372 ; G 784 -U 883 ; WX 836 ; N uni0373 ; G 785 -U 884 ; WX 302 ; N uni0374 ; G 786 -U 885 ; WX 302 ; N uni0375 ; G 787 -U 886 ; WX 837 ; N uni0376 ; G 788 -U 887 ; WX 701 ; N uni0377 ; G 789 -U 890 ; WX 500 ; N uni037A ; G 790 -U 891 ; WX 593 ; N uni037B ; G 791 -U 892 ; WX 550 ; N uni037C ; G 792 -U 893 ; WX 549 ; N uni037D ; G 793 -U 894 ; WX 400 ; N uni037E ; G 794 -U 895 ; WX 372 ; N uni037F ; G 795 -U 900 ; WX 441 ; N tonos ; G 796 -U 901 ; WX 500 ; N dieresistonos ; G 797 -U 902 ; WX 797 ; N Alphatonos ; G 798 -U 903 ; WX 380 ; N anoteleia ; G 799 -U 904 ; WX 846 ; N Epsilontonos ; G 800 -U 905 ; WX 1009 ; N Etatonos ; G 801 -U 906 ; WX 563 ; N Iotatonos ; G 802 -U 908 ; WX 891 ; N Omicrontonos ; G 803 -U 910 ; WX 980 ; N Upsilontonos ; G 804 -U 911 ; WX 894 ; N Omegatonos ; G 805 -U 912 ; WX 390 ; N iotadieresistonos ; G 806 -U 913 ; WX 774 ; N Alpha ; G 807 -U 914 ; WX 762 ; N Beta ; G 808 -U 915 ; WX 637 ; N Gamma ; G 809 -U 916 ; WX 774 ; N uni0394 ; G 810 -U 917 ; WX 683 ; N Epsilon ; G 811 -U 918 ; WX 725 ; N Zeta ; G 812 -U 919 ; WX 837 ; N Eta ; G 813 -U 920 ; WX 850 ; N Theta ; G 814 -U 921 ; WX 372 ; N Iota ; G 815 -U 922 ; WX 775 ; N Kappa ; G 816 -U 923 ; WX 774 ; N Lambda ; G 817 -U 924 ; WX 995 ; N Mu ; G 818 -U 925 ; WX 837 ; N Nu ; G 819 -U 926 ; WX 632 ; N Xi ; G 820 -U 927 ; WX 850 ; N Omicron ; G 821 -U 928 ; WX 837 ; N Pi ; G 822 -U 929 ; WX 733 ; N Rho ; G 823 -U 931 ; WX 683 ; N Sigma ; G 824 -U 932 ; WX 682 ; N Tau ; G 825 -U 933 ; WX 724 ; N Upsilon ; G 826 -U 934 ; WX 850 ; N Phi ; G 827 -U 935 ; WX 771 ; N Chi ; G 828 -U 936 ; WX 850 ; N Psi ; G 829 -U 937 ; WX 850 ; N Omega ; G 830 -U 938 ; WX 372 ; N Iotadieresis ; G 831 -U 939 ; WX 724 ; N Upsilondieresis ; G 832 -U 940 ; WX 687 ; N alphatonos ; G 833 -U 941 ; WX 557 ; N epsilontonos ; G 834 -U 942 ; WX 712 ; N etatonos ; G 835 -U 943 ; WX 390 ; N iotatonos ; G 836 -U 944 ; WX 675 ; N upsilondieresistonos ; G 837 -U 945 ; WX 687 ; N alpha ; G 838 -U 946 ; WX 716 ; N beta ; G 839 -U 947 ; WX 681 ; N gamma ; G 840 -U 948 ; WX 687 ; N delta ; G 841 -U 949 ; WX 557 ; N epsilon ; G 842 -U 950 ; WX 591 ; N zeta ; G 843 -U 951 ; WX 712 ; N eta ; G 844 -U 952 ; WX 687 ; N theta ; G 845 -U 953 ; WX 390 ; N iota ; G 846 -U 954 ; WX 710 ; N kappa ; G 847 -U 955 ; WX 633 ; N lambda ; G 848 -U 956 ; WX 736 ; N uni03BC ; G 849 -U 957 ; WX 681 ; N nu ; G 850 -U 958 ; WX 591 ; N xi ; G 851 -U 959 ; WX 687 ; N omicron ; G 852 -U 960 ; WX 791 ; N pi ; G 853 -U 961 ; WX 716 ; N rho ; G 854 -U 962 ; WX 593 ; N sigma1 ; G 855 -U 963 ; WX 779 ; N sigma ; G 856 -U 964 ; WX 638 ; N tau ; G 857 -U 965 ; WX 675 ; N upsilon ; G 858 -U 966 ; WX 782 ; N phi ; G 859 -U 967 ; WX 645 ; N chi ; G 860 -U 968 ; WX 794 ; N psi ; G 861 -U 969 ; WX 869 ; N omega ; G 862 -U 970 ; WX 390 ; N iotadieresis ; G 863 -U 971 ; WX 675 ; N upsilondieresis ; G 864 -U 972 ; WX 687 ; N omicrontonos ; G 865 -U 973 ; WX 675 ; N upsilontonos ; G 866 -U 974 ; WX 869 ; N omegatonos ; G 867 -U 975 ; WX 775 ; N uni03CF ; G 868 -U 976 ; WX 651 ; N uni03D0 ; G 869 -U 977 ; WX 661 ; N theta1 ; G 870 -U 978 ; WX 746 ; N Upsilon1 ; G 871 -U 979 ; WX 981 ; N uni03D3 ; G 872 -U 980 ; WX 746 ; N uni03D4 ; G 873 -U 981 ; WX 796 ; N phi1 ; G 874 -U 982 ; WX 869 ; N omega1 ; G 875 -U 983 ; WX 744 ; N uni03D7 ; G 876 -U 984 ; WX 850 ; N uni03D8 ; G 877 -U 985 ; WX 687 ; N uni03D9 ; G 878 -U 986 ; WX 734 ; N uni03DA ; G 879 -U 987 ; WX 593 ; N uni03DB ; G 880 -U 988 ; WX 683 ; N uni03DC ; G 881 -U 989 ; WX 494 ; N uni03DD ; G 882 -U 990 ; WX 702 ; N uni03DE ; G 883 -U 991 ; WX 660 ; N uni03DF ; G 884 -U 992 ; WX 919 ; N uni03E0 ; G 885 -U 993 ; WX 627 ; N uni03E1 ; G 886 -U 994 ; WX 1093 ; N uni03E2 ; G 887 -U 995 ; WX 837 ; N uni03E3 ; G 888 -U 996 ; WX 832 ; N uni03E4 ; G 889 -U 997 ; WX 716 ; N uni03E5 ; G 890 -U 998 ; WX 928 ; N uni03E6 ; G 891 -U 999 ; WX 744 ; N uni03E7 ; G 892 -U 1000 ; WX 733 ; N uni03E8 ; G 893 -U 1001 ; WX 650 ; N uni03E9 ; G 894 -U 1002 ; WX 789 ; N uni03EA ; G 895 -U 1003 ; WX 671 ; N uni03EB ; G 896 -U 1004 ; WX 752 ; N uni03EC ; G 897 -U 1005 ; WX 716 ; N uni03ED ; G 898 -U 1006 ; WX 682 ; N uni03EE ; G 899 -U 1007 ; WX 590 ; N uni03EF ; G 900 -U 1008 ; WX 744 ; N uni03F0 ; G 901 -U 1009 ; WX 716 ; N uni03F1 ; G 902 -U 1010 ; WX 593 ; N uni03F2 ; G 903 -U 1011 ; WX 343 ; N uni03F3 ; G 904 -U 1012 ; WX 850 ; N uni03F4 ; G 905 -U 1013 ; WX 645 ; N uni03F5 ; G 906 -U 1014 ; WX 645 ; N uni03F6 ; G 907 -U 1015 ; WX 742 ; N uni03F7 ; G 908 -U 1016 ; WX 716 ; N uni03F8 ; G 909 -U 1017 ; WX 734 ; N uni03F9 ; G 910 -U 1018 ; WX 995 ; N uni03FA ; G 911 -U 1019 ; WX 732 ; N uni03FB ; G 912 -U 1020 ; WX 716 ; N uni03FC ; G 913 -U 1021 ; WX 734 ; N uni03FD ; G 914 -U 1022 ; WX 734 ; N uni03FE ; G 915 -U 1023 ; WX 698 ; N uni03FF ; G 916 -U 1024 ; WX 683 ; N uni0400 ; G 917 -U 1025 ; WX 683 ; N uni0401 ; G 918 -U 1026 ; WX 878 ; N uni0402 ; G 919 -U 1027 ; WX 637 ; N uni0403 ; G 920 -U 1028 ; WX 734 ; N uni0404 ; G 921 -U 1029 ; WX 720 ; N uni0405 ; G 922 -U 1030 ; WX 372 ; N uni0406 ; G 923 -U 1031 ; WX 372 ; N uni0407 ; G 924 -U 1032 ; WX 372 ; N uni0408 ; G 925 -U 1033 ; WX 1154 ; N uni0409 ; G 926 -U 1034 ; WX 1130 ; N uni040A ; G 927 -U 1035 ; WX 878 ; N uni040B ; G 928 -U 1036 ; WX 817 ; N uni040C ; G 929 -U 1037 ; WX 837 ; N uni040D ; G 930 -U 1038 ; WX 771 ; N uni040E ; G 931 -U 1039 ; WX 837 ; N uni040F ; G 932 -U 1040 ; WX 774 ; N uni0410 ; G 933 -U 1041 ; WX 762 ; N uni0411 ; G 934 -U 1042 ; WX 762 ; N uni0412 ; G 935 -U 1043 ; WX 637 ; N uni0413 ; G 936 -U 1044 ; WX 891 ; N uni0414 ; G 937 -U 1045 ; WX 683 ; N uni0415 ; G 938 -U 1046 ; WX 1224 ; N uni0416 ; G 939 -U 1047 ; WX 710 ; N uni0417 ; G 940 -U 1048 ; WX 837 ; N uni0418 ; G 941 -U 1049 ; WX 837 ; N uni0419 ; G 942 -U 1050 ; WX 817 ; N uni041A ; G 943 -U 1051 ; WX 831 ; N uni041B ; G 944 -U 1052 ; WX 995 ; N uni041C ; G 945 -U 1053 ; WX 837 ; N uni041D ; G 946 -U 1054 ; WX 850 ; N uni041E ; G 947 -U 1055 ; WX 837 ; N uni041F ; G 948 -U 1056 ; WX 733 ; N uni0420 ; G 949 -U 1057 ; WX 734 ; N uni0421 ; G 950 -U 1058 ; WX 682 ; N uni0422 ; G 951 -U 1059 ; WX 771 ; N uni0423 ; G 952 -U 1060 ; WX 992 ; N uni0424 ; G 953 -U 1061 ; WX 771 ; N uni0425 ; G 954 -U 1062 ; WX 928 ; N uni0426 ; G 955 -U 1063 ; WX 808 ; N uni0427 ; G 956 -U 1064 ; WX 1235 ; N uni0428 ; G 957 -U 1065 ; WX 1326 ; N uni0429 ; G 958 -U 1066 ; WX 939 ; N uni042A ; G 959 -U 1067 ; WX 1036 ; N uni042B ; G 960 -U 1068 ; WX 762 ; N uni042C ; G 961 -U 1069 ; WX 734 ; N uni042D ; G 962 -U 1070 ; WX 1174 ; N uni042E ; G 963 -U 1071 ; WX 770 ; N uni042F ; G 964 -U 1072 ; WX 675 ; N uni0430 ; G 965 -U 1073 ; WX 698 ; N uni0431 ; G 966 -U 1074 ; WX 633 ; N uni0432 ; G 967 -U 1075 ; WX 522 ; N uni0433 ; G 968 -U 1076 ; WX 808 ; N uni0434 ; G 969 -U 1077 ; WX 678 ; N uni0435 ; G 970 -U 1078 ; WX 995 ; N uni0436 ; G 971 -U 1079 ; WX 581 ; N uni0437 ; G 972 -U 1080 ; WX 701 ; N uni0438 ; G 973 -U 1081 ; WX 701 ; N uni0439 ; G 974 -U 1082 ; WX 679 ; N uni043A ; G 975 -U 1083 ; WX 732 ; N uni043B ; G 976 -U 1084 ; WX 817 ; N uni043C ; G 977 -U 1085 ; WX 691 ; N uni043D ; G 978 -U 1086 ; WX 687 ; N uni043E ; G 979 -U 1087 ; WX 691 ; N uni043F ; G 980 -U 1088 ; WX 716 ; N uni0440 ; G 981 -U 1089 ; WX 593 ; N uni0441 ; G 982 -U 1090 ; WX 580 ; N uni0442 ; G 983 -U 1091 ; WX 652 ; N uni0443 ; G 984 -U 1092 ; WX 992 ; N uni0444 ; G 985 -U 1093 ; WX 645 ; N uni0445 ; G 986 -U 1094 ; WX 741 ; N uni0446 ; G 987 -U 1095 ; WX 687 ; N uni0447 ; G 988 -U 1096 ; WX 1062 ; N uni0448 ; G 989 -U 1097 ; WX 1105 ; N uni0449 ; G 990 -U 1098 ; WX 751 ; N uni044A ; G 991 -U 1099 ; WX 904 ; N uni044B ; G 992 -U 1100 ; WX 632 ; N uni044C ; G 993 -U 1101 ; WX 593 ; N uni044D ; G 994 -U 1102 ; WX 972 ; N uni044E ; G 995 -U 1103 ; WX 642 ; N uni044F ; G 996 -U 1104 ; WX 678 ; N uni0450 ; G 997 -U 1105 ; WX 678 ; N uni0451 ; G 998 -U 1106 ; WX 714 ; N uni0452 ; G 999 -U 1107 ; WX 522 ; N uni0453 ; G 1000 -U 1108 ; WX 593 ; N uni0454 ; G 1001 -U 1109 ; WX 595 ; N uni0455 ; G 1002 -U 1110 ; WX 343 ; N uni0456 ; G 1003 -U 1111 ; WX 343 ; N uni0457 ; G 1004 -U 1112 ; WX 343 ; N uni0458 ; G 1005 -U 1113 ; WX 991 ; N uni0459 ; G 1006 -U 1114 ; WX 956 ; N uni045A ; G 1007 -U 1115 ; WX 734 ; N uni045B ; G 1008 -U 1116 ; WX 679 ; N uni045C ; G 1009 -U 1117 ; WX 701 ; N uni045D ; G 1010 -U 1118 ; WX 652 ; N uni045E ; G 1011 -U 1119 ; WX 691 ; N uni045F ; G 1012 -U 1120 ; WX 1093 ; N uni0460 ; G 1013 -U 1121 ; WX 869 ; N uni0461 ; G 1014 -U 1122 ; WX 840 ; N uni0462 ; G 1015 -U 1123 ; WX 736 ; N uni0463 ; G 1016 -U 1124 ; WX 1012 ; N uni0464 ; G 1017 -U 1125 ; WX 839 ; N uni0465 ; G 1018 -U 1126 ; WX 992 ; N uni0466 ; G 1019 -U 1127 ; WX 832 ; N uni0467 ; G 1020 -U 1128 ; WX 1358 ; N uni0468 ; G 1021 -U 1129 ; WX 1121 ; N uni0469 ; G 1022 -U 1130 ; WX 850 ; N uni046A ; G 1023 -U 1131 ; WX 687 ; N uni046B ; G 1024 -U 1132 ; WX 1236 ; N uni046C ; G 1025 -U 1133 ; WX 1007 ; N uni046D ; G 1026 -U 1134 ; WX 696 ; N uni046E ; G 1027 -U 1135 ; WX 557 ; N uni046F ; G 1028 -U 1136 ; WX 1075 ; N uni0470 ; G 1029 -U 1137 ; WX 1061 ; N uni0471 ; G 1030 -U 1138 ; WX 850 ; N uni0472 ; G 1031 -U 1139 ; WX 687 ; N uni0473 ; G 1032 -U 1140 ; WX 850 ; N uni0474 ; G 1033 -U 1141 ; WX 695 ; N uni0475 ; G 1034 -U 1142 ; WX 850 ; N uni0476 ; G 1035 -U 1143 ; WX 695 ; N uni0477 ; G 1036 -U 1144 ; WX 1148 ; N uni0478 ; G 1037 -U 1145 ; WX 1043 ; N uni0479 ; G 1038 -U 1146 ; WX 1074 ; N uni047A ; G 1039 -U 1147 ; WX 863 ; N uni047B ; G 1040 -U 1148 ; WX 1405 ; N uni047C ; G 1041 -U 1149 ; WX 1173 ; N uni047D ; G 1042 -U 1150 ; WX 1093 ; N uni047E ; G 1043 -U 1151 ; WX 869 ; N uni047F ; G 1044 -U 1152 ; WX 734 ; N uni0480 ; G 1045 -U 1153 ; WX 593 ; N uni0481 ; G 1046 -U 1154 ; WX 652 ; N uni0482 ; G 1047 -U 1155 ; WX 0 ; N uni0483 ; G 1048 -U 1156 ; WX 0 ; N uni0484 ; G 1049 -U 1157 ; WX 0 ; N uni0485 ; G 1050 -U 1158 ; WX 0 ; N uni0486 ; G 1051 -U 1159 ; WX 0 ; N uni0487 ; G 1052 -U 1160 ; WX 418 ; N uni0488 ; G 1053 -U 1161 ; WX 418 ; N uni0489 ; G 1054 -U 1162 ; WX 938 ; N uni048A ; G 1055 -U 1163 ; WX 806 ; N uni048B ; G 1056 -U 1164 ; WX 762 ; N uni048C ; G 1057 -U 1165 ; WX 611 ; N uni048D ; G 1058 -U 1166 ; WX 736 ; N uni048E ; G 1059 -U 1167 ; WX 718 ; N uni048F ; G 1060 -U 1168 ; WX 637 ; N uni0490 ; G 1061 -U 1169 ; WX 522 ; N uni0491 ; G 1062 -U 1170 ; WX 666 ; N uni0492 ; G 1063 -U 1171 ; WX 543 ; N uni0493 ; G 1064 -U 1172 ; WX 789 ; N uni0494 ; G 1065 -U 1173 ; WX 522 ; N uni0495 ; G 1066 -U 1174 ; WX 1224 ; N uni0496 ; G 1067 -U 1175 ; WX 995 ; N uni0497 ; G 1068 -U 1176 ; WX 710 ; N uni0498 ; G 1069 -U 1177 ; WX 581 ; N uni0499 ; G 1070 -U 1178 ; WX 775 ; N uni049A ; G 1071 -U 1179 ; WX 679 ; N uni049B ; G 1072 -U 1180 ; WX 817 ; N uni049C ; G 1073 -U 1181 ; WX 679 ; N uni049D ; G 1074 -U 1182 ; WX 817 ; N uni049E ; G 1075 -U 1183 ; WX 679 ; N uni049F ; G 1076 -U 1184 ; WX 1015 ; N uni04A0 ; G 1077 -U 1185 ; WX 826 ; N uni04A1 ; G 1078 -U 1186 ; WX 837 ; N uni04A2 ; G 1079 -U 1187 ; WX 691 ; N uni04A3 ; G 1080 -U 1188 ; WX 1103 ; N uni04A4 ; G 1081 -U 1189 ; WX 871 ; N uni04A5 ; G 1082 -U 1190 ; WX 1254 ; N uni04A6 ; G 1083 -U 1191 ; WX 979 ; N uni04A7 ; G 1084 -U 1192 ; WX 946 ; N uni04A8 ; G 1085 -U 1193 ; WX 859 ; N uni04A9 ; G 1086 -U 1194 ; WX 734 ; N uni04AA ; G 1087 -U 1195 ; WX 593 ; N uni04AB ; G 1088 -U 1196 ; WX 682 ; N uni04AC ; G 1089 -U 1197 ; WX 580 ; N uni04AD ; G 1090 -U 1198 ; WX 724 ; N uni04AE ; G 1091 -U 1199 ; WX 652 ; N uni04AF ; G 1092 -U 1200 ; WX 724 ; N uni04B0 ; G 1093 -U 1201 ; WX 652 ; N uni04B1 ; G 1094 -U 1202 ; WX 771 ; N uni04B2 ; G 1095 -U 1203 ; WX 645 ; N uni04B3 ; G 1096 -U 1204 ; WX 1104 ; N uni04B4 ; G 1097 -U 1205 ; WX 1001 ; N uni04B5 ; G 1098 -U 1206 ; WX 808 ; N uni04B6 ; G 1099 -U 1207 ; WX 687 ; N uni04B7 ; G 1100 -U 1208 ; WX 808 ; N uni04B8 ; G 1101 -U 1209 ; WX 687 ; N uni04B9 ; G 1102 -U 1210 ; WX 808 ; N uni04BA ; G 1103 -U 1211 ; WX 712 ; N uni04BB ; G 1104 -U 1212 ; WX 1026 ; N uni04BC ; G 1105 -U 1213 ; WX 810 ; N uni04BD ; G 1106 -U 1214 ; WX 1026 ; N uni04BE ; G 1107 -U 1215 ; WX 810 ; N uni04BF ; G 1108 -U 1216 ; WX 372 ; N uni04C0 ; G 1109 -U 1217 ; WX 1224 ; N uni04C1 ; G 1110 -U 1218 ; WX 995 ; N uni04C2 ; G 1111 -U 1219 ; WX 778 ; N uni04C3 ; G 1112 -U 1220 ; WX 629 ; N uni04C4 ; G 1113 -U 1221 ; WX 933 ; N uni04C5 ; G 1114 -U 1222 ; WX 804 ; N uni04C6 ; G 1115 -U 1223 ; WX 837 ; N uni04C7 ; G 1116 -U 1224 ; WX 691 ; N uni04C8 ; G 1117 -U 1225 ; WX 938 ; N uni04C9 ; G 1118 -U 1226 ; WX 806 ; N uni04CA ; G 1119 -U 1227 ; WX 808 ; N uni04CB ; G 1120 -U 1228 ; WX 687 ; N uni04CC ; G 1121 -U 1229 ; WX 1096 ; N uni04CD ; G 1122 -U 1230 ; WX 932 ; N uni04CE ; G 1123 -U 1231 ; WX 343 ; N uni04CF ; G 1124 -U 1232 ; WX 774 ; N uni04D0 ; G 1125 -U 1233 ; WX 675 ; N uni04D1 ; G 1126 -U 1234 ; WX 774 ; N uni04D2 ; G 1127 -U 1235 ; WX 675 ; N uni04D3 ; G 1128 -U 1236 ; WX 1085 ; N uni04D4 ; G 1129 -U 1237 ; WX 1048 ; N uni04D5 ; G 1130 -U 1238 ; WX 683 ; N uni04D6 ; G 1131 -U 1239 ; WX 678 ; N uni04D7 ; G 1132 -U 1240 ; WX 850 ; N uni04D8 ; G 1133 -U 1241 ; WX 678 ; N uni04D9 ; G 1134 -U 1242 ; WX 850 ; N uni04DA ; G 1135 -U 1243 ; WX 678 ; N uni04DB ; G 1136 -U 1244 ; WX 1224 ; N uni04DC ; G 1137 -U 1245 ; WX 995 ; N uni04DD ; G 1138 -U 1246 ; WX 710 ; N uni04DE ; G 1139 -U 1247 ; WX 581 ; N uni04DF ; G 1140 -U 1248 ; WX 772 ; N uni04E0 ; G 1141 -U 1249 ; WX 641 ; N uni04E1 ; G 1142 -U 1250 ; WX 837 ; N uni04E2 ; G 1143 -U 1251 ; WX 701 ; N uni04E3 ; G 1144 -U 1252 ; WX 837 ; N uni04E4 ; G 1145 -U 1253 ; WX 701 ; N uni04E5 ; G 1146 -U 1254 ; WX 850 ; N uni04E6 ; G 1147 -U 1255 ; WX 687 ; N uni04E7 ; G 1148 -U 1256 ; WX 850 ; N uni04E8 ; G 1149 -U 1257 ; WX 687 ; N uni04E9 ; G 1150 -U 1258 ; WX 850 ; N uni04EA ; G 1151 -U 1259 ; WX 687 ; N uni04EB ; G 1152 -U 1260 ; WX 734 ; N uni04EC ; G 1153 -U 1261 ; WX 593 ; N uni04ED ; G 1154 -U 1262 ; WX 771 ; N uni04EE ; G 1155 -U 1263 ; WX 652 ; N uni04EF ; G 1156 -U 1264 ; WX 771 ; N uni04F0 ; G 1157 -U 1265 ; WX 652 ; N uni04F1 ; G 1158 -U 1266 ; WX 771 ; N uni04F2 ; G 1159 -U 1267 ; WX 652 ; N uni04F3 ; G 1160 -U 1268 ; WX 808 ; N uni04F4 ; G 1161 -U 1269 ; WX 687 ; N uni04F5 ; G 1162 -U 1270 ; WX 637 ; N uni04F6 ; G 1163 -U 1271 ; WX 522 ; N uni04F7 ; G 1164 -U 1272 ; WX 1036 ; N uni04F8 ; G 1165 -U 1273 ; WX 904 ; N uni04F9 ; G 1166 -U 1274 ; WX 666 ; N uni04FA ; G 1167 -U 1275 ; WX 543 ; N uni04FB ; G 1168 -U 1276 ; WX 771 ; N uni04FC ; G 1169 -U 1277 ; WX 645 ; N uni04FD ; G 1170 -U 1278 ; WX 771 ; N uni04FE ; G 1171 -U 1279 ; WX 645 ; N uni04FF ; G 1172 -U 1280 ; WX 762 ; N uni0500 ; G 1173 -U 1281 ; WX 608 ; N uni0501 ; G 1174 -U 1282 ; WX 1159 ; N uni0502 ; G 1175 -U 1283 ; WX 893 ; N uni0503 ; G 1176 -U 1284 ; WX 1119 ; N uni0504 ; G 1177 -U 1285 ; WX 920 ; N uni0505 ; G 1178 -U 1286 ; WX 828 ; N uni0506 ; G 1179 -U 1287 ; WX 693 ; N uni0507 ; G 1180 -U 1288 ; WX 1242 ; N uni0508 ; G 1181 -U 1289 ; WX 1017 ; N uni0509 ; G 1182 -U 1290 ; WX 1289 ; N uni050A ; G 1183 -U 1291 ; WX 1013 ; N uni050B ; G 1184 -U 1292 ; WX 839 ; N uni050C ; G 1185 -U 1293 ; WX 638 ; N uni050D ; G 1186 -U 1294 ; WX 938 ; N uni050E ; G 1187 -U 1295 ; WX 803 ; N uni050F ; G 1188 -U 1296 ; WX 696 ; N uni0510 ; G 1189 -U 1297 ; WX 557 ; N uni0511 ; G 1190 -U 1298 ; WX 831 ; N uni0512 ; G 1191 -U 1299 ; WX 732 ; N uni0513 ; G 1192 -U 1300 ; WX 1286 ; N uni0514 ; G 1193 -U 1301 ; WX 1070 ; N uni0515 ; G 1194 -U 1302 ; WX 1065 ; N uni0516 ; G 1195 -U 1303 ; WX 982 ; N uni0517 ; G 1196 -U 1304 ; WX 1082 ; N uni0518 ; G 1197 -U 1305 ; WX 960 ; N uni0519 ; G 1198 -U 1306 ; WX 850 ; N uni051A ; G 1199 -U 1307 ; WX 716 ; N uni051B ; G 1200 -U 1308 ; WX 1103 ; N uni051C ; G 1201 -U 1309 ; WX 924 ; N uni051D ; G 1202 -U 1310 ; WX 817 ; N uni051E ; G 1203 -U 1311 ; WX 679 ; N uni051F ; G 1204 -U 1312 ; WX 1248 ; N uni0520 ; G 1205 -U 1313 ; WX 1022 ; N uni0521 ; G 1206 -U 1314 ; WX 1254 ; N uni0522 ; G 1207 -U 1315 ; WX 979 ; N uni0523 ; G 1208 -U 1316 ; WX 957 ; N uni0524 ; G 1209 -U 1317 ; WX 807 ; N uni0525 ; G 1210 -U 1329 ; WX 904 ; N uni0531 ; G 1211 -U 1330 ; WX 810 ; N uni0532 ; G 1212 -U 1331 ; WX 809 ; N uni0533 ; G 1213 -U 1332 ; WX 813 ; N uni0534 ; G 1214 -U 1333 ; WX 810 ; N uni0535 ; G 1215 -U 1334 ; WX 815 ; N uni0536 ; G 1216 -U 1335 ; WX 724 ; N uni0537 ; G 1217 -U 1336 ; WX 800 ; N uni0538 ; G 1218 -U 1337 ; WX 1004 ; N uni0539 ; G 1219 -U 1338 ; WX 809 ; N uni053A ; G 1220 -U 1339 ; WX 740 ; N uni053B ; G 1221 -U 1340 ; WX 620 ; N uni053C ; G 1222 -U 1341 ; WX 1068 ; N uni053D ; G 1223 -U 1342 ; WX 875 ; N uni053E ; G 1224 -U 1343 ; WX 792 ; N uni053F ; G 1225 -U 1344 ; WX 723 ; N uni0540 ; G 1226 -U 1345 ; WX 811 ; N uni0541 ; G 1227 -U 1346 ; WX 794 ; N uni0542 ; G 1228 -U 1347 ; WX 782 ; N uni0543 ; G 1229 -U 1348 ; WX 867 ; N uni0544 ; G 1230 -U 1349 ; WX 766 ; N uni0545 ; G 1231 -U 1350 ; WX 794 ; N uni0546 ; G 1232 -U 1351 ; WX 787 ; N uni0547 ; G 1233 -U 1352 ; WX 812 ; N uni0548 ; G 1234 -U 1353 ; WX 752 ; N uni0549 ; G 1235 -U 1354 ; WX 963 ; N uni054A ; G 1236 -U 1355 ; WX 790 ; N uni054B ; G 1237 -U 1356 ; WX 867 ; N uni054C ; G 1238 -U 1357 ; WX 812 ; N uni054D ; G 1239 -U 1358 ; WX 794 ; N uni054E ; G 1240 -U 1359 ; WX 771 ; N uni054F ; G 1241 -U 1360 ; WX 740 ; N uni0550 ; G 1242 -U 1361 ; WX 775 ; N uni0551 ; G 1243 -U 1362 ; WX 640 ; N uni0552 ; G 1244 -U 1363 ; WX 926 ; N uni0553 ; G 1245 -U 1364 ; WX 775 ; N uni0554 ; G 1246 -U 1365 ; WX 848 ; N uni0555 ; G 1247 -U 1366 ; WX 951 ; N uni0556 ; G 1248 -U 1369 ; WX 366 ; N uni0559 ; G 1249 -U 1370 ; WX 380 ; N uni055A ; G 1250 -U 1371 ; WX 342 ; N uni055B ; G 1251 -U 1372 ; WX 415 ; N uni055C ; G 1252 -U 1373 ; WX 348 ; N uni055D ; G 1253 -U 1374 ; WX 513 ; N uni055E ; G 1254 -U 1375 ; WX 521 ; N uni055F ; G 1255 -U 1377 ; WX 1043 ; N uni0561 ; G 1256 -U 1378 ; WX 713 ; N uni0562 ; G 1257 -U 1379 ; WX 782 ; N uni0563 ; G 1258 -U 1380 ; WX 786 ; N uni0564 ; G 1259 -U 1381 ; WX 713 ; N uni0565 ; G 1260 -U 1382 ; WX 715 ; N uni0566 ; G 1261 -U 1383 ; WX 628 ; N uni0567 ; G 1262 -U 1384 ; WX 713 ; N uni0568 ; G 1263 -U 1385 ; WX 840 ; N uni0569 ; G 1264 -U 1386 ; WX 782 ; N uni056A ; G 1265 -U 1387 ; WX 714 ; N uni056B ; G 1266 -U 1388 ; WX 344 ; N uni056C ; G 1267 -U 1389 ; WX 1094 ; N uni056D ; G 1268 -U 1390 ; WX 708 ; N uni056E ; G 1269 -U 1391 ; WX 714 ; N uni056F ; G 1270 -U 1392 ; WX 714 ; N uni0570 ; G 1271 -U 1393 ; WX 670 ; N uni0571 ; G 1272 -U 1394 ; WX 714 ; N uni0572 ; G 1273 -U 1395 ; WX 713 ; N uni0573 ; G 1274 -U 1396 ; WX 714 ; N uni0574 ; G 1275 -U 1397 ; WX 343 ; N uni0575 ; G 1276 -U 1398 ; WX 714 ; N uni0576 ; G 1277 -U 1399 ; WX 541 ; N uni0577 ; G 1278 -U 1400 ; WX 714 ; N uni0578 ; G 1279 -U 1401 ; WX 407 ; N uni0579 ; G 1280 -U 1402 ; WX 1043 ; N uni057A ; G 1281 -U 1403 ; WX 636 ; N uni057B ; G 1282 -U 1404 ; WX 740 ; N uni057C ; G 1283 -U 1405 ; WX 714 ; N uni057D ; G 1284 -U 1406 ; WX 714 ; N uni057E ; G 1285 -U 1407 ; WX 1038 ; N uni057F ; G 1286 -U 1408 ; WX 714 ; N uni0580 ; G 1287 -U 1409 ; WX 714 ; N uni0581 ; G 1288 -U 1410 ; WX 532 ; N uni0582 ; G 1289 -U 1411 ; WX 1038 ; N uni0583 ; G 1290 -U 1412 ; WX 720 ; N uni0584 ; G 1291 -U 1413 ; WX 689 ; N uni0585 ; G 1292 -U 1414 ; WX 904 ; N uni0586 ; G 1293 -U 1415 ; WX 902 ; N uni0587 ; G 1294 -U 1417 ; WX 400 ; N uni0589 ; G 1295 -U 1418 ; WX 415 ; N uni058A ; G 1296 -U 1456 ; WX 0 ; N uni05B0 ; G 1297 -U 1457 ; WX 0 ; N uni05B1 ; G 1298 -U 1458 ; WX 0 ; N uni05B2 ; G 1299 -U 1459 ; WX 0 ; N uni05B3 ; G 1300 -U 1460 ; WX 0 ; N uni05B4 ; G 1301 -U 1461 ; WX 0 ; N uni05B5 ; G 1302 -U 1462 ; WX 0 ; N uni05B6 ; G 1303 -U 1463 ; WX 0 ; N uni05B7 ; G 1304 -U 1464 ; WX 0 ; N uni05B8 ; G 1305 -U 1465 ; WX 0 ; N uni05B9 ; G 1306 -U 1466 ; WX 0 ; N uni05BA ; G 1307 -U 1467 ; WX 0 ; N uni05BB ; G 1308 -U 1468 ; WX 0 ; N uni05BC ; G 1309 -U 1469 ; WX 0 ; N uni05BD ; G 1310 -U 1470 ; WX 415 ; N uni05BE ; G 1311 -U 1471 ; WX 0 ; N uni05BF ; G 1312 -U 1472 ; WX 372 ; N uni05C0 ; G 1313 -U 1473 ; WX 0 ; N uni05C1 ; G 1314 -U 1474 ; WX 0 ; N uni05C2 ; G 1315 -U 1475 ; WX 372 ; N uni05C3 ; G 1316 -U 1478 ; WX 497 ; N uni05C6 ; G 1317 -U 1479 ; WX 0 ; N uni05C7 ; G 1318 -U 1488 ; WX 728 ; N uni05D0 ; G 1319 -U 1489 ; WX 610 ; N uni05D1 ; G 1320 -U 1490 ; WX 447 ; N uni05D2 ; G 1321 -U 1491 ; WX 588 ; N uni05D3 ; G 1322 -U 1492 ; WX 687 ; N uni05D4 ; G 1323 -U 1493 ; WX 343 ; N uni05D5 ; G 1324 -U 1494 ; WX 400 ; N uni05D6 ; G 1325 -U 1495 ; WX 687 ; N uni05D7 ; G 1326 -U 1496 ; WX 679 ; N uni05D8 ; G 1327 -U 1497 ; WX 294 ; N uni05D9 ; G 1328 -U 1498 ; WX 578 ; N uni05DA ; G 1329 -U 1499 ; WX 566 ; N uni05DB ; G 1330 -U 1500 ; WX 605 ; N uni05DC ; G 1331 -U 1501 ; WX 696 ; N uni05DD ; G 1332 -U 1502 ; WX 724 ; N uni05DE ; G 1333 -U 1503 ; WX 343 ; N uni05DF ; G 1334 -U 1504 ; WX 453 ; N uni05E0 ; G 1335 -U 1505 ; WX 680 ; N uni05E1 ; G 1336 -U 1506 ; WX 666 ; N uni05E2 ; G 1337 -U 1507 ; WX 675 ; N uni05E3 ; G 1338 -U 1508 ; WX 658 ; N uni05E4 ; G 1339 -U 1509 ; WX 661 ; N uni05E5 ; G 1340 -U 1510 ; WX 653 ; N uni05E6 ; G 1341 -U 1511 ; WX 736 ; N uni05E7 ; G 1342 -U 1512 ; WX 602 ; N uni05E8 ; G 1343 -U 1513 ; WX 749 ; N uni05E9 ; G 1344 -U 1514 ; WX 683 ; N uni05EA ; G 1345 -U 1520 ; WX 664 ; N uni05F0 ; G 1346 -U 1521 ; WX 664 ; N uni05F1 ; G 1347 -U 1522 ; WX 663 ; N uni05F2 ; G 1348 -U 1523 ; WX 444 ; N uni05F3 ; G 1349 -U 1524 ; WX 710 ; N uni05F4 ; G 1350 -U 3647 ; WX 696 ; N uni0E3F ; G 1351 -U 3713 ; WX 815 ; N uni0E81 ; G 1352 -U 3714 ; WX 748 ; N uni0E82 ; G 1353 -U 3716 ; WX 749 ; N uni0E84 ; G 1354 -U 3719 ; WX 569 ; N uni0E87 ; G 1355 -U 3720 ; WX 742 ; N uni0E88 ; G 1356 -U 3722 ; WX 744 ; N uni0E8A ; G 1357 -U 3725 ; WX 761 ; N uni0E8D ; G 1358 -U 3732 ; WX 706 ; N uni0E94 ; G 1359 -U 3733 ; WX 704 ; N uni0E95 ; G 1360 -U 3734 ; WX 747 ; N uni0E96 ; G 1361 -U 3735 ; WX 819 ; N uni0E97 ; G 1362 -U 3737 ; WX 730 ; N uni0E99 ; G 1363 -U 3738 ; WX 727 ; N uni0E9A ; G 1364 -U 3739 ; WX 727 ; N uni0E9B ; G 1365 -U 3740 ; WX 922 ; N uni0E9C ; G 1366 -U 3741 ; WX 827 ; N uni0E9D ; G 1367 -U 3742 ; WX 866 ; N uni0E9E ; G 1368 -U 3743 ; WX 866 ; N uni0E9F ; G 1369 -U 3745 ; WX 836 ; N uni0EA1 ; G 1370 -U 3746 ; WX 761 ; N uni0EA2 ; G 1371 -U 3747 ; WX 770 ; N uni0EA3 ; G 1372 -U 3749 ; WX 769 ; N uni0EA5 ; G 1373 -U 3751 ; WX 713 ; N uni0EA7 ; G 1374 -U 3754 ; WX 827 ; N uni0EAA ; G 1375 -U 3755 ; WX 1031 ; N uni0EAB ; G 1376 -U 3757 ; WX 724 ; N uni0EAD ; G 1377 -U 3758 ; WX 784 ; N uni0EAE ; G 1378 -U 3759 ; WX 934 ; N uni0EAF ; G 1379 -U 3760 ; WX 688 ; N uni0EB0 ; G 1380 -U 3761 ; WX 0 ; N uni0EB1 ; G 1381 -U 3762 ; WX 610 ; N uni0EB2 ; G 1382 -U 3763 ; WX 610 ; N uni0EB3 ; G 1383 -U 3764 ; WX 0 ; N uni0EB4 ; G 1384 -U 3765 ; WX 0 ; N uni0EB5 ; G 1385 -U 3766 ; WX 0 ; N uni0EB6 ; G 1386 -U 3767 ; WX 0 ; N uni0EB7 ; G 1387 -U 3768 ; WX 0 ; N uni0EB8 ; G 1388 -U 3769 ; WX 0 ; N uni0EB9 ; G 1389 -U 3771 ; WX 0 ; N uni0EBB ; G 1390 -U 3772 ; WX 0 ; N uni0EBC ; G 1391 -U 3773 ; WX 670 ; N uni0EBD ; G 1392 -U 3776 ; WX 516 ; N uni0EC0 ; G 1393 -U 3777 ; WX 860 ; N uni0EC1 ; G 1394 -U 3778 ; WX 516 ; N uni0EC2 ; G 1395 -U 3779 ; WX 650 ; N uni0EC3 ; G 1396 -U 3780 ; WX 632 ; N uni0EC4 ; G 1397 -U 3782 ; WX 759 ; N uni0EC6 ; G 1398 -U 3784 ; WX 0 ; N uni0EC8 ; G 1399 -U 3785 ; WX 0 ; N uni0EC9 ; G 1400 -U 3786 ; WX 0 ; N uni0ECA ; G 1401 -U 3787 ; WX 0 ; N uni0ECB ; G 1402 -U 3788 ; WX 0 ; N uni0ECC ; G 1403 -U 3789 ; WX 0 ; N uni0ECD ; G 1404 -U 3792 ; WX 771 ; N uni0ED0 ; G 1405 -U 3793 ; WX 771 ; N uni0ED1 ; G 1406 -U 3794 ; WX 693 ; N uni0ED2 ; G 1407 -U 3795 ; WX 836 ; N uni0ED3 ; G 1408 -U 3796 ; WX 729 ; N uni0ED4 ; G 1409 -U 3797 ; WX 729 ; N uni0ED5 ; G 1410 -U 3798 ; WX 849 ; N uni0ED6 ; G 1411 -U 3799 ; WX 790 ; N uni0ED7 ; G 1412 -U 3800 ; WX 759 ; N uni0ED8 ; G 1413 -U 3801 ; WX 910 ; N uni0ED9 ; G 1414 -U 3804 ; WX 1363 ; N uni0EDC ; G 1415 -U 3805 ; WX 1363 ; N uni0EDD ; G 1416 -U 4256 ; WX 874 ; N uni10A0 ; G 1417 -U 4257 ; WX 733 ; N uni10A1 ; G 1418 -U 4258 ; WX 679 ; N uni10A2 ; G 1419 -U 4259 ; WX 834 ; N uni10A3 ; G 1420 -U 4260 ; WX 615 ; N uni10A4 ; G 1421 -U 4261 ; WX 768 ; N uni10A5 ; G 1422 -U 4262 ; WX 753 ; N uni10A6 ; G 1423 -U 4263 ; WX 914 ; N uni10A7 ; G 1424 -U 4264 ; WX 453 ; N uni10A8 ; G 1425 -U 4265 ; WX 620 ; N uni10A9 ; G 1426 -U 4266 ; WX 843 ; N uni10AA ; G 1427 -U 4267 ; WX 882 ; N uni10AB ; G 1428 -U 4268 ; WX 625 ; N uni10AC ; G 1429 -U 4269 ; WX 854 ; N uni10AD ; G 1430 -U 4270 ; WX 781 ; N uni10AE ; G 1431 -U 4271 ; WX 629 ; N uni10AF ; G 1432 -U 4272 ; WX 912 ; N uni10B0 ; G 1433 -U 4273 ; WX 621 ; N uni10B1 ; G 1434 -U 4274 ; WX 620 ; N uni10B2 ; G 1435 -U 4275 ; WX 854 ; N uni10B3 ; G 1436 -U 4276 ; WX 866 ; N uni10B4 ; G 1437 -U 4277 ; WX 724 ; N uni10B5 ; G 1438 -U 4278 ; WX 630 ; N uni10B6 ; G 1439 -U 4279 ; WX 621 ; N uni10B7 ; G 1440 -U 4280 ; WX 625 ; N uni10B8 ; G 1441 -U 4281 ; WX 620 ; N uni10B9 ; G 1442 -U 4282 ; WX 818 ; N uni10BA ; G 1443 -U 4283 ; WX 874 ; N uni10BB ; G 1444 -U 4284 ; WX 615 ; N uni10BC ; G 1445 -U 4285 ; WX 623 ; N uni10BD ; G 1446 -U 4286 ; WX 625 ; N uni10BE ; G 1447 -U 4287 ; WX 725 ; N uni10BF ; G 1448 -U 4288 ; WX 844 ; N uni10C0 ; G 1449 -U 4289 ; WX 596 ; N uni10C1 ; G 1450 -U 4290 ; WX 688 ; N uni10C2 ; G 1451 -U 4291 ; WX 596 ; N uni10C3 ; G 1452 -U 4292 ; WX 594 ; N uni10C4 ; G 1453 -U 4293 ; WX 738 ; N uni10C5 ; G 1454 -U 4304 ; WX 554 ; N uni10D0 ; G 1455 -U 4305 ; WX 563 ; N uni10D1 ; G 1456 -U 4306 ; WX 622 ; N uni10D2 ; G 1457 -U 4307 ; WX 834 ; N uni10D3 ; G 1458 -U 4308 ; WX 550 ; N uni10D4 ; G 1459 -U 4309 ; WX 559 ; N uni10D5 ; G 1460 -U 4310 ; WX 546 ; N uni10D6 ; G 1461 -U 4311 ; WX 828 ; N uni10D7 ; G 1462 -U 4312 ; WX 563 ; N uni10D8 ; G 1463 -U 4313 ; WX 556 ; N uni10D9 ; G 1464 -U 4314 ; WX 1074 ; N uni10DA ; G 1465 -U 4315 ; WX 563 ; N uni10DB ; G 1466 -U 4316 ; WX 563 ; N uni10DC ; G 1467 -U 4317 ; WX 814 ; N uni10DD ; G 1468 -U 4318 ; WX 554 ; N uni10DE ; G 1469 -U 4319 ; WX 559 ; N uni10DF ; G 1470 -U 4320 ; WX 823 ; N uni10E0 ; G 1471 -U 4321 ; WX 563 ; N uni10E1 ; G 1472 -U 4322 ; WX 700 ; N uni10E2 ; G 1473 -U 4323 ; WX 582 ; N uni10E3 ; G 1474 -U 4324 ; WX 847 ; N uni10E4 ; G 1475 -U 4325 ; WX 555 ; N uni10E5 ; G 1476 -U 4326 ; WX 814 ; N uni10E6 ; G 1477 -U 4327 ; WX 559 ; N uni10E7 ; G 1478 -U 4328 ; WX 543 ; N uni10E8 ; G 1479 -U 4329 ; WX 563 ; N uni10E9 ; G 1480 -U 4330 ; WX 622 ; N uni10EA ; G 1481 -U 4331 ; WX 563 ; N uni10EB ; G 1482 -U 4332 ; WX 543 ; N uni10EC ; G 1483 -U 4333 ; WX 566 ; N uni10ED ; G 1484 -U 4334 ; WX 563 ; N uni10EE ; G 1485 -U 4335 ; WX 530 ; N uni10EF ; G 1486 -U 4336 ; WX 554 ; N uni10F0 ; G 1487 -U 4337 ; WX 554 ; N uni10F1 ; G 1488 -U 4338 ; WX 553 ; N uni10F2 ; G 1489 -U 4339 ; WX 554 ; N uni10F3 ; G 1490 -U 4340 ; WX 553 ; N uni10F4 ; G 1491 -U 4341 ; WX 583 ; N uni10F5 ; G 1492 -U 4342 ; WX 853 ; N uni10F6 ; G 1493 -U 4343 ; WX 604 ; N uni10F7 ; G 1494 -U 4344 ; WX 559 ; N uni10F8 ; G 1495 -U 4345 ; WX 632 ; N uni10F9 ; G 1496 -U 4346 ; WX 554 ; N uni10FA ; G 1497 -U 4347 ; WX 448 ; N uni10FB ; G 1498 -U 4348 ; WX 324 ; N uni10FC ; G 1499 -U 5121 ; WX 774 ; N uni1401 ; G 1500 -U 5122 ; WX 774 ; N uni1402 ; G 1501 -U 5123 ; WX 774 ; N uni1403 ; G 1502 -U 5124 ; WX 774 ; N uni1404 ; G 1503 -U 5125 ; WX 905 ; N uni1405 ; G 1504 -U 5126 ; WX 905 ; N uni1406 ; G 1505 -U 5127 ; WX 905 ; N uni1407 ; G 1506 -U 5129 ; WX 905 ; N uni1409 ; G 1507 -U 5130 ; WX 905 ; N uni140A ; G 1508 -U 5131 ; WX 905 ; N uni140B ; G 1509 -U 5132 ; WX 1018 ; N uni140C ; G 1510 -U 5133 ; WX 1009 ; N uni140D ; G 1511 -U 5134 ; WX 1018 ; N uni140E ; G 1512 -U 5135 ; WX 1009 ; N uni140F ; G 1513 -U 5136 ; WX 1018 ; N uni1410 ; G 1514 -U 5137 ; WX 1009 ; N uni1411 ; G 1515 -U 5138 ; WX 1149 ; N uni1412 ; G 1516 -U 5139 ; WX 1140 ; N uni1413 ; G 1517 -U 5140 ; WX 1149 ; N uni1414 ; G 1518 -U 5141 ; WX 1140 ; N uni1415 ; G 1519 -U 5142 ; WX 905 ; N uni1416 ; G 1520 -U 5143 ; WX 1149 ; N uni1417 ; G 1521 -U 5144 ; WX 1142 ; N uni1418 ; G 1522 -U 5145 ; WX 1149 ; N uni1419 ; G 1523 -U 5146 ; WX 1142 ; N uni141A ; G 1524 -U 5147 ; WX 905 ; N uni141B ; G 1525 -U 5149 ; WX 310 ; N uni141D ; G 1526 -U 5150 ; WX 529 ; N uni141E ; G 1527 -U 5151 ; WX 425 ; N uni141F ; G 1528 -U 5152 ; WX 425 ; N uni1420 ; G 1529 -U 5153 ; WX 395 ; N uni1421 ; G 1530 -U 5154 ; WX 395 ; N uni1422 ; G 1531 -U 5155 ; WX 395 ; N uni1423 ; G 1532 -U 5156 ; WX 395 ; N uni1424 ; G 1533 -U 5157 ; WX 564 ; N uni1425 ; G 1534 -U 5158 ; WX 470 ; N uni1426 ; G 1535 -U 5159 ; WX 310 ; N uni1427 ; G 1536 -U 5160 ; WX 395 ; N uni1428 ; G 1537 -U 5161 ; WX 395 ; N uni1429 ; G 1538 -U 5162 ; WX 395 ; N uni142A ; G 1539 -U 5163 ; WX 1213 ; N uni142B ; G 1540 -U 5164 ; WX 986 ; N uni142C ; G 1541 -U 5165 ; WX 1216 ; N uni142D ; G 1542 -U 5166 ; WX 1297 ; N uni142E ; G 1543 -U 5167 ; WX 774 ; N uni142F ; G 1544 -U 5168 ; WX 774 ; N uni1430 ; G 1545 -U 5169 ; WX 774 ; N uni1431 ; G 1546 -U 5170 ; WX 774 ; N uni1432 ; G 1547 -U 5171 ; WX 886 ; N uni1433 ; G 1548 -U 5172 ; WX 886 ; N uni1434 ; G 1549 -U 5173 ; WX 886 ; N uni1435 ; G 1550 -U 5175 ; WX 886 ; N uni1437 ; G 1551 -U 5176 ; WX 886 ; N uni1438 ; G 1552 -U 5177 ; WX 886 ; N uni1439 ; G 1553 -U 5178 ; WX 1018 ; N uni143A ; G 1554 -U 5179 ; WX 1009 ; N uni143B ; G 1555 -U 5180 ; WX 1018 ; N uni143C ; G 1556 -U 5181 ; WX 1009 ; N uni143D ; G 1557 -U 5182 ; WX 1018 ; N uni143E ; G 1558 -U 5183 ; WX 1009 ; N uni143F ; G 1559 -U 5184 ; WX 1149 ; N uni1440 ; G 1560 -U 5185 ; WX 1140 ; N uni1441 ; G 1561 -U 5186 ; WX 1149 ; N uni1442 ; G 1562 -U 5187 ; WX 1140 ; N uni1443 ; G 1563 -U 5188 ; WX 1149 ; N uni1444 ; G 1564 -U 5189 ; WX 1142 ; N uni1445 ; G 1565 -U 5190 ; WX 1149 ; N uni1446 ; G 1566 -U 5191 ; WX 1142 ; N uni1447 ; G 1567 -U 5192 ; WX 886 ; N uni1448 ; G 1568 -U 5193 ; WX 576 ; N uni1449 ; G 1569 -U 5194 ; WX 229 ; N uni144A ; G 1570 -U 5196 ; WX 812 ; N uni144C ; G 1571 -U 5197 ; WX 812 ; N uni144D ; G 1572 -U 5198 ; WX 812 ; N uni144E ; G 1573 -U 5199 ; WX 812 ; N uni144F ; G 1574 -U 5200 ; WX 815 ; N uni1450 ; G 1575 -U 5201 ; WX 815 ; N uni1451 ; G 1576 -U 5202 ; WX 815 ; N uni1452 ; G 1577 -U 5204 ; WX 815 ; N uni1454 ; G 1578 -U 5205 ; WX 815 ; N uni1455 ; G 1579 -U 5206 ; WX 815 ; N uni1456 ; G 1580 -U 5207 ; WX 1056 ; N uni1457 ; G 1581 -U 5208 ; WX 1048 ; N uni1458 ; G 1582 -U 5209 ; WX 1056 ; N uni1459 ; G 1583 -U 5210 ; WX 1048 ; N uni145A ; G 1584 -U 5211 ; WX 1056 ; N uni145B ; G 1585 -U 5212 ; WX 1048 ; N uni145C ; G 1586 -U 5213 ; WX 1060 ; N uni145D ; G 1587 -U 5214 ; WX 1054 ; N uni145E ; G 1588 -U 5215 ; WX 1060 ; N uni145F ; G 1589 -U 5216 ; WX 1054 ; N uni1460 ; G 1590 -U 5217 ; WX 1060 ; N uni1461 ; G 1591 -U 5218 ; WX 1052 ; N uni1462 ; G 1592 -U 5219 ; WX 1060 ; N uni1463 ; G 1593 -U 5220 ; WX 1052 ; N uni1464 ; G 1594 -U 5221 ; WX 1060 ; N uni1465 ; G 1595 -U 5222 ; WX 483 ; N uni1466 ; G 1596 -U 5223 ; WX 1005 ; N uni1467 ; G 1597 -U 5224 ; WX 1005 ; N uni1468 ; G 1598 -U 5225 ; WX 1023 ; N uni1469 ; G 1599 -U 5226 ; WX 1017 ; N uni146A ; G 1600 -U 5227 ; WX 743 ; N uni146B ; G 1601 -U 5228 ; WX 743 ; N uni146C ; G 1602 -U 5229 ; WX 743 ; N uni146D ; G 1603 -U 5230 ; WX 743 ; N uni146E ; G 1604 -U 5231 ; WX 743 ; N uni146F ; G 1605 -U 5232 ; WX 743 ; N uni1470 ; G 1606 -U 5233 ; WX 743 ; N uni1471 ; G 1607 -U 5234 ; WX 743 ; N uni1472 ; G 1608 -U 5235 ; WX 743 ; N uni1473 ; G 1609 -U 5236 ; WX 1029 ; N uni1474 ; G 1610 -U 5237 ; WX 975 ; N uni1475 ; G 1611 -U 5238 ; WX 980 ; N uni1476 ; G 1612 -U 5239 ; WX 975 ; N uni1477 ; G 1613 -U 5240 ; WX 980 ; N uni1478 ; G 1614 -U 5241 ; WX 975 ; N uni1479 ; G 1615 -U 5242 ; WX 1029 ; N uni147A ; G 1616 -U 5243 ; WX 975 ; N uni147B ; G 1617 -U 5244 ; WX 1029 ; N uni147C ; G 1618 -U 5245 ; WX 975 ; N uni147D ; G 1619 -U 5246 ; WX 980 ; N uni147E ; G 1620 -U 5247 ; WX 975 ; N uni147F ; G 1621 -U 5248 ; WX 980 ; N uni1480 ; G 1622 -U 5249 ; WX 975 ; N uni1481 ; G 1623 -U 5250 ; WX 980 ; N uni1482 ; G 1624 -U 5251 ; WX 501 ; N uni1483 ; G 1625 -U 5252 ; WX 501 ; N uni1484 ; G 1626 -U 5253 ; WX 938 ; N uni1485 ; G 1627 -U 5254 ; WX 938 ; N uni1486 ; G 1628 -U 5255 ; WX 938 ; N uni1487 ; G 1629 -U 5256 ; WX 938 ; N uni1488 ; G 1630 -U 5257 ; WX 743 ; N uni1489 ; G 1631 -U 5258 ; WX 743 ; N uni148A ; G 1632 -U 5259 ; WX 743 ; N uni148B ; G 1633 -U 5260 ; WX 743 ; N uni148C ; G 1634 -U 5261 ; WX 743 ; N uni148D ; G 1635 -U 5262 ; WX 743 ; N uni148E ; G 1636 -U 5263 ; WX 743 ; N uni148F ; G 1637 -U 5264 ; WX 743 ; N uni1490 ; G 1638 -U 5265 ; WX 743 ; N uni1491 ; G 1639 -U 5266 ; WX 1029 ; N uni1492 ; G 1640 -U 5267 ; WX 975 ; N uni1493 ; G 1641 -U 5268 ; WX 1029 ; N uni1494 ; G 1642 -U 5269 ; WX 975 ; N uni1495 ; G 1643 -U 5270 ; WX 1029 ; N uni1496 ; G 1644 -U 5271 ; WX 975 ; N uni1497 ; G 1645 -U 5272 ; WX 1029 ; N uni1498 ; G 1646 -U 5273 ; WX 975 ; N uni1499 ; G 1647 -U 5274 ; WX 1029 ; N uni149A ; G 1648 -U 5275 ; WX 975 ; N uni149B ; G 1649 -U 5276 ; WX 1029 ; N uni149C ; G 1650 -U 5277 ; WX 975 ; N uni149D ; G 1651 -U 5278 ; WX 1029 ; N uni149E ; G 1652 -U 5279 ; WX 975 ; N uni149F ; G 1653 -U 5280 ; WX 1029 ; N uni14A0 ; G 1654 -U 5281 ; WX 501 ; N uni14A1 ; G 1655 -U 5282 ; WX 501 ; N uni14A2 ; G 1656 -U 5283 ; WX 626 ; N uni14A3 ; G 1657 -U 5284 ; WX 626 ; N uni14A4 ; G 1658 -U 5285 ; WX 626 ; N uni14A5 ; G 1659 -U 5286 ; WX 626 ; N uni14A6 ; G 1660 -U 5287 ; WX 626 ; N uni14A7 ; G 1661 -U 5288 ; WX 626 ; N uni14A8 ; G 1662 -U 5289 ; WX 626 ; N uni14A9 ; G 1663 -U 5290 ; WX 626 ; N uni14AA ; G 1664 -U 5291 ; WX 626 ; N uni14AB ; G 1665 -U 5292 ; WX 881 ; N uni14AC ; G 1666 -U 5293 ; WX 854 ; N uni14AD ; G 1667 -U 5294 ; WX 863 ; N uni14AE ; G 1668 -U 5295 ; WX 874 ; N uni14AF ; G 1669 -U 5296 ; WX 863 ; N uni14B0 ; G 1670 -U 5297 ; WX 874 ; N uni14B1 ; G 1671 -U 5298 ; WX 881 ; N uni14B2 ; G 1672 -U 5299 ; WX 874 ; N uni14B3 ; G 1673 -U 5300 ; WX 881 ; N uni14B4 ; G 1674 -U 5301 ; WX 874 ; N uni14B5 ; G 1675 -U 5302 ; WX 863 ; N uni14B6 ; G 1676 -U 5303 ; WX 874 ; N uni14B7 ; G 1677 -U 5304 ; WX 863 ; N uni14B8 ; G 1678 -U 5305 ; WX 874 ; N uni14B9 ; G 1679 -U 5306 ; WX 863 ; N uni14BA ; G 1680 -U 5307 ; WX 436 ; N uni14BB ; G 1681 -U 5308 ; WX 548 ; N uni14BC ; G 1682 -U 5309 ; WX 436 ; N uni14BD ; G 1683 -U 5312 ; WX 988 ; N uni14C0 ; G 1684 -U 5313 ; WX 988 ; N uni14C1 ; G 1685 -U 5314 ; WX 988 ; N uni14C2 ; G 1686 -U 5315 ; WX 988 ; N uni14C3 ; G 1687 -U 5316 ; WX 931 ; N uni14C4 ; G 1688 -U 5317 ; WX 931 ; N uni14C5 ; G 1689 -U 5318 ; WX 931 ; N uni14C6 ; G 1690 -U 5319 ; WX 931 ; N uni14C7 ; G 1691 -U 5320 ; WX 931 ; N uni14C8 ; G 1692 -U 5321 ; WX 1238 ; N uni14C9 ; G 1693 -U 5322 ; WX 1247 ; N uni14CA ; G 1694 -U 5323 ; WX 1200 ; N uni14CB ; G 1695 -U 5324 ; WX 1228 ; N uni14CC ; G 1696 -U 5325 ; WX 1200 ; N uni14CD ; G 1697 -U 5326 ; WX 1228 ; N uni14CE ; G 1698 -U 5327 ; WX 931 ; N uni14CF ; G 1699 -U 5328 ; WX 660 ; N uni14D0 ; G 1700 -U 5329 ; WX 497 ; N uni14D1 ; G 1701 -U 5330 ; WX 660 ; N uni14D2 ; G 1702 -U 5331 ; WX 988 ; N uni14D3 ; G 1703 -U 5332 ; WX 988 ; N uni14D4 ; G 1704 -U 5333 ; WX 988 ; N uni14D5 ; G 1705 -U 5334 ; WX 988 ; N uni14D6 ; G 1706 -U 5335 ; WX 931 ; N uni14D7 ; G 1707 -U 5336 ; WX 931 ; N uni14D8 ; G 1708 -U 5337 ; WX 931 ; N uni14D9 ; G 1709 -U 5338 ; WX 931 ; N uni14DA ; G 1710 -U 5339 ; WX 931 ; N uni14DB ; G 1711 -U 5340 ; WX 1231 ; N uni14DC ; G 1712 -U 5341 ; WX 1247 ; N uni14DD ; G 1713 -U 5342 ; WX 1283 ; N uni14DE ; G 1714 -U 5343 ; WX 1228 ; N uni14DF ; G 1715 -U 5344 ; WX 1283 ; N uni14E0 ; G 1716 -U 5345 ; WX 1228 ; N uni14E1 ; G 1717 -U 5346 ; WX 1228 ; N uni14E2 ; G 1718 -U 5347 ; WX 1214 ; N uni14E3 ; G 1719 -U 5348 ; WX 1228 ; N uni14E4 ; G 1720 -U 5349 ; WX 1214 ; N uni14E5 ; G 1721 -U 5350 ; WX 1283 ; N uni14E6 ; G 1722 -U 5351 ; WX 1228 ; N uni14E7 ; G 1723 -U 5352 ; WX 1283 ; N uni14E8 ; G 1724 -U 5353 ; WX 1228 ; N uni14E9 ; G 1725 -U 5354 ; WX 660 ; N uni14EA ; G 1726 -U 5356 ; WX 886 ; N uni14EC ; G 1727 -U 5357 ; WX 730 ; N uni14ED ; G 1728 -U 5358 ; WX 730 ; N uni14EE ; G 1729 -U 5359 ; WX 730 ; N uni14EF ; G 1730 -U 5360 ; WX 730 ; N uni14F0 ; G 1731 -U 5361 ; WX 730 ; N uni14F1 ; G 1732 -U 5362 ; WX 730 ; N uni14F2 ; G 1733 -U 5363 ; WX 730 ; N uni14F3 ; G 1734 -U 5364 ; WX 730 ; N uni14F4 ; G 1735 -U 5365 ; WX 730 ; N uni14F5 ; G 1736 -U 5366 ; WX 998 ; N uni14F6 ; G 1737 -U 5367 ; WX 958 ; N uni14F7 ; G 1738 -U 5368 ; WX 967 ; N uni14F8 ; G 1739 -U 5369 ; WX 989 ; N uni14F9 ; G 1740 -U 5370 ; WX 967 ; N uni14FA ; G 1741 -U 5371 ; WX 989 ; N uni14FB ; G 1742 -U 5372 ; WX 998 ; N uni14FC ; G 1743 -U 5373 ; WX 958 ; N uni14FD ; G 1744 -U 5374 ; WX 998 ; N uni14FE ; G 1745 -U 5375 ; WX 958 ; N uni14FF ; G 1746 -U 5376 ; WX 967 ; N uni1500 ; G 1747 -U 5377 ; WX 989 ; N uni1501 ; G 1748 -U 5378 ; WX 967 ; N uni1502 ; G 1749 -U 5379 ; WX 989 ; N uni1503 ; G 1750 -U 5380 ; WX 967 ; N uni1504 ; G 1751 -U 5381 ; WX 493 ; N uni1505 ; G 1752 -U 5382 ; WX 460 ; N uni1506 ; G 1753 -U 5383 ; WX 493 ; N uni1507 ; G 1754 -U 5392 ; WX 923 ; N uni1510 ; G 1755 -U 5393 ; WX 923 ; N uni1511 ; G 1756 -U 5394 ; WX 923 ; N uni1512 ; G 1757 -U 5395 ; WX 1136 ; N uni1513 ; G 1758 -U 5396 ; WX 1136 ; N uni1514 ; G 1759 -U 5397 ; WX 1136 ; N uni1515 ; G 1760 -U 5398 ; WX 1136 ; N uni1516 ; G 1761 -U 5399 ; WX 1209 ; N uni1517 ; G 1762 -U 5400 ; WX 1202 ; N uni1518 ; G 1763 -U 5401 ; WX 1209 ; N uni1519 ; G 1764 -U 5402 ; WX 1202 ; N uni151A ; G 1765 -U 5403 ; WX 1209 ; N uni151B ; G 1766 -U 5404 ; WX 1202 ; N uni151C ; G 1767 -U 5405 ; WX 1431 ; N uni151D ; G 1768 -U 5406 ; WX 1420 ; N uni151E ; G 1769 -U 5407 ; WX 1431 ; N uni151F ; G 1770 -U 5408 ; WX 1420 ; N uni1520 ; G 1771 -U 5409 ; WX 1431 ; N uni1521 ; G 1772 -U 5410 ; WX 1420 ; N uni1522 ; G 1773 -U 5411 ; WX 1431 ; N uni1523 ; G 1774 -U 5412 ; WX 1420 ; N uni1524 ; G 1775 -U 5413 ; WX 746 ; N uni1525 ; G 1776 -U 5414 ; WX 776 ; N uni1526 ; G 1777 -U 5415 ; WX 776 ; N uni1527 ; G 1778 -U 5416 ; WX 776 ; N uni1528 ; G 1779 -U 5417 ; WX 776 ; N uni1529 ; G 1780 -U 5418 ; WX 776 ; N uni152A ; G 1781 -U 5419 ; WX 776 ; N uni152B ; G 1782 -U 5420 ; WX 776 ; N uni152C ; G 1783 -U 5421 ; WX 776 ; N uni152D ; G 1784 -U 5422 ; WX 776 ; N uni152E ; G 1785 -U 5423 ; WX 1003 ; N uni152F ; G 1786 -U 5424 ; WX 1003 ; N uni1530 ; G 1787 -U 5425 ; WX 1013 ; N uni1531 ; G 1788 -U 5426 ; WX 996 ; N uni1532 ; G 1789 -U 5427 ; WX 1013 ; N uni1533 ; G 1790 -U 5428 ; WX 996 ; N uni1534 ; G 1791 -U 5429 ; WX 1003 ; N uni1535 ; G 1792 -U 5430 ; WX 1003 ; N uni1536 ; G 1793 -U 5431 ; WX 1003 ; N uni1537 ; G 1794 -U 5432 ; WX 1003 ; N uni1538 ; G 1795 -U 5433 ; WX 1013 ; N uni1539 ; G 1796 -U 5434 ; WX 996 ; N uni153A ; G 1797 -U 5435 ; WX 1013 ; N uni153B ; G 1798 -U 5436 ; WX 996 ; N uni153C ; G 1799 -U 5437 ; WX 1013 ; N uni153D ; G 1800 -U 5438 ; WX 495 ; N uni153E ; G 1801 -U 5440 ; WX 395 ; N uni1540 ; G 1802 -U 5441 ; WX 510 ; N uni1541 ; G 1803 -U 5442 ; WX 1033 ; N uni1542 ; G 1804 -U 5443 ; WX 1033 ; N uni1543 ; G 1805 -U 5444 ; WX 976 ; N uni1544 ; G 1806 -U 5445 ; WX 976 ; N uni1545 ; G 1807 -U 5446 ; WX 976 ; N uni1546 ; G 1808 -U 5447 ; WX 976 ; N uni1547 ; G 1809 -U 5448 ; WX 733 ; N uni1548 ; G 1810 -U 5449 ; WX 733 ; N uni1549 ; G 1811 -U 5450 ; WX 733 ; N uni154A ; G 1812 -U 5451 ; WX 733 ; N uni154B ; G 1813 -U 5452 ; WX 733 ; N uni154C ; G 1814 -U 5453 ; WX 733 ; N uni154D ; G 1815 -U 5454 ; WX 1003 ; N uni154E ; G 1816 -U 5455 ; WX 959 ; N uni154F ; G 1817 -U 5456 ; WX 495 ; N uni1550 ; G 1818 -U 5458 ; WX 886 ; N uni1552 ; G 1819 -U 5459 ; WX 774 ; N uni1553 ; G 1820 -U 5460 ; WX 774 ; N uni1554 ; G 1821 -U 5461 ; WX 774 ; N uni1555 ; G 1822 -U 5462 ; WX 774 ; N uni1556 ; G 1823 -U 5463 ; WX 928 ; N uni1557 ; G 1824 -U 5464 ; WX 928 ; N uni1558 ; G 1825 -U 5465 ; WX 928 ; N uni1559 ; G 1826 -U 5466 ; WX 928 ; N uni155A ; G 1827 -U 5467 ; WX 1172 ; N uni155B ; G 1828 -U 5468 ; WX 1142 ; N uni155C ; G 1829 -U 5469 ; WX 602 ; N uni155D ; G 1830 -U 5470 ; WX 812 ; N uni155E ; G 1831 -U 5471 ; WX 812 ; N uni155F ; G 1832 -U 5472 ; WX 812 ; N uni1560 ; G 1833 -U 5473 ; WX 812 ; N uni1561 ; G 1834 -U 5474 ; WX 812 ; N uni1562 ; G 1835 -U 5475 ; WX 812 ; N uni1563 ; G 1836 -U 5476 ; WX 815 ; N uni1564 ; G 1837 -U 5477 ; WX 815 ; N uni1565 ; G 1838 -U 5478 ; WX 815 ; N uni1566 ; G 1839 -U 5479 ; WX 815 ; N uni1567 ; G 1840 -U 5480 ; WX 1060 ; N uni1568 ; G 1841 -U 5481 ; WX 1052 ; N uni1569 ; G 1842 -U 5482 ; WX 548 ; N uni156A ; G 1843 -U 5492 ; WX 977 ; N uni1574 ; G 1844 -U 5493 ; WX 977 ; N uni1575 ; G 1845 -U 5494 ; WX 977 ; N uni1576 ; G 1846 -U 5495 ; WX 977 ; N uni1577 ; G 1847 -U 5496 ; WX 977 ; N uni1578 ; G 1848 -U 5497 ; WX 977 ; N uni1579 ; G 1849 -U 5498 ; WX 977 ; N uni157A ; G 1850 -U 5499 ; WX 618 ; N uni157B ; G 1851 -U 5500 ; WX 837 ; N uni157C ; G 1852 -U 5501 ; WX 510 ; N uni157D ; G 1853 -U 5502 ; WX 1238 ; N uni157E ; G 1854 -U 5503 ; WX 1238 ; N uni157F ; G 1855 -U 5504 ; WX 1238 ; N uni1580 ; G 1856 -U 5505 ; WX 1238 ; N uni1581 ; G 1857 -U 5506 ; WX 1238 ; N uni1582 ; G 1858 -U 5507 ; WX 1238 ; N uni1583 ; G 1859 -U 5508 ; WX 1238 ; N uni1584 ; G 1860 -U 5509 ; WX 989 ; N uni1585 ; G 1861 -U 5514 ; WX 977 ; N uni158A ; G 1862 -U 5515 ; WX 977 ; N uni158B ; G 1863 -U 5516 ; WX 977 ; N uni158C ; G 1864 -U 5517 ; WX 977 ; N uni158D ; G 1865 -U 5518 ; WX 1591 ; N uni158E ; G 1866 -U 5519 ; WX 1591 ; N uni158F ; G 1867 -U 5520 ; WX 1591 ; N uni1590 ; G 1868 -U 5521 ; WX 1295 ; N uni1591 ; G 1869 -U 5522 ; WX 1295 ; N uni1592 ; G 1870 -U 5523 ; WX 1591 ; N uni1593 ; G 1871 -U 5524 ; WX 1591 ; N uni1594 ; G 1872 -U 5525 ; WX 848 ; N uni1595 ; G 1873 -U 5526 ; WX 1273 ; N uni1596 ; G 1874 -U 5536 ; WX 988 ; N uni15A0 ; G 1875 -U 5537 ; WX 988 ; N uni15A1 ; G 1876 -U 5538 ; WX 931 ; N uni15A2 ; G 1877 -U 5539 ; WX 931 ; N uni15A3 ; G 1878 -U 5540 ; WX 931 ; N uni15A4 ; G 1879 -U 5541 ; WX 931 ; N uni15A5 ; G 1880 -U 5542 ; WX 660 ; N uni15A6 ; G 1881 -U 5543 ; WX 776 ; N uni15A7 ; G 1882 -U 5544 ; WX 776 ; N uni15A8 ; G 1883 -U 5545 ; WX 776 ; N uni15A9 ; G 1884 -U 5546 ; WX 776 ; N uni15AA ; G 1885 -U 5547 ; WX 776 ; N uni15AB ; G 1886 -U 5548 ; WX 776 ; N uni15AC ; G 1887 -U 5549 ; WX 776 ; N uni15AD ; G 1888 -U 5550 ; WX 495 ; N uni15AE ; G 1889 -U 5551 ; WX 743 ; N uni15AF ; G 1890 -U 5598 ; WX 830 ; N uni15DE ; G 1891 -U 5601 ; WX 830 ; N uni15E1 ; G 1892 -U 5702 ; WX 496 ; N uni1646 ; G 1893 -U 5703 ; WX 496 ; N uni1647 ; G 1894 -U 5742 ; WX 413 ; N uni166E ; G 1895 -U 5743 ; WX 1238 ; N uni166F ; G 1896 -U 5744 ; WX 1591 ; N uni1670 ; G 1897 -U 5745 ; WX 2016 ; N uni1671 ; G 1898 -U 5746 ; WX 2016 ; N uni1672 ; G 1899 -U 5747 ; WX 1720 ; N uni1673 ; G 1900 -U 5748 ; WX 1678 ; N uni1674 ; G 1901 -U 5749 ; WX 2016 ; N uni1675 ; G 1902 -U 5750 ; WX 2016 ; N uni1676 ; G 1903 -U 7424 ; WX 652 ; N uni1D00 ; G 1904 -U 7425 ; WX 833 ; N uni1D01 ; G 1905 -U 7426 ; WX 1048 ; N uni1D02 ; G 1906 -U 7427 ; WX 608 ; N uni1D03 ; G 1907 -U 7428 ; WX 593 ; N uni1D04 ; G 1908 -U 7429 ; WX 676 ; N uni1D05 ; G 1909 -U 7430 ; WX 676 ; N uni1D06 ; G 1910 -U 7431 ; WX 559 ; N uni1D07 ; G 1911 -U 7432 ; WX 557 ; N uni1D08 ; G 1912 -U 7433 ; WX 343 ; N uni1D09 ; G 1913 -U 7434 ; WX 494 ; N uni1D0A ; G 1914 -U 7435 ; WX 665 ; N uni1D0B ; G 1915 -U 7436 ; WX 539 ; N uni1D0C ; G 1916 -U 7437 ; WX 817 ; N uni1D0D ; G 1917 -U 7438 ; WX 701 ; N uni1D0E ; G 1918 -U 7439 ; WX 687 ; N uni1D0F ; G 1919 -U 7440 ; WX 593 ; N uni1D10 ; G 1920 -U 7441 ; WX 660 ; N uni1D11 ; G 1921 -U 7442 ; WX 660 ; N uni1D12 ; G 1922 -U 7443 ; WX 660 ; N uni1D13 ; G 1923 -U 7444 ; WX 1094 ; N uni1D14 ; G 1924 -U 7446 ; WX 687 ; N uni1D16 ; G 1925 -U 7447 ; WX 687 ; N uni1D17 ; G 1926 -U 7448 ; WX 556 ; N uni1D18 ; G 1927 -U 7449 ; WX 642 ; N uni1D19 ; G 1928 -U 7450 ; WX 642 ; N uni1D1A ; G 1929 -U 7451 ; WX 580 ; N uni1D1B ; G 1930 -U 7452 ; WX 634 ; N uni1D1C ; G 1931 -U 7453 ; WX 737 ; N uni1D1D ; G 1932 -U 7454 ; WX 948 ; N uni1D1E ; G 1933 -U 7455 ; WX 695 ; N uni1D1F ; G 1934 -U 7456 ; WX 652 ; N uni1D20 ; G 1935 -U 7457 ; WX 924 ; N uni1D21 ; G 1936 -U 7458 ; WX 582 ; N uni1D22 ; G 1937 -U 7459 ; WX 646 ; N uni1D23 ; G 1938 -U 7462 ; WX 539 ; N uni1D26 ; G 1939 -U 7463 ; WX 652 ; N uni1D27 ; G 1940 -U 7464 ; WX 691 ; N uni1D28 ; G 1941 -U 7465 ; WX 556 ; N uni1D29 ; G 1942 -U 7466 ; WX 781 ; N uni1D2A ; G 1943 -U 7467 ; WX 732 ; N uni1D2B ; G 1944 -U 7468 ; WX 487 ; N uni1D2C ; G 1945 -U 7469 ; WX 683 ; N uni1D2D ; G 1946 -U 7470 ; WX 480 ; N uni1D2E ; G 1947 -U 7472 ; WX 523 ; N uni1D30 ; G 1948 -U 7473 ; WX 430 ; N uni1D31 ; G 1949 -U 7474 ; WX 430 ; N uni1D32 ; G 1950 -U 7475 ; WX 517 ; N uni1D33 ; G 1951 -U 7476 ; WX 527 ; N uni1D34 ; G 1952 -U 7477 ; WX 234 ; N uni1D35 ; G 1953 -U 7478 ; WX 234 ; N uni1D36 ; G 1954 -U 7479 ; WX 488 ; N uni1D37 ; G 1955 -U 7480 ; WX 401 ; N uni1D38 ; G 1956 -U 7481 ; WX 626 ; N uni1D39 ; G 1957 -U 7482 ; WX 527 ; N uni1D3A ; G 1958 -U 7483 ; WX 527 ; N uni1D3B ; G 1959 -U 7484 ; WX 535 ; N uni1D3C ; G 1960 -U 7485 ; WX 509 ; N uni1D3D ; G 1961 -U 7486 ; WX 461 ; N uni1D3E ; G 1962 -U 7487 ; WX 485 ; N uni1D3F ; G 1963 -U 7488 ; WX 430 ; N uni1D40 ; G 1964 -U 7489 ; WX 511 ; N uni1D41 ; G 1965 -U 7490 ; WX 695 ; N uni1D42 ; G 1966 -U 7491 ; WX 458 ; N uni1D43 ; G 1967 -U 7492 ; WX 458 ; N uni1D44 ; G 1968 -U 7493 ; WX 479 ; N uni1D45 ; G 1969 -U 7494 ; WX 712 ; N uni1D46 ; G 1970 -U 7495 ; WX 479 ; N uni1D47 ; G 1971 -U 7496 ; WX 479 ; N uni1D48 ; G 1972 -U 7497 ; WX 479 ; N uni1D49 ; G 1973 -U 7498 ; WX 479 ; N uni1D4A ; G 1974 -U 7499 ; WX 386 ; N uni1D4B ; G 1975 -U 7500 ; WX 386 ; N uni1D4C ; G 1976 -U 7501 ; WX 479 ; N uni1D4D ; G 1977 -U 7502 ; WX 219 ; N uni1D4E ; G 1978 -U 7503 ; WX 487 ; N uni1D4F ; G 1979 -U 7504 ; WX 664 ; N uni1D50 ; G 1980 -U 7505 ; WX 456 ; N uni1D51 ; G 1981 -U 7506 ; WX 488 ; N uni1D52 ; G 1982 -U 7507 ; WX 414 ; N uni1D53 ; G 1983 -U 7508 ; WX 488 ; N uni1D54 ; G 1984 -U 7509 ; WX 488 ; N uni1D55 ; G 1985 -U 7510 ; WX 479 ; N uni1D56 ; G 1986 -U 7511 ; WX 388 ; N uni1D57 ; G 1987 -U 7512 ; WX 456 ; N uni1D58 ; G 1988 -U 7513 ; WX 462 ; N uni1D59 ; G 1989 -U 7514 ; WX 664 ; N uni1D5A ; G 1990 -U 7515 ; WX 501 ; N uni1D5B ; G 1991 -U 7517 ; WX 451 ; N uni1D5D ; G 1992 -U 7518 ; WX 429 ; N uni1D5E ; G 1993 -U 7519 ; WX 433 ; N uni1D5F ; G 1994 -U 7520 ; WX 493 ; N uni1D60 ; G 1995 -U 7521 ; WX 406 ; N uni1D61 ; G 1996 -U 7522 ; WX 219 ; N uni1D62 ; G 1997 -U 7523 ; WX 315 ; N uni1D63 ; G 1998 -U 7524 ; WX 456 ; N uni1D64 ; G 1999 -U 7525 ; WX 501 ; N uni1D65 ; G 2000 -U 7526 ; WX 451 ; N uni1D66 ; G 2001 -U 7527 ; WX 429 ; N uni1D67 ; G 2002 -U 7528 ; WX 451 ; N uni1D68 ; G 2003 -U 7529 ; WX 493 ; N uni1D69 ; G 2004 -U 7530 ; WX 406 ; N uni1D6A ; G 2005 -U 7543 ; WX 716 ; N uni1D77 ; G 2006 -U 7544 ; WX 527 ; N uni1D78 ; G 2007 -U 7547 ; WX 545 ; N uni1D7B ; G 2008 -U 7549 ; WX 747 ; N uni1D7D ; G 2009 -U 7557 ; WX 514 ; N uni1D85 ; G 2010 -U 7579 ; WX 479 ; N uni1D9B ; G 2011 -U 7580 ; WX 414 ; N uni1D9C ; G 2012 -U 7581 ; WX 414 ; N uni1D9D ; G 2013 -U 7582 ; WX 488 ; N uni1D9E ; G 2014 -U 7583 ; WX 386 ; N uni1D9F ; G 2015 -U 7584 ; WX 377 ; N uni1DA0 ; G 2016 -U 7585 ; WX 348 ; N uni1DA1 ; G 2017 -U 7586 ; WX 479 ; N uni1DA2 ; G 2018 -U 7587 ; WX 456 ; N uni1DA3 ; G 2019 -U 7588 ; WX 347 ; N uni1DA4 ; G 2020 -U 7589 ; WX 281 ; N uni1DA5 ; G 2021 -U 7590 ; WX 347 ; N uni1DA6 ; G 2022 -U 7591 ; WX 347 ; N uni1DA7 ; G 2023 -U 7592 ; WX 431 ; N uni1DA8 ; G 2024 -U 7593 ; WX 326 ; N uni1DA9 ; G 2025 -U 7594 ; WX 330 ; N uni1DAA ; G 2026 -U 7595 ; WX 370 ; N uni1DAB ; G 2027 -U 7596 ; WX 664 ; N uni1DAC ; G 2028 -U 7597 ; WX 664 ; N uni1DAD ; G 2029 -U 7598 ; WX 562 ; N uni1DAE ; G 2030 -U 7599 ; WX 562 ; N uni1DAF ; G 2031 -U 7600 ; WX 448 ; N uni1DB0 ; G 2032 -U 7601 ; WX 488 ; N uni1DB1 ; G 2033 -U 7602 ; WX 542 ; N uni1DB2 ; G 2034 -U 7603 ; WX 422 ; N uni1DB3 ; G 2035 -U 7604 ; WX 396 ; N uni1DB4 ; G 2036 -U 7605 ; WX 388 ; N uni1DB5 ; G 2037 -U 7606 ; WX 583 ; N uni1DB6 ; G 2038 -U 7607 ; WX 494 ; N uni1DB7 ; G 2039 -U 7608 ; WX 399 ; N uni1DB8 ; G 2040 -U 7609 ; WX 451 ; N uni1DB9 ; G 2041 -U 7610 ; WX 501 ; N uni1DBA ; G 2042 -U 7611 ; WX 417 ; N uni1DBB ; G 2043 -U 7612 ; WX 523 ; N uni1DBC ; G 2044 -U 7613 ; WX 470 ; N uni1DBD ; G 2045 -U 7614 ; WX 455 ; N uni1DBE ; G 2046 -U 7615 ; WX 425 ; N uni1DBF ; G 2047 -U 7620 ; WX 0 ; N uni1DC4 ; G 2048 -U 7621 ; WX 0 ; N uni1DC5 ; G 2049 -U 7622 ; WX 0 ; N uni1DC6 ; G 2050 -U 7623 ; WX 0 ; N uni1DC7 ; G 2051 -U 7624 ; WX 0 ; N uni1DC8 ; G 2052 -U 7625 ; WX 0 ; N uni1DC9 ; G 2053 -U 7680 ; WX 774 ; N uni1E00 ; G 2054 -U 7681 ; WX 675 ; N uni1E01 ; G 2055 -U 7682 ; WX 762 ; N uni1E02 ; G 2056 -U 7683 ; WX 716 ; N uni1E03 ; G 2057 -U 7684 ; WX 762 ; N uni1E04 ; G 2058 -U 7685 ; WX 716 ; N uni1E05 ; G 2059 -U 7686 ; WX 762 ; N uni1E06 ; G 2060 -U 7687 ; WX 716 ; N uni1E07 ; G 2061 -U 7688 ; WX 734 ; N uni1E08 ; G 2062 -U 7689 ; WX 593 ; N uni1E09 ; G 2063 -U 7690 ; WX 830 ; N uni1E0A ; G 2064 -U 7691 ; WX 716 ; N uni1E0B ; G 2065 -U 7692 ; WX 830 ; N uni1E0C ; G 2066 -U 7693 ; WX 716 ; N uni1E0D ; G 2067 -U 7694 ; WX 830 ; N uni1E0E ; G 2068 -U 7695 ; WX 716 ; N uni1E0F ; G 2069 -U 7696 ; WX 830 ; N uni1E10 ; G 2070 -U 7697 ; WX 716 ; N uni1E11 ; G 2071 -U 7698 ; WX 830 ; N uni1E12 ; G 2072 -U 7699 ; WX 716 ; N uni1E13 ; G 2073 -U 7700 ; WX 683 ; N uni1E14 ; G 2074 -U 7701 ; WX 678 ; N uni1E15 ; G 2075 -U 7702 ; WX 683 ; N uni1E16 ; G 2076 -U 7703 ; WX 678 ; N uni1E17 ; G 2077 -U 7704 ; WX 683 ; N uni1E18 ; G 2078 -U 7705 ; WX 678 ; N uni1E19 ; G 2079 -U 7706 ; WX 683 ; N uni1E1A ; G 2080 -U 7707 ; WX 678 ; N uni1E1B ; G 2081 -U 7708 ; WX 683 ; N uni1E1C ; G 2082 -U 7709 ; WX 678 ; N uni1E1D ; G 2083 -U 7710 ; WX 683 ; N uni1E1E ; G 2084 -U 7711 ; WX 435 ; N uni1E1F ; G 2085 -U 7712 ; WX 821 ; N uni1E20 ; G 2086 -U 7713 ; WX 716 ; N uni1E21 ; G 2087 -U 7714 ; WX 837 ; N uni1E22 ; G 2088 -U 7715 ; WX 712 ; N uni1E23 ; G 2089 -U 7716 ; WX 837 ; N uni1E24 ; G 2090 -U 7717 ; WX 712 ; N uni1E25 ; G 2091 -U 7718 ; WX 837 ; N uni1E26 ; G 2092 -U 7719 ; WX 712 ; N uni1E27 ; G 2093 -U 7720 ; WX 837 ; N uni1E28 ; G 2094 -U 7721 ; WX 712 ; N uni1E29 ; G 2095 -U 7722 ; WX 837 ; N uni1E2A ; G 2096 -U 7723 ; WX 712 ; N uni1E2B ; G 2097 -U 7724 ; WX 372 ; N uni1E2C ; G 2098 -U 7725 ; WX 343 ; N uni1E2D ; G 2099 -U 7726 ; WX 372 ; N uni1E2E ; G 2100 -U 7727 ; WX 343 ; N uni1E2F ; G 2101 -U 7728 ; WX 775 ; N uni1E30 ; G 2102 -U 7729 ; WX 665 ; N uni1E31 ; G 2103 -U 7730 ; WX 775 ; N uni1E32 ; G 2104 -U 7731 ; WX 665 ; N uni1E33 ; G 2105 -U 7732 ; WX 775 ; N uni1E34 ; G 2106 -U 7733 ; WX 665 ; N uni1E35 ; G 2107 -U 7734 ; WX 637 ; N uni1E36 ; G 2108 -U 7735 ; WX 343 ; N uni1E37 ; G 2109 -U 7736 ; WX 637 ; N uni1E38 ; G 2110 -U 7737 ; WX 343 ; N uni1E39 ; G 2111 -U 7738 ; WX 637 ; N uni1E3A ; G 2112 -U 7739 ; WX 343 ; N uni1E3B ; G 2113 -U 7740 ; WX 637 ; N uni1E3C ; G 2114 -U 7741 ; WX 343 ; N uni1E3D ; G 2115 -U 7742 ; WX 995 ; N uni1E3E ; G 2116 -U 7743 ; WX 1042 ; N uni1E3F ; G 2117 -U 7744 ; WX 995 ; N uni1E40 ; G 2118 -U 7745 ; WX 1042 ; N uni1E41 ; G 2119 -U 7746 ; WX 995 ; N uni1E42 ; G 2120 -U 7747 ; WX 1042 ; N uni1E43 ; G 2121 -U 7748 ; WX 837 ; N uni1E44 ; G 2122 -U 7749 ; WX 712 ; N uni1E45 ; G 2123 -U 7750 ; WX 837 ; N uni1E46 ; G 2124 -U 7751 ; WX 712 ; N uni1E47 ; G 2125 -U 7752 ; WX 837 ; N uni1E48 ; G 2126 -U 7753 ; WX 712 ; N uni1E49 ; G 2127 -U 7754 ; WX 837 ; N uni1E4A ; G 2128 -U 7755 ; WX 712 ; N uni1E4B ; G 2129 -U 7756 ; WX 850 ; N uni1E4C ; G 2130 -U 7757 ; WX 687 ; N uni1E4D ; G 2131 -U 7758 ; WX 850 ; N uni1E4E ; G 2132 -U 7759 ; WX 687 ; N uni1E4F ; G 2133 -U 7760 ; WX 850 ; N uni1E50 ; G 2134 -U 7761 ; WX 687 ; N uni1E51 ; G 2135 -U 7762 ; WX 850 ; N uni1E52 ; G 2136 -U 7763 ; WX 687 ; N uni1E53 ; G 2137 -U 7764 ; WX 733 ; N uni1E54 ; G 2138 -U 7765 ; WX 716 ; N uni1E55 ; G 2139 -U 7766 ; WX 733 ; N uni1E56 ; G 2140 -U 7767 ; WX 716 ; N uni1E57 ; G 2141 -U 7768 ; WX 770 ; N uni1E58 ; G 2142 -U 7769 ; WX 493 ; N uni1E59 ; G 2143 -U 7770 ; WX 770 ; N uni1E5A ; G 2144 -U 7771 ; WX 493 ; N uni1E5B ; G 2145 -U 7772 ; WX 770 ; N uni1E5C ; G 2146 -U 7773 ; WX 493 ; N uni1E5D ; G 2147 -U 7774 ; WX 770 ; N uni1E5E ; G 2148 -U 7775 ; WX 493 ; N uni1E5F ; G 2149 -U 7776 ; WX 720 ; N uni1E60 ; G 2150 -U 7777 ; WX 595 ; N uni1E61 ; G 2151 -U 7778 ; WX 720 ; N uni1E62 ; G 2152 -U 7779 ; WX 595 ; N uni1E63 ; G 2153 -U 7780 ; WX 720 ; N uni1E64 ; G 2154 -U 7781 ; WX 595 ; N uni1E65 ; G 2155 -U 7782 ; WX 720 ; N uni1E66 ; G 2156 -U 7783 ; WX 595 ; N uni1E67 ; G 2157 -U 7784 ; WX 720 ; N uni1E68 ; G 2158 -U 7785 ; WX 595 ; N uni1E69 ; G 2159 -U 7786 ; WX 682 ; N uni1E6A ; G 2160 -U 7787 ; WX 478 ; N uni1E6B ; G 2161 -U 7788 ; WX 682 ; N uni1E6C ; G 2162 -U 7789 ; WX 478 ; N uni1E6D ; G 2163 -U 7790 ; WX 682 ; N uni1E6E ; G 2164 -U 7791 ; WX 478 ; N uni1E6F ; G 2165 -U 7792 ; WX 682 ; N uni1E70 ; G 2166 -U 7793 ; WX 478 ; N uni1E71 ; G 2167 -U 7794 ; WX 812 ; N uni1E72 ; G 2168 -U 7795 ; WX 712 ; N uni1E73 ; G 2169 -U 7796 ; WX 812 ; N uni1E74 ; G 2170 -U 7797 ; WX 712 ; N uni1E75 ; G 2171 -U 7798 ; WX 812 ; N uni1E76 ; G 2172 -U 7799 ; WX 712 ; N uni1E77 ; G 2173 -U 7800 ; WX 812 ; N uni1E78 ; G 2174 -U 7801 ; WX 712 ; N uni1E79 ; G 2175 -U 7802 ; WX 812 ; N uni1E7A ; G 2176 -U 7803 ; WX 712 ; N uni1E7B ; G 2177 -U 7804 ; WX 774 ; N uni1E7C ; G 2178 -U 7805 ; WX 652 ; N uni1E7D ; G 2179 -U 7806 ; WX 774 ; N uni1E7E ; G 2180 -U 7807 ; WX 652 ; N uni1E7F ; G 2181 -U 7808 ; WX 1103 ; N Wgrave ; G 2182 -U 7809 ; WX 924 ; N wgrave ; G 2183 -U 7810 ; WX 1103 ; N Wacute ; G 2184 -U 7811 ; WX 924 ; N wacute ; G 2185 -U 7812 ; WX 1103 ; N Wdieresis ; G 2186 -U 7813 ; WX 924 ; N wdieresis ; G 2187 -U 7814 ; WX 1103 ; N uni1E86 ; G 2188 -U 7815 ; WX 924 ; N uni1E87 ; G 2189 -U 7816 ; WX 1103 ; N uni1E88 ; G 2190 -U 7817 ; WX 924 ; N uni1E89 ; G 2191 -U 7818 ; WX 771 ; N uni1E8A ; G 2192 -U 7819 ; WX 645 ; N uni1E8B ; G 2193 -U 7820 ; WX 771 ; N uni1E8C ; G 2194 -U 7821 ; WX 645 ; N uni1E8D ; G 2195 -U 7822 ; WX 724 ; N uni1E8E ; G 2196 -U 7823 ; WX 652 ; N uni1E8F ; G 2197 -U 7824 ; WX 725 ; N uni1E90 ; G 2198 -U 7825 ; WX 582 ; N uni1E91 ; G 2199 -U 7826 ; WX 725 ; N uni1E92 ; G 2200 -U 7827 ; WX 582 ; N uni1E93 ; G 2201 -U 7828 ; WX 725 ; N uni1E94 ; G 2202 -U 7829 ; WX 582 ; N uni1E95 ; G 2203 -U 7830 ; WX 712 ; N uni1E96 ; G 2204 -U 7831 ; WX 478 ; N uni1E97 ; G 2205 -U 7832 ; WX 924 ; N uni1E98 ; G 2206 -U 7833 ; WX 652 ; N uni1E99 ; G 2207 -U 7834 ; WX 675 ; N uni1E9A ; G 2208 -U 7835 ; WX 435 ; N uni1E9B ; G 2209 -U 7836 ; WX 435 ; N uni1E9C ; G 2210 -U 7837 ; WX 435 ; N uni1E9D ; G 2211 -U 7838 ; WX 896 ; N uni1E9E ; G 2212 -U 7839 ; WX 687 ; N uni1E9F ; G 2213 -U 7840 ; WX 774 ; N uni1EA0 ; G 2214 -U 7841 ; WX 675 ; N uni1EA1 ; G 2215 -U 7842 ; WX 774 ; N uni1EA2 ; G 2216 -U 7843 ; WX 675 ; N uni1EA3 ; G 2217 -U 7844 ; WX 774 ; N uni1EA4 ; G 2218 -U 7845 ; WX 675 ; N uni1EA5 ; G 2219 -U 7846 ; WX 774 ; N uni1EA6 ; G 2220 -U 7847 ; WX 675 ; N uni1EA7 ; G 2221 -U 7848 ; WX 774 ; N uni1EA8 ; G 2222 -U 7849 ; WX 675 ; N uni1EA9 ; G 2223 -U 7850 ; WX 774 ; N uni1EAA ; G 2224 -U 7851 ; WX 675 ; N uni1EAB ; G 2225 -U 7852 ; WX 774 ; N uni1EAC ; G 2226 -U 7853 ; WX 675 ; N uni1EAD ; G 2227 -U 7854 ; WX 774 ; N uni1EAE ; G 2228 -U 7855 ; WX 675 ; N uni1EAF ; G 2229 -U 7856 ; WX 774 ; N uni1EB0 ; G 2230 -U 7857 ; WX 675 ; N uni1EB1 ; G 2231 -U 7858 ; WX 774 ; N uni1EB2 ; G 2232 -U 7859 ; WX 675 ; N uni1EB3 ; G 2233 -U 7860 ; WX 774 ; N uni1EB4 ; G 2234 -U 7861 ; WX 675 ; N uni1EB5 ; G 2235 -U 7862 ; WX 774 ; N uni1EB6 ; G 2236 -U 7863 ; WX 675 ; N uni1EB7 ; G 2237 -U 7864 ; WX 683 ; N uni1EB8 ; G 2238 -U 7865 ; WX 678 ; N uni1EB9 ; G 2239 -U 7866 ; WX 683 ; N uni1EBA ; G 2240 -U 7867 ; WX 678 ; N uni1EBB ; G 2241 -U 7868 ; WX 683 ; N uni1EBC ; G 2242 -U 7869 ; WX 678 ; N uni1EBD ; G 2243 -U 7870 ; WX 683 ; N uni1EBE ; G 2244 -U 7871 ; WX 678 ; N uni1EBF ; G 2245 -U 7872 ; WX 683 ; N uni1EC0 ; G 2246 -U 7873 ; WX 678 ; N uni1EC1 ; G 2247 -U 7874 ; WX 683 ; N uni1EC2 ; G 2248 -U 7875 ; WX 678 ; N uni1EC3 ; G 2249 -U 7876 ; WX 683 ; N uni1EC4 ; G 2250 -U 7877 ; WX 678 ; N uni1EC5 ; G 2251 -U 7878 ; WX 683 ; N uni1EC6 ; G 2252 -U 7879 ; WX 678 ; N uni1EC7 ; G 2253 -U 7880 ; WX 372 ; N uni1EC8 ; G 2254 -U 7881 ; WX 343 ; N uni1EC9 ; G 2255 -U 7882 ; WX 372 ; N uni1ECA ; G 2256 -U 7883 ; WX 343 ; N uni1ECB ; G 2257 -U 7884 ; WX 850 ; N uni1ECC ; G 2258 -U 7885 ; WX 687 ; N uni1ECD ; G 2259 -U 7886 ; WX 850 ; N uni1ECE ; G 2260 -U 7887 ; WX 687 ; N uni1ECF ; G 2261 -U 7888 ; WX 850 ; N uni1ED0 ; G 2262 -U 7889 ; WX 687 ; N uni1ED1 ; G 2263 -U 7890 ; WX 850 ; N uni1ED2 ; G 2264 -U 7891 ; WX 687 ; N uni1ED3 ; G 2265 -U 7892 ; WX 850 ; N uni1ED4 ; G 2266 -U 7893 ; WX 687 ; N uni1ED5 ; G 2267 -U 7894 ; WX 850 ; N uni1ED6 ; G 2268 -U 7895 ; WX 687 ; N uni1ED7 ; G 2269 -U 7896 ; WX 850 ; N uni1ED8 ; G 2270 -U 7897 ; WX 687 ; N uni1ED9 ; G 2271 -U 7898 ; WX 850 ; N uni1EDA ; G 2272 -U 7899 ; WX 687 ; N uni1EDB ; G 2273 -U 7900 ; WX 850 ; N uni1EDC ; G 2274 -U 7901 ; WX 687 ; N uni1EDD ; G 2275 -U 7902 ; WX 850 ; N uni1EDE ; G 2276 -U 7903 ; WX 687 ; N uni1EDF ; G 2277 -U 7904 ; WX 850 ; N uni1EE0 ; G 2278 -U 7905 ; WX 687 ; N uni1EE1 ; G 2279 -U 7906 ; WX 850 ; N uni1EE2 ; G 2280 -U 7907 ; WX 687 ; N uni1EE3 ; G 2281 -U 7908 ; WX 812 ; N uni1EE4 ; G 2282 -U 7909 ; WX 712 ; N uni1EE5 ; G 2283 -U 7910 ; WX 812 ; N uni1EE6 ; G 2284 -U 7911 ; WX 712 ; N uni1EE7 ; G 2285 -U 7912 ; WX 812 ; N uni1EE8 ; G 2286 -U 7913 ; WX 712 ; N uni1EE9 ; G 2287 -U 7914 ; WX 812 ; N uni1EEA ; G 2288 -U 7915 ; WX 712 ; N uni1EEB ; G 2289 -U 7916 ; WX 812 ; N uni1EEC ; G 2290 -U 7917 ; WX 712 ; N uni1EED ; G 2291 -U 7918 ; WX 812 ; N uni1EEE ; G 2292 -U 7919 ; WX 712 ; N uni1EEF ; G 2293 -U 7920 ; WX 812 ; N uni1EF0 ; G 2294 -U 7921 ; WX 712 ; N uni1EF1 ; G 2295 -U 7922 ; WX 724 ; N Ygrave ; G 2296 -U 7923 ; WX 652 ; N ygrave ; G 2297 -U 7924 ; WX 724 ; N uni1EF4 ; G 2298 -U 7925 ; WX 652 ; N uni1EF5 ; G 2299 -U 7926 ; WX 724 ; N uni1EF6 ; G 2300 -U 7927 ; WX 652 ; N uni1EF7 ; G 2301 -U 7928 ; WX 724 ; N uni1EF8 ; G 2302 -U 7929 ; WX 652 ; N uni1EF9 ; G 2303 -U 7930 ; WX 953 ; N uni1EFA ; G 2304 -U 7931 ; WX 644 ; N uni1EFB ; G 2305 -U 7936 ; WX 687 ; N uni1F00 ; G 2306 -U 7937 ; WX 687 ; N uni1F01 ; G 2307 -U 7938 ; WX 687 ; N uni1F02 ; G 2308 -U 7939 ; WX 687 ; N uni1F03 ; G 2309 -U 7940 ; WX 687 ; N uni1F04 ; G 2310 -U 7941 ; WX 687 ; N uni1F05 ; G 2311 -U 7942 ; WX 687 ; N uni1F06 ; G 2312 -U 7943 ; WX 687 ; N uni1F07 ; G 2313 -U 7944 ; WX 774 ; N uni1F08 ; G 2314 -U 7945 ; WX 774 ; N uni1F09 ; G 2315 -U 7946 ; WX 1041 ; N uni1F0A ; G 2316 -U 7947 ; WX 1043 ; N uni1F0B ; G 2317 -U 7948 ; WX 935 ; N uni1F0C ; G 2318 -U 7949 ; WX 963 ; N uni1F0D ; G 2319 -U 7950 ; WX 835 ; N uni1F0E ; G 2320 -U 7951 ; WX 859 ; N uni1F0F ; G 2321 -U 7952 ; WX 557 ; N uni1F10 ; G 2322 -U 7953 ; WX 557 ; N uni1F11 ; G 2323 -U 7954 ; WX 557 ; N uni1F12 ; G 2324 -U 7955 ; WX 557 ; N uni1F13 ; G 2325 -U 7956 ; WX 557 ; N uni1F14 ; G 2326 -U 7957 ; WX 557 ; N uni1F15 ; G 2327 -U 7960 ; WX 792 ; N uni1F18 ; G 2328 -U 7961 ; WX 794 ; N uni1F19 ; G 2329 -U 7962 ; WX 1100 ; N uni1F1A ; G 2330 -U 7963 ; WX 1096 ; N uni1F1B ; G 2331 -U 7964 ; WX 1023 ; N uni1F1C ; G 2332 -U 7965 ; WX 1052 ; N uni1F1D ; G 2333 -U 7968 ; WX 712 ; N uni1F20 ; G 2334 -U 7969 ; WX 712 ; N uni1F21 ; G 2335 -U 7970 ; WX 712 ; N uni1F22 ; G 2336 -U 7971 ; WX 712 ; N uni1F23 ; G 2337 -U 7972 ; WX 712 ; N uni1F24 ; G 2338 -U 7973 ; WX 712 ; N uni1F25 ; G 2339 -U 7974 ; WX 712 ; N uni1F26 ; G 2340 -U 7975 ; WX 712 ; N uni1F27 ; G 2341 -U 7976 ; WX 945 ; N uni1F28 ; G 2342 -U 7977 ; WX 951 ; N uni1F29 ; G 2343 -U 7978 ; WX 1250 ; N uni1F2A ; G 2344 -U 7979 ; WX 1250 ; N uni1F2B ; G 2345 -U 7980 ; WX 1180 ; N uni1F2C ; G 2346 -U 7981 ; WX 1206 ; N uni1F2D ; G 2347 -U 7982 ; WX 1054 ; N uni1F2E ; G 2348 -U 7983 ; WX 1063 ; N uni1F2F ; G 2349 -U 7984 ; WX 390 ; N uni1F30 ; G 2350 -U 7985 ; WX 390 ; N uni1F31 ; G 2351 -U 7986 ; WX 390 ; N uni1F32 ; G 2352 -U 7987 ; WX 390 ; N uni1F33 ; G 2353 -U 7988 ; WX 390 ; N uni1F34 ; G 2354 -U 7989 ; WX 390 ; N uni1F35 ; G 2355 -U 7990 ; WX 390 ; N uni1F36 ; G 2356 -U 7991 ; WX 390 ; N uni1F37 ; G 2357 -U 7992 ; WX 483 ; N uni1F38 ; G 2358 -U 7993 ; WX 489 ; N uni1F39 ; G 2359 -U 7994 ; WX 777 ; N uni1F3A ; G 2360 -U 7995 ; WX 785 ; N uni1F3B ; G 2361 -U 7996 ; WX 712 ; N uni1F3C ; G 2362 -U 7997 ; WX 738 ; N uni1F3D ; G 2363 -U 7998 ; WX 604 ; N uni1F3E ; G 2364 -U 7999 ; WX 604 ; N uni1F3F ; G 2365 -U 8000 ; WX 687 ; N uni1F40 ; G 2366 -U 8001 ; WX 687 ; N uni1F41 ; G 2367 -U 8002 ; WX 687 ; N uni1F42 ; G 2368 -U 8003 ; WX 687 ; N uni1F43 ; G 2369 -U 8004 ; WX 687 ; N uni1F44 ; G 2370 -U 8005 ; WX 687 ; N uni1F45 ; G 2371 -U 8008 ; WX 892 ; N uni1F48 ; G 2372 -U 8009 ; WX 933 ; N uni1F49 ; G 2373 -U 8010 ; WX 1221 ; N uni1F4A ; G 2374 -U 8011 ; WX 1224 ; N uni1F4B ; G 2375 -U 8012 ; WX 1053 ; N uni1F4C ; G 2376 -U 8013 ; WX 1082 ; N uni1F4D ; G 2377 -U 8016 ; WX 675 ; N uni1F50 ; G 2378 -U 8017 ; WX 675 ; N uni1F51 ; G 2379 -U 8018 ; WX 675 ; N uni1F52 ; G 2380 -U 8019 ; WX 675 ; N uni1F53 ; G 2381 -U 8020 ; WX 675 ; N uni1F54 ; G 2382 -U 8021 ; WX 675 ; N uni1F55 ; G 2383 -U 8022 ; WX 675 ; N uni1F56 ; G 2384 -U 8023 ; WX 675 ; N uni1F57 ; G 2385 -U 8025 ; WX 930 ; N uni1F59 ; G 2386 -U 8027 ; WX 1184 ; N uni1F5B ; G 2387 -U 8029 ; WX 1199 ; N uni1F5D ; G 2388 -U 8031 ; WX 1049 ; N uni1F5F ; G 2389 -U 8032 ; WX 869 ; N uni1F60 ; G 2390 -U 8033 ; WX 869 ; N uni1F61 ; G 2391 -U 8034 ; WX 869 ; N uni1F62 ; G 2392 -U 8035 ; WX 869 ; N uni1F63 ; G 2393 -U 8036 ; WX 869 ; N uni1F64 ; G 2394 -U 8037 ; WX 869 ; N uni1F65 ; G 2395 -U 8038 ; WX 869 ; N uni1F66 ; G 2396 -U 8039 ; WX 869 ; N uni1F67 ; G 2397 -U 8040 ; WX 909 ; N uni1F68 ; G 2398 -U 8041 ; WX 958 ; N uni1F69 ; G 2399 -U 8042 ; WX 1246 ; N uni1F6A ; G 2400 -U 8043 ; WX 1251 ; N uni1F6B ; G 2401 -U 8044 ; WX 1076 ; N uni1F6C ; G 2402 -U 8045 ; WX 1105 ; N uni1F6D ; G 2403 -U 8046 ; WX 1028 ; N uni1F6E ; G 2404 -U 8047 ; WX 1076 ; N uni1F6F ; G 2405 -U 8048 ; WX 687 ; N uni1F70 ; G 2406 -U 8049 ; WX 687 ; N uni1F71 ; G 2407 -U 8050 ; WX 557 ; N uni1F72 ; G 2408 -U 8051 ; WX 557 ; N uni1F73 ; G 2409 -U 8052 ; WX 712 ; N uni1F74 ; G 2410 -U 8053 ; WX 712 ; N uni1F75 ; G 2411 -U 8054 ; WX 390 ; N uni1F76 ; G 2412 -U 8055 ; WX 390 ; N uni1F77 ; G 2413 -U 8056 ; WX 687 ; N uni1F78 ; G 2414 -U 8057 ; WX 687 ; N uni1F79 ; G 2415 -U 8058 ; WX 675 ; N uni1F7A ; G 2416 -U 8059 ; WX 675 ; N uni1F7B ; G 2417 -U 8060 ; WX 869 ; N uni1F7C ; G 2418 -U 8061 ; WX 869 ; N uni1F7D ; G 2419 -U 8064 ; WX 687 ; N uni1F80 ; G 2420 -U 8065 ; WX 687 ; N uni1F81 ; G 2421 -U 8066 ; WX 687 ; N uni1F82 ; G 2422 -U 8067 ; WX 687 ; N uni1F83 ; G 2423 -U 8068 ; WX 687 ; N uni1F84 ; G 2424 -U 8069 ; WX 687 ; N uni1F85 ; G 2425 -U 8070 ; WX 687 ; N uni1F86 ; G 2426 -U 8071 ; WX 687 ; N uni1F87 ; G 2427 -U 8072 ; WX 774 ; N uni1F88 ; G 2428 -U 8073 ; WX 774 ; N uni1F89 ; G 2429 -U 8074 ; WX 1041 ; N uni1F8A ; G 2430 -U 8075 ; WX 1043 ; N uni1F8B ; G 2431 -U 8076 ; WX 935 ; N uni1F8C ; G 2432 -U 8077 ; WX 963 ; N uni1F8D ; G 2433 -U 8078 ; WX 835 ; N uni1F8E ; G 2434 -U 8079 ; WX 859 ; N uni1F8F ; G 2435 -U 8080 ; WX 712 ; N uni1F90 ; G 2436 -U 8081 ; WX 712 ; N uni1F91 ; G 2437 -U 8082 ; WX 712 ; N uni1F92 ; G 2438 -U 8083 ; WX 712 ; N uni1F93 ; G 2439 -U 8084 ; WX 712 ; N uni1F94 ; G 2440 -U 8085 ; WX 712 ; N uni1F95 ; G 2441 -U 8086 ; WX 712 ; N uni1F96 ; G 2442 -U 8087 ; WX 712 ; N uni1F97 ; G 2443 -U 8088 ; WX 945 ; N uni1F98 ; G 2444 -U 8089 ; WX 951 ; N uni1F99 ; G 2445 -U 8090 ; WX 1250 ; N uni1F9A ; G 2446 -U 8091 ; WX 1250 ; N uni1F9B ; G 2447 -U 8092 ; WX 1180 ; N uni1F9C ; G 2448 -U 8093 ; WX 1206 ; N uni1F9D ; G 2449 -U 8094 ; WX 1054 ; N uni1F9E ; G 2450 -U 8095 ; WX 1063 ; N uni1F9F ; G 2451 -U 8096 ; WX 869 ; N uni1FA0 ; G 2452 -U 8097 ; WX 869 ; N uni1FA1 ; G 2453 -U 8098 ; WX 869 ; N uni1FA2 ; G 2454 -U 8099 ; WX 869 ; N uni1FA3 ; G 2455 -U 8100 ; WX 869 ; N uni1FA4 ; G 2456 -U 8101 ; WX 869 ; N uni1FA5 ; G 2457 -U 8102 ; WX 869 ; N uni1FA6 ; G 2458 -U 8103 ; WX 869 ; N uni1FA7 ; G 2459 -U 8104 ; WX 909 ; N uni1FA8 ; G 2460 -U 8105 ; WX 958 ; N uni1FA9 ; G 2461 -U 8106 ; WX 1246 ; N uni1FAA ; G 2462 -U 8107 ; WX 1251 ; N uni1FAB ; G 2463 -U 8108 ; WX 1076 ; N uni1FAC ; G 2464 -U 8109 ; WX 1105 ; N uni1FAD ; G 2465 -U 8110 ; WX 1028 ; N uni1FAE ; G 2466 -U 8111 ; WX 1076 ; N uni1FAF ; G 2467 -U 8112 ; WX 687 ; N uni1FB0 ; G 2468 -U 8113 ; WX 687 ; N uni1FB1 ; G 2469 -U 8114 ; WX 687 ; N uni1FB2 ; G 2470 -U 8115 ; WX 687 ; N uni1FB3 ; G 2471 -U 8116 ; WX 687 ; N uni1FB4 ; G 2472 -U 8118 ; WX 687 ; N uni1FB6 ; G 2473 -U 8119 ; WX 687 ; N uni1FB7 ; G 2474 -U 8120 ; WX 774 ; N uni1FB8 ; G 2475 -U 8121 ; WX 774 ; N uni1FB9 ; G 2476 -U 8122 ; WX 876 ; N uni1FBA ; G 2477 -U 8123 ; WX 797 ; N uni1FBB ; G 2478 -U 8124 ; WX 774 ; N uni1FBC ; G 2479 -U 8125 ; WX 500 ; N uni1FBD ; G 2480 -U 8126 ; WX 500 ; N uni1FBE ; G 2481 -U 8127 ; WX 500 ; N uni1FBF ; G 2482 -U 8128 ; WX 500 ; N uni1FC0 ; G 2483 -U 8129 ; WX 500 ; N uni1FC1 ; G 2484 -U 8130 ; WX 712 ; N uni1FC2 ; G 2485 -U 8131 ; WX 712 ; N uni1FC3 ; G 2486 -U 8132 ; WX 712 ; N uni1FC4 ; G 2487 -U 8134 ; WX 712 ; N uni1FC6 ; G 2488 -U 8135 ; WX 712 ; N uni1FC7 ; G 2489 -U 8136 ; WX 929 ; N uni1FC8 ; G 2490 -U 8137 ; WX 846 ; N uni1FC9 ; G 2491 -U 8138 ; WX 1080 ; N uni1FCA ; G 2492 -U 8139 ; WX 1009 ; N uni1FCB ; G 2493 -U 8140 ; WX 837 ; N uni1FCC ; G 2494 -U 8141 ; WX 500 ; N uni1FCD ; G 2495 -U 8142 ; WX 500 ; N uni1FCE ; G 2496 -U 8143 ; WX 500 ; N uni1FCF ; G 2497 -U 8144 ; WX 390 ; N uni1FD0 ; G 2498 -U 8145 ; WX 390 ; N uni1FD1 ; G 2499 -U 8146 ; WX 390 ; N uni1FD2 ; G 2500 -U 8147 ; WX 390 ; N uni1FD3 ; G 2501 -U 8150 ; WX 390 ; N uni1FD6 ; G 2502 -U 8151 ; WX 390 ; N uni1FD7 ; G 2503 -U 8152 ; WX 372 ; N uni1FD8 ; G 2504 -U 8153 ; WX 372 ; N uni1FD9 ; G 2505 -U 8154 ; WX 621 ; N uni1FDA ; G 2506 -U 8155 ; WX 563 ; N uni1FDB ; G 2507 -U 8157 ; WX 500 ; N uni1FDD ; G 2508 -U 8158 ; WX 500 ; N uni1FDE ; G 2509 -U 8159 ; WX 500 ; N uni1FDF ; G 2510 -U 8160 ; WX 675 ; N uni1FE0 ; G 2511 -U 8161 ; WX 675 ; N uni1FE1 ; G 2512 -U 8162 ; WX 675 ; N uni1FE2 ; G 2513 -U 8163 ; WX 675 ; N uni1FE3 ; G 2514 -U 8164 ; WX 716 ; N uni1FE4 ; G 2515 -U 8165 ; WX 716 ; N uni1FE5 ; G 2516 -U 8166 ; WX 675 ; N uni1FE6 ; G 2517 -U 8167 ; WX 675 ; N uni1FE7 ; G 2518 -U 8168 ; WX 724 ; N uni1FE8 ; G 2519 -U 8169 ; WX 724 ; N uni1FE9 ; G 2520 -U 8170 ; WX 1020 ; N uni1FEA ; G 2521 -U 8171 ; WX 980 ; N uni1FEB ; G 2522 -U 8172 ; WX 838 ; N uni1FEC ; G 2523 -U 8173 ; WX 500 ; N uni1FED ; G 2524 -U 8174 ; WX 500 ; N uni1FEE ; G 2525 -U 8175 ; WX 500 ; N uni1FEF ; G 2526 -U 8178 ; WX 869 ; N uni1FF2 ; G 2527 -U 8179 ; WX 869 ; N uni1FF3 ; G 2528 -U 8180 ; WX 869 ; N uni1FF4 ; G 2529 -U 8182 ; WX 869 ; N uni1FF6 ; G 2530 -U 8183 ; WX 869 ; N uni1FF7 ; G 2531 -U 8184 ; WX 1065 ; N uni1FF8 ; G 2532 -U 8185 ; WX 891 ; N uni1FF9 ; G 2533 -U 8186 ; WX 1084 ; N uni1FFA ; G 2534 -U 8187 ; WX 894 ; N uni1FFB ; G 2535 -U 8188 ; WX 850 ; N uni1FFC ; G 2536 -U 8189 ; WX 500 ; N uni1FFD ; G 2537 -U 8190 ; WX 500 ; N uni1FFE ; G 2538 -U 8192 ; WX 500 ; N uni2000 ; G 2539 -U 8193 ; WX 1000 ; N uni2001 ; G 2540 -U 8194 ; WX 500 ; N uni2002 ; G 2541 -U 8195 ; WX 1000 ; N uni2003 ; G 2542 -U 8196 ; WX 330 ; N uni2004 ; G 2543 -U 8197 ; WX 250 ; N uni2005 ; G 2544 -U 8198 ; WX 167 ; N uni2006 ; G 2545 -U 8199 ; WX 696 ; N uni2007 ; G 2546 -U 8200 ; WX 380 ; N uni2008 ; G 2547 -U 8201 ; WX 200 ; N uni2009 ; G 2548 -U 8202 ; WX 100 ; N uni200A ; G 2549 -U 8203 ; WX 0 ; N uni200B ; G 2550 -U 8204 ; WX 0 ; N uni200C ; G 2551 -U 8205 ; WX 0 ; N uni200D ; G 2552 -U 8206 ; WX 0 ; N uni200E ; G 2553 -U 8207 ; WX 0 ; N uni200F ; G 2554 -U 8208 ; WX 415 ; N uni2010 ; G 2555 -U 8209 ; WX 415 ; N uni2011 ; G 2556 -U 8210 ; WX 696 ; N figuredash ; G 2557 -U 8211 ; WX 500 ; N endash ; G 2558 -U 8212 ; WX 1000 ; N emdash ; G 2559 -U 8213 ; WX 1000 ; N uni2015 ; G 2560 -U 8214 ; WX 500 ; N uni2016 ; G 2561 -U 8215 ; WX 500 ; N underscoredbl ; G 2562 -U 8216 ; WX 380 ; N quoteleft ; G 2563 -U 8217 ; WX 380 ; N quoteright ; G 2564 -U 8218 ; WX 380 ; N quotesinglbase ; G 2565 -U 8219 ; WX 380 ; N quotereversed ; G 2566 -U 8220 ; WX 644 ; N quotedblleft ; G 2567 -U 8221 ; WX 644 ; N quotedblright ; G 2568 -U 8222 ; WX 644 ; N quotedblbase ; G 2569 -U 8223 ; WX 657 ; N uni201F ; G 2570 -U 8224 ; WX 500 ; N dagger ; G 2571 -U 8225 ; WX 500 ; N daggerdbl ; G 2572 -U 8226 ; WX 639 ; N bullet ; G 2573 -U 8227 ; WX 639 ; N uni2023 ; G 2574 -U 8228 ; WX 380 ; N onedotenleader ; G 2575 -U 8229 ; WX 685 ; N twodotenleader ; G 2576 -U 8230 ; WX 1000 ; N ellipsis ; G 2577 -U 8231 ; WX 348 ; N uni2027 ; G 2578 -U 8232 ; WX 0 ; N uni2028 ; G 2579 -U 8233 ; WX 0 ; N uni2029 ; G 2580 -U 8234 ; WX 0 ; N uni202A ; G 2581 -U 8235 ; WX 0 ; N uni202B ; G 2582 -U 8236 ; WX 0 ; N uni202C ; G 2583 -U 8237 ; WX 0 ; N uni202D ; G 2584 -U 8238 ; WX 0 ; N uni202E ; G 2585 -U 8239 ; WX 200 ; N uni202F ; G 2586 -U 8240 ; WX 1454 ; N perthousand ; G 2587 -U 8241 ; WX 1908 ; N uni2031 ; G 2588 -U 8242 ; WX 264 ; N minute ; G 2589 -U 8243 ; WX 447 ; N second ; G 2590 -U 8244 ; WX 630 ; N uni2034 ; G 2591 -U 8245 ; WX 264 ; N uni2035 ; G 2592 -U 8246 ; WX 447 ; N uni2036 ; G 2593 -U 8247 ; WX 630 ; N uni2037 ; G 2594 -U 8248 ; WX 733 ; N uni2038 ; G 2595 -U 8249 ; WX 412 ; N guilsinglleft ; G 2596 -U 8250 ; WX 412 ; N guilsinglright ; G 2597 -U 8251 ; WX 972 ; N uni203B ; G 2598 -U 8252 ; WX 627 ; N exclamdbl ; G 2599 -U 8253 ; WX 580 ; N uni203D ; G 2600 -U 8254 ; WX 500 ; N uni203E ; G 2601 -U 8255 ; WX 828 ; N uni203F ; G 2602 -U 8256 ; WX 828 ; N uni2040 ; G 2603 -U 8257 ; WX 329 ; N uni2041 ; G 2604 -U 8258 ; WX 1023 ; N uni2042 ; G 2605 -U 8259 ; WX 500 ; N uni2043 ; G 2606 -U 8260 ; WX 167 ; N fraction ; G 2607 -U 8261 ; WX 457 ; N uni2045 ; G 2608 -U 8262 ; WX 457 ; N uni2046 ; G 2609 -U 8263 ; WX 1030 ; N uni2047 ; G 2610 -U 8264 ; WX 829 ; N uni2048 ; G 2611 -U 8265 ; WX 829 ; N uni2049 ; G 2612 -U 8266 ; WX 513 ; N uni204A ; G 2613 -U 8267 ; WX 687 ; N uni204B ; G 2614 -U 8268 ; WX 500 ; N uni204C ; G 2615 -U 8269 ; WX 500 ; N uni204D ; G 2616 -U 8270 ; WX 523 ; N uni204E ; G 2617 -U 8271 ; WX 400 ; N uni204F ; G 2618 -U 8272 ; WX 828 ; N uni2050 ; G 2619 -U 8273 ; WX 523 ; N uni2051 ; G 2620 -U 8274 ; WX 556 ; N uni2052 ; G 2621 -U 8275 ; WX 838 ; N uni2053 ; G 2622 -U 8276 ; WX 828 ; N uni2054 ; G 2623 -U 8277 ; WX 838 ; N uni2055 ; G 2624 -U 8278 ; WX 684 ; N uni2056 ; G 2625 -U 8279 ; WX 813 ; N uni2057 ; G 2626 -U 8280 ; WX 838 ; N uni2058 ; G 2627 -U 8281 ; WX 838 ; N uni2059 ; G 2628 -U 8282 ; WX 380 ; N uni205A ; G 2629 -U 8283 ; WX 872 ; N uni205B ; G 2630 -U 8284 ; WX 838 ; N uni205C ; G 2631 -U 8285 ; WX 380 ; N uni205D ; G 2632 -U 8286 ; WX 380 ; N uni205E ; G 2633 -U 8287 ; WX 222 ; N uni205F ; G 2634 -U 8288 ; WX 0 ; N uni2060 ; G 2635 -U 8289 ; WX 0 ; N uni2061 ; G 2636 -U 8290 ; WX 0 ; N uni2062 ; G 2637 -U 8291 ; WX 0 ; N uni2063 ; G 2638 -U 8292 ; WX 0 ; N uni2064 ; G 2639 -U 8298 ; WX 0 ; N uni206A ; G 2640 -U 8299 ; WX 0 ; N uni206B ; G 2641 -U 8300 ; WX 0 ; N uni206C ; G 2642 -U 8301 ; WX 0 ; N uni206D ; G 2643 -U 8302 ; WX 0 ; N uni206E ; G 2644 -U 8303 ; WX 0 ; N uni206F ; G 2645 -U 8304 ; WX 438 ; N uni2070 ; G 2646 -U 8305 ; WX 219 ; N uni2071 ; G 2647 -U 8308 ; WX 438 ; N uni2074 ; G 2648 -U 8309 ; WX 438 ; N uni2075 ; G 2649 -U 8310 ; WX 438 ; N uni2076 ; G 2650 -U 8311 ; WX 438 ; N uni2077 ; G 2651 -U 8312 ; WX 438 ; N uni2078 ; G 2652 -U 8313 ; WX 438 ; N uni2079 ; G 2653 -U 8314 ; WX 528 ; N uni207A ; G 2654 -U 8315 ; WX 528 ; N uni207B ; G 2655 -U 8316 ; WX 528 ; N uni207C ; G 2656 -U 8317 ; WX 288 ; N uni207D ; G 2657 -U 8318 ; WX 288 ; N uni207E ; G 2658 -U 8319 ; WX 456 ; N uni207F ; G 2659 -U 8320 ; WX 438 ; N uni2080 ; G 2660 -U 8321 ; WX 438 ; N uni2081 ; G 2661 -U 8322 ; WX 438 ; N uni2082 ; G 2662 -U 8323 ; WX 438 ; N uni2083 ; G 2663 -U 8324 ; WX 438 ; N uni2084 ; G 2664 -U 8325 ; WX 438 ; N uni2085 ; G 2665 -U 8326 ; WX 438 ; N uni2086 ; G 2666 -U 8327 ; WX 438 ; N uni2087 ; G 2667 -U 8328 ; WX 438 ; N uni2088 ; G 2668 -U 8329 ; WX 438 ; N uni2089 ; G 2669 -U 8330 ; WX 528 ; N uni208A ; G 2670 -U 8331 ; WX 528 ; N uni208B ; G 2671 -U 8332 ; WX 528 ; N uni208C ; G 2672 -U 8333 ; WX 288 ; N uni208D ; G 2673 -U 8334 ; WX 288 ; N uni208E ; G 2674 -U 8336 ; WX 458 ; N uni2090 ; G 2675 -U 8337 ; WX 479 ; N uni2091 ; G 2676 -U 8338 ; WX 488 ; N uni2092 ; G 2677 -U 8339 ; WX 413 ; N uni2093 ; G 2678 -U 8340 ; WX 479 ; N uni2094 ; G 2679 -U 8341 ; WX 456 ; N uni2095 ; G 2680 -U 8342 ; WX 487 ; N uni2096 ; G 2681 -U 8343 ; WX 219 ; N uni2097 ; G 2682 -U 8344 ; WX 664 ; N uni2098 ; G 2683 -U 8345 ; WX 456 ; N uni2099 ; G 2684 -U 8346 ; WX 479 ; N uni209A ; G 2685 -U 8347 ; WX 381 ; N uni209B ; G 2686 -U 8348 ; WX 388 ; N uni209C ; G 2687 -U 8352 ; WX 929 ; N uni20A0 ; G 2688 -U 8353 ; WX 696 ; N colonmonetary ; G 2689 -U 8354 ; WX 696 ; N uni20A2 ; G 2690 -U 8355 ; WX 696 ; N franc ; G 2691 -U 8356 ; WX 696 ; N lira ; G 2692 -U 8357 ; WX 1042 ; N uni20A5 ; G 2693 -U 8358 ; WX 696 ; N uni20A6 ; G 2694 -U 8359 ; WX 1488 ; N peseta ; G 2695 -U 8360 ; WX 1205 ; N uni20A8 ; G 2696 -U 8361 ; WX 1103 ; N uni20A9 ; G 2697 -U 8362 ; WX 854 ; N uni20AA ; G 2698 -U 8363 ; WX 696 ; N dong ; G 2699 -U 8364 ; WX 696 ; N Euro ; G 2700 -U 8365 ; WX 696 ; N uni20AD ; G 2701 -U 8366 ; WX 696 ; N uni20AE ; G 2702 -U 8367 ; WX 1392 ; N uni20AF ; G 2703 -U 8368 ; WX 696 ; N uni20B0 ; G 2704 -U 8369 ; WX 696 ; N uni20B1 ; G 2705 -U 8370 ; WX 696 ; N uni20B2 ; G 2706 -U 8371 ; WX 696 ; N uni20B3 ; G 2707 -U 8372 ; WX 859 ; N uni20B4 ; G 2708 -U 8373 ; WX 696 ; N uni20B5 ; G 2709 -U 8376 ; WX 696 ; N uni20B8 ; G 2710 -U 8377 ; WX 696 ; N uni20B9 ; G 2711 -U 8378 ; WX 696 ; N uni20BA ; G 2712 -U 8381 ; WX 696 ; N uni20BD ; G 2713 -U 8400 ; WX 0 ; N uni20D0 ; G 2714 -U 8401 ; WX 0 ; N uni20D1 ; G 2715 -U 8406 ; WX 0 ; N uni20D6 ; G 2716 -U 8407 ; WX 0 ; N uni20D7 ; G 2717 -U 8411 ; WX 0 ; N uni20DB ; G 2718 -U 8412 ; WX 0 ; N uni20DC ; G 2719 -U 8417 ; WX 0 ; N uni20E1 ; G 2720 -U 8448 ; WX 1106 ; N uni2100 ; G 2721 -U 8449 ; WX 1106 ; N uni2101 ; G 2722 -U 8450 ; WX 734 ; N uni2102 ; G 2723 -U 8451 ; WX 1211 ; N uni2103 ; G 2724 -U 8452 ; WX 896 ; N uni2104 ; G 2725 -U 8453 ; WX 1114 ; N uni2105 ; G 2726 -U 8454 ; WX 1148 ; N uni2106 ; G 2727 -U 8455 ; WX 696 ; N uni2107 ; G 2728 -U 8456 ; WX 698 ; N uni2108 ; G 2729 -U 8457 ; WX 952 ; N uni2109 ; G 2730 -U 8459 ; WX 1073 ; N uni210B ; G 2731 -U 8460 ; WX 913 ; N uni210C ; G 2732 -U 8461 ; WX 888 ; N uni210D ; G 2733 -U 8462 ; WX 712 ; N uni210E ; G 2734 -U 8463 ; WX 712 ; N uni210F ; G 2735 -U 8464 ; WX 597 ; N uni2110 ; G 2736 -U 8465 ; WX 697 ; N Ifraktur ; G 2737 -U 8466 ; WX 856 ; N uni2112 ; G 2738 -U 8467 ; WX 472 ; N uni2113 ; G 2739 -U 8468 ; WX 974 ; N uni2114 ; G 2740 -U 8469 ; WX 837 ; N uni2115 ; G 2741 -U 8470 ; WX 1203 ; N uni2116 ; G 2742 -U 8471 ; WX 1000 ; N uni2117 ; G 2743 -U 8472 ; WX 697 ; N weierstrass ; G 2744 -U 8473 ; WX 750 ; N uni2119 ; G 2745 -U 8474 ; WX 850 ; N uni211A ; G 2746 -U 8475 ; WX 938 ; N uni211B ; G 2747 -U 8476 ; WX 814 ; N Rfraktur ; G 2748 -U 8477 ; WX 801 ; N uni211D ; G 2749 -U 8478 ; WX 896 ; N prescription ; G 2750 -U 8479 ; WX 710 ; N uni211F ; G 2751 -U 8480 ; WX 1020 ; N uni2120 ; G 2752 -U 8481 ; WX 1239 ; N uni2121 ; G 2753 -U 8482 ; WX 1000 ; N trademark ; G 2754 -U 8483 ; WX 834 ; N uni2123 ; G 2755 -U 8484 ; WX 754 ; N uni2124 ; G 2756 -U 8485 ; WX 622 ; N uni2125 ; G 2757 -U 8486 ; WX 850 ; N uni2126 ; G 2758 -U 8487 ; WX 769 ; N uni2127 ; G 2759 -U 8488 ; WX 763 ; N uni2128 ; G 2760 -U 8489 ; WX 303 ; N uni2129 ; G 2761 -U 8490 ; WX 775 ; N uni212A ; G 2762 -U 8491 ; WX 774 ; N uni212B ; G 2763 -U 8492 ; WX 928 ; N uni212C ; G 2764 -U 8493 ; WX 818 ; N uni212D ; G 2765 -U 8494 ; WX 854 ; N estimated ; G 2766 -U 8495 ; WX 636 ; N uni212F ; G 2767 -U 8496 ; WX 729 ; N uni2130 ; G 2768 -U 8497 ; WX 808 ; N uni2131 ; G 2769 -U 8498 ; WX 683 ; N uni2132 ; G 2770 -U 8499 ; WX 1184 ; N uni2133 ; G 2771 -U 8500 ; WX 465 ; N uni2134 ; G 2772 -U 8501 ; WX 794 ; N aleph ; G 2773 -U 8502 ; WX 731 ; N uni2136 ; G 2774 -U 8503 ; WX 494 ; N uni2137 ; G 2775 -U 8504 ; WX 684 ; N uni2138 ; G 2776 -U 8505 ; WX 380 ; N uni2139 ; G 2777 -U 8506 ; WX 945 ; N uni213A ; G 2778 -U 8507 ; WX 1370 ; N uni213B ; G 2779 -U 8508 ; WX 790 ; N uni213C ; G 2780 -U 8509 ; WX 737 ; N uni213D ; G 2781 -U 8510 ; WX 654 ; N uni213E ; G 2782 -U 8511 ; WX 863 ; N uni213F ; G 2783 -U 8512 ; WX 840 ; N uni2140 ; G 2784 -U 8513 ; WX 786 ; N uni2141 ; G 2785 -U 8514 ; WX 576 ; N uni2142 ; G 2786 -U 8515 ; WX 637 ; N uni2143 ; G 2787 -U 8516 ; WX 760 ; N uni2144 ; G 2788 -U 8517 ; WX 830 ; N uni2145 ; G 2789 -U 8518 ; WX 716 ; N uni2146 ; G 2790 -U 8519 ; WX 678 ; N uni2147 ; G 2791 -U 8520 ; WX 343 ; N uni2148 ; G 2792 -U 8521 ; WX 343 ; N uni2149 ; G 2793 -U 8523 ; WX 872 ; N uni214B ; G 2794 -U 8526 ; WX 547 ; N uni214E ; G 2795 -U 8528 ; WX 1035 ; N uni2150 ; G 2796 -U 8529 ; WX 1035 ; N uni2151 ; G 2797 -U 8530 ; WX 1483 ; N uni2152 ; G 2798 -U 8531 ; WX 1035 ; N onethird ; G 2799 -U 8532 ; WX 1035 ; N twothirds ; G 2800 -U 8533 ; WX 1035 ; N uni2155 ; G 2801 -U 8534 ; WX 1035 ; N uni2156 ; G 2802 -U 8535 ; WX 1035 ; N uni2157 ; G 2803 -U 8536 ; WX 1035 ; N uni2158 ; G 2804 -U 8537 ; WX 1035 ; N uni2159 ; G 2805 -U 8538 ; WX 1035 ; N uni215A ; G 2806 -U 8539 ; WX 1035 ; N oneeighth ; G 2807 -U 8540 ; WX 1035 ; N threeeighths ; G 2808 -U 8541 ; WX 1035 ; N fiveeighths ; G 2809 -U 8542 ; WX 1035 ; N seveneighths ; G 2810 -U 8543 ; WX 615 ; N uni215F ; G 2811 -U 8544 ; WX 372 ; N uni2160 ; G 2812 -U 8545 ; WX 659 ; N uni2161 ; G 2813 -U 8546 ; WX 945 ; N uni2162 ; G 2814 -U 8547 ; WX 1099 ; N uni2163 ; G 2815 -U 8548 ; WX 774 ; N uni2164 ; G 2816 -U 8549 ; WX 1099 ; N uni2165 ; G 2817 -U 8550 ; WX 1386 ; N uni2166 ; G 2818 -U 8551 ; WX 1672 ; N uni2167 ; G 2819 -U 8552 ; WX 1121 ; N uni2168 ; G 2820 -U 8553 ; WX 771 ; N uni2169 ; G 2821 -U 8554 ; WX 1120 ; N uni216A ; G 2822 -U 8555 ; WX 1407 ; N uni216B ; G 2823 -U 8556 ; WX 637 ; N uni216C ; G 2824 -U 8557 ; WX 734 ; N uni216D ; G 2825 -U 8558 ; WX 830 ; N uni216E ; G 2826 -U 8559 ; WX 995 ; N uni216F ; G 2827 -U 8560 ; WX 343 ; N uni2170 ; G 2828 -U 8561 ; WX 607 ; N uni2171 ; G 2829 -U 8562 ; WX 872 ; N uni2172 ; G 2830 -U 8563 ; WX 984 ; N uni2173 ; G 2831 -U 8564 ; WX 652 ; N uni2174 ; G 2832 -U 8565 ; WX 962 ; N uni2175 ; G 2833 -U 8566 ; WX 1227 ; N uni2176 ; G 2834 -U 8567 ; WX 1491 ; N uni2177 ; G 2835 -U 8568 ; WX 969 ; N uni2178 ; G 2836 -U 8569 ; WX 645 ; N uni2179 ; G 2837 -U 8570 ; WX 969 ; N uni217A ; G 2838 -U 8571 ; WX 1233 ; N uni217B ; G 2839 -U 8572 ; WX 343 ; N uni217C ; G 2840 -U 8573 ; WX 593 ; N uni217D ; G 2841 -U 8574 ; WX 716 ; N uni217E ; G 2842 -U 8575 ; WX 1042 ; N uni217F ; G 2843 -U 8576 ; WX 1289 ; N uni2180 ; G 2844 -U 8577 ; WX 830 ; N uni2181 ; G 2845 -U 8578 ; WX 1289 ; N uni2182 ; G 2846 -U 8579 ; WX 734 ; N uni2183 ; G 2847 -U 8580 ; WX 593 ; N uni2184 ; G 2848 -U 8581 ; WX 734 ; N uni2185 ; G 2849 -U 8585 ; WX 1035 ; N uni2189 ; G 2850 -U 8592 ; WX 838 ; N arrowleft ; G 2851 -U 8593 ; WX 838 ; N arrowup ; G 2852 -U 8594 ; WX 838 ; N arrowright ; G 2853 -U 8595 ; WX 838 ; N arrowdown ; G 2854 -U 8596 ; WX 838 ; N arrowboth ; G 2855 -U 8597 ; WX 838 ; N arrowupdn ; G 2856 -U 8598 ; WX 838 ; N uni2196 ; G 2857 -U 8599 ; WX 838 ; N uni2197 ; G 2858 -U 8600 ; WX 838 ; N uni2198 ; G 2859 -U 8601 ; WX 838 ; N uni2199 ; G 2860 -U 8602 ; WX 838 ; N uni219A ; G 2861 -U 8603 ; WX 838 ; N uni219B ; G 2862 -U 8604 ; WX 838 ; N uni219C ; G 2863 -U 8605 ; WX 838 ; N uni219D ; G 2864 -U 8606 ; WX 838 ; N uni219E ; G 2865 -U 8607 ; WX 838 ; N uni219F ; G 2866 -U 8608 ; WX 838 ; N uni21A0 ; G 2867 -U 8609 ; WX 838 ; N uni21A1 ; G 2868 -U 8610 ; WX 838 ; N uni21A2 ; G 2869 -U 8611 ; WX 838 ; N uni21A3 ; G 2870 -U 8612 ; WX 838 ; N uni21A4 ; G 2871 -U 8613 ; WX 838 ; N uni21A5 ; G 2872 -U 8614 ; WX 838 ; N uni21A6 ; G 2873 -U 8615 ; WX 838 ; N uni21A7 ; G 2874 -U 8616 ; WX 838 ; N arrowupdnbse ; G 2875 -U 8617 ; WX 838 ; N uni21A9 ; G 2876 -U 8618 ; WX 838 ; N uni21AA ; G 2877 -U 8619 ; WX 838 ; N uni21AB ; G 2878 -U 8620 ; WX 838 ; N uni21AC ; G 2879 -U 8621 ; WX 838 ; N uni21AD ; G 2880 -U 8622 ; WX 838 ; N uni21AE ; G 2881 -U 8623 ; WX 838 ; N uni21AF ; G 2882 -U 8624 ; WX 838 ; N uni21B0 ; G 2883 -U 8625 ; WX 838 ; N uni21B1 ; G 2884 -U 8626 ; WX 838 ; N uni21B2 ; G 2885 -U 8627 ; WX 838 ; N uni21B3 ; G 2886 -U 8628 ; WX 838 ; N uni21B4 ; G 2887 -U 8629 ; WX 838 ; N carriagereturn ; G 2888 -U 8630 ; WX 838 ; N uni21B6 ; G 2889 -U 8631 ; WX 838 ; N uni21B7 ; G 2890 -U 8632 ; WX 838 ; N uni21B8 ; G 2891 -U 8633 ; WX 838 ; N uni21B9 ; G 2892 -U 8634 ; WX 838 ; N uni21BA ; G 2893 -U 8635 ; WX 838 ; N uni21BB ; G 2894 -U 8636 ; WX 838 ; N uni21BC ; G 2895 -U 8637 ; WX 838 ; N uni21BD ; G 2896 -U 8638 ; WX 838 ; N uni21BE ; G 2897 -U 8639 ; WX 838 ; N uni21BF ; G 2898 -U 8640 ; WX 838 ; N uni21C0 ; G 2899 -U 8641 ; WX 838 ; N uni21C1 ; G 2900 -U 8642 ; WX 838 ; N uni21C2 ; G 2901 -U 8643 ; WX 838 ; N uni21C3 ; G 2902 -U 8644 ; WX 838 ; N uni21C4 ; G 2903 -U 8645 ; WX 838 ; N uni21C5 ; G 2904 -U 8646 ; WX 838 ; N uni21C6 ; G 2905 -U 8647 ; WX 838 ; N uni21C7 ; G 2906 -U 8648 ; WX 838 ; N uni21C8 ; G 2907 -U 8649 ; WX 838 ; N uni21C9 ; G 2908 -U 8650 ; WX 838 ; N uni21CA ; G 2909 -U 8651 ; WX 838 ; N uni21CB ; G 2910 -U 8652 ; WX 838 ; N uni21CC ; G 2911 -U 8653 ; WX 838 ; N uni21CD ; G 2912 -U 8654 ; WX 838 ; N uni21CE ; G 2913 -U 8655 ; WX 838 ; N uni21CF ; G 2914 -U 8656 ; WX 838 ; N arrowdblleft ; G 2915 -U 8657 ; WX 838 ; N arrowdblup ; G 2916 -U 8658 ; WX 838 ; N arrowdblright ; G 2917 -U 8659 ; WX 838 ; N arrowdbldown ; G 2918 -U 8660 ; WX 838 ; N arrowdblboth ; G 2919 -U 8661 ; WX 838 ; N uni21D5 ; G 2920 -U 8662 ; WX 838 ; N uni21D6 ; G 2921 -U 8663 ; WX 838 ; N uni21D7 ; G 2922 -U 8664 ; WX 838 ; N uni21D8 ; G 2923 -U 8665 ; WX 838 ; N uni21D9 ; G 2924 -U 8666 ; WX 838 ; N uni21DA ; G 2925 -U 8667 ; WX 838 ; N uni21DB ; G 2926 -U 8668 ; WX 838 ; N uni21DC ; G 2927 -U 8669 ; WX 838 ; N uni21DD ; G 2928 -U 8670 ; WX 838 ; N uni21DE ; G 2929 -U 8671 ; WX 838 ; N uni21DF ; G 2930 -U 8672 ; WX 838 ; N uni21E0 ; G 2931 -U 8673 ; WX 838 ; N uni21E1 ; G 2932 -U 8674 ; WX 838 ; N uni21E2 ; G 2933 -U 8675 ; WX 838 ; N uni21E3 ; G 2934 -U 8676 ; WX 838 ; N uni21E4 ; G 2935 -U 8677 ; WX 838 ; N uni21E5 ; G 2936 -U 8678 ; WX 838 ; N uni21E6 ; G 2937 -U 8679 ; WX 838 ; N uni21E7 ; G 2938 -U 8680 ; WX 838 ; N uni21E8 ; G 2939 -U 8681 ; WX 838 ; N uni21E9 ; G 2940 -U 8682 ; WX 838 ; N uni21EA ; G 2941 -U 8683 ; WX 838 ; N uni21EB ; G 2942 -U 8684 ; WX 838 ; N uni21EC ; G 2943 -U 8685 ; WX 838 ; N uni21ED ; G 2944 -U 8686 ; WX 838 ; N uni21EE ; G 2945 -U 8687 ; WX 838 ; N uni21EF ; G 2946 -U 8688 ; WX 838 ; N uni21F0 ; G 2947 -U 8689 ; WX 838 ; N uni21F1 ; G 2948 -U 8690 ; WX 838 ; N uni21F2 ; G 2949 -U 8691 ; WX 838 ; N uni21F3 ; G 2950 -U 8692 ; WX 838 ; N uni21F4 ; G 2951 -U 8693 ; WX 838 ; N uni21F5 ; G 2952 -U 8694 ; WX 838 ; N uni21F6 ; G 2953 -U 8695 ; WX 838 ; N uni21F7 ; G 2954 -U 8696 ; WX 838 ; N uni21F8 ; G 2955 -U 8697 ; WX 838 ; N uni21F9 ; G 2956 -U 8698 ; WX 838 ; N uni21FA ; G 2957 -U 8699 ; WX 838 ; N uni21FB ; G 2958 -U 8700 ; WX 838 ; N uni21FC ; G 2959 -U 8701 ; WX 838 ; N uni21FD ; G 2960 -U 8702 ; WX 838 ; N uni21FE ; G 2961 -U 8703 ; WX 838 ; N uni21FF ; G 2962 -U 8704 ; WX 774 ; N universal ; G 2963 -U 8705 ; WX 696 ; N uni2201 ; G 2964 -U 8706 ; WX 544 ; N partialdiff ; G 2965 -U 8707 ; WX 683 ; N existential ; G 2966 -U 8708 ; WX 683 ; N uni2204 ; G 2967 -U 8709 ; WX 856 ; N emptyset ; G 2968 -U 8710 ; WX 697 ; N increment ; G 2969 -U 8711 ; WX 697 ; N gradient ; G 2970 -U 8712 ; WX 896 ; N element ; G 2971 -U 8713 ; WX 896 ; N notelement ; G 2972 -U 8714 ; WX 750 ; N uni220A ; G 2973 -U 8715 ; WX 896 ; N suchthat ; G 2974 -U 8716 ; WX 896 ; N uni220C ; G 2975 -U 8717 ; WX 750 ; N uni220D ; G 2976 -U 8718 ; WX 636 ; N uni220E ; G 2977 -U 8719 ; WX 787 ; N product ; G 2978 -U 8720 ; WX 787 ; N uni2210 ; G 2979 -U 8721 ; WX 718 ; N summation ; G 2980 -U 8722 ; WX 838 ; N minus ; G 2981 -U 8723 ; WX 838 ; N uni2213 ; G 2982 -U 8724 ; WX 696 ; N uni2214 ; G 2983 -U 8725 ; WX 365 ; N uni2215 ; G 2984 -U 8726 ; WX 696 ; N uni2216 ; G 2985 -U 8727 ; WX 838 ; N asteriskmath ; G 2986 -U 8728 ; WX 626 ; N uni2218 ; G 2987 -U 8729 ; WX 380 ; N uni2219 ; G 2988 -U 8730 ; WX 667 ; N radical ; G 2989 -U 8731 ; WX 667 ; N uni221B ; G 2990 -U 8732 ; WX 667 ; N uni221C ; G 2991 -U 8733 ; WX 712 ; N proportional ; G 2992 -U 8734 ; WX 833 ; N infinity ; G 2993 -U 8735 ; WX 838 ; N orthogonal ; G 2994 -U 8736 ; WX 896 ; N angle ; G 2995 -U 8737 ; WX 896 ; N uni2221 ; G 2996 -U 8738 ; WX 838 ; N uni2222 ; G 2997 -U 8739 ; WX 500 ; N uni2223 ; G 2998 -U 8740 ; WX 500 ; N uni2224 ; G 2999 -U 8741 ; WX 500 ; N uni2225 ; G 3000 -U 8742 ; WX 500 ; N uni2226 ; G 3001 -U 8743 ; WX 812 ; N logicaland ; G 3002 -U 8744 ; WX 812 ; N logicalor ; G 3003 -U 8745 ; WX 812 ; N intersection ; G 3004 -U 8746 ; WX 812 ; N union ; G 3005 -U 8747 ; WX 610 ; N integral ; G 3006 -U 8748 ; WX 929 ; N uni222C ; G 3007 -U 8749 ; WX 1295 ; N uni222D ; G 3008 -U 8750 ; WX 563 ; N uni222E ; G 3009 -U 8751 ; WX 977 ; N uni222F ; G 3010 -U 8752 ; WX 1313 ; N uni2230 ; G 3011 -U 8753 ; WX 563 ; N uni2231 ; G 3012 -U 8754 ; WX 563 ; N uni2232 ; G 3013 -U 8755 ; WX 563 ; N uni2233 ; G 3014 -U 8756 ; WX 696 ; N therefore ; G 3015 -U 8757 ; WX 696 ; N uni2235 ; G 3016 -U 8758 ; WX 294 ; N uni2236 ; G 3017 -U 8759 ; WX 696 ; N uni2237 ; G 3018 -U 8760 ; WX 838 ; N uni2238 ; G 3019 -U 8761 ; WX 838 ; N uni2239 ; G 3020 -U 8762 ; WX 838 ; N uni223A ; G 3021 -U 8763 ; WX 838 ; N uni223B ; G 3022 -U 8764 ; WX 838 ; N similar ; G 3023 -U 8765 ; WX 838 ; N uni223D ; G 3024 -U 8766 ; WX 838 ; N uni223E ; G 3025 -U 8767 ; WX 838 ; N uni223F ; G 3026 -U 8768 ; WX 375 ; N uni2240 ; G 3027 -U 8769 ; WX 838 ; N uni2241 ; G 3028 -U 8770 ; WX 838 ; N uni2242 ; G 3029 -U 8771 ; WX 838 ; N uni2243 ; G 3030 -U 8772 ; WX 838 ; N uni2244 ; G 3031 -U 8773 ; WX 838 ; N congruent ; G 3032 -U 8774 ; WX 838 ; N uni2246 ; G 3033 -U 8775 ; WX 838 ; N uni2247 ; G 3034 -U 8776 ; WX 838 ; N approxequal ; G 3035 -U 8777 ; WX 838 ; N uni2249 ; G 3036 -U 8778 ; WX 838 ; N uni224A ; G 3037 -U 8779 ; WX 838 ; N uni224B ; G 3038 -U 8780 ; WX 838 ; N uni224C ; G 3039 -U 8781 ; WX 838 ; N uni224D ; G 3040 -U 8782 ; WX 838 ; N uni224E ; G 3041 -U 8783 ; WX 838 ; N uni224F ; G 3042 -U 8784 ; WX 838 ; N uni2250 ; G 3043 -U 8785 ; WX 838 ; N uni2251 ; G 3044 -U 8786 ; WX 838 ; N uni2252 ; G 3045 -U 8787 ; WX 838 ; N uni2253 ; G 3046 -U 8788 ; WX 1063 ; N uni2254 ; G 3047 -U 8789 ; WX 1063 ; N uni2255 ; G 3048 -U 8790 ; WX 838 ; N uni2256 ; G 3049 -U 8791 ; WX 838 ; N uni2257 ; G 3050 -U 8792 ; WX 838 ; N uni2258 ; G 3051 -U 8793 ; WX 838 ; N uni2259 ; G 3052 -U 8794 ; WX 838 ; N uni225A ; G 3053 -U 8795 ; WX 838 ; N uni225B ; G 3054 -U 8796 ; WX 838 ; N uni225C ; G 3055 -U 8797 ; WX 838 ; N uni225D ; G 3056 -U 8798 ; WX 838 ; N uni225E ; G 3057 -U 8799 ; WX 838 ; N uni225F ; G 3058 -U 8800 ; WX 838 ; N notequal ; G 3059 -U 8801 ; WX 838 ; N equivalence ; G 3060 -U 8802 ; WX 838 ; N uni2262 ; G 3061 -U 8803 ; WX 838 ; N uni2263 ; G 3062 -U 8804 ; WX 838 ; N lessequal ; G 3063 -U 8805 ; WX 838 ; N greaterequal ; G 3064 -U 8806 ; WX 838 ; N uni2266 ; G 3065 -U 8807 ; WX 838 ; N uni2267 ; G 3066 -U 8808 ; WX 841 ; N uni2268 ; G 3067 -U 8809 ; WX 841 ; N uni2269 ; G 3068 -U 8810 ; WX 1047 ; N uni226A ; G 3069 -U 8811 ; WX 1047 ; N uni226B ; G 3070 -U 8812 ; WX 500 ; N uni226C ; G 3071 -U 8813 ; WX 838 ; N uni226D ; G 3072 -U 8814 ; WX 838 ; N uni226E ; G 3073 -U 8815 ; WX 838 ; N uni226F ; G 3074 -U 8816 ; WX 838 ; N uni2270 ; G 3075 -U 8817 ; WX 838 ; N uni2271 ; G 3076 -U 8818 ; WX 838 ; N uni2272 ; G 3077 -U 8819 ; WX 838 ; N uni2273 ; G 3078 -U 8820 ; WX 838 ; N uni2274 ; G 3079 -U 8821 ; WX 838 ; N uni2275 ; G 3080 -U 8822 ; WX 838 ; N uni2276 ; G 3081 -U 8823 ; WX 838 ; N uni2277 ; G 3082 -U 8824 ; WX 838 ; N uni2278 ; G 3083 -U 8825 ; WX 838 ; N uni2279 ; G 3084 -U 8826 ; WX 838 ; N uni227A ; G 3085 -U 8827 ; WX 838 ; N uni227B ; G 3086 -U 8828 ; WX 838 ; N uni227C ; G 3087 -U 8829 ; WX 838 ; N uni227D ; G 3088 -U 8830 ; WX 838 ; N uni227E ; G 3089 -U 8831 ; WX 838 ; N uni227F ; G 3090 -U 8832 ; WX 838 ; N uni2280 ; G 3091 -U 8833 ; WX 838 ; N uni2281 ; G 3092 -U 8834 ; WX 838 ; N propersubset ; G 3093 -U 8835 ; WX 838 ; N propersuperset ; G 3094 -U 8836 ; WX 838 ; N notsubset ; G 3095 -U 8837 ; WX 838 ; N uni2285 ; G 3096 -U 8838 ; WX 838 ; N reflexsubset ; G 3097 -U 8839 ; WX 838 ; N reflexsuperset ; G 3098 -U 8840 ; WX 838 ; N uni2288 ; G 3099 -U 8841 ; WX 838 ; N uni2289 ; G 3100 -U 8842 ; WX 838 ; N uni228A ; G 3101 -U 8843 ; WX 838 ; N uni228B ; G 3102 -U 8844 ; WX 812 ; N uni228C ; G 3103 -U 8845 ; WX 812 ; N uni228D ; G 3104 -U 8846 ; WX 812 ; N uni228E ; G 3105 -U 8847 ; WX 838 ; N uni228F ; G 3106 -U 8848 ; WX 838 ; N uni2290 ; G 3107 -U 8849 ; WX 838 ; N uni2291 ; G 3108 -U 8850 ; WX 838 ; N uni2292 ; G 3109 -U 8851 ; WX 796 ; N uni2293 ; G 3110 -U 8852 ; WX 796 ; N uni2294 ; G 3111 -U 8853 ; WX 838 ; N circleplus ; G 3112 -U 8854 ; WX 838 ; N uni2296 ; G 3113 -U 8855 ; WX 838 ; N circlemultiply ; G 3114 -U 8856 ; WX 838 ; N uni2298 ; G 3115 -U 8857 ; WX 838 ; N uni2299 ; G 3116 -U 8858 ; WX 838 ; N uni229A ; G 3117 -U 8859 ; WX 838 ; N uni229B ; G 3118 -U 8860 ; WX 838 ; N uni229C ; G 3119 -U 8861 ; WX 838 ; N uni229D ; G 3120 -U 8862 ; WX 838 ; N uni229E ; G 3121 -U 8863 ; WX 838 ; N uni229F ; G 3122 -U 8864 ; WX 838 ; N uni22A0 ; G 3123 -U 8865 ; WX 838 ; N uni22A1 ; G 3124 -U 8866 ; WX 914 ; N uni22A2 ; G 3125 -U 8867 ; WX 914 ; N uni22A3 ; G 3126 -U 8868 ; WX 914 ; N uni22A4 ; G 3127 -U 8869 ; WX 914 ; N perpendicular ; G 3128 -U 8870 ; WX 542 ; N uni22A6 ; G 3129 -U 8871 ; WX 542 ; N uni22A7 ; G 3130 -U 8872 ; WX 914 ; N uni22A8 ; G 3131 -U 8873 ; WX 914 ; N uni22A9 ; G 3132 -U 8874 ; WX 914 ; N uni22AA ; G 3133 -U 8875 ; WX 914 ; N uni22AB ; G 3134 -U 8876 ; WX 914 ; N uni22AC ; G 3135 -U 8877 ; WX 914 ; N uni22AD ; G 3136 -U 8878 ; WX 914 ; N uni22AE ; G 3137 -U 8879 ; WX 914 ; N uni22AF ; G 3138 -U 8880 ; WX 838 ; N uni22B0 ; G 3139 -U 8881 ; WX 838 ; N uni22B1 ; G 3140 -U 8882 ; WX 838 ; N uni22B2 ; G 3141 -U 8883 ; WX 838 ; N uni22B3 ; G 3142 -U 8884 ; WX 838 ; N uni22B4 ; G 3143 -U 8885 ; WX 838 ; N uni22B5 ; G 3144 -U 8886 ; WX 1000 ; N uni22B6 ; G 3145 -U 8887 ; WX 1000 ; N uni22B7 ; G 3146 -U 8888 ; WX 838 ; N uni22B8 ; G 3147 -U 8889 ; WX 838 ; N uni22B9 ; G 3148 -U 8890 ; WX 542 ; N uni22BA ; G 3149 -U 8891 ; WX 812 ; N uni22BB ; G 3150 -U 8892 ; WX 812 ; N uni22BC ; G 3151 -U 8893 ; WX 812 ; N uni22BD ; G 3152 -U 8894 ; WX 838 ; N uni22BE ; G 3153 -U 8895 ; WX 838 ; N uni22BF ; G 3154 -U 8896 ; WX 843 ; N uni22C0 ; G 3155 -U 8897 ; WX 843 ; N uni22C1 ; G 3156 -U 8898 ; WX 843 ; N uni22C2 ; G 3157 -U 8899 ; WX 843 ; N uni22C3 ; G 3158 -U 8900 ; WX 626 ; N uni22C4 ; G 3159 -U 8901 ; WX 380 ; N dotmath ; G 3160 -U 8902 ; WX 626 ; N uni22C6 ; G 3161 -U 8903 ; WX 838 ; N uni22C7 ; G 3162 -U 8904 ; WX 1000 ; N uni22C8 ; G 3163 -U 8905 ; WX 1000 ; N uni22C9 ; G 3164 -U 8906 ; WX 1000 ; N uni22CA ; G 3165 -U 8907 ; WX 1000 ; N uni22CB ; G 3166 -U 8908 ; WX 1000 ; N uni22CC ; G 3167 -U 8909 ; WX 838 ; N uni22CD ; G 3168 -U 8910 ; WX 812 ; N uni22CE ; G 3169 -U 8911 ; WX 812 ; N uni22CF ; G 3170 -U 8912 ; WX 838 ; N uni22D0 ; G 3171 -U 8913 ; WX 838 ; N uni22D1 ; G 3172 -U 8914 ; WX 838 ; N uni22D2 ; G 3173 -U 8915 ; WX 838 ; N uni22D3 ; G 3174 -U 8916 ; WX 838 ; N uni22D4 ; G 3175 -U 8917 ; WX 838 ; N uni22D5 ; G 3176 -U 8918 ; WX 838 ; N uni22D6 ; G 3177 -U 8919 ; WX 838 ; N uni22D7 ; G 3178 -U 8920 ; WX 1422 ; N uni22D8 ; G 3179 -U 8921 ; WX 1422 ; N uni22D9 ; G 3180 -U 8922 ; WX 838 ; N uni22DA ; G 3181 -U 8923 ; WX 838 ; N uni22DB ; G 3182 -U 8924 ; WX 838 ; N uni22DC ; G 3183 -U 8925 ; WX 838 ; N uni22DD ; G 3184 -U 8926 ; WX 838 ; N uni22DE ; G 3185 -U 8927 ; WX 838 ; N uni22DF ; G 3186 -U 8928 ; WX 838 ; N uni22E0 ; G 3187 -U 8929 ; WX 838 ; N uni22E1 ; G 3188 -U 8930 ; WX 838 ; N uni22E2 ; G 3189 -U 8931 ; WX 838 ; N uni22E3 ; G 3190 -U 8932 ; WX 838 ; N uni22E4 ; G 3191 -U 8933 ; WX 838 ; N uni22E5 ; G 3192 -U 8934 ; WX 838 ; N uni22E6 ; G 3193 -U 8935 ; WX 838 ; N uni22E7 ; G 3194 -U 8936 ; WX 838 ; N uni22E8 ; G 3195 -U 8937 ; WX 838 ; N uni22E9 ; G 3196 -U 8938 ; WX 838 ; N uni22EA ; G 3197 -U 8939 ; WX 838 ; N uni22EB ; G 3198 -U 8940 ; WX 838 ; N uni22EC ; G 3199 -U 8941 ; WX 838 ; N uni22ED ; G 3200 -U 8942 ; WX 1000 ; N uni22EE ; G 3201 -U 8943 ; WX 1000 ; N uni22EF ; G 3202 -U 8944 ; WX 1000 ; N uni22F0 ; G 3203 -U 8945 ; WX 1000 ; N uni22F1 ; G 3204 -U 8946 ; WX 1158 ; N uni22F2 ; G 3205 -U 8947 ; WX 896 ; N uni22F3 ; G 3206 -U 8948 ; WX 750 ; N uni22F4 ; G 3207 -U 8949 ; WX 896 ; N uni22F5 ; G 3208 -U 8950 ; WX 896 ; N uni22F6 ; G 3209 -U 8951 ; WX 750 ; N uni22F7 ; G 3210 -U 8952 ; WX 896 ; N uni22F8 ; G 3211 -U 8953 ; WX 896 ; N uni22F9 ; G 3212 -U 8954 ; WX 1158 ; N uni22FA ; G 3213 -U 8955 ; WX 896 ; N uni22FB ; G 3214 -U 8956 ; WX 750 ; N uni22FC ; G 3215 -U 8957 ; WX 896 ; N uni22FD ; G 3216 -U 8958 ; WX 750 ; N uni22FE ; G 3217 -U 8959 ; WX 896 ; N uni22FF ; G 3218 -U 8960 ; WX 602 ; N uni2300 ; G 3219 -U 8961 ; WX 602 ; N uni2301 ; G 3220 -U 8962 ; WX 716 ; N house ; G 3221 -U 8963 ; WX 838 ; N uni2303 ; G 3222 -U 8964 ; WX 838 ; N uni2304 ; G 3223 -U 8965 ; WX 838 ; N uni2305 ; G 3224 -U 8966 ; WX 838 ; N uni2306 ; G 3225 -U 8967 ; WX 488 ; N uni2307 ; G 3226 -U 8968 ; WX 457 ; N uni2308 ; G 3227 -U 8969 ; WX 457 ; N uni2309 ; G 3228 -U 8970 ; WX 457 ; N uni230A ; G 3229 -U 8971 ; WX 457 ; N uni230B ; G 3230 -U 8972 ; WX 809 ; N uni230C ; G 3231 -U 8973 ; WX 809 ; N uni230D ; G 3232 -U 8974 ; WX 809 ; N uni230E ; G 3233 -U 8975 ; WX 809 ; N uni230F ; G 3234 -U 8976 ; WX 838 ; N revlogicalnot ; G 3235 -U 8977 ; WX 539 ; N uni2311 ; G 3236 -U 8984 ; WX 928 ; N uni2318 ; G 3237 -U 8985 ; WX 838 ; N uni2319 ; G 3238 -U 8988 ; WX 469 ; N uni231C ; G 3239 -U 8989 ; WX 469 ; N uni231D ; G 3240 -U 8990 ; WX 469 ; N uni231E ; G 3241 -U 8991 ; WX 469 ; N uni231F ; G 3242 -U 8992 ; WX 610 ; N integraltp ; G 3243 -U 8993 ; WX 610 ; N integralbt ; G 3244 -U 8996 ; WX 1152 ; N uni2324 ; G 3245 -U 8997 ; WX 1152 ; N uni2325 ; G 3246 -U 8998 ; WX 1414 ; N uni2326 ; G 3247 -U 8999 ; WX 1152 ; N uni2327 ; G 3248 -U 9000 ; WX 1443 ; N uni2328 ; G 3249 -U 9003 ; WX 1414 ; N uni232B ; G 3250 -U 9004 ; WX 873 ; N uni232C ; G 3251 -U 9075 ; WX 390 ; N uni2373 ; G 3252 -U 9076 ; WX 716 ; N uni2374 ; G 3253 -U 9077 ; WX 869 ; N uni2375 ; G 3254 -U 9082 ; WX 687 ; N uni237A ; G 3255 -U 9085 ; WX 863 ; N uni237D ; G 3256 -U 9095 ; WX 1152 ; N uni2387 ; G 3257 -U 9108 ; WX 873 ; N uni2394 ; G 3258 -U 9115 ; WX 500 ; N uni239B ; G 3259 -U 9116 ; WX 500 ; N uni239C ; G 3260 -U 9117 ; WX 500 ; N uni239D ; G 3261 -U 9118 ; WX 500 ; N uni239E ; G 3262 -U 9119 ; WX 500 ; N uni239F ; G 3263 -U 9120 ; WX 500 ; N uni23A0 ; G 3264 -U 9121 ; WX 500 ; N uni23A1 ; G 3265 -U 9122 ; WX 500 ; N uni23A2 ; G 3266 -U 9123 ; WX 500 ; N uni23A3 ; G 3267 -U 9124 ; WX 500 ; N uni23A4 ; G 3268 -U 9125 ; WX 500 ; N uni23A5 ; G 3269 -U 9126 ; WX 500 ; N uni23A6 ; G 3270 -U 9127 ; WX 750 ; N uni23A7 ; G 3271 -U 9128 ; WX 750 ; N uni23A8 ; G 3272 -U 9129 ; WX 750 ; N uni23A9 ; G 3273 -U 9130 ; WX 750 ; N uni23AA ; G 3274 -U 9131 ; WX 750 ; N uni23AB ; G 3275 -U 9132 ; WX 750 ; N uni23AC ; G 3276 -U 9133 ; WX 750 ; N uni23AD ; G 3277 -U 9134 ; WX 610 ; N uni23AE ; G 3278 -U 9166 ; WX 838 ; N uni23CE ; G 3279 -U 9167 ; WX 945 ; N uni23CF ; G 3280 -U 9187 ; WX 873 ; N uni23E3 ; G 3281 -U 9189 ; WX 769 ; N uni23E5 ; G 3282 -U 9192 ; WX 696 ; N uni23E8 ; G 3283 -U 9250 ; WX 716 ; N uni2422 ; G 3284 -U 9251 ; WX 716 ; N uni2423 ; G 3285 -U 9312 ; WX 847 ; N uni2460 ; G 3286 -U 9313 ; WX 847 ; N uni2461 ; G 3287 -U 9314 ; WX 847 ; N uni2462 ; G 3288 -U 9315 ; WX 847 ; N uni2463 ; G 3289 -U 9316 ; WX 847 ; N uni2464 ; G 3290 -U 9317 ; WX 847 ; N uni2465 ; G 3291 -U 9318 ; WX 847 ; N uni2466 ; G 3292 -U 9319 ; WX 847 ; N uni2467 ; G 3293 -U 9320 ; WX 847 ; N uni2468 ; G 3294 -U 9321 ; WX 847 ; N uni2469 ; G 3295 -U 9472 ; WX 602 ; N SF100000 ; G 3296 -U 9473 ; WX 602 ; N uni2501 ; G 3297 -U 9474 ; WX 602 ; N SF110000 ; G 3298 -U 9475 ; WX 602 ; N uni2503 ; G 3299 -U 9476 ; WX 602 ; N uni2504 ; G 3300 -U 9477 ; WX 602 ; N uni2505 ; G 3301 -U 9478 ; WX 602 ; N uni2506 ; G 3302 -U 9479 ; WX 602 ; N uni2507 ; G 3303 -U 9480 ; WX 602 ; N uni2508 ; G 3304 -U 9481 ; WX 602 ; N uni2509 ; G 3305 -U 9482 ; WX 602 ; N uni250A ; G 3306 -U 9483 ; WX 602 ; N uni250B ; G 3307 -U 9484 ; WX 602 ; N SF010000 ; G 3308 -U 9485 ; WX 602 ; N uni250D ; G 3309 -U 9486 ; WX 602 ; N uni250E ; G 3310 -U 9487 ; WX 602 ; N uni250F ; G 3311 -U 9488 ; WX 602 ; N SF030000 ; G 3312 -U 9489 ; WX 602 ; N uni2511 ; G 3313 -U 9490 ; WX 602 ; N uni2512 ; G 3314 -U 9491 ; WX 602 ; N uni2513 ; G 3315 -U 9492 ; WX 602 ; N SF020000 ; G 3316 -U 9493 ; WX 602 ; N uni2515 ; G 3317 -U 9494 ; WX 602 ; N uni2516 ; G 3318 -U 9495 ; WX 602 ; N uni2517 ; G 3319 -U 9496 ; WX 602 ; N SF040000 ; G 3320 -U 9497 ; WX 602 ; N uni2519 ; G 3321 -U 9498 ; WX 602 ; N uni251A ; G 3322 -U 9499 ; WX 602 ; N uni251B ; G 3323 -U 9500 ; WX 602 ; N SF080000 ; G 3324 -U 9501 ; WX 602 ; N uni251D ; G 3325 -U 9502 ; WX 602 ; N uni251E ; G 3326 -U 9503 ; WX 602 ; N uni251F ; G 3327 -U 9504 ; WX 602 ; N uni2520 ; G 3328 -U 9505 ; WX 602 ; N uni2521 ; G 3329 -U 9506 ; WX 602 ; N uni2522 ; G 3330 -U 9507 ; WX 602 ; N uni2523 ; G 3331 -U 9508 ; WX 602 ; N SF090000 ; G 3332 -U 9509 ; WX 602 ; N uni2525 ; G 3333 -U 9510 ; WX 602 ; N uni2526 ; G 3334 -U 9511 ; WX 602 ; N uni2527 ; G 3335 -U 9512 ; WX 602 ; N uni2528 ; G 3336 -U 9513 ; WX 602 ; N uni2529 ; G 3337 -U 9514 ; WX 602 ; N uni252A ; G 3338 -U 9515 ; WX 602 ; N uni252B ; G 3339 -U 9516 ; WX 602 ; N SF060000 ; G 3340 -U 9517 ; WX 602 ; N uni252D ; G 3341 -U 9518 ; WX 602 ; N uni252E ; G 3342 -U 9519 ; WX 602 ; N uni252F ; G 3343 -U 9520 ; WX 602 ; N uni2530 ; G 3344 -U 9521 ; WX 602 ; N uni2531 ; G 3345 -U 9522 ; WX 602 ; N uni2532 ; G 3346 -U 9523 ; WX 602 ; N uni2533 ; G 3347 -U 9524 ; WX 602 ; N SF070000 ; G 3348 -U 9525 ; WX 602 ; N uni2535 ; G 3349 -U 9526 ; WX 602 ; N uni2536 ; G 3350 -U 9527 ; WX 602 ; N uni2537 ; G 3351 -U 9528 ; WX 602 ; N uni2538 ; G 3352 -U 9529 ; WX 602 ; N uni2539 ; G 3353 -U 9530 ; WX 602 ; N uni253A ; G 3354 -U 9531 ; WX 602 ; N uni253B ; G 3355 -U 9532 ; WX 602 ; N SF050000 ; G 3356 -U 9533 ; WX 602 ; N uni253D ; G 3357 -U 9534 ; WX 602 ; N uni253E ; G 3358 -U 9535 ; WX 602 ; N uni253F ; G 3359 -U 9536 ; WX 602 ; N uni2540 ; G 3360 -U 9537 ; WX 602 ; N uni2541 ; G 3361 -U 9538 ; WX 602 ; N uni2542 ; G 3362 -U 9539 ; WX 602 ; N uni2543 ; G 3363 -U 9540 ; WX 602 ; N uni2544 ; G 3364 -U 9541 ; WX 602 ; N uni2545 ; G 3365 -U 9542 ; WX 602 ; N uni2546 ; G 3366 -U 9543 ; WX 602 ; N uni2547 ; G 3367 -U 9544 ; WX 602 ; N uni2548 ; G 3368 -U 9545 ; WX 602 ; N uni2549 ; G 3369 -U 9546 ; WX 602 ; N uni254A ; G 3370 -U 9547 ; WX 602 ; N uni254B ; G 3371 -U 9548 ; WX 602 ; N uni254C ; G 3372 -U 9549 ; WX 602 ; N uni254D ; G 3373 -U 9550 ; WX 602 ; N uni254E ; G 3374 -U 9551 ; WX 602 ; N uni254F ; G 3375 -U 9552 ; WX 602 ; N SF430000 ; G 3376 -U 9553 ; WX 602 ; N SF240000 ; G 3377 -U 9554 ; WX 602 ; N SF510000 ; G 3378 -U 9555 ; WX 602 ; N SF520000 ; G 3379 -U 9556 ; WX 602 ; N SF390000 ; G 3380 -U 9557 ; WX 602 ; N SF220000 ; G 3381 -U 9558 ; WX 602 ; N SF210000 ; G 3382 -U 9559 ; WX 602 ; N SF250000 ; G 3383 -U 9560 ; WX 602 ; N SF500000 ; G 3384 -U 9561 ; WX 602 ; N SF490000 ; G 3385 -U 9562 ; WX 602 ; N SF380000 ; G 3386 -U 9563 ; WX 602 ; N SF280000 ; G 3387 -U 9564 ; WX 602 ; N SF270000 ; G 3388 -U 9565 ; WX 602 ; N SF260000 ; G 3389 -U 9566 ; WX 602 ; N SF360000 ; G 3390 -U 9567 ; WX 602 ; N SF370000 ; G 3391 -U 9568 ; WX 602 ; N SF420000 ; G 3392 -U 9569 ; WX 602 ; N SF190000 ; G 3393 -U 9570 ; WX 602 ; N SF200000 ; G 3394 -U 9571 ; WX 602 ; N SF230000 ; G 3395 -U 9572 ; WX 602 ; N SF470000 ; G 3396 -U 9573 ; WX 602 ; N SF480000 ; G 3397 -U 9574 ; WX 602 ; N SF410000 ; G 3398 -U 9575 ; WX 602 ; N SF450000 ; G 3399 -U 9576 ; WX 602 ; N SF460000 ; G 3400 -U 9577 ; WX 602 ; N SF400000 ; G 3401 -U 9578 ; WX 602 ; N SF540000 ; G 3402 -U 9579 ; WX 602 ; N SF530000 ; G 3403 -U 9580 ; WX 602 ; N SF440000 ; G 3404 -U 9581 ; WX 602 ; N uni256D ; G 3405 -U 9582 ; WX 602 ; N uni256E ; G 3406 -U 9583 ; WX 602 ; N uni256F ; G 3407 -U 9584 ; WX 602 ; N uni2570 ; G 3408 -U 9585 ; WX 602 ; N uni2571 ; G 3409 -U 9586 ; WX 602 ; N uni2572 ; G 3410 -U 9587 ; WX 602 ; N uni2573 ; G 3411 -U 9588 ; WX 602 ; N uni2574 ; G 3412 -U 9589 ; WX 602 ; N uni2575 ; G 3413 -U 9590 ; WX 602 ; N uni2576 ; G 3414 -U 9591 ; WX 602 ; N uni2577 ; G 3415 -U 9592 ; WX 602 ; N uni2578 ; G 3416 -U 9593 ; WX 602 ; N uni2579 ; G 3417 -U 9594 ; WX 602 ; N uni257A ; G 3418 -U 9595 ; WX 602 ; N uni257B ; G 3419 -U 9596 ; WX 602 ; N uni257C ; G 3420 -U 9597 ; WX 602 ; N uni257D ; G 3421 -U 9598 ; WX 602 ; N uni257E ; G 3422 -U 9599 ; WX 602 ; N uni257F ; G 3423 -U 9600 ; WX 769 ; N upblock ; G 3424 -U 9601 ; WX 769 ; N uni2581 ; G 3425 -U 9602 ; WX 769 ; N uni2582 ; G 3426 -U 9603 ; WX 769 ; N uni2583 ; G 3427 -U 9604 ; WX 769 ; N dnblock ; G 3428 -U 9605 ; WX 769 ; N uni2585 ; G 3429 -U 9606 ; WX 769 ; N uni2586 ; G 3430 -U 9607 ; WX 769 ; N uni2587 ; G 3431 -U 9608 ; WX 769 ; N block ; G 3432 -U 9609 ; WX 769 ; N uni2589 ; G 3433 -U 9610 ; WX 769 ; N uni258A ; G 3434 -U 9611 ; WX 769 ; N uni258B ; G 3435 -U 9612 ; WX 769 ; N lfblock ; G 3436 -U 9613 ; WX 769 ; N uni258D ; G 3437 -U 9614 ; WX 769 ; N uni258E ; G 3438 -U 9615 ; WX 769 ; N uni258F ; G 3439 -U 9616 ; WX 769 ; N rtblock ; G 3440 -U 9617 ; WX 769 ; N ltshade ; G 3441 -U 9618 ; WX 769 ; N shade ; G 3442 -U 9619 ; WX 769 ; N dkshade ; G 3443 -U 9620 ; WX 769 ; N uni2594 ; G 3444 -U 9621 ; WX 769 ; N uni2595 ; G 3445 -U 9622 ; WX 769 ; N uni2596 ; G 3446 -U 9623 ; WX 769 ; N uni2597 ; G 3447 -U 9624 ; WX 769 ; N uni2598 ; G 3448 -U 9625 ; WX 769 ; N uni2599 ; G 3449 -U 9626 ; WX 769 ; N uni259A ; G 3450 -U 9627 ; WX 769 ; N uni259B ; G 3451 -U 9628 ; WX 769 ; N uni259C ; G 3452 -U 9629 ; WX 769 ; N uni259D ; G 3453 -U 9630 ; WX 769 ; N uni259E ; G 3454 -U 9631 ; WX 769 ; N uni259F ; G 3455 -U 9632 ; WX 945 ; N filledbox ; G 3456 -U 9633 ; WX 945 ; N H22073 ; G 3457 -U 9634 ; WX 945 ; N uni25A2 ; G 3458 -U 9635 ; WX 945 ; N uni25A3 ; G 3459 -U 9636 ; WX 945 ; N uni25A4 ; G 3460 -U 9637 ; WX 945 ; N uni25A5 ; G 3461 -U 9638 ; WX 945 ; N uni25A6 ; G 3462 -U 9639 ; WX 945 ; N uni25A7 ; G 3463 -U 9640 ; WX 945 ; N uni25A8 ; G 3464 -U 9641 ; WX 945 ; N uni25A9 ; G 3465 -U 9642 ; WX 678 ; N H18543 ; G 3466 -U 9643 ; WX 678 ; N H18551 ; G 3467 -U 9644 ; WX 945 ; N filledrect ; G 3468 -U 9645 ; WX 945 ; N uni25AD ; G 3469 -U 9646 ; WX 550 ; N uni25AE ; G 3470 -U 9647 ; WX 550 ; N uni25AF ; G 3471 -U 9648 ; WX 769 ; N uni25B0 ; G 3472 -U 9649 ; WX 769 ; N uni25B1 ; G 3473 -U 9650 ; WX 769 ; N triagup ; G 3474 -U 9651 ; WX 769 ; N uni25B3 ; G 3475 -U 9652 ; WX 502 ; N uni25B4 ; G 3476 -U 9653 ; WX 502 ; N uni25B5 ; G 3477 -U 9654 ; WX 769 ; N uni25B6 ; G 3478 -U 9655 ; WX 769 ; N uni25B7 ; G 3479 -U 9656 ; WX 502 ; N uni25B8 ; G 3480 -U 9657 ; WX 502 ; N uni25B9 ; G 3481 -U 9658 ; WX 769 ; N triagrt ; G 3482 -U 9659 ; WX 769 ; N uni25BB ; G 3483 -U 9660 ; WX 769 ; N triagdn ; G 3484 -U 9661 ; WX 769 ; N uni25BD ; G 3485 -U 9662 ; WX 502 ; N uni25BE ; G 3486 -U 9663 ; WX 502 ; N uni25BF ; G 3487 -U 9664 ; WX 769 ; N uni25C0 ; G 3488 -U 9665 ; WX 769 ; N uni25C1 ; G 3489 -U 9666 ; WX 502 ; N uni25C2 ; G 3490 -U 9667 ; WX 502 ; N uni25C3 ; G 3491 -U 9668 ; WX 769 ; N triaglf ; G 3492 -U 9669 ; WX 769 ; N uni25C5 ; G 3493 -U 9670 ; WX 769 ; N uni25C6 ; G 3494 -U 9671 ; WX 769 ; N uni25C7 ; G 3495 -U 9672 ; WX 769 ; N uni25C8 ; G 3496 -U 9673 ; WX 873 ; N uni25C9 ; G 3497 -U 9674 ; WX 494 ; N lozenge ; G 3498 -U 9675 ; WX 873 ; N circle ; G 3499 -U 9676 ; WX 873 ; N uni25CC ; G 3500 -U 9677 ; WX 873 ; N uni25CD ; G 3501 -U 9678 ; WX 873 ; N uni25CE ; G 3502 -U 9679 ; WX 873 ; N H18533 ; G 3503 -U 9680 ; WX 873 ; N uni25D0 ; G 3504 -U 9681 ; WX 873 ; N uni25D1 ; G 3505 -U 9682 ; WX 873 ; N uni25D2 ; G 3506 -U 9683 ; WX 873 ; N uni25D3 ; G 3507 -U 9684 ; WX 873 ; N uni25D4 ; G 3508 -U 9685 ; WX 873 ; N uni25D5 ; G 3509 -U 9686 ; WX 527 ; N uni25D6 ; G 3510 -U 9687 ; WX 527 ; N uni25D7 ; G 3511 -U 9688 ; WX 840 ; N invbullet ; G 3512 -U 9689 ; WX 970 ; N invcircle ; G 3513 -U 9690 ; WX 970 ; N uni25DA ; G 3514 -U 9691 ; WX 970 ; N uni25DB ; G 3515 -U 9692 ; WX 387 ; N uni25DC ; G 3516 -U 9693 ; WX 387 ; N uni25DD ; G 3517 -U 9694 ; WX 387 ; N uni25DE ; G 3518 -U 9695 ; WX 387 ; N uni25DF ; G 3519 -U 9696 ; WX 769 ; N uni25E0 ; G 3520 -U 9697 ; WX 769 ; N uni25E1 ; G 3521 -U 9698 ; WX 769 ; N uni25E2 ; G 3522 -U 9699 ; WX 769 ; N uni25E3 ; G 3523 -U 9700 ; WX 769 ; N uni25E4 ; G 3524 -U 9701 ; WX 769 ; N uni25E5 ; G 3525 -U 9702 ; WX 639 ; N openbullet ; G 3526 -U 9703 ; WX 945 ; N uni25E7 ; G 3527 -U 9704 ; WX 945 ; N uni25E8 ; G 3528 -U 9705 ; WX 945 ; N uni25E9 ; G 3529 -U 9706 ; WX 945 ; N uni25EA ; G 3530 -U 9707 ; WX 945 ; N uni25EB ; G 3531 -U 9708 ; WX 769 ; N uni25EC ; G 3532 -U 9709 ; WX 769 ; N uni25ED ; G 3533 -U 9710 ; WX 769 ; N uni25EE ; G 3534 -U 9711 ; WX 1119 ; N uni25EF ; G 3535 -U 9712 ; WX 945 ; N uni25F0 ; G 3536 -U 9713 ; WX 945 ; N uni25F1 ; G 3537 -U 9714 ; WX 945 ; N uni25F2 ; G 3538 -U 9715 ; WX 945 ; N uni25F3 ; G 3539 -U 9716 ; WX 873 ; N uni25F4 ; G 3540 -U 9717 ; WX 873 ; N uni25F5 ; G 3541 -U 9718 ; WX 873 ; N uni25F6 ; G 3542 -U 9719 ; WX 873 ; N uni25F7 ; G 3543 -U 9720 ; WX 769 ; N uni25F8 ; G 3544 -U 9721 ; WX 769 ; N uni25F9 ; G 3545 -U 9722 ; WX 769 ; N uni25FA ; G 3546 -U 9723 ; WX 830 ; N uni25FB ; G 3547 -U 9724 ; WX 830 ; N uni25FC ; G 3548 -U 9725 ; WX 732 ; N uni25FD ; G 3549 -U 9726 ; WX 732 ; N uni25FE ; G 3550 -U 9727 ; WX 769 ; N uni25FF ; G 3551 -U 9728 ; WX 896 ; N uni2600 ; G 3552 -U 9729 ; WX 1000 ; N uni2601 ; G 3553 -U 9730 ; WX 896 ; N uni2602 ; G 3554 -U 9731 ; WX 896 ; N uni2603 ; G 3555 -U 9732 ; WX 896 ; N uni2604 ; G 3556 -U 9733 ; WX 896 ; N uni2605 ; G 3557 -U 9734 ; WX 896 ; N uni2606 ; G 3558 -U 9735 ; WX 573 ; N uni2607 ; G 3559 -U 9736 ; WX 896 ; N uni2608 ; G 3560 -U 9737 ; WX 896 ; N uni2609 ; G 3561 -U 9738 ; WX 888 ; N uni260A ; G 3562 -U 9739 ; WX 888 ; N uni260B ; G 3563 -U 9740 ; WX 671 ; N uni260C ; G 3564 -U 9741 ; WX 1013 ; N uni260D ; G 3565 -U 9742 ; WX 1246 ; N uni260E ; G 3566 -U 9743 ; WX 1250 ; N uni260F ; G 3567 -U 9744 ; WX 896 ; N uni2610 ; G 3568 -U 9745 ; WX 896 ; N uni2611 ; G 3569 -U 9746 ; WX 896 ; N uni2612 ; G 3570 -U 9747 ; WX 532 ; N uni2613 ; G 3571 -U 9748 ; WX 896 ; N uni2614 ; G 3572 -U 9749 ; WX 896 ; N uni2615 ; G 3573 -U 9750 ; WX 896 ; N uni2616 ; G 3574 -U 9751 ; WX 896 ; N uni2617 ; G 3575 -U 9752 ; WX 896 ; N uni2618 ; G 3576 -U 9753 ; WX 896 ; N uni2619 ; G 3577 -U 9754 ; WX 896 ; N uni261A ; G 3578 -U 9755 ; WX 896 ; N uni261B ; G 3579 -U 9756 ; WX 896 ; N uni261C ; G 3580 -U 9757 ; WX 609 ; N uni261D ; G 3581 -U 9758 ; WX 896 ; N uni261E ; G 3582 -U 9759 ; WX 609 ; N uni261F ; G 3583 -U 9760 ; WX 896 ; N uni2620 ; G 3584 -U 9761 ; WX 896 ; N uni2621 ; G 3585 -U 9762 ; WX 896 ; N uni2622 ; G 3586 -U 9763 ; WX 896 ; N uni2623 ; G 3587 -U 9764 ; WX 669 ; N uni2624 ; G 3588 -U 9765 ; WX 746 ; N uni2625 ; G 3589 -U 9766 ; WX 649 ; N uni2626 ; G 3590 -U 9767 ; WX 784 ; N uni2627 ; G 3591 -U 9768 ; WX 545 ; N uni2628 ; G 3592 -U 9769 ; WX 896 ; N uni2629 ; G 3593 -U 9770 ; WX 896 ; N uni262A ; G 3594 -U 9771 ; WX 896 ; N uni262B ; G 3595 -U 9772 ; WX 710 ; N uni262C ; G 3596 -U 9773 ; WX 896 ; N uni262D ; G 3597 -U 9774 ; WX 896 ; N uni262E ; G 3598 -U 9775 ; WX 896 ; N uni262F ; G 3599 -U 9776 ; WX 896 ; N uni2630 ; G 3600 -U 9777 ; WX 896 ; N uni2631 ; G 3601 -U 9778 ; WX 896 ; N uni2632 ; G 3602 -U 9779 ; WX 896 ; N uni2633 ; G 3603 -U 9780 ; WX 896 ; N uni2634 ; G 3604 -U 9781 ; WX 896 ; N uni2635 ; G 3605 -U 9782 ; WX 896 ; N uni2636 ; G 3606 -U 9783 ; WX 896 ; N uni2637 ; G 3607 -U 9784 ; WX 896 ; N uni2638 ; G 3608 -U 9785 ; WX 1042 ; N uni2639 ; G 3609 -U 9786 ; WX 1042 ; N smileface ; G 3610 -U 9787 ; WX 1042 ; N invsmileface ; G 3611 -U 9788 ; WX 896 ; N sun ; G 3612 -U 9789 ; WX 896 ; N uni263D ; G 3613 -U 9790 ; WX 896 ; N uni263E ; G 3614 -U 9791 ; WX 614 ; N uni263F ; G 3615 -U 9792 ; WX 732 ; N female ; G 3616 -U 9793 ; WX 732 ; N uni2641 ; G 3617 -U 9794 ; WX 896 ; N male ; G 3618 -U 9795 ; WX 896 ; N uni2643 ; G 3619 -U 9796 ; WX 896 ; N uni2644 ; G 3620 -U 9797 ; WX 896 ; N uni2645 ; G 3621 -U 9798 ; WX 896 ; N uni2646 ; G 3622 -U 9799 ; WX 896 ; N uni2647 ; G 3623 -U 9800 ; WX 896 ; N uni2648 ; G 3624 -U 9801 ; WX 896 ; N uni2649 ; G 3625 -U 9802 ; WX 896 ; N uni264A ; G 3626 -U 9803 ; WX 896 ; N uni264B ; G 3627 -U 9804 ; WX 896 ; N uni264C ; G 3628 -U 9805 ; WX 896 ; N uni264D ; G 3629 -U 9806 ; WX 896 ; N uni264E ; G 3630 -U 9807 ; WX 896 ; N uni264F ; G 3631 -U 9808 ; WX 896 ; N uni2650 ; G 3632 -U 9809 ; WX 896 ; N uni2651 ; G 3633 -U 9810 ; WX 896 ; N uni2652 ; G 3634 -U 9811 ; WX 896 ; N uni2653 ; G 3635 -U 9812 ; WX 896 ; N uni2654 ; G 3636 -U 9813 ; WX 896 ; N uni2655 ; G 3637 -U 9814 ; WX 896 ; N uni2656 ; G 3638 -U 9815 ; WX 896 ; N uni2657 ; G 3639 -U 9816 ; WX 896 ; N uni2658 ; G 3640 -U 9817 ; WX 896 ; N uni2659 ; G 3641 -U 9818 ; WX 896 ; N uni265A ; G 3642 -U 9819 ; WX 896 ; N uni265B ; G 3643 -U 9820 ; WX 896 ; N uni265C ; G 3644 -U 9821 ; WX 896 ; N uni265D ; G 3645 -U 9822 ; WX 896 ; N uni265E ; G 3646 -U 9823 ; WX 896 ; N uni265F ; G 3647 -U 9824 ; WX 896 ; N spade ; G 3648 -U 9825 ; WX 896 ; N uni2661 ; G 3649 -U 9826 ; WX 896 ; N uni2662 ; G 3650 -U 9827 ; WX 896 ; N club ; G 3651 -U 9828 ; WX 896 ; N uni2664 ; G 3652 -U 9829 ; WX 896 ; N heart ; G 3653 -U 9830 ; WX 896 ; N diamond ; G 3654 -U 9831 ; WX 896 ; N uni2667 ; G 3655 -U 9832 ; WX 896 ; N uni2668 ; G 3656 -U 9833 ; WX 472 ; N uni2669 ; G 3657 -U 9834 ; WX 638 ; N musicalnote ; G 3658 -U 9835 ; WX 896 ; N musicalnotedbl ; G 3659 -U 9836 ; WX 896 ; N uni266C ; G 3660 -U 9837 ; WX 472 ; N uni266D ; G 3661 -U 9838 ; WX 357 ; N uni266E ; G 3662 -U 9839 ; WX 484 ; N uni266F ; G 3663 -U 9840 ; WX 748 ; N uni2670 ; G 3664 -U 9841 ; WX 766 ; N uni2671 ; G 3665 -U 9842 ; WX 896 ; N uni2672 ; G 3666 -U 9843 ; WX 896 ; N uni2673 ; G 3667 -U 9844 ; WX 896 ; N uni2674 ; G 3668 -U 9845 ; WX 896 ; N uni2675 ; G 3669 -U 9846 ; WX 896 ; N uni2676 ; G 3670 -U 9847 ; WX 896 ; N uni2677 ; G 3671 -U 9848 ; WX 896 ; N uni2678 ; G 3672 -U 9849 ; WX 896 ; N uni2679 ; G 3673 -U 9850 ; WX 896 ; N uni267A ; G 3674 -U 9851 ; WX 896 ; N uni267B ; G 3675 -U 9852 ; WX 896 ; N uni267C ; G 3676 -U 9853 ; WX 896 ; N uni267D ; G 3677 -U 9854 ; WX 896 ; N uni267E ; G 3678 -U 9855 ; WX 896 ; N uni267F ; G 3679 -U 9856 ; WX 869 ; N uni2680 ; G 3680 -U 9857 ; WX 869 ; N uni2681 ; G 3681 -U 9858 ; WX 869 ; N uni2682 ; G 3682 -U 9859 ; WX 869 ; N uni2683 ; G 3683 -U 9860 ; WX 869 ; N uni2684 ; G 3684 -U 9861 ; WX 869 ; N uni2685 ; G 3685 -U 9862 ; WX 896 ; N uni2686 ; G 3686 -U 9863 ; WX 896 ; N uni2687 ; G 3687 -U 9864 ; WX 896 ; N uni2688 ; G 3688 -U 9865 ; WX 896 ; N uni2689 ; G 3689 -U 9866 ; WX 896 ; N uni268A ; G 3690 -U 9867 ; WX 896 ; N uni268B ; G 3691 -U 9868 ; WX 896 ; N uni268C ; G 3692 -U 9869 ; WX 896 ; N uni268D ; G 3693 -U 9870 ; WX 896 ; N uni268E ; G 3694 -U 9871 ; WX 896 ; N uni268F ; G 3695 -U 9872 ; WX 896 ; N uni2690 ; G 3696 -U 9873 ; WX 896 ; N uni2691 ; G 3697 -U 9874 ; WX 896 ; N uni2692 ; G 3698 -U 9875 ; WX 896 ; N uni2693 ; G 3699 -U 9876 ; WX 896 ; N uni2694 ; G 3700 -U 9877 ; WX 541 ; N uni2695 ; G 3701 -U 9878 ; WX 896 ; N uni2696 ; G 3702 -U 9879 ; WX 896 ; N uni2697 ; G 3703 -U 9880 ; WX 896 ; N uni2698 ; G 3704 -U 9881 ; WX 896 ; N uni2699 ; G 3705 -U 9882 ; WX 896 ; N uni269A ; G 3706 -U 9883 ; WX 896 ; N uni269B ; G 3707 -U 9884 ; WX 896 ; N uni269C ; G 3708 -U 9886 ; WX 896 ; N uni269E ; G 3709 -U 9887 ; WX 896 ; N uni269F ; G 3710 -U 9888 ; WX 896 ; N uni26A0 ; G 3711 -U 9889 ; WX 702 ; N uni26A1 ; G 3712 -U 9890 ; WX 1004 ; N uni26A2 ; G 3713 -U 9891 ; WX 1089 ; N uni26A3 ; G 3714 -U 9892 ; WX 1175 ; N uni26A4 ; G 3715 -U 9893 ; WX 903 ; N uni26A5 ; G 3716 -U 9894 ; WX 838 ; N uni26A6 ; G 3717 -U 9895 ; WX 838 ; N uni26A7 ; G 3718 -U 9896 ; WX 838 ; N uni26A8 ; G 3719 -U 9897 ; WX 838 ; N uni26A9 ; G 3720 -U 9898 ; WX 838 ; N uni26AA ; G 3721 -U 9899 ; WX 838 ; N uni26AB ; G 3722 -U 9900 ; WX 838 ; N uni26AC ; G 3723 -U 9901 ; WX 838 ; N uni26AD ; G 3724 -U 9902 ; WX 838 ; N uni26AE ; G 3725 -U 9903 ; WX 838 ; N uni26AF ; G 3726 -U 9904 ; WX 844 ; N uni26B0 ; G 3727 -U 9905 ; WX 838 ; N uni26B1 ; G 3728 -U 9906 ; WX 732 ; N uni26B2 ; G 3729 -U 9907 ; WX 732 ; N uni26B3 ; G 3730 -U 9908 ; WX 732 ; N uni26B4 ; G 3731 -U 9909 ; WX 732 ; N uni26B5 ; G 3732 -U 9910 ; WX 850 ; N uni26B6 ; G 3733 -U 9911 ; WX 732 ; N uni26B7 ; G 3734 -U 9912 ; WX 732 ; N uni26B8 ; G 3735 -U 9920 ; WX 838 ; N uni26C0 ; G 3736 -U 9921 ; WX 838 ; N uni26C1 ; G 3737 -U 9922 ; WX 838 ; N uni26C2 ; G 3738 -U 9923 ; WX 838 ; N uni26C3 ; G 3739 -U 9954 ; WX 732 ; N uni26E2 ; G 3740 -U 9985 ; WX 838 ; N uni2701 ; G 3741 -U 9986 ; WX 838 ; N uni2702 ; G 3742 -U 9987 ; WX 838 ; N uni2703 ; G 3743 -U 9988 ; WX 838 ; N uni2704 ; G 3744 -U 9990 ; WX 838 ; N uni2706 ; G 3745 -U 9991 ; WX 838 ; N uni2707 ; G 3746 -U 9992 ; WX 838 ; N uni2708 ; G 3747 -U 9993 ; WX 838 ; N uni2709 ; G 3748 -U 9996 ; WX 838 ; N uni270C ; G 3749 -U 9997 ; WX 838 ; N uni270D ; G 3750 -U 9998 ; WX 838 ; N uni270E ; G 3751 -U 9999 ; WX 838 ; N uni270F ; G 3752 -U 10000 ; WX 838 ; N uni2710 ; G 3753 -U 10001 ; WX 838 ; N uni2711 ; G 3754 -U 10002 ; WX 838 ; N uni2712 ; G 3755 -U 10003 ; WX 838 ; N uni2713 ; G 3756 -U 10004 ; WX 838 ; N uni2714 ; G 3757 -U 10005 ; WX 838 ; N uni2715 ; G 3758 -U 10006 ; WX 838 ; N uni2716 ; G 3759 -U 10007 ; WX 838 ; N uni2717 ; G 3760 -U 10008 ; WX 838 ; N uni2718 ; G 3761 -U 10009 ; WX 838 ; N uni2719 ; G 3762 -U 10010 ; WX 838 ; N uni271A ; G 3763 -U 10011 ; WX 838 ; N uni271B ; G 3764 -U 10012 ; WX 838 ; N uni271C ; G 3765 -U 10013 ; WX 838 ; N uni271D ; G 3766 -U 10014 ; WX 838 ; N uni271E ; G 3767 -U 10015 ; WX 838 ; N uni271F ; G 3768 -U 10016 ; WX 838 ; N uni2720 ; G 3769 -U 10017 ; WX 838 ; N uni2721 ; G 3770 -U 10018 ; WX 838 ; N uni2722 ; G 3771 -U 10019 ; WX 838 ; N uni2723 ; G 3772 -U 10020 ; WX 838 ; N uni2724 ; G 3773 -U 10021 ; WX 838 ; N uni2725 ; G 3774 -U 10022 ; WX 838 ; N uni2726 ; G 3775 -U 10023 ; WX 838 ; N uni2727 ; G 3776 -U 10025 ; WX 838 ; N uni2729 ; G 3777 -U 10026 ; WX 838 ; N uni272A ; G 3778 -U 10027 ; WX 838 ; N uni272B ; G 3779 -U 10028 ; WX 838 ; N uni272C ; G 3780 -U 10029 ; WX 838 ; N uni272D ; G 3781 -U 10030 ; WX 838 ; N uni272E ; G 3782 -U 10031 ; WX 838 ; N uni272F ; G 3783 -U 10032 ; WX 838 ; N uni2730 ; G 3784 -U 10033 ; WX 838 ; N uni2731 ; G 3785 -U 10034 ; WX 838 ; N uni2732 ; G 3786 -U 10035 ; WX 838 ; N uni2733 ; G 3787 -U 10036 ; WX 838 ; N uni2734 ; G 3788 -U 10037 ; WX 838 ; N uni2735 ; G 3789 -U 10038 ; WX 838 ; N uni2736 ; G 3790 -U 10039 ; WX 838 ; N uni2737 ; G 3791 -U 10040 ; WX 838 ; N uni2738 ; G 3792 -U 10041 ; WX 838 ; N uni2739 ; G 3793 -U 10042 ; WX 838 ; N uni273A ; G 3794 -U 10043 ; WX 838 ; N uni273B ; G 3795 -U 10044 ; WX 838 ; N uni273C ; G 3796 -U 10045 ; WX 838 ; N uni273D ; G 3797 -U 10046 ; WX 838 ; N uni273E ; G 3798 -U 10047 ; WX 838 ; N uni273F ; G 3799 -U 10048 ; WX 838 ; N uni2740 ; G 3800 -U 10049 ; WX 838 ; N uni2741 ; G 3801 -U 10050 ; WX 838 ; N uni2742 ; G 3802 -U 10051 ; WX 838 ; N uni2743 ; G 3803 -U 10052 ; WX 838 ; N uni2744 ; G 3804 -U 10053 ; WX 838 ; N uni2745 ; G 3805 -U 10054 ; WX 838 ; N uni2746 ; G 3806 -U 10055 ; WX 838 ; N uni2747 ; G 3807 -U 10056 ; WX 838 ; N uni2748 ; G 3808 -U 10057 ; WX 838 ; N uni2749 ; G 3809 -U 10058 ; WX 838 ; N uni274A ; G 3810 -U 10059 ; WX 838 ; N uni274B ; G 3811 -U 10061 ; WX 896 ; N uni274D ; G 3812 -U 10063 ; WX 896 ; N uni274F ; G 3813 -U 10064 ; WX 896 ; N uni2750 ; G 3814 -U 10065 ; WX 896 ; N uni2751 ; G 3815 -U 10066 ; WX 896 ; N uni2752 ; G 3816 -U 10070 ; WX 896 ; N uni2756 ; G 3817 -U 10072 ; WX 838 ; N uni2758 ; G 3818 -U 10073 ; WX 838 ; N uni2759 ; G 3819 -U 10074 ; WX 838 ; N uni275A ; G 3820 -U 10075 ; WX 322 ; N uni275B ; G 3821 -U 10076 ; WX 322 ; N uni275C ; G 3822 -U 10077 ; WX 538 ; N uni275D ; G 3823 -U 10078 ; WX 538 ; N uni275E ; G 3824 -U 10081 ; WX 838 ; N uni2761 ; G 3825 -U 10082 ; WX 838 ; N uni2762 ; G 3826 -U 10083 ; WX 838 ; N uni2763 ; G 3827 -U 10084 ; WX 838 ; N uni2764 ; G 3828 -U 10085 ; WX 838 ; N uni2765 ; G 3829 -U 10086 ; WX 838 ; N uni2766 ; G 3830 -U 10087 ; WX 838 ; N uni2767 ; G 3831 -U 10088 ; WX 838 ; N uni2768 ; G 3832 -U 10089 ; WX 838 ; N uni2769 ; G 3833 -U 10090 ; WX 838 ; N uni276A ; G 3834 -U 10091 ; WX 838 ; N uni276B ; G 3835 -U 10092 ; WX 838 ; N uni276C ; G 3836 -U 10093 ; WX 838 ; N uni276D ; G 3837 -U 10094 ; WX 838 ; N uni276E ; G 3838 -U 10095 ; WX 838 ; N uni276F ; G 3839 -U 10096 ; WX 838 ; N uni2770 ; G 3840 -U 10097 ; WX 838 ; N uni2771 ; G 3841 -U 10098 ; WX 838 ; N uni2772 ; G 3842 -U 10099 ; WX 838 ; N uni2773 ; G 3843 -U 10100 ; WX 838 ; N uni2774 ; G 3844 -U 10101 ; WX 838 ; N uni2775 ; G 3845 -U 10102 ; WX 847 ; N uni2776 ; G 3846 -U 10103 ; WX 847 ; N uni2777 ; G 3847 -U 10104 ; WX 847 ; N uni2778 ; G 3848 -U 10105 ; WX 847 ; N uni2779 ; G 3849 -U 10106 ; WX 847 ; N uni277A ; G 3850 -U 10107 ; WX 847 ; N uni277B ; G 3851 -U 10108 ; WX 847 ; N uni277C ; G 3852 -U 10109 ; WX 847 ; N uni277D ; G 3853 -U 10110 ; WX 847 ; N uni277E ; G 3854 -U 10111 ; WX 847 ; N uni277F ; G 3855 -U 10112 ; WX 838 ; N uni2780 ; G 3856 -U 10113 ; WX 838 ; N uni2781 ; G 3857 -U 10114 ; WX 838 ; N uni2782 ; G 3858 -U 10115 ; WX 838 ; N uni2783 ; G 3859 -U 10116 ; WX 838 ; N uni2784 ; G 3860 -U 10117 ; WX 838 ; N uni2785 ; G 3861 -U 10118 ; WX 838 ; N uni2786 ; G 3862 -U 10119 ; WX 838 ; N uni2787 ; G 3863 -U 10120 ; WX 838 ; N uni2788 ; G 3864 -U 10121 ; WX 838 ; N uni2789 ; G 3865 -U 10122 ; WX 838 ; N uni278A ; G 3866 -U 10123 ; WX 838 ; N uni278B ; G 3867 -U 10124 ; WX 838 ; N uni278C ; G 3868 -U 10125 ; WX 838 ; N uni278D ; G 3869 -U 10126 ; WX 838 ; N uni278E ; G 3870 -U 10127 ; WX 838 ; N uni278F ; G 3871 -U 10128 ; WX 838 ; N uni2790 ; G 3872 -U 10129 ; WX 838 ; N uni2791 ; G 3873 -U 10130 ; WX 838 ; N uni2792 ; G 3874 -U 10131 ; WX 838 ; N uni2793 ; G 3875 -U 10132 ; WX 838 ; N uni2794 ; G 3876 -U 10136 ; WX 838 ; N uni2798 ; G 3877 -U 10137 ; WX 838 ; N uni2799 ; G 3878 -U 10138 ; WX 838 ; N uni279A ; G 3879 -U 10139 ; WX 838 ; N uni279B ; G 3880 -U 10140 ; WX 838 ; N uni279C ; G 3881 -U 10141 ; WX 838 ; N uni279D ; G 3882 -U 10142 ; WX 838 ; N uni279E ; G 3883 -U 10143 ; WX 838 ; N uni279F ; G 3884 -U 10144 ; WX 838 ; N uni27A0 ; G 3885 -U 10145 ; WX 838 ; N uni27A1 ; G 3886 -U 10146 ; WX 838 ; N uni27A2 ; G 3887 -U 10147 ; WX 838 ; N uni27A3 ; G 3888 -U 10148 ; WX 838 ; N uni27A4 ; G 3889 -U 10149 ; WX 838 ; N uni27A5 ; G 3890 -U 10150 ; WX 838 ; N uni27A6 ; G 3891 -U 10151 ; WX 838 ; N uni27A7 ; G 3892 -U 10152 ; WX 838 ; N uni27A8 ; G 3893 -U 10153 ; WX 838 ; N uni27A9 ; G 3894 -U 10154 ; WX 838 ; N uni27AA ; G 3895 -U 10155 ; WX 838 ; N uni27AB ; G 3896 -U 10156 ; WX 838 ; N uni27AC ; G 3897 -U 10157 ; WX 838 ; N uni27AD ; G 3898 -U 10158 ; WX 838 ; N uni27AE ; G 3899 -U 10159 ; WX 838 ; N uni27AF ; G 3900 -U 10161 ; WX 838 ; N uni27B1 ; G 3901 -U 10162 ; WX 838 ; N uni27B2 ; G 3902 -U 10163 ; WX 838 ; N uni27B3 ; G 3903 -U 10164 ; WX 838 ; N uni27B4 ; G 3904 -U 10165 ; WX 838 ; N uni27B5 ; G 3905 -U 10166 ; WX 838 ; N uni27B6 ; G 3906 -U 10167 ; WX 838 ; N uni27B7 ; G 3907 -U 10168 ; WX 838 ; N uni27B8 ; G 3908 -U 10169 ; WX 838 ; N uni27B9 ; G 3909 -U 10170 ; WX 838 ; N uni27BA ; G 3910 -U 10171 ; WX 838 ; N uni27BB ; G 3911 -U 10172 ; WX 838 ; N uni27BC ; G 3912 -U 10173 ; WX 838 ; N uni27BD ; G 3913 -U 10174 ; WX 838 ; N uni27BE ; G 3914 -U 10181 ; WX 457 ; N uni27C5 ; G 3915 -U 10182 ; WX 457 ; N uni27C6 ; G 3916 -U 10208 ; WX 494 ; N uni27E0 ; G 3917 -U 10214 ; WX 487 ; N uni27E6 ; G 3918 -U 10215 ; WX 487 ; N uni27E7 ; G 3919 -U 10216 ; WX 457 ; N uni27E8 ; G 3920 -U 10217 ; WX 457 ; N uni27E9 ; G 3921 -U 10218 ; WX 721 ; N uni27EA ; G 3922 -U 10219 ; WX 721 ; N uni27EB ; G 3923 -U 10224 ; WX 838 ; N uni27F0 ; G 3924 -U 10225 ; WX 838 ; N uni27F1 ; G 3925 -U 10226 ; WX 838 ; N uni27F2 ; G 3926 -U 10227 ; WX 838 ; N uni27F3 ; G 3927 -U 10228 ; WX 1157 ; N uni27F4 ; G 3928 -U 10229 ; WX 1434 ; N uni27F5 ; G 3929 -U 10230 ; WX 1434 ; N uni27F6 ; G 3930 -U 10231 ; WX 1434 ; N uni27F7 ; G 3931 -U 10232 ; WX 1434 ; N uni27F8 ; G 3932 -U 10233 ; WX 1434 ; N uni27F9 ; G 3933 -U 10234 ; WX 1434 ; N uni27FA ; G 3934 -U 10235 ; WX 1434 ; N uni27FB ; G 3935 -U 10236 ; WX 1434 ; N uni27FC ; G 3936 -U 10237 ; WX 1434 ; N uni27FD ; G 3937 -U 10238 ; WX 1434 ; N uni27FE ; G 3938 -U 10239 ; WX 1434 ; N uni27FF ; G 3939 -U 10240 ; WX 781 ; N uni2800 ; G 3940 -U 10241 ; WX 781 ; N uni2801 ; G 3941 -U 10242 ; WX 781 ; N uni2802 ; G 3942 -U 10243 ; WX 781 ; N uni2803 ; G 3943 -U 10244 ; WX 781 ; N uni2804 ; G 3944 -U 10245 ; WX 781 ; N uni2805 ; G 3945 -U 10246 ; WX 781 ; N uni2806 ; G 3946 -U 10247 ; WX 781 ; N uni2807 ; G 3947 -U 10248 ; WX 781 ; N uni2808 ; G 3948 -U 10249 ; WX 781 ; N uni2809 ; G 3949 -U 10250 ; WX 781 ; N uni280A ; G 3950 -U 10251 ; WX 781 ; N uni280B ; G 3951 -U 10252 ; WX 781 ; N uni280C ; G 3952 -U 10253 ; WX 781 ; N uni280D ; G 3953 -U 10254 ; WX 781 ; N uni280E ; G 3954 -U 10255 ; WX 781 ; N uni280F ; G 3955 -U 10256 ; WX 781 ; N uni2810 ; G 3956 -U 10257 ; WX 781 ; N uni2811 ; G 3957 -U 10258 ; WX 781 ; N uni2812 ; G 3958 -U 10259 ; WX 781 ; N uni2813 ; G 3959 -U 10260 ; WX 781 ; N uni2814 ; G 3960 -U 10261 ; WX 781 ; N uni2815 ; G 3961 -U 10262 ; WX 781 ; N uni2816 ; G 3962 -U 10263 ; WX 781 ; N uni2817 ; G 3963 -U 10264 ; WX 781 ; N uni2818 ; G 3964 -U 10265 ; WX 781 ; N uni2819 ; G 3965 -U 10266 ; WX 781 ; N uni281A ; G 3966 -U 10267 ; WX 781 ; N uni281B ; G 3967 -U 10268 ; WX 781 ; N uni281C ; G 3968 -U 10269 ; WX 781 ; N uni281D ; G 3969 -U 10270 ; WX 781 ; N uni281E ; G 3970 -U 10271 ; WX 781 ; N uni281F ; G 3971 -U 10272 ; WX 781 ; N uni2820 ; G 3972 -U 10273 ; WX 781 ; N uni2821 ; G 3973 -U 10274 ; WX 781 ; N uni2822 ; G 3974 -U 10275 ; WX 781 ; N uni2823 ; G 3975 -U 10276 ; WX 781 ; N uni2824 ; G 3976 -U 10277 ; WX 781 ; N uni2825 ; G 3977 -U 10278 ; WX 781 ; N uni2826 ; G 3978 -U 10279 ; WX 781 ; N uni2827 ; G 3979 -U 10280 ; WX 781 ; N uni2828 ; G 3980 -U 10281 ; WX 781 ; N uni2829 ; G 3981 -U 10282 ; WX 781 ; N uni282A ; G 3982 -U 10283 ; WX 781 ; N uni282B ; G 3983 -U 10284 ; WX 781 ; N uni282C ; G 3984 -U 10285 ; WX 781 ; N uni282D ; G 3985 -U 10286 ; WX 781 ; N uni282E ; G 3986 -U 10287 ; WX 781 ; N uni282F ; G 3987 -U 10288 ; WX 781 ; N uni2830 ; G 3988 -U 10289 ; WX 781 ; N uni2831 ; G 3989 -U 10290 ; WX 781 ; N uni2832 ; G 3990 -U 10291 ; WX 781 ; N uni2833 ; G 3991 -U 10292 ; WX 781 ; N uni2834 ; G 3992 -U 10293 ; WX 781 ; N uni2835 ; G 3993 -U 10294 ; WX 781 ; N uni2836 ; G 3994 -U 10295 ; WX 781 ; N uni2837 ; G 3995 -U 10296 ; WX 781 ; N uni2838 ; G 3996 -U 10297 ; WX 781 ; N uni2839 ; G 3997 -U 10298 ; WX 781 ; N uni283A ; G 3998 -U 10299 ; WX 781 ; N uni283B ; G 3999 -U 10300 ; WX 781 ; N uni283C ; G 4000 -U 10301 ; WX 781 ; N uni283D ; G 4001 -U 10302 ; WX 781 ; N uni283E ; G 4002 -U 10303 ; WX 781 ; N uni283F ; G 4003 -U 10304 ; WX 781 ; N uni2840 ; G 4004 -U 10305 ; WX 781 ; N uni2841 ; G 4005 -U 10306 ; WX 781 ; N uni2842 ; G 4006 -U 10307 ; WX 781 ; N uni2843 ; G 4007 -U 10308 ; WX 781 ; N uni2844 ; G 4008 -U 10309 ; WX 781 ; N uni2845 ; G 4009 -U 10310 ; WX 781 ; N uni2846 ; G 4010 -U 10311 ; WX 781 ; N uni2847 ; G 4011 -U 10312 ; WX 781 ; N uni2848 ; G 4012 -U 10313 ; WX 781 ; N uni2849 ; G 4013 -U 10314 ; WX 781 ; N uni284A ; G 4014 -U 10315 ; WX 781 ; N uni284B ; G 4015 -U 10316 ; WX 781 ; N uni284C ; G 4016 -U 10317 ; WX 781 ; N uni284D ; G 4017 -U 10318 ; WX 781 ; N uni284E ; G 4018 -U 10319 ; WX 781 ; N uni284F ; G 4019 -U 10320 ; WX 781 ; N uni2850 ; G 4020 -U 10321 ; WX 781 ; N uni2851 ; G 4021 -U 10322 ; WX 781 ; N uni2852 ; G 4022 -U 10323 ; WX 781 ; N uni2853 ; G 4023 -U 10324 ; WX 781 ; N uni2854 ; G 4024 -U 10325 ; WX 781 ; N uni2855 ; G 4025 -U 10326 ; WX 781 ; N uni2856 ; G 4026 -U 10327 ; WX 781 ; N uni2857 ; G 4027 -U 10328 ; WX 781 ; N uni2858 ; G 4028 -U 10329 ; WX 781 ; N uni2859 ; G 4029 -U 10330 ; WX 781 ; N uni285A ; G 4030 -U 10331 ; WX 781 ; N uni285B ; G 4031 -U 10332 ; WX 781 ; N uni285C ; G 4032 -U 10333 ; WX 781 ; N uni285D ; G 4033 -U 10334 ; WX 781 ; N uni285E ; G 4034 -U 10335 ; WX 781 ; N uni285F ; G 4035 -U 10336 ; WX 781 ; N uni2860 ; G 4036 -U 10337 ; WX 781 ; N uni2861 ; G 4037 -U 10338 ; WX 781 ; N uni2862 ; G 4038 -U 10339 ; WX 781 ; N uni2863 ; G 4039 -U 10340 ; WX 781 ; N uni2864 ; G 4040 -U 10341 ; WX 781 ; N uni2865 ; G 4041 -U 10342 ; WX 781 ; N uni2866 ; G 4042 -U 10343 ; WX 781 ; N uni2867 ; G 4043 -U 10344 ; WX 781 ; N uni2868 ; G 4044 -U 10345 ; WX 781 ; N uni2869 ; G 4045 -U 10346 ; WX 781 ; N uni286A ; G 4046 -U 10347 ; WX 781 ; N uni286B ; G 4047 -U 10348 ; WX 781 ; N uni286C ; G 4048 -U 10349 ; WX 781 ; N uni286D ; G 4049 -U 10350 ; WX 781 ; N uni286E ; G 4050 -U 10351 ; WX 781 ; N uni286F ; G 4051 -U 10352 ; WX 781 ; N uni2870 ; G 4052 -U 10353 ; WX 781 ; N uni2871 ; G 4053 -U 10354 ; WX 781 ; N uni2872 ; G 4054 -U 10355 ; WX 781 ; N uni2873 ; G 4055 -U 10356 ; WX 781 ; N uni2874 ; G 4056 -U 10357 ; WX 781 ; N uni2875 ; G 4057 -U 10358 ; WX 781 ; N uni2876 ; G 4058 -U 10359 ; WX 781 ; N uni2877 ; G 4059 -U 10360 ; WX 781 ; N uni2878 ; G 4060 -U 10361 ; WX 781 ; N uni2879 ; G 4061 -U 10362 ; WX 781 ; N uni287A ; G 4062 -U 10363 ; WX 781 ; N uni287B ; G 4063 -U 10364 ; WX 781 ; N uni287C ; G 4064 -U 10365 ; WX 781 ; N uni287D ; G 4065 -U 10366 ; WX 781 ; N uni287E ; G 4066 -U 10367 ; WX 781 ; N uni287F ; G 4067 -U 10368 ; WX 781 ; N uni2880 ; G 4068 -U 10369 ; WX 781 ; N uni2881 ; G 4069 -U 10370 ; WX 781 ; N uni2882 ; G 4070 -U 10371 ; WX 781 ; N uni2883 ; G 4071 -U 10372 ; WX 781 ; N uni2884 ; G 4072 -U 10373 ; WX 781 ; N uni2885 ; G 4073 -U 10374 ; WX 781 ; N uni2886 ; G 4074 -U 10375 ; WX 781 ; N uni2887 ; G 4075 -U 10376 ; WX 781 ; N uni2888 ; G 4076 -U 10377 ; WX 781 ; N uni2889 ; G 4077 -U 10378 ; WX 781 ; N uni288A ; G 4078 -U 10379 ; WX 781 ; N uni288B ; G 4079 -U 10380 ; WX 781 ; N uni288C ; G 4080 -U 10381 ; WX 781 ; N uni288D ; G 4081 -U 10382 ; WX 781 ; N uni288E ; G 4082 -U 10383 ; WX 781 ; N uni288F ; G 4083 -U 10384 ; WX 781 ; N uni2890 ; G 4084 -U 10385 ; WX 781 ; N uni2891 ; G 4085 -U 10386 ; WX 781 ; N uni2892 ; G 4086 -U 10387 ; WX 781 ; N uni2893 ; G 4087 -U 10388 ; WX 781 ; N uni2894 ; G 4088 -U 10389 ; WX 781 ; N uni2895 ; G 4089 -U 10390 ; WX 781 ; N uni2896 ; G 4090 -U 10391 ; WX 781 ; N uni2897 ; G 4091 -U 10392 ; WX 781 ; N uni2898 ; G 4092 -U 10393 ; WX 781 ; N uni2899 ; G 4093 -U 10394 ; WX 781 ; N uni289A ; G 4094 -U 10395 ; WX 781 ; N uni289B ; G 4095 -U 10396 ; WX 781 ; N uni289C ; G 4096 -U 10397 ; WX 781 ; N uni289D ; G 4097 -U 10398 ; WX 781 ; N uni289E ; G 4098 -U 10399 ; WX 781 ; N uni289F ; G 4099 -U 10400 ; WX 781 ; N uni28A0 ; G 4100 -U 10401 ; WX 781 ; N uni28A1 ; G 4101 -U 10402 ; WX 781 ; N uni28A2 ; G 4102 -U 10403 ; WX 781 ; N uni28A3 ; G 4103 -U 10404 ; WX 781 ; N uni28A4 ; G 4104 -U 10405 ; WX 781 ; N uni28A5 ; G 4105 -U 10406 ; WX 781 ; N uni28A6 ; G 4106 -U 10407 ; WX 781 ; N uni28A7 ; G 4107 -U 10408 ; WX 781 ; N uni28A8 ; G 4108 -U 10409 ; WX 781 ; N uni28A9 ; G 4109 -U 10410 ; WX 781 ; N uni28AA ; G 4110 -U 10411 ; WX 781 ; N uni28AB ; G 4111 -U 10412 ; WX 781 ; N uni28AC ; G 4112 -U 10413 ; WX 781 ; N uni28AD ; G 4113 -U 10414 ; WX 781 ; N uni28AE ; G 4114 -U 10415 ; WX 781 ; N uni28AF ; G 4115 -U 10416 ; WX 781 ; N uni28B0 ; G 4116 -U 10417 ; WX 781 ; N uni28B1 ; G 4117 -U 10418 ; WX 781 ; N uni28B2 ; G 4118 -U 10419 ; WX 781 ; N uni28B3 ; G 4119 -U 10420 ; WX 781 ; N uni28B4 ; G 4120 -U 10421 ; WX 781 ; N uni28B5 ; G 4121 -U 10422 ; WX 781 ; N uni28B6 ; G 4122 -U 10423 ; WX 781 ; N uni28B7 ; G 4123 -U 10424 ; WX 781 ; N uni28B8 ; G 4124 -U 10425 ; WX 781 ; N uni28B9 ; G 4125 -U 10426 ; WX 781 ; N uni28BA ; G 4126 -U 10427 ; WX 781 ; N uni28BB ; G 4127 -U 10428 ; WX 781 ; N uni28BC ; G 4128 -U 10429 ; WX 781 ; N uni28BD ; G 4129 -U 10430 ; WX 781 ; N uni28BE ; G 4130 -U 10431 ; WX 781 ; N uni28BF ; G 4131 -U 10432 ; WX 781 ; N uni28C0 ; G 4132 -U 10433 ; WX 781 ; N uni28C1 ; G 4133 -U 10434 ; WX 781 ; N uni28C2 ; G 4134 -U 10435 ; WX 781 ; N uni28C3 ; G 4135 -U 10436 ; WX 781 ; N uni28C4 ; G 4136 -U 10437 ; WX 781 ; N uni28C5 ; G 4137 -U 10438 ; WX 781 ; N uni28C6 ; G 4138 -U 10439 ; WX 781 ; N uni28C7 ; G 4139 -U 10440 ; WX 781 ; N uni28C8 ; G 4140 -U 10441 ; WX 781 ; N uni28C9 ; G 4141 -U 10442 ; WX 781 ; N uni28CA ; G 4142 -U 10443 ; WX 781 ; N uni28CB ; G 4143 -U 10444 ; WX 781 ; N uni28CC ; G 4144 -U 10445 ; WX 781 ; N uni28CD ; G 4145 -U 10446 ; WX 781 ; N uni28CE ; G 4146 -U 10447 ; WX 781 ; N uni28CF ; G 4147 -U 10448 ; WX 781 ; N uni28D0 ; G 4148 -U 10449 ; WX 781 ; N uni28D1 ; G 4149 -U 10450 ; WX 781 ; N uni28D2 ; G 4150 -U 10451 ; WX 781 ; N uni28D3 ; G 4151 -U 10452 ; WX 781 ; N uni28D4 ; G 4152 -U 10453 ; WX 781 ; N uni28D5 ; G 4153 -U 10454 ; WX 781 ; N uni28D6 ; G 4154 -U 10455 ; WX 781 ; N uni28D7 ; G 4155 -U 10456 ; WX 781 ; N uni28D8 ; G 4156 -U 10457 ; WX 781 ; N uni28D9 ; G 4157 -U 10458 ; WX 781 ; N uni28DA ; G 4158 -U 10459 ; WX 781 ; N uni28DB ; G 4159 -U 10460 ; WX 781 ; N uni28DC ; G 4160 -U 10461 ; WX 781 ; N uni28DD ; G 4161 -U 10462 ; WX 781 ; N uni28DE ; G 4162 -U 10463 ; WX 781 ; N uni28DF ; G 4163 -U 10464 ; WX 781 ; N uni28E0 ; G 4164 -U 10465 ; WX 781 ; N uni28E1 ; G 4165 -U 10466 ; WX 781 ; N uni28E2 ; G 4166 -U 10467 ; WX 781 ; N uni28E3 ; G 4167 -U 10468 ; WX 781 ; N uni28E4 ; G 4168 -U 10469 ; WX 781 ; N uni28E5 ; G 4169 -U 10470 ; WX 781 ; N uni28E6 ; G 4170 -U 10471 ; WX 781 ; N uni28E7 ; G 4171 -U 10472 ; WX 781 ; N uni28E8 ; G 4172 -U 10473 ; WX 781 ; N uni28E9 ; G 4173 -U 10474 ; WX 781 ; N uni28EA ; G 4174 -U 10475 ; WX 781 ; N uni28EB ; G 4175 -U 10476 ; WX 781 ; N uni28EC ; G 4176 -U 10477 ; WX 781 ; N uni28ED ; G 4177 -U 10478 ; WX 781 ; N uni28EE ; G 4178 -U 10479 ; WX 781 ; N uni28EF ; G 4179 -U 10480 ; WX 781 ; N uni28F0 ; G 4180 -U 10481 ; WX 781 ; N uni28F1 ; G 4181 -U 10482 ; WX 781 ; N uni28F2 ; G 4182 -U 10483 ; WX 781 ; N uni28F3 ; G 4183 -U 10484 ; WX 781 ; N uni28F4 ; G 4184 -U 10485 ; WX 781 ; N uni28F5 ; G 4185 -U 10486 ; WX 781 ; N uni28F6 ; G 4186 -U 10487 ; WX 781 ; N uni28F7 ; G 4187 -U 10488 ; WX 781 ; N uni28F8 ; G 4188 -U 10489 ; WX 781 ; N uni28F9 ; G 4189 -U 10490 ; WX 781 ; N uni28FA ; G 4190 -U 10491 ; WX 781 ; N uni28FB ; G 4191 -U 10492 ; WX 781 ; N uni28FC ; G 4192 -U 10493 ; WX 781 ; N uni28FD ; G 4193 -U 10494 ; WX 781 ; N uni28FE ; G 4194 -U 10495 ; WX 781 ; N uni28FF ; G 4195 -U 10502 ; WX 838 ; N uni2906 ; G 4196 -U 10503 ; WX 838 ; N uni2907 ; G 4197 -U 10506 ; WX 838 ; N uni290A ; G 4198 -U 10507 ; WX 838 ; N uni290B ; G 4199 -U 10560 ; WX 838 ; N uni2940 ; G 4200 -U 10561 ; WX 838 ; N uni2941 ; G 4201 -U 10627 ; WX 753 ; N uni2983 ; G 4202 -U 10628 ; WX 753 ; N uni2984 ; G 4203 -U 10702 ; WX 838 ; N uni29CE ; G 4204 -U 10703 ; WX 1046 ; N uni29CF ; G 4205 -U 10704 ; WX 1046 ; N uni29D0 ; G 4206 -U 10705 ; WX 1000 ; N uni29D1 ; G 4207 -U 10706 ; WX 1000 ; N uni29D2 ; G 4208 -U 10707 ; WX 1000 ; N uni29D3 ; G 4209 -U 10708 ; WX 1000 ; N uni29D4 ; G 4210 -U 10709 ; WX 1000 ; N uni29D5 ; G 4211 -U 10731 ; WX 494 ; N uni29EB ; G 4212 -U 10746 ; WX 838 ; N uni29FA ; G 4213 -U 10747 ; WX 838 ; N uni29FB ; G 4214 -U 10752 ; WX 1000 ; N uni2A00 ; G 4215 -U 10753 ; WX 1000 ; N uni2A01 ; G 4216 -U 10754 ; WX 1000 ; N uni2A02 ; G 4217 -U 10764 ; WX 1661 ; N uni2A0C ; G 4218 -U 10765 ; WX 563 ; N uni2A0D ; G 4219 -U 10766 ; WX 563 ; N uni2A0E ; G 4220 -U 10767 ; WX 563 ; N uni2A0F ; G 4221 -U 10768 ; WX 563 ; N uni2A10 ; G 4222 -U 10769 ; WX 563 ; N uni2A11 ; G 4223 -U 10770 ; WX 563 ; N uni2A12 ; G 4224 -U 10771 ; WX 563 ; N uni2A13 ; G 4225 -U 10772 ; WX 563 ; N uni2A14 ; G 4226 -U 10773 ; WX 563 ; N uni2A15 ; G 4227 -U 10774 ; WX 563 ; N uni2A16 ; G 4228 -U 10775 ; WX 563 ; N uni2A17 ; G 4229 -U 10776 ; WX 563 ; N uni2A18 ; G 4230 -U 10777 ; WX 563 ; N uni2A19 ; G 4231 -U 10778 ; WX 563 ; N uni2A1A ; G 4232 -U 10779 ; WX 563 ; N uni2A1B ; G 4233 -U 10780 ; WX 563 ; N uni2A1C ; G 4234 -U 10799 ; WX 838 ; N uni2A2F ; G 4235 -U 10858 ; WX 838 ; N uni2A6A ; G 4236 -U 10859 ; WX 838 ; N uni2A6B ; G 4237 -U 10877 ; WX 838 ; N uni2A7D ; G 4238 -U 10878 ; WX 838 ; N uni2A7E ; G 4239 -U 10879 ; WX 838 ; N uni2A7F ; G 4240 -U 10880 ; WX 838 ; N uni2A80 ; G 4241 -U 10881 ; WX 838 ; N uni2A81 ; G 4242 -U 10882 ; WX 838 ; N uni2A82 ; G 4243 -U 10883 ; WX 838 ; N uni2A83 ; G 4244 -U 10884 ; WX 838 ; N uni2A84 ; G 4245 -U 10885 ; WX 838 ; N uni2A85 ; G 4246 -U 10886 ; WX 838 ; N uni2A86 ; G 4247 -U 10887 ; WX 838 ; N uni2A87 ; G 4248 -U 10888 ; WX 838 ; N uni2A88 ; G 4249 -U 10889 ; WX 838 ; N uni2A89 ; G 4250 -U 10890 ; WX 838 ; N uni2A8A ; G 4251 -U 10891 ; WX 838 ; N uni2A8B ; G 4252 -U 10892 ; WX 838 ; N uni2A8C ; G 4253 -U 10893 ; WX 838 ; N uni2A8D ; G 4254 -U 10894 ; WX 838 ; N uni2A8E ; G 4255 -U 10895 ; WX 838 ; N uni2A8F ; G 4256 -U 10896 ; WX 838 ; N uni2A90 ; G 4257 -U 10897 ; WX 838 ; N uni2A91 ; G 4258 -U 10898 ; WX 838 ; N uni2A92 ; G 4259 -U 10899 ; WX 838 ; N uni2A93 ; G 4260 -U 10900 ; WX 838 ; N uni2A94 ; G 4261 -U 10901 ; WX 838 ; N uni2A95 ; G 4262 -U 10902 ; WX 838 ; N uni2A96 ; G 4263 -U 10903 ; WX 838 ; N uni2A97 ; G 4264 -U 10904 ; WX 838 ; N uni2A98 ; G 4265 -U 10905 ; WX 838 ; N uni2A99 ; G 4266 -U 10906 ; WX 838 ; N uni2A9A ; G 4267 -U 10907 ; WX 838 ; N uni2A9B ; G 4268 -U 10908 ; WX 838 ; N uni2A9C ; G 4269 -U 10909 ; WX 838 ; N uni2A9D ; G 4270 -U 10910 ; WX 838 ; N uni2A9E ; G 4271 -U 10911 ; WX 838 ; N uni2A9F ; G 4272 -U 10912 ; WX 838 ; N uni2AA0 ; G 4273 -U 10926 ; WX 838 ; N uni2AAE ; G 4274 -U 10927 ; WX 838 ; N uni2AAF ; G 4275 -U 10928 ; WX 838 ; N uni2AB0 ; G 4276 -U 10929 ; WX 838 ; N uni2AB1 ; G 4277 -U 10930 ; WX 838 ; N uni2AB2 ; G 4278 -U 10931 ; WX 838 ; N uni2AB3 ; G 4279 -U 10932 ; WX 838 ; N uni2AB4 ; G 4280 -U 10933 ; WX 838 ; N uni2AB5 ; G 4281 -U 10934 ; WX 838 ; N uni2AB6 ; G 4282 -U 10935 ; WX 838 ; N uni2AB7 ; G 4283 -U 10936 ; WX 838 ; N uni2AB8 ; G 4284 -U 10937 ; WX 838 ; N uni2AB9 ; G 4285 -U 10938 ; WX 838 ; N uni2ABA ; G 4286 -U 11001 ; WX 838 ; N uni2AF9 ; G 4287 -U 11002 ; WX 838 ; N uni2AFA ; G 4288 -U 11008 ; WX 838 ; N uni2B00 ; G 4289 -U 11009 ; WX 838 ; N uni2B01 ; G 4290 -U 11010 ; WX 838 ; N uni2B02 ; G 4291 -U 11011 ; WX 838 ; N uni2B03 ; G 4292 -U 11012 ; WX 838 ; N uni2B04 ; G 4293 -U 11013 ; WX 838 ; N uni2B05 ; G 4294 -U 11014 ; WX 838 ; N uni2B06 ; G 4295 -U 11015 ; WX 838 ; N uni2B07 ; G 4296 -U 11016 ; WX 838 ; N uni2B08 ; G 4297 -U 11017 ; WX 838 ; N uni2B09 ; G 4298 -U 11018 ; WX 838 ; N uni2B0A ; G 4299 -U 11019 ; WX 838 ; N uni2B0B ; G 4300 -U 11020 ; WX 838 ; N uni2B0C ; G 4301 -U 11021 ; WX 838 ; N uni2B0D ; G 4302 -U 11022 ; WX 838 ; N uni2B0E ; G 4303 -U 11023 ; WX 838 ; N uni2B0F ; G 4304 -U 11024 ; WX 838 ; N uni2B10 ; G 4305 -U 11025 ; WX 838 ; N uni2B11 ; G 4306 -U 11026 ; WX 945 ; N uni2B12 ; G 4307 -U 11027 ; WX 945 ; N uni2B13 ; G 4308 -U 11028 ; WX 945 ; N uni2B14 ; G 4309 -U 11029 ; WX 945 ; N uni2B15 ; G 4310 -U 11030 ; WX 769 ; N uni2B16 ; G 4311 -U 11031 ; WX 769 ; N uni2B17 ; G 4312 -U 11032 ; WX 769 ; N uni2B18 ; G 4313 -U 11033 ; WX 769 ; N uni2B19 ; G 4314 -U 11034 ; WX 945 ; N uni2B1A ; G 4315 -U 11039 ; WX 869 ; N uni2B1F ; G 4316 -U 11040 ; WX 869 ; N uni2B20 ; G 4317 -U 11041 ; WX 873 ; N uni2B21 ; G 4318 -U 11042 ; WX 873 ; N uni2B22 ; G 4319 -U 11043 ; WX 873 ; N uni2B23 ; G 4320 -U 11044 ; WX 1119 ; N uni2B24 ; G 4321 -U 11091 ; WX 869 ; N uni2B53 ; G 4322 -U 11092 ; WX 869 ; N uni2B54 ; G 4323 -U 11360 ; WX 637 ; N uni2C60 ; G 4324 -U 11361 ; WX 360 ; N uni2C61 ; G 4325 -U 11362 ; WX 637 ; N uni2C62 ; G 4326 -U 11363 ; WX 733 ; N uni2C63 ; G 4327 -U 11364 ; WX 770 ; N uni2C64 ; G 4328 -U 11365 ; WX 675 ; N uni2C65 ; G 4329 -U 11366 ; WX 478 ; N uni2C66 ; G 4330 -U 11367 ; WX 956 ; N uni2C67 ; G 4331 -U 11368 ; WX 712 ; N uni2C68 ; G 4332 -U 11369 ; WX 775 ; N uni2C69 ; G 4333 -U 11370 ; WX 665 ; N uni2C6A ; G 4334 -U 11371 ; WX 725 ; N uni2C6B ; G 4335 -U 11372 ; WX 582 ; N uni2C6C ; G 4336 -U 11373 ; WX 860 ; N uni2C6D ; G 4337 -U 11374 ; WX 995 ; N uni2C6E ; G 4338 -U 11375 ; WX 774 ; N uni2C6F ; G 4339 -U 11376 ; WX 860 ; N uni2C70 ; G 4340 -U 11377 ; WX 778 ; N uni2C71 ; G 4341 -U 11378 ; WX 1221 ; N uni2C72 ; G 4342 -U 11379 ; WX 1056 ; N uni2C73 ; G 4343 -U 11380 ; WX 652 ; N uni2C74 ; G 4344 -U 11381 ; WX 698 ; N uni2C75 ; G 4345 -U 11382 ; WX 565 ; N uni2C76 ; G 4346 -U 11383 ; WX 782 ; N uni2C77 ; G 4347 -U 11385 ; WX 538 ; N uni2C79 ; G 4348 -U 11386 ; WX 687 ; N uni2C7A ; G 4349 -U 11387 ; WX 559 ; N uni2C7B ; G 4350 -U 11388 ; WX 219 ; N uni2C7C ; G 4351 -U 11389 ; WX 487 ; N uni2C7D ; G 4352 -U 11390 ; WX 720 ; N uni2C7E ; G 4353 -U 11391 ; WX 725 ; N uni2C7F ; G 4354 -U 11520 ; WX 663 ; N uni2D00 ; G 4355 -U 11521 ; WX 676 ; N uni2D01 ; G 4356 -U 11522 ; WX 661 ; N uni2D02 ; G 4357 -U 11523 ; WX 629 ; N uni2D03 ; G 4358 -U 11524 ; WX 661 ; N uni2D04 ; G 4359 -U 11525 ; WX 1032 ; N uni2D05 ; G 4360 -U 11526 ; WX 718 ; N uni2D06 ; G 4361 -U 11527 ; WX 1032 ; N uni2D07 ; G 4362 -U 11528 ; WX 648 ; N uni2D08 ; G 4363 -U 11529 ; WX 667 ; N uni2D09 ; G 4364 -U 11530 ; WX 1032 ; N uni2D0A ; G 4365 -U 11531 ; WX 673 ; N uni2D0B ; G 4366 -U 11532 ; WX 677 ; N uni2D0C ; G 4367 -U 11533 ; WX 1036 ; N uni2D0D ; G 4368 -U 11534 ; WX 680 ; N uni2D0E ; G 4369 -U 11535 ; WX 886 ; N uni2D0F ; G 4370 -U 11536 ; WX 1032 ; N uni2D10 ; G 4371 -U 11537 ; WX 683 ; N uni2D11 ; G 4372 -U 11538 ; WX 674 ; N uni2D12 ; G 4373 -U 11539 ; WX 1035 ; N uni2D13 ; G 4374 -U 11540 ; WX 1033 ; N uni2D14 ; G 4375 -U 11541 ; WX 1027 ; N uni2D15 ; G 4376 -U 11542 ; WX 676 ; N uni2D16 ; G 4377 -U 11543 ; WX 673 ; N uni2D17 ; G 4378 -U 11544 ; WX 667 ; N uni2D18 ; G 4379 -U 11545 ; WX 667 ; N uni2D19 ; G 4380 -U 11546 ; WX 660 ; N uni2D1A ; G 4381 -U 11547 ; WX 671 ; N uni2D1B ; G 4382 -U 11548 ; WX 1039 ; N uni2D1C ; G 4383 -U 11549 ; WX 673 ; N uni2D1D ; G 4384 -U 11550 ; WX 692 ; N uni2D1E ; G 4385 -U 11551 ; WX 659 ; N uni2D1F ; G 4386 -U 11552 ; WX 1048 ; N uni2D20 ; G 4387 -U 11553 ; WX 660 ; N uni2D21 ; G 4388 -U 11554 ; WX 654 ; N uni2D22 ; G 4389 -U 11555 ; WX 670 ; N uni2D23 ; G 4390 -U 11556 ; WX 733 ; N uni2D24 ; G 4391 -U 11557 ; WX 1017 ; N uni2D25 ; G 4392 -U 11800 ; WX 580 ; N uni2E18 ; G 4393 -U 11807 ; WX 838 ; N uni2E1F ; G 4394 -U 11810 ; WX 457 ; N uni2E22 ; G 4395 -U 11811 ; WX 457 ; N uni2E23 ; G 4396 -U 11812 ; WX 457 ; N uni2E24 ; G 4397 -U 11813 ; WX 457 ; N uni2E25 ; G 4398 -U 11822 ; WX 580 ; N uni2E2E ; G 4399 -U 19904 ; WX 896 ; N uni4DC0 ; G 4400 -U 19905 ; WX 896 ; N uni4DC1 ; G 4401 -U 19906 ; WX 896 ; N uni4DC2 ; G 4402 -U 19907 ; WX 896 ; N uni4DC3 ; G 4403 -U 19908 ; WX 896 ; N uni4DC4 ; G 4404 -U 19909 ; WX 896 ; N uni4DC5 ; G 4405 -U 19910 ; WX 896 ; N uni4DC6 ; G 4406 -U 19911 ; WX 896 ; N uni4DC7 ; G 4407 -U 19912 ; WX 896 ; N uni4DC8 ; G 4408 -U 19913 ; WX 896 ; N uni4DC9 ; G 4409 -U 19914 ; WX 896 ; N uni4DCA ; G 4410 -U 19915 ; WX 896 ; N uni4DCB ; G 4411 -U 19916 ; WX 896 ; N uni4DCC ; G 4412 -U 19917 ; WX 896 ; N uni4DCD ; G 4413 -U 19918 ; WX 896 ; N uni4DCE ; G 4414 -U 19919 ; WX 896 ; N uni4DCF ; G 4415 -U 19920 ; WX 896 ; N uni4DD0 ; G 4416 -U 19921 ; WX 896 ; N uni4DD1 ; G 4417 -U 19922 ; WX 896 ; N uni4DD2 ; G 4418 -U 19923 ; WX 896 ; N uni4DD3 ; G 4419 -U 19924 ; WX 896 ; N uni4DD4 ; G 4420 -U 19925 ; WX 896 ; N uni4DD5 ; G 4421 -U 19926 ; WX 896 ; N uni4DD6 ; G 4422 -U 19927 ; WX 896 ; N uni4DD7 ; G 4423 -U 19928 ; WX 896 ; N uni4DD8 ; G 4424 -U 19929 ; WX 896 ; N uni4DD9 ; G 4425 -U 19930 ; WX 896 ; N uni4DDA ; G 4426 -U 19931 ; WX 896 ; N uni4DDB ; G 4427 -U 19932 ; WX 896 ; N uni4DDC ; G 4428 -U 19933 ; WX 896 ; N uni4DDD ; G 4429 -U 19934 ; WX 896 ; N uni4DDE ; G 4430 -U 19935 ; WX 896 ; N uni4DDF ; G 4431 -U 19936 ; WX 896 ; N uni4DE0 ; G 4432 -U 19937 ; WX 896 ; N uni4DE1 ; G 4433 -U 19938 ; WX 896 ; N uni4DE2 ; G 4434 -U 19939 ; WX 896 ; N uni4DE3 ; G 4435 -U 19940 ; WX 896 ; N uni4DE4 ; G 4436 -U 19941 ; WX 896 ; N uni4DE5 ; G 4437 -U 19942 ; WX 896 ; N uni4DE6 ; G 4438 -U 19943 ; WX 896 ; N uni4DE7 ; G 4439 -U 19944 ; WX 896 ; N uni4DE8 ; G 4440 -U 19945 ; WX 896 ; N uni4DE9 ; G 4441 -U 19946 ; WX 896 ; N uni4DEA ; G 4442 -U 19947 ; WX 896 ; N uni4DEB ; G 4443 -U 19948 ; WX 896 ; N uni4DEC ; G 4444 -U 19949 ; WX 896 ; N uni4DED ; G 4445 -U 19950 ; WX 896 ; N uni4DEE ; G 4446 -U 19951 ; WX 896 ; N uni4DEF ; G 4447 -U 19952 ; WX 896 ; N uni4DF0 ; G 4448 -U 19953 ; WX 896 ; N uni4DF1 ; G 4449 -U 19954 ; WX 896 ; N uni4DF2 ; G 4450 -U 19955 ; WX 896 ; N uni4DF3 ; G 4451 -U 19956 ; WX 896 ; N uni4DF4 ; G 4452 -U 19957 ; WX 896 ; N uni4DF5 ; G 4453 -U 19958 ; WX 896 ; N uni4DF6 ; G 4454 -U 19959 ; WX 896 ; N uni4DF7 ; G 4455 -U 19960 ; WX 896 ; N uni4DF8 ; G 4456 -U 19961 ; WX 896 ; N uni4DF9 ; G 4457 -U 19962 ; WX 896 ; N uni4DFA ; G 4458 -U 19963 ; WX 896 ; N uni4DFB ; G 4459 -U 19964 ; WX 896 ; N uni4DFC ; G 4460 -U 19965 ; WX 896 ; N uni4DFD ; G 4461 -U 19966 ; WX 896 ; N uni4DFE ; G 4462 -U 19967 ; WX 896 ; N uni4DFF ; G 4463 -U 42192 ; WX 762 ; N uniA4D0 ; G 4464 -U 42193 ; WX 733 ; N uniA4D1 ; G 4465 -U 42194 ; WX 733 ; N uniA4D2 ; G 4466 -U 42195 ; WX 830 ; N uniA4D3 ; G 4467 -U 42196 ; WX 682 ; N uniA4D4 ; G 4468 -U 42197 ; WX 682 ; N uniA4D5 ; G 4469 -U 42198 ; WX 821 ; N uniA4D6 ; G 4470 -U 42199 ; WX 775 ; N uniA4D7 ; G 4471 -U 42200 ; WX 775 ; N uniA4D8 ; G 4472 -U 42201 ; WX 530 ; N uniA4D9 ; G 4473 -U 42202 ; WX 734 ; N uniA4DA ; G 4474 -U 42203 ; WX 734 ; N uniA4DB ; G 4475 -U 42204 ; WX 725 ; N uniA4DC ; G 4476 -U 42205 ; WX 683 ; N uniA4DD ; G 4477 -U 42206 ; WX 683 ; N uniA4DE ; G 4478 -U 42207 ; WX 995 ; N uniA4DF ; G 4479 -U 42208 ; WX 837 ; N uniA4E0 ; G 4480 -U 42209 ; WX 637 ; N uniA4E1 ; G 4481 -U 42210 ; WX 720 ; N uniA4E2 ; G 4482 -U 42211 ; WX 770 ; N uniA4E3 ; G 4483 -U 42212 ; WX 770 ; N uniA4E4 ; G 4484 -U 42213 ; WX 774 ; N uniA4E5 ; G 4485 -U 42214 ; WX 774 ; N uniA4E6 ; G 4486 -U 42215 ; WX 837 ; N uniA4E7 ; G 4487 -U 42216 ; WX 786 ; N uniA4E8 ; G 4488 -U 42217 ; WX 530 ; N uniA4E9 ; G 4489 -U 42218 ; WX 1103 ; N uniA4EA ; G 4490 -U 42219 ; WX 771 ; N uniA4EB ; G 4491 -U 42220 ; WX 724 ; N uniA4EC ; G 4492 -U 42221 ; WX 762 ; N uniA4ED ; G 4493 -U 42222 ; WX 774 ; N uniA4EE ; G 4494 -U 42223 ; WX 774 ; N uniA4EF ; G 4495 -U 42224 ; WX 683 ; N uniA4F0 ; G 4496 -U 42225 ; WX 683 ; N uniA4F1 ; G 4497 -U 42226 ; WX 372 ; N uniA4F2 ; G 4498 -U 42227 ; WX 850 ; N uniA4F3 ; G 4499 -U 42228 ; WX 812 ; N uniA4F4 ; G 4500 -U 42229 ; WX 812 ; N uniA4F5 ; G 4501 -U 42230 ; WX 576 ; N uniA4F6 ; G 4502 -U 42231 ; WX 830 ; N uniA4F7 ; G 4503 -U 42232 ; WX 322 ; N uniA4F8 ; G 4504 -U 42233 ; WX 322 ; N uniA4F9 ; G 4505 -U 42234 ; WX 674 ; N uniA4FA ; G 4506 -U 42235 ; WX 674 ; N uniA4FB ; G 4507 -U 42236 ; WX 322 ; N uniA4FC ; G 4508 -U 42237 ; WX 322 ; N uniA4FD ; G 4509 -U 42238 ; WX 588 ; N uniA4FE ; G 4510 -U 42239 ; WX 588 ; N uniA4FF ; G 4511 -U 42564 ; WX 720 ; N uniA644 ; G 4512 -U 42565 ; WX 595 ; N uniA645 ; G 4513 -U 42566 ; WX 436 ; N uniA646 ; G 4514 -U 42567 ; WX 440 ; N uniA647 ; G 4515 -U 42572 ; WX 1405 ; N uniA64C ; G 4516 -U 42573 ; WX 1173 ; N uniA64D ; G 4517 -U 42576 ; WX 1234 ; N uniA650 ; G 4518 -U 42577 ; WX 1027 ; N uniA651 ; G 4519 -U 42580 ; WX 1174 ; N uniA654 ; G 4520 -U 42581 ; WX 972 ; N uniA655 ; G 4521 -U 42582 ; WX 1100 ; N uniA656 ; G 4522 -U 42583 ; WX 969 ; N uniA657 ; G 4523 -U 42594 ; WX 1100 ; N uniA662 ; G 4524 -U 42595 ; WX 940 ; N uniA663 ; G 4525 -U 42596 ; WX 1096 ; N uniA664 ; G 4526 -U 42597 ; WX 915 ; N uniA665 ; G 4527 -U 42598 ; WX 1260 ; N uniA666 ; G 4528 -U 42599 ; WX 997 ; N uniA667 ; G 4529 -U 42600 ; WX 850 ; N uniA668 ; G 4530 -U 42601 ; WX 687 ; N uniA669 ; G 4531 -U 42602 ; WX 1037 ; N uniA66A ; G 4532 -U 42603 ; WX 868 ; N uniA66B ; G 4533 -U 42604 ; WX 1406 ; N uniA66C ; G 4534 -U 42605 ; WX 1106 ; N uniA66D ; G 4535 -U 42606 ; WX 961 ; N uniA66E ; G 4536 -U 42634 ; WX 944 ; N uniA68A ; G 4537 -U 42635 ; WX 749 ; N uniA68B ; G 4538 -U 42636 ; WX 682 ; N uniA68C ; G 4539 -U 42637 ; WX 580 ; N uniA68D ; G 4540 -U 42644 ; WX 808 ; N uniA694 ; G 4541 -U 42645 ; WX 712 ; N uniA695 ; G 4542 -U 42648 ; WX 1406 ; N uniA698 ; G 4543 -U 42649 ; WX 1106 ; N uniA699 ; G 4544 -U 42760 ; WX 500 ; N uniA708 ; G 4545 -U 42761 ; WX 500 ; N uniA709 ; G 4546 -U 42762 ; WX 500 ; N uniA70A ; G 4547 -U 42763 ; WX 500 ; N uniA70B ; G 4548 -U 42764 ; WX 500 ; N uniA70C ; G 4549 -U 42765 ; WX 500 ; N uniA70D ; G 4550 -U 42766 ; WX 500 ; N uniA70E ; G 4551 -U 42767 ; WX 500 ; N uniA70F ; G 4552 -U 42768 ; WX 500 ; N uniA710 ; G 4553 -U 42769 ; WX 500 ; N uniA711 ; G 4554 -U 42770 ; WX 500 ; N uniA712 ; G 4555 -U 42771 ; WX 500 ; N uniA713 ; G 4556 -U 42772 ; WX 500 ; N uniA714 ; G 4557 -U 42773 ; WX 500 ; N uniA715 ; G 4558 -U 42774 ; WX 500 ; N uniA716 ; G 4559 -U 42779 ; WX 400 ; N uniA71B ; G 4560 -U 42780 ; WX 400 ; N uniA71C ; G 4561 -U 42781 ; WX 287 ; N uniA71D ; G 4562 -U 42782 ; WX 287 ; N uniA71E ; G 4563 -U 42783 ; WX 287 ; N uniA71F ; G 4564 -U 42786 ; WX 444 ; N uniA722 ; G 4565 -U 42787 ; WX 390 ; N uniA723 ; G 4566 -U 42788 ; WX 540 ; N uniA724 ; G 4567 -U 42789 ; WX 540 ; N uniA725 ; G 4568 -U 42790 ; WX 837 ; N uniA726 ; G 4569 -U 42791 ; WX 712 ; N uniA727 ; G 4570 -U 42792 ; WX 1031 ; N uniA728 ; G 4571 -U 42793 ; WX 857 ; N uniA729 ; G 4572 -U 42794 ; WX 696 ; N uniA72A ; G 4573 -U 42795 ; WX 557 ; N uniA72B ; G 4574 -U 42800 ; WX 559 ; N uniA730 ; G 4575 -U 42801 ; WX 595 ; N uniA731 ; G 4576 -U 42802 ; WX 1349 ; N uniA732 ; G 4577 -U 42803 ; WX 1052 ; N uniA733 ; G 4578 -U 42804 ; WX 1285 ; N uniA734 ; G 4579 -U 42805 ; WX 1065 ; N uniA735 ; G 4580 -U 42806 ; WX 1245 ; N uniA736 ; G 4581 -U 42807 ; WX 1052 ; N uniA737 ; G 4582 -U 42808 ; WX 1079 ; N uniA738 ; G 4583 -U 42809 ; WX 922 ; N uniA739 ; G 4584 -U 42810 ; WX 1079 ; N uniA73A ; G 4585 -U 42811 ; WX 922 ; N uniA73B ; G 4586 -U 42812 ; WX 1035 ; N uniA73C ; G 4587 -U 42813 ; WX 922 ; N uniA73D ; G 4588 -U 42814 ; WX 698 ; N uniA73E ; G 4589 -U 42815 ; WX 549 ; N uniA73F ; G 4590 -U 42816 ; WX 656 ; N uniA740 ; G 4591 -U 42817 ; WX 579 ; N uniA741 ; G 4592 -U 42822 ; WX 850 ; N uniA746 ; G 4593 -U 42823 ; WX 542 ; N uniA747 ; G 4594 -U 42824 ; WX 683 ; N uniA748 ; G 4595 -U 42825 ; WX 531 ; N uniA749 ; G 4596 -U 42826 ; WX 918 ; N uniA74A ; G 4597 -U 42827 ; WX 814 ; N uniA74B ; G 4598 -U 42830 ; WX 1406 ; N uniA74E ; G 4599 -U 42831 ; WX 1106 ; N uniA74F ; G 4600 -U 42832 ; WX 733 ; N uniA750 ; G 4601 -U 42833 ; WX 716 ; N uniA751 ; G 4602 -U 42834 ; WX 948 ; N uniA752 ; G 4603 -U 42835 ; WX 937 ; N uniA753 ; G 4604 -U 42838 ; WX 850 ; N uniA756 ; G 4605 -U 42839 ; WX 716 ; N uniA757 ; G 4606 -U 42852 ; WX 738 ; N uniA764 ; G 4607 -U 42853 ; WX 716 ; N uniA765 ; G 4608 -U 42854 ; WX 738 ; N uniA766 ; G 4609 -U 42855 ; WX 716 ; N uniA767 ; G 4610 -U 42880 ; WX 637 ; N uniA780 ; G 4611 -U 42881 ; WX 343 ; N uniA781 ; G 4612 -U 42882 ; WX 837 ; N uniA782 ; G 4613 -U 42883 ; WX 712 ; N uniA783 ; G 4614 -U 42889 ; WX 400 ; N uniA789 ; G 4615 -U 42890 ; WX 396 ; N uniA78A ; G 4616 -U 42891 ; WX 456 ; N uniA78B ; G 4617 -U 42892 ; WX 306 ; N uniA78C ; G 4618 -U 42893 ; WX 808 ; N uniA78D ; G 4619 -U 42894 ; WX 693 ; N uniA78E ; G 4620 -U 42896 ; WX 928 ; N uniA790 ; G 4621 -U 42897 ; WX 768 ; N uniA791 ; G 4622 -U 42912 ; WX 821 ; N uniA7A0 ; G 4623 -U 42913 ; WX 716 ; N uniA7A1 ; G 4624 -U 42914 ; WX 775 ; N uniA7A2 ; G 4625 -U 42915 ; WX 665 ; N uniA7A3 ; G 4626 -U 42916 ; WX 837 ; N uniA7A4 ; G 4627 -U 42917 ; WX 712 ; N uniA7A5 ; G 4628 -U 42918 ; WX 770 ; N uniA7A6 ; G 4629 -U 42919 ; WX 493 ; N uniA7A7 ; G 4630 -U 42920 ; WX 720 ; N uniA7A8 ; G 4631 -U 42921 ; WX 595 ; N uniA7A9 ; G 4632 -U 42922 ; WX 886 ; N uniA7AA ; G 4633 -U 43000 ; WX 613 ; N uniA7F8 ; G 4634 -U 43001 ; WX 689 ; N uniA7F9 ; G 4635 -U 43002 ; WX 1062 ; N uniA7FA ; G 4636 -U 43003 ; WX 683 ; N uniA7FB ; G 4637 -U 43004 ; WX 733 ; N uniA7FC ; G 4638 -U 43005 ; WX 995 ; N uniA7FD ; G 4639 -U 43006 ; WX 372 ; N uniA7FE ; G 4640 -U 43007 ; WX 1325 ; N uniA7FF ; G 4641 -U 61184 ; WX 216 ; N uni02E5.5 ; G 4642 -U 61185 ; WX 242 ; N uni02E6.5 ; G 4643 -U 61186 ; WX 267 ; N uni02E7.5 ; G 4644 -U 61187 ; WX 277 ; N uni02E8.5 ; G 4645 -U 61188 ; WX 282 ; N uni02E9.5 ; G 4646 -U 61189 ; WX 242 ; N uni02E5.4 ; G 4647 -U 61190 ; WX 216 ; N uni02E6.4 ; G 4648 -U 61191 ; WX 242 ; N uni02E7.4 ; G 4649 -U 61192 ; WX 267 ; N uni02E8.4 ; G 4650 -U 61193 ; WX 277 ; N uni02E9.4 ; G 4651 -U 61194 ; WX 267 ; N uni02E5.3 ; G 4652 -U 61195 ; WX 242 ; N uni02E6.3 ; G 4653 -U 61196 ; WX 216 ; N uni02E7.3 ; G 4654 -U 61197 ; WX 242 ; N uni02E8.3 ; G 4655 -U 61198 ; WX 267 ; N uni02E9.3 ; G 4656 -U 61199 ; WX 277 ; N uni02E5.2 ; G 4657 -U 61200 ; WX 267 ; N uni02E6.2 ; G 4658 -U 61201 ; WX 242 ; N uni02E7.2 ; G 4659 -U 61202 ; WX 216 ; N uni02E8.2 ; G 4660 -U 61203 ; WX 242 ; N uni02E9.2 ; G 4661 -U 61204 ; WX 282 ; N uni02E5.1 ; G 4662 -U 61205 ; WX 277 ; N uni02E6.1 ; G 4663 -U 61206 ; WX 267 ; N uni02E7.1 ; G 4664 -U 61207 ; WX 242 ; N uni02E8.1 ; G 4665 -U 61208 ; WX 216 ; N uni02E9.1 ; G 4666 -U 61209 ; WX 282 ; N stem ; G 4667 -U 62464 ; WX 612 ; N uniF400 ; G 4668 -U 62465 ; WX 612 ; N uniF401 ; G 4669 -U 62466 ; WX 653 ; N uniF402 ; G 4670 -U 62467 ; WX 902 ; N uniF403 ; G 4671 -U 62468 ; WX 617 ; N uniF404 ; G 4672 -U 62469 ; WX 617 ; N uniF405 ; G 4673 -U 62470 ; WX 680 ; N uniF406 ; G 4674 -U 62471 ; WX 904 ; N uniF407 ; G 4675 -U 62472 ; WX 599 ; N uniF408 ; G 4676 -U 62473 ; WX 617 ; N uniF409 ; G 4677 -U 62474 ; WX 1163 ; N uniF40A ; G 4678 -U 62475 ; WX 621 ; N uniF40B ; G 4679 -U 62476 ; WX 622 ; N uniF40C ; G 4680 -U 62477 ; WX 893 ; N uniF40D ; G 4681 -U 62478 ; WX 612 ; N uniF40E ; G 4682 -U 62479 ; WX 622 ; N uniF40F ; G 4683 -U 62480 ; WX 924 ; N uniF410 ; G 4684 -U 62481 ; WX 622 ; N uniF411 ; G 4685 -U 62482 ; WX 754 ; N uniF412 ; G 4686 -U 62483 ; WX 624 ; N uniF413 ; G 4687 -U 62484 ; WX 886 ; N uniF414 ; G 4688 -U 62485 ; WX 622 ; N uniF415 ; G 4689 -U 62486 ; WX 907 ; N uniF416 ; G 4690 -U 62487 ; WX 621 ; N uniF417 ; G 4691 -U 62488 ; WX 611 ; N uniF418 ; G 4692 -U 62489 ; WX 624 ; N uniF419 ; G 4693 -U 62490 ; WX 677 ; N uniF41A ; G 4694 -U 62491 ; WX 621 ; N uniF41B ; G 4695 -U 62492 ; WX 611 ; N uniF41C ; G 4696 -U 62493 ; WX 630 ; N uniF41D ; G 4697 -U 62494 ; WX 622 ; N uniF41E ; G 4698 -U 62495 ; WX 561 ; N uniF41F ; G 4699 -U 62496 ; WX 612 ; N uniF420 ; G 4700 -U 62497 ; WX 626 ; N uniF421 ; G 4701 -U 62498 ; WX 612 ; N uniF422 ; G 4702 -U 62499 ; WX 611 ; N uniF423 ; G 4703 -U 62500 ; WX 618 ; N uniF424 ; G 4704 -U 62501 ; WX 667 ; N uniF425 ; G 4705 -U 62502 ; WX 963 ; N uniF426 ; G 4706 -U 62504 ; WX 1023 ; N uniF428 ; G 4707 -U 62505 ; WX 844 ; N uniF429 ; G 4708 -U 62506 ; WX 563 ; N uniF42A ; G 4709 -U 62507 ; WX 563 ; N uniF42B ; G 4710 -U 62508 ; WX 563 ; N uniF42C ; G 4711 -U 62509 ; WX 563 ; N uniF42D ; G 4712 -U 62510 ; WX 563 ; N uniF42E ; G 4713 -U 62511 ; WX 563 ; N uniF42F ; G 4714 -U 62512 ; WX 555 ; N uniF430 ; G 4715 -U 62513 ; WX 555 ; N uniF431 ; G 4716 -U 62514 ; WX 555 ; N uniF432 ; G 4717 -U 62515 ; WX 555 ; N uniF433 ; G 4718 -U 62516 ; WX 573 ; N uniF434 ; G 4719 -U 62517 ; WX 573 ; N uniF435 ; G 4720 -U 62518 ; WX 573 ; N uniF436 ; G 4721 -U 62519 ; WX 824 ; N uniF437 ; G 4722 -U 62520 ; WX 824 ; N uniF438 ; G 4723 -U 62521 ; WX 824 ; N uniF439 ; G 4724 -U 62522 ; WX 824 ; N uniF43A ; G 4725 -U 62523 ; WX 824 ; N uniF43B ; G 4726 -U 62524 ; WX 611 ; N uniF43C ; G 4727 -U 62525 ; WX 611 ; N uniF43D ; G 4728 -U 62526 ; WX 611 ; N uniF43E ; G 4729 -U 62527 ; WX 611 ; N uniF43F ; G 4730 -U 62528 ; WX 611 ; N uniF440 ; G 4731 -U 62529 ; WX 611 ; N uniF441 ; G 4732 -U 62917 ; WX 687 ; N uniF5C5 ; G 4733 -U 64256 ; WX 833 ; N uniFB00 ; G 4734 -U 64257 ; WX 787 ; N fi ; G 4735 -U 64258 ; WX 787 ; N fl ; G 4736 -U 64259 ; WX 1138 ; N uniFB03 ; G 4737 -U 64260 ; WX 1139 ; N uniFB04 ; G 4738 -U 64261 ; WX 808 ; N uniFB05 ; G 4739 -U 64262 ; WX 1020 ; N uniFB06 ; G 4740 -U 64275 ; WX 1388 ; N uniFB13 ; G 4741 -U 64276 ; WX 1384 ; N uniFB14 ; G 4742 -U 64277 ; WX 1378 ; N uniFB15 ; G 4743 -U 64278 ; WX 1384 ; N uniFB16 ; G 4744 -U 64279 ; WX 1713 ; N uniFB17 ; G 4745 -U 64285 ; WX 294 ; N uniFB1D ; G 4746 -U 64286 ; WX 0 ; N uniFB1E ; G 4747 -U 64287 ; WX 663 ; N uniFB1F ; G 4748 -U 64288 ; WX 665 ; N uniFB20 ; G 4749 -U 64289 ; WX 939 ; N uniFB21 ; G 4750 -U 64290 ; WX 788 ; N uniFB22 ; G 4751 -U 64291 ; WX 920 ; N uniFB23 ; G 4752 -U 64292 ; WX 786 ; N uniFB24 ; G 4753 -U 64293 ; WX 857 ; N uniFB25 ; G 4754 -U 64294 ; WX 869 ; N uniFB26 ; G 4755 -U 64295 ; WX 821 ; N uniFB27 ; G 4756 -U 64296 ; WX 890 ; N uniFB28 ; G 4757 -U 64297 ; WX 838 ; N uniFB29 ; G 4758 -U 64298 ; WX 749 ; N uniFB2A ; G 4759 -U 64299 ; WX 749 ; N uniFB2B ; G 4760 -U 64300 ; WX 749 ; N uniFB2C ; G 4761 -U 64301 ; WX 749 ; N uniFB2D ; G 4762 -U 64302 ; WX 728 ; N uniFB2E ; G 4763 -U 64303 ; WX 728 ; N uniFB2F ; G 4764 -U 64304 ; WX 728 ; N uniFB30 ; G 4765 -U 64305 ; WX 610 ; N uniFB31 ; G 4766 -U 64306 ; WX 447 ; N uniFB32 ; G 4767 -U 64307 ; WX 588 ; N uniFB33 ; G 4768 -U 64308 ; WX 687 ; N uniFB34 ; G 4769 -U 64309 ; WX 343 ; N uniFB35 ; G 4770 -U 64310 ; WX 400 ; N uniFB36 ; G 4771 -U 64311 ; WX 1000 ; N uniFB37 ; G 4772 -U 64312 ; WX 679 ; N uniFB38 ; G 4773 -U 64313 ; WX 436 ; N uniFB39 ; G 4774 -U 64314 ; WX 578 ; N uniFB3A ; G 4775 -U 64315 ; WX 566 ; N uniFB3B ; G 4776 -U 64316 ; WX 605 ; N uniFB3C ; G 4777 -U 64317 ; WX 1000 ; N uniFB3D ; G 4778 -U 64318 ; WX 724 ; N uniFB3E ; G 4779 -U 64319 ; WX 1000 ; N uniFB3F ; G 4780 -U 64320 ; WX 453 ; N uniFB40 ; G 4781 -U 64321 ; WX 680 ; N uniFB41 ; G 4782 -U 64322 ; WX 1000 ; N uniFB42 ; G 4783 -U 64323 ; WX 675 ; N uniFB43 ; G 4784 -U 64324 ; WX 658 ; N uniFB44 ; G 4785 -U 64325 ; WX 1000 ; N uniFB45 ; G 4786 -U 64326 ; WX 653 ; N uniFB46 ; G 4787 -U 64327 ; WX 736 ; N uniFB47 ; G 4788 -U 64328 ; WX 602 ; N uniFB48 ; G 4789 -U 64329 ; WX 749 ; N uniFB49 ; G 4790 -U 64330 ; WX 683 ; N uniFB4A ; G 4791 -U 64331 ; WX 343 ; N uniFB4B ; G 4792 -U 64332 ; WX 610 ; N uniFB4C ; G 4793 -U 64333 ; WX 566 ; N uniFB4D ; G 4794 -U 64334 ; WX 658 ; N uniFB4E ; G 4795 -U 64335 ; WX 710 ; N uniFB4F ; G 4796 -U 65024 ; WX 0 ; N uniFE00 ; G 4797 -U 65025 ; WX 0 ; N uniFE01 ; G 4798 -U 65026 ; WX 0 ; N uniFE02 ; G 4799 -U 65027 ; WX 0 ; N uniFE03 ; G 4800 -U 65028 ; WX 0 ; N uniFE04 ; G 4801 -U 65029 ; WX 0 ; N uniFE05 ; G 4802 -U 65030 ; WX 0 ; N uniFE06 ; G 4803 -U 65031 ; WX 0 ; N uniFE07 ; G 4804 -U 65032 ; WX 0 ; N uniFE08 ; G 4805 -U 65033 ; WX 0 ; N uniFE09 ; G 4806 -U 65034 ; WX 0 ; N uniFE0A ; G 4807 -U 65035 ; WX 0 ; N uniFE0B ; G 4808 -U 65036 ; WX 0 ; N uniFE0C ; G 4809 -U 65037 ; WX 0 ; N uniFE0D ; G 4810 -U 65038 ; WX 0 ; N uniFE0E ; G 4811 -U 65039 ; WX 0 ; N uniFE0F ; G 4812 -U 65056 ; WX 0 ; N uniFE20 ; G 4813 -U 65057 ; WX 0 ; N uniFE21 ; G 4814 -U 65058 ; WX 0 ; N uniFE22 ; G 4815 -U 65059 ; WX 0 ; N uniFE23 ; G 4816 -U 65529 ; WX 0 ; N uniFFF9 ; G 4817 -U 65530 ; WX 0 ; N uniFFFA ; G 4818 -U 65531 ; WX 0 ; N uniFFFB ; G 4819 -U 65532 ; WX 0 ; N uniFFFC ; G 4820 -U 65533 ; WX 1113 ; N uniFFFD ; G 4821 -EndCharMetrics -StartKernData -StartKernPairs 1921 - -KPX dollar ampersand -63 -KPX dollar two -63 -KPX dollar seven -196 -KPX dollar eight -92 -KPX dollar nine -139 -KPX dollar colon -112 -KPX dollar less -235 -KPX dollar F -63 -KPX dollar G -63 -KPX dollar W -112 -KPX dollar Y -112 -KPX dollar Z -92 -KPX dollar backslash -149 -KPX dollar copyright -63 -KPX dollar questiondown -149 -KPX dollar Aacute -149 -KPX dollar Egrave -63 -KPX dollar Eacute -63 -KPX dollar Ecircumflex -63 -KPX dollar Edieresis -63 -KPX dollar Igrave -63 -KPX dollar Iacute -63 -KPX dollar Icircumflex -63 -KPX dollar Idieresis -63 -KPX dollar Ntilde -63 -KPX dollar Oacute -63 -KPX dollar Dcaron -63 -KPX dollar Dcroat -63 -KPX dollar Emacron -63 -KPX dollar Ebreve -63 -KPX dollar Hcircumflex -196 -KPX dollar hcircumflex -112 -KPX dollar Hbar -196 -KPX dollar hbar -112 -KPX dollar Imacron -92 -KPX dollar Ibreve -92 -KPX dollar Iogonek -92 -KPX dollar Idot -92 -KPX dollar IJ -92 -KPX dollar Jcircumflex -92 -KPX dollar Kcommaaccent -112 -KPX dollar kcommaaccent -92 -KPX dollar kgreenlandic -235 -KPX dollar Lacute -149 -KPX dollar lacute -235 -KPX dollar uni01AC -63 -KPX dollar uni01AE -63 -KPX dollar uni01DC -196 -KPX dollar uni01DD -112 -KPX dollar uni01F0 -63 -KPX dollar uni01F4 -235 -KPX dollar uni01F5 -149 - -KPX percent nine -83 -KPX percent colon -112 -KPX percent less -112 -KPX percent Kcommaaccent -112 -KPX percent kgreenlandic -112 -KPX percent lacute -112 -KPX percent uni01F4 -112 - -KPX ampersand six -73 -KPX ampersand Gcircumflex -73 -KPX ampersand Gbreve -73 -KPX ampersand Gdotaccent -73 -KPX ampersand Gcommaaccent -73 -KPX ampersand uni01DA -73 - -KPX quotesingle less -159 -KPX quotesingle kgreenlandic -159 -KPX quotesingle lacute -159 -KPX quotesingle uni01F4 -159 - -KPX parenright dollar -264 -KPX parenright D -235 -KPX parenright H -159 -KPX parenright R -159 -KPX parenright U -225 -KPX parenright X -196 -KPX parenright backslash -188 -KPX parenright cent -235 -KPX parenright sterling -235 -KPX parenright currency -235 -KPX parenright yen -235 -KPX parenright brokenbar -235 -KPX parenright section -235 -KPX parenright dieresis -235 -KPX parenright ordfeminine -159 -KPX parenright guillemotleft -159 -KPX parenright logicalnot -159 -KPX parenright sfthyphen -159 -KPX parenright acute -159 -KPX parenright mu -159 -KPX parenright paragraph -159 -KPX parenright periodcentered -159 -KPX parenright cedilla -159 -KPX parenright ordmasculine -159 -KPX parenright guillemotright -196 -KPX parenright onequarter -196 -KPX parenright onehalf -196 -KPX parenright threequarters -196 -KPX parenright questiondown -188 -KPX parenright Aacute -188 -KPX parenright Acircumflex -264 -KPX parenright Atilde -235 -KPX parenright Adieresis -264 -KPX parenright Aring -235 -KPX parenright AE -264 -KPX parenright Ccedilla -235 -KPX parenright Otilde -159 -KPX parenright multiply -159 -KPX parenright Ugrave -159 -KPX parenright Ucircumflex -159 -KPX parenright Yacute -159 -KPX parenright dcaron -159 -KPX parenright dmacron -159 -KPX parenright emacron -159 -KPX parenright ebreve -159 -KPX parenright edotaccent -225 -KPX parenright eogonek -225 -KPX parenright ecaron -225 -KPX parenright imacron -196 -KPX parenright ibreve -196 -KPX parenright iogonek -196 -KPX parenright dotlessi -196 -KPX parenright ij -196 -KPX parenright jcircumflex -196 -KPX parenright Lacute -188 -KPX parenright uni01A5 -235 -KPX parenright uni01AD -159 -KPX parenright Uhorn -159 -KPX parenright uni01F1 -159 -KPX parenright uni01F5 -188 - -KPX asterisk seven -36 -KPX asterisk less -83 -KPX asterisk Hbar -36 -KPX asterisk lacute -83 - -KPX period ampersand -131 -KPX period two -131 -KPX period eight -73 -KPX period colon -55 -KPX period H -112 -KPX period R -112 -KPX period X -112 -KPX period backslash -206 -KPX period ordfeminine -112 -KPX period guillemotleft -112 -KPX period logicalnot -112 -KPX period sfthyphen -112 -KPX period acute -112 -KPX period mu -112 -KPX period paragraph -112 -KPX period periodcentered -112 -KPX period cedilla -112 -KPX period ordmasculine -112 -KPX period guillemotright -112 -KPX period onequarter -112 -KPX period onehalf -112 -KPX period threequarters -112 -KPX period questiondown -206 -KPX period Aacute -206 -KPX period Egrave -131 -KPX period Icircumflex -131 -KPX period Yacute -112 -KPX period Ebreve -178 -KPX period ebreve -112 -KPX period Idot -73 -KPX period dotlessi -112 - -KPX slash two -73 -KPX slash seven -339 -KPX slash eight -112 -KPX slash nine -282 -KPX slash colon -178 -KPX slash less -319 -KPX slash backslash -253 -KPX slash questiondown -253 -KPX slash Aacute -253 -KPX slash Ebreve -73 -KPX slash Hbar -339 -KPX slash Idot -112 -KPX slash lacute -319 - -KPX two nine -73 -KPX two semicolon -73 -KPX two less -149 -KPX two lacute -149 - -KPX three dollar -188 -KPX three D -131 -KPX three H -55 -KPX three U -63 -KPX three V -73 -KPX three X -73 -KPX three cent -131 -KPX three sterling -131 -KPX three currency -131 -KPX three yen -131 -KPX three brokenbar -131 -KPX three section -131 -KPX three dieresis -131 -KPX three ordfeminine -55 -KPX three guillemotleft -55 -KPX three logicalnot -55 -KPX three sfthyphen -55 -KPX three guillemotright -73 -KPX three onequarter -73 -KPX three onehalf -73 -KPX three threequarters -73 -KPX three Yacute -55 -KPX three edotaccent -63 -KPX three ecaron -63 -KPX three gdotaccent -73 -KPX three gcommaaccent -73 -KPX three dotlessi -73 - - -KPX five seven -92 -KPX five less -188 -KPX five H -102 -KPX five R -102 -KPX five X -112 -KPX five backslash -131 -KPX five ordfeminine -102 -KPX five guillemotleft -102 -KPX five logicalnot -102 -KPX five sfthyphen -102 -KPX five acute -102 -KPX five mu -102 -KPX five paragraph -102 -KPX five periodcentered -102 -KPX five cedilla -102 -KPX five ordmasculine -102 -KPX five guillemotright -112 -KPX five onequarter -112 -KPX five onehalf -112 -KPX five threequarters -112 -KPX five questiondown -131 -KPX five Aacute -131 -KPX five Yacute -102 -KPX five ebreve -102 -KPX five Hbar -92 -KPX five dotlessi -112 -KPX five lacute -188 - -KPX six six -73 -KPX six Gdotaccent -73 -KPX six Gcommaaccent -73 - -KPX seven dollar -159 -KPX seven seven 47 -KPX seven D -243 -KPX seven F -264 -KPX seven H -264 -KPX seven R -264 -KPX seven U -225 -KPX seven V -243 -KPX seven X -264 -KPX seven Z -282 -KPX seven backslash -339 -KPX seven cent -243 -KPX seven sterling -243 -KPX seven currency -243 -KPX seven yen -243 -KPX seven brokenbar -243 -KPX seven section -243 -KPX seven dieresis -243 -KPX seven copyright -264 -KPX seven ordfeminine -264 -KPX seven guillemotleft -264 -KPX seven logicalnot -264 -KPX seven sfthyphen -264 -KPX seven acute -264 -KPX seven mu -264 -KPX seven paragraph -264 -KPX seven periodcentered -264 -KPX seven cedilla -264 -KPX seven ordmasculine -264 -KPX seven guillemotright -264 -KPX seven onequarter -264 -KPX seven onehalf -264 -KPX seven threequarters -264 -KPX seven questiondown -339 -KPX seven Aacute -339 -KPX seven Eacute -264 -KPX seven Idieresis -264 -KPX seven Yacute -264 -KPX seven ebreve -264 -KPX seven edotaccent -225 -KPX seven ecaron -225 -KPX seven gdotaccent -243 -KPX seven gcommaaccent -243 -KPX seven Hbar 47 -KPX seven dotlessi -264 - -KPX eight dollar -92 - -KPX nine dollar -139 -KPX nine two -36 -KPX nine D -159 -KPX nine H -149 -KPX nine L -36 -KPX nine R -149 -KPX nine X -149 -KPX nine cent -159 -KPX nine sterling -159 -KPX nine currency -159 -KPX nine yen -159 -KPX nine brokenbar -159 -KPX nine section -159 -KPX nine dieresis -159 -KPX nine ordfeminine -149 -KPX nine guillemotleft -149 -KPX nine logicalnot -149 -KPX nine sfthyphen -149 -KPX nine acute -149 -KPX nine mu -149 -KPX nine paragraph -149 -KPX nine periodcentered -149 -KPX nine cedilla -149 -KPX nine ordmasculine -149 -KPX nine guillemotright -149 -KPX nine onequarter -149 -KPX nine onehalf -149 -KPX nine threequarters -149 -KPX nine Yacute -149 -KPX nine Ebreve -45 -KPX nine ebreve -149 -KPX nine dotlessi -149 - -KPX colon dollar -73 -KPX colon D -139 -KPX colon H -131 -KPX colon R -112 -KPX colon U -120 -KPX colon cent -139 -KPX colon sterling -139 -KPX colon currency -139 -KPX colon yen -139 -KPX colon brokenbar -139 -KPX colon section -139 -KPX colon dieresis -139 -KPX colon ordfeminine -131 -KPX colon guillemotleft -131 -KPX colon logicalnot -131 -KPX colon sfthyphen -131 -KPX colon acute -112 -KPX colon mu -112 -KPX colon paragraph -112 -KPX colon periodcentered -112 -KPX colon cedilla -112 -KPX colon ordmasculine -112 -KPX colon Yacute -131 -KPX colon ebreve -112 -KPX colon edotaccent -120 -KPX colon ecaron -120 - -KPX semicolon ampersand -73 -KPX semicolon two -73 -KPX semicolon H -131 -KPX semicolon ordfeminine -131 -KPX semicolon guillemotleft -131 -KPX semicolon logicalnot -131 -KPX semicolon sfthyphen -131 -KPX semicolon Egrave -73 -KPX semicolon Icircumflex -73 -KPX semicolon Yacute -131 -KPX semicolon Ebreve -112 - -KPX less dollar -196 -KPX less ampersand -73 -KPX less two -73 -KPX less D -243 -KPX less H -264 -KPX less R -264 -KPX less X -225 -KPX less cent -243 -KPX less sterling -243 -KPX less currency -243 -KPX less yen -243 -KPX less brokenbar -243 -KPX less section -243 -KPX less dieresis -243 -KPX less ordfeminine -264 -KPX less guillemotleft -264 -KPX less logicalnot -264 -KPX less sfthyphen -264 -KPX less acute -264 -KPX less mu -264 -KPX less paragraph -264 -KPX less periodcentered -264 -KPX less cedilla -264 -KPX less ordmasculine -264 -KPX less guillemotright -225 -KPX less onequarter -225 -KPX less onehalf -225 -KPX less threequarters -225 -KPX less Egrave -73 -KPX less Icircumflex -73 -KPX less Yacute -264 -KPX less Ebreve -120 -KPX less ebreve -264 -KPX less dotlessi -225 - - -KPX D backslash -63 -KPX D questiondown -63 -KPX D Aacute -63 - - -KPX N H -73 -KPX N R -73 -KPX N ordfeminine -73 -KPX N guillemotleft -73 -KPX N logicalnot -73 -KPX N sfthyphen -73 -KPX N acute -73 -KPX N mu -73 -KPX N paragraph -73 -KPX N periodcentered -73 -KPX N cedilla -73 -KPX N ordmasculine -45 -KPX N Yacute -73 -KPX N ebreve -73 - - - - - -KPX cent backslash -63 -KPX cent questiondown -63 -KPX cent Aacute -63 - -KPX sterling backslash -63 -KPX sterling questiondown -63 -KPX sterling Aacute -63 - -KPX currency backslash -63 -KPX currency questiondown -63 -KPX currency Aacute -63 - -KPX yen backslash -63 -KPX yen questiondown -63 -KPX yen Aacute -63 - -KPX brokenbar backslash -63 -KPX brokenbar questiondown -63 -KPX brokenbar Aacute -63 - -KPX section backslash -63 -KPX section questiondown -63 -KPX section Aacute -63 - - - -KPX Acircumflex ampersand -63 -KPX Acircumflex two -63 -KPX Acircumflex seven -196 -KPX Acircumflex eight -92 -KPX Acircumflex nine -139 -KPX Acircumflex colon -112 -KPX Acircumflex less -235 -KPX Acircumflex F -63 -KPX Acircumflex G -63 -KPX Acircumflex W -112 -KPX Acircumflex Y -112 -KPX Acircumflex Z -92 -KPX Acircumflex backslash -149 -KPX Acircumflex copyright -63 -KPX Acircumflex questiondown -149 -KPX Acircumflex Aacute -149 -KPX Acircumflex Egrave -63 -KPX Acircumflex Eacute -63 -KPX Acircumflex Ecircumflex -63 -KPX Acircumflex Edieresis -63 -KPX Acircumflex Igrave -63 -KPX Acircumflex Iacute -63 -KPX Acircumflex Icircumflex -63 -KPX Acircumflex Idieresis -63 -KPX Acircumflex Ntilde -63 -KPX Acircumflex Oacute -63 -KPX Acircumflex Dcaron -63 -KPX Acircumflex Dcroat -63 -KPX Acircumflex Emacron -63 -KPX Acircumflex Ebreve -63 -KPX Acircumflex Hcircumflex -196 -KPX Acircumflex hcircumflex -112 -KPX Acircumflex Hbar -196 -KPX Acircumflex hbar -112 -KPX Acircumflex Imacron -92 -KPX Acircumflex Ibreve -92 -KPX Acircumflex Iogonek -92 -KPX Acircumflex Idot -92 -KPX Acircumflex IJ -92 -KPX Acircumflex Jcircumflex -92 -KPX Acircumflex Kcommaaccent -112 -KPX Acircumflex kcommaaccent -92 -KPX Acircumflex kgreenlandic -235 -KPX Acircumflex Lacute -149 -KPX Acircumflex lacute -235 -KPX Acircumflex uni01AC -63 -KPX Acircumflex uni01AE -63 -KPX Acircumflex uni01DC -196 -KPX Acircumflex uni01DD -112 -KPX Acircumflex uni01F0 -63 -KPX Acircumflex uni01F4 -235 -KPX Acircumflex uni01F5 -149 - -KPX Adieresis ampersand -63 -KPX Adieresis two -63 -KPX Adieresis seven -196 -KPX Adieresis eight -92 -KPX Adieresis nine -139 -KPX Adieresis colon -112 -KPX Adieresis less -235 -KPX Adieresis F -63 -KPX Adieresis G -63 -KPX Adieresis W -112 -KPX Adieresis Y -112 -KPX Adieresis Z -92 -KPX Adieresis backslash -149 -KPX Adieresis copyright -63 -KPX Adieresis questiondown -149 -KPX Adieresis Aacute -149 -KPX Adieresis Egrave -63 -KPX Adieresis Eacute -63 -KPX Adieresis Ecircumflex -63 -KPX Adieresis Edieresis -63 -KPX Adieresis Igrave -63 -KPX Adieresis Iacute -63 -KPX Adieresis Icircumflex -63 -KPX Adieresis Idieresis -63 -KPX Adieresis Ntilde -63 -KPX Adieresis Oacute -63 -KPX Adieresis Dcaron -63 -KPX Adieresis Dcroat -63 -KPX Adieresis Emacron -63 -KPX Adieresis Ebreve -63 -KPX Adieresis Hcircumflex -196 -KPX Adieresis hcircumflex -112 -KPX Adieresis Hbar -196 -KPX Adieresis hbar -112 -KPX Adieresis Imacron -92 -KPX Adieresis Ibreve -92 -KPX Adieresis Iogonek -92 -KPX Adieresis Idot -92 -KPX Adieresis IJ -92 -KPX Adieresis Jcircumflex -92 -KPX Adieresis Kcommaaccent -112 -KPX Adieresis kcommaaccent -92 -KPX Adieresis kgreenlandic -235 -KPX Adieresis Lacute -149 -KPX Adieresis lacute -235 -KPX Adieresis uni01AC -63 -KPX Adieresis uni01AE -63 -KPX Adieresis uni01DC -196 -KPX Adieresis uni01DD -112 -KPX Adieresis uni01F0 -63 -KPX Adieresis uni01F4 -235 -KPX Adieresis uni01F5 -149 - -KPX AE ampersand -63 -KPX AE two -63 -KPX AE seven -196 -KPX AE eight -92 -KPX AE nine -139 -KPX AE colon -112 -KPX AE less -235 -KPX AE F -63 -KPX AE G -63 -KPX AE W -112 -KPX AE Y -112 -KPX AE Z -92 -KPX AE backslash -149 -KPX AE copyright -63 -KPX AE questiondown -149 -KPX AE Aacute -149 -KPX AE Egrave -63 -KPX AE Eacute -63 -KPX AE Ecircumflex -63 -KPX AE Edieresis -63 -KPX AE Igrave -63 -KPX AE Iacute -63 -KPX AE Icircumflex -63 -KPX AE Idieresis -63 -KPX AE Ntilde -63 -KPX AE Oacute -63 -KPX AE Dcaron -63 -KPX AE Dcroat -63 -KPX AE Emacron -63 -KPX AE Ebreve -63 -KPX AE Hcircumflex -196 -KPX AE hcircumflex -112 -KPX AE Hbar -196 -KPX AE hbar -112 -KPX AE Imacron -92 -KPX AE Ibreve -92 -KPX AE Iogonek -92 -KPX AE Idot -92 -KPX AE IJ -92 -KPX AE Jcircumflex -92 -KPX AE Kcommaaccent -112 -KPX AE kcommaaccent -92 -KPX AE kgreenlandic -235 -KPX AE Lacute -149 -KPX AE lacute -235 -KPX AE uni01AC -63 -KPX AE uni01AE -63 -KPX AE uni01DC -196 -KPX AE uni01DD -112 -KPX AE uni01F0 -63 -KPX AE uni01F4 -235 -KPX AE uni01F5 -149 - -KPX Egrave six -73 -KPX Egrave Gcircumflex -73 -KPX Egrave Gbreve -73 -KPX Egrave Gdotaccent -73 -KPX Egrave Gcommaaccent -73 -KPX Egrave uni01DA -73 - -KPX Ecircumflex six -73 -KPX Ecircumflex Gcircumflex -73 -KPX Ecircumflex Gbreve -73 -KPX Ecircumflex Gdotaccent -73 -KPX Ecircumflex Gcommaaccent -73 -KPX Ecircumflex uni01DA -73 - -KPX Igrave six -73 -KPX Igrave Gcircumflex -73 -KPX Igrave Gbreve -73 -KPX Igrave Gdotaccent -73 -KPX Igrave Gcommaaccent -73 -KPX Igrave uni01DA -73 - -KPX Icircumflex six -73 -KPX Icircumflex Gcircumflex -73 -KPX Icircumflex Gbreve -73 -KPX Icircumflex Gdotaccent -73 -KPX Icircumflex Gcommaaccent -73 -KPX Icircumflex uni01DA -73 - -KPX Eth less -159 -KPX Eth kgreenlandic -159 -KPX Eth lacute -159 -KPX Eth uni01F4 -159 - -KPX Ograve less -159 -KPX Ograve kgreenlandic -159 -KPX Ograve lacute -159 -KPX Ograve uni01F4 -159 - -KPX agrave seven -36 -KPX agrave less -83 -KPX agrave Hbar -36 -KPX agrave lacute -83 - -KPX ucircumflex two -73 -KPX ucircumflex seven -339 -KPX ucircumflex eight -112 -KPX ucircumflex nine -282 -KPX ucircumflex colon -178 -KPX ucircumflex less -319 -KPX ucircumflex backslash -253 -KPX ucircumflex questiondown -253 -KPX ucircumflex Aacute -253 -KPX ucircumflex Ebreve -73 -KPX ucircumflex Hbar -339 -KPX ucircumflex Idot -112 -KPX ucircumflex lacute -319 - -KPX ydieresis two -73 -KPX ydieresis seven -339 -KPX ydieresis eight -112 -KPX ydieresis nine -282 -KPX ydieresis colon -178 -KPX ydieresis less -319 -KPX ydieresis backslash -253 -KPX ydieresis questiondown -253 -KPX ydieresis Aacute -253 -KPX ydieresis Ebreve -73 -KPX ydieresis Hbar -339 -KPX ydieresis Idot -112 -KPX ydieresis lacute -319 - -KPX Abreve O -8 - -KPX abreve two -73 -KPX abreve seven -339 -KPX abreve eight -73 -KPX abreve nine -282 -KPX abreve colon -159 -KPX abreve less -319 -KPX abreve backslash -253 -KPX abreve questiondown -253 -KPX abreve Aacute -253 -KPX abreve Ebreve -73 -KPX abreve Hbar -339 -KPX abreve Idot -73 -KPX abreve lacute -319 - -KPX Edotaccent seven -92 -KPX Edotaccent less -188 -KPX Edotaccent H -102 -KPX Edotaccent R -102 -KPX Edotaccent X -112 -KPX Edotaccent backslash -131 -KPX Edotaccent ordfeminine -102 -KPX Edotaccent guillemotleft -102 -KPX Edotaccent logicalnot -102 -KPX Edotaccent sfthyphen -102 -KPX Edotaccent acute -102 -KPX Edotaccent mu -102 -KPX Edotaccent paragraph -102 -KPX Edotaccent periodcentered -102 -KPX Edotaccent cedilla -102 -KPX Edotaccent ordmasculine -102 -KPX Edotaccent guillemotright -112 -KPX Edotaccent onequarter -112 -KPX Edotaccent onehalf -112 -KPX Edotaccent threequarters -112 -KPX Edotaccent questiondown -131 -KPX Edotaccent Aacute -131 -KPX Edotaccent Yacute -102 -KPX Edotaccent ebreve -102 -KPX Edotaccent Hbar -92 -KPX Edotaccent dotlessi -112 -KPX Edotaccent lacute -188 - - -KPX Ecaron seven -92 -KPX Ecaron less -188 -KPX Ecaron H -102 -KPX Ecaron R -102 -KPX Ecaron X -112 -KPX Ecaron backslash -131 -KPX Ecaron ordfeminine -102 -KPX Ecaron guillemotleft -102 -KPX Ecaron logicalnot -102 -KPX Ecaron sfthyphen -102 -KPX Ecaron acute -102 -KPX Ecaron mu -102 -KPX Ecaron paragraph -102 -KPX Ecaron periodcentered -102 -KPX Ecaron cedilla -102 -KPX Ecaron ordmasculine -102 -KPX Ecaron guillemotright -112 -KPX Ecaron onequarter -112 -KPX Ecaron onehalf -112 -KPX Ecaron threequarters -112 -KPX Ecaron questiondown -131 -KPX Ecaron Aacute -131 -KPX Ecaron Yacute -102 -KPX Ecaron ebreve -102 -KPX Ecaron Hbar -92 -KPX Ecaron dotlessi -112 -KPX Ecaron lacute -188 - - -KPX Gdotaccent six -73 -KPX Gdotaccent Gdotaccent -73 -KPX Gdotaccent Gcommaaccent -73 - -KPX Gcommaaccent six -73 -KPX Gcommaaccent Gdotaccent -73 -KPX Gcommaaccent Gcommaaccent -73 - -KPX Hbar dollar -159 -KPX Hbar seven 47 -KPX Hbar D -243 -KPX Hbar F -264 -KPX Hbar H -264 -KPX Hbar R -264 -KPX Hbar U -225 -KPX Hbar V -243 -KPX Hbar X -264 -KPX Hbar Z -282 -KPX Hbar backslash -339 -KPX Hbar cent -243 -KPX Hbar sterling -243 -KPX Hbar currency -243 -KPX Hbar yen -243 -KPX Hbar brokenbar -243 -KPX Hbar section -243 -KPX Hbar dieresis -243 -KPX Hbar copyright -264 -KPX Hbar ordfeminine -264 -KPX Hbar guillemotleft -264 -KPX Hbar logicalnot -264 -KPX Hbar sfthyphen -264 -KPX Hbar acute -264 -KPX Hbar mu -264 -KPX Hbar paragraph -264 -KPX Hbar periodcentered -264 -KPX Hbar cedilla -264 -KPX Hbar ordmasculine -264 -KPX Hbar guillemotright -264 -KPX Hbar onequarter -264 -KPX Hbar onehalf -264 -KPX Hbar threequarters -264 -KPX Hbar questiondown -339 -KPX Hbar Aacute -339 -KPX Hbar Eacute -264 -KPX Hbar Idieresis -264 -KPX Hbar Yacute -264 -KPX Hbar ebreve -264 -KPX Hbar edotaccent -225 -KPX Hbar ecaron -225 -KPX Hbar gdotaccent -243 -KPX Hbar gcommaaccent -243 -KPX Hbar Hbar 47 -KPX Hbar dotlessi -264 - -KPX hbar Hbar -112 - -KPX Idot dollar -92 -KPX Idot Idot -92 - -KPX lacute dollar -196 -KPX lacute ampersand -73 -KPX lacute two -73 -KPX lacute D -243 -KPX lacute H -264 -KPX lacute R -264 -KPX lacute X -225 -KPX lacute cent -243 -KPX lacute sterling -243 -KPX lacute currency -243 -KPX lacute yen -243 -KPX lacute brokenbar -243 -KPX lacute section -243 -KPX lacute dieresis -243 -KPX lacute ordfeminine -264 -KPX lacute guillemotleft -264 -KPX lacute logicalnot -264 -KPX lacute sfthyphen -264 -KPX lacute acute -264 -KPX lacute mu -264 -KPX lacute paragraph -264 -KPX lacute periodcentered -264 -KPX lacute cedilla -264 -KPX lacute ordmasculine -264 -KPX lacute guillemotright -225 -KPX lacute onequarter -225 -KPX lacute onehalf -225 -KPX lacute threequarters -225 -KPX lacute Egrave -73 -KPX lacute Icircumflex -73 -KPX lacute Yacute -264 -KPX lacute Ebreve -120 -KPX lacute ebreve -264 -KPX lacute dotlessi -225 - - -KPX uni027D dollar -272 -KPX uni027D hyphen -92 -KPX uni027D nine 38 -KPX uni027D less 75 -KPX uni027D lacute 75 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ttf deleted file mode 100644 index 999bac7..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ufm deleted file mode 100644 index 0b8d60e..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ufm +++ /dev/null @@ -1,5268 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Sans -FontSubfamily Oblique -UniqueID DejaVu Sans Oblique -FullName DejaVu Sans Oblique -Version Version 2.37 -PostScriptName DejaVuSans-Oblique -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -PreferredFamily DejaVu Sans -PreferredSubfamily Oblique -Weight Medium -ItalicAngle -11 -IsFixedPitch false -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 928 -Descender -236 -FontBBox -1016 -350 1659 1068 -StartCharMetrics 5355 -U 32 ; WX 318 ; N space ; G 3 -U 33 ; WX 401 ; N exclam ; G 4 -U 34 ; WX 460 ; N quotedbl ; G 5 -U 35 ; WX 838 ; N numbersign ; G 6 -U 36 ; WX 636 ; N dollar ; G 7 -U 37 ; WX 950 ; N percent ; G 8 -U 38 ; WX 780 ; N ampersand ; G 9 -U 39 ; WX 275 ; N quotesingle ; G 10 -U 40 ; WX 390 ; N parenleft ; G 11 -U 41 ; WX 390 ; N parenright ; G 12 -U 42 ; WX 500 ; N asterisk ; G 13 -U 43 ; WX 838 ; N plus ; G 14 -U 44 ; WX 318 ; N comma ; G 15 -U 45 ; WX 361 ; N hyphen ; G 16 -U 46 ; WX 318 ; N period ; G 17 -U 47 ; WX 337 ; N slash ; G 18 -U 48 ; WX 636 ; N zero ; G 19 -U 49 ; WX 636 ; N one ; G 20 -U 50 ; WX 636 ; N two ; G 21 -U 51 ; WX 636 ; N three ; G 22 -U 52 ; WX 636 ; N four ; G 23 -U 53 ; WX 636 ; N five ; G 24 -U 54 ; WX 636 ; N six ; G 25 -U 55 ; WX 636 ; N seven ; G 26 -U 56 ; WX 636 ; N eight ; G 27 -U 57 ; WX 636 ; N nine ; G 28 -U 58 ; WX 337 ; N colon ; G 29 -U 59 ; WX 337 ; N semicolon ; G 30 -U 60 ; WX 838 ; N less ; G 31 -U 61 ; WX 838 ; N equal ; G 32 -U 62 ; WX 838 ; N greater ; G 33 -U 63 ; WX 531 ; N question ; G 34 -U 64 ; WX 1000 ; N at ; G 35 -U 65 ; WX 684 ; N A ; G 36 -U 66 ; WX 686 ; N B ; G 37 -U 67 ; WX 698 ; N C ; G 38 -U 68 ; WX 770 ; N D ; G 39 -U 69 ; WX 632 ; N E ; G 40 -U 70 ; WX 575 ; N F ; G 41 -U 71 ; WX 775 ; N G ; G 42 -U 72 ; WX 752 ; N H ; G 43 -U 73 ; WX 295 ; N I ; G 44 -U 74 ; WX 295 ; N J ; G 45 -U 75 ; WX 656 ; N K ; G 46 -U 76 ; WX 557 ; N L ; G 47 -U 77 ; WX 863 ; N M ; G 48 -U 78 ; WX 748 ; N N ; G 49 -U 79 ; WX 787 ; N O ; G 50 -U 80 ; WX 603 ; N P ; G 51 -U 81 ; WX 787 ; N Q ; G 52 -U 82 ; WX 695 ; N R ; G 53 -U 83 ; WX 635 ; N S ; G 54 -U 84 ; WX 611 ; N T ; G 55 -U 85 ; WX 732 ; N U ; G 56 -U 86 ; WX 684 ; N V ; G 57 -U 87 ; WX 989 ; N W ; G 58 -U 88 ; WX 685 ; N X ; G 59 -U 89 ; WX 611 ; N Y ; G 60 -U 90 ; WX 685 ; N Z ; G 61 -U 91 ; WX 390 ; N bracketleft ; G 62 -U 92 ; WX 337 ; N backslash ; G 63 -U 93 ; WX 390 ; N bracketright ; G 64 -U 94 ; WX 838 ; N asciicircum ; G 65 -U 95 ; WX 500 ; N underscore ; G 66 -U 96 ; WX 500 ; N grave ; G 67 -U 97 ; WX 613 ; N a ; G 68 -U 98 ; WX 635 ; N b ; G 69 -U 99 ; WX 550 ; N c ; G 70 -U 100 ; WX 635 ; N d ; G 71 -U 101 ; WX 615 ; N e ; G 72 -U 102 ; WX 352 ; N f ; G 73 -U 103 ; WX 635 ; N g ; G 74 -U 104 ; WX 634 ; N h ; G 75 -U 105 ; WX 278 ; N i ; G 76 -U 106 ; WX 278 ; N j ; G 77 -U 107 ; WX 579 ; N k ; G 78 -U 108 ; WX 278 ; N l ; G 79 -U 109 ; WX 974 ; N m ; G 80 -U 110 ; WX 634 ; N n ; G 81 -U 111 ; WX 612 ; N o ; G 82 -U 112 ; WX 635 ; N p ; G 83 -U 113 ; WX 635 ; N q ; G 84 -U 114 ; WX 411 ; N r ; G 85 -U 115 ; WX 521 ; N s ; G 86 -U 116 ; WX 392 ; N t ; G 87 -U 117 ; WX 634 ; N u ; G 88 -U 118 ; WX 592 ; N v ; G 89 -U 119 ; WX 818 ; N w ; G 90 -U 120 ; WX 592 ; N x ; G 91 -U 121 ; WX 592 ; N y ; G 92 -U 122 ; WX 525 ; N z ; G 93 -U 123 ; WX 636 ; N braceleft ; G 94 -U 124 ; WX 337 ; N bar ; G 95 -U 125 ; WX 636 ; N braceright ; G 96 -U 126 ; WX 838 ; N asciitilde ; G 97 -U 160 ; WX 318 ; N nbspace ; G 98 -U 161 ; WX 401 ; N exclamdown ; G 99 -U 162 ; WX 636 ; N cent ; G 100 -U 163 ; WX 636 ; N sterling ; G 101 -U 164 ; WX 636 ; N currency ; G 102 -U 165 ; WX 636 ; N yen ; G 103 -U 166 ; WX 337 ; N brokenbar ; G 104 -U 167 ; WX 500 ; N section ; G 105 -U 168 ; WX 500 ; N dieresis ; G 106 -U 169 ; WX 1000 ; N copyright ; G 107 -U 170 ; WX 471 ; N ordfeminine ; G 108 -U 171 ; WX 617 ; N guillemotleft ; G 109 -U 172 ; WX 838 ; N logicalnot ; G 110 -U 173 ; WX 361 ; N sfthyphen ; G 111 -U 174 ; WX 1000 ; N registered ; G 112 -U 175 ; WX 500 ; N macron ; G 113 -U 176 ; WX 500 ; N degree ; G 114 -U 177 ; WX 838 ; N plusminus ; G 115 -U 178 ; WX 401 ; N twosuperior ; G 116 -U 179 ; WX 401 ; N threesuperior ; G 117 -U 180 ; WX 500 ; N acute ; G 118 -U 181 ; WX 636 ; N mu ; G 119 -U 182 ; WX 636 ; N paragraph ; G 120 -U 183 ; WX 318 ; N periodcentered ; G 121 -U 184 ; WX 500 ; N cedilla ; G 122 -U 185 ; WX 401 ; N onesuperior ; G 123 -U 186 ; WX 471 ; N ordmasculine ; G 124 -U 187 ; WX 617 ; N guillemotright ; G 125 -U 188 ; WX 969 ; N onequarter ; G 126 -U 189 ; WX 969 ; N onehalf ; G 127 -U 190 ; WX 969 ; N threequarters ; G 128 -U 191 ; WX 531 ; N questiondown ; G 129 -U 192 ; WX 684 ; N Agrave ; G 130 -U 193 ; WX 684 ; N Aacute ; G 131 -U 194 ; WX 684 ; N Acircumflex ; G 132 -U 195 ; WX 684 ; N Atilde ; G 133 -U 196 ; WX 684 ; N Adieresis ; G 134 -U 197 ; WX 684 ; N Aring ; G 135 -U 198 ; WX 974 ; N AE ; G 136 -U 199 ; WX 698 ; N Ccedilla ; G 137 -U 200 ; WX 632 ; N Egrave ; G 138 -U 201 ; WX 632 ; N Eacute ; G 139 -U 202 ; WX 632 ; N Ecircumflex ; G 140 -U 203 ; WX 632 ; N Edieresis ; G 141 -U 204 ; WX 295 ; N Igrave ; G 142 -U 205 ; WX 295 ; N Iacute ; G 143 -U 206 ; WX 295 ; N Icircumflex ; G 144 -U 207 ; WX 295 ; N Idieresis ; G 145 -U 208 ; WX 775 ; N Eth ; G 146 -U 209 ; WX 748 ; N Ntilde ; G 147 -U 210 ; WX 787 ; N Ograve ; G 148 -U 211 ; WX 787 ; N Oacute ; G 149 -U 212 ; WX 787 ; N Ocircumflex ; G 150 -U 213 ; WX 787 ; N Otilde ; G 151 -U 214 ; WX 787 ; N Odieresis ; G 152 -U 215 ; WX 838 ; N multiply ; G 153 -U 216 ; WX 787 ; N Oslash ; G 154 -U 217 ; WX 732 ; N Ugrave ; G 155 -U 218 ; WX 732 ; N Uacute ; G 156 -U 219 ; WX 732 ; N Ucircumflex ; G 157 -U 220 ; WX 732 ; N Udieresis ; G 158 -U 221 ; WX 611 ; N Yacute ; G 159 -U 222 ; WX 608 ; N Thorn ; G 160 -U 223 ; WX 630 ; N germandbls ; G 161 -U 224 ; WX 613 ; N agrave ; G 162 -U 225 ; WX 613 ; N aacute ; G 163 -U 226 ; WX 613 ; N acircumflex ; G 164 -U 227 ; WX 613 ; N atilde ; G 165 -U 228 ; WX 613 ; N adieresis ; G 166 -U 229 ; WX 613 ; N aring ; G 167 -U 230 ; WX 995 ; N ae ; G 168 -U 231 ; WX 550 ; N ccedilla ; G 169 -U 232 ; WX 615 ; N egrave ; G 170 -U 233 ; WX 615 ; N eacute ; G 171 -U 234 ; WX 615 ; N ecircumflex ; G 172 -U 235 ; WX 615 ; N edieresis ; G 173 -U 236 ; WX 278 ; N igrave ; G 174 -U 237 ; WX 278 ; N iacute ; G 175 -U 238 ; WX 278 ; N icircumflex ; G 176 -U 239 ; WX 278 ; N idieresis ; G 177 -U 240 ; WX 612 ; N eth ; G 178 -U 241 ; WX 634 ; N ntilde ; G 179 -U 242 ; WX 612 ; N ograve ; G 180 -U 243 ; WX 612 ; N oacute ; G 181 -U 244 ; WX 612 ; N ocircumflex ; G 182 -U 245 ; WX 612 ; N otilde ; G 183 -U 246 ; WX 612 ; N odieresis ; G 184 -U 247 ; WX 838 ; N divide ; G 185 -U 248 ; WX 612 ; N oslash ; G 186 -U 249 ; WX 634 ; N ugrave ; G 187 -U 250 ; WX 634 ; N uacute ; G 188 -U 251 ; WX 634 ; N ucircumflex ; G 189 -U 252 ; WX 634 ; N udieresis ; G 190 -U 253 ; WX 592 ; N yacute ; G 191 -U 254 ; WX 635 ; N thorn ; G 192 -U 255 ; WX 592 ; N ydieresis ; G 193 -U 256 ; WX 684 ; N Amacron ; G 194 -U 257 ; WX 613 ; N amacron ; G 195 -U 258 ; WX 684 ; N Abreve ; G 196 -U 259 ; WX 613 ; N abreve ; G 197 -U 260 ; WX 684 ; N Aogonek ; G 198 -U 261 ; WX 613 ; N aogonek ; G 199 -U 262 ; WX 698 ; N Cacute ; G 200 -U 263 ; WX 550 ; N cacute ; G 201 -U 264 ; WX 698 ; N Ccircumflex ; G 202 -U 265 ; WX 550 ; N ccircumflex ; G 203 -U 266 ; WX 698 ; N Cdotaccent ; G 204 -U 267 ; WX 550 ; N cdotaccent ; G 205 -U 268 ; WX 698 ; N Ccaron ; G 206 -U 269 ; WX 550 ; N ccaron ; G 207 -U 270 ; WX 770 ; N Dcaron ; G 208 -U 271 ; WX 635 ; N dcaron ; G 209 -U 272 ; WX 775 ; N Dcroat ; G 210 -U 273 ; WX 635 ; N dmacron ; G 211 -U 274 ; WX 632 ; N Emacron ; G 212 -U 275 ; WX 615 ; N emacron ; G 213 -U 276 ; WX 632 ; N Ebreve ; G 214 -U 277 ; WX 615 ; N ebreve ; G 215 -U 278 ; WX 632 ; N Edotaccent ; G 216 -U 279 ; WX 615 ; N edotaccent ; G 217 -U 280 ; WX 632 ; N Eogonek ; G 218 -U 281 ; WX 615 ; N eogonek ; G 219 -U 282 ; WX 632 ; N Ecaron ; G 220 -U 283 ; WX 615 ; N ecaron ; G 221 -U 284 ; WX 775 ; N Gcircumflex ; G 222 -U 285 ; WX 635 ; N gcircumflex ; G 223 -U 286 ; WX 775 ; N Gbreve ; G 224 -U 287 ; WX 635 ; N gbreve ; G 225 -U 288 ; WX 775 ; N Gdotaccent ; G 226 -U 289 ; WX 635 ; N gdotaccent ; G 227 -U 290 ; WX 775 ; N Gcommaaccent ; G 228 -U 291 ; WX 635 ; N gcommaaccent ; G 229 -U 292 ; WX 752 ; N Hcircumflex ; G 230 -U 293 ; WX 634 ; N hcircumflex ; G 231 -U 294 ; WX 916 ; N Hbar ; G 232 -U 295 ; WX 695 ; N hbar ; G 233 -U 296 ; WX 295 ; N Itilde ; G 234 -U 297 ; WX 278 ; N itilde ; G 235 -U 298 ; WX 295 ; N Imacron ; G 236 -U 299 ; WX 278 ; N imacron ; G 237 -U 300 ; WX 295 ; N Ibreve ; G 238 -U 301 ; WX 278 ; N ibreve ; G 239 -U 302 ; WX 295 ; N Iogonek ; G 240 -U 303 ; WX 278 ; N iogonek ; G 241 -U 304 ; WX 295 ; N Idot ; G 242 -U 305 ; WX 278 ; N dotlessi ; G 243 -U 306 ; WX 590 ; N IJ ; G 244 -U 307 ; WX 556 ; N ij ; G 245 -U 308 ; WX 295 ; N Jcircumflex ; G 246 -U 309 ; WX 278 ; N jcircumflex ; G 247 -U 310 ; WX 656 ; N Kcommaaccent ; G 248 -U 311 ; WX 579 ; N kcommaaccent ; G 249 -U 312 ; WX 579 ; N kgreenlandic ; G 250 -U 313 ; WX 557 ; N Lacute ; G 251 -U 314 ; WX 278 ; N lacute ; G 252 -U 315 ; WX 557 ; N Lcommaaccent ; G 253 -U 316 ; WX 278 ; N lcommaaccent ; G 254 -U 317 ; WX 557 ; N Lcaron ; G 255 -U 318 ; WX 278 ; N lcaron ; G 256 -U 319 ; WX 557 ; N Ldot ; G 257 -U 320 ; WX 278 ; N ldot ; G 258 -U 321 ; WX 562 ; N Lslash ; G 259 -U 322 ; WX 287 ; N lslash ; G 260 -U 323 ; WX 748 ; N Nacute ; G 261 -U 324 ; WX 634 ; N nacute ; G 262 -U 325 ; WX 748 ; N Ncommaaccent ; G 263 -U 326 ; WX 634 ; N ncommaaccent ; G 264 -U 327 ; WX 748 ; N Ncaron ; G 265 -U 328 ; WX 634 ; N ncaron ; G 266 -U 329 ; WX 813 ; N napostrophe ; G 267 -U 330 ; WX 748 ; N Eng ; G 268 -U 331 ; WX 634 ; N eng ; G 269 -U 332 ; WX 787 ; N Omacron ; G 270 -U 333 ; WX 612 ; N omacron ; G 271 -U 334 ; WX 787 ; N Obreve ; G 272 -U 335 ; WX 612 ; N obreve ; G 273 -U 336 ; WX 787 ; N Ohungarumlaut ; G 274 -U 337 ; WX 612 ; N ohungarumlaut ; G 275 -U 338 ; WX 1070 ; N OE ; G 276 -U 339 ; WX 1028 ; N oe ; G 277 -U 340 ; WX 695 ; N Racute ; G 278 -U 341 ; WX 411 ; N racute ; G 279 -U 342 ; WX 695 ; N Rcommaaccent ; G 280 -U 343 ; WX 411 ; N rcommaaccent ; G 281 -U 344 ; WX 695 ; N Rcaron ; G 282 -U 345 ; WX 411 ; N rcaron ; G 283 -U 346 ; WX 635 ; N Sacute ; G 284 -U 347 ; WX 521 ; N sacute ; G 285 -U 348 ; WX 635 ; N Scircumflex ; G 286 -U 349 ; WX 521 ; N scircumflex ; G 287 -U 350 ; WX 635 ; N Scedilla ; G 288 -U 351 ; WX 521 ; N scedilla ; G 289 -U 352 ; WX 635 ; N Scaron ; G 290 -U 353 ; WX 521 ; N scaron ; G 291 -U 354 ; WX 611 ; N Tcommaaccent ; G 292 -U 355 ; WX 392 ; N tcommaaccent ; G 293 -U 356 ; WX 611 ; N Tcaron ; G 294 -U 357 ; WX 392 ; N tcaron ; G 295 -U 358 ; WX 611 ; N Tbar ; G 296 -U 359 ; WX 392 ; N tbar ; G 297 -U 360 ; WX 732 ; N Utilde ; G 298 -U 361 ; WX 634 ; N utilde ; G 299 -U 362 ; WX 732 ; N Umacron ; G 300 -U 363 ; WX 634 ; N umacron ; G 301 -U 364 ; WX 732 ; N Ubreve ; G 302 -U 365 ; WX 634 ; N ubreve ; G 303 -U 366 ; WX 732 ; N Uring ; G 304 -U 367 ; WX 634 ; N uring ; G 305 -U 368 ; WX 732 ; N Uhungarumlaut ; G 306 -U 369 ; WX 634 ; N uhungarumlaut ; G 307 -U 370 ; WX 732 ; N Uogonek ; G 308 -U 371 ; WX 634 ; N uogonek ; G 309 -U 372 ; WX 989 ; N Wcircumflex ; G 310 -U 373 ; WX 818 ; N wcircumflex ; G 311 -U 374 ; WX 611 ; N Ycircumflex ; G 312 -U 375 ; WX 592 ; N ycircumflex ; G 313 -U 376 ; WX 611 ; N Ydieresis ; G 314 -U 377 ; WX 685 ; N Zacute ; G 315 -U 378 ; WX 525 ; N zacute ; G 316 -U 379 ; WX 685 ; N Zdotaccent ; G 317 -U 380 ; WX 525 ; N zdotaccent ; G 318 -U 381 ; WX 685 ; N Zcaron ; G 319 -U 382 ; WX 525 ; N zcaron ; G 320 -U 383 ; WX 352 ; N longs ; G 321 -U 384 ; WX 635 ; N uni0180 ; G 322 -U 385 ; WX 735 ; N uni0181 ; G 323 -U 386 ; WX 686 ; N uni0182 ; G 324 -U 387 ; WX 635 ; N uni0183 ; G 325 -U 388 ; WX 686 ; N uni0184 ; G 326 -U 389 ; WX 635 ; N uni0185 ; G 327 -U 390 ; WX 703 ; N uni0186 ; G 328 -U 391 ; WX 698 ; N uni0187 ; G 329 -U 392 ; WX 550 ; N uni0188 ; G 330 -U 393 ; WX 775 ; N uni0189 ; G 331 -U 394 ; WX 819 ; N uni018A ; G 332 -U 395 ; WX 686 ; N uni018B ; G 333 -U 396 ; WX 635 ; N uni018C ; G 334 -U 397 ; WX 612 ; N uni018D ; G 335 -U 398 ; WX 632 ; N uni018E ; G 336 -U 399 ; WX 787 ; N uni018F ; G 337 -U 400 ; WX 614 ; N uni0190 ; G 338 -U 401 ; WX 575 ; N uni0191 ; G 339 -U 402 ; WX 352 ; N florin ; G 340 -U 403 ; WX 775 ; N uni0193 ; G 341 -U 404 ; WX 687 ; N uni0194 ; G 342 -U 405 ; WX 984 ; N uni0195 ; G 343 -U 406 ; WX 354 ; N uni0196 ; G 344 -U 407 ; WX 295 ; N uni0197 ; G 345 -U 408 ; WX 746 ; N uni0198 ; G 346 -U 409 ; WX 579 ; N uni0199 ; G 347 -U 410 ; WX 278 ; N uni019A ; G 348 -U 411 ; WX 592 ; N uni019B ; G 349 -U 412 ; WX 974 ; N uni019C ; G 350 -U 413 ; WX 748 ; N uni019D ; G 351 -U 414 ; WX 634 ; N uni019E ; G 352 -U 415 ; WX 787 ; N uni019F ; G 353 -U 416 ; WX 913 ; N Ohorn ; G 354 -U 417 ; WX 612 ; N ohorn ; G 355 -U 418 ; WX 938 ; N uni01A2 ; G 356 -U 419 ; WX 737 ; N uni01A3 ; G 357 -U 420 ; WX 652 ; N uni01A4 ; G 358 -U 421 ; WX 635 ; N uni01A5 ; G 359 -U 422 ; WX 695 ; N uni01A6 ; G 360 -U 423 ; WX 635 ; N uni01A7 ; G 361 -U 424 ; WX 521 ; N uni01A8 ; G 362 -U 425 ; WX 632 ; N uni01A9 ; G 363 -U 426 ; WX 336 ; N uni01AA ; G 364 -U 427 ; WX 392 ; N uni01AB ; G 365 -U 428 ; WX 611 ; N uni01AC ; G 366 -U 429 ; WX 392 ; N uni01AD ; G 367 -U 430 ; WX 611 ; N uni01AE ; G 368 -U 431 ; WX 838 ; N Uhorn ; G 369 -U 432 ; WX 634 ; N uhorn ; G 370 -U 433 ; WX 764 ; N uni01B1 ; G 371 -U 434 ; WX 721 ; N uni01B2 ; G 372 -U 435 ; WX 744 ; N uni01B3 ; G 373 -U 436 ; WX 730 ; N uni01B4 ; G 374 -U 437 ; WX 685 ; N uni01B5 ; G 375 -U 438 ; WX 525 ; N uni01B6 ; G 376 -U 439 ; WX 666 ; N uni01B7 ; G 377 -U 440 ; WX 666 ; N uni01B8 ; G 378 -U 441 ; WX 578 ; N uni01B9 ; G 379 -U 442 ; WX 525 ; N uni01BA ; G 380 -U 443 ; WX 636 ; N uni01BB ; G 381 -U 444 ; WX 666 ; N uni01BC ; G 382 -U 445 ; WX 578 ; N uni01BD ; G 383 -U 446 ; WX 510 ; N uni01BE ; G 384 -U 447 ; WX 635 ; N uni01BF ; G 385 -U 448 ; WX 295 ; N uni01C0 ; G 386 -U 449 ; WX 492 ; N uni01C1 ; G 387 -U 450 ; WX 459 ; N uni01C2 ; G 388 -U 451 ; WX 295 ; N uni01C3 ; G 389 -U 452 ; WX 1455 ; N uni01C4 ; G 390 -U 453 ; WX 1295 ; N uni01C5 ; G 391 -U 454 ; WX 1160 ; N uni01C6 ; G 392 -U 455 ; WX 852 ; N uni01C7 ; G 393 -U 456 ; WX 835 ; N uni01C8 ; G 394 -U 457 ; WX 556 ; N uni01C9 ; G 395 -U 458 ; WX 1043 ; N uni01CA ; G 396 -U 459 ; WX 1026 ; N uni01CB ; G 397 -U 460 ; WX 912 ; N uni01CC ; G 398 -U 461 ; WX 684 ; N uni01CD ; G 399 -U 462 ; WX 613 ; N uni01CE ; G 400 -U 463 ; WX 295 ; N uni01CF ; G 401 -U 464 ; WX 278 ; N uni01D0 ; G 402 -U 465 ; WX 787 ; N uni01D1 ; G 403 -U 466 ; WX 612 ; N uni01D2 ; G 404 -U 467 ; WX 732 ; N uni01D3 ; G 405 -U 468 ; WX 634 ; N uni01D4 ; G 406 -U 469 ; WX 732 ; N uni01D5 ; G 407 -U 470 ; WX 634 ; N uni01D6 ; G 408 -U 471 ; WX 732 ; N uni01D7 ; G 409 -U 472 ; WX 634 ; N uni01D8 ; G 410 -U 473 ; WX 732 ; N uni01D9 ; G 411 -U 474 ; WX 634 ; N uni01DA ; G 412 -U 475 ; WX 732 ; N uni01DB ; G 413 -U 476 ; WX 634 ; N uni01DC ; G 414 -U 477 ; WX 615 ; N uni01DD ; G 415 -U 478 ; WX 684 ; N uni01DE ; G 416 -U 479 ; WX 613 ; N uni01DF ; G 417 -U 480 ; WX 684 ; N uni01E0 ; G 418 -U 481 ; WX 613 ; N uni01E1 ; G 419 -U 482 ; WX 974 ; N uni01E2 ; G 420 -U 483 ; WX 995 ; N uni01E3 ; G 421 -U 484 ; WX 775 ; N uni01E4 ; G 422 -U 485 ; WX 635 ; N uni01E5 ; G 423 -U 486 ; WX 775 ; N Gcaron ; G 424 -U 487 ; WX 635 ; N gcaron ; G 425 -U 488 ; WX 656 ; N uni01E8 ; G 426 -U 489 ; WX 579 ; N uni01E9 ; G 427 -U 490 ; WX 787 ; N uni01EA ; G 428 -U 491 ; WX 612 ; N uni01EB ; G 429 -U 492 ; WX 787 ; N uni01EC ; G 430 -U 493 ; WX 612 ; N uni01ED ; G 431 -U 494 ; WX 666 ; N uni01EE ; G 432 -U 495 ; WX 525 ; N uni01EF ; G 433 -U 496 ; WX 278 ; N uni01F0 ; G 434 -U 497 ; WX 1455 ; N uni01F1 ; G 435 -U 498 ; WX 1295 ; N uni01F2 ; G 436 -U 499 ; WX 1160 ; N uni01F3 ; G 437 -U 500 ; WX 775 ; N uni01F4 ; G 438 -U 501 ; WX 635 ; N uni01F5 ; G 439 -U 502 ; WX 1113 ; N uni01F6 ; G 440 -U 503 ; WX 682 ; N uni01F7 ; G 441 -U 504 ; WX 748 ; N uni01F8 ; G 442 -U 505 ; WX 634 ; N uni01F9 ; G 443 -U 506 ; WX 684 ; N Aringacute ; G 444 -U 507 ; WX 613 ; N aringacute ; G 445 -U 508 ; WX 974 ; N AEacute ; G 446 -U 509 ; WX 995 ; N aeacute ; G 447 -U 510 ; WX 787 ; N Oslashacute ; G 448 -U 511 ; WX 612 ; N oslashacute ; G 449 -U 512 ; WX 684 ; N uni0200 ; G 450 -U 513 ; WX 613 ; N uni0201 ; G 451 -U 514 ; WX 684 ; N uni0202 ; G 452 -U 515 ; WX 613 ; N uni0203 ; G 453 -U 516 ; WX 632 ; N uni0204 ; G 454 -U 517 ; WX 615 ; N uni0205 ; G 455 -U 518 ; WX 632 ; N uni0206 ; G 456 -U 519 ; WX 615 ; N uni0207 ; G 457 -U 520 ; WX 295 ; N uni0208 ; G 458 -U 521 ; WX 278 ; N uni0209 ; G 459 -U 522 ; WX 295 ; N uni020A ; G 460 -U 523 ; WX 278 ; N uni020B ; G 461 -U 524 ; WX 787 ; N uni020C ; G 462 -U 525 ; WX 612 ; N uni020D ; G 463 -U 526 ; WX 787 ; N uni020E ; G 464 -U 527 ; WX 612 ; N uni020F ; G 465 -U 528 ; WX 695 ; N uni0210 ; G 466 -U 529 ; WX 411 ; N uni0211 ; G 467 -U 530 ; WX 695 ; N uni0212 ; G 468 -U 531 ; WX 411 ; N uni0213 ; G 469 -U 532 ; WX 732 ; N uni0214 ; G 470 -U 533 ; WX 634 ; N uni0215 ; G 471 -U 534 ; WX 732 ; N uni0216 ; G 472 -U 535 ; WX 634 ; N uni0217 ; G 473 -U 536 ; WX 635 ; N Scommaaccent ; G 474 -U 537 ; WX 521 ; N scommaaccent ; G 475 -U 538 ; WX 611 ; N uni021A ; G 476 -U 539 ; WX 392 ; N uni021B ; G 477 -U 540 ; WX 627 ; N uni021C ; G 478 -U 541 ; WX 521 ; N uni021D ; G 479 -U 542 ; WX 752 ; N uni021E ; G 480 -U 543 ; WX 634 ; N uni021F ; G 481 -U 544 ; WX 735 ; N uni0220 ; G 482 -U 545 ; WX 838 ; N uni0221 ; G 483 -U 546 ; WX 698 ; N uni0222 ; G 484 -U 547 ; WX 610 ; N uni0223 ; G 485 -U 548 ; WX 685 ; N uni0224 ; G 486 -U 549 ; WX 525 ; N uni0225 ; G 487 -U 550 ; WX 684 ; N uni0226 ; G 488 -U 551 ; WX 613 ; N uni0227 ; G 489 -U 552 ; WX 632 ; N uni0228 ; G 490 -U 553 ; WX 615 ; N uni0229 ; G 491 -U 554 ; WX 787 ; N uni022A ; G 492 -U 555 ; WX 612 ; N uni022B ; G 493 -U 556 ; WX 787 ; N uni022C ; G 494 -U 557 ; WX 612 ; N uni022D ; G 495 -U 558 ; WX 787 ; N uni022E ; G 496 -U 559 ; WX 612 ; N uni022F ; G 497 -U 560 ; WX 787 ; N uni0230 ; G 498 -U 561 ; WX 612 ; N uni0231 ; G 499 -U 562 ; WX 611 ; N uni0232 ; G 500 -U 563 ; WX 592 ; N uni0233 ; G 501 -U 564 ; WX 475 ; N uni0234 ; G 502 -U 565 ; WX 843 ; N uni0235 ; G 503 -U 566 ; WX 477 ; N uni0236 ; G 504 -U 567 ; WX 278 ; N dotlessj ; G 505 -U 568 ; WX 998 ; N uni0238 ; G 506 -U 569 ; WX 998 ; N uni0239 ; G 507 -U 570 ; WX 684 ; N uni023A ; G 508 -U 571 ; WX 698 ; N uni023B ; G 509 -U 572 ; WX 550 ; N uni023C ; G 510 -U 573 ; WX 557 ; N uni023D ; G 511 -U 574 ; WX 611 ; N uni023E ; G 512 -U 575 ; WX 521 ; N uni023F ; G 513 -U 576 ; WX 525 ; N uni0240 ; G 514 -U 577 ; WX 603 ; N uni0241 ; G 515 -U 578 ; WX 479 ; N uni0242 ; G 516 -U 579 ; WX 686 ; N uni0243 ; G 517 -U 580 ; WX 732 ; N uni0244 ; G 518 -U 581 ; WX 684 ; N uni0245 ; G 519 -U 582 ; WX 632 ; N uni0246 ; G 520 -U 583 ; WX 615 ; N uni0247 ; G 521 -U 584 ; WX 295 ; N uni0248 ; G 522 -U 585 ; WX 278 ; N uni0249 ; G 523 -U 586 ; WX 781 ; N uni024A ; G 524 -U 587 ; WX 635 ; N uni024B ; G 525 -U 588 ; WX 695 ; N uni024C ; G 526 -U 589 ; WX 411 ; N uni024D ; G 527 -U 590 ; WX 611 ; N uni024E ; G 528 -U 591 ; WX 592 ; N uni024F ; G 529 -U 592 ; WX 613 ; N uni0250 ; G 530 -U 593 ; WX 635 ; N uni0251 ; G 531 -U 594 ; WX 635 ; N uni0252 ; G 532 -U 595 ; WX 635 ; N uni0253 ; G 533 -U 596 ; WX 550 ; N uni0254 ; G 534 -U 597 ; WX 550 ; N uni0255 ; G 535 -U 598 ; WX 635 ; N uni0256 ; G 536 -U 599 ; WX 727 ; N uni0257 ; G 537 -U 600 ; WX 615 ; N uni0258 ; G 538 -U 601 ; WX 615 ; N uni0259 ; G 539 -U 602 ; WX 844 ; N uni025A ; G 540 -U 603 ; WX 545 ; N uni025B ; G 541 -U 604 ; WX 545 ; N uni025C ; G 542 -U 605 ; WX 775 ; N uni025D ; G 543 -U 606 ; WX 664 ; N uni025E ; G 544 -U 607 ; WX 326 ; N uni025F ; G 545 -U 608 ; WX 696 ; N uni0260 ; G 546 -U 609 ; WX 635 ; N uni0261 ; G 547 -U 610 ; WX 629 ; N uni0262 ; G 548 -U 611 ; WX 596 ; N uni0263 ; G 549 -U 612 ; WX 596 ; N uni0264 ; G 550 -U 613 ; WX 634 ; N uni0265 ; G 551 -U 614 ; WX 634 ; N uni0266 ; G 552 -U 615 ; WX 634 ; N uni0267 ; G 553 -U 616 ; WX 372 ; N uni0268 ; G 554 -U 617 ; WX 387 ; N uni0269 ; G 555 -U 618 ; WX 372 ; N uni026A ; G 556 -U 619 ; WX 396 ; N uni026B ; G 557 -U 620 ; WX 487 ; N uni026C ; G 558 -U 621 ; WX 278 ; N uni026D ; G 559 -U 622 ; WX 706 ; N uni026E ; G 560 -U 623 ; WX 974 ; N uni026F ; G 561 -U 624 ; WX 974 ; N uni0270 ; G 562 -U 625 ; WX 974 ; N uni0271 ; G 563 -U 626 ; WX 646 ; N uni0272 ; G 564 -U 627 ; WX 642 ; N uni0273 ; G 565 -U 628 ; WX 634 ; N uni0274 ; G 566 -U 629 ; WX 612 ; N uni0275 ; G 567 -U 630 ; WX 858 ; N uni0276 ; G 568 -U 631 ; WX 728 ; N uni0277 ; G 569 -U 632 ; WX 660 ; N uni0278 ; G 570 -U 633 ; WX 469 ; N uni0279 ; G 571 -U 634 ; WX 469 ; N uni027A ; G 572 -U 635 ; WX 469 ; N uni027B ; G 573 -U 636 ; WX 469 ; N uni027C ; G 574 -U 637 ; WX 469 ; N uni027D ; G 575 -U 638 ; WX 530 ; N uni027E ; G 576 -U 639 ; WX 530 ; N uni027F ; G 577 -U 640 ; WX 602 ; N uni0280 ; G 578 -U 641 ; WX 602 ; N uni0281 ; G 579 -U 642 ; WX 521 ; N uni0282 ; G 580 -U 643 ; WX 336 ; N uni0283 ; G 581 -U 644 ; WX 336 ; N uni0284 ; G 582 -U 645 ; WX 461 ; N uni0285 ; G 583 -U 646 ; WX 336 ; N uni0286 ; G 584 -U 647 ; WX 392 ; N uni0287 ; G 585 -U 648 ; WX 392 ; N uni0288 ; G 586 -U 649 ; WX 634 ; N uni0289 ; G 587 -U 650 ; WX 618 ; N uni028A ; G 588 -U 651 ; WX 598 ; N uni028B ; G 589 -U 652 ; WX 592 ; N uni028C ; G 590 -U 653 ; WX 818 ; N uni028D ; G 591 -U 654 ; WX 592 ; N uni028E ; G 592 -U 655 ; WX 611 ; N uni028F ; G 593 -U 656 ; WX 525 ; N uni0290 ; G 594 -U 657 ; WX 525 ; N uni0291 ; G 595 -U 658 ; WX 578 ; N uni0292 ; G 596 -U 659 ; WX 578 ; N uni0293 ; G 597 -U 660 ; WX 510 ; N uni0294 ; G 598 -U 661 ; WX 510 ; N uni0295 ; G 599 -U 662 ; WX 510 ; N uni0296 ; G 600 -U 663 ; WX 510 ; N uni0297 ; G 601 -U 664 ; WX 787 ; N uni0298 ; G 602 -U 665 ; WX 580 ; N uni0299 ; G 603 -U 666 ; WX 664 ; N uni029A ; G 604 -U 667 ; WX 708 ; N uni029B ; G 605 -U 668 ; WX 654 ; N uni029C ; G 606 -U 669 ; WX 292 ; N uni029D ; G 607 -U 670 ; WX 667 ; N uni029E ; G 608 -U 671 ; WX 507 ; N uni029F ; G 609 -U 672 ; WX 727 ; N uni02A0 ; G 610 -U 673 ; WX 510 ; N uni02A1 ; G 611 -U 674 ; WX 510 ; N uni02A2 ; G 612 -U 675 ; WX 1014 ; N uni02A3 ; G 613 -U 676 ; WX 1058 ; N uni02A4 ; G 614 -U 677 ; WX 1013 ; N uni02A5 ; G 615 -U 678 ; WX 830 ; N uni02A6 ; G 616 -U 679 ; WX 610 ; N uni02A7 ; G 617 -U 680 ; WX 778 ; N uni02A8 ; G 618 -U 681 ; WX 848 ; N uni02A9 ; G 619 -U 682 ; WX 706 ; N uni02AA ; G 620 -U 683 ; WX 654 ; N uni02AB ; G 621 -U 684 ; WX 515 ; N uni02AC ; G 622 -U 685 ; WX 515 ; N uni02AD ; G 623 -U 686 ; WX 570 ; N uni02AE ; G 624 -U 687 ; WX 664 ; N uni02AF ; G 625 -U 688 ; WX 399 ; N uni02B0 ; G 626 -U 689 ; WX 399 ; N uni02B1 ; G 627 -U 690 ; WX 175 ; N uni02B2 ; G 628 -U 691 ; WX 259 ; N uni02B3 ; G 629 -U 692 ; WX 295 ; N uni02B4 ; G 630 -U 693 ; WX 296 ; N uni02B5 ; G 631 -U 694 ; WX 379 ; N uni02B6 ; G 632 -U 695 ; WX 515 ; N uni02B7 ; G 633 -U 696 ; WX 373 ; N uni02B8 ; G 634 -U 697 ; WX 278 ; N uni02B9 ; G 635 -U 698 ; WX 460 ; N uni02BA ; G 636 -U 699 ; WX 318 ; N uni02BB ; G 637 -U 700 ; WX 318 ; N uni02BC ; G 638 -U 701 ; WX 318 ; N uni02BD ; G 639 -U 702 ; WX 307 ; N uni02BE ; G 640 -U 703 ; WX 307 ; N uni02BF ; G 641 -U 704 ; WX 370 ; N uni02C0 ; G 642 -U 705 ; WX 370 ; N uni02C1 ; G 643 -U 706 ; WX 500 ; N uni02C2 ; G 644 -U 707 ; WX 500 ; N uni02C3 ; G 645 -U 708 ; WX 500 ; N uni02C4 ; G 646 -U 709 ; WX 500 ; N uni02C5 ; G 647 -U 710 ; WX 500 ; N circumflex ; G 648 -U 711 ; WX 500 ; N caron ; G 649 -U 712 ; WX 275 ; N uni02C8 ; G 650 -U 713 ; WX 500 ; N uni02C9 ; G 651 -U 714 ; WX 500 ; N uni02CA ; G 652 -U 715 ; WX 500 ; N uni02CB ; G 653 -U 716 ; WX 275 ; N uni02CC ; G 654 -U 717 ; WX 500 ; N uni02CD ; G 655 -U 718 ; WX 500 ; N uni02CE ; G 656 -U 719 ; WX 500 ; N uni02CF ; G 657 -U 720 ; WX 337 ; N uni02D0 ; G 658 -U 721 ; WX 337 ; N uni02D1 ; G 659 -U 722 ; WX 307 ; N uni02D2 ; G 660 -U 723 ; WX 307 ; N uni02D3 ; G 661 -U 724 ; WX 500 ; N uni02D4 ; G 662 -U 725 ; WX 500 ; N uni02D5 ; G 663 -U 726 ; WX 390 ; N uni02D6 ; G 664 -U 727 ; WX 317 ; N uni02D7 ; G 665 -U 728 ; WX 500 ; N breve ; G 666 -U 729 ; WX 500 ; N dotaccent ; G 667 -U 730 ; WX 500 ; N ring ; G 668 -U 731 ; WX 500 ; N ogonek ; G 669 -U 732 ; WX 500 ; N tilde ; G 670 -U 733 ; WX 500 ; N hungarumlaut ; G 671 -U 734 ; WX 315 ; N uni02DE ; G 672 -U 735 ; WX 500 ; N uni02DF ; G 673 -U 736 ; WX 426 ; N uni02E0 ; G 674 -U 737 ; WX 166 ; N uni02E1 ; G 675 -U 738 ; WX 373 ; N uni02E2 ; G 676 -U 739 ; WX 444 ; N uni02E3 ; G 677 -U 740 ; WX 370 ; N uni02E4 ; G 678 -U 741 ; WX 493 ; N uni02E5 ; G 679 -U 742 ; WX 493 ; N uni02E6 ; G 680 -U 743 ; WX 493 ; N uni02E7 ; G 681 -U 744 ; WX 493 ; N uni02E8 ; G 682 -U 745 ; WX 493 ; N uni02E9 ; G 683 -U 748 ; WX 500 ; N uni02EC ; G 684 -U 749 ; WX 500 ; N uni02ED ; G 685 -U 750 ; WX 518 ; N uni02EE ; G 686 -U 755 ; WX 500 ; N uni02F3 ; G 687 -U 759 ; WX 500 ; N uni02F7 ; G 688 -U 768 ; WX 0 ; N gravecomb ; G 689 -U 769 ; WX 0 ; N acutecomb ; G 690 -U 770 ; WX 0 ; N uni0302 ; G 691 -U 771 ; WX 0 ; N tildecomb ; G 692 -U 772 ; WX 0 ; N uni0304 ; G 693 -U 773 ; WX 0 ; N uni0305 ; G 694 -U 774 ; WX 0 ; N uni0306 ; G 695 -U 775 ; WX 0 ; N uni0307 ; G 696 -U 776 ; WX 0 ; N uni0308 ; G 697 -U 777 ; WX 0 ; N hookabovecomb ; G 698 -U 778 ; WX 0 ; N uni030A ; G 699 -U 779 ; WX 0 ; N uni030B ; G 700 -U 780 ; WX 0 ; N uni030C ; G 701 -U 781 ; WX 0 ; N uni030D ; G 702 -U 782 ; WX 0 ; N uni030E ; G 703 -U 783 ; WX 0 ; N uni030F ; G 704 -U 784 ; WX 0 ; N uni0310 ; G 705 -U 785 ; WX 0 ; N uni0311 ; G 706 -U 786 ; WX 0 ; N uni0312 ; G 707 -U 787 ; WX 0 ; N uni0313 ; G 708 -U 788 ; WX 0 ; N uni0314 ; G 709 -U 789 ; WX 0 ; N uni0315 ; G 710 -U 790 ; WX 0 ; N uni0316 ; G 711 -U 791 ; WX 0 ; N uni0317 ; G 712 -U 792 ; WX 0 ; N uni0318 ; G 713 -U 793 ; WX 0 ; N uni0319 ; G 714 -U 794 ; WX 0 ; N uni031A ; G 715 -U 795 ; WX 0 ; N uni031B ; G 716 -U 796 ; WX 0 ; N uni031C ; G 717 -U 797 ; WX 0 ; N uni031D ; G 718 -U 798 ; WX 0 ; N uni031E ; G 719 -U 799 ; WX 0 ; N uni031F ; G 720 -U 800 ; WX 0 ; N uni0320 ; G 721 -U 801 ; WX 0 ; N uni0321 ; G 722 -U 802 ; WX 0 ; N uni0322 ; G 723 -U 803 ; WX 0 ; N dotbelowcomb ; G 724 -U 804 ; WX 0 ; N uni0324 ; G 725 -U 805 ; WX 0 ; N uni0325 ; G 726 -U 806 ; WX 0 ; N uni0326 ; G 727 -U 807 ; WX 0 ; N uni0327 ; G 728 -U 808 ; WX 0 ; N uni0328 ; G 729 -U 809 ; WX 0 ; N uni0329 ; G 730 -U 810 ; WX 0 ; N uni032A ; G 731 -U 811 ; WX 0 ; N uni032B ; G 732 -U 812 ; WX 0 ; N uni032C ; G 733 -U 813 ; WX 0 ; N uni032D ; G 734 -U 814 ; WX 0 ; N uni032E ; G 735 -U 815 ; WX 0 ; N uni032F ; G 736 -U 816 ; WX 0 ; N uni0330 ; G 737 -U 817 ; WX 0 ; N uni0331 ; G 738 -U 818 ; WX 0 ; N uni0332 ; G 739 -U 819 ; WX 0 ; N uni0333 ; G 740 -U 820 ; WX 0 ; N uni0334 ; G 741 -U 821 ; WX 0 ; N uni0335 ; G 742 -U 822 ; WX 0 ; N uni0336 ; G 743 -U 823 ; WX 0 ; N uni0337 ; G 744 -U 824 ; WX 0 ; N uni0338 ; G 745 -U 825 ; WX 0 ; N uni0339 ; G 746 -U 826 ; WX 0 ; N uni033A ; G 747 -U 827 ; WX 0 ; N uni033B ; G 748 -U 828 ; WX 0 ; N uni033C ; G 749 -U 829 ; WX 0 ; N uni033D ; G 750 -U 830 ; WX 0 ; N uni033E ; G 751 -U 831 ; WX 0 ; N uni033F ; G 752 -U 832 ; WX 0 ; N uni0340 ; G 753 -U 833 ; WX 0 ; N uni0341 ; G 754 -U 834 ; WX 0 ; N uni0342 ; G 755 -U 835 ; WX 0 ; N uni0343 ; G 756 -U 836 ; WX 0 ; N uni0344 ; G 757 -U 837 ; WX 0 ; N uni0345 ; G 758 -U 838 ; WX 0 ; N uni0346 ; G 759 -U 839 ; WX 0 ; N uni0347 ; G 760 -U 840 ; WX 0 ; N uni0348 ; G 761 -U 841 ; WX 0 ; N uni0349 ; G 762 -U 842 ; WX 0 ; N uni034A ; G 763 -U 843 ; WX 0 ; N uni034B ; G 764 -U 844 ; WX 0 ; N uni034C ; G 765 -U 845 ; WX 0 ; N uni034D ; G 766 -U 846 ; WX 0 ; N uni034E ; G 767 -U 847 ; WX 0 ; N uni034F ; G 768 -U 849 ; WX 0 ; N uni0351 ; G 769 -U 850 ; WX 0 ; N uni0352 ; G 770 -U 851 ; WX 0 ; N uni0353 ; G 771 -U 855 ; WX 0 ; N uni0357 ; G 772 -U 856 ; WX 0 ; N uni0358 ; G 773 -U 858 ; WX 0 ; N uni035A ; G 774 -U 860 ; WX 0 ; N uni035C ; G 775 -U 861 ; WX 0 ; N uni035D ; G 776 -U 862 ; WX 0 ; N uni035E ; G 777 -U 863 ; WX 0 ; N uni035F ; G 778 -U 864 ; WX 0 ; N uni0360 ; G 779 -U 865 ; WX 0 ; N uni0361 ; G 780 -U 866 ; WX 0 ; N uni0362 ; G 781 -U 880 ; WX 654 ; N uni0370 ; G 782 -U 881 ; WX 568 ; N uni0371 ; G 783 -U 882 ; WX 862 ; N uni0372 ; G 784 -U 883 ; WX 647 ; N uni0373 ; G 785 -U 884 ; WX 278 ; N uni0374 ; G 786 -U 885 ; WX 278 ; N uni0375 ; G 787 -U 886 ; WX 748 ; N uni0376 ; G 788 -U 887 ; WX 650 ; N uni0377 ; G 789 -U 890 ; WX 500 ; N uni037A ; G 790 -U 891 ; WX 549 ; N uni037B ; G 791 -U 892 ; WX 550 ; N uni037C ; G 792 -U 893 ; WX 549 ; N uni037D ; G 793 -U 894 ; WX 337 ; N uni037E ; G 794 -U 895 ; WX 295 ; N uni037F ; G 795 -U 900 ; WX 500 ; N tonos ; G 796 -U 901 ; WX 500 ; N dieresistonos ; G 797 -U 902 ; WX 684 ; N Alphatonos ; G 798 -U 903 ; WX 318 ; N anoteleia ; G 799 -U 904 ; WX 767 ; N Epsilontonos ; G 800 -U 905 ; WX 903 ; N Etatonos ; G 801 -U 906 ; WX 435 ; N Iotatonos ; G 802 -U 908 ; WX 839 ; N Omicrontonos ; G 803 -U 910 ; WX 860 ; N Upsilontonos ; G 804 -U 911 ; WX 905 ; N Omegatonos ; G 805 -U 912 ; WX 338 ; N iotadieresistonos ; G 806 -U 913 ; WX 684 ; N Alpha ; G 807 -U 914 ; WX 686 ; N Beta ; G 808 -U 915 ; WX 557 ; N Gamma ; G 809 -U 916 ; WX 684 ; N uni0394 ; G 810 -U 917 ; WX 632 ; N Epsilon ; G 811 -U 918 ; WX 685 ; N Zeta ; G 812 -U 919 ; WX 752 ; N Eta ; G 813 -U 920 ; WX 787 ; N Theta ; G 814 -U 921 ; WX 295 ; N Iota ; G 815 -U 922 ; WX 656 ; N Kappa ; G 816 -U 923 ; WX 684 ; N Lambda ; G 817 -U 924 ; WX 863 ; N Mu ; G 818 -U 925 ; WX 748 ; N Nu ; G 819 -U 926 ; WX 632 ; N Xi ; G 820 -U 927 ; WX 787 ; N Omicron ; G 821 -U 928 ; WX 752 ; N Pi ; G 822 -U 929 ; WX 603 ; N Rho ; G 823 -U 931 ; WX 632 ; N Sigma ; G 824 -U 932 ; WX 611 ; N Tau ; G 825 -U 933 ; WX 611 ; N Upsilon ; G 826 -U 934 ; WX 787 ; N Phi ; G 827 -U 935 ; WX 685 ; N Chi ; G 828 -U 936 ; WX 787 ; N Psi ; G 829 -U 937 ; WX 764 ; N Omega ; G 830 -U 938 ; WX 295 ; N Iotadieresis ; G 831 -U 939 ; WX 611 ; N Upsilondieresis ; G 832 -U 940 ; WX 659 ; N alphatonos ; G 833 -U 941 ; WX 541 ; N epsilontonos ; G 834 -U 942 ; WX 634 ; N etatonos ; G 835 -U 943 ; WX 338 ; N iotatonos ; G 836 -U 944 ; WX 579 ; N upsilondieresistonos ; G 837 -U 945 ; WX 659 ; N alpha ; G 838 -U 946 ; WX 638 ; N beta ; G 839 -U 947 ; WX 592 ; N gamma ; G 840 -U 948 ; WX 612 ; N delta ; G 841 -U 949 ; WX 541 ; N epsilon ; G 842 -U 950 ; WX 544 ; N zeta ; G 843 -U 951 ; WX 634 ; N eta ; G 844 -U 952 ; WX 612 ; N theta ; G 845 -U 953 ; WX 338 ; N iota ; G 846 -U 954 ; WX 589 ; N kappa ; G 847 -U 955 ; WX 592 ; N lambda ; G 848 -U 956 ; WX 636 ; N uni03BC ; G 849 -U 957 ; WX 559 ; N nu ; G 850 -U 958 ; WX 558 ; N xi ; G 851 -U 959 ; WX 612 ; N omicron ; G 852 -U 960 ; WX 602 ; N pi ; G 853 -U 961 ; WX 635 ; N rho ; G 854 -U 962 ; WX 587 ; N sigma1 ; G 855 -U 963 ; WX 634 ; N sigma ; G 856 -U 964 ; WX 602 ; N tau ; G 857 -U 965 ; WX 579 ; N upsilon ; G 858 -U 966 ; WX 660 ; N phi ; G 859 -U 967 ; WX 592 ; N chi ; G 860 -U 968 ; WX 660 ; N psi ; G 861 -U 969 ; WX 837 ; N omega ; G 862 -U 970 ; WX 338 ; N iotadieresis ; G 863 -U 971 ; WX 579 ; N upsilondieresis ; G 864 -U 972 ; WX 612 ; N omicrontonos ; G 865 -U 973 ; WX 579 ; N upsilontonos ; G 866 -U 974 ; WX 837 ; N omegatonos ; G 867 -U 975 ; WX 656 ; N uni03CF ; G 868 -U 976 ; WX 614 ; N uni03D0 ; G 869 -U 977 ; WX 619 ; N theta1 ; G 870 -U 978 ; WX 699 ; N Upsilon1 ; G 871 -U 979 ; WX 842 ; N uni03D3 ; G 872 -U 980 ; WX 699 ; N uni03D4 ; G 873 -U 981 ; WX 660 ; N phi1 ; G 874 -U 982 ; WX 837 ; N omega1 ; G 875 -U 983 ; WX 664 ; N uni03D7 ; G 876 -U 984 ; WX 787 ; N uni03D8 ; G 877 -U 985 ; WX 612 ; N uni03D9 ; G 878 -U 986 ; WX 648 ; N uni03DA ; G 879 -U 987 ; WX 587 ; N uni03DB ; G 880 -U 988 ; WX 575 ; N uni03DC ; G 881 -U 989 ; WX 458 ; N uni03DD ; G 882 -U 990 ; WX 660 ; N uni03DE ; G 883 -U 991 ; WX 660 ; N uni03DF ; G 884 -U 992 ; WX 865 ; N uni03E0 ; G 885 -U 993 ; WX 627 ; N uni03E1 ; G 886 -U 994 ; WX 934 ; N uni03E2 ; G 887 -U 995 ; WX 837 ; N uni03E3 ; G 888 -U 996 ; WX 758 ; N uni03E4 ; G 889 -U 997 ; WX 659 ; N uni03E5 ; G 890 -U 998 ; WX 792 ; N uni03E6 ; G 891 -U 999 ; WX 615 ; N uni03E7 ; G 892 -U 1000 ; WX 687 ; N uni03E8 ; G 893 -U 1001 ; WX 607 ; N uni03E9 ; G 894 -U 1002 ; WX 768 ; N uni03EA ; G 895 -U 1003 ; WX 625 ; N uni03EB ; G 896 -U 1004 ; WX 699 ; N uni03EC ; G 897 -U 1005 ; WX 612 ; N uni03ED ; G 898 -U 1006 ; WX 611 ; N uni03EE ; G 899 -U 1007 ; WX 536 ; N uni03EF ; G 900 -U 1008 ; WX 664 ; N uni03F0 ; G 901 -U 1009 ; WX 635 ; N uni03F1 ; G 902 -U 1010 ; WX 550 ; N uni03F2 ; G 903 -U 1011 ; WX 278 ; N uni03F3 ; G 904 -U 1012 ; WX 787 ; N uni03F4 ; G 905 -U 1013 ; WX 615 ; N uni03F5 ; G 906 -U 1014 ; WX 615 ; N uni03F6 ; G 907 -U 1015 ; WX 608 ; N uni03F7 ; G 908 -U 1016 ; WX 635 ; N uni03F8 ; G 909 -U 1017 ; WX 698 ; N uni03F9 ; G 910 -U 1018 ; WX 863 ; N uni03FA ; G 911 -U 1019 ; WX 651 ; N uni03FB ; G 912 -U 1020 ; WX 635 ; N uni03FC ; G 913 -U 1021 ; WX 703 ; N uni03FD ; G 914 -U 1022 ; WX 698 ; N uni03FE ; G 915 -U 1023 ; WX 703 ; N uni03FF ; G 916 -U 1024 ; WX 632 ; N uni0400 ; G 917 -U 1025 ; WX 632 ; N uni0401 ; G 918 -U 1026 ; WX 786 ; N uni0402 ; G 919 -U 1027 ; WX 557 ; N uni0403 ; G 920 -U 1028 ; WX 698 ; N uni0404 ; G 921 -U 1029 ; WX 635 ; N uni0405 ; G 922 -U 1030 ; WX 295 ; N uni0406 ; G 923 -U 1031 ; WX 295 ; N uni0407 ; G 924 -U 1032 ; WX 295 ; N uni0408 ; G 925 -U 1033 ; WX 1094 ; N uni0409 ; G 926 -U 1034 ; WX 1045 ; N uni040A ; G 927 -U 1035 ; WX 786 ; N uni040B ; G 928 -U 1036 ; WX 710 ; N uni040C ; G 929 -U 1037 ; WX 748 ; N uni040D ; G 930 -U 1038 ; WX 609 ; N uni040E ; G 931 -U 1039 ; WX 752 ; N uni040F ; G 932 -U 1040 ; WX 684 ; N uni0410 ; G 933 -U 1041 ; WX 686 ; N uni0411 ; G 934 -U 1042 ; WX 686 ; N uni0412 ; G 935 -U 1043 ; WX 557 ; N uni0413 ; G 936 -U 1044 ; WX 781 ; N uni0414 ; G 937 -U 1045 ; WX 632 ; N uni0415 ; G 938 -U 1046 ; WX 1077 ; N uni0416 ; G 939 -U 1047 ; WX 641 ; N uni0417 ; G 940 -U 1048 ; WX 748 ; N uni0418 ; G 941 -U 1049 ; WX 748 ; N uni0419 ; G 942 -U 1050 ; WX 710 ; N uni041A ; G 943 -U 1051 ; WX 752 ; N uni041B ; G 944 -U 1052 ; WX 863 ; N uni041C ; G 945 -U 1053 ; WX 752 ; N uni041D ; G 946 -U 1054 ; WX 787 ; N uni041E ; G 947 -U 1055 ; WX 752 ; N uni041F ; G 948 -U 1056 ; WX 603 ; N uni0420 ; G 949 -U 1057 ; WX 698 ; N uni0421 ; G 950 -U 1058 ; WX 611 ; N uni0422 ; G 951 -U 1059 ; WX 609 ; N uni0423 ; G 952 -U 1060 ; WX 861 ; N uni0424 ; G 953 -U 1061 ; WX 685 ; N uni0425 ; G 954 -U 1062 ; WX 776 ; N uni0426 ; G 955 -U 1063 ; WX 686 ; N uni0427 ; G 956 -U 1064 ; WX 1069 ; N uni0428 ; G 957 -U 1065 ; WX 1094 ; N uni0429 ; G 958 -U 1066 ; WX 833 ; N uni042A ; G 959 -U 1067 ; WX 818 ; N uni042B ; G 960 -U 1068 ; WX 686 ; N uni042C ; G 961 -U 1069 ; WX 698 ; N uni042D ; G 962 -U 1070 ; WX 1080 ; N uni042E ; G 963 -U 1071 ; WX 695 ; N uni042F ; G 964 -U 1072 ; WX 613 ; N uni0430 ; G 965 -U 1073 ; WX 617 ; N uni0431 ; G 966 -U 1074 ; WX 589 ; N uni0432 ; G 967 -U 1075 ; WX 525 ; N uni0433 ; G 968 -U 1076 ; WX 691 ; N uni0434 ; G 969 -U 1077 ; WX 615 ; N uni0435 ; G 970 -U 1078 ; WX 901 ; N uni0436 ; G 971 -U 1079 ; WX 532 ; N uni0437 ; G 972 -U 1080 ; WX 650 ; N uni0438 ; G 973 -U 1081 ; WX 650 ; N uni0439 ; G 974 -U 1082 ; WX 604 ; N uni043A ; G 975 -U 1083 ; WX 639 ; N uni043B ; G 976 -U 1084 ; WX 754 ; N uni043C ; G 977 -U 1085 ; WX 654 ; N uni043D ; G 978 -U 1086 ; WX 612 ; N uni043E ; G 979 -U 1087 ; WX 654 ; N uni043F ; G 980 -U 1088 ; WX 635 ; N uni0440 ; G 981 -U 1089 ; WX 550 ; N uni0441 ; G 982 -U 1090 ; WX 583 ; N uni0442 ; G 983 -U 1091 ; WX 592 ; N uni0443 ; G 984 -U 1092 ; WX 855 ; N uni0444 ; G 985 -U 1093 ; WX 592 ; N uni0445 ; G 986 -U 1094 ; WX 681 ; N uni0446 ; G 987 -U 1095 ; WX 591 ; N uni0447 ; G 988 -U 1096 ; WX 915 ; N uni0448 ; G 989 -U 1097 ; WX 942 ; N uni0449 ; G 990 -U 1098 ; WX 707 ; N uni044A ; G 991 -U 1099 ; WX 790 ; N uni044B ; G 992 -U 1100 ; WX 589 ; N uni044C ; G 993 -U 1101 ; WX 549 ; N uni044D ; G 994 -U 1102 ; WX 842 ; N uni044E ; G 995 -U 1103 ; WX 602 ; N uni044F ; G 996 -U 1104 ; WX 615 ; N uni0450 ; G 997 -U 1105 ; WX 615 ; N uni0451 ; G 998 -U 1106 ; WX 625 ; N uni0452 ; G 999 -U 1107 ; WX 525 ; N uni0453 ; G 1000 -U 1108 ; WX 549 ; N uni0454 ; G 1001 -U 1109 ; WX 521 ; N uni0455 ; G 1002 -U 1110 ; WX 278 ; N uni0456 ; G 1003 -U 1111 ; WX 278 ; N uni0457 ; G 1004 -U 1112 ; WX 278 ; N uni0458 ; G 1005 -U 1113 ; WX 902 ; N uni0459 ; G 1006 -U 1114 ; WX 898 ; N uni045A ; G 1007 -U 1115 ; WX 652 ; N uni045B ; G 1008 -U 1116 ; WX 604 ; N uni045C ; G 1009 -U 1117 ; WX 650 ; N uni045D ; G 1010 -U 1118 ; WX 592 ; N uni045E ; G 1011 -U 1119 ; WX 654 ; N uni045F ; G 1012 -U 1120 ; WX 934 ; N uni0460 ; G 1013 -U 1121 ; WX 837 ; N uni0461 ; G 1014 -U 1122 ; WX 771 ; N uni0462 ; G 1015 -U 1123 ; WX 672 ; N uni0463 ; G 1016 -U 1124 ; WX 942 ; N uni0464 ; G 1017 -U 1125 ; WX 749 ; N uni0465 ; G 1018 -U 1126 ; WX 879 ; N uni0466 ; G 1019 -U 1127 ; WX 783 ; N uni0467 ; G 1020 -U 1128 ; WX 1160 ; N uni0468 ; G 1021 -U 1129 ; WX 1001 ; N uni0469 ; G 1022 -U 1130 ; WX 787 ; N uni046A ; G 1023 -U 1131 ; WX 612 ; N uni046B ; G 1024 -U 1132 ; WX 1027 ; N uni046C ; G 1025 -U 1133 ; WX 824 ; N uni046D ; G 1026 -U 1134 ; WX 636 ; N uni046E ; G 1027 -U 1135 ; WX 541 ; N uni046F ; G 1028 -U 1136 ; WX 856 ; N uni0470 ; G 1029 -U 1137 ; WX 876 ; N uni0471 ; G 1030 -U 1138 ; WX 787 ; N uni0472 ; G 1031 -U 1139 ; WX 612 ; N uni0473 ; G 1032 -U 1140 ; WX 781 ; N uni0474 ; G 1033 -U 1141 ; WX 665 ; N uni0475 ; G 1034 -U 1142 ; WX 781 ; N uni0476 ; G 1035 -U 1143 ; WX 665 ; N uni0477 ; G 1036 -U 1144 ; WX 992 ; N uni0478 ; G 1037 -U 1145 ; WX 904 ; N uni0479 ; G 1038 -U 1146 ; WX 953 ; N uni047A ; G 1039 -U 1147 ; WX 758 ; N uni047B ; G 1040 -U 1148 ; WX 1180 ; N uni047C ; G 1041 -U 1149 ; WX 1028 ; N uni047D ; G 1042 -U 1150 ; WX 934 ; N uni047E ; G 1043 -U 1151 ; WX 837 ; N uni047F ; G 1044 -U 1152 ; WX 698 ; N uni0480 ; G 1045 -U 1153 ; WX 550 ; N uni0481 ; G 1046 -U 1154 ; WX 502 ; N uni0482 ; G 1047 -U 1155 ; WX 0 ; N uni0483 ; G 1048 -U 1156 ; WX 0 ; N uni0484 ; G 1049 -U 1157 ; WX 0 ; N uni0485 ; G 1050 -U 1158 ; WX 0 ; N uni0486 ; G 1051 -U 1159 ; WX 0 ; N uni0487 ; G 1052 -U 1160 ; WX 418 ; N uni0488 ; G 1053 -U 1161 ; WX 418 ; N uni0489 ; G 1054 -U 1162 ; WX 748 ; N uni048A ; G 1055 -U 1163 ; WX 657 ; N uni048B ; G 1056 -U 1164 ; WX 686 ; N uni048C ; G 1057 -U 1165 ; WX 589 ; N uni048D ; G 1058 -U 1166 ; WX 603 ; N uni048E ; G 1059 -U 1167 ; WX 635 ; N uni048F ; G 1060 -U 1168 ; WX 610 ; N uni0490 ; G 1061 -U 1169 ; WX 525 ; N uni0491 ; G 1062 -U 1170 ; WX 675 ; N uni0492 ; G 1063 -U 1171 ; WX 556 ; N uni0493 ; G 1064 -U 1172 ; WX 557 ; N uni0494 ; G 1065 -U 1173 ; WX 491 ; N uni0495 ; G 1066 -U 1174 ; WX 1077 ; N uni0496 ; G 1067 -U 1175 ; WX 901 ; N uni0497 ; G 1068 -U 1176 ; WX 641 ; N uni0498 ; G 1069 -U 1177 ; WX 532 ; N uni0499 ; G 1070 -U 1178 ; WX 710 ; N uni049A ; G 1071 -U 1179 ; WX 604 ; N uni049B ; G 1072 -U 1180 ; WX 710 ; N uni049C ; G 1073 -U 1181 ; WX 604 ; N uni049D ; G 1074 -U 1182 ; WX 710 ; N uni049E ; G 1075 -U 1183 ; WX 604 ; N uni049F ; G 1076 -U 1184 ; WX 856 ; N uni04A0 ; G 1077 -U 1185 ; WX 832 ; N uni04A1 ; G 1078 -U 1186 ; WX 752 ; N uni04A2 ; G 1079 -U 1187 ; WX 661 ; N uni04A3 ; G 1080 -U 1188 ; WX 1014 ; N uni04A4 ; G 1081 -U 1189 ; WX 877 ; N uni04A5 ; G 1082 -U 1190 ; WX 1113 ; N uni04A6 ; G 1083 -U 1191 ; WX 950 ; N uni04A7 ; G 1084 -U 1192 ; WX 890 ; N uni04A8 ; G 1085 -U 1193 ; WX 707 ; N uni04A9 ; G 1086 -U 1194 ; WX 698 ; N uni04AA ; G 1087 -U 1195 ; WX 550 ; N uni04AB ; G 1088 -U 1196 ; WX 611 ; N uni04AC ; G 1089 -U 1197 ; WX 529 ; N uni04AD ; G 1090 -U 1198 ; WX 611 ; N uni04AE ; G 1091 -U 1199 ; WX 592 ; N uni04AF ; G 1092 -U 1200 ; WX 611 ; N uni04B0 ; G 1093 -U 1201 ; WX 592 ; N uni04B1 ; G 1094 -U 1202 ; WX 685 ; N uni04B2 ; G 1095 -U 1203 ; WX 592 ; N uni04B3 ; G 1096 -U 1204 ; WX 934 ; N uni04B4 ; G 1097 -U 1205 ; WX 807 ; N uni04B5 ; G 1098 -U 1206 ; WX 686 ; N uni04B6 ; G 1099 -U 1207 ; WX 591 ; N uni04B7 ; G 1100 -U 1208 ; WX 686 ; N uni04B8 ; G 1101 -U 1209 ; WX 591 ; N uni04B9 ; G 1102 -U 1210 ; WX 686 ; N uni04BA ; G 1103 -U 1211 ; WX 634 ; N uni04BB ; G 1104 -U 1212 ; WX 929 ; N uni04BC ; G 1105 -U 1213 ; WX 731 ; N uni04BD ; G 1106 -U 1214 ; WX 929 ; N uni04BE ; G 1107 -U 1215 ; WX 731 ; N uni04BF ; G 1108 -U 1216 ; WX 295 ; N uni04C0 ; G 1109 -U 1217 ; WX 1077 ; N uni04C1 ; G 1110 -U 1218 ; WX 901 ; N uni04C2 ; G 1111 -U 1219 ; WX 655 ; N uni04C3 ; G 1112 -U 1220 ; WX 604 ; N uni04C4 ; G 1113 -U 1221 ; WX 752 ; N uni04C5 ; G 1114 -U 1222 ; WX 639 ; N uni04C6 ; G 1115 -U 1223 ; WX 752 ; N uni04C7 ; G 1116 -U 1224 ; WX 661 ; N uni04C8 ; G 1117 -U 1225 ; WX 752 ; N uni04C9 ; G 1118 -U 1226 ; WX 661 ; N uni04CA ; G 1119 -U 1227 ; WX 686 ; N uni04CB ; G 1120 -U 1228 ; WX 591 ; N uni04CC ; G 1121 -U 1229 ; WX 863 ; N uni04CD ; G 1122 -U 1230 ; WX 754 ; N uni04CE ; G 1123 -U 1231 ; WX 278 ; N uni04CF ; G 1124 -U 1232 ; WX 684 ; N uni04D0 ; G 1125 -U 1233 ; WX 613 ; N uni04D1 ; G 1126 -U 1234 ; WX 684 ; N uni04D2 ; G 1127 -U 1235 ; WX 613 ; N uni04D3 ; G 1128 -U 1236 ; WX 974 ; N uni04D4 ; G 1129 -U 1237 ; WX 995 ; N uni04D5 ; G 1130 -U 1238 ; WX 632 ; N uni04D6 ; G 1131 -U 1239 ; WX 615 ; N uni04D7 ; G 1132 -U 1240 ; WX 787 ; N uni04D8 ; G 1133 -U 1241 ; WX 615 ; N uni04D9 ; G 1134 -U 1242 ; WX 787 ; N uni04DA ; G 1135 -U 1243 ; WX 615 ; N uni04DB ; G 1136 -U 1244 ; WX 1077 ; N uni04DC ; G 1137 -U 1245 ; WX 901 ; N uni04DD ; G 1138 -U 1246 ; WX 641 ; N uni04DE ; G 1139 -U 1247 ; WX 532 ; N uni04DF ; G 1140 -U 1248 ; WX 666 ; N uni04E0 ; G 1141 -U 1249 ; WX 578 ; N uni04E1 ; G 1142 -U 1250 ; WX 748 ; N uni04E2 ; G 1143 -U 1251 ; WX 650 ; N uni04E3 ; G 1144 -U 1252 ; WX 748 ; N uni04E4 ; G 1145 -U 1253 ; WX 650 ; N uni04E5 ; G 1146 -U 1254 ; WX 787 ; N uni04E6 ; G 1147 -U 1255 ; WX 612 ; N uni04E7 ; G 1148 -U 1256 ; WX 787 ; N uni04E8 ; G 1149 -U 1257 ; WX 612 ; N uni04E9 ; G 1150 -U 1258 ; WX 787 ; N uni04EA ; G 1151 -U 1259 ; WX 612 ; N uni04EB ; G 1152 -U 1260 ; WX 698 ; N uni04EC ; G 1153 -U 1261 ; WX 549 ; N uni04ED ; G 1154 -U 1262 ; WX 609 ; N uni04EE ; G 1155 -U 1263 ; WX 592 ; N uni04EF ; G 1156 -U 1264 ; WX 609 ; N uni04F0 ; G 1157 -U 1265 ; WX 592 ; N uni04F1 ; G 1158 -U 1266 ; WX 609 ; N uni04F2 ; G 1159 -U 1267 ; WX 592 ; N uni04F3 ; G 1160 -U 1268 ; WX 686 ; N uni04F4 ; G 1161 -U 1269 ; WX 591 ; N uni04F5 ; G 1162 -U 1270 ; WX 557 ; N uni04F6 ; G 1163 -U 1271 ; WX 491 ; N uni04F7 ; G 1164 -U 1272 ; WX 818 ; N uni04F8 ; G 1165 -U 1273 ; WX 790 ; N uni04F9 ; G 1166 -U 1274 ; WX 675 ; N uni04FA ; G 1167 -U 1275 ; WX 556 ; N uni04FB ; G 1168 -U 1276 ; WX 685 ; N uni04FC ; G 1169 -U 1277 ; WX 592 ; N uni04FD ; G 1170 -U 1278 ; WX 685 ; N uni04FE ; G 1171 -U 1279 ; WX 592 ; N uni04FF ; G 1172 -U 1280 ; WX 686 ; N uni0500 ; G 1173 -U 1281 ; WX 589 ; N uni0501 ; G 1174 -U 1282 ; WX 1006 ; N uni0502 ; G 1175 -U 1283 ; WX 897 ; N uni0503 ; G 1176 -U 1284 ; WX 975 ; N uni0504 ; G 1177 -U 1285 ; WX 869 ; N uni0505 ; G 1178 -U 1286 ; WX 679 ; N uni0506 ; G 1179 -U 1287 ; WX 588 ; N uni0507 ; G 1180 -U 1288 ; WX 1072 ; N uni0508 ; G 1181 -U 1289 ; WX 957 ; N uni0509 ; G 1182 -U 1290 ; WX 1113 ; N uni050A ; G 1183 -U 1291 ; WX 967 ; N uni050B ; G 1184 -U 1292 ; WX 775 ; N uni050C ; G 1185 -U 1293 ; WX 660 ; N uni050D ; G 1186 -U 1294 ; WX 773 ; N uni050E ; G 1187 -U 1295 ; WX 711 ; N uni050F ; G 1188 -U 1296 ; WX 614 ; N uni0510 ; G 1189 -U 1297 ; WX 541 ; N uni0511 ; G 1190 -U 1298 ; WX 752 ; N uni0512 ; G 1191 -U 1299 ; WX 639 ; N uni0513 ; G 1192 -U 1300 ; WX 1195 ; N uni0514 ; G 1193 -U 1301 ; WX 997 ; N uni0515 ; G 1194 -U 1302 ; WX 900 ; N uni0516 ; G 1195 -U 1303 ; WX 867 ; N uni0517 ; G 1196 -U 1304 ; WX 1031 ; N uni0518 ; G 1197 -U 1305 ; WX 989 ; N uni0519 ; G 1198 -U 1306 ; WX 787 ; N uni051A ; G 1199 -U 1307 ; WX 635 ; N uni051B ; G 1200 -U 1308 ; WX 989 ; N uni051C ; G 1201 -U 1309 ; WX 818 ; N uni051D ; G 1202 -U 1310 ; WX 710 ; N uni051E ; G 1203 -U 1311 ; WX 604 ; N uni051F ; G 1204 -U 1312 ; WX 1113 ; N uni0520 ; G 1205 -U 1313 ; WX 942 ; N uni0521 ; G 1206 -U 1314 ; WX 1113 ; N uni0522 ; G 1207 -U 1315 ; WX 949 ; N uni0523 ; G 1208 -U 1316 ; WX 793 ; N uni0524 ; G 1209 -U 1317 ; WX 683 ; N uni0525 ; G 1210 -U 1329 ; WX 766 ; N uni0531 ; G 1211 -U 1330 ; WX 732 ; N uni0532 ; G 1212 -U 1331 ; WX 753 ; N uni0533 ; G 1213 -U 1332 ; WX 753 ; N uni0534 ; G 1214 -U 1333 ; WX 732 ; N uni0535 ; G 1215 -U 1334 ; WX 772 ; N uni0536 ; G 1216 -U 1335 ; WX 640 ; N uni0537 ; G 1217 -U 1336 ; WX 732 ; N uni0538 ; G 1218 -U 1337 ; WX 859 ; N uni0539 ; G 1219 -U 1338 ; WX 753 ; N uni053A ; G 1220 -U 1339 ; WX 691 ; N uni053B ; G 1221 -U 1340 ; WX 533 ; N uni053C ; G 1222 -U 1341 ; WX 922 ; N uni053D ; G 1223 -U 1342 ; WX 863 ; N uni053E ; G 1224 -U 1343 ; WX 732 ; N uni053F ; G 1225 -U 1344 ; WX 716 ; N uni0540 ; G 1226 -U 1345 ; WX 766 ; N uni0541 ; G 1227 -U 1346 ; WX 753 ; N uni0542 ; G 1228 -U 1347 ; WX 767 ; N uni0543 ; G 1229 -U 1348 ; WX 792 ; N uni0544 ; G 1230 -U 1349 ; WX 728 ; N uni0545 ; G 1231 -U 1350 ; WX 729 ; N uni0546 ; G 1232 -U 1351 ; WX 757 ; N uni0547 ; G 1233 -U 1352 ; WX 732 ; N uni0548 ; G 1234 -U 1353 ; WX 713 ; N uni0549 ; G 1235 -U 1354 ; WX 800 ; N uni054A ; G 1236 -U 1355 ; WX 768 ; N uni054B ; G 1237 -U 1356 ; WX 792 ; N uni054C ; G 1238 -U 1357 ; WX 732 ; N uni054D ; G 1239 -U 1358 ; WX 753 ; N uni054E ; G 1240 -U 1359 ; WX 705 ; N uni054F ; G 1241 -U 1360 ; WX 694 ; N uni0550 ; G 1242 -U 1361 ; WX 744 ; N uni0551 ; G 1243 -U 1362 ; WX 538 ; N uni0552 ; G 1244 -U 1363 ; WX 811 ; N uni0553 ; G 1245 -U 1364 ; WX 757 ; N uni0554 ; G 1246 -U 1365 ; WX 787 ; N uni0555 ; G 1247 -U 1366 ; WX 790 ; N uni0556 ; G 1248 -U 1369 ; WX 307 ; N uni0559 ; G 1249 -U 1370 ; WX 318 ; N uni055A ; G 1250 -U 1371 ; WX 234 ; N uni055B ; G 1251 -U 1372 ; WX 361 ; N uni055C ; G 1252 -U 1373 ; WX 238 ; N uni055D ; G 1253 -U 1374 ; WX 405 ; N uni055E ; G 1254 -U 1375 ; WX 500 ; N uni055F ; G 1255 -U 1377 ; WX 974 ; N uni0561 ; G 1256 -U 1378 ; WX 634 ; N uni0562 ; G 1257 -U 1379 ; WX 658 ; N uni0563 ; G 1258 -U 1380 ; WX 663 ; N uni0564 ; G 1259 -U 1381 ; WX 634 ; N uni0565 ; G 1260 -U 1382 ; WX 635 ; N uni0566 ; G 1261 -U 1383 ; WX 515 ; N uni0567 ; G 1262 -U 1384 ; WX 634 ; N uni0568 ; G 1263 -U 1385 ; WX 738 ; N uni0569 ; G 1264 -U 1386 ; WX 658 ; N uni056A ; G 1265 -U 1387 ; WX 634 ; N uni056B ; G 1266 -U 1388 ; WX 271 ; N uni056C ; G 1267 -U 1389 ; WX 980 ; N uni056D ; G 1268 -U 1390 ; WX 623 ; N uni056E ; G 1269 -U 1391 ; WX 634 ; N uni056F ; G 1270 -U 1392 ; WX 634 ; N uni0570 ; G 1271 -U 1393 ; WX 608 ; N uni0571 ; G 1272 -U 1394 ; WX 634 ; N uni0572 ; G 1273 -U 1395 ; WX 629 ; N uni0573 ; G 1274 -U 1396 ; WX 634 ; N uni0574 ; G 1275 -U 1397 ; WX 278 ; N uni0575 ; G 1276 -U 1398 ; WX 634 ; N uni0576 ; G 1277 -U 1399 ; WX 499 ; N uni0577 ; G 1278 -U 1400 ; WX 634 ; N uni0578 ; G 1279 -U 1401 ; WX 404 ; N uni0579 ; G 1280 -U 1402 ; WX 974 ; N uni057A ; G 1281 -U 1403 ; WX 560 ; N uni057B ; G 1282 -U 1404 ; WX 648 ; N uni057C ; G 1283 -U 1405 ; WX 634 ; N uni057D ; G 1284 -U 1406 ; WX 634 ; N uni057E ; G 1285 -U 1407 ; WX 974 ; N uni057F ; G 1286 -U 1408 ; WX 634 ; N uni0580 ; G 1287 -U 1409 ; WX 635 ; N uni0581 ; G 1288 -U 1410 ; WX 435 ; N uni0582 ; G 1289 -U 1411 ; WX 974 ; N uni0583 ; G 1290 -U 1412 ; WX 636 ; N uni0584 ; G 1291 -U 1413 ; WX 612 ; N uni0585 ; G 1292 -U 1414 ; WX 805 ; N uni0586 ; G 1293 -U 1415 ; WX 812 ; N uni0587 ; G 1294 -U 1417 ; WX 337 ; N uni0589 ; G 1295 -U 1418 ; WX 361 ; N uni058A ; G 1296 -U 1456 ; WX 0 ; N uni05B0 ; G 1297 -U 1457 ; WX 0 ; N uni05B1 ; G 1298 -U 1458 ; WX 0 ; N uni05B2 ; G 1299 -U 1459 ; WX 0 ; N uni05B3 ; G 1300 -U 1460 ; WX 0 ; N uni05B4 ; G 1301 -U 1461 ; WX 0 ; N uni05B5 ; G 1302 -U 1462 ; WX 0 ; N uni05B6 ; G 1303 -U 1463 ; WX 0 ; N uni05B7 ; G 1304 -U 1464 ; WX 0 ; N uni05B8 ; G 1305 -U 1465 ; WX 0 ; N uni05B9 ; G 1306 -U 1466 ; WX 0 ; N uni05BA ; G 1307 -U 1467 ; WX 0 ; N uni05BB ; G 1308 -U 1468 ; WX 0 ; N uni05BC ; G 1309 -U 1469 ; WX 0 ; N uni05BD ; G 1310 -U 1470 ; WX 361 ; N uni05BE ; G 1311 -U 1471 ; WX 0 ; N uni05BF ; G 1312 -U 1472 ; WX 295 ; N uni05C0 ; G 1313 -U 1473 ; WX 0 ; N uni05C1 ; G 1314 -U 1474 ; WX 0 ; N uni05C2 ; G 1315 -U 1475 ; WX 295 ; N uni05C3 ; G 1316 -U 1478 ; WX 456 ; N uni05C6 ; G 1317 -U 1479 ; WX 0 ; N uni05C7 ; G 1318 -U 1488 ; WX 668 ; N uni05D0 ; G 1319 -U 1489 ; WX 578 ; N uni05D1 ; G 1320 -U 1490 ; WX 412 ; N uni05D2 ; G 1321 -U 1491 ; WX 546 ; N uni05D3 ; G 1322 -U 1492 ; WX 653 ; N uni05D4 ; G 1323 -U 1493 ; WX 272 ; N uni05D5 ; G 1324 -U 1494 ; WX 346 ; N uni05D6 ; G 1325 -U 1495 ; WX 653 ; N uni05D7 ; G 1326 -U 1496 ; WX 648 ; N uni05D8 ; G 1327 -U 1497 ; WX 224 ; N uni05D9 ; G 1328 -U 1498 ; WX 537 ; N uni05DA ; G 1329 -U 1499 ; WX 529 ; N uni05DB ; G 1330 -U 1500 ; WX 568 ; N uni05DC ; G 1331 -U 1501 ; WX 664 ; N uni05DD ; G 1332 -U 1502 ; WX 679 ; N uni05DE ; G 1333 -U 1503 ; WX 272 ; N uni05DF ; G 1334 -U 1504 ; WX 400 ; N uni05E0 ; G 1335 -U 1505 ; WX 649 ; N uni05E1 ; G 1336 -U 1506 ; WX 626 ; N uni05E2 ; G 1337 -U 1507 ; WX 640 ; N uni05E3 ; G 1338 -U 1508 ; WX 625 ; N uni05E4 ; G 1339 -U 1509 ; WX 540 ; N uni05E5 ; G 1340 -U 1510 ; WX 593 ; N uni05E6 ; G 1341 -U 1511 ; WX 709 ; N uni05E7 ; G 1342 -U 1512 ; WX 564 ; N uni05E8 ; G 1343 -U 1513 ; WX 708 ; N uni05E9 ; G 1344 -U 1514 ; WX 657 ; N uni05EA ; G 1345 -U 1520 ; WX 471 ; N uni05F0 ; G 1346 -U 1521 ; WX 454 ; N uni05F1 ; G 1347 -U 1522 ; WX 471 ; N uni05F2 ; G 1348 -U 1523 ; WX 416 ; N uni05F3 ; G 1349 -U 1524 ; WX 645 ; N uni05F4 ; G 1350 -U 3647 ; WX 636 ; N uni0E3F ; G 1351 -U 3713 ; WX 670 ; N uni0E81 ; G 1352 -U 3714 ; WX 684 ; N uni0E82 ; G 1353 -U 3716 ; WX 688 ; N uni0E84 ; G 1354 -U 3719 ; WX 482 ; N uni0E87 ; G 1355 -U 3720 ; WX 628 ; N uni0E88 ; G 1356 -U 3722 ; WX 684 ; N uni0E8A ; G 1357 -U 3725 ; WX 688 ; N uni0E8D ; G 1358 -U 3732 ; WX 642 ; N uni0E94 ; G 1359 -U 3733 ; WX 642 ; N uni0E95 ; G 1360 -U 3734 ; WX 672 ; N uni0E96 ; G 1361 -U 3735 ; WX 655 ; N uni0E97 ; G 1362 -U 3737 ; WX 641 ; N uni0E99 ; G 1363 -U 3738 ; WX 592 ; N uni0E9A ; G 1364 -U 3739 ; WX 592 ; N uni0E9B ; G 1365 -U 3740 ; WX 745 ; N uni0E9C ; G 1366 -U 3741 ; WX 767 ; N uni0E9D ; G 1367 -U 3742 ; WX 687 ; N uni0E9E ; G 1368 -U 3743 ; WX 687 ; N uni0E9F ; G 1369 -U 3745 ; WX 702 ; N uni0EA1 ; G 1370 -U 3746 ; WX 688 ; N uni0EA2 ; G 1371 -U 3747 ; WX 684 ; N uni0EA3 ; G 1372 -U 3749 ; WX 649 ; N uni0EA5 ; G 1373 -U 3751 ; WX 632 ; N uni0EA7 ; G 1374 -U 3754 ; WX 703 ; N uni0EAA ; G 1375 -U 3755 ; WX 819 ; N uni0EAB ; G 1376 -U 3757 ; WX 633 ; N uni0EAD ; G 1377 -U 3758 ; WX 684 ; N uni0EAE ; G 1378 -U 3759 ; WX 788 ; N uni0EAF ; G 1379 -U 3760 ; WX 632 ; N uni0EB0 ; G 1380 -U 3761 ; WX 0 ; N uni0EB1 ; G 1381 -U 3762 ; WX 539 ; N uni0EB2 ; G 1382 -U 3763 ; WX 539 ; N uni0EB3 ; G 1383 -U 3764 ; WX 0 ; N uni0EB4 ; G 1384 -U 3765 ; WX 0 ; N uni0EB5 ; G 1385 -U 3766 ; WX 0 ; N uni0EB6 ; G 1386 -U 3767 ; WX 0 ; N uni0EB7 ; G 1387 -U 3768 ; WX 0 ; N uni0EB8 ; G 1388 -U 3769 ; WX 0 ; N uni0EB9 ; G 1389 -U 3771 ; WX 0 ; N uni0EBB ; G 1390 -U 3772 ; WX 0 ; N uni0EBC ; G 1391 -U 3773 ; WX 663 ; N uni0EBD ; G 1392 -U 3776 ; WX 360 ; N uni0EC0 ; G 1393 -U 3777 ; WX 679 ; N uni0EC1 ; G 1394 -U 3778 ; WX 460 ; N uni0EC2 ; G 1395 -U 3779 ; WX 547 ; N uni0EC3 ; G 1396 -U 3780 ; WX 491 ; N uni0EC4 ; G 1397 -U 3782 ; WX 674 ; N uni0EC6 ; G 1398 -U 3784 ; WX 0 ; N uni0EC8 ; G 1399 -U 3785 ; WX 0 ; N uni0EC9 ; G 1400 -U 3786 ; WX 0 ; N uni0ECA ; G 1401 -U 3787 ; WX 0 ; N uni0ECB ; G 1402 -U 3788 ; WX 0 ; N uni0ECC ; G 1403 -U 3789 ; WX 0 ; N uni0ECD ; G 1404 -U 3792 ; WX 636 ; N uni0ED0 ; G 1405 -U 3793 ; WX 641 ; N uni0ED1 ; G 1406 -U 3794 ; WX 641 ; N uni0ED2 ; G 1407 -U 3795 ; WX 670 ; N uni0ED3 ; G 1408 -U 3796 ; WX 625 ; N uni0ED4 ; G 1409 -U 3797 ; WX 625 ; N uni0ED5 ; G 1410 -U 3798 ; WX 703 ; N uni0ED6 ; G 1411 -U 3799 ; WX 670 ; N uni0ED7 ; G 1412 -U 3800 ; WX 674 ; N uni0ED8 ; G 1413 -U 3801 ; WX 677 ; N uni0ED9 ; G 1414 -U 3804 ; WX 1028 ; N uni0EDC ; G 1415 -U 3805 ; WX 1028 ; N uni0EDD ; G 1416 -U 4256 ; WX 874 ; N uni10A0 ; G 1417 -U 4257 ; WX 733 ; N uni10A1 ; G 1418 -U 4258 ; WX 679 ; N uni10A2 ; G 1419 -U 4259 ; WX 834 ; N uni10A3 ; G 1420 -U 4260 ; WX 615 ; N uni10A4 ; G 1421 -U 4261 ; WX 768 ; N uni10A5 ; G 1422 -U 4262 ; WX 753 ; N uni10A6 ; G 1423 -U 4263 ; WX 914 ; N uni10A7 ; G 1424 -U 4264 ; WX 453 ; N uni10A8 ; G 1425 -U 4265 ; WX 620 ; N uni10A9 ; G 1426 -U 4266 ; WX 843 ; N uni10AA ; G 1427 -U 4267 ; WX 882 ; N uni10AB ; G 1428 -U 4268 ; WX 625 ; N uni10AC ; G 1429 -U 4269 ; WX 854 ; N uni10AD ; G 1430 -U 4270 ; WX 781 ; N uni10AE ; G 1431 -U 4271 ; WX 629 ; N uni10AF ; G 1432 -U 4272 ; WX 912 ; N uni10B0 ; G 1433 -U 4273 ; WX 621 ; N uni10B1 ; G 1434 -U 4274 ; WX 620 ; N uni10B2 ; G 1435 -U 4275 ; WX 854 ; N uni10B3 ; G 1436 -U 4276 ; WX 866 ; N uni10B4 ; G 1437 -U 4277 ; WX 724 ; N uni10B5 ; G 1438 -U 4278 ; WX 630 ; N uni10B6 ; G 1439 -U 4279 ; WX 621 ; N uni10B7 ; G 1440 -U 4280 ; WX 625 ; N uni10B8 ; G 1441 -U 4281 ; WX 620 ; N uni10B9 ; G 1442 -U 4282 ; WX 818 ; N uni10BA ; G 1443 -U 4283 ; WX 874 ; N uni10BB ; G 1444 -U 4284 ; WX 615 ; N uni10BC ; G 1445 -U 4285 ; WX 623 ; N uni10BD ; G 1446 -U 4286 ; WX 625 ; N uni10BE ; G 1447 -U 4287 ; WX 725 ; N uni10BF ; G 1448 -U 4288 ; WX 844 ; N uni10C0 ; G 1449 -U 4289 ; WX 596 ; N uni10C1 ; G 1450 -U 4290 ; WX 688 ; N uni10C2 ; G 1451 -U 4291 ; WX 596 ; N uni10C3 ; G 1452 -U 4292 ; WX 594 ; N uni10C4 ; G 1453 -U 4293 ; WX 738 ; N uni10C5 ; G 1454 -U 4304 ; WX 508 ; N uni10D0 ; G 1455 -U 4305 ; WX 518 ; N uni10D1 ; G 1456 -U 4306 ; WX 581 ; N uni10D2 ; G 1457 -U 4307 ; WX 818 ; N uni10D3 ; G 1458 -U 4308 ; WX 508 ; N uni10D4 ; G 1459 -U 4309 ; WX 513 ; N uni10D5 ; G 1460 -U 4310 ; WX 500 ; N uni10D6 ; G 1461 -U 4311 ; WX 801 ; N uni10D7 ; G 1462 -U 4312 ; WX 518 ; N uni10D8 ; G 1463 -U 4313 ; WX 510 ; N uni10D9 ; G 1464 -U 4314 ; WX 1064 ; N uni10DA ; G 1465 -U 4315 ; WX 522 ; N uni10DB ; G 1466 -U 4316 ; WX 522 ; N uni10DC ; G 1467 -U 4317 ; WX 786 ; N uni10DD ; G 1468 -U 4318 ; WX 508 ; N uni10DE ; G 1469 -U 4319 ; WX 518 ; N uni10DF ; G 1470 -U 4320 ; WX 796 ; N uni10E0 ; G 1471 -U 4321 ; WX 522 ; N uni10E1 ; G 1472 -U 4322 ; WX 654 ; N uni10E2 ; G 1473 -U 4323 ; WX 522 ; N uni10E3 ; G 1474 -U 4324 ; WX 825 ; N uni10E4 ; G 1475 -U 4325 ; WX 513 ; N uni10E5 ; G 1476 -U 4326 ; WX 786 ; N uni10E6 ; G 1477 -U 4327 ; WX 518 ; N uni10E7 ; G 1478 -U 4328 ; WX 518 ; N uni10E8 ; G 1479 -U 4329 ; WX 522 ; N uni10E9 ; G 1480 -U 4330 ; WX 571 ; N uni10EA ; G 1481 -U 4331 ; WX 522 ; N uni10EB ; G 1482 -U 4332 ; WX 518 ; N uni10EC ; G 1483 -U 4333 ; WX 520 ; N uni10ED ; G 1484 -U 4334 ; WX 522 ; N uni10EE ; G 1485 -U 4335 ; WX 454 ; N uni10EF ; G 1486 -U 4336 ; WX 508 ; N uni10F0 ; G 1487 -U 4337 ; WX 518 ; N uni10F1 ; G 1488 -U 4338 ; WX 508 ; N uni10F2 ; G 1489 -U 4339 ; WX 508 ; N uni10F3 ; G 1490 -U 4340 ; WX 518 ; N uni10F4 ; G 1491 -U 4341 ; WX 554 ; N uni10F5 ; G 1492 -U 4342 ; WX 828 ; N uni10F6 ; G 1493 -U 4343 ; WX 552 ; N uni10F7 ; G 1494 -U 4344 ; WX 508 ; N uni10F8 ; G 1495 -U 4345 ; WX 571 ; N uni10F9 ; G 1496 -U 4346 ; WX 508 ; N uni10FA ; G 1497 -U 4347 ; WX 448 ; N uni10FB ; G 1498 -U 4348 ; WX 324 ; N uni10FC ; G 1499 -U 5121 ; WX 684 ; N uni1401 ; G 1500 -U 5122 ; WX 684 ; N uni1402 ; G 1501 -U 5123 ; WX 684 ; N uni1403 ; G 1502 -U 5124 ; WX 684 ; N uni1404 ; G 1503 -U 5125 ; WX 769 ; N uni1405 ; G 1504 -U 5126 ; WX 769 ; N uni1406 ; G 1505 -U 5127 ; WX 769 ; N uni1407 ; G 1506 -U 5129 ; WX 769 ; N uni1409 ; G 1507 -U 5130 ; WX 769 ; N uni140A ; G 1508 -U 5131 ; WX 769 ; N uni140B ; G 1509 -U 5132 ; WX 835 ; N uni140C ; G 1510 -U 5133 ; WX 834 ; N uni140D ; G 1511 -U 5134 ; WX 835 ; N uni140E ; G 1512 -U 5135 ; WX 834 ; N uni140F ; G 1513 -U 5136 ; WX 835 ; N uni1410 ; G 1514 -U 5137 ; WX 834 ; N uni1411 ; G 1515 -U 5138 ; WX 967 ; N uni1412 ; G 1516 -U 5139 ; WX 1007 ; N uni1413 ; G 1517 -U 5140 ; WX 967 ; N uni1414 ; G 1518 -U 5141 ; WX 1007 ; N uni1415 ; G 1519 -U 5142 ; WX 769 ; N uni1416 ; G 1520 -U 5143 ; WX 967 ; N uni1417 ; G 1521 -U 5144 ; WX 1007 ; N uni1418 ; G 1522 -U 5145 ; WX 967 ; N uni1419 ; G 1523 -U 5146 ; WX 1007 ; N uni141A ; G 1524 -U 5147 ; WX 769 ; N uni141B ; G 1525 -U 5149 ; WX 256 ; N uni141D ; G 1526 -U 5150 ; WX 543 ; N uni141E ; G 1527 -U 5151 ; WX 423 ; N uni141F ; G 1528 -U 5152 ; WX 423 ; N uni1420 ; G 1529 -U 5153 ; WX 389 ; N uni1421 ; G 1530 -U 5154 ; WX 389 ; N uni1422 ; G 1531 -U 5155 ; WX 393 ; N uni1423 ; G 1532 -U 5156 ; WX 389 ; N uni1424 ; G 1533 -U 5157 ; WX 466 ; N uni1425 ; G 1534 -U 5158 ; WX 385 ; N uni1426 ; G 1535 -U 5159 ; WX 256 ; N uni1427 ; G 1536 -U 5160 ; WX 389 ; N uni1428 ; G 1537 -U 5161 ; WX 389 ; N uni1429 ; G 1538 -U 5162 ; WX 389 ; N uni142A ; G 1539 -U 5163 ; WX 1090 ; N uni142B ; G 1540 -U 5164 ; WX 909 ; N uni142C ; G 1541 -U 5165 ; WX 953 ; N uni142D ; G 1542 -U 5166 ; WX 1117 ; N uni142E ; G 1543 -U 5167 ; WX 684 ; N uni142F ; G 1544 -U 5168 ; WX 684 ; N uni1430 ; G 1545 -U 5169 ; WX 684 ; N uni1431 ; G 1546 -U 5170 ; WX 684 ; N uni1432 ; G 1547 -U 5171 ; WX 729 ; N uni1433 ; G 1548 -U 5172 ; WX 729 ; N uni1434 ; G 1549 -U 5173 ; WX 729 ; N uni1435 ; G 1550 -U 5175 ; WX 729 ; N uni1437 ; G 1551 -U 5176 ; WX 729 ; N uni1438 ; G 1552 -U 5177 ; WX 729 ; N uni1439 ; G 1553 -U 5178 ; WX 835 ; N uni143A ; G 1554 -U 5179 ; WX 684 ; N uni143B ; G 1555 -U 5180 ; WX 835 ; N uni143C ; G 1556 -U 5181 ; WX 834 ; N uni143D ; G 1557 -U 5182 ; WX 835 ; N uni143E ; G 1558 -U 5183 ; WX 834 ; N uni143F ; G 1559 -U 5184 ; WX 967 ; N uni1440 ; G 1560 -U 5185 ; WX 1007 ; N uni1441 ; G 1561 -U 5186 ; WX 967 ; N uni1442 ; G 1562 -U 5187 ; WX 1007 ; N uni1443 ; G 1563 -U 5188 ; WX 967 ; N uni1444 ; G 1564 -U 5189 ; WX 1007 ; N uni1445 ; G 1565 -U 5190 ; WX 967 ; N uni1446 ; G 1566 -U 5191 ; WX 1007 ; N uni1447 ; G 1567 -U 5192 ; WX 729 ; N uni1448 ; G 1568 -U 5193 ; WX 508 ; N uni1449 ; G 1569 -U 5194 ; WX 192 ; N uni144A ; G 1570 -U 5196 ; WX 732 ; N uni144C ; G 1571 -U 5197 ; WX 732 ; N uni144D ; G 1572 -U 5198 ; WX 732 ; N uni144E ; G 1573 -U 5199 ; WX 732 ; N uni144F ; G 1574 -U 5200 ; WX 730 ; N uni1450 ; G 1575 -U 5201 ; WX 730 ; N uni1451 ; G 1576 -U 5202 ; WX 730 ; N uni1452 ; G 1577 -U 5204 ; WX 730 ; N uni1454 ; G 1578 -U 5205 ; WX 730 ; N uni1455 ; G 1579 -U 5206 ; WX 730 ; N uni1456 ; G 1580 -U 5207 ; WX 921 ; N uni1457 ; G 1581 -U 5208 ; WX 889 ; N uni1458 ; G 1582 -U 5209 ; WX 921 ; N uni1459 ; G 1583 -U 5210 ; WX 889 ; N uni145A ; G 1584 -U 5211 ; WX 921 ; N uni145B ; G 1585 -U 5212 ; WX 889 ; N uni145C ; G 1586 -U 5213 ; WX 928 ; N uni145D ; G 1587 -U 5214 ; WX 900 ; N uni145E ; G 1588 -U 5215 ; WX 928 ; N uni145F ; G 1589 -U 5216 ; WX 900 ; N uni1460 ; G 1590 -U 5217 ; WX 947 ; N uni1461 ; G 1591 -U 5218 ; WX 900 ; N uni1462 ; G 1592 -U 5219 ; WX 947 ; N uni1463 ; G 1593 -U 5220 ; WX 900 ; N uni1464 ; G 1594 -U 5221 ; WX 947 ; N uni1465 ; G 1595 -U 5222 ; WX 434 ; N uni1466 ; G 1596 -U 5223 ; WX 877 ; N uni1467 ; G 1597 -U 5224 ; WX 877 ; N uni1468 ; G 1598 -U 5225 ; WX 866 ; N uni1469 ; G 1599 -U 5226 ; WX 890 ; N uni146A ; G 1600 -U 5227 ; WX 628 ; N uni146B ; G 1601 -U 5228 ; WX 628 ; N uni146C ; G 1602 -U 5229 ; WX 628 ; N uni146D ; G 1603 -U 5230 ; WX 628 ; N uni146E ; G 1604 -U 5231 ; WX 628 ; N uni146F ; G 1605 -U 5232 ; WX 628 ; N uni1470 ; G 1606 -U 5233 ; WX 628 ; N uni1471 ; G 1607 -U 5234 ; WX 628 ; N uni1472 ; G 1608 -U 5235 ; WX 628 ; N uni1473 ; G 1609 -U 5236 ; WX 860 ; N uni1474 ; G 1610 -U 5237 ; WX 771 ; N uni1475 ; G 1611 -U 5238 ; WX 815 ; N uni1476 ; G 1612 -U 5239 ; WX 816 ; N uni1477 ; G 1613 -U 5240 ; WX 815 ; N uni1478 ; G 1614 -U 5241 ; WX 816 ; N uni1479 ; G 1615 -U 5242 ; WX 860 ; N uni147A ; G 1616 -U 5243 ; WX 771 ; N uni147B ; G 1617 -U 5244 ; WX 860 ; N uni147C ; G 1618 -U 5245 ; WX 771 ; N uni147D ; G 1619 -U 5246 ; WX 815 ; N uni147E ; G 1620 -U 5247 ; WX 816 ; N uni147F ; G 1621 -U 5248 ; WX 815 ; N uni1480 ; G 1622 -U 5249 ; WX 816 ; N uni1481 ; G 1623 -U 5250 ; WX 815 ; N uni1482 ; G 1624 -U 5251 ; WX 407 ; N uni1483 ; G 1625 -U 5252 ; WX 407 ; N uni1484 ; G 1626 -U 5253 ; WX 750 ; N uni1485 ; G 1627 -U 5254 ; WX 775 ; N uni1486 ; G 1628 -U 5255 ; WX 750 ; N uni1487 ; G 1629 -U 5256 ; WX 775 ; N uni1488 ; G 1630 -U 5257 ; WX 628 ; N uni1489 ; G 1631 -U 5258 ; WX 628 ; N uni148A ; G 1632 -U 5259 ; WX 628 ; N uni148B ; G 1633 -U 5260 ; WX 628 ; N uni148C ; G 1634 -U 5261 ; WX 628 ; N uni148D ; G 1635 -U 5262 ; WX 628 ; N uni148E ; G 1636 -U 5263 ; WX 628 ; N uni148F ; G 1637 -U 5264 ; WX 628 ; N uni1490 ; G 1638 -U 5265 ; WX 628 ; N uni1491 ; G 1639 -U 5266 ; WX 860 ; N uni1492 ; G 1640 -U 5267 ; WX 771 ; N uni1493 ; G 1641 -U 5268 ; WX 815 ; N uni1494 ; G 1642 -U 5269 ; WX 816 ; N uni1495 ; G 1643 -U 5270 ; WX 815 ; N uni1496 ; G 1644 -U 5271 ; WX 816 ; N uni1497 ; G 1645 -U 5272 ; WX 860 ; N uni1498 ; G 1646 -U 5273 ; WX 771 ; N uni1499 ; G 1647 -U 5274 ; WX 860 ; N uni149A ; G 1648 -U 5275 ; WX 771 ; N uni149B ; G 1649 -U 5276 ; WX 815 ; N uni149C ; G 1650 -U 5277 ; WX 816 ; N uni149D ; G 1651 -U 5278 ; WX 815 ; N uni149E ; G 1652 -U 5279 ; WX 816 ; N uni149F ; G 1653 -U 5280 ; WX 815 ; N uni14A0 ; G 1654 -U 5281 ; WX 435 ; N uni14A1 ; G 1655 -U 5282 ; WX 435 ; N uni14A2 ; G 1656 -U 5283 ; WX 610 ; N uni14A3 ; G 1657 -U 5284 ; WX 557 ; N uni14A4 ; G 1658 -U 5285 ; WX 557 ; N uni14A5 ; G 1659 -U 5286 ; WX 557 ; N uni14A6 ; G 1660 -U 5287 ; WX 610 ; N uni14A7 ; G 1661 -U 5288 ; WX 610 ; N uni14A8 ; G 1662 -U 5289 ; WX 610 ; N uni14A9 ; G 1663 -U 5290 ; WX 557 ; N uni14AA ; G 1664 -U 5291 ; WX 557 ; N uni14AB ; G 1665 -U 5292 ; WX 749 ; N uni14AC ; G 1666 -U 5293 ; WX 769 ; N uni14AD ; G 1667 -U 5294 ; WX 746 ; N uni14AE ; G 1668 -U 5295 ; WX 764 ; N uni14AF ; G 1669 -U 5296 ; WX 746 ; N uni14B0 ; G 1670 -U 5297 ; WX 764 ; N uni14B1 ; G 1671 -U 5298 ; WX 749 ; N uni14B2 ; G 1672 -U 5299 ; WX 769 ; N uni14B3 ; G 1673 -U 5300 ; WX 749 ; N uni14B4 ; G 1674 -U 5301 ; WX 769 ; N uni14B5 ; G 1675 -U 5302 ; WX 746 ; N uni14B6 ; G 1676 -U 5303 ; WX 764 ; N uni14B7 ; G 1677 -U 5304 ; WX 746 ; N uni14B8 ; G 1678 -U 5305 ; WX 764 ; N uni14B9 ; G 1679 -U 5306 ; WX 746 ; N uni14BA ; G 1680 -U 5307 ; WX 386 ; N uni14BB ; G 1681 -U 5308 ; WX 508 ; N uni14BC ; G 1682 -U 5309 ; WX 386 ; N uni14BD ; G 1683 -U 5312 ; WX 852 ; N uni14C0 ; G 1684 -U 5313 ; WX 852 ; N uni14C1 ; G 1685 -U 5314 ; WX 852 ; N uni14C2 ; G 1686 -U 5315 ; WX 852 ; N uni14C3 ; G 1687 -U 5316 ; WX 852 ; N uni14C4 ; G 1688 -U 5317 ; WX 852 ; N uni14C5 ; G 1689 -U 5318 ; WX 852 ; N uni14C6 ; G 1690 -U 5319 ; WX 852 ; N uni14C7 ; G 1691 -U 5320 ; WX 852 ; N uni14C8 ; G 1692 -U 5321 ; WX 1069 ; N uni14C9 ; G 1693 -U 5322 ; WX 1035 ; N uni14CA ; G 1694 -U 5323 ; WX 1059 ; N uni14CB ; G 1695 -U 5324 ; WX 852 ; N uni14CC ; G 1696 -U 5325 ; WX 1059 ; N uni14CD ; G 1697 -U 5326 ; WX 852 ; N uni14CE ; G 1698 -U 5327 ; WX 852 ; N uni14CF ; G 1699 -U 5328 ; WX 600 ; N uni14D0 ; G 1700 -U 5329 ; WX 453 ; N uni14D1 ; G 1701 -U 5330 ; WX 600 ; N uni14D2 ; G 1702 -U 5331 ; WX 852 ; N uni14D3 ; G 1703 -U 5332 ; WX 852 ; N uni14D4 ; G 1704 -U 5333 ; WX 852 ; N uni14D5 ; G 1705 -U 5334 ; WX 852 ; N uni14D6 ; G 1706 -U 5335 ; WX 852 ; N uni14D7 ; G 1707 -U 5336 ; WX 852 ; N uni14D8 ; G 1708 -U 5337 ; WX 852 ; N uni14D9 ; G 1709 -U 5338 ; WX 852 ; N uni14DA ; G 1710 -U 5339 ; WX 852 ; N uni14DB ; G 1711 -U 5340 ; WX 1069 ; N uni14DC ; G 1712 -U 5341 ; WX 1035 ; N uni14DD ; G 1713 -U 5342 ; WX 1059 ; N uni14DE ; G 1714 -U 5343 ; WX 1030 ; N uni14DF ; G 1715 -U 5344 ; WX 1059 ; N uni14E0 ; G 1716 -U 5345 ; WX 1030 ; N uni14E1 ; G 1717 -U 5346 ; WX 1069 ; N uni14E2 ; G 1718 -U 5347 ; WX 1035 ; N uni14E3 ; G 1719 -U 5348 ; WX 1069 ; N uni14E4 ; G 1720 -U 5349 ; WX 1035 ; N uni14E5 ; G 1721 -U 5350 ; WX 1083 ; N uni14E6 ; G 1722 -U 5351 ; WX 1030 ; N uni14E7 ; G 1723 -U 5352 ; WX 1083 ; N uni14E8 ; G 1724 -U 5353 ; WX 1030 ; N uni14E9 ; G 1725 -U 5354 ; WX 600 ; N uni14EA ; G 1726 -U 5356 ; WX 729 ; N uni14EC ; G 1727 -U 5357 ; WX 603 ; N uni14ED ; G 1728 -U 5358 ; WX 603 ; N uni14EE ; G 1729 -U 5359 ; WX 603 ; N uni14EF ; G 1730 -U 5360 ; WX 603 ; N uni14F0 ; G 1731 -U 5361 ; WX 603 ; N uni14F1 ; G 1732 -U 5362 ; WX 603 ; N uni14F2 ; G 1733 -U 5363 ; WX 603 ; N uni14F3 ; G 1734 -U 5364 ; WX 603 ; N uni14F4 ; G 1735 -U 5365 ; WX 603 ; N uni14F5 ; G 1736 -U 5366 ; WX 834 ; N uni14F6 ; G 1737 -U 5367 ; WX 754 ; N uni14F7 ; G 1738 -U 5368 ; WX 792 ; N uni14F8 ; G 1739 -U 5369 ; WX 771 ; N uni14F9 ; G 1740 -U 5370 ; WX 792 ; N uni14FA ; G 1741 -U 5371 ; WX 771 ; N uni14FB ; G 1742 -U 5372 ; WX 834 ; N uni14FC ; G 1743 -U 5373 ; WX 754 ; N uni14FD ; G 1744 -U 5374 ; WX 834 ; N uni14FE ; G 1745 -U 5375 ; WX 754 ; N uni14FF ; G 1746 -U 5376 ; WX 792 ; N uni1500 ; G 1747 -U 5377 ; WX 771 ; N uni1501 ; G 1748 -U 5378 ; WX 792 ; N uni1502 ; G 1749 -U 5379 ; WX 771 ; N uni1503 ; G 1750 -U 5380 ; WX 792 ; N uni1504 ; G 1751 -U 5381 ; WX 418 ; N uni1505 ; G 1752 -U 5382 ; WX 420 ; N uni1506 ; G 1753 -U 5383 ; WX 418 ; N uni1507 ; G 1754 -U 5392 ; WX 712 ; N uni1510 ; G 1755 -U 5393 ; WX 712 ; N uni1511 ; G 1756 -U 5394 ; WX 712 ; N uni1512 ; G 1757 -U 5395 ; WX 892 ; N uni1513 ; G 1758 -U 5396 ; WX 892 ; N uni1514 ; G 1759 -U 5397 ; WX 892 ; N uni1515 ; G 1760 -U 5398 ; WX 892 ; N uni1516 ; G 1761 -U 5399 ; WX 910 ; N uni1517 ; G 1762 -U 5400 ; WX 872 ; N uni1518 ; G 1763 -U 5401 ; WX 910 ; N uni1519 ; G 1764 -U 5402 ; WX 872 ; N uni151A ; G 1765 -U 5403 ; WX 910 ; N uni151B ; G 1766 -U 5404 ; WX 872 ; N uni151C ; G 1767 -U 5405 ; WX 1140 ; N uni151D ; G 1768 -U 5406 ; WX 1100 ; N uni151E ; G 1769 -U 5407 ; WX 1140 ; N uni151F ; G 1770 -U 5408 ; WX 1100 ; N uni1520 ; G 1771 -U 5409 ; WX 1140 ; N uni1521 ; G 1772 -U 5410 ; WX 1100 ; N uni1522 ; G 1773 -U 5411 ; WX 1140 ; N uni1523 ; G 1774 -U 5412 ; WX 1100 ; N uni1524 ; G 1775 -U 5413 ; WX 641 ; N uni1525 ; G 1776 -U 5414 ; WX 627 ; N uni1526 ; G 1777 -U 5415 ; WX 627 ; N uni1527 ; G 1778 -U 5416 ; WX 627 ; N uni1528 ; G 1779 -U 5417 ; WX 627 ; N uni1529 ; G 1780 -U 5418 ; WX 627 ; N uni152A ; G 1781 -U 5419 ; WX 627 ; N uni152B ; G 1782 -U 5420 ; WX 627 ; N uni152C ; G 1783 -U 5421 ; WX 627 ; N uni152D ; G 1784 -U 5422 ; WX 627 ; N uni152E ; G 1785 -U 5423 ; WX 844 ; N uni152F ; G 1786 -U 5424 ; WX 781 ; N uni1530 ; G 1787 -U 5425 ; WX 816 ; N uni1531 ; G 1788 -U 5426 ; WX 818 ; N uni1532 ; G 1789 -U 5427 ; WX 816 ; N uni1533 ; G 1790 -U 5428 ; WX 818 ; N uni1534 ; G 1791 -U 5429 ; WX 844 ; N uni1535 ; G 1792 -U 5430 ; WX 781 ; N uni1536 ; G 1793 -U 5431 ; WX 844 ; N uni1537 ; G 1794 -U 5432 ; WX 781 ; N uni1538 ; G 1795 -U 5433 ; WX 816 ; N uni1539 ; G 1796 -U 5434 ; WX 818 ; N uni153A ; G 1797 -U 5435 ; WX 816 ; N uni153B ; G 1798 -U 5436 ; WX 818 ; N uni153C ; G 1799 -U 5437 ; WX 816 ; N uni153D ; G 1800 -U 5438 ; WX 418 ; N uni153E ; G 1801 -U 5440 ; WX 389 ; N uni1540 ; G 1802 -U 5441 ; WX 484 ; N uni1541 ; G 1803 -U 5442 ; WX 916 ; N uni1542 ; G 1804 -U 5443 ; WX 916 ; N uni1543 ; G 1805 -U 5444 ; WX 863 ; N uni1544 ; G 1806 -U 5445 ; WX 916 ; N uni1545 ; G 1807 -U 5446 ; WX 863 ; N uni1546 ; G 1808 -U 5447 ; WX 863 ; N uni1547 ; G 1809 -U 5448 ; WX 603 ; N uni1548 ; G 1810 -U 5449 ; WX 603 ; N uni1549 ; G 1811 -U 5450 ; WX 603 ; N uni154A ; G 1812 -U 5451 ; WX 603 ; N uni154B ; G 1813 -U 5452 ; WX 603 ; N uni154C ; G 1814 -U 5453 ; WX 603 ; N uni154D ; G 1815 -U 5454 ; WX 834 ; N uni154E ; G 1816 -U 5455 ; WX 754 ; N uni154F ; G 1817 -U 5456 ; WX 418 ; N uni1550 ; G 1818 -U 5458 ; WX 729 ; N uni1552 ; G 1819 -U 5459 ; WX 684 ; N uni1553 ; G 1820 -U 5460 ; WX 684 ; N uni1554 ; G 1821 -U 5461 ; WX 684 ; N uni1555 ; G 1822 -U 5462 ; WX 684 ; N uni1556 ; G 1823 -U 5463 ; WX 726 ; N uni1557 ; G 1824 -U 5464 ; WX 726 ; N uni1558 ; G 1825 -U 5465 ; WX 726 ; N uni1559 ; G 1826 -U 5466 ; WX 726 ; N uni155A ; G 1827 -U 5467 ; WX 924 ; N uni155B ; G 1828 -U 5468 ; WX 1007 ; N uni155C ; G 1829 -U 5469 ; WX 508 ; N uni155D ; G 1830 -U 5470 ; WX 732 ; N uni155E ; G 1831 -U 5471 ; WX 732 ; N uni155F ; G 1832 -U 5472 ; WX 732 ; N uni1560 ; G 1833 -U 5473 ; WX 732 ; N uni1561 ; G 1834 -U 5474 ; WX 732 ; N uni1562 ; G 1835 -U 5475 ; WX 732 ; N uni1563 ; G 1836 -U 5476 ; WX 730 ; N uni1564 ; G 1837 -U 5477 ; WX 730 ; N uni1565 ; G 1838 -U 5478 ; WX 730 ; N uni1566 ; G 1839 -U 5479 ; WX 730 ; N uni1567 ; G 1840 -U 5480 ; WX 947 ; N uni1568 ; G 1841 -U 5481 ; WX 900 ; N uni1569 ; G 1842 -U 5482 ; WX 508 ; N uni156A ; G 1843 -U 5492 ; WX 831 ; N uni1574 ; G 1844 -U 5493 ; WX 831 ; N uni1575 ; G 1845 -U 5494 ; WX 831 ; N uni1576 ; G 1846 -U 5495 ; WX 831 ; N uni1577 ; G 1847 -U 5496 ; WX 831 ; N uni1578 ; G 1848 -U 5497 ; WX 831 ; N uni1579 ; G 1849 -U 5498 ; WX 831 ; N uni157A ; G 1850 -U 5499 ; WX 563 ; N uni157B ; G 1851 -U 5500 ; WX 752 ; N uni157C ; G 1852 -U 5501 ; WX 484 ; N uni157D ; G 1853 -U 5502 ; WX 1047 ; N uni157E ; G 1854 -U 5503 ; WX 1047 ; N uni157F ; G 1855 -U 5504 ; WX 1047 ; N uni1580 ; G 1856 -U 5505 ; WX 1047 ; N uni1581 ; G 1857 -U 5506 ; WX 1047 ; N uni1582 ; G 1858 -U 5507 ; WX 1047 ; N uni1583 ; G 1859 -U 5508 ; WX 1047 ; N uni1584 ; G 1860 -U 5509 ; WX 825 ; N uni1585 ; G 1861 -U 5514 ; WX 831 ; N uni158A ; G 1862 -U 5515 ; WX 831 ; N uni158B ; G 1863 -U 5516 ; WX 831 ; N uni158C ; G 1864 -U 5517 ; WX 831 ; N uni158D ; G 1865 -U 5518 ; WX 1259 ; N uni158E ; G 1866 -U 5519 ; WX 1259 ; N uni158F ; G 1867 -U 5520 ; WX 1259 ; N uni1590 ; G 1868 -U 5521 ; WX 1002 ; N uni1591 ; G 1869 -U 5522 ; WX 1002 ; N uni1592 ; G 1870 -U 5523 ; WX 1259 ; N uni1593 ; G 1871 -U 5524 ; WX 1259 ; N uni1594 ; G 1872 -U 5525 ; WX 700 ; N uni1595 ; G 1873 -U 5526 ; WX 1073 ; N uni1596 ; G 1874 -U 5536 ; WX 852 ; N uni15A0 ; G 1875 -U 5537 ; WX 852 ; N uni15A1 ; G 1876 -U 5538 ; WX 799 ; N uni15A2 ; G 1877 -U 5539 ; WX 799 ; N uni15A3 ; G 1878 -U 5540 ; WX 799 ; N uni15A4 ; G 1879 -U 5541 ; WX 799 ; N uni15A5 ; G 1880 -U 5542 ; WX 600 ; N uni15A6 ; G 1881 -U 5543 ; WX 643 ; N uni15A7 ; G 1882 -U 5544 ; WX 643 ; N uni15A8 ; G 1883 -U 5545 ; WX 643 ; N uni15A9 ; G 1884 -U 5546 ; WX 643 ; N uni15AA ; G 1885 -U 5547 ; WX 643 ; N uni15AB ; G 1886 -U 5548 ; WX 643 ; N uni15AC ; G 1887 -U 5549 ; WX 643 ; N uni15AD ; G 1888 -U 5550 ; WX 418 ; N uni15AE ; G 1889 -U 5551 ; WX 628 ; N uni15AF ; G 1890 -U 5598 ; WX 770 ; N uni15DE ; G 1891 -U 5601 ; WX 770 ; N uni15E1 ; G 1892 -U 5702 ; WX 468 ; N uni1646 ; G 1893 -U 5703 ; WX 468 ; N uni1647 ; G 1894 -U 5742 ; WX 444 ; N uni166E ; G 1895 -U 5743 ; WX 1047 ; N uni166F ; G 1896 -U 5744 ; WX 1310 ; N uni1670 ; G 1897 -U 5745 ; WX 1632 ; N uni1671 ; G 1898 -U 5746 ; WX 1632 ; N uni1672 ; G 1899 -U 5747 ; WX 1375 ; N uni1673 ; G 1900 -U 5748 ; WX 1375 ; N uni1674 ; G 1901 -U 5749 ; WX 1632 ; N uni1675 ; G 1902 -U 5750 ; WX 1632 ; N uni1676 ; G 1903 -U 7424 ; WX 592 ; N uni1D00 ; G 1904 -U 7425 ; WX 717 ; N uni1D01 ; G 1905 -U 7426 ; WX 982 ; N uni1D02 ; G 1906 -U 7427 ; WX 586 ; N uni1D03 ; G 1907 -U 7428 ; WX 550 ; N uni1D04 ; G 1908 -U 7429 ; WX 605 ; N uni1D05 ; G 1909 -U 7430 ; WX 605 ; N uni1D06 ; G 1910 -U 7431 ; WX 491 ; N uni1D07 ; G 1911 -U 7432 ; WX 541 ; N uni1D08 ; G 1912 -U 7433 ; WX 278 ; N uni1D09 ; G 1913 -U 7434 ; WX 395 ; N uni1D0A ; G 1914 -U 7435 ; WX 579 ; N uni1D0B ; G 1915 -U 7436 ; WX 583 ; N uni1D0C ; G 1916 -U 7437 ; WX 754 ; N uni1D0D ; G 1917 -U 7438 ; WX 650 ; N uni1D0E ; G 1918 -U 7439 ; WX 612 ; N uni1D0F ; G 1919 -U 7440 ; WX 550 ; N uni1D10 ; G 1920 -U 7441 ; WX 684 ; N uni1D11 ; G 1921 -U 7442 ; WX 684 ; N uni1D12 ; G 1922 -U 7443 ; WX 684 ; N uni1D13 ; G 1923 -U 7444 ; WX 1023 ; N uni1D14 ; G 1924 -U 7446 ; WX 612 ; N uni1D16 ; G 1925 -U 7447 ; WX 612 ; N uni1D17 ; G 1926 -U 7448 ; WX 524 ; N uni1D18 ; G 1927 -U 7449 ; WX 602 ; N uni1D19 ; G 1928 -U 7450 ; WX 602 ; N uni1D1A ; G 1929 -U 7451 ; WX 583 ; N uni1D1B ; G 1930 -U 7452 ; WX 574 ; N uni1D1C ; G 1931 -U 7453 ; WX 737 ; N uni1D1D ; G 1932 -U 7454 ; WX 948 ; N uni1D1E ; G 1933 -U 7455 ; WX 638 ; N uni1D1F ; G 1934 -U 7456 ; WX 592 ; N uni1D20 ; G 1935 -U 7457 ; WX 818 ; N uni1D21 ; G 1936 -U 7458 ; WX 525 ; N uni1D22 ; G 1937 -U 7459 ; WX 526 ; N uni1D23 ; G 1938 -U 7462 ; WX 583 ; N uni1D26 ; G 1939 -U 7463 ; WX 592 ; N uni1D27 ; G 1940 -U 7464 ; WX 564 ; N uni1D28 ; G 1941 -U 7465 ; WX 524 ; N uni1D29 ; G 1942 -U 7466 ; WX 590 ; N uni1D2A ; G 1943 -U 7467 ; WX 639 ; N uni1D2B ; G 1944 -U 7468 ; WX 431 ; N uni1D2C ; G 1945 -U 7469 ; WX 613 ; N uni1D2D ; G 1946 -U 7470 ; WX 432 ; N uni1D2E ; G 1947 -U 7472 ; WX 485 ; N uni1D30 ; G 1948 -U 7473 ; WX 398 ; N uni1D31 ; G 1949 -U 7474 ; WX 398 ; N uni1D32 ; G 1950 -U 7475 ; WX 488 ; N uni1D33 ; G 1951 -U 7476 ; WX 474 ; N uni1D34 ; G 1952 -U 7477 ; WX 186 ; N uni1D35 ; G 1953 -U 7478 ; WX 186 ; N uni1D36 ; G 1954 -U 7479 ; WX 413 ; N uni1D37 ; G 1955 -U 7480 ; WX 351 ; N uni1D38 ; G 1956 -U 7481 ; WX 543 ; N uni1D39 ; G 1957 -U 7482 ; WX 471 ; N uni1D3A ; G 1958 -U 7483 ; WX 471 ; N uni1D3B ; G 1959 -U 7484 ; WX 496 ; N uni1D3C ; G 1960 -U 7485 ; WX 439 ; N uni1D3D ; G 1961 -U 7486 ; WX 380 ; N uni1D3E ; G 1962 -U 7487 ; WX 438 ; N uni1D3F ; G 1963 -U 7488 ; WX 385 ; N uni1D40 ; G 1964 -U 7489 ; WX 461 ; N uni1D41 ; G 1965 -U 7490 ; WX 623 ; N uni1D42 ; G 1966 -U 7491 ; WX 392 ; N uni1D43 ; G 1967 -U 7492 ; WX 392 ; N uni1D44 ; G 1968 -U 7493 ; WX 405 ; N uni1D45 ; G 1969 -U 7494 ; WX 648 ; N uni1D46 ; G 1970 -U 7495 ; WX 428 ; N uni1D47 ; G 1971 -U 7496 ; WX 405 ; N uni1D48 ; G 1972 -U 7497 ; WX 417 ; N uni1D49 ; G 1973 -U 7498 ; WX 417 ; N uni1D4A ; G 1974 -U 7499 ; WX 360 ; N uni1D4B ; G 1975 -U 7500 ; WX 359 ; N uni1D4C ; G 1976 -U 7501 ; WX 405 ; N uni1D4D ; G 1977 -U 7502 ; WX 179 ; N uni1D4E ; G 1978 -U 7503 ; WX 426 ; N uni1D4F ; G 1979 -U 7504 ; WX 623 ; N uni1D50 ; G 1980 -U 7505 ; WX 409 ; N uni1D51 ; G 1981 -U 7506 ; WX 414 ; N uni1D52 ; G 1982 -U 7507 ; WX 370 ; N uni1D53 ; G 1983 -U 7508 ; WX 414 ; N uni1D54 ; G 1984 -U 7509 ; WX 414 ; N uni1D55 ; G 1985 -U 7510 ; WX 428 ; N uni1D56 ; G 1986 -U 7511 ; WX 295 ; N uni1D57 ; G 1987 -U 7512 ; WX 405 ; N uni1D58 ; G 1988 -U 7513 ; WX 470 ; N uni1D59 ; G 1989 -U 7514 ; WX 623 ; N uni1D5A ; G 1990 -U 7515 ; WX 417 ; N uni1D5B ; G 1991 -U 7517 ; WX 402 ; N uni1D5D ; G 1992 -U 7518 ; WX 373 ; N uni1D5E ; G 1993 -U 7519 ; WX 385 ; N uni1D5F ; G 1994 -U 7520 ; WX 416 ; N uni1D60 ; G 1995 -U 7521 ; WX 364 ; N uni1D61 ; G 1996 -U 7522 ; WX 179 ; N uni1D62 ; G 1997 -U 7523 ; WX 259 ; N uni1D63 ; G 1998 -U 7524 ; WX 405 ; N uni1D64 ; G 1999 -U 7525 ; WX 417 ; N uni1D65 ; G 2000 -U 7526 ; WX 402 ; N uni1D66 ; G 2001 -U 7527 ; WX 373 ; N uni1D67 ; G 2002 -U 7528 ; WX 412 ; N uni1D68 ; G 2003 -U 7529 ; WX 416 ; N uni1D69 ; G 2004 -U 7530 ; WX 364 ; N uni1D6A ; G 2005 -U 7543 ; WX 635 ; N uni1D77 ; G 2006 -U 7544 ; WX 474 ; N uni1D78 ; G 2007 -U 7547 ; WX 372 ; N uni1D7B ; G 2008 -U 7549 ; WX 667 ; N uni1D7D ; G 2009 -U 7557 ; WX 278 ; N uni1D85 ; G 2010 -U 7579 ; WX 405 ; N uni1D9B ; G 2011 -U 7580 ; WX 370 ; N uni1D9C ; G 2012 -U 7581 ; WX 370 ; N uni1D9D ; G 2013 -U 7582 ; WX 414 ; N uni1D9E ; G 2014 -U 7583 ; WX 360 ; N uni1D9F ; G 2015 -U 7584 ; WX 296 ; N uni1DA0 ; G 2016 -U 7585 ; WX 233 ; N uni1DA1 ; G 2017 -U 7586 ; WX 405 ; N uni1DA2 ; G 2018 -U 7587 ; WX 405 ; N uni1DA3 ; G 2019 -U 7588 ; WX 261 ; N uni1DA4 ; G 2020 -U 7589 ; WX 250 ; N uni1DA5 ; G 2021 -U 7590 ; WX 261 ; N uni1DA6 ; G 2022 -U 7591 ; WX 261 ; N uni1DA7 ; G 2023 -U 7592 ; WX 234 ; N uni1DA8 ; G 2024 -U 7593 ; WX 250 ; N uni1DA9 ; G 2025 -U 7594 ; WX 235 ; N uni1DAA ; G 2026 -U 7595 ; WX 376 ; N uni1DAB ; G 2027 -U 7596 ; WX 623 ; N uni1DAC ; G 2028 -U 7597 ; WX 623 ; N uni1DAD ; G 2029 -U 7598 ; WX 411 ; N uni1DAE ; G 2030 -U 7599 ; WX 479 ; N uni1DAF ; G 2031 -U 7600 ; WX 409 ; N uni1DB0 ; G 2032 -U 7601 ; WX 414 ; N uni1DB1 ; G 2033 -U 7602 ; WX 414 ; N uni1DB2 ; G 2034 -U 7603 ; WX 360 ; N uni1DB3 ; G 2035 -U 7604 ; WX 287 ; N uni1DB4 ; G 2036 -U 7605 ; WX 295 ; N uni1DB5 ; G 2037 -U 7606 ; WX 508 ; N uni1DB6 ; G 2038 -U 7607 ; WX 418 ; N uni1DB7 ; G 2039 -U 7608 ; WX 361 ; N uni1DB8 ; G 2040 -U 7609 ; WX 406 ; N uni1DB9 ; G 2041 -U 7610 ; WX 417 ; N uni1DBA ; G 2042 -U 7611 ; WX 366 ; N uni1DBB ; G 2043 -U 7612 ; WX 437 ; N uni1DBC ; G 2044 -U 7613 ; WX 366 ; N uni1DBD ; G 2045 -U 7614 ; WX 392 ; N uni1DBE ; G 2046 -U 7615 ; WX 414 ; N uni1DBF ; G 2047 -U 7620 ; WX 0 ; N uni1DC4 ; G 2048 -U 7621 ; WX 0 ; N uni1DC5 ; G 2049 -U 7622 ; WX 0 ; N uni1DC6 ; G 2050 -U 7623 ; WX 0 ; N uni1DC7 ; G 2051 -U 7624 ; WX 0 ; N uni1DC8 ; G 2052 -U 7625 ; WX 0 ; N uni1DC9 ; G 2053 -U 7680 ; WX 684 ; N uni1E00 ; G 2054 -U 7681 ; WX 613 ; N uni1E01 ; G 2055 -U 7682 ; WX 686 ; N uni1E02 ; G 2056 -U 7683 ; WX 635 ; N uni1E03 ; G 2057 -U 7684 ; WX 686 ; N uni1E04 ; G 2058 -U 7685 ; WX 635 ; N uni1E05 ; G 2059 -U 7686 ; WX 686 ; N uni1E06 ; G 2060 -U 7687 ; WX 635 ; N uni1E07 ; G 2061 -U 7688 ; WX 698 ; N uni1E08 ; G 2062 -U 7689 ; WX 550 ; N uni1E09 ; G 2063 -U 7690 ; WX 770 ; N uni1E0A ; G 2064 -U 7691 ; WX 635 ; N uni1E0B ; G 2065 -U 7692 ; WX 770 ; N uni1E0C ; G 2066 -U 7693 ; WX 635 ; N uni1E0D ; G 2067 -U 7694 ; WX 770 ; N uni1E0E ; G 2068 -U 7695 ; WX 635 ; N uni1E0F ; G 2069 -U 7696 ; WX 770 ; N uni1E10 ; G 2070 -U 7697 ; WX 635 ; N uni1E11 ; G 2071 -U 7698 ; WX 770 ; N uni1E12 ; G 2072 -U 7699 ; WX 635 ; N uni1E13 ; G 2073 -U 7700 ; WX 632 ; N uni1E14 ; G 2074 -U 7701 ; WX 615 ; N uni1E15 ; G 2075 -U 7702 ; WX 632 ; N uni1E16 ; G 2076 -U 7703 ; WX 615 ; N uni1E17 ; G 2077 -U 7704 ; WX 632 ; N uni1E18 ; G 2078 -U 7705 ; WX 615 ; N uni1E19 ; G 2079 -U 7706 ; WX 632 ; N uni1E1A ; G 2080 -U 7707 ; WX 615 ; N uni1E1B ; G 2081 -U 7708 ; WX 632 ; N uni1E1C ; G 2082 -U 7709 ; WX 615 ; N uni1E1D ; G 2083 -U 7710 ; WX 575 ; N uni1E1E ; G 2084 -U 7711 ; WX 352 ; N uni1E1F ; G 2085 -U 7712 ; WX 775 ; N uni1E20 ; G 2086 -U 7713 ; WX 635 ; N uni1E21 ; G 2087 -U 7714 ; WX 752 ; N uni1E22 ; G 2088 -U 7715 ; WX 634 ; N uni1E23 ; G 2089 -U 7716 ; WX 752 ; N uni1E24 ; G 2090 -U 7717 ; WX 634 ; N uni1E25 ; G 2091 -U 7718 ; WX 752 ; N uni1E26 ; G 2092 -U 7719 ; WX 634 ; N uni1E27 ; G 2093 -U 7720 ; WX 752 ; N uni1E28 ; G 2094 -U 7721 ; WX 634 ; N uni1E29 ; G 2095 -U 7722 ; WX 752 ; N uni1E2A ; G 2096 -U 7723 ; WX 634 ; N uni1E2B ; G 2097 -U 7724 ; WX 295 ; N uni1E2C ; G 2098 -U 7725 ; WX 278 ; N uni1E2D ; G 2099 -U 7726 ; WX 295 ; N uni1E2E ; G 2100 -U 7727 ; WX 278 ; N uni1E2F ; G 2101 -U 7728 ; WX 656 ; N uni1E30 ; G 2102 -U 7729 ; WX 579 ; N uni1E31 ; G 2103 -U 7730 ; WX 656 ; N uni1E32 ; G 2104 -U 7731 ; WX 579 ; N uni1E33 ; G 2105 -U 7732 ; WX 656 ; N uni1E34 ; G 2106 -U 7733 ; WX 579 ; N uni1E35 ; G 2107 -U 7734 ; WX 557 ; N uni1E36 ; G 2108 -U 7735 ; WX 278 ; N uni1E37 ; G 2109 -U 7736 ; WX 557 ; N uni1E38 ; G 2110 -U 7737 ; WX 278 ; N uni1E39 ; G 2111 -U 7738 ; WX 557 ; N uni1E3A ; G 2112 -U 7739 ; WX 278 ; N uni1E3B ; G 2113 -U 7740 ; WX 557 ; N uni1E3C ; G 2114 -U 7741 ; WX 278 ; N uni1E3D ; G 2115 -U 7742 ; WX 863 ; N uni1E3E ; G 2116 -U 7743 ; WX 974 ; N uni1E3F ; G 2117 -U 7744 ; WX 863 ; N uni1E40 ; G 2118 -U 7745 ; WX 974 ; N uni1E41 ; G 2119 -U 7746 ; WX 863 ; N uni1E42 ; G 2120 -U 7747 ; WX 974 ; N uni1E43 ; G 2121 -U 7748 ; WX 748 ; N uni1E44 ; G 2122 -U 7749 ; WX 634 ; N uni1E45 ; G 2123 -U 7750 ; WX 748 ; N uni1E46 ; G 2124 -U 7751 ; WX 634 ; N uni1E47 ; G 2125 -U 7752 ; WX 748 ; N uni1E48 ; G 2126 -U 7753 ; WX 634 ; N uni1E49 ; G 2127 -U 7754 ; WX 748 ; N uni1E4A ; G 2128 -U 7755 ; WX 634 ; N uni1E4B ; G 2129 -U 7756 ; WX 787 ; N uni1E4C ; G 2130 -U 7757 ; WX 612 ; N uni1E4D ; G 2131 -U 7758 ; WX 787 ; N uni1E4E ; G 2132 -U 7759 ; WX 612 ; N uni1E4F ; G 2133 -U 7760 ; WX 787 ; N uni1E50 ; G 2134 -U 7761 ; WX 612 ; N uni1E51 ; G 2135 -U 7762 ; WX 787 ; N uni1E52 ; G 2136 -U 7763 ; WX 612 ; N uni1E53 ; G 2137 -U 7764 ; WX 603 ; N uni1E54 ; G 2138 -U 7765 ; WX 635 ; N uni1E55 ; G 2139 -U 7766 ; WX 603 ; N uni1E56 ; G 2140 -U 7767 ; WX 635 ; N uni1E57 ; G 2141 -U 7768 ; WX 695 ; N uni1E58 ; G 2142 -U 7769 ; WX 411 ; N uni1E59 ; G 2143 -U 7770 ; WX 695 ; N uni1E5A ; G 2144 -U 7771 ; WX 411 ; N uni1E5B ; G 2145 -U 7772 ; WX 695 ; N uni1E5C ; G 2146 -U 7773 ; WX 411 ; N uni1E5D ; G 2147 -U 7774 ; WX 695 ; N uni1E5E ; G 2148 -U 7775 ; WX 411 ; N uni1E5F ; G 2149 -U 7776 ; WX 635 ; N uni1E60 ; G 2150 -U 7777 ; WX 521 ; N uni1E61 ; G 2151 -U 7778 ; WX 635 ; N uni1E62 ; G 2152 -U 7779 ; WX 521 ; N uni1E63 ; G 2153 -U 7780 ; WX 635 ; N uni1E64 ; G 2154 -U 7781 ; WX 521 ; N uni1E65 ; G 2155 -U 7782 ; WX 635 ; N uni1E66 ; G 2156 -U 7783 ; WX 521 ; N uni1E67 ; G 2157 -U 7784 ; WX 635 ; N uni1E68 ; G 2158 -U 7785 ; WX 521 ; N uni1E69 ; G 2159 -U 7786 ; WX 611 ; N uni1E6A ; G 2160 -U 7787 ; WX 392 ; N uni1E6B ; G 2161 -U 7788 ; WX 611 ; N uni1E6C ; G 2162 -U 7789 ; WX 392 ; N uni1E6D ; G 2163 -U 7790 ; WX 611 ; N uni1E6E ; G 2164 -U 7791 ; WX 392 ; N uni1E6F ; G 2165 -U 7792 ; WX 611 ; N uni1E70 ; G 2166 -U 7793 ; WX 392 ; N uni1E71 ; G 2167 -U 7794 ; WX 732 ; N uni1E72 ; G 2168 -U 7795 ; WX 634 ; N uni1E73 ; G 2169 -U 7796 ; WX 732 ; N uni1E74 ; G 2170 -U 7797 ; WX 634 ; N uni1E75 ; G 2171 -U 7798 ; WX 732 ; N uni1E76 ; G 2172 -U 7799 ; WX 634 ; N uni1E77 ; G 2173 -U 7800 ; WX 732 ; N uni1E78 ; G 2174 -U 7801 ; WX 634 ; N uni1E79 ; G 2175 -U 7802 ; WX 732 ; N uni1E7A ; G 2176 -U 7803 ; WX 634 ; N uni1E7B ; G 2177 -U 7804 ; WX 684 ; N uni1E7C ; G 2178 -U 7805 ; WX 592 ; N uni1E7D ; G 2179 -U 7806 ; WX 684 ; N uni1E7E ; G 2180 -U 7807 ; WX 592 ; N uni1E7F ; G 2181 -U 7808 ; WX 989 ; N Wgrave ; G 2182 -U 7809 ; WX 818 ; N wgrave ; G 2183 -U 7810 ; WX 989 ; N Wacute ; G 2184 -U 7811 ; WX 818 ; N wacute ; G 2185 -U 7812 ; WX 989 ; N Wdieresis ; G 2186 -U 7813 ; WX 818 ; N wdieresis ; G 2187 -U 7814 ; WX 989 ; N uni1E86 ; G 2188 -U 7815 ; WX 818 ; N uni1E87 ; G 2189 -U 7816 ; WX 989 ; N uni1E88 ; G 2190 -U 7817 ; WX 818 ; N uni1E89 ; G 2191 -U 7818 ; WX 685 ; N uni1E8A ; G 2192 -U 7819 ; WX 592 ; N uni1E8B ; G 2193 -U 7820 ; WX 685 ; N uni1E8C ; G 2194 -U 7821 ; WX 592 ; N uni1E8D ; G 2195 -U 7822 ; WX 611 ; N uni1E8E ; G 2196 -U 7823 ; WX 592 ; N uni1E8F ; G 2197 -U 7824 ; WX 685 ; N uni1E90 ; G 2198 -U 7825 ; WX 525 ; N uni1E91 ; G 2199 -U 7826 ; WX 685 ; N uni1E92 ; G 2200 -U 7827 ; WX 525 ; N uni1E93 ; G 2201 -U 7828 ; WX 685 ; N uni1E94 ; G 2202 -U 7829 ; WX 525 ; N uni1E95 ; G 2203 -U 7830 ; WX 634 ; N uni1E96 ; G 2204 -U 7831 ; WX 392 ; N uni1E97 ; G 2205 -U 7832 ; WX 818 ; N uni1E98 ; G 2206 -U 7833 ; WX 592 ; N uni1E99 ; G 2207 -U 7834 ; WX 613 ; N uni1E9A ; G 2208 -U 7835 ; WX 352 ; N uni1E9B ; G 2209 -U 7836 ; WX 352 ; N uni1E9C ; G 2210 -U 7837 ; WX 352 ; N uni1E9D ; G 2211 -U 7838 ; WX 769 ; N uni1E9E ; G 2212 -U 7839 ; WX 612 ; N uni1E9F ; G 2213 -U 7840 ; WX 684 ; N uni1EA0 ; G 2214 -U 7841 ; WX 613 ; N uni1EA1 ; G 2215 -U 7842 ; WX 684 ; N uni1EA2 ; G 2216 -U 7843 ; WX 613 ; N uni1EA3 ; G 2217 -U 7844 ; WX 684 ; N uni1EA4 ; G 2218 -U 7845 ; WX 613 ; N uni1EA5 ; G 2219 -U 7846 ; WX 684 ; N uni1EA6 ; G 2220 -U 7847 ; WX 613 ; N uni1EA7 ; G 2221 -U 7848 ; WX 684 ; N uni1EA8 ; G 2222 -U 7849 ; WX 613 ; N uni1EA9 ; G 2223 -U 7850 ; WX 684 ; N uni1EAA ; G 2224 -U 7851 ; WX 613 ; N uni1EAB ; G 2225 -U 7852 ; WX 684 ; N uni1EAC ; G 2226 -U 7853 ; WX 613 ; N uni1EAD ; G 2227 -U 7854 ; WX 684 ; N uni1EAE ; G 2228 -U 7855 ; WX 613 ; N uni1EAF ; G 2229 -U 7856 ; WX 684 ; N uni1EB0 ; G 2230 -U 7857 ; WX 613 ; N uni1EB1 ; G 2231 -U 7858 ; WX 684 ; N uni1EB2 ; G 2232 -U 7859 ; WX 613 ; N uni1EB3 ; G 2233 -U 7860 ; WX 684 ; N uni1EB4 ; G 2234 -U 7861 ; WX 613 ; N uni1EB5 ; G 2235 -U 7862 ; WX 684 ; N uni1EB6 ; G 2236 -U 7863 ; WX 613 ; N uni1EB7 ; G 2237 -U 7864 ; WX 632 ; N uni1EB8 ; G 2238 -U 7865 ; WX 615 ; N uni1EB9 ; G 2239 -U 7866 ; WX 632 ; N uni1EBA ; G 2240 -U 7867 ; WX 615 ; N uni1EBB ; G 2241 -U 7868 ; WX 632 ; N uni1EBC ; G 2242 -U 7869 ; WX 615 ; N uni1EBD ; G 2243 -U 7870 ; WX 632 ; N uni1EBE ; G 2244 -U 7871 ; WX 615 ; N uni1EBF ; G 2245 -U 7872 ; WX 632 ; N uni1EC0 ; G 2246 -U 7873 ; WX 615 ; N uni1EC1 ; G 2247 -U 7874 ; WX 632 ; N uni1EC2 ; G 2248 -U 7875 ; WX 615 ; N uni1EC3 ; G 2249 -U 7876 ; WX 632 ; N uni1EC4 ; G 2250 -U 7877 ; WX 615 ; N uni1EC5 ; G 2251 -U 7878 ; WX 632 ; N uni1EC6 ; G 2252 -U 7879 ; WX 615 ; N uni1EC7 ; G 2253 -U 7880 ; WX 295 ; N uni1EC8 ; G 2254 -U 7881 ; WX 278 ; N uni1EC9 ; G 2255 -U 7882 ; WX 295 ; N uni1ECA ; G 2256 -U 7883 ; WX 278 ; N uni1ECB ; G 2257 -U 7884 ; WX 787 ; N uni1ECC ; G 2258 -U 7885 ; WX 612 ; N uni1ECD ; G 2259 -U 7886 ; WX 787 ; N uni1ECE ; G 2260 -U 7887 ; WX 612 ; N uni1ECF ; G 2261 -U 7888 ; WX 787 ; N uni1ED0 ; G 2262 -U 7889 ; WX 612 ; N uni1ED1 ; G 2263 -U 7890 ; WX 787 ; N uni1ED2 ; G 2264 -U 7891 ; WX 612 ; N uni1ED3 ; G 2265 -U 7892 ; WX 787 ; N uni1ED4 ; G 2266 -U 7893 ; WX 612 ; N uni1ED5 ; G 2267 -U 7894 ; WX 787 ; N uni1ED6 ; G 2268 -U 7895 ; WX 612 ; N uni1ED7 ; G 2269 -U 7896 ; WX 787 ; N uni1ED8 ; G 2270 -U 7897 ; WX 612 ; N uni1ED9 ; G 2271 -U 7898 ; WX 913 ; N uni1EDA ; G 2272 -U 7899 ; WX 612 ; N uni1EDB ; G 2273 -U 7900 ; WX 913 ; N uni1EDC ; G 2274 -U 7901 ; WX 612 ; N uni1EDD ; G 2275 -U 7902 ; WX 913 ; N uni1EDE ; G 2276 -U 7903 ; WX 612 ; N uni1EDF ; G 2277 -U 7904 ; WX 913 ; N uni1EE0 ; G 2278 -U 7905 ; WX 612 ; N uni1EE1 ; G 2279 -U 7906 ; WX 913 ; N uni1EE2 ; G 2280 -U 7907 ; WX 612 ; N uni1EE3 ; G 2281 -U 7908 ; WX 732 ; N uni1EE4 ; G 2282 -U 7909 ; WX 634 ; N uni1EE5 ; G 2283 -U 7910 ; WX 732 ; N uni1EE6 ; G 2284 -U 7911 ; WX 634 ; N uni1EE7 ; G 2285 -U 7912 ; WX 838 ; N uni1EE8 ; G 2286 -U 7913 ; WX 634 ; N uni1EE9 ; G 2287 -U 7914 ; WX 838 ; N uni1EEA ; G 2288 -U 7915 ; WX 634 ; N uni1EEB ; G 2289 -U 7916 ; WX 838 ; N uni1EEC ; G 2290 -U 7917 ; WX 634 ; N uni1EED ; G 2291 -U 7918 ; WX 838 ; N uni1EEE ; G 2292 -U 7919 ; WX 634 ; N uni1EEF ; G 2293 -U 7920 ; WX 838 ; N uni1EF0 ; G 2294 -U 7921 ; WX 634 ; N uni1EF1 ; G 2295 -U 7922 ; WX 611 ; N Ygrave ; G 2296 -U 7923 ; WX 592 ; N ygrave ; G 2297 -U 7924 ; WX 611 ; N uni1EF4 ; G 2298 -U 7925 ; WX 592 ; N uni1EF5 ; G 2299 -U 7926 ; WX 611 ; N uni1EF6 ; G 2300 -U 7927 ; WX 592 ; N uni1EF7 ; G 2301 -U 7928 ; WX 611 ; N uni1EF8 ; G 2302 -U 7929 ; WX 592 ; N uni1EF9 ; G 2303 -U 7930 ; WX 769 ; N uni1EFA ; G 2304 -U 7931 ; WX 477 ; N uni1EFB ; G 2305 -U 7936 ; WX 659 ; N uni1F00 ; G 2306 -U 7937 ; WX 659 ; N uni1F01 ; G 2307 -U 7938 ; WX 659 ; N uni1F02 ; G 2308 -U 7939 ; WX 659 ; N uni1F03 ; G 2309 -U 7940 ; WX 659 ; N uni1F04 ; G 2310 -U 7941 ; WX 659 ; N uni1F05 ; G 2311 -U 7942 ; WX 659 ; N uni1F06 ; G 2312 -U 7943 ; WX 659 ; N uni1F07 ; G 2313 -U 7944 ; WX 684 ; N uni1F08 ; G 2314 -U 7945 ; WX 684 ; N uni1F09 ; G 2315 -U 7946 ; WX 877 ; N uni1F0A ; G 2316 -U 7947 ; WX 877 ; N uni1F0B ; G 2317 -U 7948 ; WX 769 ; N uni1F0C ; G 2318 -U 7949 ; WX 801 ; N uni1F0D ; G 2319 -U 7950 ; WX 708 ; N uni1F0E ; G 2320 -U 7951 ; WX 743 ; N uni1F0F ; G 2321 -U 7952 ; WX 541 ; N uni1F10 ; G 2322 -U 7953 ; WX 541 ; N uni1F11 ; G 2323 -U 7954 ; WX 541 ; N uni1F12 ; G 2324 -U 7955 ; WX 541 ; N uni1F13 ; G 2325 -U 7956 ; WX 541 ; N uni1F14 ; G 2326 -U 7957 ; WX 541 ; N uni1F15 ; G 2327 -U 7960 ; WX 711 ; N uni1F18 ; G 2328 -U 7961 ; WX 711 ; N uni1F19 ; G 2329 -U 7962 ; WX 966 ; N uni1F1A ; G 2330 -U 7963 ; WX 975 ; N uni1F1B ; G 2331 -U 7964 ; WX 898 ; N uni1F1C ; G 2332 -U 7965 ; WX 928 ; N uni1F1D ; G 2333 -U 7968 ; WX 634 ; N uni1F20 ; G 2334 -U 7969 ; WX 634 ; N uni1F21 ; G 2335 -U 7970 ; WX 634 ; N uni1F22 ; G 2336 -U 7971 ; WX 634 ; N uni1F23 ; G 2337 -U 7972 ; WX 634 ; N uni1F24 ; G 2338 -U 7973 ; WX 634 ; N uni1F25 ; G 2339 -U 7974 ; WX 634 ; N uni1F26 ; G 2340 -U 7975 ; WX 634 ; N uni1F27 ; G 2341 -U 7976 ; WX 837 ; N uni1F28 ; G 2342 -U 7977 ; WX 835 ; N uni1F29 ; G 2343 -U 7978 ; WX 1086 ; N uni1F2A ; G 2344 -U 7979 ; WX 1089 ; N uni1F2B ; G 2345 -U 7980 ; WX 1027 ; N uni1F2C ; G 2346 -U 7981 ; WX 1051 ; N uni1F2D ; G 2347 -U 7982 ; WX 934 ; N uni1F2E ; G 2348 -U 7983 ; WX 947 ; N uni1F2F ; G 2349 -U 7984 ; WX 338 ; N uni1F30 ; G 2350 -U 7985 ; WX 338 ; N uni1F31 ; G 2351 -U 7986 ; WX 338 ; N uni1F32 ; G 2352 -U 7987 ; WX 338 ; N uni1F33 ; G 2353 -U 7988 ; WX 338 ; N uni1F34 ; G 2354 -U 7989 ; WX 338 ; N uni1F35 ; G 2355 -U 7990 ; WX 338 ; N uni1F36 ; G 2356 -U 7991 ; WX 338 ; N uni1F37 ; G 2357 -U 7992 ; WX 380 ; N uni1F38 ; G 2358 -U 7993 ; WX 374 ; N uni1F39 ; G 2359 -U 7994 ; WX 635 ; N uni1F3A ; G 2360 -U 7995 ; WX 635 ; N uni1F3B ; G 2361 -U 7996 ; WX 570 ; N uni1F3C ; G 2362 -U 7997 ; WX 600 ; N uni1F3D ; G 2363 -U 7998 ; WX 489 ; N uni1F3E ; G 2364 -U 7999 ; WX 493 ; N uni1F3F ; G 2365 -U 8000 ; WX 612 ; N uni1F40 ; G 2366 -U 8001 ; WX 612 ; N uni1F41 ; G 2367 -U 8002 ; WX 612 ; N uni1F42 ; G 2368 -U 8003 ; WX 612 ; N uni1F43 ; G 2369 -U 8004 ; WX 612 ; N uni1F44 ; G 2370 -U 8005 ; WX 612 ; N uni1F45 ; G 2371 -U 8008 ; WX 804 ; N uni1F48 ; G 2372 -U 8009 ; WX 848 ; N uni1F49 ; G 2373 -U 8010 ; WX 1095 ; N uni1F4A ; G 2374 -U 8011 ; WX 1100 ; N uni1F4B ; G 2375 -U 8012 ; WX 938 ; N uni1F4C ; G 2376 -U 8013 ; WX 970 ; N uni1F4D ; G 2377 -U 8016 ; WX 579 ; N uni1F50 ; G 2378 -U 8017 ; WX 579 ; N uni1F51 ; G 2379 -U 8018 ; WX 579 ; N uni1F52 ; G 2380 -U 8019 ; WX 579 ; N uni1F53 ; G 2381 -U 8020 ; WX 579 ; N uni1F54 ; G 2382 -U 8021 ; WX 579 ; N uni1F55 ; G 2383 -U 8022 ; WX 579 ; N uni1F56 ; G 2384 -U 8023 ; WX 579 ; N uni1F57 ; G 2385 -U 8025 ; WX 784 ; N uni1F59 ; G 2386 -U 8027 ; WX 998 ; N uni1F5B ; G 2387 -U 8029 ; WX 1012 ; N uni1F5D ; G 2388 -U 8031 ; WX 897 ; N uni1F5F ; G 2389 -U 8032 ; WX 837 ; N uni1F60 ; G 2390 -U 8033 ; WX 837 ; N uni1F61 ; G 2391 -U 8034 ; WX 837 ; N uni1F62 ; G 2392 -U 8035 ; WX 837 ; N uni1F63 ; G 2393 -U 8036 ; WX 837 ; N uni1F64 ; G 2394 -U 8037 ; WX 837 ; N uni1F65 ; G 2395 -U 8038 ; WX 837 ; N uni1F66 ; G 2396 -U 8039 ; WX 837 ; N uni1F67 ; G 2397 -U 8040 ; WX 802 ; N uni1F68 ; G 2398 -U 8041 ; WX 843 ; N uni1F69 ; G 2399 -U 8042 ; WX 1089 ; N uni1F6A ; G 2400 -U 8043 ; WX 1095 ; N uni1F6B ; G 2401 -U 8044 ; WX 946 ; N uni1F6C ; G 2402 -U 8045 ; WX 972 ; N uni1F6D ; G 2403 -U 8046 ; WX 921 ; N uni1F6E ; G 2404 -U 8047 ; WX 952 ; N uni1F6F ; G 2405 -U 8048 ; WX 659 ; N uni1F70 ; G 2406 -U 8049 ; WX 659 ; N uni1F71 ; G 2407 -U 8050 ; WX 541 ; N uni1F72 ; G 2408 -U 8051 ; WX 548 ; N uni1F73 ; G 2409 -U 8052 ; WX 634 ; N uni1F74 ; G 2410 -U 8053 ; WX 654 ; N uni1F75 ; G 2411 -U 8054 ; WX 338 ; N uni1F76 ; G 2412 -U 8055 ; WX 338 ; N uni1F77 ; G 2413 -U 8056 ; WX 612 ; N uni1F78 ; G 2414 -U 8057 ; WX 612 ; N uni1F79 ; G 2415 -U 8058 ; WX 579 ; N uni1F7A ; G 2416 -U 8059 ; WX 579 ; N uni1F7B ; G 2417 -U 8060 ; WX 837 ; N uni1F7C ; G 2418 -U 8061 ; WX 837 ; N uni1F7D ; G 2419 -U 8064 ; WX 659 ; N uni1F80 ; G 2420 -U 8065 ; WX 659 ; N uni1F81 ; G 2421 -U 8066 ; WX 659 ; N uni1F82 ; G 2422 -U 8067 ; WX 659 ; N uni1F83 ; G 2423 -U 8068 ; WX 659 ; N uni1F84 ; G 2424 -U 8069 ; WX 659 ; N uni1F85 ; G 2425 -U 8070 ; WX 659 ; N uni1F86 ; G 2426 -U 8071 ; WX 659 ; N uni1F87 ; G 2427 -U 8072 ; WX 684 ; N uni1F88 ; G 2428 -U 8073 ; WX 684 ; N uni1F89 ; G 2429 -U 8074 ; WX 877 ; N uni1F8A ; G 2430 -U 8075 ; WX 877 ; N uni1F8B ; G 2431 -U 8076 ; WX 769 ; N uni1F8C ; G 2432 -U 8077 ; WX 801 ; N uni1F8D ; G 2433 -U 8078 ; WX 708 ; N uni1F8E ; G 2434 -U 8079 ; WX 743 ; N uni1F8F ; G 2435 -U 8080 ; WX 634 ; N uni1F90 ; G 2436 -U 8081 ; WX 634 ; N uni1F91 ; G 2437 -U 8082 ; WX 634 ; N uni1F92 ; G 2438 -U 8083 ; WX 634 ; N uni1F93 ; G 2439 -U 8084 ; WX 634 ; N uni1F94 ; G 2440 -U 8085 ; WX 634 ; N uni1F95 ; G 2441 -U 8086 ; WX 634 ; N uni1F96 ; G 2442 -U 8087 ; WX 634 ; N uni1F97 ; G 2443 -U 8088 ; WX 837 ; N uni1F98 ; G 2444 -U 8089 ; WX 835 ; N uni1F99 ; G 2445 -U 8090 ; WX 1086 ; N uni1F9A ; G 2446 -U 8091 ; WX 1089 ; N uni1F9B ; G 2447 -U 8092 ; WX 1027 ; N uni1F9C ; G 2448 -U 8093 ; WX 1051 ; N uni1F9D ; G 2449 -U 8094 ; WX 934 ; N uni1F9E ; G 2450 -U 8095 ; WX 947 ; N uni1F9F ; G 2451 -U 8096 ; WX 837 ; N uni1FA0 ; G 2452 -U 8097 ; WX 837 ; N uni1FA1 ; G 2453 -U 8098 ; WX 837 ; N uni1FA2 ; G 2454 -U 8099 ; WX 837 ; N uni1FA3 ; G 2455 -U 8100 ; WX 837 ; N uni1FA4 ; G 2456 -U 8101 ; WX 837 ; N uni1FA5 ; G 2457 -U 8102 ; WX 837 ; N uni1FA6 ; G 2458 -U 8103 ; WX 837 ; N uni1FA7 ; G 2459 -U 8104 ; WX 802 ; N uni1FA8 ; G 2460 -U 8105 ; WX 843 ; N uni1FA9 ; G 2461 -U 8106 ; WX 1089 ; N uni1FAA ; G 2462 -U 8107 ; WX 1095 ; N uni1FAB ; G 2463 -U 8108 ; WX 946 ; N uni1FAC ; G 2464 -U 8109 ; WX 972 ; N uni1FAD ; G 2465 -U 8110 ; WX 921 ; N uni1FAE ; G 2466 -U 8111 ; WX 952 ; N uni1FAF ; G 2467 -U 8112 ; WX 659 ; N uni1FB0 ; G 2468 -U 8113 ; WX 659 ; N uni1FB1 ; G 2469 -U 8114 ; WX 659 ; N uni1FB2 ; G 2470 -U 8115 ; WX 659 ; N uni1FB3 ; G 2471 -U 8116 ; WX 659 ; N uni1FB4 ; G 2472 -U 8118 ; WX 659 ; N uni1FB6 ; G 2473 -U 8119 ; WX 659 ; N uni1FB7 ; G 2474 -U 8120 ; WX 684 ; N uni1FB8 ; G 2475 -U 8121 ; WX 684 ; N uni1FB9 ; G 2476 -U 8122 ; WX 716 ; N uni1FBA ; G 2477 -U 8123 ; WX 692 ; N uni1FBB ; G 2478 -U 8124 ; WX 684 ; N uni1FBC ; G 2479 -U 8125 ; WX 500 ; N uni1FBD ; G 2480 -U 8126 ; WX 500 ; N uni1FBE ; G 2481 -U 8127 ; WX 500 ; N uni1FBF ; G 2482 -U 8128 ; WX 500 ; N uni1FC0 ; G 2483 -U 8129 ; WX 500 ; N uni1FC1 ; G 2484 -U 8130 ; WX 634 ; N uni1FC2 ; G 2485 -U 8131 ; WX 634 ; N uni1FC3 ; G 2486 -U 8132 ; WX 654 ; N uni1FC4 ; G 2487 -U 8134 ; WX 634 ; N uni1FC6 ; G 2488 -U 8135 ; WX 634 ; N uni1FC7 ; G 2489 -U 8136 ; WX 805 ; N uni1FC8 ; G 2490 -U 8137 ; WX 746 ; N uni1FC9 ; G 2491 -U 8138 ; WX 931 ; N uni1FCA ; G 2492 -U 8139 ; WX 871 ; N uni1FCB ; G 2493 -U 8140 ; WX 752 ; N uni1FCC ; G 2494 -U 8141 ; WX 500 ; N uni1FCD ; G 2495 -U 8142 ; WX 500 ; N uni1FCE ; G 2496 -U 8143 ; WX 500 ; N uni1FCF ; G 2497 -U 8144 ; WX 338 ; N uni1FD0 ; G 2498 -U 8145 ; WX 338 ; N uni1FD1 ; G 2499 -U 8146 ; WX 338 ; N uni1FD2 ; G 2500 -U 8147 ; WX 338 ; N uni1FD3 ; G 2501 -U 8150 ; WX 338 ; N uni1FD6 ; G 2502 -U 8151 ; WX 338 ; N uni1FD7 ; G 2503 -U 8152 ; WX 295 ; N uni1FD8 ; G 2504 -U 8153 ; WX 295 ; N uni1FD9 ; G 2505 -U 8154 ; WX 475 ; N uni1FDA ; G 2506 -U 8155 ; WX 408 ; N uni1FDB ; G 2507 -U 8157 ; WX 500 ; N uni1FDD ; G 2508 -U 8158 ; WX 500 ; N uni1FDE ; G 2509 -U 8159 ; WX 500 ; N uni1FDF ; G 2510 -U 8160 ; WX 579 ; N uni1FE0 ; G 2511 -U 8161 ; WX 579 ; N uni1FE1 ; G 2512 -U 8162 ; WX 579 ; N uni1FE2 ; G 2513 -U 8163 ; WX 579 ; N uni1FE3 ; G 2514 -U 8164 ; WX 635 ; N uni1FE4 ; G 2515 -U 8165 ; WX 635 ; N uni1FE5 ; G 2516 -U 8166 ; WX 579 ; N uni1FE6 ; G 2517 -U 8167 ; WX 579 ; N uni1FE7 ; G 2518 -U 8168 ; WX 611 ; N uni1FE8 ; G 2519 -U 8169 ; WX 611 ; N uni1FE9 ; G 2520 -U 8170 ; WX 845 ; N uni1FEA ; G 2521 -U 8171 ; WX 825 ; N uni1FEB ; G 2522 -U 8172 ; WX 685 ; N uni1FEC ; G 2523 -U 8173 ; WX 500 ; N uni1FED ; G 2524 -U 8174 ; WX 500 ; N uni1FEE ; G 2525 -U 8175 ; WX 500 ; N uni1FEF ; G 2526 -U 8178 ; WX 837 ; N uni1FF2 ; G 2527 -U 8179 ; WX 837 ; N uni1FF3 ; G 2528 -U 8180 ; WX 837 ; N uni1FF4 ; G 2529 -U 8182 ; WX 837 ; N uni1FF6 ; G 2530 -U 8183 ; WX 837 ; N uni1FF7 ; G 2531 -U 8184 ; WX 941 ; N uni1FF8 ; G 2532 -U 8185 ; WX 813 ; N uni1FF9 ; G 2533 -U 8186 ; WX 922 ; N uni1FFA ; G 2534 -U 8187 ; WX 826 ; N uni1FFB ; G 2535 -U 8188 ; WX 764 ; N uni1FFC ; G 2536 -U 8189 ; WX 500 ; N uni1FFD ; G 2537 -U 8190 ; WX 500 ; N uni1FFE ; G 2538 -U 8192 ; WX 500 ; N uni2000 ; G 2539 -U 8193 ; WX 1000 ; N uni2001 ; G 2540 -U 8194 ; WX 500 ; N uni2002 ; G 2541 -U 8195 ; WX 1000 ; N uni2003 ; G 2542 -U 8196 ; WX 330 ; N uni2004 ; G 2543 -U 8197 ; WX 250 ; N uni2005 ; G 2544 -U 8198 ; WX 167 ; N uni2006 ; G 2545 -U 8199 ; WX 636 ; N uni2007 ; G 2546 -U 8200 ; WX 318 ; N uni2008 ; G 2547 -U 8201 ; WX 200 ; N uni2009 ; G 2548 -U 8202 ; WX 100 ; N uni200A ; G 2549 -U 8203 ; WX 0 ; N uni200B ; G 2550 -U 8204 ; WX 0 ; N uni200C ; G 2551 -U 8205 ; WX 0 ; N uni200D ; G 2552 -U 8206 ; WX 0 ; N uni200E ; G 2553 -U 8207 ; WX 0 ; N uni200F ; G 2554 -U 8208 ; WX 361 ; N uni2010 ; G 2555 -U 8209 ; WX 361 ; N uni2011 ; G 2556 -U 8210 ; WX 636 ; N figuredash ; G 2557 -U 8211 ; WX 500 ; N endash ; G 2558 -U 8212 ; WX 1000 ; N emdash ; G 2559 -U 8213 ; WX 1000 ; N uni2015 ; G 2560 -U 8214 ; WX 500 ; N uni2016 ; G 2561 -U 8215 ; WX 500 ; N underscoredbl ; G 2562 -U 8216 ; WX 318 ; N quoteleft ; G 2563 -U 8217 ; WX 318 ; N quoteright ; G 2564 -U 8218 ; WX 318 ; N quotesinglbase ; G 2565 -U 8219 ; WX 318 ; N quotereversed ; G 2566 -U 8220 ; WX 518 ; N quotedblleft ; G 2567 -U 8221 ; WX 518 ; N quotedblright ; G 2568 -U 8222 ; WX 518 ; N quotedblbase ; G 2569 -U 8223 ; WX 518 ; N uni201F ; G 2570 -U 8224 ; WX 500 ; N dagger ; G 2571 -U 8225 ; WX 500 ; N daggerdbl ; G 2572 -U 8226 ; WX 590 ; N bullet ; G 2573 -U 8227 ; WX 590 ; N uni2023 ; G 2574 -U 8228 ; WX 333 ; N onedotenleader ; G 2575 -U 8229 ; WX 667 ; N twodotenleader ; G 2576 -U 8230 ; WX 1000 ; N ellipsis ; G 2577 -U 8231 ; WX 318 ; N uni2027 ; G 2578 -U 8232 ; WX 0 ; N uni2028 ; G 2579 -U 8233 ; WX 0 ; N uni2029 ; G 2580 -U 8234 ; WX 0 ; N uni202A ; G 2581 -U 8235 ; WX 0 ; N uni202B ; G 2582 -U 8236 ; WX 0 ; N uni202C ; G 2583 -U 8237 ; WX 0 ; N uni202D ; G 2584 -U 8238 ; WX 0 ; N uni202E ; G 2585 -U 8239 ; WX 200 ; N uni202F ; G 2586 -U 8240 ; WX 1350 ; N perthousand ; G 2587 -U 8241 ; WX 1690 ; N uni2031 ; G 2588 -U 8242 ; WX 227 ; N minute ; G 2589 -U 8243 ; WX 374 ; N second ; G 2590 -U 8244 ; WX 520 ; N uni2034 ; G 2591 -U 8245 ; WX 227 ; N uni2035 ; G 2592 -U 8246 ; WX 374 ; N uni2036 ; G 2593 -U 8247 ; WX 520 ; N uni2037 ; G 2594 -U 8248 ; WX 339 ; N uni2038 ; G 2595 -U 8249 ; WX 400 ; N guilsinglleft ; G 2596 -U 8250 ; WX 400 ; N guilsinglright ; G 2597 -U 8251 ; WX 838 ; N uni203B ; G 2598 -U 8252 ; WX 485 ; N exclamdbl ; G 2599 -U 8253 ; WX 531 ; N uni203D ; G 2600 -U 8254 ; WX 500 ; N uni203E ; G 2601 -U 8255 ; WX 804 ; N uni203F ; G 2602 -U 8256 ; WX 804 ; N uni2040 ; G 2603 -U 8257 ; WX 250 ; N uni2041 ; G 2604 -U 8258 ; WX 1000 ; N uni2042 ; G 2605 -U 8259 ; WX 500 ; N uni2043 ; G 2606 -U 8260 ; WX 167 ; N fraction ; G 2607 -U 8261 ; WX 390 ; N uni2045 ; G 2608 -U 8262 ; WX 390 ; N uni2046 ; G 2609 -U 8263 ; WX 922 ; N uni2047 ; G 2610 -U 8264 ; WX 733 ; N uni2048 ; G 2611 -U 8265 ; WX 733 ; N uni2049 ; G 2612 -U 8266 ; WX 497 ; N uni204A ; G 2613 -U 8267 ; WX 636 ; N uni204B ; G 2614 -U 8268 ; WX 500 ; N uni204C ; G 2615 -U 8269 ; WX 500 ; N uni204D ; G 2616 -U 8270 ; WX 500 ; N uni204E ; G 2617 -U 8271 ; WX 337 ; N uni204F ; G 2618 -U 8272 ; WX 804 ; N uni2050 ; G 2619 -U 8273 ; WX 500 ; N uni2051 ; G 2620 -U 8274 ; WX 450 ; N uni2052 ; G 2621 -U 8275 ; WX 1000 ; N uni2053 ; G 2622 -U 8276 ; WX 804 ; N uni2054 ; G 2623 -U 8277 ; WX 838 ; N uni2055 ; G 2624 -U 8278 ; WX 586 ; N uni2056 ; G 2625 -U 8279 ; WX 663 ; N uni2057 ; G 2626 -U 8280 ; WX 838 ; N uni2058 ; G 2627 -U 8281 ; WX 838 ; N uni2059 ; G 2628 -U 8282 ; WX 318 ; N uni205A ; G 2629 -U 8283 ; WX 797 ; N uni205B ; G 2630 -U 8284 ; WX 838 ; N uni205C ; G 2631 -U 8285 ; WX 318 ; N uni205D ; G 2632 -U 8286 ; WX 318 ; N uni205E ; G 2633 -U 8287 ; WX 222 ; N uni205F ; G 2634 -U 8288 ; WX 0 ; N uni2060 ; G 2635 -U 8289 ; WX 0 ; N uni2061 ; G 2636 -U 8290 ; WX 0 ; N uni2062 ; G 2637 -U 8291 ; WX 0 ; N uni2063 ; G 2638 -U 8292 ; WX 0 ; N uni2064 ; G 2639 -U 8298 ; WX 0 ; N uni206A ; G 2640 -U 8299 ; WX 0 ; N uni206B ; G 2641 -U 8300 ; WX 0 ; N uni206C ; G 2642 -U 8301 ; WX 0 ; N uni206D ; G 2643 -U 8302 ; WX 0 ; N uni206E ; G 2644 -U 8303 ; WX 0 ; N uni206F ; G 2645 -U 8304 ; WX 401 ; N uni2070 ; G 2646 -U 8305 ; WX 179 ; N uni2071 ; G 2647 -U 8308 ; WX 401 ; N uni2074 ; G 2648 -U 8309 ; WX 401 ; N uni2075 ; G 2649 -U 8310 ; WX 401 ; N uni2076 ; G 2650 -U 8311 ; WX 401 ; N uni2077 ; G 2651 -U 8312 ; WX 401 ; N uni2078 ; G 2652 -U 8313 ; WX 401 ; N uni2079 ; G 2653 -U 8314 ; WX 528 ; N uni207A ; G 2654 -U 8315 ; WX 528 ; N uni207B ; G 2655 -U 8316 ; WX 528 ; N uni207C ; G 2656 -U 8317 ; WX 246 ; N uni207D ; G 2657 -U 8318 ; WX 246 ; N uni207E ; G 2658 -U 8319 ; WX 399 ; N uni207F ; G 2659 -U 8320 ; WX 401 ; N uni2080 ; G 2660 -U 8321 ; WX 401 ; N uni2081 ; G 2661 -U 8322 ; WX 401 ; N uni2082 ; G 2662 -U 8323 ; WX 401 ; N uni2083 ; G 2663 -U 8324 ; WX 401 ; N uni2084 ; G 2664 -U 8325 ; WX 401 ; N uni2085 ; G 2665 -U 8326 ; WX 401 ; N uni2086 ; G 2666 -U 8327 ; WX 401 ; N uni2087 ; G 2667 -U 8328 ; WX 401 ; N uni2088 ; G 2668 -U 8329 ; WX 401 ; N uni2089 ; G 2669 -U 8330 ; WX 528 ; N uni208A ; G 2670 -U 8331 ; WX 528 ; N uni208B ; G 2671 -U 8332 ; WX 528 ; N uni208C ; G 2672 -U 8333 ; WX 246 ; N uni208D ; G 2673 -U 8334 ; WX 246 ; N uni208E ; G 2674 -U 8336 ; WX 392 ; N uni2090 ; G 2675 -U 8337 ; WX 417 ; N uni2091 ; G 2676 -U 8338 ; WX 414 ; N uni2092 ; G 2677 -U 8339 ; WX 444 ; N uni2093 ; G 2678 -U 8340 ; WX 417 ; N uni2094 ; G 2679 -U 8341 ; WX 399 ; N uni2095 ; G 2680 -U 8342 ; WX 426 ; N uni2096 ; G 2681 -U 8343 ; WX 166 ; N uni2097 ; G 2682 -U 8344 ; WX 623 ; N uni2098 ; G 2683 -U 8345 ; WX 399 ; N uni2099 ; G 2684 -U 8346 ; WX 428 ; N uni209A ; G 2685 -U 8347 ; WX 373 ; N uni209B ; G 2686 -U 8348 ; WX 295 ; N uni209C ; G 2687 -U 8352 ; WX 877 ; N uni20A0 ; G 2688 -U 8353 ; WX 636 ; N colonmonetary ; G 2689 -U 8354 ; WX 636 ; N uni20A2 ; G 2690 -U 8355 ; WX 636 ; N franc ; G 2691 -U 8356 ; WX 636 ; N lira ; G 2692 -U 8357 ; WX 974 ; N uni20A5 ; G 2693 -U 8358 ; WX 636 ; N uni20A6 ; G 2694 -U 8359 ; WX 1271 ; N peseta ; G 2695 -U 8360 ; WX 1074 ; N uni20A8 ; G 2696 -U 8361 ; WX 989 ; N uni20A9 ; G 2697 -U 8362 ; WX 838 ; N uni20AA ; G 2698 -U 8363 ; WX 636 ; N dong ; G 2699 -U 8364 ; WX 636 ; N Euro ; G 2700 -U 8365 ; WX 636 ; N uni20AD ; G 2701 -U 8366 ; WX 636 ; N uni20AE ; G 2702 -U 8367 ; WX 1272 ; N uni20AF ; G 2703 -U 8368 ; WX 636 ; N uni20B0 ; G 2704 -U 8369 ; WX 636 ; N uni20B1 ; G 2705 -U 8370 ; WX 636 ; N uni20B2 ; G 2706 -U 8371 ; WX 636 ; N uni20B3 ; G 2707 -U 8372 ; WX 774 ; N uni20B4 ; G 2708 -U 8373 ; WX 636 ; N uni20B5 ; G 2709 -U 8376 ; WX 636 ; N uni20B8 ; G 2710 -U 8377 ; WX 636 ; N uni20B9 ; G 2711 -U 8378 ; WX 636 ; N uni20BA ; G 2712 -U 8381 ; WX 636 ; N uni20BD ; G 2713 -U 8400 ; WX 0 ; N uni20D0 ; G 2714 -U 8401 ; WX 0 ; N uni20D1 ; G 2715 -U 8406 ; WX 0 ; N uni20D6 ; G 2716 -U 8407 ; WX 0 ; N uni20D7 ; G 2717 -U 8411 ; WX 0 ; N uni20DB ; G 2718 -U 8412 ; WX 0 ; N uni20DC ; G 2719 -U 8417 ; WX 0 ; N uni20E1 ; G 2720 -U 8448 ; WX 970 ; N uni2100 ; G 2721 -U 8449 ; WX 970 ; N uni2101 ; G 2722 -U 8450 ; WX 698 ; N uni2102 ; G 2723 -U 8451 ; WX 1123 ; N uni2103 ; G 2724 -U 8452 ; WX 896 ; N uni2104 ; G 2725 -U 8453 ; WX 969 ; N uni2105 ; G 2726 -U 8454 ; WX 1032 ; N uni2106 ; G 2727 -U 8455 ; WX 614 ; N uni2107 ; G 2728 -U 8456 ; WX 698 ; N uni2108 ; G 2729 -U 8457 ; WX 952 ; N uni2109 ; G 2730 -U 8459 ; WX 988 ; N uni210B ; G 2731 -U 8460 ; WX 754 ; N uni210C ; G 2732 -U 8461 ; WX 850 ; N uni210D ; G 2733 -U 8462 ; WX 634 ; N uni210E ; G 2734 -U 8463 ; WX 634 ; N uni210F ; G 2735 -U 8464 ; WX 470 ; N uni2110 ; G 2736 -U 8465 ; WX 697 ; N Ifraktur ; G 2737 -U 8466 ; WX 720 ; N uni2112 ; G 2738 -U 8467 ; WX 413 ; N uni2113 ; G 2739 -U 8468 ; WX 818 ; N uni2114 ; G 2740 -U 8469 ; WX 801 ; N uni2115 ; G 2741 -U 8470 ; WX 1040 ; N uni2116 ; G 2742 -U 8471 ; WX 1000 ; N uni2117 ; G 2743 -U 8472 ; WX 697 ; N weierstrass ; G 2744 -U 8473 ; WX 701 ; N uni2119 ; G 2745 -U 8474 ; WX 787 ; N uni211A ; G 2746 -U 8475 ; WX 798 ; N uni211B ; G 2747 -U 8476 ; WX 814 ; N Rfraktur ; G 2748 -U 8477 ; WX 792 ; N uni211D ; G 2749 -U 8478 ; WX 896 ; N prescription ; G 2750 -U 8479 ; WX 684 ; N uni211F ; G 2751 -U 8480 ; WX 1020 ; N uni2120 ; G 2752 -U 8481 ; WX 1014 ; N uni2121 ; G 2753 -U 8482 ; WX 1000 ; N trademark ; G 2754 -U 8483 ; WX 684 ; N uni2123 ; G 2755 -U 8484 ; WX 745 ; N uni2124 ; G 2756 -U 8485 ; WX 578 ; N uni2125 ; G 2757 -U 8486 ; WX 764 ; N uni2126 ; G 2758 -U 8487 ; WX 764 ; N uni2127 ; G 2759 -U 8488 ; WX 616 ; N uni2128 ; G 2760 -U 8489 ; WX 338 ; N uni2129 ; G 2761 -U 8490 ; WX 656 ; N uni212A ; G 2762 -U 8491 ; WX 684 ; N uni212B ; G 2763 -U 8492 ; WX 786 ; N uni212C ; G 2764 -U 8493 ; WX 703 ; N uni212D ; G 2765 -U 8494 ; WX 854 ; N estimated ; G 2766 -U 8495 ; WX 592 ; N uni212F ; G 2767 -U 8496 ; WX 605 ; N uni2130 ; G 2768 -U 8497 ; WX 786 ; N uni2131 ; G 2769 -U 8498 ; WX 575 ; N uni2132 ; G 2770 -U 8499 ; WX 1069 ; N uni2133 ; G 2771 -U 8500 ; WX 462 ; N uni2134 ; G 2772 -U 8501 ; WX 745 ; N aleph ; G 2773 -U 8502 ; WX 674 ; N uni2136 ; G 2774 -U 8503 ; WX 466 ; N uni2137 ; G 2775 -U 8504 ; WX 645 ; N uni2138 ; G 2776 -U 8505 ; WX 380 ; N uni2139 ; G 2777 -U 8506 ; WX 926 ; N uni213A ; G 2778 -U 8507 ; WX 1157 ; N uni213B ; G 2779 -U 8508 ; WX 702 ; N uni213C ; G 2780 -U 8509 ; WX 728 ; N uni213D ; G 2781 -U 8510 ; WX 654 ; N uni213E ; G 2782 -U 8511 ; WX 849 ; N uni213F ; G 2783 -U 8512 ; WX 811 ; N uni2140 ; G 2784 -U 8513 ; WX 775 ; N uni2141 ; G 2785 -U 8514 ; WX 557 ; N uni2142 ; G 2786 -U 8515 ; WX 557 ; N uni2143 ; G 2787 -U 8516 ; WX 611 ; N uni2144 ; G 2788 -U 8517 ; WX 819 ; N uni2145 ; G 2789 -U 8518 ; WX 708 ; N uni2146 ; G 2790 -U 8519 ; WX 615 ; N uni2147 ; G 2791 -U 8520 ; WX 351 ; N uni2148 ; G 2792 -U 8521 ; WX 351 ; N uni2149 ; G 2793 -U 8523 ; WX 780 ; N uni214B ; G 2794 -U 8526 ; WX 526 ; N uni214E ; G 2795 -U 8528 ; WX 969 ; N uni2150 ; G 2796 -U 8529 ; WX 969 ; N uni2151 ; G 2797 -U 8530 ; WX 1370 ; N uni2152 ; G 2798 -U 8531 ; WX 969 ; N onethird ; G 2799 -U 8532 ; WX 969 ; N twothirds ; G 2800 -U 8533 ; WX 969 ; N uni2155 ; G 2801 -U 8534 ; WX 969 ; N uni2156 ; G 2802 -U 8535 ; WX 969 ; N uni2157 ; G 2803 -U 8536 ; WX 969 ; N uni2158 ; G 2804 -U 8537 ; WX 969 ; N uni2159 ; G 2805 -U 8538 ; WX 969 ; N uni215A ; G 2806 -U 8539 ; WX 969 ; N oneeighth ; G 2807 -U 8540 ; WX 969 ; N threeeighths ; G 2808 -U 8541 ; WX 969 ; N fiveeighths ; G 2809 -U 8542 ; WX 969 ; N seveneighths ; G 2810 -U 8543 ; WX 568 ; N uni215F ; G 2811 -U 8544 ; WX 295 ; N uni2160 ; G 2812 -U 8545 ; WX 492 ; N uni2161 ; G 2813 -U 8546 ; WX 689 ; N uni2162 ; G 2814 -U 8547 ; WX 923 ; N uni2163 ; G 2815 -U 8548 ; WX 684 ; N uni2164 ; G 2816 -U 8549 ; WX 922 ; N uni2165 ; G 2817 -U 8550 ; WX 1120 ; N uni2166 ; G 2818 -U 8551 ; WX 1317 ; N uni2167 ; G 2819 -U 8552 ; WX 917 ; N uni2168 ; G 2820 -U 8553 ; WX 685 ; N uni2169 ; G 2821 -U 8554 ; WX 933 ; N uni216A ; G 2822 -U 8555 ; WX 1131 ; N uni216B ; G 2823 -U 8556 ; WX 557 ; N uni216C ; G 2824 -U 8557 ; WX 698 ; N uni216D ; G 2825 -U 8558 ; WX 770 ; N uni216E ; G 2826 -U 8559 ; WX 863 ; N uni216F ; G 2827 -U 8560 ; WX 278 ; N uni2170 ; G 2828 -U 8561 ; WX 458 ; N uni2171 ; G 2829 -U 8562 ; WX 637 ; N uni2172 ; G 2830 -U 8563 ; WX 812 ; N uni2173 ; G 2831 -U 8564 ; WX 592 ; N uni2174 ; G 2832 -U 8565 ; WX 811 ; N uni2175 ; G 2833 -U 8566 ; WX 991 ; N uni2176 ; G 2834 -U 8567 ; WX 1170 ; N uni2177 ; G 2835 -U 8568 ; WX 819 ; N uni2178 ; G 2836 -U 8569 ; WX 592 ; N uni2179 ; G 2837 -U 8570 ; WX 822 ; N uni217A ; G 2838 -U 8571 ; WX 1002 ; N uni217B ; G 2839 -U 8572 ; WX 278 ; N uni217C ; G 2840 -U 8573 ; WX 550 ; N uni217D ; G 2841 -U 8574 ; WX 635 ; N uni217E ; G 2842 -U 8575 ; WX 974 ; N uni217F ; G 2843 -U 8576 ; WX 1245 ; N uni2180 ; G 2844 -U 8577 ; WX 770 ; N uni2181 ; G 2845 -U 8578 ; WX 1245 ; N uni2182 ; G 2846 -U 8579 ; WX 703 ; N uni2183 ; G 2847 -U 8580 ; WX 549 ; N uni2184 ; G 2848 -U 8581 ; WX 698 ; N uni2185 ; G 2849 -U 8585 ; WX 969 ; N uni2189 ; G 2850 -U 8592 ; WX 838 ; N arrowleft ; G 2851 -U 8593 ; WX 838 ; N arrowup ; G 2852 -U 8594 ; WX 838 ; N arrowright ; G 2853 -U 8595 ; WX 838 ; N arrowdown ; G 2854 -U 8596 ; WX 838 ; N arrowboth ; G 2855 -U 8597 ; WX 838 ; N arrowupdn ; G 2856 -U 8598 ; WX 838 ; N uni2196 ; G 2857 -U 8599 ; WX 838 ; N uni2197 ; G 2858 -U 8600 ; WX 838 ; N uni2198 ; G 2859 -U 8601 ; WX 838 ; N uni2199 ; G 2860 -U 8602 ; WX 838 ; N uni219A ; G 2861 -U 8603 ; WX 838 ; N uni219B ; G 2862 -U 8604 ; WX 838 ; N uni219C ; G 2863 -U 8605 ; WX 838 ; N uni219D ; G 2864 -U 8606 ; WX 838 ; N uni219E ; G 2865 -U 8607 ; WX 838 ; N uni219F ; G 2866 -U 8608 ; WX 838 ; N uni21A0 ; G 2867 -U 8609 ; WX 838 ; N uni21A1 ; G 2868 -U 8610 ; WX 838 ; N uni21A2 ; G 2869 -U 8611 ; WX 838 ; N uni21A3 ; G 2870 -U 8612 ; WX 838 ; N uni21A4 ; G 2871 -U 8613 ; WX 838 ; N uni21A5 ; G 2872 -U 8614 ; WX 838 ; N uni21A6 ; G 2873 -U 8615 ; WX 838 ; N uni21A7 ; G 2874 -U 8616 ; WX 838 ; N arrowupdnbse ; G 2875 -U 8617 ; WX 838 ; N uni21A9 ; G 2876 -U 8618 ; WX 838 ; N uni21AA ; G 2877 -U 8619 ; WX 838 ; N uni21AB ; G 2878 -U 8620 ; WX 838 ; N uni21AC ; G 2879 -U 8621 ; WX 838 ; N uni21AD ; G 2880 -U 8622 ; WX 838 ; N uni21AE ; G 2881 -U 8623 ; WX 838 ; N uni21AF ; G 2882 -U 8624 ; WX 838 ; N uni21B0 ; G 2883 -U 8625 ; WX 838 ; N uni21B1 ; G 2884 -U 8626 ; WX 838 ; N uni21B2 ; G 2885 -U 8627 ; WX 838 ; N uni21B3 ; G 2886 -U 8628 ; WX 838 ; N uni21B4 ; G 2887 -U 8629 ; WX 838 ; N carriagereturn ; G 2888 -U 8630 ; WX 838 ; N uni21B6 ; G 2889 -U 8631 ; WX 838 ; N uni21B7 ; G 2890 -U 8632 ; WX 838 ; N uni21B8 ; G 2891 -U 8633 ; WX 838 ; N uni21B9 ; G 2892 -U 8634 ; WX 838 ; N uni21BA ; G 2893 -U 8635 ; WX 838 ; N uni21BB ; G 2894 -U 8636 ; WX 838 ; N uni21BC ; G 2895 -U 8637 ; WX 838 ; N uni21BD ; G 2896 -U 8638 ; WX 838 ; N uni21BE ; G 2897 -U 8639 ; WX 838 ; N uni21BF ; G 2898 -U 8640 ; WX 838 ; N uni21C0 ; G 2899 -U 8641 ; WX 838 ; N uni21C1 ; G 2900 -U 8642 ; WX 838 ; N uni21C2 ; G 2901 -U 8643 ; WX 838 ; N uni21C3 ; G 2902 -U 8644 ; WX 838 ; N uni21C4 ; G 2903 -U 8645 ; WX 838 ; N uni21C5 ; G 2904 -U 8646 ; WX 838 ; N uni21C6 ; G 2905 -U 8647 ; WX 838 ; N uni21C7 ; G 2906 -U 8648 ; WX 838 ; N uni21C8 ; G 2907 -U 8649 ; WX 838 ; N uni21C9 ; G 2908 -U 8650 ; WX 838 ; N uni21CA ; G 2909 -U 8651 ; WX 838 ; N uni21CB ; G 2910 -U 8652 ; WX 838 ; N uni21CC ; G 2911 -U 8653 ; WX 838 ; N uni21CD ; G 2912 -U 8654 ; WX 838 ; N uni21CE ; G 2913 -U 8655 ; WX 838 ; N uni21CF ; G 2914 -U 8656 ; WX 838 ; N arrowdblleft ; G 2915 -U 8657 ; WX 838 ; N arrowdblup ; G 2916 -U 8658 ; WX 838 ; N arrowdblright ; G 2917 -U 8659 ; WX 838 ; N arrowdbldown ; G 2918 -U 8660 ; WX 838 ; N arrowdblboth ; G 2919 -U 8661 ; WX 838 ; N uni21D5 ; G 2920 -U 8662 ; WX 838 ; N uni21D6 ; G 2921 -U 8663 ; WX 838 ; N uni21D7 ; G 2922 -U 8664 ; WX 838 ; N uni21D8 ; G 2923 -U 8665 ; WX 838 ; N uni21D9 ; G 2924 -U 8666 ; WX 838 ; N uni21DA ; G 2925 -U 8667 ; WX 838 ; N uni21DB ; G 2926 -U 8668 ; WX 838 ; N uni21DC ; G 2927 -U 8669 ; WX 838 ; N uni21DD ; G 2928 -U 8670 ; WX 838 ; N uni21DE ; G 2929 -U 8671 ; WX 838 ; N uni21DF ; G 2930 -U 8672 ; WX 838 ; N uni21E0 ; G 2931 -U 8673 ; WX 838 ; N uni21E1 ; G 2932 -U 8674 ; WX 838 ; N uni21E2 ; G 2933 -U 8675 ; WX 838 ; N uni21E3 ; G 2934 -U 8676 ; WX 838 ; N uni21E4 ; G 2935 -U 8677 ; WX 838 ; N uni21E5 ; G 2936 -U 8678 ; WX 838 ; N uni21E6 ; G 2937 -U 8679 ; WX 838 ; N uni21E7 ; G 2938 -U 8680 ; WX 838 ; N uni21E8 ; G 2939 -U 8681 ; WX 838 ; N uni21E9 ; G 2940 -U 8682 ; WX 838 ; N uni21EA ; G 2941 -U 8683 ; WX 838 ; N uni21EB ; G 2942 -U 8684 ; WX 838 ; N uni21EC ; G 2943 -U 8685 ; WX 838 ; N uni21ED ; G 2944 -U 8686 ; WX 838 ; N uni21EE ; G 2945 -U 8687 ; WX 838 ; N uni21EF ; G 2946 -U 8688 ; WX 838 ; N uni21F0 ; G 2947 -U 8689 ; WX 838 ; N uni21F1 ; G 2948 -U 8690 ; WX 838 ; N uni21F2 ; G 2949 -U 8691 ; WX 838 ; N uni21F3 ; G 2950 -U 8692 ; WX 838 ; N uni21F4 ; G 2951 -U 8693 ; WX 838 ; N uni21F5 ; G 2952 -U 8694 ; WX 838 ; N uni21F6 ; G 2953 -U 8695 ; WX 838 ; N uni21F7 ; G 2954 -U 8696 ; WX 838 ; N uni21F8 ; G 2955 -U 8697 ; WX 838 ; N uni21F9 ; G 2956 -U 8698 ; WX 838 ; N uni21FA ; G 2957 -U 8699 ; WX 838 ; N uni21FB ; G 2958 -U 8700 ; WX 838 ; N uni21FC ; G 2959 -U 8701 ; WX 838 ; N uni21FD ; G 2960 -U 8702 ; WX 838 ; N uni21FE ; G 2961 -U 8703 ; WX 838 ; N uni21FF ; G 2962 -U 8704 ; WX 684 ; N universal ; G 2963 -U 8705 ; WX 636 ; N uni2201 ; G 2964 -U 8706 ; WX 517 ; N partialdiff ; G 2965 -U 8707 ; WX 632 ; N existential ; G 2966 -U 8708 ; WX 632 ; N uni2204 ; G 2967 -U 8709 ; WX 871 ; N emptyset ; G 2968 -U 8710 ; WX 669 ; N increment ; G 2969 -U 8711 ; WX 669 ; N gradient ; G 2970 -U 8712 ; WX 871 ; N element ; G 2971 -U 8713 ; WX 871 ; N notelement ; G 2972 -U 8714 ; WX 718 ; N uni220A ; G 2973 -U 8715 ; WX 871 ; N suchthat ; G 2974 -U 8716 ; WX 871 ; N uni220C ; G 2975 -U 8717 ; WX 718 ; N uni220D ; G 2976 -U 8718 ; WX 636 ; N uni220E ; G 2977 -U 8719 ; WX 757 ; N product ; G 2978 -U 8720 ; WX 757 ; N uni2210 ; G 2979 -U 8721 ; WX 674 ; N summation ; G 2980 -U 8722 ; WX 838 ; N minus ; G 2981 -U 8723 ; WX 838 ; N uni2213 ; G 2982 -U 8724 ; WX 838 ; N uni2214 ; G 2983 -U 8725 ; WX 337 ; N uni2215 ; G 2984 -U 8726 ; WX 637 ; N uni2216 ; G 2985 -U 8727 ; WX 838 ; N asteriskmath ; G 2986 -U 8728 ; WX 626 ; N uni2218 ; G 2987 -U 8729 ; WX 626 ; N uni2219 ; G 2988 -U 8730 ; WX 637 ; N radical ; G 2989 -U 8731 ; WX 637 ; N uni221B ; G 2990 -U 8732 ; WX 637 ; N uni221C ; G 2991 -U 8733 ; WX 714 ; N proportional ; G 2992 -U 8734 ; WX 833 ; N infinity ; G 2993 -U 8735 ; WX 838 ; N orthogonal ; G 2994 -U 8736 ; WX 896 ; N angle ; G 2995 -U 8737 ; WX 896 ; N uni2221 ; G 2996 -U 8738 ; WX 838 ; N uni2222 ; G 2997 -U 8739 ; WX 500 ; N uni2223 ; G 2998 -U 8740 ; WX 500 ; N uni2224 ; G 2999 -U 8741 ; WX 500 ; N uni2225 ; G 3000 -U 8742 ; WX 500 ; N uni2226 ; G 3001 -U 8743 ; WX 732 ; N logicaland ; G 3002 -U 8744 ; WX 732 ; N logicalor ; G 3003 -U 8745 ; WX 732 ; N intersection ; G 3004 -U 8746 ; WX 732 ; N union ; G 3005 -U 8747 ; WX 521 ; N integral ; G 3006 -U 8748 ; WX 789 ; N uni222C ; G 3007 -U 8749 ; WX 1057 ; N uni222D ; G 3008 -U 8750 ; WX 521 ; N uni222E ; G 3009 -U 8751 ; WX 789 ; N uni222F ; G 3010 -U 8752 ; WX 1057 ; N uni2230 ; G 3011 -U 8753 ; WX 521 ; N uni2231 ; G 3012 -U 8754 ; WX 521 ; N uni2232 ; G 3013 -U 8755 ; WX 521 ; N uni2233 ; G 3014 -U 8756 ; WX 636 ; N therefore ; G 3015 -U 8757 ; WX 636 ; N uni2235 ; G 3016 -U 8758 ; WX 260 ; N uni2236 ; G 3017 -U 8759 ; WX 636 ; N uni2237 ; G 3018 -U 8760 ; WX 838 ; N uni2238 ; G 3019 -U 8761 ; WX 838 ; N uni2239 ; G 3020 -U 8762 ; WX 838 ; N uni223A ; G 3021 -U 8763 ; WX 838 ; N uni223B ; G 3022 -U 8764 ; WX 838 ; N similar ; G 3023 -U 8765 ; WX 838 ; N uni223D ; G 3024 -U 8766 ; WX 838 ; N uni223E ; G 3025 -U 8767 ; WX 838 ; N uni223F ; G 3026 -U 8768 ; WX 375 ; N uni2240 ; G 3027 -U 8769 ; WX 838 ; N uni2241 ; G 3028 -U 8770 ; WX 838 ; N uni2242 ; G 3029 -U 8771 ; WX 838 ; N uni2243 ; G 3030 -U 8772 ; WX 838 ; N uni2244 ; G 3031 -U 8773 ; WX 838 ; N congruent ; G 3032 -U 8774 ; WX 838 ; N uni2246 ; G 3033 -U 8775 ; WX 838 ; N uni2247 ; G 3034 -U 8776 ; WX 838 ; N approxequal ; G 3035 -U 8777 ; WX 838 ; N uni2249 ; G 3036 -U 8778 ; WX 838 ; N uni224A ; G 3037 -U 8779 ; WX 838 ; N uni224B ; G 3038 -U 8780 ; WX 838 ; N uni224C ; G 3039 -U 8781 ; WX 838 ; N uni224D ; G 3040 -U 8782 ; WX 838 ; N uni224E ; G 3041 -U 8783 ; WX 838 ; N uni224F ; G 3042 -U 8784 ; WX 838 ; N uni2250 ; G 3043 -U 8785 ; WX 838 ; N uni2251 ; G 3044 -U 8786 ; WX 838 ; N uni2252 ; G 3045 -U 8787 ; WX 838 ; N uni2253 ; G 3046 -U 8788 ; WX 1000 ; N uni2254 ; G 3047 -U 8789 ; WX 1000 ; N uni2255 ; G 3048 -U 8790 ; WX 838 ; N uni2256 ; G 3049 -U 8791 ; WX 838 ; N uni2257 ; G 3050 -U 8792 ; WX 838 ; N uni2258 ; G 3051 -U 8793 ; WX 838 ; N uni2259 ; G 3052 -U 8794 ; WX 838 ; N uni225A ; G 3053 -U 8795 ; WX 838 ; N uni225B ; G 3054 -U 8796 ; WX 838 ; N uni225C ; G 3055 -U 8797 ; WX 838 ; N uni225D ; G 3056 -U 8798 ; WX 838 ; N uni225E ; G 3057 -U 8799 ; WX 838 ; N uni225F ; G 3058 -U 8800 ; WX 838 ; N notequal ; G 3059 -U 8801 ; WX 838 ; N equivalence ; G 3060 -U 8802 ; WX 838 ; N uni2262 ; G 3061 -U 8803 ; WX 838 ; N uni2263 ; G 3062 -U 8804 ; WX 838 ; N lessequal ; G 3063 -U 8805 ; WX 838 ; N greaterequal ; G 3064 -U 8806 ; WX 838 ; N uni2266 ; G 3065 -U 8807 ; WX 838 ; N uni2267 ; G 3066 -U 8808 ; WX 838 ; N uni2268 ; G 3067 -U 8809 ; WX 838 ; N uni2269 ; G 3068 -U 8810 ; WX 1047 ; N uni226A ; G 3069 -U 8811 ; WX 1047 ; N uni226B ; G 3070 -U 8812 ; WX 464 ; N uni226C ; G 3071 -U 8813 ; WX 838 ; N uni226D ; G 3072 -U 8814 ; WX 838 ; N uni226E ; G 3073 -U 8815 ; WX 838 ; N uni226F ; G 3074 -U 8816 ; WX 838 ; N uni2270 ; G 3075 -U 8817 ; WX 838 ; N uni2271 ; G 3076 -U 8818 ; WX 838 ; N uni2272 ; G 3077 -U 8819 ; WX 838 ; N uni2273 ; G 3078 -U 8820 ; WX 838 ; N uni2274 ; G 3079 -U 8821 ; WX 838 ; N uni2275 ; G 3080 -U 8822 ; WX 838 ; N uni2276 ; G 3081 -U 8823 ; WX 838 ; N uni2277 ; G 3082 -U 8824 ; WX 838 ; N uni2278 ; G 3083 -U 8825 ; WX 838 ; N uni2279 ; G 3084 -U 8826 ; WX 838 ; N uni227A ; G 3085 -U 8827 ; WX 838 ; N uni227B ; G 3086 -U 8828 ; WX 838 ; N uni227C ; G 3087 -U 8829 ; WX 838 ; N uni227D ; G 3088 -U 8830 ; WX 838 ; N uni227E ; G 3089 -U 8831 ; WX 838 ; N uni227F ; G 3090 -U 8832 ; WX 838 ; N uni2280 ; G 3091 -U 8833 ; WX 838 ; N uni2281 ; G 3092 -U 8834 ; WX 838 ; N propersubset ; G 3093 -U 8835 ; WX 838 ; N propersuperset ; G 3094 -U 8836 ; WX 838 ; N notsubset ; G 3095 -U 8837 ; WX 838 ; N uni2285 ; G 3096 -U 8838 ; WX 838 ; N reflexsubset ; G 3097 -U 8839 ; WX 838 ; N reflexsuperset ; G 3098 -U 8840 ; WX 838 ; N uni2288 ; G 3099 -U 8841 ; WX 838 ; N uni2289 ; G 3100 -U 8842 ; WX 838 ; N uni228A ; G 3101 -U 8843 ; WX 838 ; N uni228B ; G 3102 -U 8844 ; WX 732 ; N uni228C ; G 3103 -U 8845 ; WX 732 ; N uni228D ; G 3104 -U 8846 ; WX 732 ; N uni228E ; G 3105 -U 8847 ; WX 838 ; N uni228F ; G 3106 -U 8848 ; WX 838 ; N uni2290 ; G 3107 -U 8849 ; WX 838 ; N uni2291 ; G 3108 -U 8850 ; WX 838 ; N uni2292 ; G 3109 -U 8851 ; WX 780 ; N uni2293 ; G 3110 -U 8852 ; WX 780 ; N uni2294 ; G 3111 -U 8853 ; WX 838 ; N circleplus ; G 3112 -U 8854 ; WX 838 ; N uni2296 ; G 3113 -U 8855 ; WX 838 ; N circlemultiply ; G 3114 -U 8856 ; WX 838 ; N uni2298 ; G 3115 -U 8857 ; WX 838 ; N uni2299 ; G 3116 -U 8858 ; WX 838 ; N uni229A ; G 3117 -U 8859 ; WX 838 ; N uni229B ; G 3118 -U 8860 ; WX 838 ; N uni229C ; G 3119 -U 8861 ; WX 838 ; N uni229D ; G 3120 -U 8862 ; WX 838 ; N uni229E ; G 3121 -U 8863 ; WX 838 ; N uni229F ; G 3122 -U 8864 ; WX 838 ; N uni22A0 ; G 3123 -U 8865 ; WX 838 ; N uni22A1 ; G 3124 -U 8866 ; WX 871 ; N uni22A2 ; G 3125 -U 8867 ; WX 871 ; N uni22A3 ; G 3126 -U 8868 ; WX 871 ; N uni22A4 ; G 3127 -U 8869 ; WX 871 ; N perpendicular ; G 3128 -U 8870 ; WX 521 ; N uni22A6 ; G 3129 -U 8871 ; WX 521 ; N uni22A7 ; G 3130 -U 8872 ; WX 871 ; N uni22A8 ; G 3131 -U 8873 ; WX 871 ; N uni22A9 ; G 3132 -U 8874 ; WX 871 ; N uni22AA ; G 3133 -U 8875 ; WX 871 ; N uni22AB ; G 3134 -U 8876 ; WX 871 ; N uni22AC ; G 3135 -U 8877 ; WX 871 ; N uni22AD ; G 3136 -U 8878 ; WX 871 ; N uni22AE ; G 3137 -U 8879 ; WX 871 ; N uni22AF ; G 3138 -U 8880 ; WX 838 ; N uni22B0 ; G 3139 -U 8881 ; WX 838 ; N uni22B1 ; G 3140 -U 8882 ; WX 838 ; N uni22B2 ; G 3141 -U 8883 ; WX 838 ; N uni22B3 ; G 3142 -U 8884 ; WX 838 ; N uni22B4 ; G 3143 -U 8885 ; WX 838 ; N uni22B5 ; G 3144 -U 8886 ; WX 1000 ; N uni22B6 ; G 3145 -U 8887 ; WX 1000 ; N uni22B7 ; G 3146 -U 8888 ; WX 838 ; N uni22B8 ; G 3147 -U 8889 ; WX 838 ; N uni22B9 ; G 3148 -U 8890 ; WX 521 ; N uni22BA ; G 3149 -U 8891 ; WX 732 ; N uni22BB ; G 3150 -U 8892 ; WX 732 ; N uni22BC ; G 3151 -U 8893 ; WX 732 ; N uni22BD ; G 3152 -U 8894 ; WX 838 ; N uni22BE ; G 3153 -U 8895 ; WX 838 ; N uni22BF ; G 3154 -U 8896 ; WX 820 ; N uni22C0 ; G 3155 -U 8897 ; WX 820 ; N uni22C1 ; G 3156 -U 8898 ; WX 820 ; N uni22C2 ; G 3157 -U 8899 ; WX 820 ; N uni22C3 ; G 3158 -U 8900 ; WX 626 ; N uni22C4 ; G 3159 -U 8901 ; WX 318 ; N dotmath ; G 3160 -U 8902 ; WX 626 ; N uni22C6 ; G 3161 -U 8903 ; WX 838 ; N uni22C7 ; G 3162 -U 8904 ; WX 1000 ; N uni22C8 ; G 3163 -U 8905 ; WX 1000 ; N uni22C9 ; G 3164 -U 8906 ; WX 1000 ; N uni22CA ; G 3165 -U 8907 ; WX 1000 ; N uni22CB ; G 3166 -U 8908 ; WX 1000 ; N uni22CC ; G 3167 -U 8909 ; WX 838 ; N uni22CD ; G 3168 -U 8910 ; WX 732 ; N uni22CE ; G 3169 -U 8911 ; WX 732 ; N uni22CF ; G 3170 -U 8912 ; WX 838 ; N uni22D0 ; G 3171 -U 8913 ; WX 838 ; N uni22D1 ; G 3172 -U 8914 ; WX 838 ; N uni22D2 ; G 3173 -U 8915 ; WX 838 ; N uni22D3 ; G 3174 -U 8916 ; WX 838 ; N uni22D4 ; G 3175 -U 8917 ; WX 838 ; N uni22D5 ; G 3176 -U 8918 ; WX 838 ; N uni22D6 ; G 3177 -U 8919 ; WX 838 ; N uni22D7 ; G 3178 -U 8920 ; WX 1422 ; N uni22D8 ; G 3179 -U 8921 ; WX 1422 ; N uni22D9 ; G 3180 -U 8922 ; WX 838 ; N uni22DA ; G 3181 -U 8923 ; WX 838 ; N uni22DB ; G 3182 -U 8924 ; WX 838 ; N uni22DC ; G 3183 -U 8925 ; WX 838 ; N uni22DD ; G 3184 -U 8926 ; WX 838 ; N uni22DE ; G 3185 -U 8927 ; WX 838 ; N uni22DF ; G 3186 -U 8928 ; WX 838 ; N uni22E0 ; G 3187 -U 8929 ; WX 838 ; N uni22E1 ; G 3188 -U 8930 ; WX 838 ; N uni22E2 ; G 3189 -U 8931 ; WX 838 ; N uni22E3 ; G 3190 -U 8932 ; WX 838 ; N uni22E4 ; G 3191 -U 8933 ; WX 838 ; N uni22E5 ; G 3192 -U 8934 ; WX 838 ; N uni22E6 ; G 3193 -U 8935 ; WX 838 ; N uni22E7 ; G 3194 -U 8936 ; WX 838 ; N uni22E8 ; G 3195 -U 8937 ; WX 838 ; N uni22E9 ; G 3196 -U 8938 ; WX 838 ; N uni22EA ; G 3197 -U 8939 ; WX 838 ; N uni22EB ; G 3198 -U 8940 ; WX 838 ; N uni22EC ; G 3199 -U 8941 ; WX 838 ; N uni22ED ; G 3200 -U 8942 ; WX 1000 ; N uni22EE ; G 3201 -U 8943 ; WX 1000 ; N uni22EF ; G 3202 -U 8944 ; WX 1000 ; N uni22F0 ; G 3203 -U 8945 ; WX 1000 ; N uni22F1 ; G 3204 -U 8946 ; WX 1000 ; N uni22F2 ; G 3205 -U 8947 ; WX 871 ; N uni22F3 ; G 3206 -U 8948 ; WX 718 ; N uni22F4 ; G 3207 -U 8949 ; WX 871 ; N uni22F5 ; G 3208 -U 8950 ; WX 871 ; N uni22F6 ; G 3209 -U 8951 ; WX 718 ; N uni22F7 ; G 3210 -U 8952 ; WX 871 ; N uni22F8 ; G 3211 -U 8953 ; WX 871 ; N uni22F9 ; G 3212 -U 8954 ; WX 1000 ; N uni22FA ; G 3213 -U 8955 ; WX 871 ; N uni22FB ; G 3214 -U 8956 ; WX 718 ; N uni22FC ; G 3215 -U 8957 ; WX 871 ; N uni22FD ; G 3216 -U 8958 ; WX 718 ; N uni22FE ; G 3217 -U 8959 ; WX 871 ; N uni22FF ; G 3218 -U 8960 ; WX 602 ; N uni2300 ; G 3219 -U 8961 ; WX 602 ; N uni2301 ; G 3220 -U 8962 ; WX 635 ; N house ; G 3221 -U 8963 ; WX 838 ; N uni2303 ; G 3222 -U 8964 ; WX 838 ; N uni2304 ; G 3223 -U 8965 ; WX 838 ; N uni2305 ; G 3224 -U 8966 ; WX 838 ; N uni2306 ; G 3225 -U 8967 ; WX 488 ; N uni2307 ; G 3226 -U 8968 ; WX 390 ; N uni2308 ; G 3227 -U 8969 ; WX 390 ; N uni2309 ; G 3228 -U 8970 ; WX 390 ; N uni230A ; G 3229 -U 8971 ; WX 390 ; N uni230B ; G 3230 -U 8972 ; WX 809 ; N uni230C ; G 3231 -U 8973 ; WX 809 ; N uni230D ; G 3232 -U 8974 ; WX 809 ; N uni230E ; G 3233 -U 8975 ; WX 809 ; N uni230F ; G 3234 -U 8976 ; WX 838 ; N revlogicalnot ; G 3235 -U 8977 ; WX 513 ; N uni2311 ; G 3236 -U 8984 ; WX 1000 ; N uni2318 ; G 3237 -U 8985 ; WX 838 ; N uni2319 ; G 3238 -U 8988 ; WX 469 ; N uni231C ; G 3239 -U 8989 ; WX 469 ; N uni231D ; G 3240 -U 8990 ; WX 469 ; N uni231E ; G 3241 -U 8991 ; WX 469 ; N uni231F ; G 3242 -U 8992 ; WX 521 ; N integraltp ; G 3243 -U 8993 ; WX 521 ; N integralbt ; G 3244 -U 8996 ; WX 1152 ; N uni2324 ; G 3245 -U 8997 ; WX 1152 ; N uni2325 ; G 3246 -U 8998 ; WX 1414 ; N uni2326 ; G 3247 -U 8999 ; WX 1152 ; N uni2327 ; G 3248 -U 9000 ; WX 1443 ; N uni2328 ; G 3249 -U 9003 ; WX 1414 ; N uni232B ; G 3250 -U 9004 ; WX 873 ; N uni232C ; G 3251 -U 9075 ; WX 338 ; N uni2373 ; G 3252 -U 9076 ; WX 635 ; N uni2374 ; G 3253 -U 9077 ; WX 837 ; N uni2375 ; G 3254 -U 9082 ; WX 659 ; N uni237A ; G 3255 -U 9085 ; WX 757 ; N uni237D ; G 3256 -U 9095 ; WX 1152 ; N uni2387 ; G 3257 -U 9108 ; WX 873 ; N uni2394 ; G 3258 -U 9115 ; WX 500 ; N uni239B ; G 3259 -U 9116 ; WX 500 ; N uni239C ; G 3260 -U 9117 ; WX 500 ; N uni239D ; G 3261 -U 9118 ; WX 500 ; N uni239E ; G 3262 -U 9119 ; WX 500 ; N uni239F ; G 3263 -U 9120 ; WX 500 ; N uni23A0 ; G 3264 -U 9121 ; WX 500 ; N uni23A1 ; G 3265 -U 9122 ; WX 500 ; N uni23A2 ; G 3266 -U 9123 ; WX 500 ; N uni23A3 ; G 3267 -U 9124 ; WX 500 ; N uni23A4 ; G 3268 -U 9125 ; WX 500 ; N uni23A5 ; G 3269 -U 9126 ; WX 500 ; N uni23A6 ; G 3270 -U 9127 ; WX 750 ; N uni23A7 ; G 3271 -U 9128 ; WX 750 ; N uni23A8 ; G 3272 -U 9129 ; WX 750 ; N uni23A9 ; G 3273 -U 9130 ; WX 750 ; N uni23AA ; G 3274 -U 9131 ; WX 750 ; N uni23AB ; G 3275 -U 9132 ; WX 750 ; N uni23AC ; G 3276 -U 9133 ; WX 750 ; N uni23AD ; G 3277 -U 9134 ; WX 521 ; N uni23AE ; G 3278 -U 9166 ; WX 838 ; N uni23CE ; G 3279 -U 9167 ; WX 945 ; N uni23CF ; G 3280 -U 9187 ; WX 873 ; N uni23E3 ; G 3281 -U 9189 ; WX 769 ; N uni23E5 ; G 3282 -U 9192 ; WX 636 ; N uni23E8 ; G 3283 -U 9250 ; WX 635 ; N uni2422 ; G 3284 -U 9251 ; WX 635 ; N uni2423 ; G 3285 -U 9312 ; WX 896 ; N uni2460 ; G 3286 -U 9313 ; WX 896 ; N uni2461 ; G 3287 -U 9314 ; WX 896 ; N uni2462 ; G 3288 -U 9315 ; WX 896 ; N uni2463 ; G 3289 -U 9316 ; WX 896 ; N uni2464 ; G 3290 -U 9317 ; WX 896 ; N uni2465 ; G 3291 -U 9318 ; WX 896 ; N uni2466 ; G 3292 -U 9319 ; WX 896 ; N uni2467 ; G 3293 -U 9320 ; WX 896 ; N uni2468 ; G 3294 -U 9321 ; WX 896 ; N uni2469 ; G 3295 -U 9472 ; WX 602 ; N SF100000 ; G 3296 -U 9473 ; WX 602 ; N uni2501 ; G 3297 -U 9474 ; WX 602 ; N SF110000 ; G 3298 -U 9475 ; WX 602 ; N uni2503 ; G 3299 -U 9476 ; WX 602 ; N uni2504 ; G 3300 -U 9477 ; WX 602 ; N uni2505 ; G 3301 -U 9478 ; WX 602 ; N uni2506 ; G 3302 -U 9479 ; WX 602 ; N uni2507 ; G 3303 -U 9480 ; WX 602 ; N uni2508 ; G 3304 -U 9481 ; WX 602 ; N uni2509 ; G 3305 -U 9482 ; WX 602 ; N uni250A ; G 3306 -U 9483 ; WX 602 ; N uni250B ; G 3307 -U 9484 ; WX 602 ; N SF010000 ; G 3308 -U 9485 ; WX 602 ; N uni250D ; G 3309 -U 9486 ; WX 602 ; N uni250E ; G 3310 -U 9487 ; WX 602 ; N uni250F ; G 3311 -U 9488 ; WX 602 ; N SF030000 ; G 3312 -U 9489 ; WX 602 ; N uni2511 ; G 3313 -U 9490 ; WX 602 ; N uni2512 ; G 3314 -U 9491 ; WX 602 ; N uni2513 ; G 3315 -U 9492 ; WX 602 ; N SF020000 ; G 3316 -U 9493 ; WX 602 ; N uni2515 ; G 3317 -U 9494 ; WX 602 ; N uni2516 ; G 3318 -U 9495 ; WX 602 ; N uni2517 ; G 3319 -U 9496 ; WX 602 ; N SF040000 ; G 3320 -U 9497 ; WX 602 ; N uni2519 ; G 3321 -U 9498 ; WX 602 ; N uni251A ; G 3322 -U 9499 ; WX 602 ; N uni251B ; G 3323 -U 9500 ; WX 602 ; N SF080000 ; G 3324 -U 9501 ; WX 602 ; N uni251D ; G 3325 -U 9502 ; WX 602 ; N uni251E ; G 3326 -U 9503 ; WX 602 ; N uni251F ; G 3327 -U 9504 ; WX 602 ; N uni2520 ; G 3328 -U 9505 ; WX 602 ; N uni2521 ; G 3329 -U 9506 ; WX 602 ; N uni2522 ; G 3330 -U 9507 ; WX 602 ; N uni2523 ; G 3331 -U 9508 ; WX 602 ; N SF090000 ; G 3332 -U 9509 ; WX 602 ; N uni2525 ; G 3333 -U 9510 ; WX 602 ; N uni2526 ; G 3334 -U 9511 ; WX 602 ; N uni2527 ; G 3335 -U 9512 ; WX 602 ; N uni2528 ; G 3336 -U 9513 ; WX 602 ; N uni2529 ; G 3337 -U 9514 ; WX 602 ; N uni252A ; G 3338 -U 9515 ; WX 602 ; N uni252B ; G 3339 -U 9516 ; WX 602 ; N SF060000 ; G 3340 -U 9517 ; WX 602 ; N uni252D ; G 3341 -U 9518 ; WX 602 ; N uni252E ; G 3342 -U 9519 ; WX 602 ; N uni252F ; G 3343 -U 9520 ; WX 602 ; N uni2530 ; G 3344 -U 9521 ; WX 602 ; N uni2531 ; G 3345 -U 9522 ; WX 602 ; N uni2532 ; G 3346 -U 9523 ; WX 602 ; N uni2533 ; G 3347 -U 9524 ; WX 602 ; N SF070000 ; G 3348 -U 9525 ; WX 602 ; N uni2535 ; G 3349 -U 9526 ; WX 602 ; N uni2536 ; G 3350 -U 9527 ; WX 602 ; N uni2537 ; G 3351 -U 9528 ; WX 602 ; N uni2538 ; G 3352 -U 9529 ; WX 602 ; N uni2539 ; G 3353 -U 9530 ; WX 602 ; N uni253A ; G 3354 -U 9531 ; WX 602 ; N uni253B ; G 3355 -U 9532 ; WX 602 ; N SF050000 ; G 3356 -U 9533 ; WX 602 ; N uni253D ; G 3357 -U 9534 ; WX 602 ; N uni253E ; G 3358 -U 9535 ; WX 602 ; N uni253F ; G 3359 -U 9536 ; WX 602 ; N uni2540 ; G 3360 -U 9537 ; WX 602 ; N uni2541 ; G 3361 -U 9538 ; WX 602 ; N uni2542 ; G 3362 -U 9539 ; WX 602 ; N uni2543 ; G 3363 -U 9540 ; WX 602 ; N uni2544 ; G 3364 -U 9541 ; WX 602 ; N uni2545 ; G 3365 -U 9542 ; WX 602 ; N uni2546 ; G 3366 -U 9543 ; WX 602 ; N uni2547 ; G 3367 -U 9544 ; WX 602 ; N uni2548 ; G 3368 -U 9545 ; WX 602 ; N uni2549 ; G 3369 -U 9546 ; WX 602 ; N uni254A ; G 3370 -U 9547 ; WX 602 ; N uni254B ; G 3371 -U 9548 ; WX 602 ; N uni254C ; G 3372 -U 9549 ; WX 602 ; N uni254D ; G 3373 -U 9550 ; WX 602 ; N uni254E ; G 3374 -U 9551 ; WX 602 ; N uni254F ; G 3375 -U 9552 ; WX 602 ; N SF430000 ; G 3376 -U 9553 ; WX 602 ; N SF240000 ; G 3377 -U 9554 ; WX 602 ; N SF510000 ; G 3378 -U 9555 ; WX 602 ; N SF520000 ; G 3379 -U 9556 ; WX 602 ; N SF390000 ; G 3380 -U 9557 ; WX 602 ; N SF220000 ; G 3381 -U 9558 ; WX 602 ; N SF210000 ; G 3382 -U 9559 ; WX 602 ; N SF250000 ; G 3383 -U 9560 ; WX 602 ; N SF500000 ; G 3384 -U 9561 ; WX 602 ; N SF490000 ; G 3385 -U 9562 ; WX 602 ; N SF380000 ; G 3386 -U 9563 ; WX 602 ; N SF280000 ; G 3387 -U 9564 ; WX 602 ; N SF270000 ; G 3388 -U 9565 ; WX 602 ; N SF260000 ; G 3389 -U 9566 ; WX 602 ; N SF360000 ; G 3390 -U 9567 ; WX 602 ; N SF370000 ; G 3391 -U 9568 ; WX 602 ; N SF420000 ; G 3392 -U 9569 ; WX 602 ; N SF190000 ; G 3393 -U 9570 ; WX 602 ; N SF200000 ; G 3394 -U 9571 ; WX 602 ; N SF230000 ; G 3395 -U 9572 ; WX 602 ; N SF470000 ; G 3396 -U 9573 ; WX 602 ; N SF480000 ; G 3397 -U 9574 ; WX 602 ; N SF410000 ; G 3398 -U 9575 ; WX 602 ; N SF450000 ; G 3399 -U 9576 ; WX 602 ; N SF460000 ; G 3400 -U 9577 ; WX 602 ; N SF400000 ; G 3401 -U 9578 ; WX 602 ; N SF540000 ; G 3402 -U 9579 ; WX 602 ; N SF530000 ; G 3403 -U 9580 ; WX 602 ; N SF440000 ; G 3404 -U 9581 ; WX 602 ; N uni256D ; G 3405 -U 9582 ; WX 602 ; N uni256E ; G 3406 -U 9583 ; WX 602 ; N uni256F ; G 3407 -U 9584 ; WX 602 ; N uni2570 ; G 3408 -U 9585 ; WX 602 ; N uni2571 ; G 3409 -U 9586 ; WX 602 ; N uni2572 ; G 3410 -U 9587 ; WX 602 ; N uni2573 ; G 3411 -U 9588 ; WX 602 ; N uni2574 ; G 3412 -U 9589 ; WX 602 ; N uni2575 ; G 3413 -U 9590 ; WX 602 ; N uni2576 ; G 3414 -U 9591 ; WX 602 ; N uni2577 ; G 3415 -U 9592 ; WX 602 ; N uni2578 ; G 3416 -U 9593 ; WX 602 ; N uni2579 ; G 3417 -U 9594 ; WX 602 ; N uni257A ; G 3418 -U 9595 ; WX 602 ; N uni257B ; G 3419 -U 9596 ; WX 602 ; N uni257C ; G 3420 -U 9597 ; WX 602 ; N uni257D ; G 3421 -U 9598 ; WX 602 ; N uni257E ; G 3422 -U 9599 ; WX 602 ; N uni257F ; G 3423 -U 9600 ; WX 769 ; N upblock ; G 3424 -U 9601 ; WX 769 ; N uni2581 ; G 3425 -U 9602 ; WX 769 ; N uni2582 ; G 3426 -U 9603 ; WX 769 ; N uni2583 ; G 3427 -U 9604 ; WX 769 ; N dnblock ; G 3428 -U 9605 ; WX 769 ; N uni2585 ; G 3429 -U 9606 ; WX 769 ; N uni2586 ; G 3430 -U 9607 ; WX 769 ; N uni2587 ; G 3431 -U 9608 ; WX 769 ; N block ; G 3432 -U 9609 ; WX 769 ; N uni2589 ; G 3433 -U 9610 ; WX 769 ; N uni258A ; G 3434 -U 9611 ; WX 769 ; N uni258B ; G 3435 -U 9612 ; WX 769 ; N lfblock ; G 3436 -U 9613 ; WX 769 ; N uni258D ; G 3437 -U 9614 ; WX 769 ; N uni258E ; G 3438 -U 9615 ; WX 769 ; N uni258F ; G 3439 -U 9616 ; WX 769 ; N rtblock ; G 3440 -U 9617 ; WX 769 ; N ltshade ; G 3441 -U 9618 ; WX 769 ; N shade ; G 3442 -U 9619 ; WX 769 ; N dkshade ; G 3443 -U 9620 ; WX 769 ; N uni2594 ; G 3444 -U 9621 ; WX 769 ; N uni2595 ; G 3445 -U 9622 ; WX 769 ; N uni2596 ; G 3446 -U 9623 ; WX 769 ; N uni2597 ; G 3447 -U 9624 ; WX 769 ; N uni2598 ; G 3448 -U 9625 ; WX 769 ; N uni2599 ; G 3449 -U 9626 ; WX 769 ; N uni259A ; G 3450 -U 9627 ; WX 769 ; N uni259B ; G 3451 -U 9628 ; WX 769 ; N uni259C ; G 3452 -U 9629 ; WX 769 ; N uni259D ; G 3453 -U 9630 ; WX 769 ; N uni259E ; G 3454 -U 9631 ; WX 769 ; N uni259F ; G 3455 -U 9632 ; WX 945 ; N filledbox ; G 3456 -U 9633 ; WX 945 ; N H22073 ; G 3457 -U 9634 ; WX 945 ; N uni25A2 ; G 3458 -U 9635 ; WX 945 ; N uni25A3 ; G 3459 -U 9636 ; WX 945 ; N uni25A4 ; G 3460 -U 9637 ; WX 945 ; N uni25A5 ; G 3461 -U 9638 ; WX 945 ; N uni25A6 ; G 3462 -U 9639 ; WX 945 ; N uni25A7 ; G 3463 -U 9640 ; WX 945 ; N uni25A8 ; G 3464 -U 9641 ; WX 945 ; N uni25A9 ; G 3465 -U 9642 ; WX 678 ; N H18543 ; G 3466 -U 9643 ; WX 678 ; N H18551 ; G 3467 -U 9644 ; WX 945 ; N filledrect ; G 3468 -U 9645 ; WX 945 ; N uni25AD ; G 3469 -U 9646 ; WX 550 ; N uni25AE ; G 3470 -U 9647 ; WX 550 ; N uni25AF ; G 3471 -U 9648 ; WX 769 ; N uni25B0 ; G 3472 -U 9649 ; WX 769 ; N uni25B1 ; G 3473 -U 9650 ; WX 769 ; N triagup ; G 3474 -U 9651 ; WX 769 ; N uni25B3 ; G 3475 -U 9652 ; WX 502 ; N uni25B4 ; G 3476 -U 9653 ; WX 502 ; N uni25B5 ; G 3477 -U 9654 ; WX 769 ; N uni25B6 ; G 3478 -U 9655 ; WX 769 ; N uni25B7 ; G 3479 -U 9656 ; WX 502 ; N uni25B8 ; G 3480 -U 9657 ; WX 502 ; N uni25B9 ; G 3481 -U 9658 ; WX 769 ; N triagrt ; G 3482 -U 9659 ; WX 769 ; N uni25BB ; G 3483 -U 9660 ; WX 769 ; N triagdn ; G 3484 -U 9661 ; WX 769 ; N uni25BD ; G 3485 -U 9662 ; WX 502 ; N uni25BE ; G 3486 -U 9663 ; WX 502 ; N uni25BF ; G 3487 -U 9664 ; WX 769 ; N uni25C0 ; G 3488 -U 9665 ; WX 769 ; N uni25C1 ; G 3489 -U 9666 ; WX 502 ; N uni25C2 ; G 3490 -U 9667 ; WX 502 ; N uni25C3 ; G 3491 -U 9668 ; WX 769 ; N triaglf ; G 3492 -U 9669 ; WX 769 ; N uni25C5 ; G 3493 -U 9670 ; WX 769 ; N uni25C6 ; G 3494 -U 9671 ; WX 769 ; N uni25C7 ; G 3495 -U 9672 ; WX 769 ; N uni25C8 ; G 3496 -U 9673 ; WX 873 ; N uni25C9 ; G 3497 -U 9674 ; WX 494 ; N lozenge ; G 3498 -U 9675 ; WX 873 ; N circle ; G 3499 -U 9676 ; WX 873 ; N uni25CC ; G 3500 -U 9677 ; WX 873 ; N uni25CD ; G 3501 -U 9678 ; WX 873 ; N uni25CE ; G 3502 -U 9679 ; WX 873 ; N H18533 ; G 3503 -U 9680 ; WX 873 ; N uni25D0 ; G 3504 -U 9681 ; WX 873 ; N uni25D1 ; G 3505 -U 9682 ; WX 873 ; N uni25D2 ; G 3506 -U 9683 ; WX 873 ; N uni25D3 ; G 3507 -U 9684 ; WX 873 ; N uni25D4 ; G 3508 -U 9685 ; WX 873 ; N uni25D5 ; G 3509 -U 9686 ; WX 527 ; N uni25D6 ; G 3510 -U 9687 ; WX 527 ; N uni25D7 ; G 3511 -U 9688 ; WX 791 ; N invbullet ; G 3512 -U 9689 ; WX 970 ; N invcircle ; G 3513 -U 9690 ; WX 970 ; N uni25DA ; G 3514 -U 9691 ; WX 970 ; N uni25DB ; G 3515 -U 9692 ; WX 387 ; N uni25DC ; G 3516 -U 9693 ; WX 387 ; N uni25DD ; G 3517 -U 9694 ; WX 387 ; N uni25DE ; G 3518 -U 9695 ; WX 387 ; N uni25DF ; G 3519 -U 9696 ; WX 769 ; N uni25E0 ; G 3520 -U 9697 ; WX 769 ; N uni25E1 ; G 3521 -U 9698 ; WX 769 ; N uni25E2 ; G 3522 -U 9699 ; WX 769 ; N uni25E3 ; G 3523 -U 9700 ; WX 769 ; N uni25E4 ; G 3524 -U 9701 ; WX 769 ; N uni25E5 ; G 3525 -U 9702 ; WX 590 ; N openbullet ; G 3526 -U 9703 ; WX 945 ; N uni25E7 ; G 3527 -U 9704 ; WX 945 ; N uni25E8 ; G 3528 -U 9705 ; WX 945 ; N uni25E9 ; G 3529 -U 9706 ; WX 945 ; N uni25EA ; G 3530 -U 9707 ; WX 945 ; N uni25EB ; G 3531 -U 9708 ; WX 769 ; N uni25EC ; G 3532 -U 9709 ; WX 769 ; N uni25ED ; G 3533 -U 9710 ; WX 769 ; N uni25EE ; G 3534 -U 9711 ; WX 1119 ; N uni25EF ; G 3535 -U 9712 ; WX 945 ; N uni25F0 ; G 3536 -U 9713 ; WX 945 ; N uni25F1 ; G 3537 -U 9714 ; WX 945 ; N uni25F2 ; G 3538 -U 9715 ; WX 945 ; N uni25F3 ; G 3539 -U 9716 ; WX 873 ; N uni25F4 ; G 3540 -U 9717 ; WX 873 ; N uni25F5 ; G 3541 -U 9718 ; WX 873 ; N uni25F6 ; G 3542 -U 9719 ; WX 873 ; N uni25F7 ; G 3543 -U 9720 ; WX 769 ; N uni25F8 ; G 3544 -U 9721 ; WX 769 ; N uni25F9 ; G 3545 -U 9722 ; WX 769 ; N uni25FA ; G 3546 -U 9723 ; WX 830 ; N uni25FB ; G 3547 -U 9724 ; WX 830 ; N uni25FC ; G 3548 -U 9725 ; WX 732 ; N uni25FD ; G 3549 -U 9726 ; WX 732 ; N uni25FE ; G 3550 -U 9727 ; WX 769 ; N uni25FF ; G 3551 -U 9728 ; WX 896 ; N uni2600 ; G 3552 -U 9729 ; WX 1000 ; N uni2601 ; G 3553 -U 9730 ; WX 896 ; N uni2602 ; G 3554 -U 9731 ; WX 896 ; N uni2603 ; G 3555 -U 9732 ; WX 896 ; N uni2604 ; G 3556 -U 9733 ; WX 896 ; N uni2605 ; G 3557 -U 9734 ; WX 896 ; N uni2606 ; G 3558 -U 9735 ; WX 573 ; N uni2607 ; G 3559 -U 9736 ; WX 896 ; N uni2608 ; G 3560 -U 9737 ; WX 896 ; N uni2609 ; G 3561 -U 9738 ; WX 888 ; N uni260A ; G 3562 -U 9739 ; WX 888 ; N uni260B ; G 3563 -U 9740 ; WX 671 ; N uni260C ; G 3564 -U 9741 ; WX 1013 ; N uni260D ; G 3565 -U 9742 ; WX 1246 ; N uni260E ; G 3566 -U 9743 ; WX 1250 ; N uni260F ; G 3567 -U 9744 ; WX 896 ; N uni2610 ; G 3568 -U 9745 ; WX 896 ; N uni2611 ; G 3569 -U 9746 ; WX 896 ; N uni2612 ; G 3570 -U 9747 ; WX 532 ; N uni2613 ; G 3571 -U 9748 ; WX 896 ; N uni2614 ; G 3572 -U 9749 ; WX 896 ; N uni2615 ; G 3573 -U 9750 ; WX 896 ; N uni2616 ; G 3574 -U 9751 ; WX 896 ; N uni2617 ; G 3575 -U 9752 ; WX 896 ; N uni2618 ; G 3576 -U 9753 ; WX 896 ; N uni2619 ; G 3577 -U 9754 ; WX 896 ; N uni261A ; G 3578 -U 9755 ; WX 896 ; N uni261B ; G 3579 -U 9756 ; WX 896 ; N uni261C ; G 3580 -U 9757 ; WX 609 ; N uni261D ; G 3581 -U 9758 ; WX 896 ; N uni261E ; G 3582 -U 9759 ; WX 609 ; N uni261F ; G 3583 -U 9760 ; WX 896 ; N uni2620 ; G 3584 -U 9761 ; WX 896 ; N uni2621 ; G 3585 -U 9762 ; WX 896 ; N uni2622 ; G 3586 -U 9763 ; WX 896 ; N uni2623 ; G 3587 -U 9764 ; WX 669 ; N uni2624 ; G 3588 -U 9765 ; WX 746 ; N uni2625 ; G 3589 -U 9766 ; WX 649 ; N uni2626 ; G 3590 -U 9767 ; WX 784 ; N uni2627 ; G 3591 -U 9768 ; WX 545 ; N uni2628 ; G 3592 -U 9769 ; WX 896 ; N uni2629 ; G 3593 -U 9770 ; WX 896 ; N uni262A ; G 3594 -U 9771 ; WX 896 ; N uni262B ; G 3595 -U 9772 ; WX 710 ; N uni262C ; G 3596 -U 9773 ; WX 896 ; N uni262D ; G 3597 -U 9774 ; WX 896 ; N uni262E ; G 3598 -U 9775 ; WX 896 ; N uni262F ; G 3599 -U 9776 ; WX 890 ; N uni2630 ; G 3600 -U 9777 ; WX 890 ; N uni2631 ; G 3601 -U 9778 ; WX 890 ; N uni2632 ; G 3602 -U 9779 ; WX 890 ; N uni2633 ; G 3603 -U 9780 ; WX 890 ; N uni2634 ; G 3604 -U 9781 ; WX 890 ; N uni2635 ; G 3605 -U 9782 ; WX 890 ; N uni2636 ; G 3606 -U 9783 ; WX 890 ; N uni2637 ; G 3607 -U 9784 ; WX 896 ; N uni2638 ; G 3608 -U 9785 ; WX 1042 ; N uni2639 ; G 3609 -U 9786 ; WX 1042 ; N smileface ; G 3610 -U 9787 ; WX 1042 ; N invsmileface ; G 3611 -U 9788 ; WX 896 ; N sun ; G 3612 -U 9789 ; WX 896 ; N uni263D ; G 3613 -U 9790 ; WX 896 ; N uni263E ; G 3614 -U 9791 ; WX 614 ; N uni263F ; G 3615 -U 9792 ; WX 732 ; N female ; G 3616 -U 9793 ; WX 732 ; N uni2641 ; G 3617 -U 9794 ; WX 896 ; N male ; G 3618 -U 9795 ; WX 896 ; N uni2643 ; G 3619 -U 9796 ; WX 896 ; N uni2644 ; G 3620 -U 9797 ; WX 896 ; N uni2645 ; G 3621 -U 9798 ; WX 896 ; N uni2646 ; G 3622 -U 9799 ; WX 896 ; N uni2647 ; G 3623 -U 9800 ; WX 896 ; N uni2648 ; G 3624 -U 9801 ; WX 896 ; N uni2649 ; G 3625 -U 9802 ; WX 896 ; N uni264A ; G 3626 -U 9803 ; WX 896 ; N uni264B ; G 3627 -U 9804 ; WX 896 ; N uni264C ; G 3628 -U 9805 ; WX 896 ; N uni264D ; G 3629 -U 9806 ; WX 896 ; N uni264E ; G 3630 -U 9807 ; WX 896 ; N uni264F ; G 3631 -U 9808 ; WX 896 ; N uni2650 ; G 3632 -U 9809 ; WX 896 ; N uni2651 ; G 3633 -U 9810 ; WX 896 ; N uni2652 ; G 3634 -U 9811 ; WX 896 ; N uni2653 ; G 3635 -U 9812 ; WX 896 ; N uni2654 ; G 3636 -U 9813 ; WX 896 ; N uni2655 ; G 3637 -U 9814 ; WX 896 ; N uni2656 ; G 3638 -U 9815 ; WX 896 ; N uni2657 ; G 3639 -U 9816 ; WX 896 ; N uni2658 ; G 3640 -U 9817 ; WX 896 ; N uni2659 ; G 3641 -U 9818 ; WX 896 ; N uni265A ; G 3642 -U 9819 ; WX 896 ; N uni265B ; G 3643 -U 9820 ; WX 896 ; N uni265C ; G 3644 -U 9821 ; WX 896 ; N uni265D ; G 3645 -U 9822 ; WX 896 ; N uni265E ; G 3646 -U 9823 ; WX 896 ; N uni265F ; G 3647 -U 9824 ; WX 896 ; N spade ; G 3648 -U 9825 ; WX 896 ; N uni2661 ; G 3649 -U 9826 ; WX 896 ; N uni2662 ; G 3650 -U 9827 ; WX 896 ; N club ; G 3651 -U 9828 ; WX 896 ; N uni2664 ; G 3652 -U 9829 ; WX 896 ; N heart ; G 3653 -U 9830 ; WX 896 ; N diamond ; G 3654 -U 9831 ; WX 896 ; N uni2667 ; G 3655 -U 9832 ; WX 896 ; N uni2668 ; G 3656 -U 9833 ; WX 472 ; N uni2669 ; G 3657 -U 9834 ; WX 638 ; N musicalnote ; G 3658 -U 9835 ; WX 896 ; N musicalnotedbl ; G 3659 -U 9836 ; WX 896 ; N uni266C ; G 3660 -U 9837 ; WX 472 ; N uni266D ; G 3661 -U 9838 ; WX 357 ; N uni266E ; G 3662 -U 9839 ; WX 484 ; N uni266F ; G 3663 -U 9840 ; WX 748 ; N uni2670 ; G 3664 -U 9841 ; WX 766 ; N uni2671 ; G 3665 -U 9842 ; WX 896 ; N uni2672 ; G 3666 -U 9843 ; WX 896 ; N uni2673 ; G 3667 -U 9844 ; WX 896 ; N uni2674 ; G 3668 -U 9845 ; WX 896 ; N uni2675 ; G 3669 -U 9846 ; WX 896 ; N uni2676 ; G 3670 -U 9847 ; WX 896 ; N uni2677 ; G 3671 -U 9848 ; WX 896 ; N uni2678 ; G 3672 -U 9849 ; WX 896 ; N uni2679 ; G 3673 -U 9850 ; WX 896 ; N uni267A ; G 3674 -U 9851 ; WX 896 ; N uni267B ; G 3675 -U 9852 ; WX 896 ; N uni267C ; G 3676 -U 9853 ; WX 896 ; N uni267D ; G 3677 -U 9854 ; WX 896 ; N uni267E ; G 3678 -U 9855 ; WX 896 ; N uni267F ; G 3679 -U 9856 ; WX 869 ; N uni2680 ; G 3680 -U 9857 ; WX 869 ; N uni2681 ; G 3681 -U 9858 ; WX 869 ; N uni2682 ; G 3682 -U 9859 ; WX 869 ; N uni2683 ; G 3683 -U 9860 ; WX 869 ; N uni2684 ; G 3684 -U 9861 ; WX 869 ; N uni2685 ; G 3685 -U 9862 ; WX 890 ; N uni2686 ; G 3686 -U 9863 ; WX 890 ; N uni2687 ; G 3687 -U 9864 ; WX 890 ; N uni2688 ; G 3688 -U 9865 ; WX 890 ; N uni2689 ; G 3689 -U 9866 ; WX 890 ; N uni268A ; G 3690 -U 9867 ; WX 890 ; N uni268B ; G 3691 -U 9868 ; WX 890 ; N uni268C ; G 3692 -U 9869 ; WX 890 ; N uni268D ; G 3693 -U 9870 ; WX 890 ; N uni268E ; G 3694 -U 9871 ; WX 890 ; N uni268F ; G 3695 -U 9872 ; WX 750 ; N uni2690 ; G 3696 -U 9873 ; WX 750 ; N uni2691 ; G 3697 -U 9874 ; WX 890 ; N uni2692 ; G 3698 -U 9875 ; WX 816 ; N uni2693 ; G 3699 -U 9876 ; WX 716 ; N uni2694 ; G 3700 -U 9877 ; WX 537 ; N uni2695 ; G 3701 -U 9878 ; WX 852 ; N uni2696 ; G 3702 -U 9879 ; WX 890 ; N uni2697 ; G 3703 -U 9880 ; WX 684 ; N uni2698 ; G 3704 -U 9881 ; WX 896 ; N uni2699 ; G 3705 -U 9882 ; WX 708 ; N uni269A ; G 3706 -U 9883 ; WX 890 ; N uni269B ; G 3707 -U 9884 ; WX 890 ; N uni269C ; G 3708 -U 9886 ; WX 896 ; N uni269E ; G 3709 -U 9887 ; WX 896 ; N uni269F ; G 3710 -U 9888 ; WX 890 ; N uni26A0 ; G 3711 -U 9889 ; WX 702 ; N uni26A1 ; G 3712 -U 9890 ; WX 1004 ; N uni26A2 ; G 3713 -U 9891 ; WX 1089 ; N uni26A3 ; G 3714 -U 9892 ; WX 1175 ; N uni26A4 ; G 3715 -U 9893 ; WX 903 ; N uni26A5 ; G 3716 -U 9894 ; WX 838 ; N uni26A6 ; G 3717 -U 9895 ; WX 838 ; N uni26A7 ; G 3718 -U 9896 ; WX 838 ; N uni26A8 ; G 3719 -U 9897 ; WX 838 ; N uni26A9 ; G 3720 -U 9898 ; WX 838 ; N uni26AA ; G 3721 -U 9899 ; WX 838 ; N uni26AB ; G 3722 -U 9900 ; WX 838 ; N uni26AC ; G 3723 -U 9901 ; WX 838 ; N uni26AD ; G 3724 -U 9902 ; WX 838 ; N uni26AE ; G 3725 -U 9903 ; WX 838 ; N uni26AF ; G 3726 -U 9904 ; WX 844 ; N uni26B0 ; G 3727 -U 9905 ; WX 838 ; N uni26B1 ; G 3728 -U 9906 ; WX 732 ; N uni26B2 ; G 3729 -U 9907 ; WX 732 ; N uni26B3 ; G 3730 -U 9908 ; WX 732 ; N uni26B4 ; G 3731 -U 9909 ; WX 732 ; N uni26B5 ; G 3732 -U 9910 ; WX 850 ; N uni26B6 ; G 3733 -U 9911 ; WX 732 ; N uni26B7 ; G 3734 -U 9912 ; WX 732 ; N uni26B8 ; G 3735 -U 9920 ; WX 838 ; N uni26C0 ; G 3736 -U 9921 ; WX 838 ; N uni26C1 ; G 3737 -U 9922 ; WX 838 ; N uni26C2 ; G 3738 -U 9923 ; WX 838 ; N uni26C3 ; G 3739 -U 9954 ; WX 732 ; N uni26E2 ; G 3740 -U 9985 ; WX 838 ; N uni2701 ; G 3741 -U 9986 ; WX 838 ; N uni2702 ; G 3742 -U 9987 ; WX 838 ; N uni2703 ; G 3743 -U 9988 ; WX 838 ; N uni2704 ; G 3744 -U 9990 ; WX 838 ; N uni2706 ; G 3745 -U 9991 ; WX 838 ; N uni2707 ; G 3746 -U 9992 ; WX 838 ; N uni2708 ; G 3747 -U 9993 ; WX 838 ; N uni2709 ; G 3748 -U 9996 ; WX 838 ; N uni270C ; G 3749 -U 9997 ; WX 838 ; N uni270D ; G 3750 -U 9998 ; WX 838 ; N uni270E ; G 3751 -U 9999 ; WX 838 ; N uni270F ; G 3752 -U 10000 ; WX 838 ; N uni2710 ; G 3753 -U 10001 ; WX 838 ; N uni2711 ; G 3754 -U 10002 ; WX 838 ; N uni2712 ; G 3755 -U 10003 ; WX 838 ; N uni2713 ; G 3756 -U 10004 ; WX 838 ; N uni2714 ; G 3757 -U 10005 ; WX 838 ; N uni2715 ; G 3758 -U 10006 ; WX 838 ; N uni2716 ; G 3759 -U 10007 ; WX 838 ; N uni2717 ; G 3760 -U 10008 ; WX 838 ; N uni2718 ; G 3761 -U 10009 ; WX 838 ; N uni2719 ; G 3762 -U 10010 ; WX 838 ; N uni271A ; G 3763 -U 10011 ; WX 838 ; N uni271B ; G 3764 -U 10012 ; WX 838 ; N uni271C ; G 3765 -U 10013 ; WX 838 ; N uni271D ; G 3766 -U 10014 ; WX 838 ; N uni271E ; G 3767 -U 10015 ; WX 838 ; N uni271F ; G 3768 -U 10016 ; WX 838 ; N uni2720 ; G 3769 -U 10017 ; WX 838 ; N uni2721 ; G 3770 -U 10018 ; WX 838 ; N uni2722 ; G 3771 -U 10019 ; WX 838 ; N uni2723 ; G 3772 -U 10020 ; WX 838 ; N uni2724 ; G 3773 -U 10021 ; WX 838 ; N uni2725 ; G 3774 -U 10022 ; WX 838 ; N uni2726 ; G 3775 -U 10023 ; WX 838 ; N uni2727 ; G 3776 -U 10025 ; WX 838 ; N uni2729 ; G 3777 -U 10026 ; WX 838 ; N uni272A ; G 3778 -U 10027 ; WX 838 ; N uni272B ; G 3779 -U 10028 ; WX 838 ; N uni272C ; G 3780 -U 10029 ; WX 838 ; N uni272D ; G 3781 -U 10030 ; WX 838 ; N uni272E ; G 3782 -U 10031 ; WX 838 ; N uni272F ; G 3783 -U 10032 ; WX 838 ; N uni2730 ; G 3784 -U 10033 ; WX 838 ; N uni2731 ; G 3785 -U 10034 ; WX 838 ; N uni2732 ; G 3786 -U 10035 ; WX 838 ; N uni2733 ; G 3787 -U 10036 ; WX 838 ; N uni2734 ; G 3788 -U 10037 ; WX 838 ; N uni2735 ; G 3789 -U 10038 ; WX 838 ; N uni2736 ; G 3790 -U 10039 ; WX 838 ; N uni2737 ; G 3791 -U 10040 ; WX 838 ; N uni2738 ; G 3792 -U 10041 ; WX 838 ; N uni2739 ; G 3793 -U 10042 ; WX 838 ; N uni273A ; G 3794 -U 10043 ; WX 838 ; N uni273B ; G 3795 -U 10044 ; WX 838 ; N uni273C ; G 3796 -U 10045 ; WX 838 ; N uni273D ; G 3797 -U 10046 ; WX 838 ; N uni273E ; G 3798 -U 10047 ; WX 838 ; N uni273F ; G 3799 -U 10048 ; WX 838 ; N uni2740 ; G 3800 -U 10049 ; WX 838 ; N uni2741 ; G 3801 -U 10050 ; WX 838 ; N uni2742 ; G 3802 -U 10051 ; WX 838 ; N uni2743 ; G 3803 -U 10052 ; WX 838 ; N uni2744 ; G 3804 -U 10053 ; WX 838 ; N uni2745 ; G 3805 -U 10054 ; WX 838 ; N uni2746 ; G 3806 -U 10055 ; WX 838 ; N uni2747 ; G 3807 -U 10056 ; WX 838 ; N uni2748 ; G 3808 -U 10057 ; WX 838 ; N uni2749 ; G 3809 -U 10058 ; WX 838 ; N uni274A ; G 3810 -U 10059 ; WX 838 ; N uni274B ; G 3811 -U 10061 ; WX 896 ; N uni274D ; G 3812 -U 10063 ; WX 896 ; N uni274F ; G 3813 -U 10064 ; WX 896 ; N uni2750 ; G 3814 -U 10065 ; WX 896 ; N uni2751 ; G 3815 -U 10066 ; WX 896 ; N uni2752 ; G 3816 -U 10070 ; WX 896 ; N uni2756 ; G 3817 -U 10072 ; WX 838 ; N uni2758 ; G 3818 -U 10073 ; WX 838 ; N uni2759 ; G 3819 -U 10074 ; WX 838 ; N uni275A ; G 3820 -U 10075 ; WX 322 ; N uni275B ; G 3821 -U 10076 ; WX 322 ; N uni275C ; G 3822 -U 10077 ; WX 538 ; N uni275D ; G 3823 -U 10078 ; WX 538 ; N uni275E ; G 3824 -U 10081 ; WX 838 ; N uni2761 ; G 3825 -U 10082 ; WX 838 ; N uni2762 ; G 3826 -U 10083 ; WX 838 ; N uni2763 ; G 3827 -U 10084 ; WX 838 ; N uni2764 ; G 3828 -U 10085 ; WX 838 ; N uni2765 ; G 3829 -U 10086 ; WX 838 ; N uni2766 ; G 3830 -U 10087 ; WX 838 ; N uni2767 ; G 3831 -U 10088 ; WX 838 ; N uni2768 ; G 3832 -U 10089 ; WX 838 ; N uni2769 ; G 3833 -U 10090 ; WX 838 ; N uni276A ; G 3834 -U 10091 ; WX 838 ; N uni276B ; G 3835 -U 10092 ; WX 838 ; N uni276C ; G 3836 -U 10093 ; WX 838 ; N uni276D ; G 3837 -U 10094 ; WX 838 ; N uni276E ; G 3838 -U 10095 ; WX 838 ; N uni276F ; G 3839 -U 10096 ; WX 838 ; N uni2770 ; G 3840 -U 10097 ; WX 838 ; N uni2771 ; G 3841 -U 10098 ; WX 838 ; N uni2772 ; G 3842 -U 10099 ; WX 838 ; N uni2773 ; G 3843 -U 10100 ; WX 838 ; N uni2774 ; G 3844 -U 10101 ; WX 838 ; N uni2775 ; G 3845 -U 10102 ; WX 896 ; N uni2776 ; G 3846 -U 10103 ; WX 896 ; N uni2777 ; G 3847 -U 10104 ; WX 896 ; N uni2778 ; G 3848 -U 10105 ; WX 896 ; N uni2779 ; G 3849 -U 10106 ; WX 896 ; N uni277A ; G 3850 -U 10107 ; WX 896 ; N uni277B ; G 3851 -U 10108 ; WX 896 ; N uni277C ; G 3852 -U 10109 ; WX 896 ; N uni277D ; G 3853 -U 10110 ; WX 896 ; N uni277E ; G 3854 -U 10111 ; WX 896 ; N uni277F ; G 3855 -U 10112 ; WX 838 ; N uni2780 ; G 3856 -U 10113 ; WX 838 ; N uni2781 ; G 3857 -U 10114 ; WX 838 ; N uni2782 ; G 3858 -U 10115 ; WX 838 ; N uni2783 ; G 3859 -U 10116 ; WX 838 ; N uni2784 ; G 3860 -U 10117 ; WX 838 ; N uni2785 ; G 3861 -U 10118 ; WX 838 ; N uni2786 ; G 3862 -U 10119 ; WX 838 ; N uni2787 ; G 3863 -U 10120 ; WX 838 ; N uni2788 ; G 3864 -U 10121 ; WX 838 ; N uni2789 ; G 3865 -U 10122 ; WX 838 ; N uni278A ; G 3866 -U 10123 ; WX 838 ; N uni278B ; G 3867 -U 10124 ; WX 838 ; N uni278C ; G 3868 -U 10125 ; WX 838 ; N uni278D ; G 3869 -U 10126 ; WX 838 ; N uni278E ; G 3870 -U 10127 ; WX 838 ; N uni278F ; G 3871 -U 10128 ; WX 838 ; N uni2790 ; G 3872 -U 10129 ; WX 838 ; N uni2791 ; G 3873 -U 10130 ; WX 838 ; N uni2792 ; G 3874 -U 10131 ; WX 838 ; N uni2793 ; G 3875 -U 10132 ; WX 838 ; N uni2794 ; G 3876 -U 10136 ; WX 838 ; N uni2798 ; G 3877 -U 10137 ; WX 838 ; N uni2799 ; G 3878 -U 10138 ; WX 838 ; N uni279A ; G 3879 -U 10139 ; WX 838 ; N uni279B ; G 3880 -U 10140 ; WX 838 ; N uni279C ; G 3881 -U 10141 ; WX 838 ; N uni279D ; G 3882 -U 10142 ; WX 838 ; N uni279E ; G 3883 -U 10143 ; WX 838 ; N uni279F ; G 3884 -U 10144 ; WX 838 ; N uni27A0 ; G 3885 -U 10145 ; WX 838 ; N uni27A1 ; G 3886 -U 10146 ; WX 838 ; N uni27A2 ; G 3887 -U 10147 ; WX 838 ; N uni27A3 ; G 3888 -U 10148 ; WX 838 ; N uni27A4 ; G 3889 -U 10149 ; WX 838 ; N uni27A5 ; G 3890 -U 10150 ; WX 838 ; N uni27A6 ; G 3891 -U 10151 ; WX 838 ; N uni27A7 ; G 3892 -U 10152 ; WX 838 ; N uni27A8 ; G 3893 -U 10153 ; WX 838 ; N uni27A9 ; G 3894 -U 10154 ; WX 838 ; N uni27AA ; G 3895 -U 10155 ; WX 838 ; N uni27AB ; G 3896 -U 10156 ; WX 838 ; N uni27AC ; G 3897 -U 10157 ; WX 838 ; N uni27AD ; G 3898 -U 10158 ; WX 838 ; N uni27AE ; G 3899 -U 10159 ; WX 838 ; N uni27AF ; G 3900 -U 10161 ; WX 838 ; N uni27B1 ; G 3901 -U 10162 ; WX 838 ; N uni27B2 ; G 3902 -U 10163 ; WX 838 ; N uni27B3 ; G 3903 -U 10164 ; WX 838 ; N uni27B4 ; G 3904 -U 10165 ; WX 838 ; N uni27B5 ; G 3905 -U 10166 ; WX 838 ; N uni27B6 ; G 3906 -U 10167 ; WX 838 ; N uni27B7 ; G 3907 -U 10168 ; WX 838 ; N uni27B8 ; G 3908 -U 10169 ; WX 838 ; N uni27B9 ; G 3909 -U 10170 ; WX 838 ; N uni27BA ; G 3910 -U 10171 ; WX 838 ; N uni27BB ; G 3911 -U 10172 ; WX 838 ; N uni27BC ; G 3912 -U 10173 ; WX 838 ; N uni27BD ; G 3913 -U 10174 ; WX 838 ; N uni27BE ; G 3914 -U 10181 ; WX 390 ; N uni27C5 ; G 3915 -U 10182 ; WX 390 ; N uni27C6 ; G 3916 -U 10208 ; WX 494 ; N uni27E0 ; G 3917 -U 10214 ; WX 495 ; N uni27E6 ; G 3918 -U 10215 ; WX 495 ; N uni27E7 ; G 3919 -U 10216 ; WX 390 ; N uni27E8 ; G 3920 -U 10217 ; WX 390 ; N uni27E9 ; G 3921 -U 10218 ; WX 556 ; N uni27EA ; G 3922 -U 10219 ; WX 556 ; N uni27EB ; G 3923 -U 10224 ; WX 838 ; N uni27F0 ; G 3924 -U 10225 ; WX 838 ; N uni27F1 ; G 3925 -U 10226 ; WX 838 ; N uni27F2 ; G 3926 -U 10227 ; WX 838 ; N uni27F3 ; G 3927 -U 10228 ; WX 1157 ; N uni27F4 ; G 3928 -U 10229 ; WX 1434 ; N uni27F5 ; G 3929 -U 10230 ; WX 1434 ; N uni27F6 ; G 3930 -U 10231 ; WX 1434 ; N uni27F7 ; G 3931 -U 10232 ; WX 1434 ; N uni27F8 ; G 3932 -U 10233 ; WX 1434 ; N uni27F9 ; G 3933 -U 10234 ; WX 1434 ; N uni27FA ; G 3934 -U 10235 ; WX 1434 ; N uni27FB ; G 3935 -U 10236 ; WX 1434 ; N uni27FC ; G 3936 -U 10237 ; WX 1434 ; N uni27FD ; G 3937 -U 10238 ; WX 1434 ; N uni27FE ; G 3938 -U 10239 ; WX 1434 ; N uni27FF ; G 3939 -U 10240 ; WX 732 ; N uni2800 ; G 3940 -U 10241 ; WX 732 ; N uni2801 ; G 3941 -U 10242 ; WX 732 ; N uni2802 ; G 3942 -U 10243 ; WX 732 ; N uni2803 ; G 3943 -U 10244 ; WX 732 ; N uni2804 ; G 3944 -U 10245 ; WX 732 ; N uni2805 ; G 3945 -U 10246 ; WX 732 ; N uni2806 ; G 3946 -U 10247 ; WX 732 ; N uni2807 ; G 3947 -U 10248 ; WX 732 ; N uni2808 ; G 3948 -U 10249 ; WX 732 ; N uni2809 ; G 3949 -U 10250 ; WX 732 ; N uni280A ; G 3950 -U 10251 ; WX 732 ; N uni280B ; G 3951 -U 10252 ; WX 732 ; N uni280C ; G 3952 -U 10253 ; WX 732 ; N uni280D ; G 3953 -U 10254 ; WX 732 ; N uni280E ; G 3954 -U 10255 ; WX 732 ; N uni280F ; G 3955 -U 10256 ; WX 732 ; N uni2810 ; G 3956 -U 10257 ; WX 732 ; N uni2811 ; G 3957 -U 10258 ; WX 732 ; N uni2812 ; G 3958 -U 10259 ; WX 732 ; N uni2813 ; G 3959 -U 10260 ; WX 732 ; N uni2814 ; G 3960 -U 10261 ; WX 732 ; N uni2815 ; G 3961 -U 10262 ; WX 732 ; N uni2816 ; G 3962 -U 10263 ; WX 732 ; N uni2817 ; G 3963 -U 10264 ; WX 732 ; N uni2818 ; G 3964 -U 10265 ; WX 732 ; N uni2819 ; G 3965 -U 10266 ; WX 732 ; N uni281A ; G 3966 -U 10267 ; WX 732 ; N uni281B ; G 3967 -U 10268 ; WX 732 ; N uni281C ; G 3968 -U 10269 ; WX 732 ; N uni281D ; G 3969 -U 10270 ; WX 732 ; N uni281E ; G 3970 -U 10271 ; WX 732 ; N uni281F ; G 3971 -U 10272 ; WX 732 ; N uni2820 ; G 3972 -U 10273 ; WX 732 ; N uni2821 ; G 3973 -U 10274 ; WX 732 ; N uni2822 ; G 3974 -U 10275 ; WX 732 ; N uni2823 ; G 3975 -U 10276 ; WX 732 ; N uni2824 ; G 3976 -U 10277 ; WX 732 ; N uni2825 ; G 3977 -U 10278 ; WX 732 ; N uni2826 ; G 3978 -U 10279 ; WX 732 ; N uni2827 ; G 3979 -U 10280 ; WX 732 ; N uni2828 ; G 3980 -U 10281 ; WX 732 ; N uni2829 ; G 3981 -U 10282 ; WX 732 ; N uni282A ; G 3982 -U 10283 ; WX 732 ; N uni282B ; G 3983 -U 10284 ; WX 732 ; N uni282C ; G 3984 -U 10285 ; WX 732 ; N uni282D ; G 3985 -U 10286 ; WX 732 ; N uni282E ; G 3986 -U 10287 ; WX 732 ; N uni282F ; G 3987 -U 10288 ; WX 732 ; N uni2830 ; G 3988 -U 10289 ; WX 732 ; N uni2831 ; G 3989 -U 10290 ; WX 732 ; N uni2832 ; G 3990 -U 10291 ; WX 732 ; N uni2833 ; G 3991 -U 10292 ; WX 732 ; N uni2834 ; G 3992 -U 10293 ; WX 732 ; N uni2835 ; G 3993 -U 10294 ; WX 732 ; N uni2836 ; G 3994 -U 10295 ; WX 732 ; N uni2837 ; G 3995 -U 10296 ; WX 732 ; N uni2838 ; G 3996 -U 10297 ; WX 732 ; N uni2839 ; G 3997 -U 10298 ; WX 732 ; N uni283A ; G 3998 -U 10299 ; WX 732 ; N uni283B ; G 3999 -U 10300 ; WX 732 ; N uni283C ; G 4000 -U 10301 ; WX 732 ; N uni283D ; G 4001 -U 10302 ; WX 732 ; N uni283E ; G 4002 -U 10303 ; WX 732 ; N uni283F ; G 4003 -U 10304 ; WX 732 ; N uni2840 ; G 4004 -U 10305 ; WX 732 ; N uni2841 ; G 4005 -U 10306 ; WX 732 ; N uni2842 ; G 4006 -U 10307 ; WX 732 ; N uni2843 ; G 4007 -U 10308 ; WX 732 ; N uni2844 ; G 4008 -U 10309 ; WX 732 ; N uni2845 ; G 4009 -U 10310 ; WX 732 ; N uni2846 ; G 4010 -U 10311 ; WX 732 ; N uni2847 ; G 4011 -U 10312 ; WX 732 ; N uni2848 ; G 4012 -U 10313 ; WX 732 ; N uni2849 ; G 4013 -U 10314 ; WX 732 ; N uni284A ; G 4014 -U 10315 ; WX 732 ; N uni284B ; G 4015 -U 10316 ; WX 732 ; N uni284C ; G 4016 -U 10317 ; WX 732 ; N uni284D ; G 4017 -U 10318 ; WX 732 ; N uni284E ; G 4018 -U 10319 ; WX 732 ; N uni284F ; G 4019 -U 10320 ; WX 732 ; N uni2850 ; G 4020 -U 10321 ; WX 732 ; N uni2851 ; G 4021 -U 10322 ; WX 732 ; N uni2852 ; G 4022 -U 10323 ; WX 732 ; N uni2853 ; G 4023 -U 10324 ; WX 732 ; N uni2854 ; G 4024 -U 10325 ; WX 732 ; N uni2855 ; G 4025 -U 10326 ; WX 732 ; N uni2856 ; G 4026 -U 10327 ; WX 732 ; N uni2857 ; G 4027 -U 10328 ; WX 732 ; N uni2858 ; G 4028 -U 10329 ; WX 732 ; N uni2859 ; G 4029 -U 10330 ; WX 732 ; N uni285A ; G 4030 -U 10331 ; WX 732 ; N uni285B ; G 4031 -U 10332 ; WX 732 ; N uni285C ; G 4032 -U 10333 ; WX 732 ; N uni285D ; G 4033 -U 10334 ; WX 732 ; N uni285E ; G 4034 -U 10335 ; WX 732 ; N uni285F ; G 4035 -U 10336 ; WX 732 ; N uni2860 ; G 4036 -U 10337 ; WX 732 ; N uni2861 ; G 4037 -U 10338 ; WX 732 ; N uni2862 ; G 4038 -U 10339 ; WX 732 ; N uni2863 ; G 4039 -U 10340 ; WX 732 ; N uni2864 ; G 4040 -U 10341 ; WX 732 ; N uni2865 ; G 4041 -U 10342 ; WX 732 ; N uni2866 ; G 4042 -U 10343 ; WX 732 ; N uni2867 ; G 4043 -U 10344 ; WX 732 ; N uni2868 ; G 4044 -U 10345 ; WX 732 ; N uni2869 ; G 4045 -U 10346 ; WX 732 ; N uni286A ; G 4046 -U 10347 ; WX 732 ; N uni286B ; G 4047 -U 10348 ; WX 732 ; N uni286C ; G 4048 -U 10349 ; WX 732 ; N uni286D ; G 4049 -U 10350 ; WX 732 ; N uni286E ; G 4050 -U 10351 ; WX 732 ; N uni286F ; G 4051 -U 10352 ; WX 732 ; N uni2870 ; G 4052 -U 10353 ; WX 732 ; N uni2871 ; G 4053 -U 10354 ; WX 732 ; N uni2872 ; G 4054 -U 10355 ; WX 732 ; N uni2873 ; G 4055 -U 10356 ; WX 732 ; N uni2874 ; G 4056 -U 10357 ; WX 732 ; N uni2875 ; G 4057 -U 10358 ; WX 732 ; N uni2876 ; G 4058 -U 10359 ; WX 732 ; N uni2877 ; G 4059 -U 10360 ; WX 732 ; N uni2878 ; G 4060 -U 10361 ; WX 732 ; N uni2879 ; G 4061 -U 10362 ; WX 732 ; N uni287A ; G 4062 -U 10363 ; WX 732 ; N uni287B ; G 4063 -U 10364 ; WX 732 ; N uni287C ; G 4064 -U 10365 ; WX 732 ; N uni287D ; G 4065 -U 10366 ; WX 732 ; N uni287E ; G 4066 -U 10367 ; WX 732 ; N uni287F ; G 4067 -U 10368 ; WX 732 ; N uni2880 ; G 4068 -U 10369 ; WX 732 ; N uni2881 ; G 4069 -U 10370 ; WX 732 ; N uni2882 ; G 4070 -U 10371 ; WX 732 ; N uni2883 ; G 4071 -U 10372 ; WX 732 ; N uni2884 ; G 4072 -U 10373 ; WX 732 ; N uni2885 ; G 4073 -U 10374 ; WX 732 ; N uni2886 ; G 4074 -U 10375 ; WX 732 ; N uni2887 ; G 4075 -U 10376 ; WX 732 ; N uni2888 ; G 4076 -U 10377 ; WX 732 ; N uni2889 ; G 4077 -U 10378 ; WX 732 ; N uni288A ; G 4078 -U 10379 ; WX 732 ; N uni288B ; G 4079 -U 10380 ; WX 732 ; N uni288C ; G 4080 -U 10381 ; WX 732 ; N uni288D ; G 4081 -U 10382 ; WX 732 ; N uni288E ; G 4082 -U 10383 ; WX 732 ; N uni288F ; G 4083 -U 10384 ; WX 732 ; N uni2890 ; G 4084 -U 10385 ; WX 732 ; N uni2891 ; G 4085 -U 10386 ; WX 732 ; N uni2892 ; G 4086 -U 10387 ; WX 732 ; N uni2893 ; G 4087 -U 10388 ; WX 732 ; N uni2894 ; G 4088 -U 10389 ; WX 732 ; N uni2895 ; G 4089 -U 10390 ; WX 732 ; N uni2896 ; G 4090 -U 10391 ; WX 732 ; N uni2897 ; G 4091 -U 10392 ; WX 732 ; N uni2898 ; G 4092 -U 10393 ; WX 732 ; N uni2899 ; G 4093 -U 10394 ; WX 732 ; N uni289A ; G 4094 -U 10395 ; WX 732 ; N uni289B ; G 4095 -U 10396 ; WX 732 ; N uni289C ; G 4096 -U 10397 ; WX 732 ; N uni289D ; G 4097 -U 10398 ; WX 732 ; N uni289E ; G 4098 -U 10399 ; WX 732 ; N uni289F ; G 4099 -U 10400 ; WX 732 ; N uni28A0 ; G 4100 -U 10401 ; WX 732 ; N uni28A1 ; G 4101 -U 10402 ; WX 732 ; N uni28A2 ; G 4102 -U 10403 ; WX 732 ; N uni28A3 ; G 4103 -U 10404 ; WX 732 ; N uni28A4 ; G 4104 -U 10405 ; WX 732 ; N uni28A5 ; G 4105 -U 10406 ; WX 732 ; N uni28A6 ; G 4106 -U 10407 ; WX 732 ; N uni28A7 ; G 4107 -U 10408 ; WX 732 ; N uni28A8 ; G 4108 -U 10409 ; WX 732 ; N uni28A9 ; G 4109 -U 10410 ; WX 732 ; N uni28AA ; G 4110 -U 10411 ; WX 732 ; N uni28AB ; G 4111 -U 10412 ; WX 732 ; N uni28AC ; G 4112 -U 10413 ; WX 732 ; N uni28AD ; G 4113 -U 10414 ; WX 732 ; N uni28AE ; G 4114 -U 10415 ; WX 732 ; N uni28AF ; G 4115 -U 10416 ; WX 732 ; N uni28B0 ; G 4116 -U 10417 ; WX 732 ; N uni28B1 ; G 4117 -U 10418 ; WX 732 ; N uni28B2 ; G 4118 -U 10419 ; WX 732 ; N uni28B3 ; G 4119 -U 10420 ; WX 732 ; N uni28B4 ; G 4120 -U 10421 ; WX 732 ; N uni28B5 ; G 4121 -U 10422 ; WX 732 ; N uni28B6 ; G 4122 -U 10423 ; WX 732 ; N uni28B7 ; G 4123 -U 10424 ; WX 732 ; N uni28B8 ; G 4124 -U 10425 ; WX 732 ; N uni28B9 ; G 4125 -U 10426 ; WX 732 ; N uni28BA ; G 4126 -U 10427 ; WX 732 ; N uni28BB ; G 4127 -U 10428 ; WX 732 ; N uni28BC ; G 4128 -U 10429 ; WX 732 ; N uni28BD ; G 4129 -U 10430 ; WX 732 ; N uni28BE ; G 4130 -U 10431 ; WX 732 ; N uni28BF ; G 4131 -U 10432 ; WX 732 ; N uni28C0 ; G 4132 -U 10433 ; WX 732 ; N uni28C1 ; G 4133 -U 10434 ; WX 732 ; N uni28C2 ; G 4134 -U 10435 ; WX 732 ; N uni28C3 ; G 4135 -U 10436 ; WX 732 ; N uni28C4 ; G 4136 -U 10437 ; WX 732 ; N uni28C5 ; G 4137 -U 10438 ; WX 732 ; N uni28C6 ; G 4138 -U 10439 ; WX 732 ; N uni28C7 ; G 4139 -U 10440 ; WX 732 ; N uni28C8 ; G 4140 -U 10441 ; WX 732 ; N uni28C9 ; G 4141 -U 10442 ; WX 732 ; N uni28CA ; G 4142 -U 10443 ; WX 732 ; N uni28CB ; G 4143 -U 10444 ; WX 732 ; N uni28CC ; G 4144 -U 10445 ; WX 732 ; N uni28CD ; G 4145 -U 10446 ; WX 732 ; N uni28CE ; G 4146 -U 10447 ; WX 732 ; N uni28CF ; G 4147 -U 10448 ; WX 732 ; N uni28D0 ; G 4148 -U 10449 ; WX 732 ; N uni28D1 ; G 4149 -U 10450 ; WX 732 ; N uni28D2 ; G 4150 -U 10451 ; WX 732 ; N uni28D3 ; G 4151 -U 10452 ; WX 732 ; N uni28D4 ; G 4152 -U 10453 ; WX 732 ; N uni28D5 ; G 4153 -U 10454 ; WX 732 ; N uni28D6 ; G 4154 -U 10455 ; WX 732 ; N uni28D7 ; G 4155 -U 10456 ; WX 732 ; N uni28D8 ; G 4156 -U 10457 ; WX 732 ; N uni28D9 ; G 4157 -U 10458 ; WX 732 ; N uni28DA ; G 4158 -U 10459 ; WX 732 ; N uni28DB ; G 4159 -U 10460 ; WX 732 ; N uni28DC ; G 4160 -U 10461 ; WX 732 ; N uni28DD ; G 4161 -U 10462 ; WX 732 ; N uni28DE ; G 4162 -U 10463 ; WX 732 ; N uni28DF ; G 4163 -U 10464 ; WX 732 ; N uni28E0 ; G 4164 -U 10465 ; WX 732 ; N uni28E1 ; G 4165 -U 10466 ; WX 732 ; N uni28E2 ; G 4166 -U 10467 ; WX 732 ; N uni28E3 ; G 4167 -U 10468 ; WX 732 ; N uni28E4 ; G 4168 -U 10469 ; WX 732 ; N uni28E5 ; G 4169 -U 10470 ; WX 732 ; N uni28E6 ; G 4170 -U 10471 ; WX 732 ; N uni28E7 ; G 4171 -U 10472 ; WX 732 ; N uni28E8 ; G 4172 -U 10473 ; WX 732 ; N uni28E9 ; G 4173 -U 10474 ; WX 732 ; N uni28EA ; G 4174 -U 10475 ; WX 732 ; N uni28EB ; G 4175 -U 10476 ; WX 732 ; N uni28EC ; G 4176 -U 10477 ; WX 732 ; N uni28ED ; G 4177 -U 10478 ; WX 732 ; N uni28EE ; G 4178 -U 10479 ; WX 732 ; N uni28EF ; G 4179 -U 10480 ; WX 732 ; N uni28F0 ; G 4180 -U 10481 ; WX 732 ; N uni28F1 ; G 4181 -U 10482 ; WX 732 ; N uni28F2 ; G 4182 -U 10483 ; WX 732 ; N uni28F3 ; G 4183 -U 10484 ; WX 732 ; N uni28F4 ; G 4184 -U 10485 ; WX 732 ; N uni28F5 ; G 4185 -U 10486 ; WX 732 ; N uni28F6 ; G 4186 -U 10487 ; WX 732 ; N uni28F7 ; G 4187 -U 10488 ; WX 732 ; N uni28F8 ; G 4188 -U 10489 ; WX 732 ; N uni28F9 ; G 4189 -U 10490 ; WX 732 ; N uni28FA ; G 4190 -U 10491 ; WX 732 ; N uni28FB ; G 4191 -U 10492 ; WX 732 ; N uni28FC ; G 4192 -U 10493 ; WX 732 ; N uni28FD ; G 4193 -U 10494 ; WX 732 ; N uni28FE ; G 4194 -U 10495 ; WX 732 ; N uni28FF ; G 4195 -U 10502 ; WX 838 ; N uni2906 ; G 4196 -U 10503 ; WX 838 ; N uni2907 ; G 4197 -U 10506 ; WX 838 ; N uni290A ; G 4198 -U 10507 ; WX 838 ; N uni290B ; G 4199 -U 10560 ; WX 683 ; N uni2940 ; G 4200 -U 10561 ; WX 683 ; N uni2941 ; G 4201 -U 10627 ; WX 734 ; N uni2983 ; G 4202 -U 10628 ; WX 734 ; N uni2984 ; G 4203 -U 10702 ; WX 838 ; N uni29CE ; G 4204 -U 10703 ; WX 1000 ; N uni29CF ; G 4205 -U 10704 ; WX 1000 ; N uni29D0 ; G 4206 -U 10705 ; WX 1000 ; N uni29D1 ; G 4207 -U 10706 ; WX 1000 ; N uni29D2 ; G 4208 -U 10707 ; WX 1000 ; N uni29D3 ; G 4209 -U 10708 ; WX 1000 ; N uni29D4 ; G 4210 -U 10709 ; WX 1000 ; N uni29D5 ; G 4211 -U 10731 ; WX 494 ; N uni29EB ; G 4212 -U 10746 ; WX 838 ; N uni29FA ; G 4213 -U 10747 ; WX 838 ; N uni29FB ; G 4214 -U 10752 ; WX 1000 ; N uni2A00 ; G 4215 -U 10753 ; WX 1000 ; N uni2A01 ; G 4216 -U 10754 ; WX 1000 ; N uni2A02 ; G 4217 -U 10764 ; WX 1325 ; N uni2A0C ; G 4218 -U 10765 ; WX 521 ; N uni2A0D ; G 4219 -U 10766 ; WX 521 ; N uni2A0E ; G 4220 -U 10767 ; WX 521 ; N uni2A0F ; G 4221 -U 10768 ; WX 521 ; N uni2A10 ; G 4222 -U 10769 ; WX 521 ; N uni2A11 ; G 4223 -U 10770 ; WX 521 ; N uni2A12 ; G 4224 -U 10771 ; WX 521 ; N uni2A13 ; G 4225 -U 10772 ; WX 521 ; N uni2A14 ; G 4226 -U 10773 ; WX 521 ; N uni2A15 ; G 4227 -U 10774 ; WX 521 ; N uni2A16 ; G 4228 -U 10775 ; WX 521 ; N uni2A17 ; G 4229 -U 10776 ; WX 521 ; N uni2A18 ; G 4230 -U 10777 ; WX 521 ; N uni2A19 ; G 4231 -U 10778 ; WX 521 ; N uni2A1A ; G 4232 -U 10779 ; WX 521 ; N uni2A1B ; G 4233 -U 10780 ; WX 521 ; N uni2A1C ; G 4234 -U 10799 ; WX 838 ; N uni2A2F ; G 4235 -U 10858 ; WX 838 ; N uni2A6A ; G 4236 -U 10859 ; WX 838 ; N uni2A6B ; G 4237 -U 10877 ; WX 838 ; N uni2A7D ; G 4238 -U 10878 ; WX 838 ; N uni2A7E ; G 4239 -U 10879 ; WX 838 ; N uni2A7F ; G 4240 -U 10880 ; WX 838 ; N uni2A80 ; G 4241 -U 10881 ; WX 838 ; N uni2A81 ; G 4242 -U 10882 ; WX 838 ; N uni2A82 ; G 4243 -U 10883 ; WX 838 ; N uni2A83 ; G 4244 -U 10884 ; WX 838 ; N uni2A84 ; G 4245 -U 10885 ; WX 838 ; N uni2A85 ; G 4246 -U 10886 ; WX 838 ; N uni2A86 ; G 4247 -U 10887 ; WX 838 ; N uni2A87 ; G 4248 -U 10888 ; WX 838 ; N uni2A88 ; G 4249 -U 10889 ; WX 838 ; N uni2A89 ; G 4250 -U 10890 ; WX 838 ; N uni2A8A ; G 4251 -U 10891 ; WX 838 ; N uni2A8B ; G 4252 -U 10892 ; WX 838 ; N uni2A8C ; G 4253 -U 10893 ; WX 838 ; N uni2A8D ; G 4254 -U 10894 ; WX 838 ; N uni2A8E ; G 4255 -U 10895 ; WX 838 ; N uni2A8F ; G 4256 -U 10896 ; WX 838 ; N uni2A90 ; G 4257 -U 10897 ; WX 838 ; N uni2A91 ; G 4258 -U 10898 ; WX 838 ; N uni2A92 ; G 4259 -U 10899 ; WX 838 ; N uni2A93 ; G 4260 -U 10900 ; WX 838 ; N uni2A94 ; G 4261 -U 10901 ; WX 838 ; N uni2A95 ; G 4262 -U 10902 ; WX 838 ; N uni2A96 ; G 4263 -U 10903 ; WX 838 ; N uni2A97 ; G 4264 -U 10904 ; WX 838 ; N uni2A98 ; G 4265 -U 10905 ; WX 838 ; N uni2A99 ; G 4266 -U 10906 ; WX 838 ; N uni2A9A ; G 4267 -U 10907 ; WX 838 ; N uni2A9B ; G 4268 -U 10908 ; WX 838 ; N uni2A9C ; G 4269 -U 10909 ; WX 838 ; N uni2A9D ; G 4270 -U 10910 ; WX 838 ; N uni2A9E ; G 4271 -U 10911 ; WX 838 ; N uni2A9F ; G 4272 -U 10912 ; WX 838 ; N uni2AA0 ; G 4273 -U 10926 ; WX 838 ; N uni2AAE ; G 4274 -U 10927 ; WX 838 ; N uni2AAF ; G 4275 -U 10928 ; WX 838 ; N uni2AB0 ; G 4276 -U 10929 ; WX 838 ; N uni2AB1 ; G 4277 -U 10930 ; WX 838 ; N uni2AB2 ; G 4278 -U 10931 ; WX 838 ; N uni2AB3 ; G 4279 -U 10932 ; WX 838 ; N uni2AB4 ; G 4280 -U 10933 ; WX 838 ; N uni2AB5 ; G 4281 -U 10934 ; WX 838 ; N uni2AB6 ; G 4282 -U 10935 ; WX 838 ; N uni2AB7 ; G 4283 -U 10936 ; WX 838 ; N uni2AB8 ; G 4284 -U 10937 ; WX 838 ; N uni2AB9 ; G 4285 -U 10938 ; WX 838 ; N uni2ABA ; G 4286 -U 11001 ; WX 838 ; N uni2AF9 ; G 4287 -U 11002 ; WX 838 ; N uni2AFA ; G 4288 -U 11008 ; WX 838 ; N uni2B00 ; G 4289 -U 11009 ; WX 838 ; N uni2B01 ; G 4290 -U 11010 ; WX 838 ; N uni2B02 ; G 4291 -U 11011 ; WX 838 ; N uni2B03 ; G 4292 -U 11012 ; WX 838 ; N uni2B04 ; G 4293 -U 11013 ; WX 838 ; N uni2B05 ; G 4294 -U 11014 ; WX 838 ; N uni2B06 ; G 4295 -U 11015 ; WX 838 ; N uni2B07 ; G 4296 -U 11016 ; WX 838 ; N uni2B08 ; G 4297 -U 11017 ; WX 838 ; N uni2B09 ; G 4298 -U 11018 ; WX 838 ; N uni2B0A ; G 4299 -U 11019 ; WX 838 ; N uni2B0B ; G 4300 -U 11020 ; WX 838 ; N uni2B0C ; G 4301 -U 11021 ; WX 838 ; N uni2B0D ; G 4302 -U 11022 ; WX 836 ; N uni2B0E ; G 4303 -U 11023 ; WX 836 ; N uni2B0F ; G 4304 -U 11024 ; WX 836 ; N uni2B10 ; G 4305 -U 11025 ; WX 836 ; N uni2B11 ; G 4306 -U 11026 ; WX 945 ; N uni2B12 ; G 4307 -U 11027 ; WX 945 ; N uni2B13 ; G 4308 -U 11028 ; WX 945 ; N uni2B14 ; G 4309 -U 11029 ; WX 945 ; N uni2B15 ; G 4310 -U 11030 ; WX 769 ; N uni2B16 ; G 4311 -U 11031 ; WX 769 ; N uni2B17 ; G 4312 -U 11032 ; WX 769 ; N uni2B18 ; G 4313 -U 11033 ; WX 769 ; N uni2B19 ; G 4314 -U 11034 ; WX 945 ; N uni2B1A ; G 4315 -U 11039 ; WX 869 ; N uni2B1F ; G 4316 -U 11040 ; WX 869 ; N uni2B20 ; G 4317 -U 11041 ; WX 873 ; N uni2B21 ; G 4318 -U 11042 ; WX 873 ; N uni2B22 ; G 4319 -U 11043 ; WX 873 ; N uni2B23 ; G 4320 -U 11044 ; WX 1119 ; N uni2B24 ; G 4321 -U 11091 ; WX 869 ; N uni2B53 ; G 4322 -U 11092 ; WX 869 ; N uni2B54 ; G 4323 -U 11360 ; WX 557 ; N uni2C60 ; G 4324 -U 11361 ; WX 278 ; N uni2C61 ; G 4325 -U 11362 ; WX 557 ; N uni2C62 ; G 4326 -U 11363 ; WX 603 ; N uni2C63 ; G 4327 -U 11364 ; WX 695 ; N uni2C64 ; G 4328 -U 11365 ; WX 613 ; N uni2C65 ; G 4329 -U 11366 ; WX 392 ; N uni2C66 ; G 4330 -U 11367 ; WX 752 ; N uni2C67 ; G 4331 -U 11368 ; WX 634 ; N uni2C68 ; G 4332 -U 11369 ; WX 656 ; N uni2C69 ; G 4333 -U 11370 ; WX 579 ; N uni2C6A ; G 4334 -U 11371 ; WX 685 ; N uni2C6B ; G 4335 -U 11372 ; WX 525 ; N uni2C6C ; G 4336 -U 11373 ; WX 781 ; N uni2C6D ; G 4337 -U 11374 ; WX 863 ; N uni2C6E ; G 4338 -U 11375 ; WX 684 ; N uni2C6F ; G 4339 -U 11376 ; WX 781 ; N uni2C70 ; G 4340 -U 11377 ; WX 734 ; N uni2C71 ; G 4341 -U 11378 ; WX 1128 ; N uni2C72 ; G 4342 -U 11379 ; WX 961 ; N uni2C73 ; G 4343 -U 11380 ; WX 592 ; N uni2C74 ; G 4344 -U 11381 ; WX 654 ; N uni2C75 ; G 4345 -U 11382 ; WX 568 ; N uni2C76 ; G 4346 -U 11383 ; WX 660 ; N uni2C77 ; G 4347 -U 11385 ; WX 414 ; N uni2C79 ; G 4348 -U 11386 ; WX 612 ; N uni2C7A ; G 4349 -U 11387 ; WX 491 ; N uni2C7B ; G 4350 -U 11388 ; WX 175 ; N uni2C7C ; G 4351 -U 11389 ; WX 431 ; N uni2C7D ; G 4352 -U 11390 ; WX 635 ; N uni2C7E ; G 4353 -U 11391 ; WX 685 ; N uni2C7F ; G 4354 -U 11520 ; WX 591 ; N uni2D00 ; G 4355 -U 11521 ; WX 595 ; N uni2D01 ; G 4356 -U 11522 ; WX 564 ; N uni2D02 ; G 4357 -U 11523 ; WX 602 ; N uni2D03 ; G 4358 -U 11524 ; WX 587 ; N uni2D04 ; G 4359 -U 11525 ; WX 911 ; N uni2D05 ; G 4360 -U 11526 ; WX 626 ; N uni2D06 ; G 4361 -U 11527 ; WX 952 ; N uni2D07 ; G 4362 -U 11528 ; WX 595 ; N uni2D08 ; G 4363 -U 11529 ; WX 607 ; N uni2D09 ; G 4364 -U 11530 ; WX 954 ; N uni2D0A ; G 4365 -U 11531 ; WX 620 ; N uni2D0B ; G 4366 -U 11532 ; WX 595 ; N uni2D0C ; G 4367 -U 11533 ; WX 926 ; N uni2D0D ; G 4368 -U 11534 ; WX 595 ; N uni2D0E ; G 4369 -U 11535 ; WX 806 ; N uni2D0F ; G 4370 -U 11536 ; WX 931 ; N uni2D10 ; G 4371 -U 11537 ; WX 584 ; N uni2D11 ; G 4372 -U 11538 ; WX 592 ; N uni2D12 ; G 4373 -U 11539 ; WX 923 ; N uni2D13 ; G 4374 -U 11540 ; WX 953 ; N uni2D14 ; G 4375 -U 11541 ; WX 828 ; N uni2D15 ; G 4376 -U 11542 ; WX 596 ; N uni2D16 ; G 4377 -U 11543 ; WX 595 ; N uni2D17 ; G 4378 -U 11544 ; WX 590 ; N uni2D18 ; G 4379 -U 11545 ; WX 592 ; N uni2D19 ; G 4380 -U 11546 ; WX 592 ; N uni2D1A ; G 4381 -U 11547 ; WX 621 ; N uni2D1B ; G 4382 -U 11548 ; WX 920 ; N uni2D1C ; G 4383 -U 11549 ; WX 589 ; N uni2D1D ; G 4384 -U 11550 ; WX 586 ; N uni2D1E ; G 4385 -U 11551 ; WX 581 ; N uni2D1F ; G 4386 -U 11552 ; WX 914 ; N uni2D20 ; G 4387 -U 11553 ; WX 596 ; N uni2D21 ; G 4388 -U 11554 ; WX 595 ; N uni2D22 ; G 4389 -U 11555 ; WX 592 ; N uni2D23 ; G 4390 -U 11556 ; WX 642 ; N uni2D24 ; G 4391 -U 11557 ; WX 901 ; N uni2D25 ; G 4392 -U 11800 ; WX 531 ; N uni2E18 ; G 4393 -U 11807 ; WX 838 ; N uni2E1F ; G 4394 -U 11810 ; WX 390 ; N uni2E22 ; G 4395 -U 11811 ; WX 390 ; N uni2E23 ; G 4396 -U 11812 ; WX 390 ; N uni2E24 ; G 4397 -U 11813 ; WX 390 ; N uni2E25 ; G 4398 -U 11822 ; WX 531 ; N uni2E2E ; G 4399 -U 19904 ; WX 896 ; N uni4DC0 ; G 4400 -U 19905 ; WX 896 ; N uni4DC1 ; G 4401 -U 19906 ; WX 896 ; N uni4DC2 ; G 4402 -U 19907 ; WX 896 ; N uni4DC3 ; G 4403 -U 19908 ; WX 896 ; N uni4DC4 ; G 4404 -U 19909 ; WX 896 ; N uni4DC5 ; G 4405 -U 19910 ; WX 896 ; N uni4DC6 ; G 4406 -U 19911 ; WX 896 ; N uni4DC7 ; G 4407 -U 19912 ; WX 896 ; N uni4DC8 ; G 4408 -U 19913 ; WX 896 ; N uni4DC9 ; G 4409 -U 19914 ; WX 896 ; N uni4DCA ; G 4410 -U 19915 ; WX 896 ; N uni4DCB ; G 4411 -U 19916 ; WX 896 ; N uni4DCC ; G 4412 -U 19917 ; WX 896 ; N uni4DCD ; G 4413 -U 19918 ; WX 896 ; N uni4DCE ; G 4414 -U 19919 ; WX 896 ; N uni4DCF ; G 4415 -U 19920 ; WX 896 ; N uni4DD0 ; G 4416 -U 19921 ; WX 896 ; N uni4DD1 ; G 4417 -U 19922 ; WX 896 ; N uni4DD2 ; G 4418 -U 19923 ; WX 896 ; N uni4DD3 ; G 4419 -U 19924 ; WX 896 ; N uni4DD4 ; G 4420 -U 19925 ; WX 896 ; N uni4DD5 ; G 4421 -U 19926 ; WX 896 ; N uni4DD6 ; G 4422 -U 19927 ; WX 896 ; N uni4DD7 ; G 4423 -U 19928 ; WX 896 ; N uni4DD8 ; G 4424 -U 19929 ; WX 896 ; N uni4DD9 ; G 4425 -U 19930 ; WX 896 ; N uni4DDA ; G 4426 -U 19931 ; WX 896 ; N uni4DDB ; G 4427 -U 19932 ; WX 896 ; N uni4DDC ; G 4428 -U 19933 ; WX 896 ; N uni4DDD ; G 4429 -U 19934 ; WX 896 ; N uni4DDE ; G 4430 -U 19935 ; WX 896 ; N uni4DDF ; G 4431 -U 19936 ; WX 896 ; N uni4DE0 ; G 4432 -U 19937 ; WX 896 ; N uni4DE1 ; G 4433 -U 19938 ; WX 896 ; N uni4DE2 ; G 4434 -U 19939 ; WX 896 ; N uni4DE3 ; G 4435 -U 19940 ; WX 896 ; N uni4DE4 ; G 4436 -U 19941 ; WX 896 ; N uni4DE5 ; G 4437 -U 19942 ; WX 896 ; N uni4DE6 ; G 4438 -U 19943 ; WX 896 ; N uni4DE7 ; G 4439 -U 19944 ; WX 896 ; N uni4DE8 ; G 4440 -U 19945 ; WX 896 ; N uni4DE9 ; G 4441 -U 19946 ; WX 896 ; N uni4DEA ; G 4442 -U 19947 ; WX 896 ; N uni4DEB ; G 4443 -U 19948 ; WX 896 ; N uni4DEC ; G 4444 -U 19949 ; WX 896 ; N uni4DED ; G 4445 -U 19950 ; WX 896 ; N uni4DEE ; G 4446 -U 19951 ; WX 896 ; N uni4DEF ; G 4447 -U 19952 ; WX 896 ; N uni4DF0 ; G 4448 -U 19953 ; WX 896 ; N uni4DF1 ; G 4449 -U 19954 ; WX 896 ; N uni4DF2 ; G 4450 -U 19955 ; WX 896 ; N uni4DF3 ; G 4451 -U 19956 ; WX 896 ; N uni4DF4 ; G 4452 -U 19957 ; WX 896 ; N uni4DF5 ; G 4453 -U 19958 ; WX 896 ; N uni4DF6 ; G 4454 -U 19959 ; WX 896 ; N uni4DF7 ; G 4455 -U 19960 ; WX 896 ; N uni4DF8 ; G 4456 -U 19961 ; WX 896 ; N uni4DF9 ; G 4457 -U 19962 ; WX 896 ; N uni4DFA ; G 4458 -U 19963 ; WX 896 ; N uni4DFB ; G 4459 -U 19964 ; WX 896 ; N uni4DFC ; G 4460 -U 19965 ; WX 896 ; N uni4DFD ; G 4461 -U 19966 ; WX 896 ; N uni4DFE ; G 4462 -U 19967 ; WX 896 ; N uni4DFF ; G 4463 -U 42192 ; WX 686 ; N uniA4D0 ; G 4464 -U 42193 ; WX 603 ; N uniA4D1 ; G 4465 -U 42194 ; WX 603 ; N uniA4D2 ; G 4466 -U 42195 ; WX 770 ; N uniA4D3 ; G 4467 -U 42196 ; WX 611 ; N uniA4D4 ; G 4468 -U 42197 ; WX 611 ; N uniA4D5 ; G 4469 -U 42198 ; WX 775 ; N uniA4D6 ; G 4470 -U 42199 ; WX 656 ; N uniA4D7 ; G 4471 -U 42200 ; WX 656 ; N uniA4D8 ; G 4472 -U 42201 ; WX 512 ; N uniA4D9 ; G 4473 -U 42202 ; WX 698 ; N uniA4DA ; G 4474 -U 42203 ; WX 703 ; N uniA4DB ; G 4475 -U 42204 ; WX 685 ; N uniA4DC ; G 4476 -U 42205 ; WX 575 ; N uniA4DD ; G 4477 -U 42206 ; WX 575 ; N uniA4DE ; G 4478 -U 42207 ; WX 863 ; N uniA4DF ; G 4479 -U 42208 ; WX 748 ; N uniA4E0 ; G 4480 -U 42209 ; WX 557 ; N uniA4E1 ; G 4481 -U 42210 ; WX 635 ; N uniA4E2 ; G 4482 -U 42211 ; WX 695 ; N uniA4E3 ; G 4483 -U 42212 ; WX 695 ; N uniA4E4 ; G 4484 -U 42213 ; WX 684 ; N uniA4E5 ; G 4485 -U 42214 ; WX 684 ; N uniA4E6 ; G 4486 -U 42215 ; WX 752 ; N uniA4E7 ; G 4487 -U 42216 ; WX 775 ; N uniA4E8 ; G 4488 -U 42217 ; WX 512 ; N uniA4E9 ; G 4489 -U 42218 ; WX 989 ; N uniA4EA ; G 4490 -U 42219 ; WX 685 ; N uniA4EB ; G 4491 -U 42220 ; WX 611 ; N uniA4EC ; G 4492 -U 42221 ; WX 686 ; N uniA4ED ; G 4493 -U 42222 ; WX 684 ; N uniA4EE ; G 4494 -U 42223 ; WX 684 ; N uniA4EF ; G 4495 -U 42224 ; WX 632 ; N uniA4F0 ; G 4496 -U 42225 ; WX 632 ; N uniA4F1 ; G 4497 -U 42226 ; WX 295 ; N uniA4F2 ; G 4498 -U 42227 ; WX 787 ; N uniA4F3 ; G 4499 -U 42228 ; WX 732 ; N uniA4F4 ; G 4500 -U 42229 ; WX 732 ; N uniA4F5 ; G 4501 -U 42230 ; WX 557 ; N uniA4F6 ; G 4502 -U 42231 ; WX 767 ; N uniA4F7 ; G 4503 -U 42232 ; WX 300 ; N uniA4F8 ; G 4504 -U 42233 ; WX 300 ; N uniA4F9 ; G 4505 -U 42234 ; WX 596 ; N uniA4FA ; G 4506 -U 42235 ; WX 596 ; N uniA4FB ; G 4507 -U 42236 ; WX 300 ; N uniA4FC ; G 4508 -U 42237 ; WX 300 ; N uniA4FD ; G 4509 -U 42238 ; WX 588 ; N uniA4FE ; G 4510 -U 42239 ; WX 588 ; N uniA4FF ; G 4511 -U 42564 ; WX 635 ; N uniA644 ; G 4512 -U 42565 ; WX 521 ; N uniA645 ; G 4513 -U 42566 ; WX 354 ; N uniA646 ; G 4514 -U 42567 ; WX 338 ; N uniA647 ; G 4515 -U 42572 ; WX 1180 ; N uniA64C ; G 4516 -U 42573 ; WX 1028 ; N uniA64D ; G 4517 -U 42576 ; WX 1029 ; N uniA650 ; G 4518 -U 42577 ; WX 906 ; N uniA651 ; G 4519 -U 42580 ; WX 1080 ; N uniA654 ; G 4520 -U 42581 ; WX 842 ; N uniA655 ; G 4521 -U 42582 ; WX 985 ; N uniA656 ; G 4522 -U 42583 ; WX 847 ; N uniA657 ; G 4523 -U 42594 ; WX 1024 ; N uniA662 ; G 4524 -U 42595 ; WX 925 ; N uniA663 ; G 4525 -U 42596 ; WX 1014 ; N uniA664 ; G 4526 -U 42597 ; WX 900 ; N uniA665 ; G 4527 -U 42598 ; WX 863 ; N uniA666 ; G 4528 -U 42599 ; WX 1008 ; N uniA667 ; G 4529 -U 42600 ; WX 787 ; N uniA668 ; G 4530 -U 42601 ; WX 612 ; N uniA669 ; G 4531 -U 42602 ; WX 855 ; N uniA66A ; G 4532 -U 42603 ; WX 712 ; N uniA66B ; G 4533 -U 42604 ; WX 1358 ; N uniA66C ; G 4534 -U 42605 ; WX 1019 ; N uniA66D ; G 4535 -U 42606 ; WX 879 ; N uniA66E ; G 4536 -U 42634 ; WX 805 ; N uniA68A ; G 4537 -U 42635 ; WX 722 ; N uniA68B ; G 4538 -U 42636 ; WX 611 ; N uniA68C ; G 4539 -U 42637 ; WX 583 ; N uniA68D ; G 4540 -U 42644 ; WX 686 ; N uniA694 ; G 4541 -U 42645 ; WX 634 ; N uniA695 ; G 4542 -U 42648 ; WX 1358 ; N uniA698 ; G 4543 -U 42649 ; WX 1019 ; N uniA699 ; G 4544 -U 42760 ; WX 493 ; N uniA708 ; G 4545 -U 42761 ; WX 493 ; N uniA709 ; G 4546 -U 42762 ; WX 493 ; N uniA70A ; G 4547 -U 42763 ; WX 493 ; N uniA70B ; G 4548 -U 42764 ; WX 493 ; N uniA70C ; G 4549 -U 42765 ; WX 493 ; N uniA70D ; G 4550 -U 42766 ; WX 493 ; N uniA70E ; G 4551 -U 42767 ; WX 493 ; N uniA70F ; G 4552 -U 42768 ; WX 493 ; N uniA710 ; G 4553 -U 42769 ; WX 493 ; N uniA711 ; G 4554 -U 42770 ; WX 493 ; N uniA712 ; G 4555 -U 42771 ; WX 493 ; N uniA713 ; G 4556 -U 42772 ; WX 493 ; N uniA714 ; G 4557 -U 42773 ; WX 493 ; N uniA715 ; G 4558 -U 42774 ; WX 493 ; N uniA716 ; G 4559 -U 42779 ; WX 369 ; N uniA71B ; G 4560 -U 42780 ; WX 369 ; N uniA71C ; G 4561 -U 42781 ; WX 252 ; N uniA71D ; G 4562 -U 42782 ; WX 252 ; N uniA71E ; G 4563 -U 42783 ; WX 252 ; N uniA71F ; G 4564 -U 42786 ; WX 385 ; N uniA722 ; G 4565 -U 42787 ; WX 356 ; N uniA723 ; G 4566 -U 42788 ; WX 472 ; N uniA724 ; G 4567 -U 42789 ; WX 472 ; N uniA725 ; G 4568 -U 42790 ; WX 752 ; N uniA726 ; G 4569 -U 42791 ; WX 634 ; N uniA727 ; G 4570 -U 42792 ; WX 878 ; N uniA728 ; G 4571 -U 42793 ; WX 709 ; N uniA729 ; G 4572 -U 42794 ; WX 614 ; N uniA72A ; G 4573 -U 42795 ; WX 541 ; N uniA72B ; G 4574 -U 42800 ; WX 491 ; N uniA730 ; G 4575 -U 42801 ; WX 521 ; N uniA731 ; G 4576 -U 42802 ; WX 1250 ; N uniA732 ; G 4577 -U 42803 ; WX 985 ; N uniA733 ; G 4578 -U 42804 ; WX 1219 ; N uniA734 ; G 4579 -U 42805 ; WX 1000 ; N uniA735 ; G 4580 -U 42806 ; WX 1155 ; N uniA736 ; G 4581 -U 42807 ; WX 996 ; N uniA737 ; G 4582 -U 42808 ; WX 971 ; N uniA738 ; G 4583 -U 42809 ; WX 818 ; N uniA739 ; G 4584 -U 42810 ; WX 971 ; N uniA73A ; G 4585 -U 42811 ; WX 818 ; N uniA73B ; G 4586 -U 42812 ; WX 959 ; N uniA73C ; G 4587 -U 42813 ; WX 818 ; N uniA73D ; G 4588 -U 42814 ; WX 698 ; N uniA73E ; G 4589 -U 42815 ; WX 549 ; N uniA73F ; G 4590 -U 42816 ; WX 656 ; N uniA740 ; G 4591 -U 42817 ; WX 579 ; N uniA741 ; G 4592 -U 42822 ; WX 680 ; N uniA746 ; G 4593 -U 42823 ; WX 392 ; N uniA747 ; G 4594 -U 42824 ; WX 582 ; N uniA748 ; G 4595 -U 42825 ; WX 427 ; N uniA749 ; G 4596 -U 42826 ; WX 807 ; N uniA74A ; G 4597 -U 42827 ; WX 704 ; N uniA74B ; G 4598 -U 42830 ; WX 1358 ; N uniA74E ; G 4599 -U 42831 ; WX 1019 ; N uniA74F ; G 4600 -U 42832 ; WX 603 ; N uniA750 ; G 4601 -U 42833 ; WX 635 ; N uniA751 ; G 4602 -U 42834 ; WX 734 ; N uniA752 ; G 4603 -U 42835 ; WX 774 ; N uniA753 ; G 4604 -U 42838 ; WX 787 ; N uniA756 ; G 4605 -U 42839 ; WX 635 ; N uniA757 ; G 4606 -U 42852 ; WX 605 ; N uniA764 ; G 4607 -U 42853 ; WX 635 ; N uniA765 ; G 4608 -U 42854 ; WX 605 ; N uniA766 ; G 4609 -U 42855 ; WX 635 ; N uniA767 ; G 4610 -U 42880 ; WX 557 ; N uniA780 ; G 4611 -U 42881 ; WX 278 ; N uniA781 ; G 4612 -U 42882 ; WX 735 ; N uniA782 ; G 4613 -U 42883 ; WX 634 ; N uniA783 ; G 4614 -U 42889 ; WX 337 ; N uniA789 ; G 4615 -U 42890 ; WX 376 ; N uniA78A ; G 4616 -U 42891 ; WX 401 ; N uniA78B ; G 4617 -U 42892 ; WX 275 ; N uniA78C ; G 4618 -U 42893 ; WX 686 ; N uniA78D ; G 4619 -U 42894 ; WX 487 ; N uniA78E ; G 4620 -U 42896 ; WX 772 ; N uniA790 ; G 4621 -U 42897 ; WX 667 ; N uniA791 ; G 4622 -U 42912 ; WX 775 ; N uniA7A0 ; G 4623 -U 42913 ; WX 635 ; N uniA7A1 ; G 4624 -U 42914 ; WX 656 ; N uniA7A2 ; G 4625 -U 42915 ; WX 579 ; N uniA7A3 ; G 4626 -U 42916 ; WX 748 ; N uniA7A4 ; G 4627 -U 42917 ; WX 634 ; N uniA7A5 ; G 4628 -U 42918 ; WX 695 ; N uniA7A6 ; G 4629 -U 42919 ; WX 411 ; N uniA7A7 ; G 4630 -U 42920 ; WX 635 ; N uniA7A8 ; G 4631 -U 42921 ; WX 521 ; N uniA7A9 ; G 4632 -U 42922 ; WX 872 ; N uniA7AA ; G 4633 -U 43000 ; WX 577 ; N uniA7F8 ; G 4634 -U 43001 ; WX 644 ; N uniA7F9 ; G 4635 -U 43002 ; WX 915 ; N uniA7FA ; G 4636 -U 43003 ; WX 575 ; N uniA7FB ; G 4637 -U 43004 ; WX 603 ; N uniA7FC ; G 4638 -U 43005 ; WX 863 ; N uniA7FD ; G 4639 -U 43006 ; WX 295 ; N uniA7FE ; G 4640 -U 43007 ; WX 1199 ; N uniA7FF ; G 4641 -U 61184 ; WX 213 ; N uni02E5.5 ; G 4642 -U 61185 ; WX 238 ; N uni02E6.5 ; G 4643 -U 61186 ; WX 257 ; N uni02E7.5 ; G 4644 -U 61187 ; WX 264 ; N uni02E8.5 ; G 4645 -U 61188 ; WX 267 ; N uni02E9.5 ; G 4646 -U 61189 ; WX 238 ; N uni02E5.4 ; G 4647 -U 61190 ; WX 213 ; N uni02E6.4 ; G 4648 -U 61191 ; WX 238 ; N uni02E7.4 ; G 4649 -U 61192 ; WX 257 ; N uni02E8.4 ; G 4650 -U 61193 ; WX 264 ; N uni02E9.4 ; G 4651 -U 61194 ; WX 257 ; N uni02E5.3 ; G 4652 -U 61195 ; WX 238 ; N uni02E6.3 ; G 4653 -U 61196 ; WX 213 ; N uni02E7.3 ; G 4654 -U 61197 ; WX 238 ; N uni02E8.3 ; G 4655 -U 61198 ; WX 257 ; N uni02E9.3 ; G 4656 -U 61199 ; WX 264 ; N uni02E5.2 ; G 4657 -U 61200 ; WX 257 ; N uni02E6.2 ; G 4658 -U 61201 ; WX 238 ; N uni02E7.2 ; G 4659 -U 61202 ; WX 213 ; N uni02E8.2 ; G 4660 -U 61203 ; WX 238 ; N uni02E9.2 ; G 4661 -U 61204 ; WX 267 ; N uni02E5.1 ; G 4662 -U 61205 ; WX 264 ; N uni02E6.1 ; G 4663 -U 61206 ; WX 257 ; N uni02E7.1 ; G 4664 -U 61207 ; WX 238 ; N uni02E8.1 ; G 4665 -U 61208 ; WX 213 ; N uni02E9.1 ; G 4666 -U 61209 ; WX 275 ; N stem ; G 4667 -U 62464 ; WX 580 ; N uniF400 ; G 4668 -U 62465 ; WX 580 ; N uniF401 ; G 4669 -U 62466 ; WX 624 ; N uniF402 ; G 4670 -U 62467 ; WX 889 ; N uniF403 ; G 4671 -U 62468 ; WX 585 ; N uniF404 ; G 4672 -U 62469 ; WX 580 ; N uniF405 ; G 4673 -U 62470 ; WX 653 ; N uniF406 ; G 4674 -U 62471 ; WX 882 ; N uniF407 ; G 4675 -U 62472 ; WX 555 ; N uniF408 ; G 4676 -U 62473 ; WX 580 ; N uniF409 ; G 4677 -U 62474 ; WX 1168 ; N uniF40A ; G 4678 -U 62475 ; WX 589 ; N uniF40B ; G 4679 -U 62476 ; WX 590 ; N uniF40C ; G 4680 -U 62477 ; WX 869 ; N uniF40D ; G 4681 -U 62478 ; WX 580 ; N uniF40E ; G 4682 -U 62479 ; WX 589 ; N uniF40F ; G 4683 -U 62480 ; WX 914 ; N uniF410 ; G 4684 -U 62481 ; WX 590 ; N uniF411 ; G 4685 -U 62482 ; WX 731 ; N uniF412 ; G 4686 -U 62483 ; WX 583 ; N uniF413 ; G 4687 -U 62484 ; WX 872 ; N uniF414 ; G 4688 -U 62485 ; WX 589 ; N uniF415 ; G 4689 -U 62486 ; WX 895 ; N uniF416 ; G 4690 -U 62487 ; WX 589 ; N uniF417 ; G 4691 -U 62488 ; WX 589 ; N uniF418 ; G 4692 -U 62489 ; WX 590 ; N uniF419 ; G 4693 -U 62490 ; WX 649 ; N uniF41A ; G 4694 -U 62491 ; WX 589 ; N uniF41B ; G 4695 -U 62492 ; WX 589 ; N uniF41C ; G 4696 -U 62493 ; WX 599 ; N uniF41D ; G 4697 -U 62494 ; WX 590 ; N uniF41E ; G 4698 -U 62495 ; WX 516 ; N uniF41F ; G 4699 -U 62496 ; WX 580 ; N uniF420 ; G 4700 -U 62497 ; WX 584 ; N uniF421 ; G 4701 -U 62498 ; WX 580 ; N uniF422 ; G 4702 -U 62499 ; WX 580 ; N uniF423 ; G 4703 -U 62500 ; WX 581 ; N uniF424 ; G 4704 -U 62501 ; WX 638 ; N uniF425 ; G 4705 -U 62502 ; WX 955 ; N uniF426 ; G 4706 -U 62504 ; WX 931 ; N uniF428 ; G 4707 -U 62505 ; WX 808 ; N uniF429 ; G 4708 -U 62506 ; WX 508 ; N uniF42A ; G 4709 -U 62507 ; WX 508 ; N uniF42B ; G 4710 -U 62508 ; WX 508 ; N uniF42C ; G 4711 -U 62509 ; WX 508 ; N uniF42D ; G 4712 -U 62510 ; WX 508 ; N uniF42E ; G 4713 -U 62511 ; WX 508 ; N uniF42F ; G 4714 -U 62512 ; WX 508 ; N uniF430 ; G 4715 -U 62513 ; WX 508 ; N uniF431 ; G 4716 -U 62514 ; WX 508 ; N uniF432 ; G 4717 -U 62515 ; WX 508 ; N uniF433 ; G 4718 -U 62516 ; WX 518 ; N uniF434 ; G 4719 -U 62517 ; WX 518 ; N uniF435 ; G 4720 -U 62518 ; WX 518 ; N uniF436 ; G 4721 -U 62519 ; WX 787 ; N uniF437 ; G 4722 -U 62520 ; WX 787 ; N uniF438 ; G 4723 -U 62521 ; WX 787 ; N uniF439 ; G 4724 -U 62522 ; WX 787 ; N uniF43A ; G 4725 -U 62523 ; WX 787 ; N uniF43B ; G 4726 -U 62524 ; WX 546 ; N uniF43C ; G 4727 -U 62525 ; WX 546 ; N uniF43D ; G 4728 -U 62526 ; WX 546 ; N uniF43E ; G 4729 -U 62527 ; WX 546 ; N uniF43F ; G 4730 -U 62528 ; WX 546 ; N uniF440 ; G 4731 -U 62529 ; WX 546 ; N uniF441 ; G 4732 -U 63173 ; WX 612 ; N uniF6C5 ; G 4733 -U 64256 ; WX 722 ; N uniFB00 ; G 4734 -U 64257 ; WX 646 ; N fi ; G 4735 -U 64258 ; WX 646 ; N fl ; G 4736 -U 64259 ; WX 1000 ; N uniFB03 ; G 4737 -U 64260 ; WX 1000 ; N uniFB04 ; G 4738 -U 64261 ; WX 686 ; N uniFB05 ; G 4739 -U 64262 ; WX 861 ; N uniFB06 ; G 4740 -U 64275 ; WX 1202 ; N uniFB13 ; G 4741 -U 64276 ; WX 1202 ; N uniFB14 ; G 4742 -U 64277 ; WX 1196 ; N uniFB15 ; G 4743 -U 64278 ; WX 1186 ; N uniFB16 ; G 4744 -U 64279 ; WX 1529 ; N uniFB17 ; G 4745 -U 64285 ; WX 224 ; N uniFB1D ; G 4746 -U 64286 ; WX 0 ; N uniFB1E ; G 4747 -U 64287 ; WX 471 ; N uniFB1F ; G 4748 -U 64288 ; WX 636 ; N uniFB20 ; G 4749 -U 64289 ; WX 856 ; N uniFB21 ; G 4750 -U 64290 ; WX 774 ; N uniFB22 ; G 4751 -U 64291 ; WX 906 ; N uniFB23 ; G 4752 -U 64292 ; WX 771 ; N uniFB24 ; G 4753 -U 64293 ; WX 843 ; N uniFB25 ; G 4754 -U 64294 ; WX 855 ; N uniFB26 ; G 4755 -U 64295 ; WX 807 ; N uniFB27 ; G 4756 -U 64296 ; WX 875 ; N uniFB28 ; G 4757 -U 64297 ; WX 838 ; N uniFB29 ; G 4758 -U 64298 ; WX 708 ; N uniFB2A ; G 4759 -U 64299 ; WX 708 ; N uniFB2B ; G 4760 -U 64300 ; WX 708 ; N uniFB2C ; G 4761 -U 64301 ; WX 708 ; N uniFB2D ; G 4762 -U 64302 ; WX 668 ; N uniFB2E ; G 4763 -U 64303 ; WX 668 ; N uniFB2F ; G 4764 -U 64304 ; WX 668 ; N uniFB30 ; G 4765 -U 64305 ; WX 578 ; N uniFB31 ; G 4766 -U 64306 ; WX 412 ; N uniFB32 ; G 4767 -U 64307 ; WX 546 ; N uniFB33 ; G 4768 -U 64308 ; WX 653 ; N uniFB34 ; G 4769 -U 64309 ; WX 272 ; N uniFB35 ; G 4770 -U 64310 ; WX 346 ; N uniFB36 ; G 4771 -U 64311 ; WX 1000 ; N uniFB37 ; G 4772 -U 64312 ; WX 648 ; N uniFB38 ; G 4773 -U 64313 ; WX 307 ; N uniFB39 ; G 4774 -U 64314 ; WX 537 ; N uniFB3A ; G 4775 -U 64315 ; WX 529 ; N uniFB3B ; G 4776 -U 64316 ; WX 568 ; N uniFB3C ; G 4777 -U 64317 ; WX 1000 ; N uniFB3D ; G 4778 -U 64318 ; WX 679 ; N uniFB3E ; G 4779 -U 64319 ; WX 1000 ; N uniFB3F ; G 4780 -U 64320 ; WX 400 ; N uniFB40 ; G 4781 -U 64321 ; WX 649 ; N uniFB41 ; G 4782 -U 64322 ; WX 1000 ; N uniFB42 ; G 4783 -U 64323 ; WX 640 ; N uniFB43 ; G 4784 -U 64324 ; WX 625 ; N uniFB44 ; G 4785 -U 64325 ; WX 1000 ; N uniFB45 ; G 4786 -U 64326 ; WX 593 ; N uniFB46 ; G 4787 -U 64327 ; WX 709 ; N uniFB47 ; G 4788 -U 64328 ; WX 564 ; N uniFB48 ; G 4789 -U 64329 ; WX 708 ; N uniFB49 ; G 4790 -U 64330 ; WX 657 ; N uniFB4A ; G 4791 -U 64331 ; WX 272 ; N uniFB4B ; G 4792 -U 64332 ; WX 578 ; N uniFB4C ; G 4793 -U 64333 ; WX 529 ; N uniFB4D ; G 4794 -U 64334 ; WX 625 ; N uniFB4E ; G 4795 -U 64335 ; WX 629 ; N uniFB4F ; G 4796 -U 65024 ; WX 0 ; N uniFE00 ; G 4797 -U 65025 ; WX 0 ; N uniFE01 ; G 4798 -U 65026 ; WX 0 ; N uniFE02 ; G 4799 -U 65027 ; WX 0 ; N uniFE03 ; G 4800 -U 65028 ; WX 0 ; N uniFE04 ; G 4801 -U 65029 ; WX 0 ; N uniFE05 ; G 4802 -U 65030 ; WX 0 ; N uniFE06 ; G 4803 -U 65031 ; WX 0 ; N uniFE07 ; G 4804 -U 65032 ; WX 0 ; N uniFE08 ; G 4805 -U 65033 ; WX 0 ; N uniFE09 ; G 4806 -U 65034 ; WX 0 ; N uniFE0A ; G 4807 -U 65035 ; WX 0 ; N uniFE0B ; G 4808 -U 65036 ; WX 0 ; N uniFE0C ; G 4809 -U 65037 ; WX 0 ; N uniFE0D ; G 4810 -U 65038 ; WX 0 ; N uniFE0E ; G 4811 -U 65039 ; WX 0 ; N uniFE0F ; G 4812 -U 65056 ; WX 0 ; N uniFE20 ; G 4813 -U 65057 ; WX 0 ; N uniFE21 ; G 4814 -U 65058 ; WX 0 ; N uniFE22 ; G 4815 -U 65059 ; WX 0 ; N uniFE23 ; G 4816 -U 65529 ; WX 0 ; N uniFFF9 ; G 4817 -U 65530 ; WX 0 ; N uniFFFA ; G 4818 -U 65531 ; WX 0 ; N uniFFFB ; G 4819 -U 65532 ; WX 0 ; N uniFFFC ; G 4820 -U 65533 ; WX 1025 ; N uniFFFD ; G 4821 -EndCharMetrics -StartKernData -StartKernPairs 1029 - -KPX dollar seven -149 -KPX dollar nine -102 -KPX dollar colon -36 -KPX dollar Hcircumflex -149 -KPX dollar Hbar -149 -KPX dollar Kcommaaccent -36 -KPX dollar uni01DC -149 - -KPX percent less -36 -KPX percent kgreenlandic -36 -KPX percent lacute -36 -KPX percent uni01F4 -36 - -KPX ampersand six 38 -KPX ampersand Gcircumflex 38 -KPX ampersand Gbreve 38 -KPX ampersand Gdotaccent 38 -KPX ampersand Gcommaaccent 38 -KPX ampersand uni01DA 38 - -KPX parenright dollar -120 -KPX parenright X -83 -KPX parenright guillemotright -83 -KPX parenright onequarter -83 -KPX parenright onehalf -83 -KPX parenright threequarters -83 -KPX parenright Acircumflex -120 -KPX parenright Adieresis -120 -KPX parenright AE -120 -KPX parenright imacron -83 -KPX parenright ibreve -83 -KPX parenright iogonek -83 -KPX parenright dotlessi -83 -KPX parenright ij -83 -KPX parenright jcircumflex -83 - -KPX period ampersand -55 -KPX period two -55 -KPX period eight -36 -KPX period D -73 -KPX period H -73 -KPX period R -73 -KPX period X -55 -KPX period backslash -55 -KPX period cent -73 -KPX period sterling -73 -KPX period currency -73 -KPX period yen -73 -KPX period brokenbar -73 -KPX period section -73 -KPX period dieresis -36 -KPX period ordfeminine -73 -KPX period guillemotleft -73 -KPX period logicalnot -73 -KPX period sfthyphen -73 -KPX period acute -73 -KPX period mu -73 -KPX period paragraph -73 -KPX period periodcentered -73 -KPX period cedilla -73 -KPX period ordmasculine -92 -KPX period guillemotright -55 -KPX period onequarter -55 -KPX period onehalf -55 -KPX period threequarters -55 -KPX period questiondown -55 -KPX period Aacute -55 -KPX period Egrave -55 -KPX period Icircumflex -55 -KPX period Yacute -73 -KPX period Ebreve -55 -KPX period ebreve -92 -KPX period Idot -36 -KPX period dotlessi -55 - -KPX slash two -63 -KPX slash seven -139 -KPX slash nine -149 -KPX slash colon -83 -KPX slash less -196 -KPX slash backslash -73 -KPX slash questiondown -73 -KPX slash Aacute -73 -KPX slash Ebreve -63 -KPX slash Hbar -139 -KPX slash lacute -196 - -KPX two semicolon -55 - -KPX three dollar -102 - - -KPX six six -73 -KPX six Gdotaccent -73 -KPX six Gcommaaccent -73 - -KPX seven dollar -188 -KPX seven D -215 -KPX seven F -253 -KPX seven H -253 -KPX seven R -253 -KPX seven U -159 -KPX seven V -243 -KPX seven X -206 -KPX seven Z -167 -KPX seven backslash -178 -KPX seven cent -215 -KPX seven sterling -215 -KPX seven currency -215 -KPX seven yen -215 -KPX seven brokenbar -215 -KPX seven section -215 -KPX seven dieresis -253 -KPX seven copyright -253 -KPX seven ordfeminine -253 -KPX seven guillemotleft -253 -KPX seven logicalnot -253 -KPX seven sfthyphen -253 -KPX seven acute -253 -KPX seven mu -253 -KPX seven paragraph -253 -KPX seven periodcentered -253 -KPX seven cedilla -253 -KPX seven ordmasculine -253 -KPX seven guillemotright -206 -KPX seven onequarter -206 -KPX seven onehalf -206 -KPX seven threequarters -206 -KPX seven questiondown -178 -KPX seven Aacute -178 -KPX seven Eacute -253 -KPX seven Idieresis -253 -KPX seven Yacute -253 -KPX seven ebreve -253 -KPX seven edotaccent -159 -KPX seven ecaron -159 -KPX seven gdotaccent -243 -KPX seven gcommaaccent -243 -KPX seven dotlessi -206 - -KPX nine dollar -139 -KPX nine D -131 -KPX nine H -120 -KPX nine R -120 -KPX nine X -36 -KPX nine cent -131 -KPX nine sterling -131 -KPX nine currency -131 -KPX nine yen -131 -KPX nine brokenbar -131 -KPX nine section -131 -KPX nine dieresis -149 -KPX nine ordfeminine -120 -KPX nine guillemotleft -120 -KPX nine logicalnot -120 -KPX nine sfthyphen -120 -KPX nine acute -120 -KPX nine mu -120 -KPX nine paragraph -120 -KPX nine periodcentered -120 -KPX nine cedilla -120 -KPX nine ordmasculine -120 -KPX nine guillemotright -36 -KPX nine onequarter -36 -KPX nine onehalf -36 -KPX nine threequarters -36 -KPX nine Yacute -120 -KPX nine ebreve -120 -KPX nine dotlessi -36 - -KPX colon dollar -102 -KPX colon D -112 -KPX colon U -36 -KPX colon cent -112 -KPX colon sterling -112 -KPX colon currency -112 -KPX colon yen -112 -KPX colon brokenbar -112 -KPX colon section -112 -KPX colon dieresis -112 -KPX colon edotaccent -36 -KPX colon ecaron -36 - -KPX semicolon ampersand -36 -KPX semicolon two -73 -KPX semicolon Egrave -36 -KPX semicolon Icircumflex -36 -KPX semicolon Ebreve -55 - -KPX less dollar -159 -KPX less ampersand -36 -KPX less two -36 -KPX less D -188 -KPX less H -225 -KPX less L -36 -KPX less R -225 -KPX less X -188 -KPX less cent -188 -KPX less sterling -188 -KPX less currency -188 -KPX less yen -188 -KPX less brokenbar -188 -KPX less section -188 -KPX less dieresis -188 -KPX less ordfeminine -225 -KPX less guillemotleft -225 -KPX less logicalnot -225 -KPX less sfthyphen -225 -KPX less acute -225 -KPX less mu -225 -KPX less paragraph -225 -KPX less periodcentered -225 -KPX less cedilla -225 -KPX less ordmasculine -225 -KPX less guillemotright -188 -KPX less onequarter -188 -KPX less onehalf -188 -KPX less threequarters -188 -KPX less Egrave -36 -KPX less Icircumflex -36 -KPX less Yacute -225 -KPX less Ebreve -36 -KPX less ebreve -225 -KPX less dotlessi -188 - - - - - - - - - - -KPX Acircumflex seven -149 -KPX Acircumflex nine -102 -KPX Acircumflex colon -36 -KPX Acircumflex Hcircumflex -149 -KPX Acircumflex Hbar -149 -KPX Acircumflex Kcommaaccent -36 -KPX Acircumflex uni01DC -149 - -KPX Adieresis seven -149 -KPX Adieresis nine -102 -KPX Adieresis colon -36 -KPX Adieresis Hcircumflex -149 -KPX Adieresis Hbar -149 -KPX Adieresis Kcommaaccent -36 -KPX Adieresis uni01DC -149 - -KPX AE seven -149 -KPX AE nine -102 -KPX AE colon -36 -KPX AE Hcircumflex -149 -KPX AE Hbar -149 -KPX AE Kcommaaccent -36 -KPX AE uni01DC -149 - -KPX Egrave six 38 -KPX Egrave Gcircumflex 38 -KPX Egrave Gbreve 38 -KPX Egrave Gdotaccent 38 -KPX Egrave Gcommaaccent 38 -KPX Egrave uni01DA 38 - -KPX Ecircumflex six 38 -KPX Ecircumflex Gcircumflex 38 -KPX Ecircumflex Gbreve 38 -KPX Ecircumflex Gdotaccent 38 -KPX Ecircumflex Gcommaaccent 38 -KPX Ecircumflex uni01DA 38 - -KPX Igrave six 38 -KPX Igrave Gcircumflex 38 -KPX Igrave Gbreve 38 -KPX Igrave Gdotaccent 38 -KPX Igrave Gcommaaccent 38 -KPX Igrave uni01DA 38 - -KPX Icircumflex six 38 -KPX Icircumflex Gcircumflex 38 -KPX Icircumflex Gbreve 38 -KPX Icircumflex Gdotaccent 38 -KPX Icircumflex Gcommaaccent 38 -KPX Icircumflex uni01DA 38 - -KPX ucircumflex two -63 -KPX ucircumflex seven -139 -KPX ucircumflex nine -149 -KPX ucircumflex colon -83 -KPX ucircumflex less -196 -KPX ucircumflex backslash -73 -KPX ucircumflex questiondown -73 -KPX ucircumflex Aacute -73 -KPX ucircumflex Ebreve -63 -KPX ucircumflex Hbar -139 -KPX ucircumflex lacute -196 - -KPX ydieresis two -63 -KPX ydieresis seven -139 -KPX ydieresis nine -149 -KPX ydieresis colon -83 -KPX ydieresis less -196 -KPX ydieresis backslash -73 -KPX ydieresis questiondown -73 -KPX ydieresis Aacute -73 -KPX ydieresis Ebreve -63 -KPX ydieresis Hbar -139 -KPX ydieresis lacute -196 - -KPX abreve two -63 -KPX abreve seven -139 -KPX abreve nine -149 -KPX abreve colon -83 -KPX abreve less -196 -KPX abreve backslash -73 -KPX abreve questiondown -73 -KPX abreve Aacute -73 -KPX abreve Ebreve -63 -KPX abreve Hbar -139 -KPX abreve lacute -196 - - - -KPX Gdotaccent six -73 -KPX Gdotaccent Gdotaccent -73 -KPX Gdotaccent Gcommaaccent -73 - -KPX Gcommaaccent six -73 -KPX Gcommaaccent Gdotaccent -73 -KPX Gcommaaccent Gcommaaccent -73 - -KPX Hbar dollar -188 -KPX Hbar D -215 -KPX Hbar F -253 -KPX Hbar H -253 -KPX Hbar R -253 -KPX Hbar U -159 -KPX Hbar V -243 -KPX Hbar X -206 -KPX Hbar Z -167 -KPX Hbar backslash -178 -KPX Hbar cent -215 -KPX Hbar sterling -215 -KPX Hbar currency -215 -KPX Hbar yen -215 -KPX Hbar brokenbar -215 -KPX Hbar section -215 -KPX Hbar dieresis -253 -KPX Hbar copyright -253 -KPX Hbar ordfeminine -253 -KPX Hbar guillemotleft -253 -KPX Hbar logicalnot -253 -KPX Hbar sfthyphen -253 -KPX Hbar acute -253 -KPX Hbar mu -253 -KPX Hbar paragraph -253 -KPX Hbar periodcentered -253 -KPX Hbar cedilla -253 -KPX Hbar ordmasculine -253 -KPX Hbar guillemotright -206 -KPX Hbar onequarter -206 -KPX Hbar onehalf -206 -KPX Hbar threequarters -206 -KPX Hbar questiondown -178 -KPX Hbar Aacute -178 -KPX Hbar Eacute -253 -KPX Hbar Idieresis -253 -KPX Hbar Yacute -253 -KPX Hbar ebreve -253 -KPX Hbar edotaccent -159 -KPX Hbar ecaron -159 -KPX Hbar gdotaccent -243 -KPX Hbar gcommaaccent -243 -KPX Hbar dotlessi -206 - -KPX lacute dollar -159 -KPX lacute ampersand -36 -KPX lacute two -36 -KPX lacute D -188 -KPX lacute H -225 -KPX lacute L -36 -KPX lacute R -225 -KPX lacute X -188 -KPX lacute cent -188 -KPX lacute sterling -188 -KPX lacute currency -188 -KPX lacute yen -188 -KPX lacute brokenbar -188 -KPX lacute section -188 -KPX lacute dieresis -188 -KPX lacute ordfeminine -225 -KPX lacute guillemotleft -225 -KPX lacute logicalnot -225 -KPX lacute sfthyphen -225 -KPX lacute acute -225 -KPX lacute mu -225 -KPX lacute paragraph -225 -KPX lacute periodcentered -225 -KPX lacute cedilla -225 -KPX lacute ordmasculine -225 -KPX lacute guillemotright -188 -KPX lacute onequarter -188 -KPX lacute onehalf -188 -KPX lacute threequarters -188 -KPX lacute Egrave -36 -KPX lacute Icircumflex -36 -KPX lacute Yacute -225 -KPX lacute Ebreve -36 -KPX lacute ebreve -225 -KPX lacute dotlessi -188 - - -KPX uni027D dollar -243 -KPX uni027D nine 75 -KPX uni027D less 47 -KPX uni027D lacute 47 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ttf deleted file mode 100644 index e5f7eec..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ufm deleted file mode 100644 index 82dfd81..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ufm +++ /dev/null @@ -1,6661 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Sans -FontSubfamily Book -UniqueID DejaVu Sans -FullName DejaVu Sans -Version Version 2.37 -PostScriptName DejaVuSans -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -PreferredFamily DejaVu Sans -PreferredSubfamily Book -Weight Medium -ItalicAngle 0 -IsFixedPitch false -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 928 -Descender -236 -FontBBox -1021 -463 1793 1232 -StartCharMetrics 6253 -U 32 ; WX 318 ; N space ; G 3 -U 33 ; WX 401 ; N exclam ; G 4 -U 34 ; WX 460 ; N quotedbl ; G 5 -U 35 ; WX 838 ; N numbersign ; G 6 -U 36 ; WX 636 ; N dollar ; G 7 -U 37 ; WX 950 ; N percent ; G 8 -U 38 ; WX 780 ; N ampersand ; G 9 -U 39 ; WX 275 ; N quotesingle ; G 10 -U 40 ; WX 390 ; N parenleft ; G 11 -U 41 ; WX 390 ; N parenright ; G 12 -U 42 ; WX 500 ; N asterisk ; G 13 -U 43 ; WX 838 ; N plus ; G 14 -U 44 ; WX 318 ; N comma ; G 15 -U 45 ; WX 361 ; N hyphen ; G 16 -U 46 ; WX 318 ; N period ; G 17 -U 47 ; WX 337 ; N slash ; G 18 -U 48 ; WX 636 ; N zero ; G 19 -U 49 ; WX 636 ; N one ; G 20 -U 50 ; WX 636 ; N two ; G 21 -U 51 ; WX 636 ; N three ; G 22 -U 52 ; WX 636 ; N four ; G 23 -U 53 ; WX 636 ; N five ; G 24 -U 54 ; WX 636 ; N six ; G 25 -U 55 ; WX 636 ; N seven ; G 26 -U 56 ; WX 636 ; N eight ; G 27 -U 57 ; WX 636 ; N nine ; G 28 -U 58 ; WX 337 ; N colon ; G 29 -U 59 ; WX 337 ; N semicolon ; G 30 -U 60 ; WX 838 ; N less ; G 31 -U 61 ; WX 838 ; N equal ; G 32 -U 62 ; WX 838 ; N greater ; G 33 -U 63 ; WX 531 ; N question ; G 34 -U 64 ; WX 1000 ; N at ; G 35 -U 65 ; WX 684 ; N A ; G 36 -U 66 ; WX 686 ; N B ; G 37 -U 67 ; WX 698 ; N C ; G 38 -U 68 ; WX 770 ; N D ; G 39 -U 69 ; WX 632 ; N E ; G 40 -U 70 ; WX 575 ; N F ; G 41 -U 71 ; WX 775 ; N G ; G 42 -U 72 ; WX 752 ; N H ; G 43 -U 73 ; WX 295 ; N I ; G 44 -U 74 ; WX 295 ; N J ; G 45 -U 75 ; WX 656 ; N K ; G 46 -U 76 ; WX 557 ; N L ; G 47 -U 77 ; WX 863 ; N M ; G 48 -U 78 ; WX 748 ; N N ; G 49 -U 79 ; WX 787 ; N O ; G 50 -U 80 ; WX 603 ; N P ; G 51 -U 81 ; WX 787 ; N Q ; G 52 -U 82 ; WX 695 ; N R ; G 53 -U 83 ; WX 635 ; N S ; G 54 -U 84 ; WX 611 ; N T ; G 55 -U 85 ; WX 732 ; N U ; G 56 -U 86 ; WX 684 ; N V ; G 57 -U 87 ; WX 989 ; N W ; G 58 -U 88 ; WX 685 ; N X ; G 59 -U 89 ; WX 611 ; N Y ; G 60 -U 90 ; WX 685 ; N Z ; G 61 -U 91 ; WX 390 ; N bracketleft ; G 62 -U 92 ; WX 337 ; N backslash ; G 63 -U 93 ; WX 390 ; N bracketright ; G 64 -U 94 ; WX 838 ; N asciicircum ; G 65 -U 95 ; WX 500 ; N underscore ; G 66 -U 96 ; WX 500 ; N grave ; G 67 -U 97 ; WX 613 ; N a ; G 68 -U 98 ; WX 635 ; N b ; G 69 -U 99 ; WX 550 ; N c ; G 70 -U 100 ; WX 635 ; N d ; G 71 -U 101 ; WX 615 ; N e ; G 72 -U 102 ; WX 352 ; N f ; G 73 -U 103 ; WX 635 ; N g ; G 74 -U 104 ; WX 634 ; N h ; G 75 -U 105 ; WX 278 ; N i ; G 76 -U 106 ; WX 278 ; N j ; G 77 -U 107 ; WX 579 ; N k ; G 78 -U 108 ; WX 278 ; N l ; G 79 -U 109 ; WX 974 ; N m ; G 80 -U 110 ; WX 634 ; N n ; G 81 -U 111 ; WX 612 ; N o ; G 82 -U 112 ; WX 635 ; N p ; G 83 -U 113 ; WX 635 ; N q ; G 84 -U 114 ; WX 411 ; N r ; G 85 -U 115 ; WX 521 ; N s ; G 86 -U 116 ; WX 392 ; N t ; G 87 -U 117 ; WX 634 ; N u ; G 88 -U 118 ; WX 592 ; N v ; G 89 -U 119 ; WX 818 ; N w ; G 90 -U 120 ; WX 592 ; N x ; G 91 -U 121 ; WX 592 ; N y ; G 92 -U 122 ; WX 525 ; N z ; G 93 -U 123 ; WX 636 ; N braceleft ; G 94 -U 124 ; WX 337 ; N bar ; G 95 -U 125 ; WX 636 ; N braceright ; G 96 -U 126 ; WX 838 ; N asciitilde ; G 97 -U 160 ; WX 318 ; N nbspace ; G 98 -U 161 ; WX 401 ; N exclamdown ; G 99 -U 162 ; WX 636 ; N cent ; G 100 -U 163 ; WX 636 ; N sterling ; G 101 -U 164 ; WX 636 ; N currency ; G 102 -U 165 ; WX 636 ; N yen ; G 103 -U 166 ; WX 337 ; N brokenbar ; G 104 -U 167 ; WX 500 ; N section ; G 105 -U 168 ; WX 500 ; N dieresis ; G 106 -U 169 ; WX 1000 ; N copyright ; G 107 -U 170 ; WX 471 ; N ordfeminine ; G 108 -U 171 ; WX 612 ; N guillemotleft ; G 109 -U 172 ; WX 838 ; N logicalnot ; G 110 -U 173 ; WX 361 ; N sfthyphen ; G 111 -U 174 ; WX 1000 ; N registered ; G 112 -U 175 ; WX 500 ; N macron ; G 113 -U 176 ; WX 500 ; N degree ; G 114 -U 177 ; WX 838 ; N plusminus ; G 115 -U 178 ; WX 401 ; N twosuperior ; G 116 -U 179 ; WX 401 ; N threesuperior ; G 117 -U 180 ; WX 500 ; N acute ; G 118 -U 181 ; WX 636 ; N mu ; G 119 -U 182 ; WX 636 ; N paragraph ; G 120 -U 183 ; WX 318 ; N periodcentered ; G 121 -U 184 ; WX 500 ; N cedilla ; G 122 -U 185 ; WX 401 ; N onesuperior ; G 123 -U 186 ; WX 471 ; N ordmasculine ; G 124 -U 187 ; WX 612 ; N guillemotright ; G 125 -U 188 ; WX 969 ; N onequarter ; G 126 -U 189 ; WX 969 ; N onehalf ; G 127 -U 190 ; WX 969 ; N threequarters ; G 128 -U 191 ; WX 531 ; N questiondown ; G 129 -U 192 ; WX 684 ; N Agrave ; G 130 -U 193 ; WX 684 ; N Aacute ; G 131 -U 194 ; WX 684 ; N Acircumflex ; G 132 -U 195 ; WX 684 ; N Atilde ; G 133 -U 196 ; WX 684 ; N Adieresis ; G 134 -U 197 ; WX 684 ; N Aring ; G 135 -U 198 ; WX 974 ; N AE ; G 136 -U 199 ; WX 698 ; N Ccedilla ; G 137 -U 200 ; WX 632 ; N Egrave ; G 138 -U 201 ; WX 632 ; N Eacute ; G 139 -U 202 ; WX 632 ; N Ecircumflex ; G 140 -U 203 ; WX 632 ; N Edieresis ; G 141 -U 204 ; WX 295 ; N Igrave ; G 142 -U 205 ; WX 295 ; N Iacute ; G 143 -U 206 ; WX 295 ; N Icircumflex ; G 144 -U 207 ; WX 295 ; N Idieresis ; G 145 -U 208 ; WX 775 ; N Eth ; G 146 -U 209 ; WX 748 ; N Ntilde ; G 147 -U 210 ; WX 787 ; N Ograve ; G 148 -U 211 ; WX 787 ; N Oacute ; G 149 -U 212 ; WX 787 ; N Ocircumflex ; G 150 -U 213 ; WX 787 ; N Otilde ; G 151 -U 214 ; WX 787 ; N Odieresis ; G 152 -U 215 ; WX 838 ; N multiply ; G 153 -U 216 ; WX 787 ; N Oslash ; G 154 -U 217 ; WX 732 ; N Ugrave ; G 155 -U 218 ; WX 732 ; N Uacute ; G 156 -U 219 ; WX 732 ; N Ucircumflex ; G 157 -U 220 ; WX 732 ; N Udieresis ; G 158 -U 221 ; WX 611 ; N Yacute ; G 159 -U 222 ; WX 605 ; N Thorn ; G 160 -U 223 ; WX 630 ; N germandbls ; G 161 -U 224 ; WX 613 ; N agrave ; G 162 -U 225 ; WX 613 ; N aacute ; G 163 -U 226 ; WX 613 ; N acircumflex ; G 164 -U 227 ; WX 613 ; N atilde ; G 165 -U 228 ; WX 613 ; N adieresis ; G 166 -U 229 ; WX 613 ; N aring ; G 167 -U 230 ; WX 982 ; N ae ; G 168 -U 231 ; WX 550 ; N ccedilla ; G 169 -U 232 ; WX 615 ; N egrave ; G 170 -U 233 ; WX 615 ; N eacute ; G 171 -U 234 ; WX 615 ; N ecircumflex ; G 172 -U 235 ; WX 615 ; N edieresis ; G 173 -U 236 ; WX 278 ; N igrave ; G 174 -U 237 ; WX 278 ; N iacute ; G 175 -U 238 ; WX 278 ; N icircumflex ; G 176 -U 239 ; WX 278 ; N idieresis ; G 177 -U 240 ; WX 612 ; N eth ; G 178 -U 241 ; WX 634 ; N ntilde ; G 179 -U 242 ; WX 612 ; N ograve ; G 180 -U 243 ; WX 612 ; N oacute ; G 181 -U 244 ; WX 612 ; N ocircumflex ; G 182 -U 245 ; WX 612 ; N otilde ; G 183 -U 246 ; WX 612 ; N odieresis ; G 184 -U 247 ; WX 838 ; N divide ; G 185 -U 248 ; WX 612 ; N oslash ; G 186 -U 249 ; WX 634 ; N ugrave ; G 187 -U 250 ; WX 634 ; N uacute ; G 188 -U 251 ; WX 634 ; N ucircumflex ; G 189 -U 252 ; WX 634 ; N udieresis ; G 190 -U 253 ; WX 592 ; N yacute ; G 191 -U 254 ; WX 635 ; N thorn ; G 192 -U 255 ; WX 592 ; N ydieresis ; G 193 -U 256 ; WX 684 ; N Amacron ; G 194 -U 257 ; WX 613 ; N amacron ; G 195 -U 258 ; WX 684 ; N Abreve ; G 196 -U 259 ; WX 613 ; N abreve ; G 197 -U 260 ; WX 684 ; N Aogonek ; G 198 -U 261 ; WX 613 ; N aogonek ; G 199 -U 262 ; WX 698 ; N Cacute ; G 200 -U 263 ; WX 550 ; N cacute ; G 201 -U 264 ; WX 698 ; N Ccircumflex ; G 202 -U 265 ; WX 550 ; N ccircumflex ; G 203 -U 266 ; WX 698 ; N Cdotaccent ; G 204 -U 267 ; WX 550 ; N cdotaccent ; G 205 -U 268 ; WX 698 ; N Ccaron ; G 206 -U 269 ; WX 550 ; N ccaron ; G 207 -U 270 ; WX 770 ; N Dcaron ; G 208 -U 271 ; WX 635 ; N dcaron ; G 209 -U 272 ; WX 775 ; N Dcroat ; G 210 -U 273 ; WX 635 ; N dmacron ; G 211 -U 274 ; WX 632 ; N Emacron ; G 212 -U 275 ; WX 615 ; N emacron ; G 213 -U 276 ; WX 632 ; N Ebreve ; G 214 -U 277 ; WX 615 ; N ebreve ; G 215 -U 278 ; WX 632 ; N Edotaccent ; G 216 -U 279 ; WX 615 ; N edotaccent ; G 217 -U 280 ; WX 632 ; N Eogonek ; G 218 -U 281 ; WX 615 ; N eogonek ; G 219 -U 282 ; WX 632 ; N Ecaron ; G 220 -U 283 ; WX 615 ; N ecaron ; G 221 -U 284 ; WX 775 ; N Gcircumflex ; G 222 -U 285 ; WX 635 ; N gcircumflex ; G 223 -U 286 ; WX 775 ; N Gbreve ; G 224 -U 287 ; WX 635 ; N gbreve ; G 225 -U 288 ; WX 775 ; N Gdotaccent ; G 226 -U 289 ; WX 635 ; N gdotaccent ; G 227 -U 290 ; WX 775 ; N Gcommaaccent ; G 228 -U 291 ; WX 635 ; N gcommaaccent ; G 229 -U 292 ; WX 752 ; N Hcircumflex ; G 230 -U 293 ; WX 634 ; N hcircumflex ; G 231 -U 294 ; WX 916 ; N Hbar ; G 232 -U 295 ; WX 695 ; N hbar ; G 233 -U 296 ; WX 295 ; N Itilde ; G 234 -U 297 ; WX 278 ; N itilde ; G 235 -U 298 ; WX 295 ; N Imacron ; G 236 -U 299 ; WX 278 ; N imacron ; G 237 -U 300 ; WX 295 ; N Ibreve ; G 238 -U 301 ; WX 278 ; N ibreve ; G 239 -U 302 ; WX 295 ; N Iogonek ; G 240 -U 303 ; WX 278 ; N iogonek ; G 241 -U 304 ; WX 295 ; N Idot ; G 242 -U 305 ; WX 278 ; N dotlessi ; G 243 -U 306 ; WX 590 ; N IJ ; G 244 -U 307 ; WX 556 ; N ij ; G 245 -U 308 ; WX 295 ; N Jcircumflex ; G 246 -U 309 ; WX 278 ; N jcircumflex ; G 247 -U 310 ; WX 656 ; N Kcommaaccent ; G 248 -U 311 ; WX 579 ; N kcommaaccent ; G 249 -U 312 ; WX 579 ; N kgreenlandic ; G 250 -U 313 ; WX 557 ; N Lacute ; G 251 -U 314 ; WX 278 ; N lacute ; G 252 -U 315 ; WX 557 ; N Lcommaaccent ; G 253 -U 316 ; WX 278 ; N lcommaaccent ; G 254 -U 317 ; WX 557 ; N Lcaron ; G 255 -U 318 ; WX 375 ; N lcaron ; G 256 -U 319 ; WX 557 ; N Ldot ; G 257 -U 320 ; WX 342 ; N ldot ; G 258 -U 321 ; WX 562 ; N Lslash ; G 259 -U 322 ; WX 284 ; N lslash ; G 260 -U 323 ; WX 748 ; N Nacute ; G 261 -U 324 ; WX 634 ; N nacute ; G 262 -U 325 ; WX 748 ; N Ncommaaccent ; G 263 -U 326 ; WX 634 ; N ncommaaccent ; G 264 -U 327 ; WX 748 ; N Ncaron ; G 265 -U 328 ; WX 634 ; N ncaron ; G 266 -U 329 ; WX 813 ; N napostrophe ; G 267 -U 330 ; WX 748 ; N Eng ; G 268 -U 331 ; WX 634 ; N eng ; G 269 -U 332 ; WX 787 ; N Omacron ; G 270 -U 333 ; WX 612 ; N omacron ; G 271 -U 334 ; WX 787 ; N Obreve ; G 272 -U 335 ; WX 612 ; N obreve ; G 273 -U 336 ; WX 787 ; N Ohungarumlaut ; G 274 -U 337 ; WX 612 ; N ohungarumlaut ; G 275 -U 338 ; WX 1070 ; N OE ; G 276 -U 339 ; WX 1023 ; N oe ; G 277 -U 340 ; WX 695 ; N Racute ; G 278 -U 341 ; WX 411 ; N racute ; G 279 -U 342 ; WX 695 ; N Rcommaaccent ; G 280 -U 343 ; WX 411 ; N rcommaaccent ; G 281 -U 344 ; WX 695 ; N Rcaron ; G 282 -U 345 ; WX 411 ; N rcaron ; G 283 -U 346 ; WX 635 ; N Sacute ; G 284 -U 347 ; WX 521 ; N sacute ; G 285 -U 348 ; WX 635 ; N Scircumflex ; G 286 -U 349 ; WX 521 ; N scircumflex ; G 287 -U 350 ; WX 635 ; N Scedilla ; G 288 -U 351 ; WX 521 ; N scedilla ; G 289 -U 352 ; WX 635 ; N Scaron ; G 290 -U 353 ; WX 521 ; N scaron ; G 291 -U 354 ; WX 611 ; N Tcommaaccent ; G 292 -U 355 ; WX 392 ; N tcommaaccent ; G 293 -U 356 ; WX 611 ; N Tcaron ; G 294 -U 357 ; WX 392 ; N tcaron ; G 295 -U 358 ; WX 611 ; N Tbar ; G 296 -U 359 ; WX 392 ; N tbar ; G 297 -U 360 ; WX 732 ; N Utilde ; G 298 -U 361 ; WX 634 ; N utilde ; G 299 -U 362 ; WX 732 ; N Umacron ; G 300 -U 363 ; WX 634 ; N umacron ; G 301 -U 364 ; WX 732 ; N Ubreve ; G 302 -U 365 ; WX 634 ; N ubreve ; G 303 -U 366 ; WX 732 ; N Uring ; G 304 -U 367 ; WX 634 ; N uring ; G 305 -U 368 ; WX 732 ; N Uhungarumlaut ; G 306 -U 369 ; WX 634 ; N uhungarumlaut ; G 307 -U 370 ; WX 732 ; N Uogonek ; G 308 -U 371 ; WX 634 ; N uogonek ; G 309 -U 372 ; WX 989 ; N Wcircumflex ; G 310 -U 373 ; WX 818 ; N wcircumflex ; G 311 -U 374 ; WX 611 ; N Ycircumflex ; G 312 -U 375 ; WX 592 ; N ycircumflex ; G 313 -U 376 ; WX 611 ; N Ydieresis ; G 314 -U 377 ; WX 685 ; N Zacute ; G 315 -U 378 ; WX 525 ; N zacute ; G 316 -U 379 ; WX 685 ; N Zdotaccent ; G 317 -U 380 ; WX 525 ; N zdotaccent ; G 318 -U 381 ; WX 685 ; N Zcaron ; G 319 -U 382 ; WX 525 ; N zcaron ; G 320 -U 383 ; WX 352 ; N longs ; G 321 -U 384 ; WX 635 ; N uni0180 ; G 322 -U 385 ; WX 735 ; N uni0181 ; G 323 -U 386 ; WX 686 ; N uni0182 ; G 324 -U 387 ; WX 635 ; N uni0183 ; G 325 -U 388 ; WX 686 ; N uni0184 ; G 326 -U 389 ; WX 635 ; N uni0185 ; G 327 -U 390 ; WX 703 ; N uni0186 ; G 328 -U 391 ; WX 698 ; N uni0187 ; G 329 -U 392 ; WX 550 ; N uni0188 ; G 330 -U 393 ; WX 775 ; N uni0189 ; G 331 -U 394 ; WX 819 ; N uni018A ; G 332 -U 395 ; WX 686 ; N uni018B ; G 333 -U 396 ; WX 635 ; N uni018C ; G 334 -U 397 ; WX 612 ; N uni018D ; G 335 -U 398 ; WX 632 ; N uni018E ; G 336 -U 399 ; WX 787 ; N uni018F ; G 337 -U 400 ; WX 614 ; N uni0190 ; G 338 -U 401 ; WX 575 ; N uni0191 ; G 339 -U 402 ; WX 352 ; N florin ; G 340 -U 403 ; WX 775 ; N uni0193 ; G 341 -U 404 ; WX 687 ; N uni0194 ; G 342 -U 405 ; WX 984 ; N uni0195 ; G 343 -U 406 ; WX 354 ; N uni0196 ; G 344 -U 407 ; WX 295 ; N uni0197 ; G 345 -U 408 ; WX 746 ; N uni0198 ; G 346 -U 409 ; WX 579 ; N uni0199 ; G 347 -U 410 ; WX 278 ; N uni019A ; G 348 -U 411 ; WX 592 ; N uni019B ; G 349 -U 412 ; WX 974 ; N uni019C ; G 350 -U 413 ; WX 748 ; N uni019D ; G 351 -U 414 ; WX 634 ; N uni019E ; G 352 -U 415 ; WX 787 ; N uni019F ; G 353 -U 416 ; WX 913 ; N Ohorn ; G 354 -U 417 ; WX 612 ; N ohorn ; G 355 -U 418 ; WX 949 ; N uni01A2 ; G 356 -U 419 ; WX 759 ; N uni01A3 ; G 357 -U 420 ; WX 652 ; N uni01A4 ; G 358 -U 421 ; WX 635 ; N uni01A5 ; G 359 -U 422 ; WX 695 ; N uni01A6 ; G 360 -U 423 ; WX 635 ; N uni01A7 ; G 361 -U 424 ; WX 521 ; N uni01A8 ; G 362 -U 425 ; WX 632 ; N uni01A9 ; G 363 -U 426 ; WX 336 ; N uni01AA ; G 364 -U 427 ; WX 392 ; N uni01AB ; G 365 -U 428 ; WX 611 ; N uni01AC ; G 366 -U 429 ; WX 392 ; N uni01AD ; G 367 -U 430 ; WX 611 ; N uni01AE ; G 368 -U 431 ; WX 858 ; N Uhorn ; G 369 -U 432 ; WX 634 ; N uhorn ; G 370 -U 433 ; WX 764 ; N uni01B1 ; G 371 -U 434 ; WX 721 ; N uni01B2 ; G 372 -U 435 ; WX 744 ; N uni01B3 ; G 373 -U 436 ; WX 730 ; N uni01B4 ; G 374 -U 437 ; WX 685 ; N uni01B5 ; G 375 -U 438 ; WX 525 ; N uni01B6 ; G 376 -U 439 ; WX 666 ; N uni01B7 ; G 377 -U 440 ; WX 666 ; N uni01B8 ; G 378 -U 441 ; WX 578 ; N uni01B9 ; G 379 -U 442 ; WX 525 ; N uni01BA ; G 380 -U 443 ; WX 636 ; N uni01BB ; G 381 -U 444 ; WX 666 ; N uni01BC ; G 382 -U 445 ; WX 578 ; N uni01BD ; G 383 -U 446 ; WX 510 ; N uni01BE ; G 384 -U 447 ; WX 635 ; N uni01BF ; G 385 -U 448 ; WX 295 ; N uni01C0 ; G 386 -U 449 ; WX 492 ; N uni01C1 ; G 387 -U 450 ; WX 459 ; N uni01C2 ; G 388 -U 451 ; WX 295 ; N uni01C3 ; G 389 -U 452 ; WX 1422 ; N uni01C4 ; G 390 -U 453 ; WX 1299 ; N uni01C5 ; G 391 -U 454 ; WX 1154 ; N uni01C6 ; G 392 -U 455 ; WX 835 ; N uni01C7 ; G 393 -U 456 ; WX 787 ; N uni01C8 ; G 394 -U 457 ; WX 457 ; N uni01C9 ; G 395 -U 458 ; WX 931 ; N uni01CA ; G 396 -U 459 ; WX 924 ; N uni01CB ; G 397 -U 460 ; WX 797 ; N uni01CC ; G 398 -U 461 ; WX 684 ; N uni01CD ; G 399 -U 462 ; WX 613 ; N uni01CE ; G 400 -U 463 ; WX 295 ; N uni01CF ; G 401 -U 464 ; WX 278 ; N uni01D0 ; G 402 -U 465 ; WX 787 ; N uni01D1 ; G 403 -U 466 ; WX 612 ; N uni01D2 ; G 404 -U 467 ; WX 732 ; N uni01D3 ; G 405 -U 468 ; WX 634 ; N uni01D4 ; G 406 -U 469 ; WX 732 ; N uni01D5 ; G 407 -U 470 ; WX 634 ; N uni01D6 ; G 408 -U 471 ; WX 732 ; N uni01D7 ; G 409 -U 472 ; WX 634 ; N uni01D8 ; G 410 -U 473 ; WX 732 ; N uni01D9 ; G 411 -U 474 ; WX 634 ; N uni01DA ; G 412 -U 475 ; WX 732 ; N uni01DB ; G 413 -U 476 ; WX 634 ; N uni01DC ; G 414 -U 477 ; WX 615 ; N uni01DD ; G 415 -U 478 ; WX 684 ; N uni01DE ; G 416 -U 479 ; WX 613 ; N uni01DF ; G 417 -U 480 ; WX 684 ; N uni01E0 ; G 418 -U 481 ; WX 613 ; N uni01E1 ; G 419 -U 482 ; WX 974 ; N uni01E2 ; G 420 -U 483 ; WX 982 ; N uni01E3 ; G 421 -U 484 ; WX 775 ; N uni01E4 ; G 422 -U 485 ; WX 635 ; N uni01E5 ; G 423 -U 486 ; WX 775 ; N Gcaron ; G 424 -U 487 ; WX 635 ; N gcaron ; G 425 -U 488 ; WX 656 ; N uni01E8 ; G 426 -U 489 ; WX 579 ; N uni01E9 ; G 427 -U 490 ; WX 787 ; N uni01EA ; G 428 -U 491 ; WX 612 ; N uni01EB ; G 429 -U 492 ; WX 787 ; N uni01EC ; G 430 -U 493 ; WX 612 ; N uni01ED ; G 431 -U 494 ; WX 666 ; N uni01EE ; G 432 -U 495 ; WX 578 ; N uni01EF ; G 433 -U 496 ; WX 278 ; N uni01F0 ; G 434 -U 497 ; WX 1422 ; N uni01F1 ; G 435 -U 498 ; WX 1299 ; N uni01F2 ; G 436 -U 499 ; WX 1154 ; N uni01F3 ; G 437 -U 500 ; WX 775 ; N uni01F4 ; G 438 -U 501 ; WX 635 ; N uni01F5 ; G 439 -U 502 ; WX 1113 ; N uni01F6 ; G 440 -U 503 ; WX 682 ; N uni01F7 ; G 441 -U 504 ; WX 748 ; N uni01F8 ; G 442 -U 505 ; WX 634 ; N uni01F9 ; G 443 -U 506 ; WX 684 ; N Aringacute ; G 444 -U 507 ; WX 613 ; N aringacute ; G 445 -U 508 ; WX 974 ; N AEacute ; G 446 -U 509 ; WX 982 ; N aeacute ; G 447 -U 510 ; WX 787 ; N Oslashacute ; G 448 -U 511 ; WX 612 ; N oslashacute ; G 449 -U 512 ; WX 684 ; N uni0200 ; G 450 -U 513 ; WX 613 ; N uni0201 ; G 451 -U 514 ; WX 684 ; N uni0202 ; G 452 -U 515 ; WX 613 ; N uni0203 ; G 453 -U 516 ; WX 632 ; N uni0204 ; G 454 -U 517 ; WX 615 ; N uni0205 ; G 455 -U 518 ; WX 632 ; N uni0206 ; G 456 -U 519 ; WX 615 ; N uni0207 ; G 457 -U 520 ; WX 295 ; N uni0208 ; G 458 -U 521 ; WX 278 ; N uni0209 ; G 459 -U 522 ; WX 295 ; N uni020A ; G 460 -U 523 ; WX 278 ; N uni020B ; G 461 -U 524 ; WX 787 ; N uni020C ; G 462 -U 525 ; WX 612 ; N uni020D ; G 463 -U 526 ; WX 787 ; N uni020E ; G 464 -U 527 ; WX 612 ; N uni020F ; G 465 -U 528 ; WX 695 ; N uni0210 ; G 466 -U 529 ; WX 411 ; N uni0211 ; G 467 -U 530 ; WX 695 ; N uni0212 ; G 468 -U 531 ; WX 411 ; N uni0213 ; G 469 -U 532 ; WX 732 ; N uni0214 ; G 470 -U 533 ; WX 634 ; N uni0215 ; G 471 -U 534 ; WX 732 ; N uni0216 ; G 472 -U 535 ; WX 634 ; N uni0217 ; G 473 -U 536 ; WX 635 ; N Scommaaccent ; G 474 -U 537 ; WX 521 ; N scommaaccent ; G 475 -U 538 ; WX 611 ; N uni021A ; G 476 -U 539 ; WX 392 ; N uni021B ; G 477 -U 540 ; WX 627 ; N uni021C ; G 478 -U 541 ; WX 521 ; N uni021D ; G 479 -U 542 ; WX 752 ; N uni021E ; G 480 -U 543 ; WX 634 ; N uni021F ; G 481 -U 544 ; WX 735 ; N uni0220 ; G 482 -U 545 ; WX 838 ; N uni0221 ; G 483 -U 546 ; WX 698 ; N uni0222 ; G 484 -U 547 ; WX 610 ; N uni0223 ; G 485 -U 548 ; WX 685 ; N uni0224 ; G 486 -U 549 ; WX 525 ; N uni0225 ; G 487 -U 550 ; WX 684 ; N uni0226 ; G 488 -U 551 ; WX 613 ; N uni0227 ; G 489 -U 552 ; WX 632 ; N uni0228 ; G 490 -U 553 ; WX 615 ; N uni0229 ; G 491 -U 554 ; WX 787 ; N uni022A ; G 492 -U 555 ; WX 612 ; N uni022B ; G 493 -U 556 ; WX 787 ; N uni022C ; G 494 -U 557 ; WX 612 ; N uni022D ; G 495 -U 558 ; WX 787 ; N uni022E ; G 496 -U 559 ; WX 612 ; N uni022F ; G 497 -U 560 ; WX 787 ; N uni0230 ; G 498 -U 561 ; WX 612 ; N uni0231 ; G 499 -U 562 ; WX 611 ; N uni0232 ; G 500 -U 563 ; WX 592 ; N uni0233 ; G 501 -U 564 ; WX 475 ; N uni0234 ; G 502 -U 565 ; WX 843 ; N uni0235 ; G 503 -U 566 ; WX 477 ; N uni0236 ; G 504 -U 567 ; WX 278 ; N dotlessj ; G 505 -U 568 ; WX 998 ; N uni0238 ; G 506 -U 569 ; WX 998 ; N uni0239 ; G 507 -U 570 ; WX 684 ; N uni023A ; G 508 -U 571 ; WX 698 ; N uni023B ; G 509 -U 572 ; WX 550 ; N uni023C ; G 510 -U 573 ; WX 557 ; N uni023D ; G 511 -U 574 ; WX 611 ; N uni023E ; G 512 -U 575 ; WX 521 ; N uni023F ; G 513 -U 576 ; WX 525 ; N uni0240 ; G 514 -U 577 ; WX 603 ; N uni0241 ; G 515 -U 578 ; WX 479 ; N uni0242 ; G 516 -U 579 ; WX 686 ; N uni0243 ; G 517 -U 580 ; WX 732 ; N uni0244 ; G 518 -U 581 ; WX 684 ; N uni0245 ; G 519 -U 582 ; WX 632 ; N uni0246 ; G 520 -U 583 ; WX 615 ; N uni0247 ; G 521 -U 584 ; WX 295 ; N uni0248 ; G 522 -U 585 ; WX 278 ; N uni0249 ; G 523 -U 586 ; WX 781 ; N uni024A ; G 524 -U 587 ; WX 635 ; N uni024B ; G 525 -U 588 ; WX 695 ; N uni024C ; G 526 -U 589 ; WX 411 ; N uni024D ; G 527 -U 590 ; WX 611 ; N uni024E ; G 528 -U 591 ; WX 592 ; N uni024F ; G 529 -U 592 ; WX 600 ; N uni0250 ; G 530 -U 593 ; WX 635 ; N uni0251 ; G 531 -U 594 ; WX 635 ; N uni0252 ; G 532 -U 595 ; WX 635 ; N uni0253 ; G 533 -U 596 ; WX 549 ; N uni0254 ; G 534 -U 597 ; WX 550 ; N uni0255 ; G 535 -U 598 ; WX 635 ; N uni0256 ; G 536 -U 599 ; WX 696 ; N uni0257 ; G 537 -U 600 ; WX 615 ; N uni0258 ; G 538 -U 601 ; WX 615 ; N uni0259 ; G 539 -U 602 ; WX 819 ; N uni025A ; G 540 -U 603 ; WX 541 ; N uni025B ; G 541 -U 604 ; WX 532 ; N uni025C ; G 542 -U 605 ; WX 775 ; N uni025D ; G 543 -U 606 ; WX 664 ; N uni025E ; G 544 -U 607 ; WX 278 ; N uni025F ; G 545 -U 608 ; WX 696 ; N uni0260 ; G 546 -U 609 ; WX 635 ; N uni0261 ; G 547 -U 610 ; WX 629 ; N uni0262 ; G 548 -U 611 ; WX 596 ; N uni0263 ; G 549 -U 612 ; WX 596 ; N uni0264 ; G 550 -U 613 ; WX 634 ; N uni0265 ; G 551 -U 614 ; WX 634 ; N uni0266 ; G 552 -U 615 ; WX 634 ; N uni0267 ; G 553 -U 616 ; WX 278 ; N uni0268 ; G 554 -U 617 ; WX 338 ; N uni0269 ; G 555 -U 618 ; WX 372 ; N uni026A ; G 556 -U 619 ; WX 396 ; N uni026B ; G 557 -U 620 ; WX 487 ; N uni026C ; G 558 -U 621 ; WX 278 ; N uni026D ; G 559 -U 622 ; WX 706 ; N uni026E ; G 560 -U 623 ; WX 974 ; N uni026F ; G 561 -U 624 ; WX 974 ; N uni0270 ; G 562 -U 625 ; WX 974 ; N uni0271 ; G 563 -U 626 ; WX 646 ; N uni0272 ; G 564 -U 627 ; WX 642 ; N uni0273 ; G 565 -U 628 ; WX 634 ; N uni0274 ; G 566 -U 629 ; WX 612 ; N uni0275 ; G 567 -U 630 ; WX 858 ; N uni0276 ; G 568 -U 631 ; WX 728 ; N uni0277 ; G 569 -U 632 ; WX 660 ; N uni0278 ; G 570 -U 633 ; WX 414 ; N uni0279 ; G 571 -U 634 ; WX 414 ; N uni027A ; G 572 -U 635 ; WX 414 ; N uni027B ; G 573 -U 636 ; WX 411 ; N uni027C ; G 574 -U 637 ; WX 411 ; N uni027D ; G 575 -U 638 ; WX 530 ; N uni027E ; G 576 -U 639 ; WX 530 ; N uni027F ; G 577 -U 640 ; WX 604 ; N uni0280 ; G 578 -U 641 ; WX 604 ; N uni0281 ; G 579 -U 642 ; WX 521 ; N uni0282 ; G 580 -U 643 ; WX 336 ; N uni0283 ; G 581 -U 644 ; WX 336 ; N uni0284 ; G 582 -U 645 ; WX 461 ; N uni0285 ; G 583 -U 646 ; WX 336 ; N uni0286 ; G 584 -U 647 ; WX 392 ; N uni0287 ; G 585 -U 648 ; WX 392 ; N uni0288 ; G 586 -U 649 ; WX 634 ; N uni0289 ; G 587 -U 650 ; WX 618 ; N uni028A ; G 588 -U 651 ; WX 598 ; N uni028B ; G 589 -U 652 ; WX 592 ; N uni028C ; G 590 -U 653 ; WX 818 ; N uni028D ; G 591 -U 654 ; WX 592 ; N uni028E ; G 592 -U 655 ; WX 611 ; N uni028F ; G 593 -U 656 ; WX 525 ; N uni0290 ; G 594 -U 657 ; WX 525 ; N uni0291 ; G 595 -U 658 ; WX 578 ; N uni0292 ; G 596 -U 659 ; WX 578 ; N uni0293 ; G 597 -U 660 ; WX 510 ; N uni0294 ; G 598 -U 661 ; WX 510 ; N uni0295 ; G 599 -U 662 ; WX 510 ; N uni0296 ; G 600 -U 663 ; WX 510 ; N uni0297 ; G 601 -U 664 ; WX 787 ; N uni0298 ; G 602 -U 665 ; WX 580 ; N uni0299 ; G 603 -U 666 ; WX 664 ; N uni029A ; G 604 -U 667 ; WX 708 ; N uni029B ; G 605 -U 668 ; WX 654 ; N uni029C ; G 606 -U 669 ; WX 292 ; N uni029D ; G 607 -U 670 ; WX 667 ; N uni029E ; G 608 -U 671 ; WX 507 ; N uni029F ; G 609 -U 672 ; WX 727 ; N uni02A0 ; G 610 -U 673 ; WX 510 ; N uni02A1 ; G 611 -U 674 ; WX 510 ; N uni02A2 ; G 612 -U 675 ; WX 1014 ; N uni02A3 ; G 613 -U 676 ; WX 1058 ; N uni02A4 ; G 614 -U 677 ; WX 1013 ; N uni02A5 ; G 615 -U 678 ; WX 830 ; N uni02A6 ; G 616 -U 679 ; WX 610 ; N uni02A7 ; G 617 -U 680 ; WX 778 ; N uni02A8 ; G 618 -U 681 ; WX 848 ; N uni02A9 ; G 619 -U 682 ; WX 706 ; N uni02AA ; G 620 -U 683 ; WX 654 ; N uni02AB ; G 621 -U 684 ; WX 515 ; N uni02AC ; G 622 -U 685 ; WX 515 ; N uni02AD ; G 623 -U 686 ; WX 661 ; N uni02AE ; G 624 -U 687 ; WX 664 ; N uni02AF ; G 625 -U 688 ; WX 404 ; N uni02B0 ; G 626 -U 689 ; WX 399 ; N uni02B1 ; G 627 -U 690 ; WX 175 ; N uni02B2 ; G 628 -U 691 ; WX 259 ; N uni02B3 ; G 629 -U 692 ; WX 295 ; N uni02B4 ; G 630 -U 693 ; WX 296 ; N uni02B5 ; G 631 -U 694 ; WX 379 ; N uni02B6 ; G 632 -U 695 ; WX 515 ; N uni02B7 ; G 633 -U 696 ; WX 373 ; N uni02B8 ; G 634 -U 697 ; WX 278 ; N uni02B9 ; G 635 -U 698 ; WX 460 ; N uni02BA ; G 636 -U 699 ; WX 318 ; N uni02BB ; G 637 -U 700 ; WX 318 ; N uni02BC ; G 638 -U 701 ; WX 318 ; N uni02BD ; G 639 -U 702 ; WX 307 ; N uni02BE ; G 640 -U 703 ; WX 307 ; N uni02BF ; G 641 -U 704 ; WX 370 ; N uni02C0 ; G 642 -U 705 ; WX 370 ; N uni02C1 ; G 643 -U 706 ; WX 500 ; N uni02C2 ; G 644 -U 707 ; WX 500 ; N uni02C3 ; G 645 -U 708 ; WX 500 ; N uni02C4 ; G 646 -U 709 ; WX 500 ; N uni02C5 ; G 647 -U 710 ; WX 500 ; N circumflex ; G 648 -U 711 ; WX 500 ; N caron ; G 649 -U 712 ; WX 275 ; N uni02C8 ; G 650 -U 713 ; WX 500 ; N uni02C9 ; G 651 -U 714 ; WX 500 ; N uni02CA ; G 652 -U 715 ; WX 500 ; N uni02CB ; G 653 -U 716 ; WX 275 ; N uni02CC ; G 654 -U 717 ; WX 500 ; N uni02CD ; G 655 -U 718 ; WX 500 ; N uni02CE ; G 656 -U 719 ; WX 500 ; N uni02CF ; G 657 -U 720 ; WX 337 ; N uni02D0 ; G 658 -U 721 ; WX 337 ; N uni02D1 ; G 659 -U 722 ; WX 307 ; N uni02D2 ; G 660 -U 723 ; WX 307 ; N uni02D3 ; G 661 -U 724 ; WX 500 ; N uni02D4 ; G 662 -U 725 ; WX 500 ; N uni02D5 ; G 663 -U 726 ; WX 390 ; N uni02D6 ; G 664 -U 727 ; WX 317 ; N uni02D7 ; G 665 -U 728 ; WX 500 ; N breve ; G 666 -U 729 ; WX 500 ; N dotaccent ; G 667 -U 730 ; WX 500 ; N ring ; G 668 -U 731 ; WX 500 ; N ogonek ; G 669 -U 732 ; WX 500 ; N tilde ; G 670 -U 733 ; WX 500 ; N hungarumlaut ; G 671 -U 734 ; WX 315 ; N uni02DE ; G 672 -U 735 ; WX 500 ; N uni02DF ; G 673 -U 736 ; WX 426 ; N uni02E0 ; G 674 -U 737 ; WX 166 ; N uni02E1 ; G 675 -U 738 ; WX 373 ; N uni02E2 ; G 676 -U 739 ; WX 444 ; N uni02E3 ; G 677 -U 740 ; WX 370 ; N uni02E4 ; G 678 -U 741 ; WX 493 ; N uni02E5 ; G 679 -U 742 ; WX 493 ; N uni02E6 ; G 680 -U 743 ; WX 493 ; N uni02E7 ; G 681 -U 744 ; WX 493 ; N uni02E8 ; G 682 -U 745 ; WX 493 ; N uni02E9 ; G 683 -U 748 ; WX 500 ; N uni02EC ; G 684 -U 749 ; WX 500 ; N uni02ED ; G 685 -U 750 ; WX 518 ; N uni02EE ; G 686 -U 755 ; WX 500 ; N uni02F3 ; G 687 -U 759 ; WX 500 ; N uni02F7 ; G 688 -U 768 ; WX 0 ; N gravecomb ; G 689 -U 769 ; WX 0 ; N acutecomb ; G 690 -U 770 ; WX 0 ; N uni0302 ; G 691 -U 771 ; WX 0 ; N tildecomb ; G 692 -U 772 ; WX 0 ; N uni0304 ; G 693 -U 773 ; WX 0 ; N uni0305 ; G 694 -U 774 ; WX 0 ; N uni0306 ; G 695 -U 775 ; WX 0 ; N uni0307 ; G 696 -U 776 ; WX 0 ; N uni0308 ; G 697 -U 777 ; WX 0 ; N hookabovecomb ; G 698 -U 778 ; WX 0 ; N uni030A ; G 699 -U 779 ; WX 0 ; N uni030B ; G 700 -U 780 ; WX 0 ; N uni030C ; G 701 -U 781 ; WX 0 ; N uni030D ; G 702 -U 782 ; WX 0 ; N uni030E ; G 703 -U 783 ; WX 0 ; N uni030F ; G 704 -U 784 ; WX 0 ; N uni0310 ; G 705 -U 785 ; WX 0 ; N uni0311 ; G 706 -U 786 ; WX 0 ; N uni0312 ; G 707 -U 787 ; WX 0 ; N uni0313 ; G 708 -U 788 ; WX 0 ; N uni0314 ; G 709 -U 789 ; WX 0 ; N uni0315 ; G 710 -U 790 ; WX 0 ; N uni0316 ; G 711 -U 791 ; WX 0 ; N uni0317 ; G 712 -U 792 ; WX 0 ; N uni0318 ; G 713 -U 793 ; WX 0 ; N uni0319 ; G 714 -U 794 ; WX 0 ; N uni031A ; G 715 -U 795 ; WX 0 ; N uni031B ; G 716 -U 796 ; WX 0 ; N uni031C ; G 717 -U 797 ; WX 0 ; N uni031D ; G 718 -U 798 ; WX 0 ; N uni031E ; G 719 -U 799 ; WX 0 ; N uni031F ; G 720 -U 800 ; WX 0 ; N uni0320 ; G 721 -U 801 ; WX 0 ; N uni0321 ; G 722 -U 802 ; WX 0 ; N uni0322 ; G 723 -U 803 ; WX 0 ; N dotbelowcomb ; G 724 -U 804 ; WX 0 ; N uni0324 ; G 725 -U 805 ; WX 0 ; N uni0325 ; G 726 -U 806 ; WX 0 ; N uni0326 ; G 727 -U 807 ; WX 0 ; N uni0327 ; G 728 -U 808 ; WX 0 ; N uni0328 ; G 729 -U 809 ; WX 0 ; N uni0329 ; G 730 -U 810 ; WX 0 ; N uni032A ; G 731 -U 811 ; WX 0 ; N uni032B ; G 732 -U 812 ; WX 0 ; N uni032C ; G 733 -U 813 ; WX 0 ; N uni032D ; G 734 -U 814 ; WX 0 ; N uni032E ; G 735 -U 815 ; WX 0 ; N uni032F ; G 736 -U 816 ; WX 0 ; N uni0330 ; G 737 -U 817 ; WX 0 ; N uni0331 ; G 738 -U 818 ; WX 0 ; N uni0332 ; G 739 -U 819 ; WX 0 ; N uni0333 ; G 740 -U 820 ; WX 0 ; N uni0334 ; G 741 -U 821 ; WX 0 ; N uni0335 ; G 742 -U 822 ; WX 0 ; N uni0336 ; G 743 -U 823 ; WX 0 ; N uni0337 ; G 744 -U 824 ; WX 0 ; N uni0338 ; G 745 -U 825 ; WX 0 ; N uni0339 ; G 746 -U 826 ; WX 0 ; N uni033A ; G 747 -U 827 ; WX 0 ; N uni033B ; G 748 -U 828 ; WX 0 ; N uni033C ; G 749 -U 829 ; WX 0 ; N uni033D ; G 750 -U 830 ; WX 0 ; N uni033E ; G 751 -U 831 ; WX 0 ; N uni033F ; G 752 -U 832 ; WX 0 ; N uni0340 ; G 753 -U 833 ; WX 0 ; N uni0341 ; G 754 -U 834 ; WX 0 ; N uni0342 ; G 755 -U 835 ; WX 0 ; N uni0343 ; G 756 -U 836 ; WX 0 ; N uni0344 ; G 757 -U 837 ; WX 0 ; N uni0345 ; G 758 -U 838 ; WX 0 ; N uni0346 ; G 759 -U 839 ; WX 0 ; N uni0347 ; G 760 -U 840 ; WX 0 ; N uni0348 ; G 761 -U 841 ; WX 0 ; N uni0349 ; G 762 -U 842 ; WX 0 ; N uni034A ; G 763 -U 843 ; WX 0 ; N uni034B ; G 764 -U 844 ; WX 0 ; N uni034C ; G 765 -U 845 ; WX 0 ; N uni034D ; G 766 -U 846 ; WX 0 ; N uni034E ; G 767 -U 847 ; WX 0 ; N uni034F ; G 768 -U 849 ; WX 0 ; N uni0351 ; G 769 -U 850 ; WX 0 ; N uni0352 ; G 770 -U 851 ; WX 0 ; N uni0353 ; G 771 -U 855 ; WX 0 ; N uni0357 ; G 772 -U 856 ; WX 0 ; N uni0358 ; G 773 -U 858 ; WX 0 ; N uni035A ; G 774 -U 860 ; WX 0 ; N uni035C ; G 775 -U 861 ; WX 0 ; N uni035D ; G 776 -U 862 ; WX 0 ; N uni035E ; G 777 -U 863 ; WX 0 ; N uni035F ; G 778 -U 864 ; WX 0 ; N uni0360 ; G 779 -U 865 ; WX 0 ; N uni0361 ; G 780 -U 866 ; WX 0 ; N uni0362 ; G 781 -U 880 ; WX 654 ; N uni0370 ; G 782 -U 881 ; WX 568 ; N uni0371 ; G 783 -U 882 ; WX 862 ; N uni0372 ; G 784 -U 883 ; WX 647 ; N uni0373 ; G 785 -U 884 ; WX 278 ; N uni0374 ; G 786 -U 885 ; WX 278 ; N uni0375 ; G 787 -U 886 ; WX 748 ; N uni0376 ; G 788 -U 887 ; WX 650 ; N uni0377 ; G 789 -U 890 ; WX 500 ; N uni037A ; G 790 -U 891 ; WX 549 ; N uni037B ; G 791 -U 892 ; WX 550 ; N uni037C ; G 792 -U 893 ; WX 549 ; N uni037D ; G 793 -U 894 ; WX 337 ; N uni037E ; G 794 -U 895 ; WX 295 ; N uni037F ; G 795 -U 900 ; WX 500 ; N tonos ; G 796 -U 901 ; WX 500 ; N dieresistonos ; G 797 -U 902 ; WX 692 ; N Alphatonos ; G 798 -U 903 ; WX 318 ; N anoteleia ; G 799 -U 904 ; WX 746 ; N Epsilontonos ; G 800 -U 905 ; WX 871 ; N Etatonos ; G 801 -U 906 ; WX 408 ; N Iotatonos ; G 802 -U 908 ; WX 813 ; N Omicrontonos ; G 803 -U 910 ; WX 825 ; N Upsilontonos ; G 804 -U 911 ; WX 826 ; N Omegatonos ; G 805 -U 912 ; WX 338 ; N iotadieresistonos ; G 806 -U 913 ; WX 684 ; N Alpha ; G 807 -U 914 ; WX 686 ; N Beta ; G 808 -U 915 ; WX 557 ; N Gamma ; G 809 -U 916 ; WX 684 ; N uni0394 ; G 810 -U 917 ; WX 632 ; N Epsilon ; G 811 -U 918 ; WX 685 ; N Zeta ; G 812 -U 919 ; WX 752 ; N Eta ; G 813 -U 920 ; WX 787 ; N Theta ; G 814 -U 921 ; WX 295 ; N Iota ; G 815 -U 922 ; WX 656 ; N Kappa ; G 816 -U 923 ; WX 684 ; N Lambda ; G 817 -U 924 ; WX 863 ; N Mu ; G 818 -U 925 ; WX 748 ; N Nu ; G 819 -U 926 ; WX 632 ; N Xi ; G 820 -U 927 ; WX 787 ; N Omicron ; G 821 -U 928 ; WX 752 ; N Pi ; G 822 -U 929 ; WX 603 ; N Rho ; G 823 -U 931 ; WX 632 ; N Sigma ; G 824 -U 932 ; WX 611 ; N Tau ; G 825 -U 933 ; WX 611 ; N Upsilon ; G 826 -U 934 ; WX 787 ; N Phi ; G 827 -U 935 ; WX 685 ; N Chi ; G 828 -U 936 ; WX 787 ; N Psi ; G 829 -U 937 ; WX 764 ; N Omega ; G 830 -U 938 ; WX 295 ; N Iotadieresis ; G 831 -U 939 ; WX 611 ; N Upsilondieresis ; G 832 -U 940 ; WX 659 ; N alphatonos ; G 833 -U 941 ; WX 541 ; N epsilontonos ; G 834 -U 942 ; WX 634 ; N etatonos ; G 835 -U 943 ; WX 338 ; N iotatonos ; G 836 -U 944 ; WX 579 ; N upsilondieresistonos ; G 837 -U 945 ; WX 659 ; N alpha ; G 838 -U 946 ; WX 638 ; N beta ; G 839 -U 947 ; WX 592 ; N gamma ; G 840 -U 948 ; WX 612 ; N delta ; G 841 -U 949 ; WX 541 ; N epsilon ; G 842 -U 950 ; WX 544 ; N zeta ; G 843 -U 951 ; WX 634 ; N eta ; G 844 -U 952 ; WX 612 ; N theta ; G 845 -U 953 ; WX 338 ; N iota ; G 846 -U 954 ; WX 589 ; N kappa ; G 847 -U 955 ; WX 592 ; N lambda ; G 848 -U 956 ; WX 636 ; N uni03BC ; G 849 -U 957 ; WX 559 ; N nu ; G 850 -U 958 ; WX 558 ; N xi ; G 851 -U 959 ; WX 612 ; N omicron ; G 852 -U 960 ; WX 602 ; N pi ; G 853 -U 961 ; WX 635 ; N rho ; G 854 -U 962 ; WX 587 ; N sigma1 ; G 855 -U 963 ; WX 634 ; N sigma ; G 856 -U 964 ; WX 602 ; N tau ; G 857 -U 965 ; WX 579 ; N upsilon ; G 858 -U 966 ; WX 660 ; N phi ; G 859 -U 967 ; WX 578 ; N chi ; G 860 -U 968 ; WX 660 ; N psi ; G 861 -U 969 ; WX 837 ; N omega ; G 862 -U 970 ; WX 338 ; N iotadieresis ; G 863 -U 971 ; WX 579 ; N upsilondieresis ; G 864 -U 972 ; WX 612 ; N omicrontonos ; G 865 -U 973 ; WX 579 ; N upsilontonos ; G 866 -U 974 ; WX 837 ; N omegatonos ; G 867 -U 975 ; WX 656 ; N uni03CF ; G 868 -U 976 ; WX 614 ; N uni03D0 ; G 869 -U 977 ; WX 619 ; N theta1 ; G 870 -U 978 ; WX 699 ; N Upsilon1 ; G 871 -U 979 ; WX 842 ; N uni03D3 ; G 872 -U 980 ; WX 699 ; N uni03D4 ; G 873 -U 981 ; WX 660 ; N phi1 ; G 874 -U 982 ; WX 837 ; N omega1 ; G 875 -U 983 ; WX 664 ; N uni03D7 ; G 876 -U 984 ; WX 787 ; N uni03D8 ; G 877 -U 985 ; WX 612 ; N uni03D9 ; G 878 -U 986 ; WX 648 ; N uni03DA ; G 879 -U 987 ; WX 587 ; N uni03DB ; G 880 -U 988 ; WX 575 ; N uni03DC ; G 881 -U 989 ; WX 458 ; N uni03DD ; G 882 -U 990 ; WX 660 ; N uni03DE ; G 883 -U 991 ; WX 660 ; N uni03DF ; G 884 -U 992 ; WX 865 ; N uni03E0 ; G 885 -U 993 ; WX 627 ; N uni03E1 ; G 886 -U 994 ; WX 934 ; N uni03E2 ; G 887 -U 995 ; WX 837 ; N uni03E3 ; G 888 -U 996 ; WX 758 ; N uni03E4 ; G 889 -U 997 ; WX 659 ; N uni03E5 ; G 890 -U 998 ; WX 792 ; N uni03E6 ; G 891 -U 999 ; WX 615 ; N uni03E7 ; G 892 -U 1000 ; WX 687 ; N uni03E8 ; G 893 -U 1001 ; WX 607 ; N uni03E9 ; G 894 -U 1002 ; WX 768 ; N uni03EA ; G 895 -U 1003 ; WX 625 ; N uni03EB ; G 896 -U 1004 ; WX 699 ; N uni03EC ; G 897 -U 1005 ; WX 612 ; N uni03ED ; G 898 -U 1006 ; WX 611 ; N uni03EE ; G 899 -U 1007 ; WX 536 ; N uni03EF ; G 900 -U 1008 ; WX 664 ; N uni03F0 ; G 901 -U 1009 ; WX 635 ; N uni03F1 ; G 902 -U 1010 ; WX 550 ; N uni03F2 ; G 903 -U 1011 ; WX 278 ; N uni03F3 ; G 904 -U 1012 ; WX 787 ; N uni03F4 ; G 905 -U 1013 ; WX 615 ; N uni03F5 ; G 906 -U 1014 ; WX 615 ; N uni03F6 ; G 907 -U 1015 ; WX 605 ; N uni03F7 ; G 908 -U 1016 ; WX 635 ; N uni03F8 ; G 909 -U 1017 ; WX 698 ; N uni03F9 ; G 910 -U 1018 ; WX 863 ; N uni03FA ; G 911 -U 1019 ; WX 651 ; N uni03FB ; G 912 -U 1020 ; WX 635 ; N uni03FC ; G 913 -U 1021 ; WX 703 ; N uni03FD ; G 914 -U 1022 ; WX 698 ; N uni03FE ; G 915 -U 1023 ; WX 703 ; N uni03FF ; G 916 -U 1024 ; WX 632 ; N uni0400 ; G 917 -U 1025 ; WX 632 ; N uni0401 ; G 918 -U 1026 ; WX 786 ; N uni0402 ; G 919 -U 1027 ; WX 610 ; N uni0403 ; G 920 -U 1028 ; WX 698 ; N uni0404 ; G 921 -U 1029 ; WX 635 ; N uni0405 ; G 922 -U 1030 ; WX 295 ; N uni0406 ; G 923 -U 1031 ; WX 295 ; N uni0407 ; G 924 -U 1032 ; WX 295 ; N uni0408 ; G 925 -U 1033 ; WX 1094 ; N uni0409 ; G 926 -U 1034 ; WX 1045 ; N uni040A ; G 927 -U 1035 ; WX 786 ; N uni040B ; G 928 -U 1036 ; WX 710 ; N uni040C ; G 929 -U 1037 ; WX 748 ; N uni040D ; G 930 -U 1038 ; WX 609 ; N uni040E ; G 931 -U 1039 ; WX 752 ; N uni040F ; G 932 -U 1040 ; WX 684 ; N uni0410 ; G 933 -U 1041 ; WX 686 ; N uni0411 ; G 934 -U 1042 ; WX 686 ; N uni0412 ; G 935 -U 1043 ; WX 610 ; N uni0413 ; G 936 -U 1044 ; WX 781 ; N uni0414 ; G 937 -U 1045 ; WX 632 ; N uni0415 ; G 938 -U 1046 ; WX 1077 ; N uni0416 ; G 939 -U 1047 ; WX 641 ; N uni0417 ; G 940 -U 1048 ; WX 748 ; N uni0418 ; G 941 -U 1049 ; WX 748 ; N uni0419 ; G 942 -U 1050 ; WX 710 ; N uni041A ; G 943 -U 1051 ; WX 752 ; N uni041B ; G 944 -U 1052 ; WX 863 ; N uni041C ; G 945 -U 1053 ; WX 752 ; N uni041D ; G 946 -U 1054 ; WX 787 ; N uni041E ; G 947 -U 1055 ; WX 752 ; N uni041F ; G 948 -U 1056 ; WX 603 ; N uni0420 ; G 949 -U 1057 ; WX 698 ; N uni0421 ; G 950 -U 1058 ; WX 611 ; N uni0422 ; G 951 -U 1059 ; WX 609 ; N uni0423 ; G 952 -U 1060 ; WX 861 ; N uni0424 ; G 953 -U 1061 ; WX 685 ; N uni0425 ; G 954 -U 1062 ; WX 776 ; N uni0426 ; G 955 -U 1063 ; WX 686 ; N uni0427 ; G 956 -U 1064 ; WX 1069 ; N uni0428 ; G 957 -U 1065 ; WX 1094 ; N uni0429 ; G 958 -U 1066 ; WX 833 ; N uni042A ; G 959 -U 1067 ; WX 882 ; N uni042B ; G 960 -U 1068 ; WX 686 ; N uni042C ; G 961 -U 1069 ; WX 698 ; N uni042D ; G 962 -U 1070 ; WX 1080 ; N uni042E ; G 963 -U 1071 ; WX 695 ; N uni042F ; G 964 -U 1072 ; WX 613 ; N uni0430 ; G 965 -U 1073 ; WX 617 ; N uni0431 ; G 966 -U 1074 ; WX 589 ; N uni0432 ; G 967 -U 1075 ; WX 525 ; N uni0433 ; G 968 -U 1076 ; WX 691 ; N uni0434 ; G 969 -U 1077 ; WX 615 ; N uni0435 ; G 970 -U 1078 ; WX 901 ; N uni0436 ; G 971 -U 1079 ; WX 532 ; N uni0437 ; G 972 -U 1080 ; WX 650 ; N uni0438 ; G 973 -U 1081 ; WX 650 ; N uni0439 ; G 974 -U 1082 ; WX 604 ; N uni043A ; G 975 -U 1083 ; WX 639 ; N uni043B ; G 976 -U 1084 ; WX 754 ; N uni043C ; G 977 -U 1085 ; WX 654 ; N uni043D ; G 978 -U 1086 ; WX 612 ; N uni043E ; G 979 -U 1087 ; WX 654 ; N uni043F ; G 980 -U 1088 ; WX 635 ; N uni0440 ; G 981 -U 1089 ; WX 550 ; N uni0441 ; G 982 -U 1090 ; WX 583 ; N uni0442 ; G 983 -U 1091 ; WX 592 ; N uni0443 ; G 984 -U 1092 ; WX 855 ; N uni0444 ; G 985 -U 1093 ; WX 592 ; N uni0445 ; G 986 -U 1094 ; WX 681 ; N uni0446 ; G 987 -U 1095 ; WX 591 ; N uni0447 ; G 988 -U 1096 ; WX 915 ; N uni0448 ; G 989 -U 1097 ; WX 942 ; N uni0449 ; G 990 -U 1098 ; WX 707 ; N uni044A ; G 991 -U 1099 ; WX 790 ; N uni044B ; G 992 -U 1100 ; WX 589 ; N uni044C ; G 993 -U 1101 ; WX 549 ; N uni044D ; G 994 -U 1102 ; WX 842 ; N uni044E ; G 995 -U 1103 ; WX 602 ; N uni044F ; G 996 -U 1104 ; WX 615 ; N uni0450 ; G 997 -U 1105 ; WX 615 ; N uni0451 ; G 998 -U 1106 ; WX 625 ; N uni0452 ; G 999 -U 1107 ; WX 525 ; N uni0453 ; G 1000 -U 1108 ; WX 549 ; N uni0454 ; G 1001 -U 1109 ; WX 521 ; N uni0455 ; G 1002 -U 1110 ; WX 278 ; N uni0456 ; G 1003 -U 1111 ; WX 278 ; N uni0457 ; G 1004 -U 1112 ; WX 278 ; N uni0458 ; G 1005 -U 1113 ; WX 902 ; N uni0459 ; G 1006 -U 1114 ; WX 898 ; N uni045A ; G 1007 -U 1115 ; WX 652 ; N uni045B ; G 1008 -U 1116 ; WX 604 ; N uni045C ; G 1009 -U 1117 ; WX 650 ; N uni045D ; G 1010 -U 1118 ; WX 592 ; N uni045E ; G 1011 -U 1119 ; WX 654 ; N uni045F ; G 1012 -U 1120 ; WX 934 ; N uni0460 ; G 1013 -U 1121 ; WX 837 ; N uni0461 ; G 1014 -U 1122 ; WX 771 ; N uni0462 ; G 1015 -U 1123 ; WX 672 ; N uni0463 ; G 1016 -U 1124 ; WX 942 ; N uni0464 ; G 1017 -U 1125 ; WX 749 ; N uni0465 ; G 1018 -U 1126 ; WX 879 ; N uni0466 ; G 1019 -U 1127 ; WX 783 ; N uni0467 ; G 1020 -U 1128 ; WX 1160 ; N uni0468 ; G 1021 -U 1129 ; WX 1001 ; N uni0469 ; G 1022 -U 1130 ; WX 787 ; N uni046A ; G 1023 -U 1131 ; WX 612 ; N uni046B ; G 1024 -U 1132 ; WX 1027 ; N uni046C ; G 1025 -U 1133 ; WX 824 ; N uni046D ; G 1026 -U 1134 ; WX 636 ; N uni046E ; G 1027 -U 1135 ; WX 541 ; N uni046F ; G 1028 -U 1136 ; WX 856 ; N uni0470 ; G 1029 -U 1137 ; WX 876 ; N uni0471 ; G 1030 -U 1138 ; WX 787 ; N uni0472 ; G 1031 -U 1139 ; WX 612 ; N uni0473 ; G 1032 -U 1140 ; WX 781 ; N uni0474 ; G 1033 -U 1141 ; WX 665 ; N uni0475 ; G 1034 -U 1142 ; WX 781 ; N uni0476 ; G 1035 -U 1143 ; WX 665 ; N uni0477 ; G 1036 -U 1144 ; WX 992 ; N uni0478 ; G 1037 -U 1145 ; WX 904 ; N uni0479 ; G 1038 -U 1146 ; WX 953 ; N uni047A ; G 1039 -U 1147 ; WX 758 ; N uni047B ; G 1040 -U 1148 ; WX 1180 ; N uni047C ; G 1041 -U 1149 ; WX 1028 ; N uni047D ; G 1042 -U 1150 ; WX 934 ; N uni047E ; G 1043 -U 1151 ; WX 837 ; N uni047F ; G 1044 -U 1152 ; WX 698 ; N uni0480 ; G 1045 -U 1153 ; WX 550 ; N uni0481 ; G 1046 -U 1154 ; WX 502 ; N uni0482 ; G 1047 -U 1155 ; WX 0 ; N uni0483 ; G 1048 -U 1156 ; WX 0 ; N uni0484 ; G 1049 -U 1157 ; WX 0 ; N uni0485 ; G 1050 -U 1158 ; WX 0 ; N uni0486 ; G 1051 -U 1159 ; WX 0 ; N uni0487 ; G 1052 -U 1160 ; WX 418 ; N uni0488 ; G 1053 -U 1161 ; WX 418 ; N uni0489 ; G 1054 -U 1162 ; WX 772 ; N uni048A ; G 1055 -U 1163 ; WX 677 ; N uni048B ; G 1056 -U 1164 ; WX 686 ; N uni048C ; G 1057 -U 1165 ; WX 589 ; N uni048D ; G 1058 -U 1166 ; WX 603 ; N uni048E ; G 1059 -U 1167 ; WX 635 ; N uni048F ; G 1060 -U 1168 ; WX 610 ; N uni0490 ; G 1061 -U 1169 ; WX 525 ; N uni0491 ; G 1062 -U 1170 ; WX 675 ; N uni0492 ; G 1063 -U 1171 ; WX 590 ; N uni0493 ; G 1064 -U 1172 ; WX 624 ; N uni0494 ; G 1065 -U 1173 ; WX 530 ; N uni0495 ; G 1066 -U 1174 ; WX 1077 ; N uni0496 ; G 1067 -U 1175 ; WX 901 ; N uni0497 ; G 1068 -U 1176 ; WX 641 ; N uni0498 ; G 1069 -U 1177 ; WX 532 ; N uni0499 ; G 1070 -U 1178 ; WX 710 ; N uni049A ; G 1071 -U 1179 ; WX 604 ; N uni049B ; G 1072 -U 1180 ; WX 710 ; N uni049C ; G 1073 -U 1181 ; WX 604 ; N uni049D ; G 1074 -U 1182 ; WX 710 ; N uni049E ; G 1075 -U 1183 ; WX 604 ; N uni049F ; G 1076 -U 1184 ; WX 856 ; N uni04A0 ; G 1077 -U 1185 ; WX 832 ; N uni04A1 ; G 1078 -U 1186 ; WX 752 ; N uni04A2 ; G 1079 -U 1187 ; WX 661 ; N uni04A3 ; G 1080 -U 1188 ; WX 1014 ; N uni04A4 ; G 1081 -U 1189 ; WX 877 ; N uni04A5 ; G 1082 -U 1190 ; WX 1081 ; N uni04A6 ; G 1083 -U 1191 ; WX 916 ; N uni04A7 ; G 1084 -U 1192 ; WX 878 ; N uni04A8 ; G 1085 -U 1193 ; WX 693 ; N uni04A9 ; G 1086 -U 1194 ; WX 698 ; N uni04AA ; G 1087 -U 1195 ; WX 550 ; N uni04AB ; G 1088 -U 1196 ; WX 611 ; N uni04AC ; G 1089 -U 1197 ; WX 583 ; N uni04AD ; G 1090 -U 1198 ; WX 611 ; N uni04AE ; G 1091 -U 1199 ; WX 592 ; N uni04AF ; G 1092 -U 1200 ; WX 611 ; N uni04B0 ; G 1093 -U 1201 ; WX 592 ; N uni04B1 ; G 1094 -U 1202 ; WX 685 ; N uni04B2 ; G 1095 -U 1203 ; WX 592 ; N uni04B3 ; G 1096 -U 1204 ; WX 934 ; N uni04B4 ; G 1097 -U 1205 ; WX 807 ; N uni04B5 ; G 1098 -U 1206 ; WX 686 ; N uni04B6 ; G 1099 -U 1207 ; WX 591 ; N uni04B7 ; G 1100 -U 1208 ; WX 686 ; N uni04B8 ; G 1101 -U 1209 ; WX 591 ; N uni04B9 ; G 1102 -U 1210 ; WX 686 ; N uni04BA ; G 1103 -U 1211 ; WX 634 ; N uni04BB ; G 1104 -U 1212 ; WX 941 ; N uni04BC ; G 1105 -U 1213 ; WX 728 ; N uni04BD ; G 1106 -U 1214 ; WX 941 ; N uni04BE ; G 1107 -U 1215 ; WX 728 ; N uni04BF ; G 1108 -U 1216 ; WX 295 ; N uni04C0 ; G 1109 -U 1217 ; WX 1077 ; N uni04C1 ; G 1110 -U 1218 ; WX 901 ; N uni04C2 ; G 1111 -U 1219 ; WX 656 ; N uni04C3 ; G 1112 -U 1220 ; WX 604 ; N uni04C4 ; G 1113 -U 1221 ; WX 776 ; N uni04C5 ; G 1114 -U 1222 ; WX 670 ; N uni04C6 ; G 1115 -U 1223 ; WX 752 ; N uni04C7 ; G 1116 -U 1224 ; WX 661 ; N uni04C8 ; G 1117 -U 1225 ; WX 776 ; N uni04C9 ; G 1118 -U 1226 ; WX 681 ; N uni04CA ; G 1119 -U 1227 ; WX 686 ; N uni04CB ; G 1120 -U 1228 ; WX 591 ; N uni04CC ; G 1121 -U 1229 ; WX 888 ; N uni04CD ; G 1122 -U 1230 ; WX 774 ; N uni04CE ; G 1123 -U 1231 ; WX 278 ; N uni04CF ; G 1124 -U 1232 ; WX 684 ; N uni04D0 ; G 1125 -U 1233 ; WX 613 ; N uni04D1 ; G 1126 -U 1234 ; WX 684 ; N uni04D2 ; G 1127 -U 1235 ; WX 613 ; N uni04D3 ; G 1128 -U 1236 ; WX 974 ; N uni04D4 ; G 1129 -U 1237 ; WX 982 ; N uni04D5 ; G 1130 -U 1238 ; WX 632 ; N uni04D6 ; G 1131 -U 1239 ; WX 615 ; N uni04D7 ; G 1132 -U 1240 ; WX 787 ; N uni04D8 ; G 1133 -U 1241 ; WX 615 ; N uni04D9 ; G 1134 -U 1242 ; WX 787 ; N uni04DA ; G 1135 -U 1243 ; WX 615 ; N uni04DB ; G 1136 -U 1244 ; WX 1077 ; N uni04DC ; G 1137 -U 1245 ; WX 901 ; N uni04DD ; G 1138 -U 1246 ; WX 641 ; N uni04DE ; G 1139 -U 1247 ; WX 532 ; N uni04DF ; G 1140 -U 1248 ; WX 666 ; N uni04E0 ; G 1141 -U 1249 ; WX 578 ; N uni04E1 ; G 1142 -U 1250 ; WX 748 ; N uni04E2 ; G 1143 -U 1251 ; WX 650 ; N uni04E3 ; G 1144 -U 1252 ; WX 748 ; N uni04E4 ; G 1145 -U 1253 ; WX 650 ; N uni04E5 ; G 1146 -U 1254 ; WX 787 ; N uni04E6 ; G 1147 -U 1255 ; WX 612 ; N uni04E7 ; G 1148 -U 1256 ; WX 787 ; N uni04E8 ; G 1149 -U 1257 ; WX 612 ; N uni04E9 ; G 1150 -U 1258 ; WX 787 ; N uni04EA ; G 1151 -U 1259 ; WX 612 ; N uni04EB ; G 1152 -U 1260 ; WX 698 ; N uni04EC ; G 1153 -U 1261 ; WX 549 ; N uni04ED ; G 1154 -U 1262 ; WX 609 ; N uni04EE ; G 1155 -U 1263 ; WX 592 ; N uni04EF ; G 1156 -U 1264 ; WX 609 ; N uni04F0 ; G 1157 -U 1265 ; WX 592 ; N uni04F1 ; G 1158 -U 1266 ; WX 609 ; N uni04F2 ; G 1159 -U 1267 ; WX 592 ; N uni04F3 ; G 1160 -U 1268 ; WX 686 ; N uni04F4 ; G 1161 -U 1269 ; WX 591 ; N uni04F5 ; G 1162 -U 1270 ; WX 610 ; N uni04F6 ; G 1163 -U 1271 ; WX 525 ; N uni04F7 ; G 1164 -U 1272 ; WX 882 ; N uni04F8 ; G 1165 -U 1273 ; WX 790 ; N uni04F9 ; G 1166 -U 1274 ; WX 675 ; N uni04FA ; G 1167 -U 1275 ; WX 590 ; N uni04FB ; G 1168 -U 1276 ; WX 685 ; N uni04FC ; G 1169 -U 1277 ; WX 592 ; N uni04FD ; G 1170 -U 1278 ; WX 685 ; N uni04FE ; G 1171 -U 1279 ; WX 592 ; N uni04FF ; G 1172 -U 1280 ; WX 686 ; N uni0500 ; G 1173 -U 1281 ; WX 589 ; N uni0501 ; G 1174 -U 1282 ; WX 1006 ; N uni0502 ; G 1175 -U 1283 ; WX 897 ; N uni0503 ; G 1176 -U 1284 ; WX 975 ; N uni0504 ; G 1177 -U 1285 ; WX 869 ; N uni0505 ; G 1178 -U 1286 ; WX 679 ; N uni0506 ; G 1179 -U 1287 ; WX 588 ; N uni0507 ; G 1180 -U 1288 ; WX 1072 ; N uni0508 ; G 1181 -U 1289 ; WX 957 ; N uni0509 ; G 1182 -U 1290 ; WX 1113 ; N uni050A ; G 1183 -U 1291 ; WX 967 ; N uni050B ; G 1184 -U 1292 ; WX 775 ; N uni050C ; G 1185 -U 1293 ; WX 660 ; N uni050D ; G 1186 -U 1294 ; WX 773 ; N uni050E ; G 1187 -U 1295 ; WX 711 ; N uni050F ; G 1188 -U 1296 ; WX 614 ; N uni0510 ; G 1189 -U 1297 ; WX 541 ; N uni0511 ; G 1190 -U 1298 ; WX 752 ; N uni0512 ; G 1191 -U 1299 ; WX 639 ; N uni0513 ; G 1192 -U 1300 ; WX 1169 ; N uni0514 ; G 1193 -U 1301 ; WX 994 ; N uni0515 ; G 1194 -U 1302 ; WX 894 ; N uni0516 ; G 1195 -U 1303 ; WX 864 ; N uni0517 ; G 1196 -U 1304 ; WX 1032 ; N uni0518 ; G 1197 -U 1305 ; WX 986 ; N uni0519 ; G 1198 -U 1306 ; WX 787 ; N uni051A ; G 1199 -U 1307 ; WX 635 ; N uni051B ; G 1200 -U 1308 ; WX 989 ; N uni051C ; G 1201 -U 1309 ; WX 818 ; N uni051D ; G 1202 -U 1310 ; WX 710 ; N uni051E ; G 1203 -U 1311 ; WX 604 ; N uni051F ; G 1204 -U 1312 ; WX 1081 ; N uni0520 ; G 1205 -U 1313 ; WX 905 ; N uni0521 ; G 1206 -U 1314 ; WX 1081 ; N uni0522 ; G 1207 -U 1315 ; WX 912 ; N uni0523 ; G 1208 -U 1316 ; WX 793 ; N uni0524 ; G 1209 -U 1317 ; WX 683 ; N uni0525 ; G 1210 -U 1329 ; WX 766 ; N uni0531 ; G 1211 -U 1330 ; WX 732 ; N uni0532 ; G 1212 -U 1331 ; WX 753 ; N uni0533 ; G 1213 -U 1332 ; WX 753 ; N uni0534 ; G 1214 -U 1333 ; WX 732 ; N uni0535 ; G 1215 -U 1334 ; WX 772 ; N uni0536 ; G 1216 -U 1335 ; WX 640 ; N uni0537 ; G 1217 -U 1336 ; WX 732 ; N uni0538 ; G 1218 -U 1337 ; WX 859 ; N uni0539 ; G 1219 -U 1338 ; WX 753 ; N uni053A ; G 1220 -U 1339 ; WX 691 ; N uni053B ; G 1221 -U 1340 ; WX 533 ; N uni053C ; G 1222 -U 1341 ; WX 922 ; N uni053D ; G 1223 -U 1342 ; WX 863 ; N uni053E ; G 1224 -U 1343 ; WX 732 ; N uni053F ; G 1225 -U 1344 ; WX 716 ; N uni0540 ; G 1226 -U 1345 ; WX 766 ; N uni0541 ; G 1227 -U 1346 ; WX 753 ; N uni0542 ; G 1228 -U 1347 ; WX 767 ; N uni0543 ; G 1229 -U 1348 ; WX 792 ; N uni0544 ; G 1230 -U 1349 ; WX 728 ; N uni0545 ; G 1231 -U 1350 ; WX 729 ; N uni0546 ; G 1232 -U 1351 ; WX 757 ; N uni0547 ; G 1233 -U 1352 ; WX 732 ; N uni0548 ; G 1234 -U 1353 ; WX 713 ; N uni0549 ; G 1235 -U 1354 ; WX 800 ; N uni054A ; G 1236 -U 1355 ; WX 768 ; N uni054B ; G 1237 -U 1356 ; WX 792 ; N uni054C ; G 1238 -U 1357 ; WX 732 ; N uni054D ; G 1239 -U 1358 ; WX 753 ; N uni054E ; G 1240 -U 1359 ; WX 705 ; N uni054F ; G 1241 -U 1360 ; WX 694 ; N uni0550 ; G 1242 -U 1361 ; WX 744 ; N uni0551 ; G 1243 -U 1362 ; WX 538 ; N uni0552 ; G 1244 -U 1363 ; WX 811 ; N uni0553 ; G 1245 -U 1364 ; WX 757 ; N uni0554 ; G 1246 -U 1365 ; WX 787 ; N uni0555 ; G 1247 -U 1366 ; WX 790 ; N uni0556 ; G 1248 -U 1369 ; WX 307 ; N uni0559 ; G 1249 -U 1370 ; WX 318 ; N uni055A ; G 1250 -U 1371 ; WX 234 ; N uni055B ; G 1251 -U 1372 ; WX 361 ; N uni055C ; G 1252 -U 1373 ; WX 238 ; N uni055D ; G 1253 -U 1374 ; WX 405 ; N uni055E ; G 1254 -U 1375 ; WX 500 ; N uni055F ; G 1255 -U 1377 ; WX 974 ; N uni0561 ; G 1256 -U 1378 ; WX 634 ; N uni0562 ; G 1257 -U 1379 ; WX 658 ; N uni0563 ; G 1258 -U 1380 ; WX 663 ; N uni0564 ; G 1259 -U 1381 ; WX 634 ; N uni0565 ; G 1260 -U 1382 ; WX 635 ; N uni0566 ; G 1261 -U 1383 ; WX 515 ; N uni0567 ; G 1262 -U 1384 ; WX 634 ; N uni0568 ; G 1263 -U 1385 ; WX 738 ; N uni0569 ; G 1264 -U 1386 ; WX 658 ; N uni056A ; G 1265 -U 1387 ; WX 634 ; N uni056B ; G 1266 -U 1388 ; WX 271 ; N uni056C ; G 1267 -U 1389 ; WX 980 ; N uni056D ; G 1268 -U 1390 ; WX 623 ; N uni056E ; G 1269 -U 1391 ; WX 634 ; N uni056F ; G 1270 -U 1392 ; WX 634 ; N uni0570 ; G 1271 -U 1393 ; WX 608 ; N uni0571 ; G 1272 -U 1394 ; WX 634 ; N uni0572 ; G 1273 -U 1395 ; WX 629 ; N uni0573 ; G 1274 -U 1396 ; WX 634 ; N uni0574 ; G 1275 -U 1397 ; WX 271 ; N uni0575 ; G 1276 -U 1398 ; WX 634 ; N uni0576 ; G 1277 -U 1399 ; WX 499 ; N uni0577 ; G 1278 -U 1400 ; WX 634 ; N uni0578 ; G 1279 -U 1401 ; WX 404 ; N uni0579 ; G 1280 -U 1402 ; WX 974 ; N uni057A ; G 1281 -U 1403 ; WX 560 ; N uni057B ; G 1282 -U 1404 ; WX 648 ; N uni057C ; G 1283 -U 1405 ; WX 634 ; N uni057D ; G 1284 -U 1406 ; WX 634 ; N uni057E ; G 1285 -U 1407 ; WX 974 ; N uni057F ; G 1286 -U 1408 ; WX 634 ; N uni0580 ; G 1287 -U 1409 ; WX 633 ; N uni0581 ; G 1288 -U 1410 ; WX 435 ; N uni0582 ; G 1289 -U 1411 ; WX 974 ; N uni0583 ; G 1290 -U 1412 ; WX 636 ; N uni0584 ; G 1291 -U 1413 ; WX 609 ; N uni0585 ; G 1292 -U 1414 ; WX 805 ; N uni0586 ; G 1293 -U 1415 ; WX 812 ; N uni0587 ; G 1294 -U 1417 ; WX 337 ; N uni0589 ; G 1295 -U 1418 ; WX 361 ; N uni058A ; G 1296 -U 1456 ; WX 0 ; N uni05B0 ; G 1297 -U 1457 ; WX 0 ; N uni05B1 ; G 1298 -U 1458 ; WX 0 ; N uni05B2 ; G 1299 -U 1459 ; WX 0 ; N uni05B3 ; G 1300 -U 1460 ; WX 0 ; N uni05B4 ; G 1301 -U 1461 ; WX 0 ; N uni05B5 ; G 1302 -U 1462 ; WX 0 ; N uni05B6 ; G 1303 -U 1463 ; WX 0 ; N uni05B7 ; G 1304 -U 1464 ; WX 0 ; N uni05B8 ; G 1305 -U 1465 ; WX 0 ; N uni05B9 ; G 1306 -U 1466 ; WX 0 ; N uni05BA ; G 1307 -U 1467 ; WX 0 ; N uni05BB ; G 1308 -U 1468 ; WX 0 ; N uni05BC ; G 1309 -U 1469 ; WX 0 ; N uni05BD ; G 1310 -U 1470 ; WX 361 ; N uni05BE ; G 1311 -U 1471 ; WX 0 ; N uni05BF ; G 1312 -U 1472 ; WX 295 ; N uni05C0 ; G 1313 -U 1473 ; WX 0 ; N uni05C1 ; G 1314 -U 1474 ; WX 0 ; N uni05C2 ; G 1315 -U 1475 ; WX 295 ; N uni05C3 ; G 1316 -U 1478 ; WX 441 ; N uni05C6 ; G 1317 -U 1479 ; WX 0 ; N uni05C7 ; G 1318 -U 1488 ; WX 668 ; N uni05D0 ; G 1319 -U 1489 ; WX 578 ; N uni05D1 ; G 1320 -U 1490 ; WX 412 ; N uni05D2 ; G 1321 -U 1491 ; WX 546 ; N uni05D3 ; G 1322 -U 1492 ; WX 653 ; N uni05D4 ; G 1323 -U 1493 ; WX 272 ; N uni05D5 ; G 1324 -U 1494 ; WX 346 ; N uni05D6 ; G 1325 -U 1495 ; WX 653 ; N uni05D7 ; G 1326 -U 1496 ; WX 648 ; N uni05D8 ; G 1327 -U 1497 ; WX 224 ; N uni05D9 ; G 1328 -U 1498 ; WX 537 ; N uni05DA ; G 1329 -U 1499 ; WX 529 ; N uni05DB ; G 1330 -U 1500 ; WX 568 ; N uni05DC ; G 1331 -U 1501 ; WX 664 ; N uni05DD ; G 1332 -U 1502 ; WX 679 ; N uni05DE ; G 1333 -U 1503 ; WX 272 ; N uni05DF ; G 1334 -U 1504 ; WX 400 ; N uni05E0 ; G 1335 -U 1505 ; WX 649 ; N uni05E1 ; G 1336 -U 1506 ; WX 626 ; N uni05E2 ; G 1337 -U 1507 ; WX 640 ; N uni05E3 ; G 1338 -U 1508 ; WX 625 ; N uni05E4 ; G 1339 -U 1509 ; WX 540 ; N uni05E5 ; G 1340 -U 1510 ; WX 593 ; N uni05E6 ; G 1341 -U 1511 ; WX 709 ; N uni05E7 ; G 1342 -U 1512 ; WX 564 ; N uni05E8 ; G 1343 -U 1513 ; WX 708 ; N uni05E9 ; G 1344 -U 1514 ; WX 657 ; N uni05EA ; G 1345 -U 1520 ; WX 471 ; N uni05F0 ; G 1346 -U 1521 ; WX 423 ; N uni05F1 ; G 1347 -U 1522 ; WX 331 ; N uni05F2 ; G 1348 -U 1523 ; WX 416 ; N uni05F3 ; G 1349 -U 1524 ; WX 645 ; N uni05F4 ; G 1350 -U 1542 ; WX 637 ; N uni0606 ; G 1351 -U 1543 ; WX 637 ; N uni0607 ; G 1352 -U 1545 ; WX 757 ; N uni0609 ; G 1353 -U 1546 ; WX 977 ; N uni060A ; G 1354 -U 1548 ; WX 323 ; N uni060C ; G 1355 -U 1557 ; WX 0 ; N uni0615 ; G 1356 -U 1563 ; WX 318 ; N uni061B ; G 1357 -U 1567 ; WX 531 ; N uni061F ; G 1358 -U 1569 ; WX 470 ; N uni0621 ; G 1359 -U 1570 ; WX 278 ; N uni0622 ; G 1360 -U 1571 ; WX 278 ; N uni0623 ; G 1361 -U 1572 ; WX 483 ; N uni0624 ; G 1362 -U 1573 ; WX 278 ; N uni0625 ; G 1363 -U 1574 ; WX 783 ; N uni0626 ; G 1364 -U 1575 ; WX 278 ; N uni0627 ; G 1365 -U 1576 ; WX 941 ; N uni0628 ; G 1366 -U 1577 ; WX 524 ; N uni0629 ; G 1367 -U 1578 ; WX 941 ; N uni062A ; G 1368 -U 1579 ; WX 941 ; N uni062B ; G 1369 -U 1580 ; WX 646 ; N uni062C ; G 1370 -U 1581 ; WX 646 ; N uni062D ; G 1371 -U 1582 ; WX 646 ; N uni062E ; G 1372 -U 1583 ; WX 445 ; N uni062F ; G 1373 -U 1584 ; WX 445 ; N uni0630 ; G 1374 -U 1585 ; WX 483 ; N uni0631 ; G 1375 -U 1586 ; WX 483 ; N uni0632 ; G 1376 -U 1587 ; WX 1221 ; N uni0633 ; G 1377 -U 1588 ; WX 1221 ; N uni0634 ; G 1378 -U 1589 ; WX 1209 ; N uni0635 ; G 1379 -U 1590 ; WX 1209 ; N uni0636 ; G 1380 -U 1591 ; WX 925 ; N uni0637 ; G 1381 -U 1592 ; WX 925 ; N uni0638 ; G 1382 -U 1593 ; WX 597 ; N uni0639 ; G 1383 -U 1594 ; WX 597 ; N uni063A ; G 1384 -U 1600 ; WX 293 ; N uni0640 ; G 1385 -U 1601 ; WX 1037 ; N uni0641 ; G 1386 -U 1602 ; WX 776 ; N uni0642 ; G 1387 -U 1603 ; WX 824 ; N uni0643 ; G 1388 -U 1604 ; WX 727 ; N uni0644 ; G 1389 -U 1605 ; WX 619 ; N uni0645 ; G 1390 -U 1606 ; WX 734 ; N uni0646 ; G 1391 -U 1607 ; WX 524 ; N uni0647 ; G 1392 -U 1608 ; WX 483 ; N uni0648 ; G 1393 -U 1609 ; WX 783 ; N uni0649 ; G 1394 -U 1610 ; WX 783 ; N uni064A ; G 1395 -U 1611 ; WX 0 ; N uni064B ; G 1396 -U 1612 ; WX 0 ; N uni064C ; G 1397 -U 1613 ; WX 0 ; N uni064D ; G 1398 -U 1614 ; WX 0 ; N uni064E ; G 1399 -U 1615 ; WX 0 ; N uni064F ; G 1400 -U 1616 ; WX 0 ; N uni0650 ; G 1401 -U 1617 ; WX 0 ; N uni0651 ; G 1402 -U 1618 ; WX 0 ; N uni0652 ; G 1403 -U 1619 ; WX 0 ; N uni0653 ; G 1404 -U 1620 ; WX 0 ; N uni0654 ; G 1405 -U 1621 ; WX 0 ; N uni0655 ; G 1406 -U 1623 ; WX 0 ; N uni0657 ; G 1407 -U 1626 ; WX 500 ; N uni065A ; G 1408 -U 1632 ; WX 537 ; N uni0660 ; G 1409 -U 1633 ; WX 537 ; N uni0661 ; G 1410 -U 1634 ; WX 537 ; N uni0662 ; G 1411 -U 1635 ; WX 537 ; N uni0663 ; G 1412 -U 1636 ; WX 537 ; N uni0664 ; G 1413 -U 1637 ; WX 537 ; N uni0665 ; G 1414 -U 1638 ; WX 537 ; N uni0666 ; G 1415 -U 1639 ; WX 537 ; N uni0667 ; G 1416 -U 1640 ; WX 537 ; N uni0668 ; G 1417 -U 1641 ; WX 537 ; N uni0669 ; G 1418 -U 1642 ; WX 537 ; N uni066A ; G 1419 -U 1643 ; WX 325 ; N uni066B ; G 1420 -U 1644 ; WX 318 ; N uni066C ; G 1421 -U 1645 ; WX 545 ; N uni066D ; G 1422 -U 1646 ; WX 941 ; N uni066E ; G 1423 -U 1647 ; WX 776 ; N uni066F ; G 1424 -U 1648 ; WX 0 ; N uni0670 ; G 1425 -U 1652 ; WX 292 ; N uni0674 ; G 1426 -U 1657 ; WX 941 ; N uni0679 ; G 1427 -U 1658 ; WX 941 ; N uni067A ; G 1428 -U 1659 ; WX 941 ; N uni067B ; G 1429 -U 1660 ; WX 941 ; N uni067C ; G 1430 -U 1661 ; WX 941 ; N uni067D ; G 1431 -U 1662 ; WX 941 ; N uni067E ; G 1432 -U 1663 ; WX 941 ; N uni067F ; G 1433 -U 1664 ; WX 941 ; N uni0680 ; G 1434 -U 1665 ; WX 646 ; N uni0681 ; G 1435 -U 1666 ; WX 646 ; N uni0682 ; G 1436 -U 1667 ; WX 646 ; N uni0683 ; G 1437 -U 1668 ; WX 646 ; N uni0684 ; G 1438 -U 1669 ; WX 646 ; N uni0685 ; G 1439 -U 1670 ; WX 646 ; N uni0686 ; G 1440 -U 1671 ; WX 646 ; N uni0687 ; G 1441 -U 1672 ; WX 445 ; N uni0688 ; G 1442 -U 1673 ; WX 445 ; N uni0689 ; G 1443 -U 1674 ; WX 445 ; N uni068A ; G 1444 -U 1675 ; WX 445 ; N uni068B ; G 1445 -U 1676 ; WX 445 ; N uni068C ; G 1446 -U 1677 ; WX 445 ; N uni068D ; G 1447 -U 1678 ; WX 445 ; N uni068E ; G 1448 -U 1679 ; WX 445 ; N uni068F ; G 1449 -U 1680 ; WX 445 ; N uni0690 ; G 1450 -U 1681 ; WX 483 ; N uni0691 ; G 1451 -U 1682 ; WX 483 ; N uni0692 ; G 1452 -U 1683 ; WX 498 ; N uni0693 ; G 1453 -U 1684 ; WX 530 ; N uni0694 ; G 1454 -U 1685 ; WX 610 ; N uni0695 ; G 1455 -U 1686 ; WX 530 ; N uni0696 ; G 1456 -U 1687 ; WX 483 ; N uni0697 ; G 1457 -U 1688 ; WX 483 ; N uni0698 ; G 1458 -U 1689 ; WX 483 ; N uni0699 ; G 1459 -U 1690 ; WX 1221 ; N uni069A ; G 1460 -U 1691 ; WX 1221 ; N uni069B ; G 1461 -U 1692 ; WX 1221 ; N uni069C ; G 1462 -U 1693 ; WX 1209 ; N uni069D ; G 1463 -U 1694 ; WX 1209 ; N uni069E ; G 1464 -U 1695 ; WX 925 ; N uni069F ; G 1465 -U 1696 ; WX 597 ; N uni06A0 ; G 1466 -U 1697 ; WX 1037 ; N uni06A1 ; G 1467 -U 1698 ; WX 1037 ; N uni06A2 ; G 1468 -U 1699 ; WX 1037 ; N uni06A3 ; G 1469 -U 1700 ; WX 1037 ; N uni06A4 ; G 1470 -U 1701 ; WX 1037 ; N uni06A5 ; G 1471 -U 1702 ; WX 1037 ; N uni06A6 ; G 1472 -U 1703 ; WX 776 ; N uni06A7 ; G 1473 -U 1704 ; WX 776 ; N uni06A8 ; G 1474 -U 1705 ; WX 895 ; N uni06A9 ; G 1475 -U 1706 ; WX 1054 ; N uni06AA ; G 1476 -U 1707 ; WX 895 ; N uni06AB ; G 1477 -U 1708 ; WX 824 ; N uni06AC ; G 1478 -U 1709 ; WX 824 ; N uni06AD ; G 1479 -U 1710 ; WX 824 ; N uni06AE ; G 1480 -U 1711 ; WX 895 ; N uni06AF ; G 1481 -U 1712 ; WX 895 ; N uni06B0 ; G 1482 -U 1713 ; WX 895 ; N uni06B1 ; G 1483 -U 1714 ; WX 895 ; N uni06B2 ; G 1484 -U 1715 ; WX 895 ; N uni06B3 ; G 1485 -U 1716 ; WX 895 ; N uni06B4 ; G 1486 -U 1717 ; WX 727 ; N uni06B5 ; G 1487 -U 1718 ; WX 727 ; N uni06B6 ; G 1488 -U 1719 ; WX 727 ; N uni06B7 ; G 1489 -U 1720 ; WX 727 ; N uni06B8 ; G 1490 -U 1721 ; WX 734 ; N uni06B9 ; G 1491 -U 1722 ; WX 734 ; N uni06BA ; G 1492 -U 1723 ; WX 734 ; N uni06BB ; G 1493 -U 1724 ; WX 734 ; N uni06BC ; G 1494 -U 1725 ; WX 734 ; N uni06BD ; G 1495 -U 1726 ; WX 698 ; N uni06BE ; G 1496 -U 1727 ; WX 646 ; N uni06BF ; G 1497 -U 1734 ; WX 483 ; N uni06C6 ; G 1498 -U 1735 ; WX 483 ; N uni06C7 ; G 1499 -U 1736 ; WX 483 ; N uni06C8 ; G 1500 -U 1739 ; WX 483 ; N uni06CB ; G 1501 -U 1740 ; WX 783 ; N uni06CC ; G 1502 -U 1742 ; WX 783 ; N uni06CE ; G 1503 -U 1744 ; WX 783 ; N uni06D0 ; G 1504 -U 1749 ; WX 524 ; N uni06D5 ; G 1505 -U 1776 ; WX 537 ; N uni06F0 ; G 1506 -U 1777 ; WX 537 ; N uni06F1 ; G 1507 -U 1778 ; WX 537 ; N uni06F2 ; G 1508 -U 1779 ; WX 537 ; N uni06F3 ; G 1509 -U 1780 ; WX 537 ; N uni06F4 ; G 1510 -U 1781 ; WX 537 ; N uni06F5 ; G 1511 -U 1782 ; WX 537 ; N uni06F6 ; G 1512 -U 1783 ; WX 537 ; N uni06F7 ; G 1513 -U 1784 ; WX 537 ; N uni06F8 ; G 1514 -U 1785 ; WX 537 ; N uni06F9 ; G 1515 -U 1984 ; WX 636 ; N uni07C0 ; G 1516 -U 1985 ; WX 636 ; N uni07C1 ; G 1517 -U 1986 ; WX 636 ; N uni07C2 ; G 1518 -U 1987 ; WX 636 ; N uni07C3 ; G 1519 -U 1988 ; WX 636 ; N uni07C4 ; G 1520 -U 1989 ; WX 636 ; N uni07C5 ; G 1521 -U 1990 ; WX 636 ; N uni07C6 ; G 1522 -U 1991 ; WX 636 ; N uni07C7 ; G 1523 -U 1992 ; WX 636 ; N uni07C8 ; G 1524 -U 1993 ; WX 636 ; N uni07C9 ; G 1525 -U 1994 ; WX 278 ; N uni07CA ; G 1526 -U 1995 ; WX 571 ; N uni07CB ; G 1527 -U 1996 ; WX 424 ; N uni07CC ; G 1528 -U 1997 ; WX 592 ; N uni07CD ; G 1529 -U 1998 ; WX 654 ; N uni07CE ; G 1530 -U 1999 ; WX 654 ; N uni07CF ; G 1531 -U 2000 ; WX 594 ; N uni07D0 ; G 1532 -U 2001 ; WX 654 ; N uni07D1 ; G 1533 -U 2002 ; WX 829 ; N uni07D2 ; G 1534 -U 2003 ; WX 438 ; N uni07D3 ; G 1535 -U 2004 ; WX 438 ; N uni07D4 ; G 1536 -U 2005 ; WX 559 ; N uni07D5 ; G 1537 -U 2006 ; WX 612 ; N uni07D6 ; G 1538 -U 2007 ; WX 350 ; N uni07D7 ; G 1539 -U 2008 ; WX 959 ; N uni07D8 ; G 1540 -U 2009 ; WX 473 ; N uni07D9 ; G 1541 -U 2010 ; WX 783 ; N uni07DA ; G 1542 -U 2011 ; WX 654 ; N uni07DB ; G 1543 -U 2012 ; WX 625 ; N uni07DC ; G 1544 -U 2013 ; WX 734 ; N uni07DD ; G 1545 -U 2014 ; WX 530 ; N uni07DE ; G 1546 -U 2015 ; WX 724 ; N uni07DF ; G 1547 -U 2016 ; WX 473 ; N uni07E0 ; G 1548 -U 2017 ; WX 625 ; N uni07E1 ; G 1549 -U 2018 ; WX 594 ; N uni07E2 ; G 1550 -U 2019 ; WX 530 ; N uni07E3 ; G 1551 -U 2020 ; WX 530 ; N uni07E4 ; G 1552 -U 2021 ; WX 522 ; N uni07E5 ; G 1553 -U 2022 ; WX 594 ; N uni07E6 ; G 1554 -U 2023 ; WX 594 ; N uni07E7 ; G 1555 -U 2027 ; WX 0 ; N uni07EB ; G 1556 -U 2028 ; WX 0 ; N uni07EC ; G 1557 -U 2029 ; WX 0 ; N uni07ED ; G 1558 -U 2030 ; WX 0 ; N uni07EE ; G 1559 -U 2031 ; WX 0 ; N uni07EF ; G 1560 -U 2032 ; WX 0 ; N uni07F0 ; G 1561 -U 2033 ; WX 0 ; N uni07F1 ; G 1562 -U 2034 ; WX 0 ; N uni07F2 ; G 1563 -U 2035 ; WX 0 ; N uni07F3 ; G 1564 -U 2036 ; WX 313 ; N uni07F4 ; G 1565 -U 2037 ; WX 313 ; N uni07F5 ; G 1566 -U 2040 ; WX 560 ; N uni07F8 ; G 1567 -U 2041 ; WX 560 ; N uni07F9 ; G 1568 -U 2042 ; WX 361 ; N uni07FA ; G 1569 -U 3647 ; WX 636 ; N uni0E3F ; G 1570 -U 3713 ; WX 670 ; N uni0E81 ; G 1571 -U 3714 ; WX 684 ; N uni0E82 ; G 1572 -U 3716 ; WX 688 ; N uni0E84 ; G 1573 -U 3719 ; WX 482 ; N uni0E87 ; G 1574 -U 3720 ; WX 628 ; N uni0E88 ; G 1575 -U 3722 ; WX 684 ; N uni0E8A ; G 1576 -U 3725 ; WX 688 ; N uni0E8D ; G 1577 -U 3732 ; WX 669 ; N uni0E94 ; G 1578 -U 3733 ; WX 642 ; N uni0E95 ; G 1579 -U 3734 ; WX 645 ; N uni0E96 ; G 1580 -U 3735 ; WX 655 ; N uni0E97 ; G 1581 -U 3737 ; WX 659 ; N uni0E99 ; G 1582 -U 3738 ; WX 625 ; N uni0E9A ; G 1583 -U 3739 ; WX 625 ; N uni0E9B ; G 1584 -U 3740 ; WX 745 ; N uni0E9C ; G 1585 -U 3741 ; WX 767 ; N uni0E9D ; G 1586 -U 3742 ; WX 687 ; N uni0E9E ; G 1587 -U 3743 ; WX 687 ; N uni0E9F ; G 1588 -U 3745 ; WX 702 ; N uni0EA1 ; G 1589 -U 3746 ; WX 688 ; N uni0EA2 ; G 1590 -U 3747 ; WX 684 ; N uni0EA3 ; G 1591 -U 3749 ; WX 649 ; N uni0EA5 ; G 1592 -U 3751 ; WX 632 ; N uni0EA7 ; G 1593 -U 3754 ; WX 703 ; N uni0EAA ; G 1594 -U 3755 ; WX 819 ; N uni0EAB ; G 1595 -U 3757 ; WX 633 ; N uni0EAD ; G 1596 -U 3758 ; WX 684 ; N uni0EAE ; G 1597 -U 3759 ; WX 788 ; N uni0EAF ; G 1598 -U 3760 ; WX 632 ; N uni0EB0 ; G 1599 -U 3761 ; WX 0 ; N uni0EB1 ; G 1600 -U 3762 ; WX 539 ; N uni0EB2 ; G 1601 -U 3763 ; WX 539 ; N uni0EB3 ; G 1602 -U 3764 ; WX 0 ; N uni0EB4 ; G 1603 -U 3765 ; WX 0 ; N uni0EB5 ; G 1604 -U 3766 ; WX 0 ; N uni0EB6 ; G 1605 -U 3767 ; WX 0 ; N uni0EB7 ; G 1606 -U 3768 ; WX 0 ; N uni0EB8 ; G 1607 -U 3769 ; WX 0 ; N uni0EB9 ; G 1608 -U 3771 ; WX 0 ; N uni0EBB ; G 1609 -U 3772 ; WX 0 ; N uni0EBC ; G 1610 -U 3773 ; WX 663 ; N uni0EBD ; G 1611 -U 3776 ; WX 375 ; N uni0EC0 ; G 1612 -U 3777 ; WX 657 ; N uni0EC1 ; G 1613 -U 3778 ; WX 460 ; N uni0EC2 ; G 1614 -U 3779 ; WX 547 ; N uni0EC3 ; G 1615 -U 3780 ; WX 491 ; N uni0EC4 ; G 1616 -U 3782 ; WX 674 ; N uni0EC6 ; G 1617 -U 3784 ; WX 0 ; N uni0EC8 ; G 1618 -U 3785 ; WX 0 ; N uni0EC9 ; G 1619 -U 3786 ; WX 0 ; N uni0ECA ; G 1620 -U 3787 ; WX 0 ; N uni0ECB ; G 1621 -U 3788 ; WX 0 ; N uni0ECC ; G 1622 -U 3789 ; WX 0 ; N uni0ECD ; G 1623 -U 3792 ; WX 636 ; N uni0ED0 ; G 1624 -U 3793 ; WX 641 ; N uni0ED1 ; G 1625 -U 3794 ; WX 641 ; N uni0ED2 ; G 1626 -U 3795 ; WX 670 ; N uni0ED3 ; G 1627 -U 3796 ; WX 625 ; N uni0ED4 ; G 1628 -U 3797 ; WX 625 ; N uni0ED5 ; G 1629 -U 3798 ; WX 703 ; N uni0ED6 ; G 1630 -U 3799 ; WX 670 ; N uni0ED7 ; G 1631 -U 3800 ; WX 674 ; N uni0ED8 ; G 1632 -U 3801 ; WX 677 ; N uni0ED9 ; G 1633 -U 3804 ; WX 1028 ; N uni0EDC ; G 1634 -U 3805 ; WX 1028 ; N uni0EDD ; G 1635 -U 4256 ; WX 874 ; N uni10A0 ; G 1636 -U 4257 ; WX 733 ; N uni10A1 ; G 1637 -U 4258 ; WX 679 ; N uni10A2 ; G 1638 -U 4259 ; WX 834 ; N uni10A3 ; G 1639 -U 4260 ; WX 615 ; N uni10A4 ; G 1640 -U 4261 ; WX 768 ; N uni10A5 ; G 1641 -U 4262 ; WX 753 ; N uni10A6 ; G 1642 -U 4263 ; WX 914 ; N uni10A7 ; G 1643 -U 4264 ; WX 453 ; N uni10A8 ; G 1644 -U 4265 ; WX 620 ; N uni10A9 ; G 1645 -U 4266 ; WX 843 ; N uni10AA ; G 1646 -U 4267 ; WX 882 ; N uni10AB ; G 1647 -U 4268 ; WX 625 ; N uni10AC ; G 1648 -U 4269 ; WX 854 ; N uni10AD ; G 1649 -U 4270 ; WX 781 ; N uni10AE ; G 1650 -U 4271 ; WX 629 ; N uni10AF ; G 1651 -U 4272 ; WX 912 ; N uni10B0 ; G 1652 -U 4273 ; WX 621 ; N uni10B1 ; G 1653 -U 4274 ; WX 620 ; N uni10B2 ; G 1654 -U 4275 ; WX 854 ; N uni10B3 ; G 1655 -U 4276 ; WX 866 ; N uni10B4 ; G 1656 -U 4277 ; WX 724 ; N uni10B5 ; G 1657 -U 4278 ; WX 630 ; N uni10B6 ; G 1658 -U 4279 ; WX 621 ; N uni10B7 ; G 1659 -U 4280 ; WX 625 ; N uni10B8 ; G 1660 -U 4281 ; WX 620 ; N uni10B9 ; G 1661 -U 4282 ; WX 818 ; N uni10BA ; G 1662 -U 4283 ; WX 874 ; N uni10BB ; G 1663 -U 4284 ; WX 615 ; N uni10BC ; G 1664 -U 4285 ; WX 623 ; N uni10BD ; G 1665 -U 4286 ; WX 625 ; N uni10BE ; G 1666 -U 4287 ; WX 725 ; N uni10BF ; G 1667 -U 4288 ; WX 844 ; N uni10C0 ; G 1668 -U 4289 ; WX 596 ; N uni10C1 ; G 1669 -U 4290 ; WX 688 ; N uni10C2 ; G 1670 -U 4291 ; WX 596 ; N uni10C3 ; G 1671 -U 4292 ; WX 594 ; N uni10C4 ; G 1672 -U 4293 ; WX 738 ; N uni10C5 ; G 1673 -U 4304 ; WX 508 ; N uni10D0 ; G 1674 -U 4305 ; WX 518 ; N uni10D1 ; G 1675 -U 4306 ; WX 581 ; N uni10D2 ; G 1676 -U 4307 ; WX 818 ; N uni10D3 ; G 1677 -U 4308 ; WX 508 ; N uni10D4 ; G 1678 -U 4309 ; WX 513 ; N uni10D5 ; G 1679 -U 4310 ; WX 500 ; N uni10D6 ; G 1680 -U 4311 ; WX 801 ; N uni10D7 ; G 1681 -U 4312 ; WX 518 ; N uni10D8 ; G 1682 -U 4313 ; WX 510 ; N uni10D9 ; G 1683 -U 4314 ; WX 1064 ; N uni10DA ; G 1684 -U 4315 ; WX 522 ; N uni10DB ; G 1685 -U 4316 ; WX 522 ; N uni10DC ; G 1686 -U 4317 ; WX 786 ; N uni10DD ; G 1687 -U 4318 ; WX 508 ; N uni10DE ; G 1688 -U 4319 ; WX 518 ; N uni10DF ; G 1689 -U 4320 ; WX 796 ; N uni10E0 ; G 1690 -U 4321 ; WX 522 ; N uni10E1 ; G 1691 -U 4322 ; WX 654 ; N uni10E2 ; G 1692 -U 4323 ; WX 522 ; N uni10E3 ; G 1693 -U 4324 ; WX 825 ; N uni10E4 ; G 1694 -U 4325 ; WX 513 ; N uni10E5 ; G 1695 -U 4326 ; WX 786 ; N uni10E6 ; G 1696 -U 4327 ; WX 518 ; N uni10E7 ; G 1697 -U 4328 ; WX 518 ; N uni10E8 ; G 1698 -U 4329 ; WX 522 ; N uni10E9 ; G 1699 -U 4330 ; WX 571 ; N uni10EA ; G 1700 -U 4331 ; WX 522 ; N uni10EB ; G 1701 -U 4332 ; WX 518 ; N uni10EC ; G 1702 -U 4333 ; WX 520 ; N uni10ED ; G 1703 -U 4334 ; WX 522 ; N uni10EE ; G 1704 -U 4335 ; WX 454 ; N uni10EF ; G 1705 -U 4336 ; WX 508 ; N uni10F0 ; G 1706 -U 4337 ; WX 518 ; N uni10F1 ; G 1707 -U 4338 ; WX 508 ; N uni10F2 ; G 1708 -U 4339 ; WX 508 ; N uni10F3 ; G 1709 -U 4340 ; WX 518 ; N uni10F4 ; G 1710 -U 4341 ; WX 554 ; N uni10F5 ; G 1711 -U 4342 ; WX 828 ; N uni10F6 ; G 1712 -U 4343 ; WX 552 ; N uni10F7 ; G 1713 -U 4344 ; WX 508 ; N uni10F8 ; G 1714 -U 4345 ; WX 571 ; N uni10F9 ; G 1715 -U 4346 ; WX 508 ; N uni10FA ; G 1716 -U 4347 ; WX 448 ; N uni10FB ; G 1717 -U 4348 ; WX 324 ; N uni10FC ; G 1718 -U 5121 ; WX 684 ; N uni1401 ; G 1719 -U 5122 ; WX 684 ; N uni1402 ; G 1720 -U 5123 ; WX 684 ; N uni1403 ; G 1721 -U 5124 ; WX 684 ; N uni1404 ; G 1722 -U 5125 ; WX 769 ; N uni1405 ; G 1723 -U 5126 ; WX 769 ; N uni1406 ; G 1724 -U 5127 ; WX 769 ; N uni1407 ; G 1725 -U 5129 ; WX 769 ; N uni1409 ; G 1726 -U 5130 ; WX 769 ; N uni140A ; G 1727 -U 5131 ; WX 769 ; N uni140B ; G 1728 -U 5132 ; WX 835 ; N uni140C ; G 1729 -U 5133 ; WX 834 ; N uni140D ; G 1730 -U 5134 ; WX 835 ; N uni140E ; G 1731 -U 5135 ; WX 834 ; N uni140F ; G 1732 -U 5136 ; WX 835 ; N uni1410 ; G 1733 -U 5137 ; WX 834 ; N uni1411 ; G 1734 -U 5138 ; WX 967 ; N uni1412 ; G 1735 -U 5139 ; WX 1007 ; N uni1413 ; G 1736 -U 5140 ; WX 967 ; N uni1414 ; G 1737 -U 5141 ; WX 1007 ; N uni1415 ; G 1738 -U 5142 ; WX 769 ; N uni1416 ; G 1739 -U 5143 ; WX 967 ; N uni1417 ; G 1740 -U 5144 ; WX 1007 ; N uni1418 ; G 1741 -U 5145 ; WX 967 ; N uni1419 ; G 1742 -U 5146 ; WX 1007 ; N uni141A ; G 1743 -U 5147 ; WX 769 ; N uni141B ; G 1744 -U 5149 ; WX 256 ; N uni141D ; G 1745 -U 5150 ; WX 543 ; N uni141E ; G 1746 -U 5151 ; WX 423 ; N uni141F ; G 1747 -U 5152 ; WX 423 ; N uni1420 ; G 1748 -U 5153 ; WX 389 ; N uni1421 ; G 1749 -U 5154 ; WX 389 ; N uni1422 ; G 1750 -U 5155 ; WX 393 ; N uni1423 ; G 1751 -U 5156 ; WX 389 ; N uni1424 ; G 1752 -U 5157 ; WX 466 ; N uni1425 ; G 1753 -U 5158 ; WX 385 ; N uni1426 ; G 1754 -U 5159 ; WX 256 ; N uni1427 ; G 1755 -U 5160 ; WX 389 ; N uni1428 ; G 1756 -U 5161 ; WX 389 ; N uni1429 ; G 1757 -U 5162 ; WX 389 ; N uni142A ; G 1758 -U 5163 ; WX 1090 ; N uni142B ; G 1759 -U 5164 ; WX 909 ; N uni142C ; G 1760 -U 5165 ; WX 953 ; N uni142D ; G 1761 -U 5166 ; WX 1117 ; N uni142E ; G 1762 -U 5167 ; WX 684 ; N uni142F ; G 1763 -U 5168 ; WX 684 ; N uni1430 ; G 1764 -U 5169 ; WX 684 ; N uni1431 ; G 1765 -U 5170 ; WX 684 ; N uni1432 ; G 1766 -U 5171 ; WX 729 ; N uni1433 ; G 1767 -U 5172 ; WX 729 ; N uni1434 ; G 1768 -U 5173 ; WX 729 ; N uni1435 ; G 1769 -U 5175 ; WX 729 ; N uni1437 ; G 1770 -U 5176 ; WX 729 ; N uni1438 ; G 1771 -U 5177 ; WX 729 ; N uni1439 ; G 1772 -U 5178 ; WX 835 ; N uni143A ; G 1773 -U 5179 ; WX 684 ; N uni143B ; G 1774 -U 5180 ; WX 835 ; N uni143C ; G 1775 -U 5181 ; WX 834 ; N uni143D ; G 1776 -U 5182 ; WX 835 ; N uni143E ; G 1777 -U 5183 ; WX 834 ; N uni143F ; G 1778 -U 5184 ; WX 967 ; N uni1440 ; G 1779 -U 5185 ; WX 1007 ; N uni1441 ; G 1780 -U 5186 ; WX 967 ; N uni1442 ; G 1781 -U 5187 ; WX 1007 ; N uni1443 ; G 1782 -U 5188 ; WX 967 ; N uni1444 ; G 1783 -U 5189 ; WX 1007 ; N uni1445 ; G 1784 -U 5190 ; WX 967 ; N uni1446 ; G 1785 -U 5191 ; WX 1007 ; N uni1447 ; G 1786 -U 5192 ; WX 729 ; N uni1448 ; G 1787 -U 5193 ; WX 508 ; N uni1449 ; G 1788 -U 5194 ; WX 192 ; N uni144A ; G 1789 -U 5196 ; WX 732 ; N uni144C ; G 1790 -U 5197 ; WX 732 ; N uni144D ; G 1791 -U 5198 ; WX 732 ; N uni144E ; G 1792 -U 5199 ; WX 732 ; N uni144F ; G 1793 -U 5200 ; WX 730 ; N uni1450 ; G 1794 -U 5201 ; WX 730 ; N uni1451 ; G 1795 -U 5202 ; WX 730 ; N uni1452 ; G 1796 -U 5204 ; WX 730 ; N uni1454 ; G 1797 -U 5205 ; WX 730 ; N uni1455 ; G 1798 -U 5206 ; WX 730 ; N uni1456 ; G 1799 -U 5207 ; WX 921 ; N uni1457 ; G 1800 -U 5208 ; WX 889 ; N uni1458 ; G 1801 -U 5209 ; WX 921 ; N uni1459 ; G 1802 -U 5210 ; WX 889 ; N uni145A ; G 1803 -U 5211 ; WX 921 ; N uni145B ; G 1804 -U 5212 ; WX 889 ; N uni145C ; G 1805 -U 5213 ; WX 928 ; N uni145D ; G 1806 -U 5214 ; WX 900 ; N uni145E ; G 1807 -U 5215 ; WX 928 ; N uni145F ; G 1808 -U 5216 ; WX 900 ; N uni1460 ; G 1809 -U 5217 ; WX 947 ; N uni1461 ; G 1810 -U 5218 ; WX 900 ; N uni1462 ; G 1811 -U 5219 ; WX 947 ; N uni1463 ; G 1812 -U 5220 ; WX 900 ; N uni1464 ; G 1813 -U 5221 ; WX 947 ; N uni1465 ; G 1814 -U 5222 ; WX 434 ; N uni1466 ; G 1815 -U 5223 ; WX 877 ; N uni1467 ; G 1816 -U 5224 ; WX 877 ; N uni1468 ; G 1817 -U 5225 ; WX 866 ; N uni1469 ; G 1818 -U 5226 ; WX 890 ; N uni146A ; G 1819 -U 5227 ; WX 628 ; N uni146B ; G 1820 -U 5228 ; WX 628 ; N uni146C ; G 1821 -U 5229 ; WX 628 ; N uni146D ; G 1822 -U 5230 ; WX 628 ; N uni146E ; G 1823 -U 5231 ; WX 628 ; N uni146F ; G 1824 -U 5232 ; WX 628 ; N uni1470 ; G 1825 -U 5233 ; WX 628 ; N uni1471 ; G 1826 -U 5234 ; WX 628 ; N uni1472 ; G 1827 -U 5235 ; WX 628 ; N uni1473 ; G 1828 -U 5236 ; WX 860 ; N uni1474 ; G 1829 -U 5237 ; WX 771 ; N uni1475 ; G 1830 -U 5238 ; WX 815 ; N uni1476 ; G 1831 -U 5239 ; WX 816 ; N uni1477 ; G 1832 -U 5240 ; WX 815 ; N uni1478 ; G 1833 -U 5241 ; WX 816 ; N uni1479 ; G 1834 -U 5242 ; WX 860 ; N uni147A ; G 1835 -U 5243 ; WX 771 ; N uni147B ; G 1836 -U 5244 ; WX 860 ; N uni147C ; G 1837 -U 5245 ; WX 771 ; N uni147D ; G 1838 -U 5246 ; WX 815 ; N uni147E ; G 1839 -U 5247 ; WX 816 ; N uni147F ; G 1840 -U 5248 ; WX 815 ; N uni1480 ; G 1841 -U 5249 ; WX 816 ; N uni1481 ; G 1842 -U 5250 ; WX 815 ; N uni1482 ; G 1843 -U 5251 ; WX 407 ; N uni1483 ; G 1844 -U 5252 ; WX 407 ; N uni1484 ; G 1845 -U 5253 ; WX 750 ; N uni1485 ; G 1846 -U 5254 ; WX 775 ; N uni1486 ; G 1847 -U 5255 ; WX 750 ; N uni1487 ; G 1848 -U 5256 ; WX 775 ; N uni1488 ; G 1849 -U 5257 ; WX 628 ; N uni1489 ; G 1850 -U 5258 ; WX 628 ; N uni148A ; G 1851 -U 5259 ; WX 628 ; N uni148B ; G 1852 -U 5260 ; WX 628 ; N uni148C ; G 1853 -U 5261 ; WX 628 ; N uni148D ; G 1854 -U 5262 ; WX 628 ; N uni148E ; G 1855 -U 5263 ; WX 628 ; N uni148F ; G 1856 -U 5264 ; WX 628 ; N uni1490 ; G 1857 -U 5265 ; WX 628 ; N uni1491 ; G 1858 -U 5266 ; WX 860 ; N uni1492 ; G 1859 -U 5267 ; WX 771 ; N uni1493 ; G 1860 -U 5268 ; WX 815 ; N uni1494 ; G 1861 -U 5269 ; WX 816 ; N uni1495 ; G 1862 -U 5270 ; WX 815 ; N uni1496 ; G 1863 -U 5271 ; WX 816 ; N uni1497 ; G 1864 -U 5272 ; WX 860 ; N uni1498 ; G 1865 -U 5273 ; WX 771 ; N uni1499 ; G 1866 -U 5274 ; WX 860 ; N uni149A ; G 1867 -U 5275 ; WX 771 ; N uni149B ; G 1868 -U 5276 ; WX 815 ; N uni149C ; G 1869 -U 5277 ; WX 816 ; N uni149D ; G 1870 -U 5278 ; WX 815 ; N uni149E ; G 1871 -U 5279 ; WX 816 ; N uni149F ; G 1872 -U 5280 ; WX 815 ; N uni14A0 ; G 1873 -U 5281 ; WX 435 ; N uni14A1 ; G 1874 -U 5282 ; WX 435 ; N uni14A2 ; G 1875 -U 5283 ; WX 610 ; N uni14A3 ; G 1876 -U 5284 ; WX 557 ; N uni14A4 ; G 1877 -U 5285 ; WX 557 ; N uni14A5 ; G 1878 -U 5286 ; WX 557 ; N uni14A6 ; G 1879 -U 5287 ; WX 610 ; N uni14A7 ; G 1880 -U 5288 ; WX 610 ; N uni14A8 ; G 1881 -U 5289 ; WX 610 ; N uni14A9 ; G 1882 -U 5290 ; WX 557 ; N uni14AA ; G 1883 -U 5291 ; WX 557 ; N uni14AB ; G 1884 -U 5292 ; WX 749 ; N uni14AC ; G 1885 -U 5293 ; WX 769 ; N uni14AD ; G 1886 -U 5294 ; WX 746 ; N uni14AE ; G 1887 -U 5295 ; WX 764 ; N uni14AF ; G 1888 -U 5296 ; WX 746 ; N uni14B0 ; G 1889 -U 5297 ; WX 764 ; N uni14B1 ; G 1890 -U 5298 ; WX 749 ; N uni14B2 ; G 1891 -U 5299 ; WX 769 ; N uni14B3 ; G 1892 -U 5300 ; WX 749 ; N uni14B4 ; G 1893 -U 5301 ; WX 769 ; N uni14B5 ; G 1894 -U 5302 ; WX 746 ; N uni14B6 ; G 1895 -U 5303 ; WX 764 ; N uni14B7 ; G 1896 -U 5304 ; WX 746 ; N uni14B8 ; G 1897 -U 5305 ; WX 764 ; N uni14B9 ; G 1898 -U 5306 ; WX 746 ; N uni14BA ; G 1899 -U 5307 ; WX 386 ; N uni14BB ; G 1900 -U 5308 ; WX 508 ; N uni14BC ; G 1901 -U 5309 ; WX 386 ; N uni14BD ; G 1902 -U 5312 ; WX 852 ; N uni14C0 ; G 1903 -U 5313 ; WX 852 ; N uni14C1 ; G 1904 -U 5314 ; WX 852 ; N uni14C2 ; G 1905 -U 5315 ; WX 852 ; N uni14C3 ; G 1906 -U 5316 ; WX 852 ; N uni14C4 ; G 1907 -U 5317 ; WX 852 ; N uni14C5 ; G 1908 -U 5318 ; WX 852 ; N uni14C6 ; G 1909 -U 5319 ; WX 852 ; N uni14C7 ; G 1910 -U 5320 ; WX 852 ; N uni14C8 ; G 1911 -U 5321 ; WX 1069 ; N uni14C9 ; G 1912 -U 5322 ; WX 1035 ; N uni14CA ; G 1913 -U 5323 ; WX 1059 ; N uni14CB ; G 1914 -U 5324 ; WX 852 ; N uni14CC ; G 1915 -U 5325 ; WX 1059 ; N uni14CD ; G 1916 -U 5326 ; WX 852 ; N uni14CE ; G 1917 -U 5327 ; WX 852 ; N uni14CF ; G 1918 -U 5328 ; WX 600 ; N uni14D0 ; G 1919 -U 5329 ; WX 453 ; N uni14D1 ; G 1920 -U 5330 ; WX 600 ; N uni14D2 ; G 1921 -U 5331 ; WX 852 ; N uni14D3 ; G 1922 -U 5332 ; WX 852 ; N uni14D4 ; G 1923 -U 5333 ; WX 852 ; N uni14D5 ; G 1924 -U 5334 ; WX 852 ; N uni14D6 ; G 1925 -U 5335 ; WX 852 ; N uni14D7 ; G 1926 -U 5336 ; WX 852 ; N uni14D8 ; G 1927 -U 5337 ; WX 852 ; N uni14D9 ; G 1928 -U 5338 ; WX 852 ; N uni14DA ; G 1929 -U 5339 ; WX 852 ; N uni14DB ; G 1930 -U 5340 ; WX 1069 ; N uni14DC ; G 1931 -U 5341 ; WX 1035 ; N uni14DD ; G 1932 -U 5342 ; WX 1059 ; N uni14DE ; G 1933 -U 5343 ; WX 1030 ; N uni14DF ; G 1934 -U 5344 ; WX 1059 ; N uni14E0 ; G 1935 -U 5345 ; WX 1030 ; N uni14E1 ; G 1936 -U 5346 ; WX 1069 ; N uni14E2 ; G 1937 -U 5347 ; WX 1035 ; N uni14E3 ; G 1938 -U 5348 ; WX 1069 ; N uni14E4 ; G 1939 -U 5349 ; WX 1035 ; N uni14E5 ; G 1940 -U 5350 ; WX 1083 ; N uni14E6 ; G 1941 -U 5351 ; WX 1030 ; N uni14E7 ; G 1942 -U 5352 ; WX 1083 ; N uni14E8 ; G 1943 -U 5353 ; WX 1030 ; N uni14E9 ; G 1944 -U 5354 ; WX 600 ; N uni14EA ; G 1945 -U 5356 ; WX 729 ; N uni14EC ; G 1946 -U 5357 ; WX 603 ; N uni14ED ; G 1947 -U 5358 ; WX 603 ; N uni14EE ; G 1948 -U 5359 ; WX 603 ; N uni14EF ; G 1949 -U 5360 ; WX 603 ; N uni14F0 ; G 1950 -U 5361 ; WX 603 ; N uni14F1 ; G 1951 -U 5362 ; WX 603 ; N uni14F2 ; G 1952 -U 5363 ; WX 603 ; N uni14F3 ; G 1953 -U 5364 ; WX 603 ; N uni14F4 ; G 1954 -U 5365 ; WX 603 ; N uni14F5 ; G 1955 -U 5366 ; WX 834 ; N uni14F6 ; G 1956 -U 5367 ; WX 754 ; N uni14F7 ; G 1957 -U 5368 ; WX 792 ; N uni14F8 ; G 1958 -U 5369 ; WX 771 ; N uni14F9 ; G 1959 -U 5370 ; WX 792 ; N uni14FA ; G 1960 -U 5371 ; WX 771 ; N uni14FB ; G 1961 -U 5372 ; WX 834 ; N uni14FC ; G 1962 -U 5373 ; WX 754 ; N uni14FD ; G 1963 -U 5374 ; WX 834 ; N uni14FE ; G 1964 -U 5375 ; WX 754 ; N uni14FF ; G 1965 -U 5376 ; WX 792 ; N uni1500 ; G 1966 -U 5377 ; WX 771 ; N uni1501 ; G 1967 -U 5378 ; WX 792 ; N uni1502 ; G 1968 -U 5379 ; WX 771 ; N uni1503 ; G 1969 -U 5380 ; WX 792 ; N uni1504 ; G 1970 -U 5381 ; WX 418 ; N uni1505 ; G 1971 -U 5382 ; WX 420 ; N uni1506 ; G 1972 -U 5383 ; WX 418 ; N uni1507 ; G 1973 -U 5392 ; WX 712 ; N uni1510 ; G 1974 -U 5393 ; WX 712 ; N uni1511 ; G 1975 -U 5394 ; WX 712 ; N uni1512 ; G 1976 -U 5395 ; WX 892 ; N uni1513 ; G 1977 -U 5396 ; WX 892 ; N uni1514 ; G 1978 -U 5397 ; WX 892 ; N uni1515 ; G 1979 -U 5398 ; WX 892 ; N uni1516 ; G 1980 -U 5399 ; WX 910 ; N uni1517 ; G 1981 -U 5400 ; WX 872 ; N uni1518 ; G 1982 -U 5401 ; WX 910 ; N uni1519 ; G 1983 -U 5402 ; WX 872 ; N uni151A ; G 1984 -U 5403 ; WX 910 ; N uni151B ; G 1985 -U 5404 ; WX 872 ; N uni151C ; G 1986 -U 5405 ; WX 1140 ; N uni151D ; G 1987 -U 5406 ; WX 1100 ; N uni151E ; G 1988 -U 5407 ; WX 1140 ; N uni151F ; G 1989 -U 5408 ; WX 1100 ; N uni1520 ; G 1990 -U 5409 ; WX 1140 ; N uni1521 ; G 1991 -U 5410 ; WX 1100 ; N uni1522 ; G 1992 -U 5411 ; WX 1140 ; N uni1523 ; G 1993 -U 5412 ; WX 1100 ; N uni1524 ; G 1994 -U 5413 ; WX 641 ; N uni1525 ; G 1995 -U 5414 ; WX 627 ; N uni1526 ; G 1996 -U 5415 ; WX 627 ; N uni1527 ; G 1997 -U 5416 ; WX 627 ; N uni1528 ; G 1998 -U 5417 ; WX 627 ; N uni1529 ; G 1999 -U 5418 ; WX 627 ; N uni152A ; G 2000 -U 5419 ; WX 627 ; N uni152B ; G 2001 -U 5420 ; WX 627 ; N uni152C ; G 2002 -U 5421 ; WX 627 ; N uni152D ; G 2003 -U 5422 ; WX 627 ; N uni152E ; G 2004 -U 5423 ; WX 844 ; N uni152F ; G 2005 -U 5424 ; WX 781 ; N uni1530 ; G 2006 -U 5425 ; WX 816 ; N uni1531 ; G 2007 -U 5426 ; WX 818 ; N uni1532 ; G 2008 -U 5427 ; WX 816 ; N uni1533 ; G 2009 -U 5428 ; WX 818 ; N uni1534 ; G 2010 -U 5429 ; WX 844 ; N uni1535 ; G 2011 -U 5430 ; WX 781 ; N uni1536 ; G 2012 -U 5431 ; WX 844 ; N uni1537 ; G 2013 -U 5432 ; WX 781 ; N uni1538 ; G 2014 -U 5433 ; WX 816 ; N uni1539 ; G 2015 -U 5434 ; WX 818 ; N uni153A ; G 2016 -U 5435 ; WX 816 ; N uni153B ; G 2017 -U 5436 ; WX 818 ; N uni153C ; G 2018 -U 5437 ; WX 816 ; N uni153D ; G 2019 -U 5438 ; WX 418 ; N uni153E ; G 2020 -U 5440 ; WX 389 ; N uni1540 ; G 2021 -U 5441 ; WX 484 ; N uni1541 ; G 2022 -U 5442 ; WX 916 ; N uni1542 ; G 2023 -U 5443 ; WX 916 ; N uni1543 ; G 2024 -U 5444 ; WX 916 ; N uni1544 ; G 2025 -U 5445 ; WX 916 ; N uni1545 ; G 2026 -U 5446 ; WX 916 ; N uni1546 ; G 2027 -U 5447 ; WX 916 ; N uni1547 ; G 2028 -U 5448 ; WX 603 ; N uni1548 ; G 2029 -U 5449 ; WX 603 ; N uni1549 ; G 2030 -U 5450 ; WX 603 ; N uni154A ; G 2031 -U 5451 ; WX 603 ; N uni154B ; G 2032 -U 5452 ; WX 603 ; N uni154C ; G 2033 -U 5453 ; WX 603 ; N uni154D ; G 2034 -U 5454 ; WX 834 ; N uni154E ; G 2035 -U 5455 ; WX 754 ; N uni154F ; G 2036 -U 5456 ; WX 418 ; N uni1550 ; G 2037 -U 5458 ; WX 729 ; N uni1552 ; G 2038 -U 5459 ; WX 684 ; N uni1553 ; G 2039 -U 5460 ; WX 684 ; N uni1554 ; G 2040 -U 5461 ; WX 684 ; N uni1555 ; G 2041 -U 5462 ; WX 684 ; N uni1556 ; G 2042 -U 5463 ; WX 726 ; N uni1557 ; G 2043 -U 5464 ; WX 726 ; N uni1558 ; G 2044 -U 5465 ; WX 726 ; N uni1559 ; G 2045 -U 5466 ; WX 726 ; N uni155A ; G 2046 -U 5467 ; WX 924 ; N uni155B ; G 2047 -U 5468 ; WX 1007 ; N uni155C ; G 2048 -U 5469 ; WX 508 ; N uni155D ; G 2049 -U 5470 ; WX 732 ; N uni155E ; G 2050 -U 5471 ; WX 732 ; N uni155F ; G 2051 -U 5472 ; WX 732 ; N uni1560 ; G 2052 -U 5473 ; WX 732 ; N uni1561 ; G 2053 -U 5474 ; WX 732 ; N uni1562 ; G 2054 -U 5475 ; WX 732 ; N uni1563 ; G 2055 -U 5476 ; WX 730 ; N uni1564 ; G 2056 -U 5477 ; WX 730 ; N uni1565 ; G 2057 -U 5478 ; WX 730 ; N uni1566 ; G 2058 -U 5479 ; WX 730 ; N uni1567 ; G 2059 -U 5480 ; WX 947 ; N uni1568 ; G 2060 -U 5481 ; WX 900 ; N uni1569 ; G 2061 -U 5482 ; WX 508 ; N uni156A ; G 2062 -U 5492 ; WX 831 ; N uni1574 ; G 2063 -U 5493 ; WX 831 ; N uni1575 ; G 2064 -U 5494 ; WX 831 ; N uni1576 ; G 2065 -U 5495 ; WX 831 ; N uni1577 ; G 2066 -U 5496 ; WX 831 ; N uni1578 ; G 2067 -U 5497 ; WX 831 ; N uni1579 ; G 2068 -U 5498 ; WX 831 ; N uni157A ; G 2069 -U 5499 ; WX 563 ; N uni157B ; G 2070 -U 5500 ; WX 752 ; N uni157C ; G 2071 -U 5501 ; WX 484 ; N uni157D ; G 2072 -U 5502 ; WX 1047 ; N uni157E ; G 2073 -U 5503 ; WX 1047 ; N uni157F ; G 2074 -U 5504 ; WX 1047 ; N uni1580 ; G 2075 -U 5505 ; WX 1047 ; N uni1581 ; G 2076 -U 5506 ; WX 1047 ; N uni1582 ; G 2077 -U 5507 ; WX 1047 ; N uni1583 ; G 2078 -U 5508 ; WX 1047 ; N uni1584 ; G 2079 -U 5509 ; WX 825 ; N uni1585 ; G 2080 -U 5514 ; WX 831 ; N uni158A ; G 2081 -U 5515 ; WX 831 ; N uni158B ; G 2082 -U 5516 ; WX 831 ; N uni158C ; G 2083 -U 5517 ; WX 831 ; N uni158D ; G 2084 -U 5518 ; WX 1259 ; N uni158E ; G 2085 -U 5519 ; WX 1259 ; N uni158F ; G 2086 -U 5520 ; WX 1259 ; N uni1590 ; G 2087 -U 5521 ; WX 1002 ; N uni1591 ; G 2088 -U 5522 ; WX 1002 ; N uni1592 ; G 2089 -U 5523 ; WX 1259 ; N uni1593 ; G 2090 -U 5524 ; WX 1259 ; N uni1594 ; G 2091 -U 5525 ; WX 700 ; N uni1595 ; G 2092 -U 5526 ; WX 1073 ; N uni1596 ; G 2093 -U 5536 ; WX 852 ; N uni15A0 ; G 2094 -U 5537 ; WX 852 ; N uni15A1 ; G 2095 -U 5538 ; WX 852 ; N uni15A2 ; G 2096 -U 5539 ; WX 852 ; N uni15A3 ; G 2097 -U 5540 ; WX 852 ; N uni15A4 ; G 2098 -U 5541 ; WX 852 ; N uni15A5 ; G 2099 -U 5542 ; WX 600 ; N uni15A6 ; G 2100 -U 5543 ; WX 643 ; N uni15A7 ; G 2101 -U 5544 ; WX 643 ; N uni15A8 ; G 2102 -U 5545 ; WX 643 ; N uni15A9 ; G 2103 -U 5546 ; WX 643 ; N uni15AA ; G 2104 -U 5547 ; WX 643 ; N uni15AB ; G 2105 -U 5548 ; WX 643 ; N uni15AC ; G 2106 -U 5549 ; WX 643 ; N uni15AD ; G 2107 -U 5550 ; WX 418 ; N uni15AE ; G 2108 -U 5551 ; WX 628 ; N uni15AF ; G 2109 -U 5598 ; WX 770 ; N uni15DE ; G 2110 -U 5601 ; WX 767 ; N uni15E1 ; G 2111 -U 5702 ; WX 468 ; N uni1646 ; G 2112 -U 5703 ; WX 468 ; N uni1647 ; G 2113 -U 5742 ; WX 444 ; N uni166E ; G 2114 -U 5743 ; WX 1047 ; N uni166F ; G 2115 -U 5744 ; WX 1310 ; N uni1670 ; G 2116 -U 5745 ; WX 1632 ; N uni1671 ; G 2117 -U 5746 ; WX 1632 ; N uni1672 ; G 2118 -U 5747 ; WX 1375 ; N uni1673 ; G 2119 -U 5748 ; WX 1375 ; N uni1674 ; G 2120 -U 5749 ; WX 1632 ; N uni1675 ; G 2121 -U 5750 ; WX 1632 ; N uni1676 ; G 2122 -U 5760 ; WX 477 ; N uni1680 ; G 2123 -U 5761 ; WX 493 ; N uni1681 ; G 2124 -U 5762 ; WX 712 ; N uni1682 ; G 2125 -U 5763 ; WX 931 ; N uni1683 ; G 2126 -U 5764 ; WX 1150 ; N uni1684 ; G 2127 -U 5765 ; WX 1370 ; N uni1685 ; G 2128 -U 5766 ; WX 493 ; N uni1686 ; G 2129 -U 5767 ; WX 712 ; N uni1687 ; G 2130 -U 5768 ; WX 931 ; N uni1688 ; G 2131 -U 5769 ; WX 1150 ; N uni1689 ; G 2132 -U 5770 ; WX 1370 ; N uni168A ; G 2133 -U 5771 ; WX 498 ; N uni168B ; G 2134 -U 5772 ; WX 718 ; N uni168C ; G 2135 -U 5773 ; WX 938 ; N uni168D ; G 2136 -U 5774 ; WX 1159 ; N uni168E ; G 2137 -U 5775 ; WX 1379 ; N uni168F ; G 2138 -U 5776 ; WX 493 ; N uni1690 ; G 2139 -U 5777 ; WX 712 ; N uni1691 ; G 2140 -U 5778 ; WX 930 ; N uni1692 ; G 2141 -U 5779 ; WX 1149 ; N uni1693 ; G 2142 -U 5780 ; WX 1370 ; N uni1694 ; G 2143 -U 5781 ; WX 498 ; N uni1695 ; G 2144 -U 5782 ; WX 752 ; N uni1696 ; G 2145 -U 5783 ; WX 789 ; N uni1697 ; G 2146 -U 5784 ; WX 1205 ; N uni1698 ; G 2147 -U 5785 ; WX 1150 ; N uni1699 ; G 2148 -U 5786 ; WX 683 ; N uni169A ; G 2149 -U 5787 ; WX 507 ; N uni169B ; G 2150 -U 5788 ; WX 507 ; N uni169C ; G 2151 -U 7424 ; WX 592 ; N uni1D00 ; G 2152 -U 7425 ; WX 717 ; N uni1D01 ; G 2153 -U 7426 ; WX 982 ; N uni1D02 ; G 2154 -U 7427 ; WX 586 ; N uni1D03 ; G 2155 -U 7428 ; WX 550 ; N uni1D04 ; G 2156 -U 7429 ; WX 605 ; N uni1D05 ; G 2157 -U 7430 ; WX 605 ; N uni1D06 ; G 2158 -U 7431 ; WX 491 ; N uni1D07 ; G 2159 -U 7432 ; WX 541 ; N uni1D08 ; G 2160 -U 7433 ; WX 278 ; N uni1D09 ; G 2161 -U 7434 ; WX 395 ; N uni1D0A ; G 2162 -U 7435 ; WX 579 ; N uni1D0B ; G 2163 -U 7436 ; WX 583 ; N uni1D0C ; G 2164 -U 7437 ; WX 754 ; N uni1D0D ; G 2165 -U 7438 ; WX 650 ; N uni1D0E ; G 2166 -U 7439 ; WX 612 ; N uni1D0F ; G 2167 -U 7440 ; WX 550 ; N uni1D10 ; G 2168 -U 7441 ; WX 684 ; N uni1D11 ; G 2169 -U 7442 ; WX 684 ; N uni1D12 ; G 2170 -U 7443 ; WX 684 ; N uni1D13 ; G 2171 -U 7444 ; WX 1023 ; N uni1D14 ; G 2172 -U 7446 ; WX 612 ; N uni1D16 ; G 2173 -U 7447 ; WX 612 ; N uni1D17 ; G 2174 -U 7448 ; WX 524 ; N uni1D18 ; G 2175 -U 7449 ; WX 602 ; N uni1D19 ; G 2176 -U 7450 ; WX 602 ; N uni1D1A ; G 2177 -U 7451 ; WX 583 ; N uni1D1B ; G 2178 -U 7452 ; WX 574 ; N uni1D1C ; G 2179 -U 7453 ; WX 737 ; N uni1D1D ; G 2180 -U 7454 ; WX 948 ; N uni1D1E ; G 2181 -U 7455 ; WX 638 ; N uni1D1F ; G 2182 -U 7456 ; WX 592 ; N uni1D20 ; G 2183 -U 7457 ; WX 818 ; N uni1D21 ; G 2184 -U 7458 ; WX 525 ; N uni1D22 ; G 2185 -U 7459 ; WX 526 ; N uni1D23 ; G 2186 -U 7462 ; WX 583 ; N uni1D26 ; G 2187 -U 7463 ; WX 592 ; N uni1D27 ; G 2188 -U 7464 ; WX 564 ; N uni1D28 ; G 2189 -U 7465 ; WX 524 ; N uni1D29 ; G 2190 -U 7466 ; WX 590 ; N uni1D2A ; G 2191 -U 7467 ; WX 639 ; N uni1D2B ; G 2192 -U 7468 ; WX 431 ; N uni1D2C ; G 2193 -U 7469 ; WX 613 ; N uni1D2D ; G 2194 -U 7470 ; WX 432 ; N uni1D2E ; G 2195 -U 7472 ; WX 485 ; N uni1D30 ; G 2196 -U 7473 ; WX 398 ; N uni1D31 ; G 2197 -U 7474 ; WX 398 ; N uni1D32 ; G 2198 -U 7475 ; WX 488 ; N uni1D33 ; G 2199 -U 7476 ; WX 474 ; N uni1D34 ; G 2200 -U 7477 ; WX 186 ; N uni1D35 ; G 2201 -U 7478 ; WX 186 ; N uni1D36 ; G 2202 -U 7479 ; WX 413 ; N uni1D37 ; G 2203 -U 7480 ; WX 351 ; N uni1D38 ; G 2204 -U 7481 ; WX 543 ; N uni1D39 ; G 2205 -U 7482 ; WX 471 ; N uni1D3A ; G 2206 -U 7483 ; WX 471 ; N uni1D3B ; G 2207 -U 7484 ; WX 496 ; N uni1D3C ; G 2208 -U 7485 ; WX 439 ; N uni1D3D ; G 2209 -U 7486 ; WX 380 ; N uni1D3E ; G 2210 -U 7487 ; WX 438 ; N uni1D3F ; G 2211 -U 7488 ; WX 385 ; N uni1D40 ; G 2212 -U 7489 ; WX 461 ; N uni1D41 ; G 2213 -U 7490 ; WX 623 ; N uni1D42 ; G 2214 -U 7491 ; WX 392 ; N uni1D43 ; G 2215 -U 7492 ; WX 392 ; N uni1D44 ; G 2216 -U 7493 ; WX 405 ; N uni1D45 ; G 2217 -U 7494 ; WX 648 ; N uni1D46 ; G 2218 -U 7495 ; WX 428 ; N uni1D47 ; G 2219 -U 7496 ; WX 405 ; N uni1D48 ; G 2220 -U 7497 ; WX 417 ; N uni1D49 ; G 2221 -U 7498 ; WX 417 ; N uni1D4A ; G 2222 -U 7499 ; WX 360 ; N uni1D4B ; G 2223 -U 7500 ; WX 359 ; N uni1D4C ; G 2224 -U 7501 ; WX 405 ; N uni1D4D ; G 2225 -U 7502 ; WX 179 ; N uni1D4E ; G 2226 -U 7503 ; WX 426 ; N uni1D4F ; G 2227 -U 7504 ; WX 623 ; N uni1D50 ; G 2228 -U 7505 ; WX 409 ; N uni1D51 ; G 2229 -U 7506 ; WX 414 ; N uni1D52 ; G 2230 -U 7507 ; WX 370 ; N uni1D53 ; G 2231 -U 7508 ; WX 414 ; N uni1D54 ; G 2232 -U 7509 ; WX 414 ; N uni1D55 ; G 2233 -U 7510 ; WX 428 ; N uni1D56 ; G 2234 -U 7511 ; WX 295 ; N uni1D57 ; G 2235 -U 7512 ; WX 405 ; N uni1D58 ; G 2236 -U 7513 ; WX 470 ; N uni1D59 ; G 2237 -U 7514 ; WX 623 ; N uni1D5A ; G 2238 -U 7515 ; WX 417 ; N uni1D5B ; G 2239 -U 7517 ; WX 402 ; N uni1D5D ; G 2240 -U 7518 ; WX 373 ; N uni1D5E ; G 2241 -U 7519 ; WX 385 ; N uni1D5F ; G 2242 -U 7520 ; WX 416 ; N uni1D60 ; G 2243 -U 7521 ; WX 364 ; N uni1D61 ; G 2244 -U 7522 ; WX 179 ; N uni1D62 ; G 2245 -U 7523 ; WX 259 ; N uni1D63 ; G 2246 -U 7524 ; WX 405 ; N uni1D64 ; G 2247 -U 7525 ; WX 417 ; N uni1D65 ; G 2248 -U 7526 ; WX 402 ; N uni1D66 ; G 2249 -U 7527 ; WX 373 ; N uni1D67 ; G 2250 -U 7528 ; WX 412 ; N uni1D68 ; G 2251 -U 7529 ; WX 416 ; N uni1D69 ; G 2252 -U 7530 ; WX 364 ; N uni1D6A ; G 2253 -U 7543 ; WX 635 ; N uni1D77 ; G 2254 -U 7544 ; WX 474 ; N uni1D78 ; G 2255 -U 7547 ; WX 372 ; N uni1D7B ; G 2256 -U 7549 ; WX 667 ; N uni1D7D ; G 2257 -U 7557 ; WX 278 ; N uni1D85 ; G 2258 -U 7579 ; WX 405 ; N uni1D9B ; G 2259 -U 7580 ; WX 370 ; N uni1D9C ; G 2260 -U 7581 ; WX 370 ; N uni1D9D ; G 2261 -U 7582 ; WX 414 ; N uni1D9E ; G 2262 -U 7583 ; WX 360 ; N uni1D9F ; G 2263 -U 7584 ; WX 296 ; N uni1DA0 ; G 2264 -U 7585 ; WX 233 ; N uni1DA1 ; G 2265 -U 7586 ; WX 405 ; N uni1DA2 ; G 2266 -U 7587 ; WX 405 ; N uni1DA3 ; G 2267 -U 7588 ; WX 261 ; N uni1DA4 ; G 2268 -U 7589 ; WX 250 ; N uni1DA5 ; G 2269 -U 7590 ; WX 261 ; N uni1DA6 ; G 2270 -U 7591 ; WX 261 ; N uni1DA7 ; G 2271 -U 7592 ; WX 234 ; N uni1DA8 ; G 2272 -U 7593 ; WX 250 ; N uni1DA9 ; G 2273 -U 7594 ; WX 235 ; N uni1DAA ; G 2274 -U 7595 ; WX 376 ; N uni1DAB ; G 2275 -U 7596 ; WX 623 ; N uni1DAC ; G 2276 -U 7597 ; WX 623 ; N uni1DAD ; G 2277 -U 7598 ; WX 411 ; N uni1DAE ; G 2278 -U 7599 ; WX 479 ; N uni1DAF ; G 2279 -U 7600 ; WX 409 ; N uni1DB0 ; G 2280 -U 7601 ; WX 414 ; N uni1DB1 ; G 2281 -U 7602 ; WX 414 ; N uni1DB2 ; G 2282 -U 7603 ; WX 360 ; N uni1DB3 ; G 2283 -U 7604 ; WX 287 ; N uni1DB4 ; G 2284 -U 7605 ; WX 295 ; N uni1DB5 ; G 2285 -U 7606 ; WX 508 ; N uni1DB6 ; G 2286 -U 7607 ; WX 418 ; N uni1DB7 ; G 2287 -U 7608 ; WX 361 ; N uni1DB8 ; G 2288 -U 7609 ; WX 406 ; N uni1DB9 ; G 2289 -U 7610 ; WX 417 ; N uni1DBA ; G 2290 -U 7611 ; WX 366 ; N uni1DBB ; G 2291 -U 7612 ; WX 437 ; N uni1DBC ; G 2292 -U 7613 ; WX 366 ; N uni1DBD ; G 2293 -U 7614 ; WX 392 ; N uni1DBE ; G 2294 -U 7615 ; WX 414 ; N uni1DBF ; G 2295 -U 7620 ; WX 0 ; N uni1DC4 ; G 2296 -U 7621 ; WX 0 ; N uni1DC5 ; G 2297 -U 7622 ; WX 0 ; N uni1DC6 ; G 2298 -U 7623 ; WX 0 ; N uni1DC7 ; G 2299 -U 7624 ; WX 0 ; N uni1DC8 ; G 2300 -U 7625 ; WX 0 ; N uni1DC9 ; G 2301 -U 7680 ; WX 684 ; N uni1E00 ; G 2302 -U 7681 ; WX 613 ; N uni1E01 ; G 2303 -U 7682 ; WX 686 ; N uni1E02 ; G 2304 -U 7683 ; WX 635 ; N uni1E03 ; G 2305 -U 7684 ; WX 686 ; N uni1E04 ; G 2306 -U 7685 ; WX 635 ; N uni1E05 ; G 2307 -U 7686 ; WX 686 ; N uni1E06 ; G 2308 -U 7687 ; WX 635 ; N uni1E07 ; G 2309 -U 7688 ; WX 698 ; N uni1E08 ; G 2310 -U 7689 ; WX 550 ; N uni1E09 ; G 2311 -U 7690 ; WX 770 ; N uni1E0A ; G 2312 -U 7691 ; WX 635 ; N uni1E0B ; G 2313 -U 7692 ; WX 770 ; N uni1E0C ; G 2314 -U 7693 ; WX 635 ; N uni1E0D ; G 2315 -U 7694 ; WX 770 ; N uni1E0E ; G 2316 -U 7695 ; WX 635 ; N uni1E0F ; G 2317 -U 7696 ; WX 770 ; N uni1E10 ; G 2318 -U 7697 ; WX 635 ; N uni1E11 ; G 2319 -U 7698 ; WX 770 ; N uni1E12 ; G 2320 -U 7699 ; WX 635 ; N uni1E13 ; G 2321 -U 7700 ; WX 632 ; N uni1E14 ; G 2322 -U 7701 ; WX 615 ; N uni1E15 ; G 2323 -U 7702 ; WX 632 ; N uni1E16 ; G 2324 -U 7703 ; WX 615 ; N uni1E17 ; G 2325 -U 7704 ; WX 632 ; N uni1E18 ; G 2326 -U 7705 ; WX 615 ; N uni1E19 ; G 2327 -U 7706 ; WX 632 ; N uni1E1A ; G 2328 -U 7707 ; WX 615 ; N uni1E1B ; G 2329 -U 7708 ; WX 632 ; N uni1E1C ; G 2330 -U 7709 ; WX 615 ; N uni1E1D ; G 2331 -U 7710 ; WX 575 ; N uni1E1E ; G 2332 -U 7711 ; WX 352 ; N uni1E1F ; G 2333 -U 7712 ; WX 775 ; N uni1E20 ; G 2334 -U 7713 ; WX 635 ; N uni1E21 ; G 2335 -U 7714 ; WX 752 ; N uni1E22 ; G 2336 -U 7715 ; WX 634 ; N uni1E23 ; G 2337 -U 7716 ; WX 752 ; N uni1E24 ; G 2338 -U 7717 ; WX 634 ; N uni1E25 ; G 2339 -U 7718 ; WX 752 ; N uni1E26 ; G 2340 -U 7719 ; WX 634 ; N uni1E27 ; G 2341 -U 7720 ; WX 752 ; N uni1E28 ; G 2342 -U 7721 ; WX 634 ; N uni1E29 ; G 2343 -U 7722 ; WX 752 ; N uni1E2A ; G 2344 -U 7723 ; WX 634 ; N uni1E2B ; G 2345 -U 7724 ; WX 295 ; N uni1E2C ; G 2346 -U 7725 ; WX 278 ; N uni1E2D ; G 2347 -U 7726 ; WX 295 ; N uni1E2E ; G 2348 -U 7727 ; WX 278 ; N uni1E2F ; G 2349 -U 7728 ; WX 656 ; N uni1E30 ; G 2350 -U 7729 ; WX 579 ; N uni1E31 ; G 2351 -U 7730 ; WX 656 ; N uni1E32 ; G 2352 -U 7731 ; WX 579 ; N uni1E33 ; G 2353 -U 7732 ; WX 656 ; N uni1E34 ; G 2354 -U 7733 ; WX 579 ; N uni1E35 ; G 2355 -U 7734 ; WX 557 ; N uni1E36 ; G 2356 -U 7735 ; WX 288 ; N uni1E37 ; G 2357 -U 7736 ; WX 557 ; N uni1E38 ; G 2358 -U 7737 ; WX 288 ; N uni1E39 ; G 2359 -U 7738 ; WX 557 ; N uni1E3A ; G 2360 -U 7739 ; WX 278 ; N uni1E3B ; G 2361 -U 7740 ; WX 557 ; N uni1E3C ; G 2362 -U 7741 ; WX 278 ; N uni1E3D ; G 2363 -U 7742 ; WX 863 ; N uni1E3E ; G 2364 -U 7743 ; WX 974 ; N uni1E3F ; G 2365 -U 7744 ; WX 863 ; N uni1E40 ; G 2366 -U 7745 ; WX 974 ; N uni1E41 ; G 2367 -U 7746 ; WX 863 ; N uni1E42 ; G 2368 -U 7747 ; WX 974 ; N uni1E43 ; G 2369 -U 7748 ; WX 748 ; N uni1E44 ; G 2370 -U 7749 ; WX 634 ; N uni1E45 ; G 2371 -U 7750 ; WX 748 ; N uni1E46 ; G 2372 -U 7751 ; WX 634 ; N uni1E47 ; G 2373 -U 7752 ; WX 748 ; N uni1E48 ; G 2374 -U 7753 ; WX 634 ; N uni1E49 ; G 2375 -U 7754 ; WX 748 ; N uni1E4A ; G 2376 -U 7755 ; WX 634 ; N uni1E4B ; G 2377 -U 7756 ; WX 787 ; N uni1E4C ; G 2378 -U 7757 ; WX 612 ; N uni1E4D ; G 2379 -U 7758 ; WX 787 ; N uni1E4E ; G 2380 -U 7759 ; WX 612 ; N uni1E4F ; G 2381 -U 7760 ; WX 787 ; N uni1E50 ; G 2382 -U 7761 ; WX 612 ; N uni1E51 ; G 2383 -U 7762 ; WX 787 ; N uni1E52 ; G 2384 -U 7763 ; WX 612 ; N uni1E53 ; G 2385 -U 7764 ; WX 603 ; N uni1E54 ; G 2386 -U 7765 ; WX 635 ; N uni1E55 ; G 2387 -U 7766 ; WX 603 ; N uni1E56 ; G 2388 -U 7767 ; WX 635 ; N uni1E57 ; G 2389 -U 7768 ; WX 695 ; N uni1E58 ; G 2390 -U 7769 ; WX 411 ; N uni1E59 ; G 2391 -U 7770 ; WX 695 ; N uni1E5A ; G 2392 -U 7771 ; WX 411 ; N uni1E5B ; G 2393 -U 7772 ; WX 695 ; N uni1E5C ; G 2394 -U 7773 ; WX 411 ; N uni1E5D ; G 2395 -U 7774 ; WX 695 ; N uni1E5E ; G 2396 -U 7775 ; WX 411 ; N uni1E5F ; G 2397 -U 7776 ; WX 635 ; N uni1E60 ; G 2398 -U 7777 ; WX 521 ; N uni1E61 ; G 2399 -U 7778 ; WX 635 ; N uni1E62 ; G 2400 -U 7779 ; WX 521 ; N uni1E63 ; G 2401 -U 7780 ; WX 635 ; N uni1E64 ; G 2402 -U 7781 ; WX 521 ; N uni1E65 ; G 2403 -U 7782 ; WX 635 ; N uni1E66 ; G 2404 -U 7783 ; WX 521 ; N uni1E67 ; G 2405 -U 7784 ; WX 635 ; N uni1E68 ; G 2406 -U 7785 ; WX 521 ; N uni1E69 ; G 2407 -U 7786 ; WX 611 ; N uni1E6A ; G 2408 -U 7787 ; WX 392 ; N uni1E6B ; G 2409 -U 7788 ; WX 611 ; N uni1E6C ; G 2410 -U 7789 ; WX 392 ; N uni1E6D ; G 2411 -U 7790 ; WX 611 ; N uni1E6E ; G 2412 -U 7791 ; WX 392 ; N uni1E6F ; G 2413 -U 7792 ; WX 611 ; N uni1E70 ; G 2414 -U 7793 ; WX 392 ; N uni1E71 ; G 2415 -U 7794 ; WX 732 ; N uni1E72 ; G 2416 -U 7795 ; WX 634 ; N uni1E73 ; G 2417 -U 7796 ; WX 732 ; N uni1E74 ; G 2418 -U 7797 ; WX 634 ; N uni1E75 ; G 2419 -U 7798 ; WX 732 ; N uni1E76 ; G 2420 -U 7799 ; WX 634 ; N uni1E77 ; G 2421 -U 7800 ; WX 732 ; N uni1E78 ; G 2422 -U 7801 ; WX 634 ; N uni1E79 ; G 2423 -U 7802 ; WX 732 ; N uni1E7A ; G 2424 -U 7803 ; WX 634 ; N uni1E7B ; G 2425 -U 7804 ; WX 684 ; N uni1E7C ; G 2426 -U 7805 ; WX 592 ; N uni1E7D ; G 2427 -U 7806 ; WX 684 ; N uni1E7E ; G 2428 -U 7807 ; WX 592 ; N uni1E7F ; G 2429 -U 7808 ; WX 989 ; N Wgrave ; G 2430 -U 7809 ; WX 818 ; N wgrave ; G 2431 -U 7810 ; WX 989 ; N Wacute ; G 2432 -U 7811 ; WX 818 ; N wacute ; G 2433 -U 7812 ; WX 989 ; N Wdieresis ; G 2434 -U 7813 ; WX 818 ; N wdieresis ; G 2435 -U 7814 ; WX 989 ; N uni1E86 ; G 2436 -U 7815 ; WX 818 ; N uni1E87 ; G 2437 -U 7816 ; WX 989 ; N uni1E88 ; G 2438 -U 7817 ; WX 818 ; N uni1E89 ; G 2439 -U 7818 ; WX 685 ; N uni1E8A ; G 2440 -U 7819 ; WX 592 ; N uni1E8B ; G 2441 -U 7820 ; WX 685 ; N uni1E8C ; G 2442 -U 7821 ; WX 592 ; N uni1E8D ; G 2443 -U 7822 ; WX 611 ; N uni1E8E ; G 2444 -U 7823 ; WX 592 ; N uni1E8F ; G 2445 -U 7824 ; WX 685 ; N uni1E90 ; G 2446 -U 7825 ; WX 525 ; N uni1E91 ; G 2447 -U 7826 ; WX 685 ; N uni1E92 ; G 2448 -U 7827 ; WX 525 ; N uni1E93 ; G 2449 -U 7828 ; WX 685 ; N uni1E94 ; G 2450 -U 7829 ; WX 525 ; N uni1E95 ; G 2451 -U 7830 ; WX 634 ; N uni1E96 ; G 2452 -U 7831 ; WX 392 ; N uni1E97 ; G 2453 -U 7832 ; WX 818 ; N uni1E98 ; G 2454 -U 7833 ; WX 592 ; N uni1E99 ; G 2455 -U 7834 ; WX 613 ; N uni1E9A ; G 2456 -U 7835 ; WX 352 ; N uni1E9B ; G 2457 -U 7836 ; WX 352 ; N uni1E9C ; G 2458 -U 7837 ; WX 352 ; N uni1E9D ; G 2459 -U 7838 ; WX 769 ; N uni1E9E ; G 2460 -U 7839 ; WX 612 ; N uni1E9F ; G 2461 -U 7840 ; WX 684 ; N uni1EA0 ; G 2462 -U 7841 ; WX 613 ; N uni1EA1 ; G 2463 -U 7842 ; WX 684 ; N uni1EA2 ; G 2464 -U 7843 ; WX 613 ; N uni1EA3 ; G 2465 -U 7844 ; WX 684 ; N uni1EA4 ; G 2466 -U 7845 ; WX 613 ; N uni1EA5 ; G 2467 -U 7846 ; WX 684 ; N uni1EA6 ; G 2468 -U 7847 ; WX 613 ; N uni1EA7 ; G 2469 -U 7848 ; WX 684 ; N uni1EA8 ; G 2470 -U 7849 ; WX 613 ; N uni1EA9 ; G 2471 -U 7850 ; WX 684 ; N uni1EAA ; G 2472 -U 7851 ; WX 613 ; N uni1EAB ; G 2473 -U 7852 ; WX 684 ; N uni1EAC ; G 2474 -U 7853 ; WX 613 ; N uni1EAD ; G 2475 -U 7854 ; WX 684 ; N uni1EAE ; G 2476 -U 7855 ; WX 613 ; N uni1EAF ; G 2477 -U 7856 ; WX 684 ; N uni1EB0 ; G 2478 -U 7857 ; WX 613 ; N uni1EB1 ; G 2479 -U 7858 ; WX 684 ; N uni1EB2 ; G 2480 -U 7859 ; WX 613 ; N uni1EB3 ; G 2481 -U 7860 ; WX 684 ; N uni1EB4 ; G 2482 -U 7861 ; WX 613 ; N uni1EB5 ; G 2483 -U 7862 ; WX 684 ; N uni1EB6 ; G 2484 -U 7863 ; WX 613 ; N uni1EB7 ; G 2485 -U 7864 ; WX 632 ; N uni1EB8 ; G 2486 -U 7865 ; WX 615 ; N uni1EB9 ; G 2487 -U 7866 ; WX 632 ; N uni1EBA ; G 2488 -U 7867 ; WX 615 ; N uni1EBB ; G 2489 -U 7868 ; WX 632 ; N uni1EBC ; G 2490 -U 7869 ; WX 615 ; N uni1EBD ; G 2491 -U 7870 ; WX 632 ; N uni1EBE ; G 2492 -U 7871 ; WX 615 ; N uni1EBF ; G 2493 -U 7872 ; WX 632 ; N uni1EC0 ; G 2494 -U 7873 ; WX 615 ; N uni1EC1 ; G 2495 -U 7874 ; WX 632 ; N uni1EC2 ; G 2496 -U 7875 ; WX 615 ; N uni1EC3 ; G 2497 -U 7876 ; WX 632 ; N uni1EC4 ; G 2498 -U 7877 ; WX 615 ; N uni1EC5 ; G 2499 -U 7878 ; WX 632 ; N uni1EC6 ; G 2500 -U 7879 ; WX 615 ; N uni1EC7 ; G 2501 -U 7880 ; WX 295 ; N uni1EC8 ; G 2502 -U 7881 ; WX 278 ; N uni1EC9 ; G 2503 -U 7882 ; WX 295 ; N uni1ECA ; G 2504 -U 7883 ; WX 278 ; N uni1ECB ; G 2505 -U 7884 ; WX 787 ; N uni1ECC ; G 2506 -U 7885 ; WX 612 ; N uni1ECD ; G 2507 -U 7886 ; WX 787 ; N uni1ECE ; G 2508 -U 7887 ; WX 612 ; N uni1ECF ; G 2509 -U 7888 ; WX 787 ; N uni1ED0 ; G 2510 -U 7889 ; WX 612 ; N uni1ED1 ; G 2511 -U 7890 ; WX 787 ; N uni1ED2 ; G 2512 -U 7891 ; WX 612 ; N uni1ED3 ; G 2513 -U 7892 ; WX 787 ; N uni1ED4 ; G 2514 -U 7893 ; WX 612 ; N uni1ED5 ; G 2515 -U 7894 ; WX 787 ; N uni1ED6 ; G 2516 -U 7895 ; WX 612 ; N uni1ED7 ; G 2517 -U 7896 ; WX 787 ; N uni1ED8 ; G 2518 -U 7897 ; WX 612 ; N uni1ED9 ; G 2519 -U 7898 ; WX 913 ; N uni1EDA ; G 2520 -U 7899 ; WX 612 ; N uni1EDB ; G 2521 -U 7900 ; WX 913 ; N uni1EDC ; G 2522 -U 7901 ; WX 612 ; N uni1EDD ; G 2523 -U 7902 ; WX 913 ; N uni1EDE ; G 2524 -U 7903 ; WX 612 ; N uni1EDF ; G 2525 -U 7904 ; WX 913 ; N uni1EE0 ; G 2526 -U 7905 ; WX 612 ; N uni1EE1 ; G 2527 -U 7906 ; WX 913 ; N uni1EE2 ; G 2528 -U 7907 ; WX 612 ; N uni1EE3 ; G 2529 -U 7908 ; WX 732 ; N uni1EE4 ; G 2530 -U 7909 ; WX 634 ; N uni1EE5 ; G 2531 -U 7910 ; WX 732 ; N uni1EE6 ; G 2532 -U 7911 ; WX 634 ; N uni1EE7 ; G 2533 -U 7912 ; WX 858 ; N uni1EE8 ; G 2534 -U 7913 ; WX 634 ; N uni1EE9 ; G 2535 -U 7914 ; WX 858 ; N uni1EEA ; G 2536 -U 7915 ; WX 634 ; N uni1EEB ; G 2537 -U 7916 ; WX 858 ; N uni1EEC ; G 2538 -U 7917 ; WX 634 ; N uni1EED ; G 2539 -U 7918 ; WX 858 ; N uni1EEE ; G 2540 -U 7919 ; WX 634 ; N uni1EEF ; G 2541 -U 7920 ; WX 858 ; N uni1EF0 ; G 2542 -U 7921 ; WX 634 ; N uni1EF1 ; G 2543 -U 7922 ; WX 611 ; N Ygrave ; G 2544 -U 7923 ; WX 592 ; N ygrave ; G 2545 -U 7924 ; WX 611 ; N uni1EF4 ; G 2546 -U 7925 ; WX 592 ; N uni1EF5 ; G 2547 -U 7926 ; WX 611 ; N uni1EF6 ; G 2548 -U 7927 ; WX 592 ; N uni1EF7 ; G 2549 -U 7928 ; WX 611 ; N uni1EF8 ; G 2550 -U 7929 ; WX 592 ; N uni1EF9 ; G 2551 -U 7930 ; WX 769 ; N uni1EFA ; G 2552 -U 7931 ; WX 477 ; N uni1EFB ; G 2553 -U 7936 ; WX 659 ; N uni1F00 ; G 2554 -U 7937 ; WX 659 ; N uni1F01 ; G 2555 -U 7938 ; WX 659 ; N uni1F02 ; G 2556 -U 7939 ; WX 659 ; N uni1F03 ; G 2557 -U 7940 ; WX 659 ; N uni1F04 ; G 2558 -U 7941 ; WX 659 ; N uni1F05 ; G 2559 -U 7942 ; WX 659 ; N uni1F06 ; G 2560 -U 7943 ; WX 659 ; N uni1F07 ; G 2561 -U 7944 ; WX 684 ; N uni1F08 ; G 2562 -U 7945 ; WX 684 ; N uni1F09 ; G 2563 -U 7946 ; WX 877 ; N uni1F0A ; G 2564 -U 7947 ; WX 877 ; N uni1F0B ; G 2565 -U 7948 ; WX 769 ; N uni1F0C ; G 2566 -U 7949 ; WX 801 ; N uni1F0D ; G 2567 -U 7950 ; WX 708 ; N uni1F0E ; G 2568 -U 7951 ; WX 743 ; N uni1F0F ; G 2569 -U 7952 ; WX 541 ; N uni1F10 ; G 2570 -U 7953 ; WX 541 ; N uni1F11 ; G 2571 -U 7954 ; WX 541 ; N uni1F12 ; G 2572 -U 7955 ; WX 541 ; N uni1F13 ; G 2573 -U 7956 ; WX 541 ; N uni1F14 ; G 2574 -U 7957 ; WX 541 ; N uni1F15 ; G 2575 -U 7960 ; WX 711 ; N uni1F18 ; G 2576 -U 7961 ; WX 711 ; N uni1F19 ; G 2577 -U 7962 ; WX 966 ; N uni1F1A ; G 2578 -U 7963 ; WX 975 ; N uni1F1B ; G 2579 -U 7964 ; WX 898 ; N uni1F1C ; G 2580 -U 7965 ; WX 928 ; N uni1F1D ; G 2581 -U 7968 ; WX 634 ; N uni1F20 ; G 2582 -U 7969 ; WX 634 ; N uni1F21 ; G 2583 -U 7970 ; WX 634 ; N uni1F22 ; G 2584 -U 7971 ; WX 634 ; N uni1F23 ; G 2585 -U 7972 ; WX 634 ; N uni1F24 ; G 2586 -U 7973 ; WX 634 ; N uni1F25 ; G 2587 -U 7974 ; WX 634 ; N uni1F26 ; G 2588 -U 7975 ; WX 634 ; N uni1F27 ; G 2589 -U 7976 ; WX 837 ; N uni1F28 ; G 2590 -U 7977 ; WX 835 ; N uni1F29 ; G 2591 -U 7978 ; WX 1086 ; N uni1F2A ; G 2592 -U 7979 ; WX 1089 ; N uni1F2B ; G 2593 -U 7980 ; WX 1027 ; N uni1F2C ; G 2594 -U 7981 ; WX 1051 ; N uni1F2D ; G 2595 -U 7982 ; WX 934 ; N uni1F2E ; G 2596 -U 7983 ; WX 947 ; N uni1F2F ; G 2597 -U 7984 ; WX 338 ; N uni1F30 ; G 2598 -U 7985 ; WX 338 ; N uni1F31 ; G 2599 -U 7986 ; WX 338 ; N uni1F32 ; G 2600 -U 7987 ; WX 338 ; N uni1F33 ; G 2601 -U 7988 ; WX 338 ; N uni1F34 ; G 2602 -U 7989 ; WX 338 ; N uni1F35 ; G 2603 -U 7990 ; WX 338 ; N uni1F36 ; G 2604 -U 7991 ; WX 338 ; N uni1F37 ; G 2605 -U 7992 ; WX 380 ; N uni1F38 ; G 2606 -U 7993 ; WX 374 ; N uni1F39 ; G 2607 -U 7994 ; WX 635 ; N uni1F3A ; G 2608 -U 7995 ; WX 635 ; N uni1F3B ; G 2609 -U 7996 ; WX 570 ; N uni1F3C ; G 2610 -U 7997 ; WX 600 ; N uni1F3D ; G 2611 -U 7998 ; WX 489 ; N uni1F3E ; G 2612 -U 7999 ; WX 493 ; N uni1F3F ; G 2613 -U 8000 ; WX 612 ; N uni1F40 ; G 2614 -U 8001 ; WX 612 ; N uni1F41 ; G 2615 -U 8002 ; WX 612 ; N uni1F42 ; G 2616 -U 8003 ; WX 612 ; N uni1F43 ; G 2617 -U 8004 ; WX 612 ; N uni1F44 ; G 2618 -U 8005 ; WX 612 ; N uni1F45 ; G 2619 -U 8008 ; WX 804 ; N uni1F48 ; G 2620 -U 8009 ; WX 848 ; N uni1F49 ; G 2621 -U 8010 ; WX 1095 ; N uni1F4A ; G 2622 -U 8011 ; WX 1100 ; N uni1F4B ; G 2623 -U 8012 ; WX 938 ; N uni1F4C ; G 2624 -U 8013 ; WX 970 ; N uni1F4D ; G 2625 -U 8016 ; WX 579 ; N uni1F50 ; G 2626 -U 8017 ; WX 579 ; N uni1F51 ; G 2627 -U 8018 ; WX 579 ; N uni1F52 ; G 2628 -U 8019 ; WX 579 ; N uni1F53 ; G 2629 -U 8020 ; WX 579 ; N uni1F54 ; G 2630 -U 8021 ; WX 579 ; N uni1F55 ; G 2631 -U 8022 ; WX 579 ; N uni1F56 ; G 2632 -U 8023 ; WX 579 ; N uni1F57 ; G 2633 -U 8025 ; WX 784 ; N uni1F59 ; G 2634 -U 8027 ; WX 998 ; N uni1F5B ; G 2635 -U 8029 ; WX 1012 ; N uni1F5D ; G 2636 -U 8031 ; WX 897 ; N uni1F5F ; G 2637 -U 8032 ; WX 837 ; N uni1F60 ; G 2638 -U 8033 ; WX 837 ; N uni1F61 ; G 2639 -U 8034 ; WX 837 ; N uni1F62 ; G 2640 -U 8035 ; WX 837 ; N uni1F63 ; G 2641 -U 8036 ; WX 837 ; N uni1F64 ; G 2642 -U 8037 ; WX 837 ; N uni1F65 ; G 2643 -U 8038 ; WX 837 ; N uni1F66 ; G 2644 -U 8039 ; WX 837 ; N uni1F67 ; G 2645 -U 8040 ; WX 802 ; N uni1F68 ; G 2646 -U 8041 ; WX 843 ; N uni1F69 ; G 2647 -U 8042 ; WX 1089 ; N uni1F6A ; G 2648 -U 8043 ; WX 1095 ; N uni1F6B ; G 2649 -U 8044 ; WX 946 ; N uni1F6C ; G 2650 -U 8045 ; WX 972 ; N uni1F6D ; G 2651 -U 8046 ; WX 921 ; N uni1F6E ; G 2652 -U 8047 ; WX 952 ; N uni1F6F ; G 2653 -U 8048 ; WX 659 ; N uni1F70 ; G 2654 -U 8049 ; WX 659 ; N uni1F71 ; G 2655 -U 8050 ; WX 541 ; N uni1F72 ; G 2656 -U 8051 ; WX 548 ; N uni1F73 ; G 2657 -U 8052 ; WX 634 ; N uni1F74 ; G 2658 -U 8053 ; WX 654 ; N uni1F75 ; G 2659 -U 8054 ; WX 338 ; N uni1F76 ; G 2660 -U 8055 ; WX 338 ; N uni1F77 ; G 2661 -U 8056 ; WX 612 ; N uni1F78 ; G 2662 -U 8057 ; WX 612 ; N uni1F79 ; G 2663 -U 8058 ; WX 579 ; N uni1F7A ; G 2664 -U 8059 ; WX 579 ; N uni1F7B ; G 2665 -U 8060 ; WX 837 ; N uni1F7C ; G 2666 -U 8061 ; WX 837 ; N uni1F7D ; G 2667 -U 8064 ; WX 659 ; N uni1F80 ; G 2668 -U 8065 ; WX 659 ; N uni1F81 ; G 2669 -U 8066 ; WX 659 ; N uni1F82 ; G 2670 -U 8067 ; WX 659 ; N uni1F83 ; G 2671 -U 8068 ; WX 659 ; N uni1F84 ; G 2672 -U 8069 ; WX 659 ; N uni1F85 ; G 2673 -U 8070 ; WX 659 ; N uni1F86 ; G 2674 -U 8071 ; WX 659 ; N uni1F87 ; G 2675 -U 8072 ; WX 684 ; N uni1F88 ; G 2676 -U 8073 ; WX 684 ; N uni1F89 ; G 2677 -U 8074 ; WX 877 ; N uni1F8A ; G 2678 -U 8075 ; WX 877 ; N uni1F8B ; G 2679 -U 8076 ; WX 769 ; N uni1F8C ; G 2680 -U 8077 ; WX 801 ; N uni1F8D ; G 2681 -U 8078 ; WX 708 ; N uni1F8E ; G 2682 -U 8079 ; WX 743 ; N uni1F8F ; G 2683 -U 8080 ; WX 634 ; N uni1F90 ; G 2684 -U 8081 ; WX 634 ; N uni1F91 ; G 2685 -U 8082 ; WX 634 ; N uni1F92 ; G 2686 -U 8083 ; WX 634 ; N uni1F93 ; G 2687 -U 8084 ; WX 634 ; N uni1F94 ; G 2688 -U 8085 ; WX 634 ; N uni1F95 ; G 2689 -U 8086 ; WX 634 ; N uni1F96 ; G 2690 -U 8087 ; WX 634 ; N uni1F97 ; G 2691 -U 8088 ; WX 837 ; N uni1F98 ; G 2692 -U 8089 ; WX 835 ; N uni1F99 ; G 2693 -U 8090 ; WX 1086 ; N uni1F9A ; G 2694 -U 8091 ; WX 1089 ; N uni1F9B ; G 2695 -U 8092 ; WX 1027 ; N uni1F9C ; G 2696 -U 8093 ; WX 1051 ; N uni1F9D ; G 2697 -U 8094 ; WX 934 ; N uni1F9E ; G 2698 -U 8095 ; WX 947 ; N uni1F9F ; G 2699 -U 8096 ; WX 837 ; N uni1FA0 ; G 2700 -U 8097 ; WX 837 ; N uni1FA1 ; G 2701 -U 8098 ; WX 837 ; N uni1FA2 ; G 2702 -U 8099 ; WX 837 ; N uni1FA3 ; G 2703 -U 8100 ; WX 837 ; N uni1FA4 ; G 2704 -U 8101 ; WX 837 ; N uni1FA5 ; G 2705 -U 8102 ; WX 837 ; N uni1FA6 ; G 2706 -U 8103 ; WX 837 ; N uni1FA7 ; G 2707 -U 8104 ; WX 802 ; N uni1FA8 ; G 2708 -U 8105 ; WX 843 ; N uni1FA9 ; G 2709 -U 8106 ; WX 1089 ; N uni1FAA ; G 2710 -U 8107 ; WX 1095 ; N uni1FAB ; G 2711 -U 8108 ; WX 946 ; N uni1FAC ; G 2712 -U 8109 ; WX 972 ; N uni1FAD ; G 2713 -U 8110 ; WX 921 ; N uni1FAE ; G 2714 -U 8111 ; WX 952 ; N uni1FAF ; G 2715 -U 8112 ; WX 659 ; N uni1FB0 ; G 2716 -U 8113 ; WX 659 ; N uni1FB1 ; G 2717 -U 8114 ; WX 659 ; N uni1FB2 ; G 2718 -U 8115 ; WX 659 ; N uni1FB3 ; G 2719 -U 8116 ; WX 659 ; N uni1FB4 ; G 2720 -U 8118 ; WX 659 ; N uni1FB6 ; G 2721 -U 8119 ; WX 659 ; N uni1FB7 ; G 2722 -U 8120 ; WX 684 ; N uni1FB8 ; G 2723 -U 8121 ; WX 684 ; N uni1FB9 ; G 2724 -U 8122 ; WX 716 ; N uni1FBA ; G 2725 -U 8123 ; WX 692 ; N uni1FBB ; G 2726 -U 8124 ; WX 684 ; N uni1FBC ; G 2727 -U 8125 ; WX 500 ; N uni1FBD ; G 2728 -U 8126 ; WX 500 ; N uni1FBE ; G 2729 -U 8127 ; WX 500 ; N uni1FBF ; G 2730 -U 8128 ; WX 500 ; N uni1FC0 ; G 2731 -U 8129 ; WX 500 ; N uni1FC1 ; G 2732 -U 8130 ; WX 634 ; N uni1FC2 ; G 2733 -U 8131 ; WX 634 ; N uni1FC3 ; G 2734 -U 8132 ; WX 654 ; N uni1FC4 ; G 2735 -U 8134 ; WX 634 ; N uni1FC6 ; G 2736 -U 8135 ; WX 634 ; N uni1FC7 ; G 2737 -U 8136 ; WX 805 ; N uni1FC8 ; G 2738 -U 8137 ; WX 746 ; N uni1FC9 ; G 2739 -U 8138 ; WX 931 ; N uni1FCA ; G 2740 -U 8139 ; WX 871 ; N uni1FCB ; G 2741 -U 8140 ; WX 752 ; N uni1FCC ; G 2742 -U 8141 ; WX 500 ; N uni1FCD ; G 2743 -U 8142 ; WX 500 ; N uni1FCE ; G 2744 -U 8143 ; WX 500 ; N uni1FCF ; G 2745 -U 8144 ; WX 338 ; N uni1FD0 ; G 2746 -U 8145 ; WX 338 ; N uni1FD1 ; G 2747 -U 8146 ; WX 338 ; N uni1FD2 ; G 2748 -U 8147 ; WX 338 ; N uni1FD3 ; G 2749 -U 8150 ; WX 338 ; N uni1FD6 ; G 2750 -U 8151 ; WX 338 ; N uni1FD7 ; G 2751 -U 8152 ; WX 295 ; N uni1FD8 ; G 2752 -U 8153 ; WX 295 ; N uni1FD9 ; G 2753 -U 8154 ; WX 475 ; N uni1FDA ; G 2754 -U 8155 ; WX 408 ; N uni1FDB ; G 2755 -U 8157 ; WX 500 ; N uni1FDD ; G 2756 -U 8158 ; WX 500 ; N uni1FDE ; G 2757 -U 8159 ; WX 500 ; N uni1FDF ; G 2758 -U 8160 ; WX 579 ; N uni1FE0 ; G 2759 -U 8161 ; WX 579 ; N uni1FE1 ; G 2760 -U 8162 ; WX 579 ; N uni1FE2 ; G 2761 -U 8163 ; WX 579 ; N uni1FE3 ; G 2762 -U 8164 ; WX 635 ; N uni1FE4 ; G 2763 -U 8165 ; WX 635 ; N uni1FE5 ; G 2764 -U 8166 ; WX 579 ; N uni1FE6 ; G 2765 -U 8167 ; WX 579 ; N uni1FE7 ; G 2766 -U 8168 ; WX 611 ; N uni1FE8 ; G 2767 -U 8169 ; WX 611 ; N uni1FE9 ; G 2768 -U 8170 ; WX 845 ; N uni1FEA ; G 2769 -U 8171 ; WX 825 ; N uni1FEB ; G 2770 -U 8172 ; WX 685 ; N uni1FEC ; G 2771 -U 8173 ; WX 500 ; N uni1FED ; G 2772 -U 8174 ; WX 500 ; N uni1FEE ; G 2773 -U 8175 ; WX 500 ; N uni1FEF ; G 2774 -U 8178 ; WX 837 ; N uni1FF2 ; G 2775 -U 8179 ; WX 837 ; N uni1FF3 ; G 2776 -U 8180 ; WX 837 ; N uni1FF4 ; G 2777 -U 8182 ; WX 837 ; N uni1FF6 ; G 2778 -U 8183 ; WX 837 ; N uni1FF7 ; G 2779 -U 8184 ; WX 941 ; N uni1FF8 ; G 2780 -U 8185 ; WX 813 ; N uni1FF9 ; G 2781 -U 8186 ; WX 922 ; N uni1FFA ; G 2782 -U 8187 ; WX 826 ; N uni1FFB ; G 2783 -U 8188 ; WX 764 ; N uni1FFC ; G 2784 -U 8189 ; WX 500 ; N uni1FFD ; G 2785 -U 8190 ; WX 500 ; N uni1FFE ; G 2786 -U 8192 ; WX 500 ; N uni2000 ; G 2787 -U 8193 ; WX 1000 ; N uni2001 ; G 2788 -U 8194 ; WX 500 ; N uni2002 ; G 2789 -U 8195 ; WX 1000 ; N uni2003 ; G 2790 -U 8196 ; WX 330 ; N uni2004 ; G 2791 -U 8197 ; WX 250 ; N uni2005 ; G 2792 -U 8198 ; WX 167 ; N uni2006 ; G 2793 -U 8199 ; WX 636 ; N uni2007 ; G 2794 -U 8200 ; WX 318 ; N uni2008 ; G 2795 -U 8201 ; WX 200 ; N uni2009 ; G 2796 -U 8202 ; WX 100 ; N uni200A ; G 2797 -U 8203 ; WX 0 ; N uni200B ; G 2798 -U 8204 ; WX 0 ; N uni200C ; G 2799 -U 8205 ; WX 0 ; N uni200D ; G 2800 -U 8206 ; WX 0 ; N uni200E ; G 2801 -U 8207 ; WX 0 ; N uni200F ; G 2802 -U 8208 ; WX 361 ; N uni2010 ; G 2803 -U 8209 ; WX 361 ; N uni2011 ; G 2804 -U 8210 ; WX 636 ; N figuredash ; G 2805 -U 8211 ; WX 500 ; N endash ; G 2806 -U 8212 ; WX 1000 ; N emdash ; G 2807 -U 8213 ; WX 1000 ; N uni2015 ; G 2808 -U 8214 ; WX 500 ; N uni2016 ; G 2809 -U 8215 ; WX 500 ; N underscoredbl ; G 2810 -U 8216 ; WX 318 ; N quoteleft ; G 2811 -U 8217 ; WX 318 ; N quoteright ; G 2812 -U 8218 ; WX 318 ; N quotesinglbase ; G 2813 -U 8219 ; WX 318 ; N quotereversed ; G 2814 -U 8220 ; WX 518 ; N quotedblleft ; G 2815 -U 8221 ; WX 518 ; N quotedblright ; G 2816 -U 8222 ; WX 518 ; N quotedblbase ; G 2817 -U 8223 ; WX 518 ; N uni201F ; G 2818 -U 8224 ; WX 500 ; N dagger ; G 2819 -U 8225 ; WX 500 ; N daggerdbl ; G 2820 -U 8226 ; WX 590 ; N bullet ; G 2821 -U 8227 ; WX 590 ; N uni2023 ; G 2822 -U 8228 ; WX 334 ; N onedotenleader ; G 2823 -U 8229 ; WX 667 ; N twodotenleader ; G 2824 -U 8230 ; WX 1000 ; N ellipsis ; G 2825 -U 8231 ; WX 318 ; N uni2027 ; G 2826 -U 8232 ; WX 0 ; N uni2028 ; G 2827 -U 8233 ; WX 0 ; N uni2029 ; G 2828 -U 8234 ; WX 0 ; N uni202A ; G 2829 -U 8235 ; WX 0 ; N uni202B ; G 2830 -U 8236 ; WX 0 ; N uni202C ; G 2831 -U 8237 ; WX 0 ; N uni202D ; G 2832 -U 8238 ; WX 0 ; N uni202E ; G 2833 -U 8239 ; WX 200 ; N uni202F ; G 2834 -U 8240 ; WX 1342 ; N perthousand ; G 2835 -U 8241 ; WX 1735 ; N uni2031 ; G 2836 -U 8242 ; WX 227 ; N minute ; G 2837 -U 8243 ; WX 374 ; N second ; G 2838 -U 8244 ; WX 520 ; N uni2034 ; G 2839 -U 8245 ; WX 227 ; N uni2035 ; G 2840 -U 8246 ; WX 374 ; N uni2036 ; G 2841 -U 8247 ; WX 520 ; N uni2037 ; G 2842 -U 8248 ; WX 339 ; N uni2038 ; G 2843 -U 8249 ; WX 400 ; N guilsinglleft ; G 2844 -U 8250 ; WX 400 ; N guilsinglright ; G 2845 -U 8251 ; WX 838 ; N uni203B ; G 2846 -U 8252 ; WX 485 ; N exclamdbl ; G 2847 -U 8253 ; WX 531 ; N uni203D ; G 2848 -U 8254 ; WX 500 ; N uni203E ; G 2849 -U 8255 ; WX 804 ; N uni203F ; G 2850 -U 8256 ; WX 804 ; N uni2040 ; G 2851 -U 8257 ; WX 250 ; N uni2041 ; G 2852 -U 8258 ; WX 1000 ; N uni2042 ; G 2853 -U 8259 ; WX 500 ; N uni2043 ; G 2854 -U 8260 ; WX 167 ; N fraction ; G 2855 -U 8261 ; WX 390 ; N uni2045 ; G 2856 -U 8262 ; WX 390 ; N uni2046 ; G 2857 -U 8263 ; WX 922 ; N uni2047 ; G 2858 -U 8264 ; WX 733 ; N uni2048 ; G 2859 -U 8265 ; WX 733 ; N uni2049 ; G 2860 -U 8266 ; WX 497 ; N uni204A ; G 2861 -U 8267 ; WX 636 ; N uni204B ; G 2862 -U 8268 ; WX 500 ; N uni204C ; G 2863 -U 8269 ; WX 500 ; N uni204D ; G 2864 -U 8270 ; WX 500 ; N uni204E ; G 2865 -U 8271 ; WX 337 ; N uni204F ; G 2866 -U 8272 ; WX 804 ; N uni2050 ; G 2867 -U 8273 ; WX 500 ; N uni2051 ; G 2868 -U 8274 ; WX 450 ; N uni2052 ; G 2869 -U 8275 ; WX 1000 ; N uni2053 ; G 2870 -U 8276 ; WX 804 ; N uni2054 ; G 2871 -U 8277 ; WX 838 ; N uni2055 ; G 2872 -U 8278 ; WX 586 ; N uni2056 ; G 2873 -U 8279 ; WX 663 ; N uni2057 ; G 2874 -U 8280 ; WX 838 ; N uni2058 ; G 2875 -U 8281 ; WX 838 ; N uni2059 ; G 2876 -U 8282 ; WX 318 ; N uni205A ; G 2877 -U 8283 ; WX 797 ; N uni205B ; G 2878 -U 8284 ; WX 838 ; N uni205C ; G 2879 -U 8285 ; WX 318 ; N uni205D ; G 2880 -U 8286 ; WX 318 ; N uni205E ; G 2881 -U 8287 ; WX 222 ; N uni205F ; G 2882 -U 8288 ; WX 0 ; N uni2060 ; G 2883 -U 8289 ; WX 0 ; N uni2061 ; G 2884 -U 8290 ; WX 0 ; N uni2062 ; G 2885 -U 8291 ; WX 0 ; N uni2063 ; G 2886 -U 8292 ; WX 0 ; N uni2064 ; G 2887 -U 8298 ; WX 0 ; N uni206A ; G 2888 -U 8299 ; WX 0 ; N uni206B ; G 2889 -U 8300 ; WX 0 ; N uni206C ; G 2890 -U 8301 ; WX 0 ; N uni206D ; G 2891 -U 8302 ; WX 0 ; N uni206E ; G 2892 -U 8303 ; WX 0 ; N uni206F ; G 2893 -U 8304 ; WX 401 ; N uni2070 ; G 2894 -U 8305 ; WX 179 ; N uni2071 ; G 2895 -U 8308 ; WX 401 ; N uni2074 ; G 2896 -U 8309 ; WX 401 ; N uni2075 ; G 2897 -U 8310 ; WX 401 ; N uni2076 ; G 2898 -U 8311 ; WX 401 ; N uni2077 ; G 2899 -U 8312 ; WX 401 ; N uni2078 ; G 2900 -U 8313 ; WX 401 ; N uni2079 ; G 2901 -U 8314 ; WX 528 ; N uni207A ; G 2902 -U 8315 ; WX 528 ; N uni207B ; G 2903 -U 8316 ; WX 528 ; N uni207C ; G 2904 -U 8317 ; WX 246 ; N uni207D ; G 2905 -U 8318 ; WX 246 ; N uni207E ; G 2906 -U 8319 ; WX 398 ; N uni207F ; G 2907 -U 8320 ; WX 401 ; N uni2080 ; G 2908 -U 8321 ; WX 401 ; N uni2081 ; G 2909 -U 8322 ; WX 401 ; N uni2082 ; G 2910 -U 8323 ; WX 401 ; N uni2083 ; G 2911 -U 8324 ; WX 401 ; N uni2084 ; G 2912 -U 8325 ; WX 401 ; N uni2085 ; G 2913 -U 8326 ; WX 401 ; N uni2086 ; G 2914 -U 8327 ; WX 401 ; N uni2087 ; G 2915 -U 8328 ; WX 401 ; N uni2088 ; G 2916 -U 8329 ; WX 401 ; N uni2089 ; G 2917 -U 8330 ; WX 528 ; N uni208A ; G 2918 -U 8331 ; WX 528 ; N uni208B ; G 2919 -U 8332 ; WX 528 ; N uni208C ; G 2920 -U 8333 ; WX 246 ; N uni208D ; G 2921 -U 8334 ; WX 246 ; N uni208E ; G 2922 -U 8336 ; WX 392 ; N uni2090 ; G 2923 -U 8337 ; WX 417 ; N uni2091 ; G 2924 -U 8338 ; WX 414 ; N uni2092 ; G 2925 -U 8339 ; WX 444 ; N uni2093 ; G 2926 -U 8340 ; WX 417 ; N uni2094 ; G 2927 -U 8341 ; WX 404 ; N uni2095 ; G 2928 -U 8342 ; WX 426 ; N uni2096 ; G 2929 -U 8343 ; WX 166 ; N uni2097 ; G 2930 -U 8344 ; WX 623 ; N uni2098 ; G 2931 -U 8345 ; WX 398 ; N uni2099 ; G 2932 -U 8346 ; WX 428 ; N uni209A ; G 2933 -U 8347 ; WX 373 ; N uni209B ; G 2934 -U 8348 ; WX 295 ; N uni209C ; G 2935 -U 8352 ; WX 877 ; N uni20A0 ; G 2936 -U 8353 ; WX 636 ; N colonmonetary ; G 2937 -U 8354 ; WX 636 ; N uni20A2 ; G 2938 -U 8355 ; WX 636 ; N franc ; G 2939 -U 8356 ; WX 636 ; N lira ; G 2940 -U 8357 ; WX 974 ; N uni20A5 ; G 2941 -U 8358 ; WX 636 ; N uni20A6 ; G 2942 -U 8359 ; WX 1272 ; N peseta ; G 2943 -U 8360 ; WX 1074 ; N uni20A8 ; G 2944 -U 8361 ; WX 989 ; N uni20A9 ; G 2945 -U 8362 ; WX 784 ; N uni20AA ; G 2946 -U 8363 ; WX 636 ; N dong ; G 2947 -U 8364 ; WX 636 ; N Euro ; G 2948 -U 8365 ; WX 636 ; N uni20AD ; G 2949 -U 8366 ; WX 636 ; N uni20AE ; G 2950 -U 8367 ; WX 1272 ; N uni20AF ; G 2951 -U 8368 ; WX 636 ; N uni20B0 ; G 2952 -U 8369 ; WX 636 ; N uni20B1 ; G 2953 -U 8370 ; WX 636 ; N uni20B2 ; G 2954 -U 8371 ; WX 636 ; N uni20B3 ; G 2955 -U 8372 ; WX 774 ; N uni20B4 ; G 2956 -U 8373 ; WX 636 ; N uni20B5 ; G 2957 -U 8376 ; WX 636 ; N uni20B8 ; G 2958 -U 8377 ; WX 636 ; N uni20B9 ; G 2959 -U 8378 ; WX 636 ; N uni20BA ; G 2960 -U 8381 ; WX 636 ; N uni20BD ; G 2961 -U 8400 ; WX 0 ; N uni20D0 ; G 2962 -U 8401 ; WX 0 ; N uni20D1 ; G 2963 -U 8406 ; WX 0 ; N uni20D6 ; G 2964 -U 8407 ; WX 0 ; N uni20D7 ; G 2965 -U 8411 ; WX 0 ; N uni20DB ; G 2966 -U 8412 ; WX 0 ; N uni20DC ; G 2967 -U 8417 ; WX 0 ; N uni20E1 ; G 2968 -U 8448 ; WX 1019 ; N uni2100 ; G 2969 -U 8449 ; WX 1019 ; N uni2101 ; G 2970 -U 8450 ; WX 698 ; N uni2102 ; G 2971 -U 8451 ; WX 1123 ; N uni2103 ; G 2972 -U 8452 ; WX 642 ; N uni2104 ; G 2973 -U 8453 ; WX 1019 ; N uni2105 ; G 2974 -U 8454 ; WX 1067 ; N uni2106 ; G 2975 -U 8455 ; WX 614 ; N uni2107 ; G 2976 -U 8456 ; WX 698 ; N uni2108 ; G 2977 -U 8457 ; WX 952 ; N uni2109 ; G 2978 -U 8459 ; WX 988 ; N uni210B ; G 2979 -U 8460 ; WX 754 ; N uni210C ; G 2980 -U 8461 ; WX 850 ; N uni210D ; G 2981 -U 8462 ; WX 634 ; N uni210E ; G 2982 -U 8463 ; WX 634 ; N uni210F ; G 2983 -U 8464 ; WX 470 ; N uni2110 ; G 2984 -U 8465 ; WX 697 ; N Ifraktur ; G 2985 -U 8466 ; WX 720 ; N uni2112 ; G 2986 -U 8467 ; WX 413 ; N uni2113 ; G 2987 -U 8468 ; WX 818 ; N uni2114 ; G 2988 -U 8469 ; WX 801 ; N uni2115 ; G 2989 -U 8470 ; WX 1040 ; N uni2116 ; G 2990 -U 8471 ; WX 1000 ; N uni2117 ; G 2991 -U 8472 ; WX 697 ; N weierstrass ; G 2992 -U 8473 ; WX 701 ; N uni2119 ; G 2993 -U 8474 ; WX 787 ; N uni211A ; G 2994 -U 8475 ; WX 798 ; N uni211B ; G 2995 -U 8476 ; WX 814 ; N Rfraktur ; G 2996 -U 8477 ; WX 792 ; N uni211D ; G 2997 -U 8478 ; WX 896 ; N prescription ; G 2998 -U 8479 ; WX 684 ; N uni211F ; G 2999 -U 8480 ; WX 1020 ; N uni2120 ; G 3000 -U 8481 ; WX 1074 ; N uni2121 ; G 3001 -U 8482 ; WX 1000 ; N trademark ; G 3002 -U 8483 ; WX 684 ; N uni2123 ; G 3003 -U 8484 ; WX 745 ; N uni2124 ; G 3004 -U 8485 ; WX 578 ; N uni2125 ; G 3005 -U 8486 ; WX 764 ; N uni2126 ; G 3006 -U 8487 ; WX 764 ; N uni2127 ; G 3007 -U 8488 ; WX 616 ; N uni2128 ; G 3008 -U 8489 ; WX 338 ; N uni2129 ; G 3009 -U 8490 ; WX 656 ; N uni212A ; G 3010 -U 8491 ; WX 684 ; N uni212B ; G 3011 -U 8492 ; WX 786 ; N uni212C ; G 3012 -U 8493 ; WX 703 ; N uni212D ; G 3013 -U 8494 ; WX 854 ; N estimated ; G 3014 -U 8495 ; WX 592 ; N uni212F ; G 3015 -U 8496 ; WX 605 ; N uni2130 ; G 3016 -U 8497 ; WX 786 ; N uni2131 ; G 3017 -U 8498 ; WX 575 ; N uni2132 ; G 3018 -U 8499 ; WX 1069 ; N uni2133 ; G 3019 -U 8500 ; WX 462 ; N uni2134 ; G 3020 -U 8501 ; WX 745 ; N aleph ; G 3021 -U 8502 ; WX 674 ; N uni2136 ; G 3022 -U 8503 ; WX 466 ; N uni2137 ; G 3023 -U 8504 ; WX 645 ; N uni2138 ; G 3024 -U 8505 ; WX 380 ; N uni2139 ; G 3025 -U 8506 ; WX 926 ; N uni213A ; G 3026 -U 8507 ; WX 1194 ; N uni213B ; G 3027 -U 8508 ; WX 702 ; N uni213C ; G 3028 -U 8509 ; WX 728 ; N uni213D ; G 3029 -U 8510 ; WX 654 ; N uni213E ; G 3030 -U 8511 ; WX 849 ; N uni213F ; G 3031 -U 8512 ; WX 811 ; N uni2140 ; G 3032 -U 8513 ; WX 775 ; N uni2141 ; G 3033 -U 8514 ; WX 557 ; N uni2142 ; G 3034 -U 8515 ; WX 557 ; N uni2143 ; G 3035 -U 8516 ; WX 611 ; N uni2144 ; G 3036 -U 8517 ; WX 819 ; N uni2145 ; G 3037 -U 8518 ; WX 708 ; N uni2146 ; G 3038 -U 8519 ; WX 615 ; N uni2147 ; G 3039 -U 8520 ; WX 351 ; N uni2148 ; G 3040 -U 8521 ; WX 351 ; N uni2149 ; G 3041 -U 8523 ; WX 780 ; N uni214B ; G 3042 -U 8526 ; WX 526 ; N uni214E ; G 3043 -U 8528 ; WX 969 ; N uni2150 ; G 3044 -U 8529 ; WX 969 ; N uni2151 ; G 3045 -U 8530 ; WX 1370 ; N uni2152 ; G 3046 -U 8531 ; WX 969 ; N onethird ; G 3047 -U 8532 ; WX 969 ; N twothirds ; G 3048 -U 8533 ; WX 969 ; N uni2155 ; G 3049 -U 8534 ; WX 969 ; N uni2156 ; G 3050 -U 8535 ; WX 969 ; N uni2157 ; G 3051 -U 8536 ; WX 969 ; N uni2158 ; G 3052 -U 8537 ; WX 969 ; N uni2159 ; G 3053 -U 8538 ; WX 969 ; N uni215A ; G 3054 -U 8539 ; WX 969 ; N oneeighth ; G 3055 -U 8540 ; WX 969 ; N threeeighths ; G 3056 -U 8541 ; WX 969 ; N fiveeighths ; G 3057 -U 8542 ; WX 969 ; N seveneighths ; G 3058 -U 8543 ; WX 568 ; N uni215F ; G 3059 -U 8544 ; WX 295 ; N uni2160 ; G 3060 -U 8545 ; WX 492 ; N uni2161 ; G 3061 -U 8546 ; WX 689 ; N uni2162 ; G 3062 -U 8547 ; WX 923 ; N uni2163 ; G 3063 -U 8548 ; WX 684 ; N uni2164 ; G 3064 -U 8549 ; WX 922 ; N uni2165 ; G 3065 -U 8550 ; WX 1120 ; N uni2166 ; G 3066 -U 8551 ; WX 1317 ; N uni2167 ; G 3067 -U 8552 ; WX 917 ; N uni2168 ; G 3068 -U 8553 ; WX 685 ; N uni2169 ; G 3069 -U 8554 ; WX 933 ; N uni216A ; G 3070 -U 8555 ; WX 1131 ; N uni216B ; G 3071 -U 8556 ; WX 557 ; N uni216C ; G 3072 -U 8557 ; WX 698 ; N uni216D ; G 3073 -U 8558 ; WX 770 ; N uni216E ; G 3074 -U 8559 ; WX 863 ; N uni216F ; G 3075 -U 8560 ; WX 278 ; N uni2170 ; G 3076 -U 8561 ; WX 458 ; N uni2171 ; G 3077 -U 8562 ; WX 637 ; N uni2172 ; G 3078 -U 8563 ; WX 812 ; N uni2173 ; G 3079 -U 8564 ; WX 592 ; N uni2174 ; G 3080 -U 8565 ; WX 811 ; N uni2175 ; G 3081 -U 8566 ; WX 991 ; N uni2176 ; G 3082 -U 8567 ; WX 1170 ; N uni2177 ; G 3083 -U 8568 ; WX 819 ; N uni2178 ; G 3084 -U 8569 ; WX 592 ; N uni2179 ; G 3085 -U 8570 ; WX 822 ; N uni217A ; G 3086 -U 8571 ; WX 1002 ; N uni217B ; G 3087 -U 8572 ; WX 278 ; N uni217C ; G 3088 -U 8573 ; WX 550 ; N uni217D ; G 3089 -U 8574 ; WX 635 ; N uni217E ; G 3090 -U 8575 ; WX 974 ; N uni217F ; G 3091 -U 8576 ; WX 1245 ; N uni2180 ; G 3092 -U 8577 ; WX 770 ; N uni2181 ; G 3093 -U 8578 ; WX 1245 ; N uni2182 ; G 3094 -U 8579 ; WX 703 ; N uni2183 ; G 3095 -U 8580 ; WX 549 ; N uni2184 ; G 3096 -U 8581 ; WX 698 ; N uni2185 ; G 3097 -U 8585 ; WX 969 ; N uni2189 ; G 3098 -U 8592 ; WX 838 ; N arrowleft ; G 3099 -U 8593 ; WX 838 ; N arrowup ; G 3100 -U 8594 ; WX 838 ; N arrowright ; G 3101 -U 8595 ; WX 838 ; N arrowdown ; G 3102 -U 8596 ; WX 838 ; N arrowboth ; G 3103 -U 8597 ; WX 838 ; N arrowupdn ; G 3104 -U 8598 ; WX 838 ; N uni2196 ; G 3105 -U 8599 ; WX 838 ; N uni2197 ; G 3106 -U 8600 ; WX 838 ; N uni2198 ; G 3107 -U 8601 ; WX 838 ; N uni2199 ; G 3108 -U 8602 ; WX 838 ; N uni219A ; G 3109 -U 8603 ; WX 838 ; N uni219B ; G 3110 -U 8604 ; WX 838 ; N uni219C ; G 3111 -U 8605 ; WX 838 ; N uni219D ; G 3112 -U 8606 ; WX 838 ; N uni219E ; G 3113 -U 8607 ; WX 838 ; N uni219F ; G 3114 -U 8608 ; WX 838 ; N uni21A0 ; G 3115 -U 8609 ; WX 838 ; N uni21A1 ; G 3116 -U 8610 ; WX 838 ; N uni21A2 ; G 3117 -U 8611 ; WX 838 ; N uni21A3 ; G 3118 -U 8612 ; WX 838 ; N uni21A4 ; G 3119 -U 8613 ; WX 838 ; N uni21A5 ; G 3120 -U 8614 ; WX 838 ; N uni21A6 ; G 3121 -U 8615 ; WX 838 ; N uni21A7 ; G 3122 -U 8616 ; WX 838 ; N arrowupdnbse ; G 3123 -U 8617 ; WX 838 ; N uni21A9 ; G 3124 -U 8618 ; WX 838 ; N uni21AA ; G 3125 -U 8619 ; WX 838 ; N uni21AB ; G 3126 -U 8620 ; WX 838 ; N uni21AC ; G 3127 -U 8621 ; WX 838 ; N uni21AD ; G 3128 -U 8622 ; WX 838 ; N uni21AE ; G 3129 -U 8623 ; WX 838 ; N uni21AF ; G 3130 -U 8624 ; WX 838 ; N uni21B0 ; G 3131 -U 8625 ; WX 838 ; N uni21B1 ; G 3132 -U 8626 ; WX 838 ; N uni21B2 ; G 3133 -U 8627 ; WX 838 ; N uni21B3 ; G 3134 -U 8628 ; WX 838 ; N uni21B4 ; G 3135 -U 8629 ; WX 838 ; N carriagereturn ; G 3136 -U 8630 ; WX 838 ; N uni21B6 ; G 3137 -U 8631 ; WX 838 ; N uni21B7 ; G 3138 -U 8632 ; WX 838 ; N uni21B8 ; G 3139 -U 8633 ; WX 838 ; N uni21B9 ; G 3140 -U 8634 ; WX 838 ; N uni21BA ; G 3141 -U 8635 ; WX 838 ; N uni21BB ; G 3142 -U 8636 ; WX 838 ; N uni21BC ; G 3143 -U 8637 ; WX 838 ; N uni21BD ; G 3144 -U 8638 ; WX 838 ; N uni21BE ; G 3145 -U 8639 ; WX 838 ; N uni21BF ; G 3146 -U 8640 ; WX 838 ; N uni21C0 ; G 3147 -U 8641 ; WX 838 ; N uni21C1 ; G 3148 -U 8642 ; WX 838 ; N uni21C2 ; G 3149 -U 8643 ; WX 838 ; N uni21C3 ; G 3150 -U 8644 ; WX 838 ; N uni21C4 ; G 3151 -U 8645 ; WX 838 ; N uni21C5 ; G 3152 -U 8646 ; WX 838 ; N uni21C6 ; G 3153 -U 8647 ; WX 838 ; N uni21C7 ; G 3154 -U 8648 ; WX 838 ; N uni21C8 ; G 3155 -U 8649 ; WX 838 ; N uni21C9 ; G 3156 -U 8650 ; WX 838 ; N uni21CA ; G 3157 -U 8651 ; WX 838 ; N uni21CB ; G 3158 -U 8652 ; WX 838 ; N uni21CC ; G 3159 -U 8653 ; WX 838 ; N uni21CD ; G 3160 -U 8654 ; WX 838 ; N uni21CE ; G 3161 -U 8655 ; WX 838 ; N uni21CF ; G 3162 -U 8656 ; WX 838 ; N arrowdblleft ; G 3163 -U 8657 ; WX 838 ; N arrowdblup ; G 3164 -U 8658 ; WX 838 ; N arrowdblright ; G 3165 -U 8659 ; WX 838 ; N arrowdbldown ; G 3166 -U 8660 ; WX 838 ; N arrowdblboth ; G 3167 -U 8661 ; WX 838 ; N uni21D5 ; G 3168 -U 8662 ; WX 838 ; N uni21D6 ; G 3169 -U 8663 ; WX 838 ; N uni21D7 ; G 3170 -U 8664 ; WX 838 ; N uni21D8 ; G 3171 -U 8665 ; WX 838 ; N uni21D9 ; G 3172 -U 8666 ; WX 838 ; N uni21DA ; G 3173 -U 8667 ; WX 838 ; N uni21DB ; G 3174 -U 8668 ; WX 838 ; N uni21DC ; G 3175 -U 8669 ; WX 838 ; N uni21DD ; G 3176 -U 8670 ; WX 838 ; N uni21DE ; G 3177 -U 8671 ; WX 838 ; N uni21DF ; G 3178 -U 8672 ; WX 838 ; N uni21E0 ; G 3179 -U 8673 ; WX 838 ; N uni21E1 ; G 3180 -U 8674 ; WX 838 ; N uni21E2 ; G 3181 -U 8675 ; WX 838 ; N uni21E3 ; G 3182 -U 8676 ; WX 838 ; N uni21E4 ; G 3183 -U 8677 ; WX 838 ; N uni21E5 ; G 3184 -U 8678 ; WX 838 ; N uni21E6 ; G 3185 -U 8679 ; WX 838 ; N uni21E7 ; G 3186 -U 8680 ; WX 838 ; N uni21E8 ; G 3187 -U 8681 ; WX 838 ; N uni21E9 ; G 3188 -U 8682 ; WX 838 ; N uni21EA ; G 3189 -U 8683 ; WX 838 ; N uni21EB ; G 3190 -U 8684 ; WX 838 ; N uni21EC ; G 3191 -U 8685 ; WX 838 ; N uni21ED ; G 3192 -U 8686 ; WX 838 ; N uni21EE ; G 3193 -U 8687 ; WX 838 ; N uni21EF ; G 3194 -U 8688 ; WX 838 ; N uni21F0 ; G 3195 -U 8689 ; WX 838 ; N uni21F1 ; G 3196 -U 8690 ; WX 838 ; N uni21F2 ; G 3197 -U 8691 ; WX 838 ; N uni21F3 ; G 3198 -U 8692 ; WX 838 ; N uni21F4 ; G 3199 -U 8693 ; WX 838 ; N uni21F5 ; G 3200 -U 8694 ; WX 838 ; N uni21F6 ; G 3201 -U 8695 ; WX 838 ; N uni21F7 ; G 3202 -U 8696 ; WX 838 ; N uni21F8 ; G 3203 -U 8697 ; WX 838 ; N uni21F9 ; G 3204 -U 8698 ; WX 838 ; N uni21FA ; G 3205 -U 8699 ; WX 838 ; N uni21FB ; G 3206 -U 8700 ; WX 838 ; N uni21FC ; G 3207 -U 8701 ; WX 838 ; N uni21FD ; G 3208 -U 8702 ; WX 838 ; N uni21FE ; G 3209 -U 8703 ; WX 838 ; N uni21FF ; G 3210 -U 8704 ; WX 684 ; N universal ; G 3211 -U 8705 ; WX 636 ; N uni2201 ; G 3212 -U 8706 ; WX 517 ; N partialdiff ; G 3213 -U 8707 ; WX 632 ; N existential ; G 3214 -U 8708 ; WX 632 ; N uni2204 ; G 3215 -U 8709 ; WX 871 ; N emptyset ; G 3216 -U 8710 ; WX 669 ; N increment ; G 3217 -U 8711 ; WX 669 ; N gradient ; G 3218 -U 8712 ; WX 871 ; N element ; G 3219 -U 8713 ; WX 871 ; N notelement ; G 3220 -U 8714 ; WX 718 ; N uni220A ; G 3221 -U 8715 ; WX 871 ; N suchthat ; G 3222 -U 8716 ; WX 871 ; N uni220C ; G 3223 -U 8717 ; WX 718 ; N uni220D ; G 3224 -U 8718 ; WX 636 ; N uni220E ; G 3225 -U 8719 ; WX 757 ; N product ; G 3226 -U 8720 ; WX 757 ; N uni2210 ; G 3227 -U 8721 ; WX 674 ; N summation ; G 3228 -U 8722 ; WX 838 ; N minus ; G 3229 -U 8723 ; WX 838 ; N uni2213 ; G 3230 -U 8724 ; WX 838 ; N uni2214 ; G 3231 -U 8725 ; WX 337 ; N uni2215 ; G 3232 -U 8726 ; WX 637 ; N uni2216 ; G 3233 -U 8727 ; WX 838 ; N asteriskmath ; G 3234 -U 8728 ; WX 626 ; N uni2218 ; G 3235 -U 8729 ; WX 626 ; N uni2219 ; G 3236 -U 8730 ; WX 637 ; N radical ; G 3237 -U 8731 ; WX 637 ; N uni221B ; G 3238 -U 8732 ; WX 637 ; N uni221C ; G 3239 -U 8733 ; WX 714 ; N proportional ; G 3240 -U 8734 ; WX 833 ; N infinity ; G 3241 -U 8735 ; WX 838 ; N orthogonal ; G 3242 -U 8736 ; WX 896 ; N angle ; G 3243 -U 8737 ; WX 896 ; N uni2221 ; G 3244 -U 8738 ; WX 838 ; N uni2222 ; G 3245 -U 8739 ; WX 500 ; N uni2223 ; G 3246 -U 8740 ; WX 500 ; N uni2224 ; G 3247 -U 8741 ; WX 500 ; N uni2225 ; G 3248 -U 8742 ; WX 500 ; N uni2226 ; G 3249 -U 8743 ; WX 732 ; N logicaland ; G 3250 -U 8744 ; WX 732 ; N logicalor ; G 3251 -U 8745 ; WX 732 ; N intersection ; G 3252 -U 8746 ; WX 732 ; N union ; G 3253 -U 8747 ; WX 521 ; N integral ; G 3254 -U 8748 ; WX 789 ; N uni222C ; G 3255 -U 8749 ; WX 1057 ; N uni222D ; G 3256 -U 8750 ; WX 521 ; N uni222E ; G 3257 -U 8751 ; WX 789 ; N uni222F ; G 3258 -U 8752 ; WX 1057 ; N uni2230 ; G 3259 -U 8753 ; WX 521 ; N uni2231 ; G 3260 -U 8754 ; WX 521 ; N uni2232 ; G 3261 -U 8755 ; WX 521 ; N uni2233 ; G 3262 -U 8756 ; WX 636 ; N therefore ; G 3263 -U 8757 ; WX 636 ; N uni2235 ; G 3264 -U 8758 ; WX 260 ; N uni2236 ; G 3265 -U 8759 ; WX 636 ; N uni2237 ; G 3266 -U 8760 ; WX 838 ; N uni2238 ; G 3267 -U 8761 ; WX 838 ; N uni2239 ; G 3268 -U 8762 ; WX 838 ; N uni223A ; G 3269 -U 8763 ; WX 838 ; N uni223B ; G 3270 -U 8764 ; WX 838 ; N similar ; G 3271 -U 8765 ; WX 838 ; N uni223D ; G 3272 -U 8766 ; WX 838 ; N uni223E ; G 3273 -U 8767 ; WX 838 ; N uni223F ; G 3274 -U 8768 ; WX 375 ; N uni2240 ; G 3275 -U 8769 ; WX 838 ; N uni2241 ; G 3276 -U 8770 ; WX 838 ; N uni2242 ; G 3277 -U 8771 ; WX 838 ; N uni2243 ; G 3278 -U 8772 ; WX 838 ; N uni2244 ; G 3279 -U 8773 ; WX 838 ; N congruent ; G 3280 -U 8774 ; WX 838 ; N uni2246 ; G 3281 -U 8775 ; WX 838 ; N uni2247 ; G 3282 -U 8776 ; WX 838 ; N approxequal ; G 3283 -U 8777 ; WX 838 ; N uni2249 ; G 3284 -U 8778 ; WX 838 ; N uni224A ; G 3285 -U 8779 ; WX 838 ; N uni224B ; G 3286 -U 8780 ; WX 838 ; N uni224C ; G 3287 -U 8781 ; WX 838 ; N uni224D ; G 3288 -U 8782 ; WX 838 ; N uni224E ; G 3289 -U 8783 ; WX 838 ; N uni224F ; G 3290 -U 8784 ; WX 838 ; N uni2250 ; G 3291 -U 8785 ; WX 838 ; N uni2251 ; G 3292 -U 8786 ; WX 839 ; N uni2252 ; G 3293 -U 8787 ; WX 839 ; N uni2253 ; G 3294 -U 8788 ; WX 1000 ; N uni2254 ; G 3295 -U 8789 ; WX 1000 ; N uni2255 ; G 3296 -U 8790 ; WX 838 ; N uni2256 ; G 3297 -U 8791 ; WX 838 ; N uni2257 ; G 3298 -U 8792 ; WX 838 ; N uni2258 ; G 3299 -U 8793 ; WX 838 ; N uni2259 ; G 3300 -U 8794 ; WX 838 ; N uni225A ; G 3301 -U 8795 ; WX 838 ; N uni225B ; G 3302 -U 8796 ; WX 838 ; N uni225C ; G 3303 -U 8797 ; WX 838 ; N uni225D ; G 3304 -U 8798 ; WX 838 ; N uni225E ; G 3305 -U 8799 ; WX 838 ; N uni225F ; G 3306 -U 8800 ; WX 838 ; N notequal ; G 3307 -U 8801 ; WX 838 ; N equivalence ; G 3308 -U 8802 ; WX 838 ; N uni2262 ; G 3309 -U 8803 ; WX 838 ; N uni2263 ; G 3310 -U 8804 ; WX 838 ; N lessequal ; G 3311 -U 8805 ; WX 838 ; N greaterequal ; G 3312 -U 8806 ; WX 838 ; N uni2266 ; G 3313 -U 8807 ; WX 838 ; N uni2267 ; G 3314 -U 8808 ; WX 838 ; N uni2268 ; G 3315 -U 8809 ; WX 838 ; N uni2269 ; G 3316 -U 8810 ; WX 1047 ; N uni226A ; G 3317 -U 8811 ; WX 1047 ; N uni226B ; G 3318 -U 8812 ; WX 464 ; N uni226C ; G 3319 -U 8813 ; WX 838 ; N uni226D ; G 3320 -U 8814 ; WX 838 ; N uni226E ; G 3321 -U 8815 ; WX 838 ; N uni226F ; G 3322 -U 8816 ; WX 838 ; N uni2270 ; G 3323 -U 8817 ; WX 838 ; N uni2271 ; G 3324 -U 8818 ; WX 838 ; N uni2272 ; G 3325 -U 8819 ; WX 838 ; N uni2273 ; G 3326 -U 8820 ; WX 838 ; N uni2274 ; G 3327 -U 8821 ; WX 838 ; N uni2275 ; G 3328 -U 8822 ; WX 838 ; N uni2276 ; G 3329 -U 8823 ; WX 838 ; N uni2277 ; G 3330 -U 8824 ; WX 838 ; N uni2278 ; G 3331 -U 8825 ; WX 838 ; N uni2279 ; G 3332 -U 8826 ; WX 838 ; N uni227A ; G 3333 -U 8827 ; WX 838 ; N uni227B ; G 3334 -U 8828 ; WX 838 ; N uni227C ; G 3335 -U 8829 ; WX 838 ; N uni227D ; G 3336 -U 8830 ; WX 838 ; N uni227E ; G 3337 -U 8831 ; WX 838 ; N uni227F ; G 3338 -U 8832 ; WX 838 ; N uni2280 ; G 3339 -U 8833 ; WX 838 ; N uni2281 ; G 3340 -U 8834 ; WX 838 ; N propersubset ; G 3341 -U 8835 ; WX 838 ; N propersuperset ; G 3342 -U 8836 ; WX 838 ; N notsubset ; G 3343 -U 8837 ; WX 838 ; N uni2285 ; G 3344 -U 8838 ; WX 838 ; N reflexsubset ; G 3345 -U 8839 ; WX 838 ; N reflexsuperset ; G 3346 -U 8840 ; WX 838 ; N uni2288 ; G 3347 -U 8841 ; WX 838 ; N uni2289 ; G 3348 -U 8842 ; WX 838 ; N uni228A ; G 3349 -U 8843 ; WX 838 ; N uni228B ; G 3350 -U 8844 ; WX 732 ; N uni228C ; G 3351 -U 8845 ; WX 732 ; N uni228D ; G 3352 -U 8846 ; WX 732 ; N uni228E ; G 3353 -U 8847 ; WX 838 ; N uni228F ; G 3354 -U 8848 ; WX 838 ; N uni2290 ; G 3355 -U 8849 ; WX 838 ; N uni2291 ; G 3356 -U 8850 ; WX 838 ; N uni2292 ; G 3357 -U 8851 ; WX 780 ; N uni2293 ; G 3358 -U 8852 ; WX 780 ; N uni2294 ; G 3359 -U 8853 ; WX 838 ; N circleplus ; G 3360 -U 8854 ; WX 838 ; N uni2296 ; G 3361 -U 8855 ; WX 838 ; N circlemultiply ; G 3362 -U 8856 ; WX 838 ; N uni2298 ; G 3363 -U 8857 ; WX 838 ; N uni2299 ; G 3364 -U 8858 ; WX 838 ; N uni229A ; G 3365 -U 8859 ; WX 838 ; N uni229B ; G 3366 -U 8860 ; WX 838 ; N uni229C ; G 3367 -U 8861 ; WX 838 ; N uni229D ; G 3368 -U 8862 ; WX 838 ; N uni229E ; G 3369 -U 8863 ; WX 838 ; N uni229F ; G 3370 -U 8864 ; WX 838 ; N uni22A0 ; G 3371 -U 8865 ; WX 838 ; N uni22A1 ; G 3372 -U 8866 ; WX 871 ; N uni22A2 ; G 3373 -U 8867 ; WX 871 ; N uni22A3 ; G 3374 -U 8868 ; WX 871 ; N uni22A4 ; G 3375 -U 8869 ; WX 871 ; N perpendicular ; G 3376 -U 8870 ; WX 521 ; N uni22A6 ; G 3377 -U 8871 ; WX 521 ; N uni22A7 ; G 3378 -U 8872 ; WX 871 ; N uni22A8 ; G 3379 -U 8873 ; WX 871 ; N uni22A9 ; G 3380 -U 8874 ; WX 871 ; N uni22AA ; G 3381 -U 8875 ; WX 871 ; N uni22AB ; G 3382 -U 8876 ; WX 871 ; N uni22AC ; G 3383 -U 8877 ; WX 871 ; N uni22AD ; G 3384 -U 8878 ; WX 871 ; N uni22AE ; G 3385 -U 8879 ; WX 871 ; N uni22AF ; G 3386 -U 8880 ; WX 838 ; N uni22B0 ; G 3387 -U 8881 ; WX 838 ; N uni22B1 ; G 3388 -U 8882 ; WX 838 ; N uni22B2 ; G 3389 -U 8883 ; WX 838 ; N uni22B3 ; G 3390 -U 8884 ; WX 838 ; N uni22B4 ; G 3391 -U 8885 ; WX 838 ; N uni22B5 ; G 3392 -U 8886 ; WX 1000 ; N uni22B6 ; G 3393 -U 8887 ; WX 1000 ; N uni22B7 ; G 3394 -U 8888 ; WX 838 ; N uni22B8 ; G 3395 -U 8889 ; WX 838 ; N uni22B9 ; G 3396 -U 8890 ; WX 521 ; N uni22BA ; G 3397 -U 8891 ; WX 732 ; N uni22BB ; G 3398 -U 8892 ; WX 732 ; N uni22BC ; G 3399 -U 8893 ; WX 732 ; N uni22BD ; G 3400 -U 8894 ; WX 838 ; N uni22BE ; G 3401 -U 8895 ; WX 838 ; N uni22BF ; G 3402 -U 8896 ; WX 820 ; N uni22C0 ; G 3403 -U 8897 ; WX 820 ; N uni22C1 ; G 3404 -U 8898 ; WX 820 ; N uni22C2 ; G 3405 -U 8899 ; WX 820 ; N uni22C3 ; G 3406 -U 8900 ; WX 626 ; N uni22C4 ; G 3407 -U 8901 ; WX 318 ; N dotmath ; G 3408 -U 8902 ; WX 626 ; N uni22C6 ; G 3409 -U 8903 ; WX 838 ; N uni22C7 ; G 3410 -U 8904 ; WX 1000 ; N uni22C8 ; G 3411 -U 8905 ; WX 1000 ; N uni22C9 ; G 3412 -U 8906 ; WX 1000 ; N uni22CA ; G 3413 -U 8907 ; WX 1000 ; N uni22CB ; G 3414 -U 8908 ; WX 1000 ; N uni22CC ; G 3415 -U 8909 ; WX 838 ; N uni22CD ; G 3416 -U 8910 ; WX 732 ; N uni22CE ; G 3417 -U 8911 ; WX 732 ; N uni22CF ; G 3418 -U 8912 ; WX 838 ; N uni22D0 ; G 3419 -U 8913 ; WX 838 ; N uni22D1 ; G 3420 -U 8914 ; WX 838 ; N uni22D2 ; G 3421 -U 8915 ; WX 838 ; N uni22D3 ; G 3422 -U 8916 ; WX 838 ; N uni22D4 ; G 3423 -U 8917 ; WX 838 ; N uni22D5 ; G 3424 -U 8918 ; WX 838 ; N uni22D6 ; G 3425 -U 8919 ; WX 838 ; N uni22D7 ; G 3426 -U 8920 ; WX 1422 ; N uni22D8 ; G 3427 -U 8921 ; WX 1422 ; N uni22D9 ; G 3428 -U 8922 ; WX 838 ; N uni22DA ; G 3429 -U 8923 ; WX 838 ; N uni22DB ; G 3430 -U 8924 ; WX 838 ; N uni22DC ; G 3431 -U 8925 ; WX 838 ; N uni22DD ; G 3432 -U 8926 ; WX 838 ; N uni22DE ; G 3433 -U 8927 ; WX 838 ; N uni22DF ; G 3434 -U 8928 ; WX 838 ; N uni22E0 ; G 3435 -U 8929 ; WX 838 ; N uni22E1 ; G 3436 -U 8930 ; WX 838 ; N uni22E2 ; G 3437 -U 8931 ; WX 838 ; N uni22E3 ; G 3438 -U 8932 ; WX 838 ; N uni22E4 ; G 3439 -U 8933 ; WX 838 ; N uni22E5 ; G 3440 -U 8934 ; WX 838 ; N uni22E6 ; G 3441 -U 8935 ; WX 838 ; N uni22E7 ; G 3442 -U 8936 ; WX 838 ; N uni22E8 ; G 3443 -U 8937 ; WX 838 ; N uni22E9 ; G 3444 -U 8938 ; WX 838 ; N uni22EA ; G 3445 -U 8939 ; WX 838 ; N uni22EB ; G 3446 -U 8940 ; WX 838 ; N uni22EC ; G 3447 -U 8941 ; WX 838 ; N uni22ED ; G 3448 -U 8942 ; WX 1000 ; N uni22EE ; G 3449 -U 8943 ; WX 1000 ; N uni22EF ; G 3450 -U 8944 ; WX 1000 ; N uni22F0 ; G 3451 -U 8945 ; WX 1000 ; N uni22F1 ; G 3452 -U 8946 ; WX 1000 ; N uni22F2 ; G 3453 -U 8947 ; WX 871 ; N uni22F3 ; G 3454 -U 8948 ; WX 718 ; N uni22F4 ; G 3455 -U 8949 ; WX 871 ; N uni22F5 ; G 3456 -U 8950 ; WX 871 ; N uni22F6 ; G 3457 -U 8951 ; WX 718 ; N uni22F7 ; G 3458 -U 8952 ; WX 871 ; N uni22F8 ; G 3459 -U 8953 ; WX 871 ; N uni22F9 ; G 3460 -U 8954 ; WX 1000 ; N uni22FA ; G 3461 -U 8955 ; WX 871 ; N uni22FB ; G 3462 -U 8956 ; WX 718 ; N uni22FC ; G 3463 -U 8957 ; WX 871 ; N uni22FD ; G 3464 -U 8958 ; WX 718 ; N uni22FE ; G 3465 -U 8959 ; WX 871 ; N uni22FF ; G 3466 -U 8960 ; WX 602 ; N uni2300 ; G 3467 -U 8961 ; WX 602 ; N uni2301 ; G 3468 -U 8962 ; WX 635 ; N house ; G 3469 -U 8963 ; WX 838 ; N uni2303 ; G 3470 -U 8964 ; WX 838 ; N uni2304 ; G 3471 -U 8965 ; WX 838 ; N uni2305 ; G 3472 -U 8966 ; WX 838 ; N uni2306 ; G 3473 -U 8967 ; WX 488 ; N uni2307 ; G 3474 -U 8968 ; WX 390 ; N uni2308 ; G 3475 -U 8969 ; WX 390 ; N uni2309 ; G 3476 -U 8970 ; WX 390 ; N uni230A ; G 3477 -U 8971 ; WX 390 ; N uni230B ; G 3478 -U 8972 ; WX 809 ; N uni230C ; G 3479 -U 8973 ; WX 809 ; N uni230D ; G 3480 -U 8974 ; WX 809 ; N uni230E ; G 3481 -U 8975 ; WX 809 ; N uni230F ; G 3482 -U 8976 ; WX 838 ; N revlogicalnot ; G 3483 -U 8977 ; WX 513 ; N uni2311 ; G 3484 -U 8984 ; WX 1000 ; N uni2318 ; G 3485 -U 8985 ; WX 838 ; N uni2319 ; G 3486 -U 8988 ; WX 469 ; N uni231C ; G 3487 -U 8989 ; WX 469 ; N uni231D ; G 3488 -U 8990 ; WX 469 ; N uni231E ; G 3489 -U 8991 ; WX 469 ; N uni231F ; G 3490 -U 8992 ; WX 521 ; N integraltp ; G 3491 -U 8993 ; WX 521 ; N integralbt ; G 3492 -U 8996 ; WX 1152 ; N uni2324 ; G 3493 -U 8997 ; WX 1152 ; N uni2325 ; G 3494 -U 8998 ; WX 1414 ; N uni2326 ; G 3495 -U 8999 ; WX 1152 ; N uni2327 ; G 3496 -U 9000 ; WX 1443 ; N uni2328 ; G 3497 -U 9003 ; WX 1414 ; N uni232B ; G 3498 -U 9004 ; WX 873 ; N uni232C ; G 3499 -U 9075 ; WX 338 ; N uni2373 ; G 3500 -U 9076 ; WX 635 ; N uni2374 ; G 3501 -U 9077 ; WX 837 ; N uni2375 ; G 3502 -U 9082 ; WX 659 ; N uni237A ; G 3503 -U 9085 ; WX 757 ; N uni237D ; G 3504 -U 9095 ; WX 1152 ; N uni2387 ; G 3505 -U 9108 ; WX 873 ; N uni2394 ; G 3506 -U 9115 ; WX 500 ; N uni239B ; G 3507 -U 9116 ; WX 500 ; N uni239C ; G 3508 -U 9117 ; WX 500 ; N uni239D ; G 3509 -U 9118 ; WX 500 ; N uni239E ; G 3510 -U 9119 ; WX 500 ; N uni239F ; G 3511 -U 9120 ; WX 500 ; N uni23A0 ; G 3512 -U 9121 ; WX 500 ; N uni23A1 ; G 3513 -U 9122 ; WX 500 ; N uni23A2 ; G 3514 -U 9123 ; WX 500 ; N uni23A3 ; G 3515 -U 9124 ; WX 500 ; N uni23A4 ; G 3516 -U 9125 ; WX 500 ; N uni23A5 ; G 3517 -U 9126 ; WX 500 ; N uni23A6 ; G 3518 -U 9127 ; WX 750 ; N uni23A7 ; G 3519 -U 9128 ; WX 750 ; N uni23A8 ; G 3520 -U 9129 ; WX 750 ; N uni23A9 ; G 3521 -U 9130 ; WX 750 ; N uni23AA ; G 3522 -U 9131 ; WX 750 ; N uni23AB ; G 3523 -U 9132 ; WX 750 ; N uni23AC ; G 3524 -U 9133 ; WX 750 ; N uni23AD ; G 3525 -U 9134 ; WX 521 ; N uni23AE ; G 3526 -U 9166 ; WX 838 ; N uni23CE ; G 3527 -U 9167 ; WX 945 ; N uni23CF ; G 3528 -U 9187 ; WX 873 ; N uni23E3 ; G 3529 -U 9189 ; WX 769 ; N uni23E5 ; G 3530 -U 9192 ; WX 636 ; N uni23E8 ; G 3531 -U 9250 ; WX 635 ; N uni2422 ; G 3532 -U 9251 ; WX 635 ; N uni2423 ; G 3533 -U 9312 ; WX 896 ; N uni2460 ; G 3534 -U 9313 ; WX 896 ; N uni2461 ; G 3535 -U 9314 ; WX 896 ; N uni2462 ; G 3536 -U 9315 ; WX 896 ; N uni2463 ; G 3537 -U 9316 ; WX 896 ; N uni2464 ; G 3538 -U 9317 ; WX 896 ; N uni2465 ; G 3539 -U 9318 ; WX 896 ; N uni2466 ; G 3540 -U 9319 ; WX 896 ; N uni2467 ; G 3541 -U 9320 ; WX 896 ; N uni2468 ; G 3542 -U 9321 ; WX 896 ; N uni2469 ; G 3543 -U 9472 ; WX 602 ; N SF100000 ; G 3544 -U 9473 ; WX 602 ; N uni2501 ; G 3545 -U 9474 ; WX 602 ; N SF110000 ; G 3546 -U 9475 ; WX 602 ; N uni2503 ; G 3547 -U 9476 ; WX 602 ; N uni2504 ; G 3548 -U 9477 ; WX 602 ; N uni2505 ; G 3549 -U 9478 ; WX 602 ; N uni2506 ; G 3550 -U 9479 ; WX 602 ; N uni2507 ; G 3551 -U 9480 ; WX 602 ; N uni2508 ; G 3552 -U 9481 ; WX 602 ; N uni2509 ; G 3553 -U 9482 ; WX 602 ; N uni250A ; G 3554 -U 9483 ; WX 602 ; N uni250B ; G 3555 -U 9484 ; WX 602 ; N SF010000 ; G 3556 -U 9485 ; WX 602 ; N uni250D ; G 3557 -U 9486 ; WX 602 ; N uni250E ; G 3558 -U 9487 ; WX 602 ; N uni250F ; G 3559 -U 9488 ; WX 602 ; N SF030000 ; G 3560 -U 9489 ; WX 602 ; N uni2511 ; G 3561 -U 9490 ; WX 602 ; N uni2512 ; G 3562 -U 9491 ; WX 602 ; N uni2513 ; G 3563 -U 9492 ; WX 602 ; N SF020000 ; G 3564 -U 9493 ; WX 602 ; N uni2515 ; G 3565 -U 9494 ; WX 602 ; N uni2516 ; G 3566 -U 9495 ; WX 602 ; N uni2517 ; G 3567 -U 9496 ; WX 602 ; N SF040000 ; G 3568 -U 9497 ; WX 602 ; N uni2519 ; G 3569 -U 9498 ; WX 602 ; N uni251A ; G 3570 -U 9499 ; WX 602 ; N uni251B ; G 3571 -U 9500 ; WX 602 ; N SF080000 ; G 3572 -U 9501 ; WX 602 ; N uni251D ; G 3573 -U 9502 ; WX 602 ; N uni251E ; G 3574 -U 9503 ; WX 602 ; N uni251F ; G 3575 -U 9504 ; WX 602 ; N uni2520 ; G 3576 -U 9505 ; WX 602 ; N uni2521 ; G 3577 -U 9506 ; WX 602 ; N uni2522 ; G 3578 -U 9507 ; WX 602 ; N uni2523 ; G 3579 -U 9508 ; WX 602 ; N SF090000 ; G 3580 -U 9509 ; WX 602 ; N uni2525 ; G 3581 -U 9510 ; WX 602 ; N uni2526 ; G 3582 -U 9511 ; WX 602 ; N uni2527 ; G 3583 -U 9512 ; WX 602 ; N uni2528 ; G 3584 -U 9513 ; WX 602 ; N uni2529 ; G 3585 -U 9514 ; WX 602 ; N uni252A ; G 3586 -U 9515 ; WX 602 ; N uni252B ; G 3587 -U 9516 ; WX 602 ; N SF060000 ; G 3588 -U 9517 ; WX 602 ; N uni252D ; G 3589 -U 9518 ; WX 602 ; N uni252E ; G 3590 -U 9519 ; WX 602 ; N uni252F ; G 3591 -U 9520 ; WX 602 ; N uni2530 ; G 3592 -U 9521 ; WX 602 ; N uni2531 ; G 3593 -U 9522 ; WX 602 ; N uni2532 ; G 3594 -U 9523 ; WX 602 ; N uni2533 ; G 3595 -U 9524 ; WX 602 ; N SF070000 ; G 3596 -U 9525 ; WX 602 ; N uni2535 ; G 3597 -U 9526 ; WX 602 ; N uni2536 ; G 3598 -U 9527 ; WX 602 ; N uni2537 ; G 3599 -U 9528 ; WX 602 ; N uni2538 ; G 3600 -U 9529 ; WX 602 ; N uni2539 ; G 3601 -U 9530 ; WX 602 ; N uni253A ; G 3602 -U 9531 ; WX 602 ; N uni253B ; G 3603 -U 9532 ; WX 602 ; N SF050000 ; G 3604 -U 9533 ; WX 602 ; N uni253D ; G 3605 -U 9534 ; WX 602 ; N uni253E ; G 3606 -U 9535 ; WX 602 ; N uni253F ; G 3607 -U 9536 ; WX 602 ; N uni2540 ; G 3608 -U 9537 ; WX 602 ; N uni2541 ; G 3609 -U 9538 ; WX 602 ; N uni2542 ; G 3610 -U 9539 ; WX 602 ; N uni2543 ; G 3611 -U 9540 ; WX 602 ; N uni2544 ; G 3612 -U 9541 ; WX 602 ; N uni2545 ; G 3613 -U 9542 ; WX 602 ; N uni2546 ; G 3614 -U 9543 ; WX 602 ; N uni2547 ; G 3615 -U 9544 ; WX 602 ; N uni2548 ; G 3616 -U 9545 ; WX 602 ; N uni2549 ; G 3617 -U 9546 ; WX 602 ; N uni254A ; G 3618 -U 9547 ; WX 602 ; N uni254B ; G 3619 -U 9548 ; WX 602 ; N uni254C ; G 3620 -U 9549 ; WX 602 ; N uni254D ; G 3621 -U 9550 ; WX 602 ; N uni254E ; G 3622 -U 9551 ; WX 602 ; N uni254F ; G 3623 -U 9552 ; WX 602 ; N SF430000 ; G 3624 -U 9553 ; WX 602 ; N SF240000 ; G 3625 -U 9554 ; WX 602 ; N SF510000 ; G 3626 -U 9555 ; WX 602 ; N SF520000 ; G 3627 -U 9556 ; WX 602 ; N SF390000 ; G 3628 -U 9557 ; WX 602 ; N SF220000 ; G 3629 -U 9558 ; WX 602 ; N SF210000 ; G 3630 -U 9559 ; WX 602 ; N SF250000 ; G 3631 -U 9560 ; WX 602 ; N SF500000 ; G 3632 -U 9561 ; WX 602 ; N SF490000 ; G 3633 -U 9562 ; WX 602 ; N SF380000 ; G 3634 -U 9563 ; WX 602 ; N SF280000 ; G 3635 -U 9564 ; WX 602 ; N SF270000 ; G 3636 -U 9565 ; WX 602 ; N SF260000 ; G 3637 -U 9566 ; WX 602 ; N SF360000 ; G 3638 -U 9567 ; WX 602 ; N SF370000 ; G 3639 -U 9568 ; WX 602 ; N SF420000 ; G 3640 -U 9569 ; WX 602 ; N SF190000 ; G 3641 -U 9570 ; WX 602 ; N SF200000 ; G 3642 -U 9571 ; WX 602 ; N SF230000 ; G 3643 -U 9572 ; WX 602 ; N SF470000 ; G 3644 -U 9573 ; WX 602 ; N SF480000 ; G 3645 -U 9574 ; WX 602 ; N SF410000 ; G 3646 -U 9575 ; WX 602 ; N SF450000 ; G 3647 -U 9576 ; WX 602 ; N SF460000 ; G 3648 -U 9577 ; WX 602 ; N SF400000 ; G 3649 -U 9578 ; WX 602 ; N SF540000 ; G 3650 -U 9579 ; WX 602 ; N SF530000 ; G 3651 -U 9580 ; WX 602 ; N SF440000 ; G 3652 -U 9581 ; WX 602 ; N uni256D ; G 3653 -U 9582 ; WX 602 ; N uni256E ; G 3654 -U 9583 ; WX 602 ; N uni256F ; G 3655 -U 9584 ; WX 602 ; N uni2570 ; G 3656 -U 9585 ; WX 602 ; N uni2571 ; G 3657 -U 9586 ; WX 602 ; N uni2572 ; G 3658 -U 9587 ; WX 602 ; N uni2573 ; G 3659 -U 9588 ; WX 602 ; N uni2574 ; G 3660 -U 9589 ; WX 602 ; N uni2575 ; G 3661 -U 9590 ; WX 602 ; N uni2576 ; G 3662 -U 9591 ; WX 602 ; N uni2577 ; G 3663 -U 9592 ; WX 602 ; N uni2578 ; G 3664 -U 9593 ; WX 602 ; N uni2579 ; G 3665 -U 9594 ; WX 602 ; N uni257A ; G 3666 -U 9595 ; WX 602 ; N uni257B ; G 3667 -U 9596 ; WX 602 ; N uni257C ; G 3668 -U 9597 ; WX 602 ; N uni257D ; G 3669 -U 9598 ; WX 602 ; N uni257E ; G 3670 -U 9599 ; WX 602 ; N uni257F ; G 3671 -U 9600 ; WX 769 ; N upblock ; G 3672 -U 9601 ; WX 769 ; N uni2581 ; G 3673 -U 9602 ; WX 769 ; N uni2582 ; G 3674 -U 9603 ; WX 769 ; N uni2583 ; G 3675 -U 9604 ; WX 769 ; N dnblock ; G 3676 -U 9605 ; WX 769 ; N uni2585 ; G 3677 -U 9606 ; WX 769 ; N uni2586 ; G 3678 -U 9607 ; WX 769 ; N uni2587 ; G 3679 -U 9608 ; WX 769 ; N block ; G 3680 -U 9609 ; WX 769 ; N uni2589 ; G 3681 -U 9610 ; WX 769 ; N uni258A ; G 3682 -U 9611 ; WX 769 ; N uni258B ; G 3683 -U 9612 ; WX 769 ; N lfblock ; G 3684 -U 9613 ; WX 769 ; N uni258D ; G 3685 -U 9614 ; WX 769 ; N uni258E ; G 3686 -U 9615 ; WX 769 ; N uni258F ; G 3687 -U 9616 ; WX 769 ; N rtblock ; G 3688 -U 9617 ; WX 769 ; N ltshade ; G 3689 -U 9618 ; WX 769 ; N shade ; G 3690 -U 9619 ; WX 769 ; N dkshade ; G 3691 -U 9620 ; WX 769 ; N uni2594 ; G 3692 -U 9621 ; WX 769 ; N uni2595 ; G 3693 -U 9622 ; WX 769 ; N uni2596 ; G 3694 -U 9623 ; WX 769 ; N uni2597 ; G 3695 -U 9624 ; WX 769 ; N uni2598 ; G 3696 -U 9625 ; WX 769 ; N uni2599 ; G 3697 -U 9626 ; WX 769 ; N uni259A ; G 3698 -U 9627 ; WX 769 ; N uni259B ; G 3699 -U 9628 ; WX 769 ; N uni259C ; G 3700 -U 9629 ; WX 769 ; N uni259D ; G 3701 -U 9630 ; WX 769 ; N uni259E ; G 3702 -U 9631 ; WX 769 ; N uni259F ; G 3703 -U 9632 ; WX 945 ; N filledbox ; G 3704 -U 9633 ; WX 945 ; N H22073 ; G 3705 -U 9634 ; WX 945 ; N uni25A2 ; G 3706 -U 9635 ; WX 945 ; N uni25A3 ; G 3707 -U 9636 ; WX 945 ; N uni25A4 ; G 3708 -U 9637 ; WX 945 ; N uni25A5 ; G 3709 -U 9638 ; WX 945 ; N uni25A6 ; G 3710 -U 9639 ; WX 945 ; N uni25A7 ; G 3711 -U 9640 ; WX 945 ; N uni25A8 ; G 3712 -U 9641 ; WX 945 ; N uni25A9 ; G 3713 -U 9642 ; WX 678 ; N H18543 ; G 3714 -U 9643 ; WX 678 ; N H18551 ; G 3715 -U 9644 ; WX 945 ; N filledrect ; G 3716 -U 9645 ; WX 945 ; N uni25AD ; G 3717 -U 9646 ; WX 550 ; N uni25AE ; G 3718 -U 9647 ; WX 550 ; N uni25AF ; G 3719 -U 9648 ; WX 769 ; N uni25B0 ; G 3720 -U 9649 ; WX 769 ; N uni25B1 ; G 3721 -U 9650 ; WX 769 ; N triagup ; G 3722 -U 9651 ; WX 769 ; N uni25B3 ; G 3723 -U 9652 ; WX 502 ; N uni25B4 ; G 3724 -U 9653 ; WX 502 ; N uni25B5 ; G 3725 -U 9654 ; WX 769 ; N uni25B6 ; G 3726 -U 9655 ; WX 769 ; N uni25B7 ; G 3727 -U 9656 ; WX 502 ; N uni25B8 ; G 3728 -U 9657 ; WX 502 ; N uni25B9 ; G 3729 -U 9658 ; WX 769 ; N triagrt ; G 3730 -U 9659 ; WX 769 ; N uni25BB ; G 3731 -U 9660 ; WX 769 ; N triagdn ; G 3732 -U 9661 ; WX 769 ; N uni25BD ; G 3733 -U 9662 ; WX 502 ; N uni25BE ; G 3734 -U 9663 ; WX 502 ; N uni25BF ; G 3735 -U 9664 ; WX 769 ; N uni25C0 ; G 3736 -U 9665 ; WX 769 ; N uni25C1 ; G 3737 -U 9666 ; WX 502 ; N uni25C2 ; G 3738 -U 9667 ; WX 502 ; N uni25C3 ; G 3739 -U 9668 ; WX 769 ; N triaglf ; G 3740 -U 9669 ; WX 769 ; N uni25C5 ; G 3741 -U 9670 ; WX 769 ; N uni25C6 ; G 3742 -U 9671 ; WX 769 ; N uni25C7 ; G 3743 -U 9672 ; WX 769 ; N uni25C8 ; G 3744 -U 9673 ; WX 873 ; N uni25C9 ; G 3745 -U 9674 ; WX 494 ; N lozenge ; G 3746 -U 9675 ; WX 873 ; N circle ; G 3747 -U 9676 ; WX 873 ; N uni25CC ; G 3748 -U 9677 ; WX 873 ; N uni25CD ; G 3749 -U 9678 ; WX 873 ; N uni25CE ; G 3750 -U 9679 ; WX 873 ; N H18533 ; G 3751 -U 9680 ; WX 873 ; N uni25D0 ; G 3752 -U 9681 ; WX 873 ; N uni25D1 ; G 3753 -U 9682 ; WX 873 ; N uni25D2 ; G 3754 -U 9683 ; WX 873 ; N uni25D3 ; G 3755 -U 9684 ; WX 873 ; N uni25D4 ; G 3756 -U 9685 ; WX 873 ; N uni25D5 ; G 3757 -U 9686 ; WX 527 ; N uni25D6 ; G 3758 -U 9687 ; WX 527 ; N uni25D7 ; G 3759 -U 9688 ; WX 791 ; N invbullet ; G 3760 -U 9689 ; WX 970 ; N invcircle ; G 3761 -U 9690 ; WX 970 ; N uni25DA ; G 3762 -U 9691 ; WX 970 ; N uni25DB ; G 3763 -U 9692 ; WX 387 ; N uni25DC ; G 3764 -U 9693 ; WX 387 ; N uni25DD ; G 3765 -U 9694 ; WX 387 ; N uni25DE ; G 3766 -U 9695 ; WX 387 ; N uni25DF ; G 3767 -U 9696 ; WX 873 ; N uni25E0 ; G 3768 -U 9697 ; WX 873 ; N uni25E1 ; G 3769 -U 9698 ; WX 769 ; N uni25E2 ; G 3770 -U 9699 ; WX 769 ; N uni25E3 ; G 3771 -U 9700 ; WX 769 ; N uni25E4 ; G 3772 -U 9701 ; WX 769 ; N uni25E5 ; G 3773 -U 9702 ; WX 590 ; N openbullet ; G 3774 -U 9703 ; WX 945 ; N uni25E7 ; G 3775 -U 9704 ; WX 945 ; N uni25E8 ; G 3776 -U 9705 ; WX 945 ; N uni25E9 ; G 3777 -U 9706 ; WX 945 ; N uni25EA ; G 3778 -U 9707 ; WX 945 ; N uni25EB ; G 3779 -U 9708 ; WX 769 ; N uni25EC ; G 3780 -U 9709 ; WX 769 ; N uni25ED ; G 3781 -U 9710 ; WX 769 ; N uni25EE ; G 3782 -U 9711 ; WX 1119 ; N uni25EF ; G 3783 -U 9712 ; WX 945 ; N uni25F0 ; G 3784 -U 9713 ; WX 945 ; N uni25F1 ; G 3785 -U 9714 ; WX 945 ; N uni25F2 ; G 3786 -U 9715 ; WX 945 ; N uni25F3 ; G 3787 -U 9716 ; WX 873 ; N uni25F4 ; G 3788 -U 9717 ; WX 873 ; N uni25F5 ; G 3789 -U 9718 ; WX 873 ; N uni25F6 ; G 3790 -U 9719 ; WX 873 ; N uni25F7 ; G 3791 -U 9720 ; WX 769 ; N uni25F8 ; G 3792 -U 9721 ; WX 769 ; N uni25F9 ; G 3793 -U 9722 ; WX 769 ; N uni25FA ; G 3794 -U 9723 ; WX 830 ; N uni25FB ; G 3795 -U 9724 ; WX 830 ; N uni25FC ; G 3796 -U 9725 ; WX 732 ; N uni25FD ; G 3797 -U 9726 ; WX 732 ; N uni25FE ; G 3798 -U 9727 ; WX 769 ; N uni25FF ; G 3799 -U 9728 ; WX 896 ; N uni2600 ; G 3800 -U 9729 ; WX 1000 ; N uni2601 ; G 3801 -U 9730 ; WX 896 ; N uni2602 ; G 3802 -U 9731 ; WX 896 ; N uni2603 ; G 3803 -U 9732 ; WX 896 ; N uni2604 ; G 3804 -U 9733 ; WX 896 ; N uni2605 ; G 3805 -U 9734 ; WX 896 ; N uni2606 ; G 3806 -U 9735 ; WX 573 ; N uni2607 ; G 3807 -U 9736 ; WX 896 ; N uni2608 ; G 3808 -U 9737 ; WX 896 ; N uni2609 ; G 3809 -U 9738 ; WX 888 ; N uni260A ; G 3810 -U 9739 ; WX 888 ; N uni260B ; G 3811 -U 9740 ; WX 671 ; N uni260C ; G 3812 -U 9741 ; WX 1013 ; N uni260D ; G 3813 -U 9742 ; WX 1246 ; N uni260E ; G 3814 -U 9743 ; WX 1250 ; N uni260F ; G 3815 -U 9744 ; WX 896 ; N uni2610 ; G 3816 -U 9745 ; WX 896 ; N uni2611 ; G 3817 -U 9746 ; WX 896 ; N uni2612 ; G 3818 -U 9747 ; WX 532 ; N uni2613 ; G 3819 -U 9748 ; WX 896 ; N uni2614 ; G 3820 -U 9749 ; WX 896 ; N uni2615 ; G 3821 -U 9750 ; WX 896 ; N uni2616 ; G 3822 -U 9751 ; WX 896 ; N uni2617 ; G 3823 -U 9752 ; WX 896 ; N uni2618 ; G 3824 -U 9753 ; WX 896 ; N uni2619 ; G 3825 -U 9754 ; WX 896 ; N uni261A ; G 3826 -U 9755 ; WX 896 ; N uni261B ; G 3827 -U 9756 ; WX 896 ; N uni261C ; G 3828 -U 9757 ; WX 609 ; N uni261D ; G 3829 -U 9758 ; WX 896 ; N uni261E ; G 3830 -U 9759 ; WX 609 ; N uni261F ; G 3831 -U 9760 ; WX 896 ; N uni2620 ; G 3832 -U 9761 ; WX 896 ; N uni2621 ; G 3833 -U 9762 ; WX 896 ; N uni2622 ; G 3834 -U 9763 ; WX 896 ; N uni2623 ; G 3835 -U 9764 ; WX 669 ; N uni2624 ; G 3836 -U 9765 ; WX 746 ; N uni2625 ; G 3837 -U 9766 ; WX 649 ; N uni2626 ; G 3838 -U 9767 ; WX 784 ; N uni2627 ; G 3839 -U 9768 ; WX 545 ; N uni2628 ; G 3840 -U 9769 ; WX 896 ; N uni2629 ; G 3841 -U 9770 ; WX 896 ; N uni262A ; G 3842 -U 9771 ; WX 896 ; N uni262B ; G 3843 -U 9772 ; WX 710 ; N uni262C ; G 3844 -U 9773 ; WX 896 ; N uni262D ; G 3845 -U 9774 ; WX 896 ; N uni262E ; G 3846 -U 9775 ; WX 896 ; N uni262F ; G 3847 -U 9776 ; WX 896 ; N uni2630 ; G 3848 -U 9777 ; WX 896 ; N uni2631 ; G 3849 -U 9778 ; WX 896 ; N uni2632 ; G 3850 -U 9779 ; WX 896 ; N uni2633 ; G 3851 -U 9780 ; WX 896 ; N uni2634 ; G 3852 -U 9781 ; WX 896 ; N uni2635 ; G 3853 -U 9782 ; WX 896 ; N uni2636 ; G 3854 -U 9783 ; WX 896 ; N uni2637 ; G 3855 -U 9784 ; WX 896 ; N uni2638 ; G 3856 -U 9785 ; WX 1042 ; N uni2639 ; G 3857 -U 9786 ; WX 1042 ; N smileface ; G 3858 -U 9787 ; WX 1042 ; N invsmileface ; G 3859 -U 9788 ; WX 896 ; N sun ; G 3860 -U 9789 ; WX 896 ; N uni263D ; G 3861 -U 9790 ; WX 896 ; N uni263E ; G 3862 -U 9791 ; WX 614 ; N uni263F ; G 3863 -U 9792 ; WX 732 ; N female ; G 3864 -U 9793 ; WX 732 ; N uni2641 ; G 3865 -U 9794 ; WX 896 ; N male ; G 3866 -U 9795 ; WX 896 ; N uni2643 ; G 3867 -U 9796 ; WX 896 ; N uni2644 ; G 3868 -U 9797 ; WX 896 ; N uni2645 ; G 3869 -U 9798 ; WX 896 ; N uni2646 ; G 3870 -U 9799 ; WX 896 ; N uni2647 ; G 3871 -U 9800 ; WX 896 ; N uni2648 ; G 3872 -U 9801 ; WX 896 ; N uni2649 ; G 3873 -U 9802 ; WX 896 ; N uni264A ; G 3874 -U 9803 ; WX 896 ; N uni264B ; G 3875 -U 9804 ; WX 896 ; N uni264C ; G 3876 -U 9805 ; WX 896 ; N uni264D ; G 3877 -U 9806 ; WX 896 ; N uni264E ; G 3878 -U 9807 ; WX 896 ; N uni264F ; G 3879 -U 9808 ; WX 896 ; N uni2650 ; G 3880 -U 9809 ; WX 896 ; N uni2651 ; G 3881 -U 9810 ; WX 896 ; N uni2652 ; G 3882 -U 9811 ; WX 896 ; N uni2653 ; G 3883 -U 9812 ; WX 896 ; N uni2654 ; G 3884 -U 9813 ; WX 896 ; N uni2655 ; G 3885 -U 9814 ; WX 896 ; N uni2656 ; G 3886 -U 9815 ; WX 896 ; N uni2657 ; G 3887 -U 9816 ; WX 896 ; N uni2658 ; G 3888 -U 9817 ; WX 896 ; N uni2659 ; G 3889 -U 9818 ; WX 896 ; N uni265A ; G 3890 -U 9819 ; WX 896 ; N uni265B ; G 3891 -U 9820 ; WX 896 ; N uni265C ; G 3892 -U 9821 ; WX 896 ; N uni265D ; G 3893 -U 9822 ; WX 896 ; N uni265E ; G 3894 -U 9823 ; WX 896 ; N uni265F ; G 3895 -U 9824 ; WX 896 ; N spade ; G 3896 -U 9825 ; WX 896 ; N uni2661 ; G 3897 -U 9826 ; WX 896 ; N uni2662 ; G 3898 -U 9827 ; WX 896 ; N club ; G 3899 -U 9828 ; WX 896 ; N uni2664 ; G 3900 -U 9829 ; WX 896 ; N heart ; G 3901 -U 9830 ; WX 896 ; N diamond ; G 3902 -U 9831 ; WX 896 ; N uni2667 ; G 3903 -U 9832 ; WX 896 ; N uni2668 ; G 3904 -U 9833 ; WX 472 ; N uni2669 ; G 3905 -U 9834 ; WX 638 ; N musicalnote ; G 3906 -U 9835 ; WX 896 ; N musicalnotedbl ; G 3907 -U 9836 ; WX 896 ; N uni266C ; G 3908 -U 9837 ; WX 472 ; N uni266D ; G 3909 -U 9838 ; WX 357 ; N uni266E ; G 3910 -U 9839 ; WX 484 ; N uni266F ; G 3911 -U 9840 ; WX 748 ; N uni2670 ; G 3912 -U 9841 ; WX 766 ; N uni2671 ; G 3913 -U 9842 ; WX 896 ; N uni2672 ; G 3914 -U 9843 ; WX 896 ; N uni2673 ; G 3915 -U 9844 ; WX 896 ; N uni2674 ; G 3916 -U 9845 ; WX 896 ; N uni2675 ; G 3917 -U 9846 ; WX 896 ; N uni2676 ; G 3918 -U 9847 ; WX 896 ; N uni2677 ; G 3919 -U 9848 ; WX 896 ; N uni2678 ; G 3920 -U 9849 ; WX 896 ; N uni2679 ; G 3921 -U 9850 ; WX 896 ; N uni267A ; G 3922 -U 9851 ; WX 896 ; N uni267B ; G 3923 -U 9852 ; WX 896 ; N uni267C ; G 3924 -U 9853 ; WX 896 ; N uni267D ; G 3925 -U 9854 ; WX 896 ; N uni267E ; G 3926 -U 9855 ; WX 896 ; N uni267F ; G 3927 -U 9856 ; WX 869 ; N uni2680 ; G 3928 -U 9857 ; WX 869 ; N uni2681 ; G 3929 -U 9858 ; WX 869 ; N uni2682 ; G 3930 -U 9859 ; WX 869 ; N uni2683 ; G 3931 -U 9860 ; WX 869 ; N uni2684 ; G 3932 -U 9861 ; WX 869 ; N uni2685 ; G 3933 -U 9862 ; WX 896 ; N uni2686 ; G 3934 -U 9863 ; WX 896 ; N uni2687 ; G 3935 -U 9864 ; WX 896 ; N uni2688 ; G 3936 -U 9865 ; WX 896 ; N uni2689 ; G 3937 -U 9866 ; WX 896 ; N uni268A ; G 3938 -U 9867 ; WX 896 ; N uni268B ; G 3939 -U 9868 ; WX 896 ; N uni268C ; G 3940 -U 9869 ; WX 896 ; N uni268D ; G 3941 -U 9870 ; WX 896 ; N uni268E ; G 3942 -U 9871 ; WX 896 ; N uni268F ; G 3943 -U 9872 ; WX 896 ; N uni2690 ; G 3944 -U 9873 ; WX 896 ; N uni2691 ; G 3945 -U 9874 ; WX 896 ; N uni2692 ; G 3946 -U 9875 ; WX 896 ; N uni2693 ; G 3947 -U 9876 ; WX 896 ; N uni2694 ; G 3948 -U 9877 ; WX 541 ; N uni2695 ; G 3949 -U 9878 ; WX 896 ; N uni2696 ; G 3950 -U 9879 ; WX 896 ; N uni2697 ; G 3951 -U 9880 ; WX 896 ; N uni2698 ; G 3952 -U 9881 ; WX 896 ; N uni2699 ; G 3953 -U 9882 ; WX 896 ; N uni269A ; G 3954 -U 9883 ; WX 896 ; N uni269B ; G 3955 -U 9884 ; WX 896 ; N uni269C ; G 3956 -U 9886 ; WX 896 ; N uni269E ; G 3957 -U 9887 ; WX 896 ; N uni269F ; G 3958 -U 9888 ; WX 896 ; N uni26A0 ; G 3959 -U 9889 ; WX 702 ; N uni26A1 ; G 3960 -U 9890 ; WX 1004 ; N uni26A2 ; G 3961 -U 9891 ; WX 1089 ; N uni26A3 ; G 3962 -U 9892 ; WX 1175 ; N uni26A4 ; G 3963 -U 9893 ; WX 903 ; N uni26A5 ; G 3964 -U 9894 ; WX 838 ; N uni26A6 ; G 3965 -U 9895 ; WX 838 ; N uni26A7 ; G 3966 -U 9896 ; WX 838 ; N uni26A8 ; G 3967 -U 9897 ; WX 838 ; N uni26A9 ; G 3968 -U 9898 ; WX 838 ; N uni26AA ; G 3969 -U 9899 ; WX 838 ; N uni26AB ; G 3970 -U 9900 ; WX 838 ; N uni26AC ; G 3971 -U 9901 ; WX 838 ; N uni26AD ; G 3972 -U 9902 ; WX 838 ; N uni26AE ; G 3973 -U 9903 ; WX 838 ; N uni26AF ; G 3974 -U 9904 ; WX 844 ; N uni26B0 ; G 3975 -U 9905 ; WX 838 ; N uni26B1 ; G 3976 -U 9906 ; WX 732 ; N uni26B2 ; G 3977 -U 9907 ; WX 732 ; N uni26B3 ; G 3978 -U 9908 ; WX 732 ; N uni26B4 ; G 3979 -U 9909 ; WX 732 ; N uni26B5 ; G 3980 -U 9910 ; WX 850 ; N uni26B6 ; G 3981 -U 9911 ; WX 732 ; N uni26B7 ; G 3982 -U 9912 ; WX 732 ; N uni26B8 ; G 3983 -U 9920 ; WX 838 ; N uni26C0 ; G 3984 -U 9921 ; WX 838 ; N uni26C1 ; G 3985 -U 9922 ; WX 838 ; N uni26C2 ; G 3986 -U 9923 ; WX 838 ; N uni26C3 ; G 3987 -U 9954 ; WX 732 ; N uni26E2 ; G 3988 -U 9985 ; WX 838 ; N uni2701 ; G 3989 -U 9986 ; WX 838 ; N uni2702 ; G 3990 -U 9987 ; WX 838 ; N uni2703 ; G 3991 -U 9988 ; WX 838 ; N uni2704 ; G 3992 -U 9990 ; WX 838 ; N uni2706 ; G 3993 -U 9991 ; WX 838 ; N uni2707 ; G 3994 -U 9992 ; WX 838 ; N uni2708 ; G 3995 -U 9993 ; WX 838 ; N uni2709 ; G 3996 -U 9996 ; WX 838 ; N uni270C ; G 3997 -U 9997 ; WX 838 ; N uni270D ; G 3998 -U 9998 ; WX 838 ; N uni270E ; G 3999 -U 9999 ; WX 838 ; N uni270F ; G 4000 -U 10000 ; WX 838 ; N uni2710 ; G 4001 -U 10001 ; WX 838 ; N uni2711 ; G 4002 -U 10002 ; WX 838 ; N uni2712 ; G 4003 -U 10003 ; WX 838 ; N uni2713 ; G 4004 -U 10004 ; WX 838 ; N uni2714 ; G 4005 -U 10005 ; WX 838 ; N uni2715 ; G 4006 -U 10006 ; WX 838 ; N uni2716 ; G 4007 -U 10007 ; WX 838 ; N uni2717 ; G 4008 -U 10008 ; WX 838 ; N uni2718 ; G 4009 -U 10009 ; WX 838 ; N uni2719 ; G 4010 -U 10010 ; WX 838 ; N uni271A ; G 4011 -U 10011 ; WX 838 ; N uni271B ; G 4012 -U 10012 ; WX 838 ; N uni271C ; G 4013 -U 10013 ; WX 838 ; N uni271D ; G 4014 -U 10014 ; WX 838 ; N uni271E ; G 4015 -U 10015 ; WX 838 ; N uni271F ; G 4016 -U 10016 ; WX 838 ; N uni2720 ; G 4017 -U 10017 ; WX 838 ; N uni2721 ; G 4018 -U 10018 ; WX 838 ; N uni2722 ; G 4019 -U 10019 ; WX 838 ; N uni2723 ; G 4020 -U 10020 ; WX 838 ; N uni2724 ; G 4021 -U 10021 ; WX 838 ; N uni2725 ; G 4022 -U 10022 ; WX 838 ; N uni2726 ; G 4023 -U 10023 ; WX 838 ; N uni2727 ; G 4024 -U 10025 ; WX 838 ; N uni2729 ; G 4025 -U 10026 ; WX 838 ; N uni272A ; G 4026 -U 10027 ; WX 838 ; N uni272B ; G 4027 -U 10028 ; WX 838 ; N uni272C ; G 4028 -U 10029 ; WX 838 ; N uni272D ; G 4029 -U 10030 ; WX 838 ; N uni272E ; G 4030 -U 10031 ; WX 838 ; N uni272F ; G 4031 -U 10032 ; WX 838 ; N uni2730 ; G 4032 -U 10033 ; WX 838 ; N uni2731 ; G 4033 -U 10034 ; WX 838 ; N uni2732 ; G 4034 -U 10035 ; WX 838 ; N uni2733 ; G 4035 -U 10036 ; WX 838 ; N uni2734 ; G 4036 -U 10037 ; WX 838 ; N uni2735 ; G 4037 -U 10038 ; WX 838 ; N uni2736 ; G 4038 -U 10039 ; WX 838 ; N uni2737 ; G 4039 -U 10040 ; WX 838 ; N uni2738 ; G 4040 -U 10041 ; WX 838 ; N uni2739 ; G 4041 -U 10042 ; WX 838 ; N uni273A ; G 4042 -U 10043 ; WX 838 ; N uni273B ; G 4043 -U 10044 ; WX 838 ; N uni273C ; G 4044 -U 10045 ; WX 838 ; N uni273D ; G 4045 -U 10046 ; WX 838 ; N uni273E ; G 4046 -U 10047 ; WX 838 ; N uni273F ; G 4047 -U 10048 ; WX 838 ; N uni2740 ; G 4048 -U 10049 ; WX 838 ; N uni2741 ; G 4049 -U 10050 ; WX 838 ; N uni2742 ; G 4050 -U 10051 ; WX 838 ; N uni2743 ; G 4051 -U 10052 ; WX 838 ; N uni2744 ; G 4052 -U 10053 ; WX 838 ; N uni2745 ; G 4053 -U 10054 ; WX 838 ; N uni2746 ; G 4054 -U 10055 ; WX 838 ; N uni2747 ; G 4055 -U 10056 ; WX 838 ; N uni2748 ; G 4056 -U 10057 ; WX 838 ; N uni2749 ; G 4057 -U 10058 ; WX 838 ; N uni274A ; G 4058 -U 10059 ; WX 838 ; N uni274B ; G 4059 -U 10061 ; WX 896 ; N uni274D ; G 4060 -U 10063 ; WX 896 ; N uni274F ; G 4061 -U 10064 ; WX 896 ; N uni2750 ; G 4062 -U 10065 ; WX 896 ; N uni2751 ; G 4063 -U 10066 ; WX 896 ; N uni2752 ; G 4064 -U 10070 ; WX 896 ; N uni2756 ; G 4065 -U 10072 ; WX 838 ; N uni2758 ; G 4066 -U 10073 ; WX 838 ; N uni2759 ; G 4067 -U 10074 ; WX 838 ; N uni275A ; G 4068 -U 10075 ; WX 322 ; N uni275B ; G 4069 -U 10076 ; WX 322 ; N uni275C ; G 4070 -U 10077 ; WX 538 ; N uni275D ; G 4071 -U 10078 ; WX 538 ; N uni275E ; G 4072 -U 10081 ; WX 838 ; N uni2761 ; G 4073 -U 10082 ; WX 838 ; N uni2762 ; G 4074 -U 10083 ; WX 838 ; N uni2763 ; G 4075 -U 10084 ; WX 838 ; N uni2764 ; G 4076 -U 10085 ; WX 838 ; N uni2765 ; G 4077 -U 10086 ; WX 838 ; N uni2766 ; G 4078 -U 10087 ; WX 838 ; N uni2767 ; G 4079 -U 10088 ; WX 838 ; N uni2768 ; G 4080 -U 10089 ; WX 838 ; N uni2769 ; G 4081 -U 10090 ; WX 838 ; N uni276A ; G 4082 -U 10091 ; WX 838 ; N uni276B ; G 4083 -U 10092 ; WX 838 ; N uni276C ; G 4084 -U 10093 ; WX 838 ; N uni276D ; G 4085 -U 10094 ; WX 838 ; N uni276E ; G 4086 -U 10095 ; WX 838 ; N uni276F ; G 4087 -U 10096 ; WX 838 ; N uni2770 ; G 4088 -U 10097 ; WX 838 ; N uni2771 ; G 4089 -U 10098 ; WX 838 ; N uni2772 ; G 4090 -U 10099 ; WX 838 ; N uni2773 ; G 4091 -U 10100 ; WX 838 ; N uni2774 ; G 4092 -U 10101 ; WX 838 ; N uni2775 ; G 4093 -U 10102 ; WX 896 ; N uni2776 ; G 4094 -U 10103 ; WX 896 ; N uni2777 ; G 4095 -U 10104 ; WX 896 ; N uni2778 ; G 4096 -U 10105 ; WX 896 ; N uni2779 ; G 4097 -U 10106 ; WX 896 ; N uni277A ; G 4098 -U 10107 ; WX 896 ; N uni277B ; G 4099 -U 10108 ; WX 896 ; N uni277C ; G 4100 -U 10109 ; WX 896 ; N uni277D ; G 4101 -U 10110 ; WX 896 ; N uni277E ; G 4102 -U 10111 ; WX 896 ; N uni277F ; G 4103 -U 10112 ; WX 838 ; N uni2780 ; G 4104 -U 10113 ; WX 838 ; N uni2781 ; G 4105 -U 10114 ; WX 838 ; N uni2782 ; G 4106 -U 10115 ; WX 838 ; N uni2783 ; G 4107 -U 10116 ; WX 838 ; N uni2784 ; G 4108 -U 10117 ; WX 838 ; N uni2785 ; G 4109 -U 10118 ; WX 838 ; N uni2786 ; G 4110 -U 10119 ; WX 838 ; N uni2787 ; G 4111 -U 10120 ; WX 838 ; N uni2788 ; G 4112 -U 10121 ; WX 838 ; N uni2789 ; G 4113 -U 10122 ; WX 838 ; N uni278A ; G 4114 -U 10123 ; WX 838 ; N uni278B ; G 4115 -U 10124 ; WX 838 ; N uni278C ; G 4116 -U 10125 ; WX 838 ; N uni278D ; G 4117 -U 10126 ; WX 838 ; N uni278E ; G 4118 -U 10127 ; WX 838 ; N uni278F ; G 4119 -U 10128 ; WX 838 ; N uni2790 ; G 4120 -U 10129 ; WX 838 ; N uni2791 ; G 4121 -U 10130 ; WX 838 ; N uni2792 ; G 4122 -U 10131 ; WX 838 ; N uni2793 ; G 4123 -U 10132 ; WX 838 ; N uni2794 ; G 4124 -U 10136 ; WX 838 ; N uni2798 ; G 4125 -U 10137 ; WX 838 ; N uni2799 ; G 4126 -U 10138 ; WX 838 ; N uni279A ; G 4127 -U 10139 ; WX 838 ; N uni279B ; G 4128 -U 10140 ; WX 838 ; N uni279C ; G 4129 -U 10141 ; WX 838 ; N uni279D ; G 4130 -U 10142 ; WX 838 ; N uni279E ; G 4131 -U 10143 ; WX 838 ; N uni279F ; G 4132 -U 10144 ; WX 838 ; N uni27A0 ; G 4133 -U 10145 ; WX 838 ; N uni27A1 ; G 4134 -U 10146 ; WX 838 ; N uni27A2 ; G 4135 -U 10147 ; WX 838 ; N uni27A3 ; G 4136 -U 10148 ; WX 838 ; N uni27A4 ; G 4137 -U 10149 ; WX 838 ; N uni27A5 ; G 4138 -U 10150 ; WX 838 ; N uni27A6 ; G 4139 -U 10151 ; WX 838 ; N uni27A7 ; G 4140 -U 10152 ; WX 838 ; N uni27A8 ; G 4141 -U 10153 ; WX 838 ; N uni27A9 ; G 4142 -U 10154 ; WX 838 ; N uni27AA ; G 4143 -U 10155 ; WX 838 ; N uni27AB ; G 4144 -U 10156 ; WX 838 ; N uni27AC ; G 4145 -U 10157 ; WX 838 ; N uni27AD ; G 4146 -U 10158 ; WX 838 ; N uni27AE ; G 4147 -U 10159 ; WX 838 ; N uni27AF ; G 4148 -U 10161 ; WX 838 ; N uni27B1 ; G 4149 -U 10162 ; WX 838 ; N uni27B2 ; G 4150 -U 10163 ; WX 838 ; N uni27B3 ; G 4151 -U 10164 ; WX 838 ; N uni27B4 ; G 4152 -U 10165 ; WX 838 ; N uni27B5 ; G 4153 -U 10166 ; WX 838 ; N uni27B6 ; G 4154 -U 10167 ; WX 838 ; N uni27B7 ; G 4155 -U 10168 ; WX 838 ; N uni27B8 ; G 4156 -U 10169 ; WX 838 ; N uni27B9 ; G 4157 -U 10170 ; WX 838 ; N uni27BA ; G 4158 -U 10171 ; WX 838 ; N uni27BB ; G 4159 -U 10172 ; WX 838 ; N uni27BC ; G 4160 -U 10173 ; WX 838 ; N uni27BD ; G 4161 -U 10174 ; WX 838 ; N uni27BE ; G 4162 -U 10181 ; WX 390 ; N uni27C5 ; G 4163 -U 10182 ; WX 390 ; N uni27C6 ; G 4164 -U 10208 ; WX 494 ; N uni27E0 ; G 4165 -U 10214 ; WX 495 ; N uni27E6 ; G 4166 -U 10215 ; WX 495 ; N uni27E7 ; G 4167 -U 10216 ; WX 390 ; N uni27E8 ; G 4168 -U 10217 ; WX 390 ; N uni27E9 ; G 4169 -U 10218 ; WX 556 ; N uni27EA ; G 4170 -U 10219 ; WX 556 ; N uni27EB ; G 4171 -U 10224 ; WX 838 ; N uni27F0 ; G 4172 -U 10225 ; WX 838 ; N uni27F1 ; G 4173 -U 10226 ; WX 838 ; N uni27F2 ; G 4174 -U 10227 ; WX 838 ; N uni27F3 ; G 4175 -U 10228 ; WX 1157 ; N uni27F4 ; G 4176 -U 10229 ; WX 1434 ; N uni27F5 ; G 4177 -U 10230 ; WX 1434 ; N uni27F6 ; G 4178 -U 10231 ; WX 1434 ; N uni27F7 ; G 4179 -U 10232 ; WX 1434 ; N uni27F8 ; G 4180 -U 10233 ; WX 1434 ; N uni27F9 ; G 4181 -U 10234 ; WX 1434 ; N uni27FA ; G 4182 -U 10235 ; WX 1434 ; N uni27FB ; G 4183 -U 10236 ; WX 1434 ; N uni27FC ; G 4184 -U 10237 ; WX 1434 ; N uni27FD ; G 4185 -U 10238 ; WX 1434 ; N uni27FE ; G 4186 -U 10239 ; WX 1434 ; N uni27FF ; G 4187 -U 10240 ; WX 732 ; N uni2800 ; G 4188 -U 10241 ; WX 732 ; N uni2801 ; G 4189 -U 10242 ; WX 732 ; N uni2802 ; G 4190 -U 10243 ; WX 732 ; N uni2803 ; G 4191 -U 10244 ; WX 732 ; N uni2804 ; G 4192 -U 10245 ; WX 732 ; N uni2805 ; G 4193 -U 10246 ; WX 732 ; N uni2806 ; G 4194 -U 10247 ; WX 732 ; N uni2807 ; G 4195 -U 10248 ; WX 732 ; N uni2808 ; G 4196 -U 10249 ; WX 732 ; N uni2809 ; G 4197 -U 10250 ; WX 732 ; N uni280A ; G 4198 -U 10251 ; WX 732 ; N uni280B ; G 4199 -U 10252 ; WX 732 ; N uni280C ; G 4200 -U 10253 ; WX 732 ; N uni280D ; G 4201 -U 10254 ; WX 732 ; N uni280E ; G 4202 -U 10255 ; WX 732 ; N uni280F ; G 4203 -U 10256 ; WX 732 ; N uni2810 ; G 4204 -U 10257 ; WX 732 ; N uni2811 ; G 4205 -U 10258 ; WX 732 ; N uni2812 ; G 4206 -U 10259 ; WX 732 ; N uni2813 ; G 4207 -U 10260 ; WX 732 ; N uni2814 ; G 4208 -U 10261 ; WX 732 ; N uni2815 ; G 4209 -U 10262 ; WX 732 ; N uni2816 ; G 4210 -U 10263 ; WX 732 ; N uni2817 ; G 4211 -U 10264 ; WX 732 ; N uni2818 ; G 4212 -U 10265 ; WX 732 ; N uni2819 ; G 4213 -U 10266 ; WX 732 ; N uni281A ; G 4214 -U 10267 ; WX 732 ; N uni281B ; G 4215 -U 10268 ; WX 732 ; N uni281C ; G 4216 -U 10269 ; WX 732 ; N uni281D ; G 4217 -U 10270 ; WX 732 ; N uni281E ; G 4218 -U 10271 ; WX 732 ; N uni281F ; G 4219 -U 10272 ; WX 732 ; N uni2820 ; G 4220 -U 10273 ; WX 732 ; N uni2821 ; G 4221 -U 10274 ; WX 732 ; N uni2822 ; G 4222 -U 10275 ; WX 732 ; N uni2823 ; G 4223 -U 10276 ; WX 732 ; N uni2824 ; G 4224 -U 10277 ; WX 732 ; N uni2825 ; G 4225 -U 10278 ; WX 732 ; N uni2826 ; G 4226 -U 10279 ; WX 732 ; N uni2827 ; G 4227 -U 10280 ; WX 732 ; N uni2828 ; G 4228 -U 10281 ; WX 732 ; N uni2829 ; G 4229 -U 10282 ; WX 732 ; N uni282A ; G 4230 -U 10283 ; WX 732 ; N uni282B ; G 4231 -U 10284 ; WX 732 ; N uni282C ; G 4232 -U 10285 ; WX 732 ; N uni282D ; G 4233 -U 10286 ; WX 732 ; N uni282E ; G 4234 -U 10287 ; WX 732 ; N uni282F ; G 4235 -U 10288 ; WX 732 ; N uni2830 ; G 4236 -U 10289 ; WX 732 ; N uni2831 ; G 4237 -U 10290 ; WX 732 ; N uni2832 ; G 4238 -U 10291 ; WX 732 ; N uni2833 ; G 4239 -U 10292 ; WX 732 ; N uni2834 ; G 4240 -U 10293 ; WX 732 ; N uni2835 ; G 4241 -U 10294 ; WX 732 ; N uni2836 ; G 4242 -U 10295 ; WX 732 ; N uni2837 ; G 4243 -U 10296 ; WX 732 ; N uni2838 ; G 4244 -U 10297 ; WX 732 ; N uni2839 ; G 4245 -U 10298 ; WX 732 ; N uni283A ; G 4246 -U 10299 ; WX 732 ; N uni283B ; G 4247 -U 10300 ; WX 732 ; N uni283C ; G 4248 -U 10301 ; WX 732 ; N uni283D ; G 4249 -U 10302 ; WX 732 ; N uni283E ; G 4250 -U 10303 ; WX 732 ; N uni283F ; G 4251 -U 10304 ; WX 732 ; N uni2840 ; G 4252 -U 10305 ; WX 732 ; N uni2841 ; G 4253 -U 10306 ; WX 732 ; N uni2842 ; G 4254 -U 10307 ; WX 732 ; N uni2843 ; G 4255 -U 10308 ; WX 732 ; N uni2844 ; G 4256 -U 10309 ; WX 732 ; N uni2845 ; G 4257 -U 10310 ; WX 732 ; N uni2846 ; G 4258 -U 10311 ; WX 732 ; N uni2847 ; G 4259 -U 10312 ; WX 732 ; N uni2848 ; G 4260 -U 10313 ; WX 732 ; N uni2849 ; G 4261 -U 10314 ; WX 732 ; N uni284A ; G 4262 -U 10315 ; WX 732 ; N uni284B ; G 4263 -U 10316 ; WX 732 ; N uni284C ; G 4264 -U 10317 ; WX 732 ; N uni284D ; G 4265 -U 10318 ; WX 732 ; N uni284E ; G 4266 -U 10319 ; WX 732 ; N uni284F ; G 4267 -U 10320 ; WX 732 ; N uni2850 ; G 4268 -U 10321 ; WX 732 ; N uni2851 ; G 4269 -U 10322 ; WX 732 ; N uni2852 ; G 4270 -U 10323 ; WX 732 ; N uni2853 ; G 4271 -U 10324 ; WX 732 ; N uni2854 ; G 4272 -U 10325 ; WX 732 ; N uni2855 ; G 4273 -U 10326 ; WX 732 ; N uni2856 ; G 4274 -U 10327 ; WX 732 ; N uni2857 ; G 4275 -U 10328 ; WX 732 ; N uni2858 ; G 4276 -U 10329 ; WX 732 ; N uni2859 ; G 4277 -U 10330 ; WX 732 ; N uni285A ; G 4278 -U 10331 ; WX 732 ; N uni285B ; G 4279 -U 10332 ; WX 732 ; N uni285C ; G 4280 -U 10333 ; WX 732 ; N uni285D ; G 4281 -U 10334 ; WX 732 ; N uni285E ; G 4282 -U 10335 ; WX 732 ; N uni285F ; G 4283 -U 10336 ; WX 732 ; N uni2860 ; G 4284 -U 10337 ; WX 732 ; N uni2861 ; G 4285 -U 10338 ; WX 732 ; N uni2862 ; G 4286 -U 10339 ; WX 732 ; N uni2863 ; G 4287 -U 10340 ; WX 732 ; N uni2864 ; G 4288 -U 10341 ; WX 732 ; N uni2865 ; G 4289 -U 10342 ; WX 732 ; N uni2866 ; G 4290 -U 10343 ; WX 732 ; N uni2867 ; G 4291 -U 10344 ; WX 732 ; N uni2868 ; G 4292 -U 10345 ; WX 732 ; N uni2869 ; G 4293 -U 10346 ; WX 732 ; N uni286A ; G 4294 -U 10347 ; WX 732 ; N uni286B ; G 4295 -U 10348 ; WX 732 ; N uni286C ; G 4296 -U 10349 ; WX 732 ; N uni286D ; G 4297 -U 10350 ; WX 732 ; N uni286E ; G 4298 -U 10351 ; WX 732 ; N uni286F ; G 4299 -U 10352 ; WX 732 ; N uni2870 ; G 4300 -U 10353 ; WX 732 ; N uni2871 ; G 4301 -U 10354 ; WX 732 ; N uni2872 ; G 4302 -U 10355 ; WX 732 ; N uni2873 ; G 4303 -U 10356 ; WX 732 ; N uni2874 ; G 4304 -U 10357 ; WX 732 ; N uni2875 ; G 4305 -U 10358 ; WX 732 ; N uni2876 ; G 4306 -U 10359 ; WX 732 ; N uni2877 ; G 4307 -U 10360 ; WX 732 ; N uni2878 ; G 4308 -U 10361 ; WX 732 ; N uni2879 ; G 4309 -U 10362 ; WX 732 ; N uni287A ; G 4310 -U 10363 ; WX 732 ; N uni287B ; G 4311 -U 10364 ; WX 732 ; N uni287C ; G 4312 -U 10365 ; WX 732 ; N uni287D ; G 4313 -U 10366 ; WX 732 ; N uni287E ; G 4314 -U 10367 ; WX 732 ; N uni287F ; G 4315 -U 10368 ; WX 732 ; N uni2880 ; G 4316 -U 10369 ; WX 732 ; N uni2881 ; G 4317 -U 10370 ; WX 732 ; N uni2882 ; G 4318 -U 10371 ; WX 732 ; N uni2883 ; G 4319 -U 10372 ; WX 732 ; N uni2884 ; G 4320 -U 10373 ; WX 732 ; N uni2885 ; G 4321 -U 10374 ; WX 732 ; N uni2886 ; G 4322 -U 10375 ; WX 732 ; N uni2887 ; G 4323 -U 10376 ; WX 732 ; N uni2888 ; G 4324 -U 10377 ; WX 732 ; N uni2889 ; G 4325 -U 10378 ; WX 732 ; N uni288A ; G 4326 -U 10379 ; WX 732 ; N uni288B ; G 4327 -U 10380 ; WX 732 ; N uni288C ; G 4328 -U 10381 ; WX 732 ; N uni288D ; G 4329 -U 10382 ; WX 732 ; N uni288E ; G 4330 -U 10383 ; WX 732 ; N uni288F ; G 4331 -U 10384 ; WX 732 ; N uni2890 ; G 4332 -U 10385 ; WX 732 ; N uni2891 ; G 4333 -U 10386 ; WX 732 ; N uni2892 ; G 4334 -U 10387 ; WX 732 ; N uni2893 ; G 4335 -U 10388 ; WX 732 ; N uni2894 ; G 4336 -U 10389 ; WX 732 ; N uni2895 ; G 4337 -U 10390 ; WX 732 ; N uni2896 ; G 4338 -U 10391 ; WX 732 ; N uni2897 ; G 4339 -U 10392 ; WX 732 ; N uni2898 ; G 4340 -U 10393 ; WX 732 ; N uni2899 ; G 4341 -U 10394 ; WX 732 ; N uni289A ; G 4342 -U 10395 ; WX 732 ; N uni289B ; G 4343 -U 10396 ; WX 732 ; N uni289C ; G 4344 -U 10397 ; WX 732 ; N uni289D ; G 4345 -U 10398 ; WX 732 ; N uni289E ; G 4346 -U 10399 ; WX 732 ; N uni289F ; G 4347 -U 10400 ; WX 732 ; N uni28A0 ; G 4348 -U 10401 ; WX 732 ; N uni28A1 ; G 4349 -U 10402 ; WX 732 ; N uni28A2 ; G 4350 -U 10403 ; WX 732 ; N uni28A3 ; G 4351 -U 10404 ; WX 732 ; N uni28A4 ; G 4352 -U 10405 ; WX 732 ; N uni28A5 ; G 4353 -U 10406 ; WX 732 ; N uni28A6 ; G 4354 -U 10407 ; WX 732 ; N uni28A7 ; G 4355 -U 10408 ; WX 732 ; N uni28A8 ; G 4356 -U 10409 ; WX 732 ; N uni28A9 ; G 4357 -U 10410 ; WX 732 ; N uni28AA ; G 4358 -U 10411 ; WX 732 ; N uni28AB ; G 4359 -U 10412 ; WX 732 ; N uni28AC ; G 4360 -U 10413 ; WX 732 ; N uni28AD ; G 4361 -U 10414 ; WX 732 ; N uni28AE ; G 4362 -U 10415 ; WX 732 ; N uni28AF ; G 4363 -U 10416 ; WX 732 ; N uni28B0 ; G 4364 -U 10417 ; WX 732 ; N uni28B1 ; G 4365 -U 10418 ; WX 732 ; N uni28B2 ; G 4366 -U 10419 ; WX 732 ; N uni28B3 ; G 4367 -U 10420 ; WX 732 ; N uni28B4 ; G 4368 -U 10421 ; WX 732 ; N uni28B5 ; G 4369 -U 10422 ; WX 732 ; N uni28B6 ; G 4370 -U 10423 ; WX 732 ; N uni28B7 ; G 4371 -U 10424 ; WX 732 ; N uni28B8 ; G 4372 -U 10425 ; WX 732 ; N uni28B9 ; G 4373 -U 10426 ; WX 732 ; N uni28BA ; G 4374 -U 10427 ; WX 732 ; N uni28BB ; G 4375 -U 10428 ; WX 732 ; N uni28BC ; G 4376 -U 10429 ; WX 732 ; N uni28BD ; G 4377 -U 10430 ; WX 732 ; N uni28BE ; G 4378 -U 10431 ; WX 732 ; N uni28BF ; G 4379 -U 10432 ; WX 732 ; N uni28C0 ; G 4380 -U 10433 ; WX 732 ; N uni28C1 ; G 4381 -U 10434 ; WX 732 ; N uni28C2 ; G 4382 -U 10435 ; WX 732 ; N uni28C3 ; G 4383 -U 10436 ; WX 732 ; N uni28C4 ; G 4384 -U 10437 ; WX 732 ; N uni28C5 ; G 4385 -U 10438 ; WX 732 ; N uni28C6 ; G 4386 -U 10439 ; WX 732 ; N uni28C7 ; G 4387 -U 10440 ; WX 732 ; N uni28C8 ; G 4388 -U 10441 ; WX 732 ; N uni28C9 ; G 4389 -U 10442 ; WX 732 ; N uni28CA ; G 4390 -U 10443 ; WX 732 ; N uni28CB ; G 4391 -U 10444 ; WX 732 ; N uni28CC ; G 4392 -U 10445 ; WX 732 ; N uni28CD ; G 4393 -U 10446 ; WX 732 ; N uni28CE ; G 4394 -U 10447 ; WX 732 ; N uni28CF ; G 4395 -U 10448 ; WX 732 ; N uni28D0 ; G 4396 -U 10449 ; WX 732 ; N uni28D1 ; G 4397 -U 10450 ; WX 732 ; N uni28D2 ; G 4398 -U 10451 ; WX 732 ; N uni28D3 ; G 4399 -U 10452 ; WX 732 ; N uni28D4 ; G 4400 -U 10453 ; WX 732 ; N uni28D5 ; G 4401 -U 10454 ; WX 732 ; N uni28D6 ; G 4402 -U 10455 ; WX 732 ; N uni28D7 ; G 4403 -U 10456 ; WX 732 ; N uni28D8 ; G 4404 -U 10457 ; WX 732 ; N uni28D9 ; G 4405 -U 10458 ; WX 732 ; N uni28DA ; G 4406 -U 10459 ; WX 732 ; N uni28DB ; G 4407 -U 10460 ; WX 732 ; N uni28DC ; G 4408 -U 10461 ; WX 732 ; N uni28DD ; G 4409 -U 10462 ; WX 732 ; N uni28DE ; G 4410 -U 10463 ; WX 732 ; N uni28DF ; G 4411 -U 10464 ; WX 732 ; N uni28E0 ; G 4412 -U 10465 ; WX 732 ; N uni28E1 ; G 4413 -U 10466 ; WX 732 ; N uni28E2 ; G 4414 -U 10467 ; WX 732 ; N uni28E3 ; G 4415 -U 10468 ; WX 732 ; N uni28E4 ; G 4416 -U 10469 ; WX 732 ; N uni28E5 ; G 4417 -U 10470 ; WX 732 ; N uni28E6 ; G 4418 -U 10471 ; WX 732 ; N uni28E7 ; G 4419 -U 10472 ; WX 732 ; N uni28E8 ; G 4420 -U 10473 ; WX 732 ; N uni28E9 ; G 4421 -U 10474 ; WX 732 ; N uni28EA ; G 4422 -U 10475 ; WX 732 ; N uni28EB ; G 4423 -U 10476 ; WX 732 ; N uni28EC ; G 4424 -U 10477 ; WX 732 ; N uni28ED ; G 4425 -U 10478 ; WX 732 ; N uni28EE ; G 4426 -U 10479 ; WX 732 ; N uni28EF ; G 4427 -U 10480 ; WX 732 ; N uni28F0 ; G 4428 -U 10481 ; WX 732 ; N uni28F1 ; G 4429 -U 10482 ; WX 732 ; N uni28F2 ; G 4430 -U 10483 ; WX 732 ; N uni28F3 ; G 4431 -U 10484 ; WX 732 ; N uni28F4 ; G 4432 -U 10485 ; WX 732 ; N uni28F5 ; G 4433 -U 10486 ; WX 732 ; N uni28F6 ; G 4434 -U 10487 ; WX 732 ; N uni28F7 ; G 4435 -U 10488 ; WX 732 ; N uni28F8 ; G 4436 -U 10489 ; WX 732 ; N uni28F9 ; G 4437 -U 10490 ; WX 732 ; N uni28FA ; G 4438 -U 10491 ; WX 732 ; N uni28FB ; G 4439 -U 10492 ; WX 732 ; N uni28FC ; G 4440 -U 10493 ; WX 732 ; N uni28FD ; G 4441 -U 10494 ; WX 732 ; N uni28FE ; G 4442 -U 10495 ; WX 732 ; N uni28FF ; G 4443 -U 10502 ; WX 838 ; N uni2906 ; G 4444 -U 10503 ; WX 838 ; N uni2907 ; G 4445 -U 10506 ; WX 838 ; N uni290A ; G 4446 -U 10507 ; WX 838 ; N uni290B ; G 4447 -U 10560 ; WX 683 ; N uni2940 ; G 4448 -U 10561 ; WX 683 ; N uni2941 ; G 4449 -U 10627 ; WX 734 ; N uni2983 ; G 4450 -U 10628 ; WX 734 ; N uni2984 ; G 4451 -U 10702 ; WX 838 ; N uni29CE ; G 4452 -U 10703 ; WX 1000 ; N uni29CF ; G 4453 -U 10704 ; WX 1000 ; N uni29D0 ; G 4454 -U 10705 ; WX 1000 ; N uni29D1 ; G 4455 -U 10706 ; WX 1000 ; N uni29D2 ; G 4456 -U 10707 ; WX 1000 ; N uni29D3 ; G 4457 -U 10708 ; WX 1000 ; N uni29D4 ; G 4458 -U 10709 ; WX 1000 ; N uni29D5 ; G 4459 -U 10731 ; WX 494 ; N uni29EB ; G 4460 -U 10746 ; WX 838 ; N uni29FA ; G 4461 -U 10747 ; WX 838 ; N uni29FB ; G 4462 -U 10752 ; WX 1000 ; N uni2A00 ; G 4463 -U 10753 ; WX 1000 ; N uni2A01 ; G 4464 -U 10754 ; WX 1000 ; N uni2A02 ; G 4465 -U 10764 ; WX 1325 ; N uni2A0C ; G 4466 -U 10765 ; WX 521 ; N uni2A0D ; G 4467 -U 10766 ; WX 521 ; N uni2A0E ; G 4468 -U 10767 ; WX 521 ; N uni2A0F ; G 4469 -U 10768 ; WX 521 ; N uni2A10 ; G 4470 -U 10769 ; WX 521 ; N uni2A11 ; G 4471 -U 10770 ; WX 521 ; N uni2A12 ; G 4472 -U 10771 ; WX 521 ; N uni2A13 ; G 4473 -U 10772 ; WX 521 ; N uni2A14 ; G 4474 -U 10773 ; WX 521 ; N uni2A15 ; G 4475 -U 10774 ; WX 521 ; N uni2A16 ; G 4476 -U 10775 ; WX 521 ; N uni2A17 ; G 4477 -U 10776 ; WX 521 ; N uni2A18 ; G 4478 -U 10777 ; WX 521 ; N uni2A19 ; G 4479 -U 10778 ; WX 521 ; N uni2A1A ; G 4480 -U 10779 ; WX 521 ; N uni2A1B ; G 4481 -U 10780 ; WX 521 ; N uni2A1C ; G 4482 -U 10799 ; WX 838 ; N uni2A2F ; G 4483 -U 10858 ; WX 838 ; N uni2A6A ; G 4484 -U 10859 ; WX 838 ; N uni2A6B ; G 4485 -U 10877 ; WX 838 ; N uni2A7D ; G 4486 -U 10878 ; WX 838 ; N uni2A7E ; G 4487 -U 10879 ; WX 838 ; N uni2A7F ; G 4488 -U 10880 ; WX 838 ; N uni2A80 ; G 4489 -U 10881 ; WX 838 ; N uni2A81 ; G 4490 -U 10882 ; WX 838 ; N uni2A82 ; G 4491 -U 10883 ; WX 838 ; N uni2A83 ; G 4492 -U 10884 ; WX 838 ; N uni2A84 ; G 4493 -U 10885 ; WX 838 ; N uni2A85 ; G 4494 -U 10886 ; WX 838 ; N uni2A86 ; G 4495 -U 10887 ; WX 838 ; N uni2A87 ; G 4496 -U 10888 ; WX 838 ; N uni2A88 ; G 4497 -U 10889 ; WX 838 ; N uni2A89 ; G 4498 -U 10890 ; WX 838 ; N uni2A8A ; G 4499 -U 10891 ; WX 838 ; N uni2A8B ; G 4500 -U 10892 ; WX 838 ; N uni2A8C ; G 4501 -U 10893 ; WX 838 ; N uni2A8D ; G 4502 -U 10894 ; WX 838 ; N uni2A8E ; G 4503 -U 10895 ; WX 838 ; N uni2A8F ; G 4504 -U 10896 ; WX 838 ; N uni2A90 ; G 4505 -U 10897 ; WX 838 ; N uni2A91 ; G 4506 -U 10898 ; WX 838 ; N uni2A92 ; G 4507 -U 10899 ; WX 838 ; N uni2A93 ; G 4508 -U 10900 ; WX 838 ; N uni2A94 ; G 4509 -U 10901 ; WX 838 ; N uni2A95 ; G 4510 -U 10902 ; WX 838 ; N uni2A96 ; G 4511 -U 10903 ; WX 838 ; N uni2A97 ; G 4512 -U 10904 ; WX 838 ; N uni2A98 ; G 4513 -U 10905 ; WX 838 ; N uni2A99 ; G 4514 -U 10906 ; WX 838 ; N uni2A9A ; G 4515 -U 10907 ; WX 838 ; N uni2A9B ; G 4516 -U 10908 ; WX 838 ; N uni2A9C ; G 4517 -U 10909 ; WX 838 ; N uni2A9D ; G 4518 -U 10910 ; WX 838 ; N uni2A9E ; G 4519 -U 10911 ; WX 838 ; N uni2A9F ; G 4520 -U 10912 ; WX 838 ; N uni2AA0 ; G 4521 -U 10926 ; WX 838 ; N uni2AAE ; G 4522 -U 10927 ; WX 838 ; N uni2AAF ; G 4523 -U 10928 ; WX 838 ; N uni2AB0 ; G 4524 -U 10929 ; WX 838 ; N uni2AB1 ; G 4525 -U 10930 ; WX 838 ; N uni2AB2 ; G 4526 -U 10931 ; WX 838 ; N uni2AB3 ; G 4527 -U 10932 ; WX 838 ; N uni2AB4 ; G 4528 -U 10933 ; WX 838 ; N uni2AB5 ; G 4529 -U 10934 ; WX 838 ; N uni2AB6 ; G 4530 -U 10935 ; WX 838 ; N uni2AB7 ; G 4531 -U 10936 ; WX 838 ; N uni2AB8 ; G 4532 -U 10937 ; WX 838 ; N uni2AB9 ; G 4533 -U 10938 ; WX 838 ; N uni2ABA ; G 4534 -U 11001 ; WX 838 ; N uni2AF9 ; G 4535 -U 11002 ; WX 838 ; N uni2AFA ; G 4536 -U 11008 ; WX 838 ; N uni2B00 ; G 4537 -U 11009 ; WX 838 ; N uni2B01 ; G 4538 -U 11010 ; WX 838 ; N uni2B02 ; G 4539 -U 11011 ; WX 838 ; N uni2B03 ; G 4540 -U 11012 ; WX 838 ; N uni2B04 ; G 4541 -U 11013 ; WX 838 ; N uni2B05 ; G 4542 -U 11014 ; WX 838 ; N uni2B06 ; G 4543 -U 11015 ; WX 838 ; N uni2B07 ; G 4544 -U 11016 ; WX 838 ; N uni2B08 ; G 4545 -U 11017 ; WX 838 ; N uni2B09 ; G 4546 -U 11018 ; WX 838 ; N uni2B0A ; G 4547 -U 11019 ; WX 838 ; N uni2B0B ; G 4548 -U 11020 ; WX 838 ; N uni2B0C ; G 4549 -U 11021 ; WX 838 ; N uni2B0D ; G 4550 -U 11022 ; WX 836 ; N uni2B0E ; G 4551 -U 11023 ; WX 836 ; N uni2B0F ; G 4552 -U 11024 ; WX 836 ; N uni2B10 ; G 4553 -U 11025 ; WX 836 ; N uni2B11 ; G 4554 -U 11026 ; WX 945 ; N uni2B12 ; G 4555 -U 11027 ; WX 945 ; N uni2B13 ; G 4556 -U 11028 ; WX 945 ; N uni2B14 ; G 4557 -U 11029 ; WX 945 ; N uni2B15 ; G 4558 -U 11030 ; WX 769 ; N uni2B16 ; G 4559 -U 11031 ; WX 769 ; N uni2B17 ; G 4560 -U 11032 ; WX 769 ; N uni2B18 ; G 4561 -U 11033 ; WX 769 ; N uni2B19 ; G 4562 -U 11034 ; WX 945 ; N uni2B1A ; G 4563 -U 11039 ; WX 869 ; N uni2B1F ; G 4564 -U 11040 ; WX 869 ; N uni2B20 ; G 4565 -U 11041 ; WX 873 ; N uni2B21 ; G 4566 -U 11042 ; WX 873 ; N uni2B22 ; G 4567 -U 11043 ; WX 873 ; N uni2B23 ; G 4568 -U 11044 ; WX 1119 ; N uni2B24 ; G 4569 -U 11091 ; WX 869 ; N uni2B53 ; G 4570 -U 11092 ; WX 869 ; N uni2B54 ; G 4571 -U 11360 ; WX 557 ; N uni2C60 ; G 4572 -U 11361 ; WX 278 ; N uni2C61 ; G 4573 -U 11362 ; WX 557 ; N uni2C62 ; G 4574 -U 11363 ; WX 603 ; N uni2C63 ; G 4575 -U 11364 ; WX 695 ; N uni2C64 ; G 4576 -U 11365 ; WX 613 ; N uni2C65 ; G 4577 -U 11366 ; WX 392 ; N uni2C66 ; G 4578 -U 11367 ; WX 752 ; N uni2C67 ; G 4579 -U 11368 ; WX 634 ; N uni2C68 ; G 4580 -U 11369 ; WX 656 ; N uni2C69 ; G 4581 -U 11370 ; WX 579 ; N uni2C6A ; G 4582 -U 11371 ; WX 685 ; N uni2C6B ; G 4583 -U 11372 ; WX 525 ; N uni2C6C ; G 4584 -U 11373 ; WX 781 ; N uni2C6D ; G 4585 -U 11374 ; WX 863 ; N uni2C6E ; G 4586 -U 11375 ; WX 684 ; N uni2C6F ; G 4587 -U 11376 ; WX 781 ; N uni2C70 ; G 4588 -U 11377 ; WX 734 ; N uni2C71 ; G 4589 -U 11378 ; WX 1128 ; N uni2C72 ; G 4590 -U 11379 ; WX 961 ; N uni2C73 ; G 4591 -U 11380 ; WX 592 ; N uni2C74 ; G 4592 -U 11381 ; WX 654 ; N uni2C75 ; G 4593 -U 11382 ; WX 568 ; N uni2C76 ; G 4594 -U 11383 ; WX 660 ; N uni2C77 ; G 4595 -U 11385 ; WX 414 ; N uni2C79 ; G 4596 -U 11386 ; WX 612 ; N uni2C7A ; G 4597 -U 11387 ; WX 491 ; N uni2C7B ; G 4598 -U 11388 ; WX 175 ; N uni2C7C ; G 4599 -U 11389 ; WX 431 ; N uni2C7D ; G 4600 -U 11390 ; WX 635 ; N uni2C7E ; G 4601 -U 11391 ; WX 685 ; N uni2C7F ; G 4602 -U 11520 ; WX 591 ; N uni2D00 ; G 4603 -U 11521 ; WX 595 ; N uni2D01 ; G 4604 -U 11522 ; WX 564 ; N uni2D02 ; G 4605 -U 11523 ; WX 602 ; N uni2D03 ; G 4606 -U 11524 ; WX 587 ; N uni2D04 ; G 4607 -U 11525 ; WX 911 ; N uni2D05 ; G 4608 -U 11526 ; WX 626 ; N uni2D06 ; G 4609 -U 11527 ; WX 952 ; N uni2D07 ; G 4610 -U 11528 ; WX 595 ; N uni2D08 ; G 4611 -U 11529 ; WX 607 ; N uni2D09 ; G 4612 -U 11530 ; WX 954 ; N uni2D0A ; G 4613 -U 11531 ; WX 620 ; N uni2D0B ; G 4614 -U 11532 ; WX 595 ; N uni2D0C ; G 4615 -U 11533 ; WX 926 ; N uni2D0D ; G 4616 -U 11534 ; WX 595 ; N uni2D0E ; G 4617 -U 11535 ; WX 806 ; N uni2D0F ; G 4618 -U 11536 ; WX 931 ; N uni2D10 ; G 4619 -U 11537 ; WX 584 ; N uni2D11 ; G 4620 -U 11538 ; WX 592 ; N uni2D12 ; G 4621 -U 11539 ; WX 923 ; N uni2D13 ; G 4622 -U 11540 ; WX 953 ; N uni2D14 ; G 4623 -U 11541 ; WX 828 ; N uni2D15 ; G 4624 -U 11542 ; WX 596 ; N uni2D16 ; G 4625 -U 11543 ; WX 595 ; N uni2D17 ; G 4626 -U 11544 ; WX 590 ; N uni2D18 ; G 4627 -U 11545 ; WX 592 ; N uni2D19 ; G 4628 -U 11546 ; WX 592 ; N uni2D1A ; G 4629 -U 11547 ; WX 621 ; N uni2D1B ; G 4630 -U 11548 ; WX 920 ; N uni2D1C ; G 4631 -U 11549 ; WX 589 ; N uni2D1D ; G 4632 -U 11550 ; WX 586 ; N uni2D1E ; G 4633 -U 11551 ; WX 581 ; N uni2D1F ; G 4634 -U 11552 ; WX 914 ; N uni2D20 ; G 4635 -U 11553 ; WX 596 ; N uni2D21 ; G 4636 -U 11554 ; WX 595 ; N uni2D22 ; G 4637 -U 11555 ; WX 592 ; N uni2D23 ; G 4638 -U 11556 ; WX 642 ; N uni2D24 ; G 4639 -U 11557 ; WX 901 ; N uni2D25 ; G 4640 -U 11568 ; WX 646 ; N uni2D30 ; G 4641 -U 11569 ; WX 888 ; N uni2D31 ; G 4642 -U 11570 ; WX 888 ; N uni2D32 ; G 4643 -U 11571 ; WX 682 ; N uni2D33 ; G 4644 -U 11572 ; WX 684 ; N uni2D34 ; G 4645 -U 11573 ; WX 635 ; N uni2D35 ; G 4646 -U 11574 ; WX 562 ; N uni2D36 ; G 4647 -U 11575 ; WX 684 ; N uni2D37 ; G 4648 -U 11576 ; WX 684 ; N uni2D38 ; G 4649 -U 11577 ; WX 632 ; N uni2D39 ; G 4650 -U 11578 ; WX 632 ; N uni2D3A ; G 4651 -U 11579 ; WX 683 ; N uni2D3B ; G 4652 -U 11580 ; WX 875 ; N uni2D3C ; G 4653 -U 11581 ; WX 685 ; N uni2D3D ; G 4654 -U 11582 ; WX 491 ; N uni2D3E ; G 4655 -U 11583 ; WX 685 ; N uni2D3F ; G 4656 -U 11584 ; WX 888 ; N uni2D40 ; G 4657 -U 11585 ; WX 888 ; N uni2D41 ; G 4658 -U 11586 ; WX 300 ; N uni2D42 ; G 4659 -U 11587 ; WX 627 ; N uni2D43 ; G 4660 -U 11588 ; WX 752 ; N uni2D44 ; G 4661 -U 11589 ; WX 656 ; N uni2D45 ; G 4662 -U 11590 ; WX 527 ; N uni2D46 ; G 4663 -U 11591 ; WX 685 ; N uni2D47 ; G 4664 -U 11592 ; WX 645 ; N uni2D48 ; G 4665 -U 11593 ; WX 632 ; N uni2D49 ; G 4666 -U 11594 ; WX 502 ; N uni2D4A ; G 4667 -U 11595 ; WX 953 ; N uni2D4B ; G 4668 -U 11596 ; WX 778 ; N uni2D4C ; G 4669 -U 11597 ; WX 748 ; N uni2D4D ; G 4670 -U 11598 ; WX 621 ; N uni2D4E ; G 4671 -U 11599 ; WX 295 ; N uni2D4F ; G 4672 -U 11600 ; WX 778 ; N uni2D50 ; G 4673 -U 11601 ; WX 295 ; N uni2D51 ; G 4674 -U 11602 ; WX 752 ; N uni2D52 ; G 4675 -U 11603 ; WX 633 ; N uni2D53 ; G 4676 -U 11604 ; WX 888 ; N uni2D54 ; G 4677 -U 11605 ; WX 888 ; N uni2D55 ; G 4678 -U 11606 ; WX 752 ; N uni2D56 ; G 4679 -U 11607 ; WX 320 ; N uni2D57 ; G 4680 -U 11608 ; WX 749 ; N uni2D58 ; G 4681 -U 11609 ; WX 888 ; N uni2D59 ; G 4682 -U 11610 ; WX 888 ; N uni2D5A ; G 4683 -U 11611 ; WX 698 ; N uni2D5B ; G 4684 -U 11612 ; WX 768 ; N uni2D5C ; G 4685 -U 11613 ; WX 685 ; N uni2D5D ; G 4686 -U 11614 ; WX 698 ; N uni2D5E ; G 4687 -U 11615 ; WX 622 ; N uni2D5F ; G 4688 -U 11616 ; WX 684 ; N uni2D60 ; G 4689 -U 11617 ; WX 752 ; N uni2D61 ; G 4690 -U 11618 ; WX 632 ; N uni2D62 ; G 4691 -U 11619 ; WX 788 ; N uni2D63 ; G 4692 -U 11620 ; WX 567 ; N uni2D64 ; G 4693 -U 11621 ; WX 788 ; N uni2D65 ; G 4694 -U 11631 ; WX 515 ; N uni2D6F ; G 4695 -U 11800 ; WX 531 ; N uni2E18 ; G 4696 -U 11807 ; WX 838 ; N uni2E1F ; G 4697 -U 11810 ; WX 390 ; N uni2E22 ; G 4698 -U 11811 ; WX 390 ; N uni2E23 ; G 4699 -U 11812 ; WX 390 ; N uni2E24 ; G 4700 -U 11813 ; WX 390 ; N uni2E25 ; G 4701 -U 11822 ; WX 531 ; N uni2E2E ; G 4702 -U 19904 ; WX 896 ; N uni4DC0 ; G 4703 -U 19905 ; WX 896 ; N uni4DC1 ; G 4704 -U 19906 ; WX 896 ; N uni4DC2 ; G 4705 -U 19907 ; WX 896 ; N uni4DC3 ; G 4706 -U 19908 ; WX 896 ; N uni4DC4 ; G 4707 -U 19909 ; WX 896 ; N uni4DC5 ; G 4708 -U 19910 ; WX 896 ; N uni4DC6 ; G 4709 -U 19911 ; WX 896 ; N uni4DC7 ; G 4710 -U 19912 ; WX 896 ; N uni4DC8 ; G 4711 -U 19913 ; WX 896 ; N uni4DC9 ; G 4712 -U 19914 ; WX 896 ; N uni4DCA ; G 4713 -U 19915 ; WX 896 ; N uni4DCB ; G 4714 -U 19916 ; WX 896 ; N uni4DCC ; G 4715 -U 19917 ; WX 896 ; N uni4DCD ; G 4716 -U 19918 ; WX 896 ; N uni4DCE ; G 4717 -U 19919 ; WX 896 ; N uni4DCF ; G 4718 -U 19920 ; WX 896 ; N uni4DD0 ; G 4719 -U 19921 ; WX 896 ; N uni4DD1 ; G 4720 -U 19922 ; WX 896 ; N uni4DD2 ; G 4721 -U 19923 ; WX 896 ; N uni4DD3 ; G 4722 -U 19924 ; WX 896 ; N uni4DD4 ; G 4723 -U 19925 ; WX 896 ; N uni4DD5 ; G 4724 -U 19926 ; WX 896 ; N uni4DD6 ; G 4725 -U 19927 ; WX 896 ; N uni4DD7 ; G 4726 -U 19928 ; WX 896 ; N uni4DD8 ; G 4727 -U 19929 ; WX 896 ; N uni4DD9 ; G 4728 -U 19930 ; WX 896 ; N uni4DDA ; G 4729 -U 19931 ; WX 896 ; N uni4DDB ; G 4730 -U 19932 ; WX 896 ; N uni4DDC ; G 4731 -U 19933 ; WX 896 ; N uni4DDD ; G 4732 -U 19934 ; WX 896 ; N uni4DDE ; G 4733 -U 19935 ; WX 896 ; N uni4DDF ; G 4734 -U 19936 ; WX 896 ; N uni4DE0 ; G 4735 -U 19937 ; WX 896 ; N uni4DE1 ; G 4736 -U 19938 ; WX 896 ; N uni4DE2 ; G 4737 -U 19939 ; WX 896 ; N uni4DE3 ; G 4738 -U 19940 ; WX 896 ; N uni4DE4 ; G 4739 -U 19941 ; WX 896 ; N uni4DE5 ; G 4740 -U 19942 ; WX 896 ; N uni4DE6 ; G 4741 -U 19943 ; WX 896 ; N uni4DE7 ; G 4742 -U 19944 ; WX 896 ; N uni4DE8 ; G 4743 -U 19945 ; WX 896 ; N uni4DE9 ; G 4744 -U 19946 ; WX 896 ; N uni4DEA ; G 4745 -U 19947 ; WX 896 ; N uni4DEB ; G 4746 -U 19948 ; WX 896 ; N uni4DEC ; G 4747 -U 19949 ; WX 896 ; N uni4DED ; G 4748 -U 19950 ; WX 896 ; N uni4DEE ; G 4749 -U 19951 ; WX 896 ; N uni4DEF ; G 4750 -U 19952 ; WX 896 ; N uni4DF0 ; G 4751 -U 19953 ; WX 896 ; N uni4DF1 ; G 4752 -U 19954 ; WX 896 ; N uni4DF2 ; G 4753 -U 19955 ; WX 896 ; N uni4DF3 ; G 4754 -U 19956 ; WX 896 ; N uni4DF4 ; G 4755 -U 19957 ; WX 896 ; N uni4DF5 ; G 4756 -U 19958 ; WX 896 ; N uni4DF6 ; G 4757 -U 19959 ; WX 896 ; N uni4DF7 ; G 4758 -U 19960 ; WX 896 ; N uni4DF8 ; G 4759 -U 19961 ; WX 896 ; N uni4DF9 ; G 4760 -U 19962 ; WX 896 ; N uni4DFA ; G 4761 -U 19963 ; WX 896 ; N uni4DFB ; G 4762 -U 19964 ; WX 896 ; N uni4DFC ; G 4763 -U 19965 ; WX 896 ; N uni4DFD ; G 4764 -U 19966 ; WX 896 ; N uni4DFE ; G 4765 -U 19967 ; WX 896 ; N uni4DFF ; G 4766 -U 42192 ; WX 686 ; N uniA4D0 ; G 4767 -U 42193 ; WX 603 ; N uniA4D1 ; G 4768 -U 42194 ; WX 603 ; N uniA4D2 ; G 4769 -U 42195 ; WX 770 ; N uniA4D3 ; G 4770 -U 42196 ; WX 611 ; N uniA4D4 ; G 4771 -U 42197 ; WX 611 ; N uniA4D5 ; G 4772 -U 42198 ; WX 775 ; N uniA4D6 ; G 4773 -U 42199 ; WX 656 ; N uniA4D7 ; G 4774 -U 42200 ; WX 656 ; N uniA4D8 ; G 4775 -U 42201 ; WX 512 ; N uniA4D9 ; G 4776 -U 42202 ; WX 698 ; N uniA4DA ; G 4777 -U 42203 ; WX 703 ; N uniA4DB ; G 4778 -U 42204 ; WX 685 ; N uniA4DC ; G 4779 -U 42205 ; WX 575 ; N uniA4DD ; G 4780 -U 42206 ; WX 575 ; N uniA4DE ; G 4781 -U 42207 ; WX 863 ; N uniA4DF ; G 4782 -U 42208 ; WX 748 ; N uniA4E0 ; G 4783 -U 42209 ; WX 557 ; N uniA4E1 ; G 4784 -U 42210 ; WX 635 ; N uniA4E2 ; G 4785 -U 42211 ; WX 695 ; N uniA4E3 ; G 4786 -U 42212 ; WX 695 ; N uniA4E4 ; G 4787 -U 42213 ; WX 684 ; N uniA4E5 ; G 4788 -U 42214 ; WX 684 ; N uniA4E6 ; G 4789 -U 42215 ; WX 752 ; N uniA4E7 ; G 4790 -U 42216 ; WX 775 ; N uniA4E8 ; G 4791 -U 42217 ; WX 512 ; N uniA4E9 ; G 4792 -U 42218 ; WX 989 ; N uniA4EA ; G 4793 -U 42219 ; WX 685 ; N uniA4EB ; G 4794 -U 42220 ; WX 611 ; N uniA4EC ; G 4795 -U 42221 ; WX 686 ; N uniA4ED ; G 4796 -U 42222 ; WX 684 ; N uniA4EE ; G 4797 -U 42223 ; WX 684 ; N uniA4EF ; G 4798 -U 42224 ; WX 632 ; N uniA4F0 ; G 4799 -U 42225 ; WX 632 ; N uniA4F1 ; G 4800 -U 42226 ; WX 295 ; N uniA4F2 ; G 4801 -U 42227 ; WX 787 ; N uniA4F3 ; G 4802 -U 42228 ; WX 732 ; N uniA4F4 ; G 4803 -U 42229 ; WX 732 ; N uniA4F5 ; G 4804 -U 42230 ; WX 557 ; N uniA4F6 ; G 4805 -U 42231 ; WX 767 ; N uniA4F7 ; G 4806 -U 42232 ; WX 300 ; N uniA4F8 ; G 4807 -U 42233 ; WX 300 ; N uniA4F9 ; G 4808 -U 42234 ; WX 596 ; N uniA4FA ; G 4809 -U 42235 ; WX 596 ; N uniA4FB ; G 4810 -U 42236 ; WX 300 ; N uniA4FC ; G 4811 -U 42237 ; WX 300 ; N uniA4FD ; G 4812 -U 42238 ; WX 588 ; N uniA4FE ; G 4813 -U 42239 ; WX 588 ; N uniA4FF ; G 4814 -U 42564 ; WX 635 ; N uniA644 ; G 4815 -U 42565 ; WX 521 ; N uniA645 ; G 4816 -U 42566 ; WX 354 ; N uniA646 ; G 4817 -U 42567 ; WX 338 ; N uniA647 ; G 4818 -U 42572 ; WX 1180 ; N uniA64C ; G 4819 -U 42573 ; WX 1028 ; N uniA64D ; G 4820 -U 42576 ; WX 1029 ; N uniA650 ; G 4821 -U 42577 ; WX 906 ; N uniA651 ; G 4822 -U 42580 ; WX 1080 ; N uniA654 ; G 4823 -U 42581 ; WX 842 ; N uniA655 ; G 4824 -U 42582 ; WX 977 ; N uniA656 ; G 4825 -U 42583 ; WX 843 ; N uniA657 ; G 4826 -U 42594 ; WX 1062 ; N uniA662 ; G 4827 -U 42595 ; WX 912 ; N uniA663 ; G 4828 -U 42596 ; WX 1066 ; N uniA664 ; G 4829 -U 42597 ; WX 901 ; N uniA665 ; G 4830 -U 42598 ; WX 1178 ; N uniA666 ; G 4831 -U 42599 ; WX 1008 ; N uniA667 ; G 4832 -U 42600 ; WX 787 ; N uniA668 ; G 4833 -U 42601 ; WX 612 ; N uniA669 ; G 4834 -U 42602 ; WX 855 ; N uniA66A ; G 4835 -U 42603 ; WX 712 ; N uniA66B ; G 4836 -U 42604 ; WX 1358 ; N uniA66C ; G 4837 -U 42605 ; WX 1019 ; N uniA66D ; G 4838 -U 42606 ; WX 879 ; N uniA66E ; G 4839 -U 42634 ; WX 782 ; N uniA68A ; G 4840 -U 42635 ; WX 685 ; N uniA68B ; G 4841 -U 42636 ; WX 611 ; N uniA68C ; G 4842 -U 42637 ; WX 583 ; N uniA68D ; G 4843 -U 42644 ; WX 686 ; N uniA694 ; G 4844 -U 42645 ; WX 634 ; N uniA695 ; G 4845 -U 42648 ; WX 1358 ; N uniA698 ; G 4846 -U 42649 ; WX 1019 ; N uniA699 ; G 4847 -U 42760 ; WX 493 ; N uniA708 ; G 4848 -U 42761 ; WX 493 ; N uniA709 ; G 4849 -U 42762 ; WX 493 ; N uniA70A ; G 4850 -U 42763 ; WX 493 ; N uniA70B ; G 4851 -U 42764 ; WX 493 ; N uniA70C ; G 4852 -U 42765 ; WX 493 ; N uniA70D ; G 4853 -U 42766 ; WX 493 ; N uniA70E ; G 4854 -U 42767 ; WX 493 ; N uniA70F ; G 4855 -U 42768 ; WX 493 ; N uniA710 ; G 4856 -U 42769 ; WX 493 ; N uniA711 ; G 4857 -U 42770 ; WX 493 ; N uniA712 ; G 4858 -U 42771 ; WX 493 ; N uniA713 ; G 4859 -U 42772 ; WX 493 ; N uniA714 ; G 4860 -U 42773 ; WX 493 ; N uniA715 ; G 4861 -U 42774 ; WX 493 ; N uniA716 ; G 4862 -U 42779 ; WX 369 ; N uniA71B ; G 4863 -U 42780 ; WX 369 ; N uniA71C ; G 4864 -U 42781 ; WX 252 ; N uniA71D ; G 4865 -U 42782 ; WX 252 ; N uniA71E ; G 4866 -U 42783 ; WX 252 ; N uniA71F ; G 4867 -U 42786 ; WX 385 ; N uniA722 ; G 4868 -U 42787 ; WX 356 ; N uniA723 ; G 4869 -U 42788 ; WX 472 ; N uniA724 ; G 4870 -U 42789 ; WX 472 ; N uniA725 ; G 4871 -U 42790 ; WX 752 ; N uniA726 ; G 4872 -U 42791 ; WX 634 ; N uniA727 ; G 4873 -U 42792 ; WX 878 ; N uniA728 ; G 4874 -U 42793 ; WX 709 ; N uniA729 ; G 4875 -U 42794 ; WX 614 ; N uniA72A ; G 4876 -U 42795 ; WX 541 ; N uniA72B ; G 4877 -U 42800 ; WX 491 ; N uniA730 ; G 4878 -U 42801 ; WX 521 ; N uniA731 ; G 4879 -U 42802 ; WX 1250 ; N uniA732 ; G 4880 -U 42803 ; WX 985 ; N uniA733 ; G 4881 -U 42804 ; WX 1203 ; N uniA734 ; G 4882 -U 42805 ; WX 990 ; N uniA735 ; G 4883 -U 42806 ; WX 1142 ; N uniA736 ; G 4884 -U 42807 ; WX 981 ; N uniA737 ; G 4885 -U 42808 ; WX 971 ; N uniA738 ; G 4886 -U 42809 ; WX 818 ; N uniA739 ; G 4887 -U 42810 ; WX 971 ; N uniA73A ; G 4888 -U 42811 ; WX 818 ; N uniA73B ; G 4889 -U 42812 ; WX 959 ; N uniA73C ; G 4890 -U 42813 ; WX 818 ; N uniA73D ; G 4891 -U 42814 ; WX 703 ; N uniA73E ; G 4892 -U 42815 ; WX 549 ; N uniA73F ; G 4893 -U 42816 ; WX 656 ; N uniA740 ; G 4894 -U 42817 ; WX 583 ; N uniA741 ; G 4895 -U 42822 ; WX 680 ; N uniA746 ; G 4896 -U 42823 ; WX 392 ; N uniA747 ; G 4897 -U 42824 ; WX 582 ; N uniA748 ; G 4898 -U 42825 ; WX 427 ; N uniA749 ; G 4899 -U 42826 ; WX 807 ; N uniA74A ; G 4900 -U 42827 ; WX 704 ; N uniA74B ; G 4901 -U 42830 ; WX 1358 ; N uniA74E ; G 4902 -U 42831 ; WX 1019 ; N uniA74F ; G 4903 -U 42832 ; WX 603 ; N uniA750 ; G 4904 -U 42833 ; WX 635 ; N uniA751 ; G 4905 -U 42834 ; WX 734 ; N uniA752 ; G 4906 -U 42835 ; WX 774 ; N uniA753 ; G 4907 -U 42838 ; WX 787 ; N uniA756 ; G 4908 -U 42839 ; WX 635 ; N uniA757 ; G 4909 -U 42852 ; WX 605 ; N uniA764 ; G 4910 -U 42853 ; WX 635 ; N uniA765 ; G 4911 -U 42854 ; WX 605 ; N uniA766 ; G 4912 -U 42855 ; WX 635 ; N uniA767 ; G 4913 -U 42880 ; WX 557 ; N uniA780 ; G 4914 -U 42881 ; WX 278 ; N uniA781 ; G 4915 -U 42882 ; WX 735 ; N uniA782 ; G 4916 -U 42883 ; WX 634 ; N uniA783 ; G 4917 -U 42889 ; WX 337 ; N uniA789 ; G 4918 -U 42890 ; WX 376 ; N uniA78A ; G 4919 -U 42891 ; WX 401 ; N uniA78B ; G 4920 -U 42892 ; WX 275 ; N uniA78C ; G 4921 -U 42893 ; WX 686 ; N uniA78D ; G 4922 -U 42894 ; WX 487 ; N uniA78E ; G 4923 -U 42896 ; WX 772 ; N uniA790 ; G 4924 -U 42897 ; WX 667 ; N uniA791 ; G 4925 -U 42912 ; WX 775 ; N uniA7A0 ; G 4926 -U 42913 ; WX 635 ; N uniA7A1 ; G 4927 -U 42914 ; WX 656 ; N uniA7A2 ; G 4928 -U 42915 ; WX 579 ; N uniA7A3 ; G 4929 -U 42916 ; WX 748 ; N uniA7A4 ; G 4930 -U 42917 ; WX 634 ; N uniA7A5 ; G 4931 -U 42918 ; WX 695 ; N uniA7A6 ; G 4932 -U 42919 ; WX 411 ; N uniA7A7 ; G 4933 -U 42920 ; WX 635 ; N uniA7A8 ; G 4934 -U 42921 ; WX 521 ; N uniA7A9 ; G 4935 -U 42922 ; WX 801 ; N uniA7AA ; G 4936 -U 43000 ; WX 577 ; N uniA7F8 ; G 4937 -U 43001 ; WX 644 ; N uniA7F9 ; G 4938 -U 43002 ; WX 915 ; N uniA7FA ; G 4939 -U 43003 ; WX 575 ; N uniA7FB ; G 4940 -U 43004 ; WX 603 ; N uniA7FC ; G 4941 -U 43005 ; WX 863 ; N uniA7FD ; G 4942 -U 43006 ; WX 295 ; N uniA7FE ; G 4943 -U 43007 ; WX 1199 ; N uniA7FF ; G 4944 -U 61184 ; WX 213 ; N uni02E5.5 ; G 4945 -U 61185 ; WX 238 ; N uni02E6.5 ; G 4946 -U 61186 ; WX 257 ; N uni02E7.5 ; G 4947 -U 61187 ; WX 264 ; N uni02E8.5 ; G 4948 -U 61188 ; WX 267 ; N uni02E9.5 ; G 4949 -U 61189 ; WX 238 ; N uni02E5.4 ; G 4950 -U 61190 ; WX 213 ; N uni02E6.4 ; G 4951 -U 61191 ; WX 238 ; N uni02E7.4 ; G 4952 -U 61192 ; WX 257 ; N uni02E8.4 ; G 4953 -U 61193 ; WX 264 ; N uni02E9.4 ; G 4954 -U 61194 ; WX 257 ; N uni02E5.3 ; G 4955 -U 61195 ; WX 238 ; N uni02E6.3 ; G 4956 -U 61196 ; WX 213 ; N uni02E7.3 ; G 4957 -U 61197 ; WX 238 ; N uni02E8.3 ; G 4958 -U 61198 ; WX 257 ; N uni02E9.3 ; G 4959 -U 61199 ; WX 264 ; N uni02E5.2 ; G 4960 -U 61200 ; WX 257 ; N uni02E6.2 ; G 4961 -U 61201 ; WX 238 ; N uni02E7.2 ; G 4962 -U 61202 ; WX 213 ; N uni02E8.2 ; G 4963 -U 61203 ; WX 238 ; N uni02E9.2 ; G 4964 -U 61204 ; WX 267 ; N uni02E5.1 ; G 4965 -U 61205 ; WX 264 ; N uni02E6.1 ; G 4966 -U 61206 ; WX 257 ; N uni02E7.1 ; G 4967 -U 61207 ; WX 238 ; N uni02E8.1 ; G 4968 -U 61208 ; WX 213 ; N uni02E9.1 ; G 4969 -U 61209 ; WX 275 ; N stem ; G 4970 -U 61440 ; WX 977 ; N uniF000 ; G 4971 -U 61441 ; WX 977 ; N uniF001 ; G 4972 -U 61442 ; WX 977 ; N uniF002 ; G 4973 -U 61443 ; WX 977 ; N uniF003 ; G 4974 -U 62464 ; WX 580 ; N uniF400 ; G 4975 -U 62465 ; WX 580 ; N uniF401 ; G 4976 -U 62466 ; WX 624 ; N uniF402 ; G 4977 -U 62467 ; WX 889 ; N uniF403 ; G 4978 -U 62468 ; WX 585 ; N uniF404 ; G 4979 -U 62469 ; WX 580 ; N uniF405 ; G 4980 -U 62470 ; WX 653 ; N uniF406 ; G 4981 -U 62471 ; WX 882 ; N uniF407 ; G 4982 -U 62472 ; WX 555 ; N uniF408 ; G 4983 -U 62473 ; WX 580 ; N uniF409 ; G 4984 -U 62474 ; WX 1168 ; N uniF40A ; G 4985 -U 62475 ; WX 589 ; N uniF40B ; G 4986 -U 62476 ; WX 590 ; N uniF40C ; G 4987 -U 62477 ; WX 869 ; N uniF40D ; G 4988 -U 62478 ; WX 580 ; N uniF40E ; G 4989 -U 62479 ; WX 589 ; N uniF40F ; G 4990 -U 62480 ; WX 914 ; N uniF410 ; G 4991 -U 62481 ; WX 590 ; N uniF411 ; G 4992 -U 62482 ; WX 731 ; N uniF412 ; G 4993 -U 62483 ; WX 583 ; N uniF413 ; G 4994 -U 62484 ; WX 872 ; N uniF414 ; G 4995 -U 62485 ; WX 589 ; N uniF415 ; G 4996 -U 62486 ; WX 895 ; N uniF416 ; G 4997 -U 62487 ; WX 589 ; N uniF417 ; G 4998 -U 62488 ; WX 589 ; N uniF418 ; G 4999 -U 62489 ; WX 590 ; N uniF419 ; G 5000 -U 62490 ; WX 649 ; N uniF41A ; G 5001 -U 62491 ; WX 589 ; N uniF41B ; G 5002 -U 62492 ; WX 589 ; N uniF41C ; G 5003 -U 62493 ; WX 599 ; N uniF41D ; G 5004 -U 62494 ; WX 590 ; N uniF41E ; G 5005 -U 62495 ; WX 516 ; N uniF41F ; G 5006 -U 62496 ; WX 580 ; N uniF420 ; G 5007 -U 62497 ; WX 584 ; N uniF421 ; G 5008 -U 62498 ; WX 580 ; N uniF422 ; G 5009 -U 62499 ; WX 580 ; N uniF423 ; G 5010 -U 62500 ; WX 581 ; N uniF424 ; G 5011 -U 62501 ; WX 638 ; N uniF425 ; G 5012 -U 62502 ; WX 955 ; N uniF426 ; G 5013 -U 62504 ; WX 931 ; N uniF428 ; G 5014 -U 62505 ; WX 808 ; N uniF429 ; G 5015 -U 62506 ; WX 508 ; N uniF42A ; G 5016 -U 62507 ; WX 508 ; N uniF42B ; G 5017 -U 62508 ; WX 508 ; N uniF42C ; G 5018 -U 62509 ; WX 508 ; N uniF42D ; G 5019 -U 62510 ; WX 508 ; N uniF42E ; G 5020 -U 62511 ; WX 508 ; N uniF42F ; G 5021 -U 62512 ; WX 508 ; N uniF430 ; G 5022 -U 62513 ; WX 508 ; N uniF431 ; G 5023 -U 62514 ; WX 508 ; N uniF432 ; G 5024 -U 62515 ; WX 508 ; N uniF433 ; G 5025 -U 62516 ; WX 518 ; N uniF434 ; G 5026 -U 62517 ; WX 518 ; N uniF435 ; G 5027 -U 62518 ; WX 518 ; N uniF436 ; G 5028 -U 62519 ; WX 787 ; N uniF437 ; G 5029 -U 62520 ; WX 787 ; N uniF438 ; G 5030 -U 62521 ; WX 787 ; N uniF439 ; G 5031 -U 62522 ; WX 787 ; N uniF43A ; G 5032 -U 62523 ; WX 787 ; N uniF43B ; G 5033 -U 62524 ; WX 546 ; N uniF43C ; G 5034 -U 62525 ; WX 546 ; N uniF43D ; G 5035 -U 62526 ; WX 546 ; N uniF43E ; G 5036 -U 62527 ; WX 546 ; N uniF43F ; G 5037 -U 62528 ; WX 546 ; N uniF440 ; G 5038 -U 62529 ; WX 546 ; N uniF441 ; G 5039 -U 63173 ; WX 612 ; N uniF6C5 ; G 5040 -U 64256 ; WX 689 ; N uniFB00 ; G 5041 -U 64257 ; WX 630 ; N fi ; G 5042 -U 64258 ; WX 630 ; N fl ; G 5043 -U 64259 ; WX 967 ; N uniFB03 ; G 5044 -U 64260 ; WX 967 ; N uniFB04 ; G 5045 -U 64261 ; WX 686 ; N uniFB05 ; G 5046 -U 64262 ; WX 861 ; N uniFB06 ; G 5047 -U 64275 ; WX 1202 ; N uniFB13 ; G 5048 -U 64276 ; WX 1202 ; N uniFB14 ; G 5049 -U 64277 ; WX 1196 ; N uniFB15 ; G 5050 -U 64278 ; WX 1186 ; N uniFB16 ; G 5051 -U 64279 ; WX 1529 ; N uniFB17 ; G 5052 -U 64285 ; WX 224 ; N uniFB1D ; G 5053 -U 64286 ; WX 0 ; N uniFB1E ; G 5054 -U 64287 ; WX 331 ; N uniFB1F ; G 5055 -U 64288 ; WX 636 ; N uniFB20 ; G 5056 -U 64289 ; WX 856 ; N uniFB21 ; G 5057 -U 64290 ; WX 774 ; N uniFB22 ; G 5058 -U 64291 ; WX 906 ; N uniFB23 ; G 5059 -U 64292 ; WX 771 ; N uniFB24 ; G 5060 -U 64293 ; WX 843 ; N uniFB25 ; G 5061 -U 64294 ; WX 855 ; N uniFB26 ; G 5062 -U 64295 ; WX 807 ; N uniFB27 ; G 5063 -U 64296 ; WX 875 ; N uniFB28 ; G 5064 -U 64297 ; WX 838 ; N uniFB29 ; G 5065 -U 64298 ; WX 708 ; N uniFB2A ; G 5066 -U 64299 ; WX 708 ; N uniFB2B ; G 5067 -U 64300 ; WX 708 ; N uniFB2C ; G 5068 -U 64301 ; WX 708 ; N uniFB2D ; G 5069 -U 64302 ; WX 668 ; N uniFB2E ; G 5070 -U 64303 ; WX 668 ; N uniFB2F ; G 5071 -U 64304 ; WX 668 ; N uniFB30 ; G 5072 -U 64305 ; WX 578 ; N uniFB31 ; G 5073 -U 64306 ; WX 412 ; N uniFB32 ; G 5074 -U 64307 ; WX 546 ; N uniFB33 ; G 5075 -U 64308 ; WX 653 ; N uniFB34 ; G 5076 -U 64309 ; WX 355 ; N uniFB35 ; G 5077 -U 64310 ; WX 406 ; N uniFB36 ; G 5078 -U 64312 ; WX 648 ; N uniFB38 ; G 5079 -U 64313 ; WX 330 ; N uniFB39 ; G 5080 -U 64314 ; WX 537 ; N uniFB3A ; G 5081 -U 64315 ; WX 529 ; N uniFB3B ; G 5082 -U 64316 ; WX 568 ; N uniFB3C ; G 5083 -U 64318 ; WX 679 ; N uniFB3E ; G 5084 -U 64320 ; WX 399 ; N uniFB40 ; G 5085 -U 64321 ; WX 649 ; N uniFB41 ; G 5086 -U 64323 ; WX 640 ; N uniFB43 ; G 5087 -U 64324 ; WX 625 ; N uniFB44 ; G 5088 -U 64326 ; WX 593 ; N uniFB46 ; G 5089 -U 64327 ; WX 709 ; N uniFB47 ; G 5090 -U 64328 ; WX 564 ; N uniFB48 ; G 5091 -U 64329 ; WX 708 ; N uniFB49 ; G 5092 -U 64330 ; WX 657 ; N uniFB4A ; G 5093 -U 64331 ; WX 272 ; N uniFB4B ; G 5094 -U 64332 ; WX 578 ; N uniFB4C ; G 5095 -U 64333 ; WX 529 ; N uniFB4D ; G 5096 -U 64334 ; WX 625 ; N uniFB4E ; G 5097 -U 64335 ; WX 629 ; N uniFB4F ; G 5098 -U 64338 ; WX 941 ; N uniFB52 ; G 5099 -U 64339 ; WX 982 ; N uniFB53 ; G 5100 -U 64340 ; WX 278 ; N uniFB54 ; G 5101 -U 64341 ; WX 302 ; N uniFB55 ; G 5102 -U 64342 ; WX 941 ; N uniFB56 ; G 5103 -U 64343 ; WX 982 ; N uniFB57 ; G 5104 -U 64344 ; WX 278 ; N uniFB58 ; G 5105 -U 64345 ; WX 302 ; N uniFB59 ; G 5106 -U 64346 ; WX 941 ; N uniFB5A ; G 5107 -U 64347 ; WX 982 ; N uniFB5B ; G 5108 -U 64348 ; WX 278 ; N uniFB5C ; G 5109 -U 64349 ; WX 302 ; N uniFB5D ; G 5110 -U 64350 ; WX 941 ; N uniFB5E ; G 5111 -U 64351 ; WX 982 ; N uniFB5F ; G 5112 -U 64352 ; WX 278 ; N uniFB60 ; G 5113 -U 64353 ; WX 302 ; N uniFB61 ; G 5114 -U 64354 ; WX 941 ; N uniFB62 ; G 5115 -U 64355 ; WX 982 ; N uniFB63 ; G 5116 -U 64356 ; WX 278 ; N uniFB64 ; G 5117 -U 64357 ; WX 302 ; N uniFB65 ; G 5118 -U 64358 ; WX 941 ; N uniFB66 ; G 5119 -U 64359 ; WX 982 ; N uniFB67 ; G 5120 -U 64360 ; WX 278 ; N uniFB68 ; G 5121 -U 64361 ; WX 302 ; N uniFB69 ; G 5122 -U 64362 ; WX 1037 ; N uniFB6A ; G 5123 -U 64363 ; WX 1035 ; N uniFB6B ; G 5124 -U 64364 ; WX 478 ; N uniFB6C ; G 5125 -U 64365 ; WX 506 ; N uniFB6D ; G 5126 -U 64366 ; WX 1037 ; N uniFB6E ; G 5127 -U 64367 ; WX 1035 ; N uniFB6F ; G 5128 -U 64368 ; WX 478 ; N uniFB70 ; G 5129 -U 64369 ; WX 506 ; N uniFB71 ; G 5130 -U 64370 ; WX 646 ; N uniFB72 ; G 5131 -U 64371 ; WX 646 ; N uniFB73 ; G 5132 -U 64372 ; WX 618 ; N uniFB74 ; G 5133 -U 64373 ; WX 646 ; N uniFB75 ; G 5134 -U 64374 ; WX 646 ; N uniFB76 ; G 5135 -U 64375 ; WX 646 ; N uniFB77 ; G 5136 -U 64376 ; WX 618 ; N uniFB78 ; G 5137 -U 64377 ; WX 646 ; N uniFB79 ; G 5138 -U 64378 ; WX 646 ; N uniFB7A ; G 5139 -U 64379 ; WX 646 ; N uniFB7B ; G 5140 -U 64380 ; WX 618 ; N uniFB7C ; G 5141 -U 64381 ; WX 646 ; N uniFB7D ; G 5142 -U 64382 ; WX 646 ; N uniFB7E ; G 5143 -U 64383 ; WX 646 ; N uniFB7F ; G 5144 -U 64384 ; WX 618 ; N uniFB80 ; G 5145 -U 64385 ; WX 646 ; N uniFB81 ; G 5146 -U 64386 ; WX 445 ; N uniFB82 ; G 5147 -U 64387 ; WX 525 ; N uniFB83 ; G 5148 -U 64388 ; WX 445 ; N uniFB84 ; G 5149 -U 64389 ; WX 525 ; N uniFB85 ; G 5150 -U 64390 ; WX 445 ; N uniFB86 ; G 5151 -U 64391 ; WX 525 ; N uniFB87 ; G 5152 -U 64392 ; WX 445 ; N uniFB88 ; G 5153 -U 64393 ; WX 525 ; N uniFB89 ; G 5154 -U 64394 ; WX 483 ; N uniFB8A ; G 5155 -U 64395 ; WX 552 ; N uniFB8B ; G 5156 -U 64396 ; WX 483 ; N uniFB8C ; G 5157 -U 64397 ; WX 552 ; N uniFB8D ; G 5158 -U 64398 ; WX 895 ; N uniFB8E ; G 5159 -U 64399 ; WX 895 ; N uniFB8F ; G 5160 -U 64400 ; WX 476 ; N uniFB90 ; G 5161 -U 64401 ; WX 552 ; N uniFB91 ; G 5162 -U 64402 ; WX 895 ; N uniFB92 ; G 5163 -U 64403 ; WX 895 ; N uniFB93 ; G 5164 -U 64404 ; WX 476 ; N uniFB94 ; G 5165 -U 64405 ; WX 552 ; N uniFB95 ; G 5166 -U 64406 ; WX 895 ; N uniFB96 ; G 5167 -U 64407 ; WX 895 ; N uniFB97 ; G 5168 -U 64408 ; WX 476 ; N uniFB98 ; G 5169 -U 64409 ; WX 552 ; N uniFB99 ; G 5170 -U 64410 ; WX 895 ; N uniFB9A ; G 5171 -U 64411 ; WX 895 ; N uniFB9B ; G 5172 -U 64412 ; WX 476 ; N uniFB9C ; G 5173 -U 64413 ; WX 552 ; N uniFB9D ; G 5174 -U 64414 ; WX 734 ; N uniFB9E ; G 5175 -U 64415 ; WX 761 ; N uniFB9F ; G 5176 -U 64416 ; WX 734 ; N uniFBA0 ; G 5177 -U 64417 ; WX 761 ; N uniFBA1 ; G 5178 -U 64418 ; WX 278 ; N uniFBA2 ; G 5179 -U 64419 ; WX 302 ; N uniFBA3 ; G 5180 -U 64426 ; WX 698 ; N uniFBAA ; G 5181 -U 64427 ; WX 632 ; N uniFBAB ; G 5182 -U 64428 ; WX 527 ; N uniFBAC ; G 5183 -U 64429 ; WX 461 ; N uniFBAD ; G 5184 -U 64467 ; WX 824 ; N uniFBD3 ; G 5185 -U 64468 ; WX 843 ; N uniFBD4 ; G 5186 -U 64469 ; WX 476 ; N uniFBD5 ; G 5187 -U 64470 ; WX 552 ; N uniFBD6 ; G 5188 -U 64471 ; WX 483 ; N uniFBD7 ; G 5189 -U 64472 ; WX 517 ; N uniFBD8 ; G 5190 -U 64473 ; WX 483 ; N uniFBD9 ; G 5191 -U 64474 ; WX 517 ; N uniFBDA ; G 5192 -U 64475 ; WX 483 ; N uniFBDB ; G 5193 -U 64476 ; WX 517 ; N uniFBDC ; G 5194 -U 64478 ; WX 483 ; N uniFBDE ; G 5195 -U 64479 ; WX 517 ; N uniFBDF ; G 5196 -U 64484 ; WX 783 ; N uniFBE4 ; G 5197 -U 64485 ; WX 833 ; N uniFBE5 ; G 5198 -U 64486 ; WX 278 ; N uniFBE6 ; G 5199 -U 64487 ; WX 302 ; N uniFBE7 ; G 5200 -U 64488 ; WX 278 ; N uniFBE8 ; G 5201 -U 64489 ; WX 302 ; N uniFBE9 ; G 5202 -U 64508 ; WX 783 ; N uniFBFC ; G 5203 -U 64509 ; WX 833 ; N uniFBFD ; G 5204 -U 64510 ; WX 278 ; N uniFBFE ; G 5205 -U 64511 ; WX 302 ; N uniFBFF ; G 5206 -U 65024 ; WX 0 ; N uniFE00 ; G 5207 -U 65025 ; WX 0 ; N uniFE01 ; G 5208 -U 65026 ; WX 0 ; N uniFE02 ; G 5209 -U 65027 ; WX 0 ; N uniFE03 ; G 5210 -U 65028 ; WX 0 ; N uniFE04 ; G 5211 -U 65029 ; WX 0 ; N uniFE05 ; G 5212 -U 65030 ; WX 0 ; N uniFE06 ; G 5213 -U 65031 ; WX 0 ; N uniFE07 ; G 5214 -U 65032 ; WX 0 ; N uniFE08 ; G 5215 -U 65033 ; WX 0 ; N uniFE09 ; G 5216 -U 65034 ; WX 0 ; N uniFE0A ; G 5217 -U 65035 ; WX 0 ; N uniFE0B ; G 5218 -U 65036 ; WX 0 ; N uniFE0C ; G 5219 -U 65037 ; WX 0 ; N uniFE0D ; G 5220 -U 65038 ; WX 0 ; N uniFE0E ; G 5221 -U 65039 ; WX 0 ; N uniFE0F ; G 5222 -U 65056 ; WX 0 ; N uniFE20 ; G 5223 -U 65057 ; WX 0 ; N uniFE21 ; G 5224 -U 65058 ; WX 0 ; N uniFE22 ; G 5225 -U 65059 ; WX 0 ; N uniFE23 ; G 5226 -U 65136 ; WX 293 ; N uniFE70 ; G 5227 -U 65137 ; WX 293 ; N uniFE71 ; G 5228 -U 65138 ; WX 293 ; N uniFE72 ; G 5229 -U 65139 ; WX 262 ; N uniFE73 ; G 5230 -U 65140 ; WX 293 ; N uniFE74 ; G 5231 -U 65142 ; WX 293 ; N uniFE76 ; G 5232 -U 65143 ; WX 293 ; N uniFE77 ; G 5233 -U 65144 ; WX 293 ; N uniFE78 ; G 5234 -U 65145 ; WX 293 ; N uniFE79 ; G 5235 -U 65146 ; WX 293 ; N uniFE7A ; G 5236 -U 65147 ; WX 293 ; N uniFE7B ; G 5237 -U 65148 ; WX 293 ; N uniFE7C ; G 5238 -U 65149 ; WX 293 ; N uniFE7D ; G 5239 -U 65150 ; WX 293 ; N uniFE7E ; G 5240 -U 65151 ; WX 293 ; N uniFE7F ; G 5241 -U 65152 ; WX 470 ; N uniFE80 ; G 5242 -U 65153 ; WX 278 ; N uniFE81 ; G 5243 -U 65154 ; WX 305 ; N uniFE82 ; G 5244 -U 65155 ; WX 278 ; N uniFE83 ; G 5245 -U 65156 ; WX 305 ; N uniFE84 ; G 5246 -U 65157 ; WX 483 ; N uniFE85 ; G 5247 -U 65158 ; WX 517 ; N uniFE86 ; G 5248 -U 65159 ; WX 278 ; N uniFE87 ; G 5249 -U 65160 ; WX 305 ; N uniFE88 ; G 5250 -U 65161 ; WX 783 ; N uniFE89 ; G 5251 -U 65162 ; WX 833 ; N uniFE8A ; G 5252 -U 65163 ; WX 278 ; N uniFE8B ; G 5253 -U 65164 ; WX 302 ; N uniFE8C ; G 5254 -U 65165 ; WX 278 ; N uniFE8D ; G 5255 -U 65166 ; WX 305 ; N uniFE8E ; G 5256 -U 65167 ; WX 941 ; N uniFE8F ; G 5257 -U 65168 ; WX 982 ; N uniFE90 ; G 5258 -U 65169 ; WX 278 ; N uniFE91 ; G 5259 -U 65170 ; WX 302 ; N uniFE92 ; G 5260 -U 65171 ; WX 524 ; N uniFE93 ; G 5261 -U 65172 ; WX 536 ; N uniFE94 ; G 5262 -U 65173 ; WX 941 ; N uniFE95 ; G 5263 -U 65174 ; WX 982 ; N uniFE96 ; G 5264 -U 65175 ; WX 278 ; N uniFE97 ; G 5265 -U 65176 ; WX 302 ; N uniFE98 ; G 5266 -U 65177 ; WX 941 ; N uniFE99 ; G 5267 -U 65178 ; WX 982 ; N uniFE9A ; G 5268 -U 65179 ; WX 278 ; N uniFE9B ; G 5269 -U 65180 ; WX 302 ; N uniFE9C ; G 5270 -U 65181 ; WX 646 ; N uniFE9D ; G 5271 -U 65182 ; WX 646 ; N uniFE9E ; G 5272 -U 65183 ; WX 618 ; N uniFE9F ; G 5273 -U 65184 ; WX 646 ; N uniFEA0 ; G 5274 -U 65185 ; WX 646 ; N uniFEA1 ; G 5275 -U 65186 ; WX 646 ; N uniFEA2 ; G 5276 -U 65187 ; WX 618 ; N uniFEA3 ; G 5277 -U 65188 ; WX 646 ; N uniFEA4 ; G 5278 -U 65189 ; WX 646 ; N uniFEA5 ; G 5279 -U 65190 ; WX 646 ; N uniFEA6 ; G 5280 -U 65191 ; WX 618 ; N uniFEA7 ; G 5281 -U 65192 ; WX 646 ; N uniFEA8 ; G 5282 -U 65193 ; WX 445 ; N uniFEA9 ; G 5283 -U 65194 ; WX 525 ; N uniFEAA ; G 5284 -U 65195 ; WX 445 ; N uniFEAB ; G 5285 -U 65196 ; WX 525 ; N uniFEAC ; G 5286 -U 65197 ; WX 483 ; N uniFEAD ; G 5287 -U 65198 ; WX 552 ; N uniFEAE ; G 5288 -U 65199 ; WX 483 ; N uniFEAF ; G 5289 -U 65200 ; WX 552 ; N uniFEB0 ; G 5290 -U 65201 ; WX 1221 ; N uniFEB1 ; G 5291 -U 65202 ; WX 1275 ; N uniFEB2 ; G 5292 -U 65203 ; WX 838 ; N uniFEB3 ; G 5293 -U 65204 ; WX 892 ; N uniFEB4 ; G 5294 -U 65205 ; WX 1221 ; N uniFEB5 ; G 5295 -U 65206 ; WX 1275 ; N uniFEB6 ; G 5296 -U 65207 ; WX 838 ; N uniFEB7 ; G 5297 -U 65208 ; WX 892 ; N uniFEB8 ; G 5298 -U 65209 ; WX 1209 ; N uniFEB9 ; G 5299 -U 65210 ; WX 1225 ; N uniFEBA ; G 5300 -U 65211 ; WX 849 ; N uniFEBB ; G 5301 -U 65212 ; WX 867 ; N uniFEBC ; G 5302 -U 65213 ; WX 1209 ; N uniFEBD ; G 5303 -U 65214 ; WX 1225 ; N uniFEBE ; G 5304 -U 65215 ; WX 849 ; N uniFEBF ; G 5305 -U 65216 ; WX 867 ; N uniFEC0 ; G 5306 -U 65217 ; WX 925 ; N uniFEC1 ; G 5307 -U 65218 ; WX 949 ; N uniFEC2 ; G 5308 -U 65219 ; WX 796 ; N uniFEC3 ; G 5309 -U 65220 ; WX 820 ; N uniFEC4 ; G 5310 -U 65221 ; WX 925 ; N uniFEC5 ; G 5311 -U 65222 ; WX 949 ; N uniFEC6 ; G 5312 -U 65223 ; WX 796 ; N uniFEC7 ; G 5313 -U 65224 ; WX 820 ; N uniFEC8 ; G 5314 -U 65225 ; WX 597 ; N uniFEC9 ; G 5315 -U 65226 ; WX 532 ; N uniFECA ; G 5316 -U 65227 ; WX 597 ; N uniFECB ; G 5317 -U 65228 ; WX 482 ; N uniFECC ; G 5318 -U 65229 ; WX 597 ; N uniFECD ; G 5319 -U 65230 ; WX 532 ; N uniFECE ; G 5320 -U 65231 ; WX 523 ; N uniFECF ; G 5321 -U 65232 ; WX 482 ; N uniFED0 ; G 5322 -U 65233 ; WX 1037 ; N uniFED1 ; G 5323 -U 65234 ; WX 1035 ; N uniFED2 ; G 5324 -U 65235 ; WX 478 ; N uniFED3 ; G 5325 -U 65236 ; WX 506 ; N uniFED4 ; G 5326 -U 65237 ; WX 776 ; N uniFED5 ; G 5327 -U 65238 ; WX 834 ; N uniFED6 ; G 5328 -U 65239 ; WX 478 ; N uniFED7 ; G 5329 -U 65240 ; WX 506 ; N uniFED8 ; G 5330 -U 65241 ; WX 824 ; N uniFED9 ; G 5331 -U 65242 ; WX 843 ; N uniFEDA ; G 5332 -U 65243 ; WX 476 ; N uniFEDB ; G 5333 -U 65244 ; WX 552 ; N uniFEDC ; G 5334 -U 65245 ; WX 727 ; N uniFEDD ; G 5335 -U 65246 ; WX 757 ; N uniFEDE ; G 5336 -U 65247 ; WX 305 ; N uniFEDF ; G 5337 -U 65248 ; WX 331 ; N uniFEE0 ; G 5338 -U 65249 ; WX 619 ; N uniFEE1 ; G 5339 -U 65250 ; WX 666 ; N uniFEE2 ; G 5340 -U 65251 ; WX 536 ; N uniFEE3 ; G 5341 -U 65252 ; WX 578 ; N uniFEE4 ; G 5342 -U 65253 ; WX 734 ; N uniFEE5 ; G 5343 -U 65254 ; WX 761 ; N uniFEE6 ; G 5344 -U 65255 ; WX 278 ; N uniFEE7 ; G 5345 -U 65256 ; WX 302 ; N uniFEE8 ; G 5346 -U 65257 ; WX 524 ; N uniFEE9 ; G 5347 -U 65258 ; WX 536 ; N uniFEEA ; G 5348 -U 65259 ; WX 527 ; N uniFEEB ; G 5349 -U 65260 ; WX 461 ; N uniFEEC ; G 5350 -U 65261 ; WX 483 ; N uniFEED ; G 5351 -U 65262 ; WX 517 ; N uniFEEE ; G 5352 -U 65263 ; WX 783 ; N uniFEEF ; G 5353 -U 65264 ; WX 833 ; N uniFEF0 ; G 5354 -U 65265 ; WX 783 ; N uniFEF1 ; G 5355 -U 65266 ; WX 833 ; N uniFEF2 ; G 5356 -U 65267 ; WX 278 ; N uniFEF3 ; G 5357 -U 65268 ; WX 302 ; N uniFEF4 ; G 5358 -U 65269 ; WX 570 ; N uniFEF5 ; G 5359 -U 65270 ; WX 597 ; N uniFEF6 ; G 5360 -U 65271 ; WX 570 ; N uniFEF7 ; G 5361 -U 65272 ; WX 597 ; N uniFEF8 ; G 5362 -U 65273 ; WX 570 ; N uniFEF9 ; G 5363 -U 65274 ; WX 597 ; N uniFEFA ; G 5364 -U 65275 ; WX 570 ; N uniFEFB ; G 5365 -U 65276 ; WX 597 ; N uniFEFC ; G 5366 -U 65279 ; WX 0 ; N uniFEFF ; G 5367 -U 65529 ; WX 0 ; N uniFFF9 ; G 5368 -U 65530 ; WX 0 ; N uniFFFA ; G 5369 -U 65531 ; WX 0 ; N uniFFFB ; G 5370 -U 65532 ; WX 0 ; N uniFFFC ; G 5371 -U 65533 ; WX 1025 ; N uniFFFD ; G 5372 -EndCharMetrics -StartKernData -StartKernPairs 2727 - -KPX dollar dollar 57 -KPX dollar ampersand -36 -KPX dollar asterisk -36 -KPX dollar two -36 -KPX dollar four -36 -KPX dollar seven -159 -KPX dollar nine -131 -KPX dollar colon -112 -KPX dollar less -159 -KPX dollar F -36 -KPX dollar G -36 -KPX dollar H -36 -KPX dollar I -73 -KPX dollar R -36 -KPX dollar T -36 -KPX dollar W -36 -KPX dollar Y -120 -KPX dollar Z -83 -KPX dollar backslash -139 -KPX dollar m -73 -KPX dollar copyright -36 -KPX dollar ordfeminine -36 -KPX dollar guillemotleft -36 -KPX dollar logicalnot -36 -KPX dollar sfthyphen -36 -KPX dollar acute -36 -KPX dollar mu -36 -KPX dollar paragraph -36 -KPX dollar periodcentered -36 -KPX dollar cedilla -36 -KPX dollar questiondown -139 -KPX dollar Aacute -139 -KPX dollar Acircumflex 57 -KPX dollar Adieresis 57 -KPX dollar AE 57 -KPX dollar Egrave -36 -KPX dollar Eacute -36 -KPX dollar Ecircumflex -36 -KPX dollar Edieresis -36 -KPX dollar Igrave -36 -KPX dollar Iacute -36 -KPX dollar Icircumflex -36 -KPX dollar Idieresis -36 -KPX dollar Ntilde -36 -KPX dollar Oacute -36 -KPX dollar Otilde -36 -KPX dollar multiply -36 -KPX dollar Ugrave -36 -KPX dollar Ucircumflex -36 -KPX dollar Yacute -36 -KPX dollar Thorn -36 -KPX dollar agrave -36 -KPX dollar acircumflex -36 -KPX dollar Dcaron -36 -KPX dollar dcaron -36 -KPX dollar Dcroat -36 -KPX dollar dmacron -36 -KPX dollar Emacron -36 -KPX dollar emacron -36 -KPX dollar Hcircumflex -159 -KPX dollar hcircumflex -36 -KPX dollar Hbar -159 -KPX dollar hbar -36 -KPX dollar Kcommaaccent -112 -KPX dollar kcommaaccent -83 -KPX dollar kgreenlandic -159 -KPX dollar Lacute -139 -KPX dollar lacute -159 -KPX dollar uni0188 -36 -KPX dollar uni01AC -36 -KPX dollar uni01AD -36 -KPX dollar uni01AE -36 -KPX dollar Uhorn -36 -KPX dollar uni01DC -159 -KPX dollar uni01DD -36 -KPX dollar uni01F0 -36 -KPX dollar uni01F3 -36 -KPX dollar uni01F4 -159 -KPX dollar uni01F5 -139 - -KPX percent ampersand -36 -KPX percent asterisk -36 -KPX percent two -36 -KPX percent six -36 -KPX percent nine -63 -KPX percent colon -73 -KPX percent less -112 -KPX percent m -63 -KPX percent braceright -36 -KPX percent Egrave -36 -KPX percent Ecircumflex -36 -KPX percent Igrave -36 -KPX percent Icircumflex -36 -KPX percent Thorn -36 -KPX percent agrave -36 -KPX percent acircumflex -36 -KPX percent adieresis -36 -KPX percent Dcaron -36 -KPX percent Dcroat -36 -KPX percent Emacron -36 -KPX percent Gcircumflex -36 -KPX percent Gbreve -36 -KPX percent Gdotaccent -36 -KPX percent Gcommaaccent -36 -KPX percent Kcommaaccent -73 -KPX percent kgreenlandic -112 -KPX percent lacute -112 -KPX percent uni01AC -36 -KPX percent uni01AE -36 -KPX percent uni01DA -36 -KPX percent uni01F0 -36 - -KPX ampersand less -36 -KPX ampersand m -36 -KPX ampersand braceright -36 -KPX ampersand kgreenlandic -36 -KPX ampersand lacute -36 -KPX ampersand uni01F4 -36 - -KPX quotesingle dollar -36 -KPX quotesingle nine -36 -KPX quotesingle less -112 -KPX quotesingle m -36 -KPX quotesingle braceright -36 -KPX quotesingle Acircumflex -36 -KPX quotesingle Adieresis -36 -KPX quotesingle AE -36 -KPX quotesingle kgreenlandic -112 -KPX quotesingle lacute -112 -KPX quotesingle uni01F4 -112 - -KPX parenright dollar -188 -KPX parenright six -36 -KPX parenright seven -36 -KPX parenright D -188 -KPX parenright H -112 -KPX parenright L -149 -KPX parenright R -73 -KPX parenright U -149 -KPX parenright X -112 -KPX parenright backslash -188 -KPX parenright cent -188 -KPX parenright sterling -188 -KPX parenright currency -188 -KPX parenright yen -188 -KPX parenright brokenbar -188 -KPX parenright section -188 -KPX parenright ordfeminine -112 -KPX parenright guillemotleft -112 -KPX parenright logicalnot -112 -KPX parenright sfthyphen -112 -KPX parenright acute -73 -KPX parenright mu -73 -KPX parenright paragraph -73 -KPX parenright periodcentered -73 -KPX parenright cedilla -73 -KPX parenright guillemotright -112 -KPX parenright onequarter -112 -KPX parenright onehalf -112 -KPX parenright threequarters -112 -KPX parenright questiondown -188 -KPX parenright Aacute -188 -KPX parenright Acircumflex -188 -KPX parenright Atilde -188 -KPX parenright Adieresis -188 -KPX parenright Aring -188 -KPX parenright AE -188 -KPX parenright Ccedilla -188 -KPX parenright Otilde -112 -KPX parenright multiply -112 -KPX parenright Ugrave -112 -KPX parenright Ucircumflex -112 -KPX parenright Yacute -112 -KPX parenright ntilde -149 -KPX parenright otilde -149 -KPX parenright dcaron -73 -KPX parenright dmacron -73 -KPX parenright emacron -73 -KPX parenright edotaccent -149 -KPX parenright eogonek -149 -KPX parenright ecaron -149 -KPX parenright Gcircumflex -36 -KPX parenright Gbreve -36 -KPX parenright Gdotaccent -36 -KPX parenright Gcommaaccent -36 -KPX parenright Hcircumflex -36 -KPX parenright Hbar -36 -KPX parenright Itilde -36 -KPX parenright imacron -112 -KPX parenright ibreve -112 -KPX parenright iogonek -112 -KPX parenright dotlessi -112 -KPX parenright ij -112 -KPX parenright jcircumflex -112 -KPX parenright Lacute -188 -KPX parenright uni01AD -73 -KPX parenright Uhorn -73 -KPX parenright uni01DA -36 -KPX parenright uni01DC -36 -KPX parenright uni01F1 -73 -KPX parenright uni01F5 -188 - -KPX asterisk seven -73 -KPX asterisk less -102 -KPX asterisk m -36 -KPX asterisk braceright -36 -KPX asterisk Hbar -73 -KPX asterisk lacute -102 - - -KPX hyphen dollar -36 -KPX hyphen m -36 -KPX hyphen braceright -36 - -KPX period dollar -36 -KPX period ampersand -112 -KPX period two -112 -KPX period seven -159 -KPX period eight -55 -KPX period colon -73 -KPX period less -73 -KPX period D -36 -KPX period H -102 -KPX period R -102 -KPX period X -102 -KPX period backslash -149 -KPX period m -131 -KPX period cent -36 -KPX period sterling -36 -KPX period currency -36 -KPX period yen -36 -KPX period brokenbar -36 -KPX period section -36 -KPX period ordfeminine -102 -KPX period guillemotleft -102 -KPX period logicalnot -102 -KPX period sfthyphen -102 -KPX period acute -102 -KPX period mu -102 -KPX period paragraph -102 -KPX period periodcentered -102 -KPX period cedilla -102 -KPX period guillemotright -102 -KPX period onequarter -102 -KPX period onehalf -102 -KPX period threequarters -102 -KPX period questiondown -149 -KPX period Aacute -149 -KPX period Egrave -112 -KPX period Icircumflex -112 -KPX period Yacute -102 -KPX period Hbar -159 -KPX period Idot -55 -KPX period dotlessi -102 -KPX period lacute -73 - -KPX slash dollar 47 -KPX slash two -73 -KPX slash seven -282 -KPX slash eight -102 -KPX slash nine -225 -KPX slash colon -188 -KPX slash less -272 -KPX slash H -36 -KPX slash R -36 -KPX slash X -36 -KPX slash backslash -188 -KPX slash ordfeminine -36 -KPX slash guillemotleft -36 -KPX slash logicalnot -36 -KPX slash sfthyphen -36 -KPX slash acute -36 -KPX slash mu -36 -KPX slash paragraph -36 -KPX slash periodcentered -36 -KPX slash cedilla -36 -KPX slash guillemotright -36 -KPX slash onequarter -36 -KPX slash onehalf -36 -KPX slash threequarters -36 -KPX slash questiondown -188 -KPX slash Aacute -188 -KPX slash Yacute -36 -KPX slash Hbar -282 -KPX slash Idot -102 -KPX slash dotlessi -36 -KPX slash lacute -272 - -KPX two dollar -36 -KPX two nine -36 -KPX two semicolon -131 -KPX two less -112 -KPX two m -36 -KPX two lacute -112 - -KPX three dollar -131 -KPX three less -45 -KPX three D -92 -KPX three H -73 -KPX three L -45 -KPX three Q -36 -KPX three R -73 -KPX three U -36 -KPX three V -36 -KPX three X -36 -KPX three m -36 -KPX three cent -92 -KPX three sterling -92 -KPX three currency -92 -KPX three yen -92 -KPX three brokenbar -92 -KPX three section -92 -KPX three ordfeminine -73 -KPX three guillemotleft -73 -KPX three logicalnot -73 -KPX three sfthyphen -73 -KPX three threesuperior -36 -KPX three acute -73 -KPX three mu -73 -KPX three paragraph -73 -KPX three periodcentered -73 -KPX three cedilla -73 -KPX three guillemotright -36 -KPX three onequarter -36 -KPX three onehalf -36 -KPX three threequarters -36 -KPX three Yacute -73 -KPX three Cdotaccent -36 -KPX three edotaccent -36 -KPX three ecaron -36 -KPX three gdotaccent -36 -KPX three gcommaaccent -36 -KPX three dotlessi -36 -KPX three lacute -45 - - -KPX five dollar -83 -KPX five ampersand -102 -KPX five seven -149 -KPX five nine -112 -KPX five colon -83 -KPX five less -131 -KPX five D -45 -KPX five H -92 -KPX five R -92 -KPX five X -92 -KPX five backslash -112 -KPX five m -112 -KPX five braceright -36 -KPX five cent -45 -KPX five sterling -45 -KPX five currency -45 -KPX five yen -45 -KPX five brokenbar -45 -KPX five section -45 -KPX five ordfeminine -92 -KPX five guillemotleft -92 -KPX five logicalnot -92 -KPX five sfthyphen -92 -KPX five acute -92 -KPX five mu -92 -KPX five paragraph -92 -KPX five periodcentered -92 -KPX five cedilla -92 -KPX five guillemotright -92 -KPX five onequarter -92 -KPX five onehalf -92 -KPX five threequarters -92 -KPX five questiondown -112 -KPX five Aacute -112 -KPX five Egrave -102 -KPX five Icircumflex -102 -KPX five Yacute -92 -KPX five Hbar -149 -KPX five dotlessi -92 -KPX five lacute -131 - -KPX six dollar 38 - -KPX seven dollar -159 -KPX seven ampersand -120 -KPX seven seven -36 -KPX seven D -339 -KPX seven F -348 -KPX seven H -348 -KPX seven L -63 -KPX seven R -348 -KPX seven U -301 -KPX seven V -339 -KPX seven X -311 -KPX seven Z -339 -KPX seven backslash -319 -KPX seven m -188 -KPX seven braceright -112 -KPX seven cent -239 -KPX seven sterling -339 -KPX seven currency -239 -KPX seven yen -239 -KPX seven brokenbar -239 -KPX seven section -239 -KPX seven copyright -348 -KPX seven ordfeminine -288 -KPX seven guillemotleft -348 -KPX seven logicalnot -288 -KPX seven sfthyphen -288 -KPX seven acute -268 -KPX seven mu -348 -KPX seven paragraph -268 -KPX seven periodcentered -268 -KPX seven cedilla -268 -KPX seven guillemotright -281 -KPX seven onequarter -311 -KPX seven onehalf -281 -KPX seven threequarters -281 -KPX seven questiondown -319 -KPX seven Aacute -319 -KPX seven Egrave -120 -KPX seven Eacute -348 -KPX seven Icircumflex -120 -KPX seven Idieresis -348 -KPX seven Yacute -348 -KPX seven edotaccent -301 -KPX seven ecaron -301 -KPX seven gdotaccent -339 -KPX seven gcommaaccent -339 -KPX seven Hbar -36 -KPX seven dotlessi -311 - -KPX eight equal -36 -KPX eight Ldot -36 - -KPX nine dollar -131 -KPX nine two -36 -KPX nine D -159 -KPX nine H -159 -KPX nine L -45 -KPX nine R -159 -KPX nine X -139 -KPX nine backslash -55 -KPX nine m -178 -KPX nine braceright -112 -KPX nine cent -159 -KPX nine sterling -159 -KPX nine currency -159 -KPX nine yen -159 -KPX nine brokenbar -159 -KPX nine section -159 -KPX nine ordfeminine -159 -KPX nine guillemotleft -159 -KPX nine logicalnot -159 -KPX nine sfthyphen -159 -KPX nine acute -159 -KPX nine mu -159 -KPX nine paragraph -159 -KPX nine periodcentered -159 -KPX nine cedilla -159 -KPX nine guillemotright -139 -KPX nine onequarter -139 -KPX nine onehalf -139 -KPX nine threequarters -139 -KPX nine questiondown -55 -KPX nine Aacute -55 -KPX nine Yacute -159 -KPX nine dotlessi -139 - -KPX colon dollar -112 -KPX colon D -131 -KPX colon H -120 -KPX colon L -45 -KPX colon R -120 -KPX colon U -92 -KPX colon X -73 -KPX colon backslash -36 -KPX colon m -112 -KPX colon braceright -36 -KPX colon cent -131 -KPX colon sterling -131 -KPX colon currency -131 -KPX colon yen -131 -KPX colon brokenbar -131 -KPX colon section -131 -KPX colon ordfeminine -120 -KPX colon guillemotleft -120 -KPX colon logicalnot -120 -KPX colon sfthyphen -120 -KPX colon acute -120 -KPX colon mu -120 -KPX colon paragraph -120 -KPX colon periodcentered -120 -KPX colon cedilla -120 -KPX colon guillemotright -73 -KPX colon onequarter -73 -KPX colon onehalf -73 -KPX colon threequarters -73 -KPX colon questiondown -36 -KPX colon Aacute -36 -KPX colon Yacute -120 -KPX colon edotaccent -92 -KPX colon ecaron -92 -KPX colon dotlessi -73 - -KPX semicolon ampersand -149 -KPX semicolon two -131 -KPX semicolon seven -36 -KPX semicolon H -92 -KPX semicolon m -112 -KPX semicolon ordfeminine -92 -KPX semicolon guillemotleft -92 -KPX semicolon logicalnot -92 -KPX semicolon sfthyphen -92 -KPX semicolon Egrave -149 -KPX semicolon Icircumflex -149 -KPX semicolon Yacute -92 -KPX semicolon Hbar -36 - -KPX less dollar -159 -KPX less ampersand -112 -KPX less two -112 -KPX less D -282 -KPX less H -272 -KPX less L -73 -KPX less R -272 -KPX less X -235 -KPX less m -225 -KPX less braceright -149 -KPX less cent -282 -KPX less sterling -282 -KPX less currency -282 -KPX less yen -282 -KPX less brokenbar -282 -KPX less section -282 -KPX less ordfeminine -272 -KPX less guillemotleft -272 -KPX less logicalnot -272 -KPX less sfthyphen -272 -KPX less acute -272 -KPX less mu -272 -KPX less paragraph -272 -KPX less periodcentered -272 -KPX less cedilla -272 -KPX less guillemotright -235 -KPX less onequarter -235 -KPX less onehalf -235 -KPX less threequarters -235 -KPX less Egrave -112 -KPX less Icircumflex -112 -KPX less Yacute -272 -KPX less dotlessi -235 - - -KPX H bracketleft -36 - -KPX I W -36 -KPX I Z -36 -KPX I backslash -36 -KPX I m -73 -KPX I braceright -36 -KPX I questiondown -36 -KPX I Aacute -36 -KPX I hbar -36 - -KPX N D -36 -KPX N H -73 -KPX N R -73 -KPX N X -63 -KPX N backslash -73 -KPX N cent -36 -KPX N sterling -36 -KPX N currency -36 -KPX N yen -36 -KPX N brokenbar -36 -KPX N section -36 -KPX N ordfeminine -73 -KPX N guillemotleft -73 -KPX N logicalnot -73 -KPX N sfthyphen -73 -KPX N acute -73 -KPX N mu -73 -KPX N paragraph -73 -KPX N periodcentered -73 -KPX N cedilla -73 -KPX N guillemotright -63 -KPX N onequarter -63 -KPX N onehalf -63 -KPX N threequarters -63 -KPX N questiondown -73 -KPX N Aacute -73 -KPX N Yacute -73 -KPX N dotlessi -63 - - -KPX R bracketleft -63 - -KPX U F -45 -KPX U G -36 -KPX U H -45 -KPX U J -36 -KPX U K -36 -KPX U P -36 -KPX U Q -36 -KPX U R -45 -KPX U T -36 -KPX U U -36 -KPX U bracketleft -55 -KPX U m -73 -KPX U copyright -45 -KPX U ordfeminine -45 -KPX U guillemotleft -45 -KPX U logicalnot -45 -KPX U sfthyphen -45 -KPX U threesuperior -36 -KPX U acute -45 -KPX U mu -45 -KPX U paragraph -45 -KPX U periodcentered -45 -KPX U cedilla -45 -KPX U Eacute -45 -KPX U Idieresis -45 -KPX U Ntilde 72 -KPX U Yacute -45 -KPX U aacute -36 -KPX U Cdotaccent -36 -KPX U edotaccent -36 -KPX U ecaron -36 - -KPX Y m -36 -KPX Y braceright -36 - -KPX Z m -36 -KPX Z braceright -36 - -KPX bracketleft F -36 -KPX bracketleft H -63 -KPX bracketleft R -63 -KPX bracketleft copyright -36 -KPX bracketleft ordfeminine -63 -KPX bracketleft guillemotleft -63 -KPX bracketleft logicalnot -63 -KPX bracketleft sfthyphen -63 -KPX bracketleft acute -63 -KPX bracketleft mu -63 -KPX bracketleft paragraph -63 -KPX bracketleft periodcentered -63 -KPX bracketleft cedilla -63 -KPX bracketleft Eacute -36 -KPX bracketleft Idieresis -36 -KPX bracketleft Yacute -63 - -KPX backslash m -36 -KPX backslash braceright -36 - -KPX m percent -36 -KPX m ampersand -36 -KPX m quotesingle -36 -KPX m asterisk -36 -KPX m hyphen -36 -KPX m seven -112 -KPX m nine -112 -KPX m colon -36 -KPX m less -149 -KPX m Y -36 -KPX m Z -36 -KPX m backslash -36 -KPX m questiondown -36 -KPX m Aacute -36 -KPX m Egrave -36 -KPX m Icircumflex -36 -KPX m Eth -36 -KPX m agrave -36 -KPX m Hbar -112 -KPX m lacute -149 - -KPX braceright dollar -73 -KPX braceright percent -73 -KPX braceright ampersand -36 -KPX braceright quotesingle -36 -KPX braceright hyphen -36 -KPX braceright two -36 -KPX braceright seven -188 -KPX braceright nine -178 -KPX braceright colon -112 -KPX braceright semicolon -112 -KPX braceright less -225 -KPX braceright Y -36 -KPX braceright Z -36 -KPX braceright backslash -36 -KPX braceright questiondown -36 -KPX braceright Aacute -36 -KPX braceright Egrave -36 -KPX braceright Icircumflex -36 -KPX braceright Eth -36 -KPX braceright Hbar -188 -KPX braceright lacute -225 - - - -KPX ordfeminine bracketleft -36 - -KPX guillemotleft bracketleft -36 - -KPX logicalnot bracketleft -36 - -KPX sfthyphen bracketleft -36 - - - -KPX acute bracketleft -63 - -KPX mu bracketleft -63 - -KPX paragraph bracketleft -63 - -KPX periodcentered bracketleft -63 - -KPX cedilla bracketleft -63 - -KPX questiondown m -36 -KPX questiondown braceright -36 - -KPX Aacute m -36 -KPX Aacute braceright -36 - -KPX Acircumflex dollar 57 -KPX Acircumflex ampersand -36 -KPX Acircumflex asterisk -36 -KPX Acircumflex two -36 -KPX Acircumflex four -36 -KPX Acircumflex seven -159 -KPX Acircumflex nine -131 -KPX Acircumflex colon -112 -KPX Acircumflex less -159 -KPX Acircumflex F -36 -KPX Acircumflex G -36 -KPX Acircumflex H -36 -KPX Acircumflex I -73 -KPX Acircumflex R -36 -KPX Acircumflex T -36 -KPX Acircumflex W -36 -KPX Acircumflex Y -120 -KPX Acircumflex Z -83 -KPX Acircumflex backslash -139 -KPX Acircumflex m -73 -KPX Acircumflex copyright -36 -KPX Acircumflex ordfeminine -36 -KPX Acircumflex guillemotleft -36 -KPX Acircumflex logicalnot -36 -KPX Acircumflex sfthyphen -36 -KPX Acircumflex acute -36 -KPX Acircumflex mu -36 -KPX Acircumflex paragraph -36 -KPX Acircumflex periodcentered -36 -KPX Acircumflex cedilla -36 -KPX Acircumflex questiondown -139 -KPX Acircumflex Aacute -139 -KPX Acircumflex Acircumflex 57 -KPX Acircumflex Adieresis 57 -KPX Acircumflex AE 57 -KPX Acircumflex Egrave -36 -KPX Acircumflex Ecircumflex -36 -KPX Acircumflex Igrave -36 -KPX Acircumflex Iacute -36 -KPX Acircumflex Icircumflex -36 -KPX Acircumflex Ntilde -36 -KPX Acircumflex Oacute -36 -KPX Acircumflex Otilde -36 -KPX Acircumflex multiply -36 -KPX Acircumflex Ugrave -36 -KPX Acircumflex Ucircumflex -36 -KPX Acircumflex Yacute -36 -KPX Acircumflex Thorn -36 -KPX Acircumflex acircumflex -36 -KPX Acircumflex Dcaron -36 -KPX Acircumflex dcaron -36 -KPX Acircumflex Dcroat -36 -KPX Acircumflex dmacron -36 -KPX Acircumflex Emacron -36 -KPX Acircumflex emacron -36 -KPX Acircumflex Hcircumflex -159 -KPX Acircumflex hcircumflex -36 -KPX Acircumflex Hbar -159 -KPX Acircumflex hbar -36 -KPX Acircumflex Kcommaaccent -112 -KPX Acircumflex kcommaaccent -83 -KPX Acircumflex kgreenlandic -159 -KPX Acircumflex Lacute -139 -KPX Acircumflex lacute -159 -KPX Acircumflex uni01F0 -36 -KPX Acircumflex uni01F1 -36 - -KPX Adieresis dollar 57 -KPX Adieresis ampersand -36 -KPX Adieresis asterisk -36 -KPX Adieresis two -36 -KPX Adieresis four -36 -KPX Adieresis seven -159 -KPX Adieresis nine -131 -KPX Adieresis colon -112 -KPX Adieresis less -159 -KPX Adieresis F -36 -KPX Adieresis G -36 -KPX Adieresis H -36 -KPX Adieresis I -73 -KPX Adieresis R -36 -KPX Adieresis T -36 -KPX Adieresis W -36 -KPX Adieresis Y -120 -KPX Adieresis Z -83 -KPX Adieresis backslash -139 -KPX Adieresis m -73 -KPX Adieresis copyright -36 -KPX Adieresis ordfeminine -36 -KPX Adieresis guillemotleft -36 -KPX Adieresis logicalnot -36 -KPX Adieresis sfthyphen -36 -KPX Adieresis acute -36 -KPX Adieresis mu -36 -KPX Adieresis paragraph -36 -KPX Adieresis periodcentered -36 -KPX Adieresis cedilla -36 -KPX Adieresis questiondown -139 -KPX Adieresis Aacute -139 -KPX Adieresis Acircumflex 57 -KPX Adieresis Adieresis 57 -KPX Adieresis AE 57 -KPX Adieresis Egrave -36 -KPX Adieresis Ecircumflex -36 -KPX Adieresis Igrave -36 -KPX Adieresis Iacute -36 -KPX Adieresis Icircumflex -36 -KPX Adieresis Ntilde -36 -KPX Adieresis Oacute -36 -KPX Adieresis Otilde -36 -KPX Adieresis multiply -36 -KPX Adieresis Ugrave -36 -KPX Adieresis Ucircumflex -36 -KPX Adieresis Yacute -36 -KPX Adieresis Thorn -36 -KPX Adieresis acircumflex -36 -KPX Adieresis Dcaron -36 -KPX Adieresis dcaron -36 -KPX Adieresis Dcroat -36 -KPX Adieresis dmacron -36 -KPX Adieresis Emacron -36 -KPX Adieresis emacron -36 -KPX Adieresis Hcircumflex -159 -KPX Adieresis hcircumflex -36 -KPX Adieresis Hbar -159 -KPX Adieresis hbar -36 -KPX Adieresis Kcommaaccent -112 -KPX Adieresis kcommaaccent -83 -KPX Adieresis kgreenlandic -159 -KPX Adieresis Lacute -139 -KPX Adieresis lacute -159 -KPX Adieresis uni01F0 -36 -KPX Adieresis uni01F1 -36 - -KPX AE dollar 57 -KPX AE ampersand -36 -KPX AE asterisk -36 -KPX AE two -36 -KPX AE four -36 -KPX AE seven -159 -KPX AE nine -131 -KPX AE colon -112 -KPX AE less -159 -KPX AE F -36 -KPX AE G -36 -KPX AE H -36 -KPX AE I -73 -KPX AE R -36 -KPX AE T -36 -KPX AE W -36 -KPX AE Y -120 -KPX AE Z -83 -KPX AE m -73 -KPX AE copyright -36 -KPX AE ordfeminine -36 -KPX AE guillemotleft -36 -KPX AE logicalnot -36 -KPX AE sfthyphen -36 -KPX AE acute -36 -KPX AE mu -36 -KPX AE paragraph -36 -KPX AE periodcentered -36 -KPX AE cedilla -36 -KPX AE Acircumflex 57 -KPX AE Adieresis 57 -KPX AE AE 57 -KPX AE Egrave -36 -KPX AE Ecircumflex -36 -KPX AE Igrave -36 -KPX AE Iacute -36 -KPX AE Icircumflex -36 -KPX AE Ntilde -36 -KPX AE Oacute -36 -KPX AE Otilde -36 -KPX AE multiply -36 -KPX AE Ugrave -36 -KPX AE Ucircumflex -36 -KPX AE Yacute -36 -KPX AE Thorn -36 -KPX AE acircumflex -36 -KPX AE Dcaron -36 -KPX AE dcaron -36 -KPX AE Dcroat -36 -KPX AE dmacron -36 -KPX AE emacron -36 -KPX AE Hcircumflex -159 -KPX AE hcircumflex -36 -KPX AE Hbar -159 -KPX AE hbar -36 -KPX AE Kcommaaccent -112 -KPX AE kcommaaccent -83 -KPX AE kgreenlandic -159 -KPX AE lacute -159 -KPX AE uni01F0 -36 -KPX AE uni01F1 -36 - -KPX Egrave less -36 -KPX Egrave m -36 -KPX Egrave braceright -36 -KPX Egrave lacute -36 - -KPX Icircumflex less -36 -KPX Icircumflex m -36 -KPX Icircumflex braceright -36 -KPX Icircumflex lacute -36 - -KPX Eth dollar -36 -KPX Eth nine -36 -KPX Eth less -112 -KPX Eth m -36 -KPX Eth braceright -36 -KPX Eth Acircumflex -36 -KPX Eth Adieresis -36 -KPX Eth AE -36 -KPX Eth kgreenlandic -112 -KPX Eth lacute -112 -KPX Eth uni01F4 -112 - -KPX Ograve dollar -36 -KPX Ograve nine -36 -KPX Ograve less -112 -KPX Ograve m -36 -KPX Ograve braceright -36 -KPX Ograve lacute -112 - -KPX Yacute bracketleft -36 - -KPX agrave seven -73 -KPX agrave less -102 -KPX agrave m -36 -KPX agrave braceright -36 -KPX agrave Hbar -73 -KPX agrave lacute -102 - -KPX ucircumflex dollar 47 -KPX ucircumflex two -73 -KPX ucircumflex seven -282 -KPX ucircumflex eight -102 -KPX ucircumflex nine -225 -KPX ucircumflex colon -188 -KPX ucircumflex less -272 -KPX ucircumflex H -36 -KPX ucircumflex R -36 -KPX ucircumflex X -36 -KPX ucircumflex backslash -188 -KPX ucircumflex ordfeminine -36 -KPX ucircumflex guillemotleft -36 -KPX ucircumflex logicalnot -36 -KPX ucircumflex sfthyphen -36 -KPX ucircumflex acute -36 -KPX ucircumflex mu -36 -KPX ucircumflex paragraph -36 -KPX ucircumflex periodcentered -36 -KPX ucircumflex cedilla -36 -KPX ucircumflex guillemotright -36 -KPX ucircumflex onequarter -36 -KPX ucircumflex onehalf -36 -KPX ucircumflex threequarters -36 -KPX ucircumflex questiondown -188 -KPX ucircumflex Aacute -188 -KPX ucircumflex Yacute -36 -KPX ucircumflex Hbar -282 -KPX ucircumflex Idot -102 -KPX ucircumflex dotlessi -36 -KPX ucircumflex lacute -272 - -KPX ydieresis dollar 47 -KPX ydieresis two -73 -KPX ydieresis seven -282 -KPX ydieresis eight -102 -KPX ydieresis nine -225 -KPX ydieresis colon -188 -KPX ydieresis less -272 -KPX ydieresis H -36 -KPX ydieresis R -36 -KPX ydieresis X -36 -KPX ydieresis backslash -188 -KPX ydieresis ordfeminine -36 -KPX ydieresis guillemotleft -36 -KPX ydieresis logicalnot -36 -KPX ydieresis sfthyphen -36 -KPX ydieresis acute -36 -KPX ydieresis mu -36 -KPX ydieresis paragraph -36 -KPX ydieresis periodcentered -36 -KPX ydieresis cedilla -36 -KPX ydieresis guillemotright -36 -KPX ydieresis onequarter -36 -KPX ydieresis onehalf -36 -KPX ydieresis threequarters -36 -KPX ydieresis questiondown -188 -KPX ydieresis Aacute -188 -KPX ydieresis Yacute -36 -KPX ydieresis Hbar -282 -KPX ydieresis Idot -102 -KPX ydieresis dotlessi -36 -KPX ydieresis lacute -272 - -KPX Abreve O -193 - - -KPX Edotaccent dollar -83 -KPX Edotaccent ampersand -102 -KPX Edotaccent seven -149 -KPX Edotaccent nine -112 -KPX Edotaccent colon -83 -KPX Edotaccent less -131 -KPX Edotaccent D -45 -KPX Edotaccent H -92 -KPX Edotaccent R -92 -KPX Edotaccent X -92 -KPX Edotaccent backslash -112 -KPX Edotaccent m -112 -KPX Edotaccent braceright -36 -KPX Edotaccent cent -45 -KPX Edotaccent sterling -45 -KPX Edotaccent currency -45 -KPX Edotaccent yen -45 -KPX Edotaccent brokenbar -45 -KPX Edotaccent section -45 -KPX Edotaccent ordfeminine -92 -KPX Edotaccent guillemotleft -92 -KPX Edotaccent logicalnot -92 -KPX Edotaccent sfthyphen -92 -KPX Edotaccent acute -92 -KPX Edotaccent mu -92 -KPX Edotaccent paragraph -92 -KPX Edotaccent periodcentered -92 -KPX Edotaccent cedilla -92 -KPX Edotaccent guillemotright -92 -KPX Edotaccent onequarter -92 -KPX Edotaccent onehalf -92 -KPX Edotaccent threequarters -92 -KPX Edotaccent questiondown -112 -KPX Edotaccent Aacute -112 -KPX Edotaccent Egrave -102 -KPX Edotaccent Icircumflex -102 -KPX Edotaccent Yacute -92 -KPX Edotaccent Hbar -149 -KPX Edotaccent dotlessi -92 -KPX Edotaccent lacute -131 - -KPX edotaccent F -45 -KPX edotaccent G -36 -KPX edotaccent H -45 -KPX edotaccent J -36 -KPX edotaccent K -36 -KPX edotaccent P -36 -KPX edotaccent Q -36 -KPX edotaccent R -45 -KPX edotaccent T -36 -KPX edotaccent U -36 -KPX edotaccent bracketleft -55 -KPX edotaccent m -73 -KPX edotaccent copyright -45 -KPX edotaccent ordfeminine -45 -KPX edotaccent guillemotleft -45 -KPX edotaccent logicalnot -45 -KPX edotaccent sfthyphen -45 -KPX edotaccent threesuperior -36 -KPX edotaccent acute -45 -KPX edotaccent mu -45 -KPX edotaccent paragraph -45 -KPX edotaccent periodcentered -45 -KPX edotaccent cedilla -45 -KPX edotaccent Eacute -45 -KPX edotaccent Idieresis -45 -KPX edotaccent Ntilde 72 -KPX edotaccent Yacute -45 -KPX edotaccent aacute -36 -KPX edotaccent Cdotaccent -36 -KPX edotaccent edotaccent -36 -KPX edotaccent ecaron -36 - -KPX Ecaron dollar -83 -KPX Ecaron ampersand -102 -KPX Ecaron seven -149 -KPX Ecaron nine -112 -KPX Ecaron colon -83 -KPX Ecaron less -131 -KPX Ecaron D -45 -KPX Ecaron H -92 -KPX Ecaron R -92 -KPX Ecaron X -92 -KPX Ecaron backslash -112 -KPX Ecaron m -112 -KPX Ecaron braceright -36 -KPX Ecaron cent -45 -KPX Ecaron sterling -45 -KPX Ecaron currency -45 -KPX Ecaron yen -45 -KPX Ecaron brokenbar -45 -KPX Ecaron section -45 -KPX Ecaron ordfeminine -92 -KPX Ecaron guillemotleft -92 -KPX Ecaron logicalnot -92 -KPX Ecaron sfthyphen -92 -KPX Ecaron acute -92 -KPX Ecaron mu -92 -KPX Ecaron paragraph -92 -KPX Ecaron periodcentered -92 -KPX Ecaron cedilla -92 -KPX Ecaron guillemotright -92 -KPX Ecaron onequarter -92 -KPX Ecaron onehalf -92 -KPX Ecaron threequarters -92 -KPX Ecaron questiondown -112 -KPX Ecaron Aacute -112 -KPX Ecaron Egrave -102 -KPX Ecaron Icircumflex -102 -KPX Ecaron Yacute -92 -KPX Ecaron Hbar -149 -KPX Ecaron dotlessi -92 -KPX Ecaron lacute -131 - -KPX ecaron F -45 -KPX ecaron G -36 -KPX ecaron H -45 -KPX ecaron J -36 -KPX ecaron K -36 -KPX ecaron P -36 -KPX ecaron Q -36 -KPX ecaron R -45 -KPX ecaron T -36 -KPX ecaron U -36 -KPX ecaron bracketleft -55 -KPX ecaron m -73 -KPX ecaron copyright -45 -KPX ecaron ordfeminine -45 -KPX ecaron guillemotleft -45 -KPX ecaron logicalnot -45 -KPX ecaron sfthyphen -45 -KPX ecaron threesuperior -36 -KPX ecaron acute -45 -KPX ecaron mu -45 -KPX ecaron paragraph -45 -KPX ecaron periodcentered -45 -KPX ecaron cedilla -45 -KPX ecaron Eacute -45 -KPX ecaron Idieresis -45 -KPX ecaron Ntilde -36 -KPX ecaron Yacute -45 -KPX ecaron aacute -36 -KPX ecaron Cdotaccent -36 -KPX ecaron edotaccent -36 -KPX ecaron ecaron -36 - -KPX Gdotaccent dollar 38 - -KPX Gcommaaccent dollar 38 - -KPX Hbar dollar -159 -KPX Hbar ampersand -120 -KPX Hbar seven -36 -KPX Hbar D -339 -KPX Hbar F -348 -KPX Hbar H -348 -KPX Hbar L -63 -KPX Hbar R -348 -KPX Hbar U -301 -KPX Hbar V -339 -KPX Hbar X -311 -KPX Hbar Z -339 -KPX Hbar backslash -319 -KPX Hbar m -188 -KPX Hbar braceright -112 -KPX Hbar cent -339 -KPX Hbar sterling -339 -KPX Hbar currency -339 -KPX Hbar yen -339 -KPX Hbar brokenbar -339 -KPX Hbar section -339 -KPX Hbar copyright -348 -KPX Hbar ordfeminine -348 -KPX Hbar guillemotleft -348 -KPX Hbar logicalnot -348 -KPX Hbar sfthyphen -348 -KPX Hbar acute -348 -KPX Hbar mu -348 -KPX Hbar paragraph -348 -KPX Hbar periodcentered -348 -KPX Hbar cedilla -348 -KPX Hbar guillemotright -311 -KPX Hbar onequarter -311 -KPX Hbar onehalf -311 -KPX Hbar threequarters -311 -KPX Hbar questiondown -319 -KPX Hbar Aacute -319 -KPX Hbar Egrave -120 -KPX Hbar Eacute -348 -KPX Hbar Icircumflex -120 -KPX Hbar Idieresis -348 -KPX Hbar Yacute -348 -KPX Hbar edotaccent -301 -KPX Hbar ecaron -301 -KPX Hbar gdotaccent -339 -KPX Hbar gcommaaccent -339 -KPX Hbar Hbar -36 -KPX Hbar dotlessi -311 - -KPX Idot equal -36 -KPX Idot Ldot -36 - -KPX lacute dollar -159 -KPX lacute ampersand -112 -KPX lacute two -112 -KPX lacute D -282 -KPX lacute H -272 -KPX lacute L -73 -KPX lacute R -272 -KPX lacute X -235 -KPX lacute m -225 -KPX lacute braceright -149 -KPX lacute cent -282 -KPX lacute sterling -282 -KPX lacute currency -282 -KPX lacute yen -282 -KPX lacute brokenbar -282 -KPX lacute section -282 -KPX lacute ordfeminine -272 -KPX lacute guillemotleft -272 -KPX lacute logicalnot -272 -KPX lacute sfthyphen -272 -KPX lacute acute -272 -KPX lacute mu -272 -KPX lacute paragraph -272 -KPX lacute periodcentered -272 -KPX lacute cedilla -272 -KPX lacute guillemotright -235 -KPX lacute onequarter -235 -KPX lacute onehalf -235 -KPX lacute threequarters -235 -KPX lacute Egrave -112 -KPX lacute Icircumflex -112 -KPX lacute Yacute -272 -KPX lacute dotlessi -235 - -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ttf deleted file mode 100644 index 8184ced..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ufm deleted file mode 100644 index d598e20..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ufm +++ /dev/null @@ -1,3285 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Sans Mono -FontSubfamily Bold -UniqueID DejaVu Sans Mono Bold -FullName DejaVu Sans Mono Bold -Version Version 2.37 -PostScriptName DejaVuSansMono-Bold -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -Weight Bold -ItalicAngle 0 -IsFixedPitch true -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 928 -Descender -236 -FontBBox -447 -394 731 1041 -StartCharMetrics 3316 -U 32 ; WX 602 ; N space ; G 3 -U 33 ; WX 602 ; N exclam ; G 4 -U 34 ; WX 602 ; N quotedbl ; G 5 -U 35 ; WX 602 ; N numbersign ; G 6 -U 36 ; WX 602 ; N dollar ; G 7 -U 37 ; WX 602 ; N percent ; G 8 -U 38 ; WX 602 ; N ampersand ; G 9 -U 39 ; WX 602 ; N quotesingle ; G 10 -U 40 ; WX 602 ; N parenleft ; G 11 -U 41 ; WX 602 ; N parenright ; G 12 -U 42 ; WX 602 ; N asterisk ; G 13 -U 43 ; WX 602 ; N plus ; G 14 -U 44 ; WX 602 ; N comma ; G 15 -U 45 ; WX 602 ; N hyphen ; G 16 -U 46 ; WX 602 ; N period ; G 17 -U 47 ; WX 602 ; N slash ; G 18 -U 48 ; WX 602 ; N zero ; G 19 -U 49 ; WX 602 ; N one ; G 20 -U 50 ; WX 602 ; N two ; G 21 -U 51 ; WX 602 ; N three ; G 22 -U 52 ; WX 602 ; N four ; G 23 -U 53 ; WX 602 ; N five ; G 24 -U 54 ; WX 602 ; N six ; G 25 -U 55 ; WX 602 ; N seven ; G 26 -U 56 ; WX 602 ; N eight ; G 27 -U 57 ; WX 602 ; N nine ; G 28 -U 58 ; WX 602 ; N colon ; G 29 -U 59 ; WX 602 ; N semicolon ; G 30 -U 60 ; WX 602 ; N less ; G 31 -U 61 ; WX 602 ; N equal ; G 32 -U 62 ; WX 602 ; N greater ; G 33 -U 63 ; WX 602 ; N question ; G 34 -U 64 ; WX 602 ; N at ; G 35 -U 65 ; WX 602 ; N A ; G 36 -U 66 ; WX 602 ; N B ; G 37 -U 67 ; WX 602 ; N C ; G 38 -U 68 ; WX 602 ; N D ; G 39 -U 69 ; WX 602 ; N E ; G 40 -U 70 ; WX 602 ; N F ; G 41 -U 71 ; WX 602 ; N G ; G 42 -U 72 ; WX 602 ; N H ; G 43 -U 73 ; WX 602 ; N I ; G 44 -U 74 ; WX 602 ; N J ; G 45 -U 75 ; WX 602 ; N K ; G 46 -U 76 ; WX 602 ; N L ; G 47 -U 77 ; WX 602 ; N M ; G 48 -U 78 ; WX 602 ; N N ; G 49 -U 79 ; WX 602 ; N O ; G 50 -U 80 ; WX 602 ; N P ; G 51 -U 81 ; WX 602 ; N Q ; G 52 -U 82 ; WX 602 ; N R ; G 53 -U 83 ; WX 602 ; N S ; G 54 -U 84 ; WX 602 ; N T ; G 55 -U 85 ; WX 602 ; N U ; G 56 -U 86 ; WX 602 ; N V ; G 57 -U 87 ; WX 602 ; N W ; G 58 -U 88 ; WX 602 ; N X ; G 59 -U 89 ; WX 602 ; N Y ; G 60 -U 90 ; WX 602 ; N Z ; G 61 -U 91 ; WX 602 ; N bracketleft ; G 62 -U 92 ; WX 602 ; N backslash ; G 63 -U 93 ; WX 602 ; N bracketright ; G 64 -U 94 ; WX 602 ; N asciicircum ; G 65 -U 95 ; WX 602 ; N underscore ; G 66 -U 96 ; WX 602 ; N grave ; G 67 -U 97 ; WX 602 ; N a ; G 68 -U 98 ; WX 602 ; N b ; G 69 -U 99 ; WX 602 ; N c ; G 70 -U 100 ; WX 602 ; N d ; G 71 -U 101 ; WX 602 ; N e ; G 72 -U 102 ; WX 602 ; N f ; G 73 -U 103 ; WX 602 ; N g ; G 74 -U 104 ; WX 602 ; N h ; G 75 -U 105 ; WX 602 ; N i ; G 76 -U 106 ; WX 602 ; N j ; G 77 -U 107 ; WX 602 ; N k ; G 78 -U 108 ; WX 602 ; N l ; G 79 -U 109 ; WX 602 ; N m ; G 80 -U 110 ; WX 602 ; N n ; G 81 -U 111 ; WX 602 ; N o ; G 82 -U 112 ; WX 602 ; N p ; G 83 -U 113 ; WX 602 ; N q ; G 84 -U 114 ; WX 602 ; N r ; G 85 -U 115 ; WX 602 ; N s ; G 86 -U 116 ; WX 602 ; N t ; G 87 -U 117 ; WX 602 ; N u ; G 88 -U 118 ; WX 602 ; N v ; G 89 -U 119 ; WX 602 ; N w ; G 90 -U 120 ; WX 602 ; N x ; G 91 -U 121 ; WX 602 ; N y ; G 92 -U 122 ; WX 602 ; N z ; G 93 -U 123 ; WX 602 ; N braceleft ; G 94 -U 124 ; WX 602 ; N bar ; G 95 -U 125 ; WX 602 ; N braceright ; G 96 -U 126 ; WX 602 ; N asciitilde ; G 97 -U 160 ; WX 602 ; N nbspace ; G 98 -U 161 ; WX 602 ; N exclamdown ; G 99 -U 162 ; WX 602 ; N cent ; G 100 -U 163 ; WX 602 ; N sterling ; G 101 -U 164 ; WX 602 ; N currency ; G 102 -U 165 ; WX 602 ; N yen ; G 103 -U 166 ; WX 602 ; N brokenbar ; G 104 -U 167 ; WX 602 ; N section ; G 105 -U 168 ; WX 602 ; N dieresis ; G 106 -U 169 ; WX 602 ; N copyright ; G 107 -U 170 ; WX 602 ; N ordfeminine ; G 108 -U 171 ; WX 602 ; N guillemotleft ; G 109 -U 172 ; WX 602 ; N logicalnot ; G 110 -U 173 ; WX 602 ; N sfthyphen ; G 111 -U 174 ; WX 602 ; N registered ; G 112 -U 175 ; WX 602 ; N macron ; G 113 -U 176 ; WX 602 ; N degree ; G 114 -U 177 ; WX 602 ; N plusminus ; G 115 -U 178 ; WX 602 ; N twosuperior ; G 116 -U 179 ; WX 602 ; N threesuperior ; G 117 -U 180 ; WX 602 ; N acute ; G 118 -U 181 ; WX 602 ; N mu ; G 119 -U 182 ; WX 602 ; N paragraph ; G 120 -U 183 ; WX 602 ; N periodcentered ; G 121 -U 184 ; WX 602 ; N cedilla ; G 122 -U 185 ; WX 602 ; N onesuperior ; G 123 -U 186 ; WX 602 ; N ordmasculine ; G 124 -U 187 ; WX 602 ; N guillemotright ; G 125 -U 188 ; WX 602 ; N onequarter ; G 126 -U 189 ; WX 602 ; N onehalf ; G 127 -U 190 ; WX 602 ; N threequarters ; G 128 -U 191 ; WX 602 ; N questiondown ; G 129 -U 192 ; WX 602 ; N Agrave ; G 130 -U 193 ; WX 602 ; N Aacute ; G 131 -U 194 ; WX 602 ; N Acircumflex ; G 132 -U 195 ; WX 602 ; N Atilde ; G 133 -U 196 ; WX 602 ; N Adieresis ; G 134 -U 197 ; WX 602 ; N Aring ; G 135 -U 198 ; WX 602 ; N AE ; G 136 -U 199 ; WX 602 ; N Ccedilla ; G 137 -U 200 ; WX 602 ; N Egrave ; G 138 -U 201 ; WX 602 ; N Eacute ; G 139 -U 202 ; WX 602 ; N Ecircumflex ; G 140 -U 203 ; WX 602 ; N Edieresis ; G 141 -U 204 ; WX 602 ; N Igrave ; G 142 -U 205 ; WX 602 ; N Iacute ; G 143 -U 206 ; WX 602 ; N Icircumflex ; G 144 -U 207 ; WX 602 ; N Idieresis ; G 145 -U 208 ; WX 602 ; N Eth ; G 146 -U 209 ; WX 602 ; N Ntilde ; G 147 -U 210 ; WX 602 ; N Ograve ; G 148 -U 211 ; WX 602 ; N Oacute ; G 149 -U 212 ; WX 602 ; N Ocircumflex ; G 150 -U 213 ; WX 602 ; N Otilde ; G 151 -U 214 ; WX 602 ; N Odieresis ; G 152 -U 215 ; WX 602 ; N multiply ; G 153 -U 216 ; WX 602 ; N Oslash ; G 154 -U 217 ; WX 602 ; N Ugrave ; G 155 -U 218 ; WX 602 ; N Uacute ; G 156 -U 219 ; WX 602 ; N Ucircumflex ; G 157 -U 220 ; WX 602 ; N Udieresis ; G 158 -U 221 ; WX 602 ; N Yacute ; G 159 -U 222 ; WX 602 ; N Thorn ; G 160 -U 223 ; WX 602 ; N germandbls ; G 161 -U 224 ; WX 602 ; N agrave ; G 162 -U 225 ; WX 602 ; N aacute ; G 163 -U 226 ; WX 602 ; N acircumflex ; G 164 -U 227 ; WX 602 ; N atilde ; G 165 -U 228 ; WX 602 ; N adieresis ; G 166 -U 229 ; WX 602 ; N aring ; G 167 -U 230 ; WX 602 ; N ae ; G 168 -U 231 ; WX 602 ; N ccedilla ; G 169 -U 232 ; WX 602 ; N egrave ; G 170 -U 233 ; WX 602 ; N eacute ; G 171 -U 234 ; WX 602 ; N ecircumflex ; G 172 -U 235 ; WX 602 ; N edieresis ; G 173 -U 236 ; WX 602 ; N igrave ; G 174 -U 237 ; WX 602 ; N iacute ; G 175 -U 238 ; WX 602 ; N icircumflex ; G 176 -U 239 ; WX 602 ; N idieresis ; G 177 -U 240 ; WX 602 ; N eth ; G 178 -U 241 ; WX 602 ; N ntilde ; G 179 -U 242 ; WX 602 ; N ograve ; G 180 -U 243 ; WX 602 ; N oacute ; G 181 -U 244 ; WX 602 ; N ocircumflex ; G 182 -U 245 ; WX 602 ; N otilde ; G 183 -U 246 ; WX 602 ; N odieresis ; G 184 -U 247 ; WX 602 ; N divide ; G 185 -U 248 ; WX 602 ; N oslash ; G 186 -U 249 ; WX 602 ; N ugrave ; G 187 -U 250 ; WX 602 ; N uacute ; G 188 -U 251 ; WX 602 ; N ucircumflex ; G 189 -U 252 ; WX 602 ; N udieresis ; G 190 -U 253 ; WX 602 ; N yacute ; G 191 -U 254 ; WX 602 ; N thorn ; G 192 -U 255 ; WX 602 ; N ydieresis ; G 193 -U 256 ; WX 602 ; N Amacron ; G 194 -U 257 ; WX 602 ; N amacron ; G 195 -U 258 ; WX 602 ; N Abreve ; G 196 -U 259 ; WX 602 ; N abreve ; G 197 -U 260 ; WX 602 ; N Aogonek ; G 198 -U 261 ; WX 602 ; N aogonek ; G 199 -U 262 ; WX 602 ; N Cacute ; G 200 -U 263 ; WX 602 ; N cacute ; G 201 -U 264 ; WX 602 ; N Ccircumflex ; G 202 -U 265 ; WX 602 ; N ccircumflex ; G 203 -U 266 ; WX 602 ; N Cdotaccent ; G 204 -U 267 ; WX 602 ; N cdotaccent ; G 205 -U 268 ; WX 602 ; N Ccaron ; G 206 -U 269 ; WX 602 ; N ccaron ; G 207 -U 270 ; WX 602 ; N Dcaron ; G 208 -U 271 ; WX 602 ; N dcaron ; G 209 -U 272 ; WX 602 ; N Dcroat ; G 210 -U 273 ; WX 602 ; N dmacron ; G 211 -U 274 ; WX 602 ; N Emacron ; G 212 -U 275 ; WX 602 ; N emacron ; G 213 -U 276 ; WX 602 ; N Ebreve ; G 214 -U 277 ; WX 602 ; N ebreve ; G 215 -U 278 ; WX 602 ; N Edotaccent ; G 216 -U 279 ; WX 602 ; N edotaccent ; G 217 -U 280 ; WX 602 ; N Eogonek ; G 218 -U 281 ; WX 602 ; N eogonek ; G 219 -U 282 ; WX 602 ; N Ecaron ; G 220 -U 283 ; WX 602 ; N ecaron ; G 221 -U 284 ; WX 602 ; N Gcircumflex ; G 222 -U 285 ; WX 602 ; N gcircumflex ; G 223 -U 286 ; WX 602 ; N Gbreve ; G 224 -U 287 ; WX 602 ; N gbreve ; G 225 -U 288 ; WX 602 ; N Gdotaccent ; G 226 -U 289 ; WX 602 ; N gdotaccent ; G 227 -U 290 ; WX 602 ; N Gcommaaccent ; G 228 -U 291 ; WX 602 ; N gcommaaccent ; G 229 -U 292 ; WX 602 ; N Hcircumflex ; G 230 -U 293 ; WX 602 ; N hcircumflex ; G 231 -U 294 ; WX 602 ; N Hbar ; G 232 -U 295 ; WX 602 ; N hbar ; G 233 -U 296 ; WX 602 ; N Itilde ; G 234 -U 297 ; WX 602 ; N itilde ; G 235 -U 298 ; WX 602 ; N Imacron ; G 236 -U 299 ; WX 602 ; N imacron ; G 237 -U 300 ; WX 602 ; N Ibreve ; G 238 -U 301 ; WX 602 ; N ibreve ; G 239 -U 302 ; WX 602 ; N Iogonek ; G 240 -U 303 ; WX 602 ; N iogonek ; G 241 -U 304 ; WX 602 ; N Idot ; G 242 -U 305 ; WX 602 ; N dotlessi ; G 243 -U 306 ; WX 602 ; N IJ ; G 244 -U 307 ; WX 602 ; N ij ; G 245 -U 308 ; WX 602 ; N Jcircumflex ; G 246 -U 309 ; WX 602 ; N jcircumflex ; G 247 -U 310 ; WX 602 ; N Kcommaaccent ; G 248 -U 311 ; WX 602 ; N kcommaaccent ; G 249 -U 312 ; WX 602 ; N kgreenlandic ; G 250 -U 313 ; WX 602 ; N Lacute ; G 251 -U 314 ; WX 602 ; N lacute ; G 252 -U 315 ; WX 602 ; N Lcommaaccent ; G 253 -U 316 ; WX 602 ; N lcommaaccent ; G 254 -U 317 ; WX 602 ; N Lcaron ; G 255 -U 318 ; WX 602 ; N lcaron ; G 256 -U 319 ; WX 602 ; N Ldot ; G 257 -U 320 ; WX 602 ; N ldot ; G 258 -U 321 ; WX 602 ; N Lslash ; G 259 -U 322 ; WX 602 ; N lslash ; G 260 -U 323 ; WX 602 ; N Nacute ; G 261 -U 324 ; WX 602 ; N nacute ; G 262 -U 325 ; WX 602 ; N Ncommaaccent ; G 263 -U 326 ; WX 602 ; N ncommaaccent ; G 264 -U 327 ; WX 602 ; N Ncaron ; G 265 -U 328 ; WX 602 ; N ncaron ; G 266 -U 329 ; WX 602 ; N napostrophe ; G 267 -U 330 ; WX 602 ; N Eng ; G 268 -U 331 ; WX 602 ; N eng ; G 269 -U 332 ; WX 602 ; N Omacron ; G 270 -U 333 ; WX 602 ; N omacron ; G 271 -U 334 ; WX 602 ; N Obreve ; G 272 -U 335 ; WX 602 ; N obreve ; G 273 -U 336 ; WX 602 ; N Ohungarumlaut ; G 274 -U 337 ; WX 602 ; N ohungarumlaut ; G 275 -U 338 ; WX 602 ; N OE ; G 276 -U 339 ; WX 602 ; N oe ; G 277 -U 340 ; WX 602 ; N Racute ; G 278 -U 341 ; WX 602 ; N racute ; G 279 -U 342 ; WX 602 ; N Rcommaaccent ; G 280 -U 343 ; WX 602 ; N rcommaaccent ; G 281 -U 344 ; WX 602 ; N Rcaron ; G 282 -U 345 ; WX 602 ; N rcaron ; G 283 -U 346 ; WX 602 ; N Sacute ; G 284 -U 347 ; WX 602 ; N sacute ; G 285 -U 348 ; WX 602 ; N Scircumflex ; G 286 -U 349 ; WX 602 ; N scircumflex ; G 287 -U 350 ; WX 602 ; N Scedilla ; G 288 -U 351 ; WX 602 ; N scedilla ; G 289 -U 352 ; WX 602 ; N Scaron ; G 290 -U 353 ; WX 602 ; N scaron ; G 291 -U 354 ; WX 602 ; N Tcommaaccent ; G 292 -U 355 ; WX 602 ; N tcommaaccent ; G 293 -U 356 ; WX 602 ; N Tcaron ; G 294 -U 357 ; WX 602 ; N tcaron ; G 295 -U 358 ; WX 602 ; N Tbar ; G 296 -U 359 ; WX 602 ; N tbar ; G 297 -U 360 ; WX 602 ; N Utilde ; G 298 -U 361 ; WX 602 ; N utilde ; G 299 -U 362 ; WX 602 ; N Umacron ; G 300 -U 363 ; WX 602 ; N umacron ; G 301 -U 364 ; WX 602 ; N Ubreve ; G 302 -U 365 ; WX 602 ; N ubreve ; G 303 -U 366 ; WX 602 ; N Uring ; G 304 -U 367 ; WX 602 ; N uring ; G 305 -U 368 ; WX 602 ; N Uhungarumlaut ; G 306 -U 369 ; WX 602 ; N uhungarumlaut ; G 307 -U 370 ; WX 602 ; N Uogonek ; G 308 -U 371 ; WX 602 ; N uogonek ; G 309 -U 372 ; WX 602 ; N Wcircumflex ; G 310 -U 373 ; WX 602 ; N wcircumflex ; G 311 -U 374 ; WX 602 ; N Ycircumflex ; G 312 -U 375 ; WX 602 ; N ycircumflex ; G 313 -U 376 ; WX 602 ; N Ydieresis ; G 314 -U 377 ; WX 602 ; N Zacute ; G 315 -U 378 ; WX 602 ; N zacute ; G 316 -U 379 ; WX 602 ; N Zdotaccent ; G 317 -U 380 ; WX 602 ; N zdotaccent ; G 318 -U 381 ; WX 602 ; N Zcaron ; G 319 -U 382 ; WX 602 ; N zcaron ; G 320 -U 383 ; WX 602 ; N longs ; G 321 -U 384 ; WX 602 ; N uni0180 ; G 322 -U 385 ; WX 602 ; N uni0181 ; G 323 -U 386 ; WX 602 ; N uni0182 ; G 324 -U 387 ; WX 602 ; N uni0183 ; G 325 -U 388 ; WX 602 ; N uni0184 ; G 326 -U 389 ; WX 602 ; N uni0185 ; G 327 -U 390 ; WX 602 ; N uni0186 ; G 328 -U 391 ; WX 602 ; N uni0187 ; G 329 -U 392 ; WX 602 ; N uni0188 ; G 330 -U 393 ; WX 602 ; N uni0189 ; G 331 -U 394 ; WX 602 ; N uni018A ; G 332 -U 395 ; WX 602 ; N uni018B ; G 333 -U 396 ; WX 602 ; N uni018C ; G 334 -U 397 ; WX 602 ; N uni018D ; G 335 -U 398 ; WX 602 ; N uni018E ; G 336 -U 399 ; WX 602 ; N uni018F ; G 337 -U 400 ; WX 602 ; N uni0190 ; G 338 -U 401 ; WX 602 ; N uni0191 ; G 339 -U 402 ; WX 602 ; N florin ; G 340 -U 403 ; WX 602 ; N uni0193 ; G 341 -U 404 ; WX 602 ; N uni0194 ; G 342 -U 405 ; WX 602 ; N uni0195 ; G 343 -U 406 ; WX 602 ; N uni0196 ; G 344 -U 407 ; WX 602 ; N uni0197 ; G 345 -U 408 ; WX 602 ; N uni0198 ; G 346 -U 409 ; WX 602 ; N uni0199 ; G 347 -U 410 ; WX 602 ; N uni019A ; G 348 -U 411 ; WX 602 ; N uni019B ; G 349 -U 412 ; WX 602 ; N uni019C ; G 350 -U 413 ; WX 602 ; N uni019D ; G 351 -U 414 ; WX 602 ; N uni019E ; G 352 -U 415 ; WX 602 ; N uni019F ; G 353 -U 416 ; WX 602 ; N Ohorn ; G 354 -U 417 ; WX 602 ; N ohorn ; G 355 -U 418 ; WX 602 ; N uni01A2 ; G 356 -U 419 ; WX 602 ; N uni01A3 ; G 357 -U 420 ; WX 602 ; N uni01A4 ; G 358 -U 421 ; WX 602 ; N uni01A5 ; G 359 -U 422 ; WX 602 ; N uni01A6 ; G 360 -U 423 ; WX 602 ; N uni01A7 ; G 361 -U 424 ; WX 602 ; N uni01A8 ; G 362 -U 425 ; WX 602 ; N uni01A9 ; G 363 -U 426 ; WX 602 ; N uni01AA ; G 364 -U 427 ; WX 602 ; N uni01AB ; G 365 -U 428 ; WX 602 ; N uni01AC ; G 366 -U 429 ; WX 602 ; N uni01AD ; G 367 -U 430 ; WX 602 ; N uni01AE ; G 368 -U 431 ; WX 602 ; N Uhorn ; G 369 -U 432 ; WX 602 ; N uhorn ; G 370 -U 433 ; WX 602 ; N uni01B1 ; G 371 -U 434 ; WX 602 ; N uni01B2 ; G 372 -U 435 ; WX 602 ; N uni01B3 ; G 373 -U 436 ; WX 602 ; N uni01B4 ; G 374 -U 437 ; WX 602 ; N uni01B5 ; G 375 -U 438 ; WX 602 ; N uni01B6 ; G 376 -U 439 ; WX 602 ; N uni01B7 ; G 377 -U 440 ; WX 602 ; N uni01B8 ; G 378 -U 441 ; WX 602 ; N uni01B9 ; G 379 -U 442 ; WX 602 ; N uni01BA ; G 380 -U 443 ; WX 602 ; N uni01BB ; G 381 -U 444 ; WX 602 ; N uni01BC ; G 382 -U 445 ; WX 602 ; N uni01BD ; G 383 -U 446 ; WX 602 ; N uni01BE ; G 384 -U 447 ; WX 602 ; N uni01BF ; G 385 -U 448 ; WX 602 ; N uni01C0 ; G 386 -U 449 ; WX 602 ; N uni01C1 ; G 387 -U 450 ; WX 602 ; N uni01C2 ; G 388 -U 451 ; WX 602 ; N uni01C3 ; G 389 -U 461 ; WX 602 ; N uni01CD ; G 390 -U 462 ; WX 602 ; N uni01CE ; G 391 -U 463 ; WX 602 ; N uni01CF ; G 392 -U 464 ; WX 602 ; N uni01D0 ; G 393 -U 465 ; WX 602 ; N uni01D1 ; G 394 -U 466 ; WX 602 ; N uni01D2 ; G 395 -U 467 ; WX 602 ; N uni01D3 ; G 396 -U 468 ; WX 602 ; N uni01D4 ; G 397 -U 469 ; WX 602 ; N uni01D5 ; G 398 -U 470 ; WX 602 ; N uni01D6 ; G 399 -U 471 ; WX 602 ; N uni01D7 ; G 400 -U 472 ; WX 602 ; N uni01D8 ; G 401 -U 473 ; WX 602 ; N uni01D9 ; G 402 -U 474 ; WX 602 ; N uni01DA ; G 403 -U 475 ; WX 602 ; N uni01DB ; G 404 -U 476 ; WX 602 ; N uni01DC ; G 405 -U 477 ; WX 602 ; N uni01DD ; G 406 -U 478 ; WX 602 ; N uni01DE ; G 407 -U 479 ; WX 602 ; N uni01DF ; G 408 -U 480 ; WX 602 ; N uni01E0 ; G 409 -U 481 ; WX 602 ; N uni01E1 ; G 410 -U 482 ; WX 602 ; N uni01E2 ; G 411 -U 483 ; WX 602 ; N uni01E3 ; G 412 -U 486 ; WX 602 ; N Gcaron ; G 413 -U 487 ; WX 602 ; N gcaron ; G 414 -U 488 ; WX 602 ; N uni01E8 ; G 415 -U 489 ; WX 602 ; N uni01E9 ; G 416 -U 490 ; WX 602 ; N uni01EA ; G 417 -U 491 ; WX 602 ; N uni01EB ; G 418 -U 492 ; WX 602 ; N uni01EC ; G 419 -U 493 ; WX 602 ; N uni01ED ; G 420 -U 494 ; WX 602 ; N uni01EE ; G 421 -U 495 ; WX 602 ; N uni01EF ; G 422 -U 496 ; WX 602 ; N uni01F0 ; G 423 -U 500 ; WX 602 ; N uni01F4 ; G 424 -U 501 ; WX 602 ; N uni01F5 ; G 425 -U 502 ; WX 602 ; N uni01F6 ; G 426 -U 504 ; WX 602 ; N uni01F8 ; G 427 -U 505 ; WX 602 ; N uni01F9 ; G 428 -U 508 ; WX 602 ; N AEacute ; G 429 -U 509 ; WX 602 ; N aeacute ; G 430 -U 510 ; WX 602 ; N Oslashacute ; G 431 -U 511 ; WX 602 ; N oslashacute ; G 432 -U 512 ; WX 602 ; N uni0200 ; G 433 -U 513 ; WX 602 ; N uni0201 ; G 434 -U 514 ; WX 602 ; N uni0202 ; G 435 -U 515 ; WX 602 ; N uni0203 ; G 436 -U 516 ; WX 602 ; N uni0204 ; G 437 -U 517 ; WX 602 ; N uni0205 ; G 438 -U 518 ; WX 602 ; N uni0206 ; G 439 -U 519 ; WX 602 ; N uni0207 ; G 440 -U 520 ; WX 602 ; N uni0208 ; G 441 -U 521 ; WX 602 ; N uni0209 ; G 442 -U 522 ; WX 602 ; N uni020A ; G 443 -U 523 ; WX 602 ; N uni020B ; G 444 -U 524 ; WX 602 ; N uni020C ; G 445 -U 525 ; WX 602 ; N uni020D ; G 446 -U 526 ; WX 602 ; N uni020E ; G 447 -U 527 ; WX 602 ; N uni020F ; G 448 -U 528 ; WX 602 ; N uni0210 ; G 449 -U 529 ; WX 602 ; N uni0211 ; G 450 -U 530 ; WX 602 ; N uni0212 ; G 451 -U 531 ; WX 602 ; N uni0213 ; G 452 -U 532 ; WX 602 ; N uni0214 ; G 453 -U 533 ; WX 602 ; N uni0215 ; G 454 -U 534 ; WX 602 ; N uni0216 ; G 455 -U 535 ; WX 602 ; N uni0217 ; G 456 -U 536 ; WX 602 ; N Scommaaccent ; G 457 -U 537 ; WX 602 ; N scommaaccent ; G 458 -U 538 ; WX 602 ; N uni021A ; G 459 -U 539 ; WX 602 ; N uni021B ; G 460 -U 540 ; WX 602 ; N uni021C ; G 461 -U 541 ; WX 602 ; N uni021D ; G 462 -U 542 ; WX 602 ; N uni021E ; G 463 -U 543 ; WX 602 ; N uni021F ; G 464 -U 544 ; WX 602 ; N uni0220 ; G 465 -U 545 ; WX 602 ; N uni0221 ; G 466 -U 548 ; WX 602 ; N uni0224 ; G 467 -U 549 ; WX 602 ; N uni0225 ; G 468 -U 550 ; WX 602 ; N uni0226 ; G 469 -U 551 ; WX 602 ; N uni0227 ; G 470 -U 552 ; WX 602 ; N uni0228 ; G 471 -U 553 ; WX 602 ; N uni0229 ; G 472 -U 554 ; WX 602 ; N uni022A ; G 473 -U 555 ; WX 602 ; N uni022B ; G 474 -U 556 ; WX 602 ; N uni022C ; G 475 -U 557 ; WX 602 ; N uni022D ; G 476 -U 558 ; WX 602 ; N uni022E ; G 477 -U 559 ; WX 602 ; N uni022F ; G 478 -U 560 ; WX 602 ; N uni0230 ; G 479 -U 561 ; WX 602 ; N uni0231 ; G 480 -U 562 ; WX 602 ; N uni0232 ; G 481 -U 563 ; WX 602 ; N uni0233 ; G 482 -U 564 ; WX 602 ; N uni0234 ; G 483 -U 565 ; WX 602 ; N uni0235 ; G 484 -U 566 ; WX 602 ; N uni0236 ; G 485 -U 567 ; WX 602 ; N dotlessj ; G 486 -U 568 ; WX 602 ; N uni0238 ; G 487 -U 569 ; WX 602 ; N uni0239 ; G 488 -U 570 ; WX 602 ; N uni023A ; G 489 -U 571 ; WX 602 ; N uni023B ; G 490 -U 572 ; WX 602 ; N uni023C ; G 491 -U 573 ; WX 602 ; N uni023D ; G 492 -U 574 ; WX 602 ; N uni023E ; G 493 -U 575 ; WX 602 ; N uni023F ; G 494 -U 576 ; WX 602 ; N uni0240 ; G 495 -U 577 ; WX 602 ; N uni0241 ; G 496 -U 579 ; WX 602 ; N uni0243 ; G 497 -U 580 ; WX 602 ; N uni0244 ; G 498 -U 581 ; WX 602 ; N uni0245 ; G 499 -U 588 ; WX 602 ; N uni024C ; G 500 -U 589 ; WX 602 ; N uni024D ; G 501 -U 592 ; WX 602 ; N uni0250 ; G 502 -U 593 ; WX 602 ; N uni0251 ; G 503 -U 594 ; WX 602 ; N uni0252 ; G 504 -U 595 ; WX 602 ; N uni0253 ; G 505 -U 596 ; WX 602 ; N uni0254 ; G 506 -U 597 ; WX 602 ; N uni0255 ; G 507 -U 598 ; WX 602 ; N uni0256 ; G 508 -U 599 ; WX 602 ; N uni0257 ; G 509 -U 600 ; WX 602 ; N uni0258 ; G 510 -U 601 ; WX 602 ; N uni0259 ; G 511 -U 602 ; WX 602 ; N uni025A ; G 512 -U 603 ; WX 602 ; N uni025B ; G 513 -U 604 ; WX 602 ; N uni025C ; G 514 -U 605 ; WX 602 ; N uni025D ; G 515 -U 606 ; WX 602 ; N uni025E ; G 516 -U 607 ; WX 602 ; N uni025F ; G 517 -U 608 ; WX 602 ; N uni0260 ; G 518 -U 609 ; WX 602 ; N uni0261 ; G 519 -U 610 ; WX 602 ; N uni0262 ; G 520 -U 611 ; WX 602 ; N uni0263 ; G 521 -U 612 ; WX 602 ; N uni0264 ; G 522 -U 613 ; WX 602 ; N uni0265 ; G 523 -U 614 ; WX 602 ; N uni0266 ; G 524 -U 615 ; WX 602 ; N uni0267 ; G 525 -U 616 ; WX 602 ; N uni0268 ; G 526 -U 617 ; WX 602 ; N uni0269 ; G 527 -U 618 ; WX 602 ; N uni026A ; G 528 -U 619 ; WX 602 ; N uni026B ; G 529 -U 620 ; WX 602 ; N uni026C ; G 530 -U 621 ; WX 602 ; N uni026D ; G 531 -U 622 ; WX 602 ; N uni026E ; G 532 -U 623 ; WX 602 ; N uni026F ; G 533 -U 624 ; WX 602 ; N uni0270 ; G 534 -U 625 ; WX 602 ; N uni0271 ; G 535 -U 626 ; WX 602 ; N uni0272 ; G 536 -U 627 ; WX 602 ; N uni0273 ; G 537 -U 628 ; WX 602 ; N uni0274 ; G 538 -U 629 ; WX 602 ; N uni0275 ; G 539 -U 630 ; WX 602 ; N uni0276 ; G 540 -U 631 ; WX 602 ; N uni0277 ; G 541 -U 632 ; WX 602 ; N uni0278 ; G 542 -U 633 ; WX 602 ; N uni0279 ; G 543 -U 634 ; WX 602 ; N uni027A ; G 544 -U 635 ; WX 602 ; N uni027B ; G 545 -U 636 ; WX 602 ; N uni027C ; G 546 -U 637 ; WX 602 ; N uni027D ; G 547 -U 638 ; WX 602 ; N uni027E ; G 548 -U 639 ; WX 602 ; N uni027F ; G 549 -U 640 ; WX 602 ; N uni0280 ; G 550 -U 641 ; WX 602 ; N uni0281 ; G 551 -U 642 ; WX 602 ; N uni0282 ; G 552 -U 643 ; WX 602 ; N uni0283 ; G 553 -U 644 ; WX 602 ; N uni0284 ; G 554 -U 645 ; WX 602 ; N uni0285 ; G 555 -U 646 ; WX 602 ; N uni0286 ; G 556 -U 647 ; WX 602 ; N uni0287 ; G 557 -U 648 ; WX 602 ; N uni0288 ; G 558 -U 649 ; WX 602 ; N uni0289 ; G 559 -U 650 ; WX 602 ; N uni028A ; G 560 -U 651 ; WX 602 ; N uni028B ; G 561 -U 652 ; WX 602 ; N uni028C ; G 562 -U 653 ; WX 602 ; N uni028D ; G 563 -U 654 ; WX 602 ; N uni028E ; G 564 -U 655 ; WX 602 ; N uni028F ; G 565 -U 656 ; WX 602 ; N uni0290 ; G 566 -U 657 ; WX 602 ; N uni0291 ; G 567 -U 658 ; WX 602 ; N uni0292 ; G 568 -U 659 ; WX 602 ; N uni0293 ; G 569 -U 660 ; WX 602 ; N uni0294 ; G 570 -U 661 ; WX 602 ; N uni0295 ; G 571 -U 662 ; WX 602 ; N uni0296 ; G 572 -U 663 ; WX 602 ; N uni0297 ; G 573 -U 664 ; WX 602 ; N uni0298 ; G 574 -U 665 ; WX 602 ; N uni0299 ; G 575 -U 666 ; WX 602 ; N uni029A ; G 576 -U 667 ; WX 602 ; N uni029B ; G 577 -U 668 ; WX 602 ; N uni029C ; G 578 -U 669 ; WX 602 ; N uni029D ; G 579 -U 670 ; WX 602 ; N uni029E ; G 580 -U 671 ; WX 602 ; N uni029F ; G 581 -U 672 ; WX 602 ; N uni02A0 ; G 582 -U 673 ; WX 602 ; N uni02A1 ; G 583 -U 674 ; WX 602 ; N uni02A2 ; G 584 -U 675 ; WX 602 ; N uni02A3 ; G 585 -U 676 ; WX 602 ; N uni02A4 ; G 586 -U 677 ; WX 602 ; N uni02A5 ; G 587 -U 678 ; WX 602 ; N uni02A6 ; G 588 -U 679 ; WX 602 ; N uni02A7 ; G 589 -U 680 ; WX 602 ; N uni02A8 ; G 590 -U 681 ; WX 602 ; N uni02A9 ; G 591 -U 682 ; WX 602 ; N uni02AA ; G 592 -U 683 ; WX 602 ; N uni02AB ; G 593 -U 684 ; WX 602 ; N uni02AC ; G 594 -U 685 ; WX 602 ; N uni02AD ; G 595 -U 686 ; WX 602 ; N uni02AE ; G 596 -U 687 ; WX 602 ; N uni02AF ; G 597 -U 688 ; WX 602 ; N uni02B0 ; G 598 -U 689 ; WX 602 ; N uni02B1 ; G 599 -U 690 ; WX 602 ; N uni02B2 ; G 600 -U 691 ; WX 602 ; N uni02B3 ; G 601 -U 692 ; WX 602 ; N uni02B4 ; G 602 -U 693 ; WX 602 ; N uni02B5 ; G 603 -U 694 ; WX 602 ; N uni02B6 ; G 604 -U 695 ; WX 602 ; N uni02B7 ; G 605 -U 696 ; WX 602 ; N uni02B8 ; G 606 -U 697 ; WX 602 ; N uni02B9 ; G 607 -U 699 ; WX 602 ; N uni02BB ; G 608 -U 700 ; WX 602 ; N uni02BC ; G 609 -U 701 ; WX 602 ; N uni02BD ; G 610 -U 702 ; WX 602 ; N uni02BE ; G 611 -U 703 ; WX 602 ; N uni02BF ; G 612 -U 704 ; WX 602 ; N uni02C0 ; G 613 -U 705 ; WX 602 ; N uni02C1 ; G 614 -U 710 ; WX 602 ; N circumflex ; G 615 -U 711 ; WX 602 ; N caron ; G 616 -U 712 ; WX 602 ; N uni02C8 ; G 617 -U 713 ; WX 602 ; N uni02C9 ; G 618 -U 716 ; WX 602 ; N uni02CC ; G 619 -U 717 ; WX 602 ; N uni02CD ; G 620 -U 718 ; WX 602 ; N uni02CE ; G 621 -U 719 ; WX 602 ; N uni02CF ; G 622 -U 720 ; WX 602 ; N uni02D0 ; G 623 -U 721 ; WX 602 ; N uni02D1 ; G 624 -U 722 ; WX 602 ; N uni02D2 ; G 625 -U 723 ; WX 602 ; N uni02D3 ; G 626 -U 726 ; WX 602 ; N uni02D6 ; G 627 -U 727 ; WX 602 ; N uni02D7 ; G 628 -U 728 ; WX 602 ; N breve ; G 629 -U 729 ; WX 602 ; N dotaccent ; G 630 -U 730 ; WX 602 ; N ring ; G 631 -U 731 ; WX 602 ; N ogonek ; G 632 -U 732 ; WX 602 ; N tilde ; G 633 -U 733 ; WX 602 ; N hungarumlaut ; G 634 -U 734 ; WX 602 ; N uni02DE ; G 635 -U 736 ; WX 602 ; N uni02E0 ; G 636 -U 737 ; WX 602 ; N uni02E1 ; G 637 -U 738 ; WX 602 ; N uni02E2 ; G 638 -U 739 ; WX 602 ; N uni02E3 ; G 639 -U 740 ; WX 602 ; N uni02E4 ; G 640 -U 741 ; WX 602 ; N uni02E5 ; G 641 -U 742 ; WX 602 ; N uni02E6 ; G 642 -U 743 ; WX 602 ; N uni02E7 ; G 643 -U 744 ; WX 602 ; N uni02E8 ; G 644 -U 745 ; WX 602 ; N uni02E9 ; G 645 -U 750 ; WX 602 ; N uni02EE ; G 646 -U 755 ; WX 602 ; N uni02F3 ; G 647 -U 768 ; WX 602 ; N gravecomb ; G 648 -U 769 ; WX 602 ; N acutecomb ; G 649 -U 770 ; WX 602 ; N uni0302 ; G 650 -U 771 ; WX 602 ; N tildecomb ; G 651 -U 772 ; WX 602 ; N uni0304 ; G 652 -U 773 ; WX 602 ; N uni0305 ; G 653 -U 774 ; WX 602 ; N uni0306 ; G 654 -U 775 ; WX 602 ; N uni0307 ; G 655 -U 776 ; WX 602 ; N uni0308 ; G 656 -U 777 ; WX 602 ; N hookabovecomb ; G 657 -U 778 ; WX 602 ; N uni030A ; G 658 -U 779 ; WX 602 ; N uni030B ; G 659 -U 780 ; WX 602 ; N uni030C ; G 660 -U 781 ; WX 602 ; N uni030D ; G 661 -U 782 ; WX 602 ; N uni030E ; G 662 -U 783 ; WX 602 ; N uni030F ; G 663 -U 784 ; WX 602 ; N uni0310 ; G 664 -U 785 ; WX 602 ; N uni0311 ; G 665 -U 786 ; WX 602 ; N uni0312 ; G 666 -U 787 ; WX 602 ; N uni0313 ; G 667 -U 788 ; WX 602 ; N uni0314 ; G 668 -U 789 ; WX 602 ; N uni0315 ; G 669 -U 790 ; WX 602 ; N uni0316 ; G 670 -U 791 ; WX 602 ; N uni0317 ; G 671 -U 792 ; WX 602 ; N uni0318 ; G 672 -U 793 ; WX 602 ; N uni0319 ; G 673 -U 794 ; WX 602 ; N uni031A ; G 674 -U 795 ; WX 602 ; N uni031B ; G 675 -U 796 ; WX 602 ; N uni031C ; G 676 -U 797 ; WX 602 ; N uni031D ; G 677 -U 798 ; WX 602 ; N uni031E ; G 678 -U 799 ; WX 602 ; N uni031F ; G 679 -U 800 ; WX 602 ; N uni0320 ; G 680 -U 801 ; WX 602 ; N uni0321 ; G 681 -U 802 ; WX 602 ; N uni0322 ; G 682 -U 803 ; WX 602 ; N dotbelowcomb ; G 683 -U 804 ; WX 602 ; N uni0324 ; G 684 -U 805 ; WX 602 ; N uni0325 ; G 685 -U 806 ; WX 602 ; N uni0326 ; G 686 -U 807 ; WX 602 ; N uni0327 ; G 687 -U 808 ; WX 602 ; N uni0328 ; G 688 -U 809 ; WX 602 ; N uni0329 ; G 689 -U 810 ; WX 602 ; N uni032A ; G 690 -U 811 ; WX 602 ; N uni032B ; G 691 -U 812 ; WX 602 ; N uni032C ; G 692 -U 813 ; WX 602 ; N uni032D ; G 693 -U 814 ; WX 602 ; N uni032E ; G 694 -U 815 ; WX 602 ; N uni032F ; G 695 -U 816 ; WX 602 ; N uni0330 ; G 696 -U 817 ; WX 602 ; N uni0331 ; G 697 -U 818 ; WX 602 ; N uni0332 ; G 698 -U 819 ; WX 602 ; N uni0333 ; G 699 -U 820 ; WX 602 ; N uni0334 ; G 700 -U 821 ; WX 602 ; N uni0335 ; G 701 -U 822 ; WX 602 ; N uni0336 ; G 702 -U 823 ; WX 602 ; N uni0337 ; G 703 -U 824 ; WX 602 ; N uni0338 ; G 704 -U 825 ; WX 602 ; N uni0339 ; G 705 -U 826 ; WX 602 ; N uni033A ; G 706 -U 827 ; WX 602 ; N uni033B ; G 707 -U 828 ; WX 602 ; N uni033C ; G 708 -U 829 ; WX 602 ; N uni033D ; G 709 -U 830 ; WX 602 ; N uni033E ; G 710 -U 831 ; WX 602 ; N uni033F ; G 711 -U 835 ; WX 602 ; N uni0343 ; G 712 -U 856 ; WX 602 ; N uni0358 ; G 713 -U 865 ; WX 602 ; N uni0361 ; G 714 -U 884 ; WX 602 ; N uni0374 ; G 715 -U 885 ; WX 602 ; N uni0375 ; G 716 -U 886 ; WX 602 ; N uni0376 ; G 717 -U 887 ; WX 602 ; N uni0377 ; G 718 -U 890 ; WX 602 ; N uni037A ; G 719 -U 891 ; WX 602 ; N uni037B ; G 720 -U 892 ; WX 602 ; N uni037C ; G 721 -U 893 ; WX 602 ; N uni037D ; G 722 -U 894 ; WX 602 ; N uni037E ; G 723 -U 895 ; WX 602 ; N uni037F ; G 724 -U 900 ; WX 602 ; N tonos ; G 725 -U 901 ; WX 602 ; N dieresistonos ; G 726 -U 902 ; WX 602 ; N Alphatonos ; G 727 -U 903 ; WX 602 ; N anoteleia ; G 728 -U 904 ; WX 602 ; N Epsilontonos ; G 729 -U 905 ; WX 602 ; N Etatonos ; G 730 -U 906 ; WX 602 ; N Iotatonos ; G 731 -U 908 ; WX 602 ; N Omicrontonos ; G 732 -U 910 ; WX 602 ; N Upsilontonos ; G 733 -U 911 ; WX 602 ; N Omegatonos ; G 734 -U 912 ; WX 602 ; N iotadieresistonos ; G 735 -U 913 ; WX 602 ; N Alpha ; G 736 -U 914 ; WX 602 ; N Beta ; G 737 -U 915 ; WX 602 ; N Gamma ; G 738 -U 916 ; WX 602 ; N uni0394 ; G 739 -U 917 ; WX 602 ; N Epsilon ; G 740 -U 918 ; WX 602 ; N Zeta ; G 741 -U 919 ; WX 602 ; N Eta ; G 742 -U 920 ; WX 602 ; N Theta ; G 743 -U 921 ; WX 602 ; N Iota ; G 744 -U 922 ; WX 602 ; N Kappa ; G 745 -U 923 ; WX 602 ; N Lambda ; G 746 -U 924 ; WX 602 ; N Mu ; G 747 -U 925 ; WX 602 ; N Nu ; G 748 -U 926 ; WX 602 ; N Xi ; G 749 -U 927 ; WX 602 ; N Omicron ; G 750 -U 928 ; WX 602 ; N Pi ; G 751 -U 929 ; WX 602 ; N Rho ; G 752 -U 931 ; WX 602 ; N Sigma ; G 753 -U 932 ; WX 602 ; N Tau ; G 754 -U 933 ; WX 602 ; N Upsilon ; G 755 -U 934 ; WX 602 ; N Phi ; G 756 -U 935 ; WX 602 ; N Chi ; G 757 -U 936 ; WX 602 ; N Psi ; G 758 -U 937 ; WX 602 ; N Omega ; G 759 -U 938 ; WX 602 ; N Iotadieresis ; G 760 -U 939 ; WX 602 ; N Upsilondieresis ; G 761 -U 940 ; WX 602 ; N alphatonos ; G 762 -U 941 ; WX 602 ; N epsilontonos ; G 763 -U 942 ; WX 602 ; N etatonos ; G 764 -U 943 ; WX 602 ; N iotatonos ; G 765 -U 944 ; WX 602 ; N upsilondieresistonos ; G 766 -U 945 ; WX 602 ; N alpha ; G 767 -U 946 ; WX 602 ; N beta ; G 768 -U 947 ; WX 602 ; N gamma ; G 769 -U 948 ; WX 602 ; N delta ; G 770 -U 949 ; WX 602 ; N epsilon ; G 771 -U 950 ; WX 602 ; N zeta ; G 772 -U 951 ; WX 602 ; N eta ; G 773 -U 952 ; WX 602 ; N theta ; G 774 -U 953 ; WX 602 ; N iota ; G 775 -U 954 ; WX 602 ; N kappa ; G 776 -U 955 ; WX 602 ; N lambda ; G 777 -U 956 ; WX 602 ; N uni03BC ; G 778 -U 957 ; WX 602 ; N nu ; G 779 -U 958 ; WX 602 ; N xi ; G 780 -U 959 ; WX 602 ; N omicron ; G 781 -U 960 ; WX 602 ; N pi ; G 782 -U 961 ; WX 602 ; N rho ; G 783 -U 962 ; WX 602 ; N sigma1 ; G 784 -U 963 ; WX 602 ; N sigma ; G 785 -U 964 ; WX 602 ; N tau ; G 786 -U 965 ; WX 602 ; N upsilon ; G 787 -U 966 ; WX 602 ; N phi ; G 788 -U 967 ; WX 602 ; N chi ; G 789 -U 968 ; WX 602 ; N psi ; G 790 -U 969 ; WX 602 ; N omega ; G 791 -U 970 ; WX 602 ; N iotadieresis ; G 792 -U 971 ; WX 602 ; N upsilondieresis ; G 793 -U 972 ; WX 602 ; N omicrontonos ; G 794 -U 973 ; WX 602 ; N upsilontonos ; G 795 -U 974 ; WX 602 ; N omegatonos ; G 796 -U 976 ; WX 602 ; N uni03D0 ; G 797 -U 977 ; WX 602 ; N theta1 ; G 798 -U 978 ; WX 602 ; N Upsilon1 ; G 799 -U 979 ; WX 602 ; N uni03D3 ; G 800 -U 980 ; WX 602 ; N uni03D4 ; G 801 -U 981 ; WX 602 ; N phi1 ; G 802 -U 982 ; WX 602 ; N omega1 ; G 803 -U 983 ; WX 602 ; N uni03D7 ; G 804 -U 984 ; WX 602 ; N uni03D8 ; G 805 -U 985 ; WX 602 ; N uni03D9 ; G 806 -U 986 ; WX 602 ; N uni03DA ; G 807 -U 987 ; WX 602 ; N uni03DB ; G 808 -U 988 ; WX 602 ; N uni03DC ; G 809 -U 989 ; WX 602 ; N uni03DD ; G 810 -U 990 ; WX 602 ; N uni03DE ; G 811 -U 991 ; WX 602 ; N uni03DF ; G 812 -U 992 ; WX 602 ; N uni03E0 ; G 813 -U 993 ; WX 602 ; N uni03E1 ; G 814 -U 1008 ; WX 602 ; N uni03F0 ; G 815 -U 1009 ; WX 602 ; N uni03F1 ; G 816 -U 1010 ; WX 602 ; N uni03F2 ; G 817 -U 1011 ; WX 602 ; N uni03F3 ; G 818 -U 1012 ; WX 602 ; N uni03F4 ; G 819 -U 1013 ; WX 602 ; N uni03F5 ; G 820 -U 1014 ; WX 602 ; N uni03F6 ; G 821 -U 1015 ; WX 602 ; N uni03F7 ; G 822 -U 1016 ; WX 602 ; N uni03F8 ; G 823 -U 1017 ; WX 602 ; N uni03F9 ; G 824 -U 1018 ; WX 602 ; N uni03FA ; G 825 -U 1019 ; WX 602 ; N uni03FB ; G 826 -U 1020 ; WX 602 ; N uni03FC ; G 827 -U 1021 ; WX 602 ; N uni03FD ; G 828 -U 1022 ; WX 602 ; N uni03FE ; G 829 -U 1023 ; WX 602 ; N uni03FF ; G 830 -U 1024 ; WX 602 ; N uni0400 ; G 831 -U 1025 ; WX 602 ; N uni0401 ; G 832 -U 1026 ; WX 602 ; N uni0402 ; G 833 -U 1027 ; WX 602 ; N uni0403 ; G 834 -U 1028 ; WX 602 ; N uni0404 ; G 835 -U 1029 ; WX 602 ; N uni0405 ; G 836 -U 1030 ; WX 602 ; N uni0406 ; G 837 -U 1031 ; WX 602 ; N uni0407 ; G 838 -U 1032 ; WX 602 ; N uni0408 ; G 839 -U 1033 ; WX 602 ; N uni0409 ; G 840 -U 1034 ; WX 602 ; N uni040A ; G 841 -U 1035 ; WX 602 ; N uni040B ; G 842 -U 1036 ; WX 602 ; N uni040C ; G 843 -U 1037 ; WX 602 ; N uni040D ; G 844 -U 1038 ; WX 602 ; N uni040E ; G 845 -U 1039 ; WX 602 ; N uni040F ; G 846 -U 1040 ; WX 602 ; N uni0410 ; G 847 -U 1041 ; WX 602 ; N uni0411 ; G 848 -U 1042 ; WX 602 ; N uni0412 ; G 849 -U 1043 ; WX 602 ; N uni0413 ; G 850 -U 1044 ; WX 602 ; N uni0414 ; G 851 -U 1045 ; WX 602 ; N uni0415 ; G 852 -U 1046 ; WX 602 ; N uni0416 ; G 853 -U 1047 ; WX 602 ; N uni0417 ; G 854 -U 1048 ; WX 602 ; N uni0418 ; G 855 -U 1049 ; WX 602 ; N uni0419 ; G 856 -U 1050 ; WX 602 ; N uni041A ; G 857 -U 1051 ; WX 602 ; N uni041B ; G 858 -U 1052 ; WX 602 ; N uni041C ; G 859 -U 1053 ; WX 602 ; N uni041D ; G 860 -U 1054 ; WX 602 ; N uni041E ; G 861 -U 1055 ; WX 602 ; N uni041F ; G 862 -U 1056 ; WX 602 ; N uni0420 ; G 863 -U 1057 ; WX 602 ; N uni0421 ; G 864 -U 1058 ; WX 602 ; N uni0422 ; G 865 -U 1059 ; WX 602 ; N uni0423 ; G 866 -U 1060 ; WX 602 ; N uni0424 ; G 867 -U 1061 ; WX 602 ; N uni0425 ; G 868 -U 1062 ; WX 602 ; N uni0426 ; G 869 -U 1063 ; WX 602 ; N uni0427 ; G 870 -U 1064 ; WX 602 ; N uni0428 ; G 871 -U 1065 ; WX 602 ; N uni0429 ; G 872 -U 1066 ; WX 602 ; N uni042A ; G 873 -U 1067 ; WX 602 ; N uni042B ; G 874 -U 1068 ; WX 602 ; N uni042C ; G 875 -U 1069 ; WX 602 ; N uni042D ; G 876 -U 1070 ; WX 602 ; N uni042E ; G 877 -U 1071 ; WX 602 ; N uni042F ; G 878 -U 1072 ; WX 602 ; N uni0430 ; G 879 -U 1073 ; WX 602 ; N uni0431 ; G 880 -U 1074 ; WX 602 ; N uni0432 ; G 881 -U 1075 ; WX 602 ; N uni0433 ; G 882 -U 1076 ; WX 602 ; N uni0434 ; G 883 -U 1077 ; WX 602 ; N uni0435 ; G 884 -U 1078 ; WX 602 ; N uni0436 ; G 885 -U 1079 ; WX 602 ; N uni0437 ; G 886 -U 1080 ; WX 602 ; N uni0438 ; G 887 -U 1081 ; WX 602 ; N uni0439 ; G 888 -U 1082 ; WX 602 ; N uni043A ; G 889 -U 1083 ; WX 602 ; N uni043B ; G 890 -U 1084 ; WX 602 ; N uni043C ; G 891 -U 1085 ; WX 602 ; N uni043D ; G 892 -U 1086 ; WX 602 ; N uni043E ; G 893 -U 1087 ; WX 602 ; N uni043F ; G 894 -U 1088 ; WX 602 ; N uni0440 ; G 895 -U 1089 ; WX 602 ; N uni0441 ; G 896 -U 1090 ; WX 602 ; N uni0442 ; G 897 -U 1091 ; WX 602 ; N uni0443 ; G 898 -U 1092 ; WX 602 ; N uni0444 ; G 899 -U 1093 ; WX 602 ; N uni0445 ; G 900 -U 1094 ; WX 602 ; N uni0446 ; G 901 -U 1095 ; WX 602 ; N uni0447 ; G 902 -U 1096 ; WX 602 ; N uni0448 ; G 903 -U 1097 ; WX 602 ; N uni0449 ; G 904 -U 1098 ; WX 602 ; N uni044A ; G 905 -U 1099 ; WX 602 ; N uni044B ; G 906 -U 1100 ; WX 602 ; N uni044C ; G 907 -U 1101 ; WX 602 ; N uni044D ; G 908 -U 1102 ; WX 602 ; N uni044E ; G 909 -U 1103 ; WX 602 ; N uni044F ; G 910 -U 1104 ; WX 602 ; N uni0450 ; G 911 -U 1105 ; WX 602 ; N uni0451 ; G 912 -U 1106 ; WX 602 ; N uni0452 ; G 913 -U 1107 ; WX 602 ; N uni0453 ; G 914 -U 1108 ; WX 602 ; N uni0454 ; G 915 -U 1109 ; WX 602 ; N uni0455 ; G 916 -U 1110 ; WX 602 ; N uni0456 ; G 917 -U 1111 ; WX 602 ; N uni0457 ; G 918 -U 1112 ; WX 602 ; N uni0458 ; G 919 -U 1113 ; WX 602 ; N uni0459 ; G 920 -U 1114 ; WX 602 ; N uni045A ; G 921 -U 1115 ; WX 602 ; N uni045B ; G 922 -U 1116 ; WX 602 ; N uni045C ; G 923 -U 1117 ; WX 602 ; N uni045D ; G 924 -U 1118 ; WX 602 ; N uni045E ; G 925 -U 1119 ; WX 602 ; N uni045F ; G 926 -U 1122 ; WX 602 ; N uni0462 ; G 927 -U 1123 ; WX 602 ; N uni0463 ; G 928 -U 1138 ; WX 602 ; N uni0472 ; G 929 -U 1139 ; WX 602 ; N uni0473 ; G 930 -U 1168 ; WX 602 ; N uni0490 ; G 931 -U 1169 ; WX 602 ; N uni0491 ; G 932 -U 1170 ; WX 602 ; N uni0492 ; G 933 -U 1171 ; WX 602 ; N uni0493 ; G 934 -U 1172 ; WX 602 ; N uni0494 ; G 935 -U 1173 ; WX 602 ; N uni0495 ; G 936 -U 1174 ; WX 602 ; N uni0496 ; G 937 -U 1175 ; WX 602 ; N uni0497 ; G 938 -U 1176 ; WX 602 ; N uni0498 ; G 939 -U 1177 ; WX 602 ; N uni0499 ; G 940 -U 1178 ; WX 602 ; N uni049A ; G 941 -U 1179 ; WX 602 ; N uni049B ; G 942 -U 1186 ; WX 602 ; N uni04A2 ; G 943 -U 1187 ; WX 602 ; N uni04A3 ; G 944 -U 1188 ; WX 602 ; N uni04A4 ; G 945 -U 1189 ; WX 602 ; N uni04A5 ; G 946 -U 1194 ; WX 602 ; N uni04AA ; G 947 -U 1195 ; WX 602 ; N uni04AB ; G 948 -U 1196 ; WX 602 ; N uni04AC ; G 949 -U 1197 ; WX 602 ; N uni04AD ; G 950 -U 1198 ; WX 602 ; N uni04AE ; G 951 -U 1199 ; WX 602 ; N uni04AF ; G 952 -U 1200 ; WX 602 ; N uni04B0 ; G 953 -U 1201 ; WX 602 ; N uni04B1 ; G 954 -U 1202 ; WX 602 ; N uni04B2 ; G 955 -U 1203 ; WX 602 ; N uni04B3 ; G 956 -U 1210 ; WX 602 ; N uni04BA ; G 957 -U 1211 ; WX 602 ; N uni04BB ; G 958 -U 1216 ; WX 602 ; N uni04C0 ; G 959 -U 1217 ; WX 602 ; N uni04C1 ; G 960 -U 1218 ; WX 602 ; N uni04C2 ; G 961 -U 1219 ; WX 602 ; N uni04C3 ; G 962 -U 1220 ; WX 602 ; N uni04C4 ; G 963 -U 1223 ; WX 602 ; N uni04C7 ; G 964 -U 1224 ; WX 602 ; N uni04C8 ; G 965 -U 1227 ; WX 602 ; N uni04CB ; G 966 -U 1228 ; WX 602 ; N uni04CC ; G 967 -U 1231 ; WX 602 ; N uni04CF ; G 968 -U 1232 ; WX 602 ; N uni04D0 ; G 969 -U 1233 ; WX 602 ; N uni04D1 ; G 970 -U 1234 ; WX 602 ; N uni04D2 ; G 971 -U 1235 ; WX 602 ; N uni04D3 ; G 972 -U 1236 ; WX 602 ; N uni04D4 ; G 973 -U 1237 ; WX 602 ; N uni04D5 ; G 974 -U 1238 ; WX 602 ; N uni04D6 ; G 975 -U 1239 ; WX 602 ; N uni04D7 ; G 976 -U 1240 ; WX 602 ; N uni04D8 ; G 977 -U 1241 ; WX 602 ; N uni04D9 ; G 978 -U 1242 ; WX 602 ; N uni04DA ; G 979 -U 1243 ; WX 602 ; N uni04DB ; G 980 -U 1244 ; WX 602 ; N uni04DC ; G 981 -U 1245 ; WX 602 ; N uni04DD ; G 982 -U 1246 ; WX 602 ; N uni04DE ; G 983 -U 1247 ; WX 602 ; N uni04DF ; G 984 -U 1248 ; WX 602 ; N uni04E0 ; G 985 -U 1249 ; WX 602 ; N uni04E1 ; G 986 -U 1250 ; WX 602 ; N uni04E2 ; G 987 -U 1251 ; WX 602 ; N uni04E3 ; G 988 -U 1252 ; WX 602 ; N uni04E4 ; G 989 -U 1253 ; WX 602 ; N uni04E5 ; G 990 -U 1254 ; WX 602 ; N uni04E6 ; G 991 -U 1255 ; WX 602 ; N uni04E7 ; G 992 -U 1256 ; WX 602 ; N uni04E8 ; G 993 -U 1257 ; WX 602 ; N uni04E9 ; G 994 -U 1258 ; WX 602 ; N uni04EA ; G 995 -U 1259 ; WX 602 ; N uni04EB ; G 996 -U 1260 ; WX 602 ; N uni04EC ; G 997 -U 1261 ; WX 602 ; N uni04ED ; G 998 -U 1262 ; WX 602 ; N uni04EE ; G 999 -U 1263 ; WX 602 ; N uni04EF ; G 1000 -U 1264 ; WX 602 ; N uni04F0 ; G 1001 -U 1265 ; WX 602 ; N uni04F1 ; G 1002 -U 1266 ; WX 602 ; N uni04F2 ; G 1003 -U 1267 ; WX 602 ; N uni04F3 ; G 1004 -U 1268 ; WX 602 ; N uni04F4 ; G 1005 -U 1269 ; WX 602 ; N uni04F5 ; G 1006 -U 1270 ; WX 602 ; N uni04F6 ; G 1007 -U 1271 ; WX 602 ; N uni04F7 ; G 1008 -U 1272 ; WX 602 ; N uni04F8 ; G 1009 -U 1273 ; WX 602 ; N uni04F9 ; G 1010 -U 1296 ; WX 602 ; N uni0510 ; G 1011 -U 1297 ; WX 602 ; N uni0511 ; G 1012 -U 1306 ; WX 602 ; N uni051A ; G 1013 -U 1307 ; WX 602 ; N uni051B ; G 1014 -U 1308 ; WX 602 ; N uni051C ; G 1015 -U 1309 ; WX 602 ; N uni051D ; G 1016 -U 1329 ; WX 602 ; N uni0531 ; G 1017 -U 1330 ; WX 602 ; N uni0532 ; G 1018 -U 1331 ; WX 602 ; N uni0533 ; G 1019 -U 1332 ; WX 602 ; N uni0534 ; G 1020 -U 1333 ; WX 602 ; N uni0535 ; G 1021 -U 1334 ; WX 602 ; N uni0536 ; G 1022 -U 1335 ; WX 602 ; N uni0537 ; G 1023 -U 1336 ; WX 602 ; N uni0538 ; G 1024 -U 1337 ; WX 602 ; N uni0539 ; G 1025 -U 1338 ; WX 602 ; N uni053A ; G 1026 -U 1339 ; WX 602 ; N uni053B ; G 1027 -U 1340 ; WX 602 ; N uni053C ; G 1028 -U 1341 ; WX 602 ; N uni053D ; G 1029 -U 1342 ; WX 602 ; N uni053E ; G 1030 -U 1343 ; WX 602 ; N uni053F ; G 1031 -U 1344 ; WX 602 ; N uni0540 ; G 1032 -U 1345 ; WX 602 ; N uni0541 ; G 1033 -U 1346 ; WX 602 ; N uni0542 ; G 1034 -U 1347 ; WX 602 ; N uni0543 ; G 1035 -U 1348 ; WX 602 ; N uni0544 ; G 1036 -U 1349 ; WX 602 ; N uni0545 ; G 1037 -U 1350 ; WX 602 ; N uni0546 ; G 1038 -U 1351 ; WX 602 ; N uni0547 ; G 1039 -U 1352 ; WX 602 ; N uni0548 ; G 1040 -U 1353 ; WX 602 ; N uni0549 ; G 1041 -U 1354 ; WX 602 ; N uni054A ; G 1042 -U 1355 ; WX 602 ; N uni054B ; G 1043 -U 1356 ; WX 602 ; N uni054C ; G 1044 -U 1357 ; WX 602 ; N uni054D ; G 1045 -U 1358 ; WX 602 ; N uni054E ; G 1046 -U 1359 ; WX 602 ; N uni054F ; G 1047 -U 1360 ; WX 602 ; N uni0550 ; G 1048 -U 1361 ; WX 602 ; N uni0551 ; G 1049 -U 1362 ; WX 602 ; N uni0552 ; G 1050 -U 1363 ; WX 602 ; N uni0553 ; G 1051 -U 1364 ; WX 602 ; N uni0554 ; G 1052 -U 1365 ; WX 602 ; N uni0555 ; G 1053 -U 1366 ; WX 602 ; N uni0556 ; G 1054 -U 1369 ; WX 602 ; N uni0559 ; G 1055 -U 1370 ; WX 602 ; N uni055A ; G 1056 -U 1371 ; WX 602 ; N uni055B ; G 1057 -U 1372 ; WX 602 ; N uni055C ; G 1058 -U 1373 ; WX 602 ; N uni055D ; G 1059 -U 1374 ; WX 602 ; N uni055E ; G 1060 -U 1375 ; WX 602 ; N uni055F ; G 1061 -U 1377 ; WX 602 ; N uni0561 ; G 1062 -U 1378 ; WX 602 ; N uni0562 ; G 1063 -U 1379 ; WX 602 ; N uni0563 ; G 1064 -U 1380 ; WX 602 ; N uni0564 ; G 1065 -U 1381 ; WX 602 ; N uni0565 ; G 1066 -U 1382 ; WX 602 ; N uni0566 ; G 1067 -U 1383 ; WX 602 ; N uni0567 ; G 1068 -U 1384 ; WX 602 ; N uni0568 ; G 1069 -U 1385 ; WX 602 ; N uni0569 ; G 1070 -U 1386 ; WX 602 ; N uni056A ; G 1071 -U 1387 ; WX 602 ; N uni056B ; G 1072 -U 1388 ; WX 602 ; N uni056C ; G 1073 -U 1389 ; WX 602 ; N uni056D ; G 1074 -U 1390 ; WX 602 ; N uni056E ; G 1075 -U 1391 ; WX 602 ; N uni056F ; G 1076 -U 1392 ; WX 602 ; N uni0570 ; G 1077 -U 1393 ; WX 602 ; N uni0571 ; G 1078 -U 1394 ; WX 602 ; N uni0572 ; G 1079 -U 1395 ; WX 602 ; N uni0573 ; G 1080 -U 1396 ; WX 602 ; N uni0574 ; G 1081 -U 1397 ; WX 602 ; N uni0575 ; G 1082 -U 1398 ; WX 602 ; N uni0576 ; G 1083 -U 1399 ; WX 602 ; N uni0577 ; G 1084 -U 1400 ; WX 602 ; N uni0578 ; G 1085 -U 1401 ; WX 602 ; N uni0579 ; G 1086 -U 1402 ; WX 602 ; N uni057A ; G 1087 -U 1403 ; WX 602 ; N uni057B ; G 1088 -U 1404 ; WX 602 ; N uni057C ; G 1089 -U 1405 ; WX 602 ; N uni057D ; G 1090 -U 1406 ; WX 602 ; N uni057E ; G 1091 -U 1407 ; WX 602 ; N uni057F ; G 1092 -U 1408 ; WX 602 ; N uni0580 ; G 1093 -U 1409 ; WX 602 ; N uni0581 ; G 1094 -U 1410 ; WX 602 ; N uni0582 ; G 1095 -U 1411 ; WX 602 ; N uni0583 ; G 1096 -U 1412 ; WX 602 ; N uni0584 ; G 1097 -U 1413 ; WX 602 ; N uni0585 ; G 1098 -U 1414 ; WX 602 ; N uni0586 ; G 1099 -U 1415 ; WX 602 ; N uni0587 ; G 1100 -U 1417 ; WX 602 ; N uni0589 ; G 1101 -U 1418 ; WX 602 ; N uni058A ; G 1102 -U 1542 ; WX 602 ; N uni0606 ; G 1103 -U 1543 ; WX 602 ; N uni0607 ; G 1104 -U 1545 ; WX 602 ; N uni0609 ; G 1105 -U 1546 ; WX 602 ; N uni060A ; G 1106 -U 1548 ; WX 602 ; N uni060C ; G 1107 -U 1557 ; WX 602 ; N uni0615 ; G 1108 -U 1563 ; WX 602 ; N uni061B ; G 1109 -U 1567 ; WX 602 ; N uni061F ; G 1110 -U 1569 ; WX 602 ; N uni0621 ; G 1111 -U 1570 ; WX 602 ; N uni0622 ; G 1112 -U 1571 ; WX 602 ; N uni0623 ; G 1113 -U 1572 ; WX 602 ; N uni0624 ; G 1114 -U 1573 ; WX 602 ; N uni0625 ; G 1115 -U 1574 ; WX 602 ; N uni0626 ; G 1116 -U 1575 ; WX 602 ; N uni0627 ; G 1117 -U 1576 ; WX 602 ; N uni0628 ; G 1118 -U 1577 ; WX 602 ; N uni0629 ; G 1119 -U 1578 ; WX 602 ; N uni062A ; G 1120 -U 1579 ; WX 602 ; N uni062B ; G 1121 -U 1580 ; WX 602 ; N uni062C ; G 1122 -U 1581 ; WX 602 ; N uni062D ; G 1123 -U 1582 ; WX 602 ; N uni062E ; G 1124 -U 1583 ; WX 602 ; N uni062F ; G 1125 -U 1584 ; WX 602 ; N uni0630 ; G 1126 -U 1585 ; WX 602 ; N uni0631 ; G 1127 -U 1586 ; WX 602 ; N uni0632 ; G 1128 -U 1587 ; WX 602 ; N uni0633 ; G 1129 -U 1588 ; WX 602 ; N uni0634 ; G 1130 -U 1589 ; WX 602 ; N uni0635 ; G 1131 -U 1590 ; WX 602 ; N uni0636 ; G 1132 -U 1591 ; WX 602 ; N uni0637 ; G 1133 -U 1592 ; WX 602 ; N uni0638 ; G 1134 -U 1593 ; WX 602 ; N uni0639 ; G 1135 -U 1594 ; WX 602 ; N uni063A ; G 1136 -U 1600 ; WX 602 ; N uni0640 ; G 1137 -U 1601 ; WX 602 ; N uni0641 ; G 1138 -U 1602 ; WX 602 ; N uni0642 ; G 1139 -U 1603 ; WX 602 ; N uni0643 ; G 1140 -U 1604 ; WX 602 ; N uni0644 ; G 1141 -U 1605 ; WX 602 ; N uni0645 ; G 1142 -U 1606 ; WX 602 ; N uni0646 ; G 1143 -U 1607 ; WX 602 ; N uni0647 ; G 1144 -U 1608 ; WX 602 ; N uni0648 ; G 1145 -U 1609 ; WX 602 ; N uni0649 ; G 1146 -U 1610 ; WX 602 ; N uni064A ; G 1147 -U 1611 ; WX 602 ; N uni064B ; G 1148 -U 1612 ; WX 602 ; N uni064C ; G 1149 -U 1613 ; WX 602 ; N uni064D ; G 1150 -U 1614 ; WX 602 ; N uni064E ; G 1151 -U 1615 ; WX 602 ; N uni064F ; G 1152 -U 1616 ; WX 602 ; N uni0650 ; G 1153 -U 1617 ; WX 602 ; N uni0651 ; G 1154 -U 1618 ; WX 602 ; N uni0652 ; G 1155 -U 1619 ; WX 602 ; N uni0653 ; G 1156 -U 1620 ; WX 602 ; N uni0654 ; G 1157 -U 1621 ; WX 602 ; N uni0655 ; G 1158 -U 1626 ; WX 602 ; N uni065A ; G 1159 -U 1632 ; WX 602 ; N uni0660 ; G 1160 -U 1633 ; WX 602 ; N uni0661 ; G 1161 -U 1634 ; WX 602 ; N uni0662 ; G 1162 -U 1635 ; WX 602 ; N uni0663 ; G 1163 -U 1636 ; WX 602 ; N uni0664 ; G 1164 -U 1637 ; WX 602 ; N uni0665 ; G 1165 -U 1638 ; WX 602 ; N uni0666 ; G 1166 -U 1639 ; WX 602 ; N uni0667 ; G 1167 -U 1640 ; WX 602 ; N uni0668 ; G 1168 -U 1641 ; WX 602 ; N uni0669 ; G 1169 -U 1642 ; WX 602 ; N uni066A ; G 1170 -U 1643 ; WX 602 ; N uni066B ; G 1171 -U 1644 ; WX 602 ; N uni066C ; G 1172 -U 1645 ; WX 602 ; N uni066D ; G 1173 -U 1652 ; WX 602 ; N uni0674 ; G 1174 -U 1657 ; WX 602 ; N uni0679 ; G 1175 -U 1658 ; WX 602 ; N uni067A ; G 1176 -U 1659 ; WX 602 ; N uni067B ; G 1177 -U 1662 ; WX 602 ; N uni067E ; G 1178 -U 1663 ; WX 602 ; N uni067F ; G 1179 -U 1664 ; WX 602 ; N uni0680 ; G 1180 -U 1667 ; WX 602 ; N uni0683 ; G 1181 -U 1668 ; WX 602 ; N uni0684 ; G 1182 -U 1670 ; WX 602 ; N uni0686 ; G 1183 -U 1671 ; WX 602 ; N uni0687 ; G 1184 -U 1681 ; WX 602 ; N uni0691 ; G 1185 -U 1688 ; WX 602 ; N uni0698 ; G 1186 -U 1700 ; WX 602 ; N uni06A4 ; G 1187 -U 1705 ; WX 602 ; N uni06A9 ; G 1188 -U 1711 ; WX 602 ; N uni06AF ; G 1189 -U 1726 ; WX 602 ; N uni06BE ; G 1190 -U 1740 ; WX 602 ; N uni06CC ; G 1191 -U 1776 ; WX 602 ; N uni06F0 ; G 1192 -U 1777 ; WX 602 ; N uni06F1 ; G 1193 -U 1778 ; WX 602 ; N uni06F2 ; G 1194 -U 1779 ; WX 602 ; N uni06F3 ; G 1195 -U 1780 ; WX 602 ; N uni06F4 ; G 1196 -U 1781 ; WX 602 ; N uni06F5 ; G 1197 -U 1782 ; WX 602 ; N uni06F6 ; G 1198 -U 1783 ; WX 602 ; N uni06F7 ; G 1199 -U 1784 ; WX 602 ; N uni06F8 ; G 1200 -U 1785 ; WX 602 ; N uni06F9 ; G 1201 -U 3647 ; WX 602 ; N uni0E3F ; G 1202 -U 3713 ; WX 602 ; N uni0E81 ; G 1203 -U 3714 ; WX 602 ; N uni0E82 ; G 1204 -U 3716 ; WX 602 ; N uni0E84 ; G 1205 -U 3719 ; WX 602 ; N uni0E87 ; G 1206 -U 3720 ; WX 602 ; N uni0E88 ; G 1207 -U 3722 ; WX 602 ; N uni0E8A ; G 1208 -U 3725 ; WX 602 ; N uni0E8D ; G 1209 -U 3732 ; WX 602 ; N uni0E94 ; G 1210 -U 3733 ; WX 602 ; N uni0E95 ; G 1211 -U 3734 ; WX 602 ; N uni0E96 ; G 1212 -U 3735 ; WX 602 ; N uni0E97 ; G 1213 -U 3737 ; WX 602 ; N uni0E99 ; G 1214 -U 3738 ; WX 602 ; N uni0E9A ; G 1215 -U 3739 ; WX 602 ; N uni0E9B ; G 1216 -U 3740 ; WX 602 ; N uni0E9C ; G 1217 -U 3741 ; WX 602 ; N uni0E9D ; G 1218 -U 3742 ; WX 602 ; N uni0E9E ; G 1219 -U 3743 ; WX 602 ; N uni0E9F ; G 1220 -U 3745 ; WX 602 ; N uni0EA1 ; G 1221 -U 3746 ; WX 602 ; N uni0EA2 ; G 1222 -U 3747 ; WX 602 ; N uni0EA3 ; G 1223 -U 3749 ; WX 602 ; N uni0EA5 ; G 1224 -U 3751 ; WX 602 ; N uni0EA7 ; G 1225 -U 3754 ; WX 602 ; N uni0EAA ; G 1226 -U 3755 ; WX 602 ; N uni0EAB ; G 1227 -U 3757 ; WX 602 ; N uni0EAD ; G 1228 -U 3758 ; WX 602 ; N uni0EAE ; G 1229 -U 3759 ; WX 602 ; N uni0EAF ; G 1230 -U 3760 ; WX 602 ; N uni0EB0 ; G 1231 -U 3761 ; WX 602 ; N uni0EB1 ; G 1232 -U 3762 ; WX 602 ; N uni0EB2 ; G 1233 -U 3763 ; WX 602 ; N uni0EB3 ; G 1234 -U 3764 ; WX 602 ; N uni0EB4 ; G 1235 -U 3765 ; WX 602 ; N uni0EB5 ; G 1236 -U 3766 ; WX 602 ; N uni0EB6 ; G 1237 -U 3767 ; WX 602 ; N uni0EB7 ; G 1238 -U 3768 ; WX 602 ; N uni0EB8 ; G 1239 -U 3769 ; WX 602 ; N uni0EB9 ; G 1240 -U 3771 ; WX 602 ; N uni0EBB ; G 1241 -U 3772 ; WX 602 ; N uni0EBC ; G 1242 -U 3784 ; WX 602 ; N uni0EC8 ; G 1243 -U 3785 ; WX 602 ; N uni0EC9 ; G 1244 -U 3786 ; WX 602 ; N uni0ECA ; G 1245 -U 3787 ; WX 602 ; N uni0ECB ; G 1246 -U 3788 ; WX 602 ; N uni0ECC ; G 1247 -U 3789 ; WX 602 ; N uni0ECD ; G 1248 -U 4304 ; WX 602 ; N uni10D0 ; G 1249 -U 4305 ; WX 602 ; N uni10D1 ; G 1250 -U 4306 ; WX 602 ; N uni10D2 ; G 1251 -U 4307 ; WX 602 ; N uni10D3 ; G 1252 -U 4308 ; WX 602 ; N uni10D4 ; G 1253 -U 4309 ; WX 602 ; N uni10D5 ; G 1254 -U 4310 ; WX 602 ; N uni10D6 ; G 1255 -U 4311 ; WX 602 ; N uni10D7 ; G 1256 -U 4312 ; WX 602 ; N uni10D8 ; G 1257 -U 4313 ; WX 602 ; N uni10D9 ; G 1258 -U 4314 ; WX 602 ; N uni10DA ; G 1259 -U 4315 ; WX 602 ; N uni10DB ; G 1260 -U 4316 ; WX 602 ; N uni10DC ; G 1261 -U 4317 ; WX 602 ; N uni10DD ; G 1262 -U 4318 ; WX 602 ; N uni10DE ; G 1263 -U 4319 ; WX 602 ; N uni10DF ; G 1264 -U 4320 ; WX 602 ; N uni10E0 ; G 1265 -U 4321 ; WX 602 ; N uni10E1 ; G 1266 -U 4322 ; WX 602 ; N uni10E2 ; G 1267 -U 4323 ; WX 602 ; N uni10E3 ; G 1268 -U 4324 ; WX 602 ; N uni10E4 ; G 1269 -U 4325 ; WX 602 ; N uni10E5 ; G 1270 -U 4326 ; WX 602 ; N uni10E6 ; G 1271 -U 4327 ; WX 602 ; N uni10E7 ; G 1272 -U 4328 ; WX 602 ; N uni10E8 ; G 1273 -U 4329 ; WX 602 ; N uni10E9 ; G 1274 -U 4330 ; WX 602 ; N uni10EA ; G 1275 -U 4331 ; WX 602 ; N uni10EB ; G 1276 -U 4332 ; WX 602 ; N uni10EC ; G 1277 -U 4333 ; WX 602 ; N uni10ED ; G 1278 -U 4334 ; WX 602 ; N uni10EE ; G 1279 -U 4335 ; WX 602 ; N uni10EF ; G 1280 -U 4336 ; WX 602 ; N uni10F0 ; G 1281 -U 4337 ; WX 602 ; N uni10F1 ; G 1282 -U 4338 ; WX 602 ; N uni10F2 ; G 1283 -U 4339 ; WX 602 ; N uni10F3 ; G 1284 -U 4340 ; WX 602 ; N uni10F4 ; G 1285 -U 4341 ; WX 602 ; N uni10F5 ; G 1286 -U 4342 ; WX 602 ; N uni10F6 ; G 1287 -U 4343 ; WX 602 ; N uni10F7 ; G 1288 -U 4344 ; WX 602 ; N uni10F8 ; G 1289 -U 4345 ; WX 602 ; N uni10F9 ; G 1290 -U 4346 ; WX 602 ; N uni10FA ; G 1291 -U 4347 ; WX 602 ; N uni10FB ; G 1292 -U 4348 ; WX 602 ; N uni10FC ; G 1293 -U 7426 ; WX 602 ; N uni1D02 ; G 1294 -U 7432 ; WX 602 ; N uni1D08 ; G 1295 -U 7433 ; WX 602 ; N uni1D09 ; G 1296 -U 7444 ; WX 602 ; N uni1D14 ; G 1297 -U 7446 ; WX 602 ; N uni1D16 ; G 1298 -U 7447 ; WX 602 ; N uni1D17 ; G 1299 -U 7453 ; WX 602 ; N uni1D1D ; G 1300 -U 7454 ; WX 602 ; N uni1D1E ; G 1301 -U 7455 ; WX 602 ; N uni1D1F ; G 1302 -U 7468 ; WX 602 ; N uni1D2C ; G 1303 -U 7469 ; WX 602 ; N uni1D2D ; G 1304 -U 7470 ; WX 602 ; N uni1D2E ; G 1305 -U 7472 ; WX 602 ; N uni1D30 ; G 1306 -U 7473 ; WX 602 ; N uni1D31 ; G 1307 -U 7474 ; WX 602 ; N uni1D32 ; G 1308 -U 7475 ; WX 602 ; N uni1D33 ; G 1309 -U 7476 ; WX 602 ; N uni1D34 ; G 1310 -U 7477 ; WX 602 ; N uni1D35 ; G 1311 -U 7478 ; WX 602 ; N uni1D36 ; G 1312 -U 7479 ; WX 602 ; N uni1D37 ; G 1313 -U 7480 ; WX 602 ; N uni1D38 ; G 1314 -U 7481 ; WX 602 ; N uni1D39 ; G 1315 -U 7482 ; WX 602 ; N uni1D3A ; G 1316 -U 7483 ; WX 602 ; N uni1D3B ; G 1317 -U 7484 ; WX 602 ; N uni1D3C ; G 1318 -U 7486 ; WX 602 ; N uni1D3E ; G 1319 -U 7487 ; WX 602 ; N uni1D3F ; G 1320 -U 7488 ; WX 602 ; N uni1D40 ; G 1321 -U 7489 ; WX 602 ; N uni1D41 ; G 1322 -U 7490 ; WX 602 ; N uni1D42 ; G 1323 -U 7491 ; WX 602 ; N uni1D43 ; G 1324 -U 7492 ; WX 602 ; N uni1D44 ; G 1325 -U 7493 ; WX 602 ; N uni1D45 ; G 1326 -U 7494 ; WX 602 ; N uni1D46 ; G 1327 -U 7495 ; WX 602 ; N uni1D47 ; G 1328 -U 7496 ; WX 602 ; N uni1D48 ; G 1329 -U 7497 ; WX 602 ; N uni1D49 ; G 1330 -U 7498 ; WX 602 ; N uni1D4A ; G 1331 -U 7499 ; WX 602 ; N uni1D4B ; G 1332 -U 7500 ; WX 602 ; N uni1D4C ; G 1333 -U 7501 ; WX 602 ; N uni1D4D ; G 1334 -U 7502 ; WX 602 ; N uni1D4E ; G 1335 -U 7503 ; WX 602 ; N uni1D4F ; G 1336 -U 7504 ; WX 602 ; N uni1D50 ; G 1337 -U 7505 ; WX 602 ; N uni1D51 ; G 1338 -U 7506 ; WX 602 ; N uni1D52 ; G 1339 -U 7507 ; WX 602 ; N uni1D53 ; G 1340 -U 7508 ; WX 602 ; N uni1D54 ; G 1341 -U 7509 ; WX 602 ; N uni1D55 ; G 1342 -U 7510 ; WX 602 ; N uni1D56 ; G 1343 -U 7511 ; WX 602 ; N uni1D57 ; G 1344 -U 7512 ; WX 602 ; N uni1D58 ; G 1345 -U 7513 ; WX 602 ; N uni1D59 ; G 1346 -U 7514 ; WX 602 ; N uni1D5A ; G 1347 -U 7515 ; WX 602 ; N uni1D5B ; G 1348 -U 7522 ; WX 602 ; N uni1D62 ; G 1349 -U 7523 ; WX 602 ; N uni1D63 ; G 1350 -U 7524 ; WX 602 ; N uni1D64 ; G 1351 -U 7525 ; WX 602 ; N uni1D65 ; G 1352 -U 7543 ; WX 602 ; N uni1D77 ; G 1353 -U 7544 ; WX 602 ; N uni1D78 ; G 1354 -U 7547 ; WX 602 ; N uni1D7B ; G 1355 -U 7557 ; WX 602 ; N uni1D85 ; G 1356 -U 7579 ; WX 602 ; N uni1D9B ; G 1357 -U 7580 ; WX 602 ; N uni1D9C ; G 1358 -U 7581 ; WX 602 ; N uni1D9D ; G 1359 -U 7582 ; WX 602 ; N uni1D9E ; G 1360 -U 7583 ; WX 602 ; N uni1D9F ; G 1361 -U 7584 ; WX 602 ; N uni1DA0 ; G 1362 -U 7585 ; WX 602 ; N uni1DA1 ; G 1363 -U 7586 ; WX 602 ; N uni1DA2 ; G 1364 -U 7587 ; WX 602 ; N uni1DA3 ; G 1365 -U 7588 ; WX 602 ; N uni1DA4 ; G 1366 -U 7589 ; WX 602 ; N uni1DA5 ; G 1367 -U 7590 ; WX 602 ; N uni1DA6 ; G 1368 -U 7591 ; WX 602 ; N uni1DA7 ; G 1369 -U 7592 ; WX 602 ; N uni1DA8 ; G 1370 -U 7593 ; WX 602 ; N uni1DA9 ; G 1371 -U 7594 ; WX 602 ; N uni1DAA ; G 1372 -U 7595 ; WX 602 ; N uni1DAB ; G 1373 -U 7596 ; WX 602 ; N uni1DAC ; G 1374 -U 7597 ; WX 602 ; N uni1DAD ; G 1375 -U 7598 ; WX 602 ; N uni1DAE ; G 1376 -U 7599 ; WX 602 ; N uni1DAF ; G 1377 -U 7600 ; WX 602 ; N uni1DB0 ; G 1378 -U 7601 ; WX 602 ; N uni1DB1 ; G 1379 -U 7602 ; WX 602 ; N uni1DB2 ; G 1380 -U 7603 ; WX 602 ; N uni1DB3 ; G 1381 -U 7604 ; WX 602 ; N uni1DB4 ; G 1382 -U 7605 ; WX 602 ; N uni1DB5 ; G 1383 -U 7606 ; WX 602 ; N uni1DB6 ; G 1384 -U 7607 ; WX 602 ; N uni1DB7 ; G 1385 -U 7609 ; WX 602 ; N uni1DB9 ; G 1386 -U 7610 ; WX 602 ; N uni1DBA ; G 1387 -U 7611 ; WX 602 ; N uni1DBB ; G 1388 -U 7612 ; WX 602 ; N uni1DBC ; G 1389 -U 7613 ; WX 602 ; N uni1DBD ; G 1390 -U 7614 ; WX 602 ; N uni1DBE ; G 1391 -U 7615 ; WX 602 ; N uni1DBF ; G 1392 -U 7680 ; WX 602 ; N uni1E00 ; G 1393 -U 7681 ; WX 602 ; N uni1E01 ; G 1394 -U 7682 ; WX 602 ; N uni1E02 ; G 1395 -U 7683 ; WX 602 ; N uni1E03 ; G 1396 -U 7684 ; WX 602 ; N uni1E04 ; G 1397 -U 7685 ; WX 602 ; N uni1E05 ; G 1398 -U 7686 ; WX 602 ; N uni1E06 ; G 1399 -U 7687 ; WX 602 ; N uni1E07 ; G 1400 -U 7688 ; WX 602 ; N uni1E08 ; G 1401 -U 7689 ; WX 602 ; N uni1E09 ; G 1402 -U 7690 ; WX 602 ; N uni1E0A ; G 1403 -U 7691 ; WX 602 ; N uni1E0B ; G 1404 -U 7692 ; WX 602 ; N uni1E0C ; G 1405 -U 7693 ; WX 602 ; N uni1E0D ; G 1406 -U 7694 ; WX 602 ; N uni1E0E ; G 1407 -U 7695 ; WX 602 ; N uni1E0F ; G 1408 -U 7696 ; WX 602 ; N uni1E10 ; G 1409 -U 7697 ; WX 602 ; N uni1E11 ; G 1410 -U 7698 ; WX 602 ; N uni1E12 ; G 1411 -U 7699 ; WX 602 ; N uni1E13 ; G 1412 -U 7704 ; WX 602 ; N uni1E18 ; G 1413 -U 7705 ; WX 602 ; N uni1E19 ; G 1414 -U 7706 ; WX 602 ; N uni1E1A ; G 1415 -U 7707 ; WX 602 ; N uni1E1B ; G 1416 -U 7708 ; WX 602 ; N uni1E1C ; G 1417 -U 7709 ; WX 602 ; N uni1E1D ; G 1418 -U 7710 ; WX 602 ; N uni1E1E ; G 1419 -U 7711 ; WX 602 ; N uni1E1F ; G 1420 -U 7712 ; WX 602 ; N uni1E20 ; G 1421 -U 7713 ; WX 602 ; N uni1E21 ; G 1422 -U 7714 ; WX 602 ; N uni1E22 ; G 1423 -U 7715 ; WX 602 ; N uni1E23 ; G 1424 -U 7716 ; WX 602 ; N uni1E24 ; G 1425 -U 7717 ; WX 602 ; N uni1E25 ; G 1426 -U 7718 ; WX 602 ; N uni1E26 ; G 1427 -U 7719 ; WX 602 ; N uni1E27 ; G 1428 -U 7720 ; WX 602 ; N uni1E28 ; G 1429 -U 7721 ; WX 602 ; N uni1E29 ; G 1430 -U 7722 ; WX 602 ; N uni1E2A ; G 1431 -U 7723 ; WX 602 ; N uni1E2B ; G 1432 -U 7724 ; WX 602 ; N uni1E2C ; G 1433 -U 7725 ; WX 602 ; N uni1E2D ; G 1434 -U 7728 ; WX 602 ; N uni1E30 ; G 1435 -U 7729 ; WX 602 ; N uni1E31 ; G 1436 -U 7730 ; WX 602 ; N uni1E32 ; G 1437 -U 7731 ; WX 602 ; N uni1E33 ; G 1438 -U 7732 ; WX 602 ; N uni1E34 ; G 1439 -U 7733 ; WX 602 ; N uni1E35 ; G 1440 -U 7734 ; WX 602 ; N uni1E36 ; G 1441 -U 7735 ; WX 602 ; N uni1E37 ; G 1442 -U 7736 ; WX 602 ; N uni1E38 ; G 1443 -U 7737 ; WX 602 ; N uni1E39 ; G 1444 -U 7738 ; WX 602 ; N uni1E3A ; G 1445 -U 7739 ; WX 602 ; N uni1E3B ; G 1446 -U 7740 ; WX 602 ; N uni1E3C ; G 1447 -U 7741 ; WX 602 ; N uni1E3D ; G 1448 -U 7742 ; WX 602 ; N uni1E3E ; G 1449 -U 7743 ; WX 602 ; N uni1E3F ; G 1450 -U 7744 ; WX 602 ; N uni1E40 ; G 1451 -U 7745 ; WX 602 ; N uni1E41 ; G 1452 -U 7746 ; WX 602 ; N uni1E42 ; G 1453 -U 7747 ; WX 602 ; N uni1E43 ; G 1454 -U 7748 ; WX 602 ; N uni1E44 ; G 1455 -U 7749 ; WX 602 ; N uni1E45 ; G 1456 -U 7750 ; WX 602 ; N uni1E46 ; G 1457 -U 7751 ; WX 602 ; N uni1E47 ; G 1458 -U 7752 ; WX 602 ; N uni1E48 ; G 1459 -U 7753 ; WX 602 ; N uni1E49 ; G 1460 -U 7754 ; WX 602 ; N uni1E4A ; G 1461 -U 7755 ; WX 602 ; N uni1E4B ; G 1462 -U 7756 ; WX 602 ; N uni1E4C ; G 1463 -U 7757 ; WX 602 ; N uni1E4D ; G 1464 -U 7764 ; WX 602 ; N uni1E54 ; G 1465 -U 7765 ; WX 602 ; N uni1E55 ; G 1466 -U 7766 ; WX 602 ; N uni1E56 ; G 1467 -U 7767 ; WX 602 ; N uni1E57 ; G 1468 -U 7768 ; WX 602 ; N uni1E58 ; G 1469 -U 7769 ; WX 602 ; N uni1E59 ; G 1470 -U 7770 ; WX 602 ; N uni1E5A ; G 1471 -U 7771 ; WX 602 ; N uni1E5B ; G 1472 -U 7772 ; WX 602 ; N uni1E5C ; G 1473 -U 7773 ; WX 602 ; N uni1E5D ; G 1474 -U 7774 ; WX 602 ; N uni1E5E ; G 1475 -U 7775 ; WX 602 ; N uni1E5F ; G 1476 -U 7776 ; WX 602 ; N uni1E60 ; G 1477 -U 7777 ; WX 602 ; N uni1E61 ; G 1478 -U 7778 ; WX 602 ; N uni1E62 ; G 1479 -U 7779 ; WX 602 ; N uni1E63 ; G 1480 -U 7784 ; WX 602 ; N uni1E68 ; G 1481 -U 7785 ; WX 602 ; N uni1E69 ; G 1482 -U 7786 ; WX 602 ; N uni1E6A ; G 1483 -U 7787 ; WX 602 ; N uni1E6B ; G 1484 -U 7788 ; WX 602 ; N uni1E6C ; G 1485 -U 7789 ; WX 602 ; N uni1E6D ; G 1486 -U 7790 ; WX 602 ; N uni1E6E ; G 1487 -U 7791 ; WX 602 ; N uni1E6F ; G 1488 -U 7792 ; WX 602 ; N uni1E70 ; G 1489 -U 7793 ; WX 602 ; N uni1E71 ; G 1490 -U 7794 ; WX 602 ; N uni1E72 ; G 1491 -U 7795 ; WX 602 ; N uni1E73 ; G 1492 -U 7796 ; WX 602 ; N uni1E74 ; G 1493 -U 7797 ; WX 602 ; N uni1E75 ; G 1494 -U 7798 ; WX 602 ; N uni1E76 ; G 1495 -U 7799 ; WX 602 ; N uni1E77 ; G 1496 -U 7800 ; WX 602 ; N uni1E78 ; G 1497 -U 7801 ; WX 602 ; N uni1E79 ; G 1498 -U 7804 ; WX 602 ; N uni1E7C ; G 1499 -U 7805 ; WX 602 ; N uni1E7D ; G 1500 -U 7806 ; WX 602 ; N uni1E7E ; G 1501 -U 7807 ; WX 602 ; N uni1E7F ; G 1502 -U 7808 ; WX 602 ; N Wgrave ; G 1503 -U 7809 ; WX 602 ; N wgrave ; G 1504 -U 7810 ; WX 602 ; N Wacute ; G 1505 -U 7811 ; WX 602 ; N wacute ; G 1506 -U 7812 ; WX 602 ; N Wdieresis ; G 1507 -U 7813 ; WX 602 ; N wdieresis ; G 1508 -U 7814 ; WX 602 ; N uni1E86 ; G 1509 -U 7815 ; WX 602 ; N uni1E87 ; G 1510 -U 7816 ; WX 602 ; N uni1E88 ; G 1511 -U 7817 ; WX 602 ; N uni1E89 ; G 1512 -U 7818 ; WX 602 ; N uni1E8A ; G 1513 -U 7819 ; WX 602 ; N uni1E8B ; G 1514 -U 7820 ; WX 602 ; N uni1E8C ; G 1515 -U 7821 ; WX 602 ; N uni1E8D ; G 1516 -U 7822 ; WX 602 ; N uni1E8E ; G 1517 -U 7823 ; WX 602 ; N uni1E8F ; G 1518 -U 7824 ; WX 602 ; N uni1E90 ; G 1519 -U 7825 ; WX 602 ; N uni1E91 ; G 1520 -U 7826 ; WX 602 ; N uni1E92 ; G 1521 -U 7827 ; WX 602 ; N uni1E93 ; G 1522 -U 7828 ; WX 602 ; N uni1E94 ; G 1523 -U 7829 ; WX 602 ; N uni1E95 ; G 1524 -U 7830 ; WX 602 ; N uni1E96 ; G 1525 -U 7831 ; WX 602 ; N uni1E97 ; G 1526 -U 7832 ; WX 602 ; N uni1E98 ; G 1527 -U 7833 ; WX 602 ; N uni1E99 ; G 1528 -U 7835 ; WX 602 ; N uni1E9B ; G 1529 -U 7839 ; WX 602 ; N uni1E9F ; G 1530 -U 7840 ; WX 602 ; N uni1EA0 ; G 1531 -U 7841 ; WX 602 ; N uni1EA1 ; G 1532 -U 7852 ; WX 602 ; N uni1EAC ; G 1533 -U 7853 ; WX 602 ; N uni1EAD ; G 1534 -U 7856 ; WX 602 ; N uni1EB0 ; G 1535 -U 7857 ; WX 602 ; N uni1EB1 ; G 1536 -U 7862 ; WX 602 ; N uni1EB6 ; G 1537 -U 7863 ; WX 602 ; N uni1EB7 ; G 1538 -U 7864 ; WX 602 ; N uni1EB8 ; G 1539 -U 7865 ; WX 602 ; N uni1EB9 ; G 1540 -U 7868 ; WX 602 ; N uni1EBC ; G 1541 -U 7869 ; WX 602 ; N uni1EBD ; G 1542 -U 7878 ; WX 602 ; N uni1EC6 ; G 1543 -U 7879 ; WX 602 ; N uni1EC7 ; G 1544 -U 7882 ; WX 602 ; N uni1ECA ; G 1545 -U 7883 ; WX 602 ; N uni1ECB ; G 1546 -U 7884 ; WX 602 ; N uni1ECC ; G 1547 -U 7885 ; WX 602 ; N uni1ECD ; G 1548 -U 7896 ; WX 602 ; N uni1ED8 ; G 1549 -U 7897 ; WX 602 ; N uni1ED9 ; G 1550 -U 7898 ; WX 602 ; N uni1EDA ; G 1551 -U 7899 ; WX 602 ; N uni1EDB ; G 1552 -U 7900 ; WX 602 ; N uni1EDC ; G 1553 -U 7901 ; WX 602 ; N uni1EDD ; G 1554 -U 7904 ; WX 602 ; N uni1EE0 ; G 1555 -U 7905 ; WX 602 ; N uni1EE1 ; G 1556 -U 7906 ; WX 602 ; N uni1EE2 ; G 1557 -U 7907 ; WX 602 ; N uni1EE3 ; G 1558 -U 7908 ; WX 602 ; N uni1EE4 ; G 1559 -U 7909 ; WX 602 ; N uni1EE5 ; G 1560 -U 7912 ; WX 602 ; N uni1EE8 ; G 1561 -U 7913 ; WX 602 ; N uni1EE9 ; G 1562 -U 7914 ; WX 602 ; N uni1EEA ; G 1563 -U 7915 ; WX 602 ; N uni1EEB ; G 1564 -U 7918 ; WX 602 ; N uni1EEE ; G 1565 -U 7919 ; WX 602 ; N uni1EEF ; G 1566 -U 7920 ; WX 602 ; N uni1EF0 ; G 1567 -U 7921 ; WX 602 ; N uni1EF1 ; G 1568 -U 7922 ; WX 602 ; N Ygrave ; G 1569 -U 7923 ; WX 602 ; N ygrave ; G 1570 -U 7924 ; WX 602 ; N uni1EF4 ; G 1571 -U 7925 ; WX 602 ; N uni1EF5 ; G 1572 -U 7928 ; WX 602 ; N uni1EF8 ; G 1573 -U 7929 ; WX 602 ; N uni1EF9 ; G 1574 -U 7936 ; WX 602 ; N uni1F00 ; G 1575 -U 7937 ; WX 602 ; N uni1F01 ; G 1576 -U 7938 ; WX 602 ; N uni1F02 ; G 1577 -U 7939 ; WX 602 ; N uni1F03 ; G 1578 -U 7940 ; WX 602 ; N uni1F04 ; G 1579 -U 7941 ; WX 602 ; N uni1F05 ; G 1580 -U 7942 ; WX 602 ; N uni1F06 ; G 1581 -U 7943 ; WX 602 ; N uni1F07 ; G 1582 -U 7944 ; WX 602 ; N uni1F08 ; G 1583 -U 7945 ; WX 602 ; N uni1F09 ; G 1584 -U 7946 ; WX 602 ; N uni1F0A ; G 1585 -U 7947 ; WX 602 ; N uni1F0B ; G 1586 -U 7948 ; WX 602 ; N uni1F0C ; G 1587 -U 7949 ; WX 602 ; N uni1F0D ; G 1588 -U 7950 ; WX 602 ; N uni1F0E ; G 1589 -U 7951 ; WX 602 ; N uni1F0F ; G 1590 -U 7952 ; WX 602 ; N uni1F10 ; G 1591 -U 7953 ; WX 602 ; N uni1F11 ; G 1592 -U 7954 ; WX 602 ; N uni1F12 ; G 1593 -U 7955 ; WX 602 ; N uni1F13 ; G 1594 -U 7956 ; WX 602 ; N uni1F14 ; G 1595 -U 7957 ; WX 602 ; N uni1F15 ; G 1596 -U 7960 ; WX 602 ; N uni1F18 ; G 1597 -U 7961 ; WX 602 ; N uni1F19 ; G 1598 -U 7962 ; WX 602 ; N uni1F1A ; G 1599 -U 7963 ; WX 602 ; N uni1F1B ; G 1600 -U 7964 ; WX 602 ; N uni1F1C ; G 1601 -U 7965 ; WX 602 ; N uni1F1D ; G 1602 -U 7968 ; WX 602 ; N uni1F20 ; G 1603 -U 7969 ; WX 602 ; N uni1F21 ; G 1604 -U 7970 ; WX 602 ; N uni1F22 ; G 1605 -U 7971 ; WX 602 ; N uni1F23 ; G 1606 -U 7972 ; WX 602 ; N uni1F24 ; G 1607 -U 7973 ; WX 602 ; N uni1F25 ; G 1608 -U 7974 ; WX 602 ; N uni1F26 ; G 1609 -U 7975 ; WX 602 ; N uni1F27 ; G 1610 -U 7976 ; WX 602 ; N uni1F28 ; G 1611 -U 7977 ; WX 602 ; N uni1F29 ; G 1612 -U 7978 ; WX 602 ; N uni1F2A ; G 1613 -U 7979 ; WX 602 ; N uni1F2B ; G 1614 -U 7980 ; WX 602 ; N uni1F2C ; G 1615 -U 7981 ; WX 602 ; N uni1F2D ; G 1616 -U 7982 ; WX 602 ; N uni1F2E ; G 1617 -U 7983 ; WX 602 ; N uni1F2F ; G 1618 -U 7984 ; WX 602 ; N uni1F30 ; G 1619 -U 7985 ; WX 602 ; N uni1F31 ; G 1620 -U 7986 ; WX 602 ; N uni1F32 ; G 1621 -U 7987 ; WX 602 ; N uni1F33 ; G 1622 -U 7988 ; WX 602 ; N uni1F34 ; G 1623 -U 7989 ; WX 602 ; N uni1F35 ; G 1624 -U 7990 ; WX 602 ; N uni1F36 ; G 1625 -U 7991 ; WX 602 ; N uni1F37 ; G 1626 -U 7992 ; WX 602 ; N uni1F38 ; G 1627 -U 7993 ; WX 602 ; N uni1F39 ; G 1628 -U 7994 ; WX 602 ; N uni1F3A ; G 1629 -U 7995 ; WX 602 ; N uni1F3B ; G 1630 -U 7996 ; WX 602 ; N uni1F3C ; G 1631 -U 7997 ; WX 602 ; N uni1F3D ; G 1632 -U 7998 ; WX 602 ; N uni1F3E ; G 1633 -U 7999 ; WX 602 ; N uni1F3F ; G 1634 -U 8000 ; WX 602 ; N uni1F40 ; G 1635 -U 8001 ; WX 602 ; N uni1F41 ; G 1636 -U 8002 ; WX 602 ; N uni1F42 ; G 1637 -U 8003 ; WX 602 ; N uni1F43 ; G 1638 -U 8004 ; WX 602 ; N uni1F44 ; G 1639 -U 8005 ; WX 602 ; N uni1F45 ; G 1640 -U 8008 ; WX 602 ; N uni1F48 ; G 1641 -U 8009 ; WX 602 ; N uni1F49 ; G 1642 -U 8010 ; WX 602 ; N uni1F4A ; G 1643 -U 8011 ; WX 602 ; N uni1F4B ; G 1644 -U 8012 ; WX 602 ; N uni1F4C ; G 1645 -U 8013 ; WX 602 ; N uni1F4D ; G 1646 -U 8016 ; WX 602 ; N uni1F50 ; G 1647 -U 8017 ; WX 602 ; N uni1F51 ; G 1648 -U 8018 ; WX 602 ; N uni1F52 ; G 1649 -U 8019 ; WX 602 ; N uni1F53 ; G 1650 -U 8020 ; WX 602 ; N uni1F54 ; G 1651 -U 8021 ; WX 602 ; N uni1F55 ; G 1652 -U 8022 ; WX 602 ; N uni1F56 ; G 1653 -U 8023 ; WX 602 ; N uni1F57 ; G 1654 -U 8025 ; WX 602 ; N uni1F59 ; G 1655 -U 8027 ; WX 602 ; N uni1F5B ; G 1656 -U 8029 ; WX 602 ; N uni1F5D ; G 1657 -U 8031 ; WX 602 ; N uni1F5F ; G 1658 -U 8032 ; WX 602 ; N uni1F60 ; G 1659 -U 8033 ; WX 602 ; N uni1F61 ; G 1660 -U 8034 ; WX 602 ; N uni1F62 ; G 1661 -U 8035 ; WX 602 ; N uni1F63 ; G 1662 -U 8036 ; WX 602 ; N uni1F64 ; G 1663 -U 8037 ; WX 602 ; N uni1F65 ; G 1664 -U 8038 ; WX 602 ; N uni1F66 ; G 1665 -U 8039 ; WX 602 ; N uni1F67 ; G 1666 -U 8040 ; WX 602 ; N uni1F68 ; G 1667 -U 8041 ; WX 602 ; N uni1F69 ; G 1668 -U 8042 ; WX 602 ; N uni1F6A ; G 1669 -U 8043 ; WX 602 ; N uni1F6B ; G 1670 -U 8044 ; WX 602 ; N uni1F6C ; G 1671 -U 8045 ; WX 602 ; N uni1F6D ; G 1672 -U 8046 ; WX 602 ; N uni1F6E ; G 1673 -U 8047 ; WX 602 ; N uni1F6F ; G 1674 -U 8048 ; WX 602 ; N uni1F70 ; G 1675 -U 8049 ; WX 602 ; N uni1F71 ; G 1676 -U 8050 ; WX 602 ; N uni1F72 ; G 1677 -U 8051 ; WX 602 ; N uni1F73 ; G 1678 -U 8052 ; WX 602 ; N uni1F74 ; G 1679 -U 8053 ; WX 602 ; N uni1F75 ; G 1680 -U 8054 ; WX 602 ; N uni1F76 ; G 1681 -U 8055 ; WX 602 ; N uni1F77 ; G 1682 -U 8056 ; WX 602 ; N uni1F78 ; G 1683 -U 8057 ; WX 602 ; N uni1F79 ; G 1684 -U 8058 ; WX 602 ; N uni1F7A ; G 1685 -U 8059 ; WX 602 ; N uni1F7B ; G 1686 -U 8060 ; WX 602 ; N uni1F7C ; G 1687 -U 8061 ; WX 602 ; N uni1F7D ; G 1688 -U 8064 ; WX 602 ; N uni1F80 ; G 1689 -U 8065 ; WX 602 ; N uni1F81 ; G 1690 -U 8066 ; WX 602 ; N uni1F82 ; G 1691 -U 8067 ; WX 602 ; N uni1F83 ; G 1692 -U 8068 ; WX 602 ; N uni1F84 ; G 1693 -U 8069 ; WX 602 ; N uni1F85 ; G 1694 -U 8070 ; WX 602 ; N uni1F86 ; G 1695 -U 8071 ; WX 602 ; N uni1F87 ; G 1696 -U 8072 ; WX 602 ; N uni1F88 ; G 1697 -U 8073 ; WX 602 ; N uni1F89 ; G 1698 -U 8074 ; WX 602 ; N uni1F8A ; G 1699 -U 8075 ; WX 602 ; N uni1F8B ; G 1700 -U 8076 ; WX 602 ; N uni1F8C ; G 1701 -U 8077 ; WX 602 ; N uni1F8D ; G 1702 -U 8078 ; WX 602 ; N uni1F8E ; G 1703 -U 8079 ; WX 602 ; N uni1F8F ; G 1704 -U 8080 ; WX 602 ; N uni1F90 ; G 1705 -U 8081 ; WX 602 ; N uni1F91 ; G 1706 -U 8082 ; WX 602 ; N uni1F92 ; G 1707 -U 8083 ; WX 602 ; N uni1F93 ; G 1708 -U 8084 ; WX 602 ; N uni1F94 ; G 1709 -U 8085 ; WX 602 ; N uni1F95 ; G 1710 -U 8086 ; WX 602 ; N uni1F96 ; G 1711 -U 8087 ; WX 602 ; N uni1F97 ; G 1712 -U 8088 ; WX 602 ; N uni1F98 ; G 1713 -U 8089 ; WX 602 ; N uni1F99 ; G 1714 -U 8090 ; WX 602 ; N uni1F9A ; G 1715 -U 8091 ; WX 602 ; N uni1F9B ; G 1716 -U 8092 ; WX 602 ; N uni1F9C ; G 1717 -U 8093 ; WX 602 ; N uni1F9D ; G 1718 -U 8094 ; WX 602 ; N uni1F9E ; G 1719 -U 8095 ; WX 602 ; N uni1F9F ; G 1720 -U 8096 ; WX 602 ; N uni1FA0 ; G 1721 -U 8097 ; WX 602 ; N uni1FA1 ; G 1722 -U 8098 ; WX 602 ; N uni1FA2 ; G 1723 -U 8099 ; WX 602 ; N uni1FA3 ; G 1724 -U 8100 ; WX 602 ; N uni1FA4 ; G 1725 -U 8101 ; WX 602 ; N uni1FA5 ; G 1726 -U 8102 ; WX 602 ; N uni1FA6 ; G 1727 -U 8103 ; WX 602 ; N uni1FA7 ; G 1728 -U 8104 ; WX 602 ; N uni1FA8 ; G 1729 -U 8105 ; WX 602 ; N uni1FA9 ; G 1730 -U 8106 ; WX 602 ; N uni1FAA ; G 1731 -U 8107 ; WX 602 ; N uni1FAB ; G 1732 -U 8108 ; WX 602 ; N uni1FAC ; G 1733 -U 8109 ; WX 602 ; N uni1FAD ; G 1734 -U 8110 ; WX 602 ; N uni1FAE ; G 1735 -U 8111 ; WX 602 ; N uni1FAF ; G 1736 -U 8112 ; WX 602 ; N uni1FB0 ; G 1737 -U 8113 ; WX 602 ; N uni1FB1 ; G 1738 -U 8114 ; WX 602 ; N uni1FB2 ; G 1739 -U 8115 ; WX 602 ; N uni1FB3 ; G 1740 -U 8116 ; WX 602 ; N uni1FB4 ; G 1741 -U 8118 ; WX 602 ; N uni1FB6 ; G 1742 -U 8119 ; WX 602 ; N uni1FB7 ; G 1743 -U 8120 ; WX 602 ; N uni1FB8 ; G 1744 -U 8121 ; WX 602 ; N uni1FB9 ; G 1745 -U 8122 ; WX 602 ; N uni1FBA ; G 1746 -U 8123 ; WX 602 ; N uni1FBB ; G 1747 -U 8124 ; WX 602 ; N uni1FBC ; G 1748 -U 8125 ; WX 602 ; N uni1FBD ; G 1749 -U 8126 ; WX 602 ; N uni1FBE ; G 1750 -U 8127 ; WX 602 ; N uni1FBF ; G 1751 -U 8128 ; WX 602 ; N uni1FC0 ; G 1752 -U 8129 ; WX 602 ; N uni1FC1 ; G 1753 -U 8130 ; WX 602 ; N uni1FC2 ; G 1754 -U 8131 ; WX 602 ; N uni1FC3 ; G 1755 -U 8132 ; WX 602 ; N uni1FC4 ; G 1756 -U 8134 ; WX 602 ; N uni1FC6 ; G 1757 -U 8135 ; WX 602 ; N uni1FC7 ; G 1758 -U 8136 ; WX 602 ; N uni1FC8 ; G 1759 -U 8137 ; WX 602 ; N uni1FC9 ; G 1760 -U 8138 ; WX 602 ; N uni1FCA ; G 1761 -U 8139 ; WX 602 ; N uni1FCB ; G 1762 -U 8140 ; WX 602 ; N uni1FCC ; G 1763 -U 8141 ; WX 602 ; N uni1FCD ; G 1764 -U 8142 ; WX 602 ; N uni1FCE ; G 1765 -U 8143 ; WX 602 ; N uni1FCF ; G 1766 -U 8144 ; WX 602 ; N uni1FD0 ; G 1767 -U 8145 ; WX 602 ; N uni1FD1 ; G 1768 -U 8146 ; WX 602 ; N uni1FD2 ; G 1769 -U 8147 ; WX 602 ; N uni1FD3 ; G 1770 -U 8150 ; WX 602 ; N uni1FD6 ; G 1771 -U 8151 ; WX 602 ; N uni1FD7 ; G 1772 -U 8152 ; WX 602 ; N uni1FD8 ; G 1773 -U 8153 ; WX 602 ; N uni1FD9 ; G 1774 -U 8154 ; WX 602 ; N uni1FDA ; G 1775 -U 8155 ; WX 602 ; N uni1FDB ; G 1776 -U 8157 ; WX 602 ; N uni1FDD ; G 1777 -U 8158 ; WX 602 ; N uni1FDE ; G 1778 -U 8159 ; WX 602 ; N uni1FDF ; G 1779 -U 8160 ; WX 602 ; N uni1FE0 ; G 1780 -U 8161 ; WX 602 ; N uni1FE1 ; G 1781 -U 8162 ; WX 602 ; N uni1FE2 ; G 1782 -U 8163 ; WX 602 ; N uni1FE3 ; G 1783 -U 8164 ; WX 602 ; N uni1FE4 ; G 1784 -U 8165 ; WX 602 ; N uni1FE5 ; G 1785 -U 8166 ; WX 602 ; N uni1FE6 ; G 1786 -U 8167 ; WX 602 ; N uni1FE7 ; G 1787 -U 8168 ; WX 602 ; N uni1FE8 ; G 1788 -U 8169 ; WX 602 ; N uni1FE9 ; G 1789 -U 8170 ; WX 602 ; N uni1FEA ; G 1790 -U 8171 ; WX 602 ; N uni1FEB ; G 1791 -U 8172 ; WX 602 ; N uni1FEC ; G 1792 -U 8173 ; WX 602 ; N uni1FED ; G 1793 -U 8174 ; WX 602 ; N uni1FEE ; G 1794 -U 8175 ; WX 602 ; N uni1FEF ; G 1795 -U 8178 ; WX 602 ; N uni1FF2 ; G 1796 -U 8179 ; WX 602 ; N uni1FF3 ; G 1797 -U 8180 ; WX 602 ; N uni1FF4 ; G 1798 -U 8182 ; WX 602 ; N uni1FF6 ; G 1799 -U 8183 ; WX 602 ; N uni1FF7 ; G 1800 -U 8184 ; WX 602 ; N uni1FF8 ; G 1801 -U 8185 ; WX 602 ; N uni1FF9 ; G 1802 -U 8186 ; WX 602 ; N uni1FFA ; G 1803 -U 8187 ; WX 602 ; N uni1FFB ; G 1804 -U 8188 ; WX 602 ; N uni1FFC ; G 1805 -U 8189 ; WX 602 ; N uni1FFD ; G 1806 -U 8190 ; WX 602 ; N uni1FFE ; G 1807 -U 8192 ; WX 602 ; N uni2000 ; G 1808 -U 8193 ; WX 602 ; N uni2001 ; G 1809 -U 8194 ; WX 602 ; N uni2002 ; G 1810 -U 8195 ; WX 602 ; N uni2003 ; G 1811 -U 8196 ; WX 602 ; N uni2004 ; G 1812 -U 8197 ; WX 602 ; N uni2005 ; G 1813 -U 8198 ; WX 602 ; N uni2006 ; G 1814 -U 8199 ; WX 602 ; N uni2007 ; G 1815 -U 8200 ; WX 602 ; N uni2008 ; G 1816 -U 8201 ; WX 602 ; N uni2009 ; G 1817 -U 8202 ; WX 602 ; N uni200A ; G 1818 -U 8208 ; WX 602 ; N uni2010 ; G 1819 -U 8209 ; WX 602 ; N uni2011 ; G 1820 -U 8210 ; WX 602 ; N figuredash ; G 1821 -U 8211 ; WX 602 ; N endash ; G 1822 -U 8212 ; WX 602 ; N emdash ; G 1823 -U 8213 ; WX 602 ; N uni2015 ; G 1824 -U 8214 ; WX 602 ; N uni2016 ; G 1825 -U 8215 ; WX 602 ; N underscoredbl ; G 1826 -U 8216 ; WX 602 ; N quoteleft ; G 1827 -U 8217 ; WX 602 ; N quoteright ; G 1828 -U 8218 ; WX 602 ; N quotesinglbase ; G 1829 -U 8219 ; WX 602 ; N quotereversed ; G 1830 -U 8220 ; WX 602 ; N quotedblleft ; G 1831 -U 8221 ; WX 602 ; N quotedblright ; G 1832 -U 8222 ; WX 602 ; N quotedblbase ; G 1833 -U 8223 ; WX 602 ; N uni201F ; G 1834 -U 8224 ; WX 602 ; N dagger ; G 1835 -U 8225 ; WX 602 ; N daggerdbl ; G 1836 -U 8226 ; WX 602 ; N bullet ; G 1837 -U 8227 ; WX 602 ; N uni2023 ; G 1838 -U 8230 ; WX 602 ; N ellipsis ; G 1839 -U 8239 ; WX 602 ; N uni202F ; G 1840 -U 8240 ; WX 602 ; N perthousand ; G 1841 -U 8241 ; WX 602 ; N uni2031 ; G 1842 -U 8242 ; WX 602 ; N minute ; G 1843 -U 8243 ; WX 602 ; N second ; G 1844 -U 8244 ; WX 602 ; N uni2034 ; G 1845 -U 8245 ; WX 602 ; N uni2035 ; G 1846 -U 8246 ; WX 602 ; N uni2036 ; G 1847 -U 8247 ; WX 602 ; N uni2037 ; G 1848 -U 8249 ; WX 602 ; N guilsinglleft ; G 1849 -U 8250 ; WX 602 ; N guilsinglright ; G 1850 -U 8252 ; WX 602 ; N exclamdbl ; G 1851 -U 8253 ; WX 602 ; N uni203D ; G 1852 -U 8254 ; WX 602 ; N uni203E ; G 1853 -U 8255 ; WX 602 ; N uni203F ; G 1854 -U 8261 ; WX 602 ; N uni2045 ; G 1855 -U 8262 ; WX 602 ; N uni2046 ; G 1856 -U 8263 ; WX 602 ; N uni2047 ; G 1857 -U 8264 ; WX 602 ; N uni2048 ; G 1858 -U 8265 ; WX 602 ; N uni2049 ; G 1859 -U 8267 ; WX 602 ; N uni204B ; G 1860 -U 8287 ; WX 602 ; N uni205F ; G 1861 -U 8304 ; WX 602 ; N uni2070 ; G 1862 -U 8305 ; WX 602 ; N uni2071 ; G 1863 -U 8308 ; WX 602 ; N uni2074 ; G 1864 -U 8309 ; WX 602 ; N uni2075 ; G 1865 -U 8310 ; WX 602 ; N uni2076 ; G 1866 -U 8311 ; WX 602 ; N uni2077 ; G 1867 -U 8312 ; WX 602 ; N uni2078 ; G 1868 -U 8313 ; WX 602 ; N uni2079 ; G 1869 -U 8314 ; WX 602 ; N uni207A ; G 1870 -U 8315 ; WX 602 ; N uni207B ; G 1871 -U 8316 ; WX 602 ; N uni207C ; G 1872 -U 8317 ; WX 602 ; N uni207D ; G 1873 -U 8318 ; WX 602 ; N uni207E ; G 1874 -U 8319 ; WX 602 ; N uni207F ; G 1875 -U 8320 ; WX 602 ; N uni2080 ; G 1876 -U 8321 ; WX 602 ; N uni2081 ; G 1877 -U 8322 ; WX 602 ; N uni2082 ; G 1878 -U 8323 ; WX 602 ; N uni2083 ; G 1879 -U 8324 ; WX 602 ; N uni2084 ; G 1880 -U 8325 ; WX 602 ; N uni2085 ; G 1881 -U 8326 ; WX 602 ; N uni2086 ; G 1882 -U 8327 ; WX 602 ; N uni2087 ; G 1883 -U 8328 ; WX 602 ; N uni2088 ; G 1884 -U 8329 ; WX 602 ; N uni2089 ; G 1885 -U 8330 ; WX 602 ; N uni208A ; G 1886 -U 8331 ; WX 602 ; N uni208B ; G 1887 -U 8332 ; WX 602 ; N uni208C ; G 1888 -U 8333 ; WX 602 ; N uni208D ; G 1889 -U 8334 ; WX 602 ; N uni208E ; G 1890 -U 8336 ; WX 602 ; N uni2090 ; G 1891 -U 8337 ; WX 602 ; N uni2091 ; G 1892 -U 8338 ; WX 602 ; N uni2092 ; G 1893 -U 8339 ; WX 602 ; N uni2093 ; G 1894 -U 8340 ; WX 602 ; N uni2094 ; G 1895 -U 8341 ; WX 602 ; N uni2095 ; G 1896 -U 8342 ; WX 602 ; N uni2096 ; G 1897 -U 8343 ; WX 602 ; N uni2097 ; G 1898 -U 8344 ; WX 602 ; N uni2098 ; G 1899 -U 8345 ; WX 602 ; N uni2099 ; G 1900 -U 8346 ; WX 602 ; N uni209A ; G 1901 -U 8347 ; WX 602 ; N uni209B ; G 1902 -U 8348 ; WX 602 ; N uni209C ; G 1903 -U 8352 ; WX 602 ; N uni20A0 ; G 1904 -U 8353 ; WX 602 ; N colonmonetary ; G 1905 -U 8354 ; WX 602 ; N uni20A2 ; G 1906 -U 8355 ; WX 602 ; N franc ; G 1907 -U 8356 ; WX 602 ; N lira ; G 1908 -U 8357 ; WX 602 ; N uni20A5 ; G 1909 -U 8358 ; WX 602 ; N uni20A6 ; G 1910 -U 8359 ; WX 602 ; N peseta ; G 1911 -U 8360 ; WX 602 ; N uni20A8 ; G 1912 -U 8361 ; WX 602 ; N uni20A9 ; G 1913 -U 8362 ; WX 602 ; N uni20AA ; G 1914 -U 8363 ; WX 602 ; N dong ; G 1915 -U 8364 ; WX 602 ; N Euro ; G 1916 -U 8365 ; WX 602 ; N uni20AD ; G 1917 -U 8366 ; WX 602 ; N uni20AE ; G 1918 -U 8367 ; WX 602 ; N uni20AF ; G 1919 -U 8368 ; WX 602 ; N uni20B0 ; G 1920 -U 8369 ; WX 602 ; N uni20B1 ; G 1921 -U 8370 ; WX 602 ; N uni20B2 ; G 1922 -U 8371 ; WX 602 ; N uni20B3 ; G 1923 -U 8372 ; WX 602 ; N uni20B4 ; G 1924 -U 8373 ; WX 602 ; N uni20B5 ; G 1925 -U 8376 ; WX 602 ; N uni20B8 ; G 1926 -U 8377 ; WX 602 ; N uni20B9 ; G 1927 -U 8378 ; WX 602 ; N uni20BA ; G 1928 -U 8381 ; WX 602 ; N uni20BD ; G 1929 -U 8450 ; WX 602 ; N uni2102 ; G 1930 -U 8453 ; WX 602 ; N uni2105 ; G 1931 -U 8461 ; WX 602 ; N uni210D ; G 1932 -U 8462 ; WX 602 ; N uni210E ; G 1933 -U 8463 ; WX 602 ; N uni210F ; G 1934 -U 8469 ; WX 602 ; N uni2115 ; G 1935 -U 8470 ; WX 602 ; N uni2116 ; G 1936 -U 8471 ; WX 602 ; N uni2117 ; G 1937 -U 8473 ; WX 602 ; N uni2119 ; G 1938 -U 8474 ; WX 602 ; N uni211A ; G 1939 -U 8477 ; WX 602 ; N uni211D ; G 1940 -U 8482 ; WX 602 ; N trademark ; G 1941 -U 8484 ; WX 602 ; N uni2124 ; G 1942 -U 8486 ; WX 602 ; N uni2126 ; G 1943 -U 8490 ; WX 602 ; N uni212A ; G 1944 -U 8491 ; WX 602 ; N uni212B ; G 1945 -U 8494 ; WX 602 ; N estimated ; G 1946 -U 8520 ; WX 602 ; N uni2148 ; G 1947 -U 8528 ; WX 602 ; N uni2150 ; G 1948 -U 8529 ; WX 602 ; N uni2151 ; G 1949 -U 8531 ; WX 602 ; N onethird ; G 1950 -U 8532 ; WX 602 ; N twothirds ; G 1951 -U 8533 ; WX 602 ; N uni2155 ; G 1952 -U 8534 ; WX 602 ; N uni2156 ; G 1953 -U 8535 ; WX 602 ; N uni2157 ; G 1954 -U 8536 ; WX 602 ; N uni2158 ; G 1955 -U 8537 ; WX 602 ; N uni2159 ; G 1956 -U 8538 ; WX 602 ; N uni215A ; G 1957 -U 8539 ; WX 602 ; N oneeighth ; G 1958 -U 8540 ; WX 602 ; N threeeighths ; G 1959 -U 8541 ; WX 602 ; N fiveeighths ; G 1960 -U 8542 ; WX 602 ; N seveneighths ; G 1961 -U 8543 ; WX 602 ; N uni215F ; G 1962 -U 8585 ; WX 602 ; N uni2189 ; G 1963 -U 8592 ; WX 602 ; N arrowleft ; G 1964 -U 8593 ; WX 602 ; N arrowup ; G 1965 -U 8594 ; WX 602 ; N arrowright ; G 1966 -U 8595 ; WX 602 ; N arrowdown ; G 1967 -U 8596 ; WX 602 ; N arrowboth ; G 1968 -U 8597 ; WX 602 ; N arrowupdn ; G 1969 -U 8598 ; WX 602 ; N uni2196 ; G 1970 -U 8599 ; WX 602 ; N uni2197 ; G 1971 -U 8600 ; WX 602 ; N uni2198 ; G 1972 -U 8601 ; WX 602 ; N uni2199 ; G 1973 -U 8602 ; WX 602 ; N uni219A ; G 1974 -U 8603 ; WX 602 ; N uni219B ; G 1975 -U 8604 ; WX 602 ; N uni219C ; G 1976 -U 8605 ; WX 602 ; N uni219D ; G 1977 -U 8606 ; WX 602 ; N uni219E ; G 1978 -U 8607 ; WX 602 ; N uni219F ; G 1979 -U 8608 ; WX 602 ; N uni21A0 ; G 1980 -U 8609 ; WX 602 ; N uni21A1 ; G 1981 -U 8610 ; WX 602 ; N uni21A2 ; G 1982 -U 8611 ; WX 602 ; N uni21A3 ; G 1983 -U 8612 ; WX 602 ; N uni21A4 ; G 1984 -U 8613 ; WX 602 ; N uni21A5 ; G 1985 -U 8614 ; WX 602 ; N uni21A6 ; G 1986 -U 8615 ; WX 602 ; N uni21A7 ; G 1987 -U 8616 ; WX 602 ; N arrowupdnbse ; G 1988 -U 8617 ; WX 602 ; N uni21A9 ; G 1989 -U 8618 ; WX 602 ; N uni21AA ; G 1990 -U 8619 ; WX 602 ; N uni21AB ; G 1991 -U 8620 ; WX 602 ; N uni21AC ; G 1992 -U 8621 ; WX 602 ; N uni21AD ; G 1993 -U 8622 ; WX 602 ; N uni21AE ; G 1994 -U 8623 ; WX 602 ; N uni21AF ; G 1995 -U 8624 ; WX 602 ; N uni21B0 ; G 1996 -U 8625 ; WX 602 ; N uni21B1 ; G 1997 -U 8626 ; WX 602 ; N uni21B2 ; G 1998 -U 8627 ; WX 602 ; N uni21B3 ; G 1999 -U 8628 ; WX 602 ; N uni21B4 ; G 2000 -U 8629 ; WX 602 ; N carriagereturn ; G 2001 -U 8630 ; WX 602 ; N uni21B6 ; G 2002 -U 8631 ; WX 602 ; N uni21B7 ; G 2003 -U 8632 ; WX 602 ; N uni21B8 ; G 2004 -U 8633 ; WX 602 ; N uni21B9 ; G 2005 -U 8634 ; WX 602 ; N uni21BA ; G 2006 -U 8635 ; WX 602 ; N uni21BB ; G 2007 -U 8636 ; WX 602 ; N uni21BC ; G 2008 -U 8637 ; WX 602 ; N uni21BD ; G 2009 -U 8638 ; WX 602 ; N uni21BE ; G 2010 -U 8639 ; WX 602 ; N uni21BF ; G 2011 -U 8640 ; WX 602 ; N uni21C0 ; G 2012 -U 8641 ; WX 602 ; N uni21C1 ; G 2013 -U 8642 ; WX 602 ; N uni21C2 ; G 2014 -U 8643 ; WX 602 ; N uni21C3 ; G 2015 -U 8644 ; WX 602 ; N uni21C4 ; G 2016 -U 8645 ; WX 602 ; N uni21C5 ; G 2017 -U 8646 ; WX 602 ; N uni21C6 ; G 2018 -U 8647 ; WX 602 ; N uni21C7 ; G 2019 -U 8648 ; WX 602 ; N uni21C8 ; G 2020 -U 8649 ; WX 602 ; N uni21C9 ; G 2021 -U 8650 ; WX 602 ; N uni21CA ; G 2022 -U 8651 ; WX 602 ; N uni21CB ; G 2023 -U 8652 ; WX 602 ; N uni21CC ; G 2024 -U 8653 ; WX 602 ; N uni21CD ; G 2025 -U 8654 ; WX 602 ; N uni21CE ; G 2026 -U 8655 ; WX 602 ; N uni21CF ; G 2027 -U 8656 ; WX 602 ; N arrowdblleft ; G 2028 -U 8657 ; WX 602 ; N arrowdblup ; G 2029 -U 8658 ; WX 602 ; N arrowdblright ; G 2030 -U 8659 ; WX 602 ; N arrowdbldown ; G 2031 -U 8660 ; WX 602 ; N arrowdblboth ; G 2032 -U 8661 ; WX 602 ; N uni21D5 ; G 2033 -U 8662 ; WX 602 ; N uni21D6 ; G 2034 -U 8663 ; WX 602 ; N uni21D7 ; G 2035 -U 8664 ; WX 602 ; N uni21D8 ; G 2036 -U 8665 ; WX 602 ; N uni21D9 ; G 2037 -U 8666 ; WX 602 ; N uni21DA ; G 2038 -U 8667 ; WX 602 ; N uni21DB ; G 2039 -U 8668 ; WX 602 ; N uni21DC ; G 2040 -U 8669 ; WX 602 ; N uni21DD ; G 2041 -U 8670 ; WX 602 ; N uni21DE ; G 2042 -U 8671 ; WX 602 ; N uni21DF ; G 2043 -U 8672 ; WX 602 ; N uni21E0 ; G 2044 -U 8673 ; WX 602 ; N uni21E1 ; G 2045 -U 8674 ; WX 602 ; N uni21E2 ; G 2046 -U 8675 ; WX 602 ; N uni21E3 ; G 2047 -U 8676 ; WX 602 ; N uni21E4 ; G 2048 -U 8677 ; WX 602 ; N uni21E5 ; G 2049 -U 8678 ; WX 602 ; N uni21E6 ; G 2050 -U 8679 ; WX 602 ; N uni21E7 ; G 2051 -U 8680 ; WX 602 ; N uni21E8 ; G 2052 -U 8681 ; WX 602 ; N uni21E9 ; G 2053 -U 8682 ; WX 602 ; N uni21EA ; G 2054 -U 8683 ; WX 602 ; N uni21EB ; G 2055 -U 8684 ; WX 602 ; N uni21EC ; G 2056 -U 8685 ; WX 602 ; N uni21ED ; G 2057 -U 8686 ; WX 602 ; N uni21EE ; G 2058 -U 8687 ; WX 602 ; N uni21EF ; G 2059 -U 8688 ; WX 602 ; N uni21F0 ; G 2060 -U 8689 ; WX 602 ; N uni21F1 ; G 2061 -U 8690 ; WX 602 ; N uni21F2 ; G 2062 -U 8691 ; WX 602 ; N uni21F3 ; G 2063 -U 8692 ; WX 602 ; N uni21F4 ; G 2064 -U 8693 ; WX 602 ; N uni21F5 ; G 2065 -U 8694 ; WX 602 ; N uni21F6 ; G 2066 -U 8695 ; WX 602 ; N uni21F7 ; G 2067 -U 8696 ; WX 602 ; N uni21F8 ; G 2068 -U 8697 ; WX 602 ; N uni21F9 ; G 2069 -U 8698 ; WX 602 ; N uni21FA ; G 2070 -U 8699 ; WX 602 ; N uni21FB ; G 2071 -U 8700 ; WX 602 ; N uni21FC ; G 2072 -U 8701 ; WX 602 ; N uni21FD ; G 2073 -U 8702 ; WX 602 ; N uni21FE ; G 2074 -U 8703 ; WX 602 ; N uni21FF ; G 2075 -U 8704 ; WX 602 ; N universal ; G 2076 -U 8705 ; WX 602 ; N uni2201 ; G 2077 -U 8706 ; WX 602 ; N partialdiff ; G 2078 -U 8707 ; WX 602 ; N existential ; G 2079 -U 8708 ; WX 602 ; N uni2204 ; G 2080 -U 8709 ; WX 602 ; N emptyset ; G 2081 -U 8710 ; WX 602 ; N increment ; G 2082 -U 8711 ; WX 602 ; N gradient ; G 2083 -U 8712 ; WX 602 ; N element ; G 2084 -U 8713 ; WX 602 ; N notelement ; G 2085 -U 8714 ; WX 602 ; N uni220A ; G 2086 -U 8715 ; WX 602 ; N suchthat ; G 2087 -U 8716 ; WX 602 ; N uni220C ; G 2088 -U 8717 ; WX 602 ; N uni220D ; G 2089 -U 8718 ; WX 602 ; N uni220E ; G 2090 -U 8719 ; WX 602 ; N product ; G 2091 -U 8720 ; WX 602 ; N uni2210 ; G 2092 -U 8721 ; WX 602 ; N summation ; G 2093 -U 8722 ; WX 602 ; N minus ; G 2094 -U 8723 ; WX 602 ; N uni2213 ; G 2095 -U 8725 ; WX 602 ; N uni2215 ; G 2096 -U 8727 ; WX 602 ; N asteriskmath ; G 2097 -U 8728 ; WX 602 ; N uni2218 ; G 2098 -U 8729 ; WX 602 ; N uni2219 ; G 2099 -U 8730 ; WX 602 ; N radical ; G 2100 -U 8731 ; WX 602 ; N uni221B ; G 2101 -U 8732 ; WX 602 ; N uni221C ; G 2102 -U 8733 ; WX 602 ; N proportional ; G 2103 -U 8734 ; WX 602 ; N infinity ; G 2104 -U 8735 ; WX 602 ; N orthogonal ; G 2105 -U 8736 ; WX 602 ; N angle ; G 2106 -U 8739 ; WX 602 ; N uni2223 ; G 2107 -U 8743 ; WX 602 ; N logicaland ; G 2108 -U 8744 ; WX 602 ; N logicalor ; G 2109 -U 8745 ; WX 602 ; N intersection ; G 2110 -U 8746 ; WX 602 ; N union ; G 2111 -U 8747 ; WX 602 ; N integral ; G 2112 -U 8748 ; WX 602 ; N uni222C ; G 2113 -U 8749 ; WX 602 ; N uni222D ; G 2114 -U 8756 ; WX 602 ; N therefore ; G 2115 -U 8757 ; WX 602 ; N uni2235 ; G 2116 -U 8758 ; WX 602 ; N uni2236 ; G 2117 -U 8759 ; WX 602 ; N uni2237 ; G 2118 -U 8760 ; WX 602 ; N uni2238 ; G 2119 -U 8761 ; WX 602 ; N uni2239 ; G 2120 -U 8762 ; WX 602 ; N uni223A ; G 2121 -U 8763 ; WX 602 ; N uni223B ; G 2122 -U 8764 ; WX 602 ; N similar ; G 2123 -U 8765 ; WX 602 ; N uni223D ; G 2124 -U 8769 ; WX 602 ; N uni2241 ; G 2125 -U 8770 ; WX 602 ; N uni2242 ; G 2126 -U 8771 ; WX 602 ; N uni2243 ; G 2127 -U 8772 ; WX 602 ; N uni2244 ; G 2128 -U 8773 ; WX 602 ; N congruent ; G 2129 -U 8774 ; WX 602 ; N uni2246 ; G 2130 -U 8775 ; WX 602 ; N uni2247 ; G 2131 -U 8776 ; WX 602 ; N approxequal ; G 2132 -U 8777 ; WX 602 ; N uni2249 ; G 2133 -U 8778 ; WX 602 ; N uni224A ; G 2134 -U 8779 ; WX 602 ; N uni224B ; G 2135 -U 8780 ; WX 602 ; N uni224C ; G 2136 -U 8781 ; WX 602 ; N uni224D ; G 2137 -U 8782 ; WX 602 ; N uni224E ; G 2138 -U 8783 ; WX 602 ; N uni224F ; G 2139 -U 8784 ; WX 602 ; N uni2250 ; G 2140 -U 8785 ; WX 602 ; N uni2251 ; G 2141 -U 8786 ; WX 602 ; N uni2252 ; G 2142 -U 8787 ; WX 602 ; N uni2253 ; G 2143 -U 8788 ; WX 602 ; N uni2254 ; G 2144 -U 8789 ; WX 602 ; N uni2255 ; G 2145 -U 8790 ; WX 602 ; N uni2256 ; G 2146 -U 8791 ; WX 602 ; N uni2257 ; G 2147 -U 8792 ; WX 602 ; N uni2258 ; G 2148 -U 8793 ; WX 602 ; N uni2259 ; G 2149 -U 8794 ; WX 602 ; N uni225A ; G 2150 -U 8795 ; WX 602 ; N uni225B ; G 2151 -U 8796 ; WX 602 ; N uni225C ; G 2152 -U 8797 ; WX 602 ; N uni225D ; G 2153 -U 8798 ; WX 602 ; N uni225E ; G 2154 -U 8799 ; WX 602 ; N uni225F ; G 2155 -U 8800 ; WX 602 ; N notequal ; G 2156 -U 8801 ; WX 602 ; N equivalence ; G 2157 -U 8802 ; WX 602 ; N uni2262 ; G 2158 -U 8803 ; WX 602 ; N uni2263 ; G 2159 -U 8804 ; WX 602 ; N lessequal ; G 2160 -U 8805 ; WX 602 ; N greaterequal ; G 2161 -U 8806 ; WX 602 ; N uni2266 ; G 2162 -U 8807 ; WX 602 ; N uni2267 ; G 2163 -U 8808 ; WX 602 ; N uni2268 ; G 2164 -U 8809 ; WX 602 ; N uni2269 ; G 2165 -U 8813 ; WX 602 ; N uni226D ; G 2166 -U 8814 ; WX 602 ; N uni226E ; G 2167 -U 8815 ; WX 602 ; N uni226F ; G 2168 -U 8816 ; WX 602 ; N uni2270 ; G 2169 -U 8817 ; WX 602 ; N uni2271 ; G 2170 -U 8818 ; WX 602 ; N uni2272 ; G 2171 -U 8819 ; WX 602 ; N uni2273 ; G 2172 -U 8820 ; WX 602 ; N uni2274 ; G 2173 -U 8821 ; WX 602 ; N uni2275 ; G 2174 -U 8822 ; WX 602 ; N uni2276 ; G 2175 -U 8823 ; WX 602 ; N uni2277 ; G 2176 -U 8824 ; WX 602 ; N uni2278 ; G 2177 -U 8825 ; WX 602 ; N uni2279 ; G 2178 -U 8826 ; WX 602 ; N uni227A ; G 2179 -U 8827 ; WX 602 ; N uni227B ; G 2180 -U 8828 ; WX 602 ; N uni227C ; G 2181 -U 8829 ; WX 602 ; N uni227D ; G 2182 -U 8830 ; WX 602 ; N uni227E ; G 2183 -U 8831 ; WX 602 ; N uni227F ; G 2184 -U 8832 ; WX 602 ; N uni2280 ; G 2185 -U 8833 ; WX 602 ; N uni2281 ; G 2186 -U 8834 ; WX 602 ; N propersubset ; G 2187 -U 8835 ; WX 602 ; N propersuperset ; G 2188 -U 8836 ; WX 602 ; N notsubset ; G 2189 -U 8837 ; WX 602 ; N uni2285 ; G 2190 -U 8838 ; WX 602 ; N reflexsubset ; G 2191 -U 8839 ; WX 602 ; N reflexsuperset ; G 2192 -U 8840 ; WX 602 ; N uni2288 ; G 2193 -U 8841 ; WX 602 ; N uni2289 ; G 2194 -U 8842 ; WX 602 ; N uni228A ; G 2195 -U 8843 ; WX 602 ; N uni228B ; G 2196 -U 8845 ; WX 602 ; N uni228D ; G 2197 -U 8846 ; WX 602 ; N uni228E ; G 2198 -U 8847 ; WX 602 ; N uni228F ; G 2199 -U 8848 ; WX 602 ; N uni2290 ; G 2200 -U 8849 ; WX 602 ; N uni2291 ; G 2201 -U 8850 ; WX 602 ; N uni2292 ; G 2202 -U 8851 ; WX 602 ; N uni2293 ; G 2203 -U 8852 ; WX 602 ; N uni2294 ; G 2204 -U 8853 ; WX 602 ; N circleplus ; G 2205 -U 8854 ; WX 602 ; N uni2296 ; G 2206 -U 8855 ; WX 602 ; N circlemultiply ; G 2207 -U 8856 ; WX 602 ; N uni2298 ; G 2208 -U 8857 ; WX 602 ; N uni2299 ; G 2209 -U 8858 ; WX 602 ; N uni229A ; G 2210 -U 8859 ; WX 602 ; N uni229B ; G 2211 -U 8860 ; WX 602 ; N uni229C ; G 2212 -U 8861 ; WX 602 ; N uni229D ; G 2213 -U 8862 ; WX 602 ; N uni229E ; G 2214 -U 8863 ; WX 602 ; N uni229F ; G 2215 -U 8864 ; WX 602 ; N uni22A0 ; G 2216 -U 8865 ; WX 602 ; N uni22A1 ; G 2217 -U 8866 ; WX 602 ; N uni22A2 ; G 2218 -U 8867 ; WX 602 ; N uni22A3 ; G 2219 -U 8868 ; WX 602 ; N uni22A4 ; G 2220 -U 8869 ; WX 602 ; N perpendicular ; G 2221 -U 8882 ; WX 602 ; N uni22B2 ; G 2222 -U 8883 ; WX 602 ; N uni22B3 ; G 2223 -U 8884 ; WX 602 ; N uni22B4 ; G 2224 -U 8885 ; WX 602 ; N uni22B5 ; G 2225 -U 8888 ; WX 602 ; N uni22B8 ; G 2226 -U 8898 ; WX 602 ; N uni22C2 ; G 2227 -U 8899 ; WX 602 ; N uni22C3 ; G 2228 -U 8900 ; WX 602 ; N uni22C4 ; G 2229 -U 8901 ; WX 602 ; N dotmath ; G 2230 -U 8902 ; WX 602 ; N uni22C6 ; G 2231 -U 8909 ; WX 602 ; N uni22CD ; G 2232 -U 8910 ; WX 602 ; N uni22CE ; G 2233 -U 8911 ; WX 602 ; N uni22CF ; G 2234 -U 8912 ; WX 602 ; N uni22D0 ; G 2235 -U 8913 ; WX 602 ; N uni22D1 ; G 2236 -U 8922 ; WX 602 ; N uni22DA ; G 2237 -U 8923 ; WX 602 ; N uni22DB ; G 2238 -U 8924 ; WX 602 ; N uni22DC ; G 2239 -U 8925 ; WX 602 ; N uni22DD ; G 2240 -U 8926 ; WX 602 ; N uni22DE ; G 2241 -U 8927 ; WX 602 ; N uni22DF ; G 2242 -U 8928 ; WX 602 ; N uni22E0 ; G 2243 -U 8929 ; WX 602 ; N uni22E1 ; G 2244 -U 8930 ; WX 602 ; N uni22E2 ; G 2245 -U 8931 ; WX 602 ; N uni22E3 ; G 2246 -U 8932 ; WX 602 ; N uni22E4 ; G 2247 -U 8933 ; WX 602 ; N uni22E5 ; G 2248 -U 8934 ; WX 602 ; N uni22E6 ; G 2249 -U 8935 ; WX 602 ; N uni22E7 ; G 2250 -U 8936 ; WX 602 ; N uni22E8 ; G 2251 -U 8937 ; WX 602 ; N uni22E9 ; G 2252 -U 8943 ; WX 602 ; N uni22EF ; G 2253 -U 8960 ; WX 602 ; N uni2300 ; G 2254 -U 8961 ; WX 602 ; N uni2301 ; G 2255 -U 8962 ; WX 602 ; N house ; G 2256 -U 8963 ; WX 602 ; N uni2303 ; G 2257 -U 8964 ; WX 602 ; N uni2304 ; G 2258 -U 8965 ; WX 602 ; N uni2305 ; G 2259 -U 8966 ; WX 602 ; N uni2306 ; G 2260 -U 8968 ; WX 602 ; N uni2308 ; G 2261 -U 8969 ; WX 602 ; N uni2309 ; G 2262 -U 8970 ; WX 602 ; N uni230A ; G 2263 -U 8971 ; WX 602 ; N uni230B ; G 2264 -U 8972 ; WX 602 ; N uni230C ; G 2265 -U 8973 ; WX 602 ; N uni230D ; G 2266 -U 8974 ; WX 602 ; N uni230E ; G 2267 -U 8975 ; WX 602 ; N uni230F ; G 2268 -U 8976 ; WX 602 ; N revlogicalnot ; G 2269 -U 8977 ; WX 602 ; N uni2311 ; G 2270 -U 8978 ; WX 602 ; N uni2312 ; G 2271 -U 8979 ; WX 602 ; N uni2313 ; G 2272 -U 8980 ; WX 602 ; N uni2314 ; G 2273 -U 8981 ; WX 602 ; N uni2315 ; G 2274 -U 8984 ; WX 602 ; N uni2318 ; G 2275 -U 8985 ; WX 602 ; N uni2319 ; G 2276 -U 8988 ; WX 602 ; N uni231C ; G 2277 -U 8989 ; WX 602 ; N uni231D ; G 2278 -U 8990 ; WX 602 ; N uni231E ; G 2279 -U 8991 ; WX 602 ; N uni231F ; G 2280 -U 8992 ; WX 602 ; N integraltp ; G 2281 -U 8993 ; WX 602 ; N integralbt ; G 2282 -U 8997 ; WX 602 ; N uni2325 ; G 2283 -U 8998 ; WX 602 ; N uni2326 ; G 2284 -U 8999 ; WX 602 ; N uni2327 ; G 2285 -U 9000 ; WX 602 ; N uni2328 ; G 2286 -U 9003 ; WX 602 ; N uni232B ; G 2287 -U 9013 ; WX 602 ; N uni2335 ; G 2288 -U 9014 ; WX 602 ; N uni2336 ; G 2289 -U 9015 ; WX 602 ; N uni2337 ; G 2290 -U 9016 ; WX 602 ; N uni2338 ; G 2291 -U 9017 ; WX 602 ; N uni2339 ; G 2292 -U 9018 ; WX 602 ; N uni233A ; G 2293 -U 9019 ; WX 602 ; N uni233B ; G 2294 -U 9020 ; WX 602 ; N uni233C ; G 2295 -U 9021 ; WX 602 ; N uni233D ; G 2296 -U 9022 ; WX 602 ; N uni233E ; G 2297 -U 9023 ; WX 602 ; N uni233F ; G 2298 -U 9024 ; WX 602 ; N uni2340 ; G 2299 -U 9025 ; WX 602 ; N uni2341 ; G 2300 -U 9026 ; WX 602 ; N uni2342 ; G 2301 -U 9027 ; WX 602 ; N uni2343 ; G 2302 -U 9028 ; WX 602 ; N uni2344 ; G 2303 -U 9029 ; WX 602 ; N uni2345 ; G 2304 -U 9030 ; WX 602 ; N uni2346 ; G 2305 -U 9031 ; WX 602 ; N uni2347 ; G 2306 -U 9032 ; WX 602 ; N uni2348 ; G 2307 -U 9033 ; WX 602 ; N uni2349 ; G 2308 -U 9034 ; WX 602 ; N uni234A ; G 2309 -U 9035 ; WX 602 ; N uni234B ; G 2310 -U 9036 ; WX 602 ; N uni234C ; G 2311 -U 9037 ; WX 602 ; N uni234D ; G 2312 -U 9038 ; WX 602 ; N uni234E ; G 2313 -U 9039 ; WX 602 ; N uni234F ; G 2314 -U 9040 ; WX 602 ; N uni2350 ; G 2315 -U 9041 ; WX 602 ; N uni2351 ; G 2316 -U 9042 ; WX 602 ; N uni2352 ; G 2317 -U 9043 ; WX 602 ; N uni2353 ; G 2318 -U 9044 ; WX 602 ; N uni2354 ; G 2319 -U 9045 ; WX 602 ; N uni2355 ; G 2320 -U 9046 ; WX 602 ; N uni2356 ; G 2321 -U 9047 ; WX 602 ; N uni2357 ; G 2322 -U 9048 ; WX 602 ; N uni2358 ; G 2323 -U 9049 ; WX 602 ; N uni2359 ; G 2324 -U 9050 ; WX 602 ; N uni235A ; G 2325 -U 9051 ; WX 602 ; N uni235B ; G 2326 -U 9052 ; WX 602 ; N uni235C ; G 2327 -U 9053 ; WX 602 ; N uni235D ; G 2328 -U 9054 ; WX 602 ; N uni235E ; G 2329 -U 9055 ; WX 602 ; N uni235F ; G 2330 -U 9056 ; WX 602 ; N uni2360 ; G 2331 -U 9057 ; WX 602 ; N uni2361 ; G 2332 -U 9058 ; WX 602 ; N uni2362 ; G 2333 -U 9059 ; WX 602 ; N uni2363 ; G 2334 -U 9060 ; WX 602 ; N uni2364 ; G 2335 -U 9061 ; WX 602 ; N uni2365 ; G 2336 -U 9062 ; WX 602 ; N uni2366 ; G 2337 -U 9063 ; WX 602 ; N uni2367 ; G 2338 -U 9064 ; WX 602 ; N uni2368 ; G 2339 -U 9065 ; WX 602 ; N uni2369 ; G 2340 -U 9066 ; WX 602 ; N uni236A ; G 2341 -U 9067 ; WX 602 ; N uni236B ; G 2342 -U 9068 ; WX 602 ; N uni236C ; G 2343 -U 9069 ; WX 602 ; N uni236D ; G 2344 -U 9070 ; WX 602 ; N uni236E ; G 2345 -U 9071 ; WX 602 ; N uni236F ; G 2346 -U 9072 ; WX 602 ; N uni2370 ; G 2347 -U 9073 ; WX 602 ; N uni2371 ; G 2348 -U 9074 ; WX 602 ; N uni2372 ; G 2349 -U 9075 ; WX 602 ; N uni2373 ; G 2350 -U 9076 ; WX 602 ; N uni2374 ; G 2351 -U 9077 ; WX 602 ; N uni2375 ; G 2352 -U 9078 ; WX 602 ; N uni2376 ; G 2353 -U 9079 ; WX 602 ; N uni2377 ; G 2354 -U 9080 ; WX 602 ; N uni2378 ; G 2355 -U 9081 ; WX 602 ; N uni2379 ; G 2356 -U 9082 ; WX 602 ; N uni237A ; G 2357 -U 9085 ; WX 602 ; N uni237D ; G 2358 -U 9088 ; WX 602 ; N uni2380 ; G 2359 -U 9089 ; WX 602 ; N uni2381 ; G 2360 -U 9090 ; WX 602 ; N uni2382 ; G 2361 -U 9091 ; WX 602 ; N uni2383 ; G 2362 -U 9096 ; WX 602 ; N uni2388 ; G 2363 -U 9097 ; WX 602 ; N uni2389 ; G 2364 -U 9098 ; WX 602 ; N uni238A ; G 2365 -U 9099 ; WX 602 ; N uni238B ; G 2366 -U 9109 ; WX 602 ; N uni2395 ; G 2367 -U 9115 ; WX 602 ; N uni239B ; G 2368 -U 9116 ; WX 602 ; N uni239C ; G 2369 -U 9117 ; WX 602 ; N uni239D ; G 2370 -U 9118 ; WX 602 ; N uni239E ; G 2371 -U 9119 ; WX 602 ; N uni239F ; G 2372 -U 9120 ; WX 602 ; N uni23A0 ; G 2373 -U 9121 ; WX 602 ; N uni23A1 ; G 2374 -U 9122 ; WX 602 ; N uni23A2 ; G 2375 -U 9123 ; WX 602 ; N uni23A3 ; G 2376 -U 9124 ; WX 602 ; N uni23A4 ; G 2377 -U 9125 ; WX 602 ; N uni23A5 ; G 2378 -U 9126 ; WX 602 ; N uni23A6 ; G 2379 -U 9127 ; WX 602 ; N uni23A7 ; G 2380 -U 9128 ; WX 602 ; N uni23A8 ; G 2381 -U 9129 ; WX 602 ; N uni23A9 ; G 2382 -U 9130 ; WX 602 ; N uni23AA ; G 2383 -U 9131 ; WX 602 ; N uni23AB ; G 2384 -U 9132 ; WX 602 ; N uni23AC ; G 2385 -U 9133 ; WX 602 ; N uni23AD ; G 2386 -U 9134 ; WX 602 ; N uni23AE ; G 2387 -U 9166 ; WX 602 ; N uni23CE ; G 2388 -U 9167 ; WX 602 ; N uni23CF ; G 2389 -U 9251 ; WX 602 ; N uni2423 ; G 2390 -U 9472 ; WX 602 ; N SF100000 ; G 2391 -U 9473 ; WX 602 ; N uni2501 ; G 2392 -U 9474 ; WX 602 ; N SF110000 ; G 2393 -U 9475 ; WX 602 ; N uni2503 ; G 2394 -U 9476 ; WX 602 ; N uni2504 ; G 2395 -U 9477 ; WX 602 ; N uni2505 ; G 2396 -U 9478 ; WX 602 ; N uni2506 ; G 2397 -U 9479 ; WX 602 ; N uni2507 ; G 2398 -U 9480 ; WX 602 ; N uni2508 ; G 2399 -U 9481 ; WX 602 ; N uni2509 ; G 2400 -U 9482 ; WX 602 ; N uni250A ; G 2401 -U 9483 ; WX 602 ; N uni250B ; G 2402 -U 9484 ; WX 602 ; N SF010000 ; G 2403 -U 9485 ; WX 602 ; N uni250D ; G 2404 -U 9486 ; WX 602 ; N uni250E ; G 2405 -U 9487 ; WX 602 ; N uni250F ; G 2406 -U 9488 ; WX 602 ; N SF030000 ; G 2407 -U 9489 ; WX 602 ; N uni2511 ; G 2408 -U 9490 ; WX 602 ; N uni2512 ; G 2409 -U 9491 ; WX 602 ; N uni2513 ; G 2410 -U 9492 ; WX 602 ; N SF020000 ; G 2411 -U 9493 ; WX 602 ; N uni2515 ; G 2412 -U 9494 ; WX 602 ; N uni2516 ; G 2413 -U 9495 ; WX 602 ; N uni2517 ; G 2414 -U 9496 ; WX 602 ; N SF040000 ; G 2415 -U 9497 ; WX 602 ; N uni2519 ; G 2416 -U 9498 ; WX 602 ; N uni251A ; G 2417 -U 9499 ; WX 602 ; N uni251B ; G 2418 -U 9500 ; WX 602 ; N SF080000 ; G 2419 -U 9501 ; WX 602 ; N uni251D ; G 2420 -U 9502 ; WX 602 ; N uni251E ; G 2421 -U 9503 ; WX 602 ; N uni251F ; G 2422 -U 9504 ; WX 602 ; N uni2520 ; G 2423 -U 9505 ; WX 602 ; N uni2521 ; G 2424 -U 9506 ; WX 602 ; N uni2522 ; G 2425 -U 9507 ; WX 602 ; N uni2523 ; G 2426 -U 9508 ; WX 602 ; N SF090000 ; G 2427 -U 9509 ; WX 602 ; N uni2525 ; G 2428 -U 9510 ; WX 602 ; N uni2526 ; G 2429 -U 9511 ; WX 602 ; N uni2527 ; G 2430 -U 9512 ; WX 602 ; N uni2528 ; G 2431 -U 9513 ; WX 602 ; N uni2529 ; G 2432 -U 9514 ; WX 602 ; N uni252A ; G 2433 -U 9515 ; WX 602 ; N uni252B ; G 2434 -U 9516 ; WX 602 ; N SF060000 ; G 2435 -U 9517 ; WX 602 ; N uni252D ; G 2436 -U 9518 ; WX 602 ; N uni252E ; G 2437 -U 9519 ; WX 602 ; N uni252F ; G 2438 -U 9520 ; WX 602 ; N uni2530 ; G 2439 -U 9521 ; WX 602 ; N uni2531 ; G 2440 -U 9522 ; WX 602 ; N uni2532 ; G 2441 -U 9523 ; WX 602 ; N uni2533 ; G 2442 -U 9524 ; WX 602 ; N SF070000 ; G 2443 -U 9525 ; WX 602 ; N uni2535 ; G 2444 -U 9526 ; WX 602 ; N uni2536 ; G 2445 -U 9527 ; WX 602 ; N uni2537 ; G 2446 -U 9528 ; WX 602 ; N uni2538 ; G 2447 -U 9529 ; WX 602 ; N uni2539 ; G 2448 -U 9530 ; WX 602 ; N uni253A ; G 2449 -U 9531 ; WX 602 ; N uni253B ; G 2450 -U 9532 ; WX 602 ; N SF050000 ; G 2451 -U 9533 ; WX 602 ; N uni253D ; G 2452 -U 9534 ; WX 602 ; N uni253E ; G 2453 -U 9535 ; WX 602 ; N uni253F ; G 2454 -U 9536 ; WX 602 ; N uni2540 ; G 2455 -U 9537 ; WX 602 ; N uni2541 ; G 2456 -U 9538 ; WX 602 ; N uni2542 ; G 2457 -U 9539 ; WX 602 ; N uni2543 ; G 2458 -U 9540 ; WX 602 ; N uni2544 ; G 2459 -U 9541 ; WX 602 ; N uni2545 ; G 2460 -U 9542 ; WX 602 ; N uni2546 ; G 2461 -U 9543 ; WX 602 ; N uni2547 ; G 2462 -U 9544 ; WX 602 ; N uni2548 ; G 2463 -U 9545 ; WX 602 ; N uni2549 ; G 2464 -U 9546 ; WX 602 ; N uni254A ; G 2465 -U 9547 ; WX 602 ; N uni254B ; G 2466 -U 9548 ; WX 602 ; N uni254C ; G 2467 -U 9549 ; WX 602 ; N uni254D ; G 2468 -U 9550 ; WX 602 ; N uni254E ; G 2469 -U 9551 ; WX 602 ; N uni254F ; G 2470 -U 9552 ; WX 602 ; N SF430000 ; G 2471 -U 9553 ; WX 602 ; N SF240000 ; G 2472 -U 9554 ; WX 602 ; N SF510000 ; G 2473 -U 9555 ; WX 602 ; N SF520000 ; G 2474 -U 9556 ; WX 602 ; N SF390000 ; G 2475 -U 9557 ; WX 602 ; N SF220000 ; G 2476 -U 9558 ; WX 602 ; N SF210000 ; G 2477 -U 9559 ; WX 602 ; N SF250000 ; G 2478 -U 9560 ; WX 602 ; N SF500000 ; G 2479 -U 9561 ; WX 602 ; N SF490000 ; G 2480 -U 9562 ; WX 602 ; N SF380000 ; G 2481 -U 9563 ; WX 602 ; N SF280000 ; G 2482 -U 9564 ; WX 602 ; N SF270000 ; G 2483 -U 9565 ; WX 602 ; N SF260000 ; G 2484 -U 9566 ; WX 602 ; N SF360000 ; G 2485 -U 9567 ; WX 602 ; N SF370000 ; G 2486 -U 9568 ; WX 602 ; N SF420000 ; G 2487 -U 9569 ; WX 602 ; N SF190000 ; G 2488 -U 9570 ; WX 602 ; N SF200000 ; G 2489 -U 9571 ; WX 602 ; N SF230000 ; G 2490 -U 9572 ; WX 602 ; N SF470000 ; G 2491 -U 9573 ; WX 602 ; N SF480000 ; G 2492 -U 9574 ; WX 602 ; N SF410000 ; G 2493 -U 9575 ; WX 602 ; N SF450000 ; G 2494 -U 9576 ; WX 602 ; N SF460000 ; G 2495 -U 9577 ; WX 602 ; N SF400000 ; G 2496 -U 9578 ; WX 602 ; N SF540000 ; G 2497 -U 9579 ; WX 602 ; N SF530000 ; G 2498 -U 9580 ; WX 602 ; N SF440000 ; G 2499 -U 9581 ; WX 602 ; N uni256D ; G 2500 -U 9582 ; WX 602 ; N uni256E ; G 2501 -U 9583 ; WX 602 ; N uni256F ; G 2502 -U 9584 ; WX 602 ; N uni2570 ; G 2503 -U 9585 ; WX 602 ; N uni2571 ; G 2504 -U 9586 ; WX 602 ; N uni2572 ; G 2505 -U 9587 ; WX 602 ; N uni2573 ; G 2506 -U 9588 ; WX 602 ; N uni2574 ; G 2507 -U 9589 ; WX 602 ; N uni2575 ; G 2508 -U 9590 ; WX 602 ; N uni2576 ; G 2509 -U 9591 ; WX 602 ; N uni2577 ; G 2510 -U 9592 ; WX 602 ; N uni2578 ; G 2511 -U 9593 ; WX 602 ; N uni2579 ; G 2512 -U 9594 ; WX 602 ; N uni257A ; G 2513 -U 9595 ; WX 602 ; N uni257B ; G 2514 -U 9596 ; WX 602 ; N uni257C ; G 2515 -U 9597 ; WX 602 ; N uni257D ; G 2516 -U 9598 ; WX 602 ; N uni257E ; G 2517 -U 9599 ; WX 602 ; N uni257F ; G 2518 -U 9600 ; WX 602 ; N upblock ; G 2519 -U 9601 ; WX 602 ; N uni2581 ; G 2520 -U 9602 ; WX 602 ; N uni2582 ; G 2521 -U 9603 ; WX 602 ; N uni2583 ; G 2522 -U 9604 ; WX 602 ; N dnblock ; G 2523 -U 9605 ; WX 602 ; N uni2585 ; G 2524 -U 9606 ; WX 602 ; N uni2586 ; G 2525 -U 9607 ; WX 602 ; N uni2587 ; G 2526 -U 9608 ; WX 602 ; N block ; G 2527 -U 9609 ; WX 602 ; N uni2589 ; G 2528 -U 9610 ; WX 602 ; N uni258A ; G 2529 -U 9611 ; WX 602 ; N uni258B ; G 2530 -U 9612 ; WX 602 ; N lfblock ; G 2531 -U 9613 ; WX 602 ; N uni258D ; G 2532 -U 9614 ; WX 602 ; N uni258E ; G 2533 -U 9615 ; WX 602 ; N uni258F ; G 2534 -U 9616 ; WX 602 ; N rtblock ; G 2535 -U 9617 ; WX 602 ; N ltshade ; G 2536 -U 9618 ; WX 602 ; N shade ; G 2537 -U 9619 ; WX 602 ; N dkshade ; G 2538 -U 9620 ; WX 602 ; N uni2594 ; G 2539 -U 9621 ; WX 602 ; N uni2595 ; G 2540 -U 9622 ; WX 602 ; N uni2596 ; G 2541 -U 9623 ; WX 602 ; N uni2597 ; G 2542 -U 9624 ; WX 602 ; N uni2598 ; G 2543 -U 9625 ; WX 602 ; N uni2599 ; G 2544 -U 9626 ; WX 602 ; N uni259A ; G 2545 -U 9627 ; WX 602 ; N uni259B ; G 2546 -U 9628 ; WX 602 ; N uni259C ; G 2547 -U 9629 ; WX 602 ; N uni259D ; G 2548 -U 9630 ; WX 602 ; N uni259E ; G 2549 -U 9631 ; WX 602 ; N uni259F ; G 2550 -U 9632 ; WX 602 ; N filledbox ; G 2551 -U 9633 ; WX 602 ; N H22073 ; G 2552 -U 9634 ; WX 602 ; N uni25A2 ; G 2553 -U 9635 ; WX 602 ; N uni25A3 ; G 2554 -U 9636 ; WX 602 ; N uni25A4 ; G 2555 -U 9637 ; WX 602 ; N uni25A5 ; G 2556 -U 9638 ; WX 602 ; N uni25A6 ; G 2557 -U 9639 ; WX 602 ; N uni25A7 ; G 2558 -U 9640 ; WX 602 ; N uni25A8 ; G 2559 -U 9641 ; WX 602 ; N uni25A9 ; G 2560 -U 9642 ; WX 602 ; N H18543 ; G 2561 -U 9643 ; WX 602 ; N H18551 ; G 2562 -U 9644 ; WX 602 ; N filledrect ; G 2563 -U 9645 ; WX 602 ; N uni25AD ; G 2564 -U 9646 ; WX 602 ; N uni25AE ; G 2565 -U 9647 ; WX 602 ; N uni25AF ; G 2566 -U 9648 ; WX 602 ; N uni25B0 ; G 2567 -U 9649 ; WX 602 ; N uni25B1 ; G 2568 -U 9650 ; WX 602 ; N triagup ; G 2569 -U 9651 ; WX 602 ; N uni25B3 ; G 2570 -U 9652 ; WX 602 ; N uni25B4 ; G 2571 -U 9653 ; WX 602 ; N uni25B5 ; G 2572 -U 9654 ; WX 602 ; N uni25B6 ; G 2573 -U 9655 ; WX 602 ; N uni25B7 ; G 2574 -U 9656 ; WX 602 ; N uni25B8 ; G 2575 -U 9657 ; WX 602 ; N uni25B9 ; G 2576 -U 9658 ; WX 602 ; N triagrt ; G 2577 -U 9659 ; WX 602 ; N uni25BB ; G 2578 -U 9660 ; WX 602 ; N triagdn ; G 2579 -U 9661 ; WX 602 ; N uni25BD ; G 2580 -U 9662 ; WX 602 ; N uni25BE ; G 2581 -U 9663 ; WX 602 ; N uni25BF ; G 2582 -U 9664 ; WX 602 ; N uni25C0 ; G 2583 -U 9665 ; WX 602 ; N uni25C1 ; G 2584 -U 9666 ; WX 602 ; N uni25C2 ; G 2585 -U 9667 ; WX 602 ; N uni25C3 ; G 2586 -U 9668 ; WX 602 ; N triaglf ; G 2587 -U 9669 ; WX 602 ; N uni25C5 ; G 2588 -U 9670 ; WX 602 ; N uni25C6 ; G 2589 -U 9671 ; WX 602 ; N uni25C7 ; G 2590 -U 9672 ; WX 602 ; N uni25C8 ; G 2591 -U 9673 ; WX 602 ; N uni25C9 ; G 2592 -U 9674 ; WX 602 ; N lozenge ; G 2593 -U 9675 ; WX 602 ; N circle ; G 2594 -U 9676 ; WX 602 ; N uni25CC ; G 2595 -U 9677 ; WX 602 ; N uni25CD ; G 2596 -U 9678 ; WX 602 ; N uni25CE ; G 2597 -U 9679 ; WX 602 ; N H18533 ; G 2598 -U 9680 ; WX 602 ; N uni25D0 ; G 2599 -U 9681 ; WX 602 ; N uni25D1 ; G 2600 -U 9682 ; WX 602 ; N uni25D2 ; G 2601 -U 9683 ; WX 602 ; N uni25D3 ; G 2602 -U 9684 ; WX 602 ; N uni25D4 ; G 2603 -U 9685 ; WX 602 ; N uni25D5 ; G 2604 -U 9686 ; WX 602 ; N uni25D6 ; G 2605 -U 9687 ; WX 602 ; N uni25D7 ; G 2606 -U 9688 ; WX 602 ; N invbullet ; G 2607 -U 9689 ; WX 602 ; N invcircle ; G 2608 -U 9690 ; WX 602 ; N uni25DA ; G 2609 -U 9691 ; WX 602 ; N uni25DB ; G 2610 -U 9692 ; WX 602 ; N uni25DC ; G 2611 -U 9693 ; WX 602 ; N uni25DD ; G 2612 -U 9694 ; WX 602 ; N uni25DE ; G 2613 -U 9695 ; WX 602 ; N uni25DF ; G 2614 -U 9696 ; WX 602 ; N uni25E0 ; G 2615 -U 9697 ; WX 602 ; N uni25E1 ; G 2616 -U 9698 ; WX 602 ; N uni25E2 ; G 2617 -U 9699 ; WX 602 ; N uni25E3 ; G 2618 -U 9700 ; WX 602 ; N uni25E4 ; G 2619 -U 9701 ; WX 602 ; N uni25E5 ; G 2620 -U 9702 ; WX 602 ; N openbullet ; G 2621 -U 9703 ; WX 602 ; N uni25E7 ; G 2622 -U 9704 ; WX 602 ; N uni25E8 ; G 2623 -U 9705 ; WX 602 ; N uni25E9 ; G 2624 -U 9706 ; WX 602 ; N uni25EA ; G 2625 -U 9707 ; WX 602 ; N uni25EB ; G 2626 -U 9708 ; WX 602 ; N uni25EC ; G 2627 -U 9709 ; WX 602 ; N uni25ED ; G 2628 -U 9710 ; WX 602 ; N uni25EE ; G 2629 -U 9711 ; WX 602 ; N uni25EF ; G 2630 -U 9712 ; WX 602 ; N uni25F0 ; G 2631 -U 9713 ; WX 602 ; N uni25F1 ; G 2632 -U 9714 ; WX 602 ; N uni25F2 ; G 2633 -U 9715 ; WX 602 ; N uni25F3 ; G 2634 -U 9716 ; WX 602 ; N uni25F4 ; G 2635 -U 9717 ; WX 602 ; N uni25F5 ; G 2636 -U 9718 ; WX 602 ; N uni25F6 ; G 2637 -U 9719 ; WX 602 ; N uni25F7 ; G 2638 -U 9720 ; WX 602 ; N uni25F8 ; G 2639 -U 9721 ; WX 602 ; N uni25F9 ; G 2640 -U 9722 ; WX 602 ; N uni25FA ; G 2641 -U 9723 ; WX 602 ; N uni25FB ; G 2642 -U 9724 ; WX 602 ; N uni25FC ; G 2643 -U 9725 ; WX 602 ; N uni25FD ; G 2644 -U 9726 ; WX 602 ; N uni25FE ; G 2645 -U 9727 ; WX 602 ; N uni25FF ; G 2646 -U 9728 ; WX 602 ; N uni2600 ; G 2647 -U 9729 ; WX 602 ; N uni2601 ; G 2648 -U 9730 ; WX 602 ; N uni2602 ; G 2649 -U 9731 ; WX 602 ; N uni2603 ; G 2650 -U 9732 ; WX 602 ; N uni2604 ; G 2651 -U 9733 ; WX 602 ; N uni2605 ; G 2652 -U 9734 ; WX 602 ; N uni2606 ; G 2653 -U 9735 ; WX 602 ; N uni2607 ; G 2654 -U 9736 ; WX 602 ; N uni2608 ; G 2655 -U 9737 ; WX 602 ; N uni2609 ; G 2656 -U 9738 ; WX 602 ; N uni260A ; G 2657 -U 9739 ; WX 602 ; N uni260B ; G 2658 -U 9740 ; WX 602 ; N uni260C ; G 2659 -U 9741 ; WX 602 ; N uni260D ; G 2660 -U 9742 ; WX 602 ; N uni260E ; G 2661 -U 9743 ; WX 602 ; N uni260F ; G 2662 -U 9744 ; WX 602 ; N uni2610 ; G 2663 -U 9745 ; WX 602 ; N uni2611 ; G 2664 -U 9746 ; WX 602 ; N uni2612 ; G 2665 -U 9747 ; WX 602 ; N uni2613 ; G 2666 -U 9748 ; WX 602 ; N uni2614 ; G 2667 -U 9749 ; WX 602 ; N uni2615 ; G 2668 -U 9750 ; WX 602 ; N uni2616 ; G 2669 -U 9751 ; WX 602 ; N uni2617 ; G 2670 -U 9752 ; WX 602 ; N uni2618 ; G 2671 -U 9753 ; WX 602 ; N uni2619 ; G 2672 -U 9754 ; WX 602 ; N uni261A ; G 2673 -U 9755 ; WX 602 ; N uni261B ; G 2674 -U 9756 ; WX 602 ; N uni261C ; G 2675 -U 9757 ; WX 602 ; N uni261D ; G 2676 -U 9758 ; WX 602 ; N uni261E ; G 2677 -U 9759 ; WX 602 ; N uni261F ; G 2678 -U 9760 ; WX 602 ; N uni2620 ; G 2679 -U 9761 ; WX 602 ; N uni2621 ; G 2680 -U 9762 ; WX 602 ; N uni2622 ; G 2681 -U 9763 ; WX 602 ; N uni2623 ; G 2682 -U 9764 ; WX 602 ; N uni2624 ; G 2683 -U 9765 ; WX 602 ; N uni2625 ; G 2684 -U 9766 ; WX 602 ; N uni2626 ; G 2685 -U 9767 ; WX 602 ; N uni2627 ; G 2686 -U 9768 ; WX 602 ; N uni2628 ; G 2687 -U 9769 ; WX 602 ; N uni2629 ; G 2688 -U 9770 ; WX 602 ; N uni262A ; G 2689 -U 9771 ; WX 602 ; N uni262B ; G 2690 -U 9772 ; WX 602 ; N uni262C ; G 2691 -U 9773 ; WX 602 ; N uni262D ; G 2692 -U 9774 ; WX 602 ; N uni262E ; G 2693 -U 9775 ; WX 602 ; N uni262F ; G 2694 -U 9784 ; WX 602 ; N uni2638 ; G 2695 -U 9785 ; WX 602 ; N uni2639 ; G 2696 -U 9786 ; WX 602 ; N smileface ; G 2697 -U 9787 ; WX 602 ; N invsmileface ; G 2698 -U 9788 ; WX 602 ; N sun ; G 2699 -U 9789 ; WX 602 ; N uni263D ; G 2700 -U 9790 ; WX 602 ; N uni263E ; G 2701 -U 9791 ; WX 602 ; N uni263F ; G 2702 -U 9792 ; WX 602 ; N female ; G 2703 -U 9793 ; WX 602 ; N uni2641 ; G 2704 -U 9794 ; WX 602 ; N male ; G 2705 -U 9795 ; WX 602 ; N uni2643 ; G 2706 -U 9796 ; WX 602 ; N uni2644 ; G 2707 -U 9797 ; WX 602 ; N uni2645 ; G 2708 -U 9798 ; WX 602 ; N uni2646 ; G 2709 -U 9799 ; WX 602 ; N uni2647 ; G 2710 -U 9800 ; WX 602 ; N uni2648 ; G 2711 -U 9801 ; WX 602 ; N uni2649 ; G 2712 -U 9802 ; WX 602 ; N uni264A ; G 2713 -U 9803 ; WX 602 ; N uni264B ; G 2714 -U 9804 ; WX 602 ; N uni264C ; G 2715 -U 9805 ; WX 602 ; N uni264D ; G 2716 -U 9806 ; WX 602 ; N uni264E ; G 2717 -U 9807 ; WX 602 ; N uni264F ; G 2718 -U 9808 ; WX 602 ; N uni2650 ; G 2719 -U 9809 ; WX 602 ; N uni2651 ; G 2720 -U 9810 ; WX 602 ; N uni2652 ; G 2721 -U 9811 ; WX 602 ; N uni2653 ; G 2722 -U 9812 ; WX 602 ; N uni2654 ; G 2723 -U 9813 ; WX 602 ; N uni2655 ; G 2724 -U 9814 ; WX 602 ; N uni2656 ; G 2725 -U 9815 ; WX 602 ; N uni2657 ; G 2726 -U 9816 ; WX 602 ; N uni2658 ; G 2727 -U 9817 ; WX 602 ; N uni2659 ; G 2728 -U 9818 ; WX 602 ; N uni265A ; G 2729 -U 9819 ; WX 602 ; N uni265B ; G 2730 -U 9820 ; WX 602 ; N uni265C ; G 2731 -U 9821 ; WX 602 ; N uni265D ; G 2732 -U 9822 ; WX 602 ; N uni265E ; G 2733 -U 9823 ; WX 602 ; N uni265F ; G 2734 -U 9824 ; WX 602 ; N spade ; G 2735 -U 9825 ; WX 602 ; N uni2661 ; G 2736 -U 9826 ; WX 602 ; N uni2662 ; G 2737 -U 9827 ; WX 602 ; N club ; G 2738 -U 9828 ; WX 602 ; N uni2664 ; G 2739 -U 9829 ; WX 602 ; N heart ; G 2740 -U 9830 ; WX 602 ; N diamond ; G 2741 -U 9831 ; WX 602 ; N uni2667 ; G 2742 -U 9832 ; WX 602 ; N uni2668 ; G 2743 -U 9833 ; WX 602 ; N uni2669 ; G 2744 -U 9834 ; WX 602 ; N musicalnote ; G 2745 -U 9835 ; WX 602 ; N musicalnotedbl ; G 2746 -U 9836 ; WX 602 ; N uni266C ; G 2747 -U 9837 ; WX 602 ; N uni266D ; G 2748 -U 9838 ; WX 602 ; N uni266E ; G 2749 -U 9839 ; WX 602 ; N uni266F ; G 2750 -U 9840 ; WX 602 ; N uni2670 ; G 2751 -U 9841 ; WX 602 ; N uni2671 ; G 2752 -U 9842 ; WX 602 ; N uni2672 ; G 2753 -U 9843 ; WX 602 ; N uni2673 ; G 2754 -U 9844 ; WX 602 ; N uni2674 ; G 2755 -U 9845 ; WX 602 ; N uni2675 ; G 2756 -U 9846 ; WX 602 ; N uni2676 ; G 2757 -U 9847 ; WX 602 ; N uni2677 ; G 2758 -U 9848 ; WX 602 ; N uni2678 ; G 2759 -U 9849 ; WX 602 ; N uni2679 ; G 2760 -U 9850 ; WX 602 ; N uni267A ; G 2761 -U 9851 ; WX 602 ; N uni267B ; G 2762 -U 9852 ; WX 602 ; N uni267C ; G 2763 -U 9853 ; WX 602 ; N uni267D ; G 2764 -U 9854 ; WX 602 ; N uni267E ; G 2765 -U 9855 ; WX 602 ; N uni267F ; G 2766 -U 9856 ; WX 602 ; N uni2680 ; G 2767 -U 9857 ; WX 602 ; N uni2681 ; G 2768 -U 9858 ; WX 602 ; N uni2682 ; G 2769 -U 9859 ; WX 602 ; N uni2683 ; G 2770 -U 9860 ; WX 602 ; N uni2684 ; G 2771 -U 9861 ; WX 602 ; N uni2685 ; G 2772 -U 9862 ; WX 602 ; N uni2686 ; G 2773 -U 9863 ; WX 602 ; N uni2687 ; G 2774 -U 9864 ; WX 602 ; N uni2688 ; G 2775 -U 9865 ; WX 602 ; N uni2689 ; G 2776 -U 9866 ; WX 602 ; N uni268A ; G 2777 -U 9867 ; WX 602 ; N uni268B ; G 2778 -U 9872 ; WX 602 ; N uni2690 ; G 2779 -U 9873 ; WX 602 ; N uni2691 ; G 2780 -U 9874 ; WX 602 ; N uni2692 ; G 2781 -U 9875 ; WX 602 ; N uni2693 ; G 2782 -U 9876 ; WX 602 ; N uni2694 ; G 2783 -U 9877 ; WX 602 ; N uni2695 ; G 2784 -U 9878 ; WX 602 ; N uni2696 ; G 2785 -U 9879 ; WX 602 ; N uni2697 ; G 2786 -U 9880 ; WX 602 ; N uni2698 ; G 2787 -U 9881 ; WX 602 ; N uni2699 ; G 2788 -U 9882 ; WX 602 ; N uni269A ; G 2789 -U 9883 ; WX 602 ; N uni269B ; G 2790 -U 9884 ; WX 602 ; N uni269C ; G 2791 -U 9888 ; WX 602 ; N uni26A0 ; G 2792 -U 9889 ; WX 602 ; N uni26A1 ; G 2793 -U 9904 ; WX 602 ; N uni26B0 ; G 2794 -U 9905 ; WX 602 ; N uni26B1 ; G 2795 -U 9985 ; WX 602 ; N uni2701 ; G 2796 -U 9986 ; WX 602 ; N uni2702 ; G 2797 -U 9987 ; WX 602 ; N uni2703 ; G 2798 -U 9988 ; WX 602 ; N uni2704 ; G 2799 -U 9990 ; WX 602 ; N uni2706 ; G 2800 -U 9991 ; WX 602 ; N uni2707 ; G 2801 -U 9992 ; WX 602 ; N uni2708 ; G 2802 -U 9993 ; WX 602 ; N uni2709 ; G 2803 -U 9996 ; WX 602 ; N uni270C ; G 2804 -U 9997 ; WX 602 ; N uni270D ; G 2805 -U 9998 ; WX 602 ; N uni270E ; G 2806 -U 9999 ; WX 602 ; N uni270F ; G 2807 -U 10000 ; WX 602 ; N uni2710 ; G 2808 -U 10001 ; WX 602 ; N uni2711 ; G 2809 -U 10002 ; WX 602 ; N uni2712 ; G 2810 -U 10003 ; WX 602 ; N uni2713 ; G 2811 -U 10004 ; WX 602 ; N uni2714 ; G 2812 -U 10005 ; WX 602 ; N uni2715 ; G 2813 -U 10006 ; WX 602 ; N uni2716 ; G 2814 -U 10007 ; WX 602 ; N uni2717 ; G 2815 -U 10008 ; WX 602 ; N uni2718 ; G 2816 -U 10009 ; WX 602 ; N uni2719 ; G 2817 -U 10010 ; WX 602 ; N uni271A ; G 2818 -U 10011 ; WX 602 ; N uni271B ; G 2819 -U 10012 ; WX 602 ; N uni271C ; G 2820 -U 10013 ; WX 602 ; N uni271D ; G 2821 -U 10014 ; WX 602 ; N uni271E ; G 2822 -U 10015 ; WX 602 ; N uni271F ; G 2823 -U 10016 ; WX 602 ; N uni2720 ; G 2824 -U 10017 ; WX 602 ; N uni2721 ; G 2825 -U 10018 ; WX 602 ; N uni2722 ; G 2826 -U 10019 ; WX 602 ; N uni2723 ; G 2827 -U 10020 ; WX 602 ; N uni2724 ; G 2828 -U 10021 ; WX 602 ; N uni2725 ; G 2829 -U 10022 ; WX 602 ; N uni2726 ; G 2830 -U 10023 ; WX 602 ; N uni2727 ; G 2831 -U 10025 ; WX 602 ; N uni2729 ; G 2832 -U 10026 ; WX 602 ; N uni272A ; G 2833 -U 10027 ; WX 602 ; N uni272B ; G 2834 -U 10028 ; WX 602 ; N uni272C ; G 2835 -U 10029 ; WX 602 ; N uni272D ; G 2836 -U 10030 ; WX 602 ; N uni272E ; G 2837 -U 10031 ; WX 602 ; N uni272F ; G 2838 -U 10032 ; WX 602 ; N uni2730 ; G 2839 -U 10033 ; WX 602 ; N uni2731 ; G 2840 -U 10034 ; WX 602 ; N uni2732 ; G 2841 -U 10035 ; WX 602 ; N uni2733 ; G 2842 -U 10036 ; WX 602 ; N uni2734 ; G 2843 -U 10037 ; WX 602 ; N uni2735 ; G 2844 -U 10038 ; WX 602 ; N uni2736 ; G 2845 -U 10039 ; WX 602 ; N uni2737 ; G 2846 -U 10040 ; WX 602 ; N uni2738 ; G 2847 -U 10041 ; WX 602 ; N uni2739 ; G 2848 -U 10042 ; WX 602 ; N uni273A ; G 2849 -U 10043 ; WX 602 ; N uni273B ; G 2850 -U 10044 ; WX 602 ; N uni273C ; G 2851 -U 10045 ; WX 602 ; N uni273D ; G 2852 -U 10046 ; WX 602 ; N uni273E ; G 2853 -U 10047 ; WX 602 ; N uni273F ; G 2854 -U 10048 ; WX 602 ; N uni2740 ; G 2855 -U 10049 ; WX 602 ; N uni2741 ; G 2856 -U 10050 ; WX 602 ; N uni2742 ; G 2857 -U 10051 ; WX 602 ; N uni2743 ; G 2858 -U 10052 ; WX 602 ; N uni2744 ; G 2859 -U 10053 ; WX 602 ; N uni2745 ; G 2860 -U 10054 ; WX 602 ; N uni2746 ; G 2861 -U 10055 ; WX 602 ; N uni2747 ; G 2862 -U 10056 ; WX 602 ; N uni2748 ; G 2863 -U 10057 ; WX 602 ; N uni2749 ; G 2864 -U 10058 ; WX 602 ; N uni274A ; G 2865 -U 10059 ; WX 602 ; N uni274B ; G 2866 -U 10061 ; WX 602 ; N uni274D ; G 2867 -U 10063 ; WX 602 ; N uni274F ; G 2868 -U 10064 ; WX 602 ; N uni2750 ; G 2869 -U 10065 ; WX 602 ; N uni2751 ; G 2870 -U 10066 ; WX 602 ; N uni2752 ; G 2871 -U 10070 ; WX 602 ; N uni2756 ; G 2872 -U 10072 ; WX 602 ; N uni2758 ; G 2873 -U 10073 ; WX 602 ; N uni2759 ; G 2874 -U 10074 ; WX 602 ; N uni275A ; G 2875 -U 10075 ; WX 602 ; N uni275B ; G 2876 -U 10076 ; WX 602 ; N uni275C ; G 2877 -U 10077 ; WX 602 ; N uni275D ; G 2878 -U 10078 ; WX 602 ; N uni275E ; G 2879 -U 10081 ; WX 602 ; N uni2761 ; G 2880 -U 10082 ; WX 602 ; N uni2762 ; G 2881 -U 10083 ; WX 602 ; N uni2763 ; G 2882 -U 10084 ; WX 602 ; N uni2764 ; G 2883 -U 10085 ; WX 602 ; N uni2765 ; G 2884 -U 10086 ; WX 602 ; N uni2766 ; G 2885 -U 10087 ; WX 602 ; N uni2767 ; G 2886 -U 10088 ; WX 602 ; N uni2768 ; G 2887 -U 10089 ; WX 602 ; N uni2769 ; G 2888 -U 10090 ; WX 602 ; N uni276A ; G 2889 -U 10091 ; WX 602 ; N uni276B ; G 2890 -U 10092 ; WX 602 ; N uni276C ; G 2891 -U 10093 ; WX 602 ; N uni276D ; G 2892 -U 10094 ; WX 602 ; N uni276E ; G 2893 -U 10095 ; WX 602 ; N uni276F ; G 2894 -U 10096 ; WX 602 ; N uni2770 ; G 2895 -U 10097 ; WX 602 ; N uni2771 ; G 2896 -U 10098 ; WX 602 ; N uni2772 ; G 2897 -U 10099 ; WX 602 ; N uni2773 ; G 2898 -U 10100 ; WX 602 ; N uni2774 ; G 2899 -U 10101 ; WX 602 ; N uni2775 ; G 2900 -U 10132 ; WX 602 ; N uni2794 ; G 2901 -U 10136 ; WX 602 ; N uni2798 ; G 2902 -U 10137 ; WX 602 ; N uni2799 ; G 2903 -U 10138 ; WX 602 ; N uni279A ; G 2904 -U 10139 ; WX 602 ; N uni279B ; G 2905 -U 10140 ; WX 602 ; N uni279C ; G 2906 -U 10141 ; WX 602 ; N uni279D ; G 2907 -U 10142 ; WX 602 ; N uni279E ; G 2908 -U 10143 ; WX 602 ; N uni279F ; G 2909 -U 10144 ; WX 602 ; N uni27A0 ; G 2910 -U 10145 ; WX 602 ; N uni27A1 ; G 2911 -U 10146 ; WX 602 ; N uni27A2 ; G 2912 -U 10147 ; WX 602 ; N uni27A3 ; G 2913 -U 10148 ; WX 602 ; N uni27A4 ; G 2914 -U 10149 ; WX 602 ; N uni27A5 ; G 2915 -U 10150 ; WX 602 ; N uni27A6 ; G 2916 -U 10151 ; WX 602 ; N uni27A7 ; G 2917 -U 10152 ; WX 602 ; N uni27A8 ; G 2918 -U 10153 ; WX 602 ; N uni27A9 ; G 2919 -U 10154 ; WX 602 ; N uni27AA ; G 2920 -U 10155 ; WX 602 ; N uni27AB ; G 2921 -U 10156 ; WX 602 ; N uni27AC ; G 2922 -U 10157 ; WX 602 ; N uni27AD ; G 2923 -U 10158 ; WX 602 ; N uni27AE ; G 2924 -U 10159 ; WX 602 ; N uni27AF ; G 2925 -U 10161 ; WX 602 ; N uni27B1 ; G 2926 -U 10162 ; WX 602 ; N uni27B2 ; G 2927 -U 10163 ; WX 602 ; N uni27B3 ; G 2928 -U 10164 ; WX 602 ; N uni27B4 ; G 2929 -U 10165 ; WX 602 ; N uni27B5 ; G 2930 -U 10166 ; WX 602 ; N uni27B6 ; G 2931 -U 10167 ; WX 602 ; N uni27B7 ; G 2932 -U 10168 ; WX 602 ; N uni27B8 ; G 2933 -U 10169 ; WX 602 ; N uni27B9 ; G 2934 -U 10170 ; WX 602 ; N uni27BA ; G 2935 -U 10171 ; WX 602 ; N uni27BB ; G 2936 -U 10172 ; WX 602 ; N uni27BC ; G 2937 -U 10173 ; WX 602 ; N uni27BD ; G 2938 -U 10174 ; WX 602 ; N uni27BE ; G 2939 -U 10175 ; WX 602 ; N uni27BF ; G 2940 -U 10178 ; WX 602 ; N uni27C2 ; G 2941 -U 10181 ; WX 602 ; N uni27C5 ; G 2942 -U 10182 ; WX 602 ; N uni27C6 ; G 2943 -U 10204 ; WX 602 ; N uni27DC ; G 2944 -U 10208 ; WX 602 ; N uni27E0 ; G 2945 -U 10214 ; WX 602 ; N uni27E6 ; G 2946 -U 10215 ; WX 602 ; N uni27E7 ; G 2947 -U 10216 ; WX 602 ; N uni27E8 ; G 2948 -U 10217 ; WX 602 ; N uni27E9 ; G 2949 -U 10218 ; WX 602 ; N uni27EA ; G 2950 -U 10219 ; WX 602 ; N uni27EB ; G 2951 -U 10229 ; WX 602 ; N uni27F5 ; G 2952 -U 10230 ; WX 602 ; N uni27F6 ; G 2953 -U 10231 ; WX 602 ; N uni27F7 ; G 2954 -U 10631 ; WX 602 ; N uni2987 ; G 2955 -U 10632 ; WX 602 ; N uni2988 ; G 2956 -U 10647 ; WX 602 ; N uni2997 ; G 2957 -U 10648 ; WX 602 ; N uni2998 ; G 2958 -U 10731 ; WX 602 ; N uni29EB ; G 2959 -U 10746 ; WX 602 ; N uni29FA ; G 2960 -U 10747 ; WX 602 ; N uni29FB ; G 2961 -U 10752 ; WX 602 ; N uni2A00 ; G 2962 -U 10799 ; WX 602 ; N uni2A2F ; G 2963 -U 10858 ; WX 602 ; N uni2A6A ; G 2964 -U 10859 ; WX 602 ; N uni2A6B ; G 2965 -U 11013 ; WX 602 ; N uni2B05 ; G 2966 -U 11014 ; WX 602 ; N uni2B06 ; G 2967 -U 11015 ; WX 602 ; N uni2B07 ; G 2968 -U 11016 ; WX 602 ; N uni2B08 ; G 2969 -U 11017 ; WX 602 ; N uni2B09 ; G 2970 -U 11018 ; WX 602 ; N uni2B0A ; G 2971 -U 11019 ; WX 602 ; N uni2B0B ; G 2972 -U 11020 ; WX 602 ; N uni2B0C ; G 2973 -U 11021 ; WX 602 ; N uni2B0D ; G 2974 -U 11026 ; WX 602 ; N uni2B12 ; G 2975 -U 11027 ; WX 602 ; N uni2B13 ; G 2976 -U 11028 ; WX 602 ; N uni2B14 ; G 2977 -U 11029 ; WX 602 ; N uni2B15 ; G 2978 -U 11030 ; WX 602 ; N uni2B16 ; G 2979 -U 11031 ; WX 602 ; N uni2B17 ; G 2980 -U 11032 ; WX 602 ; N uni2B18 ; G 2981 -U 11033 ; WX 602 ; N uni2B19 ; G 2982 -U 11034 ; WX 602 ; N uni2B1A ; G 2983 -U 11364 ; WX 602 ; N uni2C64 ; G 2984 -U 11373 ; WX 602 ; N uni2C6D ; G 2985 -U 11374 ; WX 602 ; N uni2C6E ; G 2986 -U 11375 ; WX 602 ; N uni2C6F ; G 2987 -U 11376 ; WX 602 ; N uni2C70 ; G 2988 -U 11381 ; WX 602 ; N uni2C75 ; G 2989 -U 11382 ; WX 602 ; N uni2C76 ; G 2990 -U 11383 ; WX 602 ; N uni2C77 ; G 2991 -U 11385 ; WX 602 ; N uni2C79 ; G 2992 -U 11386 ; WX 602 ; N uni2C7A ; G 2993 -U 11388 ; WX 602 ; N uni2C7C ; G 2994 -U 11389 ; WX 602 ; N uni2C7D ; G 2995 -U 11390 ; WX 602 ; N uni2C7E ; G 2996 -U 11391 ; WX 602 ; N uni2C7F ; G 2997 -U 11800 ; WX 602 ; N uni2E18 ; G 2998 -U 11807 ; WX 602 ; N uni2E1F ; G 2999 -U 11810 ; WX 602 ; N uni2E22 ; G 3000 -U 11811 ; WX 602 ; N uni2E23 ; G 3001 -U 11812 ; WX 602 ; N uni2E24 ; G 3002 -U 11813 ; WX 602 ; N uni2E25 ; G 3003 -U 11822 ; WX 602 ; N uni2E2E ; G 3004 -U 42760 ; WX 602 ; N uniA708 ; G 3005 -U 42761 ; WX 602 ; N uniA709 ; G 3006 -U 42762 ; WX 602 ; N uniA70A ; G 3007 -U 42763 ; WX 602 ; N uniA70B ; G 3008 -U 42764 ; WX 602 ; N uniA70C ; G 3009 -U 42765 ; WX 602 ; N uniA70D ; G 3010 -U 42766 ; WX 602 ; N uniA70E ; G 3011 -U 42767 ; WX 602 ; N uniA70F ; G 3012 -U 42768 ; WX 602 ; N uniA710 ; G 3013 -U 42769 ; WX 602 ; N uniA711 ; G 3014 -U 42770 ; WX 602 ; N uniA712 ; G 3015 -U 42771 ; WX 602 ; N uniA713 ; G 3016 -U 42772 ; WX 602 ; N uniA714 ; G 3017 -U 42773 ; WX 602 ; N uniA715 ; G 3018 -U 42774 ; WX 602 ; N uniA716 ; G 3019 -U 42779 ; WX 602 ; N uniA71B ; G 3020 -U 42780 ; WX 602 ; N uniA71C ; G 3021 -U 42781 ; WX 602 ; N uniA71D ; G 3022 -U 42782 ; WX 602 ; N uniA71E ; G 3023 -U 42783 ; WX 602 ; N uniA71F ; G 3024 -U 42786 ; WX 602 ; N uniA722 ; G 3025 -U 42787 ; WX 602 ; N uniA723 ; G 3026 -U 42788 ; WX 602 ; N uniA724 ; G 3027 -U 42789 ; WX 602 ; N uniA725 ; G 3028 -U 42790 ; WX 602 ; N uniA726 ; G 3029 -U 42791 ; WX 602 ; N uniA727 ; G 3030 -U 42889 ; WX 602 ; N uniA789 ; G 3031 -U 42890 ; WX 602 ; N uniA78A ; G 3032 -U 42891 ; WX 602 ; N uniA78B ; G 3033 -U 42892 ; WX 602 ; N uniA78C ; G 3034 -U 42893 ; WX 602 ; N uniA78D ; G 3035 -U 42894 ; WX 602 ; N uniA78E ; G 3036 -U 42896 ; WX 602 ; N uniA790 ; G 3037 -U 42897 ; WX 602 ; N uniA791 ; G 3038 -U 42922 ; WX 602 ; N uniA7AA ; G 3039 -U 43000 ; WX 602 ; N uniA7F8 ; G 3040 -U 43001 ; WX 602 ; N uniA7F9 ; G 3041 -U 63173 ; WX 602 ; N uniF6C5 ; G 3042 -U 64257 ; WX 602 ; N fi ; G 3043 -U 64258 ; WX 602 ; N fl ; G 3044 -U 64338 ; WX 602 ; N uniFB52 ; G 3045 -U 64339 ; WX 602 ; N uniFB53 ; G 3046 -U 64340 ; WX 602 ; N uniFB54 ; G 3047 -U 64341 ; WX 602 ; N uniFB55 ; G 3048 -U 64342 ; WX 602 ; N uniFB56 ; G 3049 -U 64343 ; WX 602 ; N uniFB57 ; G 3050 -U 64344 ; WX 602 ; N uniFB58 ; G 3051 -U 64345 ; WX 602 ; N uniFB59 ; G 3052 -U 64346 ; WX 602 ; N uniFB5A ; G 3053 -U 64347 ; WX 602 ; N uniFB5B ; G 3054 -U 64348 ; WX 602 ; N uniFB5C ; G 3055 -U 64349 ; WX 602 ; N uniFB5D ; G 3056 -U 64350 ; WX 602 ; N uniFB5E ; G 3057 -U 64351 ; WX 602 ; N uniFB5F ; G 3058 -U 64352 ; WX 602 ; N uniFB60 ; G 3059 -U 64353 ; WX 602 ; N uniFB61 ; G 3060 -U 64354 ; WX 602 ; N uniFB62 ; G 3061 -U 64355 ; WX 602 ; N uniFB63 ; G 3062 -U 64356 ; WX 602 ; N uniFB64 ; G 3063 -U 64357 ; WX 602 ; N uniFB65 ; G 3064 -U 64358 ; WX 602 ; N uniFB66 ; G 3065 -U 64359 ; WX 602 ; N uniFB67 ; G 3066 -U 64360 ; WX 602 ; N uniFB68 ; G 3067 -U 64361 ; WX 602 ; N uniFB69 ; G 3068 -U 64362 ; WX 602 ; N uniFB6A ; G 3069 -U 64363 ; WX 602 ; N uniFB6B ; G 3070 -U 64364 ; WX 602 ; N uniFB6C ; G 3071 -U 64365 ; WX 602 ; N uniFB6D ; G 3072 -U 64366 ; WX 602 ; N uniFB6E ; G 3073 -U 64367 ; WX 602 ; N uniFB6F ; G 3074 -U 64368 ; WX 602 ; N uniFB70 ; G 3075 -U 64369 ; WX 602 ; N uniFB71 ; G 3076 -U 64370 ; WX 602 ; N uniFB72 ; G 3077 -U 64371 ; WX 602 ; N uniFB73 ; G 3078 -U 64372 ; WX 602 ; N uniFB74 ; G 3079 -U 64373 ; WX 602 ; N uniFB75 ; G 3080 -U 64374 ; WX 602 ; N uniFB76 ; G 3081 -U 64375 ; WX 602 ; N uniFB77 ; G 3082 -U 64376 ; WX 602 ; N uniFB78 ; G 3083 -U 64377 ; WX 602 ; N uniFB79 ; G 3084 -U 64378 ; WX 602 ; N uniFB7A ; G 3085 -U 64379 ; WX 602 ; N uniFB7B ; G 3086 -U 64380 ; WX 602 ; N uniFB7C ; G 3087 -U 64381 ; WX 602 ; N uniFB7D ; G 3088 -U 64382 ; WX 602 ; N uniFB7E ; G 3089 -U 64383 ; WX 602 ; N uniFB7F ; G 3090 -U 64384 ; WX 602 ; N uniFB80 ; G 3091 -U 64385 ; WX 602 ; N uniFB81 ; G 3092 -U 64394 ; WX 602 ; N uniFB8A ; G 3093 -U 64395 ; WX 602 ; N uniFB8B ; G 3094 -U 64396 ; WX 602 ; N uniFB8C ; G 3095 -U 64397 ; WX 602 ; N uniFB8D ; G 3096 -U 64398 ; WX 602 ; N uniFB8E ; G 3097 -U 64399 ; WX 602 ; N uniFB8F ; G 3098 -U 64400 ; WX 602 ; N uniFB90 ; G 3099 -U 64401 ; WX 602 ; N uniFB91 ; G 3100 -U 64402 ; WX 602 ; N uniFB92 ; G 3101 -U 64403 ; WX 602 ; N uniFB93 ; G 3102 -U 64404 ; WX 602 ; N uniFB94 ; G 3103 -U 64405 ; WX 602 ; N uniFB95 ; G 3104 -U 64414 ; WX 602 ; N uniFB9E ; G 3105 -U 64415 ; WX 602 ; N uniFB9F ; G 3106 -U 64426 ; WX 602 ; N uniFBAA ; G 3107 -U 64427 ; WX 602 ; N uniFBAB ; G 3108 -U 64428 ; WX 602 ; N uniFBAC ; G 3109 -U 64429 ; WX 602 ; N uniFBAD ; G 3110 -U 64488 ; WX 602 ; N uniFBE8 ; G 3111 -U 64489 ; WX 602 ; N uniFBE9 ; G 3112 -U 64508 ; WX 602 ; N uniFBFC ; G 3113 -U 64509 ; WX 602 ; N uniFBFD ; G 3114 -U 64510 ; WX 602 ; N uniFBFE ; G 3115 -U 64511 ; WX 602 ; N uniFBFF ; G 3116 -U 65136 ; WX 602 ; N uniFE70 ; G 3117 -U 65137 ; WX 602 ; N uniFE71 ; G 3118 -U 65138 ; WX 602 ; N uniFE72 ; G 3119 -U 65139 ; WX 602 ; N uniFE73 ; G 3120 -U 65140 ; WX 602 ; N uniFE74 ; G 3121 -U 65142 ; WX 602 ; N uniFE76 ; G 3122 -U 65143 ; WX 602 ; N uniFE77 ; G 3123 -U 65144 ; WX 602 ; N uniFE78 ; G 3124 -U 65145 ; WX 602 ; N uniFE79 ; G 3125 -U 65146 ; WX 602 ; N uniFE7A ; G 3126 -U 65147 ; WX 602 ; N uniFE7B ; G 3127 -U 65148 ; WX 602 ; N uniFE7C ; G 3128 -U 65149 ; WX 602 ; N uniFE7D ; G 3129 -U 65150 ; WX 602 ; N uniFE7E ; G 3130 -U 65151 ; WX 602 ; N uniFE7F ; G 3131 -U 65152 ; WX 602 ; N uniFE80 ; G 3132 -U 65153 ; WX 602 ; N uniFE81 ; G 3133 -U 65154 ; WX 602 ; N uniFE82 ; G 3134 -U 65155 ; WX 602 ; N uniFE83 ; G 3135 -U 65156 ; WX 602 ; N uniFE84 ; G 3136 -U 65157 ; WX 602 ; N uniFE85 ; G 3137 -U 65158 ; WX 602 ; N uniFE86 ; G 3138 -U 65159 ; WX 602 ; N uniFE87 ; G 3139 -U 65160 ; WX 602 ; N uniFE88 ; G 3140 -U 65161 ; WX 602 ; N uniFE89 ; G 3141 -U 65162 ; WX 602 ; N uniFE8A ; G 3142 -U 65163 ; WX 602 ; N uniFE8B ; G 3143 -U 65164 ; WX 602 ; N uniFE8C ; G 3144 -U 65165 ; WX 602 ; N uniFE8D ; G 3145 -U 65166 ; WX 602 ; N uniFE8E ; G 3146 -U 65167 ; WX 602 ; N uniFE8F ; G 3147 -U 65168 ; WX 602 ; N uniFE90 ; G 3148 -U 65169 ; WX 602 ; N uniFE91 ; G 3149 -U 65170 ; WX 602 ; N uniFE92 ; G 3150 -U 65171 ; WX 602 ; N uniFE93 ; G 3151 -U 65172 ; WX 602 ; N uniFE94 ; G 3152 -U 65173 ; WX 602 ; N uniFE95 ; G 3153 -U 65174 ; WX 602 ; N uniFE96 ; G 3154 -U 65175 ; WX 602 ; N uniFE97 ; G 3155 -U 65176 ; WX 602 ; N uniFE98 ; G 3156 -U 65177 ; WX 602 ; N uniFE99 ; G 3157 -U 65178 ; WX 602 ; N uniFE9A ; G 3158 -U 65179 ; WX 602 ; N uniFE9B ; G 3159 -U 65180 ; WX 602 ; N uniFE9C ; G 3160 -U 65181 ; WX 602 ; N uniFE9D ; G 3161 -U 65182 ; WX 602 ; N uniFE9E ; G 3162 -U 65183 ; WX 602 ; N uniFE9F ; G 3163 -U 65184 ; WX 602 ; N uniFEA0 ; G 3164 -U 65185 ; WX 602 ; N uniFEA1 ; G 3165 -U 65186 ; WX 602 ; N uniFEA2 ; G 3166 -U 65187 ; WX 602 ; N uniFEA3 ; G 3167 -U 65188 ; WX 602 ; N uniFEA4 ; G 3168 -U 65189 ; WX 602 ; N uniFEA5 ; G 3169 -U 65190 ; WX 602 ; N uniFEA6 ; G 3170 -U 65191 ; WX 602 ; N uniFEA7 ; G 3171 -U 65192 ; WX 602 ; N uniFEA8 ; G 3172 -U 65193 ; WX 602 ; N uniFEA9 ; G 3173 -U 65194 ; WX 602 ; N uniFEAA ; G 3174 -U 65195 ; WX 602 ; N uniFEAB ; G 3175 -U 65196 ; WX 602 ; N uniFEAC ; G 3176 -U 65197 ; WX 602 ; N uniFEAD ; G 3177 -U 65198 ; WX 602 ; N uniFEAE ; G 3178 -U 65199 ; WX 602 ; N uniFEAF ; G 3179 -U 65200 ; WX 602 ; N uniFEB0 ; G 3180 -U 65201 ; WX 602 ; N uniFEB1 ; G 3181 -U 65202 ; WX 602 ; N uniFEB2 ; G 3182 -U 65203 ; WX 602 ; N uniFEB3 ; G 3183 -U 65204 ; WX 602 ; N uniFEB4 ; G 3184 -U 65205 ; WX 602 ; N uniFEB5 ; G 3185 -U 65206 ; WX 602 ; N uniFEB6 ; G 3186 -U 65207 ; WX 602 ; N uniFEB7 ; G 3187 -U 65208 ; WX 602 ; N uniFEB8 ; G 3188 -U 65209 ; WX 602 ; N uniFEB9 ; G 3189 -U 65210 ; WX 602 ; N uniFEBA ; G 3190 -U 65211 ; WX 602 ; N uniFEBB ; G 3191 -U 65212 ; WX 602 ; N uniFEBC ; G 3192 -U 65213 ; WX 602 ; N uniFEBD ; G 3193 -U 65214 ; WX 602 ; N uniFEBE ; G 3194 -U 65215 ; WX 602 ; N uniFEBF ; G 3195 -U 65216 ; WX 602 ; N uniFEC0 ; G 3196 -U 65217 ; WX 602 ; N uniFEC1 ; G 3197 -U 65218 ; WX 602 ; N uniFEC2 ; G 3198 -U 65219 ; WX 602 ; N uniFEC3 ; G 3199 -U 65220 ; WX 602 ; N uniFEC4 ; G 3200 -U 65221 ; WX 602 ; N uniFEC5 ; G 3201 -U 65222 ; WX 602 ; N uniFEC6 ; G 3202 -U 65223 ; WX 602 ; N uniFEC7 ; G 3203 -U 65224 ; WX 602 ; N uniFEC8 ; G 3204 -U 65225 ; WX 602 ; N uniFEC9 ; G 3205 -U 65226 ; WX 602 ; N uniFECA ; G 3206 -U 65227 ; WX 602 ; N uniFECB ; G 3207 -U 65228 ; WX 602 ; N uniFECC ; G 3208 -U 65229 ; WX 602 ; N uniFECD ; G 3209 -U 65230 ; WX 602 ; N uniFECE ; G 3210 -U 65231 ; WX 602 ; N uniFECF ; G 3211 -U 65232 ; WX 602 ; N uniFED0 ; G 3212 -U 65233 ; WX 602 ; N uniFED1 ; G 3213 -U 65234 ; WX 602 ; N uniFED2 ; G 3214 -U 65235 ; WX 602 ; N uniFED3 ; G 3215 -U 65236 ; WX 602 ; N uniFED4 ; G 3216 -U 65237 ; WX 602 ; N uniFED5 ; G 3217 -U 65238 ; WX 602 ; N uniFED6 ; G 3218 -U 65239 ; WX 602 ; N uniFED7 ; G 3219 -U 65240 ; WX 602 ; N uniFED8 ; G 3220 -U 65241 ; WX 602 ; N uniFED9 ; G 3221 -U 65242 ; WX 602 ; N uniFEDA ; G 3222 -U 65243 ; WX 602 ; N uniFEDB ; G 3223 -U 65244 ; WX 602 ; N uniFEDC ; G 3224 -U 65245 ; WX 602 ; N uniFEDD ; G 3225 -U 65246 ; WX 602 ; N uniFEDE ; G 3226 -U 65247 ; WX 602 ; N uniFEDF ; G 3227 -U 65248 ; WX 602 ; N uniFEE0 ; G 3228 -U 65249 ; WX 602 ; N uniFEE1 ; G 3229 -U 65250 ; WX 602 ; N uniFEE2 ; G 3230 -U 65251 ; WX 602 ; N uniFEE3 ; G 3231 -U 65252 ; WX 602 ; N uniFEE4 ; G 3232 -U 65253 ; WX 602 ; N uniFEE5 ; G 3233 -U 65254 ; WX 602 ; N uniFEE6 ; G 3234 -U 65255 ; WX 602 ; N uniFEE7 ; G 3235 -U 65256 ; WX 602 ; N uniFEE8 ; G 3236 -U 65257 ; WX 602 ; N uniFEE9 ; G 3237 -U 65258 ; WX 602 ; N uniFEEA ; G 3238 -U 65259 ; WX 602 ; N uniFEEB ; G 3239 -U 65260 ; WX 602 ; N uniFEEC ; G 3240 -U 65261 ; WX 602 ; N uniFEED ; G 3241 -U 65262 ; WX 602 ; N uniFEEE ; G 3242 -U 65263 ; WX 602 ; N uniFEEF ; G 3243 -U 65264 ; WX 602 ; N uniFEF0 ; G 3244 -U 65265 ; WX 602 ; N uniFEF1 ; G 3245 -U 65266 ; WX 602 ; N uniFEF2 ; G 3246 -U 65267 ; WX 602 ; N uniFEF3 ; G 3247 -U 65268 ; WX 602 ; N uniFEF4 ; G 3248 -U 65269 ; WX 602 ; N uniFEF5 ; G 3249 -U 65270 ; WX 602 ; N uniFEF6 ; G 3250 -U 65271 ; WX 602 ; N uniFEF7 ; G 3251 -U 65272 ; WX 602 ; N uniFEF8 ; G 3252 -U 65273 ; WX 602 ; N uniFEF9 ; G 3253 -U 65274 ; WX 602 ; N uniFEFA ; G 3254 -U 65275 ; WX 602 ; N uniFEFB ; G 3255 -U 65276 ; WX 602 ; N uniFEFC ; G 3256 -U 65279 ; WX 602 ; N uniFEFF ; G 3257 -U 65529 ; WX 602 ; N uniFFF9 ; G 3258 -U 65530 ; WX 602 ; N uniFFFA ; G 3259 -U 65531 ; WX 602 ; N uniFFFB ; G 3260 -U 65532 ; WX 602 ; N uniFFFC ; G 3261 -U 65533 ; WX 602 ; N uniFFFD ; G 3262 -EndCharMetrics -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ttf deleted file mode 100644 index 754dca7..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ufm deleted file mode 100644 index 3ae612a..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ufm +++ /dev/null @@ -1,2707 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Sans Mono -FontSubfamily Bold Oblique -UniqueID DejaVu Sans Mono Bold Oblique -FullName DejaVu Sans Mono Bold Oblique -Version Version 2.37 -PostScriptName DejaVuSansMono-BoldOblique -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -Weight Bold -ItalicAngle -11 -IsFixedPitch true -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 928 -Descender -236 -FontBBox -425 -394 808 1008 -StartCharMetrics 2711 -U 32 ; WX 602 ; N space ; G 3 -U 33 ; WX 602 ; N exclam ; G 4 -U 34 ; WX 602 ; N quotedbl ; G 5 -U 35 ; WX 602 ; N numbersign ; G 6 -U 36 ; WX 602 ; N dollar ; G 7 -U 37 ; WX 602 ; N percent ; G 8 -U 38 ; WX 602 ; N ampersand ; G 9 -U 39 ; WX 602 ; N quotesingle ; G 10 -U 40 ; WX 602 ; N parenleft ; G 11 -U 41 ; WX 602 ; N parenright ; G 12 -U 42 ; WX 602 ; N asterisk ; G 13 -U 43 ; WX 602 ; N plus ; G 14 -U 44 ; WX 602 ; N comma ; G 15 -U 45 ; WX 602 ; N hyphen ; G 16 -U 46 ; WX 602 ; N period ; G 17 -U 47 ; WX 602 ; N slash ; G 18 -U 48 ; WX 602 ; N zero ; G 19 -U 49 ; WX 602 ; N one ; G 20 -U 50 ; WX 602 ; N two ; G 21 -U 51 ; WX 602 ; N three ; G 22 -U 52 ; WX 602 ; N four ; G 23 -U 53 ; WX 602 ; N five ; G 24 -U 54 ; WX 602 ; N six ; G 25 -U 55 ; WX 602 ; N seven ; G 26 -U 56 ; WX 602 ; N eight ; G 27 -U 57 ; WX 602 ; N nine ; G 28 -U 58 ; WX 602 ; N colon ; G 29 -U 59 ; WX 602 ; N semicolon ; G 30 -U 60 ; WX 602 ; N less ; G 31 -U 61 ; WX 602 ; N equal ; G 32 -U 62 ; WX 602 ; N greater ; G 33 -U 63 ; WX 602 ; N question ; G 34 -U 64 ; WX 602 ; N at ; G 35 -U 65 ; WX 602 ; N A ; G 36 -U 66 ; WX 602 ; N B ; G 37 -U 67 ; WX 602 ; N C ; G 38 -U 68 ; WX 602 ; N D ; G 39 -U 69 ; WX 602 ; N E ; G 40 -U 70 ; WX 602 ; N F ; G 41 -U 71 ; WX 602 ; N G ; G 42 -U 72 ; WX 602 ; N H ; G 43 -U 73 ; WX 602 ; N I ; G 44 -U 74 ; WX 602 ; N J ; G 45 -U 75 ; WX 602 ; N K ; G 46 -U 76 ; WX 602 ; N L ; G 47 -U 77 ; WX 602 ; N M ; G 48 -U 78 ; WX 602 ; N N ; G 49 -U 79 ; WX 602 ; N O ; G 50 -U 80 ; WX 602 ; N P ; G 51 -U 81 ; WX 602 ; N Q ; G 52 -U 82 ; WX 602 ; N R ; G 53 -U 83 ; WX 602 ; N S ; G 54 -U 84 ; WX 602 ; N T ; G 55 -U 85 ; WX 602 ; N U ; G 56 -U 86 ; WX 602 ; N V ; G 57 -U 87 ; WX 602 ; N W ; G 58 -U 88 ; WX 602 ; N X ; G 59 -U 89 ; WX 602 ; N Y ; G 60 -U 90 ; WX 602 ; N Z ; G 61 -U 91 ; WX 602 ; N bracketleft ; G 62 -U 92 ; WX 602 ; N backslash ; G 63 -U 93 ; WX 602 ; N bracketright ; G 64 -U 94 ; WX 602 ; N asciicircum ; G 65 -U 95 ; WX 602 ; N underscore ; G 66 -U 96 ; WX 602 ; N grave ; G 67 -U 97 ; WX 602 ; N a ; G 68 -U 98 ; WX 602 ; N b ; G 69 -U 99 ; WX 602 ; N c ; G 70 -U 100 ; WX 602 ; N d ; G 71 -U 101 ; WX 602 ; N e ; G 72 -U 102 ; WX 602 ; N f ; G 73 -U 103 ; WX 602 ; N g ; G 74 -U 104 ; WX 602 ; N h ; G 75 -U 105 ; WX 602 ; N i ; G 76 -U 106 ; WX 602 ; N j ; G 77 -U 107 ; WX 602 ; N k ; G 78 -U 108 ; WX 602 ; N l ; G 79 -U 109 ; WX 602 ; N m ; G 80 -U 110 ; WX 602 ; N n ; G 81 -U 111 ; WX 602 ; N o ; G 82 -U 112 ; WX 602 ; N p ; G 83 -U 113 ; WX 602 ; N q ; G 84 -U 114 ; WX 602 ; N r ; G 85 -U 115 ; WX 602 ; N s ; G 86 -U 116 ; WX 602 ; N t ; G 87 -U 117 ; WX 602 ; N u ; G 88 -U 118 ; WX 602 ; N v ; G 89 -U 119 ; WX 602 ; N w ; G 90 -U 120 ; WX 602 ; N x ; G 91 -U 121 ; WX 602 ; N y ; G 92 -U 122 ; WX 602 ; N z ; G 93 -U 123 ; WX 602 ; N braceleft ; G 94 -U 124 ; WX 602 ; N bar ; G 95 -U 125 ; WX 602 ; N braceright ; G 96 -U 126 ; WX 602 ; N asciitilde ; G 97 -U 160 ; WX 602 ; N nbspace ; G 98 -U 161 ; WX 602 ; N exclamdown ; G 99 -U 162 ; WX 602 ; N cent ; G 100 -U 163 ; WX 602 ; N sterling ; G 101 -U 164 ; WX 602 ; N currency ; G 102 -U 165 ; WX 602 ; N yen ; G 103 -U 166 ; WX 602 ; N brokenbar ; G 104 -U 167 ; WX 602 ; N section ; G 105 -U 168 ; WX 602 ; N dieresis ; G 106 -U 169 ; WX 602 ; N copyright ; G 107 -U 170 ; WX 602 ; N ordfeminine ; G 108 -U 171 ; WX 602 ; N guillemotleft ; G 109 -U 172 ; WX 602 ; N logicalnot ; G 110 -U 173 ; WX 602 ; N sfthyphen ; G 111 -U 174 ; WX 602 ; N registered ; G 112 -U 175 ; WX 602 ; N macron ; G 113 -U 176 ; WX 602 ; N degree ; G 114 -U 177 ; WX 602 ; N plusminus ; G 115 -U 178 ; WX 602 ; N twosuperior ; G 116 -U 179 ; WX 602 ; N threesuperior ; G 117 -U 180 ; WX 602 ; N acute ; G 118 -U 181 ; WX 602 ; N mu ; G 119 -U 182 ; WX 602 ; N paragraph ; G 120 -U 183 ; WX 602 ; N periodcentered ; G 121 -U 184 ; WX 602 ; N cedilla ; G 122 -U 185 ; WX 602 ; N onesuperior ; G 123 -U 186 ; WX 602 ; N ordmasculine ; G 124 -U 187 ; WX 602 ; N guillemotright ; G 125 -U 188 ; WX 602 ; N onequarter ; G 126 -U 189 ; WX 602 ; N onehalf ; G 127 -U 190 ; WX 602 ; N threequarters ; G 128 -U 191 ; WX 602 ; N questiondown ; G 129 -U 192 ; WX 602 ; N Agrave ; G 130 -U 193 ; WX 602 ; N Aacute ; G 131 -U 194 ; WX 602 ; N Acircumflex ; G 132 -U 195 ; WX 602 ; N Atilde ; G 133 -U 196 ; WX 602 ; N Adieresis ; G 134 -U 197 ; WX 602 ; N Aring ; G 135 -U 198 ; WX 602 ; N AE ; G 136 -U 199 ; WX 602 ; N Ccedilla ; G 137 -U 200 ; WX 602 ; N Egrave ; G 138 -U 201 ; WX 602 ; N Eacute ; G 139 -U 202 ; WX 602 ; N Ecircumflex ; G 140 -U 203 ; WX 602 ; N Edieresis ; G 141 -U 204 ; WX 602 ; N Igrave ; G 142 -U 205 ; WX 602 ; N Iacute ; G 143 -U 206 ; WX 602 ; N Icircumflex ; G 144 -U 207 ; WX 602 ; N Idieresis ; G 145 -U 208 ; WX 602 ; N Eth ; G 146 -U 209 ; WX 602 ; N Ntilde ; G 147 -U 210 ; WX 602 ; N Ograve ; G 148 -U 211 ; WX 602 ; N Oacute ; G 149 -U 212 ; WX 602 ; N Ocircumflex ; G 150 -U 213 ; WX 602 ; N Otilde ; G 151 -U 214 ; WX 602 ; N Odieresis ; G 152 -U 215 ; WX 602 ; N multiply ; G 153 -U 216 ; WX 602 ; N Oslash ; G 154 -U 217 ; WX 602 ; N Ugrave ; G 155 -U 218 ; WX 602 ; N Uacute ; G 156 -U 219 ; WX 602 ; N Ucircumflex ; G 157 -U 220 ; WX 602 ; N Udieresis ; G 158 -U 221 ; WX 602 ; N Yacute ; G 159 -U 222 ; WX 602 ; N Thorn ; G 160 -U 223 ; WX 602 ; N germandbls ; G 161 -U 224 ; WX 602 ; N agrave ; G 162 -U 225 ; WX 602 ; N aacute ; G 163 -U 226 ; WX 602 ; N acircumflex ; G 164 -U 227 ; WX 602 ; N atilde ; G 165 -U 228 ; WX 602 ; N adieresis ; G 166 -U 229 ; WX 602 ; N aring ; G 167 -U 230 ; WX 602 ; N ae ; G 168 -U 231 ; WX 602 ; N ccedilla ; G 169 -U 232 ; WX 602 ; N egrave ; G 170 -U 233 ; WX 602 ; N eacute ; G 171 -U 234 ; WX 602 ; N ecircumflex ; G 172 -U 235 ; WX 602 ; N edieresis ; G 173 -U 236 ; WX 602 ; N igrave ; G 174 -U 237 ; WX 602 ; N iacute ; G 175 -U 238 ; WX 602 ; N icircumflex ; G 176 -U 239 ; WX 602 ; N idieresis ; G 177 -U 240 ; WX 602 ; N eth ; G 178 -U 241 ; WX 602 ; N ntilde ; G 179 -U 242 ; WX 602 ; N ograve ; G 180 -U 243 ; WX 602 ; N oacute ; G 181 -U 244 ; WX 602 ; N ocircumflex ; G 182 -U 245 ; WX 602 ; N otilde ; G 183 -U 246 ; WX 602 ; N odieresis ; G 184 -U 247 ; WX 602 ; N divide ; G 185 -U 248 ; WX 602 ; N oslash ; G 186 -U 249 ; WX 602 ; N ugrave ; G 187 -U 250 ; WX 602 ; N uacute ; G 188 -U 251 ; WX 602 ; N ucircumflex ; G 189 -U 252 ; WX 602 ; N udieresis ; G 190 -U 253 ; WX 602 ; N yacute ; G 191 -U 254 ; WX 602 ; N thorn ; G 192 -U 255 ; WX 602 ; N ydieresis ; G 193 -U 256 ; WX 602 ; N Amacron ; G 194 -U 257 ; WX 602 ; N amacron ; G 195 -U 258 ; WX 602 ; N Abreve ; G 196 -U 259 ; WX 602 ; N abreve ; G 197 -U 260 ; WX 602 ; N Aogonek ; G 198 -U 261 ; WX 602 ; N aogonek ; G 199 -U 262 ; WX 602 ; N Cacute ; G 200 -U 263 ; WX 602 ; N cacute ; G 201 -U 264 ; WX 602 ; N Ccircumflex ; G 202 -U 265 ; WX 602 ; N ccircumflex ; G 203 -U 266 ; WX 602 ; N Cdotaccent ; G 204 -U 267 ; WX 602 ; N cdotaccent ; G 205 -U 268 ; WX 602 ; N Ccaron ; G 206 -U 269 ; WX 602 ; N ccaron ; G 207 -U 270 ; WX 602 ; N Dcaron ; G 208 -U 271 ; WX 602 ; N dcaron ; G 209 -U 272 ; WX 602 ; N Dcroat ; G 210 -U 273 ; WX 602 ; N dmacron ; G 211 -U 274 ; WX 602 ; N Emacron ; G 212 -U 275 ; WX 602 ; N emacron ; G 213 -U 276 ; WX 602 ; N Ebreve ; G 214 -U 277 ; WX 602 ; N ebreve ; G 215 -U 278 ; WX 602 ; N Edotaccent ; G 216 -U 279 ; WX 602 ; N edotaccent ; G 217 -U 280 ; WX 602 ; N Eogonek ; G 218 -U 281 ; WX 602 ; N eogonek ; G 219 -U 282 ; WX 602 ; N Ecaron ; G 220 -U 283 ; WX 602 ; N ecaron ; G 221 -U 284 ; WX 602 ; N Gcircumflex ; G 222 -U 285 ; WX 602 ; N gcircumflex ; G 223 -U 286 ; WX 602 ; N Gbreve ; G 224 -U 287 ; WX 602 ; N gbreve ; G 225 -U 288 ; WX 602 ; N Gdotaccent ; G 226 -U 289 ; WX 602 ; N gdotaccent ; G 227 -U 290 ; WX 602 ; N Gcommaaccent ; G 228 -U 291 ; WX 602 ; N gcommaaccent ; G 229 -U 292 ; WX 602 ; N Hcircumflex ; G 230 -U 293 ; WX 602 ; N hcircumflex ; G 231 -U 294 ; WX 602 ; N Hbar ; G 232 -U 295 ; WX 602 ; N hbar ; G 233 -U 296 ; WX 602 ; N Itilde ; G 234 -U 297 ; WX 602 ; N itilde ; G 235 -U 298 ; WX 602 ; N Imacron ; G 236 -U 299 ; WX 602 ; N imacron ; G 237 -U 300 ; WX 602 ; N Ibreve ; G 238 -U 301 ; WX 602 ; N ibreve ; G 239 -U 302 ; WX 602 ; N Iogonek ; G 240 -U 303 ; WX 602 ; N iogonek ; G 241 -U 304 ; WX 602 ; N Idot ; G 242 -U 305 ; WX 602 ; N dotlessi ; G 243 -U 306 ; WX 602 ; N IJ ; G 244 -U 307 ; WX 602 ; N ij ; G 245 -U 308 ; WX 602 ; N Jcircumflex ; G 246 -U 309 ; WX 602 ; N jcircumflex ; G 247 -U 310 ; WX 602 ; N Kcommaaccent ; G 248 -U 311 ; WX 602 ; N kcommaaccent ; G 249 -U 312 ; WX 602 ; N kgreenlandic ; G 250 -U 313 ; WX 602 ; N Lacute ; G 251 -U 314 ; WX 602 ; N lacute ; G 252 -U 315 ; WX 602 ; N Lcommaaccent ; G 253 -U 316 ; WX 602 ; N lcommaaccent ; G 254 -U 317 ; WX 602 ; N Lcaron ; G 255 -U 318 ; WX 602 ; N lcaron ; G 256 -U 319 ; WX 602 ; N Ldot ; G 257 -U 320 ; WX 602 ; N ldot ; G 258 -U 321 ; WX 602 ; N Lslash ; G 259 -U 322 ; WX 602 ; N lslash ; G 260 -U 323 ; WX 602 ; N Nacute ; G 261 -U 324 ; WX 602 ; N nacute ; G 262 -U 325 ; WX 602 ; N Ncommaaccent ; G 263 -U 326 ; WX 602 ; N ncommaaccent ; G 264 -U 327 ; WX 602 ; N Ncaron ; G 265 -U 328 ; WX 602 ; N ncaron ; G 266 -U 329 ; WX 602 ; N napostrophe ; G 267 -U 330 ; WX 602 ; N Eng ; G 268 -U 331 ; WX 602 ; N eng ; G 269 -U 332 ; WX 602 ; N Omacron ; G 270 -U 333 ; WX 602 ; N omacron ; G 271 -U 334 ; WX 602 ; N Obreve ; G 272 -U 335 ; WX 602 ; N obreve ; G 273 -U 336 ; WX 602 ; N Ohungarumlaut ; G 274 -U 337 ; WX 602 ; N ohungarumlaut ; G 275 -U 338 ; WX 602 ; N OE ; G 276 -U 339 ; WX 602 ; N oe ; G 277 -U 340 ; WX 602 ; N Racute ; G 278 -U 341 ; WX 602 ; N racute ; G 279 -U 342 ; WX 602 ; N Rcommaaccent ; G 280 -U 343 ; WX 602 ; N rcommaaccent ; G 281 -U 344 ; WX 602 ; N Rcaron ; G 282 -U 345 ; WX 602 ; N rcaron ; G 283 -U 346 ; WX 602 ; N Sacute ; G 284 -U 347 ; WX 602 ; N sacute ; G 285 -U 348 ; WX 602 ; N Scircumflex ; G 286 -U 349 ; WX 602 ; N scircumflex ; G 287 -U 350 ; WX 602 ; N Scedilla ; G 288 -U 351 ; WX 602 ; N scedilla ; G 289 -U 352 ; WX 602 ; N Scaron ; G 290 -U 353 ; WX 602 ; N scaron ; G 291 -U 354 ; WX 602 ; N Tcommaaccent ; G 292 -U 355 ; WX 602 ; N tcommaaccent ; G 293 -U 356 ; WX 602 ; N Tcaron ; G 294 -U 357 ; WX 602 ; N tcaron ; G 295 -U 358 ; WX 602 ; N Tbar ; G 296 -U 359 ; WX 602 ; N tbar ; G 297 -U 360 ; WX 602 ; N Utilde ; G 298 -U 361 ; WX 602 ; N utilde ; G 299 -U 362 ; WX 602 ; N Umacron ; G 300 -U 363 ; WX 602 ; N umacron ; G 301 -U 364 ; WX 602 ; N Ubreve ; G 302 -U 365 ; WX 602 ; N ubreve ; G 303 -U 366 ; WX 602 ; N Uring ; G 304 -U 367 ; WX 602 ; N uring ; G 305 -U 368 ; WX 602 ; N Uhungarumlaut ; G 306 -U 369 ; WX 602 ; N uhungarumlaut ; G 307 -U 370 ; WX 602 ; N Uogonek ; G 308 -U 371 ; WX 602 ; N uogonek ; G 309 -U 372 ; WX 602 ; N Wcircumflex ; G 310 -U 373 ; WX 602 ; N wcircumflex ; G 311 -U 374 ; WX 602 ; N Ycircumflex ; G 312 -U 375 ; WX 602 ; N ycircumflex ; G 313 -U 376 ; WX 602 ; N Ydieresis ; G 314 -U 377 ; WX 602 ; N Zacute ; G 315 -U 378 ; WX 602 ; N zacute ; G 316 -U 379 ; WX 602 ; N Zdotaccent ; G 317 -U 380 ; WX 602 ; N zdotaccent ; G 318 -U 381 ; WX 602 ; N Zcaron ; G 319 -U 382 ; WX 602 ; N zcaron ; G 320 -U 383 ; WX 602 ; N longs ; G 321 -U 384 ; WX 602 ; N uni0180 ; G 322 -U 385 ; WX 602 ; N uni0181 ; G 323 -U 386 ; WX 602 ; N uni0182 ; G 324 -U 387 ; WX 602 ; N uni0183 ; G 325 -U 388 ; WX 602 ; N uni0184 ; G 326 -U 389 ; WX 602 ; N uni0185 ; G 327 -U 390 ; WX 602 ; N uni0186 ; G 328 -U 391 ; WX 602 ; N uni0187 ; G 329 -U 392 ; WX 602 ; N uni0188 ; G 330 -U 393 ; WX 602 ; N uni0189 ; G 331 -U 394 ; WX 602 ; N uni018A ; G 332 -U 395 ; WX 602 ; N uni018B ; G 333 -U 396 ; WX 602 ; N uni018C ; G 334 -U 397 ; WX 602 ; N uni018D ; G 335 -U 398 ; WX 602 ; N uni018E ; G 336 -U 399 ; WX 602 ; N uni018F ; G 337 -U 400 ; WX 602 ; N uni0190 ; G 338 -U 401 ; WX 602 ; N uni0191 ; G 339 -U 402 ; WX 602 ; N florin ; G 340 -U 403 ; WX 602 ; N uni0193 ; G 341 -U 404 ; WX 602 ; N uni0194 ; G 342 -U 405 ; WX 602 ; N uni0195 ; G 343 -U 406 ; WX 602 ; N uni0196 ; G 344 -U 407 ; WX 602 ; N uni0197 ; G 345 -U 408 ; WX 602 ; N uni0198 ; G 346 -U 409 ; WX 602 ; N uni0199 ; G 347 -U 410 ; WX 602 ; N uni019A ; G 348 -U 411 ; WX 602 ; N uni019B ; G 349 -U 412 ; WX 602 ; N uni019C ; G 350 -U 413 ; WX 602 ; N uni019D ; G 351 -U 414 ; WX 602 ; N uni019E ; G 352 -U 415 ; WX 602 ; N uni019F ; G 353 -U 416 ; WX 602 ; N Ohorn ; G 354 -U 417 ; WX 602 ; N ohorn ; G 355 -U 418 ; WX 602 ; N uni01A2 ; G 356 -U 419 ; WX 602 ; N uni01A3 ; G 357 -U 420 ; WX 602 ; N uni01A4 ; G 358 -U 421 ; WX 602 ; N uni01A5 ; G 359 -U 422 ; WX 602 ; N uni01A6 ; G 360 -U 423 ; WX 602 ; N uni01A7 ; G 361 -U 424 ; WX 602 ; N uni01A8 ; G 362 -U 425 ; WX 602 ; N uni01A9 ; G 363 -U 426 ; WX 602 ; N uni01AA ; G 364 -U 427 ; WX 602 ; N uni01AB ; G 365 -U 428 ; WX 602 ; N uni01AC ; G 366 -U 429 ; WX 602 ; N uni01AD ; G 367 -U 430 ; WX 602 ; N uni01AE ; G 368 -U 431 ; WX 602 ; N Uhorn ; G 369 -U 432 ; WX 602 ; N uhorn ; G 370 -U 433 ; WX 602 ; N uni01B1 ; G 371 -U 434 ; WX 602 ; N uni01B2 ; G 372 -U 435 ; WX 602 ; N uni01B3 ; G 373 -U 436 ; WX 602 ; N uni01B4 ; G 374 -U 437 ; WX 602 ; N uni01B5 ; G 375 -U 438 ; WX 602 ; N uni01B6 ; G 376 -U 439 ; WX 602 ; N uni01B7 ; G 377 -U 440 ; WX 602 ; N uni01B8 ; G 378 -U 441 ; WX 602 ; N uni01B9 ; G 379 -U 442 ; WX 602 ; N uni01BA ; G 380 -U 443 ; WX 602 ; N uni01BB ; G 381 -U 444 ; WX 602 ; N uni01BC ; G 382 -U 445 ; WX 602 ; N uni01BD ; G 383 -U 446 ; WX 602 ; N uni01BE ; G 384 -U 447 ; WX 602 ; N uni01BF ; G 385 -U 448 ; WX 602 ; N uni01C0 ; G 386 -U 449 ; WX 602 ; N uni01C1 ; G 387 -U 450 ; WX 602 ; N uni01C2 ; G 388 -U 451 ; WX 602 ; N uni01C3 ; G 389 -U 461 ; WX 602 ; N uni01CD ; G 390 -U 462 ; WX 602 ; N uni01CE ; G 391 -U 463 ; WX 602 ; N uni01CF ; G 392 -U 464 ; WX 602 ; N uni01D0 ; G 393 -U 465 ; WX 602 ; N uni01D1 ; G 394 -U 466 ; WX 602 ; N uni01D2 ; G 395 -U 467 ; WX 602 ; N uni01D3 ; G 396 -U 468 ; WX 602 ; N uni01D4 ; G 397 -U 469 ; WX 602 ; N uni01D5 ; G 398 -U 470 ; WX 602 ; N uni01D6 ; G 399 -U 471 ; WX 602 ; N uni01D7 ; G 400 -U 472 ; WX 602 ; N uni01D8 ; G 401 -U 473 ; WX 602 ; N uni01D9 ; G 402 -U 474 ; WX 602 ; N uni01DA ; G 403 -U 475 ; WX 602 ; N uni01DB ; G 404 -U 476 ; WX 602 ; N uni01DC ; G 405 -U 477 ; WX 602 ; N uni01DD ; G 406 -U 478 ; WX 602 ; N uni01DE ; G 407 -U 479 ; WX 602 ; N uni01DF ; G 408 -U 480 ; WX 602 ; N uni01E0 ; G 409 -U 481 ; WX 602 ; N uni01E1 ; G 410 -U 482 ; WX 602 ; N uni01E2 ; G 411 -U 483 ; WX 602 ; N uni01E3 ; G 412 -U 486 ; WX 602 ; N Gcaron ; G 413 -U 487 ; WX 602 ; N gcaron ; G 414 -U 488 ; WX 602 ; N uni01E8 ; G 415 -U 489 ; WX 602 ; N uni01E9 ; G 416 -U 490 ; WX 602 ; N uni01EA ; G 417 -U 491 ; WX 602 ; N uni01EB ; G 418 -U 492 ; WX 602 ; N uni01EC ; G 419 -U 493 ; WX 602 ; N uni01ED ; G 420 -U 494 ; WX 602 ; N uni01EE ; G 421 -U 495 ; WX 602 ; N uni01EF ; G 422 -U 500 ; WX 602 ; N uni01F4 ; G 423 -U 501 ; WX 602 ; N uni01F5 ; G 424 -U 502 ; WX 602 ; N uni01F6 ; G 425 -U 504 ; WX 602 ; N uni01F8 ; G 426 -U 505 ; WX 602 ; N uni01F9 ; G 427 -U 508 ; WX 602 ; N AEacute ; G 428 -U 509 ; WX 602 ; N aeacute ; G 429 -U 510 ; WX 602 ; N Oslashacute ; G 430 -U 511 ; WX 602 ; N oslashacute ; G 431 -U 512 ; WX 602 ; N uni0200 ; G 432 -U 513 ; WX 602 ; N uni0201 ; G 433 -U 514 ; WX 602 ; N uni0202 ; G 434 -U 515 ; WX 602 ; N uni0203 ; G 435 -U 516 ; WX 602 ; N uni0204 ; G 436 -U 517 ; WX 602 ; N uni0205 ; G 437 -U 518 ; WX 602 ; N uni0206 ; G 438 -U 519 ; WX 602 ; N uni0207 ; G 439 -U 520 ; WX 602 ; N uni0208 ; G 440 -U 521 ; WX 602 ; N uni0209 ; G 441 -U 522 ; WX 602 ; N uni020A ; G 442 -U 523 ; WX 602 ; N uni020B ; G 443 -U 524 ; WX 602 ; N uni020C ; G 444 -U 525 ; WX 602 ; N uni020D ; G 445 -U 526 ; WX 602 ; N uni020E ; G 446 -U 527 ; WX 602 ; N uni020F ; G 447 -U 528 ; WX 602 ; N uni0210 ; G 448 -U 529 ; WX 602 ; N uni0211 ; G 449 -U 530 ; WX 602 ; N uni0212 ; G 450 -U 531 ; WX 602 ; N uni0213 ; G 451 -U 532 ; WX 602 ; N uni0214 ; G 452 -U 533 ; WX 602 ; N uni0215 ; G 453 -U 534 ; WX 602 ; N uni0216 ; G 454 -U 535 ; WX 602 ; N uni0217 ; G 455 -U 536 ; WX 602 ; N Scommaaccent ; G 456 -U 537 ; WX 602 ; N scommaaccent ; G 457 -U 538 ; WX 602 ; N uni021A ; G 458 -U 539 ; WX 602 ; N uni021B ; G 459 -U 540 ; WX 602 ; N uni021C ; G 460 -U 541 ; WX 602 ; N uni021D ; G 461 -U 542 ; WX 602 ; N uni021E ; G 462 -U 543 ; WX 602 ; N uni021F ; G 463 -U 545 ; WX 602 ; N uni0221 ; G 464 -U 548 ; WX 602 ; N uni0224 ; G 465 -U 549 ; WX 602 ; N uni0225 ; G 466 -U 550 ; WX 602 ; N uni0226 ; G 467 -U 551 ; WX 602 ; N uni0227 ; G 468 -U 552 ; WX 602 ; N uni0228 ; G 469 -U 553 ; WX 602 ; N uni0229 ; G 470 -U 554 ; WX 602 ; N uni022A ; G 471 -U 555 ; WX 602 ; N uni022B ; G 472 -U 556 ; WX 602 ; N uni022C ; G 473 -U 557 ; WX 602 ; N uni022D ; G 474 -U 558 ; WX 602 ; N uni022E ; G 475 -U 559 ; WX 602 ; N uni022F ; G 476 -U 560 ; WX 602 ; N uni0230 ; G 477 -U 561 ; WX 602 ; N uni0231 ; G 478 -U 562 ; WX 602 ; N uni0232 ; G 479 -U 563 ; WX 602 ; N uni0233 ; G 480 -U 564 ; WX 602 ; N uni0234 ; G 481 -U 565 ; WX 602 ; N uni0235 ; G 482 -U 566 ; WX 602 ; N uni0236 ; G 483 -U 567 ; WX 602 ; N dotlessj ; G 484 -U 568 ; WX 602 ; N uni0238 ; G 485 -U 569 ; WX 602 ; N uni0239 ; G 486 -U 570 ; WX 602 ; N uni023A ; G 487 -U 571 ; WX 602 ; N uni023B ; G 488 -U 572 ; WX 602 ; N uni023C ; G 489 -U 573 ; WX 602 ; N uni023D ; G 490 -U 574 ; WX 602 ; N uni023E ; G 491 -U 575 ; WX 602 ; N uni023F ; G 492 -U 576 ; WX 602 ; N uni0240 ; G 493 -U 577 ; WX 602 ; N uni0241 ; G 494 -U 579 ; WX 602 ; N uni0243 ; G 495 -U 580 ; WX 602 ; N uni0244 ; G 496 -U 581 ; WX 602 ; N uni0245 ; G 497 -U 588 ; WX 602 ; N uni024C ; G 498 -U 589 ; WX 602 ; N uni024D ; G 499 -U 592 ; WX 602 ; N uni0250 ; G 500 -U 593 ; WX 602 ; N uni0251 ; G 501 -U 594 ; WX 602 ; N uni0252 ; G 502 -U 595 ; WX 602 ; N uni0253 ; G 503 -U 596 ; WX 602 ; N uni0254 ; G 504 -U 597 ; WX 602 ; N uni0255 ; G 505 -U 598 ; WX 602 ; N uni0256 ; G 506 -U 599 ; WX 602 ; N uni0257 ; G 507 -U 600 ; WX 602 ; N uni0258 ; G 508 -U 601 ; WX 602 ; N uni0259 ; G 509 -U 602 ; WX 602 ; N uni025A ; G 510 -U 603 ; WX 602 ; N uni025B ; G 511 -U 604 ; WX 602 ; N uni025C ; G 512 -U 605 ; WX 602 ; N uni025D ; G 513 -U 606 ; WX 602 ; N uni025E ; G 514 -U 607 ; WX 602 ; N uni025F ; G 515 -U 608 ; WX 602 ; N uni0260 ; G 516 -U 609 ; WX 602 ; N uni0261 ; G 517 -U 610 ; WX 602 ; N uni0262 ; G 518 -U 611 ; WX 602 ; N uni0263 ; G 519 -U 612 ; WX 602 ; N uni0264 ; G 520 -U 613 ; WX 602 ; N uni0265 ; G 521 -U 614 ; WX 602 ; N uni0266 ; G 522 -U 615 ; WX 602 ; N uni0267 ; G 523 -U 616 ; WX 602 ; N uni0268 ; G 524 -U 617 ; WX 602 ; N uni0269 ; G 525 -U 618 ; WX 602 ; N uni026A ; G 526 -U 619 ; WX 602 ; N uni026B ; G 527 -U 620 ; WX 602 ; N uni026C ; G 528 -U 621 ; WX 602 ; N uni026D ; G 529 -U 622 ; WX 602 ; N uni026E ; G 530 -U 623 ; WX 602 ; N uni026F ; G 531 -U 624 ; WX 602 ; N uni0270 ; G 532 -U 625 ; WX 602 ; N uni0271 ; G 533 -U 626 ; WX 602 ; N uni0272 ; G 534 -U 627 ; WX 602 ; N uni0273 ; G 535 -U 628 ; WX 602 ; N uni0274 ; G 536 -U 629 ; WX 602 ; N uni0275 ; G 537 -U 630 ; WX 602 ; N uni0276 ; G 538 -U 631 ; WX 602 ; N uni0277 ; G 539 -U 632 ; WX 602 ; N uni0278 ; G 540 -U 633 ; WX 602 ; N uni0279 ; G 541 -U 634 ; WX 602 ; N uni027A ; G 542 -U 635 ; WX 602 ; N uni027B ; G 543 -U 636 ; WX 602 ; N uni027C ; G 544 -U 637 ; WX 602 ; N uni027D ; G 545 -U 638 ; WX 602 ; N uni027E ; G 546 -U 639 ; WX 602 ; N uni027F ; G 547 -U 640 ; WX 602 ; N uni0280 ; G 548 -U 641 ; WX 602 ; N uni0281 ; G 549 -U 642 ; WX 602 ; N uni0282 ; G 550 -U 643 ; WX 602 ; N uni0283 ; G 551 -U 644 ; WX 602 ; N uni0284 ; G 552 -U 645 ; WX 602 ; N uni0285 ; G 553 -U 646 ; WX 602 ; N uni0286 ; G 554 -U 647 ; WX 602 ; N uni0287 ; G 555 -U 648 ; WX 602 ; N uni0288 ; G 556 -U 649 ; WX 602 ; N uni0289 ; G 557 -U 650 ; WX 602 ; N uni028A ; G 558 -U 651 ; WX 602 ; N uni028B ; G 559 -U 652 ; WX 602 ; N uni028C ; G 560 -U 653 ; WX 602 ; N uni028D ; G 561 -U 654 ; WX 602 ; N uni028E ; G 562 -U 655 ; WX 602 ; N uni028F ; G 563 -U 656 ; WX 602 ; N uni0290 ; G 564 -U 657 ; WX 602 ; N uni0291 ; G 565 -U 658 ; WX 602 ; N uni0292 ; G 566 -U 659 ; WX 602 ; N uni0293 ; G 567 -U 660 ; WX 602 ; N uni0294 ; G 568 -U 661 ; WX 602 ; N uni0295 ; G 569 -U 662 ; WX 602 ; N uni0296 ; G 570 -U 663 ; WX 602 ; N uni0297 ; G 571 -U 664 ; WX 602 ; N uni0298 ; G 572 -U 665 ; WX 602 ; N uni0299 ; G 573 -U 666 ; WX 602 ; N uni029A ; G 574 -U 667 ; WX 602 ; N uni029B ; G 575 -U 668 ; WX 602 ; N uni029C ; G 576 -U 669 ; WX 602 ; N uni029D ; G 577 -U 670 ; WX 602 ; N uni029E ; G 578 -U 671 ; WX 602 ; N uni029F ; G 579 -U 672 ; WX 602 ; N uni02A0 ; G 580 -U 673 ; WX 602 ; N uni02A1 ; G 581 -U 674 ; WX 602 ; N uni02A2 ; G 582 -U 675 ; WX 602 ; N uni02A3 ; G 583 -U 676 ; WX 602 ; N uni02A4 ; G 584 -U 677 ; WX 602 ; N uni02A5 ; G 585 -U 678 ; WX 602 ; N uni02A6 ; G 586 -U 679 ; WX 602 ; N uni02A7 ; G 587 -U 680 ; WX 602 ; N uni02A8 ; G 588 -U 681 ; WX 602 ; N uni02A9 ; G 589 -U 682 ; WX 602 ; N uni02AA ; G 590 -U 683 ; WX 602 ; N uni02AB ; G 591 -U 684 ; WX 602 ; N uni02AC ; G 592 -U 685 ; WX 602 ; N uni02AD ; G 593 -U 686 ; WX 602 ; N uni02AE ; G 594 -U 687 ; WX 602 ; N uni02AF ; G 595 -U 688 ; WX 602 ; N uni02B0 ; G 596 -U 689 ; WX 602 ; N uni02B1 ; G 597 -U 690 ; WX 602 ; N uni02B2 ; G 598 -U 691 ; WX 602 ; N uni02B3 ; G 599 -U 692 ; WX 602 ; N uni02B4 ; G 600 -U 693 ; WX 602 ; N uni02B5 ; G 601 -U 694 ; WX 602 ; N uni02B6 ; G 602 -U 695 ; WX 602 ; N uni02B7 ; G 603 -U 696 ; WX 602 ; N uni02B8 ; G 604 -U 697 ; WX 602 ; N uni02B9 ; G 605 -U 699 ; WX 602 ; N uni02BB ; G 606 -U 700 ; WX 602 ; N uni02BC ; G 607 -U 701 ; WX 602 ; N uni02BD ; G 608 -U 702 ; WX 602 ; N uni02BE ; G 609 -U 703 ; WX 602 ; N uni02BF ; G 610 -U 704 ; WX 602 ; N uni02C0 ; G 611 -U 705 ; WX 602 ; N uni02C1 ; G 612 -U 710 ; WX 602 ; N circumflex ; G 613 -U 711 ; WX 602 ; N caron ; G 614 -U 712 ; WX 602 ; N uni02C8 ; G 615 -U 713 ; WX 602 ; N uni02C9 ; G 616 -U 716 ; WX 602 ; N uni02CC ; G 617 -U 717 ; WX 602 ; N uni02CD ; G 618 -U 718 ; WX 602 ; N uni02CE ; G 619 -U 719 ; WX 602 ; N uni02CF ; G 620 -U 720 ; WX 602 ; N uni02D0 ; G 621 -U 721 ; WX 602 ; N uni02D1 ; G 622 -U 722 ; WX 602 ; N uni02D2 ; G 623 -U 723 ; WX 602 ; N uni02D3 ; G 624 -U 726 ; WX 602 ; N uni02D6 ; G 625 -U 727 ; WX 602 ; N uni02D7 ; G 626 -U 728 ; WX 602 ; N breve ; G 627 -U 729 ; WX 602 ; N dotaccent ; G 628 -U 730 ; WX 602 ; N ring ; G 629 -U 731 ; WX 602 ; N ogonek ; G 630 -U 732 ; WX 602 ; N tilde ; G 631 -U 733 ; WX 602 ; N hungarumlaut ; G 632 -U 734 ; WX 602 ; N uni02DE ; G 633 -U 736 ; WX 602 ; N uni02E0 ; G 634 -U 737 ; WX 602 ; N uni02E1 ; G 635 -U 738 ; WX 602 ; N uni02E2 ; G 636 -U 739 ; WX 602 ; N uni02E3 ; G 637 -U 740 ; WX 602 ; N uni02E4 ; G 638 -U 741 ; WX 602 ; N uni02E5 ; G 639 -U 742 ; WX 602 ; N uni02E6 ; G 640 -U 743 ; WX 602 ; N uni02E7 ; G 641 -U 744 ; WX 602 ; N uni02E8 ; G 642 -U 745 ; WX 602 ; N uni02E9 ; G 643 -U 750 ; WX 602 ; N uni02EE ; G 644 -U 755 ; WX 602 ; N uni02F3 ; G 645 -U 768 ; WX 602 ; N gravecomb ; G 646 -U 769 ; WX 602 ; N acutecomb ; G 647 -U 770 ; WX 602 ; N uni0302 ; G 648 -U 771 ; WX 602 ; N tildecomb ; G 649 -U 772 ; WX 602 ; N uni0304 ; G 650 -U 773 ; WX 602 ; N uni0305 ; G 651 -U 774 ; WX 602 ; N uni0306 ; G 652 -U 775 ; WX 602 ; N uni0307 ; G 653 -U 776 ; WX 602 ; N uni0308 ; G 654 -U 777 ; WX 602 ; N hookabovecomb ; G 655 -U 778 ; WX 602 ; N uni030A ; G 656 -U 779 ; WX 602 ; N uni030B ; G 657 -U 780 ; WX 602 ; N uni030C ; G 658 -U 781 ; WX 602 ; N uni030D ; G 659 -U 782 ; WX 602 ; N uni030E ; G 660 -U 783 ; WX 602 ; N uni030F ; G 661 -U 784 ; WX 602 ; N uni0310 ; G 662 -U 785 ; WX 602 ; N uni0311 ; G 663 -U 786 ; WX 602 ; N uni0312 ; G 664 -U 787 ; WX 602 ; N uni0313 ; G 665 -U 788 ; WX 602 ; N uni0314 ; G 666 -U 789 ; WX 602 ; N uni0315 ; G 667 -U 790 ; WX 602 ; N uni0316 ; G 668 -U 791 ; WX 602 ; N uni0317 ; G 669 -U 792 ; WX 602 ; N uni0318 ; G 670 -U 793 ; WX 602 ; N uni0319 ; G 671 -U 794 ; WX 602 ; N uni031A ; G 672 -U 795 ; WX 602 ; N uni031B ; G 673 -U 796 ; WX 602 ; N uni031C ; G 674 -U 797 ; WX 602 ; N uni031D ; G 675 -U 798 ; WX 602 ; N uni031E ; G 676 -U 799 ; WX 602 ; N uni031F ; G 677 -U 800 ; WX 602 ; N uni0320 ; G 678 -U 801 ; WX 602 ; N uni0321 ; G 679 -U 802 ; WX 602 ; N uni0322 ; G 680 -U 803 ; WX 602 ; N dotbelowcomb ; G 681 -U 804 ; WX 602 ; N uni0324 ; G 682 -U 805 ; WX 602 ; N uni0325 ; G 683 -U 806 ; WX 602 ; N uni0326 ; G 684 -U 807 ; WX 602 ; N uni0327 ; G 685 -U 808 ; WX 602 ; N uni0328 ; G 686 -U 809 ; WX 602 ; N uni0329 ; G 687 -U 810 ; WX 602 ; N uni032A ; G 688 -U 811 ; WX 602 ; N uni032B ; G 689 -U 812 ; WX 602 ; N uni032C ; G 690 -U 813 ; WX 602 ; N uni032D ; G 691 -U 814 ; WX 602 ; N uni032E ; G 692 -U 815 ; WX 602 ; N uni032F ; G 693 -U 816 ; WX 602 ; N uni0330 ; G 694 -U 817 ; WX 602 ; N uni0331 ; G 695 -U 818 ; WX 602 ; N uni0332 ; G 696 -U 819 ; WX 602 ; N uni0333 ; G 697 -U 820 ; WX 602 ; N uni0334 ; G 698 -U 821 ; WX 602 ; N uni0335 ; G 699 -U 822 ; WX 602 ; N uni0336 ; G 700 -U 823 ; WX 602 ; N uni0337 ; G 701 -U 824 ; WX 602 ; N uni0338 ; G 702 -U 825 ; WX 602 ; N uni0339 ; G 703 -U 826 ; WX 602 ; N uni033A ; G 704 -U 827 ; WX 602 ; N uni033B ; G 705 -U 828 ; WX 602 ; N uni033C ; G 706 -U 829 ; WX 602 ; N uni033D ; G 707 -U 830 ; WX 602 ; N uni033E ; G 708 -U 831 ; WX 602 ; N uni033F ; G 709 -U 835 ; WX 602 ; N uni0343 ; G 710 -U 856 ; WX 602 ; N uni0358 ; G 711 -U 865 ; WX 602 ; N uni0361 ; G 712 -U 884 ; WX 602 ; N uni0374 ; G 713 -U 885 ; WX 602 ; N uni0375 ; G 714 -U 886 ; WX 602 ; N uni0376 ; G 715 -U 887 ; WX 602 ; N uni0377 ; G 716 -U 890 ; WX 602 ; N uni037A ; G 717 -U 891 ; WX 602 ; N uni037B ; G 718 -U 892 ; WX 602 ; N uni037C ; G 719 -U 893 ; WX 602 ; N uni037D ; G 720 -U 894 ; WX 602 ; N uni037E ; G 721 -U 895 ; WX 602 ; N uni037F ; G 722 -U 900 ; WX 602 ; N tonos ; G 723 -U 901 ; WX 602 ; N dieresistonos ; G 724 -U 902 ; WX 602 ; N Alphatonos ; G 725 -U 903 ; WX 602 ; N anoteleia ; G 726 -U 904 ; WX 602 ; N Epsilontonos ; G 727 -U 905 ; WX 602 ; N Etatonos ; G 728 -U 906 ; WX 602 ; N Iotatonos ; G 729 -U 908 ; WX 602 ; N Omicrontonos ; G 730 -U 910 ; WX 602 ; N Upsilontonos ; G 731 -U 911 ; WX 602 ; N Omegatonos ; G 732 -U 912 ; WX 602 ; N iotadieresistonos ; G 733 -U 913 ; WX 602 ; N Alpha ; G 734 -U 914 ; WX 602 ; N Beta ; G 735 -U 915 ; WX 602 ; N Gamma ; G 736 -U 916 ; WX 602 ; N uni0394 ; G 737 -U 917 ; WX 602 ; N Epsilon ; G 738 -U 918 ; WX 602 ; N Zeta ; G 739 -U 919 ; WX 602 ; N Eta ; G 740 -U 920 ; WX 602 ; N Theta ; G 741 -U 921 ; WX 602 ; N Iota ; G 742 -U 922 ; WX 602 ; N Kappa ; G 743 -U 923 ; WX 602 ; N Lambda ; G 744 -U 924 ; WX 602 ; N Mu ; G 745 -U 925 ; WX 602 ; N Nu ; G 746 -U 926 ; WX 602 ; N Xi ; G 747 -U 927 ; WX 602 ; N Omicron ; G 748 -U 928 ; WX 602 ; N Pi ; G 749 -U 929 ; WX 602 ; N Rho ; G 750 -U 931 ; WX 602 ; N Sigma ; G 751 -U 932 ; WX 602 ; N Tau ; G 752 -U 933 ; WX 602 ; N Upsilon ; G 753 -U 934 ; WX 602 ; N Phi ; G 754 -U 935 ; WX 602 ; N Chi ; G 755 -U 936 ; WX 602 ; N Psi ; G 756 -U 937 ; WX 602 ; N Omega ; G 757 -U 938 ; WX 602 ; N Iotadieresis ; G 758 -U 939 ; WX 602 ; N Upsilondieresis ; G 759 -U 940 ; WX 602 ; N alphatonos ; G 760 -U 941 ; WX 602 ; N epsilontonos ; G 761 -U 942 ; WX 602 ; N etatonos ; G 762 -U 943 ; WX 602 ; N iotatonos ; G 763 -U 944 ; WX 602 ; N upsilondieresistonos ; G 764 -U 945 ; WX 602 ; N alpha ; G 765 -U 946 ; WX 602 ; N beta ; G 766 -U 947 ; WX 602 ; N gamma ; G 767 -U 948 ; WX 602 ; N delta ; G 768 -U 949 ; WX 602 ; N epsilon ; G 769 -U 950 ; WX 602 ; N zeta ; G 770 -U 951 ; WX 602 ; N eta ; G 771 -U 952 ; WX 602 ; N theta ; G 772 -U 953 ; WX 602 ; N iota ; G 773 -U 954 ; WX 602 ; N kappa ; G 774 -U 955 ; WX 602 ; N lambda ; G 775 -U 956 ; WX 602 ; N uni03BC ; G 776 -U 957 ; WX 602 ; N nu ; G 777 -U 958 ; WX 602 ; N xi ; G 778 -U 959 ; WX 602 ; N omicron ; G 779 -U 960 ; WX 602 ; N pi ; G 780 -U 961 ; WX 602 ; N rho ; G 781 -U 962 ; WX 602 ; N sigma1 ; G 782 -U 963 ; WX 602 ; N sigma ; G 783 -U 964 ; WX 602 ; N tau ; G 784 -U 965 ; WX 602 ; N upsilon ; G 785 -U 966 ; WX 602 ; N phi ; G 786 -U 967 ; WX 602 ; N chi ; G 787 -U 968 ; WX 602 ; N psi ; G 788 -U 969 ; WX 602 ; N omega ; G 789 -U 970 ; WX 602 ; N iotadieresis ; G 790 -U 971 ; WX 602 ; N upsilondieresis ; G 791 -U 972 ; WX 602 ; N omicrontonos ; G 792 -U 973 ; WX 602 ; N upsilontonos ; G 793 -U 974 ; WX 602 ; N omegatonos ; G 794 -U 976 ; WX 602 ; N uni03D0 ; G 795 -U 977 ; WX 602 ; N theta1 ; G 796 -U 978 ; WX 602 ; N Upsilon1 ; G 797 -U 979 ; WX 602 ; N uni03D3 ; G 798 -U 980 ; WX 602 ; N uni03D4 ; G 799 -U 981 ; WX 602 ; N phi1 ; G 800 -U 982 ; WX 602 ; N omega1 ; G 801 -U 983 ; WX 602 ; N uni03D7 ; G 802 -U 984 ; WX 602 ; N uni03D8 ; G 803 -U 985 ; WX 602 ; N uni03D9 ; G 804 -U 986 ; WX 602 ; N uni03DA ; G 805 -U 987 ; WX 602 ; N uni03DB ; G 806 -U 988 ; WX 602 ; N uni03DC ; G 807 -U 989 ; WX 602 ; N uni03DD ; G 808 -U 990 ; WX 602 ; N uni03DE ; G 809 -U 991 ; WX 602 ; N uni03DF ; G 810 -U 992 ; WX 602 ; N uni03E0 ; G 811 -U 993 ; WX 602 ; N uni03E1 ; G 812 -U 1008 ; WX 602 ; N uni03F0 ; G 813 -U 1009 ; WX 602 ; N uni03F1 ; G 814 -U 1010 ; WX 602 ; N uni03F2 ; G 815 -U 1011 ; WX 602 ; N uni03F3 ; G 816 -U 1012 ; WX 602 ; N uni03F4 ; G 817 -U 1013 ; WX 602 ; N uni03F5 ; G 818 -U 1014 ; WX 602 ; N uni03F6 ; G 819 -U 1015 ; WX 602 ; N uni03F7 ; G 820 -U 1016 ; WX 602 ; N uni03F8 ; G 821 -U 1017 ; WX 602 ; N uni03F9 ; G 822 -U 1018 ; WX 602 ; N uni03FA ; G 823 -U 1019 ; WX 602 ; N uni03FB ; G 824 -U 1020 ; WX 602 ; N uni03FC ; G 825 -U 1021 ; WX 602 ; N uni03FD ; G 826 -U 1022 ; WX 602 ; N uni03FE ; G 827 -U 1023 ; WX 602 ; N uni03FF ; G 828 -U 1024 ; WX 602 ; N uni0400 ; G 829 -U 1025 ; WX 602 ; N uni0401 ; G 830 -U 1026 ; WX 602 ; N uni0402 ; G 831 -U 1027 ; WX 602 ; N uni0403 ; G 832 -U 1028 ; WX 602 ; N uni0404 ; G 833 -U 1029 ; WX 602 ; N uni0405 ; G 834 -U 1030 ; WX 602 ; N uni0406 ; G 835 -U 1031 ; WX 602 ; N uni0407 ; G 836 -U 1032 ; WX 602 ; N uni0408 ; G 837 -U 1033 ; WX 602 ; N uni0409 ; G 838 -U 1034 ; WX 602 ; N uni040A ; G 839 -U 1035 ; WX 602 ; N uni040B ; G 840 -U 1036 ; WX 602 ; N uni040C ; G 841 -U 1037 ; WX 602 ; N uni040D ; G 842 -U 1038 ; WX 602 ; N uni040E ; G 843 -U 1039 ; WX 602 ; N uni040F ; G 844 -U 1040 ; WX 602 ; N uni0410 ; G 845 -U 1041 ; WX 602 ; N uni0411 ; G 846 -U 1042 ; WX 602 ; N uni0412 ; G 847 -U 1043 ; WX 602 ; N uni0413 ; G 848 -U 1044 ; WX 602 ; N uni0414 ; G 849 -U 1045 ; WX 602 ; N uni0415 ; G 850 -U 1046 ; WX 602 ; N uni0416 ; G 851 -U 1047 ; WX 602 ; N uni0417 ; G 852 -U 1048 ; WX 602 ; N uni0418 ; G 853 -U 1049 ; WX 602 ; N uni0419 ; G 854 -U 1050 ; WX 602 ; N uni041A ; G 855 -U 1051 ; WX 602 ; N uni041B ; G 856 -U 1052 ; WX 602 ; N uni041C ; G 857 -U 1053 ; WX 602 ; N uni041D ; G 858 -U 1054 ; WX 602 ; N uni041E ; G 859 -U 1055 ; WX 602 ; N uni041F ; G 860 -U 1056 ; WX 602 ; N uni0420 ; G 861 -U 1057 ; WX 602 ; N uni0421 ; G 862 -U 1058 ; WX 602 ; N uni0422 ; G 863 -U 1059 ; WX 602 ; N uni0423 ; G 864 -U 1060 ; WX 602 ; N uni0424 ; G 865 -U 1061 ; WX 602 ; N uni0425 ; G 866 -U 1062 ; WX 602 ; N uni0426 ; G 867 -U 1063 ; WX 602 ; N uni0427 ; G 868 -U 1064 ; WX 602 ; N uni0428 ; G 869 -U 1065 ; WX 602 ; N uni0429 ; G 870 -U 1066 ; WX 602 ; N uni042A ; G 871 -U 1067 ; WX 602 ; N uni042B ; G 872 -U 1068 ; WX 602 ; N uni042C ; G 873 -U 1069 ; WX 602 ; N uni042D ; G 874 -U 1070 ; WX 602 ; N uni042E ; G 875 -U 1071 ; WX 602 ; N uni042F ; G 876 -U 1072 ; WX 602 ; N uni0430 ; G 877 -U 1073 ; WX 602 ; N uni0431 ; G 878 -U 1074 ; WX 602 ; N uni0432 ; G 879 -U 1075 ; WX 602 ; N uni0433 ; G 880 -U 1076 ; WX 602 ; N uni0434 ; G 881 -U 1077 ; WX 602 ; N uni0435 ; G 882 -U 1078 ; WX 602 ; N uni0436 ; G 883 -U 1079 ; WX 602 ; N uni0437 ; G 884 -U 1080 ; WX 602 ; N uni0438 ; G 885 -U 1081 ; WX 602 ; N uni0439 ; G 886 -U 1082 ; WX 602 ; N uni043A ; G 887 -U 1083 ; WX 602 ; N uni043B ; G 888 -U 1084 ; WX 602 ; N uni043C ; G 889 -U 1085 ; WX 602 ; N uni043D ; G 890 -U 1086 ; WX 602 ; N uni043E ; G 891 -U 1087 ; WX 602 ; N uni043F ; G 892 -U 1088 ; WX 602 ; N uni0440 ; G 893 -U 1089 ; WX 602 ; N uni0441 ; G 894 -U 1090 ; WX 602 ; N uni0442 ; G 895 -U 1091 ; WX 602 ; N uni0443 ; G 896 -U 1092 ; WX 602 ; N uni0444 ; G 897 -U 1093 ; WX 602 ; N uni0445 ; G 898 -U 1094 ; WX 602 ; N uni0446 ; G 899 -U 1095 ; WX 602 ; N uni0447 ; G 900 -U 1096 ; WX 602 ; N uni0448 ; G 901 -U 1097 ; WX 602 ; N uni0449 ; G 902 -U 1098 ; WX 602 ; N uni044A ; G 903 -U 1099 ; WX 602 ; N uni044B ; G 904 -U 1100 ; WX 602 ; N uni044C ; G 905 -U 1101 ; WX 602 ; N uni044D ; G 906 -U 1102 ; WX 602 ; N uni044E ; G 907 -U 1103 ; WX 602 ; N uni044F ; G 908 -U 1104 ; WX 602 ; N uni0450 ; G 909 -U 1105 ; WX 602 ; N uni0451 ; G 910 -U 1106 ; WX 602 ; N uni0452 ; G 911 -U 1107 ; WX 602 ; N uni0453 ; G 912 -U 1108 ; WX 602 ; N uni0454 ; G 913 -U 1109 ; WX 602 ; N uni0455 ; G 914 -U 1110 ; WX 602 ; N uni0456 ; G 915 -U 1111 ; WX 602 ; N uni0457 ; G 916 -U 1112 ; WX 602 ; N uni0458 ; G 917 -U 1113 ; WX 602 ; N uni0459 ; G 918 -U 1114 ; WX 602 ; N uni045A ; G 919 -U 1115 ; WX 602 ; N uni045B ; G 920 -U 1116 ; WX 602 ; N uni045C ; G 921 -U 1117 ; WX 602 ; N uni045D ; G 922 -U 1118 ; WX 602 ; N uni045E ; G 923 -U 1119 ; WX 602 ; N uni045F ; G 924 -U 1122 ; WX 602 ; N uni0462 ; G 925 -U 1123 ; WX 602 ; N uni0463 ; G 926 -U 1138 ; WX 602 ; N uni0472 ; G 927 -U 1139 ; WX 602 ; N uni0473 ; G 928 -U 1168 ; WX 602 ; N uni0490 ; G 929 -U 1169 ; WX 602 ; N uni0491 ; G 930 -U 1170 ; WX 602 ; N uni0492 ; G 931 -U 1171 ; WX 602 ; N uni0493 ; G 932 -U 1172 ; WX 602 ; N uni0494 ; G 933 -U 1173 ; WX 602 ; N uni0495 ; G 934 -U 1174 ; WX 602 ; N uni0496 ; G 935 -U 1175 ; WX 602 ; N uni0497 ; G 936 -U 1176 ; WX 602 ; N uni0498 ; G 937 -U 1177 ; WX 602 ; N uni0499 ; G 938 -U 1178 ; WX 602 ; N uni049A ; G 939 -U 1179 ; WX 602 ; N uni049B ; G 940 -U 1186 ; WX 602 ; N uni04A2 ; G 941 -U 1187 ; WX 602 ; N uni04A3 ; G 942 -U 1188 ; WX 602 ; N uni04A4 ; G 943 -U 1189 ; WX 602 ; N uni04A5 ; G 944 -U 1194 ; WX 602 ; N uni04AA ; G 945 -U 1195 ; WX 602 ; N uni04AB ; G 946 -U 1196 ; WX 602 ; N uni04AC ; G 947 -U 1197 ; WX 602 ; N uni04AD ; G 948 -U 1198 ; WX 602 ; N uni04AE ; G 949 -U 1199 ; WX 602 ; N uni04AF ; G 950 -U 1200 ; WX 602 ; N uni04B0 ; G 951 -U 1201 ; WX 602 ; N uni04B1 ; G 952 -U 1202 ; WX 602 ; N uni04B2 ; G 953 -U 1203 ; WX 602 ; N uni04B3 ; G 954 -U 1210 ; WX 602 ; N uni04BA ; G 955 -U 1211 ; WX 602 ; N uni04BB ; G 956 -U 1216 ; WX 602 ; N uni04C0 ; G 957 -U 1217 ; WX 602 ; N uni04C1 ; G 958 -U 1218 ; WX 602 ; N uni04C2 ; G 959 -U 1219 ; WX 602 ; N uni04C3 ; G 960 -U 1220 ; WX 602 ; N uni04C4 ; G 961 -U 1223 ; WX 602 ; N uni04C7 ; G 962 -U 1224 ; WX 602 ; N uni04C8 ; G 963 -U 1227 ; WX 602 ; N uni04CB ; G 964 -U 1228 ; WX 602 ; N uni04CC ; G 965 -U 1231 ; WX 602 ; N uni04CF ; G 966 -U 1232 ; WX 602 ; N uni04D0 ; G 967 -U 1233 ; WX 602 ; N uni04D1 ; G 968 -U 1234 ; WX 602 ; N uni04D2 ; G 969 -U 1235 ; WX 602 ; N uni04D3 ; G 970 -U 1236 ; WX 602 ; N uni04D4 ; G 971 -U 1237 ; WX 602 ; N uni04D5 ; G 972 -U 1238 ; WX 602 ; N uni04D6 ; G 973 -U 1239 ; WX 602 ; N uni04D7 ; G 974 -U 1240 ; WX 602 ; N uni04D8 ; G 975 -U 1241 ; WX 602 ; N uni04D9 ; G 976 -U 1242 ; WX 602 ; N uni04DA ; G 977 -U 1243 ; WX 602 ; N uni04DB ; G 978 -U 1244 ; WX 602 ; N uni04DC ; G 979 -U 1245 ; WX 602 ; N uni04DD ; G 980 -U 1246 ; WX 602 ; N uni04DE ; G 981 -U 1247 ; WX 602 ; N uni04DF ; G 982 -U 1248 ; WX 602 ; N uni04E0 ; G 983 -U 1249 ; WX 602 ; N uni04E1 ; G 984 -U 1250 ; WX 602 ; N uni04E2 ; G 985 -U 1251 ; WX 602 ; N uni04E3 ; G 986 -U 1252 ; WX 602 ; N uni04E4 ; G 987 -U 1253 ; WX 602 ; N uni04E5 ; G 988 -U 1254 ; WX 602 ; N uni04E6 ; G 989 -U 1255 ; WX 602 ; N uni04E7 ; G 990 -U 1256 ; WX 602 ; N uni04E8 ; G 991 -U 1257 ; WX 602 ; N uni04E9 ; G 992 -U 1258 ; WX 602 ; N uni04EA ; G 993 -U 1259 ; WX 602 ; N uni04EB ; G 994 -U 1260 ; WX 602 ; N uni04EC ; G 995 -U 1261 ; WX 602 ; N uni04ED ; G 996 -U 1262 ; WX 602 ; N uni04EE ; G 997 -U 1263 ; WX 602 ; N uni04EF ; G 998 -U 1264 ; WX 602 ; N uni04F0 ; G 999 -U 1265 ; WX 602 ; N uni04F1 ; G 1000 -U 1266 ; WX 602 ; N uni04F2 ; G 1001 -U 1267 ; WX 602 ; N uni04F3 ; G 1002 -U 1268 ; WX 602 ; N uni04F4 ; G 1003 -U 1269 ; WX 602 ; N uni04F5 ; G 1004 -U 1270 ; WX 602 ; N uni04F6 ; G 1005 -U 1271 ; WX 602 ; N uni04F7 ; G 1006 -U 1272 ; WX 602 ; N uni04F8 ; G 1007 -U 1273 ; WX 602 ; N uni04F9 ; G 1008 -U 1296 ; WX 602 ; N uni0510 ; G 1009 -U 1297 ; WX 602 ; N uni0511 ; G 1010 -U 1306 ; WX 602 ; N uni051A ; G 1011 -U 1307 ; WX 602 ; N uni051B ; G 1012 -U 1308 ; WX 602 ; N uni051C ; G 1013 -U 1309 ; WX 602 ; N uni051D ; G 1014 -U 1329 ; WX 602 ; N uni0531 ; G 1015 -U 1330 ; WX 602 ; N uni0532 ; G 1016 -U 1331 ; WX 602 ; N uni0533 ; G 1017 -U 1332 ; WX 602 ; N uni0534 ; G 1018 -U 1333 ; WX 602 ; N uni0535 ; G 1019 -U 1334 ; WX 602 ; N uni0536 ; G 1020 -U 1335 ; WX 602 ; N uni0537 ; G 1021 -U 1336 ; WX 602 ; N uni0538 ; G 1022 -U 1337 ; WX 602 ; N uni0539 ; G 1023 -U 1338 ; WX 602 ; N uni053A ; G 1024 -U 1339 ; WX 602 ; N uni053B ; G 1025 -U 1340 ; WX 602 ; N uni053C ; G 1026 -U 1341 ; WX 602 ; N uni053D ; G 1027 -U 1342 ; WX 602 ; N uni053E ; G 1028 -U 1343 ; WX 602 ; N uni053F ; G 1029 -U 1344 ; WX 602 ; N uni0540 ; G 1030 -U 1345 ; WX 602 ; N uni0541 ; G 1031 -U 1346 ; WX 602 ; N uni0542 ; G 1032 -U 1347 ; WX 602 ; N uni0543 ; G 1033 -U 1348 ; WX 602 ; N uni0544 ; G 1034 -U 1349 ; WX 602 ; N uni0545 ; G 1035 -U 1350 ; WX 602 ; N uni0546 ; G 1036 -U 1351 ; WX 602 ; N uni0547 ; G 1037 -U 1352 ; WX 602 ; N uni0548 ; G 1038 -U 1353 ; WX 602 ; N uni0549 ; G 1039 -U 1354 ; WX 602 ; N uni054A ; G 1040 -U 1355 ; WX 602 ; N uni054B ; G 1041 -U 1356 ; WX 602 ; N uni054C ; G 1042 -U 1357 ; WX 602 ; N uni054D ; G 1043 -U 1358 ; WX 602 ; N uni054E ; G 1044 -U 1359 ; WX 602 ; N uni054F ; G 1045 -U 1360 ; WX 602 ; N uni0550 ; G 1046 -U 1361 ; WX 602 ; N uni0551 ; G 1047 -U 1362 ; WX 602 ; N uni0552 ; G 1048 -U 1363 ; WX 602 ; N uni0553 ; G 1049 -U 1364 ; WX 602 ; N uni0554 ; G 1050 -U 1365 ; WX 602 ; N uni0555 ; G 1051 -U 1366 ; WX 602 ; N uni0556 ; G 1052 -U 1369 ; WX 602 ; N uni0559 ; G 1053 -U 1370 ; WX 602 ; N uni055A ; G 1054 -U 1371 ; WX 602 ; N uni055B ; G 1055 -U 1372 ; WX 602 ; N uni055C ; G 1056 -U 1373 ; WX 602 ; N uni055D ; G 1057 -U 1374 ; WX 602 ; N uni055E ; G 1058 -U 1375 ; WX 602 ; N uni055F ; G 1059 -U 1377 ; WX 602 ; N uni0561 ; G 1060 -U 1378 ; WX 602 ; N uni0562 ; G 1061 -U 1379 ; WX 602 ; N uni0563 ; G 1062 -U 1380 ; WX 602 ; N uni0564 ; G 1063 -U 1381 ; WX 602 ; N uni0565 ; G 1064 -U 1382 ; WX 602 ; N uni0566 ; G 1065 -U 1383 ; WX 602 ; N uni0567 ; G 1066 -U 1384 ; WX 602 ; N uni0568 ; G 1067 -U 1385 ; WX 602 ; N uni0569 ; G 1068 -U 1386 ; WX 602 ; N uni056A ; G 1069 -U 1387 ; WX 602 ; N uni056B ; G 1070 -U 1388 ; WX 602 ; N uni056C ; G 1071 -U 1389 ; WX 602 ; N uni056D ; G 1072 -U 1390 ; WX 602 ; N uni056E ; G 1073 -U 1391 ; WX 602 ; N uni056F ; G 1074 -U 1392 ; WX 602 ; N uni0570 ; G 1075 -U 1393 ; WX 602 ; N uni0571 ; G 1076 -U 1394 ; WX 602 ; N uni0572 ; G 1077 -U 1395 ; WX 602 ; N uni0573 ; G 1078 -U 1396 ; WX 602 ; N uni0574 ; G 1079 -U 1397 ; WX 602 ; N uni0575 ; G 1080 -U 1398 ; WX 602 ; N uni0576 ; G 1081 -U 1399 ; WX 602 ; N uni0577 ; G 1082 -U 1400 ; WX 602 ; N uni0578 ; G 1083 -U 1401 ; WX 602 ; N uni0579 ; G 1084 -U 1402 ; WX 602 ; N uni057A ; G 1085 -U 1403 ; WX 602 ; N uni057B ; G 1086 -U 1404 ; WX 602 ; N uni057C ; G 1087 -U 1405 ; WX 602 ; N uni057D ; G 1088 -U 1406 ; WX 602 ; N uni057E ; G 1089 -U 1407 ; WX 602 ; N uni057F ; G 1090 -U 1408 ; WX 602 ; N uni0580 ; G 1091 -U 1409 ; WX 602 ; N uni0581 ; G 1092 -U 1410 ; WX 602 ; N uni0582 ; G 1093 -U 1411 ; WX 602 ; N uni0583 ; G 1094 -U 1412 ; WX 602 ; N uni0584 ; G 1095 -U 1413 ; WX 602 ; N uni0585 ; G 1096 -U 1414 ; WX 602 ; N uni0586 ; G 1097 -U 1415 ; WX 602 ; N uni0587 ; G 1098 -U 1417 ; WX 602 ; N uni0589 ; G 1099 -U 1418 ; WX 602 ; N uni058A ; G 1100 -U 3647 ; WX 602 ; N uni0E3F ; G 1101 -U 3713 ; WX 602 ; N uni0E81 ; G 1102 -U 3714 ; WX 602 ; N uni0E82 ; G 1103 -U 3716 ; WX 602 ; N uni0E84 ; G 1104 -U 3719 ; WX 602 ; N uni0E87 ; G 1105 -U 3720 ; WX 602 ; N uni0E88 ; G 1106 -U 3722 ; WX 602 ; N uni0E8A ; G 1107 -U 3725 ; WX 602 ; N uni0E8D ; G 1108 -U 3732 ; WX 602 ; N uni0E94 ; G 1109 -U 3733 ; WX 602 ; N uni0E95 ; G 1110 -U 3734 ; WX 602 ; N uni0E96 ; G 1111 -U 3735 ; WX 602 ; N uni0E97 ; G 1112 -U 3737 ; WX 602 ; N uni0E99 ; G 1113 -U 3738 ; WX 602 ; N uni0E9A ; G 1114 -U 3739 ; WX 602 ; N uni0E9B ; G 1115 -U 3740 ; WX 602 ; N uni0E9C ; G 1116 -U 3741 ; WX 602 ; N uni0E9D ; G 1117 -U 3742 ; WX 602 ; N uni0E9E ; G 1118 -U 3743 ; WX 602 ; N uni0E9F ; G 1119 -U 3745 ; WX 602 ; N uni0EA1 ; G 1120 -U 3746 ; WX 602 ; N uni0EA2 ; G 1121 -U 3747 ; WX 602 ; N uni0EA3 ; G 1122 -U 3749 ; WX 602 ; N uni0EA5 ; G 1123 -U 3751 ; WX 602 ; N uni0EA7 ; G 1124 -U 3754 ; WX 602 ; N uni0EAA ; G 1125 -U 3755 ; WX 602 ; N uni0EAB ; G 1126 -U 3757 ; WX 602 ; N uni0EAD ; G 1127 -U 3758 ; WX 602 ; N uni0EAE ; G 1128 -U 3759 ; WX 602 ; N uni0EAF ; G 1129 -U 3760 ; WX 602 ; N uni0EB0 ; G 1130 -U 3761 ; WX 602 ; N uni0EB1 ; G 1131 -U 3762 ; WX 602 ; N uni0EB2 ; G 1132 -U 3763 ; WX 602 ; N uni0EB3 ; G 1133 -U 3764 ; WX 602 ; N uni0EB4 ; G 1134 -U 3765 ; WX 602 ; N uni0EB5 ; G 1135 -U 3766 ; WX 602 ; N uni0EB6 ; G 1136 -U 3767 ; WX 602 ; N uni0EB7 ; G 1137 -U 3768 ; WX 602 ; N uni0EB8 ; G 1138 -U 3769 ; WX 602 ; N uni0EB9 ; G 1139 -U 3771 ; WX 602 ; N uni0EBB ; G 1140 -U 3772 ; WX 602 ; N uni0EBC ; G 1141 -U 3784 ; WX 602 ; N uni0EC8 ; G 1142 -U 3785 ; WX 602 ; N uni0EC9 ; G 1143 -U 3786 ; WX 602 ; N uni0ECA ; G 1144 -U 3787 ; WX 602 ; N uni0ECB ; G 1145 -U 3788 ; WX 602 ; N uni0ECC ; G 1146 -U 3789 ; WX 602 ; N uni0ECD ; G 1147 -U 4304 ; WX 602 ; N uni10D0 ; G 1148 -U 4305 ; WX 602 ; N uni10D1 ; G 1149 -U 4306 ; WX 602 ; N uni10D2 ; G 1150 -U 4307 ; WX 602 ; N uni10D3 ; G 1151 -U 4308 ; WX 602 ; N uni10D4 ; G 1152 -U 4309 ; WX 602 ; N uni10D5 ; G 1153 -U 4310 ; WX 602 ; N uni10D6 ; G 1154 -U 4311 ; WX 602 ; N uni10D7 ; G 1155 -U 4312 ; WX 602 ; N uni10D8 ; G 1156 -U 4313 ; WX 602 ; N uni10D9 ; G 1157 -U 4314 ; WX 602 ; N uni10DA ; G 1158 -U 4315 ; WX 602 ; N uni10DB ; G 1159 -U 4316 ; WX 602 ; N uni10DC ; G 1160 -U 4317 ; WX 602 ; N uni10DD ; G 1161 -U 4318 ; WX 602 ; N uni10DE ; G 1162 -U 4319 ; WX 602 ; N uni10DF ; G 1163 -U 4320 ; WX 602 ; N uni10E0 ; G 1164 -U 4321 ; WX 602 ; N uni10E1 ; G 1165 -U 4322 ; WX 602 ; N uni10E2 ; G 1166 -U 4323 ; WX 602 ; N uni10E3 ; G 1167 -U 4324 ; WX 602 ; N uni10E4 ; G 1168 -U 4325 ; WX 602 ; N uni10E5 ; G 1169 -U 4326 ; WX 602 ; N uni10E6 ; G 1170 -U 4327 ; WX 602 ; N uni10E7 ; G 1171 -U 4328 ; WX 602 ; N uni10E8 ; G 1172 -U 4329 ; WX 602 ; N uni10E9 ; G 1173 -U 4330 ; WX 602 ; N uni10EA ; G 1174 -U 4331 ; WX 602 ; N uni10EB ; G 1175 -U 4332 ; WX 602 ; N uni10EC ; G 1176 -U 4333 ; WX 602 ; N uni10ED ; G 1177 -U 4334 ; WX 602 ; N uni10EE ; G 1178 -U 4335 ; WX 602 ; N uni10EF ; G 1179 -U 4336 ; WX 602 ; N uni10F0 ; G 1180 -U 4337 ; WX 602 ; N uni10F1 ; G 1181 -U 4338 ; WX 602 ; N uni10F2 ; G 1182 -U 4339 ; WX 602 ; N uni10F3 ; G 1183 -U 4340 ; WX 602 ; N uni10F4 ; G 1184 -U 4341 ; WX 602 ; N uni10F5 ; G 1185 -U 4342 ; WX 602 ; N uni10F6 ; G 1186 -U 4343 ; WX 602 ; N uni10F7 ; G 1187 -U 4344 ; WX 602 ; N uni10F8 ; G 1188 -U 4345 ; WX 602 ; N uni10F9 ; G 1189 -U 4346 ; WX 602 ; N uni10FA ; G 1190 -U 4347 ; WX 602 ; N uni10FB ; G 1191 -U 4348 ; WX 602 ; N uni10FC ; G 1192 -U 7426 ; WX 602 ; N uni1D02 ; G 1193 -U 7432 ; WX 602 ; N uni1D08 ; G 1194 -U 7433 ; WX 602 ; N uni1D09 ; G 1195 -U 7444 ; WX 602 ; N uni1D14 ; G 1196 -U 7446 ; WX 602 ; N uni1D16 ; G 1197 -U 7447 ; WX 602 ; N uni1D17 ; G 1198 -U 7453 ; WX 602 ; N uni1D1D ; G 1199 -U 7454 ; WX 602 ; N uni1D1E ; G 1200 -U 7455 ; WX 602 ; N uni1D1F ; G 1201 -U 7468 ; WX 602 ; N uni1D2C ; G 1202 -U 7469 ; WX 602 ; N uni1D2D ; G 1203 -U 7470 ; WX 602 ; N uni1D2E ; G 1204 -U 7472 ; WX 602 ; N uni1D30 ; G 1205 -U 7473 ; WX 602 ; N uni1D31 ; G 1206 -U 7474 ; WX 602 ; N uni1D32 ; G 1207 -U 7475 ; WX 602 ; N uni1D33 ; G 1208 -U 7476 ; WX 602 ; N uni1D34 ; G 1209 -U 7477 ; WX 602 ; N uni1D35 ; G 1210 -U 7478 ; WX 602 ; N uni1D36 ; G 1211 -U 7479 ; WX 602 ; N uni1D37 ; G 1212 -U 7480 ; WX 602 ; N uni1D38 ; G 1213 -U 7481 ; WX 602 ; N uni1D39 ; G 1214 -U 7482 ; WX 602 ; N uni1D3A ; G 1215 -U 7483 ; WX 602 ; N uni1D3B ; G 1216 -U 7484 ; WX 602 ; N uni1D3C ; G 1217 -U 7486 ; WX 602 ; N uni1D3E ; G 1218 -U 7487 ; WX 602 ; N uni1D3F ; G 1219 -U 7488 ; WX 602 ; N uni1D40 ; G 1220 -U 7489 ; WX 602 ; N uni1D41 ; G 1221 -U 7490 ; WX 602 ; N uni1D42 ; G 1222 -U 7491 ; WX 602 ; N uni1D43 ; G 1223 -U 7492 ; WX 602 ; N uni1D44 ; G 1224 -U 7493 ; WX 602 ; N uni1D45 ; G 1225 -U 7494 ; WX 602 ; N uni1D46 ; G 1226 -U 7495 ; WX 602 ; N uni1D47 ; G 1227 -U 7496 ; WX 602 ; N uni1D48 ; G 1228 -U 7497 ; WX 602 ; N uni1D49 ; G 1229 -U 7498 ; WX 602 ; N uni1D4A ; G 1230 -U 7499 ; WX 602 ; N uni1D4B ; G 1231 -U 7500 ; WX 602 ; N uni1D4C ; G 1232 -U 7501 ; WX 602 ; N uni1D4D ; G 1233 -U 7502 ; WX 602 ; N uni1D4E ; G 1234 -U 7503 ; WX 602 ; N uni1D4F ; G 1235 -U 7504 ; WX 602 ; N uni1D50 ; G 1236 -U 7505 ; WX 602 ; N uni1D51 ; G 1237 -U 7506 ; WX 602 ; N uni1D52 ; G 1238 -U 7507 ; WX 602 ; N uni1D53 ; G 1239 -U 7508 ; WX 602 ; N uni1D54 ; G 1240 -U 7509 ; WX 602 ; N uni1D55 ; G 1241 -U 7510 ; WX 602 ; N uni1D56 ; G 1242 -U 7511 ; WX 602 ; N uni1D57 ; G 1243 -U 7512 ; WX 602 ; N uni1D58 ; G 1244 -U 7513 ; WX 602 ; N uni1D59 ; G 1245 -U 7514 ; WX 602 ; N uni1D5A ; G 1246 -U 7515 ; WX 602 ; N uni1D5B ; G 1247 -U 7522 ; WX 602 ; N uni1D62 ; G 1248 -U 7523 ; WX 602 ; N uni1D63 ; G 1249 -U 7524 ; WX 602 ; N uni1D64 ; G 1250 -U 7525 ; WX 602 ; N uni1D65 ; G 1251 -U 7543 ; WX 602 ; N uni1D77 ; G 1252 -U 7544 ; WX 602 ; N uni1D78 ; G 1253 -U 7547 ; WX 602 ; N uni1D7B ; G 1254 -U 7557 ; WX 602 ; N uni1D85 ; G 1255 -U 7579 ; WX 602 ; N uni1D9B ; G 1256 -U 7580 ; WX 602 ; N uni1D9C ; G 1257 -U 7581 ; WX 602 ; N uni1D9D ; G 1258 -U 7582 ; WX 602 ; N uni1D9E ; G 1259 -U 7583 ; WX 602 ; N uni1D9F ; G 1260 -U 7584 ; WX 602 ; N uni1DA0 ; G 1261 -U 7585 ; WX 602 ; N uni1DA1 ; G 1262 -U 7586 ; WX 602 ; N uni1DA2 ; G 1263 -U 7587 ; WX 602 ; N uni1DA3 ; G 1264 -U 7588 ; WX 602 ; N uni1DA4 ; G 1265 -U 7589 ; WX 602 ; N uni1DA5 ; G 1266 -U 7590 ; WX 602 ; N uni1DA6 ; G 1267 -U 7591 ; WX 602 ; N uni1DA7 ; G 1268 -U 7592 ; WX 602 ; N uni1DA8 ; G 1269 -U 7593 ; WX 602 ; N uni1DA9 ; G 1270 -U 7594 ; WX 602 ; N uni1DAA ; G 1271 -U 7595 ; WX 602 ; N uni1DAB ; G 1272 -U 7596 ; WX 602 ; N uni1DAC ; G 1273 -U 7597 ; WX 602 ; N uni1DAD ; G 1274 -U 7598 ; WX 602 ; N uni1DAE ; G 1275 -U 7599 ; WX 602 ; N uni1DAF ; G 1276 -U 7600 ; WX 602 ; N uni1DB0 ; G 1277 -U 7601 ; WX 602 ; N uni1DB1 ; G 1278 -U 7602 ; WX 602 ; N uni1DB2 ; G 1279 -U 7603 ; WX 602 ; N uni1DB3 ; G 1280 -U 7604 ; WX 602 ; N uni1DB4 ; G 1281 -U 7605 ; WX 602 ; N uni1DB5 ; G 1282 -U 7606 ; WX 602 ; N uni1DB6 ; G 1283 -U 7607 ; WX 602 ; N uni1DB7 ; G 1284 -U 7609 ; WX 602 ; N uni1DB9 ; G 1285 -U 7610 ; WX 602 ; N uni1DBA ; G 1286 -U 7611 ; WX 602 ; N uni1DBB ; G 1287 -U 7612 ; WX 602 ; N uni1DBC ; G 1288 -U 7613 ; WX 602 ; N uni1DBD ; G 1289 -U 7614 ; WX 602 ; N uni1DBE ; G 1290 -U 7615 ; WX 602 ; N uni1DBF ; G 1291 -U 7680 ; WX 602 ; N uni1E00 ; G 1292 -U 7681 ; WX 602 ; N uni1E01 ; G 1293 -U 7682 ; WX 602 ; N uni1E02 ; G 1294 -U 7683 ; WX 602 ; N uni1E03 ; G 1295 -U 7684 ; WX 602 ; N uni1E04 ; G 1296 -U 7685 ; WX 602 ; N uni1E05 ; G 1297 -U 7686 ; WX 602 ; N uni1E06 ; G 1298 -U 7687 ; WX 602 ; N uni1E07 ; G 1299 -U 7688 ; WX 602 ; N uni1E08 ; G 1300 -U 7689 ; WX 602 ; N uni1E09 ; G 1301 -U 7690 ; WX 602 ; N uni1E0A ; G 1302 -U 7691 ; WX 602 ; N uni1E0B ; G 1303 -U 7692 ; WX 602 ; N uni1E0C ; G 1304 -U 7693 ; WX 602 ; N uni1E0D ; G 1305 -U 7694 ; WX 602 ; N uni1E0E ; G 1306 -U 7695 ; WX 602 ; N uni1E0F ; G 1307 -U 7696 ; WX 602 ; N uni1E10 ; G 1308 -U 7697 ; WX 602 ; N uni1E11 ; G 1309 -U 7698 ; WX 602 ; N uni1E12 ; G 1310 -U 7699 ; WX 602 ; N uni1E13 ; G 1311 -U 7704 ; WX 602 ; N uni1E18 ; G 1312 -U 7705 ; WX 602 ; N uni1E19 ; G 1313 -U 7706 ; WX 602 ; N uni1E1A ; G 1314 -U 7707 ; WX 602 ; N uni1E1B ; G 1315 -U 7708 ; WX 602 ; N uni1E1C ; G 1316 -U 7709 ; WX 602 ; N uni1E1D ; G 1317 -U 7710 ; WX 602 ; N uni1E1E ; G 1318 -U 7711 ; WX 602 ; N uni1E1F ; G 1319 -U 7712 ; WX 602 ; N uni1E20 ; G 1320 -U 7713 ; WX 602 ; N uni1E21 ; G 1321 -U 7714 ; WX 602 ; N uni1E22 ; G 1322 -U 7715 ; WX 602 ; N uni1E23 ; G 1323 -U 7716 ; WX 602 ; N uni1E24 ; G 1324 -U 7717 ; WX 602 ; N uni1E25 ; G 1325 -U 7718 ; WX 602 ; N uni1E26 ; G 1326 -U 7719 ; WX 602 ; N uni1E27 ; G 1327 -U 7720 ; WX 602 ; N uni1E28 ; G 1328 -U 7721 ; WX 602 ; N uni1E29 ; G 1329 -U 7722 ; WX 602 ; N uni1E2A ; G 1330 -U 7723 ; WX 602 ; N uni1E2B ; G 1331 -U 7724 ; WX 602 ; N uni1E2C ; G 1332 -U 7725 ; WX 602 ; N uni1E2D ; G 1333 -U 7728 ; WX 602 ; N uni1E30 ; G 1334 -U 7729 ; WX 602 ; N uni1E31 ; G 1335 -U 7730 ; WX 602 ; N uni1E32 ; G 1336 -U 7731 ; WX 602 ; N uni1E33 ; G 1337 -U 7732 ; WX 602 ; N uni1E34 ; G 1338 -U 7733 ; WX 602 ; N uni1E35 ; G 1339 -U 7734 ; WX 602 ; N uni1E36 ; G 1340 -U 7735 ; WX 602 ; N uni1E37 ; G 1341 -U 7736 ; WX 602 ; N uni1E38 ; G 1342 -U 7737 ; WX 602 ; N uni1E39 ; G 1343 -U 7738 ; WX 602 ; N uni1E3A ; G 1344 -U 7739 ; WX 602 ; N uni1E3B ; G 1345 -U 7740 ; WX 602 ; N uni1E3C ; G 1346 -U 7741 ; WX 602 ; N uni1E3D ; G 1347 -U 7742 ; WX 602 ; N uni1E3E ; G 1348 -U 7743 ; WX 602 ; N uni1E3F ; G 1349 -U 7744 ; WX 602 ; N uni1E40 ; G 1350 -U 7745 ; WX 602 ; N uni1E41 ; G 1351 -U 7746 ; WX 602 ; N uni1E42 ; G 1352 -U 7747 ; WX 602 ; N uni1E43 ; G 1353 -U 7748 ; WX 602 ; N uni1E44 ; G 1354 -U 7749 ; WX 602 ; N uni1E45 ; G 1355 -U 7750 ; WX 602 ; N uni1E46 ; G 1356 -U 7751 ; WX 602 ; N uni1E47 ; G 1357 -U 7752 ; WX 602 ; N uni1E48 ; G 1358 -U 7753 ; WX 602 ; N uni1E49 ; G 1359 -U 7754 ; WX 602 ; N uni1E4A ; G 1360 -U 7755 ; WX 602 ; N uni1E4B ; G 1361 -U 7756 ; WX 602 ; N uni1E4C ; G 1362 -U 7757 ; WX 602 ; N uni1E4D ; G 1363 -U 7764 ; WX 602 ; N uni1E54 ; G 1364 -U 7765 ; WX 602 ; N uni1E55 ; G 1365 -U 7766 ; WX 602 ; N uni1E56 ; G 1366 -U 7767 ; WX 602 ; N uni1E57 ; G 1367 -U 7768 ; WX 602 ; N uni1E58 ; G 1368 -U 7769 ; WX 602 ; N uni1E59 ; G 1369 -U 7770 ; WX 602 ; N uni1E5A ; G 1370 -U 7771 ; WX 602 ; N uni1E5B ; G 1371 -U 7772 ; WX 602 ; N uni1E5C ; G 1372 -U 7773 ; WX 602 ; N uni1E5D ; G 1373 -U 7774 ; WX 602 ; N uni1E5E ; G 1374 -U 7775 ; WX 602 ; N uni1E5F ; G 1375 -U 7776 ; WX 602 ; N uni1E60 ; G 1376 -U 7777 ; WX 602 ; N uni1E61 ; G 1377 -U 7778 ; WX 602 ; N uni1E62 ; G 1378 -U 7779 ; WX 602 ; N uni1E63 ; G 1379 -U 7784 ; WX 602 ; N uni1E68 ; G 1380 -U 7785 ; WX 602 ; N uni1E69 ; G 1381 -U 7786 ; WX 602 ; N uni1E6A ; G 1382 -U 7787 ; WX 602 ; N uni1E6B ; G 1383 -U 7788 ; WX 602 ; N uni1E6C ; G 1384 -U 7789 ; WX 602 ; N uni1E6D ; G 1385 -U 7790 ; WX 602 ; N uni1E6E ; G 1386 -U 7791 ; WX 602 ; N uni1E6F ; G 1387 -U 7792 ; WX 602 ; N uni1E70 ; G 1388 -U 7793 ; WX 602 ; N uni1E71 ; G 1389 -U 7794 ; WX 602 ; N uni1E72 ; G 1390 -U 7795 ; WX 602 ; N uni1E73 ; G 1391 -U 7796 ; WX 602 ; N uni1E74 ; G 1392 -U 7797 ; WX 602 ; N uni1E75 ; G 1393 -U 7798 ; WX 602 ; N uni1E76 ; G 1394 -U 7799 ; WX 602 ; N uni1E77 ; G 1395 -U 7800 ; WX 602 ; N uni1E78 ; G 1396 -U 7801 ; WX 602 ; N uni1E79 ; G 1397 -U 7804 ; WX 602 ; N uni1E7C ; G 1398 -U 7805 ; WX 602 ; N uni1E7D ; G 1399 -U 7806 ; WX 602 ; N uni1E7E ; G 1400 -U 7807 ; WX 602 ; N uni1E7F ; G 1401 -U 7808 ; WX 602 ; N Wgrave ; G 1402 -U 7809 ; WX 602 ; N wgrave ; G 1403 -U 7810 ; WX 602 ; N Wacute ; G 1404 -U 7811 ; WX 602 ; N wacute ; G 1405 -U 7812 ; WX 602 ; N Wdieresis ; G 1406 -U 7813 ; WX 602 ; N wdieresis ; G 1407 -U 7814 ; WX 602 ; N uni1E86 ; G 1408 -U 7815 ; WX 602 ; N uni1E87 ; G 1409 -U 7816 ; WX 602 ; N uni1E88 ; G 1410 -U 7817 ; WX 602 ; N uni1E89 ; G 1411 -U 7818 ; WX 602 ; N uni1E8A ; G 1412 -U 7819 ; WX 602 ; N uni1E8B ; G 1413 -U 7820 ; WX 602 ; N uni1E8C ; G 1414 -U 7821 ; WX 602 ; N uni1E8D ; G 1415 -U 7822 ; WX 602 ; N uni1E8E ; G 1416 -U 7823 ; WX 602 ; N uni1E8F ; G 1417 -U 7824 ; WX 602 ; N uni1E90 ; G 1418 -U 7825 ; WX 602 ; N uni1E91 ; G 1419 -U 7826 ; WX 602 ; N uni1E92 ; G 1420 -U 7827 ; WX 602 ; N uni1E93 ; G 1421 -U 7828 ; WX 602 ; N uni1E94 ; G 1422 -U 7829 ; WX 602 ; N uni1E95 ; G 1423 -U 7830 ; WX 602 ; N uni1E96 ; G 1424 -U 7831 ; WX 602 ; N uni1E97 ; G 1425 -U 7832 ; WX 602 ; N uni1E98 ; G 1426 -U 7833 ; WX 602 ; N uni1E99 ; G 1427 -U 7835 ; WX 602 ; N uni1E9B ; G 1428 -U 7839 ; WX 602 ; N uni1E9F ; G 1429 -U 7840 ; WX 602 ; N uni1EA0 ; G 1430 -U 7841 ; WX 602 ; N uni1EA1 ; G 1431 -U 7852 ; WX 602 ; N uni1EAC ; G 1432 -U 7853 ; WX 602 ; N uni1EAD ; G 1433 -U 7856 ; WX 602 ; N uni1EB0 ; G 1434 -U 7857 ; WX 602 ; N uni1EB1 ; G 1435 -U 7862 ; WX 602 ; N uni1EB6 ; G 1436 -U 7863 ; WX 602 ; N uni1EB7 ; G 1437 -U 7864 ; WX 602 ; N uni1EB8 ; G 1438 -U 7865 ; WX 602 ; N uni1EB9 ; G 1439 -U 7868 ; WX 602 ; N uni1EBC ; G 1440 -U 7869 ; WX 602 ; N uni1EBD ; G 1441 -U 7878 ; WX 602 ; N uni1EC6 ; G 1442 -U 7879 ; WX 602 ; N uni1EC7 ; G 1443 -U 7882 ; WX 602 ; N uni1ECA ; G 1444 -U 7883 ; WX 602 ; N uni1ECB ; G 1445 -U 7884 ; WX 602 ; N uni1ECC ; G 1446 -U 7885 ; WX 602 ; N uni1ECD ; G 1447 -U 7896 ; WX 602 ; N uni1ED8 ; G 1448 -U 7897 ; WX 602 ; N uni1ED9 ; G 1449 -U 7898 ; WX 602 ; N uni1EDA ; G 1450 -U 7899 ; WX 602 ; N uni1EDB ; G 1451 -U 7900 ; WX 602 ; N uni1EDC ; G 1452 -U 7901 ; WX 602 ; N uni1EDD ; G 1453 -U 7904 ; WX 602 ; N uni1EE0 ; G 1454 -U 7905 ; WX 602 ; N uni1EE1 ; G 1455 -U 7906 ; WX 602 ; N uni1EE2 ; G 1456 -U 7907 ; WX 602 ; N uni1EE3 ; G 1457 -U 7908 ; WX 602 ; N uni1EE4 ; G 1458 -U 7909 ; WX 602 ; N uni1EE5 ; G 1459 -U 7912 ; WX 602 ; N uni1EE8 ; G 1460 -U 7913 ; WX 602 ; N uni1EE9 ; G 1461 -U 7914 ; WX 602 ; N uni1EEA ; G 1462 -U 7915 ; WX 602 ; N uni1EEB ; G 1463 -U 7918 ; WX 602 ; N uni1EEE ; G 1464 -U 7919 ; WX 602 ; N uni1EEF ; G 1465 -U 7920 ; WX 602 ; N uni1EF0 ; G 1466 -U 7921 ; WX 602 ; N uni1EF1 ; G 1467 -U 7922 ; WX 602 ; N Ygrave ; G 1468 -U 7923 ; WX 602 ; N ygrave ; G 1469 -U 7924 ; WX 602 ; N uni1EF4 ; G 1470 -U 7925 ; WX 602 ; N uni1EF5 ; G 1471 -U 7928 ; WX 602 ; N uni1EF8 ; G 1472 -U 7929 ; WX 602 ; N uni1EF9 ; G 1473 -U 7936 ; WX 602 ; N uni1F00 ; G 1474 -U 7937 ; WX 602 ; N uni1F01 ; G 1475 -U 7938 ; WX 602 ; N uni1F02 ; G 1476 -U 7939 ; WX 602 ; N uni1F03 ; G 1477 -U 7940 ; WX 602 ; N uni1F04 ; G 1478 -U 7941 ; WX 602 ; N uni1F05 ; G 1479 -U 7942 ; WX 602 ; N uni1F06 ; G 1480 -U 7943 ; WX 602 ; N uni1F07 ; G 1481 -U 7944 ; WX 602 ; N uni1F08 ; G 1482 -U 7945 ; WX 602 ; N uni1F09 ; G 1483 -U 7946 ; WX 602 ; N uni1F0A ; G 1484 -U 7947 ; WX 602 ; N uni1F0B ; G 1485 -U 7948 ; WX 602 ; N uni1F0C ; G 1486 -U 7949 ; WX 602 ; N uni1F0D ; G 1487 -U 7950 ; WX 602 ; N uni1F0E ; G 1488 -U 7951 ; WX 602 ; N uni1F0F ; G 1489 -U 7952 ; WX 602 ; N uni1F10 ; G 1490 -U 7953 ; WX 602 ; N uni1F11 ; G 1491 -U 7954 ; WX 602 ; N uni1F12 ; G 1492 -U 7955 ; WX 602 ; N uni1F13 ; G 1493 -U 7956 ; WX 602 ; N uni1F14 ; G 1494 -U 7957 ; WX 602 ; N uni1F15 ; G 1495 -U 7960 ; WX 602 ; N uni1F18 ; G 1496 -U 7961 ; WX 602 ; N uni1F19 ; G 1497 -U 7962 ; WX 602 ; N uni1F1A ; G 1498 -U 7963 ; WX 602 ; N uni1F1B ; G 1499 -U 7964 ; WX 602 ; N uni1F1C ; G 1500 -U 7965 ; WX 602 ; N uni1F1D ; G 1501 -U 7968 ; WX 602 ; N uni1F20 ; G 1502 -U 7969 ; WX 602 ; N uni1F21 ; G 1503 -U 7970 ; WX 602 ; N uni1F22 ; G 1504 -U 7971 ; WX 602 ; N uni1F23 ; G 1505 -U 7972 ; WX 602 ; N uni1F24 ; G 1506 -U 7973 ; WX 602 ; N uni1F25 ; G 1507 -U 7974 ; WX 602 ; N uni1F26 ; G 1508 -U 7975 ; WX 602 ; N uni1F27 ; G 1509 -U 7976 ; WX 602 ; N uni1F28 ; G 1510 -U 7977 ; WX 602 ; N uni1F29 ; G 1511 -U 7978 ; WX 602 ; N uni1F2A ; G 1512 -U 7979 ; WX 602 ; N uni1F2B ; G 1513 -U 7980 ; WX 602 ; N uni1F2C ; G 1514 -U 7981 ; WX 602 ; N uni1F2D ; G 1515 -U 7982 ; WX 602 ; N uni1F2E ; G 1516 -U 7983 ; WX 602 ; N uni1F2F ; G 1517 -U 7984 ; WX 602 ; N uni1F30 ; G 1518 -U 7985 ; WX 602 ; N uni1F31 ; G 1519 -U 7986 ; WX 602 ; N uni1F32 ; G 1520 -U 7987 ; WX 602 ; N uni1F33 ; G 1521 -U 7988 ; WX 602 ; N uni1F34 ; G 1522 -U 7989 ; WX 602 ; N uni1F35 ; G 1523 -U 7990 ; WX 602 ; N uni1F36 ; G 1524 -U 7991 ; WX 602 ; N uni1F37 ; G 1525 -U 7992 ; WX 602 ; N uni1F38 ; G 1526 -U 7993 ; WX 602 ; N uni1F39 ; G 1527 -U 7994 ; WX 602 ; N uni1F3A ; G 1528 -U 7995 ; WX 602 ; N uni1F3B ; G 1529 -U 7996 ; WX 602 ; N uni1F3C ; G 1530 -U 7997 ; WX 602 ; N uni1F3D ; G 1531 -U 7998 ; WX 602 ; N uni1F3E ; G 1532 -U 7999 ; WX 602 ; N uni1F3F ; G 1533 -U 8000 ; WX 602 ; N uni1F40 ; G 1534 -U 8001 ; WX 602 ; N uni1F41 ; G 1535 -U 8002 ; WX 602 ; N uni1F42 ; G 1536 -U 8003 ; WX 602 ; N uni1F43 ; G 1537 -U 8004 ; WX 602 ; N uni1F44 ; G 1538 -U 8005 ; WX 602 ; N uni1F45 ; G 1539 -U 8008 ; WX 602 ; N uni1F48 ; G 1540 -U 8009 ; WX 602 ; N uni1F49 ; G 1541 -U 8010 ; WX 602 ; N uni1F4A ; G 1542 -U 8011 ; WX 602 ; N uni1F4B ; G 1543 -U 8012 ; WX 602 ; N uni1F4C ; G 1544 -U 8013 ; WX 602 ; N uni1F4D ; G 1545 -U 8016 ; WX 602 ; N uni1F50 ; G 1546 -U 8017 ; WX 602 ; N uni1F51 ; G 1547 -U 8018 ; WX 602 ; N uni1F52 ; G 1548 -U 8019 ; WX 602 ; N uni1F53 ; G 1549 -U 8020 ; WX 602 ; N uni1F54 ; G 1550 -U 8021 ; WX 602 ; N uni1F55 ; G 1551 -U 8022 ; WX 602 ; N uni1F56 ; G 1552 -U 8023 ; WX 602 ; N uni1F57 ; G 1553 -U 8025 ; WX 602 ; N uni1F59 ; G 1554 -U 8027 ; WX 602 ; N uni1F5B ; G 1555 -U 8029 ; WX 602 ; N uni1F5D ; G 1556 -U 8031 ; WX 602 ; N uni1F5F ; G 1557 -U 8032 ; WX 602 ; N uni1F60 ; G 1558 -U 8033 ; WX 602 ; N uni1F61 ; G 1559 -U 8034 ; WX 602 ; N uni1F62 ; G 1560 -U 8035 ; WX 602 ; N uni1F63 ; G 1561 -U 8036 ; WX 602 ; N uni1F64 ; G 1562 -U 8037 ; WX 602 ; N uni1F65 ; G 1563 -U 8038 ; WX 602 ; N uni1F66 ; G 1564 -U 8039 ; WX 602 ; N uni1F67 ; G 1565 -U 8040 ; WX 602 ; N uni1F68 ; G 1566 -U 8041 ; WX 602 ; N uni1F69 ; G 1567 -U 8042 ; WX 602 ; N uni1F6A ; G 1568 -U 8043 ; WX 602 ; N uni1F6B ; G 1569 -U 8044 ; WX 602 ; N uni1F6C ; G 1570 -U 8045 ; WX 602 ; N uni1F6D ; G 1571 -U 8046 ; WX 602 ; N uni1F6E ; G 1572 -U 8047 ; WX 602 ; N uni1F6F ; G 1573 -U 8048 ; WX 602 ; N uni1F70 ; G 1574 -U 8049 ; WX 602 ; N uni1F71 ; G 1575 -U 8050 ; WX 602 ; N uni1F72 ; G 1576 -U 8051 ; WX 602 ; N uni1F73 ; G 1577 -U 8052 ; WX 602 ; N uni1F74 ; G 1578 -U 8053 ; WX 602 ; N uni1F75 ; G 1579 -U 8054 ; WX 602 ; N uni1F76 ; G 1580 -U 8055 ; WX 602 ; N uni1F77 ; G 1581 -U 8056 ; WX 602 ; N uni1F78 ; G 1582 -U 8057 ; WX 602 ; N uni1F79 ; G 1583 -U 8058 ; WX 602 ; N uni1F7A ; G 1584 -U 8059 ; WX 602 ; N uni1F7B ; G 1585 -U 8060 ; WX 602 ; N uni1F7C ; G 1586 -U 8061 ; WX 602 ; N uni1F7D ; G 1587 -U 8064 ; WX 602 ; N uni1F80 ; G 1588 -U 8065 ; WX 602 ; N uni1F81 ; G 1589 -U 8066 ; WX 602 ; N uni1F82 ; G 1590 -U 8067 ; WX 602 ; N uni1F83 ; G 1591 -U 8068 ; WX 602 ; N uni1F84 ; G 1592 -U 8069 ; WX 602 ; N uni1F85 ; G 1593 -U 8070 ; WX 602 ; N uni1F86 ; G 1594 -U 8071 ; WX 602 ; N uni1F87 ; G 1595 -U 8072 ; WX 602 ; N uni1F88 ; G 1596 -U 8073 ; WX 602 ; N uni1F89 ; G 1597 -U 8074 ; WX 602 ; N uni1F8A ; G 1598 -U 8075 ; WX 602 ; N uni1F8B ; G 1599 -U 8076 ; WX 602 ; N uni1F8C ; G 1600 -U 8077 ; WX 602 ; N uni1F8D ; G 1601 -U 8078 ; WX 602 ; N uni1F8E ; G 1602 -U 8079 ; WX 602 ; N uni1F8F ; G 1603 -U 8080 ; WX 602 ; N uni1F90 ; G 1604 -U 8081 ; WX 602 ; N uni1F91 ; G 1605 -U 8082 ; WX 602 ; N uni1F92 ; G 1606 -U 8083 ; WX 602 ; N uni1F93 ; G 1607 -U 8084 ; WX 602 ; N uni1F94 ; G 1608 -U 8085 ; WX 602 ; N uni1F95 ; G 1609 -U 8086 ; WX 602 ; N uni1F96 ; G 1610 -U 8087 ; WX 602 ; N uni1F97 ; G 1611 -U 8088 ; WX 602 ; N uni1F98 ; G 1612 -U 8089 ; WX 602 ; N uni1F99 ; G 1613 -U 8090 ; WX 602 ; N uni1F9A ; G 1614 -U 8091 ; WX 602 ; N uni1F9B ; G 1615 -U 8092 ; WX 602 ; N uni1F9C ; G 1616 -U 8093 ; WX 602 ; N uni1F9D ; G 1617 -U 8094 ; WX 602 ; N uni1F9E ; G 1618 -U 8095 ; WX 602 ; N uni1F9F ; G 1619 -U 8096 ; WX 602 ; N uni1FA0 ; G 1620 -U 8097 ; WX 602 ; N uni1FA1 ; G 1621 -U 8098 ; WX 602 ; N uni1FA2 ; G 1622 -U 8099 ; WX 602 ; N uni1FA3 ; G 1623 -U 8100 ; WX 602 ; N uni1FA4 ; G 1624 -U 8101 ; WX 602 ; N uni1FA5 ; G 1625 -U 8102 ; WX 602 ; N uni1FA6 ; G 1626 -U 8103 ; WX 602 ; N uni1FA7 ; G 1627 -U 8104 ; WX 602 ; N uni1FA8 ; G 1628 -U 8105 ; WX 602 ; N uni1FA9 ; G 1629 -U 8106 ; WX 602 ; N uni1FAA ; G 1630 -U 8107 ; WX 602 ; N uni1FAB ; G 1631 -U 8108 ; WX 602 ; N uni1FAC ; G 1632 -U 8109 ; WX 602 ; N uni1FAD ; G 1633 -U 8110 ; WX 602 ; N uni1FAE ; G 1634 -U 8111 ; WX 602 ; N uni1FAF ; G 1635 -U 8112 ; WX 602 ; N uni1FB0 ; G 1636 -U 8113 ; WX 602 ; N uni1FB1 ; G 1637 -U 8114 ; WX 602 ; N uni1FB2 ; G 1638 -U 8115 ; WX 602 ; N uni1FB3 ; G 1639 -U 8116 ; WX 602 ; N uni1FB4 ; G 1640 -U 8118 ; WX 602 ; N uni1FB6 ; G 1641 -U 8119 ; WX 602 ; N uni1FB7 ; G 1642 -U 8120 ; WX 602 ; N uni1FB8 ; G 1643 -U 8121 ; WX 602 ; N uni1FB9 ; G 1644 -U 8122 ; WX 602 ; N uni1FBA ; G 1645 -U 8123 ; WX 602 ; N uni1FBB ; G 1646 -U 8124 ; WX 602 ; N uni1FBC ; G 1647 -U 8125 ; WX 602 ; N uni1FBD ; G 1648 -U 8126 ; WX 602 ; N uni1FBE ; G 1649 -U 8127 ; WX 602 ; N uni1FBF ; G 1650 -U 8128 ; WX 602 ; N uni1FC0 ; G 1651 -U 8129 ; WX 602 ; N uni1FC1 ; G 1652 -U 8130 ; WX 602 ; N uni1FC2 ; G 1653 -U 8131 ; WX 602 ; N uni1FC3 ; G 1654 -U 8132 ; WX 602 ; N uni1FC4 ; G 1655 -U 8134 ; WX 602 ; N uni1FC6 ; G 1656 -U 8135 ; WX 602 ; N uni1FC7 ; G 1657 -U 8136 ; WX 602 ; N uni1FC8 ; G 1658 -U 8137 ; WX 602 ; N uni1FC9 ; G 1659 -U 8138 ; WX 602 ; N uni1FCA ; G 1660 -U 8139 ; WX 602 ; N uni1FCB ; G 1661 -U 8140 ; WX 602 ; N uni1FCC ; G 1662 -U 8141 ; WX 602 ; N uni1FCD ; G 1663 -U 8142 ; WX 602 ; N uni1FCE ; G 1664 -U 8143 ; WX 602 ; N uni1FCF ; G 1665 -U 8144 ; WX 602 ; N uni1FD0 ; G 1666 -U 8145 ; WX 602 ; N uni1FD1 ; G 1667 -U 8146 ; WX 602 ; N uni1FD2 ; G 1668 -U 8147 ; WX 602 ; N uni1FD3 ; G 1669 -U 8150 ; WX 602 ; N uni1FD6 ; G 1670 -U 8151 ; WX 602 ; N uni1FD7 ; G 1671 -U 8152 ; WX 602 ; N uni1FD8 ; G 1672 -U 8153 ; WX 602 ; N uni1FD9 ; G 1673 -U 8154 ; WX 602 ; N uni1FDA ; G 1674 -U 8155 ; WX 602 ; N uni1FDB ; G 1675 -U 8157 ; WX 602 ; N uni1FDD ; G 1676 -U 8158 ; WX 602 ; N uni1FDE ; G 1677 -U 8159 ; WX 602 ; N uni1FDF ; G 1678 -U 8160 ; WX 602 ; N uni1FE0 ; G 1679 -U 8161 ; WX 602 ; N uni1FE1 ; G 1680 -U 8162 ; WX 602 ; N uni1FE2 ; G 1681 -U 8163 ; WX 602 ; N uni1FE3 ; G 1682 -U 8164 ; WX 602 ; N uni1FE4 ; G 1683 -U 8165 ; WX 602 ; N uni1FE5 ; G 1684 -U 8166 ; WX 602 ; N uni1FE6 ; G 1685 -U 8167 ; WX 602 ; N uni1FE7 ; G 1686 -U 8168 ; WX 602 ; N uni1FE8 ; G 1687 -U 8169 ; WX 602 ; N uni1FE9 ; G 1688 -U 8170 ; WX 602 ; N uni1FEA ; G 1689 -U 8171 ; WX 602 ; N uni1FEB ; G 1690 -U 8172 ; WX 602 ; N uni1FEC ; G 1691 -U 8173 ; WX 602 ; N uni1FED ; G 1692 -U 8174 ; WX 602 ; N uni1FEE ; G 1693 -U 8175 ; WX 602 ; N uni1FEF ; G 1694 -U 8178 ; WX 602 ; N uni1FF2 ; G 1695 -U 8179 ; WX 602 ; N uni1FF3 ; G 1696 -U 8180 ; WX 602 ; N uni1FF4 ; G 1697 -U 8182 ; WX 602 ; N uni1FF6 ; G 1698 -U 8183 ; WX 602 ; N uni1FF7 ; G 1699 -U 8184 ; WX 602 ; N uni1FF8 ; G 1700 -U 8185 ; WX 602 ; N uni1FF9 ; G 1701 -U 8186 ; WX 602 ; N uni1FFA ; G 1702 -U 8187 ; WX 602 ; N uni1FFB ; G 1703 -U 8188 ; WX 602 ; N uni1FFC ; G 1704 -U 8189 ; WX 602 ; N uni1FFD ; G 1705 -U 8190 ; WX 602 ; N uni1FFE ; G 1706 -U 8192 ; WX 602 ; N uni2000 ; G 1707 -U 8193 ; WX 602 ; N uni2001 ; G 1708 -U 8194 ; WX 602 ; N uni2002 ; G 1709 -U 8195 ; WX 602 ; N uni2003 ; G 1710 -U 8196 ; WX 602 ; N uni2004 ; G 1711 -U 8197 ; WX 602 ; N uni2005 ; G 1712 -U 8198 ; WX 602 ; N uni2006 ; G 1713 -U 8199 ; WX 602 ; N uni2007 ; G 1714 -U 8200 ; WX 602 ; N uni2008 ; G 1715 -U 8201 ; WX 602 ; N uni2009 ; G 1716 -U 8202 ; WX 602 ; N uni200A ; G 1717 -U 8208 ; WX 602 ; N uni2010 ; G 1718 -U 8209 ; WX 602 ; N uni2011 ; G 1719 -U 8210 ; WX 602 ; N figuredash ; G 1720 -U 8211 ; WX 602 ; N endash ; G 1721 -U 8212 ; WX 602 ; N emdash ; G 1722 -U 8213 ; WX 602 ; N uni2015 ; G 1723 -U 8214 ; WX 602 ; N uni2016 ; G 1724 -U 8215 ; WX 602 ; N underscoredbl ; G 1725 -U 8216 ; WX 602 ; N quoteleft ; G 1726 -U 8217 ; WX 602 ; N quoteright ; G 1727 -U 8218 ; WX 602 ; N quotesinglbase ; G 1728 -U 8219 ; WX 602 ; N quotereversed ; G 1729 -U 8220 ; WX 602 ; N quotedblleft ; G 1730 -U 8221 ; WX 602 ; N quotedblright ; G 1731 -U 8222 ; WX 602 ; N quotedblbase ; G 1732 -U 8223 ; WX 602 ; N uni201F ; G 1733 -U 8224 ; WX 602 ; N dagger ; G 1734 -U 8225 ; WX 602 ; N daggerdbl ; G 1735 -U 8226 ; WX 602 ; N bullet ; G 1736 -U 8227 ; WX 602 ; N uni2023 ; G 1737 -U 8230 ; WX 602 ; N ellipsis ; G 1738 -U 8239 ; WX 602 ; N uni202F ; G 1739 -U 8240 ; WX 602 ; N perthousand ; G 1740 -U 8241 ; WX 602 ; N uni2031 ; G 1741 -U 8242 ; WX 602 ; N minute ; G 1742 -U 8243 ; WX 602 ; N second ; G 1743 -U 8244 ; WX 602 ; N uni2034 ; G 1744 -U 8245 ; WX 602 ; N uni2035 ; G 1745 -U 8246 ; WX 602 ; N uni2036 ; G 1746 -U 8247 ; WX 602 ; N uni2037 ; G 1747 -U 8249 ; WX 602 ; N guilsinglleft ; G 1748 -U 8250 ; WX 602 ; N guilsinglright ; G 1749 -U 8252 ; WX 602 ; N exclamdbl ; G 1750 -U 8253 ; WX 602 ; N uni203D ; G 1751 -U 8254 ; WX 602 ; N uni203E ; G 1752 -U 8255 ; WX 602 ; N uni203F ; G 1753 -U 8261 ; WX 602 ; N uni2045 ; G 1754 -U 8262 ; WX 602 ; N uni2046 ; G 1755 -U 8263 ; WX 602 ; N uni2047 ; G 1756 -U 8264 ; WX 602 ; N uni2048 ; G 1757 -U 8265 ; WX 602 ; N uni2049 ; G 1758 -U 8267 ; WX 602 ; N uni204B ; G 1759 -U 8287 ; WX 602 ; N uni205F ; G 1760 -U 8304 ; WX 602 ; N uni2070 ; G 1761 -U 8305 ; WX 602 ; N uni2071 ; G 1762 -U 8308 ; WX 602 ; N uni2074 ; G 1763 -U 8309 ; WX 602 ; N uni2075 ; G 1764 -U 8310 ; WX 602 ; N uni2076 ; G 1765 -U 8311 ; WX 602 ; N uni2077 ; G 1766 -U 8312 ; WX 602 ; N uni2078 ; G 1767 -U 8313 ; WX 602 ; N uni2079 ; G 1768 -U 8314 ; WX 602 ; N uni207A ; G 1769 -U 8315 ; WX 602 ; N uni207B ; G 1770 -U 8316 ; WX 602 ; N uni207C ; G 1771 -U 8317 ; WX 602 ; N uni207D ; G 1772 -U 8318 ; WX 602 ; N uni207E ; G 1773 -U 8319 ; WX 602 ; N uni207F ; G 1774 -U 8320 ; WX 602 ; N uni2080 ; G 1775 -U 8321 ; WX 602 ; N uni2081 ; G 1776 -U 8322 ; WX 602 ; N uni2082 ; G 1777 -U 8323 ; WX 602 ; N uni2083 ; G 1778 -U 8324 ; WX 602 ; N uni2084 ; G 1779 -U 8325 ; WX 602 ; N uni2085 ; G 1780 -U 8326 ; WX 602 ; N uni2086 ; G 1781 -U 8327 ; WX 602 ; N uni2087 ; G 1782 -U 8328 ; WX 602 ; N uni2088 ; G 1783 -U 8329 ; WX 602 ; N uni2089 ; G 1784 -U 8330 ; WX 602 ; N uni208A ; G 1785 -U 8331 ; WX 602 ; N uni208B ; G 1786 -U 8332 ; WX 602 ; N uni208C ; G 1787 -U 8333 ; WX 602 ; N uni208D ; G 1788 -U 8334 ; WX 602 ; N uni208E ; G 1789 -U 8336 ; WX 602 ; N uni2090 ; G 1790 -U 8337 ; WX 602 ; N uni2091 ; G 1791 -U 8338 ; WX 602 ; N uni2092 ; G 1792 -U 8339 ; WX 602 ; N uni2093 ; G 1793 -U 8340 ; WX 602 ; N uni2094 ; G 1794 -U 8341 ; WX 602 ; N uni2095 ; G 1795 -U 8342 ; WX 602 ; N uni2096 ; G 1796 -U 8343 ; WX 602 ; N uni2097 ; G 1797 -U 8344 ; WX 602 ; N uni2098 ; G 1798 -U 8345 ; WX 602 ; N uni2099 ; G 1799 -U 8346 ; WX 602 ; N uni209A ; G 1800 -U 8347 ; WX 602 ; N uni209B ; G 1801 -U 8348 ; WX 602 ; N uni209C ; G 1802 -U 8352 ; WX 602 ; N uni20A0 ; G 1803 -U 8353 ; WX 602 ; N colonmonetary ; G 1804 -U 8354 ; WX 602 ; N uni20A2 ; G 1805 -U 8355 ; WX 602 ; N franc ; G 1806 -U 8356 ; WX 602 ; N lira ; G 1807 -U 8357 ; WX 602 ; N uni20A5 ; G 1808 -U 8358 ; WX 602 ; N uni20A6 ; G 1809 -U 8359 ; WX 602 ; N peseta ; G 1810 -U 8360 ; WX 602 ; N uni20A8 ; G 1811 -U 8361 ; WX 602 ; N uni20A9 ; G 1812 -U 8362 ; WX 602 ; N uni20AA ; G 1813 -U 8363 ; WX 602 ; N dong ; G 1814 -U 8364 ; WX 602 ; N Euro ; G 1815 -U 8365 ; WX 602 ; N uni20AD ; G 1816 -U 8366 ; WX 602 ; N uni20AE ; G 1817 -U 8367 ; WX 602 ; N uni20AF ; G 1818 -U 8368 ; WX 602 ; N uni20B0 ; G 1819 -U 8369 ; WX 602 ; N uni20B1 ; G 1820 -U 8370 ; WX 602 ; N uni20B2 ; G 1821 -U 8371 ; WX 602 ; N uni20B3 ; G 1822 -U 8372 ; WX 602 ; N uni20B4 ; G 1823 -U 8373 ; WX 602 ; N uni20B5 ; G 1824 -U 8376 ; WX 602 ; N uni20B8 ; G 1825 -U 8377 ; WX 602 ; N uni20B9 ; G 1826 -U 8378 ; WX 602 ; N uni20BA ; G 1827 -U 8381 ; WX 602 ; N uni20BD ; G 1828 -U 8450 ; WX 602 ; N uni2102 ; G 1829 -U 8453 ; WX 602 ; N uni2105 ; G 1830 -U 8461 ; WX 602 ; N uni210D ; G 1831 -U 8462 ; WX 602 ; N uni210E ; G 1832 -U 8463 ; WX 602 ; N uni210F ; G 1833 -U 8469 ; WX 602 ; N uni2115 ; G 1834 -U 8470 ; WX 602 ; N uni2116 ; G 1835 -U 8471 ; WX 602 ; N uni2117 ; G 1836 -U 8473 ; WX 602 ; N uni2119 ; G 1837 -U 8474 ; WX 602 ; N uni211A ; G 1838 -U 8477 ; WX 602 ; N uni211D ; G 1839 -U 8482 ; WX 602 ; N trademark ; G 1840 -U 8484 ; WX 602 ; N uni2124 ; G 1841 -U 8486 ; WX 602 ; N uni2126 ; G 1842 -U 8490 ; WX 602 ; N uni212A ; G 1843 -U 8491 ; WX 602 ; N uni212B ; G 1844 -U 8494 ; WX 602 ; N estimated ; G 1845 -U 8520 ; WX 602 ; N uni2148 ; G 1846 -U 8528 ; WX 602 ; N uni2150 ; G 1847 -U 8529 ; WX 602 ; N uni2151 ; G 1848 -U 8531 ; WX 602 ; N onethird ; G 1849 -U 8532 ; WX 602 ; N twothirds ; G 1850 -U 8533 ; WX 602 ; N uni2155 ; G 1851 -U 8534 ; WX 602 ; N uni2156 ; G 1852 -U 8535 ; WX 602 ; N uni2157 ; G 1853 -U 8536 ; WX 602 ; N uni2158 ; G 1854 -U 8537 ; WX 602 ; N uni2159 ; G 1855 -U 8538 ; WX 602 ; N uni215A ; G 1856 -U 8539 ; WX 602 ; N oneeighth ; G 1857 -U 8540 ; WX 602 ; N threeeighths ; G 1858 -U 8541 ; WX 602 ; N fiveeighths ; G 1859 -U 8542 ; WX 602 ; N seveneighths ; G 1860 -U 8543 ; WX 602 ; N uni215F ; G 1861 -U 8585 ; WX 602 ; N uni2189 ; G 1862 -U 8592 ; WX 602 ; N arrowleft ; G 1863 -U 8593 ; WX 602 ; N arrowup ; G 1864 -U 8594 ; WX 602 ; N arrowright ; G 1865 -U 8595 ; WX 602 ; N arrowdown ; G 1866 -U 8596 ; WX 602 ; N arrowboth ; G 1867 -U 8597 ; WX 602 ; N arrowupdn ; G 1868 -U 8598 ; WX 602 ; N uni2196 ; G 1869 -U 8599 ; WX 602 ; N uni2197 ; G 1870 -U 8600 ; WX 602 ; N uni2198 ; G 1871 -U 8601 ; WX 602 ; N uni2199 ; G 1872 -U 8602 ; WX 602 ; N uni219A ; G 1873 -U 8603 ; WX 602 ; N uni219B ; G 1874 -U 8604 ; WX 602 ; N uni219C ; G 1875 -U 8605 ; WX 602 ; N uni219D ; G 1876 -U 8606 ; WX 602 ; N uni219E ; G 1877 -U 8607 ; WX 602 ; N uni219F ; G 1878 -U 8608 ; WX 602 ; N uni21A0 ; G 1879 -U 8609 ; WX 602 ; N uni21A1 ; G 1880 -U 8610 ; WX 602 ; N uni21A2 ; G 1881 -U 8611 ; WX 602 ; N uni21A3 ; G 1882 -U 8612 ; WX 602 ; N uni21A4 ; G 1883 -U 8613 ; WX 602 ; N uni21A5 ; G 1884 -U 8614 ; WX 602 ; N uni21A6 ; G 1885 -U 8615 ; WX 602 ; N uni21A7 ; G 1886 -U 8616 ; WX 602 ; N arrowupdnbse ; G 1887 -U 8617 ; WX 602 ; N uni21A9 ; G 1888 -U 8618 ; WX 602 ; N uni21AA ; G 1889 -U 8619 ; WX 602 ; N uni21AB ; G 1890 -U 8620 ; WX 602 ; N uni21AC ; G 1891 -U 8621 ; WX 602 ; N uni21AD ; G 1892 -U 8622 ; WX 602 ; N uni21AE ; G 1893 -U 8623 ; WX 602 ; N uni21AF ; G 1894 -U 8624 ; WX 602 ; N uni21B0 ; G 1895 -U 8625 ; WX 602 ; N uni21B1 ; G 1896 -U 8626 ; WX 602 ; N uni21B2 ; G 1897 -U 8627 ; WX 602 ; N uni21B3 ; G 1898 -U 8628 ; WX 602 ; N uni21B4 ; G 1899 -U 8629 ; WX 602 ; N carriagereturn ; G 1900 -U 8630 ; WX 602 ; N uni21B6 ; G 1901 -U 8631 ; WX 602 ; N uni21B7 ; G 1902 -U 8632 ; WX 602 ; N uni21B8 ; G 1903 -U 8633 ; WX 602 ; N uni21B9 ; G 1904 -U 8634 ; WX 602 ; N uni21BA ; G 1905 -U 8635 ; WX 602 ; N uni21BB ; G 1906 -U 8636 ; WX 602 ; N uni21BC ; G 1907 -U 8637 ; WX 602 ; N uni21BD ; G 1908 -U 8638 ; WX 602 ; N uni21BE ; G 1909 -U 8639 ; WX 602 ; N uni21BF ; G 1910 -U 8640 ; WX 602 ; N uni21C0 ; G 1911 -U 8641 ; WX 602 ; N uni21C1 ; G 1912 -U 8642 ; WX 602 ; N uni21C2 ; G 1913 -U 8643 ; WX 602 ; N uni21C3 ; G 1914 -U 8644 ; WX 602 ; N uni21C4 ; G 1915 -U 8645 ; WX 602 ; N uni21C5 ; G 1916 -U 8646 ; WX 602 ; N uni21C6 ; G 1917 -U 8647 ; WX 602 ; N uni21C7 ; G 1918 -U 8648 ; WX 602 ; N uni21C8 ; G 1919 -U 8649 ; WX 602 ; N uni21C9 ; G 1920 -U 8650 ; WX 602 ; N uni21CA ; G 1921 -U 8651 ; WX 602 ; N uni21CB ; G 1922 -U 8652 ; WX 602 ; N uni21CC ; G 1923 -U 8653 ; WX 602 ; N uni21CD ; G 1924 -U 8654 ; WX 602 ; N uni21CE ; G 1925 -U 8655 ; WX 602 ; N uni21CF ; G 1926 -U 8656 ; WX 602 ; N arrowdblleft ; G 1927 -U 8657 ; WX 602 ; N arrowdblup ; G 1928 -U 8658 ; WX 602 ; N arrowdblright ; G 1929 -U 8659 ; WX 602 ; N arrowdbldown ; G 1930 -U 8660 ; WX 602 ; N arrowdblboth ; G 1931 -U 8661 ; WX 602 ; N uni21D5 ; G 1932 -U 8662 ; WX 602 ; N uni21D6 ; G 1933 -U 8663 ; WX 602 ; N uni21D7 ; G 1934 -U 8664 ; WX 602 ; N uni21D8 ; G 1935 -U 8665 ; WX 602 ; N uni21D9 ; G 1936 -U 8666 ; WX 602 ; N uni21DA ; G 1937 -U 8667 ; WX 602 ; N uni21DB ; G 1938 -U 8668 ; WX 602 ; N uni21DC ; G 1939 -U 8669 ; WX 602 ; N uni21DD ; G 1940 -U 8670 ; WX 602 ; N uni21DE ; G 1941 -U 8671 ; WX 602 ; N uni21DF ; G 1942 -U 8672 ; WX 602 ; N uni21E0 ; G 1943 -U 8673 ; WX 602 ; N uni21E1 ; G 1944 -U 8674 ; WX 602 ; N uni21E2 ; G 1945 -U 8675 ; WX 602 ; N uni21E3 ; G 1946 -U 8676 ; WX 602 ; N uni21E4 ; G 1947 -U 8677 ; WX 602 ; N uni21E5 ; G 1948 -U 8678 ; WX 602 ; N uni21E6 ; G 1949 -U 8679 ; WX 602 ; N uni21E7 ; G 1950 -U 8680 ; WX 602 ; N uni21E8 ; G 1951 -U 8681 ; WX 602 ; N uni21E9 ; G 1952 -U 8682 ; WX 602 ; N uni21EA ; G 1953 -U 8683 ; WX 602 ; N uni21EB ; G 1954 -U 8684 ; WX 602 ; N uni21EC ; G 1955 -U 8685 ; WX 602 ; N uni21ED ; G 1956 -U 8686 ; WX 602 ; N uni21EE ; G 1957 -U 8687 ; WX 602 ; N uni21EF ; G 1958 -U 8688 ; WX 602 ; N uni21F0 ; G 1959 -U 8689 ; WX 602 ; N uni21F1 ; G 1960 -U 8690 ; WX 602 ; N uni21F2 ; G 1961 -U 8691 ; WX 602 ; N uni21F3 ; G 1962 -U 8692 ; WX 602 ; N uni21F4 ; G 1963 -U 8693 ; WX 602 ; N uni21F5 ; G 1964 -U 8694 ; WX 602 ; N uni21F6 ; G 1965 -U 8695 ; WX 602 ; N uni21F7 ; G 1966 -U 8696 ; WX 602 ; N uni21F8 ; G 1967 -U 8697 ; WX 602 ; N uni21F9 ; G 1968 -U 8698 ; WX 602 ; N uni21FA ; G 1969 -U 8699 ; WX 602 ; N uni21FB ; G 1970 -U 8700 ; WX 602 ; N uni21FC ; G 1971 -U 8701 ; WX 602 ; N uni21FD ; G 1972 -U 8702 ; WX 602 ; N uni21FE ; G 1973 -U 8703 ; WX 602 ; N uni21FF ; G 1974 -U 8704 ; WX 602 ; N universal ; G 1975 -U 8705 ; WX 602 ; N uni2201 ; G 1976 -U 8706 ; WX 602 ; N partialdiff ; G 1977 -U 8707 ; WX 602 ; N existential ; G 1978 -U 8708 ; WX 602 ; N uni2204 ; G 1979 -U 8709 ; WX 602 ; N emptyset ; G 1980 -U 8710 ; WX 602 ; N increment ; G 1981 -U 8711 ; WX 602 ; N gradient ; G 1982 -U 8712 ; WX 602 ; N element ; G 1983 -U 8713 ; WX 602 ; N notelement ; G 1984 -U 8714 ; WX 602 ; N uni220A ; G 1985 -U 8715 ; WX 602 ; N suchthat ; G 1986 -U 8716 ; WX 602 ; N uni220C ; G 1987 -U 8717 ; WX 602 ; N uni220D ; G 1988 -U 8718 ; WX 602 ; N uni220E ; G 1989 -U 8719 ; WX 602 ; N product ; G 1990 -U 8720 ; WX 602 ; N uni2210 ; G 1991 -U 8721 ; WX 602 ; N summation ; G 1992 -U 8722 ; WX 602 ; N minus ; G 1993 -U 8723 ; WX 602 ; N uni2213 ; G 1994 -U 8725 ; WX 602 ; N uni2215 ; G 1995 -U 8727 ; WX 602 ; N asteriskmath ; G 1996 -U 8728 ; WX 602 ; N uni2218 ; G 1997 -U 8729 ; WX 602 ; N uni2219 ; G 1998 -U 8730 ; WX 602 ; N radical ; G 1999 -U 8731 ; WX 602 ; N uni221B ; G 2000 -U 8732 ; WX 602 ; N uni221C ; G 2001 -U 8733 ; WX 602 ; N proportional ; G 2002 -U 8734 ; WX 602 ; N infinity ; G 2003 -U 8735 ; WX 602 ; N orthogonal ; G 2004 -U 8736 ; WX 602 ; N angle ; G 2005 -U 8739 ; WX 602 ; N uni2223 ; G 2006 -U 8743 ; WX 602 ; N logicaland ; G 2007 -U 8744 ; WX 602 ; N logicalor ; G 2008 -U 8745 ; WX 602 ; N intersection ; G 2009 -U 8746 ; WX 602 ; N union ; G 2010 -U 8747 ; WX 602 ; N integral ; G 2011 -U 8748 ; WX 602 ; N uni222C ; G 2012 -U 8749 ; WX 602 ; N uni222D ; G 2013 -U 8756 ; WX 602 ; N therefore ; G 2014 -U 8757 ; WX 602 ; N uni2235 ; G 2015 -U 8758 ; WX 602 ; N uni2236 ; G 2016 -U 8759 ; WX 602 ; N uni2237 ; G 2017 -U 8760 ; WX 602 ; N uni2238 ; G 2018 -U 8761 ; WX 602 ; N uni2239 ; G 2019 -U 8762 ; WX 602 ; N uni223A ; G 2020 -U 8763 ; WX 602 ; N uni223B ; G 2021 -U 8764 ; WX 602 ; N similar ; G 2022 -U 8765 ; WX 602 ; N uni223D ; G 2023 -U 8769 ; WX 602 ; N uni2241 ; G 2024 -U 8770 ; WX 602 ; N uni2242 ; G 2025 -U 8771 ; WX 602 ; N uni2243 ; G 2026 -U 8772 ; WX 602 ; N uni2244 ; G 2027 -U 8773 ; WX 602 ; N congruent ; G 2028 -U 8774 ; WX 602 ; N uni2246 ; G 2029 -U 8775 ; WX 602 ; N uni2247 ; G 2030 -U 8776 ; WX 602 ; N approxequal ; G 2031 -U 8777 ; WX 602 ; N uni2249 ; G 2032 -U 8778 ; WX 602 ; N uni224A ; G 2033 -U 8779 ; WX 602 ; N uni224B ; G 2034 -U 8780 ; WX 602 ; N uni224C ; G 2035 -U 8781 ; WX 602 ; N uni224D ; G 2036 -U 8782 ; WX 602 ; N uni224E ; G 2037 -U 8783 ; WX 602 ; N uni224F ; G 2038 -U 8784 ; WX 602 ; N uni2250 ; G 2039 -U 8785 ; WX 602 ; N uni2251 ; G 2040 -U 8786 ; WX 602 ; N uni2252 ; G 2041 -U 8787 ; WX 602 ; N uni2253 ; G 2042 -U 8788 ; WX 602 ; N uni2254 ; G 2043 -U 8789 ; WX 602 ; N uni2255 ; G 2044 -U 8790 ; WX 602 ; N uni2256 ; G 2045 -U 8791 ; WX 602 ; N uni2257 ; G 2046 -U 8792 ; WX 602 ; N uni2258 ; G 2047 -U 8793 ; WX 602 ; N uni2259 ; G 2048 -U 8794 ; WX 602 ; N uni225A ; G 2049 -U 8795 ; WX 602 ; N uni225B ; G 2050 -U 8796 ; WX 602 ; N uni225C ; G 2051 -U 8797 ; WX 602 ; N uni225D ; G 2052 -U 8798 ; WX 602 ; N uni225E ; G 2053 -U 8799 ; WX 602 ; N uni225F ; G 2054 -U 8800 ; WX 602 ; N notequal ; G 2055 -U 8801 ; WX 602 ; N equivalence ; G 2056 -U 8802 ; WX 602 ; N uni2262 ; G 2057 -U 8803 ; WX 602 ; N uni2263 ; G 2058 -U 8804 ; WX 602 ; N lessequal ; G 2059 -U 8805 ; WX 602 ; N greaterequal ; G 2060 -U 8806 ; WX 602 ; N uni2266 ; G 2061 -U 8807 ; WX 602 ; N uni2267 ; G 2062 -U 8808 ; WX 602 ; N uni2268 ; G 2063 -U 8809 ; WX 602 ; N uni2269 ; G 2064 -U 8813 ; WX 602 ; N uni226D ; G 2065 -U 8814 ; WX 602 ; N uni226E ; G 2066 -U 8815 ; WX 602 ; N uni226F ; G 2067 -U 8816 ; WX 602 ; N uni2270 ; G 2068 -U 8817 ; WX 602 ; N uni2271 ; G 2069 -U 8818 ; WX 602 ; N uni2272 ; G 2070 -U 8819 ; WX 602 ; N uni2273 ; G 2071 -U 8820 ; WX 602 ; N uni2274 ; G 2072 -U 8821 ; WX 602 ; N uni2275 ; G 2073 -U 8822 ; WX 602 ; N uni2276 ; G 2074 -U 8823 ; WX 602 ; N uni2277 ; G 2075 -U 8824 ; WX 602 ; N uni2278 ; G 2076 -U 8825 ; WX 602 ; N uni2279 ; G 2077 -U 8826 ; WX 602 ; N uni227A ; G 2078 -U 8827 ; WX 602 ; N uni227B ; G 2079 -U 8828 ; WX 602 ; N uni227C ; G 2080 -U 8829 ; WX 602 ; N uni227D ; G 2081 -U 8830 ; WX 602 ; N uni227E ; G 2082 -U 8831 ; WX 602 ; N uni227F ; G 2083 -U 8832 ; WX 602 ; N uni2280 ; G 2084 -U 8833 ; WX 602 ; N uni2281 ; G 2085 -U 8834 ; WX 602 ; N propersubset ; G 2086 -U 8835 ; WX 602 ; N propersuperset ; G 2087 -U 8836 ; WX 602 ; N notsubset ; G 2088 -U 8837 ; WX 602 ; N uni2285 ; G 2089 -U 8838 ; WX 602 ; N reflexsubset ; G 2090 -U 8839 ; WX 602 ; N reflexsuperset ; G 2091 -U 8840 ; WX 602 ; N uni2288 ; G 2092 -U 8841 ; WX 602 ; N uni2289 ; G 2093 -U 8842 ; WX 602 ; N uni228A ; G 2094 -U 8843 ; WX 602 ; N uni228B ; G 2095 -U 8845 ; WX 602 ; N uni228D ; G 2096 -U 8846 ; WX 602 ; N uni228E ; G 2097 -U 8847 ; WX 602 ; N uni228F ; G 2098 -U 8848 ; WX 602 ; N uni2290 ; G 2099 -U 8849 ; WX 602 ; N uni2291 ; G 2100 -U 8850 ; WX 602 ; N uni2292 ; G 2101 -U 8851 ; WX 602 ; N uni2293 ; G 2102 -U 8852 ; WX 602 ; N uni2294 ; G 2103 -U 8853 ; WX 602 ; N circleplus ; G 2104 -U 8854 ; WX 602 ; N uni2296 ; G 2105 -U 8855 ; WX 602 ; N circlemultiply ; G 2106 -U 8856 ; WX 602 ; N uni2298 ; G 2107 -U 8857 ; WX 602 ; N uni2299 ; G 2108 -U 8858 ; WX 602 ; N uni229A ; G 2109 -U 8859 ; WX 602 ; N uni229B ; G 2110 -U 8860 ; WX 602 ; N uni229C ; G 2111 -U 8861 ; WX 602 ; N uni229D ; G 2112 -U 8862 ; WX 602 ; N uni229E ; G 2113 -U 8863 ; WX 602 ; N uni229F ; G 2114 -U 8864 ; WX 602 ; N uni22A0 ; G 2115 -U 8865 ; WX 602 ; N uni22A1 ; G 2116 -U 8866 ; WX 602 ; N uni22A2 ; G 2117 -U 8867 ; WX 602 ; N uni22A3 ; G 2118 -U 8868 ; WX 602 ; N uni22A4 ; G 2119 -U 8869 ; WX 602 ; N perpendicular ; G 2120 -U 8882 ; WX 602 ; N uni22B2 ; G 2121 -U 8883 ; WX 602 ; N uni22B3 ; G 2122 -U 8884 ; WX 602 ; N uni22B4 ; G 2123 -U 8885 ; WX 602 ; N uni22B5 ; G 2124 -U 8888 ; WX 602 ; N uni22B8 ; G 2125 -U 8898 ; WX 602 ; N uni22C2 ; G 2126 -U 8899 ; WX 602 ; N uni22C3 ; G 2127 -U 8900 ; WX 602 ; N uni22C4 ; G 2128 -U 8901 ; WX 602 ; N dotmath ; G 2129 -U 8902 ; WX 602 ; N uni22C6 ; G 2130 -U 8909 ; WX 602 ; N uni22CD ; G 2131 -U 8910 ; WX 602 ; N uni22CE ; G 2132 -U 8911 ; WX 602 ; N uni22CF ; G 2133 -U 8912 ; WX 602 ; N uni22D0 ; G 2134 -U 8913 ; WX 602 ; N uni22D1 ; G 2135 -U 8922 ; WX 602 ; N uni22DA ; G 2136 -U 8923 ; WX 602 ; N uni22DB ; G 2137 -U 8924 ; WX 602 ; N uni22DC ; G 2138 -U 8925 ; WX 602 ; N uni22DD ; G 2139 -U 8926 ; WX 602 ; N uni22DE ; G 2140 -U 8927 ; WX 602 ; N uni22DF ; G 2141 -U 8928 ; WX 602 ; N uni22E0 ; G 2142 -U 8929 ; WX 602 ; N uni22E1 ; G 2143 -U 8930 ; WX 602 ; N uni22E2 ; G 2144 -U 8931 ; WX 602 ; N uni22E3 ; G 2145 -U 8932 ; WX 602 ; N uni22E4 ; G 2146 -U 8933 ; WX 602 ; N uni22E5 ; G 2147 -U 8934 ; WX 602 ; N uni22E6 ; G 2148 -U 8935 ; WX 602 ; N uni22E7 ; G 2149 -U 8936 ; WX 602 ; N uni22E8 ; G 2150 -U 8937 ; WX 602 ; N uni22E9 ; G 2151 -U 8943 ; WX 602 ; N uni22EF ; G 2152 -U 8960 ; WX 602 ; N uni2300 ; G 2153 -U 8961 ; WX 602 ; N uni2301 ; G 2154 -U 8962 ; WX 602 ; N house ; G 2155 -U 8963 ; WX 602 ; N uni2303 ; G 2156 -U 8964 ; WX 602 ; N uni2304 ; G 2157 -U 8965 ; WX 602 ; N uni2305 ; G 2158 -U 8966 ; WX 602 ; N uni2306 ; G 2159 -U 8968 ; WX 602 ; N uni2308 ; G 2160 -U 8969 ; WX 602 ; N uni2309 ; G 2161 -U 8970 ; WX 602 ; N uni230A ; G 2162 -U 8971 ; WX 602 ; N uni230B ; G 2163 -U 8972 ; WX 602 ; N uni230C ; G 2164 -U 8973 ; WX 602 ; N uni230D ; G 2165 -U 8974 ; WX 602 ; N uni230E ; G 2166 -U 8975 ; WX 602 ; N uni230F ; G 2167 -U 8976 ; WX 602 ; N revlogicalnot ; G 2168 -U 8977 ; WX 602 ; N uni2311 ; G 2169 -U 8978 ; WX 602 ; N uni2312 ; G 2170 -U 8979 ; WX 602 ; N uni2313 ; G 2171 -U 8980 ; WX 602 ; N uni2314 ; G 2172 -U 8981 ; WX 602 ; N uni2315 ; G 2173 -U 8984 ; WX 602 ; N uni2318 ; G 2174 -U 8985 ; WX 602 ; N uni2319 ; G 2175 -U 8988 ; WX 602 ; N uni231C ; G 2176 -U 8989 ; WX 602 ; N uni231D ; G 2177 -U 8990 ; WX 602 ; N uni231E ; G 2178 -U 8991 ; WX 602 ; N uni231F ; G 2179 -U 8992 ; WX 602 ; N integraltp ; G 2180 -U 8993 ; WX 602 ; N integralbt ; G 2181 -U 8997 ; WX 602 ; N uni2325 ; G 2182 -U 8998 ; WX 602 ; N uni2326 ; G 2183 -U 8999 ; WX 602 ; N uni2327 ; G 2184 -U 9000 ; WX 602 ; N uni2328 ; G 2185 -U 9003 ; WX 602 ; N uni232B ; G 2186 -U 9013 ; WX 602 ; N uni2335 ; G 2187 -U 9014 ; WX 602 ; N uni2336 ; G 2188 -U 9015 ; WX 602 ; N uni2337 ; G 2189 -U 9016 ; WX 602 ; N uni2338 ; G 2190 -U 9017 ; WX 602 ; N uni2339 ; G 2191 -U 9018 ; WX 602 ; N uni233A ; G 2192 -U 9019 ; WX 602 ; N uni233B ; G 2193 -U 9020 ; WX 602 ; N uni233C ; G 2194 -U 9021 ; WX 602 ; N uni233D ; G 2195 -U 9022 ; WX 602 ; N uni233E ; G 2196 -U 9023 ; WX 602 ; N uni233F ; G 2197 -U 9024 ; WX 602 ; N uni2340 ; G 2198 -U 9025 ; WX 602 ; N uni2341 ; G 2199 -U 9026 ; WX 602 ; N uni2342 ; G 2200 -U 9027 ; WX 602 ; N uni2343 ; G 2201 -U 9028 ; WX 602 ; N uni2344 ; G 2202 -U 9029 ; WX 602 ; N uni2345 ; G 2203 -U 9030 ; WX 602 ; N uni2346 ; G 2204 -U 9031 ; WX 602 ; N uni2347 ; G 2205 -U 9032 ; WX 602 ; N uni2348 ; G 2206 -U 9033 ; WX 602 ; N uni2349 ; G 2207 -U 9034 ; WX 602 ; N uni234A ; G 2208 -U 9035 ; WX 602 ; N uni234B ; G 2209 -U 9036 ; WX 602 ; N uni234C ; G 2210 -U 9037 ; WX 602 ; N uni234D ; G 2211 -U 9038 ; WX 602 ; N uni234E ; G 2212 -U 9039 ; WX 602 ; N uni234F ; G 2213 -U 9040 ; WX 602 ; N uni2350 ; G 2214 -U 9041 ; WX 602 ; N uni2351 ; G 2215 -U 9042 ; WX 602 ; N uni2352 ; G 2216 -U 9043 ; WX 602 ; N uni2353 ; G 2217 -U 9044 ; WX 602 ; N uni2354 ; G 2218 -U 9045 ; WX 602 ; N uni2355 ; G 2219 -U 9046 ; WX 602 ; N uni2356 ; G 2220 -U 9047 ; WX 602 ; N uni2357 ; G 2221 -U 9048 ; WX 602 ; N uni2358 ; G 2222 -U 9049 ; WX 602 ; N uni2359 ; G 2223 -U 9050 ; WX 602 ; N uni235A ; G 2224 -U 9051 ; WX 602 ; N uni235B ; G 2225 -U 9052 ; WX 602 ; N uni235C ; G 2226 -U 9053 ; WX 602 ; N uni235D ; G 2227 -U 9054 ; WX 602 ; N uni235E ; G 2228 -U 9055 ; WX 602 ; N uni235F ; G 2229 -U 9056 ; WX 602 ; N uni2360 ; G 2230 -U 9057 ; WX 602 ; N uni2361 ; G 2231 -U 9058 ; WX 602 ; N uni2362 ; G 2232 -U 9059 ; WX 602 ; N uni2363 ; G 2233 -U 9060 ; WX 602 ; N uni2364 ; G 2234 -U 9061 ; WX 602 ; N uni2365 ; G 2235 -U 9062 ; WX 602 ; N uni2366 ; G 2236 -U 9063 ; WX 602 ; N uni2367 ; G 2237 -U 9064 ; WX 602 ; N uni2368 ; G 2238 -U 9065 ; WX 602 ; N uni2369 ; G 2239 -U 9066 ; WX 602 ; N uni236A ; G 2240 -U 9067 ; WX 602 ; N uni236B ; G 2241 -U 9068 ; WX 602 ; N uni236C ; G 2242 -U 9069 ; WX 602 ; N uni236D ; G 2243 -U 9070 ; WX 602 ; N uni236E ; G 2244 -U 9071 ; WX 602 ; N uni236F ; G 2245 -U 9072 ; WX 602 ; N uni2370 ; G 2246 -U 9073 ; WX 602 ; N uni2371 ; G 2247 -U 9074 ; WX 602 ; N uni2372 ; G 2248 -U 9075 ; WX 602 ; N uni2373 ; G 2249 -U 9076 ; WX 602 ; N uni2374 ; G 2250 -U 9077 ; WX 602 ; N uni2375 ; G 2251 -U 9078 ; WX 602 ; N uni2376 ; G 2252 -U 9079 ; WX 602 ; N uni2377 ; G 2253 -U 9080 ; WX 602 ; N uni2378 ; G 2254 -U 9081 ; WX 602 ; N uni2379 ; G 2255 -U 9082 ; WX 602 ; N uni237A ; G 2256 -U 9085 ; WX 602 ; N uni237D ; G 2257 -U 9088 ; WX 602 ; N uni2380 ; G 2258 -U 9089 ; WX 602 ; N uni2381 ; G 2259 -U 9090 ; WX 602 ; N uni2382 ; G 2260 -U 9091 ; WX 602 ; N uni2383 ; G 2261 -U 9096 ; WX 602 ; N uni2388 ; G 2262 -U 9097 ; WX 602 ; N uni2389 ; G 2263 -U 9098 ; WX 602 ; N uni238A ; G 2264 -U 9099 ; WX 602 ; N uni238B ; G 2265 -U 9109 ; WX 602 ; N uni2395 ; G 2266 -U 9115 ; WX 602 ; N uni239B ; G 2267 -U 9116 ; WX 602 ; N uni239C ; G 2268 -U 9117 ; WX 602 ; N uni239D ; G 2269 -U 9118 ; WX 602 ; N uni239E ; G 2270 -U 9119 ; WX 602 ; N uni239F ; G 2271 -U 9120 ; WX 602 ; N uni23A0 ; G 2272 -U 9121 ; WX 602 ; N uni23A1 ; G 2273 -U 9122 ; WX 602 ; N uni23A2 ; G 2274 -U 9123 ; WX 602 ; N uni23A3 ; G 2275 -U 9124 ; WX 602 ; N uni23A4 ; G 2276 -U 9125 ; WX 602 ; N uni23A5 ; G 2277 -U 9126 ; WX 602 ; N uni23A6 ; G 2278 -U 9127 ; WX 602 ; N uni23A7 ; G 2279 -U 9128 ; WX 602 ; N uni23A8 ; G 2280 -U 9129 ; WX 602 ; N uni23A9 ; G 2281 -U 9130 ; WX 602 ; N uni23AA ; G 2282 -U 9131 ; WX 602 ; N uni23AB ; G 2283 -U 9132 ; WX 602 ; N uni23AC ; G 2284 -U 9133 ; WX 602 ; N uni23AD ; G 2285 -U 9134 ; WX 602 ; N uni23AE ; G 2286 -U 9166 ; WX 602 ; N uni23CE ; G 2287 -U 9167 ; WX 602 ; N uni23CF ; G 2288 -U 9251 ; WX 602 ; N uni2423 ; G 2289 -U 9472 ; WX 602 ; N SF100000 ; G 2290 -U 9473 ; WX 602 ; N uni2501 ; G 2291 -U 9474 ; WX 602 ; N SF110000 ; G 2292 -U 9475 ; WX 602 ; N uni2503 ; G 2293 -U 9476 ; WX 602 ; N uni2504 ; G 2294 -U 9477 ; WX 602 ; N uni2505 ; G 2295 -U 9478 ; WX 602 ; N uni2506 ; G 2296 -U 9479 ; WX 602 ; N uni2507 ; G 2297 -U 9480 ; WX 602 ; N uni2508 ; G 2298 -U 9481 ; WX 602 ; N uni2509 ; G 2299 -U 9482 ; WX 602 ; N uni250A ; G 2300 -U 9483 ; WX 602 ; N uni250B ; G 2301 -U 9484 ; WX 602 ; N SF010000 ; G 2302 -U 9485 ; WX 602 ; N uni250D ; G 2303 -U 9486 ; WX 602 ; N uni250E ; G 2304 -U 9487 ; WX 602 ; N uni250F ; G 2305 -U 9488 ; WX 602 ; N SF030000 ; G 2306 -U 9489 ; WX 602 ; N uni2511 ; G 2307 -U 9490 ; WX 602 ; N uni2512 ; G 2308 -U 9491 ; WX 602 ; N uni2513 ; G 2309 -U 9492 ; WX 602 ; N SF020000 ; G 2310 -U 9493 ; WX 602 ; N uni2515 ; G 2311 -U 9494 ; WX 602 ; N uni2516 ; G 2312 -U 9495 ; WX 602 ; N uni2517 ; G 2313 -U 9496 ; WX 602 ; N SF040000 ; G 2314 -U 9497 ; WX 602 ; N uni2519 ; G 2315 -U 9498 ; WX 602 ; N uni251A ; G 2316 -U 9499 ; WX 602 ; N uni251B ; G 2317 -U 9500 ; WX 602 ; N SF080000 ; G 2318 -U 9501 ; WX 602 ; N uni251D ; G 2319 -U 9502 ; WX 602 ; N uni251E ; G 2320 -U 9503 ; WX 602 ; N uni251F ; G 2321 -U 9504 ; WX 602 ; N uni2520 ; G 2322 -U 9505 ; WX 602 ; N uni2521 ; G 2323 -U 9506 ; WX 602 ; N uni2522 ; G 2324 -U 9507 ; WX 602 ; N uni2523 ; G 2325 -U 9508 ; WX 602 ; N SF090000 ; G 2326 -U 9509 ; WX 602 ; N uni2525 ; G 2327 -U 9510 ; WX 602 ; N uni2526 ; G 2328 -U 9511 ; WX 602 ; N uni2527 ; G 2329 -U 9512 ; WX 602 ; N uni2528 ; G 2330 -U 9513 ; WX 602 ; N uni2529 ; G 2331 -U 9514 ; WX 602 ; N uni252A ; G 2332 -U 9515 ; WX 602 ; N uni252B ; G 2333 -U 9516 ; WX 602 ; N SF060000 ; G 2334 -U 9517 ; WX 602 ; N uni252D ; G 2335 -U 9518 ; WX 602 ; N uni252E ; G 2336 -U 9519 ; WX 602 ; N uni252F ; G 2337 -U 9520 ; WX 602 ; N uni2530 ; G 2338 -U 9521 ; WX 602 ; N uni2531 ; G 2339 -U 9522 ; WX 602 ; N uni2532 ; G 2340 -U 9523 ; WX 602 ; N uni2533 ; G 2341 -U 9524 ; WX 602 ; N SF070000 ; G 2342 -U 9525 ; WX 602 ; N uni2535 ; G 2343 -U 9526 ; WX 602 ; N uni2536 ; G 2344 -U 9527 ; WX 602 ; N uni2537 ; G 2345 -U 9528 ; WX 602 ; N uni2538 ; G 2346 -U 9529 ; WX 602 ; N uni2539 ; G 2347 -U 9530 ; WX 602 ; N uni253A ; G 2348 -U 9531 ; WX 602 ; N uni253B ; G 2349 -U 9532 ; WX 602 ; N SF050000 ; G 2350 -U 9533 ; WX 602 ; N uni253D ; G 2351 -U 9534 ; WX 602 ; N uni253E ; G 2352 -U 9535 ; WX 602 ; N uni253F ; G 2353 -U 9536 ; WX 602 ; N uni2540 ; G 2354 -U 9537 ; WX 602 ; N uni2541 ; G 2355 -U 9538 ; WX 602 ; N uni2542 ; G 2356 -U 9539 ; WX 602 ; N uni2543 ; G 2357 -U 9540 ; WX 602 ; N uni2544 ; G 2358 -U 9541 ; WX 602 ; N uni2545 ; G 2359 -U 9542 ; WX 602 ; N uni2546 ; G 2360 -U 9543 ; WX 602 ; N uni2547 ; G 2361 -U 9544 ; WX 602 ; N uni2548 ; G 2362 -U 9545 ; WX 602 ; N uni2549 ; G 2363 -U 9546 ; WX 602 ; N uni254A ; G 2364 -U 9547 ; WX 602 ; N uni254B ; G 2365 -U 9548 ; WX 602 ; N uni254C ; G 2366 -U 9549 ; WX 602 ; N uni254D ; G 2367 -U 9550 ; WX 602 ; N uni254E ; G 2368 -U 9551 ; WX 602 ; N uni254F ; G 2369 -U 9552 ; WX 602 ; N SF430000 ; G 2370 -U 9553 ; WX 602 ; N SF240000 ; G 2371 -U 9554 ; WX 602 ; N SF510000 ; G 2372 -U 9555 ; WX 602 ; N SF520000 ; G 2373 -U 9556 ; WX 602 ; N SF390000 ; G 2374 -U 9557 ; WX 602 ; N SF220000 ; G 2375 -U 9558 ; WX 602 ; N SF210000 ; G 2376 -U 9559 ; WX 602 ; N SF250000 ; G 2377 -U 9560 ; WX 602 ; N SF500000 ; G 2378 -U 9561 ; WX 602 ; N SF490000 ; G 2379 -U 9562 ; WX 602 ; N SF380000 ; G 2380 -U 9563 ; WX 602 ; N SF280000 ; G 2381 -U 9564 ; WX 602 ; N SF270000 ; G 2382 -U 9565 ; WX 602 ; N SF260000 ; G 2383 -U 9566 ; WX 602 ; N SF360000 ; G 2384 -U 9567 ; WX 602 ; N SF370000 ; G 2385 -U 9568 ; WX 602 ; N SF420000 ; G 2386 -U 9569 ; WX 602 ; N SF190000 ; G 2387 -U 9570 ; WX 602 ; N SF200000 ; G 2388 -U 9571 ; WX 602 ; N SF230000 ; G 2389 -U 9572 ; WX 602 ; N SF470000 ; G 2390 -U 9573 ; WX 602 ; N SF480000 ; G 2391 -U 9574 ; WX 602 ; N SF410000 ; G 2392 -U 9575 ; WX 602 ; N SF450000 ; G 2393 -U 9576 ; WX 602 ; N SF460000 ; G 2394 -U 9577 ; WX 602 ; N SF400000 ; G 2395 -U 9578 ; WX 602 ; N SF540000 ; G 2396 -U 9579 ; WX 602 ; N SF530000 ; G 2397 -U 9580 ; WX 602 ; N SF440000 ; G 2398 -U 9581 ; WX 602 ; N uni256D ; G 2399 -U 9582 ; WX 602 ; N uni256E ; G 2400 -U 9583 ; WX 602 ; N uni256F ; G 2401 -U 9584 ; WX 602 ; N uni2570 ; G 2402 -U 9585 ; WX 602 ; N uni2571 ; G 2403 -U 9586 ; WX 602 ; N uni2572 ; G 2404 -U 9587 ; WX 602 ; N uni2573 ; G 2405 -U 9588 ; WX 602 ; N uni2574 ; G 2406 -U 9589 ; WX 602 ; N uni2575 ; G 2407 -U 9590 ; WX 602 ; N uni2576 ; G 2408 -U 9591 ; WX 602 ; N uni2577 ; G 2409 -U 9592 ; WX 602 ; N uni2578 ; G 2410 -U 9593 ; WX 602 ; N uni2579 ; G 2411 -U 9594 ; WX 602 ; N uni257A ; G 2412 -U 9595 ; WX 602 ; N uni257B ; G 2413 -U 9596 ; WX 602 ; N uni257C ; G 2414 -U 9597 ; WX 602 ; N uni257D ; G 2415 -U 9598 ; WX 602 ; N uni257E ; G 2416 -U 9599 ; WX 602 ; N uni257F ; G 2417 -U 9600 ; WX 602 ; N upblock ; G 2418 -U 9601 ; WX 602 ; N uni2581 ; G 2419 -U 9602 ; WX 602 ; N uni2582 ; G 2420 -U 9603 ; WX 602 ; N uni2583 ; G 2421 -U 9604 ; WX 602 ; N dnblock ; G 2422 -U 9605 ; WX 602 ; N uni2585 ; G 2423 -U 9606 ; WX 602 ; N uni2586 ; G 2424 -U 9607 ; WX 602 ; N uni2587 ; G 2425 -U 9608 ; WX 602 ; N block ; G 2426 -U 9609 ; WX 602 ; N uni2589 ; G 2427 -U 9610 ; WX 602 ; N uni258A ; G 2428 -U 9611 ; WX 602 ; N uni258B ; G 2429 -U 9612 ; WX 602 ; N lfblock ; G 2430 -U 9613 ; WX 602 ; N uni258D ; G 2431 -U 9614 ; WX 602 ; N uni258E ; G 2432 -U 9615 ; WX 602 ; N uni258F ; G 2433 -U 9616 ; WX 602 ; N rtblock ; G 2434 -U 9617 ; WX 602 ; N ltshade ; G 2435 -U 9618 ; WX 602 ; N shade ; G 2436 -U 9619 ; WX 602 ; N dkshade ; G 2437 -U 9620 ; WX 602 ; N uni2594 ; G 2438 -U 9621 ; WX 602 ; N uni2595 ; G 2439 -U 9622 ; WX 602 ; N uni2596 ; G 2440 -U 9623 ; WX 602 ; N uni2597 ; G 2441 -U 9624 ; WX 602 ; N uni2598 ; G 2442 -U 9625 ; WX 602 ; N uni2599 ; G 2443 -U 9626 ; WX 602 ; N uni259A ; G 2444 -U 9627 ; WX 602 ; N uni259B ; G 2445 -U 9628 ; WX 602 ; N uni259C ; G 2446 -U 9629 ; WX 602 ; N uni259D ; G 2447 -U 9630 ; WX 602 ; N uni259E ; G 2448 -U 9631 ; WX 602 ; N uni259F ; G 2449 -U 9632 ; WX 602 ; N filledbox ; G 2450 -U 9633 ; WX 602 ; N H22073 ; G 2451 -U 9634 ; WX 602 ; N uni25A2 ; G 2452 -U 9635 ; WX 602 ; N uni25A3 ; G 2453 -U 9636 ; WX 602 ; N uni25A4 ; G 2454 -U 9637 ; WX 602 ; N uni25A5 ; G 2455 -U 9638 ; WX 602 ; N uni25A6 ; G 2456 -U 9639 ; WX 602 ; N uni25A7 ; G 2457 -U 9640 ; WX 602 ; N uni25A8 ; G 2458 -U 9641 ; WX 602 ; N uni25A9 ; G 2459 -U 9642 ; WX 602 ; N H18543 ; G 2460 -U 9643 ; WX 602 ; N H18551 ; G 2461 -U 9644 ; WX 602 ; N filledrect ; G 2462 -U 9645 ; WX 602 ; N uni25AD ; G 2463 -U 9646 ; WX 602 ; N uni25AE ; G 2464 -U 9647 ; WX 602 ; N uni25AF ; G 2465 -U 9648 ; WX 602 ; N uni25B0 ; G 2466 -U 9649 ; WX 602 ; N uni25B1 ; G 2467 -U 9650 ; WX 602 ; N triagup ; G 2468 -U 9651 ; WX 602 ; N uni25B3 ; G 2469 -U 9652 ; WX 602 ; N uni25B4 ; G 2470 -U 9653 ; WX 602 ; N uni25B5 ; G 2471 -U 9654 ; WX 602 ; N uni25B6 ; G 2472 -U 9655 ; WX 602 ; N uni25B7 ; G 2473 -U 9656 ; WX 602 ; N uni25B8 ; G 2474 -U 9657 ; WX 602 ; N uni25B9 ; G 2475 -U 9658 ; WX 602 ; N triagrt ; G 2476 -U 9659 ; WX 602 ; N uni25BB ; G 2477 -U 9660 ; WX 602 ; N triagdn ; G 2478 -U 9661 ; WX 602 ; N uni25BD ; G 2479 -U 9662 ; WX 602 ; N uni25BE ; G 2480 -U 9663 ; WX 602 ; N uni25BF ; G 2481 -U 9664 ; WX 602 ; N uni25C0 ; G 2482 -U 9665 ; WX 602 ; N uni25C1 ; G 2483 -U 9666 ; WX 602 ; N uni25C2 ; G 2484 -U 9667 ; WX 602 ; N uni25C3 ; G 2485 -U 9668 ; WX 602 ; N triaglf ; G 2486 -U 9669 ; WX 602 ; N uni25C5 ; G 2487 -U 9670 ; WX 602 ; N uni25C6 ; G 2488 -U 9671 ; WX 602 ; N uni25C7 ; G 2489 -U 9672 ; WX 602 ; N uni25C8 ; G 2490 -U 9673 ; WX 602 ; N uni25C9 ; G 2491 -U 9674 ; WX 602 ; N lozenge ; G 2492 -U 9675 ; WX 602 ; N circle ; G 2493 -U 9676 ; WX 602 ; N uni25CC ; G 2494 -U 9677 ; WX 602 ; N uni25CD ; G 2495 -U 9678 ; WX 602 ; N uni25CE ; G 2496 -U 9679 ; WX 602 ; N H18533 ; G 2497 -U 9680 ; WX 602 ; N uni25D0 ; G 2498 -U 9681 ; WX 602 ; N uni25D1 ; G 2499 -U 9682 ; WX 602 ; N uni25D2 ; G 2500 -U 9683 ; WX 602 ; N uni25D3 ; G 2501 -U 9684 ; WX 602 ; N uni25D4 ; G 2502 -U 9685 ; WX 602 ; N uni25D5 ; G 2503 -U 9686 ; WX 602 ; N uni25D6 ; G 2504 -U 9687 ; WX 602 ; N uni25D7 ; G 2505 -U 9688 ; WX 602 ; N invbullet ; G 2506 -U 9689 ; WX 602 ; N invcircle ; G 2507 -U 9690 ; WX 602 ; N uni25DA ; G 2508 -U 9691 ; WX 602 ; N uni25DB ; G 2509 -U 9692 ; WX 602 ; N uni25DC ; G 2510 -U 9693 ; WX 602 ; N uni25DD ; G 2511 -U 9694 ; WX 602 ; N uni25DE ; G 2512 -U 9695 ; WX 602 ; N uni25DF ; G 2513 -U 9696 ; WX 602 ; N uni25E0 ; G 2514 -U 9697 ; WX 602 ; N uni25E1 ; G 2515 -U 9698 ; WX 602 ; N uni25E2 ; G 2516 -U 9699 ; WX 602 ; N uni25E3 ; G 2517 -U 9700 ; WX 602 ; N uni25E4 ; G 2518 -U 9701 ; WX 602 ; N uni25E5 ; G 2519 -U 9702 ; WX 602 ; N openbullet ; G 2520 -U 9703 ; WX 602 ; N uni25E7 ; G 2521 -U 9704 ; WX 602 ; N uni25E8 ; G 2522 -U 9705 ; WX 602 ; N uni25E9 ; G 2523 -U 9706 ; WX 602 ; N uni25EA ; G 2524 -U 9707 ; WX 602 ; N uni25EB ; G 2525 -U 9708 ; WX 602 ; N uni25EC ; G 2526 -U 9709 ; WX 602 ; N uni25ED ; G 2527 -U 9710 ; WX 602 ; N uni25EE ; G 2528 -U 9711 ; WX 602 ; N uni25EF ; G 2529 -U 9712 ; WX 602 ; N uni25F0 ; G 2530 -U 9713 ; WX 602 ; N uni25F1 ; G 2531 -U 9714 ; WX 602 ; N uni25F2 ; G 2532 -U 9715 ; WX 602 ; N uni25F3 ; G 2533 -U 9716 ; WX 602 ; N uni25F4 ; G 2534 -U 9717 ; WX 602 ; N uni25F5 ; G 2535 -U 9718 ; WX 602 ; N uni25F6 ; G 2536 -U 9719 ; WX 602 ; N uni25F7 ; G 2537 -U 9720 ; WX 602 ; N uni25F8 ; G 2538 -U 9721 ; WX 602 ; N uni25F9 ; G 2539 -U 9722 ; WX 602 ; N uni25FA ; G 2540 -U 9723 ; WX 602 ; N uni25FB ; G 2541 -U 9724 ; WX 602 ; N uni25FC ; G 2542 -U 9725 ; WX 602 ; N uni25FD ; G 2543 -U 9726 ; WX 602 ; N uni25FE ; G 2544 -U 9727 ; WX 602 ; N uni25FF ; G 2545 -U 9728 ; WX 602 ; N uni2600 ; G 2546 -U 9784 ; WX 602 ; N uni2638 ; G 2547 -U 9785 ; WX 602 ; N uni2639 ; G 2548 -U 9786 ; WX 602 ; N smileface ; G 2549 -U 9787 ; WX 602 ; N invsmileface ; G 2550 -U 9788 ; WX 602 ; N sun ; G 2551 -U 9791 ; WX 602 ; N uni263F ; G 2552 -U 9792 ; WX 602 ; N female ; G 2553 -U 9793 ; WX 602 ; N uni2641 ; G 2554 -U 9794 ; WX 602 ; N male ; G 2555 -U 9795 ; WX 602 ; N uni2643 ; G 2556 -U 9796 ; WX 602 ; N uni2644 ; G 2557 -U 9797 ; WX 602 ; N uni2645 ; G 2558 -U 9798 ; WX 602 ; N uni2646 ; G 2559 -U 9799 ; WX 602 ; N uni2647 ; G 2560 -U 9824 ; WX 602 ; N spade ; G 2561 -U 9825 ; WX 602 ; N uni2661 ; G 2562 -U 9826 ; WX 602 ; N uni2662 ; G 2563 -U 9827 ; WX 602 ; N club ; G 2564 -U 9828 ; WX 602 ; N uni2664 ; G 2565 -U 9829 ; WX 602 ; N heart ; G 2566 -U 9830 ; WX 602 ; N diamond ; G 2567 -U 9831 ; WX 602 ; N uni2667 ; G 2568 -U 9833 ; WX 602 ; N uni2669 ; G 2569 -U 9834 ; WX 602 ; N musicalnote ; G 2570 -U 9835 ; WX 602 ; N musicalnotedbl ; G 2571 -U 9836 ; WX 602 ; N uni266C ; G 2572 -U 9837 ; WX 602 ; N uni266D ; G 2573 -U 9838 ; WX 602 ; N uni266E ; G 2574 -U 9839 ; WX 602 ; N uni266F ; G 2575 -U 10178 ; WX 602 ; N uni27C2 ; G 2576 -U 10181 ; WX 602 ; N uni27C5 ; G 2577 -U 10182 ; WX 602 ; N uni27C6 ; G 2578 -U 10204 ; WX 602 ; N uni27DC ; G 2579 -U 10208 ; WX 602 ; N uni27E0 ; G 2580 -U 10214 ; WX 602 ; N uni27E6 ; G 2581 -U 10215 ; WX 602 ; N uni27E7 ; G 2582 -U 10216 ; WX 602 ; N uni27E8 ; G 2583 -U 10217 ; WX 602 ; N uni27E9 ; G 2584 -U 10218 ; WX 602 ; N uni27EA ; G 2585 -U 10219 ; WX 602 ; N uni27EB ; G 2586 -U 10229 ; WX 602 ; N uni27F5 ; G 2587 -U 10230 ; WX 602 ; N uni27F6 ; G 2588 -U 10231 ; WX 602 ; N uni27F7 ; G 2589 -U 10631 ; WX 602 ; N uni2987 ; G 2590 -U 10632 ; WX 602 ; N uni2988 ; G 2591 -U 10647 ; WX 602 ; N uni2997 ; G 2592 -U 10648 ; WX 602 ; N uni2998 ; G 2593 -U 10731 ; WX 602 ; N uni29EB ; G 2594 -U 10746 ; WX 602 ; N uni29FA ; G 2595 -U 10747 ; WX 602 ; N uni29FB ; G 2596 -U 10752 ; WX 602 ; N uni2A00 ; G 2597 -U 10799 ; WX 602 ; N uni2A2F ; G 2598 -U 10858 ; WX 602 ; N uni2A6A ; G 2599 -U 10859 ; WX 602 ; N uni2A6B ; G 2600 -U 11013 ; WX 602 ; N uni2B05 ; G 2601 -U 11014 ; WX 602 ; N uni2B06 ; G 2602 -U 11015 ; WX 602 ; N uni2B07 ; G 2603 -U 11016 ; WX 602 ; N uni2B08 ; G 2604 -U 11017 ; WX 602 ; N uni2B09 ; G 2605 -U 11018 ; WX 602 ; N uni2B0A ; G 2606 -U 11019 ; WX 602 ; N uni2B0B ; G 2607 -U 11020 ; WX 602 ; N uni2B0C ; G 2608 -U 11021 ; WX 602 ; N uni2B0D ; G 2609 -U 11026 ; WX 602 ; N uni2B12 ; G 2610 -U 11027 ; WX 602 ; N uni2B13 ; G 2611 -U 11028 ; WX 602 ; N uni2B14 ; G 2612 -U 11029 ; WX 602 ; N uni2B15 ; G 2613 -U 11030 ; WX 602 ; N uni2B16 ; G 2614 -U 11031 ; WX 602 ; N uni2B17 ; G 2615 -U 11032 ; WX 602 ; N uni2B18 ; G 2616 -U 11033 ; WX 602 ; N uni2B19 ; G 2617 -U 11034 ; WX 602 ; N uni2B1A ; G 2618 -U 11364 ; WX 602 ; N uni2C64 ; G 2619 -U 11373 ; WX 602 ; N uni2C6D ; G 2620 -U 11374 ; WX 602 ; N uni2C6E ; G 2621 -U 11375 ; WX 602 ; N uni2C6F ; G 2622 -U 11376 ; WX 602 ; N uni2C70 ; G 2623 -U 11381 ; WX 602 ; N uni2C75 ; G 2624 -U 11382 ; WX 602 ; N uni2C76 ; G 2625 -U 11383 ; WX 602 ; N uni2C77 ; G 2626 -U 11385 ; WX 602 ; N uni2C79 ; G 2627 -U 11386 ; WX 602 ; N uni2C7A ; G 2628 -U 11388 ; WX 602 ; N uni2C7C ; G 2629 -U 11389 ; WX 602 ; N uni2C7D ; G 2630 -U 11390 ; WX 602 ; N uni2C7E ; G 2631 -U 11391 ; WX 602 ; N uni2C7F ; G 2632 -U 11800 ; WX 602 ; N uni2E18 ; G 2633 -U 11807 ; WX 602 ; N uni2E1F ; G 2634 -U 11810 ; WX 602 ; N uni2E22 ; G 2635 -U 11811 ; WX 602 ; N uni2E23 ; G 2636 -U 11812 ; WX 602 ; N uni2E24 ; G 2637 -U 11813 ; WX 602 ; N uni2E25 ; G 2638 -U 11822 ; WX 602 ; N uni2E2E ; G 2639 -U 42760 ; WX 602 ; N uniA708 ; G 2640 -U 42761 ; WX 602 ; N uniA709 ; G 2641 -U 42762 ; WX 602 ; N uniA70A ; G 2642 -U 42763 ; WX 602 ; N uniA70B ; G 2643 -U 42764 ; WX 602 ; N uniA70C ; G 2644 -U 42765 ; WX 602 ; N uniA70D ; G 2645 -U 42766 ; WX 602 ; N uniA70E ; G 2646 -U 42767 ; WX 602 ; N uniA70F ; G 2647 -U 42768 ; WX 602 ; N uniA710 ; G 2648 -U 42769 ; WX 602 ; N uniA711 ; G 2649 -U 42770 ; WX 602 ; N uniA712 ; G 2650 -U 42771 ; WX 602 ; N uniA713 ; G 2651 -U 42772 ; WX 602 ; N uniA714 ; G 2652 -U 42773 ; WX 602 ; N uniA715 ; G 2653 -U 42774 ; WX 602 ; N uniA716 ; G 2654 -U 42779 ; WX 602 ; N uniA71B ; G 2655 -U 42780 ; WX 602 ; N uniA71C ; G 2656 -U 42781 ; WX 602 ; N uniA71D ; G 2657 -U 42782 ; WX 602 ; N uniA71E ; G 2658 -U 42783 ; WX 602 ; N uniA71F ; G 2659 -U 42786 ; WX 602 ; N uniA722 ; G 2660 -U 42787 ; WX 602 ; N uniA723 ; G 2661 -U 42788 ; WX 602 ; N uniA724 ; G 2662 -U 42789 ; WX 602 ; N uniA725 ; G 2663 -U 42790 ; WX 602 ; N uniA726 ; G 2664 -U 42791 ; WX 602 ; N uniA727 ; G 2665 -U 42889 ; WX 602 ; N uniA789 ; G 2666 -U 42890 ; WX 602 ; N uniA78A ; G 2667 -U 42891 ; WX 602 ; N uniA78B ; G 2668 -U 42892 ; WX 602 ; N uniA78C ; G 2669 -U 42893 ; WX 602 ; N uniA78D ; G 2670 -U 42894 ; WX 602 ; N uniA78E ; G 2671 -U 42896 ; WX 602 ; N uniA790 ; G 2672 -U 42897 ; WX 602 ; N uniA791 ; G 2673 -U 42922 ; WX 602 ; N uniA7AA ; G 2674 -U 43000 ; WX 602 ; N uniA7F8 ; G 2675 -U 43001 ; WX 602 ; N uniA7F9 ; G 2676 -U 63173 ; WX 602 ; N uniF6C5 ; G 2677 -U 64257 ; WX 602 ; N fi ; G 2678 -U 64258 ; WX 602 ; N fl ; G 2679 -U 65529 ; WX 602 ; N uniFFF9 ; G 2680 -U 65530 ; WX 602 ; N uniFFFA ; G 2681 -U 65531 ; WX 602 ; N uniFFFB ; G 2682 -U 65532 ; WX 602 ; N uniFFFC ; G 2683 -U 65533 ; WX 602 ; N uniFFFD ; G 2684 -EndCharMetrics -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ttf deleted file mode 100644 index 4c858d4..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ufm deleted file mode 100644 index 4cd3d2a..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ufm +++ /dev/null @@ -1,2707 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Sans Mono -FontSubfamily Oblique -UniqueID DejaVu Sans Mono Oblique -FullName DejaVu Sans Mono Oblique -Version Version 2.37 -PostScriptName DejaVuSansMono-Oblique -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -Weight Medium -ItalicAngle -11 -IsFixedPitch true -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 928 -Descender -236 -FontBBox -403 -375 746 998 -StartCharMetrics 2710 -U 32 ; WX 602 ; N space ; G 3 -U 33 ; WX 602 ; N exclam ; G 4 -U 34 ; WX 602 ; N quotedbl ; G 5 -U 35 ; WX 602 ; N numbersign ; G 6 -U 36 ; WX 602 ; N dollar ; G 7 -U 37 ; WX 602 ; N percent ; G 8 -U 38 ; WX 602 ; N ampersand ; G 9 -U 39 ; WX 602 ; N quotesingle ; G 10 -U 40 ; WX 602 ; N parenleft ; G 11 -U 41 ; WX 602 ; N parenright ; G 12 -U 42 ; WX 602 ; N asterisk ; G 13 -U 43 ; WX 602 ; N plus ; G 14 -U 44 ; WX 602 ; N comma ; G 15 -U 45 ; WX 602 ; N hyphen ; G 16 -U 46 ; WX 602 ; N period ; G 17 -U 47 ; WX 602 ; N slash ; G 18 -U 48 ; WX 602 ; N zero ; G 19 -U 49 ; WX 602 ; N one ; G 20 -U 50 ; WX 602 ; N two ; G 21 -U 51 ; WX 602 ; N three ; G 22 -U 52 ; WX 602 ; N four ; G 23 -U 53 ; WX 602 ; N five ; G 24 -U 54 ; WX 602 ; N six ; G 25 -U 55 ; WX 602 ; N seven ; G 26 -U 56 ; WX 602 ; N eight ; G 27 -U 57 ; WX 602 ; N nine ; G 28 -U 58 ; WX 602 ; N colon ; G 29 -U 59 ; WX 602 ; N semicolon ; G 30 -U 60 ; WX 602 ; N less ; G 31 -U 61 ; WX 602 ; N equal ; G 32 -U 62 ; WX 602 ; N greater ; G 33 -U 63 ; WX 602 ; N question ; G 34 -U 64 ; WX 602 ; N at ; G 35 -U 65 ; WX 602 ; N A ; G 36 -U 66 ; WX 602 ; N B ; G 37 -U 67 ; WX 602 ; N C ; G 38 -U 68 ; WX 602 ; N D ; G 39 -U 69 ; WX 602 ; N E ; G 40 -U 70 ; WX 602 ; N F ; G 41 -U 71 ; WX 602 ; N G ; G 42 -U 72 ; WX 602 ; N H ; G 43 -U 73 ; WX 602 ; N I ; G 44 -U 74 ; WX 602 ; N J ; G 45 -U 75 ; WX 602 ; N K ; G 46 -U 76 ; WX 602 ; N L ; G 47 -U 77 ; WX 602 ; N M ; G 48 -U 78 ; WX 602 ; N N ; G 49 -U 79 ; WX 602 ; N O ; G 50 -U 80 ; WX 602 ; N P ; G 51 -U 81 ; WX 602 ; N Q ; G 52 -U 82 ; WX 602 ; N R ; G 53 -U 83 ; WX 602 ; N S ; G 54 -U 84 ; WX 602 ; N T ; G 55 -U 85 ; WX 602 ; N U ; G 56 -U 86 ; WX 602 ; N V ; G 57 -U 87 ; WX 602 ; N W ; G 58 -U 88 ; WX 602 ; N X ; G 59 -U 89 ; WX 602 ; N Y ; G 60 -U 90 ; WX 602 ; N Z ; G 61 -U 91 ; WX 602 ; N bracketleft ; G 62 -U 92 ; WX 602 ; N backslash ; G 63 -U 93 ; WX 602 ; N bracketright ; G 64 -U 94 ; WX 602 ; N asciicircum ; G 65 -U 95 ; WX 602 ; N underscore ; G 66 -U 96 ; WX 602 ; N grave ; G 67 -U 97 ; WX 602 ; N a ; G 68 -U 98 ; WX 602 ; N b ; G 69 -U 99 ; WX 602 ; N c ; G 70 -U 100 ; WX 602 ; N d ; G 71 -U 101 ; WX 602 ; N e ; G 72 -U 102 ; WX 602 ; N f ; G 73 -U 103 ; WX 602 ; N g ; G 74 -U 104 ; WX 602 ; N h ; G 75 -U 105 ; WX 602 ; N i ; G 76 -U 106 ; WX 602 ; N j ; G 77 -U 107 ; WX 602 ; N k ; G 78 -U 108 ; WX 602 ; N l ; G 79 -U 109 ; WX 602 ; N m ; G 80 -U 110 ; WX 602 ; N n ; G 81 -U 111 ; WX 602 ; N o ; G 82 -U 112 ; WX 602 ; N p ; G 83 -U 113 ; WX 602 ; N q ; G 84 -U 114 ; WX 602 ; N r ; G 85 -U 115 ; WX 602 ; N s ; G 86 -U 116 ; WX 602 ; N t ; G 87 -U 117 ; WX 602 ; N u ; G 88 -U 118 ; WX 602 ; N v ; G 89 -U 119 ; WX 602 ; N w ; G 90 -U 120 ; WX 602 ; N x ; G 91 -U 121 ; WX 602 ; N y ; G 92 -U 122 ; WX 602 ; N z ; G 93 -U 123 ; WX 602 ; N braceleft ; G 94 -U 124 ; WX 602 ; N bar ; G 95 -U 125 ; WX 602 ; N braceright ; G 96 -U 126 ; WX 602 ; N asciitilde ; G 97 -U 160 ; WX 602 ; N nbspace ; G 98 -U 161 ; WX 602 ; N exclamdown ; G 99 -U 162 ; WX 602 ; N cent ; G 100 -U 163 ; WX 602 ; N sterling ; G 101 -U 164 ; WX 602 ; N currency ; G 102 -U 165 ; WX 602 ; N yen ; G 103 -U 166 ; WX 602 ; N brokenbar ; G 104 -U 167 ; WX 602 ; N section ; G 105 -U 168 ; WX 602 ; N dieresis ; G 106 -U 169 ; WX 602 ; N copyright ; G 107 -U 170 ; WX 602 ; N ordfeminine ; G 108 -U 171 ; WX 602 ; N guillemotleft ; G 109 -U 172 ; WX 602 ; N logicalnot ; G 110 -U 173 ; WX 602 ; N sfthyphen ; G 111 -U 174 ; WX 602 ; N registered ; G 112 -U 175 ; WX 602 ; N macron ; G 113 -U 176 ; WX 602 ; N degree ; G 114 -U 177 ; WX 602 ; N plusminus ; G 115 -U 178 ; WX 602 ; N twosuperior ; G 116 -U 179 ; WX 602 ; N threesuperior ; G 117 -U 180 ; WX 602 ; N acute ; G 118 -U 181 ; WX 602 ; N mu ; G 119 -U 182 ; WX 602 ; N paragraph ; G 120 -U 183 ; WX 602 ; N periodcentered ; G 121 -U 184 ; WX 602 ; N cedilla ; G 122 -U 185 ; WX 602 ; N onesuperior ; G 123 -U 186 ; WX 602 ; N ordmasculine ; G 124 -U 187 ; WX 602 ; N guillemotright ; G 125 -U 188 ; WX 602 ; N onequarter ; G 126 -U 189 ; WX 602 ; N onehalf ; G 127 -U 190 ; WX 602 ; N threequarters ; G 128 -U 191 ; WX 602 ; N questiondown ; G 129 -U 192 ; WX 602 ; N Agrave ; G 130 -U 193 ; WX 602 ; N Aacute ; G 131 -U 194 ; WX 602 ; N Acircumflex ; G 132 -U 195 ; WX 602 ; N Atilde ; G 133 -U 196 ; WX 602 ; N Adieresis ; G 134 -U 197 ; WX 602 ; N Aring ; G 135 -U 198 ; WX 602 ; N AE ; G 136 -U 199 ; WX 602 ; N Ccedilla ; G 137 -U 200 ; WX 602 ; N Egrave ; G 138 -U 201 ; WX 602 ; N Eacute ; G 139 -U 202 ; WX 602 ; N Ecircumflex ; G 140 -U 203 ; WX 602 ; N Edieresis ; G 141 -U 204 ; WX 602 ; N Igrave ; G 142 -U 205 ; WX 602 ; N Iacute ; G 143 -U 206 ; WX 602 ; N Icircumflex ; G 144 -U 207 ; WX 602 ; N Idieresis ; G 145 -U 208 ; WX 602 ; N Eth ; G 146 -U 209 ; WX 602 ; N Ntilde ; G 147 -U 210 ; WX 602 ; N Ograve ; G 148 -U 211 ; WX 602 ; N Oacute ; G 149 -U 212 ; WX 602 ; N Ocircumflex ; G 150 -U 213 ; WX 602 ; N Otilde ; G 151 -U 214 ; WX 602 ; N Odieresis ; G 152 -U 215 ; WX 602 ; N multiply ; G 153 -U 216 ; WX 602 ; N Oslash ; G 154 -U 217 ; WX 602 ; N Ugrave ; G 155 -U 218 ; WX 602 ; N Uacute ; G 156 -U 219 ; WX 602 ; N Ucircumflex ; G 157 -U 220 ; WX 602 ; N Udieresis ; G 158 -U 221 ; WX 602 ; N Yacute ; G 159 -U 222 ; WX 602 ; N Thorn ; G 160 -U 223 ; WX 602 ; N germandbls ; G 161 -U 224 ; WX 602 ; N agrave ; G 162 -U 225 ; WX 602 ; N aacute ; G 163 -U 226 ; WX 602 ; N acircumflex ; G 164 -U 227 ; WX 602 ; N atilde ; G 165 -U 228 ; WX 602 ; N adieresis ; G 166 -U 229 ; WX 602 ; N aring ; G 167 -U 230 ; WX 602 ; N ae ; G 168 -U 231 ; WX 602 ; N ccedilla ; G 169 -U 232 ; WX 602 ; N egrave ; G 170 -U 233 ; WX 602 ; N eacute ; G 171 -U 234 ; WX 602 ; N ecircumflex ; G 172 -U 235 ; WX 602 ; N edieresis ; G 173 -U 236 ; WX 602 ; N igrave ; G 174 -U 237 ; WX 602 ; N iacute ; G 175 -U 238 ; WX 602 ; N icircumflex ; G 176 -U 239 ; WX 602 ; N idieresis ; G 177 -U 240 ; WX 602 ; N eth ; G 178 -U 241 ; WX 602 ; N ntilde ; G 179 -U 242 ; WX 602 ; N ograve ; G 180 -U 243 ; WX 602 ; N oacute ; G 181 -U 244 ; WX 602 ; N ocircumflex ; G 182 -U 245 ; WX 602 ; N otilde ; G 183 -U 246 ; WX 602 ; N odieresis ; G 184 -U 247 ; WX 602 ; N divide ; G 185 -U 248 ; WX 602 ; N oslash ; G 186 -U 249 ; WX 602 ; N ugrave ; G 187 -U 250 ; WX 602 ; N uacute ; G 188 -U 251 ; WX 602 ; N ucircumflex ; G 189 -U 252 ; WX 602 ; N udieresis ; G 190 -U 253 ; WX 602 ; N yacute ; G 191 -U 254 ; WX 602 ; N thorn ; G 192 -U 255 ; WX 602 ; N ydieresis ; G 193 -U 256 ; WX 602 ; N Amacron ; G 194 -U 257 ; WX 602 ; N amacron ; G 195 -U 258 ; WX 602 ; N Abreve ; G 196 -U 259 ; WX 602 ; N abreve ; G 197 -U 260 ; WX 602 ; N Aogonek ; G 198 -U 261 ; WX 602 ; N aogonek ; G 199 -U 262 ; WX 602 ; N Cacute ; G 200 -U 263 ; WX 602 ; N cacute ; G 201 -U 264 ; WX 602 ; N Ccircumflex ; G 202 -U 265 ; WX 602 ; N ccircumflex ; G 203 -U 266 ; WX 602 ; N Cdotaccent ; G 204 -U 267 ; WX 602 ; N cdotaccent ; G 205 -U 268 ; WX 602 ; N Ccaron ; G 206 -U 269 ; WX 602 ; N ccaron ; G 207 -U 270 ; WX 602 ; N Dcaron ; G 208 -U 271 ; WX 602 ; N dcaron ; G 209 -U 272 ; WX 602 ; N Dcroat ; G 210 -U 273 ; WX 602 ; N dmacron ; G 211 -U 274 ; WX 602 ; N Emacron ; G 212 -U 275 ; WX 602 ; N emacron ; G 213 -U 276 ; WX 602 ; N Ebreve ; G 214 -U 277 ; WX 602 ; N ebreve ; G 215 -U 278 ; WX 602 ; N Edotaccent ; G 216 -U 279 ; WX 602 ; N edotaccent ; G 217 -U 280 ; WX 602 ; N Eogonek ; G 218 -U 281 ; WX 602 ; N eogonek ; G 219 -U 282 ; WX 602 ; N Ecaron ; G 220 -U 283 ; WX 602 ; N ecaron ; G 221 -U 284 ; WX 602 ; N Gcircumflex ; G 222 -U 285 ; WX 602 ; N gcircumflex ; G 223 -U 286 ; WX 602 ; N Gbreve ; G 224 -U 287 ; WX 602 ; N gbreve ; G 225 -U 288 ; WX 602 ; N Gdotaccent ; G 226 -U 289 ; WX 602 ; N gdotaccent ; G 227 -U 290 ; WX 602 ; N Gcommaaccent ; G 228 -U 291 ; WX 602 ; N gcommaaccent ; G 229 -U 292 ; WX 602 ; N Hcircumflex ; G 230 -U 293 ; WX 602 ; N hcircumflex ; G 231 -U 294 ; WX 602 ; N Hbar ; G 232 -U 295 ; WX 602 ; N hbar ; G 233 -U 296 ; WX 602 ; N Itilde ; G 234 -U 297 ; WX 602 ; N itilde ; G 235 -U 298 ; WX 602 ; N Imacron ; G 236 -U 299 ; WX 602 ; N imacron ; G 237 -U 300 ; WX 602 ; N Ibreve ; G 238 -U 301 ; WX 602 ; N ibreve ; G 239 -U 302 ; WX 602 ; N Iogonek ; G 240 -U 303 ; WX 602 ; N iogonek ; G 241 -U 304 ; WX 602 ; N Idot ; G 242 -U 305 ; WX 602 ; N dotlessi ; G 243 -U 306 ; WX 602 ; N IJ ; G 244 -U 307 ; WX 602 ; N ij ; G 245 -U 308 ; WX 602 ; N Jcircumflex ; G 246 -U 309 ; WX 602 ; N jcircumflex ; G 247 -U 310 ; WX 602 ; N Kcommaaccent ; G 248 -U 311 ; WX 602 ; N kcommaaccent ; G 249 -U 312 ; WX 602 ; N kgreenlandic ; G 250 -U 313 ; WX 602 ; N Lacute ; G 251 -U 314 ; WX 602 ; N lacute ; G 252 -U 315 ; WX 602 ; N Lcommaaccent ; G 253 -U 316 ; WX 602 ; N lcommaaccent ; G 254 -U 317 ; WX 602 ; N Lcaron ; G 255 -U 318 ; WX 602 ; N lcaron ; G 256 -U 319 ; WX 602 ; N Ldot ; G 257 -U 320 ; WX 602 ; N ldot ; G 258 -U 321 ; WX 602 ; N Lslash ; G 259 -U 322 ; WX 602 ; N lslash ; G 260 -U 323 ; WX 602 ; N Nacute ; G 261 -U 324 ; WX 602 ; N nacute ; G 262 -U 325 ; WX 602 ; N Ncommaaccent ; G 263 -U 326 ; WX 602 ; N ncommaaccent ; G 264 -U 327 ; WX 602 ; N Ncaron ; G 265 -U 328 ; WX 602 ; N ncaron ; G 266 -U 329 ; WX 602 ; N napostrophe ; G 267 -U 330 ; WX 602 ; N Eng ; G 268 -U 331 ; WX 602 ; N eng ; G 269 -U 332 ; WX 602 ; N Omacron ; G 270 -U 333 ; WX 602 ; N omacron ; G 271 -U 334 ; WX 602 ; N Obreve ; G 272 -U 335 ; WX 602 ; N obreve ; G 273 -U 336 ; WX 602 ; N Ohungarumlaut ; G 274 -U 337 ; WX 602 ; N ohungarumlaut ; G 275 -U 338 ; WX 602 ; N OE ; G 276 -U 339 ; WX 602 ; N oe ; G 277 -U 340 ; WX 602 ; N Racute ; G 278 -U 341 ; WX 602 ; N racute ; G 279 -U 342 ; WX 602 ; N Rcommaaccent ; G 280 -U 343 ; WX 602 ; N rcommaaccent ; G 281 -U 344 ; WX 602 ; N Rcaron ; G 282 -U 345 ; WX 602 ; N rcaron ; G 283 -U 346 ; WX 602 ; N Sacute ; G 284 -U 347 ; WX 602 ; N sacute ; G 285 -U 348 ; WX 602 ; N Scircumflex ; G 286 -U 349 ; WX 602 ; N scircumflex ; G 287 -U 350 ; WX 602 ; N Scedilla ; G 288 -U 351 ; WX 602 ; N scedilla ; G 289 -U 352 ; WX 602 ; N Scaron ; G 290 -U 353 ; WX 602 ; N scaron ; G 291 -U 354 ; WX 602 ; N Tcommaaccent ; G 292 -U 355 ; WX 602 ; N tcommaaccent ; G 293 -U 356 ; WX 602 ; N Tcaron ; G 294 -U 357 ; WX 602 ; N tcaron ; G 295 -U 358 ; WX 602 ; N Tbar ; G 296 -U 359 ; WX 602 ; N tbar ; G 297 -U 360 ; WX 602 ; N Utilde ; G 298 -U 361 ; WX 602 ; N utilde ; G 299 -U 362 ; WX 602 ; N Umacron ; G 300 -U 363 ; WX 602 ; N umacron ; G 301 -U 364 ; WX 602 ; N Ubreve ; G 302 -U 365 ; WX 602 ; N ubreve ; G 303 -U 366 ; WX 602 ; N Uring ; G 304 -U 367 ; WX 602 ; N uring ; G 305 -U 368 ; WX 602 ; N Uhungarumlaut ; G 306 -U 369 ; WX 602 ; N uhungarumlaut ; G 307 -U 370 ; WX 602 ; N Uogonek ; G 308 -U 371 ; WX 602 ; N uogonek ; G 309 -U 372 ; WX 602 ; N Wcircumflex ; G 310 -U 373 ; WX 602 ; N wcircumflex ; G 311 -U 374 ; WX 602 ; N Ycircumflex ; G 312 -U 375 ; WX 602 ; N ycircumflex ; G 313 -U 376 ; WX 602 ; N Ydieresis ; G 314 -U 377 ; WX 602 ; N Zacute ; G 315 -U 378 ; WX 602 ; N zacute ; G 316 -U 379 ; WX 602 ; N Zdotaccent ; G 317 -U 380 ; WX 602 ; N zdotaccent ; G 318 -U 381 ; WX 602 ; N Zcaron ; G 319 -U 382 ; WX 602 ; N zcaron ; G 320 -U 383 ; WX 602 ; N longs ; G 321 -U 384 ; WX 602 ; N uni0180 ; G 322 -U 385 ; WX 602 ; N uni0181 ; G 323 -U 386 ; WX 602 ; N uni0182 ; G 324 -U 387 ; WX 602 ; N uni0183 ; G 325 -U 388 ; WX 602 ; N uni0184 ; G 326 -U 389 ; WX 602 ; N uni0185 ; G 327 -U 390 ; WX 602 ; N uni0186 ; G 328 -U 391 ; WX 602 ; N uni0187 ; G 329 -U 392 ; WX 602 ; N uni0188 ; G 330 -U 393 ; WX 602 ; N uni0189 ; G 331 -U 394 ; WX 602 ; N uni018A ; G 332 -U 395 ; WX 602 ; N uni018B ; G 333 -U 396 ; WX 602 ; N uni018C ; G 334 -U 397 ; WX 602 ; N uni018D ; G 335 -U 398 ; WX 602 ; N uni018E ; G 336 -U 399 ; WX 602 ; N uni018F ; G 337 -U 400 ; WX 602 ; N uni0190 ; G 338 -U 401 ; WX 602 ; N uni0191 ; G 339 -U 402 ; WX 602 ; N florin ; G 340 -U 403 ; WX 602 ; N uni0193 ; G 341 -U 404 ; WX 602 ; N uni0194 ; G 342 -U 405 ; WX 602 ; N uni0195 ; G 343 -U 406 ; WX 602 ; N uni0196 ; G 344 -U 407 ; WX 602 ; N uni0197 ; G 345 -U 408 ; WX 602 ; N uni0198 ; G 346 -U 409 ; WX 602 ; N uni0199 ; G 347 -U 410 ; WX 602 ; N uni019A ; G 348 -U 411 ; WX 602 ; N uni019B ; G 349 -U 412 ; WX 602 ; N uni019C ; G 350 -U 413 ; WX 602 ; N uni019D ; G 351 -U 414 ; WX 602 ; N uni019E ; G 352 -U 415 ; WX 602 ; N uni019F ; G 353 -U 416 ; WX 602 ; N Ohorn ; G 354 -U 417 ; WX 602 ; N ohorn ; G 355 -U 418 ; WX 602 ; N uni01A2 ; G 356 -U 419 ; WX 602 ; N uni01A3 ; G 357 -U 420 ; WX 602 ; N uni01A4 ; G 358 -U 421 ; WX 602 ; N uni01A5 ; G 359 -U 422 ; WX 602 ; N uni01A6 ; G 360 -U 423 ; WX 602 ; N uni01A7 ; G 361 -U 424 ; WX 602 ; N uni01A8 ; G 362 -U 425 ; WX 602 ; N uni01A9 ; G 363 -U 426 ; WX 602 ; N uni01AA ; G 364 -U 427 ; WX 602 ; N uni01AB ; G 365 -U 428 ; WX 602 ; N uni01AC ; G 366 -U 429 ; WX 602 ; N uni01AD ; G 367 -U 430 ; WX 602 ; N uni01AE ; G 368 -U 431 ; WX 602 ; N Uhorn ; G 369 -U 432 ; WX 602 ; N uhorn ; G 370 -U 433 ; WX 602 ; N uni01B1 ; G 371 -U 434 ; WX 602 ; N uni01B2 ; G 372 -U 435 ; WX 602 ; N uni01B3 ; G 373 -U 436 ; WX 602 ; N uni01B4 ; G 374 -U 437 ; WX 602 ; N uni01B5 ; G 375 -U 438 ; WX 602 ; N uni01B6 ; G 376 -U 439 ; WX 602 ; N uni01B7 ; G 377 -U 440 ; WX 602 ; N uni01B8 ; G 378 -U 441 ; WX 602 ; N uni01B9 ; G 379 -U 442 ; WX 602 ; N uni01BA ; G 380 -U 443 ; WX 602 ; N uni01BB ; G 381 -U 444 ; WX 602 ; N uni01BC ; G 382 -U 445 ; WX 602 ; N uni01BD ; G 383 -U 446 ; WX 602 ; N uni01BE ; G 384 -U 447 ; WX 602 ; N uni01BF ; G 385 -U 448 ; WX 602 ; N uni01C0 ; G 386 -U 449 ; WX 602 ; N uni01C1 ; G 387 -U 450 ; WX 602 ; N uni01C2 ; G 388 -U 451 ; WX 602 ; N uni01C3 ; G 389 -U 461 ; WX 602 ; N uni01CD ; G 390 -U 462 ; WX 602 ; N uni01CE ; G 391 -U 463 ; WX 602 ; N uni01CF ; G 392 -U 464 ; WX 602 ; N uni01D0 ; G 393 -U 465 ; WX 602 ; N uni01D1 ; G 394 -U 466 ; WX 602 ; N uni01D2 ; G 395 -U 467 ; WX 602 ; N uni01D3 ; G 396 -U 468 ; WX 602 ; N uni01D4 ; G 397 -U 469 ; WX 602 ; N uni01D5 ; G 398 -U 470 ; WX 602 ; N uni01D6 ; G 399 -U 471 ; WX 602 ; N uni01D7 ; G 400 -U 472 ; WX 602 ; N uni01D8 ; G 401 -U 473 ; WX 602 ; N uni01D9 ; G 402 -U 474 ; WX 602 ; N uni01DA ; G 403 -U 475 ; WX 602 ; N uni01DB ; G 404 -U 476 ; WX 602 ; N uni01DC ; G 405 -U 477 ; WX 602 ; N uni01DD ; G 406 -U 479 ; WX 602 ; N uni01DF ; G 407 -U 480 ; WX 602 ; N uni01E0 ; G 408 -U 481 ; WX 602 ; N uni01E1 ; G 409 -U 482 ; WX 602 ; N uni01E2 ; G 410 -U 483 ; WX 602 ; N uni01E3 ; G 411 -U 486 ; WX 602 ; N Gcaron ; G 412 -U 487 ; WX 602 ; N gcaron ; G 413 -U 488 ; WX 602 ; N uni01E8 ; G 414 -U 489 ; WX 602 ; N uni01E9 ; G 415 -U 490 ; WX 602 ; N uni01EA ; G 416 -U 491 ; WX 602 ; N uni01EB ; G 417 -U 492 ; WX 602 ; N uni01EC ; G 418 -U 493 ; WX 602 ; N uni01ED ; G 419 -U 494 ; WX 602 ; N uni01EE ; G 420 -U 495 ; WX 602 ; N uni01EF ; G 421 -U 500 ; WX 602 ; N uni01F4 ; G 422 -U 501 ; WX 602 ; N uni01F5 ; G 423 -U 502 ; WX 602 ; N uni01F6 ; G 424 -U 504 ; WX 602 ; N uni01F8 ; G 425 -U 505 ; WX 602 ; N uni01F9 ; G 426 -U 508 ; WX 602 ; N AEacute ; G 427 -U 509 ; WX 602 ; N aeacute ; G 428 -U 510 ; WX 602 ; N Oslashacute ; G 429 -U 511 ; WX 602 ; N oslashacute ; G 430 -U 512 ; WX 602 ; N uni0200 ; G 431 -U 513 ; WX 602 ; N uni0201 ; G 432 -U 514 ; WX 602 ; N uni0202 ; G 433 -U 515 ; WX 602 ; N uni0203 ; G 434 -U 516 ; WX 602 ; N uni0204 ; G 435 -U 517 ; WX 602 ; N uni0205 ; G 436 -U 518 ; WX 602 ; N uni0206 ; G 437 -U 519 ; WX 602 ; N uni0207 ; G 438 -U 520 ; WX 602 ; N uni0208 ; G 439 -U 521 ; WX 602 ; N uni0209 ; G 440 -U 522 ; WX 602 ; N uni020A ; G 441 -U 523 ; WX 602 ; N uni020B ; G 442 -U 524 ; WX 602 ; N uni020C ; G 443 -U 525 ; WX 602 ; N uni020D ; G 444 -U 526 ; WX 602 ; N uni020E ; G 445 -U 527 ; WX 602 ; N uni020F ; G 446 -U 528 ; WX 602 ; N uni0210 ; G 447 -U 529 ; WX 602 ; N uni0211 ; G 448 -U 530 ; WX 602 ; N uni0212 ; G 449 -U 531 ; WX 602 ; N uni0213 ; G 450 -U 532 ; WX 602 ; N uni0214 ; G 451 -U 533 ; WX 602 ; N uni0215 ; G 452 -U 534 ; WX 602 ; N uni0216 ; G 453 -U 535 ; WX 602 ; N uni0217 ; G 454 -U 536 ; WX 602 ; N Scommaaccent ; G 455 -U 537 ; WX 602 ; N scommaaccent ; G 456 -U 538 ; WX 602 ; N uni021A ; G 457 -U 539 ; WX 602 ; N uni021B ; G 458 -U 540 ; WX 602 ; N uni021C ; G 459 -U 541 ; WX 602 ; N uni021D ; G 460 -U 542 ; WX 602 ; N uni021E ; G 461 -U 543 ; WX 602 ; N uni021F ; G 462 -U 545 ; WX 602 ; N uni0221 ; G 463 -U 548 ; WX 602 ; N uni0224 ; G 464 -U 549 ; WX 602 ; N uni0225 ; G 465 -U 550 ; WX 602 ; N uni0226 ; G 466 -U 551 ; WX 602 ; N uni0227 ; G 467 -U 552 ; WX 602 ; N uni0228 ; G 468 -U 553 ; WX 602 ; N uni0229 ; G 469 -U 554 ; WX 602 ; N uni022A ; G 470 -U 555 ; WX 602 ; N uni022B ; G 471 -U 556 ; WX 602 ; N uni022C ; G 472 -U 557 ; WX 602 ; N uni022D ; G 473 -U 558 ; WX 602 ; N uni022E ; G 474 -U 559 ; WX 602 ; N uni022F ; G 475 -U 560 ; WX 602 ; N uni0230 ; G 476 -U 561 ; WX 602 ; N uni0231 ; G 477 -U 562 ; WX 602 ; N uni0232 ; G 478 -U 563 ; WX 602 ; N uni0233 ; G 479 -U 564 ; WX 602 ; N uni0234 ; G 480 -U 565 ; WX 602 ; N uni0235 ; G 481 -U 566 ; WX 602 ; N uni0236 ; G 482 -U 567 ; WX 602 ; N dotlessj ; G 483 -U 568 ; WX 602 ; N uni0238 ; G 484 -U 569 ; WX 602 ; N uni0239 ; G 485 -U 570 ; WX 602 ; N uni023A ; G 486 -U 571 ; WX 602 ; N uni023B ; G 487 -U 572 ; WX 602 ; N uni023C ; G 488 -U 573 ; WX 602 ; N uni023D ; G 489 -U 574 ; WX 602 ; N uni023E ; G 490 -U 575 ; WX 602 ; N uni023F ; G 491 -U 576 ; WX 602 ; N uni0240 ; G 492 -U 577 ; WX 602 ; N uni0241 ; G 493 -U 579 ; WX 602 ; N uni0243 ; G 494 -U 580 ; WX 602 ; N uni0244 ; G 495 -U 581 ; WX 602 ; N uni0245 ; G 496 -U 588 ; WX 602 ; N uni024C ; G 497 -U 589 ; WX 602 ; N uni024D ; G 498 -U 592 ; WX 602 ; N uni0250 ; G 499 -U 593 ; WX 602 ; N uni0251 ; G 500 -U 594 ; WX 602 ; N uni0252 ; G 501 -U 595 ; WX 602 ; N uni0253 ; G 502 -U 596 ; WX 602 ; N uni0254 ; G 503 -U 597 ; WX 602 ; N uni0255 ; G 504 -U 598 ; WX 602 ; N uni0256 ; G 505 -U 599 ; WX 602 ; N uni0257 ; G 506 -U 600 ; WX 602 ; N uni0258 ; G 507 -U 601 ; WX 602 ; N uni0259 ; G 508 -U 602 ; WX 602 ; N uni025A ; G 509 -U 603 ; WX 602 ; N uni025B ; G 510 -U 604 ; WX 602 ; N uni025C ; G 511 -U 605 ; WX 602 ; N uni025D ; G 512 -U 606 ; WX 602 ; N uni025E ; G 513 -U 607 ; WX 602 ; N uni025F ; G 514 -U 608 ; WX 602 ; N uni0260 ; G 515 -U 609 ; WX 602 ; N uni0261 ; G 516 -U 610 ; WX 602 ; N uni0262 ; G 517 -U 611 ; WX 602 ; N uni0263 ; G 518 -U 612 ; WX 602 ; N uni0264 ; G 519 -U 613 ; WX 602 ; N uni0265 ; G 520 -U 614 ; WX 602 ; N uni0266 ; G 521 -U 615 ; WX 602 ; N uni0267 ; G 522 -U 616 ; WX 602 ; N uni0268 ; G 523 -U 617 ; WX 602 ; N uni0269 ; G 524 -U 618 ; WX 602 ; N uni026A ; G 525 -U 619 ; WX 602 ; N uni026B ; G 526 -U 620 ; WX 602 ; N uni026C ; G 527 -U 621 ; WX 602 ; N uni026D ; G 528 -U 622 ; WX 602 ; N uni026E ; G 529 -U 623 ; WX 602 ; N uni026F ; G 530 -U 624 ; WX 602 ; N uni0270 ; G 531 -U 625 ; WX 602 ; N uni0271 ; G 532 -U 626 ; WX 602 ; N uni0272 ; G 533 -U 627 ; WX 602 ; N uni0273 ; G 534 -U 628 ; WX 602 ; N uni0274 ; G 535 -U 629 ; WX 602 ; N uni0275 ; G 536 -U 630 ; WX 602 ; N uni0276 ; G 537 -U 631 ; WX 602 ; N uni0277 ; G 538 -U 632 ; WX 602 ; N uni0278 ; G 539 -U 633 ; WX 602 ; N uni0279 ; G 540 -U 634 ; WX 602 ; N uni027A ; G 541 -U 635 ; WX 602 ; N uni027B ; G 542 -U 636 ; WX 602 ; N uni027C ; G 543 -U 637 ; WX 602 ; N uni027D ; G 544 -U 638 ; WX 602 ; N uni027E ; G 545 -U 639 ; WX 602 ; N uni027F ; G 546 -U 640 ; WX 602 ; N uni0280 ; G 547 -U 641 ; WX 602 ; N uni0281 ; G 548 -U 642 ; WX 602 ; N uni0282 ; G 549 -U 643 ; WX 602 ; N uni0283 ; G 550 -U 644 ; WX 602 ; N uni0284 ; G 551 -U 645 ; WX 602 ; N uni0285 ; G 552 -U 646 ; WX 602 ; N uni0286 ; G 553 -U 647 ; WX 602 ; N uni0287 ; G 554 -U 648 ; WX 602 ; N uni0288 ; G 555 -U 649 ; WX 602 ; N uni0289 ; G 556 -U 650 ; WX 602 ; N uni028A ; G 557 -U 651 ; WX 602 ; N uni028B ; G 558 -U 652 ; WX 602 ; N uni028C ; G 559 -U 653 ; WX 602 ; N uni028D ; G 560 -U 654 ; WX 602 ; N uni028E ; G 561 -U 655 ; WX 602 ; N uni028F ; G 562 -U 656 ; WX 602 ; N uni0290 ; G 563 -U 657 ; WX 602 ; N uni0291 ; G 564 -U 658 ; WX 602 ; N uni0292 ; G 565 -U 659 ; WX 602 ; N uni0293 ; G 566 -U 660 ; WX 602 ; N uni0294 ; G 567 -U 661 ; WX 602 ; N uni0295 ; G 568 -U 662 ; WX 602 ; N uni0296 ; G 569 -U 663 ; WX 602 ; N uni0297 ; G 570 -U 664 ; WX 602 ; N uni0298 ; G 571 -U 665 ; WX 602 ; N uni0299 ; G 572 -U 666 ; WX 602 ; N uni029A ; G 573 -U 667 ; WX 602 ; N uni029B ; G 574 -U 668 ; WX 602 ; N uni029C ; G 575 -U 669 ; WX 602 ; N uni029D ; G 576 -U 670 ; WX 602 ; N uni029E ; G 577 -U 671 ; WX 602 ; N uni029F ; G 578 -U 672 ; WX 602 ; N uni02A0 ; G 579 -U 673 ; WX 602 ; N uni02A1 ; G 580 -U 674 ; WX 602 ; N uni02A2 ; G 581 -U 675 ; WX 602 ; N uni02A3 ; G 582 -U 676 ; WX 602 ; N uni02A4 ; G 583 -U 677 ; WX 602 ; N uni02A5 ; G 584 -U 678 ; WX 602 ; N uni02A6 ; G 585 -U 679 ; WX 602 ; N uni02A7 ; G 586 -U 680 ; WX 602 ; N uni02A8 ; G 587 -U 681 ; WX 602 ; N uni02A9 ; G 588 -U 682 ; WX 602 ; N uni02AA ; G 589 -U 683 ; WX 602 ; N uni02AB ; G 590 -U 684 ; WX 602 ; N uni02AC ; G 591 -U 685 ; WX 602 ; N uni02AD ; G 592 -U 686 ; WX 602 ; N uni02AE ; G 593 -U 687 ; WX 602 ; N uni02AF ; G 594 -U 688 ; WX 602 ; N uni02B0 ; G 595 -U 689 ; WX 602 ; N uni02B1 ; G 596 -U 690 ; WX 602 ; N uni02B2 ; G 597 -U 691 ; WX 602 ; N uni02B3 ; G 598 -U 692 ; WX 602 ; N uni02B4 ; G 599 -U 693 ; WX 602 ; N uni02B5 ; G 600 -U 694 ; WX 602 ; N uni02B6 ; G 601 -U 695 ; WX 602 ; N uni02B7 ; G 602 -U 696 ; WX 602 ; N uni02B8 ; G 603 -U 697 ; WX 602 ; N uni02B9 ; G 604 -U 699 ; WX 602 ; N uni02BB ; G 605 -U 700 ; WX 602 ; N uni02BC ; G 606 -U 701 ; WX 602 ; N uni02BD ; G 607 -U 702 ; WX 602 ; N uni02BE ; G 608 -U 703 ; WX 602 ; N uni02BF ; G 609 -U 704 ; WX 602 ; N uni02C0 ; G 610 -U 705 ; WX 602 ; N uni02C1 ; G 611 -U 710 ; WX 602 ; N circumflex ; G 612 -U 711 ; WX 602 ; N caron ; G 613 -U 712 ; WX 602 ; N uni02C8 ; G 614 -U 713 ; WX 602 ; N uni02C9 ; G 615 -U 716 ; WX 602 ; N uni02CC ; G 616 -U 717 ; WX 602 ; N uni02CD ; G 617 -U 718 ; WX 602 ; N uni02CE ; G 618 -U 719 ; WX 602 ; N uni02CF ; G 619 -U 720 ; WX 602 ; N uni02D0 ; G 620 -U 721 ; WX 602 ; N uni02D1 ; G 621 -U 722 ; WX 602 ; N uni02D2 ; G 622 -U 723 ; WX 602 ; N uni02D3 ; G 623 -U 726 ; WX 602 ; N uni02D6 ; G 624 -U 727 ; WX 602 ; N uni02D7 ; G 625 -U 728 ; WX 602 ; N breve ; G 626 -U 729 ; WX 602 ; N dotaccent ; G 627 -U 730 ; WX 602 ; N ring ; G 628 -U 731 ; WX 602 ; N ogonek ; G 629 -U 732 ; WX 602 ; N tilde ; G 630 -U 733 ; WX 602 ; N hungarumlaut ; G 631 -U 734 ; WX 602 ; N uni02DE ; G 632 -U 736 ; WX 602 ; N uni02E0 ; G 633 -U 737 ; WX 602 ; N uni02E1 ; G 634 -U 738 ; WX 602 ; N uni02E2 ; G 635 -U 739 ; WX 602 ; N uni02E3 ; G 636 -U 740 ; WX 602 ; N uni02E4 ; G 637 -U 741 ; WX 602 ; N uni02E5 ; G 638 -U 742 ; WX 602 ; N uni02E6 ; G 639 -U 743 ; WX 602 ; N uni02E7 ; G 640 -U 744 ; WX 602 ; N uni02E8 ; G 641 -U 745 ; WX 602 ; N uni02E9 ; G 642 -U 750 ; WX 602 ; N uni02EE ; G 643 -U 755 ; WX 602 ; N uni02F3 ; G 644 -U 768 ; WX 602 ; N gravecomb ; G 645 -U 769 ; WX 602 ; N acutecomb ; G 646 -U 770 ; WX 602 ; N uni0302 ; G 647 -U 771 ; WX 602 ; N tildecomb ; G 648 -U 772 ; WX 602 ; N uni0304 ; G 649 -U 773 ; WX 602 ; N uni0305 ; G 650 -U 774 ; WX 602 ; N uni0306 ; G 651 -U 775 ; WX 602 ; N uni0307 ; G 652 -U 776 ; WX 602 ; N uni0308 ; G 653 -U 777 ; WX 602 ; N hookabovecomb ; G 654 -U 778 ; WX 602 ; N uni030A ; G 655 -U 779 ; WX 602 ; N uni030B ; G 656 -U 780 ; WX 602 ; N uni030C ; G 657 -U 781 ; WX 602 ; N uni030D ; G 658 -U 782 ; WX 602 ; N uni030E ; G 659 -U 783 ; WX 602 ; N uni030F ; G 660 -U 784 ; WX 602 ; N uni0310 ; G 661 -U 785 ; WX 602 ; N uni0311 ; G 662 -U 786 ; WX 602 ; N uni0312 ; G 663 -U 787 ; WX 602 ; N uni0313 ; G 664 -U 788 ; WX 602 ; N uni0314 ; G 665 -U 789 ; WX 602 ; N uni0315 ; G 666 -U 790 ; WX 602 ; N uni0316 ; G 667 -U 791 ; WX 602 ; N uni0317 ; G 668 -U 792 ; WX 602 ; N uni0318 ; G 669 -U 793 ; WX 602 ; N uni0319 ; G 670 -U 794 ; WX 602 ; N uni031A ; G 671 -U 795 ; WX 602 ; N uni031B ; G 672 -U 796 ; WX 602 ; N uni031C ; G 673 -U 797 ; WX 602 ; N uni031D ; G 674 -U 798 ; WX 602 ; N uni031E ; G 675 -U 799 ; WX 602 ; N uni031F ; G 676 -U 800 ; WX 602 ; N uni0320 ; G 677 -U 801 ; WX 602 ; N uni0321 ; G 678 -U 802 ; WX 602 ; N uni0322 ; G 679 -U 803 ; WX 602 ; N dotbelowcomb ; G 680 -U 804 ; WX 602 ; N uni0324 ; G 681 -U 805 ; WX 602 ; N uni0325 ; G 682 -U 806 ; WX 602 ; N uni0326 ; G 683 -U 807 ; WX 602 ; N uni0327 ; G 684 -U 808 ; WX 602 ; N uni0328 ; G 685 -U 809 ; WX 602 ; N uni0329 ; G 686 -U 810 ; WX 602 ; N uni032A ; G 687 -U 811 ; WX 602 ; N uni032B ; G 688 -U 812 ; WX 602 ; N uni032C ; G 689 -U 813 ; WX 602 ; N uni032D ; G 690 -U 814 ; WX 602 ; N uni032E ; G 691 -U 815 ; WX 602 ; N uni032F ; G 692 -U 816 ; WX 602 ; N uni0330 ; G 693 -U 817 ; WX 602 ; N uni0331 ; G 694 -U 818 ; WX 602 ; N uni0332 ; G 695 -U 819 ; WX 602 ; N uni0333 ; G 696 -U 820 ; WX 602 ; N uni0334 ; G 697 -U 821 ; WX 602 ; N uni0335 ; G 698 -U 822 ; WX 602 ; N uni0336 ; G 699 -U 823 ; WX 602 ; N uni0337 ; G 700 -U 824 ; WX 602 ; N uni0338 ; G 701 -U 825 ; WX 602 ; N uni0339 ; G 702 -U 826 ; WX 602 ; N uni033A ; G 703 -U 827 ; WX 602 ; N uni033B ; G 704 -U 828 ; WX 602 ; N uni033C ; G 705 -U 829 ; WX 602 ; N uni033D ; G 706 -U 830 ; WX 602 ; N uni033E ; G 707 -U 831 ; WX 602 ; N uni033F ; G 708 -U 835 ; WX 602 ; N uni0343 ; G 709 -U 856 ; WX 602 ; N uni0358 ; G 710 -U 865 ; WX 602 ; N uni0361 ; G 711 -U 884 ; WX 602 ; N uni0374 ; G 712 -U 885 ; WX 602 ; N uni0375 ; G 713 -U 886 ; WX 602 ; N uni0376 ; G 714 -U 887 ; WX 602 ; N uni0377 ; G 715 -U 890 ; WX 602 ; N uni037A ; G 716 -U 891 ; WX 602 ; N uni037B ; G 717 -U 892 ; WX 602 ; N uni037C ; G 718 -U 893 ; WX 602 ; N uni037D ; G 719 -U 894 ; WX 602 ; N uni037E ; G 720 -U 895 ; WX 602 ; N uni037F ; G 721 -U 900 ; WX 602 ; N tonos ; G 722 -U 901 ; WX 602 ; N dieresistonos ; G 723 -U 902 ; WX 602 ; N Alphatonos ; G 724 -U 903 ; WX 602 ; N anoteleia ; G 725 -U 904 ; WX 602 ; N Epsilontonos ; G 726 -U 905 ; WX 602 ; N Etatonos ; G 727 -U 906 ; WX 602 ; N Iotatonos ; G 728 -U 908 ; WX 602 ; N Omicrontonos ; G 729 -U 910 ; WX 602 ; N Upsilontonos ; G 730 -U 911 ; WX 602 ; N Omegatonos ; G 731 -U 912 ; WX 602 ; N iotadieresistonos ; G 732 -U 913 ; WX 602 ; N Alpha ; G 733 -U 914 ; WX 602 ; N Beta ; G 734 -U 915 ; WX 602 ; N Gamma ; G 735 -U 916 ; WX 602 ; N uni0394 ; G 736 -U 917 ; WX 602 ; N Epsilon ; G 737 -U 918 ; WX 602 ; N Zeta ; G 738 -U 919 ; WX 602 ; N Eta ; G 739 -U 920 ; WX 602 ; N Theta ; G 740 -U 921 ; WX 602 ; N Iota ; G 741 -U 922 ; WX 602 ; N Kappa ; G 742 -U 923 ; WX 602 ; N Lambda ; G 743 -U 924 ; WX 602 ; N Mu ; G 744 -U 925 ; WX 602 ; N Nu ; G 745 -U 926 ; WX 602 ; N Xi ; G 746 -U 927 ; WX 602 ; N Omicron ; G 747 -U 928 ; WX 602 ; N Pi ; G 748 -U 929 ; WX 602 ; N Rho ; G 749 -U 931 ; WX 602 ; N Sigma ; G 750 -U 932 ; WX 602 ; N Tau ; G 751 -U 933 ; WX 602 ; N Upsilon ; G 752 -U 934 ; WX 602 ; N Phi ; G 753 -U 935 ; WX 602 ; N Chi ; G 754 -U 936 ; WX 602 ; N Psi ; G 755 -U 937 ; WX 602 ; N Omega ; G 756 -U 938 ; WX 602 ; N Iotadieresis ; G 757 -U 939 ; WX 602 ; N Upsilondieresis ; G 758 -U 940 ; WX 602 ; N alphatonos ; G 759 -U 941 ; WX 602 ; N epsilontonos ; G 760 -U 942 ; WX 602 ; N etatonos ; G 761 -U 943 ; WX 602 ; N iotatonos ; G 762 -U 944 ; WX 602 ; N upsilondieresistonos ; G 763 -U 945 ; WX 602 ; N alpha ; G 764 -U 946 ; WX 602 ; N beta ; G 765 -U 947 ; WX 602 ; N gamma ; G 766 -U 948 ; WX 602 ; N delta ; G 767 -U 949 ; WX 602 ; N epsilon ; G 768 -U 950 ; WX 602 ; N zeta ; G 769 -U 951 ; WX 602 ; N eta ; G 770 -U 952 ; WX 602 ; N theta ; G 771 -U 953 ; WX 602 ; N iota ; G 772 -U 954 ; WX 602 ; N kappa ; G 773 -U 955 ; WX 602 ; N lambda ; G 774 -U 956 ; WX 602 ; N uni03BC ; G 775 -U 957 ; WX 602 ; N nu ; G 776 -U 958 ; WX 602 ; N xi ; G 777 -U 959 ; WX 602 ; N omicron ; G 778 -U 960 ; WX 602 ; N pi ; G 779 -U 961 ; WX 602 ; N rho ; G 780 -U 962 ; WX 602 ; N sigma1 ; G 781 -U 963 ; WX 602 ; N sigma ; G 782 -U 964 ; WX 602 ; N tau ; G 783 -U 965 ; WX 602 ; N upsilon ; G 784 -U 966 ; WX 602 ; N phi ; G 785 -U 967 ; WX 602 ; N chi ; G 786 -U 968 ; WX 602 ; N psi ; G 787 -U 969 ; WX 602 ; N omega ; G 788 -U 970 ; WX 602 ; N iotadieresis ; G 789 -U 971 ; WX 602 ; N upsilondieresis ; G 790 -U 972 ; WX 602 ; N omicrontonos ; G 791 -U 973 ; WX 602 ; N upsilontonos ; G 792 -U 974 ; WX 602 ; N omegatonos ; G 793 -U 976 ; WX 602 ; N uni03D0 ; G 794 -U 977 ; WX 602 ; N theta1 ; G 795 -U 978 ; WX 602 ; N Upsilon1 ; G 796 -U 979 ; WX 602 ; N uni03D3 ; G 797 -U 980 ; WX 602 ; N uni03D4 ; G 798 -U 981 ; WX 602 ; N phi1 ; G 799 -U 982 ; WX 602 ; N omega1 ; G 800 -U 983 ; WX 602 ; N uni03D7 ; G 801 -U 984 ; WX 602 ; N uni03D8 ; G 802 -U 985 ; WX 602 ; N uni03D9 ; G 803 -U 986 ; WX 602 ; N uni03DA ; G 804 -U 987 ; WX 602 ; N uni03DB ; G 805 -U 988 ; WX 602 ; N uni03DC ; G 806 -U 989 ; WX 602 ; N uni03DD ; G 807 -U 990 ; WX 602 ; N uni03DE ; G 808 -U 991 ; WX 602 ; N uni03DF ; G 809 -U 992 ; WX 602 ; N uni03E0 ; G 810 -U 993 ; WX 602 ; N uni03E1 ; G 811 -U 1008 ; WX 602 ; N uni03F0 ; G 812 -U 1009 ; WX 602 ; N uni03F1 ; G 813 -U 1010 ; WX 602 ; N uni03F2 ; G 814 -U 1011 ; WX 602 ; N uni03F3 ; G 815 -U 1012 ; WX 602 ; N uni03F4 ; G 816 -U 1013 ; WX 602 ; N uni03F5 ; G 817 -U 1014 ; WX 602 ; N uni03F6 ; G 818 -U 1015 ; WX 602 ; N uni03F7 ; G 819 -U 1016 ; WX 602 ; N uni03F8 ; G 820 -U 1017 ; WX 602 ; N uni03F9 ; G 821 -U 1018 ; WX 602 ; N uni03FA ; G 822 -U 1019 ; WX 602 ; N uni03FB ; G 823 -U 1020 ; WX 602 ; N uni03FC ; G 824 -U 1021 ; WX 602 ; N uni03FD ; G 825 -U 1022 ; WX 602 ; N uni03FE ; G 826 -U 1023 ; WX 602 ; N uni03FF ; G 827 -U 1024 ; WX 602 ; N uni0400 ; G 828 -U 1025 ; WX 602 ; N uni0401 ; G 829 -U 1026 ; WX 602 ; N uni0402 ; G 830 -U 1027 ; WX 602 ; N uni0403 ; G 831 -U 1028 ; WX 602 ; N uni0404 ; G 832 -U 1029 ; WX 602 ; N uni0405 ; G 833 -U 1030 ; WX 602 ; N uni0406 ; G 834 -U 1031 ; WX 602 ; N uni0407 ; G 835 -U 1032 ; WX 602 ; N uni0408 ; G 836 -U 1033 ; WX 602 ; N uni0409 ; G 837 -U 1034 ; WX 602 ; N uni040A ; G 838 -U 1035 ; WX 602 ; N uni040B ; G 839 -U 1036 ; WX 602 ; N uni040C ; G 840 -U 1037 ; WX 602 ; N uni040D ; G 841 -U 1038 ; WX 602 ; N uni040E ; G 842 -U 1039 ; WX 602 ; N uni040F ; G 843 -U 1040 ; WX 602 ; N uni0410 ; G 844 -U 1041 ; WX 602 ; N uni0411 ; G 845 -U 1042 ; WX 602 ; N uni0412 ; G 846 -U 1043 ; WX 602 ; N uni0413 ; G 847 -U 1044 ; WX 602 ; N uni0414 ; G 848 -U 1045 ; WX 602 ; N uni0415 ; G 849 -U 1046 ; WX 602 ; N uni0416 ; G 850 -U 1047 ; WX 602 ; N uni0417 ; G 851 -U 1048 ; WX 602 ; N uni0418 ; G 852 -U 1049 ; WX 602 ; N uni0419 ; G 853 -U 1050 ; WX 602 ; N uni041A ; G 854 -U 1051 ; WX 602 ; N uni041B ; G 855 -U 1052 ; WX 602 ; N uni041C ; G 856 -U 1053 ; WX 602 ; N uni041D ; G 857 -U 1054 ; WX 602 ; N uni041E ; G 858 -U 1055 ; WX 602 ; N uni041F ; G 859 -U 1056 ; WX 602 ; N uni0420 ; G 860 -U 1057 ; WX 602 ; N uni0421 ; G 861 -U 1058 ; WX 602 ; N uni0422 ; G 862 -U 1059 ; WX 602 ; N uni0423 ; G 863 -U 1060 ; WX 602 ; N uni0424 ; G 864 -U 1061 ; WX 602 ; N uni0425 ; G 865 -U 1062 ; WX 602 ; N uni0426 ; G 866 -U 1063 ; WX 602 ; N uni0427 ; G 867 -U 1064 ; WX 602 ; N uni0428 ; G 868 -U 1065 ; WX 602 ; N uni0429 ; G 869 -U 1066 ; WX 602 ; N uni042A ; G 870 -U 1067 ; WX 602 ; N uni042B ; G 871 -U 1068 ; WX 602 ; N uni042C ; G 872 -U 1069 ; WX 602 ; N uni042D ; G 873 -U 1070 ; WX 602 ; N uni042E ; G 874 -U 1071 ; WX 602 ; N uni042F ; G 875 -U 1072 ; WX 602 ; N uni0430 ; G 876 -U 1073 ; WX 602 ; N uni0431 ; G 877 -U 1074 ; WX 602 ; N uni0432 ; G 878 -U 1075 ; WX 602 ; N uni0433 ; G 879 -U 1076 ; WX 602 ; N uni0434 ; G 880 -U 1077 ; WX 602 ; N uni0435 ; G 881 -U 1078 ; WX 602 ; N uni0436 ; G 882 -U 1079 ; WX 602 ; N uni0437 ; G 883 -U 1080 ; WX 602 ; N uni0438 ; G 884 -U 1081 ; WX 602 ; N uni0439 ; G 885 -U 1082 ; WX 602 ; N uni043A ; G 886 -U 1083 ; WX 602 ; N uni043B ; G 887 -U 1084 ; WX 602 ; N uni043C ; G 888 -U 1085 ; WX 602 ; N uni043D ; G 889 -U 1086 ; WX 602 ; N uni043E ; G 890 -U 1087 ; WX 602 ; N uni043F ; G 891 -U 1088 ; WX 602 ; N uni0440 ; G 892 -U 1089 ; WX 602 ; N uni0441 ; G 893 -U 1090 ; WX 602 ; N uni0442 ; G 894 -U 1091 ; WX 602 ; N uni0443 ; G 895 -U 1092 ; WX 602 ; N uni0444 ; G 896 -U 1093 ; WX 602 ; N uni0445 ; G 897 -U 1094 ; WX 602 ; N uni0446 ; G 898 -U 1095 ; WX 602 ; N uni0447 ; G 899 -U 1096 ; WX 602 ; N uni0448 ; G 900 -U 1097 ; WX 602 ; N uni0449 ; G 901 -U 1098 ; WX 602 ; N uni044A ; G 902 -U 1099 ; WX 602 ; N uni044B ; G 903 -U 1100 ; WX 602 ; N uni044C ; G 904 -U 1101 ; WX 602 ; N uni044D ; G 905 -U 1102 ; WX 602 ; N uni044E ; G 906 -U 1103 ; WX 602 ; N uni044F ; G 907 -U 1104 ; WX 602 ; N uni0450 ; G 908 -U 1105 ; WX 602 ; N uni0451 ; G 909 -U 1106 ; WX 602 ; N uni0452 ; G 910 -U 1107 ; WX 602 ; N uni0453 ; G 911 -U 1108 ; WX 602 ; N uni0454 ; G 912 -U 1109 ; WX 602 ; N uni0455 ; G 913 -U 1110 ; WX 602 ; N uni0456 ; G 914 -U 1111 ; WX 602 ; N uni0457 ; G 915 -U 1112 ; WX 602 ; N uni0458 ; G 916 -U 1113 ; WX 602 ; N uni0459 ; G 917 -U 1114 ; WX 602 ; N uni045A ; G 918 -U 1115 ; WX 602 ; N uni045B ; G 919 -U 1116 ; WX 602 ; N uni045C ; G 920 -U 1117 ; WX 602 ; N uni045D ; G 921 -U 1118 ; WX 602 ; N uni045E ; G 922 -U 1119 ; WX 602 ; N uni045F ; G 923 -U 1122 ; WX 602 ; N uni0462 ; G 924 -U 1123 ; WX 602 ; N uni0463 ; G 925 -U 1138 ; WX 602 ; N uni0472 ; G 926 -U 1139 ; WX 602 ; N uni0473 ; G 927 -U 1168 ; WX 602 ; N uni0490 ; G 928 -U 1169 ; WX 602 ; N uni0491 ; G 929 -U 1170 ; WX 602 ; N uni0492 ; G 930 -U 1171 ; WX 602 ; N uni0493 ; G 931 -U 1172 ; WX 602 ; N uni0494 ; G 932 -U 1173 ; WX 602 ; N uni0495 ; G 933 -U 1174 ; WX 602 ; N uni0496 ; G 934 -U 1175 ; WX 602 ; N uni0497 ; G 935 -U 1176 ; WX 602 ; N uni0498 ; G 936 -U 1177 ; WX 602 ; N uni0499 ; G 937 -U 1178 ; WX 602 ; N uni049A ; G 938 -U 1179 ; WX 602 ; N uni049B ; G 939 -U 1186 ; WX 602 ; N uni04A2 ; G 940 -U 1187 ; WX 602 ; N uni04A3 ; G 941 -U 1188 ; WX 602 ; N uni04A4 ; G 942 -U 1189 ; WX 602 ; N uni04A5 ; G 943 -U 1194 ; WX 602 ; N uni04AA ; G 944 -U 1195 ; WX 602 ; N uni04AB ; G 945 -U 1196 ; WX 602 ; N uni04AC ; G 946 -U 1197 ; WX 602 ; N uni04AD ; G 947 -U 1198 ; WX 602 ; N uni04AE ; G 948 -U 1199 ; WX 602 ; N uni04AF ; G 949 -U 1200 ; WX 602 ; N uni04B0 ; G 950 -U 1201 ; WX 602 ; N uni04B1 ; G 951 -U 1202 ; WX 602 ; N uni04B2 ; G 952 -U 1203 ; WX 602 ; N uni04B3 ; G 953 -U 1210 ; WX 602 ; N uni04BA ; G 954 -U 1211 ; WX 602 ; N uni04BB ; G 955 -U 1216 ; WX 602 ; N uni04C0 ; G 956 -U 1217 ; WX 602 ; N uni04C1 ; G 957 -U 1218 ; WX 602 ; N uni04C2 ; G 958 -U 1219 ; WX 602 ; N uni04C3 ; G 959 -U 1220 ; WX 602 ; N uni04C4 ; G 960 -U 1223 ; WX 602 ; N uni04C7 ; G 961 -U 1224 ; WX 602 ; N uni04C8 ; G 962 -U 1227 ; WX 602 ; N uni04CB ; G 963 -U 1228 ; WX 602 ; N uni04CC ; G 964 -U 1231 ; WX 602 ; N uni04CF ; G 965 -U 1232 ; WX 602 ; N uni04D0 ; G 966 -U 1233 ; WX 602 ; N uni04D1 ; G 967 -U 1234 ; WX 602 ; N uni04D2 ; G 968 -U 1235 ; WX 602 ; N uni04D3 ; G 969 -U 1236 ; WX 602 ; N uni04D4 ; G 970 -U 1237 ; WX 602 ; N uni04D5 ; G 971 -U 1238 ; WX 602 ; N uni04D6 ; G 972 -U 1239 ; WX 602 ; N uni04D7 ; G 973 -U 1240 ; WX 602 ; N uni04D8 ; G 974 -U 1241 ; WX 602 ; N uni04D9 ; G 975 -U 1242 ; WX 602 ; N uni04DA ; G 976 -U 1243 ; WX 602 ; N uni04DB ; G 977 -U 1244 ; WX 602 ; N uni04DC ; G 978 -U 1245 ; WX 602 ; N uni04DD ; G 979 -U 1246 ; WX 602 ; N uni04DE ; G 980 -U 1247 ; WX 602 ; N uni04DF ; G 981 -U 1248 ; WX 602 ; N uni04E0 ; G 982 -U 1249 ; WX 602 ; N uni04E1 ; G 983 -U 1250 ; WX 602 ; N uni04E2 ; G 984 -U 1251 ; WX 602 ; N uni04E3 ; G 985 -U 1252 ; WX 602 ; N uni04E4 ; G 986 -U 1253 ; WX 602 ; N uni04E5 ; G 987 -U 1254 ; WX 602 ; N uni04E6 ; G 988 -U 1255 ; WX 602 ; N uni04E7 ; G 989 -U 1256 ; WX 602 ; N uni04E8 ; G 990 -U 1257 ; WX 602 ; N uni04E9 ; G 991 -U 1258 ; WX 602 ; N uni04EA ; G 992 -U 1259 ; WX 602 ; N uni04EB ; G 993 -U 1260 ; WX 602 ; N uni04EC ; G 994 -U 1261 ; WX 602 ; N uni04ED ; G 995 -U 1262 ; WX 602 ; N uni04EE ; G 996 -U 1263 ; WX 602 ; N uni04EF ; G 997 -U 1264 ; WX 602 ; N uni04F0 ; G 998 -U 1265 ; WX 602 ; N uni04F1 ; G 999 -U 1266 ; WX 602 ; N uni04F2 ; G 1000 -U 1267 ; WX 602 ; N uni04F3 ; G 1001 -U 1268 ; WX 602 ; N uni04F4 ; G 1002 -U 1269 ; WX 602 ; N uni04F5 ; G 1003 -U 1270 ; WX 602 ; N uni04F6 ; G 1004 -U 1271 ; WX 602 ; N uni04F7 ; G 1005 -U 1272 ; WX 602 ; N uni04F8 ; G 1006 -U 1273 ; WX 602 ; N uni04F9 ; G 1007 -U 1296 ; WX 602 ; N uni0510 ; G 1008 -U 1297 ; WX 602 ; N uni0511 ; G 1009 -U 1306 ; WX 602 ; N uni051A ; G 1010 -U 1307 ; WX 602 ; N uni051B ; G 1011 -U 1308 ; WX 602 ; N uni051C ; G 1012 -U 1309 ; WX 602 ; N uni051D ; G 1013 -U 1329 ; WX 602 ; N uni0531 ; G 1014 -U 1330 ; WX 602 ; N uni0532 ; G 1015 -U 1331 ; WX 602 ; N uni0533 ; G 1016 -U 1332 ; WX 602 ; N uni0534 ; G 1017 -U 1333 ; WX 602 ; N uni0535 ; G 1018 -U 1334 ; WX 602 ; N uni0536 ; G 1019 -U 1335 ; WX 602 ; N uni0537 ; G 1020 -U 1336 ; WX 602 ; N uni0538 ; G 1021 -U 1337 ; WX 602 ; N uni0539 ; G 1022 -U 1338 ; WX 602 ; N uni053A ; G 1023 -U 1339 ; WX 602 ; N uni053B ; G 1024 -U 1340 ; WX 602 ; N uni053C ; G 1025 -U 1341 ; WX 602 ; N uni053D ; G 1026 -U 1342 ; WX 602 ; N uni053E ; G 1027 -U 1343 ; WX 602 ; N uni053F ; G 1028 -U 1344 ; WX 602 ; N uni0540 ; G 1029 -U 1345 ; WX 602 ; N uni0541 ; G 1030 -U 1346 ; WX 602 ; N uni0542 ; G 1031 -U 1347 ; WX 602 ; N uni0543 ; G 1032 -U 1348 ; WX 602 ; N uni0544 ; G 1033 -U 1349 ; WX 602 ; N uni0545 ; G 1034 -U 1350 ; WX 602 ; N uni0546 ; G 1035 -U 1351 ; WX 602 ; N uni0547 ; G 1036 -U 1352 ; WX 602 ; N uni0548 ; G 1037 -U 1353 ; WX 602 ; N uni0549 ; G 1038 -U 1354 ; WX 602 ; N uni054A ; G 1039 -U 1355 ; WX 602 ; N uni054B ; G 1040 -U 1356 ; WX 602 ; N uni054C ; G 1041 -U 1357 ; WX 602 ; N uni054D ; G 1042 -U 1358 ; WX 602 ; N uni054E ; G 1043 -U 1359 ; WX 602 ; N uni054F ; G 1044 -U 1360 ; WX 602 ; N uni0550 ; G 1045 -U 1361 ; WX 602 ; N uni0551 ; G 1046 -U 1362 ; WX 602 ; N uni0552 ; G 1047 -U 1363 ; WX 602 ; N uni0553 ; G 1048 -U 1364 ; WX 602 ; N uni0554 ; G 1049 -U 1365 ; WX 602 ; N uni0555 ; G 1050 -U 1366 ; WX 602 ; N uni0556 ; G 1051 -U 1369 ; WX 602 ; N uni0559 ; G 1052 -U 1370 ; WX 602 ; N uni055A ; G 1053 -U 1371 ; WX 602 ; N uni055B ; G 1054 -U 1372 ; WX 602 ; N uni055C ; G 1055 -U 1373 ; WX 602 ; N uni055D ; G 1056 -U 1374 ; WX 602 ; N uni055E ; G 1057 -U 1375 ; WX 602 ; N uni055F ; G 1058 -U 1377 ; WX 602 ; N uni0561 ; G 1059 -U 1378 ; WX 602 ; N uni0562 ; G 1060 -U 1379 ; WX 602 ; N uni0563 ; G 1061 -U 1380 ; WX 602 ; N uni0564 ; G 1062 -U 1381 ; WX 602 ; N uni0565 ; G 1063 -U 1382 ; WX 602 ; N uni0566 ; G 1064 -U 1383 ; WX 602 ; N uni0567 ; G 1065 -U 1384 ; WX 602 ; N uni0568 ; G 1066 -U 1385 ; WX 602 ; N uni0569 ; G 1067 -U 1386 ; WX 602 ; N uni056A ; G 1068 -U 1387 ; WX 602 ; N uni056B ; G 1069 -U 1388 ; WX 602 ; N uni056C ; G 1070 -U 1389 ; WX 602 ; N uni056D ; G 1071 -U 1390 ; WX 602 ; N uni056E ; G 1072 -U 1391 ; WX 602 ; N uni056F ; G 1073 -U 1392 ; WX 602 ; N uni0570 ; G 1074 -U 1393 ; WX 602 ; N uni0571 ; G 1075 -U 1394 ; WX 602 ; N uni0572 ; G 1076 -U 1395 ; WX 602 ; N uni0573 ; G 1077 -U 1396 ; WX 602 ; N uni0574 ; G 1078 -U 1397 ; WX 602 ; N uni0575 ; G 1079 -U 1398 ; WX 602 ; N uni0576 ; G 1080 -U 1399 ; WX 602 ; N uni0577 ; G 1081 -U 1400 ; WX 602 ; N uni0578 ; G 1082 -U 1401 ; WX 602 ; N uni0579 ; G 1083 -U 1402 ; WX 602 ; N uni057A ; G 1084 -U 1403 ; WX 602 ; N uni057B ; G 1085 -U 1404 ; WX 602 ; N uni057C ; G 1086 -U 1405 ; WX 602 ; N uni057D ; G 1087 -U 1406 ; WX 602 ; N uni057E ; G 1088 -U 1407 ; WX 602 ; N uni057F ; G 1089 -U 1408 ; WX 602 ; N uni0580 ; G 1090 -U 1409 ; WX 602 ; N uni0581 ; G 1091 -U 1410 ; WX 602 ; N uni0582 ; G 1092 -U 1411 ; WX 602 ; N uni0583 ; G 1093 -U 1412 ; WX 602 ; N uni0584 ; G 1094 -U 1413 ; WX 602 ; N uni0585 ; G 1095 -U 1414 ; WX 602 ; N uni0586 ; G 1096 -U 1415 ; WX 602 ; N uni0587 ; G 1097 -U 1417 ; WX 602 ; N uni0589 ; G 1098 -U 1418 ; WX 602 ; N uni058A ; G 1099 -U 3647 ; WX 602 ; N uni0E3F ; G 1100 -U 3713 ; WX 602 ; N uni0E81 ; G 1101 -U 3714 ; WX 602 ; N uni0E82 ; G 1102 -U 3716 ; WX 602 ; N uni0E84 ; G 1103 -U 3719 ; WX 602 ; N uni0E87 ; G 1104 -U 3720 ; WX 602 ; N uni0E88 ; G 1105 -U 3722 ; WX 602 ; N uni0E8A ; G 1106 -U 3725 ; WX 602 ; N uni0E8D ; G 1107 -U 3732 ; WX 602 ; N uni0E94 ; G 1108 -U 3733 ; WX 602 ; N uni0E95 ; G 1109 -U 3734 ; WX 602 ; N uni0E96 ; G 1110 -U 3735 ; WX 602 ; N uni0E97 ; G 1111 -U 3737 ; WX 602 ; N uni0E99 ; G 1112 -U 3738 ; WX 602 ; N uni0E9A ; G 1113 -U 3739 ; WX 602 ; N uni0E9B ; G 1114 -U 3740 ; WX 602 ; N uni0E9C ; G 1115 -U 3741 ; WX 602 ; N uni0E9D ; G 1116 -U 3742 ; WX 602 ; N uni0E9E ; G 1117 -U 3743 ; WX 602 ; N uni0E9F ; G 1118 -U 3745 ; WX 602 ; N uni0EA1 ; G 1119 -U 3746 ; WX 602 ; N uni0EA2 ; G 1120 -U 3747 ; WX 602 ; N uni0EA3 ; G 1121 -U 3749 ; WX 602 ; N uni0EA5 ; G 1122 -U 3751 ; WX 602 ; N uni0EA7 ; G 1123 -U 3754 ; WX 602 ; N uni0EAA ; G 1124 -U 3755 ; WX 602 ; N uni0EAB ; G 1125 -U 3757 ; WX 602 ; N uni0EAD ; G 1126 -U 3758 ; WX 602 ; N uni0EAE ; G 1127 -U 3759 ; WX 602 ; N uni0EAF ; G 1128 -U 3760 ; WX 602 ; N uni0EB0 ; G 1129 -U 3761 ; WX 602 ; N uni0EB1 ; G 1130 -U 3762 ; WX 602 ; N uni0EB2 ; G 1131 -U 3763 ; WX 602 ; N uni0EB3 ; G 1132 -U 3764 ; WX 602 ; N uni0EB4 ; G 1133 -U 3765 ; WX 602 ; N uni0EB5 ; G 1134 -U 3766 ; WX 602 ; N uni0EB6 ; G 1135 -U 3767 ; WX 602 ; N uni0EB7 ; G 1136 -U 3768 ; WX 602 ; N uni0EB8 ; G 1137 -U 3769 ; WX 602 ; N uni0EB9 ; G 1138 -U 3771 ; WX 602 ; N uni0EBB ; G 1139 -U 3772 ; WX 602 ; N uni0EBC ; G 1140 -U 3784 ; WX 602 ; N uni0EC8 ; G 1141 -U 3785 ; WX 602 ; N uni0EC9 ; G 1142 -U 3786 ; WX 602 ; N uni0ECA ; G 1143 -U 3787 ; WX 602 ; N uni0ECB ; G 1144 -U 3788 ; WX 602 ; N uni0ECC ; G 1145 -U 3789 ; WX 602 ; N uni0ECD ; G 1146 -U 4304 ; WX 602 ; N uni10D0 ; G 1147 -U 4305 ; WX 602 ; N uni10D1 ; G 1148 -U 4306 ; WX 602 ; N uni10D2 ; G 1149 -U 4307 ; WX 602 ; N uni10D3 ; G 1150 -U 4308 ; WX 602 ; N uni10D4 ; G 1151 -U 4309 ; WX 602 ; N uni10D5 ; G 1152 -U 4310 ; WX 602 ; N uni10D6 ; G 1153 -U 4311 ; WX 602 ; N uni10D7 ; G 1154 -U 4312 ; WX 602 ; N uni10D8 ; G 1155 -U 4313 ; WX 602 ; N uni10D9 ; G 1156 -U 4314 ; WX 602 ; N uni10DA ; G 1157 -U 4315 ; WX 602 ; N uni10DB ; G 1158 -U 4316 ; WX 602 ; N uni10DC ; G 1159 -U 4317 ; WX 602 ; N uni10DD ; G 1160 -U 4318 ; WX 602 ; N uni10DE ; G 1161 -U 4319 ; WX 602 ; N uni10DF ; G 1162 -U 4320 ; WX 602 ; N uni10E0 ; G 1163 -U 4321 ; WX 602 ; N uni10E1 ; G 1164 -U 4322 ; WX 602 ; N uni10E2 ; G 1165 -U 4323 ; WX 602 ; N uni10E3 ; G 1166 -U 4324 ; WX 602 ; N uni10E4 ; G 1167 -U 4325 ; WX 602 ; N uni10E5 ; G 1168 -U 4326 ; WX 602 ; N uni10E6 ; G 1169 -U 4327 ; WX 602 ; N uni10E7 ; G 1170 -U 4328 ; WX 602 ; N uni10E8 ; G 1171 -U 4329 ; WX 602 ; N uni10E9 ; G 1172 -U 4330 ; WX 602 ; N uni10EA ; G 1173 -U 4331 ; WX 602 ; N uni10EB ; G 1174 -U 4332 ; WX 602 ; N uni10EC ; G 1175 -U 4333 ; WX 602 ; N uni10ED ; G 1176 -U 4334 ; WX 602 ; N uni10EE ; G 1177 -U 4335 ; WX 602 ; N uni10EF ; G 1178 -U 4336 ; WX 602 ; N uni10F0 ; G 1179 -U 4337 ; WX 602 ; N uni10F1 ; G 1180 -U 4338 ; WX 602 ; N uni10F2 ; G 1181 -U 4339 ; WX 602 ; N uni10F3 ; G 1182 -U 4340 ; WX 602 ; N uni10F4 ; G 1183 -U 4341 ; WX 602 ; N uni10F5 ; G 1184 -U 4342 ; WX 602 ; N uni10F6 ; G 1185 -U 4343 ; WX 602 ; N uni10F7 ; G 1186 -U 4344 ; WX 602 ; N uni10F8 ; G 1187 -U 4345 ; WX 602 ; N uni10F9 ; G 1188 -U 4346 ; WX 602 ; N uni10FA ; G 1189 -U 4347 ; WX 602 ; N uni10FB ; G 1190 -U 4348 ; WX 602 ; N uni10FC ; G 1191 -U 7426 ; WX 602 ; N uni1D02 ; G 1192 -U 7432 ; WX 602 ; N uni1D08 ; G 1193 -U 7433 ; WX 602 ; N uni1D09 ; G 1194 -U 7444 ; WX 602 ; N uni1D14 ; G 1195 -U 7446 ; WX 602 ; N uni1D16 ; G 1196 -U 7447 ; WX 602 ; N uni1D17 ; G 1197 -U 7453 ; WX 602 ; N uni1D1D ; G 1198 -U 7454 ; WX 602 ; N uni1D1E ; G 1199 -U 7455 ; WX 602 ; N uni1D1F ; G 1200 -U 7468 ; WX 602 ; N uni1D2C ; G 1201 -U 7469 ; WX 602 ; N uni1D2D ; G 1202 -U 7470 ; WX 602 ; N uni1D2E ; G 1203 -U 7472 ; WX 602 ; N uni1D30 ; G 1204 -U 7473 ; WX 602 ; N uni1D31 ; G 1205 -U 7474 ; WX 602 ; N uni1D32 ; G 1206 -U 7475 ; WX 602 ; N uni1D33 ; G 1207 -U 7476 ; WX 602 ; N uni1D34 ; G 1208 -U 7477 ; WX 602 ; N uni1D35 ; G 1209 -U 7478 ; WX 602 ; N uni1D36 ; G 1210 -U 7479 ; WX 602 ; N uni1D37 ; G 1211 -U 7480 ; WX 602 ; N uni1D38 ; G 1212 -U 7481 ; WX 602 ; N uni1D39 ; G 1213 -U 7482 ; WX 602 ; N uni1D3A ; G 1214 -U 7483 ; WX 602 ; N uni1D3B ; G 1215 -U 7484 ; WX 602 ; N uni1D3C ; G 1216 -U 7485 ; WX 602 ; N uni1D3D ; G 1217 -U 7486 ; WX 602 ; N uni1D3E ; G 1218 -U 7487 ; WX 602 ; N uni1D3F ; G 1219 -U 7488 ; WX 602 ; N uni1D40 ; G 1220 -U 7489 ; WX 602 ; N uni1D41 ; G 1221 -U 7490 ; WX 602 ; N uni1D42 ; G 1222 -U 7491 ; WX 602 ; N uni1D43 ; G 1223 -U 7492 ; WX 602 ; N uni1D44 ; G 1224 -U 7493 ; WX 602 ; N uni1D45 ; G 1225 -U 7494 ; WX 602 ; N uni1D46 ; G 1226 -U 7495 ; WX 602 ; N uni1D47 ; G 1227 -U 7496 ; WX 602 ; N uni1D48 ; G 1228 -U 7497 ; WX 602 ; N uni1D49 ; G 1229 -U 7498 ; WX 602 ; N uni1D4A ; G 1230 -U 7499 ; WX 602 ; N uni1D4B ; G 1231 -U 7500 ; WX 602 ; N uni1D4C ; G 1232 -U 7501 ; WX 602 ; N uni1D4D ; G 1233 -U 7502 ; WX 602 ; N uni1D4E ; G 1234 -U 7503 ; WX 602 ; N uni1D4F ; G 1235 -U 7504 ; WX 602 ; N uni1D50 ; G 1236 -U 7505 ; WX 602 ; N uni1D51 ; G 1237 -U 7506 ; WX 602 ; N uni1D52 ; G 1238 -U 7507 ; WX 602 ; N uni1D53 ; G 1239 -U 7508 ; WX 602 ; N uni1D54 ; G 1240 -U 7509 ; WX 602 ; N uni1D55 ; G 1241 -U 7510 ; WX 602 ; N uni1D56 ; G 1242 -U 7511 ; WX 602 ; N uni1D57 ; G 1243 -U 7512 ; WX 602 ; N uni1D58 ; G 1244 -U 7513 ; WX 602 ; N uni1D59 ; G 1245 -U 7514 ; WX 602 ; N uni1D5A ; G 1246 -U 7515 ; WX 602 ; N uni1D5B ; G 1247 -U 7522 ; WX 602 ; N uni1D62 ; G 1248 -U 7523 ; WX 602 ; N uni1D63 ; G 1249 -U 7524 ; WX 602 ; N uni1D64 ; G 1250 -U 7525 ; WX 602 ; N uni1D65 ; G 1251 -U 7543 ; WX 602 ; N uni1D77 ; G 1252 -U 7544 ; WX 602 ; N uni1D78 ; G 1253 -U 7547 ; WX 602 ; N uni1D7B ; G 1254 -U 7557 ; WX 602 ; N uni1D85 ; G 1255 -U 7579 ; WX 602 ; N uni1D9B ; G 1256 -U 7580 ; WX 602 ; N uni1D9C ; G 1257 -U 7581 ; WX 602 ; N uni1D9D ; G 1258 -U 7582 ; WX 602 ; N uni1D9E ; G 1259 -U 7583 ; WX 602 ; N uni1D9F ; G 1260 -U 7584 ; WX 602 ; N uni1DA0 ; G 1261 -U 7585 ; WX 602 ; N uni1DA1 ; G 1262 -U 7586 ; WX 602 ; N uni1DA2 ; G 1263 -U 7587 ; WX 602 ; N uni1DA3 ; G 1264 -U 7588 ; WX 602 ; N uni1DA4 ; G 1265 -U 7589 ; WX 602 ; N uni1DA5 ; G 1266 -U 7590 ; WX 602 ; N uni1DA6 ; G 1267 -U 7591 ; WX 602 ; N uni1DA7 ; G 1268 -U 7592 ; WX 602 ; N uni1DA8 ; G 1269 -U 7593 ; WX 602 ; N uni1DA9 ; G 1270 -U 7594 ; WX 602 ; N uni1DAA ; G 1271 -U 7595 ; WX 602 ; N uni1DAB ; G 1272 -U 7596 ; WX 602 ; N uni1DAC ; G 1273 -U 7597 ; WX 602 ; N uni1DAD ; G 1274 -U 7598 ; WX 602 ; N uni1DAE ; G 1275 -U 7599 ; WX 602 ; N uni1DAF ; G 1276 -U 7600 ; WX 602 ; N uni1DB0 ; G 1277 -U 7601 ; WX 602 ; N uni1DB1 ; G 1278 -U 7602 ; WX 602 ; N uni1DB2 ; G 1279 -U 7603 ; WX 602 ; N uni1DB3 ; G 1280 -U 7604 ; WX 602 ; N uni1DB4 ; G 1281 -U 7605 ; WX 602 ; N uni1DB5 ; G 1282 -U 7606 ; WX 602 ; N uni1DB6 ; G 1283 -U 7607 ; WX 602 ; N uni1DB7 ; G 1284 -U 7609 ; WX 602 ; N uni1DB9 ; G 1285 -U 7610 ; WX 602 ; N uni1DBA ; G 1286 -U 7611 ; WX 602 ; N uni1DBB ; G 1287 -U 7612 ; WX 602 ; N uni1DBC ; G 1288 -U 7613 ; WX 602 ; N uni1DBD ; G 1289 -U 7614 ; WX 602 ; N uni1DBE ; G 1290 -U 7615 ; WX 602 ; N uni1DBF ; G 1291 -U 7680 ; WX 602 ; N uni1E00 ; G 1292 -U 7681 ; WX 602 ; N uni1E01 ; G 1293 -U 7682 ; WX 602 ; N uni1E02 ; G 1294 -U 7683 ; WX 602 ; N uni1E03 ; G 1295 -U 7684 ; WX 602 ; N uni1E04 ; G 1296 -U 7685 ; WX 602 ; N uni1E05 ; G 1297 -U 7686 ; WX 602 ; N uni1E06 ; G 1298 -U 7687 ; WX 602 ; N uni1E07 ; G 1299 -U 7688 ; WX 602 ; N uni1E08 ; G 1300 -U 7689 ; WX 602 ; N uni1E09 ; G 1301 -U 7690 ; WX 602 ; N uni1E0A ; G 1302 -U 7691 ; WX 602 ; N uni1E0B ; G 1303 -U 7692 ; WX 602 ; N uni1E0C ; G 1304 -U 7693 ; WX 602 ; N uni1E0D ; G 1305 -U 7694 ; WX 602 ; N uni1E0E ; G 1306 -U 7695 ; WX 602 ; N uni1E0F ; G 1307 -U 7696 ; WX 602 ; N uni1E10 ; G 1308 -U 7697 ; WX 602 ; N uni1E11 ; G 1309 -U 7698 ; WX 602 ; N uni1E12 ; G 1310 -U 7699 ; WX 602 ; N uni1E13 ; G 1311 -U 7704 ; WX 602 ; N uni1E18 ; G 1312 -U 7705 ; WX 602 ; N uni1E19 ; G 1313 -U 7706 ; WX 602 ; N uni1E1A ; G 1314 -U 7707 ; WX 602 ; N uni1E1B ; G 1315 -U 7708 ; WX 602 ; N uni1E1C ; G 1316 -U 7709 ; WX 602 ; N uni1E1D ; G 1317 -U 7710 ; WX 602 ; N uni1E1E ; G 1318 -U 7711 ; WX 602 ; N uni1E1F ; G 1319 -U 7712 ; WX 602 ; N uni1E20 ; G 1320 -U 7713 ; WX 602 ; N uni1E21 ; G 1321 -U 7714 ; WX 602 ; N uni1E22 ; G 1322 -U 7715 ; WX 602 ; N uni1E23 ; G 1323 -U 7716 ; WX 602 ; N uni1E24 ; G 1324 -U 7717 ; WX 602 ; N uni1E25 ; G 1325 -U 7718 ; WX 602 ; N uni1E26 ; G 1326 -U 7719 ; WX 602 ; N uni1E27 ; G 1327 -U 7720 ; WX 602 ; N uni1E28 ; G 1328 -U 7721 ; WX 602 ; N uni1E29 ; G 1329 -U 7722 ; WX 602 ; N uni1E2A ; G 1330 -U 7723 ; WX 602 ; N uni1E2B ; G 1331 -U 7724 ; WX 602 ; N uni1E2C ; G 1332 -U 7725 ; WX 602 ; N uni1E2D ; G 1333 -U 7728 ; WX 602 ; N uni1E30 ; G 1334 -U 7729 ; WX 602 ; N uni1E31 ; G 1335 -U 7730 ; WX 602 ; N uni1E32 ; G 1336 -U 7731 ; WX 602 ; N uni1E33 ; G 1337 -U 7732 ; WX 602 ; N uni1E34 ; G 1338 -U 7733 ; WX 602 ; N uni1E35 ; G 1339 -U 7734 ; WX 602 ; N uni1E36 ; G 1340 -U 7735 ; WX 602 ; N uni1E37 ; G 1341 -U 7736 ; WX 602 ; N uni1E38 ; G 1342 -U 7737 ; WX 602 ; N uni1E39 ; G 1343 -U 7738 ; WX 602 ; N uni1E3A ; G 1344 -U 7739 ; WX 602 ; N uni1E3B ; G 1345 -U 7740 ; WX 602 ; N uni1E3C ; G 1346 -U 7741 ; WX 602 ; N uni1E3D ; G 1347 -U 7742 ; WX 602 ; N uni1E3E ; G 1348 -U 7743 ; WX 602 ; N uni1E3F ; G 1349 -U 7744 ; WX 602 ; N uni1E40 ; G 1350 -U 7745 ; WX 602 ; N uni1E41 ; G 1351 -U 7746 ; WX 602 ; N uni1E42 ; G 1352 -U 7747 ; WX 602 ; N uni1E43 ; G 1353 -U 7748 ; WX 602 ; N uni1E44 ; G 1354 -U 7749 ; WX 602 ; N uni1E45 ; G 1355 -U 7750 ; WX 602 ; N uni1E46 ; G 1356 -U 7751 ; WX 602 ; N uni1E47 ; G 1357 -U 7752 ; WX 602 ; N uni1E48 ; G 1358 -U 7753 ; WX 602 ; N uni1E49 ; G 1359 -U 7754 ; WX 602 ; N uni1E4A ; G 1360 -U 7755 ; WX 602 ; N uni1E4B ; G 1361 -U 7756 ; WX 602 ; N uni1E4C ; G 1362 -U 7757 ; WX 602 ; N uni1E4D ; G 1363 -U 7764 ; WX 602 ; N uni1E54 ; G 1364 -U 7765 ; WX 602 ; N uni1E55 ; G 1365 -U 7766 ; WX 602 ; N uni1E56 ; G 1366 -U 7767 ; WX 602 ; N uni1E57 ; G 1367 -U 7768 ; WX 602 ; N uni1E58 ; G 1368 -U 7769 ; WX 602 ; N uni1E59 ; G 1369 -U 7770 ; WX 602 ; N uni1E5A ; G 1370 -U 7771 ; WX 602 ; N uni1E5B ; G 1371 -U 7772 ; WX 602 ; N uni1E5C ; G 1372 -U 7773 ; WX 602 ; N uni1E5D ; G 1373 -U 7774 ; WX 602 ; N uni1E5E ; G 1374 -U 7775 ; WX 602 ; N uni1E5F ; G 1375 -U 7776 ; WX 602 ; N uni1E60 ; G 1376 -U 7777 ; WX 602 ; N uni1E61 ; G 1377 -U 7778 ; WX 602 ; N uni1E62 ; G 1378 -U 7779 ; WX 602 ; N uni1E63 ; G 1379 -U 7784 ; WX 602 ; N uni1E68 ; G 1380 -U 7785 ; WX 602 ; N uni1E69 ; G 1381 -U 7786 ; WX 602 ; N uni1E6A ; G 1382 -U 7787 ; WX 602 ; N uni1E6B ; G 1383 -U 7788 ; WX 602 ; N uni1E6C ; G 1384 -U 7789 ; WX 602 ; N uni1E6D ; G 1385 -U 7790 ; WX 602 ; N uni1E6E ; G 1386 -U 7791 ; WX 602 ; N uni1E6F ; G 1387 -U 7792 ; WX 602 ; N uni1E70 ; G 1388 -U 7793 ; WX 602 ; N uni1E71 ; G 1389 -U 7794 ; WX 602 ; N uni1E72 ; G 1390 -U 7795 ; WX 602 ; N uni1E73 ; G 1391 -U 7796 ; WX 602 ; N uni1E74 ; G 1392 -U 7797 ; WX 602 ; N uni1E75 ; G 1393 -U 7798 ; WX 602 ; N uni1E76 ; G 1394 -U 7799 ; WX 602 ; N uni1E77 ; G 1395 -U 7800 ; WX 602 ; N uni1E78 ; G 1396 -U 7801 ; WX 602 ; N uni1E79 ; G 1397 -U 7804 ; WX 602 ; N uni1E7C ; G 1398 -U 7805 ; WX 602 ; N uni1E7D ; G 1399 -U 7806 ; WX 602 ; N uni1E7E ; G 1400 -U 7807 ; WX 602 ; N uni1E7F ; G 1401 -U 7808 ; WX 602 ; N Wgrave ; G 1402 -U 7809 ; WX 602 ; N wgrave ; G 1403 -U 7810 ; WX 602 ; N Wacute ; G 1404 -U 7811 ; WX 602 ; N wacute ; G 1405 -U 7812 ; WX 602 ; N Wdieresis ; G 1406 -U 7813 ; WX 602 ; N wdieresis ; G 1407 -U 7814 ; WX 602 ; N uni1E86 ; G 1408 -U 7815 ; WX 602 ; N uni1E87 ; G 1409 -U 7816 ; WX 602 ; N uni1E88 ; G 1410 -U 7817 ; WX 602 ; N uni1E89 ; G 1411 -U 7818 ; WX 602 ; N uni1E8A ; G 1412 -U 7819 ; WX 602 ; N uni1E8B ; G 1413 -U 7820 ; WX 602 ; N uni1E8C ; G 1414 -U 7821 ; WX 602 ; N uni1E8D ; G 1415 -U 7822 ; WX 602 ; N uni1E8E ; G 1416 -U 7823 ; WX 602 ; N uni1E8F ; G 1417 -U 7824 ; WX 602 ; N uni1E90 ; G 1418 -U 7825 ; WX 602 ; N uni1E91 ; G 1419 -U 7826 ; WX 602 ; N uni1E92 ; G 1420 -U 7827 ; WX 602 ; N uni1E93 ; G 1421 -U 7828 ; WX 602 ; N uni1E94 ; G 1422 -U 7829 ; WX 602 ; N uni1E95 ; G 1423 -U 7830 ; WX 602 ; N uni1E96 ; G 1424 -U 7831 ; WX 602 ; N uni1E97 ; G 1425 -U 7832 ; WX 602 ; N uni1E98 ; G 1426 -U 7833 ; WX 602 ; N uni1E99 ; G 1427 -U 7835 ; WX 602 ; N uni1E9B ; G 1428 -U 7839 ; WX 602 ; N uni1E9F ; G 1429 -U 7840 ; WX 602 ; N uni1EA0 ; G 1430 -U 7841 ; WX 602 ; N uni1EA1 ; G 1431 -U 7852 ; WX 602 ; N uni1EAC ; G 1432 -U 7853 ; WX 602 ; N uni1EAD ; G 1433 -U 7856 ; WX 602 ; N uni1EB0 ; G 1434 -U 7857 ; WX 602 ; N uni1EB1 ; G 1435 -U 7862 ; WX 602 ; N uni1EB6 ; G 1436 -U 7863 ; WX 602 ; N uni1EB7 ; G 1437 -U 7864 ; WX 602 ; N uni1EB8 ; G 1438 -U 7865 ; WX 602 ; N uni1EB9 ; G 1439 -U 7868 ; WX 602 ; N uni1EBC ; G 1440 -U 7869 ; WX 602 ; N uni1EBD ; G 1441 -U 7878 ; WX 602 ; N uni1EC6 ; G 1442 -U 7879 ; WX 602 ; N uni1EC7 ; G 1443 -U 7882 ; WX 602 ; N uni1ECA ; G 1444 -U 7883 ; WX 602 ; N uni1ECB ; G 1445 -U 7884 ; WX 602 ; N uni1ECC ; G 1446 -U 7885 ; WX 602 ; N uni1ECD ; G 1447 -U 7896 ; WX 602 ; N uni1ED8 ; G 1448 -U 7897 ; WX 602 ; N uni1ED9 ; G 1449 -U 7898 ; WX 602 ; N uni1EDA ; G 1450 -U 7899 ; WX 602 ; N uni1EDB ; G 1451 -U 7900 ; WX 602 ; N uni1EDC ; G 1452 -U 7901 ; WX 602 ; N uni1EDD ; G 1453 -U 7904 ; WX 602 ; N uni1EE0 ; G 1454 -U 7905 ; WX 602 ; N uni1EE1 ; G 1455 -U 7906 ; WX 602 ; N uni1EE2 ; G 1456 -U 7907 ; WX 602 ; N uni1EE3 ; G 1457 -U 7908 ; WX 602 ; N uni1EE4 ; G 1458 -U 7909 ; WX 602 ; N uni1EE5 ; G 1459 -U 7912 ; WX 602 ; N uni1EE8 ; G 1460 -U 7913 ; WX 602 ; N uni1EE9 ; G 1461 -U 7914 ; WX 602 ; N uni1EEA ; G 1462 -U 7915 ; WX 602 ; N uni1EEB ; G 1463 -U 7918 ; WX 602 ; N uni1EEE ; G 1464 -U 7919 ; WX 602 ; N uni1EEF ; G 1465 -U 7920 ; WX 602 ; N uni1EF0 ; G 1466 -U 7921 ; WX 602 ; N uni1EF1 ; G 1467 -U 7922 ; WX 602 ; N Ygrave ; G 1468 -U 7923 ; WX 602 ; N ygrave ; G 1469 -U 7924 ; WX 602 ; N uni1EF4 ; G 1470 -U 7925 ; WX 602 ; N uni1EF5 ; G 1471 -U 7928 ; WX 602 ; N uni1EF8 ; G 1472 -U 7929 ; WX 602 ; N uni1EF9 ; G 1473 -U 7936 ; WX 602 ; N uni1F00 ; G 1474 -U 7937 ; WX 602 ; N uni1F01 ; G 1475 -U 7938 ; WX 602 ; N uni1F02 ; G 1476 -U 7939 ; WX 602 ; N uni1F03 ; G 1477 -U 7940 ; WX 602 ; N uni1F04 ; G 1478 -U 7941 ; WX 602 ; N uni1F05 ; G 1479 -U 7942 ; WX 602 ; N uni1F06 ; G 1480 -U 7943 ; WX 602 ; N uni1F07 ; G 1481 -U 7944 ; WX 602 ; N uni1F08 ; G 1482 -U 7945 ; WX 602 ; N uni1F09 ; G 1483 -U 7946 ; WX 602 ; N uni1F0A ; G 1484 -U 7947 ; WX 602 ; N uni1F0B ; G 1485 -U 7948 ; WX 602 ; N uni1F0C ; G 1486 -U 7949 ; WX 602 ; N uni1F0D ; G 1487 -U 7950 ; WX 602 ; N uni1F0E ; G 1488 -U 7951 ; WX 602 ; N uni1F0F ; G 1489 -U 7952 ; WX 602 ; N uni1F10 ; G 1490 -U 7953 ; WX 602 ; N uni1F11 ; G 1491 -U 7954 ; WX 602 ; N uni1F12 ; G 1492 -U 7955 ; WX 602 ; N uni1F13 ; G 1493 -U 7956 ; WX 602 ; N uni1F14 ; G 1494 -U 7957 ; WX 602 ; N uni1F15 ; G 1495 -U 7960 ; WX 602 ; N uni1F18 ; G 1496 -U 7961 ; WX 602 ; N uni1F19 ; G 1497 -U 7962 ; WX 602 ; N uni1F1A ; G 1498 -U 7963 ; WX 602 ; N uni1F1B ; G 1499 -U 7964 ; WX 602 ; N uni1F1C ; G 1500 -U 7965 ; WX 602 ; N uni1F1D ; G 1501 -U 7968 ; WX 602 ; N uni1F20 ; G 1502 -U 7969 ; WX 602 ; N uni1F21 ; G 1503 -U 7970 ; WX 602 ; N uni1F22 ; G 1504 -U 7971 ; WX 602 ; N uni1F23 ; G 1505 -U 7972 ; WX 602 ; N uni1F24 ; G 1506 -U 7973 ; WX 602 ; N uni1F25 ; G 1507 -U 7974 ; WX 602 ; N uni1F26 ; G 1508 -U 7975 ; WX 602 ; N uni1F27 ; G 1509 -U 7976 ; WX 602 ; N uni1F28 ; G 1510 -U 7977 ; WX 602 ; N uni1F29 ; G 1511 -U 7978 ; WX 602 ; N uni1F2A ; G 1512 -U 7979 ; WX 602 ; N uni1F2B ; G 1513 -U 7980 ; WX 602 ; N uni1F2C ; G 1514 -U 7981 ; WX 602 ; N uni1F2D ; G 1515 -U 7982 ; WX 602 ; N uni1F2E ; G 1516 -U 7983 ; WX 602 ; N uni1F2F ; G 1517 -U 7984 ; WX 602 ; N uni1F30 ; G 1518 -U 7985 ; WX 602 ; N uni1F31 ; G 1519 -U 7986 ; WX 602 ; N uni1F32 ; G 1520 -U 7987 ; WX 602 ; N uni1F33 ; G 1521 -U 7988 ; WX 602 ; N uni1F34 ; G 1522 -U 7989 ; WX 602 ; N uni1F35 ; G 1523 -U 7990 ; WX 602 ; N uni1F36 ; G 1524 -U 7991 ; WX 602 ; N uni1F37 ; G 1525 -U 7992 ; WX 602 ; N uni1F38 ; G 1526 -U 7993 ; WX 602 ; N uni1F39 ; G 1527 -U 7994 ; WX 602 ; N uni1F3A ; G 1528 -U 7995 ; WX 602 ; N uni1F3B ; G 1529 -U 7996 ; WX 602 ; N uni1F3C ; G 1530 -U 7997 ; WX 602 ; N uni1F3D ; G 1531 -U 7998 ; WX 602 ; N uni1F3E ; G 1532 -U 7999 ; WX 602 ; N uni1F3F ; G 1533 -U 8000 ; WX 602 ; N uni1F40 ; G 1534 -U 8001 ; WX 602 ; N uni1F41 ; G 1535 -U 8002 ; WX 602 ; N uni1F42 ; G 1536 -U 8003 ; WX 602 ; N uni1F43 ; G 1537 -U 8004 ; WX 602 ; N uni1F44 ; G 1538 -U 8005 ; WX 602 ; N uni1F45 ; G 1539 -U 8008 ; WX 602 ; N uni1F48 ; G 1540 -U 8009 ; WX 602 ; N uni1F49 ; G 1541 -U 8010 ; WX 602 ; N uni1F4A ; G 1542 -U 8011 ; WX 602 ; N uni1F4B ; G 1543 -U 8012 ; WX 602 ; N uni1F4C ; G 1544 -U 8013 ; WX 602 ; N uni1F4D ; G 1545 -U 8016 ; WX 602 ; N uni1F50 ; G 1546 -U 8017 ; WX 602 ; N uni1F51 ; G 1547 -U 8018 ; WX 602 ; N uni1F52 ; G 1548 -U 8019 ; WX 602 ; N uni1F53 ; G 1549 -U 8020 ; WX 602 ; N uni1F54 ; G 1550 -U 8021 ; WX 602 ; N uni1F55 ; G 1551 -U 8022 ; WX 602 ; N uni1F56 ; G 1552 -U 8023 ; WX 602 ; N uni1F57 ; G 1553 -U 8025 ; WX 602 ; N uni1F59 ; G 1554 -U 8027 ; WX 602 ; N uni1F5B ; G 1555 -U 8029 ; WX 602 ; N uni1F5D ; G 1556 -U 8031 ; WX 602 ; N uni1F5F ; G 1557 -U 8032 ; WX 602 ; N uni1F60 ; G 1558 -U 8033 ; WX 602 ; N uni1F61 ; G 1559 -U 8034 ; WX 602 ; N uni1F62 ; G 1560 -U 8035 ; WX 602 ; N uni1F63 ; G 1561 -U 8036 ; WX 602 ; N uni1F64 ; G 1562 -U 8037 ; WX 602 ; N uni1F65 ; G 1563 -U 8038 ; WX 602 ; N uni1F66 ; G 1564 -U 8039 ; WX 602 ; N uni1F67 ; G 1565 -U 8040 ; WX 602 ; N uni1F68 ; G 1566 -U 8041 ; WX 602 ; N uni1F69 ; G 1567 -U 8042 ; WX 602 ; N uni1F6A ; G 1568 -U 8043 ; WX 602 ; N uni1F6B ; G 1569 -U 8044 ; WX 602 ; N uni1F6C ; G 1570 -U 8045 ; WX 602 ; N uni1F6D ; G 1571 -U 8046 ; WX 602 ; N uni1F6E ; G 1572 -U 8047 ; WX 602 ; N uni1F6F ; G 1573 -U 8048 ; WX 602 ; N uni1F70 ; G 1574 -U 8049 ; WX 602 ; N uni1F71 ; G 1575 -U 8050 ; WX 602 ; N uni1F72 ; G 1576 -U 8051 ; WX 602 ; N uni1F73 ; G 1577 -U 8052 ; WX 602 ; N uni1F74 ; G 1578 -U 8053 ; WX 602 ; N uni1F75 ; G 1579 -U 8054 ; WX 602 ; N uni1F76 ; G 1580 -U 8055 ; WX 602 ; N uni1F77 ; G 1581 -U 8056 ; WX 602 ; N uni1F78 ; G 1582 -U 8057 ; WX 602 ; N uni1F79 ; G 1583 -U 8058 ; WX 602 ; N uni1F7A ; G 1584 -U 8059 ; WX 602 ; N uni1F7B ; G 1585 -U 8060 ; WX 602 ; N uni1F7C ; G 1586 -U 8061 ; WX 602 ; N uni1F7D ; G 1587 -U 8064 ; WX 602 ; N uni1F80 ; G 1588 -U 8065 ; WX 602 ; N uni1F81 ; G 1589 -U 8066 ; WX 602 ; N uni1F82 ; G 1590 -U 8067 ; WX 602 ; N uni1F83 ; G 1591 -U 8068 ; WX 602 ; N uni1F84 ; G 1592 -U 8069 ; WX 602 ; N uni1F85 ; G 1593 -U 8070 ; WX 602 ; N uni1F86 ; G 1594 -U 8071 ; WX 602 ; N uni1F87 ; G 1595 -U 8072 ; WX 602 ; N uni1F88 ; G 1596 -U 8073 ; WX 602 ; N uni1F89 ; G 1597 -U 8074 ; WX 602 ; N uni1F8A ; G 1598 -U 8075 ; WX 602 ; N uni1F8B ; G 1599 -U 8076 ; WX 602 ; N uni1F8C ; G 1600 -U 8077 ; WX 602 ; N uni1F8D ; G 1601 -U 8078 ; WX 602 ; N uni1F8E ; G 1602 -U 8079 ; WX 602 ; N uni1F8F ; G 1603 -U 8080 ; WX 602 ; N uni1F90 ; G 1604 -U 8081 ; WX 602 ; N uni1F91 ; G 1605 -U 8082 ; WX 602 ; N uni1F92 ; G 1606 -U 8083 ; WX 602 ; N uni1F93 ; G 1607 -U 8084 ; WX 602 ; N uni1F94 ; G 1608 -U 8085 ; WX 602 ; N uni1F95 ; G 1609 -U 8086 ; WX 602 ; N uni1F96 ; G 1610 -U 8087 ; WX 602 ; N uni1F97 ; G 1611 -U 8088 ; WX 602 ; N uni1F98 ; G 1612 -U 8089 ; WX 602 ; N uni1F99 ; G 1613 -U 8090 ; WX 602 ; N uni1F9A ; G 1614 -U 8091 ; WX 602 ; N uni1F9B ; G 1615 -U 8092 ; WX 602 ; N uni1F9C ; G 1616 -U 8093 ; WX 602 ; N uni1F9D ; G 1617 -U 8094 ; WX 602 ; N uni1F9E ; G 1618 -U 8095 ; WX 602 ; N uni1F9F ; G 1619 -U 8096 ; WX 602 ; N uni1FA0 ; G 1620 -U 8097 ; WX 602 ; N uni1FA1 ; G 1621 -U 8098 ; WX 602 ; N uni1FA2 ; G 1622 -U 8099 ; WX 602 ; N uni1FA3 ; G 1623 -U 8100 ; WX 602 ; N uni1FA4 ; G 1624 -U 8101 ; WX 602 ; N uni1FA5 ; G 1625 -U 8102 ; WX 602 ; N uni1FA6 ; G 1626 -U 8103 ; WX 602 ; N uni1FA7 ; G 1627 -U 8104 ; WX 602 ; N uni1FA8 ; G 1628 -U 8105 ; WX 602 ; N uni1FA9 ; G 1629 -U 8106 ; WX 602 ; N uni1FAA ; G 1630 -U 8107 ; WX 602 ; N uni1FAB ; G 1631 -U 8108 ; WX 602 ; N uni1FAC ; G 1632 -U 8109 ; WX 602 ; N uni1FAD ; G 1633 -U 8110 ; WX 602 ; N uni1FAE ; G 1634 -U 8111 ; WX 602 ; N uni1FAF ; G 1635 -U 8112 ; WX 602 ; N uni1FB0 ; G 1636 -U 8113 ; WX 602 ; N uni1FB1 ; G 1637 -U 8114 ; WX 602 ; N uni1FB2 ; G 1638 -U 8115 ; WX 602 ; N uni1FB3 ; G 1639 -U 8116 ; WX 602 ; N uni1FB4 ; G 1640 -U 8118 ; WX 602 ; N uni1FB6 ; G 1641 -U 8119 ; WX 602 ; N uni1FB7 ; G 1642 -U 8120 ; WX 602 ; N uni1FB8 ; G 1643 -U 8121 ; WX 602 ; N uni1FB9 ; G 1644 -U 8122 ; WX 602 ; N uni1FBA ; G 1645 -U 8123 ; WX 602 ; N uni1FBB ; G 1646 -U 8124 ; WX 602 ; N uni1FBC ; G 1647 -U 8125 ; WX 602 ; N uni1FBD ; G 1648 -U 8126 ; WX 602 ; N uni1FBE ; G 1649 -U 8127 ; WX 602 ; N uni1FBF ; G 1650 -U 8128 ; WX 602 ; N uni1FC0 ; G 1651 -U 8129 ; WX 602 ; N uni1FC1 ; G 1652 -U 8130 ; WX 602 ; N uni1FC2 ; G 1653 -U 8131 ; WX 602 ; N uni1FC3 ; G 1654 -U 8132 ; WX 602 ; N uni1FC4 ; G 1655 -U 8134 ; WX 602 ; N uni1FC6 ; G 1656 -U 8135 ; WX 602 ; N uni1FC7 ; G 1657 -U 8136 ; WX 602 ; N uni1FC8 ; G 1658 -U 8137 ; WX 602 ; N uni1FC9 ; G 1659 -U 8138 ; WX 602 ; N uni1FCA ; G 1660 -U 8139 ; WX 602 ; N uni1FCB ; G 1661 -U 8140 ; WX 602 ; N uni1FCC ; G 1662 -U 8141 ; WX 602 ; N uni1FCD ; G 1663 -U 8142 ; WX 602 ; N uni1FCE ; G 1664 -U 8143 ; WX 602 ; N uni1FCF ; G 1665 -U 8144 ; WX 602 ; N uni1FD0 ; G 1666 -U 8145 ; WX 602 ; N uni1FD1 ; G 1667 -U 8146 ; WX 602 ; N uni1FD2 ; G 1668 -U 8147 ; WX 602 ; N uni1FD3 ; G 1669 -U 8150 ; WX 602 ; N uni1FD6 ; G 1670 -U 8151 ; WX 602 ; N uni1FD7 ; G 1671 -U 8152 ; WX 602 ; N uni1FD8 ; G 1672 -U 8153 ; WX 602 ; N uni1FD9 ; G 1673 -U 8154 ; WX 602 ; N uni1FDA ; G 1674 -U 8155 ; WX 602 ; N uni1FDB ; G 1675 -U 8157 ; WX 602 ; N uni1FDD ; G 1676 -U 8158 ; WX 602 ; N uni1FDE ; G 1677 -U 8159 ; WX 602 ; N uni1FDF ; G 1678 -U 8160 ; WX 602 ; N uni1FE0 ; G 1679 -U 8161 ; WX 602 ; N uni1FE1 ; G 1680 -U 8162 ; WX 602 ; N uni1FE2 ; G 1681 -U 8163 ; WX 602 ; N uni1FE3 ; G 1682 -U 8164 ; WX 602 ; N uni1FE4 ; G 1683 -U 8165 ; WX 602 ; N uni1FE5 ; G 1684 -U 8166 ; WX 602 ; N uni1FE6 ; G 1685 -U 8167 ; WX 602 ; N uni1FE7 ; G 1686 -U 8168 ; WX 602 ; N uni1FE8 ; G 1687 -U 8169 ; WX 602 ; N uni1FE9 ; G 1688 -U 8170 ; WX 602 ; N uni1FEA ; G 1689 -U 8171 ; WX 602 ; N uni1FEB ; G 1690 -U 8172 ; WX 602 ; N uni1FEC ; G 1691 -U 8173 ; WX 602 ; N uni1FED ; G 1692 -U 8174 ; WX 602 ; N uni1FEE ; G 1693 -U 8175 ; WX 602 ; N uni1FEF ; G 1694 -U 8178 ; WX 602 ; N uni1FF2 ; G 1695 -U 8179 ; WX 602 ; N uni1FF3 ; G 1696 -U 8180 ; WX 602 ; N uni1FF4 ; G 1697 -U 8182 ; WX 602 ; N uni1FF6 ; G 1698 -U 8183 ; WX 602 ; N uni1FF7 ; G 1699 -U 8184 ; WX 602 ; N uni1FF8 ; G 1700 -U 8185 ; WX 602 ; N uni1FF9 ; G 1701 -U 8186 ; WX 602 ; N uni1FFA ; G 1702 -U 8187 ; WX 602 ; N uni1FFB ; G 1703 -U 8188 ; WX 602 ; N uni1FFC ; G 1704 -U 8189 ; WX 602 ; N uni1FFD ; G 1705 -U 8190 ; WX 602 ; N uni1FFE ; G 1706 -U 8192 ; WX 602 ; N uni2000 ; G 1707 -U 8193 ; WX 602 ; N uni2001 ; G 1708 -U 8194 ; WX 602 ; N uni2002 ; G 1709 -U 8195 ; WX 602 ; N uni2003 ; G 1710 -U 8196 ; WX 602 ; N uni2004 ; G 1711 -U 8197 ; WX 602 ; N uni2005 ; G 1712 -U 8198 ; WX 602 ; N uni2006 ; G 1713 -U 8199 ; WX 602 ; N uni2007 ; G 1714 -U 8200 ; WX 602 ; N uni2008 ; G 1715 -U 8201 ; WX 602 ; N uni2009 ; G 1716 -U 8202 ; WX 602 ; N uni200A ; G 1717 -U 8208 ; WX 602 ; N uni2010 ; G 1718 -U 8209 ; WX 602 ; N uni2011 ; G 1719 -U 8210 ; WX 602 ; N figuredash ; G 1720 -U 8211 ; WX 602 ; N endash ; G 1721 -U 8212 ; WX 602 ; N emdash ; G 1722 -U 8213 ; WX 602 ; N uni2015 ; G 1723 -U 8214 ; WX 602 ; N uni2016 ; G 1724 -U 8215 ; WX 602 ; N underscoredbl ; G 1725 -U 8216 ; WX 602 ; N quoteleft ; G 1726 -U 8217 ; WX 602 ; N quoteright ; G 1727 -U 8218 ; WX 602 ; N quotesinglbase ; G 1728 -U 8219 ; WX 602 ; N quotereversed ; G 1729 -U 8220 ; WX 602 ; N quotedblleft ; G 1730 -U 8221 ; WX 602 ; N quotedblright ; G 1731 -U 8222 ; WX 602 ; N quotedblbase ; G 1732 -U 8223 ; WX 602 ; N uni201F ; G 1733 -U 8224 ; WX 602 ; N dagger ; G 1734 -U 8225 ; WX 602 ; N daggerdbl ; G 1735 -U 8226 ; WX 602 ; N bullet ; G 1736 -U 8227 ; WX 602 ; N uni2023 ; G 1737 -U 8230 ; WX 602 ; N ellipsis ; G 1738 -U 8239 ; WX 602 ; N uni202F ; G 1739 -U 8240 ; WX 602 ; N perthousand ; G 1740 -U 8241 ; WX 602 ; N uni2031 ; G 1741 -U 8242 ; WX 602 ; N minute ; G 1742 -U 8243 ; WX 602 ; N second ; G 1743 -U 8244 ; WX 602 ; N uni2034 ; G 1744 -U 8245 ; WX 602 ; N uni2035 ; G 1745 -U 8246 ; WX 602 ; N uni2036 ; G 1746 -U 8247 ; WX 602 ; N uni2037 ; G 1747 -U 8249 ; WX 602 ; N guilsinglleft ; G 1748 -U 8250 ; WX 602 ; N guilsinglright ; G 1749 -U 8252 ; WX 602 ; N exclamdbl ; G 1750 -U 8253 ; WX 602 ; N uni203D ; G 1751 -U 8254 ; WX 602 ; N uni203E ; G 1752 -U 8255 ; WX 602 ; N uni203F ; G 1753 -U 8261 ; WX 602 ; N uni2045 ; G 1754 -U 8262 ; WX 602 ; N uni2046 ; G 1755 -U 8263 ; WX 602 ; N uni2047 ; G 1756 -U 8264 ; WX 602 ; N uni2048 ; G 1757 -U 8265 ; WX 602 ; N uni2049 ; G 1758 -U 8267 ; WX 602 ; N uni204B ; G 1759 -U 8287 ; WX 602 ; N uni205F ; G 1760 -U 8304 ; WX 602 ; N uni2070 ; G 1761 -U 8305 ; WX 602 ; N uni2071 ; G 1762 -U 8308 ; WX 602 ; N uni2074 ; G 1763 -U 8309 ; WX 602 ; N uni2075 ; G 1764 -U 8310 ; WX 602 ; N uni2076 ; G 1765 -U 8311 ; WX 602 ; N uni2077 ; G 1766 -U 8312 ; WX 602 ; N uni2078 ; G 1767 -U 8313 ; WX 602 ; N uni2079 ; G 1768 -U 8314 ; WX 602 ; N uni207A ; G 1769 -U 8315 ; WX 602 ; N uni207B ; G 1770 -U 8316 ; WX 602 ; N uni207C ; G 1771 -U 8317 ; WX 602 ; N uni207D ; G 1772 -U 8318 ; WX 602 ; N uni207E ; G 1773 -U 8319 ; WX 602 ; N uni207F ; G 1774 -U 8320 ; WX 602 ; N uni2080 ; G 1775 -U 8321 ; WX 602 ; N uni2081 ; G 1776 -U 8322 ; WX 602 ; N uni2082 ; G 1777 -U 8323 ; WX 602 ; N uni2083 ; G 1778 -U 8324 ; WX 602 ; N uni2084 ; G 1779 -U 8325 ; WX 602 ; N uni2085 ; G 1780 -U 8326 ; WX 602 ; N uni2086 ; G 1781 -U 8327 ; WX 602 ; N uni2087 ; G 1782 -U 8328 ; WX 602 ; N uni2088 ; G 1783 -U 8329 ; WX 602 ; N uni2089 ; G 1784 -U 8330 ; WX 602 ; N uni208A ; G 1785 -U 8331 ; WX 602 ; N uni208B ; G 1786 -U 8332 ; WX 602 ; N uni208C ; G 1787 -U 8333 ; WX 602 ; N uni208D ; G 1788 -U 8334 ; WX 602 ; N uni208E ; G 1789 -U 8336 ; WX 602 ; N uni2090 ; G 1790 -U 8337 ; WX 602 ; N uni2091 ; G 1791 -U 8338 ; WX 602 ; N uni2092 ; G 1792 -U 8339 ; WX 602 ; N uni2093 ; G 1793 -U 8340 ; WX 602 ; N uni2094 ; G 1794 -U 8341 ; WX 602 ; N uni2095 ; G 1795 -U 8342 ; WX 602 ; N uni2096 ; G 1796 -U 8343 ; WX 602 ; N uni2097 ; G 1797 -U 8344 ; WX 602 ; N uni2098 ; G 1798 -U 8345 ; WX 602 ; N uni2099 ; G 1799 -U 8346 ; WX 602 ; N uni209A ; G 1800 -U 8347 ; WX 602 ; N uni209B ; G 1801 -U 8348 ; WX 602 ; N uni209C ; G 1802 -U 8352 ; WX 602 ; N uni20A0 ; G 1803 -U 8353 ; WX 602 ; N colonmonetary ; G 1804 -U 8354 ; WX 602 ; N uni20A2 ; G 1805 -U 8355 ; WX 602 ; N franc ; G 1806 -U 8356 ; WX 602 ; N lira ; G 1807 -U 8357 ; WX 602 ; N uni20A5 ; G 1808 -U 8358 ; WX 602 ; N uni20A6 ; G 1809 -U 8359 ; WX 602 ; N peseta ; G 1810 -U 8360 ; WX 602 ; N uni20A8 ; G 1811 -U 8361 ; WX 602 ; N uni20A9 ; G 1812 -U 8362 ; WX 602 ; N uni20AA ; G 1813 -U 8363 ; WX 602 ; N dong ; G 1814 -U 8364 ; WX 602 ; N Euro ; G 1815 -U 8365 ; WX 602 ; N uni20AD ; G 1816 -U 8366 ; WX 602 ; N uni20AE ; G 1817 -U 8367 ; WX 602 ; N uni20AF ; G 1818 -U 8368 ; WX 602 ; N uni20B0 ; G 1819 -U 8369 ; WX 602 ; N uni20B1 ; G 1820 -U 8370 ; WX 602 ; N uni20B2 ; G 1821 -U 8371 ; WX 602 ; N uni20B3 ; G 1822 -U 8372 ; WX 602 ; N uni20B4 ; G 1823 -U 8373 ; WX 602 ; N uni20B5 ; G 1824 -U 8376 ; WX 602 ; N uni20B8 ; G 1825 -U 8377 ; WX 602 ; N uni20B9 ; G 1826 -U 8378 ; WX 602 ; N uni20BA ; G 1827 -U 8381 ; WX 602 ; N uni20BD ; G 1828 -U 8450 ; WX 602 ; N uni2102 ; G 1829 -U 8453 ; WX 602 ; N uni2105 ; G 1830 -U 8461 ; WX 602 ; N uni210D ; G 1831 -U 8462 ; WX 602 ; N uni210E ; G 1832 -U 8463 ; WX 602 ; N uni210F ; G 1833 -U 8469 ; WX 602 ; N uni2115 ; G 1834 -U 8470 ; WX 602 ; N uni2116 ; G 1835 -U 8471 ; WX 602 ; N uni2117 ; G 1836 -U 8473 ; WX 602 ; N uni2119 ; G 1837 -U 8474 ; WX 602 ; N uni211A ; G 1838 -U 8477 ; WX 602 ; N uni211D ; G 1839 -U 8482 ; WX 602 ; N trademark ; G 1840 -U 8484 ; WX 602 ; N uni2124 ; G 1841 -U 8486 ; WX 602 ; N uni2126 ; G 1842 -U 8490 ; WX 602 ; N uni212A ; G 1843 -U 8491 ; WX 602 ; N uni212B ; G 1844 -U 8494 ; WX 602 ; N estimated ; G 1845 -U 8520 ; WX 602 ; N uni2148 ; G 1846 -U 8528 ; WX 602 ; N uni2150 ; G 1847 -U 8529 ; WX 602 ; N uni2151 ; G 1848 -U 8531 ; WX 602 ; N onethird ; G 1849 -U 8532 ; WX 602 ; N twothirds ; G 1850 -U 8533 ; WX 602 ; N uni2155 ; G 1851 -U 8534 ; WX 602 ; N uni2156 ; G 1852 -U 8535 ; WX 602 ; N uni2157 ; G 1853 -U 8536 ; WX 602 ; N uni2158 ; G 1854 -U 8537 ; WX 602 ; N uni2159 ; G 1855 -U 8538 ; WX 602 ; N uni215A ; G 1856 -U 8539 ; WX 602 ; N oneeighth ; G 1857 -U 8540 ; WX 602 ; N threeeighths ; G 1858 -U 8541 ; WX 602 ; N fiveeighths ; G 1859 -U 8542 ; WX 602 ; N seveneighths ; G 1860 -U 8543 ; WX 602 ; N uni215F ; G 1861 -U 8585 ; WX 602 ; N uni2189 ; G 1862 -U 8592 ; WX 602 ; N arrowleft ; G 1863 -U 8593 ; WX 602 ; N arrowup ; G 1864 -U 8594 ; WX 602 ; N arrowright ; G 1865 -U 8595 ; WX 602 ; N arrowdown ; G 1866 -U 8596 ; WX 602 ; N arrowboth ; G 1867 -U 8597 ; WX 602 ; N arrowupdn ; G 1868 -U 8598 ; WX 602 ; N uni2196 ; G 1869 -U 8599 ; WX 602 ; N uni2197 ; G 1870 -U 8600 ; WX 602 ; N uni2198 ; G 1871 -U 8601 ; WX 602 ; N uni2199 ; G 1872 -U 8602 ; WX 602 ; N uni219A ; G 1873 -U 8603 ; WX 602 ; N uni219B ; G 1874 -U 8604 ; WX 602 ; N uni219C ; G 1875 -U 8605 ; WX 602 ; N uni219D ; G 1876 -U 8606 ; WX 602 ; N uni219E ; G 1877 -U 8607 ; WX 602 ; N uni219F ; G 1878 -U 8608 ; WX 602 ; N uni21A0 ; G 1879 -U 8609 ; WX 602 ; N uni21A1 ; G 1880 -U 8610 ; WX 602 ; N uni21A2 ; G 1881 -U 8611 ; WX 602 ; N uni21A3 ; G 1882 -U 8612 ; WX 602 ; N uni21A4 ; G 1883 -U 8613 ; WX 602 ; N uni21A5 ; G 1884 -U 8614 ; WX 602 ; N uni21A6 ; G 1885 -U 8615 ; WX 602 ; N uni21A7 ; G 1886 -U 8616 ; WX 602 ; N arrowupdnbse ; G 1887 -U 8617 ; WX 602 ; N uni21A9 ; G 1888 -U 8618 ; WX 602 ; N uni21AA ; G 1889 -U 8619 ; WX 602 ; N uni21AB ; G 1890 -U 8620 ; WX 602 ; N uni21AC ; G 1891 -U 8621 ; WX 602 ; N uni21AD ; G 1892 -U 8622 ; WX 602 ; N uni21AE ; G 1893 -U 8623 ; WX 602 ; N uni21AF ; G 1894 -U 8624 ; WX 602 ; N uni21B0 ; G 1895 -U 8625 ; WX 602 ; N uni21B1 ; G 1896 -U 8626 ; WX 602 ; N uni21B2 ; G 1897 -U 8627 ; WX 602 ; N uni21B3 ; G 1898 -U 8628 ; WX 602 ; N uni21B4 ; G 1899 -U 8629 ; WX 602 ; N carriagereturn ; G 1900 -U 8630 ; WX 602 ; N uni21B6 ; G 1901 -U 8631 ; WX 602 ; N uni21B7 ; G 1902 -U 8632 ; WX 602 ; N uni21B8 ; G 1903 -U 8633 ; WX 602 ; N uni21B9 ; G 1904 -U 8634 ; WX 602 ; N uni21BA ; G 1905 -U 8635 ; WX 602 ; N uni21BB ; G 1906 -U 8636 ; WX 602 ; N uni21BC ; G 1907 -U 8637 ; WX 602 ; N uni21BD ; G 1908 -U 8638 ; WX 602 ; N uni21BE ; G 1909 -U 8639 ; WX 602 ; N uni21BF ; G 1910 -U 8640 ; WX 602 ; N uni21C0 ; G 1911 -U 8641 ; WX 602 ; N uni21C1 ; G 1912 -U 8642 ; WX 602 ; N uni21C2 ; G 1913 -U 8643 ; WX 602 ; N uni21C3 ; G 1914 -U 8644 ; WX 602 ; N uni21C4 ; G 1915 -U 8645 ; WX 602 ; N uni21C5 ; G 1916 -U 8646 ; WX 602 ; N uni21C6 ; G 1917 -U 8647 ; WX 602 ; N uni21C7 ; G 1918 -U 8648 ; WX 602 ; N uni21C8 ; G 1919 -U 8649 ; WX 602 ; N uni21C9 ; G 1920 -U 8650 ; WX 602 ; N uni21CA ; G 1921 -U 8651 ; WX 602 ; N uni21CB ; G 1922 -U 8652 ; WX 602 ; N uni21CC ; G 1923 -U 8653 ; WX 602 ; N uni21CD ; G 1924 -U 8654 ; WX 602 ; N uni21CE ; G 1925 -U 8655 ; WX 602 ; N uni21CF ; G 1926 -U 8656 ; WX 602 ; N arrowdblleft ; G 1927 -U 8657 ; WX 602 ; N arrowdblup ; G 1928 -U 8658 ; WX 602 ; N arrowdblright ; G 1929 -U 8659 ; WX 602 ; N arrowdbldown ; G 1930 -U 8660 ; WX 602 ; N arrowdblboth ; G 1931 -U 8661 ; WX 602 ; N uni21D5 ; G 1932 -U 8662 ; WX 602 ; N uni21D6 ; G 1933 -U 8663 ; WX 602 ; N uni21D7 ; G 1934 -U 8664 ; WX 602 ; N uni21D8 ; G 1935 -U 8665 ; WX 602 ; N uni21D9 ; G 1936 -U 8666 ; WX 602 ; N uni21DA ; G 1937 -U 8667 ; WX 602 ; N uni21DB ; G 1938 -U 8668 ; WX 602 ; N uni21DC ; G 1939 -U 8669 ; WX 602 ; N uni21DD ; G 1940 -U 8670 ; WX 602 ; N uni21DE ; G 1941 -U 8671 ; WX 602 ; N uni21DF ; G 1942 -U 8672 ; WX 602 ; N uni21E0 ; G 1943 -U 8673 ; WX 602 ; N uni21E1 ; G 1944 -U 8674 ; WX 602 ; N uni21E2 ; G 1945 -U 8675 ; WX 602 ; N uni21E3 ; G 1946 -U 8676 ; WX 602 ; N uni21E4 ; G 1947 -U 8677 ; WX 602 ; N uni21E5 ; G 1948 -U 8678 ; WX 602 ; N uni21E6 ; G 1949 -U 8679 ; WX 602 ; N uni21E7 ; G 1950 -U 8680 ; WX 602 ; N uni21E8 ; G 1951 -U 8681 ; WX 602 ; N uni21E9 ; G 1952 -U 8682 ; WX 602 ; N uni21EA ; G 1953 -U 8683 ; WX 602 ; N uni21EB ; G 1954 -U 8684 ; WX 602 ; N uni21EC ; G 1955 -U 8685 ; WX 602 ; N uni21ED ; G 1956 -U 8686 ; WX 602 ; N uni21EE ; G 1957 -U 8687 ; WX 602 ; N uni21EF ; G 1958 -U 8688 ; WX 602 ; N uni21F0 ; G 1959 -U 8689 ; WX 602 ; N uni21F1 ; G 1960 -U 8690 ; WX 602 ; N uni21F2 ; G 1961 -U 8691 ; WX 602 ; N uni21F3 ; G 1962 -U 8692 ; WX 602 ; N uni21F4 ; G 1963 -U 8693 ; WX 602 ; N uni21F5 ; G 1964 -U 8694 ; WX 602 ; N uni21F6 ; G 1965 -U 8695 ; WX 602 ; N uni21F7 ; G 1966 -U 8696 ; WX 602 ; N uni21F8 ; G 1967 -U 8697 ; WX 602 ; N uni21F9 ; G 1968 -U 8698 ; WX 602 ; N uni21FA ; G 1969 -U 8699 ; WX 602 ; N uni21FB ; G 1970 -U 8700 ; WX 602 ; N uni21FC ; G 1971 -U 8701 ; WX 602 ; N uni21FD ; G 1972 -U 8702 ; WX 602 ; N uni21FE ; G 1973 -U 8703 ; WX 602 ; N uni21FF ; G 1974 -U 8704 ; WX 602 ; N universal ; G 1975 -U 8705 ; WX 602 ; N uni2201 ; G 1976 -U 8706 ; WX 602 ; N partialdiff ; G 1977 -U 8707 ; WX 602 ; N existential ; G 1978 -U 8708 ; WX 602 ; N uni2204 ; G 1979 -U 8709 ; WX 602 ; N emptyset ; G 1980 -U 8710 ; WX 602 ; N increment ; G 1981 -U 8711 ; WX 602 ; N gradient ; G 1982 -U 8712 ; WX 602 ; N element ; G 1983 -U 8713 ; WX 602 ; N notelement ; G 1984 -U 8714 ; WX 602 ; N uni220A ; G 1985 -U 8715 ; WX 602 ; N suchthat ; G 1986 -U 8716 ; WX 602 ; N uni220C ; G 1987 -U 8717 ; WX 602 ; N uni220D ; G 1988 -U 8718 ; WX 602 ; N uni220E ; G 1989 -U 8719 ; WX 602 ; N product ; G 1990 -U 8720 ; WX 602 ; N uni2210 ; G 1991 -U 8721 ; WX 602 ; N summation ; G 1992 -U 8722 ; WX 602 ; N minus ; G 1993 -U 8723 ; WX 602 ; N uni2213 ; G 1994 -U 8725 ; WX 602 ; N uni2215 ; G 1995 -U 8727 ; WX 602 ; N asteriskmath ; G 1996 -U 8728 ; WX 602 ; N uni2218 ; G 1997 -U 8729 ; WX 602 ; N uni2219 ; G 1998 -U 8730 ; WX 602 ; N radical ; G 1999 -U 8731 ; WX 602 ; N uni221B ; G 2000 -U 8732 ; WX 602 ; N uni221C ; G 2001 -U 8733 ; WX 602 ; N proportional ; G 2002 -U 8734 ; WX 602 ; N infinity ; G 2003 -U 8735 ; WX 602 ; N orthogonal ; G 2004 -U 8736 ; WX 602 ; N angle ; G 2005 -U 8739 ; WX 602 ; N uni2223 ; G 2006 -U 8743 ; WX 602 ; N logicaland ; G 2007 -U 8744 ; WX 602 ; N logicalor ; G 2008 -U 8745 ; WX 602 ; N intersection ; G 2009 -U 8746 ; WX 602 ; N union ; G 2010 -U 8747 ; WX 602 ; N integral ; G 2011 -U 8748 ; WX 602 ; N uni222C ; G 2012 -U 8749 ; WX 602 ; N uni222D ; G 2013 -U 8756 ; WX 602 ; N therefore ; G 2014 -U 8757 ; WX 602 ; N uni2235 ; G 2015 -U 8758 ; WX 602 ; N uni2236 ; G 2016 -U 8759 ; WX 602 ; N uni2237 ; G 2017 -U 8760 ; WX 602 ; N uni2238 ; G 2018 -U 8761 ; WX 602 ; N uni2239 ; G 2019 -U 8762 ; WX 602 ; N uni223A ; G 2020 -U 8763 ; WX 602 ; N uni223B ; G 2021 -U 8764 ; WX 602 ; N similar ; G 2022 -U 8765 ; WX 602 ; N uni223D ; G 2023 -U 8769 ; WX 602 ; N uni2241 ; G 2024 -U 8770 ; WX 602 ; N uni2242 ; G 2025 -U 8771 ; WX 602 ; N uni2243 ; G 2026 -U 8772 ; WX 602 ; N uni2244 ; G 2027 -U 8773 ; WX 602 ; N congruent ; G 2028 -U 8774 ; WX 602 ; N uni2246 ; G 2029 -U 8775 ; WX 602 ; N uni2247 ; G 2030 -U 8776 ; WX 602 ; N approxequal ; G 2031 -U 8777 ; WX 602 ; N uni2249 ; G 2032 -U 8778 ; WX 602 ; N uni224A ; G 2033 -U 8779 ; WX 602 ; N uni224B ; G 2034 -U 8780 ; WX 602 ; N uni224C ; G 2035 -U 8781 ; WX 602 ; N uni224D ; G 2036 -U 8782 ; WX 602 ; N uni224E ; G 2037 -U 8783 ; WX 602 ; N uni224F ; G 2038 -U 8784 ; WX 602 ; N uni2250 ; G 2039 -U 8785 ; WX 602 ; N uni2251 ; G 2040 -U 8786 ; WX 602 ; N uni2252 ; G 2041 -U 8787 ; WX 602 ; N uni2253 ; G 2042 -U 8788 ; WX 602 ; N uni2254 ; G 2043 -U 8789 ; WX 602 ; N uni2255 ; G 2044 -U 8790 ; WX 602 ; N uni2256 ; G 2045 -U 8791 ; WX 602 ; N uni2257 ; G 2046 -U 8792 ; WX 602 ; N uni2258 ; G 2047 -U 8793 ; WX 602 ; N uni2259 ; G 2048 -U 8794 ; WX 602 ; N uni225A ; G 2049 -U 8795 ; WX 602 ; N uni225B ; G 2050 -U 8796 ; WX 602 ; N uni225C ; G 2051 -U 8797 ; WX 602 ; N uni225D ; G 2052 -U 8798 ; WX 602 ; N uni225E ; G 2053 -U 8799 ; WX 602 ; N uni225F ; G 2054 -U 8800 ; WX 602 ; N notequal ; G 2055 -U 8801 ; WX 602 ; N equivalence ; G 2056 -U 8802 ; WX 602 ; N uni2262 ; G 2057 -U 8803 ; WX 602 ; N uni2263 ; G 2058 -U 8804 ; WX 602 ; N lessequal ; G 2059 -U 8805 ; WX 602 ; N greaterequal ; G 2060 -U 8806 ; WX 602 ; N uni2266 ; G 2061 -U 8807 ; WX 602 ; N uni2267 ; G 2062 -U 8808 ; WX 602 ; N uni2268 ; G 2063 -U 8809 ; WX 602 ; N uni2269 ; G 2064 -U 8813 ; WX 602 ; N uni226D ; G 2065 -U 8814 ; WX 602 ; N uni226E ; G 2066 -U 8815 ; WX 602 ; N uni226F ; G 2067 -U 8816 ; WX 602 ; N uni2270 ; G 2068 -U 8817 ; WX 602 ; N uni2271 ; G 2069 -U 8818 ; WX 602 ; N uni2272 ; G 2070 -U 8819 ; WX 602 ; N uni2273 ; G 2071 -U 8820 ; WX 602 ; N uni2274 ; G 2072 -U 8821 ; WX 602 ; N uni2275 ; G 2073 -U 8822 ; WX 602 ; N uni2276 ; G 2074 -U 8823 ; WX 602 ; N uni2277 ; G 2075 -U 8824 ; WX 602 ; N uni2278 ; G 2076 -U 8825 ; WX 602 ; N uni2279 ; G 2077 -U 8826 ; WX 602 ; N uni227A ; G 2078 -U 8827 ; WX 602 ; N uni227B ; G 2079 -U 8828 ; WX 602 ; N uni227C ; G 2080 -U 8829 ; WX 602 ; N uni227D ; G 2081 -U 8830 ; WX 602 ; N uni227E ; G 2082 -U 8831 ; WX 602 ; N uni227F ; G 2083 -U 8832 ; WX 602 ; N uni2280 ; G 2084 -U 8833 ; WX 602 ; N uni2281 ; G 2085 -U 8834 ; WX 602 ; N propersubset ; G 2086 -U 8835 ; WX 602 ; N propersuperset ; G 2087 -U 8836 ; WX 602 ; N notsubset ; G 2088 -U 8837 ; WX 602 ; N uni2285 ; G 2089 -U 8838 ; WX 602 ; N reflexsubset ; G 2090 -U 8839 ; WX 602 ; N reflexsuperset ; G 2091 -U 8840 ; WX 602 ; N uni2288 ; G 2092 -U 8841 ; WX 602 ; N uni2289 ; G 2093 -U 8842 ; WX 602 ; N uni228A ; G 2094 -U 8843 ; WX 602 ; N uni228B ; G 2095 -U 8845 ; WX 602 ; N uni228D ; G 2096 -U 8846 ; WX 602 ; N uni228E ; G 2097 -U 8847 ; WX 602 ; N uni228F ; G 2098 -U 8848 ; WX 602 ; N uni2290 ; G 2099 -U 8849 ; WX 602 ; N uni2291 ; G 2100 -U 8850 ; WX 602 ; N uni2292 ; G 2101 -U 8851 ; WX 602 ; N uni2293 ; G 2102 -U 8852 ; WX 602 ; N uni2294 ; G 2103 -U 8853 ; WX 602 ; N circleplus ; G 2104 -U 8854 ; WX 602 ; N uni2296 ; G 2105 -U 8855 ; WX 602 ; N circlemultiply ; G 2106 -U 8856 ; WX 602 ; N uni2298 ; G 2107 -U 8857 ; WX 602 ; N uni2299 ; G 2108 -U 8858 ; WX 602 ; N uni229A ; G 2109 -U 8859 ; WX 602 ; N uni229B ; G 2110 -U 8860 ; WX 602 ; N uni229C ; G 2111 -U 8861 ; WX 602 ; N uni229D ; G 2112 -U 8862 ; WX 602 ; N uni229E ; G 2113 -U 8863 ; WX 602 ; N uni229F ; G 2114 -U 8864 ; WX 602 ; N uni22A0 ; G 2115 -U 8865 ; WX 602 ; N uni22A1 ; G 2116 -U 8866 ; WX 602 ; N uni22A2 ; G 2117 -U 8867 ; WX 602 ; N uni22A3 ; G 2118 -U 8868 ; WX 602 ; N uni22A4 ; G 2119 -U 8869 ; WX 602 ; N perpendicular ; G 2120 -U 8882 ; WX 602 ; N uni22B2 ; G 2121 -U 8883 ; WX 602 ; N uni22B3 ; G 2122 -U 8884 ; WX 602 ; N uni22B4 ; G 2123 -U 8885 ; WX 602 ; N uni22B5 ; G 2124 -U 8888 ; WX 602 ; N uni22B8 ; G 2125 -U 8898 ; WX 602 ; N uni22C2 ; G 2126 -U 8899 ; WX 602 ; N uni22C3 ; G 2127 -U 8900 ; WX 602 ; N uni22C4 ; G 2128 -U 8901 ; WX 602 ; N dotmath ; G 2129 -U 8902 ; WX 602 ; N uni22C6 ; G 2130 -U 8909 ; WX 602 ; N uni22CD ; G 2131 -U 8910 ; WX 602 ; N uni22CE ; G 2132 -U 8911 ; WX 602 ; N uni22CF ; G 2133 -U 8912 ; WX 602 ; N uni22D0 ; G 2134 -U 8913 ; WX 602 ; N uni22D1 ; G 2135 -U 8922 ; WX 602 ; N uni22DA ; G 2136 -U 8923 ; WX 602 ; N uni22DB ; G 2137 -U 8924 ; WX 602 ; N uni22DC ; G 2138 -U 8925 ; WX 602 ; N uni22DD ; G 2139 -U 8926 ; WX 602 ; N uni22DE ; G 2140 -U 8927 ; WX 602 ; N uni22DF ; G 2141 -U 8928 ; WX 602 ; N uni22E0 ; G 2142 -U 8929 ; WX 602 ; N uni22E1 ; G 2143 -U 8930 ; WX 602 ; N uni22E2 ; G 2144 -U 8931 ; WX 602 ; N uni22E3 ; G 2145 -U 8932 ; WX 602 ; N uni22E4 ; G 2146 -U 8933 ; WX 602 ; N uni22E5 ; G 2147 -U 8934 ; WX 602 ; N uni22E6 ; G 2148 -U 8935 ; WX 602 ; N uni22E7 ; G 2149 -U 8936 ; WX 602 ; N uni22E8 ; G 2150 -U 8937 ; WX 602 ; N uni22E9 ; G 2151 -U 8943 ; WX 602 ; N uni22EF ; G 2152 -U 8960 ; WX 602 ; N uni2300 ; G 2153 -U 8961 ; WX 602 ; N uni2301 ; G 2154 -U 8962 ; WX 602 ; N house ; G 2155 -U 8963 ; WX 602 ; N uni2303 ; G 2156 -U 8964 ; WX 602 ; N uni2304 ; G 2157 -U 8965 ; WX 602 ; N uni2305 ; G 2158 -U 8966 ; WX 602 ; N uni2306 ; G 2159 -U 8968 ; WX 602 ; N uni2308 ; G 2160 -U 8969 ; WX 602 ; N uni2309 ; G 2161 -U 8970 ; WX 602 ; N uni230A ; G 2162 -U 8971 ; WX 602 ; N uni230B ; G 2163 -U 8972 ; WX 602 ; N uni230C ; G 2164 -U 8973 ; WX 602 ; N uni230D ; G 2165 -U 8974 ; WX 602 ; N uni230E ; G 2166 -U 8975 ; WX 602 ; N uni230F ; G 2167 -U 8976 ; WX 602 ; N revlogicalnot ; G 2168 -U 8977 ; WX 602 ; N uni2311 ; G 2169 -U 8978 ; WX 602 ; N uni2312 ; G 2170 -U 8979 ; WX 602 ; N uni2313 ; G 2171 -U 8980 ; WX 602 ; N uni2314 ; G 2172 -U 8981 ; WX 602 ; N uni2315 ; G 2173 -U 8984 ; WX 602 ; N uni2318 ; G 2174 -U 8985 ; WX 602 ; N uni2319 ; G 2175 -U 8988 ; WX 602 ; N uni231C ; G 2176 -U 8989 ; WX 602 ; N uni231D ; G 2177 -U 8990 ; WX 602 ; N uni231E ; G 2178 -U 8991 ; WX 602 ; N uni231F ; G 2179 -U 8992 ; WX 602 ; N integraltp ; G 2180 -U 8993 ; WX 602 ; N integralbt ; G 2181 -U 8997 ; WX 602 ; N uni2325 ; G 2182 -U 8998 ; WX 602 ; N uni2326 ; G 2183 -U 8999 ; WX 602 ; N uni2327 ; G 2184 -U 9000 ; WX 602 ; N uni2328 ; G 2185 -U 9003 ; WX 602 ; N uni232B ; G 2186 -U 9013 ; WX 602 ; N uni2335 ; G 2187 -U 9014 ; WX 602 ; N uni2336 ; G 2188 -U 9015 ; WX 602 ; N uni2337 ; G 2189 -U 9016 ; WX 602 ; N uni2338 ; G 2190 -U 9017 ; WX 602 ; N uni2339 ; G 2191 -U 9018 ; WX 602 ; N uni233A ; G 2192 -U 9019 ; WX 602 ; N uni233B ; G 2193 -U 9020 ; WX 602 ; N uni233C ; G 2194 -U 9021 ; WX 602 ; N uni233D ; G 2195 -U 9022 ; WX 602 ; N uni233E ; G 2196 -U 9023 ; WX 602 ; N uni233F ; G 2197 -U 9024 ; WX 602 ; N uni2340 ; G 2198 -U 9025 ; WX 602 ; N uni2341 ; G 2199 -U 9026 ; WX 602 ; N uni2342 ; G 2200 -U 9027 ; WX 602 ; N uni2343 ; G 2201 -U 9028 ; WX 602 ; N uni2344 ; G 2202 -U 9029 ; WX 602 ; N uni2345 ; G 2203 -U 9030 ; WX 602 ; N uni2346 ; G 2204 -U 9031 ; WX 602 ; N uni2347 ; G 2205 -U 9032 ; WX 602 ; N uni2348 ; G 2206 -U 9033 ; WX 602 ; N uni2349 ; G 2207 -U 9034 ; WX 602 ; N uni234A ; G 2208 -U 9035 ; WX 602 ; N uni234B ; G 2209 -U 9036 ; WX 602 ; N uni234C ; G 2210 -U 9037 ; WX 602 ; N uni234D ; G 2211 -U 9038 ; WX 602 ; N uni234E ; G 2212 -U 9039 ; WX 602 ; N uni234F ; G 2213 -U 9040 ; WX 602 ; N uni2350 ; G 2214 -U 9041 ; WX 602 ; N uni2351 ; G 2215 -U 9042 ; WX 602 ; N uni2352 ; G 2216 -U 9043 ; WX 602 ; N uni2353 ; G 2217 -U 9044 ; WX 602 ; N uni2354 ; G 2218 -U 9045 ; WX 602 ; N uni2355 ; G 2219 -U 9046 ; WX 602 ; N uni2356 ; G 2220 -U 9047 ; WX 602 ; N uni2357 ; G 2221 -U 9048 ; WX 602 ; N uni2358 ; G 2222 -U 9049 ; WX 602 ; N uni2359 ; G 2223 -U 9050 ; WX 602 ; N uni235A ; G 2224 -U 9051 ; WX 602 ; N uni235B ; G 2225 -U 9052 ; WX 602 ; N uni235C ; G 2226 -U 9053 ; WX 602 ; N uni235D ; G 2227 -U 9054 ; WX 602 ; N uni235E ; G 2228 -U 9055 ; WX 602 ; N uni235F ; G 2229 -U 9056 ; WX 602 ; N uni2360 ; G 2230 -U 9057 ; WX 602 ; N uni2361 ; G 2231 -U 9058 ; WX 602 ; N uni2362 ; G 2232 -U 9059 ; WX 602 ; N uni2363 ; G 2233 -U 9060 ; WX 602 ; N uni2364 ; G 2234 -U 9061 ; WX 602 ; N uni2365 ; G 2235 -U 9062 ; WX 602 ; N uni2366 ; G 2236 -U 9063 ; WX 602 ; N uni2367 ; G 2237 -U 9064 ; WX 602 ; N uni2368 ; G 2238 -U 9065 ; WX 602 ; N uni2369 ; G 2239 -U 9066 ; WX 602 ; N uni236A ; G 2240 -U 9067 ; WX 602 ; N uni236B ; G 2241 -U 9068 ; WX 602 ; N uni236C ; G 2242 -U 9069 ; WX 602 ; N uni236D ; G 2243 -U 9070 ; WX 602 ; N uni236E ; G 2244 -U 9071 ; WX 602 ; N uni236F ; G 2245 -U 9072 ; WX 602 ; N uni2370 ; G 2246 -U 9073 ; WX 602 ; N uni2371 ; G 2247 -U 9074 ; WX 602 ; N uni2372 ; G 2248 -U 9075 ; WX 602 ; N uni2373 ; G 2249 -U 9076 ; WX 602 ; N uni2374 ; G 2250 -U 9077 ; WX 602 ; N uni2375 ; G 2251 -U 9078 ; WX 602 ; N uni2376 ; G 2252 -U 9079 ; WX 602 ; N uni2377 ; G 2253 -U 9080 ; WX 602 ; N uni2378 ; G 2254 -U 9081 ; WX 602 ; N uni2379 ; G 2255 -U 9082 ; WX 602 ; N uni237A ; G 2256 -U 9085 ; WX 602 ; N uni237D ; G 2257 -U 9088 ; WX 602 ; N uni2380 ; G 2258 -U 9089 ; WX 602 ; N uni2381 ; G 2259 -U 9090 ; WX 602 ; N uni2382 ; G 2260 -U 9091 ; WX 602 ; N uni2383 ; G 2261 -U 9096 ; WX 602 ; N uni2388 ; G 2262 -U 9097 ; WX 602 ; N uni2389 ; G 2263 -U 9098 ; WX 602 ; N uni238A ; G 2264 -U 9099 ; WX 602 ; N uni238B ; G 2265 -U 9109 ; WX 602 ; N uni2395 ; G 2266 -U 9115 ; WX 602 ; N uni239B ; G 2267 -U 9116 ; WX 602 ; N uni239C ; G 2268 -U 9117 ; WX 602 ; N uni239D ; G 2269 -U 9118 ; WX 602 ; N uni239E ; G 2270 -U 9119 ; WX 602 ; N uni239F ; G 2271 -U 9120 ; WX 602 ; N uni23A0 ; G 2272 -U 9121 ; WX 602 ; N uni23A1 ; G 2273 -U 9122 ; WX 602 ; N uni23A2 ; G 2274 -U 9123 ; WX 602 ; N uni23A3 ; G 2275 -U 9124 ; WX 602 ; N uni23A4 ; G 2276 -U 9125 ; WX 602 ; N uni23A5 ; G 2277 -U 9126 ; WX 602 ; N uni23A6 ; G 2278 -U 9127 ; WX 602 ; N uni23A7 ; G 2279 -U 9128 ; WX 602 ; N uni23A8 ; G 2280 -U 9129 ; WX 602 ; N uni23A9 ; G 2281 -U 9130 ; WX 602 ; N uni23AA ; G 2282 -U 9131 ; WX 602 ; N uni23AB ; G 2283 -U 9132 ; WX 602 ; N uni23AC ; G 2284 -U 9133 ; WX 602 ; N uni23AD ; G 2285 -U 9134 ; WX 602 ; N uni23AE ; G 2286 -U 9166 ; WX 602 ; N uni23CE ; G 2287 -U 9167 ; WX 602 ; N uni23CF ; G 2288 -U 9251 ; WX 602 ; N uni2423 ; G 2289 -U 9472 ; WX 602 ; N SF100000 ; G 2290 -U 9473 ; WX 602 ; N uni2501 ; G 2291 -U 9474 ; WX 602 ; N SF110000 ; G 2292 -U 9475 ; WX 602 ; N uni2503 ; G 2293 -U 9476 ; WX 602 ; N uni2504 ; G 2294 -U 9477 ; WX 602 ; N uni2505 ; G 2295 -U 9478 ; WX 602 ; N uni2506 ; G 2296 -U 9479 ; WX 602 ; N uni2507 ; G 2297 -U 9480 ; WX 602 ; N uni2508 ; G 2298 -U 9481 ; WX 602 ; N uni2509 ; G 2299 -U 9482 ; WX 602 ; N uni250A ; G 2300 -U 9483 ; WX 602 ; N uni250B ; G 2301 -U 9484 ; WX 602 ; N SF010000 ; G 2302 -U 9485 ; WX 602 ; N uni250D ; G 2303 -U 9486 ; WX 602 ; N uni250E ; G 2304 -U 9487 ; WX 602 ; N uni250F ; G 2305 -U 9488 ; WX 602 ; N SF030000 ; G 2306 -U 9489 ; WX 602 ; N uni2511 ; G 2307 -U 9490 ; WX 602 ; N uni2512 ; G 2308 -U 9491 ; WX 602 ; N uni2513 ; G 2309 -U 9492 ; WX 602 ; N SF020000 ; G 2310 -U 9493 ; WX 602 ; N uni2515 ; G 2311 -U 9494 ; WX 602 ; N uni2516 ; G 2312 -U 9495 ; WX 602 ; N uni2517 ; G 2313 -U 9496 ; WX 602 ; N SF040000 ; G 2314 -U 9497 ; WX 602 ; N uni2519 ; G 2315 -U 9498 ; WX 602 ; N uni251A ; G 2316 -U 9499 ; WX 602 ; N uni251B ; G 2317 -U 9500 ; WX 602 ; N SF080000 ; G 2318 -U 9501 ; WX 602 ; N uni251D ; G 2319 -U 9502 ; WX 602 ; N uni251E ; G 2320 -U 9503 ; WX 602 ; N uni251F ; G 2321 -U 9504 ; WX 602 ; N uni2520 ; G 2322 -U 9505 ; WX 602 ; N uni2521 ; G 2323 -U 9506 ; WX 602 ; N uni2522 ; G 2324 -U 9507 ; WX 602 ; N uni2523 ; G 2325 -U 9508 ; WX 602 ; N SF090000 ; G 2326 -U 9509 ; WX 602 ; N uni2525 ; G 2327 -U 9510 ; WX 602 ; N uni2526 ; G 2328 -U 9511 ; WX 602 ; N uni2527 ; G 2329 -U 9512 ; WX 602 ; N uni2528 ; G 2330 -U 9513 ; WX 602 ; N uni2529 ; G 2331 -U 9514 ; WX 602 ; N uni252A ; G 2332 -U 9515 ; WX 602 ; N uni252B ; G 2333 -U 9516 ; WX 602 ; N SF060000 ; G 2334 -U 9517 ; WX 602 ; N uni252D ; G 2335 -U 9518 ; WX 602 ; N uni252E ; G 2336 -U 9519 ; WX 602 ; N uni252F ; G 2337 -U 9520 ; WX 602 ; N uni2530 ; G 2338 -U 9521 ; WX 602 ; N uni2531 ; G 2339 -U 9522 ; WX 602 ; N uni2532 ; G 2340 -U 9523 ; WX 602 ; N uni2533 ; G 2341 -U 9524 ; WX 602 ; N SF070000 ; G 2342 -U 9525 ; WX 602 ; N uni2535 ; G 2343 -U 9526 ; WX 602 ; N uni2536 ; G 2344 -U 9527 ; WX 602 ; N uni2537 ; G 2345 -U 9528 ; WX 602 ; N uni2538 ; G 2346 -U 9529 ; WX 602 ; N uni2539 ; G 2347 -U 9530 ; WX 602 ; N uni253A ; G 2348 -U 9531 ; WX 602 ; N uni253B ; G 2349 -U 9532 ; WX 602 ; N SF050000 ; G 2350 -U 9533 ; WX 602 ; N uni253D ; G 2351 -U 9534 ; WX 602 ; N uni253E ; G 2352 -U 9535 ; WX 602 ; N uni253F ; G 2353 -U 9536 ; WX 602 ; N uni2540 ; G 2354 -U 9537 ; WX 602 ; N uni2541 ; G 2355 -U 9538 ; WX 602 ; N uni2542 ; G 2356 -U 9539 ; WX 602 ; N uni2543 ; G 2357 -U 9540 ; WX 602 ; N uni2544 ; G 2358 -U 9541 ; WX 602 ; N uni2545 ; G 2359 -U 9542 ; WX 602 ; N uni2546 ; G 2360 -U 9543 ; WX 602 ; N uni2547 ; G 2361 -U 9544 ; WX 602 ; N uni2548 ; G 2362 -U 9545 ; WX 602 ; N uni2549 ; G 2363 -U 9546 ; WX 602 ; N uni254A ; G 2364 -U 9547 ; WX 602 ; N uni254B ; G 2365 -U 9548 ; WX 602 ; N uni254C ; G 2366 -U 9549 ; WX 602 ; N uni254D ; G 2367 -U 9550 ; WX 602 ; N uni254E ; G 2368 -U 9551 ; WX 602 ; N uni254F ; G 2369 -U 9552 ; WX 602 ; N SF430000 ; G 2370 -U 9553 ; WX 602 ; N SF240000 ; G 2371 -U 9554 ; WX 602 ; N SF510000 ; G 2372 -U 9555 ; WX 602 ; N SF520000 ; G 2373 -U 9556 ; WX 602 ; N SF390000 ; G 2374 -U 9557 ; WX 602 ; N SF220000 ; G 2375 -U 9558 ; WX 602 ; N SF210000 ; G 2376 -U 9559 ; WX 602 ; N SF250000 ; G 2377 -U 9560 ; WX 602 ; N SF500000 ; G 2378 -U 9561 ; WX 602 ; N SF490000 ; G 2379 -U 9562 ; WX 602 ; N SF380000 ; G 2380 -U 9563 ; WX 602 ; N SF280000 ; G 2381 -U 9564 ; WX 602 ; N SF270000 ; G 2382 -U 9565 ; WX 602 ; N SF260000 ; G 2383 -U 9566 ; WX 602 ; N SF360000 ; G 2384 -U 9567 ; WX 602 ; N SF370000 ; G 2385 -U 9568 ; WX 602 ; N SF420000 ; G 2386 -U 9569 ; WX 602 ; N SF190000 ; G 2387 -U 9570 ; WX 602 ; N SF200000 ; G 2388 -U 9571 ; WX 602 ; N SF230000 ; G 2389 -U 9572 ; WX 602 ; N SF470000 ; G 2390 -U 9573 ; WX 602 ; N SF480000 ; G 2391 -U 9574 ; WX 602 ; N SF410000 ; G 2392 -U 9575 ; WX 602 ; N SF450000 ; G 2393 -U 9576 ; WX 602 ; N SF460000 ; G 2394 -U 9577 ; WX 602 ; N SF400000 ; G 2395 -U 9578 ; WX 602 ; N SF540000 ; G 2396 -U 9579 ; WX 602 ; N SF530000 ; G 2397 -U 9580 ; WX 602 ; N SF440000 ; G 2398 -U 9581 ; WX 602 ; N uni256D ; G 2399 -U 9582 ; WX 602 ; N uni256E ; G 2400 -U 9583 ; WX 602 ; N uni256F ; G 2401 -U 9584 ; WX 602 ; N uni2570 ; G 2402 -U 9585 ; WX 602 ; N uni2571 ; G 2403 -U 9586 ; WX 602 ; N uni2572 ; G 2404 -U 9587 ; WX 602 ; N uni2573 ; G 2405 -U 9588 ; WX 602 ; N uni2574 ; G 2406 -U 9589 ; WX 602 ; N uni2575 ; G 2407 -U 9590 ; WX 602 ; N uni2576 ; G 2408 -U 9591 ; WX 602 ; N uni2577 ; G 2409 -U 9592 ; WX 602 ; N uni2578 ; G 2410 -U 9593 ; WX 602 ; N uni2579 ; G 2411 -U 9594 ; WX 602 ; N uni257A ; G 2412 -U 9595 ; WX 602 ; N uni257B ; G 2413 -U 9596 ; WX 602 ; N uni257C ; G 2414 -U 9597 ; WX 602 ; N uni257D ; G 2415 -U 9598 ; WX 602 ; N uni257E ; G 2416 -U 9599 ; WX 602 ; N uni257F ; G 2417 -U 9600 ; WX 602 ; N upblock ; G 2418 -U 9601 ; WX 602 ; N uni2581 ; G 2419 -U 9602 ; WX 602 ; N uni2582 ; G 2420 -U 9603 ; WX 602 ; N uni2583 ; G 2421 -U 9604 ; WX 602 ; N dnblock ; G 2422 -U 9605 ; WX 602 ; N uni2585 ; G 2423 -U 9606 ; WX 602 ; N uni2586 ; G 2424 -U 9607 ; WX 602 ; N uni2587 ; G 2425 -U 9608 ; WX 602 ; N block ; G 2426 -U 9609 ; WX 602 ; N uni2589 ; G 2427 -U 9610 ; WX 602 ; N uni258A ; G 2428 -U 9611 ; WX 602 ; N uni258B ; G 2429 -U 9612 ; WX 602 ; N lfblock ; G 2430 -U 9613 ; WX 602 ; N uni258D ; G 2431 -U 9614 ; WX 602 ; N uni258E ; G 2432 -U 9615 ; WX 602 ; N uni258F ; G 2433 -U 9616 ; WX 602 ; N rtblock ; G 2434 -U 9617 ; WX 602 ; N ltshade ; G 2435 -U 9618 ; WX 602 ; N shade ; G 2436 -U 9619 ; WX 602 ; N dkshade ; G 2437 -U 9620 ; WX 602 ; N uni2594 ; G 2438 -U 9621 ; WX 602 ; N uni2595 ; G 2439 -U 9622 ; WX 602 ; N uni2596 ; G 2440 -U 9623 ; WX 602 ; N uni2597 ; G 2441 -U 9624 ; WX 602 ; N uni2598 ; G 2442 -U 9625 ; WX 602 ; N uni2599 ; G 2443 -U 9626 ; WX 602 ; N uni259A ; G 2444 -U 9627 ; WX 602 ; N uni259B ; G 2445 -U 9628 ; WX 602 ; N uni259C ; G 2446 -U 9629 ; WX 602 ; N uni259D ; G 2447 -U 9630 ; WX 602 ; N uni259E ; G 2448 -U 9631 ; WX 602 ; N uni259F ; G 2449 -U 9632 ; WX 602 ; N filledbox ; G 2450 -U 9633 ; WX 602 ; N H22073 ; G 2451 -U 9634 ; WX 602 ; N uni25A2 ; G 2452 -U 9635 ; WX 602 ; N uni25A3 ; G 2453 -U 9636 ; WX 602 ; N uni25A4 ; G 2454 -U 9637 ; WX 602 ; N uni25A5 ; G 2455 -U 9638 ; WX 602 ; N uni25A6 ; G 2456 -U 9639 ; WX 602 ; N uni25A7 ; G 2457 -U 9640 ; WX 602 ; N uni25A8 ; G 2458 -U 9641 ; WX 602 ; N uni25A9 ; G 2459 -U 9642 ; WX 602 ; N H18543 ; G 2460 -U 9643 ; WX 602 ; N H18551 ; G 2461 -U 9644 ; WX 602 ; N filledrect ; G 2462 -U 9645 ; WX 602 ; N uni25AD ; G 2463 -U 9646 ; WX 602 ; N uni25AE ; G 2464 -U 9647 ; WX 602 ; N uni25AF ; G 2465 -U 9648 ; WX 602 ; N uni25B0 ; G 2466 -U 9649 ; WX 602 ; N uni25B1 ; G 2467 -U 9650 ; WX 602 ; N triagup ; G 2468 -U 9651 ; WX 602 ; N uni25B3 ; G 2469 -U 9652 ; WX 602 ; N uni25B4 ; G 2470 -U 9653 ; WX 602 ; N uni25B5 ; G 2471 -U 9654 ; WX 602 ; N uni25B6 ; G 2472 -U 9655 ; WX 602 ; N uni25B7 ; G 2473 -U 9656 ; WX 602 ; N uni25B8 ; G 2474 -U 9657 ; WX 602 ; N uni25B9 ; G 2475 -U 9658 ; WX 602 ; N triagrt ; G 2476 -U 9659 ; WX 602 ; N uni25BB ; G 2477 -U 9660 ; WX 602 ; N triagdn ; G 2478 -U 9661 ; WX 602 ; N uni25BD ; G 2479 -U 9662 ; WX 602 ; N uni25BE ; G 2480 -U 9663 ; WX 602 ; N uni25BF ; G 2481 -U 9664 ; WX 602 ; N uni25C0 ; G 2482 -U 9665 ; WX 602 ; N uni25C1 ; G 2483 -U 9666 ; WX 602 ; N uni25C2 ; G 2484 -U 9667 ; WX 602 ; N uni25C3 ; G 2485 -U 9668 ; WX 602 ; N triaglf ; G 2486 -U 9669 ; WX 602 ; N uni25C5 ; G 2487 -U 9670 ; WX 602 ; N uni25C6 ; G 2488 -U 9671 ; WX 602 ; N uni25C7 ; G 2489 -U 9672 ; WX 602 ; N uni25C8 ; G 2490 -U 9673 ; WX 602 ; N uni25C9 ; G 2491 -U 9674 ; WX 602 ; N lozenge ; G 2492 -U 9675 ; WX 602 ; N circle ; G 2493 -U 9676 ; WX 602 ; N uni25CC ; G 2494 -U 9677 ; WX 602 ; N uni25CD ; G 2495 -U 9678 ; WX 602 ; N uni25CE ; G 2496 -U 9679 ; WX 602 ; N H18533 ; G 2497 -U 9680 ; WX 602 ; N uni25D0 ; G 2498 -U 9681 ; WX 602 ; N uni25D1 ; G 2499 -U 9682 ; WX 602 ; N uni25D2 ; G 2500 -U 9683 ; WX 602 ; N uni25D3 ; G 2501 -U 9684 ; WX 602 ; N uni25D4 ; G 2502 -U 9685 ; WX 602 ; N uni25D5 ; G 2503 -U 9686 ; WX 602 ; N uni25D6 ; G 2504 -U 9687 ; WX 602 ; N uni25D7 ; G 2505 -U 9688 ; WX 602 ; N invbullet ; G 2506 -U 9689 ; WX 602 ; N invcircle ; G 2507 -U 9690 ; WX 602 ; N uni25DA ; G 2508 -U 9691 ; WX 602 ; N uni25DB ; G 2509 -U 9692 ; WX 602 ; N uni25DC ; G 2510 -U 9693 ; WX 602 ; N uni25DD ; G 2511 -U 9694 ; WX 602 ; N uni25DE ; G 2512 -U 9695 ; WX 602 ; N uni25DF ; G 2513 -U 9696 ; WX 602 ; N uni25E0 ; G 2514 -U 9697 ; WX 602 ; N uni25E1 ; G 2515 -U 9698 ; WX 602 ; N uni25E2 ; G 2516 -U 9699 ; WX 602 ; N uni25E3 ; G 2517 -U 9700 ; WX 602 ; N uni25E4 ; G 2518 -U 9701 ; WX 602 ; N uni25E5 ; G 2519 -U 9702 ; WX 602 ; N openbullet ; G 2520 -U 9703 ; WX 602 ; N uni25E7 ; G 2521 -U 9704 ; WX 602 ; N uni25E8 ; G 2522 -U 9705 ; WX 602 ; N uni25E9 ; G 2523 -U 9706 ; WX 602 ; N uni25EA ; G 2524 -U 9707 ; WX 602 ; N uni25EB ; G 2525 -U 9708 ; WX 602 ; N uni25EC ; G 2526 -U 9709 ; WX 602 ; N uni25ED ; G 2527 -U 9710 ; WX 602 ; N uni25EE ; G 2528 -U 9711 ; WX 602 ; N uni25EF ; G 2529 -U 9712 ; WX 602 ; N uni25F0 ; G 2530 -U 9713 ; WX 602 ; N uni25F1 ; G 2531 -U 9714 ; WX 602 ; N uni25F2 ; G 2532 -U 9715 ; WX 602 ; N uni25F3 ; G 2533 -U 9716 ; WX 602 ; N uni25F4 ; G 2534 -U 9717 ; WX 602 ; N uni25F5 ; G 2535 -U 9718 ; WX 602 ; N uni25F6 ; G 2536 -U 9719 ; WX 602 ; N uni25F7 ; G 2537 -U 9720 ; WX 602 ; N uni25F8 ; G 2538 -U 9721 ; WX 602 ; N uni25F9 ; G 2539 -U 9722 ; WX 602 ; N uni25FA ; G 2540 -U 9723 ; WX 602 ; N uni25FB ; G 2541 -U 9724 ; WX 602 ; N uni25FC ; G 2542 -U 9725 ; WX 602 ; N uni25FD ; G 2543 -U 9726 ; WX 602 ; N uni25FE ; G 2544 -U 9727 ; WX 602 ; N uni25FF ; G 2545 -U 9728 ; WX 602 ; N uni2600 ; G 2546 -U 9784 ; WX 602 ; N uni2638 ; G 2547 -U 9785 ; WX 602 ; N uni2639 ; G 2548 -U 9786 ; WX 602 ; N smileface ; G 2549 -U 9787 ; WX 602 ; N invsmileface ; G 2550 -U 9788 ; WX 602 ; N sun ; G 2551 -U 9791 ; WX 602 ; N uni263F ; G 2552 -U 9792 ; WX 602 ; N female ; G 2553 -U 9793 ; WX 602 ; N uni2641 ; G 2554 -U 9794 ; WX 602 ; N male ; G 2555 -U 9795 ; WX 602 ; N uni2643 ; G 2556 -U 9796 ; WX 602 ; N uni2644 ; G 2557 -U 9797 ; WX 602 ; N uni2645 ; G 2558 -U 9798 ; WX 602 ; N uni2646 ; G 2559 -U 9799 ; WX 602 ; N uni2647 ; G 2560 -U 9824 ; WX 602 ; N spade ; G 2561 -U 9825 ; WX 602 ; N uni2661 ; G 2562 -U 9826 ; WX 602 ; N uni2662 ; G 2563 -U 9827 ; WX 602 ; N club ; G 2564 -U 9828 ; WX 602 ; N uni2664 ; G 2565 -U 9829 ; WX 602 ; N heart ; G 2566 -U 9830 ; WX 602 ; N diamond ; G 2567 -U 9831 ; WX 602 ; N uni2667 ; G 2568 -U 9833 ; WX 602 ; N uni2669 ; G 2569 -U 9834 ; WX 602 ; N musicalnote ; G 2570 -U 9835 ; WX 602 ; N musicalnotedbl ; G 2571 -U 9836 ; WX 602 ; N uni266C ; G 2572 -U 9837 ; WX 602 ; N uni266D ; G 2573 -U 9838 ; WX 602 ; N uni266E ; G 2574 -U 9839 ; WX 602 ; N uni266F ; G 2575 -U 10178 ; WX 602 ; N uni27C2 ; G 2576 -U 10181 ; WX 602 ; N uni27C5 ; G 2577 -U 10182 ; WX 602 ; N uni27C6 ; G 2578 -U 10204 ; WX 602 ; N uni27DC ; G 2579 -U 10208 ; WX 602 ; N uni27E0 ; G 2580 -U 10214 ; WX 602 ; N uni27E6 ; G 2581 -U 10215 ; WX 602 ; N uni27E7 ; G 2582 -U 10216 ; WX 602 ; N uni27E8 ; G 2583 -U 10217 ; WX 602 ; N uni27E9 ; G 2584 -U 10218 ; WX 602 ; N uni27EA ; G 2585 -U 10219 ; WX 602 ; N uni27EB ; G 2586 -U 10229 ; WX 602 ; N uni27F5 ; G 2587 -U 10230 ; WX 602 ; N uni27F6 ; G 2588 -U 10231 ; WX 602 ; N uni27F7 ; G 2589 -U 10631 ; WX 602 ; N uni2987 ; G 2590 -U 10632 ; WX 602 ; N uni2988 ; G 2591 -U 10647 ; WX 602 ; N uni2997 ; G 2592 -U 10648 ; WX 602 ; N uni2998 ; G 2593 -U 10731 ; WX 602 ; N uni29EB ; G 2594 -U 10746 ; WX 602 ; N uni29FA ; G 2595 -U 10747 ; WX 602 ; N uni29FB ; G 2596 -U 10752 ; WX 602 ; N uni2A00 ; G 2597 -U 10799 ; WX 602 ; N uni2A2F ; G 2598 -U 10858 ; WX 602 ; N uni2A6A ; G 2599 -U 10859 ; WX 602 ; N uni2A6B ; G 2600 -U 11013 ; WX 602 ; N uni2B05 ; G 2601 -U 11014 ; WX 602 ; N uni2B06 ; G 2602 -U 11015 ; WX 602 ; N uni2B07 ; G 2603 -U 11016 ; WX 602 ; N uni2B08 ; G 2604 -U 11017 ; WX 602 ; N uni2B09 ; G 2605 -U 11018 ; WX 602 ; N uni2B0A ; G 2606 -U 11019 ; WX 602 ; N uni2B0B ; G 2607 -U 11020 ; WX 602 ; N uni2B0C ; G 2608 -U 11021 ; WX 602 ; N uni2B0D ; G 2609 -U 11026 ; WX 602 ; N uni2B12 ; G 2610 -U 11027 ; WX 602 ; N uni2B13 ; G 2611 -U 11028 ; WX 602 ; N uni2B14 ; G 2612 -U 11029 ; WX 602 ; N uni2B15 ; G 2613 -U 11030 ; WX 602 ; N uni2B16 ; G 2614 -U 11031 ; WX 602 ; N uni2B17 ; G 2615 -U 11032 ; WX 602 ; N uni2B18 ; G 2616 -U 11033 ; WX 602 ; N uni2B19 ; G 2617 -U 11034 ; WX 602 ; N uni2B1A ; G 2618 -U 11364 ; WX 602 ; N uni2C64 ; G 2619 -U 11373 ; WX 602 ; N uni2C6D ; G 2620 -U 11374 ; WX 602 ; N uni2C6E ; G 2621 -U 11375 ; WX 602 ; N uni2C6F ; G 2622 -U 11376 ; WX 602 ; N uni2C70 ; G 2623 -U 11381 ; WX 602 ; N uni2C75 ; G 2624 -U 11382 ; WX 602 ; N uni2C76 ; G 2625 -U 11383 ; WX 602 ; N uni2C77 ; G 2626 -U 11385 ; WX 602 ; N uni2C79 ; G 2627 -U 11386 ; WX 602 ; N uni2C7A ; G 2628 -U 11388 ; WX 602 ; N uni2C7C ; G 2629 -U 11389 ; WX 602 ; N uni2C7D ; G 2630 -U 11390 ; WX 602 ; N uni2C7E ; G 2631 -U 11391 ; WX 602 ; N uni2C7F ; G 2632 -U 11800 ; WX 602 ; N uni2E18 ; G 2633 -U 11807 ; WX 602 ; N uni2E1F ; G 2634 -U 11810 ; WX 602 ; N uni2E22 ; G 2635 -U 11811 ; WX 602 ; N uni2E23 ; G 2636 -U 11812 ; WX 602 ; N uni2E24 ; G 2637 -U 11813 ; WX 602 ; N uni2E25 ; G 2638 -U 11822 ; WX 602 ; N uni2E2E ; G 2639 -U 42760 ; WX 602 ; N uniA708 ; G 2640 -U 42761 ; WX 602 ; N uniA709 ; G 2641 -U 42762 ; WX 602 ; N uniA70A ; G 2642 -U 42763 ; WX 602 ; N uniA70B ; G 2643 -U 42764 ; WX 602 ; N uniA70C ; G 2644 -U 42765 ; WX 602 ; N uniA70D ; G 2645 -U 42766 ; WX 602 ; N uniA70E ; G 2646 -U 42767 ; WX 602 ; N uniA70F ; G 2647 -U 42768 ; WX 602 ; N uniA710 ; G 2648 -U 42769 ; WX 602 ; N uniA711 ; G 2649 -U 42770 ; WX 602 ; N uniA712 ; G 2650 -U 42771 ; WX 602 ; N uniA713 ; G 2651 -U 42772 ; WX 602 ; N uniA714 ; G 2652 -U 42773 ; WX 602 ; N uniA715 ; G 2653 -U 42774 ; WX 602 ; N uniA716 ; G 2654 -U 42779 ; WX 602 ; N uniA71B ; G 2655 -U 42780 ; WX 602 ; N uniA71C ; G 2656 -U 42781 ; WX 602 ; N uniA71D ; G 2657 -U 42782 ; WX 602 ; N uniA71E ; G 2658 -U 42783 ; WX 602 ; N uniA71F ; G 2659 -U 42786 ; WX 602 ; N uniA722 ; G 2660 -U 42787 ; WX 602 ; N uniA723 ; G 2661 -U 42788 ; WX 602 ; N uniA724 ; G 2662 -U 42789 ; WX 602 ; N uniA725 ; G 2663 -U 42790 ; WX 602 ; N uniA726 ; G 2664 -U 42791 ; WX 602 ; N uniA727 ; G 2665 -U 42889 ; WX 602 ; N uniA789 ; G 2666 -U 42890 ; WX 602 ; N uniA78A ; G 2667 -U 42891 ; WX 602 ; N uniA78B ; G 2668 -U 42892 ; WX 602 ; N uniA78C ; G 2669 -U 42893 ; WX 602 ; N uniA78D ; G 2670 -U 42894 ; WX 602 ; N uniA78E ; G 2671 -U 42896 ; WX 602 ; N uniA790 ; G 2672 -U 42897 ; WX 602 ; N uniA791 ; G 2673 -U 42922 ; WX 602 ; N uniA7AA ; G 2674 -U 43000 ; WX 602 ; N uniA7F8 ; G 2675 -U 43001 ; WX 602 ; N uniA7F9 ; G 2676 -U 63173 ; WX 602 ; N uniF6C5 ; G 2677 -U 64257 ; WX 602 ; N fi ; G 2678 -U 64258 ; WX 602 ; N fl ; G 2679 -U 65529 ; WX 602 ; N uniFFF9 ; G 2680 -U 65530 ; WX 602 ; N uniFFFA ; G 2681 -U 65531 ; WX 602 ; N uniFFFB ; G 2682 -U 65532 ; WX 602 ; N uniFFFC ; G 2683 -U 65533 ; WX 602 ; N uniFFFD ; G 2684 -EndCharMetrics -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ttf deleted file mode 100644 index f578602..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ufm deleted file mode 100644 index 6b2d4ac..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ufm +++ /dev/null @@ -1,3284 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Sans Mono -FontSubfamily Book -UniqueID DejaVu Sans Mono -FullName DejaVu Sans Mono -Version Version 2.37 -PostScriptName DejaVuSansMono -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -Weight Medium -ItalicAngle 0 -IsFixedPitch true -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 928 -Descender -236 -FontBBox -558 -375 718 1028 -StartCharMetrics 3377 -U 32 ; WX 602 ; N space ; G 3 -U 33 ; WX 602 ; N exclam ; G 4 -U 34 ; WX 602 ; N quotedbl ; G 5 -U 35 ; WX 602 ; N numbersign ; G 6 -U 36 ; WX 602 ; N dollar ; G 7 -U 37 ; WX 602 ; N percent ; G 8 -U 38 ; WX 602 ; N ampersand ; G 9 -U 39 ; WX 602 ; N quotesingle ; G 10 -U 40 ; WX 602 ; N parenleft ; G 11 -U 41 ; WX 602 ; N parenright ; G 12 -U 42 ; WX 602 ; N asterisk ; G 13 -U 43 ; WX 602 ; N plus ; G 14 -U 44 ; WX 602 ; N comma ; G 15 -U 45 ; WX 602 ; N hyphen ; G 16 -U 46 ; WX 602 ; N period ; G 17 -U 47 ; WX 602 ; N slash ; G 18 -U 48 ; WX 602 ; N zero ; G 19 -U 49 ; WX 602 ; N one ; G 20 -U 50 ; WX 602 ; N two ; G 21 -U 51 ; WX 602 ; N three ; G 22 -U 52 ; WX 602 ; N four ; G 23 -U 53 ; WX 602 ; N five ; G 24 -U 54 ; WX 602 ; N six ; G 25 -U 55 ; WX 602 ; N seven ; G 26 -U 56 ; WX 602 ; N eight ; G 27 -U 57 ; WX 602 ; N nine ; G 28 -U 58 ; WX 602 ; N colon ; G 29 -U 59 ; WX 602 ; N semicolon ; G 30 -U 60 ; WX 602 ; N less ; G 31 -U 61 ; WX 602 ; N equal ; G 32 -U 62 ; WX 602 ; N greater ; G 33 -U 63 ; WX 602 ; N question ; G 34 -U 64 ; WX 602 ; N at ; G 35 -U 65 ; WX 602 ; N A ; G 36 -U 66 ; WX 602 ; N B ; G 37 -U 67 ; WX 602 ; N C ; G 38 -U 68 ; WX 602 ; N D ; G 39 -U 69 ; WX 602 ; N E ; G 40 -U 70 ; WX 602 ; N F ; G 41 -U 71 ; WX 602 ; N G ; G 42 -U 72 ; WX 602 ; N H ; G 43 -U 73 ; WX 602 ; N I ; G 44 -U 74 ; WX 602 ; N J ; G 45 -U 75 ; WX 602 ; N K ; G 46 -U 76 ; WX 602 ; N L ; G 47 -U 77 ; WX 602 ; N M ; G 48 -U 78 ; WX 602 ; N N ; G 49 -U 79 ; WX 602 ; N O ; G 50 -U 80 ; WX 602 ; N P ; G 51 -U 81 ; WX 602 ; N Q ; G 52 -U 82 ; WX 602 ; N R ; G 53 -U 83 ; WX 602 ; N S ; G 54 -U 84 ; WX 602 ; N T ; G 55 -U 85 ; WX 602 ; N U ; G 56 -U 86 ; WX 602 ; N V ; G 57 -U 87 ; WX 602 ; N W ; G 58 -U 88 ; WX 602 ; N X ; G 59 -U 89 ; WX 602 ; N Y ; G 60 -U 90 ; WX 602 ; N Z ; G 61 -U 91 ; WX 602 ; N bracketleft ; G 62 -U 92 ; WX 602 ; N backslash ; G 63 -U 93 ; WX 602 ; N bracketright ; G 64 -U 94 ; WX 602 ; N asciicircum ; G 65 -U 95 ; WX 602 ; N underscore ; G 66 -U 96 ; WX 602 ; N grave ; G 67 -U 97 ; WX 602 ; N a ; G 68 -U 98 ; WX 602 ; N b ; G 69 -U 99 ; WX 602 ; N c ; G 70 -U 100 ; WX 602 ; N d ; G 71 -U 101 ; WX 602 ; N e ; G 72 -U 102 ; WX 602 ; N f ; G 73 -U 103 ; WX 602 ; N g ; G 74 -U 104 ; WX 602 ; N h ; G 75 -U 105 ; WX 602 ; N i ; G 76 -U 106 ; WX 602 ; N j ; G 77 -U 107 ; WX 602 ; N k ; G 78 -U 108 ; WX 602 ; N l ; G 79 -U 109 ; WX 602 ; N m ; G 80 -U 110 ; WX 602 ; N n ; G 81 -U 111 ; WX 602 ; N o ; G 82 -U 112 ; WX 602 ; N p ; G 83 -U 113 ; WX 602 ; N q ; G 84 -U 114 ; WX 602 ; N r ; G 85 -U 115 ; WX 602 ; N s ; G 86 -U 116 ; WX 602 ; N t ; G 87 -U 117 ; WX 602 ; N u ; G 88 -U 118 ; WX 602 ; N v ; G 89 -U 119 ; WX 602 ; N w ; G 90 -U 120 ; WX 602 ; N x ; G 91 -U 121 ; WX 602 ; N y ; G 92 -U 122 ; WX 602 ; N z ; G 93 -U 123 ; WX 602 ; N braceleft ; G 94 -U 124 ; WX 602 ; N bar ; G 95 -U 125 ; WX 602 ; N braceright ; G 96 -U 126 ; WX 602 ; N asciitilde ; G 97 -U 160 ; WX 602 ; N nbspace ; G 98 -U 161 ; WX 602 ; N exclamdown ; G 99 -U 162 ; WX 602 ; N cent ; G 100 -U 163 ; WX 602 ; N sterling ; G 101 -U 164 ; WX 602 ; N currency ; G 102 -U 165 ; WX 602 ; N yen ; G 103 -U 166 ; WX 602 ; N brokenbar ; G 104 -U 167 ; WX 602 ; N section ; G 105 -U 168 ; WX 602 ; N dieresis ; G 106 -U 169 ; WX 602 ; N copyright ; G 107 -U 170 ; WX 602 ; N ordfeminine ; G 108 -U 171 ; WX 602 ; N guillemotleft ; G 109 -U 172 ; WX 602 ; N logicalnot ; G 110 -U 173 ; WX 602 ; N sfthyphen ; G 111 -U 174 ; WX 602 ; N registered ; G 112 -U 175 ; WX 602 ; N macron ; G 113 -U 176 ; WX 602 ; N degree ; G 114 -U 177 ; WX 602 ; N plusminus ; G 115 -U 178 ; WX 602 ; N twosuperior ; G 116 -U 179 ; WX 602 ; N threesuperior ; G 117 -U 180 ; WX 602 ; N acute ; G 118 -U 181 ; WX 602 ; N mu ; G 119 -U 182 ; WX 602 ; N paragraph ; G 120 -U 183 ; WX 602 ; N periodcentered ; G 121 -U 184 ; WX 602 ; N cedilla ; G 122 -U 185 ; WX 602 ; N onesuperior ; G 123 -U 186 ; WX 602 ; N ordmasculine ; G 124 -U 187 ; WX 602 ; N guillemotright ; G 125 -U 188 ; WX 602 ; N onequarter ; G 126 -U 189 ; WX 602 ; N onehalf ; G 127 -U 190 ; WX 602 ; N threequarters ; G 128 -U 191 ; WX 602 ; N questiondown ; G 129 -U 192 ; WX 602 ; N Agrave ; G 130 -U 193 ; WX 602 ; N Aacute ; G 131 -U 194 ; WX 602 ; N Acircumflex ; G 132 -U 195 ; WX 602 ; N Atilde ; G 133 -U 196 ; WX 602 ; N Adieresis ; G 134 -U 197 ; WX 602 ; N Aring ; G 135 -U 198 ; WX 602 ; N AE ; G 136 -U 199 ; WX 602 ; N Ccedilla ; G 137 -U 200 ; WX 602 ; N Egrave ; G 138 -U 201 ; WX 602 ; N Eacute ; G 139 -U 202 ; WX 602 ; N Ecircumflex ; G 140 -U 203 ; WX 602 ; N Edieresis ; G 141 -U 204 ; WX 602 ; N Igrave ; G 142 -U 205 ; WX 602 ; N Iacute ; G 143 -U 206 ; WX 602 ; N Icircumflex ; G 144 -U 207 ; WX 602 ; N Idieresis ; G 145 -U 208 ; WX 602 ; N Eth ; G 146 -U 209 ; WX 602 ; N Ntilde ; G 147 -U 210 ; WX 602 ; N Ograve ; G 148 -U 211 ; WX 602 ; N Oacute ; G 149 -U 212 ; WX 602 ; N Ocircumflex ; G 150 -U 213 ; WX 602 ; N Otilde ; G 151 -U 214 ; WX 602 ; N Odieresis ; G 152 -U 215 ; WX 602 ; N multiply ; G 153 -U 216 ; WX 602 ; N Oslash ; G 154 -U 217 ; WX 602 ; N Ugrave ; G 155 -U 218 ; WX 602 ; N Uacute ; G 156 -U 219 ; WX 602 ; N Ucircumflex ; G 157 -U 220 ; WX 602 ; N Udieresis ; G 158 -U 221 ; WX 602 ; N Yacute ; G 159 -U 222 ; WX 602 ; N Thorn ; G 160 -U 223 ; WX 602 ; N germandbls ; G 161 -U 224 ; WX 602 ; N agrave ; G 162 -U 225 ; WX 602 ; N aacute ; G 163 -U 226 ; WX 602 ; N acircumflex ; G 164 -U 227 ; WX 602 ; N atilde ; G 165 -U 228 ; WX 602 ; N adieresis ; G 166 -U 229 ; WX 602 ; N aring ; G 167 -U 230 ; WX 602 ; N ae ; G 168 -U 231 ; WX 602 ; N ccedilla ; G 169 -U 232 ; WX 602 ; N egrave ; G 170 -U 233 ; WX 602 ; N eacute ; G 171 -U 234 ; WX 602 ; N ecircumflex ; G 172 -U 235 ; WX 602 ; N edieresis ; G 173 -U 236 ; WX 602 ; N igrave ; G 174 -U 237 ; WX 602 ; N iacute ; G 175 -U 238 ; WX 602 ; N icircumflex ; G 176 -U 239 ; WX 602 ; N idieresis ; G 177 -U 240 ; WX 602 ; N eth ; G 178 -U 241 ; WX 602 ; N ntilde ; G 179 -U 242 ; WX 602 ; N ograve ; G 180 -U 243 ; WX 602 ; N oacute ; G 181 -U 244 ; WX 602 ; N ocircumflex ; G 182 -U 245 ; WX 602 ; N otilde ; G 183 -U 246 ; WX 602 ; N odieresis ; G 184 -U 247 ; WX 602 ; N divide ; G 185 -U 248 ; WX 602 ; N oslash ; G 186 -U 249 ; WX 602 ; N ugrave ; G 187 -U 250 ; WX 602 ; N uacute ; G 188 -U 251 ; WX 602 ; N ucircumflex ; G 189 -U 252 ; WX 602 ; N udieresis ; G 190 -U 253 ; WX 602 ; N yacute ; G 191 -U 254 ; WX 602 ; N thorn ; G 192 -U 255 ; WX 602 ; N ydieresis ; G 193 -U 256 ; WX 602 ; N Amacron ; G 194 -U 257 ; WX 602 ; N amacron ; G 195 -U 258 ; WX 602 ; N Abreve ; G 196 -U 259 ; WX 602 ; N abreve ; G 197 -U 260 ; WX 602 ; N Aogonek ; G 198 -U 261 ; WX 602 ; N aogonek ; G 199 -U 262 ; WX 602 ; N Cacute ; G 200 -U 263 ; WX 602 ; N cacute ; G 201 -U 264 ; WX 602 ; N Ccircumflex ; G 202 -U 265 ; WX 602 ; N ccircumflex ; G 203 -U 266 ; WX 602 ; N Cdotaccent ; G 204 -U 267 ; WX 602 ; N cdotaccent ; G 205 -U 268 ; WX 602 ; N Ccaron ; G 206 -U 269 ; WX 602 ; N ccaron ; G 207 -U 270 ; WX 602 ; N Dcaron ; G 208 -U 271 ; WX 602 ; N dcaron ; G 209 -U 272 ; WX 602 ; N Dcroat ; G 210 -U 273 ; WX 602 ; N dmacron ; G 211 -U 274 ; WX 602 ; N Emacron ; G 212 -U 275 ; WX 602 ; N emacron ; G 213 -U 276 ; WX 602 ; N Ebreve ; G 214 -U 277 ; WX 602 ; N ebreve ; G 215 -U 278 ; WX 602 ; N Edotaccent ; G 216 -U 279 ; WX 602 ; N edotaccent ; G 217 -U 280 ; WX 602 ; N Eogonek ; G 218 -U 281 ; WX 602 ; N eogonek ; G 219 -U 282 ; WX 602 ; N Ecaron ; G 220 -U 283 ; WX 602 ; N ecaron ; G 221 -U 284 ; WX 602 ; N Gcircumflex ; G 222 -U 285 ; WX 602 ; N gcircumflex ; G 223 -U 286 ; WX 602 ; N Gbreve ; G 224 -U 287 ; WX 602 ; N gbreve ; G 225 -U 288 ; WX 602 ; N Gdotaccent ; G 226 -U 289 ; WX 602 ; N gdotaccent ; G 227 -U 290 ; WX 602 ; N Gcommaaccent ; G 228 -U 291 ; WX 602 ; N gcommaaccent ; G 229 -U 292 ; WX 602 ; N Hcircumflex ; G 230 -U 293 ; WX 602 ; N hcircumflex ; G 231 -U 294 ; WX 602 ; N Hbar ; G 232 -U 295 ; WX 602 ; N hbar ; G 233 -U 296 ; WX 602 ; N Itilde ; G 234 -U 297 ; WX 602 ; N itilde ; G 235 -U 298 ; WX 602 ; N Imacron ; G 236 -U 299 ; WX 602 ; N imacron ; G 237 -U 300 ; WX 602 ; N Ibreve ; G 238 -U 301 ; WX 602 ; N ibreve ; G 239 -U 302 ; WX 602 ; N Iogonek ; G 240 -U 303 ; WX 602 ; N iogonek ; G 241 -U 304 ; WX 602 ; N Idot ; G 242 -U 305 ; WX 602 ; N dotlessi ; G 243 -U 306 ; WX 602 ; N IJ ; G 244 -U 307 ; WX 602 ; N ij ; G 245 -U 308 ; WX 602 ; N Jcircumflex ; G 246 -U 309 ; WX 602 ; N jcircumflex ; G 247 -U 310 ; WX 602 ; N Kcommaaccent ; G 248 -U 311 ; WX 602 ; N kcommaaccent ; G 249 -U 312 ; WX 602 ; N kgreenlandic ; G 250 -U 313 ; WX 602 ; N Lacute ; G 251 -U 314 ; WX 602 ; N lacute ; G 252 -U 315 ; WX 602 ; N Lcommaaccent ; G 253 -U 316 ; WX 602 ; N lcommaaccent ; G 254 -U 317 ; WX 602 ; N Lcaron ; G 255 -U 318 ; WX 602 ; N lcaron ; G 256 -U 319 ; WX 602 ; N Ldot ; G 257 -U 320 ; WX 602 ; N ldot ; G 258 -U 321 ; WX 602 ; N Lslash ; G 259 -U 322 ; WX 602 ; N lslash ; G 260 -U 323 ; WX 602 ; N Nacute ; G 261 -U 324 ; WX 602 ; N nacute ; G 262 -U 325 ; WX 602 ; N Ncommaaccent ; G 263 -U 326 ; WX 602 ; N ncommaaccent ; G 264 -U 327 ; WX 602 ; N Ncaron ; G 265 -U 328 ; WX 602 ; N ncaron ; G 266 -U 329 ; WX 602 ; N napostrophe ; G 267 -U 330 ; WX 602 ; N Eng ; G 268 -U 331 ; WX 602 ; N eng ; G 269 -U 332 ; WX 602 ; N Omacron ; G 270 -U 333 ; WX 602 ; N omacron ; G 271 -U 334 ; WX 602 ; N Obreve ; G 272 -U 335 ; WX 602 ; N obreve ; G 273 -U 336 ; WX 602 ; N Ohungarumlaut ; G 274 -U 337 ; WX 602 ; N ohungarumlaut ; G 275 -U 338 ; WX 602 ; N OE ; G 276 -U 339 ; WX 602 ; N oe ; G 277 -U 340 ; WX 602 ; N Racute ; G 278 -U 341 ; WX 602 ; N racute ; G 279 -U 342 ; WX 602 ; N Rcommaaccent ; G 280 -U 343 ; WX 602 ; N rcommaaccent ; G 281 -U 344 ; WX 602 ; N Rcaron ; G 282 -U 345 ; WX 602 ; N rcaron ; G 283 -U 346 ; WX 602 ; N Sacute ; G 284 -U 347 ; WX 602 ; N sacute ; G 285 -U 348 ; WX 602 ; N Scircumflex ; G 286 -U 349 ; WX 602 ; N scircumflex ; G 287 -U 350 ; WX 602 ; N Scedilla ; G 288 -U 351 ; WX 602 ; N scedilla ; G 289 -U 352 ; WX 602 ; N Scaron ; G 290 -U 353 ; WX 602 ; N scaron ; G 291 -U 354 ; WX 602 ; N Tcommaaccent ; G 292 -U 355 ; WX 602 ; N tcommaaccent ; G 293 -U 356 ; WX 602 ; N Tcaron ; G 294 -U 357 ; WX 602 ; N tcaron ; G 295 -U 358 ; WX 602 ; N Tbar ; G 296 -U 359 ; WX 602 ; N tbar ; G 297 -U 360 ; WX 602 ; N Utilde ; G 298 -U 361 ; WX 602 ; N utilde ; G 299 -U 362 ; WX 602 ; N Umacron ; G 300 -U 363 ; WX 602 ; N umacron ; G 301 -U 364 ; WX 602 ; N Ubreve ; G 302 -U 365 ; WX 602 ; N ubreve ; G 303 -U 366 ; WX 602 ; N Uring ; G 304 -U 367 ; WX 602 ; N uring ; G 305 -U 368 ; WX 602 ; N Uhungarumlaut ; G 306 -U 369 ; WX 602 ; N uhungarumlaut ; G 307 -U 370 ; WX 602 ; N Uogonek ; G 308 -U 371 ; WX 602 ; N uogonek ; G 309 -U 372 ; WX 602 ; N Wcircumflex ; G 310 -U 373 ; WX 602 ; N wcircumflex ; G 311 -U 374 ; WX 602 ; N Ycircumflex ; G 312 -U 375 ; WX 602 ; N ycircumflex ; G 313 -U 376 ; WX 602 ; N Ydieresis ; G 314 -U 377 ; WX 602 ; N Zacute ; G 315 -U 378 ; WX 602 ; N zacute ; G 316 -U 379 ; WX 602 ; N Zdotaccent ; G 317 -U 380 ; WX 602 ; N zdotaccent ; G 318 -U 381 ; WX 602 ; N Zcaron ; G 319 -U 382 ; WX 602 ; N zcaron ; G 320 -U 383 ; WX 602 ; N longs ; G 321 -U 384 ; WX 602 ; N uni0180 ; G 322 -U 385 ; WX 602 ; N uni0181 ; G 323 -U 386 ; WX 602 ; N uni0182 ; G 324 -U 387 ; WX 602 ; N uni0183 ; G 325 -U 388 ; WX 602 ; N uni0184 ; G 326 -U 389 ; WX 602 ; N uni0185 ; G 327 -U 390 ; WX 602 ; N uni0186 ; G 328 -U 391 ; WX 602 ; N uni0187 ; G 329 -U 392 ; WX 602 ; N uni0188 ; G 330 -U 393 ; WX 602 ; N uni0189 ; G 331 -U 394 ; WX 602 ; N uni018A ; G 332 -U 395 ; WX 602 ; N uni018B ; G 333 -U 396 ; WX 602 ; N uni018C ; G 334 -U 397 ; WX 602 ; N uni018D ; G 335 -U 398 ; WX 602 ; N uni018E ; G 336 -U 399 ; WX 602 ; N uni018F ; G 337 -U 400 ; WX 602 ; N uni0190 ; G 338 -U 401 ; WX 602 ; N uni0191 ; G 339 -U 402 ; WX 602 ; N florin ; G 340 -U 403 ; WX 602 ; N uni0193 ; G 341 -U 404 ; WX 602 ; N uni0194 ; G 342 -U 405 ; WX 602 ; N uni0195 ; G 343 -U 406 ; WX 602 ; N uni0196 ; G 344 -U 407 ; WX 602 ; N uni0197 ; G 345 -U 408 ; WX 602 ; N uni0198 ; G 346 -U 409 ; WX 602 ; N uni0199 ; G 347 -U 410 ; WX 602 ; N uni019A ; G 348 -U 411 ; WX 602 ; N uni019B ; G 349 -U 412 ; WX 602 ; N uni019C ; G 350 -U 413 ; WX 602 ; N uni019D ; G 351 -U 414 ; WX 602 ; N uni019E ; G 352 -U 415 ; WX 602 ; N uni019F ; G 353 -U 416 ; WX 602 ; N Ohorn ; G 354 -U 417 ; WX 602 ; N ohorn ; G 355 -U 418 ; WX 602 ; N uni01A2 ; G 356 -U 419 ; WX 602 ; N uni01A3 ; G 357 -U 420 ; WX 602 ; N uni01A4 ; G 358 -U 421 ; WX 602 ; N uni01A5 ; G 359 -U 422 ; WX 602 ; N uni01A6 ; G 360 -U 423 ; WX 602 ; N uni01A7 ; G 361 -U 424 ; WX 602 ; N uni01A8 ; G 362 -U 425 ; WX 602 ; N uni01A9 ; G 363 -U 426 ; WX 602 ; N uni01AA ; G 364 -U 427 ; WX 602 ; N uni01AB ; G 365 -U 428 ; WX 602 ; N uni01AC ; G 366 -U 429 ; WX 602 ; N uni01AD ; G 367 -U 430 ; WX 602 ; N uni01AE ; G 368 -U 431 ; WX 602 ; N Uhorn ; G 369 -U 432 ; WX 602 ; N uhorn ; G 370 -U 433 ; WX 602 ; N uni01B1 ; G 371 -U 434 ; WX 602 ; N uni01B2 ; G 372 -U 435 ; WX 602 ; N uni01B3 ; G 373 -U 436 ; WX 602 ; N uni01B4 ; G 374 -U 437 ; WX 602 ; N uni01B5 ; G 375 -U 438 ; WX 602 ; N uni01B6 ; G 376 -U 439 ; WX 602 ; N uni01B7 ; G 377 -U 440 ; WX 602 ; N uni01B8 ; G 378 -U 441 ; WX 602 ; N uni01B9 ; G 379 -U 442 ; WX 602 ; N uni01BA ; G 380 -U 443 ; WX 602 ; N uni01BB ; G 381 -U 444 ; WX 602 ; N uni01BC ; G 382 -U 445 ; WX 602 ; N uni01BD ; G 383 -U 446 ; WX 602 ; N uni01BE ; G 384 -U 447 ; WX 602 ; N uni01BF ; G 385 -U 448 ; WX 602 ; N uni01C0 ; G 386 -U 449 ; WX 602 ; N uni01C1 ; G 387 -U 450 ; WX 602 ; N uni01C2 ; G 388 -U 451 ; WX 602 ; N uni01C3 ; G 389 -U 461 ; WX 602 ; N uni01CD ; G 390 -U 462 ; WX 602 ; N uni01CE ; G 391 -U 463 ; WX 602 ; N uni01CF ; G 392 -U 464 ; WX 602 ; N uni01D0 ; G 393 -U 465 ; WX 602 ; N uni01D1 ; G 394 -U 466 ; WX 602 ; N uni01D2 ; G 395 -U 467 ; WX 602 ; N uni01D3 ; G 396 -U 468 ; WX 602 ; N uni01D4 ; G 397 -U 469 ; WX 602 ; N uni01D5 ; G 398 -U 470 ; WX 602 ; N uni01D6 ; G 399 -U 471 ; WX 602 ; N uni01D7 ; G 400 -U 472 ; WX 602 ; N uni01D8 ; G 401 -U 473 ; WX 602 ; N uni01D9 ; G 402 -U 474 ; WX 602 ; N uni01DA ; G 403 -U 475 ; WX 602 ; N uni01DB ; G 404 -U 476 ; WX 602 ; N uni01DC ; G 405 -U 477 ; WX 602 ; N uni01DD ; G 406 -U 478 ; WX 602 ; N uni01DE ; G 407 -U 479 ; WX 602 ; N uni01DF ; G 408 -U 480 ; WX 602 ; N uni01E0 ; G 409 -U 481 ; WX 602 ; N uni01E1 ; G 410 -U 482 ; WX 602 ; N uni01E2 ; G 411 -U 483 ; WX 602 ; N uni01E3 ; G 412 -U 486 ; WX 602 ; N Gcaron ; G 413 -U 487 ; WX 602 ; N gcaron ; G 414 -U 488 ; WX 602 ; N uni01E8 ; G 415 -U 489 ; WX 602 ; N uni01E9 ; G 416 -U 490 ; WX 602 ; N uni01EA ; G 417 -U 491 ; WX 602 ; N uni01EB ; G 418 -U 492 ; WX 602 ; N uni01EC ; G 419 -U 493 ; WX 602 ; N uni01ED ; G 420 -U 494 ; WX 602 ; N uni01EE ; G 421 -U 495 ; WX 602 ; N uni01EF ; G 422 -U 496 ; WX 602 ; N uni01F0 ; G 423 -U 500 ; WX 602 ; N uni01F4 ; G 424 -U 501 ; WX 602 ; N uni01F5 ; G 425 -U 502 ; WX 602 ; N uni01F6 ; G 426 -U 504 ; WX 602 ; N uni01F8 ; G 427 -U 505 ; WX 602 ; N uni01F9 ; G 428 -U 508 ; WX 602 ; N AEacute ; G 429 -U 509 ; WX 602 ; N aeacute ; G 430 -U 510 ; WX 602 ; N Oslashacute ; G 431 -U 511 ; WX 602 ; N oslashacute ; G 432 -U 512 ; WX 602 ; N uni0200 ; G 433 -U 513 ; WX 602 ; N uni0201 ; G 434 -U 514 ; WX 602 ; N uni0202 ; G 435 -U 515 ; WX 602 ; N uni0203 ; G 436 -U 516 ; WX 602 ; N uni0204 ; G 437 -U 517 ; WX 602 ; N uni0205 ; G 438 -U 518 ; WX 602 ; N uni0206 ; G 439 -U 519 ; WX 602 ; N uni0207 ; G 440 -U 520 ; WX 602 ; N uni0208 ; G 441 -U 521 ; WX 602 ; N uni0209 ; G 442 -U 522 ; WX 602 ; N uni020A ; G 443 -U 523 ; WX 602 ; N uni020B ; G 444 -U 524 ; WX 602 ; N uni020C ; G 445 -U 525 ; WX 602 ; N uni020D ; G 446 -U 526 ; WX 602 ; N uni020E ; G 447 -U 527 ; WX 602 ; N uni020F ; G 448 -U 528 ; WX 602 ; N uni0210 ; G 449 -U 529 ; WX 602 ; N uni0211 ; G 450 -U 530 ; WX 602 ; N uni0212 ; G 451 -U 531 ; WX 602 ; N uni0213 ; G 452 -U 532 ; WX 602 ; N uni0214 ; G 453 -U 533 ; WX 602 ; N uni0215 ; G 454 -U 534 ; WX 602 ; N uni0216 ; G 455 -U 535 ; WX 602 ; N uni0217 ; G 456 -U 536 ; WX 602 ; N Scommaaccent ; G 457 -U 537 ; WX 602 ; N scommaaccent ; G 458 -U 538 ; WX 602 ; N uni021A ; G 459 -U 539 ; WX 602 ; N uni021B ; G 460 -U 540 ; WX 602 ; N uni021C ; G 461 -U 541 ; WX 602 ; N uni021D ; G 462 -U 542 ; WX 602 ; N uni021E ; G 463 -U 543 ; WX 602 ; N uni021F ; G 464 -U 544 ; WX 602 ; N uni0220 ; G 465 -U 545 ; WX 602 ; N uni0221 ; G 466 -U 548 ; WX 602 ; N uni0224 ; G 467 -U 549 ; WX 602 ; N uni0225 ; G 468 -U 550 ; WX 602 ; N uni0226 ; G 469 -U 551 ; WX 602 ; N uni0227 ; G 470 -U 552 ; WX 602 ; N uni0228 ; G 471 -U 553 ; WX 602 ; N uni0229 ; G 472 -U 554 ; WX 602 ; N uni022A ; G 473 -U 555 ; WX 602 ; N uni022B ; G 474 -U 556 ; WX 602 ; N uni022C ; G 475 -U 557 ; WX 602 ; N uni022D ; G 476 -U 558 ; WX 602 ; N uni022E ; G 477 -U 559 ; WX 602 ; N uni022F ; G 478 -U 560 ; WX 602 ; N uni0230 ; G 479 -U 561 ; WX 602 ; N uni0231 ; G 480 -U 562 ; WX 602 ; N uni0232 ; G 481 -U 563 ; WX 602 ; N uni0233 ; G 482 -U 564 ; WX 602 ; N uni0234 ; G 483 -U 565 ; WX 602 ; N uni0235 ; G 484 -U 566 ; WX 602 ; N uni0236 ; G 485 -U 567 ; WX 602 ; N dotlessj ; G 486 -U 568 ; WX 602 ; N uni0238 ; G 487 -U 569 ; WX 602 ; N uni0239 ; G 488 -U 570 ; WX 602 ; N uni023A ; G 489 -U 571 ; WX 602 ; N uni023B ; G 490 -U 572 ; WX 602 ; N uni023C ; G 491 -U 573 ; WX 602 ; N uni023D ; G 492 -U 574 ; WX 602 ; N uni023E ; G 493 -U 575 ; WX 602 ; N uni023F ; G 494 -U 576 ; WX 602 ; N uni0240 ; G 495 -U 577 ; WX 602 ; N uni0241 ; G 496 -U 579 ; WX 602 ; N uni0243 ; G 497 -U 580 ; WX 602 ; N uni0244 ; G 498 -U 581 ; WX 602 ; N uni0245 ; G 499 -U 588 ; WX 602 ; N uni024C ; G 500 -U 589 ; WX 602 ; N uni024D ; G 501 -U 592 ; WX 602 ; N uni0250 ; G 502 -U 593 ; WX 602 ; N uni0251 ; G 503 -U 594 ; WX 602 ; N uni0252 ; G 504 -U 595 ; WX 602 ; N uni0253 ; G 505 -U 596 ; WX 602 ; N uni0254 ; G 506 -U 597 ; WX 602 ; N uni0255 ; G 507 -U 598 ; WX 602 ; N uni0256 ; G 508 -U 599 ; WX 602 ; N uni0257 ; G 509 -U 600 ; WX 602 ; N uni0258 ; G 510 -U 601 ; WX 602 ; N uni0259 ; G 511 -U 602 ; WX 602 ; N uni025A ; G 512 -U 603 ; WX 602 ; N uni025B ; G 513 -U 604 ; WX 602 ; N uni025C ; G 514 -U 605 ; WX 602 ; N uni025D ; G 515 -U 606 ; WX 602 ; N uni025E ; G 516 -U 607 ; WX 602 ; N uni025F ; G 517 -U 608 ; WX 602 ; N uni0260 ; G 518 -U 609 ; WX 602 ; N uni0261 ; G 519 -U 610 ; WX 602 ; N uni0262 ; G 520 -U 611 ; WX 602 ; N uni0263 ; G 521 -U 612 ; WX 602 ; N uni0264 ; G 522 -U 613 ; WX 602 ; N uni0265 ; G 523 -U 614 ; WX 602 ; N uni0266 ; G 524 -U 615 ; WX 602 ; N uni0267 ; G 525 -U 616 ; WX 602 ; N uni0268 ; G 526 -U 617 ; WX 602 ; N uni0269 ; G 527 -U 618 ; WX 602 ; N uni026A ; G 528 -U 619 ; WX 602 ; N uni026B ; G 529 -U 620 ; WX 602 ; N uni026C ; G 530 -U 621 ; WX 602 ; N uni026D ; G 531 -U 622 ; WX 602 ; N uni026E ; G 532 -U 623 ; WX 602 ; N uni026F ; G 533 -U 624 ; WX 602 ; N uni0270 ; G 534 -U 625 ; WX 602 ; N uni0271 ; G 535 -U 626 ; WX 602 ; N uni0272 ; G 536 -U 627 ; WX 602 ; N uni0273 ; G 537 -U 628 ; WX 602 ; N uni0274 ; G 538 -U 629 ; WX 602 ; N uni0275 ; G 539 -U 630 ; WX 602 ; N uni0276 ; G 540 -U 631 ; WX 602 ; N uni0277 ; G 541 -U 632 ; WX 602 ; N uni0278 ; G 542 -U 633 ; WX 602 ; N uni0279 ; G 543 -U 634 ; WX 602 ; N uni027A ; G 544 -U 635 ; WX 602 ; N uni027B ; G 545 -U 636 ; WX 602 ; N uni027C ; G 546 -U 637 ; WX 602 ; N uni027D ; G 547 -U 638 ; WX 602 ; N uni027E ; G 548 -U 639 ; WX 602 ; N uni027F ; G 549 -U 640 ; WX 602 ; N uni0280 ; G 550 -U 641 ; WX 602 ; N uni0281 ; G 551 -U 642 ; WX 602 ; N uni0282 ; G 552 -U 643 ; WX 602 ; N uni0283 ; G 553 -U 644 ; WX 602 ; N uni0284 ; G 554 -U 645 ; WX 602 ; N uni0285 ; G 555 -U 646 ; WX 602 ; N uni0286 ; G 556 -U 647 ; WX 602 ; N uni0287 ; G 557 -U 648 ; WX 602 ; N uni0288 ; G 558 -U 649 ; WX 602 ; N uni0289 ; G 559 -U 650 ; WX 602 ; N uni028A ; G 560 -U 651 ; WX 602 ; N uni028B ; G 561 -U 652 ; WX 602 ; N uni028C ; G 562 -U 653 ; WX 602 ; N uni028D ; G 563 -U 654 ; WX 602 ; N uni028E ; G 564 -U 655 ; WX 602 ; N uni028F ; G 565 -U 656 ; WX 602 ; N uni0290 ; G 566 -U 657 ; WX 602 ; N uni0291 ; G 567 -U 658 ; WX 602 ; N uni0292 ; G 568 -U 659 ; WX 602 ; N uni0293 ; G 569 -U 660 ; WX 602 ; N uni0294 ; G 570 -U 661 ; WX 602 ; N uni0295 ; G 571 -U 662 ; WX 602 ; N uni0296 ; G 572 -U 663 ; WX 602 ; N uni0297 ; G 573 -U 664 ; WX 602 ; N uni0298 ; G 574 -U 665 ; WX 602 ; N uni0299 ; G 575 -U 666 ; WX 602 ; N uni029A ; G 576 -U 667 ; WX 602 ; N uni029B ; G 577 -U 668 ; WX 602 ; N uni029C ; G 578 -U 669 ; WX 602 ; N uni029D ; G 579 -U 670 ; WX 602 ; N uni029E ; G 580 -U 671 ; WX 602 ; N uni029F ; G 581 -U 672 ; WX 602 ; N uni02A0 ; G 582 -U 673 ; WX 602 ; N uni02A1 ; G 583 -U 674 ; WX 602 ; N uni02A2 ; G 584 -U 675 ; WX 602 ; N uni02A3 ; G 585 -U 676 ; WX 602 ; N uni02A4 ; G 586 -U 677 ; WX 602 ; N uni02A5 ; G 587 -U 678 ; WX 602 ; N uni02A6 ; G 588 -U 679 ; WX 602 ; N uni02A7 ; G 589 -U 680 ; WX 602 ; N uni02A8 ; G 590 -U 681 ; WX 602 ; N uni02A9 ; G 591 -U 682 ; WX 602 ; N uni02AA ; G 592 -U 683 ; WX 602 ; N uni02AB ; G 593 -U 684 ; WX 602 ; N uni02AC ; G 594 -U 685 ; WX 602 ; N uni02AD ; G 595 -U 686 ; WX 602 ; N uni02AE ; G 596 -U 687 ; WX 602 ; N uni02AF ; G 597 -U 688 ; WX 602 ; N uni02B0 ; G 598 -U 689 ; WX 602 ; N uni02B1 ; G 599 -U 690 ; WX 602 ; N uni02B2 ; G 600 -U 691 ; WX 602 ; N uni02B3 ; G 601 -U 692 ; WX 602 ; N uni02B4 ; G 602 -U 693 ; WX 602 ; N uni02B5 ; G 603 -U 694 ; WX 602 ; N uni02B6 ; G 604 -U 695 ; WX 602 ; N uni02B7 ; G 605 -U 696 ; WX 602 ; N uni02B8 ; G 606 -U 697 ; WX 602 ; N uni02B9 ; G 607 -U 699 ; WX 602 ; N uni02BB ; G 608 -U 700 ; WX 602 ; N uni02BC ; G 609 -U 701 ; WX 602 ; N uni02BD ; G 610 -U 702 ; WX 602 ; N uni02BE ; G 611 -U 703 ; WX 602 ; N uni02BF ; G 612 -U 704 ; WX 602 ; N uni02C0 ; G 613 -U 705 ; WX 602 ; N uni02C1 ; G 614 -U 710 ; WX 602 ; N circumflex ; G 615 -U 711 ; WX 602 ; N caron ; G 616 -U 712 ; WX 602 ; N uni02C8 ; G 617 -U 713 ; WX 602 ; N uni02C9 ; G 618 -U 716 ; WX 602 ; N uni02CC ; G 619 -U 717 ; WX 602 ; N uni02CD ; G 620 -U 718 ; WX 602 ; N uni02CE ; G 621 -U 719 ; WX 602 ; N uni02CF ; G 622 -U 720 ; WX 602 ; N uni02D0 ; G 623 -U 721 ; WX 602 ; N uni02D1 ; G 624 -U 722 ; WX 602 ; N uni02D2 ; G 625 -U 723 ; WX 602 ; N uni02D3 ; G 626 -U 726 ; WX 602 ; N uni02D6 ; G 627 -U 727 ; WX 602 ; N uni02D7 ; G 628 -U 728 ; WX 602 ; N breve ; G 629 -U 729 ; WX 602 ; N dotaccent ; G 630 -U 730 ; WX 602 ; N ring ; G 631 -U 731 ; WX 602 ; N ogonek ; G 632 -U 732 ; WX 602 ; N tilde ; G 633 -U 733 ; WX 602 ; N hungarumlaut ; G 634 -U 734 ; WX 602 ; N uni02DE ; G 635 -U 736 ; WX 602 ; N uni02E0 ; G 636 -U 737 ; WX 602 ; N uni02E1 ; G 637 -U 738 ; WX 602 ; N uni02E2 ; G 638 -U 739 ; WX 602 ; N uni02E3 ; G 639 -U 740 ; WX 602 ; N uni02E4 ; G 640 -U 741 ; WX 602 ; N uni02E5 ; G 641 -U 742 ; WX 602 ; N uni02E6 ; G 642 -U 743 ; WX 602 ; N uni02E7 ; G 643 -U 744 ; WX 602 ; N uni02E8 ; G 644 -U 745 ; WX 602 ; N uni02E9 ; G 645 -U 750 ; WX 602 ; N uni02EE ; G 646 -U 755 ; WX 602 ; N uni02F3 ; G 647 -U 768 ; WX 602 ; N gravecomb ; G 648 -U 769 ; WX 602 ; N acutecomb ; G 649 -U 770 ; WX 602 ; N uni0302 ; G 650 -U 771 ; WX 602 ; N tildecomb ; G 651 -U 772 ; WX 602 ; N uni0304 ; G 652 -U 773 ; WX 602 ; N uni0305 ; G 653 -U 774 ; WX 602 ; N uni0306 ; G 654 -U 775 ; WX 602 ; N uni0307 ; G 655 -U 776 ; WX 602 ; N uni0308 ; G 656 -U 777 ; WX 602 ; N hookabovecomb ; G 657 -U 778 ; WX 602 ; N uni030A ; G 658 -U 779 ; WX 602 ; N uni030B ; G 659 -U 780 ; WX 602 ; N uni030C ; G 660 -U 781 ; WX 602 ; N uni030D ; G 661 -U 782 ; WX 602 ; N uni030E ; G 662 -U 783 ; WX 602 ; N uni030F ; G 663 -U 784 ; WX 602 ; N uni0310 ; G 664 -U 785 ; WX 602 ; N uni0311 ; G 665 -U 786 ; WX 602 ; N uni0312 ; G 666 -U 787 ; WX 602 ; N uni0313 ; G 667 -U 788 ; WX 602 ; N uni0314 ; G 668 -U 789 ; WX 602 ; N uni0315 ; G 669 -U 790 ; WX 602 ; N uni0316 ; G 670 -U 791 ; WX 602 ; N uni0317 ; G 671 -U 792 ; WX 602 ; N uni0318 ; G 672 -U 793 ; WX 602 ; N uni0319 ; G 673 -U 794 ; WX 602 ; N uni031A ; G 674 -U 795 ; WX 602 ; N uni031B ; G 675 -U 796 ; WX 602 ; N uni031C ; G 676 -U 797 ; WX 602 ; N uni031D ; G 677 -U 798 ; WX 602 ; N uni031E ; G 678 -U 799 ; WX 602 ; N uni031F ; G 679 -U 800 ; WX 602 ; N uni0320 ; G 680 -U 801 ; WX 602 ; N uni0321 ; G 681 -U 802 ; WX 602 ; N uni0322 ; G 682 -U 803 ; WX 602 ; N dotbelowcomb ; G 683 -U 804 ; WX 602 ; N uni0324 ; G 684 -U 805 ; WX 602 ; N uni0325 ; G 685 -U 806 ; WX 602 ; N uni0326 ; G 686 -U 807 ; WX 602 ; N uni0327 ; G 687 -U 808 ; WX 602 ; N uni0328 ; G 688 -U 809 ; WX 602 ; N uni0329 ; G 689 -U 810 ; WX 602 ; N uni032A ; G 690 -U 811 ; WX 602 ; N uni032B ; G 691 -U 812 ; WX 602 ; N uni032C ; G 692 -U 813 ; WX 602 ; N uni032D ; G 693 -U 814 ; WX 602 ; N uni032E ; G 694 -U 815 ; WX 602 ; N uni032F ; G 695 -U 816 ; WX 602 ; N uni0330 ; G 696 -U 817 ; WX 602 ; N uni0331 ; G 697 -U 818 ; WX 602 ; N uni0332 ; G 698 -U 819 ; WX 602 ; N uni0333 ; G 699 -U 820 ; WX 602 ; N uni0334 ; G 700 -U 821 ; WX 602 ; N uni0335 ; G 701 -U 822 ; WX 602 ; N uni0336 ; G 702 -U 823 ; WX 602 ; N uni0337 ; G 703 -U 824 ; WX 602 ; N uni0338 ; G 704 -U 825 ; WX 602 ; N uni0339 ; G 705 -U 826 ; WX 602 ; N uni033A ; G 706 -U 827 ; WX 602 ; N uni033B ; G 707 -U 828 ; WX 602 ; N uni033C ; G 708 -U 829 ; WX 602 ; N uni033D ; G 709 -U 830 ; WX 602 ; N uni033E ; G 710 -U 831 ; WX 602 ; N uni033F ; G 711 -U 835 ; WX 602 ; N uni0343 ; G 712 -U 856 ; WX 602 ; N uni0358 ; G 713 -U 865 ; WX 602 ; N uni0361 ; G 714 -U 884 ; WX 602 ; N uni0374 ; G 715 -U 885 ; WX 602 ; N uni0375 ; G 716 -U 886 ; WX 602 ; N uni0376 ; G 717 -U 887 ; WX 602 ; N uni0377 ; G 718 -U 890 ; WX 602 ; N uni037A ; G 719 -U 891 ; WX 602 ; N uni037B ; G 720 -U 892 ; WX 602 ; N uni037C ; G 721 -U 893 ; WX 602 ; N uni037D ; G 722 -U 894 ; WX 602 ; N uni037E ; G 723 -U 895 ; WX 602 ; N uni037F ; G 724 -U 900 ; WX 602 ; N tonos ; G 725 -U 901 ; WX 602 ; N dieresistonos ; G 726 -U 902 ; WX 602 ; N Alphatonos ; G 727 -U 903 ; WX 602 ; N anoteleia ; G 728 -U 904 ; WX 602 ; N Epsilontonos ; G 729 -U 905 ; WX 602 ; N Etatonos ; G 730 -U 906 ; WX 602 ; N Iotatonos ; G 731 -U 908 ; WX 602 ; N Omicrontonos ; G 732 -U 910 ; WX 602 ; N Upsilontonos ; G 733 -U 911 ; WX 602 ; N Omegatonos ; G 734 -U 912 ; WX 602 ; N iotadieresistonos ; G 735 -U 913 ; WX 602 ; N Alpha ; G 736 -U 914 ; WX 602 ; N Beta ; G 737 -U 915 ; WX 602 ; N Gamma ; G 738 -U 916 ; WX 602 ; N uni0394 ; G 739 -U 917 ; WX 602 ; N Epsilon ; G 740 -U 918 ; WX 602 ; N Zeta ; G 741 -U 919 ; WX 602 ; N Eta ; G 742 -U 920 ; WX 602 ; N Theta ; G 743 -U 921 ; WX 602 ; N Iota ; G 744 -U 922 ; WX 602 ; N Kappa ; G 745 -U 923 ; WX 602 ; N Lambda ; G 746 -U 924 ; WX 602 ; N Mu ; G 747 -U 925 ; WX 602 ; N Nu ; G 748 -U 926 ; WX 602 ; N Xi ; G 749 -U 927 ; WX 602 ; N Omicron ; G 750 -U 928 ; WX 602 ; N Pi ; G 751 -U 929 ; WX 602 ; N Rho ; G 752 -U 931 ; WX 602 ; N Sigma ; G 753 -U 932 ; WX 602 ; N Tau ; G 754 -U 933 ; WX 602 ; N Upsilon ; G 755 -U 934 ; WX 602 ; N Phi ; G 756 -U 935 ; WX 602 ; N Chi ; G 757 -U 936 ; WX 602 ; N Psi ; G 758 -U 937 ; WX 602 ; N Omega ; G 759 -U 938 ; WX 602 ; N Iotadieresis ; G 760 -U 939 ; WX 602 ; N Upsilondieresis ; G 761 -U 940 ; WX 602 ; N alphatonos ; G 762 -U 941 ; WX 602 ; N epsilontonos ; G 763 -U 942 ; WX 602 ; N etatonos ; G 764 -U 943 ; WX 602 ; N iotatonos ; G 765 -U 944 ; WX 602 ; N upsilondieresistonos ; G 766 -U 945 ; WX 602 ; N alpha ; G 767 -U 946 ; WX 602 ; N beta ; G 768 -U 947 ; WX 602 ; N gamma ; G 769 -U 948 ; WX 602 ; N delta ; G 770 -U 949 ; WX 602 ; N epsilon ; G 771 -U 950 ; WX 602 ; N zeta ; G 772 -U 951 ; WX 602 ; N eta ; G 773 -U 952 ; WX 602 ; N theta ; G 774 -U 953 ; WX 602 ; N iota ; G 775 -U 954 ; WX 602 ; N kappa ; G 776 -U 955 ; WX 602 ; N lambda ; G 777 -U 956 ; WX 602 ; N uni03BC ; G 778 -U 957 ; WX 602 ; N nu ; G 779 -U 958 ; WX 602 ; N xi ; G 780 -U 959 ; WX 602 ; N omicron ; G 781 -U 960 ; WX 602 ; N pi ; G 782 -U 961 ; WX 602 ; N rho ; G 783 -U 962 ; WX 602 ; N sigma1 ; G 784 -U 963 ; WX 602 ; N sigma ; G 785 -U 964 ; WX 602 ; N tau ; G 786 -U 965 ; WX 602 ; N upsilon ; G 787 -U 966 ; WX 602 ; N phi ; G 788 -U 967 ; WX 602 ; N chi ; G 789 -U 968 ; WX 602 ; N psi ; G 790 -U 969 ; WX 602 ; N omega ; G 791 -U 970 ; WX 602 ; N iotadieresis ; G 792 -U 971 ; WX 602 ; N upsilondieresis ; G 793 -U 972 ; WX 602 ; N omicrontonos ; G 794 -U 973 ; WX 602 ; N upsilontonos ; G 795 -U 974 ; WX 602 ; N omegatonos ; G 796 -U 976 ; WX 602 ; N uni03D0 ; G 797 -U 977 ; WX 602 ; N theta1 ; G 798 -U 978 ; WX 602 ; N Upsilon1 ; G 799 -U 979 ; WX 602 ; N uni03D3 ; G 800 -U 980 ; WX 602 ; N uni03D4 ; G 801 -U 981 ; WX 602 ; N phi1 ; G 802 -U 982 ; WX 602 ; N omega1 ; G 803 -U 983 ; WX 602 ; N uni03D7 ; G 804 -U 984 ; WX 602 ; N uni03D8 ; G 805 -U 985 ; WX 602 ; N uni03D9 ; G 806 -U 986 ; WX 602 ; N uni03DA ; G 807 -U 987 ; WX 602 ; N uni03DB ; G 808 -U 988 ; WX 602 ; N uni03DC ; G 809 -U 989 ; WX 602 ; N uni03DD ; G 810 -U 990 ; WX 602 ; N uni03DE ; G 811 -U 991 ; WX 602 ; N uni03DF ; G 812 -U 992 ; WX 602 ; N uni03E0 ; G 813 -U 993 ; WX 602 ; N uni03E1 ; G 814 -U 1008 ; WX 602 ; N uni03F0 ; G 815 -U 1009 ; WX 602 ; N uni03F1 ; G 816 -U 1010 ; WX 602 ; N uni03F2 ; G 817 -U 1011 ; WX 602 ; N uni03F3 ; G 818 -U 1012 ; WX 602 ; N uni03F4 ; G 819 -U 1013 ; WX 602 ; N uni03F5 ; G 820 -U 1014 ; WX 602 ; N uni03F6 ; G 821 -U 1015 ; WX 602 ; N uni03F7 ; G 822 -U 1016 ; WX 602 ; N uni03F8 ; G 823 -U 1017 ; WX 602 ; N uni03F9 ; G 824 -U 1018 ; WX 602 ; N uni03FA ; G 825 -U 1019 ; WX 602 ; N uni03FB ; G 826 -U 1020 ; WX 602 ; N uni03FC ; G 827 -U 1021 ; WX 602 ; N uni03FD ; G 828 -U 1022 ; WX 602 ; N uni03FE ; G 829 -U 1023 ; WX 602 ; N uni03FF ; G 830 -U 1024 ; WX 602 ; N uni0400 ; G 831 -U 1025 ; WX 602 ; N uni0401 ; G 832 -U 1026 ; WX 602 ; N uni0402 ; G 833 -U 1027 ; WX 602 ; N uni0403 ; G 834 -U 1028 ; WX 602 ; N uni0404 ; G 835 -U 1029 ; WX 602 ; N uni0405 ; G 836 -U 1030 ; WX 602 ; N uni0406 ; G 837 -U 1031 ; WX 602 ; N uni0407 ; G 838 -U 1032 ; WX 602 ; N uni0408 ; G 839 -U 1033 ; WX 602 ; N uni0409 ; G 840 -U 1034 ; WX 602 ; N uni040A ; G 841 -U 1035 ; WX 602 ; N uni040B ; G 842 -U 1036 ; WX 602 ; N uni040C ; G 843 -U 1037 ; WX 602 ; N uni040D ; G 844 -U 1038 ; WX 602 ; N uni040E ; G 845 -U 1039 ; WX 602 ; N uni040F ; G 846 -U 1040 ; WX 602 ; N uni0410 ; G 847 -U 1041 ; WX 602 ; N uni0411 ; G 848 -U 1042 ; WX 602 ; N uni0412 ; G 849 -U 1043 ; WX 602 ; N uni0413 ; G 850 -U 1044 ; WX 602 ; N uni0414 ; G 851 -U 1045 ; WX 602 ; N uni0415 ; G 852 -U 1046 ; WX 602 ; N uni0416 ; G 853 -U 1047 ; WX 602 ; N uni0417 ; G 854 -U 1048 ; WX 602 ; N uni0418 ; G 855 -U 1049 ; WX 602 ; N uni0419 ; G 856 -U 1050 ; WX 602 ; N uni041A ; G 857 -U 1051 ; WX 602 ; N uni041B ; G 858 -U 1052 ; WX 602 ; N uni041C ; G 859 -U 1053 ; WX 602 ; N uni041D ; G 860 -U 1054 ; WX 602 ; N uni041E ; G 861 -U 1055 ; WX 602 ; N uni041F ; G 862 -U 1056 ; WX 602 ; N uni0420 ; G 863 -U 1057 ; WX 602 ; N uni0421 ; G 864 -U 1058 ; WX 602 ; N uni0422 ; G 865 -U 1059 ; WX 602 ; N uni0423 ; G 866 -U 1060 ; WX 602 ; N uni0424 ; G 867 -U 1061 ; WX 602 ; N uni0425 ; G 868 -U 1062 ; WX 602 ; N uni0426 ; G 869 -U 1063 ; WX 602 ; N uni0427 ; G 870 -U 1064 ; WX 602 ; N uni0428 ; G 871 -U 1065 ; WX 602 ; N uni0429 ; G 872 -U 1066 ; WX 602 ; N uni042A ; G 873 -U 1067 ; WX 602 ; N uni042B ; G 874 -U 1068 ; WX 602 ; N uni042C ; G 875 -U 1069 ; WX 602 ; N uni042D ; G 876 -U 1070 ; WX 602 ; N uni042E ; G 877 -U 1071 ; WX 602 ; N uni042F ; G 878 -U 1072 ; WX 602 ; N uni0430 ; G 879 -U 1073 ; WX 602 ; N uni0431 ; G 880 -U 1074 ; WX 602 ; N uni0432 ; G 881 -U 1075 ; WX 602 ; N uni0433 ; G 882 -U 1076 ; WX 602 ; N uni0434 ; G 883 -U 1077 ; WX 602 ; N uni0435 ; G 884 -U 1078 ; WX 602 ; N uni0436 ; G 885 -U 1079 ; WX 602 ; N uni0437 ; G 886 -U 1080 ; WX 602 ; N uni0438 ; G 887 -U 1081 ; WX 602 ; N uni0439 ; G 888 -U 1082 ; WX 602 ; N uni043A ; G 889 -U 1083 ; WX 602 ; N uni043B ; G 890 -U 1084 ; WX 602 ; N uni043C ; G 891 -U 1085 ; WX 602 ; N uni043D ; G 892 -U 1086 ; WX 602 ; N uni043E ; G 893 -U 1087 ; WX 602 ; N uni043F ; G 894 -U 1088 ; WX 602 ; N uni0440 ; G 895 -U 1089 ; WX 602 ; N uni0441 ; G 896 -U 1090 ; WX 602 ; N uni0442 ; G 897 -U 1091 ; WX 602 ; N uni0443 ; G 898 -U 1092 ; WX 602 ; N uni0444 ; G 899 -U 1093 ; WX 602 ; N uni0445 ; G 900 -U 1094 ; WX 602 ; N uni0446 ; G 901 -U 1095 ; WX 602 ; N uni0447 ; G 902 -U 1096 ; WX 602 ; N uni0448 ; G 903 -U 1097 ; WX 602 ; N uni0449 ; G 904 -U 1098 ; WX 602 ; N uni044A ; G 905 -U 1099 ; WX 602 ; N uni044B ; G 906 -U 1100 ; WX 602 ; N uni044C ; G 907 -U 1101 ; WX 602 ; N uni044D ; G 908 -U 1102 ; WX 602 ; N uni044E ; G 909 -U 1103 ; WX 602 ; N uni044F ; G 910 -U 1104 ; WX 602 ; N uni0450 ; G 911 -U 1105 ; WX 602 ; N uni0451 ; G 912 -U 1106 ; WX 602 ; N uni0452 ; G 913 -U 1107 ; WX 602 ; N uni0453 ; G 914 -U 1108 ; WX 602 ; N uni0454 ; G 915 -U 1109 ; WX 602 ; N uni0455 ; G 916 -U 1110 ; WX 602 ; N uni0456 ; G 917 -U 1111 ; WX 602 ; N uni0457 ; G 918 -U 1112 ; WX 602 ; N uni0458 ; G 919 -U 1113 ; WX 602 ; N uni0459 ; G 920 -U 1114 ; WX 602 ; N uni045A ; G 921 -U 1115 ; WX 602 ; N uni045B ; G 922 -U 1116 ; WX 602 ; N uni045C ; G 923 -U 1117 ; WX 602 ; N uni045D ; G 924 -U 1118 ; WX 602 ; N uni045E ; G 925 -U 1119 ; WX 602 ; N uni045F ; G 926 -U 1122 ; WX 602 ; N uni0462 ; G 927 -U 1123 ; WX 602 ; N uni0463 ; G 928 -U 1138 ; WX 602 ; N uni0472 ; G 929 -U 1139 ; WX 602 ; N uni0473 ; G 930 -U 1168 ; WX 602 ; N uni0490 ; G 931 -U 1169 ; WX 602 ; N uni0491 ; G 932 -U 1170 ; WX 602 ; N uni0492 ; G 933 -U 1171 ; WX 602 ; N uni0493 ; G 934 -U 1172 ; WX 602 ; N uni0494 ; G 935 -U 1173 ; WX 602 ; N uni0495 ; G 936 -U 1174 ; WX 602 ; N uni0496 ; G 937 -U 1175 ; WX 602 ; N uni0497 ; G 938 -U 1176 ; WX 602 ; N uni0498 ; G 939 -U 1177 ; WX 602 ; N uni0499 ; G 940 -U 1178 ; WX 602 ; N uni049A ; G 941 -U 1179 ; WX 602 ; N uni049B ; G 942 -U 1186 ; WX 602 ; N uni04A2 ; G 943 -U 1187 ; WX 602 ; N uni04A3 ; G 944 -U 1188 ; WX 602 ; N uni04A4 ; G 945 -U 1189 ; WX 602 ; N uni04A5 ; G 946 -U 1194 ; WX 602 ; N uni04AA ; G 947 -U 1195 ; WX 602 ; N uni04AB ; G 948 -U 1196 ; WX 602 ; N uni04AC ; G 949 -U 1197 ; WX 602 ; N uni04AD ; G 950 -U 1198 ; WX 602 ; N uni04AE ; G 951 -U 1199 ; WX 602 ; N uni04AF ; G 952 -U 1200 ; WX 602 ; N uni04B0 ; G 953 -U 1201 ; WX 602 ; N uni04B1 ; G 954 -U 1202 ; WX 602 ; N uni04B2 ; G 955 -U 1203 ; WX 602 ; N uni04B3 ; G 956 -U 1210 ; WX 602 ; N uni04BA ; G 957 -U 1211 ; WX 602 ; N uni04BB ; G 958 -U 1216 ; WX 602 ; N uni04C0 ; G 959 -U 1217 ; WX 602 ; N uni04C1 ; G 960 -U 1218 ; WX 602 ; N uni04C2 ; G 961 -U 1219 ; WX 602 ; N uni04C3 ; G 962 -U 1220 ; WX 602 ; N uni04C4 ; G 963 -U 1223 ; WX 602 ; N uni04C7 ; G 964 -U 1224 ; WX 602 ; N uni04C8 ; G 965 -U 1227 ; WX 602 ; N uni04CB ; G 966 -U 1228 ; WX 602 ; N uni04CC ; G 967 -U 1231 ; WX 602 ; N uni04CF ; G 968 -U 1232 ; WX 602 ; N uni04D0 ; G 969 -U 1233 ; WX 602 ; N uni04D1 ; G 970 -U 1234 ; WX 602 ; N uni04D2 ; G 971 -U 1235 ; WX 602 ; N uni04D3 ; G 972 -U 1236 ; WX 602 ; N uni04D4 ; G 973 -U 1237 ; WX 602 ; N uni04D5 ; G 974 -U 1238 ; WX 602 ; N uni04D6 ; G 975 -U 1239 ; WX 602 ; N uni04D7 ; G 976 -U 1240 ; WX 602 ; N uni04D8 ; G 977 -U 1241 ; WX 602 ; N uni04D9 ; G 978 -U 1242 ; WX 602 ; N uni04DA ; G 979 -U 1243 ; WX 602 ; N uni04DB ; G 980 -U 1244 ; WX 602 ; N uni04DC ; G 981 -U 1245 ; WX 602 ; N uni04DD ; G 982 -U 1246 ; WX 602 ; N uni04DE ; G 983 -U 1247 ; WX 602 ; N uni04DF ; G 984 -U 1248 ; WX 602 ; N uni04E0 ; G 985 -U 1249 ; WX 602 ; N uni04E1 ; G 986 -U 1250 ; WX 602 ; N uni04E2 ; G 987 -U 1251 ; WX 602 ; N uni04E3 ; G 988 -U 1252 ; WX 602 ; N uni04E4 ; G 989 -U 1253 ; WX 602 ; N uni04E5 ; G 990 -U 1254 ; WX 602 ; N uni04E6 ; G 991 -U 1255 ; WX 602 ; N uni04E7 ; G 992 -U 1256 ; WX 602 ; N uni04E8 ; G 993 -U 1257 ; WX 602 ; N uni04E9 ; G 994 -U 1258 ; WX 602 ; N uni04EA ; G 995 -U 1259 ; WX 602 ; N uni04EB ; G 996 -U 1260 ; WX 602 ; N uni04EC ; G 997 -U 1261 ; WX 602 ; N uni04ED ; G 998 -U 1262 ; WX 602 ; N uni04EE ; G 999 -U 1263 ; WX 602 ; N uni04EF ; G 1000 -U 1264 ; WX 602 ; N uni04F0 ; G 1001 -U 1265 ; WX 602 ; N uni04F1 ; G 1002 -U 1266 ; WX 602 ; N uni04F2 ; G 1003 -U 1267 ; WX 602 ; N uni04F3 ; G 1004 -U 1268 ; WX 602 ; N uni04F4 ; G 1005 -U 1269 ; WX 602 ; N uni04F5 ; G 1006 -U 1270 ; WX 602 ; N uni04F6 ; G 1007 -U 1271 ; WX 602 ; N uni04F7 ; G 1008 -U 1272 ; WX 602 ; N uni04F8 ; G 1009 -U 1273 ; WX 602 ; N uni04F9 ; G 1010 -U 1296 ; WX 602 ; N uni0510 ; G 1011 -U 1297 ; WX 602 ; N uni0511 ; G 1012 -U 1306 ; WX 602 ; N uni051A ; G 1013 -U 1307 ; WX 602 ; N uni051B ; G 1014 -U 1308 ; WX 602 ; N uni051C ; G 1015 -U 1309 ; WX 602 ; N uni051D ; G 1016 -U 1329 ; WX 602 ; N uni0531 ; G 1017 -U 1330 ; WX 602 ; N uni0532 ; G 1018 -U 1331 ; WX 602 ; N uni0533 ; G 1019 -U 1332 ; WX 602 ; N uni0534 ; G 1020 -U 1333 ; WX 602 ; N uni0535 ; G 1021 -U 1334 ; WX 602 ; N uni0536 ; G 1022 -U 1335 ; WX 602 ; N uni0537 ; G 1023 -U 1336 ; WX 602 ; N uni0538 ; G 1024 -U 1337 ; WX 602 ; N uni0539 ; G 1025 -U 1338 ; WX 602 ; N uni053A ; G 1026 -U 1339 ; WX 602 ; N uni053B ; G 1027 -U 1340 ; WX 602 ; N uni053C ; G 1028 -U 1341 ; WX 602 ; N uni053D ; G 1029 -U 1342 ; WX 602 ; N uni053E ; G 1030 -U 1343 ; WX 602 ; N uni053F ; G 1031 -U 1344 ; WX 602 ; N uni0540 ; G 1032 -U 1345 ; WX 602 ; N uni0541 ; G 1033 -U 1346 ; WX 602 ; N uni0542 ; G 1034 -U 1347 ; WX 602 ; N uni0543 ; G 1035 -U 1348 ; WX 602 ; N uni0544 ; G 1036 -U 1349 ; WX 602 ; N uni0545 ; G 1037 -U 1350 ; WX 602 ; N uni0546 ; G 1038 -U 1351 ; WX 602 ; N uni0547 ; G 1039 -U 1352 ; WX 602 ; N uni0548 ; G 1040 -U 1353 ; WX 602 ; N uni0549 ; G 1041 -U 1354 ; WX 602 ; N uni054A ; G 1042 -U 1355 ; WX 602 ; N uni054B ; G 1043 -U 1356 ; WX 602 ; N uni054C ; G 1044 -U 1357 ; WX 602 ; N uni054D ; G 1045 -U 1358 ; WX 602 ; N uni054E ; G 1046 -U 1359 ; WX 602 ; N uni054F ; G 1047 -U 1360 ; WX 602 ; N uni0550 ; G 1048 -U 1361 ; WX 602 ; N uni0551 ; G 1049 -U 1362 ; WX 602 ; N uni0552 ; G 1050 -U 1363 ; WX 602 ; N uni0553 ; G 1051 -U 1364 ; WX 602 ; N uni0554 ; G 1052 -U 1365 ; WX 602 ; N uni0555 ; G 1053 -U 1366 ; WX 602 ; N uni0556 ; G 1054 -U 1369 ; WX 602 ; N uni0559 ; G 1055 -U 1370 ; WX 602 ; N uni055A ; G 1056 -U 1371 ; WX 602 ; N uni055B ; G 1057 -U 1372 ; WX 602 ; N uni055C ; G 1058 -U 1373 ; WX 602 ; N uni055D ; G 1059 -U 1374 ; WX 602 ; N uni055E ; G 1060 -U 1375 ; WX 602 ; N uni055F ; G 1061 -U 1377 ; WX 602 ; N uni0561 ; G 1062 -U 1378 ; WX 602 ; N uni0562 ; G 1063 -U 1379 ; WX 602 ; N uni0563 ; G 1064 -U 1380 ; WX 602 ; N uni0564 ; G 1065 -U 1381 ; WX 602 ; N uni0565 ; G 1066 -U 1382 ; WX 602 ; N uni0566 ; G 1067 -U 1383 ; WX 602 ; N uni0567 ; G 1068 -U 1384 ; WX 602 ; N uni0568 ; G 1069 -U 1385 ; WX 602 ; N uni0569 ; G 1070 -U 1386 ; WX 602 ; N uni056A ; G 1071 -U 1387 ; WX 602 ; N uni056B ; G 1072 -U 1388 ; WX 602 ; N uni056C ; G 1073 -U 1389 ; WX 602 ; N uni056D ; G 1074 -U 1390 ; WX 602 ; N uni056E ; G 1075 -U 1391 ; WX 602 ; N uni056F ; G 1076 -U 1392 ; WX 602 ; N uni0570 ; G 1077 -U 1393 ; WX 602 ; N uni0571 ; G 1078 -U 1394 ; WX 602 ; N uni0572 ; G 1079 -U 1395 ; WX 602 ; N uni0573 ; G 1080 -U 1396 ; WX 602 ; N uni0574 ; G 1081 -U 1397 ; WX 602 ; N uni0575 ; G 1082 -U 1398 ; WX 602 ; N uni0576 ; G 1083 -U 1399 ; WX 602 ; N uni0577 ; G 1084 -U 1400 ; WX 602 ; N uni0578 ; G 1085 -U 1401 ; WX 602 ; N uni0579 ; G 1086 -U 1402 ; WX 602 ; N uni057A ; G 1087 -U 1403 ; WX 602 ; N uni057B ; G 1088 -U 1404 ; WX 602 ; N uni057C ; G 1089 -U 1405 ; WX 602 ; N uni057D ; G 1090 -U 1406 ; WX 602 ; N uni057E ; G 1091 -U 1407 ; WX 602 ; N uni057F ; G 1092 -U 1408 ; WX 602 ; N uni0580 ; G 1093 -U 1409 ; WX 602 ; N uni0581 ; G 1094 -U 1410 ; WX 602 ; N uni0582 ; G 1095 -U 1411 ; WX 602 ; N uni0583 ; G 1096 -U 1412 ; WX 602 ; N uni0584 ; G 1097 -U 1413 ; WX 602 ; N uni0585 ; G 1098 -U 1414 ; WX 602 ; N uni0586 ; G 1099 -U 1415 ; WX 602 ; N uni0587 ; G 1100 -U 1417 ; WX 602 ; N uni0589 ; G 1101 -U 1418 ; WX 602 ; N uni058A ; G 1102 -U 1542 ; WX 602 ; N uni0606 ; G 1103 -U 1543 ; WX 602 ; N uni0607 ; G 1104 -U 1545 ; WX 602 ; N uni0609 ; G 1105 -U 1546 ; WX 602 ; N uni060A ; G 1106 -U 1548 ; WX 602 ; N uni060C ; G 1107 -U 1557 ; WX 602 ; N uni0615 ; G 1108 -U 1563 ; WX 602 ; N uni061B ; G 1109 -U 1567 ; WX 602 ; N uni061F ; G 1110 -U 1569 ; WX 602 ; N uni0621 ; G 1111 -U 1570 ; WX 602 ; N uni0622 ; G 1112 -U 1571 ; WX 602 ; N uni0623 ; G 1113 -U 1572 ; WX 602 ; N uni0624 ; G 1114 -U 1573 ; WX 602 ; N uni0625 ; G 1115 -U 1574 ; WX 602 ; N uni0626 ; G 1116 -U 1575 ; WX 602 ; N uni0627 ; G 1117 -U 1576 ; WX 602 ; N uni0628 ; G 1118 -U 1577 ; WX 602 ; N uni0629 ; G 1119 -U 1578 ; WX 602 ; N uni062A ; G 1120 -U 1579 ; WX 602 ; N uni062B ; G 1121 -U 1580 ; WX 602 ; N uni062C ; G 1122 -U 1581 ; WX 602 ; N uni062D ; G 1123 -U 1582 ; WX 602 ; N uni062E ; G 1124 -U 1583 ; WX 602 ; N uni062F ; G 1125 -U 1584 ; WX 602 ; N uni0630 ; G 1126 -U 1585 ; WX 602 ; N uni0631 ; G 1127 -U 1586 ; WX 602 ; N uni0632 ; G 1128 -U 1587 ; WX 602 ; N uni0633 ; G 1129 -U 1588 ; WX 602 ; N uni0634 ; G 1130 -U 1589 ; WX 602 ; N uni0635 ; G 1131 -U 1590 ; WX 602 ; N uni0636 ; G 1132 -U 1591 ; WX 602 ; N uni0637 ; G 1133 -U 1592 ; WX 602 ; N uni0638 ; G 1134 -U 1593 ; WX 602 ; N uni0639 ; G 1135 -U 1594 ; WX 602 ; N uni063A ; G 1136 -U 1600 ; WX 602 ; N uni0640 ; G 1137 -U 1601 ; WX 602 ; N uni0641 ; G 1138 -U 1602 ; WX 602 ; N uni0642 ; G 1139 -U 1603 ; WX 602 ; N uni0643 ; G 1140 -U 1604 ; WX 602 ; N uni0644 ; G 1141 -U 1605 ; WX 602 ; N uni0645 ; G 1142 -U 1606 ; WX 602 ; N uni0646 ; G 1143 -U 1607 ; WX 602 ; N uni0647 ; G 1144 -U 1608 ; WX 602 ; N uni0648 ; G 1145 -U 1609 ; WX 602 ; N uni0649 ; G 1146 -U 1610 ; WX 602 ; N uni064A ; G 1147 -U 1611 ; WX 602 ; N uni064B ; G 1148 -U 1612 ; WX 602 ; N uni064C ; G 1149 -U 1613 ; WX 602 ; N uni064D ; G 1150 -U 1614 ; WX 602 ; N uni064E ; G 1151 -U 1615 ; WX 602 ; N uni064F ; G 1152 -U 1616 ; WX 602 ; N uni0650 ; G 1153 -U 1617 ; WX 602 ; N uni0651 ; G 1154 -U 1618 ; WX 602 ; N uni0652 ; G 1155 -U 1619 ; WX 602 ; N uni0653 ; G 1156 -U 1620 ; WX 602 ; N uni0654 ; G 1157 -U 1621 ; WX 602 ; N uni0655 ; G 1158 -U 1626 ; WX 602 ; N uni065A ; G 1159 -U 1632 ; WX 602 ; N uni0660 ; G 1160 -U 1633 ; WX 602 ; N uni0661 ; G 1161 -U 1634 ; WX 602 ; N uni0662 ; G 1162 -U 1635 ; WX 602 ; N uni0663 ; G 1163 -U 1636 ; WX 602 ; N uni0664 ; G 1164 -U 1637 ; WX 602 ; N uni0665 ; G 1165 -U 1638 ; WX 602 ; N uni0666 ; G 1166 -U 1639 ; WX 602 ; N uni0667 ; G 1167 -U 1640 ; WX 602 ; N uni0668 ; G 1168 -U 1641 ; WX 602 ; N uni0669 ; G 1169 -U 1642 ; WX 602 ; N uni066A ; G 1170 -U 1643 ; WX 602 ; N uni066B ; G 1171 -U 1644 ; WX 602 ; N uni066C ; G 1172 -U 1645 ; WX 602 ; N uni066D ; G 1173 -U 1652 ; WX 602 ; N uni0674 ; G 1174 -U 1657 ; WX 602 ; N uni0679 ; G 1175 -U 1658 ; WX 602 ; N uni067A ; G 1176 -U 1659 ; WX 602 ; N uni067B ; G 1177 -U 1662 ; WX 602 ; N uni067E ; G 1178 -U 1663 ; WX 602 ; N uni067F ; G 1179 -U 1664 ; WX 602 ; N uni0680 ; G 1180 -U 1667 ; WX 602 ; N uni0683 ; G 1181 -U 1668 ; WX 602 ; N uni0684 ; G 1182 -U 1670 ; WX 602 ; N uni0686 ; G 1183 -U 1671 ; WX 602 ; N uni0687 ; G 1184 -U 1681 ; WX 602 ; N uni0691 ; G 1185 -U 1688 ; WX 602 ; N uni0698 ; G 1186 -U 1700 ; WX 602 ; N uni06A4 ; G 1187 -U 1705 ; WX 602 ; N uni06A9 ; G 1188 -U 1711 ; WX 602 ; N uni06AF ; G 1189 -U 1726 ; WX 602 ; N uni06BE ; G 1190 -U 1740 ; WX 602 ; N uni06CC ; G 1191 -U 1776 ; WX 602 ; N uni06F0 ; G 1192 -U 1777 ; WX 602 ; N uni06F1 ; G 1193 -U 1778 ; WX 602 ; N uni06F2 ; G 1194 -U 1779 ; WX 602 ; N uni06F3 ; G 1195 -U 1780 ; WX 602 ; N uni06F4 ; G 1196 -U 1781 ; WX 602 ; N uni06F5 ; G 1197 -U 1782 ; WX 602 ; N uni06F6 ; G 1198 -U 1783 ; WX 602 ; N uni06F7 ; G 1199 -U 1784 ; WX 602 ; N uni06F8 ; G 1200 -U 1785 ; WX 602 ; N uni06F9 ; G 1201 -U 3647 ; WX 602 ; N uni0E3F ; G 1202 -U 3713 ; WX 602 ; N uni0E81 ; G 1203 -U 3714 ; WX 602 ; N uni0E82 ; G 1204 -U 3716 ; WX 602 ; N uni0E84 ; G 1205 -U 3719 ; WX 602 ; N uni0E87 ; G 1206 -U 3720 ; WX 602 ; N uni0E88 ; G 1207 -U 3722 ; WX 602 ; N uni0E8A ; G 1208 -U 3725 ; WX 602 ; N uni0E8D ; G 1209 -U 3732 ; WX 602 ; N uni0E94 ; G 1210 -U 3733 ; WX 602 ; N uni0E95 ; G 1211 -U 3734 ; WX 602 ; N uni0E96 ; G 1212 -U 3735 ; WX 602 ; N uni0E97 ; G 1213 -U 3737 ; WX 602 ; N uni0E99 ; G 1214 -U 3738 ; WX 602 ; N uni0E9A ; G 1215 -U 3739 ; WX 602 ; N uni0E9B ; G 1216 -U 3740 ; WX 602 ; N uni0E9C ; G 1217 -U 3741 ; WX 602 ; N uni0E9D ; G 1218 -U 3742 ; WX 602 ; N uni0E9E ; G 1219 -U 3743 ; WX 602 ; N uni0E9F ; G 1220 -U 3745 ; WX 602 ; N uni0EA1 ; G 1221 -U 3746 ; WX 602 ; N uni0EA2 ; G 1222 -U 3747 ; WX 602 ; N uni0EA3 ; G 1223 -U 3749 ; WX 602 ; N uni0EA5 ; G 1224 -U 3751 ; WX 602 ; N uni0EA7 ; G 1225 -U 3754 ; WX 602 ; N uni0EAA ; G 1226 -U 3755 ; WX 602 ; N uni0EAB ; G 1227 -U 3757 ; WX 602 ; N uni0EAD ; G 1228 -U 3758 ; WX 602 ; N uni0EAE ; G 1229 -U 3759 ; WX 602 ; N uni0EAF ; G 1230 -U 3760 ; WX 602 ; N uni0EB0 ; G 1231 -U 3761 ; WX 602 ; N uni0EB1 ; G 1232 -U 3762 ; WX 602 ; N uni0EB2 ; G 1233 -U 3763 ; WX 602 ; N uni0EB3 ; G 1234 -U 3764 ; WX 602 ; N uni0EB4 ; G 1235 -U 3765 ; WX 602 ; N uni0EB5 ; G 1236 -U 3766 ; WX 602 ; N uni0EB6 ; G 1237 -U 3767 ; WX 602 ; N uni0EB7 ; G 1238 -U 3768 ; WX 602 ; N uni0EB8 ; G 1239 -U 3769 ; WX 602 ; N uni0EB9 ; G 1240 -U 3771 ; WX 602 ; N uni0EBB ; G 1241 -U 3772 ; WX 602 ; N uni0EBC ; G 1242 -U 3784 ; WX 602 ; N uni0EC8 ; G 1243 -U 3785 ; WX 602 ; N uni0EC9 ; G 1244 -U 3786 ; WX 602 ; N uni0ECA ; G 1245 -U 3787 ; WX 602 ; N uni0ECB ; G 1246 -U 3788 ; WX 602 ; N uni0ECC ; G 1247 -U 3789 ; WX 602 ; N uni0ECD ; G 1248 -U 4304 ; WX 602 ; N uni10D0 ; G 1249 -U 4305 ; WX 602 ; N uni10D1 ; G 1250 -U 4306 ; WX 602 ; N uni10D2 ; G 1251 -U 4307 ; WX 602 ; N uni10D3 ; G 1252 -U 4308 ; WX 602 ; N uni10D4 ; G 1253 -U 4309 ; WX 602 ; N uni10D5 ; G 1254 -U 4310 ; WX 602 ; N uni10D6 ; G 1255 -U 4311 ; WX 602 ; N uni10D7 ; G 1256 -U 4312 ; WX 602 ; N uni10D8 ; G 1257 -U 4313 ; WX 602 ; N uni10D9 ; G 1258 -U 4314 ; WX 602 ; N uni10DA ; G 1259 -U 4315 ; WX 602 ; N uni10DB ; G 1260 -U 4316 ; WX 602 ; N uni10DC ; G 1261 -U 4317 ; WX 602 ; N uni10DD ; G 1262 -U 4318 ; WX 602 ; N uni10DE ; G 1263 -U 4319 ; WX 602 ; N uni10DF ; G 1264 -U 4320 ; WX 602 ; N uni10E0 ; G 1265 -U 4321 ; WX 602 ; N uni10E1 ; G 1266 -U 4322 ; WX 602 ; N uni10E2 ; G 1267 -U 4323 ; WX 602 ; N uni10E3 ; G 1268 -U 4324 ; WX 602 ; N uni10E4 ; G 1269 -U 4325 ; WX 602 ; N uni10E5 ; G 1270 -U 4326 ; WX 602 ; N uni10E6 ; G 1271 -U 4327 ; WX 602 ; N uni10E7 ; G 1272 -U 4328 ; WX 602 ; N uni10E8 ; G 1273 -U 4329 ; WX 602 ; N uni10E9 ; G 1274 -U 4330 ; WX 602 ; N uni10EA ; G 1275 -U 4331 ; WX 602 ; N uni10EB ; G 1276 -U 4332 ; WX 602 ; N uni10EC ; G 1277 -U 4333 ; WX 602 ; N uni10ED ; G 1278 -U 4334 ; WX 602 ; N uni10EE ; G 1279 -U 4335 ; WX 602 ; N uni10EF ; G 1280 -U 4336 ; WX 602 ; N uni10F0 ; G 1281 -U 4337 ; WX 602 ; N uni10F1 ; G 1282 -U 4338 ; WX 602 ; N uni10F2 ; G 1283 -U 4339 ; WX 602 ; N uni10F3 ; G 1284 -U 4340 ; WX 602 ; N uni10F4 ; G 1285 -U 4341 ; WX 602 ; N uni10F5 ; G 1286 -U 4342 ; WX 602 ; N uni10F6 ; G 1287 -U 4343 ; WX 602 ; N uni10F7 ; G 1288 -U 4344 ; WX 602 ; N uni10F8 ; G 1289 -U 4345 ; WX 602 ; N uni10F9 ; G 1290 -U 4346 ; WX 602 ; N uni10FA ; G 1291 -U 4347 ; WX 602 ; N uni10FB ; G 1292 -U 4348 ; WX 602 ; N uni10FC ; G 1293 -U 7426 ; WX 602 ; N uni1D02 ; G 1294 -U 7432 ; WX 602 ; N uni1D08 ; G 1295 -U 7433 ; WX 602 ; N uni1D09 ; G 1296 -U 7444 ; WX 602 ; N uni1D14 ; G 1297 -U 7446 ; WX 602 ; N uni1D16 ; G 1298 -U 7447 ; WX 602 ; N uni1D17 ; G 1299 -U 7453 ; WX 602 ; N uni1D1D ; G 1300 -U 7454 ; WX 602 ; N uni1D1E ; G 1301 -U 7455 ; WX 602 ; N uni1D1F ; G 1302 -U 7468 ; WX 602 ; N uni1D2C ; G 1303 -U 7469 ; WX 602 ; N uni1D2D ; G 1304 -U 7470 ; WX 602 ; N uni1D2E ; G 1305 -U 7472 ; WX 602 ; N uni1D30 ; G 1306 -U 7473 ; WX 602 ; N uni1D31 ; G 1307 -U 7474 ; WX 602 ; N uni1D32 ; G 1308 -U 7475 ; WX 602 ; N uni1D33 ; G 1309 -U 7476 ; WX 602 ; N uni1D34 ; G 1310 -U 7477 ; WX 602 ; N uni1D35 ; G 1311 -U 7478 ; WX 602 ; N uni1D36 ; G 1312 -U 7479 ; WX 602 ; N uni1D37 ; G 1313 -U 7480 ; WX 602 ; N uni1D38 ; G 1314 -U 7481 ; WX 602 ; N uni1D39 ; G 1315 -U 7482 ; WX 602 ; N uni1D3A ; G 1316 -U 7483 ; WX 602 ; N uni1D3B ; G 1317 -U 7484 ; WX 602 ; N uni1D3C ; G 1318 -U 7486 ; WX 602 ; N uni1D3E ; G 1319 -U 7487 ; WX 602 ; N uni1D3F ; G 1320 -U 7488 ; WX 602 ; N uni1D40 ; G 1321 -U 7489 ; WX 602 ; N uni1D41 ; G 1322 -U 7490 ; WX 602 ; N uni1D42 ; G 1323 -U 7491 ; WX 602 ; N uni1D43 ; G 1324 -U 7492 ; WX 602 ; N uni1D44 ; G 1325 -U 7493 ; WX 602 ; N uni1D45 ; G 1326 -U 7494 ; WX 602 ; N uni1D46 ; G 1327 -U 7495 ; WX 602 ; N uni1D47 ; G 1328 -U 7496 ; WX 602 ; N uni1D48 ; G 1329 -U 7497 ; WX 602 ; N uni1D49 ; G 1330 -U 7498 ; WX 602 ; N uni1D4A ; G 1331 -U 7499 ; WX 602 ; N uni1D4B ; G 1332 -U 7500 ; WX 602 ; N uni1D4C ; G 1333 -U 7501 ; WX 602 ; N uni1D4D ; G 1334 -U 7502 ; WX 602 ; N uni1D4E ; G 1335 -U 7503 ; WX 602 ; N uni1D4F ; G 1336 -U 7504 ; WX 602 ; N uni1D50 ; G 1337 -U 7505 ; WX 602 ; N uni1D51 ; G 1338 -U 7506 ; WX 602 ; N uni1D52 ; G 1339 -U 7507 ; WX 602 ; N uni1D53 ; G 1340 -U 7508 ; WX 602 ; N uni1D54 ; G 1341 -U 7509 ; WX 602 ; N uni1D55 ; G 1342 -U 7510 ; WX 602 ; N uni1D56 ; G 1343 -U 7511 ; WX 602 ; N uni1D57 ; G 1344 -U 7512 ; WX 602 ; N uni1D58 ; G 1345 -U 7513 ; WX 602 ; N uni1D59 ; G 1346 -U 7514 ; WX 602 ; N uni1D5A ; G 1347 -U 7515 ; WX 602 ; N uni1D5B ; G 1348 -U 7522 ; WX 602 ; N uni1D62 ; G 1349 -U 7523 ; WX 602 ; N uni1D63 ; G 1350 -U 7524 ; WX 602 ; N uni1D64 ; G 1351 -U 7525 ; WX 602 ; N uni1D65 ; G 1352 -U 7543 ; WX 602 ; N uni1D77 ; G 1353 -U 7544 ; WX 602 ; N uni1D78 ; G 1354 -U 7547 ; WX 602 ; N uni1D7B ; G 1355 -U 7557 ; WX 602 ; N uni1D85 ; G 1356 -U 7579 ; WX 602 ; N uni1D9B ; G 1357 -U 7580 ; WX 602 ; N uni1D9C ; G 1358 -U 7581 ; WX 602 ; N uni1D9D ; G 1359 -U 7582 ; WX 602 ; N uni1D9E ; G 1360 -U 7583 ; WX 602 ; N uni1D9F ; G 1361 -U 7584 ; WX 602 ; N uni1DA0 ; G 1362 -U 7585 ; WX 602 ; N uni1DA1 ; G 1363 -U 7586 ; WX 602 ; N uni1DA2 ; G 1364 -U 7587 ; WX 602 ; N uni1DA3 ; G 1365 -U 7588 ; WX 602 ; N uni1DA4 ; G 1366 -U 7589 ; WX 602 ; N uni1DA5 ; G 1367 -U 7590 ; WX 602 ; N uni1DA6 ; G 1368 -U 7591 ; WX 602 ; N uni1DA7 ; G 1369 -U 7592 ; WX 602 ; N uni1DA8 ; G 1370 -U 7593 ; WX 602 ; N uni1DA9 ; G 1371 -U 7594 ; WX 602 ; N uni1DAA ; G 1372 -U 7595 ; WX 602 ; N uni1DAB ; G 1373 -U 7596 ; WX 602 ; N uni1DAC ; G 1374 -U 7597 ; WX 602 ; N uni1DAD ; G 1375 -U 7598 ; WX 602 ; N uni1DAE ; G 1376 -U 7599 ; WX 602 ; N uni1DAF ; G 1377 -U 7600 ; WX 602 ; N uni1DB0 ; G 1378 -U 7601 ; WX 602 ; N uni1DB1 ; G 1379 -U 7602 ; WX 602 ; N uni1DB2 ; G 1380 -U 7603 ; WX 602 ; N uni1DB3 ; G 1381 -U 7604 ; WX 602 ; N uni1DB4 ; G 1382 -U 7605 ; WX 602 ; N uni1DB5 ; G 1383 -U 7606 ; WX 602 ; N uni1DB6 ; G 1384 -U 7607 ; WX 602 ; N uni1DB7 ; G 1385 -U 7609 ; WX 602 ; N uni1DB9 ; G 1386 -U 7610 ; WX 602 ; N uni1DBA ; G 1387 -U 7611 ; WX 602 ; N uni1DBB ; G 1388 -U 7612 ; WX 602 ; N uni1DBC ; G 1389 -U 7613 ; WX 602 ; N uni1DBD ; G 1390 -U 7614 ; WX 602 ; N uni1DBE ; G 1391 -U 7615 ; WX 602 ; N uni1DBF ; G 1392 -U 7680 ; WX 602 ; N uni1E00 ; G 1393 -U 7681 ; WX 602 ; N uni1E01 ; G 1394 -U 7682 ; WX 602 ; N uni1E02 ; G 1395 -U 7683 ; WX 602 ; N uni1E03 ; G 1396 -U 7684 ; WX 602 ; N uni1E04 ; G 1397 -U 7685 ; WX 602 ; N uni1E05 ; G 1398 -U 7686 ; WX 602 ; N uni1E06 ; G 1399 -U 7687 ; WX 602 ; N uni1E07 ; G 1400 -U 7688 ; WX 602 ; N uni1E08 ; G 1401 -U 7689 ; WX 602 ; N uni1E09 ; G 1402 -U 7690 ; WX 602 ; N uni1E0A ; G 1403 -U 7691 ; WX 602 ; N uni1E0B ; G 1404 -U 7692 ; WX 602 ; N uni1E0C ; G 1405 -U 7693 ; WX 602 ; N uni1E0D ; G 1406 -U 7694 ; WX 602 ; N uni1E0E ; G 1407 -U 7695 ; WX 602 ; N uni1E0F ; G 1408 -U 7696 ; WX 602 ; N uni1E10 ; G 1409 -U 7697 ; WX 602 ; N uni1E11 ; G 1410 -U 7698 ; WX 602 ; N uni1E12 ; G 1411 -U 7699 ; WX 602 ; N uni1E13 ; G 1412 -U 7704 ; WX 602 ; N uni1E18 ; G 1413 -U 7705 ; WX 602 ; N uni1E19 ; G 1414 -U 7706 ; WX 602 ; N uni1E1A ; G 1415 -U 7707 ; WX 602 ; N uni1E1B ; G 1416 -U 7708 ; WX 602 ; N uni1E1C ; G 1417 -U 7709 ; WX 602 ; N uni1E1D ; G 1418 -U 7710 ; WX 602 ; N uni1E1E ; G 1419 -U 7711 ; WX 602 ; N uni1E1F ; G 1420 -U 7712 ; WX 602 ; N uni1E20 ; G 1421 -U 7713 ; WX 602 ; N uni1E21 ; G 1422 -U 7714 ; WX 602 ; N uni1E22 ; G 1423 -U 7715 ; WX 602 ; N uni1E23 ; G 1424 -U 7716 ; WX 602 ; N uni1E24 ; G 1425 -U 7717 ; WX 602 ; N uni1E25 ; G 1426 -U 7718 ; WX 602 ; N uni1E26 ; G 1427 -U 7719 ; WX 602 ; N uni1E27 ; G 1428 -U 7720 ; WX 602 ; N uni1E28 ; G 1429 -U 7721 ; WX 602 ; N uni1E29 ; G 1430 -U 7722 ; WX 602 ; N uni1E2A ; G 1431 -U 7723 ; WX 602 ; N uni1E2B ; G 1432 -U 7724 ; WX 602 ; N uni1E2C ; G 1433 -U 7725 ; WX 602 ; N uni1E2D ; G 1434 -U 7728 ; WX 602 ; N uni1E30 ; G 1435 -U 7729 ; WX 602 ; N uni1E31 ; G 1436 -U 7730 ; WX 602 ; N uni1E32 ; G 1437 -U 7731 ; WX 602 ; N uni1E33 ; G 1438 -U 7732 ; WX 602 ; N uni1E34 ; G 1439 -U 7733 ; WX 602 ; N uni1E35 ; G 1440 -U 7734 ; WX 602 ; N uni1E36 ; G 1441 -U 7735 ; WX 602 ; N uni1E37 ; G 1442 -U 7736 ; WX 602 ; N uni1E38 ; G 1443 -U 7737 ; WX 602 ; N uni1E39 ; G 1444 -U 7738 ; WX 602 ; N uni1E3A ; G 1445 -U 7739 ; WX 602 ; N uni1E3B ; G 1446 -U 7740 ; WX 602 ; N uni1E3C ; G 1447 -U 7741 ; WX 602 ; N uni1E3D ; G 1448 -U 7742 ; WX 602 ; N uni1E3E ; G 1449 -U 7743 ; WX 602 ; N uni1E3F ; G 1450 -U 7744 ; WX 602 ; N uni1E40 ; G 1451 -U 7745 ; WX 602 ; N uni1E41 ; G 1452 -U 7746 ; WX 602 ; N uni1E42 ; G 1453 -U 7747 ; WX 602 ; N uni1E43 ; G 1454 -U 7748 ; WX 602 ; N uni1E44 ; G 1455 -U 7749 ; WX 602 ; N uni1E45 ; G 1456 -U 7750 ; WX 602 ; N uni1E46 ; G 1457 -U 7751 ; WX 602 ; N uni1E47 ; G 1458 -U 7752 ; WX 602 ; N uni1E48 ; G 1459 -U 7753 ; WX 602 ; N uni1E49 ; G 1460 -U 7754 ; WX 602 ; N uni1E4A ; G 1461 -U 7755 ; WX 602 ; N uni1E4B ; G 1462 -U 7756 ; WX 602 ; N uni1E4C ; G 1463 -U 7757 ; WX 602 ; N uni1E4D ; G 1464 -U 7764 ; WX 602 ; N uni1E54 ; G 1465 -U 7765 ; WX 602 ; N uni1E55 ; G 1466 -U 7766 ; WX 602 ; N uni1E56 ; G 1467 -U 7767 ; WX 602 ; N uni1E57 ; G 1468 -U 7768 ; WX 602 ; N uni1E58 ; G 1469 -U 7769 ; WX 602 ; N uni1E59 ; G 1470 -U 7770 ; WX 602 ; N uni1E5A ; G 1471 -U 7771 ; WX 602 ; N uni1E5B ; G 1472 -U 7772 ; WX 602 ; N uni1E5C ; G 1473 -U 7773 ; WX 602 ; N uni1E5D ; G 1474 -U 7774 ; WX 602 ; N uni1E5E ; G 1475 -U 7775 ; WX 602 ; N uni1E5F ; G 1476 -U 7776 ; WX 602 ; N uni1E60 ; G 1477 -U 7777 ; WX 602 ; N uni1E61 ; G 1478 -U 7778 ; WX 602 ; N uni1E62 ; G 1479 -U 7779 ; WX 602 ; N uni1E63 ; G 1480 -U 7784 ; WX 602 ; N uni1E68 ; G 1481 -U 7785 ; WX 602 ; N uni1E69 ; G 1482 -U 7786 ; WX 602 ; N uni1E6A ; G 1483 -U 7787 ; WX 602 ; N uni1E6B ; G 1484 -U 7788 ; WX 602 ; N uni1E6C ; G 1485 -U 7789 ; WX 602 ; N uni1E6D ; G 1486 -U 7790 ; WX 602 ; N uni1E6E ; G 1487 -U 7791 ; WX 602 ; N uni1E6F ; G 1488 -U 7792 ; WX 602 ; N uni1E70 ; G 1489 -U 7793 ; WX 602 ; N uni1E71 ; G 1490 -U 7794 ; WX 602 ; N uni1E72 ; G 1491 -U 7795 ; WX 602 ; N uni1E73 ; G 1492 -U 7796 ; WX 602 ; N uni1E74 ; G 1493 -U 7797 ; WX 602 ; N uni1E75 ; G 1494 -U 7798 ; WX 602 ; N uni1E76 ; G 1495 -U 7799 ; WX 602 ; N uni1E77 ; G 1496 -U 7800 ; WX 602 ; N uni1E78 ; G 1497 -U 7801 ; WX 602 ; N uni1E79 ; G 1498 -U 7804 ; WX 602 ; N uni1E7C ; G 1499 -U 7805 ; WX 602 ; N uni1E7D ; G 1500 -U 7806 ; WX 602 ; N uni1E7E ; G 1501 -U 7807 ; WX 602 ; N uni1E7F ; G 1502 -U 7808 ; WX 602 ; N Wgrave ; G 1503 -U 7809 ; WX 602 ; N wgrave ; G 1504 -U 7810 ; WX 602 ; N Wacute ; G 1505 -U 7811 ; WX 602 ; N wacute ; G 1506 -U 7812 ; WX 602 ; N Wdieresis ; G 1507 -U 7813 ; WX 602 ; N wdieresis ; G 1508 -U 7814 ; WX 602 ; N uni1E86 ; G 1509 -U 7815 ; WX 602 ; N uni1E87 ; G 1510 -U 7816 ; WX 602 ; N uni1E88 ; G 1511 -U 7817 ; WX 602 ; N uni1E89 ; G 1512 -U 7818 ; WX 602 ; N uni1E8A ; G 1513 -U 7819 ; WX 602 ; N uni1E8B ; G 1514 -U 7820 ; WX 602 ; N uni1E8C ; G 1515 -U 7821 ; WX 602 ; N uni1E8D ; G 1516 -U 7822 ; WX 602 ; N uni1E8E ; G 1517 -U 7823 ; WX 602 ; N uni1E8F ; G 1518 -U 7824 ; WX 602 ; N uni1E90 ; G 1519 -U 7825 ; WX 602 ; N uni1E91 ; G 1520 -U 7826 ; WX 602 ; N uni1E92 ; G 1521 -U 7827 ; WX 602 ; N uni1E93 ; G 1522 -U 7828 ; WX 602 ; N uni1E94 ; G 1523 -U 7829 ; WX 602 ; N uni1E95 ; G 1524 -U 7830 ; WX 602 ; N uni1E96 ; G 1525 -U 7831 ; WX 602 ; N uni1E97 ; G 1526 -U 7832 ; WX 602 ; N uni1E98 ; G 1527 -U 7833 ; WX 602 ; N uni1E99 ; G 1528 -U 7835 ; WX 602 ; N uni1E9B ; G 1529 -U 7839 ; WX 602 ; N uni1E9F ; G 1530 -U 7840 ; WX 602 ; N uni1EA0 ; G 1531 -U 7841 ; WX 602 ; N uni1EA1 ; G 1532 -U 7852 ; WX 602 ; N uni1EAC ; G 1533 -U 7853 ; WX 602 ; N uni1EAD ; G 1534 -U 7856 ; WX 602 ; N uni1EB0 ; G 1535 -U 7857 ; WX 602 ; N uni1EB1 ; G 1536 -U 7862 ; WX 602 ; N uni1EB6 ; G 1537 -U 7863 ; WX 602 ; N uni1EB7 ; G 1538 -U 7864 ; WX 602 ; N uni1EB8 ; G 1539 -U 7865 ; WX 602 ; N uni1EB9 ; G 1540 -U 7868 ; WX 602 ; N uni1EBC ; G 1541 -U 7869 ; WX 602 ; N uni1EBD ; G 1542 -U 7878 ; WX 602 ; N uni1EC6 ; G 1543 -U 7879 ; WX 602 ; N uni1EC7 ; G 1544 -U 7882 ; WX 602 ; N uni1ECA ; G 1545 -U 7883 ; WX 602 ; N uni1ECB ; G 1546 -U 7884 ; WX 602 ; N uni1ECC ; G 1547 -U 7885 ; WX 602 ; N uni1ECD ; G 1548 -U 7896 ; WX 602 ; N uni1ED8 ; G 1549 -U 7897 ; WX 602 ; N uni1ED9 ; G 1550 -U 7898 ; WX 602 ; N uni1EDA ; G 1551 -U 7899 ; WX 602 ; N uni1EDB ; G 1552 -U 7900 ; WX 602 ; N uni1EDC ; G 1553 -U 7901 ; WX 602 ; N uni1EDD ; G 1554 -U 7904 ; WX 602 ; N uni1EE0 ; G 1555 -U 7905 ; WX 602 ; N uni1EE1 ; G 1556 -U 7906 ; WX 602 ; N uni1EE2 ; G 1557 -U 7907 ; WX 602 ; N uni1EE3 ; G 1558 -U 7908 ; WX 602 ; N uni1EE4 ; G 1559 -U 7909 ; WX 602 ; N uni1EE5 ; G 1560 -U 7912 ; WX 602 ; N uni1EE8 ; G 1561 -U 7913 ; WX 602 ; N uni1EE9 ; G 1562 -U 7914 ; WX 602 ; N uni1EEA ; G 1563 -U 7915 ; WX 602 ; N uni1EEB ; G 1564 -U 7918 ; WX 602 ; N uni1EEE ; G 1565 -U 7919 ; WX 602 ; N uni1EEF ; G 1566 -U 7920 ; WX 602 ; N uni1EF0 ; G 1567 -U 7921 ; WX 602 ; N uni1EF1 ; G 1568 -U 7922 ; WX 602 ; N Ygrave ; G 1569 -U 7923 ; WX 602 ; N ygrave ; G 1570 -U 7924 ; WX 602 ; N uni1EF4 ; G 1571 -U 7925 ; WX 602 ; N uni1EF5 ; G 1572 -U 7928 ; WX 602 ; N uni1EF8 ; G 1573 -U 7929 ; WX 602 ; N uni1EF9 ; G 1574 -U 7936 ; WX 602 ; N uni1F00 ; G 1575 -U 7937 ; WX 602 ; N uni1F01 ; G 1576 -U 7938 ; WX 602 ; N uni1F02 ; G 1577 -U 7939 ; WX 602 ; N uni1F03 ; G 1578 -U 7940 ; WX 602 ; N uni1F04 ; G 1579 -U 7941 ; WX 602 ; N uni1F05 ; G 1580 -U 7942 ; WX 602 ; N uni1F06 ; G 1581 -U 7943 ; WX 602 ; N uni1F07 ; G 1582 -U 7944 ; WX 602 ; N uni1F08 ; G 1583 -U 7945 ; WX 602 ; N uni1F09 ; G 1584 -U 7946 ; WX 602 ; N uni1F0A ; G 1585 -U 7947 ; WX 602 ; N uni1F0B ; G 1586 -U 7948 ; WX 602 ; N uni1F0C ; G 1587 -U 7949 ; WX 602 ; N uni1F0D ; G 1588 -U 7950 ; WX 602 ; N uni1F0E ; G 1589 -U 7951 ; WX 602 ; N uni1F0F ; G 1590 -U 7952 ; WX 602 ; N uni1F10 ; G 1591 -U 7953 ; WX 602 ; N uni1F11 ; G 1592 -U 7954 ; WX 602 ; N uni1F12 ; G 1593 -U 7955 ; WX 602 ; N uni1F13 ; G 1594 -U 7956 ; WX 602 ; N uni1F14 ; G 1595 -U 7957 ; WX 602 ; N uni1F15 ; G 1596 -U 7960 ; WX 602 ; N uni1F18 ; G 1597 -U 7961 ; WX 602 ; N uni1F19 ; G 1598 -U 7962 ; WX 602 ; N uni1F1A ; G 1599 -U 7963 ; WX 602 ; N uni1F1B ; G 1600 -U 7964 ; WX 602 ; N uni1F1C ; G 1601 -U 7965 ; WX 602 ; N uni1F1D ; G 1602 -U 7968 ; WX 602 ; N uni1F20 ; G 1603 -U 7969 ; WX 602 ; N uni1F21 ; G 1604 -U 7970 ; WX 602 ; N uni1F22 ; G 1605 -U 7971 ; WX 602 ; N uni1F23 ; G 1606 -U 7972 ; WX 602 ; N uni1F24 ; G 1607 -U 7973 ; WX 602 ; N uni1F25 ; G 1608 -U 7974 ; WX 602 ; N uni1F26 ; G 1609 -U 7975 ; WX 602 ; N uni1F27 ; G 1610 -U 7976 ; WX 602 ; N uni1F28 ; G 1611 -U 7977 ; WX 602 ; N uni1F29 ; G 1612 -U 7978 ; WX 602 ; N uni1F2A ; G 1613 -U 7979 ; WX 602 ; N uni1F2B ; G 1614 -U 7980 ; WX 602 ; N uni1F2C ; G 1615 -U 7981 ; WX 602 ; N uni1F2D ; G 1616 -U 7982 ; WX 602 ; N uni1F2E ; G 1617 -U 7983 ; WX 602 ; N uni1F2F ; G 1618 -U 7984 ; WX 602 ; N uni1F30 ; G 1619 -U 7985 ; WX 602 ; N uni1F31 ; G 1620 -U 7986 ; WX 602 ; N uni1F32 ; G 1621 -U 7987 ; WX 602 ; N uni1F33 ; G 1622 -U 7988 ; WX 602 ; N uni1F34 ; G 1623 -U 7989 ; WX 602 ; N uni1F35 ; G 1624 -U 7990 ; WX 602 ; N uni1F36 ; G 1625 -U 7991 ; WX 602 ; N uni1F37 ; G 1626 -U 7992 ; WX 602 ; N uni1F38 ; G 1627 -U 7993 ; WX 602 ; N uni1F39 ; G 1628 -U 7994 ; WX 602 ; N uni1F3A ; G 1629 -U 7995 ; WX 602 ; N uni1F3B ; G 1630 -U 7996 ; WX 602 ; N uni1F3C ; G 1631 -U 7997 ; WX 602 ; N uni1F3D ; G 1632 -U 7998 ; WX 602 ; N uni1F3E ; G 1633 -U 7999 ; WX 602 ; N uni1F3F ; G 1634 -U 8000 ; WX 602 ; N uni1F40 ; G 1635 -U 8001 ; WX 602 ; N uni1F41 ; G 1636 -U 8002 ; WX 602 ; N uni1F42 ; G 1637 -U 8003 ; WX 602 ; N uni1F43 ; G 1638 -U 8004 ; WX 602 ; N uni1F44 ; G 1639 -U 8005 ; WX 602 ; N uni1F45 ; G 1640 -U 8008 ; WX 602 ; N uni1F48 ; G 1641 -U 8009 ; WX 602 ; N uni1F49 ; G 1642 -U 8010 ; WX 602 ; N uni1F4A ; G 1643 -U 8011 ; WX 602 ; N uni1F4B ; G 1644 -U 8012 ; WX 602 ; N uni1F4C ; G 1645 -U 8013 ; WX 602 ; N uni1F4D ; G 1646 -U 8016 ; WX 602 ; N uni1F50 ; G 1647 -U 8017 ; WX 602 ; N uni1F51 ; G 1648 -U 8018 ; WX 602 ; N uni1F52 ; G 1649 -U 8019 ; WX 602 ; N uni1F53 ; G 1650 -U 8020 ; WX 602 ; N uni1F54 ; G 1651 -U 8021 ; WX 602 ; N uni1F55 ; G 1652 -U 8022 ; WX 602 ; N uni1F56 ; G 1653 -U 8023 ; WX 602 ; N uni1F57 ; G 1654 -U 8025 ; WX 602 ; N uni1F59 ; G 1655 -U 8027 ; WX 602 ; N uni1F5B ; G 1656 -U 8029 ; WX 602 ; N uni1F5D ; G 1657 -U 8031 ; WX 602 ; N uni1F5F ; G 1658 -U 8032 ; WX 602 ; N uni1F60 ; G 1659 -U 8033 ; WX 602 ; N uni1F61 ; G 1660 -U 8034 ; WX 602 ; N uni1F62 ; G 1661 -U 8035 ; WX 602 ; N uni1F63 ; G 1662 -U 8036 ; WX 602 ; N uni1F64 ; G 1663 -U 8037 ; WX 602 ; N uni1F65 ; G 1664 -U 8038 ; WX 602 ; N uni1F66 ; G 1665 -U 8039 ; WX 602 ; N uni1F67 ; G 1666 -U 8040 ; WX 602 ; N uni1F68 ; G 1667 -U 8041 ; WX 602 ; N uni1F69 ; G 1668 -U 8042 ; WX 602 ; N uni1F6A ; G 1669 -U 8043 ; WX 602 ; N uni1F6B ; G 1670 -U 8044 ; WX 602 ; N uni1F6C ; G 1671 -U 8045 ; WX 602 ; N uni1F6D ; G 1672 -U 8046 ; WX 602 ; N uni1F6E ; G 1673 -U 8047 ; WX 602 ; N uni1F6F ; G 1674 -U 8048 ; WX 602 ; N uni1F70 ; G 1675 -U 8049 ; WX 602 ; N uni1F71 ; G 1676 -U 8050 ; WX 602 ; N uni1F72 ; G 1677 -U 8051 ; WX 602 ; N uni1F73 ; G 1678 -U 8052 ; WX 602 ; N uni1F74 ; G 1679 -U 8053 ; WX 602 ; N uni1F75 ; G 1680 -U 8054 ; WX 602 ; N uni1F76 ; G 1681 -U 8055 ; WX 602 ; N uni1F77 ; G 1682 -U 8056 ; WX 602 ; N uni1F78 ; G 1683 -U 8057 ; WX 602 ; N uni1F79 ; G 1684 -U 8058 ; WX 602 ; N uni1F7A ; G 1685 -U 8059 ; WX 602 ; N uni1F7B ; G 1686 -U 8060 ; WX 602 ; N uni1F7C ; G 1687 -U 8061 ; WX 602 ; N uni1F7D ; G 1688 -U 8064 ; WX 602 ; N uni1F80 ; G 1689 -U 8065 ; WX 602 ; N uni1F81 ; G 1690 -U 8066 ; WX 602 ; N uni1F82 ; G 1691 -U 8067 ; WX 602 ; N uni1F83 ; G 1692 -U 8068 ; WX 602 ; N uni1F84 ; G 1693 -U 8069 ; WX 602 ; N uni1F85 ; G 1694 -U 8070 ; WX 602 ; N uni1F86 ; G 1695 -U 8071 ; WX 602 ; N uni1F87 ; G 1696 -U 8072 ; WX 602 ; N uni1F88 ; G 1697 -U 8073 ; WX 602 ; N uni1F89 ; G 1698 -U 8074 ; WX 602 ; N uni1F8A ; G 1699 -U 8075 ; WX 602 ; N uni1F8B ; G 1700 -U 8076 ; WX 602 ; N uni1F8C ; G 1701 -U 8077 ; WX 602 ; N uni1F8D ; G 1702 -U 8078 ; WX 602 ; N uni1F8E ; G 1703 -U 8079 ; WX 602 ; N uni1F8F ; G 1704 -U 8080 ; WX 602 ; N uni1F90 ; G 1705 -U 8081 ; WX 602 ; N uni1F91 ; G 1706 -U 8082 ; WX 602 ; N uni1F92 ; G 1707 -U 8083 ; WX 602 ; N uni1F93 ; G 1708 -U 8084 ; WX 602 ; N uni1F94 ; G 1709 -U 8085 ; WX 602 ; N uni1F95 ; G 1710 -U 8086 ; WX 602 ; N uni1F96 ; G 1711 -U 8087 ; WX 602 ; N uni1F97 ; G 1712 -U 8088 ; WX 602 ; N uni1F98 ; G 1713 -U 8089 ; WX 602 ; N uni1F99 ; G 1714 -U 8090 ; WX 602 ; N uni1F9A ; G 1715 -U 8091 ; WX 602 ; N uni1F9B ; G 1716 -U 8092 ; WX 602 ; N uni1F9C ; G 1717 -U 8093 ; WX 602 ; N uni1F9D ; G 1718 -U 8094 ; WX 602 ; N uni1F9E ; G 1719 -U 8095 ; WX 602 ; N uni1F9F ; G 1720 -U 8096 ; WX 602 ; N uni1FA0 ; G 1721 -U 8097 ; WX 602 ; N uni1FA1 ; G 1722 -U 8098 ; WX 602 ; N uni1FA2 ; G 1723 -U 8099 ; WX 602 ; N uni1FA3 ; G 1724 -U 8100 ; WX 602 ; N uni1FA4 ; G 1725 -U 8101 ; WX 602 ; N uni1FA5 ; G 1726 -U 8102 ; WX 602 ; N uni1FA6 ; G 1727 -U 8103 ; WX 602 ; N uni1FA7 ; G 1728 -U 8104 ; WX 602 ; N uni1FA8 ; G 1729 -U 8105 ; WX 602 ; N uni1FA9 ; G 1730 -U 8106 ; WX 602 ; N uni1FAA ; G 1731 -U 8107 ; WX 602 ; N uni1FAB ; G 1732 -U 8108 ; WX 602 ; N uni1FAC ; G 1733 -U 8109 ; WX 602 ; N uni1FAD ; G 1734 -U 8110 ; WX 602 ; N uni1FAE ; G 1735 -U 8111 ; WX 602 ; N uni1FAF ; G 1736 -U 8112 ; WX 602 ; N uni1FB0 ; G 1737 -U 8113 ; WX 602 ; N uni1FB1 ; G 1738 -U 8114 ; WX 602 ; N uni1FB2 ; G 1739 -U 8115 ; WX 602 ; N uni1FB3 ; G 1740 -U 8116 ; WX 602 ; N uni1FB4 ; G 1741 -U 8118 ; WX 602 ; N uni1FB6 ; G 1742 -U 8119 ; WX 602 ; N uni1FB7 ; G 1743 -U 8120 ; WX 602 ; N uni1FB8 ; G 1744 -U 8121 ; WX 602 ; N uni1FB9 ; G 1745 -U 8122 ; WX 602 ; N uni1FBA ; G 1746 -U 8123 ; WX 602 ; N uni1FBB ; G 1747 -U 8124 ; WX 602 ; N uni1FBC ; G 1748 -U 8125 ; WX 602 ; N uni1FBD ; G 1749 -U 8126 ; WX 602 ; N uni1FBE ; G 1750 -U 8127 ; WX 602 ; N uni1FBF ; G 1751 -U 8128 ; WX 602 ; N uni1FC0 ; G 1752 -U 8129 ; WX 602 ; N uni1FC1 ; G 1753 -U 8130 ; WX 602 ; N uni1FC2 ; G 1754 -U 8131 ; WX 602 ; N uni1FC3 ; G 1755 -U 8132 ; WX 602 ; N uni1FC4 ; G 1756 -U 8134 ; WX 602 ; N uni1FC6 ; G 1757 -U 8135 ; WX 602 ; N uni1FC7 ; G 1758 -U 8136 ; WX 602 ; N uni1FC8 ; G 1759 -U 8137 ; WX 602 ; N uni1FC9 ; G 1760 -U 8138 ; WX 602 ; N uni1FCA ; G 1761 -U 8139 ; WX 602 ; N uni1FCB ; G 1762 -U 8140 ; WX 602 ; N uni1FCC ; G 1763 -U 8141 ; WX 602 ; N uni1FCD ; G 1764 -U 8142 ; WX 602 ; N uni1FCE ; G 1765 -U 8143 ; WX 602 ; N uni1FCF ; G 1766 -U 8144 ; WX 602 ; N uni1FD0 ; G 1767 -U 8145 ; WX 602 ; N uni1FD1 ; G 1768 -U 8146 ; WX 602 ; N uni1FD2 ; G 1769 -U 8147 ; WX 602 ; N uni1FD3 ; G 1770 -U 8150 ; WX 602 ; N uni1FD6 ; G 1771 -U 8151 ; WX 602 ; N uni1FD7 ; G 1772 -U 8152 ; WX 602 ; N uni1FD8 ; G 1773 -U 8153 ; WX 602 ; N uni1FD9 ; G 1774 -U 8154 ; WX 602 ; N uni1FDA ; G 1775 -U 8155 ; WX 602 ; N uni1FDB ; G 1776 -U 8157 ; WX 602 ; N uni1FDD ; G 1777 -U 8158 ; WX 602 ; N uni1FDE ; G 1778 -U 8159 ; WX 602 ; N uni1FDF ; G 1779 -U 8160 ; WX 602 ; N uni1FE0 ; G 1780 -U 8161 ; WX 602 ; N uni1FE1 ; G 1781 -U 8162 ; WX 602 ; N uni1FE2 ; G 1782 -U 8163 ; WX 602 ; N uni1FE3 ; G 1783 -U 8164 ; WX 602 ; N uni1FE4 ; G 1784 -U 8165 ; WX 602 ; N uni1FE5 ; G 1785 -U 8166 ; WX 602 ; N uni1FE6 ; G 1786 -U 8167 ; WX 602 ; N uni1FE7 ; G 1787 -U 8168 ; WX 602 ; N uni1FE8 ; G 1788 -U 8169 ; WX 602 ; N uni1FE9 ; G 1789 -U 8170 ; WX 602 ; N uni1FEA ; G 1790 -U 8171 ; WX 602 ; N uni1FEB ; G 1791 -U 8172 ; WX 602 ; N uni1FEC ; G 1792 -U 8173 ; WX 602 ; N uni1FED ; G 1793 -U 8174 ; WX 602 ; N uni1FEE ; G 1794 -U 8175 ; WX 602 ; N uni1FEF ; G 1795 -U 8178 ; WX 602 ; N uni1FF2 ; G 1796 -U 8179 ; WX 602 ; N uni1FF3 ; G 1797 -U 8180 ; WX 602 ; N uni1FF4 ; G 1798 -U 8182 ; WX 602 ; N uni1FF6 ; G 1799 -U 8183 ; WX 602 ; N uni1FF7 ; G 1800 -U 8184 ; WX 602 ; N uni1FF8 ; G 1801 -U 8185 ; WX 602 ; N uni1FF9 ; G 1802 -U 8186 ; WX 602 ; N uni1FFA ; G 1803 -U 8187 ; WX 602 ; N uni1FFB ; G 1804 -U 8188 ; WX 602 ; N uni1FFC ; G 1805 -U 8189 ; WX 602 ; N uni1FFD ; G 1806 -U 8190 ; WX 602 ; N uni1FFE ; G 1807 -U 8192 ; WX 602 ; N uni2000 ; G 1808 -U 8193 ; WX 602 ; N uni2001 ; G 1809 -U 8194 ; WX 602 ; N uni2002 ; G 1810 -U 8195 ; WX 602 ; N uni2003 ; G 1811 -U 8196 ; WX 602 ; N uni2004 ; G 1812 -U 8197 ; WX 602 ; N uni2005 ; G 1813 -U 8198 ; WX 602 ; N uni2006 ; G 1814 -U 8199 ; WX 602 ; N uni2007 ; G 1815 -U 8200 ; WX 602 ; N uni2008 ; G 1816 -U 8201 ; WX 602 ; N uni2009 ; G 1817 -U 8202 ; WX 602 ; N uni200A ; G 1818 -U 8208 ; WX 602 ; N uni2010 ; G 1819 -U 8209 ; WX 602 ; N uni2011 ; G 1820 -U 8210 ; WX 602 ; N figuredash ; G 1821 -U 8211 ; WX 602 ; N endash ; G 1822 -U 8212 ; WX 602 ; N emdash ; G 1823 -U 8213 ; WX 602 ; N uni2015 ; G 1824 -U 8214 ; WX 602 ; N uni2016 ; G 1825 -U 8215 ; WX 602 ; N underscoredbl ; G 1826 -U 8216 ; WX 602 ; N quoteleft ; G 1827 -U 8217 ; WX 602 ; N quoteright ; G 1828 -U 8218 ; WX 602 ; N quotesinglbase ; G 1829 -U 8219 ; WX 602 ; N quotereversed ; G 1830 -U 8220 ; WX 602 ; N quotedblleft ; G 1831 -U 8221 ; WX 602 ; N quotedblright ; G 1832 -U 8222 ; WX 602 ; N quotedblbase ; G 1833 -U 8223 ; WX 602 ; N uni201F ; G 1834 -U 8224 ; WX 602 ; N dagger ; G 1835 -U 8225 ; WX 602 ; N daggerdbl ; G 1836 -U 8226 ; WX 602 ; N bullet ; G 1837 -U 8227 ; WX 602 ; N uni2023 ; G 1838 -U 8230 ; WX 602 ; N ellipsis ; G 1839 -U 8239 ; WX 602 ; N uni202F ; G 1840 -U 8240 ; WX 602 ; N perthousand ; G 1841 -U 8241 ; WX 602 ; N uni2031 ; G 1842 -U 8242 ; WX 602 ; N minute ; G 1843 -U 8243 ; WX 602 ; N second ; G 1844 -U 8244 ; WX 602 ; N uni2034 ; G 1845 -U 8245 ; WX 602 ; N uni2035 ; G 1846 -U 8246 ; WX 602 ; N uni2036 ; G 1847 -U 8247 ; WX 602 ; N uni2037 ; G 1848 -U 8249 ; WX 602 ; N guilsinglleft ; G 1849 -U 8250 ; WX 602 ; N guilsinglright ; G 1850 -U 8252 ; WX 602 ; N exclamdbl ; G 1851 -U 8253 ; WX 602 ; N uni203D ; G 1852 -U 8254 ; WX 602 ; N uni203E ; G 1853 -U 8255 ; WX 602 ; N uni203F ; G 1854 -U 8261 ; WX 602 ; N uni2045 ; G 1855 -U 8262 ; WX 602 ; N uni2046 ; G 1856 -U 8263 ; WX 602 ; N uni2047 ; G 1857 -U 8264 ; WX 602 ; N uni2048 ; G 1858 -U 8265 ; WX 602 ; N uni2049 ; G 1859 -U 8267 ; WX 602 ; N uni204B ; G 1860 -U 8287 ; WX 602 ; N uni205F ; G 1861 -U 8304 ; WX 602 ; N uni2070 ; G 1862 -U 8305 ; WX 602 ; N uni2071 ; G 1863 -U 8308 ; WX 602 ; N uni2074 ; G 1864 -U 8309 ; WX 602 ; N uni2075 ; G 1865 -U 8310 ; WX 602 ; N uni2076 ; G 1866 -U 8311 ; WX 602 ; N uni2077 ; G 1867 -U 8312 ; WX 602 ; N uni2078 ; G 1868 -U 8313 ; WX 602 ; N uni2079 ; G 1869 -U 8314 ; WX 602 ; N uni207A ; G 1870 -U 8315 ; WX 602 ; N uni207B ; G 1871 -U 8316 ; WX 602 ; N uni207C ; G 1872 -U 8317 ; WX 602 ; N uni207D ; G 1873 -U 8318 ; WX 602 ; N uni207E ; G 1874 -U 8319 ; WX 602 ; N uni207F ; G 1875 -U 8320 ; WX 602 ; N uni2080 ; G 1876 -U 8321 ; WX 602 ; N uni2081 ; G 1877 -U 8322 ; WX 602 ; N uni2082 ; G 1878 -U 8323 ; WX 602 ; N uni2083 ; G 1879 -U 8324 ; WX 602 ; N uni2084 ; G 1880 -U 8325 ; WX 602 ; N uni2085 ; G 1881 -U 8326 ; WX 602 ; N uni2086 ; G 1882 -U 8327 ; WX 602 ; N uni2087 ; G 1883 -U 8328 ; WX 602 ; N uni2088 ; G 1884 -U 8329 ; WX 602 ; N uni2089 ; G 1885 -U 8330 ; WX 602 ; N uni208A ; G 1886 -U 8331 ; WX 602 ; N uni208B ; G 1887 -U 8332 ; WX 602 ; N uni208C ; G 1888 -U 8333 ; WX 602 ; N uni208D ; G 1889 -U 8334 ; WX 602 ; N uni208E ; G 1890 -U 8336 ; WX 602 ; N uni2090 ; G 1891 -U 8337 ; WX 602 ; N uni2091 ; G 1892 -U 8338 ; WX 602 ; N uni2092 ; G 1893 -U 8339 ; WX 602 ; N uni2093 ; G 1894 -U 8340 ; WX 602 ; N uni2094 ; G 1895 -U 8341 ; WX 602 ; N uni2095 ; G 1896 -U 8342 ; WX 602 ; N uni2096 ; G 1897 -U 8343 ; WX 602 ; N uni2097 ; G 1898 -U 8344 ; WX 602 ; N uni2098 ; G 1899 -U 8345 ; WX 602 ; N uni2099 ; G 1900 -U 8346 ; WX 602 ; N uni209A ; G 1901 -U 8347 ; WX 602 ; N uni209B ; G 1902 -U 8348 ; WX 602 ; N uni209C ; G 1903 -U 8352 ; WX 602 ; N uni20A0 ; G 1904 -U 8353 ; WX 602 ; N colonmonetary ; G 1905 -U 8354 ; WX 602 ; N uni20A2 ; G 1906 -U 8355 ; WX 602 ; N franc ; G 1907 -U 8356 ; WX 602 ; N lira ; G 1908 -U 8357 ; WX 602 ; N uni20A5 ; G 1909 -U 8358 ; WX 602 ; N uni20A6 ; G 1910 -U 8359 ; WX 602 ; N peseta ; G 1911 -U 8360 ; WX 602 ; N uni20A8 ; G 1912 -U 8361 ; WX 602 ; N uni20A9 ; G 1913 -U 8362 ; WX 602 ; N uni20AA ; G 1914 -U 8363 ; WX 602 ; N dong ; G 1915 -U 8364 ; WX 602 ; N Euro ; G 1916 -U 8365 ; WX 602 ; N uni20AD ; G 1917 -U 8366 ; WX 602 ; N uni20AE ; G 1918 -U 8367 ; WX 602 ; N uni20AF ; G 1919 -U 8368 ; WX 602 ; N uni20B0 ; G 1920 -U 8369 ; WX 602 ; N uni20B1 ; G 1921 -U 8370 ; WX 602 ; N uni20B2 ; G 1922 -U 8371 ; WX 602 ; N uni20B3 ; G 1923 -U 8372 ; WX 602 ; N uni20B4 ; G 1924 -U 8373 ; WX 602 ; N uni20B5 ; G 1925 -U 8376 ; WX 602 ; N uni20B8 ; G 1926 -U 8377 ; WX 602 ; N uni20B9 ; G 1927 -U 8378 ; WX 602 ; N uni20BA ; G 1928 -U 8381 ; WX 602 ; N uni20BD ; G 1929 -U 8450 ; WX 602 ; N uni2102 ; G 1930 -U 8453 ; WX 602 ; N uni2105 ; G 1931 -U 8461 ; WX 602 ; N uni210D ; G 1932 -U 8462 ; WX 602 ; N uni210E ; G 1933 -U 8463 ; WX 602 ; N uni210F ; G 1934 -U 8469 ; WX 602 ; N uni2115 ; G 1935 -U 8470 ; WX 602 ; N uni2116 ; G 1936 -U 8471 ; WX 602 ; N uni2117 ; G 1937 -U 8473 ; WX 602 ; N uni2119 ; G 1938 -U 8474 ; WX 602 ; N uni211A ; G 1939 -U 8477 ; WX 602 ; N uni211D ; G 1940 -U 8482 ; WX 602 ; N trademark ; G 1941 -U 8484 ; WX 602 ; N uni2124 ; G 1942 -U 8486 ; WX 602 ; N uni2126 ; G 1943 -U 8490 ; WX 602 ; N uni212A ; G 1944 -U 8491 ; WX 602 ; N uni212B ; G 1945 -U 8494 ; WX 602 ; N estimated ; G 1946 -U 8520 ; WX 602 ; N uni2148 ; G 1947 -U 8528 ; WX 602 ; N uni2150 ; G 1948 -U 8529 ; WX 602 ; N uni2151 ; G 1949 -U 8531 ; WX 602 ; N onethird ; G 1950 -U 8532 ; WX 602 ; N twothirds ; G 1951 -U 8533 ; WX 602 ; N uni2155 ; G 1952 -U 8534 ; WX 602 ; N uni2156 ; G 1953 -U 8535 ; WX 602 ; N uni2157 ; G 1954 -U 8536 ; WX 602 ; N uni2158 ; G 1955 -U 8537 ; WX 602 ; N uni2159 ; G 1956 -U 8538 ; WX 602 ; N uni215A ; G 1957 -U 8539 ; WX 602 ; N oneeighth ; G 1958 -U 8540 ; WX 602 ; N threeeighths ; G 1959 -U 8541 ; WX 602 ; N fiveeighths ; G 1960 -U 8542 ; WX 602 ; N seveneighths ; G 1961 -U 8543 ; WX 602 ; N uni215F ; G 1962 -U 8585 ; WX 602 ; N uni2189 ; G 1963 -U 8592 ; WX 602 ; N arrowleft ; G 1964 -U 8593 ; WX 602 ; N arrowup ; G 1965 -U 8594 ; WX 602 ; N arrowright ; G 1966 -U 8595 ; WX 602 ; N arrowdown ; G 1967 -U 8596 ; WX 602 ; N arrowboth ; G 1968 -U 8597 ; WX 602 ; N arrowupdn ; G 1969 -U 8598 ; WX 602 ; N uni2196 ; G 1970 -U 8599 ; WX 602 ; N uni2197 ; G 1971 -U 8600 ; WX 602 ; N uni2198 ; G 1972 -U 8601 ; WX 602 ; N uni2199 ; G 1973 -U 8602 ; WX 602 ; N uni219A ; G 1974 -U 8603 ; WX 602 ; N uni219B ; G 1975 -U 8604 ; WX 602 ; N uni219C ; G 1976 -U 8605 ; WX 602 ; N uni219D ; G 1977 -U 8606 ; WX 602 ; N uni219E ; G 1978 -U 8607 ; WX 602 ; N uni219F ; G 1979 -U 8608 ; WX 602 ; N uni21A0 ; G 1980 -U 8609 ; WX 602 ; N uni21A1 ; G 1981 -U 8610 ; WX 602 ; N uni21A2 ; G 1982 -U 8611 ; WX 602 ; N uni21A3 ; G 1983 -U 8612 ; WX 602 ; N uni21A4 ; G 1984 -U 8613 ; WX 602 ; N uni21A5 ; G 1985 -U 8614 ; WX 602 ; N uni21A6 ; G 1986 -U 8615 ; WX 602 ; N uni21A7 ; G 1987 -U 8616 ; WX 602 ; N arrowupdnbse ; G 1988 -U 8617 ; WX 602 ; N uni21A9 ; G 1989 -U 8618 ; WX 602 ; N uni21AA ; G 1990 -U 8619 ; WX 602 ; N uni21AB ; G 1991 -U 8620 ; WX 602 ; N uni21AC ; G 1992 -U 8621 ; WX 602 ; N uni21AD ; G 1993 -U 8622 ; WX 602 ; N uni21AE ; G 1994 -U 8623 ; WX 602 ; N uni21AF ; G 1995 -U 8624 ; WX 602 ; N uni21B0 ; G 1996 -U 8625 ; WX 602 ; N uni21B1 ; G 1997 -U 8626 ; WX 602 ; N uni21B2 ; G 1998 -U 8627 ; WX 602 ; N uni21B3 ; G 1999 -U 8628 ; WX 602 ; N uni21B4 ; G 2000 -U 8629 ; WX 602 ; N carriagereturn ; G 2001 -U 8630 ; WX 602 ; N uni21B6 ; G 2002 -U 8631 ; WX 602 ; N uni21B7 ; G 2003 -U 8632 ; WX 602 ; N uni21B8 ; G 2004 -U 8633 ; WX 602 ; N uni21B9 ; G 2005 -U 8634 ; WX 602 ; N uni21BA ; G 2006 -U 8635 ; WX 602 ; N uni21BB ; G 2007 -U 8636 ; WX 602 ; N uni21BC ; G 2008 -U 8637 ; WX 602 ; N uni21BD ; G 2009 -U 8638 ; WX 602 ; N uni21BE ; G 2010 -U 8639 ; WX 602 ; N uni21BF ; G 2011 -U 8640 ; WX 602 ; N uni21C0 ; G 2012 -U 8641 ; WX 602 ; N uni21C1 ; G 2013 -U 8642 ; WX 602 ; N uni21C2 ; G 2014 -U 8643 ; WX 602 ; N uni21C3 ; G 2015 -U 8644 ; WX 602 ; N uni21C4 ; G 2016 -U 8645 ; WX 602 ; N uni21C5 ; G 2017 -U 8646 ; WX 602 ; N uni21C6 ; G 2018 -U 8647 ; WX 602 ; N uni21C7 ; G 2019 -U 8648 ; WX 602 ; N uni21C8 ; G 2020 -U 8649 ; WX 602 ; N uni21C9 ; G 2021 -U 8650 ; WX 602 ; N uni21CA ; G 2022 -U 8651 ; WX 602 ; N uni21CB ; G 2023 -U 8652 ; WX 602 ; N uni21CC ; G 2024 -U 8653 ; WX 602 ; N uni21CD ; G 2025 -U 8654 ; WX 602 ; N uni21CE ; G 2026 -U 8655 ; WX 602 ; N uni21CF ; G 2027 -U 8656 ; WX 602 ; N arrowdblleft ; G 2028 -U 8657 ; WX 602 ; N arrowdblup ; G 2029 -U 8658 ; WX 602 ; N arrowdblright ; G 2030 -U 8659 ; WX 602 ; N arrowdbldown ; G 2031 -U 8660 ; WX 602 ; N arrowdblboth ; G 2032 -U 8661 ; WX 602 ; N uni21D5 ; G 2033 -U 8662 ; WX 602 ; N uni21D6 ; G 2034 -U 8663 ; WX 602 ; N uni21D7 ; G 2035 -U 8664 ; WX 602 ; N uni21D8 ; G 2036 -U 8665 ; WX 602 ; N uni21D9 ; G 2037 -U 8666 ; WX 602 ; N uni21DA ; G 2038 -U 8667 ; WX 602 ; N uni21DB ; G 2039 -U 8668 ; WX 602 ; N uni21DC ; G 2040 -U 8669 ; WX 602 ; N uni21DD ; G 2041 -U 8670 ; WX 602 ; N uni21DE ; G 2042 -U 8671 ; WX 602 ; N uni21DF ; G 2043 -U 8672 ; WX 602 ; N uni21E0 ; G 2044 -U 8673 ; WX 602 ; N uni21E1 ; G 2045 -U 8674 ; WX 602 ; N uni21E2 ; G 2046 -U 8675 ; WX 602 ; N uni21E3 ; G 2047 -U 8676 ; WX 602 ; N uni21E4 ; G 2048 -U 8677 ; WX 602 ; N uni21E5 ; G 2049 -U 8678 ; WX 602 ; N uni21E6 ; G 2050 -U 8679 ; WX 602 ; N uni21E7 ; G 2051 -U 8680 ; WX 602 ; N uni21E8 ; G 2052 -U 8681 ; WX 602 ; N uni21E9 ; G 2053 -U 8682 ; WX 602 ; N uni21EA ; G 2054 -U 8683 ; WX 602 ; N uni21EB ; G 2055 -U 8684 ; WX 602 ; N uni21EC ; G 2056 -U 8685 ; WX 602 ; N uni21ED ; G 2057 -U 8686 ; WX 602 ; N uni21EE ; G 2058 -U 8687 ; WX 602 ; N uni21EF ; G 2059 -U 8688 ; WX 602 ; N uni21F0 ; G 2060 -U 8689 ; WX 602 ; N uni21F1 ; G 2061 -U 8690 ; WX 602 ; N uni21F2 ; G 2062 -U 8691 ; WX 602 ; N uni21F3 ; G 2063 -U 8692 ; WX 602 ; N uni21F4 ; G 2064 -U 8693 ; WX 602 ; N uni21F5 ; G 2065 -U 8694 ; WX 602 ; N uni21F6 ; G 2066 -U 8695 ; WX 602 ; N uni21F7 ; G 2067 -U 8696 ; WX 602 ; N uni21F8 ; G 2068 -U 8697 ; WX 602 ; N uni21F9 ; G 2069 -U 8698 ; WX 602 ; N uni21FA ; G 2070 -U 8699 ; WX 602 ; N uni21FB ; G 2071 -U 8700 ; WX 602 ; N uni21FC ; G 2072 -U 8701 ; WX 602 ; N uni21FD ; G 2073 -U 8702 ; WX 602 ; N uni21FE ; G 2074 -U 8703 ; WX 602 ; N uni21FF ; G 2075 -U 8704 ; WX 602 ; N universal ; G 2076 -U 8705 ; WX 602 ; N uni2201 ; G 2077 -U 8706 ; WX 602 ; N partialdiff ; G 2078 -U 8707 ; WX 602 ; N existential ; G 2079 -U 8708 ; WX 602 ; N uni2204 ; G 2080 -U 8709 ; WX 602 ; N emptyset ; G 2081 -U 8710 ; WX 602 ; N increment ; G 2082 -U 8711 ; WX 602 ; N gradient ; G 2083 -U 8712 ; WX 602 ; N element ; G 2084 -U 8713 ; WX 602 ; N notelement ; G 2085 -U 8714 ; WX 602 ; N uni220A ; G 2086 -U 8715 ; WX 602 ; N suchthat ; G 2087 -U 8716 ; WX 602 ; N uni220C ; G 2088 -U 8717 ; WX 602 ; N uni220D ; G 2089 -U 8718 ; WX 602 ; N uni220E ; G 2090 -U 8719 ; WX 602 ; N product ; G 2091 -U 8720 ; WX 602 ; N uni2210 ; G 2092 -U 8721 ; WX 602 ; N summation ; G 2093 -U 8722 ; WX 602 ; N minus ; G 2094 -U 8723 ; WX 602 ; N uni2213 ; G 2095 -U 8725 ; WX 602 ; N uni2215 ; G 2096 -U 8727 ; WX 602 ; N asteriskmath ; G 2097 -U 8728 ; WX 602 ; N uni2218 ; G 2098 -U 8729 ; WX 602 ; N uni2219 ; G 2099 -U 8730 ; WX 602 ; N radical ; G 2100 -U 8731 ; WX 602 ; N uni221B ; G 2101 -U 8732 ; WX 602 ; N uni221C ; G 2102 -U 8733 ; WX 602 ; N proportional ; G 2103 -U 8734 ; WX 602 ; N infinity ; G 2104 -U 8735 ; WX 602 ; N orthogonal ; G 2105 -U 8736 ; WX 602 ; N angle ; G 2106 -U 8739 ; WX 602 ; N uni2223 ; G 2107 -U 8743 ; WX 602 ; N logicaland ; G 2108 -U 8744 ; WX 602 ; N logicalor ; G 2109 -U 8745 ; WX 602 ; N intersection ; G 2110 -U 8746 ; WX 602 ; N union ; G 2111 -U 8747 ; WX 602 ; N integral ; G 2112 -U 8748 ; WX 602 ; N uni222C ; G 2113 -U 8749 ; WX 602 ; N uni222D ; G 2114 -U 8756 ; WX 602 ; N therefore ; G 2115 -U 8757 ; WX 602 ; N uni2235 ; G 2116 -U 8758 ; WX 602 ; N uni2236 ; G 2117 -U 8759 ; WX 602 ; N uni2237 ; G 2118 -U 8760 ; WX 602 ; N uni2238 ; G 2119 -U 8761 ; WX 602 ; N uni2239 ; G 2120 -U 8762 ; WX 602 ; N uni223A ; G 2121 -U 8763 ; WX 602 ; N uni223B ; G 2122 -U 8764 ; WX 602 ; N similar ; G 2123 -U 8765 ; WX 602 ; N uni223D ; G 2124 -U 8769 ; WX 602 ; N uni2241 ; G 2125 -U 8770 ; WX 602 ; N uni2242 ; G 2126 -U 8771 ; WX 602 ; N uni2243 ; G 2127 -U 8772 ; WX 602 ; N uni2244 ; G 2128 -U 8773 ; WX 602 ; N congruent ; G 2129 -U 8774 ; WX 602 ; N uni2246 ; G 2130 -U 8775 ; WX 602 ; N uni2247 ; G 2131 -U 8776 ; WX 602 ; N approxequal ; G 2132 -U 8777 ; WX 602 ; N uni2249 ; G 2133 -U 8778 ; WX 602 ; N uni224A ; G 2134 -U 8779 ; WX 602 ; N uni224B ; G 2135 -U 8780 ; WX 602 ; N uni224C ; G 2136 -U 8781 ; WX 602 ; N uni224D ; G 2137 -U 8782 ; WX 602 ; N uni224E ; G 2138 -U 8783 ; WX 602 ; N uni224F ; G 2139 -U 8784 ; WX 602 ; N uni2250 ; G 2140 -U 8785 ; WX 602 ; N uni2251 ; G 2141 -U 8786 ; WX 602 ; N uni2252 ; G 2142 -U 8787 ; WX 602 ; N uni2253 ; G 2143 -U 8788 ; WX 602 ; N uni2254 ; G 2144 -U 8789 ; WX 602 ; N uni2255 ; G 2145 -U 8790 ; WX 602 ; N uni2256 ; G 2146 -U 8791 ; WX 602 ; N uni2257 ; G 2147 -U 8792 ; WX 602 ; N uni2258 ; G 2148 -U 8793 ; WX 602 ; N uni2259 ; G 2149 -U 8794 ; WX 602 ; N uni225A ; G 2150 -U 8795 ; WX 602 ; N uni225B ; G 2151 -U 8796 ; WX 602 ; N uni225C ; G 2152 -U 8797 ; WX 602 ; N uni225D ; G 2153 -U 8798 ; WX 602 ; N uni225E ; G 2154 -U 8799 ; WX 602 ; N uni225F ; G 2155 -U 8800 ; WX 602 ; N notequal ; G 2156 -U 8801 ; WX 602 ; N equivalence ; G 2157 -U 8802 ; WX 602 ; N uni2262 ; G 2158 -U 8803 ; WX 602 ; N uni2263 ; G 2159 -U 8804 ; WX 602 ; N lessequal ; G 2160 -U 8805 ; WX 602 ; N greaterequal ; G 2161 -U 8806 ; WX 602 ; N uni2266 ; G 2162 -U 8807 ; WX 602 ; N uni2267 ; G 2163 -U 8808 ; WX 602 ; N uni2268 ; G 2164 -U 8809 ; WX 602 ; N uni2269 ; G 2165 -U 8813 ; WX 602 ; N uni226D ; G 2166 -U 8814 ; WX 602 ; N uni226E ; G 2167 -U 8815 ; WX 602 ; N uni226F ; G 2168 -U 8816 ; WX 602 ; N uni2270 ; G 2169 -U 8817 ; WX 602 ; N uni2271 ; G 2170 -U 8818 ; WX 602 ; N uni2272 ; G 2171 -U 8819 ; WX 602 ; N uni2273 ; G 2172 -U 8820 ; WX 602 ; N uni2274 ; G 2173 -U 8821 ; WX 602 ; N uni2275 ; G 2174 -U 8822 ; WX 602 ; N uni2276 ; G 2175 -U 8823 ; WX 602 ; N uni2277 ; G 2176 -U 8824 ; WX 602 ; N uni2278 ; G 2177 -U 8825 ; WX 602 ; N uni2279 ; G 2178 -U 8826 ; WX 602 ; N uni227A ; G 2179 -U 8827 ; WX 602 ; N uni227B ; G 2180 -U 8828 ; WX 602 ; N uni227C ; G 2181 -U 8829 ; WX 602 ; N uni227D ; G 2182 -U 8830 ; WX 602 ; N uni227E ; G 2183 -U 8831 ; WX 602 ; N uni227F ; G 2184 -U 8832 ; WX 602 ; N uni2280 ; G 2185 -U 8833 ; WX 602 ; N uni2281 ; G 2186 -U 8834 ; WX 602 ; N propersubset ; G 2187 -U 8835 ; WX 602 ; N propersuperset ; G 2188 -U 8836 ; WX 602 ; N notsubset ; G 2189 -U 8837 ; WX 602 ; N uni2285 ; G 2190 -U 8838 ; WX 602 ; N reflexsubset ; G 2191 -U 8839 ; WX 602 ; N reflexsuperset ; G 2192 -U 8840 ; WX 602 ; N uni2288 ; G 2193 -U 8841 ; WX 602 ; N uni2289 ; G 2194 -U 8842 ; WX 602 ; N uni228A ; G 2195 -U 8843 ; WX 602 ; N uni228B ; G 2196 -U 8845 ; WX 602 ; N uni228D ; G 2197 -U 8846 ; WX 602 ; N uni228E ; G 2198 -U 8847 ; WX 602 ; N uni228F ; G 2199 -U 8848 ; WX 602 ; N uni2290 ; G 2200 -U 8849 ; WX 602 ; N uni2291 ; G 2201 -U 8850 ; WX 602 ; N uni2292 ; G 2202 -U 8851 ; WX 602 ; N uni2293 ; G 2203 -U 8852 ; WX 602 ; N uni2294 ; G 2204 -U 8853 ; WX 602 ; N circleplus ; G 2205 -U 8854 ; WX 602 ; N uni2296 ; G 2206 -U 8855 ; WX 602 ; N circlemultiply ; G 2207 -U 8856 ; WX 602 ; N uni2298 ; G 2208 -U 8857 ; WX 602 ; N uni2299 ; G 2209 -U 8858 ; WX 602 ; N uni229A ; G 2210 -U 8859 ; WX 602 ; N uni229B ; G 2211 -U 8860 ; WX 602 ; N uni229C ; G 2212 -U 8861 ; WX 602 ; N uni229D ; G 2213 -U 8862 ; WX 602 ; N uni229E ; G 2214 -U 8863 ; WX 602 ; N uni229F ; G 2215 -U 8864 ; WX 602 ; N uni22A0 ; G 2216 -U 8865 ; WX 602 ; N uni22A1 ; G 2217 -U 8866 ; WX 602 ; N uni22A2 ; G 2218 -U 8867 ; WX 602 ; N uni22A3 ; G 2219 -U 8868 ; WX 602 ; N uni22A4 ; G 2220 -U 8869 ; WX 602 ; N perpendicular ; G 2221 -U 8882 ; WX 602 ; N uni22B2 ; G 2222 -U 8883 ; WX 602 ; N uni22B3 ; G 2223 -U 8884 ; WX 602 ; N uni22B4 ; G 2224 -U 8885 ; WX 602 ; N uni22B5 ; G 2225 -U 8888 ; WX 602 ; N uni22B8 ; G 2226 -U 8898 ; WX 602 ; N uni22C2 ; G 2227 -U 8899 ; WX 602 ; N uni22C3 ; G 2228 -U 8900 ; WX 602 ; N uni22C4 ; G 2229 -U 8901 ; WX 602 ; N dotmath ; G 2230 -U 8902 ; WX 602 ; N uni22C6 ; G 2231 -U 8909 ; WX 602 ; N uni22CD ; G 2232 -U 8910 ; WX 602 ; N uni22CE ; G 2233 -U 8911 ; WX 602 ; N uni22CF ; G 2234 -U 8912 ; WX 602 ; N uni22D0 ; G 2235 -U 8913 ; WX 602 ; N uni22D1 ; G 2236 -U 8922 ; WX 602 ; N uni22DA ; G 2237 -U 8923 ; WX 602 ; N uni22DB ; G 2238 -U 8924 ; WX 602 ; N uni22DC ; G 2239 -U 8925 ; WX 602 ; N uni22DD ; G 2240 -U 8926 ; WX 602 ; N uni22DE ; G 2241 -U 8927 ; WX 602 ; N uni22DF ; G 2242 -U 8928 ; WX 602 ; N uni22E0 ; G 2243 -U 8929 ; WX 602 ; N uni22E1 ; G 2244 -U 8930 ; WX 602 ; N uni22E2 ; G 2245 -U 8931 ; WX 602 ; N uni22E3 ; G 2246 -U 8932 ; WX 602 ; N uni22E4 ; G 2247 -U 8933 ; WX 602 ; N uni22E5 ; G 2248 -U 8934 ; WX 602 ; N uni22E6 ; G 2249 -U 8935 ; WX 602 ; N uni22E7 ; G 2250 -U 8936 ; WX 602 ; N uni22E8 ; G 2251 -U 8937 ; WX 602 ; N uni22E9 ; G 2252 -U 8943 ; WX 602 ; N uni22EF ; G 2253 -U 8960 ; WX 602 ; N uni2300 ; G 2254 -U 8961 ; WX 602 ; N uni2301 ; G 2255 -U 8962 ; WX 602 ; N house ; G 2256 -U 8963 ; WX 602 ; N uni2303 ; G 2257 -U 8964 ; WX 602 ; N uni2304 ; G 2258 -U 8965 ; WX 602 ; N uni2305 ; G 2259 -U 8966 ; WX 602 ; N uni2306 ; G 2260 -U 8968 ; WX 602 ; N uni2308 ; G 2261 -U 8969 ; WX 602 ; N uni2309 ; G 2262 -U 8970 ; WX 602 ; N uni230A ; G 2263 -U 8971 ; WX 602 ; N uni230B ; G 2264 -U 8972 ; WX 602 ; N uni230C ; G 2265 -U 8973 ; WX 602 ; N uni230D ; G 2266 -U 8974 ; WX 602 ; N uni230E ; G 2267 -U 8975 ; WX 602 ; N uni230F ; G 2268 -U 8976 ; WX 602 ; N revlogicalnot ; G 2269 -U 8977 ; WX 602 ; N uni2311 ; G 2270 -U 8978 ; WX 602 ; N uni2312 ; G 2271 -U 8979 ; WX 602 ; N uni2313 ; G 2272 -U 8980 ; WX 602 ; N uni2314 ; G 2273 -U 8981 ; WX 602 ; N uni2315 ; G 2274 -U 8984 ; WX 602 ; N uni2318 ; G 2275 -U 8985 ; WX 602 ; N uni2319 ; G 2276 -U 8988 ; WX 602 ; N uni231C ; G 2277 -U 8989 ; WX 602 ; N uni231D ; G 2278 -U 8990 ; WX 602 ; N uni231E ; G 2279 -U 8991 ; WX 602 ; N uni231F ; G 2280 -U 8992 ; WX 602 ; N integraltp ; G 2281 -U 8993 ; WX 602 ; N integralbt ; G 2282 -U 8997 ; WX 602 ; N uni2325 ; G 2283 -U 8998 ; WX 602 ; N uni2326 ; G 2284 -U 8999 ; WX 602 ; N uni2327 ; G 2285 -U 9000 ; WX 602 ; N uni2328 ; G 2286 -U 9003 ; WX 602 ; N uni232B ; G 2287 -U 9013 ; WX 602 ; N uni2335 ; G 2288 -U 9014 ; WX 602 ; N uni2336 ; G 2289 -U 9015 ; WX 602 ; N uni2337 ; G 2290 -U 9016 ; WX 602 ; N uni2338 ; G 2291 -U 9017 ; WX 602 ; N uni2339 ; G 2292 -U 9018 ; WX 602 ; N uni233A ; G 2293 -U 9019 ; WX 602 ; N uni233B ; G 2294 -U 9020 ; WX 602 ; N uni233C ; G 2295 -U 9021 ; WX 602 ; N uni233D ; G 2296 -U 9022 ; WX 602 ; N uni233E ; G 2297 -U 9023 ; WX 602 ; N uni233F ; G 2298 -U 9024 ; WX 602 ; N uni2340 ; G 2299 -U 9025 ; WX 602 ; N uni2341 ; G 2300 -U 9026 ; WX 602 ; N uni2342 ; G 2301 -U 9027 ; WX 602 ; N uni2343 ; G 2302 -U 9028 ; WX 602 ; N uni2344 ; G 2303 -U 9029 ; WX 602 ; N uni2345 ; G 2304 -U 9030 ; WX 602 ; N uni2346 ; G 2305 -U 9031 ; WX 602 ; N uni2347 ; G 2306 -U 9032 ; WX 602 ; N uni2348 ; G 2307 -U 9033 ; WX 602 ; N uni2349 ; G 2308 -U 9034 ; WX 602 ; N uni234A ; G 2309 -U 9035 ; WX 602 ; N uni234B ; G 2310 -U 9036 ; WX 602 ; N uni234C ; G 2311 -U 9037 ; WX 602 ; N uni234D ; G 2312 -U 9038 ; WX 602 ; N uni234E ; G 2313 -U 9039 ; WX 602 ; N uni234F ; G 2314 -U 9040 ; WX 602 ; N uni2350 ; G 2315 -U 9041 ; WX 602 ; N uni2351 ; G 2316 -U 9042 ; WX 602 ; N uni2352 ; G 2317 -U 9043 ; WX 602 ; N uni2353 ; G 2318 -U 9044 ; WX 602 ; N uni2354 ; G 2319 -U 9045 ; WX 602 ; N uni2355 ; G 2320 -U 9046 ; WX 602 ; N uni2356 ; G 2321 -U 9047 ; WX 602 ; N uni2357 ; G 2322 -U 9048 ; WX 602 ; N uni2358 ; G 2323 -U 9049 ; WX 602 ; N uni2359 ; G 2324 -U 9050 ; WX 602 ; N uni235A ; G 2325 -U 9051 ; WX 602 ; N uni235B ; G 2326 -U 9052 ; WX 602 ; N uni235C ; G 2327 -U 9053 ; WX 602 ; N uni235D ; G 2328 -U 9054 ; WX 602 ; N uni235E ; G 2329 -U 9055 ; WX 602 ; N uni235F ; G 2330 -U 9056 ; WX 602 ; N uni2360 ; G 2331 -U 9057 ; WX 602 ; N uni2361 ; G 2332 -U 9058 ; WX 602 ; N uni2362 ; G 2333 -U 9059 ; WX 602 ; N uni2363 ; G 2334 -U 9060 ; WX 602 ; N uni2364 ; G 2335 -U 9061 ; WX 602 ; N uni2365 ; G 2336 -U 9062 ; WX 602 ; N uni2366 ; G 2337 -U 9063 ; WX 602 ; N uni2367 ; G 2338 -U 9064 ; WX 602 ; N uni2368 ; G 2339 -U 9065 ; WX 602 ; N uni2369 ; G 2340 -U 9066 ; WX 602 ; N uni236A ; G 2341 -U 9067 ; WX 602 ; N uni236B ; G 2342 -U 9068 ; WX 602 ; N uni236C ; G 2343 -U 9069 ; WX 602 ; N uni236D ; G 2344 -U 9070 ; WX 602 ; N uni236E ; G 2345 -U 9071 ; WX 602 ; N uni236F ; G 2346 -U 9072 ; WX 602 ; N uni2370 ; G 2347 -U 9073 ; WX 602 ; N uni2371 ; G 2348 -U 9074 ; WX 602 ; N uni2372 ; G 2349 -U 9075 ; WX 602 ; N uni2373 ; G 2350 -U 9076 ; WX 602 ; N uni2374 ; G 2351 -U 9077 ; WX 602 ; N uni2375 ; G 2352 -U 9078 ; WX 602 ; N uni2376 ; G 2353 -U 9079 ; WX 602 ; N uni2377 ; G 2354 -U 9080 ; WX 602 ; N uni2378 ; G 2355 -U 9081 ; WX 602 ; N uni2379 ; G 2356 -U 9082 ; WX 602 ; N uni237A ; G 2357 -U 9085 ; WX 602 ; N uni237D ; G 2358 -U 9088 ; WX 602 ; N uni2380 ; G 2359 -U 9089 ; WX 602 ; N uni2381 ; G 2360 -U 9090 ; WX 602 ; N uni2382 ; G 2361 -U 9091 ; WX 602 ; N uni2383 ; G 2362 -U 9096 ; WX 602 ; N uni2388 ; G 2363 -U 9097 ; WX 602 ; N uni2389 ; G 2364 -U 9098 ; WX 602 ; N uni238A ; G 2365 -U 9099 ; WX 602 ; N uni238B ; G 2366 -U 9109 ; WX 602 ; N uni2395 ; G 2367 -U 9115 ; WX 602 ; N uni239B ; G 2368 -U 9116 ; WX 602 ; N uni239C ; G 2369 -U 9117 ; WX 602 ; N uni239D ; G 2370 -U 9118 ; WX 602 ; N uni239E ; G 2371 -U 9119 ; WX 602 ; N uni239F ; G 2372 -U 9120 ; WX 602 ; N uni23A0 ; G 2373 -U 9121 ; WX 602 ; N uni23A1 ; G 2374 -U 9122 ; WX 602 ; N uni23A2 ; G 2375 -U 9123 ; WX 602 ; N uni23A3 ; G 2376 -U 9124 ; WX 602 ; N uni23A4 ; G 2377 -U 9125 ; WX 602 ; N uni23A5 ; G 2378 -U 9126 ; WX 602 ; N uni23A6 ; G 2379 -U 9127 ; WX 602 ; N uni23A7 ; G 2380 -U 9128 ; WX 602 ; N uni23A8 ; G 2381 -U 9129 ; WX 602 ; N uni23A9 ; G 2382 -U 9130 ; WX 602 ; N uni23AA ; G 2383 -U 9131 ; WX 602 ; N uni23AB ; G 2384 -U 9132 ; WX 602 ; N uni23AC ; G 2385 -U 9133 ; WX 602 ; N uni23AD ; G 2386 -U 9134 ; WX 602 ; N uni23AE ; G 2387 -U 9166 ; WX 602 ; N uni23CE ; G 2388 -U 9167 ; WX 602 ; N uni23CF ; G 2389 -U 9251 ; WX 602 ; N uni2423 ; G 2390 -U 9472 ; WX 602 ; N SF100000 ; G 2391 -U 9473 ; WX 602 ; N uni2501 ; G 2392 -U 9474 ; WX 602 ; N SF110000 ; G 2393 -U 9475 ; WX 602 ; N uni2503 ; G 2394 -U 9476 ; WX 602 ; N uni2504 ; G 2395 -U 9477 ; WX 602 ; N uni2505 ; G 2396 -U 9478 ; WX 602 ; N uni2506 ; G 2397 -U 9479 ; WX 602 ; N uni2507 ; G 2398 -U 9480 ; WX 602 ; N uni2508 ; G 2399 -U 9481 ; WX 602 ; N uni2509 ; G 2400 -U 9482 ; WX 602 ; N uni250A ; G 2401 -U 9483 ; WX 602 ; N uni250B ; G 2402 -U 9484 ; WX 602 ; N SF010000 ; G 2403 -U 9485 ; WX 602 ; N uni250D ; G 2404 -U 9486 ; WX 602 ; N uni250E ; G 2405 -U 9487 ; WX 602 ; N uni250F ; G 2406 -U 9488 ; WX 602 ; N SF030000 ; G 2407 -U 9489 ; WX 602 ; N uni2511 ; G 2408 -U 9490 ; WX 602 ; N uni2512 ; G 2409 -U 9491 ; WX 602 ; N uni2513 ; G 2410 -U 9492 ; WX 602 ; N SF020000 ; G 2411 -U 9493 ; WX 602 ; N uni2515 ; G 2412 -U 9494 ; WX 602 ; N uni2516 ; G 2413 -U 9495 ; WX 602 ; N uni2517 ; G 2414 -U 9496 ; WX 602 ; N SF040000 ; G 2415 -U 9497 ; WX 602 ; N uni2519 ; G 2416 -U 9498 ; WX 602 ; N uni251A ; G 2417 -U 9499 ; WX 602 ; N uni251B ; G 2418 -U 9500 ; WX 602 ; N SF080000 ; G 2419 -U 9501 ; WX 602 ; N uni251D ; G 2420 -U 9502 ; WX 602 ; N uni251E ; G 2421 -U 9503 ; WX 602 ; N uni251F ; G 2422 -U 9504 ; WX 602 ; N uni2520 ; G 2423 -U 9505 ; WX 602 ; N uni2521 ; G 2424 -U 9506 ; WX 602 ; N uni2522 ; G 2425 -U 9507 ; WX 602 ; N uni2523 ; G 2426 -U 9508 ; WX 602 ; N SF090000 ; G 2427 -U 9509 ; WX 602 ; N uni2525 ; G 2428 -U 9510 ; WX 602 ; N uni2526 ; G 2429 -U 9511 ; WX 602 ; N uni2527 ; G 2430 -U 9512 ; WX 602 ; N uni2528 ; G 2431 -U 9513 ; WX 602 ; N uni2529 ; G 2432 -U 9514 ; WX 602 ; N uni252A ; G 2433 -U 9515 ; WX 602 ; N uni252B ; G 2434 -U 9516 ; WX 602 ; N SF060000 ; G 2435 -U 9517 ; WX 602 ; N uni252D ; G 2436 -U 9518 ; WX 602 ; N uni252E ; G 2437 -U 9519 ; WX 602 ; N uni252F ; G 2438 -U 9520 ; WX 602 ; N uni2530 ; G 2439 -U 9521 ; WX 602 ; N uni2531 ; G 2440 -U 9522 ; WX 602 ; N uni2532 ; G 2441 -U 9523 ; WX 602 ; N uni2533 ; G 2442 -U 9524 ; WX 602 ; N SF070000 ; G 2443 -U 9525 ; WX 602 ; N uni2535 ; G 2444 -U 9526 ; WX 602 ; N uni2536 ; G 2445 -U 9527 ; WX 602 ; N uni2537 ; G 2446 -U 9528 ; WX 602 ; N uni2538 ; G 2447 -U 9529 ; WX 602 ; N uni2539 ; G 2448 -U 9530 ; WX 602 ; N uni253A ; G 2449 -U 9531 ; WX 602 ; N uni253B ; G 2450 -U 9532 ; WX 602 ; N SF050000 ; G 2451 -U 9533 ; WX 602 ; N uni253D ; G 2452 -U 9534 ; WX 602 ; N uni253E ; G 2453 -U 9535 ; WX 602 ; N uni253F ; G 2454 -U 9536 ; WX 602 ; N uni2540 ; G 2455 -U 9537 ; WX 602 ; N uni2541 ; G 2456 -U 9538 ; WX 602 ; N uni2542 ; G 2457 -U 9539 ; WX 602 ; N uni2543 ; G 2458 -U 9540 ; WX 602 ; N uni2544 ; G 2459 -U 9541 ; WX 602 ; N uni2545 ; G 2460 -U 9542 ; WX 602 ; N uni2546 ; G 2461 -U 9543 ; WX 602 ; N uni2547 ; G 2462 -U 9544 ; WX 602 ; N uni2548 ; G 2463 -U 9545 ; WX 602 ; N uni2549 ; G 2464 -U 9546 ; WX 602 ; N uni254A ; G 2465 -U 9547 ; WX 602 ; N uni254B ; G 2466 -U 9548 ; WX 602 ; N uni254C ; G 2467 -U 9549 ; WX 602 ; N uni254D ; G 2468 -U 9550 ; WX 602 ; N uni254E ; G 2469 -U 9551 ; WX 602 ; N uni254F ; G 2470 -U 9552 ; WX 602 ; N SF430000 ; G 2471 -U 9553 ; WX 602 ; N SF240000 ; G 2472 -U 9554 ; WX 602 ; N SF510000 ; G 2473 -U 9555 ; WX 602 ; N SF520000 ; G 2474 -U 9556 ; WX 602 ; N SF390000 ; G 2475 -U 9557 ; WX 602 ; N SF220000 ; G 2476 -U 9558 ; WX 602 ; N SF210000 ; G 2477 -U 9559 ; WX 602 ; N SF250000 ; G 2478 -U 9560 ; WX 602 ; N SF500000 ; G 2479 -U 9561 ; WX 602 ; N SF490000 ; G 2480 -U 9562 ; WX 602 ; N SF380000 ; G 2481 -U 9563 ; WX 602 ; N SF280000 ; G 2482 -U 9564 ; WX 602 ; N SF270000 ; G 2483 -U 9565 ; WX 602 ; N SF260000 ; G 2484 -U 9566 ; WX 602 ; N SF360000 ; G 2485 -U 9567 ; WX 602 ; N SF370000 ; G 2486 -U 9568 ; WX 602 ; N SF420000 ; G 2487 -U 9569 ; WX 602 ; N SF190000 ; G 2488 -U 9570 ; WX 602 ; N SF200000 ; G 2489 -U 9571 ; WX 602 ; N SF230000 ; G 2490 -U 9572 ; WX 602 ; N SF470000 ; G 2491 -U 9573 ; WX 602 ; N SF480000 ; G 2492 -U 9574 ; WX 602 ; N SF410000 ; G 2493 -U 9575 ; WX 602 ; N SF450000 ; G 2494 -U 9576 ; WX 602 ; N SF460000 ; G 2495 -U 9577 ; WX 602 ; N SF400000 ; G 2496 -U 9578 ; WX 602 ; N SF540000 ; G 2497 -U 9579 ; WX 602 ; N SF530000 ; G 2498 -U 9580 ; WX 602 ; N SF440000 ; G 2499 -U 9581 ; WX 602 ; N uni256D ; G 2500 -U 9582 ; WX 602 ; N uni256E ; G 2501 -U 9583 ; WX 602 ; N uni256F ; G 2502 -U 9584 ; WX 602 ; N uni2570 ; G 2503 -U 9585 ; WX 602 ; N uni2571 ; G 2504 -U 9586 ; WX 602 ; N uni2572 ; G 2505 -U 9587 ; WX 602 ; N uni2573 ; G 2506 -U 9588 ; WX 602 ; N uni2574 ; G 2507 -U 9589 ; WX 602 ; N uni2575 ; G 2508 -U 9590 ; WX 602 ; N uni2576 ; G 2509 -U 9591 ; WX 602 ; N uni2577 ; G 2510 -U 9592 ; WX 602 ; N uni2578 ; G 2511 -U 9593 ; WX 602 ; N uni2579 ; G 2512 -U 9594 ; WX 602 ; N uni257A ; G 2513 -U 9595 ; WX 602 ; N uni257B ; G 2514 -U 9596 ; WX 602 ; N uni257C ; G 2515 -U 9597 ; WX 602 ; N uni257D ; G 2516 -U 9598 ; WX 602 ; N uni257E ; G 2517 -U 9599 ; WX 602 ; N uni257F ; G 2518 -U 9600 ; WX 602 ; N upblock ; G 2519 -U 9601 ; WX 602 ; N uni2581 ; G 2520 -U 9602 ; WX 602 ; N uni2582 ; G 2521 -U 9603 ; WX 602 ; N uni2583 ; G 2522 -U 9604 ; WX 602 ; N dnblock ; G 2523 -U 9605 ; WX 602 ; N uni2585 ; G 2524 -U 9606 ; WX 602 ; N uni2586 ; G 2525 -U 9607 ; WX 602 ; N uni2587 ; G 2526 -U 9608 ; WX 602 ; N block ; G 2527 -U 9609 ; WX 602 ; N uni2589 ; G 2528 -U 9610 ; WX 602 ; N uni258A ; G 2529 -U 9611 ; WX 602 ; N uni258B ; G 2530 -U 9612 ; WX 602 ; N lfblock ; G 2531 -U 9613 ; WX 602 ; N uni258D ; G 2532 -U 9614 ; WX 602 ; N uni258E ; G 2533 -U 9615 ; WX 602 ; N uni258F ; G 2534 -U 9616 ; WX 602 ; N rtblock ; G 2535 -U 9617 ; WX 602 ; N ltshade ; G 2536 -U 9618 ; WX 602 ; N shade ; G 2537 -U 9619 ; WX 602 ; N dkshade ; G 2538 -U 9620 ; WX 602 ; N uni2594 ; G 2539 -U 9621 ; WX 602 ; N uni2595 ; G 2540 -U 9622 ; WX 602 ; N uni2596 ; G 2541 -U 9623 ; WX 602 ; N uni2597 ; G 2542 -U 9624 ; WX 602 ; N uni2598 ; G 2543 -U 9625 ; WX 602 ; N uni2599 ; G 2544 -U 9626 ; WX 602 ; N uni259A ; G 2545 -U 9627 ; WX 602 ; N uni259B ; G 2546 -U 9628 ; WX 602 ; N uni259C ; G 2547 -U 9629 ; WX 602 ; N uni259D ; G 2548 -U 9630 ; WX 602 ; N uni259E ; G 2549 -U 9631 ; WX 602 ; N uni259F ; G 2550 -U 9632 ; WX 602 ; N filledbox ; G 2551 -U 9633 ; WX 602 ; N H22073 ; G 2552 -U 9634 ; WX 602 ; N uni25A2 ; G 2553 -U 9635 ; WX 602 ; N uni25A3 ; G 2554 -U 9636 ; WX 602 ; N uni25A4 ; G 2555 -U 9637 ; WX 602 ; N uni25A5 ; G 2556 -U 9638 ; WX 602 ; N uni25A6 ; G 2557 -U 9639 ; WX 602 ; N uni25A7 ; G 2558 -U 9640 ; WX 602 ; N uni25A8 ; G 2559 -U 9641 ; WX 602 ; N uni25A9 ; G 2560 -U 9642 ; WX 602 ; N H18543 ; G 2561 -U 9643 ; WX 602 ; N H18551 ; G 2562 -U 9644 ; WX 602 ; N filledrect ; G 2563 -U 9645 ; WX 602 ; N uni25AD ; G 2564 -U 9646 ; WX 602 ; N uni25AE ; G 2565 -U 9647 ; WX 602 ; N uni25AF ; G 2566 -U 9648 ; WX 602 ; N uni25B0 ; G 2567 -U 9649 ; WX 602 ; N uni25B1 ; G 2568 -U 9650 ; WX 602 ; N triagup ; G 2569 -U 9651 ; WX 602 ; N uni25B3 ; G 2570 -U 9652 ; WX 602 ; N uni25B4 ; G 2571 -U 9653 ; WX 602 ; N uni25B5 ; G 2572 -U 9654 ; WX 602 ; N uni25B6 ; G 2573 -U 9655 ; WX 602 ; N uni25B7 ; G 2574 -U 9656 ; WX 602 ; N uni25B8 ; G 2575 -U 9657 ; WX 602 ; N uni25B9 ; G 2576 -U 9658 ; WX 602 ; N triagrt ; G 2577 -U 9659 ; WX 602 ; N uni25BB ; G 2578 -U 9660 ; WX 602 ; N triagdn ; G 2579 -U 9661 ; WX 602 ; N uni25BD ; G 2580 -U 9662 ; WX 602 ; N uni25BE ; G 2581 -U 9663 ; WX 602 ; N uni25BF ; G 2582 -U 9664 ; WX 602 ; N uni25C0 ; G 2583 -U 9665 ; WX 602 ; N uni25C1 ; G 2584 -U 9666 ; WX 602 ; N uni25C2 ; G 2585 -U 9667 ; WX 602 ; N uni25C3 ; G 2586 -U 9668 ; WX 602 ; N triaglf ; G 2587 -U 9669 ; WX 602 ; N uni25C5 ; G 2588 -U 9670 ; WX 602 ; N uni25C6 ; G 2589 -U 9671 ; WX 602 ; N uni25C7 ; G 2590 -U 9672 ; WX 602 ; N uni25C8 ; G 2591 -U 9673 ; WX 602 ; N uni25C9 ; G 2592 -U 9674 ; WX 602 ; N lozenge ; G 2593 -U 9675 ; WX 602 ; N circle ; G 2594 -U 9676 ; WX 602 ; N uni25CC ; G 2595 -U 9677 ; WX 602 ; N uni25CD ; G 2596 -U 9678 ; WX 602 ; N uni25CE ; G 2597 -U 9679 ; WX 602 ; N H18533 ; G 2598 -U 9680 ; WX 602 ; N uni25D0 ; G 2599 -U 9681 ; WX 602 ; N uni25D1 ; G 2600 -U 9682 ; WX 602 ; N uni25D2 ; G 2601 -U 9683 ; WX 602 ; N uni25D3 ; G 2602 -U 9684 ; WX 602 ; N uni25D4 ; G 2603 -U 9685 ; WX 602 ; N uni25D5 ; G 2604 -U 9686 ; WX 602 ; N uni25D6 ; G 2605 -U 9687 ; WX 602 ; N uni25D7 ; G 2606 -U 9688 ; WX 602 ; N invbullet ; G 2607 -U 9689 ; WX 602 ; N invcircle ; G 2608 -U 9690 ; WX 602 ; N uni25DA ; G 2609 -U 9691 ; WX 602 ; N uni25DB ; G 2610 -U 9692 ; WX 602 ; N uni25DC ; G 2611 -U 9693 ; WX 602 ; N uni25DD ; G 2612 -U 9694 ; WX 602 ; N uni25DE ; G 2613 -U 9695 ; WX 602 ; N uni25DF ; G 2614 -U 9696 ; WX 602 ; N uni25E0 ; G 2615 -U 9697 ; WX 602 ; N uni25E1 ; G 2616 -U 9698 ; WX 602 ; N uni25E2 ; G 2617 -U 9699 ; WX 602 ; N uni25E3 ; G 2618 -U 9700 ; WX 602 ; N uni25E4 ; G 2619 -U 9701 ; WX 602 ; N uni25E5 ; G 2620 -U 9702 ; WX 602 ; N openbullet ; G 2621 -U 9703 ; WX 602 ; N uni25E7 ; G 2622 -U 9704 ; WX 602 ; N uni25E8 ; G 2623 -U 9705 ; WX 602 ; N uni25E9 ; G 2624 -U 9706 ; WX 602 ; N uni25EA ; G 2625 -U 9707 ; WX 602 ; N uni25EB ; G 2626 -U 9708 ; WX 602 ; N uni25EC ; G 2627 -U 9709 ; WX 602 ; N uni25ED ; G 2628 -U 9710 ; WX 602 ; N uni25EE ; G 2629 -U 9711 ; WX 602 ; N uni25EF ; G 2630 -U 9712 ; WX 602 ; N uni25F0 ; G 2631 -U 9713 ; WX 602 ; N uni25F1 ; G 2632 -U 9714 ; WX 602 ; N uni25F2 ; G 2633 -U 9715 ; WX 602 ; N uni25F3 ; G 2634 -U 9716 ; WX 602 ; N uni25F4 ; G 2635 -U 9717 ; WX 602 ; N uni25F5 ; G 2636 -U 9718 ; WX 602 ; N uni25F6 ; G 2637 -U 9719 ; WX 602 ; N uni25F7 ; G 2638 -U 9720 ; WX 602 ; N uni25F8 ; G 2639 -U 9721 ; WX 602 ; N uni25F9 ; G 2640 -U 9722 ; WX 602 ; N uni25FA ; G 2641 -U 9723 ; WX 602 ; N uni25FB ; G 2642 -U 9724 ; WX 602 ; N uni25FC ; G 2643 -U 9725 ; WX 602 ; N uni25FD ; G 2644 -U 9726 ; WX 602 ; N uni25FE ; G 2645 -U 9727 ; WX 602 ; N uni25FF ; G 2646 -U 9728 ; WX 602 ; N uni2600 ; G 2647 -U 9729 ; WX 602 ; N uni2601 ; G 2648 -U 9730 ; WX 602 ; N uni2602 ; G 2649 -U 9731 ; WX 602 ; N uni2603 ; G 2650 -U 9732 ; WX 602 ; N uni2604 ; G 2651 -U 9733 ; WX 602 ; N uni2605 ; G 2652 -U 9734 ; WX 602 ; N uni2606 ; G 2653 -U 9735 ; WX 602 ; N uni2607 ; G 2654 -U 9736 ; WX 602 ; N uni2608 ; G 2655 -U 9737 ; WX 602 ; N uni2609 ; G 2656 -U 9738 ; WX 602 ; N uni260A ; G 2657 -U 9739 ; WX 602 ; N uni260B ; G 2658 -U 9740 ; WX 602 ; N uni260C ; G 2659 -U 9741 ; WX 602 ; N uni260D ; G 2660 -U 9742 ; WX 602 ; N uni260E ; G 2661 -U 9743 ; WX 602 ; N uni260F ; G 2662 -U 9744 ; WX 602 ; N uni2610 ; G 2663 -U 9745 ; WX 602 ; N uni2611 ; G 2664 -U 9746 ; WX 602 ; N uni2612 ; G 2665 -U 9747 ; WX 602 ; N uni2613 ; G 2666 -U 9748 ; WX 602 ; N uni2614 ; G 2667 -U 9749 ; WX 602 ; N uni2615 ; G 2668 -U 9750 ; WX 602 ; N uni2616 ; G 2669 -U 9751 ; WX 602 ; N uni2617 ; G 2670 -U 9752 ; WX 602 ; N uni2618 ; G 2671 -U 9753 ; WX 602 ; N uni2619 ; G 2672 -U 9754 ; WX 602 ; N uni261A ; G 2673 -U 9755 ; WX 602 ; N uni261B ; G 2674 -U 9756 ; WX 602 ; N uni261C ; G 2675 -U 9757 ; WX 602 ; N uni261D ; G 2676 -U 9758 ; WX 602 ; N uni261E ; G 2677 -U 9759 ; WX 602 ; N uni261F ; G 2678 -U 9760 ; WX 602 ; N uni2620 ; G 2679 -U 9761 ; WX 602 ; N uni2621 ; G 2680 -U 9762 ; WX 602 ; N uni2622 ; G 2681 -U 9763 ; WX 602 ; N uni2623 ; G 2682 -U 9764 ; WX 602 ; N uni2624 ; G 2683 -U 9765 ; WX 602 ; N uni2625 ; G 2684 -U 9766 ; WX 602 ; N uni2626 ; G 2685 -U 9767 ; WX 602 ; N uni2627 ; G 2686 -U 9768 ; WX 602 ; N uni2628 ; G 2687 -U 9769 ; WX 602 ; N uni2629 ; G 2688 -U 9770 ; WX 602 ; N uni262A ; G 2689 -U 9771 ; WX 602 ; N uni262B ; G 2690 -U 9772 ; WX 602 ; N uni262C ; G 2691 -U 9773 ; WX 602 ; N uni262D ; G 2692 -U 9774 ; WX 602 ; N uni262E ; G 2693 -U 9775 ; WX 602 ; N uni262F ; G 2694 -U 9784 ; WX 602 ; N uni2638 ; G 2695 -U 9785 ; WX 602 ; N uni2639 ; G 2696 -U 9786 ; WX 602 ; N smileface ; G 2697 -U 9787 ; WX 602 ; N invsmileface ; G 2698 -U 9788 ; WX 602 ; N sun ; G 2699 -U 9789 ; WX 602 ; N uni263D ; G 2700 -U 9790 ; WX 602 ; N uni263E ; G 2701 -U 9791 ; WX 602 ; N uni263F ; G 2702 -U 9792 ; WX 602 ; N female ; G 2703 -U 9793 ; WX 602 ; N uni2641 ; G 2704 -U 9794 ; WX 602 ; N male ; G 2705 -U 9795 ; WX 602 ; N uni2643 ; G 2706 -U 9796 ; WX 602 ; N uni2644 ; G 2707 -U 9797 ; WX 602 ; N uni2645 ; G 2708 -U 9798 ; WX 602 ; N uni2646 ; G 2709 -U 9799 ; WX 602 ; N uni2647 ; G 2710 -U 9800 ; WX 602 ; N uni2648 ; G 2711 -U 9801 ; WX 602 ; N uni2649 ; G 2712 -U 9802 ; WX 602 ; N uni264A ; G 2713 -U 9803 ; WX 602 ; N uni264B ; G 2714 -U 9804 ; WX 602 ; N uni264C ; G 2715 -U 9805 ; WX 602 ; N uni264D ; G 2716 -U 9806 ; WX 602 ; N uni264E ; G 2717 -U 9807 ; WX 602 ; N uni264F ; G 2718 -U 9808 ; WX 602 ; N uni2650 ; G 2719 -U 9809 ; WX 602 ; N uni2651 ; G 2720 -U 9810 ; WX 602 ; N uni2652 ; G 2721 -U 9811 ; WX 602 ; N uni2653 ; G 2722 -U 9812 ; WX 602 ; N uni2654 ; G 2723 -U 9813 ; WX 602 ; N uni2655 ; G 2724 -U 9814 ; WX 602 ; N uni2656 ; G 2725 -U 9815 ; WX 602 ; N uni2657 ; G 2726 -U 9816 ; WX 602 ; N uni2658 ; G 2727 -U 9817 ; WX 602 ; N uni2659 ; G 2728 -U 9818 ; WX 602 ; N uni265A ; G 2729 -U 9819 ; WX 602 ; N uni265B ; G 2730 -U 9820 ; WX 602 ; N uni265C ; G 2731 -U 9821 ; WX 602 ; N uni265D ; G 2732 -U 9822 ; WX 602 ; N uni265E ; G 2733 -U 9823 ; WX 602 ; N uni265F ; G 2734 -U 9824 ; WX 602 ; N spade ; G 2735 -U 9825 ; WX 602 ; N uni2661 ; G 2736 -U 9826 ; WX 602 ; N uni2662 ; G 2737 -U 9827 ; WX 602 ; N club ; G 2738 -U 9828 ; WX 602 ; N uni2664 ; G 2739 -U 9829 ; WX 602 ; N heart ; G 2740 -U 9830 ; WX 602 ; N diamond ; G 2741 -U 9831 ; WX 602 ; N uni2667 ; G 2742 -U 9832 ; WX 602 ; N uni2668 ; G 2743 -U 9833 ; WX 602 ; N uni2669 ; G 2744 -U 9834 ; WX 602 ; N musicalnote ; G 2745 -U 9835 ; WX 602 ; N musicalnotedbl ; G 2746 -U 9836 ; WX 602 ; N uni266C ; G 2747 -U 9837 ; WX 602 ; N uni266D ; G 2748 -U 9838 ; WX 602 ; N uni266E ; G 2749 -U 9839 ; WX 602 ; N uni266F ; G 2750 -U 9840 ; WX 602 ; N uni2670 ; G 2751 -U 9841 ; WX 602 ; N uni2671 ; G 2752 -U 9842 ; WX 602 ; N uni2672 ; G 2753 -U 9843 ; WX 602 ; N uni2673 ; G 2754 -U 9844 ; WX 602 ; N uni2674 ; G 2755 -U 9845 ; WX 602 ; N uni2675 ; G 2756 -U 9846 ; WX 602 ; N uni2676 ; G 2757 -U 9847 ; WX 602 ; N uni2677 ; G 2758 -U 9848 ; WX 602 ; N uni2678 ; G 2759 -U 9849 ; WX 602 ; N uni2679 ; G 2760 -U 9850 ; WX 602 ; N uni267A ; G 2761 -U 9851 ; WX 602 ; N uni267B ; G 2762 -U 9852 ; WX 602 ; N uni267C ; G 2763 -U 9853 ; WX 602 ; N uni267D ; G 2764 -U 9854 ; WX 602 ; N uni267E ; G 2765 -U 9855 ; WX 602 ; N uni267F ; G 2766 -U 9856 ; WX 602 ; N uni2680 ; G 2767 -U 9857 ; WX 602 ; N uni2681 ; G 2768 -U 9858 ; WX 602 ; N uni2682 ; G 2769 -U 9859 ; WX 602 ; N uni2683 ; G 2770 -U 9860 ; WX 602 ; N uni2684 ; G 2771 -U 9861 ; WX 602 ; N uni2685 ; G 2772 -U 9862 ; WX 602 ; N uni2686 ; G 2773 -U 9863 ; WX 602 ; N uni2687 ; G 2774 -U 9864 ; WX 602 ; N uni2688 ; G 2775 -U 9865 ; WX 602 ; N uni2689 ; G 2776 -U 9866 ; WX 602 ; N uni268A ; G 2777 -U 9867 ; WX 602 ; N uni268B ; G 2778 -U 9872 ; WX 602 ; N uni2690 ; G 2779 -U 9873 ; WX 602 ; N uni2691 ; G 2780 -U 9874 ; WX 602 ; N uni2692 ; G 2781 -U 9875 ; WX 602 ; N uni2693 ; G 2782 -U 9876 ; WX 602 ; N uni2694 ; G 2783 -U 9877 ; WX 602 ; N uni2695 ; G 2784 -U 9878 ; WX 602 ; N uni2696 ; G 2785 -U 9879 ; WX 602 ; N uni2697 ; G 2786 -U 9880 ; WX 602 ; N uni2698 ; G 2787 -U 9881 ; WX 602 ; N uni2699 ; G 2788 -U 9882 ; WX 602 ; N uni269A ; G 2789 -U 9883 ; WX 602 ; N uni269B ; G 2790 -U 9884 ; WX 602 ; N uni269C ; G 2791 -U 9888 ; WX 602 ; N uni26A0 ; G 2792 -U 9889 ; WX 602 ; N uni26A1 ; G 2793 -U 9904 ; WX 602 ; N uni26B0 ; G 2794 -U 9905 ; WX 602 ; N uni26B1 ; G 2795 -U 9985 ; WX 602 ; N uni2701 ; G 2796 -U 9986 ; WX 602 ; N uni2702 ; G 2797 -U 9987 ; WX 602 ; N uni2703 ; G 2798 -U 9988 ; WX 602 ; N uni2704 ; G 2799 -U 9990 ; WX 602 ; N uni2706 ; G 2800 -U 9991 ; WX 602 ; N uni2707 ; G 2801 -U 9992 ; WX 602 ; N uni2708 ; G 2802 -U 9993 ; WX 602 ; N uni2709 ; G 2803 -U 9996 ; WX 602 ; N uni270C ; G 2804 -U 9997 ; WX 602 ; N uni270D ; G 2805 -U 9998 ; WX 602 ; N uni270E ; G 2806 -U 9999 ; WX 602 ; N uni270F ; G 2807 -U 10000 ; WX 602 ; N uni2710 ; G 2808 -U 10001 ; WX 602 ; N uni2711 ; G 2809 -U 10002 ; WX 602 ; N uni2712 ; G 2810 -U 10003 ; WX 602 ; N uni2713 ; G 2811 -U 10004 ; WX 602 ; N uni2714 ; G 2812 -U 10005 ; WX 602 ; N uni2715 ; G 2813 -U 10006 ; WX 602 ; N uni2716 ; G 2814 -U 10007 ; WX 602 ; N uni2717 ; G 2815 -U 10008 ; WX 602 ; N uni2718 ; G 2816 -U 10009 ; WX 602 ; N uni2719 ; G 2817 -U 10010 ; WX 602 ; N uni271A ; G 2818 -U 10011 ; WX 602 ; N uni271B ; G 2819 -U 10012 ; WX 602 ; N uni271C ; G 2820 -U 10013 ; WX 602 ; N uni271D ; G 2821 -U 10014 ; WX 602 ; N uni271E ; G 2822 -U 10015 ; WX 602 ; N uni271F ; G 2823 -U 10016 ; WX 602 ; N uni2720 ; G 2824 -U 10017 ; WX 602 ; N uni2721 ; G 2825 -U 10018 ; WX 602 ; N uni2722 ; G 2826 -U 10019 ; WX 602 ; N uni2723 ; G 2827 -U 10020 ; WX 602 ; N uni2724 ; G 2828 -U 10021 ; WX 602 ; N uni2725 ; G 2829 -U 10022 ; WX 602 ; N uni2726 ; G 2830 -U 10023 ; WX 602 ; N uni2727 ; G 2831 -U 10025 ; WX 602 ; N uni2729 ; G 2832 -U 10026 ; WX 602 ; N uni272A ; G 2833 -U 10027 ; WX 602 ; N uni272B ; G 2834 -U 10028 ; WX 602 ; N uni272C ; G 2835 -U 10029 ; WX 602 ; N uni272D ; G 2836 -U 10030 ; WX 602 ; N uni272E ; G 2837 -U 10031 ; WX 602 ; N uni272F ; G 2838 -U 10032 ; WX 602 ; N uni2730 ; G 2839 -U 10033 ; WX 602 ; N uni2731 ; G 2840 -U 10034 ; WX 602 ; N uni2732 ; G 2841 -U 10035 ; WX 602 ; N uni2733 ; G 2842 -U 10036 ; WX 602 ; N uni2734 ; G 2843 -U 10037 ; WX 602 ; N uni2735 ; G 2844 -U 10038 ; WX 602 ; N uni2736 ; G 2845 -U 10039 ; WX 602 ; N uni2737 ; G 2846 -U 10040 ; WX 602 ; N uni2738 ; G 2847 -U 10041 ; WX 602 ; N uni2739 ; G 2848 -U 10042 ; WX 602 ; N uni273A ; G 2849 -U 10043 ; WX 602 ; N uni273B ; G 2850 -U 10044 ; WX 602 ; N uni273C ; G 2851 -U 10045 ; WX 602 ; N uni273D ; G 2852 -U 10046 ; WX 602 ; N uni273E ; G 2853 -U 10047 ; WX 602 ; N uni273F ; G 2854 -U 10048 ; WX 602 ; N uni2740 ; G 2855 -U 10049 ; WX 602 ; N uni2741 ; G 2856 -U 10050 ; WX 602 ; N uni2742 ; G 2857 -U 10051 ; WX 602 ; N uni2743 ; G 2858 -U 10052 ; WX 602 ; N uni2744 ; G 2859 -U 10053 ; WX 602 ; N uni2745 ; G 2860 -U 10054 ; WX 602 ; N uni2746 ; G 2861 -U 10055 ; WX 602 ; N uni2747 ; G 2862 -U 10056 ; WX 602 ; N uni2748 ; G 2863 -U 10057 ; WX 602 ; N uni2749 ; G 2864 -U 10058 ; WX 602 ; N uni274A ; G 2865 -U 10059 ; WX 602 ; N uni274B ; G 2866 -U 10061 ; WX 602 ; N uni274D ; G 2867 -U 10063 ; WX 602 ; N uni274F ; G 2868 -U 10064 ; WX 602 ; N uni2750 ; G 2869 -U 10065 ; WX 602 ; N uni2751 ; G 2870 -U 10066 ; WX 602 ; N uni2752 ; G 2871 -U 10070 ; WX 602 ; N uni2756 ; G 2872 -U 10072 ; WX 602 ; N uni2758 ; G 2873 -U 10073 ; WX 602 ; N uni2759 ; G 2874 -U 10074 ; WX 602 ; N uni275A ; G 2875 -U 10075 ; WX 602 ; N uni275B ; G 2876 -U 10076 ; WX 602 ; N uni275C ; G 2877 -U 10077 ; WX 602 ; N uni275D ; G 2878 -U 10078 ; WX 602 ; N uni275E ; G 2879 -U 10081 ; WX 602 ; N uni2761 ; G 2880 -U 10082 ; WX 602 ; N uni2762 ; G 2881 -U 10083 ; WX 602 ; N uni2763 ; G 2882 -U 10084 ; WX 602 ; N uni2764 ; G 2883 -U 10085 ; WX 602 ; N uni2765 ; G 2884 -U 10086 ; WX 602 ; N uni2766 ; G 2885 -U 10087 ; WX 602 ; N uni2767 ; G 2886 -U 10088 ; WX 602 ; N uni2768 ; G 2887 -U 10089 ; WX 602 ; N uni2769 ; G 2888 -U 10090 ; WX 602 ; N uni276A ; G 2889 -U 10091 ; WX 602 ; N uni276B ; G 2890 -U 10092 ; WX 602 ; N uni276C ; G 2891 -U 10093 ; WX 602 ; N uni276D ; G 2892 -U 10094 ; WX 602 ; N uni276E ; G 2893 -U 10095 ; WX 602 ; N uni276F ; G 2894 -U 10096 ; WX 602 ; N uni2770 ; G 2895 -U 10097 ; WX 602 ; N uni2771 ; G 2896 -U 10098 ; WX 602 ; N uni2772 ; G 2897 -U 10099 ; WX 602 ; N uni2773 ; G 2898 -U 10100 ; WX 602 ; N uni2774 ; G 2899 -U 10101 ; WX 602 ; N uni2775 ; G 2900 -U 10132 ; WX 602 ; N uni2794 ; G 2901 -U 10136 ; WX 602 ; N uni2798 ; G 2902 -U 10137 ; WX 602 ; N uni2799 ; G 2903 -U 10138 ; WX 602 ; N uni279A ; G 2904 -U 10139 ; WX 602 ; N uni279B ; G 2905 -U 10140 ; WX 602 ; N uni279C ; G 2906 -U 10141 ; WX 602 ; N uni279D ; G 2907 -U 10142 ; WX 602 ; N uni279E ; G 2908 -U 10143 ; WX 602 ; N uni279F ; G 2909 -U 10144 ; WX 602 ; N uni27A0 ; G 2910 -U 10145 ; WX 602 ; N uni27A1 ; G 2911 -U 10146 ; WX 602 ; N uni27A2 ; G 2912 -U 10147 ; WX 602 ; N uni27A3 ; G 2913 -U 10148 ; WX 602 ; N uni27A4 ; G 2914 -U 10149 ; WX 602 ; N uni27A5 ; G 2915 -U 10150 ; WX 602 ; N uni27A6 ; G 2916 -U 10151 ; WX 602 ; N uni27A7 ; G 2917 -U 10152 ; WX 602 ; N uni27A8 ; G 2918 -U 10153 ; WX 602 ; N uni27A9 ; G 2919 -U 10154 ; WX 602 ; N uni27AA ; G 2920 -U 10155 ; WX 602 ; N uni27AB ; G 2921 -U 10156 ; WX 602 ; N uni27AC ; G 2922 -U 10157 ; WX 602 ; N uni27AD ; G 2923 -U 10158 ; WX 602 ; N uni27AE ; G 2924 -U 10159 ; WX 602 ; N uni27AF ; G 2925 -U 10161 ; WX 602 ; N uni27B1 ; G 2926 -U 10162 ; WX 602 ; N uni27B2 ; G 2927 -U 10163 ; WX 602 ; N uni27B3 ; G 2928 -U 10164 ; WX 602 ; N uni27B4 ; G 2929 -U 10165 ; WX 602 ; N uni27B5 ; G 2930 -U 10166 ; WX 602 ; N uni27B6 ; G 2931 -U 10167 ; WX 602 ; N uni27B7 ; G 2932 -U 10168 ; WX 602 ; N uni27B8 ; G 2933 -U 10169 ; WX 602 ; N uni27B9 ; G 2934 -U 10170 ; WX 602 ; N uni27BA ; G 2935 -U 10171 ; WX 602 ; N uni27BB ; G 2936 -U 10172 ; WX 602 ; N uni27BC ; G 2937 -U 10173 ; WX 602 ; N uni27BD ; G 2938 -U 10174 ; WX 602 ; N uni27BE ; G 2939 -U 10178 ; WX 602 ; N uni27C2 ; G 2940 -U 10181 ; WX 602 ; N uni27C5 ; G 2941 -U 10182 ; WX 602 ; N uni27C6 ; G 2942 -U 10204 ; WX 602 ; N uni27DC ; G 2943 -U 10208 ; WX 602 ; N uni27E0 ; G 2944 -U 10214 ; WX 602 ; N uni27E6 ; G 2945 -U 10215 ; WX 602 ; N uni27E7 ; G 2946 -U 10216 ; WX 602 ; N uni27E8 ; G 2947 -U 10217 ; WX 602 ; N uni27E9 ; G 2948 -U 10218 ; WX 602 ; N uni27EA ; G 2949 -U 10219 ; WX 602 ; N uni27EB ; G 2950 -U 10229 ; WX 602 ; N uni27F5 ; G 2951 -U 10230 ; WX 602 ; N uni27F6 ; G 2952 -U 10231 ; WX 602 ; N uni27F7 ; G 2953 -U 10631 ; WX 602 ; N uni2987 ; G 2954 -U 10632 ; WX 602 ; N uni2988 ; G 2955 -U 10647 ; WX 602 ; N uni2997 ; G 2956 -U 10648 ; WX 602 ; N uni2998 ; G 2957 -U 10731 ; WX 602 ; N uni29EB ; G 2958 -U 10746 ; WX 602 ; N uni29FA ; G 2959 -U 10747 ; WX 602 ; N uni29FB ; G 2960 -U 10752 ; WX 602 ; N uni2A00 ; G 2961 -U 10799 ; WX 602 ; N uni2A2F ; G 2962 -U 10858 ; WX 602 ; N uni2A6A ; G 2963 -U 10859 ; WX 602 ; N uni2A6B ; G 2964 -U 11013 ; WX 602 ; N uni2B05 ; G 2965 -U 11014 ; WX 602 ; N uni2B06 ; G 2966 -U 11015 ; WX 602 ; N uni2B07 ; G 2967 -U 11016 ; WX 602 ; N uni2B08 ; G 2968 -U 11017 ; WX 602 ; N uni2B09 ; G 2969 -U 11018 ; WX 602 ; N uni2B0A ; G 2970 -U 11019 ; WX 602 ; N uni2B0B ; G 2971 -U 11020 ; WX 602 ; N uni2B0C ; G 2972 -U 11021 ; WX 602 ; N uni2B0D ; G 2973 -U 11026 ; WX 602 ; N uni2B12 ; G 2974 -U 11027 ; WX 602 ; N uni2B13 ; G 2975 -U 11028 ; WX 602 ; N uni2B14 ; G 2976 -U 11029 ; WX 602 ; N uni2B15 ; G 2977 -U 11030 ; WX 602 ; N uni2B16 ; G 2978 -U 11031 ; WX 602 ; N uni2B17 ; G 2979 -U 11032 ; WX 602 ; N uni2B18 ; G 2980 -U 11033 ; WX 602 ; N uni2B19 ; G 2981 -U 11034 ; WX 602 ; N uni2B1A ; G 2982 -U 11364 ; WX 602 ; N uni2C64 ; G 2983 -U 11373 ; WX 602 ; N uni2C6D ; G 2984 -U 11374 ; WX 602 ; N uni2C6E ; G 2985 -U 11375 ; WX 602 ; N uni2C6F ; G 2986 -U 11376 ; WX 602 ; N uni2C70 ; G 2987 -U 11381 ; WX 602 ; N uni2C75 ; G 2988 -U 11382 ; WX 602 ; N uni2C76 ; G 2989 -U 11383 ; WX 602 ; N uni2C77 ; G 2990 -U 11385 ; WX 602 ; N uni2C79 ; G 2991 -U 11386 ; WX 602 ; N uni2C7A ; G 2992 -U 11388 ; WX 602 ; N uni2C7C ; G 2993 -U 11389 ; WX 602 ; N uni2C7D ; G 2994 -U 11390 ; WX 602 ; N uni2C7E ; G 2995 -U 11391 ; WX 602 ; N uni2C7F ; G 2996 -U 11800 ; WX 602 ; N uni2E18 ; G 2997 -U 11807 ; WX 602 ; N uni2E1F ; G 2998 -U 11810 ; WX 602 ; N uni2E22 ; G 2999 -U 11811 ; WX 602 ; N uni2E23 ; G 3000 -U 11812 ; WX 602 ; N uni2E24 ; G 3001 -U 11813 ; WX 602 ; N uni2E25 ; G 3002 -U 11822 ; WX 602 ; N uni2E2E ; G 3003 -U 42760 ; WX 602 ; N uniA708 ; G 3004 -U 42761 ; WX 602 ; N uniA709 ; G 3005 -U 42762 ; WX 602 ; N uniA70A ; G 3006 -U 42763 ; WX 602 ; N uniA70B ; G 3007 -U 42764 ; WX 602 ; N uniA70C ; G 3008 -U 42765 ; WX 602 ; N uniA70D ; G 3009 -U 42766 ; WX 602 ; N uniA70E ; G 3010 -U 42767 ; WX 602 ; N uniA70F ; G 3011 -U 42768 ; WX 602 ; N uniA710 ; G 3012 -U 42769 ; WX 602 ; N uniA711 ; G 3013 -U 42770 ; WX 602 ; N uniA712 ; G 3014 -U 42771 ; WX 602 ; N uniA713 ; G 3015 -U 42772 ; WX 602 ; N uniA714 ; G 3016 -U 42773 ; WX 602 ; N uniA715 ; G 3017 -U 42774 ; WX 602 ; N uniA716 ; G 3018 -U 42779 ; WX 602 ; N uniA71B ; G 3019 -U 42780 ; WX 602 ; N uniA71C ; G 3020 -U 42781 ; WX 602 ; N uniA71D ; G 3021 -U 42782 ; WX 602 ; N uniA71E ; G 3022 -U 42783 ; WX 602 ; N uniA71F ; G 3023 -U 42786 ; WX 602 ; N uniA722 ; G 3024 -U 42787 ; WX 602 ; N uniA723 ; G 3025 -U 42788 ; WX 602 ; N uniA724 ; G 3026 -U 42789 ; WX 602 ; N uniA725 ; G 3027 -U 42790 ; WX 602 ; N uniA726 ; G 3028 -U 42791 ; WX 602 ; N uniA727 ; G 3029 -U 42889 ; WX 602 ; N uniA789 ; G 3030 -U 42890 ; WX 602 ; N uniA78A ; G 3031 -U 42891 ; WX 602 ; N uniA78B ; G 3032 -U 42892 ; WX 602 ; N uniA78C ; G 3033 -U 42893 ; WX 602 ; N uniA78D ; G 3034 -U 42894 ; WX 602 ; N uniA78E ; G 3035 -U 42896 ; WX 602 ; N uniA790 ; G 3036 -U 42897 ; WX 602 ; N uniA791 ; G 3037 -U 42922 ; WX 602 ; N uniA7AA ; G 3038 -U 43000 ; WX 602 ; N uniA7F8 ; G 3039 -U 43001 ; WX 602 ; N uniA7F9 ; G 3040 -U 63173 ; WX 602 ; N uniF6C5 ; G 3041 -U 64257 ; WX 602 ; N fi ; G 3042 -U 64258 ; WX 602 ; N fl ; G 3043 -U 64338 ; WX 602 ; N uniFB52 ; G 3044 -U 64339 ; WX 602 ; N uniFB53 ; G 3045 -U 64340 ; WX 602 ; N uniFB54 ; G 3046 -U 64341 ; WX 602 ; N uniFB55 ; G 3047 -U 64342 ; WX 602 ; N uniFB56 ; G 3048 -U 64343 ; WX 602 ; N uniFB57 ; G 3049 -U 64344 ; WX 602 ; N uniFB58 ; G 3050 -U 64345 ; WX 602 ; N uniFB59 ; G 3051 -U 64346 ; WX 602 ; N uniFB5A ; G 3052 -U 64347 ; WX 602 ; N uniFB5B ; G 3053 -U 64348 ; WX 602 ; N uniFB5C ; G 3054 -U 64349 ; WX 602 ; N uniFB5D ; G 3055 -U 64350 ; WX 602 ; N uniFB5E ; G 3056 -U 64351 ; WX 602 ; N uniFB5F ; G 3057 -U 64352 ; WX 602 ; N uniFB60 ; G 3058 -U 64353 ; WX 602 ; N uniFB61 ; G 3059 -U 64354 ; WX 602 ; N uniFB62 ; G 3060 -U 64355 ; WX 602 ; N uniFB63 ; G 3061 -U 64356 ; WX 602 ; N uniFB64 ; G 3062 -U 64357 ; WX 602 ; N uniFB65 ; G 3063 -U 64358 ; WX 602 ; N uniFB66 ; G 3064 -U 64359 ; WX 602 ; N uniFB67 ; G 3065 -U 64360 ; WX 602 ; N uniFB68 ; G 3066 -U 64361 ; WX 602 ; N uniFB69 ; G 3067 -U 64362 ; WX 602 ; N uniFB6A ; G 3068 -U 64363 ; WX 602 ; N uniFB6B ; G 3069 -U 64364 ; WX 602 ; N uniFB6C ; G 3070 -U 64365 ; WX 602 ; N uniFB6D ; G 3071 -U 64366 ; WX 602 ; N uniFB6E ; G 3072 -U 64367 ; WX 602 ; N uniFB6F ; G 3073 -U 64368 ; WX 602 ; N uniFB70 ; G 3074 -U 64369 ; WX 602 ; N uniFB71 ; G 3075 -U 64370 ; WX 602 ; N uniFB72 ; G 3076 -U 64371 ; WX 602 ; N uniFB73 ; G 3077 -U 64372 ; WX 602 ; N uniFB74 ; G 3078 -U 64373 ; WX 602 ; N uniFB75 ; G 3079 -U 64374 ; WX 602 ; N uniFB76 ; G 3080 -U 64375 ; WX 602 ; N uniFB77 ; G 3081 -U 64376 ; WX 602 ; N uniFB78 ; G 3082 -U 64377 ; WX 602 ; N uniFB79 ; G 3083 -U 64378 ; WX 602 ; N uniFB7A ; G 3084 -U 64379 ; WX 602 ; N uniFB7B ; G 3085 -U 64380 ; WX 602 ; N uniFB7C ; G 3086 -U 64381 ; WX 602 ; N uniFB7D ; G 3087 -U 64382 ; WX 602 ; N uniFB7E ; G 3088 -U 64383 ; WX 602 ; N uniFB7F ; G 3089 -U 64384 ; WX 602 ; N uniFB80 ; G 3090 -U 64385 ; WX 602 ; N uniFB81 ; G 3091 -U 64394 ; WX 602 ; N uniFB8A ; G 3092 -U 64395 ; WX 602 ; N uniFB8B ; G 3093 -U 64396 ; WX 602 ; N uniFB8C ; G 3094 -U 64397 ; WX 602 ; N uniFB8D ; G 3095 -U 64398 ; WX 602 ; N uniFB8E ; G 3096 -U 64399 ; WX 602 ; N uniFB8F ; G 3097 -U 64400 ; WX 602 ; N uniFB90 ; G 3098 -U 64401 ; WX 602 ; N uniFB91 ; G 3099 -U 64402 ; WX 602 ; N uniFB92 ; G 3100 -U 64403 ; WX 602 ; N uniFB93 ; G 3101 -U 64404 ; WX 602 ; N uniFB94 ; G 3102 -U 64405 ; WX 602 ; N uniFB95 ; G 3103 -U 64414 ; WX 602 ; N uniFB9E ; G 3104 -U 64415 ; WX 602 ; N uniFB9F ; G 3105 -U 64426 ; WX 602 ; N uniFBAA ; G 3106 -U 64427 ; WX 602 ; N uniFBAB ; G 3107 -U 64428 ; WX 602 ; N uniFBAC ; G 3108 -U 64429 ; WX 602 ; N uniFBAD ; G 3109 -U 64488 ; WX 602 ; N uniFBE8 ; G 3110 -U 64489 ; WX 602 ; N uniFBE9 ; G 3111 -U 64508 ; WX 602 ; N uniFBFC ; G 3112 -U 64509 ; WX 602 ; N uniFBFD ; G 3113 -U 64510 ; WX 602 ; N uniFBFE ; G 3114 -U 64511 ; WX 602 ; N uniFBFF ; G 3115 -U 65136 ; WX 602 ; N uniFE70 ; G 3116 -U 65137 ; WX 602 ; N uniFE71 ; G 3117 -U 65138 ; WX 602 ; N uniFE72 ; G 3118 -U 65139 ; WX 602 ; N uniFE73 ; G 3119 -U 65140 ; WX 602 ; N uniFE74 ; G 3120 -U 65142 ; WX 602 ; N uniFE76 ; G 3121 -U 65143 ; WX 602 ; N uniFE77 ; G 3122 -U 65144 ; WX 602 ; N uniFE78 ; G 3123 -U 65145 ; WX 602 ; N uniFE79 ; G 3124 -U 65146 ; WX 602 ; N uniFE7A ; G 3125 -U 65147 ; WX 602 ; N uniFE7B ; G 3126 -U 65148 ; WX 602 ; N uniFE7C ; G 3127 -U 65149 ; WX 602 ; N uniFE7D ; G 3128 -U 65150 ; WX 602 ; N uniFE7E ; G 3129 -U 65151 ; WX 602 ; N uniFE7F ; G 3130 -U 65152 ; WX 602 ; N uniFE80 ; G 3131 -U 65153 ; WX 602 ; N uniFE81 ; G 3132 -U 65154 ; WX 602 ; N uniFE82 ; G 3133 -U 65155 ; WX 602 ; N uniFE83 ; G 3134 -U 65156 ; WX 602 ; N uniFE84 ; G 3135 -U 65157 ; WX 602 ; N uniFE85 ; G 3136 -U 65158 ; WX 602 ; N uniFE86 ; G 3137 -U 65159 ; WX 602 ; N uniFE87 ; G 3138 -U 65160 ; WX 602 ; N uniFE88 ; G 3139 -U 65161 ; WX 602 ; N uniFE89 ; G 3140 -U 65162 ; WX 602 ; N uniFE8A ; G 3141 -U 65163 ; WX 602 ; N uniFE8B ; G 3142 -U 65164 ; WX 602 ; N uniFE8C ; G 3143 -U 65165 ; WX 602 ; N uniFE8D ; G 3144 -U 65166 ; WX 602 ; N uniFE8E ; G 3145 -U 65167 ; WX 602 ; N uniFE8F ; G 3146 -U 65168 ; WX 602 ; N uniFE90 ; G 3147 -U 65169 ; WX 602 ; N uniFE91 ; G 3148 -U 65170 ; WX 602 ; N uniFE92 ; G 3149 -U 65171 ; WX 602 ; N uniFE93 ; G 3150 -U 65172 ; WX 602 ; N uniFE94 ; G 3151 -U 65173 ; WX 602 ; N uniFE95 ; G 3152 -U 65174 ; WX 602 ; N uniFE96 ; G 3153 -U 65175 ; WX 602 ; N uniFE97 ; G 3154 -U 65176 ; WX 602 ; N uniFE98 ; G 3155 -U 65177 ; WX 602 ; N uniFE99 ; G 3156 -U 65178 ; WX 602 ; N uniFE9A ; G 3157 -U 65179 ; WX 602 ; N uniFE9B ; G 3158 -U 65180 ; WX 602 ; N uniFE9C ; G 3159 -U 65181 ; WX 602 ; N uniFE9D ; G 3160 -U 65182 ; WX 602 ; N uniFE9E ; G 3161 -U 65183 ; WX 602 ; N uniFE9F ; G 3162 -U 65184 ; WX 602 ; N uniFEA0 ; G 3163 -U 65185 ; WX 602 ; N uniFEA1 ; G 3164 -U 65186 ; WX 602 ; N uniFEA2 ; G 3165 -U 65187 ; WX 602 ; N uniFEA3 ; G 3166 -U 65188 ; WX 602 ; N uniFEA4 ; G 3167 -U 65189 ; WX 602 ; N uniFEA5 ; G 3168 -U 65190 ; WX 602 ; N uniFEA6 ; G 3169 -U 65191 ; WX 602 ; N uniFEA7 ; G 3170 -U 65192 ; WX 602 ; N uniFEA8 ; G 3171 -U 65193 ; WX 602 ; N uniFEA9 ; G 3172 -U 65194 ; WX 602 ; N uniFEAA ; G 3173 -U 65195 ; WX 602 ; N uniFEAB ; G 3174 -U 65196 ; WX 602 ; N uniFEAC ; G 3175 -U 65197 ; WX 602 ; N uniFEAD ; G 3176 -U 65198 ; WX 602 ; N uniFEAE ; G 3177 -U 65199 ; WX 602 ; N uniFEAF ; G 3178 -U 65200 ; WX 602 ; N uniFEB0 ; G 3179 -U 65201 ; WX 602 ; N uniFEB1 ; G 3180 -U 65202 ; WX 602 ; N uniFEB2 ; G 3181 -U 65203 ; WX 602 ; N uniFEB3 ; G 3182 -U 65204 ; WX 602 ; N uniFEB4 ; G 3183 -U 65205 ; WX 602 ; N uniFEB5 ; G 3184 -U 65206 ; WX 602 ; N uniFEB6 ; G 3185 -U 65207 ; WX 602 ; N uniFEB7 ; G 3186 -U 65208 ; WX 602 ; N uniFEB8 ; G 3187 -U 65209 ; WX 602 ; N uniFEB9 ; G 3188 -U 65210 ; WX 602 ; N uniFEBA ; G 3189 -U 65211 ; WX 602 ; N uniFEBB ; G 3190 -U 65212 ; WX 602 ; N uniFEBC ; G 3191 -U 65213 ; WX 602 ; N uniFEBD ; G 3192 -U 65214 ; WX 602 ; N uniFEBE ; G 3193 -U 65215 ; WX 602 ; N uniFEBF ; G 3194 -U 65216 ; WX 602 ; N uniFEC0 ; G 3195 -U 65217 ; WX 602 ; N uniFEC1 ; G 3196 -U 65218 ; WX 602 ; N uniFEC2 ; G 3197 -U 65219 ; WX 602 ; N uniFEC3 ; G 3198 -U 65220 ; WX 602 ; N uniFEC4 ; G 3199 -U 65221 ; WX 602 ; N uniFEC5 ; G 3200 -U 65222 ; WX 602 ; N uniFEC6 ; G 3201 -U 65223 ; WX 602 ; N uniFEC7 ; G 3202 -U 65224 ; WX 602 ; N uniFEC8 ; G 3203 -U 65225 ; WX 602 ; N uniFEC9 ; G 3204 -U 65226 ; WX 602 ; N uniFECA ; G 3205 -U 65227 ; WX 602 ; N uniFECB ; G 3206 -U 65228 ; WX 602 ; N uniFECC ; G 3207 -U 65229 ; WX 602 ; N uniFECD ; G 3208 -U 65230 ; WX 602 ; N uniFECE ; G 3209 -U 65231 ; WX 602 ; N uniFECF ; G 3210 -U 65232 ; WX 602 ; N uniFED0 ; G 3211 -U 65233 ; WX 602 ; N uniFED1 ; G 3212 -U 65234 ; WX 602 ; N uniFED2 ; G 3213 -U 65235 ; WX 602 ; N uniFED3 ; G 3214 -U 65236 ; WX 602 ; N uniFED4 ; G 3215 -U 65237 ; WX 602 ; N uniFED5 ; G 3216 -U 65238 ; WX 602 ; N uniFED6 ; G 3217 -U 65239 ; WX 602 ; N uniFED7 ; G 3218 -U 65240 ; WX 602 ; N uniFED8 ; G 3219 -U 65241 ; WX 602 ; N uniFED9 ; G 3220 -U 65242 ; WX 602 ; N uniFEDA ; G 3221 -U 65243 ; WX 602 ; N uniFEDB ; G 3222 -U 65244 ; WX 602 ; N uniFEDC ; G 3223 -U 65245 ; WX 602 ; N uniFEDD ; G 3224 -U 65246 ; WX 602 ; N uniFEDE ; G 3225 -U 65247 ; WX 602 ; N uniFEDF ; G 3226 -U 65248 ; WX 602 ; N uniFEE0 ; G 3227 -U 65249 ; WX 602 ; N uniFEE1 ; G 3228 -U 65250 ; WX 602 ; N uniFEE2 ; G 3229 -U 65251 ; WX 602 ; N uniFEE3 ; G 3230 -U 65252 ; WX 602 ; N uniFEE4 ; G 3231 -U 65253 ; WX 602 ; N uniFEE5 ; G 3232 -U 65254 ; WX 602 ; N uniFEE6 ; G 3233 -U 65255 ; WX 602 ; N uniFEE7 ; G 3234 -U 65256 ; WX 602 ; N uniFEE8 ; G 3235 -U 65257 ; WX 602 ; N uniFEE9 ; G 3236 -U 65258 ; WX 602 ; N uniFEEA ; G 3237 -U 65259 ; WX 602 ; N uniFEEB ; G 3238 -U 65260 ; WX 602 ; N uniFEEC ; G 3239 -U 65261 ; WX 602 ; N uniFEED ; G 3240 -U 65262 ; WX 602 ; N uniFEEE ; G 3241 -U 65263 ; WX 602 ; N uniFEEF ; G 3242 -U 65264 ; WX 602 ; N uniFEF0 ; G 3243 -U 65265 ; WX 602 ; N uniFEF1 ; G 3244 -U 65266 ; WX 602 ; N uniFEF2 ; G 3245 -U 65267 ; WX 602 ; N uniFEF3 ; G 3246 -U 65268 ; WX 602 ; N uniFEF4 ; G 3247 -U 65269 ; WX 602 ; N uniFEF5 ; G 3248 -U 65270 ; WX 602 ; N uniFEF6 ; G 3249 -U 65271 ; WX 602 ; N uniFEF7 ; G 3250 -U 65272 ; WX 602 ; N uniFEF8 ; G 3251 -U 65273 ; WX 602 ; N uniFEF9 ; G 3252 -U 65274 ; WX 602 ; N uniFEFA ; G 3253 -U 65275 ; WX 602 ; N uniFEFB ; G 3254 -U 65276 ; WX 602 ; N uniFEFC ; G 3255 -U 65279 ; WX 602 ; N uniFEFF ; G 3256 -U 65529 ; WX 602 ; N uniFFF9 ; G 3257 -U 65530 ; WX 602 ; N uniFFFA ; G 3258 -U 65531 ; WX 602 ; N uniFFFB ; G 3259 -U 65532 ; WX 602 ; N uniFFFC ; G 3260 -U 65533 ; WX 602 ; N uniFFFD ; G 3261 -EndCharMetrics -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ttf deleted file mode 100644 index 3bb755f..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ufm deleted file mode 100644 index 7420dab..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ufm +++ /dev/null @@ -1,4013 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Serif -FontSubfamily Bold -UniqueID DejaVu Serif Bold -FullName DejaVu Serif Bold -Version Version 2.37 -PostScriptName DejaVuSerif-Bold -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -PreferredFamily DejaVu Serif -PreferredSubfamily Bold -Weight Bold -ItalicAngle 0 -IsFixedPitch false -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 939 -Descender -236 -FontBBox -836 -389 1854 1145 -StartCharMetrics 3506 -U 32 ; WX 348 ; N space ; G 3 -U 33 ; WX 439 ; N exclam ; G 4 -U 34 ; WX 521 ; N quotedbl ; G 5 -U 35 ; WX 838 ; N numbersign ; G 6 -U 36 ; WX 696 ; N dollar ; G 7 -U 37 ; WX 950 ; N percent ; G 8 -U 38 ; WX 903 ; N ampersand ; G 9 -U 39 ; WX 306 ; N quotesingle ; G 10 -U 40 ; WX 473 ; N parenleft ; G 11 -U 41 ; WX 473 ; N parenright ; G 12 -U 42 ; WX 523 ; N asterisk ; G 13 -U 43 ; WX 838 ; N plus ; G 14 -U 44 ; WX 348 ; N comma ; G 15 -U 45 ; WX 415 ; N hyphen ; G 16 -U 46 ; WX 348 ; N period ; G 17 -U 47 ; WX 365 ; N slash ; G 18 -U 48 ; WX 696 ; N zero ; G 19 -U 49 ; WX 696 ; N one ; G 20 -U 50 ; WX 696 ; N two ; G 21 -U 51 ; WX 696 ; N three ; G 22 -U 52 ; WX 696 ; N four ; G 23 -U 53 ; WX 696 ; N five ; G 24 -U 54 ; WX 696 ; N six ; G 25 -U 55 ; WX 696 ; N seven ; G 26 -U 56 ; WX 696 ; N eight ; G 27 -U 57 ; WX 696 ; N nine ; G 28 -U 58 ; WX 369 ; N colon ; G 29 -U 59 ; WX 369 ; N semicolon ; G 30 -U 60 ; WX 838 ; N less ; G 31 -U 61 ; WX 838 ; N equal ; G 32 -U 62 ; WX 838 ; N greater ; G 33 -U 63 ; WX 586 ; N question ; G 34 -U 64 ; WX 1000 ; N at ; G 35 -U 65 ; WX 776 ; N A ; G 36 -U 66 ; WX 845 ; N B ; G 37 -U 67 ; WX 796 ; N C ; G 38 -U 68 ; WX 867 ; N D ; G 39 -U 69 ; WX 762 ; N E ; G 40 -U 70 ; WX 710 ; N F ; G 41 -U 71 ; WX 854 ; N G ; G 42 -U 72 ; WX 945 ; N H ; G 43 -U 73 ; WX 468 ; N I ; G 44 -U 74 ; WX 473 ; N J ; G 45 -U 75 ; WX 869 ; N K ; G 46 -U 76 ; WX 703 ; N L ; G 47 -U 77 ; WX 1107 ; N M ; G 48 -U 78 ; WX 914 ; N N ; G 49 -U 79 ; WX 871 ; N O ; G 50 -U 80 ; WX 752 ; N P ; G 51 -U 81 ; WX 871 ; N Q ; G 52 -U 82 ; WX 831 ; N R ; G 53 -U 83 ; WX 722 ; N S ; G 54 -U 84 ; WX 744 ; N T ; G 55 -U 85 ; WX 872 ; N U ; G 56 -U 86 ; WX 776 ; N V ; G 57 -U 87 ; WX 1123 ; N W ; G 58 -U 88 ; WX 776 ; N X ; G 59 -U 89 ; WX 714 ; N Y ; G 60 -U 90 ; WX 730 ; N Z ; G 61 -U 91 ; WX 473 ; N bracketleft ; G 62 -U 92 ; WX 365 ; N backslash ; G 63 -U 93 ; WX 473 ; N bracketright ; G 64 -U 94 ; WX 838 ; N asciicircum ; G 65 -U 95 ; WX 500 ; N underscore ; G 66 -U 96 ; WX 500 ; N grave ; G 67 -U 97 ; WX 648 ; N a ; G 68 -U 98 ; WX 699 ; N b ; G 69 -U 99 ; WX 609 ; N c ; G 70 -U 100 ; WX 699 ; N d ; G 71 -U 101 ; WX 636 ; N e ; G 72 -U 102 ; WX 430 ; N f ; G 73 -U 103 ; WX 699 ; N g ; G 74 -U 104 ; WX 727 ; N h ; G 75 -U 105 ; WX 380 ; N i ; G 76 -U 106 ; WX 362 ; N j ; G 77 -U 107 ; WX 693 ; N k ; G 78 -U 108 ; WX 380 ; N l ; G 79 -U 109 ; WX 1058 ; N m ; G 80 -U 110 ; WX 727 ; N n ; G 81 -U 111 ; WX 667 ; N o ; G 82 -U 112 ; WX 699 ; N p ; G 83 -U 113 ; WX 699 ; N q ; G 84 -U 114 ; WX 527 ; N r ; G 85 -U 115 ; WX 563 ; N s ; G 86 -U 116 ; WX 462 ; N t ; G 87 -U 117 ; WX 727 ; N u ; G 88 -U 118 ; WX 581 ; N v ; G 89 -U 119 ; WX 861 ; N w ; G 90 -U 120 ; WX 596 ; N x ; G 91 -U 121 ; WX 581 ; N y ; G 92 -U 122 ; WX 568 ; N z ; G 93 -U 123 ; WX 643 ; N braceleft ; G 94 -U 124 ; WX 364 ; N bar ; G 95 -U 125 ; WX 643 ; N braceright ; G 96 -U 126 ; WX 838 ; N asciitilde ; G 97 -U 160 ; WX 348 ; N nbspace ; G 98 -U 161 ; WX 439 ; N exclamdown ; G 99 -U 162 ; WX 696 ; N cent ; G 100 -U 163 ; WX 696 ; N sterling ; G 101 -U 164 ; WX 636 ; N currency ; G 102 -U 165 ; WX 696 ; N yen ; G 103 -U 166 ; WX 364 ; N brokenbar ; G 104 -U 167 ; WX 523 ; N section ; G 105 -U 168 ; WX 500 ; N dieresis ; G 106 -U 169 ; WX 1000 ; N copyright ; G 107 -U 170 ; WX 487 ; N ordfeminine ; G 108 -U 171 ; WX 625 ; N guillemotleft ; G 109 -U 172 ; WX 838 ; N logicalnot ; G 110 -U 173 ; WX 415 ; N sfthyphen ; G 111 -U 174 ; WX 1000 ; N registered ; G 112 -U 175 ; WX 500 ; N macron ; G 113 -U 176 ; WX 500 ; N degree ; G 114 -U 177 ; WX 838 ; N plusminus ; G 115 -U 178 ; WX 438 ; N twosuperior ; G 116 -U 179 ; WX 438 ; N threesuperior ; G 117 -U 180 ; WX 500 ; N acute ; G 118 -U 181 ; WX 732 ; N mu ; G 119 -U 182 ; WX 636 ; N paragraph ; G 120 -U 183 ; WX 348 ; N periodcentered ; G 121 -U 184 ; WX 500 ; N cedilla ; G 122 -U 185 ; WX 438 ; N onesuperior ; G 123 -U 186 ; WX 500 ; N ordmasculine ; G 124 -U 187 ; WX 625 ; N guillemotright ; G 125 -U 188 ; WX 1043 ; N onequarter ; G 126 -U 189 ; WX 1043 ; N onehalf ; G 127 -U 190 ; WX 1043 ; N threequarters ; G 128 -U 191 ; WX 586 ; N questiondown ; G 129 -U 192 ; WX 776 ; N Agrave ; G 130 -U 193 ; WX 776 ; N Aacute ; G 131 -U 194 ; WX 776 ; N Acircumflex ; G 132 -U 195 ; WX 776 ; N Atilde ; G 133 -U 196 ; WX 776 ; N Adieresis ; G 134 -U 197 ; WX 776 ; N Aring ; G 135 -U 198 ; WX 1034 ; N AE ; G 136 -U 199 ; WX 796 ; N Ccedilla ; G 137 -U 200 ; WX 762 ; N Egrave ; G 138 -U 201 ; WX 762 ; N Eacute ; G 139 -U 202 ; WX 762 ; N Ecircumflex ; G 140 -U 203 ; WX 762 ; N Edieresis ; G 141 -U 204 ; WX 468 ; N Igrave ; G 142 -U 205 ; WX 468 ; N Iacute ; G 143 -U 206 ; WX 468 ; N Icircumflex ; G 144 -U 207 ; WX 468 ; N Idieresis ; G 145 -U 208 ; WX 874 ; N Eth ; G 146 -U 209 ; WX 914 ; N Ntilde ; G 147 -U 210 ; WX 871 ; N Ograve ; G 148 -U 211 ; WX 871 ; N Oacute ; G 149 -U 212 ; WX 871 ; N Ocircumflex ; G 150 -U 213 ; WX 871 ; N Otilde ; G 151 -U 214 ; WX 871 ; N Odieresis ; G 152 -U 215 ; WX 838 ; N multiply ; G 153 -U 216 ; WX 871 ; N Oslash ; G 154 -U 217 ; WX 872 ; N Ugrave ; G 155 -U 218 ; WX 872 ; N Uacute ; G 156 -U 219 ; WX 872 ; N Ucircumflex ; G 157 -U 220 ; WX 872 ; N Udieresis ; G 158 -U 221 ; WX 714 ; N Yacute ; G 159 -U 222 ; WX 757 ; N Thorn ; G 160 -U 223 ; WX 760 ; N germandbls ; G 161 -U 224 ; WX 648 ; N agrave ; G 162 -U 225 ; WX 648 ; N aacute ; G 163 -U 226 ; WX 648 ; N acircumflex ; G 164 -U 227 ; WX 648 ; N atilde ; G 165 -U 228 ; WX 648 ; N adieresis ; G 166 -U 229 ; WX 648 ; N aring ; G 167 -U 230 ; WX 975 ; N ae ; G 168 -U 231 ; WX 609 ; N ccedilla ; G 169 -U 232 ; WX 636 ; N egrave ; G 170 -U 233 ; WX 636 ; N eacute ; G 171 -U 234 ; WX 636 ; N ecircumflex ; G 172 -U 235 ; WX 636 ; N edieresis ; G 173 -U 236 ; WX 380 ; N igrave ; G 174 -U 237 ; WX 380 ; N iacute ; G 175 -U 238 ; WX 380 ; N icircumflex ; G 176 -U 239 ; WX 380 ; N idieresis ; G 177 -U 240 ; WX 667 ; N eth ; G 178 -U 241 ; WX 727 ; N ntilde ; G 179 -U 242 ; WX 667 ; N ograve ; G 180 -U 243 ; WX 667 ; N oacute ; G 181 -U 244 ; WX 667 ; N ocircumflex ; G 182 -U 245 ; WX 667 ; N otilde ; G 183 -U 246 ; WX 667 ; N odieresis ; G 184 -U 247 ; WX 838 ; N divide ; G 185 -U 248 ; WX 667 ; N oslash ; G 186 -U 249 ; WX 727 ; N ugrave ; G 187 -U 250 ; WX 727 ; N uacute ; G 188 -U 251 ; WX 727 ; N ucircumflex ; G 189 -U 252 ; WX 727 ; N udieresis ; G 190 -U 253 ; WX 581 ; N yacute ; G 191 -U 254 ; WX 699 ; N thorn ; G 192 -U 255 ; WX 581 ; N ydieresis ; G 193 -U 256 ; WX 776 ; N Amacron ; G 194 -U 257 ; WX 648 ; N amacron ; G 195 -U 258 ; WX 776 ; N Abreve ; G 196 -U 259 ; WX 648 ; N abreve ; G 197 -U 260 ; WX 776 ; N Aogonek ; G 198 -U 261 ; WX 648 ; N aogonek ; G 199 -U 262 ; WX 796 ; N Cacute ; G 200 -U 263 ; WX 609 ; N cacute ; G 201 -U 264 ; WX 796 ; N Ccircumflex ; G 202 -U 265 ; WX 609 ; N ccircumflex ; G 203 -U 266 ; WX 796 ; N Cdotaccent ; G 204 -U 267 ; WX 609 ; N cdotaccent ; G 205 -U 268 ; WX 796 ; N Ccaron ; G 206 -U 269 ; WX 609 ; N ccaron ; G 207 -U 270 ; WX 867 ; N Dcaron ; G 208 -U 271 ; WX 699 ; N dcaron ; G 209 -U 272 ; WX 874 ; N Dcroat ; G 210 -U 273 ; WX 699 ; N dmacron ; G 211 -U 274 ; WX 762 ; N Emacron ; G 212 -U 275 ; WX 636 ; N emacron ; G 213 -U 276 ; WX 762 ; N Ebreve ; G 214 -U 277 ; WX 636 ; N ebreve ; G 215 -U 278 ; WX 762 ; N Edotaccent ; G 216 -U 279 ; WX 636 ; N edotaccent ; G 217 -U 280 ; WX 762 ; N Eogonek ; G 218 -U 281 ; WX 636 ; N eogonek ; G 219 -U 282 ; WX 762 ; N Ecaron ; G 220 -U 283 ; WX 636 ; N ecaron ; G 221 -U 284 ; WX 854 ; N Gcircumflex ; G 222 -U 285 ; WX 699 ; N gcircumflex ; G 223 -U 286 ; WX 854 ; N Gbreve ; G 224 -U 287 ; WX 699 ; N gbreve ; G 225 -U 288 ; WX 854 ; N Gdotaccent ; G 226 -U 289 ; WX 699 ; N gdotaccent ; G 227 -U 290 ; WX 854 ; N Gcommaaccent ; G 228 -U 291 ; WX 699 ; N gcommaaccent ; G 229 -U 292 ; WX 945 ; N Hcircumflex ; G 230 -U 293 ; WX 727 ; N hcircumflex ; G 231 -U 294 ; WX 945 ; N Hbar ; G 232 -U 295 ; WX 727 ; N hbar ; G 233 -U 296 ; WX 468 ; N Itilde ; G 234 -U 297 ; WX 380 ; N itilde ; G 235 -U 298 ; WX 468 ; N Imacron ; G 236 -U 299 ; WX 380 ; N imacron ; G 237 -U 300 ; WX 468 ; N Ibreve ; G 238 -U 301 ; WX 380 ; N ibreve ; G 239 -U 302 ; WX 468 ; N Iogonek ; G 240 -U 303 ; WX 380 ; N iogonek ; G 241 -U 304 ; WX 468 ; N Idot ; G 242 -U 305 ; WX 380 ; N dotlessi ; G 243 -U 306 ; WX 942 ; N IJ ; G 244 -U 307 ; WX 751 ; N ij ; G 245 -U 308 ; WX 473 ; N Jcircumflex ; G 246 -U 309 ; WX 362 ; N jcircumflex ; G 247 -U 310 ; WX 869 ; N Kcommaaccent ; G 248 -U 311 ; WX 693 ; N kcommaaccent ; G 249 -U 312 ; WX 693 ; N kgreenlandic ; G 250 -U 313 ; WX 703 ; N Lacute ; G 251 -U 314 ; WX 380 ; N lacute ; G 252 -U 315 ; WX 703 ; N Lcommaaccent ; G 253 -U 316 ; WX 380 ; N lcommaaccent ; G 254 -U 317 ; WX 703 ; N Lcaron ; G 255 -U 318 ; WX 380 ; N lcaron ; G 256 -U 319 ; WX 703 ; N Ldot ; G 257 -U 320 ; WX 380 ; N ldot ; G 258 -U 321 ; WX 710 ; N Lslash ; G 259 -U 322 ; WX 385 ; N lslash ; G 260 -U 323 ; WX 914 ; N Nacute ; G 261 -U 324 ; WX 727 ; N nacute ; G 262 -U 325 ; WX 914 ; N Ncommaaccent ; G 263 -U 326 ; WX 727 ; N ncommaaccent ; G 264 -U 327 ; WX 914 ; N Ncaron ; G 265 -U 328 ; WX 727 ; N ncaron ; G 266 -U 329 ; WX 1008 ; N napostrophe ; G 267 -U 330 ; WX 872 ; N Eng ; G 268 -U 331 ; WX 727 ; N eng ; G 269 -U 332 ; WX 871 ; N Omacron ; G 270 -U 333 ; WX 667 ; N omacron ; G 271 -U 334 ; WX 871 ; N Obreve ; G 272 -U 335 ; WX 667 ; N obreve ; G 273 -U 336 ; WX 871 ; N Ohungarumlaut ; G 274 -U 337 ; WX 667 ; N ohungarumlaut ; G 275 -U 338 ; WX 1180 ; N OE ; G 276 -U 339 ; WX 1028 ; N oe ; G 277 -U 340 ; WX 831 ; N Racute ; G 278 -U 341 ; WX 527 ; N racute ; G 279 -U 342 ; WX 831 ; N Rcommaaccent ; G 280 -U 343 ; WX 527 ; N rcommaaccent ; G 281 -U 344 ; WX 831 ; N Rcaron ; G 282 -U 345 ; WX 527 ; N rcaron ; G 283 -U 346 ; WX 722 ; N Sacute ; G 284 -U 347 ; WX 563 ; N sacute ; G 285 -U 348 ; WX 722 ; N Scircumflex ; G 286 -U 349 ; WX 563 ; N scircumflex ; G 287 -U 350 ; WX 722 ; N Scedilla ; G 288 -U 351 ; WX 563 ; N scedilla ; G 289 -U 352 ; WX 722 ; N Scaron ; G 290 -U 353 ; WX 563 ; N scaron ; G 291 -U 354 ; WX 744 ; N Tcommaaccent ; G 292 -U 355 ; WX 462 ; N tcommaaccent ; G 293 -U 356 ; WX 744 ; N Tcaron ; G 294 -U 357 ; WX 462 ; N tcaron ; G 295 -U 358 ; WX 744 ; N Tbar ; G 296 -U 359 ; WX 462 ; N tbar ; G 297 -U 360 ; WX 872 ; N Utilde ; G 298 -U 361 ; WX 727 ; N utilde ; G 299 -U 362 ; WX 872 ; N Umacron ; G 300 -U 363 ; WX 727 ; N umacron ; G 301 -U 364 ; WX 872 ; N Ubreve ; G 302 -U 365 ; WX 727 ; N ubreve ; G 303 -U 366 ; WX 872 ; N Uring ; G 304 -U 367 ; WX 727 ; N uring ; G 305 -U 368 ; WX 872 ; N Uhungarumlaut ; G 306 -U 369 ; WX 727 ; N uhungarumlaut ; G 307 -U 370 ; WX 872 ; N Uogonek ; G 308 -U 371 ; WX 727 ; N uogonek ; G 309 -U 372 ; WX 1123 ; N Wcircumflex ; G 310 -U 373 ; WX 861 ; N wcircumflex ; G 311 -U 374 ; WX 714 ; N Ycircumflex ; G 312 -U 375 ; WX 581 ; N ycircumflex ; G 313 -U 376 ; WX 714 ; N Ydieresis ; G 314 -U 377 ; WX 730 ; N Zacute ; G 315 -U 378 ; WX 568 ; N zacute ; G 316 -U 379 ; WX 730 ; N Zdotaccent ; G 317 -U 380 ; WX 568 ; N zdotaccent ; G 318 -U 381 ; WX 730 ; N Zcaron ; G 319 -U 382 ; WX 568 ; N zcaron ; G 320 -U 383 ; WX 430 ; N longs ; G 321 -U 384 ; WX 699 ; N uni0180 ; G 322 -U 385 ; WX 845 ; N uni0181 ; G 323 -U 386 ; WX 854 ; N uni0182 ; G 324 -U 387 ; WX 699 ; N uni0183 ; G 325 -U 388 ; WX 854 ; N uni0184 ; G 326 -U 389 ; WX 699 ; N uni0185 ; G 327 -U 390 ; WX 796 ; N uni0186 ; G 328 -U 391 ; WX 796 ; N uni0187 ; G 329 -U 392 ; WX 609 ; N uni0188 ; G 330 -U 393 ; WX 874 ; N uni0189 ; G 331 -U 394 ; WX 867 ; N uni018A ; G 332 -U 395 ; WX 854 ; N uni018B ; G 333 -U 396 ; WX 699 ; N uni018C ; G 334 -U 397 ; WX 667 ; N uni018D ; G 335 -U 398 ; WX 762 ; N uni018E ; G 336 -U 399 ; WX 871 ; N uni018F ; G 337 -U 400 ; WX 721 ; N uni0190 ; G 338 -U 401 ; WX 710 ; N uni0191 ; G 339 -U 402 ; WX 430 ; N florin ; G 340 -U 403 ; WX 854 ; N uni0193 ; G 341 -U 404 ; WX 771 ; N uni0194 ; G 342 -U 405 ; WX 1043 ; N uni0195 ; G 343 -U 406 ; WX 468 ; N uni0196 ; G 344 -U 407 ; WX 468 ; N uni0197 ; G 345 -U 408 ; WX 869 ; N uni0198 ; G 346 -U 409 ; WX 693 ; N uni0199 ; G 347 -U 410 ; WX 380 ; N uni019A ; G 348 -U 411 ; WX 701 ; N uni019B ; G 349 -U 412 ; WX 1058 ; N uni019C ; G 350 -U 413 ; WX 914 ; N uni019D ; G 351 -U 414 ; WX 727 ; N uni019E ; G 352 -U 415 ; WX 871 ; N uni019F ; G 353 -U 416 ; WX 871 ; N Ohorn ; G 354 -U 417 ; WX 667 ; N ohorn ; G 355 -U 418 ; WX 1200 ; N uni01A2 ; G 356 -U 419 ; WX 943 ; N uni01A3 ; G 357 -U 420 ; WX 752 ; N uni01A4 ; G 358 -U 421 ; WX 699 ; N uni01A5 ; G 359 -U 422 ; WX 831 ; N uni01A6 ; G 360 -U 423 ; WX 722 ; N uni01A7 ; G 361 -U 424 ; WX 563 ; N uni01A8 ; G 362 -U 425 ; WX 707 ; N uni01A9 ; G 363 -U 426 ; WX 331 ; N uni01AA ; G 364 -U 427 ; WX 462 ; N uni01AB ; G 365 -U 428 ; WX 744 ; N uni01AC ; G 366 -U 429 ; WX 462 ; N uni01AD ; G 367 -U 430 ; WX 744 ; N uni01AE ; G 368 -U 431 ; WX 872 ; N Uhorn ; G 369 -U 432 ; WX 727 ; N uhorn ; G 370 -U 433 ; WX 890 ; N uni01B1 ; G 371 -U 434 ; WX 890 ; N uni01B2 ; G 372 -U 435 ; WX 714 ; N uni01B3 ; G 373 -U 436 ; WX 708 ; N uni01B4 ; G 374 -U 437 ; WX 730 ; N uni01B5 ; G 375 -U 438 ; WX 568 ; N uni01B6 ; G 376 -U 439 ; WX 657 ; N uni01B7 ; G 377 -U 440 ; WX 657 ; N uni01B8 ; G 378 -U 441 ; WX 657 ; N uni01B9 ; G 379 -U 442 ; WX 657 ; N uni01BA ; G 380 -U 443 ; WX 696 ; N uni01BB ; G 381 -U 444 ; WX 754 ; N uni01BC ; G 382 -U 445 ; WX 568 ; N uni01BD ; G 383 -U 446 ; WX 536 ; N uni01BE ; G 384 -U 447 ; WX 716 ; N uni01BF ; G 385 -U 448 ; WX 295 ; N uni01C0 ; G 386 -U 449 ; WX 492 ; N uni01C1 ; G 387 -U 450 ; WX 459 ; N uni01C2 ; G 388 -U 451 ; WX 295 ; N uni01C3 ; G 389 -U 452 ; WX 1597 ; N uni01C4 ; G 390 -U 453 ; WX 1435 ; N uni01C5 ; G 391 -U 454 ; WX 1267 ; N uni01C6 ; G 392 -U 455 ; WX 1176 ; N uni01C7 ; G 393 -U 456 ; WX 1065 ; N uni01C8 ; G 394 -U 457 ; WX 742 ; N uni01C9 ; G 395 -U 458 ; WX 1387 ; N uni01CA ; G 396 -U 459 ; WX 1276 ; N uni01CB ; G 397 -U 460 ; WX 1089 ; N uni01CC ; G 398 -U 461 ; WX 776 ; N uni01CD ; G 399 -U 462 ; WX 648 ; N uni01CE ; G 400 -U 463 ; WX 468 ; N uni01CF ; G 401 -U 464 ; WX 380 ; N uni01D0 ; G 402 -U 465 ; WX 871 ; N uni01D1 ; G 403 -U 466 ; WX 667 ; N uni01D2 ; G 404 -U 467 ; WX 872 ; N uni01D3 ; G 405 -U 468 ; WX 727 ; N uni01D4 ; G 406 -U 469 ; WX 872 ; N uni01D5 ; G 407 -U 470 ; WX 727 ; N uni01D6 ; G 408 -U 471 ; WX 872 ; N uni01D7 ; G 409 -U 472 ; WX 727 ; N uni01D8 ; G 410 -U 473 ; WX 872 ; N uni01D9 ; G 411 -U 474 ; WX 727 ; N uni01DA ; G 412 -U 475 ; WX 872 ; N uni01DB ; G 413 -U 476 ; WX 727 ; N uni01DC ; G 414 -U 477 ; WX 636 ; N uni01DD ; G 415 -U 478 ; WX 776 ; N uni01DE ; G 416 -U 479 ; WX 648 ; N uni01DF ; G 417 -U 480 ; WX 776 ; N uni01E0 ; G 418 -U 481 ; WX 648 ; N uni01E1 ; G 419 -U 482 ; WX 1034 ; N uni01E2 ; G 420 -U 483 ; WX 975 ; N uni01E3 ; G 421 -U 484 ; WX 896 ; N uni01E4 ; G 422 -U 485 ; WX 699 ; N uni01E5 ; G 423 -U 486 ; WX 854 ; N Gcaron ; G 424 -U 487 ; WX 699 ; N gcaron ; G 425 -U 488 ; WX 869 ; N uni01E8 ; G 426 -U 489 ; WX 693 ; N uni01E9 ; G 427 -U 490 ; WX 871 ; N uni01EA ; G 428 -U 491 ; WX 667 ; N uni01EB ; G 429 -U 492 ; WX 871 ; N uni01EC ; G 430 -U 493 ; WX 667 ; N uni01ED ; G 431 -U 494 ; WX 657 ; N uni01EE ; G 432 -U 495 ; WX 568 ; N uni01EF ; G 433 -U 496 ; WX 380 ; N uni01F0 ; G 434 -U 497 ; WX 1597 ; N uni01F1 ; G 435 -U 498 ; WX 1435 ; N uni01F2 ; G 436 -U 499 ; WX 1267 ; N uni01F3 ; G 437 -U 500 ; WX 854 ; N uni01F4 ; G 438 -U 501 ; WX 699 ; N uni01F5 ; G 439 -U 502 ; WX 1221 ; N uni01F6 ; G 440 -U 503 ; WX 787 ; N uni01F7 ; G 441 -U 504 ; WX 914 ; N uni01F8 ; G 442 -U 505 ; WX 727 ; N uni01F9 ; G 443 -U 506 ; WX 776 ; N Aringacute ; G 444 -U 507 ; WX 648 ; N aringacute ; G 445 -U 508 ; WX 1034 ; N AEacute ; G 446 -U 509 ; WX 975 ; N aeacute ; G 447 -U 510 ; WX 871 ; N Oslashacute ; G 448 -U 511 ; WX 667 ; N oslashacute ; G 449 -U 512 ; WX 776 ; N uni0200 ; G 450 -U 513 ; WX 648 ; N uni0201 ; G 451 -U 514 ; WX 776 ; N uni0202 ; G 452 -U 515 ; WX 648 ; N uni0203 ; G 453 -U 516 ; WX 762 ; N uni0204 ; G 454 -U 517 ; WX 636 ; N uni0205 ; G 455 -U 518 ; WX 762 ; N uni0206 ; G 456 -U 519 ; WX 636 ; N uni0207 ; G 457 -U 520 ; WX 468 ; N uni0208 ; G 458 -U 521 ; WX 380 ; N uni0209 ; G 459 -U 522 ; WX 468 ; N uni020A ; G 460 -U 523 ; WX 380 ; N uni020B ; G 461 -U 524 ; WX 871 ; N uni020C ; G 462 -U 525 ; WX 667 ; N uni020D ; G 463 -U 526 ; WX 871 ; N uni020E ; G 464 -U 527 ; WX 667 ; N uni020F ; G 465 -U 528 ; WX 831 ; N uni0210 ; G 466 -U 529 ; WX 527 ; N uni0211 ; G 467 -U 530 ; WX 831 ; N uni0212 ; G 468 -U 531 ; WX 527 ; N uni0213 ; G 469 -U 532 ; WX 872 ; N uni0214 ; G 470 -U 533 ; WX 727 ; N uni0215 ; G 471 -U 534 ; WX 872 ; N uni0216 ; G 472 -U 535 ; WX 727 ; N uni0217 ; G 473 -U 536 ; WX 722 ; N Scommaaccent ; G 474 -U 537 ; WX 563 ; N scommaaccent ; G 475 -U 538 ; WX 744 ; N uni021A ; G 476 -U 539 ; WX 462 ; N uni021B ; G 477 -U 540 ; WX 690 ; N uni021C ; G 478 -U 541 ; WX 607 ; N uni021D ; G 479 -U 542 ; WX 945 ; N uni021E ; G 480 -U 543 ; WX 727 ; N uni021F ; G 481 -U 544 ; WX 872 ; N uni0220 ; G 482 -U 545 ; WX 791 ; N uni0221 ; G 483 -U 546 ; WX 703 ; N uni0222 ; G 484 -U 547 ; WX 616 ; N uni0223 ; G 485 -U 548 ; WX 730 ; N uni0224 ; G 486 -U 549 ; WX 568 ; N uni0225 ; G 487 -U 550 ; WX 776 ; N uni0226 ; G 488 -U 551 ; WX 648 ; N uni0227 ; G 489 -U 552 ; WX 762 ; N uni0228 ; G 490 -U 553 ; WX 636 ; N uni0229 ; G 491 -U 554 ; WX 871 ; N uni022A ; G 492 -U 555 ; WX 667 ; N uni022B ; G 493 -U 556 ; WX 871 ; N uni022C ; G 494 -U 557 ; WX 667 ; N uni022D ; G 495 -U 558 ; WX 871 ; N uni022E ; G 496 -U 559 ; WX 667 ; N uni022F ; G 497 -U 560 ; WX 871 ; N uni0230 ; G 498 -U 561 ; WX 667 ; N uni0231 ; G 499 -U 562 ; WX 714 ; N uni0232 ; G 500 -U 563 ; WX 581 ; N uni0233 ; G 501 -U 564 ; WX 573 ; N uni0234 ; G 502 -U 565 ; WX 922 ; N uni0235 ; G 503 -U 566 ; WX 564 ; N uni0236 ; G 504 -U 567 ; WX 362 ; N dotlessj ; G 505 -U 568 ; WX 1031 ; N uni0238 ; G 506 -U 569 ; WX 1031 ; N uni0239 ; G 507 -U 570 ; WX 776 ; N uni023A ; G 508 -U 571 ; WX 796 ; N uni023B ; G 509 -U 572 ; WX 609 ; N uni023C ; G 510 -U 573 ; WX 703 ; N uni023D ; G 511 -U 574 ; WX 744 ; N uni023E ; G 512 -U 575 ; WX 563 ; N uni023F ; G 513 -U 576 ; WX 568 ; N uni0240 ; G 514 -U 577 ; WX 660 ; N uni0241 ; G 515 -U 578 ; WX 547 ; N uni0242 ; G 516 -U 579 ; WX 845 ; N uni0243 ; G 517 -U 580 ; WX 872 ; N uni0244 ; G 518 -U 581 ; WX 776 ; N uni0245 ; G 519 -U 582 ; WX 762 ; N uni0246 ; G 520 -U 583 ; WX 636 ; N uni0247 ; G 521 -U 584 ; WX 473 ; N uni0248 ; G 522 -U 585 ; WX 387 ; N uni0249 ; G 523 -U 586 ; WX 848 ; N uni024A ; G 524 -U 587 ; WX 699 ; N uni024B ; G 525 -U 588 ; WX 831 ; N uni024C ; G 526 -U 589 ; WX 527 ; N uni024D ; G 527 -U 590 ; WX 714 ; N uni024E ; G 528 -U 591 ; WX 581 ; N uni024F ; G 529 -U 592 ; WX 648 ; N uni0250 ; G 530 -U 593 ; WX 699 ; N uni0251 ; G 531 -U 594 ; WX 699 ; N uni0252 ; G 532 -U 595 ; WX 699 ; N uni0253 ; G 533 -U 596 ; WX 609 ; N uni0254 ; G 534 -U 597 ; WX 609 ; N uni0255 ; G 535 -U 598 ; WX 699 ; N uni0256 ; G 536 -U 599 ; WX 730 ; N uni0257 ; G 537 -U 600 ; WX 636 ; N uni0258 ; G 538 -U 601 ; WX 636 ; N uni0259 ; G 539 -U 602 ; WX 907 ; N uni025A ; G 540 -U 603 ; WX 608 ; N uni025B ; G 541 -U 604 ; WX 562 ; N uni025C ; G 542 -U 605 ; WX 907 ; N uni025D ; G 543 -U 606 ; WX 714 ; N uni025E ; G 544 -U 607 ; WX 387 ; N uni025F ; G 545 -U 608 ; WX 699 ; N uni0260 ; G 546 -U 609 ; WX 699 ; N uni0261 ; G 547 -U 610 ; WX 638 ; N uni0262 ; G 548 -U 611 ; WX 601 ; N uni0263 ; G 549 -U 612 ; WX 627 ; N uni0264 ; G 550 -U 613 ; WX 727 ; N uni0265 ; G 551 -U 614 ; WX 727 ; N uni0266 ; G 552 -U 615 ; WX 727 ; N uni0267 ; G 553 -U 616 ; WX 380 ; N uni0268 ; G 554 -U 617 ; WX 380 ; N uni0269 ; G 555 -U 618 ; WX 380 ; N uni026A ; G 556 -U 619 ; WX 409 ; N uni026B ; G 557 -U 620 ; WX 514 ; N uni026C ; G 558 -U 621 ; WX 380 ; N uni026D ; G 559 -U 622 ; WX 795 ; N uni026E ; G 560 -U 623 ; WX 1058 ; N uni026F ; G 561 -U 624 ; WX 1058 ; N uni0270 ; G 562 -U 625 ; WX 1058 ; N uni0271 ; G 563 -U 626 ; WX 727 ; N uni0272 ; G 564 -U 627 ; WX 727 ; N uni0273 ; G 565 -U 628 ; WX 712 ; N uni0274 ; G 566 -U 629 ; WX 667 ; N uni0275 ; G 567 -U 630 ; WX 1061 ; N uni0276 ; G 568 -U 631 ; WX 944 ; N uni0277 ; G 569 -U 632 ; WX 797 ; N uni0278 ; G 570 -U 633 ; WX 571 ; N uni0279 ; G 571 -U 634 ; WX 571 ; N uni027A ; G 572 -U 635 ; WX 571 ; N uni027B ; G 573 -U 636 ; WX 527 ; N uni027C ; G 574 -U 637 ; WX 527 ; N uni027D ; G 575 -U 638 ; WX 452 ; N uni027E ; G 576 -U 639 ; WX 487 ; N uni027F ; G 577 -U 640 ; WX 694 ; N uni0280 ; G 578 -U 641 ; WX 694 ; N uni0281 ; G 579 -U 642 ; WX 563 ; N uni0282 ; G 580 -U 643 ; WX 331 ; N uni0283 ; G 581 -U 644 ; WX 430 ; N uni0284 ; G 582 -U 645 ; WX 540 ; N uni0285 ; G 583 -U 646 ; WX 331 ; N uni0286 ; G 584 -U 647 ; WX 492 ; N uni0287 ; G 585 -U 648 ; WX 462 ; N uni0288 ; G 586 -U 649 ; WX 727 ; N uni0289 ; G 587 -U 650 ; WX 679 ; N uni028A ; G 588 -U 651 ; WX 694 ; N uni028B ; G 589 -U 652 ; WX 641 ; N uni028C ; G 590 -U 653 ; WX 907 ; N uni028D ; G 591 -U 654 ; WX 635 ; N uni028E ; G 592 -U 655 ; WX 727 ; N uni028F ; G 593 -U 656 ; WX 568 ; N uni0290 ; G 594 -U 657 ; WX 568 ; N uni0291 ; G 595 -U 658 ; WX 568 ; N uni0292 ; G 596 -U 659 ; WX 568 ; N uni0293 ; G 597 -U 660 ; WX 551 ; N uni0294 ; G 598 -U 661 ; WX 551 ; N uni0295 ; G 599 -U 662 ; WX 551 ; N uni0296 ; G 600 -U 663 ; WX 545 ; N uni0297 ; G 601 -U 664 ; WX 871 ; N uni0298 ; G 602 -U 665 ; WX 695 ; N uni0299 ; G 603 -U 666 ; WX 714 ; N uni029A ; G 604 -U 667 ; WX 689 ; N uni029B ; G 605 -U 668 ; WX 732 ; N uni029C ; G 606 -U 669 ; WX 384 ; N uni029D ; G 607 -U 670 ; WX 740 ; N uni029E ; G 608 -U 671 ; WX 617 ; N uni029F ; G 609 -U 672 ; WX 699 ; N uni02A0 ; G 610 -U 673 ; WX 551 ; N uni02A1 ; G 611 -U 674 ; WX 551 ; N uni02A2 ; G 612 -U 675 ; WX 1117 ; N uni02A3 ; G 613 -U 676 ; WX 1179 ; N uni02A4 ; G 614 -U 677 ; WX 1117 ; N uni02A5 ; G 615 -U 678 ; WX 938 ; N uni02A6 ; G 616 -U 679 ; WX 715 ; N uni02A7 ; G 617 -U 680 ; WX 946 ; N uni02A8 ; G 618 -U 681 ; WX 1039 ; N uni02A9 ; G 619 -U 682 ; WX 870 ; N uni02AA ; G 620 -U 683 ; WX 795 ; N uni02AB ; G 621 -U 684 ; WX 662 ; N uni02AC ; G 622 -U 685 ; WX 443 ; N uni02AD ; G 623 -U 686 ; WX 613 ; N uni02AE ; G 624 -U 687 ; WX 717 ; N uni02AF ; G 625 -U 688 ; WX 521 ; N uni02B0 ; G 626 -U 689 ; WX 519 ; N uni02B1 ; G 627 -U 690 ; WX 313 ; N uni02B2 ; G 628 -U 691 ; WX 414 ; N uni02B3 ; G 629 -U 692 ; WX 414 ; N uni02B4 ; G 630 -U 693 ; WX 480 ; N uni02B5 ; G 631 -U 694 ; WX 527 ; N uni02B6 ; G 632 -U 695 ; WX 662 ; N uni02B7 ; G 633 -U 696 ; WX 485 ; N uni02B8 ; G 634 -U 697 ; WX 302 ; N uni02B9 ; G 635 -U 698 ; WX 521 ; N uni02BA ; G 636 -U 699 ; WX 348 ; N uni02BB ; G 637 -U 700 ; WX 348 ; N uni02BC ; G 638 -U 701 ; WX 348 ; N uni02BD ; G 639 -U 702 ; WX 366 ; N uni02BE ; G 640 -U 703 ; WX 366 ; N uni02BF ; G 641 -U 704 ; WX 313 ; N uni02C0 ; G 642 -U 705 ; WX 313 ; N uni02C1 ; G 643 -U 706 ; WX 500 ; N uni02C2 ; G 644 -U 707 ; WX 500 ; N uni02C3 ; G 645 -U 708 ; WX 500 ; N uni02C4 ; G 646 -U 709 ; WX 500 ; N uni02C5 ; G 647 -U 710 ; WX 500 ; N circumflex ; G 648 -U 711 ; WX 500 ; N caron ; G 649 -U 712 ; WX 282 ; N uni02C8 ; G 650 -U 713 ; WX 500 ; N uni02C9 ; G 651 -U 714 ; WX 500 ; N uni02CA ; G 652 -U 715 ; WX 500 ; N uni02CB ; G 653 -U 716 ; WX 282 ; N uni02CC ; G 654 -U 717 ; WX 500 ; N uni02CD ; G 655 -U 720 ; WX 369 ; N uni02D0 ; G 656 -U 721 ; WX 369 ; N uni02D1 ; G 657 -U 722 ; WX 366 ; N uni02D2 ; G 658 -U 723 ; WX 366 ; N uni02D3 ; G 659 -U 726 ; WX 392 ; N uni02D6 ; G 660 -U 727 ; WX 392 ; N uni02D7 ; G 661 -U 728 ; WX 500 ; N breve ; G 662 -U 729 ; WX 500 ; N dotaccent ; G 663 -U 730 ; WX 500 ; N ring ; G 664 -U 731 ; WX 500 ; N ogonek ; G 665 -U 732 ; WX 500 ; N tilde ; G 666 -U 733 ; WX 500 ; N hungarumlaut ; G 667 -U 734 ; WX 417 ; N uni02DE ; G 668 -U 736 ; WX 378 ; N uni02E0 ; G 669 -U 737 ; WX 292 ; N uni02E1 ; G 670 -U 738 ; WX 395 ; N uni02E2 ; G 671 -U 739 ; WX 475 ; N uni02E3 ; G 672 -U 740 ; WX 313 ; N uni02E4 ; G 673 -U 741 ; WX 500 ; N uni02E5 ; G 674 -U 742 ; WX 500 ; N uni02E6 ; G 675 -U 743 ; WX 500 ; N uni02E7 ; G 676 -U 744 ; WX 500 ; N uni02E8 ; G 677 -U 745 ; WX 500 ; N uni02E9 ; G 678 -U 748 ; WX 500 ; N uni02EC ; G 679 -U 750 ; WX 553 ; N uni02EE ; G 680 -U 751 ; WX 500 ; N uni02EF ; G 681 -U 752 ; WX 500 ; N uni02F0 ; G 682 -U 755 ; WX 500 ; N uni02F3 ; G 683 -U 759 ; WX 500 ; N uni02F7 ; G 684 -U 768 ; WX 0 ; N gravecomb ; G 685 -U 769 ; WX 0 ; N acutecomb ; G 686 -U 770 ; WX 0 ; N uni0302 ; G 687 -U 771 ; WX 0 ; N tildecomb ; G 688 -U 772 ; WX 0 ; N uni0304 ; G 689 -U 773 ; WX 0 ; N uni0305 ; G 690 -U 774 ; WX 0 ; N uni0306 ; G 691 -U 775 ; WX 0 ; N uni0307 ; G 692 -U 776 ; WX 0 ; N uni0308 ; G 693 -U 777 ; WX 0 ; N hookabovecomb ; G 694 -U 778 ; WX 0 ; N uni030A ; G 695 -U 779 ; WX 0 ; N uni030B ; G 696 -U 780 ; WX 0 ; N uni030C ; G 697 -U 781 ; WX 0 ; N uni030D ; G 698 -U 782 ; WX 0 ; N uni030E ; G 699 -U 783 ; WX 0 ; N uni030F ; G 700 -U 784 ; WX 0 ; N uni0310 ; G 701 -U 785 ; WX 0 ; N uni0311 ; G 702 -U 786 ; WX 0 ; N uni0312 ; G 703 -U 787 ; WX 0 ; N uni0313 ; G 704 -U 788 ; WX 0 ; N uni0314 ; G 705 -U 789 ; WX 0 ; N uni0315 ; G 706 -U 790 ; WX 0 ; N uni0316 ; G 707 -U 791 ; WX 0 ; N uni0317 ; G 708 -U 792 ; WX 0 ; N uni0318 ; G 709 -U 793 ; WX 0 ; N uni0319 ; G 710 -U 794 ; WX 0 ; N uni031A ; G 711 -U 795 ; WX 0 ; N uni031B ; G 712 -U 796 ; WX 0 ; N uni031C ; G 713 -U 797 ; WX 0 ; N uni031D ; G 714 -U 798 ; WX 0 ; N uni031E ; G 715 -U 799 ; WX 0 ; N uni031F ; G 716 -U 800 ; WX 0 ; N uni0320 ; G 717 -U 801 ; WX 0 ; N uni0321 ; G 718 -U 802 ; WX 0 ; N uni0322 ; G 719 -U 803 ; WX 0 ; N dotbelowcomb ; G 720 -U 804 ; WX 0 ; N uni0324 ; G 721 -U 805 ; WX 0 ; N uni0325 ; G 722 -U 806 ; WX 0 ; N uni0326 ; G 723 -U 807 ; WX 0 ; N uni0327 ; G 724 -U 808 ; WX 0 ; N uni0328 ; G 725 -U 809 ; WX 0 ; N uni0329 ; G 726 -U 810 ; WX 0 ; N uni032A ; G 727 -U 811 ; WX 0 ; N uni032B ; G 728 -U 812 ; WX 0 ; N uni032C ; G 729 -U 813 ; WX 0 ; N uni032D ; G 730 -U 814 ; WX 0 ; N uni032E ; G 731 -U 815 ; WX 0 ; N uni032F ; G 732 -U 816 ; WX 0 ; N uni0330 ; G 733 -U 817 ; WX 0 ; N uni0331 ; G 734 -U 818 ; WX 0 ; N uni0332 ; G 735 -U 819 ; WX 0 ; N uni0333 ; G 736 -U 820 ; WX 0 ; N uni0334 ; G 737 -U 821 ; WX 0 ; N uni0335 ; G 738 -U 822 ; WX 0 ; N uni0336 ; G 739 -U 823 ; WX 0 ; N uni0337 ; G 740 -U 824 ; WX 0 ; N uni0338 ; G 741 -U 825 ; WX 0 ; N uni0339 ; G 742 -U 826 ; WX 0 ; N uni033A ; G 743 -U 827 ; WX 0 ; N uni033B ; G 744 -U 828 ; WX 0 ; N uni033C ; G 745 -U 829 ; WX 0 ; N uni033D ; G 746 -U 830 ; WX 0 ; N uni033E ; G 747 -U 831 ; WX 0 ; N uni033F ; G 748 -U 835 ; WX 0 ; N uni0343 ; G 749 -U 847 ; WX 0 ; N uni034F ; G 750 -U 856 ; WX 0 ; N uni0358 ; G 751 -U 864 ; WX 0 ; N uni0360 ; G 752 -U 865 ; WX 0 ; N uni0361 ; G 753 -U 880 ; WX 779 ; N uni0370 ; G 754 -U 881 ; WX 576 ; N uni0371 ; G 755 -U 882 ; WX 803 ; N uni0372 ; G 756 -U 883 ; WX 777 ; N uni0373 ; G 757 -U 884 ; WX 302 ; N uni0374 ; G 758 -U 885 ; WX 302 ; N uni0375 ; G 759 -U 886 ; WX 963 ; N uni0376 ; G 760 -U 887 ; WX 737 ; N uni0377 ; G 761 -U 890 ; WX 500 ; N uni037A ; G 762 -U 891 ; WX 609 ; N uni037B ; G 763 -U 892 ; WX 609 ; N uni037C ; G 764 -U 893 ; WX 609 ; N uni037D ; G 765 -U 894 ; WX 369 ; N uni037E ; G 766 -U 895 ; WX 473 ; N uni037F ; G 767 -U 900 ; WX 500 ; N tonos ; G 768 -U 901 ; WX 500 ; N dieresistonos ; G 769 -U 902 ; WX 776 ; N Alphatonos ; G 770 -U 903 ; WX 348 ; N anoteleia ; G 771 -U 904 ; WX 947 ; N Epsilontonos ; G 772 -U 905 ; WX 1118 ; N Etatonos ; G 773 -U 906 ; WX 662 ; N Iotatonos ; G 774 -U 908 ; WX 887 ; N Omicrontonos ; G 775 -U 910 ; WX 953 ; N Upsilontonos ; G 776 -U 911 ; WX 911 ; N Omegatonos ; G 777 -U 912 ; WX 484 ; N iotadieresistonos ; G 778 -U 913 ; WX 776 ; N Alpha ; G 779 -U 914 ; WX 845 ; N Beta ; G 780 -U 915 ; WX 710 ; N Gamma ; G 781 -U 916 ; WX 776 ; N uni0394 ; G 782 -U 917 ; WX 762 ; N Epsilon ; G 783 -U 918 ; WX 730 ; N Zeta ; G 784 -U 919 ; WX 945 ; N Eta ; G 785 -U 920 ; WX 871 ; N Theta ; G 786 -U 921 ; WX 468 ; N Iota ; G 787 -U 922 ; WX 869 ; N Kappa ; G 788 -U 923 ; WX 776 ; N Lambda ; G 789 -U 924 ; WX 1107 ; N Mu ; G 790 -U 925 ; WX 914 ; N Nu ; G 791 -U 926 ; WX 704 ; N Xi ; G 792 -U 927 ; WX 871 ; N Omicron ; G 793 -U 928 ; WX 944 ; N Pi ; G 794 -U 929 ; WX 752 ; N Rho ; G 795 -U 931 ; WX 707 ; N Sigma ; G 796 -U 932 ; WX 744 ; N Tau ; G 797 -U 933 ; WX 714 ; N Upsilon ; G 798 -U 934 ; WX 871 ; N Phi ; G 799 -U 935 ; WX 776 ; N Chi ; G 800 -U 936 ; WX 913 ; N Psi ; G 801 -U 937 ; WX 890 ; N Omega ; G 802 -U 938 ; WX 468 ; N Iotadieresis ; G 803 -U 939 ; WX 714 ; N Upsilondieresis ; G 804 -U 940 ; WX 770 ; N alphatonos ; G 805 -U 941 ; WX 608 ; N epsilontonos ; G 806 -U 942 ; WX 727 ; N etatonos ; G 807 -U 943 ; WX 484 ; N iotatonos ; G 808 -U 944 ; WX 694 ; N upsilondieresistonos ; G 809 -U 945 ; WX 770 ; N alpha ; G 810 -U 946 ; WX 664 ; N beta ; G 811 -U 947 ; WX 660 ; N gamma ; G 812 -U 948 ; WX 667 ; N delta ; G 813 -U 949 ; WX 608 ; N epsilon ; G 814 -U 950 ; WX 592 ; N zeta ; G 815 -U 951 ; WX 727 ; N eta ; G 816 -U 952 ; WX 667 ; N theta ; G 817 -U 953 ; WX 484 ; N iota ; G 818 -U 954 ; WX 750 ; N kappa ; G 819 -U 955 ; WX 701 ; N lambda ; G 820 -U 956 ; WX 732 ; N uni03BC ; G 821 -U 957 ; WX 694 ; N nu ; G 822 -U 958 ; WX 592 ; N xi ; G 823 -U 959 ; WX 667 ; N omicron ; G 824 -U 960 ; WX 732 ; N pi ; G 825 -U 961 ; WX 665 ; N rho ; G 826 -U 962 ; WX 609 ; N sigma1 ; G 827 -U 963 ; WX 737 ; N sigma ; G 828 -U 964 ; WX 673 ; N tau ; G 829 -U 965 ; WX 694 ; N upsilon ; G 830 -U 966 ; WX 905 ; N phi ; G 831 -U 967 ; WX 658 ; N chi ; G 832 -U 968 ; WX 941 ; N psi ; G 833 -U 969 ; WX 952 ; N omega ; G 834 -U 970 ; WX 484 ; N iotadieresis ; G 835 -U 971 ; WX 694 ; N upsilondieresis ; G 836 -U 972 ; WX 667 ; N omicrontonos ; G 837 -U 973 ; WX 694 ; N upsilontonos ; G 838 -U 974 ; WX 952 ; N omegatonos ; G 839 -U 975 ; WX 869 ; N uni03CF ; G 840 -U 976 ; WX 667 ; N uni03D0 ; G 841 -U 977 ; WX 849 ; N theta1 ; G 842 -U 978 ; WX 764 ; N Upsilon1 ; G 843 -U 979 ; WX 969 ; N uni03D3 ; G 844 -U 980 ; WX 764 ; N uni03D4 ; G 845 -U 981 ; WX 941 ; N phi1 ; G 846 -U 982 ; WX 952 ; N omega1 ; G 847 -U 983 ; WX 655 ; N uni03D7 ; G 848 -U 984 ; WX 871 ; N uni03D8 ; G 849 -U 985 ; WX 667 ; N uni03D9 ; G 850 -U 986 ; WX 796 ; N uni03DA ; G 851 -U 987 ; WX 609 ; N uni03DB ; G 852 -U 988 ; WX 710 ; N uni03DC ; G 853 -U 989 ; WX 527 ; N uni03DD ; G 854 -U 990 ; WX 590 ; N uni03DE ; G 855 -U 991 ; WX 660 ; N uni03DF ; G 856 -U 992 ; WX 796 ; N uni03E0 ; G 857 -U 993 ; WX 667 ; N uni03E1 ; G 858 -U 1008 ; WX 655 ; N uni03F0 ; G 859 -U 1009 ; WX 665 ; N uni03F1 ; G 860 -U 1010 ; WX 609 ; N uni03F2 ; G 861 -U 1011 ; WX 362 ; N uni03F3 ; G 862 -U 1012 ; WX 871 ; N uni03F4 ; G 863 -U 1013 ; WX 609 ; N uni03F5 ; G 864 -U 1014 ; WX 609 ; N uni03F6 ; G 865 -U 1015 ; WX 757 ; N uni03F7 ; G 866 -U 1016 ; WX 699 ; N uni03F8 ; G 867 -U 1017 ; WX 796 ; N uni03F9 ; G 868 -U 1018 ; WX 1107 ; N uni03FA ; G 869 -U 1019 ; WX 860 ; N uni03FB ; G 870 -U 1020 ; WX 692 ; N uni03FC ; G 871 -U 1021 ; WX 796 ; N uni03FD ; G 872 -U 1022 ; WX 796 ; N uni03FE ; G 873 -U 1023 ; WX 796 ; N uni03FF ; G 874 -U 1024 ; WX 762 ; N uni0400 ; G 875 -U 1025 ; WX 762 ; N uni0401 ; G 876 -U 1026 ; WX 901 ; N uni0402 ; G 877 -U 1027 ; WX 690 ; N uni0403 ; G 878 -U 1028 ; WX 795 ; N uni0404 ; G 879 -U 1029 ; WX 722 ; N uni0405 ; G 880 -U 1030 ; WX 468 ; N uni0406 ; G 881 -U 1031 ; WX 468 ; N uni0407 ; G 882 -U 1032 ; WX 473 ; N uni0408 ; G 883 -U 1033 ; WX 1202 ; N uni0409 ; G 884 -U 1034 ; WX 1262 ; N uni040A ; G 885 -U 1035 ; WX 963 ; N uni040B ; G 886 -U 1036 ; WX 910 ; N uni040C ; G 887 -U 1037 ; WX 945 ; N uni040D ; G 888 -U 1038 ; WX 812 ; N uni040E ; G 889 -U 1039 ; WX 945 ; N uni040F ; G 890 -U 1040 ; WX 814 ; N uni0410 ; G 891 -U 1041 ; WX 854 ; N uni0411 ; G 892 -U 1042 ; WX 845 ; N uni0412 ; G 893 -U 1043 ; WX 690 ; N uni0413 ; G 894 -U 1044 ; WX 889 ; N uni0414 ; G 895 -U 1045 ; WX 762 ; N uni0415 ; G 896 -U 1046 ; WX 1312 ; N uni0416 ; G 897 -U 1047 ; WX 721 ; N uni0417 ; G 898 -U 1048 ; WX 945 ; N uni0418 ; G 899 -U 1049 ; WX 945 ; N uni0419 ; G 900 -U 1050 ; WX 910 ; N uni041A ; G 901 -U 1051 ; WX 884 ; N uni041B ; G 902 -U 1052 ; WX 1107 ; N uni041C ; G 903 -U 1053 ; WX 945 ; N uni041D ; G 904 -U 1054 ; WX 871 ; N uni041E ; G 905 -U 1055 ; WX 944 ; N uni041F ; G 906 -U 1056 ; WX 752 ; N uni0420 ; G 907 -U 1057 ; WX 796 ; N uni0421 ; G 908 -U 1058 ; WX 744 ; N uni0422 ; G 909 -U 1059 ; WX 812 ; N uni0423 ; G 910 -U 1060 ; WX 949 ; N uni0424 ; G 911 -U 1061 ; WX 776 ; N uni0425 ; G 912 -U 1062 ; WX 966 ; N uni0426 ; G 913 -U 1063 ; WX 913 ; N uni0427 ; G 914 -U 1064 ; WX 1268 ; N uni0428 ; G 915 -U 1065 ; WX 1293 ; N uni0429 ; G 916 -U 1066 ; WX 957 ; N uni042A ; G 917 -U 1067 ; WX 1202 ; N uni042B ; G 918 -U 1068 ; WX 825 ; N uni042C ; G 919 -U 1069 ; WX 795 ; N uni042D ; G 920 -U 1070 ; WX 1287 ; N uni042E ; G 921 -U 1071 ; WX 882 ; N uni042F ; G 922 -U 1072 ; WX 648 ; N uni0430 ; G 923 -U 1073 ; WX 667 ; N uni0431 ; G 924 -U 1074 ; WX 695 ; N uni0432 ; G 925 -U 1075 ; WX 613 ; N uni0433 ; G 926 -U 1076 ; WX 667 ; N uni0434 ; G 927 -U 1077 ; WX 636 ; N uni0435 ; G 928 -U 1078 ; WX 1010 ; N uni0436 ; G 929 -U 1079 ; WX 638 ; N uni0437 ; G 930 -U 1080 ; WX 742 ; N uni0438 ; G 931 -U 1081 ; WX 742 ; N uni0439 ; G 932 -U 1082 ; WX 722 ; N uni043A ; G 933 -U 1083 ; WX 705 ; N uni043B ; G 934 -U 1084 ; WX 869 ; N uni043C ; G 935 -U 1085 ; WX 732 ; N uni043D ; G 936 -U 1086 ; WX 667 ; N uni043E ; G 937 -U 1087 ; WX 732 ; N uni043F ; G 938 -U 1088 ; WX 699 ; N uni0440 ; G 939 -U 1089 ; WX 609 ; N uni0441 ; G 940 -U 1090 ; WX 620 ; N uni0442 ; G 941 -U 1091 ; WX 640 ; N uni0443 ; G 942 -U 1092 ; WX 902 ; N uni0444 ; G 943 -U 1093 ; WX 596 ; N uni0445 ; G 944 -U 1094 ; WX 739 ; N uni0446 ; G 945 -U 1095 ; WX 732 ; N uni0447 ; G 946 -U 1096 ; WX 1075 ; N uni0448 ; G 947 -U 1097 ; WX 1082 ; N uni0449 ; G 948 -U 1098 ; WX 767 ; N uni044A ; G 949 -U 1099 ; WX 1002 ; N uni044B ; G 950 -U 1100 ; WX 679 ; N uni044C ; G 951 -U 1101 ; WX 609 ; N uni044D ; G 952 -U 1102 ; WX 1025 ; N uni044E ; G 953 -U 1103 ; WX 739 ; N uni044F ; G 954 -U 1104 ; WX 636 ; N uni0450 ; G 955 -U 1105 ; WX 636 ; N uni0451 ; G 956 -U 1106 ; WX 719 ; N uni0452 ; G 957 -U 1107 ; WX 613 ; N uni0453 ; G 958 -U 1108 ; WX 609 ; N uni0454 ; G 959 -U 1109 ; WX 563 ; N uni0455 ; G 960 -U 1110 ; WX 380 ; N uni0456 ; G 961 -U 1111 ; WX 380 ; N uni0457 ; G 962 -U 1112 ; WX 362 ; N uni0458 ; G 963 -U 1113 ; WX 988 ; N uni0459 ; G 964 -U 1114 ; WX 1015 ; N uni045A ; G 965 -U 1115 ; WX 727 ; N uni045B ; G 966 -U 1116 ; WX 722 ; N uni045C ; G 967 -U 1117 ; WX 742 ; N uni045D ; G 968 -U 1118 ; WX 640 ; N uni045E ; G 969 -U 1119 ; WX 732 ; N uni045F ; G 970 -U 1122 ; WX 880 ; N uni0462 ; G 971 -U 1123 ; WX 703 ; N uni0463 ; G 972 -U 1124 ; WX 1195 ; N uni0464 ; G 973 -U 1125 ; WX 963 ; N uni0465 ; G 974 -U 1130 ; WX 1312 ; N uni046A ; G 975 -U 1131 ; WX 1010 ; N uni046B ; G 976 -U 1132 ; WX 1630 ; N uni046C ; G 977 -U 1133 ; WX 1297 ; N uni046D ; G 978 -U 1136 ; WX 1096 ; N uni0470 ; G 979 -U 1137 ; WX 1105 ; N uni0471 ; G 980 -U 1138 ; WX 871 ; N uni0472 ; G 981 -U 1139 ; WX 652 ; N uni0473 ; G 982 -U 1140 ; WX 916 ; N uni0474 ; G 983 -U 1141 ; WX 749 ; N uni0475 ; G 984 -U 1142 ; WX 916 ; N uni0476 ; G 985 -U 1143 ; WX 749 ; N uni0477 ; G 986 -U 1164 ; WX 846 ; N uni048C ; G 987 -U 1165 ; WX 673 ; N uni048D ; G 988 -U 1168 ; WX 700 ; N uni0490 ; G 989 -U 1169 ; WX 618 ; N uni0491 ; G 990 -U 1170 ; WX 690 ; N uni0492 ; G 991 -U 1171 ; WX 613 ; N uni0493 ; G 992 -U 1172 ; WX 868 ; N uni0494 ; G 993 -U 1173 ; WX 716 ; N uni0495 ; G 994 -U 1174 ; WX 1312 ; N uni0496 ; G 995 -U 1175 ; WX 1010 ; N uni0497 ; G 996 -U 1176 ; WX 721 ; N uni0498 ; G 997 -U 1177 ; WX 638 ; N uni0499 ; G 998 -U 1178 ; WX 947 ; N uni049A ; G 999 -U 1179 ; WX 744 ; N uni049B ; G 1000 -U 1182 ; WX 910 ; N uni049E ; G 1001 -U 1183 ; WX 722 ; N uni049F ; G 1002 -U 1184 ; WX 1041 ; N uni04A0 ; G 1003 -U 1185 ; WX 827 ; N uni04A1 ; G 1004 -U 1186 ; WX 966 ; N uni04A2 ; G 1005 -U 1187 ; WX 739 ; N uni04A3 ; G 1006 -U 1188 ; WX 1167 ; N uni04A4 ; G 1007 -U 1189 ; WX 956 ; N uni04A5 ; G 1008 -U 1190 ; WX 1345 ; N uni04A6 ; G 1009 -U 1191 ; WX 1059 ; N uni04A7 ; G 1010 -U 1194 ; WX 796 ; N uni04AA ; G 1011 -U 1195 ; WX 609 ; N uni04AB ; G 1012 -U 1196 ; WX 744 ; N uni04AC ; G 1013 -U 1197 ; WX 620 ; N uni04AD ; G 1014 -U 1198 ; WX 714 ; N uni04AE ; G 1015 -U 1199 ; WX 581 ; N uni04AF ; G 1016 -U 1200 ; WX 714 ; N uni04B0 ; G 1017 -U 1201 ; WX 581 ; N uni04B1 ; G 1018 -U 1202 ; WX 866 ; N uni04B2 ; G 1019 -U 1203 ; WX 649 ; N uni04B3 ; G 1020 -U 1204 ; WX 1022 ; N uni04B4 ; G 1021 -U 1205 ; WX 807 ; N uni04B5 ; G 1022 -U 1206 ; WX 928 ; N uni04B6 ; G 1023 -U 1207 ; WX 739 ; N uni04B7 ; G 1024 -U 1210 ; WX 910 ; N uni04BA ; G 1025 -U 1211 ; WX 727 ; N uni04BB ; G 1026 -U 1216 ; WX 468 ; N uni04C0 ; G 1027 -U 1217 ; WX 1312 ; N uni04C1 ; G 1028 -U 1218 ; WX 1010 ; N uni04C2 ; G 1029 -U 1219 ; WX 869 ; N uni04C3 ; G 1030 -U 1220 ; WX 693 ; N uni04C4 ; G 1031 -U 1223 ; WX 945 ; N uni04C7 ; G 1032 -U 1224 ; WX 732 ; N uni04C8 ; G 1033 -U 1227 ; WX 913 ; N uni04CB ; G 1034 -U 1228 ; WX 732 ; N uni04CC ; G 1035 -U 1231 ; WX 380 ; N uni04CF ; G 1036 -U 1232 ; WX 814 ; N uni04D0 ; G 1037 -U 1233 ; WX 648 ; N uni04D1 ; G 1038 -U 1234 ; WX 814 ; N uni04D2 ; G 1039 -U 1235 ; WX 648 ; N uni04D3 ; G 1040 -U 1236 ; WX 1034 ; N uni04D4 ; G 1041 -U 1237 ; WX 975 ; N uni04D5 ; G 1042 -U 1238 ; WX 762 ; N uni04D6 ; G 1043 -U 1239 ; WX 636 ; N uni04D7 ; G 1044 -U 1240 ; WX 871 ; N uni04D8 ; G 1045 -U 1241 ; WX 636 ; N uni04D9 ; G 1046 -U 1242 ; WX 871 ; N uni04DA ; G 1047 -U 1243 ; WX 636 ; N uni04DB ; G 1048 -U 1244 ; WX 1312 ; N uni04DC ; G 1049 -U 1245 ; WX 1010 ; N uni04DD ; G 1050 -U 1246 ; WX 721 ; N uni04DE ; G 1051 -U 1247 ; WX 638 ; N uni04DF ; G 1052 -U 1248 ; WX 657 ; N uni04E0 ; G 1053 -U 1249 ; WX 568 ; N uni04E1 ; G 1054 -U 1250 ; WX 945 ; N uni04E2 ; G 1055 -U 1251 ; WX 742 ; N uni04E3 ; G 1056 -U 1252 ; WX 945 ; N uni04E4 ; G 1057 -U 1253 ; WX 742 ; N uni04E5 ; G 1058 -U 1254 ; WX 871 ; N uni04E6 ; G 1059 -U 1255 ; WX 667 ; N uni04E7 ; G 1060 -U 1256 ; WX 871 ; N uni04E8 ; G 1061 -U 1257 ; WX 667 ; N uni04E9 ; G 1062 -U 1258 ; WX 871 ; N uni04EA ; G 1063 -U 1259 ; WX 667 ; N uni04EB ; G 1064 -U 1260 ; WX 795 ; N uni04EC ; G 1065 -U 1261 ; WX 609 ; N uni04ED ; G 1066 -U 1262 ; WX 812 ; N uni04EE ; G 1067 -U 1263 ; WX 640 ; N uni04EF ; G 1068 -U 1264 ; WX 812 ; N uni04F0 ; G 1069 -U 1265 ; WX 640 ; N uni04F1 ; G 1070 -U 1266 ; WX 812 ; N uni04F2 ; G 1071 -U 1267 ; WX 640 ; N uni04F3 ; G 1072 -U 1268 ; WX 913 ; N uni04F4 ; G 1073 -U 1269 ; WX 732 ; N uni04F5 ; G 1074 -U 1270 ; WX 690 ; N uni04F6 ; G 1075 -U 1271 ; WX 613 ; N uni04F7 ; G 1076 -U 1272 ; WX 1202 ; N uni04F8 ; G 1077 -U 1273 ; WX 1002 ; N uni04F9 ; G 1078 -U 1296 ; WX 721 ; N uni0510 ; G 1079 -U 1297 ; WX 638 ; N uni0511 ; G 1080 -U 1298 ; WX 884 ; N uni0512 ; G 1081 -U 1299 ; WX 705 ; N uni0513 ; G 1082 -U 1300 ; WX 1248 ; N uni0514 ; G 1083 -U 1301 ; WX 945 ; N uni0515 ; G 1084 -U 1306 ; WX 820 ; N uni051A ; G 1085 -U 1307 ; WX 640 ; N uni051B ; G 1086 -U 1308 ; WX 1028 ; N uni051C ; G 1087 -U 1309 ; WX 856 ; N uni051D ; G 1088 -U 1329 ; WX 942 ; N uni0531 ; G 1089 -U 1330 ; WX 832 ; N uni0532 ; G 1090 -U 1331 ; WX 894 ; N uni0533 ; G 1091 -U 1332 ; WX 909 ; N uni0534 ; G 1092 -U 1333 ; WX 822 ; N uni0535 ; G 1093 -U 1334 ; WX 821 ; N uni0536 ; G 1094 -U 1335 ; WX 747 ; N uni0537 ; G 1095 -U 1336 ; WX 832 ; N uni0538 ; G 1096 -U 1337 ; WX 1125 ; N uni0539 ; G 1097 -U 1338 ; WX 894 ; N uni053A ; G 1098 -U 1339 ; WX 803 ; N uni053B ; G 1099 -U 1340 ; WX 722 ; N uni053C ; G 1100 -U 1341 ; WX 1188 ; N uni053D ; G 1101 -U 1342 ; WX 887 ; N uni053E ; G 1102 -U 1343 ; WX 842 ; N uni053F ; G 1103 -U 1344 ; WX 737 ; N uni0540 ; G 1104 -U 1345 ; WX 863 ; N uni0541 ; G 1105 -U 1346 ; WX 918 ; N uni0542 ; G 1106 -U 1347 ; WX 851 ; N uni0543 ; G 1107 -U 1348 ; WX 977 ; N uni0544 ; G 1108 -U 1349 ; WX 833 ; N uni0545 ; G 1109 -U 1350 ; WX 914 ; N uni0546 ; G 1110 -U 1351 ; WX 843 ; N uni0547 ; G 1111 -U 1352 ; WX 871 ; N uni0548 ; G 1112 -U 1353 ; WX 818 ; N uni0549 ; G 1113 -U 1354 ; WX 1034 ; N uni054A ; G 1114 -U 1355 ; WX 846 ; N uni054B ; G 1115 -U 1356 ; WX 964 ; N uni054C ; G 1116 -U 1357 ; WX 871 ; N uni054D ; G 1117 -U 1358 ; WX 914 ; N uni054E ; G 1118 -U 1359 ; WX 808 ; N uni054F ; G 1119 -U 1360 ; WX 808 ; N uni0550 ; G 1120 -U 1361 ; WX 836 ; N uni0551 ; G 1121 -U 1362 ; WX 710 ; N uni0552 ; G 1122 -U 1363 ; WX 955 ; N uni0553 ; G 1123 -U 1364 ; WX 891 ; N uni0554 ; G 1124 -U 1365 ; WX 871 ; N uni0555 ; G 1125 -U 1366 ; WX 963 ; N uni0556 ; G 1126 -U 1369 ; WX 307 ; N uni0559 ; G 1127 -U 1370 ; WX 264 ; N uni055A ; G 1128 -U 1371 ; WX 293 ; N uni055B ; G 1129 -U 1372 ; WX 391 ; N uni055C ; G 1130 -U 1373 ; WX 323 ; N uni055D ; G 1131 -U 1374 ; WX 439 ; N uni055E ; G 1132 -U 1375 ; WX 500 ; N uni055F ; G 1133 -U 1377 ; WX 1055 ; N uni0561 ; G 1134 -U 1378 ; WX 695 ; N uni0562 ; G 1135 -U 1379 ; WX 776 ; N uni0563 ; G 1136 -U 1380 ; WX 801 ; N uni0564 ; G 1137 -U 1381 ; WX 729 ; N uni0565 ; G 1138 -U 1382 ; WX 742 ; N uni0566 ; G 1139 -U 1383 ; WX 599 ; N uni0567 ; G 1140 -U 1384 ; WX 733 ; N uni0568 ; G 1141 -U 1385 ; WX 909 ; N uni0569 ; G 1142 -U 1386 ; WX 768 ; N uni056A ; G 1143 -U 1387 ; WX 724 ; N uni056B ; G 1144 -U 1388 ; WX 398 ; N uni056C ; G 1145 -U 1389 ; WX 1087 ; N uni056D ; G 1146 -U 1390 ; WX 695 ; N uni056E ; G 1147 -U 1391 ; WX 719 ; N uni056F ; G 1148 -U 1392 ; WX 737 ; N uni0570 ; G 1149 -U 1393 ; WX 684 ; N uni0571 ; G 1150 -U 1394 ; WX 738 ; N uni0572 ; G 1151 -U 1395 ; WX 703 ; N uni0573 ; G 1152 -U 1396 ; WX 724 ; N uni0574 ; G 1153 -U 1397 ; WX 359 ; N uni0575 ; G 1154 -U 1398 ; WX 719 ; N uni0576 ; G 1155 -U 1399 ; WX 496 ; N uni0577 ; G 1156 -U 1400 ; WX 738 ; N uni0578 ; G 1157 -U 1401 ; WX 428 ; N uni0579 ; G 1158 -U 1402 ; WX 1059 ; N uni057A ; G 1159 -U 1403 ; WX 668 ; N uni057B ; G 1160 -U 1404 ; WX 744 ; N uni057C ; G 1161 -U 1405 ; WX 724 ; N uni057D ; G 1162 -U 1406 ; WX 724 ; N uni057E ; G 1163 -U 1407 ; WX 1040 ; N uni057F ; G 1164 -U 1408 ; WX 724 ; N uni0580 ; G 1165 -U 1409 ; WX 713 ; N uni0581 ; G 1166 -U 1410 ; WX 493 ; N uni0582 ; G 1167 -U 1411 ; WX 1040 ; N uni0583 ; G 1168 -U 1412 ; WX 734 ; N uni0584 ; G 1169 -U 1413 ; WX 693 ; N uni0585 ; G 1170 -U 1414 ; WX 956 ; N uni0586 ; G 1171 -U 1415 ; WX 833 ; N uni0587 ; G 1172 -U 1417 ; WX 340 ; N uni0589 ; G 1173 -U 1418 ; WX 388 ; N uni058A ; G 1174 -U 3647 ; WX 696 ; N uni0E3F ; G 1175 -U 4256 ; WX 755 ; N uni10A0 ; G 1176 -U 4257 ; WX 936 ; N uni10A1 ; G 1177 -U 4258 ; WX 866 ; N uni10A2 ; G 1178 -U 4259 ; WX 874 ; N uni10A3 ; G 1179 -U 4260 ; WX 781 ; N uni10A4 ; G 1180 -U 4261 ; WX 1078 ; N uni10A5 ; G 1181 -U 4262 ; WX 1014 ; N uni10A6 ; G 1182 -U 4263 ; WX 1213 ; N uni10A7 ; G 1183 -U 4264 ; WX 643 ; N uni10A8 ; G 1184 -U 4265 ; WX 818 ; N uni10A9 ; G 1185 -U 4266 ; WX 1051 ; N uni10AA ; G 1186 -U 4267 ; WX 1051 ; N uni10AB ; G 1187 -U 4268 ; WX 796 ; N uni10AC ; G 1188 -U 4269 ; WX 1135 ; N uni10AD ; G 1189 -U 4270 ; WX 969 ; N uni10AE ; G 1190 -U 4271 ; WX 902 ; N uni10AF ; G 1191 -U 4272 ; WX 1109 ; N uni10B0 ; G 1192 -U 4273 ; WX 792 ; N uni10B1 ; G 1193 -U 4274 ; WX 756 ; N uni10B2 ; G 1194 -U 4275 ; WX 1076 ; N uni10B3 ; G 1195 -U 4276 ; WX 976 ; N uni10B4 ; G 1196 -U 4277 ; WX 1066 ; N uni10B5 ; G 1197 -U 4278 ; WX 811 ; N uni10B6 ; G 1198 -U 4279 ; WX 833 ; N uni10B7 ; G 1199 -U 4280 ; WX 821 ; N uni10B8 ; G 1200 -U 4281 ; WX 833 ; N uni10B9 ; G 1201 -U 4282 ; WX 908 ; N uni10BA ; G 1202 -U 4283 ; WX 1077 ; N uni10BB ; G 1203 -U 4284 ; WX 769 ; N uni10BC ; G 1204 -U 4285 ; WX 822 ; N uni10BD ; G 1205 -U 4286 ; WX 813 ; N uni10BE ; G 1206 -U 4287 ; WX 1111 ; N uni10BF ; G 1207 -U 4288 ; WX 1123 ; N uni10C0 ; G 1208 -U 4289 ; WX 802 ; N uni10C1 ; G 1209 -U 4290 ; WX 892 ; N uni10C2 ; G 1210 -U 4291 ; WX 802 ; N uni10C3 ; G 1211 -U 4292 ; WX 880 ; N uni10C4 ; G 1212 -U 4293 ; WX 1063 ; N uni10C5 ; G 1213 -U 4304 ; WX 594 ; N uni10D0 ; G 1214 -U 4305 ; WX 625 ; N uni10D1 ; G 1215 -U 4306 ; WX 643 ; N uni10D2 ; G 1216 -U 4307 ; WX 887 ; N uni10D3 ; G 1217 -U 4308 ; WX 615 ; N uni10D4 ; G 1218 -U 4309 ; WX 611 ; N uni10D5 ; G 1219 -U 4310 ; WX 667 ; N uni10D6 ; G 1220 -U 4311 ; WX 915 ; N uni10D7 ; G 1221 -U 4312 ; WX 613 ; N uni10D8 ; G 1222 -U 4313 ; WX 600 ; N uni10D9 ; G 1223 -U 4314 ; WX 1120 ; N uni10DA ; G 1224 -U 4315 ; WX 640 ; N uni10DB ; G 1225 -U 4316 ; WX 640 ; N uni10DC ; G 1226 -U 4317 ; WX 879 ; N uni10DD ; G 1227 -U 4318 ; WX 624 ; N uni10DE ; G 1228 -U 4319 ; WX 634 ; N uni10DF ; G 1229 -U 4320 ; WX 877 ; N uni10E0 ; G 1230 -U 4321 ; WX 666 ; N uni10E1 ; G 1231 -U 4322 ; WX 780 ; N uni10E2 ; G 1232 -U 4323 ; WX 751 ; N uni10E3 ; G 1233 -U 4324 ; WX 869 ; N uni10E4 ; G 1234 -U 4325 ; WX 639 ; N uni10E5 ; G 1235 -U 4326 ; WX 912 ; N uni10E6 ; G 1236 -U 4327 ; WX 622 ; N uni10E7 ; G 1237 -U 4328 ; WX 647 ; N uni10E8 ; G 1238 -U 4329 ; WX 640 ; N uni10E9 ; G 1239 -U 4330 ; WX 729 ; N uni10EA ; G 1240 -U 4331 ; WX 641 ; N uni10EB ; G 1241 -U 4332 ; WX 630 ; N uni10EC ; G 1242 -U 4333 ; WX 629 ; N uni10ED ; G 1243 -U 4334 ; WX 670 ; N uni10EE ; G 1244 -U 4335 ; WX 753 ; N uni10EF ; G 1245 -U 4336 ; WX 625 ; N uni10F0 ; G 1246 -U 4337 ; WX 657 ; N uni10F1 ; G 1247 -U 4338 ; WX 625 ; N uni10F2 ; G 1248 -U 4339 ; WX 625 ; N uni10F3 ; G 1249 -U 4340 ; WX 624 ; N uni10F4 ; G 1250 -U 4341 ; WX 670 ; N uni10F5 ; G 1251 -U 4342 ; WX 940 ; N uni10F6 ; G 1252 -U 4343 ; WX 680 ; N uni10F7 ; G 1253 -U 4344 ; WX 636 ; N uni10F8 ; G 1254 -U 4345 ; WX 672 ; N uni10F9 ; G 1255 -U 4346 ; WX 625 ; N uni10FA ; G 1256 -U 4347 ; WX 588 ; N uni10FB ; G 1257 -U 4348 ; WX 354 ; N uni10FC ; G 1258 -U 7424 ; WX 641 ; N uni1D00 ; G 1259 -U 7425 ; WX 892 ; N uni1D01 ; G 1260 -U 7426 ; WX 940 ; N uni1D02 ; G 1261 -U 7427 ; WX 695 ; N uni1D03 ; G 1262 -U 7428 ; WX 609 ; N uni1D04 ; G 1263 -U 7429 ; WX 675 ; N uni1D05 ; G 1264 -U 7430 ; WX 675 ; N uni1D06 ; G 1265 -U 7431 ; WX 617 ; N uni1D07 ; G 1266 -U 7432 ; WX 509 ; N uni1D08 ; G 1267 -U 7433 ; WX 320 ; N uni1D09 ; G 1268 -U 7434 ; WX 561 ; N uni1D0A ; G 1269 -U 7435 ; WX 722 ; N uni1D0B ; G 1270 -U 7436 ; WX 617 ; N uni1D0C ; G 1271 -U 7437 ; WX 869 ; N uni1D0D ; G 1272 -U 7438 ; WX 737 ; N uni1D0E ; G 1273 -U 7439 ; WX 667 ; N uni1D0F ; G 1274 -U 7440 ; WX 609 ; N uni1D10 ; G 1275 -U 7441 ; WX 628 ; N uni1D11 ; G 1276 -U 7442 ; WX 628 ; N uni1D12 ; G 1277 -U 7443 ; WX 667 ; N uni1D13 ; G 1278 -U 7444 ; WX 989 ; N uni1D14 ; G 1279 -U 7445 ; WX 598 ; N uni1D15 ; G 1280 -U 7446 ; WX 667 ; N uni1D16 ; G 1281 -U 7447 ; WX 667 ; N uni1D17 ; G 1282 -U 7448 ; WX 586 ; N uni1D18 ; G 1283 -U 7449 ; WX 801 ; N uni1D19 ; G 1284 -U 7450 ; WX 801 ; N uni1D1A ; G 1285 -U 7451 ; WX 620 ; N uni1D1B ; G 1286 -U 7452 ; WX 647 ; N uni1D1C ; G 1287 -U 7453 ; WX 664 ; N uni1D1D ; G 1288 -U 7454 ; WX 923 ; N uni1D1E ; G 1289 -U 7455 ; WX 655 ; N uni1D1F ; G 1290 -U 7456 ; WX 581 ; N uni1D20 ; G 1291 -U 7457 ; WX 861 ; N uni1D21 ; G 1292 -U 7458 ; WX 568 ; N uni1D22 ; G 1293 -U 7459 ; WX 568 ; N uni1D23 ; G 1294 -U 7460 ; WX 588 ; N uni1D24 ; G 1295 -U 7461 ; WX 802 ; N uni1D25 ; G 1296 -U 7462 ; WX 586 ; N uni1D26 ; G 1297 -U 7463 ; WX 641 ; N uni1D27 ; G 1298 -U 7464 ; WX 732 ; N uni1D28 ; G 1299 -U 7465 ; WX 586 ; N uni1D29 ; G 1300 -U 7466 ; WX 854 ; N uni1D2A ; G 1301 -U 7467 ; WX 705 ; N uni1D2B ; G 1302 -U 7468 ; WX 489 ; N uni1D2C ; G 1303 -U 7469 ; WX 651 ; N uni1D2D ; G 1304 -U 7470 ; WX 532 ; N uni1D2E ; G 1305 -U 7471 ; WX 532 ; N uni1D2F ; G 1306 -U 7472 ; WX 546 ; N uni1D30 ; G 1307 -U 7473 ; WX 480 ; N uni1D31 ; G 1308 -U 7474 ; WX 480 ; N uni1D32 ; G 1309 -U 7475 ; WX 538 ; N uni1D33 ; G 1310 -U 7476 ; WX 595 ; N uni1D34 ; G 1311 -U 7477 ; WX 294 ; N uni1D35 ; G 1312 -U 7478 ; WX 298 ; N uni1D36 ; G 1313 -U 7479 ; WX 547 ; N uni1D37 ; G 1314 -U 7480 ; WX 443 ; N uni1D38 ; G 1315 -U 7481 ; WX 697 ; N uni1D39 ; G 1316 -U 7482 ; WX 576 ; N uni1D3A ; G 1317 -U 7483 ; WX 606 ; N uni1D3B ; G 1318 -U 7484 ; WX 548 ; N uni1D3C ; G 1319 -U 7485 ; WX 442 ; N uni1D3D ; G 1320 -U 7486 ; WX 474 ; N uni1D3E ; G 1321 -U 7487 ; WX 523 ; N uni1D3F ; G 1322 -U 7488 ; WX 455 ; N uni1D40 ; G 1323 -U 7489 ; WX 469 ; N uni1D41 ; G 1324 -U 7490 ; WX 549 ; N uni1D42 ; G 1325 -U 7491 ; WX 466 ; N uni1D43 ; G 1326 -U 7492 ; WX 466 ; N uni1D44 ; G 1327 -U 7493 ; WX 498 ; N uni1D45 ; G 1328 -U 7494 ; WX 657 ; N uni1D46 ; G 1329 -U 7495 ; WX 499 ; N uni1D47 ; G 1330 -U 7496 ; WX 498 ; N uni1D48 ; G 1331 -U 7497 ; WX 444 ; N uni1D49 ; G 1332 -U 7498 ; WX 444 ; N uni1D4A ; G 1333 -U 7499 ; WX 412 ; N uni1D4B ; G 1334 -U 7500 ; WX 412 ; N uni1D4C ; G 1335 -U 7501 ; WX 498 ; N uni1D4D ; G 1336 -U 7502 ; WX 300 ; N uni1D4E ; G 1337 -U 7503 ; WX 523 ; N uni1D4F ; G 1338 -U 7504 ; WX 729 ; N uni1D50 ; G 1339 -U 7505 ; WX 473 ; N uni1D51 ; G 1340 -U 7506 ; WX 467 ; N uni1D52 ; G 1341 -U 7507 ; WX 427 ; N uni1D53 ; G 1342 -U 7508 ; WX 467 ; N uni1D54 ; G 1343 -U 7509 ; WX 467 ; N uni1D55 ; G 1344 -U 7510 ; WX 499 ; N uni1D56 ; G 1345 -U 7511 ; WX 371 ; N uni1D57 ; G 1346 -U 7512 ; WX 520 ; N uni1D58 ; G 1347 -U 7513 ; WX 418 ; N uni1D59 ; G 1348 -U 7514 ; WX 729 ; N uni1D5A ; G 1349 -U 7515 ; WX 491 ; N uni1D5B ; G 1350 -U 7516 ; WX 505 ; N uni1D5C ; G 1351 -U 7517 ; WX 418 ; N uni1D5D ; G 1352 -U 7518 ; WX 416 ; N uni1D5E ; G 1353 -U 7519 ; WX 420 ; N uni1D5F ; G 1354 -U 7520 ; WX 570 ; N uni1D60 ; G 1355 -U 7521 ; WX 414 ; N uni1D61 ; G 1356 -U 7522 ; WX 239 ; N uni1D62 ; G 1357 -U 7523 ; WX 414 ; N uni1D63 ; G 1358 -U 7524 ; WX 520 ; N uni1D64 ; G 1359 -U 7525 ; WX 491 ; N uni1D65 ; G 1360 -U 7526 ; WX 418 ; N uni1D66 ; G 1361 -U 7527 ; WX 416 ; N uni1D67 ; G 1362 -U 7528 ; WX 419 ; N uni1D68 ; G 1363 -U 7529 ; WX 570 ; N uni1D69 ; G 1364 -U 7530 ; WX 414 ; N uni1D6A ; G 1365 -U 7531 ; WX 1041 ; N uni1D6B ; G 1366 -U 7543 ; WX 640 ; N uni1D77 ; G 1367 -U 7544 ; WX 595 ; N uni1D78 ; G 1368 -U 7547 ; WX 380 ; N uni1D7B ; G 1369 -U 7548 ; WX 380 ; N uni1D7C ; G 1370 -U 7549 ; WX 699 ; N uni1D7D ; G 1371 -U 7550 ; WX 647 ; N uni1D7E ; G 1372 -U 7551 ; WX 679 ; N uni1D7F ; G 1373 -U 7557 ; WX 380 ; N uni1D85 ; G 1374 -U 7579 ; WX 498 ; N uni1D9B ; G 1375 -U 7580 ; WX 427 ; N uni1D9C ; G 1376 -U 7581 ; WX 427 ; N uni1D9D ; G 1377 -U 7582 ; WX 467 ; N uni1D9E ; G 1378 -U 7583 ; WX 412 ; N uni1D9F ; G 1379 -U 7584 ; WX 383 ; N uni1DA0 ; G 1380 -U 7585 ; WX 373 ; N uni1DA1 ; G 1381 -U 7586 ; WX 498 ; N uni1DA2 ; G 1382 -U 7587 ; WX 522 ; N uni1DA3 ; G 1383 -U 7588 ; WX 300 ; N uni1DA4 ; G 1384 -U 7589 ; WX 307 ; N uni1DA5 ; G 1385 -U 7590 ; WX 300 ; N uni1DA6 ; G 1386 -U 7591 ; WX 300 ; N uni1DA7 ; G 1387 -U 7592 ; WX 370 ; N uni1DA8 ; G 1388 -U 7593 ; WX 368 ; N uni1DA9 ; G 1389 -U 7594 ; WX 321 ; N uni1DAA ; G 1390 -U 7595 ; WX 430 ; N uni1DAB ; G 1391 -U 7596 ; WX 682 ; N uni1DAC ; G 1392 -U 7597 ; WX 729 ; N uni1DAD ; G 1393 -U 7598 ; WX 588 ; N uni1DAE ; G 1394 -U 7599 ; WX 587 ; N uni1DAF ; G 1395 -U 7600 ; WX 472 ; N uni1DB0 ; G 1396 -U 7601 ; WX 467 ; N uni1DB1 ; G 1397 -U 7602 ; WX 522 ; N uni1DB2 ; G 1398 -U 7603 ; WX 400 ; N uni1DB3 ; G 1399 -U 7604 ; WX 387 ; N uni1DB4 ; G 1400 -U 7605 ; WX 371 ; N uni1DB5 ; G 1401 -U 7606 ; WX 520 ; N uni1DB6 ; G 1402 -U 7607 ; WX 475 ; N uni1DB7 ; G 1403 -U 7608 ; WX 408 ; N uni1DB8 ; G 1404 -U 7609 ; WX 489 ; N uni1DB9 ; G 1405 -U 7610 ; WX 491 ; N uni1DBA ; G 1406 -U 7611 ; WX 412 ; N uni1DBB ; G 1407 -U 7612 ; WX 527 ; N uni1DBC ; G 1408 -U 7613 ; WX 412 ; N uni1DBD ; G 1409 -U 7614 ; WX 452 ; N uni1DBE ; G 1410 -U 7615 ; WX 467 ; N uni1DBF ; G 1411 -U 7620 ; WX 0 ; N uni1DC4 ; G 1412 -U 7621 ; WX 0 ; N uni1DC5 ; G 1413 -U 7622 ; WX 0 ; N uni1DC6 ; G 1414 -U 7623 ; WX 0 ; N uni1DC7 ; G 1415 -U 7624 ; WX 0 ; N uni1DC8 ; G 1416 -U 7625 ; WX 0 ; N uni1DC9 ; G 1417 -U 7680 ; WX 776 ; N uni1E00 ; G 1418 -U 7681 ; WX 648 ; N uni1E01 ; G 1419 -U 7682 ; WX 845 ; N uni1E02 ; G 1420 -U 7683 ; WX 699 ; N uni1E03 ; G 1421 -U 7684 ; WX 845 ; N uni1E04 ; G 1422 -U 7685 ; WX 699 ; N uni1E05 ; G 1423 -U 7686 ; WX 845 ; N uni1E06 ; G 1424 -U 7687 ; WX 699 ; N uni1E07 ; G 1425 -U 7688 ; WX 796 ; N uni1E08 ; G 1426 -U 7689 ; WX 609 ; N uni1E09 ; G 1427 -U 7690 ; WX 867 ; N uni1E0A ; G 1428 -U 7691 ; WX 699 ; N uni1E0B ; G 1429 -U 7692 ; WX 867 ; N uni1E0C ; G 1430 -U 7693 ; WX 699 ; N uni1E0D ; G 1431 -U 7694 ; WX 867 ; N uni1E0E ; G 1432 -U 7695 ; WX 699 ; N uni1E0F ; G 1433 -U 7696 ; WX 867 ; N uni1E10 ; G 1434 -U 7697 ; WX 699 ; N uni1E11 ; G 1435 -U 7698 ; WX 867 ; N uni1E12 ; G 1436 -U 7699 ; WX 699 ; N uni1E13 ; G 1437 -U 7700 ; WX 762 ; N uni1E14 ; G 1438 -U 7701 ; WX 636 ; N uni1E15 ; G 1439 -U 7702 ; WX 762 ; N uni1E16 ; G 1440 -U 7703 ; WX 636 ; N uni1E17 ; G 1441 -U 7704 ; WX 762 ; N uni1E18 ; G 1442 -U 7705 ; WX 636 ; N uni1E19 ; G 1443 -U 7706 ; WX 762 ; N uni1E1A ; G 1444 -U 7707 ; WX 636 ; N uni1E1B ; G 1445 -U 7708 ; WX 762 ; N uni1E1C ; G 1446 -U 7709 ; WX 636 ; N uni1E1D ; G 1447 -U 7710 ; WX 710 ; N uni1E1E ; G 1448 -U 7711 ; WX 430 ; N uni1E1F ; G 1449 -U 7712 ; WX 854 ; N uni1E20 ; G 1450 -U 7713 ; WX 699 ; N uni1E21 ; G 1451 -U 7714 ; WX 945 ; N uni1E22 ; G 1452 -U 7715 ; WX 727 ; N uni1E23 ; G 1453 -U 7716 ; WX 945 ; N uni1E24 ; G 1454 -U 7717 ; WX 727 ; N uni1E25 ; G 1455 -U 7718 ; WX 945 ; N uni1E26 ; G 1456 -U 7719 ; WX 727 ; N uni1E27 ; G 1457 -U 7720 ; WX 945 ; N uni1E28 ; G 1458 -U 7721 ; WX 727 ; N uni1E29 ; G 1459 -U 7722 ; WX 945 ; N uni1E2A ; G 1460 -U 7723 ; WX 727 ; N uni1E2B ; G 1461 -U 7724 ; WX 468 ; N uni1E2C ; G 1462 -U 7725 ; WX 380 ; N uni1E2D ; G 1463 -U 7726 ; WX 468 ; N uni1E2E ; G 1464 -U 7727 ; WX 380 ; N uni1E2F ; G 1465 -U 7728 ; WX 869 ; N uni1E30 ; G 1466 -U 7729 ; WX 693 ; N uni1E31 ; G 1467 -U 7730 ; WX 869 ; N uni1E32 ; G 1468 -U 7731 ; WX 693 ; N uni1E33 ; G 1469 -U 7732 ; WX 869 ; N uni1E34 ; G 1470 -U 7733 ; WX 693 ; N uni1E35 ; G 1471 -U 7734 ; WX 703 ; N uni1E36 ; G 1472 -U 7735 ; WX 380 ; N uni1E37 ; G 1473 -U 7736 ; WX 703 ; N uni1E38 ; G 1474 -U 7737 ; WX 380 ; N uni1E39 ; G 1475 -U 7738 ; WX 703 ; N uni1E3A ; G 1476 -U 7739 ; WX 380 ; N uni1E3B ; G 1477 -U 7740 ; WX 703 ; N uni1E3C ; G 1478 -U 7741 ; WX 380 ; N uni1E3D ; G 1479 -U 7742 ; WX 1107 ; N uni1E3E ; G 1480 -U 7743 ; WX 1058 ; N uni1E3F ; G 1481 -U 7744 ; WX 1107 ; N uni1E40 ; G 1482 -U 7745 ; WX 1058 ; N uni1E41 ; G 1483 -U 7746 ; WX 1107 ; N uni1E42 ; G 1484 -U 7747 ; WX 1058 ; N uni1E43 ; G 1485 -U 7748 ; WX 914 ; N uni1E44 ; G 1486 -U 7749 ; WX 727 ; N uni1E45 ; G 1487 -U 7750 ; WX 914 ; N uni1E46 ; G 1488 -U 7751 ; WX 727 ; N uni1E47 ; G 1489 -U 7752 ; WX 914 ; N uni1E48 ; G 1490 -U 7753 ; WX 727 ; N uni1E49 ; G 1491 -U 7754 ; WX 914 ; N uni1E4A ; G 1492 -U 7755 ; WX 727 ; N uni1E4B ; G 1493 -U 7756 ; WX 871 ; N uni1E4C ; G 1494 -U 7757 ; WX 667 ; N uni1E4D ; G 1495 -U 7758 ; WX 871 ; N uni1E4E ; G 1496 -U 7759 ; WX 667 ; N uni1E4F ; G 1497 -U 7760 ; WX 871 ; N uni1E50 ; G 1498 -U 7761 ; WX 667 ; N uni1E51 ; G 1499 -U 7762 ; WX 871 ; N uni1E52 ; G 1500 -U 7763 ; WX 667 ; N uni1E53 ; G 1501 -U 7764 ; WX 752 ; N uni1E54 ; G 1502 -U 7765 ; WX 699 ; N uni1E55 ; G 1503 -U 7766 ; WX 752 ; N uni1E56 ; G 1504 -U 7767 ; WX 699 ; N uni1E57 ; G 1505 -U 7768 ; WX 831 ; N uni1E58 ; G 1506 -U 7769 ; WX 527 ; N uni1E59 ; G 1507 -U 7770 ; WX 831 ; N uni1E5A ; G 1508 -U 7771 ; WX 527 ; N uni1E5B ; G 1509 -U 7772 ; WX 831 ; N uni1E5C ; G 1510 -U 7773 ; WX 527 ; N uni1E5D ; G 1511 -U 7774 ; WX 831 ; N uni1E5E ; G 1512 -U 7775 ; WX 527 ; N uni1E5F ; G 1513 -U 7776 ; WX 722 ; N uni1E60 ; G 1514 -U 7777 ; WX 563 ; N uni1E61 ; G 1515 -U 7778 ; WX 722 ; N uni1E62 ; G 1516 -U 7779 ; WX 563 ; N uni1E63 ; G 1517 -U 7780 ; WX 722 ; N uni1E64 ; G 1518 -U 7781 ; WX 563 ; N uni1E65 ; G 1519 -U 7782 ; WX 722 ; N uni1E66 ; G 1520 -U 7783 ; WX 563 ; N uni1E67 ; G 1521 -U 7784 ; WX 722 ; N uni1E68 ; G 1522 -U 7785 ; WX 563 ; N uni1E69 ; G 1523 -U 7786 ; WX 744 ; N uni1E6A ; G 1524 -U 7787 ; WX 462 ; N uni1E6B ; G 1525 -U 7788 ; WX 744 ; N uni1E6C ; G 1526 -U 7789 ; WX 462 ; N uni1E6D ; G 1527 -U 7790 ; WX 744 ; N uni1E6E ; G 1528 -U 7791 ; WX 462 ; N uni1E6F ; G 1529 -U 7792 ; WX 744 ; N uni1E70 ; G 1530 -U 7793 ; WX 462 ; N uni1E71 ; G 1531 -U 7794 ; WX 872 ; N uni1E72 ; G 1532 -U 7795 ; WX 727 ; N uni1E73 ; G 1533 -U 7796 ; WX 872 ; N uni1E74 ; G 1534 -U 7797 ; WX 727 ; N uni1E75 ; G 1535 -U 7798 ; WX 872 ; N uni1E76 ; G 1536 -U 7799 ; WX 727 ; N uni1E77 ; G 1537 -U 7800 ; WX 872 ; N uni1E78 ; G 1538 -U 7801 ; WX 727 ; N uni1E79 ; G 1539 -U 7802 ; WX 872 ; N uni1E7A ; G 1540 -U 7803 ; WX 727 ; N uni1E7B ; G 1541 -U 7804 ; WX 776 ; N uni1E7C ; G 1542 -U 7805 ; WX 581 ; N uni1E7D ; G 1543 -U 7806 ; WX 776 ; N uni1E7E ; G 1544 -U 7807 ; WX 581 ; N uni1E7F ; G 1545 -U 7808 ; WX 1123 ; N Wgrave ; G 1546 -U 7809 ; WX 861 ; N wgrave ; G 1547 -U 7810 ; WX 1123 ; N Wacute ; G 1548 -U 7811 ; WX 861 ; N wacute ; G 1549 -U 7812 ; WX 1123 ; N Wdieresis ; G 1550 -U 7813 ; WX 861 ; N wdieresis ; G 1551 -U 7814 ; WX 1123 ; N uni1E86 ; G 1552 -U 7815 ; WX 861 ; N uni1E87 ; G 1553 -U 7816 ; WX 1123 ; N uni1E88 ; G 1554 -U 7817 ; WX 861 ; N uni1E89 ; G 1555 -U 7818 ; WX 776 ; N uni1E8A ; G 1556 -U 7819 ; WX 596 ; N uni1E8B ; G 1557 -U 7820 ; WX 776 ; N uni1E8C ; G 1558 -U 7821 ; WX 596 ; N uni1E8D ; G 1559 -U 7822 ; WX 714 ; N uni1E8E ; G 1560 -U 7823 ; WX 581 ; N uni1E8F ; G 1561 -U 7824 ; WX 730 ; N uni1E90 ; G 1562 -U 7825 ; WX 568 ; N uni1E91 ; G 1563 -U 7826 ; WX 730 ; N uni1E92 ; G 1564 -U 7827 ; WX 568 ; N uni1E93 ; G 1565 -U 7828 ; WX 730 ; N uni1E94 ; G 1566 -U 7829 ; WX 568 ; N uni1E95 ; G 1567 -U 7830 ; WX 727 ; N uni1E96 ; G 1568 -U 7831 ; WX 462 ; N uni1E97 ; G 1569 -U 7832 ; WX 861 ; N uni1E98 ; G 1570 -U 7833 ; WX 581 ; N uni1E99 ; G 1571 -U 7834 ; WX 1014 ; N uni1E9A ; G 1572 -U 7835 ; WX 430 ; N uni1E9B ; G 1573 -U 7836 ; WX 430 ; N uni1E9C ; G 1574 -U 7837 ; WX 430 ; N uni1E9D ; G 1575 -U 7838 ; WX 947 ; N uni1E9E ; G 1576 -U 7839 ; WX 667 ; N uni1E9F ; G 1577 -U 7840 ; WX 776 ; N uni1EA0 ; G 1578 -U 7841 ; WX 648 ; N uni1EA1 ; G 1579 -U 7842 ; WX 776 ; N uni1EA2 ; G 1580 -U 7843 ; WX 648 ; N uni1EA3 ; G 1581 -U 7844 ; WX 776 ; N uni1EA4 ; G 1582 -U 7845 ; WX 648 ; N uni1EA5 ; G 1583 -U 7846 ; WX 776 ; N uni1EA6 ; G 1584 -U 7847 ; WX 648 ; N uni1EA7 ; G 1585 -U 7848 ; WX 776 ; N uni1EA8 ; G 1586 -U 7849 ; WX 648 ; N uni1EA9 ; G 1587 -U 7850 ; WX 776 ; N uni1EAA ; G 1588 -U 7851 ; WX 648 ; N uni1EAB ; G 1589 -U 7852 ; WX 776 ; N uni1EAC ; G 1590 -U 7853 ; WX 648 ; N uni1EAD ; G 1591 -U 7854 ; WX 776 ; N uni1EAE ; G 1592 -U 7855 ; WX 648 ; N uni1EAF ; G 1593 -U 7856 ; WX 776 ; N uni1EB0 ; G 1594 -U 7857 ; WX 648 ; N uni1EB1 ; G 1595 -U 7858 ; WX 776 ; N uni1EB2 ; G 1596 -U 7859 ; WX 648 ; N uni1EB3 ; G 1597 -U 7860 ; WX 776 ; N uni1EB4 ; G 1598 -U 7861 ; WX 648 ; N uni1EB5 ; G 1599 -U 7862 ; WX 776 ; N uni1EB6 ; G 1600 -U 7863 ; WX 648 ; N uni1EB7 ; G 1601 -U 7864 ; WX 762 ; N uni1EB8 ; G 1602 -U 7865 ; WX 636 ; N uni1EB9 ; G 1603 -U 7866 ; WX 762 ; N uni1EBA ; G 1604 -U 7867 ; WX 636 ; N uni1EBB ; G 1605 -U 7868 ; WX 762 ; N uni1EBC ; G 1606 -U 7869 ; WX 636 ; N uni1EBD ; G 1607 -U 7870 ; WX 762 ; N uni1EBE ; G 1608 -U 7871 ; WX 636 ; N uni1EBF ; G 1609 -U 7872 ; WX 762 ; N uni1EC0 ; G 1610 -U 7873 ; WX 636 ; N uni1EC1 ; G 1611 -U 7874 ; WX 762 ; N uni1EC2 ; G 1612 -U 7875 ; WX 636 ; N uni1EC3 ; G 1613 -U 7876 ; WX 762 ; N uni1EC4 ; G 1614 -U 7877 ; WX 636 ; N uni1EC5 ; G 1615 -U 7878 ; WX 762 ; N uni1EC6 ; G 1616 -U 7879 ; WX 636 ; N uni1EC7 ; G 1617 -U 7880 ; WX 468 ; N uni1EC8 ; G 1618 -U 7881 ; WX 380 ; N uni1EC9 ; G 1619 -U 7882 ; WX 468 ; N uni1ECA ; G 1620 -U 7883 ; WX 380 ; N uni1ECB ; G 1621 -U 7884 ; WX 871 ; N uni1ECC ; G 1622 -U 7885 ; WX 667 ; N uni1ECD ; G 1623 -U 7886 ; WX 871 ; N uni1ECE ; G 1624 -U 7887 ; WX 667 ; N uni1ECF ; G 1625 -U 7888 ; WX 871 ; N uni1ED0 ; G 1626 -U 7889 ; WX 667 ; N uni1ED1 ; G 1627 -U 7890 ; WX 871 ; N uni1ED2 ; G 1628 -U 7891 ; WX 667 ; N uni1ED3 ; G 1629 -U 7892 ; WX 871 ; N uni1ED4 ; G 1630 -U 7893 ; WX 667 ; N uni1ED5 ; G 1631 -U 7894 ; WX 871 ; N uni1ED6 ; G 1632 -U 7895 ; WX 667 ; N uni1ED7 ; G 1633 -U 7896 ; WX 871 ; N uni1ED8 ; G 1634 -U 7897 ; WX 667 ; N uni1ED9 ; G 1635 -U 7898 ; WX 871 ; N uni1EDA ; G 1636 -U 7899 ; WX 667 ; N uni1EDB ; G 1637 -U 7900 ; WX 871 ; N uni1EDC ; G 1638 -U 7901 ; WX 667 ; N uni1EDD ; G 1639 -U 7902 ; WX 871 ; N uni1EDE ; G 1640 -U 7903 ; WX 667 ; N uni1EDF ; G 1641 -U 7904 ; WX 871 ; N uni1EE0 ; G 1642 -U 7905 ; WX 667 ; N uni1EE1 ; G 1643 -U 7906 ; WX 871 ; N uni1EE2 ; G 1644 -U 7907 ; WX 667 ; N uni1EE3 ; G 1645 -U 7908 ; WX 872 ; N uni1EE4 ; G 1646 -U 7909 ; WX 727 ; N uni1EE5 ; G 1647 -U 7910 ; WX 872 ; N uni1EE6 ; G 1648 -U 7911 ; WX 727 ; N uni1EE7 ; G 1649 -U 7912 ; WX 872 ; N uni1EE8 ; G 1650 -U 7913 ; WX 727 ; N uni1EE9 ; G 1651 -U 7914 ; WX 872 ; N uni1EEA ; G 1652 -U 7915 ; WX 727 ; N uni1EEB ; G 1653 -U 7916 ; WX 872 ; N uni1EEC ; G 1654 -U 7917 ; WX 727 ; N uni1EED ; G 1655 -U 7918 ; WX 872 ; N uni1EEE ; G 1656 -U 7919 ; WX 727 ; N uni1EEF ; G 1657 -U 7920 ; WX 872 ; N uni1EF0 ; G 1658 -U 7921 ; WX 727 ; N uni1EF1 ; G 1659 -U 7922 ; WX 714 ; N Ygrave ; G 1660 -U 7923 ; WX 581 ; N ygrave ; G 1661 -U 7924 ; WX 714 ; N uni1EF4 ; G 1662 -U 7925 ; WX 581 ; N uni1EF5 ; G 1663 -U 7926 ; WX 714 ; N uni1EF6 ; G 1664 -U 7927 ; WX 581 ; N uni1EF7 ; G 1665 -U 7928 ; WX 714 ; N uni1EF8 ; G 1666 -U 7929 ; WX 581 ; N uni1EF9 ; G 1667 -U 7930 ; WX 1078 ; N uni1EFA ; G 1668 -U 7931 ; WX 701 ; N uni1EFB ; G 1669 -U 7936 ; WX 770 ; N uni1F00 ; G 1670 -U 7937 ; WX 770 ; N uni1F01 ; G 1671 -U 7938 ; WX 770 ; N uni1F02 ; G 1672 -U 7939 ; WX 770 ; N uni1F03 ; G 1673 -U 7940 ; WX 770 ; N uni1F04 ; G 1674 -U 7941 ; WX 770 ; N uni1F05 ; G 1675 -U 7942 ; WX 770 ; N uni1F06 ; G 1676 -U 7943 ; WX 770 ; N uni1F07 ; G 1677 -U 7944 ; WX 776 ; N uni1F08 ; G 1678 -U 7945 ; WX 776 ; N uni1F09 ; G 1679 -U 7946 ; WX 978 ; N uni1F0A ; G 1680 -U 7947 ; WX 978 ; N uni1F0B ; G 1681 -U 7948 ; WX 832 ; N uni1F0C ; G 1682 -U 7949 ; WX 849 ; N uni1F0D ; G 1683 -U 7950 ; WX 776 ; N uni1F0E ; G 1684 -U 7951 ; WX 776 ; N uni1F0F ; G 1685 -U 7952 ; WX 608 ; N uni1F10 ; G 1686 -U 7953 ; WX 608 ; N uni1F11 ; G 1687 -U 7954 ; WX 608 ; N uni1F12 ; G 1688 -U 7955 ; WX 608 ; N uni1F13 ; G 1689 -U 7956 ; WX 608 ; N uni1F14 ; G 1690 -U 7957 ; WX 608 ; N uni1F15 ; G 1691 -U 7960 ; WX 917 ; N uni1F18 ; G 1692 -U 7961 ; WX 909 ; N uni1F19 ; G 1693 -U 7962 ; WX 1169 ; N uni1F1A ; G 1694 -U 7963 ; WX 1169 ; N uni1F1B ; G 1695 -U 7964 ; WX 1093 ; N uni1F1C ; G 1696 -U 7965 ; WX 1120 ; N uni1F1D ; G 1697 -U 7968 ; WX 727 ; N uni1F20 ; G 1698 -U 7969 ; WX 727 ; N uni1F21 ; G 1699 -U 7970 ; WX 727 ; N uni1F22 ; G 1700 -U 7971 ; WX 727 ; N uni1F23 ; G 1701 -U 7972 ; WX 727 ; N uni1F24 ; G 1702 -U 7973 ; WX 727 ; N uni1F25 ; G 1703 -U 7974 ; WX 727 ; N uni1F26 ; G 1704 -U 7975 ; WX 727 ; N uni1F27 ; G 1705 -U 7976 ; WX 1100 ; N uni1F28 ; G 1706 -U 7977 ; WX 1094 ; N uni1F29 ; G 1707 -U 7978 ; WX 1358 ; N uni1F2A ; G 1708 -U 7979 ; WX 1361 ; N uni1F2B ; G 1709 -U 7980 ; WX 1279 ; N uni1F2C ; G 1710 -U 7981 ; WX 1308 ; N uni1F2D ; G 1711 -U 7982 ; WX 1197 ; N uni1F2E ; G 1712 -U 7983 ; WX 1194 ; N uni1F2F ; G 1713 -U 7984 ; WX 484 ; N uni1F30 ; G 1714 -U 7985 ; WX 484 ; N uni1F31 ; G 1715 -U 7986 ; WX 484 ; N uni1F32 ; G 1716 -U 7987 ; WX 484 ; N uni1F33 ; G 1717 -U 7988 ; WX 484 ; N uni1F34 ; G 1718 -U 7989 ; WX 484 ; N uni1F35 ; G 1719 -U 7990 ; WX 484 ; N uni1F36 ; G 1720 -U 7991 ; WX 484 ; N uni1F37 ; G 1721 -U 7992 ; WX 629 ; N uni1F38 ; G 1722 -U 7993 ; WX 617 ; N uni1F39 ; G 1723 -U 7994 ; WX 878 ; N uni1F3A ; G 1724 -U 7995 ; WX 881 ; N uni1F3B ; G 1725 -U 7996 ; WX 799 ; N uni1F3C ; G 1726 -U 7997 ; WX 831 ; N uni1F3D ; G 1727 -U 7998 ; WX 723 ; N uni1F3E ; G 1728 -U 7999 ; WX 714 ; N uni1F3F ; G 1729 -U 8000 ; WX 667 ; N uni1F40 ; G 1730 -U 8001 ; WX 667 ; N uni1F41 ; G 1731 -U 8002 ; WX 667 ; N uni1F42 ; G 1732 -U 8003 ; WX 667 ; N uni1F43 ; G 1733 -U 8004 ; WX 667 ; N uni1F44 ; G 1734 -U 8005 ; WX 667 ; N uni1F45 ; G 1735 -U 8008 ; WX 900 ; N uni1F48 ; G 1736 -U 8009 ; WX 935 ; N uni1F49 ; G 1737 -U 8010 ; WX 1240 ; N uni1F4A ; G 1738 -U 8011 ; WX 1237 ; N uni1F4B ; G 1739 -U 8012 ; WX 1035 ; N uni1F4C ; G 1740 -U 8013 ; WX 1066 ; N uni1F4D ; G 1741 -U 8016 ; WX 694 ; N uni1F50 ; G 1742 -U 8017 ; WX 694 ; N uni1F51 ; G 1743 -U 8018 ; WX 694 ; N uni1F52 ; G 1744 -U 8019 ; WX 694 ; N uni1F53 ; G 1745 -U 8020 ; WX 694 ; N uni1F54 ; G 1746 -U 8021 ; WX 694 ; N uni1F55 ; G 1747 -U 8022 ; WX 694 ; N uni1F56 ; G 1748 -U 8023 ; WX 694 ; N uni1F57 ; G 1749 -U 8025 ; WX 922 ; N uni1F59 ; G 1750 -U 8027 ; WX 1186 ; N uni1F5B ; G 1751 -U 8029 ; WX 1133 ; N uni1F5D ; G 1752 -U 8031 ; WX 1019 ; N uni1F5F ; G 1753 -U 8032 ; WX 952 ; N uni1F60 ; G 1754 -U 8033 ; WX 952 ; N uni1F61 ; G 1755 -U 8034 ; WX 952 ; N uni1F62 ; G 1756 -U 8035 ; WX 952 ; N uni1F63 ; G 1757 -U 8036 ; WX 952 ; N uni1F64 ; G 1758 -U 8037 ; WX 952 ; N uni1F65 ; G 1759 -U 8038 ; WX 952 ; N uni1F66 ; G 1760 -U 8039 ; WX 952 ; N uni1F67 ; G 1761 -U 8040 ; WX 931 ; N uni1F68 ; G 1762 -U 8041 ; WX 963 ; N uni1F69 ; G 1763 -U 8042 ; WX 1268 ; N uni1F6A ; G 1764 -U 8043 ; WX 1274 ; N uni1F6B ; G 1765 -U 8044 ; WX 1054 ; N uni1F6C ; G 1766 -U 8045 ; WX 1088 ; N uni1F6D ; G 1767 -U 8046 ; WX 1023 ; N uni1F6E ; G 1768 -U 8047 ; WX 1060 ; N uni1F6F ; G 1769 -U 8048 ; WX 770 ; N uni1F70 ; G 1770 -U 8049 ; WX 770 ; N uni1F71 ; G 1771 -U 8050 ; WX 608 ; N uni1F72 ; G 1772 -U 8051 ; WX 608 ; N uni1F73 ; G 1773 -U 8052 ; WX 727 ; N uni1F74 ; G 1774 -U 8053 ; WX 727 ; N uni1F75 ; G 1775 -U 8054 ; WX 484 ; N uni1F76 ; G 1776 -U 8055 ; WX 484 ; N uni1F77 ; G 1777 -U 8056 ; WX 667 ; N uni1F78 ; G 1778 -U 8057 ; WX 667 ; N uni1F79 ; G 1779 -U 8058 ; WX 694 ; N uni1F7A ; G 1780 -U 8059 ; WX 694 ; N uni1F7B ; G 1781 -U 8060 ; WX 952 ; N uni1F7C ; G 1782 -U 8061 ; WX 952 ; N uni1F7D ; G 1783 -U 8064 ; WX 770 ; N uni1F80 ; G 1784 -U 8065 ; WX 770 ; N uni1F81 ; G 1785 -U 8066 ; WX 770 ; N uni1F82 ; G 1786 -U 8067 ; WX 770 ; N uni1F83 ; G 1787 -U 8068 ; WX 770 ; N uni1F84 ; G 1788 -U 8069 ; WX 770 ; N uni1F85 ; G 1789 -U 8070 ; WX 770 ; N uni1F86 ; G 1790 -U 8071 ; WX 770 ; N uni1F87 ; G 1791 -U 8072 ; WX 776 ; N uni1F88 ; G 1792 -U 8073 ; WX 776 ; N uni1F89 ; G 1793 -U 8074 ; WX 978 ; N uni1F8A ; G 1794 -U 8075 ; WX 978 ; N uni1F8B ; G 1795 -U 8076 ; WX 832 ; N uni1F8C ; G 1796 -U 8077 ; WX 849 ; N uni1F8D ; G 1797 -U 8078 ; WX 776 ; N uni1F8E ; G 1798 -U 8079 ; WX 776 ; N uni1F8F ; G 1799 -U 8080 ; WX 727 ; N uni1F90 ; G 1800 -U 8081 ; WX 727 ; N uni1F91 ; G 1801 -U 8082 ; WX 727 ; N uni1F92 ; G 1802 -U 8083 ; WX 727 ; N uni1F93 ; G 1803 -U 8084 ; WX 727 ; N uni1F94 ; G 1804 -U 8085 ; WX 727 ; N uni1F95 ; G 1805 -U 8086 ; WX 727 ; N uni1F96 ; G 1806 -U 8087 ; WX 727 ; N uni1F97 ; G 1807 -U 8088 ; WX 1100 ; N uni1F98 ; G 1808 -U 8089 ; WX 1094 ; N uni1F99 ; G 1809 -U 8090 ; WX 1358 ; N uni1F9A ; G 1810 -U 8091 ; WX 1361 ; N uni1F9B ; G 1811 -U 8092 ; WX 1279 ; N uni1F9C ; G 1812 -U 8093 ; WX 1308 ; N uni1F9D ; G 1813 -U 8094 ; WX 1197 ; N uni1F9E ; G 1814 -U 8095 ; WX 1194 ; N uni1F9F ; G 1815 -U 8096 ; WX 952 ; N uni1FA0 ; G 1816 -U 8097 ; WX 952 ; N uni1FA1 ; G 1817 -U 8098 ; WX 952 ; N uni1FA2 ; G 1818 -U 8099 ; WX 952 ; N uni1FA3 ; G 1819 -U 8100 ; WX 952 ; N uni1FA4 ; G 1820 -U 8101 ; WX 952 ; N uni1FA5 ; G 1821 -U 8102 ; WX 952 ; N uni1FA6 ; G 1822 -U 8103 ; WX 952 ; N uni1FA7 ; G 1823 -U 8104 ; WX 931 ; N uni1FA8 ; G 1824 -U 8105 ; WX 963 ; N uni1FA9 ; G 1825 -U 8106 ; WX 1268 ; N uni1FAA ; G 1826 -U 8107 ; WX 1274 ; N uni1FAB ; G 1827 -U 8108 ; WX 1054 ; N uni1FAC ; G 1828 -U 8109 ; WX 1088 ; N uni1FAD ; G 1829 -U 8110 ; WX 1023 ; N uni1FAE ; G 1830 -U 8111 ; WX 1060 ; N uni1FAF ; G 1831 -U 8112 ; WX 770 ; N uni1FB0 ; G 1832 -U 8113 ; WX 770 ; N uni1FB1 ; G 1833 -U 8114 ; WX 770 ; N uni1FB2 ; G 1834 -U 8115 ; WX 770 ; N uni1FB3 ; G 1835 -U 8116 ; WX 770 ; N uni1FB4 ; G 1836 -U 8118 ; WX 770 ; N uni1FB6 ; G 1837 -U 8119 ; WX 770 ; N uni1FB7 ; G 1838 -U 8120 ; WX 776 ; N uni1FB8 ; G 1839 -U 8121 ; WX 776 ; N uni1FB9 ; G 1840 -U 8122 ; WX 811 ; N uni1FBA ; G 1841 -U 8123 ; WX 776 ; N uni1FBB ; G 1842 -U 8124 ; WX 776 ; N uni1FBC ; G 1843 -U 8125 ; WX 500 ; N uni1FBD ; G 1844 -U 8126 ; WX 500 ; N uni1FBE ; G 1845 -U 8127 ; WX 500 ; N uni1FBF ; G 1846 -U 8128 ; WX 500 ; N uni1FC0 ; G 1847 -U 8129 ; WX 500 ; N uni1FC1 ; G 1848 -U 8130 ; WX 727 ; N uni1FC2 ; G 1849 -U 8131 ; WX 727 ; N uni1FC3 ; G 1850 -U 8132 ; WX 727 ; N uni1FC4 ; G 1851 -U 8134 ; WX 727 ; N uni1FC6 ; G 1852 -U 8135 ; WX 727 ; N uni1FC7 ; G 1853 -U 8136 ; WX 1000 ; N uni1FC8 ; G 1854 -U 8137 ; WX 947 ; N uni1FC9 ; G 1855 -U 8138 ; WX 1191 ; N uni1FCA ; G 1856 -U 8139 ; WX 1118 ; N uni1FCB ; G 1857 -U 8140 ; WX 945 ; N uni1FCC ; G 1858 -U 8141 ; WX 500 ; N uni1FCD ; G 1859 -U 8142 ; WX 500 ; N uni1FCE ; G 1860 -U 8143 ; WX 500 ; N uni1FCF ; G 1861 -U 8144 ; WX 484 ; N uni1FD0 ; G 1862 -U 8145 ; WX 484 ; N uni1FD1 ; G 1863 -U 8146 ; WX 484 ; N uni1FD2 ; G 1864 -U 8147 ; WX 484 ; N uni1FD3 ; G 1865 -U 8150 ; WX 484 ; N uni1FD6 ; G 1866 -U 8151 ; WX 484 ; N uni1FD7 ; G 1867 -U 8152 ; WX 468 ; N uni1FD8 ; G 1868 -U 8153 ; WX 468 ; N uni1FD9 ; G 1869 -U 8154 ; WX 714 ; N uni1FDA ; G 1870 -U 8155 ; WX 662 ; N uni1FDB ; G 1871 -U 8157 ; WX 500 ; N uni1FDD ; G 1872 -U 8158 ; WX 500 ; N uni1FDE ; G 1873 -U 8159 ; WX 500 ; N uni1FDF ; G 1874 -U 8160 ; WX 694 ; N uni1FE0 ; G 1875 -U 8161 ; WX 694 ; N uni1FE1 ; G 1876 -U 8162 ; WX 694 ; N uni1FE2 ; G 1877 -U 8163 ; WX 694 ; N uni1FE3 ; G 1878 -U 8164 ; WX 665 ; N uni1FE4 ; G 1879 -U 8165 ; WX 665 ; N uni1FE5 ; G 1880 -U 8166 ; WX 694 ; N uni1FE6 ; G 1881 -U 8167 ; WX 694 ; N uni1FE7 ; G 1882 -U 8168 ; WX 714 ; N uni1FE8 ; G 1883 -U 8169 ; WX 714 ; N uni1FE9 ; G 1884 -U 8170 ; WX 1019 ; N uni1FEA ; G 1885 -U 8171 ; WX 953 ; N uni1FEB ; G 1886 -U 8172 ; WX 910 ; N uni1FEC ; G 1887 -U 8173 ; WX 500 ; N uni1FED ; G 1888 -U 8174 ; WX 500 ; N uni1FEE ; G 1889 -U 8175 ; WX 500 ; N uni1FEF ; G 1890 -U 8178 ; WX 952 ; N uni1FF2 ; G 1891 -U 8179 ; WX 952 ; N uni1FF3 ; G 1892 -U 8180 ; WX 952 ; N uni1FF4 ; G 1893 -U 8182 ; WX 952 ; N uni1FF6 ; G 1894 -U 8183 ; WX 952 ; N uni1FF7 ; G 1895 -U 8184 ; WX 1069 ; N uni1FF8 ; G 1896 -U 8185 ; WX 887 ; N uni1FF9 ; G 1897 -U 8186 ; WX 1101 ; N uni1FFA ; G 1898 -U 8187 ; WX 911 ; N uni1FFB ; G 1899 -U 8188 ; WX 890 ; N uni1FFC ; G 1900 -U 8189 ; WX 500 ; N uni1FFD ; G 1901 -U 8190 ; WX 500 ; N uni1FFE ; G 1902 -U 8192 ; WX 500 ; N uni2000 ; G 1903 -U 8193 ; WX 1000 ; N uni2001 ; G 1904 -U 8194 ; WX 500 ; N uni2002 ; G 1905 -U 8195 ; WX 1000 ; N uni2003 ; G 1906 -U 8196 ; WX 330 ; N uni2004 ; G 1907 -U 8197 ; WX 250 ; N uni2005 ; G 1908 -U 8198 ; WX 167 ; N uni2006 ; G 1909 -U 8199 ; WX 696 ; N uni2007 ; G 1910 -U 8200 ; WX 348 ; N uni2008 ; G 1911 -U 8201 ; WX 200 ; N uni2009 ; G 1912 -U 8202 ; WX 100 ; N uni200A ; G 1913 -U 8203 ; WX 0 ; N uni200B ; G 1914 -U 8204 ; WX 0 ; N uni200C ; G 1915 -U 8205 ; WX 0 ; N uni200D ; G 1916 -U 8206 ; WX 0 ; N uni200E ; G 1917 -U 8207 ; WX 0 ; N uni200F ; G 1918 -U 8208 ; WX 415 ; N uni2010 ; G 1919 -U 8209 ; WX 415 ; N uni2011 ; G 1920 -U 8210 ; WX 696 ; N figuredash ; G 1921 -U 8211 ; WX 500 ; N endash ; G 1922 -U 8212 ; WX 1000 ; N emdash ; G 1923 -U 8213 ; WX 1000 ; N uni2015 ; G 1924 -U 8214 ; WX 500 ; N uni2016 ; G 1925 -U 8215 ; WX 500 ; N underscoredbl ; G 1926 -U 8216 ; WX 348 ; N quoteleft ; G 1927 -U 8217 ; WX 348 ; N quoteright ; G 1928 -U 8218 ; WX 348 ; N quotesinglbase ; G 1929 -U 8219 ; WX 348 ; N quotereversed ; G 1930 -U 8220 ; WX 575 ; N quotedblleft ; G 1931 -U 8221 ; WX 575 ; N quotedblright ; G 1932 -U 8222 ; WX 575 ; N quotedblbase ; G 1933 -U 8223 ; WX 575 ; N uni201F ; G 1934 -U 8224 ; WX 523 ; N dagger ; G 1935 -U 8225 ; WX 523 ; N daggerdbl ; G 1936 -U 8226 ; WX 639 ; N bullet ; G 1937 -U 8227 ; WX 639 ; N uni2023 ; G 1938 -U 8228 ; WX 348 ; N onedotenleader ; G 1939 -U 8229 ; WX 674 ; N twodotenleader ; G 1940 -U 8230 ; WX 1000 ; N ellipsis ; G 1941 -U 8234 ; WX 0 ; N uni202A ; G 1942 -U 8235 ; WX 0 ; N uni202B ; G 1943 -U 8236 ; WX 0 ; N uni202C ; G 1944 -U 8237 ; WX 0 ; N uni202D ; G 1945 -U 8238 ; WX 0 ; N uni202E ; G 1946 -U 8239 ; WX 200 ; N uni202F ; G 1947 -U 8240 ; WX 1385 ; N perthousand ; G 1948 -U 8241 ; WX 1820 ; N uni2031 ; G 1949 -U 8242 ; WX 264 ; N minute ; G 1950 -U 8243 ; WX 447 ; N second ; G 1951 -U 8244 ; WX 630 ; N uni2034 ; G 1952 -U 8245 ; WX 264 ; N uni2035 ; G 1953 -U 8246 ; WX 447 ; N uni2036 ; G 1954 -U 8247 ; WX 630 ; N uni2037 ; G 1955 -U 8248 ; WX 733 ; N uni2038 ; G 1956 -U 8249 ; WX 400 ; N guilsinglleft ; G 1957 -U 8250 ; WX 400 ; N guilsinglright ; G 1958 -U 8252 ; WX 629 ; N exclamdbl ; G 1959 -U 8253 ; WX 586 ; N uni203D ; G 1960 -U 8254 ; WX 500 ; N uni203E ; G 1961 -U 8258 ; WX 1023 ; N uni2042 ; G 1962 -U 8260 ; WX 167 ; N fraction ; G 1963 -U 8261 ; WX 473 ; N uni2045 ; G 1964 -U 8262 ; WX 473 ; N uni2046 ; G 1965 -U 8263 ; WX 1082 ; N uni2047 ; G 1966 -U 8264 ; WX 856 ; N uni2048 ; G 1967 -U 8265 ; WX 856 ; N uni2049 ; G 1968 -U 8267 ; WX 636 ; N uni204B ; G 1969 -U 8268 ; WX 500 ; N uni204C ; G 1970 -U 8269 ; WX 500 ; N uni204D ; G 1971 -U 8270 ; WX 523 ; N uni204E ; G 1972 -U 8271 ; WX 369 ; N uni204F ; G 1973 -U 8273 ; WX 523 ; N uni2051 ; G 1974 -U 8274 ; WX 556 ; N uni2052 ; G 1975 -U 8275 ; WX 1000 ; N uni2053 ; G 1976 -U 8279 ; WX 813 ; N uni2057 ; G 1977 -U 8287 ; WX 222 ; N uni205F ; G 1978 -U 8288 ; WX 0 ; N uni2060 ; G 1979 -U 8289 ; WX 0 ; N uni2061 ; G 1980 -U 8290 ; WX 0 ; N uni2062 ; G 1981 -U 8291 ; WX 0 ; N uni2063 ; G 1982 -U 8292 ; WX 0 ; N uni2064 ; G 1983 -U 8298 ; WX 0 ; N uni206A ; G 1984 -U 8299 ; WX 0 ; N uni206B ; G 1985 -U 8300 ; WX 0 ; N uni206C ; G 1986 -U 8301 ; WX 0 ; N uni206D ; G 1987 -U 8302 ; WX 0 ; N uni206E ; G 1988 -U 8303 ; WX 0 ; N uni206F ; G 1989 -U 8304 ; WX 438 ; N uni2070 ; G 1990 -U 8305 ; WX 239 ; N uni2071 ; G 1991 -U 8308 ; WX 438 ; N uni2074 ; G 1992 -U 8309 ; WX 438 ; N uni2075 ; G 1993 -U 8310 ; WX 438 ; N uni2076 ; G 1994 -U 8311 ; WX 438 ; N uni2077 ; G 1995 -U 8312 ; WX 438 ; N uni2078 ; G 1996 -U 8313 ; WX 438 ; N uni2079 ; G 1997 -U 8314 ; WX 528 ; N uni207A ; G 1998 -U 8315 ; WX 528 ; N uni207B ; G 1999 -U 8316 ; WX 528 ; N uni207C ; G 2000 -U 8317 ; WX 298 ; N uni207D ; G 2001 -U 8318 ; WX 298 ; N uni207E ; G 2002 -U 8319 ; WX 519 ; N uni207F ; G 2003 -U 8320 ; WX 438 ; N uni2080 ; G 2004 -U 8321 ; WX 438 ; N uni2081 ; G 2005 -U 8322 ; WX 438 ; N uni2082 ; G 2006 -U 8323 ; WX 438 ; N uni2083 ; G 2007 -U 8324 ; WX 438 ; N uni2084 ; G 2008 -U 8325 ; WX 438 ; N uni2085 ; G 2009 -U 8326 ; WX 438 ; N uni2086 ; G 2010 -U 8327 ; WX 438 ; N uni2087 ; G 2011 -U 8328 ; WX 438 ; N uni2088 ; G 2012 -U 8329 ; WX 438 ; N uni2089 ; G 2013 -U 8330 ; WX 528 ; N uni208A ; G 2014 -U 8331 ; WX 528 ; N uni208B ; G 2015 -U 8332 ; WX 528 ; N uni208C ; G 2016 -U 8333 ; WX 298 ; N uni208D ; G 2017 -U 8334 ; WX 298 ; N uni208E ; G 2018 -U 8336 ; WX 466 ; N uni2090 ; G 2019 -U 8337 ; WX 444 ; N uni2091 ; G 2020 -U 8338 ; WX 467 ; N uni2092 ; G 2021 -U 8339 ; WX 475 ; N uni2093 ; G 2022 -U 8340 ; WX 444 ; N uni2094 ; G 2023 -U 8341 ; WX 521 ; N uni2095 ; G 2024 -U 8342 ; WX 523 ; N uni2096 ; G 2025 -U 8343 ; WX 292 ; N uni2097 ; G 2026 -U 8344 ; WX 729 ; N uni2098 ; G 2027 -U 8345 ; WX 519 ; N uni2099 ; G 2028 -U 8346 ; WX 499 ; N uni209A ; G 2029 -U 8347 ; WX 395 ; N uni209B ; G 2030 -U 8348 ; WX 371 ; N uni209C ; G 2031 -U 8358 ; WX 696 ; N uni20A6 ; G 2032 -U 8364 ; WX 696 ; N Euro ; G 2033 -U 8367 ; WX 1155 ; N uni20AF ; G 2034 -U 8369 ; WX 790 ; N uni20B1 ; G 2035 -U 8372 ; WX 876 ; N uni20B4 ; G 2036 -U 8373 ; WX 696 ; N uni20B5 ; G 2037 -U 8376 ; WX 696 ; N uni20B8 ; G 2038 -U 8377 ; WX 696 ; N uni20B9 ; G 2039 -U 8378 ; WX 696 ; N uni20BA ; G 2040 -U 8381 ; WX 696 ; N uni20BD ; G 2041 -U 8451 ; WX 1198 ; N uni2103 ; G 2042 -U 8457 ; WX 1112 ; N uni2109 ; G 2043 -U 8462 ; WX 727 ; N uni210E ; G 2044 -U 8463 ; WX 727 ; N uni210F ; G 2045 -U 8470 ; WX 1087 ; N uni2116 ; G 2046 -U 8482 ; WX 1000 ; N trademark ; G 2047 -U 8486 ; WX 890 ; N uni2126 ; G 2048 -U 8487 ; WX 890 ; N uni2127 ; G 2049 -U 8490 ; WX 869 ; N uni212A ; G 2050 -U 8491 ; WX 776 ; N uni212B ; G 2051 -U 8498 ; WX 710 ; N uni2132 ; G 2052 -U 8513 ; WX 775 ; N uni2141 ; G 2053 -U 8514 ; WX 557 ; N uni2142 ; G 2054 -U 8515 ; WX 637 ; N uni2143 ; G 2055 -U 8516 ; WX 760 ; N uni2144 ; G 2056 -U 8523 ; WX 903 ; N uni214B ; G 2057 -U 8526 ; WX 592 ; N uni214E ; G 2058 -U 8528 ; WX 1035 ; N uni2150 ; G 2059 -U 8529 ; WX 1035 ; N uni2151 ; G 2060 -U 8530 ; WX 1473 ; N uni2152 ; G 2061 -U 8531 ; WX 1035 ; N onethird ; G 2062 -U 8532 ; WX 1035 ; N twothirds ; G 2063 -U 8533 ; WX 1035 ; N uni2155 ; G 2064 -U 8534 ; WX 1035 ; N uni2156 ; G 2065 -U 8535 ; WX 1035 ; N uni2157 ; G 2066 -U 8536 ; WX 1035 ; N uni2158 ; G 2067 -U 8537 ; WX 1035 ; N uni2159 ; G 2068 -U 8538 ; WX 1035 ; N uni215A ; G 2069 -U 8539 ; WX 1035 ; N oneeighth ; G 2070 -U 8540 ; WX 1035 ; N threeeighths ; G 2071 -U 8541 ; WX 1035 ; N fiveeighths ; G 2072 -U 8542 ; WX 1035 ; N seveneighths ; G 2073 -U 8543 ; WX 615 ; N uni215F ; G 2074 -U 8544 ; WX 468 ; N uni2160 ; G 2075 -U 8545 ; WX 843 ; N uni2161 ; G 2076 -U 8546 ; WX 1218 ; N uni2162 ; G 2077 -U 8547 ; WX 1135 ; N uni2163 ; G 2078 -U 8548 ; WX 776 ; N uni2164 ; G 2079 -U 8549 ; WX 1150 ; N uni2165 ; G 2080 -U 8550 ; WX 1525 ; N uni2166 ; G 2081 -U 8551 ; WX 1900 ; N uni2167 ; G 2082 -U 8552 ; WX 1126 ; N uni2168 ; G 2083 -U 8553 ; WX 776 ; N uni2169 ; G 2084 -U 8554 ; WX 1127 ; N uni216A ; G 2085 -U 8555 ; WX 1502 ; N uni216B ; G 2086 -U 8556 ; WX 703 ; N uni216C ; G 2087 -U 8557 ; WX 796 ; N uni216D ; G 2088 -U 8558 ; WX 867 ; N uni216E ; G 2089 -U 8559 ; WX 1107 ; N uni216F ; G 2090 -U 8560 ; WX 380 ; N uni2170 ; G 2091 -U 8561 ; WX 760 ; N uni2171 ; G 2092 -U 8562 ; WX 1140 ; N uni2172 ; G 2093 -U 8563 ; WX 961 ; N uni2173 ; G 2094 -U 8564 ; WX 581 ; N uni2174 ; G 2095 -U 8565 ; WX 961 ; N uni2175 ; G 2096 -U 8566 ; WX 1341 ; N uni2176 ; G 2097 -U 8567 ; WX 1721 ; N uni2177 ; G 2098 -U 8568 ; WX 976 ; N uni2178 ; G 2099 -U 8569 ; WX 596 ; N uni2179 ; G 2100 -U 8570 ; WX 976 ; N uni217A ; G 2101 -U 8571 ; WX 1356 ; N uni217B ; G 2102 -U 8572 ; WX 380 ; N uni217C ; G 2103 -U 8573 ; WX 609 ; N uni217D ; G 2104 -U 8574 ; WX 699 ; N uni217E ; G 2105 -U 8575 ; WX 1058 ; N uni217F ; G 2106 -U 8576 ; WX 1255 ; N uni2180 ; G 2107 -U 8577 ; WX 867 ; N uni2181 ; G 2108 -U 8578 ; WX 1268 ; N uni2182 ; G 2109 -U 8579 ; WX 796 ; N uni2183 ; G 2110 -U 8580 ; WX 609 ; N uni2184 ; G 2111 -U 8581 ; WX 796 ; N uni2185 ; G 2112 -U 8585 ; WX 1035 ; N uni2189 ; G 2113 -U 8592 ; WX 838 ; N arrowleft ; G 2114 -U 8593 ; WX 838 ; N arrowup ; G 2115 -U 8594 ; WX 838 ; N arrowright ; G 2116 -U 8595 ; WX 838 ; N arrowdown ; G 2117 -U 8596 ; WX 838 ; N arrowboth ; G 2118 -U 8597 ; WX 838 ; N arrowupdn ; G 2119 -U 8598 ; WX 838 ; N uni2196 ; G 2120 -U 8599 ; WX 838 ; N uni2197 ; G 2121 -U 8600 ; WX 838 ; N uni2198 ; G 2122 -U 8601 ; WX 838 ; N uni2199 ; G 2123 -U 8602 ; WX 838 ; N uni219A ; G 2124 -U 8603 ; WX 838 ; N uni219B ; G 2125 -U 8604 ; WX 838 ; N uni219C ; G 2126 -U 8605 ; WX 838 ; N uni219D ; G 2127 -U 8606 ; WX 838 ; N uni219E ; G 2128 -U 8607 ; WX 838 ; N uni219F ; G 2129 -U 8608 ; WX 838 ; N uni21A0 ; G 2130 -U 8609 ; WX 838 ; N uni21A1 ; G 2131 -U 8610 ; WX 838 ; N uni21A2 ; G 2132 -U 8611 ; WX 838 ; N uni21A3 ; G 2133 -U 8612 ; WX 838 ; N uni21A4 ; G 2134 -U 8613 ; WX 838 ; N uni21A5 ; G 2135 -U 8614 ; WX 838 ; N uni21A6 ; G 2136 -U 8615 ; WX 838 ; N uni21A7 ; G 2137 -U 8616 ; WX 838 ; N arrowupdnbse ; G 2138 -U 8617 ; WX 838 ; N uni21A9 ; G 2139 -U 8618 ; WX 838 ; N uni21AA ; G 2140 -U 8619 ; WX 838 ; N uni21AB ; G 2141 -U 8620 ; WX 838 ; N uni21AC ; G 2142 -U 8621 ; WX 838 ; N uni21AD ; G 2143 -U 8622 ; WX 838 ; N uni21AE ; G 2144 -U 8623 ; WX 850 ; N uni21AF ; G 2145 -U 8624 ; WX 838 ; N uni21B0 ; G 2146 -U 8625 ; WX 838 ; N uni21B1 ; G 2147 -U 8626 ; WX 838 ; N uni21B2 ; G 2148 -U 8627 ; WX 838 ; N uni21B3 ; G 2149 -U 8628 ; WX 838 ; N uni21B4 ; G 2150 -U 8629 ; WX 838 ; N carriagereturn ; G 2151 -U 8630 ; WX 838 ; N uni21B6 ; G 2152 -U 8631 ; WX 838 ; N uni21B7 ; G 2153 -U 8632 ; WX 838 ; N uni21B8 ; G 2154 -U 8633 ; WX 838 ; N uni21B9 ; G 2155 -U 8634 ; WX 838 ; N uni21BA ; G 2156 -U 8635 ; WX 838 ; N uni21BB ; G 2157 -U 8636 ; WX 838 ; N uni21BC ; G 2158 -U 8637 ; WX 838 ; N uni21BD ; G 2159 -U 8638 ; WX 838 ; N uni21BE ; G 2160 -U 8639 ; WX 838 ; N uni21BF ; G 2161 -U 8640 ; WX 838 ; N uni21C0 ; G 2162 -U 8641 ; WX 838 ; N uni21C1 ; G 2163 -U 8642 ; WX 838 ; N uni21C2 ; G 2164 -U 8643 ; WX 838 ; N uni21C3 ; G 2165 -U 8644 ; WX 838 ; N uni21C4 ; G 2166 -U 8645 ; WX 838 ; N uni21C5 ; G 2167 -U 8646 ; WX 838 ; N uni21C6 ; G 2168 -U 8647 ; WX 838 ; N uni21C7 ; G 2169 -U 8648 ; WX 838 ; N uni21C8 ; G 2170 -U 8649 ; WX 838 ; N uni21C9 ; G 2171 -U 8650 ; WX 838 ; N uni21CA ; G 2172 -U 8651 ; WX 838 ; N uni21CB ; G 2173 -U 8652 ; WX 838 ; N uni21CC ; G 2174 -U 8653 ; WX 838 ; N uni21CD ; G 2175 -U 8654 ; WX 838 ; N uni21CE ; G 2176 -U 8655 ; WX 838 ; N uni21CF ; G 2177 -U 8656 ; WX 838 ; N arrowdblleft ; G 2178 -U 8657 ; WX 838 ; N arrowdblup ; G 2179 -U 8658 ; WX 838 ; N arrowdblright ; G 2180 -U 8659 ; WX 838 ; N arrowdbldown ; G 2181 -U 8660 ; WX 838 ; N arrowdblboth ; G 2182 -U 8661 ; WX 838 ; N uni21D5 ; G 2183 -U 8662 ; WX 838 ; N uni21D6 ; G 2184 -U 8663 ; WX 838 ; N uni21D7 ; G 2185 -U 8664 ; WX 838 ; N uni21D8 ; G 2186 -U 8665 ; WX 838 ; N uni21D9 ; G 2187 -U 8666 ; WX 838 ; N uni21DA ; G 2188 -U 8667 ; WX 838 ; N uni21DB ; G 2189 -U 8668 ; WX 838 ; N uni21DC ; G 2190 -U 8669 ; WX 838 ; N uni21DD ; G 2191 -U 8670 ; WX 838 ; N uni21DE ; G 2192 -U 8671 ; WX 838 ; N uni21DF ; G 2193 -U 8672 ; WX 838 ; N uni21E0 ; G 2194 -U 8673 ; WX 838 ; N uni21E1 ; G 2195 -U 8674 ; WX 838 ; N uni21E2 ; G 2196 -U 8675 ; WX 838 ; N uni21E3 ; G 2197 -U 8676 ; WX 838 ; N uni21E4 ; G 2198 -U 8677 ; WX 838 ; N uni21E5 ; G 2199 -U 8678 ; WX 838 ; N uni21E6 ; G 2200 -U 8679 ; WX 838 ; N uni21E7 ; G 2201 -U 8680 ; WX 838 ; N uni21E8 ; G 2202 -U 8681 ; WX 838 ; N uni21E9 ; G 2203 -U 8682 ; WX 838 ; N uni21EA ; G 2204 -U 8683 ; WX 838 ; N uni21EB ; G 2205 -U 8684 ; WX 838 ; N uni21EC ; G 2206 -U 8685 ; WX 838 ; N uni21ED ; G 2207 -U 8686 ; WX 838 ; N uni21EE ; G 2208 -U 8687 ; WX 838 ; N uni21EF ; G 2209 -U 8688 ; WX 838 ; N uni21F0 ; G 2210 -U 8689 ; WX 838 ; N uni21F1 ; G 2211 -U 8690 ; WX 838 ; N uni21F2 ; G 2212 -U 8691 ; WX 838 ; N uni21F3 ; G 2213 -U 8692 ; WX 838 ; N uni21F4 ; G 2214 -U 8693 ; WX 838 ; N uni21F5 ; G 2215 -U 8694 ; WX 838 ; N uni21F6 ; G 2216 -U 8695 ; WX 838 ; N uni21F7 ; G 2217 -U 8696 ; WX 838 ; N uni21F8 ; G 2218 -U 8697 ; WX 838 ; N uni21F9 ; G 2219 -U 8698 ; WX 838 ; N uni21FA ; G 2220 -U 8699 ; WX 838 ; N uni21FB ; G 2221 -U 8700 ; WX 838 ; N uni21FC ; G 2222 -U 8701 ; WX 838 ; N uni21FD ; G 2223 -U 8702 ; WX 838 ; N uni21FE ; G 2224 -U 8703 ; WX 838 ; N uni21FF ; G 2225 -U 8704 ; WX 641 ; N universal ; G 2226 -U 8706 ; WX 534 ; N partialdiff ; G 2227 -U 8707 ; WX 620 ; N existential ; G 2228 -U 8708 ; WX 620 ; N uni2204 ; G 2229 -U 8710 ; WX 753 ; N increment ; G 2230 -U 8711 ; WX 753 ; N gradient ; G 2231 -U 8712 ; WX 740 ; N element ; G 2232 -U 8713 ; WX 740 ; N notelement ; G 2233 -U 8715 ; WX 740 ; N suchthat ; G 2234 -U 8716 ; WX 740 ; N uni220C ; G 2235 -U 8719 ; WX 842 ; N product ; G 2236 -U 8720 ; WX 842 ; N uni2210 ; G 2237 -U 8721 ; WX 753 ; N summation ; G 2238 -U 8722 ; WX 838 ; N minus ; G 2239 -U 8723 ; WX 838 ; N uni2213 ; G 2240 -U 8724 ; WX 838 ; N uni2214 ; G 2241 -U 8725 ; WX 365 ; N uni2215 ; G 2242 -U 8727 ; WX 691 ; N asteriskmath ; G 2243 -U 8728 ; WX 519 ; N uni2218 ; G 2244 -U 8729 ; WX 519 ; N uni2219 ; G 2245 -U 8730 ; WX 657 ; N radical ; G 2246 -U 8731 ; WX 657 ; N uni221B ; G 2247 -U 8732 ; WX 657 ; N uni221C ; G 2248 -U 8733 ; WX 672 ; N proportional ; G 2249 -U 8734 ; WX 833 ; N infinity ; G 2250 -U 8735 ; WX 838 ; N orthogonal ; G 2251 -U 8736 ; WX 838 ; N angle ; G 2252 -U 8739 ; WX 324 ; N uni2223 ; G 2253 -U 8740 ; WX 607 ; N uni2224 ; G 2254 -U 8741 ; WX 529 ; N uni2225 ; G 2255 -U 8742 ; WX 773 ; N uni2226 ; G 2256 -U 8743 ; WX 812 ; N logicaland ; G 2257 -U 8744 ; WX 812 ; N logicalor ; G 2258 -U 8745 ; WX 838 ; N intersection ; G 2259 -U 8746 ; WX 838 ; N union ; G 2260 -U 8747 ; WX 579 ; N integral ; G 2261 -U 8748 ; WX 1000 ; N uni222C ; G 2262 -U 8749 ; WX 1391 ; N uni222D ; G 2263 -U 8760 ; WX 838 ; N uni2238 ; G 2264 -U 8761 ; WX 838 ; N uni2239 ; G 2265 -U 8762 ; WX 838 ; N uni223A ; G 2266 -U 8763 ; WX 838 ; N uni223B ; G 2267 -U 8764 ; WX 838 ; N similar ; G 2268 -U 8765 ; WX 838 ; N uni223D ; G 2269 -U 8770 ; WX 838 ; N uni2242 ; G 2270 -U 8771 ; WX 838 ; N uni2243 ; G 2271 -U 8776 ; WX 838 ; N approxequal ; G 2272 -U 8784 ; WX 838 ; N uni2250 ; G 2273 -U 8785 ; WX 838 ; N uni2251 ; G 2274 -U 8786 ; WX 838 ; N uni2252 ; G 2275 -U 8787 ; WX 838 ; N uni2253 ; G 2276 -U 8788 ; WX 1082 ; N uni2254 ; G 2277 -U 8789 ; WX 1082 ; N uni2255 ; G 2278 -U 8800 ; WX 838 ; N notequal ; G 2279 -U 8801 ; WX 838 ; N equivalence ; G 2280 -U 8804 ; WX 838 ; N lessequal ; G 2281 -U 8805 ; WX 838 ; N greaterequal ; G 2282 -U 8834 ; WX 838 ; N propersubset ; G 2283 -U 8835 ; WX 838 ; N propersuperset ; G 2284 -U 8836 ; WX 838 ; N notsubset ; G 2285 -U 8837 ; WX 838 ; N uni2285 ; G 2286 -U 8838 ; WX 838 ; N reflexsubset ; G 2287 -U 8839 ; WX 838 ; N reflexsuperset ; G 2288 -U 8844 ; WX 838 ; N uni228C ; G 2289 -U 8845 ; WX 838 ; N uni228D ; G 2290 -U 8846 ; WX 838 ; N uni228E ; G 2291 -U 8847 ; WX 838 ; N uni228F ; G 2292 -U 8848 ; WX 838 ; N uni2290 ; G 2293 -U 8849 ; WX 838 ; N uni2291 ; G 2294 -U 8850 ; WX 838 ; N uni2292 ; G 2295 -U 8851 ; WX 838 ; N uni2293 ; G 2296 -U 8852 ; WX 838 ; N uni2294 ; G 2297 -U 8853 ; WX 838 ; N circleplus ; G 2298 -U 8854 ; WX 838 ; N uni2296 ; G 2299 -U 8855 ; WX 838 ; N circlemultiply ; G 2300 -U 8856 ; WX 838 ; N uni2298 ; G 2301 -U 8857 ; WX 838 ; N uni2299 ; G 2302 -U 8858 ; WX 838 ; N uni229A ; G 2303 -U 8859 ; WX 838 ; N uni229B ; G 2304 -U 8860 ; WX 838 ; N uni229C ; G 2305 -U 8861 ; WX 838 ; N uni229D ; G 2306 -U 8862 ; WX 838 ; N uni229E ; G 2307 -U 8863 ; WX 838 ; N uni229F ; G 2308 -U 8864 ; WX 838 ; N uni22A0 ; G 2309 -U 8865 ; WX 838 ; N uni22A1 ; G 2310 -U 8866 ; WX 884 ; N uni22A2 ; G 2311 -U 8867 ; WX 884 ; N uni22A3 ; G 2312 -U 8868 ; WX 960 ; N uni22A4 ; G 2313 -U 8869 ; WX 960 ; N perpendicular ; G 2314 -U 8870 ; WX 616 ; N uni22A6 ; G 2315 -U 8871 ; WX 616 ; N uni22A7 ; G 2316 -U 8872 ; WX 884 ; N uni22A8 ; G 2317 -U 8873 ; WX 884 ; N uni22A9 ; G 2318 -U 8874 ; WX 884 ; N uni22AA ; G 2319 -U 8875 ; WX 1080 ; N uni22AB ; G 2320 -U 8876 ; WX 884 ; N uni22AC ; G 2321 -U 8877 ; WX 884 ; N uni22AD ; G 2322 -U 8878 ; WX 884 ; N uni22AE ; G 2323 -U 8879 ; WX 1080 ; N uni22AF ; G 2324 -U 8900 ; WX 626 ; N uni22C4 ; G 2325 -U 8901 ; WX 398 ; N dotmath ; G 2326 -U 8962 ; WX 834 ; N house ; G 2327 -U 8968 ; WX 473 ; N uni2308 ; G 2328 -U 8969 ; WX 473 ; N uni2309 ; G 2329 -U 8970 ; WX 473 ; N uni230A ; G 2330 -U 8971 ; WX 473 ; N uni230B ; G 2331 -U 8976 ; WX 838 ; N revlogicalnot ; G 2332 -U 8977 ; WX 539 ; N uni2311 ; G 2333 -U 8984 ; WX 928 ; N uni2318 ; G 2334 -U 8985 ; WX 838 ; N uni2319 ; G 2335 -U 8992 ; WX 579 ; N integraltp ; G 2336 -U 8993 ; WX 579 ; N integralbt ; G 2337 -U 8997 ; WX 1000 ; N uni2325 ; G 2338 -U 9000 ; WX 1443 ; N uni2328 ; G 2339 -U 9085 ; WX 1008 ; N uni237D ; G 2340 -U 9115 ; WX 500 ; N uni239B ; G 2341 -U 9116 ; WX 500 ; N uni239C ; G 2342 -U 9117 ; WX 500 ; N uni239D ; G 2343 -U 9118 ; WX 500 ; N uni239E ; G 2344 -U 9119 ; WX 500 ; N uni239F ; G 2345 -U 9120 ; WX 500 ; N uni23A0 ; G 2346 -U 9121 ; WX 500 ; N uni23A1 ; G 2347 -U 9122 ; WX 500 ; N uni23A2 ; G 2348 -U 9123 ; WX 500 ; N uni23A3 ; G 2349 -U 9124 ; WX 500 ; N uni23A4 ; G 2350 -U 9125 ; WX 500 ; N uni23A5 ; G 2351 -U 9126 ; WX 500 ; N uni23A6 ; G 2352 -U 9127 ; WX 750 ; N uni23A7 ; G 2353 -U 9128 ; WX 750 ; N uni23A8 ; G 2354 -U 9129 ; WX 750 ; N uni23A9 ; G 2355 -U 9130 ; WX 750 ; N uni23AA ; G 2356 -U 9131 ; WX 750 ; N uni23AB ; G 2357 -U 9132 ; WX 750 ; N uni23AC ; G 2358 -U 9133 ; WX 750 ; N uni23AD ; G 2359 -U 9134 ; WX 579 ; N uni23AE ; G 2360 -U 9167 ; WX 945 ; N uni23CF ; G 2361 -U 9251 ; WX 834 ; N uni2423 ; G 2362 -U 9472 ; WX 602 ; N SF100000 ; G 2363 -U 9473 ; WX 602 ; N uni2501 ; G 2364 -U 9474 ; WX 602 ; N SF110000 ; G 2365 -U 9475 ; WX 602 ; N uni2503 ; G 2366 -U 9476 ; WX 602 ; N uni2504 ; G 2367 -U 9477 ; WX 602 ; N uni2505 ; G 2368 -U 9478 ; WX 602 ; N uni2506 ; G 2369 -U 9479 ; WX 602 ; N uni2507 ; G 2370 -U 9480 ; WX 602 ; N uni2508 ; G 2371 -U 9481 ; WX 602 ; N uni2509 ; G 2372 -U 9482 ; WX 602 ; N uni250A ; G 2373 -U 9483 ; WX 602 ; N uni250B ; G 2374 -U 9484 ; WX 602 ; N SF010000 ; G 2375 -U 9485 ; WX 602 ; N uni250D ; G 2376 -U 9486 ; WX 602 ; N uni250E ; G 2377 -U 9487 ; WX 602 ; N uni250F ; G 2378 -U 9488 ; WX 602 ; N SF030000 ; G 2379 -U 9489 ; WX 602 ; N uni2511 ; G 2380 -U 9490 ; WX 602 ; N uni2512 ; G 2381 -U 9491 ; WX 602 ; N uni2513 ; G 2382 -U 9492 ; WX 602 ; N SF020000 ; G 2383 -U 9493 ; WX 602 ; N uni2515 ; G 2384 -U 9494 ; WX 602 ; N uni2516 ; G 2385 -U 9495 ; WX 602 ; N uni2517 ; G 2386 -U 9496 ; WX 602 ; N SF040000 ; G 2387 -U 9497 ; WX 602 ; N uni2519 ; G 2388 -U 9498 ; WX 602 ; N uni251A ; G 2389 -U 9499 ; WX 602 ; N uni251B ; G 2390 -U 9500 ; WX 602 ; N SF080000 ; G 2391 -U 9501 ; WX 602 ; N uni251D ; G 2392 -U 9502 ; WX 602 ; N uni251E ; G 2393 -U 9503 ; WX 602 ; N uni251F ; G 2394 -U 9504 ; WX 602 ; N uni2520 ; G 2395 -U 9505 ; WX 602 ; N uni2521 ; G 2396 -U 9506 ; WX 602 ; N uni2522 ; G 2397 -U 9507 ; WX 602 ; N uni2523 ; G 2398 -U 9508 ; WX 602 ; N SF090000 ; G 2399 -U 9509 ; WX 602 ; N uni2525 ; G 2400 -U 9510 ; WX 602 ; N uni2526 ; G 2401 -U 9511 ; WX 602 ; N uni2527 ; G 2402 -U 9512 ; WX 602 ; N uni2528 ; G 2403 -U 9513 ; WX 602 ; N uni2529 ; G 2404 -U 9514 ; WX 602 ; N uni252A ; G 2405 -U 9515 ; WX 602 ; N uni252B ; G 2406 -U 9516 ; WX 602 ; N SF060000 ; G 2407 -U 9517 ; WX 602 ; N uni252D ; G 2408 -U 9518 ; WX 602 ; N uni252E ; G 2409 -U 9519 ; WX 602 ; N uni252F ; G 2410 -U 9520 ; WX 602 ; N uni2530 ; G 2411 -U 9521 ; WX 602 ; N uni2531 ; G 2412 -U 9522 ; WX 602 ; N uni2532 ; G 2413 -U 9523 ; WX 602 ; N uni2533 ; G 2414 -U 9524 ; WX 602 ; N SF070000 ; G 2415 -U 9525 ; WX 602 ; N uni2535 ; G 2416 -U 9526 ; WX 602 ; N uni2536 ; G 2417 -U 9527 ; WX 602 ; N uni2537 ; G 2418 -U 9528 ; WX 602 ; N uni2538 ; G 2419 -U 9529 ; WX 602 ; N uni2539 ; G 2420 -U 9530 ; WX 602 ; N uni253A ; G 2421 -U 9531 ; WX 602 ; N uni253B ; G 2422 -U 9532 ; WX 602 ; N SF050000 ; G 2423 -U 9533 ; WX 602 ; N uni253D ; G 2424 -U 9534 ; WX 602 ; N uni253E ; G 2425 -U 9535 ; WX 602 ; N uni253F ; G 2426 -U 9536 ; WX 602 ; N uni2540 ; G 2427 -U 9537 ; WX 602 ; N uni2541 ; G 2428 -U 9538 ; WX 602 ; N uni2542 ; G 2429 -U 9539 ; WX 602 ; N uni2543 ; G 2430 -U 9540 ; WX 602 ; N uni2544 ; G 2431 -U 9541 ; WX 602 ; N uni2545 ; G 2432 -U 9542 ; WX 602 ; N uni2546 ; G 2433 -U 9543 ; WX 602 ; N uni2547 ; G 2434 -U 9544 ; WX 602 ; N uni2548 ; G 2435 -U 9545 ; WX 602 ; N uni2549 ; G 2436 -U 9546 ; WX 602 ; N uni254A ; G 2437 -U 9547 ; WX 602 ; N uni254B ; G 2438 -U 9548 ; WX 602 ; N uni254C ; G 2439 -U 9549 ; WX 602 ; N uni254D ; G 2440 -U 9550 ; WX 602 ; N uni254E ; G 2441 -U 9551 ; WX 602 ; N uni254F ; G 2442 -U 9552 ; WX 602 ; N SF430000 ; G 2443 -U 9553 ; WX 602 ; N SF240000 ; G 2444 -U 9554 ; WX 602 ; N SF510000 ; G 2445 -U 9555 ; WX 602 ; N SF520000 ; G 2446 -U 9556 ; WX 602 ; N SF390000 ; G 2447 -U 9557 ; WX 602 ; N SF220000 ; G 2448 -U 9558 ; WX 602 ; N SF210000 ; G 2449 -U 9559 ; WX 602 ; N SF250000 ; G 2450 -U 9560 ; WX 602 ; N SF500000 ; G 2451 -U 9561 ; WX 602 ; N SF490000 ; G 2452 -U 9562 ; WX 602 ; N SF380000 ; G 2453 -U 9563 ; WX 602 ; N SF280000 ; G 2454 -U 9564 ; WX 602 ; N SF270000 ; G 2455 -U 9565 ; WX 602 ; N SF260000 ; G 2456 -U 9566 ; WX 602 ; N SF360000 ; G 2457 -U 9567 ; WX 602 ; N SF370000 ; G 2458 -U 9568 ; WX 602 ; N SF420000 ; G 2459 -U 9569 ; WX 602 ; N SF190000 ; G 2460 -U 9570 ; WX 602 ; N SF200000 ; G 2461 -U 9571 ; WX 602 ; N SF230000 ; G 2462 -U 9572 ; WX 602 ; N SF470000 ; G 2463 -U 9573 ; WX 602 ; N SF480000 ; G 2464 -U 9574 ; WX 602 ; N SF410000 ; G 2465 -U 9575 ; WX 602 ; N SF450000 ; G 2466 -U 9576 ; WX 602 ; N SF460000 ; G 2467 -U 9577 ; WX 602 ; N SF400000 ; G 2468 -U 9578 ; WX 602 ; N SF540000 ; G 2469 -U 9579 ; WX 602 ; N SF530000 ; G 2470 -U 9580 ; WX 602 ; N SF440000 ; G 2471 -U 9581 ; WX 602 ; N uni256D ; G 2472 -U 9582 ; WX 602 ; N uni256E ; G 2473 -U 9583 ; WX 602 ; N uni256F ; G 2474 -U 9584 ; WX 602 ; N uni2570 ; G 2475 -U 9585 ; WX 602 ; N uni2571 ; G 2476 -U 9586 ; WX 602 ; N uni2572 ; G 2477 -U 9587 ; WX 602 ; N uni2573 ; G 2478 -U 9588 ; WX 602 ; N uni2574 ; G 2479 -U 9589 ; WX 602 ; N uni2575 ; G 2480 -U 9590 ; WX 602 ; N uni2576 ; G 2481 -U 9591 ; WX 602 ; N uni2577 ; G 2482 -U 9592 ; WX 602 ; N uni2578 ; G 2483 -U 9593 ; WX 602 ; N uni2579 ; G 2484 -U 9594 ; WX 602 ; N uni257A ; G 2485 -U 9595 ; WX 602 ; N uni257B ; G 2486 -U 9596 ; WX 602 ; N uni257C ; G 2487 -U 9597 ; WX 602 ; N uni257D ; G 2488 -U 9598 ; WX 602 ; N uni257E ; G 2489 -U 9599 ; WX 602 ; N uni257F ; G 2490 -U 9600 ; WX 769 ; N upblock ; G 2491 -U 9601 ; WX 769 ; N uni2581 ; G 2492 -U 9602 ; WX 769 ; N uni2582 ; G 2493 -U 9603 ; WX 769 ; N uni2583 ; G 2494 -U 9604 ; WX 769 ; N dnblock ; G 2495 -U 9605 ; WX 769 ; N uni2585 ; G 2496 -U 9606 ; WX 769 ; N uni2586 ; G 2497 -U 9607 ; WX 769 ; N uni2587 ; G 2498 -U 9608 ; WX 769 ; N block ; G 2499 -U 9609 ; WX 769 ; N uni2589 ; G 2500 -U 9610 ; WX 769 ; N uni258A ; G 2501 -U 9611 ; WX 769 ; N uni258B ; G 2502 -U 9612 ; WX 769 ; N lfblock ; G 2503 -U 9613 ; WX 769 ; N uni258D ; G 2504 -U 9614 ; WX 769 ; N uni258E ; G 2505 -U 9615 ; WX 769 ; N uni258F ; G 2506 -U 9616 ; WX 769 ; N rtblock ; G 2507 -U 9617 ; WX 769 ; N ltshade ; G 2508 -U 9618 ; WX 769 ; N shade ; G 2509 -U 9619 ; WX 769 ; N dkshade ; G 2510 -U 9620 ; WX 769 ; N uni2594 ; G 2511 -U 9621 ; WX 769 ; N uni2595 ; G 2512 -U 9622 ; WX 769 ; N uni2596 ; G 2513 -U 9623 ; WX 769 ; N uni2597 ; G 2514 -U 9624 ; WX 769 ; N uni2598 ; G 2515 -U 9625 ; WX 769 ; N uni2599 ; G 2516 -U 9626 ; WX 769 ; N uni259A ; G 2517 -U 9627 ; WX 769 ; N uni259B ; G 2518 -U 9628 ; WX 769 ; N uni259C ; G 2519 -U 9629 ; WX 769 ; N uni259D ; G 2520 -U 9630 ; WX 769 ; N uni259E ; G 2521 -U 9631 ; WX 769 ; N uni259F ; G 2522 -U 9632 ; WX 945 ; N filledbox ; G 2523 -U 9633 ; WX 945 ; N H22073 ; G 2524 -U 9634 ; WX 945 ; N uni25A2 ; G 2525 -U 9635 ; WX 945 ; N uni25A3 ; G 2526 -U 9636 ; WX 945 ; N uni25A4 ; G 2527 -U 9637 ; WX 945 ; N uni25A5 ; G 2528 -U 9638 ; WX 945 ; N uni25A6 ; G 2529 -U 9639 ; WX 945 ; N uni25A7 ; G 2530 -U 9640 ; WX 945 ; N uni25A8 ; G 2531 -U 9641 ; WX 945 ; N uni25A9 ; G 2532 -U 9642 ; WX 678 ; N H18543 ; G 2533 -U 9643 ; WX 678 ; N H18551 ; G 2534 -U 9644 ; WX 945 ; N filledrect ; G 2535 -U 9645 ; WX 945 ; N uni25AD ; G 2536 -U 9646 ; WX 550 ; N uni25AE ; G 2537 -U 9647 ; WX 550 ; N uni25AF ; G 2538 -U 9648 ; WX 769 ; N uni25B0 ; G 2539 -U 9649 ; WX 769 ; N uni25B1 ; G 2540 -U 9650 ; WX 769 ; N triagup ; G 2541 -U 9651 ; WX 769 ; N uni25B3 ; G 2542 -U 9652 ; WX 502 ; N uni25B4 ; G 2543 -U 9653 ; WX 502 ; N uni25B5 ; G 2544 -U 9654 ; WX 769 ; N uni25B6 ; G 2545 -U 9655 ; WX 769 ; N uni25B7 ; G 2546 -U 9656 ; WX 502 ; N uni25B8 ; G 2547 -U 9657 ; WX 502 ; N uni25B9 ; G 2548 -U 9658 ; WX 769 ; N triagrt ; G 2549 -U 9659 ; WX 769 ; N uni25BB ; G 2550 -U 9660 ; WX 769 ; N triagdn ; G 2551 -U 9661 ; WX 769 ; N uni25BD ; G 2552 -U 9662 ; WX 502 ; N uni25BE ; G 2553 -U 9663 ; WX 502 ; N uni25BF ; G 2554 -U 9664 ; WX 769 ; N uni25C0 ; G 2555 -U 9665 ; WX 769 ; N uni25C1 ; G 2556 -U 9666 ; WX 502 ; N uni25C2 ; G 2557 -U 9667 ; WX 502 ; N uni25C3 ; G 2558 -U 9668 ; WX 769 ; N triaglf ; G 2559 -U 9669 ; WX 769 ; N uni25C5 ; G 2560 -U 9670 ; WX 769 ; N uni25C6 ; G 2561 -U 9671 ; WX 769 ; N uni25C7 ; G 2562 -U 9672 ; WX 769 ; N uni25C8 ; G 2563 -U 9673 ; WX 873 ; N uni25C9 ; G 2564 -U 9674 ; WX 494 ; N lozenge ; G 2565 -U 9675 ; WX 873 ; N circle ; G 2566 -U 9676 ; WX 873 ; N uni25CC ; G 2567 -U 9677 ; WX 873 ; N uni25CD ; G 2568 -U 9678 ; WX 873 ; N uni25CE ; G 2569 -U 9679 ; WX 873 ; N H18533 ; G 2570 -U 9680 ; WX 873 ; N uni25D0 ; G 2571 -U 9681 ; WX 873 ; N uni25D1 ; G 2572 -U 9682 ; WX 873 ; N uni25D2 ; G 2573 -U 9683 ; WX 873 ; N uni25D3 ; G 2574 -U 9684 ; WX 873 ; N uni25D4 ; G 2575 -U 9685 ; WX 873 ; N uni25D5 ; G 2576 -U 9686 ; WX 527 ; N uni25D6 ; G 2577 -U 9687 ; WX 527 ; N uni25D7 ; G 2578 -U 9688 ; WX 791 ; N invbullet ; G 2579 -U 9689 ; WX 970 ; N invcircle ; G 2580 -U 9690 ; WX 970 ; N uni25DA ; G 2581 -U 9691 ; WX 970 ; N uni25DB ; G 2582 -U 9692 ; WX 387 ; N uni25DC ; G 2583 -U 9693 ; WX 387 ; N uni25DD ; G 2584 -U 9694 ; WX 387 ; N uni25DE ; G 2585 -U 9695 ; WX 387 ; N uni25DF ; G 2586 -U 9696 ; WX 873 ; N uni25E0 ; G 2587 -U 9697 ; WX 873 ; N uni25E1 ; G 2588 -U 9698 ; WX 769 ; N uni25E2 ; G 2589 -U 9699 ; WX 769 ; N uni25E3 ; G 2590 -U 9700 ; WX 769 ; N uni25E4 ; G 2591 -U 9701 ; WX 769 ; N uni25E5 ; G 2592 -U 9702 ; WX 590 ; N openbullet ; G 2593 -U 9703 ; WX 945 ; N uni25E7 ; G 2594 -U 9704 ; WX 945 ; N uni25E8 ; G 2595 -U 9705 ; WX 945 ; N uni25E9 ; G 2596 -U 9706 ; WX 945 ; N uni25EA ; G 2597 -U 9707 ; WX 945 ; N uni25EB ; G 2598 -U 9708 ; WX 769 ; N uni25EC ; G 2599 -U 9709 ; WX 769 ; N uni25ED ; G 2600 -U 9710 ; WX 769 ; N uni25EE ; G 2601 -U 9711 ; WX 1119 ; N uni25EF ; G 2602 -U 9712 ; WX 945 ; N uni25F0 ; G 2603 -U 9713 ; WX 945 ; N uni25F1 ; G 2604 -U 9714 ; WX 945 ; N uni25F2 ; G 2605 -U 9715 ; WX 945 ; N uni25F3 ; G 2606 -U 9716 ; WX 873 ; N uni25F4 ; G 2607 -U 9717 ; WX 873 ; N uni25F5 ; G 2608 -U 9718 ; WX 873 ; N uni25F6 ; G 2609 -U 9719 ; WX 873 ; N uni25F7 ; G 2610 -U 9720 ; WX 769 ; N uni25F8 ; G 2611 -U 9721 ; WX 769 ; N uni25F9 ; G 2612 -U 9722 ; WX 769 ; N uni25FA ; G 2613 -U 9723 ; WX 830 ; N uni25FB ; G 2614 -U 9724 ; WX 830 ; N uni25FC ; G 2615 -U 9725 ; WX 732 ; N uni25FD ; G 2616 -U 9726 ; WX 732 ; N uni25FE ; G 2617 -U 9727 ; WX 769 ; N uni25FF ; G 2618 -U 9728 ; WX 896 ; N uni2600 ; G 2619 -U 9784 ; WX 896 ; N uni2638 ; G 2620 -U 9785 ; WX 896 ; N uni2639 ; G 2621 -U 9786 ; WX 896 ; N smileface ; G 2622 -U 9787 ; WX 896 ; N invsmileface ; G 2623 -U 9788 ; WX 896 ; N sun ; G 2624 -U 9791 ; WX 614 ; N uni263F ; G 2625 -U 9792 ; WX 731 ; N female ; G 2626 -U 9793 ; WX 731 ; N uni2641 ; G 2627 -U 9794 ; WX 896 ; N male ; G 2628 -U 9795 ; WX 896 ; N uni2643 ; G 2629 -U 9796 ; WX 896 ; N uni2644 ; G 2630 -U 9797 ; WX 896 ; N uni2645 ; G 2631 -U 9798 ; WX 896 ; N uni2646 ; G 2632 -U 9799 ; WX 896 ; N uni2647 ; G 2633 -U 9824 ; WX 896 ; N spade ; G 2634 -U 9825 ; WX 896 ; N uni2661 ; G 2635 -U 9826 ; WX 896 ; N uni2662 ; G 2636 -U 9827 ; WX 896 ; N club ; G 2637 -U 9828 ; WX 896 ; N uni2664 ; G 2638 -U 9829 ; WX 896 ; N heart ; G 2639 -U 9830 ; WX 896 ; N diamond ; G 2640 -U 9831 ; WX 896 ; N uni2667 ; G 2641 -U 9833 ; WX 472 ; N uni2669 ; G 2642 -U 9834 ; WX 638 ; N musicalnote ; G 2643 -U 9835 ; WX 896 ; N musicalnotedbl ; G 2644 -U 9836 ; WX 896 ; N uni266C ; G 2645 -U 9837 ; WX 472 ; N uni266D ; G 2646 -U 9838 ; WX 357 ; N uni266E ; G 2647 -U 9839 ; WX 484 ; N uni266F ; G 2648 -U 10145 ; WX 838 ; N uni27A1 ; G 2649 -U 10181 ; WX 457 ; N uni27C5 ; G 2650 -U 10182 ; WX 457 ; N uni27C6 ; G 2651 -U 10208 ; WX 494 ; N uni27E0 ; G 2652 -U 10216 ; WX 457 ; N uni27E8 ; G 2653 -U 10217 ; WX 457 ; N uni27E9 ; G 2654 -U 10224 ; WX 838 ; N uni27F0 ; G 2655 -U 10225 ; WX 838 ; N uni27F1 ; G 2656 -U 10226 ; WX 838 ; N uni27F2 ; G 2657 -U 10227 ; WX 838 ; N uni27F3 ; G 2658 -U 10228 ; WX 1033 ; N uni27F4 ; G 2659 -U 10229 ; WX 1434 ; N uni27F5 ; G 2660 -U 10230 ; WX 1434 ; N uni27F6 ; G 2661 -U 10231 ; WX 1434 ; N uni27F7 ; G 2662 -U 10232 ; WX 1434 ; N uni27F8 ; G 2663 -U 10233 ; WX 1434 ; N uni27F9 ; G 2664 -U 10234 ; WX 1434 ; N uni27FA ; G 2665 -U 10235 ; WX 1434 ; N uni27FB ; G 2666 -U 10236 ; WX 1434 ; N uni27FC ; G 2667 -U 10237 ; WX 1434 ; N uni27FD ; G 2668 -U 10238 ; WX 1434 ; N uni27FE ; G 2669 -U 10239 ; WX 1434 ; N uni27FF ; G 2670 -U 10240 ; WX 781 ; N uni2800 ; G 2671 -U 10241 ; WX 781 ; N uni2801 ; G 2672 -U 10242 ; WX 781 ; N uni2802 ; G 2673 -U 10243 ; WX 781 ; N uni2803 ; G 2674 -U 10244 ; WX 781 ; N uni2804 ; G 2675 -U 10245 ; WX 781 ; N uni2805 ; G 2676 -U 10246 ; WX 781 ; N uni2806 ; G 2677 -U 10247 ; WX 781 ; N uni2807 ; G 2678 -U 10248 ; WX 781 ; N uni2808 ; G 2679 -U 10249 ; WX 781 ; N uni2809 ; G 2680 -U 10250 ; WX 781 ; N uni280A ; G 2681 -U 10251 ; WX 781 ; N uni280B ; G 2682 -U 10252 ; WX 781 ; N uni280C ; G 2683 -U 10253 ; WX 781 ; N uni280D ; G 2684 -U 10254 ; WX 781 ; N uni280E ; G 2685 -U 10255 ; WX 781 ; N uni280F ; G 2686 -U 10256 ; WX 781 ; N uni2810 ; G 2687 -U 10257 ; WX 781 ; N uni2811 ; G 2688 -U 10258 ; WX 781 ; N uni2812 ; G 2689 -U 10259 ; WX 781 ; N uni2813 ; G 2690 -U 10260 ; WX 781 ; N uni2814 ; G 2691 -U 10261 ; WX 781 ; N uni2815 ; G 2692 -U 10262 ; WX 781 ; N uni2816 ; G 2693 -U 10263 ; WX 781 ; N uni2817 ; G 2694 -U 10264 ; WX 781 ; N uni2818 ; G 2695 -U 10265 ; WX 781 ; N uni2819 ; G 2696 -U 10266 ; WX 781 ; N uni281A ; G 2697 -U 10267 ; WX 781 ; N uni281B ; G 2698 -U 10268 ; WX 781 ; N uni281C ; G 2699 -U 10269 ; WX 781 ; N uni281D ; G 2700 -U 10270 ; WX 781 ; N uni281E ; G 2701 -U 10271 ; WX 781 ; N uni281F ; G 2702 -U 10272 ; WX 781 ; N uni2820 ; G 2703 -U 10273 ; WX 781 ; N uni2821 ; G 2704 -U 10274 ; WX 781 ; N uni2822 ; G 2705 -U 10275 ; WX 781 ; N uni2823 ; G 2706 -U 10276 ; WX 781 ; N uni2824 ; G 2707 -U 10277 ; WX 781 ; N uni2825 ; G 2708 -U 10278 ; WX 781 ; N uni2826 ; G 2709 -U 10279 ; WX 781 ; N uni2827 ; G 2710 -U 10280 ; WX 781 ; N uni2828 ; G 2711 -U 10281 ; WX 781 ; N uni2829 ; G 2712 -U 10282 ; WX 781 ; N uni282A ; G 2713 -U 10283 ; WX 781 ; N uni282B ; G 2714 -U 10284 ; WX 781 ; N uni282C ; G 2715 -U 10285 ; WX 781 ; N uni282D ; G 2716 -U 10286 ; WX 781 ; N uni282E ; G 2717 -U 10287 ; WX 781 ; N uni282F ; G 2718 -U 10288 ; WX 781 ; N uni2830 ; G 2719 -U 10289 ; WX 781 ; N uni2831 ; G 2720 -U 10290 ; WX 781 ; N uni2832 ; G 2721 -U 10291 ; WX 781 ; N uni2833 ; G 2722 -U 10292 ; WX 781 ; N uni2834 ; G 2723 -U 10293 ; WX 781 ; N uni2835 ; G 2724 -U 10294 ; WX 781 ; N uni2836 ; G 2725 -U 10295 ; WX 781 ; N uni2837 ; G 2726 -U 10296 ; WX 781 ; N uni2838 ; G 2727 -U 10297 ; WX 781 ; N uni2839 ; G 2728 -U 10298 ; WX 781 ; N uni283A ; G 2729 -U 10299 ; WX 781 ; N uni283B ; G 2730 -U 10300 ; WX 781 ; N uni283C ; G 2731 -U 10301 ; WX 781 ; N uni283D ; G 2732 -U 10302 ; WX 781 ; N uni283E ; G 2733 -U 10303 ; WX 781 ; N uni283F ; G 2734 -U 10304 ; WX 781 ; N uni2840 ; G 2735 -U 10305 ; WX 781 ; N uni2841 ; G 2736 -U 10306 ; WX 781 ; N uni2842 ; G 2737 -U 10307 ; WX 781 ; N uni2843 ; G 2738 -U 10308 ; WX 781 ; N uni2844 ; G 2739 -U 10309 ; WX 781 ; N uni2845 ; G 2740 -U 10310 ; WX 781 ; N uni2846 ; G 2741 -U 10311 ; WX 781 ; N uni2847 ; G 2742 -U 10312 ; WX 781 ; N uni2848 ; G 2743 -U 10313 ; WX 781 ; N uni2849 ; G 2744 -U 10314 ; WX 781 ; N uni284A ; G 2745 -U 10315 ; WX 781 ; N uni284B ; G 2746 -U 10316 ; WX 781 ; N uni284C ; G 2747 -U 10317 ; WX 781 ; N uni284D ; G 2748 -U 10318 ; WX 781 ; N uni284E ; G 2749 -U 10319 ; WX 781 ; N uni284F ; G 2750 -U 10320 ; WX 781 ; N uni2850 ; G 2751 -U 10321 ; WX 781 ; N uni2851 ; G 2752 -U 10322 ; WX 781 ; N uni2852 ; G 2753 -U 10323 ; WX 781 ; N uni2853 ; G 2754 -U 10324 ; WX 781 ; N uni2854 ; G 2755 -U 10325 ; WX 781 ; N uni2855 ; G 2756 -U 10326 ; WX 781 ; N uni2856 ; G 2757 -U 10327 ; WX 781 ; N uni2857 ; G 2758 -U 10328 ; WX 781 ; N uni2858 ; G 2759 -U 10329 ; WX 781 ; N uni2859 ; G 2760 -U 10330 ; WX 781 ; N uni285A ; G 2761 -U 10331 ; WX 781 ; N uni285B ; G 2762 -U 10332 ; WX 781 ; N uni285C ; G 2763 -U 10333 ; WX 781 ; N uni285D ; G 2764 -U 10334 ; WX 781 ; N uni285E ; G 2765 -U 10335 ; WX 781 ; N uni285F ; G 2766 -U 10336 ; WX 781 ; N uni2860 ; G 2767 -U 10337 ; WX 781 ; N uni2861 ; G 2768 -U 10338 ; WX 781 ; N uni2862 ; G 2769 -U 10339 ; WX 781 ; N uni2863 ; G 2770 -U 10340 ; WX 781 ; N uni2864 ; G 2771 -U 10341 ; WX 781 ; N uni2865 ; G 2772 -U 10342 ; WX 781 ; N uni2866 ; G 2773 -U 10343 ; WX 781 ; N uni2867 ; G 2774 -U 10344 ; WX 781 ; N uni2868 ; G 2775 -U 10345 ; WX 781 ; N uni2869 ; G 2776 -U 10346 ; WX 781 ; N uni286A ; G 2777 -U 10347 ; WX 781 ; N uni286B ; G 2778 -U 10348 ; WX 781 ; N uni286C ; G 2779 -U 10349 ; WX 781 ; N uni286D ; G 2780 -U 10350 ; WX 781 ; N uni286E ; G 2781 -U 10351 ; WX 781 ; N uni286F ; G 2782 -U 10352 ; WX 781 ; N uni2870 ; G 2783 -U 10353 ; WX 781 ; N uni2871 ; G 2784 -U 10354 ; WX 781 ; N uni2872 ; G 2785 -U 10355 ; WX 781 ; N uni2873 ; G 2786 -U 10356 ; WX 781 ; N uni2874 ; G 2787 -U 10357 ; WX 781 ; N uni2875 ; G 2788 -U 10358 ; WX 781 ; N uni2876 ; G 2789 -U 10359 ; WX 781 ; N uni2877 ; G 2790 -U 10360 ; WX 781 ; N uni2878 ; G 2791 -U 10361 ; WX 781 ; N uni2879 ; G 2792 -U 10362 ; WX 781 ; N uni287A ; G 2793 -U 10363 ; WX 781 ; N uni287B ; G 2794 -U 10364 ; WX 781 ; N uni287C ; G 2795 -U 10365 ; WX 781 ; N uni287D ; G 2796 -U 10366 ; WX 781 ; N uni287E ; G 2797 -U 10367 ; WX 781 ; N uni287F ; G 2798 -U 10368 ; WX 781 ; N uni2880 ; G 2799 -U 10369 ; WX 781 ; N uni2881 ; G 2800 -U 10370 ; WX 781 ; N uni2882 ; G 2801 -U 10371 ; WX 781 ; N uni2883 ; G 2802 -U 10372 ; WX 781 ; N uni2884 ; G 2803 -U 10373 ; WX 781 ; N uni2885 ; G 2804 -U 10374 ; WX 781 ; N uni2886 ; G 2805 -U 10375 ; WX 781 ; N uni2887 ; G 2806 -U 10376 ; WX 781 ; N uni2888 ; G 2807 -U 10377 ; WX 781 ; N uni2889 ; G 2808 -U 10378 ; WX 781 ; N uni288A ; G 2809 -U 10379 ; WX 781 ; N uni288B ; G 2810 -U 10380 ; WX 781 ; N uni288C ; G 2811 -U 10381 ; WX 781 ; N uni288D ; G 2812 -U 10382 ; WX 781 ; N uni288E ; G 2813 -U 10383 ; WX 781 ; N uni288F ; G 2814 -U 10384 ; WX 781 ; N uni2890 ; G 2815 -U 10385 ; WX 781 ; N uni2891 ; G 2816 -U 10386 ; WX 781 ; N uni2892 ; G 2817 -U 10387 ; WX 781 ; N uni2893 ; G 2818 -U 10388 ; WX 781 ; N uni2894 ; G 2819 -U 10389 ; WX 781 ; N uni2895 ; G 2820 -U 10390 ; WX 781 ; N uni2896 ; G 2821 -U 10391 ; WX 781 ; N uni2897 ; G 2822 -U 10392 ; WX 781 ; N uni2898 ; G 2823 -U 10393 ; WX 781 ; N uni2899 ; G 2824 -U 10394 ; WX 781 ; N uni289A ; G 2825 -U 10395 ; WX 781 ; N uni289B ; G 2826 -U 10396 ; WX 781 ; N uni289C ; G 2827 -U 10397 ; WX 781 ; N uni289D ; G 2828 -U 10398 ; WX 781 ; N uni289E ; G 2829 -U 10399 ; WX 781 ; N uni289F ; G 2830 -U 10400 ; WX 781 ; N uni28A0 ; G 2831 -U 10401 ; WX 781 ; N uni28A1 ; G 2832 -U 10402 ; WX 781 ; N uni28A2 ; G 2833 -U 10403 ; WX 781 ; N uni28A3 ; G 2834 -U 10404 ; WX 781 ; N uni28A4 ; G 2835 -U 10405 ; WX 781 ; N uni28A5 ; G 2836 -U 10406 ; WX 781 ; N uni28A6 ; G 2837 -U 10407 ; WX 781 ; N uni28A7 ; G 2838 -U 10408 ; WX 781 ; N uni28A8 ; G 2839 -U 10409 ; WX 781 ; N uni28A9 ; G 2840 -U 10410 ; WX 781 ; N uni28AA ; G 2841 -U 10411 ; WX 781 ; N uni28AB ; G 2842 -U 10412 ; WX 781 ; N uni28AC ; G 2843 -U 10413 ; WX 781 ; N uni28AD ; G 2844 -U 10414 ; WX 781 ; N uni28AE ; G 2845 -U 10415 ; WX 781 ; N uni28AF ; G 2846 -U 10416 ; WX 781 ; N uni28B0 ; G 2847 -U 10417 ; WX 781 ; N uni28B1 ; G 2848 -U 10418 ; WX 781 ; N uni28B2 ; G 2849 -U 10419 ; WX 781 ; N uni28B3 ; G 2850 -U 10420 ; WX 781 ; N uni28B4 ; G 2851 -U 10421 ; WX 781 ; N uni28B5 ; G 2852 -U 10422 ; WX 781 ; N uni28B6 ; G 2853 -U 10423 ; WX 781 ; N uni28B7 ; G 2854 -U 10424 ; WX 781 ; N uni28B8 ; G 2855 -U 10425 ; WX 781 ; N uni28B9 ; G 2856 -U 10426 ; WX 781 ; N uni28BA ; G 2857 -U 10427 ; WX 781 ; N uni28BB ; G 2858 -U 10428 ; WX 781 ; N uni28BC ; G 2859 -U 10429 ; WX 781 ; N uni28BD ; G 2860 -U 10430 ; WX 781 ; N uni28BE ; G 2861 -U 10431 ; WX 781 ; N uni28BF ; G 2862 -U 10432 ; WX 781 ; N uni28C0 ; G 2863 -U 10433 ; WX 781 ; N uni28C1 ; G 2864 -U 10434 ; WX 781 ; N uni28C2 ; G 2865 -U 10435 ; WX 781 ; N uni28C3 ; G 2866 -U 10436 ; WX 781 ; N uni28C4 ; G 2867 -U 10437 ; WX 781 ; N uni28C5 ; G 2868 -U 10438 ; WX 781 ; N uni28C6 ; G 2869 -U 10439 ; WX 781 ; N uni28C7 ; G 2870 -U 10440 ; WX 781 ; N uni28C8 ; G 2871 -U 10441 ; WX 781 ; N uni28C9 ; G 2872 -U 10442 ; WX 781 ; N uni28CA ; G 2873 -U 10443 ; WX 781 ; N uni28CB ; G 2874 -U 10444 ; WX 781 ; N uni28CC ; G 2875 -U 10445 ; WX 781 ; N uni28CD ; G 2876 -U 10446 ; WX 781 ; N uni28CE ; G 2877 -U 10447 ; WX 781 ; N uni28CF ; G 2878 -U 10448 ; WX 781 ; N uni28D0 ; G 2879 -U 10449 ; WX 781 ; N uni28D1 ; G 2880 -U 10450 ; WX 781 ; N uni28D2 ; G 2881 -U 10451 ; WX 781 ; N uni28D3 ; G 2882 -U 10452 ; WX 781 ; N uni28D4 ; G 2883 -U 10453 ; WX 781 ; N uni28D5 ; G 2884 -U 10454 ; WX 781 ; N uni28D6 ; G 2885 -U 10455 ; WX 781 ; N uni28D7 ; G 2886 -U 10456 ; WX 781 ; N uni28D8 ; G 2887 -U 10457 ; WX 781 ; N uni28D9 ; G 2888 -U 10458 ; WX 781 ; N uni28DA ; G 2889 -U 10459 ; WX 781 ; N uni28DB ; G 2890 -U 10460 ; WX 781 ; N uni28DC ; G 2891 -U 10461 ; WX 781 ; N uni28DD ; G 2892 -U 10462 ; WX 781 ; N uni28DE ; G 2893 -U 10463 ; WX 781 ; N uni28DF ; G 2894 -U 10464 ; WX 781 ; N uni28E0 ; G 2895 -U 10465 ; WX 781 ; N uni28E1 ; G 2896 -U 10466 ; WX 781 ; N uni28E2 ; G 2897 -U 10467 ; WX 781 ; N uni28E3 ; G 2898 -U 10468 ; WX 781 ; N uni28E4 ; G 2899 -U 10469 ; WX 781 ; N uni28E5 ; G 2900 -U 10470 ; WX 781 ; N uni28E6 ; G 2901 -U 10471 ; WX 781 ; N uni28E7 ; G 2902 -U 10472 ; WX 781 ; N uni28E8 ; G 2903 -U 10473 ; WX 781 ; N uni28E9 ; G 2904 -U 10474 ; WX 781 ; N uni28EA ; G 2905 -U 10475 ; WX 781 ; N uni28EB ; G 2906 -U 10476 ; WX 781 ; N uni28EC ; G 2907 -U 10477 ; WX 781 ; N uni28ED ; G 2908 -U 10478 ; WX 781 ; N uni28EE ; G 2909 -U 10479 ; WX 781 ; N uni28EF ; G 2910 -U 10480 ; WX 781 ; N uni28F0 ; G 2911 -U 10481 ; WX 781 ; N uni28F1 ; G 2912 -U 10482 ; WX 781 ; N uni28F2 ; G 2913 -U 10483 ; WX 781 ; N uni28F3 ; G 2914 -U 10484 ; WX 781 ; N uni28F4 ; G 2915 -U 10485 ; WX 781 ; N uni28F5 ; G 2916 -U 10486 ; WX 781 ; N uni28F6 ; G 2917 -U 10487 ; WX 781 ; N uni28F7 ; G 2918 -U 10488 ; WX 781 ; N uni28F8 ; G 2919 -U 10489 ; WX 781 ; N uni28F9 ; G 2920 -U 10490 ; WX 781 ; N uni28FA ; G 2921 -U 10491 ; WX 781 ; N uni28FB ; G 2922 -U 10492 ; WX 781 ; N uni28FC ; G 2923 -U 10493 ; WX 781 ; N uni28FD ; G 2924 -U 10494 ; WX 781 ; N uni28FE ; G 2925 -U 10495 ; WX 781 ; N uni28FF ; G 2926 -U 10496 ; WX 838 ; N uni2900 ; G 2927 -U 10497 ; WX 838 ; N uni2901 ; G 2928 -U 10498 ; WX 838 ; N uni2902 ; G 2929 -U 10499 ; WX 838 ; N uni2903 ; G 2930 -U 10500 ; WX 838 ; N uni2904 ; G 2931 -U 10501 ; WX 838 ; N uni2905 ; G 2932 -U 10502 ; WX 838 ; N uni2906 ; G 2933 -U 10503 ; WX 838 ; N uni2907 ; G 2934 -U 10504 ; WX 838 ; N uni2908 ; G 2935 -U 10505 ; WX 838 ; N uni2909 ; G 2936 -U 10506 ; WX 838 ; N uni290A ; G 2937 -U 10507 ; WX 838 ; N uni290B ; G 2938 -U 10508 ; WX 838 ; N uni290C ; G 2939 -U 10509 ; WX 838 ; N uni290D ; G 2940 -U 10510 ; WX 838 ; N uni290E ; G 2941 -U 10511 ; WX 838 ; N uni290F ; G 2942 -U 10512 ; WX 838 ; N uni2910 ; G 2943 -U 10513 ; WX 838 ; N uni2911 ; G 2944 -U 10514 ; WX 838 ; N uni2912 ; G 2945 -U 10515 ; WX 838 ; N uni2913 ; G 2946 -U 10516 ; WX 838 ; N uni2914 ; G 2947 -U 10517 ; WX 838 ; N uni2915 ; G 2948 -U 10518 ; WX 838 ; N uni2916 ; G 2949 -U 10519 ; WX 838 ; N uni2917 ; G 2950 -U 10520 ; WX 838 ; N uni2918 ; G 2951 -U 10521 ; WX 838 ; N uni2919 ; G 2952 -U 10522 ; WX 838 ; N uni291A ; G 2953 -U 10523 ; WX 838 ; N uni291B ; G 2954 -U 10524 ; WX 838 ; N uni291C ; G 2955 -U 10525 ; WX 838 ; N uni291D ; G 2956 -U 10526 ; WX 838 ; N uni291E ; G 2957 -U 10527 ; WX 838 ; N uni291F ; G 2958 -U 10528 ; WX 838 ; N uni2920 ; G 2959 -U 10529 ; WX 838 ; N uni2921 ; G 2960 -U 10530 ; WX 838 ; N uni2922 ; G 2961 -U 10531 ; WX 838 ; N uni2923 ; G 2962 -U 10532 ; WX 838 ; N uni2924 ; G 2963 -U 10533 ; WX 838 ; N uni2925 ; G 2964 -U 10534 ; WX 838 ; N uni2926 ; G 2965 -U 10535 ; WX 838 ; N uni2927 ; G 2966 -U 10536 ; WX 838 ; N uni2928 ; G 2967 -U 10537 ; WX 838 ; N uni2929 ; G 2968 -U 10538 ; WX 838 ; N uni292A ; G 2969 -U 10539 ; WX 838 ; N uni292B ; G 2970 -U 10540 ; WX 838 ; N uni292C ; G 2971 -U 10541 ; WX 838 ; N uni292D ; G 2972 -U 10542 ; WX 838 ; N uni292E ; G 2973 -U 10543 ; WX 838 ; N uni292F ; G 2974 -U 10544 ; WX 838 ; N uni2930 ; G 2975 -U 10545 ; WX 838 ; N uni2931 ; G 2976 -U 10546 ; WX 838 ; N uni2932 ; G 2977 -U 10547 ; WX 838 ; N uni2933 ; G 2978 -U 10548 ; WX 838 ; N uni2934 ; G 2979 -U 10549 ; WX 838 ; N uni2935 ; G 2980 -U 10550 ; WX 838 ; N uni2936 ; G 2981 -U 10551 ; WX 838 ; N uni2937 ; G 2982 -U 10552 ; WX 838 ; N uni2938 ; G 2983 -U 10553 ; WX 838 ; N uni2939 ; G 2984 -U 10554 ; WX 838 ; N uni293A ; G 2985 -U 10555 ; WX 838 ; N uni293B ; G 2986 -U 10556 ; WX 838 ; N uni293C ; G 2987 -U 10557 ; WX 838 ; N uni293D ; G 2988 -U 10558 ; WX 838 ; N uni293E ; G 2989 -U 10559 ; WX 838 ; N uni293F ; G 2990 -U 10560 ; WX 838 ; N uni2940 ; G 2991 -U 10561 ; WX 838 ; N uni2941 ; G 2992 -U 10562 ; WX 838 ; N uni2942 ; G 2993 -U 10563 ; WX 838 ; N uni2943 ; G 2994 -U 10564 ; WX 838 ; N uni2944 ; G 2995 -U 10565 ; WX 838 ; N uni2945 ; G 2996 -U 10566 ; WX 838 ; N uni2946 ; G 2997 -U 10567 ; WX 838 ; N uni2947 ; G 2998 -U 10568 ; WX 838 ; N uni2948 ; G 2999 -U 10569 ; WX 838 ; N uni2949 ; G 3000 -U 10570 ; WX 838 ; N uni294A ; G 3001 -U 10571 ; WX 838 ; N uni294B ; G 3002 -U 10572 ; WX 838 ; N uni294C ; G 3003 -U 10573 ; WX 838 ; N uni294D ; G 3004 -U 10574 ; WX 838 ; N uni294E ; G 3005 -U 10575 ; WX 838 ; N uni294F ; G 3006 -U 10576 ; WX 838 ; N uni2950 ; G 3007 -U 10577 ; WX 838 ; N uni2951 ; G 3008 -U 10578 ; WX 838 ; N uni2952 ; G 3009 -U 10579 ; WX 838 ; N uni2953 ; G 3010 -U 10580 ; WX 838 ; N uni2954 ; G 3011 -U 10581 ; WX 838 ; N uni2955 ; G 3012 -U 10582 ; WX 838 ; N uni2956 ; G 3013 -U 10583 ; WX 838 ; N uni2957 ; G 3014 -U 10584 ; WX 838 ; N uni2958 ; G 3015 -U 10585 ; WX 838 ; N uni2959 ; G 3016 -U 10586 ; WX 838 ; N uni295A ; G 3017 -U 10587 ; WX 838 ; N uni295B ; G 3018 -U 10588 ; WX 838 ; N uni295C ; G 3019 -U 10589 ; WX 838 ; N uni295D ; G 3020 -U 10590 ; WX 838 ; N uni295E ; G 3021 -U 10591 ; WX 838 ; N uni295F ; G 3022 -U 10592 ; WX 838 ; N uni2960 ; G 3023 -U 10593 ; WX 838 ; N uni2961 ; G 3024 -U 10594 ; WX 838 ; N uni2962 ; G 3025 -U 10595 ; WX 838 ; N uni2963 ; G 3026 -U 10596 ; WX 838 ; N uni2964 ; G 3027 -U 10597 ; WX 838 ; N uni2965 ; G 3028 -U 10598 ; WX 838 ; N uni2966 ; G 3029 -U 10599 ; WX 838 ; N uni2967 ; G 3030 -U 10600 ; WX 838 ; N uni2968 ; G 3031 -U 10601 ; WX 838 ; N uni2969 ; G 3032 -U 10602 ; WX 838 ; N uni296A ; G 3033 -U 10603 ; WX 838 ; N uni296B ; G 3034 -U 10604 ; WX 838 ; N uni296C ; G 3035 -U 10605 ; WX 838 ; N uni296D ; G 3036 -U 10606 ; WX 838 ; N uni296E ; G 3037 -U 10607 ; WX 838 ; N uni296F ; G 3038 -U 10608 ; WX 838 ; N uni2970 ; G 3039 -U 10609 ; WX 838 ; N uni2971 ; G 3040 -U 10610 ; WX 838 ; N uni2972 ; G 3041 -U 10611 ; WX 838 ; N uni2973 ; G 3042 -U 10612 ; WX 838 ; N uni2974 ; G 3043 -U 10613 ; WX 838 ; N uni2975 ; G 3044 -U 10614 ; WX 838 ; N uni2976 ; G 3045 -U 10615 ; WX 1032 ; N uni2977 ; G 3046 -U 10616 ; WX 838 ; N uni2978 ; G 3047 -U 10617 ; WX 838 ; N uni2979 ; G 3048 -U 10618 ; WX 960 ; N uni297A ; G 3049 -U 10619 ; WX 838 ; N uni297B ; G 3050 -U 10620 ; WX 838 ; N uni297C ; G 3051 -U 10621 ; WX 838 ; N uni297D ; G 3052 -U 10622 ; WX 838 ; N uni297E ; G 3053 -U 10623 ; WX 838 ; N uni297F ; G 3054 -U 10731 ; WX 494 ; N uni29EB ; G 3055 -U 10764 ; WX 1782 ; N uni2A0C ; G 3056 -U 10765 ; WX 610 ; N uni2A0D ; G 3057 -U 10766 ; WX 610 ; N uni2A0E ; G 3058 -U 10799 ; WX 838 ; N uni2A2F ; G 3059 -U 10858 ; WX 838 ; N uni2A6A ; G 3060 -U 10859 ; WX 838 ; N uni2A6B ; G 3061 -U 11008 ; WX 838 ; N uni2B00 ; G 3062 -U 11009 ; WX 838 ; N uni2B01 ; G 3063 -U 11010 ; WX 838 ; N uni2B02 ; G 3064 -U 11011 ; WX 838 ; N uni2B03 ; G 3065 -U 11012 ; WX 838 ; N uni2B04 ; G 3066 -U 11013 ; WX 838 ; N uni2B05 ; G 3067 -U 11014 ; WX 838 ; N uni2B06 ; G 3068 -U 11015 ; WX 838 ; N uni2B07 ; G 3069 -U 11016 ; WX 838 ; N uni2B08 ; G 3070 -U 11017 ; WX 838 ; N uni2B09 ; G 3071 -U 11018 ; WX 838 ; N uni2B0A ; G 3072 -U 11019 ; WX 838 ; N uni2B0B ; G 3073 -U 11020 ; WX 838 ; N uni2B0C ; G 3074 -U 11021 ; WX 838 ; N uni2B0D ; G 3075 -U 11022 ; WX 838 ; N uni2B0E ; G 3076 -U 11023 ; WX 838 ; N uni2B0F ; G 3077 -U 11024 ; WX 838 ; N uni2B10 ; G 3078 -U 11025 ; WX 838 ; N uni2B11 ; G 3079 -U 11026 ; WX 945 ; N uni2B12 ; G 3080 -U 11027 ; WX 945 ; N uni2B13 ; G 3081 -U 11028 ; WX 945 ; N uni2B14 ; G 3082 -U 11029 ; WX 945 ; N uni2B15 ; G 3083 -U 11030 ; WX 769 ; N uni2B16 ; G 3084 -U 11031 ; WX 769 ; N uni2B17 ; G 3085 -U 11032 ; WX 769 ; N uni2B18 ; G 3086 -U 11033 ; WX 769 ; N uni2B19 ; G 3087 -U 11034 ; WX 945 ; N uni2B1A ; G 3088 -U 11360 ; WX 703 ; N uni2C60 ; G 3089 -U 11361 ; WX 380 ; N uni2C61 ; G 3090 -U 11363 ; WX 752 ; N uni2C63 ; G 3091 -U 11364 ; WX 831 ; N uni2C64 ; G 3092 -U 11367 ; WX 945 ; N uni2C67 ; G 3093 -U 11368 ; WX 727 ; N uni2C68 ; G 3094 -U 11369 ; WX 869 ; N uni2C69 ; G 3095 -U 11370 ; WX 693 ; N uni2C6A ; G 3096 -U 11371 ; WX 730 ; N uni2C6B ; G 3097 -U 11372 ; WX 568 ; N uni2C6C ; G 3098 -U 11373 ; WX 848 ; N uni2C6D ; G 3099 -U 11374 ; WX 1107 ; N uni2C6E ; G 3100 -U 11375 ; WX 776 ; N uni2C6F ; G 3101 -U 11376 ; WX 848 ; N uni2C70 ; G 3102 -U 11377 ; WX 709 ; N uni2C71 ; G 3103 -U 11378 ; WX 1221 ; N uni2C72 ; G 3104 -U 11379 ; WX 984 ; N uni2C73 ; G 3105 -U 11381 ; WX 779 ; N uni2C75 ; G 3106 -U 11382 ; WX 601 ; N uni2C76 ; G 3107 -U 11383 ; WX 905 ; N uni2C77 ; G 3108 -U 11385 ; WX 571 ; N uni2C79 ; G 3109 -U 11386 ; WX 667 ; N uni2C7A ; G 3110 -U 11387 ; WX 617 ; N uni2C7B ; G 3111 -U 11388 ; WX 313 ; N uni2C7C ; G 3112 -U 11389 ; WX 489 ; N uni2C7D ; G 3113 -U 11390 ; WX 722 ; N uni2C7E ; G 3114 -U 11391 ; WX 730 ; N uni2C7F ; G 3115 -U 11520 ; WX 773 ; N uni2D00 ; G 3116 -U 11521 ; WX 635 ; N uni2D01 ; G 3117 -U 11522 ; WX 804 ; N uni2D02 ; G 3118 -U 11523 ; WX 658 ; N uni2D03 ; G 3119 -U 11524 ; WX 788 ; N uni2D04 ; G 3120 -U 11525 ; WX 962 ; N uni2D05 ; G 3121 -U 11526 ; WX 756 ; N uni2D06 ; G 3122 -U 11527 ; WX 960 ; N uni2D07 ; G 3123 -U 11528 ; WX 617 ; N uni2D08 ; G 3124 -U 11529 ; WX 646 ; N uni2D09 ; G 3125 -U 11530 ; WX 962 ; N uni2D0A ; G 3126 -U 11531 ; WX 631 ; N uni2D0B ; G 3127 -U 11532 ; WX 646 ; N uni2D0C ; G 3128 -U 11533 ; WX 962 ; N uni2D0D ; G 3129 -U 11534 ; WX 846 ; N uni2D0E ; G 3130 -U 11535 ; WX 866 ; N uni2D0F ; G 3131 -U 11536 ; WX 961 ; N uni2D10 ; G 3132 -U 11537 ; WX 645 ; N uni2D11 ; G 3133 -U 11538 ; WX 645 ; N uni2D12 ; G 3134 -U 11539 ; WX 959 ; N uni2D13 ; G 3135 -U 11540 ; WX 945 ; N uni2D14 ; G 3136 -U 11541 ; WX 863 ; N uni2D15 ; G 3137 -U 11542 ; WX 644 ; N uni2D16 ; G 3138 -U 11543 ; WX 646 ; N uni2D17 ; G 3139 -U 11544 ; WX 645 ; N uni2D18 ; G 3140 -U 11545 ; WX 649 ; N uni2D19 ; G 3141 -U 11546 ; WX 688 ; N uni2D1A ; G 3142 -U 11547 ; WX 936 ; N uni2D1B ; G 3143 -U 11548 ; WX 982 ; N uni2D1C ; G 3144 -U 11549 ; WX 681 ; N uni2D1D ; G 3145 -U 11550 ; WX 676 ; N uni2D1E ; G 3146 -U 11551 ; WX 852 ; N uni2D1F ; G 3147 -U 11552 ; WX 1113 ; N uni2D20 ; G 3148 -U 11553 ; WX 632 ; N uni2D21 ; G 3149 -U 11554 ; WX 645 ; N uni2D22 ; G 3150 -U 11555 ; WX 646 ; N uni2D23 ; G 3151 -U 11556 ; WX 749 ; N uni2D24 ; G 3152 -U 11557 ; WX 914 ; N uni2D25 ; G 3153 -U 11800 ; WX 586 ; N uni2E18 ; G 3154 -U 11807 ; WX 838 ; N uni2E1F ; G 3155 -U 11810 ; WX 473 ; N uni2E22 ; G 3156 -U 11811 ; WX 473 ; N uni2E23 ; G 3157 -U 11812 ; WX 473 ; N uni2E24 ; G 3158 -U 11813 ; WX 473 ; N uni2E25 ; G 3159 -U 11822 ; WX 586 ; N uni2E2E ; G 3160 -U 42564 ; WX 722 ; N uniA644 ; G 3161 -U 42565 ; WX 563 ; N uniA645 ; G 3162 -U 42566 ; WX 468 ; N uniA646 ; G 3163 -U 42567 ; WX 380 ; N uniA647 ; G 3164 -U 42576 ; WX 1333 ; N uniA650 ; G 3165 -U 42577 ; WX 1092 ; N uniA651 ; G 3166 -U 42580 ; WX 1287 ; N uniA654 ; G 3167 -U 42581 ; WX 1025 ; N uniA655 ; G 3168 -U 42582 ; WX 1287 ; N uniA656 ; G 3169 -U 42583 ; WX 1039 ; N uniA657 ; G 3170 -U 42648 ; WX 1448 ; N uniA698 ; G 3171 -U 42649 ; WX 1060 ; N uniA699 ; G 3172 -U 42760 ; WX 500 ; N uniA708 ; G 3173 -U 42761 ; WX 500 ; N uniA709 ; G 3174 -U 42762 ; WX 500 ; N uniA70A ; G 3175 -U 42763 ; WX 500 ; N uniA70B ; G 3176 -U 42764 ; WX 500 ; N uniA70C ; G 3177 -U 42765 ; WX 500 ; N uniA70D ; G 3178 -U 42766 ; WX 500 ; N uniA70E ; G 3179 -U 42767 ; WX 500 ; N uniA70F ; G 3180 -U 42768 ; WX 500 ; N uniA710 ; G 3181 -U 42769 ; WX 500 ; N uniA711 ; G 3182 -U 42770 ; WX 500 ; N uniA712 ; G 3183 -U 42771 ; WX 500 ; N uniA713 ; G 3184 -U 42772 ; WX 500 ; N uniA714 ; G 3185 -U 42773 ; WX 500 ; N uniA715 ; G 3186 -U 42774 ; WX 500 ; N uniA716 ; G 3187 -U 42779 ; WX 384 ; N uniA71B ; G 3188 -U 42780 ; WX 384 ; N uniA71C ; G 3189 -U 42781 ; WX 276 ; N uniA71D ; G 3190 -U 42782 ; WX 276 ; N uniA71E ; G 3191 -U 42783 ; WX 276 ; N uniA71F ; G 3192 -U 42790 ; WX 945 ; N uniA726 ; G 3193 -U 42791 ; WX 712 ; N uniA727 ; G 3194 -U 42792 ; WX 1003 ; N uniA728 ; G 3195 -U 42793 ; WX 909 ; N uniA729 ; G 3196 -U 42794 ; WX 696 ; N uniA72A ; G 3197 -U 42795 ; WX 609 ; N uniA72B ; G 3198 -U 42796 ; WX 634 ; N uniA72C ; G 3199 -U 42797 ; WX 598 ; N uniA72D ; G 3200 -U 42798 ; WX 741 ; N uniA72E ; G 3201 -U 42799 ; WX 706 ; N uniA72F ; G 3202 -U 42800 ; WX 592 ; N uniA730 ; G 3203 -U 42801 ; WX 563 ; N uniA731 ; G 3204 -U 42802 ; WX 1301 ; N uniA732 ; G 3205 -U 42803 ; WX 986 ; N uniA733 ; G 3206 -U 42804 ; WX 1261 ; N uniA734 ; G 3207 -U 42805 ; WX 1004 ; N uniA735 ; G 3208 -U 42806 ; WX 1168 ; N uniA736 ; G 3209 -U 42807 ; WX 1008 ; N uniA737 ; G 3210 -U 42808 ; WX 1016 ; N uniA738 ; G 3211 -U 42809 ; WX 813 ; N uniA739 ; G 3212 -U 42810 ; WX 1016 ; N uniA73A ; G 3213 -U 42811 ; WX 813 ; N uniA73B ; G 3214 -U 42812 ; WX 994 ; N uniA73C ; G 3215 -U 42813 ; WX 847 ; N uniA73D ; G 3216 -U 42814 ; WX 796 ; N uniA73E ; G 3217 -U 42815 ; WX 609 ; N uniA73F ; G 3218 -U 42816 ; WX 910 ; N uniA740 ; G 3219 -U 42817 ; WX 722 ; N uniA741 ; G 3220 -U 42822 ; WX 916 ; N uniA746 ; G 3221 -U 42823 ; WX 581 ; N uniA747 ; G 3222 -U 42826 ; WX 1010 ; N uniA74A ; G 3223 -U 42827 ; WX 770 ; N uniA74B ; G 3224 -U 42830 ; WX 1448 ; N uniA74E ; G 3225 -U 42831 ; WX 1060 ; N uniA74F ; G 3226 -U 42856 ; WX 787 ; N uniA768 ; G 3227 -U 42857 ; WX 716 ; N uniA769 ; G 3228 -U 42875 ; WX 694 ; N uniA77B ; G 3229 -U 42876 ; WX 527 ; N uniA77C ; G 3230 -U 42880 ; WX 703 ; N uniA780 ; G 3231 -U 42881 ; WX 380 ; N uniA781 ; G 3232 -U 42882 ; WX 872 ; N uniA782 ; G 3233 -U 42883 ; WX 727 ; N uniA783 ; G 3234 -U 42884 ; WX 694 ; N uniA784 ; G 3235 -U 42885 ; WX 527 ; N uniA785 ; G 3236 -U 42886 ; WX 796 ; N uniA786 ; G 3237 -U 42887 ; WX 609 ; N uniA787 ; G 3238 -U 42891 ; WX 439 ; N uniA78B ; G 3239 -U 42892 ; WX 306 ; N uniA78C ; G 3240 -U 42893 ; WX 913 ; N uniA78D ; G 3241 -U 42896 ; WX 914 ; N uniA790 ; G 3242 -U 42897 ; WX 727 ; N uniA791 ; G 3243 -U 42922 ; WX 945 ; N uniA7AA ; G 3244 -U 43000 ; WX 595 ; N uniA7F8 ; G 3245 -U 43001 ; WX 647 ; N uniA7F9 ; G 3246 -U 43002 ; WX 1069 ; N uniA7FA ; G 3247 -U 43003 ; WX 710 ; N uniA7FB ; G 3248 -U 43004 ; WX 752 ; N uniA7FC ; G 3249 -U 43005 ; WX 1107 ; N uniA7FD ; G 3250 -U 43006 ; WX 468 ; N uniA7FE ; G 3251 -U 43007 ; WX 1286 ; N uniA7FF ; G 3252 -U 62464 ; WX 705 ; N uniF400 ; G 3253 -U 62465 ; WX 716 ; N uniF401 ; G 3254 -U 62466 ; WX 765 ; N uniF402 ; G 3255 -U 62467 ; WX 999 ; N uniF403 ; G 3256 -U 62468 ; WX 716 ; N uniF404 ; G 3257 -U 62469 ; WX 710 ; N uniF405 ; G 3258 -U 62470 ; WX 776 ; N uniF406 ; G 3259 -U 62471 ; WX 1038 ; N uniF407 ; G 3260 -U 62472 ; WX 716 ; N uniF408 ; G 3261 -U 62473 ; WX 716 ; N uniF409 ; G 3262 -U 62474 ; WX 1309 ; N uniF40A ; G 3263 -U 62475 ; WX 734 ; N uniF40B ; G 3264 -U 62476 ; WX 733 ; N uniF40C ; G 3265 -U 62477 ; WX 1004 ; N uniF40D ; G 3266 -U 62478 ; WX 716 ; N uniF40E ; G 3267 -U 62479 ; WX 733 ; N uniF40F ; G 3268 -U 62480 ; WX 1050 ; N uniF410 ; G 3269 -U 62481 ; WX 797 ; N uniF411 ; G 3270 -U 62482 ; WX 850 ; N uniF412 ; G 3271 -U 62483 ; WX 799 ; N uniF413 ; G 3272 -U 62484 ; WX 996 ; N uniF414 ; G 3273 -U 62485 ; WX 732 ; N uniF415 ; G 3274 -U 62486 ; WX 987 ; N uniF416 ; G 3275 -U 62487 ; WX 731 ; N uniF417 ; G 3276 -U 62488 ; WX 739 ; N uniF418 ; G 3277 -U 62489 ; WX 733 ; N uniF419 ; G 3278 -U 62490 ; WX 780 ; N uniF41A ; G 3279 -U 62491 ; WX 733 ; N uniF41B ; G 3280 -U 62492 ; WX 739 ; N uniF41C ; G 3281 -U 62493 ; WX 717 ; N uniF41D ; G 3282 -U 62494 ; WX 780 ; N uniF41E ; G 3283 -U 62495 ; WX 936 ; N uniF41F ; G 3284 -U 62496 ; WX 716 ; N uniF420 ; G 3285 -U 62497 ; WX 826 ; N uniF421 ; G 3286 -U 62498 ; WX 717 ; N uniF422 ; G 3287 -U 62499 ; WX 716 ; N uniF423 ; G 3288 -U 62500 ; WX 716 ; N uniF424 ; G 3289 -U 62501 ; WX 773 ; N uniF425 ; G 3290 -U 62502 ; WX 1013 ; N uniF426 ; G 3291 -U 62504 ; WX 904 ; N uniF428 ; G 3292 -U 63173 ; WX 667 ; N uniF6C5 ; G 3293 -U 63185 ; WX 500 ; N cyrBreve ; G 3294 -U 63188 ; WX 500 ; N cyrbreve ; G 3295 -U 64256 ; WX 821 ; N uniFB00 ; G 3296 -U 64257 ; WX 727 ; N fi ; G 3297 -U 64258 ; WX 727 ; N fl ; G 3298 -U 64259 ; WX 1120 ; N uniFB03 ; G 3299 -U 64260 ; WX 1117 ; N uniFB04 ; G 3300 -U 64261 ; WX 871 ; N uniFB05 ; G 3301 -U 64262 ; WX 971 ; N uniFB06 ; G 3302 -U 65024 ; WX 0 ; N uniFE00 ; G 3303 -U 65025 ; WX 0 ; N uniFE01 ; G 3304 -U 65026 ; WX 0 ; N uniFE02 ; G 3305 -U 65027 ; WX 0 ; N uniFE03 ; G 3306 -U 65028 ; WX 0 ; N uniFE04 ; G 3307 -U 65029 ; WX 0 ; N uniFE05 ; G 3308 -U 65030 ; WX 0 ; N uniFE06 ; G 3309 -U 65031 ; WX 0 ; N uniFE07 ; G 3310 -U 65032 ; WX 0 ; N uniFE08 ; G 3311 -U 65033 ; WX 0 ; N uniFE09 ; G 3312 -U 65034 ; WX 0 ; N uniFE0A ; G 3313 -U 65035 ; WX 0 ; N uniFE0B ; G 3314 -U 65036 ; WX 0 ; N uniFE0C ; G 3315 -U 65037 ; WX 0 ; N uniFE0D ; G 3316 -U 65038 ; WX 0 ; N uniFE0E ; G 3317 -U 65039 ; WX 0 ; N uniFE0F ; G 3318 -U 65529 ; WX 0 ; N uniFFF9 ; G 3319 -U 65530 ; WX 0 ; N uniFFFA ; G 3320 -U 65531 ; WX 0 ; N uniFFFB ; G 3321 -U 65532 ; WX 0 ; N uniFFFC ; G 3322 -U 65533 ; WX 1113 ; N uniFFFD ; G 3323 -EndCharMetrics -StartKernData -StartKernPairs 1408 - -KPX dollar seven -112 -KPX dollar nine -149 -KPX dollar colon -102 -KPX dollar less -102 -KPX dollar I -36 -KPX dollar W -36 -KPX dollar Y -83 -KPX dollar Z -83 -KPX dollar backslash -83 -KPX dollar questiondown -83 -KPX dollar Aacute -83 -KPX dollar Hcircumflex -112 -KPX dollar hcircumflex -36 -KPX dollar Hbar -112 -KPX dollar hbar -36 -KPX dollar Kcommaaccent -102 -KPX dollar kcommaaccent -83 -KPX dollar kgreenlandic -102 -KPX dollar Lacute -83 -KPX dollar lacute -102 -KPX dollar uni01DC -112 -KPX dollar uni01DD -36 -KPX dollar uni01F4 -102 -KPX dollar uni01F5 -83 - -KPX percent ampersand 38 -KPX percent asterisk 38 -KPX percent two 38 -KPX percent less -36 -KPX percent Egrave 38 -KPX percent Ecircumflex 38 -KPX percent Igrave 38 -KPX percent Icircumflex 38 -KPX percent Thorn 38 -KPX percent agrave 38 -KPX percent acircumflex 38 -KPX percent adieresis 38 -KPX percent Dcaron 38 -KPX percent Dcroat 38 -KPX percent Emacron 38 -KPX percent Ebreve 38 -KPX percent kgreenlandic -36 -KPX percent lacute -36 -KPX percent uni01AC 38 -KPX percent uni01AE 38 -KPX percent uni01F0 38 -KPX percent uni01F4 -36 - - -KPX quotesingle nine -36 - - -KPX parenright dollar -120 -KPX parenright D -112 -KPX parenright H -112 -KPX parenright R -112 -KPX parenright U -36 -KPX parenright X -36 -KPX parenright cent -112 -KPX parenright sterling -112 -KPX parenright currency -112 -KPX parenright yen -112 -KPX parenright brokenbar -112 -KPX parenright section -112 -KPX parenright dieresis -112 -KPX parenright ordfeminine -112 -KPX parenright guillemotleft -112 -KPX parenright logicalnot -112 -KPX parenright sfthyphen -112 -KPX parenright acute -112 -KPX parenright mu -112 -KPX parenright paragraph -112 -KPX parenright periodcentered -112 -KPX parenright cedilla -112 -KPX parenright ordmasculine -112 -KPX parenright guillemotright -36 -KPX parenright onequarter -36 -KPX parenright onehalf -36 -KPX parenright threequarters -36 -KPX parenright Acircumflex -120 -KPX parenright Atilde -112 -KPX parenright Adieresis -120 -KPX parenright Aring -112 -KPX parenright AE -120 -KPX parenright Ccedilla -112 -KPX parenright Otilde -112 -KPX parenright multiply -112 -KPX parenright Ugrave -112 -KPX parenright Ucircumflex -112 -KPX parenright Yacute -112 -KPX parenright dcaron -112 -KPX parenright dmacron -112 -KPX parenright emacron -112 -KPX parenright ebreve -112 -KPX parenright edotaccent -36 -KPX parenright eogonek -36 -KPX parenright ecaron -36 -KPX parenright imacron -36 -KPX parenright ibreve -36 -KPX parenright iogonek -36 -KPX parenright dotlessi -36 -KPX parenright ij -36 -KPX parenright jcircumflex -36 -KPX parenright uni01A5 -112 -KPX parenright uni01AD -112 -KPX parenright Uhorn -112 -KPX parenright uni01F1 -112 - - - -KPX period dollar -83 -KPX period ampersand -55 -KPX period two -55 -KPX period eight -73 -KPX period colon -73 -KPX period less -55 -KPX period H -45 -KPX period R -45 -KPX period X -45 -KPX period backslash -92 -KPX period ordfeminine -45 -KPX period guillemotleft -45 -KPX period logicalnot -45 -KPX period sfthyphen -45 -KPX period acute -45 -KPX period mu -45 -KPX period paragraph -45 -KPX period periodcentered -45 -KPX period cedilla -45 -KPX period ordmasculine -36 -KPX period guillemotright -45 -KPX period onequarter -45 -KPX period onehalf -45 -KPX period threequarters -45 -KPX period questiondown -92 -KPX period Aacute -92 -KPX period Egrave -55 -KPX period Icircumflex -55 -KPX period Yacute -45 -KPX period Ebreve -55 -KPX period ebreve -45 -KPX period Idot -73 -KPX period dotlessi -45 -KPX period lacute -55 - -KPX slash seven -167 -KPX slash eight -112 -KPX slash nine -243 -KPX slash colon -139 -KPX slash less -131 -KPX slash backslash -73 -KPX slash questiondown -73 -KPX slash Aacute -73 -KPX slash Hbar -167 -KPX slash Idot -112 -KPX slash lacute -131 - - -KPX two nine -36 -KPX two semicolon -36 - -KPX three dollar -149 -KPX three D -55 -KPX three H -55 -KPX three R -55 -KPX three cent -55 -KPX three sterling -55 -KPX three currency -55 -KPX three yen -55 -KPX three brokenbar -55 -KPX three section -55 -KPX three dieresis -55 -KPX three ordfeminine -55 -KPX three guillemotleft -55 -KPX three logicalnot -55 -KPX three sfthyphen -55 -KPX three acute -55 -KPX three mu -55 -KPX three paragraph -55 -KPX three periodcentered -55 -KPX three cedilla -55 -KPX three ordmasculine -55 -KPX three Yacute -55 -KPX three ebreve -55 - - -KPX five seven -36 -KPX five nine -73 -KPX five colon -45 -KPX five less -63 -KPX five D 47 -KPX five backslash -36 -KPX five cent 47 -KPX five sterling 47 -KPX five currency 47 -KPX five yen 47 -KPX five brokenbar 47 -KPX five section 47 -KPX five dieresis 47 -KPX five ordmasculine 38 -KPX five questiondown -36 -KPX five Aacute -36 -KPX five Hbar -36 -KPX five lacute -63 - -KPX six six -45 -KPX six Gdotaccent -45 -KPX six Gcommaaccent -45 - -KPX seven dollar -112 -KPX seven seven -73 -KPX seven D -196 -KPX seven F -235 -KPX seven H -235 -KPX seven R -235 -KPX seven U -149 -KPX seven V -188 -KPX seven X -188 -KPX seven Z -225 -KPX seven backslash -225 -KPX seven m -149 -KPX seven braceright -149 -KPX seven cent -96 -KPX seven sterling -196 -KPX seven currency -96 -KPX seven yen -96 -KPX seven brokenbar -96 -KPX seven section -96 -KPX seven dieresis -159 -KPX seven copyright -235 -KPX seven ordfeminine -175 -KPX seven guillemotleft -235 -KPX seven logicalnot -175 -KPX seven sfthyphen -175 -KPX seven acute -155 -KPX seven mu -235 -KPX seven paragraph -155 -KPX seven periodcentered -155 -KPX seven cedilla -155 -KPX seven ordmasculine -159 -KPX seven guillemotright -158 -KPX seven onequarter -188 -KPX seven onehalf -158 -KPX seven threequarters -158 -KPX seven questiondown -225 -KPX seven Aacute -225 -KPX seven Eacute -235 -KPX seven Idieresis -235 -KPX seven Yacute -235 -KPX seven ebreve -159 -KPX seven edotaccent -149 -KPX seven ecaron -149 -KPX seven gdotaccent -188 -KPX seven gcommaaccent -188 -KPX seven Hbar -73 -KPX seven dotlessi -188 - -KPX eight dollar -63 - -KPX nine dollar -159 -KPX nine two -36 -KPX nine D -188 -KPX nine H -188 -KPX nine L -36 -KPX nine R -188 -KPX nine X -131 -KPX nine backslash -83 -KPX nine cent -188 -KPX nine sterling -188 -KPX nine currency -188 -KPX nine yen -188 -KPX nine brokenbar -188 -KPX nine section -188 -KPX nine dieresis -188 -KPX nine ordfeminine -188 -KPX nine guillemotleft -188 -KPX nine logicalnot -188 -KPX nine sfthyphen -188 -KPX nine acute -188 -KPX nine mu -188 -KPX nine paragraph -188 -KPX nine periodcentered -188 -KPX nine cedilla -188 -KPX nine ordmasculine -188 -KPX nine guillemotright -131 -KPX nine onequarter -131 -KPX nine onehalf -131 -KPX nine threequarters -131 -KPX nine questiondown -83 -KPX nine Aacute -83 -KPX nine Yacute -188 -KPX nine Ebreve -36 -KPX nine ebreve -188 -KPX nine dotlessi -131 - -KPX colon dollar -131 -KPX colon D -178 -KPX colon H -167 -KPX colon L -36 -KPX colon R -167 -KPX colon U -92 -KPX colon X -83 -KPX colon backslash -45 -KPX colon cent -178 -KPX colon sterling -178 -KPX colon currency -178 -KPX colon yen -178 -KPX colon brokenbar -178 -KPX colon section -178 -KPX colon dieresis -139 -KPX colon ordfeminine -167 -KPX colon guillemotleft -167 -KPX colon logicalnot -167 -KPX colon sfthyphen -167 -KPX colon acute -167 -KPX colon mu -167 -KPX colon paragraph -167 -KPX colon periodcentered -167 -KPX colon cedilla -167 -KPX colon ordmasculine -167 -KPX colon guillemotright -83 -KPX colon onequarter -83 -KPX colon onehalf -83 -KPX colon threequarters -83 -KPX colon questiondown -45 -KPX colon Aacute -45 -KPX colon Yacute -167 -KPX colon ebreve -167 -KPX colon edotaccent -92 -KPX colon ecaron -92 -KPX colon dotlessi -83 - -KPX semicolon dollar -73 -KPX semicolon ampersand -36 -KPX semicolon two -36 -KPX semicolon Egrave -36 -KPX semicolon Icircumflex -36 -KPX semicolon Ebreve -36 - -KPX less dollar -131 -KPX less ampersand -36 -KPX less D -159 -KPX less H -178 -KPX less L -36 -KPX less R -178 -KPX less X -178 -KPX less cent -159 -KPX less sterling -159 -KPX less currency -159 -KPX less yen -159 -KPX less brokenbar -159 -KPX less section -159 -KPX less dieresis -159 -KPX less ordfeminine -178 -KPX less guillemotleft -178 -KPX less logicalnot -178 -KPX less sfthyphen -178 -KPX less acute -178 -KPX less mu -178 -KPX less paragraph -178 -KPX less periodcentered -178 -KPX less cedilla -178 -KPX less ordmasculine -178 -KPX less guillemotright -178 -KPX less onequarter -178 -KPX less onehalf -178 -KPX less threequarters -178 -KPX less Egrave -36 -KPX less Icircumflex -36 -KPX less Yacute -178 -KPX less ebreve -178 -KPX less dotlessi -178 - - - - - - - - - - -KPX m hyphen -73 -KPX m seven -149 -KPX m Hbar -149 - -KPX braceright hyphen -73 -KPX braceright seven -149 -KPX braceright Hbar -149 - - - - - - - - - - - - -KPX Acircumflex seven -112 -KPX Acircumflex nine -149 -KPX Acircumflex colon -102 -KPX Acircumflex less -102 -KPX Acircumflex I -36 -KPX Acircumflex W -36 -KPX Acircumflex Y -83 -KPX Acircumflex Z -83 -KPX Acircumflex backslash -83 -KPX Acircumflex questiondown -83 -KPX Acircumflex Aacute -83 -KPX Acircumflex Hcircumflex -112 -KPX Acircumflex hcircumflex -36 -KPX Acircumflex Hbar -112 -KPX Acircumflex hbar -36 -KPX Acircumflex Kcommaaccent -102 -KPX Acircumflex kcommaaccent -83 -KPX Acircumflex kgreenlandic -102 -KPX Acircumflex Lacute -83 -KPX Acircumflex lacute -102 -KPX Acircumflex uni01DC -112 -KPX Acircumflex uni01DD -36 -KPX Acircumflex uni01F4 -102 -KPX Acircumflex uni01F5 -83 - -KPX Adieresis seven -112 -KPX Adieresis nine -149 -KPX Adieresis colon -102 -KPX Adieresis less -102 -KPX Adieresis I -36 -KPX Adieresis W -36 -KPX Adieresis Y -83 -KPX Adieresis Z -83 -KPX Adieresis backslash -83 -KPX Adieresis questiondown -83 -KPX Adieresis Aacute -83 -KPX Adieresis Hcircumflex -112 -KPX Adieresis hcircumflex -36 -KPX Adieresis Hbar -112 -KPX Adieresis hbar -36 -KPX Adieresis Kcommaaccent -102 -KPX Adieresis kcommaaccent -83 -KPX Adieresis kgreenlandic -102 -KPX Adieresis Lacute -83 -KPX Adieresis lacute -102 -KPX Adieresis uni01DC -112 -KPX Adieresis uni01DD -36 -KPX Adieresis uni01F4 -102 -KPX Adieresis uni01F5 -83 - -KPX AE seven -112 -KPX AE nine -149 -KPX AE colon -102 -KPX AE less -102 -KPX AE I -36 -KPX AE W -36 -KPX AE Y -83 -KPX AE Z -83 -KPX AE backslash -83 -KPX AE questiondown -83 -KPX AE Aacute -83 -KPX AE Hcircumflex -112 -KPX AE hcircumflex -36 -KPX AE Hbar -112 -KPX AE hbar -36 -KPX AE Kcommaaccent -102 -KPX AE kcommaaccent -83 -KPX AE kgreenlandic -102 -KPX AE Lacute -83 -KPX AE lacute -102 -KPX AE uni01DC -112 -KPX AE uni01DD -36 -KPX AE uni01F4 -102 -KPX AE uni01F5 -83 - - - - - -KPX Eth nine -36 - -KPX Ograve nine -36 - - - -KPX ucircumflex seven -167 -KPX ucircumflex eight -112 -KPX ucircumflex nine -243 -KPX ucircumflex colon -139 -KPX ucircumflex less -131 -KPX ucircumflex backslash -73 -KPX ucircumflex questiondown -73 -KPX ucircumflex Aacute -73 -KPX ucircumflex Hbar -167 -KPX ucircumflex Idot -112 -KPX ucircumflex lacute -131 - -KPX ydieresis seven -167 -KPX ydieresis eight -112 -KPX ydieresis nine -243 -KPX ydieresis colon -139 -KPX ydieresis less -131 -KPX ydieresis backslash -73 -KPX ydieresis questiondown -73 -KPX ydieresis Aacute -73 -KPX ydieresis Hbar -167 -KPX ydieresis Idot -112 -KPX ydieresis lacute -131 - -KPX Abreve O -241 - -KPX abreve seven -167 -KPX abreve eight -112 -KPX abreve nine -243 -KPX abreve colon -139 -KPX abreve less -131 -KPX abreve backslash -73 -KPX abreve questiondown -73 -KPX abreve Aacute -73 -KPX abreve Hbar -167 -KPX abreve Idot -112 -KPX abreve lacute -131 - - - -KPX Edotaccent seven -36 -KPX Edotaccent nine -73 -KPX Edotaccent colon -45 -KPX Edotaccent less -63 -KPX Edotaccent D 47 -KPX Edotaccent backslash -36 -KPX Edotaccent cent 47 -KPX Edotaccent sterling 47 -KPX Edotaccent currency 47 -KPX Edotaccent yen 47 -KPX Edotaccent brokenbar 47 -KPX Edotaccent section 47 -KPX Edotaccent dieresis 47 -KPX Edotaccent ordmasculine 38 -KPX Edotaccent questiondown -36 -KPX Edotaccent Aacute -36 -KPX Edotaccent Hbar -36 -KPX Edotaccent lacute -63 - - -KPX Ecaron seven -36 -KPX Ecaron nine -73 -KPX Ecaron colon -45 -KPX Ecaron less -63 -KPX Ecaron D 47 -KPX Ecaron backslash -36 -KPX Ecaron cent 47 -KPX Ecaron sterling 47 -KPX Ecaron currency 47 -KPX Ecaron yen 47 -KPX Ecaron brokenbar 47 -KPX Ecaron section 47 -KPX Ecaron dieresis 47 -KPX Ecaron ordmasculine 38 -KPX Ecaron questiondown -36 -KPX Ecaron Aacute -36 -KPX Ecaron Hbar -36 -KPX Ecaron lacute -63 - - -KPX Gdotaccent six -45 -KPX Gdotaccent Gdotaccent -45 -KPX Gdotaccent Gcommaaccent -45 - -KPX Gcommaaccent six -45 -KPX Gcommaaccent Gdotaccent -45 -KPX Gcommaaccent Gcommaaccent -45 - -KPX Hbar dollar -112 -KPX Hbar seven -73 -KPX Hbar D -196 -KPX Hbar F -235 -KPX Hbar H -235 -KPX Hbar R -235 -KPX Hbar U -149 -KPX Hbar V -188 -KPX Hbar X -188 -KPX Hbar Z -225 -KPX Hbar backslash -225 -KPX Hbar m -149 -KPX Hbar braceright -149 -KPX Hbar cent -196 -KPX Hbar sterling -196 -KPX Hbar currency -196 -KPX Hbar yen -196 -KPX Hbar brokenbar -196 -KPX Hbar section -196 -KPX Hbar dieresis -159 -KPX Hbar copyright -235 -KPX Hbar ordfeminine -235 -KPX Hbar guillemotleft -235 -KPX Hbar logicalnot -235 -KPX Hbar sfthyphen -235 -KPX Hbar acute -235 -KPX Hbar mu -235 -KPX Hbar paragraph -235 -KPX Hbar periodcentered -235 -KPX Hbar cedilla -235 -KPX Hbar ordmasculine -159 -KPX Hbar guillemotright -188 -KPX Hbar onequarter -188 -KPX Hbar onehalf -188 -KPX Hbar threequarters -188 -KPX Hbar questiondown -225 -KPX Hbar Aacute -225 -KPX Hbar Eacute -235 -KPX Hbar Idieresis -235 -KPX Hbar Yacute -235 -KPX Hbar ebreve -159 -KPX Hbar edotaccent -149 -KPX Hbar ecaron -149 -KPX Hbar gdotaccent -188 -KPX Hbar gcommaaccent -188 -KPX Hbar Hbar -73 -KPX Hbar dotlessi -188 - -KPX Idot dollar -63 - -KPX lacute dollar -131 -KPX lacute ampersand -36 -KPX lacute D -159 -KPX lacute H -178 -KPX lacute L -36 -KPX lacute R -178 -KPX lacute X -178 -KPX lacute cent -159 -KPX lacute sterling -159 -KPX lacute currency -159 -KPX lacute yen -159 -KPX lacute brokenbar -159 -KPX lacute section -159 -KPX lacute dieresis -159 -KPX lacute ordfeminine -178 -KPX lacute guillemotleft -178 -KPX lacute logicalnot -178 -KPX lacute sfthyphen -178 -KPX lacute acute -178 -KPX lacute mu -178 -KPX lacute paragraph -178 -KPX lacute periodcentered -178 -KPX lacute cedilla -178 -KPX lacute ordmasculine -178 -KPX lacute guillemotright -178 -KPX lacute onequarter -178 -KPX lacute onehalf -178 -KPX lacute threequarters -178 -KPX lacute Egrave -36 -KPX lacute Icircumflex -36 -KPX lacute Yacute -178 -KPX lacute ebreve -178 -KPX lacute dotlessi -178 - - -KPX uni027D dollar -282 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ttf deleted file mode 100644 index a36dd4b..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ufm deleted file mode 100644 index f6db21d..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ufm +++ /dev/null @@ -1,3892 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Serif -FontSubfamily Bold Italic -UniqueID DejaVu Serif Bold Italic -FullName DejaVu Serif Bold Italic -Version Version 2.37 -PostScriptName DejaVuSerif-BoldItalic -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -PreferredFamily DejaVu Serif -PreferredSubfamily Bold Italic -Weight Bold -ItalicAngle -11 -IsFixedPitch false -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 939 -Descender -236 -FontBBox -906 -389 1925 1145 -StartCharMetrics 3506 -U 32 ; WX 348 ; N space ; G 3 -U 33 ; WX 439 ; N exclam ; G 4 -U 34 ; WX 521 ; N quotedbl ; G 5 -U 35 ; WX 838 ; N numbersign ; G 6 -U 36 ; WX 696 ; N dollar ; G 7 -U 37 ; WX 950 ; N percent ; G 8 -U 38 ; WX 903 ; N ampersand ; G 9 -U 39 ; WX 306 ; N quotesingle ; G 10 -U 40 ; WX 473 ; N parenleft ; G 11 -U 41 ; WX 473 ; N parenright ; G 12 -U 42 ; WX 523 ; N asterisk ; G 13 -U 43 ; WX 838 ; N plus ; G 14 -U 44 ; WX 348 ; N comma ; G 15 -U 45 ; WX 415 ; N hyphen ; G 16 -U 46 ; WX 348 ; N period ; G 17 -U 47 ; WX 365 ; N slash ; G 18 -U 48 ; WX 696 ; N zero ; G 19 -U 49 ; WX 696 ; N one ; G 20 -U 50 ; WX 696 ; N two ; G 21 -U 51 ; WX 696 ; N three ; G 22 -U 52 ; WX 696 ; N four ; G 23 -U 53 ; WX 696 ; N five ; G 24 -U 54 ; WX 696 ; N six ; G 25 -U 55 ; WX 696 ; N seven ; G 26 -U 56 ; WX 696 ; N eight ; G 27 -U 57 ; WX 696 ; N nine ; G 28 -U 58 ; WX 369 ; N colon ; G 29 -U 59 ; WX 369 ; N semicolon ; G 30 -U 60 ; WX 838 ; N less ; G 31 -U 61 ; WX 838 ; N equal ; G 32 -U 62 ; WX 838 ; N greater ; G 33 -U 63 ; WX 586 ; N question ; G 34 -U 64 ; WX 1000 ; N at ; G 35 -U 65 ; WX 776 ; N A ; G 36 -U 66 ; WX 845 ; N B ; G 37 -U 67 ; WX 796 ; N C ; G 38 -U 68 ; WX 867 ; N D ; G 39 -U 69 ; WX 762 ; N E ; G 40 -U 70 ; WX 710 ; N F ; G 41 -U 71 ; WX 854 ; N G ; G 42 -U 72 ; WX 945 ; N H ; G 43 -U 73 ; WX 468 ; N I ; G 44 -U 74 ; WX 473 ; N J ; G 45 -U 75 ; WX 869 ; N K ; G 46 -U 76 ; WX 703 ; N L ; G 47 -U 77 ; WX 1107 ; N M ; G 48 -U 78 ; WX 914 ; N N ; G 49 -U 79 ; WX 871 ; N O ; G 50 -U 80 ; WX 752 ; N P ; G 51 -U 81 ; WX 871 ; N Q ; G 52 -U 82 ; WX 831 ; N R ; G 53 -U 83 ; WX 722 ; N S ; G 54 -U 84 ; WX 744 ; N T ; G 55 -U 85 ; WX 872 ; N U ; G 56 -U 86 ; WX 776 ; N V ; G 57 -U 87 ; WX 1123 ; N W ; G 58 -U 88 ; WX 776 ; N X ; G 59 -U 89 ; WX 714 ; N Y ; G 60 -U 90 ; WX 730 ; N Z ; G 61 -U 91 ; WX 473 ; N bracketleft ; G 62 -U 92 ; WX 365 ; N backslash ; G 63 -U 93 ; WX 473 ; N bracketright ; G 64 -U 94 ; WX 838 ; N asciicircum ; G 65 -U 95 ; WX 500 ; N underscore ; G 66 -U 96 ; WX 500 ; N grave ; G 67 -U 97 ; WX 648 ; N a ; G 68 -U 98 ; WX 699 ; N b ; G 69 -U 99 ; WX 609 ; N c ; G 70 -U 100 ; WX 699 ; N d ; G 71 -U 101 ; WX 636 ; N e ; G 72 -U 102 ; WX 430 ; N f ; G 73 -U 103 ; WX 699 ; N g ; G 74 -U 104 ; WX 727 ; N h ; G 75 -U 105 ; WX 380 ; N i ; G 76 -U 106 ; WX 362 ; N j ; G 77 -U 107 ; WX 693 ; N k ; G 78 -U 108 ; WX 380 ; N l ; G 79 -U 109 ; WX 1058 ; N m ; G 80 -U 110 ; WX 727 ; N n ; G 81 -U 111 ; WX 667 ; N o ; G 82 -U 112 ; WX 699 ; N p ; G 83 -U 113 ; WX 699 ; N q ; G 84 -U 114 ; WX 527 ; N r ; G 85 -U 115 ; WX 563 ; N s ; G 86 -U 116 ; WX 462 ; N t ; G 87 -U 117 ; WX 727 ; N u ; G 88 -U 118 ; WX 581 ; N v ; G 89 -U 119 ; WX 861 ; N w ; G 90 -U 120 ; WX 596 ; N x ; G 91 -U 121 ; WX 581 ; N y ; G 92 -U 122 ; WX 568 ; N z ; G 93 -U 123 ; WX 643 ; N braceleft ; G 94 -U 124 ; WX 364 ; N bar ; G 95 -U 125 ; WX 643 ; N braceright ; G 96 -U 126 ; WX 838 ; N asciitilde ; G 97 -U 160 ; WX 348 ; N nbspace ; G 98 -U 161 ; WX 439 ; N exclamdown ; G 99 -U 162 ; WX 696 ; N cent ; G 100 -U 163 ; WX 696 ; N sterling ; G 101 -U 164 ; WX 636 ; N currency ; G 102 -U 165 ; WX 696 ; N yen ; G 103 -U 166 ; WX 364 ; N brokenbar ; G 104 -U 167 ; WX 523 ; N section ; G 105 -U 168 ; WX 500 ; N dieresis ; G 106 -U 169 ; WX 1000 ; N copyright ; G 107 -U 170 ; WX 487 ; N ordfeminine ; G 108 -U 171 ; WX 625 ; N guillemotleft ; G 109 -U 172 ; WX 838 ; N logicalnot ; G 110 -U 173 ; WX 415 ; N sfthyphen ; G 111 -U 174 ; WX 1000 ; N registered ; G 112 -U 175 ; WX 500 ; N macron ; G 113 -U 176 ; WX 500 ; N degree ; G 114 -U 177 ; WX 838 ; N plusminus ; G 115 -U 178 ; WX 438 ; N twosuperior ; G 116 -U 179 ; WX 438 ; N threesuperior ; G 117 -U 180 ; WX 500 ; N acute ; G 118 -U 181 ; WX 732 ; N mu ; G 119 -U 182 ; WX 636 ; N paragraph ; G 120 -U 183 ; WX 348 ; N periodcentered ; G 121 -U 184 ; WX 500 ; N cedilla ; G 122 -U 185 ; WX 438 ; N onesuperior ; G 123 -U 186 ; WX 500 ; N ordmasculine ; G 124 -U 187 ; WX 625 ; N guillemotright ; G 125 -U 188 ; WX 1043 ; N onequarter ; G 126 -U 189 ; WX 1043 ; N onehalf ; G 127 -U 190 ; WX 1043 ; N threequarters ; G 128 -U 191 ; WX 586 ; N questiondown ; G 129 -U 192 ; WX 776 ; N Agrave ; G 130 -U 193 ; WX 776 ; N Aacute ; G 131 -U 194 ; WX 776 ; N Acircumflex ; G 132 -U 195 ; WX 776 ; N Atilde ; G 133 -U 196 ; WX 776 ; N Adieresis ; G 134 -U 197 ; WX 776 ; N Aring ; G 135 -U 198 ; WX 1034 ; N AE ; G 136 -U 199 ; WX 796 ; N Ccedilla ; G 137 -U 200 ; WX 762 ; N Egrave ; G 138 -U 201 ; WX 762 ; N Eacute ; G 139 -U 202 ; WX 762 ; N Ecircumflex ; G 140 -U 203 ; WX 762 ; N Edieresis ; G 141 -U 204 ; WX 468 ; N Igrave ; G 142 -U 205 ; WX 468 ; N Iacute ; G 143 -U 206 ; WX 468 ; N Icircumflex ; G 144 -U 207 ; WX 468 ; N Idieresis ; G 145 -U 208 ; WX 874 ; N Eth ; G 146 -U 209 ; WX 914 ; N Ntilde ; G 147 -U 210 ; WX 871 ; N Ograve ; G 148 -U 211 ; WX 871 ; N Oacute ; G 149 -U 212 ; WX 871 ; N Ocircumflex ; G 150 -U 213 ; WX 871 ; N Otilde ; G 151 -U 214 ; WX 871 ; N Odieresis ; G 152 -U 215 ; WX 838 ; N multiply ; G 153 -U 216 ; WX 871 ; N Oslash ; G 154 -U 217 ; WX 872 ; N Ugrave ; G 155 -U 218 ; WX 872 ; N Uacute ; G 156 -U 219 ; WX 872 ; N Ucircumflex ; G 157 -U 220 ; WX 872 ; N Udieresis ; G 158 -U 221 ; WX 714 ; N Yacute ; G 159 -U 222 ; WX 757 ; N Thorn ; G 160 -U 223 ; WX 760 ; N germandbls ; G 161 -U 224 ; WX 648 ; N agrave ; G 162 -U 225 ; WX 648 ; N aacute ; G 163 -U 226 ; WX 648 ; N acircumflex ; G 164 -U 227 ; WX 648 ; N atilde ; G 165 -U 228 ; WX 648 ; N adieresis ; G 166 -U 229 ; WX 648 ; N aring ; G 167 -U 230 ; WX 932 ; N ae ; G 168 -U 231 ; WX 609 ; N ccedilla ; G 169 -U 232 ; WX 636 ; N egrave ; G 170 -U 233 ; WX 636 ; N eacute ; G 171 -U 234 ; WX 636 ; N ecircumflex ; G 172 -U 235 ; WX 636 ; N edieresis ; G 173 -U 236 ; WX 380 ; N igrave ; G 174 -U 237 ; WX 380 ; N iacute ; G 175 -U 238 ; WX 380 ; N icircumflex ; G 176 -U 239 ; WX 380 ; N idieresis ; G 177 -U 240 ; WX 667 ; N eth ; G 178 -U 241 ; WX 727 ; N ntilde ; G 179 -U 242 ; WX 667 ; N ograve ; G 180 -U 243 ; WX 667 ; N oacute ; G 181 -U 244 ; WX 667 ; N ocircumflex ; G 182 -U 245 ; WX 667 ; N otilde ; G 183 -U 246 ; WX 667 ; N odieresis ; G 184 -U 247 ; WX 838 ; N divide ; G 185 -U 248 ; WX 667 ; N oslash ; G 186 -U 249 ; WX 727 ; N ugrave ; G 187 -U 250 ; WX 727 ; N uacute ; G 188 -U 251 ; WX 727 ; N ucircumflex ; G 189 -U 252 ; WX 727 ; N udieresis ; G 190 -U 253 ; WX 581 ; N yacute ; G 191 -U 254 ; WX 699 ; N thorn ; G 192 -U 255 ; WX 581 ; N ydieresis ; G 193 -U 256 ; WX 776 ; N Amacron ; G 194 -U 257 ; WX 648 ; N amacron ; G 195 -U 258 ; WX 776 ; N Abreve ; G 196 -U 259 ; WX 648 ; N abreve ; G 197 -U 260 ; WX 776 ; N Aogonek ; G 198 -U 261 ; WX 648 ; N aogonek ; G 199 -U 262 ; WX 796 ; N Cacute ; G 200 -U 263 ; WX 609 ; N cacute ; G 201 -U 264 ; WX 796 ; N Ccircumflex ; G 202 -U 265 ; WX 609 ; N ccircumflex ; G 203 -U 266 ; WX 796 ; N Cdotaccent ; G 204 -U 267 ; WX 609 ; N cdotaccent ; G 205 -U 268 ; WX 796 ; N Ccaron ; G 206 -U 269 ; WX 609 ; N ccaron ; G 207 -U 270 ; WX 867 ; N Dcaron ; G 208 -U 271 ; WX 699 ; N dcaron ; G 209 -U 272 ; WX 874 ; N Dcroat ; G 210 -U 273 ; WX 699 ; N dmacron ; G 211 -U 274 ; WX 762 ; N Emacron ; G 212 -U 275 ; WX 636 ; N emacron ; G 213 -U 276 ; WX 762 ; N Ebreve ; G 214 -U 277 ; WX 636 ; N ebreve ; G 215 -U 278 ; WX 762 ; N Edotaccent ; G 216 -U 279 ; WX 636 ; N edotaccent ; G 217 -U 280 ; WX 762 ; N Eogonek ; G 218 -U 281 ; WX 636 ; N eogonek ; G 219 -U 282 ; WX 762 ; N Ecaron ; G 220 -U 283 ; WX 636 ; N ecaron ; G 221 -U 284 ; WX 854 ; N Gcircumflex ; G 222 -U 285 ; WX 699 ; N gcircumflex ; G 223 -U 286 ; WX 854 ; N Gbreve ; G 224 -U 287 ; WX 699 ; N gbreve ; G 225 -U 288 ; WX 854 ; N Gdotaccent ; G 226 -U 289 ; WX 699 ; N gdotaccent ; G 227 -U 290 ; WX 854 ; N Gcommaaccent ; G 228 -U 291 ; WX 699 ; N gcommaaccent ; G 229 -U 292 ; WX 945 ; N Hcircumflex ; G 230 -U 293 ; WX 727 ; N hcircumflex ; G 231 -U 294 ; WX 945 ; N Hbar ; G 232 -U 295 ; WX 727 ; N hbar ; G 233 -U 296 ; WX 468 ; N Itilde ; G 234 -U 297 ; WX 380 ; N itilde ; G 235 -U 298 ; WX 468 ; N Imacron ; G 236 -U 299 ; WX 380 ; N imacron ; G 237 -U 300 ; WX 468 ; N Ibreve ; G 238 -U 301 ; WX 380 ; N ibreve ; G 239 -U 302 ; WX 468 ; N Iogonek ; G 240 -U 303 ; WX 380 ; N iogonek ; G 241 -U 304 ; WX 468 ; N Idot ; G 242 -U 305 ; WX 380 ; N dotlessi ; G 243 -U 306 ; WX 942 ; N IJ ; G 244 -U 307 ; WX 751 ; N ij ; G 245 -U 308 ; WX 473 ; N Jcircumflex ; G 246 -U 309 ; WX 362 ; N jcircumflex ; G 247 -U 310 ; WX 869 ; N Kcommaaccent ; G 248 -U 311 ; WX 693 ; N kcommaaccent ; G 249 -U 312 ; WX 693 ; N kgreenlandic ; G 250 -U 313 ; WX 703 ; N Lacute ; G 251 -U 314 ; WX 380 ; N lacute ; G 252 -U 315 ; WX 703 ; N Lcommaaccent ; G 253 -U 316 ; WX 380 ; N lcommaaccent ; G 254 -U 317 ; WX 703 ; N Lcaron ; G 255 -U 318 ; WX 508 ; N lcaron ; G 256 -U 319 ; WX 703 ; N Ldot ; G 257 -U 320 ; WX 557 ; N ldot ; G 258 -U 321 ; WX 710 ; N Lslash ; G 259 -U 322 ; WX 385 ; N lslash ; G 260 -U 323 ; WX 914 ; N Nacute ; G 261 -U 324 ; WX 727 ; N nacute ; G 262 -U 325 ; WX 914 ; N Ncommaaccent ; G 263 -U 326 ; WX 727 ; N ncommaaccent ; G 264 -U 327 ; WX 914 ; N Ncaron ; G 265 -U 328 ; WX 727 ; N ncaron ; G 266 -U 329 ; WX 1008 ; N napostrophe ; G 267 -U 330 ; WX 872 ; N Eng ; G 268 -U 331 ; WX 727 ; N eng ; G 269 -U 332 ; WX 871 ; N Omacron ; G 270 -U 333 ; WX 667 ; N omacron ; G 271 -U 334 ; WX 871 ; N Obreve ; G 272 -U 335 ; WX 667 ; N obreve ; G 273 -U 336 ; WX 871 ; N Ohungarumlaut ; G 274 -U 337 ; WX 667 ; N ohungarumlaut ; G 275 -U 338 ; WX 1180 ; N OE ; G 276 -U 339 ; WX 1028 ; N oe ; G 277 -U 340 ; WX 831 ; N Racute ; G 278 -U 341 ; WX 527 ; N racute ; G 279 -U 342 ; WX 831 ; N Rcommaaccent ; G 280 -U 343 ; WX 527 ; N rcommaaccent ; G 281 -U 344 ; WX 831 ; N Rcaron ; G 282 -U 345 ; WX 527 ; N rcaron ; G 283 -U 346 ; WX 722 ; N Sacute ; G 284 -U 347 ; WX 563 ; N sacute ; G 285 -U 348 ; WX 722 ; N Scircumflex ; G 286 -U 349 ; WX 563 ; N scircumflex ; G 287 -U 350 ; WX 722 ; N Scedilla ; G 288 -U 351 ; WX 563 ; N scedilla ; G 289 -U 352 ; WX 722 ; N Scaron ; G 290 -U 353 ; WX 563 ; N scaron ; G 291 -U 354 ; WX 744 ; N Tcommaaccent ; G 292 -U 355 ; WX 462 ; N tcommaaccent ; G 293 -U 356 ; WX 744 ; N Tcaron ; G 294 -U 357 ; WX 462 ; N tcaron ; G 295 -U 358 ; WX 744 ; N Tbar ; G 296 -U 359 ; WX 462 ; N tbar ; G 297 -U 360 ; WX 872 ; N Utilde ; G 298 -U 361 ; WX 727 ; N utilde ; G 299 -U 362 ; WX 872 ; N Umacron ; G 300 -U 363 ; WX 727 ; N umacron ; G 301 -U 364 ; WX 872 ; N Ubreve ; G 302 -U 365 ; WX 727 ; N ubreve ; G 303 -U 366 ; WX 872 ; N Uring ; G 304 -U 367 ; WX 727 ; N uring ; G 305 -U 368 ; WX 872 ; N Uhungarumlaut ; G 306 -U 369 ; WX 727 ; N uhungarumlaut ; G 307 -U 370 ; WX 872 ; N Uogonek ; G 308 -U 371 ; WX 727 ; N uogonek ; G 309 -U 372 ; WX 1123 ; N Wcircumflex ; G 310 -U 373 ; WX 861 ; N wcircumflex ; G 311 -U 374 ; WX 714 ; N Ycircumflex ; G 312 -U 375 ; WX 581 ; N ycircumflex ; G 313 -U 376 ; WX 714 ; N Ydieresis ; G 314 -U 377 ; WX 730 ; N Zacute ; G 315 -U 378 ; WX 568 ; N zacute ; G 316 -U 379 ; WX 730 ; N Zdotaccent ; G 317 -U 380 ; WX 568 ; N zdotaccent ; G 318 -U 381 ; WX 730 ; N Zcaron ; G 319 -U 382 ; WX 568 ; N zcaron ; G 320 -U 383 ; WX 430 ; N longs ; G 321 -U 384 ; WX 699 ; N uni0180 ; G 322 -U 385 ; WX 845 ; N uni0181 ; G 323 -U 386 ; WX 854 ; N uni0182 ; G 324 -U 387 ; WX 699 ; N uni0183 ; G 325 -U 388 ; WX 854 ; N uni0184 ; G 326 -U 389 ; WX 699 ; N uni0185 ; G 327 -U 390 ; WX 796 ; N uni0186 ; G 328 -U 391 ; WX 796 ; N uni0187 ; G 329 -U 392 ; WX 609 ; N uni0188 ; G 330 -U 393 ; WX 874 ; N uni0189 ; G 331 -U 394 ; WX 867 ; N uni018A ; G 332 -U 395 ; WX 854 ; N uni018B ; G 333 -U 396 ; WX 699 ; N uni018C ; G 334 -U 397 ; WX 667 ; N uni018D ; G 335 -U 398 ; WX 762 ; N uni018E ; G 336 -U 399 ; WX 871 ; N uni018F ; G 337 -U 400 ; WX 721 ; N uni0190 ; G 338 -U 401 ; WX 710 ; N uni0191 ; G 339 -U 402 ; WX 430 ; N florin ; G 340 -U 403 ; WX 854 ; N uni0193 ; G 341 -U 404 ; WX 771 ; N uni0194 ; G 342 -U 405 ; WX 1043 ; N uni0195 ; G 343 -U 406 ; WX 468 ; N uni0196 ; G 344 -U 407 ; WX 468 ; N uni0197 ; G 345 -U 408 ; WX 869 ; N uni0198 ; G 346 -U 409 ; WX 693 ; N uni0199 ; G 347 -U 410 ; WX 380 ; N uni019A ; G 348 -U 411 ; WX 701 ; N uni019B ; G 349 -U 412 ; WX 1058 ; N uni019C ; G 350 -U 413 ; WX 914 ; N uni019D ; G 351 -U 414 ; WX 727 ; N uni019E ; G 352 -U 415 ; WX 871 ; N uni019F ; G 353 -U 416 ; WX 871 ; N Ohorn ; G 354 -U 417 ; WX 667 ; N ohorn ; G 355 -U 418 ; WX 1200 ; N uni01A2 ; G 356 -U 419 ; WX 943 ; N uni01A3 ; G 357 -U 420 ; WX 752 ; N uni01A4 ; G 358 -U 421 ; WX 699 ; N uni01A5 ; G 359 -U 422 ; WX 831 ; N uni01A6 ; G 360 -U 423 ; WX 722 ; N uni01A7 ; G 361 -U 424 ; WX 563 ; N uni01A8 ; G 362 -U 425 ; WX 707 ; N uni01A9 ; G 363 -U 426 ; WX 331 ; N uni01AA ; G 364 -U 427 ; WX 462 ; N uni01AB ; G 365 -U 428 ; WX 744 ; N uni01AC ; G 366 -U 429 ; WX 462 ; N uni01AD ; G 367 -U 430 ; WX 744 ; N uni01AE ; G 368 -U 431 ; WX 872 ; N Uhorn ; G 369 -U 432 ; WX 727 ; N uhorn ; G 370 -U 433 ; WX 890 ; N uni01B1 ; G 371 -U 434 ; WX 890 ; N uni01B2 ; G 372 -U 435 ; WX 714 ; N uni01B3 ; G 373 -U 436 ; WX 699 ; N uni01B4 ; G 374 -U 437 ; WX 730 ; N uni01B5 ; G 375 -U 438 ; WX 568 ; N uni01B6 ; G 376 -U 439 ; WX 657 ; N uni01B7 ; G 377 -U 440 ; WX 657 ; N uni01B8 ; G 378 -U 441 ; WX 657 ; N uni01B9 ; G 379 -U 442 ; WX 657 ; N uni01BA ; G 380 -U 443 ; WX 696 ; N uni01BB ; G 381 -U 444 ; WX 754 ; N uni01BC ; G 382 -U 445 ; WX 568 ; N uni01BD ; G 383 -U 446 ; WX 536 ; N uni01BE ; G 384 -U 447 ; WX 716 ; N uni01BF ; G 385 -U 448 ; WX 295 ; N uni01C0 ; G 386 -U 449 ; WX 492 ; N uni01C1 ; G 387 -U 450 ; WX 459 ; N uni01C2 ; G 388 -U 451 ; WX 295 ; N uni01C3 ; G 389 -U 452 ; WX 1597 ; N uni01C4 ; G 390 -U 453 ; WX 1435 ; N uni01C5 ; G 391 -U 454 ; WX 1267 ; N uni01C6 ; G 392 -U 455 ; WX 1176 ; N uni01C7 ; G 393 -U 456 ; WX 1065 ; N uni01C8 ; G 394 -U 457 ; WX 742 ; N uni01C9 ; G 395 -U 458 ; WX 1387 ; N uni01CA ; G 396 -U 459 ; WX 1276 ; N uni01CB ; G 397 -U 460 ; WX 1089 ; N uni01CC ; G 398 -U 461 ; WX 776 ; N uni01CD ; G 399 -U 462 ; WX 648 ; N uni01CE ; G 400 -U 463 ; WX 468 ; N uni01CF ; G 401 -U 464 ; WX 380 ; N uni01D0 ; G 402 -U 465 ; WX 871 ; N uni01D1 ; G 403 -U 466 ; WX 667 ; N uni01D2 ; G 404 -U 467 ; WX 872 ; N uni01D3 ; G 405 -U 468 ; WX 727 ; N uni01D4 ; G 406 -U 469 ; WX 872 ; N uni01D5 ; G 407 -U 470 ; WX 727 ; N uni01D6 ; G 408 -U 471 ; WX 872 ; N uni01D7 ; G 409 -U 472 ; WX 727 ; N uni01D8 ; G 410 -U 473 ; WX 872 ; N uni01D9 ; G 411 -U 474 ; WX 727 ; N uni01DA ; G 412 -U 475 ; WX 872 ; N uni01DB ; G 413 -U 476 ; WX 727 ; N uni01DC ; G 414 -U 477 ; WX 636 ; N uni01DD ; G 415 -U 478 ; WX 776 ; N uni01DE ; G 416 -U 479 ; WX 648 ; N uni01DF ; G 417 -U 480 ; WX 776 ; N uni01E0 ; G 418 -U 481 ; WX 648 ; N uni01E1 ; G 419 -U 482 ; WX 1034 ; N uni01E2 ; G 420 -U 483 ; WX 975 ; N uni01E3 ; G 421 -U 484 ; WX 896 ; N uni01E4 ; G 422 -U 485 ; WX 699 ; N uni01E5 ; G 423 -U 486 ; WX 854 ; N Gcaron ; G 424 -U 487 ; WX 699 ; N gcaron ; G 425 -U 488 ; WX 869 ; N uni01E8 ; G 426 -U 489 ; WX 693 ; N uni01E9 ; G 427 -U 490 ; WX 871 ; N uni01EA ; G 428 -U 491 ; WX 667 ; N uni01EB ; G 429 -U 492 ; WX 871 ; N uni01EC ; G 430 -U 493 ; WX 667 ; N uni01ED ; G 431 -U 494 ; WX 657 ; N uni01EE ; G 432 -U 495 ; WX 568 ; N uni01EF ; G 433 -U 496 ; WX 362 ; N uni01F0 ; G 434 -U 497 ; WX 1597 ; N uni01F1 ; G 435 -U 498 ; WX 1435 ; N uni01F2 ; G 436 -U 499 ; WX 1267 ; N uni01F3 ; G 437 -U 500 ; WX 854 ; N uni01F4 ; G 438 -U 501 ; WX 699 ; N uni01F5 ; G 439 -U 502 ; WX 1221 ; N uni01F6 ; G 440 -U 503 ; WX 787 ; N uni01F7 ; G 441 -U 504 ; WX 914 ; N uni01F8 ; G 442 -U 505 ; WX 727 ; N uni01F9 ; G 443 -U 506 ; WX 776 ; N Aringacute ; G 444 -U 507 ; WX 648 ; N aringacute ; G 445 -U 508 ; WX 1034 ; N AEacute ; G 446 -U 509 ; WX 932 ; N aeacute ; G 447 -U 510 ; WX 871 ; N Oslashacute ; G 448 -U 511 ; WX 667 ; N oslashacute ; G 449 -U 512 ; WX 776 ; N uni0200 ; G 450 -U 513 ; WX 648 ; N uni0201 ; G 451 -U 514 ; WX 776 ; N uni0202 ; G 452 -U 515 ; WX 648 ; N uni0203 ; G 453 -U 516 ; WX 762 ; N uni0204 ; G 454 -U 517 ; WX 636 ; N uni0205 ; G 455 -U 518 ; WX 762 ; N uni0206 ; G 456 -U 519 ; WX 636 ; N uni0207 ; G 457 -U 520 ; WX 468 ; N uni0208 ; G 458 -U 521 ; WX 380 ; N uni0209 ; G 459 -U 522 ; WX 468 ; N uni020A ; G 460 -U 523 ; WX 380 ; N uni020B ; G 461 -U 524 ; WX 871 ; N uni020C ; G 462 -U 525 ; WX 667 ; N uni020D ; G 463 -U 526 ; WX 871 ; N uni020E ; G 464 -U 527 ; WX 667 ; N uni020F ; G 465 -U 528 ; WX 831 ; N uni0210 ; G 466 -U 529 ; WX 527 ; N uni0211 ; G 467 -U 530 ; WX 831 ; N uni0212 ; G 468 -U 531 ; WX 527 ; N uni0213 ; G 469 -U 532 ; WX 872 ; N uni0214 ; G 470 -U 533 ; WX 727 ; N uni0215 ; G 471 -U 534 ; WX 872 ; N uni0216 ; G 472 -U 535 ; WX 727 ; N uni0217 ; G 473 -U 536 ; WX 722 ; N Scommaaccent ; G 474 -U 537 ; WX 563 ; N scommaaccent ; G 475 -U 538 ; WX 744 ; N uni021A ; G 476 -U 539 ; WX 462 ; N uni021B ; G 477 -U 540 ; WX 690 ; N uni021C ; G 478 -U 541 ; WX 607 ; N uni021D ; G 479 -U 542 ; WX 945 ; N uni021E ; G 480 -U 543 ; WX 727 ; N uni021F ; G 481 -U 544 ; WX 872 ; N uni0220 ; G 482 -U 545 ; WX 791 ; N uni0221 ; G 483 -U 546 ; WX 703 ; N uni0222 ; G 484 -U 547 ; WX 616 ; N uni0223 ; G 485 -U 548 ; WX 730 ; N uni0224 ; G 486 -U 549 ; WX 568 ; N uni0225 ; G 487 -U 550 ; WX 776 ; N uni0226 ; G 488 -U 551 ; WX 648 ; N uni0227 ; G 489 -U 552 ; WX 762 ; N uni0228 ; G 490 -U 553 ; WX 636 ; N uni0229 ; G 491 -U 554 ; WX 871 ; N uni022A ; G 492 -U 555 ; WX 667 ; N uni022B ; G 493 -U 556 ; WX 871 ; N uni022C ; G 494 -U 557 ; WX 667 ; N uni022D ; G 495 -U 558 ; WX 871 ; N uni022E ; G 496 -U 559 ; WX 667 ; N uni022F ; G 497 -U 560 ; WX 871 ; N uni0230 ; G 498 -U 561 ; WX 667 ; N uni0231 ; G 499 -U 562 ; WX 714 ; N uni0232 ; G 500 -U 563 ; WX 581 ; N uni0233 ; G 501 -U 564 ; WX 573 ; N uni0234 ; G 502 -U 565 ; WX 922 ; N uni0235 ; G 503 -U 566 ; WX 564 ; N uni0236 ; G 504 -U 567 ; WX 362 ; N dotlessj ; G 505 -U 568 ; WX 1031 ; N uni0238 ; G 506 -U 569 ; WX 1031 ; N uni0239 ; G 507 -U 570 ; WX 776 ; N uni023A ; G 508 -U 571 ; WX 796 ; N uni023B ; G 509 -U 572 ; WX 609 ; N uni023C ; G 510 -U 573 ; WX 703 ; N uni023D ; G 511 -U 574 ; WX 744 ; N uni023E ; G 512 -U 575 ; WX 563 ; N uni023F ; G 513 -U 576 ; WX 568 ; N uni0240 ; G 514 -U 577 ; WX 660 ; N uni0241 ; G 515 -U 578 ; WX 547 ; N uni0242 ; G 516 -U 579 ; WX 845 ; N uni0243 ; G 517 -U 580 ; WX 872 ; N uni0244 ; G 518 -U 581 ; WX 776 ; N uni0245 ; G 519 -U 582 ; WX 762 ; N uni0246 ; G 520 -U 583 ; WX 636 ; N uni0247 ; G 521 -U 584 ; WX 473 ; N uni0248 ; G 522 -U 585 ; WX 387 ; N uni0249 ; G 523 -U 586 ; WX 848 ; N uni024A ; G 524 -U 587 ; WX 699 ; N uni024B ; G 525 -U 588 ; WX 831 ; N uni024C ; G 526 -U 589 ; WX 527 ; N uni024D ; G 527 -U 590 ; WX 714 ; N uni024E ; G 528 -U 591 ; WX 581 ; N uni024F ; G 529 -U 592 ; WX 648 ; N uni0250 ; G 530 -U 593 ; WX 770 ; N uni0251 ; G 531 -U 594 ; WX 770 ; N uni0252 ; G 532 -U 595 ; WX 699 ; N uni0253 ; G 533 -U 596 ; WX 609 ; N uni0254 ; G 534 -U 597 ; WX 609 ; N uni0255 ; G 535 -U 598 ; WX 699 ; N uni0256 ; G 536 -U 599 ; WX 730 ; N uni0257 ; G 537 -U 600 ; WX 636 ; N uni0258 ; G 538 -U 601 ; WX 636 ; N uni0259 ; G 539 -U 602 ; WX 907 ; N uni025A ; G 540 -U 603 ; WX 608 ; N uni025B ; G 541 -U 604 ; WX 562 ; N uni025C ; G 542 -U 605 ; WX 907 ; N uni025D ; G 543 -U 606 ; WX 714 ; N uni025E ; G 544 -U 607 ; WX 387 ; N uni025F ; G 545 -U 608 ; WX 699 ; N uni0260 ; G 546 -U 609 ; WX 699 ; N uni0261 ; G 547 -U 610 ; WX 638 ; N uni0262 ; G 548 -U 611 ; WX 601 ; N uni0263 ; G 549 -U 612 ; WX 627 ; N uni0264 ; G 550 -U 613 ; WX 727 ; N uni0265 ; G 551 -U 614 ; WX 727 ; N uni0266 ; G 552 -U 615 ; WX 727 ; N uni0267 ; G 553 -U 616 ; WX 380 ; N uni0268 ; G 554 -U 617 ; WX 380 ; N uni0269 ; G 555 -U 618 ; WX 380 ; N uni026A ; G 556 -U 619 ; WX 409 ; N uni026B ; G 557 -U 620 ; WX 514 ; N uni026C ; G 558 -U 621 ; WX 380 ; N uni026D ; G 559 -U 622 ; WX 795 ; N uni026E ; G 560 -U 623 ; WX 1058 ; N uni026F ; G 561 -U 624 ; WX 1058 ; N uni0270 ; G 562 -U 625 ; WX 1058 ; N uni0271 ; G 563 -U 626 ; WX 727 ; N uni0272 ; G 564 -U 627 ; WX 727 ; N uni0273 ; G 565 -U 628 ; WX 712 ; N uni0274 ; G 566 -U 629 ; WX 667 ; N uni0275 ; G 567 -U 630 ; WX 1061 ; N uni0276 ; G 568 -U 631 ; WX 944 ; N uni0277 ; G 569 -U 632 ; WX 797 ; N uni0278 ; G 570 -U 633 ; WX 571 ; N uni0279 ; G 571 -U 634 ; WX 571 ; N uni027A ; G 572 -U 635 ; WX 571 ; N uni027B ; G 573 -U 636 ; WX 527 ; N uni027C ; G 574 -U 637 ; WX 527 ; N uni027D ; G 575 -U 638 ; WX 452 ; N uni027E ; G 576 -U 639 ; WX 487 ; N uni027F ; G 577 -U 640 ; WX 694 ; N uni0280 ; G 578 -U 641 ; WX 694 ; N uni0281 ; G 579 -U 642 ; WX 563 ; N uni0282 ; G 580 -U 643 ; WX 331 ; N uni0283 ; G 581 -U 644 ; WX 430 ; N uni0284 ; G 582 -U 645 ; WX 540 ; N uni0285 ; G 583 -U 646 ; WX 331 ; N uni0286 ; G 584 -U 647 ; WX 492 ; N uni0287 ; G 585 -U 648 ; WX 462 ; N uni0288 ; G 586 -U 649 ; WX 727 ; N uni0289 ; G 587 -U 650 ; WX 679 ; N uni028A ; G 588 -U 651 ; WX 694 ; N uni028B ; G 589 -U 652 ; WX 581 ; N uni028C ; G 590 -U 653 ; WX 861 ; N uni028D ; G 591 -U 654 ; WX 635 ; N uni028E ; G 592 -U 655 ; WX 727 ; N uni028F ; G 593 -U 656 ; WX 568 ; N uni0290 ; G 594 -U 657 ; WX 568 ; N uni0291 ; G 595 -U 658 ; WX 568 ; N uni0292 ; G 596 -U 659 ; WX 568 ; N uni0293 ; G 597 -U 660 ; WX 551 ; N uni0294 ; G 598 -U 661 ; WX 551 ; N uni0295 ; G 599 -U 662 ; WX 551 ; N uni0296 ; G 600 -U 663 ; WX 545 ; N uni0297 ; G 601 -U 664 ; WX 871 ; N uni0298 ; G 602 -U 665 ; WX 695 ; N uni0299 ; G 603 -U 666 ; WX 714 ; N uni029A ; G 604 -U 667 ; WX 689 ; N uni029B ; G 605 -U 668 ; WX 732 ; N uni029C ; G 606 -U 669 ; WX 384 ; N uni029D ; G 607 -U 670 ; WX 740 ; N uni029E ; G 608 -U 671 ; WX 617 ; N uni029F ; G 609 -U 672 ; WX 699 ; N uni02A0 ; G 610 -U 673 ; WX 551 ; N uni02A1 ; G 611 -U 674 ; WX 551 ; N uni02A2 ; G 612 -U 675 ; WX 1117 ; N uni02A3 ; G 613 -U 676 ; WX 1179 ; N uni02A4 ; G 614 -U 677 ; WX 1117 ; N uni02A5 ; G 615 -U 678 ; WX 938 ; N uni02A6 ; G 616 -U 679 ; WX 715 ; N uni02A7 ; G 617 -U 680 ; WX 946 ; N uni02A8 ; G 618 -U 681 ; WX 1039 ; N uni02A9 ; G 619 -U 682 ; WX 870 ; N uni02AA ; G 620 -U 683 ; WX 795 ; N uni02AB ; G 621 -U 684 ; WX 662 ; N uni02AC ; G 622 -U 685 ; WX 443 ; N uni02AD ; G 623 -U 686 ; WX 613 ; N uni02AE ; G 624 -U 687 ; WX 717 ; N uni02AF ; G 625 -U 688 ; WX 521 ; N uni02B0 ; G 626 -U 689 ; WX 519 ; N uni02B1 ; G 627 -U 690 ; WX 313 ; N uni02B2 ; G 628 -U 691 ; WX 414 ; N uni02B3 ; G 629 -U 692 ; WX 414 ; N uni02B4 ; G 630 -U 693 ; WX 480 ; N uni02B5 ; G 631 -U 694 ; WX 527 ; N uni02B6 ; G 632 -U 695 ; WX 542 ; N uni02B7 ; G 633 -U 696 ; WX 366 ; N uni02B8 ; G 634 -U 697 ; WX 302 ; N uni02B9 ; G 635 -U 698 ; WX 521 ; N uni02BA ; G 636 -U 699 ; WX 348 ; N uni02BB ; G 637 -U 700 ; WX 348 ; N uni02BC ; G 638 -U 701 ; WX 348 ; N uni02BD ; G 639 -U 702 ; WX 366 ; N uni02BE ; G 640 -U 703 ; WX 366 ; N uni02BF ; G 641 -U 704 ; WX 313 ; N uni02C0 ; G 642 -U 705 ; WX 313 ; N uni02C1 ; G 643 -U 706 ; WX 500 ; N uni02C2 ; G 644 -U 707 ; WX 500 ; N uni02C3 ; G 645 -U 708 ; WX 500 ; N uni02C4 ; G 646 -U 709 ; WX 500 ; N uni02C5 ; G 647 -U 710 ; WX 500 ; N circumflex ; G 648 -U 711 ; WX 500 ; N caron ; G 649 -U 712 ; WX 282 ; N uni02C8 ; G 650 -U 713 ; WX 500 ; N uni02C9 ; G 651 -U 714 ; WX 500 ; N uni02CA ; G 652 -U 715 ; WX 500 ; N uni02CB ; G 653 -U 716 ; WX 282 ; N uni02CC ; G 654 -U 717 ; WX 500 ; N uni02CD ; G 655 -U 720 ; WX 369 ; N uni02D0 ; G 656 -U 721 ; WX 369 ; N uni02D1 ; G 657 -U 722 ; WX 366 ; N uni02D2 ; G 658 -U 723 ; WX 366 ; N uni02D3 ; G 659 -U 726 ; WX 392 ; N uni02D6 ; G 660 -U 727 ; WX 392 ; N uni02D7 ; G 661 -U 728 ; WX 500 ; N breve ; G 662 -U 729 ; WX 500 ; N dotaccent ; G 663 -U 730 ; WX 500 ; N ring ; G 664 -U 731 ; WX 500 ; N ogonek ; G 665 -U 732 ; WX 500 ; N tilde ; G 666 -U 733 ; WX 500 ; N hungarumlaut ; G 667 -U 734 ; WX 417 ; N uni02DE ; G 668 -U 736 ; WX 378 ; N uni02E0 ; G 669 -U 737 ; WX 292 ; N uni02E1 ; G 670 -U 738 ; WX 395 ; N uni02E2 ; G 671 -U 739 ; WX 375 ; N uni02E3 ; G 672 -U 740 ; WX 313 ; N uni02E4 ; G 673 -U 741 ; WX 500 ; N uni02E5 ; G 674 -U 742 ; WX 500 ; N uni02E6 ; G 675 -U 743 ; WX 500 ; N uni02E7 ; G 676 -U 744 ; WX 500 ; N uni02E8 ; G 677 -U 745 ; WX 500 ; N uni02E9 ; G 678 -U 748 ; WX 500 ; N uni02EC ; G 679 -U 750 ; WX 553 ; N uni02EE ; G 680 -U 751 ; WX 500 ; N uni02EF ; G 681 -U 752 ; WX 500 ; N uni02F0 ; G 682 -U 755 ; WX 500 ; N uni02F3 ; G 683 -U 759 ; WX 500 ; N uni02F7 ; G 684 -U 768 ; WX 0 ; N gravecomb ; G 685 -U 769 ; WX 0 ; N acutecomb ; G 686 -U 770 ; WX 0 ; N uni0302 ; G 687 -U 771 ; WX 0 ; N tildecomb ; G 688 -U 772 ; WX 0 ; N uni0304 ; G 689 -U 773 ; WX 0 ; N uni0305 ; G 690 -U 774 ; WX 0 ; N uni0306 ; G 691 -U 775 ; WX 0 ; N uni0307 ; G 692 -U 776 ; WX 0 ; N uni0308 ; G 693 -U 777 ; WX 0 ; N hookabovecomb ; G 694 -U 778 ; WX 0 ; N uni030A ; G 695 -U 779 ; WX 0 ; N uni030B ; G 696 -U 780 ; WX 0 ; N uni030C ; G 697 -U 781 ; WX 0 ; N uni030D ; G 698 -U 782 ; WX 0 ; N uni030E ; G 699 -U 783 ; WX 0 ; N uni030F ; G 700 -U 784 ; WX 0 ; N uni0310 ; G 701 -U 785 ; WX 0 ; N uni0311 ; G 702 -U 786 ; WX 0 ; N uni0312 ; G 703 -U 787 ; WX 0 ; N uni0313 ; G 704 -U 788 ; WX 0 ; N uni0314 ; G 705 -U 789 ; WX 0 ; N uni0315 ; G 706 -U 790 ; WX 0 ; N uni0316 ; G 707 -U 791 ; WX 0 ; N uni0317 ; G 708 -U 792 ; WX 0 ; N uni0318 ; G 709 -U 793 ; WX 0 ; N uni0319 ; G 710 -U 794 ; WX 0 ; N uni031A ; G 711 -U 795 ; WX 0 ; N uni031B ; G 712 -U 796 ; WX 0 ; N uni031C ; G 713 -U 797 ; WX 0 ; N uni031D ; G 714 -U 798 ; WX 0 ; N uni031E ; G 715 -U 799 ; WX 0 ; N uni031F ; G 716 -U 800 ; WX 0 ; N uni0320 ; G 717 -U 801 ; WX 0 ; N uni0321 ; G 718 -U 802 ; WX 0 ; N uni0322 ; G 719 -U 803 ; WX 0 ; N dotbelowcomb ; G 720 -U 804 ; WX 0 ; N uni0324 ; G 721 -U 805 ; WX 0 ; N uni0325 ; G 722 -U 806 ; WX 0 ; N uni0326 ; G 723 -U 807 ; WX 0 ; N uni0327 ; G 724 -U 808 ; WX 0 ; N uni0328 ; G 725 -U 809 ; WX 0 ; N uni0329 ; G 726 -U 810 ; WX 0 ; N uni032A ; G 727 -U 811 ; WX 0 ; N uni032B ; G 728 -U 812 ; WX 0 ; N uni032C ; G 729 -U 813 ; WX 0 ; N uni032D ; G 730 -U 814 ; WX 0 ; N uni032E ; G 731 -U 815 ; WX 0 ; N uni032F ; G 732 -U 816 ; WX 0 ; N uni0330 ; G 733 -U 817 ; WX 0 ; N uni0331 ; G 734 -U 818 ; WX 0 ; N uni0332 ; G 735 -U 819 ; WX 0 ; N uni0333 ; G 736 -U 820 ; WX 0 ; N uni0334 ; G 737 -U 821 ; WX 0 ; N uni0335 ; G 738 -U 822 ; WX 0 ; N uni0336 ; G 739 -U 823 ; WX 0 ; N uni0337 ; G 740 -U 824 ; WX 0 ; N uni0338 ; G 741 -U 825 ; WX 0 ; N uni0339 ; G 742 -U 826 ; WX 0 ; N uni033A ; G 743 -U 827 ; WX 0 ; N uni033B ; G 744 -U 828 ; WX 0 ; N uni033C ; G 745 -U 829 ; WX 0 ; N uni033D ; G 746 -U 830 ; WX 0 ; N uni033E ; G 747 -U 831 ; WX 0 ; N uni033F ; G 748 -U 835 ; WX 0 ; N uni0343 ; G 749 -U 847 ; WX 0 ; N uni034F ; G 750 -U 856 ; WX 0 ; N uni0358 ; G 751 -U 864 ; WX 0 ; N uni0360 ; G 752 -U 865 ; WX 0 ; N uni0361 ; G 753 -U 880 ; WX 779 ; N uni0370 ; G 754 -U 881 ; WX 576 ; N uni0371 ; G 755 -U 882 ; WX 803 ; N uni0372 ; G 756 -U 883 ; WX 777 ; N uni0373 ; G 757 -U 884 ; WX 302 ; N uni0374 ; G 758 -U 885 ; WX 302 ; N uni0375 ; G 759 -U 886 ; WX 963 ; N uni0376 ; G 760 -U 887 ; WX 737 ; N uni0377 ; G 761 -U 890 ; WX 500 ; N uni037A ; G 762 -U 891 ; WX 609 ; N uni037B ; G 763 -U 892 ; WX 609 ; N uni037C ; G 764 -U 893 ; WX 609 ; N uni037D ; G 765 -U 894 ; WX 369 ; N uni037E ; G 766 -U 895 ; WX 473 ; N uni037F ; G 767 -U 900 ; WX 500 ; N tonos ; G 768 -U 901 ; WX 500 ; N dieresistonos ; G 769 -U 902 ; WX 776 ; N Alphatonos ; G 770 -U 903 ; WX 348 ; N anoteleia ; G 771 -U 904 ; WX 947 ; N Epsilontonos ; G 772 -U 905 ; WX 1136 ; N Etatonos ; G 773 -U 906 ; WX 662 ; N Iotatonos ; G 774 -U 908 ; WX 887 ; N Omicrontonos ; G 775 -U 910 ; WX 953 ; N Upsilontonos ; G 776 -U 911 ; WX 911 ; N Omegatonos ; G 777 -U 912 ; WX 484 ; N iotadieresistonos ; G 778 -U 913 ; WX 776 ; N Alpha ; G 779 -U 914 ; WX 845 ; N Beta ; G 780 -U 915 ; WX 710 ; N Gamma ; G 781 -U 916 ; WX 776 ; N uni0394 ; G 782 -U 917 ; WX 762 ; N Epsilon ; G 783 -U 918 ; WX 730 ; N Zeta ; G 784 -U 919 ; WX 945 ; N Eta ; G 785 -U 920 ; WX 871 ; N Theta ; G 786 -U 921 ; WX 468 ; N Iota ; G 787 -U 922 ; WX 869 ; N Kappa ; G 788 -U 923 ; WX 776 ; N Lambda ; G 789 -U 924 ; WX 1107 ; N Mu ; G 790 -U 925 ; WX 914 ; N Nu ; G 791 -U 926 ; WX 704 ; N Xi ; G 792 -U 927 ; WX 871 ; N Omicron ; G 793 -U 928 ; WX 945 ; N Pi ; G 794 -U 929 ; WX 752 ; N Rho ; G 795 -U 931 ; WX 707 ; N Sigma ; G 796 -U 932 ; WX 744 ; N Tau ; G 797 -U 933 ; WX 714 ; N Upsilon ; G 798 -U 934 ; WX 871 ; N Phi ; G 799 -U 935 ; WX 776 ; N Chi ; G 800 -U 936 ; WX 913 ; N Psi ; G 801 -U 937 ; WX 890 ; N Omega ; G 802 -U 938 ; WX 468 ; N Iotadieresis ; G 803 -U 939 ; WX 714 ; N Upsilondieresis ; G 804 -U 940 ; WX 770 ; N alphatonos ; G 805 -U 941 ; WX 608 ; N epsilontonos ; G 806 -U 942 ; WX 727 ; N etatonos ; G 807 -U 943 ; WX 484 ; N iotatonos ; G 808 -U 944 ; WX 694 ; N upsilondieresistonos ; G 809 -U 945 ; WX 770 ; N alpha ; G 810 -U 946 ; WX 664 ; N beta ; G 811 -U 947 ; WX 660 ; N gamma ; G 812 -U 948 ; WX 667 ; N delta ; G 813 -U 949 ; WX 608 ; N epsilon ; G 814 -U 950 ; WX 592 ; N zeta ; G 815 -U 951 ; WX 727 ; N eta ; G 816 -U 952 ; WX 667 ; N theta ; G 817 -U 953 ; WX 484 ; N iota ; G 818 -U 954 ; WX 750 ; N kappa ; G 819 -U 955 ; WX 701 ; N lambda ; G 820 -U 956 ; WX 732 ; N uni03BC ; G 821 -U 957 ; WX 694 ; N nu ; G 822 -U 958 ; WX 592 ; N xi ; G 823 -U 959 ; WX 667 ; N omicron ; G 824 -U 960 ; WX 732 ; N pi ; G 825 -U 961 ; WX 665 ; N rho ; G 826 -U 962 ; WX 609 ; N sigma1 ; G 827 -U 963 ; WX 737 ; N sigma ; G 828 -U 964 ; WX 673 ; N tau ; G 829 -U 965 ; WX 694 ; N upsilon ; G 830 -U 966 ; WX 905 ; N phi ; G 831 -U 967 ; WX 658 ; N chi ; G 832 -U 968 ; WX 941 ; N psi ; G 833 -U 969 ; WX 952 ; N omega ; G 834 -U 970 ; WX 484 ; N iotadieresis ; G 835 -U 971 ; WX 694 ; N upsilondieresis ; G 836 -U 972 ; WX 667 ; N omicrontonos ; G 837 -U 973 ; WX 694 ; N upsilontonos ; G 838 -U 974 ; WX 952 ; N omegatonos ; G 839 -U 975 ; WX 869 ; N uni03CF ; G 840 -U 976 ; WX 667 ; N uni03D0 ; G 841 -U 977 ; WX 849 ; N theta1 ; G 842 -U 978 ; WX 764 ; N Upsilon1 ; G 843 -U 979 ; WX 969 ; N uni03D3 ; G 844 -U 980 ; WX 764 ; N uni03D4 ; G 845 -U 981 ; WX 941 ; N phi1 ; G 846 -U 982 ; WX 952 ; N omega1 ; G 847 -U 983 ; WX 655 ; N uni03D7 ; G 848 -U 984 ; WX 871 ; N uni03D8 ; G 849 -U 985 ; WX 667 ; N uni03D9 ; G 850 -U 986 ; WX 796 ; N uni03DA ; G 851 -U 987 ; WX 609 ; N uni03DB ; G 852 -U 988 ; WX 710 ; N uni03DC ; G 853 -U 989 ; WX 527 ; N uni03DD ; G 854 -U 990 ; WX 590 ; N uni03DE ; G 855 -U 991 ; WX 660 ; N uni03DF ; G 856 -U 992 ; WX 796 ; N uni03E0 ; G 857 -U 993 ; WX 667 ; N uni03E1 ; G 858 -U 1008 ; WX 655 ; N uni03F0 ; G 859 -U 1009 ; WX 665 ; N uni03F1 ; G 860 -U 1010 ; WX 609 ; N uni03F2 ; G 861 -U 1011 ; WX 362 ; N uni03F3 ; G 862 -U 1012 ; WX 871 ; N uni03F4 ; G 863 -U 1013 ; WX 609 ; N uni03F5 ; G 864 -U 1014 ; WX 609 ; N uni03F6 ; G 865 -U 1015 ; WX 757 ; N uni03F7 ; G 866 -U 1016 ; WX 699 ; N uni03F8 ; G 867 -U 1017 ; WX 796 ; N uni03F9 ; G 868 -U 1018 ; WX 1107 ; N uni03FA ; G 869 -U 1019 ; WX 860 ; N uni03FB ; G 870 -U 1020 ; WX 692 ; N uni03FC ; G 871 -U 1021 ; WX 796 ; N uni03FD ; G 872 -U 1022 ; WX 796 ; N uni03FE ; G 873 -U 1023 ; WX 796 ; N uni03FF ; G 874 -U 1024 ; WX 762 ; N uni0400 ; G 875 -U 1025 ; WX 762 ; N uni0401 ; G 876 -U 1026 ; WX 901 ; N uni0402 ; G 877 -U 1027 ; WX 690 ; N uni0403 ; G 878 -U 1028 ; WX 795 ; N uni0404 ; G 879 -U 1029 ; WX 722 ; N uni0405 ; G 880 -U 1030 ; WX 468 ; N uni0406 ; G 881 -U 1031 ; WX 468 ; N uni0407 ; G 882 -U 1032 ; WX 473 ; N uni0408 ; G 883 -U 1033 ; WX 1202 ; N uni0409 ; G 884 -U 1034 ; WX 1262 ; N uni040A ; G 885 -U 1035 ; WX 963 ; N uni040B ; G 886 -U 1036 ; WX 910 ; N uni040C ; G 887 -U 1037 ; WX 945 ; N uni040D ; G 888 -U 1038 ; WX 812 ; N uni040E ; G 889 -U 1039 ; WX 945 ; N uni040F ; G 890 -U 1040 ; WX 814 ; N uni0410 ; G 891 -U 1041 ; WX 854 ; N uni0411 ; G 892 -U 1042 ; WX 845 ; N uni0412 ; G 893 -U 1043 ; WX 690 ; N uni0413 ; G 894 -U 1044 ; WX 889 ; N uni0414 ; G 895 -U 1045 ; WX 762 ; N uni0415 ; G 896 -U 1046 ; WX 1312 ; N uni0416 ; G 897 -U 1047 ; WX 721 ; N uni0417 ; G 898 -U 1048 ; WX 945 ; N uni0418 ; G 899 -U 1049 ; WX 945 ; N uni0419 ; G 900 -U 1050 ; WX 910 ; N uni041A ; G 901 -U 1051 ; WX 884 ; N uni041B ; G 902 -U 1052 ; WX 1107 ; N uni041C ; G 903 -U 1053 ; WX 945 ; N uni041D ; G 904 -U 1054 ; WX 871 ; N uni041E ; G 905 -U 1055 ; WX 945 ; N uni041F ; G 906 -U 1056 ; WX 752 ; N uni0420 ; G 907 -U 1057 ; WX 796 ; N uni0421 ; G 908 -U 1058 ; WX 744 ; N uni0422 ; G 909 -U 1059 ; WX 812 ; N uni0423 ; G 910 -U 1060 ; WX 949 ; N uni0424 ; G 911 -U 1061 ; WX 776 ; N uni0425 ; G 912 -U 1062 ; WX 966 ; N uni0426 ; G 913 -U 1063 ; WX 913 ; N uni0427 ; G 914 -U 1064 ; WX 1268 ; N uni0428 ; G 915 -U 1065 ; WX 1293 ; N uni0429 ; G 916 -U 1066 ; WX 957 ; N uni042A ; G 917 -U 1067 ; WX 1202 ; N uni042B ; G 918 -U 1068 ; WX 825 ; N uni042C ; G 919 -U 1069 ; WX 795 ; N uni042D ; G 920 -U 1070 ; WX 1287 ; N uni042E ; G 921 -U 1071 ; WX 882 ; N uni042F ; G 922 -U 1072 ; WX 648 ; N uni0430 ; G 923 -U 1073 ; WX 722 ; N uni0431 ; G 924 -U 1074 ; WX 657 ; N uni0432 ; G 925 -U 1075 ; WX 563 ; N uni0433 ; G 926 -U 1076 ; WX 695 ; N uni0434 ; G 927 -U 1077 ; WX 636 ; N uni0435 ; G 928 -U 1078 ; WX 1306 ; N uni0436 ; G 929 -U 1079 ; WX 638 ; N uni0437 ; G 930 -U 1080 ; WX 727 ; N uni0438 ; G 931 -U 1081 ; WX 727 ; N uni0439 ; G 932 -U 1082 ; WX 677 ; N uni043A ; G 933 -U 1083 ; WX 732 ; N uni043B ; G 934 -U 1084 ; WX 951 ; N uni043C ; G 935 -U 1085 ; WX 729 ; N uni043D ; G 936 -U 1086 ; WX 667 ; N uni043E ; G 937 -U 1087 ; WX 727 ; N uni043F ; G 938 -U 1088 ; WX 699 ; N uni0440 ; G 939 -U 1089 ; WX 609 ; N uni0441 ; G 940 -U 1090 ; WX 1058 ; N uni0442 ; G 941 -U 1091 ; WX 598 ; N uni0443 ; G 942 -U 1092 ; WX 902 ; N uni0444 ; G 943 -U 1093 ; WX 596 ; N uni0445 ; G 944 -U 1094 ; WX 803 ; N uni0446 ; G 945 -U 1095 ; WX 715 ; N uni0447 ; G 946 -U 1096 ; WX 1058 ; N uni0448 ; G 947 -U 1097 ; WX 1134 ; N uni0449 ; G 948 -U 1098 ; WX 727 ; N uni044A ; G 949 -U 1099 ; WX 1018 ; N uni044B ; G 950 -U 1100 ; WX 660 ; N uni044C ; G 951 -U 1101 ; WX 645 ; N uni044D ; G 952 -U 1102 ; WX 1001 ; N uni044E ; G 953 -U 1103 ; WX 796 ; N uni044F ; G 954 -U 1104 ; WX 636 ; N uni0450 ; G 955 -U 1105 ; WX 636 ; N uni0451 ; G 956 -U 1106 ; WX 719 ; N uni0452 ; G 957 -U 1107 ; WX 563 ; N uni0453 ; G 958 -U 1108 ; WX 609 ; N uni0454 ; G 959 -U 1109 ; WX 563 ; N uni0455 ; G 960 -U 1110 ; WX 380 ; N uni0456 ; G 961 -U 1111 ; WX 380 ; N uni0457 ; G 962 -U 1112 ; WX 362 ; N uni0458 ; G 963 -U 1113 ; WX 1014 ; N uni0459 ; G 964 -U 1114 ; WX 1011 ; N uni045A ; G 965 -U 1115 ; WX 727 ; N uni045B ; G 966 -U 1116 ; WX 677 ; N uni045C ; G 967 -U 1117 ; WX 727 ; N uni045D ; G 968 -U 1118 ; WX 598 ; N uni045E ; G 969 -U 1119 ; WX 727 ; N uni045F ; G 970 -U 1122 ; WX 880 ; N uni0462 ; G 971 -U 1123 ; WX 1050 ; N uni0463 ; G 972 -U 1124 ; WX 1195 ; N uni0464 ; G 973 -U 1125 ; WX 963 ; N uni0465 ; G 974 -U 1130 ; WX 1312 ; N uni046A ; G 975 -U 1131 ; WX 1010 ; N uni046B ; G 976 -U 1132 ; WX 1630 ; N uni046C ; G 977 -U 1133 ; WX 1247 ; N uni046D ; G 978 -U 1136 ; WX 1096 ; N uni0470 ; G 979 -U 1137 ; WX 1105 ; N uni0471 ; G 980 -U 1138 ; WX 871 ; N uni0472 ; G 981 -U 1139 ; WX 652 ; N uni0473 ; G 982 -U 1140 ; WX 916 ; N uni0474 ; G 983 -U 1141 ; WX 749 ; N uni0475 ; G 984 -U 1142 ; WX 916 ; N uni0476 ; G 985 -U 1143 ; WX 749 ; N uni0477 ; G 986 -U 1164 ; WX 846 ; N uni048C ; G 987 -U 1165 ; WX 673 ; N uni048D ; G 988 -U 1168 ; WX 700 ; N uni0490 ; G 989 -U 1169 ; WX 618 ; N uni0491 ; G 990 -U 1170 ; WX 690 ; N uni0492 ; G 991 -U 1171 ; WX 563 ; N uni0493 ; G 992 -U 1172 ; WX 854 ; N uni0494 ; G 993 -U 1173 ; WX 705 ; N uni0495 ; G 994 -U 1174 ; WX 1312 ; N uni0496 ; G 995 -U 1175 ; WX 1306 ; N uni0497 ; G 996 -U 1176 ; WX 721 ; N uni0498 ; G 997 -U 1177 ; WX 638 ; N uni0499 ; G 998 -U 1178 ; WX 902 ; N uni049A ; G 999 -U 1179 ; WX 703 ; N uni049B ; G 1000 -U 1182 ; WX 910 ; N uni049E ; G 1001 -U 1183 ; WX 677 ; N uni049F ; G 1002 -U 1184 ; WX 1041 ; N uni04A0 ; G 1003 -U 1185 ; WX 760 ; N uni04A1 ; G 1004 -U 1186 ; WX 952 ; N uni04A2 ; G 1005 -U 1187 ; WX 805 ; N uni04A3 ; G 1006 -U 1188 ; WX 1167 ; N uni04A4 ; G 1007 -U 1189 ; WX 955 ; N uni04A5 ; G 1008 -U 1190 ; WX 1324 ; N uni04A6 ; G 1009 -U 1191 ; WX 1013 ; N uni04A7 ; G 1010 -U 1194 ; WX 796 ; N uni04AA ; G 1011 -U 1195 ; WX 609 ; N uni04AB ; G 1012 -U 1196 ; WX 744 ; N uni04AC ; G 1013 -U 1197 ; WX 1142 ; N uni04AD ; G 1014 -U 1198 ; WX 714 ; N uni04AE ; G 1015 -U 1199 ; WX 572 ; N uni04AF ; G 1016 -U 1200 ; WX 713 ; N uni04B0 ; G 1017 -U 1201 ; WX 572 ; N uni04B1 ; G 1018 -U 1202 ; WX 789 ; N uni04B2 ; G 1019 -U 1203 ; WX 596 ; N uni04B3 ; G 1020 -U 1204 ; WX 1010 ; N uni04B4 ; G 1021 -U 1205 ; WX 833 ; N uni04B5 ; G 1022 -U 1206 ; WX 913 ; N uni04B6 ; G 1023 -U 1207 ; WX 792 ; N uni04B7 ; G 1024 -U 1210 ; WX 910 ; N uni04BA ; G 1025 -U 1211 ; WX 727 ; N uni04BB ; G 1026 -U 1216 ; WX 468 ; N uni04C0 ; G 1027 -U 1217 ; WX 1312 ; N uni04C1 ; G 1028 -U 1218 ; WX 1306 ; N uni04C2 ; G 1029 -U 1219 ; WX 869 ; N uni04C3 ; G 1030 -U 1220 ; WX 693 ; N uni04C4 ; G 1031 -U 1223 ; WX 945 ; N uni04C7 ; G 1032 -U 1224 ; WX 732 ; N uni04C8 ; G 1033 -U 1227 ; WX 984 ; N uni04CB ; G 1034 -U 1228 ; WX 732 ; N uni04CC ; G 1035 -U 1231 ; WX 380 ; N uni04CF ; G 1036 -U 1232 ; WX 814 ; N uni04D0 ; G 1037 -U 1233 ; WX 648 ; N uni04D1 ; G 1038 -U 1234 ; WX 814 ; N uni04D2 ; G 1039 -U 1235 ; WX 648 ; N uni04D3 ; G 1040 -U 1236 ; WX 1034 ; N uni04D4 ; G 1041 -U 1237 ; WX 975 ; N uni04D5 ; G 1042 -U 1238 ; WX 762 ; N uni04D6 ; G 1043 -U 1239 ; WX 636 ; N uni04D7 ; G 1044 -U 1240 ; WX 871 ; N uni04D8 ; G 1045 -U 1241 ; WX 636 ; N uni04D9 ; G 1046 -U 1242 ; WX 871 ; N uni04DA ; G 1047 -U 1243 ; WX 636 ; N uni04DB ; G 1048 -U 1244 ; WX 1312 ; N uni04DC ; G 1049 -U 1245 ; WX 1306 ; N uni04DD ; G 1050 -U 1246 ; WX 721 ; N uni04DE ; G 1051 -U 1247 ; WX 638 ; N uni04DF ; G 1052 -U 1248 ; WX 657 ; N uni04E0 ; G 1053 -U 1249 ; WX 568 ; N uni04E1 ; G 1054 -U 1250 ; WX 945 ; N uni04E2 ; G 1055 -U 1251 ; WX 727 ; N uni04E3 ; G 1056 -U 1252 ; WX 945 ; N uni04E4 ; G 1057 -U 1253 ; WX 727 ; N uni04E5 ; G 1058 -U 1254 ; WX 871 ; N uni04E6 ; G 1059 -U 1255 ; WX 667 ; N uni04E7 ; G 1060 -U 1256 ; WX 871 ; N uni04E8 ; G 1061 -U 1257 ; WX 667 ; N uni04E9 ; G 1062 -U 1258 ; WX 871 ; N uni04EA ; G 1063 -U 1259 ; WX 667 ; N uni04EB ; G 1064 -U 1260 ; WX 795 ; N uni04EC ; G 1065 -U 1261 ; WX 645 ; N uni04ED ; G 1066 -U 1262 ; WX 812 ; N uni04EE ; G 1067 -U 1263 ; WX 598 ; N uni04EF ; G 1068 -U 1264 ; WX 812 ; N uni04F0 ; G 1069 -U 1265 ; WX 598 ; N uni04F1 ; G 1070 -U 1266 ; WX 812 ; N uni04F2 ; G 1071 -U 1267 ; WX 598 ; N uni04F3 ; G 1072 -U 1268 ; WX 913 ; N uni04F4 ; G 1073 -U 1269 ; WX 715 ; N uni04F5 ; G 1074 -U 1270 ; WX 690 ; N uni04F6 ; G 1075 -U 1271 ; WX 563 ; N uni04F7 ; G 1076 -U 1272 ; WX 1202 ; N uni04F8 ; G 1077 -U 1273 ; WX 1018 ; N uni04F9 ; G 1078 -U 1296 ; WX 721 ; N uni0510 ; G 1079 -U 1297 ; WX 638 ; N uni0511 ; G 1080 -U 1298 ; WX 884 ; N uni0512 ; G 1081 -U 1299 ; WX 732 ; N uni0513 ; G 1082 -U 1300 ; WX 1248 ; N uni0514 ; G 1083 -U 1301 ; WX 1005 ; N uni0515 ; G 1084 -U 1306 ; WX 820 ; N uni051A ; G 1085 -U 1307 ; WX 640 ; N uni051B ; G 1086 -U 1308 ; WX 1028 ; N uni051C ; G 1087 -U 1309 ; WX 856 ; N uni051D ; G 1088 -U 1329 ; WX 942 ; N uni0531 ; G 1089 -U 1330 ; WX 832 ; N uni0532 ; G 1090 -U 1331 ; WX 894 ; N uni0533 ; G 1091 -U 1332 ; WX 909 ; N uni0534 ; G 1092 -U 1333 ; WX 822 ; N uni0535 ; G 1093 -U 1334 ; WX 821 ; N uni0536 ; G 1094 -U 1335 ; WX 747 ; N uni0537 ; G 1095 -U 1336 ; WX 832 ; N uni0538 ; G 1096 -U 1337 ; WX 1125 ; N uni0539 ; G 1097 -U 1338 ; WX 894 ; N uni053A ; G 1098 -U 1339 ; WX 803 ; N uni053B ; G 1099 -U 1340 ; WX 722 ; N uni053C ; G 1100 -U 1341 ; WX 1188 ; N uni053D ; G 1101 -U 1342 ; WX 887 ; N uni053E ; G 1102 -U 1343 ; WX 842 ; N uni053F ; G 1103 -U 1344 ; WX 737 ; N uni0540 ; G 1104 -U 1345 ; WX 863 ; N uni0541 ; G 1105 -U 1346 ; WX 918 ; N uni0542 ; G 1106 -U 1347 ; WX 851 ; N uni0543 ; G 1107 -U 1348 ; WX 977 ; N uni0544 ; G 1108 -U 1349 ; WX 833 ; N uni0545 ; G 1109 -U 1350 ; WX 914 ; N uni0546 ; G 1110 -U 1351 ; WX 843 ; N uni0547 ; G 1111 -U 1352 ; WX 871 ; N uni0548 ; G 1112 -U 1353 ; WX 818 ; N uni0549 ; G 1113 -U 1354 ; WX 1034 ; N uni054A ; G 1114 -U 1355 ; WX 846 ; N uni054B ; G 1115 -U 1356 ; WX 964 ; N uni054C ; G 1116 -U 1357 ; WX 871 ; N uni054D ; G 1117 -U 1358 ; WX 914 ; N uni054E ; G 1118 -U 1359 ; WX 808 ; N uni054F ; G 1119 -U 1360 ; WX 808 ; N uni0550 ; G 1120 -U 1361 ; WX 836 ; N uni0551 ; G 1121 -U 1362 ; WX 710 ; N uni0552 ; G 1122 -U 1363 ; WX 955 ; N uni0553 ; G 1123 -U 1364 ; WX 891 ; N uni0554 ; G 1124 -U 1365 ; WX 871 ; N uni0555 ; G 1125 -U 1366 ; WX 963 ; N uni0556 ; G 1126 -U 1369 ; WX 307 ; N uni0559 ; G 1127 -U 1370 ; WX 264 ; N uni055A ; G 1128 -U 1371 ; WX 293 ; N uni055B ; G 1129 -U 1372 ; WX 391 ; N uni055C ; G 1130 -U 1373 ; WX 323 ; N uni055D ; G 1131 -U 1374 ; WX 439 ; N uni055E ; G 1132 -U 1375 ; WX 500 ; N uni055F ; G 1133 -U 1377 ; WX 1055 ; N uni0561 ; G 1134 -U 1378 ; WX 695 ; N uni0562 ; G 1135 -U 1379 ; WX 776 ; N uni0563 ; G 1136 -U 1380 ; WX 801 ; N uni0564 ; G 1137 -U 1381 ; WX 729 ; N uni0565 ; G 1138 -U 1382 ; WX 742 ; N uni0566 ; G 1139 -U 1383 ; WX 599 ; N uni0567 ; G 1140 -U 1384 ; WX 733 ; N uni0568 ; G 1141 -U 1385 ; WX 909 ; N uni0569 ; G 1142 -U 1386 ; WX 768 ; N uni056A ; G 1143 -U 1387 ; WX 724 ; N uni056B ; G 1144 -U 1388 ; WX 398 ; N uni056C ; G 1145 -U 1389 ; WX 1087 ; N uni056D ; G 1146 -U 1390 ; WX 695 ; N uni056E ; G 1147 -U 1391 ; WX 719 ; N uni056F ; G 1148 -U 1392 ; WX 737 ; N uni0570 ; G 1149 -U 1393 ; WX 684 ; N uni0571 ; G 1150 -U 1394 ; WX 738 ; N uni0572 ; G 1151 -U 1395 ; WX 703 ; N uni0573 ; G 1152 -U 1396 ; WX 724 ; N uni0574 ; G 1153 -U 1397 ; WX 359 ; N uni0575 ; G 1154 -U 1398 ; WX 719 ; N uni0576 ; G 1155 -U 1399 ; WX 496 ; N uni0577 ; G 1156 -U 1400 ; WX 738 ; N uni0578 ; G 1157 -U 1401 ; WX 428 ; N uni0579 ; G 1158 -U 1402 ; WX 1059 ; N uni057A ; G 1159 -U 1403 ; WX 668 ; N uni057B ; G 1160 -U 1404 ; WX 744 ; N uni057C ; G 1161 -U 1405 ; WX 724 ; N uni057D ; G 1162 -U 1406 ; WX 724 ; N uni057E ; G 1163 -U 1407 ; WX 1040 ; N uni057F ; G 1164 -U 1408 ; WX 724 ; N uni0580 ; G 1165 -U 1409 ; WX 713 ; N uni0581 ; G 1166 -U 1410 ; WX 493 ; N uni0582 ; G 1167 -U 1411 ; WX 1040 ; N uni0583 ; G 1168 -U 1412 ; WX 734 ; N uni0584 ; G 1169 -U 1413 ; WX 693 ; N uni0585 ; G 1170 -U 1414 ; WX 956 ; N uni0586 ; G 1171 -U 1415 ; WX 833 ; N uni0587 ; G 1172 -U 1417 ; WX 340 ; N uni0589 ; G 1173 -U 1418 ; WX 388 ; N uni058A ; G 1174 -U 3647 ; WX 696 ; N uni0E3F ; G 1175 -U 4256 ; WX 765 ; N uni10A0 ; G 1176 -U 4257 ; WX 945 ; N uni10A1 ; G 1177 -U 4258 ; WX 876 ; N uni10A2 ; G 1178 -U 4259 ; WX 884 ; N uni10A3 ; G 1179 -U 4260 ; WX 791 ; N uni10A4 ; G 1180 -U 4261 ; WX 1087 ; N uni10A5 ; G 1181 -U 4262 ; WX 1024 ; N uni10A6 ; G 1182 -U 4263 ; WX 1223 ; N uni10A7 ; G 1183 -U 4264 ; WX 653 ; N uni10A8 ; G 1184 -U 4265 ; WX 828 ; N uni10A9 ; G 1185 -U 4266 ; WX 1061 ; N uni10AA ; G 1186 -U 4267 ; WX 1061 ; N uni10AB ; G 1187 -U 4268 ; WX 806 ; N uni10AC ; G 1188 -U 4269 ; WX 1145 ; N uni10AD ; G 1189 -U 4270 ; WX 979 ; N uni10AE ; G 1190 -U 4271 ; WX 912 ; N uni10AF ; G 1191 -U 4272 ; WX 1119 ; N uni10B0 ; G 1192 -U 4273 ; WX 802 ; N uni10B1 ; G 1193 -U 4274 ; WX 766 ; N uni10B2 ; G 1194 -U 4275 ; WX 1085 ; N uni10B3 ; G 1195 -U 4276 ; WX 986 ; N uni10B4 ; G 1196 -U 4277 ; WX 1076 ; N uni10B5 ; G 1197 -U 4278 ; WX 820 ; N uni10B6 ; G 1198 -U 4279 ; WX 843 ; N uni10B7 ; G 1199 -U 4280 ; WX 831 ; N uni10B8 ; G 1200 -U 4281 ; WX 843 ; N uni10B9 ; G 1201 -U 4282 ; WX 918 ; N uni10BA ; G 1202 -U 4283 ; WX 1086 ; N uni10BB ; G 1203 -U 4284 ; WX 779 ; N uni10BC ; G 1204 -U 4285 ; WX 832 ; N uni10BD ; G 1205 -U 4286 ; WX 822 ; N uni10BE ; G 1206 -U 4287 ; WX 1121 ; N uni10BF ; G 1207 -U 4288 ; WX 1132 ; N uni10C0 ; G 1208 -U 4289 ; WX 812 ; N uni10C1 ; G 1209 -U 4290 ; WX 902 ; N uni10C2 ; G 1210 -U 4291 ; WX 812 ; N uni10C3 ; G 1211 -U 4292 ; WX 890 ; N uni10C4 ; G 1212 -U 4293 ; WX 1073 ; N uni10C5 ; G 1213 -U 4304 ; WX 594 ; N uni10D0 ; G 1214 -U 4305 ; WX 625 ; N uni10D1 ; G 1215 -U 4306 ; WX 643 ; N uni10D2 ; G 1216 -U 4307 ; WX 887 ; N uni10D3 ; G 1217 -U 4308 ; WX 615 ; N uni10D4 ; G 1218 -U 4309 ; WX 611 ; N uni10D5 ; G 1219 -U 4310 ; WX 666 ; N uni10D6 ; G 1220 -U 4311 ; WX 915 ; N uni10D7 ; G 1221 -U 4312 ; WX 613 ; N uni10D8 ; G 1222 -U 4313 ; WX 600 ; N uni10D9 ; G 1223 -U 4314 ; WX 1120 ; N uni10DA ; G 1224 -U 4315 ; WX 654 ; N uni10DB ; G 1225 -U 4316 ; WX 640 ; N uni10DC ; G 1226 -U 4317 ; WX 879 ; N uni10DD ; G 1227 -U 4318 ; WX 624 ; N uni10DE ; G 1228 -U 4319 ; WX 634 ; N uni10DF ; G 1229 -U 4320 ; WX 877 ; N uni10E0 ; G 1230 -U 4321 ; WX 657 ; N uni10E1 ; G 1231 -U 4322 ; WX 802 ; N uni10E2 ; G 1232 -U 4323 ; WX 751 ; N uni10E3 ; G 1233 -U 4324 ; WX 869 ; N uni10E4 ; G 1234 -U 4325 ; WX 639 ; N uni10E5 ; G 1235 -U 4326 ; WX 912 ; N uni10E6 ; G 1236 -U 4327 ; WX 622 ; N uni10E7 ; G 1237 -U 4328 ; WX 647 ; N uni10E8 ; G 1238 -U 4329 ; WX 640 ; N uni10E9 ; G 1239 -U 4330 ; WX 729 ; N uni10EA ; G 1240 -U 4331 ; WX 641 ; N uni10EB ; G 1241 -U 4332 ; WX 639 ; N uni10EC ; G 1242 -U 4333 ; WX 629 ; N uni10ED ; G 1243 -U 4334 ; WX 674 ; N uni10EE ; G 1244 -U 4335 ; WX 737 ; N uni10EF ; G 1245 -U 4336 ; WX 625 ; N uni10F0 ; G 1246 -U 4337 ; WX 657 ; N uni10F1 ; G 1247 -U 4338 ; WX 625 ; N uni10F2 ; G 1248 -U 4339 ; WX 625 ; N uni10F3 ; G 1249 -U 4340 ; WX 624 ; N uni10F4 ; G 1250 -U 4341 ; WX 670 ; N uni10F5 ; G 1251 -U 4342 ; WX 940 ; N uni10F6 ; G 1252 -U 4343 ; WX 680 ; N uni10F7 ; G 1253 -U 4344 ; WX 636 ; N uni10F8 ; G 1254 -U 4345 ; WX 672 ; N uni10F9 ; G 1255 -U 4346 ; WX 625 ; N uni10FA ; G 1256 -U 4347 ; WX 446 ; N uni10FB ; G 1257 -U 4348 ; WX 363 ; N uni10FC ; G 1258 -U 7424 ; WX 641 ; N uni1D00 ; G 1259 -U 7425 ; WX 892 ; N uni1D01 ; G 1260 -U 7426 ; WX 932 ; N uni1D02 ; G 1261 -U 7427 ; WX 695 ; N uni1D03 ; G 1262 -U 7428 ; WX 609 ; N uni1D04 ; G 1263 -U 7429 ; WX 675 ; N uni1D05 ; G 1264 -U 7430 ; WX 675 ; N uni1D06 ; G 1265 -U 7431 ; WX 617 ; N uni1D07 ; G 1266 -U 7432 ; WX 509 ; N uni1D08 ; G 1267 -U 7433 ; WX 320 ; N uni1D09 ; G 1268 -U 7434 ; WX 561 ; N uni1D0A ; G 1269 -U 7435 ; WX 722 ; N uni1D0B ; G 1270 -U 7436 ; WX 617 ; N uni1D0C ; G 1271 -U 7437 ; WX 869 ; N uni1D0D ; G 1272 -U 7438 ; WX 737 ; N uni1D0E ; G 1273 -U 7439 ; WX 667 ; N uni1D0F ; G 1274 -U 7440 ; WX 609 ; N uni1D10 ; G 1275 -U 7441 ; WX 628 ; N uni1D11 ; G 1276 -U 7442 ; WX 628 ; N uni1D12 ; G 1277 -U 7443 ; WX 667 ; N uni1D13 ; G 1278 -U 7444 ; WX 1028 ; N uni1D14 ; G 1279 -U 7445 ; WX 598 ; N uni1D15 ; G 1280 -U 7446 ; WX 667 ; N uni1D16 ; G 1281 -U 7447 ; WX 667 ; N uni1D17 ; G 1282 -U 7448 ; WX 586 ; N uni1D18 ; G 1283 -U 7449 ; WX 801 ; N uni1D19 ; G 1284 -U 7450 ; WX 801 ; N uni1D1A ; G 1285 -U 7451 ; WX 620 ; N uni1D1B ; G 1286 -U 7452 ; WX 647 ; N uni1D1C ; G 1287 -U 7453 ; WX 664 ; N uni1D1D ; G 1288 -U 7454 ; WX 923 ; N uni1D1E ; G 1289 -U 7455 ; WX 655 ; N uni1D1F ; G 1290 -U 7456 ; WX 581 ; N uni1D20 ; G 1291 -U 7457 ; WX 861 ; N uni1D21 ; G 1292 -U 7458 ; WX 568 ; N uni1D22 ; G 1293 -U 7459 ; WX 568 ; N uni1D23 ; G 1294 -U 7460 ; WX 588 ; N uni1D24 ; G 1295 -U 7461 ; WX 802 ; N uni1D25 ; G 1296 -U 7462 ; WX 586 ; N uni1D26 ; G 1297 -U 7463 ; WX 641 ; N uni1D27 ; G 1298 -U 7464 ; WX 732 ; N uni1D28 ; G 1299 -U 7465 ; WX 586 ; N uni1D29 ; G 1300 -U 7466 ; WX 854 ; N uni1D2A ; G 1301 -U 7467 ; WX 705 ; N uni1D2B ; G 1302 -U 7468 ; WX 489 ; N uni1D2C ; G 1303 -U 7469 ; WX 651 ; N uni1D2D ; G 1304 -U 7470 ; WX 532 ; N uni1D2E ; G 1305 -U 7471 ; WX 532 ; N uni1D2F ; G 1306 -U 7472 ; WX 546 ; N uni1D30 ; G 1307 -U 7473 ; WX 480 ; N uni1D31 ; G 1308 -U 7474 ; WX 480 ; N uni1D32 ; G 1309 -U 7475 ; WX 538 ; N uni1D33 ; G 1310 -U 7476 ; WX 595 ; N uni1D34 ; G 1311 -U 7477 ; WX 294 ; N uni1D35 ; G 1312 -U 7478 ; WX 298 ; N uni1D36 ; G 1313 -U 7479 ; WX 547 ; N uni1D37 ; G 1314 -U 7480 ; WX 443 ; N uni1D38 ; G 1315 -U 7481 ; WX 697 ; N uni1D39 ; G 1316 -U 7482 ; WX 576 ; N uni1D3A ; G 1317 -U 7483 ; WX 606 ; N uni1D3B ; G 1318 -U 7484 ; WX 548 ; N uni1D3C ; G 1319 -U 7485 ; WX 442 ; N uni1D3D ; G 1320 -U 7486 ; WX 474 ; N uni1D3E ; G 1321 -U 7487 ; WX 523 ; N uni1D3F ; G 1322 -U 7488 ; WX 469 ; N uni1D40 ; G 1323 -U 7489 ; WX 549 ; N uni1D41 ; G 1324 -U 7490 ; WX 708 ; N uni1D42 ; G 1325 -U 7491 ; WX 408 ; N uni1D43 ; G 1326 -U 7492 ; WX 408 ; N uni1D44 ; G 1327 -U 7493 ; WX 484 ; N uni1D45 ; G 1328 -U 7494 ; WX 587 ; N uni1D46 ; G 1329 -U 7495 ; WX 499 ; N uni1D47 ; G 1330 -U 7496 ; WX 498 ; N uni1D48 ; G 1331 -U 7497 ; WX 444 ; N uni1D49 ; G 1332 -U 7498 ; WX 444 ; N uni1D4A ; G 1333 -U 7499 ; WX 412 ; N uni1D4B ; G 1334 -U 7500 ; WX 412 ; N uni1D4C ; G 1335 -U 7501 ; WX 498 ; N uni1D4D ; G 1336 -U 7502 ; WX 300 ; N uni1D4E ; G 1337 -U 7503 ; WX 523 ; N uni1D4F ; G 1338 -U 7504 ; WX 729 ; N uni1D50 ; G 1339 -U 7505 ; WX 473 ; N uni1D51 ; G 1340 -U 7506 ; WX 467 ; N uni1D52 ; G 1341 -U 7507 ; WX 427 ; N uni1D53 ; G 1342 -U 7508 ; WX 467 ; N uni1D54 ; G 1343 -U 7509 ; WX 467 ; N uni1D55 ; G 1344 -U 7510 ; WX 499 ; N uni1D56 ; G 1345 -U 7511 ; WX 371 ; N uni1D57 ; G 1346 -U 7512 ; WX 520 ; N uni1D58 ; G 1347 -U 7513 ; WX 418 ; N uni1D59 ; G 1348 -U 7514 ; WX 729 ; N uni1D5A ; G 1349 -U 7515 ; WX 491 ; N uni1D5B ; G 1350 -U 7516 ; WX 505 ; N uni1D5C ; G 1351 -U 7517 ; WX 418 ; N uni1D5D ; G 1352 -U 7518 ; WX 416 ; N uni1D5E ; G 1353 -U 7519 ; WX 420 ; N uni1D5F ; G 1354 -U 7520 ; WX 570 ; N uni1D60 ; G 1355 -U 7521 ; WX 414 ; N uni1D61 ; G 1356 -U 7522 ; WX 239 ; N uni1D62 ; G 1357 -U 7523 ; WX 414 ; N uni1D63 ; G 1358 -U 7524 ; WX 520 ; N uni1D64 ; G 1359 -U 7525 ; WX 491 ; N uni1D65 ; G 1360 -U 7526 ; WX 418 ; N uni1D66 ; G 1361 -U 7527 ; WX 416 ; N uni1D67 ; G 1362 -U 7528 ; WX 419 ; N uni1D68 ; G 1363 -U 7529 ; WX 570 ; N uni1D69 ; G 1364 -U 7530 ; WX 414 ; N uni1D6A ; G 1365 -U 7531 ; WX 1042 ; N uni1D6B ; G 1366 -U 7543 ; WX 640 ; N uni1D77 ; G 1367 -U 7544 ; WX 595 ; N uni1D78 ; G 1368 -U 7547 ; WX 380 ; N uni1D7B ; G 1369 -U 7548 ; WX 380 ; N uni1D7C ; G 1370 -U 7549 ; WX 699 ; N uni1D7D ; G 1371 -U 7550 ; WX 647 ; N uni1D7E ; G 1372 -U 7551 ; WX 679 ; N uni1D7F ; G 1373 -U 7557 ; WX 380 ; N uni1D85 ; G 1374 -U 7579 ; WX 484 ; N uni1D9B ; G 1375 -U 7580 ; WX 427 ; N uni1D9C ; G 1376 -U 7581 ; WX 427 ; N uni1D9D ; G 1377 -U 7582 ; WX 467 ; N uni1D9E ; G 1378 -U 7583 ; WX 412 ; N uni1D9F ; G 1379 -U 7584 ; WX 271 ; N uni1DA0 ; G 1380 -U 7585 ; WX 373 ; N uni1DA1 ; G 1381 -U 7586 ; WX 498 ; N uni1DA2 ; G 1382 -U 7587 ; WX 522 ; N uni1DA3 ; G 1383 -U 7588 ; WX 300 ; N uni1DA4 ; G 1384 -U 7589 ; WX 307 ; N uni1DA5 ; G 1385 -U 7590 ; WX 300 ; N uni1DA6 ; G 1386 -U 7591 ; WX 300 ; N uni1DA7 ; G 1387 -U 7592 ; WX 370 ; N uni1DA8 ; G 1388 -U 7593 ; WX 368 ; N uni1DA9 ; G 1389 -U 7594 ; WX 321 ; N uni1DAA ; G 1390 -U 7595 ; WX 430 ; N uni1DAB ; G 1391 -U 7596 ; WX 682 ; N uni1DAC ; G 1392 -U 7597 ; WX 729 ; N uni1DAD ; G 1393 -U 7598 ; WX 588 ; N uni1DAE ; G 1394 -U 7599 ; WX 587 ; N uni1DAF ; G 1395 -U 7600 ; WX 472 ; N uni1DB0 ; G 1396 -U 7601 ; WX 467 ; N uni1DB1 ; G 1397 -U 7602 ; WX 522 ; N uni1DB2 ; G 1398 -U 7603 ; WX 400 ; N uni1DB3 ; G 1399 -U 7604 ; WX 387 ; N uni1DB4 ; G 1400 -U 7605 ; WX 371 ; N uni1DB5 ; G 1401 -U 7606 ; WX 520 ; N uni1DB6 ; G 1402 -U 7607 ; WX 475 ; N uni1DB7 ; G 1403 -U 7608 ; WX 408 ; N uni1DB8 ; G 1404 -U 7609 ; WX 489 ; N uni1DB9 ; G 1405 -U 7610 ; WX 366 ; N uni1DBA ; G 1406 -U 7611 ; WX 357 ; N uni1DBB ; G 1407 -U 7612 ; WX 527 ; N uni1DBC ; G 1408 -U 7613 ; WX 412 ; N uni1DBD ; G 1409 -U 7614 ; WX 452 ; N uni1DBE ; G 1410 -U 7615 ; WX 467 ; N uni1DBF ; G 1411 -U 7620 ; WX 0 ; N uni1DC4 ; G 1412 -U 7621 ; WX 0 ; N uni1DC5 ; G 1413 -U 7622 ; WX 0 ; N uni1DC6 ; G 1414 -U 7623 ; WX 0 ; N uni1DC7 ; G 1415 -U 7624 ; WX 0 ; N uni1DC8 ; G 1416 -U 7625 ; WX 0 ; N uni1DC9 ; G 1417 -U 7680 ; WX 776 ; N uni1E00 ; G 1418 -U 7681 ; WX 648 ; N uni1E01 ; G 1419 -U 7682 ; WX 845 ; N uni1E02 ; G 1420 -U 7683 ; WX 699 ; N uni1E03 ; G 1421 -U 7684 ; WX 845 ; N uni1E04 ; G 1422 -U 7685 ; WX 699 ; N uni1E05 ; G 1423 -U 7686 ; WX 845 ; N uni1E06 ; G 1424 -U 7687 ; WX 699 ; N uni1E07 ; G 1425 -U 7688 ; WX 796 ; N uni1E08 ; G 1426 -U 7689 ; WX 609 ; N uni1E09 ; G 1427 -U 7690 ; WX 867 ; N uni1E0A ; G 1428 -U 7691 ; WX 699 ; N uni1E0B ; G 1429 -U 7692 ; WX 867 ; N uni1E0C ; G 1430 -U 7693 ; WX 699 ; N uni1E0D ; G 1431 -U 7694 ; WX 867 ; N uni1E0E ; G 1432 -U 7695 ; WX 699 ; N uni1E0F ; G 1433 -U 7696 ; WX 867 ; N uni1E10 ; G 1434 -U 7697 ; WX 699 ; N uni1E11 ; G 1435 -U 7698 ; WX 867 ; N uni1E12 ; G 1436 -U 7699 ; WX 699 ; N uni1E13 ; G 1437 -U 7700 ; WX 762 ; N uni1E14 ; G 1438 -U 7701 ; WX 636 ; N uni1E15 ; G 1439 -U 7702 ; WX 762 ; N uni1E16 ; G 1440 -U 7703 ; WX 636 ; N uni1E17 ; G 1441 -U 7704 ; WX 762 ; N uni1E18 ; G 1442 -U 7705 ; WX 636 ; N uni1E19 ; G 1443 -U 7706 ; WX 762 ; N uni1E1A ; G 1444 -U 7707 ; WX 636 ; N uni1E1B ; G 1445 -U 7708 ; WX 762 ; N uni1E1C ; G 1446 -U 7709 ; WX 636 ; N uni1E1D ; G 1447 -U 7710 ; WX 710 ; N uni1E1E ; G 1448 -U 7711 ; WX 430 ; N uni1E1F ; G 1449 -U 7712 ; WX 854 ; N uni1E20 ; G 1450 -U 7713 ; WX 699 ; N uni1E21 ; G 1451 -U 7714 ; WX 945 ; N uni1E22 ; G 1452 -U 7715 ; WX 727 ; N uni1E23 ; G 1453 -U 7716 ; WX 945 ; N uni1E24 ; G 1454 -U 7717 ; WX 727 ; N uni1E25 ; G 1455 -U 7718 ; WX 945 ; N uni1E26 ; G 1456 -U 7719 ; WX 727 ; N uni1E27 ; G 1457 -U 7720 ; WX 945 ; N uni1E28 ; G 1458 -U 7721 ; WX 727 ; N uni1E29 ; G 1459 -U 7722 ; WX 945 ; N uni1E2A ; G 1460 -U 7723 ; WX 727 ; N uni1E2B ; G 1461 -U 7724 ; WX 468 ; N uni1E2C ; G 1462 -U 7725 ; WX 380 ; N uni1E2D ; G 1463 -U 7726 ; WX 468 ; N uni1E2E ; G 1464 -U 7727 ; WX 380 ; N uni1E2F ; G 1465 -U 7728 ; WX 869 ; N uni1E30 ; G 1466 -U 7729 ; WX 693 ; N uni1E31 ; G 1467 -U 7730 ; WX 869 ; N uni1E32 ; G 1468 -U 7731 ; WX 693 ; N uni1E33 ; G 1469 -U 7732 ; WX 869 ; N uni1E34 ; G 1470 -U 7733 ; WX 693 ; N uni1E35 ; G 1471 -U 7734 ; WX 703 ; N uni1E36 ; G 1472 -U 7735 ; WX 380 ; N uni1E37 ; G 1473 -U 7736 ; WX 703 ; N uni1E38 ; G 1474 -U 7737 ; WX 380 ; N uni1E39 ; G 1475 -U 7738 ; WX 703 ; N uni1E3A ; G 1476 -U 7739 ; WX 380 ; N uni1E3B ; G 1477 -U 7740 ; WX 703 ; N uni1E3C ; G 1478 -U 7741 ; WX 380 ; N uni1E3D ; G 1479 -U 7742 ; WX 1107 ; N uni1E3E ; G 1480 -U 7743 ; WX 1058 ; N uni1E3F ; G 1481 -U 7744 ; WX 1107 ; N uni1E40 ; G 1482 -U 7745 ; WX 1058 ; N uni1E41 ; G 1483 -U 7746 ; WX 1107 ; N uni1E42 ; G 1484 -U 7747 ; WX 1058 ; N uni1E43 ; G 1485 -U 7748 ; WX 914 ; N uni1E44 ; G 1486 -U 7749 ; WX 727 ; N uni1E45 ; G 1487 -U 7750 ; WX 914 ; N uni1E46 ; G 1488 -U 7751 ; WX 727 ; N uni1E47 ; G 1489 -U 7752 ; WX 914 ; N uni1E48 ; G 1490 -U 7753 ; WX 727 ; N uni1E49 ; G 1491 -U 7754 ; WX 914 ; N uni1E4A ; G 1492 -U 7755 ; WX 727 ; N uni1E4B ; G 1493 -U 7756 ; WX 871 ; N uni1E4C ; G 1494 -U 7757 ; WX 667 ; N uni1E4D ; G 1495 -U 7758 ; WX 871 ; N uni1E4E ; G 1496 -U 7759 ; WX 667 ; N uni1E4F ; G 1497 -U 7760 ; WX 871 ; N uni1E50 ; G 1498 -U 7761 ; WX 667 ; N uni1E51 ; G 1499 -U 7762 ; WX 871 ; N uni1E52 ; G 1500 -U 7763 ; WX 667 ; N uni1E53 ; G 1501 -U 7764 ; WX 752 ; N uni1E54 ; G 1502 -U 7765 ; WX 699 ; N uni1E55 ; G 1503 -U 7766 ; WX 752 ; N uni1E56 ; G 1504 -U 7767 ; WX 699 ; N uni1E57 ; G 1505 -U 7768 ; WX 831 ; N uni1E58 ; G 1506 -U 7769 ; WX 527 ; N uni1E59 ; G 1507 -U 7770 ; WX 831 ; N uni1E5A ; G 1508 -U 7771 ; WX 527 ; N uni1E5B ; G 1509 -U 7772 ; WX 831 ; N uni1E5C ; G 1510 -U 7773 ; WX 527 ; N uni1E5D ; G 1511 -U 7774 ; WX 831 ; N uni1E5E ; G 1512 -U 7775 ; WX 527 ; N uni1E5F ; G 1513 -U 7776 ; WX 722 ; N uni1E60 ; G 1514 -U 7777 ; WX 563 ; N uni1E61 ; G 1515 -U 7778 ; WX 722 ; N uni1E62 ; G 1516 -U 7779 ; WX 563 ; N uni1E63 ; G 1517 -U 7780 ; WX 722 ; N uni1E64 ; G 1518 -U 7781 ; WX 563 ; N uni1E65 ; G 1519 -U 7782 ; WX 722 ; N uni1E66 ; G 1520 -U 7783 ; WX 563 ; N uni1E67 ; G 1521 -U 7784 ; WX 722 ; N uni1E68 ; G 1522 -U 7785 ; WX 563 ; N uni1E69 ; G 1523 -U 7786 ; WX 744 ; N uni1E6A ; G 1524 -U 7787 ; WX 462 ; N uni1E6B ; G 1525 -U 7788 ; WX 744 ; N uni1E6C ; G 1526 -U 7789 ; WX 462 ; N uni1E6D ; G 1527 -U 7790 ; WX 744 ; N uni1E6E ; G 1528 -U 7791 ; WX 462 ; N uni1E6F ; G 1529 -U 7792 ; WX 744 ; N uni1E70 ; G 1530 -U 7793 ; WX 462 ; N uni1E71 ; G 1531 -U 7794 ; WX 872 ; N uni1E72 ; G 1532 -U 7795 ; WX 727 ; N uni1E73 ; G 1533 -U 7796 ; WX 872 ; N uni1E74 ; G 1534 -U 7797 ; WX 727 ; N uni1E75 ; G 1535 -U 7798 ; WX 872 ; N uni1E76 ; G 1536 -U 7799 ; WX 727 ; N uni1E77 ; G 1537 -U 7800 ; WX 872 ; N uni1E78 ; G 1538 -U 7801 ; WX 727 ; N uni1E79 ; G 1539 -U 7802 ; WX 872 ; N uni1E7A ; G 1540 -U 7803 ; WX 727 ; N uni1E7B ; G 1541 -U 7804 ; WX 776 ; N uni1E7C ; G 1542 -U 7805 ; WX 581 ; N uni1E7D ; G 1543 -U 7806 ; WX 776 ; N uni1E7E ; G 1544 -U 7807 ; WX 581 ; N uni1E7F ; G 1545 -U 7808 ; WX 1123 ; N Wgrave ; G 1546 -U 7809 ; WX 861 ; N wgrave ; G 1547 -U 7810 ; WX 1123 ; N Wacute ; G 1548 -U 7811 ; WX 861 ; N wacute ; G 1549 -U 7812 ; WX 1123 ; N Wdieresis ; G 1550 -U 7813 ; WX 861 ; N wdieresis ; G 1551 -U 7814 ; WX 1123 ; N uni1E86 ; G 1552 -U 7815 ; WX 861 ; N uni1E87 ; G 1553 -U 7816 ; WX 1123 ; N uni1E88 ; G 1554 -U 7817 ; WX 861 ; N uni1E89 ; G 1555 -U 7818 ; WX 776 ; N uni1E8A ; G 1556 -U 7819 ; WX 596 ; N uni1E8B ; G 1557 -U 7820 ; WX 776 ; N uni1E8C ; G 1558 -U 7821 ; WX 596 ; N uni1E8D ; G 1559 -U 7822 ; WX 714 ; N uni1E8E ; G 1560 -U 7823 ; WX 581 ; N uni1E8F ; G 1561 -U 7824 ; WX 730 ; N uni1E90 ; G 1562 -U 7825 ; WX 568 ; N uni1E91 ; G 1563 -U 7826 ; WX 730 ; N uni1E92 ; G 1564 -U 7827 ; WX 568 ; N uni1E93 ; G 1565 -U 7828 ; WX 730 ; N uni1E94 ; G 1566 -U 7829 ; WX 568 ; N uni1E95 ; G 1567 -U 7830 ; WX 727 ; N uni1E96 ; G 1568 -U 7831 ; WX 462 ; N uni1E97 ; G 1569 -U 7832 ; WX 861 ; N uni1E98 ; G 1570 -U 7833 ; WX 581 ; N uni1E99 ; G 1571 -U 7834 ; WX 1014 ; N uni1E9A ; G 1572 -U 7835 ; WX 430 ; N uni1E9B ; G 1573 -U 7836 ; WX 430 ; N uni1E9C ; G 1574 -U 7837 ; WX 430 ; N uni1E9D ; G 1575 -U 7838 ; WX 947 ; N uni1E9E ; G 1576 -U 7839 ; WX 667 ; N uni1E9F ; G 1577 -U 7840 ; WX 776 ; N uni1EA0 ; G 1578 -U 7841 ; WX 648 ; N uni1EA1 ; G 1579 -U 7842 ; WX 776 ; N uni1EA2 ; G 1580 -U 7843 ; WX 648 ; N uni1EA3 ; G 1581 -U 7844 ; WX 776 ; N uni1EA4 ; G 1582 -U 7845 ; WX 648 ; N uni1EA5 ; G 1583 -U 7846 ; WX 776 ; N uni1EA6 ; G 1584 -U 7847 ; WX 648 ; N uni1EA7 ; G 1585 -U 7848 ; WX 776 ; N uni1EA8 ; G 1586 -U 7849 ; WX 648 ; N uni1EA9 ; G 1587 -U 7850 ; WX 776 ; N uni1EAA ; G 1588 -U 7851 ; WX 648 ; N uni1EAB ; G 1589 -U 7852 ; WX 776 ; N uni1EAC ; G 1590 -U 7853 ; WX 648 ; N uni1EAD ; G 1591 -U 7854 ; WX 776 ; N uni1EAE ; G 1592 -U 7855 ; WX 648 ; N uni1EAF ; G 1593 -U 7856 ; WX 776 ; N uni1EB0 ; G 1594 -U 7857 ; WX 648 ; N uni1EB1 ; G 1595 -U 7858 ; WX 776 ; N uni1EB2 ; G 1596 -U 7859 ; WX 648 ; N uni1EB3 ; G 1597 -U 7860 ; WX 776 ; N uni1EB4 ; G 1598 -U 7861 ; WX 648 ; N uni1EB5 ; G 1599 -U 7862 ; WX 776 ; N uni1EB6 ; G 1600 -U 7863 ; WX 648 ; N uni1EB7 ; G 1601 -U 7864 ; WX 762 ; N uni1EB8 ; G 1602 -U 7865 ; WX 636 ; N uni1EB9 ; G 1603 -U 7866 ; WX 762 ; N uni1EBA ; G 1604 -U 7867 ; WX 636 ; N uni1EBB ; G 1605 -U 7868 ; WX 762 ; N uni1EBC ; G 1606 -U 7869 ; WX 636 ; N uni1EBD ; G 1607 -U 7870 ; WX 762 ; N uni1EBE ; G 1608 -U 7871 ; WX 636 ; N uni1EBF ; G 1609 -U 7872 ; WX 762 ; N uni1EC0 ; G 1610 -U 7873 ; WX 636 ; N uni1EC1 ; G 1611 -U 7874 ; WX 762 ; N uni1EC2 ; G 1612 -U 7875 ; WX 636 ; N uni1EC3 ; G 1613 -U 7876 ; WX 762 ; N uni1EC4 ; G 1614 -U 7877 ; WX 636 ; N uni1EC5 ; G 1615 -U 7878 ; WX 762 ; N uni1EC6 ; G 1616 -U 7879 ; WX 636 ; N uni1EC7 ; G 1617 -U 7880 ; WX 468 ; N uni1EC8 ; G 1618 -U 7881 ; WX 380 ; N uni1EC9 ; G 1619 -U 7882 ; WX 468 ; N uni1ECA ; G 1620 -U 7883 ; WX 380 ; N uni1ECB ; G 1621 -U 7884 ; WX 871 ; N uni1ECC ; G 1622 -U 7885 ; WX 667 ; N uni1ECD ; G 1623 -U 7886 ; WX 871 ; N uni1ECE ; G 1624 -U 7887 ; WX 667 ; N uni1ECF ; G 1625 -U 7888 ; WX 871 ; N uni1ED0 ; G 1626 -U 7889 ; WX 667 ; N uni1ED1 ; G 1627 -U 7890 ; WX 871 ; N uni1ED2 ; G 1628 -U 7891 ; WX 667 ; N uni1ED3 ; G 1629 -U 7892 ; WX 871 ; N uni1ED4 ; G 1630 -U 7893 ; WX 667 ; N uni1ED5 ; G 1631 -U 7894 ; WX 871 ; N uni1ED6 ; G 1632 -U 7895 ; WX 667 ; N uni1ED7 ; G 1633 -U 7896 ; WX 871 ; N uni1ED8 ; G 1634 -U 7897 ; WX 667 ; N uni1ED9 ; G 1635 -U 7898 ; WX 871 ; N uni1EDA ; G 1636 -U 7899 ; WX 667 ; N uni1EDB ; G 1637 -U 7900 ; WX 871 ; N uni1EDC ; G 1638 -U 7901 ; WX 667 ; N uni1EDD ; G 1639 -U 7902 ; WX 871 ; N uni1EDE ; G 1640 -U 7903 ; WX 667 ; N uni1EDF ; G 1641 -U 7904 ; WX 871 ; N uni1EE0 ; G 1642 -U 7905 ; WX 667 ; N uni1EE1 ; G 1643 -U 7906 ; WX 871 ; N uni1EE2 ; G 1644 -U 7907 ; WX 667 ; N uni1EE3 ; G 1645 -U 7908 ; WX 872 ; N uni1EE4 ; G 1646 -U 7909 ; WX 727 ; N uni1EE5 ; G 1647 -U 7910 ; WX 872 ; N uni1EE6 ; G 1648 -U 7911 ; WX 727 ; N uni1EE7 ; G 1649 -U 7912 ; WX 872 ; N uni1EE8 ; G 1650 -U 7913 ; WX 727 ; N uni1EE9 ; G 1651 -U 7914 ; WX 872 ; N uni1EEA ; G 1652 -U 7915 ; WX 727 ; N uni1EEB ; G 1653 -U 7916 ; WX 872 ; N uni1EEC ; G 1654 -U 7917 ; WX 727 ; N uni1EED ; G 1655 -U 7918 ; WX 872 ; N uni1EEE ; G 1656 -U 7919 ; WX 727 ; N uni1EEF ; G 1657 -U 7920 ; WX 872 ; N uni1EF0 ; G 1658 -U 7921 ; WX 727 ; N uni1EF1 ; G 1659 -U 7922 ; WX 714 ; N Ygrave ; G 1660 -U 7923 ; WX 581 ; N ygrave ; G 1661 -U 7924 ; WX 714 ; N uni1EF4 ; G 1662 -U 7925 ; WX 581 ; N uni1EF5 ; G 1663 -U 7926 ; WX 714 ; N uni1EF6 ; G 1664 -U 7927 ; WX 581 ; N uni1EF7 ; G 1665 -U 7928 ; WX 714 ; N uni1EF8 ; G 1666 -U 7929 ; WX 581 ; N uni1EF9 ; G 1667 -U 7930 ; WX 1078 ; N uni1EFA ; G 1668 -U 7931 ; WX 701 ; N uni1EFB ; G 1669 -U 7936 ; WX 770 ; N uni1F00 ; G 1670 -U 7937 ; WX 770 ; N uni1F01 ; G 1671 -U 7938 ; WX 770 ; N uni1F02 ; G 1672 -U 7939 ; WX 770 ; N uni1F03 ; G 1673 -U 7940 ; WX 770 ; N uni1F04 ; G 1674 -U 7941 ; WX 770 ; N uni1F05 ; G 1675 -U 7942 ; WX 770 ; N uni1F06 ; G 1676 -U 7943 ; WX 770 ; N uni1F07 ; G 1677 -U 7944 ; WX 776 ; N uni1F08 ; G 1678 -U 7945 ; WX 776 ; N uni1F09 ; G 1679 -U 7946 ; WX 978 ; N uni1F0A ; G 1680 -U 7947 ; WX 978 ; N uni1F0B ; G 1681 -U 7948 ; WX 832 ; N uni1F0C ; G 1682 -U 7949 ; WX 849 ; N uni1F0D ; G 1683 -U 7950 ; WX 776 ; N uni1F0E ; G 1684 -U 7951 ; WX 776 ; N uni1F0F ; G 1685 -U 7952 ; WX 608 ; N uni1F10 ; G 1686 -U 7953 ; WX 608 ; N uni1F11 ; G 1687 -U 7954 ; WX 608 ; N uni1F12 ; G 1688 -U 7955 ; WX 608 ; N uni1F13 ; G 1689 -U 7956 ; WX 608 ; N uni1F14 ; G 1690 -U 7957 ; WX 608 ; N uni1F15 ; G 1691 -U 7960 ; WX 917 ; N uni1F18 ; G 1692 -U 7961 ; WX 909 ; N uni1F19 ; G 1693 -U 7962 ; WX 1169 ; N uni1F1A ; G 1694 -U 7963 ; WX 1169 ; N uni1F1B ; G 1695 -U 7964 ; WX 1093 ; N uni1F1C ; G 1696 -U 7965 ; WX 1120 ; N uni1F1D ; G 1697 -U 7968 ; WX 727 ; N uni1F20 ; G 1698 -U 7969 ; WX 727 ; N uni1F21 ; G 1699 -U 7970 ; WX 727 ; N uni1F22 ; G 1700 -U 7971 ; WX 727 ; N uni1F23 ; G 1701 -U 7972 ; WX 727 ; N uni1F24 ; G 1702 -U 7973 ; WX 727 ; N uni1F25 ; G 1703 -U 7974 ; WX 727 ; N uni1F26 ; G 1704 -U 7975 ; WX 727 ; N uni1F27 ; G 1705 -U 7976 ; WX 1100 ; N uni1F28 ; G 1706 -U 7977 ; WX 1094 ; N uni1F29 ; G 1707 -U 7978 ; WX 1358 ; N uni1F2A ; G 1708 -U 7979 ; WX 1361 ; N uni1F2B ; G 1709 -U 7980 ; WX 1279 ; N uni1F2C ; G 1710 -U 7981 ; WX 1308 ; N uni1F2D ; G 1711 -U 7982 ; WX 1197 ; N uni1F2E ; G 1712 -U 7983 ; WX 1194 ; N uni1F2F ; G 1713 -U 7984 ; WX 484 ; N uni1F30 ; G 1714 -U 7985 ; WX 484 ; N uni1F31 ; G 1715 -U 7986 ; WX 484 ; N uni1F32 ; G 1716 -U 7987 ; WX 484 ; N uni1F33 ; G 1717 -U 7988 ; WX 484 ; N uni1F34 ; G 1718 -U 7989 ; WX 484 ; N uni1F35 ; G 1719 -U 7990 ; WX 484 ; N uni1F36 ; G 1720 -U 7991 ; WX 484 ; N uni1F37 ; G 1721 -U 7992 ; WX 629 ; N uni1F38 ; G 1722 -U 7993 ; WX 617 ; N uni1F39 ; G 1723 -U 7994 ; WX 878 ; N uni1F3A ; G 1724 -U 7995 ; WX 881 ; N uni1F3B ; G 1725 -U 7996 ; WX 799 ; N uni1F3C ; G 1726 -U 7997 ; WX 831 ; N uni1F3D ; G 1727 -U 7998 ; WX 723 ; N uni1F3E ; G 1728 -U 7999 ; WX 714 ; N uni1F3F ; G 1729 -U 8000 ; WX 667 ; N uni1F40 ; G 1730 -U 8001 ; WX 667 ; N uni1F41 ; G 1731 -U 8002 ; WX 667 ; N uni1F42 ; G 1732 -U 8003 ; WX 667 ; N uni1F43 ; G 1733 -U 8004 ; WX 667 ; N uni1F44 ; G 1734 -U 8005 ; WX 667 ; N uni1F45 ; G 1735 -U 8008 ; WX 900 ; N uni1F48 ; G 1736 -U 8009 ; WX 935 ; N uni1F49 ; G 1737 -U 8010 ; WX 1240 ; N uni1F4A ; G 1738 -U 8011 ; WX 1237 ; N uni1F4B ; G 1739 -U 8012 ; WX 1035 ; N uni1F4C ; G 1740 -U 8013 ; WX 1066 ; N uni1F4D ; G 1741 -U 8016 ; WX 694 ; N uni1F50 ; G 1742 -U 8017 ; WX 694 ; N uni1F51 ; G 1743 -U 8018 ; WX 694 ; N uni1F52 ; G 1744 -U 8019 ; WX 694 ; N uni1F53 ; G 1745 -U 8020 ; WX 694 ; N uni1F54 ; G 1746 -U 8021 ; WX 694 ; N uni1F55 ; G 1747 -U 8022 ; WX 694 ; N uni1F56 ; G 1748 -U 8023 ; WX 694 ; N uni1F57 ; G 1749 -U 8025 ; WX 922 ; N uni1F59 ; G 1750 -U 8027 ; WX 1186 ; N uni1F5B ; G 1751 -U 8029 ; WX 1133 ; N uni1F5D ; G 1752 -U 8031 ; WX 1019 ; N uni1F5F ; G 1753 -U 8032 ; WX 952 ; N uni1F60 ; G 1754 -U 8033 ; WX 952 ; N uni1F61 ; G 1755 -U 8034 ; WX 952 ; N uni1F62 ; G 1756 -U 8035 ; WX 952 ; N uni1F63 ; G 1757 -U 8036 ; WX 952 ; N uni1F64 ; G 1758 -U 8037 ; WX 952 ; N uni1F65 ; G 1759 -U 8038 ; WX 952 ; N uni1F66 ; G 1760 -U 8039 ; WX 952 ; N uni1F67 ; G 1761 -U 8040 ; WX 931 ; N uni1F68 ; G 1762 -U 8041 ; WX 963 ; N uni1F69 ; G 1763 -U 8042 ; WX 1268 ; N uni1F6A ; G 1764 -U 8043 ; WX 1274 ; N uni1F6B ; G 1765 -U 8044 ; WX 1054 ; N uni1F6C ; G 1766 -U 8045 ; WX 1088 ; N uni1F6D ; G 1767 -U 8046 ; WX 1023 ; N uni1F6E ; G 1768 -U 8047 ; WX 1060 ; N uni1F6F ; G 1769 -U 8048 ; WX 770 ; N uni1F70 ; G 1770 -U 8049 ; WX 770 ; N uni1F71 ; G 1771 -U 8050 ; WX 608 ; N uni1F72 ; G 1772 -U 8051 ; WX 608 ; N uni1F73 ; G 1773 -U 8052 ; WX 727 ; N uni1F74 ; G 1774 -U 8053 ; WX 727 ; N uni1F75 ; G 1775 -U 8054 ; WX 484 ; N uni1F76 ; G 1776 -U 8055 ; WX 484 ; N uni1F77 ; G 1777 -U 8056 ; WX 667 ; N uni1F78 ; G 1778 -U 8057 ; WX 667 ; N uni1F79 ; G 1779 -U 8058 ; WX 694 ; N uni1F7A ; G 1780 -U 8059 ; WX 694 ; N uni1F7B ; G 1781 -U 8060 ; WX 952 ; N uni1F7C ; G 1782 -U 8061 ; WX 952 ; N uni1F7D ; G 1783 -U 8064 ; WX 770 ; N uni1F80 ; G 1784 -U 8065 ; WX 770 ; N uni1F81 ; G 1785 -U 8066 ; WX 770 ; N uni1F82 ; G 1786 -U 8067 ; WX 770 ; N uni1F83 ; G 1787 -U 8068 ; WX 770 ; N uni1F84 ; G 1788 -U 8069 ; WX 770 ; N uni1F85 ; G 1789 -U 8070 ; WX 770 ; N uni1F86 ; G 1790 -U 8071 ; WX 770 ; N uni1F87 ; G 1791 -U 8072 ; WX 776 ; N uni1F88 ; G 1792 -U 8073 ; WX 776 ; N uni1F89 ; G 1793 -U 8074 ; WX 978 ; N uni1F8A ; G 1794 -U 8075 ; WX 978 ; N uni1F8B ; G 1795 -U 8076 ; WX 832 ; N uni1F8C ; G 1796 -U 8077 ; WX 849 ; N uni1F8D ; G 1797 -U 8078 ; WX 776 ; N uni1F8E ; G 1798 -U 8079 ; WX 776 ; N uni1F8F ; G 1799 -U 8080 ; WX 727 ; N uni1F90 ; G 1800 -U 8081 ; WX 727 ; N uni1F91 ; G 1801 -U 8082 ; WX 727 ; N uni1F92 ; G 1802 -U 8083 ; WX 727 ; N uni1F93 ; G 1803 -U 8084 ; WX 727 ; N uni1F94 ; G 1804 -U 8085 ; WX 727 ; N uni1F95 ; G 1805 -U 8086 ; WX 727 ; N uni1F96 ; G 1806 -U 8087 ; WX 727 ; N uni1F97 ; G 1807 -U 8088 ; WX 1100 ; N uni1F98 ; G 1808 -U 8089 ; WX 1094 ; N uni1F99 ; G 1809 -U 8090 ; WX 1358 ; N uni1F9A ; G 1810 -U 8091 ; WX 1361 ; N uni1F9B ; G 1811 -U 8092 ; WX 1279 ; N uni1F9C ; G 1812 -U 8093 ; WX 1308 ; N uni1F9D ; G 1813 -U 8094 ; WX 1197 ; N uni1F9E ; G 1814 -U 8095 ; WX 1194 ; N uni1F9F ; G 1815 -U 8096 ; WX 952 ; N uni1FA0 ; G 1816 -U 8097 ; WX 952 ; N uni1FA1 ; G 1817 -U 8098 ; WX 952 ; N uni1FA2 ; G 1818 -U 8099 ; WX 952 ; N uni1FA3 ; G 1819 -U 8100 ; WX 952 ; N uni1FA4 ; G 1820 -U 8101 ; WX 952 ; N uni1FA5 ; G 1821 -U 8102 ; WX 952 ; N uni1FA6 ; G 1822 -U 8103 ; WX 952 ; N uni1FA7 ; G 1823 -U 8104 ; WX 931 ; N uni1FA8 ; G 1824 -U 8105 ; WX 963 ; N uni1FA9 ; G 1825 -U 8106 ; WX 1268 ; N uni1FAA ; G 1826 -U 8107 ; WX 1274 ; N uni1FAB ; G 1827 -U 8108 ; WX 1054 ; N uni1FAC ; G 1828 -U 8109 ; WX 1088 ; N uni1FAD ; G 1829 -U 8110 ; WX 1023 ; N uni1FAE ; G 1830 -U 8111 ; WX 1060 ; N uni1FAF ; G 1831 -U 8112 ; WX 770 ; N uni1FB0 ; G 1832 -U 8113 ; WX 770 ; N uni1FB1 ; G 1833 -U 8114 ; WX 770 ; N uni1FB2 ; G 1834 -U 8115 ; WX 770 ; N uni1FB3 ; G 1835 -U 8116 ; WX 770 ; N uni1FB4 ; G 1836 -U 8118 ; WX 770 ; N uni1FB6 ; G 1837 -U 8119 ; WX 770 ; N uni1FB7 ; G 1838 -U 8120 ; WX 776 ; N uni1FB8 ; G 1839 -U 8121 ; WX 776 ; N uni1FB9 ; G 1840 -U 8122 ; WX 811 ; N uni1FBA ; G 1841 -U 8123 ; WX 776 ; N uni1FBB ; G 1842 -U 8124 ; WX 776 ; N uni1FBC ; G 1843 -U 8125 ; WX 500 ; N uni1FBD ; G 1844 -U 8126 ; WX 500 ; N uni1FBE ; G 1845 -U 8127 ; WX 500 ; N uni1FBF ; G 1846 -U 8128 ; WX 500 ; N uni1FC0 ; G 1847 -U 8129 ; WX 500 ; N uni1FC1 ; G 1848 -U 8130 ; WX 727 ; N uni1FC2 ; G 1849 -U 8131 ; WX 727 ; N uni1FC3 ; G 1850 -U 8132 ; WX 727 ; N uni1FC4 ; G 1851 -U 8134 ; WX 727 ; N uni1FC6 ; G 1852 -U 8135 ; WX 727 ; N uni1FC7 ; G 1853 -U 8136 ; WX 1000 ; N uni1FC8 ; G 1854 -U 8137 ; WX 947 ; N uni1FC9 ; G 1855 -U 8138 ; WX 1191 ; N uni1FCA ; G 1856 -U 8139 ; WX 1118 ; N uni1FCB ; G 1857 -U 8140 ; WX 945 ; N uni1FCC ; G 1858 -U 8141 ; WX 500 ; N uni1FCD ; G 1859 -U 8142 ; WX 500 ; N uni1FCE ; G 1860 -U 8143 ; WX 500 ; N uni1FCF ; G 1861 -U 8144 ; WX 484 ; N uni1FD0 ; G 1862 -U 8145 ; WX 484 ; N uni1FD1 ; G 1863 -U 8146 ; WX 484 ; N uni1FD2 ; G 1864 -U 8147 ; WX 484 ; N uni1FD3 ; G 1865 -U 8150 ; WX 484 ; N uni1FD6 ; G 1866 -U 8151 ; WX 484 ; N uni1FD7 ; G 1867 -U 8152 ; WX 468 ; N uni1FD8 ; G 1868 -U 8153 ; WX 468 ; N uni1FD9 ; G 1869 -U 8154 ; WX 714 ; N uni1FDA ; G 1870 -U 8155 ; WX 662 ; N uni1FDB ; G 1871 -U 8157 ; WX 500 ; N uni1FDD ; G 1872 -U 8158 ; WX 500 ; N uni1FDE ; G 1873 -U 8159 ; WX 500 ; N uni1FDF ; G 1874 -U 8160 ; WX 694 ; N uni1FE0 ; G 1875 -U 8161 ; WX 694 ; N uni1FE1 ; G 1876 -U 8162 ; WX 694 ; N uni1FE2 ; G 1877 -U 8163 ; WX 694 ; N uni1FE3 ; G 1878 -U 8164 ; WX 665 ; N uni1FE4 ; G 1879 -U 8165 ; WX 665 ; N uni1FE5 ; G 1880 -U 8166 ; WX 694 ; N uni1FE6 ; G 1881 -U 8167 ; WX 694 ; N uni1FE7 ; G 1882 -U 8168 ; WX 714 ; N uni1FE8 ; G 1883 -U 8169 ; WX 714 ; N uni1FE9 ; G 1884 -U 8170 ; WX 1019 ; N uni1FEA ; G 1885 -U 8171 ; WX 953 ; N uni1FEB ; G 1886 -U 8172 ; WX 910 ; N uni1FEC ; G 1887 -U 8173 ; WX 500 ; N uni1FED ; G 1888 -U 8174 ; WX 500 ; N uni1FEE ; G 1889 -U 8175 ; WX 500 ; N uni1FEF ; G 1890 -U 8178 ; WX 952 ; N uni1FF2 ; G 1891 -U 8179 ; WX 952 ; N uni1FF3 ; G 1892 -U 8180 ; WX 952 ; N uni1FF4 ; G 1893 -U 8182 ; WX 952 ; N uni1FF6 ; G 1894 -U 8183 ; WX 952 ; N uni1FF7 ; G 1895 -U 8184 ; WX 1069 ; N uni1FF8 ; G 1896 -U 8185 ; WX 887 ; N uni1FF9 ; G 1897 -U 8186 ; WX 1101 ; N uni1FFA ; G 1898 -U 8187 ; WX 911 ; N uni1FFB ; G 1899 -U 8188 ; WX 890 ; N uni1FFC ; G 1900 -U 8189 ; WX 500 ; N uni1FFD ; G 1901 -U 8190 ; WX 500 ; N uni1FFE ; G 1902 -U 8192 ; WX 500 ; N uni2000 ; G 1903 -U 8193 ; WX 1000 ; N uni2001 ; G 1904 -U 8194 ; WX 500 ; N uni2002 ; G 1905 -U 8195 ; WX 1000 ; N uni2003 ; G 1906 -U 8196 ; WX 330 ; N uni2004 ; G 1907 -U 8197 ; WX 250 ; N uni2005 ; G 1908 -U 8198 ; WX 167 ; N uni2006 ; G 1909 -U 8199 ; WX 696 ; N uni2007 ; G 1910 -U 8200 ; WX 348 ; N uni2008 ; G 1911 -U 8201 ; WX 200 ; N uni2009 ; G 1912 -U 8202 ; WX 100 ; N uni200A ; G 1913 -U 8203 ; WX 0 ; N uni200B ; G 1914 -U 8204 ; WX 0 ; N uni200C ; G 1915 -U 8205 ; WX 0 ; N uni200D ; G 1916 -U 8206 ; WX 0 ; N uni200E ; G 1917 -U 8207 ; WX 0 ; N uni200F ; G 1918 -U 8208 ; WX 415 ; N uni2010 ; G 1919 -U 8209 ; WX 415 ; N uni2011 ; G 1920 -U 8210 ; WX 696 ; N figuredash ; G 1921 -U 8211 ; WX 500 ; N endash ; G 1922 -U 8212 ; WX 1000 ; N emdash ; G 1923 -U 8213 ; WX 1000 ; N uni2015 ; G 1924 -U 8214 ; WX 500 ; N uni2016 ; G 1925 -U 8215 ; WX 500 ; N underscoredbl ; G 1926 -U 8216 ; WX 348 ; N quoteleft ; G 1927 -U 8217 ; WX 348 ; N quoteright ; G 1928 -U 8218 ; WX 348 ; N quotesinglbase ; G 1929 -U 8219 ; WX 348 ; N quotereversed ; G 1930 -U 8220 ; WX 575 ; N quotedblleft ; G 1931 -U 8221 ; WX 575 ; N quotedblright ; G 1932 -U 8222 ; WX 575 ; N quotedblbase ; G 1933 -U 8223 ; WX 575 ; N uni201F ; G 1934 -U 8224 ; WX 523 ; N dagger ; G 1935 -U 8225 ; WX 523 ; N daggerdbl ; G 1936 -U 8226 ; WX 639 ; N bullet ; G 1937 -U 8227 ; WX 639 ; N uni2023 ; G 1938 -U 8228 ; WX 348 ; N onedotenleader ; G 1939 -U 8229 ; WX 674 ; N twodotenleader ; G 1940 -U 8230 ; WX 1000 ; N ellipsis ; G 1941 -U 8234 ; WX 0 ; N uni202A ; G 1942 -U 8235 ; WX 0 ; N uni202B ; G 1943 -U 8236 ; WX 0 ; N uni202C ; G 1944 -U 8237 ; WX 0 ; N uni202D ; G 1945 -U 8238 ; WX 0 ; N uni202E ; G 1946 -U 8239 ; WX 200 ; N uni202F ; G 1947 -U 8240 ; WX 1385 ; N perthousand ; G 1948 -U 8241 ; WX 1813 ; N uni2031 ; G 1949 -U 8242 ; WX 264 ; N minute ; G 1950 -U 8243 ; WX 447 ; N second ; G 1951 -U 8244 ; WX 630 ; N uni2034 ; G 1952 -U 8245 ; WX 264 ; N uni2035 ; G 1953 -U 8246 ; WX 447 ; N uni2036 ; G 1954 -U 8247 ; WX 630 ; N uni2037 ; G 1955 -U 8248 ; WX 733 ; N uni2038 ; G 1956 -U 8249 ; WX 400 ; N guilsinglleft ; G 1957 -U 8250 ; WX 400 ; N guilsinglright ; G 1958 -U 8252 ; WX 629 ; N exclamdbl ; G 1959 -U 8253 ; WX 586 ; N uni203D ; G 1960 -U 8254 ; WX 500 ; N uni203E ; G 1961 -U 8258 ; WX 1023 ; N uni2042 ; G 1962 -U 8260 ; WX 167 ; N fraction ; G 1963 -U 8261 ; WX 473 ; N uni2045 ; G 1964 -U 8262 ; WX 473 ; N uni2046 ; G 1965 -U 8263 ; WX 1082 ; N uni2047 ; G 1966 -U 8264 ; WX 856 ; N uni2048 ; G 1967 -U 8265 ; WX 856 ; N uni2049 ; G 1968 -U 8267 ; WX 636 ; N uni204B ; G 1969 -U 8268 ; WX 500 ; N uni204C ; G 1970 -U 8269 ; WX 500 ; N uni204D ; G 1971 -U 8270 ; WX 523 ; N uni204E ; G 1972 -U 8271 ; WX 369 ; N uni204F ; G 1973 -U 8273 ; WX 523 ; N uni2051 ; G 1974 -U 8274 ; WX 556 ; N uni2052 ; G 1975 -U 8275 ; WX 1000 ; N uni2053 ; G 1976 -U 8279 ; WX 813 ; N uni2057 ; G 1977 -U 8287 ; WX 222 ; N uni205F ; G 1978 -U 8288 ; WX 0 ; N uni2060 ; G 1979 -U 8289 ; WX 0 ; N uni2061 ; G 1980 -U 8290 ; WX 0 ; N uni2062 ; G 1981 -U 8291 ; WX 0 ; N uni2063 ; G 1982 -U 8292 ; WX 0 ; N uni2064 ; G 1983 -U 8298 ; WX 0 ; N uni206A ; G 1984 -U 8299 ; WX 0 ; N uni206B ; G 1985 -U 8300 ; WX 0 ; N uni206C ; G 1986 -U 8301 ; WX 0 ; N uni206D ; G 1987 -U 8302 ; WX 0 ; N uni206E ; G 1988 -U 8303 ; WX 0 ; N uni206F ; G 1989 -U 8304 ; WX 438 ; N uni2070 ; G 1990 -U 8305 ; WX 239 ; N uni2071 ; G 1991 -U 8308 ; WX 438 ; N uni2074 ; G 1992 -U 8309 ; WX 438 ; N uni2075 ; G 1993 -U 8310 ; WX 438 ; N uni2076 ; G 1994 -U 8311 ; WX 438 ; N uni2077 ; G 1995 -U 8312 ; WX 438 ; N uni2078 ; G 1996 -U 8313 ; WX 438 ; N uni2079 ; G 1997 -U 8314 ; WX 528 ; N uni207A ; G 1998 -U 8315 ; WX 528 ; N uni207B ; G 1999 -U 8316 ; WX 528 ; N uni207C ; G 2000 -U 8317 ; WX 298 ; N uni207D ; G 2001 -U 8318 ; WX 298 ; N uni207E ; G 2002 -U 8319 ; WX 458 ; N uni207F ; G 2003 -U 8320 ; WX 438 ; N uni2080 ; G 2004 -U 8321 ; WX 438 ; N uni2081 ; G 2005 -U 8322 ; WX 438 ; N uni2082 ; G 2006 -U 8323 ; WX 438 ; N uni2083 ; G 2007 -U 8324 ; WX 438 ; N uni2084 ; G 2008 -U 8325 ; WX 438 ; N uni2085 ; G 2009 -U 8326 ; WX 438 ; N uni2086 ; G 2010 -U 8327 ; WX 438 ; N uni2087 ; G 2011 -U 8328 ; WX 438 ; N uni2088 ; G 2012 -U 8329 ; WX 438 ; N uni2089 ; G 2013 -U 8330 ; WX 528 ; N uni208A ; G 2014 -U 8331 ; WX 528 ; N uni208B ; G 2015 -U 8332 ; WX 528 ; N uni208C ; G 2016 -U 8333 ; WX 298 ; N uni208D ; G 2017 -U 8334 ; WX 298 ; N uni208E ; G 2018 -U 8336 ; WX 408 ; N uni2090 ; G 2019 -U 8337 ; WX 444 ; N uni2091 ; G 2020 -U 8338 ; WX 467 ; N uni2092 ; G 2021 -U 8339 ; WX 375 ; N uni2093 ; G 2022 -U 8340 ; WX 444 ; N uni2094 ; G 2023 -U 8341 ; WX 521 ; N uni2095 ; G 2024 -U 8342 ; WX 523 ; N uni2096 ; G 2025 -U 8343 ; WX 292 ; N uni2097 ; G 2026 -U 8344 ; WX 729 ; N uni2098 ; G 2027 -U 8345 ; WX 458 ; N uni2099 ; G 2028 -U 8346 ; WX 499 ; N uni209A ; G 2029 -U 8347 ; WX 395 ; N uni209B ; G 2030 -U 8348 ; WX 371 ; N uni209C ; G 2031 -U 8358 ; WX 696 ; N uni20A6 ; G 2032 -U 8364 ; WX 696 ; N Euro ; G 2033 -U 8367 ; WX 1155 ; N uni20AF ; G 2034 -U 8369 ; WX 790 ; N uni20B1 ; G 2035 -U 8372 ; WX 876 ; N uni20B4 ; G 2036 -U 8373 ; WX 696 ; N uni20B5 ; G 2037 -U 8376 ; WX 696 ; N uni20B8 ; G 2038 -U 8377 ; WX 696 ; N uni20B9 ; G 2039 -U 8378 ; WX 696 ; N uni20BA ; G 2040 -U 8381 ; WX 696 ; N uni20BD ; G 2041 -U 8451 ; WX 1198 ; N uni2103 ; G 2042 -U 8457 ; WX 1112 ; N uni2109 ; G 2043 -U 8462 ; WX 727 ; N uni210E ; G 2044 -U 8463 ; WX 727 ; N uni210F ; G 2045 -U 8470 ; WX 1087 ; N uni2116 ; G 2046 -U 8482 ; WX 1000 ; N trademark ; G 2047 -U 8486 ; WX 890 ; N uni2126 ; G 2048 -U 8487 ; WX 890 ; N uni2127 ; G 2049 -U 8490 ; WX 869 ; N uni212A ; G 2050 -U 8491 ; WX 776 ; N uni212B ; G 2051 -U 8498 ; WX 710 ; N uni2132 ; G 2052 -U 8513 ; WX 786 ; N uni2141 ; G 2053 -U 8514 ; WX 576 ; N uni2142 ; G 2054 -U 8515 ; WX 637 ; N uni2143 ; G 2055 -U 8516 ; WX 760 ; N uni2144 ; G 2056 -U 8523 ; WX 903 ; N uni214B ; G 2057 -U 8526 ; WX 592 ; N uni214E ; G 2058 -U 8528 ; WX 1035 ; N uni2150 ; G 2059 -U 8529 ; WX 1035 ; N uni2151 ; G 2060 -U 8530 ; WX 1473 ; N uni2152 ; G 2061 -U 8531 ; WX 1035 ; N onethird ; G 2062 -U 8532 ; WX 1035 ; N twothirds ; G 2063 -U 8533 ; WX 1035 ; N uni2155 ; G 2064 -U 8534 ; WX 1035 ; N uni2156 ; G 2065 -U 8535 ; WX 1035 ; N uni2157 ; G 2066 -U 8536 ; WX 1035 ; N uni2158 ; G 2067 -U 8537 ; WX 1035 ; N uni2159 ; G 2068 -U 8538 ; WX 1035 ; N uni215A ; G 2069 -U 8539 ; WX 1035 ; N oneeighth ; G 2070 -U 8540 ; WX 1035 ; N threeeighths ; G 2071 -U 8541 ; WX 1035 ; N fiveeighths ; G 2072 -U 8542 ; WX 1035 ; N seveneighths ; G 2073 -U 8543 ; WX 615 ; N uni215F ; G 2074 -U 8544 ; WX 468 ; N uni2160 ; G 2075 -U 8545 ; WX 843 ; N uni2161 ; G 2076 -U 8546 ; WX 1218 ; N uni2162 ; G 2077 -U 8547 ; WX 1135 ; N uni2163 ; G 2078 -U 8548 ; WX 776 ; N uni2164 ; G 2079 -U 8549 ; WX 1150 ; N uni2165 ; G 2080 -U 8550 ; WX 1525 ; N uni2166 ; G 2081 -U 8551 ; WX 1900 ; N uni2167 ; G 2082 -U 8552 ; WX 1126 ; N uni2168 ; G 2083 -U 8553 ; WX 776 ; N uni2169 ; G 2084 -U 8554 ; WX 1127 ; N uni216A ; G 2085 -U 8555 ; WX 1502 ; N uni216B ; G 2086 -U 8556 ; WX 703 ; N uni216C ; G 2087 -U 8557 ; WX 796 ; N uni216D ; G 2088 -U 8558 ; WX 867 ; N uni216E ; G 2089 -U 8559 ; WX 1107 ; N uni216F ; G 2090 -U 8560 ; WX 380 ; N uni2170 ; G 2091 -U 8561 ; WX 760 ; N uni2171 ; G 2092 -U 8562 ; WX 1140 ; N uni2172 ; G 2093 -U 8563 ; WX 961 ; N uni2173 ; G 2094 -U 8564 ; WX 581 ; N uni2174 ; G 2095 -U 8565 ; WX 961 ; N uni2175 ; G 2096 -U 8566 ; WX 1341 ; N uni2176 ; G 2097 -U 8567 ; WX 1721 ; N uni2177 ; G 2098 -U 8568 ; WX 976 ; N uni2178 ; G 2099 -U 8569 ; WX 596 ; N uni2179 ; G 2100 -U 8570 ; WX 976 ; N uni217A ; G 2101 -U 8571 ; WX 1356 ; N uni217B ; G 2102 -U 8572 ; WX 380 ; N uni217C ; G 2103 -U 8573 ; WX 609 ; N uni217D ; G 2104 -U 8574 ; WX 699 ; N uni217E ; G 2105 -U 8575 ; WX 1058 ; N uni217F ; G 2106 -U 8576 ; WX 1255 ; N uni2180 ; G 2107 -U 8577 ; WX 867 ; N uni2181 ; G 2108 -U 8578 ; WX 1268 ; N uni2182 ; G 2109 -U 8579 ; WX 796 ; N uni2183 ; G 2110 -U 8580 ; WX 609 ; N uni2184 ; G 2111 -U 8581 ; WX 796 ; N uni2185 ; G 2112 -U 8585 ; WX 1035 ; N uni2189 ; G 2113 -U 8592 ; WX 838 ; N arrowleft ; G 2114 -U 8593 ; WX 838 ; N arrowup ; G 2115 -U 8594 ; WX 838 ; N arrowright ; G 2116 -U 8595 ; WX 838 ; N arrowdown ; G 2117 -U 8596 ; WX 838 ; N arrowboth ; G 2118 -U 8597 ; WX 838 ; N arrowupdn ; G 2119 -U 8598 ; WX 838 ; N uni2196 ; G 2120 -U 8599 ; WX 838 ; N uni2197 ; G 2121 -U 8600 ; WX 838 ; N uni2198 ; G 2122 -U 8601 ; WX 838 ; N uni2199 ; G 2123 -U 8602 ; WX 838 ; N uni219A ; G 2124 -U 8603 ; WX 838 ; N uni219B ; G 2125 -U 8604 ; WX 838 ; N uni219C ; G 2126 -U 8605 ; WX 838 ; N uni219D ; G 2127 -U 8606 ; WX 838 ; N uni219E ; G 2128 -U 8607 ; WX 838 ; N uni219F ; G 2129 -U 8608 ; WX 838 ; N uni21A0 ; G 2130 -U 8609 ; WX 838 ; N uni21A1 ; G 2131 -U 8610 ; WX 838 ; N uni21A2 ; G 2132 -U 8611 ; WX 838 ; N uni21A3 ; G 2133 -U 8612 ; WX 838 ; N uni21A4 ; G 2134 -U 8613 ; WX 838 ; N uni21A5 ; G 2135 -U 8614 ; WX 838 ; N uni21A6 ; G 2136 -U 8615 ; WX 838 ; N uni21A7 ; G 2137 -U 8616 ; WX 838 ; N arrowupdnbse ; G 2138 -U 8617 ; WX 838 ; N uni21A9 ; G 2139 -U 8618 ; WX 838 ; N uni21AA ; G 2140 -U 8619 ; WX 838 ; N uni21AB ; G 2141 -U 8620 ; WX 838 ; N uni21AC ; G 2142 -U 8621 ; WX 838 ; N uni21AD ; G 2143 -U 8622 ; WX 838 ; N uni21AE ; G 2144 -U 8623 ; WX 850 ; N uni21AF ; G 2145 -U 8624 ; WX 838 ; N uni21B0 ; G 2146 -U 8625 ; WX 838 ; N uni21B1 ; G 2147 -U 8626 ; WX 838 ; N uni21B2 ; G 2148 -U 8627 ; WX 838 ; N uni21B3 ; G 2149 -U 8628 ; WX 838 ; N uni21B4 ; G 2150 -U 8629 ; WX 838 ; N carriagereturn ; G 2151 -U 8630 ; WX 838 ; N uni21B6 ; G 2152 -U 8631 ; WX 838 ; N uni21B7 ; G 2153 -U 8632 ; WX 838 ; N uni21B8 ; G 2154 -U 8633 ; WX 838 ; N uni21B9 ; G 2155 -U 8634 ; WX 838 ; N uni21BA ; G 2156 -U 8635 ; WX 838 ; N uni21BB ; G 2157 -U 8636 ; WX 838 ; N uni21BC ; G 2158 -U 8637 ; WX 838 ; N uni21BD ; G 2159 -U 8638 ; WX 838 ; N uni21BE ; G 2160 -U 8639 ; WX 838 ; N uni21BF ; G 2161 -U 8640 ; WX 838 ; N uni21C0 ; G 2162 -U 8641 ; WX 838 ; N uni21C1 ; G 2163 -U 8642 ; WX 838 ; N uni21C2 ; G 2164 -U 8643 ; WX 838 ; N uni21C3 ; G 2165 -U 8644 ; WX 838 ; N uni21C4 ; G 2166 -U 8645 ; WX 838 ; N uni21C5 ; G 2167 -U 8646 ; WX 838 ; N uni21C6 ; G 2168 -U 8647 ; WX 838 ; N uni21C7 ; G 2169 -U 8648 ; WX 838 ; N uni21C8 ; G 2170 -U 8649 ; WX 838 ; N uni21C9 ; G 2171 -U 8650 ; WX 838 ; N uni21CA ; G 2172 -U 8651 ; WX 838 ; N uni21CB ; G 2173 -U 8652 ; WX 838 ; N uni21CC ; G 2174 -U 8653 ; WX 838 ; N uni21CD ; G 2175 -U 8654 ; WX 838 ; N uni21CE ; G 2176 -U 8655 ; WX 838 ; N uni21CF ; G 2177 -U 8656 ; WX 838 ; N arrowdblleft ; G 2178 -U 8657 ; WX 838 ; N arrowdblup ; G 2179 -U 8658 ; WX 838 ; N arrowdblright ; G 2180 -U 8659 ; WX 838 ; N arrowdbldown ; G 2181 -U 8660 ; WX 838 ; N arrowdblboth ; G 2182 -U 8661 ; WX 838 ; N uni21D5 ; G 2183 -U 8662 ; WX 838 ; N uni21D6 ; G 2184 -U 8663 ; WX 838 ; N uni21D7 ; G 2185 -U 8664 ; WX 838 ; N uni21D8 ; G 2186 -U 8665 ; WX 838 ; N uni21D9 ; G 2187 -U 8666 ; WX 838 ; N uni21DA ; G 2188 -U 8667 ; WX 838 ; N uni21DB ; G 2189 -U 8668 ; WX 838 ; N uni21DC ; G 2190 -U 8669 ; WX 838 ; N uni21DD ; G 2191 -U 8670 ; WX 838 ; N uni21DE ; G 2192 -U 8671 ; WX 838 ; N uni21DF ; G 2193 -U 8672 ; WX 838 ; N uni21E0 ; G 2194 -U 8673 ; WX 838 ; N uni21E1 ; G 2195 -U 8674 ; WX 838 ; N uni21E2 ; G 2196 -U 8675 ; WX 838 ; N uni21E3 ; G 2197 -U 8676 ; WX 838 ; N uni21E4 ; G 2198 -U 8677 ; WX 838 ; N uni21E5 ; G 2199 -U 8678 ; WX 838 ; N uni21E6 ; G 2200 -U 8679 ; WX 838 ; N uni21E7 ; G 2201 -U 8680 ; WX 838 ; N uni21E8 ; G 2202 -U 8681 ; WX 838 ; N uni21E9 ; G 2203 -U 8682 ; WX 838 ; N uni21EA ; G 2204 -U 8683 ; WX 838 ; N uni21EB ; G 2205 -U 8684 ; WX 838 ; N uni21EC ; G 2206 -U 8685 ; WX 838 ; N uni21ED ; G 2207 -U 8686 ; WX 838 ; N uni21EE ; G 2208 -U 8687 ; WX 838 ; N uni21EF ; G 2209 -U 8688 ; WX 838 ; N uni21F0 ; G 2210 -U 8689 ; WX 838 ; N uni21F1 ; G 2211 -U 8690 ; WX 838 ; N uni21F2 ; G 2212 -U 8691 ; WX 838 ; N uni21F3 ; G 2213 -U 8692 ; WX 838 ; N uni21F4 ; G 2214 -U 8693 ; WX 838 ; N uni21F5 ; G 2215 -U 8694 ; WX 838 ; N uni21F6 ; G 2216 -U 8695 ; WX 838 ; N uni21F7 ; G 2217 -U 8696 ; WX 838 ; N uni21F8 ; G 2218 -U 8697 ; WX 838 ; N uni21F9 ; G 2219 -U 8698 ; WX 838 ; N uni21FA ; G 2220 -U 8699 ; WX 838 ; N uni21FB ; G 2221 -U 8700 ; WX 838 ; N uni21FC ; G 2222 -U 8701 ; WX 838 ; N uni21FD ; G 2223 -U 8702 ; WX 838 ; N uni21FE ; G 2224 -U 8703 ; WX 838 ; N uni21FF ; G 2225 -U 8704 ; WX 641 ; N universal ; G 2226 -U 8706 ; WX 534 ; N partialdiff ; G 2227 -U 8707 ; WX 620 ; N existential ; G 2228 -U 8708 ; WX 620 ; N uni2204 ; G 2229 -U 8710 ; WX 753 ; N increment ; G 2230 -U 8711 ; WX 753 ; N gradient ; G 2231 -U 8712 ; WX 740 ; N element ; G 2232 -U 8713 ; WX 740 ; N notelement ; G 2233 -U 8715 ; WX 740 ; N suchthat ; G 2234 -U 8716 ; WX 740 ; N uni220C ; G 2235 -U 8719 ; WX 842 ; N product ; G 2236 -U 8720 ; WX 842 ; N uni2210 ; G 2237 -U 8721 ; WX 753 ; N summation ; G 2238 -U 8722 ; WX 838 ; N minus ; G 2239 -U 8723 ; WX 838 ; N uni2213 ; G 2240 -U 8724 ; WX 838 ; N uni2214 ; G 2241 -U 8725 ; WX 365 ; N uni2215 ; G 2242 -U 8727 ; WX 691 ; N asteriskmath ; G 2243 -U 8728 ; WX 519 ; N uni2218 ; G 2244 -U 8729 ; WX 519 ; N uni2219 ; G 2245 -U 8730 ; WX 657 ; N radical ; G 2246 -U 8731 ; WX 657 ; N uni221B ; G 2247 -U 8732 ; WX 657 ; N uni221C ; G 2248 -U 8733 ; WX 672 ; N proportional ; G 2249 -U 8734 ; WX 833 ; N infinity ; G 2250 -U 8735 ; WX 838 ; N orthogonal ; G 2251 -U 8736 ; WX 838 ; N angle ; G 2252 -U 8739 ; WX 324 ; N uni2223 ; G 2253 -U 8740 ; WX 607 ; N uni2224 ; G 2254 -U 8741 ; WX 529 ; N uni2225 ; G 2255 -U 8742 ; WX 773 ; N uni2226 ; G 2256 -U 8743 ; WX 812 ; N logicaland ; G 2257 -U 8744 ; WX 812 ; N logicalor ; G 2258 -U 8745 ; WX 838 ; N intersection ; G 2259 -U 8746 ; WX 838 ; N union ; G 2260 -U 8747 ; WX 579 ; N integral ; G 2261 -U 8748 ; WX 1000 ; N uni222C ; G 2262 -U 8749 ; WX 1391 ; N uni222D ; G 2263 -U 8760 ; WX 838 ; N uni2238 ; G 2264 -U 8761 ; WX 838 ; N uni2239 ; G 2265 -U 8762 ; WX 838 ; N uni223A ; G 2266 -U 8763 ; WX 838 ; N uni223B ; G 2267 -U 8764 ; WX 838 ; N similar ; G 2268 -U 8765 ; WX 838 ; N uni223D ; G 2269 -U 8770 ; WX 838 ; N uni2242 ; G 2270 -U 8771 ; WX 838 ; N uni2243 ; G 2271 -U 8776 ; WX 838 ; N approxequal ; G 2272 -U 8784 ; WX 838 ; N uni2250 ; G 2273 -U 8785 ; WX 838 ; N uni2251 ; G 2274 -U 8786 ; WX 838 ; N uni2252 ; G 2275 -U 8787 ; WX 838 ; N uni2253 ; G 2276 -U 8788 ; WX 1082 ; N uni2254 ; G 2277 -U 8789 ; WX 1082 ; N uni2255 ; G 2278 -U 8800 ; WX 838 ; N notequal ; G 2279 -U 8801 ; WX 838 ; N equivalence ; G 2280 -U 8804 ; WX 838 ; N lessequal ; G 2281 -U 8805 ; WX 838 ; N greaterequal ; G 2282 -U 8834 ; WX 838 ; N propersubset ; G 2283 -U 8835 ; WX 838 ; N propersuperset ; G 2284 -U 8836 ; WX 838 ; N notsubset ; G 2285 -U 8837 ; WX 838 ; N uni2285 ; G 2286 -U 8838 ; WX 838 ; N reflexsubset ; G 2287 -U 8839 ; WX 838 ; N reflexsuperset ; G 2288 -U 8844 ; WX 838 ; N uni228C ; G 2289 -U 8845 ; WX 838 ; N uni228D ; G 2290 -U 8846 ; WX 838 ; N uni228E ; G 2291 -U 8847 ; WX 838 ; N uni228F ; G 2292 -U 8848 ; WX 838 ; N uni2290 ; G 2293 -U 8849 ; WX 838 ; N uni2291 ; G 2294 -U 8850 ; WX 838 ; N uni2292 ; G 2295 -U 8851 ; WX 838 ; N uni2293 ; G 2296 -U 8852 ; WX 838 ; N uni2294 ; G 2297 -U 8853 ; WX 838 ; N circleplus ; G 2298 -U 8854 ; WX 838 ; N uni2296 ; G 2299 -U 8855 ; WX 838 ; N circlemultiply ; G 2300 -U 8856 ; WX 838 ; N uni2298 ; G 2301 -U 8857 ; WX 838 ; N uni2299 ; G 2302 -U 8858 ; WX 838 ; N uni229A ; G 2303 -U 8859 ; WX 838 ; N uni229B ; G 2304 -U 8860 ; WX 838 ; N uni229C ; G 2305 -U 8861 ; WX 838 ; N uni229D ; G 2306 -U 8862 ; WX 838 ; N uni229E ; G 2307 -U 8863 ; WX 838 ; N uni229F ; G 2308 -U 8864 ; WX 838 ; N uni22A0 ; G 2309 -U 8865 ; WX 838 ; N uni22A1 ; G 2310 -U 8866 ; WX 884 ; N uni22A2 ; G 2311 -U 8867 ; WX 884 ; N uni22A3 ; G 2312 -U 8868 ; WX 960 ; N uni22A4 ; G 2313 -U 8869 ; WX 960 ; N perpendicular ; G 2314 -U 8870 ; WX 616 ; N uni22A6 ; G 2315 -U 8871 ; WX 616 ; N uni22A7 ; G 2316 -U 8872 ; WX 884 ; N uni22A8 ; G 2317 -U 8873 ; WX 884 ; N uni22A9 ; G 2318 -U 8874 ; WX 884 ; N uni22AA ; G 2319 -U 8875 ; WX 1080 ; N uni22AB ; G 2320 -U 8876 ; WX 884 ; N uni22AC ; G 2321 -U 8877 ; WX 884 ; N uni22AD ; G 2322 -U 8878 ; WX 884 ; N uni22AE ; G 2323 -U 8879 ; WX 1080 ; N uni22AF ; G 2324 -U 8900 ; WX 626 ; N uni22C4 ; G 2325 -U 8901 ; WX 398 ; N dotmath ; G 2326 -U 8962 ; WX 834 ; N house ; G 2327 -U 8968 ; WX 473 ; N uni2308 ; G 2328 -U 8969 ; WX 473 ; N uni2309 ; G 2329 -U 8970 ; WX 473 ; N uni230A ; G 2330 -U 8971 ; WX 473 ; N uni230B ; G 2331 -U 8976 ; WX 838 ; N revlogicalnot ; G 2332 -U 8977 ; WX 539 ; N uni2311 ; G 2333 -U 8984 ; WX 928 ; N uni2318 ; G 2334 -U 8985 ; WX 838 ; N uni2319 ; G 2335 -U 8992 ; WX 579 ; N integraltp ; G 2336 -U 8993 ; WX 579 ; N integralbt ; G 2337 -U 8997 ; WX 1000 ; N uni2325 ; G 2338 -U 9000 ; WX 1443 ; N uni2328 ; G 2339 -U 9085 ; WX 1008 ; N uni237D ; G 2340 -U 9115 ; WX 500 ; N uni239B ; G 2341 -U 9116 ; WX 500 ; N uni239C ; G 2342 -U 9117 ; WX 500 ; N uni239D ; G 2343 -U 9118 ; WX 500 ; N uni239E ; G 2344 -U 9119 ; WX 500 ; N uni239F ; G 2345 -U 9120 ; WX 500 ; N uni23A0 ; G 2346 -U 9121 ; WX 500 ; N uni23A1 ; G 2347 -U 9122 ; WX 500 ; N uni23A2 ; G 2348 -U 9123 ; WX 500 ; N uni23A3 ; G 2349 -U 9124 ; WX 500 ; N uni23A4 ; G 2350 -U 9125 ; WX 500 ; N uni23A5 ; G 2351 -U 9126 ; WX 500 ; N uni23A6 ; G 2352 -U 9127 ; WX 750 ; N uni23A7 ; G 2353 -U 9128 ; WX 750 ; N uni23A8 ; G 2354 -U 9129 ; WX 750 ; N uni23A9 ; G 2355 -U 9130 ; WX 750 ; N uni23AA ; G 2356 -U 9131 ; WX 750 ; N uni23AB ; G 2357 -U 9132 ; WX 750 ; N uni23AC ; G 2358 -U 9133 ; WX 750 ; N uni23AD ; G 2359 -U 9134 ; WX 579 ; N uni23AE ; G 2360 -U 9167 ; WX 945 ; N uni23CF ; G 2361 -U 9251 ; WX 834 ; N uni2423 ; G 2362 -U 9472 ; WX 602 ; N SF100000 ; G 2363 -U 9473 ; WX 602 ; N uni2501 ; G 2364 -U 9474 ; WX 602 ; N SF110000 ; G 2365 -U 9475 ; WX 602 ; N uni2503 ; G 2366 -U 9476 ; WX 602 ; N uni2504 ; G 2367 -U 9477 ; WX 602 ; N uni2505 ; G 2368 -U 9478 ; WX 602 ; N uni2506 ; G 2369 -U 9479 ; WX 602 ; N uni2507 ; G 2370 -U 9480 ; WX 602 ; N uni2508 ; G 2371 -U 9481 ; WX 602 ; N uni2509 ; G 2372 -U 9482 ; WX 602 ; N uni250A ; G 2373 -U 9483 ; WX 602 ; N uni250B ; G 2374 -U 9484 ; WX 602 ; N SF010000 ; G 2375 -U 9485 ; WX 602 ; N uni250D ; G 2376 -U 9486 ; WX 602 ; N uni250E ; G 2377 -U 9487 ; WX 602 ; N uni250F ; G 2378 -U 9488 ; WX 602 ; N SF030000 ; G 2379 -U 9489 ; WX 602 ; N uni2511 ; G 2380 -U 9490 ; WX 602 ; N uni2512 ; G 2381 -U 9491 ; WX 602 ; N uni2513 ; G 2382 -U 9492 ; WX 602 ; N SF020000 ; G 2383 -U 9493 ; WX 602 ; N uni2515 ; G 2384 -U 9494 ; WX 602 ; N uni2516 ; G 2385 -U 9495 ; WX 602 ; N uni2517 ; G 2386 -U 9496 ; WX 602 ; N SF040000 ; G 2387 -U 9497 ; WX 602 ; N uni2519 ; G 2388 -U 9498 ; WX 602 ; N uni251A ; G 2389 -U 9499 ; WX 602 ; N uni251B ; G 2390 -U 9500 ; WX 602 ; N SF080000 ; G 2391 -U 9501 ; WX 602 ; N uni251D ; G 2392 -U 9502 ; WX 602 ; N uni251E ; G 2393 -U 9503 ; WX 602 ; N uni251F ; G 2394 -U 9504 ; WX 602 ; N uni2520 ; G 2395 -U 9505 ; WX 602 ; N uni2521 ; G 2396 -U 9506 ; WX 602 ; N uni2522 ; G 2397 -U 9507 ; WX 602 ; N uni2523 ; G 2398 -U 9508 ; WX 602 ; N SF090000 ; G 2399 -U 9509 ; WX 602 ; N uni2525 ; G 2400 -U 9510 ; WX 602 ; N uni2526 ; G 2401 -U 9511 ; WX 602 ; N uni2527 ; G 2402 -U 9512 ; WX 602 ; N uni2528 ; G 2403 -U 9513 ; WX 602 ; N uni2529 ; G 2404 -U 9514 ; WX 602 ; N uni252A ; G 2405 -U 9515 ; WX 602 ; N uni252B ; G 2406 -U 9516 ; WX 602 ; N SF060000 ; G 2407 -U 9517 ; WX 602 ; N uni252D ; G 2408 -U 9518 ; WX 602 ; N uni252E ; G 2409 -U 9519 ; WX 602 ; N uni252F ; G 2410 -U 9520 ; WX 602 ; N uni2530 ; G 2411 -U 9521 ; WX 602 ; N uni2531 ; G 2412 -U 9522 ; WX 602 ; N uni2532 ; G 2413 -U 9523 ; WX 602 ; N uni2533 ; G 2414 -U 9524 ; WX 602 ; N SF070000 ; G 2415 -U 9525 ; WX 602 ; N uni2535 ; G 2416 -U 9526 ; WX 602 ; N uni2536 ; G 2417 -U 9527 ; WX 602 ; N uni2537 ; G 2418 -U 9528 ; WX 602 ; N uni2538 ; G 2419 -U 9529 ; WX 602 ; N uni2539 ; G 2420 -U 9530 ; WX 602 ; N uni253A ; G 2421 -U 9531 ; WX 602 ; N uni253B ; G 2422 -U 9532 ; WX 602 ; N SF050000 ; G 2423 -U 9533 ; WX 602 ; N uni253D ; G 2424 -U 9534 ; WX 602 ; N uni253E ; G 2425 -U 9535 ; WX 602 ; N uni253F ; G 2426 -U 9536 ; WX 602 ; N uni2540 ; G 2427 -U 9537 ; WX 602 ; N uni2541 ; G 2428 -U 9538 ; WX 602 ; N uni2542 ; G 2429 -U 9539 ; WX 602 ; N uni2543 ; G 2430 -U 9540 ; WX 602 ; N uni2544 ; G 2431 -U 9541 ; WX 602 ; N uni2545 ; G 2432 -U 9542 ; WX 602 ; N uni2546 ; G 2433 -U 9543 ; WX 602 ; N uni2547 ; G 2434 -U 9544 ; WX 602 ; N uni2548 ; G 2435 -U 9545 ; WX 602 ; N uni2549 ; G 2436 -U 9546 ; WX 602 ; N uni254A ; G 2437 -U 9547 ; WX 602 ; N uni254B ; G 2438 -U 9548 ; WX 602 ; N uni254C ; G 2439 -U 9549 ; WX 602 ; N uni254D ; G 2440 -U 9550 ; WX 602 ; N uni254E ; G 2441 -U 9551 ; WX 602 ; N uni254F ; G 2442 -U 9552 ; WX 602 ; N SF430000 ; G 2443 -U 9553 ; WX 602 ; N SF240000 ; G 2444 -U 9554 ; WX 602 ; N SF510000 ; G 2445 -U 9555 ; WX 602 ; N SF520000 ; G 2446 -U 9556 ; WX 602 ; N SF390000 ; G 2447 -U 9557 ; WX 602 ; N SF220000 ; G 2448 -U 9558 ; WX 602 ; N SF210000 ; G 2449 -U 9559 ; WX 602 ; N SF250000 ; G 2450 -U 9560 ; WX 602 ; N SF500000 ; G 2451 -U 9561 ; WX 602 ; N SF490000 ; G 2452 -U 9562 ; WX 602 ; N SF380000 ; G 2453 -U 9563 ; WX 602 ; N SF280000 ; G 2454 -U 9564 ; WX 602 ; N SF270000 ; G 2455 -U 9565 ; WX 602 ; N SF260000 ; G 2456 -U 9566 ; WX 602 ; N SF360000 ; G 2457 -U 9567 ; WX 602 ; N SF370000 ; G 2458 -U 9568 ; WX 602 ; N SF420000 ; G 2459 -U 9569 ; WX 602 ; N SF190000 ; G 2460 -U 9570 ; WX 602 ; N SF200000 ; G 2461 -U 9571 ; WX 602 ; N SF230000 ; G 2462 -U 9572 ; WX 602 ; N SF470000 ; G 2463 -U 9573 ; WX 602 ; N SF480000 ; G 2464 -U 9574 ; WX 602 ; N SF410000 ; G 2465 -U 9575 ; WX 602 ; N SF450000 ; G 2466 -U 9576 ; WX 602 ; N SF460000 ; G 2467 -U 9577 ; WX 602 ; N SF400000 ; G 2468 -U 9578 ; WX 602 ; N SF540000 ; G 2469 -U 9579 ; WX 602 ; N SF530000 ; G 2470 -U 9580 ; WX 602 ; N SF440000 ; G 2471 -U 9581 ; WX 602 ; N uni256D ; G 2472 -U 9582 ; WX 602 ; N uni256E ; G 2473 -U 9583 ; WX 602 ; N uni256F ; G 2474 -U 9584 ; WX 602 ; N uni2570 ; G 2475 -U 9585 ; WX 602 ; N uni2571 ; G 2476 -U 9586 ; WX 602 ; N uni2572 ; G 2477 -U 9587 ; WX 602 ; N uni2573 ; G 2478 -U 9588 ; WX 602 ; N uni2574 ; G 2479 -U 9589 ; WX 602 ; N uni2575 ; G 2480 -U 9590 ; WX 602 ; N uni2576 ; G 2481 -U 9591 ; WX 602 ; N uni2577 ; G 2482 -U 9592 ; WX 602 ; N uni2578 ; G 2483 -U 9593 ; WX 602 ; N uni2579 ; G 2484 -U 9594 ; WX 602 ; N uni257A ; G 2485 -U 9595 ; WX 602 ; N uni257B ; G 2486 -U 9596 ; WX 602 ; N uni257C ; G 2487 -U 9597 ; WX 602 ; N uni257D ; G 2488 -U 9598 ; WX 602 ; N uni257E ; G 2489 -U 9599 ; WX 602 ; N uni257F ; G 2490 -U 9600 ; WX 769 ; N upblock ; G 2491 -U 9601 ; WX 769 ; N uni2581 ; G 2492 -U 9602 ; WX 769 ; N uni2582 ; G 2493 -U 9603 ; WX 769 ; N uni2583 ; G 2494 -U 9604 ; WX 769 ; N dnblock ; G 2495 -U 9605 ; WX 769 ; N uni2585 ; G 2496 -U 9606 ; WX 769 ; N uni2586 ; G 2497 -U 9607 ; WX 769 ; N uni2587 ; G 2498 -U 9608 ; WX 769 ; N block ; G 2499 -U 9609 ; WX 769 ; N uni2589 ; G 2500 -U 9610 ; WX 769 ; N uni258A ; G 2501 -U 9611 ; WX 769 ; N uni258B ; G 2502 -U 9612 ; WX 769 ; N lfblock ; G 2503 -U 9613 ; WX 769 ; N uni258D ; G 2504 -U 9614 ; WX 769 ; N uni258E ; G 2505 -U 9615 ; WX 769 ; N uni258F ; G 2506 -U 9616 ; WX 769 ; N rtblock ; G 2507 -U 9617 ; WX 769 ; N ltshade ; G 2508 -U 9618 ; WX 769 ; N shade ; G 2509 -U 9619 ; WX 769 ; N dkshade ; G 2510 -U 9620 ; WX 769 ; N uni2594 ; G 2511 -U 9621 ; WX 769 ; N uni2595 ; G 2512 -U 9622 ; WX 769 ; N uni2596 ; G 2513 -U 9623 ; WX 769 ; N uni2597 ; G 2514 -U 9624 ; WX 769 ; N uni2598 ; G 2515 -U 9625 ; WX 769 ; N uni2599 ; G 2516 -U 9626 ; WX 769 ; N uni259A ; G 2517 -U 9627 ; WX 769 ; N uni259B ; G 2518 -U 9628 ; WX 769 ; N uni259C ; G 2519 -U 9629 ; WX 769 ; N uni259D ; G 2520 -U 9630 ; WX 769 ; N uni259E ; G 2521 -U 9631 ; WX 769 ; N uni259F ; G 2522 -U 9632 ; WX 945 ; N filledbox ; G 2523 -U 9633 ; WX 945 ; N H22073 ; G 2524 -U 9634 ; WX 945 ; N uni25A2 ; G 2525 -U 9635 ; WX 945 ; N uni25A3 ; G 2526 -U 9636 ; WX 945 ; N uni25A4 ; G 2527 -U 9637 ; WX 945 ; N uni25A5 ; G 2528 -U 9638 ; WX 945 ; N uni25A6 ; G 2529 -U 9639 ; WX 945 ; N uni25A7 ; G 2530 -U 9640 ; WX 945 ; N uni25A8 ; G 2531 -U 9641 ; WX 945 ; N uni25A9 ; G 2532 -U 9642 ; WX 678 ; N H18543 ; G 2533 -U 9643 ; WX 678 ; N H18551 ; G 2534 -U 9644 ; WX 945 ; N filledrect ; G 2535 -U 9645 ; WX 945 ; N uni25AD ; G 2536 -U 9646 ; WX 550 ; N uni25AE ; G 2537 -U 9647 ; WX 550 ; N uni25AF ; G 2538 -U 9648 ; WX 769 ; N uni25B0 ; G 2539 -U 9649 ; WX 769 ; N uni25B1 ; G 2540 -U 9650 ; WX 769 ; N triagup ; G 2541 -U 9651 ; WX 769 ; N uni25B3 ; G 2542 -U 9652 ; WX 502 ; N uni25B4 ; G 2543 -U 9653 ; WX 502 ; N uni25B5 ; G 2544 -U 9654 ; WX 769 ; N uni25B6 ; G 2545 -U 9655 ; WX 769 ; N uni25B7 ; G 2546 -U 9656 ; WX 502 ; N uni25B8 ; G 2547 -U 9657 ; WX 502 ; N uni25B9 ; G 2548 -U 9658 ; WX 769 ; N triagrt ; G 2549 -U 9659 ; WX 769 ; N uni25BB ; G 2550 -U 9660 ; WX 769 ; N triagdn ; G 2551 -U 9661 ; WX 769 ; N uni25BD ; G 2552 -U 9662 ; WX 502 ; N uni25BE ; G 2553 -U 9663 ; WX 502 ; N uni25BF ; G 2554 -U 9664 ; WX 769 ; N uni25C0 ; G 2555 -U 9665 ; WX 769 ; N uni25C1 ; G 2556 -U 9666 ; WX 502 ; N uni25C2 ; G 2557 -U 9667 ; WX 502 ; N uni25C3 ; G 2558 -U 9668 ; WX 769 ; N triaglf ; G 2559 -U 9669 ; WX 769 ; N uni25C5 ; G 2560 -U 9670 ; WX 769 ; N uni25C6 ; G 2561 -U 9671 ; WX 769 ; N uni25C7 ; G 2562 -U 9672 ; WX 769 ; N uni25C8 ; G 2563 -U 9673 ; WX 873 ; N uni25C9 ; G 2564 -U 9674 ; WX 494 ; N lozenge ; G 2565 -U 9675 ; WX 873 ; N circle ; G 2566 -U 9676 ; WX 873 ; N uni25CC ; G 2567 -U 9677 ; WX 873 ; N uni25CD ; G 2568 -U 9678 ; WX 873 ; N uni25CE ; G 2569 -U 9679 ; WX 873 ; N H18533 ; G 2570 -U 9680 ; WX 873 ; N uni25D0 ; G 2571 -U 9681 ; WX 873 ; N uni25D1 ; G 2572 -U 9682 ; WX 873 ; N uni25D2 ; G 2573 -U 9683 ; WX 873 ; N uni25D3 ; G 2574 -U 9684 ; WX 873 ; N uni25D4 ; G 2575 -U 9685 ; WX 873 ; N uni25D5 ; G 2576 -U 9686 ; WX 527 ; N uni25D6 ; G 2577 -U 9687 ; WX 527 ; N uni25D7 ; G 2578 -U 9688 ; WX 791 ; N invbullet ; G 2579 -U 9689 ; WX 970 ; N invcircle ; G 2580 -U 9690 ; WX 970 ; N uni25DA ; G 2581 -U 9691 ; WX 970 ; N uni25DB ; G 2582 -U 9692 ; WX 387 ; N uni25DC ; G 2583 -U 9693 ; WX 387 ; N uni25DD ; G 2584 -U 9694 ; WX 387 ; N uni25DE ; G 2585 -U 9695 ; WX 387 ; N uni25DF ; G 2586 -U 9696 ; WX 873 ; N uni25E0 ; G 2587 -U 9697 ; WX 873 ; N uni25E1 ; G 2588 -U 9698 ; WX 769 ; N uni25E2 ; G 2589 -U 9699 ; WX 769 ; N uni25E3 ; G 2590 -U 9700 ; WX 769 ; N uni25E4 ; G 2591 -U 9701 ; WX 769 ; N uni25E5 ; G 2592 -U 9702 ; WX 590 ; N openbullet ; G 2593 -U 9703 ; WX 945 ; N uni25E7 ; G 2594 -U 9704 ; WX 945 ; N uni25E8 ; G 2595 -U 9705 ; WX 945 ; N uni25E9 ; G 2596 -U 9706 ; WX 945 ; N uni25EA ; G 2597 -U 9707 ; WX 945 ; N uni25EB ; G 2598 -U 9708 ; WX 769 ; N uni25EC ; G 2599 -U 9709 ; WX 769 ; N uni25ED ; G 2600 -U 9710 ; WX 769 ; N uni25EE ; G 2601 -U 9711 ; WX 1119 ; N uni25EF ; G 2602 -U 9712 ; WX 945 ; N uni25F0 ; G 2603 -U 9713 ; WX 945 ; N uni25F1 ; G 2604 -U 9714 ; WX 945 ; N uni25F2 ; G 2605 -U 9715 ; WX 945 ; N uni25F3 ; G 2606 -U 9716 ; WX 873 ; N uni25F4 ; G 2607 -U 9717 ; WX 873 ; N uni25F5 ; G 2608 -U 9718 ; WX 873 ; N uni25F6 ; G 2609 -U 9719 ; WX 873 ; N uni25F7 ; G 2610 -U 9720 ; WX 769 ; N uni25F8 ; G 2611 -U 9721 ; WX 769 ; N uni25F9 ; G 2612 -U 9722 ; WX 769 ; N uni25FA ; G 2613 -U 9723 ; WX 830 ; N uni25FB ; G 2614 -U 9724 ; WX 830 ; N uni25FC ; G 2615 -U 9725 ; WX 732 ; N uni25FD ; G 2616 -U 9726 ; WX 732 ; N uni25FE ; G 2617 -U 9727 ; WX 769 ; N uni25FF ; G 2618 -U 9728 ; WX 896 ; N uni2600 ; G 2619 -U 9784 ; WX 896 ; N uni2638 ; G 2620 -U 9785 ; WX 896 ; N uni2639 ; G 2621 -U 9786 ; WX 896 ; N smileface ; G 2622 -U 9787 ; WX 896 ; N invsmileface ; G 2623 -U 9788 ; WX 896 ; N sun ; G 2624 -U 9791 ; WX 614 ; N uni263F ; G 2625 -U 9792 ; WX 731 ; N female ; G 2626 -U 9793 ; WX 731 ; N uni2641 ; G 2627 -U 9794 ; WX 896 ; N male ; G 2628 -U 9795 ; WX 896 ; N uni2643 ; G 2629 -U 9796 ; WX 896 ; N uni2644 ; G 2630 -U 9797 ; WX 896 ; N uni2645 ; G 2631 -U 9798 ; WX 896 ; N uni2646 ; G 2632 -U 9799 ; WX 896 ; N uni2647 ; G 2633 -U 9824 ; WX 896 ; N spade ; G 2634 -U 9825 ; WX 896 ; N uni2661 ; G 2635 -U 9826 ; WX 896 ; N uni2662 ; G 2636 -U 9827 ; WX 896 ; N club ; G 2637 -U 9828 ; WX 896 ; N uni2664 ; G 2638 -U 9829 ; WX 896 ; N heart ; G 2639 -U 9830 ; WX 896 ; N diamond ; G 2640 -U 9831 ; WX 896 ; N uni2667 ; G 2641 -U 9833 ; WX 472 ; N uni2669 ; G 2642 -U 9834 ; WX 638 ; N musicalnote ; G 2643 -U 9835 ; WX 896 ; N musicalnotedbl ; G 2644 -U 9836 ; WX 896 ; N uni266C ; G 2645 -U 9837 ; WX 472 ; N uni266D ; G 2646 -U 9838 ; WX 357 ; N uni266E ; G 2647 -U 9839 ; WX 484 ; N uni266F ; G 2648 -U 10145 ; WX 838 ; N uni27A1 ; G 2649 -U 10181 ; WX 457 ; N uni27C5 ; G 2650 -U 10182 ; WX 457 ; N uni27C6 ; G 2651 -U 10208 ; WX 494 ; N uni27E0 ; G 2652 -U 10216 ; WX 457 ; N uni27E8 ; G 2653 -U 10217 ; WX 457 ; N uni27E9 ; G 2654 -U 10224 ; WX 838 ; N uni27F0 ; G 2655 -U 10225 ; WX 838 ; N uni27F1 ; G 2656 -U 10226 ; WX 838 ; N uni27F2 ; G 2657 -U 10227 ; WX 838 ; N uni27F3 ; G 2658 -U 10228 ; WX 1033 ; N uni27F4 ; G 2659 -U 10229 ; WX 1434 ; N uni27F5 ; G 2660 -U 10230 ; WX 1434 ; N uni27F6 ; G 2661 -U 10231 ; WX 1434 ; N uni27F7 ; G 2662 -U 10232 ; WX 1434 ; N uni27F8 ; G 2663 -U 10233 ; WX 1434 ; N uni27F9 ; G 2664 -U 10234 ; WX 1434 ; N uni27FA ; G 2665 -U 10235 ; WX 1434 ; N uni27FB ; G 2666 -U 10236 ; WX 1434 ; N uni27FC ; G 2667 -U 10237 ; WX 1434 ; N uni27FD ; G 2668 -U 10238 ; WX 1434 ; N uni27FE ; G 2669 -U 10239 ; WX 1434 ; N uni27FF ; G 2670 -U 10240 ; WX 781 ; N uni2800 ; G 2671 -U 10241 ; WX 781 ; N uni2801 ; G 2672 -U 10242 ; WX 781 ; N uni2802 ; G 2673 -U 10243 ; WX 781 ; N uni2803 ; G 2674 -U 10244 ; WX 781 ; N uni2804 ; G 2675 -U 10245 ; WX 781 ; N uni2805 ; G 2676 -U 10246 ; WX 781 ; N uni2806 ; G 2677 -U 10247 ; WX 781 ; N uni2807 ; G 2678 -U 10248 ; WX 781 ; N uni2808 ; G 2679 -U 10249 ; WX 781 ; N uni2809 ; G 2680 -U 10250 ; WX 781 ; N uni280A ; G 2681 -U 10251 ; WX 781 ; N uni280B ; G 2682 -U 10252 ; WX 781 ; N uni280C ; G 2683 -U 10253 ; WX 781 ; N uni280D ; G 2684 -U 10254 ; WX 781 ; N uni280E ; G 2685 -U 10255 ; WX 781 ; N uni280F ; G 2686 -U 10256 ; WX 781 ; N uni2810 ; G 2687 -U 10257 ; WX 781 ; N uni2811 ; G 2688 -U 10258 ; WX 781 ; N uni2812 ; G 2689 -U 10259 ; WX 781 ; N uni2813 ; G 2690 -U 10260 ; WX 781 ; N uni2814 ; G 2691 -U 10261 ; WX 781 ; N uni2815 ; G 2692 -U 10262 ; WX 781 ; N uni2816 ; G 2693 -U 10263 ; WX 781 ; N uni2817 ; G 2694 -U 10264 ; WX 781 ; N uni2818 ; G 2695 -U 10265 ; WX 781 ; N uni2819 ; G 2696 -U 10266 ; WX 781 ; N uni281A ; G 2697 -U 10267 ; WX 781 ; N uni281B ; G 2698 -U 10268 ; WX 781 ; N uni281C ; G 2699 -U 10269 ; WX 781 ; N uni281D ; G 2700 -U 10270 ; WX 781 ; N uni281E ; G 2701 -U 10271 ; WX 781 ; N uni281F ; G 2702 -U 10272 ; WX 781 ; N uni2820 ; G 2703 -U 10273 ; WX 781 ; N uni2821 ; G 2704 -U 10274 ; WX 781 ; N uni2822 ; G 2705 -U 10275 ; WX 781 ; N uni2823 ; G 2706 -U 10276 ; WX 781 ; N uni2824 ; G 2707 -U 10277 ; WX 781 ; N uni2825 ; G 2708 -U 10278 ; WX 781 ; N uni2826 ; G 2709 -U 10279 ; WX 781 ; N uni2827 ; G 2710 -U 10280 ; WX 781 ; N uni2828 ; G 2711 -U 10281 ; WX 781 ; N uni2829 ; G 2712 -U 10282 ; WX 781 ; N uni282A ; G 2713 -U 10283 ; WX 781 ; N uni282B ; G 2714 -U 10284 ; WX 781 ; N uni282C ; G 2715 -U 10285 ; WX 781 ; N uni282D ; G 2716 -U 10286 ; WX 781 ; N uni282E ; G 2717 -U 10287 ; WX 781 ; N uni282F ; G 2718 -U 10288 ; WX 781 ; N uni2830 ; G 2719 -U 10289 ; WX 781 ; N uni2831 ; G 2720 -U 10290 ; WX 781 ; N uni2832 ; G 2721 -U 10291 ; WX 781 ; N uni2833 ; G 2722 -U 10292 ; WX 781 ; N uni2834 ; G 2723 -U 10293 ; WX 781 ; N uni2835 ; G 2724 -U 10294 ; WX 781 ; N uni2836 ; G 2725 -U 10295 ; WX 781 ; N uni2837 ; G 2726 -U 10296 ; WX 781 ; N uni2838 ; G 2727 -U 10297 ; WX 781 ; N uni2839 ; G 2728 -U 10298 ; WX 781 ; N uni283A ; G 2729 -U 10299 ; WX 781 ; N uni283B ; G 2730 -U 10300 ; WX 781 ; N uni283C ; G 2731 -U 10301 ; WX 781 ; N uni283D ; G 2732 -U 10302 ; WX 781 ; N uni283E ; G 2733 -U 10303 ; WX 781 ; N uni283F ; G 2734 -U 10304 ; WX 781 ; N uni2840 ; G 2735 -U 10305 ; WX 781 ; N uni2841 ; G 2736 -U 10306 ; WX 781 ; N uni2842 ; G 2737 -U 10307 ; WX 781 ; N uni2843 ; G 2738 -U 10308 ; WX 781 ; N uni2844 ; G 2739 -U 10309 ; WX 781 ; N uni2845 ; G 2740 -U 10310 ; WX 781 ; N uni2846 ; G 2741 -U 10311 ; WX 781 ; N uni2847 ; G 2742 -U 10312 ; WX 781 ; N uni2848 ; G 2743 -U 10313 ; WX 781 ; N uni2849 ; G 2744 -U 10314 ; WX 781 ; N uni284A ; G 2745 -U 10315 ; WX 781 ; N uni284B ; G 2746 -U 10316 ; WX 781 ; N uni284C ; G 2747 -U 10317 ; WX 781 ; N uni284D ; G 2748 -U 10318 ; WX 781 ; N uni284E ; G 2749 -U 10319 ; WX 781 ; N uni284F ; G 2750 -U 10320 ; WX 781 ; N uni2850 ; G 2751 -U 10321 ; WX 781 ; N uni2851 ; G 2752 -U 10322 ; WX 781 ; N uni2852 ; G 2753 -U 10323 ; WX 781 ; N uni2853 ; G 2754 -U 10324 ; WX 781 ; N uni2854 ; G 2755 -U 10325 ; WX 781 ; N uni2855 ; G 2756 -U 10326 ; WX 781 ; N uni2856 ; G 2757 -U 10327 ; WX 781 ; N uni2857 ; G 2758 -U 10328 ; WX 781 ; N uni2858 ; G 2759 -U 10329 ; WX 781 ; N uni2859 ; G 2760 -U 10330 ; WX 781 ; N uni285A ; G 2761 -U 10331 ; WX 781 ; N uni285B ; G 2762 -U 10332 ; WX 781 ; N uni285C ; G 2763 -U 10333 ; WX 781 ; N uni285D ; G 2764 -U 10334 ; WX 781 ; N uni285E ; G 2765 -U 10335 ; WX 781 ; N uni285F ; G 2766 -U 10336 ; WX 781 ; N uni2860 ; G 2767 -U 10337 ; WX 781 ; N uni2861 ; G 2768 -U 10338 ; WX 781 ; N uni2862 ; G 2769 -U 10339 ; WX 781 ; N uni2863 ; G 2770 -U 10340 ; WX 781 ; N uni2864 ; G 2771 -U 10341 ; WX 781 ; N uni2865 ; G 2772 -U 10342 ; WX 781 ; N uni2866 ; G 2773 -U 10343 ; WX 781 ; N uni2867 ; G 2774 -U 10344 ; WX 781 ; N uni2868 ; G 2775 -U 10345 ; WX 781 ; N uni2869 ; G 2776 -U 10346 ; WX 781 ; N uni286A ; G 2777 -U 10347 ; WX 781 ; N uni286B ; G 2778 -U 10348 ; WX 781 ; N uni286C ; G 2779 -U 10349 ; WX 781 ; N uni286D ; G 2780 -U 10350 ; WX 781 ; N uni286E ; G 2781 -U 10351 ; WX 781 ; N uni286F ; G 2782 -U 10352 ; WX 781 ; N uni2870 ; G 2783 -U 10353 ; WX 781 ; N uni2871 ; G 2784 -U 10354 ; WX 781 ; N uni2872 ; G 2785 -U 10355 ; WX 781 ; N uni2873 ; G 2786 -U 10356 ; WX 781 ; N uni2874 ; G 2787 -U 10357 ; WX 781 ; N uni2875 ; G 2788 -U 10358 ; WX 781 ; N uni2876 ; G 2789 -U 10359 ; WX 781 ; N uni2877 ; G 2790 -U 10360 ; WX 781 ; N uni2878 ; G 2791 -U 10361 ; WX 781 ; N uni2879 ; G 2792 -U 10362 ; WX 781 ; N uni287A ; G 2793 -U 10363 ; WX 781 ; N uni287B ; G 2794 -U 10364 ; WX 781 ; N uni287C ; G 2795 -U 10365 ; WX 781 ; N uni287D ; G 2796 -U 10366 ; WX 781 ; N uni287E ; G 2797 -U 10367 ; WX 781 ; N uni287F ; G 2798 -U 10368 ; WX 781 ; N uni2880 ; G 2799 -U 10369 ; WX 781 ; N uni2881 ; G 2800 -U 10370 ; WX 781 ; N uni2882 ; G 2801 -U 10371 ; WX 781 ; N uni2883 ; G 2802 -U 10372 ; WX 781 ; N uni2884 ; G 2803 -U 10373 ; WX 781 ; N uni2885 ; G 2804 -U 10374 ; WX 781 ; N uni2886 ; G 2805 -U 10375 ; WX 781 ; N uni2887 ; G 2806 -U 10376 ; WX 781 ; N uni2888 ; G 2807 -U 10377 ; WX 781 ; N uni2889 ; G 2808 -U 10378 ; WX 781 ; N uni288A ; G 2809 -U 10379 ; WX 781 ; N uni288B ; G 2810 -U 10380 ; WX 781 ; N uni288C ; G 2811 -U 10381 ; WX 781 ; N uni288D ; G 2812 -U 10382 ; WX 781 ; N uni288E ; G 2813 -U 10383 ; WX 781 ; N uni288F ; G 2814 -U 10384 ; WX 781 ; N uni2890 ; G 2815 -U 10385 ; WX 781 ; N uni2891 ; G 2816 -U 10386 ; WX 781 ; N uni2892 ; G 2817 -U 10387 ; WX 781 ; N uni2893 ; G 2818 -U 10388 ; WX 781 ; N uni2894 ; G 2819 -U 10389 ; WX 781 ; N uni2895 ; G 2820 -U 10390 ; WX 781 ; N uni2896 ; G 2821 -U 10391 ; WX 781 ; N uni2897 ; G 2822 -U 10392 ; WX 781 ; N uni2898 ; G 2823 -U 10393 ; WX 781 ; N uni2899 ; G 2824 -U 10394 ; WX 781 ; N uni289A ; G 2825 -U 10395 ; WX 781 ; N uni289B ; G 2826 -U 10396 ; WX 781 ; N uni289C ; G 2827 -U 10397 ; WX 781 ; N uni289D ; G 2828 -U 10398 ; WX 781 ; N uni289E ; G 2829 -U 10399 ; WX 781 ; N uni289F ; G 2830 -U 10400 ; WX 781 ; N uni28A0 ; G 2831 -U 10401 ; WX 781 ; N uni28A1 ; G 2832 -U 10402 ; WX 781 ; N uni28A2 ; G 2833 -U 10403 ; WX 781 ; N uni28A3 ; G 2834 -U 10404 ; WX 781 ; N uni28A4 ; G 2835 -U 10405 ; WX 781 ; N uni28A5 ; G 2836 -U 10406 ; WX 781 ; N uni28A6 ; G 2837 -U 10407 ; WX 781 ; N uni28A7 ; G 2838 -U 10408 ; WX 781 ; N uni28A8 ; G 2839 -U 10409 ; WX 781 ; N uni28A9 ; G 2840 -U 10410 ; WX 781 ; N uni28AA ; G 2841 -U 10411 ; WX 781 ; N uni28AB ; G 2842 -U 10412 ; WX 781 ; N uni28AC ; G 2843 -U 10413 ; WX 781 ; N uni28AD ; G 2844 -U 10414 ; WX 781 ; N uni28AE ; G 2845 -U 10415 ; WX 781 ; N uni28AF ; G 2846 -U 10416 ; WX 781 ; N uni28B0 ; G 2847 -U 10417 ; WX 781 ; N uni28B1 ; G 2848 -U 10418 ; WX 781 ; N uni28B2 ; G 2849 -U 10419 ; WX 781 ; N uni28B3 ; G 2850 -U 10420 ; WX 781 ; N uni28B4 ; G 2851 -U 10421 ; WX 781 ; N uni28B5 ; G 2852 -U 10422 ; WX 781 ; N uni28B6 ; G 2853 -U 10423 ; WX 781 ; N uni28B7 ; G 2854 -U 10424 ; WX 781 ; N uni28B8 ; G 2855 -U 10425 ; WX 781 ; N uni28B9 ; G 2856 -U 10426 ; WX 781 ; N uni28BA ; G 2857 -U 10427 ; WX 781 ; N uni28BB ; G 2858 -U 10428 ; WX 781 ; N uni28BC ; G 2859 -U 10429 ; WX 781 ; N uni28BD ; G 2860 -U 10430 ; WX 781 ; N uni28BE ; G 2861 -U 10431 ; WX 781 ; N uni28BF ; G 2862 -U 10432 ; WX 781 ; N uni28C0 ; G 2863 -U 10433 ; WX 781 ; N uni28C1 ; G 2864 -U 10434 ; WX 781 ; N uni28C2 ; G 2865 -U 10435 ; WX 781 ; N uni28C3 ; G 2866 -U 10436 ; WX 781 ; N uni28C4 ; G 2867 -U 10437 ; WX 781 ; N uni28C5 ; G 2868 -U 10438 ; WX 781 ; N uni28C6 ; G 2869 -U 10439 ; WX 781 ; N uni28C7 ; G 2870 -U 10440 ; WX 781 ; N uni28C8 ; G 2871 -U 10441 ; WX 781 ; N uni28C9 ; G 2872 -U 10442 ; WX 781 ; N uni28CA ; G 2873 -U 10443 ; WX 781 ; N uni28CB ; G 2874 -U 10444 ; WX 781 ; N uni28CC ; G 2875 -U 10445 ; WX 781 ; N uni28CD ; G 2876 -U 10446 ; WX 781 ; N uni28CE ; G 2877 -U 10447 ; WX 781 ; N uni28CF ; G 2878 -U 10448 ; WX 781 ; N uni28D0 ; G 2879 -U 10449 ; WX 781 ; N uni28D1 ; G 2880 -U 10450 ; WX 781 ; N uni28D2 ; G 2881 -U 10451 ; WX 781 ; N uni28D3 ; G 2882 -U 10452 ; WX 781 ; N uni28D4 ; G 2883 -U 10453 ; WX 781 ; N uni28D5 ; G 2884 -U 10454 ; WX 781 ; N uni28D6 ; G 2885 -U 10455 ; WX 781 ; N uni28D7 ; G 2886 -U 10456 ; WX 781 ; N uni28D8 ; G 2887 -U 10457 ; WX 781 ; N uni28D9 ; G 2888 -U 10458 ; WX 781 ; N uni28DA ; G 2889 -U 10459 ; WX 781 ; N uni28DB ; G 2890 -U 10460 ; WX 781 ; N uni28DC ; G 2891 -U 10461 ; WX 781 ; N uni28DD ; G 2892 -U 10462 ; WX 781 ; N uni28DE ; G 2893 -U 10463 ; WX 781 ; N uni28DF ; G 2894 -U 10464 ; WX 781 ; N uni28E0 ; G 2895 -U 10465 ; WX 781 ; N uni28E1 ; G 2896 -U 10466 ; WX 781 ; N uni28E2 ; G 2897 -U 10467 ; WX 781 ; N uni28E3 ; G 2898 -U 10468 ; WX 781 ; N uni28E4 ; G 2899 -U 10469 ; WX 781 ; N uni28E5 ; G 2900 -U 10470 ; WX 781 ; N uni28E6 ; G 2901 -U 10471 ; WX 781 ; N uni28E7 ; G 2902 -U 10472 ; WX 781 ; N uni28E8 ; G 2903 -U 10473 ; WX 781 ; N uni28E9 ; G 2904 -U 10474 ; WX 781 ; N uni28EA ; G 2905 -U 10475 ; WX 781 ; N uni28EB ; G 2906 -U 10476 ; WX 781 ; N uni28EC ; G 2907 -U 10477 ; WX 781 ; N uni28ED ; G 2908 -U 10478 ; WX 781 ; N uni28EE ; G 2909 -U 10479 ; WX 781 ; N uni28EF ; G 2910 -U 10480 ; WX 781 ; N uni28F0 ; G 2911 -U 10481 ; WX 781 ; N uni28F1 ; G 2912 -U 10482 ; WX 781 ; N uni28F2 ; G 2913 -U 10483 ; WX 781 ; N uni28F3 ; G 2914 -U 10484 ; WX 781 ; N uni28F4 ; G 2915 -U 10485 ; WX 781 ; N uni28F5 ; G 2916 -U 10486 ; WX 781 ; N uni28F6 ; G 2917 -U 10487 ; WX 781 ; N uni28F7 ; G 2918 -U 10488 ; WX 781 ; N uni28F8 ; G 2919 -U 10489 ; WX 781 ; N uni28F9 ; G 2920 -U 10490 ; WX 781 ; N uni28FA ; G 2921 -U 10491 ; WX 781 ; N uni28FB ; G 2922 -U 10492 ; WX 781 ; N uni28FC ; G 2923 -U 10493 ; WX 781 ; N uni28FD ; G 2924 -U 10494 ; WX 781 ; N uni28FE ; G 2925 -U 10495 ; WX 781 ; N uni28FF ; G 2926 -U 10496 ; WX 838 ; N uni2900 ; G 2927 -U 10497 ; WX 838 ; N uni2901 ; G 2928 -U 10498 ; WX 838 ; N uni2902 ; G 2929 -U 10499 ; WX 838 ; N uni2903 ; G 2930 -U 10500 ; WX 838 ; N uni2904 ; G 2931 -U 10501 ; WX 838 ; N uni2905 ; G 2932 -U 10502 ; WX 838 ; N uni2906 ; G 2933 -U 10503 ; WX 838 ; N uni2907 ; G 2934 -U 10504 ; WX 838 ; N uni2908 ; G 2935 -U 10505 ; WX 838 ; N uni2909 ; G 2936 -U 10506 ; WX 838 ; N uni290A ; G 2937 -U 10507 ; WX 838 ; N uni290B ; G 2938 -U 10508 ; WX 838 ; N uni290C ; G 2939 -U 10509 ; WX 838 ; N uni290D ; G 2940 -U 10510 ; WX 838 ; N uni290E ; G 2941 -U 10511 ; WX 838 ; N uni290F ; G 2942 -U 10512 ; WX 838 ; N uni2910 ; G 2943 -U 10513 ; WX 838 ; N uni2911 ; G 2944 -U 10514 ; WX 838 ; N uni2912 ; G 2945 -U 10515 ; WX 838 ; N uni2913 ; G 2946 -U 10516 ; WX 838 ; N uni2914 ; G 2947 -U 10517 ; WX 838 ; N uni2915 ; G 2948 -U 10518 ; WX 838 ; N uni2916 ; G 2949 -U 10519 ; WX 838 ; N uni2917 ; G 2950 -U 10520 ; WX 838 ; N uni2918 ; G 2951 -U 10521 ; WX 838 ; N uni2919 ; G 2952 -U 10522 ; WX 838 ; N uni291A ; G 2953 -U 10523 ; WX 838 ; N uni291B ; G 2954 -U 10524 ; WX 838 ; N uni291C ; G 2955 -U 10525 ; WX 838 ; N uni291D ; G 2956 -U 10526 ; WX 838 ; N uni291E ; G 2957 -U 10527 ; WX 838 ; N uni291F ; G 2958 -U 10528 ; WX 838 ; N uni2920 ; G 2959 -U 10529 ; WX 838 ; N uni2921 ; G 2960 -U 10530 ; WX 838 ; N uni2922 ; G 2961 -U 10531 ; WX 838 ; N uni2923 ; G 2962 -U 10532 ; WX 838 ; N uni2924 ; G 2963 -U 10533 ; WX 838 ; N uni2925 ; G 2964 -U 10534 ; WX 838 ; N uni2926 ; G 2965 -U 10535 ; WX 838 ; N uni2927 ; G 2966 -U 10536 ; WX 838 ; N uni2928 ; G 2967 -U 10537 ; WX 838 ; N uni2929 ; G 2968 -U 10538 ; WX 838 ; N uni292A ; G 2969 -U 10539 ; WX 838 ; N uni292B ; G 2970 -U 10540 ; WX 838 ; N uni292C ; G 2971 -U 10541 ; WX 838 ; N uni292D ; G 2972 -U 10542 ; WX 838 ; N uni292E ; G 2973 -U 10543 ; WX 838 ; N uni292F ; G 2974 -U 10544 ; WX 838 ; N uni2930 ; G 2975 -U 10545 ; WX 838 ; N uni2931 ; G 2976 -U 10546 ; WX 838 ; N uni2932 ; G 2977 -U 10547 ; WX 838 ; N uni2933 ; G 2978 -U 10548 ; WX 838 ; N uni2934 ; G 2979 -U 10549 ; WX 838 ; N uni2935 ; G 2980 -U 10550 ; WX 838 ; N uni2936 ; G 2981 -U 10551 ; WX 838 ; N uni2937 ; G 2982 -U 10552 ; WX 838 ; N uni2938 ; G 2983 -U 10553 ; WX 838 ; N uni2939 ; G 2984 -U 10554 ; WX 838 ; N uni293A ; G 2985 -U 10555 ; WX 838 ; N uni293B ; G 2986 -U 10556 ; WX 838 ; N uni293C ; G 2987 -U 10557 ; WX 838 ; N uni293D ; G 2988 -U 10558 ; WX 838 ; N uni293E ; G 2989 -U 10559 ; WX 838 ; N uni293F ; G 2990 -U 10560 ; WX 838 ; N uni2940 ; G 2991 -U 10561 ; WX 838 ; N uni2941 ; G 2992 -U 10562 ; WX 838 ; N uni2942 ; G 2993 -U 10563 ; WX 838 ; N uni2943 ; G 2994 -U 10564 ; WX 838 ; N uni2944 ; G 2995 -U 10565 ; WX 838 ; N uni2945 ; G 2996 -U 10566 ; WX 838 ; N uni2946 ; G 2997 -U 10567 ; WX 838 ; N uni2947 ; G 2998 -U 10568 ; WX 838 ; N uni2948 ; G 2999 -U 10569 ; WX 838 ; N uni2949 ; G 3000 -U 10570 ; WX 838 ; N uni294A ; G 3001 -U 10571 ; WX 838 ; N uni294B ; G 3002 -U 10572 ; WX 838 ; N uni294C ; G 3003 -U 10573 ; WX 838 ; N uni294D ; G 3004 -U 10574 ; WX 838 ; N uni294E ; G 3005 -U 10575 ; WX 838 ; N uni294F ; G 3006 -U 10576 ; WX 838 ; N uni2950 ; G 3007 -U 10577 ; WX 838 ; N uni2951 ; G 3008 -U 10578 ; WX 838 ; N uni2952 ; G 3009 -U 10579 ; WX 838 ; N uni2953 ; G 3010 -U 10580 ; WX 838 ; N uni2954 ; G 3011 -U 10581 ; WX 838 ; N uni2955 ; G 3012 -U 10582 ; WX 838 ; N uni2956 ; G 3013 -U 10583 ; WX 838 ; N uni2957 ; G 3014 -U 10584 ; WX 838 ; N uni2958 ; G 3015 -U 10585 ; WX 838 ; N uni2959 ; G 3016 -U 10586 ; WX 838 ; N uni295A ; G 3017 -U 10587 ; WX 838 ; N uni295B ; G 3018 -U 10588 ; WX 838 ; N uni295C ; G 3019 -U 10589 ; WX 838 ; N uni295D ; G 3020 -U 10590 ; WX 838 ; N uni295E ; G 3021 -U 10591 ; WX 838 ; N uni295F ; G 3022 -U 10592 ; WX 838 ; N uni2960 ; G 3023 -U 10593 ; WX 838 ; N uni2961 ; G 3024 -U 10594 ; WX 838 ; N uni2962 ; G 3025 -U 10595 ; WX 838 ; N uni2963 ; G 3026 -U 10596 ; WX 838 ; N uni2964 ; G 3027 -U 10597 ; WX 838 ; N uni2965 ; G 3028 -U 10598 ; WX 838 ; N uni2966 ; G 3029 -U 10599 ; WX 838 ; N uni2967 ; G 3030 -U 10600 ; WX 838 ; N uni2968 ; G 3031 -U 10601 ; WX 838 ; N uni2969 ; G 3032 -U 10602 ; WX 838 ; N uni296A ; G 3033 -U 10603 ; WX 838 ; N uni296B ; G 3034 -U 10604 ; WX 838 ; N uni296C ; G 3035 -U 10605 ; WX 838 ; N uni296D ; G 3036 -U 10606 ; WX 838 ; N uni296E ; G 3037 -U 10607 ; WX 838 ; N uni296F ; G 3038 -U 10608 ; WX 838 ; N uni2970 ; G 3039 -U 10609 ; WX 838 ; N uni2971 ; G 3040 -U 10610 ; WX 838 ; N uni2972 ; G 3041 -U 10611 ; WX 838 ; N uni2973 ; G 3042 -U 10612 ; WX 838 ; N uni2974 ; G 3043 -U 10613 ; WX 838 ; N uni2975 ; G 3044 -U 10614 ; WX 838 ; N uni2976 ; G 3045 -U 10615 ; WX 1032 ; N uni2977 ; G 3046 -U 10616 ; WX 838 ; N uni2978 ; G 3047 -U 10617 ; WX 838 ; N uni2979 ; G 3048 -U 10618 ; WX 960 ; N uni297A ; G 3049 -U 10619 ; WX 838 ; N uni297B ; G 3050 -U 10620 ; WX 838 ; N uni297C ; G 3051 -U 10621 ; WX 838 ; N uni297D ; G 3052 -U 10622 ; WX 838 ; N uni297E ; G 3053 -U 10623 ; WX 838 ; N uni297F ; G 3054 -U 10731 ; WX 494 ; N uni29EB ; G 3055 -U 10764 ; WX 1782 ; N uni2A0C ; G 3056 -U 10765 ; WX 610 ; N uni2A0D ; G 3057 -U 10766 ; WX 610 ; N uni2A0E ; G 3058 -U 10799 ; WX 838 ; N uni2A2F ; G 3059 -U 10858 ; WX 838 ; N uni2A6A ; G 3060 -U 10859 ; WX 838 ; N uni2A6B ; G 3061 -U 11008 ; WX 838 ; N uni2B00 ; G 3062 -U 11009 ; WX 838 ; N uni2B01 ; G 3063 -U 11010 ; WX 838 ; N uni2B02 ; G 3064 -U 11011 ; WX 838 ; N uni2B03 ; G 3065 -U 11012 ; WX 838 ; N uni2B04 ; G 3066 -U 11013 ; WX 838 ; N uni2B05 ; G 3067 -U 11014 ; WX 838 ; N uni2B06 ; G 3068 -U 11015 ; WX 838 ; N uni2B07 ; G 3069 -U 11016 ; WX 838 ; N uni2B08 ; G 3070 -U 11017 ; WX 838 ; N uni2B09 ; G 3071 -U 11018 ; WX 838 ; N uni2B0A ; G 3072 -U 11019 ; WX 838 ; N uni2B0B ; G 3073 -U 11020 ; WX 838 ; N uni2B0C ; G 3074 -U 11021 ; WX 838 ; N uni2B0D ; G 3075 -U 11022 ; WX 838 ; N uni2B0E ; G 3076 -U 11023 ; WX 838 ; N uni2B0F ; G 3077 -U 11024 ; WX 838 ; N uni2B10 ; G 3078 -U 11025 ; WX 838 ; N uni2B11 ; G 3079 -U 11026 ; WX 945 ; N uni2B12 ; G 3080 -U 11027 ; WX 945 ; N uni2B13 ; G 3081 -U 11028 ; WX 945 ; N uni2B14 ; G 3082 -U 11029 ; WX 945 ; N uni2B15 ; G 3083 -U 11030 ; WX 769 ; N uni2B16 ; G 3084 -U 11031 ; WX 769 ; N uni2B17 ; G 3085 -U 11032 ; WX 769 ; N uni2B18 ; G 3086 -U 11033 ; WX 769 ; N uni2B19 ; G 3087 -U 11034 ; WX 945 ; N uni2B1A ; G 3088 -U 11360 ; WX 703 ; N uni2C60 ; G 3089 -U 11361 ; WX 380 ; N uni2C61 ; G 3090 -U 11363 ; WX 752 ; N uni2C63 ; G 3091 -U 11364 ; WX 831 ; N uni2C64 ; G 3092 -U 11367 ; WX 945 ; N uni2C67 ; G 3093 -U 11368 ; WX 727 ; N uni2C68 ; G 3094 -U 11369 ; WX 869 ; N uni2C69 ; G 3095 -U 11370 ; WX 693 ; N uni2C6A ; G 3096 -U 11371 ; WX 730 ; N uni2C6B ; G 3097 -U 11372 ; WX 568 ; N uni2C6C ; G 3098 -U 11373 ; WX 848 ; N uni2C6D ; G 3099 -U 11374 ; WX 1107 ; N uni2C6E ; G 3100 -U 11375 ; WX 776 ; N uni2C6F ; G 3101 -U 11376 ; WX 848 ; N uni2C70 ; G 3102 -U 11377 ; WX 709 ; N uni2C71 ; G 3103 -U 11378 ; WX 1221 ; N uni2C72 ; G 3104 -U 11379 ; WX 984 ; N uni2C73 ; G 3105 -U 11381 ; WX 779 ; N uni2C75 ; G 3106 -U 11382 ; WX 576 ; N uni2C76 ; G 3107 -U 11383 ; WX 905 ; N uni2C77 ; G 3108 -U 11385 ; WX 571 ; N uni2C79 ; G 3109 -U 11386 ; WX 667 ; N uni2C7A ; G 3110 -U 11387 ; WX 617 ; N uni2C7B ; G 3111 -U 11388 ; WX 313 ; N uni2C7C ; G 3112 -U 11389 ; WX 489 ; N uni2C7D ; G 3113 -U 11390 ; WX 722 ; N uni2C7E ; G 3114 -U 11391 ; WX 730 ; N uni2C7F ; G 3115 -U 11520 ; WX 773 ; N uni2D00 ; G 3116 -U 11521 ; WX 635 ; N uni2D01 ; G 3117 -U 11522 ; WX 804 ; N uni2D02 ; G 3118 -U 11523 ; WX 658 ; N uni2D03 ; G 3119 -U 11524 ; WX 788 ; N uni2D04 ; G 3120 -U 11525 ; WX 962 ; N uni2D05 ; G 3121 -U 11526 ; WX 756 ; N uni2D06 ; G 3122 -U 11527 ; WX 960 ; N uni2D07 ; G 3123 -U 11528 ; WX 617 ; N uni2D08 ; G 3124 -U 11529 ; WX 646 ; N uni2D09 ; G 3125 -U 11530 ; WX 962 ; N uni2D0A ; G 3126 -U 11531 ; WX 631 ; N uni2D0B ; G 3127 -U 11532 ; WX 646 ; N uni2D0C ; G 3128 -U 11533 ; WX 962 ; N uni2D0D ; G 3129 -U 11534 ; WX 846 ; N uni2D0E ; G 3130 -U 11535 ; WX 866 ; N uni2D0F ; G 3131 -U 11536 ; WX 961 ; N uni2D10 ; G 3132 -U 11537 ; WX 645 ; N uni2D11 ; G 3133 -U 11538 ; WX 645 ; N uni2D12 ; G 3134 -U 11539 ; WX 959 ; N uni2D13 ; G 3135 -U 11540 ; WX 945 ; N uni2D14 ; G 3136 -U 11541 ; WX 863 ; N uni2D15 ; G 3137 -U 11542 ; WX 644 ; N uni2D16 ; G 3138 -U 11543 ; WX 646 ; N uni2D17 ; G 3139 -U 11544 ; WX 645 ; N uni2D18 ; G 3140 -U 11545 ; WX 649 ; N uni2D19 ; G 3141 -U 11546 ; WX 688 ; N uni2D1A ; G 3142 -U 11547 ; WX 936 ; N uni2D1B ; G 3143 -U 11548 ; WX 982 ; N uni2D1C ; G 3144 -U 11549 ; WX 681 ; N uni2D1D ; G 3145 -U 11550 ; WX 676 ; N uni2D1E ; G 3146 -U 11551 ; WX 852 ; N uni2D1F ; G 3147 -U 11552 ; WX 1113 ; N uni2D20 ; G 3148 -U 11553 ; WX 632 ; N uni2D21 ; G 3149 -U 11554 ; WX 645 ; N uni2D22 ; G 3150 -U 11555 ; WX 646 ; N uni2D23 ; G 3151 -U 11556 ; WX 749 ; N uni2D24 ; G 3152 -U 11557 ; WX 914 ; N uni2D25 ; G 3153 -U 11800 ; WX 586 ; N uni2E18 ; G 3154 -U 11807 ; WX 838 ; N uni2E1F ; G 3155 -U 11810 ; WX 473 ; N uni2E22 ; G 3156 -U 11811 ; WX 473 ; N uni2E23 ; G 3157 -U 11812 ; WX 473 ; N uni2E24 ; G 3158 -U 11813 ; WX 473 ; N uni2E25 ; G 3159 -U 11822 ; WX 586 ; N uni2E2E ; G 3160 -U 42564 ; WX 722 ; N uniA644 ; G 3161 -U 42565 ; WX 563 ; N uniA645 ; G 3162 -U 42566 ; WX 468 ; N uniA646 ; G 3163 -U 42567 ; WX 380 ; N uniA647 ; G 3164 -U 42576 ; WX 1333 ; N uniA650 ; G 3165 -U 42577 ; WX 1085 ; N uniA651 ; G 3166 -U 42580 ; WX 1287 ; N uniA654 ; G 3167 -U 42581 ; WX 1025 ; N uniA655 ; G 3168 -U 42582 ; WX 1287 ; N uniA656 ; G 3169 -U 42583 ; WX 1029 ; N uniA657 ; G 3170 -U 42648 ; WX 1448 ; N uniA698 ; G 3171 -U 42649 ; WX 1060 ; N uniA699 ; G 3172 -U 42760 ; WX 500 ; N uniA708 ; G 3173 -U 42761 ; WX 500 ; N uniA709 ; G 3174 -U 42762 ; WX 500 ; N uniA70A ; G 3175 -U 42763 ; WX 500 ; N uniA70B ; G 3176 -U 42764 ; WX 500 ; N uniA70C ; G 3177 -U 42765 ; WX 500 ; N uniA70D ; G 3178 -U 42766 ; WX 500 ; N uniA70E ; G 3179 -U 42767 ; WX 500 ; N uniA70F ; G 3180 -U 42768 ; WX 500 ; N uniA710 ; G 3181 -U 42769 ; WX 500 ; N uniA711 ; G 3182 -U 42770 ; WX 500 ; N uniA712 ; G 3183 -U 42771 ; WX 500 ; N uniA713 ; G 3184 -U 42772 ; WX 500 ; N uniA714 ; G 3185 -U 42773 ; WX 500 ; N uniA715 ; G 3186 -U 42774 ; WX 500 ; N uniA716 ; G 3187 -U 42779 ; WX 384 ; N uniA71B ; G 3188 -U 42780 ; WX 384 ; N uniA71C ; G 3189 -U 42781 ; WX 276 ; N uniA71D ; G 3190 -U 42782 ; WX 276 ; N uniA71E ; G 3191 -U 42783 ; WX 276 ; N uniA71F ; G 3192 -U 42790 ; WX 945 ; N uniA726 ; G 3193 -U 42791 ; WX 712 ; N uniA727 ; G 3194 -U 42792 ; WX 1003 ; N uniA728 ; G 3195 -U 42793 ; WX 909 ; N uniA729 ; G 3196 -U 42794 ; WX 696 ; N uniA72A ; G 3197 -U 42795 ; WX 609 ; N uniA72B ; G 3198 -U 42796 ; WX 634 ; N uniA72C ; G 3199 -U 42797 ; WX 598 ; N uniA72D ; G 3200 -U 42798 ; WX 741 ; N uniA72E ; G 3201 -U 42799 ; WX 706 ; N uniA72F ; G 3202 -U 42800 ; WX 592 ; N uniA730 ; G 3203 -U 42801 ; WX 563 ; N uniA731 ; G 3204 -U 42802 ; WX 1301 ; N uniA732 ; G 3205 -U 42803 ; WX 983 ; N uniA733 ; G 3206 -U 42804 ; WX 1261 ; N uniA734 ; G 3207 -U 42805 ; WX 985 ; N uniA735 ; G 3208 -U 42806 ; WX 1168 ; N uniA736 ; G 3209 -U 42807 ; WX 1007 ; N uniA737 ; G 3210 -U 42808 ; WX 1016 ; N uniA738 ; G 3211 -U 42809 ; WX 832 ; N uniA739 ; G 3212 -U 42810 ; WX 1016 ; N uniA73A ; G 3213 -U 42811 ; WX 832 ; N uniA73B ; G 3214 -U 42812 ; WX 994 ; N uniA73C ; G 3215 -U 42813 ; WX 746 ; N uniA73D ; G 3216 -U 42814 ; WX 796 ; N uniA73E ; G 3217 -U 42815 ; WX 609 ; N uniA73F ; G 3218 -U 42816 ; WX 869 ; N uniA740 ; G 3219 -U 42817 ; WX 693 ; N uniA741 ; G 3220 -U 42822 ; WX 916 ; N uniA746 ; G 3221 -U 42823 ; WX 581 ; N uniA747 ; G 3222 -U 42826 ; WX 1010 ; N uniA74A ; G 3223 -U 42827 ; WX 770 ; N uniA74B ; G 3224 -U 42830 ; WX 1448 ; N uniA74E ; G 3225 -U 42831 ; WX 1060 ; N uniA74F ; G 3226 -U 42856 ; WX 787 ; N uniA768 ; G 3227 -U 42857 ; WX 716 ; N uniA769 ; G 3228 -U 42875 ; WX 694 ; N uniA77B ; G 3229 -U 42876 ; WX 527 ; N uniA77C ; G 3230 -U 42880 ; WX 703 ; N uniA780 ; G 3231 -U 42881 ; WX 380 ; N uniA781 ; G 3232 -U 42882 ; WX 872 ; N uniA782 ; G 3233 -U 42883 ; WX 727 ; N uniA783 ; G 3234 -U 42884 ; WX 694 ; N uniA784 ; G 3235 -U 42885 ; WX 527 ; N uniA785 ; G 3236 -U 42886 ; WX 796 ; N uniA786 ; G 3237 -U 42887 ; WX 609 ; N uniA787 ; G 3238 -U 42891 ; WX 439 ; N uniA78B ; G 3239 -U 42892 ; WX 306 ; N uniA78C ; G 3240 -U 42893 ; WX 913 ; N uniA78D ; G 3241 -U 42896 ; WX 914 ; N uniA790 ; G 3242 -U 42897 ; WX 812 ; N uniA791 ; G 3243 -U 42922 ; WX 945 ; N uniA7AA ; G 3244 -U 43000 ; WX 595 ; N uniA7F8 ; G 3245 -U 43001 ; WX 647 ; N uniA7F9 ; G 3246 -U 43002 ; WX 1068 ; N uniA7FA ; G 3247 -U 43003 ; WX 710 ; N uniA7FB ; G 3248 -U 43004 ; WX 752 ; N uniA7FC ; G 3249 -U 43005 ; WX 1107 ; N uniA7FD ; G 3250 -U 43006 ; WX 468 ; N uniA7FE ; G 3251 -U 43007 ; WX 1286 ; N uniA7FF ; G 3252 -U 62464 ; WX 726 ; N uniF400 ; G 3253 -U 62465 ; WX 737 ; N uniF401 ; G 3254 -U 62466 ; WX 786 ; N uniF402 ; G 3255 -U 62467 ; WX 1019 ; N uniF403 ; G 3256 -U 62468 ; WX 737 ; N uniF404 ; G 3257 -U 62469 ; WX 731 ; N uniF405 ; G 3258 -U 62470 ; WX 796 ; N uniF406 ; G 3259 -U 62471 ; WX 1058 ; N uniF407 ; G 3260 -U 62472 ; WX 737 ; N uniF408 ; G 3261 -U 62473 ; WX 737 ; N uniF409 ; G 3262 -U 62474 ; WX 1329 ; N uniF40A ; G 3263 -U 62475 ; WX 754 ; N uniF40B ; G 3264 -U 62476 ; WX 753 ; N uniF40C ; G 3265 -U 62477 ; WX 1024 ; N uniF40D ; G 3266 -U 62478 ; WX 737 ; N uniF40E ; G 3267 -U 62479 ; WX 753 ; N uniF40F ; G 3268 -U 62480 ; WX 1070 ; N uniF410 ; G 3269 -U 62481 ; WX 818 ; N uniF411 ; G 3270 -U 62482 ; WX 870 ; N uniF412 ; G 3271 -U 62483 ; WX 819 ; N uniF413 ; G 3272 -U 62484 ; WX 1016 ; N uniF414 ; G 3273 -U 62485 ; WX 753 ; N uniF415 ; G 3274 -U 62486 ; WX 1008 ; N uniF416 ; G 3275 -U 62487 ; WX 752 ; N uniF417 ; G 3276 -U 62488 ; WX 760 ; N uniF418 ; G 3277 -U 62489 ; WX 753 ; N uniF419 ; G 3278 -U 62490 ; WX 800 ; N uniF41A ; G 3279 -U 62491 ; WX 753 ; N uniF41B ; G 3280 -U 62492 ; WX 760 ; N uniF41C ; G 3281 -U 62493 ; WX 738 ; N uniF41D ; G 3282 -U 62494 ; WX 801 ; N uniF41E ; G 3283 -U 62495 ; WX 956 ; N uniF41F ; G 3284 -U 62496 ; WX 736 ; N uniF420 ; G 3285 -U 62497 ; WX 847 ; N uniF421 ; G 3286 -U 62498 ; WX 737 ; N uniF422 ; G 3287 -U 62499 ; WX 737 ; N uniF423 ; G 3288 -U 62500 ; WX 737 ; N uniF424 ; G 3289 -U 62501 ; WX 793 ; N uniF425 ; G 3290 -U 62502 ; WX 1033 ; N uniF426 ; G 3291 -U 62504 ; WX 904 ; N uniF428 ; G 3292 -U 63172 ; WX 380 ; N uniF6C4 ; G 3293 -U 63173 ; WX 667 ; N uniF6C5 ; G 3294 -U 63174 ; WX 699 ; N uniF6C6 ; G 3295 -U 63175 ; WX 727 ; N uniF6C7 ; G 3296 -U 63176 ; WX 1058 ; N uniF6C8 ; G 3297 -U 63185 ; WX 500 ; N cyrBreve ; G 3298 -U 63188 ; WX 500 ; N cyrbreve ; G 3299 -U 64256 ; WX 827 ; N uniFB00 ; G 3300 -U 64257 ; WX 727 ; N fi ; G 3301 -U 64258 ; WX 727 ; N fl ; G 3302 -U 64259 ; WX 1108 ; N uniFB03 ; G 3303 -U 64260 ; WX 1146 ; N uniFB04 ; G 3304 -U 64261 ; WX 879 ; N uniFB05 ; G 3305 -U 64262 ; WX 971 ; N uniFB06 ; G 3306 -U 65024 ; WX 0 ; N uniFE00 ; G 3307 -U 65025 ; WX 0 ; N uniFE01 ; G 3308 -U 65026 ; WX 0 ; N uniFE02 ; G 3309 -U 65027 ; WX 0 ; N uniFE03 ; G 3310 -U 65028 ; WX 0 ; N uniFE04 ; G 3311 -U 65029 ; WX 0 ; N uniFE05 ; G 3312 -U 65030 ; WX 0 ; N uniFE06 ; G 3313 -U 65031 ; WX 0 ; N uniFE07 ; G 3314 -U 65032 ; WX 0 ; N uniFE08 ; G 3315 -U 65033 ; WX 0 ; N uniFE09 ; G 3316 -U 65034 ; WX 0 ; N uniFE0A ; G 3317 -U 65035 ; WX 0 ; N uniFE0B ; G 3318 -U 65036 ; WX 0 ; N uniFE0C ; G 3319 -U 65037 ; WX 0 ; N uniFE0D ; G 3320 -U 65038 ; WX 0 ; N uniFE0E ; G 3321 -U 65039 ; WX 0 ; N uniFE0F ; G 3322 -U 65529 ; WX 0 ; N uniFFF9 ; G 3323 -U 65530 ; WX 0 ; N uniFFFA ; G 3324 -U 65531 ; WX 0 ; N uniFFFB ; G 3325 -U 65532 ; WX 0 ; N uniFFFC ; G 3326 -U 65533 ; WX 1113 ; N uniFFFD ; G 3327 -EndCharMetrics -StartKernData -StartKernPairs 1153 - -KPX dollar seven -112 -KPX dollar nine -149 -KPX dollar colon -102 -KPX dollar less -102 -KPX dollar I -36 -KPX dollar W -36 -KPX dollar Y -83 -KPX dollar Z -83 -KPX dollar backslash -83 -KPX dollar questiondown -83 -KPX dollar Aacute -83 -KPX dollar Hbar -112 -KPX dollar hbar -36 -KPX dollar lacute -102 - -KPX percent ampersand 38 -KPX percent asterisk 38 -KPX percent two 38 -KPX percent less -36 -KPX percent Egrave 38 -KPX percent Icircumflex 38 -KPX percent agrave 38 -KPX percent Ebreve 38 -KPX percent lacute -36 - - -KPX quotesingle nine -36 - - -KPX parenright dollar -120 -KPX parenright D -112 -KPX parenright H -112 -KPX parenright R -112 -KPX parenright U -36 -KPX parenright X -36 -KPX parenright cent -112 -KPX parenright sterling -112 -KPX parenright currency -112 -KPX parenright yen -112 -KPX parenright brokenbar -112 -KPX parenright section -112 -KPX parenright dieresis -112 -KPX parenright ordfeminine -112 -KPX parenright guillemotleft -112 -KPX parenright logicalnot -112 -KPX parenright sfthyphen -112 -KPX parenright acute -112 -KPX parenright mu -112 -KPX parenright paragraph -112 -KPX parenright periodcentered -112 -KPX parenright cedilla -112 -KPX parenright ordmasculine -112 -KPX parenright guillemotright -36 -KPX parenright onequarter -36 -KPX parenright onehalf -36 -KPX parenright threequarters -36 -KPX parenright Yacute -112 -KPX parenright ebreve -112 -KPX parenright edotaccent -36 -KPX parenright ecaron -36 -KPX parenright dotlessi -36 - - - -KPX period dollar -83 -KPX period ampersand -55 -KPX period two -55 -KPX period eight -73 -KPX period colon -73 -KPX period less -55 -KPX period H -45 -KPX period R -45 -KPX period X -45 -KPX period backslash -92 -KPX period ordfeminine -45 -KPX period guillemotleft -45 -KPX period logicalnot -45 -KPX period sfthyphen -45 -KPX period acute -45 -KPX period mu -45 -KPX period paragraph -45 -KPX period periodcentered -45 -KPX period cedilla -45 -KPX period ordmasculine -36 -KPX period guillemotright -45 -KPX period onequarter -45 -KPX period onehalf -45 -KPX period threequarters -45 -KPX period questiondown -92 -KPX period Aacute -92 -KPX period Egrave -55 -KPX period Icircumflex -55 -KPX period Yacute -45 -KPX period Ebreve -55 -KPX period ebreve -45 -KPX period Idot -73 -KPX period dotlessi -45 -KPX period lacute -55 - -KPX slash seven -167 -KPX slash eight -112 -KPX slash nine -243 -KPX slash colon -139 -KPX slash less -131 -KPX slash backslash -73 -KPX slash questiondown -73 -KPX slash Aacute -73 -KPX slash Hbar -167 -KPX slash Idot -112 -KPX slash lacute -131 - - -KPX two nine -36 -KPX two semicolon -36 - -KPX three dollar -149 -KPX three D -55 -KPX three H -55 -KPX three R -55 -KPX three cent -55 -KPX three sterling -55 -KPX three currency -55 -KPX three yen -55 -KPX three brokenbar -55 -KPX three section -55 -KPX three dieresis -55 -KPX three ordfeminine -55 -KPX three guillemotleft -55 -KPX three logicalnot -55 -KPX three sfthyphen -55 -KPX three acute -55 -KPX three mu -55 -KPX three paragraph -55 -KPX three periodcentered -55 -KPX three cedilla -55 -KPX three ordmasculine -55 -KPX three Yacute -55 -KPX three ebreve -55 - - -KPX five seven -36 -KPX five nine -73 -KPX five colon -45 -KPX five less -63 -KPX five D 47 -KPX five backslash -36 -KPX five cent 47 -KPX five sterling 47 -KPX five currency 47 -KPX five yen 47 -KPX five brokenbar 47 -KPX five section 47 -KPX five dieresis 47 -KPX five ordmasculine 38 -KPX five questiondown -36 -KPX five Aacute -36 -KPX five Hbar -36 -KPX five lacute -63 - -KPX six six -45 -KPX six Gdotaccent -45 -KPX six Gcommaaccent -45 - -KPX seven dollar -112 -KPX seven seven -73 -KPX seven D -196 -KPX seven F -235 -KPX seven H -235 -KPX seven R -235 -KPX seven U -149 -KPX seven V -188 -KPX seven X -188 -KPX seven Z -225 -KPX seven backslash -225 -KPX seven m -149 -KPX seven braceright -149 -KPX seven cent -196 -KPX seven sterling -196 -KPX seven currency -196 -KPX seven yen -196 -KPX seven brokenbar -196 -KPX seven section -196 -KPX seven dieresis -159 -KPX seven copyright -235 -KPX seven ordfeminine -235 -KPX seven guillemotleft -235 -KPX seven logicalnot -235 -KPX seven sfthyphen -235 -KPX seven acute -235 -KPX seven mu -235 -KPX seven paragraph -235 -KPX seven periodcentered -235 -KPX seven cedilla -235 -KPX seven ordmasculine -159 -KPX seven guillemotright -188 -KPX seven onequarter -188 -KPX seven onehalf -188 -KPX seven threequarters -188 -KPX seven questiondown -225 -KPX seven Aacute -225 -KPX seven Eacute -235 -KPX seven Idieresis -235 -KPX seven Yacute -235 -KPX seven ebreve -159 -KPX seven edotaccent -149 -KPX seven ecaron -149 -KPX seven gdotaccent -188 -KPX seven gcommaaccent -188 -KPX seven Hbar -73 -KPX seven dotlessi -188 - -KPX eight dollar -63 - -KPX nine dollar -159 -KPX nine two -36 -KPX nine D -188 -KPX nine H -188 -KPX nine L -36 -KPX nine R -188 -KPX nine X -131 -KPX nine backslash -83 -KPX nine cent -188 -KPX nine sterling -188 -KPX nine currency -188 -KPX nine yen -188 -KPX nine brokenbar -188 -KPX nine section -188 -KPX nine dieresis -188 -KPX nine ordfeminine -188 -KPX nine guillemotleft -188 -KPX nine logicalnot -188 -KPX nine sfthyphen -188 -KPX nine acute -188 -KPX nine mu -188 -KPX nine paragraph -188 -KPX nine periodcentered -188 -KPX nine cedilla -188 -KPX nine ordmasculine -188 -KPX nine guillemotright -131 -KPX nine onequarter -131 -KPX nine onehalf -131 -KPX nine threequarters -131 -KPX nine questiondown -83 -KPX nine Aacute -83 -KPX nine Yacute -188 -KPX nine Ebreve -36 -KPX nine ebreve -188 -KPX nine dotlessi -131 - -KPX colon dollar -131 -KPX colon D -178 -KPX colon H -167 -KPX colon L -36 -KPX colon R -167 -KPX colon U -92 -KPX colon X -83 -KPX colon backslash -45 -KPX colon cent -178 -KPX colon sterling -178 -KPX colon currency -178 -KPX colon yen -178 -KPX colon brokenbar -178 -KPX colon section -178 -KPX colon dieresis -139 -KPX colon ordfeminine -167 -KPX colon guillemotleft -167 -KPX colon logicalnot -167 -KPX colon sfthyphen -167 -KPX colon acute -167 -KPX colon mu -167 -KPX colon paragraph -167 -KPX colon periodcentered -167 -KPX colon cedilla -167 -KPX colon ordmasculine -167 -KPX colon guillemotright -83 -KPX colon onequarter -83 -KPX colon onehalf -83 -KPX colon threequarters -83 -KPX colon questiondown -45 -KPX colon Aacute -45 -KPX colon Yacute -167 -KPX colon ebreve -167 -KPX colon edotaccent -92 -KPX colon ecaron -92 -KPX colon dotlessi -83 - -KPX semicolon dollar -73 -KPX semicolon ampersand -36 -KPX semicolon two -36 -KPX semicolon Egrave -36 -KPX semicolon Icircumflex -36 -KPX semicolon Ebreve -36 - -KPX less dollar -131 -KPX less ampersand -36 -KPX less D -159 -KPX less H -178 -KPX less L -36 -KPX less R -178 -KPX less X -178 -KPX less cent -159 -KPX less sterling -159 -KPX less currency -159 -KPX less yen -159 -KPX less brokenbar -159 -KPX less section -159 -KPX less dieresis -159 -KPX less ordfeminine -178 -KPX less guillemotleft -178 -KPX less logicalnot -178 -KPX less sfthyphen -178 -KPX less acute -178 -KPX less mu -178 -KPX less paragraph -178 -KPX less periodcentered -178 -KPX less cedilla -178 -KPX less ordmasculine -178 -KPX less guillemotright -178 -KPX less onequarter -178 -KPX less onehalf -178 -KPX less threequarters -178 -KPX less Egrave -36 -KPX less Icircumflex -36 -KPX less Yacute -178 -KPX less ebreve -178 -KPX less dotlessi -178 - - - - - - - - - - -KPX m hyphen -73 -KPX m seven -149 -KPX m Hbar -149 - -KPX braceright hyphen -73 -KPX braceright seven -149 -KPX braceright Hbar -149 - - - - - - - - - - - - - - -KPX Eth nine -36 - - - -KPX ucircumflex seven -167 -KPX ucircumflex eight -112 -KPX ucircumflex nine -243 -KPX ucircumflex colon -139 -KPX ucircumflex less -131 -KPX ucircumflex backslash -73 -KPX ucircumflex questiondown -73 -KPX ucircumflex Aacute -73 -KPX ucircumflex Hbar -167 -KPX ucircumflex Idot -112 -KPX ucircumflex lacute -131 - -KPX ydieresis seven -167 -KPX ydieresis eight -112 -KPX ydieresis nine -243 -KPX ydieresis colon -139 -KPX ydieresis less -131 -KPX ydieresis backslash -73 -KPX ydieresis questiondown -73 -KPX ydieresis Aacute -73 -KPX ydieresis Hbar -167 -KPX ydieresis Idot -112 -KPX ydieresis lacute -131 - -KPX Abreve O -241 - -KPX abreve seven -167 -KPX abreve eight -112 -KPX abreve nine -243 -KPX abreve colon -139 -KPX abreve less -131 -KPX abreve backslash -73 -KPX abreve questiondown -73 -KPX abreve Aacute -73 -KPX abreve Hbar -167 -KPX abreve Idot -112 -KPX abreve lacute -131 - - - -KPX Edotaccent seven -36 -KPX Edotaccent nine -73 -KPX Edotaccent colon -45 -KPX Edotaccent less -63 -KPX Edotaccent D 47 -KPX Edotaccent backslash -36 -KPX Edotaccent cent 47 -KPX Edotaccent sterling 47 -KPX Edotaccent currency 47 -KPX Edotaccent yen 47 -KPX Edotaccent brokenbar 47 -KPX Edotaccent section 47 -KPX Edotaccent dieresis 47 -KPX Edotaccent ordmasculine 38 -KPX Edotaccent questiondown -36 -KPX Edotaccent Aacute -36 -KPX Edotaccent Hbar -36 -KPX Edotaccent lacute -63 - - -KPX Ecaron seven -36 -KPX Ecaron nine -73 -KPX Ecaron colon -45 -KPX Ecaron less -63 -KPX Ecaron D 47 -KPX Ecaron backslash -36 -KPX Ecaron cent 47 -KPX Ecaron sterling 47 -KPX Ecaron currency 47 -KPX Ecaron yen 47 -KPX Ecaron brokenbar 47 -KPX Ecaron section 47 -KPX Ecaron dieresis 47 -KPX Ecaron ordmasculine 38 -KPX Ecaron questiondown -36 -KPX Ecaron Aacute -36 -KPX Ecaron Hbar -36 -KPX Ecaron lacute -63 - - -KPX Gdotaccent six -45 -KPX Gdotaccent Gdotaccent -45 -KPX Gdotaccent Gcommaaccent -45 - -KPX Gcommaaccent six -45 -KPX Gcommaaccent Gdotaccent -45 -KPX Gcommaaccent Gcommaaccent -45 - -KPX Hbar dollar -112 -KPX Hbar seven -73 -KPX Hbar D -196 -KPX Hbar F -235 -KPX Hbar H -235 -KPX Hbar R -235 -KPX Hbar U -149 -KPX Hbar V -188 -KPX Hbar X -188 -KPX Hbar Z -225 -KPX Hbar backslash -225 -KPX Hbar m -149 -KPX Hbar braceright -149 -KPX Hbar cent -196 -KPX Hbar sterling -196 -KPX Hbar currency -196 -KPX Hbar yen -196 -KPX Hbar brokenbar -196 -KPX Hbar section -196 -KPX Hbar dieresis -159 -KPX Hbar copyright -235 -KPX Hbar ordfeminine -235 -KPX Hbar guillemotleft -235 -KPX Hbar logicalnot -235 -KPX Hbar sfthyphen -235 -KPX Hbar acute -235 -KPX Hbar mu -235 -KPX Hbar paragraph -235 -KPX Hbar periodcentered -235 -KPX Hbar cedilla -235 -KPX Hbar ordmasculine -159 -KPX Hbar guillemotright -188 -KPX Hbar onequarter -188 -KPX Hbar onehalf -188 -KPX Hbar threequarters -188 -KPX Hbar questiondown -225 -KPX Hbar Aacute -225 -KPX Hbar Eacute -235 -KPX Hbar Idieresis -235 -KPX Hbar Yacute -235 -KPX Hbar ebreve -159 -KPX Hbar edotaccent -149 -KPX Hbar ecaron -149 -KPX Hbar gdotaccent -188 -KPX Hbar gcommaaccent -188 -KPX Hbar Hbar -73 -KPX Hbar dotlessi -188 - -KPX Idot dollar -63 - -KPX lacute dollar -131 -KPX lacute ampersand -36 -KPX lacute D -159 -KPX lacute H -178 -KPX lacute L -36 -KPX lacute R -178 -KPX lacute X -178 -KPX lacute cent -159 -KPX lacute sterling -159 -KPX lacute currency -159 -KPX lacute yen -159 -KPX lacute brokenbar -159 -KPX lacute section -159 -KPX lacute dieresis -159 -KPX lacute ordfeminine -178 -KPX lacute guillemotleft -178 -KPX lacute logicalnot -178 -KPX lacute sfthyphen -178 -KPX lacute acute -178 -KPX lacute mu -178 -KPX lacute paragraph -178 -KPX lacute periodcentered -178 -KPX lacute cedilla -178 -KPX lacute ordmasculine -178 -KPX lacute guillemotright -178 -KPX lacute onequarter -178 -KPX lacute onehalf -178 -KPX lacute threequarters -178 -KPX lacute Egrave -36 -KPX lacute Icircumflex -36 -KPX lacute Yacute -178 -KPX lacute ebreve -178 -KPX lacute dotlessi -178 - - -KPX uni027D dollar -282 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ttf deleted file mode 100644 index 805daf2..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ufm deleted file mode 100644 index e9d62b8..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ufm +++ /dev/null @@ -1,3883 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Serif -FontSubfamily Italic -UniqueID DejaVu Serif Italic -FullName DejaVu Serif Italic -Version Version 2.37 -PostScriptName DejaVuSerif-Italic -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -PreferredFamily DejaVu Serif -PreferredSubfamily Italic -Weight Medium -ItalicAngle -11 -IsFixedPitch false -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 928 -Descender -236 -FontBBox -839 -347 1645 1109 -StartCharMetrics 3507 -U 32 ; WX 318 ; N space ; G 3 -U 33 ; WX 402 ; N exclam ; G 4 -U 34 ; WX 460 ; N quotedbl ; G 5 -U 35 ; WX 838 ; N numbersign ; G 6 -U 36 ; WX 636 ; N dollar ; G 7 -U 37 ; WX 950 ; N percent ; G 8 -U 38 ; WX 890 ; N ampersand ; G 9 -U 39 ; WX 275 ; N quotesingle ; G 10 -U 40 ; WX 390 ; N parenleft ; G 11 -U 41 ; WX 390 ; N parenright ; G 12 -U 42 ; WX 500 ; N asterisk ; G 13 -U 43 ; WX 838 ; N plus ; G 14 -U 44 ; WX 318 ; N comma ; G 15 -U 45 ; WX 338 ; N hyphen ; G 16 -U 46 ; WX 318 ; N period ; G 17 -U 47 ; WX 337 ; N slash ; G 18 -U 48 ; WX 636 ; N zero ; G 19 -U 49 ; WX 636 ; N one ; G 20 -U 50 ; WX 636 ; N two ; G 21 -U 51 ; WX 636 ; N three ; G 22 -U 52 ; WX 636 ; N four ; G 23 -U 53 ; WX 636 ; N five ; G 24 -U 54 ; WX 636 ; N six ; G 25 -U 55 ; WX 636 ; N seven ; G 26 -U 56 ; WX 636 ; N eight ; G 27 -U 57 ; WX 636 ; N nine ; G 28 -U 58 ; WX 337 ; N colon ; G 29 -U 59 ; WX 337 ; N semicolon ; G 30 -U 60 ; WX 838 ; N less ; G 31 -U 61 ; WX 838 ; N equal ; G 32 -U 62 ; WX 838 ; N greater ; G 33 -U 63 ; WX 536 ; N question ; G 34 -U 64 ; WX 1000 ; N at ; G 35 -U 65 ; WX 722 ; N A ; G 36 -U 66 ; WX 735 ; N B ; G 37 -U 67 ; WX 765 ; N C ; G 38 -U 68 ; WX 802 ; N D ; G 39 -U 69 ; WX 730 ; N E ; G 40 -U 70 ; WX 694 ; N F ; G 41 -U 71 ; WX 799 ; N G ; G 42 -U 72 ; WX 872 ; N H ; G 43 -U 73 ; WX 395 ; N I ; G 44 -U 74 ; WX 401 ; N J ; G 45 -U 75 ; WX 747 ; N K ; G 46 -U 76 ; WX 664 ; N L ; G 47 -U 77 ; WX 1024 ; N M ; G 48 -U 78 ; WX 875 ; N N ; G 49 -U 79 ; WX 820 ; N O ; G 50 -U 80 ; WX 673 ; N P ; G 51 -U 81 ; WX 820 ; N Q ; G 52 -U 82 ; WX 753 ; N R ; G 53 -U 83 ; WX 685 ; N S ; G 54 -U 84 ; WX 667 ; N T ; G 55 -U 85 ; WX 843 ; N U ; G 56 -U 86 ; WX 722 ; N V ; G 57 -U 87 ; WX 1028 ; N W ; G 58 -U 88 ; WX 712 ; N X ; G 59 -U 89 ; WX 660 ; N Y ; G 60 -U 90 ; WX 695 ; N Z ; G 61 -U 91 ; WX 390 ; N bracketleft ; G 62 -U 92 ; WX 337 ; N backslash ; G 63 -U 93 ; WX 390 ; N bracketright ; G 64 -U 94 ; WX 838 ; N asciicircum ; G 65 -U 95 ; WX 500 ; N underscore ; G 66 -U 96 ; WX 500 ; N grave ; G 67 -U 97 ; WX 596 ; N a ; G 68 -U 98 ; WX 640 ; N b ; G 69 -U 99 ; WX 560 ; N c ; G 70 -U 100 ; WX 640 ; N d ; G 71 -U 101 ; WX 592 ; N e ; G 72 -U 102 ; WX 370 ; N f ; G 73 -U 103 ; WX 640 ; N g ; G 74 -U 104 ; WX 644 ; N h ; G 75 -U 105 ; WX 320 ; N i ; G 76 -U 106 ; WX 310 ; N j ; G 77 -U 107 ; WX 606 ; N k ; G 78 -U 108 ; WX 320 ; N l ; G 79 -U 109 ; WX 948 ; N m ; G 80 -U 110 ; WX 644 ; N n ; G 81 -U 111 ; WX 602 ; N o ; G 82 -U 112 ; WX 640 ; N p ; G 83 -U 113 ; WX 640 ; N q ; G 84 -U 114 ; WX 478 ; N r ; G 85 -U 115 ; WX 513 ; N s ; G 86 -U 116 ; WX 402 ; N t ; G 87 -U 117 ; WX 644 ; N u ; G 88 -U 118 ; WX 565 ; N v ; G 89 -U 119 ; WX 856 ; N w ; G 90 -U 120 ; WX 564 ; N x ; G 91 -U 121 ; WX 565 ; N y ; G 92 -U 122 ; WX 527 ; N z ; G 93 -U 123 ; WX 636 ; N braceleft ; G 94 -U 124 ; WX 337 ; N bar ; G 95 -U 125 ; WX 636 ; N braceright ; G 96 -U 126 ; WX 838 ; N asciitilde ; G 97 -U 160 ; WX 318 ; N nbspace ; G 98 -U 161 ; WX 402 ; N exclamdown ; G 99 -U 162 ; WX 636 ; N cent ; G 100 -U 163 ; WX 636 ; N sterling ; G 101 -U 164 ; WX 636 ; N currency ; G 102 -U 165 ; WX 636 ; N yen ; G 103 -U 166 ; WX 337 ; N brokenbar ; G 104 -U 167 ; WX 500 ; N section ; G 105 -U 168 ; WX 500 ; N dieresis ; G 106 -U 169 ; WX 1000 ; N copyright ; G 107 -U 170 ; WX 475 ; N ordfeminine ; G 108 -U 171 ; WX 612 ; N guillemotleft ; G 109 -U 172 ; WX 838 ; N logicalnot ; G 110 -U 173 ; WX 338 ; N sfthyphen ; G 111 -U 174 ; WX 1000 ; N registered ; G 112 -U 175 ; WX 500 ; N macron ; G 113 -U 176 ; WX 500 ; N degree ; G 114 -U 177 ; WX 838 ; N plusminus ; G 115 -U 178 ; WX 401 ; N twosuperior ; G 116 -U 179 ; WX 401 ; N threesuperior ; G 117 -U 180 ; WX 500 ; N acute ; G 118 -U 181 ; WX 650 ; N mu ; G 119 -U 182 ; WX 636 ; N paragraph ; G 120 -U 183 ; WX 318 ; N periodcentered ; G 121 -U 184 ; WX 500 ; N cedilla ; G 122 -U 185 ; WX 401 ; N onesuperior ; G 123 -U 186 ; WX 470 ; N ordmasculine ; G 124 -U 187 ; WX 612 ; N guillemotright ; G 125 -U 188 ; WX 969 ; N onequarter ; G 126 -U 189 ; WX 969 ; N onehalf ; G 127 -U 190 ; WX 969 ; N threequarters ; G 128 -U 191 ; WX 536 ; N questiondown ; G 129 -U 192 ; WX 722 ; N Agrave ; G 130 -U 193 ; WX 722 ; N Aacute ; G 131 -U 194 ; WX 722 ; N Acircumflex ; G 132 -U 195 ; WX 722 ; N Atilde ; G 133 -U 196 ; WX 722 ; N Adieresis ; G 134 -U 197 ; WX 722 ; N Aring ; G 135 -U 198 ; WX 1001 ; N AE ; G 136 -U 199 ; WX 765 ; N Ccedilla ; G 137 -U 200 ; WX 730 ; N Egrave ; G 138 -U 201 ; WX 730 ; N Eacute ; G 139 -U 202 ; WX 730 ; N Ecircumflex ; G 140 -U 203 ; WX 730 ; N Edieresis ; G 141 -U 204 ; WX 395 ; N Igrave ; G 142 -U 205 ; WX 395 ; N Iacute ; G 143 -U 206 ; WX 395 ; N Icircumflex ; G 144 -U 207 ; WX 395 ; N Idieresis ; G 145 -U 208 ; WX 807 ; N Eth ; G 146 -U 209 ; WX 875 ; N Ntilde ; G 147 -U 210 ; WX 820 ; N Ograve ; G 148 -U 211 ; WX 820 ; N Oacute ; G 149 -U 212 ; WX 820 ; N Ocircumflex ; G 150 -U 213 ; WX 820 ; N Otilde ; G 151 -U 214 ; WX 820 ; N Odieresis ; G 152 -U 215 ; WX 838 ; N multiply ; G 153 -U 216 ; WX 820 ; N Oslash ; G 154 -U 217 ; WX 843 ; N Ugrave ; G 155 -U 218 ; WX 843 ; N Uacute ; G 156 -U 219 ; WX 843 ; N Ucircumflex ; G 157 -U 220 ; WX 843 ; N Udieresis ; G 158 -U 221 ; WX 660 ; N Yacute ; G 159 -U 222 ; WX 676 ; N Thorn ; G 160 -U 223 ; WX 668 ; N germandbls ; G 161 -U 224 ; WX 596 ; N agrave ; G 162 -U 225 ; WX 596 ; N aacute ; G 163 -U 226 ; WX 596 ; N acircumflex ; G 164 -U 227 ; WX 596 ; N atilde ; G 165 -U 228 ; WX 596 ; N adieresis ; G 166 -U 229 ; WX 596 ; N aring ; G 167 -U 230 ; WX 940 ; N ae ; G 168 -U 231 ; WX 560 ; N ccedilla ; G 169 -U 232 ; WX 592 ; N egrave ; G 170 -U 233 ; WX 592 ; N eacute ; G 171 -U 234 ; WX 592 ; N ecircumflex ; G 172 -U 235 ; WX 592 ; N edieresis ; G 173 -U 236 ; WX 320 ; N igrave ; G 174 -U 237 ; WX 320 ; N iacute ; G 175 -U 238 ; WX 320 ; N icircumflex ; G 176 -U 239 ; WX 320 ; N idieresis ; G 177 -U 240 ; WX 602 ; N eth ; G 178 -U 241 ; WX 644 ; N ntilde ; G 179 -U 242 ; WX 602 ; N ograve ; G 180 -U 243 ; WX 602 ; N oacute ; G 181 -U 244 ; WX 602 ; N ocircumflex ; G 182 -U 245 ; WX 602 ; N otilde ; G 183 -U 246 ; WX 602 ; N odieresis ; G 184 -U 247 ; WX 838 ; N divide ; G 185 -U 248 ; WX 602 ; N oslash ; G 186 -U 249 ; WX 644 ; N ugrave ; G 187 -U 250 ; WX 644 ; N uacute ; G 188 -U 251 ; WX 644 ; N ucircumflex ; G 189 -U 252 ; WX 644 ; N udieresis ; G 190 -U 253 ; WX 565 ; N yacute ; G 191 -U 254 ; WX 640 ; N thorn ; G 192 -U 255 ; WX 565 ; N ydieresis ; G 193 -U 256 ; WX 722 ; N Amacron ; G 194 -U 257 ; WX 596 ; N amacron ; G 195 -U 258 ; WX 722 ; N Abreve ; G 196 -U 259 ; WX 596 ; N abreve ; G 197 -U 260 ; WX 722 ; N Aogonek ; G 198 -U 261 ; WX 596 ; N aogonek ; G 199 -U 262 ; WX 765 ; N Cacute ; G 200 -U 263 ; WX 560 ; N cacute ; G 201 -U 264 ; WX 765 ; N Ccircumflex ; G 202 -U 265 ; WX 560 ; N ccircumflex ; G 203 -U 266 ; WX 765 ; N Cdotaccent ; G 204 -U 267 ; WX 560 ; N cdotaccent ; G 205 -U 268 ; WX 765 ; N Ccaron ; G 206 -U 269 ; WX 560 ; N ccaron ; G 207 -U 270 ; WX 802 ; N Dcaron ; G 208 -U 271 ; WX 640 ; N dcaron ; G 209 -U 272 ; WX 807 ; N Dcroat ; G 210 -U 273 ; WX 640 ; N dmacron ; G 211 -U 274 ; WX 730 ; N Emacron ; G 212 -U 275 ; WX 592 ; N emacron ; G 213 -U 276 ; WX 730 ; N Ebreve ; G 214 -U 277 ; WX 592 ; N ebreve ; G 215 -U 278 ; WX 730 ; N Edotaccent ; G 216 -U 279 ; WX 592 ; N edotaccent ; G 217 -U 280 ; WX 730 ; N Eogonek ; G 218 -U 281 ; WX 592 ; N eogonek ; G 219 -U 282 ; WX 730 ; N Ecaron ; G 220 -U 283 ; WX 592 ; N ecaron ; G 221 -U 284 ; WX 799 ; N Gcircumflex ; G 222 -U 285 ; WX 640 ; N gcircumflex ; G 223 -U 286 ; WX 799 ; N Gbreve ; G 224 -U 287 ; WX 640 ; N gbreve ; G 225 -U 288 ; WX 799 ; N Gdotaccent ; G 226 -U 289 ; WX 640 ; N gdotaccent ; G 227 -U 290 ; WX 799 ; N Gcommaaccent ; G 228 -U 291 ; WX 640 ; N gcommaaccent ; G 229 -U 292 ; WX 872 ; N Hcircumflex ; G 230 -U 293 ; WX 644 ; N hcircumflex ; G 231 -U 294 ; WX 872 ; N Hbar ; G 232 -U 295 ; WX 644 ; N hbar ; G 233 -U 296 ; WX 395 ; N Itilde ; G 234 -U 297 ; WX 320 ; N itilde ; G 235 -U 298 ; WX 395 ; N Imacron ; G 236 -U 299 ; WX 320 ; N imacron ; G 237 -U 300 ; WX 395 ; N Ibreve ; G 238 -U 301 ; WX 320 ; N ibreve ; G 239 -U 302 ; WX 395 ; N Iogonek ; G 240 -U 303 ; WX 320 ; N iogonek ; G 241 -U 304 ; WX 395 ; N Idot ; G 242 -U 305 ; WX 320 ; N dotlessi ; G 243 -U 306 ; WX 801 ; N IJ ; G 244 -U 307 ; WX 533 ; N ij ; G 245 -U 308 ; WX 401 ; N Jcircumflex ; G 246 -U 309 ; WX 310 ; N jcircumflex ; G 247 -U 310 ; WX 747 ; N Kcommaaccent ; G 248 -U 311 ; WX 606 ; N kcommaaccent ; G 249 -U 312 ; WX 606 ; N kgreenlandic ; G 250 -U 313 ; WX 664 ; N Lacute ; G 251 -U 314 ; WX 320 ; N lacute ; G 252 -U 315 ; WX 664 ; N Lcommaaccent ; G 253 -U 316 ; WX 320 ; N lcommaaccent ; G 254 -U 317 ; WX 664 ; N Lcaron ; G 255 -U 318 ; WX 400 ; N lcaron ; G 256 -U 319 ; WX 671 ; N Ldot ; G 257 -U 320 ; WX 465 ; N ldot ; G 258 -U 321 ; WX 669 ; N Lslash ; G 259 -U 322 ; WX 324 ; N lslash ; G 260 -U 323 ; WX 875 ; N Nacute ; G 261 -U 324 ; WX 644 ; N nacute ; G 262 -U 325 ; WX 875 ; N Ncommaaccent ; G 263 -U 326 ; WX 644 ; N ncommaaccent ; G 264 -U 327 ; WX 875 ; N Ncaron ; G 265 -U 328 ; WX 644 ; N ncaron ; G 266 -U 329 ; WX 866 ; N napostrophe ; G 267 -U 330 ; WX 843 ; N Eng ; G 268 -U 331 ; WX 644 ; N eng ; G 269 -U 332 ; WX 820 ; N Omacron ; G 270 -U 333 ; WX 602 ; N omacron ; G 271 -U 334 ; WX 820 ; N Obreve ; G 272 -U 335 ; WX 602 ; N obreve ; G 273 -U 336 ; WX 820 ; N Ohungarumlaut ; G 274 -U 337 ; WX 602 ; N ohungarumlaut ; G 275 -U 338 ; WX 1137 ; N OE ; G 276 -U 339 ; WX 989 ; N oe ; G 277 -U 340 ; WX 753 ; N Racute ; G 278 -U 341 ; WX 478 ; N racute ; G 279 -U 342 ; WX 753 ; N Rcommaaccent ; G 280 -U 343 ; WX 478 ; N rcommaaccent ; G 281 -U 344 ; WX 753 ; N Rcaron ; G 282 -U 345 ; WX 478 ; N rcaron ; G 283 -U 346 ; WX 685 ; N Sacute ; G 284 -U 347 ; WX 513 ; N sacute ; G 285 -U 348 ; WX 685 ; N Scircumflex ; G 286 -U 349 ; WX 513 ; N scircumflex ; G 287 -U 350 ; WX 685 ; N Scedilla ; G 288 -U 351 ; WX 513 ; N scedilla ; G 289 -U 352 ; WX 685 ; N Scaron ; G 290 -U 353 ; WX 513 ; N scaron ; G 291 -U 354 ; WX 667 ; N Tcommaaccent ; G 292 -U 355 ; WX 402 ; N tcommaaccent ; G 293 -U 356 ; WX 667 ; N Tcaron ; G 294 -U 357 ; WX 402 ; N tcaron ; G 295 -U 358 ; WX 667 ; N Tbar ; G 296 -U 359 ; WX 402 ; N tbar ; G 297 -U 360 ; WX 843 ; N Utilde ; G 298 -U 361 ; WX 644 ; N utilde ; G 299 -U 362 ; WX 843 ; N Umacron ; G 300 -U 363 ; WX 644 ; N umacron ; G 301 -U 364 ; WX 843 ; N Ubreve ; G 302 -U 365 ; WX 644 ; N ubreve ; G 303 -U 366 ; WX 843 ; N Uring ; G 304 -U 367 ; WX 644 ; N uring ; G 305 -U 368 ; WX 843 ; N Uhungarumlaut ; G 306 -U 369 ; WX 644 ; N uhungarumlaut ; G 307 -U 370 ; WX 843 ; N Uogonek ; G 308 -U 371 ; WX 644 ; N uogonek ; G 309 -U 372 ; WX 1028 ; N Wcircumflex ; G 310 -U 373 ; WX 856 ; N wcircumflex ; G 311 -U 374 ; WX 660 ; N Ycircumflex ; G 312 -U 375 ; WX 565 ; N ycircumflex ; G 313 -U 376 ; WX 660 ; N Ydieresis ; G 314 -U 377 ; WX 695 ; N Zacute ; G 315 -U 378 ; WX 527 ; N zacute ; G 316 -U 379 ; WX 695 ; N Zdotaccent ; G 317 -U 380 ; WX 527 ; N zdotaccent ; G 318 -U 381 ; WX 695 ; N Zcaron ; G 319 -U 382 ; WX 527 ; N zcaron ; G 320 -U 383 ; WX 370 ; N longs ; G 321 -U 384 ; WX 640 ; N uni0180 ; G 322 -U 385 ; WX 735 ; N uni0181 ; G 323 -U 386 ; WX 735 ; N uni0182 ; G 324 -U 387 ; WX 640 ; N uni0183 ; G 325 -U 388 ; WX 735 ; N uni0184 ; G 326 -U 389 ; WX 640 ; N uni0185 ; G 327 -U 390 ; WX 765 ; N uni0186 ; G 328 -U 391 ; WX 765 ; N uni0187 ; G 329 -U 392 ; WX 560 ; N uni0188 ; G 330 -U 393 ; WX 807 ; N uni0189 ; G 331 -U 394 ; WX 802 ; N uni018A ; G 332 -U 395 ; WX 735 ; N uni018B ; G 333 -U 396 ; WX 640 ; N uni018C ; G 334 -U 397 ; WX 602 ; N uni018D ; G 335 -U 398 ; WX 730 ; N uni018E ; G 336 -U 399 ; WX 820 ; N uni018F ; G 337 -U 400 ; WX 623 ; N uni0190 ; G 338 -U 401 ; WX 694 ; N uni0191 ; G 339 -U 402 ; WX 370 ; N florin ; G 340 -U 403 ; WX 799 ; N uni0193 ; G 341 -U 404 ; WX 712 ; N uni0194 ; G 342 -U 405 ; WX 932 ; N uni0195 ; G 343 -U 406 ; WX 395 ; N uni0196 ; G 344 -U 407 ; WX 395 ; N uni0197 ; G 345 -U 408 ; WX 747 ; N uni0198 ; G 346 -U 409 ; WX 606 ; N uni0199 ; G 347 -U 410 ; WX 320 ; N uni019A ; G 348 -U 411 ; WX 634 ; N uni019B ; G 349 -U 412 ; WX 948 ; N uni019C ; G 350 -U 413 ; WX 875 ; N uni019D ; G 351 -U 414 ; WX 644 ; N uni019E ; G 352 -U 415 ; WX 820 ; N uni019F ; G 353 -U 416 ; WX 820 ; N Ohorn ; G 354 -U 417 ; WX 602 ; N ohorn ; G 355 -U 418 ; WX 1040 ; N uni01A2 ; G 356 -U 419 ; WX 807 ; N uni01A3 ; G 357 -U 420 ; WX 673 ; N uni01A4 ; G 358 -U 421 ; WX 640 ; N uni01A5 ; G 359 -U 422 ; WX 753 ; N uni01A6 ; G 360 -U 423 ; WX 685 ; N uni01A7 ; G 361 -U 424 ; WX 513 ; N uni01A8 ; G 362 -U 425 ; WX 707 ; N uni01A9 ; G 363 -U 426 ; WX 324 ; N uni01AA ; G 364 -U 427 ; WX 402 ; N uni01AB ; G 365 -U 428 ; WX 667 ; N uni01AC ; G 366 -U 429 ; WX 402 ; N uni01AD ; G 367 -U 430 ; WX 667 ; N uni01AE ; G 368 -U 431 ; WX 843 ; N Uhorn ; G 369 -U 432 ; WX 644 ; N uhorn ; G 370 -U 433 ; WX 829 ; N uni01B1 ; G 371 -U 434 ; WX 760 ; N uni01B2 ; G 372 -U 435 ; WX 738 ; N uni01B3 ; G 373 -U 436 ; WX 745 ; N uni01B4 ; G 374 -U 437 ; WX 695 ; N uni01B5 ; G 375 -U 438 ; WX 527 ; N uni01B6 ; G 376 -U 439 ; WX 564 ; N uni01B7 ; G 377 -U 440 ; WX 564 ; N uni01B8 ; G 378 -U 441 ; WX 564 ; N uni01B9 ; G 379 -U 442 ; WX 564 ; N uni01BA ; G 380 -U 443 ; WX 636 ; N uni01BB ; G 381 -U 444 ; WX 687 ; N uni01BC ; G 382 -U 445 ; WX 564 ; N uni01BD ; G 383 -U 446 ; WX 536 ; N uni01BE ; G 384 -U 447 ; WX 635 ; N uni01BF ; G 385 -U 448 ; WX 295 ; N uni01C0 ; G 386 -U 449 ; WX 492 ; N uni01C1 ; G 387 -U 450 ; WX 459 ; N uni01C2 ; G 388 -U 451 ; WX 295 ; N uni01C3 ; G 389 -U 452 ; WX 1497 ; N uni01C4 ; G 390 -U 453 ; WX 1329 ; N uni01C5 ; G 391 -U 454 ; WX 1167 ; N uni01C6 ; G 392 -U 455 ; WX 1065 ; N uni01C7 ; G 393 -U 456 ; WX 974 ; N uni01C8 ; G 394 -U 457 ; WX 630 ; N uni01C9 ; G 395 -U 458 ; WX 1276 ; N uni01CA ; G 396 -U 459 ; WX 1185 ; N uni01CB ; G 397 -U 460 ; WX 954 ; N uni01CC ; G 398 -U 461 ; WX 722 ; N uni01CD ; G 399 -U 462 ; WX 596 ; N uni01CE ; G 400 -U 463 ; WX 395 ; N uni01CF ; G 401 -U 464 ; WX 320 ; N uni01D0 ; G 402 -U 465 ; WX 820 ; N uni01D1 ; G 403 -U 466 ; WX 602 ; N uni01D2 ; G 404 -U 467 ; WX 843 ; N uni01D3 ; G 405 -U 468 ; WX 644 ; N uni01D4 ; G 406 -U 469 ; WX 843 ; N uni01D5 ; G 407 -U 470 ; WX 644 ; N uni01D6 ; G 408 -U 471 ; WX 843 ; N uni01D7 ; G 409 -U 472 ; WX 644 ; N uni01D8 ; G 410 -U 473 ; WX 843 ; N uni01D9 ; G 411 -U 474 ; WX 644 ; N uni01DA ; G 412 -U 475 ; WX 843 ; N uni01DB ; G 413 -U 476 ; WX 644 ; N uni01DC ; G 414 -U 477 ; WX 592 ; N uni01DD ; G 415 -U 478 ; WX 722 ; N uni01DE ; G 416 -U 479 ; WX 596 ; N uni01DF ; G 417 -U 480 ; WX 722 ; N uni01E0 ; G 418 -U 481 ; WX 596 ; N uni01E1 ; G 419 -U 482 ; WX 1001 ; N uni01E2 ; G 420 -U 483 ; WX 940 ; N uni01E3 ; G 421 -U 484 ; WX 848 ; N uni01E4 ; G 422 -U 485 ; WX 640 ; N uni01E5 ; G 423 -U 486 ; WX 799 ; N Gcaron ; G 424 -U 487 ; WX 640 ; N gcaron ; G 425 -U 488 ; WX 747 ; N uni01E8 ; G 426 -U 489 ; WX 606 ; N uni01E9 ; G 427 -U 490 ; WX 820 ; N uni01EA ; G 428 -U 491 ; WX 602 ; N uni01EB ; G 429 -U 492 ; WX 820 ; N uni01EC ; G 430 -U 493 ; WX 602 ; N uni01ED ; G 431 -U 494 ; WX 564 ; N uni01EE ; G 432 -U 495 ; WX 564 ; N uni01EF ; G 433 -U 496 ; WX 320 ; N uni01F0 ; G 434 -U 497 ; WX 1497 ; N uni01F1 ; G 435 -U 498 ; WX 1329 ; N uni01F2 ; G 436 -U 499 ; WX 1167 ; N uni01F3 ; G 437 -U 500 ; WX 799 ; N uni01F4 ; G 438 -U 501 ; WX 640 ; N uni01F5 ; G 439 -U 502 ; WX 1154 ; N uni01F6 ; G 440 -U 503 ; WX 707 ; N uni01F7 ; G 441 -U 504 ; WX 875 ; N uni01F8 ; G 442 -U 505 ; WX 644 ; N uni01F9 ; G 443 -U 506 ; WX 722 ; N Aringacute ; G 444 -U 507 ; WX 596 ; N aringacute ; G 445 -U 508 ; WX 1001 ; N AEacute ; G 446 -U 509 ; WX 940 ; N aeacute ; G 447 -U 510 ; WX 820 ; N Oslashacute ; G 448 -U 511 ; WX 602 ; N oslashacute ; G 449 -U 512 ; WX 722 ; N uni0200 ; G 450 -U 513 ; WX 596 ; N uni0201 ; G 451 -U 514 ; WX 722 ; N uni0202 ; G 452 -U 515 ; WX 596 ; N uni0203 ; G 453 -U 516 ; WX 730 ; N uni0204 ; G 454 -U 517 ; WX 592 ; N uni0205 ; G 455 -U 518 ; WX 730 ; N uni0206 ; G 456 -U 519 ; WX 592 ; N uni0207 ; G 457 -U 520 ; WX 395 ; N uni0208 ; G 458 -U 521 ; WX 320 ; N uni0209 ; G 459 -U 522 ; WX 395 ; N uni020A ; G 460 -U 523 ; WX 320 ; N uni020B ; G 461 -U 524 ; WX 820 ; N uni020C ; G 462 -U 525 ; WX 602 ; N uni020D ; G 463 -U 526 ; WX 820 ; N uni020E ; G 464 -U 527 ; WX 602 ; N uni020F ; G 465 -U 528 ; WX 753 ; N uni0210 ; G 466 -U 529 ; WX 478 ; N uni0211 ; G 467 -U 530 ; WX 753 ; N uni0212 ; G 468 -U 531 ; WX 478 ; N uni0213 ; G 469 -U 532 ; WX 843 ; N uni0214 ; G 470 -U 533 ; WX 644 ; N uni0215 ; G 471 -U 534 ; WX 843 ; N uni0216 ; G 472 -U 535 ; WX 644 ; N uni0217 ; G 473 -U 536 ; WX 685 ; N Scommaaccent ; G 474 -U 537 ; WX 513 ; N scommaaccent ; G 475 -U 538 ; WX 667 ; N uni021A ; G 476 -U 539 ; WX 402 ; N uni021B ; G 477 -U 540 ; WX 627 ; N uni021C ; G 478 -U 541 ; WX 521 ; N uni021D ; G 479 -U 542 ; WX 872 ; N uni021E ; G 480 -U 543 ; WX 644 ; N uni021F ; G 481 -U 544 ; WX 843 ; N uni0220 ; G 482 -U 545 ; WX 814 ; N uni0221 ; G 483 -U 546 ; WX 572 ; N uni0222 ; G 484 -U 547 ; WX 552 ; N uni0223 ; G 485 -U 548 ; WX 695 ; N uni0224 ; G 486 -U 549 ; WX 527 ; N uni0225 ; G 487 -U 550 ; WX 722 ; N uni0226 ; G 488 -U 551 ; WX 596 ; N uni0227 ; G 489 -U 552 ; WX 730 ; N uni0228 ; G 490 -U 553 ; WX 592 ; N uni0229 ; G 491 -U 554 ; WX 820 ; N uni022A ; G 492 -U 555 ; WX 602 ; N uni022B ; G 493 -U 556 ; WX 820 ; N uni022C ; G 494 -U 557 ; WX 602 ; N uni022D ; G 495 -U 558 ; WX 820 ; N uni022E ; G 496 -U 559 ; WX 602 ; N uni022F ; G 497 -U 560 ; WX 820 ; N uni0230 ; G 498 -U 561 ; WX 602 ; N uni0231 ; G 499 -U 562 ; WX 660 ; N uni0232 ; G 500 -U 563 ; WX 565 ; N uni0233 ; G 501 -U 564 ; WX 500 ; N uni0234 ; G 502 -U 565 ; WX 832 ; N uni0235 ; G 503 -U 566 ; WX 494 ; N uni0236 ; G 504 -U 567 ; WX 310 ; N dotlessj ; G 505 -U 568 ; WX 960 ; N uni0238 ; G 506 -U 569 ; WX 960 ; N uni0239 ; G 507 -U 570 ; WX 722 ; N uni023A ; G 508 -U 571 ; WX 765 ; N uni023B ; G 509 -U 572 ; WX 560 ; N uni023C ; G 510 -U 573 ; WX 664 ; N uni023D ; G 511 -U 574 ; WX 667 ; N uni023E ; G 512 -U 575 ; WX 513 ; N uni023F ; G 513 -U 576 ; WX 527 ; N uni0240 ; G 514 -U 577 ; WX 583 ; N uni0241 ; G 515 -U 578 ; WX 464 ; N uni0242 ; G 516 -U 579 ; WX 735 ; N uni0243 ; G 517 -U 580 ; WX 843 ; N uni0244 ; G 518 -U 581 ; WX 722 ; N uni0245 ; G 519 -U 582 ; WX 730 ; N uni0246 ; G 520 -U 583 ; WX 592 ; N uni0247 ; G 521 -U 584 ; WX 401 ; N uni0248 ; G 522 -U 585 ; WX 315 ; N uni0249 ; G 523 -U 586 ; WX 782 ; N uni024A ; G 524 -U 587 ; WX 640 ; N uni024B ; G 525 -U 588 ; WX 753 ; N uni024C ; G 526 -U 589 ; WX 478 ; N uni024D ; G 527 -U 590 ; WX 660 ; N uni024E ; G 528 -U 591 ; WX 565 ; N uni024F ; G 529 -U 592 ; WX 596 ; N uni0250 ; G 530 -U 593 ; WX 675 ; N uni0251 ; G 531 -U 594 ; WX 675 ; N uni0252 ; G 532 -U 595 ; WX 640 ; N uni0253 ; G 533 -U 596 ; WX 560 ; N uni0254 ; G 534 -U 597 ; WX 560 ; N uni0255 ; G 535 -U 598 ; WX 647 ; N uni0256 ; G 536 -U 599 ; WX 683 ; N uni0257 ; G 537 -U 600 ; WX 592 ; N uni0258 ; G 538 -U 601 ; WX 592 ; N uni0259 ; G 539 -U 602 ; WX 843 ; N uni025A ; G 540 -U 603 ; WX 537 ; N uni025B ; G 541 -U 604 ; WX 509 ; N uni025C ; G 542 -U 605 ; WX 773 ; N uni025D ; G 543 -U 606 ; WX 613 ; N uni025E ; G 544 -U 607 ; WX 315 ; N uni025F ; G 545 -U 608 ; WX 683 ; N uni0260 ; G 546 -U 609 ; WX 640 ; N uni0261 ; G 547 -U 610 ; WX 580 ; N uni0262 ; G 548 -U 611 ; WX 599 ; N uni0263 ; G 549 -U 612 ; WX 564 ; N uni0264 ; G 550 -U 613 ; WX 644 ; N uni0265 ; G 551 -U 614 ; WX 644 ; N uni0266 ; G 552 -U 615 ; WX 644 ; N uni0267 ; G 553 -U 616 ; WX 320 ; N uni0268 ; G 554 -U 617 ; WX 392 ; N uni0269 ; G 555 -U 618 ; WX 320 ; N uni026A ; G 556 -U 619 ; WX 380 ; N uni026B ; G 557 -U 620 ; WX 454 ; N uni026C ; G 558 -U 621 ; WX 363 ; N uni026D ; G 559 -U 622 ; WX 704 ; N uni026E ; G 560 -U 623 ; WX 948 ; N uni026F ; G 561 -U 624 ; WX 948 ; N uni0270 ; G 562 -U 625 ; WX 948 ; N uni0271 ; G 563 -U 626 ; WX 644 ; N uni0272 ; G 564 -U 627 ; WX 694 ; N uni0273 ; G 565 -U 628 ; WX 646 ; N uni0274 ; G 566 -U 629 ; WX 602 ; N uni0275 ; G 567 -U 630 ; WX 790 ; N uni0276 ; G 568 -U 631 ; WX 821 ; N uni0277 ; G 569 -U 632 ; WX 692 ; N uni0278 ; G 570 -U 633 ; WX 501 ; N uni0279 ; G 571 -U 634 ; WX 501 ; N uni027A ; G 572 -U 635 ; WX 551 ; N uni027B ; G 573 -U 636 ; WX 478 ; N uni027C ; G 574 -U 637 ; WX 478 ; N uni027D ; G 575 -U 638 ; WX 453 ; N uni027E ; G 576 -U 639 ; WX 453 ; N uni027F ; G 577 -U 640 ; WX 581 ; N uni0280 ; G 578 -U 641 ; WX 581 ; N uni0281 ; G 579 -U 642 ; WX 513 ; N uni0282 ; G 580 -U 643 ; WX 271 ; N uni0283 ; G 581 -U 644 ; WX 370 ; N uni0284 ; G 582 -U 645 ; WX 487 ; N uni0285 ; G 583 -U 646 ; WX 324 ; N uni0286 ; G 584 -U 647 ; WX 402 ; N uni0287 ; G 585 -U 648 ; WX 402 ; N uni0288 ; G 586 -U 649 ; WX 644 ; N uni0289 ; G 587 -U 650 ; WX 620 ; N uni028A ; G 588 -U 651 ; WX 608 ; N uni028B ; G 589 -U 652 ; WX 565 ; N uni028C ; G 590 -U 653 ; WX 856 ; N uni028D ; G 591 -U 654 ; WX 565 ; N uni028E ; G 592 -U 655 ; WX 655 ; N uni028F ; G 593 -U 656 ; WX 597 ; N uni0290 ; G 594 -U 657 ; WX 560 ; N uni0291 ; G 595 -U 658 ; WX 564 ; N uni0292 ; G 596 -U 659 ; WX 560 ; N uni0293 ; G 597 -U 660 ; WX 536 ; N uni0294 ; G 598 -U 661 ; WX 536 ; N uni0295 ; G 599 -U 662 ; WX 536 ; N uni0296 ; G 600 -U 663 ; WX 420 ; N uni0297 ; G 601 -U 664 ; WX 820 ; N uni0298 ; G 602 -U 665 ; WX 563 ; N uni0299 ; G 603 -U 666 ; WX 613 ; N uni029A ; G 604 -U 667 ; WX 660 ; N uni029B ; G 605 -U 668 ; WX 667 ; N uni029C ; G 606 -U 669 ; WX 366 ; N uni029D ; G 607 -U 670 ; WX 606 ; N uni029E ; G 608 -U 671 ; WX 543 ; N uni029F ; G 609 -U 672 ; WX 683 ; N uni02A0 ; G 610 -U 673 ; WX 536 ; N uni02A1 ; G 611 -U 674 ; WX 536 ; N uni02A2 ; G 612 -U 675 ; WX 996 ; N uni02A3 ; G 613 -U 676 ; WX 1033 ; N uni02A4 ; G 614 -U 677 ; WX 998 ; N uni02A5 ; G 615 -U 678 ; WX 823 ; N uni02A6 ; G 616 -U 679 ; WX 598 ; N uni02A7 ; G 617 -U 680 ; WX 825 ; N uni02A8 ; G 618 -U 681 ; WX 894 ; N uni02A9 ; G 619 -U 682 ; WX 725 ; N uni02AA ; G 620 -U 683 ; WX 676 ; N uni02AB ; G 621 -U 684 ; WX 598 ; N uni02AC ; G 622 -U 685 ; WX 443 ; N uni02AD ; G 623 -U 686 ; WX 781 ; N uni02AE ; G 624 -U 687 ; WX 767 ; N uni02AF ; G 625 -U 688 ; WX 433 ; N uni02B0 ; G 626 -U 689 ; WX 430 ; N uni02B1 ; G 627 -U 690 ; WX 264 ; N uni02B2 ; G 628 -U 691 ; WX 347 ; N uni02B3 ; G 629 -U 692 ; WX 347 ; N uni02B4 ; G 630 -U 693 ; WX 430 ; N uni02B5 ; G 631 -U 694 ; WX 392 ; N uni02B6 ; G 632 -U 695 ; WX 539 ; N uni02B7 ; G 633 -U 696 ; WX 355 ; N uni02B8 ; G 634 -U 697 ; WX 278 ; N uni02B9 ; G 635 -U 698 ; WX 460 ; N uni02BA ; G 636 -U 699 ; WX 318 ; N uni02BB ; G 637 -U 700 ; WX 318 ; N uni02BC ; G 638 -U 701 ; WX 318 ; N uni02BD ; G 639 -U 702 ; WX 307 ; N uni02BE ; G 640 -U 703 ; WX 307 ; N uni02BF ; G 641 -U 704 ; WX 280 ; N uni02C0 ; G 642 -U 705 ; WX 281 ; N uni02C1 ; G 643 -U 706 ; WX 500 ; N uni02C2 ; G 644 -U 707 ; WX 500 ; N uni02C3 ; G 645 -U 708 ; WX 500 ; N uni02C4 ; G 646 -U 709 ; WX 500 ; N uni02C5 ; G 647 -U 710 ; WX 500 ; N circumflex ; G 648 -U 711 ; WX 500 ; N caron ; G 649 -U 712 ; WX 282 ; N uni02C8 ; G 650 -U 713 ; WX 500 ; N uni02C9 ; G 651 -U 714 ; WX 500 ; N uni02CA ; G 652 -U 715 ; WX 500 ; N uni02CB ; G 653 -U 716 ; WX 282 ; N uni02CC ; G 654 -U 717 ; WX 500 ; N uni02CD ; G 655 -U 720 ; WX 337 ; N uni02D0 ; G 656 -U 721 ; WX 337 ; N uni02D1 ; G 657 -U 722 ; WX 307 ; N uni02D2 ; G 658 -U 723 ; WX 307 ; N uni02D3 ; G 659 -U 726 ; WX 392 ; N uni02D6 ; G 660 -U 727 ; WX 392 ; N uni02D7 ; G 661 -U 728 ; WX 500 ; N breve ; G 662 -U 729 ; WX 500 ; N dotaccent ; G 663 -U 730 ; WX 500 ; N ring ; G 664 -U 731 ; WX 500 ; N ogonek ; G 665 -U 732 ; WX 500 ; N tilde ; G 666 -U 733 ; WX 500 ; N hungarumlaut ; G 667 -U 734 ; WX 417 ; N uni02DE ; G 668 -U 736 ; WX 377 ; N uni02E0 ; G 669 -U 737 ; WX 243 ; N uni02E1 ; G 670 -U 738 ; WX 337 ; N uni02E2 ; G 671 -U 739 ; WX 355 ; N uni02E3 ; G 672 -U 740 ; WX 281 ; N uni02E4 ; G 673 -U 741 ; WX 493 ; N uni02E5 ; G 674 -U 742 ; WX 493 ; N uni02E6 ; G 675 -U 743 ; WX 493 ; N uni02E7 ; G 676 -U 744 ; WX 493 ; N uni02E8 ; G 677 -U 745 ; WX 493 ; N uni02E9 ; G 678 -U 748 ; WX 500 ; N uni02EC ; G 679 -U 750 ; WX 484 ; N uni02EE ; G 680 -U 751 ; WX 500 ; N uni02EF ; G 681 -U 752 ; WX 500 ; N uni02F0 ; G 682 -U 755 ; WX 500 ; N uni02F3 ; G 683 -U 759 ; WX 500 ; N uni02F7 ; G 684 -U 768 ; WX 0 ; N gravecomb ; G 685 -U 769 ; WX 0 ; N acutecomb ; G 686 -U 770 ; WX 0 ; N uni0302 ; G 687 -U 771 ; WX 0 ; N tildecomb ; G 688 -U 772 ; WX 0 ; N uni0304 ; G 689 -U 773 ; WX 0 ; N uni0305 ; G 690 -U 774 ; WX 0 ; N uni0306 ; G 691 -U 775 ; WX 0 ; N uni0307 ; G 692 -U 776 ; WX 0 ; N uni0308 ; G 693 -U 777 ; WX 0 ; N hookabovecomb ; G 694 -U 778 ; WX 0 ; N uni030A ; G 695 -U 779 ; WX 0 ; N uni030B ; G 696 -U 780 ; WX 0 ; N uni030C ; G 697 -U 781 ; WX 0 ; N uni030D ; G 698 -U 782 ; WX 0 ; N uni030E ; G 699 -U 783 ; WX 0 ; N uni030F ; G 700 -U 784 ; WX 0 ; N uni0310 ; G 701 -U 785 ; WX 0 ; N uni0311 ; G 702 -U 786 ; WX 0 ; N uni0312 ; G 703 -U 787 ; WX 0 ; N uni0313 ; G 704 -U 788 ; WX 0 ; N uni0314 ; G 705 -U 789 ; WX 0 ; N uni0315 ; G 706 -U 790 ; WX 0 ; N uni0316 ; G 707 -U 791 ; WX 0 ; N uni0317 ; G 708 -U 792 ; WX 0 ; N uni0318 ; G 709 -U 793 ; WX 0 ; N uni0319 ; G 710 -U 794 ; WX 0 ; N uni031A ; G 711 -U 795 ; WX 0 ; N uni031B ; G 712 -U 796 ; WX 0 ; N uni031C ; G 713 -U 797 ; WX 0 ; N uni031D ; G 714 -U 798 ; WX 0 ; N uni031E ; G 715 -U 799 ; WX 0 ; N uni031F ; G 716 -U 800 ; WX 0 ; N uni0320 ; G 717 -U 801 ; WX 0 ; N uni0321 ; G 718 -U 802 ; WX 0 ; N uni0322 ; G 719 -U 803 ; WX 0 ; N dotbelowcomb ; G 720 -U 804 ; WX 0 ; N uni0324 ; G 721 -U 805 ; WX 0 ; N uni0325 ; G 722 -U 806 ; WX 0 ; N uni0326 ; G 723 -U 807 ; WX 0 ; N uni0327 ; G 724 -U 808 ; WX 0 ; N uni0328 ; G 725 -U 809 ; WX 0 ; N uni0329 ; G 726 -U 810 ; WX 0 ; N uni032A ; G 727 -U 811 ; WX 0 ; N uni032B ; G 728 -U 812 ; WX 0 ; N uni032C ; G 729 -U 813 ; WX 0 ; N uni032D ; G 730 -U 814 ; WX 0 ; N uni032E ; G 731 -U 815 ; WX 0 ; N uni032F ; G 732 -U 816 ; WX 0 ; N uni0330 ; G 733 -U 817 ; WX 0 ; N uni0331 ; G 734 -U 818 ; WX 0 ; N uni0332 ; G 735 -U 819 ; WX 0 ; N uni0333 ; G 736 -U 820 ; WX 0 ; N uni0334 ; G 737 -U 821 ; WX 0 ; N uni0335 ; G 738 -U 822 ; WX 0 ; N uni0336 ; G 739 -U 823 ; WX 0 ; N uni0337 ; G 740 -U 824 ; WX 0 ; N uni0338 ; G 741 -U 825 ; WX 0 ; N uni0339 ; G 742 -U 826 ; WX 0 ; N uni033A ; G 743 -U 827 ; WX 0 ; N uni033B ; G 744 -U 828 ; WX 0 ; N uni033C ; G 745 -U 829 ; WX 0 ; N uni033D ; G 746 -U 830 ; WX 0 ; N uni033E ; G 747 -U 831 ; WX 0 ; N uni033F ; G 748 -U 835 ; WX 0 ; N uni0343 ; G 749 -U 847 ; WX 0 ; N uni034F ; G 750 -U 856 ; WX 0 ; N uni0358 ; G 751 -U 864 ; WX 0 ; N uni0360 ; G 752 -U 865 ; WX 0 ; N uni0361 ; G 753 -U 880 ; WX 740 ; N uni0370 ; G 754 -U 881 ; WX 531 ; N uni0371 ; G 755 -U 882 ; WX 667 ; N uni0372 ; G 756 -U 883 ; WX 553 ; N uni0373 ; G 757 -U 884 ; WX 278 ; N uni0374 ; G 758 -U 885 ; WX 278 ; N uni0375 ; G 759 -U 886 ; WX 875 ; N uni0376 ; G 760 -U 887 ; WX 667 ; N uni0377 ; G 761 -U 890 ; WX 500 ; N uni037A ; G 762 -U 891 ; WX 560 ; N uni037B ; G 763 -U 892 ; WX 560 ; N uni037C ; G 764 -U 893 ; WX 560 ; N uni037D ; G 765 -U 894 ; WX 337 ; N uni037E ; G 766 -U 895 ; WX 401 ; N uni037F ; G 767 -U 900 ; WX 500 ; N tonos ; G 768 -U 901 ; WX 500 ; N dieresistonos ; G 769 -U 902 ; WX 722 ; N Alphatonos ; G 770 -U 903 ; WX 318 ; N anoteleia ; G 771 -U 904 ; WX 900 ; N Epsilontonos ; G 772 -U 905 ; WX 1039 ; N Etatonos ; G 773 -U 906 ; WX 562 ; N Iotatonos ; G 774 -U 908 ; WX 835 ; N Omicrontonos ; G 775 -U 910 ; WX 897 ; N Upsilontonos ; G 776 -U 911 ; WX 853 ; N Omegatonos ; G 777 -U 912 ; WX 392 ; N iotadieresistonos ; G 778 -U 913 ; WX 722 ; N Alpha ; G 779 -U 914 ; WX 735 ; N Beta ; G 780 -U 915 ; WX 694 ; N Gamma ; G 781 -U 916 ; WX 722 ; N uni0394 ; G 782 -U 917 ; WX 730 ; N Epsilon ; G 783 -U 918 ; WX 695 ; N Zeta ; G 784 -U 919 ; WX 872 ; N Eta ; G 785 -U 920 ; WX 820 ; N Theta ; G 786 -U 921 ; WX 395 ; N Iota ; G 787 -U 922 ; WX 747 ; N Kappa ; G 788 -U 923 ; WX 722 ; N Lambda ; G 789 -U 924 ; WX 1024 ; N Mu ; G 790 -U 925 ; WX 875 ; N Nu ; G 791 -U 926 ; WX 704 ; N Xi ; G 792 -U 927 ; WX 820 ; N Omicron ; G 793 -U 928 ; WX 872 ; N Pi ; G 794 -U 929 ; WX 673 ; N Rho ; G 795 -U 931 ; WX 707 ; N Sigma ; G 796 -U 932 ; WX 667 ; N Tau ; G 797 -U 933 ; WX 660 ; N Upsilon ; G 798 -U 934 ; WX 820 ; N Phi ; G 799 -U 935 ; WX 712 ; N Chi ; G 800 -U 936 ; WX 877 ; N Psi ; G 801 -U 937 ; WX 829 ; N Omega ; G 802 -U 938 ; WX 395 ; N Iotadieresis ; G 803 -U 939 ; WX 660 ; N Upsilondieresis ; G 804 -U 940 ; WX 675 ; N alphatonos ; G 805 -U 941 ; WX 537 ; N epsilontonos ; G 806 -U 942 ; WX 599 ; N etatonos ; G 807 -U 943 ; WX 392 ; N iotatonos ; G 808 -U 944 ; WX 608 ; N upsilondieresistonos ; G 809 -U 945 ; WX 675 ; N alpha ; G 810 -U 946 ; WX 578 ; N beta ; G 811 -U 947 ; WX 598 ; N gamma ; G 812 -U 948 ; WX 602 ; N delta ; G 813 -U 949 ; WX 537 ; N epsilon ; G 814 -U 950 ; WX 542 ; N zeta ; G 815 -U 951 ; WX 599 ; N eta ; G 816 -U 952 ; WX 602 ; N theta ; G 817 -U 953 ; WX 392 ; N iota ; G 818 -U 954 ; WX 656 ; N kappa ; G 819 -U 955 ; WX 634 ; N lambda ; G 820 -U 956 ; WX 650 ; N uni03BC ; G 821 -U 957 ; WX 608 ; N nu ; G 822 -U 958 ; WX 551 ; N xi ; G 823 -U 959 ; WX 602 ; N omicron ; G 824 -U 960 ; WX 657 ; N pi ; G 825 -U 961 ; WX 588 ; N rho ; G 826 -U 962 ; WX 560 ; N sigma1 ; G 827 -U 963 ; WX 683 ; N sigma ; G 828 -U 964 ; WX 553 ; N tau ; G 829 -U 965 ; WX 608 ; N upsilon ; G 830 -U 966 ; WX 700 ; N phi ; G 831 -U 967 ; WX 606 ; N chi ; G 832 -U 968 ; WX 784 ; N psi ; G 833 -U 969 ; WX 815 ; N omega ; G 834 -U 970 ; WX 392 ; N iotadieresis ; G 835 -U 971 ; WX 608 ; N upsilondieresis ; G 836 -U 972 ; WX 602 ; N omicrontonos ; G 837 -U 973 ; WX 608 ; N upsilontonos ; G 838 -U 974 ; WX 815 ; N omegatonos ; G 839 -U 975 ; WX 747 ; N uni03CF ; G 840 -U 976 ; WX 583 ; N uni03D0 ; G 841 -U 977 ; WX 715 ; N theta1 ; G 842 -U 978 ; WX 687 ; N Upsilon1 ; G 843 -U 979 ; WX 874 ; N uni03D3 ; G 844 -U 980 ; WX 687 ; N uni03D4 ; G 845 -U 981 ; WX 682 ; N phi1 ; G 846 -U 982 ; WX 815 ; N omega1 ; G 847 -U 983 ; WX 624 ; N uni03D7 ; G 848 -U 984 ; WX 820 ; N uni03D8 ; G 849 -U 985 ; WX 602 ; N uni03D9 ; G 850 -U 986 ; WX 765 ; N uni03DA ; G 851 -U 987 ; WX 560 ; N uni03DB ; G 852 -U 988 ; WX 694 ; N uni03DC ; G 853 -U 989 ; WX 463 ; N uni03DD ; G 854 -U 990 ; WX 590 ; N uni03DE ; G 855 -U 991 ; WX 660 ; N uni03DF ; G 856 -U 992 ; WX 782 ; N uni03E0 ; G 857 -U 993 ; WX 577 ; N uni03E1 ; G 858 -U 1008 ; WX 624 ; N uni03F0 ; G 859 -U 1009 ; WX 588 ; N uni03F1 ; G 860 -U 1010 ; WX 560 ; N uni03F2 ; G 861 -U 1011 ; WX 310 ; N uni03F3 ; G 862 -U 1012 ; WX 820 ; N uni03F4 ; G 863 -U 1013 ; WX 560 ; N uni03F5 ; G 864 -U 1014 ; WX 560 ; N uni03F6 ; G 865 -U 1015 ; WX 676 ; N uni03F7 ; G 866 -U 1016 ; WX 640 ; N uni03F8 ; G 867 -U 1017 ; WX 765 ; N uni03F9 ; G 868 -U 1018 ; WX 1024 ; N uni03FA ; G 869 -U 1019 ; WX 708 ; N uni03FB ; G 870 -U 1020 ; WX 588 ; N uni03FC ; G 871 -U 1021 ; WX 765 ; N uni03FD ; G 872 -U 1022 ; WX 765 ; N uni03FE ; G 873 -U 1023 ; WX 765 ; N uni03FF ; G 874 -U 1024 ; WX 730 ; N uni0400 ; G 875 -U 1025 ; WX 730 ; N uni0401 ; G 876 -U 1026 ; WX 799 ; N uni0402 ; G 877 -U 1027 ; WX 662 ; N uni0403 ; G 878 -U 1028 ; WX 765 ; N uni0404 ; G 879 -U 1029 ; WX 685 ; N uni0405 ; G 880 -U 1030 ; WX 395 ; N uni0406 ; G 881 -U 1031 ; WX 395 ; N uni0407 ; G 882 -U 1032 ; WX 401 ; N uni0408 ; G 883 -U 1033 ; WX 1084 ; N uni0409 ; G 884 -U 1034 ; WX 1118 ; N uni040A ; G 885 -U 1035 ; WX 872 ; N uni040B ; G 886 -U 1036 ; WX 774 ; N uni040C ; G 887 -U 1037 ; WX 872 ; N uni040D ; G 888 -U 1038 ; WX 723 ; N uni040E ; G 889 -U 1039 ; WX 872 ; N uni040F ; G 890 -U 1040 ; WX 757 ; N uni0410 ; G 891 -U 1041 ; WX 735 ; N uni0411 ; G 892 -U 1042 ; WX 735 ; N uni0412 ; G 893 -U 1043 ; WX 662 ; N uni0413 ; G 894 -U 1044 ; WX 813 ; N uni0414 ; G 895 -U 1045 ; WX 730 ; N uni0415 ; G 896 -U 1046 ; WX 1124 ; N uni0416 ; G 897 -U 1047 ; WX 623 ; N uni0417 ; G 898 -U 1048 ; WX 872 ; N uni0418 ; G 899 -U 1049 ; WX 872 ; N uni0419 ; G 900 -U 1050 ; WX 774 ; N uni041A ; G 901 -U 1051 ; WX 834 ; N uni041B ; G 902 -U 1052 ; WX 1024 ; N uni041C ; G 903 -U 1053 ; WX 872 ; N uni041D ; G 904 -U 1054 ; WX 820 ; N uni041E ; G 905 -U 1055 ; WX 872 ; N uni041F ; G 906 -U 1056 ; WX 673 ; N uni0420 ; G 907 -U 1057 ; WX 765 ; N uni0421 ; G 908 -U 1058 ; WX 667 ; N uni0422 ; G 909 -U 1059 ; WX 723 ; N uni0423 ; G 910 -U 1060 ; WX 830 ; N uni0424 ; G 911 -U 1061 ; WX 712 ; N uni0425 ; G 912 -U 1062 ; WX 872 ; N uni0426 ; G 913 -U 1063 ; WX 773 ; N uni0427 ; G 914 -U 1064 ; WX 1141 ; N uni0428 ; G 915 -U 1065 ; WX 1141 ; N uni0429 ; G 916 -U 1066 ; WX 794 ; N uni042A ; G 917 -U 1067 ; WX 984 ; N uni042B ; G 918 -U 1068 ; WX 674 ; N uni042C ; G 919 -U 1069 ; WX 765 ; N uni042D ; G 920 -U 1070 ; WX 1193 ; N uni042E ; G 921 -U 1071 ; WX 808 ; N uni042F ; G 922 -U 1072 ; WX 596 ; N uni0430 ; G 923 -U 1073 ; WX 610 ; N uni0431 ; G 924 -U 1074 ; WX 582 ; N uni0432 ; G 925 -U 1075 ; WX 505 ; N uni0433 ; G 926 -U 1076 ; WX 634 ; N uni0434 ; G 927 -U 1077 ; WX 592 ; N uni0435 ; G 928 -U 1078 ; WX 1137 ; N uni0436 ; G 929 -U 1079 ; WX 545 ; N uni0437 ; G 930 -U 1080 ; WX 644 ; N uni0438 ; G 931 -U 1081 ; WX 644 ; N uni0439 ; G 932 -U 1082 ; WX 597 ; N uni043A ; G 933 -U 1083 ; WX 637 ; N uni043B ; G 934 -U 1084 ; WX 829 ; N uni043C ; G 935 -U 1085 ; WX 659 ; N uni043D ; G 936 -U 1086 ; WX 602 ; N uni043E ; G 937 -U 1087 ; WX 644 ; N uni043F ; G 938 -U 1088 ; WX 640 ; N uni0440 ; G 939 -U 1089 ; WX 560 ; N uni0441 ; G 940 -U 1090 ; WX 948 ; N uni0442 ; G 941 -U 1091 ; WX 580 ; N uni0443 ; G 942 -U 1092 ; WX 783 ; N uni0444 ; G 943 -U 1093 ; WX 564 ; N uni0445 ; G 944 -U 1094 ; WX 698 ; N uni0446 ; G 945 -U 1095 ; WX 622 ; N uni0447 ; G 946 -U 1096 ; WX 947 ; N uni0448 ; G 947 -U 1097 ; WX 1001 ; N uni0449 ; G 948 -U 1098 ; WX 667 ; N uni044A ; G 949 -U 1099 ; WX 814 ; N uni044B ; G 950 -U 1100 ; WX 544 ; N uni044C ; G 951 -U 1101 ; WX 560 ; N uni044D ; G 952 -U 1102 ; WX 880 ; N uni044E ; G 953 -U 1103 ; WX 662 ; N uni044F ; G 954 -U 1104 ; WX 592 ; N uni0450 ; G 955 -U 1105 ; WX 592 ; N uni0451 ; G 956 -U 1106 ; WX 624 ; N uni0452 ; G 957 -U 1107 ; WX 505 ; N uni0453 ; G 958 -U 1108 ; WX 560 ; N uni0454 ; G 959 -U 1109 ; WX 513 ; N uni0455 ; G 960 -U 1110 ; WX 320 ; N uni0456 ; G 961 -U 1111 ; WX 320 ; N uni0457 ; G 962 -U 1112 ; WX 310 ; N uni0458 ; G 963 -U 1113 ; WX 859 ; N uni0459 ; G 964 -U 1114 ; WX 878 ; N uni045A ; G 965 -U 1115 ; WX 644 ; N uni045B ; G 966 -U 1116 ; WX 597 ; N uni045C ; G 967 -U 1117 ; WX 644 ; N uni045D ; G 968 -U 1118 ; WX 580 ; N uni045E ; G 969 -U 1119 ; WX 644 ; N uni045F ; G 970 -U 1122 ; WX 762 ; N uni0462 ; G 971 -U 1123 ; WX 882 ; N uni0463 ; G 972 -U 1124 ; WX 1129 ; N uni0464 ; G 973 -U 1125 ; WX 834 ; N uni0465 ; G 974 -U 1130 ; WX 1124 ; N uni046A ; G 975 -U 1131 ; WX 920 ; N uni046B ; G 976 -U 1132 ; WX 1359 ; N uni046C ; G 977 -U 1133 ; WX 1063 ; N uni046D ; G 978 -U 1136 ; WX 944 ; N uni0470 ; G 979 -U 1137 ; WX 902 ; N uni0471 ; G 980 -U 1138 ; WX 820 ; N uni0472 ; G 981 -U 1139 ; WX 552 ; N uni0473 ; G 982 -U 1140 ; WX 859 ; N uni0474 ; G 983 -U 1141 ; WX 678 ; N uni0475 ; G 984 -U 1142 ; WX 859 ; N uni0476 ; G 985 -U 1143 ; WX 678 ; N uni0477 ; G 986 -U 1164 ; WX 707 ; N uni048C ; G 987 -U 1165 ; WX 544 ; N uni048D ; G 988 -U 1168 ; WX 672 ; N uni0490 ; G 989 -U 1169 ; WX 529 ; N uni0491 ; G 990 -U 1170 ; WX 662 ; N uni0492 ; G 991 -U 1171 ; WX 505 ; N uni0493 ; G 992 -U 1172 ; WX 730 ; N uni0494 ; G 993 -U 1173 ; WX 614 ; N uni0495 ; G 994 -U 1174 ; WX 1124 ; N uni0496 ; G 995 -U 1175 ; WX 1137 ; N uni0497 ; G 996 -U 1176 ; WX 623 ; N uni0498 ; G 997 -U 1177 ; WX 545 ; N uni0499 ; G 998 -U 1178 ; WX 774 ; N uni049A ; G 999 -U 1179 ; WX 604 ; N uni049B ; G 1000 -U 1182 ; WX 774 ; N uni049E ; G 1001 -U 1183 ; WX 597 ; N uni049F ; G 1002 -U 1184 ; WX 892 ; N uni04A0 ; G 1003 -U 1185 ; WX 669 ; N uni04A1 ; G 1004 -U 1186 ; WX 872 ; N uni04A2 ; G 1005 -U 1187 ; WX 712 ; N uni04A3 ; G 1006 -U 1188 ; WX 1139 ; N uni04A4 ; G 1007 -U 1189 ; WX 857 ; N uni04A5 ; G 1008 -U 1190 ; WX 1206 ; N uni04A6 ; G 1009 -U 1191 ; WX 943 ; N uni04A7 ; G 1010 -U 1194 ; WX 765 ; N uni04AA ; G 1011 -U 1195 ; WX 560 ; N uni04AB ; G 1012 -U 1196 ; WX 667 ; N uni04AC ; G 1013 -U 1197 ; WX 1013 ; N uni04AD ; G 1014 -U 1198 ; WX 660 ; N uni04AE ; G 1015 -U 1199 ; WX 571 ; N uni04AF ; G 1016 -U 1200 ; WX 660 ; N uni04B0 ; G 1017 -U 1201 ; WX 571 ; N uni04B1 ; G 1018 -U 1202 ; WX 712 ; N uni04B2 ; G 1019 -U 1203 ; WX 629 ; N uni04B3 ; G 1020 -U 1204 ; WX 936 ; N uni04B4 ; G 1021 -U 1205 ; WX 732 ; N uni04B5 ; G 1022 -U 1206 ; WX 749 ; N uni04B6 ; G 1023 -U 1207 ; WX 677 ; N uni04B7 ; G 1024 -U 1210 ; WX 749 ; N uni04BA ; G 1025 -U 1211 ; WX 644 ; N uni04BB ; G 1026 -U 1216 ; WX 395 ; N uni04C0 ; G 1027 -U 1217 ; WX 1124 ; N uni04C1 ; G 1028 -U 1218 ; WX 1137 ; N uni04C2 ; G 1029 -U 1219 ; WX 747 ; N uni04C3 ; G 1030 -U 1220 ; WX 606 ; N uni04C4 ; G 1031 -U 1223 ; WX 872 ; N uni04C7 ; G 1032 -U 1224 ; WX 667 ; N uni04C8 ; G 1033 -U 1227 ; WX 749 ; N uni04CB ; G 1034 -U 1228 ; WX 667 ; N uni04CC ; G 1035 -U 1231 ; WX 320 ; N uni04CF ; G 1036 -U 1232 ; WX 757 ; N uni04D0 ; G 1037 -U 1233 ; WX 596 ; N uni04D1 ; G 1038 -U 1234 ; WX 757 ; N uni04D2 ; G 1039 -U 1235 ; WX 596 ; N uni04D3 ; G 1040 -U 1236 ; WX 1001 ; N uni04D4 ; G 1041 -U 1237 ; WX 940 ; N uni04D5 ; G 1042 -U 1238 ; WX 730 ; N uni04D6 ; G 1043 -U 1239 ; WX 592 ; N uni04D7 ; G 1044 -U 1240 ; WX 820 ; N uni04D8 ; G 1045 -U 1241 ; WX 592 ; N uni04D9 ; G 1046 -U 1242 ; WX 820 ; N uni04DA ; G 1047 -U 1243 ; WX 592 ; N uni04DB ; G 1048 -U 1244 ; WX 1124 ; N uni04DC ; G 1049 -U 1245 ; WX 1137 ; N uni04DD ; G 1050 -U 1246 ; WX 623 ; N uni04DE ; G 1051 -U 1247 ; WX 545 ; N uni04DF ; G 1052 -U 1248 ; WX 564 ; N uni04E0 ; G 1053 -U 1249 ; WX 564 ; N uni04E1 ; G 1054 -U 1250 ; WX 872 ; N uni04E2 ; G 1055 -U 1251 ; WX 644 ; N uni04E3 ; G 1056 -U 1252 ; WX 872 ; N uni04E4 ; G 1057 -U 1253 ; WX 644 ; N uni04E5 ; G 1058 -U 1254 ; WX 820 ; N uni04E6 ; G 1059 -U 1255 ; WX 602 ; N uni04E7 ; G 1060 -U 1256 ; WX 820 ; N uni04E8 ; G 1061 -U 1257 ; WX 602 ; N uni04E9 ; G 1062 -U 1258 ; WX 820 ; N uni04EA ; G 1063 -U 1259 ; WX 602 ; N uni04EB ; G 1064 -U 1260 ; WX 765 ; N uni04EC ; G 1065 -U 1261 ; WX 560 ; N uni04ED ; G 1066 -U 1262 ; WX 723 ; N uni04EE ; G 1067 -U 1263 ; WX 580 ; N uni04EF ; G 1068 -U 1264 ; WX 723 ; N uni04F0 ; G 1069 -U 1265 ; WX 580 ; N uni04F1 ; G 1070 -U 1266 ; WX 723 ; N uni04F2 ; G 1071 -U 1267 ; WX 580 ; N uni04F3 ; G 1072 -U 1268 ; WX 773 ; N uni04F4 ; G 1073 -U 1269 ; WX 622 ; N uni04F5 ; G 1074 -U 1270 ; WX 662 ; N uni04F6 ; G 1075 -U 1271 ; WX 505 ; N uni04F7 ; G 1076 -U 1272 ; WX 984 ; N uni04F8 ; G 1077 -U 1273 ; WX 814 ; N uni04F9 ; G 1078 -U 1296 ; WX 623 ; N uni0510 ; G 1079 -U 1297 ; WX 545 ; N uni0511 ; G 1080 -U 1298 ; WX 834 ; N uni0512 ; G 1081 -U 1299 ; WX 637 ; N uni0513 ; G 1082 -U 1300 ; WX 1199 ; N uni0514 ; G 1083 -U 1301 ; WX 939 ; N uni0515 ; G 1084 -U 1306 ; WX 820 ; N uni051A ; G 1085 -U 1307 ; WX 640 ; N uni051B ; G 1086 -U 1308 ; WX 1028 ; N uni051C ; G 1087 -U 1309 ; WX 856 ; N uni051D ; G 1088 -U 1329 ; WX 810 ; N uni0531 ; G 1089 -U 1330 ; WX 811 ; N uni0532 ; G 1090 -U 1331 ; WX 806 ; N uni0533 ; G 1091 -U 1332 ; WX 828 ; N uni0534 ; G 1092 -U 1333 ; WX 806 ; N uni0535 ; G 1093 -U 1334 ; WX 826 ; N uni0536 ; G 1094 -U 1335 ; WX 761 ; N uni0537 ; G 1095 -U 1336 ; WX 811 ; N uni0538 ; G 1096 -U 1337 ; WX 968 ; N uni0539 ; G 1097 -U 1338 ; WX 816 ; N uni053A ; G 1098 -U 1339 ; WX 772 ; N uni053B ; G 1099 -U 1340 ; WX 682 ; N uni053C ; G 1100 -U 1341 ; WX 1097 ; N uni053D ; G 1101 -U 1342 ; WX 845 ; N uni053E ; G 1102 -U 1343 ; WX 804 ; N uni053F ; G 1103 -U 1344 ; WX 719 ; N uni0540 ; G 1104 -U 1345 ; WX 810 ; N uni0541 ; G 1105 -U 1346 ; WX 833 ; N uni0542 ; G 1106 -U 1347 ; WX 831 ; N uni0543 ; G 1107 -U 1348 ; WX 897 ; N uni0544 ; G 1108 -U 1349 ; WX 763 ; N uni0545 ; G 1109 -U 1350 ; WX 794 ; N uni0546 ; G 1110 -U 1351 ; WX 754 ; N uni0547 ; G 1111 -U 1352 ; WX 799 ; N uni0548 ; G 1112 -U 1353 ; WX 797 ; N uni0549 ; G 1113 -U 1354 ; WX 875 ; N uni054A ; G 1114 -U 1355 ; WX 830 ; N uni054B ; G 1115 -U 1356 ; WX 864 ; N uni054C ; G 1116 -U 1357 ; WX 799 ; N uni054D ; G 1117 -U 1358 ; WX 802 ; N uni054E ; G 1118 -U 1359 ; WX 731 ; N uni054F ; G 1119 -U 1360 ; WX 774 ; N uni0550 ; G 1120 -U 1361 ; WX 749 ; N uni0551 ; G 1121 -U 1362 ; WX 633 ; N uni0552 ; G 1122 -U 1363 ; WX 845 ; N uni0553 ; G 1123 -U 1364 ; WX 843 ; N uni0554 ; G 1124 -U 1365 ; WX 835 ; N uni0555 ; G 1125 -U 1366 ; WX 821 ; N uni0556 ; G 1126 -U 1369 ; WX 307 ; N uni0559 ; G 1127 -U 1370 ; WX 264 ; N uni055A ; G 1128 -U 1371 ; WX 229 ; N uni055B ; G 1129 -U 1372 ; WX 391 ; N uni055C ; G 1130 -U 1373 ; WX 364 ; N uni055D ; G 1131 -U 1374 ; WX 386 ; N uni055E ; G 1132 -U 1375 ; WX 500 ; N uni055F ; G 1133 -U 1377 ; WX 949 ; N uni0561 ; G 1134 -U 1378 ; WX 618 ; N uni0562 ; G 1135 -U 1379 ; WX 695 ; N uni0563 ; G 1136 -U 1380 ; WX 695 ; N uni0564 ; G 1137 -U 1381 ; WX 628 ; N uni0565 ; G 1138 -U 1382 ; WX 688 ; N uni0566 ; G 1139 -U 1383 ; WX 510 ; N uni0567 ; G 1140 -U 1384 ; WX 636 ; N uni0568 ; G 1141 -U 1385 ; WX 791 ; N uni0569 ; G 1142 -U 1386 ; WX 671 ; N uni056A ; G 1143 -U 1387 ; WX 635 ; N uni056B ; G 1144 -U 1388 ; WX 305 ; N uni056C ; G 1145 -U 1389 ; WX 973 ; N uni056D ; G 1146 -U 1390 ; WX 614 ; N uni056E ; G 1147 -U 1391 ; WX 628 ; N uni056F ; G 1148 -U 1392 ; WX 636 ; N uni0570 ; G 1149 -U 1393 ; WX 630 ; N uni0571 ; G 1150 -U 1394 ; WX 636 ; N uni0572 ; G 1151 -U 1395 ; WX 654 ; N uni0573 ; G 1152 -U 1396 ; WX 644 ; N uni0574 ; G 1153 -U 1397 ; WX 309 ; N uni0575 ; G 1154 -U 1398 ; WX 636 ; N uni0576 ; G 1155 -U 1399 ; WX 461 ; N uni0577 ; G 1156 -U 1400 ; WX 649 ; N uni0578 ; G 1157 -U 1401 ; WX 365 ; N uni0579 ; G 1158 -U 1402 ; WX 940 ; N uni057A ; G 1159 -U 1403 ; WX 562 ; N uni057B ; G 1160 -U 1404 ; WX 657 ; N uni057C ; G 1161 -U 1405 ; WX 644 ; N uni057D ; G 1162 -U 1406 ; WX 630 ; N uni057E ; G 1163 -U 1407 ; WX 930 ; N uni057F ; G 1164 -U 1408 ; WX 644 ; N uni0580 ; G 1165 -U 1409 ; WX 643 ; N uni0581 ; G 1166 -U 1410 ; WX 483 ; N uni0582 ; G 1167 -U 1411 ; WX 930 ; N uni0583 ; G 1168 -U 1412 ; WX 636 ; N uni0584 ; G 1169 -U 1413 ; WX 609 ; N uni0585 ; G 1170 -U 1414 ; WX 809 ; N uni0586 ; G 1171 -U 1415 ; WX 789 ; N uni0587 ; G 1172 -U 1417 ; WX 340 ; N uni0589 ; G 1173 -U 1418 ; WX 334 ; N uni058A ; G 1174 -U 3647 ; WX 636 ; N uni0E3F ; G 1175 -U 4256 ; WX 732 ; N uni10A0 ; G 1176 -U 4257 ; WX 860 ; N uni10A1 ; G 1177 -U 4258 ; WX 837 ; N uni10A2 ; G 1178 -U 4259 ; WX 869 ; N uni10A3 ; G 1179 -U 4260 ; WX 743 ; N uni10A4 ; G 1180 -U 4261 ; WX 991 ; N uni10A5 ; G 1181 -U 4262 ; WX 925 ; N uni10A6 ; G 1182 -U 4263 ; WX 1111 ; N uni10A7 ; G 1183 -U 4264 ; WX 576 ; N uni10A8 ; G 1184 -U 4265 ; WX 760 ; N uni10A9 ; G 1185 -U 4266 ; WX 972 ; N uni10AA ; G 1186 -U 4267 ; WX 951 ; N uni10AB ; G 1187 -U 4268 ; WX 753 ; N uni10AC ; G 1188 -U 4269 ; WX 1084 ; N uni10AD ; G 1189 -U 4270 ; WX 906 ; N uni10AE ; G 1190 -U 4271 ; WX 838 ; N uni10AF ; G 1191 -U 4272 ; WX 1049 ; N uni10B0 ; G 1192 -U 4273 ; WX 743 ; N uni10B1 ; G 1193 -U 4274 ; WX 679 ; N uni10B2 ; G 1194 -U 4275 ; WX 1025 ; N uni10B3 ; G 1195 -U 4276 ; WX 946 ; N uni10B4 ; G 1196 -U 4277 ; WX 1029 ; N uni10B5 ; G 1197 -U 4278 ; WX 741 ; N uni10B6 ; G 1198 -U 4279 ; WX 743 ; N uni10B7 ; G 1199 -U 4280 ; WX 742 ; N uni10B8 ; G 1200 -U 4281 ; WX 743 ; N uni10B9 ; G 1201 -U 4282 ; WX 889 ; N uni10BA ; G 1202 -U 4283 ; WX 946 ; N uni10BB ; G 1203 -U 4284 ; WX 724 ; N uni10BC ; G 1204 -U 4285 ; WX 765 ; N uni10BD ; G 1205 -U 4286 ; WX 743 ; N uni10BE ; G 1206 -U 4287 ; WX 968 ; N uni10BF ; G 1207 -U 4288 ; WX 1010 ; N uni10C0 ; G 1208 -U 4289 ; WX 712 ; N uni10C1 ; G 1209 -U 4290 ; WX 874 ; N uni10C2 ; G 1210 -U 4291 ; WX 744 ; N uni10C3 ; G 1211 -U 4292 ; WX 847 ; N uni10C4 ; G 1212 -U 4293 ; WX 960 ; N uni10C5 ; G 1213 -U 4304 ; WX 550 ; N uni10D0 ; G 1214 -U 4305 ; WX 581 ; N uni10D1 ; G 1215 -U 4306 ; WX 599 ; N uni10D2 ; G 1216 -U 4307 ; WX 843 ; N uni10D3 ; G 1217 -U 4308 ; WX 571 ; N uni10D4 ; G 1218 -U 4309 ; WX 567 ; N uni10D5 ; G 1219 -U 4310 ; WX 620 ; N uni10D6 ; G 1220 -U 4311 ; WX 871 ; N uni10D7 ; G 1221 -U 4312 ; WX 569 ; N uni10D8 ; G 1222 -U 4313 ; WX 556 ; N uni10D9 ; G 1223 -U 4314 ; WX 1076 ; N uni10DA ; G 1224 -U 4315 ; WX 596 ; N uni10DB ; G 1225 -U 4316 ; WX 596 ; N uni10DC ; G 1226 -U 4317 ; WX 835 ; N uni10DD ; G 1227 -U 4318 ; WX 580 ; N uni10DE ; G 1228 -U 4319 ; WX 590 ; N uni10DF ; G 1229 -U 4320 ; WX 833 ; N uni10E0 ; G 1230 -U 4321 ; WX 607 ; N uni10E1 ; G 1231 -U 4322 ; WX 758 ; N uni10E2 ; G 1232 -U 4323 ; WX 701 ; N uni10E3 ; G 1233 -U 4324 ; WX 825 ; N uni10E4 ; G 1234 -U 4325 ; WX 595 ; N uni10E5 ; G 1235 -U 4326 ; WX 868 ; N uni10E6 ; G 1236 -U 4327 ; WX 578 ; N uni10E7 ; G 1237 -U 4328 ; WX 604 ; N uni10E8 ; G 1238 -U 4329 ; WX 596 ; N uni10E9 ; G 1239 -U 4330 ; WX 685 ; N uni10EA ; G 1240 -U 4331 ; WX 597 ; N uni10EB ; G 1241 -U 4332 ; WX 557 ; N uni10EC ; G 1242 -U 4333 ; WX 585 ; N uni10ED ; G 1243 -U 4334 ; WX 625 ; N uni10EE ; G 1244 -U 4335 ; WX 693 ; N uni10EF ; G 1245 -U 4336 ; WX 582 ; N uni10F0 ; G 1246 -U 4337 ; WX 613 ; N uni10F1 ; G 1247 -U 4338 ; WX 581 ; N uni10F2 ; G 1248 -U 4339 ; WX 582 ; N uni10F3 ; G 1249 -U 4340 ; WX 580 ; N uni10F4 ; G 1250 -U 4341 ; WX 659 ; N uni10F5 ; G 1251 -U 4342 ; WX 896 ; N uni10F6 ; G 1252 -U 4343 ; WX 636 ; N uni10F7 ; G 1253 -U 4344 ; WX 592 ; N uni10F8 ; G 1254 -U 4345 ; WX 628 ; N uni10F9 ; G 1255 -U 4346 ; WX 581 ; N uni10FA ; G 1256 -U 4347 ; WX 456 ; N uni10FB ; G 1257 -U 4348 ; WX 373 ; N uni10FC ; G 1258 -U 7424 ; WX 565 ; N uni1D00 ; G 1259 -U 7425 ; WX 774 ; N uni1D01 ; G 1260 -U 7426 ; WX 940 ; N uni1D02 ; G 1261 -U 7427 ; WX 563 ; N uni1D03 ; G 1262 -U 7428 ; WX 560 ; N uni1D04 ; G 1263 -U 7429 ; WX 585 ; N uni1D05 ; G 1264 -U 7430 ; WX 585 ; N uni1D06 ; G 1265 -U 7431 ; WX 553 ; N uni1D07 ; G 1266 -U 7432 ; WX 509 ; N uni1D08 ; G 1267 -U 7433 ; WX 320 ; N uni1D09 ; G 1268 -U 7434 ; WX 499 ; N uni1D0A ; G 1269 -U 7435 ; WX 597 ; N uni1D0B ; G 1270 -U 7436 ; WX 543 ; N uni1D0C ; G 1271 -U 7437 ; WX 778 ; N uni1D0D ; G 1272 -U 7438 ; WX 667 ; N uni1D0E ; G 1273 -U 7439 ; WX 602 ; N uni1D0F ; G 1274 -U 7440 ; WX 560 ; N uni1D10 ; G 1275 -U 7441 ; WX 647 ; N uni1D11 ; G 1276 -U 7442 ; WX 647 ; N uni1D12 ; G 1277 -U 7443 ; WX 647 ; N uni1D13 ; G 1278 -U 7444 ; WX 989 ; N uni1D14 ; G 1279 -U 7445 ; WX 512 ; N uni1D15 ; G 1280 -U 7446 ; WX 602 ; N uni1D16 ; G 1281 -U 7447 ; WX 602 ; N uni1D17 ; G 1282 -U 7448 ; WX 553 ; N uni1D18 ; G 1283 -U 7449 ; WX 594 ; N uni1D19 ; G 1284 -U 7450 ; WX 594 ; N uni1D1A ; G 1285 -U 7451 ; WX 553 ; N uni1D1B ; G 1286 -U 7452 ; WX 585 ; N uni1D1C ; G 1287 -U 7453 ; WX 664 ; N uni1D1D ; G 1288 -U 7454 ; WX 923 ; N uni1D1E ; G 1289 -U 7455 ; WX 655 ; N uni1D1F ; G 1290 -U 7456 ; WX 565 ; N uni1D20 ; G 1291 -U 7457 ; WX 856 ; N uni1D21 ; G 1292 -U 7458 ; WX 527 ; N uni1D22 ; G 1293 -U 7459 ; WX 527 ; N uni1D23 ; G 1294 -U 7460 ; WX 531 ; N uni1D24 ; G 1295 -U 7461 ; WX 743 ; N uni1D25 ; G 1296 -U 7462 ; WX 524 ; N uni1D26 ; G 1297 -U 7463 ; WX 565 ; N uni1D27 ; G 1298 -U 7464 ; WX 657 ; N uni1D28 ; G 1299 -U 7465 ; WX 553 ; N uni1D29 ; G 1300 -U 7466 ; WX 703 ; N uni1D2A ; G 1301 -U 7467 ; WX 635 ; N uni1D2B ; G 1302 -U 7468 ; WX 455 ; N uni1D2C ; G 1303 -U 7469 ; WX 630 ; N uni1D2D ; G 1304 -U 7470 ; WX 463 ; N uni1D2E ; G 1305 -U 7471 ; WX 463 ; N uni1D2F ; G 1306 -U 7472 ; WX 505 ; N uni1D30 ; G 1307 -U 7473 ; WX 459 ; N uni1D31 ; G 1308 -U 7474 ; WX 459 ; N uni1D32 ; G 1309 -U 7475 ; WX 503 ; N uni1D33 ; G 1310 -U 7476 ; WX 549 ; N uni1D34 ; G 1311 -U 7477 ; WX 249 ; N uni1D35 ; G 1312 -U 7478 ; WX 252 ; N uni1D36 ; G 1313 -U 7479 ; WX 470 ; N uni1D37 ; G 1314 -U 7480 ; WX 418 ; N uni1D38 ; G 1315 -U 7481 ; WX 645 ; N uni1D39 ; G 1316 -U 7482 ; WX 551 ; N uni1D3A ; G 1317 -U 7483 ; WX 551 ; N uni1D3B ; G 1318 -U 7484 ; WX 516 ; N uni1D3C ; G 1319 -U 7485 ; WX 369 ; N uni1D3D ; G 1320 -U 7486 ; WX 424 ; N uni1D3E ; G 1321 -U 7487 ; WX 474 ; N uni1D3F ; G 1322 -U 7488 ; WX 420 ; N uni1D40 ; G 1323 -U 7489 ; WX 531 ; N uni1D41 ; G 1324 -U 7490 ; WX 647 ; N uni1D42 ; G 1325 -U 7491 ; WX 375 ; N uni1D43 ; G 1326 -U 7492 ; WX 375 ; N uni1D44 ; G 1327 -U 7493 ; WX 425 ; N uni1D45 ; G 1328 -U 7494 ; WX 592 ; N uni1D46 ; G 1329 -U 7495 ; WX 400 ; N uni1D47 ; G 1330 -U 7496 ; WX 400 ; N uni1D48 ; G 1331 -U 7497 ; WX 387 ; N uni1D49 ; G 1332 -U 7498 ; WX 387 ; N uni1D4A ; G 1333 -U 7499 ; WX 428 ; N uni1D4B ; G 1334 -U 7500 ; WX 340 ; N uni1D4C ; G 1335 -U 7501 ; WX 400 ; N uni1D4D ; G 1336 -U 7502 ; WX 175 ; N uni1D4E ; G 1337 -U 7503 ; WX 365 ; N uni1D4F ; G 1338 -U 7504 ; WX 613 ; N uni1D50 ; G 1339 -U 7505 ; WX 399 ; N uni1D51 ; G 1340 -U 7506 ; WX 385 ; N uni1D52 ; G 1341 -U 7507 ; WX 346 ; N uni1D53 ; G 1342 -U 7508 ; WX 385 ; N uni1D54 ; G 1343 -U 7509 ; WX 385 ; N uni1D55 ; G 1344 -U 7510 ; WX 400 ; N uni1D56 ; G 1345 -U 7511 ; WX 247 ; N uni1D57 ; G 1346 -U 7512 ; WX 399 ; N uni1D58 ; G 1347 -U 7513 ; WX 418 ; N uni1D59 ; G 1348 -U 7514 ; WX 613 ; N uni1D5A ; G 1349 -U 7515 ; WX 373 ; N uni1D5B ; G 1350 -U 7516 ; WX 468 ; N uni1D5C ; G 1351 -U 7517 ; WX 364 ; N uni1D5D ; G 1352 -U 7518 ; WX 376 ; N uni1D5E ; G 1353 -U 7519 ; WX 379 ; N uni1D5F ; G 1354 -U 7520 ; WX 441 ; N uni1D60 ; G 1355 -U 7521 ; WX 381 ; N uni1D61 ; G 1356 -U 7522 ; WX 201 ; N uni1D62 ; G 1357 -U 7523 ; WX 347 ; N uni1D63 ; G 1358 -U 7524 ; WX 399 ; N uni1D64 ; G 1359 -U 7525 ; WX 373 ; N uni1D65 ; G 1360 -U 7526 ; WX 364 ; N uni1D66 ; G 1361 -U 7527 ; WX 376 ; N uni1D67 ; G 1362 -U 7528 ; WX 370 ; N uni1D68 ; G 1363 -U 7529 ; WX 441 ; N uni1D69 ; G 1364 -U 7530 ; WX 381 ; N uni1D6A ; G 1365 -U 7531 ; WX 974 ; N uni1D6B ; G 1366 -U 7543 ; WX 640 ; N uni1D77 ; G 1367 -U 7544 ; WX 549 ; N uni1D78 ; G 1368 -U 7547 ; WX 320 ; N uni1D7B ; G 1369 -U 7548 ; WX 392 ; N uni1D7C ; G 1370 -U 7549 ; WX 640 ; N uni1D7D ; G 1371 -U 7550 ; WX 585 ; N uni1D7E ; G 1372 -U 7551 ; WX 620 ; N uni1D7F ; G 1373 -U 7557 ; WX 320 ; N uni1D85 ; G 1374 -U 7579 ; WX 425 ; N uni1D9B ; G 1375 -U 7580 ; WX 353 ; N uni1D9C ; G 1376 -U 7581 ; WX 353 ; N uni1D9D ; G 1377 -U 7582 ; WX 473 ; N uni1D9E ; G 1378 -U 7583 ; WX 428 ; N uni1D9F ; G 1379 -U 7584 ; WX 233 ; N uni1DA0 ; G 1380 -U 7585 ; WX 316 ; N uni1DA1 ; G 1381 -U 7586 ; WX 488 ; N uni1DA2 ; G 1382 -U 7587 ; WX 399 ; N uni1DA3 ; G 1383 -U 7588 ; WX 201 ; N uni1DA4 ; G 1384 -U 7589 ; WX 201 ; N uni1DA5 ; G 1385 -U 7590 ; WX 201 ; N uni1DA6 ; G 1386 -U 7591 ; WX 201 ; N uni1DA7 ; G 1387 -U 7592 ; WX 318 ; N uni1DA8 ; G 1388 -U 7593 ; WX 263 ; N uni1DA9 ; G 1389 -U 7594 ; WX 263 ; N uni1DAA ; G 1390 -U 7595 ; WX 455 ; N uni1DAB ; G 1391 -U 7596 ; WX 613 ; N uni1DAC ; G 1392 -U 7597 ; WX 613 ; N uni1DAD ; G 1393 -U 7598 ; WX 495 ; N uni1DAE ; G 1394 -U 7599 ; WX 492 ; N uni1DAF ; G 1395 -U 7600 ; WX 487 ; N uni1DB0 ; G 1396 -U 7601 ; WX 385 ; N uni1DB1 ; G 1397 -U 7602 ; WX 473 ; N uni1DB2 ; G 1398 -U 7603 ; WX 328 ; N uni1DB3 ; G 1399 -U 7604 ; WX 299 ; N uni1DB4 ; G 1400 -U 7605 ; WX 334 ; N uni1DB5 ; G 1401 -U 7606 ; WX 399 ; N uni1DB6 ; G 1402 -U 7607 ; WX 477 ; N uni1DB7 ; G 1403 -U 7608 ; WX 368 ; N uni1DB8 ; G 1404 -U 7609 ; WX 464 ; N uni1DB9 ; G 1405 -U 7610 ; WX 355 ; N uni1DBA ; G 1406 -U 7611 ; WX 332 ; N uni1DBB ; G 1407 -U 7612 ; WX 418 ; N uni1DBC ; G 1408 -U 7613 ; WX 418 ; N uni1DBD ; G 1409 -U 7614 ; WX 452 ; N uni1DBE ; G 1410 -U 7615 ; WX 473 ; N uni1DBF ; G 1411 -U 7620 ; WX 0 ; N uni1DC4 ; G 1412 -U 7621 ; WX 0 ; N uni1DC5 ; G 1413 -U 7622 ; WX 0 ; N uni1DC6 ; G 1414 -U 7623 ; WX 0 ; N uni1DC7 ; G 1415 -U 7624 ; WX 0 ; N uni1DC8 ; G 1416 -U 7625 ; WX 0 ; N uni1DC9 ; G 1417 -U 7680 ; WX 722 ; N uni1E00 ; G 1418 -U 7681 ; WX 596 ; N uni1E01 ; G 1419 -U 7682 ; WX 735 ; N uni1E02 ; G 1420 -U 7683 ; WX 640 ; N uni1E03 ; G 1421 -U 7684 ; WX 735 ; N uni1E04 ; G 1422 -U 7685 ; WX 640 ; N uni1E05 ; G 1423 -U 7686 ; WX 735 ; N uni1E06 ; G 1424 -U 7687 ; WX 640 ; N uni1E07 ; G 1425 -U 7688 ; WX 765 ; N uni1E08 ; G 1426 -U 7689 ; WX 560 ; N uni1E09 ; G 1427 -U 7690 ; WX 802 ; N uni1E0A ; G 1428 -U 7691 ; WX 640 ; N uni1E0B ; G 1429 -U 7692 ; WX 802 ; N uni1E0C ; G 1430 -U 7693 ; WX 640 ; N uni1E0D ; G 1431 -U 7694 ; WX 802 ; N uni1E0E ; G 1432 -U 7695 ; WX 640 ; N uni1E0F ; G 1433 -U 7696 ; WX 802 ; N uni1E10 ; G 1434 -U 7697 ; WX 640 ; N uni1E11 ; G 1435 -U 7698 ; WX 802 ; N uni1E12 ; G 1436 -U 7699 ; WX 640 ; N uni1E13 ; G 1437 -U 7700 ; WX 730 ; N uni1E14 ; G 1438 -U 7701 ; WX 592 ; N uni1E15 ; G 1439 -U 7702 ; WX 730 ; N uni1E16 ; G 1440 -U 7703 ; WX 592 ; N uni1E17 ; G 1441 -U 7704 ; WX 730 ; N uni1E18 ; G 1442 -U 7705 ; WX 592 ; N uni1E19 ; G 1443 -U 7706 ; WX 730 ; N uni1E1A ; G 1444 -U 7707 ; WX 592 ; N uni1E1B ; G 1445 -U 7708 ; WX 730 ; N uni1E1C ; G 1446 -U 7709 ; WX 592 ; N uni1E1D ; G 1447 -U 7710 ; WX 694 ; N uni1E1E ; G 1448 -U 7711 ; WX 370 ; N uni1E1F ; G 1449 -U 7712 ; WX 799 ; N uni1E20 ; G 1450 -U 7713 ; WX 640 ; N uni1E21 ; G 1451 -U 7714 ; WX 872 ; N uni1E22 ; G 1452 -U 7715 ; WX 644 ; N uni1E23 ; G 1453 -U 7716 ; WX 872 ; N uni1E24 ; G 1454 -U 7717 ; WX 644 ; N uni1E25 ; G 1455 -U 7718 ; WX 872 ; N uni1E26 ; G 1456 -U 7719 ; WX 644 ; N uni1E27 ; G 1457 -U 7720 ; WX 872 ; N uni1E28 ; G 1458 -U 7721 ; WX 644 ; N uni1E29 ; G 1459 -U 7722 ; WX 872 ; N uni1E2A ; G 1460 -U 7723 ; WX 644 ; N uni1E2B ; G 1461 -U 7724 ; WX 395 ; N uni1E2C ; G 1462 -U 7725 ; WX 320 ; N uni1E2D ; G 1463 -U 7726 ; WX 395 ; N uni1E2E ; G 1464 -U 7727 ; WX 320 ; N uni1E2F ; G 1465 -U 7728 ; WX 747 ; N uni1E30 ; G 1466 -U 7729 ; WX 606 ; N uni1E31 ; G 1467 -U 7730 ; WX 747 ; N uni1E32 ; G 1468 -U 7731 ; WX 606 ; N uni1E33 ; G 1469 -U 7732 ; WX 747 ; N uni1E34 ; G 1470 -U 7733 ; WX 606 ; N uni1E35 ; G 1471 -U 7734 ; WX 664 ; N uni1E36 ; G 1472 -U 7735 ; WX 320 ; N uni1E37 ; G 1473 -U 7736 ; WX 664 ; N uni1E38 ; G 1474 -U 7737 ; WX 320 ; N uni1E39 ; G 1475 -U 7738 ; WX 664 ; N uni1E3A ; G 1476 -U 7739 ; WX 320 ; N uni1E3B ; G 1477 -U 7740 ; WX 664 ; N uni1E3C ; G 1478 -U 7741 ; WX 320 ; N uni1E3D ; G 1479 -U 7742 ; WX 1024 ; N uni1E3E ; G 1480 -U 7743 ; WX 948 ; N uni1E3F ; G 1481 -U 7744 ; WX 1024 ; N uni1E40 ; G 1482 -U 7745 ; WX 948 ; N uni1E41 ; G 1483 -U 7746 ; WX 1024 ; N uni1E42 ; G 1484 -U 7747 ; WX 953 ; N uni1E43 ; G 1485 -U 7748 ; WX 875 ; N uni1E44 ; G 1486 -U 7749 ; WX 644 ; N uni1E45 ; G 1487 -U 7750 ; WX 875 ; N uni1E46 ; G 1488 -U 7751 ; WX 644 ; N uni1E47 ; G 1489 -U 7752 ; WX 875 ; N uni1E48 ; G 1490 -U 7753 ; WX 644 ; N uni1E49 ; G 1491 -U 7754 ; WX 875 ; N uni1E4A ; G 1492 -U 7755 ; WX 644 ; N uni1E4B ; G 1493 -U 7756 ; WX 820 ; N uni1E4C ; G 1494 -U 7757 ; WX 602 ; N uni1E4D ; G 1495 -U 7758 ; WX 820 ; N uni1E4E ; G 1496 -U 7759 ; WX 602 ; N uni1E4F ; G 1497 -U 7760 ; WX 820 ; N uni1E50 ; G 1498 -U 7761 ; WX 602 ; N uni1E51 ; G 1499 -U 7762 ; WX 820 ; N uni1E52 ; G 1500 -U 7763 ; WX 602 ; N uni1E53 ; G 1501 -U 7764 ; WX 673 ; N uni1E54 ; G 1502 -U 7765 ; WX 640 ; N uni1E55 ; G 1503 -U 7766 ; WX 673 ; N uni1E56 ; G 1504 -U 7767 ; WX 640 ; N uni1E57 ; G 1505 -U 7768 ; WX 753 ; N uni1E58 ; G 1506 -U 7769 ; WX 478 ; N uni1E59 ; G 1507 -U 7770 ; WX 753 ; N uni1E5A ; G 1508 -U 7771 ; WX 478 ; N uni1E5B ; G 1509 -U 7772 ; WX 753 ; N uni1E5C ; G 1510 -U 7773 ; WX 478 ; N uni1E5D ; G 1511 -U 7774 ; WX 753 ; N uni1E5E ; G 1512 -U 7775 ; WX 478 ; N uni1E5F ; G 1513 -U 7776 ; WX 685 ; N uni1E60 ; G 1514 -U 7777 ; WX 513 ; N uni1E61 ; G 1515 -U 7778 ; WX 685 ; N uni1E62 ; G 1516 -U 7779 ; WX 513 ; N uni1E63 ; G 1517 -U 7780 ; WX 685 ; N uni1E64 ; G 1518 -U 7781 ; WX 513 ; N uni1E65 ; G 1519 -U 7782 ; WX 685 ; N uni1E66 ; G 1520 -U 7783 ; WX 521 ; N uni1E67 ; G 1521 -U 7784 ; WX 685 ; N uni1E68 ; G 1522 -U 7785 ; WX 513 ; N uni1E69 ; G 1523 -U 7786 ; WX 667 ; N uni1E6A ; G 1524 -U 7787 ; WX 402 ; N uni1E6B ; G 1525 -U 7788 ; WX 667 ; N uni1E6C ; G 1526 -U 7789 ; WX 402 ; N uni1E6D ; G 1527 -U 7790 ; WX 667 ; N uni1E6E ; G 1528 -U 7791 ; WX 402 ; N uni1E6F ; G 1529 -U 7792 ; WX 667 ; N uni1E70 ; G 1530 -U 7793 ; WX 402 ; N uni1E71 ; G 1531 -U 7794 ; WX 843 ; N uni1E72 ; G 1532 -U 7795 ; WX 644 ; N uni1E73 ; G 1533 -U 7796 ; WX 843 ; N uni1E74 ; G 1534 -U 7797 ; WX 644 ; N uni1E75 ; G 1535 -U 7798 ; WX 843 ; N uni1E76 ; G 1536 -U 7799 ; WX 644 ; N uni1E77 ; G 1537 -U 7800 ; WX 843 ; N uni1E78 ; G 1538 -U 7801 ; WX 644 ; N uni1E79 ; G 1539 -U 7802 ; WX 843 ; N uni1E7A ; G 1540 -U 7803 ; WX 644 ; N uni1E7B ; G 1541 -U 7804 ; WX 722 ; N uni1E7C ; G 1542 -U 7805 ; WX 565 ; N uni1E7D ; G 1543 -U 7806 ; WX 722 ; N uni1E7E ; G 1544 -U 7807 ; WX 565 ; N uni1E7F ; G 1545 -U 7808 ; WX 1028 ; N Wgrave ; G 1546 -U 7809 ; WX 856 ; N wgrave ; G 1547 -U 7810 ; WX 1028 ; N Wacute ; G 1548 -U 7811 ; WX 856 ; N wacute ; G 1549 -U 7812 ; WX 1028 ; N Wdieresis ; G 1550 -U 7813 ; WX 856 ; N wdieresis ; G 1551 -U 7814 ; WX 1028 ; N uni1E86 ; G 1552 -U 7815 ; WX 856 ; N uni1E87 ; G 1553 -U 7816 ; WX 1028 ; N uni1E88 ; G 1554 -U 7817 ; WX 856 ; N uni1E89 ; G 1555 -U 7818 ; WX 712 ; N uni1E8A ; G 1556 -U 7819 ; WX 564 ; N uni1E8B ; G 1557 -U 7820 ; WX 712 ; N uni1E8C ; G 1558 -U 7821 ; WX 564 ; N uni1E8D ; G 1559 -U 7822 ; WX 660 ; N uni1E8E ; G 1560 -U 7823 ; WX 565 ; N uni1E8F ; G 1561 -U 7824 ; WX 695 ; N uni1E90 ; G 1562 -U 7825 ; WX 527 ; N uni1E91 ; G 1563 -U 7826 ; WX 695 ; N uni1E92 ; G 1564 -U 7827 ; WX 527 ; N uni1E93 ; G 1565 -U 7828 ; WX 695 ; N uni1E94 ; G 1566 -U 7829 ; WX 527 ; N uni1E95 ; G 1567 -U 7830 ; WX 644 ; N uni1E96 ; G 1568 -U 7831 ; WX 402 ; N uni1E97 ; G 1569 -U 7832 ; WX 856 ; N uni1E98 ; G 1570 -U 7833 ; WX 565 ; N uni1E99 ; G 1571 -U 7834 ; WX 903 ; N uni1E9A ; G 1572 -U 7835 ; WX 370 ; N uni1E9B ; G 1573 -U 7836 ; WX 370 ; N uni1E9C ; G 1574 -U 7837 ; WX 370 ; N uni1E9D ; G 1575 -U 7838 ; WX 829 ; N uni1E9E ; G 1576 -U 7839 ; WX 602 ; N uni1E9F ; G 1577 -U 7840 ; WX 722 ; N uni1EA0 ; G 1578 -U 7841 ; WX 596 ; N uni1EA1 ; G 1579 -U 7842 ; WX 722 ; N uni1EA2 ; G 1580 -U 7843 ; WX 596 ; N uni1EA3 ; G 1581 -U 7844 ; WX 722 ; N uni1EA4 ; G 1582 -U 7845 ; WX 613 ; N uni1EA5 ; G 1583 -U 7846 ; WX 722 ; N uni1EA6 ; G 1584 -U 7847 ; WX 613 ; N uni1EA7 ; G 1585 -U 7848 ; WX 722 ; N uni1EA8 ; G 1586 -U 7849 ; WX 613 ; N uni1EA9 ; G 1587 -U 7850 ; WX 722 ; N uni1EAA ; G 1588 -U 7851 ; WX 613 ; N uni1EAB ; G 1589 -U 7852 ; WX 722 ; N uni1EAC ; G 1590 -U 7853 ; WX 596 ; N uni1EAD ; G 1591 -U 7854 ; WX 722 ; N uni1EAE ; G 1592 -U 7855 ; WX 596 ; N uni1EAF ; G 1593 -U 7856 ; WX 722 ; N uni1EB0 ; G 1594 -U 7857 ; WX 596 ; N uni1EB1 ; G 1595 -U 7858 ; WX 722 ; N uni1EB2 ; G 1596 -U 7859 ; WX 596 ; N uni1EB3 ; G 1597 -U 7860 ; WX 722 ; N uni1EB4 ; G 1598 -U 7861 ; WX 596 ; N uni1EB5 ; G 1599 -U 7862 ; WX 722 ; N uni1EB6 ; G 1600 -U 7863 ; WX 596 ; N uni1EB7 ; G 1601 -U 7864 ; WX 730 ; N uni1EB8 ; G 1602 -U 7865 ; WX 592 ; N uni1EB9 ; G 1603 -U 7866 ; WX 730 ; N uni1EBA ; G 1604 -U 7867 ; WX 592 ; N uni1EBB ; G 1605 -U 7868 ; WX 730 ; N uni1EBC ; G 1606 -U 7869 ; WX 592 ; N uni1EBD ; G 1607 -U 7870 ; WX 730 ; N uni1EBE ; G 1608 -U 7871 ; WX 615 ; N uni1EBF ; G 1609 -U 7872 ; WX 730 ; N uni1EC0 ; G 1610 -U 7873 ; WX 615 ; N uni1EC1 ; G 1611 -U 7874 ; WX 730 ; N uni1EC2 ; G 1612 -U 7875 ; WX 615 ; N uni1EC3 ; G 1613 -U 7876 ; WX 730 ; N uni1EC4 ; G 1614 -U 7877 ; WX 615 ; N uni1EC5 ; G 1615 -U 7878 ; WX 730 ; N uni1EC6 ; G 1616 -U 7879 ; WX 592 ; N uni1EC7 ; G 1617 -U 7880 ; WX 395 ; N uni1EC8 ; G 1618 -U 7881 ; WX 320 ; N uni1EC9 ; G 1619 -U 7882 ; WX 395 ; N uni1ECA ; G 1620 -U 7883 ; WX 320 ; N uni1ECB ; G 1621 -U 7884 ; WX 820 ; N uni1ECC ; G 1622 -U 7885 ; WX 602 ; N uni1ECD ; G 1623 -U 7886 ; WX 820 ; N uni1ECE ; G 1624 -U 7887 ; WX 602 ; N uni1ECF ; G 1625 -U 7888 ; WX 820 ; N uni1ED0 ; G 1626 -U 7889 ; WX 612 ; N uni1ED1 ; G 1627 -U 7890 ; WX 820 ; N uni1ED2 ; G 1628 -U 7891 ; WX 612 ; N uni1ED3 ; G 1629 -U 7892 ; WX 820 ; N uni1ED4 ; G 1630 -U 7893 ; WX 612 ; N uni1ED5 ; G 1631 -U 7894 ; WX 820 ; N uni1ED6 ; G 1632 -U 7895 ; WX 612 ; N uni1ED7 ; G 1633 -U 7896 ; WX 820 ; N uni1ED8 ; G 1634 -U 7897 ; WX 602 ; N uni1ED9 ; G 1635 -U 7898 ; WX 820 ; N uni1EDA ; G 1636 -U 7899 ; WX 602 ; N uni1EDB ; G 1637 -U 7900 ; WX 820 ; N uni1EDC ; G 1638 -U 7901 ; WX 602 ; N uni1EDD ; G 1639 -U 7902 ; WX 820 ; N uni1EDE ; G 1640 -U 7903 ; WX 602 ; N uni1EDF ; G 1641 -U 7904 ; WX 820 ; N uni1EE0 ; G 1642 -U 7905 ; WX 602 ; N uni1EE1 ; G 1643 -U 7906 ; WX 820 ; N uni1EE2 ; G 1644 -U 7907 ; WX 602 ; N uni1EE3 ; G 1645 -U 7908 ; WX 843 ; N uni1EE4 ; G 1646 -U 7909 ; WX 644 ; N uni1EE5 ; G 1647 -U 7910 ; WX 843 ; N uni1EE6 ; G 1648 -U 7911 ; WX 644 ; N uni1EE7 ; G 1649 -U 7912 ; WX 843 ; N uni1EE8 ; G 1650 -U 7913 ; WX 644 ; N uni1EE9 ; G 1651 -U 7914 ; WX 843 ; N uni1EEA ; G 1652 -U 7915 ; WX 644 ; N uni1EEB ; G 1653 -U 7916 ; WX 843 ; N uni1EEC ; G 1654 -U 7917 ; WX 644 ; N uni1EED ; G 1655 -U 7918 ; WX 843 ; N uni1EEE ; G 1656 -U 7919 ; WX 644 ; N uni1EEF ; G 1657 -U 7920 ; WX 843 ; N uni1EF0 ; G 1658 -U 7921 ; WX 644 ; N uni1EF1 ; G 1659 -U 7922 ; WX 660 ; N Ygrave ; G 1660 -U 7923 ; WX 565 ; N ygrave ; G 1661 -U 7924 ; WX 660 ; N uni1EF4 ; G 1662 -U 7925 ; WX 565 ; N uni1EF5 ; G 1663 -U 7926 ; WX 660 ; N uni1EF6 ; G 1664 -U 7927 ; WX 565 ; N uni1EF7 ; G 1665 -U 7928 ; WX 660 ; N uni1EF8 ; G 1666 -U 7929 ; WX 565 ; N uni1EF9 ; G 1667 -U 7930 ; WX 949 ; N uni1EFA ; G 1668 -U 7931 ; WX 581 ; N uni1EFB ; G 1669 -U 7936 ; WX 675 ; N uni1F00 ; G 1670 -U 7937 ; WX 675 ; N uni1F01 ; G 1671 -U 7938 ; WX 675 ; N uni1F02 ; G 1672 -U 7939 ; WX 675 ; N uni1F03 ; G 1673 -U 7940 ; WX 675 ; N uni1F04 ; G 1674 -U 7941 ; WX 675 ; N uni1F05 ; G 1675 -U 7942 ; WX 675 ; N uni1F06 ; G 1676 -U 7943 ; WX 675 ; N uni1F07 ; G 1677 -U 7944 ; WX 722 ; N uni1F08 ; G 1678 -U 7945 ; WX 722 ; N uni1F09 ; G 1679 -U 7946 ; WX 869 ; N uni1F0A ; G 1680 -U 7947 ; WX 869 ; N uni1F0B ; G 1681 -U 7948 ; WX 734 ; N uni1F0C ; G 1682 -U 7949 ; WX 763 ; N uni1F0D ; G 1683 -U 7950 ; WX 722 ; N uni1F0E ; G 1684 -U 7951 ; WX 722 ; N uni1F0F ; G 1685 -U 7952 ; WX 537 ; N uni1F10 ; G 1686 -U 7953 ; WX 537 ; N uni1F11 ; G 1687 -U 7954 ; WX 537 ; N uni1F12 ; G 1688 -U 7955 ; WX 537 ; N uni1F13 ; G 1689 -U 7956 ; WX 537 ; N uni1F14 ; G 1690 -U 7957 ; WX 537 ; N uni1F15 ; G 1691 -U 7960 ; WX 853 ; N uni1F18 ; G 1692 -U 7961 ; WX 841 ; N uni1F19 ; G 1693 -U 7962 ; WX 1067 ; N uni1F1A ; G 1694 -U 7963 ; WX 1077 ; N uni1F1B ; G 1695 -U 7964 ; WX 1008 ; N uni1F1C ; G 1696 -U 7965 ; WX 1035 ; N uni1F1D ; G 1697 -U 7968 ; WX 599 ; N uni1F20 ; G 1698 -U 7969 ; WX 599 ; N uni1F21 ; G 1699 -U 7970 ; WX 599 ; N uni1F22 ; G 1700 -U 7971 ; WX 599 ; N uni1F23 ; G 1701 -U 7972 ; WX 599 ; N uni1F24 ; G 1702 -U 7973 ; WX 599 ; N uni1F25 ; G 1703 -U 7974 ; WX 599 ; N uni1F26 ; G 1704 -U 7975 ; WX 599 ; N uni1F27 ; G 1705 -U 7976 ; WX 998 ; N uni1F28 ; G 1706 -U 7977 ; WX 992 ; N uni1F29 ; G 1707 -U 7978 ; WX 1212 ; N uni1F2A ; G 1708 -U 7979 ; WX 1224 ; N uni1F2B ; G 1709 -U 7980 ; WX 1159 ; N uni1F2C ; G 1710 -U 7981 ; WX 1183 ; N uni1F2D ; G 1711 -U 7982 ; WX 1098 ; N uni1F2E ; G 1712 -U 7983 ; WX 1095 ; N uni1F2F ; G 1713 -U 7984 ; WX 392 ; N uni1F30 ; G 1714 -U 7985 ; WX 392 ; N uni1F31 ; G 1715 -U 7986 ; WX 392 ; N uni1F32 ; G 1716 -U 7987 ; WX 392 ; N uni1F33 ; G 1717 -U 7988 ; WX 392 ; N uni1F34 ; G 1718 -U 7989 ; WX 392 ; N uni1F35 ; G 1719 -U 7990 ; WX 392 ; N uni1F36 ; G 1720 -U 7991 ; WX 392 ; N uni1F37 ; G 1721 -U 7992 ; WX 521 ; N uni1F38 ; G 1722 -U 7993 ; WX 512 ; N uni1F39 ; G 1723 -U 7994 ; WX 735 ; N uni1F3A ; G 1724 -U 7995 ; WX 738 ; N uni1F3B ; G 1725 -U 7996 ; WX 679 ; N uni1F3C ; G 1726 -U 7997 ; WX 706 ; N uni1F3D ; G 1727 -U 7998 ; WX 624 ; N uni1F3E ; G 1728 -U 7999 ; WX 615 ; N uni1F3F ; G 1729 -U 8000 ; WX 602 ; N uni1F40 ; G 1730 -U 8001 ; WX 602 ; N uni1F41 ; G 1731 -U 8002 ; WX 602 ; N uni1F42 ; G 1732 -U 8003 ; WX 602 ; N uni1F43 ; G 1733 -U 8004 ; WX 602 ; N uni1F44 ; G 1734 -U 8005 ; WX 602 ; N uni1F45 ; G 1735 -U 8008 ; WX 820 ; N uni1F48 ; G 1736 -U 8009 ; WX 859 ; N uni1F49 ; G 1737 -U 8010 ; WX 1120 ; N uni1F4A ; G 1738 -U 8011 ; WX 1127 ; N uni1F4B ; G 1739 -U 8012 ; WX 937 ; N uni1F4C ; G 1740 -U 8013 ; WX 964 ; N uni1F4D ; G 1741 -U 8016 ; WX 608 ; N uni1F50 ; G 1742 -U 8017 ; WX 608 ; N uni1F51 ; G 1743 -U 8018 ; WX 608 ; N uni1F52 ; G 1744 -U 8019 ; WX 608 ; N uni1F53 ; G 1745 -U 8020 ; WX 608 ; N uni1F54 ; G 1746 -U 8021 ; WX 608 ; N uni1F55 ; G 1747 -U 8022 ; WX 608 ; N uni1F56 ; G 1748 -U 8023 ; WX 608 ; N uni1F57 ; G 1749 -U 8025 ; WX 851 ; N uni1F59 ; G 1750 -U 8027 ; WX 1079 ; N uni1F5B ; G 1751 -U 8029 ; WX 1044 ; N uni1F5D ; G 1752 -U 8031 ; WX 953 ; N uni1F5F ; G 1753 -U 8032 ; WX 815 ; N uni1F60 ; G 1754 -U 8033 ; WX 815 ; N uni1F61 ; G 1755 -U 8034 ; WX 815 ; N uni1F62 ; G 1756 -U 8035 ; WX 815 ; N uni1F63 ; G 1757 -U 8036 ; WX 815 ; N uni1F64 ; G 1758 -U 8037 ; WX 815 ; N uni1F65 ; G 1759 -U 8038 ; WX 815 ; N uni1F66 ; G 1760 -U 8039 ; WX 815 ; N uni1F67 ; G 1761 -U 8040 ; WX 829 ; N uni1F68 ; G 1762 -U 8041 ; WX 870 ; N uni1F69 ; G 1763 -U 8042 ; WX 1131 ; N uni1F6A ; G 1764 -U 8043 ; WX 1137 ; N uni1F6B ; G 1765 -U 8044 ; WX 946 ; N uni1F6C ; G 1766 -U 8045 ; WX 976 ; N uni1F6D ; G 1767 -U 8046 ; WX 938 ; N uni1F6E ; G 1768 -U 8047 ; WX 970 ; N uni1F6F ; G 1769 -U 8048 ; WX 675 ; N uni1F70 ; G 1770 -U 8049 ; WX 675 ; N uni1F71 ; G 1771 -U 8050 ; WX 537 ; N uni1F72 ; G 1772 -U 8051 ; WX 537 ; N uni1F73 ; G 1773 -U 8052 ; WX 599 ; N uni1F74 ; G 1774 -U 8053 ; WX 599 ; N uni1F75 ; G 1775 -U 8054 ; WX 392 ; N uni1F76 ; G 1776 -U 8055 ; WX 392 ; N uni1F77 ; G 1777 -U 8056 ; WX 602 ; N uni1F78 ; G 1778 -U 8057 ; WX 602 ; N uni1F79 ; G 1779 -U 8058 ; WX 608 ; N uni1F7A ; G 1780 -U 8059 ; WX 608 ; N uni1F7B ; G 1781 -U 8060 ; WX 815 ; N uni1F7C ; G 1782 -U 8061 ; WX 815 ; N uni1F7D ; G 1783 -U 8064 ; WX 675 ; N uni1F80 ; G 1784 -U 8065 ; WX 675 ; N uni1F81 ; G 1785 -U 8066 ; WX 675 ; N uni1F82 ; G 1786 -U 8067 ; WX 675 ; N uni1F83 ; G 1787 -U 8068 ; WX 675 ; N uni1F84 ; G 1788 -U 8069 ; WX 675 ; N uni1F85 ; G 1789 -U 8070 ; WX 675 ; N uni1F86 ; G 1790 -U 8071 ; WX 675 ; N uni1F87 ; G 1791 -U 8072 ; WX 722 ; N uni1F88 ; G 1792 -U 8073 ; WX 722 ; N uni1F89 ; G 1793 -U 8074 ; WX 869 ; N uni1F8A ; G 1794 -U 8075 ; WX 869 ; N uni1F8B ; G 1795 -U 8076 ; WX 734 ; N uni1F8C ; G 1796 -U 8077 ; WX 763 ; N uni1F8D ; G 1797 -U 8078 ; WX 722 ; N uni1F8E ; G 1798 -U 8079 ; WX 722 ; N uni1F8F ; G 1799 -U 8080 ; WX 599 ; N uni1F90 ; G 1800 -U 8081 ; WX 599 ; N uni1F91 ; G 1801 -U 8082 ; WX 599 ; N uni1F92 ; G 1802 -U 8083 ; WX 599 ; N uni1F93 ; G 1803 -U 8084 ; WX 599 ; N uni1F94 ; G 1804 -U 8085 ; WX 599 ; N uni1F95 ; G 1805 -U 8086 ; WX 599 ; N uni1F96 ; G 1806 -U 8087 ; WX 599 ; N uni1F97 ; G 1807 -U 8088 ; WX 998 ; N uni1F98 ; G 1808 -U 8089 ; WX 992 ; N uni1F99 ; G 1809 -U 8090 ; WX 1212 ; N uni1F9A ; G 1810 -U 8091 ; WX 1224 ; N uni1F9B ; G 1811 -U 8092 ; WX 1159 ; N uni1F9C ; G 1812 -U 8093 ; WX 1183 ; N uni1F9D ; G 1813 -U 8094 ; WX 1098 ; N uni1F9E ; G 1814 -U 8095 ; WX 1095 ; N uni1F9F ; G 1815 -U 8096 ; WX 815 ; N uni1FA0 ; G 1816 -U 8097 ; WX 815 ; N uni1FA1 ; G 1817 -U 8098 ; WX 815 ; N uni1FA2 ; G 1818 -U 8099 ; WX 815 ; N uni1FA3 ; G 1819 -U 8100 ; WX 815 ; N uni1FA4 ; G 1820 -U 8101 ; WX 815 ; N uni1FA5 ; G 1821 -U 8102 ; WX 815 ; N uni1FA6 ; G 1822 -U 8103 ; WX 815 ; N uni1FA7 ; G 1823 -U 8104 ; WX 829 ; N uni1FA8 ; G 1824 -U 8105 ; WX 870 ; N uni1FA9 ; G 1825 -U 8106 ; WX 1131 ; N uni1FAA ; G 1826 -U 8107 ; WX 1137 ; N uni1FAB ; G 1827 -U 8108 ; WX 946 ; N uni1FAC ; G 1828 -U 8109 ; WX 976 ; N uni1FAD ; G 1829 -U 8110 ; WX 938 ; N uni1FAE ; G 1830 -U 8111 ; WX 970 ; N uni1FAF ; G 1831 -U 8112 ; WX 675 ; N uni1FB0 ; G 1832 -U 8113 ; WX 675 ; N uni1FB1 ; G 1833 -U 8114 ; WX 675 ; N uni1FB2 ; G 1834 -U 8115 ; WX 675 ; N uni1FB3 ; G 1835 -U 8116 ; WX 675 ; N uni1FB4 ; G 1836 -U 8118 ; WX 675 ; N uni1FB6 ; G 1837 -U 8119 ; WX 675 ; N uni1FB7 ; G 1838 -U 8120 ; WX 722 ; N uni1FB8 ; G 1839 -U 8121 ; WX 722 ; N uni1FB9 ; G 1840 -U 8122 ; WX 722 ; N uni1FBA ; G 1841 -U 8123 ; WX 722 ; N uni1FBB ; G 1842 -U 8124 ; WX 722 ; N uni1FBC ; G 1843 -U 8125 ; WX 500 ; N uni1FBD ; G 1844 -U 8126 ; WX 500 ; N uni1FBE ; G 1845 -U 8127 ; WX 500 ; N uni1FBF ; G 1846 -U 8128 ; WX 500 ; N uni1FC0 ; G 1847 -U 8129 ; WX 500 ; N uni1FC1 ; G 1848 -U 8130 ; WX 599 ; N uni1FC2 ; G 1849 -U 8131 ; WX 599 ; N uni1FC3 ; G 1850 -U 8132 ; WX 599 ; N uni1FC4 ; G 1851 -U 8134 ; WX 599 ; N uni1FC6 ; G 1852 -U 8135 ; WX 599 ; N uni1FC7 ; G 1853 -U 8136 ; WX 912 ; N uni1FC8 ; G 1854 -U 8137 ; WX 900 ; N uni1FC9 ; G 1855 -U 8138 ; WX 1063 ; N uni1FCA ; G 1856 -U 8139 ; WX 1039 ; N uni1FCB ; G 1857 -U 8140 ; WX 872 ; N uni1FCC ; G 1858 -U 8141 ; WX 500 ; N uni1FCD ; G 1859 -U 8142 ; WX 500 ; N uni1FCE ; G 1860 -U 8143 ; WX 500 ; N uni1FCF ; G 1861 -U 8144 ; WX 392 ; N uni1FD0 ; G 1862 -U 8145 ; WX 392 ; N uni1FD1 ; G 1863 -U 8146 ; WX 392 ; N uni1FD2 ; G 1864 -U 8147 ; WX 392 ; N uni1FD3 ; G 1865 -U 8150 ; WX 392 ; N uni1FD6 ; G 1866 -U 8151 ; WX 392 ; N uni1FD7 ; G 1867 -U 8152 ; WX 395 ; N uni1FD8 ; G 1868 -U 8153 ; WX 395 ; N uni1FD9 ; G 1869 -U 8154 ; WX 588 ; N uni1FDA ; G 1870 -U 8155 ; WX 562 ; N uni1FDB ; G 1871 -U 8157 ; WX 500 ; N uni1FDD ; G 1872 -U 8158 ; WX 500 ; N uni1FDE ; G 1873 -U 8159 ; WX 500 ; N uni1FDF ; G 1874 -U 8160 ; WX 608 ; N uni1FE0 ; G 1875 -U 8161 ; WX 608 ; N uni1FE1 ; G 1876 -U 8162 ; WX 608 ; N uni1FE2 ; G 1877 -U 8163 ; WX 608 ; N uni1FE3 ; G 1878 -U 8164 ; WX 588 ; N uni1FE4 ; G 1879 -U 8165 ; WX 588 ; N uni1FE5 ; G 1880 -U 8166 ; WX 608 ; N uni1FE6 ; G 1881 -U 8167 ; WX 608 ; N uni1FE7 ; G 1882 -U 8168 ; WX 660 ; N uni1FE8 ; G 1883 -U 8169 ; WX 660 ; N uni1FE9 ; G 1884 -U 8170 ; WX 921 ; N uni1FEA ; G 1885 -U 8171 ; WX 897 ; N uni1FEB ; G 1886 -U 8172 ; WX 790 ; N uni1FEC ; G 1887 -U 8173 ; WX 500 ; N uni1FED ; G 1888 -U 8174 ; WX 500 ; N uni1FEE ; G 1889 -U 8175 ; WX 500 ; N uni1FEF ; G 1890 -U 8178 ; WX 815 ; N uni1FF2 ; G 1891 -U 8179 ; WX 815 ; N uni1FF3 ; G 1892 -U 8180 ; WX 815 ; N uni1FF4 ; G 1893 -U 8182 ; WX 815 ; N uni1FF6 ; G 1894 -U 8183 ; WX 815 ; N uni1FF7 ; G 1895 -U 8184 ; WX 961 ; N uni1FF8 ; G 1896 -U 8185 ; WX 835 ; N uni1FF9 ; G 1897 -U 8186 ; WX 984 ; N uni1FFA ; G 1898 -U 8187 ; WX 853 ; N uni1FFB ; G 1899 -U 8188 ; WX 829 ; N uni1FFC ; G 1900 -U 8189 ; WX 500 ; N uni1FFD ; G 1901 -U 8190 ; WX 500 ; N uni1FFE ; G 1902 -U 8192 ; WX 500 ; N uni2000 ; G 1903 -U 8193 ; WX 1000 ; N uni2001 ; G 1904 -U 8194 ; WX 500 ; N uni2002 ; G 1905 -U 8195 ; WX 1000 ; N uni2003 ; G 1906 -U 8196 ; WX 330 ; N uni2004 ; G 1907 -U 8197 ; WX 250 ; N uni2005 ; G 1908 -U 8198 ; WX 167 ; N uni2006 ; G 1909 -U 8199 ; WX 636 ; N uni2007 ; G 1910 -U 8200 ; WX 318 ; N uni2008 ; G 1911 -U 8201 ; WX 200 ; N uni2009 ; G 1912 -U 8202 ; WX 100 ; N uni200A ; G 1913 -U 8203 ; WX 0 ; N uni200B ; G 1914 -U 8204 ; WX 0 ; N uni200C ; G 1915 -U 8205 ; WX 0 ; N uni200D ; G 1916 -U 8206 ; WX 0 ; N uni200E ; G 1917 -U 8207 ; WX 0 ; N uni200F ; G 1918 -U 8208 ; WX 338 ; N uni2010 ; G 1919 -U 8209 ; WX 338 ; N uni2011 ; G 1920 -U 8210 ; WX 636 ; N figuredash ; G 1921 -U 8211 ; WX 500 ; N endash ; G 1922 -U 8212 ; WX 1000 ; N emdash ; G 1923 -U 8213 ; WX 1000 ; N uni2015 ; G 1924 -U 8214 ; WX 500 ; N uni2016 ; G 1925 -U 8215 ; WX 500 ; N underscoredbl ; G 1926 -U 8216 ; WX 318 ; N quoteleft ; G 1927 -U 8217 ; WX 318 ; N quoteright ; G 1928 -U 8218 ; WX 318 ; N quotesinglbase ; G 1929 -U 8219 ; WX 318 ; N quotereversed ; G 1930 -U 8220 ; WX 511 ; N quotedblleft ; G 1931 -U 8221 ; WX 511 ; N quotedblright ; G 1932 -U 8222 ; WX 518 ; N quotedblbase ; G 1933 -U 8223 ; WX 511 ; N uni201F ; G 1934 -U 8224 ; WX 500 ; N dagger ; G 1935 -U 8225 ; WX 500 ; N daggerdbl ; G 1936 -U 8226 ; WX 590 ; N bullet ; G 1937 -U 8227 ; WX 590 ; N uni2023 ; G 1938 -U 8228 ; WX 334 ; N onedotenleader ; G 1939 -U 8229 ; WX 667 ; N twodotenleader ; G 1940 -U 8230 ; WX 1000 ; N ellipsis ; G 1941 -U 8234 ; WX 0 ; N uni202A ; G 1942 -U 8235 ; WX 0 ; N uni202B ; G 1943 -U 8236 ; WX 0 ; N uni202C ; G 1944 -U 8237 ; WX 0 ; N uni202D ; G 1945 -U 8238 ; WX 0 ; N uni202E ; G 1946 -U 8239 ; WX 200 ; N uni202F ; G 1947 -U 8240 ; WX 1342 ; N perthousand ; G 1948 -U 8241 ; WX 1734 ; N uni2031 ; G 1949 -U 8242 ; WX 227 ; N minute ; G 1950 -U 8243 ; WX 374 ; N second ; G 1951 -U 8244 ; WX 520 ; N uni2034 ; G 1952 -U 8245 ; WX 227 ; N uni2035 ; G 1953 -U 8246 ; WX 374 ; N uni2036 ; G 1954 -U 8247 ; WX 520 ; N uni2037 ; G 1955 -U 8248 ; WX 339 ; N uni2038 ; G 1956 -U 8249 ; WX 400 ; N guilsinglleft ; G 1957 -U 8250 ; WX 400 ; N guilsinglright ; G 1958 -U 8252 ; WX 527 ; N exclamdbl ; G 1959 -U 8253 ; WX 536 ; N uni203D ; G 1960 -U 8254 ; WX 500 ; N uni203E ; G 1961 -U 8258 ; WX 1000 ; N uni2042 ; G 1962 -U 8260 ; WX 167 ; N fraction ; G 1963 -U 8261 ; WX 390 ; N uni2045 ; G 1964 -U 8262 ; WX 390 ; N uni2046 ; G 1965 -U 8263 ; WX 976 ; N uni2047 ; G 1966 -U 8264 ; WX 753 ; N uni2048 ; G 1967 -U 8265 ; WX 753 ; N uni2049 ; G 1968 -U 8267 ; WX 636 ; N uni204B ; G 1969 -U 8268 ; WX 500 ; N uni204C ; G 1970 -U 8269 ; WX 500 ; N uni204D ; G 1971 -U 8270 ; WX 500 ; N uni204E ; G 1972 -U 8271 ; WX 337 ; N uni204F ; G 1973 -U 8273 ; WX 500 ; N uni2051 ; G 1974 -U 8274 ; WX 450 ; N uni2052 ; G 1975 -U 8275 ; WX 1000 ; N uni2053 ; G 1976 -U 8279 ; WX 663 ; N uni2057 ; G 1977 -U 8287 ; WX 222 ; N uni205F ; G 1978 -U 8288 ; WX 0 ; N uni2060 ; G 1979 -U 8289 ; WX 0 ; N uni2061 ; G 1980 -U 8290 ; WX 0 ; N uni2062 ; G 1981 -U 8291 ; WX 0 ; N uni2063 ; G 1982 -U 8292 ; WX 0 ; N uni2064 ; G 1983 -U 8298 ; WX 0 ; N uni206A ; G 1984 -U 8299 ; WX 0 ; N uni206B ; G 1985 -U 8300 ; WX 0 ; N uni206C ; G 1986 -U 8301 ; WX 0 ; N uni206D ; G 1987 -U 8302 ; WX 0 ; N uni206E ; G 1988 -U 8303 ; WX 0 ; N uni206F ; G 1989 -U 8304 ; WX 401 ; N uni2070 ; G 1990 -U 8305 ; WX 201 ; N uni2071 ; G 1991 -U 8308 ; WX 401 ; N uni2074 ; G 1992 -U 8309 ; WX 401 ; N uni2075 ; G 1993 -U 8310 ; WX 401 ; N uni2076 ; G 1994 -U 8311 ; WX 401 ; N uni2077 ; G 1995 -U 8312 ; WX 401 ; N uni2078 ; G 1996 -U 8313 ; WX 401 ; N uni2079 ; G 1997 -U 8314 ; WX 528 ; N uni207A ; G 1998 -U 8315 ; WX 528 ; N uni207B ; G 1999 -U 8316 ; WX 528 ; N uni207C ; G 2000 -U 8317 ; WX 246 ; N uni207D ; G 2001 -U 8318 ; WX 246 ; N uni207E ; G 2002 -U 8319 ; WX 405 ; N uni207F ; G 2003 -U 8320 ; WX 401 ; N uni2080 ; G 2004 -U 8321 ; WX 401 ; N uni2081 ; G 2005 -U 8322 ; WX 401 ; N uni2082 ; G 2006 -U 8323 ; WX 401 ; N uni2083 ; G 2007 -U 8324 ; WX 401 ; N uni2084 ; G 2008 -U 8325 ; WX 401 ; N uni2085 ; G 2009 -U 8326 ; WX 401 ; N uni2086 ; G 2010 -U 8327 ; WX 401 ; N uni2087 ; G 2011 -U 8328 ; WX 401 ; N uni2088 ; G 2012 -U 8329 ; WX 401 ; N uni2089 ; G 2013 -U 8330 ; WX 528 ; N uni208A ; G 2014 -U 8331 ; WX 528 ; N uni208B ; G 2015 -U 8332 ; WX 528 ; N uni208C ; G 2016 -U 8333 ; WX 246 ; N uni208D ; G 2017 -U 8334 ; WX 246 ; N uni208E ; G 2018 -U 8336 ; WX 375 ; N uni2090 ; G 2019 -U 8337 ; WX 387 ; N uni2091 ; G 2020 -U 8338 ; WX 385 ; N uni2092 ; G 2021 -U 8339 ; WX 355 ; N uni2093 ; G 2022 -U 8340 ; WX 387 ; N uni2094 ; G 2023 -U 8341 ; WX 433 ; N uni2095 ; G 2024 -U 8342 ; WX 365 ; N uni2096 ; G 2025 -U 8343 ; WX 243 ; N uni2097 ; G 2026 -U 8344 ; WX 613 ; N uni2098 ; G 2027 -U 8345 ; WX 405 ; N uni2099 ; G 2028 -U 8346 ; WX 400 ; N uni209A ; G 2029 -U 8347 ; WX 337 ; N uni209B ; G 2030 -U 8348 ; WX 247 ; N uni209C ; G 2031 -U 8358 ; WX 636 ; N uni20A6 ; G 2032 -U 8364 ; WX 636 ; N Euro ; G 2033 -U 8367 ; WX 1057 ; N uni20AF ; G 2034 -U 8369 ; WX 706 ; N uni20B1 ; G 2035 -U 8372 ; WX 780 ; N uni20B4 ; G 2036 -U 8373 ; WX 636 ; N uni20B5 ; G 2037 -U 8376 ; WX 636 ; N uni20B8 ; G 2038 -U 8377 ; WX 636 ; N uni20B9 ; G 2039 -U 8378 ; WX 636 ; N uni20BA ; G 2040 -U 8381 ; WX 636 ; N uni20BD ; G 2041 -U 8451 ; WX 1119 ; N uni2103 ; G 2042 -U 8457 ; WX 1047 ; N uni2109 ; G 2043 -U 8462 ; WX 644 ; N uni210E ; G 2044 -U 8463 ; WX 644 ; N uni210F ; G 2045 -U 8470 ; WX 946 ; N uni2116 ; G 2046 -U 8482 ; WX 1000 ; N trademark ; G 2047 -U 8486 ; WX 829 ; N uni2126 ; G 2048 -U 8487 ; WX 829 ; N uni2127 ; G 2049 -U 8490 ; WX 747 ; N uni212A ; G 2050 -U 8491 ; WX 722 ; N uni212B ; G 2051 -U 8498 ; WX 694 ; N uni2132 ; G 2052 -U 8513 ; WX 775 ; N uni2141 ; G 2053 -U 8514 ; WX 557 ; N uni2142 ; G 2054 -U 8515 ; WX 557 ; N uni2143 ; G 2055 -U 8516 ; WX 611 ; N uni2144 ; G 2056 -U 8523 ; WX 890 ; N uni214B ; G 2057 -U 8526 ; WX 514 ; N uni214E ; G 2058 -U 8528 ; WX 969 ; N uni2150 ; G 2059 -U 8529 ; WX 969 ; N uni2151 ; G 2060 -U 8530 ; WX 1370 ; N uni2152 ; G 2061 -U 8531 ; WX 969 ; N onethird ; G 2062 -U 8532 ; WX 969 ; N twothirds ; G 2063 -U 8533 ; WX 969 ; N uni2155 ; G 2064 -U 8534 ; WX 969 ; N uni2156 ; G 2065 -U 8535 ; WX 969 ; N uni2157 ; G 2066 -U 8536 ; WX 969 ; N uni2158 ; G 2067 -U 8537 ; WX 969 ; N uni2159 ; G 2068 -U 8538 ; WX 969 ; N uni215A ; G 2069 -U 8539 ; WX 969 ; N oneeighth ; G 2070 -U 8540 ; WX 969 ; N threeeighths ; G 2071 -U 8541 ; WX 969 ; N fiveeighths ; G 2072 -U 8542 ; WX 969 ; N seveneighths ; G 2073 -U 8543 ; WX 568 ; N uni215F ; G 2074 -U 8544 ; WX 395 ; N uni2160 ; G 2075 -U 8545 ; WX 680 ; N uni2161 ; G 2076 -U 8546 ; WX 964 ; N uni2162 ; G 2077 -U 8547 ; WX 999 ; N uni2163 ; G 2078 -U 8548 ; WX 722 ; N uni2164 ; G 2079 -U 8549 ; WX 1006 ; N uni2165 ; G 2080 -U 8550 ; WX 1291 ; N uni2166 ; G 2081 -U 8551 ; WX 1575 ; N uni2167 ; G 2082 -U 8552 ; WX 965 ; N uni2168 ; G 2083 -U 8553 ; WX 712 ; N uni2169 ; G 2084 -U 8554 ; WX 969 ; N uni216A ; G 2085 -U 8555 ; WX 1253 ; N uni216B ; G 2086 -U 8556 ; WX 664 ; N uni216C ; G 2087 -U 8557 ; WX 765 ; N uni216D ; G 2088 -U 8558 ; WX 802 ; N uni216E ; G 2089 -U 8559 ; WX 1024 ; N uni216F ; G 2090 -U 8560 ; WX 320 ; N uni2170 ; G 2091 -U 8561 ; WX 640 ; N uni2171 ; G 2092 -U 8562 ; WX 959 ; N uni2172 ; G 2093 -U 8563 ; WX 885 ; N uni2173 ; G 2094 -U 8564 ; WX 565 ; N uni2174 ; G 2095 -U 8565 ; WX 885 ; N uni2175 ; G 2096 -U 8566 ; WX 1205 ; N uni2176 ; G 2097 -U 8567 ; WX 1524 ; N uni2177 ; G 2098 -U 8568 ; WX 884 ; N uni2178 ; G 2099 -U 8569 ; WX 564 ; N uni2179 ; G 2100 -U 8570 ; WX 884 ; N uni217A ; G 2101 -U 8571 ; WX 1204 ; N uni217B ; G 2102 -U 8572 ; WX 320 ; N uni217C ; G 2103 -U 8573 ; WX 560 ; N uni217D ; G 2104 -U 8574 ; WX 640 ; N uni217E ; G 2105 -U 8575 ; WX 948 ; N uni217F ; G 2106 -U 8576 ; WX 1206 ; N uni2180 ; G 2107 -U 8577 ; WX 802 ; N uni2181 ; G 2108 -U 8578 ; WX 1206 ; N uni2182 ; G 2109 -U 8579 ; WX 765 ; N uni2183 ; G 2110 -U 8580 ; WX 560 ; N uni2184 ; G 2111 -U 8581 ; WX 765 ; N uni2185 ; G 2112 -U 8585 ; WX 969 ; N uni2189 ; G 2113 -U 8592 ; WX 838 ; N arrowleft ; G 2114 -U 8593 ; WX 838 ; N arrowup ; G 2115 -U 8594 ; WX 838 ; N arrowright ; G 2116 -U 8595 ; WX 838 ; N arrowdown ; G 2117 -U 8596 ; WX 838 ; N arrowboth ; G 2118 -U 8597 ; WX 838 ; N arrowupdn ; G 2119 -U 8598 ; WX 838 ; N uni2196 ; G 2120 -U 8599 ; WX 838 ; N uni2197 ; G 2121 -U 8600 ; WX 838 ; N uni2198 ; G 2122 -U 8601 ; WX 838 ; N uni2199 ; G 2123 -U 8602 ; WX 838 ; N uni219A ; G 2124 -U 8603 ; WX 838 ; N uni219B ; G 2125 -U 8604 ; WX 838 ; N uni219C ; G 2126 -U 8605 ; WX 838 ; N uni219D ; G 2127 -U 8606 ; WX 838 ; N uni219E ; G 2128 -U 8607 ; WX 838 ; N uni219F ; G 2129 -U 8608 ; WX 838 ; N uni21A0 ; G 2130 -U 8609 ; WX 838 ; N uni21A1 ; G 2131 -U 8610 ; WX 838 ; N uni21A2 ; G 2132 -U 8611 ; WX 838 ; N uni21A3 ; G 2133 -U 8612 ; WX 838 ; N uni21A4 ; G 2134 -U 8613 ; WX 838 ; N uni21A5 ; G 2135 -U 8614 ; WX 838 ; N uni21A6 ; G 2136 -U 8615 ; WX 838 ; N uni21A7 ; G 2137 -U 8616 ; WX 838 ; N arrowupdnbse ; G 2138 -U 8617 ; WX 838 ; N uni21A9 ; G 2139 -U 8618 ; WX 838 ; N uni21AA ; G 2140 -U 8619 ; WX 838 ; N uni21AB ; G 2141 -U 8620 ; WX 838 ; N uni21AC ; G 2142 -U 8621 ; WX 838 ; N uni21AD ; G 2143 -U 8622 ; WX 838 ; N uni21AE ; G 2144 -U 8623 ; WX 838 ; N uni21AF ; G 2145 -U 8624 ; WX 838 ; N uni21B0 ; G 2146 -U 8625 ; WX 838 ; N uni21B1 ; G 2147 -U 8626 ; WX 838 ; N uni21B2 ; G 2148 -U 8627 ; WX 838 ; N uni21B3 ; G 2149 -U 8628 ; WX 838 ; N uni21B4 ; G 2150 -U 8629 ; WX 838 ; N carriagereturn ; G 2151 -U 8630 ; WX 838 ; N uni21B6 ; G 2152 -U 8631 ; WX 838 ; N uni21B7 ; G 2153 -U 8632 ; WX 838 ; N uni21B8 ; G 2154 -U 8633 ; WX 838 ; N uni21B9 ; G 2155 -U 8634 ; WX 838 ; N uni21BA ; G 2156 -U 8635 ; WX 838 ; N uni21BB ; G 2157 -U 8636 ; WX 838 ; N uni21BC ; G 2158 -U 8637 ; WX 838 ; N uni21BD ; G 2159 -U 8638 ; WX 838 ; N uni21BE ; G 2160 -U 8639 ; WX 838 ; N uni21BF ; G 2161 -U 8640 ; WX 838 ; N uni21C0 ; G 2162 -U 8641 ; WX 838 ; N uni21C1 ; G 2163 -U 8642 ; WX 838 ; N uni21C2 ; G 2164 -U 8643 ; WX 838 ; N uni21C3 ; G 2165 -U 8644 ; WX 838 ; N uni21C4 ; G 2166 -U 8645 ; WX 838 ; N uni21C5 ; G 2167 -U 8646 ; WX 838 ; N uni21C6 ; G 2168 -U 8647 ; WX 838 ; N uni21C7 ; G 2169 -U 8648 ; WX 838 ; N uni21C8 ; G 2170 -U 8649 ; WX 838 ; N uni21C9 ; G 2171 -U 8650 ; WX 838 ; N uni21CA ; G 2172 -U 8651 ; WX 838 ; N uni21CB ; G 2173 -U 8652 ; WX 838 ; N uni21CC ; G 2174 -U 8653 ; WX 838 ; N uni21CD ; G 2175 -U 8654 ; WX 838 ; N uni21CE ; G 2176 -U 8655 ; WX 838 ; N uni21CF ; G 2177 -U 8656 ; WX 838 ; N arrowdblleft ; G 2178 -U 8657 ; WX 838 ; N arrowdblup ; G 2179 -U 8658 ; WX 838 ; N arrowdblright ; G 2180 -U 8659 ; WX 838 ; N arrowdbldown ; G 2181 -U 8660 ; WX 838 ; N arrowdblboth ; G 2182 -U 8661 ; WX 838 ; N uni21D5 ; G 2183 -U 8662 ; WX 838 ; N uni21D6 ; G 2184 -U 8663 ; WX 838 ; N uni21D7 ; G 2185 -U 8664 ; WX 838 ; N uni21D8 ; G 2186 -U 8665 ; WX 838 ; N uni21D9 ; G 2187 -U 8666 ; WX 838 ; N uni21DA ; G 2188 -U 8667 ; WX 838 ; N uni21DB ; G 2189 -U 8668 ; WX 838 ; N uni21DC ; G 2190 -U 8669 ; WX 838 ; N uni21DD ; G 2191 -U 8670 ; WX 838 ; N uni21DE ; G 2192 -U 8671 ; WX 838 ; N uni21DF ; G 2193 -U 8672 ; WX 838 ; N uni21E0 ; G 2194 -U 8673 ; WX 838 ; N uni21E1 ; G 2195 -U 8674 ; WX 838 ; N uni21E2 ; G 2196 -U 8675 ; WX 838 ; N uni21E3 ; G 2197 -U 8676 ; WX 838 ; N uni21E4 ; G 2198 -U 8677 ; WX 838 ; N uni21E5 ; G 2199 -U 8678 ; WX 838 ; N uni21E6 ; G 2200 -U 8679 ; WX 838 ; N uni21E7 ; G 2201 -U 8680 ; WX 838 ; N uni21E8 ; G 2202 -U 8681 ; WX 838 ; N uni21E9 ; G 2203 -U 8682 ; WX 838 ; N uni21EA ; G 2204 -U 8683 ; WX 838 ; N uni21EB ; G 2205 -U 8684 ; WX 838 ; N uni21EC ; G 2206 -U 8685 ; WX 838 ; N uni21ED ; G 2207 -U 8686 ; WX 838 ; N uni21EE ; G 2208 -U 8687 ; WX 838 ; N uni21EF ; G 2209 -U 8688 ; WX 838 ; N uni21F0 ; G 2210 -U 8689 ; WX 838 ; N uni21F1 ; G 2211 -U 8690 ; WX 838 ; N uni21F2 ; G 2212 -U 8691 ; WX 838 ; N uni21F3 ; G 2213 -U 8692 ; WX 838 ; N uni21F4 ; G 2214 -U 8693 ; WX 838 ; N uni21F5 ; G 2215 -U 8694 ; WX 838 ; N uni21F6 ; G 2216 -U 8695 ; WX 838 ; N uni21F7 ; G 2217 -U 8696 ; WX 838 ; N uni21F8 ; G 2218 -U 8697 ; WX 838 ; N uni21F9 ; G 2219 -U 8698 ; WX 838 ; N uni21FA ; G 2220 -U 8699 ; WX 838 ; N uni21FB ; G 2221 -U 8700 ; WX 838 ; N uni21FC ; G 2222 -U 8701 ; WX 838 ; N uni21FD ; G 2223 -U 8702 ; WX 838 ; N uni21FE ; G 2224 -U 8703 ; WX 838 ; N uni21FF ; G 2225 -U 8704 ; WX 604 ; N universal ; G 2226 -U 8706 ; WX 517 ; N partialdiff ; G 2227 -U 8707 ; WX 542 ; N existential ; G 2228 -U 8708 ; WX 542 ; N uni2204 ; G 2229 -U 8710 ; WX 698 ; N increment ; G 2230 -U 8711 ; WX 698 ; N gradient ; G 2231 -U 8712 ; WX 740 ; N element ; G 2232 -U 8713 ; WX 740 ; N notelement ; G 2233 -U 8715 ; WX 740 ; N suchthat ; G 2234 -U 8716 ; WX 740 ; N uni220C ; G 2235 -U 8719 ; WX 796 ; N product ; G 2236 -U 8720 ; WX 796 ; N uni2210 ; G 2237 -U 8721 ; WX 714 ; N summation ; G 2238 -U 8722 ; WX 838 ; N minus ; G 2239 -U 8723 ; WX 838 ; N uni2213 ; G 2240 -U 8724 ; WX 838 ; N uni2214 ; G 2241 -U 8725 ; WX 337 ; N uni2215 ; G 2242 -U 8727 ; WX 680 ; N asteriskmath ; G 2243 -U 8728 ; WX 490 ; N uni2218 ; G 2244 -U 8729 ; WX 490 ; N uni2219 ; G 2245 -U 8730 ; WX 637 ; N radical ; G 2246 -U 8731 ; WX 637 ; N uni221B ; G 2247 -U 8732 ; WX 637 ; N uni221C ; G 2248 -U 8733 ; WX 677 ; N proportional ; G 2249 -U 8734 ; WX 833 ; N infinity ; G 2250 -U 8735 ; WX 838 ; N orthogonal ; G 2251 -U 8736 ; WX 838 ; N angle ; G 2252 -U 8739 ; WX 291 ; N uni2223 ; G 2253 -U 8740 ; WX 479 ; N uni2224 ; G 2254 -U 8741 ; WX 462 ; N uni2225 ; G 2255 -U 8742 ; WX 634 ; N uni2226 ; G 2256 -U 8743 ; WX 732 ; N logicaland ; G 2257 -U 8744 ; WX 732 ; N logicalor ; G 2258 -U 8745 ; WX 838 ; N intersection ; G 2259 -U 8746 ; WX 838 ; N union ; G 2260 -U 8747 ; WX 521 ; N integral ; G 2261 -U 8748 ; WX 852 ; N uni222C ; G 2262 -U 8749 ; WX 1182 ; N uni222D ; G 2263 -U 8760 ; WX 838 ; N uni2238 ; G 2264 -U 8761 ; WX 838 ; N uni2239 ; G 2265 -U 8762 ; WX 838 ; N uni223A ; G 2266 -U 8763 ; WX 838 ; N uni223B ; G 2267 -U 8764 ; WX 838 ; N similar ; G 2268 -U 8765 ; WX 838 ; N uni223D ; G 2269 -U 8770 ; WX 838 ; N uni2242 ; G 2270 -U 8771 ; WX 838 ; N uni2243 ; G 2271 -U 8776 ; WX 838 ; N approxequal ; G 2272 -U 8784 ; WX 838 ; N uni2250 ; G 2273 -U 8785 ; WX 838 ; N uni2251 ; G 2274 -U 8786 ; WX 838 ; N uni2252 ; G 2275 -U 8787 ; WX 838 ; N uni2253 ; G 2276 -U 8788 ; WX 1033 ; N uni2254 ; G 2277 -U 8789 ; WX 1033 ; N uni2255 ; G 2278 -U 8800 ; WX 838 ; N notequal ; G 2279 -U 8801 ; WX 838 ; N equivalence ; G 2280 -U 8804 ; WX 838 ; N lessequal ; G 2281 -U 8805 ; WX 838 ; N greaterequal ; G 2282 -U 8834 ; WX 838 ; N propersubset ; G 2283 -U 8835 ; WX 838 ; N propersuperset ; G 2284 -U 8836 ; WX 838 ; N notsubset ; G 2285 -U 8837 ; WX 838 ; N uni2285 ; G 2286 -U 8838 ; WX 838 ; N reflexsubset ; G 2287 -U 8839 ; WX 838 ; N reflexsuperset ; G 2288 -U 8844 ; WX 838 ; N uni228C ; G 2289 -U 8845 ; WX 838 ; N uni228D ; G 2290 -U 8846 ; WX 838 ; N uni228E ; G 2291 -U 8847 ; WX 846 ; N uni228F ; G 2292 -U 8848 ; WX 846 ; N uni2290 ; G 2293 -U 8849 ; WX 846 ; N uni2291 ; G 2294 -U 8850 ; WX 846 ; N uni2292 ; G 2295 -U 8851 ; WX 838 ; N uni2293 ; G 2296 -U 8852 ; WX 838 ; N uni2294 ; G 2297 -U 8853 ; WX 838 ; N circleplus ; G 2298 -U 8854 ; WX 838 ; N uni2296 ; G 2299 -U 8855 ; WX 838 ; N circlemultiply ; G 2300 -U 8856 ; WX 838 ; N uni2298 ; G 2301 -U 8857 ; WX 838 ; N uni2299 ; G 2302 -U 8858 ; WX 838 ; N uni229A ; G 2303 -U 8859 ; WX 838 ; N uni229B ; G 2304 -U 8860 ; WX 838 ; N uni229C ; G 2305 -U 8861 ; WX 838 ; N uni229D ; G 2306 -U 8862 ; WX 838 ; N uni229E ; G 2307 -U 8863 ; WX 838 ; N uni229F ; G 2308 -U 8864 ; WX 838 ; N uni22A0 ; G 2309 -U 8865 ; WX 838 ; N uni22A1 ; G 2310 -U 8866 ; WX 860 ; N uni22A2 ; G 2311 -U 8867 ; WX 860 ; N uni22A3 ; G 2312 -U 8868 ; WX 940 ; N uni22A4 ; G 2313 -U 8869 ; WX 940 ; N perpendicular ; G 2314 -U 8870 ; WX 567 ; N uni22A6 ; G 2315 -U 8871 ; WX 567 ; N uni22A7 ; G 2316 -U 8872 ; WX 860 ; N uni22A8 ; G 2317 -U 8873 ; WX 860 ; N uni22A9 ; G 2318 -U 8874 ; WX 860 ; N uni22AA ; G 2319 -U 8875 ; WX 1031 ; N uni22AB ; G 2320 -U 8876 ; WX 860 ; N uni22AC ; G 2321 -U 8877 ; WX 860 ; N uni22AD ; G 2322 -U 8878 ; WX 860 ; N uni22AE ; G 2323 -U 8879 ; WX 1031 ; N uni22AF ; G 2324 -U 8900 ; WX 626 ; N uni22C4 ; G 2325 -U 8901 ; WX 342 ; N dotmath ; G 2326 -U 8962 ; WX 764 ; N house ; G 2327 -U 8968 ; WX 390 ; N uni2308 ; G 2328 -U 8969 ; WX 390 ; N uni2309 ; G 2329 -U 8970 ; WX 390 ; N uni230A ; G 2330 -U 8971 ; WX 390 ; N uni230B ; G 2331 -U 8976 ; WX 838 ; N revlogicalnot ; G 2332 -U 8977 ; WX 513 ; N uni2311 ; G 2333 -U 8984 ; WX 1000 ; N uni2318 ; G 2334 -U 8985 ; WX 838 ; N uni2319 ; G 2335 -U 8992 ; WX 521 ; N integraltp ; G 2336 -U 8993 ; WX 521 ; N integralbt ; G 2337 -U 8997 ; WX 1000 ; N uni2325 ; G 2338 -U 9000 ; WX 1443 ; N uni2328 ; G 2339 -U 9085 ; WX 919 ; N uni237D ; G 2340 -U 9115 ; WX 500 ; N uni239B ; G 2341 -U 9116 ; WX 500 ; N uni239C ; G 2342 -U 9117 ; WX 500 ; N uni239D ; G 2343 -U 9118 ; WX 500 ; N uni239E ; G 2344 -U 9119 ; WX 500 ; N uni239F ; G 2345 -U 9120 ; WX 500 ; N uni23A0 ; G 2346 -U 9121 ; WX 500 ; N uni23A1 ; G 2347 -U 9122 ; WX 500 ; N uni23A2 ; G 2348 -U 9123 ; WX 500 ; N uni23A3 ; G 2349 -U 9124 ; WX 500 ; N uni23A4 ; G 2350 -U 9125 ; WX 500 ; N uni23A5 ; G 2351 -U 9126 ; WX 500 ; N uni23A6 ; G 2352 -U 9127 ; WX 750 ; N uni23A7 ; G 2353 -U 9128 ; WX 750 ; N uni23A8 ; G 2354 -U 9129 ; WX 750 ; N uni23A9 ; G 2355 -U 9130 ; WX 750 ; N uni23AA ; G 2356 -U 9131 ; WX 750 ; N uni23AB ; G 2357 -U 9132 ; WX 750 ; N uni23AC ; G 2358 -U 9133 ; WX 750 ; N uni23AD ; G 2359 -U 9134 ; WX 521 ; N uni23AE ; G 2360 -U 9167 ; WX 945 ; N uni23CF ; G 2361 -U 9251 ; WX 764 ; N uni2423 ; G 2362 -U 9472 ; WX 602 ; N SF100000 ; G 2363 -U 9473 ; WX 602 ; N uni2501 ; G 2364 -U 9474 ; WX 602 ; N SF110000 ; G 2365 -U 9475 ; WX 602 ; N uni2503 ; G 2366 -U 9476 ; WX 602 ; N uni2504 ; G 2367 -U 9477 ; WX 602 ; N uni2505 ; G 2368 -U 9478 ; WX 602 ; N uni2506 ; G 2369 -U 9479 ; WX 602 ; N uni2507 ; G 2370 -U 9480 ; WX 602 ; N uni2508 ; G 2371 -U 9481 ; WX 602 ; N uni2509 ; G 2372 -U 9482 ; WX 602 ; N uni250A ; G 2373 -U 9483 ; WX 602 ; N uni250B ; G 2374 -U 9484 ; WX 602 ; N SF010000 ; G 2375 -U 9485 ; WX 602 ; N uni250D ; G 2376 -U 9486 ; WX 602 ; N uni250E ; G 2377 -U 9487 ; WX 602 ; N uni250F ; G 2378 -U 9488 ; WX 602 ; N SF030000 ; G 2379 -U 9489 ; WX 602 ; N uni2511 ; G 2380 -U 9490 ; WX 602 ; N uni2512 ; G 2381 -U 9491 ; WX 602 ; N uni2513 ; G 2382 -U 9492 ; WX 602 ; N SF020000 ; G 2383 -U 9493 ; WX 602 ; N uni2515 ; G 2384 -U 9494 ; WX 602 ; N uni2516 ; G 2385 -U 9495 ; WX 602 ; N uni2517 ; G 2386 -U 9496 ; WX 602 ; N SF040000 ; G 2387 -U 9497 ; WX 602 ; N uni2519 ; G 2388 -U 9498 ; WX 602 ; N uni251A ; G 2389 -U 9499 ; WX 602 ; N uni251B ; G 2390 -U 9500 ; WX 602 ; N SF080000 ; G 2391 -U 9501 ; WX 602 ; N uni251D ; G 2392 -U 9502 ; WX 602 ; N uni251E ; G 2393 -U 9503 ; WX 602 ; N uni251F ; G 2394 -U 9504 ; WX 602 ; N uni2520 ; G 2395 -U 9505 ; WX 602 ; N uni2521 ; G 2396 -U 9506 ; WX 602 ; N uni2522 ; G 2397 -U 9507 ; WX 602 ; N uni2523 ; G 2398 -U 9508 ; WX 602 ; N SF090000 ; G 2399 -U 9509 ; WX 602 ; N uni2525 ; G 2400 -U 9510 ; WX 602 ; N uni2526 ; G 2401 -U 9511 ; WX 602 ; N uni2527 ; G 2402 -U 9512 ; WX 602 ; N uni2528 ; G 2403 -U 9513 ; WX 602 ; N uni2529 ; G 2404 -U 9514 ; WX 602 ; N uni252A ; G 2405 -U 9515 ; WX 602 ; N uni252B ; G 2406 -U 9516 ; WX 602 ; N SF060000 ; G 2407 -U 9517 ; WX 602 ; N uni252D ; G 2408 -U 9518 ; WX 602 ; N uni252E ; G 2409 -U 9519 ; WX 602 ; N uni252F ; G 2410 -U 9520 ; WX 602 ; N uni2530 ; G 2411 -U 9521 ; WX 602 ; N uni2531 ; G 2412 -U 9522 ; WX 602 ; N uni2532 ; G 2413 -U 9523 ; WX 602 ; N uni2533 ; G 2414 -U 9524 ; WX 602 ; N SF070000 ; G 2415 -U 9525 ; WX 602 ; N uni2535 ; G 2416 -U 9526 ; WX 602 ; N uni2536 ; G 2417 -U 9527 ; WX 602 ; N uni2537 ; G 2418 -U 9528 ; WX 602 ; N uni2538 ; G 2419 -U 9529 ; WX 602 ; N uni2539 ; G 2420 -U 9530 ; WX 602 ; N uni253A ; G 2421 -U 9531 ; WX 602 ; N uni253B ; G 2422 -U 9532 ; WX 602 ; N SF050000 ; G 2423 -U 9533 ; WX 602 ; N uni253D ; G 2424 -U 9534 ; WX 602 ; N uni253E ; G 2425 -U 9535 ; WX 602 ; N uni253F ; G 2426 -U 9536 ; WX 602 ; N uni2540 ; G 2427 -U 9537 ; WX 602 ; N uni2541 ; G 2428 -U 9538 ; WX 602 ; N uni2542 ; G 2429 -U 9539 ; WX 602 ; N uni2543 ; G 2430 -U 9540 ; WX 602 ; N uni2544 ; G 2431 -U 9541 ; WX 602 ; N uni2545 ; G 2432 -U 9542 ; WX 602 ; N uni2546 ; G 2433 -U 9543 ; WX 602 ; N uni2547 ; G 2434 -U 9544 ; WX 602 ; N uni2548 ; G 2435 -U 9545 ; WX 602 ; N uni2549 ; G 2436 -U 9546 ; WX 602 ; N uni254A ; G 2437 -U 9547 ; WX 602 ; N uni254B ; G 2438 -U 9548 ; WX 602 ; N uni254C ; G 2439 -U 9549 ; WX 602 ; N uni254D ; G 2440 -U 9550 ; WX 602 ; N uni254E ; G 2441 -U 9551 ; WX 602 ; N uni254F ; G 2442 -U 9552 ; WX 602 ; N SF430000 ; G 2443 -U 9553 ; WX 602 ; N SF240000 ; G 2444 -U 9554 ; WX 602 ; N SF510000 ; G 2445 -U 9555 ; WX 602 ; N SF520000 ; G 2446 -U 9556 ; WX 602 ; N SF390000 ; G 2447 -U 9557 ; WX 602 ; N SF220000 ; G 2448 -U 9558 ; WX 602 ; N SF210000 ; G 2449 -U 9559 ; WX 602 ; N SF250000 ; G 2450 -U 9560 ; WX 602 ; N SF500000 ; G 2451 -U 9561 ; WX 602 ; N SF490000 ; G 2452 -U 9562 ; WX 602 ; N SF380000 ; G 2453 -U 9563 ; WX 602 ; N SF280000 ; G 2454 -U 9564 ; WX 602 ; N SF270000 ; G 2455 -U 9565 ; WX 602 ; N SF260000 ; G 2456 -U 9566 ; WX 602 ; N SF360000 ; G 2457 -U 9567 ; WX 602 ; N SF370000 ; G 2458 -U 9568 ; WX 602 ; N SF420000 ; G 2459 -U 9569 ; WX 602 ; N SF190000 ; G 2460 -U 9570 ; WX 602 ; N SF200000 ; G 2461 -U 9571 ; WX 602 ; N SF230000 ; G 2462 -U 9572 ; WX 602 ; N SF470000 ; G 2463 -U 9573 ; WX 602 ; N SF480000 ; G 2464 -U 9574 ; WX 602 ; N SF410000 ; G 2465 -U 9575 ; WX 602 ; N SF450000 ; G 2466 -U 9576 ; WX 602 ; N SF460000 ; G 2467 -U 9577 ; WX 602 ; N SF400000 ; G 2468 -U 9578 ; WX 602 ; N SF540000 ; G 2469 -U 9579 ; WX 602 ; N SF530000 ; G 2470 -U 9580 ; WX 602 ; N SF440000 ; G 2471 -U 9581 ; WX 602 ; N uni256D ; G 2472 -U 9582 ; WX 602 ; N uni256E ; G 2473 -U 9583 ; WX 602 ; N uni256F ; G 2474 -U 9584 ; WX 602 ; N uni2570 ; G 2475 -U 9585 ; WX 602 ; N uni2571 ; G 2476 -U 9586 ; WX 602 ; N uni2572 ; G 2477 -U 9587 ; WX 602 ; N uni2573 ; G 2478 -U 9588 ; WX 602 ; N uni2574 ; G 2479 -U 9589 ; WX 602 ; N uni2575 ; G 2480 -U 9590 ; WX 602 ; N uni2576 ; G 2481 -U 9591 ; WX 602 ; N uni2577 ; G 2482 -U 9592 ; WX 602 ; N uni2578 ; G 2483 -U 9593 ; WX 602 ; N uni2579 ; G 2484 -U 9594 ; WX 602 ; N uni257A ; G 2485 -U 9595 ; WX 602 ; N uni257B ; G 2486 -U 9596 ; WX 602 ; N uni257C ; G 2487 -U 9597 ; WX 602 ; N uni257D ; G 2488 -U 9598 ; WX 602 ; N uni257E ; G 2489 -U 9599 ; WX 602 ; N uni257F ; G 2490 -U 9600 ; WX 769 ; N upblock ; G 2491 -U 9601 ; WX 769 ; N uni2581 ; G 2492 -U 9602 ; WX 769 ; N uni2582 ; G 2493 -U 9603 ; WX 769 ; N uni2583 ; G 2494 -U 9604 ; WX 769 ; N dnblock ; G 2495 -U 9605 ; WX 769 ; N uni2585 ; G 2496 -U 9606 ; WX 769 ; N uni2586 ; G 2497 -U 9607 ; WX 769 ; N uni2587 ; G 2498 -U 9608 ; WX 769 ; N block ; G 2499 -U 9609 ; WX 769 ; N uni2589 ; G 2500 -U 9610 ; WX 769 ; N uni258A ; G 2501 -U 9611 ; WX 769 ; N uni258B ; G 2502 -U 9612 ; WX 769 ; N lfblock ; G 2503 -U 9613 ; WX 769 ; N uni258D ; G 2504 -U 9614 ; WX 769 ; N uni258E ; G 2505 -U 9615 ; WX 769 ; N uni258F ; G 2506 -U 9616 ; WX 769 ; N rtblock ; G 2507 -U 9617 ; WX 769 ; N ltshade ; G 2508 -U 9618 ; WX 769 ; N shade ; G 2509 -U 9619 ; WX 769 ; N dkshade ; G 2510 -U 9620 ; WX 769 ; N uni2594 ; G 2511 -U 9621 ; WX 769 ; N uni2595 ; G 2512 -U 9622 ; WX 769 ; N uni2596 ; G 2513 -U 9623 ; WX 769 ; N uni2597 ; G 2514 -U 9624 ; WX 769 ; N uni2598 ; G 2515 -U 9625 ; WX 769 ; N uni2599 ; G 2516 -U 9626 ; WX 769 ; N uni259A ; G 2517 -U 9627 ; WX 769 ; N uni259B ; G 2518 -U 9628 ; WX 769 ; N uni259C ; G 2519 -U 9629 ; WX 769 ; N uni259D ; G 2520 -U 9630 ; WX 769 ; N uni259E ; G 2521 -U 9631 ; WX 769 ; N uni259F ; G 2522 -U 9632 ; WX 945 ; N filledbox ; G 2523 -U 9633 ; WX 945 ; N H22073 ; G 2524 -U 9634 ; WX 945 ; N uni25A2 ; G 2525 -U 9635 ; WX 945 ; N uni25A3 ; G 2526 -U 9636 ; WX 945 ; N uni25A4 ; G 2527 -U 9637 ; WX 945 ; N uni25A5 ; G 2528 -U 9638 ; WX 945 ; N uni25A6 ; G 2529 -U 9639 ; WX 945 ; N uni25A7 ; G 2530 -U 9640 ; WX 945 ; N uni25A8 ; G 2531 -U 9641 ; WX 945 ; N uni25A9 ; G 2532 -U 9642 ; WX 678 ; N H18543 ; G 2533 -U 9643 ; WX 678 ; N H18551 ; G 2534 -U 9644 ; WX 945 ; N filledrect ; G 2535 -U 9645 ; WX 945 ; N uni25AD ; G 2536 -U 9646 ; WX 550 ; N uni25AE ; G 2537 -U 9647 ; WX 550 ; N uni25AF ; G 2538 -U 9648 ; WX 769 ; N uni25B0 ; G 2539 -U 9649 ; WX 769 ; N uni25B1 ; G 2540 -U 9650 ; WX 769 ; N triagup ; G 2541 -U 9651 ; WX 769 ; N uni25B3 ; G 2542 -U 9652 ; WX 502 ; N uni25B4 ; G 2543 -U 9653 ; WX 502 ; N uni25B5 ; G 2544 -U 9654 ; WX 769 ; N uni25B6 ; G 2545 -U 9655 ; WX 769 ; N uni25B7 ; G 2546 -U 9656 ; WX 502 ; N uni25B8 ; G 2547 -U 9657 ; WX 502 ; N uni25B9 ; G 2548 -U 9658 ; WX 769 ; N triagrt ; G 2549 -U 9659 ; WX 769 ; N uni25BB ; G 2550 -U 9660 ; WX 769 ; N triagdn ; G 2551 -U 9661 ; WX 769 ; N uni25BD ; G 2552 -U 9662 ; WX 502 ; N uni25BE ; G 2553 -U 9663 ; WX 502 ; N uni25BF ; G 2554 -U 9664 ; WX 769 ; N uni25C0 ; G 2555 -U 9665 ; WX 769 ; N uni25C1 ; G 2556 -U 9666 ; WX 502 ; N uni25C2 ; G 2557 -U 9667 ; WX 502 ; N uni25C3 ; G 2558 -U 9668 ; WX 769 ; N triaglf ; G 2559 -U 9669 ; WX 769 ; N uni25C5 ; G 2560 -U 9670 ; WX 769 ; N uni25C6 ; G 2561 -U 9671 ; WX 769 ; N uni25C7 ; G 2562 -U 9672 ; WX 769 ; N uni25C8 ; G 2563 -U 9673 ; WX 873 ; N uni25C9 ; G 2564 -U 9674 ; WX 494 ; N lozenge ; G 2565 -U 9675 ; WX 873 ; N circle ; G 2566 -U 9676 ; WX 873 ; N uni25CC ; G 2567 -U 9677 ; WX 873 ; N uni25CD ; G 2568 -U 9678 ; WX 873 ; N uni25CE ; G 2569 -U 9679 ; WX 873 ; N H18533 ; G 2570 -U 9680 ; WX 873 ; N uni25D0 ; G 2571 -U 9681 ; WX 873 ; N uni25D1 ; G 2572 -U 9682 ; WX 873 ; N uni25D2 ; G 2573 -U 9683 ; WX 873 ; N uni25D3 ; G 2574 -U 9684 ; WX 873 ; N uni25D4 ; G 2575 -U 9685 ; WX 873 ; N uni25D5 ; G 2576 -U 9686 ; WX 527 ; N uni25D6 ; G 2577 -U 9687 ; WX 527 ; N uni25D7 ; G 2578 -U 9688 ; WX 791 ; N invbullet ; G 2579 -U 9689 ; WX 970 ; N invcircle ; G 2580 -U 9690 ; WX 970 ; N uni25DA ; G 2581 -U 9691 ; WX 970 ; N uni25DB ; G 2582 -U 9692 ; WX 387 ; N uni25DC ; G 2583 -U 9693 ; WX 387 ; N uni25DD ; G 2584 -U 9694 ; WX 387 ; N uni25DE ; G 2585 -U 9695 ; WX 387 ; N uni25DF ; G 2586 -U 9696 ; WX 873 ; N uni25E0 ; G 2587 -U 9697 ; WX 873 ; N uni25E1 ; G 2588 -U 9698 ; WX 769 ; N uni25E2 ; G 2589 -U 9699 ; WX 769 ; N uni25E3 ; G 2590 -U 9700 ; WX 769 ; N uni25E4 ; G 2591 -U 9701 ; WX 769 ; N uni25E5 ; G 2592 -U 9702 ; WX 590 ; N openbullet ; G 2593 -U 9703 ; WX 945 ; N uni25E7 ; G 2594 -U 9704 ; WX 945 ; N uni25E8 ; G 2595 -U 9705 ; WX 945 ; N uni25E9 ; G 2596 -U 9706 ; WX 945 ; N uni25EA ; G 2597 -U 9707 ; WX 945 ; N uni25EB ; G 2598 -U 9708 ; WX 769 ; N uni25EC ; G 2599 -U 9709 ; WX 769 ; N uni25ED ; G 2600 -U 9710 ; WX 769 ; N uni25EE ; G 2601 -U 9711 ; WX 1119 ; N uni25EF ; G 2602 -U 9712 ; WX 945 ; N uni25F0 ; G 2603 -U 9713 ; WX 945 ; N uni25F1 ; G 2604 -U 9714 ; WX 945 ; N uni25F2 ; G 2605 -U 9715 ; WX 945 ; N uni25F3 ; G 2606 -U 9716 ; WX 873 ; N uni25F4 ; G 2607 -U 9717 ; WX 873 ; N uni25F5 ; G 2608 -U 9718 ; WX 873 ; N uni25F6 ; G 2609 -U 9719 ; WX 873 ; N uni25F7 ; G 2610 -U 9720 ; WX 769 ; N uni25F8 ; G 2611 -U 9721 ; WX 769 ; N uni25F9 ; G 2612 -U 9722 ; WX 769 ; N uni25FA ; G 2613 -U 9723 ; WX 830 ; N uni25FB ; G 2614 -U 9724 ; WX 830 ; N uni25FC ; G 2615 -U 9725 ; WX 732 ; N uni25FD ; G 2616 -U 9726 ; WX 732 ; N uni25FE ; G 2617 -U 9727 ; WX 769 ; N uni25FF ; G 2618 -U 9728 ; WX 896 ; N uni2600 ; G 2619 -U 9784 ; WX 896 ; N uni2638 ; G 2620 -U 9785 ; WX 896 ; N uni2639 ; G 2621 -U 9786 ; WX 896 ; N smileface ; G 2622 -U 9787 ; WX 896 ; N invsmileface ; G 2623 -U 9788 ; WX 896 ; N sun ; G 2624 -U 9791 ; WX 614 ; N uni263F ; G 2625 -U 9792 ; WX 731 ; N female ; G 2626 -U 9793 ; WX 731 ; N uni2641 ; G 2627 -U 9794 ; WX 896 ; N male ; G 2628 -U 9795 ; WX 896 ; N uni2643 ; G 2629 -U 9796 ; WX 896 ; N uni2644 ; G 2630 -U 9797 ; WX 896 ; N uni2645 ; G 2631 -U 9798 ; WX 896 ; N uni2646 ; G 2632 -U 9799 ; WX 896 ; N uni2647 ; G 2633 -U 9824 ; WX 896 ; N spade ; G 2634 -U 9825 ; WX 896 ; N uni2661 ; G 2635 -U 9826 ; WX 896 ; N uni2662 ; G 2636 -U 9827 ; WX 896 ; N club ; G 2637 -U 9828 ; WX 896 ; N uni2664 ; G 2638 -U 9829 ; WX 896 ; N heart ; G 2639 -U 9830 ; WX 896 ; N diamond ; G 2640 -U 9831 ; WX 896 ; N uni2667 ; G 2641 -U 9833 ; WX 472 ; N uni2669 ; G 2642 -U 9834 ; WX 638 ; N musicalnote ; G 2643 -U 9835 ; WX 896 ; N musicalnotedbl ; G 2644 -U 9836 ; WX 896 ; N uni266C ; G 2645 -U 9837 ; WX 472 ; N uni266D ; G 2646 -U 9838 ; WX 357 ; N uni266E ; G 2647 -U 9839 ; WX 484 ; N uni266F ; G 2648 -U 10145 ; WX 838 ; N uni27A1 ; G 2649 -U 10181 ; WX 390 ; N uni27C5 ; G 2650 -U 10182 ; WX 390 ; N uni27C6 ; G 2651 -U 10208 ; WX 494 ; N uni27E0 ; G 2652 -U 10216 ; WX 390 ; N uni27E8 ; G 2653 -U 10217 ; WX 390 ; N uni27E9 ; G 2654 -U 10224 ; WX 838 ; N uni27F0 ; G 2655 -U 10225 ; WX 838 ; N uni27F1 ; G 2656 -U 10226 ; WX 838 ; N uni27F2 ; G 2657 -U 10227 ; WX 838 ; N uni27F3 ; G 2658 -U 10228 ; WX 1033 ; N uni27F4 ; G 2659 -U 10229 ; WX 1434 ; N uni27F5 ; G 2660 -U 10230 ; WX 1434 ; N uni27F6 ; G 2661 -U 10231 ; WX 1434 ; N uni27F7 ; G 2662 -U 10232 ; WX 1434 ; N uni27F8 ; G 2663 -U 10233 ; WX 1434 ; N uni27F9 ; G 2664 -U 10234 ; WX 1434 ; N uni27FA ; G 2665 -U 10235 ; WX 1434 ; N uni27FB ; G 2666 -U 10236 ; WX 1434 ; N uni27FC ; G 2667 -U 10237 ; WX 1434 ; N uni27FD ; G 2668 -U 10238 ; WX 1434 ; N uni27FE ; G 2669 -U 10239 ; WX 1434 ; N uni27FF ; G 2670 -U 10240 ; WX 732 ; N uni2800 ; G 2671 -U 10241 ; WX 732 ; N uni2801 ; G 2672 -U 10242 ; WX 732 ; N uni2802 ; G 2673 -U 10243 ; WX 732 ; N uni2803 ; G 2674 -U 10244 ; WX 732 ; N uni2804 ; G 2675 -U 10245 ; WX 732 ; N uni2805 ; G 2676 -U 10246 ; WX 732 ; N uni2806 ; G 2677 -U 10247 ; WX 732 ; N uni2807 ; G 2678 -U 10248 ; WX 732 ; N uni2808 ; G 2679 -U 10249 ; WX 732 ; N uni2809 ; G 2680 -U 10250 ; WX 732 ; N uni280A ; G 2681 -U 10251 ; WX 732 ; N uni280B ; G 2682 -U 10252 ; WX 732 ; N uni280C ; G 2683 -U 10253 ; WX 732 ; N uni280D ; G 2684 -U 10254 ; WX 732 ; N uni280E ; G 2685 -U 10255 ; WX 732 ; N uni280F ; G 2686 -U 10256 ; WX 732 ; N uni2810 ; G 2687 -U 10257 ; WX 732 ; N uni2811 ; G 2688 -U 10258 ; WX 732 ; N uni2812 ; G 2689 -U 10259 ; WX 732 ; N uni2813 ; G 2690 -U 10260 ; WX 732 ; N uni2814 ; G 2691 -U 10261 ; WX 732 ; N uni2815 ; G 2692 -U 10262 ; WX 732 ; N uni2816 ; G 2693 -U 10263 ; WX 732 ; N uni2817 ; G 2694 -U 10264 ; WX 732 ; N uni2818 ; G 2695 -U 10265 ; WX 732 ; N uni2819 ; G 2696 -U 10266 ; WX 732 ; N uni281A ; G 2697 -U 10267 ; WX 732 ; N uni281B ; G 2698 -U 10268 ; WX 732 ; N uni281C ; G 2699 -U 10269 ; WX 732 ; N uni281D ; G 2700 -U 10270 ; WX 732 ; N uni281E ; G 2701 -U 10271 ; WX 732 ; N uni281F ; G 2702 -U 10272 ; WX 732 ; N uni2820 ; G 2703 -U 10273 ; WX 732 ; N uni2821 ; G 2704 -U 10274 ; WX 732 ; N uni2822 ; G 2705 -U 10275 ; WX 732 ; N uni2823 ; G 2706 -U 10276 ; WX 732 ; N uni2824 ; G 2707 -U 10277 ; WX 732 ; N uni2825 ; G 2708 -U 10278 ; WX 732 ; N uni2826 ; G 2709 -U 10279 ; WX 732 ; N uni2827 ; G 2710 -U 10280 ; WX 732 ; N uni2828 ; G 2711 -U 10281 ; WX 732 ; N uni2829 ; G 2712 -U 10282 ; WX 732 ; N uni282A ; G 2713 -U 10283 ; WX 732 ; N uni282B ; G 2714 -U 10284 ; WX 732 ; N uni282C ; G 2715 -U 10285 ; WX 732 ; N uni282D ; G 2716 -U 10286 ; WX 732 ; N uni282E ; G 2717 -U 10287 ; WX 732 ; N uni282F ; G 2718 -U 10288 ; WX 732 ; N uni2830 ; G 2719 -U 10289 ; WX 732 ; N uni2831 ; G 2720 -U 10290 ; WX 732 ; N uni2832 ; G 2721 -U 10291 ; WX 732 ; N uni2833 ; G 2722 -U 10292 ; WX 732 ; N uni2834 ; G 2723 -U 10293 ; WX 732 ; N uni2835 ; G 2724 -U 10294 ; WX 732 ; N uni2836 ; G 2725 -U 10295 ; WX 732 ; N uni2837 ; G 2726 -U 10296 ; WX 732 ; N uni2838 ; G 2727 -U 10297 ; WX 732 ; N uni2839 ; G 2728 -U 10298 ; WX 732 ; N uni283A ; G 2729 -U 10299 ; WX 732 ; N uni283B ; G 2730 -U 10300 ; WX 732 ; N uni283C ; G 2731 -U 10301 ; WX 732 ; N uni283D ; G 2732 -U 10302 ; WX 732 ; N uni283E ; G 2733 -U 10303 ; WX 732 ; N uni283F ; G 2734 -U 10304 ; WX 732 ; N uni2840 ; G 2735 -U 10305 ; WX 732 ; N uni2841 ; G 2736 -U 10306 ; WX 732 ; N uni2842 ; G 2737 -U 10307 ; WX 732 ; N uni2843 ; G 2738 -U 10308 ; WX 732 ; N uni2844 ; G 2739 -U 10309 ; WX 732 ; N uni2845 ; G 2740 -U 10310 ; WX 732 ; N uni2846 ; G 2741 -U 10311 ; WX 732 ; N uni2847 ; G 2742 -U 10312 ; WX 732 ; N uni2848 ; G 2743 -U 10313 ; WX 732 ; N uni2849 ; G 2744 -U 10314 ; WX 732 ; N uni284A ; G 2745 -U 10315 ; WX 732 ; N uni284B ; G 2746 -U 10316 ; WX 732 ; N uni284C ; G 2747 -U 10317 ; WX 732 ; N uni284D ; G 2748 -U 10318 ; WX 732 ; N uni284E ; G 2749 -U 10319 ; WX 732 ; N uni284F ; G 2750 -U 10320 ; WX 732 ; N uni2850 ; G 2751 -U 10321 ; WX 732 ; N uni2851 ; G 2752 -U 10322 ; WX 732 ; N uni2852 ; G 2753 -U 10323 ; WX 732 ; N uni2853 ; G 2754 -U 10324 ; WX 732 ; N uni2854 ; G 2755 -U 10325 ; WX 732 ; N uni2855 ; G 2756 -U 10326 ; WX 732 ; N uni2856 ; G 2757 -U 10327 ; WX 732 ; N uni2857 ; G 2758 -U 10328 ; WX 732 ; N uni2858 ; G 2759 -U 10329 ; WX 732 ; N uni2859 ; G 2760 -U 10330 ; WX 732 ; N uni285A ; G 2761 -U 10331 ; WX 732 ; N uni285B ; G 2762 -U 10332 ; WX 732 ; N uni285C ; G 2763 -U 10333 ; WX 732 ; N uni285D ; G 2764 -U 10334 ; WX 732 ; N uni285E ; G 2765 -U 10335 ; WX 732 ; N uni285F ; G 2766 -U 10336 ; WX 732 ; N uni2860 ; G 2767 -U 10337 ; WX 732 ; N uni2861 ; G 2768 -U 10338 ; WX 732 ; N uni2862 ; G 2769 -U 10339 ; WX 732 ; N uni2863 ; G 2770 -U 10340 ; WX 732 ; N uni2864 ; G 2771 -U 10341 ; WX 732 ; N uni2865 ; G 2772 -U 10342 ; WX 732 ; N uni2866 ; G 2773 -U 10343 ; WX 732 ; N uni2867 ; G 2774 -U 10344 ; WX 732 ; N uni2868 ; G 2775 -U 10345 ; WX 732 ; N uni2869 ; G 2776 -U 10346 ; WX 732 ; N uni286A ; G 2777 -U 10347 ; WX 732 ; N uni286B ; G 2778 -U 10348 ; WX 732 ; N uni286C ; G 2779 -U 10349 ; WX 732 ; N uni286D ; G 2780 -U 10350 ; WX 732 ; N uni286E ; G 2781 -U 10351 ; WX 732 ; N uni286F ; G 2782 -U 10352 ; WX 732 ; N uni2870 ; G 2783 -U 10353 ; WX 732 ; N uni2871 ; G 2784 -U 10354 ; WX 732 ; N uni2872 ; G 2785 -U 10355 ; WX 732 ; N uni2873 ; G 2786 -U 10356 ; WX 732 ; N uni2874 ; G 2787 -U 10357 ; WX 732 ; N uni2875 ; G 2788 -U 10358 ; WX 732 ; N uni2876 ; G 2789 -U 10359 ; WX 732 ; N uni2877 ; G 2790 -U 10360 ; WX 732 ; N uni2878 ; G 2791 -U 10361 ; WX 732 ; N uni2879 ; G 2792 -U 10362 ; WX 732 ; N uni287A ; G 2793 -U 10363 ; WX 732 ; N uni287B ; G 2794 -U 10364 ; WX 732 ; N uni287C ; G 2795 -U 10365 ; WX 732 ; N uni287D ; G 2796 -U 10366 ; WX 732 ; N uni287E ; G 2797 -U 10367 ; WX 732 ; N uni287F ; G 2798 -U 10368 ; WX 732 ; N uni2880 ; G 2799 -U 10369 ; WX 732 ; N uni2881 ; G 2800 -U 10370 ; WX 732 ; N uni2882 ; G 2801 -U 10371 ; WX 732 ; N uni2883 ; G 2802 -U 10372 ; WX 732 ; N uni2884 ; G 2803 -U 10373 ; WX 732 ; N uni2885 ; G 2804 -U 10374 ; WX 732 ; N uni2886 ; G 2805 -U 10375 ; WX 732 ; N uni2887 ; G 2806 -U 10376 ; WX 732 ; N uni2888 ; G 2807 -U 10377 ; WX 732 ; N uni2889 ; G 2808 -U 10378 ; WX 732 ; N uni288A ; G 2809 -U 10379 ; WX 732 ; N uni288B ; G 2810 -U 10380 ; WX 732 ; N uni288C ; G 2811 -U 10381 ; WX 732 ; N uni288D ; G 2812 -U 10382 ; WX 732 ; N uni288E ; G 2813 -U 10383 ; WX 732 ; N uni288F ; G 2814 -U 10384 ; WX 732 ; N uni2890 ; G 2815 -U 10385 ; WX 732 ; N uni2891 ; G 2816 -U 10386 ; WX 732 ; N uni2892 ; G 2817 -U 10387 ; WX 732 ; N uni2893 ; G 2818 -U 10388 ; WX 732 ; N uni2894 ; G 2819 -U 10389 ; WX 732 ; N uni2895 ; G 2820 -U 10390 ; WX 732 ; N uni2896 ; G 2821 -U 10391 ; WX 732 ; N uni2897 ; G 2822 -U 10392 ; WX 732 ; N uni2898 ; G 2823 -U 10393 ; WX 732 ; N uni2899 ; G 2824 -U 10394 ; WX 732 ; N uni289A ; G 2825 -U 10395 ; WX 732 ; N uni289B ; G 2826 -U 10396 ; WX 732 ; N uni289C ; G 2827 -U 10397 ; WX 732 ; N uni289D ; G 2828 -U 10398 ; WX 732 ; N uni289E ; G 2829 -U 10399 ; WX 732 ; N uni289F ; G 2830 -U 10400 ; WX 732 ; N uni28A0 ; G 2831 -U 10401 ; WX 732 ; N uni28A1 ; G 2832 -U 10402 ; WX 732 ; N uni28A2 ; G 2833 -U 10403 ; WX 732 ; N uni28A3 ; G 2834 -U 10404 ; WX 732 ; N uni28A4 ; G 2835 -U 10405 ; WX 732 ; N uni28A5 ; G 2836 -U 10406 ; WX 732 ; N uni28A6 ; G 2837 -U 10407 ; WX 732 ; N uni28A7 ; G 2838 -U 10408 ; WX 732 ; N uni28A8 ; G 2839 -U 10409 ; WX 732 ; N uni28A9 ; G 2840 -U 10410 ; WX 732 ; N uni28AA ; G 2841 -U 10411 ; WX 732 ; N uni28AB ; G 2842 -U 10412 ; WX 732 ; N uni28AC ; G 2843 -U 10413 ; WX 732 ; N uni28AD ; G 2844 -U 10414 ; WX 732 ; N uni28AE ; G 2845 -U 10415 ; WX 732 ; N uni28AF ; G 2846 -U 10416 ; WX 732 ; N uni28B0 ; G 2847 -U 10417 ; WX 732 ; N uni28B1 ; G 2848 -U 10418 ; WX 732 ; N uni28B2 ; G 2849 -U 10419 ; WX 732 ; N uni28B3 ; G 2850 -U 10420 ; WX 732 ; N uni28B4 ; G 2851 -U 10421 ; WX 732 ; N uni28B5 ; G 2852 -U 10422 ; WX 732 ; N uni28B6 ; G 2853 -U 10423 ; WX 732 ; N uni28B7 ; G 2854 -U 10424 ; WX 732 ; N uni28B8 ; G 2855 -U 10425 ; WX 732 ; N uni28B9 ; G 2856 -U 10426 ; WX 732 ; N uni28BA ; G 2857 -U 10427 ; WX 732 ; N uni28BB ; G 2858 -U 10428 ; WX 732 ; N uni28BC ; G 2859 -U 10429 ; WX 732 ; N uni28BD ; G 2860 -U 10430 ; WX 732 ; N uni28BE ; G 2861 -U 10431 ; WX 732 ; N uni28BF ; G 2862 -U 10432 ; WX 732 ; N uni28C0 ; G 2863 -U 10433 ; WX 732 ; N uni28C1 ; G 2864 -U 10434 ; WX 732 ; N uni28C2 ; G 2865 -U 10435 ; WX 732 ; N uni28C3 ; G 2866 -U 10436 ; WX 732 ; N uni28C4 ; G 2867 -U 10437 ; WX 732 ; N uni28C5 ; G 2868 -U 10438 ; WX 732 ; N uni28C6 ; G 2869 -U 10439 ; WX 732 ; N uni28C7 ; G 2870 -U 10440 ; WX 732 ; N uni28C8 ; G 2871 -U 10441 ; WX 732 ; N uni28C9 ; G 2872 -U 10442 ; WX 732 ; N uni28CA ; G 2873 -U 10443 ; WX 732 ; N uni28CB ; G 2874 -U 10444 ; WX 732 ; N uni28CC ; G 2875 -U 10445 ; WX 732 ; N uni28CD ; G 2876 -U 10446 ; WX 732 ; N uni28CE ; G 2877 -U 10447 ; WX 732 ; N uni28CF ; G 2878 -U 10448 ; WX 732 ; N uni28D0 ; G 2879 -U 10449 ; WX 732 ; N uni28D1 ; G 2880 -U 10450 ; WX 732 ; N uni28D2 ; G 2881 -U 10451 ; WX 732 ; N uni28D3 ; G 2882 -U 10452 ; WX 732 ; N uni28D4 ; G 2883 -U 10453 ; WX 732 ; N uni28D5 ; G 2884 -U 10454 ; WX 732 ; N uni28D6 ; G 2885 -U 10455 ; WX 732 ; N uni28D7 ; G 2886 -U 10456 ; WX 732 ; N uni28D8 ; G 2887 -U 10457 ; WX 732 ; N uni28D9 ; G 2888 -U 10458 ; WX 732 ; N uni28DA ; G 2889 -U 10459 ; WX 732 ; N uni28DB ; G 2890 -U 10460 ; WX 732 ; N uni28DC ; G 2891 -U 10461 ; WX 732 ; N uni28DD ; G 2892 -U 10462 ; WX 732 ; N uni28DE ; G 2893 -U 10463 ; WX 732 ; N uni28DF ; G 2894 -U 10464 ; WX 732 ; N uni28E0 ; G 2895 -U 10465 ; WX 732 ; N uni28E1 ; G 2896 -U 10466 ; WX 732 ; N uni28E2 ; G 2897 -U 10467 ; WX 732 ; N uni28E3 ; G 2898 -U 10468 ; WX 732 ; N uni28E4 ; G 2899 -U 10469 ; WX 732 ; N uni28E5 ; G 2900 -U 10470 ; WX 732 ; N uni28E6 ; G 2901 -U 10471 ; WX 732 ; N uni28E7 ; G 2902 -U 10472 ; WX 732 ; N uni28E8 ; G 2903 -U 10473 ; WX 732 ; N uni28E9 ; G 2904 -U 10474 ; WX 732 ; N uni28EA ; G 2905 -U 10475 ; WX 732 ; N uni28EB ; G 2906 -U 10476 ; WX 732 ; N uni28EC ; G 2907 -U 10477 ; WX 732 ; N uni28ED ; G 2908 -U 10478 ; WX 732 ; N uni28EE ; G 2909 -U 10479 ; WX 732 ; N uni28EF ; G 2910 -U 10480 ; WX 732 ; N uni28F0 ; G 2911 -U 10481 ; WX 732 ; N uni28F1 ; G 2912 -U 10482 ; WX 732 ; N uni28F2 ; G 2913 -U 10483 ; WX 732 ; N uni28F3 ; G 2914 -U 10484 ; WX 732 ; N uni28F4 ; G 2915 -U 10485 ; WX 732 ; N uni28F5 ; G 2916 -U 10486 ; WX 732 ; N uni28F6 ; G 2917 -U 10487 ; WX 732 ; N uni28F7 ; G 2918 -U 10488 ; WX 732 ; N uni28F8 ; G 2919 -U 10489 ; WX 732 ; N uni28F9 ; G 2920 -U 10490 ; WX 732 ; N uni28FA ; G 2921 -U 10491 ; WX 732 ; N uni28FB ; G 2922 -U 10492 ; WX 732 ; N uni28FC ; G 2923 -U 10493 ; WX 732 ; N uni28FD ; G 2924 -U 10494 ; WX 732 ; N uni28FE ; G 2925 -U 10495 ; WX 732 ; N uni28FF ; G 2926 -U 10496 ; WX 838 ; N uni2900 ; G 2927 -U 10497 ; WX 838 ; N uni2901 ; G 2928 -U 10498 ; WX 838 ; N uni2902 ; G 2929 -U 10499 ; WX 838 ; N uni2903 ; G 2930 -U 10500 ; WX 838 ; N uni2904 ; G 2931 -U 10501 ; WX 838 ; N uni2905 ; G 2932 -U 10502 ; WX 838 ; N uni2906 ; G 2933 -U 10503 ; WX 838 ; N uni2907 ; G 2934 -U 10504 ; WX 838 ; N uni2908 ; G 2935 -U 10505 ; WX 838 ; N uni2909 ; G 2936 -U 10506 ; WX 838 ; N uni290A ; G 2937 -U 10507 ; WX 838 ; N uni290B ; G 2938 -U 10508 ; WX 838 ; N uni290C ; G 2939 -U 10509 ; WX 838 ; N uni290D ; G 2940 -U 10510 ; WX 838 ; N uni290E ; G 2941 -U 10511 ; WX 838 ; N uni290F ; G 2942 -U 10512 ; WX 838 ; N uni2910 ; G 2943 -U 10513 ; WX 838 ; N uni2911 ; G 2944 -U 10514 ; WX 838 ; N uni2912 ; G 2945 -U 10515 ; WX 838 ; N uni2913 ; G 2946 -U 10516 ; WX 838 ; N uni2914 ; G 2947 -U 10517 ; WX 838 ; N uni2915 ; G 2948 -U 10518 ; WX 838 ; N uni2916 ; G 2949 -U 10519 ; WX 838 ; N uni2917 ; G 2950 -U 10520 ; WX 838 ; N uni2918 ; G 2951 -U 10521 ; WX 838 ; N uni2919 ; G 2952 -U 10522 ; WX 838 ; N uni291A ; G 2953 -U 10523 ; WX 838 ; N uni291B ; G 2954 -U 10524 ; WX 838 ; N uni291C ; G 2955 -U 10525 ; WX 838 ; N uni291D ; G 2956 -U 10526 ; WX 838 ; N uni291E ; G 2957 -U 10527 ; WX 838 ; N uni291F ; G 2958 -U 10528 ; WX 838 ; N uni2920 ; G 2959 -U 10529 ; WX 838 ; N uni2921 ; G 2960 -U 10530 ; WX 838 ; N uni2922 ; G 2961 -U 10531 ; WX 838 ; N uni2923 ; G 2962 -U 10532 ; WX 838 ; N uni2924 ; G 2963 -U 10533 ; WX 838 ; N uni2925 ; G 2964 -U 10534 ; WX 838 ; N uni2926 ; G 2965 -U 10535 ; WX 838 ; N uni2927 ; G 2966 -U 10536 ; WX 838 ; N uni2928 ; G 2967 -U 10537 ; WX 838 ; N uni2929 ; G 2968 -U 10538 ; WX 838 ; N uni292A ; G 2969 -U 10539 ; WX 838 ; N uni292B ; G 2970 -U 10540 ; WX 838 ; N uni292C ; G 2971 -U 10541 ; WX 838 ; N uni292D ; G 2972 -U 10542 ; WX 838 ; N uni292E ; G 2973 -U 10543 ; WX 838 ; N uni292F ; G 2974 -U 10544 ; WX 838 ; N uni2930 ; G 2975 -U 10545 ; WX 838 ; N uni2931 ; G 2976 -U 10546 ; WX 838 ; N uni2932 ; G 2977 -U 10547 ; WX 838 ; N uni2933 ; G 2978 -U 10548 ; WX 838 ; N uni2934 ; G 2979 -U 10549 ; WX 838 ; N uni2935 ; G 2980 -U 10550 ; WX 838 ; N uni2936 ; G 2981 -U 10551 ; WX 838 ; N uni2937 ; G 2982 -U 10552 ; WX 838 ; N uni2938 ; G 2983 -U 10553 ; WX 838 ; N uni2939 ; G 2984 -U 10554 ; WX 838 ; N uni293A ; G 2985 -U 10555 ; WX 838 ; N uni293B ; G 2986 -U 10556 ; WX 838 ; N uni293C ; G 2987 -U 10557 ; WX 838 ; N uni293D ; G 2988 -U 10558 ; WX 838 ; N uni293E ; G 2989 -U 10559 ; WX 838 ; N uni293F ; G 2990 -U 10560 ; WX 838 ; N uni2940 ; G 2991 -U 10561 ; WX 838 ; N uni2941 ; G 2992 -U 10562 ; WX 838 ; N uni2942 ; G 2993 -U 10563 ; WX 838 ; N uni2943 ; G 2994 -U 10564 ; WX 838 ; N uni2944 ; G 2995 -U 10565 ; WX 838 ; N uni2945 ; G 2996 -U 10566 ; WX 838 ; N uni2946 ; G 2997 -U 10567 ; WX 838 ; N uni2947 ; G 2998 -U 10568 ; WX 838 ; N uni2948 ; G 2999 -U 10569 ; WX 838 ; N uni2949 ; G 3000 -U 10570 ; WX 838 ; N uni294A ; G 3001 -U 10571 ; WX 838 ; N uni294B ; G 3002 -U 10572 ; WX 838 ; N uni294C ; G 3003 -U 10573 ; WX 838 ; N uni294D ; G 3004 -U 10574 ; WX 838 ; N uni294E ; G 3005 -U 10575 ; WX 838 ; N uni294F ; G 3006 -U 10576 ; WX 838 ; N uni2950 ; G 3007 -U 10577 ; WX 838 ; N uni2951 ; G 3008 -U 10578 ; WX 838 ; N uni2952 ; G 3009 -U 10579 ; WX 838 ; N uni2953 ; G 3010 -U 10580 ; WX 838 ; N uni2954 ; G 3011 -U 10581 ; WX 838 ; N uni2955 ; G 3012 -U 10582 ; WX 838 ; N uni2956 ; G 3013 -U 10583 ; WX 838 ; N uni2957 ; G 3014 -U 10584 ; WX 838 ; N uni2958 ; G 3015 -U 10585 ; WX 838 ; N uni2959 ; G 3016 -U 10586 ; WX 838 ; N uni295A ; G 3017 -U 10587 ; WX 838 ; N uni295B ; G 3018 -U 10588 ; WX 838 ; N uni295C ; G 3019 -U 10589 ; WX 838 ; N uni295D ; G 3020 -U 10590 ; WX 838 ; N uni295E ; G 3021 -U 10591 ; WX 838 ; N uni295F ; G 3022 -U 10592 ; WX 838 ; N uni2960 ; G 3023 -U 10593 ; WX 838 ; N uni2961 ; G 3024 -U 10594 ; WX 838 ; N uni2962 ; G 3025 -U 10595 ; WX 838 ; N uni2963 ; G 3026 -U 10596 ; WX 838 ; N uni2964 ; G 3027 -U 10597 ; WX 838 ; N uni2965 ; G 3028 -U 10598 ; WX 838 ; N uni2966 ; G 3029 -U 10599 ; WX 838 ; N uni2967 ; G 3030 -U 10600 ; WX 838 ; N uni2968 ; G 3031 -U 10601 ; WX 838 ; N uni2969 ; G 3032 -U 10602 ; WX 838 ; N uni296A ; G 3033 -U 10603 ; WX 838 ; N uni296B ; G 3034 -U 10604 ; WX 838 ; N uni296C ; G 3035 -U 10605 ; WX 838 ; N uni296D ; G 3036 -U 10606 ; WX 838 ; N uni296E ; G 3037 -U 10607 ; WX 838 ; N uni296F ; G 3038 -U 10608 ; WX 838 ; N uni2970 ; G 3039 -U 10609 ; WX 838 ; N uni2971 ; G 3040 -U 10610 ; WX 838 ; N uni2972 ; G 3041 -U 10611 ; WX 838 ; N uni2973 ; G 3042 -U 10612 ; WX 838 ; N uni2974 ; G 3043 -U 10613 ; WX 838 ; N uni2975 ; G 3044 -U 10614 ; WX 838 ; N uni2976 ; G 3045 -U 10615 ; WX 981 ; N uni2977 ; G 3046 -U 10616 ; WX 838 ; N uni2978 ; G 3047 -U 10617 ; WX 838 ; N uni2979 ; G 3048 -U 10618 ; WX 984 ; N uni297A ; G 3049 -U 10619 ; WX 838 ; N uni297B ; G 3050 -U 10620 ; WX 838 ; N uni297C ; G 3051 -U 10621 ; WX 838 ; N uni297D ; G 3052 -U 10622 ; WX 838 ; N uni297E ; G 3053 -U 10623 ; WX 838 ; N uni297F ; G 3054 -U 10731 ; WX 494 ; N uni29EB ; G 3055 -U 10764 ; WX 1513 ; N uni2A0C ; G 3056 -U 10765 ; WX 521 ; N uni2A0D ; G 3057 -U 10766 ; WX 521 ; N uni2A0E ; G 3058 -U 10799 ; WX 838 ; N uni2A2F ; G 3059 -U 10858 ; WX 838 ; N uni2A6A ; G 3060 -U 10859 ; WX 838 ; N uni2A6B ; G 3061 -U 11008 ; WX 838 ; N uni2B00 ; G 3062 -U 11009 ; WX 838 ; N uni2B01 ; G 3063 -U 11010 ; WX 838 ; N uni2B02 ; G 3064 -U 11011 ; WX 838 ; N uni2B03 ; G 3065 -U 11012 ; WX 838 ; N uni2B04 ; G 3066 -U 11013 ; WX 838 ; N uni2B05 ; G 3067 -U 11014 ; WX 838 ; N uni2B06 ; G 3068 -U 11015 ; WX 838 ; N uni2B07 ; G 3069 -U 11016 ; WX 838 ; N uni2B08 ; G 3070 -U 11017 ; WX 838 ; N uni2B09 ; G 3071 -U 11018 ; WX 838 ; N uni2B0A ; G 3072 -U 11019 ; WX 838 ; N uni2B0B ; G 3073 -U 11020 ; WX 838 ; N uni2B0C ; G 3074 -U 11021 ; WX 838 ; N uni2B0D ; G 3075 -U 11022 ; WX 838 ; N uni2B0E ; G 3076 -U 11023 ; WX 838 ; N uni2B0F ; G 3077 -U 11024 ; WX 838 ; N uni2B10 ; G 3078 -U 11025 ; WX 838 ; N uni2B11 ; G 3079 -U 11026 ; WX 945 ; N uni2B12 ; G 3080 -U 11027 ; WX 945 ; N uni2B13 ; G 3081 -U 11028 ; WX 945 ; N uni2B14 ; G 3082 -U 11029 ; WX 945 ; N uni2B15 ; G 3083 -U 11030 ; WX 769 ; N uni2B16 ; G 3084 -U 11031 ; WX 769 ; N uni2B17 ; G 3085 -U 11032 ; WX 769 ; N uni2B18 ; G 3086 -U 11033 ; WX 769 ; N uni2B19 ; G 3087 -U 11034 ; WX 945 ; N uni2B1A ; G 3088 -U 11360 ; WX 664 ; N uni2C60 ; G 3089 -U 11361 ; WX 320 ; N uni2C61 ; G 3090 -U 11363 ; WX 673 ; N uni2C63 ; G 3091 -U 11364 ; WX 753 ; N uni2C64 ; G 3092 -U 11367 ; WX 872 ; N uni2C67 ; G 3093 -U 11368 ; WX 644 ; N uni2C68 ; G 3094 -U 11369 ; WX 747 ; N uni2C69 ; G 3095 -U 11370 ; WX 606 ; N uni2C6A ; G 3096 -U 11371 ; WX 695 ; N uni2C6B ; G 3097 -U 11372 ; WX 527 ; N uni2C6C ; G 3098 -U 11373 ; WX 782 ; N uni2C6D ; G 3099 -U 11374 ; WX 1024 ; N uni2C6E ; G 3100 -U 11375 ; WX 722 ; N uni2C6F ; G 3101 -U 11376 ; WX 782 ; N uni2C70 ; G 3102 -U 11377 ; WX 663 ; N uni2C71 ; G 3103 -U 11378 ; WX 1130 ; N uni2C72 ; G 3104 -U 11379 ; WX 939 ; N uni2C73 ; G 3105 -U 11381 ; WX 740 ; N uni2C75 ; G 3106 -U 11382 ; WX 531 ; N uni2C76 ; G 3107 -U 11383 ; WX 700 ; N uni2C77 ; G 3108 -U 11385 ; WX 501 ; N uni2C79 ; G 3109 -U 11386 ; WX 602 ; N uni2C7A ; G 3110 -U 11387 ; WX 553 ; N uni2C7B ; G 3111 -U 11388 ; WX 264 ; N uni2C7C ; G 3112 -U 11389 ; WX 455 ; N uni2C7D ; G 3113 -U 11390 ; WX 685 ; N uni2C7E ; G 3114 -U 11391 ; WX 695 ; N uni2C7F ; G 3115 -U 11520 ; WX 773 ; N uni2D00 ; G 3116 -U 11521 ; WX 635 ; N uni2D01 ; G 3117 -U 11522 ; WX 633 ; N uni2D02 ; G 3118 -U 11523 ; WX 658 ; N uni2D03 ; G 3119 -U 11524 ; WX 631 ; N uni2D04 ; G 3120 -U 11525 ; WX 962 ; N uni2D05 ; G 3121 -U 11526 ; WX 756 ; N uni2D06 ; G 3122 -U 11527 ; WX 960 ; N uni2D07 ; G 3123 -U 11528 ; WX 617 ; N uni2D08 ; G 3124 -U 11529 ; WX 646 ; N uni2D09 ; G 3125 -U 11530 ; WX 962 ; N uni2D0A ; G 3126 -U 11531 ; WX 632 ; N uni2D0B ; G 3127 -U 11532 ; WX 646 ; N uni2D0C ; G 3128 -U 11533 ; WX 962 ; N uni2D0D ; G 3129 -U 11534 ; WX 645 ; N uni2D0E ; G 3130 -U 11535 ; WX 866 ; N uni2D0F ; G 3131 -U 11536 ; WX 961 ; N uni2D10 ; G 3132 -U 11537 ; WX 645 ; N uni2D11 ; G 3133 -U 11538 ; WX 645 ; N uni2D12 ; G 3134 -U 11539 ; WX 959 ; N uni2D13 ; G 3135 -U 11540 ; WX 945 ; N uni2D14 ; G 3136 -U 11541 ; WX 863 ; N uni2D15 ; G 3137 -U 11542 ; WX 644 ; N uni2D16 ; G 3138 -U 11543 ; WX 646 ; N uni2D17 ; G 3139 -U 11544 ; WX 645 ; N uni2D18 ; G 3140 -U 11545 ; WX 649 ; N uni2D19 ; G 3141 -U 11546 ; WX 688 ; N uni2D1A ; G 3142 -U 11547 ; WX 634 ; N uni2D1B ; G 3143 -U 11548 ; WX 982 ; N uni2D1C ; G 3144 -U 11549 ; WX 681 ; N uni2D1D ; G 3145 -U 11550 ; WX 676 ; N uni2D1E ; G 3146 -U 11551 ; WX 852 ; N uni2D1F ; G 3147 -U 11552 ; WX 957 ; N uni2D20 ; G 3148 -U 11553 ; WX 632 ; N uni2D21 ; G 3149 -U 11554 ; WX 645 ; N uni2D22 ; G 3150 -U 11555 ; WX 646 ; N uni2D23 ; G 3151 -U 11556 ; WX 749 ; N uni2D24 ; G 3152 -U 11557 ; WX 914 ; N uni2D25 ; G 3153 -U 11800 ; WX 536 ; N uni2E18 ; G 3154 -U 11807 ; WX 838 ; N uni2E1F ; G 3155 -U 11810 ; WX 390 ; N uni2E22 ; G 3156 -U 11811 ; WX 390 ; N uni2E23 ; G 3157 -U 11812 ; WX 390 ; N uni2E24 ; G 3158 -U 11813 ; WX 390 ; N uni2E25 ; G 3159 -U 11822 ; WX 536 ; N uni2E2E ; G 3160 -U 42564 ; WX 685 ; N uniA644 ; G 3161 -U 42565 ; WX 513 ; N uniA645 ; G 3162 -U 42566 ; WX 395 ; N uniA646 ; G 3163 -U 42567 ; WX 392 ; N uniA647 ; G 3164 -U 42576 ; WX 1104 ; N uniA650 ; G 3165 -U 42577 ; WX 939 ; N uniA651 ; G 3166 -U 42580 ; WX 1193 ; N uniA654 ; G 3167 -U 42581 ; WX 871 ; N uniA655 ; G 3168 -U 42582 ; WX 1140 ; N uniA656 ; G 3169 -U 42583 ; WX 875 ; N uniA657 ; G 3170 -U 42648 ; WX 1416 ; N uniA698 ; G 3171 -U 42649 ; WX 999 ; N uniA699 ; G 3172 -U 42760 ; WX 493 ; N uniA708 ; G 3173 -U 42761 ; WX 493 ; N uniA709 ; G 3174 -U 42762 ; WX 493 ; N uniA70A ; G 3175 -U 42763 ; WX 493 ; N uniA70B ; G 3176 -U 42764 ; WX 493 ; N uniA70C ; G 3177 -U 42765 ; WX 493 ; N uniA70D ; G 3178 -U 42766 ; WX 493 ; N uniA70E ; G 3179 -U 42767 ; WX 493 ; N uniA70F ; G 3180 -U 42768 ; WX 493 ; N uniA710 ; G 3181 -U 42769 ; WX 493 ; N uniA711 ; G 3182 -U 42770 ; WX 493 ; N uniA712 ; G 3183 -U 42771 ; WX 493 ; N uniA713 ; G 3184 -U 42772 ; WX 493 ; N uniA714 ; G 3185 -U 42773 ; WX 493 ; N uniA715 ; G 3186 -U 42774 ; WX 493 ; N uniA716 ; G 3187 -U 42779 ; WX 369 ; N uniA71B ; G 3188 -U 42780 ; WX 369 ; N uniA71C ; G 3189 -U 42781 ; WX 253 ; N uniA71D ; G 3190 -U 42782 ; WX 253 ; N uniA71E ; G 3191 -U 42783 ; WX 253 ; N uniA71F ; G 3192 -U 42790 ; WX 872 ; N uniA726 ; G 3193 -U 42791 ; WX 634 ; N uniA727 ; G 3194 -U 42792 ; WX 843 ; N uniA728 ; G 3195 -U 42793 ; WX 754 ; N uniA729 ; G 3196 -U 42794 ; WX 612 ; N uniA72A ; G 3197 -U 42795 ; WX 560 ; N uniA72B ; G 3198 -U 42796 ; WX 548 ; N uniA72C ; G 3199 -U 42797 ; WX 531 ; N uniA72D ; G 3200 -U 42798 ; WX 629 ; N uniA72E ; G 3201 -U 42799 ; WX 610 ; N uniA72F ; G 3202 -U 42800 ; WX 514 ; N uniA730 ; G 3203 -U 42801 ; WX 513 ; N uniA731 ; G 3204 -U 42802 ; WX 1195 ; N uniA732 ; G 3205 -U 42803 ; WX 943 ; N uniA733 ; G 3206 -U 42804 ; WX 1226 ; N uniA734 ; G 3207 -U 42805 ; WX 950 ; N uniA735 ; G 3208 -U 42806 ; WX 1149 ; N uniA736 ; G 3209 -U 42807 ; WX 933 ; N uniA737 ; G 3210 -U 42808 ; WX 968 ; N uniA738 ; G 3211 -U 42809 ; WX 784 ; N uniA739 ; G 3212 -U 42810 ; WX 968 ; N uniA73A ; G 3213 -U 42811 ; WX 784 ; N uniA73B ; G 3214 -U 42812 ; WX 962 ; N uniA73C ; G 3215 -U 42813 ; WX 759 ; N uniA73D ; G 3216 -U 42814 ; WX 765 ; N uniA73E ; G 3217 -U 42815 ; WX 560 ; N uniA73F ; G 3218 -U 42816 ; WX 747 ; N uniA740 ; G 3219 -U 42817 ; WX 606 ; N uniA741 ; G 3220 -U 42822 ; WX 787 ; N uniA746 ; G 3221 -U 42823 ; WX 434 ; N uniA747 ; G 3222 -U 42826 ; WX 932 ; N uniA74A ; G 3223 -U 42827 ; WX 711 ; N uniA74B ; G 3224 -U 42830 ; WX 1416 ; N uniA74E ; G 3225 -U 42831 ; WX 999 ; N uniA74F ; G 3226 -U 42856 ; WX 707 ; N uniA768 ; G 3227 -U 42857 ; WX 610 ; N uniA769 ; G 3228 -U 42875 ; WX 612 ; N uniA77B ; G 3229 -U 42876 ; WX 478 ; N uniA77C ; G 3230 -U 42880 ; WX 664 ; N uniA780 ; G 3231 -U 42881 ; WX 320 ; N uniA781 ; G 3232 -U 42882 ; WX 843 ; N uniA782 ; G 3233 -U 42883 ; WX 644 ; N uniA783 ; G 3234 -U 42884 ; WX 612 ; N uniA784 ; G 3235 -U 42885 ; WX 478 ; N uniA785 ; G 3236 -U 42886 ; WX 765 ; N uniA786 ; G 3237 -U 42887 ; WX 560 ; N uniA787 ; G 3238 -U 42891 ; WX 402 ; N uniA78B ; G 3239 -U 42892 ; WX 275 ; N uniA78C ; G 3240 -U 42893 ; WX 773 ; N uniA78D ; G 3241 -U 42896 ; WX 875 ; N uniA790 ; G 3242 -U 42897 ; WX 698 ; N uniA791 ; G 3243 -U 42922 ; WX 872 ; N uniA7AA ; G 3244 -U 43000 ; WX 549 ; N uniA7F8 ; G 3245 -U 43001 ; WX 623 ; N uniA7F9 ; G 3246 -U 43002 ; WX 957 ; N uniA7FA ; G 3247 -U 43003 ; WX 694 ; N uniA7FB ; G 3248 -U 43004 ; WX 673 ; N uniA7FC ; G 3249 -U 43005 ; WX 1024 ; N uniA7FD ; G 3250 -U 43006 ; WX 395 ; N uniA7FE ; G 3251 -U 43007 ; WX 1201 ; N uniA7FF ; G 3252 -U 62464 ; WX 664 ; N uniF400 ; G 3253 -U 62465 ; WX 675 ; N uniF401 ; G 3254 -U 62466 ; WX 724 ; N uniF402 ; G 3255 -U 62467 ; WX 958 ; N uniF403 ; G 3256 -U 62468 ; WX 675 ; N uniF404 ; G 3257 -U 62469 ; WX 669 ; N uniF405 ; G 3258 -U 62470 ; WX 735 ; N uniF406 ; G 3259 -U 62471 ; WX 997 ; N uniF407 ; G 3260 -U 62472 ; WX 675 ; N uniF408 ; G 3261 -U 62473 ; WX 675 ; N uniF409 ; G 3262 -U 62474 ; WX 1268 ; N uniF40A ; G 3263 -U 62475 ; WX 693 ; N uniF40B ; G 3264 -U 62476 ; WX 692 ; N uniF40C ; G 3265 -U 62477 ; WX 963 ; N uniF40D ; G 3266 -U 62478 ; WX 675 ; N uniF40E ; G 3267 -U 62479 ; WX 692 ; N uniF40F ; G 3268 -U 62480 ; WX 1009 ; N uniF410 ; G 3269 -U 62481 ; WX 756 ; N uniF411 ; G 3270 -U 62482 ; WX 809 ; N uniF412 ; G 3271 -U 62483 ; WX 758 ; N uniF413 ; G 3272 -U 62484 ; WX 955 ; N uniF414 ; G 3273 -U 62485 ; WX 691 ; N uniF415 ; G 3274 -U 62486 ; WX 946 ; N uniF416 ; G 3275 -U 62487 ; WX 690 ; N uniF417 ; G 3276 -U 62488 ; WX 698 ; N uniF418 ; G 3277 -U 62489 ; WX 692 ; N uniF419 ; G 3278 -U 62490 ; WX 739 ; N uniF41A ; G 3279 -U 62491 ; WX 692 ; N uniF41B ; G 3280 -U 62492 ; WX 698 ; N uniF41C ; G 3281 -U 62493 ; WX 676 ; N uniF41D ; G 3282 -U 62494 ; WX 739 ; N uniF41E ; G 3283 -U 62495 ; WX 895 ; N uniF41F ; G 3284 -U 62496 ; WX 675 ; N uniF420 ; G 3285 -U 62497 ; WX 785 ; N uniF421 ; G 3286 -U 62498 ; WX 676 ; N uniF422 ; G 3287 -U 62499 ; WX 675 ; N uniF423 ; G 3288 -U 62500 ; WX 675 ; N uniF424 ; G 3289 -U 62501 ; WX 732 ; N uniF425 ; G 3290 -U 62502 ; WX 972 ; N uniF426 ; G 3291 -U 62504 ; WX 904 ; N uniF428 ; G 3292 -U 63172 ; WX 320 ; N uniF6C4 ; G 3293 -U 63173 ; WX 602 ; N uniF6C5 ; G 3294 -U 63174 ; WX 640 ; N uniF6C6 ; G 3295 -U 63175 ; WX 644 ; N uniF6C7 ; G 3296 -U 63176 ; WX 947 ; N uniF6C8 ; G 3297 -U 63185 ; WX 500 ; N cyrBreve ; G 3298 -U 63188 ; WX 500 ; N cyrbreve ; G 3299 -U 64256 ; WX 708 ; N uniFB00 ; G 3300 -U 64257 ; WX 667 ; N fi ; G 3301 -U 64258 ; WX 667 ; N fl ; G 3302 -U 64259 ; WX 941 ; N uniFB03 ; G 3303 -U 64260 ; WX 986 ; N uniFB04 ; G 3304 -U 64261 ; WX 744 ; N uniFB05 ; G 3305 -U 64262 ; WX 916 ; N uniFB06 ; G 3306 -U 65024 ; WX 0 ; N uniFE00 ; G 3307 -U 65025 ; WX 0 ; N uniFE01 ; G 3308 -U 65026 ; WX 0 ; N uniFE02 ; G 3309 -U 65027 ; WX 0 ; N uniFE03 ; G 3310 -U 65028 ; WX 0 ; N uniFE04 ; G 3311 -U 65029 ; WX 0 ; N uniFE05 ; G 3312 -U 65030 ; WX 0 ; N uniFE06 ; G 3313 -U 65031 ; WX 0 ; N uniFE07 ; G 3314 -U 65032 ; WX 0 ; N uniFE08 ; G 3315 -U 65033 ; WX 0 ; N uniFE09 ; G 3316 -U 65034 ; WX 0 ; N uniFE0A ; G 3317 -U 65035 ; WX 0 ; N uniFE0B ; G 3318 -U 65036 ; WX 0 ; N uniFE0C ; G 3319 -U 65037 ; WX 0 ; N uniFE0D ; G 3320 -U 65038 ; WX 0 ; N uniFE0E ; G 3321 -U 65039 ; WX 0 ; N uniFE0F ; G 3322 -U 65529 ; WX 0 ; N uniFFF9 ; G 3323 -U 65530 ; WX 0 ; N uniFFFA ; G 3324 -U 65531 ; WX 0 ; N uniFFFB ; G 3325 -U 65532 ; WX 0 ; N uniFFFC ; G 3326 -U 65533 ; WX 1025 ; N uniFFFD ; G 3327 -EndCharMetrics -StartKernData -StartKernPairs 1103 - -KPX dollar seven -112 -KPX dollar nine -102 -KPX dollar colon -83 -KPX dollar less -83 -KPX dollar I -36 -KPX dollar W -36 -KPX dollar Y -83 -KPX dollar Z -92 -KPX dollar backslash -83 -KPX dollar questiondown -83 -KPX dollar Aacute -83 -KPX dollar Hbar -112 -KPX dollar hbar -36 -KPX dollar lacute -83 - -KPX percent ampersand 38 -KPX percent asterisk 38 -KPX percent two 38 -KPX percent less -36 -KPX percent Egrave 38 -KPX percent Icircumflex 38 -KPX percent agrave 38 -KPX percent Ebreve 38 -KPX percent lacute -36 - - -KPX quotesingle nine -36 - - -KPX parenright dollar -178 -KPX parenright D -139 -KPX parenright H -112 -KPX parenright R -112 -KPX parenright cent -139 -KPX parenright sterling -139 -KPX parenright currency -139 -KPX parenright yen -139 -KPX parenright brokenbar -139 -KPX parenright section -139 -KPX parenright dieresis -139 -KPX parenright ordfeminine -112 -KPX parenright guillemotleft -112 -KPX parenright logicalnot -112 -KPX parenright sfthyphen -112 -KPX parenright acute -112 -KPX parenright mu -112 -KPX parenright paragraph -112 -KPX parenright periodcentered -112 -KPX parenright cedilla -112 -KPX parenright ordmasculine -112 -KPX parenright Yacute -112 -KPX parenright ebreve -112 - -KPX asterisk less -36 -KPX asterisk lacute -36 - - -KPX period dollar -83 -KPX period ampersand -55 -KPX period two -55 -KPX period eight -73 -KPX period colon -73 -KPX period less -55 -KPX period H -55 -KPX period R -55 -KPX period X -45 -KPX period backslash -131 -KPX period ordfeminine -55 -KPX period guillemotleft -55 -KPX period logicalnot -55 -KPX period sfthyphen -55 -KPX period acute -55 -KPX period mu -55 -KPX period paragraph -55 -KPX period periodcentered -55 -KPX period cedilla -55 -KPX period ordmasculine -36 -KPX period guillemotright -45 -KPX period onequarter -45 -KPX period onehalf -45 -KPX period threequarters -45 -KPX period questiondown -131 -KPX period Aacute -131 -KPX period Egrave -55 -KPX period Icircumflex -55 -KPX period Yacute -55 -KPX period Ebreve -55 -KPX period ebreve -55 -KPX period Idot -73 -KPX period dotlessi -45 -KPX period lacute -55 - -KPX slash seven -167 -KPX slash eight -112 -KPX slash nine -243 -KPX slash colon -178 -KPX slash less -131 -KPX slash backslash -36 -KPX slash questiondown -36 -KPX slash Aacute -36 -KPX slash Hbar -167 -KPX slash Idot -112 -KPX slash lacute -131 - - -KPX two nine -36 -KPX two semicolon -36 - -KPX three dollar -188 -KPX three eight -36 -KPX three D -92 -KPX three H -92 -KPX three R -83 -KPX three V -55 -KPX three cent -92 -KPX three sterling -92 -KPX three currency -92 -KPX three yen -92 -KPX three brokenbar -92 -KPX three section -92 -KPX three dieresis -92 -KPX three ordfeminine -92 -KPX three guillemotleft -92 -KPX three logicalnot -92 -KPX three sfthyphen -92 -KPX three acute -83 -KPX three mu -83 -KPX three paragraph -83 -KPX three periodcentered -83 -KPX three cedilla -83 -KPX three ordmasculine -83 -KPX three Yacute -92 -KPX three ebreve -83 -KPX three gdotaccent -55 -KPX three gcommaaccent -55 -KPX three Idot -36 - - -KPX five seven -36 -KPX five nine -73 -KPX five colon -45 -KPX five less -63 -KPX five D 47 -KPX five backslash -36 -KPX five cent 47 -KPX five sterling 47 -KPX five currency 47 -KPX five yen 47 -KPX five brokenbar 47 -KPX five section 47 -KPX five dieresis 47 -KPX five ordmasculine 38 -KPX five questiondown -36 -KPX five Aacute -36 -KPX five Hbar -36 -KPX five lacute -63 - -KPX six six -36 -KPX six Gdotaccent -36 -KPX six Gcommaaccent -36 - -KPX seven dollar -112 -KPX seven seven 38 -KPX seven D -159 -KPX seven F -159 -KPX seven H -159 -KPX seven R -159 -KPX seven V -149 -KPX seven Z -73 -KPX seven cent -159 -KPX seven sterling -159 -KPX seven currency -159 -KPX seven yen -159 -KPX seven brokenbar -159 -KPX seven section -159 -KPX seven dieresis -159 -KPX seven copyright -159 -KPX seven ordfeminine -159 -KPX seven guillemotleft -159 -KPX seven logicalnot -159 -KPX seven sfthyphen -159 -KPX seven acute -159 -KPX seven mu -159 -KPX seven paragraph -159 -KPX seven periodcentered -159 -KPX seven cedilla -159 -KPX seven ordmasculine -159 -KPX seven Eacute -159 -KPX seven Idieresis -159 -KPX seven Yacute -159 -KPX seven ebreve -159 -KPX seven gdotaccent -149 -KPX seven gcommaaccent -149 -KPX seven Hbar 38 - -KPX eight dollar -63 -KPX eight hyphen -55 - -KPX nine dollar -139 -KPX nine two -36 -KPX nine D -188 -KPX nine H -188 -KPX nine L -36 -KPX nine R -188 -KPX nine X -131 -KPX nine backslash -83 -KPX nine cent -188 -KPX nine sterling -188 -KPX nine currency -188 -KPX nine yen -188 -KPX nine brokenbar -188 -KPX nine section -188 -KPX nine dieresis -188 -KPX nine ordfeminine -188 -KPX nine guillemotleft -188 -KPX nine logicalnot -188 -KPX nine sfthyphen -188 -KPX nine acute -188 -KPX nine mu -188 -KPX nine paragraph -188 -KPX nine periodcentered -188 -KPX nine cedilla -188 -KPX nine ordmasculine -188 -KPX nine guillemotright -131 -KPX nine onequarter -131 -KPX nine onehalf -131 -KPX nine threequarters -131 -KPX nine questiondown -83 -KPX nine Aacute -83 -KPX nine Yacute -188 -KPX nine Ebreve -36 -KPX nine ebreve -188 -KPX nine dotlessi -131 - -KPX colon dollar -102 -KPX colon D -178 -KPX colon H -167 -KPX colon L -36 -KPX colon R -139 -KPX colon U -92 -KPX colon X -83 -KPX colon backslash -45 -KPX colon cent -178 -KPX colon sterling -178 -KPX colon currency -178 -KPX colon yen -178 -KPX colon brokenbar -178 -KPX colon section -178 -KPX colon dieresis -139 -KPX colon ordfeminine -167 -KPX colon guillemotleft -167 -KPX colon logicalnot -167 -KPX colon sfthyphen -167 -KPX colon acute -139 -KPX colon mu -139 -KPX colon paragraph -139 -KPX colon periodcentered -139 -KPX colon cedilla -139 -KPX colon ordmasculine -139 -KPX colon guillemotright -83 -KPX colon onequarter -83 -KPX colon onehalf -83 -KPX colon threequarters -83 -KPX colon questiondown -45 -KPX colon Aacute -45 -KPX colon Yacute -167 -KPX colon ebreve -139 -KPX colon edotaccent -92 -KPX colon ecaron -92 -KPX colon dotlessi -83 - -KPX semicolon dollar -73 -KPX semicolon ampersand -36 -KPX semicolon two -36 -KPX semicolon Egrave -36 -KPX semicolon Icircumflex -36 -KPX semicolon Ebreve -36 - -KPX less dollar -159 -KPX less ampersand -36 -KPX less D -159 -KPX less H -178 -KPX less L -36 -KPX less R -178 -KPX less X -178 -KPX less cent -159 -KPX less sterling -159 -KPX less currency -159 -KPX less yen -159 -KPX less brokenbar -159 -KPX less section -159 -KPX less dieresis -196 -KPX less ordfeminine -178 -KPX less guillemotleft -178 -KPX less logicalnot -178 -KPX less sfthyphen -178 -KPX less acute -178 -KPX less mu -178 -KPX less paragraph -178 -KPX less periodcentered -178 -KPX less cedilla -178 -KPX less ordmasculine -178 -KPX less guillemotright -178 -KPX less onequarter -178 -KPX less onehalf -178 -KPX less threequarters -178 -KPX less Egrave -36 -KPX less Icircumflex -36 -KPX less Yacute -178 -KPX less ebreve -215 -KPX less dotlessi -178 - - - - - - - - - - - - - - - - - - - - - - - -KPX Eth nine -36 - - -KPX agrave less -36 -KPX agrave lacute -36 - -KPX ucircumflex seven -167 -KPX ucircumflex eight -112 -KPX ucircumflex nine -243 -KPX ucircumflex colon -178 -KPX ucircumflex less -131 -KPX ucircumflex backslash -36 -KPX ucircumflex questiondown -36 -KPX ucircumflex Aacute -36 -KPX ucircumflex Hbar -167 -KPX ucircumflex Idot -112 -KPX ucircumflex lacute -131 - -KPX ydieresis seven -167 -KPX ydieresis eight -112 -KPX ydieresis nine -243 -KPX ydieresis colon -178 -KPX ydieresis less -131 -KPX ydieresis backslash -36 -KPX ydieresis questiondown -36 -KPX ydieresis Aacute -36 -KPX ydieresis Hbar -167 -KPX ydieresis Idot -112 -KPX ydieresis lacute -131 - -KPX Abreve O -227 - -KPX abreve seven -167 -KPX abreve eight -36 -KPX abreve nine -243 -KPX abreve colon -178 -KPX abreve less -206 -KPX abreve backslash -36 -KPX abreve questiondown -36 -KPX abreve Aacute -36 -KPX abreve Hbar -167 -KPX abreve Idot -36 -KPX abreve lacute -206 - - - -KPX Edotaccent seven -36 -KPX Edotaccent nine -73 -KPX Edotaccent colon -45 -KPX Edotaccent less -63 -KPX Edotaccent D 47 -KPX Edotaccent backslash -36 -KPX Edotaccent cent 47 -KPX Edotaccent sterling 47 -KPX Edotaccent currency 47 -KPX Edotaccent yen 47 -KPX Edotaccent brokenbar 47 -KPX Edotaccent section 47 -KPX Edotaccent dieresis 47 -KPX Edotaccent ordmasculine 38 -KPX Edotaccent questiondown -36 -KPX Edotaccent Aacute -36 -KPX Edotaccent Hbar -36 -KPX Edotaccent lacute -63 - - -KPX Ecaron seven -36 -KPX Ecaron nine -73 -KPX Ecaron colon -45 -KPX Ecaron less -63 -KPX Ecaron D 47 -KPX Ecaron backslash -36 -KPX Ecaron cent 47 -KPX Ecaron sterling 47 -KPX Ecaron currency 47 -KPX Ecaron yen 47 -KPX Ecaron brokenbar 47 -KPX Ecaron section 47 -KPX Ecaron dieresis 47 -KPX Ecaron ordmasculine 38 -KPX Ecaron questiondown -36 -KPX Ecaron Aacute -36 -KPX Ecaron Hbar -36 -KPX Ecaron lacute -63 - - -KPX Gdotaccent six -36 -KPX Gdotaccent Gdotaccent -36 -KPX Gdotaccent Gcommaaccent -36 - -KPX Gcommaaccent six -36 -KPX Gcommaaccent Gdotaccent -36 -KPX Gcommaaccent Gcommaaccent -36 - -KPX Hbar dollar -112 -KPX Hbar seven 38 -KPX Hbar D -159 -KPX Hbar F -159 -KPX Hbar H -159 -KPX Hbar R -159 -KPX Hbar V -149 -KPX Hbar Z -73 -KPX Hbar cent -159 -KPX Hbar sterling -159 -KPX Hbar currency -159 -KPX Hbar yen -159 -KPX Hbar brokenbar -159 -KPX Hbar section -159 -KPX Hbar dieresis -159 -KPX Hbar copyright -159 -KPX Hbar ordfeminine -159 -KPX Hbar guillemotleft -159 -KPX Hbar logicalnot -159 -KPX Hbar sfthyphen -159 -KPX Hbar acute -159 -KPX Hbar mu -159 -KPX Hbar paragraph -159 -KPX Hbar periodcentered -159 -KPX Hbar cedilla -159 -KPX Hbar ordmasculine -159 -KPX Hbar Eacute -159 -KPX Hbar Idieresis -159 -KPX Hbar Yacute -159 -KPX Hbar ebreve -159 -KPX Hbar gdotaccent -149 -KPX Hbar gcommaaccent -149 -KPX Hbar Hbar 38 - -KPX Idot dollar -63 -KPX Idot hyphen -55 - -KPX kcommaaccent D 110 -KPX kcommaaccent F 85 -KPX kcommaaccent G 97 -KPX kcommaaccent H 86 -KPX kcommaaccent I 220 -KPX kcommaaccent J 97 -KPX kcommaaccent L 220 -KPX kcommaaccent M 218 -KPX kcommaaccent P 125 -KPX kcommaaccent Q 125 -KPX kcommaaccent R 85 -KPX kcommaaccent S 140 -KPX kcommaaccent T 97 -KPX kcommaaccent U 125 -KPX kcommaaccent V 155 -KPX kcommaaccent W 235 -KPX kcommaaccent X 144 -KPX kcommaaccent Y 205 -KPX kcommaaccent Z 166 -KPX kcommaaccent bracketleft 174 -KPX kcommaaccent backslash 205 -KPX kcommaaccent bracketright 179 -KPX kcommaaccent kcommaaccent 261 - -KPX lacute dollar -159 -KPX lacute ampersand -36 -KPX lacute D -159 -KPX lacute H -178 -KPX lacute L -36 -KPX lacute R -178 -KPX lacute X -178 -KPX lacute cent -159 -KPX lacute sterling -159 -KPX lacute currency -159 -KPX lacute yen -159 -KPX lacute brokenbar -159 -KPX lacute section -159 -KPX lacute dieresis -196 -KPX lacute ordfeminine -178 -KPX lacute guillemotleft -178 -KPX lacute logicalnot -178 -KPX lacute sfthyphen -178 -KPX lacute acute -178 -KPX lacute mu -178 -KPX lacute paragraph -178 -KPX lacute periodcentered -178 -KPX lacute cedilla -178 -KPX lacute ordmasculine -178 -KPX lacute guillemotright -178 -KPX lacute onequarter -178 -KPX lacute onehalf -178 -KPX lacute threequarters -178 -KPX lacute Egrave -36 -KPX lacute Icircumflex -36 -KPX lacute Yacute -178 -KPX lacute ebreve -215 -KPX lacute dotlessi -178 - - -KPX uni027D dollar -264 -KPX uni027D hyphen 47 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ttf b/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ttf deleted file mode 100644 index 0b803d2..0000000 Binary files a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ttf and /dev/null differ diff --git a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ufm b/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ufm deleted file mode 100644 index 358b026..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ufm +++ /dev/null @@ -1,4012 +0,0 @@ -StartFontMetrics 4.1 -Notice Converted by PHP-font-lib -Comment https://github.com/PhenX/php-font-lib -EncodingScheme FontSpecific -FontName DejaVu Serif -FontSubfamily Book -UniqueID DejaVu Serif -FullName DejaVu Serif -Version Version 2.37 -PostScriptName DejaVuSerif -Manufacturer DejaVu fonts team -FontVendorURL http://dejavu.sourceforge.net -LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License -PreferredFamily DejaVu Serif -PreferredSubfamily Book -Weight Medium -ItalicAngle 0 -IsFixedPitch false -UnderlineThickness 44 -UnderlinePosition -63 -FontHeightOffset 0 -Ascender 928 -Descender -236 -FontBBox -770 -347 2105 1109 -StartCharMetrics 3528 -U 32 ; WX 318 ; N space ; G 3 -U 33 ; WX 402 ; N exclam ; G 4 -U 34 ; WX 460 ; N quotedbl ; G 5 -U 35 ; WX 838 ; N numbersign ; G 6 -U 36 ; WX 636 ; N dollar ; G 7 -U 37 ; WX 950 ; N percent ; G 8 -U 38 ; WX 890 ; N ampersand ; G 9 -U 39 ; WX 275 ; N quotesingle ; G 10 -U 40 ; WX 390 ; N parenleft ; G 11 -U 41 ; WX 390 ; N parenright ; G 12 -U 42 ; WX 500 ; N asterisk ; G 13 -U 43 ; WX 838 ; N plus ; G 14 -U 44 ; WX 318 ; N comma ; G 15 -U 45 ; WX 338 ; N hyphen ; G 16 -U 46 ; WX 318 ; N period ; G 17 -U 47 ; WX 337 ; N slash ; G 18 -U 48 ; WX 636 ; N zero ; G 19 -U 49 ; WX 636 ; N one ; G 20 -U 50 ; WX 636 ; N two ; G 21 -U 51 ; WX 636 ; N three ; G 22 -U 52 ; WX 636 ; N four ; G 23 -U 53 ; WX 636 ; N five ; G 24 -U 54 ; WX 636 ; N six ; G 25 -U 55 ; WX 636 ; N seven ; G 26 -U 56 ; WX 636 ; N eight ; G 27 -U 57 ; WX 636 ; N nine ; G 28 -U 58 ; WX 337 ; N colon ; G 29 -U 59 ; WX 337 ; N semicolon ; G 30 -U 60 ; WX 838 ; N less ; G 31 -U 61 ; WX 838 ; N equal ; G 32 -U 62 ; WX 838 ; N greater ; G 33 -U 63 ; WX 536 ; N question ; G 34 -U 64 ; WX 1000 ; N at ; G 35 -U 65 ; WX 722 ; N A ; G 36 -U 66 ; WX 735 ; N B ; G 37 -U 67 ; WX 765 ; N C ; G 38 -U 68 ; WX 802 ; N D ; G 39 -U 69 ; WX 730 ; N E ; G 40 -U 70 ; WX 694 ; N F ; G 41 -U 71 ; WX 799 ; N G ; G 42 -U 72 ; WX 872 ; N H ; G 43 -U 73 ; WX 395 ; N I ; G 44 -U 74 ; WX 401 ; N J ; G 45 -U 75 ; WX 747 ; N K ; G 46 -U 76 ; WX 664 ; N L ; G 47 -U 77 ; WX 1024 ; N M ; G 48 -U 78 ; WX 875 ; N N ; G 49 -U 79 ; WX 820 ; N O ; G 50 -U 80 ; WX 673 ; N P ; G 51 -U 81 ; WX 820 ; N Q ; G 52 -U 82 ; WX 753 ; N R ; G 53 -U 83 ; WX 685 ; N S ; G 54 -U 84 ; WX 667 ; N T ; G 55 -U 85 ; WX 843 ; N U ; G 56 -U 86 ; WX 722 ; N V ; G 57 -U 87 ; WX 1028 ; N W ; G 58 -U 88 ; WX 712 ; N X ; G 59 -U 89 ; WX 660 ; N Y ; G 60 -U 90 ; WX 695 ; N Z ; G 61 -U 91 ; WX 390 ; N bracketleft ; G 62 -U 92 ; WX 337 ; N backslash ; G 63 -U 93 ; WX 390 ; N bracketright ; G 64 -U 94 ; WX 838 ; N asciicircum ; G 65 -U 95 ; WX 500 ; N underscore ; G 66 -U 96 ; WX 500 ; N grave ; G 67 -U 97 ; WX 596 ; N a ; G 68 -U 98 ; WX 640 ; N b ; G 69 -U 99 ; WX 560 ; N c ; G 70 -U 100 ; WX 640 ; N d ; G 71 -U 101 ; WX 592 ; N e ; G 72 -U 102 ; WX 370 ; N f ; G 73 -U 103 ; WX 640 ; N g ; G 74 -U 104 ; WX 644 ; N h ; G 75 -U 105 ; WX 320 ; N i ; G 76 -U 106 ; WX 310 ; N j ; G 77 -U 107 ; WX 606 ; N k ; G 78 -U 108 ; WX 320 ; N l ; G 79 -U 109 ; WX 948 ; N m ; G 80 -U 110 ; WX 644 ; N n ; G 81 -U 111 ; WX 602 ; N o ; G 82 -U 112 ; WX 640 ; N p ; G 83 -U 113 ; WX 640 ; N q ; G 84 -U 114 ; WX 478 ; N r ; G 85 -U 115 ; WX 513 ; N s ; G 86 -U 116 ; WX 402 ; N t ; G 87 -U 117 ; WX 644 ; N u ; G 88 -U 118 ; WX 565 ; N v ; G 89 -U 119 ; WX 856 ; N w ; G 90 -U 120 ; WX 564 ; N x ; G 91 -U 121 ; WX 565 ; N y ; G 92 -U 122 ; WX 527 ; N z ; G 93 -U 123 ; WX 636 ; N braceleft ; G 94 -U 124 ; WX 337 ; N bar ; G 95 -U 125 ; WX 636 ; N braceright ; G 96 -U 126 ; WX 838 ; N asciitilde ; G 97 -U 160 ; WX 318 ; N nbspace ; G 98 -U 161 ; WX 402 ; N exclamdown ; G 99 -U 162 ; WX 636 ; N cent ; G 100 -U 163 ; WX 636 ; N sterling ; G 101 -U 164 ; WX 636 ; N currency ; G 102 -U 165 ; WX 636 ; N yen ; G 103 -U 166 ; WX 337 ; N brokenbar ; G 104 -U 167 ; WX 500 ; N section ; G 105 -U 168 ; WX 500 ; N dieresis ; G 106 -U 169 ; WX 1000 ; N copyright ; G 107 -U 170 ; WX 475 ; N ordfeminine ; G 108 -U 171 ; WX 612 ; N guillemotleft ; G 109 -U 172 ; WX 838 ; N logicalnot ; G 110 -U 173 ; WX 338 ; N sfthyphen ; G 111 -U 174 ; WX 1000 ; N registered ; G 112 -U 175 ; WX 500 ; N macron ; G 113 -U 176 ; WX 500 ; N degree ; G 114 -U 177 ; WX 838 ; N plusminus ; G 115 -U 178 ; WX 401 ; N twosuperior ; G 116 -U 179 ; WX 401 ; N threesuperior ; G 117 -U 180 ; WX 500 ; N acute ; G 118 -U 181 ; WX 650 ; N mu ; G 119 -U 182 ; WX 636 ; N paragraph ; G 120 -U 183 ; WX 318 ; N periodcentered ; G 121 -U 184 ; WX 500 ; N cedilla ; G 122 -U 185 ; WX 401 ; N onesuperior ; G 123 -U 186 ; WX 470 ; N ordmasculine ; G 124 -U 187 ; WX 612 ; N guillemotright ; G 125 -U 188 ; WX 969 ; N onequarter ; G 126 -U 189 ; WX 969 ; N onehalf ; G 127 -U 190 ; WX 969 ; N threequarters ; G 128 -U 191 ; WX 536 ; N questiondown ; G 129 -U 192 ; WX 722 ; N Agrave ; G 130 -U 193 ; WX 722 ; N Aacute ; G 131 -U 194 ; WX 722 ; N Acircumflex ; G 132 -U 195 ; WX 722 ; N Atilde ; G 133 -U 196 ; WX 722 ; N Adieresis ; G 134 -U 197 ; WX 722 ; N Aring ; G 135 -U 198 ; WX 1001 ; N AE ; G 136 -U 199 ; WX 765 ; N Ccedilla ; G 137 -U 200 ; WX 730 ; N Egrave ; G 138 -U 201 ; WX 730 ; N Eacute ; G 139 -U 202 ; WX 730 ; N Ecircumflex ; G 140 -U 203 ; WX 730 ; N Edieresis ; G 141 -U 204 ; WX 395 ; N Igrave ; G 142 -U 205 ; WX 395 ; N Iacute ; G 143 -U 206 ; WX 395 ; N Icircumflex ; G 144 -U 207 ; WX 395 ; N Idieresis ; G 145 -U 208 ; WX 807 ; N Eth ; G 146 -U 209 ; WX 875 ; N Ntilde ; G 147 -U 210 ; WX 820 ; N Ograve ; G 148 -U 211 ; WX 820 ; N Oacute ; G 149 -U 212 ; WX 820 ; N Ocircumflex ; G 150 -U 213 ; WX 820 ; N Otilde ; G 151 -U 214 ; WX 820 ; N Odieresis ; G 152 -U 215 ; WX 838 ; N multiply ; G 153 -U 216 ; WX 820 ; N Oslash ; G 154 -U 217 ; WX 843 ; N Ugrave ; G 155 -U 218 ; WX 843 ; N Uacute ; G 156 -U 219 ; WX 843 ; N Ucircumflex ; G 157 -U 220 ; WX 843 ; N Udieresis ; G 158 -U 221 ; WX 660 ; N Yacute ; G 159 -U 222 ; WX 676 ; N Thorn ; G 160 -U 223 ; WX 668 ; N germandbls ; G 161 -U 224 ; WX 596 ; N agrave ; G 162 -U 225 ; WX 596 ; N aacute ; G 163 -U 226 ; WX 596 ; N acircumflex ; G 164 -U 227 ; WX 596 ; N atilde ; G 165 -U 228 ; WX 596 ; N adieresis ; G 166 -U 229 ; WX 596 ; N aring ; G 167 -U 230 ; WX 940 ; N ae ; G 168 -U 231 ; WX 560 ; N ccedilla ; G 169 -U 232 ; WX 592 ; N egrave ; G 170 -U 233 ; WX 592 ; N eacute ; G 171 -U 234 ; WX 592 ; N ecircumflex ; G 172 -U 235 ; WX 592 ; N edieresis ; G 173 -U 236 ; WX 320 ; N igrave ; G 174 -U 237 ; WX 320 ; N iacute ; G 175 -U 238 ; WX 320 ; N icircumflex ; G 176 -U 239 ; WX 320 ; N idieresis ; G 177 -U 240 ; WX 602 ; N eth ; G 178 -U 241 ; WX 644 ; N ntilde ; G 179 -U 242 ; WX 602 ; N ograve ; G 180 -U 243 ; WX 602 ; N oacute ; G 181 -U 244 ; WX 602 ; N ocircumflex ; G 182 -U 245 ; WX 602 ; N otilde ; G 183 -U 246 ; WX 602 ; N odieresis ; G 184 -U 247 ; WX 838 ; N divide ; G 185 -U 248 ; WX 602 ; N oslash ; G 186 -U 249 ; WX 644 ; N ugrave ; G 187 -U 250 ; WX 644 ; N uacute ; G 188 -U 251 ; WX 644 ; N ucircumflex ; G 189 -U 252 ; WX 644 ; N udieresis ; G 190 -U 253 ; WX 565 ; N yacute ; G 191 -U 254 ; WX 640 ; N thorn ; G 192 -U 255 ; WX 565 ; N ydieresis ; G 193 -U 256 ; WX 722 ; N Amacron ; G 194 -U 257 ; WX 596 ; N amacron ; G 195 -U 258 ; WX 722 ; N Abreve ; G 196 -U 259 ; WX 596 ; N abreve ; G 197 -U 260 ; WX 722 ; N Aogonek ; G 198 -U 261 ; WX 596 ; N aogonek ; G 199 -U 262 ; WX 765 ; N Cacute ; G 200 -U 263 ; WX 560 ; N cacute ; G 201 -U 264 ; WX 765 ; N Ccircumflex ; G 202 -U 265 ; WX 560 ; N ccircumflex ; G 203 -U 266 ; WX 765 ; N Cdotaccent ; G 204 -U 267 ; WX 560 ; N cdotaccent ; G 205 -U 268 ; WX 765 ; N Ccaron ; G 206 -U 269 ; WX 560 ; N ccaron ; G 207 -U 270 ; WX 802 ; N Dcaron ; G 208 -U 271 ; WX 640 ; N dcaron ; G 209 -U 272 ; WX 807 ; N Dcroat ; G 210 -U 273 ; WX 640 ; N dmacron ; G 211 -U 274 ; WX 730 ; N Emacron ; G 212 -U 275 ; WX 592 ; N emacron ; G 213 -U 276 ; WX 730 ; N Ebreve ; G 214 -U 277 ; WX 592 ; N ebreve ; G 215 -U 278 ; WX 730 ; N Edotaccent ; G 216 -U 279 ; WX 592 ; N edotaccent ; G 217 -U 280 ; WX 730 ; N Eogonek ; G 218 -U 281 ; WX 592 ; N eogonek ; G 219 -U 282 ; WX 730 ; N Ecaron ; G 220 -U 283 ; WX 592 ; N ecaron ; G 221 -U 284 ; WX 799 ; N Gcircumflex ; G 222 -U 285 ; WX 640 ; N gcircumflex ; G 223 -U 286 ; WX 799 ; N Gbreve ; G 224 -U 287 ; WX 640 ; N gbreve ; G 225 -U 288 ; WX 799 ; N Gdotaccent ; G 226 -U 289 ; WX 640 ; N gdotaccent ; G 227 -U 290 ; WX 799 ; N Gcommaaccent ; G 228 -U 291 ; WX 640 ; N gcommaaccent ; G 229 -U 292 ; WX 872 ; N Hcircumflex ; G 230 -U 293 ; WX 644 ; N hcircumflex ; G 231 -U 294 ; WX 872 ; N Hbar ; G 232 -U 295 ; WX 644 ; N hbar ; G 233 -U 296 ; WX 395 ; N Itilde ; G 234 -U 297 ; WX 320 ; N itilde ; G 235 -U 298 ; WX 395 ; N Imacron ; G 236 -U 299 ; WX 320 ; N imacron ; G 237 -U 300 ; WX 395 ; N Ibreve ; G 238 -U 301 ; WX 320 ; N ibreve ; G 239 -U 302 ; WX 395 ; N Iogonek ; G 240 -U 303 ; WX 320 ; N iogonek ; G 241 -U 304 ; WX 395 ; N Idot ; G 242 -U 305 ; WX 320 ; N dotlessi ; G 243 -U 306 ; WX 801 ; N IJ ; G 244 -U 307 ; WX 533 ; N ij ; G 245 -U 308 ; WX 401 ; N Jcircumflex ; G 246 -U 309 ; WX 310 ; N jcircumflex ; G 247 -U 310 ; WX 747 ; N Kcommaaccent ; G 248 -U 311 ; WX 606 ; N kcommaaccent ; G 249 -U 312 ; WX 606 ; N kgreenlandic ; G 250 -U 313 ; WX 664 ; N Lacute ; G 251 -U 314 ; WX 320 ; N lacute ; G 252 -U 315 ; WX 664 ; N Lcommaaccent ; G 253 -U 316 ; WX 320 ; N lcommaaccent ; G 254 -U 317 ; WX 664 ; N Lcaron ; G 255 -U 318 ; WX 320 ; N lcaron ; G 256 -U 319 ; WX 664 ; N Ldot ; G 257 -U 320 ; WX 320 ; N ldot ; G 258 -U 321 ; WX 669 ; N Lslash ; G 259 -U 322 ; WX 324 ; N lslash ; G 260 -U 323 ; WX 875 ; N Nacute ; G 261 -U 324 ; WX 644 ; N nacute ; G 262 -U 325 ; WX 875 ; N Ncommaaccent ; G 263 -U 326 ; WX 644 ; N ncommaaccent ; G 264 -U 327 ; WX 875 ; N Ncaron ; G 265 -U 328 ; WX 644 ; N ncaron ; G 266 -U 329 ; WX 866 ; N napostrophe ; G 267 -U 330 ; WX 843 ; N Eng ; G 268 -U 331 ; WX 644 ; N eng ; G 269 -U 332 ; WX 820 ; N Omacron ; G 270 -U 333 ; WX 602 ; N omacron ; G 271 -U 334 ; WX 820 ; N Obreve ; G 272 -U 335 ; WX 602 ; N obreve ; G 273 -U 336 ; WX 820 ; N Ohungarumlaut ; G 274 -U 337 ; WX 602 ; N ohungarumlaut ; G 275 -U 338 ; WX 1137 ; N OE ; G 276 -U 339 ; WX 989 ; N oe ; G 277 -U 340 ; WX 753 ; N Racute ; G 278 -U 341 ; WX 478 ; N racute ; G 279 -U 342 ; WX 753 ; N Rcommaaccent ; G 280 -U 343 ; WX 478 ; N rcommaaccent ; G 281 -U 344 ; WX 753 ; N Rcaron ; G 282 -U 345 ; WX 478 ; N rcaron ; G 283 -U 346 ; WX 685 ; N Sacute ; G 284 -U 347 ; WX 513 ; N sacute ; G 285 -U 348 ; WX 685 ; N Scircumflex ; G 286 -U 349 ; WX 513 ; N scircumflex ; G 287 -U 350 ; WX 685 ; N Scedilla ; G 288 -U 351 ; WX 513 ; N scedilla ; G 289 -U 352 ; WX 685 ; N Scaron ; G 290 -U 353 ; WX 513 ; N scaron ; G 291 -U 354 ; WX 667 ; N Tcommaaccent ; G 292 -U 355 ; WX 402 ; N tcommaaccent ; G 293 -U 356 ; WX 667 ; N Tcaron ; G 294 -U 357 ; WX 402 ; N tcaron ; G 295 -U 358 ; WX 667 ; N Tbar ; G 296 -U 359 ; WX 402 ; N tbar ; G 297 -U 360 ; WX 843 ; N Utilde ; G 298 -U 361 ; WX 644 ; N utilde ; G 299 -U 362 ; WX 843 ; N Umacron ; G 300 -U 363 ; WX 644 ; N umacron ; G 301 -U 364 ; WX 843 ; N Ubreve ; G 302 -U 365 ; WX 644 ; N ubreve ; G 303 -U 366 ; WX 843 ; N Uring ; G 304 -U 367 ; WX 644 ; N uring ; G 305 -U 368 ; WX 843 ; N Uhungarumlaut ; G 306 -U 369 ; WX 644 ; N uhungarumlaut ; G 307 -U 370 ; WX 843 ; N Uogonek ; G 308 -U 371 ; WX 644 ; N uogonek ; G 309 -U 372 ; WX 1028 ; N Wcircumflex ; G 310 -U 373 ; WX 856 ; N wcircumflex ; G 311 -U 374 ; WX 660 ; N Ycircumflex ; G 312 -U 375 ; WX 565 ; N ycircumflex ; G 313 -U 376 ; WX 660 ; N Ydieresis ; G 314 -U 377 ; WX 695 ; N Zacute ; G 315 -U 378 ; WX 527 ; N zacute ; G 316 -U 379 ; WX 695 ; N Zdotaccent ; G 317 -U 380 ; WX 527 ; N zdotaccent ; G 318 -U 381 ; WX 695 ; N Zcaron ; G 319 -U 382 ; WX 527 ; N zcaron ; G 320 -U 383 ; WX 370 ; N longs ; G 321 -U 384 ; WX 640 ; N uni0180 ; G 322 -U 385 ; WX 735 ; N uni0181 ; G 323 -U 386 ; WX 735 ; N uni0182 ; G 324 -U 387 ; WX 640 ; N uni0183 ; G 325 -U 388 ; WX 735 ; N uni0184 ; G 326 -U 389 ; WX 640 ; N uni0185 ; G 327 -U 390 ; WX 765 ; N uni0186 ; G 328 -U 391 ; WX 765 ; N uni0187 ; G 329 -U 392 ; WX 560 ; N uni0188 ; G 330 -U 393 ; WX 807 ; N uni0189 ; G 331 -U 394 ; WX 802 ; N uni018A ; G 332 -U 395 ; WX 735 ; N uni018B ; G 333 -U 396 ; WX 640 ; N uni018C ; G 334 -U 397 ; WX 602 ; N uni018D ; G 335 -U 398 ; WX 730 ; N uni018E ; G 336 -U 399 ; WX 820 ; N uni018F ; G 337 -U 400 ; WX 623 ; N uni0190 ; G 338 -U 401 ; WX 694 ; N uni0191 ; G 339 -U 402 ; WX 370 ; N florin ; G 340 -U 403 ; WX 799 ; N uni0193 ; G 341 -U 404 ; WX 712 ; N uni0194 ; G 342 -U 405 ; WX 932 ; N uni0195 ; G 343 -U 406 ; WX 395 ; N uni0196 ; G 344 -U 407 ; WX 395 ; N uni0197 ; G 345 -U 408 ; WX 747 ; N uni0198 ; G 346 -U 409 ; WX 606 ; N uni0199 ; G 347 -U 410 ; WX 320 ; N uni019A ; G 348 -U 411 ; WX 634 ; N uni019B ; G 349 -U 412 ; WX 948 ; N uni019C ; G 350 -U 413 ; WX 875 ; N uni019D ; G 351 -U 414 ; WX 644 ; N uni019E ; G 352 -U 415 ; WX 820 ; N uni019F ; G 353 -U 416 ; WX 820 ; N Ohorn ; G 354 -U 417 ; WX 602 ; N ohorn ; G 355 -U 418 ; WX 1040 ; N uni01A2 ; G 356 -U 419 ; WX 807 ; N uni01A3 ; G 357 -U 420 ; WX 673 ; N uni01A4 ; G 358 -U 421 ; WX 640 ; N uni01A5 ; G 359 -U 422 ; WX 753 ; N uni01A6 ; G 360 -U 423 ; WX 685 ; N uni01A7 ; G 361 -U 424 ; WX 513 ; N uni01A8 ; G 362 -U 425 ; WX 707 ; N uni01A9 ; G 363 -U 426 ; WX 324 ; N uni01AA ; G 364 -U 427 ; WX 402 ; N uni01AB ; G 365 -U 428 ; WX 667 ; N uni01AC ; G 366 -U 429 ; WX 402 ; N uni01AD ; G 367 -U 430 ; WX 667 ; N uni01AE ; G 368 -U 431 ; WX 843 ; N Uhorn ; G 369 -U 432 ; WX 644 ; N uhorn ; G 370 -U 433 ; WX 829 ; N uni01B1 ; G 371 -U 434 ; WX 760 ; N uni01B2 ; G 372 -U 435 ; WX 738 ; N uni01B3 ; G 373 -U 436 ; WX 663 ; N uni01B4 ; G 374 -U 437 ; WX 695 ; N uni01B5 ; G 375 -U 438 ; WX 527 ; N uni01B6 ; G 376 -U 439 ; WX 564 ; N uni01B7 ; G 377 -U 440 ; WX 564 ; N uni01B8 ; G 378 -U 441 ; WX 564 ; N uni01B9 ; G 379 -U 442 ; WX 564 ; N uni01BA ; G 380 -U 443 ; WX 636 ; N uni01BB ; G 381 -U 444 ; WX 687 ; N uni01BC ; G 382 -U 445 ; WX 564 ; N uni01BD ; G 383 -U 446 ; WX 536 ; N uni01BE ; G 384 -U 447 ; WX 635 ; N uni01BF ; G 385 -U 448 ; WX 295 ; N uni01C0 ; G 386 -U 449 ; WX 492 ; N uni01C1 ; G 387 -U 450 ; WX 459 ; N uni01C2 ; G 388 -U 451 ; WX 295 ; N uni01C3 ; G 389 -U 452 ; WX 1497 ; N uni01C4 ; G 390 -U 453 ; WX 1329 ; N uni01C5 ; G 391 -U 454 ; WX 1167 ; N uni01C6 ; G 392 -U 455 ; WX 1065 ; N uni01C7 ; G 393 -U 456 ; WX 974 ; N uni01C8 ; G 394 -U 457 ; WX 630 ; N uni01C9 ; G 395 -U 458 ; WX 1276 ; N uni01CA ; G 396 -U 459 ; WX 1185 ; N uni01CB ; G 397 -U 460 ; WX 954 ; N uni01CC ; G 398 -U 461 ; WX 722 ; N uni01CD ; G 399 -U 462 ; WX 596 ; N uni01CE ; G 400 -U 463 ; WX 395 ; N uni01CF ; G 401 -U 464 ; WX 320 ; N uni01D0 ; G 402 -U 465 ; WX 820 ; N uni01D1 ; G 403 -U 466 ; WX 602 ; N uni01D2 ; G 404 -U 467 ; WX 843 ; N uni01D3 ; G 405 -U 468 ; WX 644 ; N uni01D4 ; G 406 -U 469 ; WX 843 ; N uni01D5 ; G 407 -U 470 ; WX 644 ; N uni01D6 ; G 408 -U 471 ; WX 843 ; N uni01D7 ; G 409 -U 472 ; WX 644 ; N uni01D8 ; G 410 -U 473 ; WX 843 ; N uni01D9 ; G 411 -U 474 ; WX 644 ; N uni01DA ; G 412 -U 475 ; WX 843 ; N uni01DB ; G 413 -U 476 ; WX 644 ; N uni01DC ; G 414 -U 477 ; WX 592 ; N uni01DD ; G 415 -U 478 ; WX 722 ; N uni01DE ; G 416 -U 479 ; WX 596 ; N uni01DF ; G 417 -U 480 ; WX 722 ; N uni01E0 ; G 418 -U 481 ; WX 596 ; N uni01E1 ; G 419 -U 482 ; WX 1001 ; N uni01E2 ; G 420 -U 483 ; WX 940 ; N uni01E3 ; G 421 -U 484 ; WX 848 ; N uni01E4 ; G 422 -U 485 ; WX 640 ; N uni01E5 ; G 423 -U 486 ; WX 799 ; N Gcaron ; G 424 -U 487 ; WX 640 ; N gcaron ; G 425 -U 488 ; WX 747 ; N uni01E8 ; G 426 -U 489 ; WX 606 ; N uni01E9 ; G 427 -U 490 ; WX 820 ; N uni01EA ; G 428 -U 491 ; WX 602 ; N uni01EB ; G 429 -U 492 ; WX 820 ; N uni01EC ; G 430 -U 493 ; WX 602 ; N uni01ED ; G 431 -U 494 ; WX 564 ; N uni01EE ; G 432 -U 495 ; WX 564 ; N uni01EF ; G 433 -U 496 ; WX 320 ; N uni01F0 ; G 434 -U 497 ; WX 1497 ; N uni01F1 ; G 435 -U 498 ; WX 1329 ; N uni01F2 ; G 436 -U 499 ; WX 1167 ; N uni01F3 ; G 437 -U 500 ; WX 799 ; N uni01F4 ; G 438 -U 501 ; WX 640 ; N uni01F5 ; G 439 -U 502 ; WX 1154 ; N uni01F6 ; G 440 -U 503 ; WX 707 ; N uni01F7 ; G 441 -U 504 ; WX 875 ; N uni01F8 ; G 442 -U 505 ; WX 644 ; N uni01F9 ; G 443 -U 506 ; WX 722 ; N Aringacute ; G 444 -U 507 ; WX 596 ; N aringacute ; G 445 -U 508 ; WX 1001 ; N AEacute ; G 446 -U 509 ; WX 940 ; N aeacute ; G 447 -U 510 ; WX 820 ; N Oslashacute ; G 448 -U 511 ; WX 602 ; N oslashacute ; G 449 -U 512 ; WX 722 ; N uni0200 ; G 450 -U 513 ; WX 596 ; N uni0201 ; G 451 -U 514 ; WX 722 ; N uni0202 ; G 452 -U 515 ; WX 596 ; N uni0203 ; G 453 -U 516 ; WX 730 ; N uni0204 ; G 454 -U 517 ; WX 592 ; N uni0205 ; G 455 -U 518 ; WX 730 ; N uni0206 ; G 456 -U 519 ; WX 592 ; N uni0207 ; G 457 -U 520 ; WX 395 ; N uni0208 ; G 458 -U 521 ; WX 320 ; N uni0209 ; G 459 -U 522 ; WX 395 ; N uni020A ; G 460 -U 523 ; WX 320 ; N uni020B ; G 461 -U 524 ; WX 820 ; N uni020C ; G 462 -U 525 ; WX 602 ; N uni020D ; G 463 -U 526 ; WX 820 ; N uni020E ; G 464 -U 527 ; WX 602 ; N uni020F ; G 465 -U 528 ; WX 753 ; N uni0210 ; G 466 -U 529 ; WX 478 ; N uni0211 ; G 467 -U 530 ; WX 753 ; N uni0212 ; G 468 -U 531 ; WX 478 ; N uni0213 ; G 469 -U 532 ; WX 843 ; N uni0214 ; G 470 -U 533 ; WX 644 ; N uni0215 ; G 471 -U 534 ; WX 843 ; N uni0216 ; G 472 -U 535 ; WX 644 ; N uni0217 ; G 473 -U 536 ; WX 685 ; N Scommaaccent ; G 474 -U 537 ; WX 513 ; N scommaaccent ; G 475 -U 538 ; WX 667 ; N uni021A ; G 476 -U 539 ; WX 402 ; N uni021B ; G 477 -U 540 ; WX 627 ; N uni021C ; G 478 -U 541 ; WX 521 ; N uni021D ; G 479 -U 542 ; WX 872 ; N uni021E ; G 480 -U 543 ; WX 644 ; N uni021F ; G 481 -U 544 ; WX 843 ; N uni0220 ; G 482 -U 545 ; WX 814 ; N uni0221 ; G 483 -U 546 ; WX 572 ; N uni0222 ; G 484 -U 547 ; WX 552 ; N uni0223 ; G 485 -U 548 ; WX 695 ; N uni0224 ; G 486 -U 549 ; WX 527 ; N uni0225 ; G 487 -U 550 ; WX 722 ; N uni0226 ; G 488 -U 551 ; WX 596 ; N uni0227 ; G 489 -U 552 ; WX 730 ; N uni0228 ; G 490 -U 553 ; WX 592 ; N uni0229 ; G 491 -U 554 ; WX 820 ; N uni022A ; G 492 -U 555 ; WX 602 ; N uni022B ; G 493 -U 556 ; WX 820 ; N uni022C ; G 494 -U 557 ; WX 602 ; N uni022D ; G 495 -U 558 ; WX 820 ; N uni022E ; G 496 -U 559 ; WX 602 ; N uni022F ; G 497 -U 560 ; WX 820 ; N uni0230 ; G 498 -U 561 ; WX 602 ; N uni0231 ; G 499 -U 562 ; WX 660 ; N uni0232 ; G 500 -U 563 ; WX 565 ; N uni0233 ; G 501 -U 564 ; WX 500 ; N uni0234 ; G 502 -U 565 ; WX 832 ; N uni0235 ; G 503 -U 566 ; WX 494 ; N uni0236 ; G 504 -U 567 ; WX 310 ; N dotlessj ; G 505 -U 568 ; WX 960 ; N uni0238 ; G 506 -U 569 ; WX 960 ; N uni0239 ; G 507 -U 570 ; WX 722 ; N uni023A ; G 508 -U 571 ; WX 765 ; N uni023B ; G 509 -U 572 ; WX 560 ; N uni023C ; G 510 -U 573 ; WX 664 ; N uni023D ; G 511 -U 574 ; WX 667 ; N uni023E ; G 512 -U 575 ; WX 513 ; N uni023F ; G 513 -U 576 ; WX 527 ; N uni0240 ; G 514 -U 577 ; WX 583 ; N uni0241 ; G 515 -U 578 ; WX 464 ; N uni0242 ; G 516 -U 579 ; WX 735 ; N uni0243 ; G 517 -U 580 ; WX 843 ; N uni0244 ; G 518 -U 581 ; WX 722 ; N uni0245 ; G 519 -U 582 ; WX 730 ; N uni0246 ; G 520 -U 583 ; WX 592 ; N uni0247 ; G 521 -U 584 ; WX 401 ; N uni0248 ; G 522 -U 585 ; WX 315 ; N uni0249 ; G 523 -U 586 ; WX 782 ; N uni024A ; G 524 -U 587 ; WX 640 ; N uni024B ; G 525 -U 588 ; WX 753 ; N uni024C ; G 526 -U 589 ; WX 478 ; N uni024D ; G 527 -U 590 ; WX 660 ; N uni024E ; G 528 -U 591 ; WX 565 ; N uni024F ; G 529 -U 592 ; WX 596 ; N uni0250 ; G 530 -U 593 ; WX 640 ; N uni0251 ; G 531 -U 594 ; WX 640 ; N uni0252 ; G 532 -U 595 ; WX 640 ; N uni0253 ; G 533 -U 596 ; WX 560 ; N uni0254 ; G 534 -U 597 ; WX 560 ; N uni0255 ; G 535 -U 598 ; WX 647 ; N uni0256 ; G 536 -U 599 ; WX 683 ; N uni0257 ; G 537 -U 600 ; WX 592 ; N uni0258 ; G 538 -U 601 ; WX 592 ; N uni0259 ; G 539 -U 602 ; WX 843 ; N uni025A ; G 540 -U 603 ; WX 518 ; N uni025B ; G 541 -U 604 ; WX 509 ; N uni025C ; G 542 -U 605 ; WX 773 ; N uni025D ; G 543 -U 606 ; WX 613 ; N uni025E ; G 544 -U 607 ; WX 315 ; N uni025F ; G 545 -U 608 ; WX 683 ; N uni0260 ; G 546 -U 609 ; WX 640 ; N uni0261 ; G 547 -U 610 ; WX 580 ; N uni0262 ; G 548 -U 611 ; WX 599 ; N uni0263 ; G 549 -U 612 ; WX 564 ; N uni0264 ; G 550 -U 613 ; WX 644 ; N uni0265 ; G 551 -U 614 ; WX 644 ; N uni0266 ; G 552 -U 615 ; WX 644 ; N uni0267 ; G 553 -U 616 ; WX 320 ; N uni0268 ; G 554 -U 617 ; WX 392 ; N uni0269 ; G 555 -U 618 ; WX 320 ; N uni026A ; G 556 -U 619 ; WX 380 ; N uni026B ; G 557 -U 620 ; WX 454 ; N uni026C ; G 558 -U 621 ; WX 363 ; N uni026D ; G 559 -U 622 ; WX 704 ; N uni026E ; G 560 -U 623 ; WX 948 ; N uni026F ; G 561 -U 624 ; WX 948 ; N uni0270 ; G 562 -U 625 ; WX 948 ; N uni0271 ; G 563 -U 626 ; WX 644 ; N uni0272 ; G 564 -U 627 ; WX 694 ; N uni0273 ; G 565 -U 628 ; WX 646 ; N uni0274 ; G 566 -U 629 ; WX 602 ; N uni0275 ; G 567 -U 630 ; WX 790 ; N uni0276 ; G 568 -U 631 ; WX 821 ; N uni0277 ; G 569 -U 632 ; WX 692 ; N uni0278 ; G 570 -U 633 ; WX 501 ; N uni0279 ; G 571 -U 634 ; WX 501 ; N uni027A ; G 572 -U 635 ; WX 551 ; N uni027B ; G 573 -U 636 ; WX 478 ; N uni027C ; G 574 -U 637 ; WX 478 ; N uni027D ; G 575 -U 638 ; WX 453 ; N uni027E ; G 576 -U 639 ; WX 453 ; N uni027F ; G 577 -U 640 ; WX 581 ; N uni0280 ; G 578 -U 641 ; WX 581 ; N uni0281 ; G 579 -U 642 ; WX 513 ; N uni0282 ; G 580 -U 643 ; WX 271 ; N uni0283 ; G 581 -U 644 ; WX 370 ; N uni0284 ; G 582 -U 645 ; WX 487 ; N uni0285 ; G 583 -U 646 ; WX 324 ; N uni0286 ; G 584 -U 647 ; WX 402 ; N uni0287 ; G 585 -U 648 ; WX 402 ; N uni0288 ; G 586 -U 649 ; WX 644 ; N uni0289 ; G 587 -U 650 ; WX 620 ; N uni028A ; G 588 -U 651 ; WX 608 ; N uni028B ; G 589 -U 652 ; WX 565 ; N uni028C ; G 590 -U 653 ; WX 856 ; N uni028D ; G 591 -U 654 ; WX 565 ; N uni028E ; G 592 -U 655 ; WX 655 ; N uni028F ; G 593 -U 656 ; WX 597 ; N uni0290 ; G 594 -U 657 ; WX 560 ; N uni0291 ; G 595 -U 658 ; WX 564 ; N uni0292 ; G 596 -U 659 ; WX 560 ; N uni0293 ; G 597 -U 660 ; WX 536 ; N uni0294 ; G 598 -U 661 ; WX 536 ; N uni0295 ; G 599 -U 662 ; WX 536 ; N uni0296 ; G 600 -U 663 ; WX 420 ; N uni0297 ; G 601 -U 664 ; WX 820 ; N uni0298 ; G 602 -U 665 ; WX 563 ; N uni0299 ; G 603 -U 666 ; WX 613 ; N uni029A ; G 604 -U 667 ; WX 660 ; N uni029B ; G 605 -U 668 ; WX 667 ; N uni029C ; G 606 -U 669 ; WX 366 ; N uni029D ; G 607 -U 670 ; WX 606 ; N uni029E ; G 608 -U 671 ; WX 543 ; N uni029F ; G 609 -U 672 ; WX 683 ; N uni02A0 ; G 610 -U 673 ; WX 536 ; N uni02A1 ; G 611 -U 674 ; WX 536 ; N uni02A2 ; G 612 -U 675 ; WX 996 ; N uni02A3 ; G 613 -U 676 ; WX 1033 ; N uni02A4 ; G 614 -U 677 ; WX 998 ; N uni02A5 ; G 615 -U 678 ; WX 823 ; N uni02A6 ; G 616 -U 679 ; WX 598 ; N uni02A7 ; G 617 -U 680 ; WX 825 ; N uni02A8 ; G 618 -U 681 ; WX 894 ; N uni02A9 ; G 619 -U 682 ; WX 725 ; N uni02AA ; G 620 -U 683 ; WX 676 ; N uni02AB ; G 621 -U 684 ; WX 598 ; N uni02AC ; G 622 -U 685 ; WX 443 ; N uni02AD ; G 623 -U 686 ; WX 781 ; N uni02AE ; G 624 -U 687 ; WX 767 ; N uni02AF ; G 625 -U 688 ; WX 433 ; N uni02B0 ; G 626 -U 689 ; WX 430 ; N uni02B1 ; G 627 -U 690 ; WX 264 ; N uni02B2 ; G 628 -U 691 ; WX 347 ; N uni02B3 ; G 629 -U 692 ; WX 347 ; N uni02B4 ; G 630 -U 693 ; WX 430 ; N uni02B5 ; G 631 -U 694 ; WX 392 ; N uni02B6 ; G 632 -U 695 ; WX 585 ; N uni02B7 ; G 633 -U 696 ; WX 423 ; N uni02B8 ; G 634 -U 697 ; WX 278 ; N uni02B9 ; G 635 -U 698 ; WX 460 ; N uni02BA ; G 636 -U 699 ; WX 318 ; N uni02BB ; G 637 -U 700 ; WX 318 ; N uni02BC ; G 638 -U 701 ; WX 318 ; N uni02BD ; G 639 -U 702 ; WX 307 ; N uni02BE ; G 640 -U 703 ; WX 307 ; N uni02BF ; G 641 -U 704 ; WX 280 ; N uni02C0 ; G 642 -U 705 ; WX 281 ; N uni02C1 ; G 643 -U 706 ; WX 500 ; N uni02C2 ; G 644 -U 707 ; WX 500 ; N uni02C3 ; G 645 -U 708 ; WX 500 ; N uni02C4 ; G 646 -U 709 ; WX 500 ; N uni02C5 ; G 647 -U 710 ; WX 500 ; N circumflex ; G 648 -U 711 ; WX 500 ; N caron ; G 649 -U 712 ; WX 275 ; N uni02C8 ; G 650 -U 713 ; WX 500 ; N uni02C9 ; G 651 -U 714 ; WX 500 ; N uni02CA ; G 652 -U 715 ; WX 500 ; N uni02CB ; G 653 -U 716 ; WX 275 ; N uni02CC ; G 654 -U 717 ; WX 500 ; N uni02CD ; G 655 -U 720 ; WX 337 ; N uni02D0 ; G 656 -U 721 ; WX 337 ; N uni02D1 ; G 657 -U 722 ; WX 307 ; N uni02D2 ; G 658 -U 723 ; WX 307 ; N uni02D3 ; G 659 -U 726 ; WX 329 ; N uni02D6 ; G 660 -U 727 ; WX 329 ; N uni02D7 ; G 661 -U 728 ; WX 500 ; N breve ; G 662 -U 729 ; WX 500 ; N dotaccent ; G 663 -U 730 ; WX 500 ; N ring ; G 664 -U 731 ; WX 500 ; N ogonek ; G 665 -U 732 ; WX 500 ; N tilde ; G 666 -U 733 ; WX 500 ; N hungarumlaut ; G 667 -U 734 ; WX 417 ; N uni02DE ; G 668 -U 736 ; WX 377 ; N uni02E0 ; G 669 -U 737 ; WX 243 ; N uni02E1 ; G 670 -U 738 ; WX 337 ; N uni02E2 ; G 671 -U 739 ; WX 424 ; N uni02E3 ; G 672 -U 740 ; WX 281 ; N uni02E4 ; G 673 -U 741 ; WX 493 ; N uni02E5 ; G 674 -U 742 ; WX 493 ; N uni02E6 ; G 675 -U 743 ; WX 493 ; N uni02E7 ; G 676 -U 744 ; WX 493 ; N uni02E8 ; G 677 -U 745 ; WX 493 ; N uni02E9 ; G 678 -U 748 ; WX 500 ; N uni02EC ; G 679 -U 750 ; WX 484 ; N uni02EE ; G 680 -U 751 ; WX 500 ; N uni02EF ; G 681 -U 752 ; WX 500 ; N uni02F0 ; G 682 -U 755 ; WX 500 ; N uni02F3 ; G 683 -U 759 ; WX 500 ; N uni02F7 ; G 684 -U 768 ; WX 0 ; N gravecomb ; G 685 -U 769 ; WX 0 ; N acutecomb ; G 686 -U 770 ; WX 0 ; N uni0302 ; G 687 -U 771 ; WX 0 ; N tildecomb ; G 688 -U 772 ; WX 0 ; N uni0304 ; G 689 -U 773 ; WX 0 ; N uni0305 ; G 690 -U 774 ; WX 0 ; N uni0306 ; G 691 -U 775 ; WX 0 ; N uni0307 ; G 692 -U 776 ; WX 0 ; N uni0308 ; G 693 -U 777 ; WX 0 ; N hookabovecomb ; G 694 -U 778 ; WX 0 ; N uni030A ; G 695 -U 779 ; WX 0 ; N uni030B ; G 696 -U 780 ; WX 0 ; N uni030C ; G 697 -U 781 ; WX 0 ; N uni030D ; G 698 -U 782 ; WX 0 ; N uni030E ; G 699 -U 783 ; WX 0 ; N uni030F ; G 700 -U 784 ; WX 0 ; N uni0310 ; G 701 -U 785 ; WX 0 ; N uni0311 ; G 702 -U 786 ; WX 0 ; N uni0312 ; G 703 -U 787 ; WX 0 ; N uni0313 ; G 704 -U 788 ; WX 0 ; N uni0314 ; G 705 -U 789 ; WX 0 ; N uni0315 ; G 706 -U 790 ; WX 0 ; N uni0316 ; G 707 -U 791 ; WX 0 ; N uni0317 ; G 708 -U 792 ; WX 0 ; N uni0318 ; G 709 -U 793 ; WX 0 ; N uni0319 ; G 710 -U 794 ; WX 0 ; N uni031A ; G 711 -U 795 ; WX 0 ; N uni031B ; G 712 -U 796 ; WX 0 ; N uni031C ; G 713 -U 797 ; WX 0 ; N uni031D ; G 714 -U 798 ; WX 0 ; N uni031E ; G 715 -U 799 ; WX 0 ; N uni031F ; G 716 -U 800 ; WX 0 ; N uni0320 ; G 717 -U 801 ; WX 0 ; N uni0321 ; G 718 -U 802 ; WX 0 ; N uni0322 ; G 719 -U 803 ; WX 0 ; N dotbelowcomb ; G 720 -U 804 ; WX 0 ; N uni0324 ; G 721 -U 805 ; WX 0 ; N uni0325 ; G 722 -U 806 ; WX 0 ; N uni0326 ; G 723 -U 807 ; WX 0 ; N uni0327 ; G 724 -U 808 ; WX 0 ; N uni0328 ; G 725 -U 809 ; WX 0 ; N uni0329 ; G 726 -U 810 ; WX 0 ; N uni032A ; G 727 -U 811 ; WX 0 ; N uni032B ; G 728 -U 812 ; WX 0 ; N uni032C ; G 729 -U 813 ; WX 0 ; N uni032D ; G 730 -U 814 ; WX 0 ; N uni032E ; G 731 -U 815 ; WX 0 ; N uni032F ; G 732 -U 816 ; WX 0 ; N uni0330 ; G 733 -U 817 ; WX 0 ; N uni0331 ; G 734 -U 818 ; WX 0 ; N uni0332 ; G 735 -U 819 ; WX 0 ; N uni0333 ; G 736 -U 820 ; WX 0 ; N uni0334 ; G 737 -U 821 ; WX 0 ; N uni0335 ; G 738 -U 822 ; WX 0 ; N uni0336 ; G 739 -U 823 ; WX 0 ; N uni0337 ; G 740 -U 824 ; WX 0 ; N uni0338 ; G 741 -U 825 ; WX 0 ; N uni0339 ; G 742 -U 826 ; WX 0 ; N uni033A ; G 743 -U 827 ; WX 0 ; N uni033B ; G 744 -U 828 ; WX 0 ; N uni033C ; G 745 -U 829 ; WX 0 ; N uni033D ; G 746 -U 830 ; WX 0 ; N uni033E ; G 747 -U 831 ; WX 0 ; N uni033F ; G 748 -U 835 ; WX 0 ; N uni0343 ; G 749 -U 847 ; WX 0 ; N uni034F ; G 750 -U 856 ; WX 0 ; N uni0358 ; G 751 -U 864 ; WX 0 ; N uni0360 ; G 752 -U 865 ; WX 0 ; N uni0361 ; G 753 -U 880 ; WX 740 ; N uni0370 ; G 754 -U 881 ; WX 531 ; N uni0371 ; G 755 -U 882 ; WX 667 ; N uni0372 ; G 756 -U 883 ; WX 553 ; N uni0373 ; G 757 -U 884 ; WX 278 ; N uni0374 ; G 758 -U 885 ; WX 278 ; N uni0375 ; G 759 -U 886 ; WX 875 ; N uni0376 ; G 760 -U 887 ; WX 667 ; N uni0377 ; G 761 -U 890 ; WX 500 ; N uni037A ; G 762 -U 891 ; WX 560 ; N uni037B ; G 763 -U 892 ; WX 560 ; N uni037C ; G 764 -U 893 ; WX 560 ; N uni037D ; G 765 -U 894 ; WX 337 ; N uni037E ; G 766 -U 895 ; WX 401 ; N uni037F ; G 767 -U 900 ; WX 500 ; N tonos ; G 768 -U 901 ; WX 500 ; N dieresistonos ; G 769 -U 902 ; WX 722 ; N Alphatonos ; G 770 -U 903 ; WX 318 ; N anoteleia ; G 771 -U 904 ; WX 900 ; N Epsilontonos ; G 772 -U 905 ; WX 1039 ; N Etatonos ; G 773 -U 906 ; WX 562 ; N Iotatonos ; G 774 -U 908 ; WX 835 ; N Omicrontonos ; G 775 -U 910 ; WX 897 ; N Upsilontonos ; G 776 -U 911 ; WX 853 ; N Omegatonos ; G 777 -U 912 ; WX 392 ; N iotadieresistonos ; G 778 -U 913 ; WX 722 ; N Alpha ; G 779 -U 914 ; WX 735 ; N Beta ; G 780 -U 915 ; WX 694 ; N Gamma ; G 781 -U 916 ; WX 722 ; N uni0394 ; G 782 -U 917 ; WX 730 ; N Epsilon ; G 783 -U 918 ; WX 695 ; N Zeta ; G 784 -U 919 ; WX 872 ; N Eta ; G 785 -U 920 ; WX 820 ; N Theta ; G 786 -U 921 ; WX 395 ; N Iota ; G 787 -U 922 ; WX 747 ; N Kappa ; G 788 -U 923 ; WX 722 ; N Lambda ; G 789 -U 924 ; WX 1024 ; N Mu ; G 790 -U 925 ; WX 875 ; N Nu ; G 791 -U 926 ; WX 704 ; N Xi ; G 792 -U 927 ; WX 820 ; N Omicron ; G 793 -U 928 ; WX 872 ; N Pi ; G 794 -U 929 ; WX 673 ; N Rho ; G 795 -U 931 ; WX 707 ; N Sigma ; G 796 -U 932 ; WX 667 ; N Tau ; G 797 -U 933 ; WX 660 ; N Upsilon ; G 798 -U 934 ; WX 820 ; N Phi ; G 799 -U 935 ; WX 712 ; N Chi ; G 800 -U 936 ; WX 877 ; N Psi ; G 801 -U 937 ; WX 829 ; N Omega ; G 802 -U 938 ; WX 395 ; N Iotadieresis ; G 803 -U 939 ; WX 660 ; N Upsilondieresis ; G 804 -U 940 ; WX 675 ; N alphatonos ; G 805 -U 941 ; WX 518 ; N epsilontonos ; G 806 -U 942 ; WX 599 ; N etatonos ; G 807 -U 943 ; WX 392 ; N iotatonos ; G 808 -U 944 ; WX 608 ; N upsilondieresistonos ; G 809 -U 945 ; WX 675 ; N alpha ; G 810 -U 946 ; WX 578 ; N beta ; G 811 -U 947 ; WX 598 ; N gamma ; G 812 -U 948 ; WX 602 ; N delta ; G 813 -U 949 ; WX 518 ; N epsilon ; G 814 -U 950 ; WX 542 ; N zeta ; G 815 -U 951 ; WX 599 ; N eta ; G 816 -U 952 ; WX 602 ; N theta ; G 817 -U 953 ; WX 392 ; N iota ; G 818 -U 954 ; WX 625 ; N kappa ; G 819 -U 955 ; WX 634 ; N lambda ; G 820 -U 956 ; WX 650 ; N uni03BC ; G 821 -U 957 ; WX 608 ; N nu ; G 822 -U 958 ; WX 551 ; N xi ; G 823 -U 959 ; WX 602 ; N omicron ; G 824 -U 960 ; WX 657 ; N pi ; G 825 -U 961 ; WX 588 ; N rho ; G 826 -U 962 ; WX 560 ; N sigma1 ; G 827 -U 963 ; WX 683 ; N sigma ; G 828 -U 964 ; WX 553 ; N tau ; G 829 -U 965 ; WX 608 ; N upsilon ; G 830 -U 966 ; WX 700 ; N phi ; G 831 -U 967 ; WX 606 ; N chi ; G 832 -U 968 ; WX 784 ; N psi ; G 833 -U 969 ; WX 815 ; N omega ; G 834 -U 970 ; WX 392 ; N iotadieresis ; G 835 -U 971 ; WX 608 ; N upsilondieresis ; G 836 -U 972 ; WX 602 ; N omicrontonos ; G 837 -U 973 ; WX 608 ; N upsilontonos ; G 838 -U 974 ; WX 815 ; N omegatonos ; G 839 -U 975 ; WX 747 ; N uni03CF ; G 840 -U 976 ; WX 583 ; N uni03D0 ; G 841 -U 977 ; WX 715 ; N theta1 ; G 842 -U 978 ; WX 687 ; N Upsilon1 ; G 843 -U 979 ; WX 874 ; N uni03D3 ; G 844 -U 980 ; WX 687 ; N uni03D4 ; G 845 -U 981 ; WX 682 ; N phi1 ; G 846 -U 982 ; WX 815 ; N omega1 ; G 847 -U 983 ; WX 624 ; N uni03D7 ; G 848 -U 984 ; WX 820 ; N uni03D8 ; G 849 -U 985 ; WX 602 ; N uni03D9 ; G 850 -U 986 ; WX 765 ; N uni03DA ; G 851 -U 987 ; WX 560 ; N uni03DB ; G 852 -U 988 ; WX 694 ; N uni03DC ; G 853 -U 989 ; WX 463 ; N uni03DD ; G 854 -U 990 ; WX 590 ; N uni03DE ; G 855 -U 991 ; WX 660 ; N uni03DF ; G 856 -U 992 ; WX 782 ; N uni03E0 ; G 857 -U 993 ; WX 577 ; N uni03E1 ; G 858 -U 1008 ; WX 624 ; N uni03F0 ; G 859 -U 1009 ; WX 588 ; N uni03F1 ; G 860 -U 1010 ; WX 560 ; N uni03F2 ; G 861 -U 1011 ; WX 310 ; N uni03F3 ; G 862 -U 1012 ; WX 820 ; N uni03F4 ; G 863 -U 1013 ; WX 560 ; N uni03F5 ; G 864 -U 1014 ; WX 560 ; N uni03F6 ; G 865 -U 1015 ; WX 676 ; N uni03F7 ; G 866 -U 1016 ; WX 640 ; N uni03F8 ; G 867 -U 1017 ; WX 765 ; N uni03F9 ; G 868 -U 1018 ; WX 1024 ; N uni03FA ; G 869 -U 1019 ; WX 708 ; N uni03FB ; G 870 -U 1020 ; WX 588 ; N uni03FC ; G 871 -U 1021 ; WX 765 ; N uni03FD ; G 872 -U 1022 ; WX 765 ; N uni03FE ; G 873 -U 1023 ; WX 765 ; N uni03FF ; G 874 -U 1024 ; WX 730 ; N uni0400 ; G 875 -U 1025 ; WX 730 ; N uni0401 ; G 876 -U 1026 ; WX 799 ; N uni0402 ; G 877 -U 1027 ; WX 662 ; N uni0403 ; G 878 -U 1028 ; WX 765 ; N uni0404 ; G 879 -U 1029 ; WX 685 ; N uni0405 ; G 880 -U 1030 ; WX 395 ; N uni0406 ; G 881 -U 1031 ; WX 395 ; N uni0407 ; G 882 -U 1032 ; WX 401 ; N uni0408 ; G 883 -U 1033 ; WX 1084 ; N uni0409 ; G 884 -U 1034 ; WX 1118 ; N uni040A ; G 885 -U 1035 ; WX 872 ; N uni040B ; G 886 -U 1036 ; WX 774 ; N uni040C ; G 887 -U 1037 ; WX 872 ; N uni040D ; G 888 -U 1038 ; WX 723 ; N uni040E ; G 889 -U 1039 ; WX 872 ; N uni040F ; G 890 -U 1040 ; WX 757 ; N uni0410 ; G 891 -U 1041 ; WX 735 ; N uni0411 ; G 892 -U 1042 ; WX 735 ; N uni0412 ; G 893 -U 1043 ; WX 662 ; N uni0413 ; G 894 -U 1044 ; WX 813 ; N uni0414 ; G 895 -U 1045 ; WX 730 ; N uni0415 ; G 896 -U 1046 ; WX 1124 ; N uni0416 ; G 897 -U 1047 ; WX 623 ; N uni0417 ; G 898 -U 1048 ; WX 872 ; N uni0418 ; G 899 -U 1049 ; WX 872 ; N uni0419 ; G 900 -U 1050 ; WX 774 ; N uni041A ; G 901 -U 1051 ; WX 834 ; N uni041B ; G 902 -U 1052 ; WX 1024 ; N uni041C ; G 903 -U 1053 ; WX 872 ; N uni041D ; G 904 -U 1054 ; WX 820 ; N uni041E ; G 905 -U 1055 ; WX 872 ; N uni041F ; G 906 -U 1056 ; WX 673 ; N uni0420 ; G 907 -U 1057 ; WX 765 ; N uni0421 ; G 908 -U 1058 ; WX 667 ; N uni0422 ; G 909 -U 1059 ; WX 723 ; N uni0423 ; G 910 -U 1060 ; WX 830 ; N uni0424 ; G 911 -U 1061 ; WX 712 ; N uni0425 ; G 912 -U 1062 ; WX 872 ; N uni0426 ; G 913 -U 1063 ; WX 773 ; N uni0427 ; G 914 -U 1064 ; WX 1141 ; N uni0428 ; G 915 -U 1065 ; WX 1141 ; N uni0429 ; G 916 -U 1066 ; WX 794 ; N uni042A ; G 917 -U 1067 ; WX 984 ; N uni042B ; G 918 -U 1068 ; WX 674 ; N uni042C ; G 919 -U 1069 ; WX 765 ; N uni042D ; G 920 -U 1070 ; WX 1193 ; N uni042E ; G 921 -U 1071 ; WX 808 ; N uni042F ; G 922 -U 1072 ; WX 596 ; N uni0430 ; G 923 -U 1073 ; WX 602 ; N uni0431 ; G 924 -U 1074 ; WX 563 ; N uni0432 ; G 925 -U 1075 ; WX 524 ; N uni0433 ; G 926 -U 1076 ; WX 616 ; N uni0434 ; G 927 -U 1077 ; WX 592 ; N uni0435 ; G 928 -U 1078 ; WX 920 ; N uni0436 ; G 929 -U 1079 ; WX 545 ; N uni0437 ; G 930 -U 1080 ; WX 667 ; N uni0438 ; G 931 -U 1081 ; WX 667 ; N uni0439 ; G 932 -U 1082 ; WX 625 ; N uni043A ; G 933 -U 1083 ; WX 635 ; N uni043B ; G 934 -U 1084 ; WX 778 ; N uni043C ; G 935 -U 1085 ; WX 667 ; N uni043D ; G 936 -U 1086 ; WX 602 ; N uni043E ; G 937 -U 1087 ; WX 667 ; N uni043F ; G 938 -U 1088 ; WX 640 ; N uni0440 ; G 939 -U 1089 ; WX 560 ; N uni0441 ; G 940 -U 1090 ; WX 553 ; N uni0442 ; G 941 -U 1091 ; WX 588 ; N uni0443 ; G 942 -U 1092 ; WX 783 ; N uni0444 ; G 943 -U 1093 ; WX 564 ; N uni0445 ; G 944 -U 1094 ; WX 643 ; N uni0446 ; G 945 -U 1095 ; WX 661 ; N uni0447 ; G 946 -U 1096 ; WX 930 ; N uni0448 ; G 947 -U 1097 ; WX 930 ; N uni0449 ; G 948 -U 1098 ; WX 636 ; N uni044A ; G 949 -U 1099 ; WX 796 ; N uni044B ; G 950 -U 1100 ; WX 544 ; N uni044C ; G 951 -U 1101 ; WX 560 ; N uni044D ; G 952 -U 1102 ; WX 871 ; N uni044E ; G 953 -U 1103 ; WX 631 ; N uni044F ; G 954 -U 1104 ; WX 592 ; N uni0450 ; G 955 -U 1105 ; WX 592 ; N uni0451 ; G 956 -U 1106 ; WX 624 ; N uni0452 ; G 957 -U 1107 ; WX 524 ; N uni0453 ; G 958 -U 1108 ; WX 560 ; N uni0454 ; G 959 -U 1109 ; WX 513 ; N uni0455 ; G 960 -U 1110 ; WX 320 ; N uni0456 ; G 961 -U 1111 ; WX 320 ; N uni0457 ; G 962 -U 1112 ; WX 310 ; N uni0458 ; G 963 -U 1113 ; WX 843 ; N uni0459 ; G 964 -U 1114 ; WX 860 ; N uni045A ; G 965 -U 1115 ; WX 644 ; N uni045B ; G 966 -U 1116 ; WX 625 ; N uni045C ; G 967 -U 1117 ; WX 667 ; N uni045D ; G 968 -U 1118 ; WX 588 ; N uni045E ; G 969 -U 1119 ; WX 656 ; N uni045F ; G 970 -U 1122 ; WX 762 ; N uni0462 ; G 971 -U 1123 ; WX 603 ; N uni0463 ; G 972 -U 1124 ; WX 1129 ; N uni0464 ; G 973 -U 1125 ; WX 834 ; N uni0465 ; G 974 -U 1130 ; WX 1124 ; N uni046A ; G 975 -U 1131 ; WX 920 ; N uni046B ; G 976 -U 1132 ; WX 1359 ; N uni046C ; G 977 -U 1133 ; WX 1113 ; N uni046D ; G 978 -U 1136 ; WX 944 ; N uni0470 ; G 979 -U 1137 ; WX 902 ; N uni0471 ; G 980 -U 1138 ; WX 820 ; N uni0472 ; G 981 -U 1139 ; WX 552 ; N uni0473 ; G 982 -U 1140 ; WX 859 ; N uni0474 ; G 983 -U 1141 ; WX 678 ; N uni0475 ; G 984 -U 1142 ; WX 859 ; N uni0476 ; G 985 -U 1143 ; WX 678 ; N uni0477 ; G 986 -U 1164 ; WX 707 ; N uni048C ; G 987 -U 1165 ; WX 544 ; N uni048D ; G 988 -U 1168 ; WX 672 ; N uni0490 ; G 989 -U 1169 ; WX 529 ; N uni0491 ; G 990 -U 1170 ; WX 662 ; N uni0492 ; G 991 -U 1171 ; WX 523 ; N uni0493 ; G 992 -U 1172 ; WX 728 ; N uni0494 ; G 993 -U 1173 ; WX 614 ; N uni0495 ; G 994 -U 1174 ; WX 1124 ; N uni0496 ; G 995 -U 1175 ; WX 920 ; N uni0497 ; G 996 -U 1176 ; WX 636 ; N uni0498 ; G 997 -U 1177 ; WX 537 ; N uni0499 ; G 998 -U 1178 ; WX 774 ; N uni049A ; G 999 -U 1179 ; WX 606 ; N uni049B ; G 1000 -U 1182 ; WX 774 ; N uni049E ; G 1001 -U 1183 ; WX 625 ; N uni049F ; G 1002 -U 1184 ; WX 891 ; N uni04A0 ; G 1003 -U 1185 ; WX 717 ; N uni04A1 ; G 1004 -U 1186 ; WX 872 ; N uni04A2 ; G 1005 -U 1187 ; WX 641 ; N uni04A3 ; G 1006 -U 1188 ; WX 1139 ; N uni04A4 ; G 1007 -U 1189 ; WX 852 ; N uni04A5 ; G 1008 -U 1190 ; WX 1205 ; N uni04A6 ; G 1009 -U 1191 ; WX 941 ; N uni04A7 ; G 1010 -U 1194 ; WX 765 ; N uni04AA ; G 1011 -U 1195 ; WX 560 ; N uni04AB ; G 1012 -U 1196 ; WX 667 ; N uni04AC ; G 1013 -U 1197 ; WX 553 ; N uni04AD ; G 1014 -U 1198 ; WX 660 ; N uni04AE ; G 1015 -U 1199 ; WX 565 ; N uni04AF ; G 1016 -U 1200 ; WX 660 ; N uni04B0 ; G 1017 -U 1201 ; WX 565 ; N uni04B1 ; G 1018 -U 1202 ; WX 712 ; N uni04B2 ; G 1019 -U 1203 ; WX 564 ; N uni04B3 ; G 1020 -U 1204 ; WX 952 ; N uni04B4 ; G 1021 -U 1205 ; WX 732 ; N uni04B5 ; G 1022 -U 1206 ; WX 749 ; N uni04B6 ; G 1023 -U 1207 ; WX 690 ; N uni04B7 ; G 1024 -U 1210 ; WX 749 ; N uni04BA ; G 1025 -U 1211 ; WX 644 ; N uni04BB ; G 1026 -U 1216 ; WX 395 ; N uni04C0 ; G 1027 -U 1217 ; WX 1124 ; N uni04C1 ; G 1028 -U 1218 ; WX 920 ; N uni04C2 ; G 1029 -U 1219 ; WX 747 ; N uni04C3 ; G 1030 -U 1220 ; WX 606 ; N uni04C4 ; G 1031 -U 1223 ; WX 872 ; N uni04C7 ; G 1032 -U 1224 ; WX 667 ; N uni04C8 ; G 1033 -U 1227 ; WX 749 ; N uni04CB ; G 1034 -U 1228 ; WX 667 ; N uni04CC ; G 1035 -U 1231 ; WX 320 ; N uni04CF ; G 1036 -U 1232 ; WX 757 ; N uni04D0 ; G 1037 -U 1233 ; WX 596 ; N uni04D1 ; G 1038 -U 1234 ; WX 757 ; N uni04D2 ; G 1039 -U 1235 ; WX 596 ; N uni04D3 ; G 1040 -U 1236 ; WX 1001 ; N uni04D4 ; G 1041 -U 1237 ; WX 940 ; N uni04D5 ; G 1042 -U 1238 ; WX 730 ; N uni04D6 ; G 1043 -U 1239 ; WX 592 ; N uni04D7 ; G 1044 -U 1240 ; WX 820 ; N uni04D8 ; G 1045 -U 1241 ; WX 592 ; N uni04D9 ; G 1046 -U 1242 ; WX 820 ; N uni04DA ; G 1047 -U 1243 ; WX 592 ; N uni04DB ; G 1048 -U 1244 ; WX 1124 ; N uni04DC ; G 1049 -U 1245 ; WX 920 ; N uni04DD ; G 1050 -U 1246 ; WX 623 ; N uni04DE ; G 1051 -U 1247 ; WX 545 ; N uni04DF ; G 1052 -U 1248 ; WX 564 ; N uni04E0 ; G 1053 -U 1249 ; WX 564 ; N uni04E1 ; G 1054 -U 1250 ; WX 872 ; N uni04E2 ; G 1055 -U 1251 ; WX 667 ; N uni04E3 ; G 1056 -U 1252 ; WX 872 ; N uni04E4 ; G 1057 -U 1253 ; WX 667 ; N uni04E5 ; G 1058 -U 1254 ; WX 820 ; N uni04E6 ; G 1059 -U 1255 ; WX 602 ; N uni04E7 ; G 1060 -U 1256 ; WX 820 ; N uni04E8 ; G 1061 -U 1257 ; WX 602 ; N uni04E9 ; G 1062 -U 1258 ; WX 820 ; N uni04EA ; G 1063 -U 1259 ; WX 602 ; N uni04EB ; G 1064 -U 1260 ; WX 765 ; N uni04EC ; G 1065 -U 1261 ; WX 560 ; N uni04ED ; G 1066 -U 1262 ; WX 723 ; N uni04EE ; G 1067 -U 1263 ; WX 588 ; N uni04EF ; G 1068 -U 1264 ; WX 723 ; N uni04F0 ; G 1069 -U 1265 ; WX 588 ; N uni04F1 ; G 1070 -U 1266 ; WX 723 ; N uni04F2 ; G 1071 -U 1267 ; WX 588 ; N uni04F3 ; G 1072 -U 1268 ; WX 773 ; N uni04F4 ; G 1073 -U 1269 ; WX 661 ; N uni04F5 ; G 1074 -U 1270 ; WX 662 ; N uni04F6 ; G 1075 -U 1271 ; WX 524 ; N uni04F7 ; G 1076 -U 1272 ; WX 984 ; N uni04F8 ; G 1077 -U 1273 ; WX 796 ; N uni04F9 ; G 1078 -U 1296 ; WX 623 ; N uni0510 ; G 1079 -U 1297 ; WX 545 ; N uni0511 ; G 1080 -U 1298 ; WX 834 ; N uni0512 ; G 1081 -U 1299 ; WX 635 ; N uni0513 ; G 1082 -U 1300 ; WX 1198 ; N uni0514 ; G 1083 -U 1301 ; WX 919 ; N uni0515 ; G 1084 -U 1306 ; WX 820 ; N uni051A ; G 1085 -U 1307 ; WX 640 ; N uni051B ; G 1086 -U 1308 ; WX 1028 ; N uni051C ; G 1087 -U 1309 ; WX 856 ; N uni051D ; G 1088 -U 1329 ; WX 810 ; N uni0531 ; G 1089 -U 1330 ; WX 811 ; N uni0532 ; G 1090 -U 1331 ; WX 826 ; N uni0533 ; G 1091 -U 1332 ; WX 847 ; N uni0534 ; G 1092 -U 1333 ; WX 806 ; N uni0535 ; G 1093 -U 1334 ; WX 826 ; N uni0536 ; G 1094 -U 1335 ; WX 761 ; N uni0537 ; G 1095 -U 1336 ; WX 811 ; N uni0538 ; G 1096 -U 1337 ; WX 968 ; N uni0539 ; G 1097 -U 1338 ; WX 816 ; N uni053A ; G 1098 -U 1339 ; WX 772 ; N uni053B ; G 1099 -U 1340 ; WX 682 ; N uni053C ; G 1100 -U 1341 ; WX 1097 ; N uni053D ; G 1101 -U 1342 ; WX 845 ; N uni053E ; G 1102 -U 1343 ; WX 804 ; N uni053F ; G 1103 -U 1344 ; WX 719 ; N uni0540 ; G 1104 -U 1345 ; WX 810 ; N uni0541 ; G 1105 -U 1346 ; WX 833 ; N uni0542 ; G 1106 -U 1347 ; WX 843 ; N uni0543 ; G 1107 -U 1348 ; WX 897 ; N uni0544 ; G 1108 -U 1349 ; WX 763 ; N uni0545 ; G 1109 -U 1350 ; WX 794 ; N uni0546 ; G 1110 -U 1351 ; WX 754 ; N uni0547 ; G 1111 -U 1352 ; WX 799 ; N uni0548 ; G 1112 -U 1353 ; WX 797 ; N uni0549 ; G 1113 -U 1354 ; WX 875 ; N uni054A ; G 1114 -U 1355 ; WX 830 ; N uni054B ; G 1115 -U 1356 ; WX 884 ; N uni054C ; G 1116 -U 1357 ; WX 799 ; N uni054D ; G 1117 -U 1358 ; WX 802 ; N uni054E ; G 1118 -U 1359 ; WX 731 ; N uni054F ; G 1119 -U 1360 ; WX 774 ; N uni0550 ; G 1120 -U 1361 ; WX 749 ; N uni0551 ; G 1121 -U 1362 ; WX 633 ; N uni0552 ; G 1122 -U 1363 ; WX 845 ; N uni0553 ; G 1123 -U 1364 ; WX 843 ; N uni0554 ; G 1124 -U 1365 ; WX 835 ; N uni0555 ; G 1125 -U 1366 ; WX 821 ; N uni0556 ; G 1126 -U 1369 ; WX 307 ; N uni0559 ; G 1127 -U 1370 ; WX 264 ; N uni055A ; G 1128 -U 1371 ; WX 229 ; N uni055B ; G 1129 -U 1372 ; WX 391 ; N uni055C ; G 1130 -U 1373 ; WX 364 ; N uni055D ; G 1131 -U 1374 ; WX 386 ; N uni055E ; G 1132 -U 1375 ; WX 500 ; N uni055F ; G 1133 -U 1377 ; WX 949 ; N uni0561 ; G 1134 -U 1378 ; WX 618 ; N uni0562 ; G 1135 -U 1379 ; WX 695 ; N uni0563 ; G 1136 -U 1380 ; WX 695 ; N uni0564 ; G 1137 -U 1381 ; WX 628 ; N uni0565 ; G 1138 -U 1382 ; WX 688 ; N uni0566 ; G 1139 -U 1383 ; WX 510 ; N uni0567 ; G 1140 -U 1384 ; WX 636 ; N uni0568 ; G 1141 -U 1385 ; WX 791 ; N uni0569 ; G 1142 -U 1386 ; WX 671 ; N uni056A ; G 1143 -U 1387 ; WX 635 ; N uni056B ; G 1144 -U 1388 ; WX 305 ; N uni056C ; G 1145 -U 1389 ; WX 973 ; N uni056D ; G 1146 -U 1390 ; WX 614 ; N uni056E ; G 1147 -U 1391 ; WX 628 ; N uni056F ; G 1148 -U 1392 ; WX 636 ; N uni0570 ; G 1149 -U 1393 ; WX 630 ; N uni0571 ; G 1150 -U 1394 ; WX 636 ; N uni0572 ; G 1151 -U 1395 ; WX 654 ; N uni0573 ; G 1152 -U 1396 ; WX 644 ; N uni0574 ; G 1153 -U 1397 ; WX 309 ; N uni0575 ; G 1154 -U 1398 ; WX 636 ; N uni0576 ; G 1155 -U 1399 ; WX 461 ; N uni0577 ; G 1156 -U 1400 ; WX 649 ; N uni0578 ; G 1157 -U 1401 ; WX 365 ; N uni0579 ; G 1158 -U 1402 ; WX 940 ; N uni057A ; G 1159 -U 1403 ; WX 562 ; N uni057B ; G 1160 -U 1404 ; WX 657 ; N uni057C ; G 1161 -U 1405 ; WX 644 ; N uni057D ; G 1162 -U 1406 ; WX 630 ; N uni057E ; G 1163 -U 1407 ; WX 930 ; N uni057F ; G 1164 -U 1408 ; WX 644 ; N uni0580 ; G 1165 -U 1409 ; WX 643 ; N uni0581 ; G 1166 -U 1410 ; WX 483 ; N uni0582 ; G 1167 -U 1411 ; WX 930 ; N uni0583 ; G 1168 -U 1412 ; WX 636 ; N uni0584 ; G 1169 -U 1413 ; WX 609 ; N uni0585 ; G 1170 -U 1414 ; WX 809 ; N uni0586 ; G 1171 -U 1415 ; WX 789 ; N uni0587 ; G 1172 -U 1417 ; WX 340 ; N uni0589 ; G 1173 -U 1418 ; WX 334 ; N uni058A ; G 1174 -U 3647 ; WX 636 ; N uni0E3F ; G 1175 -U 4256 ; WX 723 ; N uni10A0 ; G 1176 -U 4257 ; WX 850 ; N uni10A1 ; G 1177 -U 4258 ; WX 828 ; N uni10A2 ; G 1178 -U 4259 ; WX 859 ; N uni10A3 ; G 1179 -U 4260 ; WX 733 ; N uni10A4 ; G 1180 -U 4261 ; WX 981 ; N uni10A5 ; G 1181 -U 4262 ; WX 916 ; N uni10A6 ; G 1182 -U 4263 ; WX 1101 ; N uni10A7 ; G 1183 -U 4264 ; WX 566 ; N uni10A8 ; G 1184 -U 4265 ; WX 750 ; N uni10A9 ; G 1185 -U 4266 ; WX 962 ; N uni10AA ; G 1186 -U 4267 ; WX 941 ; N uni10AB ; G 1187 -U 4268 ; WX 743 ; N uni10AC ; G 1188 -U 4269 ; WX 1075 ; N uni10AD ; G 1189 -U 4270 ; WX 896 ; N uni10AE ; G 1190 -U 4271 ; WX 829 ; N uni10AF ; G 1191 -U 4272 ; WX 1040 ; N uni10B0 ; G 1192 -U 4273 ; WX 733 ; N uni10B1 ; G 1193 -U 4274 ; WX 669 ; N uni10B2 ; G 1194 -U 4275 ; WX 1015 ; N uni10B3 ; G 1195 -U 4276 ; WX 937 ; N uni10B4 ; G 1196 -U 4277 ; WX 1020 ; N uni10B5 ; G 1197 -U 4278 ; WX 731 ; N uni10B6 ; G 1198 -U 4279 ; WX 733 ; N uni10B7 ; G 1199 -U 4280 ; WX 732 ; N uni10B8 ; G 1200 -U 4281 ; WX 733 ; N uni10B9 ; G 1201 -U 4282 ; WX 879 ; N uni10BA ; G 1202 -U 4283 ; WX 937 ; N uni10BB ; G 1203 -U 4284 ; WX 714 ; N uni10BC ; G 1204 -U 4285 ; WX 755 ; N uni10BD ; G 1205 -U 4286 ; WX 733 ; N uni10BE ; G 1206 -U 4287 ; WX 958 ; N uni10BF ; G 1207 -U 4288 ; WX 1000 ; N uni10C0 ; G 1208 -U 4289 ; WX 702 ; N uni10C1 ; G 1209 -U 4290 ; WX 864 ; N uni10C2 ; G 1210 -U 4291 ; WX 734 ; N uni10C3 ; G 1211 -U 4292 ; WX 837 ; N uni10C4 ; G 1212 -U 4293 ; WX 951 ; N uni10C5 ; G 1213 -U 4304 ; WX 541 ; N uni10D0 ; G 1214 -U 4305 ; WX 571 ; N uni10D1 ; G 1215 -U 4306 ; WX 589 ; N uni10D2 ; G 1216 -U 4307 ; WX 833 ; N uni10D3 ; G 1217 -U 4308 ; WX 561 ; N uni10D4 ; G 1218 -U 4309 ; WX 557 ; N uni10D5 ; G 1219 -U 4310 ; WX 618 ; N uni10D6 ; G 1220 -U 4311 ; WX 861 ; N uni10D7 ; G 1221 -U 4312 ; WX 560 ; N uni10D8 ; G 1222 -U 4313 ; WX 546 ; N uni10D9 ; G 1223 -U 4314 ; WX 1066 ; N uni10DA ; G 1224 -U 4315 ; WX 586 ; N uni10DB ; G 1225 -U 4316 ; WX 586 ; N uni10DC ; G 1226 -U 4317 ; WX 825 ; N uni10DD ; G 1227 -U 4318 ; WX 570 ; N uni10DE ; G 1228 -U 4319 ; WX 581 ; N uni10DF ; G 1229 -U 4320 ; WX 824 ; N uni10E0 ; G 1230 -U 4321 ; WX 607 ; N uni10E1 ; G 1231 -U 4322 ; WX 748 ; N uni10E2 ; G 1232 -U 4323 ; WX 698 ; N uni10E3 ; G 1233 -U 4324 ; WX 815 ; N uni10E4 ; G 1234 -U 4325 ; WX 585 ; N uni10E5 ; G 1235 -U 4326 ; WX 858 ; N uni10E6 ; G 1236 -U 4327 ; WX 568 ; N uni10E7 ; G 1237 -U 4328 ; WX 594 ; N uni10E8 ; G 1238 -U 4329 ; WX 586 ; N uni10E9 ; G 1239 -U 4330 ; WX 675 ; N uni10EA ; G 1240 -U 4331 ; WX 587 ; N uni10EB ; G 1241 -U 4332 ; WX 582 ; N uni10EC ; G 1242 -U 4333 ; WX 576 ; N uni10ED ; G 1243 -U 4334 ; WX 612 ; N uni10EE ; G 1244 -U 4335 ; WX 683 ; N uni10EF ; G 1245 -U 4336 ; WX 572 ; N uni10F0 ; G 1246 -U 4337 ; WX 603 ; N uni10F1 ; G 1247 -U 4338 ; WX 571 ; N uni10F2 ; G 1248 -U 4339 ; WX 572 ; N uni10F3 ; G 1249 -U 4340 ; WX 570 ; N uni10F4 ; G 1250 -U 4341 ; WX 649 ; N uni10F5 ; G 1251 -U 4342 ; WX 886 ; N uni10F6 ; G 1252 -U 4343 ; WX 626 ; N uni10F7 ; G 1253 -U 4344 ; WX 582 ; N uni10F8 ; G 1254 -U 4345 ; WX 619 ; N uni10F9 ; G 1255 -U 4346 ; WX 571 ; N uni10FA ; G 1256 -U 4347 ; WX 437 ; N uni10FB ; G 1257 -U 4348 ; WX 354 ; N uni10FC ; G 1258 -U 7424 ; WX 565 ; N uni1D00 ; G 1259 -U 7425 ; WX 774 ; N uni1D01 ; G 1260 -U 7426 ; WX 940 ; N uni1D02 ; G 1261 -U 7427 ; WX 563 ; N uni1D03 ; G 1262 -U 7428 ; WX 560 ; N uni1D04 ; G 1263 -U 7429 ; WX 585 ; N uni1D05 ; G 1264 -U 7430 ; WX 585 ; N uni1D06 ; G 1265 -U 7431 ; WX 553 ; N uni1D07 ; G 1266 -U 7432 ; WX 509 ; N uni1D08 ; G 1267 -U 7433 ; WX 320 ; N uni1D09 ; G 1268 -U 7434 ; WX 499 ; N uni1D0A ; G 1269 -U 7435 ; WX 625 ; N uni1D0B ; G 1270 -U 7436 ; WX 543 ; N uni1D0C ; G 1271 -U 7437 ; WX 778 ; N uni1D0D ; G 1272 -U 7438 ; WX 667 ; N uni1D0E ; G 1273 -U 7439 ; WX 602 ; N uni1D0F ; G 1274 -U 7440 ; WX 560 ; N uni1D10 ; G 1275 -U 7441 ; WX 647 ; N uni1D11 ; G 1276 -U 7442 ; WX 647 ; N uni1D12 ; G 1277 -U 7443 ; WX 647 ; N uni1D13 ; G 1278 -U 7444 ; WX 989 ; N uni1D14 ; G 1279 -U 7445 ; WX 512 ; N uni1D15 ; G 1280 -U 7446 ; WX 602 ; N uni1D16 ; G 1281 -U 7447 ; WX 602 ; N uni1D17 ; G 1282 -U 7448 ; WX 553 ; N uni1D18 ; G 1283 -U 7449 ; WX 594 ; N uni1D19 ; G 1284 -U 7450 ; WX 594 ; N uni1D1A ; G 1285 -U 7451 ; WX 553 ; N uni1D1B ; G 1286 -U 7452 ; WX 585 ; N uni1D1C ; G 1287 -U 7453 ; WX 664 ; N uni1D1D ; G 1288 -U 7454 ; WX 923 ; N uni1D1E ; G 1289 -U 7455 ; WX 655 ; N uni1D1F ; G 1290 -U 7456 ; WX 565 ; N uni1D20 ; G 1291 -U 7457 ; WX 856 ; N uni1D21 ; G 1292 -U 7458 ; WX 527 ; N uni1D22 ; G 1293 -U 7459 ; WX 527 ; N uni1D23 ; G 1294 -U 7460 ; WX 531 ; N uni1D24 ; G 1295 -U 7461 ; WX 743 ; N uni1D25 ; G 1296 -U 7462 ; WX 524 ; N uni1D26 ; G 1297 -U 7463 ; WX 565 ; N uni1D27 ; G 1298 -U 7464 ; WX 657 ; N uni1D28 ; G 1299 -U 7465 ; WX 553 ; N uni1D29 ; G 1300 -U 7466 ; WX 703 ; N uni1D2A ; G 1301 -U 7467 ; WX 635 ; N uni1D2B ; G 1302 -U 7468 ; WX 455 ; N uni1D2C ; G 1303 -U 7469 ; WX 630 ; N uni1D2D ; G 1304 -U 7470 ; WX 463 ; N uni1D2E ; G 1305 -U 7471 ; WX 463 ; N uni1D2F ; G 1306 -U 7472 ; WX 505 ; N uni1D30 ; G 1307 -U 7473 ; WX 459 ; N uni1D31 ; G 1308 -U 7474 ; WX 459 ; N uni1D32 ; G 1309 -U 7475 ; WX 503 ; N uni1D33 ; G 1310 -U 7476 ; WX 549 ; N uni1D34 ; G 1311 -U 7477 ; WX 249 ; N uni1D35 ; G 1312 -U 7478 ; WX 252 ; N uni1D36 ; G 1313 -U 7479 ; WX 470 ; N uni1D37 ; G 1314 -U 7480 ; WX 418 ; N uni1D38 ; G 1315 -U 7481 ; WX 645 ; N uni1D39 ; G 1316 -U 7482 ; WX 551 ; N uni1D3A ; G 1317 -U 7483 ; WX 551 ; N uni1D3B ; G 1318 -U 7484 ; WX 516 ; N uni1D3C ; G 1319 -U 7485 ; WX 369 ; N uni1D3D ; G 1320 -U 7486 ; WX 424 ; N uni1D3E ; G 1321 -U 7487 ; WX 474 ; N uni1D3F ; G 1322 -U 7488 ; WX 420 ; N uni1D40 ; G 1323 -U 7489 ; WX 531 ; N uni1D41 ; G 1324 -U 7490 ; WX 647 ; N uni1D42 ; G 1325 -U 7491 ; WX 386 ; N uni1D43 ; G 1326 -U 7492 ; WX 386 ; N uni1D44 ; G 1327 -U 7493 ; WX 400 ; N uni1D45 ; G 1328 -U 7494 ; WX 618 ; N uni1D46 ; G 1329 -U 7495 ; WX 400 ; N uni1D47 ; G 1330 -U 7496 ; WX 400 ; N uni1D48 ; G 1331 -U 7497 ; WX 387 ; N uni1D49 ; G 1332 -U 7498 ; WX 387 ; N uni1D4A ; G 1333 -U 7499 ; WX 340 ; N uni1D4B ; G 1334 -U 7500 ; WX 340 ; N uni1D4C ; G 1335 -U 7501 ; WX 400 ; N uni1D4D ; G 1336 -U 7502 ; WX 175 ; N uni1D4E ; G 1337 -U 7503 ; WX 365 ; N uni1D4F ; G 1338 -U 7504 ; WX 613 ; N uni1D50 ; G 1339 -U 7505 ; WX 399 ; N uni1D51 ; G 1340 -U 7506 ; WX 385 ; N uni1D52 ; G 1341 -U 7507 ; WX 346 ; N uni1D53 ; G 1342 -U 7508 ; WX 385 ; N uni1D54 ; G 1343 -U 7509 ; WX 385 ; N uni1D55 ; G 1344 -U 7510 ; WX 400 ; N uni1D56 ; G 1345 -U 7511 ; WX 247 ; N uni1D57 ; G 1346 -U 7512 ; WX 399 ; N uni1D58 ; G 1347 -U 7513 ; WX 418 ; N uni1D59 ; G 1348 -U 7514 ; WX 613 ; N uni1D5A ; G 1349 -U 7515 ; WX 373 ; N uni1D5B ; G 1350 -U 7516 ; WX 468 ; N uni1D5C ; G 1351 -U 7517 ; WX 364 ; N uni1D5D ; G 1352 -U 7518 ; WX 376 ; N uni1D5E ; G 1353 -U 7519 ; WX 379 ; N uni1D5F ; G 1354 -U 7520 ; WX 441 ; N uni1D60 ; G 1355 -U 7521 ; WX 381 ; N uni1D61 ; G 1356 -U 7522 ; WX 201 ; N uni1D62 ; G 1357 -U 7523 ; WX 347 ; N uni1D63 ; G 1358 -U 7524 ; WX 399 ; N uni1D64 ; G 1359 -U 7525 ; WX 373 ; N uni1D65 ; G 1360 -U 7526 ; WX 364 ; N uni1D66 ; G 1361 -U 7527 ; WX 376 ; N uni1D67 ; G 1362 -U 7528 ; WX 370 ; N uni1D68 ; G 1363 -U 7529 ; WX 441 ; N uni1D69 ; G 1364 -U 7530 ; WX 381 ; N uni1D6A ; G 1365 -U 7531 ; WX 974 ; N uni1D6B ; G 1366 -U 7543 ; WX 640 ; N uni1D77 ; G 1367 -U 7544 ; WX 549 ; N uni1D78 ; G 1368 -U 7547 ; WX 320 ; N uni1D7B ; G 1369 -U 7548 ; WX 392 ; N uni1D7C ; G 1370 -U 7549 ; WX 640 ; N uni1D7D ; G 1371 -U 7550 ; WX 585 ; N uni1D7E ; G 1372 -U 7551 ; WX 620 ; N uni1D7F ; G 1373 -U 7557 ; WX 320 ; N uni1D85 ; G 1374 -U 7579 ; WX 400 ; N uni1D9B ; G 1375 -U 7580 ; WX 346 ; N uni1D9C ; G 1376 -U 7581 ; WX 346 ; N uni1D9D ; G 1377 -U 7582 ; WX 385 ; N uni1D9E ; G 1378 -U 7583 ; WX 340 ; N uni1D9F ; G 1379 -U 7584 ; WX 222 ; N uni1DA0 ; G 1380 -U 7585 ; WX 229 ; N uni1DA1 ; G 1381 -U 7586 ; WX 400 ; N uni1DA2 ; G 1382 -U 7587 ; WX 399 ; N uni1DA3 ; G 1383 -U 7588 ; WX 234 ; N uni1DA4 ; G 1384 -U 7589 ; WX 244 ; N uni1DA5 ; G 1385 -U 7590 ; WX 234 ; N uni1DA6 ; G 1386 -U 7591 ; WX 234 ; N uni1DA7 ; G 1387 -U 7592 ; WX 230 ; N uni1DA8 ; G 1388 -U 7593 ; WX 175 ; N uni1DA9 ; G 1389 -U 7594 ; WX 175 ; N uni1DAA ; G 1390 -U 7595 ; WX 367 ; N uni1DAB ; G 1391 -U 7596 ; WX 613 ; N uni1DAC ; G 1392 -U 7597 ; WX 613 ; N uni1DAD ; G 1393 -U 7598 ; WX 407 ; N uni1DAE ; G 1394 -U 7599 ; WX 404 ; N uni1DAF ; G 1395 -U 7600 ; WX 399 ; N uni1DB0 ; G 1396 -U 7601 ; WX 385 ; N uni1DB1 ; G 1397 -U 7602 ; WX 385 ; N uni1DB2 ; G 1398 -U 7603 ; WX 328 ; N uni1DB3 ; G 1399 -U 7604 ; WX 211 ; N uni1DB4 ; G 1400 -U 7605 ; WX 247 ; N uni1DB5 ; G 1401 -U 7606 ; WX 399 ; N uni1DB6 ; G 1402 -U 7607 ; WX 389 ; N uni1DB7 ; G 1403 -U 7608 ; WX 368 ; N uni1DB8 ; G 1404 -U 7609 ; WX 376 ; N uni1DB9 ; G 1405 -U 7610 ; WX 373 ; N uni1DBA ; G 1406 -U 7611 ; WX 331 ; N uni1DBB ; G 1407 -U 7612 ; WX 331 ; N uni1DBC ; G 1408 -U 7613 ; WX 331 ; N uni1DBD ; G 1409 -U 7614 ; WX 364 ; N uni1DBE ; G 1410 -U 7615 ; WX 385 ; N uni1DBF ; G 1411 -U 7620 ; WX 0 ; N uni1DC4 ; G 1412 -U 7621 ; WX 0 ; N uni1DC5 ; G 1413 -U 7622 ; WX 0 ; N uni1DC6 ; G 1414 -U 7623 ; WX 0 ; N uni1DC7 ; G 1415 -U 7624 ; WX 0 ; N uni1DC8 ; G 1416 -U 7625 ; WX 0 ; N uni1DC9 ; G 1417 -U 7680 ; WX 722 ; N uni1E00 ; G 1418 -U 7681 ; WX 596 ; N uni1E01 ; G 1419 -U 7682 ; WX 735 ; N uni1E02 ; G 1420 -U 7683 ; WX 640 ; N uni1E03 ; G 1421 -U 7684 ; WX 735 ; N uni1E04 ; G 1422 -U 7685 ; WX 640 ; N uni1E05 ; G 1423 -U 7686 ; WX 735 ; N uni1E06 ; G 1424 -U 7687 ; WX 640 ; N uni1E07 ; G 1425 -U 7688 ; WX 765 ; N uni1E08 ; G 1426 -U 7689 ; WX 560 ; N uni1E09 ; G 1427 -U 7690 ; WX 802 ; N uni1E0A ; G 1428 -U 7691 ; WX 640 ; N uni1E0B ; G 1429 -U 7692 ; WX 802 ; N uni1E0C ; G 1430 -U 7693 ; WX 640 ; N uni1E0D ; G 1431 -U 7694 ; WX 802 ; N uni1E0E ; G 1432 -U 7695 ; WX 640 ; N uni1E0F ; G 1433 -U 7696 ; WX 802 ; N uni1E10 ; G 1434 -U 7697 ; WX 640 ; N uni1E11 ; G 1435 -U 7698 ; WX 802 ; N uni1E12 ; G 1436 -U 7699 ; WX 640 ; N uni1E13 ; G 1437 -U 7700 ; WX 730 ; N uni1E14 ; G 1438 -U 7701 ; WX 592 ; N uni1E15 ; G 1439 -U 7702 ; WX 730 ; N uni1E16 ; G 1440 -U 7703 ; WX 592 ; N uni1E17 ; G 1441 -U 7704 ; WX 730 ; N uni1E18 ; G 1442 -U 7705 ; WX 592 ; N uni1E19 ; G 1443 -U 7706 ; WX 730 ; N uni1E1A ; G 1444 -U 7707 ; WX 592 ; N uni1E1B ; G 1445 -U 7708 ; WX 730 ; N uni1E1C ; G 1446 -U 7709 ; WX 592 ; N uni1E1D ; G 1447 -U 7710 ; WX 694 ; N uni1E1E ; G 1448 -U 7711 ; WX 370 ; N uni1E1F ; G 1449 -U 7712 ; WX 799 ; N uni1E20 ; G 1450 -U 7713 ; WX 640 ; N uni1E21 ; G 1451 -U 7714 ; WX 872 ; N uni1E22 ; G 1452 -U 7715 ; WX 644 ; N uni1E23 ; G 1453 -U 7716 ; WX 872 ; N uni1E24 ; G 1454 -U 7717 ; WX 644 ; N uni1E25 ; G 1455 -U 7718 ; WX 872 ; N uni1E26 ; G 1456 -U 7719 ; WX 644 ; N uni1E27 ; G 1457 -U 7720 ; WX 872 ; N uni1E28 ; G 1458 -U 7721 ; WX 644 ; N uni1E29 ; G 1459 -U 7722 ; WX 872 ; N uni1E2A ; G 1460 -U 7723 ; WX 644 ; N uni1E2B ; G 1461 -U 7724 ; WX 395 ; N uni1E2C ; G 1462 -U 7725 ; WX 320 ; N uni1E2D ; G 1463 -U 7726 ; WX 395 ; N uni1E2E ; G 1464 -U 7727 ; WX 320 ; N uni1E2F ; G 1465 -U 7728 ; WX 747 ; N uni1E30 ; G 1466 -U 7729 ; WX 606 ; N uni1E31 ; G 1467 -U 7730 ; WX 747 ; N uni1E32 ; G 1468 -U 7731 ; WX 606 ; N uni1E33 ; G 1469 -U 7732 ; WX 747 ; N uni1E34 ; G 1470 -U 7733 ; WX 606 ; N uni1E35 ; G 1471 -U 7734 ; WX 664 ; N uni1E36 ; G 1472 -U 7735 ; WX 320 ; N uni1E37 ; G 1473 -U 7736 ; WX 664 ; N uni1E38 ; G 1474 -U 7737 ; WX 320 ; N uni1E39 ; G 1475 -U 7738 ; WX 664 ; N uni1E3A ; G 1476 -U 7739 ; WX 320 ; N uni1E3B ; G 1477 -U 7740 ; WX 664 ; N uni1E3C ; G 1478 -U 7741 ; WX 320 ; N uni1E3D ; G 1479 -U 7742 ; WX 1024 ; N uni1E3E ; G 1480 -U 7743 ; WX 948 ; N uni1E3F ; G 1481 -U 7744 ; WX 1024 ; N uni1E40 ; G 1482 -U 7745 ; WX 948 ; N uni1E41 ; G 1483 -U 7746 ; WX 1024 ; N uni1E42 ; G 1484 -U 7747 ; WX 948 ; N uni1E43 ; G 1485 -U 7748 ; WX 875 ; N uni1E44 ; G 1486 -U 7749 ; WX 644 ; N uni1E45 ; G 1487 -U 7750 ; WX 875 ; N uni1E46 ; G 1488 -U 7751 ; WX 644 ; N uni1E47 ; G 1489 -U 7752 ; WX 875 ; N uni1E48 ; G 1490 -U 7753 ; WX 644 ; N uni1E49 ; G 1491 -U 7754 ; WX 875 ; N uni1E4A ; G 1492 -U 7755 ; WX 644 ; N uni1E4B ; G 1493 -U 7756 ; WX 820 ; N uni1E4C ; G 1494 -U 7757 ; WX 602 ; N uni1E4D ; G 1495 -U 7758 ; WX 820 ; N uni1E4E ; G 1496 -U 7759 ; WX 602 ; N uni1E4F ; G 1497 -U 7760 ; WX 820 ; N uni1E50 ; G 1498 -U 7761 ; WX 602 ; N uni1E51 ; G 1499 -U 7762 ; WX 820 ; N uni1E52 ; G 1500 -U 7763 ; WX 602 ; N uni1E53 ; G 1501 -U 7764 ; WX 673 ; N uni1E54 ; G 1502 -U 7765 ; WX 640 ; N uni1E55 ; G 1503 -U 7766 ; WX 673 ; N uni1E56 ; G 1504 -U 7767 ; WX 640 ; N uni1E57 ; G 1505 -U 7768 ; WX 753 ; N uni1E58 ; G 1506 -U 7769 ; WX 478 ; N uni1E59 ; G 1507 -U 7770 ; WX 753 ; N uni1E5A ; G 1508 -U 7771 ; WX 478 ; N uni1E5B ; G 1509 -U 7772 ; WX 753 ; N uni1E5C ; G 1510 -U 7773 ; WX 478 ; N uni1E5D ; G 1511 -U 7774 ; WX 753 ; N uni1E5E ; G 1512 -U 7775 ; WX 478 ; N uni1E5F ; G 1513 -U 7776 ; WX 685 ; N uni1E60 ; G 1514 -U 7777 ; WX 513 ; N uni1E61 ; G 1515 -U 7778 ; WX 685 ; N uni1E62 ; G 1516 -U 7779 ; WX 513 ; N uni1E63 ; G 1517 -U 7780 ; WX 685 ; N uni1E64 ; G 1518 -U 7781 ; WX 513 ; N uni1E65 ; G 1519 -U 7782 ; WX 685 ; N uni1E66 ; G 1520 -U 7783 ; WX 521 ; N uni1E67 ; G 1521 -U 7784 ; WX 685 ; N uni1E68 ; G 1522 -U 7785 ; WX 513 ; N uni1E69 ; G 1523 -U 7786 ; WX 667 ; N uni1E6A ; G 1524 -U 7787 ; WX 402 ; N uni1E6B ; G 1525 -U 7788 ; WX 667 ; N uni1E6C ; G 1526 -U 7789 ; WX 402 ; N uni1E6D ; G 1527 -U 7790 ; WX 667 ; N uni1E6E ; G 1528 -U 7791 ; WX 402 ; N uni1E6F ; G 1529 -U 7792 ; WX 667 ; N uni1E70 ; G 1530 -U 7793 ; WX 402 ; N uni1E71 ; G 1531 -U 7794 ; WX 843 ; N uni1E72 ; G 1532 -U 7795 ; WX 644 ; N uni1E73 ; G 1533 -U 7796 ; WX 843 ; N uni1E74 ; G 1534 -U 7797 ; WX 644 ; N uni1E75 ; G 1535 -U 7798 ; WX 843 ; N uni1E76 ; G 1536 -U 7799 ; WX 644 ; N uni1E77 ; G 1537 -U 7800 ; WX 843 ; N uni1E78 ; G 1538 -U 7801 ; WX 644 ; N uni1E79 ; G 1539 -U 7802 ; WX 843 ; N uni1E7A ; G 1540 -U 7803 ; WX 644 ; N uni1E7B ; G 1541 -U 7804 ; WX 722 ; N uni1E7C ; G 1542 -U 7805 ; WX 565 ; N uni1E7D ; G 1543 -U 7806 ; WX 722 ; N uni1E7E ; G 1544 -U 7807 ; WX 565 ; N uni1E7F ; G 1545 -U 7808 ; WX 1028 ; N Wgrave ; G 1546 -U 7809 ; WX 856 ; N wgrave ; G 1547 -U 7810 ; WX 1028 ; N Wacute ; G 1548 -U 7811 ; WX 856 ; N wacute ; G 1549 -U 7812 ; WX 1028 ; N Wdieresis ; G 1550 -U 7813 ; WX 856 ; N wdieresis ; G 1551 -U 7814 ; WX 1028 ; N uni1E86 ; G 1552 -U 7815 ; WX 856 ; N uni1E87 ; G 1553 -U 7816 ; WX 1028 ; N uni1E88 ; G 1554 -U 7817 ; WX 856 ; N uni1E89 ; G 1555 -U 7818 ; WX 712 ; N uni1E8A ; G 1556 -U 7819 ; WX 564 ; N uni1E8B ; G 1557 -U 7820 ; WX 712 ; N uni1E8C ; G 1558 -U 7821 ; WX 564 ; N uni1E8D ; G 1559 -U 7822 ; WX 660 ; N uni1E8E ; G 1560 -U 7823 ; WX 565 ; N uni1E8F ; G 1561 -U 7824 ; WX 695 ; N uni1E90 ; G 1562 -U 7825 ; WX 527 ; N uni1E91 ; G 1563 -U 7826 ; WX 695 ; N uni1E92 ; G 1564 -U 7827 ; WX 527 ; N uni1E93 ; G 1565 -U 7828 ; WX 695 ; N uni1E94 ; G 1566 -U 7829 ; WX 527 ; N uni1E95 ; G 1567 -U 7830 ; WX 644 ; N uni1E96 ; G 1568 -U 7831 ; WX 402 ; N uni1E97 ; G 1569 -U 7832 ; WX 856 ; N uni1E98 ; G 1570 -U 7833 ; WX 565 ; N uni1E99 ; G 1571 -U 7834 ; WX 903 ; N uni1E9A ; G 1572 -U 7835 ; WX 370 ; N uni1E9B ; G 1573 -U 7836 ; WX 370 ; N uni1E9C ; G 1574 -U 7837 ; WX 370 ; N uni1E9D ; G 1575 -U 7838 ; WX 829 ; N uni1E9E ; G 1576 -U 7839 ; WX 602 ; N uni1E9F ; G 1577 -U 7840 ; WX 722 ; N uni1EA0 ; G 1578 -U 7841 ; WX 596 ; N uni1EA1 ; G 1579 -U 7842 ; WX 722 ; N uni1EA2 ; G 1580 -U 7843 ; WX 596 ; N uni1EA3 ; G 1581 -U 7844 ; WX 722 ; N uni1EA4 ; G 1582 -U 7845 ; WX 613 ; N uni1EA5 ; G 1583 -U 7846 ; WX 722 ; N uni1EA6 ; G 1584 -U 7847 ; WX 613 ; N uni1EA7 ; G 1585 -U 7848 ; WX 722 ; N uni1EA8 ; G 1586 -U 7849 ; WX 613 ; N uni1EA9 ; G 1587 -U 7850 ; WX 722 ; N uni1EAA ; G 1588 -U 7851 ; WX 613 ; N uni1EAB ; G 1589 -U 7852 ; WX 722 ; N uni1EAC ; G 1590 -U 7853 ; WX 596 ; N uni1EAD ; G 1591 -U 7854 ; WX 722 ; N uni1EAE ; G 1592 -U 7855 ; WX 596 ; N uni1EAF ; G 1593 -U 7856 ; WX 722 ; N uni1EB0 ; G 1594 -U 7857 ; WX 596 ; N uni1EB1 ; G 1595 -U 7858 ; WX 722 ; N uni1EB2 ; G 1596 -U 7859 ; WX 596 ; N uni1EB3 ; G 1597 -U 7860 ; WX 722 ; N uni1EB4 ; G 1598 -U 7861 ; WX 596 ; N uni1EB5 ; G 1599 -U 7862 ; WX 722 ; N uni1EB6 ; G 1600 -U 7863 ; WX 596 ; N uni1EB7 ; G 1601 -U 7864 ; WX 730 ; N uni1EB8 ; G 1602 -U 7865 ; WX 592 ; N uni1EB9 ; G 1603 -U 7866 ; WX 730 ; N uni1EBA ; G 1604 -U 7867 ; WX 592 ; N uni1EBB ; G 1605 -U 7868 ; WX 730 ; N uni1EBC ; G 1606 -U 7869 ; WX 592 ; N uni1EBD ; G 1607 -U 7870 ; WX 730 ; N uni1ebe ; G 1608 -U 7871 ; WX 615 ; N uni1ebF ; G 1609 -U 7872 ; WX 730 ; N uni1EC0 ; G 1610 -U 7873 ; WX 615 ; N uni1EC1 ; G 1611 -U 7874 ; WX 730 ; N uni1EC2 ; G 1612 -U 7875 ; WX 615 ; N uni1EC3 ; G 1613 -U 7876 ; WX 730 ; N uni1EC4 ; G 1614 -U 7877 ; WX 615 ; N uni1EC5 ; G 1615 -U 7878 ; WX 730 ; N uni1EC6 ; G 1616 -U 7879 ; WX 592 ; N uni1EC7 ; G 1617 -U 7880 ; WX 395 ; N uni1EC8 ; G 1618 -U 7881 ; WX 320 ; N uni1EC9 ; G 1619 -U 7882 ; WX 395 ; N uni1ECA ; G 1620 -U 7883 ; WX 320 ; N uni1ECB ; G 1621 -U 7884 ; WX 820 ; N uni1ECC ; G 1622 -U 7885 ; WX 602 ; N uni1ECD ; G 1623 -U 7886 ; WX 820 ; N uni1ECE ; G 1624 -U 7887 ; WX 602 ; N uni1ECF ; G 1625 -U 7888 ; WX 820 ; N uni1ED0 ; G 1626 -U 7889 ; WX 612 ; N uni1ED1 ; G 1627 -U 7890 ; WX 820 ; N uni1ED2 ; G 1628 -U 7891 ; WX 612 ; N uni1ED3 ; G 1629 -U 7892 ; WX 820 ; N uni1ED4 ; G 1630 -U 7893 ; WX 612 ; N uni1ED5 ; G 1631 -U 7894 ; WX 820 ; N uni1ED6 ; G 1632 -U 7895 ; WX 612 ; N uni1ED7 ; G 1633 -U 7896 ; WX 820 ; N uni1ED8 ; G 1634 -U 7897 ; WX 602 ; N uni1ED9 ; G 1635 -U 7898 ; WX 820 ; N uni1EDA ; G 1636 -U 7899 ; WX 602 ; N uni1EDB ; G 1637 -U 7900 ; WX 820 ; N uni1EDC ; G 1638 -U 7901 ; WX 602 ; N uni1EDD ; G 1639 -U 7902 ; WX 820 ; N uni1EDE ; G 1640 -U 7903 ; WX 602 ; N uni1EDF ; G 1641 -U 7904 ; WX 820 ; N uni1EE0 ; G 1642 -U 7905 ; WX 602 ; N uni1EE1 ; G 1643 -U 7906 ; WX 820 ; N uni1EE2 ; G 1644 -U 7907 ; WX 602 ; N uni1EE3 ; G 1645 -U 7908 ; WX 843 ; N uni1EE4 ; G 1646 -U 7909 ; WX 644 ; N uni1EE5 ; G 1647 -U 7910 ; WX 843 ; N uni1EE6 ; G 1648 -U 7911 ; WX 644 ; N uni1EE7 ; G 1649 -U 7912 ; WX 843 ; N uni1EE8 ; G 1650 -U 7913 ; WX 644 ; N uni1EE9 ; G 1651 -U 7914 ; WX 843 ; N uni1EEA ; G 1652 -U 7915 ; WX 644 ; N uni1EEB ; G 1653 -U 7916 ; WX 843 ; N uni1EEC ; G 1654 -U 7917 ; WX 644 ; N uni1EED ; G 1655 -U 7918 ; WX 843 ; N uni1EEE ; G 1656 -U 7919 ; WX 644 ; N uni1EEF ; G 1657 -U 7920 ; WX 843 ; N uni1EF0 ; G 1658 -U 7921 ; WX 644 ; N uni1EF1 ; G 1659 -U 7922 ; WX 660 ; N Ygrave ; G 1660 -U 7923 ; WX 565 ; N ygrave ; G 1661 -U 7924 ; WX 660 ; N uni1EF4 ; G 1662 -U 7925 ; WX 565 ; N uni1EF5 ; G 1663 -U 7926 ; WX 660 ; N uni1EF6 ; G 1664 -U 7927 ; WX 565 ; N uni1EF7 ; G 1665 -U 7928 ; WX 660 ; N uni1EF8 ; G 1666 -U 7929 ; WX 565 ; N uni1EF9 ; G 1667 -U 7930 ; WX 949 ; N uni1EFA ; G 1668 -U 7931 ; WX 581 ; N uni1EFB ; G 1669 -U 7936 ; WX 675 ; N uni1F00 ; G 1670 -U 7937 ; WX 675 ; N uni1F01 ; G 1671 -U 7938 ; WX 675 ; N uni1F02 ; G 1672 -U 7939 ; WX 675 ; N uni1F03 ; G 1673 -U 7940 ; WX 675 ; N uni1F04 ; G 1674 -U 7941 ; WX 675 ; N uni1F05 ; G 1675 -U 7942 ; WX 675 ; N uni1F06 ; G 1676 -U 7943 ; WX 675 ; N uni1F07 ; G 1677 -U 7944 ; WX 722 ; N uni1F08 ; G 1678 -U 7945 ; WX 722 ; N uni1F09 ; G 1679 -U 7946 ; WX 869 ; N uni1F0A ; G 1680 -U 7947 ; WX 869 ; N uni1F0B ; G 1681 -U 7948 ; WX 734 ; N uni1F0C ; G 1682 -U 7949 ; WX 763 ; N uni1F0D ; G 1683 -U 7950 ; WX 722 ; N uni1F0E ; G 1684 -U 7951 ; WX 722 ; N uni1F0F ; G 1685 -U 7952 ; WX 537 ; N uni1F10 ; G 1686 -U 7953 ; WX 537 ; N uni1F11 ; G 1687 -U 7954 ; WX 537 ; N uni1F12 ; G 1688 -U 7955 ; WX 537 ; N uni1F13 ; G 1689 -U 7956 ; WX 537 ; N uni1F14 ; G 1690 -U 7957 ; WX 537 ; N uni1F15 ; G 1691 -U 7960 ; WX 853 ; N uni1F18 ; G 1692 -U 7961 ; WX 841 ; N uni1F19 ; G 1693 -U 7962 ; WX 1067 ; N uni1F1A ; G 1694 -U 7963 ; WX 1077 ; N uni1F1B ; G 1695 -U 7964 ; WX 1008 ; N uni1F1C ; G 1696 -U 7965 ; WX 1035 ; N uni1F1D ; G 1697 -U 7968 ; WX 599 ; N uni1F20 ; G 1698 -U 7969 ; WX 599 ; N uni1F21 ; G 1699 -U 7970 ; WX 599 ; N uni1F22 ; G 1700 -U 7971 ; WX 599 ; N uni1F23 ; G 1701 -U 7972 ; WX 599 ; N uni1F24 ; G 1702 -U 7973 ; WX 599 ; N uni1F25 ; G 1703 -U 7974 ; WX 599 ; N uni1F26 ; G 1704 -U 7975 ; WX 599 ; N uni1F27 ; G 1705 -U 7976 ; WX 998 ; N uni1F28 ; G 1706 -U 7977 ; WX 992 ; N uni1F29 ; G 1707 -U 7978 ; WX 1212 ; N uni1F2A ; G 1708 -U 7979 ; WX 1224 ; N uni1F2B ; G 1709 -U 7980 ; WX 1159 ; N uni1F2C ; G 1710 -U 7981 ; WX 1183 ; N uni1F2D ; G 1711 -U 7982 ; WX 1098 ; N uni1F2E ; G 1712 -U 7983 ; WX 1095 ; N uni1F2F ; G 1713 -U 7984 ; WX 392 ; N uni1F30 ; G 1714 -U 7985 ; WX 392 ; N uni1F31 ; G 1715 -U 7986 ; WX 392 ; N uni1F32 ; G 1716 -U 7987 ; WX 392 ; N uni1F33 ; G 1717 -U 7988 ; WX 392 ; N uni1F34 ; G 1718 -U 7989 ; WX 392 ; N uni1F35 ; G 1719 -U 7990 ; WX 392 ; N uni1F36 ; G 1720 -U 7991 ; WX 392 ; N uni1F37 ; G 1721 -U 7992 ; WX 521 ; N uni1F38 ; G 1722 -U 7993 ; WX 512 ; N uni1F39 ; G 1723 -U 7994 ; WX 735 ; N uni1F3A ; G 1724 -U 7995 ; WX 738 ; N uni1F3B ; G 1725 -U 7996 ; WX 679 ; N uni1F3C ; G 1726 -U 7997 ; WX 706 ; N uni1F3D ; G 1727 -U 7998 ; WX 624 ; N uni1F3E ; G 1728 -U 7999 ; WX 615 ; N uni1F3F ; G 1729 -U 8000 ; WX 602 ; N uni1F40 ; G 1730 -U 8001 ; WX 602 ; N uni1F41 ; G 1731 -U 8002 ; WX 602 ; N uni1F42 ; G 1732 -U 8003 ; WX 602 ; N uni1F43 ; G 1733 -U 8004 ; WX 602 ; N uni1F44 ; G 1734 -U 8005 ; WX 602 ; N uni1F45 ; G 1735 -U 8008 ; WX 820 ; N uni1F48 ; G 1736 -U 8009 ; WX 859 ; N uni1F49 ; G 1737 -U 8010 ; WX 1120 ; N uni1F4A ; G 1738 -U 8011 ; WX 1127 ; N uni1F4B ; G 1739 -U 8012 ; WX 937 ; N uni1F4C ; G 1740 -U 8013 ; WX 964 ; N uni1F4D ; G 1741 -U 8016 ; WX 608 ; N uni1F50 ; G 1742 -U 8017 ; WX 608 ; N uni1F51 ; G 1743 -U 8018 ; WX 608 ; N uni1F52 ; G 1744 -U 8019 ; WX 608 ; N uni1F53 ; G 1745 -U 8020 ; WX 608 ; N uni1F54 ; G 1746 -U 8021 ; WX 608 ; N uni1F55 ; G 1747 -U 8022 ; WX 608 ; N uni1F56 ; G 1748 -U 8023 ; WX 608 ; N uni1F57 ; G 1749 -U 8025 ; WX 851 ; N uni1F59 ; G 1750 -U 8027 ; WX 1079 ; N uni1F5B ; G 1751 -U 8029 ; WX 1044 ; N uni1F5D ; G 1752 -U 8031 ; WX 953 ; N uni1F5F ; G 1753 -U 8032 ; WX 815 ; N uni1F60 ; G 1754 -U 8033 ; WX 815 ; N uni1F61 ; G 1755 -U 8034 ; WX 815 ; N uni1F62 ; G 1756 -U 8035 ; WX 815 ; N uni1F63 ; G 1757 -U 8036 ; WX 815 ; N uni1F64 ; G 1758 -U 8037 ; WX 815 ; N uni1F65 ; G 1759 -U 8038 ; WX 815 ; N uni1F66 ; G 1760 -U 8039 ; WX 815 ; N uni1F67 ; G 1761 -U 8040 ; WX 829 ; N uni1F68 ; G 1762 -U 8041 ; WX 870 ; N uni1F69 ; G 1763 -U 8042 ; WX 1131 ; N uni1F6A ; G 1764 -U 8043 ; WX 1137 ; N uni1F6B ; G 1765 -U 8044 ; WX 946 ; N uni1F6C ; G 1766 -U 8045 ; WX 976 ; N uni1F6D ; G 1767 -U 8046 ; WX 938 ; N uni1F6E ; G 1768 -U 8047 ; WX 970 ; N uni1F6F ; G 1769 -U 8048 ; WX 675 ; N uni1F70 ; G 1770 -U 8049 ; WX 675 ; N uni1F71 ; G 1771 -U 8050 ; WX 537 ; N uni1F72 ; G 1772 -U 8051 ; WX 537 ; N uni1F73 ; G 1773 -U 8052 ; WX 599 ; N uni1F74 ; G 1774 -U 8053 ; WX 599 ; N uni1F75 ; G 1775 -U 8054 ; WX 392 ; N uni1F76 ; G 1776 -U 8055 ; WX 392 ; N uni1F77 ; G 1777 -U 8056 ; WX 602 ; N uni1F78 ; G 1778 -U 8057 ; WX 602 ; N uni1F79 ; G 1779 -U 8058 ; WX 608 ; N uni1F7A ; G 1780 -U 8059 ; WX 608 ; N uni1F7B ; G 1781 -U 8060 ; WX 815 ; N uni1F7C ; G 1782 -U 8061 ; WX 815 ; N uni1F7D ; G 1783 -U 8064 ; WX 675 ; N uni1F80 ; G 1784 -U 8065 ; WX 675 ; N uni1F81 ; G 1785 -U 8066 ; WX 675 ; N uni1F82 ; G 1786 -U 8067 ; WX 675 ; N uni1F83 ; G 1787 -U 8068 ; WX 675 ; N uni1F84 ; G 1788 -U 8069 ; WX 675 ; N uni1F85 ; G 1789 -U 8070 ; WX 675 ; N uni1F86 ; G 1790 -U 8071 ; WX 675 ; N uni1F87 ; G 1791 -U 8072 ; WX 722 ; N uni1F88 ; G 1792 -U 8073 ; WX 722 ; N uni1F89 ; G 1793 -U 8074 ; WX 869 ; N uni1F8A ; G 1794 -U 8075 ; WX 869 ; N uni1F8B ; G 1795 -U 8076 ; WX 734 ; N uni1F8C ; G 1796 -U 8077 ; WX 763 ; N uni1F8D ; G 1797 -U 8078 ; WX 722 ; N uni1F8E ; G 1798 -U 8079 ; WX 722 ; N uni1F8F ; G 1799 -U 8080 ; WX 599 ; N uni1F90 ; G 1800 -U 8081 ; WX 599 ; N uni1F91 ; G 1801 -U 8082 ; WX 599 ; N uni1F92 ; G 1802 -U 8083 ; WX 599 ; N uni1F93 ; G 1803 -U 8084 ; WX 599 ; N uni1F94 ; G 1804 -U 8085 ; WX 599 ; N uni1F95 ; G 1805 -U 8086 ; WX 599 ; N uni1F96 ; G 1806 -U 8087 ; WX 599 ; N uni1F97 ; G 1807 -U 8088 ; WX 998 ; N uni1F98 ; G 1808 -U 8089 ; WX 992 ; N uni1F99 ; G 1809 -U 8090 ; WX 1212 ; N uni1F9A ; G 1810 -U 8091 ; WX 1224 ; N uni1F9B ; G 1811 -U 8092 ; WX 1159 ; N uni1F9C ; G 1812 -U 8093 ; WX 1183 ; N uni1F9D ; G 1813 -U 8094 ; WX 1098 ; N uni1F9E ; G 1814 -U 8095 ; WX 1095 ; N uni1F9F ; G 1815 -U 8096 ; WX 815 ; N uni1FA0 ; G 1816 -U 8097 ; WX 815 ; N uni1FA1 ; G 1817 -U 8098 ; WX 815 ; N uni1FA2 ; G 1818 -U 8099 ; WX 815 ; N uni1FA3 ; G 1819 -U 8100 ; WX 815 ; N uni1FA4 ; G 1820 -U 8101 ; WX 815 ; N uni1FA5 ; G 1821 -U 8102 ; WX 815 ; N uni1FA6 ; G 1822 -U 8103 ; WX 815 ; N uni1FA7 ; G 1823 -U 8104 ; WX 829 ; N uni1FA8 ; G 1824 -U 8105 ; WX 870 ; N uni1FA9 ; G 1825 -U 8106 ; WX 1131 ; N uni1FAA ; G 1826 -U 8107 ; WX 1137 ; N uni1FAB ; G 1827 -U 8108 ; WX 946 ; N uni1FAC ; G 1828 -U 8109 ; WX 976 ; N uni1FAD ; G 1829 -U 8110 ; WX 938 ; N uni1FAE ; G 1830 -U 8111 ; WX 970 ; N uni1FAF ; G 1831 -U 8112 ; WX 675 ; N uni1FB0 ; G 1832 -U 8113 ; WX 675 ; N uni1FB1 ; G 1833 -U 8114 ; WX 675 ; N uni1FB2 ; G 1834 -U 8115 ; WX 675 ; N uni1FB3 ; G 1835 -U 8116 ; WX 675 ; N uni1FB4 ; G 1836 -U 8118 ; WX 675 ; N uni1FB6 ; G 1837 -U 8119 ; WX 675 ; N uni1FB7 ; G 1838 -U 8120 ; WX 722 ; N uni1FB8 ; G 1839 -U 8121 ; WX 722 ; N uni1FB9 ; G 1840 -U 8122 ; WX 722 ; N uni1FBA ; G 1841 -U 8123 ; WX 722 ; N uni1FBB ; G 1842 -U 8124 ; WX 722 ; N uni1FBC ; G 1843 -U 8125 ; WX 500 ; N uni1FBD ; G 1844 -U 8126 ; WX 500 ; N uni1FBE ; G 1845 -U 8127 ; WX 500 ; N uni1FBF ; G 1846 -U 8128 ; WX 500 ; N uni1FC0 ; G 1847 -U 8129 ; WX 500 ; N uni1FC1 ; G 1848 -U 8130 ; WX 599 ; N uni1FC2 ; G 1849 -U 8131 ; WX 599 ; N uni1FC3 ; G 1850 -U 8132 ; WX 599 ; N uni1FC4 ; G 1851 -U 8134 ; WX 599 ; N uni1FC6 ; G 1852 -U 8135 ; WX 599 ; N uni1FC7 ; G 1853 -U 8136 ; WX 912 ; N uni1FC8 ; G 1854 -U 8137 ; WX 900 ; N uni1FC9 ; G 1855 -U 8138 ; WX 1063 ; N uni1FCA ; G 1856 -U 8139 ; WX 1039 ; N uni1FCB ; G 1857 -U 8140 ; WX 872 ; N uni1FCC ; G 1858 -U 8141 ; WX 500 ; N uni1FCD ; G 1859 -U 8142 ; WX 500 ; N uni1FCE ; G 1860 -U 8143 ; WX 500 ; N uni1FCF ; G 1861 -U 8144 ; WX 392 ; N uni1FD0 ; G 1862 -U 8145 ; WX 392 ; N uni1FD1 ; G 1863 -U 8146 ; WX 392 ; N uni1FD2 ; G 1864 -U 8147 ; WX 392 ; N uni1FD3 ; G 1865 -U 8150 ; WX 392 ; N uni1FD6 ; G 1866 -U 8151 ; WX 392 ; N uni1FD7 ; G 1867 -U 8152 ; WX 395 ; N uni1FD8 ; G 1868 -U 8153 ; WX 395 ; N uni1FD9 ; G 1869 -U 8154 ; WX 588 ; N uni1FDA ; G 1870 -U 8155 ; WX 562 ; N uni1FDB ; G 1871 -U 8157 ; WX 500 ; N uni1FDD ; G 1872 -U 8158 ; WX 500 ; N uni1FDE ; G 1873 -U 8159 ; WX 500 ; N uni1FDF ; G 1874 -U 8160 ; WX 608 ; N uni1FE0 ; G 1875 -U 8161 ; WX 608 ; N uni1FE1 ; G 1876 -U 8162 ; WX 608 ; N uni1FE2 ; G 1877 -U 8163 ; WX 608 ; N uni1FE3 ; G 1878 -U 8164 ; WX 588 ; N uni1FE4 ; G 1879 -U 8165 ; WX 588 ; N uni1FE5 ; G 1880 -U 8166 ; WX 608 ; N uni1FE6 ; G 1881 -U 8167 ; WX 608 ; N uni1FE7 ; G 1882 -U 8168 ; WX 660 ; N uni1FE8 ; G 1883 -U 8169 ; WX 660 ; N uni1FE9 ; G 1884 -U 8170 ; WX 921 ; N uni1FEA ; G 1885 -U 8171 ; WX 897 ; N uni1FEB ; G 1886 -U 8172 ; WX 790 ; N uni1FEC ; G 1887 -U 8173 ; WX 500 ; N uni1FED ; G 1888 -U 8174 ; WX 500 ; N uni1FEE ; G 1889 -U 8175 ; WX 500 ; N uni1FEF ; G 1890 -U 8178 ; WX 815 ; N uni1FF2 ; G 1891 -U 8179 ; WX 815 ; N uni1FF3 ; G 1892 -U 8180 ; WX 815 ; N uni1FF4 ; G 1893 -U 8182 ; WX 815 ; N uni1FF6 ; G 1894 -U 8183 ; WX 815 ; N uni1FF7 ; G 1895 -U 8184 ; WX 961 ; N uni1FF8 ; G 1896 -U 8185 ; WX 835 ; N uni1FF9 ; G 1897 -U 8186 ; WX 984 ; N uni1FFA ; G 1898 -U 8187 ; WX 853 ; N uni1FFB ; G 1899 -U 8188 ; WX 829 ; N uni1FFC ; G 1900 -U 8189 ; WX 500 ; N uni1FFD ; G 1901 -U 8190 ; WX 500 ; N uni1FFE ; G 1902 -U 8192 ; WX 500 ; N uni2000 ; G 1903 -U 8193 ; WX 1000 ; N uni2001 ; G 1904 -U 8194 ; WX 500 ; N uni2002 ; G 1905 -U 8195 ; WX 1000 ; N uni2003 ; G 1906 -U 8196 ; WX 330 ; N uni2004 ; G 1907 -U 8197 ; WX 250 ; N uni2005 ; G 1908 -U 8198 ; WX 167 ; N uni2006 ; G 1909 -U 8199 ; WX 636 ; N uni2007 ; G 1910 -U 8200 ; WX 318 ; N uni2008 ; G 1911 -U 8201 ; WX 200 ; N uni2009 ; G 1912 -U 8202 ; WX 100 ; N uni200A ; G 1913 -U 8203 ; WX 0 ; N uni200B ; G 1914 -U 8204 ; WX 0 ; N uni200C ; G 1915 -U 8205 ; WX 0 ; N uni200D ; G 1916 -U 8206 ; WX 0 ; N uni200E ; G 1917 -U 8207 ; WX 0 ; N uni200F ; G 1918 -U 8208 ; WX 338 ; N uni2010 ; G 1919 -U 8209 ; WX 338 ; N uni2011 ; G 1920 -U 8210 ; WX 636 ; N figuredash ; G 1921 -U 8211 ; WX 500 ; N endash ; G 1922 -U 8212 ; WX 1000 ; N emdash ; G 1923 -U 8213 ; WX 1000 ; N uni2015 ; G 1924 -U 8214 ; WX 500 ; N uni2016 ; G 1925 -U 8215 ; WX 500 ; N underscoredbl ; G 1926 -U 8216 ; WX 318 ; N quoteleft ; G 1927 -U 8217 ; WX 318 ; N quoteright ; G 1928 -U 8218 ; WX 318 ; N quotesinglbase ; G 1929 -U 8219 ; WX 318 ; N quotereversed ; G 1930 -U 8220 ; WX 511 ; N quotedblleft ; G 1931 -U 8221 ; WX 511 ; N quotedblright ; G 1932 -U 8222 ; WX 518 ; N quotedblbase ; G 1933 -U 8223 ; WX 511 ; N uni201F ; G 1934 -U 8224 ; WX 500 ; N dagger ; G 1935 -U 8225 ; WX 500 ; N daggerdbl ; G 1936 -U 8226 ; WX 590 ; N bullet ; G 1937 -U 8227 ; WX 590 ; N uni2023 ; G 1938 -U 8228 ; WX 334 ; N onedotenleader ; G 1939 -U 8229 ; WX 667 ; N twodotenleader ; G 1940 -U 8230 ; WX 1000 ; N ellipsis ; G 1941 -U 8234 ; WX 0 ; N uni202A ; G 1942 -U 8235 ; WX 0 ; N uni202B ; G 1943 -U 8236 ; WX 0 ; N uni202C ; G 1944 -U 8237 ; WX 0 ; N uni202D ; G 1945 -U 8238 ; WX 0 ; N uni202E ; G 1946 -U 8239 ; WX 200 ; N uni202F ; G 1947 -U 8240 ; WX 1342 ; N perthousand ; G 1948 -U 8241 ; WX 1734 ; N uni2031 ; G 1949 -U 8242 ; WX 227 ; N minute ; G 1950 -U 8243 ; WX 374 ; N second ; G 1951 -U 8244 ; WX 520 ; N uni2034 ; G 1952 -U 8245 ; WX 227 ; N uni2035 ; G 1953 -U 8246 ; WX 374 ; N uni2036 ; G 1954 -U 8247 ; WX 520 ; N uni2037 ; G 1955 -U 8248 ; WX 339 ; N uni2038 ; G 1956 -U 8249 ; WX 400 ; N guilsinglleft ; G 1957 -U 8250 ; WX 400 ; N guilsinglright ; G 1958 -U 8252 ; WX 527 ; N exclamdbl ; G 1959 -U 8253 ; WX 536 ; N uni203D ; G 1960 -U 8254 ; WX 500 ; N uni203E ; G 1961 -U 8258 ; WX 1000 ; N uni2042 ; G 1962 -U 8260 ; WX 167 ; N fraction ; G 1963 -U 8261 ; WX 390 ; N uni2045 ; G 1964 -U 8262 ; WX 390 ; N uni2046 ; G 1965 -U 8263 ; WX 976 ; N uni2047 ; G 1966 -U 8264 ; WX 753 ; N uni2048 ; G 1967 -U 8265 ; WX 753 ; N uni2049 ; G 1968 -U 8267 ; WX 636 ; N uni204B ; G 1969 -U 8268 ; WX 500 ; N uni204C ; G 1970 -U 8269 ; WX 500 ; N uni204D ; G 1971 -U 8270 ; WX 500 ; N uni204E ; G 1972 -U 8271 ; WX 337 ; N uni204F ; G 1973 -U 8273 ; WX 500 ; N uni2051 ; G 1974 -U 8274 ; WX 450 ; N uni2052 ; G 1975 -U 8275 ; WX 1000 ; N uni2053 ; G 1976 -U 8279 ; WX 663 ; N uni2057 ; G 1977 -U 8287 ; WX 222 ; N uni205F ; G 1978 -U 8288 ; WX 0 ; N uni2060 ; G 1979 -U 8289 ; WX 0 ; N uni2061 ; G 1980 -U 8290 ; WX 0 ; N uni2062 ; G 1981 -U 8291 ; WX 0 ; N uni2063 ; G 1982 -U 8292 ; WX 0 ; N uni2064 ; G 1983 -U 8298 ; WX 0 ; N uni206A ; G 1984 -U 8299 ; WX 0 ; N uni206B ; G 1985 -U 8300 ; WX 0 ; N uni206C ; G 1986 -U 8301 ; WX 0 ; N uni206D ; G 1987 -U 8302 ; WX 0 ; N uni206E ; G 1988 -U 8303 ; WX 0 ; N uni206F ; G 1989 -U 8304 ; WX 401 ; N uni2070 ; G 1990 -U 8305 ; WX 201 ; N uni2071 ; G 1991 -U 8308 ; WX 401 ; N uni2074 ; G 1992 -U 8309 ; WX 401 ; N uni2075 ; G 1993 -U 8310 ; WX 401 ; N uni2076 ; G 1994 -U 8311 ; WX 401 ; N uni2077 ; G 1995 -U 8312 ; WX 401 ; N uni2078 ; G 1996 -U 8313 ; WX 401 ; N uni2079 ; G 1997 -U 8314 ; WX 528 ; N uni207A ; G 1998 -U 8315 ; WX 528 ; N uni207B ; G 1999 -U 8316 ; WX 528 ; N uni207C ; G 2000 -U 8317 ; WX 246 ; N uni207D ; G 2001 -U 8318 ; WX 246 ; N uni207E ; G 2002 -U 8319 ; WX 433 ; N uni207F ; G 2003 -U 8320 ; WX 401 ; N uni2080 ; G 2004 -U 8321 ; WX 401 ; N uni2081 ; G 2005 -U 8322 ; WX 401 ; N uni2082 ; G 2006 -U 8323 ; WX 401 ; N uni2083 ; G 2007 -U 8324 ; WX 401 ; N uni2084 ; G 2008 -U 8325 ; WX 401 ; N uni2085 ; G 2009 -U 8326 ; WX 401 ; N uni2086 ; G 2010 -U 8327 ; WX 401 ; N uni2087 ; G 2011 -U 8328 ; WX 401 ; N uni2088 ; G 2012 -U 8329 ; WX 401 ; N uni2089 ; G 2013 -U 8330 ; WX 528 ; N uni208A ; G 2014 -U 8331 ; WX 528 ; N uni208B ; G 2015 -U 8332 ; WX 528 ; N uni208C ; G 2016 -U 8333 ; WX 246 ; N uni208D ; G 2017 -U 8334 ; WX 246 ; N uni208E ; G 2018 -U 8336 ; WX 386 ; N uni2090 ; G 2019 -U 8337 ; WX 387 ; N uni2091 ; G 2020 -U 8338 ; WX 385 ; N uni2092 ; G 2021 -U 8339 ; WX 424 ; N uni2093 ; G 2022 -U 8340 ; WX 387 ; N uni2094 ; G 2023 -U 8341 ; WX 433 ; N uni2095 ; G 2024 -U 8342 ; WX 365 ; N uni2096 ; G 2025 -U 8343 ; WX 243 ; N uni2097 ; G 2026 -U 8344 ; WX 613 ; N uni2098 ; G 2027 -U 8345 ; WX 433 ; N uni2099 ; G 2028 -U 8346 ; WX 400 ; N uni209A ; G 2029 -U 8347 ; WX 337 ; N uni209B ; G 2030 -U 8348 ; WX 247 ; N uni209C ; G 2031 -U 8358 ; WX 636 ; N uni20A6 ; G 2032 -U 8364 ; WX 636 ; N Euro ; G 2033 -U 8367 ; WX 1057 ; N uni20AF ; G 2034 -U 8369 ; WX 706 ; N uni20B1 ; G 2035 -U 8372 ; WX 780 ; N uni20B4 ; G 2036 -U 8373 ; WX 636 ; N uni20B5 ; G 2037 -U 8376 ; WX 636 ; N uni20B8 ; G 2038 -U 8377 ; WX 636 ; N uni20B9 ; G 2039 -U 8378 ; WX 636 ; N uni20BA ; G 2040 -U 8381 ; WX 636 ; N uni20BD ; G 2041 -U 8450 ; WX 796 ; N uni2102 ; G 2042 -U 8451 ; WX 1119 ; N uni2103 ; G 2043 -U 8457 ; WX 1047 ; N uni2109 ; G 2044 -U 8461 ; WX 945 ; N uni210D ; G 2045 -U 8462 ; WX 644 ; N uni210E ; G 2046 -U 8463 ; WX 644 ; N uni210F ; G 2047 -U 8469 ; WX 914 ; N uni2115 ; G 2048 -U 8470 ; WX 946 ; N uni2116 ; G 2049 -U 8473 ; WX 752 ; N uni2119 ; G 2050 -U 8474 ; WX 871 ; N uni211A ; G 2051 -U 8477 ; WX 831 ; N uni211D ; G 2052 -U 8482 ; WX 1000 ; N trademark ; G 2053 -U 8484 ; WX 730 ; N uni2124 ; G 2054 -U 8486 ; WX 829 ; N uni2126 ; G 2055 -U 8487 ; WX 829 ; N uni2127 ; G 2056 -U 8490 ; WX 747 ; N uni212A ; G 2057 -U 8491 ; WX 722 ; N uni212B ; G 2058 -U 8498 ; WX 694 ; N uni2132 ; G 2059 -U 8508 ; WX 732 ; N uni213C ; G 2060 -U 8509 ; WX 660 ; N uni213D ; G 2061 -U 8510 ; WX 710 ; N uni213E ; G 2062 -U 8511 ; WX 944 ; N uni213F ; G 2063 -U 8512 ; WX 714 ; N uni2140 ; G 2064 -U 8513 ; WX 775 ; N uni2141 ; G 2065 -U 8514 ; WX 557 ; N uni2142 ; G 2066 -U 8515 ; WX 557 ; N uni2143 ; G 2067 -U 8516 ; WX 611 ; N uni2144 ; G 2068 -U 8517 ; WX 867 ; N uni2145 ; G 2069 -U 8518 ; WX 699 ; N uni2146 ; G 2070 -U 8519 ; WX 636 ; N uni2147 ; G 2071 -U 8520 ; WX 380 ; N uni2148 ; G 2072 -U 8521 ; WX 362 ; N uni2149 ; G 2073 -U 8523 ; WX 890 ; N uni214B ; G 2074 -U 8526 ; WX 514 ; N uni214E ; G 2075 -U 8528 ; WX 969 ; N uni2150 ; G 2076 -U 8529 ; WX 969 ; N uni2151 ; G 2077 -U 8530 ; WX 1370 ; N uni2152 ; G 2078 -U 8531 ; WX 969 ; N onethird ; G 2079 -U 8532 ; WX 969 ; N twothirds ; G 2080 -U 8533 ; WX 969 ; N uni2155 ; G 2081 -U 8534 ; WX 969 ; N uni2156 ; G 2082 -U 8535 ; WX 969 ; N uni2157 ; G 2083 -U 8536 ; WX 969 ; N uni2158 ; G 2084 -U 8537 ; WX 969 ; N uni2159 ; G 2085 -U 8538 ; WX 969 ; N uni215A ; G 2086 -U 8539 ; WX 969 ; N oneeighth ; G 2087 -U 8540 ; WX 969 ; N threeeighths ; G 2088 -U 8541 ; WX 969 ; N fiveeighths ; G 2089 -U 8542 ; WX 969 ; N seveneighths ; G 2090 -U 8543 ; WX 568 ; N uni215F ; G 2091 -U 8544 ; WX 395 ; N uni2160 ; G 2092 -U 8545 ; WX 680 ; N uni2161 ; G 2093 -U 8546 ; WX 964 ; N uni2162 ; G 2094 -U 8547 ; WX 999 ; N uni2163 ; G 2095 -U 8548 ; WX 722 ; N uni2164 ; G 2096 -U 8549 ; WX 1006 ; N uni2165 ; G 2097 -U 8550 ; WX 1291 ; N uni2166 ; G 2098 -U 8551 ; WX 1575 ; N uni2167 ; G 2099 -U 8552 ; WX 965 ; N uni2168 ; G 2100 -U 8553 ; WX 712 ; N uni2169 ; G 2101 -U 8554 ; WX 969 ; N uni216A ; G 2102 -U 8555 ; WX 1253 ; N uni216B ; G 2103 -U 8556 ; WX 664 ; N uni216C ; G 2104 -U 8557 ; WX 765 ; N uni216D ; G 2105 -U 8558 ; WX 802 ; N uni216E ; G 2106 -U 8559 ; WX 1024 ; N uni216F ; G 2107 -U 8560 ; WX 320 ; N uni2170 ; G 2108 -U 8561 ; WX 640 ; N uni2171 ; G 2109 -U 8562 ; WX 959 ; N uni2172 ; G 2110 -U 8563 ; WX 885 ; N uni2173 ; G 2111 -U 8564 ; WX 565 ; N uni2174 ; G 2112 -U 8565 ; WX 885 ; N uni2175 ; G 2113 -U 8566 ; WX 1205 ; N uni2176 ; G 2114 -U 8567 ; WX 1524 ; N uni2177 ; G 2115 -U 8568 ; WX 884 ; N uni2178 ; G 2116 -U 8569 ; WX 564 ; N uni2179 ; G 2117 -U 8570 ; WX 884 ; N uni217A ; G 2118 -U 8571 ; WX 1204 ; N uni217B ; G 2119 -U 8572 ; WX 320 ; N uni217C ; G 2120 -U 8573 ; WX 560 ; N uni217D ; G 2121 -U 8574 ; WX 640 ; N uni217E ; G 2122 -U 8575 ; WX 948 ; N uni217F ; G 2123 -U 8576 ; WX 1206 ; N uni2180 ; G 2124 -U 8577 ; WX 802 ; N uni2181 ; G 2125 -U 8578 ; WX 1206 ; N uni2182 ; G 2126 -U 8579 ; WX 765 ; N uni2183 ; G 2127 -U 8580 ; WX 560 ; N uni2184 ; G 2128 -U 8581 ; WX 765 ; N uni2185 ; G 2129 -U 8585 ; WX 969 ; N uni2189 ; G 2130 -U 8592 ; WX 838 ; N arrowleft ; G 2131 -U 8593 ; WX 838 ; N arrowup ; G 2132 -U 8594 ; WX 838 ; N arrowright ; G 2133 -U 8595 ; WX 838 ; N arrowdown ; G 2134 -U 8596 ; WX 838 ; N arrowboth ; G 2135 -U 8597 ; WX 838 ; N arrowupdn ; G 2136 -U 8598 ; WX 838 ; N uni2196 ; G 2137 -U 8599 ; WX 838 ; N uni2197 ; G 2138 -U 8600 ; WX 838 ; N uni2198 ; G 2139 -U 8601 ; WX 838 ; N uni2199 ; G 2140 -U 8602 ; WX 838 ; N uni219A ; G 2141 -U 8603 ; WX 838 ; N uni219B ; G 2142 -U 8604 ; WX 838 ; N uni219C ; G 2143 -U 8605 ; WX 838 ; N uni219D ; G 2144 -U 8606 ; WX 838 ; N uni219E ; G 2145 -U 8607 ; WX 838 ; N uni219F ; G 2146 -U 8608 ; WX 838 ; N uni21A0 ; G 2147 -U 8609 ; WX 838 ; N uni21A1 ; G 2148 -U 8610 ; WX 838 ; N uni21A2 ; G 2149 -U 8611 ; WX 838 ; N uni21A3 ; G 2150 -U 8612 ; WX 838 ; N uni21A4 ; G 2151 -U 8613 ; WX 838 ; N uni21A5 ; G 2152 -U 8614 ; WX 838 ; N uni21A6 ; G 2153 -U 8615 ; WX 838 ; N uni21A7 ; G 2154 -U 8616 ; WX 838 ; N arrowupdnbse ; G 2155 -U 8617 ; WX 838 ; N uni21A9 ; G 2156 -U 8618 ; WX 838 ; N uni21AA ; G 2157 -U 8619 ; WX 838 ; N uni21AB ; G 2158 -U 8620 ; WX 838 ; N uni21AC ; G 2159 -U 8621 ; WX 838 ; N uni21AD ; G 2160 -U 8622 ; WX 838 ; N uni21AE ; G 2161 -U 8623 ; WX 838 ; N uni21AF ; G 2162 -U 8624 ; WX 838 ; N uni21B0 ; G 2163 -U 8625 ; WX 838 ; N uni21B1 ; G 2164 -U 8626 ; WX 838 ; N uni21B2 ; G 2165 -U 8627 ; WX 838 ; N uni21B3 ; G 2166 -U 8628 ; WX 838 ; N uni21B4 ; G 2167 -U 8629 ; WX 838 ; N carriagereturn ; G 2168 -U 8630 ; WX 838 ; N uni21B6 ; G 2169 -U 8631 ; WX 838 ; N uni21B7 ; G 2170 -U 8632 ; WX 838 ; N uni21B8 ; G 2171 -U 8633 ; WX 838 ; N uni21B9 ; G 2172 -U 8634 ; WX 838 ; N uni21BA ; G 2173 -U 8635 ; WX 838 ; N uni21BB ; G 2174 -U 8636 ; WX 838 ; N uni21BC ; G 2175 -U 8637 ; WX 838 ; N uni21BD ; G 2176 -U 8638 ; WX 838 ; N uni21BE ; G 2177 -U 8639 ; WX 838 ; N uni21BF ; G 2178 -U 8640 ; WX 838 ; N uni21C0 ; G 2179 -U 8641 ; WX 838 ; N uni21C1 ; G 2180 -U 8642 ; WX 838 ; N uni21C2 ; G 2181 -U 8643 ; WX 838 ; N uni21C3 ; G 2182 -U 8644 ; WX 838 ; N uni21C4 ; G 2183 -U 8645 ; WX 838 ; N uni21C5 ; G 2184 -U 8646 ; WX 838 ; N uni21C6 ; G 2185 -U 8647 ; WX 838 ; N uni21C7 ; G 2186 -U 8648 ; WX 838 ; N uni21C8 ; G 2187 -U 8649 ; WX 838 ; N uni21C9 ; G 2188 -U 8650 ; WX 838 ; N uni21CA ; G 2189 -U 8651 ; WX 838 ; N uni21CB ; G 2190 -U 8652 ; WX 838 ; N uni21CC ; G 2191 -U 8653 ; WX 838 ; N uni21CD ; G 2192 -U 8654 ; WX 838 ; N uni21CE ; G 2193 -U 8655 ; WX 838 ; N uni21CF ; G 2194 -U 8656 ; WX 838 ; N arrowdblleft ; G 2195 -U 8657 ; WX 838 ; N arrowdblup ; G 2196 -U 8658 ; WX 838 ; N arrowdblright ; G 2197 -U 8659 ; WX 838 ; N arrowdbldown ; G 2198 -U 8660 ; WX 838 ; N arrowdblboth ; G 2199 -U 8661 ; WX 838 ; N uni21D5 ; G 2200 -U 8662 ; WX 838 ; N uni21D6 ; G 2201 -U 8663 ; WX 838 ; N uni21D7 ; G 2202 -U 8664 ; WX 838 ; N uni21D8 ; G 2203 -U 8665 ; WX 838 ; N uni21D9 ; G 2204 -U 8666 ; WX 838 ; N uni21DA ; G 2205 -U 8667 ; WX 838 ; N uni21DB ; G 2206 -U 8668 ; WX 838 ; N uni21DC ; G 2207 -U 8669 ; WX 838 ; N uni21DD ; G 2208 -U 8670 ; WX 838 ; N uni21DE ; G 2209 -U 8671 ; WX 838 ; N uni21DF ; G 2210 -U 8672 ; WX 838 ; N uni21E0 ; G 2211 -U 8673 ; WX 838 ; N uni21E1 ; G 2212 -U 8674 ; WX 838 ; N uni21E2 ; G 2213 -U 8675 ; WX 838 ; N uni21E3 ; G 2214 -U 8676 ; WX 838 ; N uni21E4 ; G 2215 -U 8677 ; WX 838 ; N uni21E5 ; G 2216 -U 8678 ; WX 838 ; N uni21E6 ; G 2217 -U 8679 ; WX 838 ; N uni21E7 ; G 2218 -U 8680 ; WX 838 ; N uni21E8 ; G 2219 -U 8681 ; WX 838 ; N uni21E9 ; G 2220 -U 8682 ; WX 838 ; N uni21EA ; G 2221 -U 8683 ; WX 838 ; N uni21EB ; G 2222 -U 8684 ; WX 838 ; N uni21EC ; G 2223 -U 8685 ; WX 838 ; N uni21ED ; G 2224 -U 8686 ; WX 838 ; N uni21EE ; G 2225 -U 8687 ; WX 838 ; N uni21EF ; G 2226 -U 8688 ; WX 838 ; N uni21F0 ; G 2227 -U 8689 ; WX 838 ; N uni21F1 ; G 2228 -U 8690 ; WX 838 ; N uni21F2 ; G 2229 -U 8691 ; WX 838 ; N uni21F3 ; G 2230 -U 8692 ; WX 838 ; N uni21F4 ; G 2231 -U 8693 ; WX 838 ; N uni21F5 ; G 2232 -U 8694 ; WX 838 ; N uni21F6 ; G 2233 -U 8695 ; WX 838 ; N uni21F7 ; G 2234 -U 8696 ; WX 838 ; N uni21F8 ; G 2235 -U 8697 ; WX 838 ; N uni21F9 ; G 2236 -U 8698 ; WX 838 ; N uni21FA ; G 2237 -U 8699 ; WX 838 ; N uni21FB ; G 2238 -U 8700 ; WX 838 ; N uni21FC ; G 2239 -U 8701 ; WX 838 ; N uni21FD ; G 2240 -U 8702 ; WX 838 ; N uni21FE ; G 2241 -U 8703 ; WX 838 ; N uni21FF ; G 2242 -U 8704 ; WX 604 ; N universal ; G 2243 -U 8706 ; WX 517 ; N partialdiff ; G 2244 -U 8707 ; WX 542 ; N existential ; G 2245 -U 8708 ; WX 542 ; N uni2204 ; G 2246 -U 8710 ; WX 698 ; N increment ; G 2247 -U 8711 ; WX 698 ; N gradient ; G 2248 -U 8712 ; WX 740 ; N element ; G 2249 -U 8713 ; WX 740 ; N notelement ; G 2250 -U 8715 ; WX 740 ; N suchthat ; G 2251 -U 8716 ; WX 740 ; N uni220C ; G 2252 -U 8719 ; WX 796 ; N product ; G 2253 -U 8720 ; WX 796 ; N uni2210 ; G 2254 -U 8721 ; WX 714 ; N summation ; G 2255 -U 8722 ; WX 838 ; N minus ; G 2256 -U 8723 ; WX 838 ; N uni2213 ; G 2257 -U 8724 ; WX 838 ; N uni2214 ; G 2258 -U 8725 ; WX 337 ; N uni2215 ; G 2259 -U 8727 ; WX 680 ; N asteriskmath ; G 2260 -U 8728 ; WX 490 ; N uni2218 ; G 2261 -U 8729 ; WX 490 ; N uni2219 ; G 2262 -U 8730 ; WX 637 ; N radical ; G 2263 -U 8731 ; WX 637 ; N uni221B ; G 2264 -U 8732 ; WX 637 ; N uni221C ; G 2265 -U 8733 ; WX 677 ; N proportional ; G 2266 -U 8734 ; WX 833 ; N infinity ; G 2267 -U 8735 ; WX 838 ; N orthogonal ; G 2268 -U 8736 ; WX 838 ; N angle ; G 2269 -U 8739 ; WX 291 ; N uni2223 ; G 2270 -U 8740 ; WX 479 ; N uni2224 ; G 2271 -U 8741 ; WX 462 ; N uni2225 ; G 2272 -U 8742 ; WX 634 ; N uni2226 ; G 2273 -U 8743 ; WX 732 ; N logicaland ; G 2274 -U 8744 ; WX 732 ; N logicalor ; G 2275 -U 8745 ; WX 838 ; N intersection ; G 2276 -U 8746 ; WX 838 ; N union ; G 2277 -U 8747 ; WX 521 ; N integral ; G 2278 -U 8748 ; WX 852 ; N uni222C ; G 2279 -U 8749 ; WX 1182 ; N uni222D ; G 2280 -U 8760 ; WX 838 ; N uni2238 ; G 2281 -U 8761 ; WX 838 ; N uni2239 ; G 2282 -U 8762 ; WX 838 ; N uni223A ; G 2283 -U 8763 ; WX 838 ; N uni223B ; G 2284 -U 8764 ; WX 838 ; N similar ; G 2285 -U 8765 ; WX 838 ; N uni223D ; G 2286 -U 8770 ; WX 838 ; N uni2242 ; G 2287 -U 8771 ; WX 838 ; N uni2243 ; G 2288 -U 8776 ; WX 838 ; N approxequal ; G 2289 -U 8784 ; WX 838 ; N uni2250 ; G 2290 -U 8785 ; WX 838 ; N uni2251 ; G 2291 -U 8786 ; WX 838 ; N uni2252 ; G 2292 -U 8787 ; WX 838 ; N uni2253 ; G 2293 -U 8788 ; WX 1033 ; N uni2254 ; G 2294 -U 8789 ; WX 1033 ; N uni2255 ; G 2295 -U 8800 ; WX 838 ; N notequal ; G 2296 -U 8801 ; WX 838 ; N equivalence ; G 2297 -U 8804 ; WX 838 ; N lessequal ; G 2298 -U 8805 ; WX 838 ; N greaterequal ; G 2299 -U 8834 ; WX 838 ; N propersubset ; G 2300 -U 8835 ; WX 838 ; N propersuperset ; G 2301 -U 8836 ; WX 838 ; N notsubset ; G 2302 -U 8837 ; WX 838 ; N uni2285 ; G 2303 -U 8838 ; WX 838 ; N reflexsubset ; G 2304 -U 8839 ; WX 838 ; N reflexsuperset ; G 2305 -U 8844 ; WX 838 ; N uni228C ; G 2306 -U 8845 ; WX 838 ; N uni228D ; G 2307 -U 8846 ; WX 838 ; N uni228E ; G 2308 -U 8847 ; WX 846 ; N uni228F ; G 2309 -U 8848 ; WX 846 ; N uni2290 ; G 2310 -U 8849 ; WX 846 ; N uni2291 ; G 2311 -U 8850 ; WX 846 ; N uni2292 ; G 2312 -U 8851 ; WX 838 ; N uni2293 ; G 2313 -U 8852 ; WX 838 ; N uni2294 ; G 2314 -U 8853 ; WX 838 ; N circleplus ; G 2315 -U 8854 ; WX 838 ; N uni2296 ; G 2316 -U 8855 ; WX 838 ; N circlemultiply ; G 2317 -U 8856 ; WX 838 ; N uni2298 ; G 2318 -U 8857 ; WX 838 ; N uni2299 ; G 2319 -U 8858 ; WX 838 ; N uni229A ; G 2320 -U 8859 ; WX 838 ; N uni229B ; G 2321 -U 8860 ; WX 838 ; N uni229C ; G 2322 -U 8861 ; WX 838 ; N uni229D ; G 2323 -U 8862 ; WX 838 ; N uni229E ; G 2324 -U 8863 ; WX 838 ; N uni229F ; G 2325 -U 8864 ; WX 838 ; N uni22A0 ; G 2326 -U 8865 ; WX 838 ; N uni22A1 ; G 2327 -U 8866 ; WX 860 ; N uni22A2 ; G 2328 -U 8867 ; WX 860 ; N uni22A3 ; G 2329 -U 8868 ; WX 940 ; N uni22A4 ; G 2330 -U 8869 ; WX 940 ; N perpendicular ; G 2331 -U 8870 ; WX 567 ; N uni22A6 ; G 2332 -U 8871 ; WX 567 ; N uni22A7 ; G 2333 -U 8872 ; WX 860 ; N uni22A8 ; G 2334 -U 8873 ; WX 860 ; N uni22A9 ; G 2335 -U 8874 ; WX 860 ; N uni22AA ; G 2336 -U 8875 ; WX 1031 ; N uni22AB ; G 2337 -U 8876 ; WX 860 ; N uni22AC ; G 2338 -U 8877 ; WX 860 ; N uni22AD ; G 2339 -U 8878 ; WX 860 ; N uni22AE ; G 2340 -U 8879 ; WX 1031 ; N uni22AF ; G 2341 -U 8900 ; WX 626 ; N uni22C4 ; G 2342 -U 8901 ; WX 342 ; N dotmath ; G 2343 -U 8962 ; WX 764 ; N house ; G 2344 -U 8968 ; WX 390 ; N uni2308 ; G 2345 -U 8969 ; WX 390 ; N uni2309 ; G 2346 -U 8970 ; WX 390 ; N uni230A ; G 2347 -U 8971 ; WX 390 ; N uni230B ; G 2348 -U 8976 ; WX 838 ; N revlogicalnot ; G 2349 -U 8977 ; WX 513 ; N uni2311 ; G 2350 -U 8984 ; WX 1000 ; N uni2318 ; G 2351 -U 8985 ; WX 838 ; N uni2319 ; G 2352 -U 8992 ; WX 521 ; N integraltp ; G 2353 -U 8993 ; WX 521 ; N integralbt ; G 2354 -U 8997 ; WX 1000 ; N uni2325 ; G 2355 -U 9000 ; WX 1443 ; N uni2328 ; G 2356 -U 9085 ; WX 919 ; N uni237D ; G 2357 -U 9115 ; WX 500 ; N uni239B ; G 2358 -U 9116 ; WX 500 ; N uni239C ; G 2359 -U 9117 ; WX 500 ; N uni239D ; G 2360 -U 9118 ; WX 500 ; N uni239E ; G 2361 -U 9119 ; WX 500 ; N uni239F ; G 2362 -U 9120 ; WX 500 ; N uni23A0 ; G 2363 -U 9121 ; WX 500 ; N uni23A1 ; G 2364 -U 9122 ; WX 500 ; N uni23A2 ; G 2365 -U 9123 ; WX 500 ; N uni23A3 ; G 2366 -U 9124 ; WX 500 ; N uni23A4 ; G 2367 -U 9125 ; WX 500 ; N uni23A5 ; G 2368 -U 9126 ; WX 500 ; N uni23A6 ; G 2369 -U 9127 ; WX 750 ; N uni23A7 ; G 2370 -U 9128 ; WX 750 ; N uni23A8 ; G 2371 -U 9129 ; WX 750 ; N uni23A9 ; G 2372 -U 9130 ; WX 750 ; N uni23AA ; G 2373 -U 9131 ; WX 750 ; N uni23AB ; G 2374 -U 9132 ; WX 750 ; N uni23AC ; G 2375 -U 9133 ; WX 750 ; N uni23AD ; G 2376 -U 9134 ; WX 521 ; N uni23AE ; G 2377 -U 9143 ; WX 637 ; N uni23B7 ; G 2378 -U 9167 ; WX 945 ; N uni23CF ; G 2379 -U 9251 ; WX 764 ; N uni2423 ; G 2380 -U 9472 ; WX 602 ; N SF100000 ; G 2381 -U 9473 ; WX 602 ; N uni2501 ; G 2382 -U 9474 ; WX 602 ; N SF110000 ; G 2383 -U 9475 ; WX 602 ; N uni2503 ; G 2384 -U 9476 ; WX 602 ; N uni2504 ; G 2385 -U 9477 ; WX 602 ; N uni2505 ; G 2386 -U 9478 ; WX 602 ; N uni2506 ; G 2387 -U 9479 ; WX 602 ; N uni2507 ; G 2388 -U 9480 ; WX 602 ; N uni2508 ; G 2389 -U 9481 ; WX 602 ; N uni2509 ; G 2390 -U 9482 ; WX 602 ; N uni250A ; G 2391 -U 9483 ; WX 602 ; N uni250B ; G 2392 -U 9484 ; WX 602 ; N SF010000 ; G 2393 -U 9485 ; WX 602 ; N uni250D ; G 2394 -U 9486 ; WX 602 ; N uni250E ; G 2395 -U 9487 ; WX 602 ; N uni250F ; G 2396 -U 9488 ; WX 602 ; N SF030000 ; G 2397 -U 9489 ; WX 602 ; N uni2511 ; G 2398 -U 9490 ; WX 602 ; N uni2512 ; G 2399 -U 9491 ; WX 602 ; N uni2513 ; G 2400 -U 9492 ; WX 602 ; N SF020000 ; G 2401 -U 9493 ; WX 602 ; N uni2515 ; G 2402 -U 9494 ; WX 602 ; N uni2516 ; G 2403 -U 9495 ; WX 602 ; N uni2517 ; G 2404 -U 9496 ; WX 602 ; N SF040000 ; G 2405 -U 9497 ; WX 602 ; N uni2519 ; G 2406 -U 9498 ; WX 602 ; N uni251A ; G 2407 -U 9499 ; WX 602 ; N uni251B ; G 2408 -U 9500 ; WX 602 ; N SF080000 ; G 2409 -U 9501 ; WX 602 ; N uni251D ; G 2410 -U 9502 ; WX 602 ; N uni251E ; G 2411 -U 9503 ; WX 602 ; N uni251F ; G 2412 -U 9504 ; WX 602 ; N uni2520 ; G 2413 -U 9505 ; WX 602 ; N uni2521 ; G 2414 -U 9506 ; WX 602 ; N uni2522 ; G 2415 -U 9507 ; WX 602 ; N uni2523 ; G 2416 -U 9508 ; WX 602 ; N SF090000 ; G 2417 -U 9509 ; WX 602 ; N uni2525 ; G 2418 -U 9510 ; WX 602 ; N uni2526 ; G 2419 -U 9511 ; WX 602 ; N uni2527 ; G 2420 -U 9512 ; WX 602 ; N uni2528 ; G 2421 -U 9513 ; WX 602 ; N uni2529 ; G 2422 -U 9514 ; WX 602 ; N uni252A ; G 2423 -U 9515 ; WX 602 ; N uni252B ; G 2424 -U 9516 ; WX 602 ; N SF060000 ; G 2425 -U 9517 ; WX 602 ; N uni252D ; G 2426 -U 9518 ; WX 602 ; N uni252E ; G 2427 -U 9519 ; WX 602 ; N uni252F ; G 2428 -U 9520 ; WX 602 ; N uni2530 ; G 2429 -U 9521 ; WX 602 ; N uni2531 ; G 2430 -U 9522 ; WX 602 ; N uni2532 ; G 2431 -U 9523 ; WX 602 ; N uni2533 ; G 2432 -U 9524 ; WX 602 ; N SF070000 ; G 2433 -U 9525 ; WX 602 ; N uni2535 ; G 2434 -U 9526 ; WX 602 ; N uni2536 ; G 2435 -U 9527 ; WX 602 ; N uni2537 ; G 2436 -U 9528 ; WX 602 ; N uni2538 ; G 2437 -U 9529 ; WX 602 ; N uni2539 ; G 2438 -U 9530 ; WX 602 ; N uni253A ; G 2439 -U 9531 ; WX 602 ; N uni253B ; G 2440 -U 9532 ; WX 602 ; N SF050000 ; G 2441 -U 9533 ; WX 602 ; N uni253D ; G 2442 -U 9534 ; WX 602 ; N uni253E ; G 2443 -U 9535 ; WX 602 ; N uni253F ; G 2444 -U 9536 ; WX 602 ; N uni2540 ; G 2445 -U 9537 ; WX 602 ; N uni2541 ; G 2446 -U 9538 ; WX 602 ; N uni2542 ; G 2447 -U 9539 ; WX 602 ; N uni2543 ; G 2448 -U 9540 ; WX 602 ; N uni2544 ; G 2449 -U 9541 ; WX 602 ; N uni2545 ; G 2450 -U 9542 ; WX 602 ; N uni2546 ; G 2451 -U 9543 ; WX 602 ; N uni2547 ; G 2452 -U 9544 ; WX 602 ; N uni2548 ; G 2453 -U 9545 ; WX 602 ; N uni2549 ; G 2454 -U 9546 ; WX 602 ; N uni254A ; G 2455 -U 9547 ; WX 602 ; N uni254B ; G 2456 -U 9548 ; WX 602 ; N uni254C ; G 2457 -U 9549 ; WX 602 ; N uni254D ; G 2458 -U 9550 ; WX 602 ; N uni254E ; G 2459 -U 9551 ; WX 602 ; N uni254F ; G 2460 -U 9552 ; WX 602 ; N SF430000 ; G 2461 -U 9553 ; WX 602 ; N SF240000 ; G 2462 -U 9554 ; WX 602 ; N SF510000 ; G 2463 -U 9555 ; WX 602 ; N SF520000 ; G 2464 -U 9556 ; WX 602 ; N SF390000 ; G 2465 -U 9557 ; WX 602 ; N SF220000 ; G 2466 -U 9558 ; WX 602 ; N SF210000 ; G 2467 -U 9559 ; WX 602 ; N SF250000 ; G 2468 -U 9560 ; WX 602 ; N SF500000 ; G 2469 -U 9561 ; WX 602 ; N SF490000 ; G 2470 -U 9562 ; WX 602 ; N SF380000 ; G 2471 -U 9563 ; WX 602 ; N SF280000 ; G 2472 -U 9564 ; WX 602 ; N SF270000 ; G 2473 -U 9565 ; WX 602 ; N SF260000 ; G 2474 -U 9566 ; WX 602 ; N SF360000 ; G 2475 -U 9567 ; WX 602 ; N SF370000 ; G 2476 -U 9568 ; WX 602 ; N SF420000 ; G 2477 -U 9569 ; WX 602 ; N SF190000 ; G 2478 -U 9570 ; WX 602 ; N SF200000 ; G 2479 -U 9571 ; WX 602 ; N SF230000 ; G 2480 -U 9572 ; WX 602 ; N SF470000 ; G 2481 -U 9573 ; WX 602 ; N SF480000 ; G 2482 -U 9574 ; WX 602 ; N SF410000 ; G 2483 -U 9575 ; WX 602 ; N SF450000 ; G 2484 -U 9576 ; WX 602 ; N SF460000 ; G 2485 -U 9577 ; WX 602 ; N SF400000 ; G 2486 -U 9578 ; WX 602 ; N SF540000 ; G 2487 -U 9579 ; WX 602 ; N SF530000 ; G 2488 -U 9580 ; WX 602 ; N SF440000 ; G 2489 -U 9581 ; WX 602 ; N uni256D ; G 2490 -U 9582 ; WX 602 ; N uni256E ; G 2491 -U 9583 ; WX 602 ; N uni256F ; G 2492 -U 9584 ; WX 602 ; N uni2570 ; G 2493 -U 9585 ; WX 602 ; N uni2571 ; G 2494 -U 9586 ; WX 602 ; N uni2572 ; G 2495 -U 9587 ; WX 602 ; N uni2573 ; G 2496 -U 9588 ; WX 602 ; N uni2574 ; G 2497 -U 9589 ; WX 602 ; N uni2575 ; G 2498 -U 9590 ; WX 602 ; N uni2576 ; G 2499 -U 9591 ; WX 602 ; N uni2577 ; G 2500 -U 9592 ; WX 602 ; N uni2578 ; G 2501 -U 9593 ; WX 602 ; N uni2579 ; G 2502 -U 9594 ; WX 602 ; N uni257A ; G 2503 -U 9595 ; WX 602 ; N uni257B ; G 2504 -U 9596 ; WX 602 ; N uni257C ; G 2505 -U 9597 ; WX 602 ; N uni257D ; G 2506 -U 9598 ; WX 602 ; N uni257E ; G 2507 -U 9599 ; WX 602 ; N uni257F ; G 2508 -U 9600 ; WX 769 ; N upblock ; G 2509 -U 9601 ; WX 769 ; N uni2581 ; G 2510 -U 9602 ; WX 769 ; N uni2582 ; G 2511 -U 9603 ; WX 769 ; N uni2583 ; G 2512 -U 9604 ; WX 769 ; N dnblock ; G 2513 -U 9605 ; WX 769 ; N uni2585 ; G 2514 -U 9606 ; WX 769 ; N uni2586 ; G 2515 -U 9607 ; WX 769 ; N uni2587 ; G 2516 -U 9608 ; WX 769 ; N block ; G 2517 -U 9609 ; WX 769 ; N uni2589 ; G 2518 -U 9610 ; WX 769 ; N uni258A ; G 2519 -U 9611 ; WX 769 ; N uni258B ; G 2520 -U 9612 ; WX 769 ; N lfblock ; G 2521 -U 9613 ; WX 769 ; N uni258D ; G 2522 -U 9614 ; WX 769 ; N uni258E ; G 2523 -U 9615 ; WX 769 ; N uni258F ; G 2524 -U 9616 ; WX 769 ; N rtblock ; G 2525 -U 9617 ; WX 769 ; N ltshade ; G 2526 -U 9618 ; WX 769 ; N shade ; G 2527 -U 9619 ; WX 769 ; N dkshade ; G 2528 -U 9620 ; WX 769 ; N uni2594 ; G 2529 -U 9621 ; WX 769 ; N uni2595 ; G 2530 -U 9622 ; WX 769 ; N uni2596 ; G 2531 -U 9623 ; WX 769 ; N uni2597 ; G 2532 -U 9624 ; WX 769 ; N uni2598 ; G 2533 -U 9625 ; WX 769 ; N uni2599 ; G 2534 -U 9626 ; WX 769 ; N uni259A ; G 2535 -U 9627 ; WX 769 ; N uni259B ; G 2536 -U 9628 ; WX 769 ; N uni259C ; G 2537 -U 9629 ; WX 769 ; N uni259D ; G 2538 -U 9630 ; WX 769 ; N uni259E ; G 2539 -U 9631 ; WX 769 ; N uni259F ; G 2540 -U 9632 ; WX 945 ; N filledbox ; G 2541 -U 9633 ; WX 945 ; N H22073 ; G 2542 -U 9634 ; WX 945 ; N uni25A2 ; G 2543 -U 9635 ; WX 945 ; N uni25A3 ; G 2544 -U 9636 ; WX 945 ; N uni25A4 ; G 2545 -U 9637 ; WX 945 ; N uni25A5 ; G 2546 -U 9638 ; WX 945 ; N uni25A6 ; G 2547 -U 9639 ; WX 945 ; N uni25A7 ; G 2548 -U 9640 ; WX 945 ; N uni25A8 ; G 2549 -U 9641 ; WX 945 ; N uni25A9 ; G 2550 -U 9642 ; WX 678 ; N H18543 ; G 2551 -U 9643 ; WX 678 ; N H18551 ; G 2552 -U 9644 ; WX 945 ; N filledrect ; G 2553 -U 9645 ; WX 945 ; N uni25AD ; G 2554 -U 9646 ; WX 550 ; N uni25AE ; G 2555 -U 9647 ; WX 550 ; N uni25AF ; G 2556 -U 9648 ; WX 769 ; N uni25B0 ; G 2557 -U 9649 ; WX 769 ; N uni25B1 ; G 2558 -U 9650 ; WX 769 ; N triagup ; G 2559 -U 9651 ; WX 769 ; N uni25B3 ; G 2560 -U 9652 ; WX 502 ; N uni25B4 ; G 2561 -U 9653 ; WX 502 ; N uni25B5 ; G 2562 -U 9654 ; WX 769 ; N uni25B6 ; G 2563 -U 9655 ; WX 769 ; N uni25B7 ; G 2564 -U 9656 ; WX 502 ; N uni25B8 ; G 2565 -U 9657 ; WX 502 ; N uni25B9 ; G 2566 -U 9658 ; WX 769 ; N triagrt ; G 2567 -U 9659 ; WX 769 ; N uni25BB ; G 2568 -U 9660 ; WX 769 ; N triagdn ; G 2569 -U 9661 ; WX 769 ; N uni25BD ; G 2570 -U 9662 ; WX 502 ; N uni25BE ; G 2571 -U 9663 ; WX 502 ; N uni25BF ; G 2572 -U 9664 ; WX 769 ; N uni25C0 ; G 2573 -U 9665 ; WX 769 ; N uni25C1 ; G 2574 -U 9666 ; WX 502 ; N uni25C2 ; G 2575 -U 9667 ; WX 502 ; N uni25C3 ; G 2576 -U 9668 ; WX 769 ; N triaglf ; G 2577 -U 9669 ; WX 769 ; N uni25C5 ; G 2578 -U 9670 ; WX 769 ; N uni25C6 ; G 2579 -U 9671 ; WX 769 ; N uni25C7 ; G 2580 -U 9672 ; WX 769 ; N uni25C8 ; G 2581 -U 9673 ; WX 873 ; N uni25C9 ; G 2582 -U 9674 ; WX 494 ; N lozenge ; G 2583 -U 9675 ; WX 873 ; N circle ; G 2584 -U 9676 ; WX 873 ; N uni25CC ; G 2585 -U 9677 ; WX 873 ; N uni25CD ; G 2586 -U 9678 ; WX 873 ; N uni25CE ; G 2587 -U 9679 ; WX 873 ; N H18533 ; G 2588 -U 9680 ; WX 873 ; N uni25D0 ; G 2589 -U 9681 ; WX 873 ; N uni25D1 ; G 2590 -U 9682 ; WX 873 ; N uni25D2 ; G 2591 -U 9683 ; WX 873 ; N uni25D3 ; G 2592 -U 9684 ; WX 873 ; N uni25D4 ; G 2593 -U 9685 ; WX 873 ; N uni25D5 ; G 2594 -U 9686 ; WX 527 ; N uni25D6 ; G 2595 -U 9687 ; WX 527 ; N uni25D7 ; G 2596 -U 9688 ; WX 791 ; N invbullet ; G 2597 -U 9689 ; WX 970 ; N invcircle ; G 2598 -U 9690 ; WX 970 ; N uni25DA ; G 2599 -U 9691 ; WX 970 ; N uni25DB ; G 2600 -U 9692 ; WX 387 ; N uni25DC ; G 2601 -U 9693 ; WX 387 ; N uni25DD ; G 2602 -U 9694 ; WX 387 ; N uni25DE ; G 2603 -U 9695 ; WX 387 ; N uni25DF ; G 2604 -U 9696 ; WX 873 ; N uni25E0 ; G 2605 -U 9697 ; WX 873 ; N uni25E1 ; G 2606 -U 9698 ; WX 769 ; N uni25E2 ; G 2607 -U 9699 ; WX 769 ; N uni25E3 ; G 2608 -U 9700 ; WX 769 ; N uni25E4 ; G 2609 -U 9701 ; WX 769 ; N uni25E5 ; G 2610 -U 9702 ; WX 590 ; N openbullet ; G 2611 -U 9703 ; WX 945 ; N uni25E7 ; G 2612 -U 9704 ; WX 945 ; N uni25E8 ; G 2613 -U 9705 ; WX 945 ; N uni25E9 ; G 2614 -U 9706 ; WX 945 ; N uni25EA ; G 2615 -U 9707 ; WX 945 ; N uni25EB ; G 2616 -U 9708 ; WX 769 ; N uni25EC ; G 2617 -U 9709 ; WX 769 ; N uni25ED ; G 2618 -U 9710 ; WX 769 ; N uni25EE ; G 2619 -U 9711 ; WX 1119 ; N uni25EF ; G 2620 -U 9712 ; WX 945 ; N uni25F0 ; G 2621 -U 9713 ; WX 945 ; N uni25F1 ; G 2622 -U 9714 ; WX 945 ; N uni25F2 ; G 2623 -U 9715 ; WX 945 ; N uni25F3 ; G 2624 -U 9716 ; WX 873 ; N uni25F4 ; G 2625 -U 9717 ; WX 873 ; N uni25F5 ; G 2626 -U 9718 ; WX 873 ; N uni25F6 ; G 2627 -U 9719 ; WX 873 ; N uni25F7 ; G 2628 -U 9720 ; WX 769 ; N uni25F8 ; G 2629 -U 9721 ; WX 769 ; N uni25F9 ; G 2630 -U 9722 ; WX 769 ; N uni25FA ; G 2631 -U 9723 ; WX 830 ; N uni25FB ; G 2632 -U 9724 ; WX 830 ; N uni25FC ; G 2633 -U 9725 ; WX 732 ; N uni25FD ; G 2634 -U 9726 ; WX 732 ; N uni25FE ; G 2635 -U 9727 ; WX 769 ; N uni25FF ; G 2636 -U 9728 ; WX 896 ; N uni2600 ; G 2637 -U 9784 ; WX 896 ; N uni2638 ; G 2638 -U 9785 ; WX 896 ; N uni2639 ; G 2639 -U 9786 ; WX 896 ; N smileface ; G 2640 -U 9787 ; WX 896 ; N invsmileface ; G 2641 -U 9788 ; WX 896 ; N sun ; G 2642 -U 9791 ; WX 614 ; N uni263F ; G 2643 -U 9792 ; WX 731 ; N female ; G 2644 -U 9793 ; WX 731 ; N uni2641 ; G 2645 -U 9794 ; WX 896 ; N male ; G 2646 -U 9795 ; WX 896 ; N uni2643 ; G 2647 -U 9796 ; WX 896 ; N uni2644 ; G 2648 -U 9797 ; WX 896 ; N uni2645 ; G 2649 -U 9798 ; WX 896 ; N uni2646 ; G 2650 -U 9799 ; WX 896 ; N uni2647 ; G 2651 -U 9824 ; WX 896 ; N spade ; G 2652 -U 9825 ; WX 896 ; N uni2661 ; G 2653 -U 9826 ; WX 896 ; N uni2662 ; G 2654 -U 9827 ; WX 896 ; N club ; G 2655 -U 9828 ; WX 896 ; N uni2664 ; G 2656 -U 9829 ; WX 896 ; N heart ; G 2657 -U 9830 ; WX 896 ; N diamond ; G 2658 -U 9831 ; WX 896 ; N uni2667 ; G 2659 -U 9833 ; WX 472 ; N uni2669 ; G 2660 -U 9834 ; WX 638 ; N musicalnote ; G 2661 -U 9835 ; WX 896 ; N musicalnotedbl ; G 2662 -U 9836 ; WX 896 ; N uni266C ; G 2663 -U 9837 ; WX 472 ; N uni266D ; G 2664 -U 9838 ; WX 357 ; N uni266E ; G 2665 -U 9839 ; WX 484 ; N uni266F ; G 2666 -U 10145 ; WX 838 ; N uni27A1 ; G 2667 -U 10181 ; WX 390 ; N uni27C5 ; G 2668 -U 10182 ; WX 390 ; N uni27C6 ; G 2669 -U 10208 ; WX 494 ; N uni27E0 ; G 2670 -U 10216 ; WX 390 ; N uni27E8 ; G 2671 -U 10217 ; WX 390 ; N uni27E9 ; G 2672 -U 10224 ; WX 838 ; N uni27F0 ; G 2673 -U 10225 ; WX 838 ; N uni27F1 ; G 2674 -U 10226 ; WX 838 ; N uni27F2 ; G 2675 -U 10227 ; WX 838 ; N uni27F3 ; G 2676 -U 10228 ; WX 1033 ; N uni27F4 ; G 2677 -U 10229 ; WX 1434 ; N uni27F5 ; G 2678 -U 10230 ; WX 1434 ; N uni27F6 ; G 2679 -U 10231 ; WX 1434 ; N uni27F7 ; G 2680 -U 10232 ; WX 1434 ; N uni27F8 ; G 2681 -U 10233 ; WX 1434 ; N uni27F9 ; G 2682 -U 10234 ; WX 1434 ; N uni27FA ; G 2683 -U 10235 ; WX 1434 ; N uni27FB ; G 2684 -U 10236 ; WX 1434 ; N uni27FC ; G 2685 -U 10237 ; WX 1434 ; N uni27FD ; G 2686 -U 10238 ; WX 1434 ; N uni27FE ; G 2687 -U 10239 ; WX 1434 ; N uni27FF ; G 2688 -U 10240 ; WX 732 ; N uni2800 ; G 2689 -U 10241 ; WX 732 ; N uni2801 ; G 2690 -U 10242 ; WX 732 ; N uni2802 ; G 2691 -U 10243 ; WX 732 ; N uni2803 ; G 2692 -U 10244 ; WX 732 ; N uni2804 ; G 2693 -U 10245 ; WX 732 ; N uni2805 ; G 2694 -U 10246 ; WX 732 ; N uni2806 ; G 2695 -U 10247 ; WX 732 ; N uni2807 ; G 2696 -U 10248 ; WX 732 ; N uni2808 ; G 2697 -U 10249 ; WX 732 ; N uni2809 ; G 2698 -U 10250 ; WX 732 ; N uni280A ; G 2699 -U 10251 ; WX 732 ; N uni280B ; G 2700 -U 10252 ; WX 732 ; N uni280C ; G 2701 -U 10253 ; WX 732 ; N uni280D ; G 2702 -U 10254 ; WX 732 ; N uni280E ; G 2703 -U 10255 ; WX 732 ; N uni280F ; G 2704 -U 10256 ; WX 732 ; N uni2810 ; G 2705 -U 10257 ; WX 732 ; N uni2811 ; G 2706 -U 10258 ; WX 732 ; N uni2812 ; G 2707 -U 10259 ; WX 732 ; N uni2813 ; G 2708 -U 10260 ; WX 732 ; N uni2814 ; G 2709 -U 10261 ; WX 732 ; N uni2815 ; G 2710 -U 10262 ; WX 732 ; N uni2816 ; G 2711 -U 10263 ; WX 732 ; N uni2817 ; G 2712 -U 10264 ; WX 732 ; N uni2818 ; G 2713 -U 10265 ; WX 732 ; N uni2819 ; G 2714 -U 10266 ; WX 732 ; N uni281A ; G 2715 -U 10267 ; WX 732 ; N uni281B ; G 2716 -U 10268 ; WX 732 ; N uni281C ; G 2717 -U 10269 ; WX 732 ; N uni281D ; G 2718 -U 10270 ; WX 732 ; N uni281E ; G 2719 -U 10271 ; WX 732 ; N uni281F ; G 2720 -U 10272 ; WX 732 ; N uni2820 ; G 2721 -U 10273 ; WX 732 ; N uni2821 ; G 2722 -U 10274 ; WX 732 ; N uni2822 ; G 2723 -U 10275 ; WX 732 ; N uni2823 ; G 2724 -U 10276 ; WX 732 ; N uni2824 ; G 2725 -U 10277 ; WX 732 ; N uni2825 ; G 2726 -U 10278 ; WX 732 ; N uni2826 ; G 2727 -U 10279 ; WX 732 ; N uni2827 ; G 2728 -U 10280 ; WX 732 ; N uni2828 ; G 2729 -U 10281 ; WX 732 ; N uni2829 ; G 2730 -U 10282 ; WX 732 ; N uni282A ; G 2731 -U 10283 ; WX 732 ; N uni282B ; G 2732 -U 10284 ; WX 732 ; N uni282C ; G 2733 -U 10285 ; WX 732 ; N uni282D ; G 2734 -U 10286 ; WX 732 ; N uni282E ; G 2735 -U 10287 ; WX 732 ; N uni282F ; G 2736 -U 10288 ; WX 732 ; N uni2830 ; G 2737 -U 10289 ; WX 732 ; N uni2831 ; G 2738 -U 10290 ; WX 732 ; N uni2832 ; G 2739 -U 10291 ; WX 732 ; N uni2833 ; G 2740 -U 10292 ; WX 732 ; N uni2834 ; G 2741 -U 10293 ; WX 732 ; N uni2835 ; G 2742 -U 10294 ; WX 732 ; N uni2836 ; G 2743 -U 10295 ; WX 732 ; N uni2837 ; G 2744 -U 10296 ; WX 732 ; N uni2838 ; G 2745 -U 10297 ; WX 732 ; N uni2839 ; G 2746 -U 10298 ; WX 732 ; N uni283A ; G 2747 -U 10299 ; WX 732 ; N uni283B ; G 2748 -U 10300 ; WX 732 ; N uni283C ; G 2749 -U 10301 ; WX 732 ; N uni283D ; G 2750 -U 10302 ; WX 732 ; N uni283E ; G 2751 -U 10303 ; WX 732 ; N uni283F ; G 2752 -U 10304 ; WX 732 ; N uni2840 ; G 2753 -U 10305 ; WX 732 ; N uni2841 ; G 2754 -U 10306 ; WX 732 ; N uni2842 ; G 2755 -U 10307 ; WX 732 ; N uni2843 ; G 2756 -U 10308 ; WX 732 ; N uni2844 ; G 2757 -U 10309 ; WX 732 ; N uni2845 ; G 2758 -U 10310 ; WX 732 ; N uni2846 ; G 2759 -U 10311 ; WX 732 ; N uni2847 ; G 2760 -U 10312 ; WX 732 ; N uni2848 ; G 2761 -U 10313 ; WX 732 ; N uni2849 ; G 2762 -U 10314 ; WX 732 ; N uni284A ; G 2763 -U 10315 ; WX 732 ; N uni284B ; G 2764 -U 10316 ; WX 732 ; N uni284C ; G 2765 -U 10317 ; WX 732 ; N uni284D ; G 2766 -U 10318 ; WX 732 ; N uni284E ; G 2767 -U 10319 ; WX 732 ; N uni284F ; G 2768 -U 10320 ; WX 732 ; N uni2850 ; G 2769 -U 10321 ; WX 732 ; N uni2851 ; G 2770 -U 10322 ; WX 732 ; N uni2852 ; G 2771 -U 10323 ; WX 732 ; N uni2853 ; G 2772 -U 10324 ; WX 732 ; N uni2854 ; G 2773 -U 10325 ; WX 732 ; N uni2855 ; G 2774 -U 10326 ; WX 732 ; N uni2856 ; G 2775 -U 10327 ; WX 732 ; N uni2857 ; G 2776 -U 10328 ; WX 732 ; N uni2858 ; G 2777 -U 10329 ; WX 732 ; N uni2859 ; G 2778 -U 10330 ; WX 732 ; N uni285A ; G 2779 -U 10331 ; WX 732 ; N uni285B ; G 2780 -U 10332 ; WX 732 ; N uni285C ; G 2781 -U 10333 ; WX 732 ; N uni285D ; G 2782 -U 10334 ; WX 732 ; N uni285E ; G 2783 -U 10335 ; WX 732 ; N uni285F ; G 2784 -U 10336 ; WX 732 ; N uni2860 ; G 2785 -U 10337 ; WX 732 ; N uni2861 ; G 2786 -U 10338 ; WX 732 ; N uni2862 ; G 2787 -U 10339 ; WX 732 ; N uni2863 ; G 2788 -U 10340 ; WX 732 ; N uni2864 ; G 2789 -U 10341 ; WX 732 ; N uni2865 ; G 2790 -U 10342 ; WX 732 ; N uni2866 ; G 2791 -U 10343 ; WX 732 ; N uni2867 ; G 2792 -U 10344 ; WX 732 ; N uni2868 ; G 2793 -U 10345 ; WX 732 ; N uni2869 ; G 2794 -U 10346 ; WX 732 ; N uni286A ; G 2795 -U 10347 ; WX 732 ; N uni286B ; G 2796 -U 10348 ; WX 732 ; N uni286C ; G 2797 -U 10349 ; WX 732 ; N uni286D ; G 2798 -U 10350 ; WX 732 ; N uni286E ; G 2799 -U 10351 ; WX 732 ; N uni286F ; G 2800 -U 10352 ; WX 732 ; N uni2870 ; G 2801 -U 10353 ; WX 732 ; N uni2871 ; G 2802 -U 10354 ; WX 732 ; N uni2872 ; G 2803 -U 10355 ; WX 732 ; N uni2873 ; G 2804 -U 10356 ; WX 732 ; N uni2874 ; G 2805 -U 10357 ; WX 732 ; N uni2875 ; G 2806 -U 10358 ; WX 732 ; N uni2876 ; G 2807 -U 10359 ; WX 732 ; N uni2877 ; G 2808 -U 10360 ; WX 732 ; N uni2878 ; G 2809 -U 10361 ; WX 732 ; N uni2879 ; G 2810 -U 10362 ; WX 732 ; N uni287A ; G 2811 -U 10363 ; WX 732 ; N uni287B ; G 2812 -U 10364 ; WX 732 ; N uni287C ; G 2813 -U 10365 ; WX 732 ; N uni287D ; G 2814 -U 10366 ; WX 732 ; N uni287E ; G 2815 -U 10367 ; WX 732 ; N uni287F ; G 2816 -U 10368 ; WX 732 ; N uni2880 ; G 2817 -U 10369 ; WX 732 ; N uni2881 ; G 2818 -U 10370 ; WX 732 ; N uni2882 ; G 2819 -U 10371 ; WX 732 ; N uni2883 ; G 2820 -U 10372 ; WX 732 ; N uni2884 ; G 2821 -U 10373 ; WX 732 ; N uni2885 ; G 2822 -U 10374 ; WX 732 ; N uni2886 ; G 2823 -U 10375 ; WX 732 ; N uni2887 ; G 2824 -U 10376 ; WX 732 ; N uni2888 ; G 2825 -U 10377 ; WX 732 ; N uni2889 ; G 2826 -U 10378 ; WX 732 ; N uni288A ; G 2827 -U 10379 ; WX 732 ; N uni288B ; G 2828 -U 10380 ; WX 732 ; N uni288C ; G 2829 -U 10381 ; WX 732 ; N uni288D ; G 2830 -U 10382 ; WX 732 ; N uni288E ; G 2831 -U 10383 ; WX 732 ; N uni288F ; G 2832 -U 10384 ; WX 732 ; N uni2890 ; G 2833 -U 10385 ; WX 732 ; N uni2891 ; G 2834 -U 10386 ; WX 732 ; N uni2892 ; G 2835 -U 10387 ; WX 732 ; N uni2893 ; G 2836 -U 10388 ; WX 732 ; N uni2894 ; G 2837 -U 10389 ; WX 732 ; N uni2895 ; G 2838 -U 10390 ; WX 732 ; N uni2896 ; G 2839 -U 10391 ; WX 732 ; N uni2897 ; G 2840 -U 10392 ; WX 732 ; N uni2898 ; G 2841 -U 10393 ; WX 732 ; N uni2899 ; G 2842 -U 10394 ; WX 732 ; N uni289A ; G 2843 -U 10395 ; WX 732 ; N uni289B ; G 2844 -U 10396 ; WX 732 ; N uni289C ; G 2845 -U 10397 ; WX 732 ; N uni289D ; G 2846 -U 10398 ; WX 732 ; N uni289E ; G 2847 -U 10399 ; WX 732 ; N uni289F ; G 2848 -U 10400 ; WX 732 ; N uni28A0 ; G 2849 -U 10401 ; WX 732 ; N uni28A1 ; G 2850 -U 10402 ; WX 732 ; N uni28A2 ; G 2851 -U 10403 ; WX 732 ; N uni28A3 ; G 2852 -U 10404 ; WX 732 ; N uni28A4 ; G 2853 -U 10405 ; WX 732 ; N uni28A5 ; G 2854 -U 10406 ; WX 732 ; N uni28A6 ; G 2855 -U 10407 ; WX 732 ; N uni28A7 ; G 2856 -U 10408 ; WX 732 ; N uni28A8 ; G 2857 -U 10409 ; WX 732 ; N uni28A9 ; G 2858 -U 10410 ; WX 732 ; N uni28AA ; G 2859 -U 10411 ; WX 732 ; N uni28AB ; G 2860 -U 10412 ; WX 732 ; N uni28AC ; G 2861 -U 10413 ; WX 732 ; N uni28AD ; G 2862 -U 10414 ; WX 732 ; N uni28AE ; G 2863 -U 10415 ; WX 732 ; N uni28AF ; G 2864 -U 10416 ; WX 732 ; N uni28B0 ; G 2865 -U 10417 ; WX 732 ; N uni28B1 ; G 2866 -U 10418 ; WX 732 ; N uni28B2 ; G 2867 -U 10419 ; WX 732 ; N uni28B3 ; G 2868 -U 10420 ; WX 732 ; N uni28B4 ; G 2869 -U 10421 ; WX 732 ; N uni28B5 ; G 2870 -U 10422 ; WX 732 ; N uni28B6 ; G 2871 -U 10423 ; WX 732 ; N uni28B7 ; G 2872 -U 10424 ; WX 732 ; N uni28B8 ; G 2873 -U 10425 ; WX 732 ; N uni28B9 ; G 2874 -U 10426 ; WX 732 ; N uni28BA ; G 2875 -U 10427 ; WX 732 ; N uni28BB ; G 2876 -U 10428 ; WX 732 ; N uni28BC ; G 2877 -U 10429 ; WX 732 ; N uni28BD ; G 2878 -U 10430 ; WX 732 ; N uni28BE ; G 2879 -U 10431 ; WX 732 ; N uni28BF ; G 2880 -U 10432 ; WX 732 ; N uni28C0 ; G 2881 -U 10433 ; WX 732 ; N uni28C1 ; G 2882 -U 10434 ; WX 732 ; N uni28C2 ; G 2883 -U 10435 ; WX 732 ; N uni28C3 ; G 2884 -U 10436 ; WX 732 ; N uni28C4 ; G 2885 -U 10437 ; WX 732 ; N uni28C5 ; G 2886 -U 10438 ; WX 732 ; N uni28C6 ; G 2887 -U 10439 ; WX 732 ; N uni28C7 ; G 2888 -U 10440 ; WX 732 ; N uni28C8 ; G 2889 -U 10441 ; WX 732 ; N uni28C9 ; G 2890 -U 10442 ; WX 732 ; N uni28CA ; G 2891 -U 10443 ; WX 732 ; N uni28CB ; G 2892 -U 10444 ; WX 732 ; N uni28CC ; G 2893 -U 10445 ; WX 732 ; N uni28CD ; G 2894 -U 10446 ; WX 732 ; N uni28CE ; G 2895 -U 10447 ; WX 732 ; N uni28CF ; G 2896 -U 10448 ; WX 732 ; N uni28D0 ; G 2897 -U 10449 ; WX 732 ; N uni28D1 ; G 2898 -U 10450 ; WX 732 ; N uni28D2 ; G 2899 -U 10451 ; WX 732 ; N uni28D3 ; G 2900 -U 10452 ; WX 732 ; N uni28D4 ; G 2901 -U 10453 ; WX 732 ; N uni28D5 ; G 2902 -U 10454 ; WX 732 ; N uni28D6 ; G 2903 -U 10455 ; WX 732 ; N uni28D7 ; G 2904 -U 10456 ; WX 732 ; N uni28D8 ; G 2905 -U 10457 ; WX 732 ; N uni28D9 ; G 2906 -U 10458 ; WX 732 ; N uni28DA ; G 2907 -U 10459 ; WX 732 ; N uni28DB ; G 2908 -U 10460 ; WX 732 ; N uni28DC ; G 2909 -U 10461 ; WX 732 ; N uni28DD ; G 2910 -U 10462 ; WX 732 ; N uni28DE ; G 2911 -U 10463 ; WX 732 ; N uni28DF ; G 2912 -U 10464 ; WX 732 ; N uni28E0 ; G 2913 -U 10465 ; WX 732 ; N uni28E1 ; G 2914 -U 10466 ; WX 732 ; N uni28E2 ; G 2915 -U 10467 ; WX 732 ; N uni28E3 ; G 2916 -U 10468 ; WX 732 ; N uni28E4 ; G 2917 -U 10469 ; WX 732 ; N uni28E5 ; G 2918 -U 10470 ; WX 732 ; N uni28E6 ; G 2919 -U 10471 ; WX 732 ; N uni28E7 ; G 2920 -U 10472 ; WX 732 ; N uni28E8 ; G 2921 -U 10473 ; WX 732 ; N uni28E9 ; G 2922 -U 10474 ; WX 732 ; N uni28EA ; G 2923 -U 10475 ; WX 732 ; N uni28EB ; G 2924 -U 10476 ; WX 732 ; N uni28EC ; G 2925 -U 10477 ; WX 732 ; N uni28ED ; G 2926 -U 10478 ; WX 732 ; N uni28EE ; G 2927 -U 10479 ; WX 732 ; N uni28EF ; G 2928 -U 10480 ; WX 732 ; N uni28F0 ; G 2929 -U 10481 ; WX 732 ; N uni28F1 ; G 2930 -U 10482 ; WX 732 ; N uni28F2 ; G 2931 -U 10483 ; WX 732 ; N uni28F3 ; G 2932 -U 10484 ; WX 732 ; N uni28F4 ; G 2933 -U 10485 ; WX 732 ; N uni28F5 ; G 2934 -U 10486 ; WX 732 ; N uni28F6 ; G 2935 -U 10487 ; WX 732 ; N uni28F7 ; G 2936 -U 10488 ; WX 732 ; N uni28F8 ; G 2937 -U 10489 ; WX 732 ; N uni28F9 ; G 2938 -U 10490 ; WX 732 ; N uni28FA ; G 2939 -U 10491 ; WX 732 ; N uni28FB ; G 2940 -U 10492 ; WX 732 ; N uni28FC ; G 2941 -U 10493 ; WX 732 ; N uni28FD ; G 2942 -U 10494 ; WX 732 ; N uni28FE ; G 2943 -U 10495 ; WX 732 ; N uni28FF ; G 2944 -U 10496 ; WX 838 ; N uni2900 ; G 2945 -U 10497 ; WX 838 ; N uni2901 ; G 2946 -U 10498 ; WX 838 ; N uni2902 ; G 2947 -U 10499 ; WX 838 ; N uni2903 ; G 2948 -U 10500 ; WX 838 ; N uni2904 ; G 2949 -U 10501 ; WX 838 ; N uni2905 ; G 2950 -U 10502 ; WX 838 ; N uni2906 ; G 2951 -U 10503 ; WX 838 ; N uni2907 ; G 2952 -U 10504 ; WX 838 ; N uni2908 ; G 2953 -U 10505 ; WX 838 ; N uni2909 ; G 2954 -U 10506 ; WX 838 ; N uni290A ; G 2955 -U 10507 ; WX 838 ; N uni290B ; G 2956 -U 10508 ; WX 838 ; N uni290C ; G 2957 -U 10509 ; WX 838 ; N uni290D ; G 2958 -U 10510 ; WX 838 ; N uni290E ; G 2959 -U 10511 ; WX 838 ; N uni290F ; G 2960 -U 10512 ; WX 838 ; N uni2910 ; G 2961 -U 10513 ; WX 838 ; N uni2911 ; G 2962 -U 10514 ; WX 838 ; N uni2912 ; G 2963 -U 10515 ; WX 838 ; N uni2913 ; G 2964 -U 10516 ; WX 838 ; N uni2914 ; G 2965 -U 10517 ; WX 838 ; N uni2915 ; G 2966 -U 10518 ; WX 838 ; N uni2916 ; G 2967 -U 10519 ; WX 838 ; N uni2917 ; G 2968 -U 10520 ; WX 838 ; N uni2918 ; G 2969 -U 10521 ; WX 838 ; N uni2919 ; G 2970 -U 10522 ; WX 838 ; N uni291A ; G 2971 -U 10523 ; WX 838 ; N uni291B ; G 2972 -U 10524 ; WX 838 ; N uni291C ; G 2973 -U 10525 ; WX 838 ; N uni291D ; G 2974 -U 10526 ; WX 838 ; N uni291E ; G 2975 -U 10527 ; WX 838 ; N uni291F ; G 2976 -U 10528 ; WX 838 ; N uni2920 ; G 2977 -U 10529 ; WX 838 ; N uni2921 ; G 2978 -U 10530 ; WX 838 ; N uni2922 ; G 2979 -U 10531 ; WX 838 ; N uni2923 ; G 2980 -U 10532 ; WX 838 ; N uni2924 ; G 2981 -U 10533 ; WX 838 ; N uni2925 ; G 2982 -U 10534 ; WX 838 ; N uni2926 ; G 2983 -U 10535 ; WX 838 ; N uni2927 ; G 2984 -U 10536 ; WX 838 ; N uni2928 ; G 2985 -U 10537 ; WX 838 ; N uni2929 ; G 2986 -U 10538 ; WX 838 ; N uni292A ; G 2987 -U 10539 ; WX 838 ; N uni292B ; G 2988 -U 10540 ; WX 838 ; N uni292C ; G 2989 -U 10541 ; WX 838 ; N uni292D ; G 2990 -U 10542 ; WX 838 ; N uni292E ; G 2991 -U 10543 ; WX 838 ; N uni292F ; G 2992 -U 10544 ; WX 838 ; N uni2930 ; G 2993 -U 10545 ; WX 838 ; N uni2931 ; G 2994 -U 10546 ; WX 838 ; N uni2932 ; G 2995 -U 10547 ; WX 838 ; N uni2933 ; G 2996 -U 10548 ; WX 838 ; N uni2934 ; G 2997 -U 10549 ; WX 838 ; N uni2935 ; G 2998 -U 10550 ; WX 838 ; N uni2936 ; G 2999 -U 10551 ; WX 838 ; N uni2937 ; G 3000 -U 10552 ; WX 838 ; N uni2938 ; G 3001 -U 10553 ; WX 838 ; N uni2939 ; G 3002 -U 10554 ; WX 838 ; N uni293A ; G 3003 -U 10555 ; WX 838 ; N uni293B ; G 3004 -U 10556 ; WX 838 ; N uni293C ; G 3005 -U 10557 ; WX 838 ; N uni293D ; G 3006 -U 10558 ; WX 838 ; N uni293E ; G 3007 -U 10559 ; WX 838 ; N uni293F ; G 3008 -U 10560 ; WX 838 ; N uni2940 ; G 3009 -U 10561 ; WX 838 ; N uni2941 ; G 3010 -U 10562 ; WX 838 ; N uni2942 ; G 3011 -U 10563 ; WX 838 ; N uni2943 ; G 3012 -U 10564 ; WX 838 ; N uni2944 ; G 3013 -U 10565 ; WX 838 ; N uni2945 ; G 3014 -U 10566 ; WX 838 ; N uni2946 ; G 3015 -U 10567 ; WX 838 ; N uni2947 ; G 3016 -U 10568 ; WX 838 ; N uni2948 ; G 3017 -U 10569 ; WX 838 ; N uni2949 ; G 3018 -U 10570 ; WX 838 ; N uni294A ; G 3019 -U 10571 ; WX 838 ; N uni294B ; G 3020 -U 10572 ; WX 838 ; N uni294C ; G 3021 -U 10573 ; WX 838 ; N uni294D ; G 3022 -U 10574 ; WX 838 ; N uni294E ; G 3023 -U 10575 ; WX 838 ; N uni294F ; G 3024 -U 10576 ; WX 838 ; N uni2950 ; G 3025 -U 10577 ; WX 838 ; N uni2951 ; G 3026 -U 10578 ; WX 838 ; N uni2952 ; G 3027 -U 10579 ; WX 838 ; N uni2953 ; G 3028 -U 10580 ; WX 838 ; N uni2954 ; G 3029 -U 10581 ; WX 838 ; N uni2955 ; G 3030 -U 10582 ; WX 838 ; N uni2956 ; G 3031 -U 10583 ; WX 838 ; N uni2957 ; G 3032 -U 10584 ; WX 838 ; N uni2958 ; G 3033 -U 10585 ; WX 838 ; N uni2959 ; G 3034 -U 10586 ; WX 838 ; N uni295A ; G 3035 -U 10587 ; WX 838 ; N uni295B ; G 3036 -U 10588 ; WX 838 ; N uni295C ; G 3037 -U 10589 ; WX 838 ; N uni295D ; G 3038 -U 10590 ; WX 838 ; N uni295E ; G 3039 -U 10591 ; WX 838 ; N uni295F ; G 3040 -U 10592 ; WX 838 ; N uni2960 ; G 3041 -U 10593 ; WX 838 ; N uni2961 ; G 3042 -U 10594 ; WX 838 ; N uni2962 ; G 3043 -U 10595 ; WX 838 ; N uni2963 ; G 3044 -U 10596 ; WX 838 ; N uni2964 ; G 3045 -U 10597 ; WX 838 ; N uni2965 ; G 3046 -U 10598 ; WX 838 ; N uni2966 ; G 3047 -U 10599 ; WX 838 ; N uni2967 ; G 3048 -U 10600 ; WX 838 ; N uni2968 ; G 3049 -U 10601 ; WX 838 ; N uni2969 ; G 3050 -U 10602 ; WX 838 ; N uni296A ; G 3051 -U 10603 ; WX 838 ; N uni296B ; G 3052 -U 10604 ; WX 838 ; N uni296C ; G 3053 -U 10605 ; WX 838 ; N uni296D ; G 3054 -U 10606 ; WX 838 ; N uni296E ; G 3055 -U 10607 ; WX 838 ; N uni296F ; G 3056 -U 10608 ; WX 838 ; N uni2970 ; G 3057 -U 10609 ; WX 838 ; N uni2971 ; G 3058 -U 10610 ; WX 838 ; N uni2972 ; G 3059 -U 10611 ; WX 838 ; N uni2973 ; G 3060 -U 10612 ; WX 838 ; N uni2974 ; G 3061 -U 10613 ; WX 838 ; N uni2975 ; G 3062 -U 10614 ; WX 838 ; N uni2976 ; G 3063 -U 10615 ; WX 981 ; N uni2977 ; G 3064 -U 10616 ; WX 838 ; N uni2978 ; G 3065 -U 10617 ; WX 838 ; N uni2979 ; G 3066 -U 10618 ; WX 984 ; N uni297A ; G 3067 -U 10619 ; WX 838 ; N uni297B ; G 3068 -U 10620 ; WX 838 ; N uni297C ; G 3069 -U 10621 ; WX 838 ; N uni297D ; G 3070 -U 10622 ; WX 838 ; N uni297E ; G 3071 -U 10623 ; WX 838 ; N uni297F ; G 3072 -U 10731 ; WX 494 ; N uni29EB ; G 3073 -U 10764 ; WX 1513 ; N uni2A0C ; G 3074 -U 10765 ; WX 521 ; N uni2A0D ; G 3075 -U 10766 ; WX 521 ; N uni2A0E ; G 3076 -U 10799 ; WX 838 ; N uni2A2F ; G 3077 -U 10858 ; WX 838 ; N uni2A6A ; G 3078 -U 10859 ; WX 838 ; N uni2A6B ; G 3079 -U 11008 ; WX 838 ; N uni2B00 ; G 3080 -U 11009 ; WX 838 ; N uni2B01 ; G 3081 -U 11010 ; WX 838 ; N uni2B02 ; G 3082 -U 11011 ; WX 838 ; N uni2B03 ; G 3083 -U 11012 ; WX 838 ; N uni2B04 ; G 3084 -U 11013 ; WX 838 ; N uni2B05 ; G 3085 -U 11014 ; WX 838 ; N uni2B06 ; G 3086 -U 11015 ; WX 838 ; N uni2B07 ; G 3087 -U 11016 ; WX 838 ; N uni2B08 ; G 3088 -U 11017 ; WX 838 ; N uni2B09 ; G 3089 -U 11018 ; WX 838 ; N uni2B0A ; G 3090 -U 11019 ; WX 838 ; N uni2B0B ; G 3091 -U 11020 ; WX 838 ; N uni2B0C ; G 3092 -U 11021 ; WX 838 ; N uni2B0D ; G 3093 -U 11022 ; WX 838 ; N uni2B0E ; G 3094 -U 11023 ; WX 838 ; N uni2B0F ; G 3095 -U 11024 ; WX 838 ; N uni2B10 ; G 3096 -U 11025 ; WX 838 ; N uni2B11 ; G 3097 -U 11026 ; WX 945 ; N uni2B12 ; G 3098 -U 11027 ; WX 945 ; N uni2B13 ; G 3099 -U 11028 ; WX 945 ; N uni2B14 ; G 3100 -U 11029 ; WX 945 ; N uni2B15 ; G 3101 -U 11030 ; WX 769 ; N uni2B16 ; G 3102 -U 11031 ; WX 769 ; N uni2B17 ; G 3103 -U 11032 ; WX 769 ; N uni2B18 ; G 3104 -U 11033 ; WX 769 ; N uni2B19 ; G 3105 -U 11034 ; WX 945 ; N uni2B1A ; G 3106 -U 11360 ; WX 664 ; N uni2C60 ; G 3107 -U 11361 ; WX 320 ; N uni2C61 ; G 3108 -U 11363 ; WX 673 ; N uni2C63 ; G 3109 -U 11364 ; WX 753 ; N uni2C64 ; G 3110 -U 11367 ; WX 872 ; N uni2C67 ; G 3111 -U 11368 ; WX 644 ; N uni2C68 ; G 3112 -U 11369 ; WX 747 ; N uni2C69 ; G 3113 -U 11370 ; WX 606 ; N uni2C6A ; G 3114 -U 11371 ; WX 695 ; N uni2C6B ; G 3115 -U 11372 ; WX 527 ; N uni2C6C ; G 3116 -U 11373 ; WX 782 ; N uni2C6D ; G 3117 -U 11374 ; WX 1024 ; N uni2C6E ; G 3118 -U 11375 ; WX 722 ; N uni2C6F ; G 3119 -U 11376 ; WX 782 ; N uni2C70 ; G 3120 -U 11377 ; WX 663 ; N uni2C71 ; G 3121 -U 11378 ; WX 1130 ; N uni2C72 ; G 3122 -U 11379 ; WX 939 ; N uni2C73 ; G 3123 -U 11381 ; WX 740 ; N uni2C75 ; G 3124 -U 11382 ; WX 556 ; N uni2C76 ; G 3125 -U 11383 ; WX 700 ; N uni2C77 ; G 3126 -U 11385 ; WX 501 ; N uni2C79 ; G 3127 -U 11386 ; WX 602 ; N uni2C7A ; G 3128 -U 11387 ; WX 553 ; N uni2C7B ; G 3129 -U 11388 ; WX 264 ; N uni2C7C ; G 3130 -U 11389 ; WX 455 ; N uni2C7D ; G 3131 -U 11390 ; WX 685 ; N uni2C7E ; G 3132 -U 11391 ; WX 695 ; N uni2C7F ; G 3133 -U 11520 ; WX 773 ; N uni2D00 ; G 3134 -U 11521 ; WX 635 ; N uni2D01 ; G 3135 -U 11522 ; WX 633 ; N uni2D02 ; G 3136 -U 11523 ; WX 658 ; N uni2D03 ; G 3137 -U 11524 ; WX 631 ; N uni2D04 ; G 3138 -U 11525 ; WX 962 ; N uni2D05 ; G 3139 -U 11526 ; WX 756 ; N uni2D06 ; G 3140 -U 11527 ; WX 960 ; N uni2D07 ; G 3141 -U 11528 ; WX 617 ; N uni2D08 ; G 3142 -U 11529 ; WX 646 ; N uni2D09 ; G 3143 -U 11530 ; WX 962 ; N uni2D0A ; G 3144 -U 11531 ; WX 632 ; N uni2D0B ; G 3145 -U 11532 ; WX 646 ; N uni2D0C ; G 3146 -U 11533 ; WX 962 ; N uni2D0D ; G 3147 -U 11534 ; WX 645 ; N uni2D0E ; G 3148 -U 11535 ; WX 866 ; N uni2D0F ; G 3149 -U 11536 ; WX 961 ; N uni2D10 ; G 3150 -U 11537 ; WX 645 ; N uni2D11 ; G 3151 -U 11538 ; WX 645 ; N uni2D12 ; G 3152 -U 11539 ; WX 959 ; N uni2D13 ; G 3153 -U 11540 ; WX 945 ; N uni2D14 ; G 3154 -U 11541 ; WX 863 ; N uni2D15 ; G 3155 -U 11542 ; WX 644 ; N uni2D16 ; G 3156 -U 11543 ; WX 646 ; N uni2D17 ; G 3157 -U 11544 ; WX 645 ; N uni2D18 ; G 3158 -U 11545 ; WX 649 ; N uni2D19 ; G 3159 -U 11546 ; WX 688 ; N uni2D1A ; G 3160 -U 11547 ; WX 634 ; N uni2D1B ; G 3161 -U 11548 ; WX 982 ; N uni2D1C ; G 3162 -U 11549 ; WX 681 ; N uni2D1D ; G 3163 -U 11550 ; WX 676 ; N uni2D1E ; G 3164 -U 11551 ; WX 852 ; N uni2D1F ; G 3165 -U 11552 ; WX 957 ; N uni2D20 ; G 3166 -U 11553 ; WX 632 ; N uni2D21 ; G 3167 -U 11554 ; WX 645 ; N uni2D22 ; G 3168 -U 11555 ; WX 646 ; N uni2D23 ; G 3169 -U 11556 ; WX 749 ; N uni2D24 ; G 3170 -U 11557 ; WX 914 ; N uni2D25 ; G 3171 -U 11800 ; WX 536 ; N uni2E18 ; G 3172 -U 11807 ; WX 838 ; N uni2E1F ; G 3173 -U 11810 ; WX 390 ; N uni2E22 ; G 3174 -U 11811 ; WX 390 ; N uni2E23 ; G 3175 -U 11812 ; WX 390 ; N uni2E24 ; G 3176 -U 11813 ; WX 390 ; N uni2E25 ; G 3177 -U 11822 ; WX 536 ; N uni2E2E ; G 3178 -U 42564 ; WX 685 ; N uniA644 ; G 3179 -U 42565 ; WX 513 ; N uniA645 ; G 3180 -U 42566 ; WX 395 ; N uniA646 ; G 3181 -U 42567 ; WX 392 ; N uniA647 ; G 3182 -U 42576 ; WX 1104 ; N uniA650 ; G 3183 -U 42577 ; WX 888 ; N uniA651 ; G 3184 -U 42580 ; WX 1193 ; N uniA654 ; G 3185 -U 42581 ; WX 871 ; N uniA655 ; G 3186 -U 42582 ; WX 1140 ; N uniA656 ; G 3187 -U 42583 ; WX 899 ; N uniA657 ; G 3188 -U 42648 ; WX 1416 ; N uniA698 ; G 3189 -U 42649 ; WX 999 ; N uniA699 ; G 3190 -U 42760 ; WX 493 ; N uniA708 ; G 3191 -U 42761 ; WX 493 ; N uniA709 ; G 3192 -U 42762 ; WX 493 ; N uniA70A ; G 3193 -U 42763 ; WX 493 ; N uniA70B ; G 3194 -U 42764 ; WX 493 ; N uniA70C ; G 3195 -U 42765 ; WX 493 ; N uniA70D ; G 3196 -U 42766 ; WX 493 ; N uniA70E ; G 3197 -U 42767 ; WX 493 ; N uniA70F ; G 3198 -U 42768 ; WX 493 ; N uniA710 ; G 3199 -U 42769 ; WX 493 ; N uniA711 ; G 3200 -U 42770 ; WX 493 ; N uniA712 ; G 3201 -U 42771 ; WX 493 ; N uniA713 ; G 3202 -U 42772 ; WX 493 ; N uniA714 ; G 3203 -U 42773 ; WX 493 ; N uniA715 ; G 3204 -U 42774 ; WX 493 ; N uniA716 ; G 3205 -U 42779 ; WX 369 ; N uniA71B ; G 3206 -U 42780 ; WX 369 ; N uniA71C ; G 3207 -U 42781 ; WX 253 ; N uniA71D ; G 3208 -U 42782 ; WX 253 ; N uniA71E ; G 3209 -U 42783 ; WX 253 ; N uniA71F ; G 3210 -U 42790 ; WX 872 ; N uniA726 ; G 3211 -U 42791 ; WX 634 ; N uniA727 ; G 3212 -U 42792 ; WX 843 ; N uniA728 ; G 3213 -U 42793 ; WX 754 ; N uniA729 ; G 3214 -U 42794 ; WX 612 ; N uniA72A ; G 3215 -U 42795 ; WX 560 ; N uniA72B ; G 3216 -U 42796 ; WX 548 ; N uniA72C ; G 3217 -U 42797 ; WX 531 ; N uniA72D ; G 3218 -U 42798 ; WX 629 ; N uniA72E ; G 3219 -U 42799 ; WX 610 ; N uniA72F ; G 3220 -U 42800 ; WX 514 ; N uniA730 ; G 3221 -U 42801 ; WX 513 ; N uniA731 ; G 3222 -U 42802 ; WX 1195 ; N uniA732 ; G 3223 -U 42803 ; WX 944 ; N uniA733 ; G 3224 -U 42804 ; WX 1226 ; N uniA734 ; G 3225 -U 42805 ; WX 950 ; N uniA735 ; G 3226 -U 42806 ; WX 1149 ; N uniA736 ; G 3227 -U 42807 ; WX 934 ; N uniA737 ; G 3228 -U 42808 ; WX 968 ; N uniA738 ; G 3229 -U 42809 ; WX 784 ; N uniA739 ; G 3230 -U 42810 ; WX 968 ; N uniA73A ; G 3231 -U 42811 ; WX 784 ; N uniA73B ; G 3232 -U 42812 ; WX 962 ; N uniA73C ; G 3233 -U 42813 ; WX 824 ; N uniA73D ; G 3234 -U 42814 ; WX 765 ; N uniA73E ; G 3235 -U 42815 ; WX 560 ; N uniA73F ; G 3236 -U 42816 ; WX 774 ; N uniA740 ; G 3237 -U 42817 ; WX 625 ; N uniA741 ; G 3238 -U 42822 ; WX 787 ; N uniA746 ; G 3239 -U 42823 ; WX 434 ; N uniA747 ; G 3240 -U 42826 ; WX 932 ; N uniA74A ; G 3241 -U 42827 ; WX 711 ; N uniA74B ; G 3242 -U 42830 ; WX 1416 ; N uniA74E ; G 3243 -U 42831 ; WX 999 ; N uniA74F ; G 3244 -U 42856 ; WX 707 ; N uniA768 ; G 3245 -U 42857 ; WX 610 ; N uniA769 ; G 3246 -U 42875 ; WX 612 ; N uniA77B ; G 3247 -U 42876 ; WX 478 ; N uniA77C ; G 3248 -U 42880 ; WX 664 ; N uniA780 ; G 3249 -U 42881 ; WX 320 ; N uniA781 ; G 3250 -U 42882 ; WX 843 ; N uniA782 ; G 3251 -U 42883 ; WX 644 ; N uniA783 ; G 3252 -U 42884 ; WX 612 ; N uniA784 ; G 3253 -U 42885 ; WX 478 ; N uniA785 ; G 3254 -U 42886 ; WX 765 ; N uniA786 ; G 3255 -U 42887 ; WX 560 ; N uniA787 ; G 3256 -U 42891 ; WX 402 ; N uniA78B ; G 3257 -U 42892 ; WX 275 ; N uniA78C ; G 3258 -U 42893 ; WX 773 ; N uniA78D ; G 3259 -U 42896 ; WX 875 ; N uniA790 ; G 3260 -U 42897 ; WX 644 ; N uniA791 ; G 3261 -U 42922 ; WX 872 ; N uniA7AA ; G 3262 -U 43000 ; WX 549 ; N uniA7F8 ; G 3263 -U 43001 ; WX 623 ; N uniA7F9 ; G 3264 -U 43002 ; WX 957 ; N uniA7FA ; G 3265 -U 43003 ; WX 694 ; N uniA7FB ; G 3266 -U 43004 ; WX 673 ; N uniA7FC ; G 3267 -U 43005 ; WX 1024 ; N uniA7FD ; G 3268 -U 43006 ; WX 395 ; N uniA7FE ; G 3269 -U 43007 ; WX 1201 ; N uniA7FF ; G 3270 -U 62464 ; WX 654 ; N uniF400 ; G 3271 -U 62465 ; WX 665 ; N uniF401 ; G 3272 -U 62466 ; WX 714 ; N uniF402 ; G 3273 -U 62467 ; WX 947 ; N uniF403 ; G 3274 -U 62468 ; WX 665 ; N uniF404 ; G 3275 -U 62469 ; WX 659 ; N uniF405 ; G 3276 -U 62470 ; WX 725 ; N uniF406 ; G 3277 -U 62471 ; WX 986 ; N uniF407 ; G 3278 -U 62472 ; WX 665 ; N uniF408 ; G 3279 -U 62473 ; WX 665 ; N uniF409 ; G 3280 -U 62474 ; WX 1257 ; N uniF40A ; G 3281 -U 62475 ; WX 683 ; N uniF40B ; G 3282 -U 62476 ; WX 682 ; N uniF40C ; G 3283 -U 62477 ; WX 953 ; N uniF40D ; G 3284 -U 62478 ; WX 665 ; N uniF40E ; G 3285 -U 62479 ; WX 682 ; N uniF40F ; G 3286 -U 62480 ; WX 999 ; N uniF410 ; G 3287 -U 62481 ; WX 746 ; N uniF411 ; G 3288 -U 62482 ; WX 798 ; N uniF412 ; G 3289 -U 62483 ; WX 748 ; N uniF413 ; G 3290 -U 62484 ; WX 944 ; N uniF414 ; G 3291 -U 62485 ; WX 681 ; N uniF415 ; G 3292 -U 62486 ; WX 936 ; N uniF416 ; G 3293 -U 62487 ; WX 680 ; N uniF417 ; G 3294 -U 62488 ; WX 688 ; N uniF418 ; G 3295 -U 62489 ; WX 682 ; N uniF419 ; G 3296 -U 62490 ; WX 729 ; N uniF41A ; G 3297 -U 62491 ; WX 682 ; N uniF41B ; G 3298 -U 62492 ; WX 688 ; N uniF41C ; G 3299 -U 62493 ; WX 666 ; N uniF41D ; G 3300 -U 62494 ; WX 729 ; N uniF41E ; G 3301 -U 62495 ; WX 884 ; N uniF41F ; G 3302 -U 62496 ; WX 665 ; N uniF420 ; G 3303 -U 62497 ; WX 706 ; N uniF421 ; G 3304 -U 62498 ; WX 666 ; N uniF422 ; G 3305 -U 62499 ; WX 665 ; N uniF423 ; G 3306 -U 62500 ; WX 665 ; N uniF424 ; G 3307 -U 62501 ; WX 722 ; N uniF425 ; G 3308 -U 62502 ; WX 961 ; N uniF426 ; G 3309 -U 62504 ; WX 904 ; N uniF428 ; G 3310 -U 63173 ; WX 602 ; N uniF6C5 ; G 3311 -U 63185 ; WX 500 ; N cyrBreve ; G 3312 -U 63188 ; WX 500 ; N cyrbreve ; G 3313 -U 64256 ; WX 710 ; N uniFB00 ; G 3314 -U 64257 ; WX 667 ; N fi ; G 3315 -U 64258 ; WX 667 ; N fl ; G 3316 -U 64259 ; WX 1028 ; N uniFB03 ; G 3317 -U 64260 ; WX 1030 ; N uniFB04 ; G 3318 -U 64261 ; WX 771 ; N uniFB05 ; G 3319 -U 64262 ; WX 933 ; N uniFB06 ; G 3320 -U 65024 ; WX 0 ; N uniFE00 ; G 3321 -U 65025 ; WX 0 ; N uniFE01 ; G 3322 -U 65026 ; WX 0 ; N uniFE02 ; G 3323 -U 65027 ; WX 0 ; N uniFE03 ; G 3324 -U 65028 ; WX 0 ; N uniFE04 ; G 3325 -U 65029 ; WX 0 ; N uniFE05 ; G 3326 -U 65030 ; WX 0 ; N uniFE06 ; G 3327 -U 65031 ; WX 0 ; N uniFE07 ; G 3328 -U 65032 ; WX 0 ; N uniFE08 ; G 3329 -U 65033 ; WX 0 ; N uniFE09 ; G 3330 -U 65034 ; WX 0 ; N uniFE0A ; G 3331 -U 65035 ; WX 0 ; N uniFE0B ; G 3332 -U 65036 ; WX 0 ; N uniFE0C ; G 3333 -U 65037 ; WX 0 ; N uniFE0D ; G 3334 -U 65038 ; WX 0 ; N uniFE0E ; G 3335 -U 65039 ; WX 0 ; N uniFE0F ; G 3336 -U 65529 ; WX 0 ; N uniFFF9 ; G 3337 -U 65530 ; WX 0 ; N uniFFFA ; G 3338 -U 65531 ; WX 0 ; N uniFFFB ; G 3339 -U 65532 ; WX 0 ; N uniFFFC ; G 3340 -U 65533 ; WX 1025 ; N uniFFFD ; G 3341 -EndCharMetrics -StartKernData -StartKernPairs 1367 - -KPX dollar seven -112 -KPX dollar nine -102 -KPX dollar colon -83 -KPX dollar less -83 -KPX dollar I -36 -KPX dollar W -36 -KPX dollar Y -83 -KPX dollar Z -92 -KPX dollar backslash -83 -KPX dollar questiondown -83 -KPX dollar Aacute -83 -KPX dollar Hcircumflex -112 -KPX dollar hcircumflex -36 -KPX dollar Hbar -112 -KPX dollar hbar -36 -KPX dollar Kcommaaccent -83 -KPX dollar kcommaaccent -92 -KPX dollar kgreenlandic -83 -KPX dollar Lacute -83 -KPX dollar lacute -83 -KPX dollar uni01DC -112 -KPX dollar uni01DD -36 -KPX dollar uni01F4 -83 - -KPX percent ampersand 38 -KPX percent asterisk 38 -KPX percent two 38 -KPX percent less -36 -KPX percent Egrave 38 -KPX percent Ecircumflex 38 -KPX percent Igrave 38 -KPX percent Icircumflex 38 -KPX percent Thorn 38 -KPX percent agrave 38 -KPX percent acircumflex 38 -KPX percent adieresis 38 -KPX percent Dcaron 38 -KPX percent Dcroat 38 -KPX percent Emacron 38 -KPX percent Ebreve 38 -KPX percent kgreenlandic -36 -KPX percent lacute -36 -KPX percent uni01AC 38 -KPX percent uni01AE 38 -KPX percent uni01F0 38 -KPX percent uni01F4 -36 - - -KPX quotesingle nine -36 - - -KPX parenright dollar -178 -KPX parenright D -139 -KPX parenright H -112 -KPX parenright R -112 -KPX parenright cent -139 -KPX parenright sterling -139 -KPX parenright currency -139 -KPX parenright yen -139 -KPX parenright brokenbar -139 -KPX parenright section -139 -KPX parenright dieresis -139 -KPX parenright ordfeminine -112 -KPX parenright guillemotleft -112 -KPX parenright logicalnot -112 -KPX parenright sfthyphen -112 -KPX parenright acute -112 -KPX parenright mu -112 -KPX parenright paragraph -112 -KPX parenright periodcentered -112 -KPX parenright cedilla -112 -KPX parenright ordmasculine -112 -KPX parenright Acircumflex -178 -KPX parenright Atilde -139 -KPX parenright Adieresis -178 -KPX parenright Aring -139 -KPX parenright AE -178 -KPX parenright Ccedilla -139 -KPX parenright Otilde -112 -KPX parenright multiply -112 -KPX parenright Ugrave -112 -KPX parenright Ucircumflex -112 -KPX parenright Yacute -112 -KPX parenright dcaron -112 -KPX parenright dmacron -112 -KPX parenright emacron -112 -KPX parenright ebreve -112 -KPX parenright uni01A5 -139 -KPX parenright uni01AD -112 -KPX parenright Uhorn -112 -KPX parenright uni01F1 -112 - -KPX asterisk less -36 -KPX asterisk lacute -36 - - -KPX period dollar -83 -KPX period ampersand -55 -KPX period two -55 -KPX period eight -73 -KPX period colon -73 -KPX period less -55 -KPX period H -55 -KPX period R -55 -KPX period X -45 -KPX period backslash -131 -KPX period ordfeminine -55 -KPX period guillemotleft -55 -KPX period logicalnot -55 -KPX period sfthyphen -55 -KPX period acute -55 -KPX period mu -55 -KPX period paragraph -55 -KPX period periodcentered -55 -KPX period cedilla -55 -KPX period ordmasculine -36 -KPX period guillemotright -45 -KPX period onequarter -45 -KPX period onehalf -45 -KPX period threequarters -45 -KPX period questiondown -131 -KPX period Aacute -131 -KPX period Egrave -55 -KPX period Icircumflex -55 -KPX period Yacute -55 -KPX period Ebreve -55 -KPX period ebreve -55 -KPX period Idot -73 -KPX period dotlessi -45 -KPX period lacute -55 - -KPX slash seven -167 -KPX slash eight -112 -KPX slash nine -243 -KPX slash colon -178 -KPX slash less -131 -KPX slash backslash -36 -KPX slash questiondown -36 -KPX slash Aacute -36 -KPX slash Hbar -167 -KPX slash Idot -112 -KPX slash lacute -131 - - -KPX two nine -36 -KPX two semicolon -36 - -KPX three dollar -188 -KPX three eight -36 -KPX three D -92 -KPX three H -92 -KPX three R -83 -KPX three V -55 -KPX three cent -92 -KPX three sterling -92 -KPX three currency -92 -KPX three yen -92 -KPX three brokenbar -92 -KPX three section -92 -KPX three dieresis -92 -KPX three ordfeminine -92 -KPX three guillemotleft -92 -KPX three logicalnot -92 -KPX three sfthyphen -92 -KPX three acute -83 -KPX three mu -83 -KPX three paragraph -83 -KPX three periodcentered -83 -KPX three cedilla -83 -KPX three ordmasculine -83 -KPX three Yacute -92 -KPX three ebreve -83 -KPX three gdotaccent -55 -KPX three gcommaaccent -55 -KPX three Idot -36 - - -KPX five seven -36 -KPX five nine -73 -KPX five colon -45 -KPX five less -63 -KPX five D 47 -KPX five backslash -36 -KPX five cent 47 -KPX five sterling 47 -KPX five currency 47 -KPX five yen 47 -KPX five brokenbar 47 -KPX five section 47 -KPX five dieresis 47 -KPX five ordmasculine 38 -KPX five questiondown -36 -KPX five Aacute -36 -KPX five Hbar -36 -KPX five lacute -63 - -KPX six six -36 -KPX six Gdotaccent -36 -KPX six Gcommaaccent -36 - -KPX seven dollar -112 -KPX seven seven 38 -KPX seven D -159 -KPX seven F -159 -KPX seven H -159 -KPX seven R -159 -KPX seven V -149 -KPX seven Z -73 -KPX seven cent -59 -KPX seven sterling -159 -KPX seven currency -59 -KPX seven yen -59 -KPX seven brokenbar -59 -KPX seven section -59 -KPX seven dieresis -159 -KPX seven copyright -159 -KPX seven ordfeminine -99 -KPX seven guillemotleft -159 -KPX seven logicalnot -99 -KPX seven sfthyphen -99 -KPX seven acute -79 -KPX seven mu -159 -KPX seven paragraph -79 -KPX seven periodcentered -79 -KPX seven cedilla -79 -KPX seven ordmasculine -159 -KPX seven Eacute -159 -KPX seven Idieresis -159 -KPX seven Yacute -159 -KPX seven ebreve -159 -KPX seven gdotaccent -149 -KPX seven gcommaaccent -149 -KPX seven Hbar 38 - -KPX eight dollar -63 -KPX eight hyphen -55 - -KPX nine dollar -139 -KPX nine two -36 -KPX nine D -188 -KPX nine H -188 -KPX nine L -36 -KPX nine R -188 -KPX nine X -131 -KPX nine backslash -83 -KPX nine cent -188 -KPX nine sterling -188 -KPX nine currency -188 -KPX nine yen -188 -KPX nine brokenbar -188 -KPX nine section -188 -KPX nine dieresis -188 -KPX nine ordfeminine -188 -KPX nine guillemotleft -188 -KPX nine logicalnot -188 -KPX nine sfthyphen -188 -KPX nine acute -188 -KPX nine mu -188 -KPX nine paragraph -188 -KPX nine periodcentered -188 -KPX nine cedilla -188 -KPX nine ordmasculine -188 -KPX nine guillemotright -131 -KPX nine onequarter -131 -KPX nine onehalf -131 -KPX nine threequarters -131 -KPX nine questiondown -83 -KPX nine Aacute -83 -KPX nine Yacute -188 -KPX nine Ebreve -36 -KPX nine ebreve -188 -KPX nine dotlessi -131 - -KPX colon dollar -102 -KPX colon D -178 -KPX colon H -167 -KPX colon L -36 -KPX colon R -139 -KPX colon U -92 -KPX colon X -83 -KPX colon backslash -45 -KPX colon cent -178 -KPX colon sterling -178 -KPX colon currency -178 -KPX colon yen -178 -KPX colon brokenbar -178 -KPX colon section -178 -KPX colon dieresis -139 -KPX colon ordfeminine -167 -KPX colon guillemotleft -167 -KPX colon logicalnot -167 -KPX colon sfthyphen -167 -KPX colon acute -139 -KPX colon mu -139 -KPX colon paragraph -139 -KPX colon periodcentered -139 -KPX colon cedilla -139 -KPX colon ordmasculine -139 -KPX colon guillemotright -83 -KPX colon onequarter -83 -KPX colon onehalf -83 -KPX colon threequarters -83 -KPX colon questiondown -45 -KPX colon Aacute -45 -KPX colon Yacute -167 -KPX colon ebreve -139 -KPX colon edotaccent -92 -KPX colon ecaron -92 -KPX colon dotlessi -83 - -KPX semicolon dollar -73 -KPX semicolon ampersand -36 -KPX semicolon two -36 -KPX semicolon Egrave -36 -KPX semicolon Icircumflex -36 -KPX semicolon Ebreve -36 - -KPX less dollar -159 -KPX less ampersand -36 -KPX less D -159 -KPX less H -178 -KPX less L -36 -KPX less R -178 -KPX less X -178 -KPX less cent -159 -KPX less sterling -159 -KPX less currency -159 -KPX less yen -159 -KPX less brokenbar -159 -KPX less section -159 -KPX less dieresis -196 -KPX less ordfeminine -178 -KPX less guillemotleft -178 -KPX less logicalnot -178 -KPX less sfthyphen -178 -KPX less acute -178 -KPX less mu -178 -KPX less paragraph -178 -KPX less periodcentered -178 -KPX less cedilla -178 -KPX less ordmasculine -178 -KPX less guillemotright -178 -KPX less onequarter -178 -KPX less onehalf -178 -KPX less threequarters -178 -KPX less Egrave -36 -KPX less Icircumflex -36 -KPX less Yacute -178 -KPX less ebreve -215 -KPX less dotlessi -178 - - - - - - - - - - - - - - - - - - - - - -KPX Acircumflex seven -112 -KPX Acircumflex nine -102 -KPX Acircumflex colon -83 -KPX Acircumflex less -83 -KPX Acircumflex I -36 -KPX Acircumflex W -36 -KPX Acircumflex Y -83 -KPX Acircumflex Z -92 -KPX Acircumflex backslash -83 -KPX Acircumflex questiondown -83 -KPX Acircumflex Aacute -83 -KPX Acircumflex Hcircumflex -112 -KPX Acircumflex hcircumflex -36 -KPX Acircumflex Hbar -112 -KPX Acircumflex hbar -36 -KPX Acircumflex Kcommaaccent -83 -KPX Acircumflex kcommaaccent -92 -KPX Acircumflex kgreenlandic -83 -KPX Acircumflex Lacute -83 -KPX Acircumflex lacute -83 -KPX Acircumflex uni01DC -112 -KPX Acircumflex uni01DD -36 -KPX Acircumflex uni01F4 -83 - -KPX Adieresis seven -112 -KPX Adieresis nine -102 -KPX Adieresis colon -83 -KPX Adieresis less -83 -KPX Adieresis I -36 -KPX Adieresis W -36 -KPX Adieresis Y -83 -KPX Adieresis Z -92 -KPX Adieresis backslash -83 -KPX Adieresis questiondown -83 -KPX Adieresis Aacute -83 -KPX Adieresis Hcircumflex -112 -KPX Adieresis hcircumflex -36 -KPX Adieresis Hbar -112 -KPX Adieresis hbar -36 -KPX Adieresis Kcommaaccent -83 -KPX Adieresis kcommaaccent -92 -KPX Adieresis kgreenlandic -83 -KPX Adieresis Lacute -83 -KPX Adieresis lacute -83 -KPX Adieresis uni01DC -112 -KPX Adieresis uni01DD -36 -KPX Adieresis uni01F4 -83 - -KPX AE seven -112 -KPX AE nine -102 -KPX AE colon -83 -KPX AE less -83 -KPX AE I -36 -KPX AE W -36 -KPX AE Y -83 -KPX AE Z -92 -KPX AE backslash -83 -KPX AE questiondown -83 -KPX AE Aacute -83 -KPX AE Hcircumflex -112 -KPX AE hcircumflex -36 -KPX AE Hbar -112 -KPX AE hbar -36 -KPX AE Kcommaaccent -83 -KPX AE kcommaaccent -92 -KPX AE kgreenlandic -83 -KPX AE Lacute -83 -KPX AE lacute -83 -KPX AE uni01DC -112 -KPX AE uni01DD -36 -KPX AE uni01F4 -83 - - - - - -KPX Eth nine -36 - -KPX Ograve nine -36 - - -KPX agrave less -36 -KPX agrave lacute -36 - -KPX ucircumflex seven -167 -KPX ucircumflex eight -112 -KPX ucircumflex nine -243 -KPX ucircumflex colon -178 -KPX ucircumflex less -131 -KPX ucircumflex backslash -36 -KPX ucircumflex questiondown -36 -KPX ucircumflex Aacute -36 -KPX ucircumflex Hbar -167 -KPX ucircumflex Idot -112 -KPX ucircumflex lacute -131 - -KPX ydieresis seven -167 -KPX ydieresis eight -112 -KPX ydieresis nine -243 -KPX ydieresis colon -178 -KPX ydieresis less -131 -KPX ydieresis backslash -36 -KPX ydieresis questiondown -36 -KPX ydieresis Aacute -36 -KPX ydieresis Hbar -167 -KPX ydieresis Idot -112 -KPX ydieresis lacute -131 - -KPX Abreve O -227 - -KPX abreve seven -167 -KPX abreve eight -36 -KPX abreve nine -243 -KPX abreve colon -178 -KPX abreve less -206 -KPX abreve backslash -36 -KPX abreve questiondown -36 -KPX abreve Aacute -36 -KPX abreve Hbar -167 -KPX abreve Idot -36 -KPX abreve lacute -206 - - - -KPX Edotaccent seven -36 -KPX Edotaccent nine -73 -KPX Edotaccent colon -45 -KPX Edotaccent less -63 -KPX Edotaccent D 47 -KPX Edotaccent backslash -36 -KPX Edotaccent cent 47 -KPX Edotaccent sterling 47 -KPX Edotaccent currency 47 -KPX Edotaccent yen 47 -KPX Edotaccent brokenbar 47 -KPX Edotaccent section 47 -KPX Edotaccent dieresis 47 -KPX Edotaccent ordmasculine 38 -KPX Edotaccent questiondown -36 -KPX Edotaccent Aacute -36 -KPX Edotaccent Hbar -36 -KPX Edotaccent lacute -63 - - -KPX Ecaron seven -36 -KPX Ecaron nine -73 -KPX Ecaron colon -45 -KPX Ecaron less -63 -KPX Ecaron D 47 -KPX Ecaron backslash -36 -KPX Ecaron cent 47 -KPX Ecaron sterling 47 -KPX Ecaron currency 47 -KPX Ecaron yen 47 -KPX Ecaron brokenbar 47 -KPX Ecaron section 47 -KPX Ecaron dieresis 47 -KPX Ecaron ordmasculine 38 -KPX Ecaron questiondown -36 -KPX Ecaron Aacute -36 -KPX Ecaron Hbar -36 -KPX Ecaron lacute -63 - - -KPX Gdotaccent six -36 -KPX Gdotaccent Gdotaccent -36 -KPX Gdotaccent Gcommaaccent -36 - -KPX Gcommaaccent six -36 -KPX Gcommaaccent Gdotaccent -36 -KPX Gcommaaccent Gcommaaccent -36 - -KPX Hbar dollar -112 -KPX Hbar seven 38 -KPX Hbar D -159 -KPX Hbar F -159 -KPX Hbar H -159 -KPX Hbar R -159 -KPX Hbar V -149 -KPX Hbar Z -73 -KPX Hbar cent -159 -KPX Hbar sterling -159 -KPX Hbar currency -159 -KPX Hbar yen -159 -KPX Hbar brokenbar -159 -KPX Hbar section -159 -KPX Hbar dieresis -159 -KPX Hbar copyright -159 -KPX Hbar ordfeminine -159 -KPX Hbar guillemotleft -159 -KPX Hbar logicalnot -159 -KPX Hbar sfthyphen -159 -KPX Hbar acute -159 -KPX Hbar mu -159 -KPX Hbar paragraph -159 -KPX Hbar periodcentered -159 -KPX Hbar cedilla -159 -KPX Hbar ordmasculine -159 -KPX Hbar Eacute -159 -KPX Hbar Idieresis -159 -KPX Hbar Yacute -159 -KPX Hbar ebreve -159 -KPX Hbar gdotaccent -149 -KPX Hbar gcommaaccent -149 -KPX Hbar Hbar 38 - -KPX Idot dollar -63 -KPX Idot hyphen -55 - -KPX kcommaaccent D 110 -KPX kcommaaccent F 85 -KPX kcommaaccent G 97 -KPX kcommaaccent H 86 -KPX kcommaaccent I 220 -KPX kcommaaccent J 97 -KPX kcommaaccent L 220 -KPX kcommaaccent M 218 -KPX kcommaaccent P 125 -KPX kcommaaccent Q 125 -KPX kcommaaccent R 85 -KPX kcommaaccent S 140 -KPX kcommaaccent T 97 -KPX kcommaaccent U 125 -KPX kcommaaccent V 155 -KPX kcommaaccent W 235 -KPX kcommaaccent X 144 -KPX kcommaaccent Y 205 -KPX kcommaaccent Z 166 -KPX kcommaaccent bracketleft 174 -KPX kcommaaccent backslash 205 -KPX kcommaaccent bracketright 179 -KPX kcommaaccent kcommaaccent 261 - -KPX lacute dollar -159 -KPX lacute ampersand -36 -KPX lacute D -159 -KPX lacute H -178 -KPX lacute L -36 -KPX lacute R -178 -KPX lacute X -178 -KPX lacute cent -159 -KPX lacute sterling -159 -KPX lacute currency -159 -KPX lacute yen -159 -KPX lacute brokenbar -159 -KPX lacute section -159 -KPX lacute dieresis -196 -KPX lacute ordfeminine -178 -KPX lacute guillemotleft -178 -KPX lacute logicalnot -178 -KPX lacute sfthyphen -178 -KPX lacute acute -178 -KPX lacute mu -178 -KPX lacute paragraph -178 -KPX lacute periodcentered -178 -KPX lacute cedilla -178 -KPX lacute ordmasculine -178 -KPX lacute guillemotright -178 -KPX lacute onequarter -178 -KPX lacute onehalf -178 -KPX lacute threequarters -178 -KPX lacute Egrave -36 -KPX lacute Icircumflex -36 -KPX lacute Yacute -178 -KPX lacute ebreve -215 -KPX lacute dotlessi -178 - - -KPX uni027D dollar -264 -KPX uni027D hyphen 47 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Helvetica-Bold.afm b/vendor/dompdf/dompdf/lib/fonts/Helvetica-Bold.afm deleted file mode 100644 index f65e6df..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Helvetica-Bold.afm +++ /dev/null @@ -1,2829 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 1 12:43:52 1997 -Comment UniqueID 43052 -Comment VMusage 37169 48194 -FontName Helvetica-Bold -FullName Helvetica Bold -FamilyName Helvetica -Weight Bold -ItalicAngle 0 -IsFixedPitch false -CharacterSet ExtendedRoman -FontBBox -170 -228 1003 962 -UnderlinePosition -100 -UnderlineThickness 50 -Version 002.000 -Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. -EncodingScheme WinAnsiEncoding -CapHeight 718 -XHeight 532 -Ascender 718 -Descender -207 -StdHW 118 -StdVW 140 -StartCharMetrics 317 -C 32 ; WX 278 ; N space ; B 0 0 0 0 ; -C 160 ; WX 278 ; N space ; B 0 0 0 0 ; -C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ; -C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ; -C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ; -C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ; -C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ; -C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ; -C 146 ; WX 278 ; N quoteright ; B 69 445 209 718 ; -C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ; -C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ; -C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ; -C 43 ; WX 584 ; N plus ; B 40 0 544 506 ; -C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ; -C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ; -C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; -C 46 ; WX 278 ; N period ; B 64 0 214 146 ; -C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ; -C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ; -C 49 ; WX 556 ; N one ; B 69 0 378 710 ; -C 50 ; WX 556 ; N two ; B 26 0 511 710 ; -C 51 ; WX 556 ; N three ; B 27 -19 516 710 ; -C 52 ; WX 556 ; N four ; B 27 0 526 710 ; -C 53 ; WX 556 ; N five ; B 27 -19 516 698 ; -C 54 ; WX 556 ; N six ; B 31 -19 520 710 ; -C 55 ; WX 556 ; N seven ; B 25 0 528 698 ; -C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ; -C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ; -C 58 ; WX 333 ; N colon ; B 92 0 242 512 ; -C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ; -C 60 ; WX 584 ; N less ; B 38 -8 546 514 ; -C 61 ; WX 584 ; N equal ; B 40 87 544 419 ; -C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ; -C 63 ; WX 611 ; N question ; B 60 0 556 727 ; -C 64 ; WX 975 ; N at ; B 118 -19 856 737 ; -C 65 ; WX 722 ; N A ; B 20 0 702 718 ; -C 66 ; WX 722 ; N B ; B 76 0 669 718 ; -C 67 ; WX 722 ; N C ; B 44 -19 684 737 ; -C 68 ; WX 722 ; N D ; B 76 0 685 718 ; -C 69 ; WX 667 ; N E ; B 76 0 621 718 ; -C 70 ; WX 611 ; N F ; B 76 0 587 718 ; -C 71 ; WX 778 ; N G ; B 44 -19 713 737 ; -C 72 ; WX 722 ; N H ; B 71 0 651 718 ; -C 73 ; WX 278 ; N I ; B 64 0 214 718 ; -C 74 ; WX 556 ; N J ; B 22 -18 484 718 ; -C 75 ; WX 722 ; N K ; B 87 0 722 718 ; -C 76 ; WX 611 ; N L ; B 76 0 583 718 ; -C 77 ; WX 833 ; N M ; B 69 0 765 718 ; -C 78 ; WX 722 ; N N ; B 69 0 654 718 ; -C 79 ; WX 778 ; N O ; B 44 -19 734 737 ; -C 80 ; WX 667 ; N P ; B 76 0 627 718 ; -C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ; -C 82 ; WX 722 ; N R ; B 76 0 677 718 ; -C 83 ; WX 667 ; N S ; B 39 -19 629 737 ; -C 84 ; WX 611 ; N T ; B 14 0 598 718 ; -C 85 ; WX 722 ; N U ; B 72 -19 651 718 ; -C 86 ; WX 667 ; N V ; B 19 0 648 718 ; -C 87 ; WX 944 ; N W ; B 16 0 929 718 ; -C 88 ; WX 667 ; N X ; B 14 0 653 718 ; -C 89 ; WX 667 ; N Y ; B 15 0 653 718 ; -C 90 ; WX 611 ; N Z ; B 25 0 586 718 ; -C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ; -C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ; -C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ; -C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ; -C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; -C 145 ; WX 278 ; N quoteleft ; B 69 454 209 727 ; -C 97 ; WX 556 ; N a ; B 29 -14 527 546 ; -C 98 ; WX 611 ; N b ; B 61 -14 578 718 ; -C 99 ; WX 556 ; N c ; B 34 -14 524 546 ; -C 100 ; WX 611 ; N d ; B 34 -14 551 718 ; -C 101 ; WX 556 ; N e ; B 23 -14 528 546 ; -C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ; -C 103 ; WX 611 ; N g ; B 40 -217 553 546 ; -C 104 ; WX 611 ; N h ; B 65 0 546 718 ; -C 105 ; WX 278 ; N i ; B 69 0 209 725 ; -C 106 ; WX 278 ; N j ; B 3 -214 209 725 ; -C 107 ; WX 556 ; N k ; B 69 0 562 718 ; -C 108 ; WX 278 ; N l ; B 69 0 209 718 ; -C 109 ; WX 889 ; N m ; B 64 0 826 546 ; -C 110 ; WX 611 ; N n ; B 65 0 546 546 ; -C 111 ; WX 611 ; N o ; B 34 -14 578 546 ; -C 112 ; WX 611 ; N p ; B 62 -207 578 546 ; -C 113 ; WX 611 ; N q ; B 34 -207 552 546 ; -C 114 ; WX 389 ; N r ; B 64 0 373 546 ; -C 115 ; WX 556 ; N s ; B 30 -14 519 546 ; -C 116 ; WX 333 ; N t ; B 10 -6 309 676 ; -C 117 ; WX 611 ; N u ; B 66 -14 545 532 ; -C 118 ; WX 556 ; N v ; B 13 0 543 532 ; -C 119 ; WX 778 ; N w ; B 10 0 769 532 ; -C 120 ; WX 556 ; N x ; B 15 0 541 532 ; -C 121 ; WX 556 ; N y ; B 10 -214 539 532 ; -C 122 ; WX 500 ; N z ; B 20 0 480 532 ; -C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ; -C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ; -C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ; -C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ; -C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ; -C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ; -C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ; -C -1 ; WX 167 ; N fraction ; B -170 -19 336 710 ; -C 165 ; WX 556 ; N yen ; B -9 0 565 698 ; -C 131 ; WX 556 ; N florin ; B -10 -210 516 737 ; -C 167 ; WX 556 ; N section ; B 34 -184 522 727 ; -C 164 ; WX 556 ; N currency ; B -3 76 559 636 ; -C 39 ; WX 238 ; N quotesingle ; B 70 447 168 718 ; -C 147 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ; -C 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ; -C 139 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ; -C 155 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ; -C -1 ; WX 611 ; N fi ; B 10 0 542 727 ; -C -1 ; WX 611 ; N fl ; B 10 0 542 727 ; -C 150 ; WX 556 ; N endash ; B 0 227 556 333 ; -C 134 ; WX 556 ; N dagger ; B 36 -171 520 718 ; -C 135 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ; -C 183 ; WX 278 ; N periodcentered ; B 58 172 220 334 ; -C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ; -C 149 ; WX 350 ; N bullet ; B 10 194 340 524 ; -C 130 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ; -C 132 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ; -C 148 ; WX 500 ; N quotedblright ; B 64 445 436 718 ; -C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ; -C 133 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ; -C 137 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ; -C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ; -C 96 ; WX 333 ; N grave ; B -23 604 225 750 ; -C 180 ; WX 333 ; N acute ; B 108 604 356 750 ; -C 136 ; WX 333 ; N circumflex ; B -10 604 343 750 ; -C 152 ; WX 333 ; N tilde ; B -17 610 350 737 ; -C 175 ; WX 333 ; N macron ; B -6 604 339 678 ; -C -1 ; WX 333 ; N breve ; B -2 604 335 750 ; -C -1 ; WX 333 ; N dotaccent ; B 104 614 230 729 ; -C 168 ; WX 333 ; N dieresis ; B 6 614 327 729 ; -C -1 ; WX 333 ; N ring ; B 59 568 275 776 ; -C 184 ; WX 333 ; N cedilla ; B 6 -228 245 0 ; -C -1 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ; -C -1 ; WX 333 ; N ogonek ; B 71 -228 304 0 ; -C -1 ; WX 333 ; N caron ; B -10 604 343 750 ; -C 151 ; WX 1000 ; N emdash ; B 0 227 1000 333 ; -C 198 ; WX 1000 ; N AE ; B 5 0 954 718 ; -C 170 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ; -C -1 ; WX 611 ; N Lslash ; B -20 0 583 718 ; -C 216 ; WX 778 ; N Oslash ; B 33 -27 744 745 ; -C 140 ; WX 1000 ; N OE ; B 37 -19 961 737 ; -C 186 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ; -C 230 ; WX 889 ; N ae ; B 29 -14 858 546 ; -C -1 ; WX 278 ; N dotlessi ; B 69 0 209 532 ; -C -1 ; WX 278 ; N lslash ; B -18 0 296 718 ; -C 248 ; WX 611 ; N oslash ; B 22 -29 589 560 ; -C 156 ; WX 944 ; N oe ; B 34 -14 912 546 ; -C 223 ; WX 611 ; N germandbls ; B 69 -14 579 731 ; -C 207 ; WX 278 ; N Idieresis ; B -21 0 300 915 ; -C 233 ; WX 556 ; N eacute ; B 23 -14 528 750 ; -C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ; -C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ; -C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ; -C 159 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ; -C 247 ; WX 584 ; N divide ; B 40 -42 544 548 ; -C 221 ; WX 667 ; N Yacute ; B 15 0 653 936 ; -C 194 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ; -C 225 ; WX 556 ; N aacute ; B 29 -14 527 750 ; -C 219 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ; -C 253 ; WX 556 ; N yacute ; B 10 -214 539 750 ; -C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ; -C 234 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ; -C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ; -C 220 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ; -C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ; -C 218 ; WX 722 ; N Uacute ; B 72 -19 651 936 ; -C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ; -C 203 ; WX 667 ; N Edieresis ; B 76 0 621 915 ; -C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ; -C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ; -C 169 ; WX 737 ; N copyright ; B -11 -19 749 737 ; -C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ; -C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ; -C 229 ; WX 556 ; N aring ; B 29 -14 527 776 ; -C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ; -C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ; -C 224 ; WX 556 ; N agrave ; B 29 -14 527 750 ; -C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ; -C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ; -C 227 ; WX 556 ; N atilde ; B 29 -14 527 737 ; -C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ; -C 154 ; WX 556 ; N scaron ; B 30 -14 519 750 ; -C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ; -C 237 ; WX 278 ; N iacute ; B 69 0 329 750 ; -C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; -C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ; -C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ; -C 251 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ; -C 226 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ; -C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ; -C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ; -C 231 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ; -C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ; -C 222 ; WX 667 ; N Thorn ; B 76 0 627 718 ; -C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ; -C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ; -C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ; -C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ; -C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ; -C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ; -C 179 ; WX 333 ; N threesuperior ; B 8 271 326 710 ; -C 210 ; WX 778 ; N Ograve ; B 44 -19 734 936 ; -C 192 ; WX 722 ; N Agrave ; B 20 0 702 936 ; -C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ; -C 215 ; WX 584 ; N multiply ; B 40 1 545 505 ; -C 250 ; WX 611 ; N uacute ; B 66 -14 545 750 ; -C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ; -C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; -C 255 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ; -C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ; -C 238 ; WX 278 ; N icircumflex ; B -37 0 316 750 ; -C 202 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ; -C 228 ; WX 556 ; N adieresis ; B 29 -14 527 729 ; -C 235 ; WX 556 ; N edieresis ; B 23 -14 528 729 ; -C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ; -C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ; -C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ; -C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ; -C 205 ; WX 278 ; N Iacute ; B 64 0 329 936 ; -C 177 ; WX 584 ; N plusminus ; B 40 0 544 506 ; -C 166 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ; -C 174 ; WX 737 ; N registered ; B -11 -19 748 737 ; -C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ; -C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ; -C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; -C 200 ; WX 667 ; N Egrave ; B 76 0 621 936 ; -C -1 ; WX 389 ; N racute ; B 64 0 384 750 ; -C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ; -C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ; -C 142 ; WX 611 ; N Zcaron ; B 25 0 586 936 ; -C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; -C 208 ; WX 722 ; N Eth ; B -5 0 685 718 ; -C 199 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ; -C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ; -C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ; -C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ; -C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ; -C 193 ; WX 722 ; N Aacute ; B 20 0 702 936 ; -C 196 ; WX 722 ; N Adieresis ; B 20 0 702 915 ; -C 232 ; WX 556 ; N egrave ; B 23 -14 528 750 ; -C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ; -C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ; -C 211 ; WX 778 ; N Oacute ; B 44 -19 734 936 ; -C 243 ; WX 611 ; N oacute ; B 34 -14 578 750 ; -C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ; -C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ; -C 239 ; WX 278 ; N idieresis ; B -21 0 300 729 ; -C 212 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ; -C 217 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ; -C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; -C 254 ; WX 611 ; N thorn ; B 62 -208 578 718 ; -C 178 ; WX 333 ; N twosuperior ; B 9 283 324 710 ; -C 214 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ; -C 181 ; WX 611 ; N mu ; B 66 -207 545 532 ; -C 236 ; WX 278 ; N igrave ; B -50 0 209 750 ; -C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ; -C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ; -C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ; -C 190 ; WX 834 ; N threequarters ; B 16 -19 799 710 ; -C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ; -C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ; -C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ; -C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ; -C 153 ; WX 1000 ; N trademark ; B 44 306 956 718 ; -C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ; -C 204 ; WX 278 ; N Igrave ; B -50 0 214 936 ; -C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ; -C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ; -C 189 ; WX 834 ; N onehalf ; B 26 -19 794 710 ; -C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; -C 244 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ; -C 241 ; WX 611 ; N ntilde ; B 65 0 546 737 ; -C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ; -C 201 ; WX 667 ; N Eacute ; B 76 0 621 936 ; -C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ; -C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ; -C 188 ; WX 834 ; N onequarter ; B 26 -19 766 710 ; -C 138 ; WX 667 ; N Scaron ; B 39 -19 629 936 ; -C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ; -C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ; -C 176 ; WX 400 ; N degree ; B 57 426 343 712 ; -C 242 ; WX 611 ; N ograve ; B 34 -14 578 750 ; -C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ; -C 249 ; WX 611 ; N ugrave ; B 66 -14 545 750 ; -C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; -C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ; -C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ; -C 209 ; WX 722 ; N Ntilde ; B 69 0 654 923 ; -C 245 ; WX 611 ; N otilde ; B 34 -14 578 737 ; -C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ; -C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ; -C 195 ; WX 722 ; N Atilde ; B 20 0 702 923 ; -C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ; -C 197 ; WX 722 ; N Aring ; B 20 0 702 962 ; -C 213 ; WX 778 ; N Otilde ; B 44 -19 734 923 ; -C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ; -C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ; -C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ; -C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ; -C -1 ; WX 584 ; N minus ; B 40 197 544 309 ; -C 206 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ; -C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ; -C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ; -C 172 ; WX 584 ; N logicalnot ; B 40 108 544 419 ; -C 246 ; WX 611 ; N odieresis ; B 34 -14 578 729 ; -C 252 ; WX 611 ; N udieresis ; B 66 -14 545 729 ; -C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; -C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ; -C 240 ; WX 611 ; N eth ; B 34 -14 578 737 ; -C 158 ; WX 500 ; N zcaron ; B 20 0 480 750 ; -C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ; -C 185 ; WX 333 ; N onesuperior ; B 26 283 237 710 ; -C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ; -C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -StartKernData -StartKernPairs 2481 -KPX A C -40 -KPX A Cacute -40 -KPX A Ccaron -40 -KPX A Ccedilla -40 -KPX A G -50 -KPX A Gbreve -50 -KPX A Gcommaaccent -50 -KPX A O -40 -KPX A Oacute -40 -KPX A Ocircumflex -40 -KPX A Odieresis -40 -KPX A Ograve -40 -KPX A Ohungarumlaut -40 -KPX A Omacron -40 -KPX A Oslash -40 -KPX A Otilde -40 -KPX A Q -40 -KPX A T -90 -KPX A Tcaron -90 -KPX A Tcommaaccent -90 -KPX A U -50 -KPX A Uacute -50 -KPX A Ucircumflex -50 -KPX A Udieresis -50 -KPX A Ugrave -50 -KPX A Uhungarumlaut -50 -KPX A Umacron -50 -KPX A Uogonek -50 -KPX A Uring -50 -KPX A V -80 -KPX A W -60 -KPX A Y -110 -KPX A Yacute -110 -KPX A Ydieresis -110 -KPX A u -30 -KPX A uacute -30 -KPX A ucircumflex -30 -KPX A udieresis -30 -KPX A ugrave -30 -KPX A uhungarumlaut -30 -KPX A umacron -30 -KPX A uogonek -30 -KPX A uring -30 -KPX A v -40 -KPX A w -30 -KPX A y -30 -KPX A yacute -30 -KPX A ydieresis -30 -KPX Aacute C -40 -KPX Aacute Cacute -40 -KPX Aacute Ccaron -40 -KPX Aacute Ccedilla -40 -KPX Aacute G -50 -KPX Aacute Gbreve -50 -KPX Aacute Gcommaaccent -50 -KPX Aacute O -40 -KPX Aacute Oacute -40 -KPX Aacute Ocircumflex -40 -KPX Aacute Odieresis -40 -KPX Aacute Ograve -40 -KPX Aacute Ohungarumlaut -40 -KPX Aacute Omacron -40 -KPX Aacute Oslash -40 -KPX Aacute Otilde -40 -KPX Aacute Q -40 -KPX Aacute T -90 -KPX Aacute Tcaron -90 -KPX Aacute Tcommaaccent -90 -KPX Aacute U -50 -KPX Aacute Uacute -50 -KPX Aacute Ucircumflex -50 -KPX Aacute Udieresis -50 -KPX Aacute Ugrave -50 -KPX Aacute Uhungarumlaut -50 -KPX Aacute Umacron -50 -KPX Aacute Uogonek -50 -KPX Aacute Uring -50 -KPX Aacute V -80 -KPX Aacute W -60 -KPX Aacute Y -110 -KPX Aacute Yacute -110 -KPX Aacute Ydieresis -110 -KPX Aacute u -30 -KPX Aacute uacute -30 -KPX Aacute ucircumflex -30 -KPX Aacute udieresis -30 -KPX Aacute ugrave -30 -KPX Aacute uhungarumlaut -30 -KPX Aacute umacron -30 -KPX Aacute uogonek -30 -KPX Aacute uring -30 -KPX Aacute v -40 -KPX Aacute w -30 -KPX Aacute y -30 -KPX Aacute yacute -30 -KPX Aacute ydieresis -30 -KPX Abreve C -40 -KPX Abreve Cacute -40 -KPX Abreve Ccaron -40 -KPX Abreve Ccedilla -40 -KPX Abreve G -50 -KPX Abreve Gbreve -50 -KPX Abreve Gcommaaccent -50 -KPX Abreve O -40 -KPX Abreve Oacute -40 -KPX Abreve Ocircumflex -40 -KPX Abreve Odieresis -40 -KPX Abreve Ograve -40 -KPX Abreve Ohungarumlaut -40 -KPX Abreve Omacron -40 -KPX Abreve Oslash -40 -KPX Abreve Otilde -40 -KPX Abreve Q -40 -KPX Abreve T -90 -KPX Abreve Tcaron -90 -KPX Abreve Tcommaaccent -90 -KPX Abreve U -50 -KPX Abreve Uacute -50 -KPX Abreve Ucircumflex -50 -KPX Abreve Udieresis -50 -KPX Abreve Ugrave -50 -KPX Abreve Uhungarumlaut -50 -KPX Abreve Umacron -50 -KPX Abreve Uogonek -50 -KPX Abreve Uring -50 -KPX Abreve V -80 -KPX Abreve W -60 -KPX Abreve Y -110 -KPX Abreve Yacute -110 -KPX Abreve Ydieresis -110 -KPX Abreve u -30 -KPX Abreve uacute -30 -KPX Abreve ucircumflex -30 -KPX Abreve udieresis -30 -KPX Abreve ugrave -30 -KPX Abreve uhungarumlaut -30 -KPX Abreve umacron -30 -KPX Abreve uogonek -30 -KPX Abreve uring -30 -KPX Abreve v -40 -KPX Abreve w -30 -KPX Abreve y -30 -KPX Abreve yacute -30 -KPX Abreve ydieresis -30 -KPX Acircumflex C -40 -KPX Acircumflex Cacute -40 -KPX Acircumflex Ccaron -40 -KPX Acircumflex Ccedilla -40 -KPX Acircumflex G -50 -KPX Acircumflex Gbreve -50 -KPX Acircumflex Gcommaaccent -50 -KPX Acircumflex O -40 -KPX Acircumflex Oacute -40 -KPX Acircumflex Ocircumflex -40 -KPX Acircumflex Odieresis -40 -KPX Acircumflex Ograve -40 -KPX Acircumflex Ohungarumlaut -40 -KPX Acircumflex Omacron -40 -KPX Acircumflex Oslash -40 -KPX Acircumflex Otilde -40 -KPX Acircumflex Q -40 -KPX Acircumflex T -90 -KPX Acircumflex Tcaron -90 -KPX Acircumflex Tcommaaccent -90 -KPX Acircumflex U -50 -KPX Acircumflex Uacute -50 -KPX Acircumflex Ucircumflex -50 -KPX Acircumflex Udieresis -50 -KPX Acircumflex Ugrave -50 -KPX Acircumflex Uhungarumlaut -50 -KPX Acircumflex Umacron -50 -KPX Acircumflex Uogonek -50 -KPX Acircumflex Uring -50 -KPX Acircumflex V -80 -KPX Acircumflex W -60 -KPX Acircumflex Y -110 -KPX Acircumflex Yacute -110 -KPX Acircumflex Ydieresis -110 -KPX Acircumflex u -30 -KPX Acircumflex uacute -30 -KPX Acircumflex ucircumflex -30 -KPX Acircumflex udieresis -30 -KPX Acircumflex ugrave -30 -KPX Acircumflex uhungarumlaut -30 -KPX Acircumflex umacron -30 -KPX Acircumflex uogonek -30 -KPX Acircumflex uring -30 -KPX Acircumflex v -40 -KPX Acircumflex w -30 -KPX Acircumflex y -30 -KPX Acircumflex yacute -30 -KPX Acircumflex ydieresis -30 -KPX Adieresis C -40 -KPX Adieresis Cacute -40 -KPX Adieresis Ccaron -40 -KPX Adieresis Ccedilla -40 -KPX Adieresis G -50 -KPX Adieresis Gbreve -50 -KPX Adieresis Gcommaaccent -50 -KPX Adieresis O -40 -KPX Adieresis Oacute -40 -KPX Adieresis Ocircumflex -40 -KPX Adieresis Odieresis -40 -KPX Adieresis Ograve -40 -KPX Adieresis Ohungarumlaut -40 -KPX Adieresis Omacron -40 -KPX Adieresis Oslash -40 -KPX Adieresis Otilde -40 -KPX Adieresis Q -40 -KPX Adieresis T -90 -KPX Adieresis Tcaron -90 -KPX Adieresis Tcommaaccent -90 -KPX Adieresis U -50 -KPX Adieresis Uacute -50 -KPX Adieresis Ucircumflex -50 -KPX Adieresis Udieresis -50 -KPX Adieresis Ugrave -50 -KPX Adieresis Uhungarumlaut -50 -KPX Adieresis Umacron -50 -KPX Adieresis Uogonek -50 -KPX Adieresis Uring -50 -KPX Adieresis V -80 -KPX Adieresis W -60 -KPX Adieresis Y -110 -KPX Adieresis Yacute -110 -KPX Adieresis Ydieresis -110 -KPX Adieresis u -30 -KPX Adieresis uacute -30 -KPX Adieresis ucircumflex -30 -KPX Adieresis udieresis -30 -KPX Adieresis ugrave -30 -KPX Adieresis uhungarumlaut -30 -KPX Adieresis umacron -30 -KPX Adieresis uogonek -30 -KPX Adieresis uring -30 -KPX Adieresis v -40 -KPX Adieresis w -30 -KPX Adieresis y -30 -KPX Adieresis yacute -30 -KPX Adieresis ydieresis -30 -KPX Agrave C -40 -KPX Agrave Cacute -40 -KPX Agrave Ccaron -40 -KPX Agrave Ccedilla -40 -KPX Agrave G -50 -KPX Agrave Gbreve -50 -KPX Agrave Gcommaaccent -50 -KPX Agrave O -40 -KPX Agrave Oacute -40 -KPX Agrave Ocircumflex -40 -KPX Agrave Odieresis -40 -KPX Agrave Ograve -40 -KPX Agrave Ohungarumlaut -40 -KPX Agrave Omacron -40 -KPX Agrave Oslash -40 -KPX Agrave Otilde -40 -KPX Agrave Q -40 -KPX Agrave T -90 -KPX Agrave Tcaron -90 -KPX Agrave Tcommaaccent -90 -KPX Agrave U -50 -KPX Agrave Uacute -50 -KPX Agrave Ucircumflex -50 -KPX Agrave Udieresis -50 -KPX Agrave Ugrave -50 -KPX Agrave Uhungarumlaut -50 -KPX Agrave Umacron -50 -KPX Agrave Uogonek -50 -KPX Agrave Uring -50 -KPX Agrave V -80 -KPX Agrave W -60 -KPX Agrave Y -110 -KPX Agrave Yacute -110 -KPX Agrave Ydieresis -110 -KPX Agrave u -30 -KPX Agrave uacute -30 -KPX Agrave ucircumflex -30 -KPX Agrave udieresis -30 -KPX Agrave ugrave -30 -KPX Agrave uhungarumlaut -30 -KPX Agrave umacron -30 -KPX Agrave uogonek -30 -KPX Agrave uring -30 -KPX Agrave v -40 -KPX Agrave w -30 -KPX Agrave y -30 -KPX Agrave yacute -30 -KPX Agrave ydieresis -30 -KPX Amacron C -40 -KPX Amacron Cacute -40 -KPX Amacron Ccaron -40 -KPX Amacron Ccedilla -40 -KPX Amacron G -50 -KPX Amacron Gbreve -50 -KPX Amacron Gcommaaccent -50 -KPX Amacron O -40 -KPX Amacron Oacute -40 -KPX Amacron Ocircumflex -40 -KPX Amacron Odieresis -40 -KPX Amacron Ograve -40 -KPX Amacron Ohungarumlaut -40 -KPX Amacron Omacron -40 -KPX Amacron Oslash -40 -KPX Amacron Otilde -40 -KPX Amacron Q -40 -KPX Amacron T -90 -KPX Amacron Tcaron -90 -KPX Amacron Tcommaaccent -90 -KPX Amacron U -50 -KPX Amacron Uacute -50 -KPX Amacron Ucircumflex -50 -KPX Amacron Udieresis -50 -KPX Amacron Ugrave -50 -KPX Amacron Uhungarumlaut -50 -KPX Amacron Umacron -50 -KPX Amacron Uogonek -50 -KPX Amacron Uring -50 -KPX Amacron V -80 -KPX Amacron W -60 -KPX Amacron Y -110 -KPX Amacron Yacute -110 -KPX Amacron Ydieresis -110 -KPX Amacron u -30 -KPX Amacron uacute -30 -KPX Amacron ucircumflex -30 -KPX Amacron udieresis -30 -KPX Amacron ugrave -30 -KPX Amacron uhungarumlaut -30 -KPX Amacron umacron -30 -KPX Amacron uogonek -30 -KPX Amacron uring -30 -KPX Amacron v -40 -KPX Amacron w -30 -KPX Amacron y -30 -KPX Amacron yacute -30 -KPX Amacron ydieresis -30 -KPX Aogonek C -40 -KPX Aogonek Cacute -40 -KPX Aogonek Ccaron -40 -KPX Aogonek Ccedilla -40 -KPX Aogonek G -50 -KPX Aogonek Gbreve -50 -KPX Aogonek Gcommaaccent -50 -KPX Aogonek O -40 -KPX Aogonek Oacute -40 -KPX Aogonek Ocircumflex -40 -KPX Aogonek Odieresis -40 -KPX Aogonek Ograve -40 -KPX Aogonek Ohungarumlaut -40 -KPX Aogonek Omacron -40 -KPX Aogonek Oslash -40 -KPX Aogonek Otilde -40 -KPX Aogonek Q -40 -KPX Aogonek T -90 -KPX Aogonek Tcaron -90 -KPX Aogonek Tcommaaccent -90 -KPX Aogonek U -50 -KPX Aogonek Uacute -50 -KPX Aogonek Ucircumflex -50 -KPX Aogonek Udieresis -50 -KPX Aogonek Ugrave -50 -KPX Aogonek Uhungarumlaut -50 -KPX Aogonek Umacron -50 -KPX Aogonek Uogonek -50 -KPX Aogonek Uring -50 -KPX Aogonek V -80 -KPX Aogonek W -60 -KPX Aogonek Y -110 -KPX Aogonek Yacute -110 -KPX Aogonek Ydieresis -110 -KPX Aogonek u -30 -KPX Aogonek uacute -30 -KPX Aogonek ucircumflex -30 -KPX Aogonek udieresis -30 -KPX Aogonek ugrave -30 -KPX Aogonek uhungarumlaut -30 -KPX Aogonek umacron -30 -KPX Aogonek uogonek -30 -KPX Aogonek uring -30 -KPX Aogonek v -40 -KPX Aogonek w -30 -KPX Aogonek y -30 -KPX Aogonek yacute -30 -KPX Aogonek ydieresis -30 -KPX Aring C -40 -KPX Aring Cacute -40 -KPX Aring Ccaron -40 -KPX Aring Ccedilla -40 -KPX Aring G -50 -KPX Aring Gbreve -50 -KPX Aring Gcommaaccent -50 -KPX Aring O -40 -KPX Aring Oacute -40 -KPX Aring Ocircumflex -40 -KPX Aring Odieresis -40 -KPX Aring Ograve -40 -KPX Aring Ohungarumlaut -40 -KPX Aring Omacron -40 -KPX Aring Oslash -40 -KPX Aring Otilde -40 -KPX Aring Q -40 -KPX Aring T -90 -KPX Aring Tcaron -90 -KPX Aring Tcommaaccent -90 -KPX Aring U -50 -KPX Aring Uacute -50 -KPX Aring Ucircumflex -50 -KPX Aring Udieresis -50 -KPX Aring Ugrave -50 -KPX Aring Uhungarumlaut -50 -KPX Aring Umacron -50 -KPX Aring Uogonek -50 -KPX Aring Uring -50 -KPX Aring V -80 -KPX Aring W -60 -KPX Aring Y -110 -KPX Aring Yacute -110 -KPX Aring Ydieresis -110 -KPX Aring u -30 -KPX Aring uacute -30 -KPX Aring ucircumflex -30 -KPX Aring udieresis -30 -KPX Aring ugrave -30 -KPX Aring uhungarumlaut -30 -KPX Aring umacron -30 -KPX Aring uogonek -30 -KPX Aring uring -30 -KPX Aring v -40 -KPX Aring w -30 -KPX Aring y -30 -KPX Aring yacute -30 -KPX Aring ydieresis -30 -KPX Atilde C -40 -KPX Atilde Cacute -40 -KPX Atilde Ccaron -40 -KPX Atilde Ccedilla -40 -KPX Atilde G -50 -KPX Atilde Gbreve -50 -KPX Atilde Gcommaaccent -50 -KPX Atilde O -40 -KPX Atilde Oacute -40 -KPX Atilde Ocircumflex -40 -KPX Atilde Odieresis -40 -KPX Atilde Ograve -40 -KPX Atilde Ohungarumlaut -40 -KPX Atilde Omacron -40 -KPX Atilde Oslash -40 -KPX Atilde Otilde -40 -KPX Atilde Q -40 -KPX Atilde T -90 -KPX Atilde Tcaron -90 -KPX Atilde Tcommaaccent -90 -KPX Atilde U -50 -KPX Atilde Uacute -50 -KPX Atilde Ucircumflex -50 -KPX Atilde Udieresis -50 -KPX Atilde Ugrave -50 -KPX Atilde Uhungarumlaut -50 -KPX Atilde Umacron -50 -KPX Atilde Uogonek -50 -KPX Atilde Uring -50 -KPX Atilde V -80 -KPX Atilde W -60 -KPX Atilde Y -110 -KPX Atilde Yacute -110 -KPX Atilde Ydieresis -110 -KPX Atilde u -30 -KPX Atilde uacute -30 -KPX Atilde ucircumflex -30 -KPX Atilde udieresis -30 -KPX Atilde ugrave -30 -KPX Atilde uhungarumlaut -30 -KPX Atilde umacron -30 -KPX Atilde uogonek -30 -KPX Atilde uring -30 -KPX Atilde v -40 -KPX Atilde w -30 -KPX Atilde y -30 -KPX Atilde yacute -30 -KPX Atilde ydieresis -30 -KPX B A -30 -KPX B Aacute -30 -KPX B Abreve -30 -KPX B Acircumflex -30 -KPX B Adieresis -30 -KPX B Agrave -30 -KPX B Amacron -30 -KPX B Aogonek -30 -KPX B Aring -30 -KPX B Atilde -30 -KPX B U -10 -KPX B Uacute -10 -KPX B Ucircumflex -10 -KPX B Udieresis -10 -KPX B Ugrave -10 -KPX B Uhungarumlaut -10 -KPX B Umacron -10 -KPX B Uogonek -10 -KPX B Uring -10 -KPX D A -40 -KPX D Aacute -40 -KPX D Abreve -40 -KPX D Acircumflex -40 -KPX D Adieresis -40 -KPX D Agrave -40 -KPX D Amacron -40 -KPX D Aogonek -40 -KPX D Aring -40 -KPX D Atilde -40 -KPX D V -40 -KPX D W -40 -KPX D Y -70 -KPX D Yacute -70 -KPX D Ydieresis -70 -KPX D comma -30 -KPX D period -30 -KPX Dcaron A -40 -KPX Dcaron Aacute -40 -KPX Dcaron Abreve -40 -KPX Dcaron Acircumflex -40 -KPX Dcaron Adieresis -40 -KPX Dcaron Agrave -40 -KPX Dcaron Amacron -40 -KPX Dcaron Aogonek -40 -KPX Dcaron Aring -40 -KPX Dcaron Atilde -40 -KPX Dcaron V -40 -KPX Dcaron W -40 -KPX Dcaron Y -70 -KPX Dcaron Yacute -70 -KPX Dcaron Ydieresis -70 -KPX Dcaron comma -30 -KPX Dcaron period -30 -KPX Dcroat A -40 -KPX Dcroat Aacute -40 -KPX Dcroat Abreve -40 -KPX Dcroat Acircumflex -40 -KPX Dcroat Adieresis -40 -KPX Dcroat Agrave -40 -KPX Dcroat Amacron -40 -KPX Dcroat Aogonek -40 -KPX Dcroat Aring -40 -KPX Dcroat Atilde -40 -KPX Dcroat V -40 -KPX Dcroat W -40 -KPX Dcroat Y -70 -KPX Dcroat Yacute -70 -KPX Dcroat Ydieresis -70 -KPX Dcroat comma -30 -KPX Dcroat period -30 -KPX F A -80 -KPX F Aacute -80 -KPX F Abreve -80 -KPX F Acircumflex -80 -KPX F Adieresis -80 -KPX F Agrave -80 -KPX F Amacron -80 -KPX F Aogonek -80 -KPX F Aring -80 -KPX F Atilde -80 -KPX F a -20 -KPX F aacute -20 -KPX F abreve -20 -KPX F acircumflex -20 -KPX F adieresis -20 -KPX F agrave -20 -KPX F amacron -20 -KPX F aogonek -20 -KPX F aring -20 -KPX F atilde -20 -KPX F comma -100 -KPX F period -100 -KPX J A -20 -KPX J Aacute -20 -KPX J Abreve -20 -KPX J Acircumflex -20 -KPX J Adieresis -20 -KPX J Agrave -20 -KPX J Amacron -20 -KPX J Aogonek -20 -KPX J Aring -20 -KPX J Atilde -20 -KPX J comma -20 -KPX J period -20 -KPX J u -20 -KPX J uacute -20 -KPX J ucircumflex -20 -KPX J udieresis -20 -KPX J ugrave -20 -KPX J uhungarumlaut -20 -KPX J umacron -20 -KPX J uogonek -20 -KPX J uring -20 -KPX K O -30 -KPX K Oacute -30 -KPX K Ocircumflex -30 -KPX K Odieresis -30 -KPX K Ograve -30 -KPX K Ohungarumlaut -30 -KPX K Omacron -30 -KPX K Oslash -30 -KPX K Otilde -30 -KPX K e -15 -KPX K eacute -15 -KPX K ecaron -15 -KPX K ecircumflex -15 -KPX K edieresis -15 -KPX K edotaccent -15 -KPX K egrave -15 -KPX K emacron -15 -KPX K eogonek -15 -KPX K o -35 -KPX K oacute -35 -KPX K ocircumflex -35 -KPX K odieresis -35 -KPX K ograve -35 -KPX K ohungarumlaut -35 -KPX K omacron -35 -KPX K oslash -35 -KPX K otilde -35 -KPX K u -30 -KPX K uacute -30 -KPX K ucircumflex -30 -KPX K udieresis -30 -KPX K ugrave -30 -KPX K uhungarumlaut -30 -KPX K umacron -30 -KPX K uogonek -30 -KPX K uring -30 -KPX K y -40 -KPX K yacute -40 -KPX K ydieresis -40 -KPX Kcommaaccent O -30 -KPX Kcommaaccent Oacute -30 -KPX Kcommaaccent Ocircumflex -30 -KPX Kcommaaccent Odieresis -30 -KPX Kcommaaccent Ograve -30 -KPX Kcommaaccent Ohungarumlaut -30 -KPX Kcommaaccent Omacron -30 -KPX Kcommaaccent Oslash -30 -KPX Kcommaaccent Otilde -30 -KPX Kcommaaccent e -15 -KPX Kcommaaccent eacute -15 -KPX Kcommaaccent ecaron -15 -KPX Kcommaaccent ecircumflex -15 -KPX Kcommaaccent edieresis -15 -KPX Kcommaaccent edotaccent -15 -KPX Kcommaaccent egrave -15 -KPX Kcommaaccent emacron -15 -KPX Kcommaaccent eogonek -15 -KPX Kcommaaccent o -35 -KPX Kcommaaccent oacute -35 -KPX Kcommaaccent ocircumflex -35 -KPX Kcommaaccent odieresis -35 -KPX Kcommaaccent ograve -35 -KPX Kcommaaccent ohungarumlaut -35 -KPX Kcommaaccent omacron -35 -KPX Kcommaaccent oslash -35 -KPX Kcommaaccent otilde -35 -KPX Kcommaaccent u -30 -KPX Kcommaaccent uacute -30 -KPX Kcommaaccent ucircumflex -30 -KPX Kcommaaccent udieresis -30 -KPX Kcommaaccent ugrave -30 -KPX Kcommaaccent uhungarumlaut -30 -KPX Kcommaaccent umacron -30 -KPX Kcommaaccent uogonek -30 -KPX Kcommaaccent uring -30 -KPX Kcommaaccent y -40 -KPX Kcommaaccent yacute -40 -KPX Kcommaaccent ydieresis -40 -KPX L T -90 -KPX L Tcaron -90 -KPX L Tcommaaccent -90 -KPX L V -110 -KPX L W -80 -KPX L Y -120 -KPX L Yacute -120 -KPX L Ydieresis -120 -KPX L quotedblright -140 -KPX L quoteright -140 -KPX L y -30 -KPX L yacute -30 -KPX L ydieresis -30 -KPX Lacute T -90 -KPX Lacute Tcaron -90 -KPX Lacute Tcommaaccent -90 -KPX Lacute V -110 -KPX Lacute W -80 -KPX Lacute Y -120 -KPX Lacute Yacute -120 -KPX Lacute Ydieresis -120 -KPX Lacute quotedblright -140 -KPX Lacute quoteright -140 -KPX Lacute y -30 -KPX Lacute yacute -30 -KPX Lacute ydieresis -30 -KPX Lcommaaccent T -90 -KPX Lcommaaccent Tcaron -90 -KPX Lcommaaccent Tcommaaccent -90 -KPX Lcommaaccent V -110 -KPX Lcommaaccent W -80 -KPX Lcommaaccent Y -120 -KPX Lcommaaccent Yacute -120 -KPX Lcommaaccent Ydieresis -120 -KPX Lcommaaccent quotedblright -140 -KPX Lcommaaccent quoteright -140 -KPX Lcommaaccent y -30 -KPX Lcommaaccent yacute -30 -KPX Lcommaaccent ydieresis -30 -KPX Lslash T -90 -KPX Lslash Tcaron -90 -KPX Lslash Tcommaaccent -90 -KPX Lslash V -110 -KPX Lslash W -80 -KPX Lslash Y -120 -KPX Lslash Yacute -120 -KPX Lslash Ydieresis -120 -KPX Lslash quotedblright -140 -KPX Lslash quoteright -140 -KPX Lslash y -30 -KPX Lslash yacute -30 -KPX Lslash ydieresis -30 -KPX O A -50 -KPX O Aacute -50 -KPX O Abreve -50 -KPX O Acircumflex -50 -KPX O Adieresis -50 -KPX O Agrave -50 -KPX O Amacron -50 -KPX O Aogonek -50 -KPX O Aring -50 -KPX O Atilde -50 -KPX O T -40 -KPX O Tcaron -40 -KPX O Tcommaaccent -40 -KPX O V -50 -KPX O W -50 -KPX O X -50 -KPX O Y -70 -KPX O Yacute -70 -KPX O Ydieresis -70 -KPX O comma -40 -KPX O period -40 -KPX Oacute A -50 -KPX Oacute Aacute -50 -KPX Oacute Abreve -50 -KPX Oacute Acircumflex -50 -KPX Oacute Adieresis -50 -KPX Oacute Agrave -50 -KPX Oacute Amacron -50 -KPX Oacute Aogonek -50 -KPX Oacute Aring -50 -KPX Oacute Atilde -50 -KPX Oacute T -40 -KPX Oacute Tcaron -40 -KPX Oacute Tcommaaccent -40 -KPX Oacute V -50 -KPX Oacute W -50 -KPX Oacute X -50 -KPX Oacute Y -70 -KPX Oacute Yacute -70 -KPX Oacute Ydieresis -70 -KPX Oacute comma -40 -KPX Oacute period -40 -KPX Ocircumflex A -50 -KPX Ocircumflex Aacute -50 -KPX Ocircumflex Abreve -50 -KPX Ocircumflex Acircumflex -50 -KPX Ocircumflex Adieresis -50 -KPX Ocircumflex Agrave -50 -KPX Ocircumflex Amacron -50 -KPX Ocircumflex Aogonek -50 -KPX Ocircumflex Aring -50 -KPX Ocircumflex Atilde -50 -KPX Ocircumflex T -40 -KPX Ocircumflex Tcaron -40 -KPX Ocircumflex Tcommaaccent -40 -KPX Ocircumflex V -50 -KPX Ocircumflex W -50 -KPX Ocircumflex X -50 -KPX Ocircumflex Y -70 -KPX Ocircumflex Yacute -70 -KPX Ocircumflex Ydieresis -70 -KPX Ocircumflex comma -40 -KPX Ocircumflex period -40 -KPX Odieresis A -50 -KPX Odieresis Aacute -50 -KPX Odieresis Abreve -50 -KPX Odieresis Acircumflex -50 -KPX Odieresis Adieresis -50 -KPX Odieresis Agrave -50 -KPX Odieresis Amacron -50 -KPX Odieresis Aogonek -50 -KPX Odieresis Aring -50 -KPX Odieresis Atilde -50 -KPX Odieresis T -40 -KPX Odieresis Tcaron -40 -KPX Odieresis Tcommaaccent -40 -KPX Odieresis V -50 -KPX Odieresis W -50 -KPX Odieresis X -50 -KPX Odieresis Y -70 -KPX Odieresis Yacute -70 -KPX Odieresis Ydieresis -70 -KPX Odieresis comma -40 -KPX Odieresis period -40 -KPX Ograve A -50 -KPX Ograve Aacute -50 -KPX Ograve Abreve -50 -KPX Ograve Acircumflex -50 -KPX Ograve Adieresis -50 -KPX Ograve Agrave -50 -KPX Ograve Amacron -50 -KPX Ograve Aogonek -50 -KPX Ograve Aring -50 -KPX Ograve Atilde -50 -KPX Ograve T -40 -KPX Ograve Tcaron -40 -KPX Ograve Tcommaaccent -40 -KPX Ograve V -50 -KPX Ograve W -50 -KPX Ograve X -50 -KPX Ograve Y -70 -KPX Ograve Yacute -70 -KPX Ograve Ydieresis -70 -KPX Ograve comma -40 -KPX Ograve period -40 -KPX Ohungarumlaut A -50 -KPX Ohungarumlaut Aacute -50 -KPX Ohungarumlaut Abreve -50 -KPX Ohungarumlaut Acircumflex -50 -KPX Ohungarumlaut Adieresis -50 -KPX Ohungarumlaut Agrave -50 -KPX Ohungarumlaut Amacron -50 -KPX Ohungarumlaut Aogonek -50 -KPX Ohungarumlaut Aring -50 -KPX Ohungarumlaut Atilde -50 -KPX Ohungarumlaut T -40 -KPX Ohungarumlaut Tcaron -40 -KPX Ohungarumlaut Tcommaaccent -40 -KPX Ohungarumlaut V -50 -KPX Ohungarumlaut W -50 -KPX Ohungarumlaut X -50 -KPX Ohungarumlaut Y -70 -KPX Ohungarumlaut Yacute -70 -KPX Ohungarumlaut Ydieresis -70 -KPX Ohungarumlaut comma -40 -KPX Ohungarumlaut period -40 -KPX Omacron A -50 -KPX Omacron Aacute -50 -KPX Omacron Abreve -50 -KPX Omacron Acircumflex -50 -KPX Omacron Adieresis -50 -KPX Omacron Agrave -50 -KPX Omacron Amacron -50 -KPX Omacron Aogonek -50 -KPX Omacron Aring -50 -KPX Omacron Atilde -50 -KPX Omacron T -40 -KPX Omacron Tcaron -40 -KPX Omacron Tcommaaccent -40 -KPX Omacron V -50 -KPX Omacron W -50 -KPX Omacron X -50 -KPX Omacron Y -70 -KPX Omacron Yacute -70 -KPX Omacron Ydieresis -70 -KPX Omacron comma -40 -KPX Omacron period -40 -KPX Oslash A -50 -KPX Oslash Aacute -50 -KPX Oslash Abreve -50 -KPX Oslash Acircumflex -50 -KPX Oslash Adieresis -50 -KPX Oslash Agrave -50 -KPX Oslash Amacron -50 -KPX Oslash Aogonek -50 -KPX Oslash Aring -50 -KPX Oslash Atilde -50 -KPX Oslash T -40 -KPX Oslash Tcaron -40 -KPX Oslash Tcommaaccent -40 -KPX Oslash V -50 -KPX Oslash W -50 -KPX Oslash X -50 -KPX Oslash Y -70 -KPX Oslash Yacute -70 -KPX Oslash Ydieresis -70 -KPX Oslash comma -40 -KPX Oslash period -40 -KPX Otilde A -50 -KPX Otilde Aacute -50 -KPX Otilde Abreve -50 -KPX Otilde Acircumflex -50 -KPX Otilde Adieresis -50 -KPX Otilde Agrave -50 -KPX Otilde Amacron -50 -KPX Otilde Aogonek -50 -KPX Otilde Aring -50 -KPX Otilde Atilde -50 -KPX Otilde T -40 -KPX Otilde Tcaron -40 -KPX Otilde Tcommaaccent -40 -KPX Otilde V -50 -KPX Otilde W -50 -KPX Otilde X -50 -KPX Otilde Y -70 -KPX Otilde Yacute -70 -KPX Otilde Ydieresis -70 -KPX Otilde comma -40 -KPX Otilde period -40 -KPX P A -100 -KPX P Aacute -100 -KPX P Abreve -100 -KPX P Acircumflex -100 -KPX P Adieresis -100 -KPX P Agrave -100 -KPX P Amacron -100 -KPX P Aogonek -100 -KPX P Aring -100 -KPX P Atilde -100 -KPX P a -30 -KPX P aacute -30 -KPX P abreve -30 -KPX P acircumflex -30 -KPX P adieresis -30 -KPX P agrave -30 -KPX P amacron -30 -KPX P aogonek -30 -KPX P aring -30 -KPX P atilde -30 -KPX P comma -120 -KPX P e -30 -KPX P eacute -30 -KPX P ecaron -30 -KPX P ecircumflex -30 -KPX P edieresis -30 -KPX P edotaccent -30 -KPX P egrave -30 -KPX P emacron -30 -KPX P eogonek -30 -KPX P o -40 -KPX P oacute -40 -KPX P ocircumflex -40 -KPX P odieresis -40 -KPX P ograve -40 -KPX P ohungarumlaut -40 -KPX P omacron -40 -KPX P oslash -40 -KPX P otilde -40 -KPX P period -120 -KPX Q U -10 -KPX Q Uacute -10 -KPX Q Ucircumflex -10 -KPX Q Udieresis -10 -KPX Q Ugrave -10 -KPX Q Uhungarumlaut -10 -KPX Q Umacron -10 -KPX Q Uogonek -10 -KPX Q Uring -10 -KPX Q comma 20 -KPX Q period 20 -KPX R O -20 -KPX R Oacute -20 -KPX R Ocircumflex -20 -KPX R Odieresis -20 -KPX R Ograve -20 -KPX R Ohungarumlaut -20 -KPX R Omacron -20 -KPX R Oslash -20 -KPX R Otilde -20 -KPX R T -20 -KPX R Tcaron -20 -KPX R Tcommaaccent -20 -KPX R U -20 -KPX R Uacute -20 -KPX R Ucircumflex -20 -KPX R Udieresis -20 -KPX R Ugrave -20 -KPX R Uhungarumlaut -20 -KPX R Umacron -20 -KPX R Uogonek -20 -KPX R Uring -20 -KPX R V -50 -KPX R W -40 -KPX R Y -50 -KPX R Yacute -50 -KPX R Ydieresis -50 -KPX Racute O -20 -KPX Racute Oacute -20 -KPX Racute Ocircumflex -20 -KPX Racute Odieresis -20 -KPX Racute Ograve -20 -KPX Racute Ohungarumlaut -20 -KPX Racute Omacron -20 -KPX Racute Oslash -20 -KPX Racute Otilde -20 -KPX Racute T -20 -KPX Racute Tcaron -20 -KPX Racute Tcommaaccent -20 -KPX Racute U -20 -KPX Racute Uacute -20 -KPX Racute Ucircumflex -20 -KPX Racute Udieresis -20 -KPX Racute Ugrave -20 -KPX Racute Uhungarumlaut -20 -KPX Racute Umacron -20 -KPX Racute Uogonek -20 -KPX Racute Uring -20 -KPX Racute V -50 -KPX Racute W -40 -KPX Racute Y -50 -KPX Racute Yacute -50 -KPX Racute Ydieresis -50 -KPX Rcaron O -20 -KPX Rcaron Oacute -20 -KPX Rcaron Ocircumflex -20 -KPX Rcaron Odieresis -20 -KPX Rcaron Ograve -20 -KPX Rcaron Ohungarumlaut -20 -KPX Rcaron Omacron -20 -KPX Rcaron Oslash -20 -KPX Rcaron Otilde -20 -KPX Rcaron T -20 -KPX Rcaron Tcaron -20 -KPX Rcaron Tcommaaccent -20 -KPX Rcaron U -20 -KPX Rcaron Uacute -20 -KPX Rcaron Ucircumflex -20 -KPX Rcaron Udieresis -20 -KPX Rcaron Ugrave -20 -KPX Rcaron Uhungarumlaut -20 -KPX Rcaron Umacron -20 -KPX Rcaron Uogonek -20 -KPX Rcaron Uring -20 -KPX Rcaron V -50 -KPX Rcaron W -40 -KPX Rcaron Y -50 -KPX Rcaron Yacute -50 -KPX Rcaron Ydieresis -50 -KPX Rcommaaccent O -20 -KPX Rcommaaccent Oacute -20 -KPX Rcommaaccent Ocircumflex -20 -KPX Rcommaaccent Odieresis -20 -KPX Rcommaaccent Ograve -20 -KPX Rcommaaccent Ohungarumlaut -20 -KPX Rcommaaccent Omacron -20 -KPX Rcommaaccent Oslash -20 -KPX Rcommaaccent Otilde -20 -KPX Rcommaaccent T -20 -KPX Rcommaaccent Tcaron -20 -KPX Rcommaaccent Tcommaaccent -20 -KPX Rcommaaccent U -20 -KPX Rcommaaccent Uacute -20 -KPX Rcommaaccent Ucircumflex -20 -KPX Rcommaaccent Udieresis -20 -KPX Rcommaaccent Ugrave -20 -KPX Rcommaaccent Uhungarumlaut -20 -KPX Rcommaaccent Umacron -20 -KPX Rcommaaccent Uogonek -20 -KPX Rcommaaccent Uring -20 -KPX Rcommaaccent V -50 -KPX Rcommaaccent W -40 -KPX Rcommaaccent Y -50 -KPX Rcommaaccent Yacute -50 -KPX Rcommaaccent Ydieresis -50 -KPX T A -90 -KPX T Aacute -90 -KPX T Abreve -90 -KPX T Acircumflex -90 -KPX T Adieresis -90 -KPX T Agrave -90 -KPX T Amacron -90 -KPX T Aogonek -90 -KPX T Aring -90 -KPX T Atilde -90 -KPX T O -40 -KPX T Oacute -40 -KPX T Ocircumflex -40 -KPX T Odieresis -40 -KPX T Ograve -40 -KPX T Ohungarumlaut -40 -KPX T Omacron -40 -KPX T Oslash -40 -KPX T Otilde -40 -KPX T a -80 -KPX T aacute -80 -KPX T abreve -80 -KPX T acircumflex -80 -KPX T adieresis -80 -KPX T agrave -80 -KPX T amacron -80 -KPX T aogonek -80 -KPX T aring -80 -KPX T atilde -80 -KPX T colon -40 -KPX T comma -80 -KPX T e -60 -KPX T eacute -60 -KPX T ecaron -60 -KPX T ecircumflex -60 -KPX T edieresis -60 -KPX T edotaccent -60 -KPX T egrave -60 -KPX T emacron -60 -KPX T eogonek -60 -KPX T hyphen -120 -KPX T o -80 -KPX T oacute -80 -KPX T ocircumflex -80 -KPX T odieresis -80 -KPX T ograve -80 -KPX T ohungarumlaut -80 -KPX T omacron -80 -KPX T oslash -80 -KPX T otilde -80 -KPX T period -80 -KPX T r -80 -KPX T racute -80 -KPX T rcommaaccent -80 -KPX T semicolon -40 -KPX T u -90 -KPX T uacute -90 -KPX T ucircumflex -90 -KPX T udieresis -90 -KPX T ugrave -90 -KPX T uhungarumlaut -90 -KPX T umacron -90 -KPX T uogonek -90 -KPX T uring -90 -KPX T w -60 -KPX T y -60 -KPX T yacute -60 -KPX T ydieresis -60 -KPX Tcaron A -90 -KPX Tcaron Aacute -90 -KPX Tcaron Abreve -90 -KPX Tcaron Acircumflex -90 -KPX Tcaron Adieresis -90 -KPX Tcaron Agrave -90 -KPX Tcaron Amacron -90 -KPX Tcaron Aogonek -90 -KPX Tcaron Aring -90 -KPX Tcaron Atilde -90 -KPX Tcaron O -40 -KPX Tcaron Oacute -40 -KPX Tcaron Ocircumflex -40 -KPX Tcaron Odieresis -40 -KPX Tcaron Ograve -40 -KPX Tcaron Ohungarumlaut -40 -KPX Tcaron Omacron -40 -KPX Tcaron Oslash -40 -KPX Tcaron Otilde -40 -KPX Tcaron a -80 -KPX Tcaron aacute -80 -KPX Tcaron abreve -80 -KPX Tcaron acircumflex -80 -KPX Tcaron adieresis -80 -KPX Tcaron agrave -80 -KPX Tcaron amacron -80 -KPX Tcaron aogonek -80 -KPX Tcaron aring -80 -KPX Tcaron atilde -80 -KPX Tcaron colon -40 -KPX Tcaron comma -80 -KPX Tcaron e -60 -KPX Tcaron eacute -60 -KPX Tcaron ecaron -60 -KPX Tcaron ecircumflex -60 -KPX Tcaron edieresis -60 -KPX Tcaron edotaccent -60 -KPX Tcaron egrave -60 -KPX Tcaron emacron -60 -KPX Tcaron eogonek -60 -KPX Tcaron hyphen -120 -KPX Tcaron o -80 -KPX Tcaron oacute -80 -KPX Tcaron ocircumflex -80 -KPX Tcaron odieresis -80 -KPX Tcaron ograve -80 -KPX Tcaron ohungarumlaut -80 -KPX Tcaron omacron -80 -KPX Tcaron oslash -80 -KPX Tcaron otilde -80 -KPX Tcaron period -80 -KPX Tcaron r -80 -KPX Tcaron racute -80 -KPX Tcaron rcommaaccent -80 -KPX Tcaron semicolon -40 -KPX Tcaron u -90 -KPX Tcaron uacute -90 -KPX Tcaron ucircumflex -90 -KPX Tcaron udieresis -90 -KPX Tcaron ugrave -90 -KPX Tcaron uhungarumlaut -90 -KPX Tcaron umacron -90 -KPX Tcaron uogonek -90 -KPX Tcaron uring -90 -KPX Tcaron w -60 -KPX Tcaron y -60 -KPX Tcaron yacute -60 -KPX Tcaron ydieresis -60 -KPX Tcommaaccent A -90 -KPX Tcommaaccent Aacute -90 -KPX Tcommaaccent Abreve -90 -KPX Tcommaaccent Acircumflex -90 -KPX Tcommaaccent Adieresis -90 -KPX Tcommaaccent Agrave -90 -KPX Tcommaaccent Amacron -90 -KPX Tcommaaccent Aogonek -90 -KPX Tcommaaccent Aring -90 -KPX Tcommaaccent Atilde -90 -KPX Tcommaaccent O -40 -KPX Tcommaaccent Oacute -40 -KPX Tcommaaccent Ocircumflex -40 -KPX Tcommaaccent Odieresis -40 -KPX Tcommaaccent Ograve -40 -KPX Tcommaaccent Ohungarumlaut -40 -KPX Tcommaaccent Omacron -40 -KPX Tcommaaccent Oslash -40 -KPX Tcommaaccent Otilde -40 -KPX Tcommaaccent a -80 -KPX Tcommaaccent aacute -80 -KPX Tcommaaccent abreve -80 -KPX Tcommaaccent acircumflex -80 -KPX Tcommaaccent adieresis -80 -KPX Tcommaaccent agrave -80 -KPX Tcommaaccent amacron -80 -KPX Tcommaaccent aogonek -80 -KPX Tcommaaccent aring -80 -KPX Tcommaaccent atilde -80 -KPX Tcommaaccent colon -40 -KPX Tcommaaccent comma -80 -KPX Tcommaaccent e -60 -KPX Tcommaaccent eacute -60 -KPX Tcommaaccent ecaron -60 -KPX Tcommaaccent ecircumflex -60 -KPX Tcommaaccent edieresis -60 -KPX Tcommaaccent edotaccent -60 -KPX Tcommaaccent egrave -60 -KPX Tcommaaccent emacron -60 -KPX Tcommaaccent eogonek -60 -KPX Tcommaaccent hyphen -120 -KPX Tcommaaccent o -80 -KPX Tcommaaccent oacute -80 -KPX Tcommaaccent ocircumflex -80 -KPX Tcommaaccent odieresis -80 -KPX Tcommaaccent ograve -80 -KPX Tcommaaccent ohungarumlaut -80 -KPX Tcommaaccent omacron -80 -KPX Tcommaaccent oslash -80 -KPX Tcommaaccent otilde -80 -KPX Tcommaaccent period -80 -KPX Tcommaaccent r -80 -KPX Tcommaaccent racute -80 -KPX Tcommaaccent rcommaaccent -80 -KPX Tcommaaccent semicolon -40 -KPX Tcommaaccent u -90 -KPX Tcommaaccent uacute -90 -KPX Tcommaaccent ucircumflex -90 -KPX Tcommaaccent udieresis -90 -KPX Tcommaaccent ugrave -90 -KPX Tcommaaccent uhungarumlaut -90 -KPX Tcommaaccent umacron -90 -KPX Tcommaaccent uogonek -90 -KPX Tcommaaccent uring -90 -KPX Tcommaaccent w -60 -KPX Tcommaaccent y -60 -KPX Tcommaaccent yacute -60 -KPX Tcommaaccent ydieresis -60 -KPX U A -50 -KPX U Aacute -50 -KPX U Abreve -50 -KPX U Acircumflex -50 -KPX U Adieresis -50 -KPX U Agrave -50 -KPX U Amacron -50 -KPX U Aogonek -50 -KPX U Aring -50 -KPX U Atilde -50 -KPX U comma -30 -KPX U period -30 -KPX Uacute A -50 -KPX Uacute Aacute -50 -KPX Uacute Abreve -50 -KPX Uacute Acircumflex -50 -KPX Uacute Adieresis -50 -KPX Uacute Agrave -50 -KPX Uacute Amacron -50 -KPX Uacute Aogonek -50 -KPX Uacute Aring -50 -KPX Uacute Atilde -50 -KPX Uacute comma -30 -KPX Uacute period -30 -KPX Ucircumflex A -50 -KPX Ucircumflex Aacute -50 -KPX Ucircumflex Abreve -50 -KPX Ucircumflex Acircumflex -50 -KPX Ucircumflex Adieresis -50 -KPX Ucircumflex Agrave -50 -KPX Ucircumflex Amacron -50 -KPX Ucircumflex Aogonek -50 -KPX Ucircumflex Aring -50 -KPX Ucircumflex Atilde -50 -KPX Ucircumflex comma -30 -KPX Ucircumflex period -30 -KPX Udieresis A -50 -KPX Udieresis Aacute -50 -KPX Udieresis Abreve -50 -KPX Udieresis Acircumflex -50 -KPX Udieresis Adieresis -50 -KPX Udieresis Agrave -50 -KPX Udieresis Amacron -50 -KPX Udieresis Aogonek -50 -KPX Udieresis Aring -50 -KPX Udieresis Atilde -50 -KPX Udieresis comma -30 -KPX Udieresis period -30 -KPX Ugrave A -50 -KPX Ugrave Aacute -50 -KPX Ugrave Abreve -50 -KPX Ugrave Acircumflex -50 -KPX Ugrave Adieresis -50 -KPX Ugrave Agrave -50 -KPX Ugrave Amacron -50 -KPX Ugrave Aogonek -50 -KPX Ugrave Aring -50 -KPX Ugrave Atilde -50 -KPX Ugrave comma -30 -KPX Ugrave period -30 -KPX Uhungarumlaut A -50 -KPX Uhungarumlaut Aacute -50 -KPX Uhungarumlaut Abreve -50 -KPX Uhungarumlaut Acircumflex -50 -KPX Uhungarumlaut Adieresis -50 -KPX Uhungarumlaut Agrave -50 -KPX Uhungarumlaut Amacron -50 -KPX Uhungarumlaut Aogonek -50 -KPX Uhungarumlaut Aring -50 -KPX Uhungarumlaut Atilde -50 -KPX Uhungarumlaut comma -30 -KPX Uhungarumlaut period -30 -KPX Umacron A -50 -KPX Umacron Aacute -50 -KPX Umacron Abreve -50 -KPX Umacron Acircumflex -50 -KPX Umacron Adieresis -50 -KPX Umacron Agrave -50 -KPX Umacron Amacron -50 -KPX Umacron Aogonek -50 -KPX Umacron Aring -50 -KPX Umacron Atilde -50 -KPX Umacron comma -30 -KPX Umacron period -30 -KPX Uogonek A -50 -KPX Uogonek Aacute -50 -KPX Uogonek Abreve -50 -KPX Uogonek Acircumflex -50 -KPX Uogonek Adieresis -50 -KPX Uogonek Agrave -50 -KPX Uogonek Amacron -50 -KPX Uogonek Aogonek -50 -KPX Uogonek Aring -50 -KPX Uogonek Atilde -50 -KPX Uogonek comma -30 -KPX Uogonek period -30 -KPX Uring A -50 -KPX Uring Aacute -50 -KPX Uring Abreve -50 -KPX Uring Acircumflex -50 -KPX Uring Adieresis -50 -KPX Uring Agrave -50 -KPX Uring Amacron -50 -KPX Uring Aogonek -50 -KPX Uring Aring -50 -KPX Uring Atilde -50 -KPX Uring comma -30 -KPX Uring period -30 -KPX V A -80 -KPX V Aacute -80 -KPX V Abreve -80 -KPX V Acircumflex -80 -KPX V Adieresis -80 -KPX V Agrave -80 -KPX V Amacron -80 -KPX V Aogonek -80 -KPX V Aring -80 -KPX V Atilde -80 -KPX V G -50 -KPX V Gbreve -50 -KPX V Gcommaaccent -50 -KPX V O -50 -KPX V Oacute -50 -KPX V Ocircumflex -50 -KPX V Odieresis -50 -KPX V Ograve -50 -KPX V Ohungarumlaut -50 -KPX V Omacron -50 -KPX V Oslash -50 -KPX V Otilde -50 -KPX V a -60 -KPX V aacute -60 -KPX V abreve -60 -KPX V acircumflex -60 -KPX V adieresis -60 -KPX V agrave -60 -KPX V amacron -60 -KPX V aogonek -60 -KPX V aring -60 -KPX V atilde -60 -KPX V colon -40 -KPX V comma -120 -KPX V e -50 -KPX V eacute -50 -KPX V ecaron -50 -KPX V ecircumflex -50 -KPX V edieresis -50 -KPX V edotaccent -50 -KPX V egrave -50 -KPX V emacron -50 -KPX V eogonek -50 -KPX V hyphen -80 -KPX V o -90 -KPX V oacute -90 -KPX V ocircumflex -90 -KPX V odieresis -90 -KPX V ograve -90 -KPX V ohungarumlaut -90 -KPX V omacron -90 -KPX V oslash -90 -KPX V otilde -90 -KPX V period -120 -KPX V semicolon -40 -KPX V u -60 -KPX V uacute -60 -KPX V ucircumflex -60 -KPX V udieresis -60 -KPX V ugrave -60 -KPX V uhungarumlaut -60 -KPX V umacron -60 -KPX V uogonek -60 -KPX V uring -60 -KPX W A -60 -KPX W Aacute -60 -KPX W Abreve -60 -KPX W Acircumflex -60 -KPX W Adieresis -60 -KPX W Agrave -60 -KPX W Amacron -60 -KPX W Aogonek -60 -KPX W Aring -60 -KPX W Atilde -60 -KPX W O -20 -KPX W Oacute -20 -KPX W Ocircumflex -20 -KPX W Odieresis -20 -KPX W Ograve -20 -KPX W Ohungarumlaut -20 -KPX W Omacron -20 -KPX W Oslash -20 -KPX W Otilde -20 -KPX W a -40 -KPX W aacute -40 -KPX W abreve -40 -KPX W acircumflex -40 -KPX W adieresis -40 -KPX W agrave -40 -KPX W amacron -40 -KPX W aogonek -40 -KPX W aring -40 -KPX W atilde -40 -KPX W colon -10 -KPX W comma -80 -KPX W e -35 -KPX W eacute -35 -KPX W ecaron -35 -KPX W ecircumflex -35 -KPX W edieresis -35 -KPX W edotaccent -35 -KPX W egrave -35 -KPX W emacron -35 -KPX W eogonek -35 -KPX W hyphen -40 -KPX W o -60 -KPX W oacute -60 -KPX W ocircumflex -60 -KPX W odieresis -60 -KPX W ograve -60 -KPX W ohungarumlaut -60 -KPX W omacron -60 -KPX W oslash -60 -KPX W otilde -60 -KPX W period -80 -KPX W semicolon -10 -KPX W u -45 -KPX W uacute -45 -KPX W ucircumflex -45 -KPX W udieresis -45 -KPX W ugrave -45 -KPX W uhungarumlaut -45 -KPX W umacron -45 -KPX W uogonek -45 -KPX W uring -45 -KPX W y -20 -KPX W yacute -20 -KPX W ydieresis -20 -KPX Y A -110 -KPX Y Aacute -110 -KPX Y Abreve -110 -KPX Y Acircumflex -110 -KPX Y Adieresis -110 -KPX Y Agrave -110 -KPX Y Amacron -110 -KPX Y Aogonek -110 -KPX Y Aring -110 -KPX Y Atilde -110 -KPX Y O -70 -KPX Y Oacute -70 -KPX Y Ocircumflex -70 -KPX Y Odieresis -70 -KPX Y Ograve -70 -KPX Y Ohungarumlaut -70 -KPX Y Omacron -70 -KPX Y Oslash -70 -KPX Y Otilde -70 -KPX Y a -90 -KPX Y aacute -90 -KPX Y abreve -90 -KPX Y acircumflex -90 -KPX Y adieresis -90 -KPX Y agrave -90 -KPX Y amacron -90 -KPX Y aogonek -90 -KPX Y aring -90 -KPX Y atilde -90 -KPX Y colon -50 -KPX Y comma -100 -KPX Y e -80 -KPX Y eacute -80 -KPX Y ecaron -80 -KPX Y ecircumflex -80 -KPX Y edieresis -80 -KPX Y edotaccent -80 -KPX Y egrave -80 -KPX Y emacron -80 -KPX Y eogonek -80 -KPX Y o -100 -KPX Y oacute -100 -KPX Y ocircumflex -100 -KPX Y odieresis -100 -KPX Y ograve -100 -KPX Y ohungarumlaut -100 -KPX Y omacron -100 -KPX Y oslash -100 -KPX Y otilde -100 -KPX Y period -100 -KPX Y semicolon -50 -KPX Y u -100 -KPX Y uacute -100 -KPX Y ucircumflex -100 -KPX Y udieresis -100 -KPX Y ugrave -100 -KPX Y uhungarumlaut -100 -KPX Y umacron -100 -KPX Y uogonek -100 -KPX Y uring -100 -KPX Yacute A -110 -KPX Yacute Aacute -110 -KPX Yacute Abreve -110 -KPX Yacute Acircumflex -110 -KPX Yacute Adieresis -110 -KPX Yacute Agrave -110 -KPX Yacute Amacron -110 -KPX Yacute Aogonek -110 -KPX Yacute Aring -110 -KPX Yacute Atilde -110 -KPX Yacute O -70 -KPX Yacute Oacute -70 -KPX Yacute Ocircumflex -70 -KPX Yacute Odieresis -70 -KPX Yacute Ograve -70 -KPX Yacute Ohungarumlaut -70 -KPX Yacute Omacron -70 -KPX Yacute Oslash -70 -KPX Yacute Otilde -70 -KPX Yacute a -90 -KPX Yacute aacute -90 -KPX Yacute abreve -90 -KPX Yacute acircumflex -90 -KPX Yacute adieresis -90 -KPX Yacute agrave -90 -KPX Yacute amacron -90 -KPX Yacute aogonek -90 -KPX Yacute aring -90 -KPX Yacute atilde -90 -KPX Yacute colon -50 -KPX Yacute comma -100 -KPX Yacute e -80 -KPX Yacute eacute -80 -KPX Yacute ecaron -80 -KPX Yacute ecircumflex -80 -KPX Yacute edieresis -80 -KPX Yacute edotaccent -80 -KPX Yacute egrave -80 -KPX Yacute emacron -80 -KPX Yacute eogonek -80 -KPX Yacute o -100 -KPX Yacute oacute -100 -KPX Yacute ocircumflex -100 -KPX Yacute odieresis -100 -KPX Yacute ograve -100 -KPX Yacute ohungarumlaut -100 -KPX Yacute omacron -100 -KPX Yacute oslash -100 -KPX Yacute otilde -100 -KPX Yacute period -100 -KPX Yacute semicolon -50 -KPX Yacute u -100 -KPX Yacute uacute -100 -KPX Yacute ucircumflex -100 -KPX Yacute udieresis -100 -KPX Yacute ugrave -100 -KPX Yacute uhungarumlaut -100 -KPX Yacute umacron -100 -KPX Yacute uogonek -100 -KPX Yacute uring -100 -KPX Ydieresis A -110 -KPX Ydieresis Aacute -110 -KPX Ydieresis Abreve -110 -KPX Ydieresis Acircumflex -110 -KPX Ydieresis Adieresis -110 -KPX Ydieresis Agrave -110 -KPX Ydieresis Amacron -110 -KPX Ydieresis Aogonek -110 -KPX Ydieresis Aring -110 -KPX Ydieresis Atilde -110 -KPX Ydieresis O -70 -KPX Ydieresis Oacute -70 -KPX Ydieresis Ocircumflex -70 -KPX Ydieresis Odieresis -70 -KPX Ydieresis Ograve -70 -KPX Ydieresis Ohungarumlaut -70 -KPX Ydieresis Omacron -70 -KPX Ydieresis Oslash -70 -KPX Ydieresis Otilde -70 -KPX Ydieresis a -90 -KPX Ydieresis aacute -90 -KPX Ydieresis abreve -90 -KPX Ydieresis acircumflex -90 -KPX Ydieresis adieresis -90 -KPX Ydieresis agrave -90 -KPX Ydieresis amacron -90 -KPX Ydieresis aogonek -90 -KPX Ydieresis aring -90 -KPX Ydieresis atilde -90 -KPX Ydieresis colon -50 -KPX Ydieresis comma -100 -KPX Ydieresis e -80 -KPX Ydieresis eacute -80 -KPX Ydieresis ecaron -80 -KPX Ydieresis ecircumflex -80 -KPX Ydieresis edieresis -80 -KPX Ydieresis edotaccent -80 -KPX Ydieresis egrave -80 -KPX Ydieresis emacron -80 -KPX Ydieresis eogonek -80 -KPX Ydieresis o -100 -KPX Ydieresis oacute -100 -KPX Ydieresis ocircumflex -100 -KPX Ydieresis odieresis -100 -KPX Ydieresis ograve -100 -KPX Ydieresis ohungarumlaut -100 -KPX Ydieresis omacron -100 -KPX Ydieresis oslash -100 -KPX Ydieresis otilde -100 -KPX Ydieresis period -100 -KPX Ydieresis semicolon -50 -KPX Ydieresis u -100 -KPX Ydieresis uacute -100 -KPX Ydieresis ucircumflex -100 -KPX Ydieresis udieresis -100 -KPX Ydieresis ugrave -100 -KPX Ydieresis uhungarumlaut -100 -KPX Ydieresis umacron -100 -KPX Ydieresis uogonek -100 -KPX Ydieresis uring -100 -KPX a g -10 -KPX a gbreve -10 -KPX a gcommaaccent -10 -KPX a v -15 -KPX a w -15 -KPX a y -20 -KPX a yacute -20 -KPX a ydieresis -20 -KPX aacute g -10 -KPX aacute gbreve -10 -KPX aacute gcommaaccent -10 -KPX aacute v -15 -KPX aacute w -15 -KPX aacute y -20 -KPX aacute yacute -20 -KPX aacute ydieresis -20 -KPX abreve g -10 -KPX abreve gbreve -10 -KPX abreve gcommaaccent -10 -KPX abreve v -15 -KPX abreve w -15 -KPX abreve y -20 -KPX abreve yacute -20 -KPX abreve ydieresis -20 -KPX acircumflex g -10 -KPX acircumflex gbreve -10 -KPX acircumflex gcommaaccent -10 -KPX acircumflex v -15 -KPX acircumflex w -15 -KPX acircumflex y -20 -KPX acircumflex yacute -20 -KPX acircumflex ydieresis -20 -KPX adieresis g -10 -KPX adieresis gbreve -10 -KPX adieresis gcommaaccent -10 -KPX adieresis v -15 -KPX adieresis w -15 -KPX adieresis y -20 -KPX adieresis yacute -20 -KPX adieresis ydieresis -20 -KPX agrave g -10 -KPX agrave gbreve -10 -KPX agrave gcommaaccent -10 -KPX agrave v -15 -KPX agrave w -15 -KPX agrave y -20 -KPX agrave yacute -20 -KPX agrave ydieresis -20 -KPX amacron g -10 -KPX amacron gbreve -10 -KPX amacron gcommaaccent -10 -KPX amacron v -15 -KPX amacron w -15 -KPX amacron y -20 -KPX amacron yacute -20 -KPX amacron ydieresis -20 -KPX aogonek g -10 -KPX aogonek gbreve -10 -KPX aogonek gcommaaccent -10 -KPX aogonek v -15 -KPX aogonek w -15 -KPX aogonek y -20 -KPX aogonek yacute -20 -KPX aogonek ydieresis -20 -KPX aring g -10 -KPX aring gbreve -10 -KPX aring gcommaaccent -10 -KPX aring v -15 -KPX aring w -15 -KPX aring y -20 -KPX aring yacute -20 -KPX aring ydieresis -20 -KPX atilde g -10 -KPX atilde gbreve -10 -KPX atilde gcommaaccent -10 -KPX atilde v -15 -KPX atilde w -15 -KPX atilde y -20 -KPX atilde yacute -20 -KPX atilde ydieresis -20 -KPX b l -10 -KPX b lacute -10 -KPX b lcommaaccent -10 -KPX b lslash -10 -KPX b u -20 -KPX b uacute -20 -KPX b ucircumflex -20 -KPX b udieresis -20 -KPX b ugrave -20 -KPX b uhungarumlaut -20 -KPX b umacron -20 -KPX b uogonek -20 -KPX b uring -20 -KPX b v -20 -KPX b y -20 -KPX b yacute -20 -KPX b ydieresis -20 -KPX c h -10 -KPX c k -20 -KPX c kcommaaccent -20 -KPX c l -20 -KPX c lacute -20 -KPX c lcommaaccent -20 -KPX c lslash -20 -KPX c y -10 -KPX c yacute -10 -KPX c ydieresis -10 -KPX cacute h -10 -KPX cacute k -20 -KPX cacute kcommaaccent -20 -KPX cacute l -20 -KPX cacute lacute -20 -KPX cacute lcommaaccent -20 -KPX cacute lslash -20 -KPX cacute y -10 -KPX cacute yacute -10 -KPX cacute ydieresis -10 -KPX ccaron h -10 -KPX ccaron k -20 -KPX ccaron kcommaaccent -20 -KPX ccaron l -20 -KPX ccaron lacute -20 -KPX ccaron lcommaaccent -20 -KPX ccaron lslash -20 -KPX ccaron y -10 -KPX ccaron yacute -10 -KPX ccaron ydieresis -10 -KPX ccedilla h -10 -KPX ccedilla k -20 -KPX ccedilla kcommaaccent -20 -KPX ccedilla l -20 -KPX ccedilla lacute -20 -KPX ccedilla lcommaaccent -20 -KPX ccedilla lslash -20 -KPX ccedilla y -10 -KPX ccedilla yacute -10 -KPX ccedilla ydieresis -10 -KPX colon space -40 -KPX comma quotedblright -120 -KPX comma quoteright -120 -KPX comma space -40 -KPX d d -10 -KPX d dcroat -10 -KPX d v -15 -KPX d w -15 -KPX d y -15 -KPX d yacute -15 -KPX d ydieresis -15 -KPX dcroat d -10 -KPX dcroat dcroat -10 -KPX dcroat v -15 -KPX dcroat w -15 -KPX dcroat y -15 -KPX dcroat yacute -15 -KPX dcroat ydieresis -15 -KPX e comma 10 -KPX e period 20 -KPX e v -15 -KPX e w -15 -KPX e x -15 -KPX e y -15 -KPX e yacute -15 -KPX e ydieresis -15 -KPX eacute comma 10 -KPX eacute period 20 -KPX eacute v -15 -KPX eacute w -15 -KPX eacute x -15 -KPX eacute y -15 -KPX eacute yacute -15 -KPX eacute ydieresis -15 -KPX ecaron comma 10 -KPX ecaron period 20 -KPX ecaron v -15 -KPX ecaron w -15 -KPX ecaron x -15 -KPX ecaron y -15 -KPX ecaron yacute -15 -KPX ecaron ydieresis -15 -KPX ecircumflex comma 10 -KPX ecircumflex period 20 -KPX ecircumflex v -15 -KPX ecircumflex w -15 -KPX ecircumflex x -15 -KPX ecircumflex y -15 -KPX ecircumflex yacute -15 -KPX ecircumflex ydieresis -15 -KPX edieresis comma 10 -KPX edieresis period 20 -KPX edieresis v -15 -KPX edieresis w -15 -KPX edieresis x -15 -KPX edieresis y -15 -KPX edieresis yacute -15 -KPX edieresis ydieresis -15 -KPX edotaccent comma 10 -KPX edotaccent period 20 -KPX edotaccent v -15 -KPX edotaccent w -15 -KPX edotaccent x -15 -KPX edotaccent y -15 -KPX edotaccent yacute -15 -KPX edotaccent ydieresis -15 -KPX egrave comma 10 -KPX egrave period 20 -KPX egrave v -15 -KPX egrave w -15 -KPX egrave x -15 -KPX egrave y -15 -KPX egrave yacute -15 -KPX egrave ydieresis -15 -KPX emacron comma 10 -KPX emacron period 20 -KPX emacron v -15 -KPX emacron w -15 -KPX emacron x -15 -KPX emacron y -15 -KPX emacron yacute -15 -KPX emacron ydieresis -15 -KPX eogonek comma 10 -KPX eogonek period 20 -KPX eogonek v -15 -KPX eogonek w -15 -KPX eogonek x -15 -KPX eogonek y -15 -KPX eogonek yacute -15 -KPX eogonek ydieresis -15 -KPX f comma -10 -KPX f e -10 -KPX f eacute -10 -KPX f ecaron -10 -KPX f ecircumflex -10 -KPX f edieresis -10 -KPX f edotaccent -10 -KPX f egrave -10 -KPX f emacron -10 -KPX f eogonek -10 -KPX f o -20 -KPX f oacute -20 -KPX f ocircumflex -20 -KPX f odieresis -20 -KPX f ograve -20 -KPX f ohungarumlaut -20 -KPX f omacron -20 -KPX f oslash -20 -KPX f otilde -20 -KPX f period -10 -KPX f quotedblright 30 -KPX f quoteright 30 -KPX g e 10 -KPX g eacute 10 -KPX g ecaron 10 -KPX g ecircumflex 10 -KPX g edieresis 10 -KPX g edotaccent 10 -KPX g egrave 10 -KPX g emacron 10 -KPX g eogonek 10 -KPX g g -10 -KPX g gbreve -10 -KPX g gcommaaccent -10 -KPX gbreve e 10 -KPX gbreve eacute 10 -KPX gbreve ecaron 10 -KPX gbreve ecircumflex 10 -KPX gbreve edieresis 10 -KPX gbreve edotaccent 10 -KPX gbreve egrave 10 -KPX gbreve emacron 10 -KPX gbreve eogonek 10 -KPX gbreve g -10 -KPX gbreve gbreve -10 -KPX gbreve gcommaaccent -10 -KPX gcommaaccent e 10 -KPX gcommaaccent eacute 10 -KPX gcommaaccent ecaron 10 -KPX gcommaaccent ecircumflex 10 -KPX gcommaaccent edieresis 10 -KPX gcommaaccent edotaccent 10 -KPX gcommaaccent egrave 10 -KPX gcommaaccent emacron 10 -KPX gcommaaccent eogonek 10 -KPX gcommaaccent g -10 -KPX gcommaaccent gbreve -10 -KPX gcommaaccent gcommaaccent -10 -KPX h y -20 -KPX h yacute -20 -KPX h ydieresis -20 -KPX k o -15 -KPX k oacute -15 -KPX k ocircumflex -15 -KPX k odieresis -15 -KPX k ograve -15 -KPX k ohungarumlaut -15 -KPX k omacron -15 -KPX k oslash -15 -KPX k otilde -15 -KPX kcommaaccent o -15 -KPX kcommaaccent oacute -15 -KPX kcommaaccent ocircumflex -15 -KPX kcommaaccent odieresis -15 -KPX kcommaaccent ograve -15 -KPX kcommaaccent ohungarumlaut -15 -KPX kcommaaccent omacron -15 -KPX kcommaaccent oslash -15 -KPX kcommaaccent otilde -15 -KPX l w -15 -KPX l y -15 -KPX l yacute -15 -KPX l ydieresis -15 -KPX lacute w -15 -KPX lacute y -15 -KPX lacute yacute -15 -KPX lacute ydieresis -15 -KPX lcommaaccent w -15 -KPX lcommaaccent y -15 -KPX lcommaaccent yacute -15 -KPX lcommaaccent ydieresis -15 -KPX lslash w -15 -KPX lslash y -15 -KPX lslash yacute -15 -KPX lslash ydieresis -15 -KPX m u -20 -KPX m uacute -20 -KPX m ucircumflex -20 -KPX m udieresis -20 -KPX m ugrave -20 -KPX m uhungarumlaut -20 -KPX m umacron -20 -KPX m uogonek -20 -KPX m uring -20 -KPX m y -30 -KPX m yacute -30 -KPX m ydieresis -30 -KPX n u -10 -KPX n uacute -10 -KPX n ucircumflex -10 -KPX n udieresis -10 -KPX n ugrave -10 -KPX n uhungarumlaut -10 -KPX n umacron -10 -KPX n uogonek -10 -KPX n uring -10 -KPX n v -40 -KPX n y -20 -KPX n yacute -20 -KPX n ydieresis -20 -KPX nacute u -10 -KPX nacute uacute -10 -KPX nacute ucircumflex -10 -KPX nacute udieresis -10 -KPX nacute ugrave -10 -KPX nacute uhungarumlaut -10 -KPX nacute umacron -10 -KPX nacute uogonek -10 -KPX nacute uring -10 -KPX nacute v -40 -KPX nacute y -20 -KPX nacute yacute -20 -KPX nacute ydieresis -20 -KPX ncaron u -10 -KPX ncaron uacute -10 -KPX ncaron ucircumflex -10 -KPX ncaron udieresis -10 -KPX ncaron ugrave -10 -KPX ncaron uhungarumlaut -10 -KPX ncaron umacron -10 -KPX ncaron uogonek -10 -KPX ncaron uring -10 -KPX ncaron v -40 -KPX ncaron y -20 -KPX ncaron yacute -20 -KPX ncaron ydieresis -20 -KPX ncommaaccent u -10 -KPX ncommaaccent uacute -10 -KPX ncommaaccent ucircumflex -10 -KPX ncommaaccent udieresis -10 -KPX ncommaaccent ugrave -10 -KPX ncommaaccent uhungarumlaut -10 -KPX ncommaaccent umacron -10 -KPX ncommaaccent uogonek -10 -KPX ncommaaccent uring -10 -KPX ncommaaccent v -40 -KPX ncommaaccent y -20 -KPX ncommaaccent yacute -20 -KPX ncommaaccent ydieresis -20 -KPX ntilde u -10 -KPX ntilde uacute -10 -KPX ntilde ucircumflex -10 -KPX ntilde udieresis -10 -KPX ntilde ugrave -10 -KPX ntilde uhungarumlaut -10 -KPX ntilde umacron -10 -KPX ntilde uogonek -10 -KPX ntilde uring -10 -KPX ntilde v -40 -KPX ntilde y -20 -KPX ntilde yacute -20 -KPX ntilde ydieresis -20 -KPX o v -20 -KPX o w -15 -KPX o x -30 -KPX o y -20 -KPX o yacute -20 -KPX o ydieresis -20 -KPX oacute v -20 -KPX oacute w -15 -KPX oacute x -30 -KPX oacute y -20 -KPX oacute yacute -20 -KPX oacute ydieresis -20 -KPX ocircumflex v -20 -KPX ocircumflex w -15 -KPX ocircumflex x -30 -KPX ocircumflex y -20 -KPX ocircumflex yacute -20 -KPX ocircumflex ydieresis -20 -KPX odieresis v -20 -KPX odieresis w -15 -KPX odieresis x -30 -KPX odieresis y -20 -KPX odieresis yacute -20 -KPX odieresis ydieresis -20 -KPX ograve v -20 -KPX ograve w -15 -KPX ograve x -30 -KPX ograve y -20 -KPX ograve yacute -20 -KPX ograve ydieresis -20 -KPX ohungarumlaut v -20 -KPX ohungarumlaut w -15 -KPX ohungarumlaut x -30 -KPX ohungarumlaut y -20 -KPX ohungarumlaut yacute -20 -KPX ohungarumlaut ydieresis -20 -KPX omacron v -20 -KPX omacron w -15 -KPX omacron x -30 -KPX omacron y -20 -KPX omacron yacute -20 -KPX omacron ydieresis -20 -KPX oslash v -20 -KPX oslash w -15 -KPX oslash x -30 -KPX oslash y -20 -KPX oslash yacute -20 -KPX oslash ydieresis -20 -KPX otilde v -20 -KPX otilde w -15 -KPX otilde x -30 -KPX otilde y -20 -KPX otilde yacute -20 -KPX otilde ydieresis -20 -KPX p y -15 -KPX p yacute -15 -KPX p ydieresis -15 -KPX period quotedblright -120 -KPX period quoteright -120 -KPX period space -40 -KPX quotedblright space -80 -KPX quoteleft quoteleft -46 -KPX quoteright d -80 -KPX quoteright dcroat -80 -KPX quoteright l -20 -KPX quoteright lacute -20 -KPX quoteright lcommaaccent -20 -KPX quoteright lslash -20 -KPX quoteright quoteright -46 -KPX quoteright r -40 -KPX quoteright racute -40 -KPX quoteright rcaron -40 -KPX quoteright rcommaaccent -40 -KPX quoteright s -60 -KPX quoteright sacute -60 -KPX quoteright scaron -60 -KPX quoteright scedilla -60 -KPX quoteright scommaaccent -60 -KPX quoteright space -80 -KPX quoteright v -20 -KPX r c -20 -KPX r cacute -20 -KPX r ccaron -20 -KPX r ccedilla -20 -KPX r comma -60 -KPX r d -20 -KPX r dcroat -20 -KPX r g -15 -KPX r gbreve -15 -KPX r gcommaaccent -15 -KPX r hyphen -20 -KPX r o -20 -KPX r oacute -20 -KPX r ocircumflex -20 -KPX r odieresis -20 -KPX r ograve -20 -KPX r ohungarumlaut -20 -KPX r omacron -20 -KPX r oslash -20 -KPX r otilde -20 -KPX r period -60 -KPX r q -20 -KPX r s -15 -KPX r sacute -15 -KPX r scaron -15 -KPX r scedilla -15 -KPX r scommaaccent -15 -KPX r t 20 -KPX r tcommaaccent 20 -KPX r v 10 -KPX r y 10 -KPX r yacute 10 -KPX r ydieresis 10 -KPX racute c -20 -KPX racute cacute -20 -KPX racute ccaron -20 -KPX racute ccedilla -20 -KPX racute comma -60 -KPX racute d -20 -KPX racute dcroat -20 -KPX racute g -15 -KPX racute gbreve -15 -KPX racute gcommaaccent -15 -KPX racute hyphen -20 -KPX racute o -20 -KPX racute oacute -20 -KPX racute ocircumflex -20 -KPX racute odieresis -20 -KPX racute ograve -20 -KPX racute ohungarumlaut -20 -KPX racute omacron -20 -KPX racute oslash -20 -KPX racute otilde -20 -KPX racute period -60 -KPX racute q -20 -KPX racute s -15 -KPX racute sacute -15 -KPX racute scaron -15 -KPX racute scedilla -15 -KPX racute scommaaccent -15 -KPX racute t 20 -KPX racute tcommaaccent 20 -KPX racute v 10 -KPX racute y 10 -KPX racute yacute 10 -KPX racute ydieresis 10 -KPX rcaron c -20 -KPX rcaron cacute -20 -KPX rcaron ccaron -20 -KPX rcaron ccedilla -20 -KPX rcaron comma -60 -KPX rcaron d -20 -KPX rcaron dcroat -20 -KPX rcaron g -15 -KPX rcaron gbreve -15 -KPX rcaron gcommaaccent -15 -KPX rcaron hyphen -20 -KPX rcaron o -20 -KPX rcaron oacute -20 -KPX rcaron ocircumflex -20 -KPX rcaron odieresis -20 -KPX rcaron ograve -20 -KPX rcaron ohungarumlaut -20 -KPX rcaron omacron -20 -KPX rcaron oslash -20 -KPX rcaron otilde -20 -KPX rcaron period -60 -KPX rcaron q -20 -KPX rcaron s -15 -KPX rcaron sacute -15 -KPX rcaron scaron -15 -KPX rcaron scedilla -15 -KPX rcaron scommaaccent -15 -KPX rcaron t 20 -KPX rcaron tcommaaccent 20 -KPX rcaron v 10 -KPX rcaron y 10 -KPX rcaron yacute 10 -KPX rcaron ydieresis 10 -KPX rcommaaccent c -20 -KPX rcommaaccent cacute -20 -KPX rcommaaccent ccaron -20 -KPX rcommaaccent ccedilla -20 -KPX rcommaaccent comma -60 -KPX rcommaaccent d -20 -KPX rcommaaccent dcroat -20 -KPX rcommaaccent g -15 -KPX rcommaaccent gbreve -15 -KPX rcommaaccent gcommaaccent -15 -KPX rcommaaccent hyphen -20 -KPX rcommaaccent o -20 -KPX rcommaaccent oacute -20 -KPX rcommaaccent ocircumflex -20 -KPX rcommaaccent odieresis -20 -KPX rcommaaccent ograve -20 -KPX rcommaaccent ohungarumlaut -20 -KPX rcommaaccent omacron -20 -KPX rcommaaccent oslash -20 -KPX rcommaaccent otilde -20 -KPX rcommaaccent period -60 -KPX rcommaaccent q -20 -KPX rcommaaccent s -15 -KPX rcommaaccent sacute -15 -KPX rcommaaccent scaron -15 -KPX rcommaaccent scedilla -15 -KPX rcommaaccent scommaaccent -15 -KPX rcommaaccent t 20 -KPX rcommaaccent tcommaaccent 20 -KPX rcommaaccent v 10 -KPX rcommaaccent y 10 -KPX rcommaaccent yacute 10 -KPX rcommaaccent ydieresis 10 -KPX s w -15 -KPX sacute w -15 -KPX scaron w -15 -KPX scedilla w -15 -KPX scommaaccent w -15 -KPX semicolon space -40 -KPX space T -100 -KPX space Tcaron -100 -KPX space Tcommaaccent -100 -KPX space V -80 -KPX space W -80 -KPX space Y -120 -KPX space Yacute -120 -KPX space Ydieresis -120 -KPX space quotedblleft -80 -KPX space quoteleft -60 -KPX v a -20 -KPX v aacute -20 -KPX v abreve -20 -KPX v acircumflex -20 -KPX v adieresis -20 -KPX v agrave -20 -KPX v amacron -20 -KPX v aogonek -20 -KPX v aring -20 -KPX v atilde -20 -KPX v comma -80 -KPX v o -30 -KPX v oacute -30 -KPX v ocircumflex -30 -KPX v odieresis -30 -KPX v ograve -30 -KPX v ohungarumlaut -30 -KPX v omacron -30 -KPX v oslash -30 -KPX v otilde -30 -KPX v period -80 -KPX w comma -40 -KPX w o -20 -KPX w oacute -20 -KPX w ocircumflex -20 -KPX w odieresis -20 -KPX w ograve -20 -KPX w ohungarumlaut -20 -KPX w omacron -20 -KPX w oslash -20 -KPX w otilde -20 -KPX w period -40 -KPX x e -10 -KPX x eacute -10 -KPX x ecaron -10 -KPX x ecircumflex -10 -KPX x edieresis -10 -KPX x edotaccent -10 -KPX x egrave -10 -KPX x emacron -10 -KPX x eogonek -10 -KPX y a -30 -KPX y aacute -30 -KPX y abreve -30 -KPX y acircumflex -30 -KPX y adieresis -30 -KPX y agrave -30 -KPX y amacron -30 -KPX y aogonek -30 -KPX y aring -30 -KPX y atilde -30 -KPX y comma -80 -KPX y e -10 -KPX y eacute -10 -KPX y ecaron -10 -KPX y ecircumflex -10 -KPX y edieresis -10 -KPX y edotaccent -10 -KPX y egrave -10 -KPX y emacron -10 -KPX y eogonek -10 -KPX y o -25 -KPX y oacute -25 -KPX y ocircumflex -25 -KPX y odieresis -25 -KPX y ograve -25 -KPX y ohungarumlaut -25 -KPX y omacron -25 -KPX y oslash -25 -KPX y otilde -25 -KPX y period -80 -KPX yacute a -30 -KPX yacute aacute -30 -KPX yacute abreve -30 -KPX yacute acircumflex -30 -KPX yacute adieresis -30 -KPX yacute agrave -30 -KPX yacute amacron -30 -KPX yacute aogonek -30 -KPX yacute aring -30 -KPX yacute atilde -30 -KPX yacute comma -80 -KPX yacute e -10 -KPX yacute eacute -10 -KPX yacute ecaron -10 -KPX yacute ecircumflex -10 -KPX yacute edieresis -10 -KPX yacute edotaccent -10 -KPX yacute egrave -10 -KPX yacute emacron -10 -KPX yacute eogonek -10 -KPX yacute o -25 -KPX yacute oacute -25 -KPX yacute ocircumflex -25 -KPX yacute odieresis -25 -KPX yacute ograve -25 -KPX yacute ohungarumlaut -25 -KPX yacute omacron -25 -KPX yacute oslash -25 -KPX yacute otilde -25 -KPX yacute period -80 -KPX ydieresis a -30 -KPX ydieresis aacute -30 -KPX ydieresis abreve -30 -KPX ydieresis acircumflex -30 -KPX ydieresis adieresis -30 -KPX ydieresis agrave -30 -KPX ydieresis amacron -30 -KPX ydieresis aogonek -30 -KPX ydieresis aring -30 -KPX ydieresis atilde -30 -KPX ydieresis comma -80 -KPX ydieresis e -10 -KPX ydieresis eacute -10 -KPX ydieresis ecaron -10 -KPX ydieresis ecircumflex -10 -KPX ydieresis edieresis -10 -KPX ydieresis edotaccent -10 -KPX ydieresis egrave -10 -KPX ydieresis emacron -10 -KPX ydieresis eogonek -10 -KPX ydieresis o -25 -KPX ydieresis oacute -25 -KPX ydieresis ocircumflex -25 -KPX ydieresis odieresis -25 -KPX ydieresis ograve -25 -KPX ydieresis ohungarumlaut -25 -KPX ydieresis omacron -25 -KPX ydieresis oslash -25 -KPX ydieresis otilde -25 -KPX ydieresis period -80 -KPX z e 10 -KPX z eacute 10 -KPX z ecaron 10 -KPX z ecircumflex 10 -KPX z edieresis 10 -KPX z edotaccent 10 -KPX z egrave 10 -KPX z emacron 10 -KPX z eogonek 10 -KPX zacute e 10 -KPX zacute eacute 10 -KPX zacute ecaron 10 -KPX zacute ecircumflex 10 -KPX zacute edieresis 10 -KPX zacute edotaccent 10 -KPX zacute egrave 10 -KPX zacute emacron 10 -KPX zacute eogonek 10 -KPX zcaron e 10 -KPX zcaron eacute 10 -KPX zcaron ecaron 10 -KPX zcaron ecircumflex 10 -KPX zcaron edieresis 10 -KPX zcaron edotaccent 10 -KPX zcaron egrave 10 -KPX zcaron emacron 10 -KPX zcaron eogonek 10 -KPX zdotaccent e 10 -KPX zdotaccent eacute 10 -KPX zdotaccent ecaron 10 -KPX zdotaccent ecircumflex 10 -KPX zdotaccent edieresis 10 -KPX zdotaccent edotaccent 10 -KPX zdotaccent egrave 10 -KPX zdotaccent emacron 10 -KPX zdotaccent eogonek 10 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Helvetica-Bold.afm.php b/vendor/dompdf/dompdf/lib/fonts/Helvetica-Bold.afm.php deleted file mode 100644 index 6ebf902..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Helvetica-Bold.afm.php +++ /dev/null @@ -1,572 +0,0 @@ - - array ( - 32 => 'space', - 160 => 'space', - 33 => 'exclam', - 34 => 'quotedbl', - 35 => 'numbersign', - 36 => 'dollar', - 37 => 'percent', - 38 => 'ampersand', - 146 => 'quoteright', - 40 => 'parenleft', - 41 => 'parenright', - 42 => 'asterisk', - 43 => 'plus', - 44 => 'comma', - 45 => 'hyphen', - 173 => 'hyphen', - 46 => 'period', - 47 => 'slash', - 48 => 'zero', - 49 => 'one', - 50 => 'two', - 51 => 'three', - 52 => 'four', - 53 => 'five', - 54 => 'six', - 55 => 'seven', - 56 => 'eight', - 57 => 'nine', - 58 => 'colon', - 59 => 'semicolon', - 60 => 'less', - 61 => 'equal', - 62 => 'greater', - 63 => 'question', - 64 => 'at', - 65 => 'A', - 66 => 'B', - 67 => 'C', - 68 => 'D', - 69 => 'E', - 70 => 'F', - 71 => 'G', - 72 => 'H', - 73 => 'I', - 74 => 'J', - 75 => 'K', - 76 => 'L', - 77 => 'M', - 78 => 'N', - 79 => 'O', - 80 => 'P', - 81 => 'Q', - 82 => 'R', - 83 => 'S', - 84 => 'T', - 85 => 'U', - 86 => 'V', - 87 => 'W', - 88 => 'X', - 89 => 'Y', - 90 => 'Z', - 91 => 'bracketleft', - 92 => 'backslash', - 93 => 'bracketright', - 94 => 'asciicircum', - 95 => 'underscore', - 145 => 'quoteleft', - 97 => 'a', - 98 => 'b', - 99 => 'c', - 100 => 'd', - 101 => 'e', - 102 => 'f', - 103 => 'g', - 104 => 'h', - 105 => 'i', - 106 => 'j', - 107 => 'k', - 108 => 'l', - 109 => 'm', - 110 => 'n', - 111 => 'o', - 112 => 'p', - 113 => 'q', - 114 => 'r', - 115 => 's', - 116 => 't', - 117 => 'u', - 118 => 'v', - 119 => 'w', - 120 => 'x', - 121 => 'y', - 122 => 'z', - 123 => 'braceleft', - 124 => 'bar', - 125 => 'braceright', - 126 => 'asciitilde', - 161 => 'exclamdown', - 162 => 'cent', - 163 => 'sterling', - 165 => 'yen', - 131 => 'florin', - 167 => 'section', - 164 => 'currency', - 39 => 'quotesingle', - 147 => 'quotedblleft', - 171 => 'guillemotleft', - 139 => 'guilsinglleft', - 155 => 'guilsinglright', - 150 => 'endash', - 134 => 'dagger', - 135 => 'daggerdbl', - 183 => 'periodcentered', - 182 => 'paragraph', - 149 => 'bullet', - 130 => 'quotesinglbase', - 132 => 'quotedblbase', - 148 => 'quotedblright', - 187 => 'guillemotright', - 133 => 'ellipsis', - 137 => 'perthousand', - 191 => 'questiondown', - 96 => 'grave', - 180 => 'acute', - 136 => 'circumflex', - 152 => 'tilde', - 175 => 'macron', - 168 => 'dieresis', - 184 => 'cedilla', - 151 => 'emdash', - 198 => 'AE', - 170 => 'ordfeminine', - 216 => 'Oslash', - 140 => 'OE', - 186 => 'ordmasculine', - 230 => 'ae', - 248 => 'oslash', - 156 => 'oe', - 223 => 'germandbls', - 207 => 'Idieresis', - 233 => 'eacute', - 159 => 'Ydieresis', - 247 => 'divide', - 221 => 'Yacute', - 194 => 'Acircumflex', - 225 => 'aacute', - 219 => 'Ucircumflex', - 253 => 'yacute', - 234 => 'ecircumflex', - 220 => 'Udieresis', - 218 => 'Uacute', - 203 => 'Edieresis', - 169 => 'copyright', - 229 => 'aring', - 224 => 'agrave', - 227 => 'atilde', - 154 => 'scaron', - 237 => 'iacute', - 251 => 'ucircumflex', - 226 => 'acircumflex', - 231 => 'ccedilla', - 222 => 'Thorn', - 179 => 'threesuperior', - 210 => 'Ograve', - 192 => 'Agrave', - 215 => 'multiply', - 250 => 'uacute', - 255 => 'ydieresis', - 238 => 'icircumflex', - 202 => 'Ecircumflex', - 228 => 'adieresis', - 235 => 'edieresis', - 205 => 'Iacute', - 177 => 'plusminus', - 166 => 'brokenbar', - 174 => 'registered', - 200 => 'Egrave', - 142 => 'Zcaron', - 208 => 'Eth', - 199 => 'Ccedilla', - 193 => 'Aacute', - 196 => 'Adieresis', - 232 => 'egrave', - 211 => 'Oacute', - 243 => 'oacute', - 239 => 'idieresis', - 212 => 'Ocircumflex', - 217 => 'Ugrave', - 254 => 'thorn', - 178 => 'twosuperior', - 214 => 'Odieresis', - 181 => 'mu', - 236 => 'igrave', - 190 => 'threequarters', - 153 => 'trademark', - 204 => 'Igrave', - 189 => 'onehalf', - 244 => 'ocircumflex', - 241 => 'ntilde', - 201 => 'Eacute', - 188 => 'onequarter', - 138 => 'Scaron', - 176 => 'degree', - 242 => 'ograve', - 249 => 'ugrave', - 209 => 'Ntilde', - 245 => 'otilde', - 195 => 'Atilde', - 197 => 'Aring', - 213 => 'Otilde', - 206 => 'Icircumflex', - 172 => 'logicalnot', - 246 => 'odieresis', - 252 => 'udieresis', - 240 => 'eth', - 158 => 'zcaron', - 185 => 'onesuperior', - 128 => 'Euro', - ), - 'isUnicode' => false, - 'FontName' => 'Helvetica-Bold', - 'FullName' => 'Helvetica Bold', - 'FamilyName' => 'Helvetica', - 'Weight' => 'Bold', - 'ItalicAngle' => '0', - 'IsFixedPitch' => 'false', - 'CharacterSet' => 'ExtendedRoman', - 'FontBBox' => - array ( - 0 => '-170', - 1 => '-228', - 2 => '1003', - 3 => '962', - ), - 'UnderlinePosition' => '-100', - 'UnderlineThickness' => '50', - 'Version' => '002.000', - 'EncodingScheme' => 'WinAnsiEncoding', - 'CapHeight' => '718', - 'XHeight' => '532', - 'Ascender' => '718', - 'Descender' => '-207', - 'StdHW' => '118', - 'StdVW' => '140', - 'StartCharMetrics' => '317', - 'C' => - array ( - 32 => 278.0, - 160 => 278.0, - 33 => 333.0, - 34 => 474.0, - 35 => 556.0, - 36 => 556.0, - 37 => 889.0, - 38 => 722.0, - 146 => 278.0, - 40 => 333.0, - 41 => 333.0, - 42 => 389.0, - 43 => 584.0, - 44 => 278.0, - 45 => 333.0, - 173 => 333.0, - 46 => 278.0, - 47 => 278.0, - 48 => 556.0, - 49 => 556.0, - 50 => 556.0, - 51 => 556.0, - 52 => 556.0, - 53 => 556.0, - 54 => 556.0, - 55 => 556.0, - 56 => 556.0, - 57 => 556.0, - 58 => 333.0, - 59 => 333.0, - 60 => 584.0, - 61 => 584.0, - 62 => 584.0, - 63 => 611.0, - 64 => 975.0, - 65 => 722.0, - 66 => 722.0, - 67 => 722.0, - 68 => 722.0, - 69 => 667.0, - 70 => 611.0, - 71 => 778.0, - 72 => 722.0, - 73 => 278.0, - 74 => 556.0, - 75 => 722.0, - 76 => 611.0, - 77 => 833.0, - 78 => 722.0, - 79 => 778.0, - 80 => 667.0, - 81 => 778.0, - 82 => 722.0, - 83 => 667.0, - 84 => 611.0, - 85 => 722.0, - 86 => 667.0, - 87 => 944.0, - 88 => 667.0, - 89 => 667.0, - 90 => 611.0, - 91 => 333.0, - 92 => 278.0, - 93 => 333.0, - 94 => 584.0, - 95 => 556.0, - 145 => 278.0, - 97 => 556.0, - 98 => 611.0, - 99 => 556.0, - 100 => 611.0, - 101 => 556.0, - 102 => 333.0, - 103 => 611.0, - 104 => 611.0, - 105 => 278.0, - 106 => 278.0, - 107 => 556.0, - 108 => 278.0, - 109 => 889.0, - 110 => 611.0, - 111 => 611.0, - 112 => 611.0, - 113 => 611.0, - 114 => 389.0, - 115 => 556.0, - 116 => 333.0, - 117 => 611.0, - 118 => 556.0, - 119 => 778.0, - 120 => 556.0, - 121 => 556.0, - 122 => 500.0, - 123 => 389.0, - 124 => 280.0, - 125 => 389.0, - 126 => 584.0, - 161 => 333.0, - 162 => 556.0, - 163 => 556.0, - 'fraction' => 167.0, - 165 => 556.0, - 131 => 556.0, - 167 => 556.0, - 164 => 556.0, - 39 => 238.0, - 147 => 500.0, - 171 => 556.0, - 139 => 333.0, - 155 => 333.0, - 'fi' => 611.0, - 'fl' => 611.0, - 150 => 556.0, - 134 => 556.0, - 135 => 556.0, - 183 => 278.0, - 182 => 556.0, - 149 => 350.0, - 130 => 278.0, - 132 => 500.0, - 148 => 500.0, - 187 => 556.0, - 133 => 1000.0, - 137 => 1000.0, - 191 => 611.0, - 96 => 333.0, - 180 => 333.0, - 136 => 333.0, - 152 => 333.0, - 175 => 333.0, - 'breve' => 333.0, - 'dotaccent' => 333.0, - 168 => 333.0, - 'ring' => 333.0, - 184 => 333.0, - 'hungarumlaut' => 333.0, - 'ogonek' => 333.0, - 'caron' => 333.0, - 151 => 1000.0, - 198 => 1000.0, - 170 => 370.0, - 'Lslash' => 611.0, - 216 => 778.0, - 140 => 1000.0, - 186 => 365.0, - 230 => 889.0, - 'dotlessi' => 278.0, - 'lslash' => 278.0, - 248 => 611.0, - 156 => 944.0, - 223 => 611.0, - 207 => 278.0, - 233 => 556.0, - 'abreve' => 556.0, - 'uhungarumlaut' => 611.0, - 'ecaron' => 556.0, - 159 => 667.0, - 247 => 584.0, - 221 => 667.0, - 194 => 722.0, - 225 => 556.0, - 219 => 722.0, - 253 => 556.0, - 'scommaaccent' => 556.0, - 234 => 556.0, - 'Uring' => 722.0, - 220 => 722.0, - 'aogonek' => 556.0, - 218 => 722.0, - 'uogonek' => 611.0, - 203 => 667.0, - 'Dcroat' => 722.0, - 'commaaccent' => 250.0, - 169 => 737.0, - 'Emacron' => 667.0, - 'ccaron' => 556.0, - 229 => 556.0, - 'Ncommaaccent' => 722.0, - 'lacute' => 278.0, - 224 => 556.0, - 'Tcommaaccent' => 611.0, - 'Cacute' => 722.0, - 227 => 556.0, - 'Edotaccent' => 667.0, - 154 => 556.0, - 'scedilla' => 556.0, - 237 => 278.0, - 'lozenge' => 494.0, - 'Rcaron' => 722.0, - 'Gcommaaccent' => 778.0, - 251 => 611.0, - 226 => 556.0, - 'Amacron' => 722.0, - 'rcaron' => 389.0, - 231 => 556.0, - 'Zdotaccent' => 611.0, - 222 => 667.0, - 'Omacron' => 778.0, - 'Racute' => 722.0, - 'Sacute' => 667.0, - 'dcaron' => 743.0, - 'Umacron' => 722.0, - 'uring' => 611.0, - 179 => 333.0, - 210 => 778.0, - 192 => 722.0, - 'Abreve' => 722.0, - 215 => 584.0, - 250 => 611.0, - 'Tcaron' => 611.0, - 'partialdiff' => 494.0, - 255 => 556.0, - 'Nacute' => 722.0, - 238 => 278.0, - 202 => 667.0, - 228 => 556.0, - 235 => 556.0, - 'cacute' => 556.0, - 'nacute' => 611.0, - 'umacron' => 611.0, - 'Ncaron' => 722.0, - 205 => 278.0, - 177 => 584.0, - 166 => 280.0, - 174 => 737.0, - 'Gbreve' => 778.0, - 'Idotaccent' => 278.0, - 'summation' => 600.0, - 200 => 667.0, - 'racute' => 389.0, - 'omacron' => 611.0, - 'Zacute' => 611.0, - 142 => 611.0, - 'greaterequal' => 549.0, - 208 => 722.0, - 199 => 722.0, - 'lcommaaccent' => 278.0, - 'tcaron' => 389.0, - 'eogonek' => 556.0, - 'Uogonek' => 722.0, - 193 => 722.0, - 196 => 722.0, - 232 => 556.0, - 'zacute' => 500.0, - 'iogonek' => 278.0, - 211 => 778.0, - 243 => 611.0, - 'amacron' => 556.0, - 'sacute' => 556.0, - 239 => 278.0, - 212 => 778.0, - 217 => 722.0, - 'Delta' => 612.0, - 254 => 611.0, - 178 => 333.0, - 214 => 778.0, - 181 => 611.0, - 236 => 278.0, - 'ohungarumlaut' => 611.0, - 'Eogonek' => 667.0, - 'dcroat' => 611.0, - 190 => 834.0, - 'Scedilla' => 667.0, - 'lcaron' => 400.0, - 'Kcommaaccent' => 722.0, - 'Lacute' => 611.0, - 153 => 1000.0, - 'edotaccent' => 556.0, - 204 => 278.0, - 'Imacron' => 278.0, - 'Lcaron' => 611.0, - 189 => 834.0, - 'lessequal' => 549.0, - 244 => 611.0, - 241 => 611.0, - 'Uhungarumlaut' => 722.0, - 201 => 667.0, - 'emacron' => 556.0, - 'gbreve' => 611.0, - 188 => 834.0, - 138 => 667.0, - 'Scommaaccent' => 667.0, - 'Ohungarumlaut' => 778.0, - 176 => 400.0, - 242 => 611.0, - 'Ccaron' => 722.0, - 249 => 611.0, - 'radical' => 549.0, - 'Dcaron' => 722.0, - 'rcommaaccent' => 389.0, - 209 => 722.0, - 245 => 611.0, - 'Rcommaaccent' => 722.0, - 'Lcommaaccent' => 611.0, - 195 => 722.0, - 'Aogonek' => 722.0, - 197 => 722.0, - 213 => 778.0, - 'zdotaccent' => 500.0, - 'Ecaron' => 667.0, - 'Iogonek' => 278.0, - 'kcommaaccent' => 556.0, - 'minus' => 584.0, - 206 => 278.0, - 'ncaron' => 611.0, - 'tcommaaccent' => 333.0, - 172 => 584.0, - 246 => 611.0, - 252 => 611.0, - 'notequal' => 549.0, - 'gcommaaccent' => 611.0, - 240 => 611.0, - 158 => 500.0, - 'ncommaaccent' => 611.0, - 185 => 333.0, - 'imacron' => 278.0, - 128 => 556.0, - ), - 'CIDtoGID_Compressed' => true, - 'CIDtoGID' => 'eJwDAAAAAAE=', - '_version_' => 6, -); \ No newline at end of file diff --git a/vendor/dompdf/dompdf/lib/fonts/Helvetica-BoldOblique.afm b/vendor/dompdf/dompdf/lib/fonts/Helvetica-BoldOblique.afm deleted file mode 100644 index 337f712..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Helvetica-BoldOblique.afm +++ /dev/null @@ -1,2829 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 1 12:45:12 1997 -Comment UniqueID 43053 -Comment VMusage 14482 68586 -FontName Helvetica-BoldOblique -FullName Helvetica Bold Oblique -FamilyName Helvetica -Weight Bold -ItalicAngle -12 -IsFixedPitch false -CharacterSet ExtendedRoman -FontBBox -174 -228 1114 962 -UnderlinePosition -100 -UnderlineThickness 50 -Version 002.000 -Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. -EncodingScheme WinAnsiEncoding -CapHeight 718 -XHeight 532 -Ascender 718 -Descender -207 -StdHW 118 -StdVW 140 -StartCharMetrics 317 -C 32 ; WX 278 ; N space ; B 0 0 0 0 ; -C 160 ; WX 278 ; N space ; B 0 0 0 0 ; -C 33 ; WX 333 ; N exclam ; B 94 0 397 718 ; -C 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ; -C 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ; -C 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ; -C 37 ; WX 889 ; N percent ; B 136 -19 901 710 ; -C 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ; -C 146 ; WX 278 ; N quoteright ; B 167 445 362 718 ; -C 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ; -C 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ; -C 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ; -C 43 ; WX 584 ; N plus ; B 82 0 610 506 ; -C 44 ; WX 278 ; N comma ; B 28 -168 245 146 ; -C 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ; -C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; -C 46 ; WX 278 ; N period ; B 64 0 245 146 ; -C 47 ; WX 278 ; N slash ; B -37 -19 468 737 ; -C 48 ; WX 556 ; N zero ; B 86 -19 617 710 ; -C 49 ; WX 556 ; N one ; B 173 0 529 710 ; -C 50 ; WX 556 ; N two ; B 26 0 619 710 ; -C 51 ; WX 556 ; N three ; B 65 -19 608 710 ; -C 52 ; WX 556 ; N four ; B 60 0 598 710 ; -C 53 ; WX 556 ; N five ; B 64 -19 636 698 ; -C 54 ; WX 556 ; N six ; B 85 -19 619 710 ; -C 55 ; WX 556 ; N seven ; B 125 0 676 698 ; -C 56 ; WX 556 ; N eight ; B 69 -19 616 710 ; -C 57 ; WX 556 ; N nine ; B 78 -19 615 710 ; -C 58 ; WX 333 ; N colon ; B 92 0 351 512 ; -C 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ; -C 60 ; WX 584 ; N less ; B 82 -8 655 514 ; -C 61 ; WX 584 ; N equal ; B 58 87 633 419 ; -C 62 ; WX 584 ; N greater ; B 36 -8 609 514 ; -C 63 ; WX 611 ; N question ; B 165 0 671 727 ; -C 64 ; WX 975 ; N at ; B 186 -19 954 737 ; -C 65 ; WX 722 ; N A ; B 20 0 702 718 ; -C 66 ; WX 722 ; N B ; B 76 0 764 718 ; -C 67 ; WX 722 ; N C ; B 107 -19 789 737 ; -C 68 ; WX 722 ; N D ; B 76 0 777 718 ; -C 69 ; WX 667 ; N E ; B 76 0 757 718 ; -C 70 ; WX 611 ; N F ; B 76 0 740 718 ; -C 71 ; WX 778 ; N G ; B 108 -19 817 737 ; -C 72 ; WX 722 ; N H ; B 71 0 804 718 ; -C 73 ; WX 278 ; N I ; B 64 0 367 718 ; -C 74 ; WX 556 ; N J ; B 60 -18 637 718 ; -C 75 ; WX 722 ; N K ; B 87 0 858 718 ; -C 76 ; WX 611 ; N L ; B 76 0 611 718 ; -C 77 ; WX 833 ; N M ; B 69 0 918 718 ; -C 78 ; WX 722 ; N N ; B 69 0 807 718 ; -C 79 ; WX 778 ; N O ; B 107 -19 823 737 ; -C 80 ; WX 667 ; N P ; B 76 0 738 718 ; -C 81 ; WX 778 ; N Q ; B 107 -52 823 737 ; -C 82 ; WX 722 ; N R ; B 76 0 778 718 ; -C 83 ; WX 667 ; N S ; B 81 -19 718 737 ; -C 84 ; WX 611 ; N T ; B 140 0 751 718 ; -C 85 ; WX 722 ; N U ; B 116 -19 804 718 ; -C 86 ; WX 667 ; N V ; B 172 0 801 718 ; -C 87 ; WX 944 ; N W ; B 169 0 1082 718 ; -C 88 ; WX 667 ; N X ; B 14 0 791 718 ; -C 89 ; WX 667 ; N Y ; B 168 0 806 718 ; -C 90 ; WX 611 ; N Z ; B 25 0 737 718 ; -C 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ; -C 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ; -C 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ; -C 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ; -C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; -C 145 ; WX 278 ; N quoteleft ; B 165 454 361 727 ; -C 97 ; WX 556 ; N a ; B 55 -14 583 546 ; -C 98 ; WX 611 ; N b ; B 61 -14 645 718 ; -C 99 ; WX 556 ; N c ; B 79 -14 599 546 ; -C 100 ; WX 611 ; N d ; B 82 -14 704 718 ; -C 101 ; WX 556 ; N e ; B 70 -14 593 546 ; -C 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ; -C 103 ; WX 611 ; N g ; B 38 -217 666 546 ; -C 104 ; WX 611 ; N h ; B 65 0 629 718 ; -C 105 ; WX 278 ; N i ; B 69 0 363 725 ; -C 106 ; WX 278 ; N j ; B -42 -214 363 725 ; -C 107 ; WX 556 ; N k ; B 69 0 670 718 ; -C 108 ; WX 278 ; N l ; B 69 0 362 718 ; -C 109 ; WX 889 ; N m ; B 64 0 909 546 ; -C 110 ; WX 611 ; N n ; B 65 0 629 546 ; -C 111 ; WX 611 ; N o ; B 82 -14 643 546 ; -C 112 ; WX 611 ; N p ; B 18 -207 645 546 ; -C 113 ; WX 611 ; N q ; B 80 -207 665 546 ; -C 114 ; WX 389 ; N r ; B 64 0 489 546 ; -C 115 ; WX 556 ; N s ; B 63 -14 584 546 ; -C 116 ; WX 333 ; N t ; B 100 -6 422 676 ; -C 117 ; WX 611 ; N u ; B 98 -14 658 532 ; -C 118 ; WX 556 ; N v ; B 126 0 656 532 ; -C 119 ; WX 778 ; N w ; B 123 0 882 532 ; -C 120 ; WX 556 ; N x ; B 15 0 648 532 ; -C 121 ; WX 556 ; N y ; B 42 -214 652 532 ; -C 122 ; WX 500 ; N z ; B 20 0 583 532 ; -C 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ; -C 124 ; WX 280 ; N bar ; B 36 -225 361 775 ; -C 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ; -C 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ; -C 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ; -C 162 ; WX 556 ; N cent ; B 79 -118 599 628 ; -C 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ; -C -1 ; WX 167 ; N fraction ; B -174 -19 487 710 ; -C 165 ; WX 556 ; N yen ; B 60 0 713 698 ; -C 131 ; WX 556 ; N florin ; B -50 -210 669 737 ; -C 167 ; WX 556 ; N section ; B 61 -184 598 727 ; -C 164 ; WX 556 ; N currency ; B 27 76 680 636 ; -C 39 ; WX 238 ; N quotesingle ; B 165 447 321 718 ; -C 147 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ; -C 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ; -C 139 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ; -C 155 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ; -C -1 ; WX 611 ; N fi ; B 87 0 696 727 ; -C -1 ; WX 611 ; N fl ; B 87 0 695 727 ; -C 150 ; WX 556 ; N endash ; B 48 227 627 333 ; -C 134 ; WX 556 ; N dagger ; B 118 -171 626 718 ; -C 135 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ; -C 183 ; WX 278 ; N periodcentered ; B 110 172 276 334 ; -C 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ; -C 149 ; WX 350 ; N bullet ; B 83 194 420 524 ; -C 130 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ; -C 132 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ; -C 148 ; WX 500 ; N quotedblright ; B 162 445 589 718 ; -C 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ; -C 133 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ; -C 137 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ; -C 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ; -C 96 ; WX 333 ; N grave ; B 136 604 353 750 ; -C 180 ; WX 333 ; N acute ; B 236 604 515 750 ; -C 136 ; WX 333 ; N circumflex ; B 118 604 471 750 ; -C 152 ; WX 333 ; N tilde ; B 113 610 507 737 ; -C 175 ; WX 333 ; N macron ; B 122 604 483 678 ; -C -1 ; WX 333 ; N breve ; B 156 604 494 750 ; -C -1 ; WX 333 ; N dotaccent ; B 235 614 385 729 ; -C 168 ; WX 333 ; N dieresis ; B 137 614 482 729 ; -C -1 ; WX 333 ; N ring ; B 200 568 420 776 ; -C 184 ; WX 333 ; N cedilla ; B -37 -228 220 0 ; -C -1 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ; -C -1 ; WX 333 ; N ogonek ; B 41 -228 264 0 ; -C -1 ; WX 333 ; N caron ; B 149 604 502 750 ; -C 151 ; WX 1000 ; N emdash ; B 48 227 1071 333 ; -C 198 ; WX 1000 ; N AE ; B 5 0 1100 718 ; -C 170 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ; -C -1 ; WX 611 ; N Lslash ; B 34 0 611 718 ; -C 216 ; WX 778 ; N Oslash ; B 35 -27 894 745 ; -C 140 ; WX 1000 ; N OE ; B 99 -19 1114 737 ; -C 186 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ; -C 230 ; WX 889 ; N ae ; B 56 -14 923 546 ; -C -1 ; WX 278 ; N dotlessi ; B 69 0 322 532 ; -C -1 ; WX 278 ; N lslash ; B 40 0 407 718 ; -C 248 ; WX 611 ; N oslash ; B 22 -29 701 560 ; -C 156 ; WX 944 ; N oe ; B 82 -14 977 546 ; -C 223 ; WX 611 ; N germandbls ; B 69 -14 657 731 ; -C 207 ; WX 278 ; N Idieresis ; B 64 0 494 915 ; -C 233 ; WX 556 ; N eacute ; B 70 -14 627 750 ; -C -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ; -C -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ; -C -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ; -C 159 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ; -C 247 ; WX 584 ; N divide ; B 82 -42 610 548 ; -C 221 ; WX 667 ; N Yacute ; B 168 0 806 936 ; -C 194 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ; -C 225 ; WX 556 ; N aacute ; B 55 -14 627 750 ; -C 219 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ; -C 253 ; WX 556 ; N yacute ; B 42 -214 652 750 ; -C -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ; -C 234 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ; -C -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ; -C 220 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ; -C -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ; -C 218 ; WX 722 ; N Uacute ; B 116 -19 804 936 ; -C -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ; -C 203 ; WX 667 ; N Edieresis ; B 76 0 757 915 ; -C -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ; -C -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ; -C 169 ; WX 737 ; N copyright ; B 56 -19 835 737 ; -C -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ; -C -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ; -C 229 ; WX 556 ; N aring ; B 55 -14 583 776 ; -C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ; -C -1 ; WX 278 ; N lacute ; B 69 0 528 936 ; -C 224 ; WX 556 ; N agrave ; B 55 -14 583 750 ; -C -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ; -C -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ; -C 227 ; WX 556 ; N atilde ; B 55 -14 619 737 ; -C -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ; -C 154 ; WX 556 ; N scaron ; B 63 -14 614 750 ; -C -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ; -C 237 ; WX 278 ; N iacute ; B 69 0 488 750 ; -C -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ; -C -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ; -C -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ; -C 251 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ; -C 226 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ; -C -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ; -C -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ; -C 231 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ; -C -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ; -C 222 ; WX 667 ; N Thorn ; B 76 0 716 718 ; -C -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ; -C -1 ; WX 722 ; N Racute ; B 76 0 778 936 ; -C -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ; -C -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ; -C -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ; -C -1 ; WX 611 ; N uring ; B 98 -14 658 776 ; -C 179 ; WX 333 ; N threesuperior ; B 91 271 441 710 ; -C 210 ; WX 778 ; N Ograve ; B 107 -19 823 936 ; -C 192 ; WX 722 ; N Agrave ; B 20 0 702 936 ; -C -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ; -C 215 ; WX 584 ; N multiply ; B 57 1 635 505 ; -C 250 ; WX 611 ; N uacute ; B 98 -14 658 750 ; -C -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ; -C -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ; -C 255 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ; -C -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ; -C 238 ; WX 278 ; N icircumflex ; B 69 0 444 750 ; -C 202 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ; -C 228 ; WX 556 ; N adieresis ; B 55 -14 594 729 ; -C 235 ; WX 556 ; N edieresis ; B 70 -14 594 729 ; -C -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ; -C -1 ; WX 611 ; N nacute ; B 65 0 654 750 ; -C -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ; -C -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ; -C 205 ; WX 278 ; N Iacute ; B 64 0 528 936 ; -C 177 ; WX 584 ; N plusminus ; B 40 0 625 506 ; -C 166 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ; -C 174 ; WX 737 ; N registered ; B 55 -19 834 737 ; -C -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ; -C -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ; -C -1 ; WX 600 ; N summation ; B 14 -10 670 706 ; -C 200 ; WX 667 ; N Egrave ; B 76 0 757 936 ; -C -1 ; WX 389 ; N racute ; B 64 0 543 750 ; -C -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ; -C -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ; -C 142 ; WX 611 ; N Zcaron ; B 25 0 737 936 ; -C -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ; -C 208 ; WX 722 ; N Eth ; B 62 0 777 718 ; -C 199 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ; -C -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ; -C -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ; -C -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ; -C -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ; -C 193 ; WX 722 ; N Aacute ; B 20 0 750 936 ; -C 196 ; WX 722 ; N Adieresis ; B 20 0 716 915 ; -C 232 ; WX 556 ; N egrave ; B 70 -14 593 750 ; -C -1 ; WX 500 ; N zacute ; B 20 0 599 750 ; -C -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ; -C 211 ; WX 778 ; N Oacute ; B 107 -19 823 936 ; -C 243 ; WX 611 ; N oacute ; B 82 -14 654 750 ; -C -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ; -C -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ; -C 239 ; WX 278 ; N idieresis ; B 69 0 455 729 ; -C 212 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ; -C 217 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ; -C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; -C 254 ; WX 611 ; N thorn ; B 18 -208 645 718 ; -C 178 ; WX 333 ; N twosuperior ; B 69 283 449 710 ; -C 214 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ; -C 181 ; WX 611 ; N mu ; B 22 -207 658 532 ; -C 236 ; WX 278 ; N igrave ; B 69 0 326 750 ; -C -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ; -C -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ; -C -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ; -C 190 ; WX 834 ; N threequarters ; B 99 -19 839 710 ; -C -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ; -C -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ; -C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ; -C -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ; -C 153 ; WX 1000 ; N trademark ; B 179 306 1109 718 ; -C -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ; -C 204 ; WX 278 ; N Igrave ; B 64 0 367 936 ; -C -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ; -C -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ; -C 189 ; WX 834 ; N onehalf ; B 132 -19 858 710 ; -C -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ; -C 244 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ; -C 241 ; WX 611 ; N ntilde ; B 65 0 646 737 ; -C -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ; -C 201 ; WX 667 ; N Eacute ; B 76 0 757 936 ; -C -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ; -C -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ; -C 188 ; WX 834 ; N onequarter ; B 132 -19 806 710 ; -C 138 ; WX 667 ; N Scaron ; B 81 -19 718 936 ; -C -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ; -C -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ; -C 176 ; WX 400 ; N degree ; B 175 426 467 712 ; -C 242 ; WX 611 ; N ograve ; B 82 -14 643 750 ; -C -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ; -C 249 ; WX 611 ; N ugrave ; B 98 -14 658 750 ; -C -1 ; WX 549 ; N radical ; B 112 -46 689 850 ; -C -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ; -C -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ; -C 209 ; WX 722 ; N Ntilde ; B 69 0 807 923 ; -C 245 ; WX 611 ; N otilde ; B 82 -14 646 737 ; -C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ; -C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ; -C 195 ; WX 722 ; N Atilde ; B 20 0 741 923 ; -C -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ; -C 197 ; WX 722 ; N Aring ; B 20 0 702 962 ; -C 213 ; WX 778 ; N Otilde ; B 107 -19 823 923 ; -C -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ; -C -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ; -C -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ; -C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ; -C -1 ; WX 584 ; N minus ; B 82 197 610 309 ; -C 206 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ; -C -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ; -C -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ; -C 172 ; WX 584 ; N logicalnot ; B 105 108 633 419 ; -C 246 ; WX 611 ; N odieresis ; B 82 -14 643 729 ; -C 252 ; WX 611 ; N udieresis ; B 98 -14 658 729 ; -C -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ; -C -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ; -C 240 ; WX 611 ; N eth ; B 82 -14 670 737 ; -C 158 ; WX 500 ; N zcaron ; B 20 0 586 750 ; -C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ; -C 185 ; WX 333 ; N onesuperior ; B 148 283 388 710 ; -C -1 ; WX 278 ; N imacron ; B 69 0 429 678 ; -C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -StartKernData -StartKernPairs 2481 -KPX A C -40 -KPX A Cacute -40 -KPX A Ccaron -40 -KPX A Ccedilla -40 -KPX A G -50 -KPX A Gbreve -50 -KPX A Gcommaaccent -50 -KPX A O -40 -KPX A Oacute -40 -KPX A Ocircumflex -40 -KPX A Odieresis -40 -KPX A Ograve -40 -KPX A Ohungarumlaut -40 -KPX A Omacron -40 -KPX A Oslash -40 -KPX A Otilde -40 -KPX A Q -40 -KPX A T -90 -KPX A Tcaron -90 -KPX A Tcommaaccent -90 -KPX A U -50 -KPX A Uacute -50 -KPX A Ucircumflex -50 -KPX A Udieresis -50 -KPX A Ugrave -50 -KPX A Uhungarumlaut -50 -KPX A Umacron -50 -KPX A Uogonek -50 -KPX A Uring -50 -KPX A V -80 -KPX A W -60 -KPX A Y -110 -KPX A Yacute -110 -KPX A Ydieresis -110 -KPX A u -30 -KPX A uacute -30 -KPX A ucircumflex -30 -KPX A udieresis -30 -KPX A ugrave -30 -KPX A uhungarumlaut -30 -KPX A umacron -30 -KPX A uogonek -30 -KPX A uring -30 -KPX A v -40 -KPX A w -30 -KPX A y -30 -KPX A yacute -30 -KPX A ydieresis -30 -KPX Aacute C -40 -KPX Aacute Cacute -40 -KPX Aacute Ccaron -40 -KPX Aacute Ccedilla -40 -KPX Aacute G -50 -KPX Aacute Gbreve -50 -KPX Aacute Gcommaaccent -50 -KPX Aacute O -40 -KPX Aacute Oacute -40 -KPX Aacute Ocircumflex -40 -KPX Aacute Odieresis -40 -KPX Aacute Ograve -40 -KPX Aacute Ohungarumlaut -40 -KPX Aacute Omacron -40 -KPX Aacute Oslash -40 -KPX Aacute Otilde -40 -KPX Aacute Q -40 -KPX Aacute T -90 -KPX Aacute Tcaron -90 -KPX Aacute Tcommaaccent -90 -KPX Aacute U -50 -KPX Aacute Uacute -50 -KPX Aacute Ucircumflex -50 -KPX Aacute Udieresis -50 -KPX Aacute Ugrave -50 -KPX Aacute Uhungarumlaut -50 -KPX Aacute Umacron -50 -KPX Aacute Uogonek -50 -KPX Aacute Uring -50 -KPX Aacute V -80 -KPX Aacute W -60 -KPX Aacute Y -110 -KPX Aacute Yacute -110 -KPX Aacute Ydieresis -110 -KPX Aacute u -30 -KPX Aacute uacute -30 -KPX Aacute ucircumflex -30 -KPX Aacute udieresis -30 -KPX Aacute ugrave -30 -KPX Aacute uhungarumlaut -30 -KPX Aacute umacron -30 -KPX Aacute uogonek -30 -KPX Aacute uring -30 -KPX Aacute v -40 -KPX Aacute w -30 -KPX Aacute y -30 -KPX Aacute yacute -30 -KPX Aacute ydieresis -30 -KPX Abreve C -40 -KPX Abreve Cacute -40 -KPX Abreve Ccaron -40 -KPX Abreve Ccedilla -40 -KPX Abreve G -50 -KPX Abreve Gbreve -50 -KPX Abreve Gcommaaccent -50 -KPX Abreve O -40 -KPX Abreve Oacute -40 -KPX Abreve Ocircumflex -40 -KPX Abreve Odieresis -40 -KPX Abreve Ograve -40 -KPX Abreve Ohungarumlaut -40 -KPX Abreve Omacron -40 -KPX Abreve Oslash -40 -KPX Abreve Otilde -40 -KPX Abreve Q -40 -KPX Abreve T -90 -KPX Abreve Tcaron -90 -KPX Abreve Tcommaaccent -90 -KPX Abreve U -50 -KPX Abreve Uacute -50 -KPX Abreve Ucircumflex -50 -KPX Abreve Udieresis -50 -KPX Abreve Ugrave -50 -KPX Abreve Uhungarumlaut -50 -KPX Abreve Umacron -50 -KPX Abreve Uogonek -50 -KPX Abreve Uring -50 -KPX Abreve V -80 -KPX Abreve W -60 -KPX Abreve Y -110 -KPX Abreve Yacute -110 -KPX Abreve Ydieresis -110 -KPX Abreve u -30 -KPX Abreve uacute -30 -KPX Abreve ucircumflex -30 -KPX Abreve udieresis -30 -KPX Abreve ugrave -30 -KPX Abreve uhungarumlaut -30 -KPX Abreve umacron -30 -KPX Abreve uogonek -30 -KPX Abreve uring -30 -KPX Abreve v -40 -KPX Abreve w -30 -KPX Abreve y -30 -KPX Abreve yacute -30 -KPX Abreve ydieresis -30 -KPX Acircumflex C -40 -KPX Acircumflex Cacute -40 -KPX Acircumflex Ccaron -40 -KPX Acircumflex Ccedilla -40 -KPX Acircumflex G -50 -KPX Acircumflex Gbreve -50 -KPX Acircumflex Gcommaaccent -50 -KPX Acircumflex O -40 -KPX Acircumflex Oacute -40 -KPX Acircumflex Ocircumflex -40 -KPX Acircumflex Odieresis -40 -KPX Acircumflex Ograve -40 -KPX Acircumflex Ohungarumlaut -40 -KPX Acircumflex Omacron -40 -KPX Acircumflex Oslash -40 -KPX Acircumflex Otilde -40 -KPX Acircumflex Q -40 -KPX Acircumflex T -90 -KPX Acircumflex Tcaron -90 -KPX Acircumflex Tcommaaccent -90 -KPX Acircumflex U -50 -KPX Acircumflex Uacute -50 -KPX Acircumflex Ucircumflex -50 -KPX Acircumflex Udieresis -50 -KPX Acircumflex Ugrave -50 -KPX Acircumflex Uhungarumlaut -50 -KPX Acircumflex Umacron -50 -KPX Acircumflex Uogonek -50 -KPX Acircumflex Uring -50 -KPX Acircumflex V -80 -KPX Acircumflex W -60 -KPX Acircumflex Y -110 -KPX Acircumflex Yacute -110 -KPX Acircumflex Ydieresis -110 -KPX Acircumflex u -30 -KPX Acircumflex uacute -30 -KPX Acircumflex ucircumflex -30 -KPX Acircumflex udieresis -30 -KPX Acircumflex ugrave -30 -KPX Acircumflex uhungarumlaut -30 -KPX Acircumflex umacron -30 -KPX Acircumflex uogonek -30 -KPX Acircumflex uring -30 -KPX Acircumflex v -40 -KPX Acircumflex w -30 -KPX Acircumflex y -30 -KPX Acircumflex yacute -30 -KPX Acircumflex ydieresis -30 -KPX Adieresis C -40 -KPX Adieresis Cacute -40 -KPX Adieresis Ccaron -40 -KPX Adieresis Ccedilla -40 -KPX Adieresis G -50 -KPX Adieresis Gbreve -50 -KPX Adieresis Gcommaaccent -50 -KPX Adieresis O -40 -KPX Adieresis Oacute -40 -KPX Adieresis Ocircumflex -40 -KPX Adieresis Odieresis -40 -KPX Adieresis Ograve -40 -KPX Adieresis Ohungarumlaut -40 -KPX Adieresis Omacron -40 -KPX Adieresis Oslash -40 -KPX Adieresis Otilde -40 -KPX Adieresis Q -40 -KPX Adieresis T -90 -KPX Adieresis Tcaron -90 -KPX Adieresis Tcommaaccent -90 -KPX Adieresis U -50 -KPX Adieresis Uacute -50 -KPX Adieresis Ucircumflex -50 -KPX Adieresis Udieresis -50 -KPX Adieresis Ugrave -50 -KPX Adieresis Uhungarumlaut -50 -KPX Adieresis Umacron -50 -KPX Adieresis Uogonek -50 -KPX Adieresis Uring -50 -KPX Adieresis V -80 -KPX Adieresis W -60 -KPX Adieresis Y -110 -KPX Adieresis Yacute -110 -KPX Adieresis Ydieresis -110 -KPX Adieresis u -30 -KPX Adieresis uacute -30 -KPX Adieresis ucircumflex -30 -KPX Adieresis udieresis -30 -KPX Adieresis ugrave -30 -KPX Adieresis uhungarumlaut -30 -KPX Adieresis umacron -30 -KPX Adieresis uogonek -30 -KPX Adieresis uring -30 -KPX Adieresis v -40 -KPX Adieresis w -30 -KPX Adieresis y -30 -KPX Adieresis yacute -30 -KPX Adieresis ydieresis -30 -KPX Agrave C -40 -KPX Agrave Cacute -40 -KPX Agrave Ccaron -40 -KPX Agrave Ccedilla -40 -KPX Agrave G -50 -KPX Agrave Gbreve -50 -KPX Agrave Gcommaaccent -50 -KPX Agrave O -40 -KPX Agrave Oacute -40 -KPX Agrave Ocircumflex -40 -KPX Agrave Odieresis -40 -KPX Agrave Ograve -40 -KPX Agrave Ohungarumlaut -40 -KPX Agrave Omacron -40 -KPX Agrave Oslash -40 -KPX Agrave Otilde -40 -KPX Agrave Q -40 -KPX Agrave T -90 -KPX Agrave Tcaron -90 -KPX Agrave Tcommaaccent -90 -KPX Agrave U -50 -KPX Agrave Uacute -50 -KPX Agrave Ucircumflex -50 -KPX Agrave Udieresis -50 -KPX Agrave Ugrave -50 -KPX Agrave Uhungarumlaut -50 -KPX Agrave Umacron -50 -KPX Agrave Uogonek -50 -KPX Agrave Uring -50 -KPX Agrave V -80 -KPX Agrave W -60 -KPX Agrave Y -110 -KPX Agrave Yacute -110 -KPX Agrave Ydieresis -110 -KPX Agrave u -30 -KPX Agrave uacute -30 -KPX Agrave ucircumflex -30 -KPX Agrave udieresis -30 -KPX Agrave ugrave -30 -KPX Agrave uhungarumlaut -30 -KPX Agrave umacron -30 -KPX Agrave uogonek -30 -KPX Agrave uring -30 -KPX Agrave v -40 -KPX Agrave w -30 -KPX Agrave y -30 -KPX Agrave yacute -30 -KPX Agrave ydieresis -30 -KPX Amacron C -40 -KPX Amacron Cacute -40 -KPX Amacron Ccaron -40 -KPX Amacron Ccedilla -40 -KPX Amacron G -50 -KPX Amacron Gbreve -50 -KPX Amacron Gcommaaccent -50 -KPX Amacron O -40 -KPX Amacron Oacute -40 -KPX Amacron Ocircumflex -40 -KPX Amacron Odieresis -40 -KPX Amacron Ograve -40 -KPX Amacron Ohungarumlaut -40 -KPX Amacron Omacron -40 -KPX Amacron Oslash -40 -KPX Amacron Otilde -40 -KPX Amacron Q -40 -KPX Amacron T -90 -KPX Amacron Tcaron -90 -KPX Amacron Tcommaaccent -90 -KPX Amacron U -50 -KPX Amacron Uacute -50 -KPX Amacron Ucircumflex -50 -KPX Amacron Udieresis -50 -KPX Amacron Ugrave -50 -KPX Amacron Uhungarumlaut -50 -KPX Amacron Umacron -50 -KPX Amacron Uogonek -50 -KPX Amacron Uring -50 -KPX Amacron V -80 -KPX Amacron W -60 -KPX Amacron Y -110 -KPX Amacron Yacute -110 -KPX Amacron Ydieresis -110 -KPX Amacron u -30 -KPX Amacron uacute -30 -KPX Amacron ucircumflex -30 -KPX Amacron udieresis -30 -KPX Amacron ugrave -30 -KPX Amacron uhungarumlaut -30 -KPX Amacron umacron -30 -KPX Amacron uogonek -30 -KPX Amacron uring -30 -KPX Amacron v -40 -KPX Amacron w -30 -KPX Amacron y -30 -KPX Amacron yacute -30 -KPX Amacron ydieresis -30 -KPX Aogonek C -40 -KPX Aogonek Cacute -40 -KPX Aogonek Ccaron -40 -KPX Aogonek Ccedilla -40 -KPX Aogonek G -50 -KPX Aogonek Gbreve -50 -KPX Aogonek Gcommaaccent -50 -KPX Aogonek O -40 -KPX Aogonek Oacute -40 -KPX Aogonek Ocircumflex -40 -KPX Aogonek Odieresis -40 -KPX Aogonek Ograve -40 -KPX Aogonek Ohungarumlaut -40 -KPX Aogonek Omacron -40 -KPX Aogonek Oslash -40 -KPX Aogonek Otilde -40 -KPX Aogonek Q -40 -KPX Aogonek T -90 -KPX Aogonek Tcaron -90 -KPX Aogonek Tcommaaccent -90 -KPX Aogonek U -50 -KPX Aogonek Uacute -50 -KPX Aogonek Ucircumflex -50 -KPX Aogonek Udieresis -50 -KPX Aogonek Ugrave -50 -KPX Aogonek Uhungarumlaut -50 -KPX Aogonek Umacron -50 -KPX Aogonek Uogonek -50 -KPX Aogonek Uring -50 -KPX Aogonek V -80 -KPX Aogonek W -60 -KPX Aogonek Y -110 -KPX Aogonek Yacute -110 -KPX Aogonek Ydieresis -110 -KPX Aogonek u -30 -KPX Aogonek uacute -30 -KPX Aogonek ucircumflex -30 -KPX Aogonek udieresis -30 -KPX Aogonek ugrave -30 -KPX Aogonek uhungarumlaut -30 -KPX Aogonek umacron -30 -KPX Aogonek uogonek -30 -KPX Aogonek uring -30 -KPX Aogonek v -40 -KPX Aogonek w -30 -KPX Aogonek y -30 -KPX Aogonek yacute -30 -KPX Aogonek ydieresis -30 -KPX Aring C -40 -KPX Aring Cacute -40 -KPX Aring Ccaron -40 -KPX Aring Ccedilla -40 -KPX Aring G -50 -KPX Aring Gbreve -50 -KPX Aring Gcommaaccent -50 -KPX Aring O -40 -KPX Aring Oacute -40 -KPX Aring Ocircumflex -40 -KPX Aring Odieresis -40 -KPX Aring Ograve -40 -KPX Aring Ohungarumlaut -40 -KPX Aring Omacron -40 -KPX Aring Oslash -40 -KPX Aring Otilde -40 -KPX Aring Q -40 -KPX Aring T -90 -KPX Aring Tcaron -90 -KPX Aring Tcommaaccent -90 -KPX Aring U -50 -KPX Aring Uacute -50 -KPX Aring Ucircumflex -50 -KPX Aring Udieresis -50 -KPX Aring Ugrave -50 -KPX Aring Uhungarumlaut -50 -KPX Aring Umacron -50 -KPX Aring Uogonek -50 -KPX Aring Uring -50 -KPX Aring V -80 -KPX Aring W -60 -KPX Aring Y -110 -KPX Aring Yacute -110 -KPX Aring Ydieresis -110 -KPX Aring u -30 -KPX Aring uacute -30 -KPX Aring ucircumflex -30 -KPX Aring udieresis -30 -KPX Aring ugrave -30 -KPX Aring uhungarumlaut -30 -KPX Aring umacron -30 -KPX Aring uogonek -30 -KPX Aring uring -30 -KPX Aring v -40 -KPX Aring w -30 -KPX Aring y -30 -KPX Aring yacute -30 -KPX Aring ydieresis -30 -KPX Atilde C -40 -KPX Atilde Cacute -40 -KPX Atilde Ccaron -40 -KPX Atilde Ccedilla -40 -KPX Atilde G -50 -KPX Atilde Gbreve -50 -KPX Atilde Gcommaaccent -50 -KPX Atilde O -40 -KPX Atilde Oacute -40 -KPX Atilde Ocircumflex -40 -KPX Atilde Odieresis -40 -KPX Atilde Ograve -40 -KPX Atilde Ohungarumlaut -40 -KPX Atilde Omacron -40 -KPX Atilde Oslash -40 -KPX Atilde Otilde -40 -KPX Atilde Q -40 -KPX Atilde T -90 -KPX Atilde Tcaron -90 -KPX Atilde Tcommaaccent -90 -KPX Atilde U -50 -KPX Atilde Uacute -50 -KPX Atilde Ucircumflex -50 -KPX Atilde Udieresis -50 -KPX Atilde Ugrave -50 -KPX Atilde Uhungarumlaut -50 -KPX Atilde Umacron -50 -KPX Atilde Uogonek -50 -KPX Atilde Uring -50 -KPX Atilde V -80 -KPX Atilde W -60 -KPX Atilde Y -110 -KPX Atilde Yacute -110 -KPX Atilde Ydieresis -110 -KPX Atilde u -30 -KPX Atilde uacute -30 -KPX Atilde ucircumflex -30 -KPX Atilde udieresis -30 -KPX Atilde ugrave -30 -KPX Atilde uhungarumlaut -30 -KPX Atilde umacron -30 -KPX Atilde uogonek -30 -KPX Atilde uring -30 -KPX Atilde v -40 -KPX Atilde w -30 -KPX Atilde y -30 -KPX Atilde yacute -30 -KPX Atilde ydieresis -30 -KPX B A -30 -KPX B Aacute -30 -KPX B Abreve -30 -KPX B Acircumflex -30 -KPX B Adieresis -30 -KPX B Agrave -30 -KPX B Amacron -30 -KPX B Aogonek -30 -KPX B Aring -30 -KPX B Atilde -30 -KPX B U -10 -KPX B Uacute -10 -KPX B Ucircumflex -10 -KPX B Udieresis -10 -KPX B Ugrave -10 -KPX B Uhungarumlaut -10 -KPX B Umacron -10 -KPX B Uogonek -10 -KPX B Uring -10 -KPX D A -40 -KPX D Aacute -40 -KPX D Abreve -40 -KPX D Acircumflex -40 -KPX D Adieresis -40 -KPX D Agrave -40 -KPX D Amacron -40 -KPX D Aogonek -40 -KPX D Aring -40 -KPX D Atilde -40 -KPX D V -40 -KPX D W -40 -KPX D Y -70 -KPX D Yacute -70 -KPX D Ydieresis -70 -KPX D comma -30 -KPX D period -30 -KPX Dcaron A -40 -KPX Dcaron Aacute -40 -KPX Dcaron Abreve -40 -KPX Dcaron Acircumflex -40 -KPX Dcaron Adieresis -40 -KPX Dcaron Agrave -40 -KPX Dcaron Amacron -40 -KPX Dcaron Aogonek -40 -KPX Dcaron Aring -40 -KPX Dcaron Atilde -40 -KPX Dcaron V -40 -KPX Dcaron W -40 -KPX Dcaron Y -70 -KPX Dcaron Yacute -70 -KPX Dcaron Ydieresis -70 -KPX Dcaron comma -30 -KPX Dcaron period -30 -KPX Dcroat A -40 -KPX Dcroat Aacute -40 -KPX Dcroat Abreve -40 -KPX Dcroat Acircumflex -40 -KPX Dcroat Adieresis -40 -KPX Dcroat Agrave -40 -KPX Dcroat Amacron -40 -KPX Dcroat Aogonek -40 -KPX Dcroat Aring -40 -KPX Dcroat Atilde -40 -KPX Dcroat V -40 -KPX Dcroat W -40 -KPX Dcroat Y -70 -KPX Dcroat Yacute -70 -KPX Dcroat Ydieresis -70 -KPX Dcroat comma -30 -KPX Dcroat period -30 -KPX F A -80 -KPX F Aacute -80 -KPX F Abreve -80 -KPX F Acircumflex -80 -KPX F Adieresis -80 -KPX F Agrave -80 -KPX F Amacron -80 -KPX F Aogonek -80 -KPX F Aring -80 -KPX F Atilde -80 -KPX F a -20 -KPX F aacute -20 -KPX F abreve -20 -KPX F acircumflex -20 -KPX F adieresis -20 -KPX F agrave -20 -KPX F amacron -20 -KPX F aogonek -20 -KPX F aring -20 -KPX F atilde -20 -KPX F comma -100 -KPX F period -100 -KPX J A -20 -KPX J Aacute -20 -KPX J Abreve -20 -KPX J Acircumflex -20 -KPX J Adieresis -20 -KPX J Agrave -20 -KPX J Amacron -20 -KPX J Aogonek -20 -KPX J Aring -20 -KPX J Atilde -20 -KPX J comma -20 -KPX J period -20 -KPX J u -20 -KPX J uacute -20 -KPX J ucircumflex -20 -KPX J udieresis -20 -KPX J ugrave -20 -KPX J uhungarumlaut -20 -KPX J umacron -20 -KPX J uogonek -20 -KPX J uring -20 -KPX K O -30 -KPX K Oacute -30 -KPX K Ocircumflex -30 -KPX K Odieresis -30 -KPX K Ograve -30 -KPX K Ohungarumlaut -30 -KPX K Omacron -30 -KPX K Oslash -30 -KPX K Otilde -30 -KPX K e -15 -KPX K eacute -15 -KPX K ecaron -15 -KPX K ecircumflex -15 -KPX K edieresis -15 -KPX K edotaccent -15 -KPX K egrave -15 -KPX K emacron -15 -KPX K eogonek -15 -KPX K o -35 -KPX K oacute -35 -KPX K ocircumflex -35 -KPX K odieresis -35 -KPX K ograve -35 -KPX K ohungarumlaut -35 -KPX K omacron -35 -KPX K oslash -35 -KPX K otilde -35 -KPX K u -30 -KPX K uacute -30 -KPX K ucircumflex -30 -KPX K udieresis -30 -KPX K ugrave -30 -KPX K uhungarumlaut -30 -KPX K umacron -30 -KPX K uogonek -30 -KPX K uring -30 -KPX K y -40 -KPX K yacute -40 -KPX K ydieresis -40 -KPX Kcommaaccent O -30 -KPX Kcommaaccent Oacute -30 -KPX Kcommaaccent Ocircumflex -30 -KPX Kcommaaccent Odieresis -30 -KPX Kcommaaccent Ograve -30 -KPX Kcommaaccent Ohungarumlaut -30 -KPX Kcommaaccent Omacron -30 -KPX Kcommaaccent Oslash -30 -KPX Kcommaaccent Otilde -30 -KPX Kcommaaccent e -15 -KPX Kcommaaccent eacute -15 -KPX Kcommaaccent ecaron -15 -KPX Kcommaaccent ecircumflex -15 -KPX Kcommaaccent edieresis -15 -KPX Kcommaaccent edotaccent -15 -KPX Kcommaaccent egrave -15 -KPX Kcommaaccent emacron -15 -KPX Kcommaaccent eogonek -15 -KPX Kcommaaccent o -35 -KPX Kcommaaccent oacute -35 -KPX Kcommaaccent ocircumflex -35 -KPX Kcommaaccent odieresis -35 -KPX Kcommaaccent ograve -35 -KPX Kcommaaccent ohungarumlaut -35 -KPX Kcommaaccent omacron -35 -KPX Kcommaaccent oslash -35 -KPX Kcommaaccent otilde -35 -KPX Kcommaaccent u -30 -KPX Kcommaaccent uacute -30 -KPX Kcommaaccent ucircumflex -30 -KPX Kcommaaccent udieresis -30 -KPX Kcommaaccent ugrave -30 -KPX Kcommaaccent uhungarumlaut -30 -KPX Kcommaaccent umacron -30 -KPX Kcommaaccent uogonek -30 -KPX Kcommaaccent uring -30 -KPX Kcommaaccent y -40 -KPX Kcommaaccent yacute -40 -KPX Kcommaaccent ydieresis -40 -KPX L T -90 -KPX L Tcaron -90 -KPX L Tcommaaccent -90 -KPX L V -110 -KPX L W -80 -KPX L Y -120 -KPX L Yacute -120 -KPX L Ydieresis -120 -KPX L quotedblright -140 -KPX L quoteright -140 -KPX L y -30 -KPX L yacute -30 -KPX L ydieresis -30 -KPX Lacute T -90 -KPX Lacute Tcaron -90 -KPX Lacute Tcommaaccent -90 -KPX Lacute V -110 -KPX Lacute W -80 -KPX Lacute Y -120 -KPX Lacute Yacute -120 -KPX Lacute Ydieresis -120 -KPX Lacute quotedblright -140 -KPX Lacute quoteright -140 -KPX Lacute y -30 -KPX Lacute yacute -30 -KPX Lacute ydieresis -30 -KPX Lcommaaccent T -90 -KPX Lcommaaccent Tcaron -90 -KPX Lcommaaccent Tcommaaccent -90 -KPX Lcommaaccent V -110 -KPX Lcommaaccent W -80 -KPX Lcommaaccent Y -120 -KPX Lcommaaccent Yacute -120 -KPX Lcommaaccent Ydieresis -120 -KPX Lcommaaccent quotedblright -140 -KPX Lcommaaccent quoteright -140 -KPX Lcommaaccent y -30 -KPX Lcommaaccent yacute -30 -KPX Lcommaaccent ydieresis -30 -KPX Lslash T -90 -KPX Lslash Tcaron -90 -KPX Lslash Tcommaaccent -90 -KPX Lslash V -110 -KPX Lslash W -80 -KPX Lslash Y -120 -KPX Lslash Yacute -120 -KPX Lslash Ydieresis -120 -KPX Lslash quotedblright -140 -KPX Lslash quoteright -140 -KPX Lslash y -30 -KPX Lslash yacute -30 -KPX Lslash ydieresis -30 -KPX O A -50 -KPX O Aacute -50 -KPX O Abreve -50 -KPX O Acircumflex -50 -KPX O Adieresis -50 -KPX O Agrave -50 -KPX O Amacron -50 -KPX O Aogonek -50 -KPX O Aring -50 -KPX O Atilde -50 -KPX O T -40 -KPX O Tcaron -40 -KPX O Tcommaaccent -40 -KPX O V -50 -KPX O W -50 -KPX O X -50 -KPX O Y -70 -KPX O Yacute -70 -KPX O Ydieresis -70 -KPX O comma -40 -KPX O period -40 -KPX Oacute A -50 -KPX Oacute Aacute -50 -KPX Oacute Abreve -50 -KPX Oacute Acircumflex -50 -KPX Oacute Adieresis -50 -KPX Oacute Agrave -50 -KPX Oacute Amacron -50 -KPX Oacute Aogonek -50 -KPX Oacute Aring -50 -KPX Oacute Atilde -50 -KPX Oacute T -40 -KPX Oacute Tcaron -40 -KPX Oacute Tcommaaccent -40 -KPX Oacute V -50 -KPX Oacute W -50 -KPX Oacute X -50 -KPX Oacute Y -70 -KPX Oacute Yacute -70 -KPX Oacute Ydieresis -70 -KPX Oacute comma -40 -KPX Oacute period -40 -KPX Ocircumflex A -50 -KPX Ocircumflex Aacute -50 -KPX Ocircumflex Abreve -50 -KPX Ocircumflex Acircumflex -50 -KPX Ocircumflex Adieresis -50 -KPX Ocircumflex Agrave -50 -KPX Ocircumflex Amacron -50 -KPX Ocircumflex Aogonek -50 -KPX Ocircumflex Aring -50 -KPX Ocircumflex Atilde -50 -KPX Ocircumflex T -40 -KPX Ocircumflex Tcaron -40 -KPX Ocircumflex Tcommaaccent -40 -KPX Ocircumflex V -50 -KPX Ocircumflex W -50 -KPX Ocircumflex X -50 -KPX Ocircumflex Y -70 -KPX Ocircumflex Yacute -70 -KPX Ocircumflex Ydieresis -70 -KPX Ocircumflex comma -40 -KPX Ocircumflex period -40 -KPX Odieresis A -50 -KPX Odieresis Aacute -50 -KPX Odieresis Abreve -50 -KPX Odieresis Acircumflex -50 -KPX Odieresis Adieresis -50 -KPX Odieresis Agrave -50 -KPX Odieresis Amacron -50 -KPX Odieresis Aogonek -50 -KPX Odieresis Aring -50 -KPX Odieresis Atilde -50 -KPX Odieresis T -40 -KPX Odieresis Tcaron -40 -KPX Odieresis Tcommaaccent -40 -KPX Odieresis V -50 -KPX Odieresis W -50 -KPX Odieresis X -50 -KPX Odieresis Y -70 -KPX Odieresis Yacute -70 -KPX Odieresis Ydieresis -70 -KPX Odieresis comma -40 -KPX Odieresis period -40 -KPX Ograve A -50 -KPX Ograve Aacute -50 -KPX Ograve Abreve -50 -KPX Ograve Acircumflex -50 -KPX Ograve Adieresis -50 -KPX Ograve Agrave -50 -KPX Ograve Amacron -50 -KPX Ograve Aogonek -50 -KPX Ograve Aring -50 -KPX Ograve Atilde -50 -KPX Ograve T -40 -KPX Ograve Tcaron -40 -KPX Ograve Tcommaaccent -40 -KPX Ograve V -50 -KPX Ograve W -50 -KPX Ograve X -50 -KPX Ograve Y -70 -KPX Ograve Yacute -70 -KPX Ograve Ydieresis -70 -KPX Ograve comma -40 -KPX Ograve period -40 -KPX Ohungarumlaut A -50 -KPX Ohungarumlaut Aacute -50 -KPX Ohungarumlaut Abreve -50 -KPX Ohungarumlaut Acircumflex -50 -KPX Ohungarumlaut Adieresis -50 -KPX Ohungarumlaut Agrave -50 -KPX Ohungarumlaut Amacron -50 -KPX Ohungarumlaut Aogonek -50 -KPX Ohungarumlaut Aring -50 -KPX Ohungarumlaut Atilde -50 -KPX Ohungarumlaut T -40 -KPX Ohungarumlaut Tcaron -40 -KPX Ohungarumlaut Tcommaaccent -40 -KPX Ohungarumlaut V -50 -KPX Ohungarumlaut W -50 -KPX Ohungarumlaut X -50 -KPX Ohungarumlaut Y -70 -KPX Ohungarumlaut Yacute -70 -KPX Ohungarumlaut Ydieresis -70 -KPX Ohungarumlaut comma -40 -KPX Ohungarumlaut period -40 -KPX Omacron A -50 -KPX Omacron Aacute -50 -KPX Omacron Abreve -50 -KPX Omacron Acircumflex -50 -KPX Omacron Adieresis -50 -KPX Omacron Agrave -50 -KPX Omacron Amacron -50 -KPX Omacron Aogonek -50 -KPX Omacron Aring -50 -KPX Omacron Atilde -50 -KPX Omacron T -40 -KPX Omacron Tcaron -40 -KPX Omacron Tcommaaccent -40 -KPX Omacron V -50 -KPX Omacron W -50 -KPX Omacron X -50 -KPX Omacron Y -70 -KPX Omacron Yacute -70 -KPX Omacron Ydieresis -70 -KPX Omacron comma -40 -KPX Omacron period -40 -KPX Oslash A -50 -KPX Oslash Aacute -50 -KPX Oslash Abreve -50 -KPX Oslash Acircumflex -50 -KPX Oslash Adieresis -50 -KPX Oslash Agrave -50 -KPX Oslash Amacron -50 -KPX Oslash Aogonek -50 -KPX Oslash Aring -50 -KPX Oslash Atilde -50 -KPX Oslash T -40 -KPX Oslash Tcaron -40 -KPX Oslash Tcommaaccent -40 -KPX Oslash V -50 -KPX Oslash W -50 -KPX Oslash X -50 -KPX Oslash Y -70 -KPX Oslash Yacute -70 -KPX Oslash Ydieresis -70 -KPX Oslash comma -40 -KPX Oslash period -40 -KPX Otilde A -50 -KPX Otilde Aacute -50 -KPX Otilde Abreve -50 -KPX Otilde Acircumflex -50 -KPX Otilde Adieresis -50 -KPX Otilde Agrave -50 -KPX Otilde Amacron -50 -KPX Otilde Aogonek -50 -KPX Otilde Aring -50 -KPX Otilde Atilde -50 -KPX Otilde T -40 -KPX Otilde Tcaron -40 -KPX Otilde Tcommaaccent -40 -KPX Otilde V -50 -KPX Otilde W -50 -KPX Otilde X -50 -KPX Otilde Y -70 -KPX Otilde Yacute -70 -KPX Otilde Ydieresis -70 -KPX Otilde comma -40 -KPX Otilde period -40 -KPX P A -100 -KPX P Aacute -100 -KPX P Abreve -100 -KPX P Acircumflex -100 -KPX P Adieresis -100 -KPX P Agrave -100 -KPX P Amacron -100 -KPX P Aogonek -100 -KPX P Aring -100 -KPX P Atilde -100 -KPX P a -30 -KPX P aacute -30 -KPX P abreve -30 -KPX P acircumflex -30 -KPX P adieresis -30 -KPX P agrave -30 -KPX P amacron -30 -KPX P aogonek -30 -KPX P aring -30 -KPX P atilde -30 -KPX P comma -120 -KPX P e -30 -KPX P eacute -30 -KPX P ecaron -30 -KPX P ecircumflex -30 -KPX P edieresis -30 -KPX P edotaccent -30 -KPX P egrave -30 -KPX P emacron -30 -KPX P eogonek -30 -KPX P o -40 -KPX P oacute -40 -KPX P ocircumflex -40 -KPX P odieresis -40 -KPX P ograve -40 -KPX P ohungarumlaut -40 -KPX P omacron -40 -KPX P oslash -40 -KPX P otilde -40 -KPX P period -120 -KPX Q U -10 -KPX Q Uacute -10 -KPX Q Ucircumflex -10 -KPX Q Udieresis -10 -KPX Q Ugrave -10 -KPX Q Uhungarumlaut -10 -KPX Q Umacron -10 -KPX Q Uogonek -10 -KPX Q Uring -10 -KPX Q comma 20 -KPX Q period 20 -KPX R O -20 -KPX R Oacute -20 -KPX R Ocircumflex -20 -KPX R Odieresis -20 -KPX R Ograve -20 -KPX R Ohungarumlaut -20 -KPX R Omacron -20 -KPX R Oslash -20 -KPX R Otilde -20 -KPX R T -20 -KPX R Tcaron -20 -KPX R Tcommaaccent -20 -KPX R U -20 -KPX R Uacute -20 -KPX R Ucircumflex -20 -KPX R Udieresis -20 -KPX R Ugrave -20 -KPX R Uhungarumlaut -20 -KPX R Umacron -20 -KPX R Uogonek -20 -KPX R Uring -20 -KPX R V -50 -KPX R W -40 -KPX R Y -50 -KPX R Yacute -50 -KPX R Ydieresis -50 -KPX Racute O -20 -KPX Racute Oacute -20 -KPX Racute Ocircumflex -20 -KPX Racute Odieresis -20 -KPX Racute Ograve -20 -KPX Racute Ohungarumlaut -20 -KPX Racute Omacron -20 -KPX Racute Oslash -20 -KPX Racute Otilde -20 -KPX Racute T -20 -KPX Racute Tcaron -20 -KPX Racute Tcommaaccent -20 -KPX Racute U -20 -KPX Racute Uacute -20 -KPX Racute Ucircumflex -20 -KPX Racute Udieresis -20 -KPX Racute Ugrave -20 -KPX Racute Uhungarumlaut -20 -KPX Racute Umacron -20 -KPX Racute Uogonek -20 -KPX Racute Uring -20 -KPX Racute V -50 -KPX Racute W -40 -KPX Racute Y -50 -KPX Racute Yacute -50 -KPX Racute Ydieresis -50 -KPX Rcaron O -20 -KPX Rcaron Oacute -20 -KPX Rcaron Ocircumflex -20 -KPX Rcaron Odieresis -20 -KPX Rcaron Ograve -20 -KPX Rcaron Ohungarumlaut -20 -KPX Rcaron Omacron -20 -KPX Rcaron Oslash -20 -KPX Rcaron Otilde -20 -KPX Rcaron T -20 -KPX Rcaron Tcaron -20 -KPX Rcaron Tcommaaccent -20 -KPX Rcaron U -20 -KPX Rcaron Uacute -20 -KPX Rcaron Ucircumflex -20 -KPX Rcaron Udieresis -20 -KPX Rcaron Ugrave -20 -KPX Rcaron Uhungarumlaut -20 -KPX Rcaron Umacron -20 -KPX Rcaron Uogonek -20 -KPX Rcaron Uring -20 -KPX Rcaron V -50 -KPX Rcaron W -40 -KPX Rcaron Y -50 -KPX Rcaron Yacute -50 -KPX Rcaron Ydieresis -50 -KPX Rcommaaccent O -20 -KPX Rcommaaccent Oacute -20 -KPX Rcommaaccent Ocircumflex -20 -KPX Rcommaaccent Odieresis -20 -KPX Rcommaaccent Ograve -20 -KPX Rcommaaccent Ohungarumlaut -20 -KPX Rcommaaccent Omacron -20 -KPX Rcommaaccent Oslash -20 -KPX Rcommaaccent Otilde -20 -KPX Rcommaaccent T -20 -KPX Rcommaaccent Tcaron -20 -KPX Rcommaaccent Tcommaaccent -20 -KPX Rcommaaccent U -20 -KPX Rcommaaccent Uacute -20 -KPX Rcommaaccent Ucircumflex -20 -KPX Rcommaaccent Udieresis -20 -KPX Rcommaaccent Ugrave -20 -KPX Rcommaaccent Uhungarumlaut -20 -KPX Rcommaaccent Umacron -20 -KPX Rcommaaccent Uogonek -20 -KPX Rcommaaccent Uring -20 -KPX Rcommaaccent V -50 -KPX Rcommaaccent W -40 -KPX Rcommaaccent Y -50 -KPX Rcommaaccent Yacute -50 -KPX Rcommaaccent Ydieresis -50 -KPX T A -90 -KPX T Aacute -90 -KPX T Abreve -90 -KPX T Acircumflex -90 -KPX T Adieresis -90 -KPX T Agrave -90 -KPX T Amacron -90 -KPX T Aogonek -90 -KPX T Aring -90 -KPX T Atilde -90 -KPX T O -40 -KPX T Oacute -40 -KPX T Ocircumflex -40 -KPX T Odieresis -40 -KPX T Ograve -40 -KPX T Ohungarumlaut -40 -KPX T Omacron -40 -KPX T Oslash -40 -KPX T Otilde -40 -KPX T a -80 -KPX T aacute -80 -KPX T abreve -80 -KPX T acircumflex -80 -KPX T adieresis -80 -KPX T agrave -80 -KPX T amacron -80 -KPX T aogonek -80 -KPX T aring -80 -KPX T atilde -80 -KPX T colon -40 -KPX T comma -80 -KPX T e -60 -KPX T eacute -60 -KPX T ecaron -60 -KPX T ecircumflex -60 -KPX T edieresis -60 -KPX T edotaccent -60 -KPX T egrave -60 -KPX T emacron -60 -KPX T eogonek -60 -KPX T hyphen -120 -KPX T o -80 -KPX T oacute -80 -KPX T ocircumflex -80 -KPX T odieresis -80 -KPX T ograve -80 -KPX T ohungarumlaut -80 -KPX T omacron -80 -KPX T oslash -80 -KPX T otilde -80 -KPX T period -80 -KPX T r -80 -KPX T racute -80 -KPX T rcommaaccent -80 -KPX T semicolon -40 -KPX T u -90 -KPX T uacute -90 -KPX T ucircumflex -90 -KPX T udieresis -90 -KPX T ugrave -90 -KPX T uhungarumlaut -90 -KPX T umacron -90 -KPX T uogonek -90 -KPX T uring -90 -KPX T w -60 -KPX T y -60 -KPX T yacute -60 -KPX T ydieresis -60 -KPX Tcaron A -90 -KPX Tcaron Aacute -90 -KPX Tcaron Abreve -90 -KPX Tcaron Acircumflex -90 -KPX Tcaron Adieresis -90 -KPX Tcaron Agrave -90 -KPX Tcaron Amacron -90 -KPX Tcaron Aogonek -90 -KPX Tcaron Aring -90 -KPX Tcaron Atilde -90 -KPX Tcaron O -40 -KPX Tcaron Oacute -40 -KPX Tcaron Ocircumflex -40 -KPX Tcaron Odieresis -40 -KPX Tcaron Ograve -40 -KPX Tcaron Ohungarumlaut -40 -KPX Tcaron Omacron -40 -KPX Tcaron Oslash -40 -KPX Tcaron Otilde -40 -KPX Tcaron a -80 -KPX Tcaron aacute -80 -KPX Tcaron abreve -80 -KPX Tcaron acircumflex -80 -KPX Tcaron adieresis -80 -KPX Tcaron agrave -80 -KPX Tcaron amacron -80 -KPX Tcaron aogonek -80 -KPX Tcaron aring -80 -KPX Tcaron atilde -80 -KPX Tcaron colon -40 -KPX Tcaron comma -80 -KPX Tcaron e -60 -KPX Tcaron eacute -60 -KPX Tcaron ecaron -60 -KPX Tcaron ecircumflex -60 -KPX Tcaron edieresis -60 -KPX Tcaron edotaccent -60 -KPX Tcaron egrave -60 -KPX Tcaron emacron -60 -KPX Tcaron eogonek -60 -KPX Tcaron hyphen -120 -KPX Tcaron o -80 -KPX Tcaron oacute -80 -KPX Tcaron ocircumflex -80 -KPX Tcaron odieresis -80 -KPX Tcaron ograve -80 -KPX Tcaron ohungarumlaut -80 -KPX Tcaron omacron -80 -KPX Tcaron oslash -80 -KPX Tcaron otilde -80 -KPX Tcaron period -80 -KPX Tcaron r -80 -KPX Tcaron racute -80 -KPX Tcaron rcommaaccent -80 -KPX Tcaron semicolon -40 -KPX Tcaron u -90 -KPX Tcaron uacute -90 -KPX Tcaron ucircumflex -90 -KPX Tcaron udieresis -90 -KPX Tcaron ugrave -90 -KPX Tcaron uhungarumlaut -90 -KPX Tcaron umacron -90 -KPX Tcaron uogonek -90 -KPX Tcaron uring -90 -KPX Tcaron w -60 -KPX Tcaron y -60 -KPX Tcaron yacute -60 -KPX Tcaron ydieresis -60 -KPX Tcommaaccent A -90 -KPX Tcommaaccent Aacute -90 -KPX Tcommaaccent Abreve -90 -KPX Tcommaaccent Acircumflex -90 -KPX Tcommaaccent Adieresis -90 -KPX Tcommaaccent Agrave -90 -KPX Tcommaaccent Amacron -90 -KPX Tcommaaccent Aogonek -90 -KPX Tcommaaccent Aring -90 -KPX Tcommaaccent Atilde -90 -KPX Tcommaaccent O -40 -KPX Tcommaaccent Oacute -40 -KPX Tcommaaccent Ocircumflex -40 -KPX Tcommaaccent Odieresis -40 -KPX Tcommaaccent Ograve -40 -KPX Tcommaaccent Ohungarumlaut -40 -KPX Tcommaaccent Omacron -40 -KPX Tcommaaccent Oslash -40 -KPX Tcommaaccent Otilde -40 -KPX Tcommaaccent a -80 -KPX Tcommaaccent aacute -80 -KPX Tcommaaccent abreve -80 -KPX Tcommaaccent acircumflex -80 -KPX Tcommaaccent adieresis -80 -KPX Tcommaaccent agrave -80 -KPX Tcommaaccent amacron -80 -KPX Tcommaaccent aogonek -80 -KPX Tcommaaccent aring -80 -KPX Tcommaaccent atilde -80 -KPX Tcommaaccent colon -40 -KPX Tcommaaccent comma -80 -KPX Tcommaaccent e -60 -KPX Tcommaaccent eacute -60 -KPX Tcommaaccent ecaron -60 -KPX Tcommaaccent ecircumflex -60 -KPX Tcommaaccent edieresis -60 -KPX Tcommaaccent edotaccent -60 -KPX Tcommaaccent egrave -60 -KPX Tcommaaccent emacron -60 -KPX Tcommaaccent eogonek -60 -KPX Tcommaaccent hyphen -120 -KPX Tcommaaccent o -80 -KPX Tcommaaccent oacute -80 -KPX Tcommaaccent ocircumflex -80 -KPX Tcommaaccent odieresis -80 -KPX Tcommaaccent ograve -80 -KPX Tcommaaccent ohungarumlaut -80 -KPX Tcommaaccent omacron -80 -KPX Tcommaaccent oslash -80 -KPX Tcommaaccent otilde -80 -KPX Tcommaaccent period -80 -KPX Tcommaaccent r -80 -KPX Tcommaaccent racute -80 -KPX Tcommaaccent rcommaaccent -80 -KPX Tcommaaccent semicolon -40 -KPX Tcommaaccent u -90 -KPX Tcommaaccent uacute -90 -KPX Tcommaaccent ucircumflex -90 -KPX Tcommaaccent udieresis -90 -KPX Tcommaaccent ugrave -90 -KPX Tcommaaccent uhungarumlaut -90 -KPX Tcommaaccent umacron -90 -KPX Tcommaaccent uogonek -90 -KPX Tcommaaccent uring -90 -KPX Tcommaaccent w -60 -KPX Tcommaaccent y -60 -KPX Tcommaaccent yacute -60 -KPX Tcommaaccent ydieresis -60 -KPX U A -50 -KPX U Aacute -50 -KPX U Abreve -50 -KPX U Acircumflex -50 -KPX U Adieresis -50 -KPX U Agrave -50 -KPX U Amacron -50 -KPX U Aogonek -50 -KPX U Aring -50 -KPX U Atilde -50 -KPX U comma -30 -KPX U period -30 -KPX Uacute A -50 -KPX Uacute Aacute -50 -KPX Uacute Abreve -50 -KPX Uacute Acircumflex -50 -KPX Uacute Adieresis -50 -KPX Uacute Agrave -50 -KPX Uacute Amacron -50 -KPX Uacute Aogonek -50 -KPX Uacute Aring -50 -KPX Uacute Atilde -50 -KPX Uacute comma -30 -KPX Uacute period -30 -KPX Ucircumflex A -50 -KPX Ucircumflex Aacute -50 -KPX Ucircumflex Abreve -50 -KPX Ucircumflex Acircumflex -50 -KPX Ucircumflex Adieresis -50 -KPX Ucircumflex Agrave -50 -KPX Ucircumflex Amacron -50 -KPX Ucircumflex Aogonek -50 -KPX Ucircumflex Aring -50 -KPX Ucircumflex Atilde -50 -KPX Ucircumflex comma -30 -KPX Ucircumflex period -30 -KPX Udieresis A -50 -KPX Udieresis Aacute -50 -KPX Udieresis Abreve -50 -KPX Udieresis Acircumflex -50 -KPX Udieresis Adieresis -50 -KPX Udieresis Agrave -50 -KPX Udieresis Amacron -50 -KPX Udieresis Aogonek -50 -KPX Udieresis Aring -50 -KPX Udieresis Atilde -50 -KPX Udieresis comma -30 -KPX Udieresis period -30 -KPX Ugrave A -50 -KPX Ugrave Aacute -50 -KPX Ugrave Abreve -50 -KPX Ugrave Acircumflex -50 -KPX Ugrave Adieresis -50 -KPX Ugrave Agrave -50 -KPX Ugrave Amacron -50 -KPX Ugrave Aogonek -50 -KPX Ugrave Aring -50 -KPX Ugrave Atilde -50 -KPX Ugrave comma -30 -KPX Ugrave period -30 -KPX Uhungarumlaut A -50 -KPX Uhungarumlaut Aacute -50 -KPX Uhungarumlaut Abreve -50 -KPX Uhungarumlaut Acircumflex -50 -KPX Uhungarumlaut Adieresis -50 -KPX Uhungarumlaut Agrave -50 -KPX Uhungarumlaut Amacron -50 -KPX Uhungarumlaut Aogonek -50 -KPX Uhungarumlaut Aring -50 -KPX Uhungarumlaut Atilde -50 -KPX Uhungarumlaut comma -30 -KPX Uhungarumlaut period -30 -KPX Umacron A -50 -KPX Umacron Aacute -50 -KPX Umacron Abreve -50 -KPX Umacron Acircumflex -50 -KPX Umacron Adieresis -50 -KPX Umacron Agrave -50 -KPX Umacron Amacron -50 -KPX Umacron Aogonek -50 -KPX Umacron Aring -50 -KPX Umacron Atilde -50 -KPX Umacron comma -30 -KPX Umacron period -30 -KPX Uogonek A -50 -KPX Uogonek Aacute -50 -KPX Uogonek Abreve -50 -KPX Uogonek Acircumflex -50 -KPX Uogonek Adieresis -50 -KPX Uogonek Agrave -50 -KPX Uogonek Amacron -50 -KPX Uogonek Aogonek -50 -KPX Uogonek Aring -50 -KPX Uogonek Atilde -50 -KPX Uogonek comma -30 -KPX Uogonek period -30 -KPX Uring A -50 -KPX Uring Aacute -50 -KPX Uring Abreve -50 -KPX Uring Acircumflex -50 -KPX Uring Adieresis -50 -KPX Uring Agrave -50 -KPX Uring Amacron -50 -KPX Uring Aogonek -50 -KPX Uring Aring -50 -KPX Uring Atilde -50 -KPX Uring comma -30 -KPX Uring period -30 -KPX V A -80 -KPX V Aacute -80 -KPX V Abreve -80 -KPX V Acircumflex -80 -KPX V Adieresis -80 -KPX V Agrave -80 -KPX V Amacron -80 -KPX V Aogonek -80 -KPX V Aring -80 -KPX V Atilde -80 -KPX V G -50 -KPX V Gbreve -50 -KPX V Gcommaaccent -50 -KPX V O -50 -KPX V Oacute -50 -KPX V Ocircumflex -50 -KPX V Odieresis -50 -KPX V Ograve -50 -KPX V Ohungarumlaut -50 -KPX V Omacron -50 -KPX V Oslash -50 -KPX V Otilde -50 -KPX V a -60 -KPX V aacute -60 -KPX V abreve -60 -KPX V acircumflex -60 -KPX V adieresis -60 -KPX V agrave -60 -KPX V amacron -60 -KPX V aogonek -60 -KPX V aring -60 -KPX V atilde -60 -KPX V colon -40 -KPX V comma -120 -KPX V e -50 -KPX V eacute -50 -KPX V ecaron -50 -KPX V ecircumflex -50 -KPX V edieresis -50 -KPX V edotaccent -50 -KPX V egrave -50 -KPX V emacron -50 -KPX V eogonek -50 -KPX V hyphen -80 -KPX V o -90 -KPX V oacute -90 -KPX V ocircumflex -90 -KPX V odieresis -90 -KPX V ograve -90 -KPX V ohungarumlaut -90 -KPX V omacron -90 -KPX V oslash -90 -KPX V otilde -90 -KPX V period -120 -KPX V semicolon -40 -KPX V u -60 -KPX V uacute -60 -KPX V ucircumflex -60 -KPX V udieresis -60 -KPX V ugrave -60 -KPX V uhungarumlaut -60 -KPX V umacron -60 -KPX V uogonek -60 -KPX V uring -60 -KPX W A -60 -KPX W Aacute -60 -KPX W Abreve -60 -KPX W Acircumflex -60 -KPX W Adieresis -60 -KPX W Agrave -60 -KPX W Amacron -60 -KPX W Aogonek -60 -KPX W Aring -60 -KPX W Atilde -60 -KPX W O -20 -KPX W Oacute -20 -KPX W Ocircumflex -20 -KPX W Odieresis -20 -KPX W Ograve -20 -KPX W Ohungarumlaut -20 -KPX W Omacron -20 -KPX W Oslash -20 -KPX W Otilde -20 -KPX W a -40 -KPX W aacute -40 -KPX W abreve -40 -KPX W acircumflex -40 -KPX W adieresis -40 -KPX W agrave -40 -KPX W amacron -40 -KPX W aogonek -40 -KPX W aring -40 -KPX W atilde -40 -KPX W colon -10 -KPX W comma -80 -KPX W e -35 -KPX W eacute -35 -KPX W ecaron -35 -KPX W ecircumflex -35 -KPX W edieresis -35 -KPX W edotaccent -35 -KPX W egrave -35 -KPX W emacron -35 -KPX W eogonek -35 -KPX W hyphen -40 -KPX W o -60 -KPX W oacute -60 -KPX W ocircumflex -60 -KPX W odieresis -60 -KPX W ograve -60 -KPX W ohungarumlaut -60 -KPX W omacron -60 -KPX W oslash -60 -KPX W otilde -60 -KPX W period -80 -KPX W semicolon -10 -KPX W u -45 -KPX W uacute -45 -KPX W ucircumflex -45 -KPX W udieresis -45 -KPX W ugrave -45 -KPX W uhungarumlaut -45 -KPX W umacron -45 -KPX W uogonek -45 -KPX W uring -45 -KPX W y -20 -KPX W yacute -20 -KPX W ydieresis -20 -KPX Y A -110 -KPX Y Aacute -110 -KPX Y Abreve -110 -KPX Y Acircumflex -110 -KPX Y Adieresis -110 -KPX Y Agrave -110 -KPX Y Amacron -110 -KPX Y Aogonek -110 -KPX Y Aring -110 -KPX Y Atilde -110 -KPX Y O -70 -KPX Y Oacute -70 -KPX Y Ocircumflex -70 -KPX Y Odieresis -70 -KPX Y Ograve -70 -KPX Y Ohungarumlaut -70 -KPX Y Omacron -70 -KPX Y Oslash -70 -KPX Y Otilde -70 -KPX Y a -90 -KPX Y aacute -90 -KPX Y abreve -90 -KPX Y acircumflex -90 -KPX Y adieresis -90 -KPX Y agrave -90 -KPX Y amacron -90 -KPX Y aogonek -90 -KPX Y aring -90 -KPX Y atilde -90 -KPX Y colon -50 -KPX Y comma -100 -KPX Y e -80 -KPX Y eacute -80 -KPX Y ecaron -80 -KPX Y ecircumflex -80 -KPX Y edieresis -80 -KPX Y edotaccent -80 -KPX Y egrave -80 -KPX Y emacron -80 -KPX Y eogonek -80 -KPX Y o -100 -KPX Y oacute -100 -KPX Y ocircumflex -100 -KPX Y odieresis -100 -KPX Y ograve -100 -KPX Y ohungarumlaut -100 -KPX Y omacron -100 -KPX Y oslash -100 -KPX Y otilde -100 -KPX Y period -100 -KPX Y semicolon -50 -KPX Y u -100 -KPX Y uacute -100 -KPX Y ucircumflex -100 -KPX Y udieresis -100 -KPX Y ugrave -100 -KPX Y uhungarumlaut -100 -KPX Y umacron -100 -KPX Y uogonek -100 -KPX Y uring -100 -KPX Yacute A -110 -KPX Yacute Aacute -110 -KPX Yacute Abreve -110 -KPX Yacute Acircumflex -110 -KPX Yacute Adieresis -110 -KPX Yacute Agrave -110 -KPX Yacute Amacron -110 -KPX Yacute Aogonek -110 -KPX Yacute Aring -110 -KPX Yacute Atilde -110 -KPX Yacute O -70 -KPX Yacute Oacute -70 -KPX Yacute Ocircumflex -70 -KPX Yacute Odieresis -70 -KPX Yacute Ograve -70 -KPX Yacute Ohungarumlaut -70 -KPX Yacute Omacron -70 -KPX Yacute Oslash -70 -KPX Yacute Otilde -70 -KPX Yacute a -90 -KPX Yacute aacute -90 -KPX Yacute abreve -90 -KPX Yacute acircumflex -90 -KPX Yacute adieresis -90 -KPX Yacute agrave -90 -KPX Yacute amacron -90 -KPX Yacute aogonek -90 -KPX Yacute aring -90 -KPX Yacute atilde -90 -KPX Yacute colon -50 -KPX Yacute comma -100 -KPX Yacute e -80 -KPX Yacute eacute -80 -KPX Yacute ecaron -80 -KPX Yacute ecircumflex -80 -KPX Yacute edieresis -80 -KPX Yacute edotaccent -80 -KPX Yacute egrave -80 -KPX Yacute emacron -80 -KPX Yacute eogonek -80 -KPX Yacute o -100 -KPX Yacute oacute -100 -KPX Yacute ocircumflex -100 -KPX Yacute odieresis -100 -KPX Yacute ograve -100 -KPX Yacute ohungarumlaut -100 -KPX Yacute omacron -100 -KPX Yacute oslash -100 -KPX Yacute otilde -100 -KPX Yacute period -100 -KPX Yacute semicolon -50 -KPX Yacute u -100 -KPX Yacute uacute -100 -KPX Yacute ucircumflex -100 -KPX Yacute udieresis -100 -KPX Yacute ugrave -100 -KPX Yacute uhungarumlaut -100 -KPX Yacute umacron -100 -KPX Yacute uogonek -100 -KPX Yacute uring -100 -KPX Ydieresis A -110 -KPX Ydieresis Aacute -110 -KPX Ydieresis Abreve -110 -KPX Ydieresis Acircumflex -110 -KPX Ydieresis Adieresis -110 -KPX Ydieresis Agrave -110 -KPX Ydieresis Amacron -110 -KPX Ydieresis Aogonek -110 -KPX Ydieresis Aring -110 -KPX Ydieresis Atilde -110 -KPX Ydieresis O -70 -KPX Ydieresis Oacute -70 -KPX Ydieresis Ocircumflex -70 -KPX Ydieresis Odieresis -70 -KPX Ydieresis Ograve -70 -KPX Ydieresis Ohungarumlaut -70 -KPX Ydieresis Omacron -70 -KPX Ydieresis Oslash -70 -KPX Ydieresis Otilde -70 -KPX Ydieresis a -90 -KPX Ydieresis aacute -90 -KPX Ydieresis abreve -90 -KPX Ydieresis acircumflex -90 -KPX Ydieresis adieresis -90 -KPX Ydieresis agrave -90 -KPX Ydieresis amacron -90 -KPX Ydieresis aogonek -90 -KPX Ydieresis aring -90 -KPX Ydieresis atilde -90 -KPX Ydieresis colon -50 -KPX Ydieresis comma -100 -KPX Ydieresis e -80 -KPX Ydieresis eacute -80 -KPX Ydieresis ecaron -80 -KPX Ydieresis ecircumflex -80 -KPX Ydieresis edieresis -80 -KPX Ydieresis edotaccent -80 -KPX Ydieresis egrave -80 -KPX Ydieresis emacron -80 -KPX Ydieresis eogonek -80 -KPX Ydieresis o -100 -KPX Ydieresis oacute -100 -KPX Ydieresis ocircumflex -100 -KPX Ydieresis odieresis -100 -KPX Ydieresis ograve -100 -KPX Ydieresis ohungarumlaut -100 -KPX Ydieresis omacron -100 -KPX Ydieresis oslash -100 -KPX Ydieresis otilde -100 -KPX Ydieresis period -100 -KPX Ydieresis semicolon -50 -KPX Ydieresis u -100 -KPX Ydieresis uacute -100 -KPX Ydieresis ucircumflex -100 -KPX Ydieresis udieresis -100 -KPX Ydieresis ugrave -100 -KPX Ydieresis uhungarumlaut -100 -KPX Ydieresis umacron -100 -KPX Ydieresis uogonek -100 -KPX Ydieresis uring -100 -KPX a g -10 -KPX a gbreve -10 -KPX a gcommaaccent -10 -KPX a v -15 -KPX a w -15 -KPX a y -20 -KPX a yacute -20 -KPX a ydieresis -20 -KPX aacute g -10 -KPX aacute gbreve -10 -KPX aacute gcommaaccent -10 -KPX aacute v -15 -KPX aacute w -15 -KPX aacute y -20 -KPX aacute yacute -20 -KPX aacute ydieresis -20 -KPX abreve g -10 -KPX abreve gbreve -10 -KPX abreve gcommaaccent -10 -KPX abreve v -15 -KPX abreve w -15 -KPX abreve y -20 -KPX abreve yacute -20 -KPX abreve ydieresis -20 -KPX acircumflex g -10 -KPX acircumflex gbreve -10 -KPX acircumflex gcommaaccent -10 -KPX acircumflex v -15 -KPX acircumflex w -15 -KPX acircumflex y -20 -KPX acircumflex yacute -20 -KPX acircumflex ydieresis -20 -KPX adieresis g -10 -KPX adieresis gbreve -10 -KPX adieresis gcommaaccent -10 -KPX adieresis v -15 -KPX adieresis w -15 -KPX adieresis y -20 -KPX adieresis yacute -20 -KPX adieresis ydieresis -20 -KPX agrave g -10 -KPX agrave gbreve -10 -KPX agrave gcommaaccent -10 -KPX agrave v -15 -KPX agrave w -15 -KPX agrave y -20 -KPX agrave yacute -20 -KPX agrave ydieresis -20 -KPX amacron g -10 -KPX amacron gbreve -10 -KPX amacron gcommaaccent -10 -KPX amacron v -15 -KPX amacron w -15 -KPX amacron y -20 -KPX amacron yacute -20 -KPX amacron ydieresis -20 -KPX aogonek g -10 -KPX aogonek gbreve -10 -KPX aogonek gcommaaccent -10 -KPX aogonek v -15 -KPX aogonek w -15 -KPX aogonek y -20 -KPX aogonek yacute -20 -KPX aogonek ydieresis -20 -KPX aring g -10 -KPX aring gbreve -10 -KPX aring gcommaaccent -10 -KPX aring v -15 -KPX aring w -15 -KPX aring y -20 -KPX aring yacute -20 -KPX aring ydieresis -20 -KPX atilde g -10 -KPX atilde gbreve -10 -KPX atilde gcommaaccent -10 -KPX atilde v -15 -KPX atilde w -15 -KPX atilde y -20 -KPX atilde yacute -20 -KPX atilde ydieresis -20 -KPX b l -10 -KPX b lacute -10 -KPX b lcommaaccent -10 -KPX b lslash -10 -KPX b u -20 -KPX b uacute -20 -KPX b ucircumflex -20 -KPX b udieresis -20 -KPX b ugrave -20 -KPX b uhungarumlaut -20 -KPX b umacron -20 -KPX b uogonek -20 -KPX b uring -20 -KPX b v -20 -KPX b y -20 -KPX b yacute -20 -KPX b ydieresis -20 -KPX c h -10 -KPX c k -20 -KPX c kcommaaccent -20 -KPX c l -20 -KPX c lacute -20 -KPX c lcommaaccent -20 -KPX c lslash -20 -KPX c y -10 -KPX c yacute -10 -KPX c ydieresis -10 -KPX cacute h -10 -KPX cacute k -20 -KPX cacute kcommaaccent -20 -KPX cacute l -20 -KPX cacute lacute -20 -KPX cacute lcommaaccent -20 -KPX cacute lslash -20 -KPX cacute y -10 -KPX cacute yacute -10 -KPX cacute ydieresis -10 -KPX ccaron h -10 -KPX ccaron k -20 -KPX ccaron kcommaaccent -20 -KPX ccaron l -20 -KPX ccaron lacute -20 -KPX ccaron lcommaaccent -20 -KPX ccaron lslash -20 -KPX ccaron y -10 -KPX ccaron yacute -10 -KPX ccaron ydieresis -10 -KPX ccedilla h -10 -KPX ccedilla k -20 -KPX ccedilla kcommaaccent -20 -KPX ccedilla l -20 -KPX ccedilla lacute -20 -KPX ccedilla lcommaaccent -20 -KPX ccedilla lslash -20 -KPX ccedilla y -10 -KPX ccedilla yacute -10 -KPX ccedilla ydieresis -10 -KPX colon space -40 -KPX comma quotedblright -120 -KPX comma quoteright -120 -KPX comma space -40 -KPX d d -10 -KPX d dcroat -10 -KPX d v -15 -KPX d w -15 -KPX d y -15 -KPX d yacute -15 -KPX d ydieresis -15 -KPX dcroat d -10 -KPX dcroat dcroat -10 -KPX dcroat v -15 -KPX dcroat w -15 -KPX dcroat y -15 -KPX dcroat yacute -15 -KPX dcroat ydieresis -15 -KPX e comma 10 -KPX e period 20 -KPX e v -15 -KPX e w -15 -KPX e x -15 -KPX e y -15 -KPX e yacute -15 -KPX e ydieresis -15 -KPX eacute comma 10 -KPX eacute period 20 -KPX eacute v -15 -KPX eacute w -15 -KPX eacute x -15 -KPX eacute y -15 -KPX eacute yacute -15 -KPX eacute ydieresis -15 -KPX ecaron comma 10 -KPX ecaron period 20 -KPX ecaron v -15 -KPX ecaron w -15 -KPX ecaron x -15 -KPX ecaron y -15 -KPX ecaron yacute -15 -KPX ecaron ydieresis -15 -KPX ecircumflex comma 10 -KPX ecircumflex period 20 -KPX ecircumflex v -15 -KPX ecircumflex w -15 -KPX ecircumflex x -15 -KPX ecircumflex y -15 -KPX ecircumflex yacute -15 -KPX ecircumflex ydieresis -15 -KPX edieresis comma 10 -KPX edieresis period 20 -KPX edieresis v -15 -KPX edieresis w -15 -KPX edieresis x -15 -KPX edieresis y -15 -KPX edieresis yacute -15 -KPX edieresis ydieresis -15 -KPX edotaccent comma 10 -KPX edotaccent period 20 -KPX edotaccent v -15 -KPX edotaccent w -15 -KPX edotaccent x -15 -KPX edotaccent y -15 -KPX edotaccent yacute -15 -KPX edotaccent ydieresis -15 -KPX egrave comma 10 -KPX egrave period 20 -KPX egrave v -15 -KPX egrave w -15 -KPX egrave x -15 -KPX egrave y -15 -KPX egrave yacute -15 -KPX egrave ydieresis -15 -KPX emacron comma 10 -KPX emacron period 20 -KPX emacron v -15 -KPX emacron w -15 -KPX emacron x -15 -KPX emacron y -15 -KPX emacron yacute -15 -KPX emacron ydieresis -15 -KPX eogonek comma 10 -KPX eogonek period 20 -KPX eogonek v -15 -KPX eogonek w -15 -KPX eogonek x -15 -KPX eogonek y -15 -KPX eogonek yacute -15 -KPX eogonek ydieresis -15 -KPX f comma -10 -KPX f e -10 -KPX f eacute -10 -KPX f ecaron -10 -KPX f ecircumflex -10 -KPX f edieresis -10 -KPX f edotaccent -10 -KPX f egrave -10 -KPX f emacron -10 -KPX f eogonek -10 -KPX f o -20 -KPX f oacute -20 -KPX f ocircumflex -20 -KPX f odieresis -20 -KPX f ograve -20 -KPX f ohungarumlaut -20 -KPX f omacron -20 -KPX f oslash -20 -KPX f otilde -20 -KPX f period -10 -KPX f quotedblright 30 -KPX f quoteright 30 -KPX g e 10 -KPX g eacute 10 -KPX g ecaron 10 -KPX g ecircumflex 10 -KPX g edieresis 10 -KPX g edotaccent 10 -KPX g egrave 10 -KPX g emacron 10 -KPX g eogonek 10 -KPX g g -10 -KPX g gbreve -10 -KPX g gcommaaccent -10 -KPX gbreve e 10 -KPX gbreve eacute 10 -KPX gbreve ecaron 10 -KPX gbreve ecircumflex 10 -KPX gbreve edieresis 10 -KPX gbreve edotaccent 10 -KPX gbreve egrave 10 -KPX gbreve emacron 10 -KPX gbreve eogonek 10 -KPX gbreve g -10 -KPX gbreve gbreve -10 -KPX gbreve gcommaaccent -10 -KPX gcommaaccent e 10 -KPX gcommaaccent eacute 10 -KPX gcommaaccent ecaron 10 -KPX gcommaaccent ecircumflex 10 -KPX gcommaaccent edieresis 10 -KPX gcommaaccent edotaccent 10 -KPX gcommaaccent egrave 10 -KPX gcommaaccent emacron 10 -KPX gcommaaccent eogonek 10 -KPX gcommaaccent g -10 -KPX gcommaaccent gbreve -10 -KPX gcommaaccent gcommaaccent -10 -KPX h y -20 -KPX h yacute -20 -KPX h ydieresis -20 -KPX k o -15 -KPX k oacute -15 -KPX k ocircumflex -15 -KPX k odieresis -15 -KPX k ograve -15 -KPX k ohungarumlaut -15 -KPX k omacron -15 -KPX k oslash -15 -KPX k otilde -15 -KPX kcommaaccent o -15 -KPX kcommaaccent oacute -15 -KPX kcommaaccent ocircumflex -15 -KPX kcommaaccent odieresis -15 -KPX kcommaaccent ograve -15 -KPX kcommaaccent ohungarumlaut -15 -KPX kcommaaccent omacron -15 -KPX kcommaaccent oslash -15 -KPX kcommaaccent otilde -15 -KPX l w -15 -KPX l y -15 -KPX l yacute -15 -KPX l ydieresis -15 -KPX lacute w -15 -KPX lacute y -15 -KPX lacute yacute -15 -KPX lacute ydieresis -15 -KPX lcommaaccent w -15 -KPX lcommaaccent y -15 -KPX lcommaaccent yacute -15 -KPX lcommaaccent ydieresis -15 -KPX lslash w -15 -KPX lslash y -15 -KPX lslash yacute -15 -KPX lslash ydieresis -15 -KPX m u -20 -KPX m uacute -20 -KPX m ucircumflex -20 -KPX m udieresis -20 -KPX m ugrave -20 -KPX m uhungarumlaut -20 -KPX m umacron -20 -KPX m uogonek -20 -KPX m uring -20 -KPX m y -30 -KPX m yacute -30 -KPX m ydieresis -30 -KPX n u -10 -KPX n uacute -10 -KPX n ucircumflex -10 -KPX n udieresis -10 -KPX n ugrave -10 -KPX n uhungarumlaut -10 -KPX n umacron -10 -KPX n uogonek -10 -KPX n uring -10 -KPX n v -40 -KPX n y -20 -KPX n yacute -20 -KPX n ydieresis -20 -KPX nacute u -10 -KPX nacute uacute -10 -KPX nacute ucircumflex -10 -KPX nacute udieresis -10 -KPX nacute ugrave -10 -KPX nacute uhungarumlaut -10 -KPX nacute umacron -10 -KPX nacute uogonek -10 -KPX nacute uring -10 -KPX nacute v -40 -KPX nacute y -20 -KPX nacute yacute -20 -KPX nacute ydieresis -20 -KPX ncaron u -10 -KPX ncaron uacute -10 -KPX ncaron ucircumflex -10 -KPX ncaron udieresis -10 -KPX ncaron ugrave -10 -KPX ncaron uhungarumlaut -10 -KPX ncaron umacron -10 -KPX ncaron uogonek -10 -KPX ncaron uring -10 -KPX ncaron v -40 -KPX ncaron y -20 -KPX ncaron yacute -20 -KPX ncaron ydieresis -20 -KPX ncommaaccent u -10 -KPX ncommaaccent uacute -10 -KPX ncommaaccent ucircumflex -10 -KPX ncommaaccent udieresis -10 -KPX ncommaaccent ugrave -10 -KPX ncommaaccent uhungarumlaut -10 -KPX ncommaaccent umacron -10 -KPX ncommaaccent uogonek -10 -KPX ncommaaccent uring -10 -KPX ncommaaccent v -40 -KPX ncommaaccent y -20 -KPX ncommaaccent yacute -20 -KPX ncommaaccent ydieresis -20 -KPX ntilde u -10 -KPX ntilde uacute -10 -KPX ntilde ucircumflex -10 -KPX ntilde udieresis -10 -KPX ntilde ugrave -10 -KPX ntilde uhungarumlaut -10 -KPX ntilde umacron -10 -KPX ntilde uogonek -10 -KPX ntilde uring -10 -KPX ntilde v -40 -KPX ntilde y -20 -KPX ntilde yacute -20 -KPX ntilde ydieresis -20 -KPX o v -20 -KPX o w -15 -KPX o x -30 -KPX o y -20 -KPX o yacute -20 -KPX o ydieresis -20 -KPX oacute v -20 -KPX oacute w -15 -KPX oacute x -30 -KPX oacute y -20 -KPX oacute yacute -20 -KPX oacute ydieresis -20 -KPX ocircumflex v -20 -KPX ocircumflex w -15 -KPX ocircumflex x -30 -KPX ocircumflex y -20 -KPX ocircumflex yacute -20 -KPX ocircumflex ydieresis -20 -KPX odieresis v -20 -KPX odieresis w -15 -KPX odieresis x -30 -KPX odieresis y -20 -KPX odieresis yacute -20 -KPX odieresis ydieresis -20 -KPX ograve v -20 -KPX ograve w -15 -KPX ograve x -30 -KPX ograve y -20 -KPX ograve yacute -20 -KPX ograve ydieresis -20 -KPX ohungarumlaut v -20 -KPX ohungarumlaut w -15 -KPX ohungarumlaut x -30 -KPX ohungarumlaut y -20 -KPX ohungarumlaut yacute -20 -KPX ohungarumlaut ydieresis -20 -KPX omacron v -20 -KPX omacron w -15 -KPX omacron x -30 -KPX omacron y -20 -KPX omacron yacute -20 -KPX omacron ydieresis -20 -KPX oslash v -20 -KPX oslash w -15 -KPX oslash x -30 -KPX oslash y -20 -KPX oslash yacute -20 -KPX oslash ydieresis -20 -KPX otilde v -20 -KPX otilde w -15 -KPX otilde x -30 -KPX otilde y -20 -KPX otilde yacute -20 -KPX otilde ydieresis -20 -KPX p y -15 -KPX p yacute -15 -KPX p ydieresis -15 -KPX period quotedblright -120 -KPX period quoteright -120 -KPX period space -40 -KPX quotedblright space -80 -KPX quoteleft quoteleft -46 -KPX quoteright d -80 -KPX quoteright dcroat -80 -KPX quoteright l -20 -KPX quoteright lacute -20 -KPX quoteright lcommaaccent -20 -KPX quoteright lslash -20 -KPX quoteright quoteright -46 -KPX quoteright r -40 -KPX quoteright racute -40 -KPX quoteright rcaron -40 -KPX quoteright rcommaaccent -40 -KPX quoteright s -60 -KPX quoteright sacute -60 -KPX quoteright scaron -60 -KPX quoteright scedilla -60 -KPX quoteright scommaaccent -60 -KPX quoteright space -80 -KPX quoteright v -20 -KPX r c -20 -KPX r cacute -20 -KPX r ccaron -20 -KPX r ccedilla -20 -KPX r comma -60 -KPX r d -20 -KPX r dcroat -20 -KPX r g -15 -KPX r gbreve -15 -KPX r gcommaaccent -15 -KPX r hyphen -20 -KPX r o -20 -KPX r oacute -20 -KPX r ocircumflex -20 -KPX r odieresis -20 -KPX r ograve -20 -KPX r ohungarumlaut -20 -KPX r omacron -20 -KPX r oslash -20 -KPX r otilde -20 -KPX r period -60 -KPX r q -20 -KPX r s -15 -KPX r sacute -15 -KPX r scaron -15 -KPX r scedilla -15 -KPX r scommaaccent -15 -KPX r t 20 -KPX r tcommaaccent 20 -KPX r v 10 -KPX r y 10 -KPX r yacute 10 -KPX r ydieresis 10 -KPX racute c -20 -KPX racute cacute -20 -KPX racute ccaron -20 -KPX racute ccedilla -20 -KPX racute comma -60 -KPX racute d -20 -KPX racute dcroat -20 -KPX racute g -15 -KPX racute gbreve -15 -KPX racute gcommaaccent -15 -KPX racute hyphen -20 -KPX racute o -20 -KPX racute oacute -20 -KPX racute ocircumflex -20 -KPX racute odieresis -20 -KPX racute ograve -20 -KPX racute ohungarumlaut -20 -KPX racute omacron -20 -KPX racute oslash -20 -KPX racute otilde -20 -KPX racute period -60 -KPX racute q -20 -KPX racute s -15 -KPX racute sacute -15 -KPX racute scaron -15 -KPX racute scedilla -15 -KPX racute scommaaccent -15 -KPX racute t 20 -KPX racute tcommaaccent 20 -KPX racute v 10 -KPX racute y 10 -KPX racute yacute 10 -KPX racute ydieresis 10 -KPX rcaron c -20 -KPX rcaron cacute -20 -KPX rcaron ccaron -20 -KPX rcaron ccedilla -20 -KPX rcaron comma -60 -KPX rcaron d -20 -KPX rcaron dcroat -20 -KPX rcaron g -15 -KPX rcaron gbreve -15 -KPX rcaron gcommaaccent -15 -KPX rcaron hyphen -20 -KPX rcaron o -20 -KPX rcaron oacute -20 -KPX rcaron ocircumflex -20 -KPX rcaron odieresis -20 -KPX rcaron ograve -20 -KPX rcaron ohungarumlaut -20 -KPX rcaron omacron -20 -KPX rcaron oslash -20 -KPX rcaron otilde -20 -KPX rcaron period -60 -KPX rcaron q -20 -KPX rcaron s -15 -KPX rcaron sacute -15 -KPX rcaron scaron -15 -KPX rcaron scedilla -15 -KPX rcaron scommaaccent -15 -KPX rcaron t 20 -KPX rcaron tcommaaccent 20 -KPX rcaron v 10 -KPX rcaron y 10 -KPX rcaron yacute 10 -KPX rcaron ydieresis 10 -KPX rcommaaccent c -20 -KPX rcommaaccent cacute -20 -KPX rcommaaccent ccaron -20 -KPX rcommaaccent ccedilla -20 -KPX rcommaaccent comma -60 -KPX rcommaaccent d -20 -KPX rcommaaccent dcroat -20 -KPX rcommaaccent g -15 -KPX rcommaaccent gbreve -15 -KPX rcommaaccent gcommaaccent -15 -KPX rcommaaccent hyphen -20 -KPX rcommaaccent o -20 -KPX rcommaaccent oacute -20 -KPX rcommaaccent ocircumflex -20 -KPX rcommaaccent odieresis -20 -KPX rcommaaccent ograve -20 -KPX rcommaaccent ohungarumlaut -20 -KPX rcommaaccent omacron -20 -KPX rcommaaccent oslash -20 -KPX rcommaaccent otilde -20 -KPX rcommaaccent period -60 -KPX rcommaaccent q -20 -KPX rcommaaccent s -15 -KPX rcommaaccent sacute -15 -KPX rcommaaccent scaron -15 -KPX rcommaaccent scedilla -15 -KPX rcommaaccent scommaaccent -15 -KPX rcommaaccent t 20 -KPX rcommaaccent tcommaaccent 20 -KPX rcommaaccent v 10 -KPX rcommaaccent y 10 -KPX rcommaaccent yacute 10 -KPX rcommaaccent ydieresis 10 -KPX s w -15 -KPX sacute w -15 -KPX scaron w -15 -KPX scedilla w -15 -KPX scommaaccent w -15 -KPX semicolon space -40 -KPX space T -100 -KPX space Tcaron -100 -KPX space Tcommaaccent -100 -KPX space V -80 -KPX space W -80 -KPX space Y -120 -KPX space Yacute -120 -KPX space Ydieresis -120 -KPX space quotedblleft -80 -KPX space quoteleft -60 -KPX v a -20 -KPX v aacute -20 -KPX v abreve -20 -KPX v acircumflex -20 -KPX v adieresis -20 -KPX v agrave -20 -KPX v amacron -20 -KPX v aogonek -20 -KPX v aring -20 -KPX v atilde -20 -KPX v comma -80 -KPX v o -30 -KPX v oacute -30 -KPX v ocircumflex -30 -KPX v odieresis -30 -KPX v ograve -30 -KPX v ohungarumlaut -30 -KPX v omacron -30 -KPX v oslash -30 -KPX v otilde -30 -KPX v period -80 -KPX w comma -40 -KPX w o -20 -KPX w oacute -20 -KPX w ocircumflex -20 -KPX w odieresis -20 -KPX w ograve -20 -KPX w ohungarumlaut -20 -KPX w omacron -20 -KPX w oslash -20 -KPX w otilde -20 -KPX w period -40 -KPX x e -10 -KPX x eacute -10 -KPX x ecaron -10 -KPX x ecircumflex -10 -KPX x edieresis -10 -KPX x edotaccent -10 -KPX x egrave -10 -KPX x emacron -10 -KPX x eogonek -10 -KPX y a -30 -KPX y aacute -30 -KPX y abreve -30 -KPX y acircumflex -30 -KPX y adieresis -30 -KPX y agrave -30 -KPX y amacron -30 -KPX y aogonek -30 -KPX y aring -30 -KPX y atilde -30 -KPX y comma -80 -KPX y e -10 -KPX y eacute -10 -KPX y ecaron -10 -KPX y ecircumflex -10 -KPX y edieresis -10 -KPX y edotaccent -10 -KPX y egrave -10 -KPX y emacron -10 -KPX y eogonek -10 -KPX y o -25 -KPX y oacute -25 -KPX y ocircumflex -25 -KPX y odieresis -25 -KPX y ograve -25 -KPX y ohungarumlaut -25 -KPX y omacron -25 -KPX y oslash -25 -KPX y otilde -25 -KPX y period -80 -KPX yacute a -30 -KPX yacute aacute -30 -KPX yacute abreve -30 -KPX yacute acircumflex -30 -KPX yacute adieresis -30 -KPX yacute agrave -30 -KPX yacute amacron -30 -KPX yacute aogonek -30 -KPX yacute aring -30 -KPX yacute atilde -30 -KPX yacute comma -80 -KPX yacute e -10 -KPX yacute eacute -10 -KPX yacute ecaron -10 -KPX yacute ecircumflex -10 -KPX yacute edieresis -10 -KPX yacute edotaccent -10 -KPX yacute egrave -10 -KPX yacute emacron -10 -KPX yacute eogonek -10 -KPX yacute o -25 -KPX yacute oacute -25 -KPX yacute ocircumflex -25 -KPX yacute odieresis -25 -KPX yacute ograve -25 -KPX yacute ohungarumlaut -25 -KPX yacute omacron -25 -KPX yacute oslash -25 -KPX yacute otilde -25 -KPX yacute period -80 -KPX ydieresis a -30 -KPX ydieresis aacute -30 -KPX ydieresis abreve -30 -KPX ydieresis acircumflex -30 -KPX ydieresis adieresis -30 -KPX ydieresis agrave -30 -KPX ydieresis amacron -30 -KPX ydieresis aogonek -30 -KPX ydieresis aring -30 -KPX ydieresis atilde -30 -KPX ydieresis comma -80 -KPX ydieresis e -10 -KPX ydieresis eacute -10 -KPX ydieresis ecaron -10 -KPX ydieresis ecircumflex -10 -KPX ydieresis edieresis -10 -KPX ydieresis edotaccent -10 -KPX ydieresis egrave -10 -KPX ydieresis emacron -10 -KPX ydieresis eogonek -10 -KPX ydieresis o -25 -KPX ydieresis oacute -25 -KPX ydieresis ocircumflex -25 -KPX ydieresis odieresis -25 -KPX ydieresis ograve -25 -KPX ydieresis ohungarumlaut -25 -KPX ydieresis omacron -25 -KPX ydieresis oslash -25 -KPX ydieresis otilde -25 -KPX ydieresis period -80 -KPX z e 10 -KPX z eacute 10 -KPX z ecaron 10 -KPX z ecircumflex 10 -KPX z edieresis 10 -KPX z edotaccent 10 -KPX z egrave 10 -KPX z emacron 10 -KPX z eogonek 10 -KPX zacute e 10 -KPX zacute eacute 10 -KPX zacute ecaron 10 -KPX zacute ecircumflex 10 -KPX zacute edieresis 10 -KPX zacute edotaccent 10 -KPX zacute egrave 10 -KPX zacute emacron 10 -KPX zacute eogonek 10 -KPX zcaron e 10 -KPX zcaron eacute 10 -KPX zcaron ecaron 10 -KPX zcaron ecircumflex 10 -KPX zcaron edieresis 10 -KPX zcaron edotaccent 10 -KPX zcaron egrave 10 -KPX zcaron emacron 10 -KPX zcaron eogonek 10 -KPX zdotaccent e 10 -KPX zdotaccent eacute 10 -KPX zdotaccent ecaron 10 -KPX zdotaccent ecircumflex 10 -KPX zdotaccent edieresis 10 -KPX zdotaccent edotaccent 10 -KPX zdotaccent egrave 10 -KPX zdotaccent emacron 10 -KPX zdotaccent eogonek 10 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Helvetica-Oblique.afm b/vendor/dompdf/dompdf/lib/fonts/Helvetica-Oblique.afm deleted file mode 100644 index 08bc2e5..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Helvetica-Oblique.afm +++ /dev/null @@ -1,3053 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 1 12:44:31 1997 -Comment UniqueID 43055 -Comment VMusage 14960 69346 -FontName Helvetica-Oblique -FullName Helvetica Oblique -FamilyName Helvetica -Weight Medium -ItalicAngle -12 -IsFixedPitch false -CharacterSet ExtendedRoman -FontBBox -170 -225 1116 931 -UnderlinePosition -100 -UnderlineThickness 50 -Version 002.000 -Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. -EncodingScheme WinAnsiEncoding -CapHeight 718 -XHeight 523 -Ascender 718 -Descender -207 -StdHW 76 -StdVW 88 -StartCharMetrics 317 -C 32 ; WX 278 ; N space ; B 0 0 0 0 ; -C 160 ; WX 278 ; N space ; B 0 0 0 0 ; -C 33 ; WX 278 ; N exclam ; B 90 0 340 718 ; -C 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ; -C 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ; -C 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ; -C 37 ; WX 889 ; N percent ; B 147 -19 889 703 ; -C 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ; -C 146 ; WX 222 ; N quoteright ; B 151 463 310 718 ; -C 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ; -C 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ; -C 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ; -C 43 ; WX 584 ; N plus ; B 85 0 606 505 ; -C 44 ; WX 278 ; N comma ; B 56 -147 214 106 ; -C 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ; -C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; -C 46 ; WX 278 ; N period ; B 87 0 214 106 ; -C 47 ; WX 278 ; N slash ; B -21 -19 452 737 ; -C 48 ; WX 556 ; N zero ; B 93 -19 608 703 ; -C 49 ; WX 556 ; N one ; B 207 0 508 703 ; -C 50 ; WX 556 ; N two ; B 26 0 617 703 ; -C 51 ; WX 556 ; N three ; B 75 -19 610 703 ; -C 52 ; WX 556 ; N four ; B 61 0 576 703 ; -C 53 ; WX 556 ; N five ; B 68 -19 621 688 ; -C 54 ; WX 556 ; N six ; B 91 -19 615 703 ; -C 55 ; WX 556 ; N seven ; B 137 0 669 688 ; -C 56 ; WX 556 ; N eight ; B 74 -19 607 703 ; -C 57 ; WX 556 ; N nine ; B 82 -19 609 703 ; -C 58 ; WX 278 ; N colon ; B 87 0 301 516 ; -C 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ; -C 60 ; WX 584 ; N less ; B 94 11 641 495 ; -C 61 ; WX 584 ; N equal ; B 63 115 628 390 ; -C 62 ; WX 584 ; N greater ; B 50 11 597 495 ; -C 63 ; WX 556 ; N question ; B 161 0 610 727 ; -C 64 ; WX 1015 ; N at ; B 215 -19 965 737 ; -C 65 ; WX 667 ; N A ; B 14 0 654 718 ; -C 66 ; WX 667 ; N B ; B 74 0 712 718 ; -C 67 ; WX 722 ; N C ; B 108 -19 782 737 ; -C 68 ; WX 722 ; N D ; B 81 0 764 718 ; -C 69 ; WX 667 ; N E ; B 86 0 762 718 ; -C 70 ; WX 611 ; N F ; B 86 0 736 718 ; -C 71 ; WX 778 ; N G ; B 111 -19 799 737 ; -C 72 ; WX 722 ; N H ; B 77 0 799 718 ; -C 73 ; WX 278 ; N I ; B 91 0 341 718 ; -C 74 ; WX 500 ; N J ; B 47 -19 581 718 ; -C 75 ; WX 667 ; N K ; B 76 0 808 718 ; -C 76 ; WX 556 ; N L ; B 76 0 555 718 ; -C 77 ; WX 833 ; N M ; B 73 0 914 718 ; -C 78 ; WX 722 ; N N ; B 76 0 799 718 ; -C 79 ; WX 778 ; N O ; B 105 -19 826 737 ; -C 80 ; WX 667 ; N P ; B 86 0 737 718 ; -C 81 ; WX 778 ; N Q ; B 105 -56 826 737 ; -C 82 ; WX 722 ; N R ; B 88 0 773 718 ; -C 83 ; WX 667 ; N S ; B 90 -19 713 737 ; -C 84 ; WX 611 ; N T ; B 148 0 750 718 ; -C 85 ; WX 722 ; N U ; B 123 -19 797 718 ; -C 86 ; WX 667 ; N V ; B 173 0 800 718 ; -C 87 ; WX 944 ; N W ; B 169 0 1081 718 ; -C 88 ; WX 667 ; N X ; B 19 0 790 718 ; -C 89 ; WX 667 ; N Y ; B 167 0 806 718 ; -C 90 ; WX 611 ; N Z ; B 23 0 741 718 ; -C 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ; -C 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ; -C 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ; -C 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ; -C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; -C 145 ; WX 222 ; N quoteleft ; B 165 470 323 725 ; -C 97 ; WX 556 ; N a ; B 61 -15 559 538 ; -C 98 ; WX 556 ; N b ; B 58 -15 584 718 ; -C 99 ; WX 500 ; N c ; B 74 -15 553 538 ; -C 100 ; WX 556 ; N d ; B 84 -15 652 718 ; -C 101 ; WX 556 ; N e ; B 84 -15 578 538 ; -C 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ; -C 103 ; WX 556 ; N g ; B 42 -220 610 538 ; -C 104 ; WX 556 ; N h ; B 65 0 573 718 ; -C 105 ; WX 222 ; N i ; B 67 0 308 718 ; -C 106 ; WX 222 ; N j ; B -60 -210 308 718 ; -C 107 ; WX 500 ; N k ; B 67 0 600 718 ; -C 108 ; WX 222 ; N l ; B 67 0 308 718 ; -C 109 ; WX 833 ; N m ; B 65 0 852 538 ; -C 110 ; WX 556 ; N n ; B 65 0 573 538 ; -C 111 ; WX 556 ; N o ; B 83 -14 585 538 ; -C 112 ; WX 556 ; N p ; B 14 -207 584 538 ; -C 113 ; WX 556 ; N q ; B 84 -207 605 538 ; -C 114 ; WX 333 ; N r ; B 77 0 446 538 ; -C 115 ; WX 500 ; N s ; B 63 -15 529 538 ; -C 116 ; WX 278 ; N t ; B 102 -7 368 669 ; -C 117 ; WX 556 ; N u ; B 94 -15 600 523 ; -C 118 ; WX 500 ; N v ; B 119 0 603 523 ; -C 119 ; WX 722 ; N w ; B 125 0 820 523 ; -C 120 ; WX 500 ; N x ; B 11 0 594 523 ; -C 121 ; WX 500 ; N y ; B 15 -214 600 523 ; -C 122 ; WX 500 ; N z ; B 31 0 571 523 ; -C 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ; -C 124 ; WX 260 ; N bar ; B 46 -225 332 775 ; -C 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ; -C 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ; -C 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ; -C 162 ; WX 556 ; N cent ; B 95 -115 584 623 ; -C 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ; -C -1 ; WX 167 ; N fraction ; B -170 -19 482 703 ; -C 165 ; WX 556 ; N yen ; B 81 0 699 688 ; -C 131 ; WX 556 ; N florin ; B -52 -207 654 737 ; -C 167 ; WX 556 ; N section ; B 76 -191 584 737 ; -C 164 ; WX 556 ; N currency ; B 60 99 646 603 ; -C 39 ; WX 191 ; N quotesingle ; B 157 463 285 718 ; -C 147 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ; -C 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ; -C 139 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ; -C 155 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ; -C -1 ; WX 500 ; N fi ; B 86 0 587 728 ; -C -1 ; WX 500 ; N fl ; B 86 0 585 728 ; -C 150 ; WX 556 ; N endash ; B 51 240 623 313 ; -C 134 ; WX 556 ; N dagger ; B 135 -159 622 718 ; -C 135 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ; -C 183 ; WX 278 ; N periodcentered ; B 129 190 257 315 ; -C 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ; -C 149 ; WX 350 ; N bullet ; B 91 202 413 517 ; -C 130 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ; -C 132 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ; -C 148 ; WX 333 ; N quotedblright ; B 124 463 448 718 ; -C 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ; -C 133 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ; -C 137 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ; -C 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ; -C 96 ; WX 333 ; N grave ; B 170 593 337 734 ; -C 180 ; WX 333 ; N acute ; B 248 593 475 734 ; -C 136 ; WX 333 ; N circumflex ; B 147 593 438 734 ; -C 152 ; WX 333 ; N tilde ; B 125 606 490 722 ; -C 175 ; WX 333 ; N macron ; B 143 627 468 684 ; -C -1 ; WX 333 ; N breve ; B 167 595 476 731 ; -C -1 ; WX 333 ; N dotaccent ; B 249 604 362 706 ; -C 168 ; WX 333 ; N dieresis ; B 168 604 443 706 ; -C -1 ; WX 333 ; N ring ; B 214 572 402 756 ; -C 184 ; WX 333 ; N cedilla ; B 2 -225 232 0 ; -C -1 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ; -C -1 ; WX 333 ; N ogonek ; B 43 -225 249 0 ; -C -1 ; WX 333 ; N caron ; B 177 593 468 734 ; -C 151 ; WX 1000 ; N emdash ; B 51 240 1067 313 ; -C 198 ; WX 1000 ; N AE ; B 8 0 1097 718 ; -C 170 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ; -C -1 ; WX 556 ; N Lslash ; B 41 0 555 718 ; -C 216 ; WX 778 ; N Oslash ; B 43 -19 890 737 ; -C 140 ; WX 1000 ; N OE ; B 98 -19 1116 737 ; -C 186 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ; -C 230 ; WX 889 ; N ae ; B 61 -15 909 538 ; -C -1 ; WX 278 ; N dotlessi ; B 95 0 294 523 ; -C -1 ; WX 222 ; N lslash ; B 41 0 347 718 ; -C 248 ; WX 611 ; N oslash ; B 29 -22 647 545 ; -C 156 ; WX 944 ; N oe ; B 83 -15 964 538 ; -C 223 ; WX 611 ; N germandbls ; B 67 -15 658 728 ; -C 207 ; WX 278 ; N Idieresis ; B 91 0 458 901 ; -C 233 ; WX 556 ; N eacute ; B 84 -15 587 734 ; -C -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ; -C -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ; -C -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ; -C 159 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ; -C 247 ; WX 584 ; N divide ; B 85 -19 606 524 ; -C 221 ; WX 667 ; N Yacute ; B 167 0 806 929 ; -C 194 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; -C 225 ; WX 556 ; N aacute ; B 61 -15 587 734 ; -C 219 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ; -C 253 ; WX 500 ; N yacute ; B 15 -214 600 734 ; -C -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ; -C 234 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ; -C -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ; -C 220 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ; -C -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ; -C 218 ; WX 722 ; N Uacute ; B 123 -19 797 929 ; -C -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ; -C 203 ; WX 667 ; N Edieresis ; B 86 0 762 901 ; -C -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ; -C -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ; -C 169 ; WX 737 ; N copyright ; B 54 -19 837 737 ; -C -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ; -C -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ; -C 229 ; WX 556 ; N aring ; B 61 -15 559 756 ; -C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ; -C -1 ; WX 222 ; N lacute ; B 67 0 461 929 ; -C 224 ; WX 556 ; N agrave ; B 61 -15 559 734 ; -C -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ; -C -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ; -C 227 ; WX 556 ; N atilde ; B 61 -15 592 722 ; -C -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ; -C 154 ; WX 500 ; N scaron ; B 63 -15 552 734 ; -C -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ; -C 237 ; WX 278 ; N iacute ; B 95 0 448 734 ; -C -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ; -C -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ; -C -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ; -C 251 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ; -C 226 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ; -C -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ; -C -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ; -C 231 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ; -C -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ; -C 222 ; WX 667 ; N Thorn ; B 86 0 712 718 ; -C -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ; -C -1 ; WX 722 ; N Racute ; B 88 0 773 929 ; -C -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ; -C -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ; -C -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ; -C -1 ; WX 556 ; N uring ; B 94 -15 600 756 ; -C 179 ; WX 333 ; N threesuperior ; B 90 270 436 703 ; -C 210 ; WX 778 ; N Ograve ; B 105 -19 826 929 ; -C 192 ; WX 667 ; N Agrave ; B 14 0 654 929 ; -C -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ; -C 215 ; WX 584 ; N multiply ; B 50 0 642 506 ; -C 250 ; WX 556 ; N uacute ; B 94 -15 600 734 ; -C -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ; -C -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ; -C 255 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ; -C -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ; -C 238 ; WX 278 ; N icircumflex ; B 95 0 411 734 ; -C 202 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ; -C 228 ; WX 556 ; N adieresis ; B 61 -15 559 706 ; -C 235 ; WX 556 ; N edieresis ; B 84 -15 578 706 ; -C -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ; -C -1 ; WX 556 ; N nacute ; B 65 0 587 734 ; -C -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ; -C -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ; -C 205 ; WX 278 ; N Iacute ; B 91 0 489 929 ; -C 177 ; WX 584 ; N plusminus ; B 39 0 618 506 ; -C 166 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ; -C 174 ; WX 737 ; N registered ; B 54 -19 837 737 ; -C -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ; -C -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ; -C -1 ; WX 600 ; N summation ; B 15 -10 671 706 ; -C 200 ; WX 667 ; N Egrave ; B 86 0 762 929 ; -C -1 ; WX 333 ; N racute ; B 77 0 475 734 ; -C -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ; -C -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ; -C 142 ; WX 611 ; N Zcaron ; B 23 0 741 929 ; -C -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ; -C 208 ; WX 722 ; N Eth ; B 69 0 764 718 ; -C 199 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ; -C -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ; -C -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ; -C -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ; -C -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ; -C 193 ; WX 667 ; N Aacute ; B 14 0 683 929 ; -C 196 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; -C 232 ; WX 556 ; N egrave ; B 84 -15 578 734 ; -C -1 ; WX 500 ; N zacute ; B 31 0 571 734 ; -C -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ; -C 211 ; WX 778 ; N Oacute ; B 105 -19 826 929 ; -C 243 ; WX 556 ; N oacute ; B 83 -14 587 734 ; -C -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ; -C -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ; -C 239 ; WX 278 ; N idieresis ; B 95 0 416 706 ; -C 212 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ; -C 217 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ; -C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; -C 254 ; WX 556 ; N thorn ; B 14 -207 584 718 ; -C 178 ; WX 333 ; N twosuperior ; B 64 281 449 703 ; -C 214 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ; -C 181 ; WX 556 ; N mu ; B 24 -207 600 523 ; -C 236 ; WX 278 ; N igrave ; B 95 0 310 734 ; -C -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ; -C -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ; -C -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ; -C 190 ; WX 834 ; N threequarters ; B 130 -19 861 703 ; -C -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ; -C -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ; -C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ; -C -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ; -C 153 ; WX 1000 ; N trademark ; B 186 306 1056 718 ; -C -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ; -C 204 ; WX 278 ; N Igrave ; B 91 0 351 929 ; -C -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ; -C -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ; -C 189 ; WX 834 ; N onehalf ; B 114 -19 839 703 ; -C -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ; -C 244 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ; -C 241 ; WX 556 ; N ntilde ; B 65 0 592 722 ; -C -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ; -C 201 ; WX 667 ; N Eacute ; B 86 0 762 929 ; -C -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ; -C -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ; -C 188 ; WX 834 ; N onequarter ; B 150 -19 802 703 ; -C 138 ; WX 667 ; N Scaron ; B 90 -19 713 929 ; -C -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ; -C -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ; -C 176 ; WX 400 ; N degree ; B 169 411 468 703 ; -C 242 ; WX 556 ; N ograve ; B 83 -14 585 734 ; -C -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ; -C 249 ; WX 556 ; N ugrave ; B 94 -15 600 734 ; -C -1 ; WX 453 ; N radical ; B 79 -80 617 762 ; -C -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ; -C -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ; -C 209 ; WX 722 ; N Ntilde ; B 76 0 799 917 ; -C 245 ; WX 556 ; N otilde ; B 83 -14 602 722 ; -C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ; -C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ; -C 195 ; WX 667 ; N Atilde ; B 14 0 699 917 ; -C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; -C 197 ; WX 667 ; N Aring ; B 14 0 654 931 ; -C 213 ; WX 778 ; N Otilde ; B 105 -19 826 917 ; -C -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ; -C -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ; -C -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ; -C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ; -C -1 ; WX 584 ; N minus ; B 85 216 606 289 ; -C 206 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ; -C -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ; -C -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ; -C 172 ; WX 584 ; N logicalnot ; B 106 108 628 390 ; -C 246 ; WX 556 ; N odieresis ; B 83 -14 585 706 ; -C 252 ; WX 556 ; N udieresis ; B 94 -15 600 706 ; -C -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ; -C -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ; -C 240 ; WX 556 ; N eth ; B 81 -15 617 737 ; -C 158 ; WX 500 ; N zcaron ; B 31 0 571 734 ; -C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ; -C 185 ; WX 333 ; N onesuperior ; B 166 281 371 703 ; -C -1 ; WX 278 ; N imacron ; B 95 0 417 684 ; -C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -StartKernData -StartKernPairs 2705 -KPX A C -30 -KPX A Cacute -30 -KPX A Ccaron -30 -KPX A Ccedilla -30 -KPX A G -30 -KPX A Gbreve -30 -KPX A Gcommaaccent -30 -KPX A O -30 -KPX A Oacute -30 -KPX A Ocircumflex -30 -KPX A Odieresis -30 -KPX A Ograve -30 -KPX A Ohungarumlaut -30 -KPX A Omacron -30 -KPX A Oslash -30 -KPX A Otilde -30 -KPX A Q -30 -KPX A T -120 -KPX A Tcaron -120 -KPX A Tcommaaccent -120 -KPX A U -50 -KPX A Uacute -50 -KPX A Ucircumflex -50 -KPX A Udieresis -50 -KPX A Ugrave -50 -KPX A Uhungarumlaut -50 -KPX A Umacron -50 -KPX A Uogonek -50 -KPX A Uring -50 -KPX A V -70 -KPX A W -50 -KPX A Y -100 -KPX A Yacute -100 -KPX A Ydieresis -100 -KPX A u -30 -KPX A uacute -30 -KPX A ucircumflex -30 -KPX A udieresis -30 -KPX A ugrave -30 -KPX A uhungarumlaut -30 -KPX A umacron -30 -KPX A uogonek -30 -KPX A uring -30 -KPX A v -40 -KPX A w -40 -KPX A y -40 -KPX A yacute -40 -KPX A ydieresis -40 -KPX Aacute C -30 -KPX Aacute Cacute -30 -KPX Aacute Ccaron -30 -KPX Aacute Ccedilla -30 -KPX Aacute G -30 -KPX Aacute Gbreve -30 -KPX Aacute Gcommaaccent -30 -KPX Aacute O -30 -KPX Aacute Oacute -30 -KPX Aacute Ocircumflex -30 -KPX Aacute Odieresis -30 -KPX Aacute Ograve -30 -KPX Aacute Ohungarumlaut -30 -KPX Aacute Omacron -30 -KPX Aacute Oslash -30 -KPX Aacute Otilde -30 -KPX Aacute Q -30 -KPX Aacute T -120 -KPX Aacute Tcaron -120 -KPX Aacute Tcommaaccent -120 -KPX Aacute U -50 -KPX Aacute Uacute -50 -KPX Aacute Ucircumflex -50 -KPX Aacute Udieresis -50 -KPX Aacute Ugrave -50 -KPX Aacute Uhungarumlaut -50 -KPX Aacute Umacron -50 -KPX Aacute Uogonek -50 -KPX Aacute Uring -50 -KPX Aacute V -70 -KPX Aacute W -50 -KPX Aacute Y -100 -KPX Aacute Yacute -100 -KPX Aacute Ydieresis -100 -KPX Aacute u -30 -KPX Aacute uacute -30 -KPX Aacute ucircumflex -30 -KPX Aacute udieresis -30 -KPX Aacute ugrave -30 -KPX Aacute uhungarumlaut -30 -KPX Aacute umacron -30 -KPX Aacute uogonek -30 -KPX Aacute uring -30 -KPX Aacute v -40 -KPX Aacute w -40 -KPX Aacute y -40 -KPX Aacute yacute -40 -KPX Aacute ydieresis -40 -KPX Abreve C -30 -KPX Abreve Cacute -30 -KPX Abreve Ccaron -30 -KPX Abreve Ccedilla -30 -KPX Abreve G -30 -KPX Abreve Gbreve -30 -KPX Abreve Gcommaaccent -30 -KPX Abreve O -30 -KPX Abreve Oacute -30 -KPX Abreve Ocircumflex -30 -KPX Abreve Odieresis -30 -KPX Abreve Ograve -30 -KPX Abreve Ohungarumlaut -30 -KPX Abreve Omacron -30 -KPX Abreve Oslash -30 -KPX Abreve Otilde -30 -KPX Abreve Q -30 -KPX Abreve T -120 -KPX Abreve Tcaron -120 -KPX Abreve Tcommaaccent -120 -KPX Abreve U -50 -KPX Abreve Uacute -50 -KPX Abreve Ucircumflex -50 -KPX Abreve Udieresis -50 -KPX Abreve Ugrave -50 -KPX Abreve Uhungarumlaut -50 -KPX Abreve Umacron -50 -KPX Abreve Uogonek -50 -KPX Abreve Uring -50 -KPX Abreve V -70 -KPX Abreve W -50 -KPX Abreve Y -100 -KPX Abreve Yacute -100 -KPX Abreve Ydieresis -100 -KPX Abreve u -30 -KPX Abreve uacute -30 -KPX Abreve ucircumflex -30 -KPX Abreve udieresis -30 -KPX Abreve ugrave -30 -KPX Abreve uhungarumlaut -30 -KPX Abreve umacron -30 -KPX Abreve uogonek -30 -KPX Abreve uring -30 -KPX Abreve v -40 -KPX Abreve w -40 -KPX Abreve y -40 -KPX Abreve yacute -40 -KPX Abreve ydieresis -40 -KPX Acircumflex C -30 -KPX Acircumflex Cacute -30 -KPX Acircumflex Ccaron -30 -KPX Acircumflex Ccedilla -30 -KPX Acircumflex G -30 -KPX Acircumflex Gbreve -30 -KPX Acircumflex Gcommaaccent -30 -KPX Acircumflex O -30 -KPX Acircumflex Oacute -30 -KPX Acircumflex Ocircumflex -30 -KPX Acircumflex Odieresis -30 -KPX Acircumflex Ograve -30 -KPX Acircumflex Ohungarumlaut -30 -KPX Acircumflex Omacron -30 -KPX Acircumflex Oslash -30 -KPX Acircumflex Otilde -30 -KPX Acircumflex Q -30 -KPX Acircumflex T -120 -KPX Acircumflex Tcaron -120 -KPX Acircumflex Tcommaaccent -120 -KPX Acircumflex U -50 -KPX Acircumflex Uacute -50 -KPX Acircumflex Ucircumflex -50 -KPX Acircumflex Udieresis -50 -KPX Acircumflex Ugrave -50 -KPX Acircumflex Uhungarumlaut -50 -KPX Acircumflex Umacron -50 -KPX Acircumflex Uogonek -50 -KPX Acircumflex Uring -50 -KPX Acircumflex V -70 -KPX Acircumflex W -50 -KPX Acircumflex Y -100 -KPX Acircumflex Yacute -100 -KPX Acircumflex Ydieresis -100 -KPX Acircumflex u -30 -KPX Acircumflex uacute -30 -KPX Acircumflex ucircumflex -30 -KPX Acircumflex udieresis -30 -KPX Acircumflex ugrave -30 -KPX Acircumflex uhungarumlaut -30 -KPX Acircumflex umacron -30 -KPX Acircumflex uogonek -30 -KPX Acircumflex uring -30 -KPX Acircumflex v -40 -KPX Acircumflex w -40 -KPX Acircumflex y -40 -KPX Acircumflex yacute -40 -KPX Acircumflex ydieresis -40 -KPX Adieresis C -30 -KPX Adieresis Cacute -30 -KPX Adieresis Ccaron -30 -KPX Adieresis Ccedilla -30 -KPX Adieresis G -30 -KPX Adieresis Gbreve -30 -KPX Adieresis Gcommaaccent -30 -KPX Adieresis O -30 -KPX Adieresis Oacute -30 -KPX Adieresis Ocircumflex -30 -KPX Adieresis Odieresis -30 -KPX Adieresis Ograve -30 -KPX Adieresis Ohungarumlaut -30 -KPX Adieresis Omacron -30 -KPX Adieresis Oslash -30 -KPX Adieresis Otilde -30 -KPX Adieresis Q -30 -KPX Adieresis T -120 -KPX Adieresis Tcaron -120 -KPX Adieresis Tcommaaccent -120 -KPX Adieresis U -50 -KPX Adieresis Uacute -50 -KPX Adieresis Ucircumflex -50 -KPX Adieresis Udieresis -50 -KPX Adieresis Ugrave -50 -KPX Adieresis Uhungarumlaut -50 -KPX Adieresis Umacron -50 -KPX Adieresis Uogonek -50 -KPX Adieresis Uring -50 -KPX Adieresis V -70 -KPX Adieresis W -50 -KPX Adieresis Y -100 -KPX Adieresis Yacute -100 -KPX Adieresis Ydieresis -100 -KPX Adieresis u -30 -KPX Adieresis uacute -30 -KPX Adieresis ucircumflex -30 -KPX Adieresis udieresis -30 -KPX Adieresis ugrave -30 -KPX Adieresis uhungarumlaut -30 -KPX Adieresis umacron -30 -KPX Adieresis uogonek -30 -KPX Adieresis uring -30 -KPX Adieresis v -40 -KPX Adieresis w -40 -KPX Adieresis y -40 -KPX Adieresis yacute -40 -KPX Adieresis ydieresis -40 -KPX Agrave C -30 -KPX Agrave Cacute -30 -KPX Agrave Ccaron -30 -KPX Agrave Ccedilla -30 -KPX Agrave G -30 -KPX Agrave Gbreve -30 -KPX Agrave Gcommaaccent -30 -KPX Agrave O -30 -KPX Agrave Oacute -30 -KPX Agrave Ocircumflex -30 -KPX Agrave Odieresis -30 -KPX Agrave Ograve -30 -KPX Agrave Ohungarumlaut -30 -KPX Agrave Omacron -30 -KPX Agrave Oslash -30 -KPX Agrave Otilde -30 -KPX Agrave Q -30 -KPX Agrave T -120 -KPX Agrave Tcaron -120 -KPX Agrave Tcommaaccent -120 -KPX Agrave U -50 -KPX Agrave Uacute -50 -KPX Agrave Ucircumflex -50 -KPX Agrave Udieresis -50 -KPX Agrave Ugrave -50 -KPX Agrave Uhungarumlaut -50 -KPX Agrave Umacron -50 -KPX Agrave Uogonek -50 -KPX Agrave Uring -50 -KPX Agrave V -70 -KPX Agrave W -50 -KPX Agrave Y -100 -KPX Agrave Yacute -100 -KPX Agrave Ydieresis -100 -KPX Agrave u -30 -KPX Agrave uacute -30 -KPX Agrave ucircumflex -30 -KPX Agrave udieresis -30 -KPX Agrave ugrave -30 -KPX Agrave uhungarumlaut -30 -KPX Agrave umacron -30 -KPX Agrave uogonek -30 -KPX Agrave uring -30 -KPX Agrave v -40 -KPX Agrave w -40 -KPX Agrave y -40 -KPX Agrave yacute -40 -KPX Agrave ydieresis -40 -KPX Amacron C -30 -KPX Amacron Cacute -30 -KPX Amacron Ccaron -30 -KPX Amacron Ccedilla -30 -KPX Amacron G -30 -KPX Amacron Gbreve -30 -KPX Amacron Gcommaaccent -30 -KPX Amacron O -30 -KPX Amacron Oacute -30 -KPX Amacron Ocircumflex -30 -KPX Amacron Odieresis -30 -KPX Amacron Ograve -30 -KPX Amacron Ohungarumlaut -30 -KPX Amacron Omacron -30 -KPX Amacron Oslash -30 -KPX Amacron Otilde -30 -KPX Amacron Q -30 -KPX Amacron T -120 -KPX Amacron Tcaron -120 -KPX Amacron Tcommaaccent -120 -KPX Amacron U -50 -KPX Amacron Uacute -50 -KPX Amacron Ucircumflex -50 -KPX Amacron Udieresis -50 -KPX Amacron Ugrave -50 -KPX Amacron Uhungarumlaut -50 -KPX Amacron Umacron -50 -KPX Amacron Uogonek -50 -KPX Amacron Uring -50 -KPX Amacron V -70 -KPX Amacron W -50 -KPX Amacron Y -100 -KPX Amacron Yacute -100 -KPX Amacron Ydieresis -100 -KPX Amacron u -30 -KPX Amacron uacute -30 -KPX Amacron ucircumflex -30 -KPX Amacron udieresis -30 -KPX Amacron ugrave -30 -KPX Amacron uhungarumlaut -30 -KPX Amacron umacron -30 -KPX Amacron uogonek -30 -KPX Amacron uring -30 -KPX Amacron v -40 -KPX Amacron w -40 -KPX Amacron y -40 -KPX Amacron yacute -40 -KPX Amacron ydieresis -40 -KPX Aogonek C -30 -KPX Aogonek Cacute -30 -KPX Aogonek Ccaron -30 -KPX Aogonek Ccedilla -30 -KPX Aogonek G -30 -KPX Aogonek Gbreve -30 -KPX Aogonek Gcommaaccent -30 -KPX Aogonek O -30 -KPX Aogonek Oacute -30 -KPX Aogonek Ocircumflex -30 -KPX Aogonek Odieresis -30 -KPX Aogonek Ograve -30 -KPX Aogonek Ohungarumlaut -30 -KPX Aogonek Omacron -30 -KPX Aogonek Oslash -30 -KPX Aogonek Otilde -30 -KPX Aogonek Q -30 -KPX Aogonek T -120 -KPX Aogonek Tcaron -120 -KPX Aogonek Tcommaaccent -120 -KPX Aogonek U -50 -KPX Aogonek Uacute -50 -KPX Aogonek Ucircumflex -50 -KPX Aogonek Udieresis -50 -KPX Aogonek Ugrave -50 -KPX Aogonek Uhungarumlaut -50 -KPX Aogonek Umacron -50 -KPX Aogonek Uogonek -50 -KPX Aogonek Uring -50 -KPX Aogonek V -70 -KPX Aogonek W -50 -KPX Aogonek Y -100 -KPX Aogonek Yacute -100 -KPX Aogonek Ydieresis -100 -KPX Aogonek u -30 -KPX Aogonek uacute -30 -KPX Aogonek ucircumflex -30 -KPX Aogonek udieresis -30 -KPX Aogonek ugrave -30 -KPX Aogonek uhungarumlaut -30 -KPX Aogonek umacron -30 -KPX Aogonek uogonek -30 -KPX Aogonek uring -30 -KPX Aogonek v -40 -KPX Aogonek w -40 -KPX Aogonek y -40 -KPX Aogonek yacute -40 -KPX Aogonek ydieresis -40 -KPX Aring C -30 -KPX Aring Cacute -30 -KPX Aring Ccaron -30 -KPX Aring Ccedilla -30 -KPX Aring G -30 -KPX Aring Gbreve -30 -KPX Aring Gcommaaccent -30 -KPX Aring O -30 -KPX Aring Oacute -30 -KPX Aring Ocircumflex -30 -KPX Aring Odieresis -30 -KPX Aring Ograve -30 -KPX Aring Ohungarumlaut -30 -KPX Aring Omacron -30 -KPX Aring Oslash -30 -KPX Aring Otilde -30 -KPX Aring Q -30 -KPX Aring T -120 -KPX Aring Tcaron -120 -KPX Aring Tcommaaccent -120 -KPX Aring U -50 -KPX Aring Uacute -50 -KPX Aring Ucircumflex -50 -KPX Aring Udieresis -50 -KPX Aring Ugrave -50 -KPX Aring Uhungarumlaut -50 -KPX Aring Umacron -50 -KPX Aring Uogonek -50 -KPX Aring Uring -50 -KPX Aring V -70 -KPX Aring W -50 -KPX Aring Y -100 -KPX Aring Yacute -100 -KPX Aring Ydieresis -100 -KPX Aring u -30 -KPX Aring uacute -30 -KPX Aring ucircumflex -30 -KPX Aring udieresis -30 -KPX Aring ugrave -30 -KPX Aring uhungarumlaut -30 -KPX Aring umacron -30 -KPX Aring uogonek -30 -KPX Aring uring -30 -KPX Aring v -40 -KPX Aring w -40 -KPX Aring y -40 -KPX Aring yacute -40 -KPX Aring ydieresis -40 -KPX Atilde C -30 -KPX Atilde Cacute -30 -KPX Atilde Ccaron -30 -KPX Atilde Ccedilla -30 -KPX Atilde G -30 -KPX Atilde Gbreve -30 -KPX Atilde Gcommaaccent -30 -KPX Atilde O -30 -KPX Atilde Oacute -30 -KPX Atilde Ocircumflex -30 -KPX Atilde Odieresis -30 -KPX Atilde Ograve -30 -KPX Atilde Ohungarumlaut -30 -KPX Atilde Omacron -30 -KPX Atilde Oslash -30 -KPX Atilde Otilde -30 -KPX Atilde Q -30 -KPX Atilde T -120 -KPX Atilde Tcaron -120 -KPX Atilde Tcommaaccent -120 -KPX Atilde U -50 -KPX Atilde Uacute -50 -KPX Atilde Ucircumflex -50 -KPX Atilde Udieresis -50 -KPX Atilde Ugrave -50 -KPX Atilde Uhungarumlaut -50 -KPX Atilde Umacron -50 -KPX Atilde Uogonek -50 -KPX Atilde Uring -50 -KPX Atilde V -70 -KPX Atilde W -50 -KPX Atilde Y -100 -KPX Atilde Yacute -100 -KPX Atilde Ydieresis -100 -KPX Atilde u -30 -KPX Atilde uacute -30 -KPX Atilde ucircumflex -30 -KPX Atilde udieresis -30 -KPX Atilde ugrave -30 -KPX Atilde uhungarumlaut -30 -KPX Atilde umacron -30 -KPX Atilde uogonek -30 -KPX Atilde uring -30 -KPX Atilde v -40 -KPX Atilde w -40 -KPX Atilde y -40 -KPX Atilde yacute -40 -KPX Atilde ydieresis -40 -KPX B U -10 -KPX B Uacute -10 -KPX B Ucircumflex -10 -KPX B Udieresis -10 -KPX B Ugrave -10 -KPX B Uhungarumlaut -10 -KPX B Umacron -10 -KPX B Uogonek -10 -KPX B Uring -10 -KPX B comma -20 -KPX B period -20 -KPX C comma -30 -KPX C period -30 -KPX Cacute comma -30 -KPX Cacute period -30 -KPX Ccaron comma -30 -KPX Ccaron period -30 -KPX Ccedilla comma -30 -KPX Ccedilla period -30 -KPX D A -40 -KPX D Aacute -40 -KPX D Abreve -40 -KPX D Acircumflex -40 -KPX D Adieresis -40 -KPX D Agrave -40 -KPX D Amacron -40 -KPX D Aogonek -40 -KPX D Aring -40 -KPX D Atilde -40 -KPX D V -70 -KPX D W -40 -KPX D Y -90 -KPX D Yacute -90 -KPX D Ydieresis -90 -KPX D comma -70 -KPX D period -70 -KPX Dcaron A -40 -KPX Dcaron Aacute -40 -KPX Dcaron Abreve -40 -KPX Dcaron Acircumflex -40 -KPX Dcaron Adieresis -40 -KPX Dcaron Agrave -40 -KPX Dcaron Amacron -40 -KPX Dcaron Aogonek -40 -KPX Dcaron Aring -40 -KPX Dcaron Atilde -40 -KPX Dcaron V -70 -KPX Dcaron W -40 -KPX Dcaron Y -90 -KPX Dcaron Yacute -90 -KPX Dcaron Ydieresis -90 -KPX Dcaron comma -70 -KPX Dcaron period -70 -KPX Dcroat A -40 -KPX Dcroat Aacute -40 -KPX Dcroat Abreve -40 -KPX Dcroat Acircumflex -40 -KPX Dcroat Adieresis -40 -KPX Dcroat Agrave -40 -KPX Dcroat Amacron -40 -KPX Dcroat Aogonek -40 -KPX Dcroat Aring -40 -KPX Dcroat Atilde -40 -KPX Dcroat V -70 -KPX Dcroat W -40 -KPX Dcroat Y -90 -KPX Dcroat Yacute -90 -KPX Dcroat Ydieresis -90 -KPX Dcroat comma -70 -KPX Dcroat period -70 -KPX F A -80 -KPX F Aacute -80 -KPX F Abreve -80 -KPX F Acircumflex -80 -KPX F Adieresis -80 -KPX F Agrave -80 -KPX F Amacron -80 -KPX F Aogonek -80 -KPX F Aring -80 -KPX F Atilde -80 -KPX F a -50 -KPX F aacute -50 -KPX F abreve -50 -KPX F acircumflex -50 -KPX F adieresis -50 -KPX F agrave -50 -KPX F amacron -50 -KPX F aogonek -50 -KPX F aring -50 -KPX F atilde -50 -KPX F comma -150 -KPX F e -30 -KPX F eacute -30 -KPX F ecaron -30 -KPX F ecircumflex -30 -KPX F edieresis -30 -KPX F edotaccent -30 -KPX F egrave -30 -KPX F emacron -30 -KPX F eogonek -30 -KPX F o -30 -KPX F oacute -30 -KPX F ocircumflex -30 -KPX F odieresis -30 -KPX F ograve -30 -KPX F ohungarumlaut -30 -KPX F omacron -30 -KPX F oslash -30 -KPX F otilde -30 -KPX F period -150 -KPX F r -45 -KPX F racute -45 -KPX F rcaron -45 -KPX F rcommaaccent -45 -KPX J A -20 -KPX J Aacute -20 -KPX J Abreve -20 -KPX J Acircumflex -20 -KPX J Adieresis -20 -KPX J Agrave -20 -KPX J Amacron -20 -KPX J Aogonek -20 -KPX J Aring -20 -KPX J Atilde -20 -KPX J a -20 -KPX J aacute -20 -KPX J abreve -20 -KPX J acircumflex -20 -KPX J adieresis -20 -KPX J agrave -20 -KPX J amacron -20 -KPX J aogonek -20 -KPX J aring -20 -KPX J atilde -20 -KPX J comma -30 -KPX J period -30 -KPX J u -20 -KPX J uacute -20 -KPX J ucircumflex -20 -KPX J udieresis -20 -KPX J ugrave -20 -KPX J uhungarumlaut -20 -KPX J umacron -20 -KPX J uogonek -20 -KPX J uring -20 -KPX K O -50 -KPX K Oacute -50 -KPX K Ocircumflex -50 -KPX K Odieresis -50 -KPX K Ograve -50 -KPX K Ohungarumlaut -50 -KPX K Omacron -50 -KPX K Oslash -50 -KPX K Otilde -50 -KPX K e -40 -KPX K eacute -40 -KPX K ecaron -40 -KPX K ecircumflex -40 -KPX K edieresis -40 -KPX K edotaccent -40 -KPX K egrave -40 -KPX K emacron -40 -KPX K eogonek -40 -KPX K o -40 -KPX K oacute -40 -KPX K ocircumflex -40 -KPX K odieresis -40 -KPX K ograve -40 -KPX K ohungarumlaut -40 -KPX K omacron -40 -KPX K oslash -40 -KPX K otilde -40 -KPX K u -30 -KPX K uacute -30 -KPX K ucircumflex -30 -KPX K udieresis -30 -KPX K ugrave -30 -KPX K uhungarumlaut -30 -KPX K umacron -30 -KPX K uogonek -30 -KPX K uring -30 -KPX K y -50 -KPX K yacute -50 -KPX K ydieresis -50 -KPX Kcommaaccent O -50 -KPX Kcommaaccent Oacute -50 -KPX Kcommaaccent Ocircumflex -50 -KPX Kcommaaccent Odieresis -50 -KPX Kcommaaccent Ograve -50 -KPX Kcommaaccent Ohungarumlaut -50 -KPX Kcommaaccent Omacron -50 -KPX Kcommaaccent Oslash -50 -KPX Kcommaaccent Otilde -50 -KPX Kcommaaccent e -40 -KPX Kcommaaccent eacute -40 -KPX Kcommaaccent ecaron -40 -KPX Kcommaaccent ecircumflex -40 -KPX Kcommaaccent edieresis -40 -KPX Kcommaaccent edotaccent -40 -KPX Kcommaaccent egrave -40 -KPX Kcommaaccent emacron -40 -KPX Kcommaaccent eogonek -40 -KPX Kcommaaccent o -40 -KPX Kcommaaccent oacute -40 -KPX Kcommaaccent ocircumflex -40 -KPX Kcommaaccent odieresis -40 -KPX Kcommaaccent ograve -40 -KPX Kcommaaccent ohungarumlaut -40 -KPX Kcommaaccent omacron -40 -KPX Kcommaaccent oslash -40 -KPX Kcommaaccent otilde -40 -KPX Kcommaaccent u -30 -KPX Kcommaaccent uacute -30 -KPX Kcommaaccent ucircumflex -30 -KPX Kcommaaccent udieresis -30 -KPX Kcommaaccent ugrave -30 -KPX Kcommaaccent uhungarumlaut -30 -KPX Kcommaaccent umacron -30 -KPX Kcommaaccent uogonek -30 -KPX Kcommaaccent uring -30 -KPX Kcommaaccent y -50 -KPX Kcommaaccent yacute -50 -KPX Kcommaaccent ydieresis -50 -KPX L T -110 -KPX L Tcaron -110 -KPX L Tcommaaccent -110 -KPX L V -110 -KPX L W -70 -KPX L Y -140 -KPX L Yacute -140 -KPX L Ydieresis -140 -KPX L quotedblright -140 -KPX L quoteright -160 -KPX L y -30 -KPX L yacute -30 -KPX L ydieresis -30 -KPX Lacute T -110 -KPX Lacute Tcaron -110 -KPX Lacute Tcommaaccent -110 -KPX Lacute V -110 -KPX Lacute W -70 -KPX Lacute Y -140 -KPX Lacute Yacute -140 -KPX Lacute Ydieresis -140 -KPX Lacute quotedblright -140 -KPX Lacute quoteright -160 -KPX Lacute y -30 -KPX Lacute yacute -30 -KPX Lacute ydieresis -30 -KPX Lcaron T -110 -KPX Lcaron Tcaron -110 -KPX Lcaron Tcommaaccent -110 -KPX Lcaron V -110 -KPX Lcaron W -70 -KPX Lcaron Y -140 -KPX Lcaron Yacute -140 -KPX Lcaron Ydieresis -140 -KPX Lcaron quotedblright -140 -KPX Lcaron quoteright -160 -KPX Lcaron y -30 -KPX Lcaron yacute -30 -KPX Lcaron ydieresis -30 -KPX Lcommaaccent T -110 -KPX Lcommaaccent Tcaron -110 -KPX Lcommaaccent Tcommaaccent -110 -KPX Lcommaaccent V -110 -KPX Lcommaaccent W -70 -KPX Lcommaaccent Y -140 -KPX Lcommaaccent Yacute -140 -KPX Lcommaaccent Ydieresis -140 -KPX Lcommaaccent quotedblright -140 -KPX Lcommaaccent quoteright -160 -KPX Lcommaaccent y -30 -KPX Lcommaaccent yacute -30 -KPX Lcommaaccent ydieresis -30 -KPX Lslash T -110 -KPX Lslash Tcaron -110 -KPX Lslash Tcommaaccent -110 -KPX Lslash V -110 -KPX Lslash W -70 -KPX Lslash Y -140 -KPX Lslash Yacute -140 -KPX Lslash Ydieresis -140 -KPX Lslash quotedblright -140 -KPX Lslash quoteright -160 -KPX Lslash y -30 -KPX Lslash yacute -30 -KPX Lslash ydieresis -30 -KPX O A -20 -KPX O Aacute -20 -KPX O Abreve -20 -KPX O Acircumflex -20 -KPX O Adieresis -20 -KPX O Agrave -20 -KPX O Amacron -20 -KPX O Aogonek -20 -KPX O Aring -20 -KPX O Atilde -20 -KPX O T -40 -KPX O Tcaron -40 -KPX O Tcommaaccent -40 -KPX O V -50 -KPX O W -30 -KPX O X -60 -KPX O Y -70 -KPX O Yacute -70 -KPX O Ydieresis -70 -KPX O comma -40 -KPX O period -40 -KPX Oacute A -20 -KPX Oacute Aacute -20 -KPX Oacute Abreve -20 -KPX Oacute Acircumflex -20 -KPX Oacute Adieresis -20 -KPX Oacute Agrave -20 -KPX Oacute Amacron -20 -KPX Oacute Aogonek -20 -KPX Oacute Aring -20 -KPX Oacute Atilde -20 -KPX Oacute T -40 -KPX Oacute Tcaron -40 -KPX Oacute Tcommaaccent -40 -KPX Oacute V -50 -KPX Oacute W -30 -KPX Oacute X -60 -KPX Oacute Y -70 -KPX Oacute Yacute -70 -KPX Oacute Ydieresis -70 -KPX Oacute comma -40 -KPX Oacute period -40 -KPX Ocircumflex A -20 -KPX Ocircumflex Aacute -20 -KPX Ocircumflex Abreve -20 -KPX Ocircumflex Acircumflex -20 -KPX Ocircumflex Adieresis -20 -KPX Ocircumflex Agrave -20 -KPX Ocircumflex Amacron -20 -KPX Ocircumflex Aogonek -20 -KPX Ocircumflex Aring -20 -KPX Ocircumflex Atilde -20 -KPX Ocircumflex T -40 -KPX Ocircumflex Tcaron -40 -KPX Ocircumflex Tcommaaccent -40 -KPX Ocircumflex V -50 -KPX Ocircumflex W -30 -KPX Ocircumflex X -60 -KPX Ocircumflex Y -70 -KPX Ocircumflex Yacute -70 -KPX Ocircumflex Ydieresis -70 -KPX Ocircumflex comma -40 -KPX Ocircumflex period -40 -KPX Odieresis A -20 -KPX Odieresis Aacute -20 -KPX Odieresis Abreve -20 -KPX Odieresis Acircumflex -20 -KPX Odieresis Adieresis -20 -KPX Odieresis Agrave -20 -KPX Odieresis Amacron -20 -KPX Odieresis Aogonek -20 -KPX Odieresis Aring -20 -KPX Odieresis Atilde -20 -KPX Odieresis T -40 -KPX Odieresis Tcaron -40 -KPX Odieresis Tcommaaccent -40 -KPX Odieresis V -50 -KPX Odieresis W -30 -KPX Odieresis X -60 -KPX Odieresis Y -70 -KPX Odieresis Yacute -70 -KPX Odieresis Ydieresis -70 -KPX Odieresis comma -40 -KPX Odieresis period -40 -KPX Ograve A -20 -KPX Ograve Aacute -20 -KPX Ograve Abreve -20 -KPX Ograve Acircumflex -20 -KPX Ograve Adieresis -20 -KPX Ograve Agrave -20 -KPX Ograve Amacron -20 -KPX Ograve Aogonek -20 -KPX Ograve Aring -20 -KPX Ograve Atilde -20 -KPX Ograve T -40 -KPX Ograve Tcaron -40 -KPX Ograve Tcommaaccent -40 -KPX Ograve V -50 -KPX Ograve W -30 -KPX Ograve X -60 -KPX Ograve Y -70 -KPX Ograve Yacute -70 -KPX Ograve Ydieresis -70 -KPX Ograve comma -40 -KPX Ograve period -40 -KPX Ohungarumlaut A -20 -KPX Ohungarumlaut Aacute -20 -KPX Ohungarumlaut Abreve -20 -KPX Ohungarumlaut Acircumflex -20 -KPX Ohungarumlaut Adieresis -20 -KPX Ohungarumlaut Agrave -20 -KPX Ohungarumlaut Amacron -20 -KPX Ohungarumlaut Aogonek -20 -KPX Ohungarumlaut Aring -20 -KPX Ohungarumlaut Atilde -20 -KPX Ohungarumlaut T -40 -KPX Ohungarumlaut Tcaron -40 -KPX Ohungarumlaut Tcommaaccent -40 -KPX Ohungarumlaut V -50 -KPX Ohungarumlaut W -30 -KPX Ohungarumlaut X -60 -KPX Ohungarumlaut Y -70 -KPX Ohungarumlaut Yacute -70 -KPX Ohungarumlaut Ydieresis -70 -KPX Ohungarumlaut comma -40 -KPX Ohungarumlaut period -40 -KPX Omacron A -20 -KPX Omacron Aacute -20 -KPX Omacron Abreve -20 -KPX Omacron Acircumflex -20 -KPX Omacron Adieresis -20 -KPX Omacron Agrave -20 -KPX Omacron Amacron -20 -KPX Omacron Aogonek -20 -KPX Omacron Aring -20 -KPX Omacron Atilde -20 -KPX Omacron T -40 -KPX Omacron Tcaron -40 -KPX Omacron Tcommaaccent -40 -KPX Omacron V -50 -KPX Omacron W -30 -KPX Omacron X -60 -KPX Omacron Y -70 -KPX Omacron Yacute -70 -KPX Omacron Ydieresis -70 -KPX Omacron comma -40 -KPX Omacron period -40 -KPX Oslash A -20 -KPX Oslash Aacute -20 -KPX Oslash Abreve -20 -KPX Oslash Acircumflex -20 -KPX Oslash Adieresis -20 -KPX Oslash Agrave -20 -KPX Oslash Amacron -20 -KPX Oslash Aogonek -20 -KPX Oslash Aring -20 -KPX Oslash Atilde -20 -KPX Oslash T -40 -KPX Oslash Tcaron -40 -KPX Oslash Tcommaaccent -40 -KPX Oslash V -50 -KPX Oslash W -30 -KPX Oslash X -60 -KPX Oslash Y -70 -KPX Oslash Yacute -70 -KPX Oslash Ydieresis -70 -KPX Oslash comma -40 -KPX Oslash period -40 -KPX Otilde A -20 -KPX Otilde Aacute -20 -KPX Otilde Abreve -20 -KPX Otilde Acircumflex -20 -KPX Otilde Adieresis -20 -KPX Otilde Agrave -20 -KPX Otilde Amacron -20 -KPX Otilde Aogonek -20 -KPX Otilde Aring -20 -KPX Otilde Atilde -20 -KPX Otilde T -40 -KPX Otilde Tcaron -40 -KPX Otilde Tcommaaccent -40 -KPX Otilde V -50 -KPX Otilde W -30 -KPX Otilde X -60 -KPX Otilde Y -70 -KPX Otilde Yacute -70 -KPX Otilde Ydieresis -70 -KPX Otilde comma -40 -KPX Otilde period -40 -KPX P A -120 -KPX P Aacute -120 -KPX P Abreve -120 -KPX P Acircumflex -120 -KPX P Adieresis -120 -KPX P Agrave -120 -KPX P Amacron -120 -KPX P Aogonek -120 -KPX P Aring -120 -KPX P Atilde -120 -KPX P a -40 -KPX P aacute -40 -KPX P abreve -40 -KPX P acircumflex -40 -KPX P adieresis -40 -KPX P agrave -40 -KPX P amacron -40 -KPX P aogonek -40 -KPX P aring -40 -KPX P atilde -40 -KPX P comma -180 -KPX P e -50 -KPX P eacute -50 -KPX P ecaron -50 -KPX P ecircumflex -50 -KPX P edieresis -50 -KPX P edotaccent -50 -KPX P egrave -50 -KPX P emacron -50 -KPX P eogonek -50 -KPX P o -50 -KPX P oacute -50 -KPX P ocircumflex -50 -KPX P odieresis -50 -KPX P ograve -50 -KPX P ohungarumlaut -50 -KPX P omacron -50 -KPX P oslash -50 -KPX P otilde -50 -KPX P period -180 -KPX Q U -10 -KPX Q Uacute -10 -KPX Q Ucircumflex -10 -KPX Q Udieresis -10 -KPX Q Ugrave -10 -KPX Q Uhungarumlaut -10 -KPX Q Umacron -10 -KPX Q Uogonek -10 -KPX Q Uring -10 -KPX R O -20 -KPX R Oacute -20 -KPX R Ocircumflex -20 -KPX R Odieresis -20 -KPX R Ograve -20 -KPX R Ohungarumlaut -20 -KPX R Omacron -20 -KPX R Oslash -20 -KPX R Otilde -20 -KPX R T -30 -KPX R Tcaron -30 -KPX R Tcommaaccent -30 -KPX R U -40 -KPX R Uacute -40 -KPX R Ucircumflex -40 -KPX R Udieresis -40 -KPX R Ugrave -40 -KPX R Uhungarumlaut -40 -KPX R Umacron -40 -KPX R Uogonek -40 -KPX R Uring -40 -KPX R V -50 -KPX R W -30 -KPX R Y -50 -KPX R Yacute -50 -KPX R Ydieresis -50 -KPX Racute O -20 -KPX Racute Oacute -20 -KPX Racute Ocircumflex -20 -KPX Racute Odieresis -20 -KPX Racute Ograve -20 -KPX Racute Ohungarumlaut -20 -KPX Racute Omacron -20 -KPX Racute Oslash -20 -KPX Racute Otilde -20 -KPX Racute T -30 -KPX Racute Tcaron -30 -KPX Racute Tcommaaccent -30 -KPX Racute U -40 -KPX Racute Uacute -40 -KPX Racute Ucircumflex -40 -KPX Racute Udieresis -40 -KPX Racute Ugrave -40 -KPX Racute Uhungarumlaut -40 -KPX Racute Umacron -40 -KPX Racute Uogonek -40 -KPX Racute Uring -40 -KPX Racute V -50 -KPX Racute W -30 -KPX Racute Y -50 -KPX Racute Yacute -50 -KPX Racute Ydieresis -50 -KPX Rcaron O -20 -KPX Rcaron Oacute -20 -KPX Rcaron Ocircumflex -20 -KPX Rcaron Odieresis -20 -KPX Rcaron Ograve -20 -KPX Rcaron Ohungarumlaut -20 -KPX Rcaron Omacron -20 -KPX Rcaron Oslash -20 -KPX Rcaron Otilde -20 -KPX Rcaron T -30 -KPX Rcaron Tcaron -30 -KPX Rcaron Tcommaaccent -30 -KPX Rcaron U -40 -KPX Rcaron Uacute -40 -KPX Rcaron Ucircumflex -40 -KPX Rcaron Udieresis -40 -KPX Rcaron Ugrave -40 -KPX Rcaron Uhungarumlaut -40 -KPX Rcaron Umacron -40 -KPX Rcaron Uogonek -40 -KPX Rcaron Uring -40 -KPX Rcaron V -50 -KPX Rcaron W -30 -KPX Rcaron Y -50 -KPX Rcaron Yacute -50 -KPX Rcaron Ydieresis -50 -KPX Rcommaaccent O -20 -KPX Rcommaaccent Oacute -20 -KPX Rcommaaccent Ocircumflex -20 -KPX Rcommaaccent Odieresis -20 -KPX Rcommaaccent Ograve -20 -KPX Rcommaaccent Ohungarumlaut -20 -KPX Rcommaaccent Omacron -20 -KPX Rcommaaccent Oslash -20 -KPX Rcommaaccent Otilde -20 -KPX Rcommaaccent T -30 -KPX Rcommaaccent Tcaron -30 -KPX Rcommaaccent Tcommaaccent -30 -KPX Rcommaaccent U -40 -KPX Rcommaaccent Uacute -40 -KPX Rcommaaccent Ucircumflex -40 -KPX Rcommaaccent Udieresis -40 -KPX Rcommaaccent Ugrave -40 -KPX Rcommaaccent Uhungarumlaut -40 -KPX Rcommaaccent Umacron -40 -KPX Rcommaaccent Uogonek -40 -KPX Rcommaaccent Uring -40 -KPX Rcommaaccent V -50 -KPX Rcommaaccent W -30 -KPX Rcommaaccent Y -50 -KPX Rcommaaccent Yacute -50 -KPX Rcommaaccent Ydieresis -50 -KPX S comma -20 -KPX S period -20 -KPX Sacute comma -20 -KPX Sacute period -20 -KPX Scaron comma -20 -KPX Scaron period -20 -KPX Scedilla comma -20 -KPX Scedilla period -20 -KPX Scommaaccent comma -20 -KPX Scommaaccent period -20 -KPX T A -120 -KPX T Aacute -120 -KPX T Abreve -120 -KPX T Acircumflex -120 -KPX T Adieresis -120 -KPX T Agrave -120 -KPX T Amacron -120 -KPX T Aogonek -120 -KPX T Aring -120 -KPX T Atilde -120 -KPX T O -40 -KPX T Oacute -40 -KPX T Ocircumflex -40 -KPX T Odieresis -40 -KPX T Ograve -40 -KPX T Ohungarumlaut -40 -KPX T Omacron -40 -KPX T Oslash -40 -KPX T Otilde -40 -KPX T a -120 -KPX T aacute -120 -KPX T abreve -60 -KPX T acircumflex -120 -KPX T adieresis -120 -KPX T agrave -120 -KPX T amacron -60 -KPX T aogonek -120 -KPX T aring -120 -KPX T atilde -60 -KPX T colon -20 -KPX T comma -120 -KPX T e -120 -KPX T eacute -120 -KPX T ecaron -120 -KPX T ecircumflex -120 -KPX T edieresis -120 -KPX T edotaccent -120 -KPX T egrave -60 -KPX T emacron -60 -KPX T eogonek -120 -KPX T hyphen -140 -KPX T o -120 -KPX T oacute -120 -KPX T ocircumflex -120 -KPX T odieresis -120 -KPX T ograve -120 -KPX T ohungarumlaut -120 -KPX T omacron -60 -KPX T oslash -120 -KPX T otilde -60 -KPX T period -120 -KPX T r -120 -KPX T racute -120 -KPX T rcaron -120 -KPX T rcommaaccent -120 -KPX T semicolon -20 -KPX T u -120 -KPX T uacute -120 -KPX T ucircumflex -120 -KPX T udieresis -120 -KPX T ugrave -120 -KPX T uhungarumlaut -120 -KPX T umacron -60 -KPX T uogonek -120 -KPX T uring -120 -KPX T w -120 -KPX T y -120 -KPX T yacute -120 -KPX T ydieresis -60 -KPX Tcaron A -120 -KPX Tcaron Aacute -120 -KPX Tcaron Abreve -120 -KPX Tcaron Acircumflex -120 -KPX Tcaron Adieresis -120 -KPX Tcaron Agrave -120 -KPX Tcaron Amacron -120 -KPX Tcaron Aogonek -120 -KPX Tcaron Aring -120 -KPX Tcaron Atilde -120 -KPX Tcaron O -40 -KPX Tcaron Oacute -40 -KPX Tcaron Ocircumflex -40 -KPX Tcaron Odieresis -40 -KPX Tcaron Ograve -40 -KPX Tcaron Ohungarumlaut -40 -KPX Tcaron Omacron -40 -KPX Tcaron Oslash -40 -KPX Tcaron Otilde -40 -KPX Tcaron a -120 -KPX Tcaron aacute -120 -KPX Tcaron abreve -60 -KPX Tcaron acircumflex -120 -KPX Tcaron adieresis -120 -KPX Tcaron agrave -120 -KPX Tcaron amacron -60 -KPX Tcaron aogonek -120 -KPX Tcaron aring -120 -KPX Tcaron atilde -60 -KPX Tcaron colon -20 -KPX Tcaron comma -120 -KPX Tcaron e -120 -KPX Tcaron eacute -120 -KPX Tcaron ecaron -120 -KPX Tcaron ecircumflex -120 -KPX Tcaron edieresis -120 -KPX Tcaron edotaccent -120 -KPX Tcaron egrave -60 -KPX Tcaron emacron -60 -KPX Tcaron eogonek -120 -KPX Tcaron hyphen -140 -KPX Tcaron o -120 -KPX Tcaron oacute -120 -KPX Tcaron ocircumflex -120 -KPX Tcaron odieresis -120 -KPX Tcaron ograve -120 -KPX Tcaron ohungarumlaut -120 -KPX Tcaron omacron -60 -KPX Tcaron oslash -120 -KPX Tcaron otilde -60 -KPX Tcaron period -120 -KPX Tcaron r -120 -KPX Tcaron racute -120 -KPX Tcaron rcaron -120 -KPX Tcaron rcommaaccent -120 -KPX Tcaron semicolon -20 -KPX Tcaron u -120 -KPX Tcaron uacute -120 -KPX Tcaron ucircumflex -120 -KPX Tcaron udieresis -120 -KPX Tcaron ugrave -120 -KPX Tcaron uhungarumlaut -120 -KPX Tcaron umacron -60 -KPX Tcaron uogonek -120 -KPX Tcaron uring -120 -KPX Tcaron w -120 -KPX Tcaron y -120 -KPX Tcaron yacute -120 -KPX Tcaron ydieresis -60 -KPX Tcommaaccent A -120 -KPX Tcommaaccent Aacute -120 -KPX Tcommaaccent Abreve -120 -KPX Tcommaaccent Acircumflex -120 -KPX Tcommaaccent Adieresis -120 -KPX Tcommaaccent Agrave -120 -KPX Tcommaaccent Amacron -120 -KPX Tcommaaccent Aogonek -120 -KPX Tcommaaccent Aring -120 -KPX Tcommaaccent Atilde -120 -KPX Tcommaaccent O -40 -KPX Tcommaaccent Oacute -40 -KPX Tcommaaccent Ocircumflex -40 -KPX Tcommaaccent Odieresis -40 -KPX Tcommaaccent Ograve -40 -KPX Tcommaaccent Ohungarumlaut -40 -KPX Tcommaaccent Omacron -40 -KPX Tcommaaccent Oslash -40 -KPX Tcommaaccent Otilde -40 -KPX Tcommaaccent a -120 -KPX Tcommaaccent aacute -120 -KPX Tcommaaccent abreve -60 -KPX Tcommaaccent acircumflex -120 -KPX Tcommaaccent adieresis -120 -KPX Tcommaaccent agrave -120 -KPX Tcommaaccent amacron -60 -KPX Tcommaaccent aogonek -120 -KPX Tcommaaccent aring -120 -KPX Tcommaaccent atilde -60 -KPX Tcommaaccent colon -20 -KPX Tcommaaccent comma -120 -KPX Tcommaaccent e -120 -KPX Tcommaaccent eacute -120 -KPX Tcommaaccent ecaron -120 -KPX Tcommaaccent ecircumflex -120 -KPX Tcommaaccent edieresis -120 -KPX Tcommaaccent edotaccent -120 -KPX Tcommaaccent egrave -60 -KPX Tcommaaccent emacron -60 -KPX Tcommaaccent eogonek -120 -KPX Tcommaaccent hyphen -140 -KPX Tcommaaccent o -120 -KPX Tcommaaccent oacute -120 -KPX Tcommaaccent ocircumflex -120 -KPX Tcommaaccent odieresis -120 -KPX Tcommaaccent ograve -120 -KPX Tcommaaccent ohungarumlaut -120 -KPX Tcommaaccent omacron -60 -KPX Tcommaaccent oslash -120 -KPX Tcommaaccent otilde -60 -KPX Tcommaaccent period -120 -KPX Tcommaaccent r -120 -KPX Tcommaaccent racute -120 -KPX Tcommaaccent rcaron -120 -KPX Tcommaaccent rcommaaccent -120 -KPX Tcommaaccent semicolon -20 -KPX Tcommaaccent u -120 -KPX Tcommaaccent uacute -120 -KPX Tcommaaccent ucircumflex -120 -KPX Tcommaaccent udieresis -120 -KPX Tcommaaccent ugrave -120 -KPX Tcommaaccent uhungarumlaut -120 -KPX Tcommaaccent umacron -60 -KPX Tcommaaccent uogonek -120 -KPX Tcommaaccent uring -120 -KPX Tcommaaccent w -120 -KPX Tcommaaccent y -120 -KPX Tcommaaccent yacute -120 -KPX Tcommaaccent ydieresis -60 -KPX U A -40 -KPX U Aacute -40 -KPX U Abreve -40 -KPX U Acircumflex -40 -KPX U Adieresis -40 -KPX U Agrave -40 -KPX U Amacron -40 -KPX U Aogonek -40 -KPX U Aring -40 -KPX U Atilde -40 -KPX U comma -40 -KPX U period -40 -KPX Uacute A -40 -KPX Uacute Aacute -40 -KPX Uacute Abreve -40 -KPX Uacute Acircumflex -40 -KPX Uacute Adieresis -40 -KPX Uacute Agrave -40 -KPX Uacute Amacron -40 -KPX Uacute Aogonek -40 -KPX Uacute Aring -40 -KPX Uacute Atilde -40 -KPX Uacute comma -40 -KPX Uacute period -40 -KPX Ucircumflex A -40 -KPX Ucircumflex Aacute -40 -KPX Ucircumflex Abreve -40 -KPX Ucircumflex Acircumflex -40 -KPX Ucircumflex Adieresis -40 -KPX Ucircumflex Agrave -40 -KPX Ucircumflex Amacron -40 -KPX Ucircumflex Aogonek -40 -KPX Ucircumflex Aring -40 -KPX Ucircumflex Atilde -40 -KPX Ucircumflex comma -40 -KPX Ucircumflex period -40 -KPX Udieresis A -40 -KPX Udieresis Aacute -40 -KPX Udieresis Abreve -40 -KPX Udieresis Acircumflex -40 -KPX Udieresis Adieresis -40 -KPX Udieresis Agrave -40 -KPX Udieresis Amacron -40 -KPX Udieresis Aogonek -40 -KPX Udieresis Aring -40 -KPX Udieresis Atilde -40 -KPX Udieresis comma -40 -KPX Udieresis period -40 -KPX Ugrave A -40 -KPX Ugrave Aacute -40 -KPX Ugrave Abreve -40 -KPX Ugrave Acircumflex -40 -KPX Ugrave Adieresis -40 -KPX Ugrave Agrave -40 -KPX Ugrave Amacron -40 -KPX Ugrave Aogonek -40 -KPX Ugrave Aring -40 -KPX Ugrave Atilde -40 -KPX Ugrave comma -40 -KPX Ugrave period -40 -KPX Uhungarumlaut A -40 -KPX Uhungarumlaut Aacute -40 -KPX Uhungarumlaut Abreve -40 -KPX Uhungarumlaut Acircumflex -40 -KPX Uhungarumlaut Adieresis -40 -KPX Uhungarumlaut Agrave -40 -KPX Uhungarumlaut Amacron -40 -KPX Uhungarumlaut Aogonek -40 -KPX Uhungarumlaut Aring -40 -KPX Uhungarumlaut Atilde -40 -KPX Uhungarumlaut comma -40 -KPX Uhungarumlaut period -40 -KPX Umacron A -40 -KPX Umacron Aacute -40 -KPX Umacron Abreve -40 -KPX Umacron Acircumflex -40 -KPX Umacron Adieresis -40 -KPX Umacron Agrave -40 -KPX Umacron Amacron -40 -KPX Umacron Aogonek -40 -KPX Umacron Aring -40 -KPX Umacron Atilde -40 -KPX Umacron comma -40 -KPX Umacron period -40 -KPX Uogonek A -40 -KPX Uogonek Aacute -40 -KPX Uogonek Abreve -40 -KPX Uogonek Acircumflex -40 -KPX Uogonek Adieresis -40 -KPX Uogonek Agrave -40 -KPX Uogonek Amacron -40 -KPX Uogonek Aogonek -40 -KPX Uogonek Aring -40 -KPX Uogonek Atilde -40 -KPX Uogonek comma -40 -KPX Uogonek period -40 -KPX Uring A -40 -KPX Uring Aacute -40 -KPX Uring Abreve -40 -KPX Uring Acircumflex -40 -KPX Uring Adieresis -40 -KPX Uring Agrave -40 -KPX Uring Amacron -40 -KPX Uring Aogonek -40 -KPX Uring Aring -40 -KPX Uring Atilde -40 -KPX Uring comma -40 -KPX Uring period -40 -KPX V A -80 -KPX V Aacute -80 -KPX V Abreve -80 -KPX V Acircumflex -80 -KPX V Adieresis -80 -KPX V Agrave -80 -KPX V Amacron -80 -KPX V Aogonek -80 -KPX V Aring -80 -KPX V Atilde -80 -KPX V G -40 -KPX V Gbreve -40 -KPX V Gcommaaccent -40 -KPX V O -40 -KPX V Oacute -40 -KPX V Ocircumflex -40 -KPX V Odieresis -40 -KPX V Ograve -40 -KPX V Ohungarumlaut -40 -KPX V Omacron -40 -KPX V Oslash -40 -KPX V Otilde -40 -KPX V a -70 -KPX V aacute -70 -KPX V abreve -70 -KPX V acircumflex -70 -KPX V adieresis -70 -KPX V agrave -70 -KPX V amacron -70 -KPX V aogonek -70 -KPX V aring -70 -KPX V atilde -70 -KPX V colon -40 -KPX V comma -125 -KPX V e -80 -KPX V eacute -80 -KPX V ecaron -80 -KPX V ecircumflex -80 -KPX V edieresis -80 -KPX V edotaccent -80 -KPX V egrave -80 -KPX V emacron -80 -KPX V eogonek -80 -KPX V hyphen -80 -KPX V o -80 -KPX V oacute -80 -KPX V ocircumflex -80 -KPX V odieresis -80 -KPX V ograve -80 -KPX V ohungarumlaut -80 -KPX V omacron -80 -KPX V oslash -80 -KPX V otilde -80 -KPX V period -125 -KPX V semicolon -40 -KPX V u -70 -KPX V uacute -70 -KPX V ucircumflex -70 -KPX V udieresis -70 -KPX V ugrave -70 -KPX V uhungarumlaut -70 -KPX V umacron -70 -KPX V uogonek -70 -KPX V uring -70 -KPX W A -50 -KPX W Aacute -50 -KPX W Abreve -50 -KPX W Acircumflex -50 -KPX W Adieresis -50 -KPX W Agrave -50 -KPX W Amacron -50 -KPX W Aogonek -50 -KPX W Aring -50 -KPX W Atilde -50 -KPX W O -20 -KPX W Oacute -20 -KPX W Ocircumflex -20 -KPX W Odieresis -20 -KPX W Ograve -20 -KPX W Ohungarumlaut -20 -KPX W Omacron -20 -KPX W Oslash -20 -KPX W Otilde -20 -KPX W a -40 -KPX W aacute -40 -KPX W abreve -40 -KPX W acircumflex -40 -KPX W adieresis -40 -KPX W agrave -40 -KPX W amacron -40 -KPX W aogonek -40 -KPX W aring -40 -KPX W atilde -40 -KPX W comma -80 -KPX W e -30 -KPX W eacute -30 -KPX W ecaron -30 -KPX W ecircumflex -30 -KPX W edieresis -30 -KPX W edotaccent -30 -KPX W egrave -30 -KPX W emacron -30 -KPX W eogonek -30 -KPX W hyphen -40 -KPX W o -30 -KPX W oacute -30 -KPX W ocircumflex -30 -KPX W odieresis -30 -KPX W ograve -30 -KPX W ohungarumlaut -30 -KPX W omacron -30 -KPX W oslash -30 -KPX W otilde -30 -KPX W period -80 -KPX W u -30 -KPX W uacute -30 -KPX W ucircumflex -30 -KPX W udieresis -30 -KPX W ugrave -30 -KPX W uhungarumlaut -30 -KPX W umacron -30 -KPX W uogonek -30 -KPX W uring -30 -KPX W y -20 -KPX W yacute -20 -KPX W ydieresis -20 -KPX Y A -110 -KPX Y Aacute -110 -KPX Y Abreve -110 -KPX Y Acircumflex -110 -KPX Y Adieresis -110 -KPX Y Agrave -110 -KPX Y Amacron -110 -KPX Y Aogonek -110 -KPX Y Aring -110 -KPX Y Atilde -110 -KPX Y O -85 -KPX Y Oacute -85 -KPX Y Ocircumflex -85 -KPX Y Odieresis -85 -KPX Y Ograve -85 -KPX Y Ohungarumlaut -85 -KPX Y Omacron -85 -KPX Y Oslash -85 -KPX Y Otilde -85 -KPX Y a -140 -KPX Y aacute -140 -KPX Y abreve -70 -KPX Y acircumflex -140 -KPX Y adieresis -140 -KPX Y agrave -140 -KPX Y amacron -70 -KPX Y aogonek -140 -KPX Y aring -140 -KPX Y atilde -140 -KPX Y colon -60 -KPX Y comma -140 -KPX Y e -140 -KPX Y eacute -140 -KPX Y ecaron -140 -KPX Y ecircumflex -140 -KPX Y edieresis -140 -KPX Y edotaccent -140 -KPX Y egrave -140 -KPX Y emacron -70 -KPX Y eogonek -140 -KPX Y hyphen -140 -KPX Y i -20 -KPX Y iacute -20 -KPX Y iogonek -20 -KPX Y o -140 -KPX Y oacute -140 -KPX Y ocircumflex -140 -KPX Y odieresis -140 -KPX Y ograve -140 -KPX Y ohungarumlaut -140 -KPX Y omacron -140 -KPX Y oslash -140 -KPX Y otilde -140 -KPX Y period -140 -KPX Y semicolon -60 -KPX Y u -110 -KPX Y uacute -110 -KPX Y ucircumflex -110 -KPX Y udieresis -110 -KPX Y ugrave -110 -KPX Y uhungarumlaut -110 -KPX Y umacron -110 -KPX Y uogonek -110 -KPX Y uring -110 -KPX Yacute A -110 -KPX Yacute Aacute -110 -KPX Yacute Abreve -110 -KPX Yacute Acircumflex -110 -KPX Yacute Adieresis -110 -KPX Yacute Agrave -110 -KPX Yacute Amacron -110 -KPX Yacute Aogonek -110 -KPX Yacute Aring -110 -KPX Yacute Atilde -110 -KPX Yacute O -85 -KPX Yacute Oacute -85 -KPX Yacute Ocircumflex -85 -KPX Yacute Odieresis -85 -KPX Yacute Ograve -85 -KPX Yacute Ohungarumlaut -85 -KPX Yacute Omacron -85 -KPX Yacute Oslash -85 -KPX Yacute Otilde -85 -KPX Yacute a -140 -KPX Yacute aacute -140 -KPX Yacute abreve -70 -KPX Yacute acircumflex -140 -KPX Yacute adieresis -140 -KPX Yacute agrave -140 -KPX Yacute amacron -70 -KPX Yacute aogonek -140 -KPX Yacute aring -140 -KPX Yacute atilde -70 -KPX Yacute colon -60 -KPX Yacute comma -140 -KPX Yacute e -140 -KPX Yacute eacute -140 -KPX Yacute ecaron -140 -KPX Yacute ecircumflex -140 -KPX Yacute edieresis -140 -KPX Yacute edotaccent -140 -KPX Yacute egrave -140 -KPX Yacute emacron -70 -KPX Yacute eogonek -140 -KPX Yacute hyphen -140 -KPX Yacute i -20 -KPX Yacute iacute -20 -KPX Yacute iogonek -20 -KPX Yacute o -140 -KPX Yacute oacute -140 -KPX Yacute ocircumflex -140 -KPX Yacute odieresis -140 -KPX Yacute ograve -140 -KPX Yacute ohungarumlaut -140 -KPX Yacute omacron -70 -KPX Yacute oslash -140 -KPX Yacute otilde -140 -KPX Yacute period -140 -KPX Yacute semicolon -60 -KPX Yacute u -110 -KPX Yacute uacute -110 -KPX Yacute ucircumflex -110 -KPX Yacute udieresis -110 -KPX Yacute ugrave -110 -KPX Yacute uhungarumlaut -110 -KPX Yacute umacron -110 -KPX Yacute uogonek -110 -KPX Yacute uring -110 -KPX Ydieresis A -110 -KPX Ydieresis Aacute -110 -KPX Ydieresis Abreve -110 -KPX Ydieresis Acircumflex -110 -KPX Ydieresis Adieresis -110 -KPX Ydieresis Agrave -110 -KPX Ydieresis Amacron -110 -KPX Ydieresis Aogonek -110 -KPX Ydieresis Aring -110 -KPX Ydieresis Atilde -110 -KPX Ydieresis O -85 -KPX Ydieresis Oacute -85 -KPX Ydieresis Ocircumflex -85 -KPX Ydieresis Odieresis -85 -KPX Ydieresis Ograve -85 -KPX Ydieresis Ohungarumlaut -85 -KPX Ydieresis Omacron -85 -KPX Ydieresis Oslash -85 -KPX Ydieresis Otilde -85 -KPX Ydieresis a -140 -KPX Ydieresis aacute -140 -KPX Ydieresis abreve -70 -KPX Ydieresis acircumflex -140 -KPX Ydieresis adieresis -140 -KPX Ydieresis agrave -140 -KPX Ydieresis amacron -70 -KPX Ydieresis aogonek -140 -KPX Ydieresis aring -140 -KPX Ydieresis atilde -70 -KPX Ydieresis colon -60 -KPX Ydieresis comma -140 -KPX Ydieresis e -140 -KPX Ydieresis eacute -140 -KPX Ydieresis ecaron -140 -KPX Ydieresis ecircumflex -140 -KPX Ydieresis edieresis -140 -KPX Ydieresis edotaccent -140 -KPX Ydieresis egrave -140 -KPX Ydieresis emacron -70 -KPX Ydieresis eogonek -140 -KPX Ydieresis hyphen -140 -KPX Ydieresis i -20 -KPX Ydieresis iacute -20 -KPX Ydieresis iogonek -20 -KPX Ydieresis o -140 -KPX Ydieresis oacute -140 -KPX Ydieresis ocircumflex -140 -KPX Ydieresis odieresis -140 -KPX Ydieresis ograve -140 -KPX Ydieresis ohungarumlaut -140 -KPX Ydieresis omacron -140 -KPX Ydieresis oslash -140 -KPX Ydieresis otilde -140 -KPX Ydieresis period -140 -KPX Ydieresis semicolon -60 -KPX Ydieresis u -110 -KPX Ydieresis uacute -110 -KPX Ydieresis ucircumflex -110 -KPX Ydieresis udieresis -110 -KPX Ydieresis ugrave -110 -KPX Ydieresis uhungarumlaut -110 -KPX Ydieresis umacron -110 -KPX Ydieresis uogonek -110 -KPX Ydieresis uring -110 -KPX a v -20 -KPX a w -20 -KPX a y -30 -KPX a yacute -30 -KPX a ydieresis -30 -KPX aacute v -20 -KPX aacute w -20 -KPX aacute y -30 -KPX aacute yacute -30 -KPX aacute ydieresis -30 -KPX abreve v -20 -KPX abreve w -20 -KPX abreve y -30 -KPX abreve yacute -30 -KPX abreve ydieresis -30 -KPX acircumflex v -20 -KPX acircumflex w -20 -KPX acircumflex y -30 -KPX acircumflex yacute -30 -KPX acircumflex ydieresis -30 -KPX adieresis v -20 -KPX adieresis w -20 -KPX adieresis y -30 -KPX adieresis yacute -30 -KPX adieresis ydieresis -30 -KPX agrave v -20 -KPX agrave w -20 -KPX agrave y -30 -KPX agrave yacute -30 -KPX agrave ydieresis -30 -KPX amacron v -20 -KPX amacron w -20 -KPX amacron y -30 -KPX amacron yacute -30 -KPX amacron ydieresis -30 -KPX aogonek v -20 -KPX aogonek w -20 -KPX aogonek y -30 -KPX aogonek yacute -30 -KPX aogonek ydieresis -30 -KPX aring v -20 -KPX aring w -20 -KPX aring y -30 -KPX aring yacute -30 -KPX aring ydieresis -30 -KPX atilde v -20 -KPX atilde w -20 -KPX atilde y -30 -KPX atilde yacute -30 -KPX atilde ydieresis -30 -KPX b b -10 -KPX b comma -40 -KPX b l -20 -KPX b lacute -20 -KPX b lcommaaccent -20 -KPX b lslash -20 -KPX b period -40 -KPX b u -20 -KPX b uacute -20 -KPX b ucircumflex -20 -KPX b udieresis -20 -KPX b ugrave -20 -KPX b uhungarumlaut -20 -KPX b umacron -20 -KPX b uogonek -20 -KPX b uring -20 -KPX b v -20 -KPX b y -20 -KPX b yacute -20 -KPX b ydieresis -20 -KPX c comma -15 -KPX c k -20 -KPX c kcommaaccent -20 -KPX cacute comma -15 -KPX cacute k -20 -KPX cacute kcommaaccent -20 -KPX ccaron comma -15 -KPX ccaron k -20 -KPX ccaron kcommaaccent -20 -KPX ccedilla comma -15 -KPX ccedilla k -20 -KPX ccedilla kcommaaccent -20 -KPX colon space -50 -KPX comma quotedblright -100 -KPX comma quoteright -100 -KPX e comma -15 -KPX e period -15 -KPX e v -30 -KPX e w -20 -KPX e x -30 -KPX e y -20 -KPX e yacute -20 -KPX e ydieresis -20 -KPX eacute comma -15 -KPX eacute period -15 -KPX eacute v -30 -KPX eacute w -20 -KPX eacute x -30 -KPX eacute y -20 -KPX eacute yacute -20 -KPX eacute ydieresis -20 -KPX ecaron comma -15 -KPX ecaron period -15 -KPX ecaron v -30 -KPX ecaron w -20 -KPX ecaron x -30 -KPX ecaron y -20 -KPX ecaron yacute -20 -KPX ecaron ydieresis -20 -KPX ecircumflex comma -15 -KPX ecircumflex period -15 -KPX ecircumflex v -30 -KPX ecircumflex w -20 -KPX ecircumflex x -30 -KPX ecircumflex y -20 -KPX ecircumflex yacute -20 -KPX ecircumflex ydieresis -20 -KPX edieresis comma -15 -KPX edieresis period -15 -KPX edieresis v -30 -KPX edieresis w -20 -KPX edieresis x -30 -KPX edieresis y -20 -KPX edieresis yacute -20 -KPX edieresis ydieresis -20 -KPX edotaccent comma -15 -KPX edotaccent period -15 -KPX edotaccent v -30 -KPX edotaccent w -20 -KPX edotaccent x -30 -KPX edotaccent y -20 -KPX edotaccent yacute -20 -KPX edotaccent ydieresis -20 -KPX egrave comma -15 -KPX egrave period -15 -KPX egrave v -30 -KPX egrave w -20 -KPX egrave x -30 -KPX egrave y -20 -KPX egrave yacute -20 -KPX egrave ydieresis -20 -KPX emacron comma -15 -KPX emacron period -15 -KPX emacron v -30 -KPX emacron w -20 -KPX emacron x -30 -KPX emacron y -20 -KPX emacron yacute -20 -KPX emacron ydieresis -20 -KPX eogonek comma -15 -KPX eogonek period -15 -KPX eogonek v -30 -KPX eogonek w -20 -KPX eogonek x -30 -KPX eogonek y -20 -KPX eogonek yacute -20 -KPX eogonek ydieresis -20 -KPX f a -30 -KPX f aacute -30 -KPX f abreve -30 -KPX f acircumflex -30 -KPX f adieresis -30 -KPX f agrave -30 -KPX f amacron -30 -KPX f aogonek -30 -KPX f aring -30 -KPX f atilde -30 -KPX f comma -30 -KPX f dotlessi -28 -KPX f e -30 -KPX f eacute -30 -KPX f ecaron -30 -KPX f ecircumflex -30 -KPX f edieresis -30 -KPX f edotaccent -30 -KPX f egrave -30 -KPX f emacron -30 -KPX f eogonek -30 -KPX f o -30 -KPX f oacute -30 -KPX f ocircumflex -30 -KPX f odieresis -30 -KPX f ograve -30 -KPX f ohungarumlaut -30 -KPX f omacron -30 -KPX f oslash -30 -KPX f otilde -30 -KPX f period -30 -KPX f quotedblright 60 -KPX f quoteright 50 -KPX g r -10 -KPX g racute -10 -KPX g rcaron -10 -KPX g rcommaaccent -10 -KPX gbreve r -10 -KPX gbreve racute -10 -KPX gbreve rcaron -10 -KPX gbreve rcommaaccent -10 -KPX gcommaaccent r -10 -KPX gcommaaccent racute -10 -KPX gcommaaccent rcaron -10 -KPX gcommaaccent rcommaaccent -10 -KPX h y -30 -KPX h yacute -30 -KPX h ydieresis -30 -KPX k e -20 -KPX k eacute -20 -KPX k ecaron -20 -KPX k ecircumflex -20 -KPX k edieresis -20 -KPX k edotaccent -20 -KPX k egrave -20 -KPX k emacron -20 -KPX k eogonek -20 -KPX k o -20 -KPX k oacute -20 -KPX k ocircumflex -20 -KPX k odieresis -20 -KPX k ograve -20 -KPX k ohungarumlaut -20 -KPX k omacron -20 -KPX k oslash -20 -KPX k otilde -20 -KPX kcommaaccent e -20 -KPX kcommaaccent eacute -20 -KPX kcommaaccent ecaron -20 -KPX kcommaaccent ecircumflex -20 -KPX kcommaaccent edieresis -20 -KPX kcommaaccent edotaccent -20 -KPX kcommaaccent egrave -20 -KPX kcommaaccent emacron -20 -KPX kcommaaccent eogonek -20 -KPX kcommaaccent o -20 -KPX kcommaaccent oacute -20 -KPX kcommaaccent ocircumflex -20 -KPX kcommaaccent odieresis -20 -KPX kcommaaccent ograve -20 -KPX kcommaaccent ohungarumlaut -20 -KPX kcommaaccent omacron -20 -KPX kcommaaccent oslash -20 -KPX kcommaaccent otilde -20 -KPX m u -10 -KPX m uacute -10 -KPX m ucircumflex -10 -KPX m udieresis -10 -KPX m ugrave -10 -KPX m uhungarumlaut -10 -KPX m umacron -10 -KPX m uogonek -10 -KPX m uring -10 -KPX m y -15 -KPX m yacute -15 -KPX m ydieresis -15 -KPX n u -10 -KPX n uacute -10 -KPX n ucircumflex -10 -KPX n udieresis -10 -KPX n ugrave -10 -KPX n uhungarumlaut -10 -KPX n umacron -10 -KPX n uogonek -10 -KPX n uring -10 -KPX n v -20 -KPX n y -15 -KPX n yacute -15 -KPX n ydieresis -15 -KPX nacute u -10 -KPX nacute uacute -10 -KPX nacute ucircumflex -10 -KPX nacute udieresis -10 -KPX nacute ugrave -10 -KPX nacute uhungarumlaut -10 -KPX nacute umacron -10 -KPX nacute uogonek -10 -KPX nacute uring -10 -KPX nacute v -20 -KPX nacute y -15 -KPX nacute yacute -15 -KPX nacute ydieresis -15 -KPX ncaron u -10 -KPX ncaron uacute -10 -KPX ncaron ucircumflex -10 -KPX ncaron udieresis -10 -KPX ncaron ugrave -10 -KPX ncaron uhungarumlaut -10 -KPX ncaron umacron -10 -KPX ncaron uogonek -10 -KPX ncaron uring -10 -KPX ncaron v -20 -KPX ncaron y -15 -KPX ncaron yacute -15 -KPX ncaron ydieresis -15 -KPX ncommaaccent u -10 -KPX ncommaaccent uacute -10 -KPX ncommaaccent ucircumflex -10 -KPX ncommaaccent udieresis -10 -KPX ncommaaccent ugrave -10 -KPX ncommaaccent uhungarumlaut -10 -KPX ncommaaccent umacron -10 -KPX ncommaaccent uogonek -10 -KPX ncommaaccent uring -10 -KPX ncommaaccent v -20 -KPX ncommaaccent y -15 -KPX ncommaaccent yacute -15 -KPX ncommaaccent ydieresis -15 -KPX ntilde u -10 -KPX ntilde uacute -10 -KPX ntilde ucircumflex -10 -KPX ntilde udieresis -10 -KPX ntilde ugrave -10 -KPX ntilde uhungarumlaut -10 -KPX ntilde umacron -10 -KPX ntilde uogonek -10 -KPX ntilde uring -10 -KPX ntilde v -20 -KPX ntilde y -15 -KPX ntilde yacute -15 -KPX ntilde ydieresis -15 -KPX o comma -40 -KPX o period -40 -KPX o v -15 -KPX o w -15 -KPX o x -30 -KPX o y -30 -KPX o yacute -30 -KPX o ydieresis -30 -KPX oacute comma -40 -KPX oacute period -40 -KPX oacute v -15 -KPX oacute w -15 -KPX oacute x -30 -KPX oacute y -30 -KPX oacute yacute -30 -KPX oacute ydieresis -30 -KPX ocircumflex comma -40 -KPX ocircumflex period -40 -KPX ocircumflex v -15 -KPX ocircumflex w -15 -KPX ocircumflex x -30 -KPX ocircumflex y -30 -KPX ocircumflex yacute -30 -KPX ocircumflex ydieresis -30 -KPX odieresis comma -40 -KPX odieresis period -40 -KPX odieresis v -15 -KPX odieresis w -15 -KPX odieresis x -30 -KPX odieresis y -30 -KPX odieresis yacute -30 -KPX odieresis ydieresis -30 -KPX ograve comma -40 -KPX ograve period -40 -KPX ograve v -15 -KPX ograve w -15 -KPX ograve x -30 -KPX ograve y -30 -KPX ograve yacute -30 -KPX ograve ydieresis -30 -KPX ohungarumlaut comma -40 -KPX ohungarumlaut period -40 -KPX ohungarumlaut v -15 -KPX ohungarumlaut w -15 -KPX ohungarumlaut x -30 -KPX ohungarumlaut y -30 -KPX ohungarumlaut yacute -30 -KPX ohungarumlaut ydieresis -30 -KPX omacron comma -40 -KPX omacron period -40 -KPX omacron v -15 -KPX omacron w -15 -KPX omacron x -30 -KPX omacron y -30 -KPX omacron yacute -30 -KPX omacron ydieresis -30 -KPX oslash a -55 -KPX oslash aacute -55 -KPX oslash abreve -55 -KPX oslash acircumflex -55 -KPX oslash adieresis -55 -KPX oslash agrave -55 -KPX oslash amacron -55 -KPX oslash aogonek -55 -KPX oslash aring -55 -KPX oslash atilde -55 -KPX oslash b -55 -KPX oslash c -55 -KPX oslash cacute -55 -KPX oslash ccaron -55 -KPX oslash ccedilla -55 -KPX oslash comma -95 -KPX oslash d -55 -KPX oslash dcroat -55 -KPX oslash e -55 -KPX oslash eacute -55 -KPX oslash ecaron -55 -KPX oslash ecircumflex -55 -KPX oslash edieresis -55 -KPX oslash edotaccent -55 -KPX oslash egrave -55 -KPX oslash emacron -55 -KPX oslash eogonek -55 -KPX oslash f -55 -KPX oslash g -55 -KPX oslash gbreve -55 -KPX oslash gcommaaccent -55 -KPX oslash h -55 -KPX oslash i -55 -KPX oslash iacute -55 -KPX oslash icircumflex -55 -KPX oslash idieresis -55 -KPX oslash igrave -55 -KPX oslash imacron -55 -KPX oslash iogonek -55 -KPX oslash j -55 -KPX oslash k -55 -KPX oslash kcommaaccent -55 -KPX oslash l -55 -KPX oslash lacute -55 -KPX oslash lcommaaccent -55 -KPX oslash lslash -55 -KPX oslash m -55 -KPX oslash n -55 -KPX oslash nacute -55 -KPX oslash ncaron -55 -KPX oslash ncommaaccent -55 -KPX oslash ntilde -55 -KPX oslash o -55 -KPX oslash oacute -55 -KPX oslash ocircumflex -55 -KPX oslash odieresis -55 -KPX oslash ograve -55 -KPX oslash ohungarumlaut -55 -KPX oslash omacron -55 -KPX oslash oslash -55 -KPX oslash otilde -55 -KPX oslash p -55 -KPX oslash period -95 -KPX oslash q -55 -KPX oslash r -55 -KPX oslash racute -55 -KPX oslash rcaron -55 -KPX oslash rcommaaccent -55 -KPX oslash s -55 -KPX oslash sacute -55 -KPX oslash scaron -55 -KPX oslash scedilla -55 -KPX oslash scommaaccent -55 -KPX oslash t -55 -KPX oslash tcommaaccent -55 -KPX oslash u -55 -KPX oslash uacute -55 -KPX oslash ucircumflex -55 -KPX oslash udieresis -55 -KPX oslash ugrave -55 -KPX oslash uhungarumlaut -55 -KPX oslash umacron -55 -KPX oslash uogonek -55 -KPX oslash uring -55 -KPX oslash v -70 -KPX oslash w -70 -KPX oslash x -85 -KPX oslash y -70 -KPX oslash yacute -70 -KPX oslash ydieresis -70 -KPX oslash z -55 -KPX oslash zacute -55 -KPX oslash zcaron -55 -KPX oslash zdotaccent -55 -KPX otilde comma -40 -KPX otilde period -40 -KPX otilde v -15 -KPX otilde w -15 -KPX otilde x -30 -KPX otilde y -30 -KPX otilde yacute -30 -KPX otilde ydieresis -30 -KPX p comma -35 -KPX p period -35 -KPX p y -30 -KPX p yacute -30 -KPX p ydieresis -30 -KPX period quotedblright -100 -KPX period quoteright -100 -KPX period space -60 -KPX quotedblright space -40 -KPX quoteleft quoteleft -57 -KPX quoteright d -50 -KPX quoteright dcroat -50 -KPX quoteright quoteright -57 -KPX quoteright r -50 -KPX quoteright racute -50 -KPX quoteright rcaron -50 -KPX quoteright rcommaaccent -50 -KPX quoteright s -50 -KPX quoteright sacute -50 -KPX quoteright scaron -50 -KPX quoteright scedilla -50 -KPX quoteright scommaaccent -50 -KPX quoteright space -70 -KPX r a -10 -KPX r aacute -10 -KPX r abreve -10 -KPX r acircumflex -10 -KPX r adieresis -10 -KPX r agrave -10 -KPX r amacron -10 -KPX r aogonek -10 -KPX r aring -10 -KPX r atilde -10 -KPX r colon 30 -KPX r comma -50 -KPX r i 15 -KPX r iacute 15 -KPX r icircumflex 15 -KPX r idieresis 15 -KPX r igrave 15 -KPX r imacron 15 -KPX r iogonek 15 -KPX r k 15 -KPX r kcommaaccent 15 -KPX r l 15 -KPX r lacute 15 -KPX r lcommaaccent 15 -KPX r lslash 15 -KPX r m 25 -KPX r n 25 -KPX r nacute 25 -KPX r ncaron 25 -KPX r ncommaaccent 25 -KPX r ntilde 25 -KPX r p 30 -KPX r period -50 -KPX r semicolon 30 -KPX r t 40 -KPX r tcommaaccent 40 -KPX r u 15 -KPX r uacute 15 -KPX r ucircumflex 15 -KPX r udieresis 15 -KPX r ugrave 15 -KPX r uhungarumlaut 15 -KPX r umacron 15 -KPX r uogonek 15 -KPX r uring 15 -KPX r v 30 -KPX r y 30 -KPX r yacute 30 -KPX r ydieresis 30 -KPX racute a -10 -KPX racute aacute -10 -KPX racute abreve -10 -KPX racute acircumflex -10 -KPX racute adieresis -10 -KPX racute agrave -10 -KPX racute amacron -10 -KPX racute aogonek -10 -KPX racute aring -10 -KPX racute atilde -10 -KPX racute colon 30 -KPX racute comma -50 -KPX racute i 15 -KPX racute iacute 15 -KPX racute icircumflex 15 -KPX racute idieresis 15 -KPX racute igrave 15 -KPX racute imacron 15 -KPX racute iogonek 15 -KPX racute k 15 -KPX racute kcommaaccent 15 -KPX racute l 15 -KPX racute lacute 15 -KPX racute lcommaaccent 15 -KPX racute lslash 15 -KPX racute m 25 -KPX racute n 25 -KPX racute nacute 25 -KPX racute ncaron 25 -KPX racute ncommaaccent 25 -KPX racute ntilde 25 -KPX racute p 30 -KPX racute period -50 -KPX racute semicolon 30 -KPX racute t 40 -KPX racute tcommaaccent 40 -KPX racute u 15 -KPX racute uacute 15 -KPX racute ucircumflex 15 -KPX racute udieresis 15 -KPX racute ugrave 15 -KPX racute uhungarumlaut 15 -KPX racute umacron 15 -KPX racute uogonek 15 -KPX racute uring 15 -KPX racute v 30 -KPX racute y 30 -KPX racute yacute 30 -KPX racute ydieresis 30 -KPX rcaron a -10 -KPX rcaron aacute -10 -KPX rcaron abreve -10 -KPX rcaron acircumflex -10 -KPX rcaron adieresis -10 -KPX rcaron agrave -10 -KPX rcaron amacron -10 -KPX rcaron aogonek -10 -KPX rcaron aring -10 -KPX rcaron atilde -10 -KPX rcaron colon 30 -KPX rcaron comma -50 -KPX rcaron i 15 -KPX rcaron iacute 15 -KPX rcaron icircumflex 15 -KPX rcaron idieresis 15 -KPX rcaron igrave 15 -KPX rcaron imacron 15 -KPX rcaron iogonek 15 -KPX rcaron k 15 -KPX rcaron kcommaaccent 15 -KPX rcaron l 15 -KPX rcaron lacute 15 -KPX rcaron lcommaaccent 15 -KPX rcaron lslash 15 -KPX rcaron m 25 -KPX rcaron n 25 -KPX rcaron nacute 25 -KPX rcaron ncaron 25 -KPX rcaron ncommaaccent 25 -KPX rcaron ntilde 25 -KPX rcaron p 30 -KPX rcaron period -50 -KPX rcaron semicolon 30 -KPX rcaron t 40 -KPX rcaron tcommaaccent 40 -KPX rcaron u 15 -KPX rcaron uacute 15 -KPX rcaron ucircumflex 15 -KPX rcaron udieresis 15 -KPX rcaron ugrave 15 -KPX rcaron uhungarumlaut 15 -KPX rcaron umacron 15 -KPX rcaron uogonek 15 -KPX rcaron uring 15 -KPX rcaron v 30 -KPX rcaron y 30 -KPX rcaron yacute 30 -KPX rcaron ydieresis 30 -KPX rcommaaccent a -10 -KPX rcommaaccent aacute -10 -KPX rcommaaccent abreve -10 -KPX rcommaaccent acircumflex -10 -KPX rcommaaccent adieresis -10 -KPX rcommaaccent agrave -10 -KPX rcommaaccent amacron -10 -KPX rcommaaccent aogonek -10 -KPX rcommaaccent aring -10 -KPX rcommaaccent atilde -10 -KPX rcommaaccent colon 30 -KPX rcommaaccent comma -50 -KPX rcommaaccent i 15 -KPX rcommaaccent iacute 15 -KPX rcommaaccent icircumflex 15 -KPX rcommaaccent idieresis 15 -KPX rcommaaccent igrave 15 -KPX rcommaaccent imacron 15 -KPX rcommaaccent iogonek 15 -KPX rcommaaccent k 15 -KPX rcommaaccent kcommaaccent 15 -KPX rcommaaccent l 15 -KPX rcommaaccent lacute 15 -KPX rcommaaccent lcommaaccent 15 -KPX rcommaaccent lslash 15 -KPX rcommaaccent m 25 -KPX rcommaaccent n 25 -KPX rcommaaccent nacute 25 -KPX rcommaaccent ncaron 25 -KPX rcommaaccent ncommaaccent 25 -KPX rcommaaccent ntilde 25 -KPX rcommaaccent p 30 -KPX rcommaaccent period -50 -KPX rcommaaccent semicolon 30 -KPX rcommaaccent t 40 -KPX rcommaaccent tcommaaccent 40 -KPX rcommaaccent u 15 -KPX rcommaaccent uacute 15 -KPX rcommaaccent ucircumflex 15 -KPX rcommaaccent udieresis 15 -KPX rcommaaccent ugrave 15 -KPX rcommaaccent uhungarumlaut 15 -KPX rcommaaccent umacron 15 -KPX rcommaaccent uogonek 15 -KPX rcommaaccent uring 15 -KPX rcommaaccent v 30 -KPX rcommaaccent y 30 -KPX rcommaaccent yacute 30 -KPX rcommaaccent ydieresis 30 -KPX s comma -15 -KPX s period -15 -KPX s w -30 -KPX sacute comma -15 -KPX sacute period -15 -KPX sacute w -30 -KPX scaron comma -15 -KPX scaron period -15 -KPX scaron w -30 -KPX scedilla comma -15 -KPX scedilla period -15 -KPX scedilla w -30 -KPX scommaaccent comma -15 -KPX scommaaccent period -15 -KPX scommaaccent w -30 -KPX semicolon space -50 -KPX space T -50 -KPX space Tcaron -50 -KPX space Tcommaaccent -50 -KPX space V -50 -KPX space W -40 -KPX space Y -90 -KPX space Yacute -90 -KPX space Ydieresis -90 -KPX space quotedblleft -30 -KPX space quoteleft -60 -KPX v a -25 -KPX v aacute -25 -KPX v abreve -25 -KPX v acircumflex -25 -KPX v adieresis -25 -KPX v agrave -25 -KPX v amacron -25 -KPX v aogonek -25 -KPX v aring -25 -KPX v atilde -25 -KPX v comma -80 -KPX v e -25 -KPX v eacute -25 -KPX v ecaron -25 -KPX v ecircumflex -25 -KPX v edieresis -25 -KPX v edotaccent -25 -KPX v egrave -25 -KPX v emacron -25 -KPX v eogonek -25 -KPX v o -25 -KPX v oacute -25 -KPX v ocircumflex -25 -KPX v odieresis -25 -KPX v ograve -25 -KPX v ohungarumlaut -25 -KPX v omacron -25 -KPX v oslash -25 -KPX v otilde -25 -KPX v period -80 -KPX w a -15 -KPX w aacute -15 -KPX w abreve -15 -KPX w acircumflex -15 -KPX w adieresis -15 -KPX w agrave -15 -KPX w amacron -15 -KPX w aogonek -15 -KPX w aring -15 -KPX w atilde -15 -KPX w comma -60 -KPX w e -10 -KPX w eacute -10 -KPX w ecaron -10 -KPX w ecircumflex -10 -KPX w edieresis -10 -KPX w edotaccent -10 -KPX w egrave -10 -KPX w emacron -10 -KPX w eogonek -10 -KPX w o -10 -KPX w oacute -10 -KPX w ocircumflex -10 -KPX w odieresis -10 -KPX w ograve -10 -KPX w ohungarumlaut -10 -KPX w omacron -10 -KPX w oslash -10 -KPX w otilde -10 -KPX w period -60 -KPX x e -30 -KPX x eacute -30 -KPX x ecaron -30 -KPX x ecircumflex -30 -KPX x edieresis -30 -KPX x edotaccent -30 -KPX x egrave -30 -KPX x emacron -30 -KPX x eogonek -30 -KPX y a -20 -KPX y aacute -20 -KPX y abreve -20 -KPX y acircumflex -20 -KPX y adieresis -20 -KPX y agrave -20 -KPX y amacron -20 -KPX y aogonek -20 -KPX y aring -20 -KPX y atilde -20 -KPX y comma -100 -KPX y e -20 -KPX y eacute -20 -KPX y ecaron -20 -KPX y ecircumflex -20 -KPX y edieresis -20 -KPX y edotaccent -20 -KPX y egrave -20 -KPX y emacron -20 -KPX y eogonek -20 -KPX y o -20 -KPX y oacute -20 -KPX y ocircumflex -20 -KPX y odieresis -20 -KPX y ograve -20 -KPX y ohungarumlaut -20 -KPX y omacron -20 -KPX y oslash -20 -KPX y otilde -20 -KPX y period -100 -KPX yacute a -20 -KPX yacute aacute -20 -KPX yacute abreve -20 -KPX yacute acircumflex -20 -KPX yacute adieresis -20 -KPX yacute agrave -20 -KPX yacute amacron -20 -KPX yacute aogonek -20 -KPX yacute aring -20 -KPX yacute atilde -20 -KPX yacute comma -100 -KPX yacute e -20 -KPX yacute eacute -20 -KPX yacute ecaron -20 -KPX yacute ecircumflex -20 -KPX yacute edieresis -20 -KPX yacute edotaccent -20 -KPX yacute egrave -20 -KPX yacute emacron -20 -KPX yacute eogonek -20 -KPX yacute o -20 -KPX yacute oacute -20 -KPX yacute ocircumflex -20 -KPX yacute odieresis -20 -KPX yacute ograve -20 -KPX yacute ohungarumlaut -20 -KPX yacute omacron -20 -KPX yacute oslash -20 -KPX yacute otilde -20 -KPX yacute period -100 -KPX ydieresis a -20 -KPX ydieresis aacute -20 -KPX ydieresis abreve -20 -KPX ydieresis acircumflex -20 -KPX ydieresis adieresis -20 -KPX ydieresis agrave -20 -KPX ydieresis amacron -20 -KPX ydieresis aogonek -20 -KPX ydieresis aring -20 -KPX ydieresis atilde -20 -KPX ydieresis comma -100 -KPX ydieresis e -20 -KPX ydieresis eacute -20 -KPX ydieresis ecaron -20 -KPX ydieresis ecircumflex -20 -KPX ydieresis edieresis -20 -KPX ydieresis edotaccent -20 -KPX ydieresis egrave -20 -KPX ydieresis emacron -20 -KPX ydieresis eogonek -20 -KPX ydieresis o -20 -KPX ydieresis oacute -20 -KPX ydieresis ocircumflex -20 -KPX ydieresis odieresis -20 -KPX ydieresis ograve -20 -KPX ydieresis ohungarumlaut -20 -KPX ydieresis omacron -20 -KPX ydieresis oslash -20 -KPX ydieresis otilde -20 -KPX ydieresis period -100 -KPX z e -15 -KPX z eacute -15 -KPX z ecaron -15 -KPX z ecircumflex -15 -KPX z edieresis -15 -KPX z edotaccent -15 -KPX z egrave -15 -KPX z emacron -15 -KPX z eogonek -15 -KPX z o -15 -KPX z oacute -15 -KPX z ocircumflex -15 -KPX z odieresis -15 -KPX z ograve -15 -KPX z ohungarumlaut -15 -KPX z omacron -15 -KPX z oslash -15 -KPX z otilde -15 -KPX zacute e -15 -KPX zacute eacute -15 -KPX zacute ecaron -15 -KPX zacute ecircumflex -15 -KPX zacute edieresis -15 -KPX zacute edotaccent -15 -KPX zacute egrave -15 -KPX zacute emacron -15 -KPX zacute eogonek -15 -KPX zacute o -15 -KPX zacute oacute -15 -KPX zacute ocircumflex -15 -KPX zacute odieresis -15 -KPX zacute ograve -15 -KPX zacute ohungarumlaut -15 -KPX zacute omacron -15 -KPX zacute oslash -15 -KPX zacute otilde -15 -KPX zcaron e -15 -KPX zcaron eacute -15 -KPX zcaron ecaron -15 -KPX zcaron ecircumflex -15 -KPX zcaron edieresis -15 -KPX zcaron edotaccent -15 -KPX zcaron egrave -15 -KPX zcaron emacron -15 -KPX zcaron eogonek -15 -KPX zcaron o -15 -KPX zcaron oacute -15 -KPX zcaron ocircumflex -15 -KPX zcaron odieresis -15 -KPX zcaron ograve -15 -KPX zcaron ohungarumlaut -15 -KPX zcaron omacron -15 -KPX zcaron oslash -15 -KPX zcaron otilde -15 -KPX zdotaccent e -15 -KPX zdotaccent eacute -15 -KPX zdotaccent ecaron -15 -KPX zdotaccent ecircumflex -15 -KPX zdotaccent edieresis -15 -KPX zdotaccent edotaccent -15 -KPX zdotaccent egrave -15 -KPX zdotaccent emacron -15 -KPX zdotaccent eogonek -15 -KPX zdotaccent o -15 -KPX zdotaccent oacute -15 -KPX zdotaccent ocircumflex -15 -KPX zdotaccent odieresis -15 -KPX zdotaccent ograve -15 -KPX zdotaccent ohungarumlaut -15 -KPX zdotaccent omacron -15 -KPX zdotaccent oslash -15 -KPX zdotaccent otilde -15 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Helvetica.afm b/vendor/dompdf/dompdf/lib/fonts/Helvetica.afm deleted file mode 100644 index c418dc1..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Helvetica.afm +++ /dev/null @@ -1,3053 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 1 12:38:23 1997 -Comment UniqueID 43054 -Comment VMusage 37069 48094 -FontName Helvetica -FullName Helvetica -FamilyName Helvetica -Weight Medium -ItalicAngle 0 -IsFixedPitch false -CharacterSet ExtendedRoman -FontBBox -166 -225 1000 931 -UnderlinePosition -100 -UnderlineThickness 50 -Version 002.000 -Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. -EncodingScheme WinAnsiEncoding -CapHeight 718 -XHeight 523 -Ascender 718 -Descender -207 -StdHW 76 -StdVW 88 -StartCharMetrics 317 -C 32 ; WX 278 ; N space ; B 0 0 0 0 ; -C 160 ; WX 278 ; N space ; B 0 0 0 0 ; -C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ; -C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ; -C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ; -C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ; -C 37 ; WX 889 ; N percent ; B 39 -19 850 703 ; -C 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ; -C 146 ; WX 222 ; N quoteright ; B 53 463 157 718 ; -C 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ; -C 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ; -C 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ; -C 43 ; WX 584 ; N plus ; B 39 0 545 505 ; -C 44 ; WX 278 ; N comma ; B 87 -147 191 106 ; -C 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ; -C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; -C 46 ; WX 278 ; N period ; B 87 0 191 106 ; -C 47 ; WX 278 ; N slash ; B -17 -19 295 737 ; -C 48 ; WX 556 ; N zero ; B 37 -19 519 703 ; -C 49 ; WX 556 ; N one ; B 101 0 359 703 ; -C 50 ; WX 556 ; N two ; B 26 0 507 703 ; -C 51 ; WX 556 ; N three ; B 34 -19 522 703 ; -C 52 ; WX 556 ; N four ; B 25 0 523 703 ; -C 53 ; WX 556 ; N five ; B 32 -19 514 688 ; -C 54 ; WX 556 ; N six ; B 38 -19 518 703 ; -C 55 ; WX 556 ; N seven ; B 37 0 523 688 ; -C 56 ; WX 556 ; N eight ; B 38 -19 517 703 ; -C 57 ; WX 556 ; N nine ; B 42 -19 514 703 ; -C 58 ; WX 278 ; N colon ; B 87 0 191 516 ; -C 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ; -C 60 ; WX 584 ; N less ; B 48 11 536 495 ; -C 61 ; WX 584 ; N equal ; B 39 115 545 390 ; -C 62 ; WX 584 ; N greater ; B 48 11 536 495 ; -C 63 ; WX 556 ; N question ; B 56 0 492 727 ; -C 64 ; WX 1015 ; N at ; B 147 -19 868 737 ; -C 65 ; WX 667 ; N A ; B 14 0 654 718 ; -C 66 ; WX 667 ; N B ; B 74 0 627 718 ; -C 67 ; WX 722 ; N C ; B 44 -19 681 737 ; -C 68 ; WX 722 ; N D ; B 81 0 674 718 ; -C 69 ; WX 667 ; N E ; B 86 0 616 718 ; -C 70 ; WX 611 ; N F ; B 86 0 583 718 ; -C 71 ; WX 778 ; N G ; B 48 -19 704 737 ; -C 72 ; WX 722 ; N H ; B 77 0 646 718 ; -C 73 ; WX 278 ; N I ; B 91 0 188 718 ; -C 74 ; WX 500 ; N J ; B 17 -19 428 718 ; -C 75 ; WX 667 ; N K ; B 76 0 663 718 ; -C 76 ; WX 556 ; N L ; B 76 0 537 718 ; -C 77 ; WX 833 ; N M ; B 73 0 761 718 ; -C 78 ; WX 722 ; N N ; B 76 0 646 718 ; -C 79 ; WX 778 ; N O ; B 39 -19 739 737 ; -C 80 ; WX 667 ; N P ; B 86 0 622 718 ; -C 81 ; WX 778 ; N Q ; B 39 -56 739 737 ; -C 82 ; WX 722 ; N R ; B 88 0 684 718 ; -C 83 ; WX 667 ; N S ; B 49 -19 620 737 ; -C 84 ; WX 611 ; N T ; B 14 0 597 718 ; -C 85 ; WX 722 ; N U ; B 79 -19 644 718 ; -C 86 ; WX 667 ; N V ; B 20 0 647 718 ; -C 87 ; WX 944 ; N W ; B 16 0 928 718 ; -C 88 ; WX 667 ; N X ; B 19 0 648 718 ; -C 89 ; WX 667 ; N Y ; B 14 0 653 718 ; -C 90 ; WX 611 ; N Z ; B 23 0 588 718 ; -C 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ; -C 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ; -C 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ; -C 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ; -C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; -C 145 ; WX 222 ; N quoteleft ; B 65 470 169 725 ; -C 97 ; WX 556 ; N a ; B 36 -15 530 538 ; -C 98 ; WX 556 ; N b ; B 58 -15 517 718 ; -C 99 ; WX 500 ; N c ; B 30 -15 477 538 ; -C 100 ; WX 556 ; N d ; B 35 -15 499 718 ; -C 101 ; WX 556 ; N e ; B 40 -15 516 538 ; -C 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ; -C 103 ; WX 556 ; N g ; B 40 -220 499 538 ; -C 104 ; WX 556 ; N h ; B 65 0 491 718 ; -C 105 ; WX 222 ; N i ; B 67 0 155 718 ; -C 106 ; WX 222 ; N j ; B -16 -210 155 718 ; -C 107 ; WX 500 ; N k ; B 67 0 501 718 ; -C 108 ; WX 222 ; N l ; B 67 0 155 718 ; -C 109 ; WX 833 ; N m ; B 65 0 769 538 ; -C 110 ; WX 556 ; N n ; B 65 0 491 538 ; -C 111 ; WX 556 ; N o ; B 35 -14 521 538 ; -C 112 ; WX 556 ; N p ; B 58 -207 517 538 ; -C 113 ; WX 556 ; N q ; B 35 -207 494 538 ; -C 114 ; WX 333 ; N r ; B 77 0 332 538 ; -C 115 ; WX 500 ; N s ; B 32 -15 464 538 ; -C 116 ; WX 278 ; N t ; B 14 -7 257 669 ; -C 117 ; WX 556 ; N u ; B 68 -15 489 523 ; -C 118 ; WX 500 ; N v ; B 8 0 492 523 ; -C 119 ; WX 722 ; N w ; B 14 0 709 523 ; -C 120 ; WX 500 ; N x ; B 11 0 490 523 ; -C 121 ; WX 500 ; N y ; B 11 -214 489 523 ; -C 122 ; WX 500 ; N z ; B 31 0 469 523 ; -C 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ; -C 124 ; WX 260 ; N bar ; B 94 -225 167 775 ; -C 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ; -C 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ; -C 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ; -C 162 ; WX 556 ; N cent ; B 51 -115 513 623 ; -C 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ; -C -1 ; WX 167 ; N fraction ; B -166 -19 333 703 ; -C 165 ; WX 556 ; N yen ; B 3 0 553 688 ; -C 131 ; WX 556 ; N florin ; B -11 -207 501 737 ; -C 167 ; WX 556 ; N section ; B 43 -191 512 737 ; -C 164 ; WX 556 ; N currency ; B 28 99 528 603 ; -C 39 ; WX 191 ; N quotesingle ; B 59 463 132 718 ; -C 147 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ; -C 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ; -C 139 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ; -C 155 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ; -C -1 ; WX 500 ; N fi ; B 14 0 434 728 ; -C -1 ; WX 500 ; N fl ; B 14 0 432 728 ; -C 150 ; WX 556 ; N endash ; B 0 240 556 313 ; -C 134 ; WX 556 ; N dagger ; B 43 -159 514 718 ; -C 135 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ; -C 183 ; WX 278 ; N periodcentered ; B 77 190 202 315 ; -C 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ; -C 149 ; WX 350 ; N bullet ; B 18 202 333 517 ; -C 130 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ; -C 132 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ; -C 148 ; WX 333 ; N quotedblright ; B 26 463 295 718 ; -C 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ; -C 133 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ; -C 137 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ; -C 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ; -C 96 ; WX 333 ; N grave ; B 14 593 211 734 ; -C 180 ; WX 333 ; N acute ; B 122 593 319 734 ; -C 136 ; WX 333 ; N circumflex ; B 21 593 312 734 ; -C 152 ; WX 333 ; N tilde ; B -4 606 337 722 ; -C 175 ; WX 333 ; N macron ; B 10 627 323 684 ; -C -1 ; WX 333 ; N breve ; B 13 595 321 731 ; -C -1 ; WX 333 ; N dotaccent ; B 121 604 212 706 ; -C 168 ; WX 333 ; N dieresis ; B 40 604 293 706 ; -C -1 ; WX 333 ; N ring ; B 75 572 259 756 ; -C 184 ; WX 333 ; N cedilla ; B 45 -225 259 0 ; -C -1 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ; -C -1 ; WX 333 ; N ogonek ; B 73 -225 287 0 ; -C -1 ; WX 333 ; N caron ; B 21 593 312 734 ; -C 151 ; WX 1000 ; N emdash ; B 0 240 1000 313 ; -C 198 ; WX 1000 ; N AE ; B 8 0 951 718 ; -C 170 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ; -C -1 ; WX 556 ; N Lslash ; B -20 0 537 718 ; -C 216 ; WX 778 ; N Oslash ; B 39 -19 740 737 ; -C 140 ; WX 1000 ; N OE ; B 36 -19 965 737 ; -C 186 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ; -C 230 ; WX 889 ; N ae ; B 36 -15 847 538 ; -C -1 ; WX 278 ; N dotlessi ; B 95 0 183 523 ; -C -1 ; WX 222 ; N lslash ; B -20 0 242 718 ; -C 248 ; WX 611 ; N oslash ; B 28 -22 537 545 ; -C 156 ; WX 944 ; N oe ; B 35 -15 902 538 ; -C 223 ; WX 611 ; N germandbls ; B 67 -15 571 728 ; -C 207 ; WX 278 ; N Idieresis ; B 13 0 266 901 ; -C 233 ; WX 556 ; N eacute ; B 40 -15 516 734 ; -C -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ; -C -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ; -C -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ; -C 159 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ; -C 247 ; WX 584 ; N divide ; B 39 -19 545 524 ; -C 221 ; WX 667 ; N Yacute ; B 14 0 653 929 ; -C 194 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; -C 225 ; WX 556 ; N aacute ; B 36 -15 530 734 ; -C 219 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ; -C 253 ; WX 500 ; N yacute ; B 11 -214 489 734 ; -C -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ; -C 234 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ; -C -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ; -C 220 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ; -C -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ; -C 218 ; WX 722 ; N Uacute ; B 79 -19 644 929 ; -C -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ; -C 203 ; WX 667 ; N Edieresis ; B 86 0 616 901 ; -C -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ; -C -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ; -C 169 ; WX 737 ; N copyright ; B -14 -19 752 737 ; -C -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ; -C -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ; -C 229 ; WX 556 ; N aring ; B 36 -15 530 756 ; -C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ; -C -1 ; WX 222 ; N lacute ; B 67 0 264 929 ; -C 224 ; WX 556 ; N agrave ; B 36 -15 530 734 ; -C -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ; -C -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ; -C 227 ; WX 556 ; N atilde ; B 36 -15 530 722 ; -C -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ; -C 154 ; WX 500 ; N scaron ; B 32 -15 464 734 ; -C -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ; -C 237 ; WX 278 ; N iacute ; B 95 0 292 734 ; -C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ; -C -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ; -C -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ; -C 251 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ; -C 226 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ; -C -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ; -C -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ; -C 231 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ; -C -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ; -C 222 ; WX 667 ; N Thorn ; B 86 0 622 718 ; -C -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ; -C -1 ; WX 722 ; N Racute ; B 88 0 684 929 ; -C -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ; -C -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ; -C -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ; -C -1 ; WX 556 ; N uring ; B 68 -15 489 756 ; -C 179 ; WX 333 ; N threesuperior ; B 5 270 325 703 ; -C 210 ; WX 778 ; N Ograve ; B 39 -19 739 929 ; -C 192 ; WX 667 ; N Agrave ; B 14 0 654 929 ; -C -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ; -C 215 ; WX 584 ; N multiply ; B 39 0 545 506 ; -C 250 ; WX 556 ; N uacute ; B 68 -15 489 734 ; -C -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ; -C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ; -C 255 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ; -C -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ; -C 238 ; WX 278 ; N icircumflex ; B -6 0 285 734 ; -C 202 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ; -C 228 ; WX 556 ; N adieresis ; B 36 -15 530 706 ; -C 235 ; WX 556 ; N edieresis ; B 40 -15 516 706 ; -C -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ; -C -1 ; WX 556 ; N nacute ; B 65 0 491 734 ; -C -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ; -C -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ; -C 205 ; WX 278 ; N Iacute ; B 91 0 292 929 ; -C 177 ; WX 584 ; N plusminus ; B 39 0 545 506 ; -C 166 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ; -C 174 ; WX 737 ; N registered ; B -14 -19 752 737 ; -C -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ; -C -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ; -C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; -C 200 ; WX 667 ; N Egrave ; B 86 0 616 929 ; -C -1 ; WX 333 ; N racute ; B 77 0 332 734 ; -C -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ; -C -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ; -C 142 ; WX 611 ; N Zcaron ; B 23 0 588 929 ; -C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ; -C 208 ; WX 722 ; N Eth ; B 0 0 674 718 ; -C 199 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ; -C -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ; -C -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ; -C -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ; -C -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ; -C 193 ; WX 667 ; N Aacute ; B 14 0 654 929 ; -C 196 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; -C 232 ; WX 556 ; N egrave ; B 40 -15 516 734 ; -C -1 ; WX 500 ; N zacute ; B 31 0 469 734 ; -C -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ; -C 211 ; WX 778 ; N Oacute ; B 39 -19 739 929 ; -C 243 ; WX 556 ; N oacute ; B 35 -14 521 734 ; -C -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ; -C -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ; -C 239 ; WX 278 ; N idieresis ; B 13 0 266 706 ; -C 212 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ; -C 217 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ; -C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; -C 254 ; WX 556 ; N thorn ; B 58 -207 517 718 ; -C 178 ; WX 333 ; N twosuperior ; B 4 281 323 703 ; -C 214 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ; -C 181 ; WX 556 ; N mu ; B 68 -207 489 523 ; -C 236 ; WX 278 ; N igrave ; B -13 0 184 734 ; -C -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ; -C -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ; -C -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ; -C 190 ; WX 834 ; N threequarters ; B 45 -19 810 703 ; -C -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ; -C -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ; -C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ; -C -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ; -C 153 ; WX 1000 ; N trademark ; B 46 306 903 718 ; -C -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ; -C 204 ; WX 278 ; N Igrave ; B -13 0 188 929 ; -C -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ; -C -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ; -C 189 ; WX 834 ; N onehalf ; B 43 -19 773 703 ; -C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ; -C 244 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ; -C 241 ; WX 556 ; N ntilde ; B 65 0 491 722 ; -C -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ; -C 201 ; WX 667 ; N Eacute ; B 86 0 616 929 ; -C -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ; -C -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ; -C 188 ; WX 834 ; N onequarter ; B 73 -19 756 703 ; -C 138 ; WX 667 ; N Scaron ; B 49 -19 620 929 ; -C -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ; -C -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ; -C 176 ; WX 400 ; N degree ; B 54 411 346 703 ; -C 242 ; WX 556 ; N ograve ; B 35 -14 521 734 ; -C -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ; -C 249 ; WX 556 ; N ugrave ; B 68 -15 489 734 ; -C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ; -C -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ; -C -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ; -C 209 ; WX 722 ; N Ntilde ; B 76 0 646 917 ; -C 245 ; WX 556 ; N otilde ; B 35 -14 521 722 ; -C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ; -C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ; -C 195 ; WX 667 ; N Atilde ; B 14 0 654 917 ; -C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; -C 197 ; WX 667 ; N Aring ; B 14 0 654 931 ; -C 213 ; WX 778 ; N Otilde ; B 39 -19 739 917 ; -C -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ; -C -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ; -C -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ; -C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ; -C -1 ; WX 584 ; N minus ; B 39 216 545 289 ; -C 206 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ; -C -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ; -C -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ; -C 172 ; WX 584 ; N logicalnot ; B 39 108 545 390 ; -C 246 ; WX 556 ; N odieresis ; B 35 -14 521 706 ; -C 252 ; WX 556 ; N udieresis ; B 68 -15 489 706 ; -C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ; -C -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ; -C 240 ; WX 556 ; N eth ; B 35 -15 522 737 ; -C 158 ; WX 500 ; N zcaron ; B 31 0 469 734 ; -C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ; -C 185 ; WX 333 ; N onesuperior ; B 43 281 222 703 ; -C -1 ; WX 278 ; N imacron ; B 5 0 272 684 ; -C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -StartKernData -StartKernPairs 2705 -KPX A C -30 -KPX A Cacute -30 -KPX A Ccaron -30 -KPX A Ccedilla -30 -KPX A G -30 -KPX A Gbreve -30 -KPX A Gcommaaccent -30 -KPX A O -30 -KPX A Oacute -30 -KPX A Ocircumflex -30 -KPX A Odieresis -30 -KPX A Ograve -30 -KPX A Ohungarumlaut -30 -KPX A Omacron -30 -KPX A Oslash -30 -KPX A Otilde -30 -KPX A Q -30 -KPX A T -120 -KPX A Tcaron -120 -KPX A Tcommaaccent -120 -KPX A U -50 -KPX A Uacute -50 -KPX A Ucircumflex -50 -KPX A Udieresis -50 -KPX A Ugrave -50 -KPX A Uhungarumlaut -50 -KPX A Umacron -50 -KPX A Uogonek -50 -KPX A Uring -50 -KPX A V -70 -KPX A W -50 -KPX A Y -100 -KPX A Yacute -100 -KPX A Ydieresis -100 -KPX A u -30 -KPX A uacute -30 -KPX A ucircumflex -30 -KPX A udieresis -30 -KPX A ugrave -30 -KPX A uhungarumlaut -30 -KPX A umacron -30 -KPX A uogonek -30 -KPX A uring -30 -KPX A v -40 -KPX A w -40 -KPX A y -40 -KPX A yacute -40 -KPX A ydieresis -40 -KPX Aacute C -30 -KPX Aacute Cacute -30 -KPX Aacute Ccaron -30 -KPX Aacute Ccedilla -30 -KPX Aacute G -30 -KPX Aacute Gbreve -30 -KPX Aacute Gcommaaccent -30 -KPX Aacute O -30 -KPX Aacute Oacute -30 -KPX Aacute Ocircumflex -30 -KPX Aacute Odieresis -30 -KPX Aacute Ograve -30 -KPX Aacute Ohungarumlaut -30 -KPX Aacute Omacron -30 -KPX Aacute Oslash -30 -KPX Aacute Otilde -30 -KPX Aacute Q -30 -KPX Aacute T -120 -KPX Aacute Tcaron -120 -KPX Aacute Tcommaaccent -120 -KPX Aacute U -50 -KPX Aacute Uacute -50 -KPX Aacute Ucircumflex -50 -KPX Aacute Udieresis -50 -KPX Aacute Ugrave -50 -KPX Aacute Uhungarumlaut -50 -KPX Aacute Umacron -50 -KPX Aacute Uogonek -50 -KPX Aacute Uring -50 -KPX Aacute V -70 -KPX Aacute W -50 -KPX Aacute Y -100 -KPX Aacute Yacute -100 -KPX Aacute Ydieresis -100 -KPX Aacute u -30 -KPX Aacute uacute -30 -KPX Aacute ucircumflex -30 -KPX Aacute udieresis -30 -KPX Aacute ugrave -30 -KPX Aacute uhungarumlaut -30 -KPX Aacute umacron -30 -KPX Aacute uogonek -30 -KPX Aacute uring -30 -KPX Aacute v -40 -KPX Aacute w -40 -KPX Aacute y -40 -KPX Aacute yacute -40 -KPX Aacute ydieresis -40 -KPX Abreve C -30 -KPX Abreve Cacute -30 -KPX Abreve Ccaron -30 -KPX Abreve Ccedilla -30 -KPX Abreve G -30 -KPX Abreve Gbreve -30 -KPX Abreve Gcommaaccent -30 -KPX Abreve O -30 -KPX Abreve Oacute -30 -KPX Abreve Ocircumflex -30 -KPX Abreve Odieresis -30 -KPX Abreve Ograve -30 -KPX Abreve Ohungarumlaut -30 -KPX Abreve Omacron -30 -KPX Abreve Oslash -30 -KPX Abreve Otilde -30 -KPX Abreve Q -30 -KPX Abreve T -120 -KPX Abreve Tcaron -120 -KPX Abreve Tcommaaccent -120 -KPX Abreve U -50 -KPX Abreve Uacute -50 -KPX Abreve Ucircumflex -50 -KPX Abreve Udieresis -50 -KPX Abreve Ugrave -50 -KPX Abreve Uhungarumlaut -50 -KPX Abreve Umacron -50 -KPX Abreve Uogonek -50 -KPX Abreve Uring -50 -KPX Abreve V -70 -KPX Abreve W -50 -KPX Abreve Y -100 -KPX Abreve Yacute -100 -KPX Abreve Ydieresis -100 -KPX Abreve u -30 -KPX Abreve uacute -30 -KPX Abreve ucircumflex -30 -KPX Abreve udieresis -30 -KPX Abreve ugrave -30 -KPX Abreve uhungarumlaut -30 -KPX Abreve umacron -30 -KPX Abreve uogonek -30 -KPX Abreve uring -30 -KPX Abreve v -40 -KPX Abreve w -40 -KPX Abreve y -40 -KPX Abreve yacute -40 -KPX Abreve ydieresis -40 -KPX Acircumflex C -30 -KPX Acircumflex Cacute -30 -KPX Acircumflex Ccaron -30 -KPX Acircumflex Ccedilla -30 -KPX Acircumflex G -30 -KPX Acircumflex Gbreve -30 -KPX Acircumflex Gcommaaccent -30 -KPX Acircumflex O -30 -KPX Acircumflex Oacute -30 -KPX Acircumflex Ocircumflex -30 -KPX Acircumflex Odieresis -30 -KPX Acircumflex Ograve -30 -KPX Acircumflex Ohungarumlaut -30 -KPX Acircumflex Omacron -30 -KPX Acircumflex Oslash -30 -KPX Acircumflex Otilde -30 -KPX Acircumflex Q -30 -KPX Acircumflex T -120 -KPX Acircumflex Tcaron -120 -KPX Acircumflex Tcommaaccent -120 -KPX Acircumflex U -50 -KPX Acircumflex Uacute -50 -KPX Acircumflex Ucircumflex -50 -KPX Acircumflex Udieresis -50 -KPX Acircumflex Ugrave -50 -KPX Acircumflex Uhungarumlaut -50 -KPX Acircumflex Umacron -50 -KPX Acircumflex Uogonek -50 -KPX Acircumflex Uring -50 -KPX Acircumflex V -70 -KPX Acircumflex W -50 -KPX Acircumflex Y -100 -KPX Acircumflex Yacute -100 -KPX Acircumflex Ydieresis -100 -KPX Acircumflex u -30 -KPX Acircumflex uacute -30 -KPX Acircumflex ucircumflex -30 -KPX Acircumflex udieresis -30 -KPX Acircumflex ugrave -30 -KPX Acircumflex uhungarumlaut -30 -KPX Acircumflex umacron -30 -KPX Acircumflex uogonek -30 -KPX Acircumflex uring -30 -KPX Acircumflex v -40 -KPX Acircumflex w -40 -KPX Acircumflex y -40 -KPX Acircumflex yacute -40 -KPX Acircumflex ydieresis -40 -KPX Adieresis C -30 -KPX Adieresis Cacute -30 -KPX Adieresis Ccaron -30 -KPX Adieresis Ccedilla -30 -KPX Adieresis G -30 -KPX Adieresis Gbreve -30 -KPX Adieresis Gcommaaccent -30 -KPX Adieresis O -30 -KPX Adieresis Oacute -30 -KPX Adieresis Ocircumflex -30 -KPX Adieresis Odieresis -30 -KPX Adieresis Ograve -30 -KPX Adieresis Ohungarumlaut -30 -KPX Adieresis Omacron -30 -KPX Adieresis Oslash -30 -KPX Adieresis Otilde -30 -KPX Adieresis Q -30 -KPX Adieresis T -120 -KPX Adieresis Tcaron -120 -KPX Adieresis Tcommaaccent -120 -KPX Adieresis U -50 -KPX Adieresis Uacute -50 -KPX Adieresis Ucircumflex -50 -KPX Adieresis Udieresis -50 -KPX Adieresis Ugrave -50 -KPX Adieresis Uhungarumlaut -50 -KPX Adieresis Umacron -50 -KPX Adieresis Uogonek -50 -KPX Adieresis Uring -50 -KPX Adieresis V -70 -KPX Adieresis W -50 -KPX Adieresis Y -100 -KPX Adieresis Yacute -100 -KPX Adieresis Ydieresis -100 -KPX Adieresis u -30 -KPX Adieresis uacute -30 -KPX Adieresis ucircumflex -30 -KPX Adieresis udieresis -30 -KPX Adieresis ugrave -30 -KPX Adieresis uhungarumlaut -30 -KPX Adieresis umacron -30 -KPX Adieresis uogonek -30 -KPX Adieresis uring -30 -KPX Adieresis v -40 -KPX Adieresis w -40 -KPX Adieresis y -40 -KPX Adieresis yacute -40 -KPX Adieresis ydieresis -40 -KPX Agrave C -30 -KPX Agrave Cacute -30 -KPX Agrave Ccaron -30 -KPX Agrave Ccedilla -30 -KPX Agrave G -30 -KPX Agrave Gbreve -30 -KPX Agrave Gcommaaccent -30 -KPX Agrave O -30 -KPX Agrave Oacute -30 -KPX Agrave Ocircumflex -30 -KPX Agrave Odieresis -30 -KPX Agrave Ograve -30 -KPX Agrave Ohungarumlaut -30 -KPX Agrave Omacron -30 -KPX Agrave Oslash -30 -KPX Agrave Otilde -30 -KPX Agrave Q -30 -KPX Agrave T -120 -KPX Agrave Tcaron -120 -KPX Agrave Tcommaaccent -120 -KPX Agrave U -50 -KPX Agrave Uacute -50 -KPX Agrave Ucircumflex -50 -KPX Agrave Udieresis -50 -KPX Agrave Ugrave -50 -KPX Agrave Uhungarumlaut -50 -KPX Agrave Umacron -50 -KPX Agrave Uogonek -50 -KPX Agrave Uring -50 -KPX Agrave V -70 -KPX Agrave W -50 -KPX Agrave Y -100 -KPX Agrave Yacute -100 -KPX Agrave Ydieresis -100 -KPX Agrave u -30 -KPX Agrave uacute -30 -KPX Agrave ucircumflex -30 -KPX Agrave udieresis -30 -KPX Agrave ugrave -30 -KPX Agrave uhungarumlaut -30 -KPX Agrave umacron -30 -KPX Agrave uogonek -30 -KPX Agrave uring -30 -KPX Agrave v -40 -KPX Agrave w -40 -KPX Agrave y -40 -KPX Agrave yacute -40 -KPX Agrave ydieresis -40 -KPX Amacron C -30 -KPX Amacron Cacute -30 -KPX Amacron Ccaron -30 -KPX Amacron Ccedilla -30 -KPX Amacron G -30 -KPX Amacron Gbreve -30 -KPX Amacron Gcommaaccent -30 -KPX Amacron O -30 -KPX Amacron Oacute -30 -KPX Amacron Ocircumflex -30 -KPX Amacron Odieresis -30 -KPX Amacron Ograve -30 -KPX Amacron Ohungarumlaut -30 -KPX Amacron Omacron -30 -KPX Amacron Oslash -30 -KPX Amacron Otilde -30 -KPX Amacron Q -30 -KPX Amacron T -120 -KPX Amacron Tcaron -120 -KPX Amacron Tcommaaccent -120 -KPX Amacron U -50 -KPX Amacron Uacute -50 -KPX Amacron Ucircumflex -50 -KPX Amacron Udieresis -50 -KPX Amacron Ugrave -50 -KPX Amacron Uhungarumlaut -50 -KPX Amacron Umacron -50 -KPX Amacron Uogonek -50 -KPX Amacron Uring -50 -KPX Amacron V -70 -KPX Amacron W -50 -KPX Amacron Y -100 -KPX Amacron Yacute -100 -KPX Amacron Ydieresis -100 -KPX Amacron u -30 -KPX Amacron uacute -30 -KPX Amacron ucircumflex -30 -KPX Amacron udieresis -30 -KPX Amacron ugrave -30 -KPX Amacron uhungarumlaut -30 -KPX Amacron umacron -30 -KPX Amacron uogonek -30 -KPX Amacron uring -30 -KPX Amacron v -40 -KPX Amacron w -40 -KPX Amacron y -40 -KPX Amacron yacute -40 -KPX Amacron ydieresis -40 -KPX Aogonek C -30 -KPX Aogonek Cacute -30 -KPX Aogonek Ccaron -30 -KPX Aogonek Ccedilla -30 -KPX Aogonek G -30 -KPX Aogonek Gbreve -30 -KPX Aogonek Gcommaaccent -30 -KPX Aogonek O -30 -KPX Aogonek Oacute -30 -KPX Aogonek Ocircumflex -30 -KPX Aogonek Odieresis -30 -KPX Aogonek Ograve -30 -KPX Aogonek Ohungarumlaut -30 -KPX Aogonek Omacron -30 -KPX Aogonek Oslash -30 -KPX Aogonek Otilde -30 -KPX Aogonek Q -30 -KPX Aogonek T -120 -KPX Aogonek Tcaron -120 -KPX Aogonek Tcommaaccent -120 -KPX Aogonek U -50 -KPX Aogonek Uacute -50 -KPX Aogonek Ucircumflex -50 -KPX Aogonek Udieresis -50 -KPX Aogonek Ugrave -50 -KPX Aogonek Uhungarumlaut -50 -KPX Aogonek Umacron -50 -KPX Aogonek Uogonek -50 -KPX Aogonek Uring -50 -KPX Aogonek V -70 -KPX Aogonek W -50 -KPX Aogonek Y -100 -KPX Aogonek Yacute -100 -KPX Aogonek Ydieresis -100 -KPX Aogonek u -30 -KPX Aogonek uacute -30 -KPX Aogonek ucircumflex -30 -KPX Aogonek udieresis -30 -KPX Aogonek ugrave -30 -KPX Aogonek uhungarumlaut -30 -KPX Aogonek umacron -30 -KPX Aogonek uogonek -30 -KPX Aogonek uring -30 -KPX Aogonek v -40 -KPX Aogonek w -40 -KPX Aogonek y -40 -KPX Aogonek yacute -40 -KPX Aogonek ydieresis -40 -KPX Aring C -30 -KPX Aring Cacute -30 -KPX Aring Ccaron -30 -KPX Aring Ccedilla -30 -KPX Aring G -30 -KPX Aring Gbreve -30 -KPX Aring Gcommaaccent -30 -KPX Aring O -30 -KPX Aring Oacute -30 -KPX Aring Ocircumflex -30 -KPX Aring Odieresis -30 -KPX Aring Ograve -30 -KPX Aring Ohungarumlaut -30 -KPX Aring Omacron -30 -KPX Aring Oslash -30 -KPX Aring Otilde -30 -KPX Aring Q -30 -KPX Aring T -120 -KPX Aring Tcaron -120 -KPX Aring Tcommaaccent -120 -KPX Aring U -50 -KPX Aring Uacute -50 -KPX Aring Ucircumflex -50 -KPX Aring Udieresis -50 -KPX Aring Ugrave -50 -KPX Aring Uhungarumlaut -50 -KPX Aring Umacron -50 -KPX Aring Uogonek -50 -KPX Aring Uring -50 -KPX Aring V -70 -KPX Aring W -50 -KPX Aring Y -100 -KPX Aring Yacute -100 -KPX Aring Ydieresis -100 -KPX Aring u -30 -KPX Aring uacute -30 -KPX Aring ucircumflex -30 -KPX Aring udieresis -30 -KPX Aring ugrave -30 -KPX Aring uhungarumlaut -30 -KPX Aring umacron -30 -KPX Aring uogonek -30 -KPX Aring uring -30 -KPX Aring v -40 -KPX Aring w -40 -KPX Aring y -40 -KPX Aring yacute -40 -KPX Aring ydieresis -40 -KPX Atilde C -30 -KPX Atilde Cacute -30 -KPX Atilde Ccaron -30 -KPX Atilde Ccedilla -30 -KPX Atilde G -30 -KPX Atilde Gbreve -30 -KPX Atilde Gcommaaccent -30 -KPX Atilde O -30 -KPX Atilde Oacute -30 -KPX Atilde Ocircumflex -30 -KPX Atilde Odieresis -30 -KPX Atilde Ograve -30 -KPX Atilde Ohungarumlaut -30 -KPX Atilde Omacron -30 -KPX Atilde Oslash -30 -KPX Atilde Otilde -30 -KPX Atilde Q -30 -KPX Atilde T -120 -KPX Atilde Tcaron -120 -KPX Atilde Tcommaaccent -120 -KPX Atilde U -50 -KPX Atilde Uacute -50 -KPX Atilde Ucircumflex -50 -KPX Atilde Udieresis -50 -KPX Atilde Ugrave -50 -KPX Atilde Uhungarumlaut -50 -KPX Atilde Umacron -50 -KPX Atilde Uogonek -50 -KPX Atilde Uring -50 -KPX Atilde V -70 -KPX Atilde W -50 -KPX Atilde Y -100 -KPX Atilde Yacute -100 -KPX Atilde Ydieresis -100 -KPX Atilde u -30 -KPX Atilde uacute -30 -KPX Atilde ucircumflex -30 -KPX Atilde udieresis -30 -KPX Atilde ugrave -30 -KPX Atilde uhungarumlaut -30 -KPX Atilde umacron -30 -KPX Atilde uogonek -30 -KPX Atilde uring -30 -KPX Atilde v -40 -KPX Atilde w -40 -KPX Atilde y -40 -KPX Atilde yacute -40 -KPX Atilde ydieresis -40 -KPX B U -10 -KPX B Uacute -10 -KPX B Ucircumflex -10 -KPX B Udieresis -10 -KPX B Ugrave -10 -KPX B Uhungarumlaut -10 -KPX B Umacron -10 -KPX B Uogonek -10 -KPX B Uring -10 -KPX B comma -20 -KPX B period -20 -KPX C comma -30 -KPX C period -30 -KPX Cacute comma -30 -KPX Cacute period -30 -KPX Ccaron comma -30 -KPX Ccaron period -30 -KPX Ccedilla comma -30 -KPX Ccedilla period -30 -KPX D A -40 -KPX D Aacute -40 -KPX D Abreve -40 -KPX D Acircumflex -40 -KPX D Adieresis -40 -KPX D Agrave -40 -KPX D Amacron -40 -KPX D Aogonek -40 -KPX D Aring -40 -KPX D Atilde -40 -KPX D V -70 -KPX D W -40 -KPX D Y -90 -KPX D Yacute -90 -KPX D Ydieresis -90 -KPX D comma -70 -KPX D period -70 -KPX Dcaron A -40 -KPX Dcaron Aacute -40 -KPX Dcaron Abreve -40 -KPX Dcaron Acircumflex -40 -KPX Dcaron Adieresis -40 -KPX Dcaron Agrave -40 -KPX Dcaron Amacron -40 -KPX Dcaron Aogonek -40 -KPX Dcaron Aring -40 -KPX Dcaron Atilde -40 -KPX Dcaron V -70 -KPX Dcaron W -40 -KPX Dcaron Y -90 -KPX Dcaron Yacute -90 -KPX Dcaron Ydieresis -90 -KPX Dcaron comma -70 -KPX Dcaron period -70 -KPX Dcroat A -40 -KPX Dcroat Aacute -40 -KPX Dcroat Abreve -40 -KPX Dcroat Acircumflex -40 -KPX Dcroat Adieresis -40 -KPX Dcroat Agrave -40 -KPX Dcroat Amacron -40 -KPX Dcroat Aogonek -40 -KPX Dcroat Aring -40 -KPX Dcroat Atilde -40 -KPX Dcroat V -70 -KPX Dcroat W -40 -KPX Dcroat Y -90 -KPX Dcroat Yacute -90 -KPX Dcroat Ydieresis -90 -KPX Dcroat comma -70 -KPX Dcroat period -70 -KPX F A -80 -KPX F Aacute -80 -KPX F Abreve -80 -KPX F Acircumflex -80 -KPX F Adieresis -80 -KPX F Agrave -80 -KPX F Amacron -80 -KPX F Aogonek -80 -KPX F Aring -80 -KPX F Atilde -80 -KPX F a -50 -KPX F aacute -50 -KPX F abreve -50 -KPX F acircumflex -50 -KPX F adieresis -50 -KPX F agrave -50 -KPX F amacron -50 -KPX F aogonek -50 -KPX F aring -50 -KPX F atilde -50 -KPX F comma -150 -KPX F e -30 -KPX F eacute -30 -KPX F ecaron -30 -KPX F ecircumflex -30 -KPX F edieresis -30 -KPX F edotaccent -30 -KPX F egrave -30 -KPX F emacron -30 -KPX F eogonek -30 -KPX F o -30 -KPX F oacute -30 -KPX F ocircumflex -30 -KPX F odieresis -30 -KPX F ograve -30 -KPX F ohungarumlaut -30 -KPX F omacron -30 -KPX F oslash -30 -KPX F otilde -30 -KPX F period -150 -KPX F r -45 -KPX F racute -45 -KPX F rcaron -45 -KPX F rcommaaccent -45 -KPX J A -20 -KPX J Aacute -20 -KPX J Abreve -20 -KPX J Acircumflex -20 -KPX J Adieresis -20 -KPX J Agrave -20 -KPX J Amacron -20 -KPX J Aogonek -20 -KPX J Aring -20 -KPX J Atilde -20 -KPX J a -20 -KPX J aacute -20 -KPX J abreve -20 -KPX J acircumflex -20 -KPX J adieresis -20 -KPX J agrave -20 -KPX J amacron -20 -KPX J aogonek -20 -KPX J aring -20 -KPX J atilde -20 -KPX J comma -30 -KPX J period -30 -KPX J u -20 -KPX J uacute -20 -KPX J ucircumflex -20 -KPX J udieresis -20 -KPX J ugrave -20 -KPX J uhungarumlaut -20 -KPX J umacron -20 -KPX J uogonek -20 -KPX J uring -20 -KPX K O -50 -KPX K Oacute -50 -KPX K Ocircumflex -50 -KPX K Odieresis -50 -KPX K Ograve -50 -KPX K Ohungarumlaut -50 -KPX K Omacron -50 -KPX K Oslash -50 -KPX K Otilde -50 -KPX K e -40 -KPX K eacute -40 -KPX K ecaron -40 -KPX K ecircumflex -40 -KPX K edieresis -40 -KPX K edotaccent -40 -KPX K egrave -40 -KPX K emacron -40 -KPX K eogonek -40 -KPX K o -40 -KPX K oacute -40 -KPX K ocircumflex -40 -KPX K odieresis -40 -KPX K ograve -40 -KPX K ohungarumlaut -40 -KPX K omacron -40 -KPX K oslash -40 -KPX K otilde -40 -KPX K u -30 -KPX K uacute -30 -KPX K ucircumflex -30 -KPX K udieresis -30 -KPX K ugrave -30 -KPX K uhungarumlaut -30 -KPX K umacron -30 -KPX K uogonek -30 -KPX K uring -30 -KPX K y -50 -KPX K yacute -50 -KPX K ydieresis -50 -KPX Kcommaaccent O -50 -KPX Kcommaaccent Oacute -50 -KPX Kcommaaccent Ocircumflex -50 -KPX Kcommaaccent Odieresis -50 -KPX Kcommaaccent Ograve -50 -KPX Kcommaaccent Ohungarumlaut -50 -KPX Kcommaaccent Omacron -50 -KPX Kcommaaccent Oslash -50 -KPX Kcommaaccent Otilde -50 -KPX Kcommaaccent e -40 -KPX Kcommaaccent eacute -40 -KPX Kcommaaccent ecaron -40 -KPX Kcommaaccent ecircumflex -40 -KPX Kcommaaccent edieresis -40 -KPX Kcommaaccent edotaccent -40 -KPX Kcommaaccent egrave -40 -KPX Kcommaaccent emacron -40 -KPX Kcommaaccent eogonek -40 -KPX Kcommaaccent o -40 -KPX Kcommaaccent oacute -40 -KPX Kcommaaccent ocircumflex -40 -KPX Kcommaaccent odieresis -40 -KPX Kcommaaccent ograve -40 -KPX Kcommaaccent ohungarumlaut -40 -KPX Kcommaaccent omacron -40 -KPX Kcommaaccent oslash -40 -KPX Kcommaaccent otilde -40 -KPX Kcommaaccent u -30 -KPX Kcommaaccent uacute -30 -KPX Kcommaaccent ucircumflex -30 -KPX Kcommaaccent udieresis -30 -KPX Kcommaaccent ugrave -30 -KPX Kcommaaccent uhungarumlaut -30 -KPX Kcommaaccent umacron -30 -KPX Kcommaaccent uogonek -30 -KPX Kcommaaccent uring -30 -KPX Kcommaaccent y -50 -KPX Kcommaaccent yacute -50 -KPX Kcommaaccent ydieresis -50 -KPX L T -110 -KPX L Tcaron -110 -KPX L Tcommaaccent -110 -KPX L V -110 -KPX L W -70 -KPX L Y -140 -KPX L Yacute -140 -KPX L Ydieresis -140 -KPX L quotedblright -140 -KPX L quoteright -160 -KPX L y -30 -KPX L yacute -30 -KPX L ydieresis -30 -KPX Lacute T -110 -KPX Lacute Tcaron -110 -KPX Lacute Tcommaaccent -110 -KPX Lacute V -110 -KPX Lacute W -70 -KPX Lacute Y -140 -KPX Lacute Yacute -140 -KPX Lacute Ydieresis -140 -KPX Lacute quotedblright -140 -KPX Lacute quoteright -160 -KPX Lacute y -30 -KPX Lacute yacute -30 -KPX Lacute ydieresis -30 -KPX Lcaron T -110 -KPX Lcaron Tcaron -110 -KPX Lcaron Tcommaaccent -110 -KPX Lcaron V -110 -KPX Lcaron W -70 -KPX Lcaron Y -140 -KPX Lcaron Yacute -140 -KPX Lcaron Ydieresis -140 -KPX Lcaron quotedblright -140 -KPX Lcaron quoteright -160 -KPX Lcaron y -30 -KPX Lcaron yacute -30 -KPX Lcaron ydieresis -30 -KPX Lcommaaccent T -110 -KPX Lcommaaccent Tcaron -110 -KPX Lcommaaccent Tcommaaccent -110 -KPX Lcommaaccent V -110 -KPX Lcommaaccent W -70 -KPX Lcommaaccent Y -140 -KPX Lcommaaccent Yacute -140 -KPX Lcommaaccent Ydieresis -140 -KPX Lcommaaccent quotedblright -140 -KPX Lcommaaccent quoteright -160 -KPX Lcommaaccent y -30 -KPX Lcommaaccent yacute -30 -KPX Lcommaaccent ydieresis -30 -KPX Lslash T -110 -KPX Lslash Tcaron -110 -KPX Lslash Tcommaaccent -110 -KPX Lslash V -110 -KPX Lslash W -70 -KPX Lslash Y -140 -KPX Lslash Yacute -140 -KPX Lslash Ydieresis -140 -KPX Lslash quotedblright -140 -KPX Lslash quoteright -160 -KPX Lslash y -30 -KPX Lslash yacute -30 -KPX Lslash ydieresis -30 -KPX O A -20 -KPX O Aacute -20 -KPX O Abreve -20 -KPX O Acircumflex -20 -KPX O Adieresis -20 -KPX O Agrave -20 -KPX O Amacron -20 -KPX O Aogonek -20 -KPX O Aring -20 -KPX O Atilde -20 -KPX O T -40 -KPX O Tcaron -40 -KPX O Tcommaaccent -40 -KPX O V -50 -KPX O W -30 -KPX O X -60 -KPX O Y -70 -KPX O Yacute -70 -KPX O Ydieresis -70 -KPX O comma -40 -KPX O period -40 -KPX Oacute A -20 -KPX Oacute Aacute -20 -KPX Oacute Abreve -20 -KPX Oacute Acircumflex -20 -KPX Oacute Adieresis -20 -KPX Oacute Agrave -20 -KPX Oacute Amacron -20 -KPX Oacute Aogonek -20 -KPX Oacute Aring -20 -KPX Oacute Atilde -20 -KPX Oacute T -40 -KPX Oacute Tcaron -40 -KPX Oacute Tcommaaccent -40 -KPX Oacute V -50 -KPX Oacute W -30 -KPX Oacute X -60 -KPX Oacute Y -70 -KPX Oacute Yacute -70 -KPX Oacute Ydieresis -70 -KPX Oacute comma -40 -KPX Oacute period -40 -KPX Ocircumflex A -20 -KPX Ocircumflex Aacute -20 -KPX Ocircumflex Abreve -20 -KPX Ocircumflex Acircumflex -20 -KPX Ocircumflex Adieresis -20 -KPX Ocircumflex Agrave -20 -KPX Ocircumflex Amacron -20 -KPX Ocircumflex Aogonek -20 -KPX Ocircumflex Aring -20 -KPX Ocircumflex Atilde -20 -KPX Ocircumflex T -40 -KPX Ocircumflex Tcaron -40 -KPX Ocircumflex Tcommaaccent -40 -KPX Ocircumflex V -50 -KPX Ocircumflex W -30 -KPX Ocircumflex X -60 -KPX Ocircumflex Y -70 -KPX Ocircumflex Yacute -70 -KPX Ocircumflex Ydieresis -70 -KPX Ocircumflex comma -40 -KPX Ocircumflex period -40 -KPX Odieresis A -20 -KPX Odieresis Aacute -20 -KPX Odieresis Abreve -20 -KPX Odieresis Acircumflex -20 -KPX Odieresis Adieresis -20 -KPX Odieresis Agrave -20 -KPX Odieresis Amacron -20 -KPX Odieresis Aogonek -20 -KPX Odieresis Aring -20 -KPX Odieresis Atilde -20 -KPX Odieresis T -40 -KPX Odieresis Tcaron -40 -KPX Odieresis Tcommaaccent -40 -KPX Odieresis V -50 -KPX Odieresis W -30 -KPX Odieresis X -60 -KPX Odieresis Y -70 -KPX Odieresis Yacute -70 -KPX Odieresis Ydieresis -70 -KPX Odieresis comma -40 -KPX Odieresis period -40 -KPX Ograve A -20 -KPX Ograve Aacute -20 -KPX Ograve Abreve -20 -KPX Ograve Acircumflex -20 -KPX Ograve Adieresis -20 -KPX Ograve Agrave -20 -KPX Ograve Amacron -20 -KPX Ograve Aogonek -20 -KPX Ograve Aring -20 -KPX Ograve Atilde -20 -KPX Ograve T -40 -KPX Ograve Tcaron -40 -KPX Ograve Tcommaaccent -40 -KPX Ograve V -50 -KPX Ograve W -30 -KPX Ograve X -60 -KPX Ograve Y -70 -KPX Ograve Yacute -70 -KPX Ograve Ydieresis -70 -KPX Ograve comma -40 -KPX Ograve period -40 -KPX Ohungarumlaut A -20 -KPX Ohungarumlaut Aacute -20 -KPX Ohungarumlaut Abreve -20 -KPX Ohungarumlaut Acircumflex -20 -KPX Ohungarumlaut Adieresis -20 -KPX Ohungarumlaut Agrave -20 -KPX Ohungarumlaut Amacron -20 -KPX Ohungarumlaut Aogonek -20 -KPX Ohungarumlaut Aring -20 -KPX Ohungarumlaut Atilde -20 -KPX Ohungarumlaut T -40 -KPX Ohungarumlaut Tcaron -40 -KPX Ohungarumlaut Tcommaaccent -40 -KPX Ohungarumlaut V -50 -KPX Ohungarumlaut W -30 -KPX Ohungarumlaut X -60 -KPX Ohungarumlaut Y -70 -KPX Ohungarumlaut Yacute -70 -KPX Ohungarumlaut Ydieresis -70 -KPX Ohungarumlaut comma -40 -KPX Ohungarumlaut period -40 -KPX Omacron A -20 -KPX Omacron Aacute -20 -KPX Omacron Abreve -20 -KPX Omacron Acircumflex -20 -KPX Omacron Adieresis -20 -KPX Omacron Agrave -20 -KPX Omacron Amacron -20 -KPX Omacron Aogonek -20 -KPX Omacron Aring -20 -KPX Omacron Atilde -20 -KPX Omacron T -40 -KPX Omacron Tcaron -40 -KPX Omacron Tcommaaccent -40 -KPX Omacron V -50 -KPX Omacron W -30 -KPX Omacron X -60 -KPX Omacron Y -70 -KPX Omacron Yacute -70 -KPX Omacron Ydieresis -70 -KPX Omacron comma -40 -KPX Omacron period -40 -KPX Oslash A -20 -KPX Oslash Aacute -20 -KPX Oslash Abreve -20 -KPX Oslash Acircumflex -20 -KPX Oslash Adieresis -20 -KPX Oslash Agrave -20 -KPX Oslash Amacron -20 -KPX Oslash Aogonek -20 -KPX Oslash Aring -20 -KPX Oslash Atilde -20 -KPX Oslash T -40 -KPX Oslash Tcaron -40 -KPX Oslash Tcommaaccent -40 -KPX Oslash V -50 -KPX Oslash W -30 -KPX Oslash X -60 -KPX Oslash Y -70 -KPX Oslash Yacute -70 -KPX Oslash Ydieresis -70 -KPX Oslash comma -40 -KPX Oslash period -40 -KPX Otilde A -20 -KPX Otilde Aacute -20 -KPX Otilde Abreve -20 -KPX Otilde Acircumflex -20 -KPX Otilde Adieresis -20 -KPX Otilde Agrave -20 -KPX Otilde Amacron -20 -KPX Otilde Aogonek -20 -KPX Otilde Aring -20 -KPX Otilde Atilde -20 -KPX Otilde T -40 -KPX Otilde Tcaron -40 -KPX Otilde Tcommaaccent -40 -KPX Otilde V -50 -KPX Otilde W -30 -KPX Otilde X -60 -KPX Otilde Y -70 -KPX Otilde Yacute -70 -KPX Otilde Ydieresis -70 -KPX Otilde comma -40 -KPX Otilde period -40 -KPX P A -120 -KPX P Aacute -120 -KPX P Abreve -120 -KPX P Acircumflex -120 -KPX P Adieresis -120 -KPX P Agrave -120 -KPX P Amacron -120 -KPX P Aogonek -120 -KPX P Aring -120 -KPX P Atilde -120 -KPX P a -40 -KPX P aacute -40 -KPX P abreve -40 -KPX P acircumflex -40 -KPX P adieresis -40 -KPX P agrave -40 -KPX P amacron -40 -KPX P aogonek -40 -KPX P aring -40 -KPX P atilde -40 -KPX P comma -180 -KPX P e -50 -KPX P eacute -50 -KPX P ecaron -50 -KPX P ecircumflex -50 -KPX P edieresis -50 -KPX P edotaccent -50 -KPX P egrave -50 -KPX P emacron -50 -KPX P eogonek -50 -KPX P o -50 -KPX P oacute -50 -KPX P ocircumflex -50 -KPX P odieresis -50 -KPX P ograve -50 -KPX P ohungarumlaut -50 -KPX P omacron -50 -KPX P oslash -50 -KPX P otilde -50 -KPX P period -180 -KPX Q U -10 -KPX Q Uacute -10 -KPX Q Ucircumflex -10 -KPX Q Udieresis -10 -KPX Q Ugrave -10 -KPX Q Uhungarumlaut -10 -KPX Q Umacron -10 -KPX Q Uogonek -10 -KPX Q Uring -10 -KPX R O -20 -KPX R Oacute -20 -KPX R Ocircumflex -20 -KPX R Odieresis -20 -KPX R Ograve -20 -KPX R Ohungarumlaut -20 -KPX R Omacron -20 -KPX R Oslash -20 -KPX R Otilde -20 -KPX R T -30 -KPX R Tcaron -30 -KPX R Tcommaaccent -30 -KPX R U -40 -KPX R Uacute -40 -KPX R Ucircumflex -40 -KPX R Udieresis -40 -KPX R Ugrave -40 -KPX R Uhungarumlaut -40 -KPX R Umacron -40 -KPX R Uogonek -40 -KPX R Uring -40 -KPX R V -50 -KPX R W -30 -KPX R Y -50 -KPX R Yacute -50 -KPX R Ydieresis -50 -KPX Racute O -20 -KPX Racute Oacute -20 -KPX Racute Ocircumflex -20 -KPX Racute Odieresis -20 -KPX Racute Ograve -20 -KPX Racute Ohungarumlaut -20 -KPX Racute Omacron -20 -KPX Racute Oslash -20 -KPX Racute Otilde -20 -KPX Racute T -30 -KPX Racute Tcaron -30 -KPX Racute Tcommaaccent -30 -KPX Racute U -40 -KPX Racute Uacute -40 -KPX Racute Ucircumflex -40 -KPX Racute Udieresis -40 -KPX Racute Ugrave -40 -KPX Racute Uhungarumlaut -40 -KPX Racute Umacron -40 -KPX Racute Uogonek -40 -KPX Racute Uring -40 -KPX Racute V -50 -KPX Racute W -30 -KPX Racute Y -50 -KPX Racute Yacute -50 -KPX Racute Ydieresis -50 -KPX Rcaron O -20 -KPX Rcaron Oacute -20 -KPX Rcaron Ocircumflex -20 -KPX Rcaron Odieresis -20 -KPX Rcaron Ograve -20 -KPX Rcaron Ohungarumlaut -20 -KPX Rcaron Omacron -20 -KPX Rcaron Oslash -20 -KPX Rcaron Otilde -20 -KPX Rcaron T -30 -KPX Rcaron Tcaron -30 -KPX Rcaron Tcommaaccent -30 -KPX Rcaron U -40 -KPX Rcaron Uacute -40 -KPX Rcaron Ucircumflex -40 -KPX Rcaron Udieresis -40 -KPX Rcaron Ugrave -40 -KPX Rcaron Uhungarumlaut -40 -KPX Rcaron Umacron -40 -KPX Rcaron Uogonek -40 -KPX Rcaron Uring -40 -KPX Rcaron V -50 -KPX Rcaron W -30 -KPX Rcaron Y -50 -KPX Rcaron Yacute -50 -KPX Rcaron Ydieresis -50 -KPX Rcommaaccent O -20 -KPX Rcommaaccent Oacute -20 -KPX Rcommaaccent Ocircumflex -20 -KPX Rcommaaccent Odieresis -20 -KPX Rcommaaccent Ograve -20 -KPX Rcommaaccent Ohungarumlaut -20 -KPX Rcommaaccent Omacron -20 -KPX Rcommaaccent Oslash -20 -KPX Rcommaaccent Otilde -20 -KPX Rcommaaccent T -30 -KPX Rcommaaccent Tcaron -30 -KPX Rcommaaccent Tcommaaccent -30 -KPX Rcommaaccent U -40 -KPX Rcommaaccent Uacute -40 -KPX Rcommaaccent Ucircumflex -40 -KPX Rcommaaccent Udieresis -40 -KPX Rcommaaccent Ugrave -40 -KPX Rcommaaccent Uhungarumlaut -40 -KPX Rcommaaccent Umacron -40 -KPX Rcommaaccent Uogonek -40 -KPX Rcommaaccent Uring -40 -KPX Rcommaaccent V -50 -KPX Rcommaaccent W -30 -KPX Rcommaaccent Y -50 -KPX Rcommaaccent Yacute -50 -KPX Rcommaaccent Ydieresis -50 -KPX S comma -20 -KPX S period -20 -KPX Sacute comma -20 -KPX Sacute period -20 -KPX Scaron comma -20 -KPX Scaron period -20 -KPX Scedilla comma -20 -KPX Scedilla period -20 -KPX Scommaaccent comma -20 -KPX Scommaaccent period -20 -KPX T A -120 -KPX T Aacute -120 -KPX T Abreve -120 -KPX T Acircumflex -120 -KPX T Adieresis -120 -KPX T Agrave -120 -KPX T Amacron -120 -KPX T Aogonek -120 -KPX T Aring -120 -KPX T Atilde -120 -KPX T O -40 -KPX T Oacute -40 -KPX T Ocircumflex -40 -KPX T Odieresis -40 -KPX T Ograve -40 -KPX T Ohungarumlaut -40 -KPX T Omacron -40 -KPX T Oslash -40 -KPX T Otilde -40 -KPX T a -120 -KPX T aacute -120 -KPX T abreve -60 -KPX T acircumflex -120 -KPX T adieresis -120 -KPX T agrave -120 -KPX T amacron -60 -KPX T aogonek -120 -KPX T aring -120 -KPX T atilde -60 -KPX T colon -20 -KPX T comma -120 -KPX T e -120 -KPX T eacute -120 -KPX T ecaron -120 -KPX T ecircumflex -120 -KPX T edieresis -120 -KPX T edotaccent -120 -KPX T egrave -60 -KPX T emacron -60 -KPX T eogonek -120 -KPX T hyphen -140 -KPX T o -120 -KPX T oacute -120 -KPX T ocircumflex -120 -KPX T odieresis -120 -KPX T ograve -120 -KPX T ohungarumlaut -120 -KPX T omacron -60 -KPX T oslash -120 -KPX T otilde -60 -KPX T period -120 -KPX T r -120 -KPX T racute -120 -KPX T rcaron -120 -KPX T rcommaaccent -120 -KPX T semicolon -20 -KPX T u -120 -KPX T uacute -120 -KPX T ucircumflex -120 -KPX T udieresis -120 -KPX T ugrave -120 -KPX T uhungarumlaut -120 -KPX T umacron -60 -KPX T uogonek -120 -KPX T uring -120 -KPX T w -120 -KPX T y -120 -KPX T yacute -120 -KPX T ydieresis -60 -KPX Tcaron A -120 -KPX Tcaron Aacute -120 -KPX Tcaron Abreve -120 -KPX Tcaron Acircumflex -120 -KPX Tcaron Adieresis -120 -KPX Tcaron Agrave -120 -KPX Tcaron Amacron -120 -KPX Tcaron Aogonek -120 -KPX Tcaron Aring -120 -KPX Tcaron Atilde -120 -KPX Tcaron O -40 -KPX Tcaron Oacute -40 -KPX Tcaron Ocircumflex -40 -KPX Tcaron Odieresis -40 -KPX Tcaron Ograve -40 -KPX Tcaron Ohungarumlaut -40 -KPX Tcaron Omacron -40 -KPX Tcaron Oslash -40 -KPX Tcaron Otilde -40 -KPX Tcaron a -120 -KPX Tcaron aacute -120 -KPX Tcaron abreve -60 -KPX Tcaron acircumflex -120 -KPX Tcaron adieresis -120 -KPX Tcaron agrave -120 -KPX Tcaron amacron -60 -KPX Tcaron aogonek -120 -KPX Tcaron aring -120 -KPX Tcaron atilde -60 -KPX Tcaron colon -20 -KPX Tcaron comma -120 -KPX Tcaron e -120 -KPX Tcaron eacute -120 -KPX Tcaron ecaron -120 -KPX Tcaron ecircumflex -120 -KPX Tcaron edieresis -120 -KPX Tcaron edotaccent -120 -KPX Tcaron egrave -60 -KPX Tcaron emacron -60 -KPX Tcaron eogonek -120 -KPX Tcaron hyphen -140 -KPX Tcaron o -120 -KPX Tcaron oacute -120 -KPX Tcaron ocircumflex -120 -KPX Tcaron odieresis -120 -KPX Tcaron ograve -120 -KPX Tcaron ohungarumlaut -120 -KPX Tcaron omacron -60 -KPX Tcaron oslash -120 -KPX Tcaron otilde -60 -KPX Tcaron period -120 -KPX Tcaron r -120 -KPX Tcaron racute -120 -KPX Tcaron rcaron -120 -KPX Tcaron rcommaaccent -120 -KPX Tcaron semicolon -20 -KPX Tcaron u -120 -KPX Tcaron uacute -120 -KPX Tcaron ucircumflex -120 -KPX Tcaron udieresis -120 -KPX Tcaron ugrave -120 -KPX Tcaron uhungarumlaut -120 -KPX Tcaron umacron -60 -KPX Tcaron uogonek -120 -KPX Tcaron uring -120 -KPX Tcaron w -120 -KPX Tcaron y -120 -KPX Tcaron yacute -120 -KPX Tcaron ydieresis -60 -KPX Tcommaaccent A -120 -KPX Tcommaaccent Aacute -120 -KPX Tcommaaccent Abreve -120 -KPX Tcommaaccent Acircumflex -120 -KPX Tcommaaccent Adieresis -120 -KPX Tcommaaccent Agrave -120 -KPX Tcommaaccent Amacron -120 -KPX Tcommaaccent Aogonek -120 -KPX Tcommaaccent Aring -120 -KPX Tcommaaccent Atilde -120 -KPX Tcommaaccent O -40 -KPX Tcommaaccent Oacute -40 -KPX Tcommaaccent Ocircumflex -40 -KPX Tcommaaccent Odieresis -40 -KPX Tcommaaccent Ograve -40 -KPX Tcommaaccent Ohungarumlaut -40 -KPX Tcommaaccent Omacron -40 -KPX Tcommaaccent Oslash -40 -KPX Tcommaaccent Otilde -40 -KPX Tcommaaccent a -120 -KPX Tcommaaccent aacute -120 -KPX Tcommaaccent abreve -60 -KPX Tcommaaccent acircumflex -120 -KPX Tcommaaccent adieresis -120 -KPX Tcommaaccent agrave -120 -KPX Tcommaaccent amacron -60 -KPX Tcommaaccent aogonek -120 -KPX Tcommaaccent aring -120 -KPX Tcommaaccent atilde -60 -KPX Tcommaaccent colon -20 -KPX Tcommaaccent comma -120 -KPX Tcommaaccent e -120 -KPX Tcommaaccent eacute -120 -KPX Tcommaaccent ecaron -120 -KPX Tcommaaccent ecircumflex -120 -KPX Tcommaaccent edieresis -120 -KPX Tcommaaccent edotaccent -120 -KPX Tcommaaccent egrave -60 -KPX Tcommaaccent emacron -60 -KPX Tcommaaccent eogonek -120 -KPX Tcommaaccent hyphen -140 -KPX Tcommaaccent o -120 -KPX Tcommaaccent oacute -120 -KPX Tcommaaccent ocircumflex -120 -KPX Tcommaaccent odieresis -120 -KPX Tcommaaccent ograve -120 -KPX Tcommaaccent ohungarumlaut -120 -KPX Tcommaaccent omacron -60 -KPX Tcommaaccent oslash -120 -KPX Tcommaaccent otilde -60 -KPX Tcommaaccent period -120 -KPX Tcommaaccent r -120 -KPX Tcommaaccent racute -120 -KPX Tcommaaccent rcaron -120 -KPX Tcommaaccent rcommaaccent -120 -KPX Tcommaaccent semicolon -20 -KPX Tcommaaccent u -120 -KPX Tcommaaccent uacute -120 -KPX Tcommaaccent ucircumflex -120 -KPX Tcommaaccent udieresis -120 -KPX Tcommaaccent ugrave -120 -KPX Tcommaaccent uhungarumlaut -120 -KPX Tcommaaccent umacron -60 -KPX Tcommaaccent uogonek -120 -KPX Tcommaaccent uring -120 -KPX Tcommaaccent w -120 -KPX Tcommaaccent y -120 -KPX Tcommaaccent yacute -120 -KPX Tcommaaccent ydieresis -60 -KPX U A -40 -KPX U Aacute -40 -KPX U Abreve -40 -KPX U Acircumflex -40 -KPX U Adieresis -40 -KPX U Agrave -40 -KPX U Amacron -40 -KPX U Aogonek -40 -KPX U Aring -40 -KPX U Atilde -40 -KPX U comma -40 -KPX U period -40 -KPX Uacute A -40 -KPX Uacute Aacute -40 -KPX Uacute Abreve -40 -KPX Uacute Acircumflex -40 -KPX Uacute Adieresis -40 -KPX Uacute Agrave -40 -KPX Uacute Amacron -40 -KPX Uacute Aogonek -40 -KPX Uacute Aring -40 -KPX Uacute Atilde -40 -KPX Uacute comma -40 -KPX Uacute period -40 -KPX Ucircumflex A -40 -KPX Ucircumflex Aacute -40 -KPX Ucircumflex Abreve -40 -KPX Ucircumflex Acircumflex -40 -KPX Ucircumflex Adieresis -40 -KPX Ucircumflex Agrave -40 -KPX Ucircumflex Amacron -40 -KPX Ucircumflex Aogonek -40 -KPX Ucircumflex Aring -40 -KPX Ucircumflex Atilde -40 -KPX Ucircumflex comma -40 -KPX Ucircumflex period -40 -KPX Udieresis A -40 -KPX Udieresis Aacute -40 -KPX Udieresis Abreve -40 -KPX Udieresis Acircumflex -40 -KPX Udieresis Adieresis -40 -KPX Udieresis Agrave -40 -KPX Udieresis Amacron -40 -KPX Udieresis Aogonek -40 -KPX Udieresis Aring -40 -KPX Udieresis Atilde -40 -KPX Udieresis comma -40 -KPX Udieresis period -40 -KPX Ugrave A -40 -KPX Ugrave Aacute -40 -KPX Ugrave Abreve -40 -KPX Ugrave Acircumflex -40 -KPX Ugrave Adieresis -40 -KPX Ugrave Agrave -40 -KPX Ugrave Amacron -40 -KPX Ugrave Aogonek -40 -KPX Ugrave Aring -40 -KPX Ugrave Atilde -40 -KPX Ugrave comma -40 -KPX Ugrave period -40 -KPX Uhungarumlaut A -40 -KPX Uhungarumlaut Aacute -40 -KPX Uhungarumlaut Abreve -40 -KPX Uhungarumlaut Acircumflex -40 -KPX Uhungarumlaut Adieresis -40 -KPX Uhungarumlaut Agrave -40 -KPX Uhungarumlaut Amacron -40 -KPX Uhungarumlaut Aogonek -40 -KPX Uhungarumlaut Aring -40 -KPX Uhungarumlaut Atilde -40 -KPX Uhungarumlaut comma -40 -KPX Uhungarumlaut period -40 -KPX Umacron A -40 -KPX Umacron Aacute -40 -KPX Umacron Abreve -40 -KPX Umacron Acircumflex -40 -KPX Umacron Adieresis -40 -KPX Umacron Agrave -40 -KPX Umacron Amacron -40 -KPX Umacron Aogonek -40 -KPX Umacron Aring -40 -KPX Umacron Atilde -40 -KPX Umacron comma -40 -KPX Umacron period -40 -KPX Uogonek A -40 -KPX Uogonek Aacute -40 -KPX Uogonek Abreve -40 -KPX Uogonek Acircumflex -40 -KPX Uogonek Adieresis -40 -KPX Uogonek Agrave -40 -KPX Uogonek Amacron -40 -KPX Uogonek Aogonek -40 -KPX Uogonek Aring -40 -KPX Uogonek Atilde -40 -KPX Uogonek comma -40 -KPX Uogonek period -40 -KPX Uring A -40 -KPX Uring Aacute -40 -KPX Uring Abreve -40 -KPX Uring Acircumflex -40 -KPX Uring Adieresis -40 -KPX Uring Agrave -40 -KPX Uring Amacron -40 -KPX Uring Aogonek -40 -KPX Uring Aring -40 -KPX Uring Atilde -40 -KPX Uring comma -40 -KPX Uring period -40 -KPX V A -80 -KPX V Aacute -80 -KPX V Abreve -80 -KPX V Acircumflex -80 -KPX V Adieresis -80 -KPX V Agrave -80 -KPX V Amacron -80 -KPX V Aogonek -80 -KPX V Aring -80 -KPX V Atilde -80 -KPX V G -40 -KPX V Gbreve -40 -KPX V Gcommaaccent -40 -KPX V O -40 -KPX V Oacute -40 -KPX V Ocircumflex -40 -KPX V Odieresis -40 -KPX V Ograve -40 -KPX V Ohungarumlaut -40 -KPX V Omacron -40 -KPX V Oslash -40 -KPX V Otilde -40 -KPX V a -70 -KPX V aacute -70 -KPX V abreve -70 -KPX V acircumflex -70 -KPX V adieresis -70 -KPX V agrave -70 -KPX V amacron -70 -KPX V aogonek -70 -KPX V aring -70 -KPX V atilde -70 -KPX V colon -40 -KPX V comma -125 -KPX V e -80 -KPX V eacute -80 -KPX V ecaron -80 -KPX V ecircumflex -80 -KPX V edieresis -80 -KPX V edotaccent -80 -KPX V egrave -80 -KPX V emacron -80 -KPX V eogonek -80 -KPX V hyphen -80 -KPX V o -80 -KPX V oacute -80 -KPX V ocircumflex -80 -KPX V odieresis -80 -KPX V ograve -80 -KPX V ohungarumlaut -80 -KPX V omacron -80 -KPX V oslash -80 -KPX V otilde -80 -KPX V period -125 -KPX V semicolon -40 -KPX V u -70 -KPX V uacute -70 -KPX V ucircumflex -70 -KPX V udieresis -70 -KPX V ugrave -70 -KPX V uhungarumlaut -70 -KPX V umacron -70 -KPX V uogonek -70 -KPX V uring -70 -KPX W A -50 -KPX W Aacute -50 -KPX W Abreve -50 -KPX W Acircumflex -50 -KPX W Adieresis -50 -KPX W Agrave -50 -KPX W Amacron -50 -KPX W Aogonek -50 -KPX W Aring -50 -KPX W Atilde -50 -KPX W O -20 -KPX W Oacute -20 -KPX W Ocircumflex -20 -KPX W Odieresis -20 -KPX W Ograve -20 -KPX W Ohungarumlaut -20 -KPX W Omacron -20 -KPX W Oslash -20 -KPX W Otilde -20 -KPX W a -40 -KPX W aacute -40 -KPX W abreve -40 -KPX W acircumflex -40 -KPX W adieresis -40 -KPX W agrave -40 -KPX W amacron -40 -KPX W aogonek -40 -KPX W aring -40 -KPX W atilde -40 -KPX W comma -80 -KPX W e -30 -KPX W eacute -30 -KPX W ecaron -30 -KPX W ecircumflex -30 -KPX W edieresis -30 -KPX W edotaccent -30 -KPX W egrave -30 -KPX W emacron -30 -KPX W eogonek -30 -KPX W hyphen -40 -KPX W o -30 -KPX W oacute -30 -KPX W ocircumflex -30 -KPX W odieresis -30 -KPX W ograve -30 -KPX W ohungarumlaut -30 -KPX W omacron -30 -KPX W oslash -30 -KPX W otilde -30 -KPX W period -80 -KPX W u -30 -KPX W uacute -30 -KPX W ucircumflex -30 -KPX W udieresis -30 -KPX W ugrave -30 -KPX W uhungarumlaut -30 -KPX W umacron -30 -KPX W uogonek -30 -KPX W uring -30 -KPX W y -20 -KPX W yacute -20 -KPX W ydieresis -20 -KPX Y A -110 -KPX Y Aacute -110 -KPX Y Abreve -110 -KPX Y Acircumflex -110 -KPX Y Adieresis -110 -KPX Y Agrave -110 -KPX Y Amacron -110 -KPX Y Aogonek -110 -KPX Y Aring -110 -KPX Y Atilde -110 -KPX Y O -85 -KPX Y Oacute -85 -KPX Y Ocircumflex -85 -KPX Y Odieresis -85 -KPX Y Ograve -85 -KPX Y Ohungarumlaut -85 -KPX Y Omacron -85 -KPX Y Oslash -85 -KPX Y Otilde -85 -KPX Y a -140 -KPX Y aacute -140 -KPX Y abreve -70 -KPX Y acircumflex -140 -KPX Y adieresis -140 -KPX Y agrave -140 -KPX Y amacron -70 -KPX Y aogonek -140 -KPX Y aring -140 -KPX Y atilde -140 -KPX Y colon -60 -KPX Y comma -140 -KPX Y e -140 -KPX Y eacute -140 -KPX Y ecaron -140 -KPX Y ecircumflex -140 -KPX Y edieresis -140 -KPX Y edotaccent -140 -KPX Y egrave -140 -KPX Y emacron -70 -KPX Y eogonek -140 -KPX Y hyphen -140 -KPX Y i -20 -KPX Y iacute -20 -KPX Y iogonek -20 -KPX Y o -140 -KPX Y oacute -140 -KPX Y ocircumflex -140 -KPX Y odieresis -140 -KPX Y ograve -140 -KPX Y ohungarumlaut -140 -KPX Y omacron -140 -KPX Y oslash -140 -KPX Y otilde -140 -KPX Y period -140 -KPX Y semicolon -60 -KPX Y u -110 -KPX Y uacute -110 -KPX Y ucircumflex -110 -KPX Y udieresis -110 -KPX Y ugrave -110 -KPX Y uhungarumlaut -110 -KPX Y umacron -110 -KPX Y uogonek -110 -KPX Y uring -110 -KPX Yacute A -110 -KPX Yacute Aacute -110 -KPX Yacute Abreve -110 -KPX Yacute Acircumflex -110 -KPX Yacute Adieresis -110 -KPX Yacute Agrave -110 -KPX Yacute Amacron -110 -KPX Yacute Aogonek -110 -KPX Yacute Aring -110 -KPX Yacute Atilde -110 -KPX Yacute O -85 -KPX Yacute Oacute -85 -KPX Yacute Ocircumflex -85 -KPX Yacute Odieresis -85 -KPX Yacute Ograve -85 -KPX Yacute Ohungarumlaut -85 -KPX Yacute Omacron -85 -KPX Yacute Oslash -85 -KPX Yacute Otilde -85 -KPX Yacute a -140 -KPX Yacute aacute -140 -KPX Yacute abreve -70 -KPX Yacute acircumflex -140 -KPX Yacute adieresis -140 -KPX Yacute agrave -140 -KPX Yacute amacron -70 -KPX Yacute aogonek -140 -KPX Yacute aring -140 -KPX Yacute atilde -70 -KPX Yacute colon -60 -KPX Yacute comma -140 -KPX Yacute e -140 -KPX Yacute eacute -140 -KPX Yacute ecaron -140 -KPX Yacute ecircumflex -140 -KPX Yacute edieresis -140 -KPX Yacute edotaccent -140 -KPX Yacute egrave -140 -KPX Yacute emacron -70 -KPX Yacute eogonek -140 -KPX Yacute hyphen -140 -KPX Yacute i -20 -KPX Yacute iacute -20 -KPX Yacute iogonek -20 -KPX Yacute o -140 -KPX Yacute oacute -140 -KPX Yacute ocircumflex -140 -KPX Yacute odieresis -140 -KPX Yacute ograve -140 -KPX Yacute ohungarumlaut -140 -KPX Yacute omacron -70 -KPX Yacute oslash -140 -KPX Yacute otilde -140 -KPX Yacute period -140 -KPX Yacute semicolon -60 -KPX Yacute u -110 -KPX Yacute uacute -110 -KPX Yacute ucircumflex -110 -KPX Yacute udieresis -110 -KPX Yacute ugrave -110 -KPX Yacute uhungarumlaut -110 -KPX Yacute umacron -110 -KPX Yacute uogonek -110 -KPX Yacute uring -110 -KPX Ydieresis A -110 -KPX Ydieresis Aacute -110 -KPX Ydieresis Abreve -110 -KPX Ydieresis Acircumflex -110 -KPX Ydieresis Adieresis -110 -KPX Ydieresis Agrave -110 -KPX Ydieresis Amacron -110 -KPX Ydieresis Aogonek -110 -KPX Ydieresis Aring -110 -KPX Ydieresis Atilde -110 -KPX Ydieresis O -85 -KPX Ydieresis Oacute -85 -KPX Ydieresis Ocircumflex -85 -KPX Ydieresis Odieresis -85 -KPX Ydieresis Ograve -85 -KPX Ydieresis Ohungarumlaut -85 -KPX Ydieresis Omacron -85 -KPX Ydieresis Oslash -85 -KPX Ydieresis Otilde -85 -KPX Ydieresis a -140 -KPX Ydieresis aacute -140 -KPX Ydieresis abreve -70 -KPX Ydieresis acircumflex -140 -KPX Ydieresis adieresis -140 -KPX Ydieresis agrave -140 -KPX Ydieresis amacron -70 -KPX Ydieresis aogonek -140 -KPX Ydieresis aring -140 -KPX Ydieresis atilde -70 -KPX Ydieresis colon -60 -KPX Ydieresis comma -140 -KPX Ydieresis e -140 -KPX Ydieresis eacute -140 -KPX Ydieresis ecaron -140 -KPX Ydieresis ecircumflex -140 -KPX Ydieresis edieresis -140 -KPX Ydieresis edotaccent -140 -KPX Ydieresis egrave -140 -KPX Ydieresis emacron -70 -KPX Ydieresis eogonek -140 -KPX Ydieresis hyphen -140 -KPX Ydieresis i -20 -KPX Ydieresis iacute -20 -KPX Ydieresis iogonek -20 -KPX Ydieresis o -140 -KPX Ydieresis oacute -140 -KPX Ydieresis ocircumflex -140 -KPX Ydieresis odieresis -140 -KPX Ydieresis ograve -140 -KPX Ydieresis ohungarumlaut -140 -KPX Ydieresis omacron -140 -KPX Ydieresis oslash -140 -KPX Ydieresis otilde -140 -KPX Ydieresis period -140 -KPX Ydieresis semicolon -60 -KPX Ydieresis u -110 -KPX Ydieresis uacute -110 -KPX Ydieresis ucircumflex -110 -KPX Ydieresis udieresis -110 -KPX Ydieresis ugrave -110 -KPX Ydieresis uhungarumlaut -110 -KPX Ydieresis umacron -110 -KPX Ydieresis uogonek -110 -KPX Ydieresis uring -110 -KPX a v -20 -KPX a w -20 -KPX a y -30 -KPX a yacute -30 -KPX a ydieresis -30 -KPX aacute v -20 -KPX aacute w -20 -KPX aacute y -30 -KPX aacute yacute -30 -KPX aacute ydieresis -30 -KPX abreve v -20 -KPX abreve w -20 -KPX abreve y -30 -KPX abreve yacute -30 -KPX abreve ydieresis -30 -KPX acircumflex v -20 -KPX acircumflex w -20 -KPX acircumflex y -30 -KPX acircumflex yacute -30 -KPX acircumflex ydieresis -30 -KPX adieresis v -20 -KPX adieresis w -20 -KPX adieresis y -30 -KPX adieresis yacute -30 -KPX adieresis ydieresis -30 -KPX agrave v -20 -KPX agrave w -20 -KPX agrave y -30 -KPX agrave yacute -30 -KPX agrave ydieresis -30 -KPX amacron v -20 -KPX amacron w -20 -KPX amacron y -30 -KPX amacron yacute -30 -KPX amacron ydieresis -30 -KPX aogonek v -20 -KPX aogonek w -20 -KPX aogonek y -30 -KPX aogonek yacute -30 -KPX aogonek ydieresis -30 -KPX aring v -20 -KPX aring w -20 -KPX aring y -30 -KPX aring yacute -30 -KPX aring ydieresis -30 -KPX atilde v -20 -KPX atilde w -20 -KPX atilde y -30 -KPX atilde yacute -30 -KPX atilde ydieresis -30 -KPX b b -10 -KPX b comma -40 -KPX b l -20 -KPX b lacute -20 -KPX b lcommaaccent -20 -KPX b lslash -20 -KPX b period -40 -KPX b u -20 -KPX b uacute -20 -KPX b ucircumflex -20 -KPX b udieresis -20 -KPX b ugrave -20 -KPX b uhungarumlaut -20 -KPX b umacron -20 -KPX b uogonek -20 -KPX b uring -20 -KPX b v -20 -KPX b y -20 -KPX b yacute -20 -KPX b ydieresis -20 -KPX c comma -15 -KPX c k -20 -KPX c kcommaaccent -20 -KPX cacute comma -15 -KPX cacute k -20 -KPX cacute kcommaaccent -20 -KPX ccaron comma -15 -KPX ccaron k -20 -KPX ccaron kcommaaccent -20 -KPX ccedilla comma -15 -KPX ccedilla k -20 -KPX ccedilla kcommaaccent -20 -KPX colon space -50 -KPX comma quotedblright -100 -KPX comma quoteright -100 -KPX e comma -15 -KPX e period -15 -KPX e v -30 -KPX e w -20 -KPX e x -30 -KPX e y -20 -KPX e yacute -20 -KPX e ydieresis -20 -KPX eacute comma -15 -KPX eacute period -15 -KPX eacute v -30 -KPX eacute w -20 -KPX eacute x -30 -KPX eacute y -20 -KPX eacute yacute -20 -KPX eacute ydieresis -20 -KPX ecaron comma -15 -KPX ecaron period -15 -KPX ecaron v -30 -KPX ecaron w -20 -KPX ecaron x -30 -KPX ecaron y -20 -KPX ecaron yacute -20 -KPX ecaron ydieresis -20 -KPX ecircumflex comma -15 -KPX ecircumflex period -15 -KPX ecircumflex v -30 -KPX ecircumflex w -20 -KPX ecircumflex x -30 -KPX ecircumflex y -20 -KPX ecircumflex yacute -20 -KPX ecircumflex ydieresis -20 -KPX edieresis comma -15 -KPX edieresis period -15 -KPX edieresis v -30 -KPX edieresis w -20 -KPX edieresis x -30 -KPX edieresis y -20 -KPX edieresis yacute -20 -KPX edieresis ydieresis -20 -KPX edotaccent comma -15 -KPX edotaccent period -15 -KPX edotaccent v -30 -KPX edotaccent w -20 -KPX edotaccent x -30 -KPX edotaccent y -20 -KPX edotaccent yacute -20 -KPX edotaccent ydieresis -20 -KPX egrave comma -15 -KPX egrave period -15 -KPX egrave v -30 -KPX egrave w -20 -KPX egrave x -30 -KPX egrave y -20 -KPX egrave yacute -20 -KPX egrave ydieresis -20 -KPX emacron comma -15 -KPX emacron period -15 -KPX emacron v -30 -KPX emacron w -20 -KPX emacron x -30 -KPX emacron y -20 -KPX emacron yacute -20 -KPX emacron ydieresis -20 -KPX eogonek comma -15 -KPX eogonek period -15 -KPX eogonek v -30 -KPX eogonek w -20 -KPX eogonek x -30 -KPX eogonek y -20 -KPX eogonek yacute -20 -KPX eogonek ydieresis -20 -KPX f a -30 -KPX f aacute -30 -KPX f abreve -30 -KPX f acircumflex -30 -KPX f adieresis -30 -KPX f agrave -30 -KPX f amacron -30 -KPX f aogonek -30 -KPX f aring -30 -KPX f atilde -30 -KPX f comma -30 -KPX f dotlessi -28 -KPX f e -30 -KPX f eacute -30 -KPX f ecaron -30 -KPX f ecircumflex -30 -KPX f edieresis -30 -KPX f edotaccent -30 -KPX f egrave -30 -KPX f emacron -30 -KPX f eogonek -30 -KPX f o -30 -KPX f oacute -30 -KPX f ocircumflex -30 -KPX f odieresis -30 -KPX f ograve -30 -KPX f ohungarumlaut -30 -KPX f omacron -30 -KPX f oslash -30 -KPX f otilde -30 -KPX f period -30 -KPX f quotedblright 60 -KPX f quoteright 50 -KPX g r -10 -KPX g racute -10 -KPX g rcaron -10 -KPX g rcommaaccent -10 -KPX gbreve r -10 -KPX gbreve racute -10 -KPX gbreve rcaron -10 -KPX gbreve rcommaaccent -10 -KPX gcommaaccent r -10 -KPX gcommaaccent racute -10 -KPX gcommaaccent rcaron -10 -KPX gcommaaccent rcommaaccent -10 -KPX h y -30 -KPX h yacute -30 -KPX h ydieresis -30 -KPX k e -20 -KPX k eacute -20 -KPX k ecaron -20 -KPX k ecircumflex -20 -KPX k edieresis -20 -KPX k edotaccent -20 -KPX k egrave -20 -KPX k emacron -20 -KPX k eogonek -20 -KPX k o -20 -KPX k oacute -20 -KPX k ocircumflex -20 -KPX k odieresis -20 -KPX k ograve -20 -KPX k ohungarumlaut -20 -KPX k omacron -20 -KPX k oslash -20 -KPX k otilde -20 -KPX kcommaaccent e -20 -KPX kcommaaccent eacute -20 -KPX kcommaaccent ecaron -20 -KPX kcommaaccent ecircumflex -20 -KPX kcommaaccent edieresis -20 -KPX kcommaaccent edotaccent -20 -KPX kcommaaccent egrave -20 -KPX kcommaaccent emacron -20 -KPX kcommaaccent eogonek -20 -KPX kcommaaccent o -20 -KPX kcommaaccent oacute -20 -KPX kcommaaccent ocircumflex -20 -KPX kcommaaccent odieresis -20 -KPX kcommaaccent ograve -20 -KPX kcommaaccent ohungarumlaut -20 -KPX kcommaaccent omacron -20 -KPX kcommaaccent oslash -20 -KPX kcommaaccent otilde -20 -KPX m u -10 -KPX m uacute -10 -KPX m ucircumflex -10 -KPX m udieresis -10 -KPX m ugrave -10 -KPX m uhungarumlaut -10 -KPX m umacron -10 -KPX m uogonek -10 -KPX m uring -10 -KPX m y -15 -KPX m yacute -15 -KPX m ydieresis -15 -KPX n u -10 -KPX n uacute -10 -KPX n ucircumflex -10 -KPX n udieresis -10 -KPX n ugrave -10 -KPX n uhungarumlaut -10 -KPX n umacron -10 -KPX n uogonek -10 -KPX n uring -10 -KPX n v -20 -KPX n y -15 -KPX n yacute -15 -KPX n ydieresis -15 -KPX nacute u -10 -KPX nacute uacute -10 -KPX nacute ucircumflex -10 -KPX nacute udieresis -10 -KPX nacute ugrave -10 -KPX nacute uhungarumlaut -10 -KPX nacute umacron -10 -KPX nacute uogonek -10 -KPX nacute uring -10 -KPX nacute v -20 -KPX nacute y -15 -KPX nacute yacute -15 -KPX nacute ydieresis -15 -KPX ncaron u -10 -KPX ncaron uacute -10 -KPX ncaron ucircumflex -10 -KPX ncaron udieresis -10 -KPX ncaron ugrave -10 -KPX ncaron uhungarumlaut -10 -KPX ncaron umacron -10 -KPX ncaron uogonek -10 -KPX ncaron uring -10 -KPX ncaron v -20 -KPX ncaron y -15 -KPX ncaron yacute -15 -KPX ncaron ydieresis -15 -KPX ncommaaccent u -10 -KPX ncommaaccent uacute -10 -KPX ncommaaccent ucircumflex -10 -KPX ncommaaccent udieresis -10 -KPX ncommaaccent ugrave -10 -KPX ncommaaccent uhungarumlaut -10 -KPX ncommaaccent umacron -10 -KPX ncommaaccent uogonek -10 -KPX ncommaaccent uring -10 -KPX ncommaaccent v -20 -KPX ncommaaccent y -15 -KPX ncommaaccent yacute -15 -KPX ncommaaccent ydieresis -15 -KPX ntilde u -10 -KPX ntilde uacute -10 -KPX ntilde ucircumflex -10 -KPX ntilde udieresis -10 -KPX ntilde ugrave -10 -KPX ntilde uhungarumlaut -10 -KPX ntilde umacron -10 -KPX ntilde uogonek -10 -KPX ntilde uring -10 -KPX ntilde v -20 -KPX ntilde y -15 -KPX ntilde yacute -15 -KPX ntilde ydieresis -15 -KPX o comma -40 -KPX o period -40 -KPX o v -15 -KPX o w -15 -KPX o x -30 -KPX o y -30 -KPX o yacute -30 -KPX o ydieresis -30 -KPX oacute comma -40 -KPX oacute period -40 -KPX oacute v -15 -KPX oacute w -15 -KPX oacute x -30 -KPX oacute y -30 -KPX oacute yacute -30 -KPX oacute ydieresis -30 -KPX ocircumflex comma -40 -KPX ocircumflex period -40 -KPX ocircumflex v -15 -KPX ocircumflex w -15 -KPX ocircumflex x -30 -KPX ocircumflex y -30 -KPX ocircumflex yacute -30 -KPX ocircumflex ydieresis -30 -KPX odieresis comma -40 -KPX odieresis period -40 -KPX odieresis v -15 -KPX odieresis w -15 -KPX odieresis x -30 -KPX odieresis y -30 -KPX odieresis yacute -30 -KPX odieresis ydieresis -30 -KPX ograve comma -40 -KPX ograve period -40 -KPX ograve v -15 -KPX ograve w -15 -KPX ograve x -30 -KPX ograve y -30 -KPX ograve yacute -30 -KPX ograve ydieresis -30 -KPX ohungarumlaut comma -40 -KPX ohungarumlaut period -40 -KPX ohungarumlaut v -15 -KPX ohungarumlaut w -15 -KPX ohungarumlaut x -30 -KPX ohungarumlaut y -30 -KPX ohungarumlaut yacute -30 -KPX ohungarumlaut ydieresis -30 -KPX omacron comma -40 -KPX omacron period -40 -KPX omacron v -15 -KPX omacron w -15 -KPX omacron x -30 -KPX omacron y -30 -KPX omacron yacute -30 -KPX omacron ydieresis -30 -KPX oslash a -55 -KPX oslash aacute -55 -KPX oslash abreve -55 -KPX oslash acircumflex -55 -KPX oslash adieresis -55 -KPX oslash agrave -55 -KPX oslash amacron -55 -KPX oslash aogonek -55 -KPX oslash aring -55 -KPX oslash atilde -55 -KPX oslash b -55 -KPX oslash c -55 -KPX oslash cacute -55 -KPX oslash ccaron -55 -KPX oslash ccedilla -55 -KPX oslash comma -95 -KPX oslash d -55 -KPX oslash dcroat -55 -KPX oslash e -55 -KPX oslash eacute -55 -KPX oslash ecaron -55 -KPX oslash ecircumflex -55 -KPX oslash edieresis -55 -KPX oslash edotaccent -55 -KPX oslash egrave -55 -KPX oslash emacron -55 -KPX oslash eogonek -55 -KPX oslash f -55 -KPX oslash g -55 -KPX oslash gbreve -55 -KPX oslash gcommaaccent -55 -KPX oslash h -55 -KPX oslash i -55 -KPX oslash iacute -55 -KPX oslash icircumflex -55 -KPX oslash idieresis -55 -KPX oslash igrave -55 -KPX oslash imacron -55 -KPX oslash iogonek -55 -KPX oslash j -55 -KPX oslash k -55 -KPX oslash kcommaaccent -55 -KPX oslash l -55 -KPX oslash lacute -55 -KPX oslash lcommaaccent -55 -KPX oslash lslash -55 -KPX oslash m -55 -KPX oslash n -55 -KPX oslash nacute -55 -KPX oslash ncaron -55 -KPX oslash ncommaaccent -55 -KPX oslash ntilde -55 -KPX oslash o -55 -KPX oslash oacute -55 -KPX oslash ocircumflex -55 -KPX oslash odieresis -55 -KPX oslash ograve -55 -KPX oslash ohungarumlaut -55 -KPX oslash omacron -55 -KPX oslash oslash -55 -KPX oslash otilde -55 -KPX oslash p -55 -KPX oslash period -95 -KPX oslash q -55 -KPX oslash r -55 -KPX oslash racute -55 -KPX oslash rcaron -55 -KPX oslash rcommaaccent -55 -KPX oslash s -55 -KPX oslash sacute -55 -KPX oslash scaron -55 -KPX oslash scedilla -55 -KPX oslash scommaaccent -55 -KPX oslash t -55 -KPX oslash tcommaaccent -55 -KPX oslash u -55 -KPX oslash uacute -55 -KPX oslash ucircumflex -55 -KPX oslash udieresis -55 -KPX oslash ugrave -55 -KPX oslash uhungarumlaut -55 -KPX oslash umacron -55 -KPX oslash uogonek -55 -KPX oslash uring -55 -KPX oslash v -70 -KPX oslash w -70 -KPX oslash x -85 -KPX oslash y -70 -KPX oslash yacute -70 -KPX oslash ydieresis -70 -KPX oslash z -55 -KPX oslash zacute -55 -KPX oslash zcaron -55 -KPX oslash zdotaccent -55 -KPX otilde comma -40 -KPX otilde period -40 -KPX otilde v -15 -KPX otilde w -15 -KPX otilde x -30 -KPX otilde y -30 -KPX otilde yacute -30 -KPX otilde ydieresis -30 -KPX p comma -35 -KPX p period -35 -KPX p y -30 -KPX p yacute -30 -KPX p ydieresis -30 -KPX period quotedblright -100 -KPX period quoteright -100 -KPX period space -60 -KPX quotedblright space -40 -KPX quoteleft quoteleft -57 -KPX quoteright d -50 -KPX quoteright dcroat -50 -KPX quoteright quoteright -57 -KPX quoteright r -50 -KPX quoteright racute -50 -KPX quoteright rcaron -50 -KPX quoteright rcommaaccent -50 -KPX quoteright s -50 -KPX quoteright sacute -50 -KPX quoteright scaron -50 -KPX quoteright scedilla -50 -KPX quoteright scommaaccent -50 -KPX quoteright space -70 -KPX r a -10 -KPX r aacute -10 -KPX r abreve -10 -KPX r acircumflex -10 -KPX r adieresis -10 -KPX r agrave -10 -KPX r amacron -10 -KPX r aogonek -10 -KPX r aring -10 -KPX r atilde -10 -KPX r colon 30 -KPX r comma -50 -KPX r i 15 -KPX r iacute 15 -KPX r icircumflex 15 -KPX r idieresis 15 -KPX r igrave 15 -KPX r imacron 15 -KPX r iogonek 15 -KPX r k 15 -KPX r kcommaaccent 15 -KPX r l 15 -KPX r lacute 15 -KPX r lcommaaccent 15 -KPX r lslash 15 -KPX r m 25 -KPX r n 25 -KPX r nacute 25 -KPX r ncaron 25 -KPX r ncommaaccent 25 -KPX r ntilde 25 -KPX r p 30 -KPX r period -50 -KPX r semicolon 30 -KPX r t 40 -KPX r tcommaaccent 40 -KPX r u 15 -KPX r uacute 15 -KPX r ucircumflex 15 -KPX r udieresis 15 -KPX r ugrave 15 -KPX r uhungarumlaut 15 -KPX r umacron 15 -KPX r uogonek 15 -KPX r uring 15 -KPX r v 30 -KPX r y 30 -KPX r yacute 30 -KPX r ydieresis 30 -KPX racute a -10 -KPX racute aacute -10 -KPX racute abreve -10 -KPX racute acircumflex -10 -KPX racute adieresis -10 -KPX racute agrave -10 -KPX racute amacron -10 -KPX racute aogonek -10 -KPX racute aring -10 -KPX racute atilde -10 -KPX racute colon 30 -KPX racute comma -50 -KPX racute i 15 -KPX racute iacute 15 -KPX racute icircumflex 15 -KPX racute idieresis 15 -KPX racute igrave 15 -KPX racute imacron 15 -KPX racute iogonek 15 -KPX racute k 15 -KPX racute kcommaaccent 15 -KPX racute l 15 -KPX racute lacute 15 -KPX racute lcommaaccent 15 -KPX racute lslash 15 -KPX racute m 25 -KPX racute n 25 -KPX racute nacute 25 -KPX racute ncaron 25 -KPX racute ncommaaccent 25 -KPX racute ntilde 25 -KPX racute p 30 -KPX racute period -50 -KPX racute semicolon 30 -KPX racute t 40 -KPX racute tcommaaccent 40 -KPX racute u 15 -KPX racute uacute 15 -KPX racute ucircumflex 15 -KPX racute udieresis 15 -KPX racute ugrave 15 -KPX racute uhungarumlaut 15 -KPX racute umacron 15 -KPX racute uogonek 15 -KPX racute uring 15 -KPX racute v 30 -KPX racute y 30 -KPX racute yacute 30 -KPX racute ydieresis 30 -KPX rcaron a -10 -KPX rcaron aacute -10 -KPX rcaron abreve -10 -KPX rcaron acircumflex -10 -KPX rcaron adieresis -10 -KPX rcaron agrave -10 -KPX rcaron amacron -10 -KPX rcaron aogonek -10 -KPX rcaron aring -10 -KPX rcaron atilde -10 -KPX rcaron colon 30 -KPX rcaron comma -50 -KPX rcaron i 15 -KPX rcaron iacute 15 -KPX rcaron icircumflex 15 -KPX rcaron idieresis 15 -KPX rcaron igrave 15 -KPX rcaron imacron 15 -KPX rcaron iogonek 15 -KPX rcaron k 15 -KPX rcaron kcommaaccent 15 -KPX rcaron l 15 -KPX rcaron lacute 15 -KPX rcaron lcommaaccent 15 -KPX rcaron lslash 15 -KPX rcaron m 25 -KPX rcaron n 25 -KPX rcaron nacute 25 -KPX rcaron ncaron 25 -KPX rcaron ncommaaccent 25 -KPX rcaron ntilde 25 -KPX rcaron p 30 -KPX rcaron period -50 -KPX rcaron semicolon 30 -KPX rcaron t 40 -KPX rcaron tcommaaccent 40 -KPX rcaron u 15 -KPX rcaron uacute 15 -KPX rcaron ucircumflex 15 -KPX rcaron udieresis 15 -KPX rcaron ugrave 15 -KPX rcaron uhungarumlaut 15 -KPX rcaron umacron 15 -KPX rcaron uogonek 15 -KPX rcaron uring 15 -KPX rcaron v 30 -KPX rcaron y 30 -KPX rcaron yacute 30 -KPX rcaron ydieresis 30 -KPX rcommaaccent a -10 -KPX rcommaaccent aacute -10 -KPX rcommaaccent abreve -10 -KPX rcommaaccent acircumflex -10 -KPX rcommaaccent adieresis -10 -KPX rcommaaccent agrave -10 -KPX rcommaaccent amacron -10 -KPX rcommaaccent aogonek -10 -KPX rcommaaccent aring -10 -KPX rcommaaccent atilde -10 -KPX rcommaaccent colon 30 -KPX rcommaaccent comma -50 -KPX rcommaaccent i 15 -KPX rcommaaccent iacute 15 -KPX rcommaaccent icircumflex 15 -KPX rcommaaccent idieresis 15 -KPX rcommaaccent igrave 15 -KPX rcommaaccent imacron 15 -KPX rcommaaccent iogonek 15 -KPX rcommaaccent k 15 -KPX rcommaaccent kcommaaccent 15 -KPX rcommaaccent l 15 -KPX rcommaaccent lacute 15 -KPX rcommaaccent lcommaaccent 15 -KPX rcommaaccent lslash 15 -KPX rcommaaccent m 25 -KPX rcommaaccent n 25 -KPX rcommaaccent nacute 25 -KPX rcommaaccent ncaron 25 -KPX rcommaaccent ncommaaccent 25 -KPX rcommaaccent ntilde 25 -KPX rcommaaccent p 30 -KPX rcommaaccent period -50 -KPX rcommaaccent semicolon 30 -KPX rcommaaccent t 40 -KPX rcommaaccent tcommaaccent 40 -KPX rcommaaccent u 15 -KPX rcommaaccent uacute 15 -KPX rcommaaccent ucircumflex 15 -KPX rcommaaccent udieresis 15 -KPX rcommaaccent ugrave 15 -KPX rcommaaccent uhungarumlaut 15 -KPX rcommaaccent umacron 15 -KPX rcommaaccent uogonek 15 -KPX rcommaaccent uring 15 -KPX rcommaaccent v 30 -KPX rcommaaccent y 30 -KPX rcommaaccent yacute 30 -KPX rcommaaccent ydieresis 30 -KPX s comma -15 -KPX s period -15 -KPX s w -30 -KPX sacute comma -15 -KPX sacute period -15 -KPX sacute w -30 -KPX scaron comma -15 -KPX scaron period -15 -KPX scaron w -30 -KPX scedilla comma -15 -KPX scedilla period -15 -KPX scedilla w -30 -KPX scommaaccent comma -15 -KPX scommaaccent period -15 -KPX scommaaccent w -30 -KPX semicolon space -50 -KPX space T -50 -KPX space Tcaron -50 -KPX space Tcommaaccent -50 -KPX space V -50 -KPX space W -40 -KPX space Y -90 -KPX space Yacute -90 -KPX space Ydieresis -90 -KPX space quotedblleft -30 -KPX space quoteleft -60 -KPX v a -25 -KPX v aacute -25 -KPX v abreve -25 -KPX v acircumflex -25 -KPX v adieresis -25 -KPX v agrave -25 -KPX v amacron -25 -KPX v aogonek -25 -KPX v aring -25 -KPX v atilde -25 -KPX v comma -80 -KPX v e -25 -KPX v eacute -25 -KPX v ecaron -25 -KPX v ecircumflex -25 -KPX v edieresis -25 -KPX v edotaccent -25 -KPX v egrave -25 -KPX v emacron -25 -KPX v eogonek -25 -KPX v o -25 -KPX v oacute -25 -KPX v ocircumflex -25 -KPX v odieresis -25 -KPX v ograve -25 -KPX v ohungarumlaut -25 -KPX v omacron -25 -KPX v oslash -25 -KPX v otilde -25 -KPX v period -80 -KPX w a -15 -KPX w aacute -15 -KPX w abreve -15 -KPX w acircumflex -15 -KPX w adieresis -15 -KPX w agrave -15 -KPX w amacron -15 -KPX w aogonek -15 -KPX w aring -15 -KPX w atilde -15 -KPX w comma -60 -KPX w e -10 -KPX w eacute -10 -KPX w ecaron -10 -KPX w ecircumflex -10 -KPX w edieresis -10 -KPX w edotaccent -10 -KPX w egrave -10 -KPX w emacron -10 -KPX w eogonek -10 -KPX w o -10 -KPX w oacute -10 -KPX w ocircumflex -10 -KPX w odieresis -10 -KPX w ograve -10 -KPX w ohungarumlaut -10 -KPX w omacron -10 -KPX w oslash -10 -KPX w otilde -10 -KPX w period -60 -KPX x e -30 -KPX x eacute -30 -KPX x ecaron -30 -KPX x ecircumflex -30 -KPX x edieresis -30 -KPX x edotaccent -30 -KPX x egrave -30 -KPX x emacron -30 -KPX x eogonek -30 -KPX y a -20 -KPX y aacute -20 -KPX y abreve -20 -KPX y acircumflex -20 -KPX y adieresis -20 -KPX y agrave -20 -KPX y amacron -20 -KPX y aogonek -20 -KPX y aring -20 -KPX y atilde -20 -KPX y comma -100 -KPX y e -20 -KPX y eacute -20 -KPX y ecaron -20 -KPX y ecircumflex -20 -KPX y edieresis -20 -KPX y edotaccent -20 -KPX y egrave -20 -KPX y emacron -20 -KPX y eogonek -20 -KPX y o -20 -KPX y oacute -20 -KPX y ocircumflex -20 -KPX y odieresis -20 -KPX y ograve -20 -KPX y ohungarumlaut -20 -KPX y omacron -20 -KPX y oslash -20 -KPX y otilde -20 -KPX y period -100 -KPX yacute a -20 -KPX yacute aacute -20 -KPX yacute abreve -20 -KPX yacute acircumflex -20 -KPX yacute adieresis -20 -KPX yacute agrave -20 -KPX yacute amacron -20 -KPX yacute aogonek -20 -KPX yacute aring -20 -KPX yacute atilde -20 -KPX yacute comma -100 -KPX yacute e -20 -KPX yacute eacute -20 -KPX yacute ecaron -20 -KPX yacute ecircumflex -20 -KPX yacute edieresis -20 -KPX yacute edotaccent -20 -KPX yacute egrave -20 -KPX yacute emacron -20 -KPX yacute eogonek -20 -KPX yacute o -20 -KPX yacute oacute -20 -KPX yacute ocircumflex -20 -KPX yacute odieresis -20 -KPX yacute ograve -20 -KPX yacute ohungarumlaut -20 -KPX yacute omacron -20 -KPX yacute oslash -20 -KPX yacute otilde -20 -KPX yacute period -100 -KPX ydieresis a -20 -KPX ydieresis aacute -20 -KPX ydieresis abreve -20 -KPX ydieresis acircumflex -20 -KPX ydieresis adieresis -20 -KPX ydieresis agrave -20 -KPX ydieresis amacron -20 -KPX ydieresis aogonek -20 -KPX ydieresis aring -20 -KPX ydieresis atilde -20 -KPX ydieresis comma -100 -KPX ydieresis e -20 -KPX ydieresis eacute -20 -KPX ydieresis ecaron -20 -KPX ydieresis ecircumflex -20 -KPX ydieresis edieresis -20 -KPX ydieresis edotaccent -20 -KPX ydieresis egrave -20 -KPX ydieresis emacron -20 -KPX ydieresis eogonek -20 -KPX ydieresis o -20 -KPX ydieresis oacute -20 -KPX ydieresis ocircumflex -20 -KPX ydieresis odieresis -20 -KPX ydieresis ograve -20 -KPX ydieresis ohungarumlaut -20 -KPX ydieresis omacron -20 -KPX ydieresis oslash -20 -KPX ydieresis otilde -20 -KPX ydieresis period -100 -KPX z e -15 -KPX z eacute -15 -KPX z ecaron -15 -KPX z ecircumflex -15 -KPX z edieresis -15 -KPX z edotaccent -15 -KPX z egrave -15 -KPX z emacron -15 -KPX z eogonek -15 -KPX z o -15 -KPX z oacute -15 -KPX z ocircumflex -15 -KPX z odieresis -15 -KPX z ograve -15 -KPX z ohungarumlaut -15 -KPX z omacron -15 -KPX z oslash -15 -KPX z otilde -15 -KPX zacute e -15 -KPX zacute eacute -15 -KPX zacute ecaron -15 -KPX zacute ecircumflex -15 -KPX zacute edieresis -15 -KPX zacute edotaccent -15 -KPX zacute egrave -15 -KPX zacute emacron -15 -KPX zacute eogonek -15 -KPX zacute o -15 -KPX zacute oacute -15 -KPX zacute ocircumflex -15 -KPX zacute odieresis -15 -KPX zacute ograve -15 -KPX zacute ohungarumlaut -15 -KPX zacute omacron -15 -KPX zacute oslash -15 -KPX zacute otilde -15 -KPX zcaron e -15 -KPX zcaron eacute -15 -KPX zcaron ecaron -15 -KPX zcaron ecircumflex -15 -KPX zcaron edieresis -15 -KPX zcaron edotaccent -15 -KPX zcaron egrave -15 -KPX zcaron emacron -15 -KPX zcaron eogonek -15 -KPX zcaron o -15 -KPX zcaron oacute -15 -KPX zcaron ocircumflex -15 -KPX zcaron odieresis -15 -KPX zcaron ograve -15 -KPX zcaron ohungarumlaut -15 -KPX zcaron omacron -15 -KPX zcaron oslash -15 -KPX zcaron otilde -15 -KPX zdotaccent e -15 -KPX zdotaccent eacute -15 -KPX zdotaccent ecaron -15 -KPX zdotaccent ecircumflex -15 -KPX zdotaccent edieresis -15 -KPX zdotaccent edotaccent -15 -KPX zdotaccent egrave -15 -KPX zdotaccent emacron -15 -KPX zdotaccent eogonek -15 -KPX zdotaccent o -15 -KPX zdotaccent oacute -15 -KPX zdotaccent ocircumflex -15 -KPX zdotaccent odieresis -15 -KPX zdotaccent ograve -15 -KPX zdotaccent ohungarumlaut -15 -KPX zdotaccent omacron -15 -KPX zdotaccent oslash -15 -KPX zdotaccent otilde -15 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Helvetica.afm.php b/vendor/dompdf/dompdf/lib/fonts/Helvetica.afm.php deleted file mode 100644 index 86b44c9..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Helvetica.afm.php +++ /dev/null @@ -1,572 +0,0 @@ - - array ( - 32 => 'space', - 160 => 'space', - 33 => 'exclam', - 34 => 'quotedbl', - 35 => 'numbersign', - 36 => 'dollar', - 37 => 'percent', - 38 => 'ampersand', - 146 => 'quoteright', - 40 => 'parenleft', - 41 => 'parenright', - 42 => 'asterisk', - 43 => 'plus', - 44 => 'comma', - 45 => 'hyphen', - 173 => 'hyphen', - 46 => 'period', - 47 => 'slash', - 48 => 'zero', - 49 => 'one', - 50 => 'two', - 51 => 'three', - 52 => 'four', - 53 => 'five', - 54 => 'six', - 55 => 'seven', - 56 => 'eight', - 57 => 'nine', - 58 => 'colon', - 59 => 'semicolon', - 60 => 'less', - 61 => 'equal', - 62 => 'greater', - 63 => 'question', - 64 => 'at', - 65 => 'A', - 66 => 'B', - 67 => 'C', - 68 => 'D', - 69 => 'E', - 70 => 'F', - 71 => 'G', - 72 => 'H', - 73 => 'I', - 74 => 'J', - 75 => 'K', - 76 => 'L', - 77 => 'M', - 78 => 'N', - 79 => 'O', - 80 => 'P', - 81 => 'Q', - 82 => 'R', - 83 => 'S', - 84 => 'T', - 85 => 'U', - 86 => 'V', - 87 => 'W', - 88 => 'X', - 89 => 'Y', - 90 => 'Z', - 91 => 'bracketleft', - 92 => 'backslash', - 93 => 'bracketright', - 94 => 'asciicircum', - 95 => 'underscore', - 145 => 'quoteleft', - 97 => 'a', - 98 => 'b', - 99 => 'c', - 100 => 'd', - 101 => 'e', - 102 => 'f', - 103 => 'g', - 104 => 'h', - 105 => 'i', - 106 => 'j', - 107 => 'k', - 108 => 'l', - 109 => 'm', - 110 => 'n', - 111 => 'o', - 112 => 'p', - 113 => 'q', - 114 => 'r', - 115 => 's', - 116 => 't', - 117 => 'u', - 118 => 'v', - 119 => 'w', - 120 => 'x', - 121 => 'y', - 122 => 'z', - 123 => 'braceleft', - 124 => 'bar', - 125 => 'braceright', - 126 => 'asciitilde', - 161 => 'exclamdown', - 162 => 'cent', - 163 => 'sterling', - 165 => 'yen', - 131 => 'florin', - 167 => 'section', - 164 => 'currency', - 39 => 'quotesingle', - 147 => 'quotedblleft', - 171 => 'guillemotleft', - 139 => 'guilsinglleft', - 155 => 'guilsinglright', - 150 => 'endash', - 134 => 'dagger', - 135 => 'daggerdbl', - 183 => 'periodcentered', - 182 => 'paragraph', - 149 => 'bullet', - 130 => 'quotesinglbase', - 132 => 'quotedblbase', - 148 => 'quotedblright', - 187 => 'guillemotright', - 133 => 'ellipsis', - 137 => 'perthousand', - 191 => 'questiondown', - 96 => 'grave', - 180 => 'acute', - 136 => 'circumflex', - 152 => 'tilde', - 175 => 'macron', - 168 => 'dieresis', - 184 => 'cedilla', - 151 => 'emdash', - 198 => 'AE', - 170 => 'ordfeminine', - 216 => 'Oslash', - 140 => 'OE', - 186 => 'ordmasculine', - 230 => 'ae', - 248 => 'oslash', - 156 => 'oe', - 223 => 'germandbls', - 207 => 'Idieresis', - 233 => 'eacute', - 159 => 'Ydieresis', - 247 => 'divide', - 221 => 'Yacute', - 194 => 'Acircumflex', - 225 => 'aacute', - 219 => 'Ucircumflex', - 253 => 'yacute', - 234 => 'ecircumflex', - 220 => 'Udieresis', - 218 => 'Uacute', - 203 => 'Edieresis', - 169 => 'copyright', - 229 => 'aring', - 224 => 'agrave', - 227 => 'atilde', - 154 => 'scaron', - 237 => 'iacute', - 251 => 'ucircumflex', - 226 => 'acircumflex', - 231 => 'ccedilla', - 222 => 'Thorn', - 179 => 'threesuperior', - 210 => 'Ograve', - 192 => 'Agrave', - 215 => 'multiply', - 250 => 'uacute', - 255 => 'ydieresis', - 238 => 'icircumflex', - 202 => 'Ecircumflex', - 228 => 'adieresis', - 235 => 'edieresis', - 205 => 'Iacute', - 177 => 'plusminus', - 166 => 'brokenbar', - 174 => 'registered', - 200 => 'Egrave', - 142 => 'Zcaron', - 208 => 'Eth', - 199 => 'Ccedilla', - 193 => 'Aacute', - 196 => 'Adieresis', - 232 => 'egrave', - 211 => 'Oacute', - 243 => 'oacute', - 239 => 'idieresis', - 212 => 'Ocircumflex', - 217 => 'Ugrave', - 254 => 'thorn', - 178 => 'twosuperior', - 214 => 'Odieresis', - 181 => 'mu', - 236 => 'igrave', - 190 => 'threequarters', - 153 => 'trademark', - 204 => 'Igrave', - 189 => 'onehalf', - 244 => 'ocircumflex', - 241 => 'ntilde', - 201 => 'Eacute', - 188 => 'onequarter', - 138 => 'Scaron', - 176 => 'degree', - 242 => 'ograve', - 249 => 'ugrave', - 209 => 'Ntilde', - 245 => 'otilde', - 195 => 'Atilde', - 197 => 'Aring', - 213 => 'Otilde', - 206 => 'Icircumflex', - 172 => 'logicalnot', - 246 => 'odieresis', - 252 => 'udieresis', - 240 => 'eth', - 158 => 'zcaron', - 185 => 'onesuperior', - 128 => 'Euro', - ), - 'isUnicode' => false, - 'FontName' => 'Helvetica', - 'FullName' => 'Helvetica', - 'FamilyName' => 'Helvetica', - 'Weight' => 'Medium', - 'ItalicAngle' => '0', - 'IsFixedPitch' => 'false', - 'CharacterSet' => 'ExtendedRoman', - 'FontBBox' => - array ( - 0 => '-166', - 1 => '-225', - 2 => '1000', - 3 => '931', - ), - 'UnderlinePosition' => '-100', - 'UnderlineThickness' => '50', - 'Version' => '002.000', - 'EncodingScheme' => 'WinAnsiEncoding', - 'CapHeight' => '718', - 'XHeight' => '523', - 'Ascender' => '718', - 'Descender' => '-207', - 'StdHW' => '76', - 'StdVW' => '88', - 'StartCharMetrics' => '317', - 'C' => - array ( - 32 => 278.0, - 160 => 278.0, - 33 => 278.0, - 34 => 355.0, - 35 => 556.0, - 36 => 556.0, - 37 => 889.0, - 38 => 667.0, - 146 => 222.0, - 40 => 333.0, - 41 => 333.0, - 42 => 389.0, - 43 => 584.0, - 44 => 278.0, - 45 => 333.0, - 173 => 333.0, - 46 => 278.0, - 47 => 278.0, - 48 => 556.0, - 49 => 556.0, - 50 => 556.0, - 51 => 556.0, - 52 => 556.0, - 53 => 556.0, - 54 => 556.0, - 55 => 556.0, - 56 => 556.0, - 57 => 556.0, - 58 => 278.0, - 59 => 278.0, - 60 => 584.0, - 61 => 584.0, - 62 => 584.0, - 63 => 556.0, - 64 => 1015.0, - 65 => 667.0, - 66 => 667.0, - 67 => 722.0, - 68 => 722.0, - 69 => 667.0, - 70 => 611.0, - 71 => 778.0, - 72 => 722.0, - 73 => 278.0, - 74 => 500.0, - 75 => 667.0, - 76 => 556.0, - 77 => 833.0, - 78 => 722.0, - 79 => 778.0, - 80 => 667.0, - 81 => 778.0, - 82 => 722.0, - 83 => 667.0, - 84 => 611.0, - 85 => 722.0, - 86 => 667.0, - 87 => 944.0, - 88 => 667.0, - 89 => 667.0, - 90 => 611.0, - 91 => 278.0, - 92 => 278.0, - 93 => 278.0, - 94 => 469.0, - 95 => 556.0, - 145 => 222.0, - 97 => 556.0, - 98 => 556.0, - 99 => 500.0, - 100 => 556.0, - 101 => 556.0, - 102 => 278.0, - 103 => 556.0, - 104 => 556.0, - 105 => 222.0, - 106 => 222.0, - 107 => 500.0, - 108 => 222.0, - 109 => 833.0, - 110 => 556.0, - 111 => 556.0, - 112 => 556.0, - 113 => 556.0, - 114 => 333.0, - 115 => 500.0, - 116 => 278.0, - 117 => 556.0, - 118 => 500.0, - 119 => 722.0, - 120 => 500.0, - 121 => 500.0, - 122 => 500.0, - 123 => 334.0, - 124 => 260.0, - 125 => 334.0, - 126 => 584.0, - 161 => 333.0, - 162 => 556.0, - 163 => 556.0, - 'fraction' => 167.0, - 165 => 556.0, - 131 => 556.0, - 167 => 556.0, - 164 => 556.0, - 39 => 191.0, - 147 => 333.0, - 171 => 556.0, - 139 => 333.0, - 155 => 333.0, - 'fi' => 500.0, - 'fl' => 500.0, - 150 => 556.0, - 134 => 556.0, - 135 => 556.0, - 183 => 278.0, - 182 => 537.0, - 149 => 350.0, - 130 => 222.0, - 132 => 333.0, - 148 => 333.0, - 187 => 556.0, - 133 => 1000.0, - 137 => 1000.0, - 191 => 611.0, - 96 => 333.0, - 180 => 333.0, - 136 => 333.0, - 152 => 333.0, - 175 => 333.0, - 'breve' => 333.0, - 'dotaccent' => 333.0, - 168 => 333.0, - 'ring' => 333.0, - 184 => 333.0, - 'hungarumlaut' => 333.0, - 'ogonek' => 333.0, - 'caron' => 333.0, - 151 => 1000.0, - 198 => 1000.0, - 170 => 370.0, - 'Lslash' => 556.0, - 216 => 778.0, - 140 => 1000.0, - 186 => 365.0, - 230 => 889.0, - 'dotlessi' => 278.0, - 'lslash' => 222.0, - 248 => 611.0, - 156 => 944.0, - 223 => 611.0, - 207 => 278.0, - 233 => 556.0, - 'abreve' => 556.0, - 'uhungarumlaut' => 556.0, - 'ecaron' => 556.0, - 159 => 667.0, - 247 => 584.0, - 221 => 667.0, - 194 => 667.0, - 225 => 556.0, - 219 => 722.0, - 253 => 500.0, - 'scommaaccent' => 500.0, - 234 => 556.0, - 'Uring' => 722.0, - 220 => 722.0, - 'aogonek' => 556.0, - 218 => 722.0, - 'uogonek' => 556.0, - 203 => 667.0, - 'Dcroat' => 722.0, - 'commaaccent' => 250.0, - 169 => 737.0, - 'Emacron' => 667.0, - 'ccaron' => 500.0, - 229 => 556.0, - 'Ncommaaccent' => 722.0, - 'lacute' => 222.0, - 224 => 556.0, - 'Tcommaaccent' => 611.0, - 'Cacute' => 722.0, - 227 => 556.0, - 'Edotaccent' => 667.0, - 154 => 500.0, - 'scedilla' => 500.0, - 237 => 278.0, - 'lozenge' => 471.0, - 'Rcaron' => 722.0, - 'Gcommaaccent' => 778.0, - 251 => 556.0, - 226 => 556.0, - 'Amacron' => 667.0, - 'rcaron' => 333.0, - 231 => 500.0, - 'Zdotaccent' => 611.0, - 222 => 667.0, - 'Omacron' => 778.0, - 'Racute' => 722.0, - 'Sacute' => 667.0, - 'dcaron' => 643.0, - 'Umacron' => 722.0, - 'uring' => 556.0, - 179 => 333.0, - 210 => 778.0, - 192 => 667.0, - 'Abreve' => 667.0, - 215 => 584.0, - 250 => 556.0, - 'Tcaron' => 611.0, - 'partialdiff' => 476.0, - 255 => 500.0, - 'Nacute' => 722.0, - 238 => 278.0, - 202 => 667.0, - 228 => 556.0, - 235 => 556.0, - 'cacute' => 500.0, - 'nacute' => 556.0, - 'umacron' => 556.0, - 'Ncaron' => 722.0, - 205 => 278.0, - 177 => 584.0, - 166 => 260.0, - 174 => 737.0, - 'Gbreve' => 778.0, - 'Idotaccent' => 278.0, - 'summation' => 600.0, - 200 => 667.0, - 'racute' => 333.0, - 'omacron' => 556.0, - 'Zacute' => 611.0, - 142 => 611.0, - 'greaterequal' => 549.0, - 208 => 722.0, - 199 => 722.0, - 'lcommaaccent' => 222.0, - 'tcaron' => 317.0, - 'eogonek' => 556.0, - 'Uogonek' => 722.0, - 193 => 667.0, - 196 => 667.0, - 232 => 556.0, - 'zacute' => 500.0, - 'iogonek' => 222.0, - 211 => 778.0, - 243 => 556.0, - 'amacron' => 556.0, - 'sacute' => 500.0, - 239 => 278.0, - 212 => 778.0, - 217 => 722.0, - 'Delta' => 612.0, - 254 => 556.0, - 178 => 333.0, - 214 => 778.0, - 181 => 556.0, - 236 => 278.0, - 'ohungarumlaut' => 556.0, - 'Eogonek' => 667.0, - 'dcroat' => 556.0, - 190 => 834.0, - 'Scedilla' => 667.0, - 'lcaron' => 299.0, - 'Kcommaaccent' => 667.0, - 'Lacute' => 556.0, - 153 => 1000.0, - 'edotaccent' => 556.0, - 204 => 278.0, - 'Imacron' => 278.0, - 'Lcaron' => 556.0, - 189 => 834.0, - 'lessequal' => 549.0, - 244 => 556.0, - 241 => 556.0, - 'Uhungarumlaut' => 722.0, - 201 => 667.0, - 'emacron' => 556.0, - 'gbreve' => 556.0, - 188 => 834.0, - 138 => 667.0, - 'Scommaaccent' => 667.0, - 'Ohungarumlaut' => 778.0, - 176 => 400.0, - 242 => 556.0, - 'Ccaron' => 722.0, - 249 => 556.0, - 'radical' => 453.0, - 'Dcaron' => 722.0, - 'rcommaaccent' => 333.0, - 209 => 722.0, - 245 => 556.0, - 'Rcommaaccent' => 722.0, - 'Lcommaaccent' => 556.0, - 195 => 667.0, - 'Aogonek' => 667.0, - 197 => 667.0, - 213 => 778.0, - 'zdotaccent' => 500.0, - 'Ecaron' => 667.0, - 'Iogonek' => 278.0, - 'kcommaaccent' => 500.0, - 'minus' => 584.0, - 206 => 278.0, - 'ncaron' => 556.0, - 'tcommaaccent' => 278.0, - 172 => 584.0, - 246 => 556.0, - 252 => 556.0, - 'notequal' => 549.0, - 'gcommaaccent' => 556.0, - 240 => 556.0, - 158 => 500.0, - 'ncommaaccent' => 556.0, - 185 => 333.0, - 'imacron' => 278.0, - 128 => 556.0, - ), - 'CIDtoGID_Compressed' => true, - 'CIDtoGID' => 'eJwDAAAAAAE=', - '_version_' => 6, -); \ No newline at end of file diff --git a/vendor/dompdf/dompdf/lib/fonts/Symbol.afm b/vendor/dompdf/dompdf/lib/fonts/Symbol.afm deleted file mode 100644 index 6a5386a..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Symbol.afm +++ /dev/null @@ -1,213 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. -Comment Creation Date: Thu May 1 15:12:25 1997 -Comment UniqueID 43064 -Comment VMusage 30820 39997 -FontName Symbol -FullName Symbol -FamilyName Symbol -Weight Medium -ItalicAngle 0 -IsFixedPitch false -CharacterSet Special -FontBBox -180 -293 1090 1010 -UnderlinePosition -100 -UnderlineThickness 50 -Version 001.008 -Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. -EncodingScheme FontSpecific -StdHW 92 -StdVW 85 -StartCharMetrics 190 -C 32 ; WX 250 ; N space ; B 0 0 0 0 ; -C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ; -C 34 ; WX 713 ; N universal ; B 31 0 681 705 ; -C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ; -C 36 ; WX 549 ; N existential ; B 25 0 478 707 ; -C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ; -C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ; -C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ; -C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ; -C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ; -C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ; -C 43 ; WX 549 ; N plus ; B 10 0 539 533 ; -C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ; -C 45 ; WX 549 ; N minus ; B 11 233 535 288 ; -C 46 ; WX 250 ; N period ; B 69 -17 181 95 ; -C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ; -C 48 ; WX 500 ; N zero ; B 24 -14 476 685 ; -C 49 ; WX 500 ; N one ; B 117 0 390 673 ; -C 50 ; WX 500 ; N two ; B 25 0 475 685 ; -C 51 ; WX 500 ; N three ; B 43 -14 435 685 ; -C 52 ; WX 500 ; N four ; B 15 0 469 685 ; -C 53 ; WX 500 ; N five ; B 32 -14 445 690 ; -C 54 ; WX 500 ; N six ; B 34 -14 468 685 ; -C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ; -C 56 ; WX 500 ; N eight ; B 56 -14 445 685 ; -C 57 ; WX 500 ; N nine ; B 30 -18 459 685 ; -C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ; -C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ; -C 60 ; WX 549 ; N less ; B 26 0 523 522 ; -C 61 ; WX 549 ; N equal ; B 11 141 537 390 ; -C 62 ; WX 549 ; N greater ; B 26 0 523 522 ; -C 63 ; WX 444 ; N question ; B 70 -17 412 686 ; -C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ; -C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ; -C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ; -C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ; -C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ; -C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ; -C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ; -C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ; -C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ; -C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ; -C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ; -C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ; -C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ; -C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ; -C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ; -C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ; -C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ; -C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ; -C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ; -C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ; -C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ; -C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ; -C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ; -C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ; -C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ; -C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ; -C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ; -C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ; -C 92 ; WX 863 ; N therefore ; B 163 0 701 487 ; -C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ; -C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ; -C 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ; -C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ; -C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ; -C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ; -C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ; -C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ; -C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ; -C 102 ; WX 521 ; N phi ; B 28 -224 492 673 ; -C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ; -C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ; -C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ; -C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ; -C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ; -C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ; -C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ; -C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ; -C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ; -C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ; -C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ; -C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ; -C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ; -C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ; -C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ; -C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ; -C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ; -C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ; -C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ; -C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ; -C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ; -C 124 ; WX 200 ; N bar ; B 65 -293 135 707 ; -C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ; -C 126 ; WX 549 ; N similar ; B 17 203 529 307 ; -C 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ; -C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ; -C 162 ; WX 247 ; N minute ; B 27 459 228 735 ; -C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ; -C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ; -C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ; -C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ; -C 167 ; WX 753 ; N club ; B 86 -26 660 533 ; -C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ; -C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ; -C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ; -C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ; -C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ; -C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ; -C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ; -C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ; -C 176 ; WX 400 ; N degree ; B 50 385 350 685 ; -C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ; -C 178 ; WX 411 ; N second ; B 20 459 413 737 ; -C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ; -C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ; -C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ; -C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ; -C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ; -C 184 ; WX 549 ; N divide ; B 10 71 536 456 ; -C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ; -C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ; -C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ; -C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ; -C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ; -C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ; -C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ; -C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ; -C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ; -C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ; -C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ; -C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ; -C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ; -C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ; -C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ; -C 200 ; WX 768 ; N union ; B 40 -17 732 492 ; -C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ; -C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ; -C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ; -C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ; -C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ; -C 206 ; WX 713 ; N element ; B 45 0 505 468 ; -C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ; -C 208 ; WX 768 ; N angle ; B 26 0 738 673 ; -C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ; -C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ; -C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ; -C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ; -C 213 ; WX 823 ; N product ; B 25 -101 803 751 ; -C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ; -C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ; -C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ; -C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ; -C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ; -C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ; -C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ; -C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ; -C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ; -C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ; -C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ; -C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ; -C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ; -C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ; -C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ; -C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ; -C 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ; -C 231 ; WX 384 ; N parenleftex ; B 24 -85 108 925 ; -C 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 926 ; -C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 349 926 ; -C 234 ; WX 384 ; N bracketleftex ; B 0 -79 77 925 ; -C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 349 926 ; -C 236 ; WX 494 ; N bracelefttp ; B 209 -85 445 925 ; -C 237 ; WX 494 ; N braceleftmid ; B 20 -85 284 935 ; -C 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 935 ; -C 239 ; WX 494 ; N braceex ; B 209 -85 284 935 ; -C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ; -C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ; -C 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ; -C 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ; -C 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ; -C 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ; -C 247 ; WX 384 ; N parenrightex ; B 382 -85 466 925 ; -C 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 926 ; -C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 371 926 ; -C 250 ; WX 384 ; N bracketrightex ; B 294 -79 371 925 ; -C 251 ; WX 384 ; N bracketrightbt ; B 22 -80 371 926 ; -C 252 ; WX 494 ; N bracerighttp ; B 48 -85 284 925 ; -C 253 ; WX 494 ; N bracerightmid ; B 209 -85 473 935 ; -C 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 935 ; -C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ; -EndCharMetrics -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Times-Bold.afm b/vendor/dompdf/dompdf/lib/fonts/Times-Bold.afm deleted file mode 100644 index 5907c3d..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Times-Bold.afm +++ /dev/null @@ -1,2590 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 1 12:52:56 1997 -Comment UniqueID 43065 -Comment VMusage 41636 52661 -FontName Times-Bold -FullName Times Bold -FamilyName Times -Weight Bold -ItalicAngle 0 -IsFixedPitch false -CharacterSet ExtendedRoman -FontBBox -168 -218 1000 935 -UnderlinePosition -100 -UnderlineThickness 50 -Version 002.000 -Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. -EncodingScheme WinAnsiEncoding -CapHeight 676 -XHeight 461 -Ascender 683 -Descender -217 -StdHW 44 -StdVW 139 -StartCharMetrics 317 -C 32 ; WX 250 ; N space ; B 0 0 0 0 ; -C 160 ; WX 250 ; N space ; B 0 0 0 0 ; -C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ; -C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ; -C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ; -C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ; -C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ; -C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ; -C 146 ; WX 333 ; N quoteright ; B 79 356 263 691 ; -C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ; -C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ; -C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ; -C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; -C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ; -C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ; -C 173 ; WX 333 ; N hyphen ; B 44 171 287 287 ; -C 46 ; WX 250 ; N period ; B 41 -13 210 156 ; -C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ; -C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ; -C 49 ; WX 500 ; N one ; B 65 0 442 688 ; -C 50 ; WX 500 ; N two ; B 17 0 478 688 ; -C 51 ; WX 500 ; N three ; B 16 -14 468 688 ; -C 52 ; WX 500 ; N four ; B 19 0 475 688 ; -C 53 ; WX 500 ; N five ; B 22 -8 470 676 ; -C 54 ; WX 500 ; N six ; B 28 -13 475 688 ; -C 55 ; WX 500 ; N seven ; B 17 0 477 676 ; -C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ; -C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ; -C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ; -C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ; -C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; -C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; -C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; -C 63 ; WX 500 ; N question ; B 57 -13 445 689 ; -C 64 ; WX 930 ; N at ; B 108 -19 822 691 ; -C 65 ; WX 722 ; N A ; B 9 0 689 690 ; -C 66 ; WX 667 ; N B ; B 16 0 619 676 ; -C 67 ; WX 722 ; N C ; B 49 -19 687 691 ; -C 68 ; WX 722 ; N D ; B 14 0 690 676 ; -C 69 ; WX 667 ; N E ; B 16 0 641 676 ; -C 70 ; WX 611 ; N F ; B 16 0 583 676 ; -C 71 ; WX 778 ; N G ; B 37 -19 755 691 ; -C 72 ; WX 778 ; N H ; B 21 0 759 676 ; -C 73 ; WX 389 ; N I ; B 20 0 370 676 ; -C 74 ; WX 500 ; N J ; B 3 -96 479 676 ; -C 75 ; WX 778 ; N K ; B 30 0 769 676 ; -C 76 ; WX 667 ; N L ; B 19 0 638 676 ; -C 77 ; WX 944 ; N M ; B 14 0 921 676 ; -C 78 ; WX 722 ; N N ; B 16 -18 701 676 ; -C 79 ; WX 778 ; N O ; B 35 -19 743 691 ; -C 80 ; WX 611 ; N P ; B 16 0 600 676 ; -C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ; -C 82 ; WX 722 ; N R ; B 26 0 715 676 ; -C 83 ; WX 556 ; N S ; B 35 -19 513 692 ; -C 84 ; WX 667 ; N T ; B 31 0 636 676 ; -C 85 ; WX 722 ; N U ; B 16 -19 701 676 ; -C 86 ; WX 722 ; N V ; B 16 -18 701 676 ; -C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ; -C 88 ; WX 722 ; N X ; B 16 0 699 676 ; -C 89 ; WX 722 ; N Y ; B 15 0 699 676 ; -C 90 ; WX 667 ; N Z ; B 28 0 634 676 ; -C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ; -C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ; -C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ; -C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ; -C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; -C 145 ; WX 333 ; N quoteleft ; B 70 356 254 691 ; -C 97 ; WX 500 ; N a ; B 25 -14 488 473 ; -C 98 ; WX 556 ; N b ; B 17 -14 521 676 ; -C 99 ; WX 444 ; N c ; B 25 -14 430 473 ; -C 100 ; WX 556 ; N d ; B 25 -14 534 676 ; -C 101 ; WX 444 ; N e ; B 25 -14 426 473 ; -C 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ; -C 103 ; WX 500 ; N g ; B 28 -206 483 473 ; -C 104 ; WX 556 ; N h ; B 16 0 534 676 ; -C 105 ; WX 278 ; N i ; B 16 0 255 691 ; -C 106 ; WX 333 ; N j ; B -57 -203 263 691 ; -C 107 ; WX 556 ; N k ; B 22 0 543 676 ; -C 108 ; WX 278 ; N l ; B 16 0 255 676 ; -C 109 ; WX 833 ; N m ; B 16 0 814 473 ; -C 110 ; WX 556 ; N n ; B 21 0 539 473 ; -C 111 ; WX 500 ; N o ; B 25 -14 476 473 ; -C 112 ; WX 556 ; N p ; B 19 -205 524 473 ; -C 113 ; WX 556 ; N q ; B 34 -205 536 473 ; -C 114 ; WX 444 ; N r ; B 29 0 434 473 ; -C 115 ; WX 389 ; N s ; B 25 -14 361 473 ; -C 116 ; WX 333 ; N t ; B 20 -12 332 630 ; -C 117 ; WX 556 ; N u ; B 16 -14 537 461 ; -C 118 ; WX 500 ; N v ; B 21 -14 485 461 ; -C 119 ; WX 722 ; N w ; B 23 -14 707 461 ; -C 120 ; WX 500 ; N x ; B 12 0 484 461 ; -C 121 ; WX 500 ; N y ; B 16 -205 480 461 ; -C 122 ; WX 444 ; N z ; B 21 0 420 461 ; -C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ; -C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; -C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ; -C 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ; -C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ; -C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ; -C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ; -C -1 ; WX 167 ; N fraction ; B -168 -12 329 688 ; -C 165 ; WX 500 ; N yen ; B -64 0 547 676 ; -C 131 ; WX 500 ; N florin ; B 0 -155 498 706 ; -C 167 ; WX 500 ; N section ; B 57 -132 443 691 ; -C 164 ; WX 500 ; N currency ; B -26 61 526 613 ; -C 39 ; WX 278 ; N quotesingle ; B 75 404 204 691 ; -C 147 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ; -C 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ; -C 139 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ; -C 155 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ; -C -1 ; WX 556 ; N fi ; B 14 0 536 691 ; -C -1 ; WX 556 ; N fl ; B 14 0 536 691 ; -C 150 ; WX 500 ; N endash ; B 0 181 500 271 ; -C 134 ; WX 500 ; N dagger ; B 47 -134 453 691 ; -C 135 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ; -C 183 ; WX 250 ; N periodcentered ; B 41 248 210 417 ; -C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ; -C 149 ; WX 350 ; N bullet ; B 35 198 315 478 ; -C 130 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ; -C 132 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ; -C 148 ; WX 500 ; N quotedblright ; B 14 356 468 691 ; -C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ; -C 133 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ; -C 137 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ; -C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ; -C 96 ; WX 333 ; N grave ; B 8 528 246 713 ; -C 180 ; WX 333 ; N acute ; B 86 528 324 713 ; -C 136 ; WX 333 ; N circumflex ; B -2 528 335 704 ; -C 152 ; WX 333 ; N tilde ; B -16 547 349 674 ; -C 175 ; WX 333 ; N macron ; B 1 565 331 637 ; -C -1 ; WX 333 ; N breve ; B 15 528 318 691 ; -C -1 ; WX 333 ; N dotaccent ; B 103 536 258 691 ; -C 168 ; WX 333 ; N dieresis ; B -2 537 335 667 ; -C -1 ; WX 333 ; N ring ; B 60 527 273 740 ; -C 184 ; WX 333 ; N cedilla ; B 68 -218 294 0 ; -C -1 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ; -C -1 ; WX 333 ; N ogonek ; B 90 -193 319 24 ; -C -1 ; WX 333 ; N caron ; B -2 528 335 704 ; -C 151 ; WX 1000 ; N emdash ; B 0 181 1000 271 ; -C 198 ; WX 1000 ; N AE ; B 4 0 951 676 ; -C 170 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ; -C -1 ; WX 667 ; N Lslash ; B 19 0 638 676 ; -C 216 ; WX 778 ; N Oslash ; B 35 -74 743 737 ; -C 140 ; WX 1000 ; N OE ; B 22 -5 981 684 ; -C 186 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ; -C 230 ; WX 722 ; N ae ; B 33 -14 693 473 ; -C -1 ; WX 278 ; N dotlessi ; B 16 0 255 461 ; -C -1 ; WX 278 ; N lslash ; B -22 0 303 676 ; -C 248 ; WX 500 ; N oslash ; B 25 -92 476 549 ; -C 156 ; WX 722 ; N oe ; B 22 -14 696 473 ; -C 223 ; WX 556 ; N germandbls ; B 19 -12 517 691 ; -C 207 ; WX 389 ; N Idieresis ; B 20 0 370 877 ; -C 233 ; WX 444 ; N eacute ; B 25 -14 426 713 ; -C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ; -C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ; -C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ; -C 159 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ; -C 247 ; WX 570 ; N divide ; B 33 -31 537 537 ; -C 221 ; WX 722 ; N Yacute ; B 15 0 699 923 ; -C 194 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ; -C 225 ; WX 500 ; N aacute ; B 25 -14 488 713 ; -C 219 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ; -C 253 ; WX 500 ; N yacute ; B 16 -205 480 713 ; -C -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ; -C 234 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ; -C -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ; -C 220 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ; -C -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ; -C 218 ; WX 722 ; N Uacute ; B 16 -19 701 923 ; -C -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ; -C 203 ; WX 667 ; N Edieresis ; B 16 0 641 877 ; -C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ; -C -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ; -C 169 ; WX 747 ; N copyright ; B 26 -19 721 691 ; -C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ; -C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ; -C 229 ; WX 500 ; N aring ; B 25 -14 488 740 ; -C -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ; -C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ; -C 224 ; WX 500 ; N agrave ; B 25 -14 488 713 ; -C -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ; -C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ; -C 227 ; WX 500 ; N atilde ; B 25 -14 488 674 ; -C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ; -C 154 ; WX 389 ; N scaron ; B 25 -14 363 704 ; -C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ; -C 237 ; WX 278 ; N iacute ; B 16 0 289 713 ; -C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; -C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ; -C -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ; -C 251 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ; -C 226 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ; -C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ; -C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ; -C 231 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ; -C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ; -C 222 ; WX 611 ; N Thorn ; B 16 0 600 676 ; -C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ; -C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ; -C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ; -C -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ; -C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ; -C -1 ; WX 556 ; N uring ; B 16 -14 537 740 ; -C 179 ; WX 300 ; N threesuperior ; B 3 268 297 688 ; -C 210 ; WX 778 ; N Ograve ; B 35 -19 743 923 ; -C 192 ; WX 722 ; N Agrave ; B 9 0 689 923 ; -C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ; -C 215 ; WX 570 ; N multiply ; B 48 16 522 490 ; -C 250 ; WX 556 ; N uacute ; B 16 -14 537 713 ; -C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ; -C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; -C 255 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ; -C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ; -C 238 ; WX 278 ; N icircumflex ; B -37 0 300 704 ; -C 202 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ; -C 228 ; WX 500 ; N adieresis ; B 25 -14 488 667 ; -C 235 ; WX 444 ; N edieresis ; B 25 -14 426 667 ; -C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ; -C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ; -C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ; -C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ; -C 205 ; WX 389 ; N Iacute ; B 20 0 370 923 ; -C 177 ; WX 570 ; N plusminus ; B 33 0 537 506 ; -C 166 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; -C 174 ; WX 747 ; N registered ; B 26 -19 721 691 ; -C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ; -C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ; -C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; -C 200 ; WX 667 ; N Egrave ; B 16 0 641 923 ; -C -1 ; WX 444 ; N racute ; B 29 0 434 713 ; -C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ; -C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ; -C 142 ; WX 667 ; N Zcaron ; B 28 0 634 914 ; -C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; -C 208 ; WX 722 ; N Eth ; B 6 0 690 676 ; -C 199 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ; -C -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ; -C -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ; -C -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ; -C -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ; -C 193 ; WX 722 ; N Aacute ; B 9 0 689 923 ; -C 196 ; WX 722 ; N Adieresis ; B 9 0 689 877 ; -C 232 ; WX 444 ; N egrave ; B 25 -14 426 713 ; -C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ; -C -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ; -C 211 ; WX 778 ; N Oacute ; B 35 -19 743 923 ; -C 243 ; WX 500 ; N oacute ; B 25 -14 476 713 ; -C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ; -C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ; -C 239 ; WX 278 ; N idieresis ; B -37 0 300 667 ; -C 212 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ; -C 217 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ; -C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; -C 254 ; WX 556 ; N thorn ; B 19 -205 524 676 ; -C 178 ; WX 300 ; N twosuperior ; B 0 275 300 688 ; -C 214 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ; -C 181 ; WX 556 ; N mu ; B 33 -206 536 461 ; -C 236 ; WX 278 ; N igrave ; B -27 0 255 713 ; -C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ; -C -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ; -C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ; -C 190 ; WX 750 ; N threequarters ; B 23 -12 733 688 ; -C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ; -C -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ; -C -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ; -C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ; -C 153 ; WX 1000 ; N trademark ; B 24 271 977 676 ; -C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ; -C 204 ; WX 389 ; N Igrave ; B 20 0 370 923 ; -C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ; -C -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ; -C 189 ; WX 750 ; N onehalf ; B -7 -12 775 688 ; -C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; -C 244 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ; -C 241 ; WX 556 ; N ntilde ; B 21 0 539 674 ; -C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ; -C 201 ; WX 667 ; N Eacute ; B 16 0 641 923 ; -C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ; -C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ; -C 188 ; WX 750 ; N onequarter ; B 28 -12 743 688 ; -C 138 ; WX 556 ; N Scaron ; B 35 -19 513 914 ; -C -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ; -C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ; -C 176 ; WX 400 ; N degree ; B 57 402 343 688 ; -C 242 ; WX 500 ; N ograve ; B 25 -14 476 713 ; -C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ; -C 249 ; WX 556 ; N ugrave ; B 16 -14 537 713 ; -C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; -C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ; -C -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ; -C 209 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ; -C 245 ; WX 500 ; N otilde ; B 25 -14 476 674 ; -C -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ; -C -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ; -C 195 ; WX 722 ; N Atilde ; B 9 0 689 884 ; -C -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ; -C 197 ; WX 722 ; N Aring ; B 9 0 689 935 ; -C 213 ; WX 778 ; N Otilde ; B 35 -19 743 884 ; -C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ; -C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ; -C -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ; -C -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ; -C -1 ; WX 570 ; N minus ; B 33 209 537 297 ; -C 206 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ; -C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ; -C -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ; -C 172 ; WX 570 ; N logicalnot ; B 33 108 537 399 ; -C 246 ; WX 500 ; N odieresis ; B 25 -14 476 667 ; -C 252 ; WX 556 ; N udieresis ; B 16 -14 537 667 ; -C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; -C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ; -C 240 ; WX 500 ; N eth ; B 25 -14 476 691 ; -C 158 ; WX 444 ; N zcaron ; B 21 0 420 704 ; -C -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ; -C 185 ; WX 300 ; N onesuperior ; B 28 275 273 688 ; -C -1 ; WX 278 ; N imacron ; B -8 0 272 637 ; -C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -StartKernData -StartKernPairs 2242 -KPX A C -55 -KPX A Cacute -55 -KPX A Ccaron -55 -KPX A Ccedilla -55 -KPX A G -55 -KPX A Gbreve -55 -KPX A Gcommaaccent -55 -KPX A O -45 -KPX A Oacute -45 -KPX A Ocircumflex -45 -KPX A Odieresis -45 -KPX A Ograve -45 -KPX A Ohungarumlaut -45 -KPX A Omacron -45 -KPX A Oslash -45 -KPX A Otilde -45 -KPX A Q -45 -KPX A T -95 -KPX A Tcaron -95 -KPX A Tcommaaccent -95 -KPX A U -50 -KPX A Uacute -50 -KPX A Ucircumflex -50 -KPX A Udieresis -50 -KPX A Ugrave -50 -KPX A Uhungarumlaut -50 -KPX A Umacron -50 -KPX A Uogonek -50 -KPX A Uring -50 -KPX A V -145 -KPX A W -130 -KPX A Y -100 -KPX A Yacute -100 -KPX A Ydieresis -100 -KPX A p -25 -KPX A quoteright -74 -KPX A u -50 -KPX A uacute -50 -KPX A ucircumflex -50 -KPX A udieresis -50 -KPX A ugrave -50 -KPX A uhungarumlaut -50 -KPX A umacron -50 -KPX A uogonek -50 -KPX A uring -50 -KPX A v -100 -KPX A w -90 -KPX A y -74 -KPX A yacute -74 -KPX A ydieresis -74 -KPX Aacute C -55 -KPX Aacute Cacute -55 -KPX Aacute Ccaron -55 -KPX Aacute Ccedilla -55 -KPX Aacute G -55 -KPX Aacute Gbreve -55 -KPX Aacute Gcommaaccent -55 -KPX Aacute O -45 -KPX Aacute Oacute -45 -KPX Aacute Ocircumflex -45 -KPX Aacute Odieresis -45 -KPX Aacute Ograve -45 -KPX Aacute Ohungarumlaut -45 -KPX Aacute Omacron -45 -KPX Aacute Oslash -45 -KPX Aacute Otilde -45 -KPX Aacute Q -45 -KPX Aacute T -95 -KPX Aacute Tcaron -95 -KPX Aacute Tcommaaccent -95 -KPX Aacute U -50 -KPX Aacute Uacute -50 -KPX Aacute Ucircumflex -50 -KPX Aacute Udieresis -50 -KPX Aacute Ugrave -50 -KPX Aacute Uhungarumlaut -50 -KPX Aacute Umacron -50 -KPX Aacute Uogonek -50 -KPX Aacute Uring -50 -KPX Aacute V -145 -KPX Aacute W -130 -KPX Aacute Y -100 -KPX Aacute Yacute -100 -KPX Aacute Ydieresis -100 -KPX Aacute p -25 -KPX Aacute quoteright -74 -KPX Aacute u -50 -KPX Aacute uacute -50 -KPX Aacute ucircumflex -50 -KPX Aacute udieresis -50 -KPX Aacute ugrave -50 -KPX Aacute uhungarumlaut -50 -KPX Aacute umacron -50 -KPX Aacute uogonek -50 -KPX Aacute uring -50 -KPX Aacute v -100 -KPX Aacute w -90 -KPX Aacute y -74 -KPX Aacute yacute -74 -KPX Aacute ydieresis -74 -KPX Abreve C -55 -KPX Abreve Cacute -55 -KPX Abreve Ccaron -55 -KPX Abreve Ccedilla -55 -KPX Abreve G -55 -KPX Abreve Gbreve -55 -KPX Abreve Gcommaaccent -55 -KPX Abreve O -45 -KPX Abreve Oacute -45 -KPX Abreve Ocircumflex -45 -KPX Abreve Odieresis -45 -KPX Abreve Ograve -45 -KPX Abreve Ohungarumlaut -45 -KPX Abreve Omacron -45 -KPX Abreve Oslash -45 -KPX Abreve Otilde -45 -KPX Abreve Q -45 -KPX Abreve T -95 -KPX Abreve Tcaron -95 -KPX Abreve Tcommaaccent -95 -KPX Abreve U -50 -KPX Abreve Uacute -50 -KPX Abreve Ucircumflex -50 -KPX Abreve Udieresis -50 -KPX Abreve Ugrave -50 -KPX Abreve Uhungarumlaut -50 -KPX Abreve Umacron -50 -KPX Abreve Uogonek -50 -KPX Abreve Uring -50 -KPX Abreve V -145 -KPX Abreve W -130 -KPX Abreve Y -100 -KPX Abreve Yacute -100 -KPX Abreve Ydieresis -100 -KPX Abreve p -25 -KPX Abreve quoteright -74 -KPX Abreve u -50 -KPX Abreve uacute -50 -KPX Abreve ucircumflex -50 -KPX Abreve udieresis -50 -KPX Abreve ugrave -50 -KPX Abreve uhungarumlaut -50 -KPX Abreve umacron -50 -KPX Abreve uogonek -50 -KPX Abreve uring -50 -KPX Abreve v -100 -KPX Abreve w -90 -KPX Abreve y -74 -KPX Abreve yacute -74 -KPX Abreve ydieresis -74 -KPX Acircumflex C -55 -KPX Acircumflex Cacute -55 -KPX Acircumflex Ccaron -55 -KPX Acircumflex Ccedilla -55 -KPX Acircumflex G -55 -KPX Acircumflex Gbreve -55 -KPX Acircumflex Gcommaaccent -55 -KPX Acircumflex O -45 -KPX Acircumflex Oacute -45 -KPX Acircumflex Ocircumflex -45 -KPX Acircumflex Odieresis -45 -KPX Acircumflex Ograve -45 -KPX Acircumflex Ohungarumlaut -45 -KPX Acircumflex Omacron -45 -KPX Acircumflex Oslash -45 -KPX Acircumflex Otilde -45 -KPX Acircumflex Q -45 -KPX Acircumflex T -95 -KPX Acircumflex Tcaron -95 -KPX Acircumflex Tcommaaccent -95 -KPX Acircumflex U -50 -KPX Acircumflex Uacute -50 -KPX Acircumflex Ucircumflex -50 -KPX Acircumflex Udieresis -50 -KPX Acircumflex Ugrave -50 -KPX Acircumflex Uhungarumlaut -50 -KPX Acircumflex Umacron -50 -KPX Acircumflex Uogonek -50 -KPX Acircumflex Uring -50 -KPX Acircumflex V -145 -KPX Acircumflex W -130 -KPX Acircumflex Y -100 -KPX Acircumflex Yacute -100 -KPX Acircumflex Ydieresis -100 -KPX Acircumflex p -25 -KPX Acircumflex quoteright -74 -KPX Acircumflex u -50 -KPX Acircumflex uacute -50 -KPX Acircumflex ucircumflex -50 -KPX Acircumflex udieresis -50 -KPX Acircumflex ugrave -50 -KPX Acircumflex uhungarumlaut -50 -KPX Acircumflex umacron -50 -KPX Acircumflex uogonek -50 -KPX Acircumflex uring -50 -KPX Acircumflex v -100 -KPX Acircumflex w -90 -KPX Acircumflex y -74 -KPX Acircumflex yacute -74 -KPX Acircumflex ydieresis -74 -KPX Adieresis C -55 -KPX Adieresis Cacute -55 -KPX Adieresis Ccaron -55 -KPX Adieresis Ccedilla -55 -KPX Adieresis G -55 -KPX Adieresis Gbreve -55 -KPX Adieresis Gcommaaccent -55 -KPX Adieresis O -45 -KPX Adieresis Oacute -45 -KPX Adieresis Ocircumflex -45 -KPX Adieresis Odieresis -45 -KPX Adieresis Ograve -45 -KPX Adieresis Ohungarumlaut -45 -KPX Adieresis Omacron -45 -KPX Adieresis Oslash -45 -KPX Adieresis Otilde -45 -KPX Adieresis Q -45 -KPX Adieresis T -95 -KPX Adieresis Tcaron -95 -KPX Adieresis Tcommaaccent -95 -KPX Adieresis U -50 -KPX Adieresis Uacute -50 -KPX Adieresis Ucircumflex -50 -KPX Adieresis Udieresis -50 -KPX Adieresis Ugrave -50 -KPX Adieresis Uhungarumlaut -50 -KPX Adieresis Umacron -50 -KPX Adieresis Uogonek -50 -KPX Adieresis Uring -50 -KPX Adieresis V -145 -KPX Adieresis W -130 -KPX Adieresis Y -100 -KPX Adieresis Yacute -100 -KPX Adieresis Ydieresis -100 -KPX Adieresis p -25 -KPX Adieresis quoteright -74 -KPX Adieresis u -50 -KPX Adieresis uacute -50 -KPX Adieresis ucircumflex -50 -KPX Adieresis udieresis -50 -KPX Adieresis ugrave -50 -KPX Adieresis uhungarumlaut -50 -KPX Adieresis umacron -50 -KPX Adieresis uogonek -50 -KPX Adieresis uring -50 -KPX Adieresis v -100 -KPX Adieresis w -90 -KPX Adieresis y -74 -KPX Adieresis yacute -74 -KPX Adieresis ydieresis -74 -KPX Agrave C -55 -KPX Agrave Cacute -55 -KPX Agrave Ccaron -55 -KPX Agrave Ccedilla -55 -KPX Agrave G -55 -KPX Agrave Gbreve -55 -KPX Agrave Gcommaaccent -55 -KPX Agrave O -45 -KPX Agrave Oacute -45 -KPX Agrave Ocircumflex -45 -KPX Agrave Odieresis -45 -KPX Agrave Ograve -45 -KPX Agrave Ohungarumlaut -45 -KPX Agrave Omacron -45 -KPX Agrave Oslash -45 -KPX Agrave Otilde -45 -KPX Agrave Q -45 -KPX Agrave T -95 -KPX Agrave Tcaron -95 -KPX Agrave Tcommaaccent -95 -KPX Agrave U -50 -KPX Agrave Uacute -50 -KPX Agrave Ucircumflex -50 -KPX Agrave Udieresis -50 -KPX Agrave Ugrave -50 -KPX Agrave Uhungarumlaut -50 -KPX Agrave Umacron -50 -KPX Agrave Uogonek -50 -KPX Agrave Uring -50 -KPX Agrave V -145 -KPX Agrave W -130 -KPX Agrave Y -100 -KPX Agrave Yacute -100 -KPX Agrave Ydieresis -100 -KPX Agrave p -25 -KPX Agrave quoteright -74 -KPX Agrave u -50 -KPX Agrave uacute -50 -KPX Agrave ucircumflex -50 -KPX Agrave udieresis -50 -KPX Agrave ugrave -50 -KPX Agrave uhungarumlaut -50 -KPX Agrave umacron -50 -KPX Agrave uogonek -50 -KPX Agrave uring -50 -KPX Agrave v -100 -KPX Agrave w -90 -KPX Agrave y -74 -KPX Agrave yacute -74 -KPX Agrave ydieresis -74 -KPX Amacron C -55 -KPX Amacron Cacute -55 -KPX Amacron Ccaron -55 -KPX Amacron Ccedilla -55 -KPX Amacron G -55 -KPX Amacron Gbreve -55 -KPX Amacron Gcommaaccent -55 -KPX Amacron O -45 -KPX Amacron Oacute -45 -KPX Amacron Ocircumflex -45 -KPX Amacron Odieresis -45 -KPX Amacron Ograve -45 -KPX Amacron Ohungarumlaut -45 -KPX Amacron Omacron -45 -KPX Amacron Oslash -45 -KPX Amacron Otilde -45 -KPX Amacron Q -45 -KPX Amacron T -95 -KPX Amacron Tcaron -95 -KPX Amacron Tcommaaccent -95 -KPX Amacron U -50 -KPX Amacron Uacute -50 -KPX Amacron Ucircumflex -50 -KPX Amacron Udieresis -50 -KPX Amacron Ugrave -50 -KPX Amacron Uhungarumlaut -50 -KPX Amacron Umacron -50 -KPX Amacron Uogonek -50 -KPX Amacron Uring -50 -KPX Amacron V -145 -KPX Amacron W -130 -KPX Amacron Y -100 -KPX Amacron Yacute -100 -KPX Amacron Ydieresis -100 -KPX Amacron p -25 -KPX Amacron quoteright -74 -KPX Amacron u -50 -KPX Amacron uacute -50 -KPX Amacron ucircumflex -50 -KPX Amacron udieresis -50 -KPX Amacron ugrave -50 -KPX Amacron uhungarumlaut -50 -KPX Amacron umacron -50 -KPX Amacron uogonek -50 -KPX Amacron uring -50 -KPX Amacron v -100 -KPX Amacron w -90 -KPX Amacron y -74 -KPX Amacron yacute -74 -KPX Amacron ydieresis -74 -KPX Aogonek C -55 -KPX Aogonek Cacute -55 -KPX Aogonek Ccaron -55 -KPX Aogonek Ccedilla -55 -KPX Aogonek G -55 -KPX Aogonek Gbreve -55 -KPX Aogonek Gcommaaccent -55 -KPX Aogonek O -45 -KPX Aogonek Oacute -45 -KPX Aogonek Ocircumflex -45 -KPX Aogonek Odieresis -45 -KPX Aogonek Ograve -45 -KPX Aogonek Ohungarumlaut -45 -KPX Aogonek Omacron -45 -KPX Aogonek Oslash -45 -KPX Aogonek Otilde -45 -KPX Aogonek Q -45 -KPX Aogonek T -95 -KPX Aogonek Tcaron -95 -KPX Aogonek Tcommaaccent -95 -KPX Aogonek U -50 -KPX Aogonek Uacute -50 -KPX Aogonek Ucircumflex -50 -KPX Aogonek Udieresis -50 -KPX Aogonek Ugrave -50 -KPX Aogonek Uhungarumlaut -50 -KPX Aogonek Umacron -50 -KPX Aogonek Uogonek -50 -KPX Aogonek Uring -50 -KPX Aogonek V -145 -KPX Aogonek W -130 -KPX Aogonek Y -100 -KPX Aogonek Yacute -100 -KPX Aogonek Ydieresis -100 -KPX Aogonek p -25 -KPX Aogonek quoteright -74 -KPX Aogonek u -50 -KPX Aogonek uacute -50 -KPX Aogonek ucircumflex -50 -KPX Aogonek udieresis -50 -KPX Aogonek ugrave -50 -KPX Aogonek uhungarumlaut -50 -KPX Aogonek umacron -50 -KPX Aogonek uogonek -50 -KPX Aogonek uring -50 -KPX Aogonek v -100 -KPX Aogonek w -90 -KPX Aogonek y -34 -KPX Aogonek yacute -34 -KPX Aogonek ydieresis -34 -KPX Aring C -55 -KPX Aring Cacute -55 -KPX Aring Ccaron -55 -KPX Aring Ccedilla -55 -KPX Aring G -55 -KPX Aring Gbreve -55 -KPX Aring Gcommaaccent -55 -KPX Aring O -45 -KPX Aring Oacute -45 -KPX Aring Ocircumflex -45 -KPX Aring Odieresis -45 -KPX Aring Ograve -45 -KPX Aring Ohungarumlaut -45 -KPX Aring Omacron -45 -KPX Aring Oslash -45 -KPX Aring Otilde -45 -KPX Aring Q -45 -KPX Aring T -95 -KPX Aring Tcaron -95 -KPX Aring Tcommaaccent -95 -KPX Aring U -50 -KPX Aring Uacute -50 -KPX Aring Ucircumflex -50 -KPX Aring Udieresis -50 -KPX Aring Ugrave -50 -KPX Aring Uhungarumlaut -50 -KPX Aring Umacron -50 -KPX Aring Uogonek -50 -KPX Aring Uring -50 -KPX Aring V -145 -KPX Aring W -130 -KPX Aring Y -100 -KPX Aring Yacute -100 -KPX Aring Ydieresis -100 -KPX Aring p -25 -KPX Aring quoteright -74 -KPX Aring u -50 -KPX Aring uacute -50 -KPX Aring ucircumflex -50 -KPX Aring udieresis -50 -KPX Aring ugrave -50 -KPX Aring uhungarumlaut -50 -KPX Aring umacron -50 -KPX Aring uogonek -50 -KPX Aring uring -50 -KPX Aring v -100 -KPX Aring w -90 -KPX Aring y -74 -KPX Aring yacute -74 -KPX Aring ydieresis -74 -KPX Atilde C -55 -KPX Atilde Cacute -55 -KPX Atilde Ccaron -55 -KPX Atilde Ccedilla -55 -KPX Atilde G -55 -KPX Atilde Gbreve -55 -KPX Atilde Gcommaaccent -55 -KPX Atilde O -45 -KPX Atilde Oacute -45 -KPX Atilde Ocircumflex -45 -KPX Atilde Odieresis -45 -KPX Atilde Ograve -45 -KPX Atilde Ohungarumlaut -45 -KPX Atilde Omacron -45 -KPX Atilde Oslash -45 -KPX Atilde Otilde -45 -KPX Atilde Q -45 -KPX Atilde T -95 -KPX Atilde Tcaron -95 -KPX Atilde Tcommaaccent -95 -KPX Atilde U -50 -KPX Atilde Uacute -50 -KPX Atilde Ucircumflex -50 -KPX Atilde Udieresis -50 -KPX Atilde Ugrave -50 -KPX Atilde Uhungarumlaut -50 -KPX Atilde Umacron -50 -KPX Atilde Uogonek -50 -KPX Atilde Uring -50 -KPX Atilde V -145 -KPX Atilde W -130 -KPX Atilde Y -100 -KPX Atilde Yacute -100 -KPX Atilde Ydieresis -100 -KPX Atilde p -25 -KPX Atilde quoteright -74 -KPX Atilde u -50 -KPX Atilde uacute -50 -KPX Atilde ucircumflex -50 -KPX Atilde udieresis -50 -KPX Atilde ugrave -50 -KPX Atilde uhungarumlaut -50 -KPX Atilde umacron -50 -KPX Atilde uogonek -50 -KPX Atilde uring -50 -KPX Atilde v -100 -KPX Atilde w -90 -KPX Atilde y -74 -KPX Atilde yacute -74 -KPX Atilde ydieresis -74 -KPX B A -30 -KPX B Aacute -30 -KPX B Abreve -30 -KPX B Acircumflex -30 -KPX B Adieresis -30 -KPX B Agrave -30 -KPX B Amacron -30 -KPX B Aogonek -30 -KPX B Aring -30 -KPX B Atilde -30 -KPX B U -10 -KPX B Uacute -10 -KPX B Ucircumflex -10 -KPX B Udieresis -10 -KPX B Ugrave -10 -KPX B Uhungarumlaut -10 -KPX B Umacron -10 -KPX B Uogonek -10 -KPX B Uring -10 -KPX D A -35 -KPX D Aacute -35 -KPX D Abreve -35 -KPX D Acircumflex -35 -KPX D Adieresis -35 -KPX D Agrave -35 -KPX D Amacron -35 -KPX D Aogonek -35 -KPX D Aring -35 -KPX D Atilde -35 -KPX D V -40 -KPX D W -40 -KPX D Y -40 -KPX D Yacute -40 -KPX D Ydieresis -40 -KPX D period -20 -KPX Dcaron A -35 -KPX Dcaron Aacute -35 -KPX Dcaron Abreve -35 -KPX Dcaron Acircumflex -35 -KPX Dcaron Adieresis -35 -KPX Dcaron Agrave -35 -KPX Dcaron Amacron -35 -KPX Dcaron Aogonek -35 -KPX Dcaron Aring -35 -KPX Dcaron Atilde -35 -KPX Dcaron V -40 -KPX Dcaron W -40 -KPX Dcaron Y -40 -KPX Dcaron Yacute -40 -KPX Dcaron Ydieresis -40 -KPX Dcaron period -20 -KPX Dcroat A -35 -KPX Dcroat Aacute -35 -KPX Dcroat Abreve -35 -KPX Dcroat Acircumflex -35 -KPX Dcroat Adieresis -35 -KPX Dcroat Agrave -35 -KPX Dcroat Amacron -35 -KPX Dcroat Aogonek -35 -KPX Dcroat Aring -35 -KPX Dcroat Atilde -35 -KPX Dcroat V -40 -KPX Dcroat W -40 -KPX Dcroat Y -40 -KPX Dcroat Yacute -40 -KPX Dcroat Ydieresis -40 -KPX Dcroat period -20 -KPX F A -90 -KPX F Aacute -90 -KPX F Abreve -90 -KPX F Acircumflex -90 -KPX F Adieresis -90 -KPX F Agrave -90 -KPX F Amacron -90 -KPX F Aogonek -90 -KPX F Aring -90 -KPX F Atilde -90 -KPX F a -25 -KPX F aacute -25 -KPX F abreve -25 -KPX F acircumflex -25 -KPX F adieresis -25 -KPX F agrave -25 -KPX F amacron -25 -KPX F aogonek -25 -KPX F aring -25 -KPX F atilde -25 -KPX F comma -92 -KPX F e -25 -KPX F eacute -25 -KPX F ecaron -25 -KPX F ecircumflex -25 -KPX F edieresis -25 -KPX F edotaccent -25 -KPX F egrave -25 -KPX F emacron -25 -KPX F eogonek -25 -KPX F o -25 -KPX F oacute -25 -KPX F ocircumflex -25 -KPX F odieresis -25 -KPX F ograve -25 -KPX F ohungarumlaut -25 -KPX F omacron -25 -KPX F oslash -25 -KPX F otilde -25 -KPX F period -110 -KPX J A -30 -KPX J Aacute -30 -KPX J Abreve -30 -KPX J Acircumflex -30 -KPX J Adieresis -30 -KPX J Agrave -30 -KPX J Amacron -30 -KPX J Aogonek -30 -KPX J Aring -30 -KPX J Atilde -30 -KPX J a -15 -KPX J aacute -15 -KPX J abreve -15 -KPX J acircumflex -15 -KPX J adieresis -15 -KPX J agrave -15 -KPX J amacron -15 -KPX J aogonek -15 -KPX J aring -15 -KPX J atilde -15 -KPX J e -15 -KPX J eacute -15 -KPX J ecaron -15 -KPX J ecircumflex -15 -KPX J edieresis -15 -KPX J edotaccent -15 -KPX J egrave -15 -KPX J emacron -15 -KPX J eogonek -15 -KPX J o -15 -KPX J oacute -15 -KPX J ocircumflex -15 -KPX J odieresis -15 -KPX J ograve -15 -KPX J ohungarumlaut -15 -KPX J omacron -15 -KPX J oslash -15 -KPX J otilde -15 -KPX J period -20 -KPX J u -15 -KPX J uacute -15 -KPX J ucircumflex -15 -KPX J udieresis -15 -KPX J ugrave -15 -KPX J uhungarumlaut -15 -KPX J umacron -15 -KPX J uogonek -15 -KPX J uring -15 -KPX K O -30 -KPX K Oacute -30 -KPX K Ocircumflex -30 -KPX K Odieresis -30 -KPX K Ograve -30 -KPX K Ohungarumlaut -30 -KPX K Omacron -30 -KPX K Oslash -30 -KPX K Otilde -30 -KPX K e -25 -KPX K eacute -25 -KPX K ecaron -25 -KPX K ecircumflex -25 -KPX K edieresis -25 -KPX K edotaccent -25 -KPX K egrave -25 -KPX K emacron -25 -KPX K eogonek -25 -KPX K o -25 -KPX K oacute -25 -KPX K ocircumflex -25 -KPX K odieresis -25 -KPX K ograve -25 -KPX K ohungarumlaut -25 -KPX K omacron -25 -KPX K oslash -25 -KPX K otilde -25 -KPX K u -15 -KPX K uacute -15 -KPX K ucircumflex -15 -KPX K udieresis -15 -KPX K ugrave -15 -KPX K uhungarumlaut -15 -KPX K umacron -15 -KPX K uogonek -15 -KPX K uring -15 -KPX K y -45 -KPX K yacute -45 -KPX K ydieresis -45 -KPX Kcommaaccent O -30 -KPX Kcommaaccent Oacute -30 -KPX Kcommaaccent Ocircumflex -30 -KPX Kcommaaccent Odieresis -30 -KPX Kcommaaccent Ograve -30 -KPX Kcommaaccent Ohungarumlaut -30 -KPX Kcommaaccent Omacron -30 -KPX Kcommaaccent Oslash -30 -KPX Kcommaaccent Otilde -30 -KPX Kcommaaccent e -25 -KPX Kcommaaccent eacute -25 -KPX Kcommaaccent ecaron -25 -KPX Kcommaaccent ecircumflex -25 -KPX Kcommaaccent edieresis -25 -KPX Kcommaaccent edotaccent -25 -KPX Kcommaaccent egrave -25 -KPX Kcommaaccent emacron -25 -KPX Kcommaaccent eogonek -25 -KPX Kcommaaccent o -25 -KPX Kcommaaccent oacute -25 -KPX Kcommaaccent ocircumflex -25 -KPX Kcommaaccent odieresis -25 -KPX Kcommaaccent ograve -25 -KPX Kcommaaccent ohungarumlaut -25 -KPX Kcommaaccent omacron -25 -KPX Kcommaaccent oslash -25 -KPX Kcommaaccent otilde -25 -KPX Kcommaaccent u -15 -KPX Kcommaaccent uacute -15 -KPX Kcommaaccent ucircumflex -15 -KPX Kcommaaccent udieresis -15 -KPX Kcommaaccent ugrave -15 -KPX Kcommaaccent uhungarumlaut -15 -KPX Kcommaaccent umacron -15 -KPX Kcommaaccent uogonek -15 -KPX Kcommaaccent uring -15 -KPX Kcommaaccent y -45 -KPX Kcommaaccent yacute -45 -KPX Kcommaaccent ydieresis -45 -KPX L T -92 -KPX L Tcaron -92 -KPX L Tcommaaccent -92 -KPX L V -92 -KPX L W -92 -KPX L Y -92 -KPX L Yacute -92 -KPX L Ydieresis -92 -KPX L quotedblright -20 -KPX L quoteright -110 -KPX L y -55 -KPX L yacute -55 -KPX L ydieresis -55 -KPX Lacute T -92 -KPX Lacute Tcaron -92 -KPX Lacute Tcommaaccent -92 -KPX Lacute V -92 -KPX Lacute W -92 -KPX Lacute Y -92 -KPX Lacute Yacute -92 -KPX Lacute Ydieresis -92 -KPX Lacute quotedblright -20 -KPX Lacute quoteright -110 -KPX Lacute y -55 -KPX Lacute yacute -55 -KPX Lacute ydieresis -55 -KPX Lcommaaccent T -92 -KPX Lcommaaccent Tcaron -92 -KPX Lcommaaccent Tcommaaccent -92 -KPX Lcommaaccent V -92 -KPX Lcommaaccent W -92 -KPX Lcommaaccent Y -92 -KPX Lcommaaccent Yacute -92 -KPX Lcommaaccent Ydieresis -92 -KPX Lcommaaccent quotedblright -20 -KPX Lcommaaccent quoteright -110 -KPX Lcommaaccent y -55 -KPX Lcommaaccent yacute -55 -KPX Lcommaaccent ydieresis -55 -KPX Lslash T -92 -KPX Lslash Tcaron -92 -KPX Lslash Tcommaaccent -92 -KPX Lslash V -92 -KPX Lslash W -92 -KPX Lslash Y -92 -KPX Lslash Yacute -92 -KPX Lslash Ydieresis -92 -KPX Lslash quotedblright -20 -KPX Lslash quoteright -110 -KPX Lslash y -55 -KPX Lslash yacute -55 -KPX Lslash ydieresis -55 -KPX N A -20 -KPX N Aacute -20 -KPX N Abreve -20 -KPX N Acircumflex -20 -KPX N Adieresis -20 -KPX N Agrave -20 -KPX N Amacron -20 -KPX N Aogonek -20 -KPX N Aring -20 -KPX N Atilde -20 -KPX Nacute A -20 -KPX Nacute Aacute -20 -KPX Nacute Abreve -20 -KPX Nacute Acircumflex -20 -KPX Nacute Adieresis -20 -KPX Nacute Agrave -20 -KPX Nacute Amacron -20 -KPX Nacute Aogonek -20 -KPX Nacute Aring -20 -KPX Nacute Atilde -20 -KPX Ncaron A -20 -KPX Ncaron Aacute -20 -KPX Ncaron Abreve -20 -KPX Ncaron Acircumflex -20 -KPX Ncaron Adieresis -20 -KPX Ncaron Agrave -20 -KPX Ncaron Amacron -20 -KPX Ncaron Aogonek -20 -KPX Ncaron Aring -20 -KPX Ncaron Atilde -20 -KPX Ncommaaccent A -20 -KPX Ncommaaccent Aacute -20 -KPX Ncommaaccent Abreve -20 -KPX Ncommaaccent Acircumflex -20 -KPX Ncommaaccent Adieresis -20 -KPX Ncommaaccent Agrave -20 -KPX Ncommaaccent Amacron -20 -KPX Ncommaaccent Aogonek -20 -KPX Ncommaaccent Aring -20 -KPX Ncommaaccent Atilde -20 -KPX Ntilde A -20 -KPX Ntilde Aacute -20 -KPX Ntilde Abreve -20 -KPX Ntilde Acircumflex -20 -KPX Ntilde Adieresis -20 -KPX Ntilde Agrave -20 -KPX Ntilde Amacron -20 -KPX Ntilde Aogonek -20 -KPX Ntilde Aring -20 -KPX Ntilde Atilde -20 -KPX O A -40 -KPX O Aacute -40 -KPX O Abreve -40 -KPX O Acircumflex -40 -KPX O Adieresis -40 -KPX O Agrave -40 -KPX O Amacron -40 -KPX O Aogonek -40 -KPX O Aring -40 -KPX O Atilde -40 -KPX O T -40 -KPX O Tcaron -40 -KPX O Tcommaaccent -40 -KPX O V -50 -KPX O W -50 -KPX O X -40 -KPX O Y -50 -KPX O Yacute -50 -KPX O Ydieresis -50 -KPX Oacute A -40 -KPX Oacute Aacute -40 -KPX Oacute Abreve -40 -KPX Oacute Acircumflex -40 -KPX Oacute Adieresis -40 -KPX Oacute Agrave -40 -KPX Oacute Amacron -40 -KPX Oacute Aogonek -40 -KPX Oacute Aring -40 -KPX Oacute Atilde -40 -KPX Oacute T -40 -KPX Oacute Tcaron -40 -KPX Oacute Tcommaaccent -40 -KPX Oacute V -50 -KPX Oacute W -50 -KPX Oacute X -40 -KPX Oacute Y -50 -KPX Oacute Yacute -50 -KPX Oacute Ydieresis -50 -KPX Ocircumflex A -40 -KPX Ocircumflex Aacute -40 -KPX Ocircumflex Abreve -40 -KPX Ocircumflex Acircumflex -40 -KPX Ocircumflex Adieresis -40 -KPX Ocircumflex Agrave -40 -KPX Ocircumflex Amacron -40 -KPX Ocircumflex Aogonek -40 -KPX Ocircumflex Aring -40 -KPX Ocircumflex Atilde -40 -KPX Ocircumflex T -40 -KPX Ocircumflex Tcaron -40 -KPX Ocircumflex Tcommaaccent -40 -KPX Ocircumflex V -50 -KPX Ocircumflex W -50 -KPX Ocircumflex X -40 -KPX Ocircumflex Y -50 -KPX Ocircumflex Yacute -50 -KPX Ocircumflex Ydieresis -50 -KPX Odieresis A -40 -KPX Odieresis Aacute -40 -KPX Odieresis Abreve -40 -KPX Odieresis Acircumflex -40 -KPX Odieresis Adieresis -40 -KPX Odieresis Agrave -40 -KPX Odieresis Amacron -40 -KPX Odieresis Aogonek -40 -KPX Odieresis Aring -40 -KPX Odieresis Atilde -40 -KPX Odieresis T -40 -KPX Odieresis Tcaron -40 -KPX Odieresis Tcommaaccent -40 -KPX Odieresis V -50 -KPX Odieresis W -50 -KPX Odieresis X -40 -KPX Odieresis Y -50 -KPX Odieresis Yacute -50 -KPX Odieresis Ydieresis -50 -KPX Ograve A -40 -KPX Ograve Aacute -40 -KPX Ograve Abreve -40 -KPX Ograve Acircumflex -40 -KPX Ograve Adieresis -40 -KPX Ograve Agrave -40 -KPX Ograve Amacron -40 -KPX Ograve Aogonek -40 -KPX Ograve Aring -40 -KPX Ograve Atilde -40 -KPX Ograve T -40 -KPX Ograve Tcaron -40 -KPX Ograve Tcommaaccent -40 -KPX Ograve V -50 -KPX Ograve W -50 -KPX Ograve X -40 -KPX Ograve Y -50 -KPX Ograve Yacute -50 -KPX Ograve Ydieresis -50 -KPX Ohungarumlaut A -40 -KPX Ohungarumlaut Aacute -40 -KPX Ohungarumlaut Abreve -40 -KPX Ohungarumlaut Acircumflex -40 -KPX Ohungarumlaut Adieresis -40 -KPX Ohungarumlaut Agrave -40 -KPX Ohungarumlaut Amacron -40 -KPX Ohungarumlaut Aogonek -40 -KPX Ohungarumlaut Aring -40 -KPX Ohungarumlaut Atilde -40 -KPX Ohungarumlaut T -40 -KPX Ohungarumlaut Tcaron -40 -KPX Ohungarumlaut Tcommaaccent -40 -KPX Ohungarumlaut V -50 -KPX Ohungarumlaut W -50 -KPX Ohungarumlaut X -40 -KPX Ohungarumlaut Y -50 -KPX Ohungarumlaut Yacute -50 -KPX Ohungarumlaut Ydieresis -50 -KPX Omacron A -40 -KPX Omacron Aacute -40 -KPX Omacron Abreve -40 -KPX Omacron Acircumflex -40 -KPX Omacron Adieresis -40 -KPX Omacron Agrave -40 -KPX Omacron Amacron -40 -KPX Omacron Aogonek -40 -KPX Omacron Aring -40 -KPX Omacron Atilde -40 -KPX Omacron T -40 -KPX Omacron Tcaron -40 -KPX Omacron Tcommaaccent -40 -KPX Omacron V -50 -KPX Omacron W -50 -KPX Omacron X -40 -KPX Omacron Y -50 -KPX Omacron Yacute -50 -KPX Omacron Ydieresis -50 -KPX Oslash A -40 -KPX Oslash Aacute -40 -KPX Oslash Abreve -40 -KPX Oslash Acircumflex -40 -KPX Oslash Adieresis -40 -KPX Oslash Agrave -40 -KPX Oslash Amacron -40 -KPX Oslash Aogonek -40 -KPX Oslash Aring -40 -KPX Oslash Atilde -40 -KPX Oslash T -40 -KPX Oslash Tcaron -40 -KPX Oslash Tcommaaccent -40 -KPX Oslash V -50 -KPX Oslash W -50 -KPX Oslash X -40 -KPX Oslash Y -50 -KPX Oslash Yacute -50 -KPX Oslash Ydieresis -50 -KPX Otilde A -40 -KPX Otilde Aacute -40 -KPX Otilde Abreve -40 -KPX Otilde Acircumflex -40 -KPX Otilde Adieresis -40 -KPX Otilde Agrave -40 -KPX Otilde Amacron -40 -KPX Otilde Aogonek -40 -KPX Otilde Aring -40 -KPX Otilde Atilde -40 -KPX Otilde T -40 -KPX Otilde Tcaron -40 -KPX Otilde Tcommaaccent -40 -KPX Otilde V -50 -KPX Otilde W -50 -KPX Otilde X -40 -KPX Otilde Y -50 -KPX Otilde Yacute -50 -KPX Otilde Ydieresis -50 -KPX P A -74 -KPX P Aacute -74 -KPX P Abreve -74 -KPX P Acircumflex -74 -KPX P Adieresis -74 -KPX P Agrave -74 -KPX P Amacron -74 -KPX P Aogonek -74 -KPX P Aring -74 -KPX P Atilde -74 -KPX P a -10 -KPX P aacute -10 -KPX P abreve -10 -KPX P acircumflex -10 -KPX P adieresis -10 -KPX P agrave -10 -KPX P amacron -10 -KPX P aogonek -10 -KPX P aring -10 -KPX P atilde -10 -KPX P comma -92 -KPX P e -20 -KPX P eacute -20 -KPX P ecaron -20 -KPX P ecircumflex -20 -KPX P edieresis -20 -KPX P edotaccent -20 -KPX P egrave -20 -KPX P emacron -20 -KPX P eogonek -20 -KPX P o -20 -KPX P oacute -20 -KPX P ocircumflex -20 -KPX P odieresis -20 -KPX P ograve -20 -KPX P ohungarumlaut -20 -KPX P omacron -20 -KPX P oslash -20 -KPX P otilde -20 -KPX P period -110 -KPX Q U -10 -KPX Q Uacute -10 -KPX Q Ucircumflex -10 -KPX Q Udieresis -10 -KPX Q Ugrave -10 -KPX Q Uhungarumlaut -10 -KPX Q Umacron -10 -KPX Q Uogonek -10 -KPX Q Uring -10 -KPX Q period -20 -KPX R O -30 -KPX R Oacute -30 -KPX R Ocircumflex -30 -KPX R Odieresis -30 -KPX R Ograve -30 -KPX R Ohungarumlaut -30 -KPX R Omacron -30 -KPX R Oslash -30 -KPX R Otilde -30 -KPX R T -40 -KPX R Tcaron -40 -KPX R Tcommaaccent -40 -KPX R U -30 -KPX R Uacute -30 -KPX R Ucircumflex -30 -KPX R Udieresis -30 -KPX R Ugrave -30 -KPX R Uhungarumlaut -30 -KPX R Umacron -30 -KPX R Uogonek -30 -KPX R Uring -30 -KPX R V -55 -KPX R W -35 -KPX R Y -35 -KPX R Yacute -35 -KPX R Ydieresis -35 -KPX Racute O -30 -KPX Racute Oacute -30 -KPX Racute Ocircumflex -30 -KPX Racute Odieresis -30 -KPX Racute Ograve -30 -KPX Racute Ohungarumlaut -30 -KPX Racute Omacron -30 -KPX Racute Oslash -30 -KPX Racute Otilde -30 -KPX Racute T -40 -KPX Racute Tcaron -40 -KPX Racute Tcommaaccent -40 -KPX Racute U -30 -KPX Racute Uacute -30 -KPX Racute Ucircumflex -30 -KPX Racute Udieresis -30 -KPX Racute Ugrave -30 -KPX Racute Uhungarumlaut -30 -KPX Racute Umacron -30 -KPX Racute Uogonek -30 -KPX Racute Uring -30 -KPX Racute V -55 -KPX Racute W -35 -KPX Racute Y -35 -KPX Racute Yacute -35 -KPX Racute Ydieresis -35 -KPX Rcaron O -30 -KPX Rcaron Oacute -30 -KPX Rcaron Ocircumflex -30 -KPX Rcaron Odieresis -30 -KPX Rcaron Ograve -30 -KPX Rcaron Ohungarumlaut -30 -KPX Rcaron Omacron -30 -KPX Rcaron Oslash -30 -KPX Rcaron Otilde -30 -KPX Rcaron T -40 -KPX Rcaron Tcaron -40 -KPX Rcaron Tcommaaccent -40 -KPX Rcaron U -30 -KPX Rcaron Uacute -30 -KPX Rcaron Ucircumflex -30 -KPX Rcaron Udieresis -30 -KPX Rcaron Ugrave -30 -KPX Rcaron Uhungarumlaut -30 -KPX Rcaron Umacron -30 -KPX Rcaron Uogonek -30 -KPX Rcaron Uring -30 -KPX Rcaron V -55 -KPX Rcaron W -35 -KPX Rcaron Y -35 -KPX Rcaron Yacute -35 -KPX Rcaron Ydieresis -35 -KPX Rcommaaccent O -30 -KPX Rcommaaccent Oacute -30 -KPX Rcommaaccent Ocircumflex -30 -KPX Rcommaaccent Odieresis -30 -KPX Rcommaaccent Ograve -30 -KPX Rcommaaccent Ohungarumlaut -30 -KPX Rcommaaccent Omacron -30 -KPX Rcommaaccent Oslash -30 -KPX Rcommaaccent Otilde -30 -KPX Rcommaaccent T -40 -KPX Rcommaaccent Tcaron -40 -KPX Rcommaaccent Tcommaaccent -40 -KPX Rcommaaccent U -30 -KPX Rcommaaccent Uacute -30 -KPX Rcommaaccent Ucircumflex -30 -KPX Rcommaaccent Udieresis -30 -KPX Rcommaaccent Ugrave -30 -KPX Rcommaaccent Uhungarumlaut -30 -KPX Rcommaaccent Umacron -30 -KPX Rcommaaccent Uogonek -30 -KPX Rcommaaccent Uring -30 -KPX Rcommaaccent V -55 -KPX Rcommaaccent W -35 -KPX Rcommaaccent Y -35 -KPX Rcommaaccent Yacute -35 -KPX Rcommaaccent Ydieresis -35 -KPX T A -90 -KPX T Aacute -90 -KPX T Abreve -90 -KPX T Acircumflex -90 -KPX T Adieresis -90 -KPX T Agrave -90 -KPX T Amacron -90 -KPX T Aogonek -90 -KPX T Aring -90 -KPX T Atilde -90 -KPX T O -18 -KPX T Oacute -18 -KPX T Ocircumflex -18 -KPX T Odieresis -18 -KPX T Ograve -18 -KPX T Ohungarumlaut -18 -KPX T Omacron -18 -KPX T Oslash -18 -KPX T Otilde -18 -KPX T a -92 -KPX T aacute -92 -KPX T abreve -52 -KPX T acircumflex -52 -KPX T adieresis -52 -KPX T agrave -52 -KPX T amacron -52 -KPX T aogonek -92 -KPX T aring -92 -KPX T atilde -52 -KPX T colon -74 -KPX T comma -74 -KPX T e -92 -KPX T eacute -92 -KPX T ecaron -92 -KPX T ecircumflex -92 -KPX T edieresis -52 -KPX T edotaccent -92 -KPX T egrave -52 -KPX T emacron -52 -KPX T eogonek -92 -KPX T hyphen -92 -KPX T i -18 -KPX T iacute -18 -KPX T iogonek -18 -KPX T o -92 -KPX T oacute -92 -KPX T ocircumflex -92 -KPX T odieresis -92 -KPX T ograve -92 -KPX T ohungarumlaut -92 -KPX T omacron -92 -KPX T oslash -92 -KPX T otilde -92 -KPX T period -90 -KPX T r -74 -KPX T racute -74 -KPX T rcaron -74 -KPX T rcommaaccent -74 -KPX T semicolon -74 -KPX T u -92 -KPX T uacute -92 -KPX T ucircumflex -92 -KPX T udieresis -92 -KPX T ugrave -92 -KPX T uhungarumlaut -92 -KPX T umacron -92 -KPX T uogonek -92 -KPX T uring -92 -KPX T w -74 -KPX T y -34 -KPX T yacute -34 -KPX T ydieresis -34 -KPX Tcaron A -90 -KPX Tcaron Aacute -90 -KPX Tcaron Abreve -90 -KPX Tcaron Acircumflex -90 -KPX Tcaron Adieresis -90 -KPX Tcaron Agrave -90 -KPX Tcaron Amacron -90 -KPX Tcaron Aogonek -90 -KPX Tcaron Aring -90 -KPX Tcaron Atilde -90 -KPX Tcaron O -18 -KPX Tcaron Oacute -18 -KPX Tcaron Ocircumflex -18 -KPX Tcaron Odieresis -18 -KPX Tcaron Ograve -18 -KPX Tcaron Ohungarumlaut -18 -KPX Tcaron Omacron -18 -KPX Tcaron Oslash -18 -KPX Tcaron Otilde -18 -KPX Tcaron a -92 -KPX Tcaron aacute -92 -KPX Tcaron abreve -52 -KPX Tcaron acircumflex -52 -KPX Tcaron adieresis -52 -KPX Tcaron agrave -52 -KPX Tcaron amacron -52 -KPX Tcaron aogonek -92 -KPX Tcaron aring -92 -KPX Tcaron atilde -52 -KPX Tcaron colon -74 -KPX Tcaron comma -74 -KPX Tcaron e -92 -KPX Tcaron eacute -92 -KPX Tcaron ecaron -92 -KPX Tcaron ecircumflex -92 -KPX Tcaron edieresis -52 -KPX Tcaron edotaccent -92 -KPX Tcaron egrave -52 -KPX Tcaron emacron -52 -KPX Tcaron eogonek -92 -KPX Tcaron hyphen -92 -KPX Tcaron i -18 -KPX Tcaron iacute -18 -KPX Tcaron iogonek -18 -KPX Tcaron o -92 -KPX Tcaron oacute -92 -KPX Tcaron ocircumflex -92 -KPX Tcaron odieresis -92 -KPX Tcaron ograve -92 -KPX Tcaron ohungarumlaut -92 -KPX Tcaron omacron -92 -KPX Tcaron oslash -92 -KPX Tcaron otilde -92 -KPX Tcaron period -90 -KPX Tcaron r -74 -KPX Tcaron racute -74 -KPX Tcaron rcaron -74 -KPX Tcaron rcommaaccent -74 -KPX Tcaron semicolon -74 -KPX Tcaron u -92 -KPX Tcaron uacute -92 -KPX Tcaron ucircumflex -92 -KPX Tcaron udieresis -92 -KPX Tcaron ugrave -92 -KPX Tcaron uhungarumlaut -92 -KPX Tcaron umacron -92 -KPX Tcaron uogonek -92 -KPX Tcaron uring -92 -KPX Tcaron w -74 -KPX Tcaron y -34 -KPX Tcaron yacute -34 -KPX Tcaron ydieresis -34 -KPX Tcommaaccent A -90 -KPX Tcommaaccent Aacute -90 -KPX Tcommaaccent Abreve -90 -KPX Tcommaaccent Acircumflex -90 -KPX Tcommaaccent Adieresis -90 -KPX Tcommaaccent Agrave -90 -KPX Tcommaaccent Amacron -90 -KPX Tcommaaccent Aogonek -90 -KPX Tcommaaccent Aring -90 -KPX Tcommaaccent Atilde -90 -KPX Tcommaaccent O -18 -KPX Tcommaaccent Oacute -18 -KPX Tcommaaccent Ocircumflex -18 -KPX Tcommaaccent Odieresis -18 -KPX Tcommaaccent Ograve -18 -KPX Tcommaaccent Ohungarumlaut -18 -KPX Tcommaaccent Omacron -18 -KPX Tcommaaccent Oslash -18 -KPX Tcommaaccent Otilde -18 -KPX Tcommaaccent a -92 -KPX Tcommaaccent aacute -92 -KPX Tcommaaccent abreve -52 -KPX Tcommaaccent acircumflex -52 -KPX Tcommaaccent adieresis -52 -KPX Tcommaaccent agrave -52 -KPX Tcommaaccent amacron -52 -KPX Tcommaaccent aogonek -92 -KPX Tcommaaccent aring -92 -KPX Tcommaaccent atilde -52 -KPX Tcommaaccent colon -74 -KPX Tcommaaccent comma -74 -KPX Tcommaaccent e -92 -KPX Tcommaaccent eacute -92 -KPX Tcommaaccent ecaron -92 -KPX Tcommaaccent ecircumflex -92 -KPX Tcommaaccent edieresis -52 -KPX Tcommaaccent edotaccent -92 -KPX Tcommaaccent egrave -52 -KPX Tcommaaccent emacron -52 -KPX Tcommaaccent eogonek -92 -KPX Tcommaaccent hyphen -92 -KPX Tcommaaccent i -18 -KPX Tcommaaccent iacute -18 -KPX Tcommaaccent iogonek -18 -KPX Tcommaaccent o -92 -KPX Tcommaaccent oacute -92 -KPX Tcommaaccent ocircumflex -92 -KPX Tcommaaccent odieresis -92 -KPX Tcommaaccent ograve -92 -KPX Tcommaaccent ohungarumlaut -92 -KPX Tcommaaccent omacron -92 -KPX Tcommaaccent oslash -92 -KPX Tcommaaccent otilde -92 -KPX Tcommaaccent period -90 -KPX Tcommaaccent r -74 -KPX Tcommaaccent racute -74 -KPX Tcommaaccent rcaron -74 -KPX Tcommaaccent rcommaaccent -74 -KPX Tcommaaccent semicolon -74 -KPX Tcommaaccent u -92 -KPX Tcommaaccent uacute -92 -KPX Tcommaaccent ucircumflex -92 -KPX Tcommaaccent udieresis -92 -KPX Tcommaaccent ugrave -92 -KPX Tcommaaccent uhungarumlaut -92 -KPX Tcommaaccent umacron -92 -KPX Tcommaaccent uogonek -92 -KPX Tcommaaccent uring -92 -KPX Tcommaaccent w -74 -KPX Tcommaaccent y -34 -KPX Tcommaaccent yacute -34 -KPX Tcommaaccent ydieresis -34 -KPX U A -60 -KPX U Aacute -60 -KPX U Abreve -60 -KPX U Acircumflex -60 -KPX U Adieresis -60 -KPX U Agrave -60 -KPX U Amacron -60 -KPX U Aogonek -60 -KPX U Aring -60 -KPX U Atilde -60 -KPX U comma -50 -KPX U period -50 -KPX Uacute A -60 -KPX Uacute Aacute -60 -KPX Uacute Abreve -60 -KPX Uacute Acircumflex -60 -KPX Uacute Adieresis -60 -KPX Uacute Agrave -60 -KPX Uacute Amacron -60 -KPX Uacute Aogonek -60 -KPX Uacute Aring -60 -KPX Uacute Atilde -60 -KPX Uacute comma -50 -KPX Uacute period -50 -KPX Ucircumflex A -60 -KPX Ucircumflex Aacute -60 -KPX Ucircumflex Abreve -60 -KPX Ucircumflex Acircumflex -60 -KPX Ucircumflex Adieresis -60 -KPX Ucircumflex Agrave -60 -KPX Ucircumflex Amacron -60 -KPX Ucircumflex Aogonek -60 -KPX Ucircumflex Aring -60 -KPX Ucircumflex Atilde -60 -KPX Ucircumflex comma -50 -KPX Ucircumflex period -50 -KPX Udieresis A -60 -KPX Udieresis Aacute -60 -KPX Udieresis Abreve -60 -KPX Udieresis Acircumflex -60 -KPX Udieresis Adieresis -60 -KPX Udieresis Agrave -60 -KPX Udieresis Amacron -60 -KPX Udieresis Aogonek -60 -KPX Udieresis Aring -60 -KPX Udieresis Atilde -60 -KPX Udieresis comma -50 -KPX Udieresis period -50 -KPX Ugrave A -60 -KPX Ugrave Aacute -60 -KPX Ugrave Abreve -60 -KPX Ugrave Acircumflex -60 -KPX Ugrave Adieresis -60 -KPX Ugrave Agrave -60 -KPX Ugrave Amacron -60 -KPX Ugrave Aogonek -60 -KPX Ugrave Aring -60 -KPX Ugrave Atilde -60 -KPX Ugrave comma -50 -KPX Ugrave period -50 -KPX Uhungarumlaut A -60 -KPX Uhungarumlaut Aacute -60 -KPX Uhungarumlaut Abreve -60 -KPX Uhungarumlaut Acircumflex -60 -KPX Uhungarumlaut Adieresis -60 -KPX Uhungarumlaut Agrave -60 -KPX Uhungarumlaut Amacron -60 -KPX Uhungarumlaut Aogonek -60 -KPX Uhungarumlaut Aring -60 -KPX Uhungarumlaut Atilde -60 -KPX Uhungarumlaut comma -50 -KPX Uhungarumlaut period -50 -KPX Umacron A -60 -KPX Umacron Aacute -60 -KPX Umacron Abreve -60 -KPX Umacron Acircumflex -60 -KPX Umacron Adieresis -60 -KPX Umacron Agrave -60 -KPX Umacron Amacron -60 -KPX Umacron Aogonek -60 -KPX Umacron Aring -60 -KPX Umacron Atilde -60 -KPX Umacron comma -50 -KPX Umacron period -50 -KPX Uogonek A -60 -KPX Uogonek Aacute -60 -KPX Uogonek Abreve -60 -KPX Uogonek Acircumflex -60 -KPX Uogonek Adieresis -60 -KPX Uogonek Agrave -60 -KPX Uogonek Amacron -60 -KPX Uogonek Aogonek -60 -KPX Uogonek Aring -60 -KPX Uogonek Atilde -60 -KPX Uogonek comma -50 -KPX Uogonek period -50 -KPX Uring A -60 -KPX Uring Aacute -60 -KPX Uring Abreve -60 -KPX Uring Acircumflex -60 -KPX Uring Adieresis -60 -KPX Uring Agrave -60 -KPX Uring Amacron -60 -KPX Uring Aogonek -60 -KPX Uring Aring -60 -KPX Uring Atilde -60 -KPX Uring comma -50 -KPX Uring period -50 -KPX V A -135 -KPX V Aacute -135 -KPX V Abreve -135 -KPX V Acircumflex -135 -KPX V Adieresis -135 -KPX V Agrave -135 -KPX V Amacron -135 -KPX V Aogonek -135 -KPX V Aring -135 -KPX V Atilde -135 -KPX V G -30 -KPX V Gbreve -30 -KPX V Gcommaaccent -30 -KPX V O -45 -KPX V Oacute -45 -KPX V Ocircumflex -45 -KPX V Odieresis -45 -KPX V Ograve -45 -KPX V Ohungarumlaut -45 -KPX V Omacron -45 -KPX V Oslash -45 -KPX V Otilde -45 -KPX V a -92 -KPX V aacute -92 -KPX V abreve -92 -KPX V acircumflex -92 -KPX V adieresis -92 -KPX V agrave -92 -KPX V amacron -92 -KPX V aogonek -92 -KPX V aring -92 -KPX V atilde -92 -KPX V colon -92 -KPX V comma -129 -KPX V e -100 -KPX V eacute -100 -KPX V ecaron -100 -KPX V ecircumflex -100 -KPX V edieresis -100 -KPX V edotaccent -100 -KPX V egrave -100 -KPX V emacron -100 -KPX V eogonek -100 -KPX V hyphen -74 -KPX V i -37 -KPX V iacute -37 -KPX V icircumflex -37 -KPX V idieresis -37 -KPX V igrave -37 -KPX V imacron -37 -KPX V iogonek -37 -KPX V o -100 -KPX V oacute -100 -KPX V ocircumflex -100 -KPX V odieresis -100 -KPX V ograve -100 -KPX V ohungarumlaut -100 -KPX V omacron -100 -KPX V oslash -100 -KPX V otilde -100 -KPX V period -145 -KPX V semicolon -92 -KPX V u -92 -KPX V uacute -92 -KPX V ucircumflex -92 -KPX V udieresis -92 -KPX V ugrave -92 -KPX V uhungarumlaut -92 -KPX V umacron -92 -KPX V uogonek -92 -KPX V uring -92 -KPX W A -120 -KPX W Aacute -120 -KPX W Abreve -120 -KPX W Acircumflex -120 -KPX W Adieresis -120 -KPX W Agrave -120 -KPX W Amacron -120 -KPX W Aogonek -120 -KPX W Aring -120 -KPX W Atilde -120 -KPX W O -10 -KPX W Oacute -10 -KPX W Ocircumflex -10 -KPX W Odieresis -10 -KPX W Ograve -10 -KPX W Ohungarumlaut -10 -KPX W Omacron -10 -KPX W Oslash -10 -KPX W Otilde -10 -KPX W a -65 -KPX W aacute -65 -KPX W abreve -65 -KPX W acircumflex -65 -KPX W adieresis -65 -KPX W agrave -65 -KPX W amacron -65 -KPX W aogonek -65 -KPX W aring -65 -KPX W atilde -65 -KPX W colon -55 -KPX W comma -92 -KPX W e -65 -KPX W eacute -65 -KPX W ecaron -65 -KPX W ecircumflex -65 -KPX W edieresis -65 -KPX W edotaccent -65 -KPX W egrave -65 -KPX W emacron -65 -KPX W eogonek -65 -KPX W hyphen -37 -KPX W i -18 -KPX W iacute -18 -KPX W iogonek -18 -KPX W o -75 -KPX W oacute -75 -KPX W ocircumflex -75 -KPX W odieresis -75 -KPX W ograve -75 -KPX W ohungarumlaut -75 -KPX W omacron -75 -KPX W oslash -75 -KPX W otilde -75 -KPX W period -92 -KPX W semicolon -55 -KPX W u -50 -KPX W uacute -50 -KPX W ucircumflex -50 -KPX W udieresis -50 -KPX W ugrave -50 -KPX W uhungarumlaut -50 -KPX W umacron -50 -KPX W uogonek -50 -KPX W uring -50 -KPX W y -60 -KPX W yacute -60 -KPX W ydieresis -60 -KPX Y A -110 -KPX Y Aacute -110 -KPX Y Abreve -110 -KPX Y Acircumflex -110 -KPX Y Adieresis -110 -KPX Y Agrave -110 -KPX Y Amacron -110 -KPX Y Aogonek -110 -KPX Y Aring -110 -KPX Y Atilde -110 -KPX Y O -35 -KPX Y Oacute -35 -KPX Y Ocircumflex -35 -KPX Y Odieresis -35 -KPX Y Ograve -35 -KPX Y Ohungarumlaut -35 -KPX Y Omacron -35 -KPX Y Oslash -35 -KPX Y Otilde -35 -KPX Y a -85 -KPX Y aacute -85 -KPX Y abreve -85 -KPX Y acircumflex -85 -KPX Y adieresis -85 -KPX Y agrave -85 -KPX Y amacron -85 -KPX Y aogonek -85 -KPX Y aring -85 -KPX Y atilde -85 -KPX Y colon -92 -KPX Y comma -92 -KPX Y e -111 -KPX Y eacute -111 -KPX Y ecaron -111 -KPX Y ecircumflex -111 -KPX Y edieresis -71 -KPX Y edotaccent -111 -KPX Y egrave -71 -KPX Y emacron -71 -KPX Y eogonek -111 -KPX Y hyphen -92 -KPX Y i -37 -KPX Y iacute -37 -KPX Y iogonek -37 -KPX Y o -111 -KPX Y oacute -111 -KPX Y ocircumflex -111 -KPX Y odieresis -111 -KPX Y ograve -111 -KPX Y ohungarumlaut -111 -KPX Y omacron -111 -KPX Y oslash -111 -KPX Y otilde -111 -KPX Y period -92 -KPX Y semicolon -92 -KPX Y u -92 -KPX Y uacute -92 -KPX Y ucircumflex -92 -KPX Y udieresis -92 -KPX Y ugrave -92 -KPX Y uhungarumlaut -92 -KPX Y umacron -92 -KPX Y uogonek -92 -KPX Y uring -92 -KPX Yacute A -110 -KPX Yacute Aacute -110 -KPX Yacute Abreve -110 -KPX Yacute Acircumflex -110 -KPX Yacute Adieresis -110 -KPX Yacute Agrave -110 -KPX Yacute Amacron -110 -KPX Yacute Aogonek -110 -KPX Yacute Aring -110 -KPX Yacute Atilde -110 -KPX Yacute O -35 -KPX Yacute Oacute -35 -KPX Yacute Ocircumflex -35 -KPX Yacute Odieresis -35 -KPX Yacute Ograve -35 -KPX Yacute Ohungarumlaut -35 -KPX Yacute Omacron -35 -KPX Yacute Oslash -35 -KPX Yacute Otilde -35 -KPX Yacute a -85 -KPX Yacute aacute -85 -KPX Yacute abreve -85 -KPX Yacute acircumflex -85 -KPX Yacute adieresis -85 -KPX Yacute agrave -85 -KPX Yacute amacron -85 -KPX Yacute aogonek -85 -KPX Yacute aring -85 -KPX Yacute atilde -85 -KPX Yacute colon -92 -KPX Yacute comma -92 -KPX Yacute e -111 -KPX Yacute eacute -111 -KPX Yacute ecaron -111 -KPX Yacute ecircumflex -111 -KPX Yacute edieresis -71 -KPX Yacute edotaccent -111 -KPX Yacute egrave -71 -KPX Yacute emacron -71 -KPX Yacute eogonek -111 -KPX Yacute hyphen -92 -KPX Yacute i -37 -KPX Yacute iacute -37 -KPX Yacute iogonek -37 -KPX Yacute o -111 -KPX Yacute oacute -111 -KPX Yacute ocircumflex -111 -KPX Yacute odieresis -111 -KPX Yacute ograve -111 -KPX Yacute ohungarumlaut -111 -KPX Yacute omacron -111 -KPX Yacute oslash -111 -KPX Yacute otilde -111 -KPX Yacute period -92 -KPX Yacute semicolon -92 -KPX Yacute u -92 -KPX Yacute uacute -92 -KPX Yacute ucircumflex -92 -KPX Yacute udieresis -92 -KPX Yacute ugrave -92 -KPX Yacute uhungarumlaut -92 -KPX Yacute umacron -92 -KPX Yacute uogonek -92 -KPX Yacute uring -92 -KPX Ydieresis A -110 -KPX Ydieresis Aacute -110 -KPX Ydieresis Abreve -110 -KPX Ydieresis Acircumflex -110 -KPX Ydieresis Adieresis -110 -KPX Ydieresis Agrave -110 -KPX Ydieresis Amacron -110 -KPX Ydieresis Aogonek -110 -KPX Ydieresis Aring -110 -KPX Ydieresis Atilde -110 -KPX Ydieresis O -35 -KPX Ydieresis Oacute -35 -KPX Ydieresis Ocircumflex -35 -KPX Ydieresis Odieresis -35 -KPX Ydieresis Ograve -35 -KPX Ydieresis Ohungarumlaut -35 -KPX Ydieresis Omacron -35 -KPX Ydieresis Oslash -35 -KPX Ydieresis Otilde -35 -KPX Ydieresis a -85 -KPX Ydieresis aacute -85 -KPX Ydieresis abreve -85 -KPX Ydieresis acircumflex -85 -KPX Ydieresis adieresis -85 -KPX Ydieresis agrave -85 -KPX Ydieresis amacron -85 -KPX Ydieresis aogonek -85 -KPX Ydieresis aring -85 -KPX Ydieresis atilde -85 -KPX Ydieresis colon -92 -KPX Ydieresis comma -92 -KPX Ydieresis e -111 -KPX Ydieresis eacute -111 -KPX Ydieresis ecaron -111 -KPX Ydieresis ecircumflex -111 -KPX Ydieresis edieresis -71 -KPX Ydieresis edotaccent -111 -KPX Ydieresis egrave -71 -KPX Ydieresis emacron -71 -KPX Ydieresis eogonek -111 -KPX Ydieresis hyphen -92 -KPX Ydieresis i -37 -KPX Ydieresis iacute -37 -KPX Ydieresis iogonek -37 -KPX Ydieresis o -111 -KPX Ydieresis oacute -111 -KPX Ydieresis ocircumflex -111 -KPX Ydieresis odieresis -111 -KPX Ydieresis ograve -111 -KPX Ydieresis ohungarumlaut -111 -KPX Ydieresis omacron -111 -KPX Ydieresis oslash -111 -KPX Ydieresis otilde -111 -KPX Ydieresis period -92 -KPX Ydieresis semicolon -92 -KPX Ydieresis u -92 -KPX Ydieresis uacute -92 -KPX Ydieresis ucircumflex -92 -KPX Ydieresis udieresis -92 -KPX Ydieresis ugrave -92 -KPX Ydieresis uhungarumlaut -92 -KPX Ydieresis umacron -92 -KPX Ydieresis uogonek -92 -KPX Ydieresis uring -92 -KPX a v -25 -KPX aacute v -25 -KPX abreve v -25 -KPX acircumflex v -25 -KPX adieresis v -25 -KPX agrave v -25 -KPX amacron v -25 -KPX aogonek v -25 -KPX aring v -25 -KPX atilde v -25 -KPX b b -10 -KPX b period -40 -KPX b u -20 -KPX b uacute -20 -KPX b ucircumflex -20 -KPX b udieresis -20 -KPX b ugrave -20 -KPX b uhungarumlaut -20 -KPX b umacron -20 -KPX b uogonek -20 -KPX b uring -20 -KPX b v -15 -KPX comma quotedblright -45 -KPX comma quoteright -55 -KPX d w -15 -KPX dcroat w -15 -KPX e v -15 -KPX eacute v -15 -KPX ecaron v -15 -KPX ecircumflex v -15 -KPX edieresis v -15 -KPX edotaccent v -15 -KPX egrave v -15 -KPX emacron v -15 -KPX eogonek v -15 -KPX f comma -15 -KPX f dotlessi -35 -KPX f i -25 -KPX f o -25 -KPX f oacute -25 -KPX f ocircumflex -25 -KPX f odieresis -25 -KPX f ograve -25 -KPX f ohungarumlaut -25 -KPX f omacron -25 -KPX f oslash -25 -KPX f otilde -25 -KPX f period -15 -KPX f quotedblright 50 -KPX f quoteright 55 -KPX g period -15 -KPX gbreve period -15 -KPX gcommaaccent period -15 -KPX h y -15 -KPX h yacute -15 -KPX h ydieresis -15 -KPX i v -10 -KPX iacute v -10 -KPX icircumflex v -10 -KPX idieresis v -10 -KPX igrave v -10 -KPX imacron v -10 -KPX iogonek v -10 -KPX k e -10 -KPX k eacute -10 -KPX k ecaron -10 -KPX k ecircumflex -10 -KPX k edieresis -10 -KPX k edotaccent -10 -KPX k egrave -10 -KPX k emacron -10 -KPX k eogonek -10 -KPX k o -15 -KPX k oacute -15 -KPX k ocircumflex -15 -KPX k odieresis -15 -KPX k ograve -15 -KPX k ohungarumlaut -15 -KPX k omacron -15 -KPX k oslash -15 -KPX k otilde -15 -KPX k y -15 -KPX k yacute -15 -KPX k ydieresis -15 -KPX kcommaaccent e -10 -KPX kcommaaccent eacute -10 -KPX kcommaaccent ecaron -10 -KPX kcommaaccent ecircumflex -10 -KPX kcommaaccent edieresis -10 -KPX kcommaaccent edotaccent -10 -KPX kcommaaccent egrave -10 -KPX kcommaaccent emacron -10 -KPX kcommaaccent eogonek -10 -KPX kcommaaccent o -15 -KPX kcommaaccent oacute -15 -KPX kcommaaccent ocircumflex -15 -KPX kcommaaccent odieresis -15 -KPX kcommaaccent ograve -15 -KPX kcommaaccent ohungarumlaut -15 -KPX kcommaaccent omacron -15 -KPX kcommaaccent oslash -15 -KPX kcommaaccent otilde -15 -KPX kcommaaccent y -15 -KPX kcommaaccent yacute -15 -KPX kcommaaccent ydieresis -15 -KPX n v -40 -KPX nacute v -40 -KPX ncaron v -40 -KPX ncommaaccent v -40 -KPX ntilde v -40 -KPX o v -10 -KPX o w -10 -KPX oacute v -10 -KPX oacute w -10 -KPX ocircumflex v -10 -KPX ocircumflex w -10 -KPX odieresis v -10 -KPX odieresis w -10 -KPX ograve v -10 -KPX ograve w -10 -KPX ohungarumlaut v -10 -KPX ohungarumlaut w -10 -KPX omacron v -10 -KPX omacron w -10 -KPX oslash v -10 -KPX oslash w -10 -KPX otilde v -10 -KPX otilde w -10 -KPX period quotedblright -55 -KPX period quoteright -55 -KPX quotedblleft A -10 -KPX quotedblleft Aacute -10 -KPX quotedblleft Abreve -10 -KPX quotedblleft Acircumflex -10 -KPX quotedblleft Adieresis -10 -KPX quotedblleft Agrave -10 -KPX quotedblleft Amacron -10 -KPX quotedblleft Aogonek -10 -KPX quotedblleft Aring -10 -KPX quotedblleft Atilde -10 -KPX quoteleft A -10 -KPX quoteleft Aacute -10 -KPX quoteleft Abreve -10 -KPX quoteleft Acircumflex -10 -KPX quoteleft Adieresis -10 -KPX quoteleft Agrave -10 -KPX quoteleft Amacron -10 -KPX quoteleft Aogonek -10 -KPX quoteleft Aring -10 -KPX quoteleft Atilde -10 -KPX quoteleft quoteleft -63 -KPX quoteright d -20 -KPX quoteright dcroat -20 -KPX quoteright quoteright -63 -KPX quoteright r -20 -KPX quoteright racute -20 -KPX quoteright rcaron -20 -KPX quoteright rcommaaccent -20 -KPX quoteright s -37 -KPX quoteright sacute -37 -KPX quoteright scaron -37 -KPX quoteright scedilla -37 -KPX quoteright scommaaccent -37 -KPX quoteright space -74 -KPX quoteright v -20 -KPX r c -18 -KPX r cacute -18 -KPX r ccaron -18 -KPX r ccedilla -18 -KPX r comma -92 -KPX r e -18 -KPX r eacute -18 -KPX r ecaron -18 -KPX r ecircumflex -18 -KPX r edieresis -18 -KPX r edotaccent -18 -KPX r egrave -18 -KPX r emacron -18 -KPX r eogonek -18 -KPX r g -10 -KPX r gbreve -10 -KPX r gcommaaccent -10 -KPX r hyphen -37 -KPX r n -15 -KPX r nacute -15 -KPX r ncaron -15 -KPX r ncommaaccent -15 -KPX r ntilde -15 -KPX r o -18 -KPX r oacute -18 -KPX r ocircumflex -18 -KPX r odieresis -18 -KPX r ograve -18 -KPX r ohungarumlaut -18 -KPX r omacron -18 -KPX r oslash -18 -KPX r otilde -18 -KPX r p -10 -KPX r period -100 -KPX r q -18 -KPX r v -10 -KPX racute c -18 -KPX racute cacute -18 -KPX racute ccaron -18 -KPX racute ccedilla -18 -KPX racute comma -92 -KPX racute e -18 -KPX racute eacute -18 -KPX racute ecaron -18 -KPX racute ecircumflex -18 -KPX racute edieresis -18 -KPX racute edotaccent -18 -KPX racute egrave -18 -KPX racute emacron -18 -KPX racute eogonek -18 -KPX racute g -10 -KPX racute gbreve -10 -KPX racute gcommaaccent -10 -KPX racute hyphen -37 -KPX racute n -15 -KPX racute nacute -15 -KPX racute ncaron -15 -KPX racute ncommaaccent -15 -KPX racute ntilde -15 -KPX racute o -18 -KPX racute oacute -18 -KPX racute ocircumflex -18 -KPX racute odieresis -18 -KPX racute ograve -18 -KPX racute ohungarumlaut -18 -KPX racute omacron -18 -KPX racute oslash -18 -KPX racute otilde -18 -KPX racute p -10 -KPX racute period -100 -KPX racute q -18 -KPX racute v -10 -KPX rcaron c -18 -KPX rcaron cacute -18 -KPX rcaron ccaron -18 -KPX rcaron ccedilla -18 -KPX rcaron comma -92 -KPX rcaron e -18 -KPX rcaron eacute -18 -KPX rcaron ecaron -18 -KPX rcaron ecircumflex -18 -KPX rcaron edieresis -18 -KPX rcaron edotaccent -18 -KPX rcaron egrave -18 -KPX rcaron emacron -18 -KPX rcaron eogonek -18 -KPX rcaron g -10 -KPX rcaron gbreve -10 -KPX rcaron gcommaaccent -10 -KPX rcaron hyphen -37 -KPX rcaron n -15 -KPX rcaron nacute -15 -KPX rcaron ncaron -15 -KPX rcaron ncommaaccent -15 -KPX rcaron ntilde -15 -KPX rcaron o -18 -KPX rcaron oacute -18 -KPX rcaron ocircumflex -18 -KPX rcaron odieresis -18 -KPX rcaron ograve -18 -KPX rcaron ohungarumlaut -18 -KPX rcaron omacron -18 -KPX rcaron oslash -18 -KPX rcaron otilde -18 -KPX rcaron p -10 -KPX rcaron period -100 -KPX rcaron q -18 -KPX rcaron v -10 -KPX rcommaaccent c -18 -KPX rcommaaccent cacute -18 -KPX rcommaaccent ccaron -18 -KPX rcommaaccent ccedilla -18 -KPX rcommaaccent comma -92 -KPX rcommaaccent e -18 -KPX rcommaaccent eacute -18 -KPX rcommaaccent ecaron -18 -KPX rcommaaccent ecircumflex -18 -KPX rcommaaccent edieresis -18 -KPX rcommaaccent edotaccent -18 -KPX rcommaaccent egrave -18 -KPX rcommaaccent emacron -18 -KPX rcommaaccent eogonek -18 -KPX rcommaaccent g -10 -KPX rcommaaccent gbreve -10 -KPX rcommaaccent gcommaaccent -10 -KPX rcommaaccent hyphen -37 -KPX rcommaaccent n -15 -KPX rcommaaccent nacute -15 -KPX rcommaaccent ncaron -15 -KPX rcommaaccent ncommaaccent -15 -KPX rcommaaccent ntilde -15 -KPX rcommaaccent o -18 -KPX rcommaaccent oacute -18 -KPX rcommaaccent ocircumflex -18 -KPX rcommaaccent odieresis -18 -KPX rcommaaccent ograve -18 -KPX rcommaaccent ohungarumlaut -18 -KPX rcommaaccent omacron -18 -KPX rcommaaccent oslash -18 -KPX rcommaaccent otilde -18 -KPX rcommaaccent p -10 -KPX rcommaaccent period -100 -KPX rcommaaccent q -18 -KPX rcommaaccent v -10 -KPX space A -55 -KPX space Aacute -55 -KPX space Abreve -55 -KPX space Acircumflex -55 -KPX space Adieresis -55 -KPX space Agrave -55 -KPX space Amacron -55 -KPX space Aogonek -55 -KPX space Aring -55 -KPX space Atilde -55 -KPX space T -30 -KPX space Tcaron -30 -KPX space Tcommaaccent -30 -KPX space V -45 -KPX space W -30 -KPX space Y -55 -KPX space Yacute -55 -KPX space Ydieresis -55 -KPX v a -10 -KPX v aacute -10 -KPX v abreve -10 -KPX v acircumflex -10 -KPX v adieresis -10 -KPX v agrave -10 -KPX v amacron -10 -KPX v aogonek -10 -KPX v aring -10 -KPX v atilde -10 -KPX v comma -55 -KPX v e -10 -KPX v eacute -10 -KPX v ecaron -10 -KPX v ecircumflex -10 -KPX v edieresis -10 -KPX v edotaccent -10 -KPX v egrave -10 -KPX v emacron -10 -KPX v eogonek -10 -KPX v o -10 -KPX v oacute -10 -KPX v ocircumflex -10 -KPX v odieresis -10 -KPX v ograve -10 -KPX v ohungarumlaut -10 -KPX v omacron -10 -KPX v oslash -10 -KPX v otilde -10 -KPX v period -70 -KPX w comma -55 -KPX w o -10 -KPX w oacute -10 -KPX w ocircumflex -10 -KPX w odieresis -10 -KPX w ograve -10 -KPX w ohungarumlaut -10 -KPX w omacron -10 -KPX w oslash -10 -KPX w otilde -10 -KPX w period -70 -KPX y comma -55 -KPX y e -10 -KPX y eacute -10 -KPX y ecaron -10 -KPX y ecircumflex -10 -KPX y edieresis -10 -KPX y edotaccent -10 -KPX y egrave -10 -KPX y emacron -10 -KPX y eogonek -10 -KPX y o -25 -KPX y oacute -25 -KPX y ocircumflex -25 -KPX y odieresis -25 -KPX y ograve -25 -KPX y ohungarumlaut -25 -KPX y omacron -25 -KPX y oslash -25 -KPX y otilde -25 -KPX y period -70 -KPX yacute comma -55 -KPX yacute e -10 -KPX yacute eacute -10 -KPX yacute ecaron -10 -KPX yacute ecircumflex -10 -KPX yacute edieresis -10 -KPX yacute edotaccent -10 -KPX yacute egrave -10 -KPX yacute emacron -10 -KPX yacute eogonek -10 -KPX yacute o -25 -KPX yacute oacute -25 -KPX yacute ocircumflex -25 -KPX yacute odieresis -25 -KPX yacute ograve -25 -KPX yacute ohungarumlaut -25 -KPX yacute omacron -25 -KPX yacute oslash -25 -KPX yacute otilde -25 -KPX yacute period -70 -KPX ydieresis comma -55 -KPX ydieresis e -10 -KPX ydieresis eacute -10 -KPX ydieresis ecaron -10 -KPX ydieresis ecircumflex -10 -KPX ydieresis edieresis -10 -KPX ydieresis edotaccent -10 -KPX ydieresis egrave -10 -KPX ydieresis emacron -10 -KPX ydieresis eogonek -10 -KPX ydieresis o -25 -KPX ydieresis oacute -25 -KPX ydieresis ocircumflex -25 -KPX ydieresis odieresis -25 -KPX ydieresis ograve -25 -KPX ydieresis ohungarumlaut -25 -KPX ydieresis omacron -25 -KPX ydieresis oslash -25 -KPX ydieresis otilde -25 -KPX ydieresis period -70 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Times-Bold.afm.php b/vendor/dompdf/dompdf/lib/fonts/Times-Bold.afm.php deleted file mode 100644 index 33691a6..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Times-Bold.afm.php +++ /dev/null @@ -1,572 +0,0 @@ - - array ( - 32 => 'space', - 160 => 'space', - 33 => 'exclam', - 34 => 'quotedbl', - 35 => 'numbersign', - 36 => 'dollar', - 37 => 'percent', - 38 => 'ampersand', - 146 => 'quoteright', - 40 => 'parenleft', - 41 => 'parenright', - 42 => 'asterisk', - 43 => 'plus', - 44 => 'comma', - 45 => 'hyphen', - 173 => 'hyphen', - 46 => 'period', - 47 => 'slash', - 48 => 'zero', - 49 => 'one', - 50 => 'two', - 51 => 'three', - 52 => 'four', - 53 => 'five', - 54 => 'six', - 55 => 'seven', - 56 => 'eight', - 57 => 'nine', - 58 => 'colon', - 59 => 'semicolon', - 60 => 'less', - 61 => 'equal', - 62 => 'greater', - 63 => 'question', - 64 => 'at', - 65 => 'A', - 66 => 'B', - 67 => 'C', - 68 => 'D', - 69 => 'E', - 70 => 'F', - 71 => 'G', - 72 => 'H', - 73 => 'I', - 74 => 'J', - 75 => 'K', - 76 => 'L', - 77 => 'M', - 78 => 'N', - 79 => 'O', - 80 => 'P', - 81 => 'Q', - 82 => 'R', - 83 => 'S', - 84 => 'T', - 85 => 'U', - 86 => 'V', - 87 => 'W', - 88 => 'X', - 89 => 'Y', - 90 => 'Z', - 91 => 'bracketleft', - 92 => 'backslash', - 93 => 'bracketright', - 94 => 'asciicircum', - 95 => 'underscore', - 145 => 'quoteleft', - 97 => 'a', - 98 => 'b', - 99 => 'c', - 100 => 'd', - 101 => 'e', - 102 => 'f', - 103 => 'g', - 104 => 'h', - 105 => 'i', - 106 => 'j', - 107 => 'k', - 108 => 'l', - 109 => 'm', - 110 => 'n', - 111 => 'o', - 112 => 'p', - 113 => 'q', - 114 => 'r', - 115 => 's', - 116 => 't', - 117 => 'u', - 118 => 'v', - 119 => 'w', - 120 => 'x', - 121 => 'y', - 122 => 'z', - 123 => 'braceleft', - 124 => 'bar', - 125 => 'braceright', - 126 => 'asciitilde', - 161 => 'exclamdown', - 162 => 'cent', - 163 => 'sterling', - 165 => 'yen', - 131 => 'florin', - 167 => 'section', - 164 => 'currency', - 39 => 'quotesingle', - 147 => 'quotedblleft', - 171 => 'guillemotleft', - 139 => 'guilsinglleft', - 155 => 'guilsinglright', - 150 => 'endash', - 134 => 'dagger', - 135 => 'daggerdbl', - 183 => 'periodcentered', - 182 => 'paragraph', - 149 => 'bullet', - 130 => 'quotesinglbase', - 132 => 'quotedblbase', - 148 => 'quotedblright', - 187 => 'guillemotright', - 133 => 'ellipsis', - 137 => 'perthousand', - 191 => 'questiondown', - 96 => 'grave', - 180 => 'acute', - 136 => 'circumflex', - 152 => 'tilde', - 175 => 'macron', - 168 => 'dieresis', - 184 => 'cedilla', - 151 => 'emdash', - 198 => 'AE', - 170 => 'ordfeminine', - 216 => 'Oslash', - 140 => 'OE', - 186 => 'ordmasculine', - 230 => 'ae', - 248 => 'oslash', - 156 => 'oe', - 223 => 'germandbls', - 207 => 'Idieresis', - 233 => 'eacute', - 159 => 'Ydieresis', - 247 => 'divide', - 221 => 'Yacute', - 194 => 'Acircumflex', - 225 => 'aacute', - 219 => 'Ucircumflex', - 253 => 'yacute', - 234 => 'ecircumflex', - 220 => 'Udieresis', - 218 => 'Uacute', - 203 => 'Edieresis', - 169 => 'copyright', - 229 => 'aring', - 224 => 'agrave', - 227 => 'atilde', - 154 => 'scaron', - 237 => 'iacute', - 251 => 'ucircumflex', - 226 => 'acircumflex', - 231 => 'ccedilla', - 222 => 'Thorn', - 179 => 'threesuperior', - 210 => 'Ograve', - 192 => 'Agrave', - 215 => 'multiply', - 250 => 'uacute', - 255 => 'ydieresis', - 238 => 'icircumflex', - 202 => 'Ecircumflex', - 228 => 'adieresis', - 235 => 'edieresis', - 205 => 'Iacute', - 177 => 'plusminus', - 166 => 'brokenbar', - 174 => 'registered', - 200 => 'Egrave', - 142 => 'Zcaron', - 208 => 'Eth', - 199 => 'Ccedilla', - 193 => 'Aacute', - 196 => 'Adieresis', - 232 => 'egrave', - 211 => 'Oacute', - 243 => 'oacute', - 239 => 'idieresis', - 212 => 'Ocircumflex', - 217 => 'Ugrave', - 254 => 'thorn', - 178 => 'twosuperior', - 214 => 'Odieresis', - 181 => 'mu', - 236 => 'igrave', - 190 => 'threequarters', - 153 => 'trademark', - 204 => 'Igrave', - 189 => 'onehalf', - 244 => 'ocircumflex', - 241 => 'ntilde', - 201 => 'Eacute', - 188 => 'onequarter', - 138 => 'Scaron', - 176 => 'degree', - 242 => 'ograve', - 249 => 'ugrave', - 209 => 'Ntilde', - 245 => 'otilde', - 195 => 'Atilde', - 197 => 'Aring', - 213 => 'Otilde', - 206 => 'Icircumflex', - 172 => 'logicalnot', - 246 => 'odieresis', - 252 => 'udieresis', - 240 => 'eth', - 158 => 'zcaron', - 185 => 'onesuperior', - 128 => 'Euro', - ), - 'isUnicode' => false, - 'FontName' => 'Times-Bold', - 'FullName' => 'Times Bold', - 'FamilyName' => 'Times', - 'Weight' => 'Bold', - 'ItalicAngle' => '0', - 'IsFixedPitch' => 'false', - 'CharacterSet' => 'ExtendedRoman', - 'FontBBox' => - array ( - 0 => '-168', - 1 => '-218', - 2 => '1000', - 3 => '935', - ), - 'UnderlinePosition' => '-100', - 'UnderlineThickness' => '50', - 'Version' => '002.000', - 'EncodingScheme' => 'WinAnsiEncoding', - 'CapHeight' => '676', - 'XHeight' => '461', - 'Ascender' => '683', - 'Descender' => '-217', - 'StdHW' => '44', - 'StdVW' => '139', - 'StartCharMetrics' => '317', - 'C' => - array ( - 32 => 250.0, - 160 => 250.0, - 33 => 333.0, - 34 => 555.0, - 35 => 500.0, - 36 => 500.0, - 37 => 1000.0, - 38 => 833.0, - 146 => 333.0, - 40 => 333.0, - 41 => 333.0, - 42 => 500.0, - 43 => 570.0, - 44 => 250.0, - 45 => 333.0, - 173 => 333.0, - 46 => 250.0, - 47 => 278.0, - 48 => 500.0, - 49 => 500.0, - 50 => 500.0, - 51 => 500.0, - 52 => 500.0, - 53 => 500.0, - 54 => 500.0, - 55 => 500.0, - 56 => 500.0, - 57 => 500.0, - 58 => 333.0, - 59 => 333.0, - 60 => 570.0, - 61 => 570.0, - 62 => 570.0, - 63 => 500.0, - 64 => 930.0, - 65 => 722.0, - 66 => 667.0, - 67 => 722.0, - 68 => 722.0, - 69 => 667.0, - 70 => 611.0, - 71 => 778.0, - 72 => 778.0, - 73 => 389.0, - 74 => 500.0, - 75 => 778.0, - 76 => 667.0, - 77 => 944.0, - 78 => 722.0, - 79 => 778.0, - 80 => 611.0, - 81 => 778.0, - 82 => 722.0, - 83 => 556.0, - 84 => 667.0, - 85 => 722.0, - 86 => 722.0, - 87 => 1000.0, - 88 => 722.0, - 89 => 722.0, - 90 => 667.0, - 91 => 333.0, - 92 => 278.0, - 93 => 333.0, - 94 => 581.0, - 95 => 500.0, - 145 => 333.0, - 97 => 500.0, - 98 => 556.0, - 99 => 444.0, - 100 => 556.0, - 101 => 444.0, - 102 => 333.0, - 103 => 500.0, - 104 => 556.0, - 105 => 278.0, - 106 => 333.0, - 107 => 556.0, - 108 => 278.0, - 109 => 833.0, - 110 => 556.0, - 111 => 500.0, - 112 => 556.0, - 113 => 556.0, - 114 => 444.0, - 115 => 389.0, - 116 => 333.0, - 117 => 556.0, - 118 => 500.0, - 119 => 722.0, - 120 => 500.0, - 121 => 500.0, - 122 => 444.0, - 123 => 394.0, - 124 => 220.0, - 125 => 394.0, - 126 => 520.0, - 161 => 333.0, - 162 => 500.0, - 163 => 500.0, - 'fraction' => 167.0, - 165 => 500.0, - 131 => 500.0, - 167 => 500.0, - 164 => 500.0, - 39 => 278.0, - 147 => 500.0, - 171 => 500.0, - 139 => 333.0, - 155 => 333.0, - 'fi' => 556.0, - 'fl' => 556.0, - 150 => 500.0, - 134 => 500.0, - 135 => 500.0, - 183 => 250.0, - 182 => 540.0, - 149 => 350.0, - 130 => 333.0, - 132 => 500.0, - 148 => 500.0, - 187 => 500.0, - 133 => 1000.0, - 137 => 1000.0, - 191 => 500.0, - 96 => 333.0, - 180 => 333.0, - 136 => 333.0, - 152 => 333.0, - 175 => 333.0, - 'breve' => 333.0, - 'dotaccent' => 333.0, - 168 => 333.0, - 'ring' => 333.0, - 184 => 333.0, - 'hungarumlaut' => 333.0, - 'ogonek' => 333.0, - 'caron' => 333.0, - 151 => 1000.0, - 198 => 1000.0, - 170 => 300.0, - 'Lslash' => 667.0, - 216 => 778.0, - 140 => 1000.0, - 186 => 330.0, - 230 => 722.0, - 'dotlessi' => 278.0, - 'lslash' => 278.0, - 248 => 500.0, - 156 => 722.0, - 223 => 556.0, - 207 => 389.0, - 233 => 444.0, - 'abreve' => 500.0, - 'uhungarumlaut' => 556.0, - 'ecaron' => 444.0, - 159 => 722.0, - 247 => 570.0, - 221 => 722.0, - 194 => 722.0, - 225 => 500.0, - 219 => 722.0, - 253 => 500.0, - 'scommaaccent' => 389.0, - 234 => 444.0, - 'Uring' => 722.0, - 220 => 722.0, - 'aogonek' => 500.0, - 218 => 722.0, - 'uogonek' => 556.0, - 203 => 667.0, - 'Dcroat' => 722.0, - 'commaaccent' => 250.0, - 169 => 747.0, - 'Emacron' => 667.0, - 'ccaron' => 444.0, - 229 => 500.0, - 'Ncommaaccent' => 722.0, - 'lacute' => 278.0, - 224 => 500.0, - 'Tcommaaccent' => 667.0, - 'Cacute' => 722.0, - 227 => 500.0, - 'Edotaccent' => 667.0, - 154 => 389.0, - 'scedilla' => 389.0, - 237 => 278.0, - 'lozenge' => 494.0, - 'Rcaron' => 722.0, - 'Gcommaaccent' => 778.0, - 251 => 556.0, - 226 => 500.0, - 'Amacron' => 722.0, - 'rcaron' => 444.0, - 231 => 444.0, - 'Zdotaccent' => 667.0, - 222 => 611.0, - 'Omacron' => 778.0, - 'Racute' => 722.0, - 'Sacute' => 556.0, - 'dcaron' => 672.0, - 'Umacron' => 722.0, - 'uring' => 556.0, - 179 => 300.0, - 210 => 778.0, - 192 => 722.0, - 'Abreve' => 722.0, - 215 => 570.0, - 250 => 556.0, - 'Tcaron' => 667.0, - 'partialdiff' => 494.0, - 255 => 500.0, - 'Nacute' => 722.0, - 238 => 278.0, - 202 => 667.0, - 228 => 500.0, - 235 => 444.0, - 'cacute' => 444.0, - 'nacute' => 556.0, - 'umacron' => 556.0, - 'Ncaron' => 722.0, - 205 => 389.0, - 177 => 570.0, - 166 => 220.0, - 174 => 747.0, - 'Gbreve' => 778.0, - 'Idotaccent' => 389.0, - 'summation' => 600.0, - 200 => 667.0, - 'racute' => 444.0, - 'omacron' => 500.0, - 'Zacute' => 667.0, - 142 => 667.0, - 'greaterequal' => 549.0, - 208 => 722.0, - 199 => 722.0, - 'lcommaaccent' => 278.0, - 'tcaron' => 416.0, - 'eogonek' => 444.0, - 'Uogonek' => 722.0, - 193 => 722.0, - 196 => 722.0, - 232 => 444.0, - 'zacute' => 444.0, - 'iogonek' => 278.0, - 211 => 778.0, - 243 => 500.0, - 'amacron' => 500.0, - 'sacute' => 389.0, - 239 => 278.0, - 212 => 778.0, - 217 => 722.0, - 'Delta' => 612.0, - 254 => 556.0, - 178 => 300.0, - 214 => 778.0, - 181 => 556.0, - 236 => 278.0, - 'ohungarumlaut' => 500.0, - 'Eogonek' => 667.0, - 'dcroat' => 556.0, - 190 => 750.0, - 'Scedilla' => 556.0, - 'lcaron' => 394.0, - 'Kcommaaccent' => 778.0, - 'Lacute' => 667.0, - 153 => 1000.0, - 'edotaccent' => 444.0, - 204 => 389.0, - 'Imacron' => 389.0, - 'Lcaron' => 667.0, - 189 => 750.0, - 'lessequal' => 549.0, - 244 => 500.0, - 241 => 556.0, - 'Uhungarumlaut' => 722.0, - 201 => 667.0, - 'emacron' => 444.0, - 'gbreve' => 500.0, - 188 => 750.0, - 138 => 556.0, - 'Scommaaccent' => 556.0, - 'Ohungarumlaut' => 778.0, - 176 => 400.0, - 242 => 500.0, - 'Ccaron' => 722.0, - 249 => 556.0, - 'radical' => 549.0, - 'Dcaron' => 722.0, - 'rcommaaccent' => 444.0, - 209 => 722.0, - 245 => 500.0, - 'Rcommaaccent' => 722.0, - 'Lcommaaccent' => 667.0, - 195 => 722.0, - 'Aogonek' => 722.0, - 197 => 722.0, - 213 => 778.0, - 'zdotaccent' => 444.0, - 'Ecaron' => 667.0, - 'Iogonek' => 389.0, - 'kcommaaccent' => 556.0, - 'minus' => 570.0, - 206 => 389.0, - 'ncaron' => 556.0, - 'tcommaaccent' => 333.0, - 172 => 570.0, - 246 => 500.0, - 252 => 556.0, - 'notequal' => 549.0, - 'gcommaaccent' => 500.0, - 240 => 500.0, - 158 => 444.0, - 'ncommaaccent' => 556.0, - 185 => 300.0, - 'imacron' => 278.0, - 128 => 500.0, - ), - 'CIDtoGID_Compressed' => true, - 'CIDtoGID' => 'eJwDAAAAAAE=', - '_version_' => 6, -); \ No newline at end of file diff --git a/vendor/dompdf/dompdf/lib/fonts/Times-BoldItalic.afm b/vendor/dompdf/dompdf/lib/fonts/Times-BoldItalic.afm deleted file mode 100644 index 396987c..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Times-BoldItalic.afm +++ /dev/null @@ -1,2386 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 1 13:04:06 1997 -Comment UniqueID 43066 -Comment VMusage 45874 56899 -FontName Times-BoldItalic -FullName Times Bold Italic -FamilyName Times -Weight Bold -ItalicAngle -15 -IsFixedPitch false -CharacterSet ExtendedRoman -FontBBox -200 -218 996 921 -UnderlinePosition -100 -UnderlineThickness 50 -Version 002.000 -Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. -EncodingScheme WinAnsiEncoding -CapHeight 669 -XHeight 462 -Ascender 683 -Descender -217 -StdHW 42 -StdVW 121 -StartCharMetrics 317 -C 32 ; WX 250 ; N space ; B 0 0 0 0 ; -C 160 ; WX 250 ; N space ; B 0 0 0 0 ; -C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ; -C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ; -C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ; -C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ; -C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ; -C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ; -C 146 ; WX 333 ; N quoteright ; B 98 369 302 685 ; -C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ; -C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ; -C 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ; -C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; -C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ; -C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ; -C 173 ; WX 333 ; N hyphen ; B 2 166 271 282 ; -C 46 ; WX 250 ; N period ; B -9 -13 139 135 ; -C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ; -C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ; -C 49 ; WX 500 ; N one ; B 5 0 419 683 ; -C 50 ; WX 500 ; N two ; B -27 0 446 683 ; -C 51 ; WX 500 ; N three ; B -15 -13 450 683 ; -C 52 ; WX 500 ; N four ; B -15 0 503 683 ; -C 53 ; WX 500 ; N five ; B -11 -13 487 669 ; -C 54 ; WX 500 ; N six ; B 23 -15 509 679 ; -C 55 ; WX 500 ; N seven ; B 52 0 525 669 ; -C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ; -C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ; -C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ; -C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ; -C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; -C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; -C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; -C 63 ; WX 500 ; N question ; B 79 -13 470 684 ; -C 64 ; WX 832 ; N at ; B 63 -18 770 685 ; -C 65 ; WX 667 ; N A ; B -67 0 593 683 ; -C 66 ; WX 667 ; N B ; B -24 0 624 669 ; -C 67 ; WX 667 ; N C ; B 32 -18 677 685 ; -C 68 ; WX 722 ; N D ; B -46 0 685 669 ; -C 69 ; WX 667 ; N E ; B -27 0 653 669 ; -C 70 ; WX 667 ; N F ; B -13 0 660 669 ; -C 71 ; WX 722 ; N G ; B 21 -18 706 685 ; -C 72 ; WX 778 ; N H ; B -24 0 799 669 ; -C 73 ; WX 389 ; N I ; B -32 0 406 669 ; -C 74 ; WX 500 ; N J ; B -46 -99 524 669 ; -C 75 ; WX 667 ; N K ; B -21 0 702 669 ; -C 76 ; WX 611 ; N L ; B -22 0 590 669 ; -C 77 ; WX 889 ; N M ; B -29 -12 917 669 ; -C 78 ; WX 722 ; N N ; B -27 -15 748 669 ; -C 79 ; WX 722 ; N O ; B 27 -18 691 685 ; -C 80 ; WX 611 ; N P ; B -27 0 613 669 ; -C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ; -C 82 ; WX 667 ; N R ; B -29 0 623 669 ; -C 83 ; WX 556 ; N S ; B 2 -18 526 685 ; -C 84 ; WX 611 ; N T ; B 50 0 650 669 ; -C 85 ; WX 722 ; N U ; B 67 -18 744 669 ; -C 86 ; WX 667 ; N V ; B 65 -18 715 669 ; -C 87 ; WX 889 ; N W ; B 65 -18 940 669 ; -C 88 ; WX 667 ; N X ; B -24 0 694 669 ; -C 89 ; WX 611 ; N Y ; B 73 0 659 669 ; -C 90 ; WX 611 ; N Z ; B -11 0 590 669 ; -C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ; -C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ; -C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ; -C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ; -C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; -C 145 ; WX 333 ; N quoteleft ; B 128 369 332 685 ; -C 97 ; WX 500 ; N a ; B -21 -14 455 462 ; -C 98 ; WX 500 ; N b ; B -14 -13 444 699 ; -C 99 ; WX 444 ; N c ; B -5 -13 392 462 ; -C 100 ; WX 500 ; N d ; B -21 -13 517 699 ; -C 101 ; WX 444 ; N e ; B 5 -13 398 462 ; -C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ; -C 103 ; WX 500 ; N g ; B -52 -203 478 462 ; -C 104 ; WX 556 ; N h ; B -13 -9 498 699 ; -C 105 ; WX 278 ; N i ; B 2 -9 263 684 ; -C 106 ; WX 278 ; N j ; B -189 -207 279 684 ; -C 107 ; WX 500 ; N k ; B -23 -8 483 699 ; -C 108 ; WX 278 ; N l ; B 2 -9 290 699 ; -C 109 ; WX 778 ; N m ; B -14 -9 722 462 ; -C 110 ; WX 556 ; N n ; B -6 -9 493 462 ; -C 111 ; WX 500 ; N o ; B -3 -13 441 462 ; -C 112 ; WX 500 ; N p ; B -120 -205 446 462 ; -C 113 ; WX 500 ; N q ; B 1 -205 471 462 ; -C 114 ; WX 389 ; N r ; B -21 0 389 462 ; -C 115 ; WX 389 ; N s ; B -19 -13 333 462 ; -C 116 ; WX 278 ; N t ; B -11 -9 281 594 ; -C 117 ; WX 556 ; N u ; B 15 -9 492 462 ; -C 118 ; WX 444 ; N v ; B 16 -13 401 462 ; -C 119 ; WX 667 ; N w ; B 16 -13 614 462 ; -C 120 ; WX 500 ; N x ; B -46 -13 469 462 ; -C 121 ; WX 444 ; N y ; B -94 -205 392 462 ; -C 122 ; WX 389 ; N z ; B -43 -78 368 449 ; -C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ; -C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; -C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ; -C 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ; -C 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ; -C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ; -C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ; -C -1 ; WX 167 ; N fraction ; B -169 -14 324 683 ; -C 165 ; WX 500 ; N yen ; B 33 0 628 669 ; -C 131 ; WX 500 ; N florin ; B -87 -156 537 707 ; -C 167 ; WX 500 ; N section ; B 36 -143 459 685 ; -C 164 ; WX 500 ; N currency ; B -26 34 526 586 ; -C 39 ; WX 278 ; N quotesingle ; B 128 398 268 685 ; -C 147 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ; -C 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ; -C 139 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ; -C 155 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ; -C -1 ; WX 556 ; N fi ; B -188 -205 514 703 ; -C -1 ; WX 556 ; N fl ; B -186 -205 553 704 ; -C 150 ; WX 500 ; N endash ; B -40 178 477 269 ; -C 134 ; WX 500 ; N dagger ; B 91 -145 494 685 ; -C 135 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ; -C 183 ; WX 250 ; N periodcentered ; B 51 257 199 405 ; -C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ; -C 149 ; WX 350 ; N bullet ; B 0 175 350 525 ; -C 130 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ; -C 132 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ; -C 148 ; WX 500 ; N quotedblright ; B 53 369 513 685 ; -C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ; -C 133 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ; -C 137 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ; -C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ; -C 96 ; WX 333 ; N grave ; B 85 516 297 697 ; -C 180 ; WX 333 ; N acute ; B 139 516 379 697 ; -C 136 ; WX 333 ; N circumflex ; B 40 516 367 690 ; -C 152 ; WX 333 ; N tilde ; B 48 536 407 655 ; -C 175 ; WX 333 ; N macron ; B 51 553 393 623 ; -C -1 ; WX 333 ; N breve ; B 71 516 387 678 ; -C -1 ; WX 333 ; N dotaccent ; B 163 550 298 684 ; -C 168 ; WX 333 ; N dieresis ; B 55 550 402 684 ; -C -1 ; WX 333 ; N ring ; B 127 516 340 729 ; -C 184 ; WX 333 ; N cedilla ; B -80 -218 156 5 ; -C -1 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ; -C -1 ; WX 333 ; N ogonek ; B 15 -183 244 34 ; -C -1 ; WX 333 ; N caron ; B 79 516 411 690 ; -C 151 ; WX 1000 ; N emdash ; B -40 178 977 269 ; -C 198 ; WX 944 ; N AE ; B -64 0 918 669 ; -C 170 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ; -C -1 ; WX 611 ; N Lslash ; B -22 0 590 669 ; -C 216 ; WX 722 ; N Oslash ; B 27 -125 691 764 ; -C 140 ; WX 944 ; N OE ; B 23 -8 946 677 ; -C 186 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ; -C 230 ; WX 722 ; N ae ; B -5 -13 673 462 ; -C -1 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ; -C -1 ; WX 278 ; N lslash ; B -7 -9 307 699 ; -C 248 ; WX 500 ; N oslash ; B -3 -119 441 560 ; -C 156 ; WX 722 ; N oe ; B 6 -13 674 462 ; -C 223 ; WX 500 ; N germandbls ; B -200 -200 473 705 ; -C 207 ; WX 389 ; N Idieresis ; B -32 0 450 862 ; -C 233 ; WX 444 ; N eacute ; B 5 -13 435 697 ; -C -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ; -C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ; -C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ; -C 159 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ; -C 247 ; WX 570 ; N divide ; B 33 -29 537 535 ; -C 221 ; WX 611 ; N Yacute ; B 73 0 659 904 ; -C 194 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ; -C 225 ; WX 500 ; N aacute ; B -21 -14 463 697 ; -C 219 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ; -C 253 ; WX 444 ; N yacute ; B -94 -205 435 697 ; -C -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ; -C 234 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ; -C -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ; -C 220 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ; -C -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ; -C 218 ; WX 722 ; N Uacute ; B 67 -18 744 904 ; -C -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ; -C 203 ; WX 667 ; N Edieresis ; B -27 0 653 862 ; -C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ; -C -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ; -C 169 ; WX 747 ; N copyright ; B 30 -18 718 685 ; -C -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ; -C -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ; -C 229 ; WX 500 ; N aring ; B -21 -14 455 729 ; -C -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ; -C -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ; -C 224 ; WX 500 ; N agrave ; B -21 -14 455 697 ; -C -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ; -C -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ; -C 227 ; WX 500 ; N atilde ; B -21 -14 491 655 ; -C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ; -C 154 ; WX 389 ; N scaron ; B -19 -13 424 690 ; -C -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ; -C 237 ; WX 278 ; N iacute ; B 2 -9 352 697 ; -C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; -C -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ; -C -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ; -C 251 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ; -C 226 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ; -C -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ; -C -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ; -C 231 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ; -C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ; -C 222 ; WX 611 ; N Thorn ; B -27 0 573 669 ; -C -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ; -C -1 ; WX 667 ; N Racute ; B -29 0 623 904 ; -C -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ; -C -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ; -C -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ; -C -1 ; WX 556 ; N uring ; B 15 -9 492 729 ; -C 179 ; WX 300 ; N threesuperior ; B 17 265 321 683 ; -C 210 ; WX 722 ; N Ograve ; B 27 -18 691 904 ; -C 192 ; WX 667 ; N Agrave ; B -67 0 593 904 ; -C -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ; -C 215 ; WX 570 ; N multiply ; B 48 16 522 490 ; -C 250 ; WX 556 ; N uacute ; B 15 -9 492 697 ; -C -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ; -C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; -C 255 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ; -C -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ; -C 238 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ; -C 202 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ; -C 228 ; WX 500 ; N adieresis ; B -21 -14 476 655 ; -C 235 ; WX 444 ; N edieresis ; B 5 -13 448 655 ; -C -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ; -C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ; -C -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ; -C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ; -C 205 ; WX 389 ; N Iacute ; B -32 0 432 904 ; -C 177 ; WX 570 ; N plusminus ; B 33 0 537 506 ; -C 166 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; -C 174 ; WX 747 ; N registered ; B 30 -18 718 685 ; -C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ; -C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ; -C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; -C 200 ; WX 667 ; N Egrave ; B -27 0 653 904 ; -C -1 ; WX 389 ; N racute ; B -21 0 407 697 ; -C -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ; -C -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ; -C 142 ; WX 611 ; N Zcaron ; B -11 0 590 897 ; -C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; -C 208 ; WX 722 ; N Eth ; B -31 0 700 669 ; -C 199 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ; -C -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ; -C -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ; -C -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ; -C -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ; -C 193 ; WX 667 ; N Aacute ; B -67 0 593 904 ; -C 196 ; WX 667 ; N Adieresis ; B -67 0 593 862 ; -C 232 ; WX 444 ; N egrave ; B 5 -13 398 697 ; -C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ; -C -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ; -C 211 ; WX 722 ; N Oacute ; B 27 -18 691 904 ; -C 243 ; WX 500 ; N oacute ; B -3 -13 463 697 ; -C -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ; -C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ; -C 239 ; WX 278 ; N idieresis ; B 2 -9 364 655 ; -C 212 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ; -C 217 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ; -C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; -C 254 ; WX 500 ; N thorn ; B -120 -205 446 699 ; -C 178 ; WX 300 ; N twosuperior ; B 2 274 313 683 ; -C 214 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ; -C 181 ; WX 576 ; N mu ; B -60 -207 516 449 ; -C 236 ; WX 278 ; N igrave ; B 2 -9 259 697 ; -C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ; -C -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ; -C -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ; -C 190 ; WX 750 ; N threequarters ; B 7 -14 726 683 ; -C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ; -C -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ; -C -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ; -C -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ; -C 153 ; WX 1000 ; N trademark ; B 32 263 968 669 ; -C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ; -C 204 ; WX 389 ; N Igrave ; B -32 0 406 904 ; -C -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ; -C -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ; -C 189 ; WX 750 ; N onehalf ; B -9 -14 723 683 ; -C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; -C 244 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ; -C 241 ; WX 556 ; N ntilde ; B -6 -9 504 655 ; -C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ; -C 201 ; WX 667 ; N Eacute ; B -27 0 653 904 ; -C -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ; -C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ; -C 188 ; WX 750 ; N onequarter ; B 7 -14 721 683 ; -C 138 ; WX 556 ; N Scaron ; B 2 -18 553 897 ; -C -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ; -C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ; -C 176 ; WX 400 ; N degree ; B 83 397 369 683 ; -C 242 ; WX 500 ; N ograve ; B -3 -13 441 697 ; -C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ; -C 249 ; WX 556 ; N ugrave ; B 15 -9 492 697 ; -C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; -C -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ; -C -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ; -C 209 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ; -C 245 ; WX 500 ; N otilde ; B -3 -13 491 655 ; -C -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ; -C -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ; -C 195 ; WX 667 ; N Atilde ; B -67 0 593 862 ; -C -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ; -C 197 ; WX 667 ; N Aring ; B -67 0 593 921 ; -C 213 ; WX 722 ; N Otilde ; B 27 -18 691 862 ; -C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ; -C -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ; -C -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ; -C -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ; -C -1 ; WX 606 ; N minus ; B 51 209 555 297 ; -C 206 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ; -C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ; -C -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ; -C 172 ; WX 606 ; N logicalnot ; B 51 108 555 399 ; -C 246 ; WX 500 ; N odieresis ; B -3 -13 471 655 ; -C 252 ; WX 556 ; N udieresis ; B 15 -9 499 655 ; -C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; -C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ; -C 240 ; WX 500 ; N eth ; B -3 -13 454 699 ; -C 158 ; WX 389 ; N zcaron ; B -43 -78 424 690 ; -C -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ; -C 185 ; WX 300 ; N onesuperior ; B 30 274 301 683 ; -C -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ; -C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -StartKernData -StartKernPairs 2038 -KPX A C -65 -KPX A Cacute -65 -KPX A Ccaron -65 -KPX A Ccedilla -65 -KPX A G -60 -KPX A Gbreve -60 -KPX A Gcommaaccent -60 -KPX A O -50 -KPX A Oacute -50 -KPX A Ocircumflex -50 -KPX A Odieresis -50 -KPX A Ograve -50 -KPX A Ohungarumlaut -50 -KPX A Omacron -50 -KPX A Oslash -50 -KPX A Otilde -50 -KPX A Q -55 -KPX A T -55 -KPX A Tcaron -55 -KPX A Tcommaaccent -55 -KPX A U -50 -KPX A Uacute -50 -KPX A Ucircumflex -50 -KPX A Udieresis -50 -KPX A Ugrave -50 -KPX A Uhungarumlaut -50 -KPX A Umacron -50 -KPX A Uogonek -50 -KPX A Uring -50 -KPX A V -95 -KPX A W -100 -KPX A Y -70 -KPX A Yacute -70 -KPX A Ydieresis -70 -KPX A quoteright -74 -KPX A u -30 -KPX A uacute -30 -KPX A ucircumflex -30 -KPX A udieresis -30 -KPX A ugrave -30 -KPX A uhungarumlaut -30 -KPX A umacron -30 -KPX A uogonek -30 -KPX A uring -30 -KPX A v -74 -KPX A w -74 -KPX A y -74 -KPX A yacute -74 -KPX A ydieresis -74 -KPX Aacute C -65 -KPX Aacute Cacute -65 -KPX Aacute Ccaron -65 -KPX Aacute Ccedilla -65 -KPX Aacute G -60 -KPX Aacute Gbreve -60 -KPX Aacute Gcommaaccent -60 -KPX Aacute O -50 -KPX Aacute Oacute -50 -KPX Aacute Ocircumflex -50 -KPX Aacute Odieresis -50 -KPX Aacute Ograve -50 -KPX Aacute Ohungarumlaut -50 -KPX Aacute Omacron -50 -KPX Aacute Oslash -50 -KPX Aacute Otilde -50 -KPX Aacute Q -55 -KPX Aacute T -55 -KPX Aacute Tcaron -55 -KPX Aacute Tcommaaccent -55 -KPX Aacute U -50 -KPX Aacute Uacute -50 -KPX Aacute Ucircumflex -50 -KPX Aacute Udieresis -50 -KPX Aacute Ugrave -50 -KPX Aacute Uhungarumlaut -50 -KPX Aacute Umacron -50 -KPX Aacute Uogonek -50 -KPX Aacute Uring -50 -KPX Aacute V -95 -KPX Aacute W -100 -KPX Aacute Y -70 -KPX Aacute Yacute -70 -KPX Aacute Ydieresis -70 -KPX Aacute quoteright -74 -KPX Aacute u -30 -KPX Aacute uacute -30 -KPX Aacute ucircumflex -30 -KPX Aacute udieresis -30 -KPX Aacute ugrave -30 -KPX Aacute uhungarumlaut -30 -KPX Aacute umacron -30 -KPX Aacute uogonek -30 -KPX Aacute uring -30 -KPX Aacute v -74 -KPX Aacute w -74 -KPX Aacute y -74 -KPX Aacute yacute -74 -KPX Aacute ydieresis -74 -KPX Abreve C -65 -KPX Abreve Cacute -65 -KPX Abreve Ccaron -65 -KPX Abreve Ccedilla -65 -KPX Abreve G -60 -KPX Abreve Gbreve -60 -KPX Abreve Gcommaaccent -60 -KPX Abreve O -50 -KPX Abreve Oacute -50 -KPX Abreve Ocircumflex -50 -KPX Abreve Odieresis -50 -KPX Abreve Ograve -50 -KPX Abreve Ohungarumlaut -50 -KPX Abreve Omacron -50 -KPX Abreve Oslash -50 -KPX Abreve Otilde -50 -KPX Abreve Q -55 -KPX Abreve T -55 -KPX Abreve Tcaron -55 -KPX Abreve Tcommaaccent -55 -KPX Abreve U -50 -KPX Abreve Uacute -50 -KPX Abreve Ucircumflex -50 -KPX Abreve Udieresis -50 -KPX Abreve Ugrave -50 -KPX Abreve Uhungarumlaut -50 -KPX Abreve Umacron -50 -KPX Abreve Uogonek -50 -KPX Abreve Uring -50 -KPX Abreve V -95 -KPX Abreve W -100 -KPX Abreve Y -70 -KPX Abreve Yacute -70 -KPX Abreve Ydieresis -70 -KPX Abreve quoteright -74 -KPX Abreve u -30 -KPX Abreve uacute -30 -KPX Abreve ucircumflex -30 -KPX Abreve udieresis -30 -KPX Abreve ugrave -30 -KPX Abreve uhungarumlaut -30 -KPX Abreve umacron -30 -KPX Abreve uogonek -30 -KPX Abreve uring -30 -KPX Abreve v -74 -KPX Abreve w -74 -KPX Abreve y -74 -KPX Abreve yacute -74 -KPX Abreve ydieresis -74 -KPX Acircumflex C -65 -KPX Acircumflex Cacute -65 -KPX Acircumflex Ccaron -65 -KPX Acircumflex Ccedilla -65 -KPX Acircumflex G -60 -KPX Acircumflex Gbreve -60 -KPX Acircumflex Gcommaaccent -60 -KPX Acircumflex O -50 -KPX Acircumflex Oacute -50 -KPX Acircumflex Ocircumflex -50 -KPX Acircumflex Odieresis -50 -KPX Acircumflex Ograve -50 -KPX Acircumflex Ohungarumlaut -50 -KPX Acircumflex Omacron -50 -KPX Acircumflex Oslash -50 -KPX Acircumflex Otilde -50 -KPX Acircumflex Q -55 -KPX Acircumflex T -55 -KPX Acircumflex Tcaron -55 -KPX Acircumflex Tcommaaccent -55 -KPX Acircumflex U -50 -KPX Acircumflex Uacute -50 -KPX Acircumflex Ucircumflex -50 -KPX Acircumflex Udieresis -50 -KPX Acircumflex Ugrave -50 -KPX Acircumflex Uhungarumlaut -50 -KPX Acircumflex Umacron -50 -KPX Acircumflex Uogonek -50 -KPX Acircumflex Uring -50 -KPX Acircumflex V -95 -KPX Acircumflex W -100 -KPX Acircumflex Y -70 -KPX Acircumflex Yacute -70 -KPX Acircumflex Ydieresis -70 -KPX Acircumflex quoteright -74 -KPX Acircumflex u -30 -KPX Acircumflex uacute -30 -KPX Acircumflex ucircumflex -30 -KPX Acircumflex udieresis -30 -KPX Acircumflex ugrave -30 -KPX Acircumflex uhungarumlaut -30 -KPX Acircumflex umacron -30 -KPX Acircumflex uogonek -30 -KPX Acircumflex uring -30 -KPX Acircumflex v -74 -KPX Acircumflex w -74 -KPX Acircumflex y -74 -KPX Acircumflex yacute -74 -KPX Acircumflex ydieresis -74 -KPX Adieresis C -65 -KPX Adieresis Cacute -65 -KPX Adieresis Ccaron -65 -KPX Adieresis Ccedilla -65 -KPX Adieresis G -60 -KPX Adieresis Gbreve -60 -KPX Adieresis Gcommaaccent -60 -KPX Adieresis O -50 -KPX Adieresis Oacute -50 -KPX Adieresis Ocircumflex -50 -KPX Adieresis Odieresis -50 -KPX Adieresis Ograve -50 -KPX Adieresis Ohungarumlaut -50 -KPX Adieresis Omacron -50 -KPX Adieresis Oslash -50 -KPX Adieresis Otilde -50 -KPX Adieresis Q -55 -KPX Adieresis T -55 -KPX Adieresis Tcaron -55 -KPX Adieresis Tcommaaccent -55 -KPX Adieresis U -50 -KPX Adieresis Uacute -50 -KPX Adieresis Ucircumflex -50 -KPX Adieresis Udieresis -50 -KPX Adieresis Ugrave -50 -KPX Adieresis Uhungarumlaut -50 -KPX Adieresis Umacron -50 -KPX Adieresis Uogonek -50 -KPX Adieresis Uring -50 -KPX Adieresis V -95 -KPX Adieresis W -100 -KPX Adieresis Y -70 -KPX Adieresis Yacute -70 -KPX Adieresis Ydieresis -70 -KPX Adieresis quoteright -74 -KPX Adieresis u -30 -KPX Adieresis uacute -30 -KPX Adieresis ucircumflex -30 -KPX Adieresis udieresis -30 -KPX Adieresis ugrave -30 -KPX Adieresis uhungarumlaut -30 -KPX Adieresis umacron -30 -KPX Adieresis uogonek -30 -KPX Adieresis uring -30 -KPX Adieresis v -74 -KPX Adieresis w -74 -KPX Adieresis y -74 -KPX Adieresis yacute -74 -KPX Adieresis ydieresis -74 -KPX Agrave C -65 -KPX Agrave Cacute -65 -KPX Agrave Ccaron -65 -KPX Agrave Ccedilla -65 -KPX Agrave G -60 -KPX Agrave Gbreve -60 -KPX Agrave Gcommaaccent -60 -KPX Agrave O -50 -KPX Agrave Oacute -50 -KPX Agrave Ocircumflex -50 -KPX Agrave Odieresis -50 -KPX Agrave Ograve -50 -KPX Agrave Ohungarumlaut -50 -KPX Agrave Omacron -50 -KPX Agrave Oslash -50 -KPX Agrave Otilde -50 -KPX Agrave Q -55 -KPX Agrave T -55 -KPX Agrave Tcaron -55 -KPX Agrave Tcommaaccent -55 -KPX Agrave U -50 -KPX Agrave Uacute -50 -KPX Agrave Ucircumflex -50 -KPX Agrave Udieresis -50 -KPX Agrave Ugrave -50 -KPX Agrave Uhungarumlaut -50 -KPX Agrave Umacron -50 -KPX Agrave Uogonek -50 -KPX Agrave Uring -50 -KPX Agrave V -95 -KPX Agrave W -100 -KPX Agrave Y -70 -KPX Agrave Yacute -70 -KPX Agrave Ydieresis -70 -KPX Agrave quoteright -74 -KPX Agrave u -30 -KPX Agrave uacute -30 -KPX Agrave ucircumflex -30 -KPX Agrave udieresis -30 -KPX Agrave ugrave -30 -KPX Agrave uhungarumlaut -30 -KPX Agrave umacron -30 -KPX Agrave uogonek -30 -KPX Agrave uring -30 -KPX Agrave v -74 -KPX Agrave w -74 -KPX Agrave y -74 -KPX Agrave yacute -74 -KPX Agrave ydieresis -74 -KPX Amacron C -65 -KPX Amacron Cacute -65 -KPX Amacron Ccaron -65 -KPX Amacron Ccedilla -65 -KPX Amacron G -60 -KPX Amacron Gbreve -60 -KPX Amacron Gcommaaccent -60 -KPX Amacron O -50 -KPX Amacron Oacute -50 -KPX Amacron Ocircumflex -50 -KPX Amacron Odieresis -50 -KPX Amacron Ograve -50 -KPX Amacron Ohungarumlaut -50 -KPX Amacron Omacron -50 -KPX Amacron Oslash -50 -KPX Amacron Otilde -50 -KPX Amacron Q -55 -KPX Amacron T -55 -KPX Amacron Tcaron -55 -KPX Amacron Tcommaaccent -55 -KPX Amacron U -50 -KPX Amacron Uacute -50 -KPX Amacron Ucircumflex -50 -KPX Amacron Udieresis -50 -KPX Amacron Ugrave -50 -KPX Amacron Uhungarumlaut -50 -KPX Amacron Umacron -50 -KPX Amacron Uogonek -50 -KPX Amacron Uring -50 -KPX Amacron V -95 -KPX Amacron W -100 -KPX Amacron Y -70 -KPX Amacron Yacute -70 -KPX Amacron Ydieresis -70 -KPX Amacron quoteright -74 -KPX Amacron u -30 -KPX Amacron uacute -30 -KPX Amacron ucircumflex -30 -KPX Amacron udieresis -30 -KPX Amacron ugrave -30 -KPX Amacron uhungarumlaut -30 -KPX Amacron umacron -30 -KPX Amacron uogonek -30 -KPX Amacron uring -30 -KPX Amacron v -74 -KPX Amacron w -74 -KPX Amacron y -74 -KPX Amacron yacute -74 -KPX Amacron ydieresis -74 -KPX Aogonek C -65 -KPX Aogonek Cacute -65 -KPX Aogonek Ccaron -65 -KPX Aogonek Ccedilla -65 -KPX Aogonek G -60 -KPX Aogonek Gbreve -60 -KPX Aogonek Gcommaaccent -60 -KPX Aogonek O -50 -KPX Aogonek Oacute -50 -KPX Aogonek Ocircumflex -50 -KPX Aogonek Odieresis -50 -KPX Aogonek Ograve -50 -KPX Aogonek Ohungarumlaut -50 -KPX Aogonek Omacron -50 -KPX Aogonek Oslash -50 -KPX Aogonek Otilde -50 -KPX Aogonek Q -55 -KPX Aogonek T -55 -KPX Aogonek Tcaron -55 -KPX Aogonek Tcommaaccent -55 -KPX Aogonek U -50 -KPX Aogonek Uacute -50 -KPX Aogonek Ucircumflex -50 -KPX Aogonek Udieresis -50 -KPX Aogonek Ugrave -50 -KPX Aogonek Uhungarumlaut -50 -KPX Aogonek Umacron -50 -KPX Aogonek Uogonek -50 -KPX Aogonek Uring -50 -KPX Aogonek V -95 -KPX Aogonek W -100 -KPX Aogonek Y -70 -KPX Aogonek Yacute -70 -KPX Aogonek Ydieresis -70 -KPX Aogonek quoteright -74 -KPX Aogonek u -30 -KPX Aogonek uacute -30 -KPX Aogonek ucircumflex -30 -KPX Aogonek udieresis -30 -KPX Aogonek ugrave -30 -KPX Aogonek uhungarumlaut -30 -KPX Aogonek umacron -30 -KPX Aogonek uogonek -30 -KPX Aogonek uring -30 -KPX Aogonek v -74 -KPX Aogonek w -74 -KPX Aogonek y -34 -KPX Aogonek yacute -34 -KPX Aogonek ydieresis -34 -KPX Aring C -65 -KPX Aring Cacute -65 -KPX Aring Ccaron -65 -KPX Aring Ccedilla -65 -KPX Aring G -60 -KPX Aring Gbreve -60 -KPX Aring Gcommaaccent -60 -KPX Aring O -50 -KPX Aring Oacute -50 -KPX Aring Ocircumflex -50 -KPX Aring Odieresis -50 -KPX Aring Ograve -50 -KPX Aring Ohungarumlaut -50 -KPX Aring Omacron -50 -KPX Aring Oslash -50 -KPX Aring Otilde -50 -KPX Aring Q -55 -KPX Aring T -55 -KPX Aring Tcaron -55 -KPX Aring Tcommaaccent -55 -KPX Aring U -50 -KPX Aring Uacute -50 -KPX Aring Ucircumflex -50 -KPX Aring Udieresis -50 -KPX Aring Ugrave -50 -KPX Aring Uhungarumlaut -50 -KPX Aring Umacron -50 -KPX Aring Uogonek -50 -KPX Aring Uring -50 -KPX Aring V -95 -KPX Aring W -100 -KPX Aring Y -70 -KPX Aring Yacute -70 -KPX Aring Ydieresis -70 -KPX Aring quoteright -74 -KPX Aring u -30 -KPX Aring uacute -30 -KPX Aring ucircumflex -30 -KPX Aring udieresis -30 -KPX Aring ugrave -30 -KPX Aring uhungarumlaut -30 -KPX Aring umacron -30 -KPX Aring uogonek -30 -KPX Aring uring -30 -KPX Aring v -74 -KPX Aring w -74 -KPX Aring y -74 -KPX Aring yacute -74 -KPX Aring ydieresis -74 -KPX Atilde C -65 -KPX Atilde Cacute -65 -KPX Atilde Ccaron -65 -KPX Atilde Ccedilla -65 -KPX Atilde G -60 -KPX Atilde Gbreve -60 -KPX Atilde Gcommaaccent -60 -KPX Atilde O -50 -KPX Atilde Oacute -50 -KPX Atilde Ocircumflex -50 -KPX Atilde Odieresis -50 -KPX Atilde Ograve -50 -KPX Atilde Ohungarumlaut -50 -KPX Atilde Omacron -50 -KPX Atilde Oslash -50 -KPX Atilde Otilde -50 -KPX Atilde Q -55 -KPX Atilde T -55 -KPX Atilde Tcaron -55 -KPX Atilde Tcommaaccent -55 -KPX Atilde U -50 -KPX Atilde Uacute -50 -KPX Atilde Ucircumflex -50 -KPX Atilde Udieresis -50 -KPX Atilde Ugrave -50 -KPX Atilde Uhungarumlaut -50 -KPX Atilde Umacron -50 -KPX Atilde Uogonek -50 -KPX Atilde Uring -50 -KPX Atilde V -95 -KPX Atilde W -100 -KPX Atilde Y -70 -KPX Atilde Yacute -70 -KPX Atilde Ydieresis -70 -KPX Atilde quoteright -74 -KPX Atilde u -30 -KPX Atilde uacute -30 -KPX Atilde ucircumflex -30 -KPX Atilde udieresis -30 -KPX Atilde ugrave -30 -KPX Atilde uhungarumlaut -30 -KPX Atilde umacron -30 -KPX Atilde uogonek -30 -KPX Atilde uring -30 -KPX Atilde v -74 -KPX Atilde w -74 -KPX Atilde y -74 -KPX Atilde yacute -74 -KPX Atilde ydieresis -74 -KPX B A -25 -KPX B Aacute -25 -KPX B Abreve -25 -KPX B Acircumflex -25 -KPX B Adieresis -25 -KPX B Agrave -25 -KPX B Amacron -25 -KPX B Aogonek -25 -KPX B Aring -25 -KPX B Atilde -25 -KPX B U -10 -KPX B Uacute -10 -KPX B Ucircumflex -10 -KPX B Udieresis -10 -KPX B Ugrave -10 -KPX B Uhungarumlaut -10 -KPX B Umacron -10 -KPX B Uogonek -10 -KPX B Uring -10 -KPX D A -25 -KPX D Aacute -25 -KPX D Abreve -25 -KPX D Acircumflex -25 -KPX D Adieresis -25 -KPX D Agrave -25 -KPX D Amacron -25 -KPX D Aogonek -25 -KPX D Aring -25 -KPX D Atilde -25 -KPX D V -50 -KPX D W -40 -KPX D Y -50 -KPX D Yacute -50 -KPX D Ydieresis -50 -KPX Dcaron A -25 -KPX Dcaron Aacute -25 -KPX Dcaron Abreve -25 -KPX Dcaron Acircumflex -25 -KPX Dcaron Adieresis -25 -KPX Dcaron Agrave -25 -KPX Dcaron Amacron -25 -KPX Dcaron Aogonek -25 -KPX Dcaron Aring -25 -KPX Dcaron Atilde -25 -KPX Dcaron V -50 -KPX Dcaron W -40 -KPX Dcaron Y -50 -KPX Dcaron Yacute -50 -KPX Dcaron Ydieresis -50 -KPX Dcroat A -25 -KPX Dcroat Aacute -25 -KPX Dcroat Abreve -25 -KPX Dcroat Acircumflex -25 -KPX Dcroat Adieresis -25 -KPX Dcroat Agrave -25 -KPX Dcroat Amacron -25 -KPX Dcroat Aogonek -25 -KPX Dcroat Aring -25 -KPX Dcroat Atilde -25 -KPX Dcroat V -50 -KPX Dcroat W -40 -KPX Dcroat Y -50 -KPX Dcroat Yacute -50 -KPX Dcroat Ydieresis -50 -KPX F A -100 -KPX F Aacute -100 -KPX F Abreve -100 -KPX F Acircumflex -100 -KPX F Adieresis -100 -KPX F Agrave -100 -KPX F Amacron -100 -KPX F Aogonek -100 -KPX F Aring -100 -KPX F Atilde -100 -KPX F a -95 -KPX F aacute -95 -KPX F abreve -95 -KPX F acircumflex -95 -KPX F adieresis -95 -KPX F agrave -95 -KPX F amacron -95 -KPX F aogonek -95 -KPX F aring -95 -KPX F atilde -95 -KPX F comma -129 -KPX F e -100 -KPX F eacute -100 -KPX F ecaron -100 -KPX F ecircumflex -100 -KPX F edieresis -100 -KPX F edotaccent -100 -KPX F egrave -100 -KPX F emacron -100 -KPX F eogonek -100 -KPX F i -40 -KPX F iacute -40 -KPX F icircumflex -40 -KPX F idieresis -40 -KPX F igrave -40 -KPX F imacron -40 -KPX F iogonek -40 -KPX F o -70 -KPX F oacute -70 -KPX F ocircumflex -70 -KPX F odieresis -70 -KPX F ograve -70 -KPX F ohungarumlaut -70 -KPX F omacron -70 -KPX F oslash -70 -KPX F otilde -70 -KPX F period -129 -KPX F r -50 -KPX F racute -50 -KPX F rcaron -50 -KPX F rcommaaccent -50 -KPX J A -25 -KPX J Aacute -25 -KPX J Abreve -25 -KPX J Acircumflex -25 -KPX J Adieresis -25 -KPX J Agrave -25 -KPX J Amacron -25 -KPX J Aogonek -25 -KPX J Aring -25 -KPX J Atilde -25 -KPX J a -40 -KPX J aacute -40 -KPX J abreve -40 -KPX J acircumflex -40 -KPX J adieresis -40 -KPX J agrave -40 -KPX J amacron -40 -KPX J aogonek -40 -KPX J aring -40 -KPX J atilde -40 -KPX J comma -10 -KPX J e -40 -KPX J eacute -40 -KPX J ecaron -40 -KPX J ecircumflex -40 -KPX J edieresis -40 -KPX J edotaccent -40 -KPX J egrave -40 -KPX J emacron -40 -KPX J eogonek -40 -KPX J o -40 -KPX J oacute -40 -KPX J ocircumflex -40 -KPX J odieresis -40 -KPX J ograve -40 -KPX J ohungarumlaut -40 -KPX J omacron -40 -KPX J oslash -40 -KPX J otilde -40 -KPX J period -10 -KPX J u -40 -KPX J uacute -40 -KPX J ucircumflex -40 -KPX J udieresis -40 -KPX J ugrave -40 -KPX J uhungarumlaut -40 -KPX J umacron -40 -KPX J uogonek -40 -KPX J uring -40 -KPX K O -30 -KPX K Oacute -30 -KPX K Ocircumflex -30 -KPX K Odieresis -30 -KPX K Ograve -30 -KPX K Ohungarumlaut -30 -KPX K Omacron -30 -KPX K Oslash -30 -KPX K Otilde -30 -KPX K e -25 -KPX K eacute -25 -KPX K ecaron -25 -KPX K ecircumflex -25 -KPX K edieresis -25 -KPX K edotaccent -25 -KPX K egrave -25 -KPX K emacron -25 -KPX K eogonek -25 -KPX K o -25 -KPX K oacute -25 -KPX K ocircumflex -25 -KPX K odieresis -25 -KPX K ograve -25 -KPX K ohungarumlaut -25 -KPX K omacron -25 -KPX K oslash -25 -KPX K otilde -25 -KPX K u -20 -KPX K uacute -20 -KPX K ucircumflex -20 -KPX K udieresis -20 -KPX K ugrave -20 -KPX K uhungarumlaut -20 -KPX K umacron -20 -KPX K uogonek -20 -KPX K uring -20 -KPX K y -20 -KPX K yacute -20 -KPX K ydieresis -20 -KPX Kcommaaccent O -30 -KPX Kcommaaccent Oacute -30 -KPX Kcommaaccent Ocircumflex -30 -KPX Kcommaaccent Odieresis -30 -KPX Kcommaaccent Ograve -30 -KPX Kcommaaccent Ohungarumlaut -30 -KPX Kcommaaccent Omacron -30 -KPX Kcommaaccent Oslash -30 -KPX Kcommaaccent Otilde -30 -KPX Kcommaaccent e -25 -KPX Kcommaaccent eacute -25 -KPX Kcommaaccent ecaron -25 -KPX Kcommaaccent ecircumflex -25 -KPX Kcommaaccent edieresis -25 -KPX Kcommaaccent edotaccent -25 -KPX Kcommaaccent egrave -25 -KPX Kcommaaccent emacron -25 -KPX Kcommaaccent eogonek -25 -KPX Kcommaaccent o -25 -KPX Kcommaaccent oacute -25 -KPX Kcommaaccent ocircumflex -25 -KPX Kcommaaccent odieresis -25 -KPX Kcommaaccent ograve -25 -KPX Kcommaaccent ohungarumlaut -25 -KPX Kcommaaccent omacron -25 -KPX Kcommaaccent oslash -25 -KPX Kcommaaccent otilde -25 -KPX Kcommaaccent u -20 -KPX Kcommaaccent uacute -20 -KPX Kcommaaccent ucircumflex -20 -KPX Kcommaaccent udieresis -20 -KPX Kcommaaccent ugrave -20 -KPX Kcommaaccent uhungarumlaut -20 -KPX Kcommaaccent umacron -20 -KPX Kcommaaccent uogonek -20 -KPX Kcommaaccent uring -20 -KPX Kcommaaccent y -20 -KPX Kcommaaccent yacute -20 -KPX Kcommaaccent ydieresis -20 -KPX L T -18 -KPX L Tcaron -18 -KPX L Tcommaaccent -18 -KPX L V -37 -KPX L W -37 -KPX L Y -37 -KPX L Yacute -37 -KPX L Ydieresis -37 -KPX L quoteright -55 -KPX L y -37 -KPX L yacute -37 -KPX L ydieresis -37 -KPX Lacute T -18 -KPX Lacute Tcaron -18 -KPX Lacute Tcommaaccent -18 -KPX Lacute V -37 -KPX Lacute W -37 -KPX Lacute Y -37 -KPX Lacute Yacute -37 -KPX Lacute Ydieresis -37 -KPX Lacute quoteright -55 -KPX Lacute y -37 -KPX Lacute yacute -37 -KPX Lacute ydieresis -37 -KPX Lcommaaccent T -18 -KPX Lcommaaccent Tcaron -18 -KPX Lcommaaccent Tcommaaccent -18 -KPX Lcommaaccent V -37 -KPX Lcommaaccent W -37 -KPX Lcommaaccent Y -37 -KPX Lcommaaccent Yacute -37 -KPX Lcommaaccent Ydieresis -37 -KPX Lcommaaccent quoteright -55 -KPX Lcommaaccent y -37 -KPX Lcommaaccent yacute -37 -KPX Lcommaaccent ydieresis -37 -KPX Lslash T -18 -KPX Lslash Tcaron -18 -KPX Lslash Tcommaaccent -18 -KPX Lslash V -37 -KPX Lslash W -37 -KPX Lslash Y -37 -KPX Lslash Yacute -37 -KPX Lslash Ydieresis -37 -KPX Lslash quoteright -55 -KPX Lslash y -37 -KPX Lslash yacute -37 -KPX Lslash ydieresis -37 -KPX N A -30 -KPX N Aacute -30 -KPX N Abreve -30 -KPX N Acircumflex -30 -KPX N Adieresis -30 -KPX N Agrave -30 -KPX N Amacron -30 -KPX N Aogonek -30 -KPX N Aring -30 -KPX N Atilde -30 -KPX Nacute A -30 -KPX Nacute Aacute -30 -KPX Nacute Abreve -30 -KPX Nacute Acircumflex -30 -KPX Nacute Adieresis -30 -KPX Nacute Agrave -30 -KPX Nacute Amacron -30 -KPX Nacute Aogonek -30 -KPX Nacute Aring -30 -KPX Nacute Atilde -30 -KPX Ncaron A -30 -KPX Ncaron Aacute -30 -KPX Ncaron Abreve -30 -KPX Ncaron Acircumflex -30 -KPX Ncaron Adieresis -30 -KPX Ncaron Agrave -30 -KPX Ncaron Amacron -30 -KPX Ncaron Aogonek -30 -KPX Ncaron Aring -30 -KPX Ncaron Atilde -30 -KPX Ncommaaccent A -30 -KPX Ncommaaccent Aacute -30 -KPX Ncommaaccent Abreve -30 -KPX Ncommaaccent Acircumflex -30 -KPX Ncommaaccent Adieresis -30 -KPX Ncommaaccent Agrave -30 -KPX Ncommaaccent Amacron -30 -KPX Ncommaaccent Aogonek -30 -KPX Ncommaaccent Aring -30 -KPX Ncommaaccent Atilde -30 -KPX Ntilde A -30 -KPX Ntilde Aacute -30 -KPX Ntilde Abreve -30 -KPX Ntilde Acircumflex -30 -KPX Ntilde Adieresis -30 -KPX Ntilde Agrave -30 -KPX Ntilde Amacron -30 -KPX Ntilde Aogonek -30 -KPX Ntilde Aring -30 -KPX Ntilde Atilde -30 -KPX O A -40 -KPX O Aacute -40 -KPX O Abreve -40 -KPX O Acircumflex -40 -KPX O Adieresis -40 -KPX O Agrave -40 -KPX O Amacron -40 -KPX O Aogonek -40 -KPX O Aring -40 -KPX O Atilde -40 -KPX O T -40 -KPX O Tcaron -40 -KPX O Tcommaaccent -40 -KPX O V -50 -KPX O W -50 -KPX O X -40 -KPX O Y -50 -KPX O Yacute -50 -KPX O Ydieresis -50 -KPX Oacute A -40 -KPX Oacute Aacute -40 -KPX Oacute Abreve -40 -KPX Oacute Acircumflex -40 -KPX Oacute Adieresis -40 -KPX Oacute Agrave -40 -KPX Oacute Amacron -40 -KPX Oacute Aogonek -40 -KPX Oacute Aring -40 -KPX Oacute Atilde -40 -KPX Oacute T -40 -KPX Oacute Tcaron -40 -KPX Oacute Tcommaaccent -40 -KPX Oacute V -50 -KPX Oacute W -50 -KPX Oacute X -40 -KPX Oacute Y -50 -KPX Oacute Yacute -50 -KPX Oacute Ydieresis -50 -KPX Ocircumflex A -40 -KPX Ocircumflex Aacute -40 -KPX Ocircumflex Abreve -40 -KPX Ocircumflex Acircumflex -40 -KPX Ocircumflex Adieresis -40 -KPX Ocircumflex Agrave -40 -KPX Ocircumflex Amacron -40 -KPX Ocircumflex Aogonek -40 -KPX Ocircumflex Aring -40 -KPX Ocircumflex Atilde -40 -KPX Ocircumflex T -40 -KPX Ocircumflex Tcaron -40 -KPX Ocircumflex Tcommaaccent -40 -KPX Ocircumflex V -50 -KPX Ocircumflex W -50 -KPX Ocircumflex X -40 -KPX Ocircumflex Y -50 -KPX Ocircumflex Yacute -50 -KPX Ocircumflex Ydieresis -50 -KPX Odieresis A -40 -KPX Odieresis Aacute -40 -KPX Odieresis Abreve -40 -KPX Odieresis Acircumflex -40 -KPX Odieresis Adieresis -40 -KPX Odieresis Agrave -40 -KPX Odieresis Amacron -40 -KPX Odieresis Aogonek -40 -KPX Odieresis Aring -40 -KPX Odieresis Atilde -40 -KPX Odieresis T -40 -KPX Odieresis Tcaron -40 -KPX Odieresis Tcommaaccent -40 -KPX Odieresis V -50 -KPX Odieresis W -50 -KPX Odieresis X -40 -KPX Odieresis Y -50 -KPX Odieresis Yacute -50 -KPX Odieresis Ydieresis -50 -KPX Ograve A -40 -KPX Ograve Aacute -40 -KPX Ograve Abreve -40 -KPX Ograve Acircumflex -40 -KPX Ograve Adieresis -40 -KPX Ograve Agrave -40 -KPX Ograve Amacron -40 -KPX Ograve Aogonek -40 -KPX Ograve Aring -40 -KPX Ograve Atilde -40 -KPX Ograve T -40 -KPX Ograve Tcaron -40 -KPX Ograve Tcommaaccent -40 -KPX Ograve V -50 -KPX Ograve W -50 -KPX Ograve X -40 -KPX Ograve Y -50 -KPX Ograve Yacute -50 -KPX Ograve Ydieresis -50 -KPX Ohungarumlaut A -40 -KPX Ohungarumlaut Aacute -40 -KPX Ohungarumlaut Abreve -40 -KPX Ohungarumlaut Acircumflex -40 -KPX Ohungarumlaut Adieresis -40 -KPX Ohungarumlaut Agrave -40 -KPX Ohungarumlaut Amacron -40 -KPX Ohungarumlaut Aogonek -40 -KPX Ohungarumlaut Aring -40 -KPX Ohungarumlaut Atilde -40 -KPX Ohungarumlaut T -40 -KPX Ohungarumlaut Tcaron -40 -KPX Ohungarumlaut Tcommaaccent -40 -KPX Ohungarumlaut V -50 -KPX Ohungarumlaut W -50 -KPX Ohungarumlaut X -40 -KPX Ohungarumlaut Y -50 -KPX Ohungarumlaut Yacute -50 -KPX Ohungarumlaut Ydieresis -50 -KPX Omacron A -40 -KPX Omacron Aacute -40 -KPX Omacron Abreve -40 -KPX Omacron Acircumflex -40 -KPX Omacron Adieresis -40 -KPX Omacron Agrave -40 -KPX Omacron Amacron -40 -KPX Omacron Aogonek -40 -KPX Omacron Aring -40 -KPX Omacron Atilde -40 -KPX Omacron T -40 -KPX Omacron Tcaron -40 -KPX Omacron Tcommaaccent -40 -KPX Omacron V -50 -KPX Omacron W -50 -KPX Omacron X -40 -KPX Omacron Y -50 -KPX Omacron Yacute -50 -KPX Omacron Ydieresis -50 -KPX Oslash A -40 -KPX Oslash Aacute -40 -KPX Oslash Abreve -40 -KPX Oslash Acircumflex -40 -KPX Oslash Adieresis -40 -KPX Oslash Agrave -40 -KPX Oslash Amacron -40 -KPX Oslash Aogonek -40 -KPX Oslash Aring -40 -KPX Oslash Atilde -40 -KPX Oslash T -40 -KPX Oslash Tcaron -40 -KPX Oslash Tcommaaccent -40 -KPX Oslash V -50 -KPX Oslash W -50 -KPX Oslash X -40 -KPX Oslash Y -50 -KPX Oslash Yacute -50 -KPX Oslash Ydieresis -50 -KPX Otilde A -40 -KPX Otilde Aacute -40 -KPX Otilde Abreve -40 -KPX Otilde Acircumflex -40 -KPX Otilde Adieresis -40 -KPX Otilde Agrave -40 -KPX Otilde Amacron -40 -KPX Otilde Aogonek -40 -KPX Otilde Aring -40 -KPX Otilde Atilde -40 -KPX Otilde T -40 -KPX Otilde Tcaron -40 -KPX Otilde Tcommaaccent -40 -KPX Otilde V -50 -KPX Otilde W -50 -KPX Otilde X -40 -KPX Otilde Y -50 -KPX Otilde Yacute -50 -KPX Otilde Ydieresis -50 -KPX P A -85 -KPX P Aacute -85 -KPX P Abreve -85 -KPX P Acircumflex -85 -KPX P Adieresis -85 -KPX P Agrave -85 -KPX P Amacron -85 -KPX P Aogonek -85 -KPX P Aring -85 -KPX P Atilde -85 -KPX P a -40 -KPX P aacute -40 -KPX P abreve -40 -KPX P acircumflex -40 -KPX P adieresis -40 -KPX P agrave -40 -KPX P amacron -40 -KPX P aogonek -40 -KPX P aring -40 -KPX P atilde -40 -KPX P comma -129 -KPX P e -50 -KPX P eacute -50 -KPX P ecaron -50 -KPX P ecircumflex -50 -KPX P edieresis -50 -KPX P edotaccent -50 -KPX P egrave -50 -KPX P emacron -50 -KPX P eogonek -50 -KPX P o -55 -KPX P oacute -55 -KPX P ocircumflex -55 -KPX P odieresis -55 -KPX P ograve -55 -KPX P ohungarumlaut -55 -KPX P omacron -55 -KPX P oslash -55 -KPX P otilde -55 -KPX P period -129 -KPX Q U -10 -KPX Q Uacute -10 -KPX Q Ucircumflex -10 -KPX Q Udieresis -10 -KPX Q Ugrave -10 -KPX Q Uhungarumlaut -10 -KPX Q Umacron -10 -KPX Q Uogonek -10 -KPX Q Uring -10 -KPX R O -40 -KPX R Oacute -40 -KPX R Ocircumflex -40 -KPX R Odieresis -40 -KPX R Ograve -40 -KPX R Ohungarumlaut -40 -KPX R Omacron -40 -KPX R Oslash -40 -KPX R Otilde -40 -KPX R T -30 -KPX R Tcaron -30 -KPX R Tcommaaccent -30 -KPX R U -40 -KPX R Uacute -40 -KPX R Ucircumflex -40 -KPX R Udieresis -40 -KPX R Ugrave -40 -KPX R Uhungarumlaut -40 -KPX R Umacron -40 -KPX R Uogonek -40 -KPX R Uring -40 -KPX R V -18 -KPX R W -18 -KPX R Y -18 -KPX R Yacute -18 -KPX R Ydieresis -18 -KPX Racute O -40 -KPX Racute Oacute -40 -KPX Racute Ocircumflex -40 -KPX Racute Odieresis -40 -KPX Racute Ograve -40 -KPX Racute Ohungarumlaut -40 -KPX Racute Omacron -40 -KPX Racute Oslash -40 -KPX Racute Otilde -40 -KPX Racute T -30 -KPX Racute Tcaron -30 -KPX Racute Tcommaaccent -30 -KPX Racute U -40 -KPX Racute Uacute -40 -KPX Racute Ucircumflex -40 -KPX Racute Udieresis -40 -KPX Racute Ugrave -40 -KPX Racute Uhungarumlaut -40 -KPX Racute Umacron -40 -KPX Racute Uogonek -40 -KPX Racute Uring -40 -KPX Racute V -18 -KPX Racute W -18 -KPX Racute Y -18 -KPX Racute Yacute -18 -KPX Racute Ydieresis -18 -KPX Rcaron O -40 -KPX Rcaron Oacute -40 -KPX Rcaron Ocircumflex -40 -KPX Rcaron Odieresis -40 -KPX Rcaron Ograve -40 -KPX Rcaron Ohungarumlaut -40 -KPX Rcaron Omacron -40 -KPX Rcaron Oslash -40 -KPX Rcaron Otilde -40 -KPX Rcaron T -30 -KPX Rcaron Tcaron -30 -KPX Rcaron Tcommaaccent -30 -KPX Rcaron U -40 -KPX Rcaron Uacute -40 -KPX Rcaron Ucircumflex -40 -KPX Rcaron Udieresis -40 -KPX Rcaron Ugrave -40 -KPX Rcaron Uhungarumlaut -40 -KPX Rcaron Umacron -40 -KPX Rcaron Uogonek -40 -KPX Rcaron Uring -40 -KPX Rcaron V -18 -KPX Rcaron W -18 -KPX Rcaron Y -18 -KPX Rcaron Yacute -18 -KPX Rcaron Ydieresis -18 -KPX Rcommaaccent O -40 -KPX Rcommaaccent Oacute -40 -KPX Rcommaaccent Ocircumflex -40 -KPX Rcommaaccent Odieresis -40 -KPX Rcommaaccent Ograve -40 -KPX Rcommaaccent Ohungarumlaut -40 -KPX Rcommaaccent Omacron -40 -KPX Rcommaaccent Oslash -40 -KPX Rcommaaccent Otilde -40 -KPX Rcommaaccent T -30 -KPX Rcommaaccent Tcaron -30 -KPX Rcommaaccent Tcommaaccent -30 -KPX Rcommaaccent U -40 -KPX Rcommaaccent Uacute -40 -KPX Rcommaaccent Ucircumflex -40 -KPX Rcommaaccent Udieresis -40 -KPX Rcommaaccent Ugrave -40 -KPX Rcommaaccent Uhungarumlaut -40 -KPX Rcommaaccent Umacron -40 -KPX Rcommaaccent Uogonek -40 -KPX Rcommaaccent Uring -40 -KPX Rcommaaccent V -18 -KPX Rcommaaccent W -18 -KPX Rcommaaccent Y -18 -KPX Rcommaaccent Yacute -18 -KPX Rcommaaccent Ydieresis -18 -KPX T A -55 -KPX T Aacute -55 -KPX T Abreve -55 -KPX T Acircumflex -55 -KPX T Adieresis -55 -KPX T Agrave -55 -KPX T Amacron -55 -KPX T Aogonek -55 -KPX T Aring -55 -KPX T Atilde -55 -KPX T O -18 -KPX T Oacute -18 -KPX T Ocircumflex -18 -KPX T Odieresis -18 -KPX T Ograve -18 -KPX T Ohungarumlaut -18 -KPX T Omacron -18 -KPX T Oslash -18 -KPX T Otilde -18 -KPX T a -92 -KPX T aacute -92 -KPX T abreve -92 -KPX T acircumflex -92 -KPX T adieresis -92 -KPX T agrave -92 -KPX T amacron -92 -KPX T aogonek -92 -KPX T aring -92 -KPX T atilde -92 -KPX T colon -74 -KPX T comma -92 -KPX T e -92 -KPX T eacute -92 -KPX T ecaron -92 -KPX T ecircumflex -92 -KPX T edieresis -52 -KPX T edotaccent -92 -KPX T egrave -52 -KPX T emacron -52 -KPX T eogonek -92 -KPX T hyphen -92 -KPX T i -37 -KPX T iacute -37 -KPX T iogonek -37 -KPX T o -95 -KPX T oacute -95 -KPX T ocircumflex -95 -KPX T odieresis -95 -KPX T ograve -95 -KPX T ohungarumlaut -95 -KPX T omacron -95 -KPX T oslash -95 -KPX T otilde -95 -KPX T period -92 -KPX T r -37 -KPX T racute -37 -KPX T rcaron -37 -KPX T rcommaaccent -37 -KPX T semicolon -74 -KPX T u -37 -KPX T uacute -37 -KPX T ucircumflex -37 -KPX T udieresis -37 -KPX T ugrave -37 -KPX T uhungarumlaut -37 -KPX T umacron -37 -KPX T uogonek -37 -KPX T uring -37 -KPX T w -37 -KPX T y -37 -KPX T yacute -37 -KPX T ydieresis -37 -KPX Tcaron A -55 -KPX Tcaron Aacute -55 -KPX Tcaron Abreve -55 -KPX Tcaron Acircumflex -55 -KPX Tcaron Adieresis -55 -KPX Tcaron Agrave -55 -KPX Tcaron Amacron -55 -KPX Tcaron Aogonek -55 -KPX Tcaron Aring -55 -KPX Tcaron Atilde -55 -KPX Tcaron O -18 -KPX Tcaron Oacute -18 -KPX Tcaron Ocircumflex -18 -KPX Tcaron Odieresis -18 -KPX Tcaron Ograve -18 -KPX Tcaron Ohungarumlaut -18 -KPX Tcaron Omacron -18 -KPX Tcaron Oslash -18 -KPX Tcaron Otilde -18 -KPX Tcaron a -92 -KPX Tcaron aacute -92 -KPX Tcaron abreve -92 -KPX Tcaron acircumflex -92 -KPX Tcaron adieresis -92 -KPX Tcaron agrave -92 -KPX Tcaron amacron -92 -KPX Tcaron aogonek -92 -KPX Tcaron aring -92 -KPX Tcaron atilde -92 -KPX Tcaron colon -74 -KPX Tcaron comma -92 -KPX Tcaron e -92 -KPX Tcaron eacute -92 -KPX Tcaron ecaron -92 -KPX Tcaron ecircumflex -92 -KPX Tcaron edieresis -52 -KPX Tcaron edotaccent -92 -KPX Tcaron egrave -52 -KPX Tcaron emacron -52 -KPX Tcaron eogonek -92 -KPX Tcaron hyphen -92 -KPX Tcaron i -37 -KPX Tcaron iacute -37 -KPX Tcaron iogonek -37 -KPX Tcaron o -95 -KPX Tcaron oacute -95 -KPX Tcaron ocircumflex -95 -KPX Tcaron odieresis -95 -KPX Tcaron ograve -95 -KPX Tcaron ohungarumlaut -95 -KPX Tcaron omacron -95 -KPX Tcaron oslash -95 -KPX Tcaron otilde -95 -KPX Tcaron period -92 -KPX Tcaron r -37 -KPX Tcaron racute -37 -KPX Tcaron rcaron -37 -KPX Tcaron rcommaaccent -37 -KPX Tcaron semicolon -74 -KPX Tcaron u -37 -KPX Tcaron uacute -37 -KPX Tcaron ucircumflex -37 -KPX Tcaron udieresis -37 -KPX Tcaron ugrave -37 -KPX Tcaron uhungarumlaut -37 -KPX Tcaron umacron -37 -KPX Tcaron uogonek -37 -KPX Tcaron uring -37 -KPX Tcaron w -37 -KPX Tcaron y -37 -KPX Tcaron yacute -37 -KPX Tcaron ydieresis -37 -KPX Tcommaaccent A -55 -KPX Tcommaaccent Aacute -55 -KPX Tcommaaccent Abreve -55 -KPX Tcommaaccent Acircumflex -55 -KPX Tcommaaccent Adieresis -55 -KPX Tcommaaccent Agrave -55 -KPX Tcommaaccent Amacron -55 -KPX Tcommaaccent Aogonek -55 -KPX Tcommaaccent Aring -55 -KPX Tcommaaccent Atilde -55 -KPX Tcommaaccent O -18 -KPX Tcommaaccent Oacute -18 -KPX Tcommaaccent Ocircumflex -18 -KPX Tcommaaccent Odieresis -18 -KPX Tcommaaccent Ograve -18 -KPX Tcommaaccent Ohungarumlaut -18 -KPX Tcommaaccent Omacron -18 -KPX Tcommaaccent Oslash -18 -KPX Tcommaaccent Otilde -18 -KPX Tcommaaccent a -92 -KPX Tcommaaccent aacute -92 -KPX Tcommaaccent abreve -92 -KPX Tcommaaccent acircumflex -92 -KPX Tcommaaccent adieresis -92 -KPX Tcommaaccent agrave -92 -KPX Tcommaaccent amacron -92 -KPX Tcommaaccent aogonek -92 -KPX Tcommaaccent aring -92 -KPX Tcommaaccent atilde -92 -KPX Tcommaaccent colon -74 -KPX Tcommaaccent comma -92 -KPX Tcommaaccent e -92 -KPX Tcommaaccent eacute -92 -KPX Tcommaaccent ecaron -92 -KPX Tcommaaccent ecircumflex -92 -KPX Tcommaaccent edieresis -52 -KPX Tcommaaccent edotaccent -92 -KPX Tcommaaccent egrave -52 -KPX Tcommaaccent emacron -52 -KPX Tcommaaccent eogonek -92 -KPX Tcommaaccent hyphen -92 -KPX Tcommaaccent i -37 -KPX Tcommaaccent iacute -37 -KPX Tcommaaccent iogonek -37 -KPX Tcommaaccent o -95 -KPX Tcommaaccent oacute -95 -KPX Tcommaaccent ocircumflex -95 -KPX Tcommaaccent odieresis -95 -KPX Tcommaaccent ograve -95 -KPX Tcommaaccent ohungarumlaut -95 -KPX Tcommaaccent omacron -95 -KPX Tcommaaccent oslash -95 -KPX Tcommaaccent otilde -95 -KPX Tcommaaccent period -92 -KPX Tcommaaccent r -37 -KPX Tcommaaccent racute -37 -KPX Tcommaaccent rcaron -37 -KPX Tcommaaccent rcommaaccent -37 -KPX Tcommaaccent semicolon -74 -KPX Tcommaaccent u -37 -KPX Tcommaaccent uacute -37 -KPX Tcommaaccent ucircumflex -37 -KPX Tcommaaccent udieresis -37 -KPX Tcommaaccent ugrave -37 -KPX Tcommaaccent uhungarumlaut -37 -KPX Tcommaaccent umacron -37 -KPX Tcommaaccent uogonek -37 -KPX Tcommaaccent uring -37 -KPX Tcommaaccent w -37 -KPX Tcommaaccent y -37 -KPX Tcommaaccent yacute -37 -KPX Tcommaaccent ydieresis -37 -KPX U A -45 -KPX U Aacute -45 -KPX U Abreve -45 -KPX U Acircumflex -45 -KPX U Adieresis -45 -KPX U Agrave -45 -KPX U Amacron -45 -KPX U Aogonek -45 -KPX U Aring -45 -KPX U Atilde -45 -KPX Uacute A -45 -KPX Uacute Aacute -45 -KPX Uacute Abreve -45 -KPX Uacute Acircumflex -45 -KPX Uacute Adieresis -45 -KPX Uacute Agrave -45 -KPX Uacute Amacron -45 -KPX Uacute Aogonek -45 -KPX Uacute Aring -45 -KPX Uacute Atilde -45 -KPX Ucircumflex A -45 -KPX Ucircumflex Aacute -45 -KPX Ucircumflex Abreve -45 -KPX Ucircumflex Acircumflex -45 -KPX Ucircumflex Adieresis -45 -KPX Ucircumflex Agrave -45 -KPX Ucircumflex Amacron -45 -KPX Ucircumflex Aogonek -45 -KPX Ucircumflex Aring -45 -KPX Ucircumflex Atilde -45 -KPX Udieresis A -45 -KPX Udieresis Aacute -45 -KPX Udieresis Abreve -45 -KPX Udieresis Acircumflex -45 -KPX Udieresis Adieresis -45 -KPX Udieresis Agrave -45 -KPX Udieresis Amacron -45 -KPX Udieresis Aogonek -45 -KPX Udieresis Aring -45 -KPX Udieresis Atilde -45 -KPX Ugrave A -45 -KPX Ugrave Aacute -45 -KPX Ugrave Abreve -45 -KPX Ugrave Acircumflex -45 -KPX Ugrave Adieresis -45 -KPX Ugrave Agrave -45 -KPX Ugrave Amacron -45 -KPX Ugrave Aogonek -45 -KPX Ugrave Aring -45 -KPX Ugrave Atilde -45 -KPX Uhungarumlaut A -45 -KPX Uhungarumlaut Aacute -45 -KPX Uhungarumlaut Abreve -45 -KPX Uhungarumlaut Acircumflex -45 -KPX Uhungarumlaut Adieresis -45 -KPX Uhungarumlaut Agrave -45 -KPX Uhungarumlaut Amacron -45 -KPX Uhungarumlaut Aogonek -45 -KPX Uhungarumlaut Aring -45 -KPX Uhungarumlaut Atilde -45 -KPX Umacron A -45 -KPX Umacron Aacute -45 -KPX Umacron Abreve -45 -KPX Umacron Acircumflex -45 -KPX Umacron Adieresis -45 -KPX Umacron Agrave -45 -KPX Umacron Amacron -45 -KPX Umacron Aogonek -45 -KPX Umacron Aring -45 -KPX Umacron Atilde -45 -KPX Uogonek A -45 -KPX Uogonek Aacute -45 -KPX Uogonek Abreve -45 -KPX Uogonek Acircumflex -45 -KPX Uogonek Adieresis -45 -KPX Uogonek Agrave -45 -KPX Uogonek Amacron -45 -KPX Uogonek Aogonek -45 -KPX Uogonek Aring -45 -KPX Uogonek Atilde -45 -KPX Uring A -45 -KPX Uring Aacute -45 -KPX Uring Abreve -45 -KPX Uring Acircumflex -45 -KPX Uring Adieresis -45 -KPX Uring Agrave -45 -KPX Uring Amacron -45 -KPX Uring Aogonek -45 -KPX Uring Aring -45 -KPX Uring Atilde -45 -KPX V A -85 -KPX V Aacute -85 -KPX V Abreve -85 -KPX V Acircumflex -85 -KPX V Adieresis -85 -KPX V Agrave -85 -KPX V Amacron -85 -KPX V Aogonek -85 -KPX V Aring -85 -KPX V Atilde -85 -KPX V G -10 -KPX V Gbreve -10 -KPX V Gcommaaccent -10 -KPX V O -30 -KPX V Oacute -30 -KPX V Ocircumflex -30 -KPX V Odieresis -30 -KPX V Ograve -30 -KPX V Ohungarumlaut -30 -KPX V Omacron -30 -KPX V Oslash -30 -KPX V Otilde -30 -KPX V a -111 -KPX V aacute -111 -KPX V abreve -111 -KPX V acircumflex -111 -KPX V adieresis -111 -KPX V agrave -111 -KPX V amacron -111 -KPX V aogonek -111 -KPX V aring -111 -KPX V atilde -111 -KPX V colon -74 -KPX V comma -129 -KPX V e -111 -KPX V eacute -111 -KPX V ecaron -111 -KPX V ecircumflex -111 -KPX V edieresis -71 -KPX V edotaccent -111 -KPX V egrave -71 -KPX V emacron -71 -KPX V eogonek -111 -KPX V hyphen -70 -KPX V i -55 -KPX V iacute -55 -KPX V iogonek -55 -KPX V o -111 -KPX V oacute -111 -KPX V ocircumflex -111 -KPX V odieresis -111 -KPX V ograve -111 -KPX V ohungarumlaut -111 -KPX V omacron -111 -KPX V oslash -111 -KPX V otilde -111 -KPX V period -129 -KPX V semicolon -74 -KPX V u -55 -KPX V uacute -55 -KPX V ucircumflex -55 -KPX V udieresis -55 -KPX V ugrave -55 -KPX V uhungarumlaut -55 -KPX V umacron -55 -KPX V uogonek -55 -KPX V uring -55 -KPX W A -74 -KPX W Aacute -74 -KPX W Abreve -74 -KPX W Acircumflex -74 -KPX W Adieresis -74 -KPX W Agrave -74 -KPX W Amacron -74 -KPX W Aogonek -74 -KPX W Aring -74 -KPX W Atilde -74 -KPX W O -15 -KPX W Oacute -15 -KPX W Ocircumflex -15 -KPX W Odieresis -15 -KPX W Ograve -15 -KPX W Ohungarumlaut -15 -KPX W Omacron -15 -KPX W Oslash -15 -KPX W Otilde -15 -KPX W a -85 -KPX W aacute -85 -KPX W abreve -85 -KPX W acircumflex -85 -KPX W adieresis -85 -KPX W agrave -85 -KPX W amacron -85 -KPX W aogonek -85 -KPX W aring -85 -KPX W atilde -85 -KPX W colon -55 -KPX W comma -74 -KPX W e -90 -KPX W eacute -90 -KPX W ecaron -90 -KPX W ecircumflex -90 -KPX W edieresis -50 -KPX W edotaccent -90 -KPX W egrave -50 -KPX W emacron -50 -KPX W eogonek -90 -KPX W hyphen -50 -KPX W i -37 -KPX W iacute -37 -KPX W iogonek -37 -KPX W o -80 -KPX W oacute -80 -KPX W ocircumflex -80 -KPX W odieresis -80 -KPX W ograve -80 -KPX W ohungarumlaut -80 -KPX W omacron -80 -KPX W oslash -80 -KPX W otilde -80 -KPX W period -74 -KPX W semicolon -55 -KPX W u -55 -KPX W uacute -55 -KPX W ucircumflex -55 -KPX W udieresis -55 -KPX W ugrave -55 -KPX W uhungarumlaut -55 -KPX W umacron -55 -KPX W uogonek -55 -KPX W uring -55 -KPX W y -55 -KPX W yacute -55 -KPX W ydieresis -55 -KPX Y A -74 -KPX Y Aacute -74 -KPX Y Abreve -74 -KPX Y Acircumflex -74 -KPX Y Adieresis -74 -KPX Y Agrave -74 -KPX Y Amacron -74 -KPX Y Aogonek -74 -KPX Y Aring -74 -KPX Y Atilde -74 -KPX Y O -25 -KPX Y Oacute -25 -KPX Y Ocircumflex -25 -KPX Y Odieresis -25 -KPX Y Ograve -25 -KPX Y Ohungarumlaut -25 -KPX Y Omacron -25 -KPX Y Oslash -25 -KPX Y Otilde -25 -KPX Y a -92 -KPX Y aacute -92 -KPX Y abreve -92 -KPX Y acircumflex -92 -KPX Y adieresis -92 -KPX Y agrave -92 -KPX Y amacron -92 -KPX Y aogonek -92 -KPX Y aring -92 -KPX Y atilde -92 -KPX Y colon -92 -KPX Y comma -92 -KPX Y e -111 -KPX Y eacute -111 -KPX Y ecaron -111 -KPX Y ecircumflex -71 -KPX Y edieresis -71 -KPX Y edotaccent -111 -KPX Y egrave -71 -KPX Y emacron -71 -KPX Y eogonek -111 -KPX Y hyphen -92 -KPX Y i -55 -KPX Y iacute -55 -KPX Y iogonek -55 -KPX Y o -111 -KPX Y oacute -111 -KPX Y ocircumflex -111 -KPX Y odieresis -111 -KPX Y ograve -111 -KPX Y ohungarumlaut -111 -KPX Y omacron -111 -KPX Y oslash -111 -KPX Y otilde -111 -KPX Y period -74 -KPX Y semicolon -92 -KPX Y u -92 -KPX Y uacute -92 -KPX Y ucircumflex -92 -KPX Y udieresis -92 -KPX Y ugrave -92 -KPX Y uhungarumlaut -92 -KPX Y umacron -92 -KPX Y uogonek -92 -KPX Y uring -92 -KPX Yacute A -74 -KPX Yacute Aacute -74 -KPX Yacute Abreve -74 -KPX Yacute Acircumflex -74 -KPX Yacute Adieresis -74 -KPX Yacute Agrave -74 -KPX Yacute Amacron -74 -KPX Yacute Aogonek -74 -KPX Yacute Aring -74 -KPX Yacute Atilde -74 -KPX Yacute O -25 -KPX Yacute Oacute -25 -KPX Yacute Ocircumflex -25 -KPX Yacute Odieresis -25 -KPX Yacute Ograve -25 -KPX Yacute Ohungarumlaut -25 -KPX Yacute Omacron -25 -KPX Yacute Oslash -25 -KPX Yacute Otilde -25 -KPX Yacute a -92 -KPX Yacute aacute -92 -KPX Yacute abreve -92 -KPX Yacute acircumflex -92 -KPX Yacute adieresis -92 -KPX Yacute agrave -92 -KPX Yacute amacron -92 -KPX Yacute aogonek -92 -KPX Yacute aring -92 -KPX Yacute atilde -92 -KPX Yacute colon -92 -KPX Yacute comma -92 -KPX Yacute e -111 -KPX Yacute eacute -111 -KPX Yacute ecaron -111 -KPX Yacute ecircumflex -71 -KPX Yacute edieresis -71 -KPX Yacute edotaccent -111 -KPX Yacute egrave -71 -KPX Yacute emacron -71 -KPX Yacute eogonek -111 -KPX Yacute hyphen -92 -KPX Yacute i -55 -KPX Yacute iacute -55 -KPX Yacute iogonek -55 -KPX Yacute o -111 -KPX Yacute oacute -111 -KPX Yacute ocircumflex -111 -KPX Yacute odieresis -111 -KPX Yacute ograve -111 -KPX Yacute ohungarumlaut -111 -KPX Yacute omacron -111 -KPX Yacute oslash -111 -KPX Yacute otilde -111 -KPX Yacute period -74 -KPX Yacute semicolon -92 -KPX Yacute u -92 -KPX Yacute uacute -92 -KPX Yacute ucircumflex -92 -KPX Yacute udieresis -92 -KPX Yacute ugrave -92 -KPX Yacute uhungarumlaut -92 -KPX Yacute umacron -92 -KPX Yacute uogonek -92 -KPX Yacute uring -92 -KPX Ydieresis A -74 -KPX Ydieresis Aacute -74 -KPX Ydieresis Abreve -74 -KPX Ydieresis Acircumflex -74 -KPX Ydieresis Adieresis -74 -KPX Ydieresis Agrave -74 -KPX Ydieresis Amacron -74 -KPX Ydieresis Aogonek -74 -KPX Ydieresis Aring -74 -KPX Ydieresis Atilde -74 -KPX Ydieresis O -25 -KPX Ydieresis Oacute -25 -KPX Ydieresis Ocircumflex -25 -KPX Ydieresis Odieresis -25 -KPX Ydieresis Ograve -25 -KPX Ydieresis Ohungarumlaut -25 -KPX Ydieresis Omacron -25 -KPX Ydieresis Oslash -25 -KPX Ydieresis Otilde -25 -KPX Ydieresis a -92 -KPX Ydieresis aacute -92 -KPX Ydieresis abreve -92 -KPX Ydieresis acircumflex -92 -KPX Ydieresis adieresis -92 -KPX Ydieresis agrave -92 -KPX Ydieresis amacron -92 -KPX Ydieresis aogonek -92 -KPX Ydieresis aring -92 -KPX Ydieresis atilde -92 -KPX Ydieresis colon -92 -KPX Ydieresis comma -92 -KPX Ydieresis e -111 -KPX Ydieresis eacute -111 -KPX Ydieresis ecaron -111 -KPX Ydieresis ecircumflex -71 -KPX Ydieresis edieresis -71 -KPX Ydieresis edotaccent -111 -KPX Ydieresis egrave -71 -KPX Ydieresis emacron -71 -KPX Ydieresis eogonek -111 -KPX Ydieresis hyphen -92 -KPX Ydieresis i -55 -KPX Ydieresis iacute -55 -KPX Ydieresis iogonek -55 -KPX Ydieresis o -111 -KPX Ydieresis oacute -111 -KPX Ydieresis ocircumflex -111 -KPX Ydieresis odieresis -111 -KPX Ydieresis ograve -111 -KPX Ydieresis ohungarumlaut -111 -KPX Ydieresis omacron -111 -KPX Ydieresis oslash -111 -KPX Ydieresis otilde -111 -KPX Ydieresis period -74 -KPX Ydieresis semicolon -92 -KPX Ydieresis u -92 -KPX Ydieresis uacute -92 -KPX Ydieresis ucircumflex -92 -KPX Ydieresis udieresis -92 -KPX Ydieresis ugrave -92 -KPX Ydieresis uhungarumlaut -92 -KPX Ydieresis umacron -92 -KPX Ydieresis uogonek -92 -KPX Ydieresis uring -92 -KPX b b -10 -KPX b period -40 -KPX b u -20 -KPX b uacute -20 -KPX b ucircumflex -20 -KPX b udieresis -20 -KPX b ugrave -20 -KPX b uhungarumlaut -20 -KPX b umacron -20 -KPX b uogonek -20 -KPX b uring -20 -KPX c h -10 -KPX c k -10 -KPX c kcommaaccent -10 -KPX cacute h -10 -KPX cacute k -10 -KPX cacute kcommaaccent -10 -KPX ccaron h -10 -KPX ccaron k -10 -KPX ccaron kcommaaccent -10 -KPX ccedilla h -10 -KPX ccedilla k -10 -KPX ccedilla kcommaaccent -10 -KPX comma quotedblright -95 -KPX comma quoteright -95 -KPX e b -10 -KPX eacute b -10 -KPX ecaron b -10 -KPX ecircumflex b -10 -KPX edieresis b -10 -KPX edotaccent b -10 -KPX egrave b -10 -KPX emacron b -10 -KPX eogonek b -10 -KPX f comma -10 -KPX f dotlessi -30 -KPX f e -10 -KPX f eacute -10 -KPX f edotaccent -10 -KPX f eogonek -10 -KPX f f -18 -KPX f o -10 -KPX f oacute -10 -KPX f ocircumflex -10 -KPX f ograve -10 -KPX f ohungarumlaut -10 -KPX f oslash -10 -KPX f otilde -10 -KPX f period -10 -KPX f quoteright 55 -KPX k e -30 -KPX k eacute -30 -KPX k ecaron -30 -KPX k ecircumflex -30 -KPX k edieresis -30 -KPX k edotaccent -30 -KPX k egrave -30 -KPX k emacron -30 -KPX k eogonek -30 -KPX k o -10 -KPX k oacute -10 -KPX k ocircumflex -10 -KPX k odieresis -10 -KPX k ograve -10 -KPX k ohungarumlaut -10 -KPX k omacron -10 -KPX k oslash -10 -KPX k otilde -10 -KPX kcommaaccent e -30 -KPX kcommaaccent eacute -30 -KPX kcommaaccent ecaron -30 -KPX kcommaaccent ecircumflex -30 -KPX kcommaaccent edieresis -30 -KPX kcommaaccent edotaccent -30 -KPX kcommaaccent egrave -30 -KPX kcommaaccent emacron -30 -KPX kcommaaccent eogonek -30 -KPX kcommaaccent o -10 -KPX kcommaaccent oacute -10 -KPX kcommaaccent ocircumflex -10 -KPX kcommaaccent odieresis -10 -KPX kcommaaccent ograve -10 -KPX kcommaaccent ohungarumlaut -10 -KPX kcommaaccent omacron -10 -KPX kcommaaccent oslash -10 -KPX kcommaaccent otilde -10 -KPX n v -40 -KPX nacute v -40 -KPX ncaron v -40 -KPX ncommaaccent v -40 -KPX ntilde v -40 -KPX o v -15 -KPX o w -25 -KPX o x -10 -KPX o y -10 -KPX o yacute -10 -KPX o ydieresis -10 -KPX oacute v -15 -KPX oacute w -25 -KPX oacute x -10 -KPX oacute y -10 -KPX oacute yacute -10 -KPX oacute ydieresis -10 -KPX ocircumflex v -15 -KPX ocircumflex w -25 -KPX ocircumflex x -10 -KPX ocircumflex y -10 -KPX ocircumflex yacute -10 -KPX ocircumflex ydieresis -10 -KPX odieresis v -15 -KPX odieresis w -25 -KPX odieresis x -10 -KPX odieresis y -10 -KPX odieresis yacute -10 -KPX odieresis ydieresis -10 -KPX ograve v -15 -KPX ograve w -25 -KPX ograve x -10 -KPX ograve y -10 -KPX ograve yacute -10 -KPX ograve ydieresis -10 -KPX ohungarumlaut v -15 -KPX ohungarumlaut w -25 -KPX ohungarumlaut x -10 -KPX ohungarumlaut y -10 -KPX ohungarumlaut yacute -10 -KPX ohungarumlaut ydieresis -10 -KPX omacron v -15 -KPX omacron w -25 -KPX omacron x -10 -KPX omacron y -10 -KPX omacron yacute -10 -KPX omacron ydieresis -10 -KPX oslash v -15 -KPX oslash w -25 -KPX oslash x -10 -KPX oslash y -10 -KPX oslash yacute -10 -KPX oslash ydieresis -10 -KPX otilde v -15 -KPX otilde w -25 -KPX otilde x -10 -KPX otilde y -10 -KPX otilde yacute -10 -KPX otilde ydieresis -10 -KPX period quotedblright -95 -KPX period quoteright -95 -KPX quoteleft quoteleft -74 -KPX quoteright d -15 -KPX quoteright dcroat -15 -KPX quoteright quoteright -74 -KPX quoteright r -15 -KPX quoteright racute -15 -KPX quoteright rcaron -15 -KPX quoteright rcommaaccent -15 -KPX quoteright s -74 -KPX quoteright sacute -74 -KPX quoteright scaron -74 -KPX quoteright scedilla -74 -KPX quoteright scommaaccent -74 -KPX quoteright space -74 -KPX quoteright t -37 -KPX quoteright tcommaaccent -37 -KPX quoteright v -15 -KPX r comma -65 -KPX r period -65 -KPX racute comma -65 -KPX racute period -65 -KPX rcaron comma -65 -KPX rcaron period -65 -KPX rcommaaccent comma -65 -KPX rcommaaccent period -65 -KPX space A -37 -KPX space Aacute -37 -KPX space Abreve -37 -KPX space Acircumflex -37 -KPX space Adieresis -37 -KPX space Agrave -37 -KPX space Amacron -37 -KPX space Aogonek -37 -KPX space Aring -37 -KPX space Atilde -37 -KPX space V -70 -KPX space W -70 -KPX space Y -70 -KPX space Yacute -70 -KPX space Ydieresis -70 -KPX v comma -37 -KPX v e -15 -KPX v eacute -15 -KPX v ecaron -15 -KPX v ecircumflex -15 -KPX v edieresis -15 -KPX v edotaccent -15 -KPX v egrave -15 -KPX v emacron -15 -KPX v eogonek -15 -KPX v o -15 -KPX v oacute -15 -KPX v ocircumflex -15 -KPX v odieresis -15 -KPX v ograve -15 -KPX v ohungarumlaut -15 -KPX v omacron -15 -KPX v oslash -15 -KPX v otilde -15 -KPX v period -37 -KPX w a -10 -KPX w aacute -10 -KPX w abreve -10 -KPX w acircumflex -10 -KPX w adieresis -10 -KPX w agrave -10 -KPX w amacron -10 -KPX w aogonek -10 -KPX w aring -10 -KPX w atilde -10 -KPX w comma -37 -KPX w e -10 -KPX w eacute -10 -KPX w ecaron -10 -KPX w ecircumflex -10 -KPX w edieresis -10 -KPX w edotaccent -10 -KPX w egrave -10 -KPX w emacron -10 -KPX w eogonek -10 -KPX w o -15 -KPX w oacute -15 -KPX w ocircumflex -15 -KPX w odieresis -15 -KPX w ograve -15 -KPX w ohungarumlaut -15 -KPX w omacron -15 -KPX w oslash -15 -KPX w otilde -15 -KPX w period -37 -KPX x e -10 -KPX x eacute -10 -KPX x ecaron -10 -KPX x ecircumflex -10 -KPX x edieresis -10 -KPX x edotaccent -10 -KPX x egrave -10 -KPX x emacron -10 -KPX x eogonek -10 -KPX y comma -37 -KPX y period -37 -KPX yacute comma -37 -KPX yacute period -37 -KPX ydieresis comma -37 -KPX ydieresis period -37 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Times-Italic.afm b/vendor/dompdf/dompdf/lib/fonts/Times-Italic.afm deleted file mode 100644 index 3d3fd8d..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Times-Italic.afm +++ /dev/null @@ -1,2669 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 1 12:56:55 1997 -Comment UniqueID 43067 -Comment VMusage 47727 58752 -FontName Times-Italic -FullName Times Italic -FamilyName Times -Weight Medium -ItalicAngle -15.5 -IsFixedPitch false -CharacterSet ExtendedRoman -FontBBox -169 -217 1010 883 -UnderlinePosition -100 -UnderlineThickness 50 -Version 002.000 -Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. -EncodingScheme WinAnsiEncoding -CapHeight 653 -XHeight 441 -Ascender 683 -Descender -217 -StdHW 32 -StdVW 76 -StartCharMetrics 317 -C 32 ; WX 250 ; N space ; B 0 0 0 0 ; -C 160 ; WX 250 ; N space ; B 0 0 0 0 ; -C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ; -C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ; -C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ; -C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ; -C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ; -C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ; -C 146 ; WX 333 ; N quoteright ; B 151 436 290 666 ; -C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ; -C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ; -C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ; -C 43 ; WX 675 ; N plus ; B 86 0 590 506 ; -C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ; -C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ; -C 173 ; WX 333 ; N hyphen ; B 49 192 282 255 ; -C 46 ; WX 250 ; N period ; B 27 -11 138 100 ; -C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ; -C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ; -C 49 ; WX 500 ; N one ; B 49 0 409 676 ; -C 50 ; WX 500 ; N two ; B 12 0 452 676 ; -C 51 ; WX 500 ; N three ; B 15 -7 465 676 ; -C 52 ; WX 500 ; N four ; B 1 0 479 676 ; -C 53 ; WX 500 ; N five ; B 15 -7 491 666 ; -C 54 ; WX 500 ; N six ; B 30 -7 521 686 ; -C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ; -C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ; -C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ; -C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ; -C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ; -C 60 ; WX 675 ; N less ; B 84 -8 592 514 ; -C 61 ; WX 675 ; N equal ; B 86 120 590 386 ; -C 62 ; WX 675 ; N greater ; B 84 -8 592 514 ; -C 63 ; WX 500 ; N question ; B 132 -12 472 664 ; -C 64 ; WX 920 ; N at ; B 118 -18 806 666 ; -C 65 ; WX 611 ; N A ; B -51 0 564 668 ; -C 66 ; WX 611 ; N B ; B -8 0 588 653 ; -C 67 ; WX 667 ; N C ; B 66 -18 689 666 ; -C 68 ; WX 722 ; N D ; B -8 0 700 653 ; -C 69 ; WX 611 ; N E ; B -1 0 634 653 ; -C 70 ; WX 611 ; N F ; B 8 0 645 653 ; -C 71 ; WX 722 ; N G ; B 52 -18 722 666 ; -C 72 ; WX 722 ; N H ; B -8 0 767 653 ; -C 73 ; WX 333 ; N I ; B -8 0 384 653 ; -C 74 ; WX 444 ; N J ; B -6 -18 491 653 ; -C 75 ; WX 667 ; N K ; B 7 0 722 653 ; -C 76 ; WX 556 ; N L ; B -8 0 559 653 ; -C 77 ; WX 833 ; N M ; B -18 0 873 653 ; -C 78 ; WX 667 ; N N ; B -20 -15 727 653 ; -C 79 ; WX 722 ; N O ; B 60 -18 699 666 ; -C 80 ; WX 611 ; N P ; B 0 0 605 653 ; -C 81 ; WX 722 ; N Q ; B 59 -182 699 666 ; -C 82 ; WX 611 ; N R ; B -13 0 588 653 ; -C 83 ; WX 500 ; N S ; B 17 -18 508 667 ; -C 84 ; WX 556 ; N T ; B 59 0 633 653 ; -C 85 ; WX 722 ; N U ; B 102 -18 765 653 ; -C 86 ; WX 611 ; N V ; B 76 -18 688 653 ; -C 87 ; WX 833 ; N W ; B 71 -18 906 653 ; -C 88 ; WX 611 ; N X ; B -29 0 655 653 ; -C 89 ; WX 556 ; N Y ; B 78 0 633 653 ; -C 90 ; WX 556 ; N Z ; B -6 0 606 653 ; -C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ; -C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ; -C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ; -C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ; -C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; -C 145 ; WX 333 ; N quoteleft ; B 171 436 310 666 ; -C 97 ; WX 500 ; N a ; B 17 -11 476 441 ; -C 98 ; WX 500 ; N b ; B 23 -11 473 683 ; -C 99 ; WX 444 ; N c ; B 30 -11 425 441 ; -C 100 ; WX 500 ; N d ; B 15 -13 527 683 ; -C 101 ; WX 444 ; N e ; B 31 -11 412 441 ; -C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ; -C 103 ; WX 500 ; N g ; B 8 -206 472 441 ; -C 104 ; WX 500 ; N h ; B 19 -9 478 683 ; -C 105 ; WX 278 ; N i ; B 49 -11 264 654 ; -C 106 ; WX 278 ; N j ; B -124 -207 276 654 ; -C 107 ; WX 444 ; N k ; B 14 -11 461 683 ; -C 108 ; WX 278 ; N l ; B 41 -11 279 683 ; -C 109 ; WX 722 ; N m ; B 12 -9 704 441 ; -C 110 ; WX 500 ; N n ; B 14 -9 474 441 ; -C 111 ; WX 500 ; N o ; B 27 -11 468 441 ; -C 112 ; WX 500 ; N p ; B -75 -205 469 441 ; -C 113 ; WX 500 ; N q ; B 25 -209 483 441 ; -C 114 ; WX 389 ; N r ; B 45 0 412 441 ; -C 115 ; WX 389 ; N s ; B 16 -13 366 442 ; -C 116 ; WX 278 ; N t ; B 37 -11 296 546 ; -C 117 ; WX 500 ; N u ; B 42 -11 475 441 ; -C 118 ; WX 444 ; N v ; B 21 -18 426 441 ; -C 119 ; WX 667 ; N w ; B 16 -18 648 441 ; -C 120 ; WX 444 ; N x ; B -27 -11 447 441 ; -C 121 ; WX 444 ; N y ; B -24 -206 426 441 ; -C 122 ; WX 389 ; N z ; B -2 -81 380 428 ; -C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ; -C 124 ; WX 275 ; N bar ; B 105 -217 171 783 ; -C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ; -C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; -C 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ; -C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ; -C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ; -C -1 ; WX 167 ; N fraction ; B -169 -10 337 676 ; -C 165 ; WX 500 ; N yen ; B 27 0 603 653 ; -C 131 ; WX 500 ; N florin ; B 25 -182 507 682 ; -C 167 ; WX 500 ; N section ; B 53 -162 461 666 ; -C 164 ; WX 500 ; N currency ; B -22 53 522 597 ; -C 39 ; WX 214 ; N quotesingle ; B 132 421 241 666 ; -C 147 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ; -C 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ; -C 139 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ; -C 155 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ; -C -1 ; WX 500 ; N fi ; B -141 -207 481 681 ; -C -1 ; WX 500 ; N fl ; B -141 -204 518 682 ; -C 150 ; WX 500 ; N endash ; B -6 197 505 243 ; -C 134 ; WX 500 ; N dagger ; B 101 -159 488 666 ; -C 135 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ; -C 183 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; -C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ; -C 149 ; WX 350 ; N bullet ; B 40 191 310 461 ; -C 130 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ; -C 132 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ; -C 148 ; WX 556 ; N quotedblright ; B 151 436 499 666 ; -C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ; -C 133 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ; -C 137 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ; -C 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ; -C 96 ; WX 333 ; N grave ; B 121 492 311 664 ; -C 180 ; WX 333 ; N acute ; B 180 494 403 664 ; -C 136 ; WX 333 ; N circumflex ; B 91 492 385 661 ; -C 152 ; WX 333 ; N tilde ; B 100 517 427 624 ; -C 175 ; WX 333 ; N macron ; B 99 532 411 583 ; -C -1 ; WX 333 ; N breve ; B 117 492 418 650 ; -C -1 ; WX 333 ; N dotaccent ; B 207 548 305 646 ; -C 168 ; WX 333 ; N dieresis ; B 107 548 405 646 ; -C -1 ; WX 333 ; N ring ; B 155 492 355 691 ; -C 184 ; WX 333 ; N cedilla ; B -30 -217 182 0 ; -C -1 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ; -C -1 ; WX 333 ; N ogonek ; B 20 -169 203 40 ; -C -1 ; WX 333 ; N caron ; B 121 492 426 661 ; -C 151 ; WX 889 ; N emdash ; B -6 197 894 243 ; -C 198 ; WX 889 ; N AE ; B -27 0 911 653 ; -C 170 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ; -C -1 ; WX 556 ; N Lslash ; B -8 0 559 653 ; -C 216 ; WX 722 ; N Oslash ; B 60 -105 699 722 ; -C 140 ; WX 944 ; N OE ; B 49 -8 964 666 ; -C 186 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ; -C 230 ; WX 667 ; N ae ; B 23 -11 640 441 ; -C -1 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ; -C -1 ; WX 278 ; N lslash ; B 41 -11 312 683 ; -C 248 ; WX 500 ; N oslash ; B 28 -135 469 554 ; -C 156 ; WX 667 ; N oe ; B 20 -12 646 441 ; -C 223 ; WX 500 ; N germandbls ; B -168 -207 493 679 ; -C 207 ; WX 333 ; N Idieresis ; B -8 0 435 818 ; -C 233 ; WX 444 ; N eacute ; B 31 -11 459 664 ; -C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ; -C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ; -C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ; -C 159 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ; -C 247 ; WX 675 ; N divide ; B 86 -11 590 517 ; -C 221 ; WX 556 ; N Yacute ; B 78 0 633 876 ; -C 194 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ; -C 225 ; WX 500 ; N aacute ; B 17 -11 487 664 ; -C 219 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ; -C 253 ; WX 444 ; N yacute ; B -24 -206 459 664 ; -C -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ; -C 234 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ; -C -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ; -C 220 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ; -C -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ; -C 218 ; WX 722 ; N Uacute ; B 102 -18 765 876 ; -C -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ; -C 203 ; WX 611 ; N Edieresis ; B -1 0 634 818 ; -C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ; -C -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ; -C 169 ; WX 760 ; N copyright ; B 41 -18 719 666 ; -C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ; -C -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ; -C 229 ; WX 500 ; N aring ; B 17 -11 476 691 ; -C -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ; -C -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ; -C 224 ; WX 500 ; N agrave ; B 17 -11 476 664 ; -C -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ; -C -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ; -C 227 ; WX 500 ; N atilde ; B 17 -11 511 624 ; -C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ; -C 154 ; WX 389 ; N scaron ; B 16 -13 454 661 ; -C -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ; -C 237 ; WX 278 ; N iacute ; B 49 -11 355 664 ; -C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; -C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ; -C -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ; -C 251 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ; -C 226 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ; -C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ; -C -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ; -C 231 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ; -C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ; -C 222 ; WX 611 ; N Thorn ; B 0 0 569 653 ; -C -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ; -C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ; -C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ; -C -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ; -C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ; -C -1 ; WX 500 ; N uring ; B 42 -11 475 691 ; -C 179 ; WX 300 ; N threesuperior ; B 43 268 339 676 ; -C 210 ; WX 722 ; N Ograve ; B 60 -18 699 876 ; -C 192 ; WX 611 ; N Agrave ; B -51 0 564 876 ; -C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ; -C 215 ; WX 675 ; N multiply ; B 93 8 582 497 ; -C 250 ; WX 500 ; N uacute ; B 42 -11 477 664 ; -C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ; -C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; -C 255 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ; -C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ; -C 238 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ; -C 202 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ; -C 228 ; WX 500 ; N adieresis ; B 17 -11 489 606 ; -C 235 ; WX 444 ; N edieresis ; B 31 -11 451 606 ; -C -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ; -C -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ; -C -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ; -C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ; -C 205 ; WX 333 ; N Iacute ; B -8 0 433 876 ; -C 177 ; WX 675 ; N plusminus ; B 86 0 590 506 ; -C 166 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ; -C 174 ; WX 760 ; N registered ; B 41 -18 719 666 ; -C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ; -C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ; -C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; -C 200 ; WX 611 ; N Egrave ; B -1 0 634 876 ; -C -1 ; WX 389 ; N racute ; B 45 0 431 664 ; -C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ; -C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ; -C 142 ; WX 556 ; N Zcaron ; B -6 0 606 873 ; -C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ; -C 208 ; WX 722 ; N Eth ; B -8 0 700 653 ; -C 199 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ; -C -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ; -C -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ; -C -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ; -C -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ; -C 193 ; WX 611 ; N Aacute ; B -51 0 564 876 ; -C 196 ; WX 611 ; N Adieresis ; B -51 0 564 818 ; -C 232 ; WX 444 ; N egrave ; B 31 -11 412 664 ; -C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ; -C -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ; -C 211 ; WX 722 ; N Oacute ; B 60 -18 699 876 ; -C 243 ; WX 500 ; N oacute ; B 27 -11 487 664 ; -C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ; -C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ; -C 239 ; WX 278 ; N idieresis ; B 49 -11 352 606 ; -C 212 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ; -C 217 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ; -C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; -C 254 ; WX 500 ; N thorn ; B -75 -205 469 683 ; -C 178 ; WX 300 ; N twosuperior ; B 33 271 324 676 ; -C 214 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ; -C 181 ; WX 500 ; N mu ; B -30 -209 497 428 ; -C 236 ; WX 278 ; N igrave ; B 49 -11 284 664 ; -C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ; -C -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ; -C -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ; -C 190 ; WX 750 ; N threequarters ; B 23 -10 736 676 ; -C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ; -C -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ; -C -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ; -C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ; -C 153 ; WX 980 ; N trademark ; B 30 247 957 653 ; -C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ; -C 204 ; WX 333 ; N Igrave ; B -8 0 384 876 ; -C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ; -C -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ; -C 189 ; WX 750 ; N onehalf ; B 34 -10 749 676 ; -C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ; -C 244 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ; -C 241 ; WX 500 ; N ntilde ; B 14 -9 476 624 ; -C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ; -C 201 ; WX 611 ; N Eacute ; B -1 0 634 876 ; -C -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ; -C -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ; -C 188 ; WX 750 ; N onequarter ; B 33 -10 736 676 ; -C 138 ; WX 500 ; N Scaron ; B 17 -18 520 873 ; -C -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ; -C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ; -C 176 ; WX 400 ; N degree ; B 101 390 387 676 ; -C 242 ; WX 500 ; N ograve ; B 27 -11 468 664 ; -C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ; -C 249 ; WX 500 ; N ugrave ; B 42 -11 475 664 ; -C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; -C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ; -C -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ; -C 209 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ; -C 245 ; WX 500 ; N otilde ; B 27 -11 496 624 ; -C -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ; -C -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ; -C 195 ; WX 611 ; N Atilde ; B -51 0 566 836 ; -C -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ; -C 197 ; WX 611 ; N Aring ; B -51 0 564 883 ; -C 213 ; WX 722 ; N Otilde ; B 60 -18 699 836 ; -C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ; -C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ; -C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ; -C -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ; -C -1 ; WX 675 ; N minus ; B 86 220 590 286 ; -C 206 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ; -C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ; -C -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ; -C 172 ; WX 675 ; N logicalnot ; B 86 108 590 386 ; -C 246 ; WX 500 ; N odieresis ; B 27 -11 489 606 ; -C 252 ; WX 500 ; N udieresis ; B 42 -11 479 606 ; -C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ; -C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ; -C 240 ; WX 500 ; N eth ; B 27 -11 482 683 ; -C 158 ; WX 389 ; N zcaron ; B -2 -81 434 661 ; -C -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ; -C 185 ; WX 300 ; N onesuperior ; B 43 271 284 676 ; -C -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ; -C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -StartKernData -StartKernPairs 2321 -KPX A C -30 -KPX A Cacute -30 -KPX A Ccaron -30 -KPX A Ccedilla -30 -KPX A G -35 -KPX A Gbreve -35 -KPX A Gcommaaccent -35 -KPX A O -40 -KPX A Oacute -40 -KPX A Ocircumflex -40 -KPX A Odieresis -40 -KPX A Ograve -40 -KPX A Ohungarumlaut -40 -KPX A Omacron -40 -KPX A Oslash -40 -KPX A Otilde -40 -KPX A Q -40 -KPX A T -37 -KPX A Tcaron -37 -KPX A Tcommaaccent -37 -KPX A U -50 -KPX A Uacute -50 -KPX A Ucircumflex -50 -KPX A Udieresis -50 -KPX A Ugrave -50 -KPX A Uhungarumlaut -50 -KPX A Umacron -50 -KPX A Uogonek -50 -KPX A Uring -50 -KPX A V -105 -KPX A W -95 -KPX A Y -55 -KPX A Yacute -55 -KPX A Ydieresis -55 -KPX A quoteright -37 -KPX A u -20 -KPX A uacute -20 -KPX A ucircumflex -20 -KPX A udieresis -20 -KPX A ugrave -20 -KPX A uhungarumlaut -20 -KPX A umacron -20 -KPX A uogonek -20 -KPX A uring -20 -KPX A v -55 -KPX A w -55 -KPX A y -55 -KPX A yacute -55 -KPX A ydieresis -55 -KPX Aacute C -30 -KPX Aacute Cacute -30 -KPX Aacute Ccaron -30 -KPX Aacute Ccedilla -30 -KPX Aacute G -35 -KPX Aacute Gbreve -35 -KPX Aacute Gcommaaccent -35 -KPX Aacute O -40 -KPX Aacute Oacute -40 -KPX Aacute Ocircumflex -40 -KPX Aacute Odieresis -40 -KPX Aacute Ograve -40 -KPX Aacute Ohungarumlaut -40 -KPX Aacute Omacron -40 -KPX Aacute Oslash -40 -KPX Aacute Otilde -40 -KPX Aacute Q -40 -KPX Aacute T -37 -KPX Aacute Tcaron -37 -KPX Aacute Tcommaaccent -37 -KPX Aacute U -50 -KPX Aacute Uacute -50 -KPX Aacute Ucircumflex -50 -KPX Aacute Udieresis -50 -KPX Aacute Ugrave -50 -KPX Aacute Uhungarumlaut -50 -KPX Aacute Umacron -50 -KPX Aacute Uogonek -50 -KPX Aacute Uring -50 -KPX Aacute V -105 -KPX Aacute W -95 -KPX Aacute Y -55 -KPX Aacute Yacute -55 -KPX Aacute Ydieresis -55 -KPX Aacute quoteright -37 -KPX Aacute u -20 -KPX Aacute uacute -20 -KPX Aacute ucircumflex -20 -KPX Aacute udieresis -20 -KPX Aacute ugrave -20 -KPX Aacute uhungarumlaut -20 -KPX Aacute umacron -20 -KPX Aacute uogonek -20 -KPX Aacute uring -20 -KPX Aacute v -55 -KPX Aacute w -55 -KPX Aacute y -55 -KPX Aacute yacute -55 -KPX Aacute ydieresis -55 -KPX Abreve C -30 -KPX Abreve Cacute -30 -KPX Abreve Ccaron -30 -KPX Abreve Ccedilla -30 -KPX Abreve G -35 -KPX Abreve Gbreve -35 -KPX Abreve Gcommaaccent -35 -KPX Abreve O -40 -KPX Abreve Oacute -40 -KPX Abreve Ocircumflex -40 -KPX Abreve Odieresis -40 -KPX Abreve Ograve -40 -KPX Abreve Ohungarumlaut -40 -KPX Abreve Omacron -40 -KPX Abreve Oslash -40 -KPX Abreve Otilde -40 -KPX Abreve Q -40 -KPX Abreve T -37 -KPX Abreve Tcaron -37 -KPX Abreve Tcommaaccent -37 -KPX Abreve U -50 -KPX Abreve Uacute -50 -KPX Abreve Ucircumflex -50 -KPX Abreve Udieresis -50 -KPX Abreve Ugrave -50 -KPX Abreve Uhungarumlaut -50 -KPX Abreve Umacron -50 -KPX Abreve Uogonek -50 -KPX Abreve Uring -50 -KPX Abreve V -105 -KPX Abreve W -95 -KPX Abreve Y -55 -KPX Abreve Yacute -55 -KPX Abreve Ydieresis -55 -KPX Abreve quoteright -37 -KPX Abreve u -20 -KPX Abreve uacute -20 -KPX Abreve ucircumflex -20 -KPX Abreve udieresis -20 -KPX Abreve ugrave -20 -KPX Abreve uhungarumlaut -20 -KPX Abreve umacron -20 -KPX Abreve uogonek -20 -KPX Abreve uring -20 -KPX Abreve v -55 -KPX Abreve w -55 -KPX Abreve y -55 -KPX Abreve yacute -55 -KPX Abreve ydieresis -55 -KPX Acircumflex C -30 -KPX Acircumflex Cacute -30 -KPX Acircumflex Ccaron -30 -KPX Acircumflex Ccedilla -30 -KPX Acircumflex G -35 -KPX Acircumflex Gbreve -35 -KPX Acircumflex Gcommaaccent -35 -KPX Acircumflex O -40 -KPX Acircumflex Oacute -40 -KPX Acircumflex Ocircumflex -40 -KPX Acircumflex Odieresis -40 -KPX Acircumflex Ograve -40 -KPX Acircumflex Ohungarumlaut -40 -KPX Acircumflex Omacron -40 -KPX Acircumflex Oslash -40 -KPX Acircumflex Otilde -40 -KPX Acircumflex Q -40 -KPX Acircumflex T -37 -KPX Acircumflex Tcaron -37 -KPX Acircumflex Tcommaaccent -37 -KPX Acircumflex U -50 -KPX Acircumflex Uacute -50 -KPX Acircumflex Ucircumflex -50 -KPX Acircumflex Udieresis -50 -KPX Acircumflex Ugrave -50 -KPX Acircumflex Uhungarumlaut -50 -KPX Acircumflex Umacron -50 -KPX Acircumflex Uogonek -50 -KPX Acircumflex Uring -50 -KPX Acircumflex V -105 -KPX Acircumflex W -95 -KPX Acircumflex Y -55 -KPX Acircumflex Yacute -55 -KPX Acircumflex Ydieresis -55 -KPX Acircumflex quoteright -37 -KPX Acircumflex u -20 -KPX Acircumflex uacute -20 -KPX Acircumflex ucircumflex -20 -KPX Acircumflex udieresis -20 -KPX Acircumflex ugrave -20 -KPX Acircumflex uhungarumlaut -20 -KPX Acircumflex umacron -20 -KPX Acircumflex uogonek -20 -KPX Acircumflex uring -20 -KPX Acircumflex v -55 -KPX Acircumflex w -55 -KPX Acircumflex y -55 -KPX Acircumflex yacute -55 -KPX Acircumflex ydieresis -55 -KPX Adieresis C -30 -KPX Adieresis Cacute -30 -KPX Adieresis Ccaron -30 -KPX Adieresis Ccedilla -30 -KPX Adieresis G -35 -KPX Adieresis Gbreve -35 -KPX Adieresis Gcommaaccent -35 -KPX Adieresis O -40 -KPX Adieresis Oacute -40 -KPX Adieresis Ocircumflex -40 -KPX Adieresis Odieresis -40 -KPX Adieresis Ograve -40 -KPX Adieresis Ohungarumlaut -40 -KPX Adieresis Omacron -40 -KPX Adieresis Oslash -40 -KPX Adieresis Otilde -40 -KPX Adieresis Q -40 -KPX Adieresis T -37 -KPX Adieresis Tcaron -37 -KPX Adieresis Tcommaaccent -37 -KPX Adieresis U -50 -KPX Adieresis Uacute -50 -KPX Adieresis Ucircumflex -50 -KPX Adieresis Udieresis -50 -KPX Adieresis Ugrave -50 -KPX Adieresis Uhungarumlaut -50 -KPX Adieresis Umacron -50 -KPX Adieresis Uogonek -50 -KPX Adieresis Uring -50 -KPX Adieresis V -105 -KPX Adieresis W -95 -KPX Adieresis Y -55 -KPX Adieresis Yacute -55 -KPX Adieresis Ydieresis -55 -KPX Adieresis quoteright -37 -KPX Adieresis u -20 -KPX Adieresis uacute -20 -KPX Adieresis ucircumflex -20 -KPX Adieresis udieresis -20 -KPX Adieresis ugrave -20 -KPX Adieresis uhungarumlaut -20 -KPX Adieresis umacron -20 -KPX Adieresis uogonek -20 -KPX Adieresis uring -20 -KPX Adieresis v -55 -KPX Adieresis w -55 -KPX Adieresis y -55 -KPX Adieresis yacute -55 -KPX Adieresis ydieresis -55 -KPX Agrave C -30 -KPX Agrave Cacute -30 -KPX Agrave Ccaron -30 -KPX Agrave Ccedilla -30 -KPX Agrave G -35 -KPX Agrave Gbreve -35 -KPX Agrave Gcommaaccent -35 -KPX Agrave O -40 -KPX Agrave Oacute -40 -KPX Agrave Ocircumflex -40 -KPX Agrave Odieresis -40 -KPX Agrave Ograve -40 -KPX Agrave Ohungarumlaut -40 -KPX Agrave Omacron -40 -KPX Agrave Oslash -40 -KPX Agrave Otilde -40 -KPX Agrave Q -40 -KPX Agrave T -37 -KPX Agrave Tcaron -37 -KPX Agrave Tcommaaccent -37 -KPX Agrave U -50 -KPX Agrave Uacute -50 -KPX Agrave Ucircumflex -50 -KPX Agrave Udieresis -50 -KPX Agrave Ugrave -50 -KPX Agrave Uhungarumlaut -50 -KPX Agrave Umacron -50 -KPX Agrave Uogonek -50 -KPX Agrave Uring -50 -KPX Agrave V -105 -KPX Agrave W -95 -KPX Agrave Y -55 -KPX Agrave Yacute -55 -KPX Agrave Ydieresis -55 -KPX Agrave quoteright -37 -KPX Agrave u -20 -KPX Agrave uacute -20 -KPX Agrave ucircumflex -20 -KPX Agrave udieresis -20 -KPX Agrave ugrave -20 -KPX Agrave uhungarumlaut -20 -KPX Agrave umacron -20 -KPX Agrave uogonek -20 -KPX Agrave uring -20 -KPX Agrave v -55 -KPX Agrave w -55 -KPX Agrave y -55 -KPX Agrave yacute -55 -KPX Agrave ydieresis -55 -KPX Amacron C -30 -KPX Amacron Cacute -30 -KPX Amacron Ccaron -30 -KPX Amacron Ccedilla -30 -KPX Amacron G -35 -KPX Amacron Gbreve -35 -KPX Amacron Gcommaaccent -35 -KPX Amacron O -40 -KPX Amacron Oacute -40 -KPX Amacron Ocircumflex -40 -KPX Amacron Odieresis -40 -KPX Amacron Ograve -40 -KPX Amacron Ohungarumlaut -40 -KPX Amacron Omacron -40 -KPX Amacron Oslash -40 -KPX Amacron Otilde -40 -KPX Amacron Q -40 -KPX Amacron T -37 -KPX Amacron Tcaron -37 -KPX Amacron Tcommaaccent -37 -KPX Amacron U -50 -KPX Amacron Uacute -50 -KPX Amacron Ucircumflex -50 -KPX Amacron Udieresis -50 -KPX Amacron Ugrave -50 -KPX Amacron Uhungarumlaut -50 -KPX Amacron Umacron -50 -KPX Amacron Uogonek -50 -KPX Amacron Uring -50 -KPX Amacron V -105 -KPX Amacron W -95 -KPX Amacron Y -55 -KPX Amacron Yacute -55 -KPX Amacron Ydieresis -55 -KPX Amacron quoteright -37 -KPX Amacron u -20 -KPX Amacron uacute -20 -KPX Amacron ucircumflex -20 -KPX Amacron udieresis -20 -KPX Amacron ugrave -20 -KPX Amacron uhungarumlaut -20 -KPX Amacron umacron -20 -KPX Amacron uogonek -20 -KPX Amacron uring -20 -KPX Amacron v -55 -KPX Amacron w -55 -KPX Amacron y -55 -KPX Amacron yacute -55 -KPX Amacron ydieresis -55 -KPX Aogonek C -30 -KPX Aogonek Cacute -30 -KPX Aogonek Ccaron -30 -KPX Aogonek Ccedilla -30 -KPX Aogonek G -35 -KPX Aogonek Gbreve -35 -KPX Aogonek Gcommaaccent -35 -KPX Aogonek O -40 -KPX Aogonek Oacute -40 -KPX Aogonek Ocircumflex -40 -KPX Aogonek Odieresis -40 -KPX Aogonek Ograve -40 -KPX Aogonek Ohungarumlaut -40 -KPX Aogonek Omacron -40 -KPX Aogonek Oslash -40 -KPX Aogonek Otilde -40 -KPX Aogonek Q -40 -KPX Aogonek T -37 -KPX Aogonek Tcaron -37 -KPX Aogonek Tcommaaccent -37 -KPX Aogonek U -50 -KPX Aogonek Uacute -50 -KPX Aogonek Ucircumflex -50 -KPX Aogonek Udieresis -50 -KPX Aogonek Ugrave -50 -KPX Aogonek Uhungarumlaut -50 -KPX Aogonek Umacron -50 -KPX Aogonek Uogonek -50 -KPX Aogonek Uring -50 -KPX Aogonek V -105 -KPX Aogonek W -95 -KPX Aogonek Y -55 -KPX Aogonek Yacute -55 -KPX Aogonek Ydieresis -55 -KPX Aogonek quoteright -37 -KPX Aogonek u -20 -KPX Aogonek uacute -20 -KPX Aogonek ucircumflex -20 -KPX Aogonek udieresis -20 -KPX Aogonek ugrave -20 -KPX Aogonek uhungarumlaut -20 -KPX Aogonek umacron -20 -KPX Aogonek uogonek -20 -KPX Aogonek uring -20 -KPX Aogonek v -55 -KPX Aogonek w -55 -KPX Aogonek y -55 -KPX Aogonek yacute -55 -KPX Aogonek ydieresis -55 -KPX Aring C -30 -KPX Aring Cacute -30 -KPX Aring Ccaron -30 -KPX Aring Ccedilla -30 -KPX Aring G -35 -KPX Aring Gbreve -35 -KPX Aring Gcommaaccent -35 -KPX Aring O -40 -KPX Aring Oacute -40 -KPX Aring Ocircumflex -40 -KPX Aring Odieresis -40 -KPX Aring Ograve -40 -KPX Aring Ohungarumlaut -40 -KPX Aring Omacron -40 -KPX Aring Oslash -40 -KPX Aring Otilde -40 -KPX Aring Q -40 -KPX Aring T -37 -KPX Aring Tcaron -37 -KPX Aring Tcommaaccent -37 -KPX Aring U -50 -KPX Aring Uacute -50 -KPX Aring Ucircumflex -50 -KPX Aring Udieresis -50 -KPX Aring Ugrave -50 -KPX Aring Uhungarumlaut -50 -KPX Aring Umacron -50 -KPX Aring Uogonek -50 -KPX Aring Uring -50 -KPX Aring V -105 -KPX Aring W -95 -KPX Aring Y -55 -KPX Aring Yacute -55 -KPX Aring Ydieresis -55 -KPX Aring quoteright -37 -KPX Aring u -20 -KPX Aring uacute -20 -KPX Aring ucircumflex -20 -KPX Aring udieresis -20 -KPX Aring ugrave -20 -KPX Aring uhungarumlaut -20 -KPX Aring umacron -20 -KPX Aring uogonek -20 -KPX Aring uring -20 -KPX Aring v -55 -KPX Aring w -55 -KPX Aring y -55 -KPX Aring yacute -55 -KPX Aring ydieresis -55 -KPX Atilde C -30 -KPX Atilde Cacute -30 -KPX Atilde Ccaron -30 -KPX Atilde Ccedilla -30 -KPX Atilde G -35 -KPX Atilde Gbreve -35 -KPX Atilde Gcommaaccent -35 -KPX Atilde O -40 -KPX Atilde Oacute -40 -KPX Atilde Ocircumflex -40 -KPX Atilde Odieresis -40 -KPX Atilde Ograve -40 -KPX Atilde Ohungarumlaut -40 -KPX Atilde Omacron -40 -KPX Atilde Oslash -40 -KPX Atilde Otilde -40 -KPX Atilde Q -40 -KPX Atilde T -37 -KPX Atilde Tcaron -37 -KPX Atilde Tcommaaccent -37 -KPX Atilde U -50 -KPX Atilde Uacute -50 -KPX Atilde Ucircumflex -50 -KPX Atilde Udieresis -50 -KPX Atilde Ugrave -50 -KPX Atilde Uhungarumlaut -50 -KPX Atilde Umacron -50 -KPX Atilde Uogonek -50 -KPX Atilde Uring -50 -KPX Atilde V -105 -KPX Atilde W -95 -KPX Atilde Y -55 -KPX Atilde Yacute -55 -KPX Atilde Ydieresis -55 -KPX Atilde quoteright -37 -KPX Atilde u -20 -KPX Atilde uacute -20 -KPX Atilde ucircumflex -20 -KPX Atilde udieresis -20 -KPX Atilde ugrave -20 -KPX Atilde uhungarumlaut -20 -KPX Atilde umacron -20 -KPX Atilde uogonek -20 -KPX Atilde uring -20 -KPX Atilde v -55 -KPX Atilde w -55 -KPX Atilde y -55 -KPX Atilde yacute -55 -KPX Atilde ydieresis -55 -KPX B A -25 -KPX B Aacute -25 -KPX B Abreve -25 -KPX B Acircumflex -25 -KPX B Adieresis -25 -KPX B Agrave -25 -KPX B Amacron -25 -KPX B Aogonek -25 -KPX B Aring -25 -KPX B Atilde -25 -KPX B U -10 -KPX B Uacute -10 -KPX B Ucircumflex -10 -KPX B Udieresis -10 -KPX B Ugrave -10 -KPX B Uhungarumlaut -10 -KPX B Umacron -10 -KPX B Uogonek -10 -KPX B Uring -10 -KPX D A -35 -KPX D Aacute -35 -KPX D Abreve -35 -KPX D Acircumflex -35 -KPX D Adieresis -35 -KPX D Agrave -35 -KPX D Amacron -35 -KPX D Aogonek -35 -KPX D Aring -35 -KPX D Atilde -35 -KPX D V -40 -KPX D W -40 -KPX D Y -40 -KPX D Yacute -40 -KPX D Ydieresis -40 -KPX Dcaron A -35 -KPX Dcaron Aacute -35 -KPX Dcaron Abreve -35 -KPX Dcaron Acircumflex -35 -KPX Dcaron Adieresis -35 -KPX Dcaron Agrave -35 -KPX Dcaron Amacron -35 -KPX Dcaron Aogonek -35 -KPX Dcaron Aring -35 -KPX Dcaron Atilde -35 -KPX Dcaron V -40 -KPX Dcaron W -40 -KPX Dcaron Y -40 -KPX Dcaron Yacute -40 -KPX Dcaron Ydieresis -40 -KPX Dcroat A -35 -KPX Dcroat Aacute -35 -KPX Dcroat Abreve -35 -KPX Dcroat Acircumflex -35 -KPX Dcroat Adieresis -35 -KPX Dcroat Agrave -35 -KPX Dcroat Amacron -35 -KPX Dcroat Aogonek -35 -KPX Dcroat Aring -35 -KPX Dcroat Atilde -35 -KPX Dcroat V -40 -KPX Dcroat W -40 -KPX Dcroat Y -40 -KPX Dcroat Yacute -40 -KPX Dcroat Ydieresis -40 -KPX F A -115 -KPX F Aacute -115 -KPX F Abreve -115 -KPX F Acircumflex -115 -KPX F Adieresis -115 -KPX F Agrave -115 -KPX F Amacron -115 -KPX F Aogonek -115 -KPX F Aring -115 -KPX F Atilde -115 -KPX F a -75 -KPX F aacute -75 -KPX F abreve -75 -KPX F acircumflex -75 -KPX F adieresis -75 -KPX F agrave -75 -KPX F amacron -75 -KPX F aogonek -75 -KPX F aring -75 -KPX F atilde -75 -KPX F comma -135 -KPX F e -75 -KPX F eacute -75 -KPX F ecaron -75 -KPX F ecircumflex -75 -KPX F edieresis -75 -KPX F edotaccent -75 -KPX F egrave -75 -KPX F emacron -75 -KPX F eogonek -75 -KPX F i -45 -KPX F iacute -45 -KPX F icircumflex -45 -KPX F idieresis -45 -KPX F igrave -45 -KPX F imacron -45 -KPX F iogonek -45 -KPX F o -105 -KPX F oacute -105 -KPX F ocircumflex -105 -KPX F odieresis -105 -KPX F ograve -105 -KPX F ohungarumlaut -105 -KPX F omacron -105 -KPX F oslash -105 -KPX F otilde -105 -KPX F period -135 -KPX F r -55 -KPX F racute -55 -KPX F rcaron -55 -KPX F rcommaaccent -55 -KPX J A -40 -KPX J Aacute -40 -KPX J Abreve -40 -KPX J Acircumflex -40 -KPX J Adieresis -40 -KPX J Agrave -40 -KPX J Amacron -40 -KPX J Aogonek -40 -KPX J Aring -40 -KPX J Atilde -40 -KPX J a -35 -KPX J aacute -35 -KPX J abreve -35 -KPX J acircumflex -35 -KPX J adieresis -35 -KPX J agrave -35 -KPX J amacron -35 -KPX J aogonek -35 -KPX J aring -35 -KPX J atilde -35 -KPX J comma -25 -KPX J e -25 -KPX J eacute -25 -KPX J ecaron -25 -KPX J ecircumflex -25 -KPX J edieresis -25 -KPX J edotaccent -25 -KPX J egrave -25 -KPX J emacron -25 -KPX J eogonek -25 -KPX J o -25 -KPX J oacute -25 -KPX J ocircumflex -25 -KPX J odieresis -25 -KPX J ograve -25 -KPX J ohungarumlaut -25 -KPX J omacron -25 -KPX J oslash -25 -KPX J otilde -25 -KPX J period -25 -KPX J u -35 -KPX J uacute -35 -KPX J ucircumflex -35 -KPX J udieresis -35 -KPX J ugrave -35 -KPX J uhungarumlaut -35 -KPX J umacron -35 -KPX J uogonek -35 -KPX J uring -35 -KPX K O -50 -KPX K Oacute -50 -KPX K Ocircumflex -50 -KPX K Odieresis -50 -KPX K Ograve -50 -KPX K Ohungarumlaut -50 -KPX K Omacron -50 -KPX K Oslash -50 -KPX K Otilde -50 -KPX K e -35 -KPX K eacute -35 -KPX K ecaron -35 -KPX K ecircumflex -35 -KPX K edieresis -35 -KPX K edotaccent -35 -KPX K egrave -35 -KPX K emacron -35 -KPX K eogonek -35 -KPX K o -40 -KPX K oacute -40 -KPX K ocircumflex -40 -KPX K odieresis -40 -KPX K ograve -40 -KPX K ohungarumlaut -40 -KPX K omacron -40 -KPX K oslash -40 -KPX K otilde -40 -KPX K u -40 -KPX K uacute -40 -KPX K ucircumflex -40 -KPX K udieresis -40 -KPX K ugrave -40 -KPX K uhungarumlaut -40 -KPX K umacron -40 -KPX K uogonek -40 -KPX K uring -40 -KPX K y -40 -KPX K yacute -40 -KPX K ydieresis -40 -KPX Kcommaaccent O -50 -KPX Kcommaaccent Oacute -50 -KPX Kcommaaccent Ocircumflex -50 -KPX Kcommaaccent Odieresis -50 -KPX Kcommaaccent Ograve -50 -KPX Kcommaaccent Ohungarumlaut -50 -KPX Kcommaaccent Omacron -50 -KPX Kcommaaccent Oslash -50 -KPX Kcommaaccent Otilde -50 -KPX Kcommaaccent e -35 -KPX Kcommaaccent eacute -35 -KPX Kcommaaccent ecaron -35 -KPX Kcommaaccent ecircumflex -35 -KPX Kcommaaccent edieresis -35 -KPX Kcommaaccent edotaccent -35 -KPX Kcommaaccent egrave -35 -KPX Kcommaaccent emacron -35 -KPX Kcommaaccent eogonek -35 -KPX Kcommaaccent o -40 -KPX Kcommaaccent oacute -40 -KPX Kcommaaccent ocircumflex -40 -KPX Kcommaaccent odieresis -40 -KPX Kcommaaccent ograve -40 -KPX Kcommaaccent ohungarumlaut -40 -KPX Kcommaaccent omacron -40 -KPX Kcommaaccent oslash -40 -KPX Kcommaaccent otilde -40 -KPX Kcommaaccent u -40 -KPX Kcommaaccent uacute -40 -KPX Kcommaaccent ucircumflex -40 -KPX Kcommaaccent udieresis -40 -KPX Kcommaaccent ugrave -40 -KPX Kcommaaccent uhungarumlaut -40 -KPX Kcommaaccent umacron -40 -KPX Kcommaaccent uogonek -40 -KPX Kcommaaccent uring -40 -KPX Kcommaaccent y -40 -KPX Kcommaaccent yacute -40 -KPX Kcommaaccent ydieresis -40 -KPX L T -20 -KPX L Tcaron -20 -KPX L Tcommaaccent -20 -KPX L V -55 -KPX L W -55 -KPX L Y -20 -KPX L Yacute -20 -KPX L Ydieresis -20 -KPX L quoteright -37 -KPX L y -30 -KPX L yacute -30 -KPX L ydieresis -30 -KPX Lacute T -20 -KPX Lacute Tcaron -20 -KPX Lacute Tcommaaccent -20 -KPX Lacute V -55 -KPX Lacute W -55 -KPX Lacute Y -20 -KPX Lacute Yacute -20 -KPX Lacute Ydieresis -20 -KPX Lacute quoteright -37 -KPX Lacute y -30 -KPX Lacute yacute -30 -KPX Lacute ydieresis -30 -KPX Lcommaaccent T -20 -KPX Lcommaaccent Tcaron -20 -KPX Lcommaaccent Tcommaaccent -20 -KPX Lcommaaccent V -55 -KPX Lcommaaccent W -55 -KPX Lcommaaccent Y -20 -KPX Lcommaaccent Yacute -20 -KPX Lcommaaccent Ydieresis -20 -KPX Lcommaaccent quoteright -37 -KPX Lcommaaccent y -30 -KPX Lcommaaccent yacute -30 -KPX Lcommaaccent ydieresis -30 -KPX Lslash T -20 -KPX Lslash Tcaron -20 -KPX Lslash Tcommaaccent -20 -KPX Lslash V -55 -KPX Lslash W -55 -KPX Lslash Y -20 -KPX Lslash Yacute -20 -KPX Lslash Ydieresis -20 -KPX Lslash quoteright -37 -KPX Lslash y -30 -KPX Lslash yacute -30 -KPX Lslash ydieresis -30 -KPX N A -27 -KPX N Aacute -27 -KPX N Abreve -27 -KPX N Acircumflex -27 -KPX N Adieresis -27 -KPX N Agrave -27 -KPX N Amacron -27 -KPX N Aogonek -27 -KPX N Aring -27 -KPX N Atilde -27 -KPX Nacute A -27 -KPX Nacute Aacute -27 -KPX Nacute Abreve -27 -KPX Nacute Acircumflex -27 -KPX Nacute Adieresis -27 -KPX Nacute Agrave -27 -KPX Nacute Amacron -27 -KPX Nacute Aogonek -27 -KPX Nacute Aring -27 -KPX Nacute Atilde -27 -KPX Ncaron A -27 -KPX Ncaron Aacute -27 -KPX Ncaron Abreve -27 -KPX Ncaron Acircumflex -27 -KPX Ncaron Adieresis -27 -KPX Ncaron Agrave -27 -KPX Ncaron Amacron -27 -KPX Ncaron Aogonek -27 -KPX Ncaron Aring -27 -KPX Ncaron Atilde -27 -KPX Ncommaaccent A -27 -KPX Ncommaaccent Aacute -27 -KPX Ncommaaccent Abreve -27 -KPX Ncommaaccent Acircumflex -27 -KPX Ncommaaccent Adieresis -27 -KPX Ncommaaccent Agrave -27 -KPX Ncommaaccent Amacron -27 -KPX Ncommaaccent Aogonek -27 -KPX Ncommaaccent Aring -27 -KPX Ncommaaccent Atilde -27 -KPX Ntilde A -27 -KPX Ntilde Aacute -27 -KPX Ntilde Abreve -27 -KPX Ntilde Acircumflex -27 -KPX Ntilde Adieresis -27 -KPX Ntilde Agrave -27 -KPX Ntilde Amacron -27 -KPX Ntilde Aogonek -27 -KPX Ntilde Aring -27 -KPX Ntilde Atilde -27 -KPX O A -55 -KPX O Aacute -55 -KPX O Abreve -55 -KPX O Acircumflex -55 -KPX O Adieresis -55 -KPX O Agrave -55 -KPX O Amacron -55 -KPX O Aogonek -55 -KPX O Aring -55 -KPX O Atilde -55 -KPX O T -40 -KPX O Tcaron -40 -KPX O Tcommaaccent -40 -KPX O V -50 -KPX O W -50 -KPX O X -40 -KPX O Y -50 -KPX O Yacute -50 -KPX O Ydieresis -50 -KPX Oacute A -55 -KPX Oacute Aacute -55 -KPX Oacute Abreve -55 -KPX Oacute Acircumflex -55 -KPX Oacute Adieresis -55 -KPX Oacute Agrave -55 -KPX Oacute Amacron -55 -KPX Oacute Aogonek -55 -KPX Oacute Aring -55 -KPX Oacute Atilde -55 -KPX Oacute T -40 -KPX Oacute Tcaron -40 -KPX Oacute Tcommaaccent -40 -KPX Oacute V -50 -KPX Oacute W -50 -KPX Oacute X -40 -KPX Oacute Y -50 -KPX Oacute Yacute -50 -KPX Oacute Ydieresis -50 -KPX Ocircumflex A -55 -KPX Ocircumflex Aacute -55 -KPX Ocircumflex Abreve -55 -KPX Ocircumflex Acircumflex -55 -KPX Ocircumflex Adieresis -55 -KPX Ocircumflex Agrave -55 -KPX Ocircumflex Amacron -55 -KPX Ocircumflex Aogonek -55 -KPX Ocircumflex Aring -55 -KPX Ocircumflex Atilde -55 -KPX Ocircumflex T -40 -KPX Ocircumflex Tcaron -40 -KPX Ocircumflex Tcommaaccent -40 -KPX Ocircumflex V -50 -KPX Ocircumflex W -50 -KPX Ocircumflex X -40 -KPX Ocircumflex Y -50 -KPX Ocircumflex Yacute -50 -KPX Ocircumflex Ydieresis -50 -KPX Odieresis A -55 -KPX Odieresis Aacute -55 -KPX Odieresis Abreve -55 -KPX Odieresis Acircumflex -55 -KPX Odieresis Adieresis -55 -KPX Odieresis Agrave -55 -KPX Odieresis Amacron -55 -KPX Odieresis Aogonek -55 -KPX Odieresis Aring -55 -KPX Odieresis Atilde -55 -KPX Odieresis T -40 -KPX Odieresis Tcaron -40 -KPX Odieresis Tcommaaccent -40 -KPX Odieresis V -50 -KPX Odieresis W -50 -KPX Odieresis X -40 -KPX Odieresis Y -50 -KPX Odieresis Yacute -50 -KPX Odieresis Ydieresis -50 -KPX Ograve A -55 -KPX Ograve Aacute -55 -KPX Ograve Abreve -55 -KPX Ograve Acircumflex -55 -KPX Ograve Adieresis -55 -KPX Ograve Agrave -55 -KPX Ograve Amacron -55 -KPX Ograve Aogonek -55 -KPX Ograve Aring -55 -KPX Ograve Atilde -55 -KPX Ograve T -40 -KPX Ograve Tcaron -40 -KPX Ograve Tcommaaccent -40 -KPX Ograve V -50 -KPX Ograve W -50 -KPX Ograve X -40 -KPX Ograve Y -50 -KPX Ograve Yacute -50 -KPX Ograve Ydieresis -50 -KPX Ohungarumlaut A -55 -KPX Ohungarumlaut Aacute -55 -KPX Ohungarumlaut Abreve -55 -KPX Ohungarumlaut Acircumflex -55 -KPX Ohungarumlaut Adieresis -55 -KPX Ohungarumlaut Agrave -55 -KPX Ohungarumlaut Amacron -55 -KPX Ohungarumlaut Aogonek -55 -KPX Ohungarumlaut Aring -55 -KPX Ohungarumlaut Atilde -55 -KPX Ohungarumlaut T -40 -KPX Ohungarumlaut Tcaron -40 -KPX Ohungarumlaut Tcommaaccent -40 -KPX Ohungarumlaut V -50 -KPX Ohungarumlaut W -50 -KPX Ohungarumlaut X -40 -KPX Ohungarumlaut Y -50 -KPX Ohungarumlaut Yacute -50 -KPX Ohungarumlaut Ydieresis -50 -KPX Omacron A -55 -KPX Omacron Aacute -55 -KPX Omacron Abreve -55 -KPX Omacron Acircumflex -55 -KPX Omacron Adieresis -55 -KPX Omacron Agrave -55 -KPX Omacron Amacron -55 -KPX Omacron Aogonek -55 -KPX Omacron Aring -55 -KPX Omacron Atilde -55 -KPX Omacron T -40 -KPX Omacron Tcaron -40 -KPX Omacron Tcommaaccent -40 -KPX Omacron V -50 -KPX Omacron W -50 -KPX Omacron X -40 -KPX Omacron Y -50 -KPX Omacron Yacute -50 -KPX Omacron Ydieresis -50 -KPX Oslash A -55 -KPX Oslash Aacute -55 -KPX Oslash Abreve -55 -KPX Oslash Acircumflex -55 -KPX Oslash Adieresis -55 -KPX Oslash Agrave -55 -KPX Oslash Amacron -55 -KPX Oslash Aogonek -55 -KPX Oslash Aring -55 -KPX Oslash Atilde -55 -KPX Oslash T -40 -KPX Oslash Tcaron -40 -KPX Oslash Tcommaaccent -40 -KPX Oslash V -50 -KPX Oslash W -50 -KPX Oslash X -40 -KPX Oslash Y -50 -KPX Oslash Yacute -50 -KPX Oslash Ydieresis -50 -KPX Otilde A -55 -KPX Otilde Aacute -55 -KPX Otilde Abreve -55 -KPX Otilde Acircumflex -55 -KPX Otilde Adieresis -55 -KPX Otilde Agrave -55 -KPX Otilde Amacron -55 -KPX Otilde Aogonek -55 -KPX Otilde Aring -55 -KPX Otilde Atilde -55 -KPX Otilde T -40 -KPX Otilde Tcaron -40 -KPX Otilde Tcommaaccent -40 -KPX Otilde V -50 -KPX Otilde W -50 -KPX Otilde X -40 -KPX Otilde Y -50 -KPX Otilde Yacute -50 -KPX Otilde Ydieresis -50 -KPX P A -90 -KPX P Aacute -90 -KPX P Abreve -90 -KPX P Acircumflex -90 -KPX P Adieresis -90 -KPX P Agrave -90 -KPX P Amacron -90 -KPX P Aogonek -90 -KPX P Aring -90 -KPX P Atilde -90 -KPX P a -80 -KPX P aacute -80 -KPX P abreve -80 -KPX P acircumflex -80 -KPX P adieresis -80 -KPX P agrave -80 -KPX P amacron -80 -KPX P aogonek -80 -KPX P aring -80 -KPX P atilde -80 -KPX P comma -135 -KPX P e -80 -KPX P eacute -80 -KPX P ecaron -80 -KPX P ecircumflex -80 -KPX P edieresis -80 -KPX P edotaccent -80 -KPX P egrave -80 -KPX P emacron -80 -KPX P eogonek -80 -KPX P o -80 -KPX P oacute -80 -KPX P ocircumflex -80 -KPX P odieresis -80 -KPX P ograve -80 -KPX P ohungarumlaut -80 -KPX P omacron -80 -KPX P oslash -80 -KPX P otilde -80 -KPX P period -135 -KPX Q U -10 -KPX Q Uacute -10 -KPX Q Ucircumflex -10 -KPX Q Udieresis -10 -KPX Q Ugrave -10 -KPX Q Uhungarumlaut -10 -KPX Q Umacron -10 -KPX Q Uogonek -10 -KPX Q Uring -10 -KPX R O -40 -KPX R Oacute -40 -KPX R Ocircumflex -40 -KPX R Odieresis -40 -KPX R Ograve -40 -KPX R Ohungarumlaut -40 -KPX R Omacron -40 -KPX R Oslash -40 -KPX R Otilde -40 -KPX R U -40 -KPX R Uacute -40 -KPX R Ucircumflex -40 -KPX R Udieresis -40 -KPX R Ugrave -40 -KPX R Uhungarumlaut -40 -KPX R Umacron -40 -KPX R Uogonek -40 -KPX R Uring -40 -KPX R V -18 -KPX R W -18 -KPX R Y -18 -KPX R Yacute -18 -KPX R Ydieresis -18 -KPX Racute O -40 -KPX Racute Oacute -40 -KPX Racute Ocircumflex -40 -KPX Racute Odieresis -40 -KPX Racute Ograve -40 -KPX Racute Ohungarumlaut -40 -KPX Racute Omacron -40 -KPX Racute Oslash -40 -KPX Racute Otilde -40 -KPX Racute U -40 -KPX Racute Uacute -40 -KPX Racute Ucircumflex -40 -KPX Racute Udieresis -40 -KPX Racute Ugrave -40 -KPX Racute Uhungarumlaut -40 -KPX Racute Umacron -40 -KPX Racute Uogonek -40 -KPX Racute Uring -40 -KPX Racute V -18 -KPX Racute W -18 -KPX Racute Y -18 -KPX Racute Yacute -18 -KPX Racute Ydieresis -18 -KPX Rcaron O -40 -KPX Rcaron Oacute -40 -KPX Rcaron Ocircumflex -40 -KPX Rcaron Odieresis -40 -KPX Rcaron Ograve -40 -KPX Rcaron Ohungarumlaut -40 -KPX Rcaron Omacron -40 -KPX Rcaron Oslash -40 -KPX Rcaron Otilde -40 -KPX Rcaron U -40 -KPX Rcaron Uacute -40 -KPX Rcaron Ucircumflex -40 -KPX Rcaron Udieresis -40 -KPX Rcaron Ugrave -40 -KPX Rcaron Uhungarumlaut -40 -KPX Rcaron Umacron -40 -KPX Rcaron Uogonek -40 -KPX Rcaron Uring -40 -KPX Rcaron V -18 -KPX Rcaron W -18 -KPX Rcaron Y -18 -KPX Rcaron Yacute -18 -KPX Rcaron Ydieresis -18 -KPX Rcommaaccent O -40 -KPX Rcommaaccent Oacute -40 -KPX Rcommaaccent Ocircumflex -40 -KPX Rcommaaccent Odieresis -40 -KPX Rcommaaccent Ograve -40 -KPX Rcommaaccent Ohungarumlaut -40 -KPX Rcommaaccent Omacron -40 -KPX Rcommaaccent Oslash -40 -KPX Rcommaaccent Otilde -40 -KPX Rcommaaccent U -40 -KPX Rcommaaccent Uacute -40 -KPX Rcommaaccent Ucircumflex -40 -KPX Rcommaaccent Udieresis -40 -KPX Rcommaaccent Ugrave -40 -KPX Rcommaaccent Uhungarumlaut -40 -KPX Rcommaaccent Umacron -40 -KPX Rcommaaccent Uogonek -40 -KPX Rcommaaccent Uring -40 -KPX Rcommaaccent V -18 -KPX Rcommaaccent W -18 -KPX Rcommaaccent Y -18 -KPX Rcommaaccent Yacute -18 -KPX Rcommaaccent Ydieresis -18 -KPX T A -50 -KPX T Aacute -50 -KPX T Abreve -50 -KPX T Acircumflex -50 -KPX T Adieresis -50 -KPX T Agrave -50 -KPX T Amacron -50 -KPX T Aogonek -50 -KPX T Aring -50 -KPX T Atilde -50 -KPX T O -18 -KPX T Oacute -18 -KPX T Ocircumflex -18 -KPX T Odieresis -18 -KPX T Ograve -18 -KPX T Ohungarumlaut -18 -KPX T Omacron -18 -KPX T Oslash -18 -KPX T Otilde -18 -KPX T a -92 -KPX T aacute -92 -KPX T abreve -92 -KPX T acircumflex -92 -KPX T adieresis -92 -KPX T agrave -92 -KPX T amacron -92 -KPX T aogonek -92 -KPX T aring -92 -KPX T atilde -92 -KPX T colon -55 -KPX T comma -74 -KPX T e -92 -KPX T eacute -92 -KPX T ecaron -92 -KPX T ecircumflex -52 -KPX T edieresis -52 -KPX T edotaccent -92 -KPX T egrave -52 -KPX T emacron -52 -KPX T eogonek -92 -KPX T hyphen -74 -KPX T i -55 -KPX T iacute -55 -KPX T iogonek -55 -KPX T o -92 -KPX T oacute -92 -KPX T ocircumflex -92 -KPX T odieresis -92 -KPX T ograve -92 -KPX T ohungarumlaut -92 -KPX T omacron -92 -KPX T oslash -92 -KPX T otilde -92 -KPX T period -74 -KPX T r -55 -KPX T racute -55 -KPX T rcaron -55 -KPX T rcommaaccent -55 -KPX T semicolon -65 -KPX T u -55 -KPX T uacute -55 -KPX T ucircumflex -55 -KPX T udieresis -55 -KPX T ugrave -55 -KPX T uhungarumlaut -55 -KPX T umacron -55 -KPX T uogonek -55 -KPX T uring -55 -KPX T w -74 -KPX T y -74 -KPX T yacute -74 -KPX T ydieresis -34 -KPX Tcaron A -50 -KPX Tcaron Aacute -50 -KPX Tcaron Abreve -50 -KPX Tcaron Acircumflex -50 -KPX Tcaron Adieresis -50 -KPX Tcaron Agrave -50 -KPX Tcaron Amacron -50 -KPX Tcaron Aogonek -50 -KPX Tcaron Aring -50 -KPX Tcaron Atilde -50 -KPX Tcaron O -18 -KPX Tcaron Oacute -18 -KPX Tcaron Ocircumflex -18 -KPX Tcaron Odieresis -18 -KPX Tcaron Ograve -18 -KPX Tcaron Ohungarumlaut -18 -KPX Tcaron Omacron -18 -KPX Tcaron Oslash -18 -KPX Tcaron Otilde -18 -KPX Tcaron a -92 -KPX Tcaron aacute -92 -KPX Tcaron abreve -92 -KPX Tcaron acircumflex -92 -KPX Tcaron adieresis -92 -KPX Tcaron agrave -92 -KPX Tcaron amacron -92 -KPX Tcaron aogonek -92 -KPX Tcaron aring -92 -KPX Tcaron atilde -92 -KPX Tcaron colon -55 -KPX Tcaron comma -74 -KPX Tcaron e -92 -KPX Tcaron eacute -92 -KPX Tcaron ecaron -92 -KPX Tcaron ecircumflex -52 -KPX Tcaron edieresis -52 -KPX Tcaron edotaccent -92 -KPX Tcaron egrave -52 -KPX Tcaron emacron -52 -KPX Tcaron eogonek -92 -KPX Tcaron hyphen -74 -KPX Tcaron i -55 -KPX Tcaron iacute -55 -KPX Tcaron iogonek -55 -KPX Tcaron o -92 -KPX Tcaron oacute -92 -KPX Tcaron ocircumflex -92 -KPX Tcaron odieresis -92 -KPX Tcaron ograve -92 -KPX Tcaron ohungarumlaut -92 -KPX Tcaron omacron -92 -KPX Tcaron oslash -92 -KPX Tcaron otilde -92 -KPX Tcaron period -74 -KPX Tcaron r -55 -KPX Tcaron racute -55 -KPX Tcaron rcaron -55 -KPX Tcaron rcommaaccent -55 -KPX Tcaron semicolon -65 -KPX Tcaron u -55 -KPX Tcaron uacute -55 -KPX Tcaron ucircumflex -55 -KPX Tcaron udieresis -55 -KPX Tcaron ugrave -55 -KPX Tcaron uhungarumlaut -55 -KPX Tcaron umacron -55 -KPX Tcaron uogonek -55 -KPX Tcaron uring -55 -KPX Tcaron w -74 -KPX Tcaron y -74 -KPX Tcaron yacute -74 -KPX Tcaron ydieresis -34 -KPX Tcommaaccent A -50 -KPX Tcommaaccent Aacute -50 -KPX Tcommaaccent Abreve -50 -KPX Tcommaaccent Acircumflex -50 -KPX Tcommaaccent Adieresis -50 -KPX Tcommaaccent Agrave -50 -KPX Tcommaaccent Amacron -50 -KPX Tcommaaccent Aogonek -50 -KPX Tcommaaccent Aring -50 -KPX Tcommaaccent Atilde -50 -KPX Tcommaaccent O -18 -KPX Tcommaaccent Oacute -18 -KPX Tcommaaccent Ocircumflex -18 -KPX Tcommaaccent Odieresis -18 -KPX Tcommaaccent Ograve -18 -KPX Tcommaaccent Ohungarumlaut -18 -KPX Tcommaaccent Omacron -18 -KPX Tcommaaccent Oslash -18 -KPX Tcommaaccent Otilde -18 -KPX Tcommaaccent a -92 -KPX Tcommaaccent aacute -92 -KPX Tcommaaccent abreve -92 -KPX Tcommaaccent acircumflex -92 -KPX Tcommaaccent adieresis -92 -KPX Tcommaaccent agrave -92 -KPX Tcommaaccent amacron -92 -KPX Tcommaaccent aogonek -92 -KPX Tcommaaccent aring -92 -KPX Tcommaaccent atilde -92 -KPX Tcommaaccent colon -55 -KPX Tcommaaccent comma -74 -KPX Tcommaaccent e -92 -KPX Tcommaaccent eacute -92 -KPX Tcommaaccent ecaron -92 -KPX Tcommaaccent ecircumflex -52 -KPX Tcommaaccent edieresis -52 -KPX Tcommaaccent edotaccent -92 -KPX Tcommaaccent egrave -52 -KPX Tcommaaccent emacron -52 -KPX Tcommaaccent eogonek -92 -KPX Tcommaaccent hyphen -74 -KPX Tcommaaccent i -55 -KPX Tcommaaccent iacute -55 -KPX Tcommaaccent iogonek -55 -KPX Tcommaaccent o -92 -KPX Tcommaaccent oacute -92 -KPX Tcommaaccent ocircumflex -92 -KPX Tcommaaccent odieresis -92 -KPX Tcommaaccent ograve -92 -KPX Tcommaaccent ohungarumlaut -92 -KPX Tcommaaccent omacron -92 -KPX Tcommaaccent oslash -92 -KPX Tcommaaccent otilde -92 -KPX Tcommaaccent period -74 -KPX Tcommaaccent r -55 -KPX Tcommaaccent racute -55 -KPX Tcommaaccent rcaron -55 -KPX Tcommaaccent rcommaaccent -55 -KPX Tcommaaccent semicolon -65 -KPX Tcommaaccent u -55 -KPX Tcommaaccent uacute -55 -KPX Tcommaaccent ucircumflex -55 -KPX Tcommaaccent udieresis -55 -KPX Tcommaaccent ugrave -55 -KPX Tcommaaccent uhungarumlaut -55 -KPX Tcommaaccent umacron -55 -KPX Tcommaaccent uogonek -55 -KPX Tcommaaccent uring -55 -KPX Tcommaaccent w -74 -KPX Tcommaaccent y -74 -KPX Tcommaaccent yacute -74 -KPX Tcommaaccent ydieresis -34 -KPX U A -40 -KPX U Aacute -40 -KPX U Abreve -40 -KPX U Acircumflex -40 -KPX U Adieresis -40 -KPX U Agrave -40 -KPX U Amacron -40 -KPX U Aogonek -40 -KPX U Aring -40 -KPX U Atilde -40 -KPX U comma -25 -KPX U period -25 -KPX Uacute A -40 -KPX Uacute Aacute -40 -KPX Uacute Abreve -40 -KPX Uacute Acircumflex -40 -KPX Uacute Adieresis -40 -KPX Uacute Agrave -40 -KPX Uacute Amacron -40 -KPX Uacute Aogonek -40 -KPX Uacute Aring -40 -KPX Uacute Atilde -40 -KPX Uacute comma -25 -KPX Uacute period -25 -KPX Ucircumflex A -40 -KPX Ucircumflex Aacute -40 -KPX Ucircumflex Abreve -40 -KPX Ucircumflex Acircumflex -40 -KPX Ucircumflex Adieresis -40 -KPX Ucircumflex Agrave -40 -KPX Ucircumflex Amacron -40 -KPX Ucircumflex Aogonek -40 -KPX Ucircumflex Aring -40 -KPX Ucircumflex Atilde -40 -KPX Ucircumflex comma -25 -KPX Ucircumflex period -25 -KPX Udieresis A -40 -KPX Udieresis Aacute -40 -KPX Udieresis Abreve -40 -KPX Udieresis Acircumflex -40 -KPX Udieresis Adieresis -40 -KPX Udieresis Agrave -40 -KPX Udieresis Amacron -40 -KPX Udieresis Aogonek -40 -KPX Udieresis Aring -40 -KPX Udieresis Atilde -40 -KPX Udieresis comma -25 -KPX Udieresis period -25 -KPX Ugrave A -40 -KPX Ugrave Aacute -40 -KPX Ugrave Abreve -40 -KPX Ugrave Acircumflex -40 -KPX Ugrave Adieresis -40 -KPX Ugrave Agrave -40 -KPX Ugrave Amacron -40 -KPX Ugrave Aogonek -40 -KPX Ugrave Aring -40 -KPX Ugrave Atilde -40 -KPX Ugrave comma -25 -KPX Ugrave period -25 -KPX Uhungarumlaut A -40 -KPX Uhungarumlaut Aacute -40 -KPX Uhungarumlaut Abreve -40 -KPX Uhungarumlaut Acircumflex -40 -KPX Uhungarumlaut Adieresis -40 -KPX Uhungarumlaut Agrave -40 -KPX Uhungarumlaut Amacron -40 -KPX Uhungarumlaut Aogonek -40 -KPX Uhungarumlaut Aring -40 -KPX Uhungarumlaut Atilde -40 -KPX Uhungarumlaut comma -25 -KPX Uhungarumlaut period -25 -KPX Umacron A -40 -KPX Umacron Aacute -40 -KPX Umacron Abreve -40 -KPX Umacron Acircumflex -40 -KPX Umacron Adieresis -40 -KPX Umacron Agrave -40 -KPX Umacron Amacron -40 -KPX Umacron Aogonek -40 -KPX Umacron Aring -40 -KPX Umacron Atilde -40 -KPX Umacron comma -25 -KPX Umacron period -25 -KPX Uogonek A -40 -KPX Uogonek Aacute -40 -KPX Uogonek Abreve -40 -KPX Uogonek Acircumflex -40 -KPX Uogonek Adieresis -40 -KPX Uogonek Agrave -40 -KPX Uogonek Amacron -40 -KPX Uogonek Aogonek -40 -KPX Uogonek Aring -40 -KPX Uogonek Atilde -40 -KPX Uogonek comma -25 -KPX Uogonek period -25 -KPX Uring A -40 -KPX Uring Aacute -40 -KPX Uring Abreve -40 -KPX Uring Acircumflex -40 -KPX Uring Adieresis -40 -KPX Uring Agrave -40 -KPX Uring Amacron -40 -KPX Uring Aogonek -40 -KPX Uring Aring -40 -KPX Uring Atilde -40 -KPX Uring comma -25 -KPX Uring period -25 -KPX V A -60 -KPX V Aacute -60 -KPX V Abreve -60 -KPX V Acircumflex -60 -KPX V Adieresis -60 -KPX V Agrave -60 -KPX V Amacron -60 -KPX V Aogonek -60 -KPX V Aring -60 -KPX V Atilde -60 -KPX V O -30 -KPX V Oacute -30 -KPX V Ocircumflex -30 -KPX V Odieresis -30 -KPX V Ograve -30 -KPX V Ohungarumlaut -30 -KPX V Omacron -30 -KPX V Oslash -30 -KPX V Otilde -30 -KPX V a -111 -KPX V aacute -111 -KPX V abreve -111 -KPX V acircumflex -111 -KPX V adieresis -111 -KPX V agrave -111 -KPX V amacron -111 -KPX V aogonek -111 -KPX V aring -111 -KPX V atilde -111 -KPX V colon -65 -KPX V comma -129 -KPX V e -111 -KPX V eacute -111 -KPX V ecaron -111 -KPX V ecircumflex -111 -KPX V edieresis -71 -KPX V edotaccent -111 -KPX V egrave -71 -KPX V emacron -71 -KPX V eogonek -111 -KPX V hyphen -55 -KPX V i -74 -KPX V iacute -74 -KPX V icircumflex -34 -KPX V idieresis -34 -KPX V igrave -34 -KPX V imacron -34 -KPX V iogonek -74 -KPX V o -111 -KPX V oacute -111 -KPX V ocircumflex -111 -KPX V odieresis -111 -KPX V ograve -111 -KPX V ohungarumlaut -111 -KPX V omacron -111 -KPX V oslash -111 -KPX V otilde -111 -KPX V period -129 -KPX V semicolon -74 -KPX V u -74 -KPX V uacute -74 -KPX V ucircumflex -74 -KPX V udieresis -74 -KPX V ugrave -74 -KPX V uhungarumlaut -74 -KPX V umacron -74 -KPX V uogonek -74 -KPX V uring -74 -KPX W A -60 -KPX W Aacute -60 -KPX W Abreve -60 -KPX W Acircumflex -60 -KPX W Adieresis -60 -KPX W Agrave -60 -KPX W Amacron -60 -KPX W Aogonek -60 -KPX W Aring -60 -KPX W Atilde -60 -KPX W O -25 -KPX W Oacute -25 -KPX W Ocircumflex -25 -KPX W Odieresis -25 -KPX W Ograve -25 -KPX W Ohungarumlaut -25 -KPX W Omacron -25 -KPX W Oslash -25 -KPX W Otilde -25 -KPX W a -92 -KPX W aacute -92 -KPX W abreve -92 -KPX W acircumflex -92 -KPX W adieresis -92 -KPX W agrave -92 -KPX W amacron -92 -KPX W aogonek -92 -KPX W aring -92 -KPX W atilde -92 -KPX W colon -65 -KPX W comma -92 -KPX W e -92 -KPX W eacute -92 -KPX W ecaron -92 -KPX W ecircumflex -92 -KPX W edieresis -52 -KPX W edotaccent -92 -KPX W egrave -52 -KPX W emacron -52 -KPX W eogonek -92 -KPX W hyphen -37 -KPX W i -55 -KPX W iacute -55 -KPX W iogonek -55 -KPX W o -92 -KPX W oacute -92 -KPX W ocircumflex -92 -KPX W odieresis -92 -KPX W ograve -92 -KPX W ohungarumlaut -92 -KPX W omacron -92 -KPX W oslash -92 -KPX W otilde -92 -KPX W period -92 -KPX W semicolon -65 -KPX W u -55 -KPX W uacute -55 -KPX W ucircumflex -55 -KPX W udieresis -55 -KPX W ugrave -55 -KPX W uhungarumlaut -55 -KPX W umacron -55 -KPX W uogonek -55 -KPX W uring -55 -KPX W y -70 -KPX W yacute -70 -KPX W ydieresis -70 -KPX Y A -50 -KPX Y Aacute -50 -KPX Y Abreve -50 -KPX Y Acircumflex -50 -KPX Y Adieresis -50 -KPX Y Agrave -50 -KPX Y Amacron -50 -KPX Y Aogonek -50 -KPX Y Aring -50 -KPX Y Atilde -50 -KPX Y O -15 -KPX Y Oacute -15 -KPX Y Ocircumflex -15 -KPX Y Odieresis -15 -KPX Y Ograve -15 -KPX Y Ohungarumlaut -15 -KPX Y Omacron -15 -KPX Y Oslash -15 -KPX Y Otilde -15 -KPX Y a -92 -KPX Y aacute -92 -KPX Y abreve -92 -KPX Y acircumflex -92 -KPX Y adieresis -92 -KPX Y agrave -92 -KPX Y amacron -92 -KPX Y aogonek -92 -KPX Y aring -92 -KPX Y atilde -92 -KPX Y colon -65 -KPX Y comma -92 -KPX Y e -92 -KPX Y eacute -92 -KPX Y ecaron -92 -KPX Y ecircumflex -92 -KPX Y edieresis -52 -KPX Y edotaccent -92 -KPX Y egrave -52 -KPX Y emacron -52 -KPX Y eogonek -92 -KPX Y hyphen -74 -KPX Y i -74 -KPX Y iacute -74 -KPX Y icircumflex -34 -KPX Y idieresis -34 -KPX Y igrave -34 -KPX Y imacron -34 -KPX Y iogonek -74 -KPX Y o -92 -KPX Y oacute -92 -KPX Y ocircumflex -92 -KPX Y odieresis -92 -KPX Y ograve -92 -KPX Y ohungarumlaut -92 -KPX Y omacron -92 -KPX Y oslash -92 -KPX Y otilde -92 -KPX Y period -92 -KPX Y semicolon -65 -KPX Y u -92 -KPX Y uacute -92 -KPX Y ucircumflex -92 -KPX Y udieresis -92 -KPX Y ugrave -92 -KPX Y uhungarumlaut -92 -KPX Y umacron -92 -KPX Y uogonek -92 -KPX Y uring -92 -KPX Yacute A -50 -KPX Yacute Aacute -50 -KPX Yacute Abreve -50 -KPX Yacute Acircumflex -50 -KPX Yacute Adieresis -50 -KPX Yacute Agrave -50 -KPX Yacute Amacron -50 -KPX Yacute Aogonek -50 -KPX Yacute Aring -50 -KPX Yacute Atilde -50 -KPX Yacute O -15 -KPX Yacute Oacute -15 -KPX Yacute Ocircumflex -15 -KPX Yacute Odieresis -15 -KPX Yacute Ograve -15 -KPX Yacute Ohungarumlaut -15 -KPX Yacute Omacron -15 -KPX Yacute Oslash -15 -KPX Yacute Otilde -15 -KPX Yacute a -92 -KPX Yacute aacute -92 -KPX Yacute abreve -92 -KPX Yacute acircumflex -92 -KPX Yacute adieresis -92 -KPX Yacute agrave -92 -KPX Yacute amacron -92 -KPX Yacute aogonek -92 -KPX Yacute aring -92 -KPX Yacute atilde -92 -KPX Yacute colon -65 -KPX Yacute comma -92 -KPX Yacute e -92 -KPX Yacute eacute -92 -KPX Yacute ecaron -92 -KPX Yacute ecircumflex -92 -KPX Yacute edieresis -52 -KPX Yacute edotaccent -92 -KPX Yacute egrave -52 -KPX Yacute emacron -52 -KPX Yacute eogonek -92 -KPX Yacute hyphen -74 -KPX Yacute i -74 -KPX Yacute iacute -74 -KPX Yacute icircumflex -34 -KPX Yacute idieresis -34 -KPX Yacute igrave -34 -KPX Yacute imacron -34 -KPX Yacute iogonek -74 -KPX Yacute o -92 -KPX Yacute oacute -92 -KPX Yacute ocircumflex -92 -KPX Yacute odieresis -92 -KPX Yacute ograve -92 -KPX Yacute ohungarumlaut -92 -KPX Yacute omacron -92 -KPX Yacute oslash -92 -KPX Yacute otilde -92 -KPX Yacute period -92 -KPX Yacute semicolon -65 -KPX Yacute u -92 -KPX Yacute uacute -92 -KPX Yacute ucircumflex -92 -KPX Yacute udieresis -92 -KPX Yacute ugrave -92 -KPX Yacute uhungarumlaut -92 -KPX Yacute umacron -92 -KPX Yacute uogonek -92 -KPX Yacute uring -92 -KPX Ydieresis A -50 -KPX Ydieresis Aacute -50 -KPX Ydieresis Abreve -50 -KPX Ydieresis Acircumflex -50 -KPX Ydieresis Adieresis -50 -KPX Ydieresis Agrave -50 -KPX Ydieresis Amacron -50 -KPX Ydieresis Aogonek -50 -KPX Ydieresis Aring -50 -KPX Ydieresis Atilde -50 -KPX Ydieresis O -15 -KPX Ydieresis Oacute -15 -KPX Ydieresis Ocircumflex -15 -KPX Ydieresis Odieresis -15 -KPX Ydieresis Ograve -15 -KPX Ydieresis Ohungarumlaut -15 -KPX Ydieresis Omacron -15 -KPX Ydieresis Oslash -15 -KPX Ydieresis Otilde -15 -KPX Ydieresis a -92 -KPX Ydieresis aacute -92 -KPX Ydieresis abreve -92 -KPX Ydieresis acircumflex -92 -KPX Ydieresis adieresis -92 -KPX Ydieresis agrave -92 -KPX Ydieresis amacron -92 -KPX Ydieresis aogonek -92 -KPX Ydieresis aring -92 -KPX Ydieresis atilde -92 -KPX Ydieresis colon -65 -KPX Ydieresis comma -92 -KPX Ydieresis e -92 -KPX Ydieresis eacute -92 -KPX Ydieresis ecaron -92 -KPX Ydieresis ecircumflex -92 -KPX Ydieresis edieresis -52 -KPX Ydieresis edotaccent -92 -KPX Ydieresis egrave -52 -KPX Ydieresis emacron -52 -KPX Ydieresis eogonek -92 -KPX Ydieresis hyphen -74 -KPX Ydieresis i -74 -KPX Ydieresis iacute -74 -KPX Ydieresis icircumflex -34 -KPX Ydieresis idieresis -34 -KPX Ydieresis igrave -34 -KPX Ydieresis imacron -34 -KPX Ydieresis iogonek -74 -KPX Ydieresis o -92 -KPX Ydieresis oacute -92 -KPX Ydieresis ocircumflex -92 -KPX Ydieresis odieresis -92 -KPX Ydieresis ograve -92 -KPX Ydieresis ohungarumlaut -92 -KPX Ydieresis omacron -92 -KPX Ydieresis oslash -92 -KPX Ydieresis otilde -92 -KPX Ydieresis period -92 -KPX Ydieresis semicolon -65 -KPX Ydieresis u -92 -KPX Ydieresis uacute -92 -KPX Ydieresis ucircumflex -92 -KPX Ydieresis udieresis -92 -KPX Ydieresis ugrave -92 -KPX Ydieresis uhungarumlaut -92 -KPX Ydieresis umacron -92 -KPX Ydieresis uogonek -92 -KPX Ydieresis uring -92 -KPX a g -10 -KPX a gbreve -10 -KPX a gcommaaccent -10 -KPX aacute g -10 -KPX aacute gbreve -10 -KPX aacute gcommaaccent -10 -KPX abreve g -10 -KPX abreve gbreve -10 -KPX abreve gcommaaccent -10 -KPX acircumflex g -10 -KPX acircumflex gbreve -10 -KPX acircumflex gcommaaccent -10 -KPX adieresis g -10 -KPX adieresis gbreve -10 -KPX adieresis gcommaaccent -10 -KPX agrave g -10 -KPX agrave gbreve -10 -KPX agrave gcommaaccent -10 -KPX amacron g -10 -KPX amacron gbreve -10 -KPX amacron gcommaaccent -10 -KPX aogonek g -10 -KPX aogonek gbreve -10 -KPX aogonek gcommaaccent -10 -KPX aring g -10 -KPX aring gbreve -10 -KPX aring gcommaaccent -10 -KPX atilde g -10 -KPX atilde gbreve -10 -KPX atilde gcommaaccent -10 -KPX b period -40 -KPX b u -20 -KPX b uacute -20 -KPX b ucircumflex -20 -KPX b udieresis -20 -KPX b ugrave -20 -KPX b uhungarumlaut -20 -KPX b umacron -20 -KPX b uogonek -20 -KPX b uring -20 -KPX c h -15 -KPX c k -20 -KPX c kcommaaccent -20 -KPX cacute h -15 -KPX cacute k -20 -KPX cacute kcommaaccent -20 -KPX ccaron h -15 -KPX ccaron k -20 -KPX ccaron kcommaaccent -20 -KPX ccedilla h -15 -KPX ccedilla k -20 -KPX ccedilla kcommaaccent -20 -KPX comma quotedblright -140 -KPX comma quoteright -140 -KPX e comma -10 -KPX e g -40 -KPX e gbreve -40 -KPX e gcommaaccent -40 -KPX e period -15 -KPX e v -15 -KPX e w -15 -KPX e x -20 -KPX e y -30 -KPX e yacute -30 -KPX e ydieresis -30 -KPX eacute comma -10 -KPX eacute g -40 -KPX eacute gbreve -40 -KPX eacute gcommaaccent -40 -KPX eacute period -15 -KPX eacute v -15 -KPX eacute w -15 -KPX eacute x -20 -KPX eacute y -30 -KPX eacute yacute -30 -KPX eacute ydieresis -30 -KPX ecaron comma -10 -KPX ecaron g -40 -KPX ecaron gbreve -40 -KPX ecaron gcommaaccent -40 -KPX ecaron period -15 -KPX ecaron v -15 -KPX ecaron w -15 -KPX ecaron x -20 -KPX ecaron y -30 -KPX ecaron yacute -30 -KPX ecaron ydieresis -30 -KPX ecircumflex comma -10 -KPX ecircumflex g -40 -KPX ecircumflex gbreve -40 -KPX ecircumflex gcommaaccent -40 -KPX ecircumflex period -15 -KPX ecircumflex v -15 -KPX ecircumflex w -15 -KPX ecircumflex x -20 -KPX ecircumflex y -30 -KPX ecircumflex yacute -30 -KPX ecircumflex ydieresis -30 -KPX edieresis comma -10 -KPX edieresis g -40 -KPX edieresis gbreve -40 -KPX edieresis gcommaaccent -40 -KPX edieresis period -15 -KPX edieresis v -15 -KPX edieresis w -15 -KPX edieresis x -20 -KPX edieresis y -30 -KPX edieresis yacute -30 -KPX edieresis ydieresis -30 -KPX edotaccent comma -10 -KPX edotaccent g -40 -KPX edotaccent gbreve -40 -KPX edotaccent gcommaaccent -40 -KPX edotaccent period -15 -KPX edotaccent v -15 -KPX edotaccent w -15 -KPX edotaccent x -20 -KPX edotaccent y -30 -KPX edotaccent yacute -30 -KPX edotaccent ydieresis -30 -KPX egrave comma -10 -KPX egrave g -40 -KPX egrave gbreve -40 -KPX egrave gcommaaccent -40 -KPX egrave period -15 -KPX egrave v -15 -KPX egrave w -15 -KPX egrave x -20 -KPX egrave y -30 -KPX egrave yacute -30 -KPX egrave ydieresis -30 -KPX emacron comma -10 -KPX emacron g -40 -KPX emacron gbreve -40 -KPX emacron gcommaaccent -40 -KPX emacron period -15 -KPX emacron v -15 -KPX emacron w -15 -KPX emacron x -20 -KPX emacron y -30 -KPX emacron yacute -30 -KPX emacron ydieresis -30 -KPX eogonek comma -10 -KPX eogonek g -40 -KPX eogonek gbreve -40 -KPX eogonek gcommaaccent -40 -KPX eogonek period -15 -KPX eogonek v -15 -KPX eogonek w -15 -KPX eogonek x -20 -KPX eogonek y -30 -KPX eogonek yacute -30 -KPX eogonek ydieresis -30 -KPX f comma -10 -KPX f dotlessi -60 -KPX f f -18 -KPX f i -20 -KPX f iogonek -20 -KPX f period -15 -KPX f quoteright 92 -KPX g comma -10 -KPX g e -10 -KPX g eacute -10 -KPX g ecaron -10 -KPX g ecircumflex -10 -KPX g edieresis -10 -KPX g edotaccent -10 -KPX g egrave -10 -KPX g emacron -10 -KPX g eogonek -10 -KPX g g -10 -KPX g gbreve -10 -KPX g gcommaaccent -10 -KPX g period -15 -KPX gbreve comma -10 -KPX gbreve e -10 -KPX gbreve eacute -10 -KPX gbreve ecaron -10 -KPX gbreve ecircumflex -10 -KPX gbreve edieresis -10 -KPX gbreve edotaccent -10 -KPX gbreve egrave -10 -KPX gbreve emacron -10 -KPX gbreve eogonek -10 -KPX gbreve g -10 -KPX gbreve gbreve -10 -KPX gbreve gcommaaccent -10 -KPX gbreve period -15 -KPX gcommaaccent comma -10 -KPX gcommaaccent e -10 -KPX gcommaaccent eacute -10 -KPX gcommaaccent ecaron -10 -KPX gcommaaccent ecircumflex -10 -KPX gcommaaccent edieresis -10 -KPX gcommaaccent edotaccent -10 -KPX gcommaaccent egrave -10 -KPX gcommaaccent emacron -10 -KPX gcommaaccent eogonek -10 -KPX gcommaaccent g -10 -KPX gcommaaccent gbreve -10 -KPX gcommaaccent gcommaaccent -10 -KPX gcommaaccent period -15 -KPX k e -10 -KPX k eacute -10 -KPX k ecaron -10 -KPX k ecircumflex -10 -KPX k edieresis -10 -KPX k edotaccent -10 -KPX k egrave -10 -KPX k emacron -10 -KPX k eogonek -10 -KPX k o -10 -KPX k oacute -10 -KPX k ocircumflex -10 -KPX k odieresis -10 -KPX k ograve -10 -KPX k ohungarumlaut -10 -KPX k omacron -10 -KPX k oslash -10 -KPX k otilde -10 -KPX k y -10 -KPX k yacute -10 -KPX k ydieresis -10 -KPX kcommaaccent e -10 -KPX kcommaaccent eacute -10 -KPX kcommaaccent ecaron -10 -KPX kcommaaccent ecircumflex -10 -KPX kcommaaccent edieresis -10 -KPX kcommaaccent edotaccent -10 -KPX kcommaaccent egrave -10 -KPX kcommaaccent emacron -10 -KPX kcommaaccent eogonek -10 -KPX kcommaaccent o -10 -KPX kcommaaccent oacute -10 -KPX kcommaaccent ocircumflex -10 -KPX kcommaaccent odieresis -10 -KPX kcommaaccent ograve -10 -KPX kcommaaccent ohungarumlaut -10 -KPX kcommaaccent omacron -10 -KPX kcommaaccent oslash -10 -KPX kcommaaccent otilde -10 -KPX kcommaaccent y -10 -KPX kcommaaccent yacute -10 -KPX kcommaaccent ydieresis -10 -KPX n v -40 -KPX nacute v -40 -KPX ncaron v -40 -KPX ncommaaccent v -40 -KPX ntilde v -40 -KPX o g -10 -KPX o gbreve -10 -KPX o gcommaaccent -10 -KPX o v -10 -KPX oacute g -10 -KPX oacute gbreve -10 -KPX oacute gcommaaccent -10 -KPX oacute v -10 -KPX ocircumflex g -10 -KPX ocircumflex gbreve -10 -KPX ocircumflex gcommaaccent -10 -KPX ocircumflex v -10 -KPX odieresis g -10 -KPX odieresis gbreve -10 -KPX odieresis gcommaaccent -10 -KPX odieresis v -10 -KPX ograve g -10 -KPX ograve gbreve -10 -KPX ograve gcommaaccent -10 -KPX ograve v -10 -KPX ohungarumlaut g -10 -KPX ohungarumlaut gbreve -10 -KPX ohungarumlaut gcommaaccent -10 -KPX ohungarumlaut v -10 -KPX omacron g -10 -KPX omacron gbreve -10 -KPX omacron gcommaaccent -10 -KPX omacron v -10 -KPX oslash g -10 -KPX oslash gbreve -10 -KPX oslash gcommaaccent -10 -KPX oslash v -10 -KPX otilde g -10 -KPX otilde gbreve -10 -KPX otilde gcommaaccent -10 -KPX otilde v -10 -KPX period quotedblright -140 -KPX period quoteright -140 -KPX quoteleft quoteleft -111 -KPX quoteright d -25 -KPX quoteright dcroat -25 -KPX quoteright quoteright -111 -KPX quoteright r -25 -KPX quoteright racute -25 -KPX quoteright rcaron -25 -KPX quoteright rcommaaccent -25 -KPX quoteright s -40 -KPX quoteright sacute -40 -KPX quoteright scaron -40 -KPX quoteright scedilla -40 -KPX quoteright scommaaccent -40 -KPX quoteright space -111 -KPX quoteright t -30 -KPX quoteright tcommaaccent -30 -KPX quoteright v -10 -KPX r a -15 -KPX r aacute -15 -KPX r abreve -15 -KPX r acircumflex -15 -KPX r adieresis -15 -KPX r agrave -15 -KPX r amacron -15 -KPX r aogonek -15 -KPX r aring -15 -KPX r atilde -15 -KPX r c -37 -KPX r cacute -37 -KPX r ccaron -37 -KPX r ccedilla -37 -KPX r comma -111 -KPX r d -37 -KPX r dcroat -37 -KPX r e -37 -KPX r eacute -37 -KPX r ecaron -37 -KPX r ecircumflex -37 -KPX r edieresis -37 -KPX r edotaccent -37 -KPX r egrave -37 -KPX r emacron -37 -KPX r eogonek -37 -KPX r g -37 -KPX r gbreve -37 -KPX r gcommaaccent -37 -KPX r hyphen -20 -KPX r o -45 -KPX r oacute -45 -KPX r ocircumflex -45 -KPX r odieresis -45 -KPX r ograve -45 -KPX r ohungarumlaut -45 -KPX r omacron -45 -KPX r oslash -45 -KPX r otilde -45 -KPX r period -111 -KPX r q -37 -KPX r s -10 -KPX r sacute -10 -KPX r scaron -10 -KPX r scedilla -10 -KPX r scommaaccent -10 -KPX racute a -15 -KPX racute aacute -15 -KPX racute abreve -15 -KPX racute acircumflex -15 -KPX racute adieresis -15 -KPX racute agrave -15 -KPX racute amacron -15 -KPX racute aogonek -15 -KPX racute aring -15 -KPX racute atilde -15 -KPX racute c -37 -KPX racute cacute -37 -KPX racute ccaron -37 -KPX racute ccedilla -37 -KPX racute comma -111 -KPX racute d -37 -KPX racute dcroat -37 -KPX racute e -37 -KPX racute eacute -37 -KPX racute ecaron -37 -KPX racute ecircumflex -37 -KPX racute edieresis -37 -KPX racute edotaccent -37 -KPX racute egrave -37 -KPX racute emacron -37 -KPX racute eogonek -37 -KPX racute g -37 -KPX racute gbreve -37 -KPX racute gcommaaccent -37 -KPX racute hyphen -20 -KPX racute o -45 -KPX racute oacute -45 -KPX racute ocircumflex -45 -KPX racute odieresis -45 -KPX racute ograve -45 -KPX racute ohungarumlaut -45 -KPX racute omacron -45 -KPX racute oslash -45 -KPX racute otilde -45 -KPX racute period -111 -KPX racute q -37 -KPX racute s -10 -KPX racute sacute -10 -KPX racute scaron -10 -KPX racute scedilla -10 -KPX racute scommaaccent -10 -KPX rcaron a -15 -KPX rcaron aacute -15 -KPX rcaron abreve -15 -KPX rcaron acircumflex -15 -KPX rcaron adieresis -15 -KPX rcaron agrave -15 -KPX rcaron amacron -15 -KPX rcaron aogonek -15 -KPX rcaron aring -15 -KPX rcaron atilde -15 -KPX rcaron c -37 -KPX rcaron cacute -37 -KPX rcaron ccaron -37 -KPX rcaron ccedilla -37 -KPX rcaron comma -111 -KPX rcaron d -37 -KPX rcaron dcroat -37 -KPX rcaron e -37 -KPX rcaron eacute -37 -KPX rcaron ecaron -37 -KPX rcaron ecircumflex -37 -KPX rcaron edieresis -37 -KPX rcaron edotaccent -37 -KPX rcaron egrave -37 -KPX rcaron emacron -37 -KPX rcaron eogonek -37 -KPX rcaron g -37 -KPX rcaron gbreve -37 -KPX rcaron gcommaaccent -37 -KPX rcaron hyphen -20 -KPX rcaron o -45 -KPX rcaron oacute -45 -KPX rcaron ocircumflex -45 -KPX rcaron odieresis -45 -KPX rcaron ograve -45 -KPX rcaron ohungarumlaut -45 -KPX rcaron omacron -45 -KPX rcaron oslash -45 -KPX rcaron otilde -45 -KPX rcaron period -111 -KPX rcaron q -37 -KPX rcaron s -10 -KPX rcaron sacute -10 -KPX rcaron scaron -10 -KPX rcaron scedilla -10 -KPX rcaron scommaaccent -10 -KPX rcommaaccent a -15 -KPX rcommaaccent aacute -15 -KPX rcommaaccent abreve -15 -KPX rcommaaccent acircumflex -15 -KPX rcommaaccent adieresis -15 -KPX rcommaaccent agrave -15 -KPX rcommaaccent amacron -15 -KPX rcommaaccent aogonek -15 -KPX rcommaaccent aring -15 -KPX rcommaaccent atilde -15 -KPX rcommaaccent c -37 -KPX rcommaaccent cacute -37 -KPX rcommaaccent ccaron -37 -KPX rcommaaccent ccedilla -37 -KPX rcommaaccent comma -111 -KPX rcommaaccent d -37 -KPX rcommaaccent dcroat -37 -KPX rcommaaccent e -37 -KPX rcommaaccent eacute -37 -KPX rcommaaccent ecaron -37 -KPX rcommaaccent ecircumflex -37 -KPX rcommaaccent edieresis -37 -KPX rcommaaccent edotaccent -37 -KPX rcommaaccent egrave -37 -KPX rcommaaccent emacron -37 -KPX rcommaaccent eogonek -37 -KPX rcommaaccent g -37 -KPX rcommaaccent gbreve -37 -KPX rcommaaccent gcommaaccent -37 -KPX rcommaaccent hyphen -20 -KPX rcommaaccent o -45 -KPX rcommaaccent oacute -45 -KPX rcommaaccent ocircumflex -45 -KPX rcommaaccent odieresis -45 -KPX rcommaaccent ograve -45 -KPX rcommaaccent ohungarumlaut -45 -KPX rcommaaccent omacron -45 -KPX rcommaaccent oslash -45 -KPX rcommaaccent otilde -45 -KPX rcommaaccent period -111 -KPX rcommaaccent q -37 -KPX rcommaaccent s -10 -KPX rcommaaccent sacute -10 -KPX rcommaaccent scaron -10 -KPX rcommaaccent scedilla -10 -KPX rcommaaccent scommaaccent -10 -KPX space A -18 -KPX space Aacute -18 -KPX space Abreve -18 -KPX space Acircumflex -18 -KPX space Adieresis -18 -KPX space Agrave -18 -KPX space Amacron -18 -KPX space Aogonek -18 -KPX space Aring -18 -KPX space Atilde -18 -KPX space T -18 -KPX space Tcaron -18 -KPX space Tcommaaccent -18 -KPX space V -35 -KPX space W -40 -KPX space Y -75 -KPX space Yacute -75 -KPX space Ydieresis -75 -KPX v comma -74 -KPX v period -74 -KPX w comma -74 -KPX w period -74 -KPX y comma -55 -KPX y period -55 -KPX yacute comma -55 -KPX yacute period -55 -KPX ydieresis comma -55 -KPX ydieresis period -55 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Times-Roman.afm b/vendor/dompdf/dompdf/lib/fonts/Times-Roman.afm deleted file mode 100644 index ffea269..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Times-Roman.afm +++ /dev/null @@ -1,2421 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 1 12:49:17 1997 -Comment UniqueID 43068 -Comment VMusage 43909 54934 -FontName Times-Roman -FullName Times Roman -FamilyName Times -Weight Roman -ItalicAngle 0 -IsFixedPitch false -CharacterSet ExtendedRoman -FontBBox -168 -218 1000 898 -UnderlinePosition -100 -UnderlineThickness 50 -Version 002.00 -Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. -EncodingScheme WinAnsiEncoding -CapHeight 662 -XHeight 450 -Ascender 683 -Descender -217 -StdHW 28 -StdVW 84 -StartCharMetrics 317 -C 32 ; WX 250 ; N space ; B 0 0 0 0 ; -C 160 ; WX 250 ; N space ; B 0 0 0 0 ; -C 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ; -C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ; -C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ; -C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ; -C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ; -C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ; -C 146 ; WX 333 ; N quoteright ; B 79 433 218 676 ; -C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ; -C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ; -C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ; -C 43 ; WX 564 ; N plus ; B 30 0 534 506 ; -C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ; -C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ; -C 173 ; WX 333 ; N hyphen ; B 39 194 285 257 ; -C 46 ; WX 250 ; N period ; B 70 -11 181 100 ; -C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ; -C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ; -C 49 ; WX 500 ; N one ; B 111 0 394 676 ; -C 50 ; WX 500 ; N two ; B 30 0 475 676 ; -C 51 ; WX 500 ; N three ; B 43 -14 431 676 ; -C 52 ; WX 500 ; N four ; B 12 0 472 676 ; -C 53 ; WX 500 ; N five ; B 32 -14 438 688 ; -C 54 ; WX 500 ; N six ; B 34 -14 468 684 ; -C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ; -C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ; -C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ; -C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ; -C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ; -C 60 ; WX 564 ; N less ; B 28 -8 536 514 ; -C 61 ; WX 564 ; N equal ; B 30 120 534 386 ; -C 62 ; WX 564 ; N greater ; B 28 -8 536 514 ; -C 63 ; WX 444 ; N question ; B 68 -8 414 676 ; -C 64 ; WX 921 ; N at ; B 116 -14 809 676 ; -C 65 ; WX 722 ; N A ; B 15 0 706 674 ; -C 66 ; WX 667 ; N B ; B 17 0 593 662 ; -C 67 ; WX 667 ; N C ; B 28 -14 633 676 ; -C 68 ; WX 722 ; N D ; B 16 0 685 662 ; -C 69 ; WX 611 ; N E ; B 12 0 597 662 ; -C 70 ; WX 556 ; N F ; B 12 0 546 662 ; -C 71 ; WX 722 ; N G ; B 32 -14 709 676 ; -C 72 ; WX 722 ; N H ; B 19 0 702 662 ; -C 73 ; WX 333 ; N I ; B 18 0 315 662 ; -C 74 ; WX 389 ; N J ; B 10 -14 370 662 ; -C 75 ; WX 722 ; N K ; B 34 0 723 662 ; -C 76 ; WX 611 ; N L ; B 12 0 598 662 ; -C 77 ; WX 889 ; N M ; B 12 0 863 662 ; -C 78 ; WX 722 ; N N ; B 12 -11 707 662 ; -C 79 ; WX 722 ; N O ; B 34 -14 688 676 ; -C 80 ; WX 556 ; N P ; B 16 0 542 662 ; -C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ; -C 82 ; WX 667 ; N R ; B 17 0 659 662 ; -C 83 ; WX 556 ; N S ; B 42 -14 491 676 ; -C 84 ; WX 611 ; N T ; B 17 0 593 662 ; -C 85 ; WX 722 ; N U ; B 14 -14 705 662 ; -C 86 ; WX 722 ; N V ; B 16 -11 697 662 ; -C 87 ; WX 944 ; N W ; B 5 -11 932 662 ; -C 88 ; WX 722 ; N X ; B 10 0 704 662 ; -C 89 ; WX 722 ; N Y ; B 22 0 703 662 ; -C 90 ; WX 611 ; N Z ; B 9 0 597 662 ; -C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ; -C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ; -C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ; -C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ; -C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; -C 145 ; WX 333 ; N quoteleft ; B 115 433 254 676 ; -C 97 ; WX 444 ; N a ; B 37 -10 442 460 ; -C 98 ; WX 500 ; N b ; B 3 -10 468 683 ; -C 99 ; WX 444 ; N c ; B 25 -10 412 460 ; -C 100 ; WX 500 ; N d ; B 27 -10 491 683 ; -C 101 ; WX 444 ; N e ; B 25 -10 424 460 ; -C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ; -C 103 ; WX 500 ; N g ; B 28 -218 470 460 ; -C 104 ; WX 500 ; N h ; B 9 0 487 683 ; -C 105 ; WX 278 ; N i ; B 16 0 253 683 ; -C 106 ; WX 278 ; N j ; B -70 -218 194 683 ; -C 107 ; WX 500 ; N k ; B 7 0 505 683 ; -C 108 ; WX 278 ; N l ; B 19 0 257 683 ; -C 109 ; WX 778 ; N m ; B 16 0 775 460 ; -C 110 ; WX 500 ; N n ; B 16 0 485 460 ; -C 111 ; WX 500 ; N o ; B 29 -10 470 460 ; -C 112 ; WX 500 ; N p ; B 5 -217 470 460 ; -C 113 ; WX 500 ; N q ; B 24 -217 488 460 ; -C 114 ; WX 333 ; N r ; B 5 0 335 460 ; -C 115 ; WX 389 ; N s ; B 51 -10 348 460 ; -C 116 ; WX 278 ; N t ; B 13 -10 279 579 ; -C 117 ; WX 500 ; N u ; B 9 -10 479 450 ; -C 118 ; WX 500 ; N v ; B 19 -14 477 450 ; -C 119 ; WX 722 ; N w ; B 21 -14 694 450 ; -C 120 ; WX 500 ; N x ; B 17 0 479 450 ; -C 121 ; WX 500 ; N y ; B 14 -218 475 450 ; -C 122 ; WX 444 ; N z ; B 27 0 418 450 ; -C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ; -C 124 ; WX 200 ; N bar ; B 67 -218 133 782 ; -C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ; -C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; -C 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ; -C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ; -C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ; -C -1 ; WX 167 ; N fraction ; B -168 -14 331 676 ; -C 165 ; WX 500 ; N yen ; B -53 0 512 662 ; -C 131 ; WX 500 ; N florin ; B 7 -189 490 676 ; -C 167 ; WX 500 ; N section ; B 70 -148 426 676 ; -C 164 ; WX 500 ; N currency ; B -22 58 522 602 ; -C 39 ; WX 180 ; N quotesingle ; B 48 431 133 676 ; -C 147 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ; -C 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ; -C 139 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ; -C 155 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ; -C -1 ; WX 556 ; N fi ; B 31 0 521 683 ; -C -1 ; WX 556 ; N fl ; B 32 0 521 683 ; -C 150 ; WX 500 ; N endash ; B 0 201 500 250 ; -C 134 ; WX 500 ; N dagger ; B 59 -149 442 676 ; -C 135 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ; -C 183 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; -C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ; -C 149 ; WX 350 ; N bullet ; B 40 196 310 466 ; -C 130 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ; -C 132 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ; -C 148 ; WX 444 ; N quotedblright ; B 30 433 401 676 ; -C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ; -C 133 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ; -C 137 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ; -C 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ; -C 96 ; WX 333 ; N grave ; B 19 507 242 678 ; -C 180 ; WX 333 ; N acute ; B 93 507 317 678 ; -C 136 ; WX 333 ; N circumflex ; B 11 507 322 674 ; -C 152 ; WX 333 ; N tilde ; B 1 532 331 638 ; -C 175 ; WX 333 ; N macron ; B 11 547 322 601 ; -C -1 ; WX 333 ; N breve ; B 26 507 307 664 ; -C -1 ; WX 333 ; N dotaccent ; B 118 581 216 681 ; -C 168 ; WX 333 ; N dieresis ; B 18 581 315 681 ; -C -1 ; WX 333 ; N ring ; B 67 512 266 711 ; -C 184 ; WX 333 ; N cedilla ; B 52 -215 261 0 ; -C -1 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ; -C -1 ; WX 333 ; N ogonek ; B 62 -165 243 0 ; -C -1 ; WX 333 ; N caron ; B 11 507 322 674 ; -C 151 ; WX 1000 ; N emdash ; B 0 201 1000 250 ; -C 198 ; WX 889 ; N AE ; B 0 0 863 662 ; -C 170 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ; -C -1 ; WX 611 ; N Lslash ; B 12 0 598 662 ; -C 216 ; WX 722 ; N Oslash ; B 34 -80 688 734 ; -C 140 ; WX 889 ; N OE ; B 30 -6 885 668 ; -C 186 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ; -C 230 ; WX 667 ; N ae ; B 38 -10 632 460 ; -C -1 ; WX 278 ; N dotlessi ; B 16 0 253 460 ; -C -1 ; WX 278 ; N lslash ; B 19 0 259 683 ; -C 248 ; WX 500 ; N oslash ; B 29 -112 470 551 ; -C 156 ; WX 722 ; N oe ; B 30 -10 690 460 ; -C 223 ; WX 500 ; N germandbls ; B 12 -9 468 683 ; -C 207 ; WX 333 ; N Idieresis ; B 18 0 315 835 ; -C 233 ; WX 444 ; N eacute ; B 25 -10 424 678 ; -C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ; -C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ; -C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ; -C 159 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ; -C 247 ; WX 564 ; N divide ; B 30 -10 534 516 ; -C 221 ; WX 722 ; N Yacute ; B 22 0 703 890 ; -C 194 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ; -C 225 ; WX 444 ; N aacute ; B 37 -10 442 678 ; -C 219 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ; -C 253 ; WX 500 ; N yacute ; B 14 -218 475 678 ; -C -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ; -C 234 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ; -C -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ; -C 220 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ; -C -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ; -C 218 ; WX 722 ; N Uacute ; B 14 -14 705 890 ; -C -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ; -C 203 ; WX 611 ; N Edieresis ; B 12 0 597 835 ; -C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ; -C -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ; -C 169 ; WX 760 ; N copyright ; B 38 -14 722 676 ; -C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ; -C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ; -C 229 ; WX 444 ; N aring ; B 37 -10 442 711 ; -C -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ; -C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ; -C 224 ; WX 444 ; N agrave ; B 37 -10 442 678 ; -C -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ; -C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ; -C 227 ; WX 444 ; N atilde ; B 37 -10 442 638 ; -C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ; -C 154 ; WX 389 ; N scaron ; B 39 -10 350 674 ; -C -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ; -C 237 ; WX 278 ; N iacute ; B 16 0 290 678 ; -C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; -C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ; -C -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ; -C 251 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ; -C 226 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ; -C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ; -C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ; -C 231 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ; -C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ; -C 222 ; WX 556 ; N Thorn ; B 16 0 542 662 ; -C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ; -C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ; -C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ; -C -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ; -C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ; -C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ; -C 179 ; WX 300 ; N threesuperior ; B 15 262 291 676 ; -C 210 ; WX 722 ; N Ograve ; B 34 -14 688 890 ; -C 192 ; WX 722 ; N Agrave ; B 15 0 706 890 ; -C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ; -C 215 ; WX 564 ; N multiply ; B 38 8 527 497 ; -C 250 ; WX 500 ; N uacute ; B 9 -10 479 678 ; -C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ; -C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; -C 255 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ; -C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ; -C 238 ; WX 278 ; N icircumflex ; B -16 0 295 674 ; -C 202 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ; -C 228 ; WX 444 ; N adieresis ; B 37 -10 442 623 ; -C 235 ; WX 444 ; N edieresis ; B 25 -10 424 623 ; -C -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ; -C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ; -C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ; -C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ; -C 205 ; WX 333 ; N Iacute ; B 18 0 317 890 ; -C 177 ; WX 564 ; N plusminus ; B 30 0 534 506 ; -C 166 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ; -C 174 ; WX 760 ; N registered ; B 38 -14 722 676 ; -C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ; -C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ; -C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; -C 200 ; WX 611 ; N Egrave ; B 12 0 597 890 ; -C -1 ; WX 333 ; N racute ; B 5 0 335 678 ; -C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ; -C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ; -C 142 ; WX 611 ; N Zcaron ; B 9 0 597 886 ; -C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ; -C 208 ; WX 722 ; N Eth ; B 16 0 685 662 ; -C 199 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ; -C -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ; -C -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ; -C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ; -C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ; -C 193 ; WX 722 ; N Aacute ; B 15 0 706 890 ; -C 196 ; WX 722 ; N Adieresis ; B 15 0 706 835 ; -C 232 ; WX 444 ; N egrave ; B 25 -10 424 678 ; -C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ; -C -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ; -C 211 ; WX 722 ; N Oacute ; B 34 -14 688 890 ; -C 243 ; WX 500 ; N oacute ; B 29 -10 470 678 ; -C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ; -C -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ; -C 239 ; WX 278 ; N idieresis ; B -9 0 288 623 ; -C 212 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ; -C 217 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ; -C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; -C 254 ; WX 500 ; N thorn ; B 5 -217 470 683 ; -C 178 ; WX 300 ; N twosuperior ; B 1 270 296 676 ; -C 214 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ; -C 181 ; WX 500 ; N mu ; B 36 -218 512 450 ; -C 236 ; WX 278 ; N igrave ; B -8 0 253 678 ; -C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ; -C -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ; -C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ; -C 190 ; WX 750 ; N threequarters ; B 15 -14 718 676 ; -C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ; -C -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ; -C -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ; -C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ; -C 153 ; WX 980 ; N trademark ; B 30 256 957 662 ; -C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ; -C 204 ; WX 333 ; N Igrave ; B 18 0 315 890 ; -C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ; -C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ; -C 189 ; WX 750 ; N onehalf ; B 31 -14 746 676 ; -C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ; -C 244 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ; -C 241 ; WX 500 ; N ntilde ; B 16 0 485 638 ; -C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ; -C 201 ; WX 611 ; N Eacute ; B 12 0 597 890 ; -C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ; -C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ; -C 188 ; WX 750 ; N onequarter ; B 37 -14 718 676 ; -C 138 ; WX 556 ; N Scaron ; B 42 -14 491 886 ; -C -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ; -C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ; -C 176 ; WX 400 ; N degree ; B 57 390 343 676 ; -C 242 ; WX 500 ; N ograve ; B 29 -10 470 678 ; -C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ; -C 249 ; WX 500 ; N ugrave ; B 9 -10 479 678 ; -C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; -C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ; -C -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ; -C 209 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ; -C 245 ; WX 500 ; N otilde ; B 29 -10 470 638 ; -C -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ; -C -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ; -C 195 ; WX 722 ; N Atilde ; B 15 0 706 850 ; -C -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ; -C 197 ; WX 722 ; N Aring ; B 15 0 706 898 ; -C 213 ; WX 722 ; N Otilde ; B 34 -14 688 850 ; -C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ; -C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ; -C -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ; -C -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ; -C -1 ; WX 564 ; N minus ; B 30 220 534 286 ; -C 206 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ; -C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ; -C -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ; -C 172 ; WX 564 ; N logicalnot ; B 30 108 534 386 ; -C 246 ; WX 500 ; N odieresis ; B 29 -10 470 623 ; -C 252 ; WX 500 ; N udieresis ; B 9 -10 479 623 ; -C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ; -C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ; -C 240 ; WX 500 ; N eth ; B 29 -10 471 686 ; -C 158 ; WX 444 ; N zcaron ; B 27 0 418 674 ; -C -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ; -C 185 ; WX 300 ; N onesuperior ; B 57 270 248 676 ; -C -1 ; WX 278 ; N imacron ; B 6 0 271 601 ; -C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; -EndCharMetrics -StartKernData -StartKernPairs 2073 -KPX A C -40 -KPX A Cacute -40 -KPX A Ccaron -40 -KPX A Ccedilla -40 -KPX A G -40 -KPX A Gbreve -40 -KPX A Gcommaaccent -40 -KPX A O -55 -KPX A Oacute -55 -KPX A Ocircumflex -55 -KPX A Odieresis -55 -KPX A Ograve -55 -KPX A Ohungarumlaut -55 -KPX A Omacron -55 -KPX A Oslash -55 -KPX A Otilde -55 -KPX A Q -55 -KPX A T -111 -KPX A Tcaron -111 -KPX A Tcommaaccent -111 -KPX A U -55 -KPX A Uacute -55 -KPX A Ucircumflex -55 -KPX A Udieresis -55 -KPX A Ugrave -55 -KPX A Uhungarumlaut -55 -KPX A Umacron -55 -KPX A Uogonek -55 -KPX A Uring -55 -KPX A V -135 -KPX A W -90 -KPX A Y -105 -KPX A Yacute -105 -KPX A Ydieresis -105 -KPX A quoteright -111 -KPX A v -74 -KPX A w -92 -KPX A y -92 -KPX A yacute -92 -KPX A ydieresis -92 -KPX Aacute C -40 -KPX Aacute Cacute -40 -KPX Aacute Ccaron -40 -KPX Aacute Ccedilla -40 -KPX Aacute G -40 -KPX Aacute Gbreve -40 -KPX Aacute Gcommaaccent -40 -KPX Aacute O -55 -KPX Aacute Oacute -55 -KPX Aacute Ocircumflex -55 -KPX Aacute Odieresis -55 -KPX Aacute Ograve -55 -KPX Aacute Ohungarumlaut -55 -KPX Aacute Omacron -55 -KPX Aacute Oslash -55 -KPX Aacute Otilde -55 -KPX Aacute Q -55 -KPX Aacute T -111 -KPX Aacute Tcaron -111 -KPX Aacute Tcommaaccent -111 -KPX Aacute U -55 -KPX Aacute Uacute -55 -KPX Aacute Ucircumflex -55 -KPX Aacute Udieresis -55 -KPX Aacute Ugrave -55 -KPX Aacute Uhungarumlaut -55 -KPX Aacute Umacron -55 -KPX Aacute Uogonek -55 -KPX Aacute Uring -55 -KPX Aacute V -135 -KPX Aacute W -90 -KPX Aacute Y -105 -KPX Aacute Yacute -105 -KPX Aacute Ydieresis -105 -KPX Aacute quoteright -111 -KPX Aacute v -74 -KPX Aacute w -92 -KPX Aacute y -92 -KPX Aacute yacute -92 -KPX Aacute ydieresis -92 -KPX Abreve C -40 -KPX Abreve Cacute -40 -KPX Abreve Ccaron -40 -KPX Abreve Ccedilla -40 -KPX Abreve G -40 -KPX Abreve Gbreve -40 -KPX Abreve Gcommaaccent -40 -KPX Abreve O -55 -KPX Abreve Oacute -55 -KPX Abreve Ocircumflex -55 -KPX Abreve Odieresis -55 -KPX Abreve Ograve -55 -KPX Abreve Ohungarumlaut -55 -KPX Abreve Omacron -55 -KPX Abreve Oslash -55 -KPX Abreve Otilde -55 -KPX Abreve Q -55 -KPX Abreve T -111 -KPX Abreve Tcaron -111 -KPX Abreve Tcommaaccent -111 -KPX Abreve U -55 -KPX Abreve Uacute -55 -KPX Abreve Ucircumflex -55 -KPX Abreve Udieresis -55 -KPX Abreve Ugrave -55 -KPX Abreve Uhungarumlaut -55 -KPX Abreve Umacron -55 -KPX Abreve Uogonek -55 -KPX Abreve Uring -55 -KPX Abreve V -135 -KPX Abreve W -90 -KPX Abreve Y -105 -KPX Abreve Yacute -105 -KPX Abreve Ydieresis -105 -KPX Abreve quoteright -111 -KPX Abreve v -74 -KPX Abreve w -92 -KPX Abreve y -92 -KPX Abreve yacute -92 -KPX Abreve ydieresis -92 -KPX Acircumflex C -40 -KPX Acircumflex Cacute -40 -KPX Acircumflex Ccaron -40 -KPX Acircumflex Ccedilla -40 -KPX Acircumflex G -40 -KPX Acircumflex Gbreve -40 -KPX Acircumflex Gcommaaccent -40 -KPX Acircumflex O -55 -KPX Acircumflex Oacute -55 -KPX Acircumflex Ocircumflex -55 -KPX Acircumflex Odieresis -55 -KPX Acircumflex Ograve -55 -KPX Acircumflex Ohungarumlaut -55 -KPX Acircumflex Omacron -55 -KPX Acircumflex Oslash -55 -KPX Acircumflex Otilde -55 -KPX Acircumflex Q -55 -KPX Acircumflex T -111 -KPX Acircumflex Tcaron -111 -KPX Acircumflex Tcommaaccent -111 -KPX Acircumflex U -55 -KPX Acircumflex Uacute -55 -KPX Acircumflex Ucircumflex -55 -KPX Acircumflex Udieresis -55 -KPX Acircumflex Ugrave -55 -KPX Acircumflex Uhungarumlaut -55 -KPX Acircumflex Umacron -55 -KPX Acircumflex Uogonek -55 -KPX Acircumflex Uring -55 -KPX Acircumflex V -135 -KPX Acircumflex W -90 -KPX Acircumflex Y -105 -KPX Acircumflex Yacute -105 -KPX Acircumflex Ydieresis -105 -KPX Acircumflex quoteright -111 -KPX Acircumflex v -74 -KPX Acircumflex w -92 -KPX Acircumflex y -92 -KPX Acircumflex yacute -92 -KPX Acircumflex ydieresis -92 -KPX Adieresis C -40 -KPX Adieresis Cacute -40 -KPX Adieresis Ccaron -40 -KPX Adieresis Ccedilla -40 -KPX Adieresis G -40 -KPX Adieresis Gbreve -40 -KPX Adieresis Gcommaaccent -40 -KPX Adieresis O -55 -KPX Adieresis Oacute -55 -KPX Adieresis Ocircumflex -55 -KPX Adieresis Odieresis -55 -KPX Adieresis Ograve -55 -KPX Adieresis Ohungarumlaut -55 -KPX Adieresis Omacron -55 -KPX Adieresis Oslash -55 -KPX Adieresis Otilde -55 -KPX Adieresis Q -55 -KPX Adieresis T -111 -KPX Adieresis Tcaron -111 -KPX Adieresis Tcommaaccent -111 -KPX Adieresis U -55 -KPX Adieresis Uacute -55 -KPX Adieresis Ucircumflex -55 -KPX Adieresis Udieresis -55 -KPX Adieresis Ugrave -55 -KPX Adieresis Uhungarumlaut -55 -KPX Adieresis Umacron -55 -KPX Adieresis Uogonek -55 -KPX Adieresis Uring -55 -KPX Adieresis V -135 -KPX Adieresis W -90 -KPX Adieresis Y -105 -KPX Adieresis Yacute -105 -KPX Adieresis Ydieresis -105 -KPX Adieresis quoteright -111 -KPX Adieresis v -74 -KPX Adieresis w -92 -KPX Adieresis y -92 -KPX Adieresis yacute -92 -KPX Adieresis ydieresis -92 -KPX Agrave C -40 -KPX Agrave Cacute -40 -KPX Agrave Ccaron -40 -KPX Agrave Ccedilla -40 -KPX Agrave G -40 -KPX Agrave Gbreve -40 -KPX Agrave Gcommaaccent -40 -KPX Agrave O -55 -KPX Agrave Oacute -55 -KPX Agrave Ocircumflex -55 -KPX Agrave Odieresis -55 -KPX Agrave Ograve -55 -KPX Agrave Ohungarumlaut -55 -KPX Agrave Omacron -55 -KPX Agrave Oslash -55 -KPX Agrave Otilde -55 -KPX Agrave Q -55 -KPX Agrave T -111 -KPX Agrave Tcaron -111 -KPX Agrave Tcommaaccent -111 -KPX Agrave U -55 -KPX Agrave Uacute -55 -KPX Agrave Ucircumflex -55 -KPX Agrave Udieresis -55 -KPX Agrave Ugrave -55 -KPX Agrave Uhungarumlaut -55 -KPX Agrave Umacron -55 -KPX Agrave Uogonek -55 -KPX Agrave Uring -55 -KPX Agrave V -135 -KPX Agrave W -90 -KPX Agrave Y -105 -KPX Agrave Yacute -105 -KPX Agrave Ydieresis -105 -KPX Agrave quoteright -111 -KPX Agrave v -74 -KPX Agrave w -92 -KPX Agrave y -92 -KPX Agrave yacute -92 -KPX Agrave ydieresis -92 -KPX Amacron C -40 -KPX Amacron Cacute -40 -KPX Amacron Ccaron -40 -KPX Amacron Ccedilla -40 -KPX Amacron G -40 -KPX Amacron Gbreve -40 -KPX Amacron Gcommaaccent -40 -KPX Amacron O -55 -KPX Amacron Oacute -55 -KPX Amacron Ocircumflex -55 -KPX Amacron Odieresis -55 -KPX Amacron Ograve -55 -KPX Amacron Ohungarumlaut -55 -KPX Amacron Omacron -55 -KPX Amacron Oslash -55 -KPX Amacron Otilde -55 -KPX Amacron Q -55 -KPX Amacron T -111 -KPX Amacron Tcaron -111 -KPX Amacron Tcommaaccent -111 -KPX Amacron U -55 -KPX Amacron Uacute -55 -KPX Amacron Ucircumflex -55 -KPX Amacron Udieresis -55 -KPX Amacron Ugrave -55 -KPX Amacron Uhungarumlaut -55 -KPX Amacron Umacron -55 -KPX Amacron Uogonek -55 -KPX Amacron Uring -55 -KPX Amacron V -135 -KPX Amacron W -90 -KPX Amacron Y -105 -KPX Amacron Yacute -105 -KPX Amacron Ydieresis -105 -KPX Amacron quoteright -111 -KPX Amacron v -74 -KPX Amacron w -92 -KPX Amacron y -92 -KPX Amacron yacute -92 -KPX Amacron ydieresis -92 -KPX Aogonek C -40 -KPX Aogonek Cacute -40 -KPX Aogonek Ccaron -40 -KPX Aogonek Ccedilla -40 -KPX Aogonek G -40 -KPX Aogonek Gbreve -40 -KPX Aogonek Gcommaaccent -40 -KPX Aogonek O -55 -KPX Aogonek Oacute -55 -KPX Aogonek Ocircumflex -55 -KPX Aogonek Odieresis -55 -KPX Aogonek Ograve -55 -KPX Aogonek Ohungarumlaut -55 -KPX Aogonek Omacron -55 -KPX Aogonek Oslash -55 -KPX Aogonek Otilde -55 -KPX Aogonek Q -55 -KPX Aogonek T -111 -KPX Aogonek Tcaron -111 -KPX Aogonek Tcommaaccent -111 -KPX Aogonek U -55 -KPX Aogonek Uacute -55 -KPX Aogonek Ucircumflex -55 -KPX Aogonek Udieresis -55 -KPX Aogonek Ugrave -55 -KPX Aogonek Uhungarumlaut -55 -KPX Aogonek Umacron -55 -KPX Aogonek Uogonek -55 -KPX Aogonek Uring -55 -KPX Aogonek V -135 -KPX Aogonek W -90 -KPX Aogonek Y -105 -KPX Aogonek Yacute -105 -KPX Aogonek Ydieresis -105 -KPX Aogonek quoteright -111 -KPX Aogonek v -74 -KPX Aogonek w -52 -KPX Aogonek y -52 -KPX Aogonek yacute -52 -KPX Aogonek ydieresis -52 -KPX Aring C -40 -KPX Aring Cacute -40 -KPX Aring Ccaron -40 -KPX Aring Ccedilla -40 -KPX Aring G -40 -KPX Aring Gbreve -40 -KPX Aring Gcommaaccent -40 -KPX Aring O -55 -KPX Aring Oacute -55 -KPX Aring Ocircumflex -55 -KPX Aring Odieresis -55 -KPX Aring Ograve -55 -KPX Aring Ohungarumlaut -55 -KPX Aring Omacron -55 -KPX Aring Oslash -55 -KPX Aring Otilde -55 -KPX Aring Q -55 -KPX Aring T -111 -KPX Aring Tcaron -111 -KPX Aring Tcommaaccent -111 -KPX Aring U -55 -KPX Aring Uacute -55 -KPX Aring Ucircumflex -55 -KPX Aring Udieresis -55 -KPX Aring Ugrave -55 -KPX Aring Uhungarumlaut -55 -KPX Aring Umacron -55 -KPX Aring Uogonek -55 -KPX Aring Uring -55 -KPX Aring V -135 -KPX Aring W -90 -KPX Aring Y -105 -KPX Aring Yacute -105 -KPX Aring Ydieresis -105 -KPX Aring quoteright -111 -KPX Aring v -74 -KPX Aring w -92 -KPX Aring y -92 -KPX Aring yacute -92 -KPX Aring ydieresis -92 -KPX Atilde C -40 -KPX Atilde Cacute -40 -KPX Atilde Ccaron -40 -KPX Atilde Ccedilla -40 -KPX Atilde G -40 -KPX Atilde Gbreve -40 -KPX Atilde Gcommaaccent -40 -KPX Atilde O -55 -KPX Atilde Oacute -55 -KPX Atilde Ocircumflex -55 -KPX Atilde Odieresis -55 -KPX Atilde Ograve -55 -KPX Atilde Ohungarumlaut -55 -KPX Atilde Omacron -55 -KPX Atilde Oslash -55 -KPX Atilde Otilde -55 -KPX Atilde Q -55 -KPX Atilde T -111 -KPX Atilde Tcaron -111 -KPX Atilde Tcommaaccent -111 -KPX Atilde U -55 -KPX Atilde Uacute -55 -KPX Atilde Ucircumflex -55 -KPX Atilde Udieresis -55 -KPX Atilde Ugrave -55 -KPX Atilde Uhungarumlaut -55 -KPX Atilde Umacron -55 -KPX Atilde Uogonek -55 -KPX Atilde Uring -55 -KPX Atilde V -135 -KPX Atilde W -90 -KPX Atilde Y -105 -KPX Atilde Yacute -105 -KPX Atilde Ydieresis -105 -KPX Atilde quoteright -111 -KPX Atilde v -74 -KPX Atilde w -92 -KPX Atilde y -92 -KPX Atilde yacute -92 -KPX Atilde ydieresis -92 -KPX B A -35 -KPX B Aacute -35 -KPX B Abreve -35 -KPX B Acircumflex -35 -KPX B Adieresis -35 -KPX B Agrave -35 -KPX B Amacron -35 -KPX B Aogonek -35 -KPX B Aring -35 -KPX B Atilde -35 -KPX B U -10 -KPX B Uacute -10 -KPX B Ucircumflex -10 -KPX B Udieresis -10 -KPX B Ugrave -10 -KPX B Uhungarumlaut -10 -KPX B Umacron -10 -KPX B Uogonek -10 -KPX B Uring -10 -KPX D A -40 -KPX D Aacute -40 -KPX D Abreve -40 -KPX D Acircumflex -40 -KPX D Adieresis -40 -KPX D Agrave -40 -KPX D Amacron -40 -KPX D Aogonek -40 -KPX D Aring -40 -KPX D Atilde -40 -KPX D V -40 -KPX D W -30 -KPX D Y -55 -KPX D Yacute -55 -KPX D Ydieresis -55 -KPX Dcaron A -40 -KPX Dcaron Aacute -40 -KPX Dcaron Abreve -40 -KPX Dcaron Acircumflex -40 -KPX Dcaron Adieresis -40 -KPX Dcaron Agrave -40 -KPX Dcaron Amacron -40 -KPX Dcaron Aogonek -40 -KPX Dcaron Aring -40 -KPX Dcaron Atilde -40 -KPX Dcaron V -40 -KPX Dcaron W -30 -KPX Dcaron Y -55 -KPX Dcaron Yacute -55 -KPX Dcaron Ydieresis -55 -KPX Dcroat A -40 -KPX Dcroat Aacute -40 -KPX Dcroat Abreve -40 -KPX Dcroat Acircumflex -40 -KPX Dcroat Adieresis -40 -KPX Dcroat Agrave -40 -KPX Dcroat Amacron -40 -KPX Dcroat Aogonek -40 -KPX Dcroat Aring -40 -KPX Dcroat Atilde -40 -KPX Dcroat V -40 -KPX Dcroat W -30 -KPX Dcroat Y -55 -KPX Dcroat Yacute -55 -KPX Dcroat Ydieresis -55 -KPX F A -74 -KPX F Aacute -74 -KPX F Abreve -74 -KPX F Acircumflex -74 -KPX F Adieresis -74 -KPX F Agrave -74 -KPX F Amacron -74 -KPX F Aogonek -74 -KPX F Aring -74 -KPX F Atilde -74 -KPX F a -15 -KPX F aacute -15 -KPX F abreve -15 -KPX F acircumflex -15 -KPX F adieresis -15 -KPX F agrave -15 -KPX F amacron -15 -KPX F aogonek -15 -KPX F aring -15 -KPX F atilde -15 -KPX F comma -80 -KPX F o -15 -KPX F oacute -15 -KPX F ocircumflex -15 -KPX F odieresis -15 -KPX F ograve -15 -KPX F ohungarumlaut -15 -KPX F omacron -15 -KPX F oslash -15 -KPX F otilde -15 -KPX F period -80 -KPX J A -60 -KPX J Aacute -60 -KPX J Abreve -60 -KPX J Acircumflex -60 -KPX J Adieresis -60 -KPX J Agrave -60 -KPX J Amacron -60 -KPX J Aogonek -60 -KPX J Aring -60 -KPX J Atilde -60 -KPX K O -30 -KPX K Oacute -30 -KPX K Ocircumflex -30 -KPX K Odieresis -30 -KPX K Ograve -30 -KPX K Ohungarumlaut -30 -KPX K Omacron -30 -KPX K Oslash -30 -KPX K Otilde -30 -KPX K e -25 -KPX K eacute -25 -KPX K ecaron -25 -KPX K ecircumflex -25 -KPX K edieresis -25 -KPX K edotaccent -25 -KPX K egrave -25 -KPX K emacron -25 -KPX K eogonek -25 -KPX K o -35 -KPX K oacute -35 -KPX K ocircumflex -35 -KPX K odieresis -35 -KPX K ograve -35 -KPX K ohungarumlaut -35 -KPX K omacron -35 -KPX K oslash -35 -KPX K otilde -35 -KPX K u -15 -KPX K uacute -15 -KPX K ucircumflex -15 -KPX K udieresis -15 -KPX K ugrave -15 -KPX K uhungarumlaut -15 -KPX K umacron -15 -KPX K uogonek -15 -KPX K uring -15 -KPX K y -25 -KPX K yacute -25 -KPX K ydieresis -25 -KPX Kcommaaccent O -30 -KPX Kcommaaccent Oacute -30 -KPX Kcommaaccent Ocircumflex -30 -KPX Kcommaaccent Odieresis -30 -KPX Kcommaaccent Ograve -30 -KPX Kcommaaccent Ohungarumlaut -30 -KPX Kcommaaccent Omacron -30 -KPX Kcommaaccent Oslash -30 -KPX Kcommaaccent Otilde -30 -KPX Kcommaaccent e -25 -KPX Kcommaaccent eacute -25 -KPX Kcommaaccent ecaron -25 -KPX Kcommaaccent ecircumflex -25 -KPX Kcommaaccent edieresis -25 -KPX Kcommaaccent edotaccent -25 -KPX Kcommaaccent egrave -25 -KPX Kcommaaccent emacron -25 -KPX Kcommaaccent eogonek -25 -KPX Kcommaaccent o -35 -KPX Kcommaaccent oacute -35 -KPX Kcommaaccent ocircumflex -35 -KPX Kcommaaccent odieresis -35 -KPX Kcommaaccent ograve -35 -KPX Kcommaaccent ohungarumlaut -35 -KPX Kcommaaccent omacron -35 -KPX Kcommaaccent oslash -35 -KPX Kcommaaccent otilde -35 -KPX Kcommaaccent u -15 -KPX Kcommaaccent uacute -15 -KPX Kcommaaccent ucircumflex -15 -KPX Kcommaaccent udieresis -15 -KPX Kcommaaccent ugrave -15 -KPX Kcommaaccent uhungarumlaut -15 -KPX Kcommaaccent umacron -15 -KPX Kcommaaccent uogonek -15 -KPX Kcommaaccent uring -15 -KPX Kcommaaccent y -25 -KPX Kcommaaccent yacute -25 -KPX Kcommaaccent ydieresis -25 -KPX L T -92 -KPX L Tcaron -92 -KPX L Tcommaaccent -92 -KPX L V -100 -KPX L W -74 -KPX L Y -100 -KPX L Yacute -100 -KPX L Ydieresis -100 -KPX L quoteright -92 -KPX L y -55 -KPX L yacute -55 -KPX L ydieresis -55 -KPX Lacute T -92 -KPX Lacute Tcaron -92 -KPX Lacute Tcommaaccent -92 -KPX Lacute V -100 -KPX Lacute W -74 -KPX Lacute Y -100 -KPX Lacute Yacute -100 -KPX Lacute Ydieresis -100 -KPX Lacute quoteright -92 -KPX Lacute y -55 -KPX Lacute yacute -55 -KPX Lacute ydieresis -55 -KPX Lcaron quoteright -92 -KPX Lcaron y -55 -KPX Lcaron yacute -55 -KPX Lcaron ydieresis -55 -KPX Lcommaaccent T -92 -KPX Lcommaaccent Tcaron -92 -KPX Lcommaaccent Tcommaaccent -92 -KPX Lcommaaccent V -100 -KPX Lcommaaccent W -74 -KPX Lcommaaccent Y -100 -KPX Lcommaaccent Yacute -100 -KPX Lcommaaccent Ydieresis -100 -KPX Lcommaaccent quoteright -92 -KPX Lcommaaccent y -55 -KPX Lcommaaccent yacute -55 -KPX Lcommaaccent ydieresis -55 -KPX Lslash T -92 -KPX Lslash Tcaron -92 -KPX Lslash Tcommaaccent -92 -KPX Lslash V -100 -KPX Lslash W -74 -KPX Lslash Y -100 -KPX Lslash Yacute -100 -KPX Lslash Ydieresis -100 -KPX Lslash quoteright -92 -KPX Lslash y -55 -KPX Lslash yacute -55 -KPX Lslash ydieresis -55 -KPX N A -35 -KPX N Aacute -35 -KPX N Abreve -35 -KPX N Acircumflex -35 -KPX N Adieresis -35 -KPX N Agrave -35 -KPX N Amacron -35 -KPX N Aogonek -35 -KPX N Aring -35 -KPX N Atilde -35 -KPX Nacute A -35 -KPX Nacute Aacute -35 -KPX Nacute Abreve -35 -KPX Nacute Acircumflex -35 -KPX Nacute Adieresis -35 -KPX Nacute Agrave -35 -KPX Nacute Amacron -35 -KPX Nacute Aogonek -35 -KPX Nacute Aring -35 -KPX Nacute Atilde -35 -KPX Ncaron A -35 -KPX Ncaron Aacute -35 -KPX Ncaron Abreve -35 -KPX Ncaron Acircumflex -35 -KPX Ncaron Adieresis -35 -KPX Ncaron Agrave -35 -KPX Ncaron Amacron -35 -KPX Ncaron Aogonek -35 -KPX Ncaron Aring -35 -KPX Ncaron Atilde -35 -KPX Ncommaaccent A -35 -KPX Ncommaaccent Aacute -35 -KPX Ncommaaccent Abreve -35 -KPX Ncommaaccent Acircumflex -35 -KPX Ncommaaccent Adieresis -35 -KPX Ncommaaccent Agrave -35 -KPX Ncommaaccent Amacron -35 -KPX Ncommaaccent Aogonek -35 -KPX Ncommaaccent Aring -35 -KPX Ncommaaccent Atilde -35 -KPX Ntilde A -35 -KPX Ntilde Aacute -35 -KPX Ntilde Abreve -35 -KPX Ntilde Acircumflex -35 -KPX Ntilde Adieresis -35 -KPX Ntilde Agrave -35 -KPX Ntilde Amacron -35 -KPX Ntilde Aogonek -35 -KPX Ntilde Aring -35 -KPX Ntilde Atilde -35 -KPX O A -35 -KPX O Aacute -35 -KPX O Abreve -35 -KPX O Acircumflex -35 -KPX O Adieresis -35 -KPX O Agrave -35 -KPX O Amacron -35 -KPX O Aogonek -35 -KPX O Aring -35 -KPX O Atilde -35 -KPX O T -40 -KPX O Tcaron -40 -KPX O Tcommaaccent -40 -KPX O V -50 -KPX O W -35 -KPX O X -40 -KPX O Y -50 -KPX O Yacute -50 -KPX O Ydieresis -50 -KPX Oacute A -35 -KPX Oacute Aacute -35 -KPX Oacute Abreve -35 -KPX Oacute Acircumflex -35 -KPX Oacute Adieresis -35 -KPX Oacute Agrave -35 -KPX Oacute Amacron -35 -KPX Oacute Aogonek -35 -KPX Oacute Aring -35 -KPX Oacute Atilde -35 -KPX Oacute T -40 -KPX Oacute Tcaron -40 -KPX Oacute Tcommaaccent -40 -KPX Oacute V -50 -KPX Oacute W -35 -KPX Oacute X -40 -KPX Oacute Y -50 -KPX Oacute Yacute -50 -KPX Oacute Ydieresis -50 -KPX Ocircumflex A -35 -KPX Ocircumflex Aacute -35 -KPX Ocircumflex Abreve -35 -KPX Ocircumflex Acircumflex -35 -KPX Ocircumflex Adieresis -35 -KPX Ocircumflex Agrave -35 -KPX Ocircumflex Amacron -35 -KPX Ocircumflex Aogonek -35 -KPX Ocircumflex Aring -35 -KPX Ocircumflex Atilde -35 -KPX Ocircumflex T -40 -KPX Ocircumflex Tcaron -40 -KPX Ocircumflex Tcommaaccent -40 -KPX Ocircumflex V -50 -KPX Ocircumflex W -35 -KPX Ocircumflex X -40 -KPX Ocircumflex Y -50 -KPX Ocircumflex Yacute -50 -KPX Ocircumflex Ydieresis -50 -KPX Odieresis A -35 -KPX Odieresis Aacute -35 -KPX Odieresis Abreve -35 -KPX Odieresis Acircumflex -35 -KPX Odieresis Adieresis -35 -KPX Odieresis Agrave -35 -KPX Odieresis Amacron -35 -KPX Odieresis Aogonek -35 -KPX Odieresis Aring -35 -KPX Odieresis Atilde -35 -KPX Odieresis T -40 -KPX Odieresis Tcaron -40 -KPX Odieresis Tcommaaccent -40 -KPX Odieresis V -50 -KPX Odieresis W -35 -KPX Odieresis X -40 -KPX Odieresis Y -50 -KPX Odieresis Yacute -50 -KPX Odieresis Ydieresis -50 -KPX Ograve A -35 -KPX Ograve Aacute -35 -KPX Ograve Abreve -35 -KPX Ograve Acircumflex -35 -KPX Ograve Adieresis -35 -KPX Ograve Agrave -35 -KPX Ograve Amacron -35 -KPX Ograve Aogonek -35 -KPX Ograve Aring -35 -KPX Ograve Atilde -35 -KPX Ograve T -40 -KPX Ograve Tcaron -40 -KPX Ograve Tcommaaccent -40 -KPX Ograve V -50 -KPX Ograve W -35 -KPX Ograve X -40 -KPX Ograve Y -50 -KPX Ograve Yacute -50 -KPX Ograve Ydieresis -50 -KPX Ohungarumlaut A -35 -KPX Ohungarumlaut Aacute -35 -KPX Ohungarumlaut Abreve -35 -KPX Ohungarumlaut Acircumflex -35 -KPX Ohungarumlaut Adieresis -35 -KPX Ohungarumlaut Agrave -35 -KPX Ohungarumlaut Amacron -35 -KPX Ohungarumlaut Aogonek -35 -KPX Ohungarumlaut Aring -35 -KPX Ohungarumlaut Atilde -35 -KPX Ohungarumlaut T -40 -KPX Ohungarumlaut Tcaron -40 -KPX Ohungarumlaut Tcommaaccent -40 -KPX Ohungarumlaut V -50 -KPX Ohungarumlaut W -35 -KPX Ohungarumlaut X -40 -KPX Ohungarumlaut Y -50 -KPX Ohungarumlaut Yacute -50 -KPX Ohungarumlaut Ydieresis -50 -KPX Omacron A -35 -KPX Omacron Aacute -35 -KPX Omacron Abreve -35 -KPX Omacron Acircumflex -35 -KPX Omacron Adieresis -35 -KPX Omacron Agrave -35 -KPX Omacron Amacron -35 -KPX Omacron Aogonek -35 -KPX Omacron Aring -35 -KPX Omacron Atilde -35 -KPX Omacron T -40 -KPX Omacron Tcaron -40 -KPX Omacron Tcommaaccent -40 -KPX Omacron V -50 -KPX Omacron W -35 -KPX Omacron X -40 -KPX Omacron Y -50 -KPX Omacron Yacute -50 -KPX Omacron Ydieresis -50 -KPX Oslash A -35 -KPX Oslash Aacute -35 -KPX Oslash Abreve -35 -KPX Oslash Acircumflex -35 -KPX Oslash Adieresis -35 -KPX Oslash Agrave -35 -KPX Oslash Amacron -35 -KPX Oslash Aogonek -35 -KPX Oslash Aring -35 -KPX Oslash Atilde -35 -KPX Oslash T -40 -KPX Oslash Tcaron -40 -KPX Oslash Tcommaaccent -40 -KPX Oslash V -50 -KPX Oslash W -35 -KPX Oslash X -40 -KPX Oslash Y -50 -KPX Oslash Yacute -50 -KPX Oslash Ydieresis -50 -KPX Otilde A -35 -KPX Otilde Aacute -35 -KPX Otilde Abreve -35 -KPX Otilde Acircumflex -35 -KPX Otilde Adieresis -35 -KPX Otilde Agrave -35 -KPX Otilde Amacron -35 -KPX Otilde Aogonek -35 -KPX Otilde Aring -35 -KPX Otilde Atilde -35 -KPX Otilde T -40 -KPX Otilde Tcaron -40 -KPX Otilde Tcommaaccent -40 -KPX Otilde V -50 -KPX Otilde W -35 -KPX Otilde X -40 -KPX Otilde Y -50 -KPX Otilde Yacute -50 -KPX Otilde Ydieresis -50 -KPX P A -92 -KPX P Aacute -92 -KPX P Abreve -92 -KPX P Acircumflex -92 -KPX P Adieresis -92 -KPX P Agrave -92 -KPX P Amacron -92 -KPX P Aogonek -92 -KPX P Aring -92 -KPX P Atilde -92 -KPX P a -15 -KPX P aacute -15 -KPX P abreve -15 -KPX P acircumflex -15 -KPX P adieresis -15 -KPX P agrave -15 -KPX P amacron -15 -KPX P aogonek -15 -KPX P aring -15 -KPX P atilde -15 -KPX P comma -111 -KPX P period -111 -KPX Q U -10 -KPX Q Uacute -10 -KPX Q Ucircumflex -10 -KPX Q Udieresis -10 -KPX Q Ugrave -10 -KPX Q Uhungarumlaut -10 -KPX Q Umacron -10 -KPX Q Uogonek -10 -KPX Q Uring -10 -KPX R O -40 -KPX R Oacute -40 -KPX R Ocircumflex -40 -KPX R Odieresis -40 -KPX R Ograve -40 -KPX R Ohungarumlaut -40 -KPX R Omacron -40 -KPX R Oslash -40 -KPX R Otilde -40 -KPX R T -60 -KPX R Tcaron -60 -KPX R Tcommaaccent -60 -KPX R U -40 -KPX R Uacute -40 -KPX R Ucircumflex -40 -KPX R Udieresis -40 -KPX R Ugrave -40 -KPX R Uhungarumlaut -40 -KPX R Umacron -40 -KPX R Uogonek -40 -KPX R Uring -40 -KPX R V -80 -KPX R W -55 -KPX R Y -65 -KPX R Yacute -65 -KPX R Ydieresis -65 -KPX Racute O -40 -KPX Racute Oacute -40 -KPX Racute Ocircumflex -40 -KPX Racute Odieresis -40 -KPX Racute Ograve -40 -KPX Racute Ohungarumlaut -40 -KPX Racute Omacron -40 -KPX Racute Oslash -40 -KPX Racute Otilde -40 -KPX Racute T -60 -KPX Racute Tcaron -60 -KPX Racute Tcommaaccent -60 -KPX Racute U -40 -KPX Racute Uacute -40 -KPX Racute Ucircumflex -40 -KPX Racute Udieresis -40 -KPX Racute Ugrave -40 -KPX Racute Uhungarumlaut -40 -KPX Racute Umacron -40 -KPX Racute Uogonek -40 -KPX Racute Uring -40 -KPX Racute V -80 -KPX Racute W -55 -KPX Racute Y -65 -KPX Racute Yacute -65 -KPX Racute Ydieresis -65 -KPX Rcaron O -40 -KPX Rcaron Oacute -40 -KPX Rcaron Ocircumflex -40 -KPX Rcaron Odieresis -40 -KPX Rcaron Ograve -40 -KPX Rcaron Ohungarumlaut -40 -KPX Rcaron Omacron -40 -KPX Rcaron Oslash -40 -KPX Rcaron Otilde -40 -KPX Rcaron T -60 -KPX Rcaron Tcaron -60 -KPX Rcaron Tcommaaccent -60 -KPX Rcaron U -40 -KPX Rcaron Uacute -40 -KPX Rcaron Ucircumflex -40 -KPX Rcaron Udieresis -40 -KPX Rcaron Ugrave -40 -KPX Rcaron Uhungarumlaut -40 -KPX Rcaron Umacron -40 -KPX Rcaron Uogonek -40 -KPX Rcaron Uring -40 -KPX Rcaron V -80 -KPX Rcaron W -55 -KPX Rcaron Y -65 -KPX Rcaron Yacute -65 -KPX Rcaron Ydieresis -65 -KPX Rcommaaccent O -40 -KPX Rcommaaccent Oacute -40 -KPX Rcommaaccent Ocircumflex -40 -KPX Rcommaaccent Odieresis -40 -KPX Rcommaaccent Ograve -40 -KPX Rcommaaccent Ohungarumlaut -40 -KPX Rcommaaccent Omacron -40 -KPX Rcommaaccent Oslash -40 -KPX Rcommaaccent Otilde -40 -KPX Rcommaaccent T -60 -KPX Rcommaaccent Tcaron -60 -KPX Rcommaaccent Tcommaaccent -60 -KPX Rcommaaccent U -40 -KPX Rcommaaccent Uacute -40 -KPX Rcommaaccent Ucircumflex -40 -KPX Rcommaaccent Udieresis -40 -KPX Rcommaaccent Ugrave -40 -KPX Rcommaaccent Uhungarumlaut -40 -KPX Rcommaaccent Umacron -40 -KPX Rcommaaccent Uogonek -40 -KPX Rcommaaccent Uring -40 -KPX Rcommaaccent V -80 -KPX Rcommaaccent W -55 -KPX Rcommaaccent Y -65 -KPX Rcommaaccent Yacute -65 -KPX Rcommaaccent Ydieresis -65 -KPX T A -93 -KPX T Aacute -93 -KPX T Abreve -93 -KPX T Acircumflex -93 -KPX T Adieresis -93 -KPX T Agrave -93 -KPX T Amacron -93 -KPX T Aogonek -93 -KPX T Aring -93 -KPX T Atilde -93 -KPX T O -18 -KPX T Oacute -18 -KPX T Ocircumflex -18 -KPX T Odieresis -18 -KPX T Ograve -18 -KPX T Ohungarumlaut -18 -KPX T Omacron -18 -KPX T Oslash -18 -KPX T Otilde -18 -KPX T a -80 -KPX T aacute -80 -KPX T abreve -80 -KPX T acircumflex -80 -KPX T adieresis -40 -KPX T agrave -40 -KPX T amacron -40 -KPX T aogonek -80 -KPX T aring -80 -KPX T atilde -40 -KPX T colon -50 -KPX T comma -74 -KPX T e -70 -KPX T eacute -70 -KPX T ecaron -70 -KPX T ecircumflex -70 -KPX T edieresis -30 -KPX T edotaccent -70 -KPX T egrave -70 -KPX T emacron -30 -KPX T eogonek -70 -KPX T hyphen -92 -KPX T i -35 -KPX T iacute -35 -KPX T iogonek -35 -KPX T o -80 -KPX T oacute -80 -KPX T ocircumflex -80 -KPX T odieresis -80 -KPX T ograve -80 -KPX T ohungarumlaut -80 -KPX T omacron -80 -KPX T oslash -80 -KPX T otilde -80 -KPX T period -74 -KPX T r -35 -KPX T racute -35 -KPX T rcaron -35 -KPX T rcommaaccent -35 -KPX T semicolon -55 -KPX T u -45 -KPX T uacute -45 -KPX T ucircumflex -45 -KPX T udieresis -45 -KPX T ugrave -45 -KPX T uhungarumlaut -45 -KPX T umacron -45 -KPX T uogonek -45 -KPX T uring -45 -KPX T w -80 -KPX T y -80 -KPX T yacute -80 -KPX T ydieresis -80 -KPX Tcaron A -93 -KPX Tcaron Aacute -93 -KPX Tcaron Abreve -93 -KPX Tcaron Acircumflex -93 -KPX Tcaron Adieresis -93 -KPX Tcaron Agrave -93 -KPX Tcaron Amacron -93 -KPX Tcaron Aogonek -93 -KPX Tcaron Aring -93 -KPX Tcaron Atilde -93 -KPX Tcaron O -18 -KPX Tcaron Oacute -18 -KPX Tcaron Ocircumflex -18 -KPX Tcaron Odieresis -18 -KPX Tcaron Ograve -18 -KPX Tcaron Ohungarumlaut -18 -KPX Tcaron Omacron -18 -KPX Tcaron Oslash -18 -KPX Tcaron Otilde -18 -KPX Tcaron a -80 -KPX Tcaron aacute -80 -KPX Tcaron abreve -80 -KPX Tcaron acircumflex -80 -KPX Tcaron adieresis -40 -KPX Tcaron agrave -40 -KPX Tcaron amacron -40 -KPX Tcaron aogonek -80 -KPX Tcaron aring -80 -KPX Tcaron atilde -40 -KPX Tcaron colon -50 -KPX Tcaron comma -74 -KPX Tcaron e -70 -KPX Tcaron eacute -70 -KPX Tcaron ecaron -70 -KPX Tcaron ecircumflex -30 -KPX Tcaron edieresis -30 -KPX Tcaron edotaccent -70 -KPX Tcaron egrave -70 -KPX Tcaron emacron -30 -KPX Tcaron eogonek -70 -KPX Tcaron hyphen -92 -KPX Tcaron i -35 -KPX Tcaron iacute -35 -KPX Tcaron iogonek -35 -KPX Tcaron o -80 -KPX Tcaron oacute -80 -KPX Tcaron ocircumflex -80 -KPX Tcaron odieresis -80 -KPX Tcaron ograve -80 -KPX Tcaron ohungarumlaut -80 -KPX Tcaron omacron -80 -KPX Tcaron oslash -80 -KPX Tcaron otilde -80 -KPX Tcaron period -74 -KPX Tcaron r -35 -KPX Tcaron racute -35 -KPX Tcaron rcaron -35 -KPX Tcaron rcommaaccent -35 -KPX Tcaron semicolon -55 -KPX Tcaron u -45 -KPX Tcaron uacute -45 -KPX Tcaron ucircumflex -45 -KPX Tcaron udieresis -45 -KPX Tcaron ugrave -45 -KPX Tcaron uhungarumlaut -45 -KPX Tcaron umacron -45 -KPX Tcaron uogonek -45 -KPX Tcaron uring -45 -KPX Tcaron w -80 -KPX Tcaron y -80 -KPX Tcaron yacute -80 -KPX Tcaron ydieresis -80 -KPX Tcommaaccent A -93 -KPX Tcommaaccent Aacute -93 -KPX Tcommaaccent Abreve -93 -KPX Tcommaaccent Acircumflex -93 -KPX Tcommaaccent Adieresis -93 -KPX Tcommaaccent Agrave -93 -KPX Tcommaaccent Amacron -93 -KPX Tcommaaccent Aogonek -93 -KPX Tcommaaccent Aring -93 -KPX Tcommaaccent Atilde -93 -KPX Tcommaaccent O -18 -KPX Tcommaaccent Oacute -18 -KPX Tcommaaccent Ocircumflex -18 -KPX Tcommaaccent Odieresis -18 -KPX Tcommaaccent Ograve -18 -KPX Tcommaaccent Ohungarumlaut -18 -KPX Tcommaaccent Omacron -18 -KPX Tcommaaccent Oslash -18 -KPX Tcommaaccent Otilde -18 -KPX Tcommaaccent a -80 -KPX Tcommaaccent aacute -80 -KPX Tcommaaccent abreve -80 -KPX Tcommaaccent acircumflex -80 -KPX Tcommaaccent adieresis -40 -KPX Tcommaaccent agrave -40 -KPX Tcommaaccent amacron -40 -KPX Tcommaaccent aogonek -80 -KPX Tcommaaccent aring -80 -KPX Tcommaaccent atilde -40 -KPX Tcommaaccent colon -50 -KPX Tcommaaccent comma -74 -KPX Tcommaaccent e -70 -KPX Tcommaaccent eacute -70 -KPX Tcommaaccent ecaron -70 -KPX Tcommaaccent ecircumflex -30 -KPX Tcommaaccent edieresis -30 -KPX Tcommaaccent edotaccent -70 -KPX Tcommaaccent egrave -30 -KPX Tcommaaccent emacron -70 -KPX Tcommaaccent eogonek -70 -KPX Tcommaaccent hyphen -92 -KPX Tcommaaccent i -35 -KPX Tcommaaccent iacute -35 -KPX Tcommaaccent iogonek -35 -KPX Tcommaaccent o -80 -KPX Tcommaaccent oacute -80 -KPX Tcommaaccent ocircumflex -80 -KPX Tcommaaccent odieresis -80 -KPX Tcommaaccent ograve -80 -KPX Tcommaaccent ohungarumlaut -80 -KPX Tcommaaccent omacron -80 -KPX Tcommaaccent oslash -80 -KPX Tcommaaccent otilde -80 -KPX Tcommaaccent period -74 -KPX Tcommaaccent r -35 -KPX Tcommaaccent racute -35 -KPX Tcommaaccent rcaron -35 -KPX Tcommaaccent rcommaaccent -35 -KPX Tcommaaccent semicolon -55 -KPX Tcommaaccent u -45 -KPX Tcommaaccent uacute -45 -KPX Tcommaaccent ucircumflex -45 -KPX Tcommaaccent udieresis -45 -KPX Tcommaaccent ugrave -45 -KPX Tcommaaccent uhungarumlaut -45 -KPX Tcommaaccent umacron -45 -KPX Tcommaaccent uogonek -45 -KPX Tcommaaccent uring -45 -KPX Tcommaaccent w -80 -KPX Tcommaaccent y -80 -KPX Tcommaaccent yacute -80 -KPX Tcommaaccent ydieresis -80 -KPX U A -40 -KPX U Aacute -40 -KPX U Abreve -40 -KPX U Acircumflex -40 -KPX U Adieresis -40 -KPX U Agrave -40 -KPX U Amacron -40 -KPX U Aogonek -40 -KPX U Aring -40 -KPX U Atilde -40 -KPX Uacute A -40 -KPX Uacute Aacute -40 -KPX Uacute Abreve -40 -KPX Uacute Acircumflex -40 -KPX Uacute Adieresis -40 -KPX Uacute Agrave -40 -KPX Uacute Amacron -40 -KPX Uacute Aogonek -40 -KPX Uacute Aring -40 -KPX Uacute Atilde -40 -KPX Ucircumflex A -40 -KPX Ucircumflex Aacute -40 -KPX Ucircumflex Abreve -40 -KPX Ucircumflex Acircumflex -40 -KPX Ucircumflex Adieresis -40 -KPX Ucircumflex Agrave -40 -KPX Ucircumflex Amacron -40 -KPX Ucircumflex Aogonek -40 -KPX Ucircumflex Aring -40 -KPX Ucircumflex Atilde -40 -KPX Udieresis A -40 -KPX Udieresis Aacute -40 -KPX Udieresis Abreve -40 -KPX Udieresis Acircumflex -40 -KPX Udieresis Adieresis -40 -KPX Udieresis Agrave -40 -KPX Udieresis Amacron -40 -KPX Udieresis Aogonek -40 -KPX Udieresis Aring -40 -KPX Udieresis Atilde -40 -KPX Ugrave A -40 -KPX Ugrave Aacute -40 -KPX Ugrave Abreve -40 -KPX Ugrave Acircumflex -40 -KPX Ugrave Adieresis -40 -KPX Ugrave Agrave -40 -KPX Ugrave Amacron -40 -KPX Ugrave Aogonek -40 -KPX Ugrave Aring -40 -KPX Ugrave Atilde -40 -KPX Uhungarumlaut A -40 -KPX Uhungarumlaut Aacute -40 -KPX Uhungarumlaut Abreve -40 -KPX Uhungarumlaut Acircumflex -40 -KPX Uhungarumlaut Adieresis -40 -KPX Uhungarumlaut Agrave -40 -KPX Uhungarumlaut Amacron -40 -KPX Uhungarumlaut Aogonek -40 -KPX Uhungarumlaut Aring -40 -KPX Uhungarumlaut Atilde -40 -KPX Umacron A -40 -KPX Umacron Aacute -40 -KPX Umacron Abreve -40 -KPX Umacron Acircumflex -40 -KPX Umacron Adieresis -40 -KPX Umacron Agrave -40 -KPX Umacron Amacron -40 -KPX Umacron Aogonek -40 -KPX Umacron Aring -40 -KPX Umacron Atilde -40 -KPX Uogonek A -40 -KPX Uogonek Aacute -40 -KPX Uogonek Abreve -40 -KPX Uogonek Acircumflex -40 -KPX Uogonek Adieresis -40 -KPX Uogonek Agrave -40 -KPX Uogonek Amacron -40 -KPX Uogonek Aogonek -40 -KPX Uogonek Aring -40 -KPX Uogonek Atilde -40 -KPX Uring A -40 -KPX Uring Aacute -40 -KPX Uring Abreve -40 -KPX Uring Acircumflex -40 -KPX Uring Adieresis -40 -KPX Uring Agrave -40 -KPX Uring Amacron -40 -KPX Uring Aogonek -40 -KPX Uring Aring -40 -KPX Uring Atilde -40 -KPX V A -135 -KPX V Aacute -135 -KPX V Abreve -135 -KPX V Acircumflex -135 -KPX V Adieresis -135 -KPX V Agrave -135 -KPX V Amacron -135 -KPX V Aogonek -135 -KPX V Aring -135 -KPX V Atilde -135 -KPX V G -15 -KPX V Gbreve -15 -KPX V Gcommaaccent -15 -KPX V O -40 -KPX V Oacute -40 -KPX V Ocircumflex -40 -KPX V Odieresis -40 -KPX V Ograve -40 -KPX V Ohungarumlaut -40 -KPX V Omacron -40 -KPX V Oslash -40 -KPX V Otilde -40 -KPX V a -111 -KPX V aacute -111 -KPX V abreve -111 -KPX V acircumflex -71 -KPX V adieresis -71 -KPX V agrave -71 -KPX V amacron -71 -KPX V aogonek -111 -KPX V aring -111 -KPX V atilde -71 -KPX V colon -74 -KPX V comma -129 -KPX V e -111 -KPX V eacute -111 -KPX V ecaron -71 -KPX V ecircumflex -71 -KPX V edieresis -71 -KPX V edotaccent -111 -KPX V egrave -71 -KPX V emacron -71 -KPX V eogonek -111 -KPX V hyphen -100 -KPX V i -60 -KPX V iacute -60 -KPX V icircumflex -20 -KPX V idieresis -20 -KPX V igrave -20 -KPX V imacron -20 -KPX V iogonek -60 -KPX V o -129 -KPX V oacute -129 -KPX V ocircumflex -129 -KPX V odieresis -89 -KPX V ograve -89 -KPX V ohungarumlaut -129 -KPX V omacron -89 -KPX V oslash -129 -KPX V otilde -89 -KPX V period -129 -KPX V semicolon -74 -KPX V u -75 -KPX V uacute -75 -KPX V ucircumflex -75 -KPX V udieresis -75 -KPX V ugrave -75 -KPX V uhungarumlaut -75 -KPX V umacron -75 -KPX V uogonek -75 -KPX V uring -75 -KPX W A -120 -KPX W Aacute -120 -KPX W Abreve -120 -KPX W Acircumflex -120 -KPX W Adieresis -120 -KPX W Agrave -120 -KPX W Amacron -120 -KPX W Aogonek -120 -KPX W Aring -120 -KPX W Atilde -120 -KPX W O -10 -KPX W Oacute -10 -KPX W Ocircumflex -10 -KPX W Odieresis -10 -KPX W Ograve -10 -KPX W Ohungarumlaut -10 -KPX W Omacron -10 -KPX W Oslash -10 -KPX W Otilde -10 -KPX W a -80 -KPX W aacute -80 -KPX W abreve -80 -KPX W acircumflex -80 -KPX W adieresis -80 -KPX W agrave -80 -KPX W amacron -80 -KPX W aogonek -80 -KPX W aring -80 -KPX W atilde -80 -KPX W colon -37 -KPX W comma -92 -KPX W e -80 -KPX W eacute -80 -KPX W ecaron -80 -KPX W ecircumflex -80 -KPX W edieresis -40 -KPX W edotaccent -80 -KPX W egrave -40 -KPX W emacron -40 -KPX W eogonek -80 -KPX W hyphen -65 -KPX W i -40 -KPX W iacute -40 -KPX W iogonek -40 -KPX W o -80 -KPX W oacute -80 -KPX W ocircumflex -80 -KPX W odieresis -80 -KPX W ograve -80 -KPX W ohungarumlaut -80 -KPX W omacron -80 -KPX W oslash -80 -KPX W otilde -80 -KPX W period -92 -KPX W semicolon -37 -KPX W u -50 -KPX W uacute -50 -KPX W ucircumflex -50 -KPX W udieresis -50 -KPX W ugrave -50 -KPX W uhungarumlaut -50 -KPX W umacron -50 -KPX W uogonek -50 -KPX W uring -50 -KPX W y -73 -KPX W yacute -73 -KPX W ydieresis -73 -KPX Y A -120 -KPX Y Aacute -120 -KPX Y Abreve -120 -KPX Y Acircumflex -120 -KPX Y Adieresis -120 -KPX Y Agrave -120 -KPX Y Amacron -120 -KPX Y Aogonek -120 -KPX Y Aring -120 -KPX Y Atilde -120 -KPX Y O -30 -KPX Y Oacute -30 -KPX Y Ocircumflex -30 -KPX Y Odieresis -30 -KPX Y Ograve -30 -KPX Y Ohungarumlaut -30 -KPX Y Omacron -30 -KPX Y Oslash -30 -KPX Y Otilde -30 -KPX Y a -100 -KPX Y aacute -100 -KPX Y abreve -100 -KPX Y acircumflex -100 -KPX Y adieresis -60 -KPX Y agrave -60 -KPX Y amacron -60 -KPX Y aogonek -100 -KPX Y aring -100 -KPX Y atilde -60 -KPX Y colon -92 -KPX Y comma -129 -KPX Y e -100 -KPX Y eacute -100 -KPX Y ecaron -100 -KPX Y ecircumflex -100 -KPX Y edieresis -60 -KPX Y edotaccent -100 -KPX Y egrave -60 -KPX Y emacron -60 -KPX Y eogonek -100 -KPX Y hyphen -111 -KPX Y i -55 -KPX Y iacute -55 -KPX Y iogonek -55 -KPX Y o -110 -KPX Y oacute -110 -KPX Y ocircumflex -110 -KPX Y odieresis -70 -KPX Y ograve -70 -KPX Y ohungarumlaut -110 -KPX Y omacron -70 -KPX Y oslash -110 -KPX Y otilde -70 -KPX Y period -129 -KPX Y semicolon -92 -KPX Y u -111 -KPX Y uacute -111 -KPX Y ucircumflex -111 -KPX Y udieresis -71 -KPX Y ugrave -71 -KPX Y uhungarumlaut -111 -KPX Y umacron -71 -KPX Y uogonek -111 -KPX Y uring -111 -KPX Yacute A -120 -KPX Yacute Aacute -120 -KPX Yacute Abreve -120 -KPX Yacute Acircumflex -120 -KPX Yacute Adieresis -120 -KPX Yacute Agrave -120 -KPX Yacute Amacron -120 -KPX Yacute Aogonek -120 -KPX Yacute Aring -120 -KPX Yacute Atilde -120 -KPX Yacute O -30 -KPX Yacute Oacute -30 -KPX Yacute Ocircumflex -30 -KPX Yacute Odieresis -30 -KPX Yacute Ograve -30 -KPX Yacute Ohungarumlaut -30 -KPX Yacute Omacron -30 -KPX Yacute Oslash -30 -KPX Yacute Otilde -30 -KPX Yacute a -100 -KPX Yacute aacute -100 -KPX Yacute abreve -100 -KPX Yacute acircumflex -100 -KPX Yacute adieresis -60 -KPX Yacute agrave -60 -KPX Yacute amacron -60 -KPX Yacute aogonek -100 -KPX Yacute aring -100 -KPX Yacute atilde -60 -KPX Yacute colon -92 -KPX Yacute comma -129 -KPX Yacute e -100 -KPX Yacute eacute -100 -KPX Yacute ecaron -100 -KPX Yacute ecircumflex -100 -KPX Yacute edieresis -60 -KPX Yacute edotaccent -100 -KPX Yacute egrave -60 -KPX Yacute emacron -60 -KPX Yacute eogonek -100 -KPX Yacute hyphen -111 -KPX Yacute i -55 -KPX Yacute iacute -55 -KPX Yacute iogonek -55 -KPX Yacute o -110 -KPX Yacute oacute -110 -KPX Yacute ocircumflex -110 -KPX Yacute odieresis -70 -KPX Yacute ograve -70 -KPX Yacute ohungarumlaut -110 -KPX Yacute omacron -70 -KPX Yacute oslash -110 -KPX Yacute otilde -70 -KPX Yacute period -129 -KPX Yacute semicolon -92 -KPX Yacute u -111 -KPX Yacute uacute -111 -KPX Yacute ucircumflex -111 -KPX Yacute udieresis -71 -KPX Yacute ugrave -71 -KPX Yacute uhungarumlaut -111 -KPX Yacute umacron -71 -KPX Yacute uogonek -111 -KPX Yacute uring -111 -KPX Ydieresis A -120 -KPX Ydieresis Aacute -120 -KPX Ydieresis Abreve -120 -KPX Ydieresis Acircumflex -120 -KPX Ydieresis Adieresis -120 -KPX Ydieresis Agrave -120 -KPX Ydieresis Amacron -120 -KPX Ydieresis Aogonek -120 -KPX Ydieresis Aring -120 -KPX Ydieresis Atilde -120 -KPX Ydieresis O -30 -KPX Ydieresis Oacute -30 -KPX Ydieresis Ocircumflex -30 -KPX Ydieresis Odieresis -30 -KPX Ydieresis Ograve -30 -KPX Ydieresis Ohungarumlaut -30 -KPX Ydieresis Omacron -30 -KPX Ydieresis Oslash -30 -KPX Ydieresis Otilde -30 -KPX Ydieresis a -100 -KPX Ydieresis aacute -100 -KPX Ydieresis abreve -100 -KPX Ydieresis acircumflex -100 -KPX Ydieresis adieresis -60 -KPX Ydieresis agrave -60 -KPX Ydieresis amacron -60 -KPX Ydieresis aogonek -100 -KPX Ydieresis aring -100 -KPX Ydieresis atilde -100 -KPX Ydieresis colon -92 -KPX Ydieresis comma -129 -KPX Ydieresis e -100 -KPX Ydieresis eacute -100 -KPX Ydieresis ecaron -100 -KPX Ydieresis ecircumflex -100 -KPX Ydieresis edieresis -60 -KPX Ydieresis edotaccent -100 -KPX Ydieresis egrave -60 -KPX Ydieresis emacron -60 -KPX Ydieresis eogonek -100 -KPX Ydieresis hyphen -111 -KPX Ydieresis i -55 -KPX Ydieresis iacute -55 -KPX Ydieresis iogonek -55 -KPX Ydieresis o -110 -KPX Ydieresis oacute -110 -KPX Ydieresis ocircumflex -110 -KPX Ydieresis odieresis -70 -KPX Ydieresis ograve -70 -KPX Ydieresis ohungarumlaut -110 -KPX Ydieresis omacron -70 -KPX Ydieresis oslash -110 -KPX Ydieresis otilde -70 -KPX Ydieresis period -129 -KPX Ydieresis semicolon -92 -KPX Ydieresis u -111 -KPX Ydieresis uacute -111 -KPX Ydieresis ucircumflex -111 -KPX Ydieresis udieresis -71 -KPX Ydieresis ugrave -71 -KPX Ydieresis uhungarumlaut -111 -KPX Ydieresis umacron -71 -KPX Ydieresis uogonek -111 -KPX Ydieresis uring -111 -KPX a v -20 -KPX a w -15 -KPX aacute v -20 -KPX aacute w -15 -KPX abreve v -20 -KPX abreve w -15 -KPX acircumflex v -20 -KPX acircumflex w -15 -KPX adieresis v -20 -KPX adieresis w -15 -KPX agrave v -20 -KPX agrave w -15 -KPX amacron v -20 -KPX amacron w -15 -KPX aogonek v -20 -KPX aogonek w -15 -KPX aring v -20 -KPX aring w -15 -KPX atilde v -20 -KPX atilde w -15 -KPX b period -40 -KPX b u -20 -KPX b uacute -20 -KPX b ucircumflex -20 -KPX b udieresis -20 -KPX b ugrave -20 -KPX b uhungarumlaut -20 -KPX b umacron -20 -KPX b uogonek -20 -KPX b uring -20 -KPX b v -15 -KPX c y -15 -KPX c yacute -15 -KPX c ydieresis -15 -KPX cacute y -15 -KPX cacute yacute -15 -KPX cacute ydieresis -15 -KPX ccaron y -15 -KPX ccaron yacute -15 -KPX ccaron ydieresis -15 -KPX ccedilla y -15 -KPX ccedilla yacute -15 -KPX ccedilla ydieresis -15 -KPX comma quotedblright -70 -KPX comma quoteright -70 -KPX e g -15 -KPX e gbreve -15 -KPX e gcommaaccent -15 -KPX e v -25 -KPX e w -25 -KPX e x -15 -KPX e y -15 -KPX e yacute -15 -KPX e ydieresis -15 -KPX eacute g -15 -KPX eacute gbreve -15 -KPX eacute gcommaaccent -15 -KPX eacute v -25 -KPX eacute w -25 -KPX eacute x -15 -KPX eacute y -15 -KPX eacute yacute -15 -KPX eacute ydieresis -15 -KPX ecaron g -15 -KPX ecaron gbreve -15 -KPX ecaron gcommaaccent -15 -KPX ecaron v -25 -KPX ecaron w -25 -KPX ecaron x -15 -KPX ecaron y -15 -KPX ecaron yacute -15 -KPX ecaron ydieresis -15 -KPX ecircumflex g -15 -KPX ecircumflex gbreve -15 -KPX ecircumflex gcommaaccent -15 -KPX ecircumflex v -25 -KPX ecircumflex w -25 -KPX ecircumflex x -15 -KPX ecircumflex y -15 -KPX ecircumflex yacute -15 -KPX ecircumflex ydieresis -15 -KPX edieresis g -15 -KPX edieresis gbreve -15 -KPX edieresis gcommaaccent -15 -KPX edieresis v -25 -KPX edieresis w -25 -KPX edieresis x -15 -KPX edieresis y -15 -KPX edieresis yacute -15 -KPX edieresis ydieresis -15 -KPX edotaccent g -15 -KPX edotaccent gbreve -15 -KPX edotaccent gcommaaccent -15 -KPX edotaccent v -25 -KPX edotaccent w -25 -KPX edotaccent x -15 -KPX edotaccent y -15 -KPX edotaccent yacute -15 -KPX edotaccent ydieresis -15 -KPX egrave g -15 -KPX egrave gbreve -15 -KPX egrave gcommaaccent -15 -KPX egrave v -25 -KPX egrave w -25 -KPX egrave x -15 -KPX egrave y -15 -KPX egrave yacute -15 -KPX egrave ydieresis -15 -KPX emacron g -15 -KPX emacron gbreve -15 -KPX emacron gcommaaccent -15 -KPX emacron v -25 -KPX emacron w -25 -KPX emacron x -15 -KPX emacron y -15 -KPX emacron yacute -15 -KPX emacron ydieresis -15 -KPX eogonek g -15 -KPX eogonek gbreve -15 -KPX eogonek gcommaaccent -15 -KPX eogonek v -25 -KPX eogonek w -25 -KPX eogonek x -15 -KPX eogonek y -15 -KPX eogonek yacute -15 -KPX eogonek ydieresis -15 -KPX f a -10 -KPX f aacute -10 -KPX f abreve -10 -KPX f acircumflex -10 -KPX f adieresis -10 -KPX f agrave -10 -KPX f amacron -10 -KPX f aogonek -10 -KPX f aring -10 -KPX f atilde -10 -KPX f dotlessi -50 -KPX f f -25 -KPX f i -20 -KPX f iacute -20 -KPX f quoteright 55 -KPX g a -5 -KPX g aacute -5 -KPX g abreve -5 -KPX g acircumflex -5 -KPX g adieresis -5 -KPX g agrave -5 -KPX g amacron -5 -KPX g aogonek -5 -KPX g aring -5 -KPX g atilde -5 -KPX gbreve a -5 -KPX gbreve aacute -5 -KPX gbreve abreve -5 -KPX gbreve acircumflex -5 -KPX gbreve adieresis -5 -KPX gbreve agrave -5 -KPX gbreve amacron -5 -KPX gbreve aogonek -5 -KPX gbreve aring -5 -KPX gbreve atilde -5 -KPX gcommaaccent a -5 -KPX gcommaaccent aacute -5 -KPX gcommaaccent abreve -5 -KPX gcommaaccent acircumflex -5 -KPX gcommaaccent adieresis -5 -KPX gcommaaccent agrave -5 -KPX gcommaaccent amacron -5 -KPX gcommaaccent aogonek -5 -KPX gcommaaccent aring -5 -KPX gcommaaccent atilde -5 -KPX h y -5 -KPX h yacute -5 -KPX h ydieresis -5 -KPX i v -25 -KPX iacute v -25 -KPX icircumflex v -25 -KPX idieresis v -25 -KPX igrave v -25 -KPX imacron v -25 -KPX iogonek v -25 -KPX k e -10 -KPX k eacute -10 -KPX k ecaron -10 -KPX k ecircumflex -10 -KPX k edieresis -10 -KPX k edotaccent -10 -KPX k egrave -10 -KPX k emacron -10 -KPX k eogonek -10 -KPX k o -10 -KPX k oacute -10 -KPX k ocircumflex -10 -KPX k odieresis -10 -KPX k ograve -10 -KPX k ohungarumlaut -10 -KPX k omacron -10 -KPX k oslash -10 -KPX k otilde -10 -KPX k y -15 -KPX k yacute -15 -KPX k ydieresis -15 -KPX kcommaaccent e -10 -KPX kcommaaccent eacute -10 -KPX kcommaaccent ecaron -10 -KPX kcommaaccent ecircumflex -10 -KPX kcommaaccent edieresis -10 -KPX kcommaaccent edotaccent -10 -KPX kcommaaccent egrave -10 -KPX kcommaaccent emacron -10 -KPX kcommaaccent eogonek -10 -KPX kcommaaccent o -10 -KPX kcommaaccent oacute -10 -KPX kcommaaccent ocircumflex -10 -KPX kcommaaccent odieresis -10 -KPX kcommaaccent ograve -10 -KPX kcommaaccent ohungarumlaut -10 -KPX kcommaaccent omacron -10 -KPX kcommaaccent oslash -10 -KPX kcommaaccent otilde -10 -KPX kcommaaccent y -15 -KPX kcommaaccent yacute -15 -KPX kcommaaccent ydieresis -15 -KPX l w -10 -KPX lacute w -10 -KPX lcommaaccent w -10 -KPX lslash w -10 -KPX n v -40 -KPX n y -15 -KPX n yacute -15 -KPX n ydieresis -15 -KPX nacute v -40 -KPX nacute y -15 -KPX nacute yacute -15 -KPX nacute ydieresis -15 -KPX ncaron v -40 -KPX ncaron y -15 -KPX ncaron yacute -15 -KPX ncaron ydieresis -15 -KPX ncommaaccent v -40 -KPX ncommaaccent y -15 -KPX ncommaaccent yacute -15 -KPX ncommaaccent ydieresis -15 -KPX ntilde v -40 -KPX ntilde y -15 -KPX ntilde yacute -15 -KPX ntilde ydieresis -15 -KPX o v -15 -KPX o w -25 -KPX o y -10 -KPX o yacute -10 -KPX o ydieresis -10 -KPX oacute v -15 -KPX oacute w -25 -KPX oacute y -10 -KPX oacute yacute -10 -KPX oacute ydieresis -10 -KPX ocircumflex v -15 -KPX ocircumflex w -25 -KPX ocircumflex y -10 -KPX ocircumflex yacute -10 -KPX ocircumflex ydieresis -10 -KPX odieresis v -15 -KPX odieresis w -25 -KPX odieresis y -10 -KPX odieresis yacute -10 -KPX odieresis ydieresis -10 -KPX ograve v -15 -KPX ograve w -25 -KPX ograve y -10 -KPX ograve yacute -10 -KPX ograve ydieresis -10 -KPX ohungarumlaut v -15 -KPX ohungarumlaut w -25 -KPX ohungarumlaut y -10 -KPX ohungarumlaut yacute -10 -KPX ohungarumlaut ydieresis -10 -KPX omacron v -15 -KPX omacron w -25 -KPX omacron y -10 -KPX omacron yacute -10 -KPX omacron ydieresis -10 -KPX oslash v -15 -KPX oslash w -25 -KPX oslash y -10 -KPX oslash yacute -10 -KPX oslash ydieresis -10 -KPX otilde v -15 -KPX otilde w -25 -KPX otilde y -10 -KPX otilde yacute -10 -KPX otilde ydieresis -10 -KPX p y -10 -KPX p yacute -10 -KPX p ydieresis -10 -KPX period quotedblright -70 -KPX period quoteright -70 -KPX quotedblleft A -80 -KPX quotedblleft Aacute -80 -KPX quotedblleft Abreve -80 -KPX quotedblleft Acircumflex -80 -KPX quotedblleft Adieresis -80 -KPX quotedblleft Agrave -80 -KPX quotedblleft Amacron -80 -KPX quotedblleft Aogonek -80 -KPX quotedblleft Aring -80 -KPX quotedblleft Atilde -80 -KPX quoteleft A -80 -KPX quoteleft Aacute -80 -KPX quoteleft Abreve -80 -KPX quoteleft Acircumflex -80 -KPX quoteleft Adieresis -80 -KPX quoteleft Agrave -80 -KPX quoteleft Amacron -80 -KPX quoteleft Aogonek -80 -KPX quoteleft Aring -80 -KPX quoteleft Atilde -80 -KPX quoteleft quoteleft -74 -KPX quoteright d -50 -KPX quoteright dcroat -50 -KPX quoteright l -10 -KPX quoteright lacute -10 -KPX quoteright lcommaaccent -10 -KPX quoteright lslash -10 -KPX quoteright quoteright -74 -KPX quoteright r -50 -KPX quoteright racute -50 -KPX quoteright rcaron -50 -KPX quoteright rcommaaccent -50 -KPX quoteright s -55 -KPX quoteright sacute -55 -KPX quoteright scaron -55 -KPX quoteright scedilla -55 -KPX quoteright scommaaccent -55 -KPX quoteright space -74 -KPX quoteright t -18 -KPX quoteright tcommaaccent -18 -KPX quoteright v -50 -KPX r comma -40 -KPX r g -18 -KPX r gbreve -18 -KPX r gcommaaccent -18 -KPX r hyphen -20 -KPX r period -55 -KPX racute comma -40 -KPX racute g -18 -KPX racute gbreve -18 -KPX racute gcommaaccent -18 -KPX racute hyphen -20 -KPX racute period -55 -KPX rcaron comma -40 -KPX rcaron g -18 -KPX rcaron gbreve -18 -KPX rcaron gcommaaccent -18 -KPX rcaron hyphen -20 -KPX rcaron period -55 -KPX rcommaaccent comma -40 -KPX rcommaaccent g -18 -KPX rcommaaccent gbreve -18 -KPX rcommaaccent gcommaaccent -18 -KPX rcommaaccent hyphen -20 -KPX rcommaaccent period -55 -KPX space A -55 -KPX space Aacute -55 -KPX space Abreve -55 -KPX space Acircumflex -55 -KPX space Adieresis -55 -KPX space Agrave -55 -KPX space Amacron -55 -KPX space Aogonek -55 -KPX space Aring -55 -KPX space Atilde -55 -KPX space T -18 -KPX space Tcaron -18 -KPX space Tcommaaccent -18 -KPX space V -50 -KPX space W -30 -KPX space Y -90 -KPX space Yacute -90 -KPX space Ydieresis -90 -KPX v a -25 -KPX v aacute -25 -KPX v abreve -25 -KPX v acircumflex -25 -KPX v adieresis -25 -KPX v agrave -25 -KPX v amacron -25 -KPX v aogonek -25 -KPX v aring -25 -KPX v atilde -25 -KPX v comma -65 -KPX v e -15 -KPX v eacute -15 -KPX v ecaron -15 -KPX v ecircumflex -15 -KPX v edieresis -15 -KPX v edotaccent -15 -KPX v egrave -15 -KPX v emacron -15 -KPX v eogonek -15 -KPX v o -20 -KPX v oacute -20 -KPX v ocircumflex -20 -KPX v odieresis -20 -KPX v ograve -20 -KPX v ohungarumlaut -20 -KPX v omacron -20 -KPX v oslash -20 -KPX v otilde -20 -KPX v period -65 -KPX w a -10 -KPX w aacute -10 -KPX w abreve -10 -KPX w acircumflex -10 -KPX w adieresis -10 -KPX w agrave -10 -KPX w amacron -10 -KPX w aogonek -10 -KPX w aring -10 -KPX w atilde -10 -KPX w comma -65 -KPX w o -10 -KPX w oacute -10 -KPX w ocircumflex -10 -KPX w odieresis -10 -KPX w ograve -10 -KPX w ohungarumlaut -10 -KPX w omacron -10 -KPX w oslash -10 -KPX w otilde -10 -KPX w period -65 -KPX x e -15 -KPX x eacute -15 -KPX x ecaron -15 -KPX x ecircumflex -15 -KPX x edieresis -15 -KPX x edotaccent -15 -KPX x egrave -15 -KPX x emacron -15 -KPX x eogonek -15 -KPX y comma -65 -KPX y period -65 -KPX yacute comma -65 -KPX yacute period -65 -KPX ydieresis comma -65 -KPX ydieresis period -65 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/Times-Roman.afm.php b/vendor/dompdf/dompdf/lib/fonts/Times-Roman.afm.php deleted file mode 100644 index ee04325..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/Times-Roman.afm.php +++ /dev/null @@ -1,572 +0,0 @@ - - array ( - 32 => 'space', - 160 => 'space', - 33 => 'exclam', - 34 => 'quotedbl', - 35 => 'numbersign', - 36 => 'dollar', - 37 => 'percent', - 38 => 'ampersand', - 146 => 'quoteright', - 40 => 'parenleft', - 41 => 'parenright', - 42 => 'asterisk', - 43 => 'plus', - 44 => 'comma', - 45 => 'hyphen', - 173 => 'hyphen', - 46 => 'period', - 47 => 'slash', - 48 => 'zero', - 49 => 'one', - 50 => 'two', - 51 => 'three', - 52 => 'four', - 53 => 'five', - 54 => 'six', - 55 => 'seven', - 56 => 'eight', - 57 => 'nine', - 58 => 'colon', - 59 => 'semicolon', - 60 => 'less', - 61 => 'equal', - 62 => 'greater', - 63 => 'question', - 64 => 'at', - 65 => 'A', - 66 => 'B', - 67 => 'C', - 68 => 'D', - 69 => 'E', - 70 => 'F', - 71 => 'G', - 72 => 'H', - 73 => 'I', - 74 => 'J', - 75 => 'K', - 76 => 'L', - 77 => 'M', - 78 => 'N', - 79 => 'O', - 80 => 'P', - 81 => 'Q', - 82 => 'R', - 83 => 'S', - 84 => 'T', - 85 => 'U', - 86 => 'V', - 87 => 'W', - 88 => 'X', - 89 => 'Y', - 90 => 'Z', - 91 => 'bracketleft', - 92 => 'backslash', - 93 => 'bracketright', - 94 => 'asciicircum', - 95 => 'underscore', - 145 => 'quoteleft', - 97 => 'a', - 98 => 'b', - 99 => 'c', - 100 => 'd', - 101 => 'e', - 102 => 'f', - 103 => 'g', - 104 => 'h', - 105 => 'i', - 106 => 'j', - 107 => 'k', - 108 => 'l', - 109 => 'm', - 110 => 'n', - 111 => 'o', - 112 => 'p', - 113 => 'q', - 114 => 'r', - 115 => 's', - 116 => 't', - 117 => 'u', - 118 => 'v', - 119 => 'w', - 120 => 'x', - 121 => 'y', - 122 => 'z', - 123 => 'braceleft', - 124 => 'bar', - 125 => 'braceright', - 126 => 'asciitilde', - 161 => 'exclamdown', - 162 => 'cent', - 163 => 'sterling', - 165 => 'yen', - 131 => 'florin', - 167 => 'section', - 164 => 'currency', - 39 => 'quotesingle', - 147 => 'quotedblleft', - 171 => 'guillemotleft', - 139 => 'guilsinglleft', - 155 => 'guilsinglright', - 150 => 'endash', - 134 => 'dagger', - 135 => 'daggerdbl', - 183 => 'periodcentered', - 182 => 'paragraph', - 149 => 'bullet', - 130 => 'quotesinglbase', - 132 => 'quotedblbase', - 148 => 'quotedblright', - 187 => 'guillemotright', - 133 => 'ellipsis', - 137 => 'perthousand', - 191 => 'questiondown', - 96 => 'grave', - 180 => 'acute', - 136 => 'circumflex', - 152 => 'tilde', - 175 => 'macron', - 168 => 'dieresis', - 184 => 'cedilla', - 151 => 'emdash', - 198 => 'AE', - 170 => 'ordfeminine', - 216 => 'Oslash', - 140 => 'OE', - 186 => 'ordmasculine', - 230 => 'ae', - 248 => 'oslash', - 156 => 'oe', - 223 => 'germandbls', - 207 => 'Idieresis', - 233 => 'eacute', - 159 => 'Ydieresis', - 247 => 'divide', - 221 => 'Yacute', - 194 => 'Acircumflex', - 225 => 'aacute', - 219 => 'Ucircumflex', - 253 => 'yacute', - 234 => 'ecircumflex', - 220 => 'Udieresis', - 218 => 'Uacute', - 203 => 'Edieresis', - 169 => 'copyright', - 229 => 'aring', - 224 => 'agrave', - 227 => 'atilde', - 154 => 'scaron', - 237 => 'iacute', - 251 => 'ucircumflex', - 226 => 'acircumflex', - 231 => 'ccedilla', - 222 => 'Thorn', - 179 => 'threesuperior', - 210 => 'Ograve', - 192 => 'Agrave', - 215 => 'multiply', - 250 => 'uacute', - 255 => 'ydieresis', - 238 => 'icircumflex', - 202 => 'Ecircumflex', - 228 => 'adieresis', - 235 => 'edieresis', - 205 => 'Iacute', - 177 => 'plusminus', - 166 => 'brokenbar', - 174 => 'registered', - 200 => 'Egrave', - 142 => 'Zcaron', - 208 => 'Eth', - 199 => 'Ccedilla', - 193 => 'Aacute', - 196 => 'Adieresis', - 232 => 'egrave', - 211 => 'Oacute', - 243 => 'oacute', - 239 => 'idieresis', - 212 => 'Ocircumflex', - 217 => 'Ugrave', - 254 => 'thorn', - 178 => 'twosuperior', - 214 => 'Odieresis', - 181 => 'mu', - 236 => 'igrave', - 190 => 'threequarters', - 153 => 'trademark', - 204 => 'Igrave', - 189 => 'onehalf', - 244 => 'ocircumflex', - 241 => 'ntilde', - 201 => 'Eacute', - 188 => 'onequarter', - 138 => 'Scaron', - 176 => 'degree', - 242 => 'ograve', - 249 => 'ugrave', - 209 => 'Ntilde', - 245 => 'otilde', - 195 => 'Atilde', - 197 => 'Aring', - 213 => 'Otilde', - 206 => 'Icircumflex', - 172 => 'logicalnot', - 246 => 'odieresis', - 252 => 'udieresis', - 240 => 'eth', - 158 => 'zcaron', - 185 => 'onesuperior', - 128 => 'Euro', - ), - 'isUnicode' => false, - 'FontName' => 'Times-Roman', - 'FullName' => 'Times Roman', - 'FamilyName' => 'Times', - 'Weight' => 'Roman', - 'ItalicAngle' => '0', - 'IsFixedPitch' => 'false', - 'CharacterSet' => 'ExtendedRoman', - 'FontBBox' => - array ( - 0 => '-168', - 1 => '-218', - 2 => '1000', - 3 => '898', - ), - 'UnderlinePosition' => '-100', - 'UnderlineThickness' => '50', - 'Version' => '002.00', - 'EncodingScheme' => 'WinAnsiEncoding', - 'CapHeight' => '662', - 'XHeight' => '450', - 'Ascender' => '683', - 'Descender' => '-217', - 'StdHW' => '28', - 'StdVW' => '84', - 'StartCharMetrics' => '317', - 'C' => - array ( - 32 => 250.0, - 160 => 250.0, - 33 => 333.0, - 34 => 408.0, - 35 => 500.0, - 36 => 500.0, - 37 => 833.0, - 38 => 778.0, - 146 => 333.0, - 40 => 333.0, - 41 => 333.0, - 42 => 500.0, - 43 => 564.0, - 44 => 250.0, - 45 => 333.0, - 173 => 333.0, - 46 => 250.0, - 47 => 278.0, - 48 => 500.0, - 49 => 500.0, - 50 => 500.0, - 51 => 500.0, - 52 => 500.0, - 53 => 500.0, - 54 => 500.0, - 55 => 500.0, - 56 => 500.0, - 57 => 500.0, - 58 => 278.0, - 59 => 278.0, - 60 => 564.0, - 61 => 564.0, - 62 => 564.0, - 63 => 444.0, - 64 => 921.0, - 65 => 722.0, - 66 => 667.0, - 67 => 667.0, - 68 => 722.0, - 69 => 611.0, - 70 => 556.0, - 71 => 722.0, - 72 => 722.0, - 73 => 333.0, - 74 => 389.0, - 75 => 722.0, - 76 => 611.0, - 77 => 889.0, - 78 => 722.0, - 79 => 722.0, - 80 => 556.0, - 81 => 722.0, - 82 => 667.0, - 83 => 556.0, - 84 => 611.0, - 85 => 722.0, - 86 => 722.0, - 87 => 944.0, - 88 => 722.0, - 89 => 722.0, - 90 => 611.0, - 91 => 333.0, - 92 => 278.0, - 93 => 333.0, - 94 => 469.0, - 95 => 500.0, - 145 => 333.0, - 97 => 444.0, - 98 => 500.0, - 99 => 444.0, - 100 => 500.0, - 101 => 444.0, - 102 => 333.0, - 103 => 500.0, - 104 => 500.0, - 105 => 278.0, - 106 => 278.0, - 107 => 500.0, - 108 => 278.0, - 109 => 778.0, - 110 => 500.0, - 111 => 500.0, - 112 => 500.0, - 113 => 500.0, - 114 => 333.0, - 115 => 389.0, - 116 => 278.0, - 117 => 500.0, - 118 => 500.0, - 119 => 722.0, - 120 => 500.0, - 121 => 500.0, - 122 => 444.0, - 123 => 480.0, - 124 => 200.0, - 125 => 480.0, - 126 => 541.0, - 161 => 333.0, - 162 => 500.0, - 163 => 500.0, - 'fraction' => 167.0, - 165 => 500.0, - 131 => 500.0, - 167 => 500.0, - 164 => 500.0, - 39 => 180.0, - 147 => 444.0, - 171 => 500.0, - 139 => 333.0, - 155 => 333.0, - 'fi' => 556.0, - 'fl' => 556.0, - 150 => 500.0, - 134 => 500.0, - 135 => 500.0, - 183 => 250.0, - 182 => 453.0, - 149 => 350.0, - 130 => 333.0, - 132 => 444.0, - 148 => 444.0, - 187 => 500.0, - 133 => 1000.0, - 137 => 1000.0, - 191 => 444.0, - 96 => 333.0, - 180 => 333.0, - 136 => 333.0, - 152 => 333.0, - 175 => 333.0, - 'breve' => 333.0, - 'dotaccent' => 333.0, - 168 => 333.0, - 'ring' => 333.0, - 184 => 333.0, - 'hungarumlaut' => 333.0, - 'ogonek' => 333.0, - 'caron' => 333.0, - 151 => 1000.0, - 198 => 889.0, - 170 => 276.0, - 'Lslash' => 611.0, - 216 => 722.0, - 140 => 889.0, - 186 => 310.0, - 230 => 667.0, - 'dotlessi' => 278.0, - 'lslash' => 278.0, - 248 => 500.0, - 156 => 722.0, - 223 => 500.0, - 207 => 333.0, - 233 => 444.0, - 'abreve' => 444.0, - 'uhungarumlaut' => 500.0, - 'ecaron' => 444.0, - 159 => 722.0, - 247 => 564.0, - 221 => 722.0, - 194 => 722.0, - 225 => 444.0, - 219 => 722.0, - 253 => 500.0, - 'scommaaccent' => 389.0, - 234 => 444.0, - 'Uring' => 722.0, - 220 => 722.0, - 'aogonek' => 444.0, - 218 => 722.0, - 'uogonek' => 500.0, - 203 => 611.0, - 'Dcroat' => 722.0, - 'commaaccent' => 250.0, - 169 => 760.0, - 'Emacron' => 611.0, - 'ccaron' => 444.0, - 229 => 444.0, - 'Ncommaaccent' => 722.0, - 'lacute' => 278.0, - 224 => 444.0, - 'Tcommaaccent' => 611.0, - 'Cacute' => 667.0, - 227 => 444.0, - 'Edotaccent' => 611.0, - 154 => 389.0, - 'scedilla' => 389.0, - 237 => 278.0, - 'lozenge' => 471.0, - 'Rcaron' => 667.0, - 'Gcommaaccent' => 722.0, - 251 => 500.0, - 226 => 444.0, - 'Amacron' => 722.0, - 'rcaron' => 333.0, - 231 => 444.0, - 'Zdotaccent' => 611.0, - 222 => 556.0, - 'Omacron' => 722.0, - 'Racute' => 667.0, - 'Sacute' => 556.0, - 'dcaron' => 588.0, - 'Umacron' => 722.0, - 'uring' => 500.0, - 179 => 300.0, - 210 => 722.0, - 192 => 722.0, - 'Abreve' => 722.0, - 215 => 564.0, - 250 => 500.0, - 'Tcaron' => 611.0, - 'partialdiff' => 476.0, - 255 => 500.0, - 'Nacute' => 722.0, - 238 => 278.0, - 202 => 611.0, - 228 => 444.0, - 235 => 444.0, - 'cacute' => 444.0, - 'nacute' => 500.0, - 'umacron' => 500.0, - 'Ncaron' => 722.0, - 205 => 333.0, - 177 => 564.0, - 166 => 200.0, - 174 => 760.0, - 'Gbreve' => 722.0, - 'Idotaccent' => 333.0, - 'summation' => 600.0, - 200 => 611.0, - 'racute' => 333.0, - 'omacron' => 500.0, - 'Zacute' => 611.0, - 142 => 611.0, - 'greaterequal' => 549.0, - 208 => 722.0, - 199 => 667.0, - 'lcommaaccent' => 278.0, - 'tcaron' => 326.0, - 'eogonek' => 444.0, - 'Uogonek' => 722.0, - 193 => 722.0, - 196 => 722.0, - 232 => 444.0, - 'zacute' => 444.0, - 'iogonek' => 278.0, - 211 => 722.0, - 243 => 500.0, - 'amacron' => 444.0, - 'sacute' => 389.0, - 239 => 278.0, - 212 => 722.0, - 217 => 722.0, - 'Delta' => 612.0, - 254 => 500.0, - 178 => 300.0, - 214 => 722.0, - 181 => 500.0, - 236 => 278.0, - 'ohungarumlaut' => 500.0, - 'Eogonek' => 611.0, - 'dcroat' => 500.0, - 190 => 750.0, - 'Scedilla' => 556.0, - 'lcaron' => 344.0, - 'Kcommaaccent' => 722.0, - 'Lacute' => 611.0, - 153 => 980.0, - 'edotaccent' => 444.0, - 204 => 333.0, - 'Imacron' => 333.0, - 'Lcaron' => 611.0, - 189 => 750.0, - 'lessequal' => 549.0, - 244 => 500.0, - 241 => 500.0, - 'Uhungarumlaut' => 722.0, - 201 => 611.0, - 'emacron' => 444.0, - 'gbreve' => 500.0, - 188 => 750.0, - 138 => 556.0, - 'Scommaaccent' => 556.0, - 'Ohungarumlaut' => 722.0, - 176 => 400.0, - 242 => 500.0, - 'Ccaron' => 667.0, - 249 => 500.0, - 'radical' => 453.0, - 'Dcaron' => 722.0, - 'rcommaaccent' => 333.0, - 209 => 722.0, - 245 => 500.0, - 'Rcommaaccent' => 667.0, - 'Lcommaaccent' => 611.0, - 195 => 722.0, - 'Aogonek' => 722.0, - 197 => 722.0, - 213 => 722.0, - 'zdotaccent' => 444.0, - 'Ecaron' => 611.0, - 'Iogonek' => 333.0, - 'kcommaaccent' => 500.0, - 'minus' => 564.0, - 206 => 333.0, - 'ncaron' => 500.0, - 'tcommaaccent' => 278.0, - 172 => 564.0, - 246 => 500.0, - 252 => 500.0, - 'notequal' => 549.0, - 'gcommaaccent' => 500.0, - 240 => 500.0, - 158 => 444.0, - 'ncommaaccent' => 500.0, - 185 => 300.0, - 'imacron' => 278.0, - 128 => 500.0, - ), - 'CIDtoGID_Compressed' => true, - 'CIDtoGID' => 'eJwDAAAAAAE=', - '_version_' => 6, -); \ No newline at end of file diff --git a/vendor/dompdf/dompdf/lib/fonts/ZapfDingbats.afm b/vendor/dompdf/dompdf/lib/fonts/ZapfDingbats.afm deleted file mode 100644 index b274505..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/ZapfDingbats.afm +++ /dev/null @@ -1,225 +0,0 @@ -StartFontMetrics 4.1 -Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved. -Comment Creation Date: Thu May 1 15:14:13 1997 -Comment UniqueID 43082 -Comment VMusage 45775 55535 -FontName ZapfDingbats -FullName ITC Zapf Dingbats -FamilyName ZapfDingbats -Weight Medium -ItalicAngle 0 -IsFixedPitch false -CharacterSet Special -FontBBox -1 -143 981 820 -UnderlinePosition -100 -UnderlineThickness 50 -Version 002.000 -Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation. -EncodingScheme FontSpecific -StdHW 28 -StdVW 90 -StartCharMetrics 202 -C 32 ; WX 278 ; N space ; B 0 0 0 0 ; -C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ; -C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ; -C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ; -C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ; -C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ; -C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ; -C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ; -C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ; -C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ; -C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ; -C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ; -C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ; -C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ; -C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ; -C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ; -C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ; -C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ; -C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ; -C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ; -C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ; -C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ; -C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ; -C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ; -C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ; -C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ; -C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ; -C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ; -C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ; -C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ; -C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ; -C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ; -C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ; -C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ; -C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ; -C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ; -C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ; -C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ; -C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ; -C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ; -C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ; -C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ; -C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ; -C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ; -C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ; -C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ; -C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ; -C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ; -C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ; -C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ; -C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ; -C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ; -C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ; -C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ; -C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ; -C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ; -C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ; -C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ; -C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ; -C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ; -C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ; -C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ; -C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ; -C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ; -C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ; -C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ; -C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ; -C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ; -C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ; -C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ; -C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ; -C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ; -C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ; -C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ; -C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ; -C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ; -C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ; -C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ; -C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ; -C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ; -C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ; -C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ; -C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ; -C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ; -C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ; -C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ; -C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ; -C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ; -C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ; -C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ; -C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ; -C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ; -C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ; -C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ; -C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ; -C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ; -C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ; -C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ; -C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ; -C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ; -C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ; -C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ; -C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ; -C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ; -C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ; -C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ; -C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ; -C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ; -C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ; -C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ; -C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ; -C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ; -C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ; -C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ; -C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ; -C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ; -C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ; -C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ; -C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ; -C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ; -C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ; -C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ; -C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ; -C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ; -C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ; -C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ; -C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ; -C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ; -C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ; -C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ; -C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ; -C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ; -C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ; -C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ; -C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ; -C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ; -C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ; -C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ; -C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ; -C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ; -C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ; -C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ; -C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ; -C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ; -C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ; -C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ; -C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ; -C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ; -C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ; -C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ; -C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ; -C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ; -C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ; -C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ; -C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ; -C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ; -C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ; -C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ; -C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ; -C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ; -C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ; -C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ; -C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ; -C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ; -C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ; -C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ; -C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ; -C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ; -C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ; -C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ; -C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ; -C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ; -C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ; -C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ; -C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ; -C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ; -C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ; -C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ; -C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ; -C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ; -C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ; -C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ; -C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ; -C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ; -C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ; -C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ; -C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ; -C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ; -C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ; -C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ; -C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ; -C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ; -C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ; -C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ; -C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ; -C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ; -C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ; -C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ; -C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ; -C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ; -C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ; -C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ; -EndCharMetrics -EndFontMetrics diff --git a/vendor/dompdf/dompdf/lib/fonts/dompdf_font_family_cache.dist.php b/vendor/dompdf/dompdf/lib/fonts/dompdf_font_family_cache.dist.php deleted file mode 100644 index 12c2bc2..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/dompdf_font_family_cache.dist.php +++ /dev/null @@ -1,95 +0,0 @@ - - [ - 'normal' => $distFontDir . '/Helvetica', - 'bold' => $distFontDir . '/Helvetica-Bold', - 'italic' => $distFontDir . '/Helvetica-Oblique', - 'bold_italic' => $distFontDir . '/Helvetica-BoldOblique' - ], - 'times' => - [ - 'normal' => $distFontDir . '/Times-Roman', - 'bold' => $distFontDir . '/Times-Bold', - 'italic' => $distFontDir . '/Times-Italic', - 'bold_italic' => $distFontDir . '/Times-BoldItalic' - ], - 'times-roman' => - [ - 'normal' => $distFontDir . '/Times-Roman', - 'bold' => $distFontDir . '/Times-Bold', - 'italic' => $distFontDir . '/Times-Italic', - 'bold_italic' => $distFontDir . '/Times-BoldItalic' - ], - 'courier' => - [ - 'normal' => $distFontDir . '/Courier', - 'bold' => $distFontDir . '/Courier-Bold', - 'italic' => $distFontDir . '/Courier-Oblique', - 'bold_italic' => $distFontDir . '/Courier-BoldOblique' - ], - 'helvetica' => - [ - 'normal' => $distFontDir . '/Helvetica', - 'bold' => $distFontDir . '/Helvetica-Bold', - 'italic' => $distFontDir . '/Helvetica-Oblique', - 'bold_italic' => $distFontDir . '/Helvetica-BoldOblique' - ], - 'zapfdingbats' => - [ - 'normal' => $distFontDir . '/ZapfDingbats', - 'bold' => $distFontDir . '/ZapfDingbats', - 'italic' => $distFontDir . '/ZapfDingbats', - 'bold_italic' => $distFontDir . '/ZapfDingbats' - ], - 'symbol' => - [ - 'normal' => $distFontDir . '/Symbol', - 'bold' => $distFontDir . '/Symbol', - 'italic' => $distFontDir . '/Symbol', - 'bold_italic' => $distFontDir . '/Symbol' - ], - 'serif' => - [ - 'normal' => $distFontDir . '/Times-Roman', - 'bold' => $distFontDir . '/Times-Bold', - 'italic' => $distFontDir . '/Times-Italic', - 'bold_italic' => $distFontDir . '/Times-BoldItalic' - ], - 'monospace' => - [ - 'normal' => $distFontDir . '/Courier', - 'bold' => $distFontDir . '/Courier-Bold', - 'italic' => $distFontDir . '/Courier-Oblique', - 'bold_italic' => $distFontDir . '/Courier-BoldOblique' - ], - 'fixed' => - [ - 'normal' => $distFontDir . '/Courier', - 'bold' => $distFontDir . '/Courier-Bold', - 'italic' => $distFontDir . '/Courier-Oblique', - 'bold_italic' => $distFontDir . '/Courier-BoldOblique' - ], - 'dejavu sans' => - [ - 'bold' => $distFontDir . '/DejaVuSans-Bold', - 'bold_italic' => $distFontDir . '/DejaVuSans-BoldOblique', - 'italic' => $distFontDir . '/DejaVuSans-Oblique', - 'normal' => $distFontDir . '/DejaVuSans' - ], - 'dejavu sans mono' => - [ - 'bold' => $distFontDir . '/DejaVuSansMono-Bold', - 'bold_italic' => $distFontDir . '/DejaVuSansMono-BoldOblique', - 'italic' => $distFontDir . '/DejaVuSansMono-Oblique', - 'normal' => $distFontDir . '/DejaVuSansMono' - ], - 'dejavu serif' => - [ - 'bold' => $distFontDir . '/DejaVuSerif-Bold', - 'bold_italic' => $distFontDir . '/DejaVuSerif-BoldItalic', - 'italic' => $distFontDir . '/DejaVuSerif-Italic', - 'normal' => $distFontDir . '/DejaVuSerif' - ] -]; \ No newline at end of file diff --git a/vendor/dompdf/dompdf/lib/fonts/mustRead.html b/vendor/dompdf/dompdf/lib/fonts/mustRead.html deleted file mode 100644 index b9f4ba2..0000000 --- a/vendor/dompdf/dompdf/lib/fonts/mustRead.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - Core 14 AFM Files - ReadMe - - - or - - - - - -
This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. Col
-

Source http://www.adobe.com/devnet/font/#pcfi

- - \ No newline at end of file diff --git a/vendor/dompdf/dompdf/lib/html5lib/Data.php b/vendor/dompdf/dompdf/lib/html5lib/Data.php deleted file mode 100644 index 609e996..0000000 --- a/vendor/dompdf/dompdf/lib/html5lib/Data.php +++ /dev/null @@ -1,123 +0,0 @@ - 0xFFFD, // REPLACEMENT CHARACTER - 0x0D => 0x000A, // LINE FEED (LF) - 0x80 => 0x20AC, // EURO SIGN ('€') - 0x81 => 0x0081, // - 0x82 => 0x201A, // SINGLE LOW-9 QUOTATION MARK ('ā€š') - 0x83 => 0x0192, // LATIN SMALL LETTER F WITH HOOK ('ʒ') - 0x84 => 0x201E, // DOUBLE LOW-9 QUOTATION MARK ('ā€ž') - 0x85 => 0x2026, // HORIZONTAL ELLIPSIS ('…') - 0x86 => 0x2020, // DAGGER ('†') - 0x87 => 0x2021, // DOUBLE DAGGER ('—') - 0x88 => 0x02C6, // MODIFIER LETTER CIRCUMFLEX ACCENT ('ˆ') - 0x89 => 0x2030, // PER MILLE SIGN ('‰') - 0x8A => 0x0160, // LATIN CAPITAL LETTER S WITH CARON ('Å ') - 0x8B => 0x2039, // SINGLE LEFT-POINTING ANGLE QUOTATION MARK ('‹') - 0x8C => 0x0152, // LATIN CAPITAL LIGATURE OE ('Œ') - 0x8D => 0x008D, // - 0x8E => 0x017D, // LATIN CAPITAL LETTER Z WITH CARON ('Ž') - 0x8F => 0x008F, // - 0x90 => 0x0090, // - 0x91 => 0x2018, // LEFT SINGLE QUOTATION MARK ('ā€˜') - 0x92 => 0x2019, // RIGHT SINGLE QUOTATION MARK ('’') - 0x93 => 0x201C, // LEFT DOUBLE QUOTATION MARK ('ā€œ') - 0x94 => 0x201D, // RIGHT DOUBLE QUOTATION MARK ('ā€') - 0x95 => 0x2022, // BULLET ('•') - 0x96 => 0x2013, // EN DASH ('–') - 0x97 => 0x2014, // EM DASH ('—') - 0x98 => 0x02DC, // SMALL TILDE ('˜') - 0x99 => 0x2122, // TRADE MARK SIGN ('ā„¢') - 0x9A => 0x0161, // LATIN SMALL LETTER S WITH CARON ('Å”') - 0x9B => 0x203A, // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK ('›') - 0x9C => 0x0153, // LATIN SMALL LIGATURE OE ('œ') - 0x9D => 0x009D, // - 0x9E => 0x017E, // LATIN SMALL LETTER Z WITH CARON ('ž') - 0x9F => 0x0178, // LATIN CAPITAL LETTER Y WITH DIAERESIS ('Åø') - ]; - - protected static $namedCharacterReferences; - - protected static $namedCharacterReferenceMaxLength; - - /** - * Returns the "real" Unicode codepoint of a malformed character - * reference. - */ - public static function getRealCodepoint($ref) { - if (!isset(self::$realCodepointTable[$ref])) { - return false; - } else { - return self::$realCodepointTable[$ref]; - } - } - - public static function getNamedCharacterReferences() { - if (!self::$namedCharacterReferences) { - self::$namedCharacterReferences = unserialize( - file_get_contents(dirname(__FILE__) . '/named-character-references.ser')); - } - return self::$namedCharacterReferences; - } - - /** - * Converts a Unicode codepoint to sequence of UTF-8 bytes. - * @note Shamelessly stolen from HTML Purifier, which is also - * shamelessly stolen from Feyd (which is in public domain). - */ - public static function utf8chr($code) { - /* We don't care: we live dangerously - * if($code > 0x10FFFF or $code < 0x0 or - ($code >= 0xD800 and $code <= 0xDFFF) ) { - // bits are set outside the "valid" range as defined - // by UNICODE 4.1.0 - return "\xEF\xBF\xBD"; - }*/ - - $y = $z = $w = 0; - if ($code < 0x80) { - // regular ASCII character - $x = $code; - } else { - // set up bits for UTF-8 - $x = ($code & 0x3F) | 0x80; - if ($code < 0x800) { - $y = (($code & 0x7FF) >> 6) | 0xC0; - } else { - $y = (($code & 0xFC0) >> 6) | 0x80; - if ($code < 0x10000) { - $z = (($code >> 12) & 0x0F) | 0xE0; - } else { - $z = (($code >> 12) & 0x3F) | 0x80; - $w = (($code >> 18) & 0x07) | 0xF0; - } - } - } - // set up the actual character - $ret = ''; - if ($w) { - $ret .= chr($w); - } - if ($z) { - $ret .= chr($z); - } - if ($y) { - $ret .= chr($y); - } - $ret .= chr($x); - - return $ret; - } - -} diff --git a/vendor/dompdf/dompdf/lib/html5lib/InputStream.php b/vendor/dompdf/dompdf/lib/html5lib/InputStream.php deleted file mode 100644 index dde7194..0000000 --- a/vendor/dompdf/dompdf/lib/html5lib/InputStream.php +++ /dev/null @@ -1,299 +0,0 @@ - - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ - -// Some conventions: -// /* */ indicates verbatim text from the HTML 5 specification -// // indicates regular comments - -class HTML5_InputStream { - /** - * The string data we're parsing. - */ - private $data; - - /** - * The current integer byte position we are in $data - */ - private $char; - - /** - * Length of $data; when $char === $data, we are at the end-of-file. - */ - private $EOF; - - /** - * Parse errors. - */ - public $errors = []; - - /** - * @param $data | Data to parse - * @throws Exception - */ - public function __construct($data) { - - /* Given an encoding, the bytes in the input stream must be - converted to Unicode characters for the tokeniser, as - described by the rules for that encoding, except that the - leading U+FEFF BYTE ORDER MARK character, if any, must not - be stripped by the encoding layer (it is stripped by the rule below). - - Bytes or sequences of bytes in the original byte stream that - could not be converted to Unicode characters must be converted - to U+FFFD REPLACEMENT CHARACTER code points. */ - - // XXX currently assuming input data is UTF-8; once we - // build encoding detection this will no longer be the case - // - // We previously had an mbstring implementation here, but that - // implementation is heavily non-conforming, so it's been - // omitted. - if (extension_loaded('iconv')) { - // non-conforming - $data = @iconv('UTF-8', 'UTF-8//IGNORE', $data); - } else { - // we can make a conforming native implementation - throw new Exception('Not implemented, please install iconv'); - } - - /* One leading U+FEFF BYTE ORDER MARK character must be - ignored if any are present. */ - if (substr($data, 0, 3) === "\xEF\xBB\xBF") { - $data = substr($data, 3); - } - - /* All U+0000 NULL characters in the input must be replaced - by U+FFFD REPLACEMENT CHARACTERs. Any occurrences of such - characters is a parse error. */ - for ($i = 0, $count = substr_count($data, "\0"); $i < $count; $i++) { - $this->errors[] = [ - 'type' => HTML5_Tokenizer::PARSEERROR, - 'data' => 'null-character' - ]; - } - /* U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED - (LF) characters are treated specially. Any CR characters - that are followed by LF characters must be removed, and any - CR characters not followed by LF characters must be converted - to LF characters. Thus, newlines in HTML DOMs are represented - by LF characters, and there are never any CR characters in the - input to the tokenization stage. */ - $data = str_replace( - [ - "\0", - "\r\n", - "\r" - ], - [ - "\xEF\xBF\xBD", - "\n", - "\n" - ], - $data - ); - - /* Any occurrences of any characters in the ranges U+0001 to - U+0008, U+000B, U+000E to U+001F, U+007F to U+009F, - U+D800 to U+DFFF , U+FDD0 to U+FDEF, and - characters U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, U+2FFFE, U+2FFFF, - U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE, - U+6FFFF, U+7FFFE, U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF, - U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, U+DFFFE, - U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, and - U+10FFFF are parse errors. (These are all control characters - or permanently undefined Unicode characters.) */ - // Check PCRE is loaded. - if (extension_loaded('pcre')) { - $count = preg_match_all( - '/(?: - [\x01-\x08\x0B\x0E-\x1F\x7F] # U+0001 to U+0008, U+000B, U+000E to U+001F and U+007F - | - \xC2[\x80-\x9F] # U+0080 to U+009F - | - \xED(?:\xA0[\x80-\xFF]|[\xA1-\xBE][\x00-\xFF]|\xBF[\x00-\xBF]) # U+D800 to U+DFFFF - | - \xEF\xB7[\x90-\xAF] # U+FDD0 to U+FDEF - | - \xEF\xBF[\xBE\xBF] # U+FFFE and U+FFFF - | - [\xF0-\xF4][\x8F-\xBF]\xBF[\xBE\xBF] # U+nFFFE and U+nFFFF (1 <= n <= 10_{16}) - )/x', - $data, - $matches - ); - for ($i = 0; $i < $count; $i++) { - $this->errors[] = [ - 'type' => HTML5_Tokenizer::PARSEERROR, - 'data' => 'invalid-codepoint' - ]; - } - } else { - // XXX: Need non-PCRE impl, probably using substr_count - } - - $this->data = $data; - $this->char = 0; - $this->EOF = strlen($data); - } - - /** - * Returns the current line that the tokenizer is at. - * - * @return int - */ - public function getCurrentLine() { - // Check the string isn't empty - if ($this->EOF) { - // Add one to $this->char because we want the number for the next - // byte to be processed. - return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; - } else { - // If the string is empty, we are on the first line (sorta). - return 1; - } - } - - /** - * Returns the current column of the current line that the tokenizer is at. - * - * @return int - */ - public function getColumnOffset() { - // strrpos is weird, and the offset needs to be negative for what we - // want (i.e., the last \n before $this->char). This needs to not have - // one (to make it point to the next character, the one we want the - // position of) added to it because strrpos's behaviour includes the - // final offset byte. - $lastLine = strrpos($this->data, "\n", $this->char - 1 - strlen($this->data)); - - // However, for here we want the length up until the next byte to be - // processed, so add one to the current byte ($this->char). - if ($lastLine !== false) { - $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); - } else { - $findLengthOf = substr($this->data, 0, $this->char); - } - - // Get the length for the string we need. - if (extension_loaded('iconv')) { - return iconv_strlen($findLengthOf, 'utf-8'); - } elseif (extension_loaded('mbstring')) { - return mb_strlen($findLengthOf, 'utf-8'); - } elseif (extension_loaded('xml')) { - return strlen(utf8_decode($findLengthOf)); - } else { - $count = count_chars($findLengthOf); - // 0x80 = 0x7F - 0 + 1 (one added to get inclusive range) - // 0x33 = 0xF4 - 0x2C + 1 (one added to get inclusive range) - return array_sum(array_slice($count, 0, 0x80)) + - array_sum(array_slice($count, 0xC2, 0x33)); - } - } - - /** - * Retrieve the currently consume character. - * @note This performs bounds checking - * - * @return bool|string - */ - public function char() { - return ($this->char++ < $this->EOF) - ? $this->data[$this->char - 1] - : false; - } - - /** - * Get all characters until EOF. - * @note This performs bounds checking - * - * @return string|bool - */ - public function remainingChars() { - if ($this->char < $this->EOF) { - $data = substr($this->data, $this->char); - $this->char = $this->EOF; - return $data; - } else { - return false; - } - } - - /** - * Matches as far as possible until we reach a certain set of bytes - * and returns the matched substring. - * - * @param $bytes | Bytes to match. - * @param null $max - * @return bool|string - */ - public function charsUntil($bytes, $max = null) { - if ($this->char < $this->EOF) { - if ($max === 0 || $max) { - $len = strcspn($this->data, $bytes, $this->char, $max); - } else { - $len = strcspn($this->data, $bytes, $this->char); - } - $string = (string) substr($this->data, $this->char, $len); - $this->char += $len; - return $string; - } else { - return false; - } - } - - /** - * Matches as far as possible with a certain set of bytes - * and returns the matched substring. - * - * @param $bytes | Bytes to match. - * @param null $max - * @return bool|string - */ - public function charsWhile($bytes, $max = null) { - if ($this->char < $this->EOF) { - if ($max === 0 || $max) { - $len = strspn($this->data, $bytes, $this->char, $max); - } else { - $len = strspn($this->data, $bytes, $this->char); - } - $string = (string) substr($this->data, $this->char, $len); - $this->char += $len; - return $string; - } else { - return false; - } - } - - /** - * Unconsume one character. - */ - public function unget() { - if ($this->char <= $this->EOF) { - $this->char--; - } - } -} diff --git a/vendor/dompdf/dompdf/lib/html5lib/Parser.php b/vendor/dompdf/dompdf/lib/html5lib/Parser.php deleted file mode 100644 index b48ce68..0000000 --- a/vendor/dompdf/dompdf/lib/html5lib/Parser.php +++ /dev/null @@ -1,37 +0,0 @@ -parse(); - return $tokenizer->save(); - } - - /** - * Parses an HTML fragment. - * @param $text | HTML text to parse - * @param $context String name of context element to pretend parsing is in. - * @param $builder | Custom builder implementation - * @return DOMDocument|DOMNodeList Parsed HTML as DOMDocument - */ - public static function parseFragment($text, $context = null, $builder = null) { - $tokenizer = new HTML5_Tokenizer($text, $builder); - $tokenizer->parseFragment($context); - return $tokenizer->save(); - } -} diff --git a/vendor/dompdf/dompdf/lib/html5lib/Tokenizer.php b/vendor/dompdf/dompdf/lib/html5lib/Tokenizer.php deleted file mode 100644 index 9f1f3ae..0000000 --- a/vendor/dompdf/dompdf/lib/html5lib/Tokenizer.php +++ /dev/null @@ -1,2470 +0,0 @@ - -Copyright 2008 Edward Z. Yang -Copyright 2009 Geoffrey Sneddon - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ - -// Some conventions: -// /* */ indicates verbatim text from the HTML 5 specification -// // indicates regular comments - -// all flags are in hyphenated form - -class HTML5_Tokenizer { - /** - * @var HTML5_InputStream - * - * Points to an InputStream object. - */ - protected $stream; - - /** - * @var HTML5_TreeBuilder - * - * Tree builder that the tokenizer emits token to. - */ - private $tree; - - /** - * @var int - * - * Current content model we are parsing as. - */ - protected $content_model; - - /** - * Current token that is being built, but not yet emitted. Also - * is the last token emitted, if applicable. - */ - protected $token; - - // These are constants describing the content model - const PCDATA = 0; - const RCDATA = 1; - const CDATA = 2; - const PLAINTEXT = 3; - - // These are constants describing tokens - // XXX should probably be moved somewhere else, probably the - // HTML5 class. - const DOCTYPE = 0; - const STARTTAG = 1; - const ENDTAG = 2; - const COMMENT = 3; - const CHARACTER = 4; - const SPACECHARACTER = 5; - const EOF = 6; - const PARSEERROR = 7; - - // These are constants representing bunches of characters. - const ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; - const UPPER_ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - const LOWER_ALPHA = 'abcdefghijklmnopqrstuvwxyz'; - const DIGIT = '0123456789'; - const HEX = '0123456789ABCDEFabcdef'; - const WHITESPACE = "\t\n\x0c "; - - /** - * @param $data | Data to parse - * @param HTML5_TreeBuilder|null $builder - */ - public function __construct($data, $builder = null) { - $this->stream = new HTML5_InputStream($data); - if (!$builder) { - $this->tree = new HTML5_TreeBuilder; - } else { - $this->tree = $builder; - } - $this->content_model = self::PCDATA; - } - - /** - * @param null $context - */ - public function parseFragment($context = null) { - $this->tree->setupContext($context); - if ($this->tree->content_model) { - $this->content_model = $this->tree->content_model; - $this->tree->content_model = null; - } - $this->parse(); - } - - // XXX maybe convert this into an iterator? regardless, this function - // and the save function should go into a Parser facade of some sort - /** - * Performs the actual parsing of the document. - */ - public function parse() { - // Current state - $state = 'data'; - // This is used to avoid having to have look-behind in the data state. - $lastFourChars = ''; - /** - * Escape flag as specified by the HTML5 specification: "used to - * control the behavior of the tokeniser. It is either true or - * false, and initially must be set to the false state." - */ - $escape = false; - //echo "\n\n"; - while($state !== null) { - - /*echo $state . ' '; - switch ($this->content_model) { - case self::PCDATA: echo 'PCDATA'; break; - case self::RCDATA: echo 'RCDATA'; break; - case self::CDATA: echo 'CDATA'; break; - case self::PLAINTEXT: echo 'PLAINTEXT'; break; - } - if ($escape) echo " escape"; - echo "\n";*/ - - switch($state) { - case 'data': - - /* Consume the next input character */ - $char = $this->stream->char(); - $lastFourChars .= $char; - if (strlen($lastFourChars) > 4) { - $lastFourChars = substr($lastFourChars, -4); - } - - // see below for meaning - $hyp_cond = - !$escape && - ( - $this->content_model === self::RCDATA || - $this->content_model === self::CDATA - ); - $amp_cond = - !$escape && - ( - $this->content_model === self::PCDATA || - $this->content_model === self::RCDATA - ); - $lt_cond = - $this->content_model === self::PCDATA || - ( - ( - $this->content_model === self::RCDATA || - $this->content_model === self::CDATA - ) && - !$escape - ); - $gt_cond = - $escape && - ( - $this->content_model === self::RCDATA || - $this->content_model === self::CDATA - ); - - if ($char === '&' && $amp_cond === true) { - /* U+0026 AMPERSAND (&) - When the content model flag is set to one of the PCDATA or RCDATA - states and the escape flag is false: switch to the - character reference data state. Otherwise: treat it as per - the "anything else" entry below. */ - $state = 'character reference data'; - - } elseif ( - $char === '-' && - $hyp_cond === true && - $lastFourChars === '' - ) { - /* If the content model flag is set to either the RCDATA state or - the CDATA state, and the escape flag is true, and the last three - characters in the input stream including this one are U+002D - HYPHEN-MINUS, U+002D HYPHEN-MINUS, U+003E GREATER-THAN SIGN ("-->"), - set the escape flag to false. */ - $escape = false; - - /* In any case, emit the input character as a character token. - Stay in the data state. */ - $this->emitToken([ - 'type' => self::CHARACTER, - 'data' => '>' - ]); - // We do the "any case" part as part of "anything else". - - } elseif ($char === false) { - /* EOF - Emit an end-of-file token. */ - $state = null; - $this->tree->emitToken([ - 'type' => self::EOF - ]); - - } elseif ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - // Directly after emitting a token you switch back to the "data - // state". At that point spaceCharacters are important so they are - // emitted separately. - $chars = $this->stream->charsWhile(self::WHITESPACE); - $this->emitToken([ - 'type' => self::SPACECHARACTER, - 'data' => $char . $chars - ]); - $lastFourChars .= $chars; - if (strlen($lastFourChars) > 4) { - $lastFourChars = substr($lastFourChars, -4); - } - } else { - /* Anything else - THIS IS AN OPTIMIZATION: Get as many character that - otherwise would also be treated as a character token and emit it - as a single character token. Stay in the data state. */ - - $mask = ''; - if ($hyp_cond === true) { - $mask .= '-'; - } - if ($amp_cond === true) { - $mask .= '&'; - } - if ($lt_cond === true) { - $mask .= '<'; - } - if ($gt_cond === true) { - $mask .= '>'; - } - - if ($mask === '') { - $chars = $this->stream->remainingChars(); - } else { - $chars = $this->stream->charsUntil($mask); - } - - $this->emitToken([ - 'type' => self::CHARACTER, - 'data' => $char . $chars - ]); - - $lastFourChars .= $chars; - if (strlen($lastFourChars) > 4) { - $lastFourChars = substr($lastFourChars, -4); - } - - $state = 'data'; - } - break; - - case 'character reference data': - /* (This cannot happen if the content model flag - is set to the CDATA state.) */ - - /* Attempt to consume a character reference, with no - additional allowed character. */ - $entity = $this->consumeCharacterReference(); - - /* If nothing is returned, emit a U+0026 AMPERSAND - character token. Otherwise, emit the character token that - was returned. */ - // This is all done when consuming the character reference. - $this->emitToken([ - 'type' => self::CHARACTER, - 'data' => $entity - ]); - - /* Finally, switch to the data state. */ - $state = 'data'; - break; - - case 'tag open': - $char = $this->stream->char(); - - switch ($this->content_model) { - case self::RCDATA: - case self::CDATA: - /* Consume the next input character. If it is a - U+002F SOLIDUS (/) character, switch to the close - tag open state. Otherwise, emit a U+003C LESS-THAN - SIGN character token and reconsume the current input - character in the data state. */ - // We consumed above. - - if ($char === '/') { - $state = 'close tag open'; - } else { - $this->emitToken([ - 'type' => self::CHARACTER, - 'data' => '<' - ]); - - $this->stream->unget(); - - $state = 'data'; - } - break; - - case self::PCDATA: - /* If the content model flag is set to the PCDATA state - Consume the next input character: */ - // We consumed above. - - if ($char === '!') { - /* U+0021 EXCLAMATION MARK (!) - Switch to the markup declaration open state. */ - $state = 'markup declaration open'; - - } elseif ($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the close tag open state. */ - $state = 'close tag open'; - - } elseif ('A' <= $char && $char <= 'Z') { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new start tag token, set its tag name to the lowercase - version of the input character (add 0x0020 to the character's code - point), then switch to the tag name state. (Don't emit the token - yet; further details will be filled in before it is emitted.) */ - $this->token = [ - 'name' => strtolower($char), - 'type' => self::STARTTAG, - 'attr' => [] - ]; - - $state = 'tag name'; - - } elseif ('a' <= $char && $char <= 'z') { - /* U+0061 LATIN SMALL LETTER A through to U+007A LATIN SMALL LETTER Z - Create a new start tag token, set its tag name to the input - character, then switch to the tag name state. (Don't emit - the token yet; further details will be filled in before it - is emitted.) */ - $this->token = [ - 'name' => $char, - 'type' => self::STARTTAG, - 'attr' => [] - ]; - - $state = 'tag name'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Emit a U+003C LESS-THAN SIGN character token and a - U+003E GREATER-THAN SIGN character token. Switch to the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-tag-name-but-got-right-bracket' - ]); - $this->emitToken([ - 'type' => self::CHARACTER, - 'data' => '<>' - ]); - - $state = 'data'; - - } elseif ($char === '?') { - /* U+003F QUESTION MARK (?) - Parse error. Switch to the bogus comment state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-tag-name-but-got-question-mark' - ]); - $this->token = [ - 'data' => '?', - 'type' => self::COMMENT - ]; - $state = 'bogus comment'; - - } else { - /* Anything else - Parse error. Emit a U+003C LESS-THAN SIGN character token and - reconsume the current input character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-tag-name' - ]); - $this->emitToken([ - 'type' => self::CHARACTER, - 'data' => '<' - ]); - - $state = 'data'; - $this->stream->unget(); - } - break; - } - break; - - case 'close tag open': - if ( - $this->content_model === self::RCDATA || - $this->content_model === self::CDATA - ) { - /* If the content model flag is set to the RCDATA or CDATA - states... */ - $name = strtolower($this->stream->charsWhile(self::ALPHA)); - $following = $this->stream->char(); - $this->stream->unget(); - if ( - !$this->token || - $this->token['name'] !== $name || - $this->token['name'] === $name && !in_array($following, ["\x09", "\x0A", "\x0C", "\x20", "\x3E", "\x2F", false]) - ) { - /* if no start tag token has ever been emitted by this instance - of the tokenizer (fragment case), or, if the next few - characters do not match the tag name of the last start tag - token emitted (compared in an ASCII case-insensitive manner), - or if they do but they are not immediately followed by one of - the following characters: - - * U+0009 CHARACTER TABULATION - * U+000A LINE FEED (LF) - * U+000C FORM FEED (FF) - * U+0020 SPACE - * U+003E GREATER-THAN SIGN (>) - * U+002F SOLIDUS (/) - * EOF - - ...then emit a U+003C LESS-THAN SIGN character token, a - U+002F SOLIDUS character token, and switch to the data - state to process the next input character. */ - // XXX: Probably ought to replace in_array with $following === x ||... - - // We also need to emit $name now we've consumed that, as we - // know it'll just be emitted as a character token. - $this->emitToken([ - 'type' => self::CHARACTER, - 'data' => 'token = [ - 'name' => $name, - 'type' => self::ENDTAG - ]; - - // Change to tag name state. - $state = 'tag name'; - } - } elseif ($this->content_model === self::PCDATA) { - /* Otherwise, if the content model flag is set to the PCDATA - state [...]: */ - $char = $this->stream->char(); - - if ('A' <= $char && $char <= 'Z') { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new end tag token, set its tag name to the lowercase version - of the input character (add 0x0020 to the character's code point), then - switch to the tag name state. (Don't emit the token yet; further details - will be filled in before it is emitted.) */ - $this->token = [ - 'name' => strtolower($char), - 'type' => self::ENDTAG - ]; - - $state = 'tag name'; - - } elseif ('a' <= $char && $char <= 'z') { - /* U+0061 LATIN SMALL LETTER A through to U+007A LATIN SMALL LETTER Z - Create a new end tag token, set its tag name to the - input character, then switch to the tag name state. - (Don't emit the token yet; further details will be - filled in before it is emitted.) */ - $this->token = [ - 'name' => $char, - 'type' => self::ENDTAG - ]; - - $state = 'tag name'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Switch to the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-closing-tag-but-got-right-bracket' - ]); - $state = 'data'; - - } elseif ($char === false) { - /* EOF - Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F - SOLIDUS character token. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-closing-tag-but-got-eof' - ]); - $this->emitToken([ - 'type' => self::CHARACTER, - 'data' => 'stream->unget(); - $state = 'data'; - - } else { - /* Parse error. Switch to the bogus comment state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-closing-tag-but-got-char' - ]); - $this->token = [ - 'data' => $char, - 'type' => self::COMMENT - ]; - $state = 'bogus comment'; - } - } - break; - - case 'tag name': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $state = 'before attribute name'; - - } elseif ($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the self-closing start tag state. */ - $state = 'self-closing start tag'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - - } elseif ('A' <= $char && $char <= 'Z') { - /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z - Append the lowercase version of the current input - character (add 0x0020 to the character's code point) to - the current tag token's tag name. Stay in the tag name state. */ - $chars = $this->stream->charsWhile(self::UPPER_ALPHA); - - $this->token['name'] .= strtolower($char . $chars); - $state = 'tag name'; - - } elseif ($char === false) { - /* EOF - Parse error. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-tag-name' - ]); - - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Append the current input character to the current tag token's tag name. - Stay in the tag name state. */ - $chars = $this->stream->charsUntil("\t\n\x0C />" . self::UPPER_ALPHA); - - $this->token['name'] .= $char . $chars; - $state = 'tag name'; - } - break; - - case 'before attribute name': - /* Consume the next input character: */ - $char = $this->stream->char(); - - // this conditional is optimized, check bottom - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $state = 'before attribute name'; - - } elseif ($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the self-closing start tag state. */ - $state = 'self-closing start tag'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - - } elseif ('A' <= $char && $char <= 'Z') { - /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z - Start a new attribute in the current tag token. Set that - attribute's name to the lowercase version of the current - input character (add 0x0020 to the character's code - point), and its value to the empty string. Switch to the - attribute name state.*/ - $this->token['attr'][] = [ - 'name' => strtolower($char), - 'value' => '' - ]; - - $state = 'attribute name'; - - } elseif ($char === false) { - /* EOF - Parse error. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-attribute-name-but-got-eof' - ]); - - $this->stream->unget(); - $state = 'data'; - - } else { - /* U+0022 QUOTATION MARK (") - U+0027 APOSTROPHE (') - U+003C LESS-THAN SIGN (<) - U+003D EQUALS SIGN (=) - Parse error. Treat it as per the "anything else" entry - below. */ - if ($char === '"' || $char === "'" || $char === '<' || $char === '=') { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'invalid-character-in-attribute-name' - ]); - } - - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = [ - 'name' => $char, - 'value' => '' - ]; - - $state = 'attribute name'; - } - break; - - case 'attribute name': - // Consume the next input character: - $char = $this->stream->char(); - - // this conditional is optimized, check bottom - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the after attribute name state. */ - $state = 'after attribute name'; - - } elseif ($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the self-closing start tag state. */ - $state = 'self-closing start tag'; - - } elseif ($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $state = 'before attribute value'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - - } elseif ('A' <= $char && $char <= 'Z') { - /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z - Append the lowercase version of the current input - character (add 0x0020 to the character's code point) to - the current attribute's name. Stay in the attribute name - state. */ - $chars = $this->stream->charsWhile(self::UPPER_ALPHA); - - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['name'] .= strtolower($char . $chars); - - $state = 'attribute name'; - - } elseif ($char === false) { - /* EOF - Parse error. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-attribute-name' - ]); - - $this->stream->unget(); - $state = 'data'; - - } else { - /* U+0022 QUOTATION MARK (") - U+0027 APOSTROPHE (') - U+003C LESS-THAN SIGN (<) - Parse error. Treat it as per the "anything else" - entry below. */ - if ($char === '"' || $char === "'" || $char === '<') { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'invalid-character-in-attribute-name' - ]); - } - - /* Anything else - Append the current input character to the current attribute's name. - Stay in the attribute name state. */ - $chars = $this->stream->charsUntil("\t\n\x0C /=>\"'" . self::UPPER_ALPHA); - - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['name'] .= $char . $chars; - - $state = 'attribute name'; - } - - /* When the user agent leaves the attribute name state - (and before emitting the tag token, if appropriate), the - complete attribute's name must be compared to the other - attributes on the same token; if there is already an - attribute on the token with the exact same name, then this - is a parse error and the new attribute must be dropped, along - with the value that gets associated with it (if any). */ - // this might be implemented in the emitToken method - break; - - case 'after attribute name': - // Consume the next input character: - $char = $this->stream->char(); - - // this is an optimized conditional, check the bottom - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the after attribute name state. */ - $state = 'after attribute name'; - - } elseif ($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the self-closing start tag state. */ - $state = 'self-closing start tag'; - - } elseif ($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $state = 'before attribute value'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - - } elseif ('A' <= $char && $char <= 'Z') { - /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z - Start a new attribute in the current tag token. Set that - attribute's name to the lowercase version of the current - input character (add 0x0020 to the character's code - point), and its value to the empty string. Switch to the - attribute name state. */ - $this->token['attr'][] = [ - 'name' => strtolower($char), - 'value' => '' - ]; - - $state = 'attribute name'; - - } elseif ($char === false) { - /* EOF - Parse error. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-end-of-tag-but-got-eof' - ]); - - $this->stream->unget(); - $state = 'data'; - - } else { - /* U+0022 QUOTATION MARK (") - U+0027 APOSTROPHE (') - U+003C LESS-THAN SIGN(<) - Parse error. Treat it as per the "anything else" - entry below. */ - if ($char === '"' || $char === "'" || $char === "<") { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'invalid-character-after-attribute-name' - ]); - } - - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = [ - 'name' => $char, - 'value' => '' - ]; - - $state = 'attribute name'; - } - break; - - case 'before attribute value': - // Consume the next input character: - $char = $this->stream->char(); - - // this is an optimized conditional - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute value state. */ - $state = 'before attribute value'; - - } elseif ($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the attribute value (double-quoted) state. */ - $state = 'attribute value (double-quoted)'; - - } elseif ($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the attribute value (unquoted) state and reconsume - this input character. */ - $this->stream->unget(); - $state = 'attribute value (unquoted)'; - - } elseif ($char === '\'') { - /* U+0027 APOSTROPHE (') - Switch to the attribute value (single-quoted) state. */ - $state = 'attribute value (single-quoted)'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Emit the current tag token. Switch to the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-attribute-value-but-got-right-bracket' - ]); - $this->emitToken($this->token); - $state = 'data'; - - } elseif ($char === false) { - /* EOF - Parse error. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-attribute-value-but-got-eof' - ]); - $this->stream->unget(); - $state = 'data'; - - } else { - /* U+003D EQUALS SIGN (=) - * U+003C LESS-THAN SIGN (<) - Parse error. Treat it as per the "anything else" entry below. */ - if ($char === '=' || $char === '<') { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'equals-in-unquoted-attribute-value' - ]); - } - - /* Anything else - Append the current input character to the current attribute's value. - Switch to the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $state = 'attribute value (unquoted)'; - } - break; - - case 'attribute value (double-quoted)': - // Consume the next input character: - $char = $this->stream->char(); - - if ($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the after attribute value (quoted) state. */ - $state = 'after attribute value (quoted)'; - - } elseif ($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the character reference in attribute value - state, with the additional allowed character - being U+0022 QUOTATION MARK ("). */ - $this->characterReferenceInAttributeValue('"'); - - } elseif ($char === false) { - /* EOF - Parse error. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-attribute-value-double-quote' - ]); - - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (double-quoted) state. */ - $chars = $this->stream->charsUntil('"&'); - - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char . $chars; - - $state = 'attribute value (double-quoted)'; - } - break; - - case 'attribute value (single-quoted)': - // Consume the next input character: - $char = $this->stream->char(); - - if ($char === "'") { - /* U+0022 QUOTATION MARK (') - Switch to the after attribute value state. */ - $state = 'after attribute value (quoted)'; - - } elseif ($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->characterReferenceInAttributeValue("'"); - - } elseif ($char === false) { - /* EOF - Parse error. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-attribute-value-single-quote' - ]); - - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (single-quoted) state. */ - $chars = $this->stream->charsUntil("'&"); - - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char . $chars; - - $state = 'attribute value (single-quoted)'; - } - break; - - case 'attribute value (unquoted)': - // Consume the next input character: - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $state = 'before attribute name'; - - } elseif ($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state, with the - additional allowed character being U+003E - GREATER-THAN SIGN (>). */ - $this->characterReferenceInAttributeValue('>'); - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - - } elseif ($char === false) { - /* EOF - Parse error. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-attribute-value-no-quotes' - ]); - $this->stream->unget(); - $state = 'data'; - - } else { - /* U+0022 QUOTATION MARK (") - U+0027 APOSTROPHE (') - U+003C LESS-THAN SIGN (<) - U+003D EQUALS SIGN (=) - Parse error. Treat it as per the "anything else" - entry below. */ - if ($char === '"' || $char === "'" || $char === '=' || $char == '<') { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-character-in-unquoted-attribute-value' - ]); - } - - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (unquoted) state. */ - $chars = $this->stream->charsUntil("\t\n\x0c &>\"'="); - - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char . $chars; - - $state = 'attribute value (unquoted)'; - } - break; - - case 'after attribute value (quoted)': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $state = 'before attribute name'; - - } elseif ($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the self-closing start tag state. */ - $state = 'self-closing start tag'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - - } elseif ($char === false) { - /* EOF - Parse error. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-EOF-after-attribute-value' - ]); - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Parse error. Reconsume the character in the before attribute - name state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-character-after-attribute-value' - ]); - $this->stream->unget(); - $state = 'before attribute name'; - } - break; - - case 'self-closing start tag': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Set the self-closing flag of the current tag token. - Emit the current tag token. Switch to the data state. */ - // not sure if this is the name we want - $this->token['self-closing'] = true; - $this->emitToken($this->token); - $state = 'data'; - - } elseif ($char === false) { - /* EOF - Parse error. Reconsume the EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-eof-after-self-closing' - ]); - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Parse error. Reconsume the character in the before attribute name state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-character-after-self-closing' - ]); - $this->stream->unget(); - $state = 'before attribute name'; - } - break; - - case 'bogus comment': - /* (This can only happen if the content model flag is set to the PCDATA state.) */ - /* Consume every character up to the first U+003E GREATER-THAN SIGN - character (>) or the end of the file (EOF), whichever comes first. Emit - a comment token whose data is the concatenation of all the characters - starting from and including the character that caused the state machine - to switch into the bogus comment state, up to and including the last - consumed character before the U+003E character, if any, or up to the - end of the file otherwise. (If the comment was started by the end of - the file (EOF), the token is empty.) */ - $this->token['data'] .= (string) $this->stream->charsUntil('>'); - $this->stream->char(); - - $this->emitToken($this->token); - - /* Switch to the data state. */ - $state = 'data'; - break; - - case 'markup declaration open': - // Consume for below - $hyphens = $this->stream->charsWhile('-', 2); - if ($hyphens === '-') { - $this->stream->unget(); - } - if ($hyphens !== '--') { - $alpha = $this->stream->charsWhile(self::ALPHA, 7); - } - - /* If the next two characters are both U+002D HYPHEN-MINUS (-) - characters, consume those two characters, create a comment token whose - data is the empty string, and switch to the comment state. */ - if ($hyphens === '--') { - $state = 'comment start'; - $this->token = [ - 'data' => '', - 'type' => self::COMMENT - ]; - - /* Otherwise if the next seven characters are a case-insensitive match - for the word "DOCTYPE", then consume those characters and switch to the - DOCTYPE state. */ - } elseif (strtoupper($alpha) === 'DOCTYPE') { - $state = 'DOCTYPE'; - - // XXX not implemented - /* Otherwise, if the insertion mode is "in foreign content" - and the current node is not an element in the HTML namespace - and the next seven characters are an ASCII case-sensitive - match for the string "[CDATA[" (the five uppercase letters - "CDATA" with a U+005B LEFT SQUARE BRACKET character before - and after), then consume those characters and switch to the - CDATA section state (which is unrelated to the content model - flag's CDATA state). */ - - /* Otherwise, is is a parse error. Switch to the bogus comment state. - The next character that is consumed, if any, is the first character - that will be in the comment. */ - } else { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-dashes-or-doctype' - ]); - $this->token = [ - 'data' => (string) $alpha, - 'type' => self::COMMENT - ]; - $state = 'bogus comment'; - } - break; - - case 'comment start': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === '-') { - /* U+002D HYPHEN-MINUS (-) - Switch to the comment start dash state. */ - $state = 'comment start dash'; - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Emit the comment token. Switch to the - data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'incorrect-comment' - ]); - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === false) { - /* EOF - Parse error. Emit the comment token. Reconsume the - EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-comment' - ]); - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - /* Anything else - Append the input character to the comment token's - data. Switch to the comment state. */ - $this->token['data'] .= $char; - $state = 'comment'; - } - break; - - case 'comment start dash': - /* Consume the next input character: */ - $char = $this->stream->char(); - if ($char === '-') { - /* U+002D HYPHEN-MINUS (-) - Switch to the comment end state */ - $state = 'comment end'; - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Emit the comment token. Switch to the - data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'incorrect-comment' - ]); - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === false) { - /* Parse error. Emit the comment token. Reconsume the - EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-comment' - ]); - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - $this->token['data'] .= '-' . $char; - $state = 'comment'; - } - break; - - case 'comment': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === '-') { - /* U+002D HYPHEN-MINUS (-) - Switch to the comment end dash state */ - $state = 'comment end dash'; - - } elseif ($char === false) { - /* EOF - Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-comment' - ]); - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Append the input character to the comment token's data. Stay in - the comment state. */ - $chars = $this->stream->charsUntil('-'); - - $this->token['data'] .= $char . $chars; - } - break; - - case 'comment end dash': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === '-') { - /* U+002D HYPHEN-MINUS (-) - Switch to the comment end state */ - $state = 'comment end'; - - } elseif ($char === false) { - /* EOF - Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-comment-end-dash' - ]); - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Append a U+002D HYPHEN-MINUS (-) character and the input - character to the comment token's data. Switch to the comment state. */ - $this->token['data'] .= '-'.$char; - $state = 'comment'; - } - break; - - case 'comment end': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the comment token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - - } elseif ($char === '-') { - /* U+002D HYPHEN-MINUS (-) - Parse error. Append a U+002D HYPHEN-MINUS (-) character - to the comment token's data. Stay in the comment end - state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-dash-after-double-dash-in-comment' - ]); - $this->token['data'] .= '-'; - - } elseif ($char === "\t" || $char === "\n" || $char === "\x0a" || $char === ' ') { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-space-after-double-dash-in-comment' - ]); - $this->token['data'] .= '--' . $char; - $state = 'comment end space'; - - } elseif ($char === '!') { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-bang-after-double-dash-in-comment' - ]); - $state = 'comment end bang'; - - } elseif ($char === false) { - /* EOF - Parse error. Emit the comment token. Reconsume the - EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-comment-double-dash' - ]); - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Parse error. Append two U+002D HYPHEN-MINUS (-) - characters and the input character to the comment token's - data. Switch to the comment state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-char-in-comment' - ]); - $this->token['data'] .= '--'.$char; - $state = 'comment'; - } - break; - - case 'comment end bang': - $char = $this->stream->char(); - if ($char === '>') { - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === "-") { - $this->token['data'] .= '--!'; - $state = 'comment end dash'; - } elseif ($char === false) { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-comment-end-bang' - ]); - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - $this->token['data'] .= '--!' . $char; - $state = 'comment'; - } - break; - - case 'comment end space': - $char = $this->stream->char(); - if ($char === '>') { - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === '-') { - $state = 'comment end dash'; - } elseif ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - $this->token['data'] .= $char; - } elseif ($char === false) { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-eof-in-comment-end-space', - ]); - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - $this->token['data'] .= $char; - $state = 'comment'; - } - break; - - case 'DOCTYPE': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before DOCTYPE name state. */ - $state = 'before DOCTYPE name'; - - } elseif ($char === false) { - /* EOF - Parse error. Create a new DOCTYPE token. Set its - force-quirks flag to on. Emit the token. Reconsume the - EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'need-space-after-doctype-but-got-eof' - ]); - $this->emitToken([ - 'name' => '', - 'type' => self::DOCTYPE, - 'force-quirks' => true, - 'error' => true - ]); - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Parse error. Reconsume the current character in the - before DOCTYPE name state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'need-space-after-doctype' - ]); - $this->stream->unget(); - $state = 'before DOCTYPE name'; - } - break; - - case 'before DOCTYPE name': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before DOCTYPE name state. */ - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Create a new DOCTYPE token. Set its - force-quirks flag to on. Emit the token. Switch to the - data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-doctype-name-but-got-right-bracket' - ]); - $this->emitToken([ - 'name' => '', - 'type' => self::DOCTYPE, - 'force-quirks' => true, - 'error' => true - ]); - - $state = 'data'; - - } elseif ('A' <= $char && $char <= 'Z') { - /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z - Create a new DOCTYPE token. Set the token's name to the - lowercase version of the input character (add 0x0020 to - the character's code point). Switch to the DOCTYPE name - state. */ - $this->token = [ - 'name' => strtolower($char), - 'type' => self::DOCTYPE, - 'error' => true - ]; - - $state = 'DOCTYPE name'; - - } elseif ($char === false) { - /* EOF - Parse error. Create a new DOCTYPE token. Set its - force-quirks flag to on. Emit the token. Reconsume the - EOF character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-doctype-name-but-got-eof' - ]); - $this->emitToken([ - 'name' => '', - 'type' => self::DOCTYPE, - 'force-quirks' => true, - 'error' => true - ]); - - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Create a new DOCTYPE token. Set the token's name to the - current input character. Switch to the DOCTYPE name state. */ - $this->token = [ - 'name' => $char, - 'type' => self::DOCTYPE, - 'error' => true - ]; - - $state = 'DOCTYPE name'; - } - break; - - case 'DOCTYPE name': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the after DOCTYPE name state. */ - $state = 'after DOCTYPE name'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current DOCTYPE token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - - } elseif ('A' <= $char && $char <= 'Z') { - /* U+0041 LATIN CAPITAL LETTER A through to U+005A LATIN CAPITAL LETTER Z - Append the lowercase version of the input character - (add 0x0020 to the character's code point) to the current - DOCTYPE token's name. Stay in the DOCTYPE name state. */ - $this->token['name'] .= strtolower($char); - - } elseif ($char === false) { - /* EOF - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Reconsume the EOF - character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-doctype-name' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Append the current input character to the current - DOCTYPE token's name. Stay in the DOCTYPE name state. */ - $this->token['name'] .= $char; - } - - // XXX this is probably some sort of quirks mode designation, - // check tree-builder to be sure. In general 'error' needs - // to be specc'ified, this probably means removing it at the end - $this->token['error'] = ($this->token['name'] === 'HTML') - ? false - : true; - break; - - case 'after DOCTYPE name': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the after DOCTYPE name state. */ - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current DOCTYPE token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - - } elseif ($char === false) { - /* EOF - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Reconsume the EOF - character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else */ - - $nextSix = strtoupper($char . $this->stream->charsWhile(self::ALPHA, 5)); - if ($nextSix === 'PUBLIC') { - /* If the next six characters are an ASCII - case-insensitive match for the word "PUBLIC", then - consume those characters and switch to the before - DOCTYPE public identifier state. */ - $state = 'before DOCTYPE public identifier'; - - } elseif ($nextSix === 'SYSTEM') { - /* Otherwise, if the next six characters are an ASCII - case-insensitive match for the word "SYSTEM", then - consume those characters and switch to the before - DOCTYPE system identifier state. */ - $state = 'before DOCTYPE system identifier'; - - } else { - /* Otherwise, this is the parse error. Set the DOCTYPE - token's force-quirks flag to on. Switch to the bogus - DOCTYPE state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-space-or-right-bracket-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->token['error'] = true; - $state = 'bogus DOCTYPE'; - } - } - break; - - case 'before DOCTYPE public identifier': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before DOCTYPE public identifier state. */ - } elseif ($char === '"') { - /* U+0022 QUOTATION MARK (") - Set the DOCTYPE token's public identifier to the empty - string (not missing), then switch to the DOCTYPE public - identifier (double-quoted) state. */ - $this->token['public'] = ''; - $state = 'DOCTYPE public identifier (double-quoted)'; - } elseif ($char === "'") { - /* U+0027 APOSTROPHE (') - Set the DOCTYPE token's public identifier to the empty - string (not missing), then switch to the DOCTYPE public - identifier (single-quoted) state. */ - $this->token['public'] = ''; - $state = 'DOCTYPE public identifier (single-quoted)'; - } elseif ($char === '>') { - /* Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Switch to the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-end-of-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === false) { - /* Parse error. Set the DOCTYPE token's force-quirks - flag to on. Emit that DOCTYPE token. Reconsume the EOF - character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - /* Parse error. Set the DOCTYPE token's force-quirks flag - to on. Switch to the bogus DOCTYPE state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-char-in-doctype' - ]); - $this->token['force-quirks'] = true; - $state = 'bogus DOCTYPE'; - } - break; - - case 'DOCTYPE public identifier (double-quoted)': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the after DOCTYPE public identifier state. */ - $state = 'after DOCTYPE public identifier'; - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Switch to the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-end-of-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === false) { - /* EOF - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Reconsume the EOF - character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - /* Anything else - Append the current input character to the current - DOCTYPE token's public identifier. Stay in the DOCTYPE - public identifier (double-quoted) state. */ - $this->token['public'] .= $char; - } - break; - - case 'DOCTYPE public identifier (single-quoted)': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "'") { - /* U+0027 APOSTROPHE (') - Switch to the after DOCTYPE public identifier state. */ - $state = 'after DOCTYPE public identifier'; - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Switch to the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-end-of-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === false) { - /* EOF - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Reconsume the EOF - character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - /* Anything else - Append the current input character to the current - DOCTYPE token's public identifier. Stay in the DOCTYPE - public identifier (double-quoted) state. */ - $this->token['public'] .= $char; - } - break; - - case 'after DOCTYPE public identifier': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the after DOCTYPE public identifier state. */ - } elseif ($char === '"') { - /* U+0022 QUOTATION MARK (") - Set the DOCTYPE token's system identifier to the - empty string (not missing), then switch to the DOCTYPE - system identifier (double-quoted) state. */ - $this->token['system'] = ''; - $state = 'DOCTYPE system identifier (double-quoted)'; - } elseif ($char === "'") { - /* U+0027 APOSTROPHE (') - Set the DOCTYPE token's system identifier to the - empty string (not missing), then switch to the DOCTYPE - system identifier (single-quoted) state. */ - $this->token['system'] = ''; - $state = 'DOCTYPE system identifier (single-quoted)'; - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current DOCTYPE token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === false) { - /* Parse error. Set the DOCTYPE token's force-quirks - flag to on. Emit that DOCTYPE token. Reconsume the EOF - character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - /* Anything else - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Switch to the bogus DOCTYPE state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-char-in-doctype' - ]); - $this->token['force-quirks'] = true; - $state = 'bogus DOCTYPE'; - } - break; - - case 'before DOCTYPE system identifier': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before DOCTYPE system identifier state. */ - } elseif ($char === '"') { - /* U+0022 QUOTATION MARK (") - Set the DOCTYPE token's system identifier to the empty - string (not missing), then switch to the DOCTYPE system - identifier (double-quoted) state. */ - $this->token['system'] = ''; - $state = 'DOCTYPE system identifier (double-quoted)'; - } elseif ($char === "'") { - /* U+0027 APOSTROPHE (') - Set the DOCTYPE token's system identifier to the empty - string (not missing), then switch to the DOCTYPE system - identifier (single-quoted) state. */ - $this->token['system'] = ''; - $state = 'DOCTYPE system identifier (single-quoted)'; - } elseif ($char === '>') { - /* Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Switch to the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-char-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === false) { - /* Parse error. Set the DOCTYPE token's force-quirks - flag to on. Emit that DOCTYPE token. Reconsume the EOF - character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - /* Parse error. Set the DOCTYPE token's force-quirks flag - to on. Switch to the bogus DOCTYPE state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-char-in-doctype' - ]); - $this->token['force-quirks'] = true; - $state = 'bogus DOCTYPE'; - } - break; - - case 'DOCTYPE system identifier (double-quoted)': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the after DOCTYPE system identifier state. */ - $state = 'after DOCTYPE system identifier'; - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Switch to the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-end-of-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === false) { - /* EOF - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Reconsume the EOF - character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - /* Anything else - Append the current input character to the current - DOCTYPE token's system identifier. Stay in the DOCTYPE - system identifier (double-quoted) state. */ - $this->token['system'] .= $char; - } - break; - - case 'DOCTYPE system identifier (single-quoted)': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "'") { - /* U+0027 APOSTROPHE (') - Switch to the after DOCTYPE system identifier state. */ - $state = 'after DOCTYPE system identifier'; - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Switch to the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-end-of-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === false) { - /* EOF - Parse error. Set the DOCTYPE token's force-quirks flag - to on. Emit that DOCTYPE token. Reconsume the EOF - character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - /* Anything else - Append the current input character to the current - DOCTYPE token's system identifier. Stay in the DOCTYPE - system identifier (double-quoted) state. */ - $this->token['system'] .= $char; - } - break; - - case 'after DOCTYPE system identifier': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === "\t" || $char === "\n" || $char === "\x0c" || $char === ' ') { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the after DOCTYPE system identifier state. */ - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current DOCTYPE token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - } elseif ($char === false) { - /* Parse error. Set the DOCTYPE token's force-quirks - flag to on. Emit that DOCTYPE token. Reconsume the EOF - character in the data state. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'eof-in-doctype' - ]); - $this->token['force-quirks'] = true; - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - } else { - /* Anything else - Parse error. Switch to the bogus DOCTYPE state. - (This does not set the DOCTYPE token's force-quirks - flag to on.) */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'unexpected-char-in-doctype' - ]); - $state = 'bogus DOCTYPE'; - } - break; - - case 'bogus DOCTYPE': - /* Consume the next input character: */ - $char = $this->stream->char(); - - if ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the DOCTYPE token. Switch to the data state. */ - $this->emitToken($this->token); - $state = 'data'; - - } elseif ($char === false) { - /* EOF - Emit the DOCTYPE token. Reconsume the EOF character in - the data state. */ - $this->emitToken($this->token); - $this->stream->unget(); - $state = 'data'; - - } else { - /* Anything else - Stay in the bogus DOCTYPE state. */ - } - break; - - // case 'cdataSection': - } - } - } - - /** - * Returns a serialized representation of the tree. - * - * @return DOMDocument|DOMNodeList - */ - public function save() { - return $this->tree->save(); - } - - /** - * @return HTML5_TreeBuilder The tree - */ - public function getTree() - { - return $this->tree; - } - - - /** - * Returns the input stream. - * - * @return HTML5_InputStream - */ - public function stream() { - return $this->stream; - } - - /** - * @param bool $allowed - * @param bool $inattr - * @return string - */ - private function consumeCharacterReference($allowed = false, $inattr = false) { - // This goes quite far against spec, and is far closer to the Python - // impl., mainly because we don't do the large unconsuming the spec - // requires. - - // All consumed characters. - $chars = $this->stream->char(); - - /* This section defines how to consume a character - reference. This definition is used when parsing character - references in text and in attributes. - - The behavior depends on the identity of the next character - (the one immediately after the U+0026 AMPERSAND character): */ - - if ( - $chars[0] === "\x09" || - $chars[0] === "\x0A" || - $chars[0] === "\x0C" || - $chars[0] === "\x20" || - $chars[0] === '<' || - $chars[0] === '&' || - $chars === false || - $chars[0] === $allowed - ) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000C FORM FEED (FF) - U+0020 SPACE - U+003C LESS-THAN SIGN - U+0026 AMPERSAND - EOF - The additional allowed character, if there is one - Not a character reference. No characters are consumed, - and nothing is returned. (This is not an error, either.) */ - // We already consumed, so unconsume. - $this->stream->unget(); - return '&'; - } elseif ($chars[0] === '#') { - /* Consume the U+0023 NUMBER SIGN. */ - // Um, yeah, we already did that. - /* The behavior further depends on the character after - the U+0023 NUMBER SIGN: */ - $chars .= $this->stream->char(); - if (isset($chars[1]) && ($chars[1] === 'x' || $chars[1] === 'X')) { - /* U+0078 LATIN SMALL LETTER X - U+0058 LATIN CAPITAL LETTER X */ - /* Consume the X. */ - // Um, yeah, we already did that. - /* Follow the steps below, but using the range of - characters U+0030 DIGIT ZERO through to U+0039 DIGIT - NINE, U+0061 LATIN SMALL LETTER A through to U+0066 - LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER - A, through to U+0046 LATIN CAPITAL LETTER F (in other - words, 0123456789, ABCDEF, abcdef). */ - $char_class = self::HEX; - /* When it comes to interpreting the - number, interpret it as a hexadecimal number. */ - $hex = true; - } else { - /* Anything else */ - // Unconsume because we shouldn't have consumed this. - $chars = $chars[0]; - $this->stream->unget(); - /* Follow the steps below, but using the range of - characters U+0030 DIGIT ZERO through to U+0039 DIGIT - NINE (i.e. just 0123456789). */ - $char_class = self::DIGIT; - /* When it comes to interpreting the number, - interpret it as a decimal number. */ - $hex = false; - } - - /* Consume as many characters as match the range of characters given above. */ - $consumed = $this->stream->charsWhile($char_class); - if ($consumed === '' || $consumed === false) { - /* If no characters match the range, then don't consume - any characters (and unconsume the U+0023 NUMBER SIGN - character and, if appropriate, the X character). This - is a parse error; nothing is returned. */ - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-numeric-entity' - ]); - return '&' . $chars; - } else { - /* Otherwise, if the next character is a U+003B SEMICOLON, - consume that too. If it isn't, there is a parse error. */ - if ($this->stream->char() !== ';') { - $this->stream->unget(); - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'numeric-entity-without-semicolon' - ]); - } - - /* If one or more characters match the range, then take - them all and interpret the string of characters as a number - (either hexadecimal or decimal as appropriate). */ - $codepoint = $hex ? hexdec($consumed) : (int) $consumed; - - /* If that number is one of the numbers in the first column - of the following table, then this is a parse error. Find the - row with that number in the first column, and return a - character token for the Unicode character given in the - second column of that row. */ - $new_codepoint = HTML5_Data::getRealCodepoint($codepoint); - if ($new_codepoint) { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'illegal-windows-1252-entity' - ]); - return HTML5_Data::utf8chr($new_codepoint); - } else { - /* Otherwise, if the number is greater than 0x10FFFF, then - * this is a parse error. Return a U+FFFD REPLACEMENT - * CHARACTER. */ - if ($codepoint > 0x10FFFF) { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'overlong-character-entity' // XXX probably not correct - ]); - return "\xEF\xBF\xBD"; - } - /* Otherwise, return a character token for the Unicode - * character whose code point is that number. If the - * number is in the range 0x0001 to 0x0008, 0x000E to - * 0x001F, 0x007F to 0x009F, 0xD800 to 0xDFFF, 0xFDD0 to - * 0xFDEF, or is one of 0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, - * 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, 0x4FFFE, - * 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, - * 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, - * 0xAFFFF, 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, - * 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, 0x10FFFE, - * or 0x10FFFF, then this is a parse error. */ - // && has higher precedence than || - if ( - $codepoint >= 0x0000 && $codepoint <= 0x0008 || - $codepoint === 0x000B || - $codepoint >= 0x000E && $codepoint <= 0x001F || - $codepoint >= 0x007F && $codepoint <= 0x009F || - $codepoint >= 0xD800 && $codepoint <= 0xDFFF || - $codepoint >= 0xFDD0 && $codepoint <= 0xFDEF || - ($codepoint & 0xFFFE) === 0xFFFE || - $codepoint == 0x10FFFF || $codepoint == 0x10FFFE - ) { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'illegal-codepoint-for-numeric-entity' - ]); - } - return HTML5_Data::utf8chr($codepoint); - } - } - } else { - /* Anything else */ - - /* Consume the maximum number of characters possible, - with the consumed characters matching one of the - identifiers in the first column of the named character - references table (in a case-sensitive manner). */ - // What we actually do here is consume as much as we can while it - // matches the start of one of the identifiers in the first column. - - $refs = HTML5_Data::getNamedCharacterReferences(); - - // Get the longest string which is the start of an identifier - // ($chars) as well as the longest identifier which matches ($id) - // and its codepoint ($codepoint). - $codepoint = false; - $char = $chars; - while ($char !== false && isset($refs[$char])) { - $refs = $refs[$char]; - if (isset($refs['codepoint'])) { - $id = $chars; - $codepoint = $refs['codepoint']; - } - $chars .= $char = $this->stream->char(); - } - - // Unconsume the one character we just took which caused the while - // statement to fail. This could be anything and could cause state - // changes (as if it matches the while loop it must be - // alphanumeric so we can just concat it to whatever we get later). - $this->stream->unget(); - if ($char !== false) { - $chars = substr($chars, 0, -1); - } - - /* If no match can be made, then this is a parse error. - No characters are consumed, and nothing is returned. */ - if (!$codepoint) { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'expected-named-entity' - ]); - return '&' . $chars; - } - - /* If the last character matched is not a U+003B SEMICOLON - (;), there is a parse error. */ - $semicolon = true; - if (substr($id, -1) !== ';') { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'named-entity-without-semicolon' - ]); - $semicolon = false; - } - - /* If the character reference is being consumed as part of - an attribute, and the last character matched is not a - U+003B SEMICOLON (;), and the next character is in the - range U+0030 DIGIT ZERO to U+0039 DIGIT NINE, U+0041 - LATIN CAPITAL LETTER A to U+005A LATIN CAPITAL LETTER Z, - or U+0061 LATIN SMALL LETTER A to U+007A LATIN SMALL LETTER Z, - then, for historical reasons, all the characters that were - matched after the U+0026 AMPERSAND (&) must be unconsumed, - and nothing is returned. */ - if ($inattr && !$semicolon) { - // The next character is either the next character in $chars or in the stream. - if (strlen($chars) > strlen($id)) { - $next = substr($chars, strlen($id), 1); - } else { - $next = $this->stream->char(); - $this->stream->unget(); - } - if ( - '0' <= $next && $next <= '9' || - 'A' <= $next && $next <= 'Z' || - 'a' <= $next && $next <= 'z' - ) { - return '&' . $chars; - } - } - - /* Otherwise, return a character token for the character - corresponding to the character reference name (as given - by the second column of the named character references table). */ - return HTML5_Data::utf8chr($codepoint) . substr($chars, strlen($id)); - } - } - - /** - * @param bool $allowed - */ - private function characterReferenceInAttributeValue($allowed = false) { - /* Attempt to consume a character reference. */ - $entity = $this->consumeCharacterReference($allowed, true); - - /* If nothing is returned, append a U+0026 AMPERSAND - character to the current attribute's value. - - Otherwise, append the returned character token to the - current attribute's value. */ - $char = (!$entity) - ? '&' - : $entity; - - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - /* Finally, switch back to the attribute value state that you - were in when were switched into this state. */ - } - - /** - * Emits a token, passing it on to the tree builder. - * - * @param $token - * @param bool $checkStream - * @param bool $dry - */ - protected function emitToken($token, $checkStream = true, $dry = false) { - if ($checkStream === true) { - // Emit errors from input stream. - while ($this->stream->errors) { - $this->emitToken(array_shift($this->stream->errors), false); - } - } - if ($token['type'] === self::ENDTAG && !empty($token['attr'])) { - for ($i = 0; $i < count($token['attr']); $i++) { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'attributes-in-end-tag' - ]); - } - } - if ($token['type'] === self::ENDTAG && !empty($token['self-closing'])) { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'self-closing-flag-on-end-tag', - ]); - } - if ($token['type'] === self::STARTTAG) { - // This could be changed to actually pass the tree-builder a hash - $hash = []; - foreach ($token['attr'] as $keypair) { - if (isset($hash[$keypair['name']])) { - $this->emitToken([ - 'type' => self::PARSEERROR, - 'data' => 'duplicate-attribute', - ]); - } else { - $hash[$keypair['name']] = $keypair['value']; - } - } - } - - if ($dry === false) { - // the current structure of attributes is not a terribly good one - $this->tree->emitToken($token); - } - - if ($dry === false && is_int($this->tree->content_model)) { - $this->content_model = $this->tree->content_model; - $this->tree->content_model = null; - - } elseif ($token['type'] === self::ENDTAG) { - $this->content_model = self::PCDATA; - } - } -} - diff --git a/vendor/dompdf/dompdf/lib/html5lib/TreeBuilder.php b/vendor/dompdf/dompdf/lib/html5lib/TreeBuilder.php deleted file mode 100644 index 993eabd..0000000 --- a/vendor/dompdf/dompdf/lib/html5lib/TreeBuilder.php +++ /dev/null @@ -1,3989 +0,0 @@ - -Copyright 2009 Edward Z. Yang - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ - -// Tags for FIX ME!!!: (in order of priority) -// XXX - should be fixed NAO! -// XERROR - with regards to parse errors -// XSCRIPT - with regards to scripting mode -// XENCODING - with regards to encoding (for reparsing tests) -// XDOM - DOM specific code (tagName is explicitly not marked). -// this is not (yet) in helper functions. - -class HTML5_TreeBuilder { - public $stack = []; - public $content_model; - - private $mode; - private $original_mode; - private $secondary_mode; - private $dom; - // Whether or not normal insertion of nodes should actually foster - // parent (used in one case in spec) - private $foster_parent = false; - private $a_formatting = []; - - private $head_pointer = null; - private $form_pointer = null; - - private $flag_frameset_ok = true; - private $flag_force_quirks = false; - private $ignored = false; - private $quirks_mode = null; - // this gets to 2 when we want to ignore the next lf character, and - // is decrement at the beginning of each processed token (this way, - // code can check for (bool)$ignore_lf_token, but it phases out - // appropriately) - private $ignore_lf_token = 0; - private $fragment = false; - private $root; - - private $scoping = ['applet','button','caption','html','marquee','object','table','td','th', 'svg:foreignObject']; - private $formatting = ['a','b','big','code','em','font','i','nobr','s','small','strike','strong','tt','u']; - // dl and ds are speculative - private $special = ['address','area','article','aside','base','basefont','bgsound', - 'blockquote','body','br','center','col','colgroup','command','dc','dd','details','dir','div','dl','ds', - 'dt','embed','fieldset','figure','footer','form','frame','frameset','h1','h2','h3','h4','h5', - 'h6','head','header','hgroup','hr','iframe','img','input','isindex','li','link', - 'listing','menu','meta','nav','noembed','noframes','noscript','ol', - 'p','param','plaintext','pre','script','select','spacer','style', - 'tbody','textarea','tfoot','thead','title','tr','ul','wbr']; - - private $pendingTableCharacters; - private $pendingTableCharactersDirty; - - // Tree construction modes - const INITIAL = 0; - const BEFORE_HTML = 1; - const BEFORE_HEAD = 2; - const IN_HEAD = 3; - const IN_HEAD_NOSCRIPT = 4; - const AFTER_HEAD = 5; - const IN_BODY = 6; - const IN_CDATA_RCDATA = 7; - const IN_TABLE = 8; - const IN_TABLE_TEXT = 9; - const IN_CAPTION = 10; - const IN_COLUMN_GROUP = 11; - const IN_TABLE_BODY = 12; - const IN_ROW = 13; - const IN_CELL = 14; - const IN_SELECT = 15; - const IN_SELECT_IN_TABLE= 16; - const IN_FOREIGN_CONTENT= 17; - const AFTER_BODY = 18; - const IN_FRAMESET = 19; - const AFTER_FRAMESET = 20; - const AFTER_AFTER_BODY = 21; - const AFTER_AFTER_FRAMESET = 22; - - /** - * Converts a magic number to a readable name. Use for debugging. - */ - private function strConst($number) { - static $lookup; - if (!$lookup) { - $lookup = []; - $r = new ReflectionClass('HTML5_TreeBuilder'); - $consts = $r->getConstants(); - foreach ($consts as $const => $num) { - if (!is_int($num)) { - continue; - } - $lookup[$num] = $const; - } - } - return $lookup[$number]; - } - - // The different types of elements. - const SPECIAL = 100; - const SCOPING = 101; - const FORMATTING = 102; - const PHRASING = 103; - - // Quirks modes in $quirks_mode - const NO_QUIRKS = 200; - const QUIRKS_MODE = 201; - const LIMITED_QUIRKS_MODE = 202; - - // Marker to be placed in $a_formatting - const MARKER = 300; - - // Namespaces for foreign content - const NS_HTML = null; // to prevent DOM from requiring NS on everything - const NS_MATHML = 'http://www.w3.org/1998/Math/MathML'; - const NS_SVG = 'http://www.w3.org/2000/svg'; - const NS_XLINK = 'http://www.w3.org/1999/xlink'; - const NS_XML = 'http://www.w3.org/XML/1998/namespace'; - const NS_XMLNS = 'http://www.w3.org/2000/xmlns/'; - - // Different types of scopes to test for elements - const SCOPE = 0; - const SCOPE_LISTITEM = 1; - const SCOPE_TABLE = 2; - - /** - * HTML5_TreeBuilder constructor. - */ - public function __construct() { - $this->mode = self::INITIAL; - $this->dom = new DOMDocument; - - $this->dom->encoding = 'UTF-8'; - $this->dom->preserveWhiteSpace = true; - $this->dom->substituteEntities = true; - $this->dom->strictErrorChecking = false; - } - - public function getQuirksMode(){ - return $this->quirks_mode; - } - - /** - * Process tag tokens - * - * @param $token - * @param null $mode - */ - public function emitToken($token, $mode = null) { - // XXX: ignore parse errors... why are we emitting them, again? - if ($token['type'] === HTML5_Tokenizer::PARSEERROR) { - return; - } - if ($mode === null) { - $mode = $this->mode; - } - - /* - $backtrace = debug_backtrace(); - if ($backtrace[1]['class'] !== 'HTML5_TreeBuilder') echo "--\n"; - echo $this->strConst($mode); - if ($this->original_mode) echo " (originally ".$this->strConst($this->original_mode).")"; - echo "\n "; - token_dump($token); - $this->printStack(); - $this->printActiveFormattingElements(); - if ($this->foster_parent) echo " -> this is a foster parent mode\n"; - if ($this->flag_frameset_ok) echo " -> frameset ok\n"; - */ - - if ($this->ignore_lf_token) { - $this->ignore_lf_token--; - } - $this->ignored = false; - - switch ($mode) { - case self::INITIAL: - - /* A character token that is one of U+0009 CHARACTER TABULATION, - * U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 SPACE */ - if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - /* Ignore the token. */ - $this->ignored = true; - } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) { - if ( - $token['name'] !== 'html' || !empty($token['public']) || - !empty($token['system']) || $token !== 'about:legacy-compat' - ) { - /* If the DOCTYPE token's name is not a case-sensitive match - * for the string "html", or if the token's public identifier - * is not missing, or if the token's system identifier is - * neither missing nor a case-sensitive match for the string - * "about:legacy-compat", then there is a parse error (this - * is the DOCTYPE parse error). */ - // DOCTYPE parse error - } - /* Append a DocumentType node to the Document node, with the name - * attribute set to the name given in the DOCTYPE token, or the - * empty string if the name was missing; the publicId attribute - * set to the public identifier given in the DOCTYPE token, or - * the empty string if the public identifier was missing; the - * systemId attribute set to the system identifier given in the - * DOCTYPE token, or the empty string if the system identifier - * was missing; and the other attributes specific to - * DocumentType objects set to null and empty lists as - * appropriate. Associate the DocumentType node with the - * Document object so that it is returned as the value of the - * doctype attribute of the Document object. */ - if (!isset($token['public'])) { - $token['public'] = null; - } - if (!isset($token['system'])) { - $token['system'] = null; - } - // XDOM - // Yes this is hacky. I'm kind of annoyed that I can't appendChild - // a doctype to DOMDocument. Maybe I haven't chanted the right - // syllables. - $impl = new DOMImplementation(); - // This call can fail for particularly pathological cases (namely, - // the qualifiedName parameter ($token['name']) could be missing. - if ($token['name']) { - $doctype = $impl->createDocumentType($token['name'], $token['public'], $token['system']); - $this->dom->appendChild($doctype); - } else { - // It looks like libxml's not actually *able* to express this case. - // So... don't. - $this->dom->emptyDoctype = true; - } - $public = is_null($token['public']) ? false : strtolower($token['public']); - $system = is_null($token['system']) ? false : strtolower($token['system']); - $publicStartsWithForQuirks = [ - "+//silmaril//dtd html pro v0r11 19970101//", - "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - "-//as//dtd html 3.0 aswedit + extensions//", - "-//ietf//dtd html 2.0 level 1//", - "-//ietf//dtd html 2.0 level 2//", - "-//ietf//dtd html 2.0 strict level 1//", - "-//ietf//dtd html 2.0 strict level 2//", - "-//ietf//dtd html 2.0 strict//", - "-//ietf//dtd html 2.0//", - "-//ietf//dtd html 2.1e//", - "-//ietf//dtd html 3.0//", - "-//ietf//dtd html 3.2 final//", - "-//ietf//dtd html 3.2//", - "-//ietf//dtd html 3//", - "-//ietf//dtd html level 0//", - "-//ietf//dtd html level 1//", - "-//ietf//dtd html level 2//", - "-//ietf//dtd html level 3//", - "-//ietf//dtd html strict level 0//", - "-//ietf//dtd html strict level 1//", - "-//ietf//dtd html strict level 2//", - "-//ietf//dtd html strict level 3//", - "-//ietf//dtd html strict//", - "-//ietf//dtd html//", - "-//metrius//dtd metrius presentational//", - "-//microsoft//dtd internet explorer 2.0 html strict//", - "-//microsoft//dtd internet explorer 2.0 html//", - "-//microsoft//dtd internet explorer 2.0 tables//", - "-//microsoft//dtd internet explorer 3.0 html strict//", - "-//microsoft//dtd internet explorer 3.0 html//", - "-//microsoft//dtd internet explorer 3.0 tables//", - "-//netscape comm. corp.//dtd html//", - "-//netscape comm. corp.//dtd strict html//", - "-//o'reilly and associates//dtd html 2.0//", - "-//o'reilly and associates//dtd html extended 1.0//", - "-//o'reilly and associates//dtd html extended relaxed 1.0//", - "-//spyglass//dtd html 2.0 extended//", - "-//sq//dtd html 2.0 hotmetal + extensions//", - "-//sun microsystems corp.//dtd hotjava html//", - "-//sun microsystems corp.//dtd hotjava strict html//", - "-//w3c//dtd html 3 1995-03-24//", - "-//w3c//dtd html 3.2 draft//", - "-//w3c//dtd html 3.2 final//", - "-//w3c//dtd html 3.2//", - "-//w3c//dtd html 3.2s draft//", - "-//w3c//dtd html 4.0 frameset//", - "-//w3c//dtd html 4.0 transitional//", - "-//w3c//dtd html experimental 19960712//", - "-//w3c//dtd html experimental 970421//", - "-//w3c//dtd w3 html//", - "-//w3o//dtd w3 html 3.0//", - "-//webtechs//dtd mozilla html 2.0//", - "-//webtechs//dtd mozilla html//", - ]; - $publicSetToForQuirks = [ - "-//w3o//dtd w3 html strict 3.0//", - "-/w3c/dtd html 4.0 transitional/en", - "html", - ]; - $publicStartsWithAndSystemForQuirks = [ - "-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//", - ]; - $publicStartsWithForLimitedQuirks = [ - "-//w3c//dtd xhtml 1.0 frameset//", - "-//w3c//dtd xhtml 1.0 transitional//", - ]; - $publicStartsWithAndSystemForLimitedQuirks = [ - "-//w3c//dtd html 4.01 frameset//", - "-//w3c//dtd html 4.01 transitional//", - ]; - // first, do easy checks - if ( - !empty($token['force-quirks']) || - strtolower($token['name']) !== 'html' - ) { - $this->quirks_mode = self::QUIRKS_MODE; - } else { - do { - if ($system) { - foreach ($publicStartsWithAndSystemForQuirks as $x) { - if (strncmp($public, $x, strlen($x)) === 0) { - $this->quirks_mode = self::QUIRKS_MODE; - break; - } - } - if (!is_null($this->quirks_mode)) { - break; - } - foreach ($publicStartsWithAndSystemForLimitedQuirks as $x) { - if (strncmp($public, $x, strlen($x)) === 0) { - $this->quirks_mode = self::LIMITED_QUIRKS_MODE; - break; - } - } - if (!is_null($this->quirks_mode)) { - break; - } - } - foreach ($publicSetToForQuirks as $x) { - if ($public === $x) { - $this->quirks_mode = self::QUIRKS_MODE; - break; - } - } - if (!is_null($this->quirks_mode)) { - break; - } - foreach ($publicStartsWithForLimitedQuirks as $x) { - if (strncmp($public, $x, strlen($x)) === 0) { - $this->quirks_mode = self::LIMITED_QUIRKS_MODE; - } - } - if (!is_null($this->quirks_mode)) { - break; - } - if ($system === "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") { - $this->quirks_mode = self::QUIRKS_MODE; - break; - } - foreach ($publicStartsWithForQuirks as $x) { - if (strncmp($public, $x, strlen($x)) === 0) { - $this->quirks_mode = self::QUIRKS_MODE; - break; - } - } - if (is_null($this->quirks_mode)) { - $this->quirks_mode = self::NO_QUIRKS; - } - } while (false); - } - $this->mode = self::BEFORE_HTML; - } else { - // parse error - /* Switch the insertion mode to "before html", then reprocess the - * current token. */ - $this->mode = self::BEFORE_HTML; - $this->quirks_mode = self::QUIRKS_MODE; - $this->emitToken($token); - } - break; - - case self::BEFORE_HTML: - /* A DOCTYPE token */ - if ($token['type'] === HTML5_Tokenizer::DOCTYPE) { - // Parse error. Ignore the token. - $this->ignored = true; - - /* A comment token */ - } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - // XDOM - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - /* Ignore the token. */ - $this->ignored = true; - - /* A start tag whose tag name is "html" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] == 'html') { - /* Create an element for the token in the HTML namespace. Append it - * to the Document object. Put this element in the stack of open - * elements. */ - // XDOM - $html = $this->insertElement($token, false); - $this->dom->appendChild($html); - $this->stack[] = $html; - - $this->mode = self::BEFORE_HEAD; - - } else { - /* Create an html element. Append it to the Document object. Put - * this element in the stack of open elements. */ - // XDOM - $html = $this->dom->createElementNS(self::NS_HTML, 'html'); - $this->dom->appendChild($html); - $this->stack[] = $html; - - /* Switch the insertion mode to "before head", then reprocess the - * current token. */ - $this->mode = self::BEFORE_HEAD; - $this->emitToken($token); - } - break; - - case self::BEFORE_HEAD: - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - /* Ignore the token. */ - $this->ignored = true; - - /* A comment token */ - } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A DOCTYPE token */ - } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) { - /* Parse error. Ignore the token */ - $this->ignored = true; - // parse error - - /* A start tag token with the tag name "html" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') { - /* Process the token using the rules for the "in body" - * insertion mode. */ - $this->processWithRulesFor($token, self::IN_BODY); - - /* A start tag token with the tag name "head" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'head') { - /* Insert an HTML element for the token. */ - $element = $this->insertElement($token); - - /* Set the head element pointer to this new element node. */ - $this->head_pointer = $element; - - /* Change the insertion mode to "in head". */ - $this->mode = self::IN_HEAD; - - /* An end tag whose tag name is one of: "head", "body", "html", "br" */ - } elseif ( - $token['type'] === HTML5_Tokenizer::ENDTAG && ( - $token['name'] === 'head' || $token['name'] === 'body' || - $token['name'] === 'html' || $token['name'] === 'br' - )) { - /* Act as if a start tag token with the tag name "head" and no - * attributes had been seen, then reprocess the current token. */ - $this->emitToken([ - 'name' => 'head', - 'type' => HTML5_Tokenizer::STARTTAG, - 'attr' => [] - ]); - $this->emitToken($token); - - /* Any other end tag */ - } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG) { - /* Parse error. Ignore the token. */ - $this->ignored = true; - - } else { - /* Act as if a start tag token with the tag name "head" and no - * attributes had been seen, then reprocess the current token. - * Note: This will result in an empty head element being - * generated, with the current token being reprocessed in the - * "after head" insertion mode. */ - $this->emitToken([ - 'name' => 'head', - 'type' => HTML5_Tokenizer::STARTTAG, - 'attr' => [] - ]); - $this->emitToken($token); - } - break; - - case self::IN_HEAD: - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. */ - if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - /* Insert the character into the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A DOCTYPE token */ - } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) { - /* Parse error. Ignore the token. */ - $this->ignored = true; - // parse error - - /* A start tag whose tag name is "html" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && - $token['name'] === 'html') { - $this->processWithRulesFor($token, self::IN_BODY); - - /* A start tag whose tag name is one of: "base", "command", "link" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && - ($token['name'] === 'base' || $token['name'] === 'command' || - $token['name'] === 'link')) { - /* Insert an HTML element for the token. Immediately pop the - * current node off the stack of open elements. */ - $this->insertElement($token); - array_pop($this->stack); - - // YYY: Acknowledge the token's self-closing flag, if it is set. - - /* A start tag whose tag name is "meta" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'meta') { - /* Insert an HTML element for the token. Immediately pop the - * current node off the stack of open elements. */ - $this->insertElement($token); - array_pop($this->stack); - - // XERROR: Acknowledge the token's self-closing flag, if it is set. - - // XENCODING: If the element has a charset attribute, and its value is a - // supported encoding, and the confidence is currently tentative, - // then change the encoding to the encoding given by the value of - // the charset attribute. - // - // Otherwise, if the element has a content attribute, and applying - // the algorithm for extracting an encoding from a Content-Type to - // its value returns a supported encoding encoding, and the - // confidence is currently tentative, then change the encoding to - // the encoding encoding. - - /* A start tag with the tag name "title" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'title') { - $this->insertRCDATAElement($token); - - /* A start tag whose tag name is "noscript", if the scripting flag is enabled, or - * A start tag whose tag name is one of: "noframes", "style" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && - ($token['name'] === 'noscript' || $token['name'] === 'noframes' || $token['name'] === 'style')) { - // XSCRIPT: Scripting flag not respected - $this->insertCDATAElement($token); - - // XSCRIPT: Scripting flag disable not implemented - - /* A start tag with the tag name "script" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'script') { - /* 1. Create an element for the token in the HTML namespace. */ - $node = $this->insertElement($token, false); - - /* 2. Mark the element as being "parser-inserted" */ - // Uhhh... XSCRIPT - - /* 3. If the parser was originally created for the HTML - * fragment parsing algorithm, then mark the script element as - * "already executed". (fragment case) */ - // ditto... XSCRIPT - - /* 4. Append the new element to the current node and push it onto - * the stack of open elements. */ - end($this->stack)->appendChild($node); - $this->stack[] = $node; - // I guess we could squash these together - - /* 6. Let the original insertion mode be the current insertion mode. */ - $this->original_mode = $this->mode; - /* 7. Switch the insertion mode to "in CDATA/RCDATA" */ - $this->mode = self::IN_CDATA_RCDATA; - /* 5. Switch the tokeniser's content model flag to the CDATA state. */ - $this->content_model = HTML5_Tokenizer::CDATA; - - /* An end tag with the tag name "head" */ - } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'head') { - /* Pop the current node (which will be the head element) off the stack of open elements. */ - array_pop($this->stack); - - /* Change the insertion mode to "after head". */ - $this->mode = self::AFTER_HEAD; - - // Slight logic inversion here to minimize duplication - /* A start tag with the tag name "head". */ - /* An end tag whose tag name is not one of: "body", "html", "br" */ - } elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'head') || - ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] !== 'html' && - $token['name'] !== 'body' && $token['name'] !== 'br')) { - // Parse error. Ignore the token. - $this->ignored = true; - - /* Anything else */ - } else { - /* Act as if an end tag token with the tag name "head" had been - * seen, and reprocess the current token. */ - $this->emitToken([ - 'name' => 'head', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - - /* Then, reprocess the current token. */ - $this->emitToken($token); - } - break; - - case self::IN_HEAD_NOSCRIPT: - if ($token['type'] === HTML5_Tokenizer::DOCTYPE) { - // parse error - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') { - $this->processWithRulesFor($token, self::IN_BODY); - } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'noscript') { - /* Pop the current node (which will be a noscript element) from the - * stack of open elements; the new current node will be a head - * element. */ - array_pop($this->stack); - $this->mode = self::IN_HEAD; - } elseif ( - ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) || - ($token['type'] === HTML5_Tokenizer::COMMENT) || - ($token['type'] === HTML5_Tokenizer::STARTTAG && ( - $token['name'] === 'link' || $token['name'] === 'meta' || - $token['name'] === 'noframes' || $token['name'] === 'style'))) { - $this->processWithRulesFor($token, self::IN_HEAD); - // inverted logic - } elseif ( - ($token['type'] === HTML5_Tokenizer::STARTTAG && ( - $token['name'] === 'head' || $token['name'] === 'noscript')) || - ($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] !== 'br')) { - // parse error - } else { - // parse error - $this->emitToken([ - 'type' => HTML5_Tokenizer::ENDTAG, - 'name' => 'noscript', - ]); - $this->emitToken($token); - } - break; - - case self::AFTER_HEAD: - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) { - // parse error - - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') { - $this->processWithRulesFor($token, self::IN_BODY); - - /* A start tag token with the tag name "body" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'body') { - $this->insertElement($token); - - /* Set the frameset-ok flag to "not ok". */ - $this->flag_frameset_ok = false; - - /* Change the insertion mode to "in body". */ - $this->mode = self::IN_BODY; - - /* A start tag token with the tag name "frameset" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'frameset') { - /* Insert a frameset element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in frameset". */ - $this->mode = self::IN_FRAMESET; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title" */ - } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'], - ['base', 'link', 'meta', 'noframes', 'script', 'style', 'title'])) { - // parse error - /* Push the node pointed to by the head element pointer onto the - * stack of open elements. */ - $this->stack[] = $this->head_pointer; - $this->processWithRulesFor($token, self::IN_HEAD); - array_splice($this->stack, array_search($this->head_pointer, $this->stack, true), 1); - - // inversion of specification - } elseif ( - ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'head') || - ($token['type'] === HTML5_Tokenizer::ENDTAG && - $token['name'] !== 'body' && $token['name'] !== 'html' && - $token['name'] !== 'br')) { - // parse error - - /* Anything else */ - } else { - $this->emitToken([ - 'name' => 'body', - 'type' => HTML5_Tokenizer::STARTTAG, - 'attr' => [] - ]); - $this->flag_frameset_ok = true; - $this->emitToken($token); - } - break; - - case self::IN_BODY: - /* Handle the token as follows: */ - - switch($token['type']) { - /* A character token */ - case HTML5_Tokenizer::CHARACTER: - case HTML5_Tokenizer::SPACECHARACTER: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - - /* If the token is not one of U+0009 CHARACTER TABULATION, - * U+000A LINE FEED (LF), U+000C FORM FEED (FF), or U+0020 - * SPACE, then set the frameset-ok flag to "not ok". */ - // i.e., if any of the characters is not whitespace - if (strlen($token['data']) !== strspn($token['data'], HTML5_Tokenizer::WHITESPACE)) { - $this->flag_frameset_ok = false; - } - break; - - /* A comment token */ - case HTML5_Tokenizer::COMMENT: - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - break; - - case HTML5_Tokenizer::DOCTYPE: - // parse error - break; - - case HTML5_Tokenizer::EOF: - // parse error - break; - - case HTML5_Tokenizer::STARTTAG: - switch($token['name']) { - case 'html': - // parse error - /* For each attribute on the token, check to see if the - * attribute is already present on the top element of the - * stack of open elements. If it is not, add the attribute - * and its corresponding value to that element. */ - foreach($token['attr'] as $attr) { - if (!$this->stack[0]->hasAttribute($attr['name'])) { - $this->stack[0]->setAttribute($attr['name'], $attr['value']); - } - } - break; - - case 'base': case 'command': case 'link': case 'meta': case 'noframes': - case 'script': case 'style': case 'title': - /* Process the token as if the insertion mode had been "in - head". */ - $this->processWithRulesFor($token, self::IN_HEAD); - break; - - /* A start tag token with the tag name "body" */ - case 'body': - /* Parse error. If the second element on the stack of open - elements is not a body element, or, if the stack of open - elements has only one node on it, then ignore the token. - (fragment case) */ - if (count($this->stack) === 1 || $this->stack[1]->tagName !== 'body') { - $this->ignored = true; - // Ignore - - /* Otherwise, for each attribute on the token, check to see - if the attribute is already present on the body element (the - second element) on the stack of open elements. If it is not, - add the attribute and its corresponding value to that - element. */ - } else { - foreach($token['attr'] as $attr) { - if (!$this->stack[1]->hasAttribute($attr['name'])) { - $this->stack[1]->setAttribute($attr['name'], $attr['value']); - } - } - } - break; - - case 'frameset': - // parse error - /* If the second element on the stack of open elements is - * not a body element, or, if the stack of open elements - * has only one node on it, then ignore the token. - * (fragment case) */ - if (count($this->stack) === 1 || $this->stack[1]->tagName !== 'body') { - $this->ignored = true; - // Ignore - } elseif (!$this->flag_frameset_ok) { - $this->ignored = true; - // Ignore - } else { - /* 1. Remove the second element on the stack of open - * elements from its parent node, if it has one. */ - if ($this->stack[1]->parentNode) { - $this->stack[1]->parentNode->removeChild($this->stack[1]); - } - - /* 2. Pop all the nodes from the bottom of the stack of - * open elements, from the current node up to the root - * html element. */ - array_splice($this->stack, 1); - - $this->insertElement($token); - $this->mode = self::IN_FRAMESET; - } - break; - - // in spec, there is a diversion here - - case 'address': case 'article': case 'aside': case 'blockquote': - case 'center': case 'datagrid': case 'details': case 'dir': - case 'div': case 'dl': case 'fieldset': case 'figure': case 'footer': - case 'header': case 'hgroup': case 'menu': case 'nav': - case 'ol': case 'p': case 'section': case 'ul': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if ($this->elementInScope('p')) { - $this->emitToken([ - 'name' => 'p', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if ($this->elementInScope('p')) { - $this->emitToken([ - 'name' => 'p', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - } - - /* If the current node is an element whose tag name is one - * of "h1", "h2", "h3", "h4", "h5", or "h6", then this is a - * parse error; pop the current node off the stack of open - * elements. */ - $peek = array_pop($this->stack); - if (in_array($peek->tagName, ["h1", "h2", "h3", "h4", "h5", "h6"])) { - // parse error - } else { - $this->stack[] = $peek; - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - case 'pre': case 'listing': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if ($this->elementInScope('p')) { - $this->emitToken([ - 'name' => 'p', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - } - $this->insertElement($token); - /* If the next token is a U+000A LINE FEED (LF) character - * token, then ignore that token and move on to the next - * one. (Newlines at the start of pre blocks are ignored as - * an authoring convenience.) */ - $this->ignore_lf_token = 2; - $this->flag_frameset_ok = false; - break; - - /* A start tag whose tag name is "form" */ - case 'form': - /* If the form element pointer is not null, ignore the - token with a parse error. */ - if ($this->form_pointer !== null) { - $this->ignored = true; - // Ignore. - - /* Otherwise: */ - } else { - /* If the stack of open elements has a p element in - scope, then act as if an end tag with the tag name p - had been seen. */ - if ($this->elementInScope('p')) { - $this->emitToken([ - 'name' => 'p', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - } - - /* Insert an HTML element for the token, and set the - form element pointer to point to the element created. */ - $element = $this->insertElement($token); - $this->form_pointer = $element; - } - break; - - // condensed specification - case 'li': case 'dc': case 'dd': case 'ds': case 'dt': - /* 1. Set the frameset-ok flag to "not ok". */ - $this->flag_frameset_ok = false; - - $stack_length = count($this->stack) - 1; - for($n = $stack_length; 0 <= $n; $n--) { - /* 2. Initialise node to be the current node (the - bottommost node of the stack). */ - $stop = false; - $node = $this->stack[$n]; - $cat = $this->getElementCategory($node); - - // for case 'li': - /* 3. If node is an li element, then act as if an end - * tag with the tag name "li" had been seen, then jump - * to the last step. */ - // for case 'dc': case 'dd': case 'ds': case 'dt': - /* If node is a dc, dd, ds or dt element, then act as if an end - * tag with the same tag name as node had been seen, then - * jump to the last step. */ - if (($token['name'] === 'li' && $node->tagName === 'li') || - ($token['name'] !== 'li' && ($node->tagName == 'dc' || $node->tagName === 'dd' || $node->tagName == 'ds' || $node->tagName === 'dt'))) { // limited conditional - $this->emitToken([ - 'type' => HTML5_Tokenizer::ENDTAG, - 'name' => $node->tagName, - ]); - break; - } - - /* 4. If node is not in the formatting category, and is - not in the phrasing category, and is not an address, - div or p element, then stop this algorithm. */ - if ($cat !== self::FORMATTING && $cat !== self::PHRASING && - $node->tagName !== 'address' && $node->tagName !== 'div' && - $node->tagName !== 'p') { - break; - } - - /* 5. Otherwise, set node to the previous entry in the - * stack of open elements and return to step 2. */ - } - - /* 6. This is the last step. */ - - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if ($this->elementInScope('p')) { - $this->emitToken([ - 'name' => 'p', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - } - - /* Finally, insert an HTML element with the same tag - name as the token's. */ - $this->insertElement($token); - break; - - /* A start tag token whose tag name is "plaintext" */ - case 'plaintext': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if ($this->elementInScope('p')) { - $this->emitToken([ - 'name' => 'p', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - $this->content_model = HTML5_Tokenizer::PLAINTEXT; - break; - - // more diversions - - /* A start tag whose tag name is "a" */ - case 'a': - /* If the list of active formatting elements contains - an element whose tag name is "a" between the end of the - list and the last marker on the list (or the start of - the list if there is no marker on the list), then this - is a parse error; act as if an end tag with the tag name - "a" had been seen, then remove that element from the list - of active formatting elements and the stack of open - elements if the end tag didn't already remove it (it - might not have if the element is not in table scope). */ - $leng = count($this->a_formatting); - - for ($n = $leng - 1; $n >= 0; $n--) { - if ($this->a_formatting[$n] === self::MARKER) { - break; - - } elseif ($this->a_formatting[$n]->tagName === 'a') { - $a = $this->a_formatting[$n]; - $this->emitToken([ - 'name' => 'a', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - if (in_array($a, $this->a_formatting)) { - $a_i = array_search($a, $this->a_formatting, true); - if ($a_i !== false) { - array_splice($this->a_formatting, $a_i, 1); - } - } - if (in_array($a, $this->stack)) { - $a_i = array_search($a, $this->stack, true); - if ($a_i !== false) { - array_splice($this->stack, $a_i, 1); - } - } - break; - } - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - case 'b': case 'big': case 'code': case 'em': case 'font': case 'i': - case 's': case 'small': case 'strike': - case 'strong': case 'tt': case 'u': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - case 'nobr': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* If the stack of open elements has a nobr element in - * scope, then this is a parse error; act as if an end tag - * with the tag name "nobr" had been seen, then once again - * reconstruct the active formatting elements, if any. */ - if ($this->elementInScope('nobr')) { - $this->emitToken([ - 'name' => 'nobr', - 'type' => HTML5_Tokenizer::ENDTAG, - ]); - $this->reconstructActiveFormattingElements(); - } - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - // another diversion - - /* A start tag token whose tag name is "button" */ - case 'button': - /* If the stack of open elements has a button element in scope, - then this is a parse error; act as if an end tag with the tag - name "button" had been seen, then reprocess the token. (We don't - do that. Unnecessary.) (I hope you're right! -- ezyang) */ - if ($this->elementInScope('button')) { - $this->emitToken([ - 'name' => 'button', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - - $this->flag_frameset_ok = false; - break; - - case 'applet': case 'marquee': case 'object': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - - $this->flag_frameset_ok = false; - break; - - // spec diversion - - /* A start tag whose tag name is "table" */ - case 'table': - /* If the Document is not set to quirks mode, and the - * stack of open elements has a p element in scope, then - * act as if an end tag with the tag name "p" had been - * seen. */ - if ($this->quirks_mode !== self::QUIRKS_MODE && - $this->elementInScope('p')) { - $this->emitToken([ - 'name' => 'p', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - $this->flag_frameset_ok = false; - - /* Change the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - break; - - /* A start tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ - case 'area': case 'basefont': case 'bgsound': case 'br': - case 'embed': case 'img': case 'input': case 'keygen': case 'spacer': - case 'wbr': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - - // YYY: Acknowledge the token's self-closing flag, if it is set. - - $this->flag_frameset_ok = false; - break; - - case 'param': case 'source': - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - - // YYY: Acknowledge the token's self-closing flag, if it is set. - break; - - /* A start tag whose tag name is "hr" */ - case 'hr': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if ($this->elementInScope('p')) { - $this->emitToken([ - 'name' => 'p', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - - // YYY: Acknowledge the token's self-closing flag, if it is set. - - $this->flag_frameset_ok = false; - break; - - /* A start tag whose tag name is "image" */ - case 'image': - /* Parse error. Change the token's tag name to "img" and - reprocess it. (Don't ask.) */ - $token['name'] = 'img'; - $this->emitToken($token); - break; - - /* A start tag whose tag name is "isindex" */ - case 'isindex': - /* Parse error. */ - - /* If the form element pointer is not null, - then ignore the token. */ - if ($this->form_pointer === null) { - /* Act as if a start tag token with the tag name "form" had - been seen. */ - /* If the token has an attribute called "action", set - * the action attribute on the resulting form - * element to the value of the "action" attribute of - * the token. */ - $attr = []; - $action = $this->getAttr($token, 'action'); - if ($action !== false) { - $attr[] = ['name' => 'action', 'value' => $action]; - } - $this->emitToken([ - 'name' => 'form', - 'type' => HTML5_Tokenizer::STARTTAG, - 'attr' => $attr - ]); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->emitToken([ - 'name' => 'hr', - 'type' => HTML5_Tokenizer::STARTTAG, - 'attr' => [] - ]); - - /* Act as if a start tag token with the tag name "label" - had been seen. */ - $this->emitToken([ - 'name' => 'label', - 'type' => HTML5_Tokenizer::STARTTAG, - 'attr' => [] - ]); - - /* Act as if a stream of character tokens had been seen. */ - $prompt = $this->getAttr($token, 'prompt'); - if ($prompt === false) { - $prompt = 'This is a searchable index. '. - 'Insert your search keywords here: '; - } - $this->emitToken([ - 'data' => $prompt, - 'type' => HTML5_Tokenizer::CHARACTER, - ]); - - /* Act as if a start tag token with the tag name "input" - had been seen, with all the attributes from the "isindex" - token, except with the "name" attribute set to the value - "isindex" (ignoring any explicit "name" attribute). */ - $attr = []; - foreach ($token['attr'] as $keypair) { - if ($keypair['name'] === 'name' || $keypair['name'] === 'action' || - $keypair['name'] === 'prompt') { - continue; - } - $attr[] = $keypair; - } - $attr[] = ['name' => 'name', 'value' => 'isindex']; - - $this->emitToken([ - 'name' => 'input', - 'type' => HTML5_Tokenizer::STARTTAG, - 'attr' => $attr - ]); - - /* Act as if an end tag token with the tag name "label" - had been seen. */ - $this->emitToken([ - 'name' => 'label', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->emitToken([ - 'name' => 'hr', - 'type' => HTML5_Tokenizer::STARTTAG - ]); - - /* Act as if an end tag token with the tag name "form" had - been seen. */ - $this->emitToken([ - 'name' => 'form', - 'type' => HTML5_Tokenizer::ENDTAG - ]); - } else { - $this->ignored = true; - } - break; - - /* A start tag whose tag name is "textarea" */ - case 'textarea': - $this->insertElement($token); - - /* If the next token is a U+000A LINE FEED (LF) - * character token, then ignore that token and move on to - * the next one. (Newlines at the start of textarea - * elements are ignored as an authoring convenience.) - * need flag, see also
 */
-                            $this->ignore_lf_token = 2;
-
-                            $this->original_mode = $this->mode;
-                            $this->flag_frameset_ok = false;
-                            $this->mode = self::IN_CDATA_RCDATA;
-
-                            /* Switch the tokeniser's content model flag to the
-                            RCDATA state. */
-                            $this->content_model = HTML5_Tokenizer::RCDATA;
-                        break;
-
-                        /* A start tag token whose tag name is "xmp" */
-                        case 'xmp':
-                            /* If the stack of open elements has a p element in
-                            scope, then act as if an end tag with the tag name
-                            "p" has been seen. */
-                            if ($this->elementInScope('p')) {
-                                $this->emitToken([
-                                    'name' => 'p',
-                                    'type' => HTML5_Tokenizer::ENDTAG
-                                ]);
-                            }
-
-                            /* Reconstruct the active formatting elements, if any. */
-                            $this->reconstructActiveFormattingElements();
-
-                            $this->flag_frameset_ok = false;
-
-                            $this->insertCDATAElement($token);
-                        break;
-
-                        case 'iframe':
-                            $this->flag_frameset_ok = false;
-                            $this->insertCDATAElement($token);
-                        break;
-
-                        case 'noembed': case 'noscript':
-                            // XSCRIPT: should check scripting flag
-                            $this->insertCDATAElement($token);
-                        break;
-
-                        /* A start tag whose tag name is "select" */
-                        case 'select':
-                            /* Reconstruct the active formatting elements, if any. */
-                            $this->reconstructActiveFormattingElements();
-
-                            /* Insert an HTML element for the token. */
-                            $this->insertElement($token);
-
-                            $this->flag_frameset_ok = false;
-
-                            /* If the insertion mode is one of in table", "in caption",
-                             * "in column group", "in table body", "in row", or "in
-                             * cell", then switch the insertion mode to "in select in
-                             * table". Otherwise, switch the insertion mode  to "in
-                             * select". */
-                            if (
-                                $this->mode === self::IN_TABLE || $this->mode === self::IN_CAPTION ||
-                                $this->mode === self::IN_COLUMN_GROUP || $this->mode ==+self::IN_TABLE_BODY ||
-                                $this->mode === self::IN_ROW || $this->mode === self::IN_CELL
-                            ) {
-                                $this->mode = self::IN_SELECT_IN_TABLE;
-                            } else {
-                                $this->mode = self::IN_SELECT;
-                            }
-                        break;
-
-                        case 'option': case 'optgroup':
-                            if ($this->elementInScope('option')) {
-                                $this->emitToken([
-                                    'name' => 'option',
-                                    'type' => HTML5_Tokenizer::ENDTAG,
-                                ]);
-                            }
-                            $this->reconstructActiveFormattingElements();
-                            $this->insertElement($token);
-                        break;
-
-                        case 'rp': case 'rt':
-                            /* If the stack of open elements has a ruby element in scope, then generate
-                             * implied end tags. If the current node is not then a ruby element, this is
-                             * a parse error; pop all the nodes from the current node up to the node
-                             * immediately before the bottommost ruby element on the stack of open elements.
-                             */
-                            if ($this->elementInScope('ruby')) {
-                                $this->generateImpliedEndTags();
-                            }
-                            $peek = false;
-                            do {
-                                /*if ($peek) {
-                                    // parse error
-                                }*/
-                                $peek = array_pop($this->stack);
-                            } while ($peek->tagName !== 'ruby');
-                            $this->stack[] = $peek; // we popped one too many
-                            $this->insertElement($token);
-                        break;
-
-                        // spec diversion
-
-                        case 'math':
-                            $this->reconstructActiveFormattingElements();
-                            $token = $this->adjustMathMLAttributes($token);
-                            $token = $this->adjustForeignAttributes($token);
-                            $this->insertForeignElement($token, self::NS_MATHML);
-                            if (isset($token['self-closing'])) {
-                                // XERROR: acknowledge the token's self-closing flag
-                                array_pop($this->stack);
-                            }
-                            if ($this->mode !== self::IN_FOREIGN_CONTENT) {
-                                $this->secondary_mode = $this->mode;
-                                $this->mode = self::IN_FOREIGN_CONTENT;
-                            }
-                        break;
-
-                        case 'svg':
-                            $this->reconstructActiveFormattingElements();
-                            $token = $this->adjustSVGAttributes($token);
-                            $token = $this->adjustForeignAttributes($token);
-                            $this->insertForeignElement($token, self::NS_SVG);
-                            if (isset($token['self-closing'])) {
-                                // XERROR: acknowledge the token's self-closing flag
-                                array_pop($this->stack);
-                            }
-                            if ($this->mode !== self::IN_FOREIGN_CONTENT) {
-                                $this->secondary_mode = $this->mode;
-                                $this->mode = self::IN_FOREIGN_CONTENT;
-                            }
-                        break;
-
-                        case 'caption': case 'col': case 'colgroup': case 'frame': case 'head':
-                        case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead': case 'tr':
-                            // parse error
-                        break;
-
-                        /* A start tag token not covered by the previous entries */
-                        default:
-                            /* Reconstruct the active formatting elements, if any. */
-                            $this->reconstructActiveFormattingElements();
-
-                            $this->insertElement($token);
-                            /* This element will be a phrasing  element. */
-                        break;
-                    }
-                    break;
-
-                    case HTML5_Tokenizer::ENDTAG:
-                    switch ($token['name']) {
-                        /* An end tag with the tag name "body" */
-                        case 'body':
-                            /* If the stack of open elements does not have a body
-                             * element in scope, this is a parse error; ignore the
-                             * token. */
-                            if (!$this->elementInScope('body')) {
-                                $this->ignored = true;
-
-                            /* Otherwise, if there is a node in the stack of open
-                             * elements that is not either a dc element, a dd element,
-                             * a ds element, a dt element, an li element, an optgroup
-                             * element, an option element, a p element, an rp element,
-                             * an rt element, a tbody element, a td element, a tfoot
-                             * element, a th element, a thead element, a tr element,
-                             * the body element, or the html element, then this is a
-                             * parse error.
-                             */
-                            } else {
-                                // XERROR: implement this check for parse error
-                            }
-
-                            /* Change the insertion mode to "after body". */
-                            $this->mode = self::AFTER_BODY;
-                        break;
-
-                        /* An end tag with the tag name "html" */
-                        case 'html':
-                            /* Act as if an end tag with tag name "body" had been seen,
-                            then, if that token wasn't ignored, reprocess the current
-                            token. */
-                            $this->emitToken([
-                                'name' => 'body',
-                                'type' => HTML5_Tokenizer::ENDTAG
-                            ]);
-
-                            if (!$this->ignored) {
-                                $this->emitToken($token);
-                            }
-                        break;
-
-                        case 'address': case 'article': case 'aside': case 'blockquote':
-                        case 'center': case 'datagrid': case 'details': case 'dir':
-                        case 'div': case 'dl': case 'fieldset': case 'footer':
-                        case 'header': case 'hgroup': case 'listing': case 'menu':
-                        case 'nav': case 'ol': case 'pre': case 'section': case 'ul':
-                            /* If the stack of open elements has an element in scope
-                            with the same tag name as that of the token, then generate
-                            implied end tags. */
-                            if ($this->elementInScope($token['name'])) {
-                                $this->generateImpliedEndTags();
-
-                                /* Now, if the current node is not an element with
-                                the same tag name as that of the token, then this
-                                is a parse error. */
-                                // XERROR: implement parse error logic
-
-                                /* If the stack of open elements has an element in
-                                scope with the same tag name as that of the token,
-                                then pop elements from this stack until an element
-                                with that tag name has been popped from the stack. */
-                                do {
-                                    $node = array_pop($this->stack);
-                                } while ($node->tagName !== $token['name']);
-                            } else {
-                                // parse error
-                            }
-                        break;
-
-                        /* An end tag whose tag name is "form" */
-                        case 'form':
-                            /* Let node be the element that the form element pointer is set to. */
-                            $node = $this->form_pointer;
-                            /* Set the form element pointer  to null. */
-                            $this->form_pointer = null;
-                            /* If node is null or the stack of open elements does not
-                                * have node in scope, then this is a parse error; ignore the token. */
-                            if ($node === null || !in_array($node, $this->stack)) {
-                                // parse error
-                                $this->ignored = true;
-                            } else {
-                                /* 1. Generate implied end tags. */
-                                $this->generateImpliedEndTags();
-                                /* 2. If the current node is not node, then this is a parse error.  */
-                                if (end($this->stack) !== $node) {
-                                    // parse error
-                                }
-                                /* 3. Remove node from the stack of open elements. */
-                                array_splice($this->stack, array_search($node, $this->stack, true), 1);
-                            }
-
-                        break;
-
-                        /* An end tag whose tag name is "p" */
-                        case 'p':
-                            /* If the stack of open elements has a p element in scope,
-                            then generate implied end tags, except for p elements. */
-                            if ($this->elementInScope('p')) {
-                                /* Generate implied end tags, except for elements with
-                                 * the same tag name as the token. */
-                                $this->generateImpliedEndTags(['p']);
-
-                                /* If the current node is not a p element, then this is
-                                a parse error. */
-                                // XERROR: implement
-
-                                /* Pop elements from the stack of open elements  until
-                                 * an element with the same tag name as the token has
-                                 * been popped from the stack. */
-                                do {
-                                    $node = array_pop($this->stack);
-                                } while ($node->tagName !== 'p');
-
-                            } else {
-                                // parse error
-                                $this->emitToken([
-                                    'name' => 'p',
-                                    'type' => HTML5_Tokenizer::STARTTAG,
-                                ]);
-                                $this->emitToken($token);
-                            }
-                        break;
-
-                        /* An end tag whose tag name is "li" */
-                        case 'li':
-                            /* If the stack of open elements does not have an element
-                             * in list item scope with the same tag name as that of the
-                             * token, then this is a parse error; ignore the token. */
-                            if ($this->elementInScope($token['name'], self::SCOPE_LISTITEM)) {
-                                /* Generate implied end tags, except for elements with the
-                                 * same tag name as the token. */
-                                $this->generateImpliedEndTags([$token['name']]);
-                                /* If the current node is not an element with the same tag
-                                 * name as that of the token, then this is a parse error. */
-                                // XERROR: parse error
-                                /* Pop elements from the stack of open elements  until an
-                                 * element with the same tag name as the token has been
-                                 * popped from the stack. */
-                                do {
-                                    $node = array_pop($this->stack);
-                                } while ($node->tagName !== $token['name']);
-                            }
-                            /*else {
-                                // XERROR: parse error
-                            }*/
-                        break;
-
-                        /* An end tag whose tag name is "dc", "dd", "ds", "dt" */
-                        case 'dc': case 'dd': case 'ds': case 'dt':
-                            if ($this->elementInScope($token['name'])) {
-                                $this->generateImpliedEndTags([$token['name']]);
-
-                                /* If the current node is not an element with the same
-                                tag name as the token, then this is a parse error. */
-                                // XERROR: implement parse error
-
-                                /* Pop elements from the stack of open elements  until
-                                 * an element with the same tag name as the token has
-                                 * been popped from the stack. */
-                                do {
-                                    $node = array_pop($this->stack);
-                                } while ($node->tagName !== $token['name']);
-                            }
-                            /*else {
-                                // XERROR: parse error
-                            }*/
-                        break;
-
-                        /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4",
-                        "h5", "h6" */
-                        case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6':
-                            $elements = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
-
-                            /* If the stack of open elements has in scope an element whose
-                            tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then
-                            generate implied end tags. */
-                            if ($this->elementInScope($elements)) {
-                                $this->generateImpliedEndTags();
-
-                                /* Now, if the current node is not an element with the same
-                                tag name as that of the token, then this is a parse error. */
-                                // XERROR: implement parse error
-
-                                /* If the stack of open elements has in scope an element
-                                whose tag name is one of "h1", "h2", "h3", "h4", "h5", or
-                                "h6", then pop elements from the stack until an element
-                                with one of those tag names has been popped from the stack. */
-                                do {
-                                    $node = array_pop($this->stack);
-                                } while (!in_array($node->tagName, $elements));
-                            }
-                            /*else {
-                                // parse error
-                            }*/
-                        break;
-
-                        /* An end tag whose tag name is one of: "a", "b", "big", "em",
-                        "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */
-                        case 'a': case 'b': case 'big': case 'code': case 'em': case 'font':
-                        case 'i': case 'nobr': case 's': case 'small': case 'strike':
-                        case 'strong': case 'tt': case 'u':
-                            // XERROR: generally speaking this needs parse error logic
-                            /* 1. Let the formatting element be the last element in
-                            the list of active formatting elements that:
-                                * is between the end of the list and the last scope
-                                marker in the list, if any, or the start of the list
-                                otherwise, and
-                                * has the same tag name as the token.
-                            */
-                            while (true) {
-                                for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) {
-                                    if ($this->a_formatting[$a] === self::MARKER) {
-                                        break;
-                                    } elseif ($this->a_formatting[$a]->tagName === $token['name']) {
-                                        $formatting_element = $this->a_formatting[$a];
-                                        $in_stack = in_array($formatting_element, $this->stack, true);
-                                        $fe_af_pos = $a;
-                                        break;
-                                    }
-                                }
-
-                                /* If there is no such node, or, if that node is
-                                also in the stack of open elements but the element
-                                is not in scope, then this is a parse error. Abort
-                                these steps. The token is ignored. */
-                                if (
-                                    !isset($formatting_element) || (
-                                        $in_stack &&
-                                        !$this->elementInScope($token['name'])
-                                    )
-                                ) {
-                                    $this->ignored = true;
-                                    break;
-
-                                /* Otherwise, if there is such a node, but that node
-                                is not in the stack of open elements, then this is a
-                                parse error; remove the element from the list, and
-                                abort these steps. */
-                                } elseif (isset($formatting_element) && !$in_stack) {
-                                    unset($this->a_formatting[$fe_af_pos]);
-                                    $this->a_formatting = array_merge($this->a_formatting);
-                                    break;
-                                }
-
-                                /* Otherwise, there is a formatting element and that
-                                 * element is in the stack and is in scope. If the
-                                 * element is not the current node, this is a parse
-                                 * error. In any case, proceed with the algorithm as
-                                 * written in the following steps. */
-                                // XERROR: implement me
-
-                                /* 2. Let the furthest block be the topmost node in the
-                                stack of open elements that is lower in the stack
-                                than the formatting element, and is not an element in
-                                the phrasing or formatting categories. There might
-                                not be one. */
-                                $fe_s_pos = array_search($formatting_element, $this->stack, true);
-                                $length = count($this->stack);
-
-                                for ($s = $fe_s_pos + 1; $s < $length; $s++) {
-                                    $category = $this->getElementCategory($this->stack[$s]);
-
-                                    if ($category !== self::PHRASING && $category !== self::FORMATTING) {
-                                        $furthest_block = $this->stack[$s];
-                                        break;
-                                    }
-                                }
-
-                                /* 3. If there is no furthest block, then the UA must
-                                skip the subsequent steps and instead just pop all
-                                the nodes from the bottom of the stack of open
-                                elements, from the current node up to the formatting
-                                element, and remove the formatting element from the
-                                list of active formatting elements. */
-                                if (!isset($furthest_block)) {
-                                    for ($n = $length - 1; $n >= $fe_s_pos; $n--) {
-                                        array_pop($this->stack);
-                                    }
-
-                                    unset($this->a_formatting[$fe_af_pos]);
-                                    $this->a_formatting = array_merge($this->a_formatting);
-                                    break;
-                                }
-
-                                /* 4. Let the common ancestor be the element
-                                immediately above the formatting element in the stack
-                                of open elements. */
-                                $common_ancestor = $this->stack[$fe_s_pos - 1];
-
-                                /* 5. Let a bookmark note the position of the
-                                formatting element in the list of active formatting
-                                elements relative to the elements on either side
-                                of it in the list. */
-                                $bookmark = $fe_af_pos;
-
-                                /* 6. Let node and last node  be the furthest block.
-                                Follow these steps: */
-                                $node = $furthest_block;
-                                $last_node = $furthest_block;
-
-                                while (true) {
-                                    for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) {
-                                        /* 6.1 Let node be the element immediately
-                                        prior to node in the stack of open elements. */
-                                        $node = $this->stack[$n];
-
-                                        /* 6.2 If node is not in the list of active
-                                        formatting elements, then remove node from
-                                        the stack of open elements and then go back
-                                        to step 1. */
-                                        if (!in_array($node, $this->a_formatting, true)) {
-                                            array_splice($this->stack, $n, 1);
-                                        } else {
-                                            break;
-                                        }
-                                    }
-
-                                    /* 6.3 Otherwise, if node is the formatting
-                                    element, then go to the next step in the overall
-                                    algorithm. */
-                                    if ($node === $formatting_element) {
-                                        break;
-
-                                    /* 6.4 Otherwise, if last node is the furthest
-                                    block, then move the aforementioned bookmark to
-                                    be immediately after the node in the list of
-                                    active formatting elements. */
-                                    } elseif ($last_node === $furthest_block) {
-                                        $bookmark = array_search($node, $this->a_formatting, true) + 1;
-                                    }
-
-                                    /* 6.5 Create an element for the token for which
-                                     * the element node was created, replace the entry
-                                     * for node in the list of active formatting
-                                     * elements with an entry for the new element,
-                                     * replace the entry for node in the stack of open
-                                     * elements with an entry for the new element, and
-                                     * let node be the new element. */
-                                    // we don't know what the token is anymore
-                                    // XDOM
-                                    $clone = $node->cloneNode();
-                                    $a_pos = array_search($node, $this->a_formatting, true);
-                                    $s_pos = array_search($node, $this->stack, true);
-                                    $this->a_formatting[$a_pos] = $clone;
-                                    $this->stack[$s_pos] = $clone;
-                                    $node = $clone;
-
-                                    /* 6.6 Insert last node into node, first removing
-                                    it from its previous parent node if any. */
-                                    // XDOM
-                                    if ($last_node->parentNode !== null) {
-                                        $last_node->parentNode->removeChild($last_node);
-                                    }
-
-                                    // XDOM
-                                    $node->appendChild($last_node);
-
-                                    /* 6.7 Let last node be node. */
-                                    $last_node = $node;
-
-                                    /* 6.8 Return to step 1 of this inner set of steps. */
-                                }
-
-                                /* 7. If the common ancestor node is a table, tbody,
-                                 * tfoot, thead, or tr element, then, foster parent
-                                 * whatever last node ended up being in the previous
-                                 * step, first removing it from its previous parent
-                                 * node if any. */
-                                // XDOM
-                                if ($last_node->parentNode) { // common step
-                                    $last_node->parentNode->removeChild($last_node);
-                                }
-                                if (in_array($common_ancestor->tagName, ['table', 'tbody', 'tfoot', 'thead', 'tr'])) {
-                                    $this->fosterParent($last_node);
-                                /* Otherwise, append whatever last node  ended up being
-                                 * in the previous step to the common ancestor node,
-                                 * first removing it from its previous parent node if
-                                 * any. */
-                                } else {
-                                    // XDOM
-                                    $common_ancestor->appendChild($last_node);
-                                }
-
-                                /* 8. Create an element for the token for which the
-                                 * formatting element was created. */
-                                // XDOM
-                                $clone = $formatting_element->cloneNode();
-
-                                /* 9. Take all of the child nodes of the furthest
-                                block and append them to the element created in the
-                                last step. */
-                                // XDOM
-                                while ($furthest_block->hasChildNodes()) {
-                                    $child = $furthest_block->firstChild;
-                                    $furthest_block->removeChild($child);
-                                    $clone->appendChild($child);
-                                }
-
-                                /* 10. Append that clone to the furthest block. */
-                                // XDOM
-                                $furthest_block->appendChild($clone);
-
-                                /* 11. Remove the formatting element from the list
-                                of active formatting elements, and insert the new element
-                                into the list of active formatting elements at the
-                                position of the aforementioned bookmark. */
-                                $fe_af_pos = array_search($formatting_element, $this->a_formatting, true);
-                                array_splice($this->a_formatting, $fe_af_pos, 1);
-
-                                $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1);
-                                $af_part2 = array_slice($this->a_formatting, $bookmark);
-                                $this->a_formatting = array_merge($af_part1, [$clone], $af_part2);
-
-                                /* 12. Remove the formatting element from the stack
-                                of open elements, and insert the new element into the stack
-                                of open elements immediately below the position of the
-                                furthest block in that stack. */
-                                $fe_s_pos = array_search($formatting_element, $this->stack, true);
-                                array_splice($this->stack, $fe_s_pos, 1);
-
-                                $fb_s_pos = array_search($furthest_block, $this->stack, true);
-                                $s_part1 = array_slice($this->stack, 0, $fb_s_pos + 1);
-                                $s_part2 = array_slice($this->stack, $fb_s_pos + 1);
-                                $this->stack = array_merge($s_part1, [$clone], $s_part2);
-
-                                /* 13. Jump back to step 1 in this series of steps. */
-                                unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block);
-                            }
-                        break;
-
-                        case 'applet': case 'button': case 'marquee': case 'object':
-                            /* If the stack of open elements has an element in scope whose
-                            tag name matches the tag name of the token, then generate implied
-                            tags. */
-                            if ($this->elementInScope($token['name'])) {
-                                $this->generateImpliedEndTags();
-
-                                /* Now, if the current node is not an element with the same
-                                tag name as the token, then this is a parse error. */
-                                // XERROR: implement logic
-
-                                /* Pop elements from the stack of open elements  until
-                                 * an element with the same tag name as the token has
-                                 * been popped from the stack. */
-                                do {
-                                    $node = array_pop($this->stack);
-                                } while ($node->tagName !== $token['name']);
-
-                                /* Clear the list of active formatting elements up to the
-                                 * last marker. */
-                                $keys = array_keys($this->a_formatting, self::MARKER, true);
-                                $marker = end($keys);
-
-                                for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) {
-                                    array_pop($this->a_formatting);
-                                }
-                            }
-                            /*else {
-                                // parse error
-                            }*/
-                        break;
-
-                        case 'br':
-                            // Parse error
-                            $this->emitToken([
-                                'name' => 'br',
-                                'type' => HTML5_Tokenizer::STARTTAG,
-                            ]);
-                        break;
-
-                        /* An end tag token not covered by the previous entries */
-                        default:
-                            for ($n = count($this->stack) - 1; $n >= 0; $n--) {
-                                /* Initialise node to be the current node (the bottommost
-                                node of the stack). */
-                                $node = $this->stack[$n];
-
-                                /* If node has the same tag name as the end tag token,
-                                then: */
-                                if ($token['name'] === $node->tagName) {
-                                    /* Generate implied end tags. */
-                                    $this->generateImpliedEndTags();
-
-                                    /* If the tag name of the end tag token does not
-                                    match the tag name of the current node, this is a
-                                    parse error. */
-                                    // XERROR: implement this
-
-                                    /* Pop all the nodes from the current node up to
-                                    node, including node, then stop these steps. */
-                                    // XSKETCHY
-                                    do {
-                                        $pop = array_pop($this->stack);
-                                    } while ($pop !== $node);
-                                    break;
-                                } else {
-                                    $category = $this->getElementCategory($node);
-
-                                    if ($category !== self::FORMATTING && $category !== self::PHRASING) {
-                                        /* Otherwise, if node is in neither the formatting
-                                        category nor the phrasing category, then this is a
-                                        parse error. Stop this algorithm. The end tag token
-                                        is ignored. */
-                                        $this->ignored = true;
-                                        break;
-                                        // parse error
-                                    }
-                                }
-                                /* Set node to the previous entry in the stack of open elements. Loop. */
-                            }
-                        break;
-                    }
-                    break;
-                }
-                break;
-
-            case self::IN_CDATA_RCDATA:
-                if (
-                    $token['type'] === HTML5_Tokenizer::CHARACTER ||
-                    $token['type'] === HTML5_Tokenizer::SPACECHARACTER
-                ) {
-                    $this->insertText($token['data']);
-                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {
-                    // parse error
-                    /* If the current node is a script  element, mark the script
-                     * element as "already executed". */
-                    // probably not necessary
-                    array_pop($this->stack);
-                    $this->mode = $this->original_mode;
-                    $this->emitToken($token);
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'script') {
-                    array_pop($this->stack);
-                    $this->mode = $this->original_mode;
-                    // we're ignoring all of the execution stuff
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG) {
-                    array_pop($this->stack);
-                    $this->mode = $this->original_mode;
-                }
-            break;
-
-            case self::IN_TABLE:
-                $clear = ['html', 'table'];
-
-                /* A character token */
-                if ($token['type'] === HTML5_Tokenizer::CHARACTER ||
-                    $token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
-                    /* Let the pending table character tokens
-                     * be an empty list of tokens. */
-                    $this->pendingTableCharacters = "";
-                    $this->pendingTableCharactersDirty = false;
-                    /* Let the original insertion mode be the current
-                     * insertion mode. */
-                    $this->original_mode = $this->mode;
-                    /* Switch the insertion mode to
-                     * "in table text" and
-                     * reprocess the token. */
-                    $this->mode = self::IN_TABLE_TEXT;
-                    $this->emitToken($token);
-
-                /* A comment token */
-                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
-                    /* Append a Comment node to the current node with the data
-                    attribute set to the data given in the comment token. */
-                    $this->insertComment($token['data']);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
-                    // parse error
-
-                /* A start tag whose tag name is "caption" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                $token['name'] === 'caption') {
-                    /* Clear the stack back to a table context. */
-                    $this->clearStackToTableContext($clear);
-
-                    /* Insert a marker at the end of the list of active
-                    formatting elements. */
-                    $this->a_formatting[] = self::MARKER;
-
-                    /* Insert an HTML element for the token, then switch the
-                    insertion mode to "in caption". */
-                    $this->insertElement($token);
-                    $this->mode = self::IN_CAPTION;
-
-                /* A start tag whose tag name is "colgroup" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                $token['name'] === 'colgroup') {
-                    /* Clear the stack back to a table context. */
-                    $this->clearStackToTableContext($clear);
-
-                    /* Insert an HTML element for the token, then switch the
-                    insertion mode to "in column group". */
-                    $this->insertElement($token);
-                    $this->mode = self::IN_COLUMN_GROUP;
-
-                /* A start tag whose tag name is "col" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                $token['name'] === 'col') {
-                    $this->emitToken([
-                        'name' => 'colgroup',
-                        'type' => HTML5_Tokenizer::STARTTAG,
-                        'attr' => []
-                    ]);
-
-                    $this->emitToken($token);
-
-                /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
-                ['tbody', 'tfoot', 'thead'])) {
-                    /* Clear the stack back to a table context. */
-                    $this->clearStackToTableContext($clear);
-
-                    /* Insert an HTML element for the token, then switch the insertion
-                    mode to "in table body". */
-                    $this->insertElement($token);
-                    $this->mode = self::IN_TABLE_BODY;
-
-                /* A start tag whose tag name is one of: "td", "th", "tr" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                in_array($token['name'], ['td', 'th', 'tr'])) {
-                    /* Act as if a start tag token with the tag name "tbody" had been
-                    seen, then reprocess the current token. */
-                    $this->emitToken([
-                        'name' => 'tbody',
-                        'type' => HTML5_Tokenizer::STARTTAG,
-                        'attr' => []
-                    ]);
-
-                    $this->emitToken($token);
-
-                /* A start tag whose tag name is "table" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                $token['name'] === 'table') {
-                    /* Parse error. Act as if an end tag token with the tag name "table"
-                    had been seen, then, if that token wasn't ignored, reprocess the
-                    current token. */
-                    $this->emitToken([
-                        'name' => 'table',
-                        'type' => HTML5_Tokenizer::ENDTAG
-                    ]);
-
-                    if (!$this->ignored) {
-                        $this->emitToken($token);
-                    }
-
-                /* An end tag whose tag name is "table" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                $token['name'] === 'table') {
-                    /* If the stack of open elements does not have an element in table
-                    scope with the same tag name as the token, this is a parse error.
-                    Ignore the token. (fragment case) */
-                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
-                        $this->ignored = true;
-                    } else {
-                        do {
-                            $node = array_pop($this->stack);
-                        } while ($node->tagName !== 'table');
-
-                        /* Reset the insertion mode appropriately. */
-                        $this->resetInsertionMode();
-                    }
-
-                /* An end tag whose tag name is one of: "body", "caption", "col",
-                "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
-                ['body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td',
-                'tfoot', 'th', 'thead', 'tr'])) {
-                    // Parse error. Ignore the token.
-
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                ($token['name'] === 'style' || $token['name'] === 'script')) {
-                    $this->processWithRulesFor($token, self::IN_HEAD);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'input' &&
-                // assignment is intentional
-                /* If the token does not have an attribute with the name "type", or
-                 * if it does, but that attribute's value is not an ASCII
-                 * case-insensitive match for the string "hidden", then: act as
-                 * described in the "anything else" entry below. */
-                ($type = $this->getAttr($token, 'type')) && strtolower($type) === 'hidden') {
-                    // I.e., if its an input with the type attribute == 'hidden'
-                    /* Otherwise */
-                    // parse error
-                    $this->insertElement($token);
-                    array_pop($this->stack);
-                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {
-                    /* If the current node is not the root html element, then this is a parse error. */
-                    if (end($this->stack)->tagName !== 'html') {
-                        // Note: It can only be the current node in the fragment case.
-                        // parse error
-                    }
-                    /* Stop parsing. */
-                /* Anything else */
-                } else {
-                    /* Parse error. Process the token as if the insertion mode was "in
-                    body", with the following exception: */
-
-                    $old = $this->foster_parent;
-                    $this->foster_parent = true;
-                    $this->processWithRulesFor($token, self::IN_BODY);
-                    $this->foster_parent = $old;
-                }
-            break;
-
-            case self::IN_TABLE_TEXT:
-                /* A character token */
-                if ($token['type'] === HTML5_Tokenizer::CHARACTER) {
-                    /* Append the character token to the pending table
-                     * character tokens list. */
-                    $this->pendingTableCharacters .= $token['data'];
-                    $this->pendingTableCharactersDirty = true;
-                } elseif ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
-                    $this->pendingTableCharacters .= $token['data'];
-                /* Anything else */
-                } else {
-                    if ($this->pendingTableCharacters !== '' && is_string($this->pendingTableCharacters)) {
-                        /* If any of the tokens in the pending table character tokens list
-                         * are character tokens that are not one of U+0009 CHARACTER
-                         * TABULATION, U+000A LINE FEED (LF), U+000C FORM FEED (FF), or
-                         * U+0020 SPACE, then reprocess those character tokens using the
-                         * rules given in the "anything else" entry in the in table"
-                         * insertion mode.*/
-                        if ($this->pendingTableCharactersDirty) {
-                            /* Parse error. Process the token using the rules for the
-                             * "in body" insertion mode, except that if the current
-                             * node is a table, tbody, tfoot, thead, or tr element,
-                             * then, whenever a node would be inserted into the current
-                             * node, it must instead be foster parented. */
-                            // XERROR
-                            $old = $this->foster_parent;
-                            $this->foster_parent = true;
-                            $text_token = [
-                                'type' => HTML5_Tokenizer::CHARACTER,
-                                'data' => $this->pendingTableCharacters,
-                            ];
-                            $this->processWithRulesFor($text_token, self::IN_BODY);
-                            $this->foster_parent = $old;
-
-                        /* Otherwise, insert the characters given by the pending table
-                         * character tokens list into the current node. */
-                        } else {
-                            $this->insertText($this->pendingTableCharacters);
-                        }
-                        $this->pendingTableCharacters = null;
-                        $this->pendingTableCharactersNull = null;
-                    }
-
-                    /* Switch the insertion mode to the original insertion mode and
-                     * reprocess the token.
-                     */
-                    $this->mode = $this->original_mode;
-                    $this->emitToken($token);
-                }
-            break;
-
-            case self::IN_CAPTION:
-                /* An end tag whose tag name is "caption" */
-                if ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'caption') {
-                    /* If the stack of open elements does not have an element in table
-                    scope with the same tag name as the token, this is a parse error.
-                    Ignore the token. (fragment case) */
-                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
-                        $this->ignored = true;
-                        // Ignore
-
-                    /* Otherwise: */
-                    } else {
-                        /* Generate implied end tags. */
-                        $this->generateImpliedEndTags();
-
-                        /* Now, if the current node is not a caption element, then this
-                        is a parse error. */
-                        // XERROR: implement
-
-                        /* Pop elements from this stack until a caption element has
-                        been popped from the stack. */
-                        do {
-                            $node = array_pop($this->stack);
-                        } while ($node->tagName !== 'caption');
-
-                        /* Clear the list of active formatting elements up to the last
-                        marker. */
-                        $this->clearTheActiveFormattingElementsUpToTheLastMarker();
-
-                        /* Switch the insertion mode to "in table". */
-                        $this->mode = self::IN_TABLE;
-                    }
-
-                /* A start tag whose tag name is one of: "caption", "col", "colgroup",
-                "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag
-                name is "table" */
-                } elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
-                ['caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
-                'thead', 'tr'])) || ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                $token['name'] === 'table')) {
-                    /* Parse error. Act as if an end tag with the tag name "caption"
-                    had been seen, then, if that token wasn't ignored, reprocess the
-                    current token. */
-                    $this->emitToken([
-                        'name' => 'caption',
-                        'type' => HTML5_Tokenizer::ENDTAG
-                    ]);
-
-                    if (!$this->ignored) {
-                        $this->emitToken($token);
-                    }
-
-                /* An end tag whose tag name is one of: "body", "col", "colgroup",
-                "html", "tbody", "td", "tfoot", "th", "thead", "tr" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
-                ['body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th',
-                'thead', 'tr'])) {
-                    // Parse error. Ignore the token.
-                    $this->ignored = true;
-                } else {
-                    /* Process the token as if the insertion mode was "in body". */
-                    $this->processWithRulesFor($token, self::IN_BODY);
-                }
-            break;
-
-            case self::IN_COLUMN_GROUP:
-                /* A character token that is one of one of U+0009 CHARACTER TABULATION,
-                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
-                or U+0020 SPACE */
-                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
-                    /* Append the character to the current node. */
-                    $this->insertText($token['data']);
-
-                /* A comment token */
-                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
-                    /* Append a Comment node to the current node with the data
-                    attribute set to the data given in the comment token. */
-                    $this->insertComment($token['data']);
-                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
-                    // parse error
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
-                    $this->processWithRulesFor($token, self::IN_BODY);
-
-                /* A start tag whose tag name is "col" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'col') {
-                    /* Insert a col element for the token. Immediately pop the current
-                    node off the stack of open elements. */
-                    $this->insertElement($token);
-                    array_pop($this->stack);
-                    // XERROR: Acknowledge the token's self-closing flag, if it is set.
-
-                /* An end tag whose tag name is "colgroup" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                $token['name'] === 'colgroup') {
-                    /* If the current node is the root html element, then this is a
-                    parse error, ignore the token. (fragment case) */
-                    if (end($this->stack)->tagName === 'html') {
-                        $this->ignored = true;
-
-                    /* Otherwise, pop the current node (which will be a colgroup
-                    element) from the stack of open elements. Switch the insertion
-                    mode to "in table". */
-                    } else {
-                        array_pop($this->stack);
-                        $this->mode = self::IN_TABLE;
-                    }
-
-                /* An end tag whose tag name is "col" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'col') {
-                    /* Parse error. Ignore the token. */
-                    $this->ignored = true;
-
-                /* An end-of-file token */
-                /* If the current node is the root html  element */
-                } elseif ($token['type'] === HTML5_Tokenizer::EOF && end($this->stack)->tagName === 'html') {
-                    /* Stop parsing */
-
-                /* Anything else */
-                } else {
-                    /* Act as if an end tag with the tag name "colgroup" had been seen,
-                    and then, if that token wasn't ignored, reprocess the current token. */
-                    $this->emitToken([
-                        'name' => 'colgroup',
-                        'type' => HTML5_Tokenizer::ENDTAG
-                    ]);
-
-                    if (!$this->ignored) {
-                        $this->emitToken($token);
-                    }
-                }
-            break;
-
-            case self::IN_TABLE_BODY:
-                $clear = ['tbody', 'tfoot', 'thead', 'html'];
-
-                /* A start tag whose tag name is "tr" */
-                if ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'tr') {
-                    /* Clear the stack back to a table body context. */
-                    $this->clearStackToTableContext($clear);
-
-                    /* Insert a tr element for the token, then switch the insertion
-                    mode to "in row". */
-                    $this->insertElement($token);
-                    $this->mode = self::IN_ROW;
-
-                /* A start tag whose tag name is one of: "th", "td" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                ($token['name'] === 'th' ||    $token['name'] === 'td')) {
-                    /* Parse error. Act as if a start tag with the tag name "tr" had
-                    been seen, then reprocess the current token. */
-                    $this->emitToken([
-                        'name' => 'tr',
-                        'type' => HTML5_Tokenizer::STARTTAG,
-                        'attr' => []
-                    ]);
-
-                    $this->emitToken($token);
-
-                /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                in_array($token['name'], ['tbody', 'tfoot', 'thead'])) {
-                    /* If the stack of open elements does not have an element in table
-                    scope with the same tag name as the token, this is a parse error.
-                    Ignore the token. */
-                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
-                        // Parse error
-                        $this->ignored = true;
-
-                    /* Otherwise: */
-                    } else {
-                        /* Clear the stack back to a table body context. */
-                        $this->clearStackToTableContext($clear);
-
-                        /* Pop the current node from the stack of open elements. Switch
-                        the insertion mode to "in table". */
-                        array_pop($this->stack);
-                        $this->mode = self::IN_TABLE;
-                    }
-
-                /* A start tag whose tag name is one of: "caption", "col", "colgroup",
-                "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */
-                } elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
-                ['caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead'])) ||
-                ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'table')) {
-                    /* If the stack of open elements does not have a tbody, thead, or
-                    tfoot element in table scope, this is a parse error. Ignore the
-                    token. (fragment case) */
-                    if (!$this->elementInScope(['tbody', 'thead', 'tfoot'], self::SCOPE_TABLE)) {
-                        // parse error
-                        $this->ignored = true;
-
-                    /* Otherwise: */
-                    } else {
-                        /* Clear the stack back to a table body context. */
-                        $this->clearStackToTableContext($clear);
-
-                        /* Act as if an end tag with the same tag name as the current
-                        node ("tbody", "tfoot", or "thead") had been seen, then
-                        reprocess the current token. */
-                        $this->emitToken([
-                            'name' => end($this->stack)->tagName,
-                            'type' => HTML5_Tokenizer::ENDTAG
-                        ]);
-
-                        $this->emitToken($token);
-                    }
-
-                /* An end tag whose tag name is one of: "body", "caption", "col",
-                "colgroup", "html", "td", "th", "tr" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
-                ['body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'])) {
-                    /* Parse error. Ignore the token. */
-                    $this->ignored = true;
-
-                /* Anything else */
-                } else {
-                    /* Process the token as if the insertion mode was "in table". */
-                    $this->processWithRulesFor($token, self::IN_TABLE);
-                }
-            break;
-
-            case self::IN_ROW:
-                $clear = ['tr', 'html'];
-
-                /* A start tag whose tag name is one of: "th", "td" */
-                if ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                ($token['name'] === 'th' || $token['name'] === 'td')) {
-                    /* Clear the stack back to a table row context. */
-                    $this->clearStackToTableContext($clear);
-
-                    /* Insert an HTML element for the token, then switch the insertion
-                    mode to "in cell". */
-                    $this->insertElement($token);
-                    $this->mode = self::IN_CELL;
-
-                    /* Insert a marker at the end of the list of active formatting
-                    elements. */
-                    $this->a_formatting[] = self::MARKER;
-
-                /* An end tag whose tag name is "tr" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'tr') {
-                    /* If the stack of open elements does not have an element in table
-                    scope with the same tag name as the token, this is a parse error.
-                    Ignore the token. (fragment case) */
-                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
-                        // Ignore.
-                        $this->ignored = true;
-                    } else {
-                        /* Clear the stack back to a table row context. */
-                        $this->clearStackToTableContext($clear);
-
-                        /* Pop the current node (which will be a tr element) from the
-                        stack of open elements. Switch the insertion mode to "in table
-                        body". */
-                        array_pop($this->stack);
-                        $this->mode = self::IN_TABLE_BODY;
-                    }
-
-                /* A start tag whose tag name is one of: "caption", "col", "colgroup",
-                "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */
-                } elseif (($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
-                ['caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'])) ||
-                ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'table')) {
-                    /* Act as if an end tag with the tag name "tr" had been seen, then,
-                    if that token wasn't ignored, reprocess the current token. */
-                    $this->emitToken([
-                        'name' => 'tr',
-                        'type' => HTML5_Tokenizer::ENDTAG
-                    ]);
-                    if (!$this->ignored) {
-                        $this->emitToken($token);
-                    }
-
-                /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                in_array($token['name'], ['tbody', 'tfoot', 'thead'])) {
-                    /* If the stack of open elements does not have an element in table
-                    scope with the same tag name as the token, this is a parse error.
-                    Ignore the token. */
-                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
-                        $this->ignored = true;
-
-                    /* Otherwise: */
-                    } else {
-                        /* Otherwise, act as if an end tag with the tag name "tr" had
-                        been seen, then reprocess the current token. */
-                        $this->emitToken([
-                            'name' => 'tr',
-                            'type' => HTML5_Tokenizer::ENDTAG
-                        ]);
-
-                        $this->emitToken($token);
-                    }
-
-                /* An end tag whose tag name is one of: "body", "caption", "col",
-                "colgroup", "html", "td", "th" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
-                ['body', 'caption', 'col', 'colgroup', 'html', 'td', 'th'])) {
-                    /* Parse error. Ignore the token. */
-                    $this->ignored = true;
-
-                /* Anything else */
-                } else {
-                    /* Process the token as if the insertion mode was "in table". */
-                    $this->processWithRulesFor($token, self::IN_TABLE);
-                }
-            break;
-
-            case self::IN_CELL:
-                /* An end tag whose tag name is one of: "td", "th" */
-                if ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                ($token['name'] === 'td' || $token['name'] === 'th')) {
-                    /* If the stack of open elements does not have an element in table
-                    scope with the same tag name as that of the token, then this is a
-                    parse error and the token must be ignored. */
-                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
-                        $this->ignored = true;
-
-                    /* Otherwise: */
-                    } else {
-                        /* Generate implied end tags, except for elements with the same
-                        tag name as the token. */
-                        $this->generateImpliedEndTags([$token['name']]);
-
-                        /* Now, if the current node is not an element with the same tag
-                        name as the token, then this is a parse error. */
-                        // XERROR: Implement parse error code
-
-                        /* Pop elements from this stack until an element with the same
-                        tag name as the token has been popped from the stack. */
-                        do {
-                            $node = array_pop($this->stack);
-                        } while ($node->tagName !== $token['name']);
-
-                        /* Clear the list of active formatting elements up to the last
-                        marker. */
-                        $this->clearTheActiveFormattingElementsUpToTheLastMarker();
-
-                        /* Switch the insertion mode to "in row". (The current node
-                        will be a tr element at this point.) */
-                        $this->mode = self::IN_ROW;
-                    }
-
-                /* A start tag whose tag name is one of: "caption", "col", "colgroup",
-                "tbody", "td", "tfoot", "th", "thead", "tr" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && in_array($token['name'],
-                ['caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th',
-                'thead', 'tr'])) {
-                    /* If the stack of open elements does not have a td or th element
-                    in table scope, then this is a parse error; ignore the token.
-                    (fragment case) */
-                    if (!$this->elementInScope(['td', 'th'], self::SCOPE_TABLE)) {
-                        // parse error
-                        $this->ignored = true;
-
-                    /* Otherwise, close the cell (see below) and reprocess the current
-                    token. */
-                    } else {
-                        $this->closeCell();
-                        $this->emitToken($token);
-                    }
-
-                /* An end tag whose tag name is one of: "body", "caption", "col",
-                "colgroup", "html" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
-                ['body', 'caption', 'col', 'colgroup', 'html'])) {
-                    /* Parse error. Ignore the token. */
-                    $this->ignored = true;
-
-                /* An end tag whose tag name is one of: "table", "tbody", "tfoot",
-                "thead", "tr" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && in_array($token['name'],
-                ['table', 'tbody', 'tfoot', 'thead', 'tr'])) {
-                    /* If the stack of open elements does not have a td or th element
-                    in table scope, then this is a parse error; ignore the token.
-                    (innerHTML case) */
-                    if (!$this->elementInScope(['td', 'th'], self::SCOPE_TABLE)) {
-                        // Parse error
-                        $this->ignored = true;
-
-                    /* Otherwise, close the cell (see below) and reprocess the current
-                    token. */
-                    } else {
-                        $this->closeCell();
-                        $this->emitToken($token);
-                    }
-
-                /* Anything else */
-                } else {
-                    /* Process the token as if the insertion mode was "in body". */
-                    $this->processWithRulesFor($token, self::IN_BODY);
-                }
-            break;
-
-            case self::IN_SELECT:
-                /* Handle the token as follows: */
-
-                /* A character token */
-                if (
-                    $token['type'] === HTML5_Tokenizer::CHARACTER ||
-                    $token['type'] === HTML5_Tokenizer::SPACECHARACTER
-                ) {
-                    /* Append the token's character to the current node. */
-                    $this->insertText($token['data']);
-
-                /* A comment token */
-                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
-                    /* Append a Comment node to the current node with the data
-                    attribute set to the data given in the comment token. */
-                    $this->insertComment($token['data']);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
-                    // parse error
-
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
-                    $this->processWithRulesFor($token, self::IN_BODY);
-
-                /* A start tag token whose tag name is "option" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                $token['name'] === 'option') {
-                    /* If the current node is an option element, act as if an end tag
-                    with the tag name "option" had been seen. */
-                    if (end($this->stack)->tagName === 'option') {
-                        $this->emitToken([
-                            'name' => 'option',
-                            'type' => HTML5_Tokenizer::ENDTAG
-                        ]);
-                    }
-
-                    /* Insert an HTML element for the token. */
-                    $this->insertElement($token);
-
-                /* A start tag token whose tag name is "optgroup" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                $token['name'] === 'optgroup') {
-                    /* If the current node is an option element, act as if an end tag
-                    with the tag name "option" had been seen. */
-                    if (end($this->stack)->tagName === 'option') {
-                        $this->emitToken([
-                            'name' => 'option',
-                            'type' => HTML5_Tokenizer::ENDTAG
-                        ]);
-                    }
-
-                    /* If the current node is an optgroup element, act as if an end tag
-                    with the tag name "optgroup" had been seen. */
-                    if (end($this->stack)->tagName === 'optgroup') {
-                        $this->emitToken([
-                            'name' => 'optgroup',
-                            'type' => HTML5_Tokenizer::ENDTAG
-                        ]);
-                    }
-
-                    /* Insert an HTML element for the token. */
-                    $this->insertElement($token);
-
-                /* An end tag token whose tag name is "optgroup" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                $token['name'] === 'optgroup') {
-                    /* First, if the current node is an option element, and the node
-                    immediately before it in the stack of open elements is an optgroup
-                    element, then act as if an end tag with the tag name "option" had
-                    been seen. */
-                    $elements_in_stack = count($this->stack);
-
-                    if ($this->stack[$elements_in_stack - 1]->tagName === 'option' &&
-                    $this->stack[$elements_in_stack - 2]->tagName === 'optgroup') {
-                        $this->emitToken([
-                            'name' => 'option',
-                            'type' => HTML5_Tokenizer::ENDTAG
-                        ]);
-                    }
-
-                    /* If the current node is an optgroup element, then pop that node
-                    from the stack of open elements. Otherwise, this is a parse error,
-                    ignore the token. */
-                    if (end($this->stack)->tagName === 'optgroup') {
-                        array_pop($this->stack);
-                    } else {
-                        // parse error
-                        $this->ignored = true;
-                    }
-
-                /* An end tag token whose tag name is "option" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                $token['name'] === 'option') {
-                    /* If the current node is an option element, then pop that node
-                    from the stack of open elements. Otherwise, this is a parse error,
-                    ignore the token. */
-                    if (end($this->stack)->tagName === 'option') {
-                        array_pop($this->stack);
-                    } else {
-                        // parse error
-                        $this->ignored = true;
-                    }
-
-                /* An end tag whose tag name is "select" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                $token['name'] === 'select') {
-                    /* If the stack of open elements does not have an element in table
-                    scope with the same tag name as the token, this is a parse error.
-                    Ignore the token. (fragment case) */
-                    if (!$this->elementInScope($token['name'], self::SCOPE_TABLE)) {
-                        $this->ignored = true;
-                        // parse error
-
-                    /* Otherwise: */
-                    } else {
-                        /* Pop elements from the stack of open elements until a select
-                        element has been popped from the stack. */
-                        do {
-                            $node = array_pop($this->stack);
-                        } while ($node->tagName !== 'select');
-
-                        /* Reset the insertion mode appropriately. */
-                        $this->resetInsertionMode();
-                    }
-
-                /* A start tag whose tag name is "select" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'select') {
-                    /* Parse error. Act as if the token had been an end tag with the
-                    tag name "select" instead. */
-                    $this->emitToken([
-                        'name' => 'select',
-                        'type' => HTML5_Tokenizer::ENDTAG
-                    ]);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                ($token['name'] === 'input' || $token['name'] === 'keygen' ||  $token['name'] === 'textarea')) {
-                    // parse error
-                    $this->emitToken([
-                        'name' => 'select',
-                        'type' => HTML5_Tokenizer::ENDTAG
-                    ]);
-                    $this->emitToken($token);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'script') {
-                    $this->processWithRulesFor($token, self::IN_HEAD);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {
-                    // XERROR: If the current node is not the root html element, then this is a parse error.
-                    /* Stop parsing */
-
-                /* Anything else */
-                } else {
-                    /* Parse error. Ignore the token. */
-                    $this->ignored = true;
-                }
-            break;
-
-            case self::IN_SELECT_IN_TABLE:
-
-                if ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                in_array($token['name'], ['caption', 'table', 'tbody',
-                'tfoot', 'thead', 'tr', 'td', 'th'])) {
-                    // parse error
-                    $this->emitToken([
-                        'name' => 'select',
-                        'type' => HTML5_Tokenizer::ENDTAG,
-                    ]);
-                    $this->emitToken($token);
-
-                /* An end tag whose tag name is one of: "caption", "table", "tbody",
-                "tfoot", "thead", "tr", "td", "th" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                in_array($token['name'], ['caption', 'table', 'tbody', 'tfoot', 'thead', 'tr', 'td', 'th']))  {
-                    /* Parse error. */
-                    // parse error
-
-                    /* If the stack of open elements has an element in table scope with
-                    the same tag name as that of the token, then act as if an end tag
-                    with the tag name "select" had been seen, and reprocess the token.
-                    Otherwise, ignore the token. */
-                    if ($this->elementInScope($token['name'], self::SCOPE_TABLE)) {
-                        $this->emitToken([
-                            'name' => 'select',
-                            'type' => HTML5_Tokenizer::ENDTAG
-                        ]);
-
-                        $this->emitToken($token);
-                    } else {
-                        $this->ignored = true;
-                    }
-                } else {
-                    $this->processWithRulesFor($token, self::IN_SELECT);
-                }
-            break;
-
-            case self::IN_FOREIGN_CONTENT:
-                if ($token['type'] === HTML5_Tokenizer::CHARACTER ||
-                $token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
-                    $this->insertText($token['data']);
-                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
-                    $this->insertComment($token['data']);
-                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
-                    // XERROR: parse error
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                $token['name'] === 'script' && end($this->stack)->tagName === 'script' &&
-                // XDOM
-                end($this->stack)->namespaceURI === self::NS_SVG) {
-                    array_pop($this->stack);
-                    // a bunch of script running mumbo jumbo
-                } elseif (
-                    ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                        ((
-                            $token['name'] !== 'mglyph' &&
-                            $token['name'] !== 'malignmark' &&
-                            // XDOM
-                            end($this->stack)->namespaceURI === self::NS_MATHML &&
-                            in_array(end($this->stack)->tagName, ['mi', 'mo', 'mn', 'ms', 'mtext'])
-                        ) ||
-                        (
-                            $token['name'] === 'svg' &&
-                            // XDOM
-                            end($this->stack)->namespaceURI === self::NS_MATHML &&
-                            end($this->stack)->tagName === 'annotation-xml'
-                        ) ||
-                        (
-                            // XDOM
-                            end($this->stack)->namespaceURI === self::NS_SVG &&
-                            in_array(end($this->stack)->tagName, ['foreignObject', 'desc', 'title'])
-                        ) ||
-                        (
-                            // XSKETCHY && XDOM
-                            end($this->stack)->namespaceURI === self::NS_HTML
-                        ))
-                    ) || $token['type'] === HTML5_Tokenizer::ENDTAG
-                ) {
-                    $this->processWithRulesFor($token, $this->secondary_mode);
-                    /* If, after doing so, the insertion mode is still "in foreign
-                     * content", but there is no element in scope that has a namespace
-                     * other than the HTML namespace, switch the insertion mode to the
-                     * secondary insertion mode. */
-                    if ($this->mode === self::IN_FOREIGN_CONTENT) {
-                        $found = false;
-                        // this basically duplicates elementInScope()
-                        for ($i = count($this->stack) - 1; $i >= 0; $i--) {
-                            // XDOM
-                            $node = $this->stack[$i];
-                            if ($node->namespaceURI !== self::NS_HTML) {
-                                $found = true;
-                                break;
-                            } elseif (in_array($node->tagName, ['table', 'html',
-                            'applet', 'caption', 'td', 'th', 'button', 'marquee',
-                            'object']) || ($node->tagName === 'foreignObject' &&
-                            $node->namespaceURI === self::NS_SVG)) {
-                                break;
-                            }
-                        }
-                        if (!$found) {
-                            $this->mode = $this->secondary_mode;
-                        }
-                    }
-                } elseif ($token['type'] === HTML5_Tokenizer::EOF || (
-                $token['type'] === HTML5_Tokenizer::STARTTAG &&
-                (in_array($token['name'], ['b', "big", "blockquote", "body", "br",
-                "center", "code", "dc", "dd", "div", "dl", "ds", "dt", "em", "embed", "h1", "h2",
-                "h3", "h4", "h5", "h6", "head", "hr", "i", "img", "li", "listing",
-                "menu", "meta", "nobr", "ol", "p", "pre", "ruby", "s",  "small",
-                "span", "strong", "strike",  "sub", "sup", "table", "tt", "u", "ul",
-                "var"]) || ($token['name'] === 'font' && ($this->getAttr($token, 'color') ||
-                $this->getAttr($token, 'face') || $this->getAttr($token, 'size')))))) {
-                    // XERROR: parse error
-                    do {
-                        $node = array_pop($this->stack);
-                        // XDOM
-                    } while ($node->namespaceURI !== self::NS_HTML);
-                    $this->stack[] = $node;
-                    $this->mode = $this->secondary_mode;
-                    $this->emitToken($token);
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG) {
-                    static $svg_lookup = [
-                        'altglyph' => 'altGlyph',
-                        'altglyphdef' => 'altGlyphDef',
-                        'altglyphitem' => 'altGlyphItem',
-                        'animatecolor' => 'animateColor',
-                        'animatemotion' => 'animateMotion',
-                        'animatetransform' => 'animateTransform',
-                        'clippath' => 'clipPath',
-                        'feblend' => 'feBlend',
-                        'fecolormatrix' => 'feColorMatrix',
-                        'fecomponenttransfer' => 'feComponentTransfer',
-                        'fecomposite' => 'feComposite',
-                        'feconvolvematrix' => 'feConvolveMatrix',
-                        'fediffuselighting' => 'feDiffuseLighting',
-                        'fedisplacementmap' => 'feDisplacementMap',
-                        'fedistantlight' => 'feDistantLight',
-                        'feflood' => 'feFlood',
-                        'fefunca' => 'feFuncA',
-                        'fefuncb' => 'feFuncB',
-                        'fefuncg' => 'feFuncG',
-                        'fefuncr' => 'feFuncR',
-                        'fegaussianblur' => 'feGaussianBlur',
-                        'feimage' => 'feImage',
-                        'femerge' => 'feMerge',
-                        'femergenode' => 'feMergeNode',
-                        'femorphology' => 'feMorphology',
-                        'feoffset' => 'feOffset',
-                        'fepointlight' => 'fePointLight',
-                        'fespecularlighting' => 'feSpecularLighting',
-                        'fespotlight' => 'feSpotLight',
-                        'fetile' => 'feTile',
-                        'feturbulence' => 'feTurbulence',
-                        'foreignobject' => 'foreignObject',
-                        'glyphref' => 'glyphRef',
-                        'lineargradient' => 'linearGradient',
-                        'radialgradient' => 'radialGradient',
-                        'textpath' => 'textPath',
-                    ];
-                    // XDOM
-                    $current = end($this->stack);
-                    if ($current->namespaceURI === self::NS_MATHML) {
-                        $token = $this->adjustMathMLAttributes($token);
-                    }
-                    if ($current->namespaceURI === self::NS_SVG &&
-                    isset($svg_lookup[$token['name']])) {
-                        $token['name'] = $svg_lookup[$token['name']];
-                    }
-                    if ($current->namespaceURI === self::NS_SVG) {
-                        $token = $this->adjustSVGAttributes($token);
-                    }
-                    $token = $this->adjustForeignAttributes($token);
-                    $this->insertForeignElement($token, $current->namespaceURI);
-                    if (isset($token['self-closing'])) {
-                        array_pop($this->stack);
-                        // XERROR: acknowledge self-closing flag
-                    }
-                }
-            break;
-
-            case self::AFTER_BODY:
-                /* Handle the token as follows: */
-
-                /* A character token that is one of one of U+0009 CHARACTER TABULATION,
-                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
-                or U+0020 SPACE */
-                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
-                    /* Process the token as it would be processed if the insertion mode
-                    was "in body". */
-                    $this->processWithRulesFor($token, self::IN_BODY);
-
-                /* A comment token */
-                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
-                    /* Append a Comment node to the first element in the stack of open
-                    elements (the html element), with the data attribute set to the
-                    data given in the comment token. */
-                    // XDOM
-                    $comment = $this->dom->createComment($token['data']);
-                    $this->stack[0]->appendChild($comment);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
-                    // parse error
-
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
-                    $this->processWithRulesFor($token, self::IN_BODY);
-
-                /* An end tag with the tag name "html" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG && $token['name'] === 'html') {
-                    /*     If the parser was originally created as part of the HTML
-                     *     fragment parsing algorithm, this is a parse error; ignore
-                     *     the token. (fragment case) */
-                    $this->ignored = true;
-                    // XERROR: implement this
-
-                    $this->mode = self::AFTER_AFTER_BODY;
-
-                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {
-                    /* Stop parsing */
-
-                /* Anything else */
-                } else {
-                    /* Parse error. Set the insertion mode to "in body" and reprocess
-                    the token. */
-                    $this->mode = self::IN_BODY;
-                    $this->emitToken($token);
-                }
-            break;
-
-            case self::IN_FRAMESET:
-                /* Handle the token as follows: */
-
-                /* A character token that is one of one of U+0009 CHARACTER TABULATION,
-                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
-                U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
-                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
-                    /* Append the character to the current node. */
-                    $this->insertText($token['data']);
-
-                /* A comment token */
-                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
-                    /* Append a Comment node to the current node with the data
-                    attribute set to the data given in the comment token. */
-                    $this->insertComment($token['data']);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
-                    // parse error
-
-                /* A start tag with the tag name "frameset" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                $token['name'] === 'frameset') {
-                    $this->insertElement($token);
-
-                /* An end tag with the tag name "frameset" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                $token['name'] === 'frameset') {
-                    /* If the current node is the root html element, then this is a
-                    parse error; ignore the token. (fragment case) */
-                    if (end($this->stack)->tagName === 'html') {
-                        $this->ignored = true;
-                        // Parse error
-
-                    } else {
-                        /* Otherwise, pop the current node from the stack of open
-                        elements. */
-                        array_pop($this->stack);
-
-                        /* If the parser was not originally created as part of the HTML
-                         * fragment parsing algorithm  (fragment case), and the current
-                         * node is no longer a frameset element, then switch the
-                         * insertion mode to "after frameset". */
-                        $this->mode = self::AFTER_FRAMESET;
-                    }
-
-                /* A start tag with the tag name "frame" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                $token['name'] === 'frame') {
-                    /* Insert an HTML element for the token. */
-                    $this->insertElement($token);
-
-                    /* Immediately pop the current node off the stack of open elements. */
-                    array_pop($this->stack);
-
-                    // XERROR: Acknowledge the token's self-closing flag, if it is set.
-
-                /* A start tag with the tag name "noframes" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                $token['name'] === 'noframes') {
-                    /* Process the token using the rules for the "in head" insertion mode. */
-                    $this->processwithRulesFor($token, self::IN_HEAD);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {
-                    // XERROR: If the current node is not the root html element, then this is a parse error.
-                    /* Stop parsing */
-                /* Anything else */
-                } else {
-                    /* Parse error. Ignore the token. */
-                    $this->ignored = true;
-                }
-            break;
-
-            case self::AFTER_FRAMESET:
-                /* Handle the token as follows: */
-
-                /* A character token that is one of one of U+0009 CHARACTER TABULATION,
-                U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF),
-                U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */
-                if ($token['type'] === HTML5_Tokenizer::SPACECHARACTER) {
-                    /* Append the character to the current node. */
-                    $this->insertText($token['data']);
-
-                /* A comment token */
-                } elseif ($token['type'] === HTML5_Tokenizer::COMMENT) {
-                    /* Append a Comment node to the current node with the data
-                    attribute set to the data given in the comment token. */
-                    $this->insertComment($token['data']);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE) {
-                    // parse error
-
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html') {
-                    $this->processWithRulesFor($token, self::IN_BODY);
-
-                /* An end tag with the tag name "html" */
-                } elseif ($token['type'] === HTML5_Tokenizer::ENDTAG &&
-                $token['name'] === 'html') {
-                    $this->mode = self::AFTER_AFTER_FRAMESET;
-
-                /* A start tag with the tag name "noframes" */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG &&
-                $token['name'] === 'noframes') {
-                    $this->processWithRulesFor($token, self::IN_HEAD);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {
-                    /* Stop parsing */
-
-                /* Anything else */
-                } else {
-                    /* Parse error. Ignore the token. */
-                    $this->ignored = true;
-                }
-            break;
-
-            case self::AFTER_AFTER_BODY:
-                /* A comment token */
-                if ($token['type'] === HTML5_Tokenizer::COMMENT) {
-                    /* Append a Comment node to the Document object with the data
-                    attribute set to the data given in the comment token. */
-                    // XDOM
-                    $comment = $this->dom->createComment($token['data']);
-                    $this->dom->appendChild($comment);
-
-                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE ||
-                $token['type'] === HTML5_Tokenizer::SPACECHARACTER ||
-                ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html')) {
-                    $this->processWithRulesFor($token, self::IN_BODY);
-
-                /* An end-of-file token */
-                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {
-                    /* OMG DONE!! */
-                } else {
-                    // parse error
-                    $this->mode = self::IN_BODY;
-                    $this->emitToken($token);
-                }
-            break;
-
-            case self::AFTER_AFTER_FRAMESET:
-                /* A comment token */
-                if ($token['type'] === HTML5_Tokenizer::COMMENT) {
-                    /* Append a Comment node to the Document object with the data
-                    attribute set to the data given in the comment token. */
-                    // XDOM
-                    $comment = $this->dom->createComment($token['data']);
-                    $this->dom->appendChild($comment);
-                } elseif ($token['type'] === HTML5_Tokenizer::DOCTYPE ||
-                $token['type'] === HTML5_Tokenizer::SPACECHARACTER ||
-                ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'html')) {
-                    $this->processWithRulesFor($token, self::IN_BODY);
-
-                /* An end-of-file token */
-                } elseif ($token['type'] === HTML5_Tokenizer::EOF) {
-                    /* OMG DONE!! */
-                } elseif ($token['type'] === HTML5_Tokenizer::STARTTAG && $token['name'] === 'nofrmaes') {
-                    $this->processWithRulesFor($token, self::IN_HEAD);
-                } else {
-                    // parse error
-                }
-            break;
-        }
-    }
-
-    private function insertElement($token, $append = true) {
-        $el = $this->dom->createElementNS(self::NS_HTML, $token['name']);
-
-        if (!empty($token['attr'])) {
-            foreach ($token['attr'] as $attr) {
-                if (!$el->hasAttribute($attr['name']) && preg_match("/^[a-zA-Z_:]/", $attr['name'])) {
-                    $el->setAttribute($attr['name'], $attr['value']);
-                }
-            }
-        }
-        if ($append) {
-            $this->appendToRealParent($el);
-            $this->stack[] = $el;
-        }
-
-        return $el;
-    }
-
-    /**
-     * @param $data
-     */
-    private function insertText($data) {
-        if ($data === '') {
-            return;
-        }
-        if ($this->ignore_lf_token) {
-            if ($data[0] === "\n") {
-                $data = substr($data, 1);
-                if ($data === false) {
-                    return;
-                }
-            }
-        }
-        $text = $this->dom->createTextNode($data);
-        $this->appendToRealParent($text);
-    }
-
-    /**
-     * @param $data
-     */
-    private function insertComment($data) {
-        $comment = $this->dom->createComment($data);
-        $this->appendToRealParent($comment);
-    }
-
-    /**
-     * @param $node
-     */
-    private function appendToRealParent($node) {
-        // this is only for the foster_parent case
-        /* If the current node is a table, tbody, tfoot, thead, or tr
-        element, then, whenever a node would be inserted into the current
-        node, it must instead be inserted into the foster parent element. */
-        if (
-            !$this->foster_parent ||
-            !in_array(
-                end($this->stack)->tagName,
-                ['table', 'tbody', 'tfoot', 'thead', 'tr']
-            )
-        ) {
-            end($this->stack)->appendChild($node);
-        } else {
-            $this->fosterParent($node);
-        }
-    }
-
-    /**
-     * @param $el
-     * @param int $scope
-     * @return bool|null
-     */
-    private function elementInScope($el, $scope = self::SCOPE) {
-        if (is_array($el)) {
-            foreach($el as $element) {
-                if ($this->elementInScope($element, $scope)) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        $leng = count($this->stack);
-
-        for ($n = 0; $n < $leng; $n++) {
-            /* 1. Initialise node to be the current node (the bottommost node of
-            the stack). */
-            $node = $this->stack[$leng - 1 - $n];
-
-            if ($node->tagName === $el) {
-                /* 2. If node is the target node, terminate in a match state. */
-                return true;
-
-                // We've expanded the logic for these states a little differently;
-                // Hixie's refactoring into "specific scope" is more general, but
-                // this "gets the job done"
-
-            // these are the common states for all scopes
-            } elseif ($node->tagName === 'table' || $node->tagName === 'html') {
-                return false;
-
-            // these are valid for "in scope" and "in list item scope"
-            } elseif ($scope !== self::SCOPE_TABLE &&
-            (in_array($node->tagName, ['applet', 'caption', 'td',
-                'th', 'button', 'marquee', 'object']) ||
-                $node->tagName === 'foreignObject' && $node->namespaceURI === self::NS_SVG)) {
-                return false;
-
-
-            // these are valid for "in list item scope"
-            } elseif ($scope === self::SCOPE_LISTITEM && in_array($node->tagName, ['ol', 'ul'])) {
-                return false;
-            }
-
-            /* Otherwise, set node to the previous entry in the stack of open
-            elements and return to step 2. (This will never fail, since the loop
-            will always terminate in the previous step if the top of the stack
-            is reached.) */
-        }
-
-        // To fix warning. This never happens or should return true/false
-        return null;
-    }
-
-    /**
-     * @return bool
-     */
-    private function reconstructActiveFormattingElements() {
-        /* 1. If there are no entries in the list of active formatting elements,
-        then there is nothing to reconstruct; stop this algorithm. */
-        $formatting_elements = count($this->a_formatting);
-
-        if ($formatting_elements === 0) {
-            return false;
-        }
-
-        /* 3. Let entry be the last (most recently added) element in the list
-        of active formatting elements. */
-        $entry = end($this->a_formatting);
-
-        /* 2. If the last (most recently added) entry in the list of active
-        formatting elements is a marker, or if it is an element that is in the
-        stack of open elements, then there is nothing to reconstruct; stop this
-        algorithm. */
-        if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
-            return false;
-        }
-
-        for ($a = $formatting_elements - 1; $a >= 0; true) {
-            /* 4. If there are no entries before entry in the list of active
-            formatting elements, then jump to step 8. */
-            if ($a === 0) {
-                $step_seven = false;
-                break;
-            }
-
-            /* 5. Let entry be the entry one earlier than entry in the list of
-            active formatting elements. */
-            $a--;
-            $entry = $this->a_formatting[$a];
-
-            /* 6. If entry is neither a marker nor an element that is also in
-            thetack of open elements, go to step 4. */
-            if ($entry === self::MARKER || in_array($entry, $this->stack, true)) {
-                break;
-            }
-        }
-
-        while (true) {
-            /* 7. Let entry be the element one later than entry in the list of
-            active formatting elements. */
-            if (isset($step_seven) && $step_seven === true) {
-                $a++;
-                $entry = $this->a_formatting[$a];
-            }
-
-            /* 8. Perform a shallow clone of the element entry to obtain clone. */
-            $clone = $entry->cloneNode();
-
-            /* 9. Append clone to the current node and push it onto the stack
-            of open elements  so that it is the new current node. */
-            $this->appendToRealParent($clone);
-            $this->stack[] = $clone;
-
-            /* 10. Replace the entry for entry in the list with an entry for
-            clone. */
-            $this->a_formatting[$a] = $clone;
-
-            /* 11. If the entry for clone in the list of active formatting
-            elements is not the last entry in the list, return to step 7. */
-            if (end($this->a_formatting) !== $clone) {
-                $step_seven = true;
-            } else {
-                break;
-            }
-        }
-
-        // Return value not in use ATM. Would just make sense to also return true here.
-        return true;
-    }
-
-    /**
-     *
-     */
-    private function clearTheActiveFormattingElementsUpToTheLastMarker() {
-        /* When the steps below require the UA to clear the list of active
-        formatting elements up to the last marker, the UA must perform the
-        following steps: */
-
-        while (true) {
-            /* 1. Let entry be the last (most recently added) entry in the list
-            of active formatting elements. */
-            $entry = end($this->a_formatting);
-
-            /* 2. Remove entry from the list of active formatting elements. */
-            array_pop($this->a_formatting);
-
-            /* 3. If entry was a marker, then stop the algorithm at this point.
-            The list has been cleared up to the last marker. */
-            if ($entry === self::MARKER) {
-                break;
-            }
-        }
-    }
-
-    /**
-     * @param array $exclude
-     */
-    private function generateImpliedEndTags($exclude = []) {
-        /* When the steps below require the UA to generate implied end tags,
-         * then, while the current node is a dc element, a dd element, a ds
-         * element, a dt element, an li element, an option element, an optgroup
-         * element, a p element, an rp element, or an rt element, the UA must
-         * pop the current node off the stack of open elements. */
-        $node = end($this->stack);
-        $elements = array_diff(['dc', 'dd', 'ds', 'dt', 'li', 'p', 'td', 'th', 'tr'], $exclude);
-
-        while (in_array(end($this->stack)->tagName, $elements)) {
-            array_pop($this->stack);
-        }
-    }
-
-    /**
-     * @param $node
-     * @return int
-     */
-    private function getElementCategory($node) {
-        if (!is_object($node)) {
-            debug_print_backtrace();
-        }
-        $name = $node->tagName;
-        if (in_array($name, $this->special)) {
-            return self::SPECIAL;
-        } elseif (in_array($name, $this->scoping)) {
-            return self::SCOPING;
-        } elseif (in_array($name, $this->formatting)) {
-            return self::FORMATTING;
-        } else {
-            return self::PHRASING;
-        }
-    }
-
-    /**
-     * @param $elements
-     */
-    private function clearStackToTableContext($elements) {
-        /* When the steps above require the UA to clear the stack back to a
-        table context, it means that the UA must, while the current node is not
-        a table element or an html element, pop elements from the stack of open
-        elements. */
-        while (true) {
-            $name = end($this->stack)->tagName;
-
-            if (in_array($name, $elements)) {
-                break;
-            } else {
-                array_pop($this->stack);
-            }
-        }
-    }
-
-    /**
-     * @param null $context
-     */
-    private function resetInsertionMode($context = null) {
-        /* 1. Let last be false. */
-        $last = false;
-        $leng = count($this->stack);
-
-        for ($n = $leng - 1; $n >= 0; $n--) {
-            /* 2. Let node be the last node in the stack of open elements. */
-            $node = $this->stack[$n];
-
-            /* 3. If node is the first node in the stack of open elements, then
-             * set last to true and set node to the context  element. (fragment
-             * case) */
-            if ($this->stack[0]->isSameNode($node)) {
-                $last = true;
-                $node = $context;
-            }
-
-            /* 4. If node is a select element, then switch the insertion mode to
-            "in select" and abort these steps. (fragment case) */
-            if ($node->tagName === 'select') {
-                $this->mode = self::IN_SELECT;
-                break;
-
-            /* 5. If node is a td or th element, then switch the insertion mode
-            to "in cell" and abort these steps. */
-            } elseif ($node->tagName === 'td' || $node->nodeName === 'th') {
-                $this->mode = self::IN_CELL;
-                break;
-
-            /* 6. If node is a tr element, then switch the insertion mode to
-            "in    row" and abort these steps. */
-            } elseif ($node->tagName === 'tr') {
-                $this->mode = self::IN_ROW;
-                break;
-
-            /* 7. If node is a tbody, thead, or tfoot element, then switch the
-            insertion mode to "in table body" and abort these steps. */
-            } elseif (in_array($node->tagName, ['tbody', 'thead', 'tfoot'])) {
-                $this->mode = self::IN_TABLE_BODY;
-                break;
-
-            /* 8. If node is a caption element, then switch the insertion mode
-            to "in caption" and abort these steps. */
-            } elseif ($node->tagName === 'caption') {
-                $this->mode = self::IN_CAPTION;
-                break;
-
-            /* 9. If node is a colgroup element, then switch the insertion mode
-            to "in column group" and abort these steps. (innerHTML case) */
-            } elseif ($node->tagName === 'colgroup') {
-                $this->mode = self::IN_COLUMN_GROUP;
-                break;
-
-            /* 10. If node is a table element, then switch the insertion mode
-            to "in table" and abort these steps. */
-            } elseif ($node->tagName === 'table') {
-                $this->mode = self::IN_TABLE;
-                break;
-
-            /* 11. If node is an element from the MathML namespace or the SVG
-             * namespace, then switch the insertion mode to "in foreign
-             * content", let the secondary insertion mode be "in body", and
-             * abort these steps. */
-            } elseif ($node->namespaceURI === self::NS_SVG ||
-            $node->namespaceURI === self::NS_MATHML) {
-                $this->mode = self::IN_FOREIGN_CONTENT;
-                $this->secondary_mode = self::IN_BODY;
-                break;
-
-            /* 12. If node is a head element, then switch the insertion mode
-            to "in body" ("in body"! not "in head"!) and abort these steps.
-            (fragment case) */
-            } elseif ($node->tagName === 'head') {
-                $this->mode = self::IN_BODY;
-                break;
-
-            /* 13. If node is a body element, then switch the insertion mode to
-            "in body" and abort these steps. */
-            } elseif ($node->tagName === 'body') {
-                $this->mode = self::IN_BODY;
-                break;
-
-            /* 14. If node is a frameset element, then switch the insertion
-            mode to "in frameset" and abort these steps. (fragment case) */
-            } elseif ($node->tagName === 'frameset') {
-                $this->mode = self::IN_FRAMESET;
-                break;
-
-            /* 15. If node is an html element, then: if the head element
-            pointer is null, switch the insertion mode to "before head",
-            otherwise, switch the insertion mode to "after head". In either
-            case, abort these steps. (fragment case) */
-            } elseif ($node->tagName === 'html') {
-                $this->mode = ($this->head_pointer === null)
-                    ? self::BEFORE_HEAD
-                    : self::AFTER_HEAD;
-
-                break;
-
-            /* 16. If last is true, then set the insertion mode to "in body"
-            and    abort these steps. (fragment case) */
-            } elseif ($last) {
-                $this->mode = self::IN_BODY;
-                break;
-            }
-        }
-    }
-
-    /**
-     *
-     */
-    private function closeCell() {
-        /* If the stack of open elements has a td or th element in table scope,
-        then act as if an end tag token with that tag name had been seen. */
-        foreach (['td', 'th'] as $cell) {
-            if ($this->elementInScope($cell, self::SCOPE_TABLE)) {
-                $this->emitToken([
-                    'name' => $cell,
-                    'type' => HTML5_Tokenizer::ENDTAG
-                ]);
-
-                break;
-            }
-        }
-    }
-
-    /**
-     * @param $token
-     * @param $mode
-     */
-    private function processWithRulesFor($token, $mode) {
-        /* "using the rules for the m insertion mode", where m is one of these
-         * modes, the user agent must use the rules described under the m
-         * insertion mode's section, but must leave the insertion mode
-         * unchanged unless the rules in m themselves switch the insertion mode
-         * to a new value. */
-        $this->emitToken($token, $mode);
-    }
-
-    /**
-     * @param $token
-     */
-    private function insertCDATAElement($token) {
-        $this->insertElement($token);
-        $this->original_mode = $this->mode;
-        $this->mode = self::IN_CDATA_RCDATA;
-        $this->content_model = HTML5_Tokenizer::CDATA;
-    }
-
-    /**
-     * @param $token
-     */
-    private function insertRCDATAElement($token) {
-        $this->insertElement($token);
-        $this->original_mode = $this->mode;
-        $this->mode = self::IN_CDATA_RCDATA;
-        $this->content_model = HTML5_Tokenizer::RCDATA;
-    }
-
-    /**
-     * @param $token
-     * @param $key
-     * @return bool
-     */
-    private function getAttr($token, $key) {
-        if (!isset($token['attr'])) {
-            return false;
-        }
-        $ret = false;
-        foreach ($token['attr'] as $keypair) {
-            if ($keypair['name'] === $key) {
-                $ret = $keypair['value'];
-            }
-        }
-        return $ret;
-    }
-
-    /**
-     * @return mixed
-     */
-    private function getCurrentTable() {
-        /* The current table is the last table  element in the stack of open
-         * elements, if there is one. If there is no table element in the stack
-         * of open elements (fragment case), then the current table is the
-         * first element in the stack of open elements (the html element). */
-        for ($i = count($this->stack) - 1; $i >= 0; $i--) {
-            if ($this->stack[$i]->tagName === 'table') {
-                return $this->stack[$i];
-            }
-        }
-        return $this->stack[0];
-    }
-
-    /**
-     * @return mixed
-     */
-    private function getFosterParent() {
-        /* The foster parent element is the parent element of the last
-        table element in the stack of open elements, if there is a
-        table element and it has such a parent element. If there is no
-        table element in the stack of open elements (innerHTML case),
-        then the foster parent element is the first element in the
-        stack of open elements (the html  element). Otherwise, if there
-        is a table element in the stack of open elements, but the last
-        table element in the stack of open elements has no parent, or
-        its parent node is not an element, then the foster parent
-        element is the element before the last table element in the
-        stack of open elements. */
-        for ($n = count($this->stack) - 1; $n >= 0; $n--) {
-            if ($this->stack[$n]->tagName === 'table') {
-                $table = $this->stack[$n];
-                break;
-            }
-        }
-
-        if (isset($table) && $table->parentNode !== null) {
-            return $table->parentNode;
-
-        } elseif (!isset($table)) {
-            return $this->stack[0];
-
-        } elseif (isset($table) && ($table->parentNode === null ||
-        $table->parentNode->nodeType !== XML_ELEMENT_NODE)) {
-            return $this->stack[$n - 1];
-        }
-
-        return null;
-    }
-
-    /**
-     * @param $node
-     */
-    public function fosterParent($node) {
-        $foster_parent = $this->getFosterParent();
-        $table = $this->getCurrentTable(); // almost equivalent to last table element, except it can be html
-        /* When a node node is to be foster parented, the node node must be
-         * be inserted into the foster parent element. */
-        /* If the foster parent element is the parent element of the last table
-         * element in the stack of open elements, then node must be inserted
-         * immediately before the last table element in the stack of open
-         * elements in the foster parent element; otherwise, node must be
-         * appended to the foster parent element. */
-        if ($table->tagName === 'table' && $table->parentNode->isSameNode($foster_parent)) {
-            $foster_parent->insertBefore($node, $table);
-        } else {
-            $foster_parent->appendChild($node);
-        }
-    }
-
-    /**
-     * For debugging, prints the stack
-     */
-    private function printStack() {
-        $names = [];
-        foreach ($this->stack as $i => $element) {
-            $names[] = $element->tagName;
-        }
-        echo "  -> stack [" . implode(', ', $names) . "]\n";
-    }
-
-    /**
-     * For debugging, prints active formatting elements
-     */
-    private function printActiveFormattingElements() {
-        if (!$this->a_formatting) {
-            return;
-        }
-        $names = [];
-        foreach ($this->a_formatting as $node) {
-            if ($node === self::MARKER) {
-                $names[] = 'MARKER';
-            } else {
-                $names[] = $node->tagName;
-            }
-        }
-        echo "  -> active formatting [" . implode(', ', $names) . "]\n";
-    }
-
-    /**
-     * @return bool
-     */
-    public function currentTableIsTainted() {
-        return !empty($this->getCurrentTable()->tainted);
-    }
-
-    /**
-     * Sets up the tree constructor for building a fragment.
-     *
-     * @param null $context
-     */
-    public function setupContext($context = null) {
-        $this->fragment = true;
-        if ($context) {
-            $context = $this->dom->createElementNS(self::NS_HTML, $context);
-            /* 4.1. Set the HTML parser's tokenization  stage's content model
-             * flag according to the context element, as follows: */
-            switch ($context->tagName) {
-                case 'title': case 'textarea':
-                    $this->content_model = HTML5_Tokenizer::RCDATA;
-                    break;
-                case 'style': case 'script': case 'xmp': case 'iframe':
-                case 'noembed': case 'noframes':
-                    $this->content_model = HTML5_Tokenizer::CDATA;
-                    break;
-                case 'noscript':
-                    // XSCRIPT: assuming scripting is enabled
-                    $this->content_model = HTML5_Tokenizer::CDATA;
-                    break;
-                case 'plaintext':
-                    $this->content_model = HTML5_Tokenizer::PLAINTEXT;
-                    break;
-            }
-            /* 4.2. Let root be a new html element with no attributes. */
-            $root = $this->dom->createElementNS(self::NS_HTML, 'html');
-            $this->root = $root;
-            /* 4.3 Append the element root to the Document node created above. */
-            $this->dom->appendChild($root);
-            /* 4.4 Set up the parser's stack of open elements so that it
-             * contains just the single element root. */
-            $this->stack = [$root];
-            /* 4.5 Reset the parser's insertion mode appropriately. */
-            $this->resetInsertionMode($context);
-            /* 4.6 Set the parser's form element pointer  to the nearest node
-             * to the context element that is a form element (going straight up
-             * the ancestor chain, and including the element itself, if it is a
-             * form element), or, if there is no such form element, to null. */
-            $node = $context;
-            do {
-                if ($node->tagName === 'form') {
-                    $this->form_pointer = $node;
-                    break;
-                }
-            } while ($node = $node->parentNode);
-        }
-    }
-
-    /**
-     * @param $token
-     * @return mixed
-     */
-    public function adjustMathMLAttributes($token) {
-        foreach ($token['attr'] as &$kp) {
-            if ($kp['name'] === 'definitionurl') {
-                $kp['name'] = 'definitionURL';
-            }
-        }
-        return $token;
-    }
-
-    /**
-     * @param $token
-     * @return mixed
-     */
-    public function adjustSVGAttributes($token) {
-        static $lookup = [
-            'attributename' => 'attributeName',
-            'attributetype' => 'attributeType',
-            'basefrequency' => 'baseFrequency',
-            'baseprofile' => 'baseProfile',
-            'calcmode' => 'calcMode',
-            'clippathunits' => 'clipPathUnits',
-            'contentscripttype' => 'contentScriptType',
-            'contentstyletype' => 'contentStyleType',
-            'diffuseconstant' => 'diffuseConstant',
-            'edgemode' => 'edgeMode',
-            'externalresourcesrequired' => 'externalResourcesRequired',
-            'filterres' => 'filterRes',
-            'filterunits' => 'filterUnits',
-            'glyphref' => 'glyphRef',
-            'gradienttransform' => 'gradientTransform',
-            'gradientunits' => 'gradientUnits',
-            'kernelmatrix' => 'kernelMatrix',
-            'kernelunitlength' => 'kernelUnitLength',
-            'keypoints' => 'keyPoints',
-            'keysplines' => 'keySplines',
-            'keytimes' => 'keyTimes',
-            'lengthadjust' => 'lengthAdjust',
-            'limitingconeangle' => 'limitingConeAngle',
-            'markerheight' => 'markerHeight',
-            'markerunits' => 'markerUnits',
-            'markerwidth' => 'markerWidth',
-            'maskcontentunits' => 'maskContentUnits',
-            'maskunits' => 'maskUnits',
-            'numoctaves' => 'numOctaves',
-            'pathlength' => 'pathLength',
-            'patterncontentunits' => 'patternContentUnits',
-            'patterntransform' => 'patternTransform',
-            'patternunits' => 'patternUnits',
-            'pointsatx' => 'pointsAtX',
-            'pointsaty' => 'pointsAtY',
-            'pointsatz' => 'pointsAtZ',
-            'preservealpha' => 'preserveAlpha',
-            'preserveaspectratio' => 'preserveAspectRatio',
-            'primitiveunits' => 'primitiveUnits',
-            'refx' => 'refX',
-            'refy' => 'refY',
-            'repeatcount' => 'repeatCount',
-            'repeatdur' => 'repeatDur',
-            'requiredextensions' => 'requiredExtensions',
-            'requiredfeatures' => 'requiredFeatures',
-            'specularconstant' => 'specularConstant',
-            'specularexponent' => 'specularExponent',
-            'spreadmethod' => 'spreadMethod',
-            'startoffset' => 'startOffset',
-            'stddeviation' => 'stdDeviation',
-            'stitchtiles' => 'stitchTiles',
-            'surfacescale' => 'surfaceScale',
-            'systemlanguage' => 'systemLanguage',
-            'tablevalues' => 'tableValues',
-            'targetx' => 'targetX',
-            'targety' => 'targetY',
-            'textlength' => 'textLength',
-            'viewbox' => 'viewBox',
-            'viewtarget' => 'viewTarget',
-            'xchannelselector' => 'xChannelSelector',
-            'ychannelselector' => 'yChannelSelector',
-            'zoomandpan' => 'zoomAndPan',
-        ];
-        foreach ($token['attr'] as &$kp) {
-            if (isset($lookup[$kp['name']])) {
-                $kp['name'] = $lookup[$kp['name']];
-            }
-        }
-        return $token;
-    }
-
-    /**
-     * @param $token
-     * @return mixed
-     */
-    public function adjustForeignAttributes($token) {
-        static $lookup = [
-            'xlink:actuate' => ['xlink', 'actuate', self::NS_XLINK],
-            'xlink:arcrole' => ['xlink', 'arcrole', self::NS_XLINK],
-            'xlink:href' => ['xlink', 'href', self::NS_XLINK],
-            'xlink:role' => ['xlink', 'role', self::NS_XLINK],
-            'xlink:show' => ['xlink', 'show', self::NS_XLINK],
-            'xlink:title' => ['xlink', 'title', self::NS_XLINK],
-            'xlink:type' => ['xlink', 'type', self::NS_XLINK],
-            'xml:base' => ['xml', 'base', self::NS_XML],
-            'xml:lang' => ['xml', 'lang', self::NS_XML],
-            'xml:space' => ['xml', 'space', self::NS_XML],
-            'xmlns' => [null, 'xmlns', self::NS_XMLNS],
-            'xmlns:xlink' => ['xmlns', 'xlink', self::NS_XMLNS],
-        ];
-        foreach ($token['attr'] as &$kp) {
-            if (isset($lookup[$kp['name']])) {
-                $kp['name'] = $lookup[$kp['name']];
-            }
-        }
-        return $token;
-    }
-
-    /**
-     * @param $token
-     * @param $namespaceURI
-     */
-    public function insertForeignElement($token, $namespaceURI) {
-        $el = $this->dom->createElementNS($namespaceURI, $token['name']);
-
-        if (!empty($token['attr'])) {
-            foreach ($token['attr'] as $kp) {
-                $attr = $kp['name'];
-                if (is_array($attr)) {
-                    $ns = $attr[2];
-                    $attr = $attr[1];
-                } else {
-                    $ns = self::NS_HTML;
-                }
-                if (!$el->hasAttributeNS($ns, $attr)) {
-                    // XSKETCHY: work around godawful libxml bug
-                    if ($ns === self::NS_XLINK) {
-                        $el->setAttribute('xlink:'.$attr, $kp['value']);
-                    } elseif ($ns === self::NS_HTML) {
-                        // Another godawful libxml bug
-                        $el->setAttribute($attr, $kp['value']);
-                    } else {
-                        $el->setAttributeNS($ns, $attr, $kp['value']);
-                    }
-                }
-            }
-        }
-        $this->appendToRealParent($el);
-        $this->stack[] = $el;
-        // XERROR: see below
-        /* If the newly created element has an xmlns attribute in the XMLNS
-         * namespace  whose value is not exactly the same as the element's
-         * namespace, that is a parse error. Similarly, if the newly created
-         * element has an xmlns:xlink attribute in the XMLNS namespace whose
-         * value is not the XLink Namespace, that is a parse error. */
-    }
-
-    /**
-     * @return DOMDocument|DOMNodeList
-     */
-    public function save() {
-        $this->dom->normalize();
-        if (!$this->fragment) {
-            return $this->dom;
-        } else {
-            if ($this->root) {
-                return $this->root->childNodes;
-            } else {
-                return $this->dom->childNodes;
-            }
-        }
-    }
-}
-
diff --git a/vendor/dompdf/dompdf/lib/html5lib/named-character-references.ser b/vendor/dompdf/dompdf/lib/html5lib/named-character-references.ser
deleted file mode 100644
index e3ae050..0000000
--- a/vendor/dompdf/dompdf/lib/html5lib/named-character-references.ser
+++ /dev/null
@@ -1 +0,0 @@
-a:52:{s:1:"A";a:16:{s:1:"E";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:198;}s:9:"codepoint";i:198;}}}}s:1:"M";a:1:{s:1:"P";a:2:{s:1:";";a:1:{s:9:"codepoint";i:38;}s:9:"codepoint";i:38;}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:193;}s:9:"codepoint";i:193;}}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:258;}}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:194;}s:9:"codepoint";i:194;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1040;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120068;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:192;}s:9:"codepoint";i:192;}}}}}s:1:"l";a:1:{s:1:"p";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:913;}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:256;}}}}}s:1:"n";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10835;}}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:260;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120120;}}}}s:1:"p";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"y";a:1:{s:1:"F";a:1:{s:1:"u";a:1:{s:1:"n";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8289;}}}}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:197;}s:9:"codepoint";i:197;}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119964;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8788;}}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:195;}s:9:"codepoint";i:195;}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:196;}s:9:"codepoint";i:196;}}}}s:1:"B";a:8:{s:1:"a";a:2:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"s";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8726;}}}}}}}}s:1:"r";a:2:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10983;}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8966;}}}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1041;}}}s:1:"e";a:3:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8757;}}}}}}s:1:"r";a:1:{s:1:"n";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8492;}}}}}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:914;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120069;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120121;}}}}s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:728;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8492;}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"p";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8782;}}}}}}}s:1:"C";a:14:{s:1:"H";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1063;}}}}s:1:"O";a:1:{s:1:"P";a:1:{s:1:"Y";a:2:{s:1:";";a:1:{s:9:"codepoint";i:169;}s:9:"codepoint";i:169;}}}s:1:"a";a:3:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:262;}}}}}s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8914;}s:1:"i";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"D";a:1:{s:1:"i";a:1:{s:1:"f";a:1:{s:1:"f";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8517;}}}}}}}}}}}}}}}}}}}s:1:"y";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"y";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8493;}}}}}}}s:1:"c";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:268;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:199;}s:9:"codepoint";i:199;}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:264;}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8752;}}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:266;}}}}s:1:"e";a:2:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:184;}}}}}}s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:183;}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8493;}}}s:1:"h";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:935;}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"l";a:1:{s:1:"e";a:4:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8857;}}}}s:1:"M";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8854;}}}}}}s:1:"P";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8853;}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8855;}}}}}}}}}}}s:1:"l";a:1:{s:1:"o";a:2:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"w";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"C";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"I";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8754;}}}}}}}}}}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"C";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"l";a:1:{s:1:"y";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"Q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8221;}}}}}}}}}}}}s:1:"Q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8217;}}}}}}}}}}}}}}}s:1:"o";a:4:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8759;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10868;}}}}}s:1:"n";a:3:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8801;}}}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8751;}}}}s:1:"t";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"I";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8750;}}}}}}}}}}}}}}s:1:"p";a:2:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8450;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"d";a:1:{s:1:"u";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8720;}}}}}}}}s:1:"u";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"C";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"w";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"C";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"I";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8755;}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10799;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119966;}}}}s:1:"u";a:1:{s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8915;}s:1:"C";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8781;}}}}}}}s:1:"D";a:11:{s:1:"D";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8517;}s:1:"o";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"h";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10513;}}}}}}}}s:1:"J";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1026;}}}}s:1:"S";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1029;}}}}s:1:"Z";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1039;}}}}s:1:"a";a:3:{s:1:"g";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8225;}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8609;}}}s:1:"s";a:1:{s:1:"h";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10980;}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:270;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1044;}}}s:1:"e";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8711;}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:916;}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120071;}}}s:1:"i";a:2:{s:1:"a";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:4:{s:1:"A";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:180;}}}}}}s:1:"D";a:1:{s:1:"o";a:2:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:729;}}s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"A";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:733;}}}}}}}}}}}}s:1:"G";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:96;}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:732;}}}}}}}}}}}}}}s:1:"m";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8900;}}}}}}s:1:"f";a:1:{s:1:"f";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8518;}}}}}}}}}}}}}s:1:"o";a:4:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120123;}}}s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:168;}s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8412;}}}}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8784;}}}}}}}s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:6:{s:1:"C";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"I";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8751;}}}}}}}}}}}}}}}}s:1:"D";a:1:{s:1:"o";a:2:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:168;}}s:1:"w";a:1:{s:1:"n";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8659;}}}}}}}}}}s:1:"L";a:2:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:3:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8656;}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8660;}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10980;}}}}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"g";a:2:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10232;}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10234;}}}}}}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10233;}}}}}}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8658;}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8872;}}}}}}}}}s:1:"U";a:1:{s:1:"p";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8657;}}}}}}s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8661;}}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8741;}}}}}}}}}}}}}}}}s:1:"w";a:1:{s:1:"n";a:6:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8595;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10515;}}}}s:1:"U";a:1:{s:1:"p";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8693;}}}}}}}}}}}}}s:1:"B";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:785;}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:3:{s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10576;}}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10590;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8637;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10582;}}}}}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10591;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8641;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10583;}}}}}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8868;}s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8615;}}}}}}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8659;}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119967;}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:272;}}}}}}}s:1:"E";a:16:{s:1:"N";a:1:{s:1:"G";a:1:{s:1:";";a:1:{s:9:"codepoint";i:330;}}}s:1:"T";a:1:{s:1:"H";a:2:{s:1:";";a:1:{s:9:"codepoint";i:208;}s:9:"codepoint";i:208;}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:201;}s:9:"codepoint";i:201;}}}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:282;}}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:202;}s:9:"codepoint";i:202;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1069;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:278;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120072;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:200;}s:9:"codepoint";i:200;}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8712;}}}}}}}s:1:"m";a:2:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:274;}}}}s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:2:{s:1:"S";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"S";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9723;}}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"y";a:1:{s:1:"S";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"S";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9643;}}}}}}}}}}}}}}}}}}}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:280;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120124;}}}}s:1:"p";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:917;}}}}}}}s:1:"q";a:1:{s:1:"u";a:2:{s:1:"a";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10869;}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8770;}}}}}}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"b";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8652;}}}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8496;}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10867;}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:919;}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:203;}s:9:"codepoint";i:203;}}}s:1:"x";a:2:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8707;}}}}}s:1:"p";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8519;}}}}}}}}}}}}}s:1:"F";a:5:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1060;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120073;}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"d";a:2:{s:1:"S";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"S";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9724;}}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"y";a:1:{s:1:"S";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"S";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9642;}}}}}}}}}}}}}}}}}}}}}s:1:"o";a:3:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120125;}}}s:1:"r";a:1:{s:1:"A";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8704;}}}}}s:1:"u";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8497;}}}}}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8497;}}}}}s:1:"G";a:12:{s:1:"J";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1027;}}}}s:1:"T";a:2:{s:1:";";a:1:{s:9:"codepoint";i:62;}s:9:"codepoint";i:62;}s:1:"a";a:1:{s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:2:{s:1:";";a:1:{s:9:"codepoint";i:915;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:988;}}}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:286;}}}}}}s:1:"c";a:3:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:290;}}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:284;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1043;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:288;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120074;}}}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8921;}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120126;}}}}s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:6:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8805;}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8923;}}}}}}}}}}s:1:"F";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8807;}}}}}}}}}}s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10914;}}}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8823;}}}}}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10878;}}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8819;}}}}}}}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119970;}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8811;}}}s:1:"H";a:8:{s:1:"A";a:1:{s:1:"R";a:1:{s:1:"D";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1066;}}}}}}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:711;}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:94;}}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:292;}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8460;}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"b";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8459;}}}}}}}}}}}}s:1:"o";a:2:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8461;}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"z";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"L";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9472;}}}}}}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8459;}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:294;}}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"p";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"H";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8782;}}}}}}}}}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8783;}}}}}}}}}}s:1:"I";a:14:{s:1:"E";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1045;}}}}s:1:"J";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:306;}}}}}s:1:"O";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1025;}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:205;}s:9:"codepoint";i:205;}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:206;}s:9:"codepoint";i:206;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1048;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:304;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8465;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:204;}s:9:"codepoint";i:204;}}}}}s:1:"m";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8465;}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:298;}}}s:1:"g";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"y";a:1:{s:1:"I";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8520;}}}}}}}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8658;}}}}}}}s:1:"n";a:2:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8748;}s:1:"e";a:2:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8747;}}}}}s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8898;}}}}}}}}}}}s:1:"v";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:"C";a:1:{s:1:"o";a:1:{s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8291;}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8290;}}}}}}}}}}}}}}s:1:"o";a:3:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:302;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120128;}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:921;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8464;}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:296;}}}}}}s:1:"u";a:2:{s:1:"k";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1030;}}}}s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:207;}s:9:"codepoint";i:207;}}}}s:1:"J";a:5:{s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:308;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1049;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120077;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120129;}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119973;}}}s:1:"e";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1032;}}}}}}s:1:"u";a:1:{s:1:"k";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1028;}}}}}}s:1:"K";a:7:{s:1:"H";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1061;}}}}s:1:"J";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1036;}}}}s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:922;}}}}}s:1:"c";a:2:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:310;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1050;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120078;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120130;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119974;}}}}}s:1:"L";a:11:{s:1:"J";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1033;}}}}s:1:"T";a:2:{s:1:";";a:1:{s:9:"codepoint";i:60;}s:9:"codepoint";i:60;}s:1:"a";a:5:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:313;}}}}}s:1:"m";a:1:{s:1:"b";a:1:{s:1:"d";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:923;}}}}}s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10218;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8466;}}}}}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8606;}}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:317;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:315;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1051;}}}s:1:"e";a:2:{s:1:"f";a:1:{s:1:"t";a:10:{s:1:"A";a:2:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10216;}}}}}}}}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8592;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8676;}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8646;}}}}}}}}}}}}}}}}s:1:"C";a:1:{s:1:"e";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8968;}}}}}}}}s:1:"D";a:1:{s:1:"o";a:2:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10214;}}}}}}}}}}}}s:1:"w";a:1:{s:1:"n";a:2:{s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10593;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8643;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10585;}}}}}}}}}}}}}}s:1:"F";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8970;}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8596;}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10574;}}}}}}}}}}}}s:1:"T";a:2:{s:1:"e";a:1:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8867;}s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8612;}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10586;}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8882;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10703;}}}}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8884;}}}}}}}}}}}}}}s:1:"U";a:1:{s:1:"p";a:3:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10577;}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10592;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8639;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10584;}}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8636;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10578;}}}}}}}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8656;}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8660;}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"s";a:6:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8922;}}}}}}}}}}}}}s:1:"F";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8806;}}}}}}}}}}s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8822;}}}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10913;}}}}}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10877;}}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8818;}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120079;}}}s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8920;}s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8666;}}}}}}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:319;}}}}}}s:1:"o";a:3:{s:1:"n";a:1:{s:1:"g";a:4:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10229;}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10231;}}}}}}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10230;}}}}}}}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10232;}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10234;}}}}}}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10233;}}}}}}}}}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120131;}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"r";a:2:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8601;}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8600;}}}}}}}}}}}}}}}s:1:"s";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8466;}}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8624;}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:321;}}}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8810;}}}s:1:"M";a:8:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10501;}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1052;}}}s:1:"e";a:2:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8287;}}}}}}}}}}s:1:"l";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8499;}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120080;}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:"P";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8723;}}}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120132;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8499;}}}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:924;}}}s:1:"N";a:9:{s:1:"J";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1034;}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:323;}}}}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:327;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:325;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1053;}}}s:1:"e";a:3:{s:1:"g";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"v";a:1:{s:1:"e";a:3:{s:1:"M";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8203;}}}}}}}}}}}}s:1:"T";a:1:{s:1:"h";a:1:{s:1:"i";a:2:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8203;}}}}}}}}s:1:"n";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8203;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"y";a:1:{s:1:"T";a:1:{s:1:"h";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8203;}}}}}}}}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"d";a:2:{s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8811;}}}}}}}}}}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8810;}}}}}}}}}}}}}s:1:"w";a:1:{s:1:"L";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10;}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120081;}}}s:1:"o";a:4:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8288;}}}}}}s:1:"n";a:1:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"k";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:160;}}}}}}}}}}}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8469;}}}s:1:"t";a:11:{s:1:";";a:1:{s:9:"codepoint";i:10988;}s:1:"C";a:2:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8802;}}}}}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:"C";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8813;}}}}}}}s:1:"D";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8742;}}}}}}}}}}}}}}}}}}s:1:"E";a:3:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8713;}}}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8800;}}}}}s:1:"x";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8708;}}}}}}}s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8815;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8817;}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8825;}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8821;}}}}}}}}}}}}}s:1:"L";a:1:{s:1:"e";a:2:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"T";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8938;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8940;}}}}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"s";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8814;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8816;}}}}}}s:1:"G";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8824;}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8820;}}}}}}}}}}s:1:"P";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8832;}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8928;}}}}}}}}}}}}}}}}}}}s:1:"R";a:2:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"E";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8716;}}}}}}}}}}}}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"T";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8939;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8941;}}}}}}}}}}}}}}}}}}}s:1:"S";a:2:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"S";a:1:{s:1:"u";a:2:{s:1:"b";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8930;}}}}}}}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8931;}}}}}}}}}}}}}}}}}}}s:1:"u";a:3:{s:1:"b";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8840;}}}}}}}}}}s:1:"c";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8833;}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8929;}}}}}}}}}}}}}}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8841;}}}}}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8769;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8772;}}}}}}s:1:"F";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8775;}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8777;}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8740;}}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119977;}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:209;}s:9:"codepoint";i:209;}}}}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:925;}}}s:1:"O";a:14:{s:1:"E";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:338;}}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:211;}s:9:"codepoint";i:211;}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:212;}s:9:"codepoint";i:212;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1054;}}}s:1:"d";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:336;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120082;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:210;}s:9:"codepoint";i:210;}}}}}s:1:"m";a:3:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:332;}}}}s:1:"e";a:1:{s:1:"g";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:937;}}}}s:1:"i";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:927;}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120134;}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"C";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"l";a:1:{s:1:"y";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"Q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8220;}}}}}}}}}}}}s:1:"Q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8216;}}}}}}}}}}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10836;}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119978;}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:2:{s:1:";";a:1:{s:9:"codepoint";i:216;}s:9:"codepoint";i:216;}}}}}s:1:"t";a:1:{s:1:"i";a:2:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:213;}s:9:"codepoint";i:213;}}}s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10807;}}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:214;}s:9:"codepoint";i:214;}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"r";a:2:{s:1:"B";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:175;}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9182;}}s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9140;}}}}}}}}s:1:"P";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9180;}}}}}}}}}}}}}}}}s:1:"P";a:9:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8706;}}}}}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1055;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120083;}}}s:1:"h";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:934;}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:928;}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:"M";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:177;}}}}}}}}}s:1:"o";a:2:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8460;}}}}}}}}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8473;}}}}s:1:"r";a:4:{s:1:";";a:1:{s:9:"codepoint";i:10939;}s:1:"e";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:"s";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8826;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10927;}}}}}}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8828;}}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8830;}}}}}}}}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8243;}}}}s:1:"o";a:2:{s:1:"d";a:1:{s:1:"u";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8719;}}}}}s:1:"p";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8759;}s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8733;}}}}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119979;}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:936;}}}}s:1:"Q";a:4:{s:1:"U";a:1:{s:1:"O";a:1:{s:1:"T";a:2:{s:1:";";a:1:{s:9:"codepoint";i:34;}s:9:"codepoint";i:34;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120084;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8474;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119980;}}}}}s:1:"R";a:12:{s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10512;}}}}}s:1:"E";a:1:{s:1:"G";a:2:{s:1:";";a:1:{s:9:"codepoint";i:174;}s:9:"codepoint";i:174;}}s:1:"a";a:3:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:340;}}}}}s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10219;}}}s:1:"r";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8608;}s:1:"t";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10518;}}}}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:344;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:342;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1056;}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8476;}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:2:{s:1:"E";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8715;}}}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"b";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8651;}}}}}}}}}}}}s:1:"U";a:1:{s:1:"p";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"b";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10607;}}}}}}}}}}}}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8476;}}}s:1:"h";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:929;}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:8:{s:1:"A";a:2:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10217;}}}}}}}}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8594;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8677;}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8644;}}}}}}}}}}}}}}}s:1:"C";a:1:{s:1:"e";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8969;}}}}}}}}s:1:"D";a:1:{s:1:"o";a:2:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"B";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10215;}}}}}}}}}}}}s:1:"w";a:1:{s:1:"n";a:2:{s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10589;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8642;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10581;}}}}}}}}}}}}}}s:1:"F";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8971;}}}}}}s:1:"T";a:2:{s:1:"e";a:1:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8866;}s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8614;}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10587;}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8883;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10704;}}}}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8885;}}}}}}}}}}}}}}s:1:"U";a:1:{s:1:"p";a:3:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10575;}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10588;}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8638;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10580;}}}}}}}}}}}}s:1:"V";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8640;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10579;}}}}}}}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8658;}}}}}}}}}}s:1:"o";a:2:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8477;}}}s:1:"u";a:1:{s:1:"n";a:1:{s:1:"d";a:1:{s:1:"I";a:1:{s:1:"m";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10608;}}}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8667;}}}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8475;}}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8625;}}}s:1:"u";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"D";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"y";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10740;}}}}}}}}}}}}s:1:"S";a:13:{s:1:"H";a:2:{s:1:"C";a:1:{s:1:"H";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1065;}}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1064;}}}}s:1:"O";a:1:{s:1:"F";a:1:{s:1:"T";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1068;}}}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:346;}}}}}}s:1:"c";a:5:{s:1:";";a:1:{s:9:"codepoint";i:10940;}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:352;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:350;}}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:348;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1057;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120086;}}}s:1:"h";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"t";a:4:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8595;}}}}}}}}}}s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8592;}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8594;}}}}}}}}}}}s:1:"U";a:1:{s:1:"p";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8593;}}}}}}}}}}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:931;}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"C";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8728;}}}}}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120138;}}}}s:1:"q";a:2:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8730;}}}s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:9633;}s:1:"I";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8851;}}}}}}}}}}}}}s:1:"S";a:1:{s:1:"u";a:2:{s:1:"b";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8847;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8849;}}}}}}}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8848;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8850;}}}}}}}}}}}}}}s:1:"U";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8852;}}}}}}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119982;}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8902;}}}}s:1:"u";a:4:{s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8912;}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8912;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8838;}}}}}}}}}}s:1:"c";a:2:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"s";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8827;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10928;}}}}}}s:1:"S";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8829;}}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8831;}}}}}}}}}}}s:1:"h";a:1:{s:1:"T";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8715;}}}}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8721;}}s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8913;}s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8835;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8839;}}}}}}}}}}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8913;}}}}}}}s:1:"T";a:11:{s:1:"H";a:1:{s:1:"O";a:1:{s:1:"R";a:1:{s:1:"N";a:2:{s:1:";";a:1:{s:9:"codepoint";i:222;}s:9:"codepoint";i:222;}}}}s:1:"R";a:1:{s:1:"A";a:1:{s:1:"D";a:1:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8482;}}}}}s:1:"S";a:2:{s:1:"H";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1035;}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1062;}}}}s:1:"a";a:2:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:932;}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:356;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:354;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1058;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120087;}}}s:1:"h";a:2:{s:1:"e";a:2:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8756;}}}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:920;}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8201;}}}}}}}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8764;}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8771;}}}}}}s:1:"F";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8773;}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8776;}}}}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120139;}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8411;}}}}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119983;}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:358;}}}}}}}s:1:"U";a:14:{s:1:"a";a:2:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:218;}s:9:"codepoint";i:218;}}}}s:1:"r";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8607;}s:1:"o";a:1:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10569;}}}}}}}}s:1:"b";a:1:{s:1:"r";a:2:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1038;}}}s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:364;}}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:219;}s:9:"codepoint";i:219;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1059;}}}s:1:"d";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:368;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120088;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:217;}s:9:"codepoint";i:217;}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:362;}}}}}s:1:"n";a:2:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:"r";a:2:{s:1:"B";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:818;}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"c";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9183;}}s:1:"k";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9141;}}}}}}}}s:1:"P";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9181;}}}}}}}}}}}}}}}s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8899;}s:1:"P";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8846;}}}}}}}}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:370;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120140;}}}}s:1:"p";a:8:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8593;}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10514;}}}}s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8645;}}}}}}}}}}}}}}}s:1:"D";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8597;}}}}}}}}}}s:1:"E";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"b";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10606;}}}}}}}}}}}}s:1:"T";a:1:{s:1:"e";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8869;}s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8613;}}}}}}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8657;}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8661;}}}}}}}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"r";a:2:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8598;}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8599;}}}}}}}}}}}}}}s:1:"s";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:978;}s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:933;}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:366;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119984;}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:360;}}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:220;}s:9:"codepoint";i:220;}}}}s:1:"V";a:9:{s:1:"D";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8875;}}}}}s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10987;}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1042;}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8873;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10982;}}}}}}s:1:"e";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8897;}}s:1:"r";a:3:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8214;}}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8214;}s:1:"i";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:4:{s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8739;}}}}s:1:"L";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:124;}}}}}s:1:"S";a:1:{s:1:"e";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10072;}}}}}}}}}}s:1:"T";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8768;}}}}}}}}}}}s:1:"y";a:1:{s:1:"T";a:1:{s:1:"h";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8202;}}}}}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120089;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120141;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119985;}}}}s:1:"v";a:1:{s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8874;}}}}}}}s:1:"W";a:5:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:372;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8896;}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120090;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120142;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119986;}}}}}s:1:"X";a:4:{s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120091;}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:926;}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120143;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119987;}}}}}s:1:"Y";a:9:{s:1:"A";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1071;}}}}s:1:"I";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1031;}}}}s:1:"U";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1070;}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:221;}s:9:"codepoint";i:221;}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:374;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1067;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120092;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120144;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119988;}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:376;}}}}}s:1:"Z";a:8:{s:1:"H";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1046;}}}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:377;}}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:381;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1047;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:379;}}}}s:1:"e";a:2:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"W";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:"S";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8203;}}}}}}}}}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:918;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8488;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8484;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119989;}}}}}s:1:"a";a:16:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:225;}s:9:"codepoint";i:225;}}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:259;}}}}}}s:1:"c";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8766;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8767;}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:226;}s:9:"codepoint";i:226;}}}s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:180;}s:9:"codepoint";i:180;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1072;}}}s:1:"e";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:230;}s:9:"codepoint";i:230;}}}}s:1:"f";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8289;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120094;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:224;}s:9:"codepoint";i:224;}}}}}s:1:"l";a:2:{s:1:"e";a:2:{s:1:"f";a:1:{s:1:"s";a:1:{s:1:"y";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8501;}}}}}s:1:"p";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8501;}}}}s:1:"p";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:945;}}}}}s:1:"m";a:2:{s:1:"a";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:257;}}}s:1:"l";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10815;}}}}s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:38;}s:9:"codepoint";i:38;}}s:1:"n";a:2:{s:1:"d";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8743;}s:1:"a";a:1:{s:1:"n";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10837;}}}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10844;}}s:1:"s";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10840;}}}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10842;}}}s:1:"g";a:7:{s:1:";";a:1:{s:9:"codepoint";i:8736;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10660;}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8736;}}}s:1:"m";a:1:{s:1:"s";a:1:{s:1:"d";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8737;}s:1:"a";a:8:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10664;}}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10665;}}s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10666;}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10667;}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10668;}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10669;}}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10670;}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10671;}}}}}}s:1:"r";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8735;}s:1:"v";a:1:{s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8894;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10653;}}}}}}s:1:"s";a:2:{s:1:"p";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8738;}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8491;}}}s:1:"z";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9084;}}}}}}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:261;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120146;}}}}s:1:"p";a:7:{s:1:";";a:1:{s:9:"codepoint";i:8776;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10864;}}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10863;}}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8778;}}s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8779;}}}s:1:"o";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:39;}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8776;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8778;}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:229;}s:9:"codepoint";i:229;}}}}s:1:"s";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119990;}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:42;}}s:1:"y";a:1:{s:1:"m";a:1:{s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8776;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8781;}}}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:227;}s:9:"codepoint";i:227;}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:228;}s:9:"codepoint";i:228;}}}s:1:"w";a:2:{s:1:"c";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8755;}}}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10769;}}}}}}s:1:"b";a:16:{s:1:"N";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10989;}}}}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"k";a:4:{s:1:"c";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8780;}}}}}s:1:"e";a:1:{s:1:"p";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1014;}}}}}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8245;}}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8765;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8909;}}}}}}}}s:1:"r";a:2:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8893;}}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8965;}s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8965;}}}}}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9141;}s:1:"t";a:1:{s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9142;}}}}}}}}s:1:"c";a:2:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8780;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1073;}}}s:1:"d";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8222;}}}}}s:1:"e";a:5:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"u";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8757;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8757;}}}}}}s:1:"m";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10672;}}}}}}s:1:"p";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1014;}}}}s:1:"r";a:1:{s:1:"n";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8492;}}}}}s:1:"t";a:3:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:946;}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8502;}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8812;}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120095;}}}s:1:"i";a:1:{s:1:"g";a:7:{s:1:"c";a:3:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8898;}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9711;}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8899;}}}}s:1:"o";a:3:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10752;}}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10753;}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10754;}}}}}}}s:1:"s";a:2:{s:1:"q";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10758;}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9733;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9661;}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9651;}}}}}}}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10756;}}}}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8897;}}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8896;}}}}}}}}s:1:"k";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10509;}}}}}}s:1:"l";a:3:{s:1:"a";a:2:{s:1:"c";a:1:{s:1:"k";a:3:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"z";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10731;}}}}}}}}s:1:"s";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9642;}}}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:9652;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9662;}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9666;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9656;}}}}}}}}}}}}}}}}s:1:"n";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9251;}}}}s:1:"k";a:2:{i:1;a:2:{i:2;a:1:{s:1:";";a:1:{s:9:"codepoint";i:9618;}}i:4;a:1:{s:1:";";a:1:{s:9:"codepoint";i:9617;}}}i:3;a:1:{i:4;a:1:{s:1:";";a:1:{s:9:"codepoint";i:9619;}}}}s:1:"o";a:1:{s:1:"c";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9608;}}}}}s:1:"n";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8976;}}}}s:1:"o";a:4:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120147;}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8869;}s:1:"t";a:1:{s:1:"o";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8869;}}}}}s:1:"w";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8904;}}}}}s:1:"x";a:12:{s:1:"D";a:4:{s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9559;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9556;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9558;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9555;}}}s:1:"H";a:5:{s:1:";";a:1:{s:9:"codepoint";i:9552;}s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9574;}}s:1:"U";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9577;}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9572;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9575;}}}s:1:"U";a:4:{s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9565;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9562;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9564;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9561;}}}s:1:"V";a:7:{s:1:";";a:1:{s:9:"codepoint";i:9553;}s:1:"H";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9580;}}s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9571;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9568;}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9579;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9570;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9567;}}}s:1:"b";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10697;}}}}s:1:"d";a:4:{s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9557;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9554;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9488;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9484;}}}s:1:"h";a:5:{s:1:";";a:1:{s:9:"codepoint";i:9472;}s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9573;}}s:1:"U";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9576;}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9516;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9524;}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8863;}}}}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8862;}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8864;}}}}}}s:1:"u";a:4:{s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9563;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9560;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9496;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9492;}}}s:1:"v";a:7:{s:1:";";a:1:{s:9:"codepoint";i:9474;}s:1:"H";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9578;}}s:1:"L";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9569;}}s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9566;}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9532;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9508;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9500;}}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8245;}}}}}}s:1:"r";a:2:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:728;}}}}s:1:"v";a:1:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:166;}s:9:"codepoint";i:166;}}}}}s:1:"s";a:4:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119991;}}}s:1:"e";a:1:{s:1:"m";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8271;}}}}s:1:"i";a:1:{s:1:"m";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8765;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8909;}}}}s:1:"o";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:92;}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10693;}}}}}s:1:"u";a:2:{s:1:"l";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8226;}s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8226;}}}}}s:1:"m";a:1:{s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8782;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10926;}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8783;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8783;}}}}}}}s:1:"c";a:15:{s:1:"a";a:3:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:263;}}}}}s:1:"p";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8745;}s:1:"a";a:1:{s:1:"n";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10820;}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10825;}}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10827;}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10823;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10816;}}}}}s:1:"r";a:2:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8257;}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:711;}}}}}s:1:"c";a:4:{s:1:"a";a:2:{s:1:"p";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10829;}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:269;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:231;}s:9:"codepoint";i:231;}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:265;}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10828;}s:1:"s";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10832;}}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:267;}}}}s:1:"e";a:3:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:184;}s:9:"codepoint";i:184;}}}s:1:"m";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10674;}}}}}}s:1:"n";a:1:{s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:162;}s:9:"codepoint";i:162;s:1:"e";a:1:{s:1:"r";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:183;}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120096;}}}s:1:"h";a:3:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1095;}}}s:1:"e";a:1:{s:1:"c";a:1:{s:1:"k";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10003;}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10003;}}}}}}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:967;}}}s:1:"i";a:1:{s:1:"r";a:7:{s:1:";";a:1:{s:9:"codepoint";i:9675;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10691;}}s:1:"c";a:3:{s:1:";";a:1:{s:9:"codepoint";i:710;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8791;}}}s:1:"l";a:1:{s:1:"e";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8634;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8635;}}}}}}}}}}}s:1:"d";a:5:{s:1:"R";a:1:{s:1:";";a:1:{s:9:"codepoint";i:174;}}s:1:"S";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9416;}}s:1:"a";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8859;}}}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8858;}}}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8861;}}}}}}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8791;}}s:1:"f";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10768;}}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10991;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10690;}}}}}}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9827;}s:1:"u";a:1:{s:1:"i";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9827;}}}}}}}}s:1:"o";a:4:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:58;}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8788;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8788;}}}}}}s:1:"m";a:2:{s:1:"m";a:1:{s:1:"a";a:2:{s:1:";";a:1:{s:9:"codepoint";i:44;}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64;}}}}s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8705;}s:1:"f";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8728;}}}s:1:"l";a:1:{s:1:"e";a:2:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8705;}}}}}s:1:"x";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8450;}}}}}}}}s:1:"n";a:2:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8773;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10861;}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8750;}}}}}s:1:"p";a:3:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120148;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8720;}}}}s:1:"y";a:3:{s:1:";";a:1:{s:9:"codepoint";i:169;}s:9:"codepoint";i:169;s:1:"s";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8471;}}}}}}s:1:"r";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8629;}}}}s:1:"o";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10007;}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119992;}}}s:1:"u";a:2:{s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10959;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10961;}}}s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10960;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10962;}}}}}s:1:"t";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8943;}}}}}s:1:"u";a:7:{s:1:"d";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:2:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10552;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10549;}}}}}}s:1:"e";a:2:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8926;}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8927;}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8630;}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10557;}}}}}}s:1:"p";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8746;}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10824;}}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10822;}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10826;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8845;}}}}s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10821;}}}}s:1:"r";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8631;}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10556;}}}}}s:1:"l";a:1:{s:1:"y";a:3:{s:1:"e";a:1:{s:1:"q";a:2:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8926;}}}}}s:1:"s";a:1:{s:1:"u";a:1:{s:1:"c";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8927;}}}}}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8910;}}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8911;}}}}}}}}s:1:"r";a:1:{s:1:"e";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:164;}s:9:"codepoint";i:164;}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8630;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8631;}}}}}}}}}}}}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8910;}}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8911;}}}}}s:1:"w";a:2:{s:1:"c";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8754;}}}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8753;}}}}}s:1:"y";a:1:{s:1:"l";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9005;}}}}}}}s:1:"d";a:19:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8659;}}}}s:1:"H";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10597;}}}}s:1:"a";a:4:{s:1:"g";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8224;}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8504;}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8595;}}}s:1:"s";a:1:{s:1:"h";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8208;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8867;}}}}}s:1:"b";a:2:{s:1:"k";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10511;}}}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:733;}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:271;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1076;}}}s:1:"d";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8518;}s:1:"a";a:2:{s:1:"g";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8225;}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8650;}}}}s:1:"o";a:1:{s:1:"t";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10871;}}}}}}}s:1:"e";a:3:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:176;}s:9:"codepoint";i:176;}s:1:"l";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:948;}}}}s:1:"m";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10673;}}}}}}}s:1:"f";a:2:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10623;}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120097;}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8643;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8642;}}}}}s:1:"i";a:5:{s:1:"a";a:1:{s:1:"m";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8900;}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"d";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8900;}s:1:"s";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9830;}}}}}}}}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9830;}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:168;}}s:1:"g";a:1:{s:1:"a";a:1:{s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:989;}}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8946;}}}}s:1:"v";a:3:{s:1:";";a:1:{s:9:"codepoint";i:247;}s:1:"i";a:1:{s:1:"d";a:1:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:247;}s:9:"codepoint";i:247;s:1:"o";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8903;}}}}}}}}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8903;}}}}}}s:1:"j";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1106;}}}}s:1:"l";a:1:{s:1:"c";a:2:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8990;}}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8973;}}}}}}s:1:"o";a:5:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:36;}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120149;}}}s:1:"t";a:5:{s:1:";";a:1:{s:9:"codepoint";i:729;}s:1:"e";a:1:{s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8784;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8785;}}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8760;}}}}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8724;}}}}}s:1:"s";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8865;}}}}}}}}s:1:"u";a:1:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8966;}}}}}}}}}}}}}s:1:"w";a:1:{s:1:"n";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8595;}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8650;}}}}}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8643;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8642;}}}}}}}}}}}}}}}}s:1:"r";a:2:{s:1:"b";a:1:{s:1:"k";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10512;}}}}}}}s:1:"c";a:2:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8991;}}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8972;}}}}}}s:1:"s";a:3:{s:1:"c";a:2:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119993;}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1109;}}}s:1:"o";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10742;}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:273;}}}}}}s:1:"t";a:2:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8945;}}}}s:1:"r";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9663;}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9662;}}}}}s:1:"u";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8693;}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10607;}}}}}s:1:"w";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10662;}}}}}}}s:1:"z";a:2:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1119;}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10239;}}}}}}}}}s:1:"e";a:18:{s:1:"D";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10871;}}}}s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8785;}}}}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:233;}s:9:"codepoint";i:233;}}}}s:1:"s";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10862;}}}}}}s:1:"c";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:283;}}}}}s:1:"i";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8790;}s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:234;}s:9:"codepoint";i:234;}}}s:1:"o";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8789;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1101;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:279;}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8519;}}s:1:"f";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8786;}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120098;}}}s:1:"g";a:3:{s:1:";";a:1:{s:9:"codepoint";i:10906;}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:232;}s:9:"codepoint";i:232;}}}}s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10902;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10904;}}}}}}s:1:"l";a:4:{s:1:";";a:1:{s:9:"codepoint";i:10905;}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9191;}}}}}}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8467;}}s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10901;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10903;}}}}}}s:1:"m";a:3:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:275;}}}}s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8709;}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8709;}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8709;}}}}}s:1:"s";a:1:{s:1:"p";a:2:{i:1;a:2:{i:3;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8196;}}i:4;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8197;}}}s:1:";";a:1:{s:9:"codepoint";i:8195;}}}}s:1:"n";a:2:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:331;}}s:1:"s";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8194;}}}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:281;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120150;}}}}s:1:"p";a:3:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8917;}s:1:"s";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10723;}}}}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10865;}}}}s:1:"s";a:1:{s:1:"i";a:3:{s:1:";";a:1:{s:9:"codepoint";i:1013;}s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:949;}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:949;}}}}}s:1:"q";a:4:{s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8790;}}}}s:1:"o";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8789;}}}}}}s:1:"s";a:2:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8770;}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:2:{s:1:"g";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10902;}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10901;}}}}}}}}}}s:1:"u";a:3:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:61;}}}}s:1:"e";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8799;}}}}s:1:"i";a:1:{s:1:"v";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8801;}s:1:"D";a:1:{s:1:"D";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10872;}}}}}}s:1:"v";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10725;}}}}}}}}s:1:"r";a:2:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8787;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10609;}}}}}s:1:"s";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8495;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8784;}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8770;}}}}s:1:"t";a:2:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:951;}}s:1:"h";a:2:{s:1:";";a:1:{s:9:"codepoint";i:240;}s:9:"codepoint";i:240;}}s:1:"u";a:2:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:235;}s:9:"codepoint";i:235;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8364;}}}}s:1:"x";a:3:{s:1:"c";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:33;}}}s:1:"i";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8707;}}}}s:1:"p";a:2:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8496;}}}}}}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8519;}}}}}}}}}}}}}s:1:"f";a:11:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8786;}}}}}}}}}}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1092;}}}s:1:"e";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9792;}}}}}}s:1:"f";a:3:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64259;}}}}}s:1:"l";a:2:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64256;}}}s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64260;}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120099;}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64257;}}}}}s:1:"l";a:3:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9837;}}}s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:64258;}}}}s:1:"t";a:1:{s:1:"n";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9649;}}}}}s:1:"n";a:1:{s:1:"o";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:402;}}}}s:1:"o";a:2:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120151;}}}s:1:"r";a:2:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8704;}}}}s:1:"k";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8916;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10969;}}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10765;}}}}}}}}s:1:"r";a:2:{s:1:"a";a:2:{s:1:"c";a:6:{i:1;a:6:{i:2;a:2:{s:1:";";a:1:{s:9:"codepoint";i:189;}s:9:"codepoint";i:189;}i:3;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8531;}}i:4;a:2:{s:1:";";a:1:{s:9:"codepoint";i:188;}s:9:"codepoint";i:188;}i:5;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8533;}}i:6;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8537;}}i:8;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8539;}}}i:2;a:2:{i:3;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8532;}}i:5;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8534;}}}i:3;a:3:{i:4;a:2:{s:1:";";a:1:{s:9:"codepoint";i:190;}s:9:"codepoint";i:190;}i:5;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8535;}}i:8;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8540;}}}i:4;a:1:{i:5;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8536;}}}i:5;a:2:{i:6;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8538;}}i:8;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8541;}}}i:7;a:1:{i:8;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8542;}}}}s:1:"s";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8260;}}}}s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8994;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119995;}}}}}s:1:"g";a:16:{s:1:"E";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8807;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10892;}}}s:1:"a";a:3:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:501;}}}}}s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:2:{s:1:";";a:1:{s:9:"codepoint";i:947;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:989;}}}}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10886;}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:287;}}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:285;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1075;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:289;}}}}s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8805;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8923;}}s:1:"q";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8805;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8807;}}s:1:"s";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10878;}}}}}}}s:1:"s";a:4:{s:1:";";a:1:{s:9:"codepoint";i:10878;}s:1:"c";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10921;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10880;}s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10882;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10884;}}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10900;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120100;}}}s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8811;}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8921;}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8503;}}}}}s:1:"j";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1107;}}}}s:1:"l";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8823;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10898;}}s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10917;}}s:1:"j";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10916;}}}s:1:"n";a:4:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8809;}}s:1:"a";a:1:{s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10890;}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10890;}}}}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10888;}s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10888;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8809;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8935;}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120152;}}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:96;}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8458;}}}s:1:"i";a:1:{s:1:"m";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8819;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10894;}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10896;}}}}}s:1:"t";a:7:{s:1:";";a:1:{s:9:"codepoint";i:62;}s:9:"codepoint";i:62;s:1:"c";a:2:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10919;}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10874;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8919;}}}}s:1:"l";a:1:{s:1:"P";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10645;}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10876;}}}}}}s:1:"r";a:5:{s:1:"a";a:2:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10886;}}}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10616;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8919;}}}}s:1:"e";a:1:{s:1:"q";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8923;}}}}}s:1:"q";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10892;}}}}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8823;}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8819;}}}}}}}s:1:"h";a:10:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8660;}}}}s:1:"a";a:4:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8202;}}}}}s:1:"l";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:189;}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8459;}}}}}s:1:"r";a:2:{s:1:"d";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1098;}}}}s:1:"r";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8596;}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10568;}}}}s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8621;}}}}}s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8463;}}}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:293;}}}}}s:1:"e";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9829;}s:1:"u";a:1:{s:1:"i";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9829;}}}}}}}}s:1:"l";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8230;}}}}}s:1:"r";a:1:{s:1:"c";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8889;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120101;}}}s:1:"k";a:1:{s:1:"s";a:2:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10533;}}}}}}s:1:"w";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10534;}}}}}}}}s:1:"o";a:5:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8703;}}}}s:1:"m";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8763;}}}}}s:1:"o";a:1:{s:1:"k";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8617;}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8618;}}}}}}}}}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120153;}}}s:1:"r";a:1:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8213;}}}}}}s:1:"s";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119997;}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8463;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:295;}}}}}}s:1:"y";a:2:{s:1:"b";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8259;}}}}}s:1:"p";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8208;}}}}}}}s:1:"i";a:15:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:237;}s:9:"codepoint";i:237;}}}}}s:1:"c";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8291;}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:238;}s:9:"codepoint";i:238;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1080;}}}s:1:"e";a:2:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1077;}}}s:1:"x";a:1:{s:1:"c";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:161;}s:9:"codepoint";i:161;}}}}s:1:"f";a:2:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8660;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120102;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:236;}s:9:"codepoint";i:236;}}}}}s:1:"i";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8520;}s:1:"i";a:2:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10764;}}}}s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8749;}}}}s:1:"n";a:1:{s:1:"f";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10716;}}}}}s:1:"o";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8489;}}}}}s:1:"j";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:307;}}}}}s:1:"m";a:3:{s:1:"a";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:299;}}}s:1:"g";a:3:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8465;}}s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8464;}}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8465;}}}}}}s:1:"t";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:305;}}}}s:1:"o";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8887;}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:437;}}}}}s:1:"n";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8712;}s:1:"c";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8453;}}}}}s:1:"f";a:1:{s:1:"i";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8734;}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10717;}}}}}}}s:1:"o";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:305;}}}}}s:1:"t";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8747;}s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8890;}}}}s:1:"e";a:2:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8484;}}}}}s:1:"r";a:1:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8890;}}}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10775;}}}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10812;}}}}}}}s:1:"o";a:4:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1105;}}}s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:303;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120154;}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:953;}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10812;}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:191;}s:9:"codepoint";i:191;}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119998;}}}s:1:"i";a:1:{s:1:"n";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8712;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8953;}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8949;}}}}s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8948;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8947;}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8712;}}}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8290;}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:297;}}}}}}s:1:"u";a:2:{s:1:"k";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1110;}}}}s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:239;}s:9:"codepoint";i:239;}}}}s:1:"j";a:6:{s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:309;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1081;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120103;}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:567;}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120155;}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:119999;}}}s:1:"e";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1112;}}}}}}s:1:"u";a:1:{s:1:"k";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1108;}}}}}}s:1:"k";a:8:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"a";a:2:{s:1:";";a:1:{s:9:"codepoint";i:954;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1008;}}}}}}s:1:"c";a:2:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:311;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1082;}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120104;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:312;}}}}}}s:1:"h";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1093;}}}}s:1:"j";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1116;}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120156;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120000;}}}}}s:1:"l";a:22:{s:1:"A";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8666;}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8656;}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10523;}}}}}}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10510;}}}}}s:1:"E";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8806;}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10891;}}}s:1:"H";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10594;}}}}s:1:"a";a:9:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:314;}}}}}s:1:"e";a:1:{s:1:"m";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10676;}}}}}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8466;}}}}}s:1:"m";a:1:{s:1:"b";a:1:{s:1:"d";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:955;}}}}}s:1:"n";a:1:{s:1:"g";a:3:{s:1:";";a:1:{s:9:"codepoint";i:10216;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10641;}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10216;}}}}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10885;}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:171;}s:9:"codepoint";i:171;}}}s:1:"r";a:1:{s:1:"r";a:8:{s:1:";";a:1:{s:9:"codepoint";i:8592;}s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8676;}s:1:"f";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10527;}}}}s:1:"f";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10525;}}}s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8617;}}}s:1:"l";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8619;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10553;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10611;}}}}s:1:"t";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8610;}}}}}s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:10923;}s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10521;}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10925;}}}}s:1:"b";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10508;}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10098;}}}}s:1:"r";a:2:{s:1:"a";a:1:{s:1:"c";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:123;}}s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:91;}}}}s:1:"k";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10635;}}s:1:"s";a:1:{s:1:"l";a:2:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10639;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10637;}}}}}}}s:1:"c";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:318;}}}}}s:1:"e";a:2:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:316;}}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8968;}}}}s:1:"u";a:1:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:123;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1083;}}}s:1:"d";a:4:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10550;}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8220;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8222;}}}}}s:1:"r";a:2:{s:1:"d";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10599;}}}}}s:1:"u";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10571;}}}}}}}s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8626;}}}}s:1:"e";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8804;}s:1:"f";a:1:{s:1:"t";a:5:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8592;}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8610;}}}}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8637;}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8636;}}}}}}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8647;}}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8596;}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8646;}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8651;}}}}}}}}}s:1:"s";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8621;}}}}}}}}}}}}}}}}s:1:"t";a:1:{s:1:"h";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8907;}}}}}}}}}}}}}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8922;}}s:1:"q";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8804;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8806;}}s:1:"s";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10877;}}}}}}}s:1:"s";a:5:{s:1:";";a:1:{s:9:"codepoint";i:10877;}s:1:"c";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10920;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10879;}s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10881;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10883;}}}}}}s:1:"g";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10899;}}}}s:1:"s";a:5:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10885;}}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8918;}}}}s:1:"e";a:1:{s:1:"q";a:2:{s:1:"g";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8922;}}}}s:1:"q";a:1:{s:1:"g";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10891;}}}}}}}s:1:"g";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8822;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8818;}}}}}}}s:1:"f";a:3:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10620;}}}}}s:1:"l";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8970;}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120105;}}}s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8822;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10897;}}}s:1:"h";a:2:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8637;}}s:1:"u";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8636;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10602;}}}}}s:1:"b";a:1:{s:1:"l";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9604;}}}}}s:1:"j";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1113;}}}}s:1:"l";a:5:{s:1:";";a:1:{s:9:"codepoint";i:8810;}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8647;}}}}s:1:"c";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8990;}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10603;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9722;}}}}}s:1:"m";a:2:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:320;}}}}}s:1:"o";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9136;}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9136;}}}}}}}}}}s:1:"n";a:4:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8808;}}s:1:"a";a:1:{s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10889;}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10889;}}}}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10887;}s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10887;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8808;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8934;}}}}}s:1:"o";a:8:{s:1:"a";a:2:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10220;}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8701;}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10214;}}}}s:1:"n";a:1:{s:1:"g";a:3:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10229;}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10231;}}}}}}}}}}}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10236;}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10230;}}}}}}}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8619;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8620;}}}}}}}}}}}}}s:1:"p";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10629;}}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120157;}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10797;}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10804;}}}}}}s:1:"w";a:2:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8727;}}}}s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:95;}}}}}s:1:"z";a:3:{s:1:";";a:1:{s:9:"codepoint";i:9674;}s:1:"e";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9674;}}}}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10731;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:40;}s:1:"l";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10643;}}}}}}s:1:"r";a:5:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8646;}}}}s:1:"c";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8991;}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8651;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10605;}}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8206;}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8895;}}}}}s:1:"s";a:6:{s:1:"a";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8249;}}}}}s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120001;}}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8624;}}s:1:"i";a:1:{s:1:"m";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8818;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10893;}}s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10895;}}}}s:1:"q";a:2:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:91;}}s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8216;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8218;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:322;}}}}}}s:1:"t";a:9:{s:1:";";a:1:{s:9:"codepoint";i:60;}s:9:"codepoint";i:60;s:1:"c";a:2:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10918;}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10873;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8918;}}}}s:1:"h";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8907;}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8905;}}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10614;}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10875;}}}}}}s:1:"r";a:2:{s:1:"P";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10646;}}}}s:1:"i";a:3:{s:1:";";a:1:{s:9:"codepoint";i:9667;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8884;}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9666;}}}}}s:1:"u";a:1:{s:1:"r";a:2:{s:1:"d";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10570;}}}}}}s:1:"u";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10598;}}}}}}}}s:1:"m";a:14:{s:1:"D";a:1:{s:1:"D";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8762;}}}}}s:1:"a";a:4:{s:1:"c";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:175;}s:9:"codepoint";i:175;}}s:1:"l";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9794;}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10016;}s:1:"e";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10016;}}}}}}s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8614;}s:1:"s";a:1:{s:1:"t";a:1:{s:1:"o";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8614;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8615;}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8612;}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8613;}}}}}}}s:1:"r";a:1:{s:1:"k";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9646;}}}}}}s:1:"c";a:2:{s:1:"o";a:1:{s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10793;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1084;}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8212;}}}}}s:1:"e";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8737;}}}}}}}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120106;}}}s:1:"h";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8487;}}}s:1:"i";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:181;}s:9:"codepoint";i:181;}}}s:1:"d";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8739;}s:1:"a";a:1:{s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:42;}}}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10992;}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:183;}s:9:"codepoint";i:183;}}}}s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8722;}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8863;}}s:1:"d";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8760;}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10794;}}}}}}}s:1:"l";a:2:{s:1:"c";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10971;}}}s:1:"d";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8230;}}}}s:1:"n";a:1:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8723;}}}}}}s:1:"o";a:2:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8871;}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120158;}}}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8723;}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120002;}}}s:1:"t";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8766;}}}}}}s:1:"u";a:3:{s:1:";";a:1:{s:9:"codepoint";i:956;}s:1:"l";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8888;}}}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8888;}}}}}}s:1:"n";a:23:{s:1:"L";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8653;}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8654;}}}}}}}}}}}}}}}s:1:"R";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8655;}}}}}}}}}}}s:1:"V";a:2:{s:1:"D";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8879;}}}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8878;}}}}}}s:1:"a";a:4:{s:1:"b";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8711;}}}}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:324;}}}}}s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8777;}s:1:"o";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:329;}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8777;}}}}}}s:1:"t";a:1:{s:1:"u";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9838;}s:1:"a";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9838;}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8469;}}}}}}}}s:1:"b";a:1:{s:1:"s";a:1:{s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:160;}s:9:"codepoint";i:160;}}}s:1:"c";a:5:{s:1:"a";a:2:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10819;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:328;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:326;}}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8775;}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10818;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1085;}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8211;}}}}}s:1:"e";a:6:{s:1:";";a:1:{s:9:"codepoint";i:8800;}s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8663;}}}}s:1:"a";a:1:{s:1:"r";a:2:{s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10532;}}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8599;}s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8599;}}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8802;}}}}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10536;}}}}}s:1:"x";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8708;}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8708;}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120107;}}}s:1:"g";a:3:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8817;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8817;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8821;}}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8815;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8815;}}}}s:1:"h";a:3:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8654;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8622;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10994;}}}}}s:1:"i";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8715;}s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8956;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8954;}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8715;}}}s:1:"j";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1114;}}}}s:1:"l";a:6:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8653;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8602;}}}}s:1:"d";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8229;}}}s:1:"e";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8816;}s:1:"f";a:1:{s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8602;}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8622;}}}}}}}}}}}}}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8816;}}s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8814;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8820;}}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8814;}s:1:"r";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8938;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8940;}}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8740;}}}}s:1:"o";a:2:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120159;}}}s:1:"t";a:4:{s:1:";";a:1:{s:9:"codepoint";i:172;}s:9:"codepoint";i:172;s:1:"i";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8713;}s:1:"v";a:3:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8713;}}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8951;}}s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8950;}}}}}s:1:"n";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8716;}s:1:"v";a:3:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8716;}}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8958;}}s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8957;}}}}}}}s:1:"p";a:3:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8742;}s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8742;}}}}}}}}s:1:"o";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10772;}}}}}}s:1:"r";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8832;}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8928;}}}}s:1:"e";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8832;}}}}}s:1:"r";a:4:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8655;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8603;}}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8603;}}}}}}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8939;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8941;}}}}}}s:1:"s";a:7:{s:1:"c";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8833;}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8929;}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120003;}}}s:1:"h";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"t";a:2:{s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8740;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8742;}}}}}}}}}}}}}s:1:"i";a:1:{s:1:"m";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8769;}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8772;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8772;}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8740;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8742;}}}}s:1:"q";a:1:{s:1:"s";a:1:{s:1:"u";a:2:{s:1:"b";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8930;}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8931;}}}}}}s:1:"u";a:3:{s:1:"b";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8836;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8840;}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8840;}}}}}}}s:1:"c";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8833;}}}s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8837;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8841;}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8841;}}}}}}}}}s:1:"t";a:4:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8825;}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:241;}s:9:"codepoint";i:241;}}}}s:1:"l";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8824;}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8938;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8940;}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8939;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8941;}}}}}}}}}}}}}}}}s:1:"u";a:2:{s:1:";";a:1:{s:9:"codepoint";i:957;}s:1:"m";a:3:{s:1:";";a:1:{s:9:"codepoint";i:35;}s:1:"e";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8470;}}}}s:1:"s";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8199;}}}}}s:1:"v";a:6:{s:1:"D";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8877;}}}}}s:1:"H";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10500;}}}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8876;}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"f";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10718;}}}}}}s:1:"l";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10498;}}}}}s:1:"r";a:1:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10499;}}}}}}s:1:"w";a:3:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8662;}}}}s:1:"a";a:1:{s:1:"r";a:2:{s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10531;}}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8598;}s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8598;}}}}}}s:1:"n";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10535;}}}}}}}s:1:"o";a:18:{s:1:"S";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9416;}}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:243;}s:9:"codepoint";i:243;}}}}s:1:"s";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8859;}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8858;}s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:244;}s:9:"codepoint";i:244;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1086;}}}s:1:"d";a:5:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8861;}}}}s:1:"b";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:337;}}}}}s:1:"i";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10808;}}}s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8857;}}}s:1:"s";a:1:{s:1:"o";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10684;}}}}}}s:1:"e";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:339;}}}}}s:1:"f";a:2:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10687;}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120108;}}}s:1:"g";a:3:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:731;}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:242;}s:9:"codepoint";i:242;}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10689;}}}s:1:"h";a:2:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10677;}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8486;}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8750;}}}}s:1:"l";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8634;}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10686;}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"s";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10683;}}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8254;}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10688;}}}s:1:"m";a:3:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:333;}}}}s:1:"e";a:1:{s:1:"g";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:969;}}}}s:1:"i";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:959;}}}}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10678;}}s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8854;}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120160;}}}}s:1:"p";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10679;}}}s:1:"e";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10681;}}}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8853;}}}}}s:1:"r";a:7:{s:1:";";a:1:{s:9:"codepoint";i:8744;}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8635;}}}}s:1:"d";a:4:{s:1:";";a:1:{s:9:"codepoint";i:10845;}s:1:"e";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8500;}s:1:"o";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8500;}}}}}s:1:"f";a:2:{s:1:";";a:1:{s:9:"codepoint";i:170;}s:9:"codepoint";i:170;}s:1:"m";a:2:{s:1:";";a:1:{s:9:"codepoint";i:186;}s:9:"codepoint";i:186;}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8886;}}}}}s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10838;}}}s:1:"s";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10839;}}}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10843;}}}s:1:"s";a:3:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8500;}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:2:{s:1:";";a:1:{s:9:"codepoint";i:248;}s:9:"codepoint";i:248;}}}}s:1:"o";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8856;}}}}s:1:"t";a:1:{s:1:"i";a:2:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:245;}s:9:"codepoint";i:245;}}}s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8855;}s:1:"a";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10806;}}}}}}}}s:1:"u";a:1:{s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:246;}s:9:"codepoint";i:246;}}}s:1:"v";a:1:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9021;}}}}}}s:1:"p";a:12:{s:1:"a";a:1:{s:1:"r";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8741;}s:1:"a";a:3:{s:1:";";a:1:{s:9:"codepoint";i:182;}s:9:"codepoint";i:182;s:1:"l";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8741;}}}}}}s:1:"s";a:2:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10995;}}}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:11005;}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8706;}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1087;}}}s:1:"e";a:1:{s:1:"r";a:5:{s:1:"c";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:37;}}}}s:1:"i";a:1:{s:1:"o";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:46;}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8240;}}}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8869;}}s:1:"t";a:1:{s:1:"e";a:1:{s:1:"n";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8241;}}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120109;}}}s:1:"h";a:3:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:966;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:966;}}}s:1:"m";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8499;}}}}}s:1:"o";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9742;}}}}}s:1:"i";a:3:{s:1:";";a:1:{s:9:"codepoint";i:960;}s:1:"t";a:1:{s:1:"c";a:1:{s:1:"h";a:1:{s:1:"f";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8916;}}}}}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:982;}}}s:1:"l";a:2:{s:1:"a";a:1:{s:1:"n";a:2:{s:1:"c";a:1:{s:1:"k";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8463;}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8462;}}}}s:1:"k";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8463;}}}}}s:1:"u";a:1:{s:1:"s";a:9:{s:1:";";a:1:{s:9:"codepoint";i:43;}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10787;}}}}}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8862;}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10786;}}}}s:1:"d";a:2:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8724;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10789;}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10866;}}s:1:"m";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:177;}s:9:"codepoint";i:177;}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10790;}}}}s:1:"t";a:1:{s:1:"w";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10791;}}}}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:177;}}s:1:"o";a:3:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10773;}}}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120161;}}}s:1:"u";a:1:{s:1:"n";a:1:{s:1:"d";a:2:{s:1:";";a:1:{s:9:"codepoint";i:163;}s:9:"codepoint";i:163;}}}}s:1:"r";a:10:{s:1:";";a:1:{s:9:"codepoint";i:8826;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10931;}}s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10935;}}}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8828;}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10927;}s:1:"c";a:6:{s:1:";";a:1:{s:9:"codepoint";i:8826;}s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10935;}}}}}}}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"l";a:1:{s:1:"y";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8828;}}}}}}}}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10927;}}}s:1:"n";a:3:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10937;}}}}}}}s:1:"e";a:1:{s:1:"q";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10933;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8936;}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8830;}}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8242;}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8473;}}}}}s:1:"n";a:3:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10933;}}s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10937;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8936;}}}}}s:1:"o";a:3:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8719;}}s:1:"f";a:3:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9006;}}}}}s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8978;}}}}}s:1:"s";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8979;}}}}}}s:1:"p";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8733;}s:1:"t";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8733;}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8830;}}}}s:1:"u";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8880;}}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120005;}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:968;}}}s:1:"u";a:1:{s:1:"n";a:1:{s:1:"c";a:1:{s:1:"s";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8200;}}}}}}}s:1:"q";a:6:{s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120110;}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10764;}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120162;}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8279;}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120006;}}}}s:1:"u";a:3:{s:1:"a";a:1:{s:1:"t";a:2:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"n";a:1:{s:1:"i";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8461;}}}}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10774;}}}}}}s:1:"e";a:1:{s:1:"s";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:63;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8799;}}}}}}s:1:"o";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:34;}s:9:"codepoint";i:34;}}}}s:1:"r";a:21:{s:1:"A";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8667;}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8658;}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10524;}}}}}}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10511;}}}}}s:1:"H";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10596;}}}}s:1:"a";a:7:{s:1:"c";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10714;}}s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:341;}}}}}s:1:"d";a:1:{s:1:"i";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8730;}}}}s:1:"e";a:1:{s:1:"m";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"y";a:1:{s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10675;}}}}}}}s:1:"n";a:1:{s:1:"g";a:4:{s:1:";";a:1:{s:9:"codepoint";i:10217;}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10642;}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10661;}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10217;}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:187;}s:9:"codepoint";i:187;}}}s:1:"r";a:1:{s:1:"r";a:11:{s:1:";";a:1:{s:9:"codepoint";i:8594;}s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10613;}}}s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8677;}s:1:"f";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10528;}}}}s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10547;}}s:1:"f";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10526;}}}s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8618;}}}s:1:"l";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8620;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10565;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10612;}}}}s:1:"t";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8611;}}}s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8605;}}}}s:1:"t";a:2:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10522;}}}}s:1:"i";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8758;}s:1:"n";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8474;}}}}}}}}}s:1:"b";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10509;}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10099;}}}}s:1:"r";a:2:{s:1:"a";a:1:{s:1:"c";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:125;}}s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:93;}}}}s:1:"k";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10636;}}s:1:"s";a:1:{s:1:"l";a:2:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10638;}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10640;}}}}}}}s:1:"c";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:345;}}}}}s:1:"e";a:2:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:343;}}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8969;}}}}s:1:"u";a:1:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:125;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1088;}}}s:1:"d";a:4:{s:1:"c";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10551;}}}s:1:"l";a:1:{s:1:"d";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10601;}}}}}}s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8221;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8221;}}}}}s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8627;}}}}s:1:"e";a:3:{s:1:"a";a:1:{s:1:"l";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8476;}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8475;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8476;}}}}}s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8477;}}}}s:1:"c";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9645;}}}s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:174;}s:9:"codepoint";i:174;}}s:1:"f";a:3:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10621;}}}}}s:1:"l";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8971;}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120111;}}}s:1:"h";a:2:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8641;}}s:1:"u";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8640;}s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10604;}}}}}s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:961;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1009;}}}}s:1:"i";a:3:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:6:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8594;}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8611;}}}}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8641;}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8640;}}}}}}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8644;}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8652;}}}}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8649;}}}}}}}}}}}}s:1:"s";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8605;}}}}}}}}}}}s:1:"t";a:1:{s:1:"h";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8908;}}}}}}}}}}}}}}s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:730;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8787;}}}}}}}}}}}}s:1:"l";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8644;}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8652;}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8207;}}}s:1:"m";a:1:{s:1:"o";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9137;}s:1:"a";a:1:{s:1:"c";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9137;}}}}}}}}}}s:1:"n";a:1:{s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10990;}}}}}s:1:"o";a:4:{s:1:"a";a:2:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10221;}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8702;}}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10215;}}}}s:1:"p";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10630;}}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120163;}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10798;}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10805;}}}}}}}s:1:"p";a:2:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:41;}s:1:"g";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10644;}}}}}s:1:"p";a:1:{s:1:"o";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10770;}}}}}}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8649;}}}}}s:1:"s";a:4:{s:1:"a";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8250;}}}}}s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120007;}}}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8625;}}s:1:"q";a:2:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:93;}}s:1:"u";a:1:{s:1:"o";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8217;}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8217;}}}}}}s:1:"t";a:3:{s:1:"h";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8908;}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8906;}}}}}s:1:"r";a:1:{s:1:"i";a:4:{s:1:";";a:1:{s:9:"codepoint";i:9657;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8885;}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9656;}}s:1:"l";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10702;}}}}}}}}s:1:"u";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10600;}}}}}}}s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8478;}}}s:1:"s";a:19:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:347;}}}}}}s:1:"b";a:1:{s:1:"q";a:1:{s:1:"u";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8218;}}}}}s:1:"c";a:10:{s:1:";";a:1:{s:9:"codepoint";i:8827;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10932;}}s:1:"a";a:2:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10936;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:353;}}}}}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8829;}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10928;}s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:351;}}}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:349;}}}}s:1:"n";a:3:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10934;}}s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10938;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8937;}}}}}s:1:"p";a:1:{s:1:"o";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10771;}}}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8831;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1089;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8901;}s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8865;}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10854;}}}}}s:1:"e";a:7:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8664;}}}}s:1:"a";a:1:{s:1:"r";a:2:{s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10533;}}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8600;}s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8600;}}}}}}s:1:"c";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:167;}s:9:"codepoint";i:167;}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:59;}}}s:1:"s";a:1:{s:1:"w";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10537;}}}}}s:1:"t";a:1:{s:1:"m";a:2:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8726;}}}}}s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8726;}}}}s:1:"x";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10038;}}}}s:1:"f";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:120112;}s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8994;}}}}}}s:1:"h";a:4:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9839;}}}}s:1:"c";a:2:{s:1:"h";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1097;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1096;}}}s:1:"o";a:1:{s:1:"r";a:1:{s:1:"t";a:2:{s:1:"m";a:1:{s:1:"i";a:1:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8739;}}}}s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8741;}}}}}}}}}}}}s:1:"y";a:2:{s:1:";";a:1:{s:9:"codepoint";i:173;}s:9:"codepoint";i:173;}}s:1:"i";a:2:{s:1:"g";a:1:{s:1:"m";a:1:{s:1:"a";a:3:{s:1:";";a:1:{s:9:"codepoint";i:963;}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:962;}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:962;}}}}}s:1:"m";a:8:{s:1:";";a:1:{s:9:"codepoint";i:8764;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10858;}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8771;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8771;}}}s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10910;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10912;}}}s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10909;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10911;}}}s:1:"n";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8774;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10788;}}}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10610;}}}}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8592;}}}}}s:1:"m";a:4:{s:1:"a";a:2:{s:1:"l";a:1:{s:1:"l";a:1:{s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"m";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8726;}}}}}}}}}}}s:1:"s";a:1:{s:1:"h";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10803;}}}}}s:1:"e";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"s";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10724;}}}}}}}s:1:"i";a:2:{s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8739;}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8995;}}}}s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10922;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10924;}}}}s:1:"o";a:3:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1100;}}}}}s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:47;}s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10692;}s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9023;}}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120164;}}}}s:1:"p";a:1:{s:1:"a";a:2:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:"s";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9824;}s:1:"u";a:1:{s:1:"i";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9824;}}}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8741;}}}}s:1:"q";a:3:{s:1:"c";a:2:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8851;}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8852;}}}}s:1:"s";a:1:{s:1:"u";a:2:{s:1:"b";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8847;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8849;}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8847;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8849;}}}}}}}s:1:"p";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8848;}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8850;}}s:1:"s";a:1:{s:1:"e";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8848;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8850;}}}}}}}}}s:1:"u";a:3:{s:1:";";a:1:{s:9:"codepoint";i:9633;}s:1:"a";a:1:{s:1:"r";a:2:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9633;}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9642;}}}}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9642;}}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8594;}}}}}s:1:"s";a:4:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120008;}}}s:1:"e";a:1:{s:1:"t";a:1:{s:1:"m";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8726;}}}}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8995;}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8902;}}}}}}s:1:"t";a:2:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9734;}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9733;}}}}s:1:"r";a:2:{s:1:"a";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:"e";a:1:{s:1:"p";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1013;}}}}}}}}s:1:"p";a:1:{s:1:"h";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:981;}}}}}}}}}s:1:"n";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:175;}}}}}s:1:"u";a:5:{s:1:"b";a:9:{s:1:";";a:1:{s:9:"codepoint";i:8834;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10949;}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10941;}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8838;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10947;}}}}}s:1:"m";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10945;}}}}}s:1:"n";a:2:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10955;}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8842;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10943;}}}}}s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10617;}}}}}s:1:"s";a:3:{s:1:"e";a:1:{s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8834;}s:1:"e";a:1:{s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8838;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10949;}}}}s:1:"n";a:1:{s:1:"e";a:1:{s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8842;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10955;}}}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10951;}}}s:1:"u";a:2:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10965;}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10963;}}}}}s:1:"c";a:1:{s:1:"c";a:6:{s:1:";";a:1:{s:9:"codepoint";i:8827;}s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10936;}}}}}}}s:1:"c";a:1:{s:1:"u";a:1:{s:1:"r";a:1:{s:1:"l";a:1:{s:1:"y";a:1:{s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8829;}}}}}}}}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10928;}}}s:1:"n";a:3:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10938;}}}}}}}s:1:"e";a:1:{s:1:"q";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10934;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8937;}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8831;}}}}}}s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8721;}}s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9834;}}}s:1:"p";a:13:{i:1;a:2:{s:1:";";a:1:{s:9:"codepoint";i:185;}s:9:"codepoint";i:185;}i:2;a:2:{s:1:";";a:1:{s:9:"codepoint";i:178;}s:9:"codepoint";i:178;}i:3;a:2:{s:1:";";a:1:{s:9:"codepoint";i:179;}s:9:"codepoint";i:179;}s:1:";";a:1:{s:9:"codepoint";i:8835;}s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10950;}}s:1:"d";a:2:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10942;}}}s:1:"s";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10968;}}}}}s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8839;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10948;}}}}}s:1:"h";a:1:{s:1:"s";a:1:{s:1:"u";a:1:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10967;}}}}}s:1:"l";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10619;}}}}}s:1:"m";a:1:{s:1:"u";a:1:{s:1:"l";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10946;}}}}}s:1:"n";a:2:{s:1:"E";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10956;}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8843;}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10944;}}}}}s:1:"s";a:3:{s:1:"e";a:1:{s:1:"t";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8835;}s:1:"e";a:1:{s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8839;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10950;}}}}s:1:"n";a:1:{s:1:"e";a:1:{s:1:"q";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8843;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10956;}}}}}}}s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10952;}}}s:1:"u";a:2:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10964;}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10966;}}}}}}s:1:"w";a:3:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8665;}}}}s:1:"a";a:1:{s:1:"r";a:2:{s:1:"h";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10534;}}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8601;}s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8601;}}}}}}s:1:"n";a:1:{s:1:"w";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10538;}}}}}}s:1:"z";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"g";a:2:{s:1:";";a:1:{s:9:"codepoint";i:223;}s:9:"codepoint";i:223;}}}}}s:1:"t";a:13:{s:1:"a";a:2:{s:1:"r";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8982;}}}}}s:1:"u";a:1:{s:1:";";a:1:{s:9:"codepoint";i:964;}}}s:1:"b";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9140;}}}}s:1:"c";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:357;}}}}}s:1:"e";a:1:{s:1:"d";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:355;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1090;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8411;}}}}s:1:"e";a:1:{s:1:"l";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8981;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120113;}}}s:1:"h";a:4:{s:1:"e";a:2:{s:1:"r";a:1:{s:1:"e";a:2:{i:4;a:1:{s:1:";";a:1:{s:9:"codepoint";i:8756;}}s:1:"f";a:1:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8756;}}}}}}}s:1:"t";a:1:{s:1:"a";a:3:{s:1:";";a:1:{s:9:"codepoint";i:952;}s:1:"s";a:1:{s:1:"y";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:977;}}}}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:977;}}}}}s:1:"i";a:2:{s:1:"c";a:1:{s:1:"k";a:2:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"x";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8776;}}}}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8764;}}}}}}s:1:"n";a:1:{s:1:"s";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8201;}}}}}s:1:"k";a:2:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8776;}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8764;}}}}}s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:254;}s:9:"codepoint";i:254;}}}}s:1:"i";a:3:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:732;}}}}s:1:"m";a:1:{s:1:"e";a:1:{s:1:"s";a:4:{s:1:";";a:1:{s:9:"codepoint";i:215;}s:9:"codepoint";i:215;s:1:"b";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8864;}s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10801;}}}}s:1:"d";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10800;}}}}}s:1:"n";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8749;}}}}s:1:"o";a:3:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10536;}}}s:1:"p";a:4:{s:1:";";a:1:{s:9:"codepoint";i:8868;}s:1:"b";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9014;}}}}s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10993;}}}}s:1:"f";a:2:{s:1:";";a:1:{s:9:"codepoint";i:120165;}s:1:"o";a:1:{s:1:"r";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10970;}}}}}}s:1:"s";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10537;}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8244;}}}}}}s:1:"r";a:3:{s:1:"a";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8482;}}}}s:1:"i";a:7:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:5:{s:1:";";a:1:{s:9:"codepoint";i:9653;}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9663;}}}}}s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9667;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8884;}}}}}}}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8796;}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9657;}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8885;}}}}}}}}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9708;}}}}s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8796;}}s:1:"m";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10810;}}}}}}s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10809;}}}}}s:1:"s";a:1:{s:1:"b";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10701;}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10811;}}}}}}s:1:"p";a:1:{s:1:"e";a:1:{s:1:"z";a:1:{s:1:"i";a:1:{s:1:"u";a:1:{s:1:"m";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9186;}}}}}}}}s:1:"s";a:3:{s:1:"c";a:2:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120009;}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1094;}}}s:1:"h";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1115;}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:359;}}}}}}s:1:"w";a:2:{s:1:"i";a:1:{s:1:"x";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8812;}}}}s:1:"o";a:1:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:"a";a:1:{s:1:"d";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8606;}}}}}}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8608;}}}}}}}}}}}}}}}}}}s:1:"u";a:18:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8657;}}}}s:1:"H";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10595;}}}}s:1:"a";a:2:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:250;}s:9:"codepoint";i:250;}}}}s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8593;}}}}s:1:"b";a:1:{s:1:"r";a:2:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1118;}}}s:1:"e";a:1:{s:1:"v";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:365;}}}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:2:{s:1:";";a:1:{s:9:"codepoint";i:251;}s:9:"codepoint";i:251;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1091;}}}s:1:"d";a:3:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8645;}}}}s:1:"b";a:1:{s:1:"l";a:1:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:369;}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10606;}}}}}s:1:"f";a:2:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10622;}}}}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120114;}}}s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"v";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:249;}s:9:"codepoint";i:249;}}}}}s:1:"h";a:2:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:"l";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8639;}}s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8638;}}}}s:1:"b";a:1:{s:1:"l";a:1:{s:1:"k";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9600;}}}}}s:1:"l";a:2:{s:1:"c";a:2:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8988;}s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8988;}}}}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8975;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9720;}}}}}s:1:"m";a:2:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:363;}}}}s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:168;}s:9:"codepoint";i:168;}}s:1:"o";a:2:{s:1:"g";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:371;}}}}s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120166;}}}}s:1:"p";a:6:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8593;}}}}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"n";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8597;}}}}}}}}}}s:1:"h";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:"o";a:1:{s:1:"o";a:1:{s:1:"n";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8639;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8638;}}}}}}}}}}}}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8846;}}}}s:1:"s";a:1:{s:1:"i";a:3:{s:1:";";a:1:{s:9:"codepoint";i:965;}s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:978;}}s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:965;}}}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"w";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8648;}}}}}}}}}}s:1:"r";a:3:{s:1:"c";a:2:{s:1:"o";a:1:{s:1:"r";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8989;}s:1:"e";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8989;}}}}}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8974;}}}}}s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:367;}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9721;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120010;}}}}s:1:"t";a:3:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8944;}}}}s:1:"i";a:1:{s:1:"l";a:1:{s:1:"d";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:361;}}}}}s:1:"r";a:1:{s:1:"i";a:2:{s:1:";";a:1:{s:9:"codepoint";i:9653;}s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9652;}}}}}s:1:"u";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8648;}}}}s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:252;}s:9:"codepoint";i:252;}}}s:1:"w";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10663;}}}}}}}}s:1:"v";a:14:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8661;}}}}s:1:"B";a:1:{s:1:"a";a:1:{s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:10984;}s:1:"v";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10985;}}}}}s:1:"D";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8872;}}}}}s:1:"a";a:2:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10652;}}}}}s:1:"r";a:7:{s:1:"e";a:1:{s:1:"p";a:1:{s:1:"s";a:1:{s:1:"i";a:1:{s:1:"l";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:949;}}}}}}}}s:1:"k";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:"p";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1008;}}}}}}s:1:"n";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:"i";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8709;}}}}}}}}s:1:"p";a:3:{s:1:"h";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:966;}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:982;}}s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:"t";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8733;}}}}}}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8597;}s:1:"h";a:1:{s:1:"o";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1009;}}}}s:1:"s";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"m";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:962;}}}}}}s:1:"t";a:2:{s:1:"h";a:1:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:977;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"a";a:1:{s:1:"n";a:1:{s:1:"g";a:1:{s:1:"l";a:1:{s:1:"e";a:2:{s:1:"l";a:1:{s:1:"e";a:1:{s:1:"f";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8882;}}}}}s:1:"r";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"h";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8883;}}}}}}}}}}}}}}}}s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1074;}}}s:1:"d";a:1:{s:1:"a";a:1:{s:1:"s";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8866;}}}}}s:1:"e";a:3:{s:1:"e";a:3:{s:1:";";a:1:{s:9:"codepoint";i:8744;}s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8891;}}}}s:1:"e";a:1:{s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8794;}}}}s:1:"l";a:1:{s:1:"l";a:1:{s:1:"i";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8942;}}}}}s:1:"r";a:2:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:124;}}}}s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:124;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120115;}}}s:1:"l";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8882;}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120167;}}}}s:1:"p";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8733;}}}}}s:1:"r";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8883;}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120011;}}}}s:1:"z";a:1:{s:1:"i";a:1:{s:1:"g";a:1:{s:1:"z";a:1:{s:1:"a";a:1:{s:1:"g";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10650;}}}}}}}}s:1:"w";a:7:{s:1:"c";a:1:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:373;}}}}}s:1:"e";a:2:{s:1:"d";a:2:{s:1:"b";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10847;}}}}s:1:"g";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8743;}s:1:"q";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8793;}}}}}s:1:"i";a:1:{s:1:"e";a:1:{s:1:"r";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8472;}}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120116;}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120168;}}}}s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8472;}}s:1:"r";a:2:{s:1:";";a:1:{s:9:"codepoint";i:8768;}s:1:"e";a:1:{s:1:"a";a:1:{s:1:"t";a:1:{s:1:"h";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8768;}}}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120012;}}}}}s:1:"x";a:14:{s:1:"c";a:3:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8898;}}}s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9711;}}}}s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8899;}}}}s:1:"d";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9661;}}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120117;}}}s:1:"h";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10234;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10231;}}}}}s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:958;}}s:1:"l";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10232;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10229;}}}}}s:1:"m";a:1:{s:1:"a";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10236;}}}}s:1:"n";a:1:{s:1:"i";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8955;}}}}s:1:"o";a:3:{s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10752;}}}}s:1:"p";a:2:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120169;}}s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10753;}}}}}s:1:"t";a:1:{s:1:"i";a:1:{s:1:"m";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10754;}}}}}}s:1:"r";a:2:{s:1:"A";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10233;}}}}s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10230;}}}}}s:1:"s";a:2:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120013;}}}s:1:"q";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"p";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10758;}}}}}}s:1:"u";a:2:{s:1:"p";a:1:{s:1:"l";a:1:{s:1:"u";a:1:{s:1:"s";a:1:{s:1:";";a:1:{s:9:"codepoint";i:10756;}}}}}s:1:"t";a:1:{s:1:"r";a:1:{s:1:"i";a:1:{s:1:";";a:1:{s:9:"codepoint";i:9651;}}}}}s:1:"v";a:1:{s:1:"e";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8897;}}}}s:1:"w";a:1:{s:1:"e";a:1:{s:1:"d";a:1:{s:1:"g";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8896;}}}}}}}s:1:"y";a:8:{s:1:"a";a:1:{s:1:"c";a:2:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:2:{s:1:";";a:1:{s:9:"codepoint";i:253;}s:9:"codepoint";i:253;}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1103;}}}}s:1:"c";a:2:{s:1:"i";a:1:{s:1:"r";a:1:{s:1:"c";a:1:{s:1:";";a:1:{s:9:"codepoint";i:375;}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1099;}}}s:1:"e";a:1:{s:1:"n";a:2:{s:1:";";a:1:{s:9:"codepoint";i:165;}s:9:"codepoint";i:165;}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120118;}}}s:1:"i";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1111;}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120170;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120014;}}}}s:1:"u";a:2:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1102;}}}s:1:"m";a:1:{s:1:"l";a:2:{s:1:";";a:1:{s:9:"codepoint";i:255;}s:9:"codepoint";i:255;}}}}s:1:"z";a:10:{s:1:"a";a:1:{s:1:"c";a:1:{s:1:"u";a:1:{s:1:"t";a:1:{s:1:"e";a:1:{s:1:";";a:1:{s:9:"codepoint";i:378;}}}}}}s:1:"c";a:2:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"o";a:1:{s:1:"n";a:1:{s:1:";";a:1:{s:9:"codepoint";i:382;}}}}}s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1079;}}}s:1:"d";a:1:{s:1:"o";a:1:{s:1:"t";a:1:{s:1:";";a:1:{s:9:"codepoint";i:380;}}}}s:1:"e";a:2:{s:1:"e";a:1:{s:1:"t";a:1:{s:1:"r";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8488;}}}}}s:1:"t";a:1:{s:1:"a";a:1:{s:1:";";a:1:{s:9:"codepoint";i:950;}}}}s:1:"f";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120119;}}}s:1:"h";a:1:{s:1:"c";a:1:{s:1:"y";a:1:{s:1:";";a:1:{s:9:"codepoint";i:1078;}}}}s:1:"i";a:1:{s:1:"g";a:1:{s:1:"r";a:1:{s:1:"a";a:1:{s:1:"r";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8669;}}}}}}}s:1:"o";a:1:{s:1:"p";a:1:{s:1:"f";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120171;}}}}s:1:"s";a:1:{s:1:"c";a:1:{s:1:"r";a:1:{s:1:";";a:1:{s:9:"codepoint";i:120015;}}}}s:1:"w";a:2:{s:1:"j";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8205;}}s:1:"n";a:1:{s:1:"j";a:1:{s:1:";";a:1:{s:9:"codepoint";i:8204;}}}}}}
\ No newline at end of file
diff --git a/vendor/dompdf/dompdf/lib/res/broken_image.png b/vendor/dompdf/dompdf/lib/res/broken_image.png
deleted file mode 100644
index 771a1a3..0000000
Binary files a/vendor/dompdf/dompdf/lib/res/broken_image.png and /dev/null differ
diff --git a/vendor/dompdf/dompdf/lib/res/broken_image.svg b/vendor/dompdf/dompdf/lib/res/broken_image.svg
deleted file mode 100644
index 83ba7e7..0000000
--- a/vendor/dompdf/dompdf/lib/res/broken_image.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- 
-  
-  
-  
- 
-
\ No newline at end of file
diff --git a/vendor/dompdf/dompdf/lib/res/html.css b/vendor/dompdf/dompdf/lib/res/html.css
deleted file mode 100644
index 2243ec3..0000000
--- a/vendor/dompdf/dompdf/lib/res/html.css
+++ /dev/null
@@ -1,527 +0,0 @@
-/**
- * dompdf default stylesheet.
- *
- * @package dompdf
- * @link    http://dompdf.github.com/
- * @author  Benj Carson 
- * @author  Blake Ross 
- * @author  Fabien MƩnager 
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- *
- * Portions from Mozilla
- * @link https://dxr.mozilla.org/mozilla-central/source/layout/style/res/html.css
- * @license http://mozilla.org/MPL/2.0/ Mozilla Public License, v. 2.0 
- *
- * Portions from W3C
- * @link https://drafts.csswg.org/css-ui-3/#default-style-sheet
- *
- */
-
-@page {
-  margin: 1.2cm;
-}
-
-html {
-  display: -dompdf-page !important;
-  counter-reset: page;
-}
-
-/* blocks */
-
-article,
-aside,
-details,
-div,
-dt,
-figcaption,
-footer,
-form,
-header,
-hgroup,
-main,
-nav,
-noscript,
-section,
-summary {
-  display: block;
-}
-
-body {
-  page-break-before: avoid;
-  display: block !important;
-  counter-increment: page;
-}
-
-p, dl, multicol {
-  display: block;
-  margin: 1em 0;
-}
-
-dd {
-  display: block;
-  margin-left: 40px;
-}
-
-blockquote, figure {
-  display: block;
-  margin: 1em 40px;
-}
-
-address {
-  display: block;
-  font-style: italic;
-}
-
-center {
-  display: block;
-  text-align: center;
-}
-
-blockquote[type=cite] {
-  display: block;
-  margin: 1em 0;
-  padding-left: 1em;
-  border-left: solid;
-  border-color: blue;
-  border-width: thin;
-}
-
-h1, h2, h3, h4, h5, h6 {
-  display: block;
-  font-weight: bold;
-}
-
-h1 {
-  font-size: 2em;
-  margin: .67em 0;
-}
-
-h2 {
-  font-size: 1.5em;
-  margin: .83em 0;
-}
-
-h3 {
-  font-size: 1.17em;
-  margin: 1em 0;
-}
-
-h4 {
-  margin: 1.33em 0;
-}
-
-h5 {
-  font-size: 0.83em;
-  margin: 1.67em 0;
-}
-
-h6 {
-  font-size: 0.67em;
-  margin: 2.33em 0;
-}
-
-listing {
-  display: block;
-  font-family: fixed;
-  font-size: medium;
-  white-space: pre;
-  margin: 1em 0;
-}
-
-plaintext, pre, xmp {
-  display: block;
-  font-family: fixed;
-  white-space: pre;
-  margin: 1em 0;
-}
-
-/* tables */
-
-table {
-  display: table;
-  border-spacing: 2px;
-  border-collapse: separate;
-  margin-top: 0;
-  margin-bottom: 0;
-  text-indent: 0;
-  text-align: left; /* quirk */
-}
-
-table[border] {
-  border-style: outset;
-  border-color: gray;
-}
-
-/* This won't work (???) */
-/*
-table[border] td,
-table[border] th {
-  border: 1pt solid grey;
-}*/
-
-/* make sure backgrounds are inherited in tables  -- see bug 4510 */
-td, th, tr {
-  background-color: inherit;
-  background-image: inherit;
-  background-image-resolution: inherit;
-  background-position: inherit;
-  background-repeat: inherit;
-  background-size: inherit;
-}
-
-/* caption inherits from table not table-outer */
-caption {
-  display: table-caption;
-  text-align: center;
-}
-
-tr {
-  display: table-row;
-  vertical-align: inherit;
-}
-
-col {
-  display: table-column;
-}
-
-colgroup {
-  display: table-column-group;
-}
-
-tbody {
-  display: table-row-group;
-  vertical-align: middle;
-}
-
-thead {
-  display: table-header-group;
-  vertical-align: middle;
-}
-
-tfoot {
-  display: table-footer-group;
-  vertical-align: middle;
-}
-
-/* To simulate tbody auto-insertion */
-table > tr {
-  vertical-align: middle;
-}
-
-td {
-  display: table-cell;
-  vertical-align: inherit;
-  text-align: inherit;
-  padding: 1px;
-}
-
-th {
-  display: table-cell;
-  vertical-align: inherit;
-  text-align: center;
-  font-weight: bold;
-  padding: 1px;
-}
-
-/* inlines */
-q {
-  quotes: '"' '"' "'" "'"; /* FIXME only the first level is used */
-}
-
-q:before {
-  content: open-quote;
-}
-
-q:after {
-  content: close-quote;
-}
-
-:link {
-  color: #00c;
-  text-decoration: underline;
-}
-
-b, strong {
-  font-weight: bolder;
-}
-
-i, cite, em, var, dfn {
-  font-style: italic;
-}
-
-tt, code, kbd, samp {
-  font-family: fixed;
-}
-
-u, ins {
-  text-decoration: underline;
-}
-
-s, strike, del {
-  text-decoration: line-through;
-}
-
-big {
-  font-size: larger;
-}
-
-small {
-  font-size: smaller;
-}
-
-sub {
-  vertical-align: sub;
-  font-size: smaller;
-  line-height: normal;
-}
-
-sup {
-  vertical-align: super;
-  font-size: smaller;
-  line-height: normal;
-}
-
-nobr {
-  white-space: nowrap;
-}
-
-mark {
-  background: yellow;
-  color: black;
-}
-
-/* titles */
-
-abbr[title], acronym[title] {
-  text-decoration: dotted underline;
-}
-
-/* lists */
-
-ul, menu, dir {
-  display: block;
-  list-style-type: disc;
-  margin: 1em 0;
-  padding-left: 40px;
-}
-
-ol {
-  display: block;
-  list-style-type: decimal;
-  margin: 1em 0;
-  padding-left: 40px;
-}
-
-li {
-  display: list-item;
-}
-
-/*li:before {
-  display: -dompdf-list-bullet !important;
-  content: counter(-dompdf-default-counter) ". ";
-  padding-right: 0.5em;
-}*/
-
-/* nested lists have no top/bottom margins */
-:matches(ul, ol, dir, menu, dl) ul,
-:matches(ul, ol, dir, menu, dl) ol,
-:matches(ul, ol, dir, menu, dl) dir,
-:matches(ul, ol, dir, menu, dl) menu,
-:matches(ul, ol, dir, menu, dl) dl {
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-/* 2 deep unordered lists use a circle */
-:matches(ul, ol, dir, menu) ul,
-:matches(ul, ol, dir, menu) ul,
-:matches(ul, ol, dir, menu) ul,
-:matches(ul, ol, dir, menu) ul {
-  list-style-type: circle;
-}
-
-/* 3 deep (or more) unordered lists use a square */
-:matches(ul, ol, dir, menu) :matches(ul, ol, dir, menu) ul,
-:matches(ul, ol, dir, menu) :matches(ul, ol, dir, menu) menu,
-:matches(ul, ol, dir, menu) :matches(ul, ol, dir, menu) dir {
-  list-style-type: square;
-}
-
-/* forms */
-/* From https://drafts.csswg.org/css-ui-3/#default-style-sheet */
-form {
-  display: block;
-}
-
-input, button, select {
-  display: inline-block;
-  font-family: sans-serif;
-}
-
-input[type=text],
-input[type=password],
-select {
-  width: 12em;
-}
-
-input[type=text],
-input[type=password],
-input[type=button],
-input[type=submit],
-input[type=reset],
-input[type=file],
-button,
-textarea,
-select {
-  background: #FFF;
-  border: 1px solid #999;
-  padding: 2px;
-  margin: 2px;
-}
-
-input[type=button],
-input[type=submit],
-input[type=reset],
-input[type=file],
-button {
-  background: #CCC;
-  text-align: center;
-}
-
-input[type=file] {
-  width: 8em;
-}
-
-input[type=text]:before,
-input[type=button]:before,
-input[type=submit]:before,
-input[type=reset]:before {
-  content: attr(value);
-}
-
-input[type=file]:before {
-  content: "Choose a file";
-}
-
-input[type=password][value]:before {
-  font-family: "DejaVu Sans" !important;
-  content: "\2022\2022\2022\2022\2022\2022\2022\2022";
-  line-height: 1em;
-}
-
-input[type=checkbox],
-input[type=radio],
-select:after {
-  font-family: "DejaVu Sans" !important;
-  font-size: 18px;
-  line-height: 1;
-}
-
-input[type=checkbox]:before {
-  content: "\2610";
-}
-
-input[type=checkbox][checked]:before {
-  content: "\2611";
-}
-
-input[type=radio]:before {
-  content: "\25CB";
-}
-
-input[type=radio][checked]:before {
-  content: "\25C9";
-}
-
-textarea {
-  display: block;
-  height: 3em;
-  overflow: hidden;
-  font-family: monospace;
-  white-space: pre-wrap;
-  word-wrap: break-word;
-}
-
-select {
-  position: relative!important;
-  overflow: hidden!important;
-}
-
-select:after {
-  position: absolute;
-  right: 0;
-  top: 0;
-  height: 5em;
-  width: 1.4em;
-  text-align: center;
-  background: #CCC;
-  content: "\25BE";
-}
-
-select option {
-  display: none;
-}
-
-select option[selected] {
-  display: inline;
-}
-
-fieldset {
-  display: block;
-  margin: 0.6em 2px 2px;
-  padding: 0.75em;
-  border: 1pt groove #666;
-  position: relative;
-}
-
-fieldset > legend {
-  position: absolute;
-  top: -0.6em;
-  left: 0.75em;
-  padding: 0 0.3em;
-  background: white;
-}
-
-legend {
-  display: inline-block;
-}
-
-/* leafs */
-
-hr {
-  display: block;
-  height: 0;
-  border: 1px inset;
-  margin: 0.5em auto 0.5em auto;
-}
-
-hr[size="1"] {
-  border-style: solid none none none;
-}
-
-iframe {
-  border: 2px inset;
-}
-
-noframes {
-  display: block;
-}
-
-br {
-  display: -dompdf-br;
-}
-
-img, img_generated {
-  display: -dompdf-image !important;
-}
-
-dompdf_generated {
-  display: inline;
-}
-
-/* hidden elements */
-area, base, basefont, head, meta, script, style, title,
-noembed, param {
-  display: none;
-  -dompdf-keep: yes;
-}
diff --git a/vendor/dompdf/dompdf/phpcs.xml b/vendor/dompdf/dompdf/phpcs.xml
deleted file mode 100644
index fbda3fd..0000000
--- a/vendor/dompdf/dompdf/phpcs.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-
-
-
- Coding standard ruleset based on the PSR-2 coding standard.
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
- 
-  0
- 
-
diff --git a/vendor/dompdf/dompdf/src/Adapter/CPDF.php b/vendor/dompdf/dompdf/src/Adapter/CPDF.php
deleted file mode 100644
index 9d8f156..0000000
--- a/vendor/dompdf/dompdf/src/Adapter/CPDF.php
+++ /dev/null
@@ -1,1225 +0,0 @@
-
- * @author  Orion Richardson 
- * @author  Helmut Tischer 
- * @author  Fabien MƩnager 
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-// FIXME: Need to sanity check inputs to this class
-namespace Dompdf\Adapter;
-
-use Dompdf\Canvas;
-use Dompdf\Dompdf;
-use Dompdf\Helpers;
-use Dompdf\Exception;
-use Dompdf\Image\Cache;
-use Dompdf\PhpEvaluator;
-use FontLib\Exception\FontNotFoundException;
-
-/**
- * PDF rendering interface
- *
- * Dompdf\Adapter\CPDF provides a simple stateless interface to the stateful one
- * provided by the Cpdf class.
- *
- * Unless otherwise mentioned, all dimensions are in points (1/72 in).  The
- * coordinate origin is in the top left corner, and y values increase
- * downwards.
- *
- * See {@link http://www.ros.co.nz/pdf/} for more complete documentation
- * on the underlying {@link Cpdf} class.
- *
- * @package dompdf
- */
-class CPDF implements Canvas
-{
-
-    /**
-     * Dimensions of paper sizes in points
-     *
-     * @var array;
-     */
-    static $PAPER_SIZES = [
-        "4a0" => [0, 0, 4767.87, 6740.79],
-        "2a0" => [0, 0, 3370.39, 4767.87],
-        "a0" => [0, 0, 2383.94, 3370.39],
-        "a1" => [0, 0, 1683.78, 2383.94],
-        "a2" => [0, 0, 1190.55, 1683.78],
-        "a3" => [0, 0, 841.89, 1190.55],
-        "a4" => [0, 0, 595.28, 841.89],
-        "a5" => [0, 0, 419.53, 595.28],
-        "a6" => [0, 0, 297.64, 419.53],
-        "a7" => [0, 0, 209.76, 297.64],
-        "a8" => [0, 0, 147.40, 209.76],
-        "a9" => [0, 0, 104.88, 147.40],
-        "a10" => [0, 0, 73.70, 104.88],
-        "b0" => [0, 0, 2834.65, 4008.19],
-        "b1" => [0, 0, 2004.09, 2834.65],
-        "b2" => [0, 0, 1417.32, 2004.09],
-        "b3" => [0, 0, 1000.63, 1417.32],
-        "b4" => [0, 0, 708.66, 1000.63],
-        "b5" => [0, 0, 498.90, 708.66],
-        "b6" => [0, 0, 354.33, 498.90],
-        "b7" => [0, 0, 249.45, 354.33],
-        "b8" => [0, 0, 175.75, 249.45],
-        "b9" => [0, 0, 124.72, 175.75],
-        "b10" => [0, 0, 87.87, 124.72],
-        "c0" => [0, 0, 2599.37, 3676.54],
-        "c1" => [0, 0, 1836.85, 2599.37],
-        "c2" => [0, 0, 1298.27, 1836.85],
-        "c3" => [0, 0, 918.43, 1298.27],
-        "c4" => [0, 0, 649.13, 918.43],
-        "c5" => [0, 0, 459.21, 649.13],
-        "c6" => [0, 0, 323.15, 459.21],
-        "c7" => [0, 0, 229.61, 323.15],
-        "c8" => [0, 0, 161.57, 229.61],
-        "c9" => [0, 0, 113.39, 161.57],
-        "c10" => [0, 0, 79.37, 113.39],
-        "ra0" => [0, 0, 2437.80, 3458.27],
-        "ra1" => [0, 0, 1729.13, 2437.80],
-        "ra2" => [0, 0, 1218.90, 1729.13],
-        "ra3" => [0, 0, 864.57, 1218.90],
-        "ra4" => [0, 0, 609.45, 864.57],
-        "sra0" => [0, 0, 2551.18, 3628.35],
-        "sra1" => [0, 0, 1814.17, 2551.18],
-        "sra2" => [0, 0, 1275.59, 1814.17],
-        "sra3" => [0, 0, 907.09, 1275.59],
-        "sra4" => [0, 0, 637.80, 907.09],
-        "letter" => [0, 0, 612.00, 792.00],
-        "half-letter" => [0, 0, 396.00, 612.00],
-        "legal" => [0, 0, 612.00, 1008.00],
-        "ledger" => [0, 0, 1224.00, 792.00],
-        "tabloid" => [0, 0, 792.00, 1224.00],
-        "executive" => [0, 0, 521.86, 756.00],
-        "folio" => [0, 0, 612.00, 936.00],
-        "commercial #10 envelope" => [0, 0, 684, 297],
-        "catalog #10 1/2 envelope" => [0, 0, 648, 864],
-        "8.5x11" => [0, 0, 612.00, 792.00],
-        "8.5x14" => [0, 0, 612.00, 1008.0],
-        "11x17" => [0, 0, 792.00, 1224.00],
-    ];
-
-    /**
-     * The Dompdf object
-     *
-     * @var Dompdf
-     */
-    protected $_dompdf;
-
-    /**
-     * Instance of Cpdf class
-     *
-     * @var Cpdf
-     */
-    protected $_pdf;
-
-    /**
-     * PDF width, in points
-     *
-     * @var float
-     */
-    protected $_width;
-
-    /**
-     * PDF height, in points
-     *
-     * @var float;
-     */
-    protected $_height;
-
-    /**
-     * Current page number
-     *
-     * @var int
-     */
-    protected $_page_number;
-
-    /**
-     * Total number of pages
-     *
-     * @var int
-     */
-    protected $_page_count;
-
-    /**
-     * Text to display on every page
-     *
-     * @var array
-     */
-    protected $_page_text;
-
-    /**
-     * Array of pages for accessing after rendering is initially complete
-     *
-     * @var array
-     */
-    protected $_pages;
-
-    /**
-     * Array of temporary cached images to be deleted when processing is complete
-     *
-     * @var array
-     */
-    protected $_image_cache;
-
-    /**
-     * Currently-applied opacity level (0 - 1)
-     *
-     * @var float
-     */
-    protected $_current_opacity = 1;
-
-    /**
-     * Class constructor
-     *
-     * @param mixed $paper The size of paper to use in this PDF ({@link CPDF::$PAPER_SIZES})
-     * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
-     * @param Dompdf $dompdf The Dompdf instance
-     */
-    public function __construct($paper = "letter", $orientation = "portrait", Dompdf $dompdf)
-    {
-        if (is_array($paper)) {
-            $size = $paper;
-        } else if (isset(self::$PAPER_SIZES[mb_strtolower($paper)])) {
-            $size = self::$PAPER_SIZES[mb_strtolower($paper)];
-        } else {
-            $size = self::$PAPER_SIZES["letter"];
-        }
-
-        if (mb_strtolower($orientation) === "landscape") {
-            [$size[2], $size[3]] = [$size[3], $size[2]];
-        }
-
-        $this->_dompdf = $dompdf;
-
-        $this->_pdf = new \Dompdf\Cpdf(
-            $size,
-            true,
-            $dompdf->getOptions()->getFontCache(),
-            $dompdf->getOptions()->getTempDir()
-        );
-
-        $this->_pdf->addInfo("Producer", sprintf("%s + CPDF", $dompdf->version));
-        $time = substr_replace(date('YmdHisO'), '\'', -2, 0) . '\'';
-        $this->_pdf->addInfo("CreationDate", "D:$time");
-        $this->_pdf->addInfo("ModDate", "D:$time");
-
-        $this->_width = $size[2] - $size[0];
-        $this->_height = $size[3] - $size[1];
-
-        $this->_page_number = $this->_page_count = 1;
-        $this->_page_text = [];
-
-        $this->_pages = [$this->_pdf->getFirstPageId()];
-
-        $this->_image_cache = [];
-    }
-
-    /**
-     * @return Dompdf
-     */
-    public function get_dompdf()
-    {
-        return $this->_dompdf;
-    }
-
-    /**
-     * Class destructor
-     *
-     * Deletes all temporary image files
-     */
-    public function __destruct()
-    {
-        foreach ($this->_image_cache as $img) {
-            // The file might be already deleted by 3rd party tmp cleaner,
-            // the file might not have been created at all
-            // (if image outputting commands failed)
-            // or because the destructor was called twice accidentally.
-            if (!file_exists($img)) {
-                continue;
-            }
-
-            if ($this->_dompdf->getOptions()->getDebugPng()) {
-                print '[__destruct unlink ' . $img . ']';
-            }
-            if (!$this->_dompdf->getOptions()->getDebugKeepTemp()) {
-                unlink($img);
-            }
-        }
-    }
-
-    /**
-     * Returns the Cpdf instance
-     *
-     * @return \Dompdf\Cpdf
-     */
-    public function get_cpdf()
-    {
-        return $this->_pdf;
-    }
-
-    /**
-     * Add meta information to the PDF
-     *
-     * @param string $label label of the value (Creator, Producer, etc.)
-     * @param string $value the text to set
-     */
-    public function add_info($label, $value)
-    {
-        $this->_pdf->addInfo($label, $value);
-    }
-
-    /**
-     * Opens a new 'object'
-     *
-     * While an object is open, all drawing actions are recorded in the object,
-     * as opposed to being drawn on the current page.  Objects can be added
-     * later to a specific page or to several pages.
-     *
-     * The return value is an integer ID for the new object.
-     *
-     * @see CPDF::close_object()
-     * @see CPDF::add_object()
-     *
-     * @return int
-     */
-    public function open_object()
-    {
-        $ret = $this->_pdf->openObject();
-        $this->_pdf->saveState();
-        return $ret;
-    }
-
-    /**
-     * Reopens an existing 'object'
-     *
-     * @see CPDF::open_object()
-     * @param int $object the ID of a previously opened object
-     */
-    public function reopen_object($object)
-    {
-        $this->_pdf->reopenObject($object);
-        $this->_pdf->saveState();
-    }
-
-    /**
-     * Closes the current 'object'
-     *
-     * @see CPDF::open_object()
-     */
-    public function close_object()
-    {
-        $this->_pdf->restoreState();
-        $this->_pdf->closeObject();
-    }
-
-    /**
-     * Adds a specified 'object' to the document
-     *
-     * $object int specifying an object created with {@link
-     * CPDF::open_object()}.  $where can be one of:
-     * - 'add' add to current page only
-     * - 'all' add to every page from the current one onwards
-     * - 'odd' add to all odd numbered pages from now on
-     * - 'even' add to all even numbered pages from now on
-     * - 'next' add the object to the next page only
-     * - 'nextodd' add to all odd numbered pages from the next one
-     * - 'nexteven' add to all even numbered pages from the next one
-     *
-     * @see Cpdf::addObject()
-     *
-     * @param int $object
-     * @param string $where
-     */
-    public function add_object($object, $where = 'all')
-    {
-        $this->_pdf->addObject($object, $where);
-    }
-
-    /**
-     * Stops the specified 'object' from appearing in the document.
-     *
-     * The object will stop being displayed on the page following the current
-     * one.
-     *
-     * @param int $object
-     */
-    public function stop_object($object)
-    {
-        $this->_pdf->stopObject($object);
-    }
-
-    /**
-     * @access private
-     */
-    public function serialize_object($id)
-    {
-        // Serialize the pdf object's current state for retrieval later
-        return $this->_pdf->serializeObject($id);
-    }
-
-    /**
-     * @access private
-     */
-    public function reopen_serialized_object($obj)
-    {
-        return $this->_pdf->restoreSerializedObject($obj);
-    }
-
-    //........................................................................
-
-    /**
-     * Returns the PDF's width in points
-     * @return float
-     */
-    public function get_width()
-    {
-        return $this->_width;
-    }
-
-    /**
-     * Returns the PDF's height in points
-     * @return float
-     */
-    public function get_height()
-    {
-        return $this->_height;
-    }
-
-    /**
-     * Returns the current page number
-     * @return int
-     */
-    public function get_page_number()
-    {
-        return $this->_page_number;
-    }
-
-    /**
-     * Returns the total number of pages in the document
-     * @return int
-     */
-    public function get_page_count()
-    {
-        return $this->_page_count;
-    }
-
-    /**
-     * Sets the current page number
-     *
-     * @param int $num
-     */
-    public function set_page_number($num)
-    {
-        $this->_page_number = $num;
-    }
-
-    /**
-     * Sets the page count
-     *
-     * @param int $count
-     */
-    public function set_page_count($count)
-    {
-        $this->_page_count = $count;
-    }
-
-    /**
-     * Sets the stroke color
-     *
-     * See {@link Style::set_color()} for the format of the color array.
-     * @param array $color
-     */
-    protected function _set_stroke_color($color)
-    {
-        $this->_pdf->setStrokeColor($color);
-        $alpha = isset($color["alpha"]) ? $color["alpha"] : 1;
-        if ($this->_current_opacity != 1) {
-            $alpha *= $this->_current_opacity;
-        }
-        $this->_set_line_transparency("Normal", $alpha);
-    }
-
-    /**
-     * Sets the fill colour
-     *
-     * See {@link Style::set_color()} for the format of the colour array.
-     * @param array $color
-     */
-    protected function _set_fill_color($color)
-    {
-        $this->_pdf->setColor($color);
-        $alpha = isset($color["alpha"]) ? $color["alpha"] : 1;
-        if ($this->_current_opacity) {
-            $alpha *= $this->_current_opacity;
-        }
-        $this->_set_fill_transparency("Normal", $alpha);
-    }
-
-    /**
-     * Sets line transparency
-     * @see Cpdf::setLineTransparency()
-     *
-     * Valid blend modes are (case-sensitive):
-     *
-     * Normal, Multiply, Screen, Overlay, Darken, Lighten,
-     * ColorDodge, ColorBurn, HardLight, SoftLight, Difference,
-     * Exclusion
-     *
-     * @param string $mode the blending mode to use
-     * @param float $opacity 0.0 fully transparent, 1.0 fully opaque
-     */
-    protected function _set_line_transparency($mode, $opacity)
-    {
-        $this->_pdf->setLineTransparency($mode, $opacity);
-    }
-
-    /**
-     * Sets fill transparency
-     * @see Cpdf::setFillTransparency()
-     *
-     * Valid blend modes are (case-sensitive):
-     *
-     * Normal, Multiply, Screen, Overlay, Darken, Lighten,
-     * ColorDogde, ColorBurn, HardLight, SoftLight, Difference,
-     * Exclusion
-     *
-     * @param string $mode the blending mode to use
-     * @param float $opacity 0.0 fully transparent, 1.0 fully opaque
-     */
-    protected function _set_fill_transparency($mode, $opacity)
-    {
-        $this->_pdf->setFillTransparency($mode, $opacity);
-    }
-
-    /**
-     * Sets the line style
-     *
-     * @see Cpdf::setLineStyle()
-     *
-     * @param float $width
-     * @param string $cap
-     * @param string $join
-     * @param array $dash
-     */
-    protected function _set_line_style($width, $cap, $join, $dash)
-    {
-        $this->_pdf->setLineStyle($width, $cap, $join, $dash);
-    }
-
-    /**
-     * Sets the opacity
-     *
-     * @param $opacity
-     * @param $mode
-     */
-    public function set_opacity($opacity, $mode = "Normal")
-    {
-        $this->_set_line_transparency($mode, $opacity);
-        $this->_set_fill_transparency($mode, $opacity);
-        $this->_current_opacity = $opacity;
-    }
-
-    public function set_default_view($view, $options = [])
-    {
-        array_unshift($options, $view);
-        call_user_func_array([$this->_pdf, "openHere"], $options);
-    }
-
-    /**
-     * Remaps y coords from 4th to 1st quadrant
-     *
-     * @param float $y
-     * @return float
-     */
-    protected function y($y)
-    {
-        return $this->_height - $y;
-    }
-
-    /**
-     * Canvas implementation
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $x2
-     * @param float $y2
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     */
-    public function line($x1, $y1, $x2, $y2, $color, $width, $style = [])
-    {
-        $this->_set_stroke_color($color);
-        $this->_set_line_style($width, "butt", "", $style);
-
-        $this->_pdf->line($x1, $this->y($y1),
-            $x2, $this->y($y2));
-        $this->_set_line_transparency("Normal", $this->_current_opacity);
-    }
-
-    /**
-     * Draw line at the specified coordinates on every page.
-     *
-     * See {@link Style::munge_color()} for the format of the colour array.
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $x2
-     * @param float $y2
-     * @param array $color
-     * @param float $width
-     * @param array $style optional
-     */
-    public function page_line($x1, $y1, $x2, $y2, $color, $width, $style = [])
-    {
-        $_t = 'line';
-        $this->_page_text[] = compact('_t', 'x1', 'y1', 'x2', 'y2', 'color', 'width', 'style');
-    }
-
-    /**
-     * @param float $x
-     * @param float $y
-     * @param float $r1
-     * @param float $r2
-     * @param float $astart
-     * @param float $aend
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     */
-    public function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = [])
-    {
-        $this->_set_stroke_color($color);
-        $this->_set_line_style($width, "butt", "", $style);
-
-        $this->_pdf->ellipse($x, $this->y($y), $r1, $r2, 0, 8, $astart, $aend, false, false, true, false);
-        $this->_set_line_transparency("Normal", $this->_current_opacity);
-    }
-
-    /**
-     * Convert a GIF or BMP image to a PNG image
-     *
-     * @param string $image_url
-     * @param integer $type
-     *
-     * @throws Exception
-     * @return string The url of the newly converted image
-     */
-    protected function _convert_gif_bmp_to_png($image_url, $type)
-    {
-        $func_name = "imagecreatefrom$type";
-
-        if (!function_exists($func_name)) {
-            if (!method_exists(Helpers::class, $func_name)) {
-                throw new Exception("Function $func_name() not found.  Cannot convert $type image: $image_url.  Please install the image PHP extension.");
-            }
-            $func_name = "\\Dompdf\\Helpers::" . $func_name;
-        }
-
-        set_error_handler([Helpers::class, 'record_warnings']);
-
-        try {
-            $im = call_user_func($func_name, $image_url);
-
-            if ($im) {
-                imageinterlace($im, false);
-
-                $tmp_dir = $this->_dompdf->getOptions()->getTempDir();
-                $tmp_name = @tempnam($tmp_dir, "{$type}dompdf_img_");
-                @unlink($tmp_name);
-                $filename = "$tmp_name.png";
-                $this->_image_cache[] = $filename;
-
-                imagepng($im, $filename);
-                imagedestroy($im);
-            } else {
-                $filename = Cache::$broken_image;
-            }
-        } finally {
-            restore_error_handler();
-        }
-
-        return $filename;
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     */
-    public function rectangle($x1, $y1, $w, $h, $color, $width, $style = [])
-    {
-        $this->_set_stroke_color($color);
-        $this->_set_line_style($width, "butt", "", $style);
-        $this->_pdf->rectangle($x1, $this->y($y1) - $h, $w, $h);
-        $this->_set_line_transparency("Normal", $this->_current_opacity);
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param array $color
-     */
-    public function filled_rectangle($x1, $y1, $w, $h, $color)
-    {
-        $this->_set_fill_color($color);
-        $this->_pdf->filledRectangle($x1, $this->y($y1) - $h, $w, $h);
-        $this->_set_fill_transparency("Normal", $this->_current_opacity);
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     */
-    public function clipping_rectangle($x1, $y1, $w, $h)
-    {
-        $this->_pdf->clippingRectangle($x1, $this->y($y1) - $h, $w, $h);
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param float $rTL
-     * @param float $rTR
-     * @param float $rBR
-     * @param float $rBL
-     */
-    public function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL)
-    {
-        $this->_pdf->clippingRectangleRounded($x1, $this->y($y1) - $h, $w, $h, $rTL, $rTR, $rBR, $rBL);
-    }
-
-    /**
-     *
-     */
-    public function clipping_end()
-    {
-        $this->_pdf->clippingEnd();
-    }
-
-    /**
-     *
-     */
-    public function save()
-    {
-        $this->_pdf->saveState();
-    }
-
-    /**
-     *
-     */
-    public function restore()
-    {
-        $this->_pdf->restoreState();
-    }
-
-    /**
-     * @param $angle
-     * @param $x
-     * @param $y
-     */
-    public function rotate($angle, $x, $y)
-    {
-        $this->_pdf->rotate($angle, $x, $y);
-    }
-
-    /**
-     * @param $angle_x
-     * @param $angle_y
-     * @param $x
-     * @param $y
-     */
-    public function skew($angle_x, $angle_y, $x, $y)
-    {
-        $this->_pdf->skew($angle_x, $angle_y, $x, $y);
-    }
-
-    /**
-     * @param $s_x
-     * @param $s_y
-     * @param $x
-     * @param $y
-     */
-    public function scale($s_x, $s_y, $x, $y)
-    {
-        $this->_pdf->scale($s_x, $s_y, $x, $y);
-    }
-
-    /**
-     * @param $t_x
-     * @param $t_y
-     */
-    public function translate($t_x, $t_y)
-    {
-        $this->_pdf->translate($t_x, $t_y);
-    }
-
-    /**
-     * @param $a
-     * @param $b
-     * @param $c
-     * @param $d
-     * @param $e
-     * @param $f
-     */
-    public function transform($a, $b, $c, $d, $e, $f)
-    {
-        $this->_pdf->transform([$a, $b, $c, $d, $e, $f]);
-    }
-
-    /**
-     * @param array $points
-     * @param array $color
-     * @param null $width
-     * @param array $style
-     * @param bool $fill
-     */
-    public function polygon($points, $color, $width = null, $style = [], $fill = false)
-    {
-        $this->_set_fill_color($color);
-        $this->_set_stroke_color($color);
-
-        // Adjust y values
-        for ($i = 1; $i < count($points); $i += 2) {
-            $points[$i] = $this->y($points[$i]);
-        }
-
-        $this->_pdf->polygon($points, count($points) / 2, $fill);
-
-        $this->_set_fill_transparency("Normal", $this->_current_opacity);
-        $this->_set_line_transparency("Normal", $this->_current_opacity);
-    }
-
-    /**
-     * @param float $x
-     * @param float $y
-     * @param float $r1
-     * @param array $color
-     * @param null $width
-     * @param null $style
-     * @param bool $fill
-     */
-    public function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false)
-    {
-        $this->_set_fill_color($color);
-        $this->_set_stroke_color($color);
-
-        if (!$fill && isset($width)) {
-            $this->_set_line_style($width, "round", "round", $style);
-        }
-
-        $this->_pdf->ellipse($x, $this->y($y), $r1, 0, 0, 8, 0, 360, 1, $fill);
-
-        $this->_set_fill_transparency("Normal", $this->_current_opacity);
-        $this->_set_line_transparency("Normal", $this->_current_opacity);
-    }
-
-    /**
-     * @param string $img
-     * @param float $x
-     * @param float $y
-     * @param int $w
-     * @param int $h
-     * @param string $resolution
-     */
-    public function image($img, $x, $y, $w, $h, $resolution = "normal")
-    {
-        [$width, $height, $type] = Helpers::dompdf_getimagesize($img, $this->get_dompdf()->getHttpContext());
-
-        $debug_png = $this->_dompdf->getOptions()->getDebugPng();
-
-        if ($debug_png) {
-            print "[image:$img|$width|$height|$type]";
-        }
-
-        switch ($type) {
-            case "jpeg":
-                if ($debug_png) {
-                    print '!!!jpg!!!';
-                }
-                $this->_pdf->addJpegFromFile($img, $x, $this->y($y) - $h, $w, $h);
-                break;
-
-            case "gif":
-            /** @noinspection PhpMissingBreakStatementInspection */
-            case "bmp":
-                if ($debug_png) print '!!!bmp or gif!!!';
-                // @todo use cache for BMP and GIF
-                $img = $this->_convert_gif_bmp_to_png($img, $type);
-
-            case "png":
-                if ($debug_png) print '!!!png!!!';
-
-                $this->_pdf->addPngFromFile($img, $x, $this->y($y) - $h, $w, $h);
-                break;
-
-            case "svg":
-                if ($debug_png) print '!!!SVG!!!';
-
-                $this->_pdf->addSvgFromFile($img, $x, $this->y($y) - $h, $w, $h);
-                break;
-
-            default:
-                if ($debug_png) print '!!!unknown!!!';
-        }
-    }
-
-    public function select($x, $y, $w, $h, $font, $size, $color = [0, 0, 0], $opts = [])
-    {
-        $pdf = $this->_pdf;
-
-        $font .= ".afm";
-        $pdf->selectFont($font);
-
-        if (!isset($pdf->acroFormId)) {
-            $pdf->addForm();
-        }
-
-        $ft = \Dompdf\Cpdf::ACROFORM_FIELD_CHOICE;
-        $ff = \Dompdf\Cpdf::ACROFORM_FIELD_CHOICE_COMBO;
-
-        $id = $pdf->addFormField($ft, rand(), $x, $this->y($y) - $h, $x + $w, $this->y($y), $ff, $size, $color);
-        $pdf->setFormFieldOpt($id, $opts);
-    }
-
-    public function textarea($x, $y, $w, $h, $font, $size, $color = [0, 0, 0])
-    {
-        $pdf = $this->_pdf;
-
-        $font .= ".afm";
-        $pdf->selectFont($font);
-
-        if (!isset($pdf->acroFormId)) {
-            $pdf->addForm();
-        }
-
-        $ft = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT;
-        $ff = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT_MULTILINE;
-
-        $pdf->addFormField($ft, rand(), $x, $this->y($y) - $h, $x + $w, $this->y($y), $ff, $size, $color);
-    }
-
-    public function input($x, $y, $w, $h, $type, $font, $size, $color = [0, 0, 0])
-    {
-        $pdf = $this->_pdf;
-
-        $font .= ".afm";
-        $pdf->selectFont($font);
-
-        if (!isset($pdf->acroFormId)) {
-            $pdf->addForm();
-        }
-
-        $ft = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT;
-        $ff = 0;
-
-        switch($type) {
-            case 'text':
-                $ft = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT;
-                break;
-            case 'password':
-                $ft = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT;
-                $ff = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT_PASSWORD;
-                break;
-            case 'submit':
-                $ft = \Dompdf\Cpdf::ACROFORM_FIELD_BUTTON;
-                break;
-        }
-
-        $pdf->addFormField($ft, rand(), $x, $this->y($y) - $h, $x + $w, $this->y($y), $ff, $size, $color);
-    }
-
-    /**
-     * @param float $x
-     * @param float $y
-     * @param string $text
-     * @param string $font
-     * @param float $size
-     * @param array $color
-     * @param float $word_space
-     * @param float $char_space
-     * @param float $angle
-     */
-    public function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0)
-    {
-        $pdf = $this->_pdf;
-
-        $this->_set_fill_color($color);
-
-        $is_font_subsetting = $this->_dompdf->getOptions()->getIsFontSubsettingEnabled();
-        $pdf->selectFont($font . '.afm', '', true, $is_font_subsetting);
-
-        $pdf->addText($x, $this->y($y) - $pdf->getFontHeight($size), $size, $text, $angle, $word_space, $char_space);
-
-        $this->_set_fill_transparency("Normal", $this->_current_opacity);
-    }
-
-    /**
-     * @param string $code
-     */
-    public function javascript($code)
-    {
-        $this->_pdf->addJavascript($code);
-    }
-
-    //........................................................................
-
-    /**
-     * Add a named destination (similar to ... in html)
-     *
-     * @param string $anchorname The name of the named destination
-     */
-    public function add_named_dest($anchorname)
-    {
-        $this->_pdf->addDestination($anchorname, "Fit");
-    }
-
-    /**
-     * Add a link to the pdf
-     *
-     * @param string $url The url to link to
-     * @param float $x The x position of the link
-     * @param float $y The y position of the link
-     * @param float $width The width of the link
-     * @param float $height The height of the link
-     */
-    public function add_link($url, $x, $y, $width, $height)
-    {
-        $y = $this->y($y) - $height;
-
-        if (strpos($url, '#') === 0) {
-            // Local link
-            $name = substr($url, 1);
-            if ($name) {
-                $this->_pdf->addInternalLink($name, $x, $y, $x + $width, $y + $height);
-            }
-        } else {
-            $this->_pdf->addLink(rawurldecode($url), $x, $y, $x + $width, $y + $height);
-        }
-    }
-
-    /**
-     * @param string $text
-     * @param string $font
-     * @param float $size
-     * @param int $word_spacing
-     * @param int $char_spacing
-     * @return float|int
-     */
-    public function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0)
-    {
-        $this->_pdf->selectFont($font, '', true, $this->_dompdf->getOptions()->getIsFontSubsettingEnabled());
-        return $this->_pdf->getTextWidth($size, $text, $word_spacing, $char_spacing);
-    }
-
-    /**
-     * @param $font
-     * @param $string
-     */
-    public function register_string_subset($font, $string)
-    {
-        $this->_pdf->registerText($font, $string);
-    }
-
-    /**
-     * @param string $font
-     * @param float $size
-     * @return float|int
-     * @throws FontNotFoundException
-     */
-    public function get_font_height($font, $size)
-    {
-        $options = $this->_dompdf->getOptions();
-        $this->_pdf->selectFont($font, '', true, $options->getIsFontSubsettingEnabled());
-
-        return $this->_pdf->getFontHeight($size) * $options->getFontHeightRatio();
-    }
-
-    /*function get_font_x_height($font, $size) {
-      $this->_pdf->selectFont($font);
-      $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();
-      return $this->_pdf->getFontXHeight($size) * $ratio;
-    }*/
-
-    /**
-     * @param string $font
-     * @param float $size
-     * @return float
-     */
-    public function get_font_baseline($font, $size)
-    {
-        $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();
-        return $this->get_font_height($font, $size) / $ratio;
-    }
-
-    /**
-     * Writes text at the specified x and y coordinates on every page
-     *
-     * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced
-     * with their current values.
-     *
-     * See {@link Style::munge_color()} for the format of the colour array.
-     *
-     * @param float $x
-     * @param float $y
-     * @param string $text the text to write
-     * @param string $font the font file to use
-     * @param float $size the font size, in points
-     * @param array $color
-     * @param float $word_space word spacing adjustment
-     * @param float $char_space char spacing adjustment
-     * @param float $angle angle to write the text at, measured CW starting from the x-axis
-     */
-    public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0)
-    {
-        $_t = "text";
-        $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "word_space", "char_space", "angle");
-    }
-
-    /**
-     * Processes a script on every page
-     *
-     * The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available.
-     *
-     * This function can be used to add page numbers to all pages
-     * after the first one, for example.
-     *
-     * @param string $code the script code
-     * @param string $type the language type for script
-     */
-    public function page_script($code, $type = "text/php")
-    {
-        $_t = "script";
-        $this->_page_text[] = compact("_t", "code", "type");
-    }
-
-    /**
-     * @return int
-     */
-    public function new_page()
-    {
-        $this->_page_number++;
-        $this->_page_count++;
-
-        $ret = $this->_pdf->newPage();
-        $this->_pages[] = $ret;
-        return $ret;
-    }
-
-    /**
-     * Add text to each page after rendering is complete
-     */
-    protected function _add_page_text()
-    {
-        if (!count($this->_page_text)) {
-            return;
-        }
-
-        $page_number = 1;
-        $eval = null;
-
-        foreach ($this->_pages as $pid) {
-            $this->reopen_object($pid);
-
-            foreach ($this->_page_text as $pt) {
-                extract($pt);
-
-                switch ($_t) {
-                    case "text":
-                        $text = str_replace(["{PAGE_NUM}", "{PAGE_COUNT}"],
-                            [$page_number, $this->_page_count], $text);
-                        $this->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);
-                        break;
-
-                    case "script":
-                        if (!$eval) {
-                            $eval = new PhpEvaluator($this);
-                        }
-                        $eval->evaluate($code, ['PAGE_NUM' => $page_number, 'PAGE_COUNT' => $this->_page_count]);
-                        break;
-
-                    case 'line':
-                        $this->line( $x1, $y1, $x2, $y2, $color, $width, $style );
-                        break;
-                }
-            }
-
-            $this->close_object();
-            $page_number++;
-        }
-    }
-
-    /**
-     * Streams the PDF to the client.
-     *
-     * @param string $filename The filename to present to the client.
-     * @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1).
-     */
-    public function stream($filename = "document.pdf", $options = [])
-    {
-        if (headers_sent()) {
-            die("Unable to stream pdf: headers already sent");
-        }
-
-        if (!isset($options["compress"])) $options["compress"] = true;
-        if (!isset($options["Attachment"])) $options["Attachment"] = true;
-
-        $this->_add_page_text();
-
-        $debug = !$options['compress'];
-        $tmp = ltrim($this->_pdf->output($debug));
-
-        header("Cache-Control: private");
-        header("Content-Type: application/pdf");
-        header("Content-Length: " . mb_strlen($tmp, "8bit"));
-
-        $filename = str_replace(["\n", "'"], "", basename($filename, ".pdf")) . ".pdf";
-        $attachment = $options["Attachment"] ? "attachment" : "inline";
-        header(Helpers::buildContentDispositionHeader($attachment, $filename));
-
-        echo $tmp;
-        flush();
-    }
-
-    /**
-     * Returns the PDF as a string.
-     *
-     * @param array $options Associative array: 'compress' => 1 or 0 (default 1).
-     * @return string
-     */
-    public function output($options = [])
-    {
-        if (!isset($options["compress"])) $options["compress"] = true;
-
-        $this->_add_page_text();
-
-        $debug = !$options['compress'];
-
-        return $this->_pdf->output($debug);
-    }
-
-    /**
-     * Returns logging messages generated by the Cpdf class
-     *
-     * @return string
-     */
-    public function get_messages()
-    {
-        return $this->_pdf->messages;
-    }
-}
diff --git a/vendor/dompdf/dompdf/src/Adapter/GD.php b/vendor/dompdf/dompdf/src/Adapter/GD.php
deleted file mode 100644
index 229776b..0000000
--- a/vendor/dompdf/dompdf/src/Adapter/GD.php
+++ /dev/null
@@ -1,1113 +0,0 @@
-
- * @author  Fabien MƩnager 
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-namespace Dompdf\Adapter;
-
-use Dompdf\Canvas;
-use Dompdf\Dompdf;
-use Dompdf\Image\Cache;
-use Dompdf\Helpers;
-
-/**
- * Image rendering interface
- *
- * Renders to an image format supported by GD (jpeg, gif, png, xpm).
- * Not super-useful day-to-day but handy nonetheless
- *
- * @package dompdf
- */
-class GD implements Canvas
-{
-    /**
-     * @var Dompdf
-     */
-    protected $_dompdf;
-
-    /**
-     * Resource handle for the image
-     *
-     * @var resource
-     */
-    protected $_img;
-
-    /**
-     * Resource handle for the image
-     *
-     * @var resource[]
-     */
-    protected $_imgs;
-
-    /**
-     * Apparent canvas width in pixels
-     *
-     * @var int
-     */
-    protected $_width;
-
-    /**
-     * Apparent canvas height in pixels
-     *
-     * @var int
-     */
-    protected $_height;
-
-    /**
-     * Actual image width in pixels
-     *
-     * @var int
-     */
-    protected $_actual_width;
-
-    /**
-     * Actual image height in pixels
-     *
-     * @var int
-     */
-    protected $_actual_height;
-
-    /**
-     * Current page number
-     *
-     * @var int
-     */
-    protected $_page_number;
-
-    /**
-     * Total number of pages
-     *
-     * @var int
-     */
-    protected $_page_count;
-
-    /**
-     * Image antialias factor
-     *
-     * @var float
-     */
-    protected $_aa_factor;
-
-    /**
-     * Allocated colors
-     *
-     * @var array
-     */
-    protected $_colors;
-
-    /**
-     * Background color
-     *
-     * @var int
-     */
-    protected $_bg_color;
-
-    /**
-     * Background color array
-     *
-     * @var int
-     */
-    protected $_bg_color_array;
-
-    /**
-     * Actual DPI
-     *
-     * @var int
-     */
-    protected $dpi;
-
-    /**
-     * Amount to scale font sizes
-     *
-     * Font sizes are 72 DPI, GD internally uses 96. Scale them proportionally.
-     * 72 / 96 = 0.75.
-     *
-     * @var float
-     */
-    const FONT_SCALE = 0.75;
-
-    /**
-     * Class constructor
-     *
-     * @param mixed $size The size of image to create: array(x1,y1,x2,y2) or "letter", "legal", etc.
-     * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
-     * @param Dompdf $dompdf
-     * @param float $aa_factor Anti-aliasing factor, 1 for no AA
-     * @param array $bg_color Image background color: array(r,g,b,a), 0 <= r,g,b,a <= 1
-     */
-    public function __construct($size = 'letter', $orientation = "portrait", Dompdf $dompdf, $aa_factor = 1.0, $bg_color = [1, 1, 1, 0])
-    {
-
-        if (!is_array($size)) {
-            $size = strtolower($size);
-
-            if (isset(CPDF::$PAPER_SIZES[$size])) {
-                $size = CPDF::$PAPER_SIZES[$size];
-            } else {
-                $size = CPDF::$PAPER_SIZES["letter"];
-            }
-        }
-
-        if (strtolower($orientation) === "landscape") {
-            list($size[2], $size[3]) = [$size[3], $size[2]];
-        }
-
-        $this->_dompdf = $dompdf;
-
-        $this->dpi = $this->get_dompdf()->getOptions()->getDpi();
-
-        if ($aa_factor < 1) {
-            $aa_factor = 1;
-        }
-
-        $this->_aa_factor = $aa_factor;
-
-        $size[2] *= $aa_factor;
-        $size[3] *= $aa_factor;
-
-        $this->_width = $size[2] - $size[0];
-        $this->_height = $size[3] - $size[1];
-
-        $this->_actual_width = $this->_upscale($this->_width);
-        $this->_actual_height = $this->_upscale($this->_height);
-
-        $this->_page_number = $this->_page_count = 1;
-        $this->_page_text = [];
-
-        if (is_null($bg_color) || !is_array($bg_color)) {
-            // Pure white bg
-            $bg_color = [1, 1, 1, 0];
-        }
-
-        $this->_bg_color_array = $bg_color;
-
-        $this->new_page();
-    }
-
-    /**
-     * @return Dompdf
-     */
-    public function get_dompdf()
-    {
-        return $this->_dompdf;
-    }
-
-    /**
-     * Return the GF image resource
-     *
-     * @return resource
-     */
-    public function get_image()
-    {
-        return $this->_img;
-    }
-
-    /**
-     * Return the image's width in pixels
-     *
-     * @return float
-     */
-    public function get_width()
-    {
-        return $this->_width / $this->_aa_factor;
-    }
-
-    /**
-     * Return the image's height in pixels
-     *
-     * @return float
-     */
-    public function get_height()
-    {
-        return $this->_height / $this->_aa_factor;
-    }
-
-    /**
-     * Returns the current page number
-     * @return int
-     */
-    public function get_page_number()
-    {
-        return $this->_page_number;
-    }
-
-    /**
-     * Returns the total number of pages in the document
-     * @return int
-     */
-    public function get_page_count()
-    {
-        return $this->_page_count;
-    }
-
-    /**
-     * Sets the current page number
-     *
-     * @param int $num
-     */
-    public function set_page_number($num)
-    {
-        $this->_page_number = $num;
-    }
-
-    /**
-     * Sets the page count
-     *
-     * @param int $count
-     */
-    public function set_page_count($count)
-    {
-        $this->_page_count = $count;
-    }
-
-    /**
-     * Sets the opacity
-     *
-     * @param $opacity
-     * @param $mode
-     */
-    public function set_opacity($opacity, $mode = "Normal")
-    {
-        // FIXME
-    }
-
-    /**
-     * Allocate a new color.  Allocate with GD as needed and store
-     * previously allocated colors in $this->_colors.
-     *
-     * @param array $color The new current color
-     * @return int           The allocated color
-     */
-    protected function _allocate_color($color)
-    {
-        $a = isset($color["alpha"]) ? $color["alpha"] : 1;
-
-        if (isset($color["c"])) {
-            $color = Helpers::cmyk_to_rgb($color);
-        }
-
-        list($r, $g, $b) = $color;
-
-        $r *= 255;
-        $g *= 255;
-        $b *= 255;
-        $a = 127 - ($a * 127);
-
-        // Clip values
-        $r = $r > 255 ? 255 : $r;
-        $g = $g > 255 ? 255 : $g;
-        $b = $b > 255 ? 255 : $b;
-        $a = $a > 127 ? 127 : $a;
-
-        $r = $r < 0 ? 0 : $r;
-        $g = $g < 0 ? 0 : $g;
-        $b = $b < 0 ? 0 : $b;
-        $a = $a < 0 ? 0 : $a;
-
-        $key = sprintf("#%02X%02X%02X%02X", $r, $g, $b, $a);
-
-        if (isset($this->_colors[$key])) {
-            return $this->_colors[$key];
-        }
-
-        if ($a != 0) {
-            $this->_colors[$key] = imagecolorallocatealpha($this->get_image(), $r, $g, $b, $a);
-        } else {
-            $this->_colors[$key] = imagecolorallocate($this->get_image(), $r, $g, $b);
-        }
-
-        return $this->_colors[$key];
-    }
-
-    /**
-     * Scales value up to the current canvas DPI from 72 DPI
-     *
-     * @param float $length
-     * @return float
-     */
-    protected function _upscale($length)
-    {
-        return ($length * $this->dpi) / 72 * $this->_aa_factor;
-    }
-
-    /**
-     * Scales value down from the current canvas DPI to 72 DPI
-     *
-     * @param float $length
-     * @return float
-     */
-    protected function _downscale($length)
-    {
-        return ($length / $this->dpi * 72) / $this->_aa_factor;
-    }
-
-    /**
-     * Draws a line from x1,y1 to x2,y2
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     * See {@link Cpdf::setLineStyle()} for a description of the format of the
-     * $style parameter (aka dash).
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $x2
-     * @param float $y2
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     */
-    public function line($x1, $y1, $x2, $y2, $color, $width, $style = null)
-    {
-
-        // Scale by the AA factor and DPI
-        $x1 = $this->_upscale($x1);
-        $y1 = $this->_upscale($y1);
-        $x2 = $this->_upscale($x2);
-        $y2 = $this->_upscale($y2);
-        $width = $this->_upscale($width);
-
-        $c = $this->_allocate_color($color);
-
-        // Convert the style array if required
-        if (is_array($style) && count($style) > 0) {
-            $gd_style = [];
-
-            if (count($style) == 1) {
-                for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) {
-                    $gd_style[] = $c;
-                }
-
-                for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) {
-                    $gd_style[] = $this->_bg_color;
-                }
-            } else {
-                $i = 0;
-                foreach ($style as $length) {
-                    if ($i % 2 == 0) {
-                        // 'On' pattern
-                        for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) {
-                            $gd_style[] = $c;
-                        }
-
-                    } else {
-                        // Off pattern
-                        for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) {
-                            $gd_style[] = $this->_bg_color;
-                        }
-                    }
-                    $i++;
-                }
-            }
-
-            if (!empty($gd_style)) {
-                imagesetstyle($this->get_image(), $gd_style);
-                $c = IMG_COLOR_STYLED;
-            }
-        }
-
-        imagesetthickness($this->get_image(), $width);
-
-        imageline($this->get_image(), $x1, $y1, $x2, $y2, $c);
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $r1
-     * @param float $r2
-     * @param float $astart
-     * @param float $aend
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     */
-    public function arc($x1, $y1, $r1, $r2, $astart, $aend, $color, $width, $style = [])
-    {
-        // @todo
-    }
-
-    /**
-     * Draws a rectangle at x1,y1 with width w and height h
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     * See {@link Cpdf::setLineStyle()} for a description of the $style
-     * parameter (aka dash)
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     */
-    public function rectangle($x1, $y1, $w, $h, $color, $width, $style = null)
-    {
-
-        // Scale by the AA factor and DPI
-        $x1 = $this->_upscale($x1);
-        $y1 = $this->_upscale($y1);
-        $w = $this->_upscale($w);
-        $h = $this->_upscale($h);
-        $width = $this->_upscale($width);
-
-        $c = $this->_allocate_color($color);
-
-        // Convert the style array if required
-        if (is_array($style) && count($style) > 0) {
-            $gd_style = [];
-
-            foreach ($style as $length) {
-                for ($i = 0; $i < $length; $i++) {
-                    $gd_style[] = $c;
-                }
-            }
-
-            if (!empty($gd_style)) {
-                imagesetstyle($this->get_image(), $gd_style);
-                $c = IMG_COLOR_STYLED;
-            }
-        }
-
-        imagesetthickness($this->get_image(), $width);
-
-        imagerectangle($this->get_image(), $x1, $y1, $x1 + $w, $y1 + $h, $c);
-    }
-
-    /**
-     * Draws a filled rectangle at x1,y1 with width w and height h
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param array $color
-     */
-    public function filled_rectangle($x1, $y1, $w, $h, $color)
-    {
-        // Scale by the AA factor and DPI
-        $x1 = $this->_upscale($x1);
-        $y1 = $this->_upscale($y1);
-        $w = $this->_upscale($w);
-        $h = $this->_upscale($h);
-
-        $c = $this->_allocate_color($color);
-
-        imagefilledrectangle($this->get_image(), $x1, $y1, $x1 + $w, $y1 + $h, $c);
-    }
-
-    /**
-     * Starts a clipping rectangle at x1,y1 with width w and height h
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     */
-    public function clipping_rectangle($x1, $y1, $w, $h)
-    {
-        // @todo
-    }
-
-    public function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL)
-    {
-        // @todo
-    }
-
-    /**
-     * Ends the last clipping shape
-     */
-    public function clipping_end()
-    {
-        // @todo
-    }
-
-    /**
-     *
-     */
-    public function save()
-    {
-        $this->get_dompdf()->getOptions()->setDpi(72);
-    }
-
-    /**
-     *
-     */
-    public function restore()
-    {
-        $this->get_dompdf()->getOptions()->setDpi($this->dpi);
-    }
-
-    /**
-     * @param $angle
-     * @param $x
-     * @param $y
-     */
-    public function rotate($angle, $x, $y)
-    {
-        // @todo
-    }
-
-    /**
-     * @param $angle_x
-     * @param $angle_y
-     * @param $x
-     * @param $y
-     */
-    public function skew($angle_x, $angle_y, $x, $y)
-    {
-        // @todo
-    }
-
-    /**
-     * @param $s_x
-     * @param $s_y
-     * @param $x
-     * @param $y
-     */
-    public function scale($s_x, $s_y, $x, $y)
-    {
-        // @todo
-    }
-
-    /**
-     * @param $t_x
-     * @param $t_y
-     */
-    public function translate($t_x, $t_y)
-    {
-        // @todo
-    }
-
-    /**
-     * @param $a
-     * @param $b
-     * @param $c
-     * @param $d
-     * @param $e
-     * @param $f
-     */
-    public function transform($a, $b, $c, $d, $e, $f)
-    {
-        // @todo
-    }
-
-    /**
-     * Draws a polygon
-     *
-     * The polygon is formed by joining all the points stored in the $points
-     * array.  $points has the following structure:
-     * 
-     * array(0 => x1,
-     *       1 => y1,
-     *       2 => x2,
-     *       3 => y2,
-     *       ...
-     *       );
-     * 
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     * See {@link Cpdf::setLineStyle()} for a description of the $style
-     * parameter (aka dash)
-     *
-     * @param array $points
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     * @param bool $fill Fills the polygon if true
-     */
-    public function polygon($points, $color, $width = null, $style = null, $fill = false)
-    {
-
-        // Scale each point by the AA factor and DPI
-        foreach (array_keys($points) as $i) {
-            $points[$i] = $this->_upscale($points[$i]);
-        }
-
-        $c = $this->_allocate_color($color);
-
-        // Convert the style array if required
-        if (is_array($style) && count($style) > 0 && !$fill) {
-            $gd_style = [];
-
-            foreach ($style as $length) {
-                for ($i = 0; $i < $length; $i++) {
-                    $gd_style[] = $c;
-                }
-            }
-
-            if (!empty($gd_style)) {
-                imagesetstyle($this->get_image(), $gd_style);
-                $c = IMG_COLOR_STYLED;
-            }
-        }
-
-        imagesetthickness($this->get_image(), $width);
-
-        if ($fill) {
-            imagefilledpolygon($this->get_image(), $points, count($points) / 2, $c);
-        } else {
-            imagepolygon($this->get_image(), $points, count($points) / 2, $c);
-        }
-    }
-
-    /**
-     * Draws a circle at $x,$y with radius $r
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     * See {@link Cpdf::setLineStyle()} for a description of the $style
-     * parameter (aka dash)
-     *
-     * @param float $x
-     * @param float $y
-     * @param float $r
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     * @param bool $fill Fills the circle if true
-     */
-    public function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false)
-    {
-        // Scale by the AA factor and DPI
-        $x = $this->_upscale($x);
-        $y = $this->_upscale($y);
-        $r = $this->_upscale($r);
-
-        $c = $this->_allocate_color($color);
-
-        // Convert the style array if required
-        if (is_array($style) && count($style) > 0 && !$fill) {
-            $gd_style = [];
-
-            foreach ($style as $length) {
-                for ($i = 0; $i < $length; $i++) {
-                    $gd_style[] = $c;
-                }
-            }
-
-            if (!empty($gd_style)) {
-                imagesetstyle($this->get_image(), $gd_style);
-                $c = IMG_COLOR_STYLED;
-            }
-        }
-
-        imagesetthickness($this->get_image(), $width);
-
-        if ($fill) {
-            imagefilledellipse($this->get_image(), $x, $y, $r, $r, $c);
-        } else {
-            imageellipse($this->get_image(), $x, $y, $r, $r, $c);
-        }
-    }
-
-    /**
-     * Add an image to the pdf.
-     * The image is placed at the specified x and y coordinates with the
-     * given width and height.
-     *
-     * @param string $img_url the path to the image
-     * @param float $x x position
-     * @param float $y y position
-     * @param int $w width (in pixels)
-     * @param int $h height (in pixels)
-     * @param string $resolution
-     * @return void
-     *
-     * @throws \Exception
-     * @internal param string $img_type the type (e.g. extension) of the image
-     */
-    public function image($img_url, $x, $y, $w, $h, $resolution = "normal")
-    {
-        $img_type = Cache::detect_type($img_url, $this->get_dompdf()->getHttpContext());
-
-        if (!$img_type) {
-            return;
-        }
-
-        $func_name = "imagecreatefrom$img_type";
-        if (!function_exists($func_name)) {
-            if (!method_exists("Dompdf\Helpers", $func_name)) {
-                throw new \Exception("Function $func_name() not found.  Cannot convert $img_type image: $img_url.  Please install the image PHP extension.");
-            }
-            $func_name = "\\Dompdf\\Helpers::" . $func_name;
-        }
-        $src = @call_user_func($func_name, $img_url);
-
-        if (!$src) {
-            return; // Probably should add to $_dompdf_errors or whatever here
-        }
-
-        // Scale by the AA factor and DPI
-        $x = $this->_upscale($x);
-        $y = $this->_upscale($y);
-
-        $w = $this->_upscale($w);
-        $h = $this->_upscale($h);
-
-        $img_w = imagesx($src);
-        $img_h = imagesy($src);
-
-        imagecopyresampled($this->get_image(), $src, $x, $y, 0, 0, $w, $h, $img_w, $img_h);
-    }
-
-    /**
-     * Writes text at the specified x and y coordinates
-     * See {@link Style::munge_color()} for the format of the color array.
-     *
-     * @param float $x
-     * @param float $y
-     * @param string $text the text to write
-     * @param string $font the font file to use
-     * @param float $size the font size, in points
-     * @param array $color
-     * @param float $word_spacing word spacing adjustment
-     * @param float $char_spacing
-     * @param float $angle Text angle
-     *
-     * @return void
-     */
-    public function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_spacing = 0.0, $char_spacing = 0.0, $angle = 0.0)
-    {
-        // Scale by the AA factor and DPI
-        $x = $this->_upscale($x);
-        $y = $this->_upscale($y);
-        $size = $this->_upscale($size) * self::FONT_SCALE;
-
-        $h = $this->get_font_height_actual($font, $size);
-        $c = $this->_allocate_color($color);
-
-        // imagettftext() converts numeric entities to their respective
-        // character. Preserve any originally double encoded entities to be
-        // represented as is.
-        // eg: &#160; will render   rather than its character.
-        $text = preg_replace('/&(#(?:x[a-fA-F0-9]+|[0-9]+);)/', '&\1', $text);
-
-        $text = mb_encode_numericentity($text, [0x0080, 0xff, 0, 0xff], 'UTF-8');
-
-        $font = $this->get_ttf_file($font);
-
-        // FIXME: word spacing
-        imagettftext($this->get_image(), $size, $angle, $x, $y + $h, $c, $font, $text);
-    }
-
-    public function javascript($code)
-    {
-        // Not implemented
-    }
-
-    /**
-     * Add a named destination (similar to ... in html)
-     *
-     * @param string $anchorname The name of the named destination
-     */
-    public function add_named_dest($anchorname)
-    {
-        // Not implemented
-    }
-
-    /**
-     * Add a link to the pdf
-     *
-     * @param string $url The url to link to
-     * @param float $x The x position of the link
-     * @param float $y The y position of the link
-     * @param float $width The width of the link
-     * @param float $height The height of the link
-     */
-    public function add_link($url, $x, $y, $width, $height)
-    {
-        // Not implemented
-    }
-
-    /**
-     * Add meta information to the PDF
-     *
-     * @param string $label label of the value (Creator, Producer, etc.)
-     * @param string $value the text to set
-     */
-    public function add_info($label, $value)
-    {
-        // N/A
-    }
-
-    /**
-     * @param string $view
-     * @param array $options
-     */
-    public function set_default_view($view, $options = [])
-    {
-        // N/A
-    }
-
-    /**
-     * Calculates text size, in points
-     *
-     * @param string $text the text to be sized
-     * @param string $font the desired font
-     * @param float $size the desired font size
-     * @param float $word_spacing word spacing, if any
-     * @param float $char_spacing char spacing, if any
-     *
-     * @return float
-     */
-    public function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0)
-    {
-        $font = $this->get_ttf_file($font);
-        $size = $this->_upscale($size) * self::FONT_SCALE;
-
-        // imagettfbbox() converts numeric entities to their respective
-        // character. Preserve any originally double encoded entities to be
-        // represented as is.
-        // eg: &#160; will render   rather than its character.
-        $text = preg_replace('/&(#(?:x[a-fA-F0-9]+|[0-9]+);)/', '&\1', $text);
-
-        $text = mb_encode_numericentity($text, [0x0080, 0xffff, 0, 0xffff], 'UTF-8');
-
-        // FIXME: word spacing
-        list($x1, , $x2) = imagettfbbox($size, 0, $font, $text);
-
-        // Add additional 1pt to prevent text overflow issues
-        return $this->_downscale($x2 - $x1) + 1;
-    }
-
-    /**
-     * @param $font
-     * @return string
-     */
-    public function get_ttf_file($font)
-    {
-        if ( stripos($font, ".ttf") === false ) {
-            $font .= ".ttf";
-        }
-
-        if (!file_exists($font)) {
-            $font_metrics = $this->_dompdf->getFontMetrics();
-            $font = $font_metrics->getFont($this->_dompdf->getOptions()->getDefaultFont()) . ".ttf";
-            if (!file_exists($font)) {
-                if (strpos($font, "mono")) {
-                    $font = $font_metrics->getFont("DejaVu Mono") . ".ttf";
-                } elseif (strpos($font, "sans") !== false) {
-                    $font = $font_metrics->getFont("DejaVu Sans") . ".ttf";
-                } elseif (strpos($font, "serif")) {
-                    $font = $font_metrics->getFont("DejaVu Serif") . ".ttf";
-                } else {
-                    $font = $font_metrics->getFont("DejaVu Sans") . ".ttf";
-                }
-            }
-        }
-
-        return $font;
-    }
-
-    /**
-     * Calculates font height, in points
-     *
-     * @param string $font
-     * @param float $size
-     * @return float
-     */
-    public function get_font_height($font, $size)
-    {
-        $size = $this->_upscale($size) * self::FONT_SCALE;
-
-        $height = $this->get_font_height_actual($font, $size);
-
-        return $this->_downscale($height);
-    }
-
-    protected function get_font_height_actual($font, $size)
-    {
-        $font = $this->get_ttf_file($font);
-        $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();
-
-        // FIXME: word spacing
-        list(, $y2, , , , $y1) = imagettfbbox($size, 0, $font, "MXjpqytfhl"); // Test string with ascenders, descenders and caps
-        return ($y2 - $y1) * $ratio;
-    }
-
-    /**
-     * @param string $font
-     * @param float $size
-     * @return float
-     */
-    public function get_font_baseline($font, $size)
-    {
-        $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();
-        return $this->get_font_height($font, $size) / $ratio;
-    }
-
-    /**
-     * Starts a new page
-     *
-     * Subsequent drawing operations will appear on the new page.
-     */
-    public function new_page()
-    {
-        $this->_page_number++;
-        $this->_page_count++;
-
-        $this->_img = imagecreatetruecolor($this->_actual_width, $this->_actual_height);
-
-        $this->_bg_color = $this->_allocate_color($this->_bg_color_array);
-        imagealphablending($this->_img, true);
-        imagesavealpha($this->_img, true);
-        imagefill($this->_img, 0, 0, $this->_bg_color);
-
-        $this->_imgs[] = $this->_img;
-    }
-
-    public function open_object()
-    {
-        // N/A
-    }
-
-    public function close_object()
-    {
-        // N/A
-    }
-
-    public function add_object()
-    {
-        // N/A
-    }
-
-    /**
-     * Writes text at the specified x and y coordinates on every page
-     *
-     * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced
-     * with their current values.
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     *
-     * @param float  $x
-     * @param float  $y
-     * @param string $text       the text to write
-     * @param string $font       the font file to use
-     * @param float  $size       the font size, in points
-     * @param array  $color
-     * @param float  $word_space word spacing adjustment
-     * @param float  $char_space char spacing adjustment
-     * @param float  $angle      angle to write the text at, measured CW starting from the x-axis
-     */
-    public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0)
-    {
-        // N/A
-    }
-
-    public function page_line()
-    {
-        // N/A
-    }
-
-    /**
-     * Streams the image to the client.
-     *
-     * @param string $filename The filename to present to the client.
-     * @param array $options Associative array: 'type' => jpeg|jpg|png; 'quality' => 0 - 100 (JPEG only);
-     *     'page' => Number of the page to output (defaults to the first); 'Attachment': 1 or 0 (default 1).
-     */
-    public function stream($filename, $options = [])
-    {
-        if (headers_sent()) {
-            die("Unable to stream image: headers already sent");
-        }
-
-        if (!isset($options["type"])) $options["type"] = "png";
-        if (!isset($options["Attachment"])) $options["Attachment"] = true;
-        $type = strtolower($options["type"]);
-
-        switch ($type) {
-            case "jpg":
-            case "jpeg":
-                $contentType = "image/jpeg";
-                $extension = ".jpg";
-                break;
-            case "png":
-            default:
-                $contentType = "image/png";
-                $extension = ".png";
-                break;
-        }
-
-        header("Cache-Control: private");
-        header("Content-Type: $contentType");
-
-        $filename = str_replace(["\n", "'"], "", basename($filename, ".$type")) . $extension;
-        $attachment = $options["Attachment"] ? "attachment" : "inline";
-        header(Helpers::buildContentDispositionHeader($attachment, $filename));
-
-        $this->_output($options);
-        flush();
-    }
-
-    /**
-     * Returns the image as a string.
-     *
-     * @param array $options Associative array: 'type' => jpeg|jpg|png; 'quality' => 0 - 100 (JPEG only);
-     *     'page' => Number of the page to output (defaults to the first).
-     * @return string
-     */
-    public function output($options = [])
-    {
-        ob_start();
-
-        $this->_output($options);
-
-        return ob_get_clean();
-    }
-
-    /**
-     * Outputs the image stream directly.
-     *
-     * @param array $options Associative array: 'type' => jpeg|jpg|png; 'quality' => 0 - 100 (JPEG only);
-     *     'page' => Number of the page to output (defaults to the first).
-     */
-    protected function _output($options = [])
-    {
-        if (!isset($options["type"])) $options["type"] = "png";
-        if (!isset($options["page"])) $options["page"] = 1;
-        $type = strtolower($options["type"]);
-
-        if (isset($this->_imgs[$options["page"] - 1])) {
-            $img = $this->_imgs[$options["page"] - 1];
-        } else {
-            $img = $this->_imgs[0];
-        }
-
-        // Perform any antialiasing
-        if ($this->_aa_factor != 1) {
-            $dst_w = $this->_actual_width / $this->_aa_factor;
-            $dst_h = $this->_actual_height / $this->_aa_factor;
-            $dst = imagecreatetruecolor($dst_w, $dst_h);
-            imagecopyresampled($dst, $img, 0, 0, 0, 0,
-                $dst_w, $dst_h,
-                $this->_actual_width, $this->_actual_height);
-        } else {
-            $dst = $img;
-        }
-
-        switch ($type) {
-            case "jpg":
-            case "jpeg":
-                if (!isset($options["quality"])) {
-                    $options["quality"] = 75;
-                }
-
-                imagejpeg($dst, null, $options["quality"]);
-                break;
-            case "png":
-            default:
-                imagepng($dst);
-                break;
-        }
-
-        if ($this->_aa_factor != 1) {
-            imagedestroy($dst);
-        }
-    }
-}
diff --git a/vendor/dompdf/dompdf/src/Adapter/PDFLib.php b/vendor/dompdf/dompdf/src/Adapter/PDFLib.php
deleted file mode 100644
index 8f13be7..0000000
--- a/vendor/dompdf/dompdf/src/Adapter/PDFLib.php
+++ /dev/null
@@ -1,1664 +0,0 @@
-
- * @author  Helmut Tischer 
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-namespace Dompdf\Adapter;
-
-use Dompdf\Canvas;
-use Dompdf\Dompdf;
-use Dompdf\Helpers;
-use Dompdf\Exception;
-use Dompdf\Image\Cache;
-use Dompdf\PhpEvaluator;
-
-/**
- * PDF rendering interface
- *
- * Dompdf\Adapter\PDFLib provides a simple, stateless interface to the one
- * provided by PDFLib.
- *
- * Unless otherwise mentioned, all dimensions are in points (1/72 in).
- * The coordinate origin is in the top left corner and y values
- * increase downwards.
- *
- * See {@link http://www.pdflib.com/} for more complete documentation
- * on the underlying PDFlib functions.
- *
- * @package dompdf
- */
-class PDFLib implements Canvas
-{
-
-    /**
-     * Dimensions of paper sizes in points
-     *
-     * @var array;
-     */
-    public static $PAPER_SIZES = []; // Set to Dompdf\Adapter\CPDF::$PAPER_SIZES below.
-
-    /**
-     * Whether to create PDFs in memory or on disk
-     *
-     * @var bool
-     */
-    static $IN_MEMORY = true;
-
-    /**
-     * Saves the major version of PDFLib for compatibility requests
-     *
-     * @var null|int
-     */
-    protected static $MAJOR_VERSION = null;
-
-
-    /**
-     * Transforms the list of native fonts into PDFLib compatible names (casesensitive)
-     *
-     * @var array
-     */
-    public static $nativeFontsTpPDFLib = [
-        "courier"               => "Courier",
-        "courier-bold"          => "Courier-Bold",
-        "courier-oblique"       => "Courier-Oblique",
-        "courier-boldoblique"   => "Courier-BoldOblique",
-        "helvetica"             => "Helvetica",
-        "helvetica-bold"        => "Helvetica-Bold",
-        "helvetica-oblique"     => "Helvetica-Oblique",
-        "helvetica-boldoblique" => "Helvetica-BoldOblique",
-        "times"                 => "Times-Roman",
-        "times-roman"           => "Times-Roman",
-        "times-bold"            => "Times-Bold",
-        "times-italic"          => "Times-Italic",
-        "times-bolditalic"      => "Times-BoldItalic",
-        "symbol"                => "Symbol",
-        "zapfdinbats"           => "ZapfDingbats",
-        "zapfdingbats"          => "ZapfDingbats",
-    ];
-
-    /**
-     * @var \Dompdf\Dompdf
-     */
-    protected $_dompdf;
-
-    /**
-     * Instance of PDFLib class
-     *
-     * @var \PDFLib
-     */
-    protected $_pdf;
-
-    /**
-     * Name of temporary file used for PDFs created on disk
-     *
-     * @var string
-     */
-    protected $_file;
-
-    /**
-     * PDF width, in points
-     *
-     * @var float
-     */
-    protected $_width;
-
-    /**
-     * PDF height, in points
-     *
-     * @var float
-     */
-    protected $_height;
-
-    /**
-     * Last fill color used
-     *
-     * @var array
-     */
-    protected $_last_fill_color;
-
-    /**
-     * Last stroke color used
-     *
-     * @var array
-     */
-    protected $_last_stroke_color;
-
-    /**
-     * The current opacity level
-     *
-     * @var array
-     */
-    protected $_current_opacity;
-
-    /**
-     * Cache of image handles
-     *
-     * @var array
-     */
-    protected $_imgs;
-
-    /**
-     * Cache of font handles
-     *
-     * @var array
-     */
-    protected $_fonts;
-
-    /**
-     * Cache of fontFile checks
-     *
-     * @var array
-     */
-    protected $_fontsFiles;
-
-    /**
-     * List of objects (templates) to add to multiple pages
-     *
-     * @var array
-     */
-    protected $_objs;
-
-    /**
-     * List of gstate objects created for this PDF (for reuse)
-     *
-     * @var array
-     */
-    protected $_gstates = [];
-
-    /**
-     * Current page number
-     *
-     * @var int
-     */
-    protected $_page_number;
-
-    /**
-     * Total number of pages
-     *
-     * @var int
-     */
-    protected $_page_count;
-
-    /**
-     * Text to display on every page
-     *
-     * @var array
-     */
-    protected $_page_text;
-
-    /**
-     * Array of pages for accesing after rendering is initially complete
-     *
-     * @var array
-     */
-    protected $_pages;
-
-    /**
-     * Class constructor
-     *
-     * @param string|array $paper The size of paper to use either a string (see {@link Dompdf\Adapter\CPDF::$PAPER_SIZES}) or
-     *                            an array(xmin,ymin,xmax,ymax)
-     * @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
-     * @param Dompdf $dompdf
-     */
-    public function __construct($paper = "letter", $orientation = "portrait", Dompdf $dompdf)
-    {
-        if (is_array($paper)) {
-            $size = $paper;
-        } elseif (isset(self::$PAPER_SIZES[mb_strtolower($paper)])) {
-            $size = self::$PAPER_SIZES[mb_strtolower($paper)];
-        } else {
-            $size = self::$PAPER_SIZES["letter"];
-        }
-
-        if (mb_strtolower($orientation) === "landscape") {
-            list($size[2], $size[3]) = [$size[3], $size[2]];
-        }
-
-        $this->_width = $size[2] - $size[0];
-        $this->_height = $size[3] - $size[1];
-
-        $this->_dompdf = $dompdf;
-
-        $this->_pdf = new \PDFLib();
-
-        $license = $dompdf->getOptions()->getPdflibLicense();
-        if (strlen($license) > 0) {
-            $this->setPDFLibParameter("license", $license);
-        }
-
-        $this->setPDFLibParameter("textformat", "utf8");
-        if ($this->getPDFLibMajorVersion() >= 7) {
-            $this->setPDFLibParameter("errorpolicy", "return");
-            //            $this->_pdf->set_option('logging={filename=' . \APP_PATH . '/logs/pdflib.log classes={api=1 warning=2}}');
-            //            $this->_pdf->set_option('errorpolicy=exception');
-        } else {
-            $this->setPDFLibParameter("fontwarning", "false");
-        }
-
-        $searchPath = $this->_dompdf->getOptions()->getFontDir();
-        if (empty($searchPath) === false) {
-            $this->_pdf->set_option('searchpath={' . $searchPath . '}');
-        }
-
-        // fetch PDFLib version information for the producer field
-        $this->_pdf->set_info("Producer Addendum", sprintf("%s + PDFLib %s", $dompdf->version, $this->getPDFLibMajorVersion()));
-
-        // Silence pedantic warnings about missing TZ settings
-        $tz = @date_default_timezone_get();
-        date_default_timezone_set("UTC");
-        $this->_pdf->set_info("Date", date("Y-m-d"));
-        date_default_timezone_set($tz);
-
-        if (self::$IN_MEMORY) {
-            $this->_pdf->begin_document("", "");
-        } else {
-            $tmp_dir = $this->_dompdf->getOptions()->getTempDir();
-            $tmp_name = @tempnam($tmp_dir, "libdompdf_pdf_");
-            @unlink($tmp_name);
-            $this->_file = "$tmp_name.pdf";
-            $this->_pdf->begin_document($this->_file, "");
-        }
-
-        $this->_pdf->begin_page_ext($this->_width, $this->_height, "");
-
-        $this->_page_number = $this->_page_count = 1;
-        $this->_page_text = [];
-
-        $this->_imgs = [];
-        $this->_fonts = [];
-        $this->_objs = [];
-    }
-
-    /**
-     * @return Dompdf
-     */
-    function get_dompdf()
-    {
-        return $this->_dompdf;
-    }
-
-    /**
-     * Close the pdf
-     */
-    protected function _close()
-    {
-        $this->_place_objects();
-
-        // Close all pages
-        $this->_pdf->suspend_page("");
-        for ($p = 1; $p <= $this->_page_count; $p++) {
-            $this->_pdf->resume_page("pagenumber=$p");
-            $this->_pdf->end_page_ext("");
-        }
-
-        $this->_pdf->end_document("");
-    }
-
-
-    /**
-     * Returns the PDFLib instance
-     *
-     * @return PDFLib
-     */
-    public function get_pdflib()
-    {
-        return $this->_pdf;
-    }
-
-    /**
-     * Add meta information to the PDF
-     *
-     * @param string $label label of the value (Creator, Producter, etc.)
-     * @param string $value the text to set
-     */
-    public function add_info($label, $value)
-    {
-        $this->_pdf->set_info($label, $value);
-    }
-
-    /**
-     * Opens a new 'object' (template in PDFLib-speak)
-     *
-     * While an object is open, all drawing actions are recorded to the
-     * object instead of being drawn on the current page.  Objects can
-     * be added later to a specific page or to several pages.
-     *
-     * The return value is an integer ID for the new object.
-     *
-     * @see PDFLib::close_object()
-     * @see PDFLib::add_object()
-     *
-     * @return int
-     */
-    public function open_object()
-    {
-        $this->_pdf->suspend_page("");
-        if ($this->getPDFLibMajorVersion() >= 7) {
-            $ret = $this->_pdf->begin_template_ext($this->_width, $this->_height, null);
-        } else {
-            $ret = $this->_pdf->begin_template($this->_width, $this->_height);
-        }
-        $this->_pdf->save();
-        $this->_objs[$ret] = ["start_page" => $this->_page_number];
-
-        return $ret;
-    }
-
-    /**
-     * Reopen an existing object (NOT IMPLEMENTED)
-     * PDFLib does not seem to support reopening templates.
-     *
-     * @param int $object the ID of a previously opened object
-     *
-     * @throws Exception
-     * @return void
-     */
-    public function reopen_object($object)
-    {
-        throw new Exception("PDFLib does not support reopening objects.");
-    }
-
-    /**
-     * Close the current template
-     *
-     * @see PDFLib::open_object()
-     */
-    public function close_object()
-    {
-        $this->_pdf->restore();
-        if ($this->getPDFLibMajorVersion() >= 7) {
-            $this->_pdf->end_template_ext($this->_width, $this->_height);
-        } else {
-            $this->_pdf->end_template();
-        }
-        $this->_pdf->resume_page("pagenumber=" . $this->_page_number);
-    }
-
-    /**
-     * Adds the specified object to the document
-     *
-     * $where can be one of:
-     * - 'add' add to current page only
-     * - 'all' add to every page from the current one onwards
-     * - 'odd' add to all odd numbered pages from now on
-     * - 'even' add to all even numbered pages from now on
-     * - 'next' add the object to the next page only
-     * - 'nextodd' add to all odd numbered pages from the next one
-     * - 'nexteven' add to all even numbered pages from the next one
-     *
-     * @param int    $object the object handle returned by open_object()
-     * @param string $where
-     */
-    public function add_object($object, $where = 'all')
-    {
-
-        if (mb_strpos($where, "next") !== false) {
-            $this->_objs[$object]["start_page"]++;
-            $where = str_replace("next", "", $where);
-            if ($where == "") {
-                $where = "add";
-            }
-        }
-
-        $this->_objs[$object]["where"] = $where;
-    }
-
-    /**
-     * Stops the specified template from appearing in the document.
-     *
-     * The object will stop being displayed on the page following the
-     * current one.
-     *
-     * @param int $object
-     */
-    public function stop_object($object)
-    {
-
-        if (!isset($this->_objs[$object])) {
-            return;
-        }
-
-        $start = $this->_objs[$object]["start_page"];
-        $where = $this->_objs[$object]["where"];
-
-        // Place the object on this page if required
-        if ($this->_page_number >= $start &&
-            (($this->_page_number % 2 == 0 && $where === "even") ||
-                ($this->_page_number % 2 == 1 && $where === "odd") ||
-                ($where === "all"))
-        ) {
-            $this->_pdf->fit_image($object, 0, 0, "");
-        }
-
-        $this->_objs[$object] = null;
-        unset($this->_objs[$object]);
-    }
-
-    /**
-     * Add all active objects to the current page
-     */
-    protected function _place_objects()
-    {
-
-        foreach ($this->_objs as $obj => $props) {
-            $start = $props["start_page"];
-            $where = $props["where"];
-
-            // Place the object on this page if required
-            if ($this->_page_number >= $start &&
-                (($this->_page_number % 2 == 0 && $where === "even") ||
-                    ($this->_page_number % 2 == 1 && $where === "odd") ||
-                    ($where === "all"))
-            ) {
-                $this->_pdf->fit_image($obj, 0, 0, "");
-            }
-        }
-    }
-
-    /**
-     * @return float|mixed
-     */
-    public function get_width()
-    {
-        return $this->_width;
-    }
-
-    /**
-     * @return float|mixed
-     */
-    public function get_height()
-    {
-        return $this->_height;
-    }
-
-    /**
-     * @return int
-     */
-    public function get_page_number()
-    {
-        return $this->_page_number;
-    }
-
-    /**
-     * @return int
-     */
-    public function get_page_count()
-    {
-        return $this->_page_count;
-    }
-
-    /**
-     * @param $num
-     */
-    public function set_page_number($num)
-    {
-        $this->_page_number = (int)$num;
-    }
-
-    /**
-     * @param int $count
-     */
-    public function set_page_count($count)
-    {
-        $this->_page_count = (int)$count;
-    }
-
-    /**
-     * Sets the line style
-     *
-     * @param float  $width
-     * @param        $cap
-     * @param string $join
-     * @param array  $dash
-     *
-     * @return void
-     */
-    protected function _set_line_style($width, $cap, $join, $dash)
-    {
-        if (!is_array($dash)) {
-            $dash = array();
-        }
-
-        if (count($dash) == 1) {
-            $dash[] = $dash[0];
-        }
-
-        if ($this->getPDFLibMajorVersion() >= 9) {
-            if (count($dash) > 1) {
-                $this->_pdf->set_graphics_option("dasharray={" . implode(" ", $dash) . "}");
-            } else {
-                $this->_pdf->set_graphics_option("dasharray=none");
-            }
-        } else {
-            if (count($dash) > 1) {
-                $this->_pdf->setdashpattern("dasharray={" . implode(" ", $dash) . "}");
-            } else {
-                $this->_pdf->setdash(0, 0);
-            }
-        }
-
-        switch ($join) {
-            case "miter":
-                if ($this->getPDFLibMajorVersion() >= 9) {
-                    $this->_pdf->set_graphics_option('linejoin=0');
-                } else {
-                    $this->_pdf->setlinejoin(0);
-                }
-                break;
-
-            case "round":
-                if ($this->getPDFLibMajorVersion() >= 9) {
-                    $this->_pdf->set_graphics_option('linejoin=1');
-                } else {
-                    $this->_pdf->setlinejoin(1);
-                }
-                break;
-
-            case "bevel":
-                if ($this->getPDFLibMajorVersion() >= 9) {
-                    $this->_pdf->set_graphics_option('linejoin=2');
-                } else {
-                    $this->_pdf->setlinejoin(2);
-                }
-                break;
-
-            default:
-                break;
-        }
-
-        switch ($cap) {
-            case "butt":
-                if ($this->getPDFLibMajorVersion() >= 9) {
-                    $this->_pdf->set_graphics_option('linecap=0');
-                } else {
-                    $this->_pdf->setlinecap(0);
-                }
-                break;
-
-            case "round":
-                if ($this->getPDFLibMajorVersion() >= 9) {
-                    $this->_pdf->set_graphics_option('linecap=1');
-                } else {
-                    $this->_pdf->setlinecap(1);
-                }
-                break;
-
-            case "square":
-                if ($this->getPDFLibMajorVersion() >= 9) {
-                    $this->_pdf->set_graphics_option('linecap=2');
-                } else {
-                    $this->_pdf->setlinecap(2);
-                }
-                break;
-
-            default:
-                break;
-        }
-
-        $this->_pdf->setlinewidth($width);
-    }
-
-    /**
-     * Sets the line color
-     *
-     * @param array $color array(r,g,b)
-     */
-    protected function _set_stroke_color($color)
-    {
-        // TODO: we should check the current PDF stroke color
-        // instead of the cached value
-        if ($this->_last_stroke_color == $color) {
-            // FIXME: do nothing, this optimization is broken by the
-            // stroke being set as a side effect of other operations
-            //return;
-        }
-
-        $alpha = isset($color["alpha"]) ? $color["alpha"] : 1;
-        if (isset($this->_current_opacity)) {
-            $alpha *= $this->_current_opacity;
-        }
-
-        $this->_last_stroke_color = $color;
-
-        if (isset($color[3])) {
-            $type = "cmyk";
-            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], $color[3]];
-        } elseif (isset($color[2])) {
-            $type = "rgb";
-            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], null];
-        } else {
-            $type = "gray";
-            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], null, null];
-        }
-
-        $this->_set_stroke_opacity($alpha, "Normal");
-        $this->_pdf->setcolor("stroke", $type, $c1, $c2, $c3, $c4);
-    }
-
-    /**
-     * Sets the fill color
-     *
-     * @param array $color array(r,g,b)
-     */
-    protected function _set_fill_color($color)
-    {
-        // TODO: we should check the current PDF fill color
-        // instead of the cached value
-        if ($this->_last_fill_color == $color) {
-            // FIXME: do nothing, this optimization is broken by the
-            // fill being set as a side effect of other operations
-            //return;
-        }
-
-        $alpha = isset($color["alpha"]) ? $color["alpha"] : 1;
-        if (isset($this->_current_opacity)) {
-            $alpha *= $this->_current_opacity;
-        }
-
-        $this->_last_fill_color = $color;
-
-        if (isset($color[3])) {
-            $type = "cmyk";
-            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], $color[3]];
-        } elseif (isset($color[2])) {
-            $type = "rgb";
-            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], null];
-        } else {
-            $type = "gray";
-            list($c1, $c2, $c3, $c4) = [$color[0], $color[1], null, null];
-        }
-
-        $this->_set_fill_opacity($alpha, "Normal");
-        $this->_pdf->setcolor("fill", $type, $c1, $c2, $c3, $c4);
-    }
-
-    /**
-     * Sets the fill opacity
-     *
-     * @param $opacity
-     * @param $mode
-     */
-    public function _set_fill_opacity($opacity, $mode = "Normal")
-    {
-        if ($mode === "Normal" && is_null($opacity) === false) {
-            $this->_set_gstate("opacityfill=$opacity");
-        }
-    }
-
-    /**
-     * Sets the stroke opacity
-     *
-     * @param $opacity
-     * @param $mode
-     */
-    public function _set_stroke_opacity($opacity, $mode = "Normal")
-    {
-        if ($mode === "Normal" && is_null($opacity) === false) {
-            $this->_set_gstate("opacitystroke=$opacity");
-        }
-    }
-
-    /**
-     * Sets the opacity
-     *
-     * @param $opacity
-     * @param $mode
-     */
-    public function set_opacity($opacity, $mode = "Normal")
-    {
-        if ($mode === "Normal" && is_null($opacity) === false) {
-            $this->_set_gstate("opacityfill=$opacity opacitystroke=$opacity");
-            $this->_current_opacity = $opacity;
-        }
-    }
-
-    /**
-     * Sets the gstate
-     *
-     * @param $gstate_options
-     * @return int
-     */
-    public function _set_gstate($gstate_options)
-    {
-        if (($gstate = array_search($gstate_options, $this->_gstates)) === false) {
-            $gstate = $this->_pdf->create_gstate($gstate_options);
-            $this->_gstates[$gstate] = $gstate_options;
-        }
-
-        return $this->_pdf->set_gstate($gstate);
-    }
-
-    public function set_default_view($view, $options = [])
-    {
-        // TODO
-        // http://www.pdflib.com/fileadmin/pdflib/pdf/manuals/PDFlib-8.0.2-API-reference.pdf
-        /**
-         * fitheight Fit the page height to the window, with the x coordinate left at the left edge of the window.
-         * fitrect Fit the rectangle specified by left, bottom, right, and top to the window.
-         * fitvisible Fit the visible contents of the page (the ArtBox) to the window.
-         * fitvisibleheight Fit the visible contents of the page to the window with the x coordinate left at the left edge of the window.
-         * fitvisiblewidth Fit the visible contents of the page to the window with the y coordinate top at the top edge of the window.
-         * fitwidth Fit the page width to the window, with the y coordinate top at the top edge of the window.
-         * fitwindow Fit the complete page to the window.
-         * fixed
-         */
-        //$this->setPDFLibParameter("openaction", $view);
-    }
-
-    /**
-     * Loads a specific font and stores the corresponding descriptor.
-     *
-     * @param string $font
-     * @param string $encoding
-     * @param string $options
-     *
-     * @return int the font descriptor for the font
-     */
-    protected function _load_font($font, $encoding = null, $options = "")
-    {
-        // Fix for PDFLibs case-sensitive font names
-        $baseFont = basename($font);
-        $isNativeFont = false;
-        if (isset(self::$nativeFontsTpPDFLib[$baseFont])) {
-            $font = self::$nativeFontsTpPDFLib[$baseFont];
-            $isNativeFont = true;
-        }
-
-        // Check if the font is a native PDF font
-        // Embed non-native fonts
-        $test = strtolower($baseFont);
-        if (in_array($test, DOMPDF::$nativeFonts)) {
-            $font = basename($font);
-        } else {
-            // Embed non-native fonts
-            $options .= " embedding=true";
-        }
-
-        $options .= " autosubsetting=" . ($this->_dompdf->getOptions()->getIsFontSubsettingEnabled() === false ? "false" : "true");
-
-        if (is_null($encoding)) {
-            // Unicode encoding is only available for the commerical
-            // version of PDFlib and not PDFlib-Lite
-            if (strlen($this->_dompdf->getOptions()->getPdflibLicense()) > 0) {
-                $encoding = "unicode";
-            } else {
-                $encoding = "auto";
-            }
-        }
-
-        $key = "$font:$encoding:$options";
-        if (isset($this->_fonts[$key])) {
-            return $this->_fonts[$key];
-        }
-
-        // Native fonts are build in, just load it
-        if ($isNativeFont) {
-            $this->_fonts[$key] = $this->_pdf->load_font($font, $encoding, $options);
-
-            return $this->_fonts[$key];
-        }
-
-        $fontOutline = $this->getPDFLibParameter("FontOutline", 1);
-        if ($fontOutline === "" || $fontOutline <= 0) {
-            $families = $this->_dompdf->getFontMetrics()->getFontFamilies();
-            foreach ($families as $files) {
-                foreach ($files as $file) {
-                    $face = basename($file);
-                    $afm = null;
-
-                    if (isset($this->_fontsFiles[$face])) {
-                        continue;
-                    }
-
-                    // Prefer ttfs to afms
-                    if (file_exists("$file.ttf")) {
-                        $outline = "$file.ttf";
-                    } elseif (file_exists("$file.TTF")) {
-                        $outline = "$file.TTF";
-                    } elseif (file_exists("$file.pfb")) {
-                        $outline = "$file.pfb";
-                        if (file_exists("$file.afm")) {
-                            $afm = "$file.afm";
-                        }
-                    } elseif (file_exists("$file.PFB")) {
-                        $outline = "$file.PFB";
-                        if (file_exists("$file.AFM")) {
-                            $afm = "$file.AFM";
-                        }
-                    } else {
-                        continue;
-                    }
-
-                    $this->_fontsFiles[$face] = true;
-
-                    if ($this->getPDFLibMajorVersion() >= 9) {
-                        $this->setPDFLibParameter("FontOutline", '{' . "$face=$outline" . '}');
-                    } else {
-                        $this->setPDFLibParameter("FontOutline", "\{$face\}=\{$outline\}");
-                    }
-
-                    if (is_null($afm)) {
-                        continue;
-                    }
-                    if ($this->getPDFLibMajorVersion() >= 9) {
-                        $this->setPDFLibParameter("FontAFM", '{' . "$face=$afm" . '}');
-                    } else {
-                        $this->setPDFLibParameter("FontAFM", "\{$face\}=\{$afm\}");
-                    }
-                }
-            }
-        }
-
-        $this->_fonts[$key] = $this->_pdf->load_font($font, $encoding, $options);
-
-        return $this->_fonts[$key];
-    }
-
-    /**
-     * Remaps y coords from 4th to 1st quadrant
-     *
-     * @param float $y
-     * @return float
-     */
-    protected function y($y)
-    {
-        return $this->_height - $y;
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $x2
-     * @param float $y2
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     */
-    public function line($x1, $y1, $x2, $y2, $color, $width, $style = null)
-    {
-        $this->_set_line_style($width, "butt", "", $style);
-        $this->_set_stroke_color($color);
-
-        $y1 = $this->y($y1);
-        $y2 = $this->y($y2);
-
-        $this->_pdf->moveto($x1, $y1);
-        $this->_pdf->lineto($x2, $y2);
-        $this->_pdf->stroke();
-
-        $this->_set_stroke_opacity($this->_current_opacity, "Normal");
-    }
-
-    /**
-     * Draw line at the specified coordinates on every page.
-     *
-     * See {@link Style::munge_color()} for the format of the colour array.
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $x2
-     * @param float $y2
-     * @param array $color
-     * @param float $width
-     * @param array $style optional
-     */
-    public function page_line($x1, $y1, $x2, $y2, $color, $width, $style = [])
-    {
-        $_t = 'line';
-        $this->_page_text[] = compact('_t', 'x1', 'y1', 'x2', 'y2', 'color', 'width', 'style');
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $r1
-     * @param float $r2
-     * @param float $astart
-     * @param float $aend
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     */
-    public function arc($x1, $y1, $r1, $r2, $astart, $aend, $color, $width, $style = [])
-    {
-        $this->_set_line_style($width, "butt", "", $style);
-        $this->_set_stroke_color($color);
-
-        $y1 = $this->y($y1);
-
-        $this->_pdf->arc($x1, $y1, $r1, $astart, $aend);
-        $this->_pdf->stroke();
-
-        $this->_set_stroke_opacity($this->_current_opacity, "Normal");
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param array $color
-     * @param float $width
-     * @param null  $style
-     */
-    public function rectangle($x1, $y1, $w, $h, $color, $width, $style = null)
-    {
-        $this->_set_stroke_color($color);
-        $this->_set_line_style($width, "butt", "", $style);
-
-        $y1 = $this->y($y1) - $h;
-
-        $this->_pdf->rect($x1, $y1, $w, $h);
-        $this->_pdf->stroke();
-
-        $this->_set_stroke_opacity($this->_current_opacity, "Normal");
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param array $color
-     */
-    public function filled_rectangle($x1, $y1, $w, $h, $color)
-    {
-        $this->_set_fill_color($color);
-
-        $y1 = $this->y($y1) - $h;
-
-        $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h));
-        $this->_pdf->fill();
-
-        $this->_set_fill_opacity($this->_current_opacity, "Normal");
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     */
-    public function clipping_rectangle($x1, $y1, $w, $h)
-    {
-        $this->_pdf->save();
-
-        $y1 = $this->y($y1) - $h;
-
-        $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h));
-        $this->_pdf->clip();
-    }
-
-    /**
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param float $rTL
-     * @param float $rTR
-     * @param float $rBR
-     * @param float $rBL
-     */
-    public function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL)
-    {
-        if ($this->getPDFLibMajorVersion() < 9) {
-            //TODO: add PDFLib7 support
-            $this->clipping_rectangle($x1, $y1, $w, $h);
-            return;
-        }
-
-        $this->_pdf->save();
-
-        // we use 0,0 for the base coordinates for the path points
-        // since we're drawing the path at the $x1,$y1 coordinates
-
-        $path = 0;
-        //start: left edge, top end
-        $path = $this->_pdf->add_path_point($path, 0, 0 - $rTL + $h, "move", "");
-        // line: left edge, bottom end
-        $path = $this->_pdf->add_path_point($path, 0, 0 + $rBL, "line", "");
-        // curve: bottom-left corner
-        $path = $this->_pdf->add_path_point($path, 0 + $rBL, 0, "elliptical", "radius=$rBL clockwise=false");
-        // line: bottom edge, left end
-        $path = $this->_pdf->add_path_point($path, 0 - $rBR + $w, 0, "line", "");
-        // curve: bottom-right corner
-        $path = $this->_pdf->add_path_point($path, 0 + $w, 0 + $rBR, "elliptical", "radius=$rBR clockwise=false");
-        // line: right edge, top end
-        $path = $this->_pdf->add_path_point($path, 0 + $w, 0 - $rTR + $h, "line", "");
-        // curve: top-right corner
-        $path = $this->_pdf->add_path_point($path, 0 - $rTR + $w, 0 +$h, "elliptical", "radius=$rTR clockwise=false");
-        // line: top edge, left end
-        $path = $this->_pdf->add_path_point($path, 0 + $rTL, 0 + $h, "line", "");
-        // curve: top-left corner
-        $path = $this->_pdf->add_path_point($path, 0, 0 - $rTL + $h, "elliptical", "radius=$rTL clockwise=false");
-        $this->_pdf->draw_path($path, $x1, $this->_height-$y1-$h, "clip=true");
-    }
-
-    /**
-     *
-     */
-    public function clipping_end()
-    {
-        $this->_pdf->restore();
-    }
-
-    /**
-     *
-     */
-    public function save()
-    {
-        $this->_pdf->save();
-    }
-
-    function restore()
-    {
-        $this->_pdf->restore();
-    }
-
-    /**
-     * @param $angle
-     * @param $x
-     * @param $y
-     */
-    public function rotate($angle, $x, $y)
-    {
-        $pdf = $this->_pdf;
-        $pdf->translate($x, $this->_height - $y);
-        $pdf->rotate(-$angle);
-        $pdf->translate(-$x, -$this->_height + $y);
-    }
-
-    /**
-     * @param $angle_x
-     * @param $angle_y
-     * @param $x
-     * @param $y
-     */
-    public function skew($angle_x, $angle_y, $x, $y)
-    {
-        $pdf = $this->_pdf;
-        $pdf->translate($x, $this->_height - $y);
-        $pdf->skew($angle_y, $angle_x); // Needs to be inverted
-        $pdf->translate(-$x, -$this->_height + $y);
-    }
-
-    /**
-     * @param $s_x
-     * @param $s_y
-     * @param $x
-     * @param $y
-     */
-    public function scale($s_x, $s_y, $x, $y)
-    {
-        $pdf = $this->_pdf;
-        $pdf->translate($x, $this->_height - $y);
-        $pdf->scale($s_x, $s_y);
-        $pdf->translate(-$x, -$this->_height + $y);
-    }
-
-    /**
-     * @param $t_x
-     * @param $t_y
-     */
-    public function translate($t_x, $t_y)
-    {
-        $this->_pdf->translate($t_x, -$t_y);
-    }
-
-    /**
-     * @param $a
-     * @param $b
-     * @param $c
-     * @param $d
-     * @param $e
-     * @param $f
-     */
-    public function transform($a, $b, $c, $d, $e, $f)
-    {
-        $this->_pdf->concat($a, $b, $c, $d, $e, $f);
-    }
-
-    /**
-     * @param array $points
-     * @param array $color
-     * @param null  $width
-     * @param null  $style
-     * @param bool  $fill
-     */
-    public function polygon($points, $color, $width = null, $style = null, $fill = false)
-    {
-        $this->_set_fill_color($color);
-        $this->_set_stroke_color($color);
-
-        if (!$fill && isset($width)) {
-            $this->_set_line_style($width, "square", "miter", $style);
-        }
-
-        $y = $this->y(array_pop($points));
-        $x = array_pop($points);
-        $this->_pdf->moveto($x, $y);
-
-        while (count($points) > 1) {
-            $y = $this->y(array_pop($points));
-            $x = array_pop($points);
-            $this->_pdf->lineto($x, $y);
-        }
-
-        if ($fill) {
-            $this->_pdf->fill();
-        } else {
-            $this->_pdf->closepath_stroke();
-        }
-
-        $this->_set_fill_opacity($this->_current_opacity, "Normal");
-        $this->_set_stroke_opacity($this->_current_opacity, "Normal");
-    }
-
-    /**
-     * @param float $x
-     * @param float $y
-     * @param float $r
-     * @param array $color
-     * @param null  $width
-     * @param null  $style
-     * @param bool  $fill
-     */
-    public function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false)
-    {
-        $this->_set_fill_color($color);
-        $this->_set_stroke_color($color);
-
-        if (!$fill && isset($width)) {
-            $this->_set_line_style($width, "round", "round", $style);
-        }
-
-        $y = $this->y($y);
-
-        $this->_pdf->circle($x, $y, $r);
-
-        if ($fill) {
-            $this->_pdf->fill();
-        } else {
-            $this->_pdf->stroke();
-        }
-
-        $this->_set_fill_opacity($this->_current_opacity, "Normal");
-        $this->_set_stroke_opacity($this->_current_opacity, "Normal");
-    }
-
-    /**
-     * @param string $img_url
-     * @param float  $x
-     * @param float  $y
-     * @param int    $w
-     * @param int    $h
-     * @param string $resolution
-     */
-    public function image($img_url, $x, $y, $w, $h, $resolution = "normal")
-    {
-        $w = (int)$w;
-        $h = (int)$h;
-
-        $img_type = Cache::detect_type($img_url, $this->get_dompdf()->getHttpContext());
-
-        if (!isset($this->_imgs[$img_url])) {
-            if (strtolower($img_type) === "svg") {
-                //FIXME: PDFLib loads SVG but returns error message "Function must not be called in 'page' scope"
-                $image_load_response = $this->_pdf->load_graphics($img_type, $img_url, "");
-            } else {
-                $image_load_response = $this->_pdf->load_image($img_type, $img_url, "");
-            }
-            if ($image_load_response === 0) {
-                //TODO: should do something with the error message
-                $error = $this->_pdf->get_errmsg();
-                return;
-            }
-            $this->_imgs[$img_url] = $image_load_response;
-        }
-
-        $img = $this->_imgs[$img_url];
-
-        $y = $this->y($y) - $h;
-        if (strtolower($img_type) === "svg") {
-            $this->_pdf->fit_graphics($img, $x, $y, 'boxsize={' . "$w $h" . '} fitmethod=entire');
-        } else {
-            $this->_pdf->fit_image($img, $x, $y, 'boxsize={' . "$w $h" . '} fitmethod=entire');
-        }
-    }
-
-    /**
-     * @param float  $x
-     * @param float  $y
-     * @param string $text
-     * @param string $font
-     * @param float  $size
-     * @param array  $color
-     * @param int    $word_spacing
-     * @param int    $char_spacing
-     * @param int    $angle
-     */
-    public function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_spacing = 0, $char_spacing = 0, $angle = 0)
-    {
-        $fh = $this->_load_font($font);
-
-        $this->_pdf->setfont($fh, $size);
-        $this->_set_fill_color($color);
-
-        $y = $this->y($y) - $this->get_font_height($font, $size);
-
-        $word_spacing = (float)$word_spacing;
-        $char_spacing = (float)$char_spacing;
-        $angle = -(float)$angle;
-
-        $this->_pdf->fit_textline($text, $x, $y, "rotate=$angle wordspacing=$word_spacing charspacing=$char_spacing ");
-
-        $this->_set_fill_opacity($this->_current_opacity, "Normal");
-    }
-
-    /**
-     * @param string $code
-     */
-    public function javascript($code)
-    {
-        if (strlen($this->_dompdf->getOptions()->getPdflibLicense()) > 0) {
-            $this->_pdf->create_action("JavaScript", $code);
-        }
-    }
-
-    /**
-     * Add a named destination (similar to ... in html)
-     *
-     * @param string $anchorname The name of the named destination
-     */
-    public function add_named_dest($anchorname)
-    {
-        $this->_pdf->add_nameddest($anchorname, "");
-    }
-
-    /**
-     * Add a link to the pdf
-     *
-     * @param string $url    The url to link to
-     * @param float  $x      The x position of the link
-     * @param float  $y      The y position of the link
-     * @param float  $width  The width of the link
-     * @param float  $height The height of the link
-     */
-    public function add_link($url, $x, $y, $width, $height)
-    {
-        $y = $this->y($y) - $height;
-        if (strpos($url, '#') === 0) {
-            // Local link
-            $name = substr($url, 1);
-            if ($name) {
-                $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link',
-                    "contents={$url} destname=" . substr($url, 1) . " linewidth=0");
-            }
-        } else {
-            list($proto, $host, $path, $file) = Helpers::explode_url($url);
-
-            if ($proto == "" || $proto === "file://") {
-                return; // Local links are not allowed
-            }
-            $url = Helpers::build_url($proto, $host, $path, $file);
-            $url = '{' . rawurldecode($url) . '}';
-
-            $action = $this->_pdf->create_action("URI", "url=" . $url);
-            $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', "contents={$url} action={activate=$action} linewidth=0");
-        }
-    }
-
-    /**
-     * @param string $text
-     * @param string $font
-     * @param float  $size
-     * @param int    $word_spacing
-     * @param int    $letter_spacing
-     * @return mixed
-     */
-    public function get_text_width($text, $font, $size, $word_spacing = 0, $letter_spacing = 0)
-    {
-        $fh = $this->_load_font($font);
-
-        // Determine the additional width due to extra spacing
-        $num_spaces = mb_substr_count($text, " ");
-        $delta = $word_spacing * $num_spaces;
-
-        if ($letter_spacing) {
-            $num_chars = mb_strlen($text);
-            $delta += ($num_chars - $num_spaces) * $letter_spacing;
-        }
-
-        return $this->_pdf->stringwidth($text, $fh, $size) + $delta;
-    }
-
-    /**
-     * @param string $font
-     * @param float  $size
-     * @return float
-     */
-    public function get_font_height($font, $size)
-    {
-        $fh = $this->_load_font($font);
-
-        $this->_pdf->setfont($fh, $size);
-
-        $asc = $this->_pdf->info_font($fh, "ascender", "fontsize=$size");
-        $desc = $this->_pdf->info_font($fh, "descender", "fontsize=$size");
-
-        // $desc is usually < 0,
-        $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();
-
-        return (abs($asc) + abs($desc)) * $ratio;
-    }
-
-    /**
-     * @param string $font
-     * @param float  $size
-     * @return float
-     */
-    public function get_font_baseline($font, $size)
-    {
-        $ratio = $this->_dompdf->getOptions()->getFontHeightRatio();
-
-        return $this->get_font_height($font, $size) / $ratio * 1.1;
-    }
-
-    /**
-     * Writes text at the specified x and y coordinates on every page
-     *
-     * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced
-     * with their current values.
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     *
-     * @param float  $x
-     * @param float  $y
-     * @param string $text       the text to write
-     * @param string $font       the font file to use
-     * @param float  $size       the font size, in points
-     * @param array  $color
-     * @param float  $word_space word spacing adjustment
-     * @param float  $char_space char spacing adjustment
-     * @param float  $angle      angle to write the text at, measured CW starting from the x-axis
-     */
-    public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0)
-    {
-        $_t = "text";
-        $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "word_space", "char_space", "angle");
-    }
-
-    //........................................................................
-
-    /**
-     * Processes a script on every page
-     *
-     * The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available.
-     *
-     * This function can be used to add page numbers to all pages
-     * after the first one, for example.
-     *
-     * @param string $code the script code
-     * @param string $type the language type for script
-     */
-    public function page_script($code, $type = "text/php")
-    {
-        $_t = "script";
-        $this->_page_text[] = compact("_t", "code", "type");
-    }
-
-    /**
-     *
-     */
-    public function new_page()
-    {
-        // Add objects to the current page
-        $this->_place_objects();
-
-        $this->_pdf->suspend_page("");
-        $this->_pdf->begin_page_ext($this->_width, $this->_height, "");
-        $this->_page_number = ++$this->_page_count;
-    }
-
-    /**
-     * Add text to each page after rendering is complete
-     */
-    protected function _add_page_text()
-    {
-        if (count($this->_page_text) === 0) {
-            return;
-        }
-
-        $eval = null;
-        $this->_pdf->suspend_page("");
-
-        for ($p = 1; $p <= $this->_page_count; $p++) {
-            $this->_pdf->resume_page("pagenumber=$p");
-
-            foreach ($this->_page_text as $pt) {
-                extract($pt);
-
-                switch ($_t) {
-                    case "text":
-                        $text = str_replace(["{PAGE_NUM}", "{PAGE_COUNT}"],
-                            [$p, $this->_page_count], $text);
-                        $this->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);
-                        break;
-
-                    case "script":
-                        if (!$eval) {
-                            $eval = new PHPEvaluator($this);
-                        }
-                        $eval->evaluate($code, ['PAGE_NUM' => $p, 'PAGE_COUNT' => $this->_page_count]);
-                        break;
-
-                    case 'line':
-                        $this->line( $x1, $y1, $x2, $y2, $color, $width, $style );
-                        break;
-
-                }
-            }
-
-            $this->_pdf->suspend_page("");
-        }
-
-        $this->_pdf->resume_page("pagenumber=" . $this->_page_number);
-    }
-
-    /**
-     * Streams the PDF to the client.
-     *
-     * @param string $filename The filename to present to the client.
-     * @param array  $options  Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1).
-     * @throws Exception
-     */
-    public function stream($filename = "document.pdf", $options = [])
-    {
-        if (headers_sent()) {
-            die("Unable to stream pdf: headers already sent");
-        }
-
-        if (!isset($options["compress"])) {
-            $options["compress"] = true;
-        }
-        if (!isset($options["Attachment"])) {
-            $options["Attachment"] = true;
-        }
-
-        $this->_add_page_text();
-
-        if ($options["compress"]) {
-            $this->setPDFLibValue("compress", 6);
-        } else {
-            $this->setPDFLibValue("compress", 0);
-        }
-
-        $this->_close();
-
-        $data = "";
-
-        if (self::$IN_MEMORY) {
-            $data = $this->_pdf->get_buffer();
-            $size = mb_strlen($data, "8bit");
-        } else {
-            $size = filesize($this->_file);
-        }
-
-        header("Cache-Control: private");
-        header("Content-Type: application/pdf");
-        header("Content-Length: " . $size);
-
-        $filename = str_replace(["\n", "'"], "", basename($filename, ".pdf")) . ".pdf";
-        $attachment = $options["Attachment"] ? "attachment" : "inline";
-        header(Helpers::buildContentDispositionHeader($attachment, $filename));
-
-        if (self::$IN_MEMORY) {
-            echo $data;
-        } else {
-            // Chunked readfile()
-            $chunk = (1 << 21); // 2 MB
-            $fh = fopen($this->_file, "rb");
-            if (!$fh) {
-                throw new Exception("Unable to load temporary PDF file: " . $this->_file);
-            }
-
-            while (!feof($fh)) {
-                echo fread($fh, $chunk);
-            }
-            fclose($fh);
-
-            //debugpng
-            if ($this->_dompdf->getOptions()->getDebugPng()) {
-                print '[pdflib stream unlink ' . $this->_file . ']';
-            }
-            if (!$this->_dompdf->getOptions()->getDebugKeepTemp()) {
-                unlink($this->_file);
-            }
-            $this->_file = null;
-            unset($this->_file);
-        }
-
-        flush();
-    }
-
-    /**
-     * Returns the PDF as a string.
-     *
-     * @param array $options Associative array: 'compress' => 1 or 0 (default 1).
-     * @return string
-     */
-    public function output($options = [])
-    {
-        if (!isset($options["compress"])) {
-            $options["compress"] = true;
-        }
-
-        $this->_add_page_text();
-
-        if ($options["compress"]) {
-            $this->setPDFLibValue("compress", 6);
-        } else {
-            $this->setPDFLibValue("compress", 0);
-        }
-
-        $this->_close();
-
-        if (self::$IN_MEMORY) {
-            $data = $this->_pdf->get_buffer();
-        } else {
-            $data = file_get_contents($this->_file);
-
-            //debugpng
-            if ($this->_dompdf->getOptions()->getDebugPng()) {
-                print '[pdflib output unlink ' . $this->_file . ']';
-            }
-            if (!$this->_dompdf->getOptions()->getDebugKeepTemp()) {
-                unlink($this->_file);
-            }
-            $this->_file = null;
-            unset($this->_file);
-        }
-
-        return $data;
-    }
-
-    /**
-     * @param string $keyword
-     * @param string $optlist
-     * @return mixed
-     */
-    protected function getPDFLibParameter($keyword, $optlist = "")
-    {
-        if ($this->getPDFLibMajorVersion() >= 9) {
-            return $this->_pdf->get_option($keyword, "");
-        }
-
-        return $this->_pdf->get_parameter($keyword, $optlist);
-    }
-
-    /**
-     * @param string $keyword
-     * @param string $value
-     * @return mixed
-     */
-    protected function setPDFLibParameter($keyword, $value)
-    {
-        if ($this->getPDFLibMajorVersion() >= 9) {
-            return $this->_pdf->set_option($keyword . "=" . $value);
-        }
-
-        return $this->_pdf->set_parameter($keyword, $value);
-    }
-
-    /**
-     * @param string $keyword
-     * @param string $optlist
-     * @return mixed
-     */
-    protected function getPDFLibValue($keyword, $optlist = "")
-    {
-        if ($this->getPDFLibMajorVersion() >= 9) {
-            return $this->getPDFLibParameter($keyword, $optlist);
-        }
-
-        return $this->_pdf->get_value($keyword);
-    }
-
-    /**
-     * @param string $keyword
-     * @param string $value
-     * @return mixed
-     */
-    protected function setPDFLibValue($keyword, $value)
-    {
-        if ($this->getPDFLibMajorVersion() >= 9) {
-            return $this->setPDFLibParameter($keyword, $value);
-        }
-
-        return $this->_pdf->set_value($keyword, $value);
-    }
-
-    /**
-     * @return int
-     */
-    protected function getPDFLibMajorVersion()
-    {
-        if (is_null(self::$MAJOR_VERSION)) {
-            if (method_exists($this->_pdf, "get_option")) {
-                self::$MAJOR_VERSION = abs(intval($this->_pdf->get_option("major", "")));
-            } else {
-                self::$MAJOR_VERSION = abs(intval($this->_pdf->get_value("major", "")));
-            }
-        }
-
-        return self::$MAJOR_VERSION;
-    }
-}
-
-// Workaround for idiotic limitation on statics...
-PDFLib::$PAPER_SIZES = CPDF::$PAPER_SIZES;
diff --git a/vendor/dompdf/dompdf/src/Autoloader.php b/vendor/dompdf/dompdf/src/Autoloader.php
deleted file mode 100644
index c6ade50..0000000
--- a/vendor/dompdf/dompdf/src/Autoloader.php
+++ /dev/null
@@ -1,42 +0,0 @@
-
- * @author  Fabien MƩnager 
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-
-namespace Dompdf;
-
-/**
- * Main rendering interface
- *
- * Currently {@link Dompdf\Adapter\CPDF}, {@link Dompdf\Adapter\PDFLib}, and {@link Dompdf\Adapter\GD}
- * implement this interface.
- *
- * Implementations should measure x and y increasing to the left and down,
- * respectively, with the origin in the top left corner.  Implementations
- * are free to use a unit other than points for length, but I can't
- * guarantee that the results will look any good.
- *
- * @package dompdf
- */
-interface Canvas
-{
-    function __construct($paper = "letter", $orientation = "portrait", Dompdf $dompdf);
-
-    /**
-     * @return Dompdf
-     */
-    function get_dompdf();
-
-    /**
-     * Returns the current page number
-     *
-     * @return int
-     */
-    function get_page_number();
-
-    /**
-     * Returns the total number of pages
-     *
-     * @return int
-     */
-    function get_page_count();
-
-    /**
-     * Sets the total number of pages
-     *
-     * @param int $count
-     */
-    function set_page_count($count);
-
-    /**
-     * Draws a line from x1,y1 to x2,y2
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     * See {@link Cpdf::setLineStyle()} for a description of the format of the
-     * $style parameter (aka dash).
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $x2
-     * @param float $y2
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     */
-    function line($x1, $y1, $x2, $y2, $color, $width, $style = null);
-
-    /**
-     * Draws a rectangle at x1,y1 with width w and height h
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     * See {@link Cpdf::setLineStyle()} for a description of the $style
-     * parameter (aka dash)
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     */
-    function rectangle($x1, $y1, $w, $h, $color, $width, $style = null);
-
-    /**
-     * Draws a filled rectangle at x1,y1 with width w and height h
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param array $color
-     */
-    function filled_rectangle($x1, $y1, $w, $h, $color);
-
-    /**
-     * Starts a clipping rectangle at x1,y1 with width w and height h
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     */
-    function clipping_rectangle($x1, $y1, $w, $h);
-
-    /**
-     * Starts a rounded clipping rectangle at x1,y1 with width w and height h
-     *
-     * @param float $x1
-     * @param float $y1
-     * @param float $w
-     * @param float $h
-     * @param float $tl
-     * @param float $tr
-     * @param float $br
-     * @param float $bl
-     *
-     * @return
-     */
-    function clipping_roundrectangle($x1, $y1, $w, $h, $tl, $tr, $br, $bl);
-
-    /**
-     * Ends the last clipping shape
-     */
-    function clipping_end();
-
-    /**
-     * Writes text at the specified x and y coordinates on every page
-     *
-     * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced
-     * with their current values.
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     *
-     * @param float  $x
-     * @param float  $y
-     * @param string $text       the text to write
-     * @param string $font       the font file to use
-     * @param float  $size       the font size, in points
-     * @param array  $color
-     * @param float  $word_space word spacing adjustment
-     * @param float  $char_space char spacing adjustment
-     * @param float  $angle      angle to write the text at, measured CW starting from the x-axis
-     */
-    public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0);
-
-    /**
-     * Save current state
-     */
-    function save();
-
-    /**
-     * Restore last state
-     */
-    function restore();
-
-    /**
-     * Rotate
-     *
-     * @param float $angle angle in degrees for counter-clockwise rotation
-     * @param float $x     Origin abscissa
-     * @param float $y     Origin ordinate
-     */
-    function rotate($angle, $x, $y);
-
-    /**
-     * Skew
-     *
-     * @param float $angle_x
-     * @param float $angle_y
-     * @param float $x Origin abscissa
-     * @param float $y Origin ordinate
-     */
-    function skew($angle_x, $angle_y, $x, $y);
-
-    /**
-     * Scale
-     *
-     * @param float $s_x scaling factor for width as percent
-     * @param float $s_y scaling factor for height as percent
-     * @param float $x   Origin abscissa
-     * @param float $y   Origin ordinate
-     */
-    function scale($s_x, $s_y, $x, $y);
-
-    /**
-     * Translate
-     *
-     * @param float $t_x movement to the right
-     * @param float $t_y movement to the bottom
-     */
-    function translate($t_x, $t_y);
-
-    /**
-     * Transform
-     *
-     * @param $a
-     * @param $b
-     * @param $c
-     * @param $d
-     * @param $e
-     * @param $f
-     * @return
-     */
-    function transform($a, $b, $c, $d, $e, $f);
-
-    /**
-     * Draws a polygon
-     *
-     * The polygon is formed by joining all the points stored in the $points
-     * array.  $points has the following structure:
-     * 
-     * array(0 => x1,
-     *       1 => y1,
-     *       2 => x2,
-     *       3 => y2,
-     *       ...
-     *       );
-     * 
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     * See {@link Cpdf::setLineStyle()} for a description of the $style
-     * parameter (aka dash)
-     *
-     * @param array $points
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     * @param bool $fill Fills the polygon if true
-     */
-    function polygon($points, $color, $width = null, $style = null, $fill = false);
-
-    /**
-     * Draws a circle at $x,$y with radius $r
-     *
-     * See {@link Style::munge_color()} for the format of the color array.
-     * See {@link Cpdf::setLineStyle()} for a description of the $style
-     * parameter (aka dash)
-     *
-     * @param float $x
-     * @param float $y
-     * @param float $r
-     * @param array $color
-     * @param float $width
-     * @param array $style
-     * @param bool $fill Fills the circle if true
-     */
-    function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false);
-
-    /**
-     * Add an image to the pdf.
-     *
-     * The image is placed at the specified x and y coordinates with the
-     * given width and height.
-     *
-     * @param string $img_url the path to the image
-     * @param float $x x position
-     * @param float $y y position
-     * @param int $w width (in pixels)
-     * @param int $h height (in pixels)
-     * @param string $resolution The resolution of the image
-     */
-    function image($img_url, $x, $y, $w, $h, $resolution = "normal");
-
-    /**
-     * Add an arc to the PDF
-     * See {@link Style::munge_color()} for the format of the color array.
-     *
-     * @param float $x X coordinate of the arc
-     * @param float $y Y coordinate of the arc
-     * @param float $r1 Radius 1
-     * @param float $r2 Radius 2
-     * @param float $astart Start angle in degrees
-     * @param float $aend End angle in degrees
-     * @param array $color Color
-     * @param float $width
-     * @param array $style
-     */
-    function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = []);
-
-    /**
-     * Writes text at the specified x and y coordinates
-     * See {@link Style::munge_color()} for the format of the color array.
-     *
-     * @param float $x
-     * @param float $y
-     * @param string $text the text to write
-     * @param string $font the font file to use
-     * @param float $size the font size, in points
-     * @param array $color
-     * @param float $word_space word spacing adjustment
-     * @param float $char_space char spacing adjustment
-     * @param float $angle angle
-     */
-    function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0);
-
-    /**
-     * Add a named destination (similar to ... in html)
-     *
-     * @param string $anchorname The name of the named destination
-     */
-    function add_named_dest($anchorname);
-
-    /**
-     * Add a link to the pdf
-     *
-     * @param string $url The url to link to
-     * @param float $x The x position of the link
-     * @param float $y The y position of the link
-     * @param float $width The width of the link
-     * @param float $height The height of the link
-     */
-    function add_link($url, $x, $y, $width, $height);
-
-    /**
-     * Add meta information to the pdf
-     *
-     * @param string $name Label of the value (Creator, Producer, etc.)
-     * @param string $value The text to set
-     */
-    function add_info($name, $value);
-
-    /**
-     * Calculates text size, in points
-     *
-     * @param string $text the text to be sized
-     * @param string $font the desired font
-     * @param float $size the desired font size
-     * @param float $word_spacing word spacing, if any
-     * @param float $char_spacing
-     *
-     * @return float
-     */
-    function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0);
-
-    /**
-     * Calculates font height, in points
-     *
-     * @param string $font
-     * @param float $size
-     *
-     * @return float
-     */
-    function get_font_height($font, $size);
-
-    /**
-     * Calculates font baseline, in points
-     *
-     * @param string $font
-     * @param float $size
-     *
-     * @return float
-     */
-    function get_font_baseline($font, $size);
-
-    /**
-     * Returns the PDF's width in points
-     *
-     * @return float
-     */
-    function get_width();
-
-
-    /**
-     * Return the image's height in pixels
-     *
-     * @return float
-     */
-    function get_height();
-
-    /**
-     * Returns the font x-height, in points
-     *
-     * @param string $font
-     * @param float $size
-     *
-     * @return float
-     */
-    //function get_font_x_height($font, $size);
-
-    /**
-     * Sets the opacity
-     *
-     * @param float $opacity
-     * @param string $mode
-     */
-    function set_opacity($opacity, $mode = "Normal");
-
-    /**
-     * Sets the default view
-     *
-     * @param string $view
-     * 'XYZ'  left, top, zoom
-     * 'Fit'
-     * 'FitH' top
-     * 'FitV' left
-     * 'FitR' left,bottom,right
-     * 'FitB'
-     * 'FitBH' top
-     * 'FitBV' left
-     * @param array $options
-     *
-     * @return void
-     */
-    function set_default_view($view, $options = []);
-
-    /**
-     * @param string $script
-     *
-     * @return void
-     */
-    function javascript($script);
-
-    /**
-     * Starts a new page
-     *
-     * Subsequent drawing operations will appear on the new page.
-     */
-    function new_page();
-
-    /**
-     * Streams the PDF directly to the browser.
-     *
-     * @param string $filename The filename to present to the browser.
-     * @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1).
-     */
-    function stream($filename, $options = []);
-
-    /**
-     * Returns the PDF as a string.
-     *
-     * @param array $options Associative array: 'compress' => 1 or 0 (default 1).
-     * @return string
-     */
-    function output($options = []);
-}
diff --git a/vendor/dompdf/dompdf/src/CanvasFactory.php b/vendor/dompdf/dompdf/src/CanvasFactory.php
deleted file mode 100644
index b2bf127..0000000
--- a/vendor/dompdf/dompdf/src/CanvasFactory.php
+++ /dev/null
@@ -1,59 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-namespace Dompdf;
-
-/**
- * Create canvas instances
- *
- * The canvas factory creates canvas instances based on the
- * availability of rendering backends and config options.
- *
- * @package dompdf
- */
-class CanvasFactory
-{
-    /**
-     * Constructor is private: this is a static class
-     */
-    private function __construct()
-    {
-    }
-
-    /**
-     * @param Dompdf $dompdf
-     * @param string|array $paper
-     * @param string $orientation
-     * @param string $class
-     *
-     * @return Canvas
-     */
-    static function get_instance(Dompdf $dompdf, $paper = null, $orientation = null, $class = null)
-    {
-        $backend = strtolower($dompdf->getOptions()->getPdfBackend());
-
-        if (isset($class) && class_exists($class, false)) {
-            $class .= "_Adapter";
-        } else {
-            if (($backend === "auto" || $backend === "pdflib") &&
-                class_exists("PDFLib", false)
-            ) {
-                $class = "Dompdf\\Adapter\\PDFLib";
-            }
-
-            else {
-                if ($backend === "gd" && extension_loaded('gd')) {
-                    $class = "Dompdf\\Adapter\\GD";
-                } else {
-                    $class = "Dompdf\\Adapter\\CPDF";
-                }
-            }
-        }
-
-        return new $class($paper, $orientation, $dompdf);
-    }
-}
diff --git a/vendor/dompdf/dompdf/src/Cellmap.php b/vendor/dompdf/dompdf/src/Cellmap.php
deleted file mode 100644
index 6fe9973..0000000
--- a/vendor/dompdf/dompdf/src/Cellmap.php
+++ /dev/null
@@ -1,913 +0,0 @@
-
- * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
- */
-namespace Dompdf;
-
-use Dompdf\FrameDecorator\Table as TableFrameDecorator;
-use Dompdf\FrameDecorator\TableCell as TableCellFrameDecorator;
-
-/**
- * Maps table cells to the table grid.
- *
- * This class resolves borders in tables with collapsed borders and helps
- * place row & column spanned table cells.
- *
- * @package dompdf
- */
-class Cellmap
-{
-    /**
-     * Border style weight lookup for collapsed border resolution.
-     *
-     * @var array
-     */
-    protected static $_BORDER_STYLE_SCORE = [
-        "inset"  => 1,
-        "groove" => 2,
-        "outset" => 3,
-        "ridge"  => 4,
-        "dotted" => 5,
-        "dashed" => 6,
-        "solid"  => 7,
-        "double" => 8,
-        "hidden" => 9,
-        "none"   => 0,
-    ];
-
-    /**
-     * The table object this cellmap is attached to.
-     *
-     * @var TableFrameDecorator
-     */
-    protected $_table;
-
-    /**
-     * The total number of rows in the table
-     *
-     * @var int
-     */
-    protected $_num_rows;
-
-    /**
-     * The total number of columns in the table
-     *
-     * @var int
-     */
-    protected $_num_cols;
-
-    /**
-     * 2D array mapping  to frames
-     *
-     * @var Frame[][]
-     */
-    protected $_cells;
-
-    /**
-     * 1D array of column dimensions
-     *
-     * @var array
-     */
-    protected $_columns;
-
-    /**
-     * 1D array of row dimensions
-     *
-     * @var array
-     */
-    protected $_rows;
-
-    /**
-     * 2D array of border specs
-     *
-     * @var array
-     */
-    protected $_borders;
-
-    /**
-     * 1D Array mapping frames to (multiple)  pairs, keyed on frame_id.
-     *
-     * @var Frame[]
-     */
-    protected $_frames;
-
-    /**
-     * Current column when adding cells, 0-based
-     *
-     * @var int
-     */
-    private $__col;
-
-    /**
-     * Current row when adding cells, 0-based
-     *
-     * @var int
-     */
-    private $__row;
-
-    /**
-     * Tells whether the columns' width can be modified
-     *
-     * @var bool
-     */
-    private $_columns_locked = false;
-
-    /**
-     * Tells whether the table has table-layout:fixed
-     *
-     * @var bool
-     */
-    private $_fixed_layout = false;
-
-    /**
-     * @param TableFrameDecorator $table
-     */
-    public function __construct(TableFrameDecorator $table)
-    {
-        $this->_table = $table;
-        $this->reset();
-    }
-
-    /**
-     *
-     */
-    public function reset()
-    {
-        $this->_num_rows = 0;
-        $this->_num_cols = 0;
-
-        $this->_cells = [];
-        $this->_frames = [];
-
-        if (!$this->_columns_locked) {
-            $this->_columns = [];
-        }
-
-        $this->_rows = [];
-
-        $this->_borders = [];
-
-        $this->__col = $this->__row = 0;
-    }
-
-    /**
-     *
-     */
-    public function lock_columns()
-    {
-        $this->_columns_locked = true;
-    }
-
-    /**
-     * @return bool
-     */
-    public function is_columns_locked()
-    {
-        return $this->_columns_locked;
-    }
-
-    /**
-     * @param $fixed
-     */
-    public function set_layout_fixed($fixed)
-    {
-        $this->_fixed_layout = $fixed;
-    }
-
-    /**
-     * @return bool
-     */
-    public function is_layout_fixed()
-    {
-        return $this->_fixed_layout;
-    }
-
-    /**
-     * @return int
-     */
-    public function get_num_rows()
-    {
-        return $this->_num_rows;
-    }
-
-    /**
-     * @return int
-     */
-    public function get_num_cols()
-    {
-        return $this->_num_cols;
-    }
-
-    /**
-     * @return array
-     */
-    public function &get_columns()
-    {
-        return $this->_columns;
-    }
-
-    /**
-     * @param $columns
-     */
-    public function set_columns($columns)
-    {
-        $this->_columns = $columns;
-    }
-
-    /**
-     * @param int $i
-     *
-     * @return mixed
-     */
-    public function &get_column($i)
-    {
-        if (!isset($this->_columns[$i])) {
-            $this->_columns[$i] = [
-                "x"          => 0,
-                "min-width"  => 0,
-                "max-width"  => 0,
-                "used-width" => null,
-                "absolute"   => 0,
-                "percent"    => 0,
-                "auto"       => true,
-            ];
-        }
-
-        return $this->_columns[$i];
-    }
-
-    /**
-     * @return array
-     */
-    public function &get_rows()
-    {
-        return $this->_rows;
-    }
-
-    /**
-     * @param int $j
-     *
-     * @return mixed
-     */
-    public function &get_row($j)
-    {
-        if (!isset($this->_rows[$j])) {
-            $this->_rows[$j] = [
-                "y"            => 0,
-                "first-column" => 0,
-                "height"       => null,
-            ];
-        }
-
-        return $this->_rows[$j];
-    }
-
-    /**
-     * @param int $i
-     * @param int $j
-     * @param mixed $h_v
-     * @param null|mixed $prop
-     *
-     * @return mixed
-     */
-    public function get_border($i, $j, $h_v, $prop = null)
-    {
-        if (!isset($this->_borders[$i][$j][$h_v])) {
-            $this->_borders[$i][$j][$h_v] = [
-                "width" => 0,
-                "style" => "solid",
-                "color" => "black",
-            ];
-        }
-
-        if (isset($prop)) {
-            return $this->_borders[$i][$j][$h_v][$prop];
-        }
-
-        return $this->_borders[$i][$j][$h_v];
-    }
-
-    /**
-     * @param int $i
-     * @param int $j
-     *
-     * @return array
-     */
-    public function get_border_properties($i, $j)
-    {
-        return [
-            "top"    => $this->get_border($i, $j, "horizontal"),
-            "right"  => $this->get_border($i, $j + 1, "vertical"),
-            "bottom" => $this->get_border($i + 1, $j, "horizontal"),
-            "left"   => $this->get_border($i, $j, "vertical"),
-        ];
-    }
-
-    /**
-     * @param Frame $frame
-     *
-     * @return null|Frame
-     */
-    public function get_spanned_cells(Frame $frame)
-    {
-        $key = $frame->get_id();
-
-        if (isset($this->_frames[$key])) {
-            return $this->_frames[$key];
-        }
-
-        return null;
-    }
-
-    /**
-     * @param Frame $frame
-     *
-     * @return bool
-     */
-    public function frame_exists_in_cellmap(Frame $frame)
-    {
-        $key = $frame->get_id();
-
-        return isset($this->_frames[$key]);
-    }
-
-    /**
-     * @param Frame $frame
-     *
-     * @return array
-     * @throws Exception
-     */
-    public function get_frame_position(Frame $frame)
-    {
-        global $_dompdf_warnings;
-
-        $key = $frame->get_id();
-
-        if (!isset($this->_frames[$key])) {
-            throw new Exception("Frame not found in cellmap");
-        }
-
-        $col = $this->_frames[$key]["columns"][0];
-        $row = $this->_frames[$key]["rows"][0];
-
-        if (!isset($this->_columns[$col])) {
-            $_dompdf_warnings[] = "Frame not found in columns array.  Check your table layout for missing or extra TDs.";
-            $x = 0;
-        } else {
-            $x = $this->_columns[$col]["x"];
-        }
-
-        if (!isset($this->_rows[$row])) {
-            $_dompdf_warnings[] = "Frame not found in row array.  Check your table layout for missing or extra TDs.";
-            $y = 0;
-        } else {
-            $y = $this->_rows[$row]["y"];
-        }
-
-        return [$x, $y, "x" => $x, "y" => $y];
-    }
-
-    /**
-     * @param Frame $frame
-     *
-     * @return int
-     * @throws Exception
-     */
-    public function get_frame_width(Frame $frame)
-    {
-        $key = $frame->get_id();
-
-        if (!isset($this->_frames[$key])) {
-            throw new Exception("Frame not found in cellmap");
-        }
-
-        $cols = $this->_frames[$key]["columns"];
-        $w = 0;
-        foreach ($cols as $i) {
-            $w += $this->_columns[$i]["used-width"];
-        }
-
-        return $w;
-    }
-
-    /**
-     * @param Frame $frame
-     *
-     * @return int
-     * @throws Exception
-     * @throws Exception
-     */
-    public function get_frame_height(Frame $frame)
-    {
-        $key = $frame->get_id();
-
-        if (!isset($this->_frames[$key])) {
-            throw new Exception("Frame not found in cellmap");
-        }
-
-        $rows = $this->_frames[$key]["rows"];
-        $h = 0;
-        foreach ($rows as $i) {
-            if (!isset($this->_rows[$i])) {
-                throw new Exception("The row #$i could not be found, please file an issue in the tracker with the HTML code");
-            }
-
-            $h += $this->_rows[$i]["height"];
-        }
-
-        return $h;
-    }
-
-    /**
-     * @param int $j
-     * @param mixed $width
-     */
-    public function set_column_width($j, $width)
-    {
-        if ($this->_columns_locked) {
-            return;
-        }
-
-        $col =& $this->get_column($j);
-        $col["used-width"] = $width;
-        $next_col =& $this->get_column($j + 1);
-        $next_col["x"] = $next_col["x"] + $width;
-    }
-
-    /**
-     * @param int $i
-     * @param mixed $height
-     */
-    public function set_row_height($i, $height)
-    {
-        $row =& $this->get_row($i);
-
-        if ($row["height"] !== null && $height <= $row["height"]) {
-            return;
-        }
-
-        $row["height"] = $height;
-        $next_row =& $this->get_row($i + 1);
-        $next_row["y"] = $row["y"] + $height;
-    }
-
-    /**
-     * @param int $i
-     * @param int $j
-     * @param mixed $h_v
-     * @param mixed $border_spec
-     *
-     * @return mixed
-     */
-    protected function _resolve_border($i, $j, $h_v, $border_spec)
-    {
-        $n_width = $border_spec["width"];
-        $n_style = $border_spec["style"];
-
-        if (!isset($this->_borders[$i][$j][$h_v])) {
-            $this->_borders[$i][$j][$h_v] = $border_spec;
-
-            return $this->_borders[$i][$j][$h_v]["width"];
-        }
-
-        $border = & $this->_borders[$i][$j][$h_v];
-
-        $o_width = $border["width"];
-        $o_style = $border["style"];
-
-        if (($n_style === "hidden" ||
-                $n_width > $o_width ||
-                $o_style === "none")
-
-            or
-
-            ($o_width == $n_width &&
-                in_array($n_style, self::$_BORDER_STYLE_SCORE) &&
-                self::$_BORDER_STYLE_SCORE[$n_style] > self::$_BORDER_STYLE_SCORE[$o_style])
-        ) {
-            $border = $border_spec;
-        }
-
-        return $border["width"];
-    }
-
-    /**
-     * @param Frame $frame
-     */
-    public function add_frame(Frame $frame)
-    {
-        $style = $frame->get_style();
-        $display = $style->display;
-
-        $collapse = $this->_table->get_style()->border_collapse == "collapse";
-
-        // Recursively add the frames within tables, table-row-groups and table-rows
-        if ($display === "table-row" ||
-            $display === "table" ||
-            $display === "inline-table" ||
-            in_array($display, TableFrameDecorator::$ROW_GROUPS)
-        ) {
-            $start_row = $this->__row;
-            foreach ($frame->get_children() as $child) {
-                // Ignore all Text frames and :before/:after pseudo-selector elements.
-                if (!($child instanceof FrameDecorator\Text) && $child->get_node()->nodeName !== 'dompdf_generated') {
-                    $this->add_frame($child);
-                }
-            }
-
-            if ($display === "table-row") {
-                $this->add_row();
-            }
-
-            $num_rows = $this->__row - $start_row - 1;
-            $key = $frame->get_id();
-
-            // Row groups always span across the entire table
-            $this->_frames[$key]["columns"] = range(0, max(0, $this->_num_cols - 1));
-            $this->_frames[$key]["rows"] = range($start_row, max(0, $this->__row - 1));
-            $this->_frames[$key]["frame"] = $frame;
-
-            if ($display !== "table-row" && $collapse) {
-                $bp = $style->get_border_properties();
-
-                // Resolve the borders
-                for ($i = 0; $i < $num_rows + 1; $i++) {
-                    $this->_resolve_border($start_row + $i, 0, "vertical", $bp["left"]);
-                    $this->_resolve_border($start_row + $i, $this->_num_cols, "vertical", $bp["right"]);
-                }
-
-                for ($j = 0; $j < $this->_num_cols; $j++) {
-                    $this->_resolve_border($start_row, $j, "horizontal", $bp["top"]);
-                    $this->_resolve_border($this->__row, $j, "horizontal", $bp["bottom"]);
-                }
-            }
-            return;
-        }
-
-        $node = $frame->get_node();
-
-        // Determine where this cell is going
-        $colspan = $node->getAttribute("colspan");
-        $rowspan = $node->getAttribute("rowspan");
-
-        if (!$colspan) {
-            $colspan = 1;
-            $node->setAttribute("colspan", 1);
-        }
-
-        if (!$rowspan) {
-            $rowspan = 1;
-            $node->setAttribute("rowspan", 1);
-        }
-        $key = $frame->get_id();
-
-        $bp = $style->get_border_properties();
-
-
-        // Add the frame to the cellmap
-        $max_left = $max_right = 0;
-
-        // Find the next available column (fix by Ciro Mondueri)
-        $ac = $this->__col;
-        while (isset($this->_cells[$this->__row][$ac])) {
-            $ac++;
-        }
-
-        $this->__col = $ac;
-
-        // Rows:
-        for ($i = 0; $i < $rowspan; $i++) {
-            $row = $this->__row + $i;
-
-            $this->_frames[$key]["rows"][] = $row;
-
-            for ($j = 0; $j < $colspan; $j++) {
-                $this->_cells[$row][$this->__col + $j] = $frame;
-            }
-
-            if ($collapse) {
-                // Resolve vertical borders
-                $max_left = max($max_left, $this->_resolve_border($row, $this->__col, "vertical", $bp["left"]));
-                $max_right = max($max_right, $this->_resolve_border($row, $this->__col + $colspan, "vertical", $bp["right"]));
-            }
-        }
-
-        $max_top = $max_bottom = 0;
-
-        // Columns:
-        for ($j = 0; $j < $colspan; $j++) {
-            $col = $this->__col + $j;
-            $this->_frames[$key]["columns"][] = $col;
-
-            if ($collapse) {
-                // Resolve horizontal borders
-                $max_top = max($max_top, $this->_resolve_border($this->__row, $col, "horizontal", $bp["top"]));
-                $max_bottom = max($max_bottom, $this->_resolve_border($this->__row + $rowspan, $col, "horizontal", $bp["bottom"]));
-            }
-        }
-
-        $this->_frames[$key]["frame"] = $frame;
-
-        // Handle seperated border model
-        if (!$collapse) {
-            list($h, $v) = $this->_table->get_style()->border_spacing;
-
-            // Border spacing is effectively a margin between cells
-            $v = $style->length_in_pt($v);
-            if (is_numeric($v)) {
-                $v = $v / 2;
-            }
-            $h = $style->length_in_pt($h);
-            if (is_numeric($h)) {
-                $h = $h / 2;
-            }
-            $style->margin = "$v $h";
-
-            // The additional 1/2 width gets added to the table proper
-        } else {
-            // Drop the frame's actual border
-            $style->border_left_width = $max_left / 2;
-            $style->border_right_width = $max_right / 2;
-            $style->border_top_width = $max_top / 2;
-            $style->border_bottom_width = $max_bottom / 2;
-            $style->margin = "none";
-        }
-
-        if (!$this->_columns_locked) {
-            // Resolve the frame's width
-            if ($this->_fixed_layout) {
-                list($frame_min, $frame_max) = [0, 10e-10];
-            } else {
-                list($frame_min, $frame_max) = $frame->get_min_max_width();
-            }
-
-            $width = $style->width;
-
-            $val = null;
-            if (Helpers::is_percent($width)) {
-                $var = "percent";
-                $val = (float)rtrim($width, "% ") / $colspan;
-            } else if ($width !== "auto") {
-                $var = "absolute";
-                $val = $style->length_in_pt($frame_min) / $colspan;
-            }
-
-            $min = 0;
-            $max = 0;
-            for ($cs = 0; $cs < $colspan; $cs++) {
-
-                // Resolve the frame's width(s) with other cells
-                $col =& $this->get_column($this->__col + $cs);
-
-                // Note: $var is either 'percent' or 'absolute'.  We compare the
-                // requested percentage or absolute values with the existing widths
-                // and adjust accordingly.
-                if (isset($var) && $val > $col[$var]) {
-                    $col[$var] = $val;
-                    $col["auto"] = false;
-                }
-
-                $min += $col["min-width"];
-                $max += $col["max-width"];
-            }
-
-            if ($frame_min > $min) {
-                // The frame needs more space.  Expand each sub-column
-                // FIXME try to avoid putting this dummy value when table-layout:fixed
-                $inc = ($this->is_layout_fixed() ? 10e-10 : ($frame_min - $min) / $colspan);
-                for ($c = 0; $c < $colspan; $c++) {
-                    $col =& $this->get_column($this->__col + $c);
-                    $col["min-width"] += $inc;
-                }
-            }
-
-            if ($frame_max > $max) {
-                // FIXME try to avoid putting this dummy value when table-layout:fixed
-                $inc = ($this->is_layout_fixed() ? 10e-10 : ($frame_max - $max) / $colspan);
-                for ($c = 0; $c < $colspan; $c++) {
-                    $col =& $this->get_column($this->__col + $c);
-                    $col["max-width"] += $inc;
-                }
-            }
-        }
-
-        $this->__col += $colspan;
-        if ($this->__col > $this->_num_cols) {
-            $this->_num_cols = $this->__col;
-        }
-    }
-
-    /**
-     *
-     */
-    public function add_row()
-    {
-        $this->__row++;
-        $this->_num_rows++;
-
-        // Find the next available column
-        $i = 0;
-        while (isset($this->_cells[$this->__row][$i])) {
-            $i++;
-        }
-
-        $this->__col = $i;
-    }
-
-    /**
-     * Remove a row from the cellmap.
-     *
-     * @param Frame
-     */
-    public function remove_row(Frame $row)
-    {
-        $key = $row->get_id();
-        if (!isset($this->_frames[$key])) {
-            return; // Presumably this row has alredy been removed
-        }
-
-        $this->__row = $this->_num_rows--;
-
-        $rows = $this->_frames[$key]["rows"];
-        $columns = $this->_frames[$key]["columns"];
-
-        // Remove all frames from this row
-        foreach ($rows as $r) {
-            foreach ($columns as $c) {
-                if (isset($this->_cells[$r][$c])) {
-                    $id = $this->_cells[$r][$c]->get_id();
-
-                    $this->_cells[$r][$c] = null;
-                    unset($this->_cells[$r][$c]);
-
-                    // has multiple rows?
-                    if (isset($this->_frames[$id]) && count($this->_frames[$id]["rows"]) > 1) {
-                        // remove just the desired row, but leave the frame
-                        if (($row_key = array_search($r, $this->_frames[$id]["rows"])) !== false) {
-                            unset($this->_frames[$id]["rows"][$row_key]);
-                        }
-                        continue;
-                    }
-
-                    $this->_frames[$id] = null;
-                    unset($this->_frames[$id]);
-                }
-            }
-
-            $this->_rows[$r] = null;
-            unset($this->_rows[$r]);
-        }
-
-        $this->_frames[$key] = null;
-        unset($this->_frames[$key]);
-    }
-
-    /**
-     * Remove a row group from the cellmap.
-     *
-     * @param Frame $group The group to remove
-     */
-    public function remove_row_group(Frame $group)
-    {
-        $key = $group->get_id();
-        if (!isset($this->_frames[$key])) {
-            return; // Presumably this row has alredy been removed
-        }
-
-        $iter = $group->get_first_child();
-        while ($iter) {
-            $this->remove_row($iter);
-            $iter = $iter->get_next_sibling();
-        }
-
-        $this->_frames[$key] = null;
-        unset($this->_frames[$key]);
-    }
-
-    /**
-     * Update a row group after rows have been removed
-     *
-     * @param Frame $group    The group to update
-     * @param Frame $last_row The last row in the row group
-     */
-    public function update_row_group(Frame $group, Frame $last_row)
-    {
-        $g_key = $group->get_id();
-        $r_key = $last_row->get_id();
-
-        $r_rows = $this->_frames[$g_key]["rows"];
-        $this->_frames[$g_key]["rows"] = range($this->_frames[$g_key]["rows"][0], end($r_rows));
-    }
-
-    /**
-     *
-     */
-    public function assign_x_positions()
-    {
-        // Pre-condition: widths must be resolved and assigned to columns and
-        // column[0]["x"] must be set.
-
-        if ($this->_columns_locked) {
-            return;
-        }
-
-        $x = $this->_columns[0]["x"];
-        foreach (array_keys($this->_columns) as $j) {
-            $this->_columns[$j]["x"] = $x;
-            $x += $this->_columns[$j]["used-width"];
-        }
-    }
-
-    /**
-     *
-     */
-    public function assign_frame_heights()
-    {
-        // Pre-condition: widths and heights of each column & row must be
-        // calcluated
-        foreach ($this->_frames as $arr) {
-            $frame = $arr["frame"];
-
-            $h = 0;
-            foreach ($arr["rows"] as $row) {
-                if (!isset($this->_rows[$row])) {
-                    // The row has been removed because of a page split, so skip it.
-                    continue;
-                }
-
-                $h += $this->_rows[$row]["height"];
-            }
-
-            if ($frame instanceof TableCellFrameDecorator) {
-                $frame->set_cell_height($h);
-            } else {
-                $frame->get_style()->height = $h;
-            }
-        }
-    }
-
-    /**
-     * Re-adjust frame height if the table height is larger than its content
-     */
-    public function set_frame_heights($table_height, $content_height)
-    {
-        // Distribute the increased height proportionally amongst each row
-        foreach ($this->_frames as $arr) {
-            $frame = $arr["frame"];
-
-            $h = 0;
-            foreach ($arr["rows"] as $row) {
-                if (!isset($this->_rows[$row])) {
-                    continue;
-                }
-
-                $h += $this->_rows[$row]["height"];
-            }
-
-            if ($content_height > 0) {
-                $new_height = ($h / $content_height) * $table_height;
-            } else {
-                $new_height = 0;
-            }
-
-            if ($frame instanceof TableCellFrameDecorator) {
-                $frame->set_cell_height($new_height);
-            } else {
-                $frame->get_style()->height = $new_height;
-            }
-        }
-    }
-
-    /**
-     * Used for debugging:
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        $str = "";
-        $str .= "Columns:
"; - $str .= Helpers::pre_r($this->_columns, true); - $str .= "Rows:
"; - $str .= Helpers::pre_r($this->_rows, true); - - $str .= "Frames:
"; - $arr = []; - foreach ($this->_frames as $key => $val) { - $arr[$key] = ["columns" => $val["columns"], "rows" => $val["rows"]]; - } - - $str .= Helpers::pre_r($arr, true); - - if (php_sapi_name() == "cli") { - $str = strip_tags(str_replace(["
", "", ""], - ["\n", chr(27) . "[01;33m", chr(27) . "[0m"], - $str)); - } - - return $str; - } -} diff --git a/vendor/dompdf/dompdf/src/Css/AttributeTranslator.php b/vendor/dompdf/dompdf/src/Css/AttributeTranslator.php deleted file mode 100644 index eeae5e6..0000000 --- a/vendor/dompdf/dompdf/src/Css/AttributeTranslator.php +++ /dev/null @@ -1,638 +0,0 @@ - - * @author Fabien Ménager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Css; - -use Dompdf\Frame; - -/** - * Translates HTML 4.0 attributes into CSS rules - * - * @package dompdf - */ -class AttributeTranslator -{ - static $_style_attr = "_html_style_attribute"; - - // Munged data originally from - // http://www.w3.org/TR/REC-html40/index/attributes.html - // http://www.cs.tut.fi/~jkorpela/html2css.html - private static $__ATTRIBUTE_LOOKUP = [ - //'caption' => array ( 'align' => '', ), - 'img' => [ - 'align' => [ - 'bottom' => 'vertical-align: baseline;', - 'middle' => 'vertical-align: middle;', - 'top' => 'vertical-align: top;', - 'left' => 'float: left;', - 'right' => 'float: right;' - ], - 'border' => 'border: %0.2Fpx solid;', - 'height' => 'height: %spx;', - 'hspace' => 'padding-left: %1$0.2Fpx; padding-right: %1$0.2Fpx;', - 'vspace' => 'padding-top: %1$0.2Fpx; padding-bottom: %1$0.2Fpx;', - 'width' => 'width: %spx;', - ], - 'table' => [ - 'align' => [ - 'left' => 'margin-left: 0; margin-right: auto;', - 'center' => 'margin-left: auto; margin-right: auto;', - 'right' => 'margin-left: auto; margin-right: 0;' - ], - 'bgcolor' => 'background-color: %s;', - 'border' => '!set_table_border', - 'cellpadding' => '!set_table_cellpadding', //'border-spacing: %0.2F; border-collapse: separate;', - 'cellspacing' => '!set_table_cellspacing', - 'frame' => [ - 'void' => 'border-style: none;', - 'above' => 'border-top-style: solid;', - 'below' => 'border-bottom-style: solid;', - 'hsides' => 'border-left-style: solid; border-right-style: solid;', - 'vsides' => 'border-top-style: solid; border-bottom-style: solid;', - 'lhs' => 'border-left-style: solid;', - 'rhs' => 'border-right-style: solid;', - 'box' => 'border-style: solid;', - 'border' => 'border-style: solid;' - ], - 'rules' => '!set_table_rules', - 'width' => 'width: %s;', - ], - 'hr' => [ - 'align' => '!set_hr_align', // Need to grab width to set 'left' & 'right' correctly - 'noshade' => 'border-style: solid;', - 'size' => '!set_hr_size', //'border-width: %0.2F px;', - 'width' => 'width: %s;', - ], - 'div' => [ - 'align' => 'text-align: %s;', - ], - 'h1' => [ - 'align' => 'text-align: %s;', - ], - 'h2' => [ - 'align' => 'text-align: %s;', - ], - 'h3' => [ - 'align' => 'text-align: %s;', - ], - 'h4' => [ - 'align' => 'text-align: %s;', - ], - 'h5' => [ - 'align' => 'text-align: %s;', - ], - 'h6' => [ - 'align' => 'text-align: %s;', - ], - //TODO: translate more form element attributes - 'input' => [ - 'size' => '!set_input_width' - ], - 'p' => [ - 'align' => 'text-align: %s;', - ], -// 'col' => array( -// 'align' => '', -// 'valign' => '', -// ), -// 'colgroup' => array( -// 'align' => '', -// 'valign' => '', -// ), - 'tbody' => [ - 'align' => '!set_table_row_align', - 'valign' => '!set_table_row_valign', - ], - 'td' => [ - 'align' => 'text-align: %s;', - 'bgcolor' => '!set_background_color', - 'height' => 'height: %s;', - 'nowrap' => 'white-space: nowrap;', - 'valign' => 'vertical-align: %s;', - 'width' => 'width: %s;', - ], - 'tfoot' => [ - 'align' => '!set_table_row_align', - 'valign' => '!set_table_row_valign', - ], - 'th' => [ - 'align' => 'text-align: %s;', - 'bgcolor' => '!set_background_color', - 'height' => 'height: %s;', - 'nowrap' => 'white-space: nowrap;', - 'valign' => 'vertical-align: %s;', - 'width' => 'width: %s;', - ], - 'thead' => [ - 'align' => '!set_table_row_align', - 'valign' => '!set_table_row_valign', - ], - 'tr' => [ - 'align' => '!set_table_row_align', - 'bgcolor' => '!set_table_row_bgcolor', - 'valign' => '!set_table_row_valign', - ], - 'body' => [ - 'background' => 'background-image: url(%s);', - 'bgcolor' => '!set_background_color', - 'link' => '!set_body_link', - 'text' => '!set_color', - ], - 'br' => [ - 'clear' => 'clear: %s;', - ], - 'basefont' => [ - 'color' => '!set_color', - 'face' => 'font-family: %s;', - 'size' => '!set_basefont_size', - ], - 'font' => [ - 'color' => '!set_color', - 'face' => 'font-family: %s;', - 'size' => '!set_font_size', - ], - 'dir' => [ - 'compact' => 'margin: 0.5em 0;', - ], - 'dl' => [ - 'compact' => 'margin: 0.5em 0;', - ], - 'menu' => [ - 'compact' => 'margin: 0.5em 0;', - ], - 'ol' => [ - 'compact' => 'margin: 0.5em 0;', - 'start' => 'counter-reset: -dompdf-default-counter %d;', - 'type' => 'list-style-type: %s;', - ], - 'ul' => [ - 'compact' => 'margin: 0.5em 0;', - 'type' => 'list-style-type: %s;', - ], - 'li' => [ - 'type' => 'list-style-type: %s;', - 'value' => 'counter-reset: -dompdf-default-counter %d;', - ], - 'pre' => [ - 'width' => 'width: %s;', - ], - ]; - - protected static $_last_basefont_size = 3; - protected static $_font_size_lookup = [ - // For basefont support - -3 => "4pt", - -2 => "5pt", - -1 => "6pt", - 0 => "7pt", - - 1 => "8pt", - 2 => "10pt", - 3 => "12pt", - 4 => "14pt", - 5 => "18pt", - 6 => "24pt", - 7 => "34pt", - - // For basefont support - 8 => "48pt", - 9 => "44pt", - 10 => "52pt", - 11 => "60pt", - ]; - - /** - * @param Frame $frame - */ - static function translate_attributes(Frame $frame) - { - $node = $frame->get_node(); - $tag = $node->nodeName; - - if (!isset(self::$__ATTRIBUTE_LOOKUP[$tag])) { - return; - } - - $valid_attrs = self::$__ATTRIBUTE_LOOKUP[$tag]; - $attrs = $node->attributes; - $style = rtrim($node->getAttribute(self::$_style_attr), "; "); - if ($style != "") { - $style .= ";"; - } - - foreach ($attrs as $attr => $attr_node) { - if (!isset($valid_attrs[$attr])) { - continue; - } - - $value = $attr_node->value; - - $target = $valid_attrs[$attr]; - - // Look up $value in $target, if $target is an array: - if (is_array($target)) { - if (isset($target[$value])) { - $style .= " " . self::_resolve_target($node, $target[$value], $value); - } - } else { - // otherwise use target directly - $style .= " " . self::_resolve_target($node, $target, $value); - } - } - - if (!is_null($style)) { - $style = ltrim($style); - $node->setAttribute(self::$_style_attr, $style); - } - } - - /** - * @param \DOMNode $node - * @param string $target - * @param string $value - * - * @return string - */ - protected static function _resolve_target(\DOMNode $node, $target, $value) - { - if ($target[0] === "!") { - // Function call - $func = "_" . mb_substr($target, 1); - - return self::$func($node, $value); - } - - return $value ? sprintf($target, $value) : ""; - } - - /** - * @param \DOMElement $node - * @param string $new_style - */ - static function append_style(\DOMElement $node, $new_style) - { - $style = rtrim($node->getAttribute(self::$_style_attr), ";"); - $style .= $new_style; - $style = ltrim($style, ";"); - $node->setAttribute(self::$_style_attr, $style); - } - - /** - * @param \DOMNode $node - * - * @return \DOMNodeList|\DOMElement[] - */ - protected static function get_cell_list(\DOMNode $node) - { - $xpath = new \DOMXpath($node->ownerDocument); - - switch ($node->nodeName) { - default: - case "table": - $query = "tr/td | thead/tr/td | tbody/tr/td | tfoot/tr/td | tr/th | thead/tr/th | tbody/tr/th | tfoot/tr/th"; - break; - - case "tbody": - case "tfoot": - case "thead": - $query = "tr/td | tr/th"; - break; - - case "tr": - $query = "td | th"; - break; - } - - return $xpath->query($query, $node); - } - - /** - * @param string $value - * - * @return string - */ - protected static function _get_valid_color($value) - { - if (preg_match('/^#?([0-9A-F]{6})$/i', $value, $matches)) { - $value = "#$matches[1]"; - } - - return $value; - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return string - */ - protected static function _set_color(\DOMElement $node, $value) - { - $value = self::_get_valid_color($value); - - return "color: $value;"; - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return string - */ - protected static function _set_background_color(\DOMElement $node, $value) - { - $value = self::_get_valid_color($value); - - return "background-color: $value;"; - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return null - */ - protected static function _set_table_cellpadding(\DOMElement $node, $value) - { - $cell_list = self::get_cell_list($node); - - foreach ($cell_list as $cell) { - self::append_style($cell, "; padding: {$value}px;"); - } - - return null; - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return string - */ - protected static function _set_table_border(\DOMElement $node, $value) - { - $cell_list = self::get_cell_list($node); - - foreach ($cell_list as $cell) { - $style = rtrim($cell->getAttribute(self::$_style_attr)); - $style .= "; border-width: " . ($value > 0 ? 1 : 0) . "pt; border-style: inset;"; - $style = ltrim($style, ";"); - $cell->setAttribute(self::$_style_attr, $style); - } - - $style = rtrim($node->getAttribute(self::$_style_attr), ";"); - $style .= "; border-width: $value" . "px; "; - - return ltrim($style, "; "); - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return string - */ - protected static function _set_table_cellspacing(\DOMElement $node, $value) - { - $style = rtrim($node->getAttribute(self::$_style_attr), ";"); - - if ($value == 0) { - $style .= "; border-collapse: collapse;"; - } else { - $style .= "; border-spacing: {$value}px; border-collapse: separate;"; - } - - return ltrim($style, ";"); - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return null|string - */ - protected static function _set_table_rules(\DOMElement $node, $value) - { - $new_style = "; border-collapse: collapse;"; - - switch ($value) { - case "none": - $new_style .= "border-style: none;"; - break; - - case "groups": - // FIXME: unsupported - return null; - - case "rows": - $new_style .= "border-style: solid none solid none; border-width: 1px; "; - break; - - case "cols": - $new_style .= "border-style: none solid none solid; border-width: 1px; "; - break; - - case "all": - $new_style .= "border-style: solid; border-width: 1px; "; - break; - - default: - // Invalid value - return null; - } - - $cell_list = self::get_cell_list($node); - - foreach ($cell_list as $cell) { - $style = $cell->getAttribute(self::$_style_attr); - $style .= $new_style; - $cell->setAttribute(self::$_style_attr, $style); - } - - $style = rtrim($node->getAttribute(self::$_style_attr), ";"); - $style .= "; border-collapse: collapse; "; - - return ltrim($style, "; "); - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return string - */ - protected static function _set_hr_size(\DOMElement $node, $value) - { - $style = rtrim($node->getAttribute(self::$_style_attr), ";"); - $style .= "; border-width: " . max(0, $value - 2) . "; "; - - return ltrim($style, "; "); - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return null|string - */ - protected static function _set_hr_align(\DOMElement $node, $value) - { - $style = rtrim($node->getAttribute(self::$_style_attr), ";"); - $width = $node->getAttribute("width"); - - if ($width == "") { - $width = "100%"; - } - - $remainder = 100 - (double)rtrim($width, "% "); - - switch ($value) { - case "left": - $style .= "; margin-right: $remainder %;"; - break; - - case "right": - $style .= "; margin-left: $remainder %;"; - break; - - case "center": - $style .= "; margin-left: auto; margin-right: auto;"; - break; - - default: - return null; - } - - return ltrim($style, "; "); - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return null|string - */ - protected static function _set_input_width(\DOMElement $node, $value) - { - if (empty($value)) { return null; } - - if ($node->hasAttribute("type") && in_array(strtolower($node->getAttribute("type")), ["text","password"])) { - return sprintf("width: %Fem", (((int)$value * .65)+2)); - } else { - return sprintf("width: %upx;", (int)$value); - } - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return null - */ - protected static function _set_table_row_align(\DOMElement $node, $value) - { - $cell_list = self::get_cell_list($node); - - foreach ($cell_list as $cell) { - self::append_style($cell, "; text-align: $value;"); - } - - return null; - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return null - */ - protected static function _set_table_row_valign(\DOMElement $node, $value) - { - $cell_list = self::get_cell_list($node); - - foreach ($cell_list as $cell) { - self::append_style($cell, "; vertical-align: $value;"); - } - - return null; - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return null - */ - protected static function _set_table_row_bgcolor(\DOMElement $node, $value) - { - $cell_list = self::get_cell_list($node); - $value = self::_get_valid_color($value); - - foreach ($cell_list as $cell) { - self::append_style($cell, "; background-color: $value;"); - } - - return null; - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return null - */ - protected static function _set_body_link(\DOMElement $node, $value) - { - $a_list = $node->getElementsByTagName("a"); - $value = self::_get_valid_color($value); - - foreach ($a_list as $a) { - self::append_style($a, "; color: $value;"); - } - - return null; - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return null - */ - protected static function _set_basefont_size(\DOMElement $node, $value) - { - // FIXME: ? we don't actually set the font size of anything here, just - // the base size for later modification by tags. - self::$_last_basefont_size = $value; - - return null; - } - - /** - * @param \DOMElement $node - * @param string $value - * - * @return string - */ - protected static function _set_font_size(\DOMElement $node, $value) - { - $style = $node->getAttribute(self::$_style_attr); - - if ($value[0] === "-" || $value[0] === "+") { - $value = self::$_last_basefont_size + (int)$value; - } - - if (isset(self::$_font_size_lookup[$value])) { - $style .= "; font-size: " . self::$_font_size_lookup[$value] . ";"; - } else { - $style .= "; font-size: $value;"; - } - - return ltrim($style, "; "); - } -} diff --git a/vendor/dompdf/dompdf/src/Css/Color.php b/vendor/dompdf/dompdf/src/Css/Color.php deleted file mode 100644 index 4591037..0000000 --- a/vendor/dompdf/dompdf/src/Css/Color.php +++ /dev/null @@ -1,319 +0,0 @@ - - * @author Fabien Ménager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Css; - -use Dompdf\Helpers; - -class Color -{ - static $cssColorNames = [ - "aliceblue" => "F0F8FF", - "antiquewhite" => "FAEBD7", - "aqua" => "00FFFF", - "aquamarine" => "7FFFD4", - "azure" => "F0FFFF", - "beige" => "F5F5DC", - "bisque" => "FFE4C4", - "black" => "000000", - "blanchedalmond" => "FFEBCD", - "blue" => "0000FF", - "blueviolet" => "8A2BE2", - "brown" => "A52A2A", - "burlywood" => "DEB887", - "cadetblue" => "5F9EA0", - "chartreuse" => "7FFF00", - "chocolate" => "D2691E", - "coral" => "FF7F50", - "cornflowerblue" => "6495ED", - "cornsilk" => "FFF8DC", - "crimson" => "DC143C", - "cyan" => "00FFFF", - "darkblue" => "00008B", - "darkcyan" => "008B8B", - "darkgoldenrod" => "B8860B", - "darkgray" => "A9A9A9", - "darkgreen" => "006400", - "darkgrey" => "A9A9A9", - "darkkhaki" => "BDB76B", - "darkmagenta" => "8B008B", - "darkolivegreen" => "556B2F", - "darkorange" => "FF8C00", - "darkorchid" => "9932CC", - "darkred" => "8B0000", - "darksalmon" => "E9967A", - "darkseagreen" => "8FBC8F", - "darkslateblue" => "483D8B", - "darkslategray" => "2F4F4F", - "darkslategrey" => "2F4F4F", - "darkturquoise" => "00CED1", - "darkviolet" => "9400D3", - "deeppink" => "FF1493", - "deepskyblue" => "00BFFF", - "dimgray" => "696969", - "dimgrey" => "696969", - "dodgerblue" => "1E90FF", - "firebrick" => "B22222", - "floralwhite" => "FFFAF0", - "forestgreen" => "228B22", - "fuchsia" => "FF00FF", - "gainsboro" => "DCDCDC", - "ghostwhite" => "F8F8FF", - "gold" => "FFD700", - "goldenrod" => "DAA520", - "gray" => "808080", - "green" => "008000", - "greenyellow" => "ADFF2F", - "grey" => "808080", - "honeydew" => "F0FFF0", - "hotpink" => "FF69B4", - "indianred" => "CD5C5C", - "indigo" => "4B0082", - "ivory" => "FFFFF0", - "khaki" => "F0E68C", - "lavender" => "E6E6FA", - "lavenderblush" => "FFF0F5", - "lawngreen" => "7CFC00", - "lemonchiffon" => "FFFACD", - "lightblue" => "ADD8E6", - "lightcoral" => "F08080", - "lightcyan" => "E0FFFF", - "lightgoldenrodyellow" => "FAFAD2", - "lightgray" => "D3D3D3", - "lightgreen" => "90EE90", - "lightgrey" => "D3D3D3", - "lightpink" => "FFB6C1", - "lightsalmon" => "FFA07A", - "lightseagreen" => "20B2AA", - "lightskyblue" => "87CEFA", - "lightslategray" => "778899", - "lightslategrey" => "778899", - "lightsteelblue" => "B0C4DE", - "lightyellow" => "FFFFE0", - "lime" => "00FF00", - "limegreen" => "32CD32", - "linen" => "FAF0E6", - "magenta" => "FF00FF", - "maroon" => "800000", - "mediumaquamarine" => "66CDAA", - "mediumblue" => "0000CD", - "mediumorchid" => "BA55D3", - "mediumpurple" => "9370DB", - "mediumseagreen" => "3CB371", - "mediumslateblue" => "7B68EE", - "mediumspringgreen" => "00FA9A", - "mediumturquoise" => "48D1CC", - "mediumvioletred" => "C71585", - "midnightblue" => "191970", - "mintcream" => "F5FFFA", - "mistyrose" => "FFE4E1", - "moccasin" => "FFE4B5", - "navajowhite" => "FFDEAD", - "navy" => "000080", - "oldlace" => "FDF5E6", - "olive" => "808000", - "olivedrab" => "6B8E23", - "orange" => "FFA500", - "orangered" => "FF4500", - "orchid" => "DA70D6", - "palegoldenrod" => "EEE8AA", - "palegreen" => "98FB98", - "paleturquoise" => "AFEEEE", - "palevioletred" => "DB7093", - "papayawhip" => "FFEFD5", - "peachpuff" => "FFDAB9", - "peru" => "CD853F", - "pink" => "FFC0CB", - "plum" => "DDA0DD", - "powderblue" => "B0E0E6", - "purple" => "800080", - "red" => "FF0000", - "rosybrown" => "BC8F8F", - "royalblue" => "4169E1", - "saddlebrown" => "8B4513", - "salmon" => "FA8072", - "sandybrown" => "F4A460", - "seagreen" => "2E8B57", - "seashell" => "FFF5EE", - "sienna" => "A0522D", - "silver" => "C0C0C0", - "skyblue" => "87CEEB", - "slateblue" => "6A5ACD", - "slategray" => "708090", - "slategrey" => "708090", - "snow" => "FFFAFA", - "springgreen" => "00FF7F", - "steelblue" => "4682B4", - "tan" => "D2B48C", - "teal" => "008080", - "thistle" => "D8BFD8", - "tomato" => "FF6347", - "turquoise" => "40E0D0", - "violet" => "EE82EE", - "wheat" => "F5DEB3", - "white" => "FFFFFF", - "whitesmoke" => "F5F5F5", - "yellow" => "FFFF00", - "yellowgreen" => "9ACD32", - ]; - - /** - * @param $color - * @return array|mixed|null|string - */ - static function parse($color) - { - if ($color === null) { - return null; - } - - if (is_array($color)) { - // Assume the array has the right format... - // FIXME: should/could verify this. - return $color; - } - - static $cache = []; - - $color = strtolower($color); - - if (isset($cache[$color])) { - return $cache[$color]; - } - - if (in_array($color, ["transparent", "inherit"])) { - return $cache[$color] = $color; - } - - if (isset(self::$cssColorNames[$color])) { - return $cache[$color] = self::getArray(self::$cssColorNames[$color]); - } - - $length = mb_strlen($color); - - // #rgb format - if ($length == 4 && $color[0] === "#") { - return $cache[$color] = self::getArray($color[1] . $color[1] . $color[2] . $color[2] . $color[3] . $color[3]); - } // #rgba format - else if ($length == 5 && $color[0] === "#") { - $alpha = round(hexdec($color[4] . $color[4])/255, 2); - return $cache[$color] = self::getArray($color[1] . $color[1] . $color[2] . $color[2] . $color[3] . $color[3], $alpha); - } // #rrggbb format - else if ($length == 7 && $color[0] === "#") { - return $cache[$color] = self::getArray(mb_substr($color, 1, 6)); - } // #rrggbbaa format - else if ($length == 9 && $color[0] === "#") { - $alpha = round(hexdec(mb_substr($color, 7, 2))/255, 2); - return $cache[$color] = self::getArray(mb_substr($color, 1, 6), $alpha); - } // rgb( r,g,b ) / rgba( r,g,b,α ) format - else if (mb_strpos($color, "rgb") !== false) { - $i = mb_strpos($color, "("); - $j = mb_strpos($color, ")"); - - // Bad color value - if ($i === false || $j === false) { - return null; - } - - $triplet = explode(",", mb_substr($color, $i + 1, $j - $i - 1)); - - // alpha transparency - // FIXME: not currently using transparency - $alpha = 1.0; - if (count($triplet) == 4) { - $alpha = (trim(array_pop($triplet))); - if (Helpers::is_percent($alpha)) { - $alpha = round((float)$alpha / 100, 2); - } - $alpha = (float)$alpha; - // bad value, set to fully opaque - if ($alpha > 1.0 || $alpha < 0.0) { - $alpha = 1.0; - } - } - - if (count($triplet) != 3) { - return null; - } - - foreach (array_keys($triplet) as $c) { - $triplet[$c] = trim($triplet[$c]); - - if (Helpers::is_percent($triplet[$c])) { - $triplet[$c] = round((float)$triplet[$c] * 2.55); - } - } - - return $cache[$color] = self::getArray(vsprintf("%02X%02X%02X", $triplet), $alpha); - - } - - // cmyk( c,m,y,k ) format - // http://www.w3.org/TR/css3-gcpm/#cmyk-colors - else if (mb_strpos($color, "cmyk") !== false) { - $i = mb_strpos($color, "("); - $j = mb_strpos($color, ")"); - - // Bad color value - if ($i === false || $j === false) { - return null; - } - - $values = explode(",", mb_substr($color, $i + 1, $j - $i - 1)); - - if (count($values) != 4) { - return null; - } - - $values = array_map(function($c) { - return min(1.0, max(0.0, floatval(trim($c)))); - }, $values); - - return $cache[$color] = self::getArray($values); - } - - return self::getArray($color); - } - - /** - * @param $color - * @param float $alpha - * @return array - */ - static function getArray($color, $alpha = 1.0) - { - $c = [null, null, null, null, "alpha" => $alpha, "hex" => null]; - - if (is_array($color)) { - $c = $color; - $c["c"] = $c[0]; - $c["m"] = $c[1]; - $c["y"] = $c[2]; - $c["k"] = $c[3]; - $c["alpha"] = $alpha; - $c["hex"] = "cmyk($c[0],$c[1],$c[2],$c[3])"; - } else { - if (ctype_xdigit($color) === false || mb_strlen($color) !== 6) { - // invalid color value ... expected 6-character hex - return $c; - } - $c[0] = hexdec(mb_substr($color, 0, 2)) / 0xff; - $c[1] = hexdec(mb_substr($color, 2, 2)) / 0xff; - $c[2] = hexdec(mb_substr($color, 4, 2)) / 0xff; - $c["r"] = $c[0]; - $c["g"] = $c[1]; - $c["b"] = $c[2]; - $c["alpha"] = $alpha; - $c["hex"] = sprintf("#%s%02X", $color, round($alpha * 255)); - } - - return $c; - } -} diff --git a/vendor/dompdf/dompdf/src/Css/Style.php b/vendor/dompdf/dompdf/src/Css/Style.php deleted file mode 100644 index e2fc6c1..0000000 --- a/vendor/dompdf/dompdf/src/Css/Style.php +++ /dev/null @@ -1,3372 +0,0 @@ - - * @author Helmut Tischer - * @author Fabien Ménager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Css; - -use Dompdf\Adapter\CPDF; -use Dompdf\Exception; -use Dompdf\FontMetrics; -use Dompdf\Frame; -use Dompdf\Helpers; - -/** - * Represents CSS properties. - * - * The Style class is responsible for handling and storing CSS properties. - * It includes methods to resolve colors and lengths, as well as getters & - * setters for many CSS properites. - * - * Actual CSS parsing is performed in the {@link Stylesheet} class. - * - * @package dompdf - */ -class Style -{ - - const CSS_IDENTIFIER = "-?[_a-zA-Z]+[_a-zA-Z0-9-]*"; - const CSS_INTEGER = "-?\d+"; - - /** - * Default font size, in points. - * - * @var float - */ - static $default_font_size = 12; - - /** - * Default line height, as a fraction of the font size. - * - * @var float - */ - static $default_line_height = 1.2; - - /** - * Default "absolute" font sizes relative to the default font-size - * http://www.w3.org/TR/css3-fonts/#font-size-the-font-size-property - * @var array - */ - static $font_size_keywords = [ - "xx-small" => 0.6, // 3/5 - "x-small" => 0.75, // 3/4 - "small" => 0.889, // 8/9 - "medium" => 1, // 1 - "large" => 1.2, // 6/5 - "x-large" => 1.5, // 3/2 - "xx-large" => 2.0, // 2/1 - ]; - - /** - * List of valid text-align keywords. Should also really be a constant. - * - * @var array - */ - static $text_align_keywords = ["left", "right", "center", "justify"]; - - /** - * List of valid vertical-align keywords. Should also really be a constant. - * - * @var array - */ - static $vertical_align_keywords = ["baseline", "bottom", "middle", "sub", - "super", "text-bottom", "text-top", "top"]; - - /** - * List of all inline types. Should really be a constant. - * - * @var array - */ - static $INLINE_TYPES = ["inline"]; - - /** - * List of all block types. Should really be a constant. - * - * @var array - */ - static $BLOCK_TYPES = ["block", "inline-block", "table-cell", "list-item"]; - - /** - * List of all positionned types. Should really be a constant. - * - * @var array - */ - static $POSITIONNED_TYPES = ["relative", "absolute", "fixed"]; - - /** - * List of all table types. Should really be a constant. - * - * @var array; - */ - static $TABLE_TYPES = ["table", "inline-table"]; - - /** - * List of valid border styles. Should also really be a constant. - * - * @var array - */ - static $BORDER_STYLES = ["none", "hidden", "dotted", "dashed", "solid", - "double", "groove", "ridge", "inset", "outset"]; - - /** - * List of CSS shorthand properties - * - * @var array - */ - protected static $_props_shorthand = ["background", "border", - "border_bottom", "border_color", "border_left", "border_radius", - "border_right", "border_style", "border_top", "border_width", - "flex", "font", "list_style", "margin", "padding"]; - - /** - * Default style values. - * - * @link http://www.w3.org/TR/CSS21/propidx.html - * - * @var array - */ - protected static $_defaults = null; - - /** - * List of inherited properties - * - * @link http://www.w3.org/TR/CSS21/propidx.html - * - * @var array - */ - protected static $_inherited = null; - - /** - * Caches method_exists result - * - * @var array - */ - protected static $_methods_cache = []; - - /** - * The stylesheet this style belongs to - * - * @see Stylesheet - * @var Stylesheet - */ - protected $_stylesheet; // stylesheet this style is attached to - - /** - * Media queries attached to the style - * - * @var int - */ - protected $_media_queries; - - /** - * Main array of all CSS properties & values - * - * @var array - */ - protected $_props = []; - - /* var instead of protected would allow access outside of class */ - protected $_important_props = []; - - /** - * The computed values of the CSS property - * - * @var array - */ - protected $_props_computed = []; - - protected static $_dependency_map = [ - "border_top_style" => [ - "border_top_width" - ], - "border_bottom_style" => [ - "border_bottom_width" - ], - "border_left_style" => [ - "border_left_width" - ], - "border_right_style" => [ - "border_right_width" - ], - "direction" => [ - "text_align" - ], - "font_size" => [ - "background_position", - "background_size", - "border_top_width", - "border_right_width", - "border_bottom_width", - "border_left_width", - "line_height", - "margin_top", - "margin_right", - "margin_bottom", - "margin_left", - "outline_width", - "padding_top", - "padding_right", - "padding_bottom", - "padding_left" - ] - ]; - - /** - * The used values of the CSS property - * - * @var array - */ - protected $_prop_cache = []; - - /** - * Font size of parent element in document tree. Used for relative font - * size resolution. - * - * @var float - */ - protected $_parent_font_size; - - /** - * @var Frame - */ - protected $_frame; - - /** - * The origin of the style - * - * @var int - */ - protected $_origin = Stylesheet::ORIG_AUTHOR; - - // private members - /** - * The computed bottom spacing - */ - private $_computed_bottom_spacing = null; - - /** - * The computed border radius - */ - private $_computed_border_radius = null; - - /** - * @var bool - */ - public $_has_border_radius = false; - - /** - * @var FontMetrics - */ - private $fontMetrics; - - /** - * Class constructor - * - * @param Stylesheet $stylesheet the stylesheet this Style is associated with. - * @param int $origin - */ - public function __construct(Stylesheet $stylesheet, $origin = Stylesheet::ORIG_AUTHOR) - { - $this->setFontMetrics($stylesheet->getFontMetrics()); - - $this->_props = []; - $this->_important_props = []; - $this->_stylesheet = $stylesheet; - $this->_media_queries = []; - $this->_origin = $origin; - $this->_parent_font_size = null; - - if (!isset(self::$_defaults)) { - - // Shorthand - $d =& self::$_defaults; - - // All CSS 2.1 properties, and their default values - $d["azimuth"] = "center"; - $d["background_attachment"] = "scroll"; - $d["background_color"] = "transparent"; - $d["background_image"] = "none"; - $d["background_image_resolution"] = "normal"; - $d["background_position"] = "0% 0%"; - $d["background_repeat"] = "repeat"; - $d["background"] = ""; - $d["border_collapse"] = "separate"; - $d["border_color"] = ""; - $d["border_spacing"] = "0"; - $d["border_style"] = ""; - $d["border_top"] = ""; - $d["border_right"] = ""; - $d["border_bottom"] = ""; - $d["border_left"] = ""; - $d["border_top_color"] = ""; - $d["border_right_color"] = ""; - $d["border_bottom_color"] = ""; - $d["border_left_color"] = ""; - $d["border_top_style"] = "none"; - $d["border_right_style"] = "none"; - $d["border_bottom_style"] = "none"; - $d["border_left_style"] = "none"; - $d["border_top_width"] = "medium"; - $d["border_right_width"] = "medium"; - $d["border_bottom_width"] = "medium"; - $d["border_left_width"] = "medium"; - $d["border_width"] = "medium"; - $d["border_bottom_left_radius"] = ""; - $d["border_bottom_right_radius"] = ""; - $d["border_top_left_radius"] = ""; - $d["border_top_right_radius"] = ""; - $d["border_radius"] = ""; - $d["border"] = ""; - $d["bottom"] = "auto"; - $d["caption_side"] = "top"; - $d["clear"] = "none"; - $d["clip"] = "auto"; - $d["color"] = "#000000"; - $d["content"] = "normal"; - $d["counter_increment"] = "none"; - $d["counter_reset"] = "none"; - $d["cue_after"] = "none"; - $d["cue_before"] = "none"; - $d["cue"] = ""; - $d["cursor"] = "auto"; - $d["direction"] = "ltr"; - $d["display"] = "inline"; - $d["elevation"] = "level"; - $d["empty_cells"] = "show"; - $d["float"] = "none"; - $d["font_family"] = $stylesheet->get_dompdf()->getOptions()->getDefaultFont(); - $d["font_size"] = "medium"; - $d["font_style"] = "normal"; - $d["font_variant"] = "normal"; - $d["font_weight"] = "normal"; - $d["font"] = ""; - $d["height"] = "auto"; - $d["image_resolution"] = "normal"; - $d["left"] = "auto"; - $d["letter_spacing"] = "normal"; - $d["line_height"] = "normal"; - $d["list_style_image"] = "none"; - $d["list_style_position"] = "outside"; - $d["list_style_type"] = "disc"; - $d["list_style"] = ""; - $d["margin_right"] = "0"; - $d["margin_left"] = "0"; - $d["margin_top"] = "0"; - $d["margin_bottom"] = "0"; - $d["margin"] = ""; - $d["max_height"] = "none"; - $d["max_width"] = "none"; - $d["min_height"] = "0"; - $d["min_width"] = "0"; - $d["orphans"] = "2"; - $d["outline_color"] = ""; // "invert" special color is not supported - $d["outline_style"] = "none"; - $d["outline_width"] = "medium"; - $d["outline"] = ""; - $d["overflow"] = "visible"; - $d["padding_top"] = "0"; - $d["padding_right"] = "0"; - $d["padding_bottom"] = "0"; - $d["padding_left"] = "0"; - $d["padding"] = ""; - $d["page_break_after"] = "auto"; - $d["page_break_before"] = "auto"; - $d["page_break_inside"] = "auto"; - $d["pause_after"] = "0"; - $d["pause_before"] = "0"; - $d["pause"] = ""; - $d["pitch_range"] = "50"; - $d["pitch"] = "medium"; - $d["play_during"] = "auto"; - $d["position"] = "static"; - $d["quotes"] = ""; - $d["richness"] = "50"; - $d["right"] = "auto"; - $d["size"] = "auto"; // @page - $d["speak_header"] = "once"; - $d["speak_numeral"] = "continuous"; - $d["speak_punctuation"] = "none"; - $d["speak"] = "normal"; - $d["speech_rate"] = "medium"; - $d["stress"] = "50"; - $d["table_layout"] = "auto"; - $d["text_align"] = ""; - $d["text_decoration"] = "none"; - $d["text_indent"] = "0"; - $d["text_transform"] = "none"; - $d["top"] = "auto"; - $d["unicode_bidi"] = "normal"; - $d["vertical_align"] = "baseline"; - $d["visibility"] = "visible"; - $d["voice_family"] = ""; - $d["volume"] = "medium"; - $d["white_space"] = "normal"; - $d["word_wrap"] = "normal"; - $d["widows"] = "2"; - $d["width"] = "auto"; - $d["word_spacing"] = "normal"; - $d["z_index"] = "auto"; - - // CSS3 - $d["opacity"] = "1.0"; - $d["background_size"] = "auto auto"; - $d["transform"] = "none"; - $d["transform_origin"] = "50% 50%"; - - // for @font-face - $d["src"] = ""; - $d["unicode_range"] = ""; - - // vendor-previxed properties - $d["_dompdf_background_image_resolution"] = &$d["background_image_resolution"]; - $d["_dompdf_image_resolution"] = &$d["image_resolution"]; - $d["_dompdf_keep"] = ""; - $d["_webkit_transform"] = &$d["transform"]; - $d["_webkit_transform_origin"] = &$d["transform_origin"]; - - // Properties that inherit by default - self::$_inherited = [ - "azimuth", - "background_image_resolution", - "border_collapse", - "border_spacing", - "caption_side", - "color", - "cursor", - "direction", - "elevation", - "empty_cells", - "font_family", - "font_size", - "font_style", - "font_variant", - "font_weight", - "font", - "image_resolution", - "letter_spacing", - "line_height", - "list_style_image", - "list_style_position", - "list_style_type", - "list_style", - "orphans", - "page_break_inside", - "pitch_range", - "pitch", - "quotes", - "richness", - "speak_header", - "speak_numeral", - "speak_punctuation", - "speak", - "speech_rate", - "stress", - "text_align", - "text_indent", - "text_transform", - "visibility", - "voice_family", - "volume", - "white_space", - "word_wrap", - "widows", - "word_spacing", - ]; - } - } - - /** - * "Destructor": forcibly free all references held by this object - */ - function dispose() - { - } - - /** - * @param $media_queries - */ - function set_media_queries($media_queries) - { - $this->_media_queries = $media_queries; - } - - /** - * @return array|int - */ - function get_media_queries() - { - return $this->_media_queries; - } - - /** - * @param Frame $frame - */ - function set_frame(Frame $frame) - { - $this->_frame = $frame; - } - - /** - * @return Frame - */ - function get_frame() - { - return $this->_frame; - } - - /** - * @param $origin - */ - function set_origin($origin) - { - $this->_origin = $origin; - } - - /** - * @return int - */ - function get_origin() - { - return $this->_origin; - } - - /** - * returns the {@link Stylesheet} this Style is associated with. - * - * @return Stylesheet - */ - function get_stylesheet() - { - return $this->_stylesheet; - } - - /** - * Converts any CSS length value into an absolute length in points. - * - * length_in_pt() takes a single length (e.g. '1em') or an array of - * lengths and returns an absolute length. If an array is passed, then - * the return value is the sum of all elements. If any of the lengths - * provided are "auto" or "none" then that value is returned. - * - * If a reference size is not provided, the default font size is used - * ({@link Style::$default_font_size}). - * - * @param float|string|array $length the numeric length (or string measurement) or array of lengths to resolve - * @param float $ref_size an absolute reference size to resolve percentage lengths - * @return float|string - */ - function length_in_pt($length, $ref_size = null) - { - static $cache = []; - - if (!isset($ref_size)) { - $ref_size = $this->__get("font_size"); - } - - if (!is_array($length)) { - $key = $length . "/$ref_size"; - //Early check on cache, before converting $length to array - if (isset($cache[$key])) { - return $cache[$key]; - } - $length = [$length]; - } else { - $key = implode("@", $length) . "/$ref_size"; - if (isset($cache[$key])) { - return $cache[$key]; - } - } - - $ret = 0; - foreach ($length as $l) { - - if ($l === "auto") { - return "auto"; - } - - if ($l === "none") { - return "none"; - } - - // Assume numeric values are already in points - if (is_numeric($l)) { - $ret += $l; - continue; - } - - if ($l === "normal") { - $ret += (float)$ref_size; - continue; - } - - // Border lengths - if ($l === "thin") { - $ret += 0.5; - continue; - } - - if ($l === "medium") { - $ret += 1.5; - continue; - } - - if ($l === "thick") { - $ret += 2.5; - continue; - } - - if (($i = mb_stripos($l, "px")) !== false) { - $dpi = $this->_stylesheet->get_dompdf()->getOptions()->getDpi(); - $ret += ((float)mb_substr($l, 0, $i) * 72) / $dpi; - continue; - } - - if (($i = mb_stripos($l, "pt")) !== false) { - $ret += (float)mb_substr($l, 0, $i); - continue; - } - - if (($i = mb_stripos($l, "%")) !== false) { - $ret += (float)mb_substr($l, 0, $i) / 100 * (float)$ref_size; - continue; - } - - if (($i = mb_stripos($l, "rem")) !== false) { - if ($this->_stylesheet->get_dompdf()->getTree()->get_root()->get_style() === null) { - // Interpreting it as "em", see https://github.com/dompdf/dompdf/issues/1406 - $ret += (float)mb_substr($l, 0, $i) * $this->__get("font_size"); - } else { - $ret += (float)mb_substr($l, 0, $i) * $this->_stylesheet->get_dompdf()->getTree()->get_root()->get_style()->font_size; - } - continue; - } - - if (($i = mb_stripos($l, "em")) !== false) { - $ret += (float)mb_substr($l, 0, $i) * $this->__get("font_size"); - continue; - } - - if (($i = mb_stripos($l, "cm")) !== false) { - $ret += (float)mb_substr($l, 0, $i) * 72 / 2.54; - continue; - } - - if (($i = mb_stripos($l, "mm")) !== false) { - $ret += (float)mb_substr($l, 0, $i) * 72 / 25.4; - continue; - } - - // FIXME: em:ex ratio? - if (($i = mb_stripos($l, "ex")) !== false) { - $ret += (float)mb_substr($l, 0, $i) * $this->__get("font_size") / 2; - continue; - } - - if (($i = mb_stripos($l, "in")) !== false) { - $ret += (float)mb_substr($l, 0, $i) * 72; - continue; - } - - if (($i = mb_stripos($l, "pc")) !== false) { - $ret += (float)mb_substr($l, 0, $i) * 12; - continue; - } - - // Bogus value - $ret += (float)$ref_size; - } - - return $cache[$key] = $ret; - } - - - /** - * Set inherited properties in this style using values in $parent - * - * @param Style $parent - * - * @return Style - */ - function inherit(Style $parent) - { - // Set parent font size, changes affect font size of the element - if ($this->_parent_font_size !== $parent->font_size) { - $this->_parent_font_size = $parent->font_size; - if (isset($this->_props["font_size"])) { - $this->__set("font_size", $this->_props["font_size"]); - } - } - - foreach (self::$_inherited as $prop) { - // don't inherit shorthand properties, the specific properties will inherit - if (in_array($prop, self::$_props_shorthand) === true) { - continue; - } - - //inherit the !important property also. - //if local property is also !important, don't inherit. - - if (isset($parent->_props_computed[$prop]) && - ( - !isset($this->_props[$prop]) - || (isset($parent->_important_props[$prop]) && !isset($this->_important_props[$prop])) - ) - ) { - if (isset($parent->_important_props[$prop])) { - $this->_important_props[$prop] = true; - } - if (isset($parent->_props_computed[$prop])) { - $this->__set($prop, $parent->_props_computed[$prop]); - } else { - // parent prop not set, use the default - $this->__set($prop, self::$_defaults[$prop]); - } - } - } - - foreach ($this->_props as $prop => $value) { - // don't inherit shorthand properties, the specific properties will inherit - if (in_array($prop, self::$_props_shorthand) === true) { - continue; - } - if ($value === "inherit") { - if (isset($parent->_important_props[$prop])) { - $this->_important_props[$prop] = true; - } - //do not assign direct, but - //implicite assignment through __set, redirect to specialized, get value with __get - //This is for computing defaults if the parent setting is also missing. - //Therefore do not directly assign the value without __set - //set _important_props before that to be able to propagate. - //see __set and __get, on all assignments clear cache! - //$this->_prop_cache[$prop] = null; - //$this->_props[$prop] = $parent->_props[$prop]; - //props_set for more obvious explicite assignment not implemented, because - //too many implicite uses. - // $this->props_set($prop, $parent->$prop); - if (isset($parent->_props_computed[$prop])) { - $this->__set($prop, $parent->_props_computed[$prop]); - } else { - // parent prop not set, use the default - $this->__set($prop, self::$_defaults[$prop]); - } - // set the specified prop back to "inherit" - $this->_props[$prop] = "inherit"; - } - } - - return $this; - } - - /** - * Override properties in this style with those in $style - * - * @param Style $style - */ - function merge(Style $style) - { - //treat the !important attribute - //if old rule has !important attribute, override with new rule only if - //the new rule is also !important - foreach ($style->_props as $prop => $val) { - $can_merge = false; - if (isset($style->_important_props[$prop])) { - $this->_important_props[$prop] = true; - $can_merge = true; - } else if (isset($val) && !isset($this->_important_props[$prop])) { - $can_merge = true; - } - - if ($can_merge) { - // Clear out "inherit" shorthand properties if a more specific property value has been set - $shorthands = array_filter(self::$_props_shorthand, function ($el) use ($prop) { - return (strpos($prop, $el . "_") !== false); - }); - foreach ($shorthands as $shorthand) { - if (array_key_exists($shorthand, $this->_props) && $this->_props[$shorthand] === "inherit") { - unset($this->_props[$shorthand]); - unset($this->_props_computed[$shorthand]); - unset($this->_prop_cache[$shorthand]); - } - } - $this->__set($prop, $val); - } - } - } - - /** - * Returns an array(r, g, b, "r"=> r, "g"=>g, "b"=>b, "hex"=>"#rrggbb") - * based on the provided CSS color value. - * - * @param string $color - * @return array - */ - function munge_color($color) - { - return Color::parse($color); - } - - /* direct access to _important_props array from outside would work only when declared as - * 'var $_important_props;' instead of 'protected $_important_props;' - * Don't call _set/__get on missing attribute. Therefore need a special access. - * Assume that __set will be also called when this is called, so do not check validity again. - * Only created, if !important exists -> always set true. - */ - function important_set($prop) - { - $prop = str_replace("-", "_", $prop); - $this->_important_props[$prop] = true; - } - - /** - * @param $prop - * @return bool - */ - function important_get($prop) - { - return isset($this->_important_props[$prop]); - } - - /** - * PHP5 overloaded setter - * - * This function along with {@link Style::__get()} permit a user of the - * Style class to access any (CSS) property using the following syntax: - * - * Style->margin_top = "1em"; - * echo (Style->margin_top); - * - * - * __set() automatically calls the provided set function, if one exists, - * otherwise it sets the property directly. Typically, __set() is not - * called directly from outside of this class. - * - * On each modification clear cache to return accurate setting. - * Also affects direct settings not using __set - * For easier finding all assignments, attempted to allowing only explicite assignment: - * Very many uses, e.g. AbstractFrameReflower.php -> for now leave as it is - * function __set($prop, $val) { - * throw new Exception("Implicit replacement of assignment by __set. Not good."); - * } - * function props_set($prop, $val) { ... } - * - * @param string $prop the property to set - * @param mixed $val the value of the property - * - */ - function __set($prop, $val) - { - $prop = str_replace("-", "_", $prop); - - if (!isset(self::$_defaults[$prop])) { - global $_dompdf_warnings; - $_dompdf_warnings[] = "'$prop' is not a recognized CSS property."; - return; - } - - if ($prop !== "content" && is_string($val) && strlen($val) > 5 && mb_strpos($val, "url") === false) { - $val = mb_strtolower(trim(str_replace(["\n", "\t"], [" "], $val))); - $val = preg_replace("/([0-9]+) (pt|px|pc|em|ex|in|cm|mm|%)/S", "\\1\\2", $val); - } - - $this->_props[$prop] = $val; - $this->_props_computed[$prop] = null; - $this->_prop_cache[$prop] = null; - - $method = "set_$prop"; - - if (!isset(self::$_methods_cache[$method])) { - self::$_methods_cache[$method] = method_exists($this, $method); - } - - if (self::$_methods_cache[$method]) { - $this->$method($val); - } - if (isset($this->_props_computed[$prop]) === false && isset($val) && $val !== '' && $val !== 'inherit') { - $this->_props_computed[$prop] = $val; - } - - if (isset($this->_props_computed[$prop])) { - //FIXME: need to catch for circular dependencies because oops - if (array_key_exists($prop, self::$_dependency_map)) { - foreach (self::$_dependency_map[$prop] as $dependent) { - if (isset($this->_props[$dependent]) === true) { - $this->__set($dependent, $this->_props[$dependent]); - } - } - } - } - } - - /** - * PHP5 overloaded getter - * Along with {@link Style::__set()} __get() provides access to all CSS - * properties directly. Typically __get() is not called directly outside - * of this class. - * On each modification clear cache to return accurate setting. - * Also affects direct settings not using __set - * - * @param string $prop - * - * @return mixed - * @throws Exception - */ - function __get($prop) - { - //FIXME: need to get shorthand from component properties - if (!isset(self::$_defaults[$prop])) { - throw new Exception("'$prop' is not a recognized CSS property."); - } - - if (isset($this->_prop_cache[$prop])) { - return $this->_prop_cache[$prop]; - } - - $method = "get_$prop"; - - $retval = null; - - // Preview the value based on the default if the property is not cached - // and the computed value has not yet been set. - $reset_value = false; - $specified_value = null; - $computed_value = null; - if (!isset($this->_prop_cache[$prop]) && !isset($this->_props_computed[$prop])) { - $reset_value = true; - if (isset($this->_props[$prop])) { - $specified_value = $this->_props[$prop]; - } - if (isset($this->_props_computed[$prop])) { - $computed_value = $this->_props_computed[$prop]; - } - if (empty($this->_props[$prop]) || $this->_props[$prop] === "inherit") { - $this->__set($prop, self::$_defaults[$prop]); - } - if (empty($this->_props_computed[$prop])) { - // computed value should be set if the property is set, we'll recalculate it - $this->__set($prop, $this->_props[$prop]); - } - } - - if (!isset(self::$_methods_cache[$method])) { - self::$_methods_cache[$method] = method_exists($this, $method); - } - - if (self::$_methods_cache[$method]) { - $retval = $this->_prop_cache[$prop] = $this->$method(); - } - - if (!isset($retval)) { - $retval = $this->_prop_cache[$prop] = $this->_props_computed[$prop]; - } - - // When previewing the value reset the specified and computed properties - // so that we don't interfere with inheritance. - if ($reset_value) { - $this->_props[$prop] = $specified_value; - $this->_props_computed[$prop] = $computed_value; - } - - return $retval; - } - - /** - * Sets the property value without calculating the computed value - * - * @param $prop - * @param $val - */ - function set_prop($prop, $val) - { - $prop = str_replace("-", "_", $prop); - - if (!isset(self::$_defaults[$prop])) { - global $_dompdf_warnings; - $_dompdf_warnings[] = "'$prop' is not a recognized CSS property."; - return; - } - - if ($prop !== "content" && is_string($val) && strlen($val) > 5 && mb_strpos($val, "url") === false) { - $val = mb_strtolower(trim(str_replace(["\n", "\t"], [" "], $val))); - $val = preg_replace("/([0-9]+) (pt|px|pc|em|ex|in|cm|mm|%)/S", "\\1\\2", $val); - } - - $this->_props[$prop] = $val; - $this->_props_computed[$prop] = null; - $this->_prop_cache[$prop] = null; - - //FIXME: this doesn't work for shorthand properties - } - - /** - * Similar to __get() without storing the result. Useful for accessing - * properties while loading stylesheets. - * - * @param $prop - * @return string - * @throws Exception - */ - function get_prop($prop) - { - if (!isset(self::$_defaults[$prop])) { - throw new Exception("'$prop' is not a recognized CSS property."); - } - - $method = "get_$prop"; - - // Fall back on defaults if property is not set - if (!isset($this->_props_computed[$prop])) { - return self::$_defaults[$prop]; - } - - if (method_exists($this, $method)) { - return $this->$method(); - } - - return $this->_props[$prop]; - } - - /** - * Calculates the computed value of the CSS properties that have been set (the specified properties) - */ - function compute_props() - { - foreach ($this->_props as $prop => $val) { - if (in_array($prop, self::$_props_shorthand) === false) { - $this->__set($prop, $val); - } - } - } - - /** - * @return float|null|string - */ - function computed_bottom_spacing() - { - if ($this->_computed_bottom_spacing !== null) { - return $this->_computed_bottom_spacing; - } - return $this->_computed_bottom_spacing = $this->length_in_pt( - [ - $this->margin_bottom, - $this->padding_bottom, - $this->border_bottom_width - ] - ); - } - - /** - * @return string - */ - function get_font_family_raw() - { - return trim($this->_props["font_family"], " \t\n\r\x0B\"'"); - } - - /** - * Getter for the 'font-family' CSS property. - * Uses the {@link FontMetrics} class to resolve the font family into an - * actual font file. - * - * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-family - * @throws Exception - * - * @return string - */ - function get_font_family() - { - //TODO: we should be using the calculated prop rather than perform the entire family parsing operation again - - $DEBUGCSS = $this->_stylesheet->get_dompdf()->getOptions()->getDebugCss(); - - // Select the appropriate font. First determine the subtype, then check - // the specified font-families for a candidate. - - // Resolve font-weight - $weight = $this->__get("font_weight"); - if ($weight === 'bold') { - $weight = 700; - } elseif (preg_match('/^[0-9]+$/', $weight, $match)) { - $weight = (int)$match[0]; - } else { - $weight = 400; - } - - // Resolve font-style - $font_style = $this->__get("font_style"); - $subtype = $this->getFontMetrics()->getType($weight . ' ' . $font_style); - - $families = preg_split("/\s*,\s*/", $this->_props_computed["font_family"]); - - $font = null; - foreach ($families as $family) { - //remove leading and trailing string delimiters, e.g. on font names with spaces; - //remove leading and trailing whitespace - $family = trim($family, " \t\n\r\x0B\"'"); - if ($DEBUGCSS) { - print '(' . $family . ')'; - } - $font = $this->getFontMetrics()->getFont($family, $subtype); - - if ($font) { - if ($DEBUGCSS) { - print "
[get_font_family:";
-                    print '(' . $this->_props_computed["font_family"] . '.' . $font_style . '.' . $weight . '.' . $subtype . ')';
-                    print '(' . $font . ")get_font_family]\n
"; - } - return $font; - } - } - - $family = null; - if ($DEBUGCSS) { - print '(default)'; - } - $font = $this->getFontMetrics()->getFont($family, $subtype); - - if ($font) { - if ($DEBUGCSS) { - print '(' . $font . ")get_font_family]\n
"; - } - return $font; - } - - throw new Exception("Unable to find a suitable font replacement for: '" . $this->_props_computed["font_family"] . "'"); - } - - /** - * @link http://www.w3.org/TR/CSS21/text.html#propdef-word-spacing - * @return float - */ - function get_word_spacing() - { - $word_spacing = $this->_props_computed["word_spacing"]; - - if ($word_spacing === "normal") { - return 0; - } - - if (strpos($word_spacing, "%") !== false) { - return $word_spacing; - } - - return (float)$this->length_in_pt($word_spacing, $this->__get("font_size")); - } - - /** - * @link http://www.w3.org/TR/CSS21/text.html#propdef-letter-spacing - * @return float - */ - function get_letter_spacing() - { - $letter_spacing = $this->_props_computed["letter_spacing"]; - - if ($letter_spacing === "normal") { - return 0; - } - - return (float)$this->length_in_pt($letter_spacing, $this->__get("font_size")); - } - - /** - * @link http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height - * @return float - */ - function get_line_height() - { - $line_height = $this->_props_computed["line_height"]; - - if ($line_height === "normal") { - return self::$default_line_height * $this->__get("font_size"); - } - - if (is_numeric($line_height)) { - return $line_height * $this->__get("font_size"); - } - - return (float)$this->length_in_pt($line_height, $this->__get("font_size")); - } - - /** - * Returns the color as an array - * - * The array has the following format: - * array(r,g,b, "r" => r, "g" => g, "b" => b, "hex" => "#rrggbb") - * - * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color - * @return array - */ - function get_color() - { - return $this->munge_color($this->_props_computed["color"]); - } - - /** - * Returns the background color as an array - * - * The returned array has the same format as {@link Style::get_color()} - * - * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color - * @return array - */ - function get_background_color() - { - return $this->munge_color($this->_props_computed["background_color"]); - } - - /** - * Returns the background image URI, or "none" - * - * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-image - * @return string - */ - function get_background_image() - { - return $this->_image($this->_props_computed["background_image"]); - } - - /** - * Returns the background position as an array - * - * The returned array has the following format: - * array(x,y, "x" => x, "y" => y) - * - * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-position - * @return array - */ - function get_background_position() - { - if (strpos($this->_props_computed["background_position"], " ") === false) { - $this->__set("background_position", $this->_props["background_position"]); - } - $tmp = explode(" ", $this->_props_computed["background_position"]); - - return [ - 0 => $tmp[0], "x" => $tmp[0], - 1 => $tmp[1], "y" => $tmp[1], - ]; - } - - - /** - * Returns the background size as an array - * - * The return value has one of the following formats: - * "cover" - * "contain" - * array(width,height) - * - * @link https://www.w3.org/TR/css3-background/#background-size - * @return string|array - */ - function get_background_size() - { - switch ($this->_props_computed["background_size"]) { - case "cover": - return "cover"; - case "contain": - return "contain"; - default: - break; - } - - if (strpos($this->_props_computed["background_size"], " ") === false) { - $this->__set("background_size", $this->_props["background_size"]); - } - $result = explode(" ", $this->_props_computed["background_size"]); - return [$result[0], $result[1]]; - } - - /**#@+ - * Returns the border color as an array - * - * See {@link Style::get_color()} - * - * @link http://www.w3.org/TR/CSS21/box.html#border-color-properties - * @return array - */ - function get_border_top_color() - { - return $this->munge_color($this->_props_computed["border_top_color"]); - } - - /** - * @return array - */ - function get_border_right_color() - { - return $this->munge_color($this->_props_computed["border_right_color"]); - } - - /** - * @return array - */ - function get_border_bottom_color() - { - return $this->munge_color($this->_props_computed["border_bottom_color"]); - } - - /** - * @return array - */ - function get_border_left_color() - { - return $this->munge_color($this->_props_computed["border_left_color"]); - } - - /**#@-*/ - - /** - * Return an array of all border properties. - * - * The returned array has the following structure: - * - * array("top" => array("width" => [border-width], - * "style" => [border-style], - * "color" => [border-color (array)]), - * "bottom" ... ) - * - * - * @return array - */ - function get_border_properties() - { - return [ - "top" => [ - "width" => $this->__get("border_top_width"), - "style" => $this->__get("border_top_style"), - "color" => $this->__get("border_top_color"), - ], - "bottom" => [ - "width" => $this->__get("border_bottom_width"), - "style" => $this->__get("border_bottom_style"), - "color" => $this->__get("border_bottom_color"), - ], - "right" => [ - "width" => $this->__get("border_right_width"), - "style" => $this->__get("border_right_style"), - "color" => $this->__get("border_right_color"), - ], - "left" => [ - "width" => $this->__get("border_left_width"), - "style" => $this->__get("border_left_style"), - "color" => $this->__get("border_left_color"), - ], - ]; - } - - /** - * Return a single border property - * - * @param string $side - * - * @return mixed - */ - protected function _get_border($side) - { - $color = $this->__get("border_" . $side . "_color"); - - return $this->__get("border_" . $side . "_width") . " " . - $this->__get("border_" . $side . "_style") . " " . $color["hex"]; - } - - /**#@+ - * Return full border properties as a string - * - * Border properties are returned just as specified in CSS: - *
[width] [style] [color]
- * e.g. "1px solid blue" - * - * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties - * @return string - */ - function get_border_top() - { - return $this->_get_border("top"); - } - - /** - * @return mixed - */ - function get_border_right() - { - return $this->_get_border("right"); - } - - /** - * @return mixed - */ - function get_border_bottom() - { - return $this->_get_border("bottom"); - } - - /** - * @return mixed - */ - function get_border_left() - { - return $this->_get_border("left"); - } - - private function _get_width($prop) - { - //TODO: should be handled in setter - if (strpos($this->_props_computed[$prop], "%") !== false) { - // calculate against width of containing block, needs to be done outside the style class - return $this->_props_computed[$prop]; - } - return $this->length_in_pt($this->_props_computed[$prop], $this->__get("font_size")); - } - - function get_margin_top() - { - return $this->_get_width("margin_top"); - } - - function get_margin_right() - { - return $this->_get_width("margin_right"); - } - - function get_margin_bottom() - { - return $this->_get_width("margin_bottom"); - } - - function get_margin_left() - { - return $this->_get_width("margin_left"); - } - - function get_padding_top() - { - return $this->_get_width("padding_top"); - } - - function get_padding_right() - { - return $this->_get_width("padding_right"); - } - - function get_padding_bottom() - { - return $this->_get_width("padding_bottom"); - } - - function get_padding_left() - { - return $this->_get_width("padding_left"); - } - - /** - * @param $w - * @param $h - * @return array|null - */ - function get_computed_border_radius($w, $h) - { - if (!empty($this->_computed_border_radius)) { - return $this->_computed_border_radius; - } - - $w = (float)$w; - $h = (float)$h; - $rTL = (float)$this->__get("border_top_left_radius"); - $rTR = (float)$this->__get("border_top_right_radius"); - $rBL = (float)$this->__get("border_bottom_left_radius"); - $rBR = (float)$this->__get("border_bottom_right_radius"); - - if ($rTL + $rTR + $rBL + $rBR == 0) { - return $this->_computed_border_radius = [ - 0, 0, 0, 0, - "top-left" => 0, - "top-right" => 0, - "bottom-right" => 0, - "bottom-left" => 0, - ]; - } - - $t = (float)$this->__get("border_top_width"); - $r = (float)$this->__get("border_right_width"); - $b = (float)$this->__get("border_bottom_width"); - $l = (float)$this->__get("border_left_width"); - - $rTL = min($rTL, $h - $rBL - $t / 2 - $b / 2, $w - $rTR - $l / 2 - $r / 2); - $rTR = min($rTR, $h - $rBR - $t / 2 - $b / 2, $w - $rTL - $l / 2 - $r / 2); - $rBL = min($rBL, $h - $rTL - $t / 2 - $b / 2, $w - $rBR - $l / 2 - $r / 2); - $rBR = min($rBR, $h - $rTR - $t / 2 - $b / 2, $w - $rBL - $l / 2 - $r / 2); - - return $this->_computed_border_radius = [ - $rTL, $rTR, $rBR, $rBL, - "top-left" => $rTL, - "top-right" => $rTR, - "bottom-right" => $rBR, - "bottom-left" => $rBL, - ]; - } - - /** - * Returns the outline color as an array - * - * See {@link Style::get_color()} - * - * @link http://www.w3.org/TR/CSS21/box.html#border-color-properties - * @return array - */ - function get_outline_color() - { - return $this->munge_color($this->_props_computed["outline_color"]); - } - - /**#@+ - * Returns the outline width, as it is currently stored - * @return float|string - */ - function get_outline_width() - { - $style = $this->__get("outline_style"); - return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props_computed["outline_width"]) : 0; - } - - /**#@+ - * Return full outline properties as a string - * - * Outline properties are returned just as specified in CSS: - *
[width] [style] [color]
- * e.g. "1px solid blue" - * - * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties - * @return string - */ - function get_outline() - { - $color = $this->__get("outline_color"); - return - $this->__get("outline_width") . " " . - $this->__get("outline_style") . " " . - $color["hex"]; - } - /**#@-*/ - - /** - * Returns border spacing as an array - * - * The array has the format (h_space,v_space) - * - * @link http://www.w3.org/TR/CSS21/tables.html#propdef-border-spacing - * @return array - */ - function get_border_spacing() - { - $arr = explode(" ", $this->_props_computed["border_spacing"]); - if (count($arr) == 1) { - $arr[1] = $arr[0]; - } - return $arr; - } - - /** - * Returns the list style image URI, or "none" - * - * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style-image - * @return string - */ - function get_list_style_image() - { - return $this->_image($this->_props_computed["list_style_image"]); - } - - /** - * @param $val - */ - function get_counter_increment() - { - $val = trim($this->_props_computed["counter_increment"]); - $value = null; - - if (in_array($val, ["none", "inherit"])) { - $value = $val; - } else { - if (preg_match_all("/(" . self::CSS_IDENTIFIER . ")(?:\s+(" . self::CSS_INTEGER . "))?/", $val, $matches, PREG_SET_ORDER)) { - $value = []; - foreach ($matches as $match) { - $value[$match[1]] = isset($match[2]) ? $match[2] : 1; - } - } - } - return $value; - } - - - /*==============================*/ - - /* - !important attribute - For basic functionality of the !important attribute with overloading - of several styles of an element, changes in inherit(), merge() and _parse_properties() - are sufficient [helpers var $_important_props, __construct(), important_set(), important_get()] - - Only for combined attributes extra treatment needed. See below. - - div { border: 1px red; } - div { border: solid; } // Not combined! Only one occurrence of same style per context - // - div { border: 1px red; } - div a { border: solid; } // Adding to border style ok by inheritance - // - div { border-style: solid; } // Adding to border style ok because of different styles - div { border: 1px red; } - // - div { border-style: solid; !important} // border: overrides, even though not !important - div { border: 1px dashed red; } - // - div { border: 1px red; !important } - div a { border-style: solid; } // Need to override because not set - - Special treatment: - At individual property like border-top-width need to check whether overriding value is also !important. - Also store the !important condition for later overrides. - Since not known who is initiating the override, need to get passed !important as parameter. - !important Parameter taken as in the original style in the css file. - When property border !important given, do not mark subsets like border_style as important. Only - individual properties. - - Note: - Setting individual property directly from css with e.g. set_border_top_style() is not needed, because - missing set functions handled by a generic handler __set(), including the !important. - Setting individual property of as sub-property is handled below. - - Implementation see at _set_style_side_type() - Callers _set_style_sides_type(), _set_style_type, _set_style_type_important() - - Related functionality for background, padding, margin, font, list_style - */ - - /** - * Generalized set function for individual attribute of combined style. - * With check for !important - * Applicable for background, border, padding, margin, font, list_style - * - * Note: $type has a leading underscore (or is empty), the others not. - * - * @param $style - * @param $side - * @param $type - * @param $val - * @param $important - */ - protected function _set_style_side_type($style, $side, $type, $val, $important) - { - $prop = $style; - if (!empty($side)) { - $prop .= "_" . $side; - }; - if (!empty($type)) { - $prop .= "_" . $type; - }; - $this->_props[$prop] = $val; - $this->_prop_cache[$prop] = null; - - if ($val === "inherit") { - $this->_props_computed[$prop] = null; - return; - } - - if (!isset($this->_important_props[$prop]) || $important) { - $val_computed = (float)$this->length_in_pt($val); - if ($side === "bottom") { - $this->_computed_bottom_spacing = null; //reset computed cache, border style can disable/enable border calculations - } - if ($important) { - $this->_important_props[$prop] = true; - } - - if ($val_computed < 0 && ($style === "border" || $style === "padding" || $style === "outline")) { - $this->_props[$prop] = null; // passed-in value is invalid - } else if ( - (($style === "border" || $style === "outline") && $type === "width" && strpos($val, "%") !== false) - || - (($style === "margin" || $style === "padding") && (strpos($val, "%") !== false || $val === "auto")) - ) { - $this->_props_computed[$prop] = $val; - } elseif (($style === "border" || $style === "outline") && $type === "width" && strpos($val, "%") === false) { - $line_style_prop = $style; - if (!empty($side)) { - $line_style_prop .= "_" . $side; - }; - $line_style_prop .= "_style"; - $line_style = $this->__get($line_style_prop); - $this->_props_computed[$prop] = ($line_style !== "none" && $line_style !== "hidden" ? $val_computed : 0); - } elseif (($style === "margin" || $style === "padding")) { - $this->_props_computed[$prop] = ($val !== "none" && $val !== "hidden" ? $val_computed : 0); - } elseif ($type === "color") { - $this->set_prop_color($prop, $val); - } elseif (!empty($val)) { - $this->_props_computed[$prop] = $val; - } - } - } - - /** - * @param $style - * @param $top - * @param $right - * @param $bottom - * @param $left - * @param $type - * @param $important - */ - protected function _set_style_sides_type($style, $top, $right, $bottom, $left, $type, $important) - { - $this->_set_style_side_type($style, 'top', $type, $top, $important); - $this->_set_style_side_type($style, 'right', $type, $right, $important); - $this->_set_style_side_type($style, 'bottom', $type, $bottom, $important); - $this->_set_style_side_type($style, 'left', $type, $left, $important); - } - - /** - * @param $style - * @param $type - * @param $val - * @param $important - */ - protected function _set_style_type($style, $type, $val, $important) - { - $val = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces - $arr = explode(" ", $val); - - switch (count($arr)) { - case 1: - $this->_set_style_sides_type($style, $arr[0], $arr[0], $arr[0], $arr[0], $type, $important); - break; - case 2: - $this->_set_style_sides_type($style, $arr[0], $arr[1], $arr[0], $arr[1], $type, $important); - break; - case 3: - $this->_set_style_sides_type($style, $arr[0], $arr[1], $arr[2], $arr[1], $type, $important); - break; - case 4: - $this->_set_style_sides_type($style, $arr[0], $arr[1], $arr[2], $arr[3], $type, $important); - break; - } - } - - /** - * @param $style - * @param $type - * @param $val - */ - protected function _set_style_type_important($style, $type, $val) - { - $this->_set_style_type($style, $type, $val, isset($this->_important_props[$style . $type])); - } - - /** - * Anyway only called if _important matches and is assigned - * E.g. _set_style_side_type($style,$side,'',str_replace("none", "0px", $val),isset($this->_important_props[$style.'_'.$side])); - * - * @param $style - * @param $side - * @param $val - */ - protected function _set_style_side_width_important($style, $side, $val) - { - $this->_set_style_side_type($style, $side, "", $val, isset($this->_important_props[$style . $side])); - } - - /** - * @param $style - * @param $val - * @param $important - */ - protected function _set_style($style, $val, $important) - { - if (!isset($this->_important_props[$style]) || $important) { - if ($important) { - $this->_important_props[$style] = true; - } - $this->__set($style, $val); - } - } - - /** - * @param $val - * @return string - */ - protected function _image($val) - { - $DEBUGCSS = $this->_stylesheet->get_dompdf()->getOptions()->getDebugCss(); - $parsed_url = "none"; - - if (empty($val) || $val === "none") { - $path = "none"; - } else if (mb_strpos($val, "url") === false) { - $path = "none"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none - } else { - $val = preg_replace("/url\(\s*['\"]?([^'\")]+)['\"]?\s*\)/", "\\1", trim($val)); - - // Resolve the url now in the context of the current stylesheet - $parsed_url = Helpers::explode_url($val); - $path = Helpers::build_url($this->_stylesheet->get_protocol(), - $this->_stylesheet->get_host(), - $this->_stylesheet->get_base_path(), - $val); - if ($parsed_url["protocol"] == "" && $this->_stylesheet->get_protocol() == "") { - $path = realpath($path); - // If realpath returns FALSE then specifically state that there is no background image - if (!$path) { - $path = 'none'; - } - } - } - if ($DEBUGCSS) { - print "
[_image\n";
-            print_r($parsed_url);
-            print $this->_stylesheet->get_protocol() . "\n" . $this->_stylesheet->get_base_path() . "\n" . $path . "\n";
-            print "_image]
";; - } - return $path; - } - - /*======================*/ - - protected function set_prop_color($prop, $color) - { - $munged_color = $this->munge_color($color); - - if (is_null($munged_color)) { - return; - } - - $this->_props[$prop] = $color; - $this->_props_computed[$prop] = null; - $this->_prop_cache[$prop] = null; - - $this->_props_computed[$prop] = (is_array($munged_color) ? $munged_color["hex"] : $munged_color); - } - - /** - * Sets color - * - * The color parameter can be any valid CSS color value - * - * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color - * @param string $color - */ - function set_color($color) - { - $this->set_prop_color("color", $color); - } - - /** - * Sets the background color - * - * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color - * @param string $color - */ - function set_background_color($color) - { - $this->set_prop_color("background_color", $color); - } - - /** - * Set the background image url - * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-image - * - * @param string $val - */ - function set_background_image($val) - { - $this->_props["background_image"] = $val; - $this->_props_computed["background_image"] = "url(" . $this->_image($val) . ")"; - $this->_prop_cache["background_image"] = null; - } - - /** - * Sets the background repeat - * - * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-repeat - * @param string $val - */ - function set_background_repeat($val) - { - $this->_props["background_repeat"] = $val; - $this->_props_computed["background_repeat"] = null; - $this->_prop_cache["background_repeat"] = null; - - if ($val === 'inherit') { - return; - } - - $this->_props_computed["background_repeat"] = $val; - } - - /** - * Sets the background attachment - * - * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-attachment - * @param string $val - */ - function set_background_attachment($val) - { - $this->_props["background_attachment"] = $val; - $this->_props_computed["background_attachment"] = null; - $this->_prop_cache["background_attachment"] = null; - - if ($val === 'inherit') { - return; - } - - $this->_props_computed["background_attachment"] = $val; - } - - /** - * Sets the background position - * - * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-position - * @param string $val - */ - function set_background_position($val) - { - $this->_props["background_position"] = $val; - - $tmp = explode(" ", $val); - - switch ($tmp[0]) { - case "left": - $x = "0%"; - break; - - case "right": - $x = "100%"; - break; - - case "top": - $y = "0%"; - break; - - case "bottom": - $y = "100%"; - break; - - case "center": - $x = "50%"; - $y = "50%"; - break; - - default: - $x = $tmp[0]; - break; - } - - if (isset($tmp[1])) { - switch ($tmp[1]) { - case "left": - $x = "0%"; - break; - - case "right": - $x = "100%"; - break; - - case "top": - $y = "0%"; - break; - - case "bottom": - $y = "100%"; - break; - - case "center": - if ($tmp[0] === "left" || $tmp[0] === "right" || $tmp[0] === "center") { - $y = "50%"; - } else { - $x = "50%"; - } - break; - - default: - $y = $tmp[1]; - break; - } - } else { - $y = "50%"; - } - - if (!isset($x)) { - $x = "0%"; - } - - if (!isset($y)) { - $y = "0%"; - } - - $this->_props_computed["background_position"] = "$x $y"; - $this->_prop_cache["background_position"] = null; - } - - /** - * Sets the background size - * - * @link https://www.w3.org/TR/css3-background/#background-size - * @param string $val - */ - function set_background_size($val) - { - $this->_props["background_size"] = $val; - $this->_prop_cache["background_size"] = null; - - $result = explode(" ", $val); - $width = $result[0]; - - switch ($width) { - case "cover": - case "contain": - case "inherit": - $this->_props_computed["background_size"] = $width; - return; - } - - if ($width !== "auto" && strpos($width, "%") === false) { - $width = (float)$this->length_in_pt($width); - } - - $height = $result[1] ?? "auto"; - if ($height !== "auto" && strpos($height, "%") === false) { - $height = (float)$this->length_in_pt($height); - } - - $this->_props_computed["background_size"] = "$width $height"; - } - - /** - * Sets the background - combined options - * - * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background - * @param string $val - */ - function set_background($val) - { - $val = trim($val); - $important = isset($this->_important_props["background"]); - - if ($val === "none") { - $this->_set_style("background_image", "none", $important); - $this->_set_style("background_color", "transparent", $important); - } else { - $pos = []; - $tmp = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces - $tmp = preg_split("/\s+/", $tmp); - - foreach ($tmp as $attr) { - if (mb_substr($attr, 0, 3) === "url" || $attr === "none") { - $this->_set_style("background_image", $attr, $important); - } elseif ($attr === "fixed" || $attr === "scroll") { - $this->_set_style("background_attachment", $attr, $important); - } elseif ($attr === "repeat" || $attr === "repeat-x" || $attr === "repeat-y" || $attr === "no-repeat") { - $this->_set_style("background_repeat", $attr, $important); - } elseif (($col = $this->munge_color($attr)) != null) { - $this->_set_style("background_color", is_array($col) ? $col["hex"] : $col, $important); - } else { - $pos[] = $attr; - } - } - - if (count($pos)) { - $this->_set_style("background_position", implode(" ", $pos), $important); - } - } - - //see __set and __get, on all assignments clear cache, not needed on direct set through __set - $this->_props["background"] = $val; - $this->_props_computed["background"] = null; - $this->_prop_cache["background"] = null; - } - - /** - * Sets the font size - * - * $size can be any acceptable CSS size - * - * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-size - * @param string|float $size - */ - function set_font_size($size) - { - $this->_props["font_size"] = $size; - $this->_props_computed["font_size"] = null; - $this->_prop_cache["font_size"] = null; - - if ($size === "inherit") { - return; - } - if (!isset($this->_parent_font_size)) { - $this->_parent_font_size = self::$default_font_size; - } - - switch ((string)$size) { - case "xx-small": - case "x-small": - case "small": - case "medium": - case "large": - case "x-large": - case "xx-large": - $fs = self::$default_font_size * self::$font_size_keywords[$size]; - break; - - case "smaller": - $fs = 8 / 9 * $this->_parent_font_size; - break; - - case "larger": - $fs = 6 / 5 * $this->_parent_font_size; - break; - - default: - $fs = $size; - break; - } - - // length_in_pt uses the font size if units are em or ex (and, potentially, rem) so we'll calculate in the method - if (($i = mb_strpos($fs, "rem")) !== false) { - if ($this->_stylesheet->get_dompdf()->getTree()->get_root()->get_style() === null) { - // Interpreting it as "em", see https://github.com/dompdf/dompdf/issues/1406 - $fs = (float)mb_substr($fs, 0, $i) * $this->_parent_font_size; - } else { - $fs = (float)mb_substr($fs, 0, $i) * $this->_stylesheet->get_dompdf()->getTree()->get_root()->get_style()->font_size; - } - } elseif (($i = mb_strpos($fs, "em")) !== false) { - $fs = (float)mb_substr($fs, 0, $i) * $this->_parent_font_size; - } elseif (($i = mb_strpos($fs, "ex")) !== false) { - $fs = (float)mb_substr($fs, 0, $i) * $this->_parent_font_size / 2; - } else { - //FIXME: prefer just calling length_in_pt, when we provide a ref size to length_in_pt should em and ex use that instead of the current font size? - $fs = (float)$this->length_in_pt($fs, $this->_parent_font_size); - } - - $this->_props_computed["font_size"] = $fs; - } - - /** - * Sets the font weight - * - * @param string|int $weight - */ - function set_font_weight($weight) - { - $this->_props["font_weight"] = $weight; - $this->_props_computed["font_weight"] = null; - $this->_prop_cache["font_weight"] = null; - - $computed_weight = $weight; - - if ($weight === "bolder") { - //TODO: One font weight heavier than the parent element (among the available weights of the font). - $computed_weight = "bold"; - } elseif ($weight === "lighter") { - //TODO: One font weight lighter than the parent element (among the available weights of the font). - $computed_weight = "normal"; - } - - $this->_props_computed["font_weight"] = $computed_weight; - } - - /** - * Sets the font style - * - * combined attributes - * set individual attributes also, respecting !important mark - * exactly this order, separate by space. Multiple fonts separated by comma: - * font-style, font-variant, font-weight, font-size, line-height, font-family - * - * Other than with border and list, existing partial attributes should - * reset when starting here, even when not mentioned. - * If individual attribute is !important and explicit or implicit replacement is not, - * keep individual attribute - * - * require whitespace as delimiters for single value attributes - * On delimiter "/" treat first as font height, second as line height - * treat all remaining at the end of line as font - * font-style, font-variant, font-weight, font-size, line-height, font-family - * - * missing font-size and font-family might be not allowed, but accept it here and - * use default (medium size, empty font name) - * - * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style - * @param $val - */ - function set_font($val) - { - //see __set and __get, on all assignments clear cache, not needed on direct set through __set - $this->_prop_cache["font"] = null; - $this->_props["font"] = $val; - $this->_props_computed["font"] = null; - - $important = isset($this->_important_props["font"]); - - if (strtolower($val) === "inherit") { - $this->_set_style("font_family", "inherit", $important); - $this->_set_style("font_size", "inherit", $important); - $this->_set_style("font_style", "inherit", $important); - $this->_set_style("font_variant", "inherit", $important); - $this->_set_style("font_weight", "inherit", $important); - $this->_set_style("line_height", "inherit", $important); - return; - } - - if (preg_match("/^(italic|oblique|normal)\s*(.*)$/i", $val, $match)) { - $this->_set_style("font_style", $match[1], $important); - $val = $match[2]; - } - - if (preg_match("/^(small-caps|normal)\s*(.*)$/i", $val, $match)) { - $this->_set_style("font_variant", $match[1], $important); - $val = $match[2]; - } - - //matching numeric value followed by unit -> this is indeed a subsequent font size. Skip! - if (preg_match("/^(bold|bolder|lighter|100|200|300|400|500|600|700|800|900|normal)\s*(.*)$/i", $val, $match) && - !preg_match("/^(?:pt|px|pc|em|ex|in|cm|mm|%)/", $match[2]) - ) { - $this->_set_style("font_weight", $match[1], $important); - $val = $match[2]; - } - - if (preg_match("/^(xx-small|x-small|small|medium|large|x-large|xx-large|smaller|larger|\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))(?:\/|\s*)(.*)$/i", $val, $match)) { - $this->_set_style("font_size", $match[1], $important); - $val = $match[2]; - if (preg_match("/^(?:\/|\s*)(\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%)?)\s*(.*)$/i", $val, $match)) { - $this->_set_style("line_height", $match[1], $important); - $val = $match[2]; - } - } - - if (strlen($val) != 0) { - $this->_set_style("font_family", $val, $important); - } - } - - /** - * Sets the text alignment - * - * If no alignment is set on the element and the direction is rtl then - * the property is set to "right", otherwise it is set to "left". - * - * @link https://www.w3.org/TR/CSS21/text.html#propdef-text-align - */ - public function set_text_align($val) - { - $alignment = ""; - if (in_array($val, self::$text_align_keywords)) { - $alignment = $val; - } - if ($alignment === "") { - $alignment = "left"; - if ($this->__get("direction") === "rtl") { - $alignment = "right"; - } - - } - $this->_props_computed["text_align"] = $alignment; - } - - /** - * Sets word spacing property - * - * @link http://www.w3.org/TR/CSS21/text.html#propdef-word-spacing - * @param $val - */ - function set_word_spacing($val) - { - $this->_props["word_spacing"] = $val; - $this->_props_computed["word_spacing"] = null; - $this->_prop_cache["word_spacing"] = null; - - if ($val === 'inherit') { - return; - } - - if ($val === "normal" || strpos($val, "%") !== false) { - $this->_props_computed["word_spacing"] = $val; - } else { - $this->_props_computed["word_spacing"] = ((float)$this->length_in_pt($val, $this->__get("font_size"))) . "pt"; - } - } - - /** - * Sets letter spacing property - * - * @link http://www.w3.org/TR/CSS21/text.html#propdef-letter-spacing - * @param $val - */ - function set_letter_spacing($val) - { - $this->_props["letter_spacing"] = $val; - $this->_props_computed["letter_spacing"] = null; - $this->_prop_cache["letter_spacing"] = null; - - if ($val === 'inherit') { - return; - } - - if ($val === "normal") { - $this->_props_computed["letter_spacing"] = $val; - } else { - $this->_props_computed["letter_spacing"] = ((float)$this->length_in_pt($val, $this->__get("font_size"))) . "pt"; - } - } - - /** - * Sets line height property - * - * @link http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height - * @param $val - */ - function set_line_height($val) - { - $this->_props["line_height"] = $val; - $this->_props_computed["line_height"] = null; - $this->_prop_cache["line_height"] = null; - - if ($val === 'inherit') { - return; - } - - if ($val === "normal" || is_numeric($val)) { - $this->_props_computed["line_height"] = $val; - } else { - $this->_props_computed["line_height"] = ((float)$this->length_in_pt($val, $this->__get("font_size"))) . "pt"; - } - } - - /** - * Sets page break properties - * - * @link http://www.w3.org/TR/CSS21/page.html#page-breaks - * @param string $break - */ - function set_page_break_before($break) - { - $this->_props["page_break_before"] = $break; - $this->_props_computed["page_break_before"] = null; - $this->_prop_cache["page_break_before"] = null; - - if ($break === 'inherit') { - return; - } - - if ($break === "left" || $break === "right") { - $break = "always"; - } - - $this->_props_computed["page_break_before"] = $break; - } - - /** - * @param $break - */ - function set_page_break_after($break) - { - $this->_props["page_break_after"] = $break; - $this->_props_computed["page_break_after"] = null; - $this->_prop_cache["page_break_after"] = null; - - if ($break === 'inherit') { - return; - } - - if ($break === "left" || $break === "right") { - $break = "always"; - } - - $this->_props_computed["page_break_after"] = $break; - } - - /** - * Sets the margin size - * - * @link http://www.w3.org/TR/CSS21/box.html#margin-properties - * @param $val - */ - function set_margin_top($val) - { - $this->_set_style_side_width_important('margin', 'top', $val); - } - - /** - * @param $val - */ - function set_margin_right($val) - { - $this->_set_style_side_width_important('margin', 'right', $val); - } - - /** - * @param $val - */ - function set_margin_bottom($val) - { - $this->_set_style_side_width_important('margin', 'bottom', $val); - } - - /** - * @param $val - */ - function set_margin_left($val) - { - $this->_set_style_side_width_important('margin', 'left', $val); - } - - /** - * @param $val - */ - function set_margin($val) - { - $this->_set_style_type_important('margin', '', $val); - } - - /** - * Sets the padding size - * - * @link http://www.w3.org/TR/CSS21/box.html#padding-properties - * @param $val - */ - function set_padding_top($val) - { - $this->_set_style_side_width_important('padding', 'top', $val); - } - - /** - * @param $val - */ - function set_padding_right($val) - { - $this->_set_style_side_width_important('padding', 'right', $val); - } - - /** - * @param $val - */ - function set_padding_bottom($val) - { - $this->_set_style_side_width_important('padding', 'bottom', $val); - } - - /** - * @param $val - */ - function set_padding_left($val) - { - $this->_set_style_side_width_important('padding', 'left', $val); - } - - /** - * @param $val - */ - function set_padding($val) - { - $this->_set_style_type_important('padding', '', $val); - } - /**#@-*/ - - /** - * Sets a single border - * - * @param string $side - * @param string $border_spec ([width] [style] [color]) - * @param boolean $important - */ - protected function _set_border($side, $border_spec, $important) - { - $border_spec = preg_replace("/\s*\,\s*/", ",", $border_spec); - //$border_spec = str_replace(",", " ", $border_spec); // Why did we have this ?? rbg(10, 102, 10) > rgb(10 102 10) - $arr = explode(" ", $border_spec); - - // FIXME: handle partial values - //For consistency of individual and combined properties, and with ie8 and firefox3 - //reset all attributes, even if only partially given - //$this->_set_style_side_type('border', $side, 'style', self::$_defaults['border_' . $side . '_style'], $important); - //$this->_set_style_side_type('border', $side, 'width', self::$_defaults['border_' . $side . '_width'], $important); - //$this->_set_style_side_type('border', $side, 'color', self::$_defaults['border_' . $side . '_color'], $important); - - foreach ($arr as $value) { - $value = trim($value); - if (in_array($value, self::$BORDER_STYLES)) { - $this->_set_style_side_type('border', $side, 'style', $value, $important); - } elseif (preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value)) { - $this->_set_style_side_type('border', $side, 'width', $value, $important); - } elseif ($value === "inherit") { - $this->_set_style_side_type('border', $side, 'style', $value, $important); - $this->_set_style_side_type('border', $side, 'width', $value, $important); - $this->_set_style_side_type('border', $side, 'color', $value, $important); - } else { - // must be color - $this->_set_style_side_type('border', $side, 'color', $this->munge_color($value), $important); - } - } - } - - /** - * Sets the border styles - * - * @link http://www.w3.org/TR/CSS21/box.html#border-properties - * @param string $val - */ - function set_border_top($val) - { - $this->_set_border("top", $val, isset($this->_important_props['border_top'])); - } - - function set_border_top_color($val) - { - $color = $val; - if ($val === "") { - $color = $this->__get("color"); - } - $this->_set_style_side_type('border', 'top', 'color', $color, isset($this->_important_props['border_top_color'])); - } - - function set_border_top_style($val) - { - $this->_set_style_side_type('border', 'top', 'style', $val, isset($this->_important_props['border_top_style'])); - } - - function set_border_top_width($val) - { - $this->_set_style_side_type('border', 'top', 'width', $val, isset($this->_important_props['border_top_width'])); - } - - /** - * @param $val - */ - function set_border_right($val) - { - $this->_set_border("right", $val, isset($this->_important_props['border_right'])); - } - - function set_border_right_color($val) - { - $color = $val; - if ($val === "") { - $color = $this->__get("color"); - } - $this->_set_style_side_type('border', 'right', 'color', $color, isset($this->_important_props['border_right_color'])); - } - - function set_border_right_style($val) - { - $this->_set_style_side_type('border', 'right', 'style', $val, isset($this->_important_props['border_right_style'])); - } - - function set_border_right_width($val) - { - $this->_set_style_side_type('border', 'right', 'width', $val, isset($this->_important_props['border_right_width'])); - } - - /** - * @param $val - */ - function set_border_bottom($val) - { - $this->_set_border("bottom", $val, isset($this->_important_props['border_bottom'])); - } - - function set_border_bottom_color($val) - { - $color = $val; - if ($val === "") { - $color = $this->__get("color"); - } - $this->_set_style_side_type('border', 'bottom', 'color', $color, isset($this->_important_props['border_bottom_color'])); - } - - function set_border_bottom_style($val) - { - $this->_set_style_side_type('border', 'bottom', 'style', $val, isset($this->_important_props['border_bottom_style'])); - } - - function set_border_bottom_width($val) - { - $this->_set_style_side_type('border', 'bottom', 'width', $val, isset($this->_important_props['border_bottom_width'])); - } - - /** - * @param $val - */ - function set_border_left($val) - { - $this->_set_border("left", $val, isset($this->_important_props['border_left'])); - } - - function set_border_left_color($val) - { - $color = $val; - if ($val === "") { - $color = $this->__get("color"); - } - $this->_set_style_side_type('border', 'left', 'color', $color, isset($this->_important_props['border_left_color'])); - } - - function set_border_left_style($val) - { - $this->_set_style_side_type('border', 'left', 'style', $val, isset($this->_important_props['border_left_style'])); - } - - function set_border_left_width($val) - { - $this->_set_style_side_type('border', 'left', 'width', $val, isset($this->_important_props['border_left_width'])); - } - - /** - * @param $val - */ - function set_border($val) - { - $important = isset($this->_important_props["border"]); - - $this->_set_border("top", $val, $important); - $this->_set_border("right", $val, $important); - $this->_set_border("bottom", $val, $important); - $this->_set_border("left", $val, $important); - } - - /** - * @param $val - */ - function set_border_width($val) - { - $this->_set_style_type_important('border', 'width', $val); - } - - /** - * @param $val - */ - function set_border_color($val) - { - $this->_set_style_type_important('border', 'color', $val); - } - - /** - * @param $val - */ - function set_border_style($val) - { - $this->_set_style_type_important('border', 'style', $val); - } - - /** - * Sets the border radius size - * - * http://www.w3.org/TR/css3-background/#corners - * - * @param $val - */ - function set_border_top_left_radius($val) - { - $this->_set_border_radius_corner($val, "top_left"); - } - - /** - * @param $val - */ - function set_border_top_right_radius($val) - { - $this->_set_border_radius_corner($val, "top_right"); - } - - /** - * @param $val - */ - function set_border_bottom_left_radius($val) - { - $this->_set_border_radius_corner($val, "bottom_left"); - } - - /** - * @param $val - */ - function set_border_bottom_right_radius($val) - { - $this->_set_border_radius_corner($val, "bottom_right"); - } - - /** - * @param $val - */ - function set_border_radius($val) - { - $val = preg_replace("/\s*\,\s*/", ",", $val); // when border-radius has spaces - $arr = explode(" ", $val); - - switch (count($arr)) { - case 1: - $this->_set_border_radii($arr[0], $arr[0], $arr[0], $arr[0]); - break; - case 2: - $this->_set_border_radii($arr[0], $arr[1], $arr[0], $arr[1]); - break; - case 3: - $this->_set_border_radii($arr[0], $arr[1], $arr[2], $arr[1]); - break; - case 4: - $this->_set_border_radii($arr[0], $arr[1], $arr[2], $arr[3]); - break; - } - } - - /** - * @param $val1 - * @param $val2 - * @param $val3 - * @param $val4 - */ - protected function _set_border_radii($val1, $val2, $val3, $val4) - { - $this->_set_border_radius_corner($val1, "top_left"); - $this->_set_border_radius_corner($val2, "top_right"); - $this->_set_border_radius_corner($val3, "bottom_right"); - $this->_set_border_radius_corner($val4, "bottom_left"); - } - - /** - * @param $val - * @param $corner - */ - protected function _set_border_radius_corner($val, $corner) - { - $this->_has_border_radius = true; - - $this->_props["border_" . $corner . "_radius"] = $val; - $this->_props_computed["border_" . $corner . "_radius"] = null; - $this->_prop_cache["border_" . $corner . "_radius"] = null; - - if ($val === 'inherit') { - return; - } - - $this->_props_computed["border_" . $corner . "_radius"] = $val; - } - - /** - * @return float|int|string - */ - function get_border_top_left_radius() - { - return $this->_get_border_radius_corner("top_left"); - } - - /** - * @return float|int|string - */ - function get_border_top_right_radius() - { - return $this->_get_border_radius_corner("top_right"); - } - - /** - * @return float|int|string - */ - function get_border_bottom_left_radius() - { - return $this->_get_border_radius_corner("bottom_left"); - } - - /** - * @return float|int|string - */ - function get_border_bottom_right_radius() - { - return $this->_get_border_radius_corner("bottom_right"); - } - - /** - * @param $corner - * @return float|int|string - */ - protected function _get_border_radius_corner($corner) - { - if (!isset($this->_props_computed["border_" . $corner . "_radius"]) || empty($this->_props_computed["border_" . $corner . "_radius"])) { - return 0; - } - - return $this->length_in_pt($this->_props_computed["border_" . $corner . "_radius"]); - } - - /** - * Sets the outline styles - * - * @link http://www.w3.org/TR/CSS21/ui.html#dynamic-outlines - * @param string $val - */ - function set_outline($val) - { - $important = isset($this->_important_props["outline"]); - - $props = [ - "outline_style", - "outline_width", - "outline_color", - ]; - - foreach ($props as $prop) { - $_val = self::$_defaults[$prop]; - - if (!isset($this->_important_props[$prop]) || $important) { - //see __set and __get, on all assignments clear cache! - $this->_prop_cache[$prop] = null; - if ($important) { - $this->_important_props[$prop] = true; - } - $this->_props[$prop] = $_val; - } - } - - $val = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces - $arr = explode(" ", $val); - foreach ($arr as $value) { - $value = trim($value); - - if (in_array($value, self::$BORDER_STYLES)) { - $this->__set("outline_style", $value); - } else if (preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value)) { - $this->__set("outline_width", $value); - } else { - // must be color - $this->__set("outline_color", $value); - } - } - - //see __set and __get, on all assignments clear cache, not needed on direct set through __set - $this->_props["outline"] = $val; - $this->_props_computed["outline"] = null; - $this->_prop_cache["outline"] = null; - } - - /** - * @param $val - */ - function set_outline_width($val) - { - $this->_set_style_side_type("outline", null, "width", $val, isset($this->_important_props["outline_width"])); - } - - /** - * @param $val - */ - function set_outline_color($val) - { - $color = $val; - if ($val === "") { - $color = $this->__get("color"); - } - $this->_set_style_side_type("outline", null, "color", $color, isset($this->_important_props["outline_color"])); - } - - /** - * @param $val - */ - function set_outline_style($val) - { - $this->_set_style_side_type("outline", null, "style", $val, isset($this->_important_props["outline_style"])); - } - - /** - * Sets the border spacing - * - * @link http://www.w3.org/TR/CSS21/box.html#border-properties - * @param float $val - */ - function set_border_spacing($val) - { - $arr = explode(" ", $val); - - if (count($arr) == 1) { - $arr[1] = $arr[0]; - } - - $this->_props["border_spacing"] = $val; - $this->_props_computed["border_spacing"] = null; - $this->_prop_cache["border_spacing"] = null; - - if ($val === 'inherit') { - return; - } - - $this->_props_computed["border_spacing"] = "$arr[0] $arr[1]"; - } - - /** - * Sets the list style image - * - * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style-image - * @param $val - */ - function set_list_style_image($val) - { - $this->_props["list_style_image"] = $val; - $this->_props_computed["list_style_image"] = "url(" . $this->_image($val) . ")"; - $this->_prop_cache["list_style_image"] = null; - } - - /** - * Sets the list style - * - * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style - * @param $val - */ - function set_list_style($val) - { - $important = isset($this->_important_props["list_style"]); - $arr = explode(" ", str_replace(",", " ", $val)); - - static $types = [ - "disc", "circle", "square", - "decimal-leading-zero", "decimal", "1", - "lower-roman", "upper-roman", "a", "A", - "lower-greek", - "lower-latin", "upper-latin", - "lower-alpha", "upper-alpha", - "armenian", "georgian", "hebrew", - "cjk-ideographic", "hiragana", "katakana", - "hiragana-iroha", "katakana-iroha", "none" - ]; - - static $positions = ["inside", "outside"]; - - foreach ($arr as $value) { - /* http://www.w3.org/TR/CSS21/generate.html#list-style - * A value of 'none' for the 'list-style' property sets both 'list-style-type' and 'list-style-image' to 'none' - */ - if ($value === "none") { - $this->_set_style("list_style_type", $value, $important); - $this->_set_style("list_style_image", $value, $important); - continue; - } - - //On setting or merging or inheriting list_style_image as well as list_style_type, - //and url exists, then url has precedence, otherwise fall back to list_style_type - //Firefox is wrong here (list_style_image gets overwritten on explicit list_style_type) - //Internet Explorer 7/8 and dompdf is right. - - if (mb_substr($value, 0, 3) === "url") { - $this->_set_style("list_style_image", $value, $important); - continue; - } - - if (in_array($value, $types)) { - $this->_set_style("list_style_type", $value, $important); - } else if (in_array($value, $positions)) { - $this->_set_style("list_style_position", $value, $important); - } - } - - $this->_props["list_style"] = $val; - $this->_props_computed["list_style"] = null; - $this->_prop_cache["list_style"] = null; - } - - /** - * @param $val - */ - function set_size($val) - { - $this->_props["size"] = $val; - $this->_props_computed["size"] = null; - $this->_prop_cache["size"] = null; - - $length_re = "/(\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))/"; - - $val = mb_strtolower($val); - - if ($val === "auto") { - $this->_props["size"] = $val; - return; - } - - $parts = preg_split("/\s+/", $val); - - $computed = []; - if (preg_match($length_re, $parts[0])) { - $computed[] = $this->length_in_pt($parts[0]); - - if (isset($parts[1]) && preg_match($length_re, $parts[1])) { - $computed[] = $this->length_in_pt($parts[1]); - } else { - $computed[] = $computed[0]; - } - - if (isset($parts[2]) && $parts[2] === "landscape") { - $computed = array_reverse($computed); - } - } elseif (isset(CPDF::$PAPER_SIZES[$parts[0]])) { - $computed = array_slice(CPDF::$PAPER_SIZES[$parts[0]], 2, 2); - - if (isset($parts[1]) && $parts[1] === "landscape") { - $computed = array_reverse($computed); - } - } else { - return; - } - - $this->_props_computed["size"] = $computed; - } - - /** - * Gets the CSS3 transform property - * - * @link http://www.w3.org/TR/css3-2d-transforms/#transform-property - * @return array|null - */ - function get_transform() - { - //TODO: should be handled in setter (lengths set to absolute) - - $number = "\s*([^,\s]+)\s*"; - $tr_value = "\s*([^,\s]+)\s*"; - $angle = "\s*([^,\s]+(?:deg|rad)?)\s*"; - - if (!preg_match_all("/[a-z]+\([^\)]+\)/i", $this->_props_computed["transform"], $parts, PREG_SET_ORDER)) { - return null; - } - - $functions = [ - //"matrix" => "\($number,$number,$number,$number,$number,$number\)", - - "translate" => "\($tr_value(?:,$tr_value)?\)", - "translateX" => "\($tr_value\)", - "translateY" => "\($tr_value\)", - - "scale" => "\($number(?:,$number)?\)", - "scaleX" => "\($number\)", - "scaleY" => "\($number\)", - - "rotate" => "\($angle\)", - - "skew" => "\($angle(?:,$angle)?\)", - "skewX" => "\($angle\)", - "skewY" => "\($angle\)", - ]; - - $transforms = []; - - foreach ($parts as $part) { - $t = $part[0]; - - foreach ($functions as $name => $pattern) { - if (preg_match("/$name\s*$pattern/i", $t, $matches)) { - $values = array_slice($matches, 1); - - switch ($name) { - // units - case "rotate": - case "skew": - case "skewX": - case "skewY": - - foreach ($values as $i => $value) { - if (strpos($value, "rad")) { - $values[$i] = rad2deg(floatval($value)); - } else { - $values[$i] = floatval($value); - } - } - - switch ($name) { - case "skew": - if (!isset($values[1])) { - $values[1] = 0; - } - break; - case "skewX": - $name = "skew"; - $values = [$values[0], 0]; - break; - case "skewY": - $name = "skew"; - $values = [0, $values[0]]; - break; - } - break; - - // units - case "translate": - $values[0] = $this->length_in_pt($values[0], (float)$this->length_in_pt($this->width)); - - if (isset($values[1])) { - $values[1] = $this->length_in_pt($values[1], (float)$this->length_in_pt($this->height)); - } else { - $values[1] = 0; - } - break; - - case "translateX": - $name = "translate"; - $values = [$this->length_in_pt($values[0], (float)$this->length_in_pt($this->width)), 0]; - break; - - case "translateY": - $name = "translate"; - $values = [0, $this->length_in_pt($values[0], (float)$this->length_in_pt($this->height))]; - break; - - // units - case "scale": - if (!isset($values[1])) { - $values[1] = $values[0]; - } - break; - - case "scaleX": - $name = "scale"; - $values = [$values[0], 1.0]; - break; - - case "scaleY": - $name = "scale"; - $values = [1.0, $values[0]]; - break; - } - - $transforms[] = [ - $name, - $values, - ]; - } - } - } - - return $transforms; - } - - /** - * @param $val - */ - function set_transform($val) - { - //see __set and __get, on all assignments clear cache, not needed on direct set through __set - $this->_props["transform"] = $val; - $this->_props_computed["transform"] = null; - $this->_prop_cache["transform"] = null; - - if ($val === 'inherit') { - return; - } - - $this->_props_computed["transform"] = $val; - } - - /** - * @param $val - */ - function set__webkit_transform($val) - { - $this->__set("transform", $val); - } - - /** - * @param $val - */ - function set__webkit_transform_origin($val) - { - $this->__set("transform_origin", $val); - } - - /** - * Sets the CSS3 transform-origin property - * - * @link http://www.w3.org/TR/css3-2d-transforms/#transform-origin - * @param string $val - */ - function set_transform_origin($val) - { - $this->_props["transform_origin"] = $val; - $this->_props_computed["transform_origin"] = null; - $this->_prop_cache["transform_origin"] = null; - - if ($val === 'inherit') { - return; - } - - $this->_props_computed["transform_origin"] = $val; - } - - /** - * Gets the CSS3 transform-origin property - * - * @link http://www.w3.org/TR/css3-2d-transforms/#transform-origin - * @return mixed[] - */ - function get_transform_origin() - { - //TODO: should be handled in setter - - $values = preg_split("/\s+/", $this->_props_computed['transform_origin']); - - $values = array_map(function ($value) { - if (in_array($value, ["top", "left"])) { - return 0; - } else if (in_array($value, ["bottom", "right"])) { - return "100%"; - } else { - return $value; - } - }, $values); - - if (!isset($values[1])) { - $values[1] = $values[0]; - } - - return $values; - } - - /** - * @param $val - * @return null - */ - protected function parse_image_resolution($val) - { - // If exif data could be get: - // $re = '/^\s*(\d+|normal|auto)(?:\s*,\s*(\d+|normal))?\s*$/'; - - $re = '/^\s*(\d+|normal|auto)\s*$/'; - - if (!preg_match($re, $val, $matches)) { - return null; - } - - return $matches[1]; - } - - /** - * auto | normal | dpi - * - * @param $val - */ - function set_background_image_resolution($val) - { - $this->_props["background_image_resolution"] = $val; - $this->_props_computed["background_image_resolution"] = null; - $this->_prop_cache["background_image_resolution"] = null; - - $parsed = $this->parse_image_resolution($val); - - $this->_props_computed["background_image_resolution"] = $parsed; - } - - /** - * auto | normal | dpi - * - * @param $val - */ - function set_image_resolution($val) - { - $this->_props["image_resolution"] = $val; - $this->_props_computed["image_resolution"] = null; - $this->_prop_cache["image_resolution"] = null; - - $parsed = $this->parse_image_resolution($val); - - $this->_props_computed["image_resolution"] = $parsed; - } - - /** - * @param $val - */ - function set__dompdf_background_image_resolution($val) - { - $this->__set("background_image_resolution", $val); - } - - /** - * @param $val - */ - function set__dompdf_image_resolution($val) - { - $this->__set("image_resolution", $val); - } - - /** - * @param $val - */ - function set_z_index($val) - { - $this->_props["z_index"] = $val; - $this->_props_computed["z_index"] = null; - $this->_prop_cache["z_index"] = null; - - if (round($val) != $val && $val !== "auto") { - return; - } - - $this->_props_computed["z_index"] = $val; - } - - /** - * @param FontMetrics $fontMetrics - * @return $this - */ - public function setFontMetrics(FontMetrics $fontMetrics) - { - $this->fontMetrics = $fontMetrics; - return $this; - } - - /** - * @return FontMetrics - */ - public function getFontMetrics() - { - return $this->fontMetrics; - } - - /** - * Generate a string representation of the Style - * - * This dumps the entire property array into a string via print_r. Useful - * for debugging. - * - * @return string - */ - /*DEBUGCSS print: see below additional debugging util*/ - function __toString() - { - return print_r(array_merge(["parent_font_size" => $this->_parent_font_size], - $this->_props), true); - } - - /*DEBUGCSS*/ - function debug_print() - { - print " parent_font_size:" . $this->_parent_font_size . ";\n"; - print " Props [\n"; - print " specified [\n"; - foreach ($this->_props as $prop => $val) { - print ' ' . $prop . ': ' . preg_replace("/\r\n/", ' ', print_r($val, true)); - if (isset($this->_important_props[$prop])) { - print ' !important'; - } - print ";\n"; - } - print " ]\n"; - print " computed [\n"; - foreach ($this->_props_computed as $prop => $val) { - print ' ' . $prop . ': ' . preg_replace("/\r\n/", ' ', print_r($val, true)); - print ";\n"; - } - print " ]\n"; - print " cached [\n"; - foreach ($this->_prop_cache as $prop => $val) { - print ' ' . $prop . ': ' . preg_replace("/\r\n/", ' ', print_r($val, true)); - print ";\n"; - } - print " ]\n"; - print " ]\n"; - } -} diff --git a/vendor/dompdf/dompdf/src/Css/Stylesheet.php b/vendor/dompdf/dompdf/src/Css/Stylesheet.php deleted file mode 100644 index f175d97..0000000 --- a/vendor/dompdf/dompdf/src/Css/Stylesheet.php +++ /dev/null @@ -1,1754 +0,0 @@ - - * @author Helmut Tischer - * @author Fabien MƩnager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Css; - -use DOMElement; -use DOMXPath; -use Dompdf\Dompdf; -use Dompdf\Helpers; -use Dompdf\Exception; -use Dompdf\FontMetrics; -use Dompdf\Frame\FrameTree; - -/** - * The master stylesheet class - * - * The Stylesheet class is responsible for parsing stylesheets and style - * tags/attributes. It also acts as a registry of the individual Style - * objects generated by the current set of loaded CSS files and style - * elements. - * - * @see Style - * @package dompdf - */ -class Stylesheet -{ - /** - * The location of the default built-in CSS file. - */ - const DEFAULT_STYLESHEET = "/lib/res/html.css"; - - /** - * User agent stylesheet origin - * - * @var int - */ - const ORIG_UA = 1; - - /** - * User normal stylesheet origin - * - * @var int - */ - const ORIG_USER = 2; - - /** - * Author normal stylesheet origin - * - * @var int - */ - const ORIG_AUTHOR = 3; - - /* - * The highest possible specificity is 0x01000000 (and that is only for author - * stylesheets, as it is for inline styles). Origin precedence can be achieved by - * adding multiples of 0x10000000 to the actual specificity. Important - * declarations are handled in Style; though technically they should be handled - * here so that user important declarations can be made to take precedence over - * user important declarations, this doesn't matter in practice as Dompdf does - * not support user stylesheets, and user agent stylesheets can not include - * important declarations. - */ - private static $_stylesheet_origins = [ - self::ORIG_UA => 0x00000000, // user agent declarations - self::ORIG_USER => 0x10000000, // user normal declarations - self::ORIG_AUTHOR => 0x30000000, // author normal declarations - ]; - - /* - * Non-CSS presentational hints (i.e. HTML 4 attributes) are handled as if added - * to the beginning of an author stylesheet, i.e. anything in author stylesheets - * should override them. - */ - const SPEC_NON_CSS = 0x20000000; - - /** - * Current dompdf instance - * - * @var Dompdf - */ - private $_dompdf; - - /** - * Array of currently defined styles - * - * @var Style[] - */ - private $_styles; - - /** - * Base protocol of the document being parsed - * Used to handle relative urls. - * - * @var string - */ - private $_protocol; - - /** - * Base hostname of the document being parsed - * Used to handle relative urls. - * - * @var string - */ - private $_base_host; - - /** - * Base path of the document being parsed - * Used to handle relative urls. - * - * @var string - */ - private $_base_path; - - /** - * The styles defined by @page rules - * - * @var array - $child = $child->nextSibling; - } - } else { - $css = $tag->nodeValue; - } - - // Set the base path of the Stylesheet to that of the file being processed - $this->css->set_protocol($this->protocol); - $this->css->set_host($this->baseHost); - $this->css->set_base_path($this->basePath); - - $this->css->load_css($css, Stylesheet::ORIG_AUTHOR); - break; - } - - // Set the base path of the Stylesheet to that of the file being processed - $this->css->set_protocol($this->protocol); - $this->css->set_host($this->baseHost); - $this->css->set_base_path($this->basePath); - } - } - - /** - * @param string $cacheId - * @deprecated - */ - public function enable_caching($cacheId) - { - $this->enableCaching($cacheId); - } - - /** - * Enable experimental caching capability - * - * @param string $cacheId - */ - public function enableCaching($cacheId) - { - $this->cacheId = $cacheId; - } - - /** - * @param string $value - * @return bool - * @deprecated - */ - public function parse_default_view($value) - { - return $this->parseDefaultView($value); - } - - /** - * @param string $value - * @return bool - */ - public function parseDefaultView($value) - { - $valid = ["XYZ", "Fit", "FitH", "FitV", "FitR", "FitB", "FitBH", "FitBV"]; - - $options = preg_split("/\s*,\s*/", trim($value)); - $defaultView = array_shift($options); - - if (!in_array($defaultView, $valid)) { - return false; - } - - $this->setDefaultView($defaultView, $options); - return true; - } - - /** - * Renders the HTML to PDF - */ - public function render() - { - $this->saveLocale(); - $options = $this->options; - - $logOutputFile = $options->getLogOutputFile(); - if ($logOutputFile) { - if (!file_exists($logOutputFile) && is_writable(dirname($logOutputFile))) { - touch($logOutputFile); - } - - $this->startTime = microtime(true); - if (is_writable($logOutputFile)) { - ob_start(); - } - } - - $this->processHtml(); - - $this->css->apply_styles($this->tree); - - // @page style rules : size, margins - $pageStyles = $this->css->get_page_styles(); - $basePageStyle = $pageStyles["base"]; - unset($pageStyles["base"]); - - foreach ($pageStyles as $pageStyle) { - $pageStyle->inherit($basePageStyle); - } - - $defaultOptionPaperSize = $this->getPaperSize($options->getDefaultPaperSize()); - // If there is a CSS defined paper size compare to the paper size used to create the canvas to determine a - // recreation need - if (is_array($basePageStyle->size)) { - $basePageStyleSize = $basePageStyle->size; - $this->setPaper([0, 0, $basePageStyleSize[0], $basePageStyleSize[1]]); - } - - $paperSize = $this->getPaperSize(); - if ( - $defaultOptionPaperSize[2] !== $paperSize[2] || - $defaultOptionPaperSize[3] !== $paperSize[3] || - $options->getDefaultPaperOrientation() !== $this->paperOrientation - ) { - $this->setCanvas(CanvasFactory::get_instance($this, $this->paperSize, $this->paperOrientation)); - $this->fontMetrics->setCanvas($this->getCanvas()); - } - - $canvas = $this->getCanvas(); - - $root = null; - - foreach ($this->tree->get_frames() as $frame) { - // Set up the root frame - if (is_null($root)) { - $root = Factory::decorate_root($this->tree->get_root(), $this); - continue; - } - - // Create the appropriate decorators, reflowers & positioners. - Factory::decorate_frame($frame, $this, $root); - } - - // Add meta information - $title = $this->dom->getElementsByTagName("title"); - if ($title->length) { - $canvas->add_info("Title", trim($title->item(0)->nodeValue)); - } - - $metas = $this->dom->getElementsByTagName("meta"); - $labels = [ - "author" => "Author", - "keywords" => "Keywords", - "description" => "Subject", - ]; - /** @var \DOMElement $meta */ - foreach ($metas as $meta) { - $name = mb_strtolower($meta->getAttribute("name")); - $value = trim($meta->getAttribute("content")); - - if (isset($labels[$name])) { - $canvas->add_info($labels[$name], $value); - continue; - } - - if ($name === "dompdf.view" && $this->parseDefaultView($value)) { - $canvas->set_default_view($this->defaultView, $this->defaultViewOptions); - } - } - - $root->set_containing_block(0, 0, $canvas->get_width(), $canvas->get_height()); - $root->set_renderer(new Renderer($this)); - - // This is where the magic happens: - $root->reflow(); - - // Clean up cached images - Cache::clear(); - - global $_dompdf_warnings, $_dompdf_show_warnings; - if ($_dompdf_show_warnings && isset($_dompdf_warnings)) { - echo 'Dompdf Warnings
';
-            foreach ($_dompdf_warnings as $msg) {
-                echo $msg . "\n";
-            }
-
-            if ($canvas instanceof CPDF) {
-                echo $canvas->get_cpdf()->messages;
-            }
-            echo '
'; - flush(); - } - - if ($logOutputFile && is_writable($logOutputFile)) { - $this->write_log(); - ob_end_clean(); - } - - $this->restoreLocale(); - } - - /** - * Add meta information to the PDF after rendering - */ - public function add_info($label, $value) - { - $canvas = $this->getCanvas(); - if (!is_null($canvas)) { - $canvas->add_info($label, $value); - } - } - - /** - * Writes the output buffer in the log file - * - * @return void - */ - private function write_log() - { - $log_output_file = $this->getOptions()->getLogOutputFile(); - if (!$log_output_file || !is_writable($log_output_file)) { - return; - } - - $frames = Frame::$ID_COUNTER; - $memory = memory_get_peak_usage(true) / 1024; - $time = (microtime(true) - $this->startTime) * 1000; - - $out = sprintf( - "%6d" . - "%10.2f KB" . - "%10.2f ms" . - " " . - ($this->quirksmode ? " ON" : "OFF") . - "
", $frames, $memory, $time); - - $out .= ob_get_contents(); - ob_clean(); - - file_put_contents($log_output_file, $out); - } - - /** - * Streams the PDF to the client. - * - * The file will open a download dialog by default. The options - * parameter controls the output. Accepted options (array keys) are: - * - * 'compress' = > 1 (=default) or 0: - * Apply content stream compression - * - * 'Attachment' => 1 (=default) or 0: - * Set the 'Content-Disposition:' HTTP header to 'attachment' - * (thereby causing the browser to open a download dialog) - * - * @param string $filename the name of the streamed file - * @param array $options header options (see above) - */ - public function stream($filename = "document.pdf", $options = []) - { - $this->saveLocale(); - - $canvas = $this->getCanvas(); - if (!is_null($canvas)) { - $canvas->stream($filename, $options); - } - - $this->restoreLocale(); - } - - /** - * Returns the PDF as a string. - * - * The options parameter controls the output. Accepted options are: - * - * 'compress' = > 1 or 0 - apply content stream compression, this is - * on (1) by default - * - * @param array $options options (see above) - * - * @return string|null - */ - public function output($options = []) - { - $this->saveLocale(); - - $canvas = $this->getCanvas(); - if (is_null($canvas)) { - return null; - } - - $output = $canvas->output($options); - - $this->restoreLocale(); - - return $output; - } - - /** - * @return string - * @deprecated - */ - public function output_html() - { - return $this->outputHtml(); - } - - /** - * Returns the underlying HTML document as a string - * - * @return string - */ - public function outputHtml() - { - return $this->dom->saveHTML(); - } - - /** - * Get the dompdf option value - * - * @param string $key - * @return mixed - * @deprecated - */ - public function get_option($key) - { - return $this->options->get($key); - } - - /** - * @param string $key - * @param mixed $value - * @return $this - * @deprecated - */ - public function set_option($key, $value) - { - $this->options->set($key, $value); - return $this; - } - - /** - * @param array $options - * @return $this - * @deprecated - */ - public function set_options(array $options) - { - $this->options->set($options); - return $this; - } - - /** - * @param string $size - * @param string $orientation - * @deprecated - */ - public function set_paper($size, $orientation = "portrait") - { - $this->setPaper($size, $orientation); - } - - /** - * Sets the paper size & orientation - * - * @param string|array $size 'letter', 'legal', 'A4', etc. {@link Dompdf\Adapter\CPDF::$PAPER_SIZES} - * @param string $orientation 'portrait' or 'landscape' - * @return $this - */ - public function setPaper($size, $orientation = "portrait") - { - $this->paperSize = $size; - $this->paperOrientation = $orientation; - return $this; - } - - /** - * Gets the paper size - * - * @param null|string|array $paperSize - * @return int[] A four-element integer array - */ - public function getPaperSize($paperSize = null) - { - $size = $paperSize !== null ? $paperSize : $this->paperSize; - if (is_array($size)) { - return $size; - } else if (isset(Adapter\CPDF::$PAPER_SIZES[mb_strtolower($size)])) { - return Adapter\CPDF::$PAPER_SIZES[mb_strtolower($size)]; - } else { - return Adapter\CPDF::$PAPER_SIZES["letter"]; - } - } - - /** - * Gets the paper orientation - * - * @return string Either "portrait" or "landscape" - */ - public function getPaperOrientation() - { - return $this->paperOrientation; - } - - /** - * @param FrameTree $tree - * @return $this - */ - public function setTree(FrameTree $tree) - { - $this->tree = $tree; - return $this; - } - - /** - * @return FrameTree - * @deprecated - */ - public function get_tree() - { - return $this->getTree(); - } - - /** - * Returns the underlying {@link FrameTree} object - * - * @return FrameTree - */ - public function getTree() - { - return $this->tree; - } - - /** - * @param string $protocol - * @return $this - * @deprecated - */ - public function set_protocol($protocol) - { - return $this->setProtocol($protocol); - } - - /** - * Sets the protocol to use - * FIXME validate these - * - * @param string $protocol - * @return $this - */ - public function setProtocol($protocol) - { - $this->protocol = $protocol; - return $this; - } - - /** - * @return string - * @deprecated - */ - public function get_protocol() - { - return $this->getProtocol(); - } - - /** - * Returns the protocol in use - * - * @return string - */ - public function getProtocol() - { - return $this->protocol; - } - - /** - * @param string $host - * @deprecated - */ - public function set_host($host) - { - $this->setBaseHost($host); - } - - /** - * Sets the base hostname - * - * @param string $baseHost - * @return $this - */ - public function setBaseHost($baseHost) - { - $this->baseHost = $baseHost; - return $this; - } - - /** - * @return string - * @deprecated - */ - public function get_host() - { - return $this->getBaseHost(); - } - - /** - * Returns the base hostname - * - * @return string - */ - public function getBaseHost() - { - return $this->baseHost; - } - - /** - * Sets the base path - * - * @param string $path - * @deprecated - */ - public function set_base_path($path) - { - $this->setBasePath($path); - } - - /** - * Sets the base path - * - * @param string $basePath - * @return $this - */ - public function setBasePath($basePath) - { - $this->basePath = $basePath; - return $this; - } - - /** - * @return string - * @deprecated - */ - public function get_base_path() - { - return $this->getBasePath(); - } - - /** - * Returns the base path - * - * @return string - */ - public function getBasePath() - { - return $this->basePath; - } - - /** - * @param string $default_view The default document view - * @param array $options The view's options - * @return $this - * @deprecated - */ - public function set_default_view($default_view, $options) - { - return $this->setDefaultView($default_view, $options); - } - - /** - * Sets the default view - * - * @param string $defaultView The default document view - * @param array $options The view's options - * @return $this - */ - public function setDefaultView($defaultView, $options) - { - $this->defaultView = $defaultView; - $this->defaultViewOptions = $options; - return $this; - } - - /** - * @param resource $http_context - * @return $this - * @deprecated - */ - public function set_http_context($http_context) - { - return $this->setHttpContext($http_context); - } - - /** - * Sets the HTTP context - * - * @param resource $httpContext - * @return $this - */ - public function setHttpContext($httpContext) - { - $this->httpContext = $httpContext; - return $this; - } - - /** - * @return resource - * @deprecated - */ - public function get_http_context() - { - return $this->getHttpContext(); - } - - /** - * Returns the HTTP context - * - * @return resource - */ - public function getHttpContext() - { - return $this->httpContext; - } - - /** - * @param Canvas $canvas - * @return $this - */ - public function setCanvas(Canvas $canvas) - { - $this->canvas = $canvas; - return $this; - } - - /** - * @return Canvas - * @deprecated - */ - public function get_canvas() - { - return $this->getCanvas(); - } - - /** - * Return the underlying Canvas instance (e.g. Dompdf\Adapter\CPDF, Dompdf\Adapter\GD) - * - * @return Canvas - */ - public function getCanvas() - { - return $this->canvas; - } - - /** - * @param Stylesheet $css - * @return $this - */ - public function setCss(Stylesheet $css) - { - $this->css = $css; - return $this; - } - - /** - * @return Stylesheet - * @deprecated - */ - public function get_css() - { - return $this->getCss(); - } - - /** - * Returns the stylesheet - * - * @return Stylesheet - */ - public function getCss() - { - return $this->css; - } - - /** - * @param DOMDocument $dom - * @return $this - */ - public function setDom(DOMDocument $dom) - { - $this->dom = $dom; - return $this; - } - - /** - * @return DOMDocument - * @deprecated - */ - public function get_dom() - { - return $this->getDom(); - } - - /** - * @return DOMDocument - */ - public function getDom() - { - return $this->dom; - } - - /** - * @param Options $options - * @return $this - */ - public function setOptions(Options $options) - { - $this->options = $options; - $fontMetrics = $this->getFontMetrics(); - if (isset($fontMetrics)) { - $fontMetrics->setOptions($options); - } - return $this; - } - - /** - * @return Options - */ - public function getOptions() - { - return $this->options; - } - - /** - * @return array - * @deprecated - */ - public function get_callbacks() - { - return $this->getCallbacks(); - } - - /** - * Returns the callbacks array - * - * @return array - */ - public function getCallbacks() - { - return $this->callbacks; - } - - /** - * @param array $callbacks the set of callbacks to set - * @deprecated - */ - public function set_callbacks($callbacks) - { - $this->setCallbacks($callbacks); - } - - /** - * Sets callbacks for events like rendering of pages and elements. - * The callbacks array contains arrays with 'event' set to 'begin_page', - * 'end_page', 'begin_frame', or 'end_frame' and 'f' set to a function or - * object plus method to be called. - * - * The function 'f' must take an array as argument, which contains info - * about the event. - * - * @param array $callbacks the set of callbacks to set - */ - public function setCallbacks($callbacks) - { - if (is_array($callbacks)) { - $this->callbacks = []; - foreach ($callbacks as $c) { - if (is_array($c) && isset($c['event']) && isset($c['f'])) { - $event = $c['event']; - $f = $c['f']; - if (is_callable($f) && is_string($event)) { - $this->callbacks[$event][] = $f; - } - } - } - } - } - - /** - * @return boolean - * @deprecated - */ - public function get_quirksmode() - { - return $this->getQuirksmode(); - } - - /** - * Get the quirks mode - * - * @return boolean true if quirks mode is active - */ - public function getQuirksmode() - { - return $this->quirksmode; - } - - /** - * @param FontMetrics $fontMetrics - * @return $this - */ - public function setFontMetrics(FontMetrics $fontMetrics) - { - $this->fontMetrics = $fontMetrics; - return $this; - } - - /** - * @return FontMetrics - */ - public function getFontMetrics() - { - return $this->fontMetrics; - } - - /** - * PHP5 overloaded getter - * Along with {@link Dompdf::__set()} __get() provides access to all - * properties directly. Typically __get() is not called directly outside - * of this class. - * - * @param string $prop - * - * @throws Exception - * @return mixed - */ - function __get($prop) - { - switch ($prop) - { - case 'version' : - return $this->version; - default: - throw new Exception( 'Invalid property: ' . $prop ); - } - } -} diff --git a/vendor/dompdf/dompdf/src/Exception.php b/vendor/dompdf/dompdf/src/Exception.php deleted file mode 100644 index c9fb0df..0000000 --- a/vendor/dompdf/dompdf/src/Exception.php +++ /dev/null @@ -1,29 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf; - -/** - * Standard exception thrown by DOMPDF classes - * - * @package dompdf - */ -class Exception extends \Exception -{ - - /** - * Class constructor - * - * @param string $message Error message - * @param int $code Error code - */ - public function __construct($message = null, $code = 0) - { - parent::__construct($message, $code); - } -} diff --git a/vendor/dompdf/dompdf/src/Exception/ImageException.php b/vendor/dompdf/dompdf/src/Exception/ImageException.php deleted file mode 100644 index 62b44b1..0000000 --- a/vendor/dompdf/dompdf/src/Exception/ImageException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Exception; - -use Dompdf\Exception; - -/** - * Image exception thrown by DOMPDF - * - * @package dompdf - */ -class ImageException extends Exception -{ - - /** - * Class constructor - * - * @param string $message Error message - * @param int $code Error code - */ - function __construct($message = null, $code = 0) - { - parent::__construct($message, $code); - } - -} diff --git a/vendor/dompdf/dompdf/src/FontMetrics.php b/vendor/dompdf/dompdf/src/FontMetrics.php deleted file mode 100644 index 9af41ba..0000000 --- a/vendor/dompdf/dompdf/src/FontMetrics.php +++ /dev/null @@ -1,578 +0,0 @@ - - * @author Helmut Tischer - * @author Fabien MƩnager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf; - -use FontLib\Font; - -/** - * The font metrics class - * - * This class provides information about fonts and text. It can resolve - * font names into actual installed font files, as well as determine the - * size of text in a particular font and size. - * - * @static - * @package dompdf - */ -class FontMetrics -{ - /** - * Name of the font cache file - * - * This file must be writable by the webserver process only to update it - * with save_font_families() after adding the .afm file references of a new font family - * with FontMetrics::saveFontFamilies(). - * This is typically done only from command line with load_font.php on converting - * ttf fonts to ufm with php-font-lib. - */ - const CACHE_FILE = "dompdf_font_family_cache.php"; - - /** - * @var Canvas - * @deprecated - */ - protected $pdf; - - /** - * Underlying {@link Canvas} object to perform text size calculations - * - * @var Canvas - */ - protected $canvas; - - /** - * Array of font family names to font files - * - * Usually cached by the {@link load_font.php} script - * - * @var array - */ - protected $fontLookup = []; - - /** - * @var Options - */ - private $options; - - /** - * Class initialization - */ - public function __construct(Canvas $canvas, Options $options) - { - $this->setCanvas($canvas); - $this->setOptions($options); - $this->loadFontFamilies(); - } - - /** - * @deprecated - */ - public function save_font_families() - { - $this->saveFontFamilies(); - } - - /** - * Saves the stored font family cache - * - * The name and location of the cache file are determined by {@link - * FontMetrics::CACHE_FILE}. This file should be writable by the - * webserver process. - * - * @see FontMetrics::loadFontFamilies() - */ - public function saveFontFamilies() - { - // replace the path to the DOMPDF font directories with the corresponding constants (allows for more portability) - $cacheData = sprintf("fontLookup as $family => $variants) { - $cacheData .= sprintf(" '%s' => array(%s", addslashes($family), PHP_EOL); - foreach ($variants as $variant => $path) { - $path = sprintf("'%s'", $path); - $path = str_replace('\'' . $this->getOptions()->getFontDir() , '$fontDir . \'' , $path); - $path = str_replace('\'' . $this->getOptions()->getRootDir() , '$rootDir . \'' , $path); - $cacheData .= sprintf(" '%s' => %s,%s", $variant, $path, PHP_EOL); - } - $cacheData .= sprintf(" ),%s", PHP_EOL); - } - $cacheData .= ") ?>"; - file_put_contents($this->getCacheFile(), $cacheData); - } - - /** - * @deprecated - */ - public function load_font_families() - { - $this->loadFontFamilies(); - } - - /** - * Loads the stored font family cache - * - * @see FontMetrics::saveFontFamilies() - */ - public function loadFontFamilies() - { - $fontDir = $this->getOptions()->getFontDir(); - $rootDir = $this->getOptions()->getRootDir(); - - // FIXME: temporarily define constants for cache files <= v0.6.2 - if (!defined("DOMPDF_DIR")) { define("DOMPDF_DIR", $rootDir); } - if (!defined("DOMPDF_FONT_DIR")) { define("DOMPDF_FONT_DIR", $fontDir); } - - $file = $rootDir . "/lib/fonts/dompdf_font_family_cache.dist.php"; - $distFonts = require $file; - - if (!is_readable($this->getCacheFile())) { - $this->fontLookup = $distFonts; - return; - } - - $cacheData = require $this->getCacheFile(); - - $this->fontLookup = []; - if (is_array($this->fontLookup)) { - foreach ($cacheData as $key => $value) { - $this->fontLookup[stripslashes($key)] = $value; - } - } - - // Merge provided fonts - $this->fontLookup += $distFonts; - } - - /** - * @param array $style - * @param string $remote_file - * @param resource $context - * @return bool - * @deprecated - */ - public function register_font($style, $remote_file, $context = null) - { - return $this->registerFont($style, $remote_file); - } - - /** - * @param array $style - * @param string $remoteFile - * @param resource $context - * @return bool - */ - public function registerFont($style, $remoteFile, $context = null) - { - $fontname = mb_strtolower($style["family"]); - $families = $this->getFontFamilies(); - - $entry = []; - if (isset($families[$fontname])) { - $entry = $families[$fontname]; - } - - $styleString = $this->getType("{$style['weight']} {$style['style']}"); - - $fontDir = $this->getOptions()->getFontDir(); - $remoteHash = md5($remoteFile); - - $prefix = $fontname . "_" . $styleString; - $prefix = preg_replace("/[^\\pL\d]+/u", "-", $prefix); - $prefix = trim($prefix, "-"); - if (function_exists('iconv')) { - $prefix = iconv('utf-8', 'us-ascii//TRANSLIT', $prefix); - } - $prefix = preg_replace("/[^-\w]+/", "", $prefix); - - $localFile = $fontDir . "/" . $prefix . "_" . $remoteHash; - - if (isset($entry[$styleString]) && $localFile == $entry[$styleString]) { - return true; - } - - $cacheEntry = $localFile; - $localFile .= ".".strtolower(pathinfo(parse_url($remoteFile, PHP_URL_PATH), PATHINFO_EXTENSION)); - - $entry[$styleString] = $cacheEntry; - - // Download the remote file - [$protocol, $baseHost, $basePath] = Helpers::explode_url($remoteFile); - if (!$this->options->isRemoteEnabled() && ($protocol != "" && $protocol !== "file://")) { - Helpers::record_warnings(E_USER_WARNING, "Remote font resource $remoteFile referenced, but remote file download is disabled.", __FILE__, __LINE__); - return false; - } - if ($protocol == "" || $protocol === "file://") { - $realfile = realpath($remoteFile); - - $rootDir = realpath($this->options->getRootDir()); - if (strpos($realfile, $rootDir) !== 0) { - $chroot = realpath($this->options->getChroot()); - if (!$chroot || strpos($realfile, $chroot) !== 0) { - Helpers::record_warnings(E_USER_WARNING, "Permission denied on $remoteFile. The file could not be found under the directory specified by Options::chroot.", __FILE__, __LINE__); - return false; - } - } - - if (!$realfile) { - Helpers::record_warnings(E_USER_WARNING, "File '$realfile' not found.", __FILE__, __LINE__); - return false; - } - - $remoteFile = $realfile; - } - list($remoteFileContent, $http_response_header) = @Helpers::getFileContent($remoteFile, $context); - if (empty($remoteFileContent)) { - return false; - } - - $localTempFile = @tempnam($this->options->get("tempDir"), "dompdf-font-"); - file_put_contents($localTempFile, $remoteFileContent); - - $font = Font::load($localTempFile); - - if (!$font) { - unlink($localTempFile); - return false; - } - - $font->parse(); - $font->saveAdobeFontMetrics("$cacheEntry.ufm"); - $font->close(); - - unlink($localTempFile); - - if ( !file_exists("$cacheEntry.ufm") ) { - return false; - } - - // Save the changes - file_put_contents($localFile, $remoteFileContent); - - if ( !file_exists($localFile) ) { - unlink("$cacheEntry.ufm"); - return false; - } - - $this->setFontFamily($fontname, $entry); - $this->saveFontFamilies(); - - return true; - } - - /** - * @param $text - * @param $font - * @param $size - * @param float $word_spacing - * @param float $char_spacing - * @return float - * @deprecated - */ - public function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0) - { - //return self::$_pdf->get_text_width($text, $font, $size, $word_spacing, $char_spacing); - return $this->getTextWidth($text, $font, $size, $word_spacing, $char_spacing); - } - - /** - * Calculates text size, in points - * - * @param string $text the text to be sized - * @param string $font the desired font - * @param float $size the desired font size - * @param float $wordSpacing - * @param float $charSpacing - * - * @internal param float $spacing word spacing, if any - * @return float - */ - public function getTextWidth($text, $font, $size, $wordSpacing = 0.0, $charSpacing = 0.0) - { - // @todo Make sure this cache is efficient before enabling it - static $cache = []; - - if ($text === "") { - return 0; - } - - // Don't cache long strings - $useCache = !isset($text[50]); // Faster than strlen - - $key = "$font/$size/$wordSpacing/$charSpacing"; - - if ($useCache && isset($cache[$key][$text])) { - return $cache[$key]["$text"]; - } - - $width = $this->getCanvas()->get_text_width($text, $font, $size, $wordSpacing, $charSpacing); - - if ($useCache) { - $cache[$key][$text] = $width; - } - - return $width; - } - - /** - * @param $font - * @param $size - * @return float - * @deprecated - */ - public function get_font_height($font, $size) - { - return $this->getFontHeight($font, $size); - } - - /** - * Calculates font height - * - * @param string $font - * @param float $size - * - * @return float - */ - public function getFontHeight($font, $size) - { - return $this->getCanvas()->get_font_height($font, $size); - } - - /** - * @param $family_raw - * @param string $subtype_raw - * @return string - * @deprecated - */ - public function get_font($family_raw, $subtype_raw = "normal") - { - return $this->getFont($family_raw, $subtype_raw); - } - - /** - * Resolves a font family & subtype into an actual font file - * Subtype can be one of 'normal', 'bold', 'italic' or 'bold_italic'. If - * the particular font family has no suitable font file, the default font - * ({@link Options::defaultFont}) is used. The font file returned - * is the absolute pathname to the font file on the system. - * - * @param string $familyRaw - * @param string $subtypeRaw - * - * @return string - */ - public function getFont($familyRaw, $subtypeRaw = "normal") - { - static $cache = []; - - if (isset($cache[$familyRaw][$subtypeRaw])) { - return $cache[$familyRaw][$subtypeRaw]; - } - - /* Allow calling for various fonts in search path. Therefore not immediately - * return replacement on non match. - * Only when called with NULL try replacement. - * When this is also missing there is really trouble. - * If only the subtype fails, nevertheless return failure. - * Only on checking the fallback font, check various subtypes on same font. - */ - - $subtype = strtolower($subtypeRaw); - - if ($familyRaw) { - $family = str_replace(["'", '"'], "", strtolower($familyRaw)); - - if (isset($this->fontLookup[$family][$subtype])) { - return $cache[$familyRaw][$subtypeRaw] = $this->fontLookup[$family][$subtype]; - } - - return null; - } - - $family = "serif"; - - if (isset($this->fontLookup[$family][$subtype])) { - return $cache[$familyRaw][$subtypeRaw] = $this->fontLookup[$family][$subtype]; - } - - if (!isset($this->fontLookup[$family])) { - return null; - } - - $family = $this->fontLookup[$family]; - - foreach ($family as $sub => $font) { - if (strpos($subtype, $sub) !== false) { - return $cache[$familyRaw][$subtypeRaw] = $font; - } - } - - if ($subtype !== "normal") { - foreach ($family as $sub => $font) { - if ($sub !== "normal") { - return $cache[$familyRaw][$subtypeRaw] = $font; - } - } - } - - $subtype = "normal"; - - if (isset($family[$subtype])) { - return $cache[$familyRaw][$subtypeRaw] = $family[$subtype]; - } - - return null; - } - - /** - * @param $family - * @return null|string - * @deprecated - */ - public function get_family($family) - { - return $this->getFamily($family); - } - - /** - * @param string $family - * @return null|string - */ - public function getFamily($family) - { - $family = str_replace(["'", '"'], "", mb_strtolower($family)); - - if (isset($this->fontLookup[$family])) { - return $this->fontLookup[$family]; - } - - return null; - } - - /** - * @param $type - * @return string - * @deprecated - */ - public function get_type($type) - { - return $this->getType($type); - } - - /** - * @param string $type - * @return string - */ - public function getType($type) - { - if (preg_match('/bold/i', $type)) { - $weight = 700; - } elseif (preg_match('/([1-9]00)/', $type, $match)) { - $weight = (int)$match[0]; - } else { - $weight = 400; - } - $weight = $weight === 400 ? 'normal' : $weight; - $weight = $weight === 700 ? 'bold' : $weight; - - $style = preg_match('/italic|oblique/i', $type) ? 'italic' : null; - - if ($weight === 'normal' && $style !== null) { - return $style; - } - - return $style === null - ? $weight - : $weight.'_'.$style; - } - - /** - * @return array - * @deprecated - */ - public function get_font_families() - { - return $this->getFontFamilies(); - } - - /** - * Returns the current font lookup table - * - * @return array - */ - public function getFontFamilies() - { - return $this->fontLookup; - } - - /** - * @param string $fontname - * @param mixed $entry - * @deprecated - */ - public function set_font_family($fontname, $entry) - { - $this->setFontFamily($fontname, $entry); - } - - /** - * @param string $fontname - * @param mixed $entry - */ - public function setFontFamily($fontname, $entry) - { - $this->fontLookup[mb_strtolower($fontname)] = $entry; - } - - /** - * @return string - */ - public function getCacheFile() - { - return $this->getOptions()->getFontDir() . '/' . self::CACHE_FILE; - } - - /** - * @param Options $options - * @return $this - */ - public function setOptions(Options $options) - { - $this->options = $options; - return $this; - } - - /** - * @return Options - */ - public function getOptions() - { - return $this->options; - } - - /** - * @param Canvas $canvas - * @return $this - */ - public function setCanvas(Canvas $canvas) - { - $this->canvas = $canvas; - // Still write deprecated pdf for now. It might be used by a parent class. - $this->pdf = $canvas; - return $this; - } - - /** - * @return Canvas - */ - public function getCanvas() - { - return $this->canvas; - } -} \ No newline at end of file diff --git a/vendor/dompdf/dompdf/src/Frame.php b/vendor/dompdf/dompdf/src/Frame.php deleted file mode 100644 index ac38fa2..0000000 --- a/vendor/dompdf/dompdf/src/Frame.php +++ /dev/null @@ -1,1261 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -/** - * The main Frame class - * - * This class represents a single HTML element. This class stores - * positioning information as well as containing block location and - * dimensions. Style information for the element is stored in a {@link - * Style} object. Tree structure is maintained via the parent & children - * links. - * - * @package dompdf - */ -class Frame -{ - const WS_TEXT = 1; - const WS_SPACE = 2; - - /** - * The DOMElement or DOMText object this frame represents - * - * @var \DOMElement|\DOMText - */ - protected $_node; - - /** - * Unique identifier for this frame. Used to reference this frame - * via the node. - * - * @var string - */ - protected $_id; - - /** - * Unique id counter - */ - public static $ID_COUNTER = 0; /*protected*/ - - /** - * This frame's calculated style - * - * @var Style - */ - protected $_style; - - /** - * This frame's original style. Needed for cases where frames are - * split across pages. - * - * @var Style - */ - protected $_original_style; - - /** - * This frame's parent in the document tree. - * - * @var Frame - */ - protected $_parent; - - /** - * This frame's children - * - * @var Frame[] - */ - protected $_frame_list; - - /** - * This frame's first child. All children are handled as a - * doubly-linked list. - * - * @var Frame - */ - protected $_first_child; - - /** - * This frame's last child. - * - * @var Frame - */ - protected $_last_child; - - /** - * This frame's previous sibling in the document tree. - * - * @var Frame - */ - protected $_prev_sibling; - - /** - * This frame's next sibling in the document tree. - * - * @var Frame - */ - protected $_next_sibling; - - /** - * This frame's containing block (used in layout): array(x, y, w, h) - * - * @var float[] - */ - protected $_containing_block; - - /** - * Position on the page of the top-left corner of the margin box of - * this frame: array(x,y) - * - * @var float[] - */ - protected $_position; - - /** - * Absolute opacity of this frame - * - * @var float - */ - protected $_opacity; - - /** - * This frame's decorator - * - * @var \Dompdf\FrameDecorator\AbstractFrameDecorator - */ - protected $_decorator; - - /** - * This frame's containing line box - * - * @var LineBox - */ - protected $_containing_line; - - /** - * @var array - */ - protected $_is_cache = []; - - /** - * Tells whether the frame was already pushed to the next page - * - * @var bool - */ - public $_already_pushed = false; - - /** - * @var bool - */ - public $_float_next_line = false; - - /** - * Tells whether the frame was split - * - * @var bool - */ - public $_splitted; - - /** - * @var int - */ - public static $_ws_state = self::WS_SPACE; - - /** - * Class constructor - * - * @param \DOMNode $node the DOMNode this frame represents - */ - public function __construct(\DOMNode $node) - { - $this->_node = $node; - - $this->_parent = null; - $this->_first_child = null; - $this->_last_child = null; - $this->_prev_sibling = $this->_next_sibling = null; - - $this->_style = null; - $this->_original_style = null; - - $this->_containing_block = [ - "x" => null, - "y" => null, - "w" => null, - "h" => null, - ]; - - $this->_containing_block[0] =& $this->_containing_block["x"]; - $this->_containing_block[1] =& $this->_containing_block["y"]; - $this->_containing_block[2] =& $this->_containing_block["w"]; - $this->_containing_block[3] =& $this->_containing_block["h"]; - - $this->_position = [ - "x" => null, - "y" => null, - ]; - - $this->_position[0] =& $this->_position["x"]; - $this->_position[1] =& $this->_position["y"]; - - $this->_opacity = 1.0; - $this->_decorator = null; - - $this->set_id(self::$ID_COUNTER++); - } - - /** - * WIP : preprocessing to remove all the unused whitespace - */ - protected function ws_trim() - { - if ($this->ws_keep()) { - return; - } - - if (self::$_ws_state === self::WS_SPACE) { - $node = $this->_node; - - if ($node->nodeName === "#text" && !empty($node->nodeValue)) { - $node->nodeValue = preg_replace("/[ \t\r\n\f]+/u", " ", trim($node->nodeValue)); - self::$_ws_state = self::WS_TEXT; - } - } - } - - /** - * @return bool - */ - protected function ws_keep() - { - $whitespace = $this->get_style()->white_space; - - return in_array($whitespace, ["pre", "pre-wrap", "pre-line"]); - } - - /** - * @return bool - */ - protected function ws_is_text() - { - $node = $this->get_node(); - - if ($node->nodeName === "img") { - return true; - } - - if (!$this->is_in_flow()) { - return false; - } - - if ($this->is_text_node()) { - return trim($node->nodeValue) !== ""; - } - - return true; - } - - /** - * "Destructor": forcibly free all references held by this frame - * - * @param bool $recursive if true, call dispose on all children - */ - public function dispose($recursive = false) - { - if ($recursive) { - while ($child = $this->_first_child) { - $child->dispose(true); - } - } - - // Remove this frame from the tree - if ($this->_prev_sibling) { - $this->_prev_sibling->_next_sibling = $this->_next_sibling; - } - - if ($this->_next_sibling) { - $this->_next_sibling->_prev_sibling = $this->_prev_sibling; - } - - if ($this->_parent && $this->_parent->_first_child === $this) { - $this->_parent->_first_child = $this->_next_sibling; - } - - if ($this->_parent && $this->_parent->_last_child === $this) { - $this->_parent->_last_child = $this->_prev_sibling; - } - - if ($this->_parent) { - $this->_parent->get_node()->removeChild($this->_node); - } - - $this->_style->dispose(); - $this->_style = null; - unset($this->_style); - - $this->_original_style->dispose(); - $this->_original_style = null; - unset($this->_original_style); - } - - /** - * Re-initialize the frame - */ - public function reset() - { - $this->_position["x"] = null; - $this->_position["y"] = null; - - $this->_containing_block["x"] = null; - $this->_containing_block["y"] = null; - $this->_containing_block["w"] = null; - $this->_containing_block["h"] = null; - - $this->_style = null; - unset($this->_style); - $this->_style = clone $this->_original_style; - - // If this represents a generated node then child nodes represent generated content. - // Remove the children since the content will be generated next time this frame is reflowed. - if ($this->_node->nodeName === "dompdf_generated" && $this->_style->content != "normal") { - foreach ($this->get_children() as $child) { - $this->remove_child($child); - } - } - } - - /** - * @return \DOMElement|\DOMText - */ - public function get_node() - { - return $this->_node; - } - - /** - * @return string - */ - public function get_id() - { - return $this->_id; - } - - /** - * @return Style - */ - public function get_style() - { - return $this->_style; - } - - /** - * @return Style - */ - public function get_original_style() - { - return $this->_original_style; - } - - /** - * @return Frame - */ - public function get_parent() - { - return $this->_parent; - } - - /** - * @return \Dompdf\FrameDecorator\AbstractFrameDecorator - */ - public function get_decorator() - { - return $this->_decorator; - } - - /** - * @return Frame - */ - public function get_first_child() - { - return $this->_first_child; - } - - /** - * @return Frame - */ - public function get_last_child() - { - return $this->_last_child; - } - - /** - * @return Frame - */ - public function get_prev_sibling() - { - return $this->_prev_sibling; - } - - /** - * @return Frame - */ - public function get_next_sibling() - { - return $this->_next_sibling; - } - - /** - * @return FrameList|Frame[] - */ - public function get_children() - { - if (isset($this->_frame_list)) { - return $this->_frame_list; - } - - $this->_frame_list = new FrameList($this); - - return $this->_frame_list; - } - - // Layout property accessors - - /** - * Containing block dimensions - * - * @param $i string The key of the wanted containing block's dimension (x, y, w, h) - * - * @return float[]|float - */ - public function get_containing_block($i = null) - { - if (isset($i)) { - return $this->_containing_block[$i]; - } - - return $this->_containing_block; - } - - /** - * Block position - * - * @param $i string The key of the wanted position value (x, y) - * - * @return array|float - */ - public function get_position($i = null) - { - if (isset($i)) { - return $this->_position[$i]; - } - - return $this->_position; - } - - //........................................................................ - - /** - * Return the height of the margin box of the frame, in pt. Meaningless - * unless the height has been calculated properly. - * - * @return float - */ - public function get_margin_height() - { - $style = $this->_style; - - return ( - (float)$style->length_in_pt( - [ - $style->height, - (float)$style->length_in_pt( - [ - $style->border_top_width, - $style->border_bottom_width, - $style->margin_top, - $style->margin_bottom, - $style->padding_top, - $style->padding_bottom - ], $this->_containing_block["w"] - ) - ], - $this->_containing_block["h"] - ) - ); - } - - /** - * Return the width of the margin box of the frame, in pt. Meaningless - * unless the width has been calculated properly. - * - * @return float - */ - public function get_margin_width() - { - $style = $this->_style; - - return (float)$style->length_in_pt([ - $style->width, - $style->margin_left, - $style->margin_right, - $style->border_left_width, - $style->border_right_width, - $style->padding_left, - $style->padding_right - ], $this->_containing_block["w"]); - } - - /** - * @return float - */ - public function get_break_margins() - { - $style = $this->_style; - - return ( - (float)$style->length_in_pt( - [ - //$style->height, - (float)$style->length_in_pt( - [ - $style->border_top_width, - $style->border_bottom_width, - $style->margin_top, - $style->margin_bottom, - $style->padding_top, - $style->padding_bottom - ], $this->_containing_block["w"] - ) - ], - $this->_containing_block["h"] - ) - ); - } - - /** - * Return the content box (x,y,w,h) of the frame - * - * @return array - */ - public function get_content_box() - { - $style = $this->_style; - $cb = $this->_containing_block; - - $x = $this->_position["x"] + - (float)$style->length_in_pt( - [ - $style->margin_left, - $style->border_left_width, - $style->padding_left - ], - $cb["w"] - ); - - $y = $this->_position["y"] + - (float)$style->length_in_pt( - [ - $style->margin_top, - $style->border_top_width, - $style->padding_top - ], - $cb["w"]); - - $w = $style->length_in_pt($style->width, $cb["w"]); - - $h = $style->length_in_pt($style->height, $cb["h"]); - - return [0 => $x, "x" => $x, - 1 => $y, "y" => $y, - 2 => $w, "w" => $w, - 3 => $h, "h" => $h]; - } - - /** - * Return the padding box (x,y,w,h) of the frame - * - * @return array - */ - public function get_padding_box() - { - $style = $this->_style; - $cb = $this->_containing_block; - - $x = $this->_position["x"] + - (float)$style->length_in_pt( - [ - $style->margin_left, - $style->border_left_width - ], - $cb["w"]); - - $y = $this->_position["y"] + - (float)$style->length_in_pt( - [ - $style->margin_top, - $style->border_top_width - ], - $cb["h"] - ); - - $w = $style->length_in_pt( - [ - $style->padding_left, - $style->width, - $style->padding_right - ], - $cb["w"] - ); - - $h = $style->length_in_pt( - [ - $style->padding_top, - $style->padding_bottom, - $style->length_in_pt($style->height, $cb["h"]) - ], - $cb["w"] - ); - - return [0 => $x, "x" => $x, - 1 => $y, "y" => $y, - 2 => $w, "w" => $w, - 3 => $h, "h" => $h]; - } - - /** - * Return the border box of the frame - * - * @return array - */ - public function get_border_box() - { - $style = $this->_style; - $cb = $this->_containing_block; - - $x = $this->_position["x"] + (float)$style->length_in_pt($style->margin_left, $cb["w"]); - - $y = $this->_position["y"] + (float)$style->length_in_pt($style->margin_top, $cb["w"]); - - $w = $style->length_in_pt( - [ - $style->border_left_width, - $style->padding_left, - $style->width, - $style->padding_right, - $style->border_right_width - ], - $cb["w"]); - - $h = $style->length_in_pt( - [ - $style->border_top_width, - $style->padding_top, - $style->padding_bottom, - $style->border_bottom_width, - $style->length_in_pt($style->height, $cb["h"]) - ], - $cb["w"]); - - return [0 => $x, "x" => $x, - 1 => $y, "y" => $y, - 2 => $w, "w" => $w, - 3 => $h, "h" => $h]; - } - - /** - * @param null $opacity - * - * @return float - */ - public function get_opacity($opacity = null) - { - if ($opacity !== null) { - $this->set_opacity($opacity); - } - - return $this->_opacity; - } - - /** - * @return LineBox - */ - public function &get_containing_line() - { - return $this->_containing_line; - } - - //........................................................................ - - // Set methods - /** - * @param $id - */ - public function set_id($id) - { - $this->_id = $id; - - // We can only set attributes of DOMElement objects (nodeType == 1). - // Since these are the only objects that we can assign CSS rules to, - // this shortcoming is okay. - if ($this->_node->nodeType == XML_ELEMENT_NODE) { - $this->_node->setAttribute("frame_id", $id); - } - } - - /** - * @param Style $style - */ - public function set_style(Style $style) - { - if (is_null($this->_style)) { - $this->_original_style = clone $style; - } - - //$style->set_frame($this); - $this->_style = $style; - } - - /** - * @param \Dompdf\FrameDecorator\AbstractFrameDecorator $decorator - */ - public function set_decorator(FrameDecorator\AbstractFrameDecorator $decorator) - { - $this->_decorator = $decorator; - } - - /** - * @param null $x - * @param null $y - * @param null $w - * @param null $h - */ - public function set_containing_block($x = null, $y = null, $w = null, $h = null) - { - if (is_array($x)) { - foreach ($x as $key => $val) { - $$key = $val; - } - } - - if (is_numeric($x)) { - $this->_containing_block["x"] = $x; - } - - if (is_numeric($y)) { - $this->_containing_block["y"] = $y; - } - - if (is_numeric($w)) { - $this->_containing_block["w"] = $w; - } - - if (is_numeric($h)) { - $this->_containing_block["h"] = $h; - } - } - - /** - * @param null $x - * @param null $y - */ - public function set_position($x = null, $y = null) - { - if (is_array($x)) { - list($x, $y) = [$x["x"], $x["y"]]; - } - - if (is_numeric($x)) { - $this->_position["x"] = $x; - } - - if (is_numeric($y)) { - $this->_position["y"] = $y; - } - } - - /** - * @param $opacity - */ - public function set_opacity($opacity) - { - $parent = $this->get_parent(); - $base_opacity = (($parent && $parent->_opacity !== null) ? $parent->_opacity : 1.0); - $this->_opacity = $base_opacity * $opacity; - } - - /** - * @param LineBox $line - */ - public function set_containing_line(LineBox $line) - { - $this->_containing_line = $line; - } - - /** - * Indicates if the margin height is auto sized - * - * @return bool - */ - public function is_auto_height() - { - $style = $this->_style; - - return in_array( - "auto", - [ - $style->height, - $style->margin_top, - $style->margin_bottom, - $style->border_top_width, - $style->border_bottom_width, - $style->padding_top, - $style->padding_bottom, - $this->_containing_block["h"] - ], - true - ); - } - - /** - * Indicates if the margin width is auto sized - * - * @return bool - */ - public function is_auto_width() - { - $style = $this->_style; - - return in_array( - "auto", - [ - $style->width, - $style->margin_left, - $style->margin_right, - $style->border_left_width, - $style->border_right_width, - $style->padding_left, - $style->padding_right, - $this->_containing_block["w"] - ], - true - ); - } - - /** - * Tells if the frame is a text node - * - * @return bool - */ - public function is_text_node() - { - if (isset($this->_is_cache["text_node"])) { - return $this->_is_cache["text_node"]; - } - - return $this->_is_cache["text_node"] = ($this->get_node()->nodeName === "#text"); - } - - /** - * @return bool - */ - public function is_positionned() - { - if (isset($this->_is_cache["positionned"])) { - return $this->_is_cache["positionned"]; - } - - $position = $this->get_style()->position; - - return $this->_is_cache["positionned"] = in_array($position, Style::$POSITIONNED_TYPES); - } - - /** - * @return bool - */ - public function is_absolute() - { - if (isset($this->_is_cache["absolute"])) { - return $this->_is_cache["absolute"]; - } - - $position = $this->get_style()->position; - - return $this->_is_cache["absolute"] = ($position === "absolute" || $position === "fixed"); - } - - /** - * @return bool - */ - public function is_block() - { - if (isset($this->_is_cache["block"])) { - return $this->_is_cache["block"]; - } - - return $this->_is_cache["block"] = in_array($this->get_style()->display, Style::$BLOCK_TYPES); - } - - /** - * @return bool - */ - public function is_inline_block() - { - if (isset($this->_is_cache["inline_block"])) { - return $this->_is_cache["inline_block"]; - } - - return $this->_is_cache["inline_block"] = ($this->get_style()->display === 'inline-block'); - } - - /** - * @return bool - */ - public function is_in_flow() - { - if (isset($this->_is_cache["in_flow"])) { - return $this->_is_cache["in_flow"]; - } - return $this->_is_cache["in_flow"] = !($this->get_style()->float !== "none" || $this->is_absolute()); - } - - /** - * @return bool - */ - public function is_pre() - { - if (isset($this->_is_cache["pre"])) { - return $this->_is_cache["pre"]; - } - - $white_space = $this->get_style()->white_space; - - return $this->_is_cache["pre"] = in_array($white_space, ["pre", "pre-wrap"]); - } - - /** - * @return bool - */ - public function is_table() - { - if (isset($this->_is_cache["table"])) { - return $this->_is_cache["table"]; - } - - $display = $this->get_style()->display; - - return $this->_is_cache["table"] = in_array($display, Style::$TABLE_TYPES); - } - - - /** - * Inserts a new child at the beginning of the Frame - * - * @param $child Frame The new Frame to insert - * @param $update_node boolean Whether or not to update the DOM - */ - public function prepend_child(Frame $child, $update_node = true) - { - if ($update_node) { - $this->_node->insertBefore($child->_node, $this->_first_child ? $this->_first_child->_node : null); - } - - // Remove the child from its parent - if ($child->_parent) { - $child->_parent->remove_child($child, false); - } - - $child->_parent = $this; - $child->_prev_sibling = null; - - // Handle the first child - if (!$this->_first_child) { - $this->_first_child = $child; - $this->_last_child = $child; - $child->_next_sibling = null; - } else { - $this->_first_child->_prev_sibling = $child; - $child->_next_sibling = $this->_first_child; - $this->_first_child = $child; - } - } - - /** - * Inserts a new child at the end of the Frame - * - * @param $child Frame The new Frame to insert - * @param $update_node boolean Whether or not to update the DOM - */ - public function append_child(Frame $child, $update_node = true) - { - if ($update_node) { - $this->_node->appendChild($child->_node); - } - - // Remove the child from its parent - if ($child->_parent) { - $child->_parent->remove_child($child, false); - } - - $child->_parent = $this; - $decorator = $child->get_decorator(); - // force an update to the cached parent - if ($decorator !== null) { - $decorator->get_parent(false); - } - $child->_next_sibling = null; - - // Handle the first child - if (!$this->_last_child) { - $this->_first_child = $child; - $this->_last_child = $child; - $child->_prev_sibling = null; - } else { - $this->_last_child->_next_sibling = $child; - $child->_prev_sibling = $this->_last_child; - $this->_last_child = $child; - } - } - - /** - * Inserts a new child immediately before the specified frame - * - * @param $new_child Frame The new Frame to insert - * @param $ref Frame The Frame after the new Frame - * @param $update_node boolean Whether or not to update the DOM - * - * @throws Exception - */ - public function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) - { - if ($ref === $this->_first_child) { - $this->prepend_child($new_child, $update_node); - - return; - } - - if (is_null($ref)) { - $this->append_child($new_child, $update_node); - - return; - } - - if ($ref->_parent !== $this) { - throw new Exception("Reference child is not a child of this node."); - } - - // Update the node - if ($update_node) { - $this->_node->insertBefore($new_child->_node, $ref->_node); - } - - // Remove the child from its parent - if ($new_child->_parent) { - $new_child->_parent->remove_child($new_child, false); - } - - $new_child->_parent = $this; - $new_child->_next_sibling = $ref; - $new_child->_prev_sibling = $ref->_prev_sibling; - - if ($ref->_prev_sibling) { - $ref->_prev_sibling->_next_sibling = $new_child; - } - - $ref->_prev_sibling = $new_child; - } - - /** - * Inserts a new child immediately after the specified frame - * - * @param $new_child Frame The new Frame to insert - * @param $ref Frame The Frame before the new Frame - * @param $update_node boolean Whether or not to update the DOM - * - * @throws Exception - */ - public function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) - { - if ($ref === $this->_last_child) { - $this->append_child($new_child, $update_node); - - return; - } - - if (is_null($ref)) { - $this->prepend_child($new_child, $update_node); - - return; - } - - if ($ref->_parent !== $this) { - throw new Exception("Reference child is not a child of this node."); - } - - // Update the node - if ($update_node) { - if ($ref->_next_sibling) { - $next_node = $ref->_next_sibling->_node; - $this->_node->insertBefore($new_child->_node, $next_node); - } else { - $new_child->_node = $this->_node->appendChild($new_child->_node); - } - } - - // Remove the child from its parent - if ($new_child->_parent) { - $new_child->_parent->remove_child($new_child, false); - } - - $new_child->_parent = $this; - $new_child->_prev_sibling = $ref; - $new_child->_next_sibling = $ref->_next_sibling; - - if ($ref->_next_sibling) { - $ref->_next_sibling->_prev_sibling = $new_child; - } - - $ref->_next_sibling = $new_child; - } - - /** - * Remove a child frame - * - * @param Frame $child - * @param boolean $update_node Whether or not to remove the DOM node - * - * @throws Exception - * @return Frame The removed child frame - */ - public function remove_child(Frame $child, $update_node = true) - { - if ($child->_parent !== $this) { - throw new Exception("Child not found in this frame"); - } - - if ($update_node) { - $this->_node->removeChild($child->_node); - } - - if ($child === $this->_first_child) { - $this->_first_child = $child->_next_sibling; - } - - if ($child === $this->_last_child) { - $this->_last_child = $child->_prev_sibling; - } - - if ($child->_prev_sibling) { - $child->_prev_sibling->_next_sibling = $child->_next_sibling; - } - - if ($child->_next_sibling) { - $child->_next_sibling->_prev_sibling = $child->_prev_sibling; - } - - $child->_next_sibling = null; - $child->_prev_sibling = null; - $child->_parent = null; - - return $child; - } - - //........................................................................ - - // Debugging function: - /** - * @return string - */ - public function __toString() - { - // Skip empty text frames -// if ( $this->is_text_node() && -// preg_replace("/\s/", "", $this->_node->data) === "" ) -// return ""; - - - $str = "" . $this->_node->nodeName . ":
"; - //$str .= spl_object_hash($this->_node) . "
"; - $str .= "Id: " . $this->get_id() . "
"; - $str .= "Class: " . get_class($this) . "
"; - - if ($this->is_text_node()) { - $tmp = htmlspecialchars($this->_node->nodeValue); - $str .= "
'" . mb_substr($tmp, 0, 70) .
-                (mb_strlen($tmp) > 70 ? "..." : "") . "'
"; - } elseif ($css_class = $this->_node->getAttribute("class")) { - $str .= "CSS class: '$css_class'
"; - } - - if ($this->_parent) { - $str .= "\nParent:" . $this->_parent->_node->nodeName . - " (" . spl_object_hash($this->_parent->_node) . ") " . - "
"; - } - - if ($this->_prev_sibling) { - $str .= "Prev: " . $this->_prev_sibling->_node->nodeName . - " (" . spl_object_hash($this->_prev_sibling->_node) . ") " . - "
"; - } - - if ($this->_next_sibling) { - $str .= "Next: " . $this->_next_sibling->_node->nodeName . - " (" . spl_object_hash($this->_next_sibling->_node) . ") " . - "
"; - } - - $d = $this->get_decorator(); - while ($d && $d != $d->get_decorator()) { - $str .= "Decorator: " . get_class($d) . "
"; - $d = $d->get_decorator(); - } - - $str .= "Position: " . Helpers::pre_r($this->_position, true); - $str .= "\nContaining block: " . Helpers::pre_r($this->_containing_block, true); - $str .= "\nMargin width: " . Helpers::pre_r($this->get_margin_width(), true); - $str .= "\nMargin height: " . Helpers::pre_r($this->get_margin_height(), true); - - $str .= "\nStyle:
" . $this->_style->__toString() . "
"; - - if ($this->_decorator instanceof FrameDecorator\Block) { - $str .= "Lines:
";
-            foreach ($this->_decorator->get_line_boxes() as $line) {
-                foreach ($line->get_frames() as $frame) {
-                    if ($frame instanceof FrameDecorator\Text) {
-                        $str .= "\ntext: ";
-                        $str .= "'" . htmlspecialchars($frame->get_text()) . "'";
-                    } else {
-                        $str .= "\nBlock: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")";
-                    }
-                }
-
-                $str .=
-                    "\ny => " . $line->y . "\n" .
-                    "w => " . $line->w . "\n" .
-                    "h => " . $line->h . "\n" .
-                    "left => " . $line->left . "\n" .
-                    "right => " . $line->right . "\n";
-            }
-            $str .= "
"; - } - - $str .= "\n"; - if (php_sapi_name() === "cli") { - $str = strip_tags(str_replace(["
", "", ""], - ["\n", "", ""], - $str)); - } - - return $str; - } -} \ No newline at end of file diff --git a/vendor/dompdf/dompdf/src/Frame/Factory.php b/vendor/dompdf/dompdf/src/Frame/Factory.php deleted file mode 100644 index e14f75b..0000000 --- a/vendor/dompdf/dompdf/src/Frame/Factory.php +++ /dev/null @@ -1,287 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Frame; - -use Dompdf\Css\Style; -use Dompdf\Dompdf; -use Dompdf\Exception; -use Dompdf\Frame; -use Dompdf\FrameDecorator\AbstractFrameDecorator; -use DOMXPath; -use Dompdf\FrameDecorator\Page as PageFrameDecorator; -use Dompdf\FrameReflower\Page as PageFrameReflower; -use Dompdf\Positioner\AbstractPositioner; - -/** - * Contains frame decorating logic - * - * This class is responsible for assigning the correct {@link AbstractFrameDecorator}, - * {@link AbstractPositioner}, and {@link AbstractFrameReflower} objects to {@link Frame} - * objects. This is determined primarily by the Frame's display type, but - * also by the Frame's node's type (e.g. DomElement vs. #text) - * - * @access private - * @package dompdf - */ -class Factory -{ - - /** - * Array of positioners for specific frame types - * - * @var AbstractPositioner[] - */ - protected static $_positioners; - - /** - * Decorate the root Frame - * - * @param $root Frame The frame to decorate - * @param $dompdf Dompdf The dompdf instance - * - * @return PageFrameDecorator - */ - static function decorate_root(Frame $root, Dompdf $dompdf) - { - $frame = new PageFrameDecorator($root, $dompdf); - $frame->set_reflower(new PageFrameReflower($frame)); - $root->set_decorator($frame); - - return $frame; - } - - /** - * Decorate a Frame - * - * @param Frame $frame The frame to decorate - * @param Dompdf $dompdf The dompdf instance - * @param Frame $root The frame to decorate - * - * @throws Exception - * @return AbstractFrameDecorator - * FIXME: this is admittedly a little smelly... - */ - static function decorate_frame(Frame $frame, Dompdf $dompdf, Frame $root = null) - { - if (is_null($dompdf)) { - throw new Exception("The DOMPDF argument is required"); - } - - $style = $frame->get_style(); - - // Floating (and more generally out-of-flow) elements are blocks - // http://coding.smashingmagazine.com/2007/05/01/css-float-theory-things-you-should-know/ - if (!$frame->is_in_flow() && in_array($style->display, Style::$INLINE_TYPES)) { - $style->display = "block"; - } - - $display = $style->display; - - switch ($display) { - - case "flex": //FIXME: display type not yet supported - case "table-caption": //FIXME: display type not yet supported - case "block": - $positioner = "Block"; - $decorator = "Block"; - $reflower = "Block"; - break; - - case "inline-flex": //FIXME: display type not yet supported - case "inline-block": - $positioner = "Inline"; - $decorator = "Block"; - $reflower = "Block"; - break; - - case "inline": - $positioner = "Inline"; - if ($frame->is_text_node()) { - $decorator = "Text"; - $reflower = "Text"; - } else { - if ($style->float !== "none") { - $decorator = "Block"; - $reflower = "Block"; - } else { - $decorator = "Inline"; - $reflower = "Inline"; - } - } - break; - - case "table": - $positioner = "Block"; - $decorator = "Table"; - $reflower = "Table"; - break; - - case "inline-table": - $positioner = "Inline"; - $decorator = "Table"; - $reflower = "Table"; - break; - - case "table-row-group": - case "table-header-group": - case "table-footer-group": - $positioner = "NullPositioner"; - $decorator = "TableRowGroup"; - $reflower = "TableRowGroup"; - break; - - case "table-row": - $positioner = "NullPositioner"; - $decorator = "TableRow"; - $reflower = "TableRow"; - break; - - case "table-cell": - $positioner = "TableCell"; - $decorator = "TableCell"; - $reflower = "TableCell"; - break; - - case "list-item": - $positioner = "Block"; - $decorator = "Block"; - $reflower = "Block"; - break; - - case "-dompdf-list-bullet": - if ($style->list_style_position === "inside") { - $positioner = "Inline"; - } else { - $positioner = "ListBullet"; - } - - if ($style->list_style_image !== "none") { - $decorator = "ListBulletImage"; - } else { - $decorator = "ListBullet"; - } - - $reflower = "ListBullet"; - break; - - case "-dompdf-image": - $positioner = "Inline"; - $decorator = "Image"; - $reflower = "Image"; - break; - - case "-dompdf-br": - $positioner = "Inline"; - $decorator = "Inline"; - $reflower = "Inline"; - break; - - default: - // FIXME: should throw some sort of warning or something? - case "none": - if ($style->_dompdf_keep !== "yes") { - // Remove the node and the frame - $frame->get_parent()->remove_child($frame); - return; - } - - $positioner = "NullPositioner"; - $decorator = "NullFrameDecorator"; - $reflower = "NullFrameReflower"; - break; - } - - // Handle CSS position - $position = $style->position; - - if ($position === "absolute") { - $positioner = "Absolute"; - } else { - if ($position === "fixed") { - $positioner = "Fixed"; - } - } - - $node = $frame->get_node(); - - // Handle nodeName - if ($node->nodeName === "img") { - $style->display = "-dompdf-image"; - $decorator = "Image"; - $reflower = "Image"; - } - - $decorator = "Dompdf\\FrameDecorator\\$decorator"; - $reflower = "Dompdf\\FrameReflower\\$reflower"; - - /** @var AbstractFrameDecorator $deco */ - $deco = new $decorator($frame, $dompdf); - - $deco->set_positioner(self::getPositionerInstance($positioner)); - $deco->set_reflower(new $reflower($deco, $dompdf->getFontMetrics())); - - if ($root) { - $deco->set_root($root); - } - - if ($display === "list-item") { - // Insert a list-bullet frame - $xml = $dompdf->getDom(); - $bullet_node = $xml->createElement("bullet"); // arbitrary choice - $b_f = new Frame($bullet_node); - - $node = $frame->get_node(); - $parent_node = $node->parentNode; - - if ($parent_node) { - if (!$parent_node->hasAttribute("dompdf-children-count")) { - $xpath = new DOMXPath($xml); - $count = $xpath->query("li", $parent_node)->length; - $parent_node->setAttribute("dompdf-children-count", $count); - } - - if (is_numeric($node->getAttribute("value"))) { - $index = intval($node->getAttribute("value")); - } else { - if (!$parent_node->hasAttribute("dompdf-counter")) { - $index = ($parent_node->hasAttribute("start") ? $parent_node->getAttribute("start") : 1); - } else { - $index = (int)$parent_node->getAttribute("dompdf-counter") + 1; - } - } - - $parent_node->setAttribute("dompdf-counter", $index); - $bullet_node->setAttribute("dompdf-counter", $index); - } - - $new_style = $dompdf->getCss()->create_style(); - $new_style->display = "-dompdf-list-bullet"; - $new_style->inherit($style); - $b_f->set_style($new_style); - - $deco->prepend_child(Factory::decorate_frame($b_f, $dompdf, $root)); - } - - return $deco; - } - - /** - * Creates Positioners - * - * @param string $type type of positioner to use - * @return AbstractPositioner - */ - protected static function getPositionerInstance($type) - { - if (!isset(self::$_positioners[$type])) { - $class = '\\Dompdf\\Positioner\\'.$type; - self::$_positioners[$type] = new $class(); - } - return self::$_positioners[$type]; - } -} diff --git a/vendor/dompdf/dompdf/src/Frame/FrameList.php b/vendor/dompdf/dompdf/src/Frame/FrameList.php deleted file mode 100644 index 37d9990..0000000 --- a/vendor/dompdf/dompdf/src/Frame/FrameList.php +++ /dev/null @@ -1,35 +0,0 @@ -_frame = $frame; - } - - /** - * @return FrameListIterator - */ - function getIterator() - { - return new FrameListIterator($this->_frame); - } -} diff --git a/vendor/dompdf/dompdf/src/Frame/FrameListIterator.php b/vendor/dompdf/dompdf/src/Frame/FrameListIterator.php deleted file mode 100644 index ada9dde..0000000 --- a/vendor/dompdf/dompdf/src/Frame/FrameListIterator.php +++ /dev/null @@ -1,91 +0,0 @@ -_parent = $frame; - $this->_cur = $frame->get_first_child(); - $this->_num = 0; - } - - /** - * - */ - public function rewind() - { - $this->_cur = $this->_parent->get_first_child(); - $this->_num = 0; - } - - /** - * @return bool - */ - public function valid() - { - return isset($this->_cur); // && ($this->_cur->get_prev_sibling() === $this->_prev); - } - - /** - * @return int - */ - public function key() - { - return $this->_num; - } - - /** - * @return Frame - */ - public function current() - { - return $this->_cur; - } - - /** - * @return Frame - */ - public function next() - { - $ret = $this->_cur; - if (!$ret) { - return null; - } - - $this->_cur = $this->_cur->get_next_sibling(); - $this->_num++; - return $ret; - } -} \ No newline at end of file diff --git a/vendor/dompdf/dompdf/src/Frame/FrameTree.php b/vendor/dompdf/dompdf/src/Frame/FrameTree.php deleted file mode 100644 index 944d12b..0000000 --- a/vendor/dompdf/dompdf/src/Frame/FrameTree.php +++ /dev/null @@ -1,315 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -/** - * Represents an entire document as a tree of frames - * - * The FrameTree consists of {@link Frame} objects each tied to specific - * DOMNode objects in a specific DomDocument. The FrameTree has the same - * structure as the DomDocument, but adds additional capabilities for - * styling and layout. - * - * @package dompdf - */ -class FrameTree -{ - /** - * Tags to ignore while parsing the tree - * - * @var array - */ - protected static $HIDDEN_TAGS = [ - "area", - "base", - "basefont", - "head", - "style", - "meta", - "title", - "colgroup", - "noembed", - "param", - "#comment" - ]; - - /** - * The main DomDocument - * - * @see http://ca2.php.net/manual/en/ref.dom.php - * @var DOMDocument - */ - protected $_dom; - - /** - * The root node of the FrameTree. - * - * @var Frame - */ - protected $_root; - - /** - * Subtrees of absolutely positioned elements - * - * @var array of Frames - */ - protected $_absolute_frames; - - /** - * A mapping of {@link Frame} objects to DOMNode objects - * - * @var array - */ - protected $_registry; - - /** - * Class constructor - * - * @param DOMDocument $dom the main DomDocument object representing the current html document - */ - public function __construct(DomDocument $dom) - { - $this->_dom = $dom; - $this->_root = null; - $this->_registry = []; - } - - /** - * Returns the DOMDocument object representing the current html document - * - * @return DOMDocument - */ - public function get_dom() - { - return $this->_dom; - } - - /** - * Returns the root frame of the tree - * - * @return Frame - */ - public function get_root() - { - return $this->_root; - } - - /** - * Returns a specific frame given its id - * - * @param string $id - * - * @return Frame|null - */ - public function get_frame($id) - { - return isset($this->_registry[$id]) ? $this->_registry[$id] : null; - } - - /** - * Returns a post-order iterator for all frames in the tree - * - * @return FrameTreeList|Frame[] - */ - public function get_frames() - { - return new FrameTreeList($this->_root); - } - - /** - * Builds the tree - */ - public function build_tree() - { - $html = $this->_dom->getElementsByTagName("html")->item(0); - if (is_null($html)) { - $html = $this->_dom->firstChild; - } - - if (is_null($html)) { - throw new Exception("Requested HTML document contains no data."); - } - - $this->fix_tables(); - - $this->_root = $this->_build_tree_r($html); - } - - /** - * Adds missing TBODYs around TR - */ - protected function fix_tables() - { - $xp = new DOMXPath($this->_dom); - - // Move table caption before the table - // FIXME find a better way to deal with it... - $captions = $xp->query('//table/caption'); - foreach ($captions as $caption) { - $table = $caption->parentNode; - $table->parentNode->insertBefore($caption, $table); - } - - $firstRows = $xp->query('//table/tr[1]'); - /** @var DOMElement $tableChild */ - foreach ($firstRows as $tableChild) { - $tbody = $this->_dom->createElement('tbody'); - $tableNode = $tableChild->parentNode; - do { - if ($tableChild->nodeName === 'tr') { - $tmpNode = $tableChild; - $tableChild = $tableChild->nextSibling; - $tableNode->removeChild($tmpNode); - $tbody->appendChild($tmpNode); - } else { - if ($tbody->hasChildNodes() === true) { - $tableNode->insertBefore($tbody, $tableChild); - $tbody = $this->_dom->createElement('tbody'); - } - $tableChild = $tableChild->nextSibling; - } - } while ($tableChild); - if ($tbody->hasChildNodes() === true) { - $tableNode->appendChild($tbody); - } - } - } - - // FIXME: temporary hack, preferably we will improve rendering of sequential #text nodes - /** - * Remove a child from a node - * - * Remove a child from a node. If the removed node results in two - * adjacent #text nodes then combine them. - * - * @param DOMNode $node the current DOMNode being considered - * @param array $children an array of nodes that are the children of $node - * @param int $index index from the $children array of the node to remove - */ - protected function _remove_node(DOMNode $node, array &$children, $index) - { - $child = $children[$index]; - $previousChild = $child->previousSibling; - $nextChild = $child->nextSibling; - $node->removeChild($child); - if (isset($previousChild, $nextChild)) { - if ($previousChild->nodeName === "#text" && $nextChild->nodeName === "#text") { - $previousChild->nodeValue .= $nextChild->nodeValue; - $this->_remove_node($node, $children, $index+1); - } - } - array_splice($children, $index, 1); - } - - /** - * Recursively adds {@link Frame} objects to the tree - * - * Recursively build a tree of Frame objects based on a dom tree. - * No layout information is calculated at this time, although the - * tree may be adjusted (i.e. nodes and frames for generated content - * and images may be created). - * - * @param DOMNode $node the current DOMNode being considered - * - * @return Frame - */ - protected function _build_tree_r(DOMNode $node) - { - $frame = new Frame($node); - $id = $frame->get_id(); - $this->_registry[$id] = $frame; - - if (!$node->hasChildNodes()) { - return $frame; - } - - // Store the children in an array so that the tree can be modified - $children = []; - $length = $node->childNodes->length; - for ($i = 0; $i < $length; $i++) { - $children[] = $node->childNodes->item($i); - } - $index = 0; - // INFO: We don't advance $index if a node is removed to avoid skipping nodes - while ($index < count($children)) { - $child = $children[$index]; - $nodeName = strtolower($child->nodeName); - - // Skip non-displaying nodes - if (in_array($nodeName, self::$HIDDEN_TAGS)) { - if ($nodeName !== "head" && $nodeName !== "style") { - $this->_remove_node($node, $children, $index); - } else { - $index++; - } - continue; - } - // Skip empty text nodes - if ($nodeName === "#text" && $child->nodeValue === "") { - $this->_remove_node($node, $children, $index); - continue; - } - // Skip empty image nodes - if ($nodeName === "img" && $child->getAttribute("src") === "") { - $this->_remove_node($node, $children, $index); - continue; - } - - if (is_object($child)) { - $frame->append_child($this->_build_tree_r($child), false); - } - $index++; - } - - return $frame; - } - - /** - * @param DOMElement $node - * @param DOMElement $new_node - * @param string $pos - * - * @return mixed - */ - public function insert_node(DOMElement $node, DOMElement $new_node, $pos) - { - if ($pos === "after" || !$node->firstChild) { - $node->appendChild($new_node); - } else { - $node->insertBefore($new_node, $node->firstChild); - } - - $this->_build_tree_r($new_node); - - $frame_id = $new_node->getAttribute("frame_id"); - $frame = $this->get_frame($frame_id); - - $parent_id = $node->getAttribute("frame_id"); - $parent = $this->get_frame($parent_id); - - if ($parent) { - if ($pos === "before") { - $parent->prepend_child($frame, false); - } else { - $parent->append_child($frame, false); - } - } - - return $frame_id; - } -} \ No newline at end of file diff --git a/vendor/dompdf/dompdf/src/Frame/FrameTreeIterator.php b/vendor/dompdf/dompdf/src/Frame/FrameTreeIterator.php deleted file mode 100644 index d1d82c2..0000000 --- a/vendor/dompdf/dompdf/src/Frame/FrameTreeIterator.php +++ /dev/null @@ -1,96 +0,0 @@ -_stack[] = $this->_root = $root; - $this->_num = 0; - } - - /** - * - */ - public function rewind() - { - $this->_stack = [$this->_root]; - $this->_num = 0; - } - - /** - * @return bool - */ - public function valid() - { - return count($this->_stack) > 0; - } - - /** - * @return int - */ - public function key() - { - return $this->_num; - } - - /** - * @return Frame - */ - public function current() - { - return end($this->_stack); - } - - /** - * @return Frame - */ - public function next() - { - $b = end($this->_stack); - - // Pop last element - unset($this->_stack[key($this->_stack)]); - $this->_num++; - - // Push all children onto the stack in reverse order - if ($c = $b->get_last_child()) { - $this->_stack[] = $c; - while ($c = $c->get_prev_sibling()) { - $this->_stack[] = $c; - } - } - - return $b; - } -} - diff --git a/vendor/dompdf/dompdf/src/Frame/FrameTreeList.php b/vendor/dompdf/dompdf/src/Frame/FrameTreeList.php deleted file mode 100644 index f8b996c..0000000 --- a/vendor/dompdf/dompdf/src/Frame/FrameTreeList.php +++ /dev/null @@ -1,35 +0,0 @@ -_root = $root; - } - - /** - * @return FrameTreeIterator - */ - public function getIterator() - { - return new FrameTreeIterator($this->_root); - } -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/AbstractFrameDecorator.php b/vendor/dompdf/dompdf/src/FrameDecorator/AbstractFrameDecorator.php deleted file mode 100644 index eb86341..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/AbstractFrameDecorator.php +++ /dev/null @@ -1,915 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -/** - * Base AbstractFrameDecorator class - * - * @package dompdf - */ -abstract class AbstractFrameDecorator extends Frame -{ - const DEFAULT_COUNTER = "-dompdf-default-counter"; - - public $_counters = []; // array([id] => counter_value) (for generated content) - - /** - * The root node of the DOM tree - * - * @var Frame - */ - protected $_root; - - /** - * The decorated frame - * - * @var Frame - */ - protected $_frame; - - /** - * AbstractPositioner object used to position this frame (Strategy pattern) - * - * @var AbstractPositioner - */ - protected $_positioner; - - /** - * Reflower object used to calculate frame dimensions (Strategy pattern) - * - * @var \Dompdf\FrameReflower\AbstractFrameReflower - */ - protected $_reflower; - - /** - * Reference to the current dompdf instance - * - * @var Dompdf - */ - protected $_dompdf; - - /** - * First block parent - * - * @var Block - */ - private $_block_parent; - - /** - * First positionned parent (position: relative | absolute | fixed) - * - * @var AbstractFrameDecorator - */ - private $_positionned_parent; - - /** - * Cache for the get_parent while loop results - * - * @var Frame - */ - private $_cached_parent; - - /** - * Class constructor - * - * @param Frame $frame The decoration target - * @param Dompdf $dompdf The Dompdf object - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - $this->_frame = $frame; - $this->_root = null; - $this->_dompdf = $dompdf; - $frame->set_decorator($this); - } - - /** - * "Destructor": foribly free all references held by this object - * - * @param bool $recursive if true, call dispose on all children - */ - function dispose($recursive = false) - { - if ($recursive) { - while ($child = $this->get_first_child()) { - $child->dispose(true); - } - } - - $this->_root = null; - unset($this->_root); - - $this->_frame->dispose(true); - $this->_frame = null; - unset($this->_frame); - - $this->_positioner = null; - unset($this->_positioner); - - $this->_reflower = null; - unset($this->_reflower); - } - - /** - * Return a copy of this frame with $node as its node - * - * @param DOMNode $node - * - * @return Frame - */ - function copy(DOMNode $node) - { - $frame = new Frame($node); - $frame->set_style(clone $this->_frame->get_original_style()); - - return Factory::decorate_frame($frame, $this->_dompdf, $this->_root); - } - - /** - * Create a deep copy: copy this node and all children - * - * @return Frame - */ - function deep_copy() - { - $node = $this->_frame->get_node(); - - if ($node instanceof DOMElement && $node->hasAttribute("id")) { - $node->setAttribute("data-dompdf-original-id", $node->getAttribute("id")); - $node->removeAttribute("id"); - } - - $frame = new Frame($node->cloneNode()); - $frame->set_style(clone $this->_frame->get_original_style()); - - $deco = Factory::decorate_frame($frame, $this->_dompdf, $this->_root); - - foreach ($this->get_children() as $child) { - $deco->append_child($child->deep_copy()); - } - - return $deco; - } - - /** - * Delegate calls to decorated frame object - */ - function reset() - { - $this->_frame->reset(); - - $this->_counters = []; - - $this->_cached_parent = null; //clear get_parent() cache - - // Reset all children - foreach ($this->get_children() as $child) { - $child->reset(); - } - } - - // Getters ----------- - - /** - * @return string - */ - function get_id() - { - return $this->_frame->get_id(); - } - - /** - * @return Frame - */ - function get_frame() - { - return $this->_frame; - } - - /** - * @return DOMElement|DOMText - */ - function get_node() - { - return $this->_frame->get_node(); - } - - /** - * @return Style - */ - function get_style() - { - return $this->_frame->get_style(); - } - - /** - * @return Style - */ - function get_original_style() - { - return $this->_frame->get_original_style(); - } - - /** - * @param integer $i - * - * @return array|float - */ - function get_containing_block($i = null) - { - return $this->_frame->get_containing_block($i); - } - - /** - * @param integer $i - * - * @return array|float - */ - function get_position($i = null) - { - return $this->_frame->get_position($i); - } - - /** - * @return Dompdf - */ - function get_dompdf() - { - return $this->_dompdf; - } - - /** - * @return float - */ - function get_margin_height() - { - return $this->_frame->get_margin_height(); - } - - /** - * @return float - */ - function get_margin_width() - { - return $this->_frame->get_margin_width(); - } - - /** - * @return array - */ - function get_content_box() - { - return $this->_frame->get_content_box(); - } - - /** - * @return array - */ - function get_padding_box() - { - return $this->_frame->get_padding_box(); - } - - /** - * @return array - */ - function get_border_box() - { - return $this->_frame->get_border_box(); - } - - /** - * @param integer $id - */ - function set_id($id) - { - $this->_frame->set_id($id); - } - - /** - * @param Style $style - */ - function set_style(Style $style) - { - $this->_frame->set_style($style); - } - - /** - * @param float $x - * @param float $y - * @param float $w - * @param float $h - */ - function set_containing_block($x = null, $y = null, $w = null, $h = null) - { - $this->_frame->set_containing_block($x, $y, $w, $h); - } - - /** - * @param float $x - * @param float $y - */ - function set_position($x = null, $y = null) - { - $this->_frame->set_position($x, $y); - } - - /** - * @return bool - */ - function is_auto_height() - { - return $this->_frame->is_auto_height(); - } - - /** - * @return bool - */ - function is_auto_width() - { - return $this->_frame->is_auto_width(); - } - - /** - * @return string - */ - function __toString() - { - return $this->_frame->__toString(); - } - - /** - * @param Frame $child - * @param bool $update_node - */ - function prepend_child(Frame $child, $update_node = true) - { - while ($child instanceof AbstractFrameDecorator) { - $child = $child->_frame; - } - - $this->_frame->prepend_child($child, $update_node); - } - - /** - * @param Frame $child - * @param bool $update_node - */ - function append_child(Frame $child, $update_node = true) - { - while ($child instanceof AbstractFrameDecorator) { - $child = $child->_frame; - } - - $this->_frame->append_child($child, $update_node); - } - - /** - * @param Frame $new_child - * @param Frame $ref - * @param bool $update_node - */ - function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) - { - while ($new_child instanceof AbstractFrameDecorator) { - $new_child = $new_child->_frame; - } - - if ($ref instanceof AbstractFrameDecorator) { - $ref = $ref->_frame; - } - - $this->_frame->insert_child_before($new_child, $ref, $update_node); - } - - /** - * @param Frame $new_child - * @param Frame $ref - * @param bool $update_node - */ - function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) - { - $insert_frame = $new_child; - while ($insert_frame instanceof AbstractFrameDecorator) { - $insert_frame = $insert_frame->_frame; - } - - $reference_frame = $ref; - while ($reference_frame instanceof AbstractFrameDecorator) { - $reference_frame = $reference_frame->_frame; - } - - $this->_frame->insert_child_after($insert_frame, $reference_frame, $update_node); - } - - /** - * @param Frame $child - * @param bool $update_node - * - * @return Frame - */ - function remove_child(Frame $child, $update_node = true) - { - while ($child instanceof AbstractFrameDecorator) { - $child = $child->_frame; - } - - return $this->_frame->remove_child($child, $update_node); - } - - /** - * @param bool $use_cache - * @return AbstractFrameDecorator - */ - function get_parent($use_cache = true) - { - if ($use_cache && $this->_cached_parent) { - return $this->_cached_parent; - } - $p = $this->_frame->get_parent(); - if ($p && $deco = $p->get_decorator()) { - while ($tmp = $deco->get_decorator()) { - $deco = $tmp; - } - - return $this->_cached_parent = $deco; - } else { - return $this->_cached_parent = $p; - } - } - - /** - * @return AbstractFrameDecorator - */ - function get_first_child() - { - $c = $this->_frame->get_first_child(); - if ($c && $deco = $c->get_decorator()) { - while ($tmp = $deco->get_decorator()) { - $deco = $tmp; - } - - return $deco; - } else { - if ($c) { - return $c; - } - } - - return null; - } - - /** - * @return AbstractFrameDecorator - */ - function get_last_child() - { - $c = $this->_frame->get_last_child(); - if ($c && $deco = $c->get_decorator()) { - while ($tmp = $deco->get_decorator()) { - $deco = $tmp; - } - - return $deco; - } else { - if ($c) { - return $c; - } - } - - return null; - } - - /** - * @return AbstractFrameDecorator - */ - function get_prev_sibling() - { - $s = $this->_frame->get_prev_sibling(); - if ($s && $deco = $s->get_decorator()) { - while ($tmp = $deco->get_decorator()) { - $deco = $tmp; - } - - return $deco; - } else { - if ($s) { - return $s; - } - } - - return null; - } - - /** - * @return AbstractFrameDecorator - */ - function get_next_sibling() - { - $s = $this->_frame->get_next_sibling(); - if ($s && $deco = $s->get_decorator()) { - while ($tmp = $deco->get_decorator()) { - $deco = $tmp; - } - - return $deco; - } else { - if ($s) { - return $s; - } - } - - return null; - } - - /** - * @return FrameTreeList - */ - function get_subtree() - { - return new FrameTreeList($this); - } - - function set_positioner(AbstractPositioner $posn) - { - $this->_positioner = $posn; - if ($this->_frame instanceof AbstractFrameDecorator) { - $this->_frame->set_positioner($posn); - } - } - - function set_reflower(AbstractFrameReflower $reflower) - { - $this->_reflower = $reflower; - if ($this->_frame instanceof AbstractFrameDecorator) { - $this->_frame->set_reflower($reflower); - } - } - - /** - * @return \Dompdf\FrameReflower\AbstractFrameReflower - */ - function get_reflower() - { - return $this->_reflower; - } - - /** - * @param Frame $root - */ - function set_root(Frame $root) - { - $this->_root = $root; - - if ($this->_frame instanceof AbstractFrameDecorator) { - $this->_frame->set_root($root); - } - } - - /** - * @return Page - */ - function get_root() - { - return $this->_root; - } - - /** - * @return Block - */ - function find_block_parent() - { - // Find our nearest block level parent - $p = $this->get_parent(); - - while ($p) { - if ($p->is_block()) { - break; - } - - $p = $p->get_parent(); - } - - return $this->_block_parent = $p; - } - - /** - * @return AbstractFrameDecorator - */ - function find_positionned_parent() - { - // Find our nearest relative positionned parent - $p = $this->get_parent(); - while ($p) { - if ($p->is_positionned()) { - break; - } - - $p = $p->get_parent(); - } - - if (!$p) { - $p = $this->_root->get_first_child(); // - } - - return $this->_positionned_parent = $p; - } - - /** - * split this frame at $child. - * The current frame is cloned and $child and all children following - * $child are added to the clone. The clone is then passed to the - * current frame's parent->split() method. - * - * @param Frame $child - * @param boolean $force_pagebreak - * - * @throws Exception - * @return void - */ - function split(Frame $child = null, $force_pagebreak = false) - { - // decrement any counters that were incremented on the current node, unless that node is the body - $style = $this->_frame->get_style(); - if ( - $this->_frame->get_node()->nodeName !== "body" && - $style->counter_increment && - ($decrement = $style->counter_increment) !== "none" - ) { - $this->decrement_counters($decrement); - } - - if (is_null($child)) { - // check for counter increment on :before content (always a child of the selected element @link AbstractFrameReflower::_set_content) - // this can push the current node to the next page before counter rules have bubbled up (but only if - // it's been rendered, thus the position check) - if (!$this->is_text_node() && $this->get_node()->hasAttribute("dompdf_before_frame_id")) { - foreach ($this->_frame->get_children() as $child) { - if ( - $this->get_node()->getAttribute("dompdf_before_frame_id") == $child->get_id() && - $child->get_position('x') !== null - ) { - $style = $child->get_style(); - if ($style->counter_increment && ($decrement = $style->counter_increment) !== "none") { - $this->decrement_counters($decrement); - } - } - } - } - $this->get_parent()->split($this, $force_pagebreak); - - return; - } - - if ($child->get_parent() !== $this) { - throw new Exception("Unable to split: frame is not a child of this one."); - } - - $node = $this->_frame->get_node(); - - if ($node instanceof DOMElement && $node->hasAttribute("id")) { - $node->setAttribute("data-dompdf-original-id", $node->getAttribute("id")); - $node->removeAttribute("id"); - } - - $split = $this->copy($node->cloneNode()); - $split->reset(); - $split->get_original_style()->text_indent = 0; - $split->_splitted = true; - $split->_already_pushed = true; - - // The body's properties must be kept - if ($node->nodeName !== "body") { - // Style reset on the first and second parts - $style = $this->_frame->get_style(); - $style->margin_bottom = 0; - $style->padding_bottom = 0; - $style->border_bottom = 0; - - // second - $orig_style = $split->get_original_style(); - $orig_style->text_indent = 0; - $orig_style->margin_top = 0; - $orig_style->padding_top = 0; - $orig_style->border_top = 0; - $orig_style->page_break_before = "auto"; - } - - // recalculate the float offsets after paging - $this->get_parent()->insert_child_after($split, $this); - if ($this instanceof Block) { - foreach ($this->get_line_boxes() as $index => $line_box) { - $line_box->get_float_offsets(); - } - } - - // Add $frame and all following siblings to the new split node - $iter = $child; - while ($iter) { - $frame = $iter; - $iter = $iter->get_next_sibling(); - $frame->reset(); - $frame->_parent = $split; - $split->append_child($frame); - - // recalculate the float offsets - if ($frame instanceof Block) { - foreach ($frame->get_line_boxes() as $index => $line_box) { - $line_box->get_float_offsets(); - } - } - } - - $this->get_parent()->split($split, $force_pagebreak); - - // If this node resets a counter save the current value to use when rendering on the next page - if ($style->counter_reset && ($reset = $style->counter_reset) !== "none") { - $vars = preg_split('/\s+/', trim($reset), 2); - $split->_counters['__' . $vars[0]] = $this->lookup_counter_frame($vars[0])->_counters[$vars[0]]; - } - } - - /** - * @param string $id - * @param int $value - */ - function reset_counter($id = self::DEFAULT_COUNTER, $value = 0) - { - $this->get_parent()->_counters[$id] = intval($value); - } - - /** - * @param $counters - */ - function decrement_counters($counters) - { - foreach ($counters as $id => $increment) { - $this->increment_counter($id, intval($increment) * -1); - } - } - - /** - * @param $counters - */ - function increment_counters($counters) - { - foreach ($counters as $id => $increment) { - $this->increment_counter($id, intval($increment)); - } - } - - /** - * @param string $id - * @param int $increment - */ - function increment_counter($id = self::DEFAULT_COUNTER, $increment = 1) - { - $counter_frame = $this->lookup_counter_frame($id); - - if ($counter_frame) { - if (!isset($counter_frame->_counters[$id])) { - $counter_frame->_counters[$id] = 0; - } - - $counter_frame->_counters[$id] += $increment; - } - } - - /** - * @param string $id - * @return AbstractFrameDecorator|null - */ - function lookup_counter_frame($id = self::DEFAULT_COUNTER) - { - $f = $this->get_parent(); - - while ($f) { - if (isset($f->_counters[$id])) { - return $f; - } - $fp = $f->get_parent(); - - if (!$fp) { - return $f; - } - - $f = $fp; - } - - return null; - } - - /** - * @param string $id - * @param string $type - * @return bool|string - * - * TODO: What version is the best : this one or the one in ListBullet ? - */ - function counter_value($id = self::DEFAULT_COUNTER, $type = "decimal") - { - $type = mb_strtolower($type); - - if (!isset($this->_counters[$id])) { - $this->_counters[$id] = 0; - } - - $value = $this->_counters[$id]; - - switch ($type) { - default: - case "decimal": - return $value; - - case "decimal-leading-zero": - return str_pad($value, 2, "0", STR_PAD_LEFT); - - case "lower-roman": - return Helpers::dec2roman($value); - - case "upper-roman": - return mb_strtoupper(Helpers::dec2roman($value)); - - case "lower-latin": - case "lower-alpha": - return chr(($value % 26) + ord('a') - 1); - - case "upper-latin": - case "upper-alpha": - return chr(($value % 26) + ord('A') - 1); - - case "lower-greek": - return Helpers::unichr($value + 944); - - case "upper-greek": - return Helpers::unichr($value + 912); - } - } - - /** - * - */ - final function position() - { - $this->_positioner->position($this); - } - - /** - * @param $offset_x - * @param $offset_y - * @param bool $ignore_self - */ - final function move($offset_x, $offset_y, $ignore_self = false) - { - $this->_positioner->move($this, $offset_x, $offset_y, $ignore_self); - } - - /** - * @param Block|null $block - */ - final function reflow(Block $block = null) - { - // Uncomment this to see the frames before they're laid out, instead of - // during rendering. - //echo $this->_frame; flush(); - $this->_reflower->reflow($block); - } - - /** - * @return array - */ - final function get_min_max_width() - { - return $this->_reflower->get_min_max_width(); - } - - /** - * Determine current frame width based on contents - * - * @return float - */ - final function calculate_auto_width() - { - return $this->_reflower->calculate_auto_width(); - } -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/Block.php b/vendor/dompdf/dompdf/src/FrameDecorator/Block.php deleted file mode 100644 index 6c3e5df..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/Block.php +++ /dev/null @@ -1,284 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Dompdf; -use Dompdf\Frame; -use Dompdf\LineBox; - -/** - * Decorates frames for block layout - * - * @access private - * @package dompdf - */ -class Block extends AbstractFrameDecorator -{ - /** - * Current line index - * - * @var int - */ - protected $_cl; - - /** - * The block's line boxes - * - * @var LineBox[] - */ - protected $_line_boxes; - - /** - * Block constructor. - * @param Frame $frame - * @param Dompdf $dompdf - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - parent::__construct($frame, $dompdf); - - $this->_line_boxes = [new LineBox($this)]; - $this->_cl = 0; - } - - /** - * - */ - function reset() - { - parent::reset(); - - $this->_line_boxes = [new LineBox($this)]; - $this->_cl = 0; - } - - /** - * @return LineBox - */ - function get_current_line_box() - { - return $this->_line_boxes[$this->_cl]; - } - - /** - * @return integer - */ - function get_current_line_number() - { - return $this->_cl; - } - - /** - * @return LineBox[] - */ - function get_line_boxes() - { - return $this->_line_boxes; - } - - /** - * @param integer $line_number - * @return integer - */ - function set_current_line_number($line_number) - { - $line_boxes_count = count($this->_line_boxes); - $cl = max(min($line_number, $line_boxes_count), 0); - return ($this->_cl = $cl); - } - - /** - * @param integer $i - */ - function clear_line($i) - { - if (isset($this->_line_boxes[$i])) { - unset($this->_line_boxes[$i]); - } - } - - /** - * @param Frame $frame - */ - function add_frame_to_line(Frame $frame) - { - if (!$frame->is_in_flow()) { - return; - } - - $style = $frame->get_style(); - - $frame->set_containing_line($this->_line_boxes[$this->_cl]); - - /* - // Adds a new line after a block, only if certain conditions are met - if ((($frame instanceof Inline && $frame->get_node()->nodeName !== "br") || - $frame instanceof Text && trim($frame->get_text())) && - ($frame->get_prev_sibling() && $frame->get_prev_sibling()->get_style()->display === "block" && - $this->_line_boxes[$this->_cl]->w > 0 )) { - - $this->maximize_line_height( $style->length_in_pt($style->line_height), $frame ); - $this->add_line(); - - // Add each child of the inline frame to the line individually - foreach ($frame->get_children() as $child) - $this->add_frame_to_line( $child ); - } - else*/ - - // Handle inline frames (which are effectively wrappers) - if ($frame instanceof Inline) { - // Handle line breaks - if ($frame->get_node()->nodeName === "br") { - $this->maximize_line_height($style->line_height, $frame); - $this->add_line(true); - } - - return; - } - - // Trim leading text if this is an empty line. Kinda a hack to put it here, - // but what can you do... - if ($this->get_current_line_box()->w == 0 && - $frame->is_text_node() && - !$frame->is_pre() - ) { - $frame->set_text(ltrim($frame->get_text())); - $frame->recalculate_width(); - } - - $w = $frame->get_margin_width(); - - // FIXME: Why? Doesn't quite seem to be the correct thing to do, - // but does appear to be necessary. Hack to handle wrapped white space? - if ($w == 0 && $frame->get_node()->nodeName !== "hr" && !$frame->is_pre()) { - return; - } - - // Debugging code: - /* - Helpers::pre_r("\n

Adding frame to line:

"); - - // Helpers::pre_r("Me: " . $this->get_node()->nodeName . " (" . spl_object_hash($this->get_node()) . ")"); - // Helpers::pre_r("Node: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")"); - if ( $frame->is_text_node() ) - Helpers::pre_r('"'.$frame->get_node()->nodeValue.'"'); - - Helpers::pre_r("Line width: " . $this->_line_boxes[$this->_cl]->w); - Helpers::pre_r("Frame: " . get_class($frame)); - Helpers::pre_r("Frame width: " . $w); - Helpers::pre_r("Frame height: " . $frame->get_margin_height()); - Helpers::pre_r("Containing block width: " . $this->get_containing_block("w")); - */ - // End debugging - - $line = $this->_line_boxes[$this->_cl]; - if ($line->left + $line->w + $line->right + $w > $this->get_containing_block("w")) { - $this->add_line(); - } - - $frame->position(); - - $current_line = $this->_line_boxes[$this->_cl]; - $current_line->add_frame($frame); - - if ($frame->is_text_node()) { - // split the text into words (used to determine spacing between words on justified lines) - // The regex splits on everything that's a separator (^\S double negative), excluding nbsp (\xa0) - // This currently excludes the "narrow nbsp" character - $words = preg_split('/[^\S\xA0]+/u', trim($frame->get_text())); - $current_line->wc += count($words); - } - - $this->increase_line_width($w); - - $this->maximize_line_height($frame->get_margin_height(), $frame); - } - - /** - * @param Frame $frame - */ - function remove_frames_from_line(Frame $frame) - { - // Search backwards through the lines for $frame - $i = $this->_cl; - $j = null; - - while ($i >= 0) { - if (($j = in_array($frame, $this->_line_boxes[$i]->get_frames(), true)) !== false) { - break; - } - - $i--; - } - - if ($j === false) { - return; - } - - // Remove $frame and all frames that follow - while ($j < count($this->_line_boxes[$i]->get_frames())) { - $frames = $this->_line_boxes[$i]->get_frames(); - $f = $frames[$j]; - $frames[$j] = null; - unset($frames[$j]); - $j++; - $this->_line_boxes[$i]->w -= $f->get_margin_width(); - } - - // Recalculate the height of the line - $h = 0; - foreach ($this->_line_boxes[$i]->get_frames() as $f) { - $h = max($h, $f->get_margin_height()); - } - - $this->_line_boxes[$i]->h = $h; - - // Remove all lines that follow - while ($this->_cl > $i) { - $this->_line_boxes[$this->_cl] = null; - unset($this->_line_boxes[$this->_cl]); - $this->_cl--; - } - } - - /** - * @param float $w - */ - function increase_line_width($w) - { - $this->_line_boxes[$this->_cl]->w += $w; - } - - /** - * @param $val - * @param Frame $frame - */ - function maximize_line_height($val, Frame $frame) - { - if ($val > $this->_line_boxes[$this->_cl]->h) { - $this->_line_boxes[$this->_cl]->tallest_frame = $frame; - $this->_line_boxes[$this->_cl]->h = $val; - } - } - - /** - * @param bool $br - */ - function add_line($br = false) - { - $this->_line_boxes[$this->_cl]->br = $br; - $y = $this->_line_boxes[$this->_cl]->y + $this->_line_boxes[$this->_cl]->h; - - $new_line = new LineBox($this, $y); - - $this->_line_boxes[++$this->_cl] = $new_line; - } - - //........................................................................ -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/Image.php b/vendor/dompdf/dompdf/src/FrameDecorator/Image.php deleted file mode 100644 index 0dc62e9..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/Image.php +++ /dev/null @@ -1,91 +0,0 @@ - - * @author Fabien MƩnager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Dompdf; -use Dompdf\Frame; -use Dompdf\Image\Cache; - -/** - * Decorates frames for image layout and rendering - * - * @package dompdf - */ -class Image extends AbstractFrameDecorator -{ - - /** - * The path to the image file (note that remote images are - * downloaded locally to Options:tempDir). - * - * @var string - */ - protected $_image_url; - - /** - * The image's file error message - * - * @var string - */ - protected $_image_msg; - - /** - * Class constructor - * - * @param Frame $frame the frame to decorate - * @param DOMPDF $dompdf the document's dompdf object (required to resolve relative & remote urls) - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - parent::__construct($frame, $dompdf); - $url = $frame->get_node()->getAttribute("src"); - - $debug_png = $dompdf->getOptions()->getDebugPng(); - if ($debug_png) { - print '[__construct ' . $url . ']'; - } - - list($this->_image_url, /*$type*/, $this->_image_msg) = Cache::resolve_url( - $url, - $dompdf->getProtocol(), - $dompdf->getBaseHost(), - $dompdf->getBasePath(), - $dompdf - ); - - if (Cache::is_broken($this->_image_url) && - $alt = $frame->get_node()->getAttribute("alt") - ) { - $style = $frame->get_style(); - $style->width = (4 / 3) * $dompdf->getFontMetrics()->getTextWidth($alt, $style->font_family, $style->font_size, $style->word_spacing); - $style->height = $dompdf->getFontMetrics()->getFontHeight($style->font_family, $style->font_size); - } - } - - /** - * Return the image's url - * - * @return string The url of this image - */ - function get_image_url() - { - return $this->_image_url; - } - - /** - * Return the image's error message - * - * @return string The image's error message - */ - function get_image_msg() - { - return $this->_image_msg; - } - -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/Inline.php b/vendor/dompdf/dompdf/src/FrameDecorator/Inline.php deleted file mode 100644 index 5b39381..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/Inline.php +++ /dev/null @@ -1,106 +0,0 @@ - - * @author Helmut Tischer - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use DOMElement; -use Dompdf\Dompdf; -use Dompdf\Frame; -use Dompdf\Exception; - -/** - * Decorates frames for inline layout - * - * @access private - * @package dompdf - */ -class Inline extends AbstractFrameDecorator -{ - - /** - * Inline constructor. - * @param Frame $frame - * @param Dompdf $dompdf - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - parent::__construct($frame, $dompdf); - } - - /** - * @param Frame|null $frame - * @param bool $force_pagebreak - * @throws Exception - */ - function split(Frame $frame = null, $force_pagebreak = false) - { - if (is_null($frame)) { - $this->get_parent()->split($this, $force_pagebreak); - return; - } - - if ($frame->get_parent() !== $this) { - throw new Exception("Unable to split: frame is not a child of this one."); - } - - $node = $this->_frame->get_node(); - - if ($node instanceof DOMElement && $node->hasAttribute("id")) { - $node->setAttribute("data-dompdf-original-id", $node->getAttribute("id")); - $node->removeAttribute("id"); - } - - $split = $this->copy($node->cloneNode()); - // if this is a generated node don't propagate the content style - if ($split->get_node()->nodeName == "dompdf_generated") { - $split->get_style()->content = "normal"; - } - $this->get_parent()->insert_child_after($split, $this); - - // Unset the current node's right style properties - $style = $this->_frame->get_style(); - $style->margin_right = 0; - $style->padding_right = 0; - $style->border_right_width = 0; - - // Unset the split node's left style properties since we don't want them - // to propagate - $style = $split->get_style(); - $style->margin_left = 0; - $style->padding_left = 0; - $style->border_left_width = 0; - - //On continuation of inline element on next line, - //don't repeat non-vertically repeatble background images - //See e.g. in testcase image_variants, long desriptions - if (($url = $style->background_image) && $url !== "none" - && ($repeat = $style->background_repeat) && $repeat !== "repeat" && $repeat !== "repeat-y" - ) { - $style->background_image = "none"; - } - - // Add $frame and all following siblings to the new split node - $iter = $frame; - while ($iter) { - $frame = $iter; - $iter = $iter->get_next_sibling(); - $frame->reset(); - $split->append_child($frame); - } - - $page_breaks = ["always", "left", "right"]; - $frame_style = $frame->get_style(); - if ($force_pagebreak || - in_array($frame_style->page_break_before, $page_breaks) || - in_array($frame_style->page_break_after, $page_breaks) - ) { - $this->get_parent()->split($split, true); - } - } - -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/ListBullet.php b/vendor/dompdf/dompdf/src/FrameDecorator/ListBullet.php deleted file mode 100644 index 0479fc1..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/ListBullet.php +++ /dev/null @@ -1,87 +0,0 @@ - - * @author Helmut Tischer - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Dompdf; -use Dompdf\Frame; - -/** - * Decorates frames for list bullet rendering - * - * @package dompdf - */ -class ListBullet extends AbstractFrameDecorator -{ - - const BULLET_PADDING = 1; // Distance from bullet to text in pt - // As fraction of font size (including descent). See also DECO_THICKNESS. - const BULLET_THICKNESS = 0.04; // Thickness of bullet outline. Screen: 0.08, print: better less, e.g. 0.04 - const BULLET_DESCENT = 0.3; //descent of font below baseline. Todo: Guessed for now. - const BULLET_SIZE = 0.35; // bullet diameter. For now 0.5 of font_size without descent. - - static $BULLET_TYPES = ["disc", "circle", "square"]; - - /** - * ListBullet constructor. - * @param Frame $frame - * @param Dompdf $dompdf - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - parent::__construct($frame, $dompdf); - } - - /** - * @return float|int - */ - function get_margin_width() - { - $style = $this->_frame->get_style(); - - if ($style->list_style_type === "none") { - return 0; - } - - return $style->font_size * self::BULLET_SIZE + 2 * self::BULLET_PADDING; - } - - /** - * hits only on "inset" lists items, to increase height of box - * - * @return float|int - */ - function get_margin_height() - { - $style = $this->_frame->get_style(); - - if ($style->list_style_type === "none") { - return 0; - } - - return $style->font_size * self::BULLET_SIZE + 2 * self::BULLET_PADDING; - } - - /** - * @return float|int - */ - function get_width() - { - return $this->get_margin_width(); - } - - /** - * @return float|int - */ - function get_height() - { - return $this->get_margin_height(); - } - - //........................................................................ -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/ListBulletImage.php b/vendor/dompdf/dompdf/src/FrameDecorator/ListBulletImage.php deleted file mode 100644 index 65f1857..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/ListBulletImage.php +++ /dev/null @@ -1,171 +0,0 @@ - - * @author Helmut Tischer - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Dompdf; -use Dompdf\Frame; -use Dompdf\Helpers; -use Dompdf\Image\Cache; - -/** - * Decorates frames for list bullets with custom images - * - * @package dompdf - */ -class ListBulletImage extends AbstractFrameDecorator -{ - - /** - * The underlying image frame - * - * @var Image - */ - protected $_img; - - /** - * The image's width in pixels - * - * @var int - */ - protected $_width; - - /** - * The image's height in pixels - * - * @var int - */ - protected $_height; - - /** - * Class constructor - * - * @param Frame $frame the bullet frame to decorate - * @param Dompdf $dompdf the document's dompdf object - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - $style = $frame->get_style(); - $url = $style->list_style_image; - $frame->get_node()->setAttribute("src", $url); - $this->_img = new Image($frame, $dompdf); - parent::__construct($this->_img, $dompdf); - - if (Cache::is_broken($this->_img->get_image_url())) { - $width = 0; - $height = 0; - } else { - list($width, $height) = Helpers::dompdf_getimagesize($this->_img->get_image_url(), $dompdf->getHttpContext()); - } - - // Resample the bullet image to be consistent with 'auto' sized images - // See also Image::get_min_max_width - // Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary. - $dpi = $this->_dompdf->getOptions()->getDpi(); - $this->_width = ((float)rtrim($width, "px") * 72) / $dpi; - $this->_height = ((float)rtrim($height, "px") * 72) / $dpi; - - //If an image is taller as the containing block/box, the box should be extended. - //Neighbour elements are overwriting the overlapping image areas. - //Todo: Where can the box size be extended? - //Code below has no effect. - //See block_frame_reflower _calculate_restricted_height - //See generated_frame_reflower, Dompdf:render() "list-item", "-dompdf-list-bullet"S. - //Leave for now - //if ($style->min_height < $this->_height ) { - // $style->min_height = $this->_height; - //} - //$style->height = "auto"; - } - - /** - * Return the bullet's width - * - * @return int - */ - function get_width() - { - //ignore image width, use same width as on predefined bullet ListBullet - //for proper alignment of bullet image and text. Allow image to not fitting on left border. - //This controls the distance between bullet image and text - //return $this->_width; - return $this->_frame->get_style()->font_size * ListBullet::BULLET_SIZE + - 2 * ListBullet::BULLET_PADDING; - } - - /** - * Return the bullet's height - * - * @return int - */ - function get_height() - { - //based on image height - if ($this->_height == 0) { - $style = $this->_frame->get_style(); - - if ($style->list_style_type === "none") { - return 0; - } - - return $style->font_size * ListBullet::BULLET_SIZE + 2 * ListBullet::BULLET_PADDING; - } else { - return $this->_height; - } - } - - /** - * Override get_margin_width - * - * @return int - */ - function get_margin_width() - { - //ignore image width, use same width as on predefined bullet ListBullet - //for proper alignment of bullet image and text. Allow image to not fitting on left border. - //This controls the extra indentation of text to make room for the bullet image. - //Here use actual image size, not predefined bullet size - //return $this->_frame->get_style()->font_size*ListBullet::BULLET_SIZE + - // 2 * ListBullet::BULLET_PADDING; - - // Small hack to prevent indenting of list text - // Image might not exist, then position like on list_bullet_frame_decorator fallback to none. - if ($this->_frame->get_style()->list_style_position === "outside" || $this->_width == 0) { - return 0; - } - //This aligns the "inside" image position with the text. - //The text starts to the right of the image. - //Between the image and the text there is an added margin of image width. - //Where this comes from is unknown. - //The corresponding ListBullet sets a smaller margin. bullet size? - return $this->_width + 2 * ListBullet::BULLET_PADDING; - } - - /** - * Override get_margin_height() - * - * @return int - */ - function get_margin_height() - { - //Hits only on "inset" lists items, to increase height of box - //based on image height - return $this->_height + 2 * ListBullet::BULLET_PADDING; - } - - /** - * Return image url - * - * @return string - */ - function get_image_url() - { - return $this->_img->get_image_url(); - } - -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/NullFrameDecorator.php b/vendor/dompdf/dompdf/src/FrameDecorator/NullFrameDecorator.php deleted file mode 100644 index e3457cf..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/NullFrameDecorator.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Dompdf; -use Dompdf\Frame; - -/** - * Dummy decorator - * - * @package dompdf - */ -class NullFrameDecorator extends AbstractFrameDecorator -{ - /** - * NullFrameDecorator constructor. - * @param Frame $frame - * @param Dompdf $dompdf - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - parent::__construct($frame, $dompdf); - $style = $this->_frame->get_style(); - $style->width = 0; - $style->height = 0; - $style->margin = 0; - $style->padding = 0; - } -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/Page.php b/vendor/dompdf/dompdf/src/FrameDecorator/Page.php deleted file mode 100644 index 6278776..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/Page.php +++ /dev/null @@ -1,682 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Css\Style; -use Dompdf\Dompdf; -use Dompdf\Helpers; -use Dompdf\Frame; -use Dompdf\Renderer; - -/** - * Decorates frames for page layout - * - * @access private - * @package dompdf - */ -class Page extends AbstractFrameDecorator -{ - - /** - * y value of bottom page margin - * - * @var float - */ - protected $_bottom_page_margin; - - /** - * Flag indicating page is full. - * - * @var bool - */ - protected $_page_full; - - /** - * Number of tables currently being reflowed - * - * @var int - */ - protected $_in_table; - - /** - * The pdf renderer - * - * @var Renderer - */ - protected $_renderer; - - /** - * This page's floating frames - * - * @var array - */ - protected $_floating_frames = []; - - //........................................................................ - - /** - * Class constructor - * - * @param Frame $frame the frame to decorate - * @param Dompdf $dompdf - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - parent::__construct($frame, $dompdf); - $this->_page_full = false; - $this->_in_table = 0; - $this->_bottom_page_margin = null; - } - - /** - * Set the renderer used for this pdf - * - * @param Renderer $renderer the renderer to use - */ - function set_renderer($renderer) - { - $this->_renderer = $renderer; - } - - /** - * Return the renderer used for this pdf - * - * @return Renderer - */ - function get_renderer() - { - return $this->_renderer; - } - - /** - * Set the frame's containing block. Overridden to set $this->_bottom_page_margin. - * - * @param float $x - * @param float $y - * @param float $w - * @param float $h - */ - function set_containing_block($x = null, $y = null, $w = null, $h = null) - { - parent::set_containing_block($x, $y, $w, $h); - //$w = $this->get_containing_block("w"); - if (isset($h)) { - $this->_bottom_page_margin = $h; - } // - $this->_frame->get_style()->length_in_pt($this->_frame->get_style()->margin_bottom, $w); - } - - /** - * Returns true if the page is full and is no longer accepting frames. - * - * @return bool - */ - function is_full() - { - return $this->_page_full; - } - - /** - * Start a new page by resetting the full flag. - */ - function next_page() - { - $this->_floating_frames = []; - $this->_renderer->new_page(); - $this->_page_full = false; - } - - /** - * Indicate to the page that a table is currently being reflowed. - */ - function table_reflow_start() - { - $this->_in_table++; - } - - /** - * Indicate to the page that table reflow is finished. - */ - function table_reflow_end() - { - $this->_in_table--; - } - - /** - * Return whether we are currently in a nested table or not - * - * @return bool - */ - function in_nested_table() - { - return $this->_in_table > 1; - } - - /** - * Check if a forced page break is required before $frame. This uses the - * frame's page_break_before property as well as the preceeding frame's - * page_break_after property. - * - * @link http://www.w3.org/TR/CSS21/page.html#forced - * - * @param Frame $frame the frame to check - * - * @return bool true if a page break occured - */ - function check_forced_page_break(Frame $frame) - { - // Skip check if page is already split - if ($this->_page_full) { - return null; - } - - $block_types = ["block", "list-item", "table", "inline"]; - $page_breaks = ["always", "left", "right"]; - - $style = $frame->get_style(); - - if (!in_array($style->display, $block_types)) { - return false; - } - - // Find the previous block-level sibling - $prev = $frame->get_prev_sibling(); - - while ($prev && !in_array($prev->get_style()->display, $block_types)) { - $prev = $prev->get_prev_sibling(); - } - - if (in_array($style->page_break_before, $page_breaks)) { - // Prevent cascading splits - $frame->split(null, true); - // We have to grab the style again here because split() resets - // $frame->style to the frame's original style. - $frame->get_style()->page_break_before = "auto"; - $this->_page_full = true; - $frame->_already_pushed = true; - - return true; - } - - if ($prev && in_array($prev->get_style()->page_break_after, $page_breaks)) { - // Prevent cascading splits - $frame->split(null, true); - $prev->get_style()->page_break_after = "auto"; - $this->_page_full = true; - $frame->_already_pushed = true; - - return true; - } - - if ($prev && $prev->get_last_child() && $frame->get_node()->nodeName != "body") { - $prev_last_child = $prev->get_last_child(); - if (in_array($prev_last_child->get_style()->page_break_after, $page_breaks)) { - $frame->split(null, true); - $prev_last_child->get_style()->page_break_after = "auto"; - $this->_page_full = true; - $frame->_already_pushed = true; - - return true; - } - } - - return false; - } - - /** - * Determine if a page break is allowed before $frame - * http://www.w3.org/TR/CSS21/page.html#allowed-page-breaks - * - * In the normal flow, page breaks can occur at the following places: - * - * 1. In the vertical margin between block boxes. When a page - * break occurs here, the used values of the relevant - * 'margin-top' and 'margin-bottom' properties are set to '0'. - * 2. Between line boxes inside a block box. - * 3. Between the content edge of a block container box and the - * outer edges of its child content (margin edges of block-level - * children or line box edges for inline-level children) if there - * is a (non-zero) gap between them. - * - * These breaks are subject to the following rules: - * - * * Rule A: Breaking at (1) is allowed only if the - * 'page-break-after' and 'page-break-before' properties of - * all the elements generating boxes that meet at this margin - * allow it, which is when at least one of them has the value - * 'always', 'left', or 'right', or when all of them are - * 'auto'. - * - * * Rule B: However, if all of them are 'auto' and the - * nearest common ancestor of all the elements has a - * 'page-break-inside' value of 'avoid', then breaking here is - * not allowed. - * - * * Rule C: Breaking at (2) is allowed only if the number of - * line boxes between the break and the start of the enclosing - * block box is the value of 'orphans' or more, and the number - * of line boxes between the break and the end of the box is - * the value of 'widows' or more. - * - * * Rule D: In addition, breaking at (2) is allowed only if - * the 'page-break-inside' property is 'auto'. - * - * If the above doesn't provide enough break points to keep - * content from overflowing the page boxes, then rules B and D are - * dropped in order to find additional breakpoints. - * - * If that still does not lead to sufficient break points, rules A - * and C are dropped as well, to find still more break points. - * - * We will also allow breaks between table rows. However, when - * splitting a table, the table headers should carry over to the - * next page (but they don't yet). - * - * @param Frame $frame the frame to check - * - * @return bool true if a break is allowed, false otherwise - */ - protected function _page_break_allowed(Frame $frame) - { - $block_types = ["block", "list-item", "table", "-dompdf-image"]; - Helpers::dompdf_debug("page-break", "_page_break_allowed(" . $frame->get_node()->nodeName . ")"); - $display = $frame->get_style()->display; - - // Block Frames (1): - if (in_array($display, $block_types)) { - - // Avoid breaks within table-cells - if ($this->_in_table > ($display === "table" ? 1 : 0)) { - Helpers::dompdf_debug("page-break", "In table: " . $this->_in_table); - - return false; - } - - // Rules A & B - - if ($frame->get_style()->page_break_before === "avoid") { - Helpers::dompdf_debug("page-break", "before: avoid"); - - return false; - } - - // Find the preceeding block-level sibling - $prev = $frame->get_prev_sibling(); - while ($prev && !in_array($prev->get_style()->display, $block_types)) { - $prev = $prev->get_prev_sibling(); - } - - // Does the previous element allow a page break after? - if ($prev && $prev->get_style()->page_break_after === "avoid") { - Helpers::dompdf_debug("page-break", "after: avoid"); - - return false; - } - - // If both $prev & $frame have the same parent, check the parent's - // page_break_inside property. - $parent = $frame->get_parent(); - if ($prev && $parent && $parent->get_style()->page_break_inside === "avoid") { - Helpers::dompdf_debug("page-break", "parent inside: avoid"); - - return false; - } - - // To prevent cascading page breaks when a top-level element has - // page-break-inside: avoid, ensure that at least one frame is - // on the page before splitting. - if ($parent->get_node()->nodeName === "body" && !$prev) { - // We are the body's first child - Helpers::dompdf_debug("page-break", "Body's first child."); - - return false; - } - - // If the frame is the first block-level frame, only allow a page - // break if there is a (non-zero) gap between the frame and its - // parent - if (!$prev && $parent) { - Helpers::dompdf_debug("page-break", "First block level frame, checking gap"); - - return $frame->get_style()->length_in_pt($frame->get_style()->margin_top) != 0 - || $parent->get_style()->length_in_pt($parent->get_style()->padding_top) != 0; - } - - Helpers::dompdf_debug("page-break", "block: break allowed"); - - return true; - - } // Inline frames (2): - else { - if (in_array($display, Style::$INLINE_TYPES)) { - - // Avoid breaks within table-cells - if ($this->_in_table) { - Helpers::dompdf_debug("page-break", "In table: " . $this->_in_table); - - return false; - } - - // Rule C - $block_parent = $frame->find_block_parent(); - if (count($block_parent->get_line_boxes()) < $frame->get_style()->orphans) { - Helpers::dompdf_debug("page-break", "orphans"); - - return false; - } - - // FIXME: Checking widows is tricky without having laid out the - // remaining line boxes. Just ignore it for now... - - // Rule D - $p = $block_parent; - while ($p) { - if ($p->get_style()->page_break_inside === "avoid") { - Helpers::dompdf_debug("page-break", "parent->inside: avoid"); - - return false; - } - $p = $p->find_block_parent(); - } - - // To prevent cascading page breaks when a top-level element has - // page-break-inside: avoid, ensure that at least one frame with - // some content is on the page before splitting. - $prev = $frame->get_prev_sibling(); - while ($prev && ($prev->is_text_node() && trim($prev->get_node()->nodeValue) == "")) { - $prev = $prev->get_prev_sibling(); - } - - if ($block_parent->get_node()->nodeName === "body" && !$prev) { - // We are the body's first child - Helpers::dompdf_debug("page-break", "Body's first child."); - - return false; - } - - // Skip breaks on empty text nodes - if ($frame->is_text_node() && $frame->get_node()->nodeValue == "") { - return false; - } - - Helpers::dompdf_debug("page-break", "inline: break allowed"); - - return true; - - // Table-rows - } else { - if ($display === "table-row") { - // Simply check if the parent table's page_break_inside property is - // not 'avoid' - $table = Table::find_parent_table($frame); - - $p = $table; - while ($p) { - if ($p->get_style()->page_break_inside === "avoid") { - Helpers::dompdf_debug("page-break", "parent->inside: avoid"); - - return false; - } - $p = $p->find_block_parent(); - } - - // Avoid breaking before the first row of a table - if ($table && $table->get_first_child() === $frame || $table->get_first_child()->get_first_child() === $frame) { - Helpers::dompdf_debug("page-break", "table: first-row"); - - return false; - } - - // If this is a nested table, prevent the page from breaking - if ($this->_in_table > 1) { - Helpers::dompdf_debug("page-break", "table: nested table"); - - return false; - } - - Helpers::dompdf_debug("page-break", "table-row/row-groups: break allowed"); - - return true; - } else { - if (in_array($display, Table::$ROW_GROUPS)) { - - // Disallow breaks at row-groups: only split at row boundaries - return false; - - } else { - Helpers::dompdf_debug("page-break", "? " . $frame->get_style()->display . ""); - - return false; - } - } - } - } - } - - /** - * Check if $frame will fit on the page. If the frame does not fit, - * the frame tree is modified so that a page break occurs in the - * correct location. - * - * @param Frame $frame the frame to check - * - * @return bool - */ - function check_page_break(Frame $frame) - { - if ($this->_page_full || $frame->_already_pushed) { - return false; - } - - $p = $frame; - do { - $display = $p->get_style()->display; - if ($display == "table-row") { - if ($p->_already_pushed) { return false; } - } - } while ($p = $p->get_parent()); - - // If the frame is absolute or fixed it shouldn't break - $p = $frame; - do { - if ($p->is_absolute()) { - return false; - } - } while ($p = $p->get_parent()); - - $margin_height = $frame->get_margin_height(); - - // Determine the frame's maximum y value - $max_y = (float)$frame->get_position("y") + $margin_height; - - // If a split is to occur here, then the bottom margins & paddings of all - // parents of $frame must fit on the page as well: - $p = $frame->get_parent(); - while ($p) { - $max_y += (float) $p->get_style()->computed_bottom_spacing(); - $p = $p->get_parent(); - } - - // Check if $frame flows off the page - if ($max_y <= $this->_bottom_page_margin) { - // no: do nothing - return false; - } - - Helpers::dompdf_debug("page-break", "check_page_break"); - Helpers::dompdf_debug("page-break", "in_table: " . $this->_in_table); - - // yes: determine page break location - $iter = $frame; - $flg = false; - $pushed_flg = false; - - $in_table = $this->_in_table; - - Helpers::dompdf_debug("page-break", "Starting search"); - while ($iter) { - // echo "\nbacktrack: " .$iter->get_node()->nodeName ." ".spl_object_hash($iter->get_node()). ""; - if ($iter === $this) { - Helpers::dompdf_debug("page-break", "reached root."); - // We've reached the root in our search. Just split at $frame. - break; - } - - if ($iter->_already_pushed) { - $pushed_flg = true; - } elseif ($this->_page_break_allowed($iter)) { - Helpers::dompdf_debug("page-break", "break allowed, splitting."); - $iter->split(null, true); - $this->_page_full = true; - $this->_in_table = $in_table; - $iter->_already_pushed = true; - $frame->_already_pushed = true; - - return true; - } - - if (!$flg && $next = $iter->get_last_child()) { - Helpers::dompdf_debug("page-break", "following last child."); - - if ($next->is_table()) { - $this->_in_table++; - } - - $iter = $next; - $pushed_flg = false; - continue; - } - - if ($pushed_flg) { - // The frame was already pushed, avoid breaking on a previous page - break; - } - - if ($next = $iter->get_prev_sibling()) { - Helpers::dompdf_debug("page-break", "following prev sibling."); - - if ($next->is_table() && !$iter->is_table()) { - $this->_in_table++; - } else if (!$next->is_table() && $iter->is_table()) { - $this->_in_table--; - } - - $iter = $next; - $flg = false; - continue; - } - - if ($next = $iter->get_parent()) { - Helpers::dompdf_debug("page-break", "following parent."); - - if ($iter->is_table()) { - $this->_in_table--; - } - - $iter = $next; - $flg = true; - continue; - } - - break; - } - - $this->_in_table = $in_table; - - // No valid page break found. Just break at $frame. - Helpers::dompdf_debug("page-break", "no valid break found, just splitting."); - - // If we are in a table, backtrack to the nearest top-level table row - if ($this->_in_table) { - $iter = $frame; - while ($iter && $iter->get_style()->display !== "table-row" && $iter->get_style()->display !== 'table-row-group' && $iter->_already_pushed === false) { - $iter = $iter->get_parent(); - } - - if ($iter) { - $iter->split(null, true); - $iter->_already_pushed = true; - } else { - return false; - } - } else { - $frame->split(null, true); - } - - $this->_page_full = true; - $frame->_already_pushed = true; - - return true; - } - - //........................................................................ - - /** - * @param Frame|null $frame - * @param bool $force_pagebreak - */ - function split(Frame $frame = null, $force_pagebreak = false) - { - // Do nothing - } - - /** - * Add a floating frame - * - * @param Frame $frame - * - * @return void - */ - function add_floating_frame(Frame $frame) - { - array_unshift($this->_floating_frames, $frame); - } - - /** - * @return Frame[] - */ - function get_floating_frames() - { - return $this->_floating_frames; - } - - /** - * @param $key - */ - public function remove_floating_frame($key) - { - unset($this->_floating_frames[$key]); - } - - /** - * @param Frame $child - * @return int|mixed - */ - public function get_lowest_float_offset(Frame $child) - { - $style = $child->get_style(); - $side = $style->clear; - $float = $style->float; - - $y = 0; - - if ($float === "none") { - foreach ($this->_floating_frames as $key => $frame) { - if ($side === "both" || $frame->get_style()->float === $side) { - $y = max($y, $frame->get_position("y") + $frame->get_margin_height()); - } - $this->remove_floating_frame($key); - } - } - - if ($y > 0) { - $y++; // add 1px buffer from float - } - - return $y; - } -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/Table.php b/vendor/dompdf/dompdf/src/FrameDecorator/Table.php deleted file mode 100644 index 5e28939..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/Table.php +++ /dev/null @@ -1,398 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Cellmap; -use DOMNode; -use Dompdf\Dompdf; -use Dompdf\Frame; -use Dompdf\Frame\Factory; - -/** - * Decorates Frames for table layout - * - * @package dompdf - */ -class Table extends AbstractFrameDecorator -{ - public static $VALID_CHILDREN = [ - "table-row-group", - "table-row", - "table-header-group", - "table-footer-group", - "table-column", - "table-column-group", - "table-caption", - "table-cell" - ]; - - public static $ROW_GROUPS = [ - 'table-row-group', - 'table-header-group', - 'table-footer-group' - ]; - - /** - * The Cellmap object for this table. The cellmap maps table cells - * to rows and columns, and aids in calculating column widths. - * - * @var \Dompdf\Cellmap - */ - protected $_cellmap; - - /** - * The minimum width of the table, in pt - * - * @var float - */ - protected $_min_width; - - /** - * The maximum width of the table, in pt - * - * @var float - */ - protected $_max_width; - - /** - * Table header rows. Each table header is duplicated when a table - * spans pages. - * - * @var array - */ - protected $_headers; - - /** - * Table footer rows. Each table footer is duplicated when a table - * spans pages. - * - * @var array - */ - protected $_footers; - - /** - * Class constructor - * - * @param Frame $frame the frame to decorate - * @param Dompdf $dompdf - */ - public function __construct(Frame $frame, Dompdf $dompdf) - { - parent::__construct($frame, $dompdf); - $this->_cellmap = new Cellmap($this); - - if ($frame->get_style()->table_layout === "fixed") { - $this->_cellmap->set_layout_fixed(true); - } - - $this->_min_width = null; - $this->_max_width = null; - $this->_headers = []; - $this->_footers = []; - } - - public function reset() - { - parent::reset(); - $this->_cellmap->reset(); - $this->_min_width = null; - $this->_max_width = null; - $this->_headers = []; - $this->_footers = []; - $this->_reflower->reset(); - } - - //........................................................................ - - /** - * split the table at $row. $row and all subsequent rows will be - * added to the clone. This method is overidden in order to remove - * frames from the cellmap properly. - * - * @param Frame $child - * @param bool $force_pagebreak - * - * @return void - */ - public function split(Frame $child = null, $force_pagebreak = false) - { - if (is_null($child)) { - parent::split(); - - return; - } - - // If $child is a header or if it is the first non-header row, do - // not duplicate headers, simply move the table to the next page. - if (count($this->_headers) && !in_array($child, $this->_headers, true) && - !in_array($child->get_prev_sibling(), $this->_headers, true) - ) { - $first_header = null; - - // Insert copies of the table headers before $child - foreach ($this->_headers as $header) { - - $new_header = $header->deep_copy(); - - if (is_null($first_header)) { - $first_header = $new_header; - } - - $this->insert_child_before($new_header, $child); - } - - parent::split($first_header); - - } elseif (in_array($child->get_style()->display, self::$ROW_GROUPS)) { - - // Individual rows should have already been handled - parent::split($child); - - } else { - - $iter = $child; - - while ($iter) { - $this->_cellmap->remove_row($iter); - $iter = $iter->get_next_sibling(); - } - - parent::split($child); - } - } - - /** - * Return a copy of this frame with $node as its node - * - * @param DOMNode $node - * - * @return Frame - */ - public function copy(DOMNode $node) - { - $deco = parent::copy($node); - - // In order to keep columns' widths through pages - $deco->_cellmap->set_columns($this->_cellmap->get_columns()); - $deco->_cellmap->lock_columns(); - - return $deco; - } - - /** - * Static function to locate the parent table of a frame - * - * @param Frame $frame - * - * @return Table the table that is an ancestor of $frame - */ - public static function find_parent_table(Frame $frame) - { - while ($frame = $frame->get_parent()) { - if ($frame->is_table()) { - break; - } - } - - return $frame; - } - - /** - * Return this table's Cellmap - * - * @return \Dompdf\Cellmap - */ - public function get_cellmap() - { - return $this->_cellmap; - } - - /** - * Return the minimum width of this table - * - * @return float - */ - public function get_min_width() - { - return $this->_min_width; - } - - /** - * Return the maximum width of this table - * - * @return float - */ - public function get_max_width() - { - return $this->_max_width; - } - - /** - * Set the minimum width of the table - * - * @param float $width the new minimum width - */ - public function set_min_width($width) - { - $this->_min_width = $width; - } - - /** - * Set the maximum width of the table - * - * @param float $width the new maximum width - */ - public function set_max_width($width) - { - $this->_max_width = $width; - } - - /** - * Restructure tree so that the table has the correct structure. - * Invalid children (i.e. all non-table-rows) are moved below the - * table. - * - * @fixme #1363 Method has some bugs. $table_row has not been initialized and lookup most likely could return an - * array of Style instead a Style Object - */ - public function normalise() - { - // Store frames generated by invalid tags and move them outside the table - $erroneous_frames = []; - $anon_row = false; - $iter = $this->get_first_child(); - while ($iter) { - $child = $iter; - $iter = $iter->get_next_sibling(); - - $display = $child->get_style()->display; - - if ($anon_row) { - - if ($display === "table-row") { - // Add the previous anonymous row - $this->insert_child_before($table_row, $child); - - $table_row->normalise(); - $child->normalise(); - $this->_cellmap->add_row(); - $anon_row = false; - continue; - } - - // add the child to the anonymous row - $table_row->append_child($child); - continue; - - } else { - - if ($display === "table-row") { - $child->normalise(); - continue; - } - - if ($display === "table-cell") { - $css = $this->get_style()->get_stylesheet(); - - // Create an anonymous table row group - $tbody = $this->get_node()->ownerDocument->createElement("tbody"); - - $frame = new Frame($tbody); - - $style = $css->create_style(); - $style->inherit($this->get_style()); - - // Lookup styles for tbody tags. If the user wants styles to work - // better, they should make the tbody explicit... I'm not going to - // try to guess what they intended. - if ($tbody_style = $css->lookup("tbody")) { - $style->merge($tbody_style); - } - $style->display = 'table-row-group'; - - // Okay, I have absolutely no idea why I need this clone here, but - // if it's omitted, php (as of 2004-07-28) segfaults. - $frame->set_style($style); - $table_row_group = Factory::decorate_frame($frame, $this->_dompdf, $this->_root); - - // Create an anonymous table row - $tr = $this->get_node()->ownerDocument->createElement("tr"); - - $frame = new Frame($tr); - - $style = $css->create_style(); - $style->inherit($this->get_style()); - - // Lookup styles for tr tags. If the user wants styles to work - // better, they should make the tr explicit... I'm not going to - // try to guess what they intended. - if ($tr_style = $css->lookup("tr")) { - $style->merge($tr_style); - } - $style->display = 'table-row'; - - // Okay, I have absolutely no idea why I need this clone here, but - // if it's omitted, php (as of 2004-07-28) segfaults. - $frame->set_style(clone $style); - $table_row = Factory::decorate_frame($frame, $this->_dompdf, $this->_root); - - // Add the cell to the row - $table_row->append_child($child, true); - - // Add the tr to the tbody - $table_row_group->append_child($table_row, true); - - $anon_row = true; - continue; - } - - if (!in_array($display, self::$VALID_CHILDREN)) { - $erroneous_frames[] = $child; - continue; - } - - // Normalise other table parts (i.e. row groups) - foreach ($child->get_children() as $grandchild) { - if ($grandchild->get_style()->display === "table-row") { - $grandchild->normalise(); - } - } - - // Add headers and footers - if ($display === "table-header-group") { - $this->_headers[] = $child; - } elseif ($display === "table-footer-group") { - $this->_footers[] = $child; - } - } - } - - if ($anon_row && $table_row_group instanceof AbstractFrameDecorator) { - // Add the row to the table - $this->_frame->append_child($table_row_group->_frame); - $table_row->normalise(); - } - - foreach ($erroneous_frames as $frame) { - $this->move_after($frame); - } - } - - //........................................................................ - - /** - * Moves the specified frame and it's corresponding node outside of - * the table. - * - * @param Frame $frame the frame to move - */ - public function move_after(Frame $frame) - { - $this->get_parent()->insert_child_after($frame, $this); - } -} \ No newline at end of file diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/TableCell.php b/vendor/dompdf/dompdf/src/FrameDecorator/TableCell.php deleted file mode 100644 index 996e16f..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/TableCell.php +++ /dev/null @@ -1,144 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Dompdf; -use Dompdf\Frame; -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; - -/** - * Decorates table cells for layout - * - * @package dompdf - */ -class TableCell extends BlockFrameDecorator -{ - - protected $_resolved_borders; - protected $_content_height; - - //........................................................................ - - /** - * TableCell constructor. - * @param Frame $frame - * @param Dompdf $dompdf - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - parent::__construct($frame, $dompdf); - $this->_resolved_borders = []; - $this->_content_height = 0; - } - - //........................................................................ - - function reset() - { - parent::reset(); - $this->_resolved_borders = []; - $this->_content_height = 0; - $this->_frame->reset(); - } - - /** - * @return int - */ - function get_content_height() - { - return $this->_content_height; - } - - /** - * @param $height - */ - function set_content_height($height) - { - $this->_content_height = $height; - } - - /** - * @param $height - */ - function set_cell_height($height) - { - $style = $this->get_style(); - $v_space = (float)$style->length_in_pt( - [ - $style->margin_top, - $style->padding_top, - $style->border_top_width, - $style->border_bottom_width, - $style->padding_bottom, - $style->margin_bottom - ], - (float)$style->length_in_pt($style->height) - ); - - $new_height = $height - $v_space; - $style->height = $new_height; - - if ($new_height > $this->_content_height) { - $y_offset = 0; - - // Adjust our vertical alignment - switch ($style->vertical_align) { - default: - case "baseline": - // FIXME: this isn't right - - case "top": - // Don't need to do anything - return; - - case "middle": - $y_offset = ($new_height - $this->_content_height) / 2; - break; - - case "bottom": - $y_offset = $new_height - $this->_content_height; - break; - } - - if ($y_offset) { - // Move our children - foreach ($this->get_line_boxes() as $line) { - foreach ($line->get_frames() as $frame) { - $frame->move(0, $y_offset); - } - } - } - } - } - - /** - * @param $side - * @param $border_spec - */ - function set_resolved_border($side, $border_spec) - { - $this->_resolved_borders[$side] = $border_spec; - } - - /** - * @param $side - * @return mixed - */ - function get_resolved_border($side) - { - return $this->_resolved_borders[$side]; - } - - /** - * @return array - */ - function get_resolved_borders() - { - return $this->_resolved_borders; - } -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/TableRow.php b/vendor/dompdf/dompdf/src/FrameDecorator/TableRow.php deleted file mode 100644 index 2fbfeb4..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/TableRow.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Dompdf; -use Dompdf\Frame; -use Dompdf\FrameDecorator\Table as TableFrameDecorator; - -/** - * Decorates Frames for table row layout - * - * @package dompdf - */ -class TableRow extends AbstractFrameDecorator -{ - /** - * TableRow constructor. - * @param Frame $frame - * @param Dompdf $dompdf - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - parent::__construct($frame, $dompdf); - } - - //........................................................................ - - /** - * Remove all non table-cell frames from this row and move them after - * the table. - */ - function normalise() - { - // Find our table parent - $p = TableFrameDecorator::find_parent_table($this); - - $erroneous_frames = []; - foreach ($this->get_children() as $child) { - $display = $child->get_style()->display; - - if ($display !== "table-cell") { - $erroneous_frames[] = $child; - } - } - - // dump the extra nodes after the table. - foreach ($erroneous_frames as $frame) { - $p->move_after($frame); - } - } - - function split(Frame $child = null, $force_pagebreak = false) - { - $this->_already_pushed = true; - - if (is_null($child)) { - parent::split(); - return; - } - - parent::split($child, $force_pagebreak); - } -} diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/TableRowGroup.php b/vendor/dompdf/dompdf/src/FrameDecorator/TableRowGroup.php deleted file mode 100644 index aabbd4e..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/TableRowGroup.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Dompdf; -use Dompdf\Frame; - -/** - * Table row group decorator - * - * Overrides split() method for tbody, thead & tfoot elements - * - * @package dompdf - */ -class TableRowGroup extends AbstractFrameDecorator -{ - - /** - * Class constructor - * - * @param Frame $frame Frame to decorate - * @param Dompdf $dompdf Current dompdf instance - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - parent::__construct($frame, $dompdf); - } - - /** - * Override split() to remove all child rows and this element from the cellmap - * - * @param Frame $child - * @param bool $force_pagebreak - * - * @return void - */ - function split(Frame $child = null, $force_pagebreak = false) - { - if (is_null($child)) { - parent::split(); - return; - } - - // Remove child & all subsequent rows from the cellmap - $cellmap = $this->get_parent()->get_cellmap(); - $iter = $child; - - while ($iter) { - $cellmap->remove_row($iter); - $iter = $iter->get_next_sibling(); - } - - // If we are splitting at the first child remove the - // table-row-group from the cellmap as well - if ($child === $this->get_first_child()) { - $cellmap->remove_row_group($this); - parent::split(); - return; - } - - $cellmap->update_row_group($this, $child->get_prev_sibling()); - parent::split($child); - } -} - diff --git a/vendor/dompdf/dompdf/src/FrameDecorator/Text.php b/vendor/dompdf/dompdf/src/FrameDecorator/Text.php deleted file mode 100644 index 92eafc2..0000000 --- a/vendor/dompdf/dompdf/src/FrameDecorator/Text.php +++ /dev/null @@ -1,203 +0,0 @@ - - * @author Brian Sweeney - * @author Fabien MƩnager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameDecorator; - -use Dompdf\Dompdf; -use Dompdf\Frame; -use Dompdf\Exception; - -/** - * Decorates Frame objects for text layout - * - * @access private - * @package dompdf - */ -class Text extends AbstractFrameDecorator -{ - - // protected members - protected $_text_spacing; - - /** - * Text constructor. - * @param Frame $frame - * @param Dompdf $dompdf - * @throws Exception - */ - function __construct(Frame $frame, Dompdf $dompdf) - { - if (!$frame->is_text_node()) { - throw new Exception("Text_Decorator can only be applied to #text nodes."); - } - - parent::__construct($frame, $dompdf); - $this->_text_spacing = null; - } - - function reset() - { - parent::reset(); - $this->_text_spacing = null; - } - - // Accessor methods - - /** - * @return null - */ - function get_text_spacing() - { - return $this->_text_spacing; - } - - /** - * @return string - */ - function get_text() - { - // FIXME: this should be in a child class (and is incorrect) -// if ( $this->_frame->get_style()->content !== "normal" ) { -// $this->_frame->get_node()->data = $this->_frame->get_style()->content; -// $this->_frame->get_style()->content = "normal"; -// } - -// Helpers::pre_r("---"); -// $style = $this->_frame->get_style(); -// var_dump($text = $this->_frame->get_node()->data); -// var_dump($asc = utf8_decode($text)); -// for ($i = 0; $i < strlen($asc); $i++) -// Helpers::pre_r("$i: " . $asc[$i] . " - " . ord($asc[$i])); -// Helpers::pre_r("width: " . $this->_dompdf->getFontMetrics()->getTextWidth($text, $style->font_family, $style->font_size)); - - return $this->_frame->get_node()->data; - } - - //........................................................................ - - /** - * Vertical margins & padding do not apply to text frames - * - * http://www.w3.org/TR/CSS21/visudet.html#inline-non-replaced: - * - * The vertical padding, border and margin of an inline, non-replaced box - * start at the top and bottom of the content area, not the - * 'line-height'. But only the 'line-height' is used to calculate the - * height of the line box. - * - * @return float|int - */ - function get_margin_height() - { - // This function is called in add_frame_to_line() and is used to - // determine the line height, so we actually want to return the - // 'line-height' property, not the actual margin box - $style = $this->get_style(); - $font = $style->font_family; - $size = $style->font_size; - - /* - Helpers::pre_r('-----'); - Helpers::pre_r($style->line_height); - Helpers::pre_r($style->font_size); - Helpers::pre_r($this->_dompdf->getFontMetrics()->getFontHeight($font, $size)); - Helpers::pre_r(($style->line_height / $size) * $this->_dompdf->getFontMetrics()->getFontHeight($font, $size)); - */ - - return ($style->line_height / ($size > 0 ? $size : 1)) * $this->_dompdf->getFontMetrics()->getFontHeight($font, $size); - } - - /** - * @return array - */ - function get_padding_box() - { - $style = $this->_frame->get_style(); - $pb = $this->_frame->get_padding_box(); - $pb[3] = $pb["h"] = $style->length_in_pt($style->height); - return $pb; - } - - /** - * @param $spacing - */ - function set_text_spacing($spacing) - { - $style = $this->_frame->get_style(); - - $this->_text_spacing = $spacing; - $char_spacing = (float)$style->length_in_pt($style->letter_spacing); - - // Re-adjust our width to account for the change in spacing - $style->width = $this->_dompdf->getFontMetrics()->getTextWidth($this->get_text(), $style->font_family, $style->font_size, $spacing, $char_spacing); - } - - /** - * Recalculate the text width - * - * @return float - */ - function recalculate_width() - { - $style = $this->get_style(); - $text = $this->get_text(); - $size = $style->font_size; - $font = $style->font_family; - $word_spacing = (float)$style->length_in_pt($style->word_spacing); - $char_spacing = (float)$style->length_in_pt($style->letter_spacing); - - return $style->width = $this->_dompdf->getFontMetrics()->getTextWidth($text, $font, $size, $word_spacing, $char_spacing); - } - - // Text manipulation methods - - /** - * split the text in this frame at the offset specified. The remaining - * text is added a sibling frame following this one and is returned. - * - * @param $offset - * @return Frame|null - */ - function split_text($offset) - { - if ($offset == 0) { - return null; - } - - $split = $this->_frame->get_node()->splitText($offset); - - $deco = $this->copy($split); - - $p = $this->get_parent(); - $p->insert_child_after($deco, $this, false); - - if ($p instanceof Inline) { - $p->split($deco); - } - - return $deco; - } - - /** - * @param $offset - * @param $count - */ - function delete_text($offset, $count) - { - $this->_frame->get_node()->deleteData($offset, $count); - } - - /** - * @param $text - */ - function set_text($text) - { - $this->_frame->get_node()->data = $text; - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/AbstractFrameReflower.php b/vendor/dompdf/dompdf/src/FrameReflower/AbstractFrameReflower.php deleted file mode 100644 index 46d0114..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/AbstractFrameReflower.php +++ /dev/null @@ -1,529 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\Adapter\CPDF; -use Dompdf\Css\Style; -use Dompdf\Dompdf; -use Dompdf\Helpers; -use Dompdf\Frame; -use Dompdf\FrameDecorator\Block; -use Dompdf\Frame\Factory; - -/** - * Base reflower class - * - * Reflower objects are responsible for determining the width and height of - * individual frames. They also create line and page breaks as necessary. - * - * @package dompdf - */ -abstract class AbstractFrameReflower -{ - - /** - * Frame for this reflower - * - * @var Frame - */ - protected $_frame; - - /** - * Cached min/max size - * - * @var array - */ - protected $_min_max_cache; - - /** - * AbstractFrameReflower constructor. - * @param Frame $frame - */ - function __construct(Frame $frame) - { - $this->_frame = $frame; - $this->_min_max_cache = null; - } - - function dispose() - { - } - - /** - * @return Dompdf - */ - function get_dompdf() - { - return $this->_frame->get_dompdf(); - } - - /** - * Collapse frames margins - * http://www.w3.org/TR/CSS2/box.html#collapsing-margins - */ - protected function _collapse_margins() - { - $frame = $this->_frame; - $cb = $frame->get_containing_block(); - $style = $frame->get_style(); - - // Margins of float/absolutely positioned/inline-block elements do not collapse. - if (!$frame->is_in_flow() || $frame->is_inline_block() || $frame->get_root() == $frame || $frame->get_parent() == $frame->get_root()) { - return; - } - - $t = $style->length_in_pt($style->margin_top, $cb["h"]); - $b = $style->length_in_pt($style->margin_bottom, $cb["h"]); - - // Handle 'auto' values - if ($t === "auto") { - $style->margin_top = "0pt"; - $t = 0; - } - - if ($b === "auto") { - $style->margin_bottom = "0pt"; - $b = 0; - } - - // Collapse vertical margins: - $n = $frame->get_next_sibling(); - if ( $n && !$n->is_block() & !$n->is_table() ) { - while ($n = $n->get_next_sibling()) { - if ($n->is_block() || $n->is_table()) { - break; - } - - if (!$n->get_first_child()) { - $n = null; - break; - } - } - } - - if ($n) { - $n_style = $n->get_style(); - $n_t = (float)$n_style->length_in_pt($n_style->margin_top, $cb["h"]); - - $b = $this->_get_collapsed_margin_length($b, $n_t); - $style->margin_bottom = $b . "pt"; - $n_style->margin_top = "0pt"; - } - - // Collapse our first child's margin, if there is no border or padding - if ($style->border_top_width == 0 && $style->length_in_pt($style->padding_top) == 0) { - $f = $this->_frame->get_first_child(); - if ( $f && !$f->is_block() && !$f->is_table() ) { - while ( $f = $f->get_next_sibling() ) { - if ( $f->is_block() || $f->is_table() ) { - break; - } - - if ( !$f->get_first_child() ) { - $f = null; - break; - } - } - } - - // Margin are collapsed only between block-level boxes - if ($f) { - $f_style = $f->get_style(); - $f_t = (float)$f_style->length_in_pt($f_style->margin_top, $cb["h"]); - - $t = $this->_get_collapsed_margin_length($t, $f_t); - $style->margin_top = $t."pt"; - $f_style->margin_top = "0pt"; - } - } - - // Collapse our last child's margin, if there is no border or padding - if ($style->border_bottom_width == 0 && $style->length_in_pt($style->padding_bottom) == 0) { - $l = $this->_frame->get_last_child(); - if ( $l && !$l->is_block() && !$l->is_table() ) { - while ( $l = $l->get_prev_sibling() ) { - if ( $l->is_block() || $l->is_table() ) { - break; - } - - if ( !$l->get_last_child() ) { - $l = null; - break; - } - } - } - - // Margin are collapsed only between block-level boxes - if ($l) { - $l_style = $l->get_style(); - $l_b = (float)$l_style->length_in_pt($l_style->margin_bottom, $cb["h"]); - - $b = $this->_get_collapsed_margin_length($b, $l_b); - $style->margin_bottom = $b."pt"; - $l_style->margin_bottom = "0pt"; - } - } - } - - /** - * Get the combined (collapsed) length of two adjoining margins. - * - * See http://www.w3.org/TR/CSS2/box.html#collapsing-margins. - * - * @param number $length1 - * @param number $length2 - * @return number - */ - private function _get_collapsed_margin_length($length1, $length2) - { - if ($length1 < 0 && $length2 < 0) { - return min($length1, $length2); // min(x, y) = - max(abs(x), abs(y)), if x < 0 && y < 0 - } - - if ($length1 < 0 || $length2 < 0) { - return $length1 + $length2; // x + y = x - abs(y), if y < 0 - } - - return max($length1, $length2); - } - - /** - * @param Block|null $block - * @return mixed - */ - abstract function reflow(Block $block = null); - - /** - * Required for table layout: Returns an array(0 => min, 1 => max, "min" - * => min, "max" => max) of the minimum and maximum widths of this frame. - * This provides a basic implementation. Child classes should override - * this if necessary. - * - * @return array|null - */ - function get_min_max_width() - { - if (!is_null($this->_min_max_cache)) { - return $this->_min_max_cache; - } - - $style = $this->_frame->get_style(); - - // Account for margins & padding - $dims = [$style->padding_left, - $style->padding_right, - $style->border_left_width, - $style->border_right_width, - $style->margin_left, - $style->margin_right]; - - $cb_w = $this->_frame->get_containing_block("w"); - $delta = (float)$style->length_in_pt($dims, $cb_w); - - // Handle degenerate case - if (!$this->_frame->get_first_child()) { - return $this->_min_max_cache = [ - $delta, $delta, - "min" => $delta, - "max" => $delta, - ]; - } - - $low = []; - $high = []; - - for ($iter = $this->_frame->get_children()->getIterator(); $iter->valid(); $iter->next()) { - $inline_min = 0; - $inline_max = 0; - - // Add all adjacent inline widths together to calculate max width - while ($iter->valid() && in_array($iter->current()->get_style()->display, Style::$INLINE_TYPES)) { - $child = $iter->current(); - - $minmax = $child->get_min_max_width(); - - if (in_array($iter->current()->get_style()->white_space, ["pre", "nowrap"])) { - $inline_min += $minmax["min"]; - } else { - $low[] = $minmax["min"]; - } - - $inline_max += $minmax["max"]; - $iter->next(); - } - - if ($inline_max > 0) { - $high[] = $inline_max; - } - if ($inline_min > 0) { - $low[] = $inline_min; - } - - if ($iter->valid()) { - list($low[], $high[]) = $iter->current()->get_min_max_width(); - continue; - } - } - $min = count($low) ? max($low) : 0; - $max = count($high) ? max($high) : 0; - - // Use specified width if it is greater than the minimum defined by the - // content. If the width is a percentage ignore it for now. - $width = $style->width; - if ($width !== "auto" && !Helpers::is_percent($width)) { - $width = (float)$style->length_in_pt($width, $cb_w); - if ($min < $width) { - $min = $width; - } - if ($max < $width) { - $max = $width; - } - } - - $min += $delta; - $max += $delta; - return $this->_min_max_cache = [$min, $max, "min" => $min, "max" => $max]; - } - - /** - * Parses a CSS string containing quotes and escaped hex characters - * - * @param $string string The CSS string to parse - * @param $single_trim - * @return string - */ - protected function _parse_string($string, $single_trim = false) - { - if ($single_trim) { - $string = preg_replace('/^[\"\']/', "", $string); - $string = preg_replace('/[\"\']$/', "", $string); - } else { - $string = trim($string, "'\""); - } - - $string = str_replace(["\\\n", '\\"', "\\'"], - ["", '"', "'"], $string); - - // Convert escaped hex characters into ascii characters (e.g. \A => newline) - $string = preg_replace_callback("/\\\\([0-9a-fA-F]{0,6})/", - function ($matches) { return \Dompdf\Helpers::unichr(hexdec($matches[1])); }, - $string); - return $string; - } - - /** - * Parses a CSS "quotes" property - * - * @return array|null An array of pairs of quotes - */ - protected function _parse_quotes() - { - // Matches quote types - $re = '/(\'[^\']*\')|(\"[^\"]*\")/'; - - $quotes = $this->_frame->get_style()->quotes; - - // split on spaces, except within quotes - if (!preg_match_all($re, "$quotes", $matches, PREG_SET_ORDER)) { - return null; - } - - $quotes_array = []; - foreach ($matches as $_quote) { - $quotes_array[] = $this->_parse_string($_quote[0], true); - } - - if (empty($quotes_array)) { - $quotes_array = ['"', '"']; - } - - return array_chunk($quotes_array, 2); - } - - /** - * Parses the CSS "content" property - * - * @return string|null The resulting string - */ - protected function _parse_content() - { - // Matches generated content - $re = "/\n" . - "\s(counters?\\([^)]*\\))|\n" . - "\A(counters?\\([^)]*\\))|\n" . - "\s([\"']) ( (?:[^\"']|\\\\[\"'])+ )(?_frame->get_style()->content; - - $quotes = $this->_parse_quotes(); - - // split on spaces, except within quotes - if (!preg_match_all($re, $content, $matches, PREG_SET_ORDER)) { - return null; - } - - $text = ""; - - foreach ($matches as $match) { - if (isset($match[2]) && $match[2] !== "") { - $match[1] = $match[2]; - } - - if (isset($match[6]) && $match[6] !== "") { - $match[4] = $match[6]; - } - - if (isset($match[8]) && $match[8] !== "") { - $match[7] = $match[8]; - } - - if (isset($match[1]) && $match[1] !== "") { - // counters?(...) - $match[1] = mb_strtolower(trim($match[1])); - - // Handle counter() references: - // http://www.w3.org/TR/CSS21/generate.html#content - - $i = mb_strpos($match[1], ")"); - if ($i === false) { - continue; - } - - preg_match('/(counters?)(^\()*?\(\s*([^\s,]+)\s*(,\s*["\']?([^"\'\)]*)["\']?\s*(,\s*([^\s)]+)\s*)?)?\)/i', $match[1], $args); - $counter_id = $args[3]; - if (strtolower($args[1]) == 'counter') { - // counter(name [,style]) - if (isset($args[5])) { - $type = trim($args[5]); - } else { - $type = null; - } - $p = $this->_frame->lookup_counter_frame($counter_id); - - $text .= $p->counter_value($counter_id, $type); - - } else if (strtolower($args[1]) == 'counters') { - // counters(name, string [,style]) - if (isset($args[5])) { - $string = $this->_parse_string($args[5]); - } else { - $string = ""; - } - - if (isset($args[7])) { - $type = trim($args[7]); - } else { - $type = null; - } - - $p = $this->_frame->lookup_counter_frame($counter_id); - $tmp = []; - while ($p) { - // We only want to use the counter values when they actually increment the counter - if (array_key_exists($counter_id, $p->_counters)) { - array_unshift($tmp, $p->counter_value($counter_id, $type)); - } - $p = $p->lookup_counter_frame($counter_id); - } - $text .= implode($string, $tmp); - } else { - // countertops? - continue; - } - - } else if (isset($match[4]) && $match[4] !== "") { - // String match - $text .= $this->_parse_string($match[4]); - } else if (isset($match[7]) && $match[7] !== "") { - // Directive match - - if ($match[7] === "open-quote") { - // FIXME: do something here - $text .= $quotes[0][0]; - } else if ($match[7] === "close-quote") { - // FIXME: do something else here - $text .= $quotes[0][1]; - } else if ($match[7] === "no-open-quote") { - // FIXME: - } else if ($match[7] === "no-close-quote") { - // FIXME: - } else if (mb_strpos($match[7], "attr(") === 0) { - $i = mb_strpos($match[7], ")"); - if ($i === false) { - continue; - } - - $attr = mb_substr($match[7], 5, $i - 5); - if ($attr == "") { - continue; - } - - $text .= $this->_frame->get_parent()->get_node()->getAttribute($attr); - } else { - continue; - } - } - } - - return $text; - } - - /** - * Sets the generated content of a generated frame - */ - protected function _set_content() - { - $frame = $this->_frame; - $style = $frame->get_style(); - - // if the element was pushed to a new page use the saved counter value, otherwise use the CSS reset value - if ($style->counter_reset && ($reset = $style->counter_reset) !== "none") { - $vars = preg_split('/\s+/', trim($reset), 2); - $frame->reset_counter($vars[0], (isset($frame->_counters['__' . $vars[0]]) ? $frame->_counters['__' . $vars[0]] : (isset($vars[1]) ? $vars[1] : 0))); - } - - if ($style->counter_increment && ($increment = $style->counter_increment) !== "none") { - $frame->increment_counters($increment); - } - - if ($style->content && $frame->get_node()->nodeName === "dompdf_generated") { - $content = $this->_parse_content(); - // add generated content to the font subset - // FIXME: This is currently too late because the font subset has already been generated. - // See notes in issue #750. - if ($frame->get_dompdf()->getOptions()->getIsFontSubsettingEnabled() && $frame->get_dompdf()->get_canvas() instanceof CPDF) { - $frame->get_dompdf()->get_canvas()->register_string_subset($style->font_family, $content); - } - - $node = $frame->get_node()->ownerDocument->createTextNode($content); - - $new_style = $style->get_stylesheet()->create_style(); - $new_style->inherit($style); - - $new_frame = new Frame($node); - $new_frame->set_style($new_style); - - Factory::decorate_frame($new_frame, $frame->get_dompdf(), $frame->get_root()); - $frame->append_child($new_frame); - } - } - - /** - * Determine current frame width based on contents - * - * @return float - */ - public function calculate_auto_width() - { - return $this->_frame->get_margin_width(); - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/Block.php b/vendor/dompdf/dompdf/src/FrameReflower/Block.php deleted file mode 100644 index 8dc628a..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/Block.php +++ /dev/null @@ -1,948 +0,0 @@ - - * @author Fabien MƩnager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\Frame; -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; -use Dompdf\FrameDecorator\TableCell as TableCellFrameDecorator; -use Dompdf\FrameDecorator\Text as TextFrameDecorator; -use Dompdf\Exception; -use Dompdf\Css\Style; - -/** - * Reflows block frames - * - * @package dompdf - */ -class Block extends AbstractFrameReflower -{ - // Minimum line width to justify, as fraction of available width - const MIN_JUSTIFY_WIDTH = 0.80; - - /** - * @var BlockFrameDecorator - */ - protected $_frame; - - function __construct(BlockFrameDecorator $frame) - { - parent::__construct($frame); - } - - /** - * Calculate the ideal used value for the width property as per: - * http://www.w3.org/TR/CSS21/visudet.html#Computing_widths_and_margins - * - * @param float $width - * - * @return array - */ - protected function _calculate_width($width) - { - $frame = $this->_frame; - $style = $frame->get_style(); - $w = $frame->get_containing_block("w"); - - if ($style->position === "fixed") { - $w = $frame->get_parent()->get_containing_block("w"); - } - - $rm = $style->length_in_pt($style->margin_right, $w); - $lm = $style->length_in_pt($style->margin_left, $w); - - $left = $style->length_in_pt($style->left, $w); - $right = $style->length_in_pt($style->right, $w); - - // Handle 'auto' values - $dims = [$style->border_left_width, - $style->border_right_width, - $style->padding_left, - $style->padding_right, - $width !== "auto" ? $width : 0, - $rm !== "auto" ? $rm : 0, - $lm !== "auto" ? $lm : 0]; - - // absolutely positioned boxes take the 'left' and 'right' properties into account - if ($frame->is_absolute()) { - $absolute = true; - $dims[] = $left !== "auto" ? $left : 0; - $dims[] = $right !== "auto" ? $right : 0; - } else { - $absolute = false; - } - - $sum = (float)$style->length_in_pt($dims, $w); - - // Compare to the containing block - $diff = $w - $sum; - - if ($diff > 0) { - if ($absolute) { - // resolve auto properties: see - // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width - - if ($width === "auto" && $left === "auto" && $right === "auto") { - if ($lm === "auto") { - $lm = 0; - } - if ($rm === "auto") { - $rm = 0; - } - - // Technically, the width should be "shrink-to-fit" i.e. based on the - // preferred width of the content... a little too costly here as a - // special case. Just get the width to take up the slack: - $left = 0; - $right = 0; - $width = $diff; - } else if ($width === "auto") { - if ($lm === "auto") { - $lm = 0; - } - if ($rm === "auto") { - $rm = 0; - } - if ($left === "auto") { - $left = 0; - } - if ($right === "auto") { - $right = 0; - } - - $width = $diff; - } else if ($left === "auto") { - if ($lm === "auto") { - $lm = 0; - } - if ($rm === "auto") { - $rm = 0; - } - if ($right === "auto") { - $right = 0; - } - - $left = $diff; - } else if ($right === "auto") { - if ($lm === "auto") { - $lm = 0; - } - if ($rm === "auto") { - $rm = 0; - } - - $right = $diff; - } - - } else { - // Find auto properties and get them to take up the slack - if ($width === "auto") { - $width = $diff; - } else if ($lm === "auto" && $rm === "auto") { - $lm = $rm = round($diff / 2); - } else if ($lm === "auto") { - $lm = $diff; - } else if ($rm === "auto") { - $rm = $diff; - } - } - } else if ($diff < 0) { - // We are over constrained--set margin-right to the difference - $rm = $diff; - } - - return [ - "width" => $width, - "margin_left" => $lm, - "margin_right" => $rm, - "left" => $left, - "right" => $right, - ]; - } - - /** - * Call the above function, but resolve max/min widths - * - * @throws Exception - * @return array - */ - protected function _calculate_restricted_width() - { - $frame = $this->_frame; - $style = $frame->get_style(); - $cb = $frame->get_containing_block(); - - if ($style->position === "fixed") { - $cb = $frame->get_root()->get_containing_block(); - } - - //if ( $style->position === "absolute" ) - // $cb = $frame->find_positionned_parent()->get_containing_block(); - - if (!isset($cb["w"])) { - throw new Exception("Box property calculation requires containing block width"); - } - - // Treat width 100% as auto - if ($style->width === "100%") { - $width = "auto"; - } else { - $width = $style->length_in_pt($style->width, $cb["w"]); - } - - $calculate_width = $this->_calculate_width($width); - $margin_left = $calculate_width['margin_left']; - $margin_right = $calculate_width['margin_right']; - $width = $calculate_width['width']; - $left = $calculate_width['left']; - $right = $calculate_width['right']; - - // Handle min/max width - $min_width = $style->length_in_pt($style->min_width, $cb["w"]); - $max_width = $style->length_in_pt($style->max_width, $cb["w"]); - - if ($max_width !== "none" && $min_width > $max_width) { - list($max_width, $min_width) = [$min_width, $max_width]; - } - - if ($max_width !== "none" && $width > $max_width) { - extract($this->_calculate_width($max_width)); - } - - if ($width < $min_width) { - $calculate_width = $this->_calculate_width($min_width); - $margin_left = $calculate_width['margin_left']; - $margin_right = $calculate_width['margin_right']; - $width = $calculate_width['width']; - $left = $calculate_width['left']; - $right = $calculate_width['right']; - } - - return [$width, $margin_left, $margin_right, $left, $right]; - } - - /** - * Determine the unrestricted height of content within the block - * not by adding each line's height, but by getting the last line's position. - * This because lines could have been pushed lower by a clearing element. - * - * @return float - */ - protected function _calculate_content_height() - { - $height = 0; - $lines = $this->_frame->get_line_boxes(); - if (count($lines) > 0) { - $last_line = end($lines); - $content_box = $this->_frame->get_content_box(); - $height = $last_line->y + $last_line->h - $content_box["y"]; - } - return $height; - } - - /** - * Determine the frame's restricted height - * - * @return array - */ - protected function _calculate_restricted_height() - { - $frame = $this->_frame; - $style = $frame->get_style(); - $content_height = $this->_calculate_content_height(); - $cb = $frame->get_containing_block(); - - $height = $style->length_in_pt($style->height, $cb["h"]); - - $top = $style->length_in_pt($style->top, $cb["h"]); - $bottom = $style->length_in_pt($style->bottom, $cb["h"]); - - $margin_top = $style->length_in_pt($style->margin_top, $cb["h"]); - $margin_bottom = $style->length_in_pt($style->margin_bottom, $cb["h"]); - - if ($frame->is_absolute()) { - - // see http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height - - $dims = [$top !== "auto" ? $top : 0, - $style->margin_top !== "auto" ? $style->margin_top : 0, - $style->padding_top, - $style->border_top_width, - $height !== "auto" ? $height : 0, - $style->border_bottom_width, - $style->padding_bottom, - $style->margin_bottom !== "auto" ? $style->margin_bottom : 0, - $bottom !== "auto" ? $bottom : 0]; - - $sum = (float)$style->length_in_pt($dims, $cb["h"]); - - $diff = $cb["h"] - $sum; - - if ($diff > 0) { - if ($height === "auto" && $top === "auto" && $bottom === "auto") { - if ($margin_top === "auto") { - $margin_top = 0; - } - if ($margin_bottom === "auto") { - $margin_bottom = 0; - } - - $height = $diff; - } else if ($height === "auto" && $top === "auto") { - if ($margin_top === "auto") { - $margin_top = 0; - } - if ($margin_bottom === "auto") { - $margin_bottom = 0; - } - - $height = $content_height; - $top = $diff - $content_height; - } else if ($height === "auto" && $bottom === "auto") { - if ($margin_top === "auto") { - $margin_top = 0; - } - if ($margin_bottom === "auto") { - $margin_bottom = 0; - } - - $height = $content_height; - $bottom = $diff - $content_height; - } else if ($top === "auto" && $bottom === "auto") { - if ($margin_top === "auto") { - $margin_top = 0; - } - if ($margin_bottom === "auto") { - $margin_bottom = 0; - } - - $bottom = $diff; - } else if ($top === "auto") { - if ($margin_top === "auto") { - $margin_top = 0; - } - if ($margin_bottom === "auto") { - $margin_bottom = 0; - } - - $top = $diff; - } else if ($height === "auto") { - if ($margin_top === "auto") { - $margin_top = 0; - } - if ($margin_bottom === "auto") { - $margin_bottom = 0; - } - - $height = $diff; - } else if ($bottom === "auto") { - if ($margin_top === "auto") { - $margin_top = 0; - } - if ($margin_bottom === "auto") { - $margin_bottom = 0; - } - - $bottom = $diff; - } else { - if ($style->overflow === "visible") { - // set all autos to zero - if ($margin_top === "auto") { - $margin_top = 0; - } - if ($margin_bottom === "auto") { - $margin_bottom = 0; - } - if ($top === "auto") { - $top = 0; - } - if ($bottom === "auto") { - $bottom = 0; - } - if ($height === "auto") { - $height = $content_height; - } - } - - // FIXME: overflow hidden - } - } - - } else { - // Expand the height if overflow is visible - if ($height === "auto" && $content_height > $height /* && $style->overflow === "visible" */) { - $height = $content_height; - } - - // FIXME: this should probably be moved to a seperate function as per - // _calculate_restricted_width - - // Only handle min/max height if the height is independent of the frame's content - if (!($style->overflow === "visible" || ($style->overflow === "hidden" && $height === "auto"))) { - $min_height = $style->min_height; - $max_height = $style->max_height; - - if (isset($cb["h"])) { - $min_height = $style->length_in_pt($min_height, $cb["h"]); - $max_height = $style->length_in_pt($max_height, $cb["h"]); - } else if (isset($cb["w"])) { - if (mb_strpos($min_height, "%") !== false) { - $min_height = 0; - } else { - $min_height = $style->length_in_pt($min_height, $cb["w"]); - } - - if (mb_strpos($max_height, "%") !== false) { - $max_height = "none"; - } else { - $max_height = $style->length_in_pt($max_height, $cb["w"]); - } - } - - if ($max_height !== "none" && $min_height > $max_height) { - // Swap 'em - list($max_height, $min_height) = [$min_height, $max_height]; - } - - if ($max_height !== "none" && $height > $max_height) { - $height = $max_height; - } - - if ($height < $min_height) { - $height = $min_height; - } - } - } - - return [$height, $margin_top, $margin_bottom, $top, $bottom]; - } - - /** - * Adjust the justification of each of our lines. - * http://www.w3.org/TR/CSS21/text.html#propdef-text-align - */ - protected function _text_align() - { - $style = $this->_frame->get_style(); - $w = $this->_frame->get_containing_block("w"); - $width = (float)$style->length_in_pt($style->width, $w); - - switch ($style->text_align) { - default: - case "left": - foreach ($this->_frame->get_line_boxes() as $line) { - if (!$line->left) { - continue; - } - - foreach ($line->get_frames() as $frame) { - if ($frame instanceof BlockFrameDecorator) { - continue; - } - $frame->set_position($frame->get_position("x") + $line->left); - } - } - return; - - case "right": - foreach ($this->_frame->get_line_boxes() as $line) { - // Move each child over by $dx - $dx = $width - $line->w - $line->right; - - foreach ($line->get_frames() as $frame) { - // Block frames are not aligned by text-align - if ($frame instanceof BlockFrameDecorator) { - continue; - } - - $frame->set_position($frame->get_position("x") + $dx); - } - } - break; - - case "justify": - // We justify all lines except the last one - $lines = $this->_frame->get_line_boxes(); // needs to be a variable (strict standards) - $last_line = array_pop($lines); - - foreach ($lines as $i => $line) { - if ($line->br) { - unset($lines[$i]); - } - } - - // One space character's width. Will be used to get a more accurate spacing - $space_width = $this->get_dompdf()->getFontMetrics()->getTextWidth(" ", $style->font_family, $style->font_size); - - foreach ($lines as $line) { - if ($line->left) { - foreach ($line->get_frames() as $frame) { - if (!$frame instanceof TextFrameDecorator) { - continue; - } - - $frame->set_position($frame->get_position("x") + $line->left); - } - } - - // Set the spacing for each child - if ($line->wc > 1) { - $spacing = ($width - ($line->left + $line->w + $line->right)) / ($line->wc - 1); - } else { - $spacing = 0; - } - - $dx = 0; - foreach ($line->get_frames() as $frame) { - if (!$frame instanceof TextFrameDecorator) { - continue; - } - - $text = $frame->get_text(); - $spaces = mb_substr_count($text, " "); - - $char_spacing = (float)$style->length_in_pt($style->letter_spacing); - $_spacing = $spacing + $char_spacing; - - $frame->set_position($frame->get_position("x") + $dx); - $frame->set_text_spacing($_spacing); - - $dx += $spaces * $_spacing; - } - - // The line (should) now occupy the entire width - $line->w = $width; - } - - // Adjust the last line if necessary - if ($last_line->left) { - foreach ($last_line->get_frames() as $frame) { - if ($frame instanceof BlockFrameDecorator) { - continue; - } - $frame->set_position($frame->get_position("x") + $last_line->left); - } - } - break; - - case "center": - case "centre": - foreach ($this->_frame->get_line_boxes() as $line) { - // Centre each line by moving each frame in the line by: - $dx = ($width + $line->left - $line->w - $line->right) / 2; - - foreach ($line->get_frames() as $frame) { - // Block frames are not aligned by text-align - if ($frame instanceof BlockFrameDecorator) { - continue; - } - - $frame->set_position($frame->get_position("x") + $dx); - } - } - break; - } - } - - /** - * Align inline children vertically. - * Aligns each child vertically after each line is reflowed - */ - function vertical_align() - { - $canvas = null; - - foreach ($this->_frame->get_line_boxes() as $line) { - - $height = $line->h; - - foreach ($line->get_frames() as $frame) { - $style = $frame->get_style(); - $isInlineBlock = ( - '-dompdf-image' === $style->display - || 'inline-block' === $style->display - || 'inline-table' === $style->display - ); - if (!$isInlineBlock && $style->display !== "inline") { - continue; - } - - if (!isset($canvas)) { - $canvas = $frame->get_root()->get_dompdf()->get_canvas(); - } - - $baseline = $canvas->get_font_baseline($style->font_family, $style->font_size); - $y_offset = 0; - - //FIXME: The 0.8 ratio applied to the height is arbitrary (used to accommodate descenders?) - if($isInlineBlock) { - $lineFrames = $line->get_frames(); - if (count($lineFrames) == 1) { - continue; - } - $frameBox = $frame->get_frame()->get_border_box(); - $imageHeightDiff = $height * 0.8 - (float)$frameBox['h']; - - $align = $frame->get_style()->vertical_align; - if (in_array($align, Style::$vertical_align_keywords) === true) { - switch ($align) { - case "middle": - $y_offset = $imageHeightDiff / 2; - break; - - case "sub": - $y_offset = 0.3 * $height + $imageHeightDiff; - break; - - case "super": - $y_offset = -0.2 * $height + $imageHeightDiff; - break; - - case "text-top": // FIXME: this should be the height of the frame minus the height of the text - $y_offset = $height - $style->line_height; - break; - - case "top": - break; - - case "text-bottom": // FIXME: align bottom of image with the descender? - case "bottom": - $y_offset = 0.3 * $height + $imageHeightDiff; - break; - - case "baseline": - default: - $y_offset = $imageHeightDiff; - break; - } - } else { - $y_offset = $baseline - (float)$style->length_in_pt($align, $style->font_size) - (float)$frameBox['h']; - } - } else { - $parent = $frame->get_parent(); - if ($parent instanceof TableCellFrameDecorator) { - $align = "baseline"; - } else { - $align = $parent->get_style()->vertical_align; - } - if (in_array($align, Style::$vertical_align_keywords) === true) { - switch ($align) { - case "middle": - $y_offset = ($height * 0.8 - $baseline) / 2; - break; - - case "sub": - $y_offset = $height * 0.8 - $baseline * 0.5; - break; - - case "super": - $y_offset = $height * 0.8 - $baseline * 1.4; - break; - - case "text-top": - case "top": // Not strictly accurate, but good enough for now - break; - - case "text-bottom": - case "bottom": - $y_offset = $height * 0.8 - $baseline; - break; - - case "baseline": - default: - $y_offset = $height * 0.8 - $baseline; - break; - } - } else { - $y_offset = $height * 0.8 - $baseline - (float)$style->length_in_pt($align, $style->font_size); - } - } - - if ($y_offset !== 0) { - $frame->move(0, $y_offset); - } - } - } - } - - /** - * @param Frame $child - */ - function process_clear(Frame $child) - { - $child_style = $child->get_style(); - $root = $this->_frame->get_root(); - - // Handle "clear" - if ($child_style->clear !== "none") { - //TODO: this is a WIP for handling clear/float frames that are in between inline frames - if ($child->get_prev_sibling() !== null) { - $this->_frame->add_line(); - } - if ($child_style->float !== "none" && $child->get_next_sibling()) { - $this->_frame->set_current_line_number($this->_frame->get_current_line_number() - 1); - } - - $lowest_y = $root->get_lowest_float_offset($child); - - // If a float is still applying, we handle it - if ($lowest_y) { - if ($child->is_in_flow()) { - $line_box = $this->_frame->get_current_line_box(); - $line_box->y = $lowest_y + $child->get_margin_height(); - $line_box->left = 0; - $line_box->right = 0; - } - - $child->move(0, $lowest_y - $child->get_position("y")); - } - } - } - - /** - * @param Frame $child - * @param float $cb_x - * @param float $cb_w - */ - function process_float(Frame $child, $cb_x, $cb_w) - { - $child_style = $child->get_style(); - $root = $this->_frame->get_root(); - - // Handle "float" - if ($child_style->float !== "none") { - $root->add_floating_frame($child); - - // Remove next frame's beginning whitespace - $next = $child->get_next_sibling(); - if ($next && $next instanceof TextFrameDecorator) { - $next->set_text(ltrim($next->get_text())); - } - - $line_box = $this->_frame->get_current_line_box(); - list($old_x, $old_y) = $child->get_position(); - - $float_x = $cb_x; - $float_y = $old_y; - $float_w = $child->get_margin_width(); - - if ($child_style->clear === "none") { - switch ($child_style->float) { - case "left": - $float_x += $line_box->left; - break; - case "right": - $float_x += ($cb_w - $line_box->right - $float_w); - break; - } - } else { - if ($child_style->float === "right") { - $float_x += ($cb_w - $float_w); - } - } - - if ($cb_w < $float_x + $float_w - $old_x) { - // TODO handle when floating elements don't fit - } - - $line_box->get_float_offsets(); - - if ($child->_float_next_line) { - $float_y += $line_box->h; - } - - $child->set_position($float_x, $float_y); - $child->move($float_x - $old_x, $float_y - $old_y, true); - } - } - - /** - * @param BlockFrameDecorator $block - * @return mixed|void - */ - function reflow(BlockFrameDecorator $block = null) - { - - // Check if a page break is forced - $page = $this->_frame->get_root(); - $page->check_forced_page_break($this->_frame); - - // Bail if the page is full - if ($page->is_full()) { - return; - } - - // Generated content - $this->_set_content(); - - // Collapse margins if required - $this->_collapse_margins(); - - $style = $this->_frame->get_style(); - $cb = $this->_frame->get_containing_block(); - - if ($style->position === "fixed") { - $cb = $this->_frame->get_root()->get_containing_block(); - } - - // Determine the constraints imposed by this frame: calculate the width - // of the content area: - list($w, $left_margin, $right_margin, $left, $right) = $this->_calculate_restricted_width(); - - // Store the calculated properties - $style->width = $w; - $style->margin_left = $left_margin; - $style->margin_right = $right_margin; - $style->left = $left; - $style->right = $right; - - // Update the position - $this->_frame->position(); - list($x, $y) = $this->_frame->get_position(); - - // Adjust the first line based on the text-indent property - $indent = (float)$style->length_in_pt($style->text_indent, $cb["w"]); - $this->_frame->increase_line_width($indent); - - // Determine the content edge - $top = (float)$style->length_in_pt([$style->margin_top, - $style->padding_top, - $style->border_top_width], $cb["h"]); - - $bottom = (float)$style->length_in_pt([$style->border_bottom_width, - $style->margin_bottom, - $style->padding_bottom], $cb["h"]); - - $cb_x = $x + (float)$left_margin + (float)$style->length_in_pt([$style->border_left_width, - $style->padding_left], $cb["w"]); - - $cb_y = $y + $top; - - $cb_h = ($cb["h"] + $cb["y"]) - $bottom - $cb_y; - - // Set the y position of the first line in this block - $line_box = $this->_frame->get_current_line_box(); - $line_box->y = $cb_y; - $line_box->get_float_offsets(); - - // Set the containing blocks and reflow each child - foreach ($this->_frame->get_children() as $child) { - - // Bail out if the page is full - if ($page->is_full()) { - break; - } - - $child->set_containing_block($cb_x, $cb_y, $w, $cb_h); - - $this->process_clear($child); - - $child->reflow($this->_frame); - - // Don't add the child to the line if a page break has occurred - if ($page->check_page_break($child)) { - break; - } - - $this->process_float($child, $cb_x, $w); - } - - // Determine our height - list($height, $margin_top, $margin_bottom, $top, $bottom) = $this->_calculate_restricted_height(); - $style->height = $height; - $style->margin_top = $margin_top; - $style->margin_bottom = $margin_bottom; - $style->top = $top; - $style->bottom = $bottom; - - $orig_style = $this->_frame->get_original_style(); - - $needs_reposition = ($style->position === "absolute" && ($style->right !== "auto" || $style->bottom !== "auto")); - - // Absolute positioning measurement - if ($needs_reposition) { - if ($orig_style->width === "auto" && ($orig_style->left === "auto" || $orig_style->right === "auto")) { - $width = 0; - foreach ($this->_frame->get_line_boxes() as $line) { - $width = max($line->w, $width); - } - $style->width = $width; - } - - $style->left = $orig_style->left; - $style->right = $orig_style->right; - } - - // Calculate inline-block / float auto-widths - if (($style->display === "inline-block" || $style->float !== 'none') && $orig_style->width === 'auto') { - $width = 0; - - foreach ($this->_frame->get_line_boxes() as $line) { - $line->recalculate_width(); - - $width = max($line->w, $width); - } - - if ($width === 0) { - foreach ($this->_frame->get_children() as $child) { - $width += $child->calculate_auto_width(); - } - } - - $style->width = $width; - } - - $this->_text_align(); - $this->vertical_align(); - - // Absolute positioning - if ($needs_reposition) { - list($x, $y) = $this->_frame->get_position(); - $this->_frame->position(); - list($new_x, $new_y) = $this->_frame->get_position(); - $this->_frame->move($new_x - $x, $new_y - $y, true); - } - - if ($block && $this->_frame->is_in_flow()) { - $block->add_frame_to_line($this->_frame); - - // May be inline-block - if ($style->display === "block") { - $block->add_line(); - } - } - } - - /** - * Determine current frame width based on contents - * - * @return float - */ - public function calculate_auto_width() - { - $width = 0; - - foreach ($this->_frame->get_line_boxes() as $line) { - $line_width = 0; - - foreach ($line->get_frames() as $frame) { - if ($frame->get_original_style()->width == 'auto') { - $line_width += $frame->calculate_auto_width(); - } else { - $line_width += $frame->get_margin_width(); - } - } - - $width = max($line_width, $width); - } - - $this->_frame->get_style()->width = $width; - - return $this->_frame->get_margin_width(); - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/Image.php b/vendor/dompdf/dompdf/src/FrameReflower/Image.php deleted file mode 100644 index 6619397..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/Image.php +++ /dev/null @@ -1,202 +0,0 @@ - - * @author Fabien MƩnager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\Frame; -use Dompdf\Helpers; -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; -use Dompdf\FrameDecorator\Image as ImageFrameDecorator; - -/** - * Image reflower class - * - * @package dompdf - */ -class Image extends AbstractFrameReflower -{ - - /** - * Image constructor. - * @param ImageFrameDecorator $frame - */ - function __construct(ImageFrameDecorator $frame) - { - parent::__construct($frame); - } - - /** - * @param BlockFrameDecorator|null $block - */ - function reflow(BlockFrameDecorator $block = null) - { - $this->_frame->position(); - - //FLOAT - //$frame = $this->_frame; - //$page = $frame->get_root(); - - //if ($frame->get_style()->float !== "none" ) { - // $page->add_floating_frame($this); - //} - - // Set the frame's width - $this->get_min_max_width(); - - if ($block) { - $block->add_frame_to_line($this->_frame); - } - } - - /** - * @return array - */ - function get_min_max_width() - { - $frame = $this->_frame; - - if ($this->get_dompdf()->getOptions()->getDebugPng()) { - // Determine the image's size. Time consuming. Only when really needed? - list($img_width, $img_height) = Helpers::dompdf_getimagesize($frame->get_image_url(), $this->get_dompdf()->getHttpContext()); - print "get_min_max_width() " . - $frame->get_style()->width . ' ' . - $frame->get_style()->height . ';' . - $frame->get_parent()->get_style()->width . " " . - $frame->get_parent()->get_style()->height . ";" . - $frame->get_parent()->get_parent()->get_style()->width . ' ' . - $frame->get_parent()->get_parent()->get_style()->height . ';' . - $img_width . ' ' . - $img_height . '|'; - } - - $style = $frame->get_style(); - - $width_forced = true; - $height_forced = true; - - //own style auto or invalid value: use natural size in px - //own style value: ignore suffix text including unit, use given number as px - //own style %: walk up parent chain until found available space in pt; fill available space - // - //special ignored unit: e.g. 10ex: e treated as exponent; x ignored; 10e completely invalid ->like auto - - $width = $this->get_size($frame, 'width'); - $height = $this->get_size($frame, 'height'); - - if ($width === 'auto' || $height === 'auto') { - // Determine the image's size. Time consuming. Only when really needed! - list($img_width, $img_height) = Helpers::dompdf_getimagesize($frame->get_image_url(), $this->get_dompdf()->getHttpContext()); - - // don't treat 0 as error. Can be downscaled or can be catched elsewhere if image not readable. - // Resample according to px per inch - // See also ListBulletImage::__construct - if ($width === 'auto' && $height === 'auto') { - $dpi = $frame->get_dompdf()->getOptions()->getDpi(); - $width = (float)($img_width * 72) / $dpi; - $height = (float)($img_height * 72) / $dpi; - $width_forced = false; - $height_forced = false; - } elseif ($height === 'auto') { - $height_forced = false; - $height = ($width / $img_width) * $img_height; //keep aspect ratio - } else { - $width_forced = false; - $width = ($height / $img_height) * $img_width; //keep aspect ratio - } - } - - // Handle min/max width/height - if ($style->min_width !== "none" || - $style->max_width !== "none" || - $style->min_height !== "none" || - $style->max_height !== "none" - ) { - - list( /*$x*/, /*$y*/, $w, $h) = $frame->get_containing_block(); - - $min_width = $style->length_in_pt($style->min_width, $w); - $max_width = $style->length_in_pt($style->max_width, $w); - $min_height = $style->length_in_pt($style->min_height, $h); - $max_height = $style->length_in_pt($style->max_height, $h); - - if ($max_width !== "none" && $width > $max_width) { - if (!$height_forced) { - $height *= $max_width / $width; - } - - $width = $max_width; - } - - if ($min_width !== "none" && $width < $min_width) { - if (!$height_forced) { - $height *= $min_width / $width; - } - - $width = $min_width; - } - - if ($max_height !== "none" && $height > $max_height) { - if (!$width_forced) { - $width *= $max_height / $height; - } - - $height = $max_height; - } - - if ($min_height !== "none" && $height < $min_height) { - if (!$width_forced) { - $width *= $min_height / $height; - } - - $height = $min_height; - } - } - - if ($this->get_dompdf()->getOptions()->getDebugPng()) { - print $width . ' ' . $height . ';'; - } - - $style->width = $width . "pt"; - $style->height = $height . "pt"; - - $style->min_width = "none"; - $style->max_width = "none"; - $style->min_height = "none"; - $style->max_height = "none"; - - return [$width, $width, "min" => $width, "max" => $width]; - } - - private function get_size(Frame $f, string $type) - { - $ref_stack = []; - $result_size = 0.0; - do { - $f_style = $f->get_style(); - $current_size = $f_style->$type; - if (Helpers::is_percent($current_size)) { - $ref_stack[] = str_replace('%px', '%', $current_size); - } else { - // auto is a valid first result. In case of previous percentage values we need a real size - if ($current_size !== 'auto' || count($ref_stack) === 0) { - $result_size = $f_style->length_in_pt($current_size); - break; - } - } - } while (($f = $f->get_parent())); - - // if we built a percentage stack walk up to find the real size - if (count($ref_stack) > 0) { - while (($ref = array_pop($ref_stack))) { - $result_size = $f_style->length_in_pt($ref, $result_size); - } - } - - return $result_size; - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/Inline.php b/vendor/dompdf/dompdf/src/FrameReflower/Inline.php deleted file mode 100644 index 68662a5..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/Inline.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\Frame; -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; -use Dompdf\FrameDecorator\Text as TextFrameDecorator; - -/** - * Reflows inline frames - * - * @package dompdf - */ -class Inline extends AbstractFrameReflower -{ - - /** - * Inline constructor. - * @param Frame $frame - */ - function __construct(Frame $frame) - { - parent::__construct($frame); - } - - /** - * @param BlockFrameDecorator|null $block - */ - function reflow(BlockFrameDecorator $block = null) - { - $frame = $this->_frame; - - // Check if a page break is forced - $page = $frame->get_root(); - $page->check_forced_page_break($frame); - - if ($page->is_full()) { - return; - } - - $style = $frame->get_style(); - - // Generated content - $this->_set_content(); - - $frame->position(); - - $cb = $frame->get_containing_block(); - - // Add our margin, padding & border to the first and last children - if (($f = $frame->get_first_child()) && $f instanceof TextFrameDecorator) { - $f_style = $f->get_style(); - $f_style->margin_left = $style->margin_left; - $f_style->padding_left = $style->padding_left; - $f_style->border_left = $style->border_left; - } - - if (($l = $frame->get_last_child()) && $l instanceof TextFrameDecorator) { - $l_style = $l->get_style(); - $l_style->margin_right = $style->margin_right; - $l_style->padding_right = $style->padding_right; - $l_style->border_right = $style->border_right; - } - - if ($block) { - $block->add_frame_to_line($this->_frame); - } - - // Set the containing blocks and reflow each child. The containing - // block is not changed by line boxes. - foreach ($frame->get_children() as $child) { - $child->set_containing_block($cb); - $child->reflow($block); - } - } - - /** - * Determine current frame width based on contents - * - * @return float - */ - public function calculate_auto_width() - { - $width = 0; - - foreach ($this->_frame->get_children() as $child) { - if ($child->get_original_style()->width == 'auto') { - $width += $child->calculate_auto_width(); - } else { - $width += $child->get_margin_width(); - } - } - - $this->_frame->get_style()->width = $width; - - return $this->_frame->get_margin_width(); - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/ListBullet.php b/vendor/dompdf/dompdf/src/FrameReflower/ListBullet.php deleted file mode 100644 index 48613cc..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/ListBullet.php +++ /dev/null @@ -1,45 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; -use Dompdf\FrameDecorator\AbstractFrameDecorator; - -/** - * Reflows list bullets - * - * @package dompdf - */ -class ListBullet extends AbstractFrameReflower -{ - - /** - * ListBullet constructor. - * @param AbstractFrameDecorator $frame - */ - function __construct(AbstractFrameDecorator $frame) - { - parent::__construct($frame); - } - - /** - * @param BlockFrameDecorator|null $block - */ - function reflow(BlockFrameDecorator $block = null) - { - $style = $this->_frame->get_style(); - - $style->width = $this->_frame->get_width(); - $this->_frame->position(); - - if ($style->list_style_position === "inside") { - $p = $this->_frame->find_block_parent(); - $p->add_frame_to_line($this->_frame); - } - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/NullFrameReflower.php b/vendor/dompdf/dompdf/src/FrameReflower/NullFrameReflower.php deleted file mode 100644 index 8bdb0f1..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/NullFrameReflower.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\FrameReflower; - -use Dompdf\Frame; -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; - -/** - * Dummy reflower - * - * @package dompdf - */ -class NullFrameReflower extends AbstractFrameReflower -{ - - /** - * NullFrameReflower constructor. - * @param Frame $frame - */ - function __construct(Frame $frame) - { - parent::__construct($frame); - } - - /** - * @param BlockFrameDecorator|null $block - */ - function reflow(BlockFrameDecorator $block = null) - { - return; - } - -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/Page.php b/vendor/dompdf/dompdf/src/FrameReflower/Page.php deleted file mode 100644 index 3399b97..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/Page.php +++ /dev/null @@ -1,205 +0,0 @@ - - * @author Fabien MƩnager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\Frame; -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; -use Dompdf\FrameDecorator\Page as PageFrameDecorator; - -/** - * Reflows pages - * - * @package dompdf - */ -class Page extends AbstractFrameReflower -{ - - /** - * Cache of the callbacks array - * - * @var array - */ - private $_callbacks; - - /** - * Cache of the canvas - * - * @var \Dompdf\Canvas - */ - private $_canvas; - - /** - * Page constructor. - * @param PageFrameDecorator $frame - */ - function __construct(PageFrameDecorator $frame) - { - parent::__construct($frame); - } - - /** - * @param Frame $frame - * @param $page_number - */ - function apply_page_style(Frame $frame, $page_number) - { - $style = $frame->get_style(); - $page_styles = $style->get_stylesheet()->get_page_styles(); - - // http://www.w3.org/TR/CSS21/page.html#page-selectors - if (count($page_styles) > 1) { - $odd = $page_number % 2 == 1; - $first = $page_number == 1; - - $style = clone $page_styles["base"]; - - // FIXME RTL - if ($odd && isset($page_styles[":right"])) { - $style->merge($page_styles[":right"]); - } - - if ($odd && isset($page_styles[":odd"])) { - $style->merge($page_styles[":odd"]); - } - - // FIXME RTL - if (!$odd && isset($page_styles[":left"])) { - $style->merge($page_styles[":left"]); - } - - if (!$odd && isset($page_styles[":even"])) { - $style->merge($page_styles[":even"]); - } - - if ($first && isset($page_styles[":first"])) { - $style->merge($page_styles[":first"]); - } - - $frame->set_style($style); - } - } - - /** - * Paged layout: - * http://www.w3.org/TR/CSS21/page.html - * - * @param BlockFrameDecorator|null $block - */ - function reflow(BlockFrameDecorator $block = null) - { - $fixed_children = []; - $prev_child = null; - $child = $this->_frame->get_first_child(); - $current_page = 0; - - while ($child) { - $this->apply_page_style($this->_frame, $current_page + 1); - - $style = $this->_frame->get_style(); - - // Pages are only concerned with margins - $cb = $this->_frame->get_containing_block(); - $left = (float)$style->length_in_pt($style->margin_left, $cb["w"]); - $right = (float)$style->length_in_pt($style->margin_right, $cb["w"]); - $top = (float)$style->length_in_pt($style->margin_top, $cb["h"]); - $bottom = (float)$style->length_in_pt($style->margin_bottom, $cb["h"]); - - $content_x = $cb["x"] + $left; - $content_y = $cb["y"] + $top; - $content_width = $cb["w"] - $left - $right; - $content_height = $cb["h"] - $top - $bottom; - - // Only if it's the first page, we save the nodes with a fixed position - if ($current_page == 0) { - $children = $child->get_children(); - foreach ($children as $onechild) { - if ($onechild->get_style()->position === "fixed") { - $fixed_children[] = $onechild->deep_copy(); - } - } - $fixed_children = array_reverse($fixed_children); - } - - $child->set_containing_block($content_x, $content_y, $content_width, $content_height); - - // Check for begin reflow callback - $this->_check_callbacks("begin_page_reflow", $child); - - //Insert a copy of each node which have a fixed position - if ($current_page >= 1) { - foreach ($fixed_children as $fixed_child) { - $child->insert_child_before($fixed_child->deep_copy(), $child->get_first_child()); - } - } - - $child->reflow(); - $next_child = $child->get_next_sibling(); - - // Check for begin render callback - $this->_check_callbacks("begin_page_render", $child); - - // Render the page - $this->_frame->get_renderer()->render($child); - - // Check for end render callback - $this->_check_callbacks("end_page_render", $child); - - if ($next_child) { - $this->_frame->next_page(); - } - - // Wait to dispose of all frames on the previous page - // so callback will have access to them - if ($prev_child) { - $prev_child->dispose(true); - } - $prev_child = $child; - $child = $next_child; - $current_page++; - } - - // Dispose of previous page if it still exists - if ($prev_child) { - $prev_child->dispose(true); - } - } - - /** - * Check for callbacks that need to be performed when a given event - * gets triggered on a page - * - * @param string $event the type of event - * @param Frame $frame the frame that event is triggered on - */ - protected function _check_callbacks($event, $frame) - { - if (!isset($this->_callbacks)) { - $dompdf = $this->_frame->get_dompdf(); - $this->_callbacks = $dompdf->get_callbacks(); - $this->_canvas = $dompdf->get_canvas(); - } - - if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) { - $info = [ - 0 => $this->_canvas, "canvas" => $this->_canvas, - 1 => $frame, "frame" => $frame, - ]; - $fs = $this->_callbacks[$event]; - foreach ($fs as $f) { - if (is_callable($f)) { - if (is_array($f)) { - $f[0]->{$f[1]}($info); - } else { - $f($info); - } - } - } - } - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/Table.php b/vendor/dompdf/dompdf/src/FrameReflower/Table.php deleted file mode 100644 index ebf430e..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/Table.php +++ /dev/null @@ -1,589 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; -use Dompdf\FrameDecorator\Table as TableFrameDecorator; - -/** - * Reflows tables - * - * @access private - * @package dompdf - */ -class Table extends AbstractFrameReflower -{ - /** - * Frame for this reflower - * - * @var TableFrameDecorator - */ - protected $_frame; - - /** - * Cache of results between call to get_min_max_width and assign_widths - * - * @var array - */ - protected $_state; - - /** - * Table constructor. - * @param TableFrameDecorator $frame - */ - function __construct(TableFrameDecorator $frame) - { - $this->_state = null; - parent::__construct($frame); - } - - /** - * State is held here so it needs to be reset along with the decorator - */ - function reset() - { - $this->_state = null; - $this->_min_max_cache = null; - } - - protected function _assign_widths() - { - $style = $this->_frame->get_style(); - - // Find the min/max width of the table and sort the columns into - // absolute/percent/auto arrays - $min_width = $this->_state["min_width"]; - $max_width = $this->_state["max_width"]; - $percent_used = $this->_state["percent_used"]; - $absolute_used = $this->_state["absolute_used"]; - $auto_min = $this->_state["auto_min"]; - - $absolute =& $this->_state["absolute"]; - $percent =& $this->_state["percent"]; - $auto =& $this->_state["auto"]; - - // Determine the actual width of the table - $cb = $this->_frame->get_containing_block(); - $columns =& $this->_frame->get_cellmap()->get_columns(); - - $width = $style->width; - - // Calculate padding & border fudge factor - $left = $style->margin_left; - $right = $style->margin_right; - - $centered = ($left === "auto" && $right === "auto"); - - $left = (float)($left === "auto" ? 0 : $style->length_in_pt($left, $cb["w"])); - $right = (float)($right === "auto" ? 0 : $style->length_in_pt($right, $cb["w"])); - - $delta = $left + $right; - - if (!$centered) { - $delta += (float)$style->length_in_pt([ - $style->padding_left, - $style->border_left_width, - $style->border_right_width, - $style->padding_right], - $cb["w"]); - } - - $min_table_width = (float)$style->length_in_pt($style->min_width, $cb["w"] - $delta); - - // min & max widths already include borders & padding - $min_width -= $delta; - $max_width -= $delta; - - if ($width !== "auto") { - $preferred_width = (float)$style->length_in_pt($width, $cb["w"]) - $delta; - - if ($preferred_width < $min_table_width) { - $preferred_width = $min_table_width; - } - - if ($preferred_width > $min_width) { - $width = $preferred_width; - } else { - $width = $min_width; - } - - } else { - if ($max_width + $delta < $cb["w"]) { - $width = $max_width; - } else if ($cb["w"] - $delta > $min_width) { - $width = $cb["w"] - $delta; - } else { - $width = $min_width; - } - - if ($width < $min_table_width) { - $width = $min_table_width; - } - - } - - // Store our resolved width - $style->width = $width; - - $cellmap = $this->_frame->get_cellmap(); - - if ($cellmap->is_columns_locked()) { - return; - } - - // If the whole table fits on the page, then assign each column it's max width - if ($width == $max_width) { - foreach (array_keys($columns) as $i) { - $cellmap->set_column_width($i, $columns[$i]["max-width"]); - } - - return; - } - - // Determine leftover and assign it evenly to all columns - if ($width > $min_width) { - // We have four cases to deal with: - // - // 1. All columns are auto--no widths have been specified. In this - // case we distribute extra space across all columns weighted by max-width. - // - // 2. Only absolute widths have been specified. In this case we - // distribute any extra space equally among 'width: auto' columns, or all - // columns if no auto columns have been specified. - // - // 3. Only percentage widths have been specified. In this case we - // normalize the percentage values and distribute any remaining % to - // width: auto columns. We then proceed to assign widths as fractions - // of the table width. - // - // 4. Both absolute and percentage widths have been specified. - - $increment = 0; - - // Case 1: - if ($absolute_used == 0 && $percent_used == 0) { - $increment = $width - $min_width; - - foreach (array_keys($columns) as $i) { - $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment * ($columns[$i]["max-width"] / $max_width)); - } - return; - } - - // Case 2 - if ($absolute_used > 0 && $percent_used == 0) { - if (count($auto) > 0) { - $increment = ($width - $auto_min - $absolute_used) / count($auto); - } - - // Use the absolutely specified width or the increment - foreach (array_keys($columns) as $i) { - if ($columns[$i]["absolute"] > 0 && count($auto)) { - $cellmap->set_column_width($i, $columns[$i]["min-width"]); - } else if (count($auto)) { - $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); - } else { - // All absolute columns - $increment = ($width - $absolute_used) * $columns[$i]["absolute"] / $absolute_used; - - $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); - } - - } - return; - } - - // Case 3: - if ($absolute_used == 0 && $percent_used > 0) { - $scale = null; - $remaining = null; - - // Scale percent values if the total percentage is > 100, or if all - // values are specified as percentages. - if ($percent_used > 100 || count($auto) == 0) { - $scale = 100 / $percent_used; - } else { - $scale = 1; - } - - // Account for the minimum space used by the unassigned auto columns - $used_width = $auto_min; - - foreach ($percent as $i) { - $columns[$i]["percent"] *= $scale; - - $slack = $width - $used_width; - - $w = min($columns[$i]["percent"] * $width / 100, $slack); - - if ($w < $columns[$i]["min-width"]) { - $w = $columns[$i]["min-width"]; - } - - $cellmap->set_column_width($i, $w); - $used_width += $w; - - } - - // This works because $used_width includes the min-width of each - // unassigned column - if (count($auto) > 0) { - $increment = ($width - $used_width) / count($auto); - - foreach ($auto as $i) { - $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); - } - - } - return; - } - - // Case 4: - - // First-come, first served - if ($absolute_used > 0 && $percent_used > 0) { - $used_width = $auto_min; - - foreach ($absolute as $i) { - $cellmap->set_column_width($i, $columns[$i]["min-width"]); - $used_width += $columns[$i]["min-width"]; - } - - // Scale percent values if the total percentage is > 100 or there - // are no auto values to take up slack - if ($percent_used > 100 || count($auto) == 0) { - $scale = 100 / $percent_used; - } else { - $scale = 1; - } - - $remaining_width = $width - $used_width; - - foreach ($percent as $i) { - $slack = $remaining_width - $used_width; - - $columns[$i]["percent"] *= $scale; - $w = min($columns[$i]["percent"] * $remaining_width / 100, $slack); - - if ($w < $columns[$i]["min-width"]) { - $w = $columns[$i]["min-width"]; - } - - $columns[$i]["used-width"] = $w; - $used_width += $w; - } - - if (count($auto) > 0) { - $increment = ($width - $used_width) / count($auto); - - foreach ($auto as $i) { - $cellmap->set_column_width($i, $columns[$i]["min-width"] + $increment); - } - } - - return; - } - } else { // we are over constrained - // Each column gets its minimum width - foreach (array_keys($columns) as $i) { - $cellmap->set_column_width($i, $columns[$i]["min-width"]); - } - } - } - - /** - * Determine the frame's height based on min/max height - * - * @return float|int|mixed|string - */ - protected function _calculate_height() - { - $style = $this->_frame->get_style(); - $height = $style->height; - - $cellmap = $this->_frame->get_cellmap(); - $cellmap->assign_frame_heights(); - $rows = $cellmap->get_rows(); - - // Determine our content height - $content_height = 0; - foreach ($rows as $r) { - $content_height += $r["height"]; - } - - $cb = $this->_frame->get_containing_block(); - - if (!($style->overflow === "visible" || - ($style->overflow === "hidden" && $height === "auto")) - ) { - // Only handle min/max height if the height is independent of the frame's content - - $min_height = $style->min_height; - $max_height = $style->max_height; - - if (isset($cb["h"])) { - $min_height = $style->length_in_pt($min_height, $cb["h"]); - $max_height = $style->length_in_pt($max_height, $cb["h"]); - - } else if (isset($cb["w"])) { - if (mb_strpos($min_height, "%") !== false) { - $min_height = 0; - } else { - $min_height = $style->length_in_pt($min_height, $cb["w"]); - } - if (mb_strpos($max_height, "%") !== false) { - $max_height = "none"; - } else { - $max_height = $style->length_in_pt($max_height, $cb["w"]); - } - } - - if ($max_height !== "none" && $min_height > $max_height) { - // Swap 'em - list($max_height, $min_height) = [$min_height, $max_height]; - } - - if ($max_height !== "none" && $height > $max_height) { - $height = $max_height; - } - - if ($height < $min_height) { - $height = $min_height; - } - } else { - // Use the content height or the height value, whichever is greater - if ($height !== "auto") { - $height = $style->length_in_pt($height, $cb["h"]); - - if ($height <= $content_height) { - $height = $content_height; - } else { - $cellmap->set_frame_heights($height, $content_height); - } - } else { - $height = $content_height; - } - } - - return $height; - } - - /** - * @param BlockFrameDecorator $block - */ - function reflow(BlockFrameDecorator $block = null) - { - /** @var TableFrameDecorator */ - $frame = $this->_frame; - - // Check if a page break is forced - $page = $frame->get_root(); - $page->check_forced_page_break($frame); - - // Bail if the page is full - if ($page->is_full()) { - return; - } - - // Let the page know that we're reflowing a table so that splits - // are suppressed (simply setting page-break-inside: avoid won't - // work because we may have an arbitrary number of block elements - // inside tds.) - $page->table_reflow_start(); - - // Collapse vertical margins, if required - $this->_collapse_margins(); - - $frame->position(); - - // Table layout algorithm: - // http://www.w3.org/TR/CSS21/tables.html#auto-table-layout - - if (is_null($this->_state)) { - $this->get_min_max_width(); - } - - $cb = $frame->get_containing_block(); - $style = $frame->get_style(); - - // This is slightly inexact, but should be okay. Add half the - // border-spacing to the table as padding. The other half is added to - // the cells themselves. - if ($style->border_collapse === "separate") { - list($h, $v) = $style->border_spacing; - - $v = (float)$style->length_in_pt($v) / 2; - $h = (float)$style->length_in_pt($h) / 2; - - $style->padding_left = (float)$style->length_in_pt($style->padding_left, $cb["w"]) + $h; - $style->padding_right = (float)$style->length_in_pt($style->padding_right, $cb["w"]) + $h; - $style->padding_top = (float)$style->length_in_pt($style->padding_top, $cb["h"]) + $v; - $style->padding_bottom = (float)$style->length_in_pt($style->padding_bottom, $cb["h"]) + $v; - } - - $this->_assign_widths(); - - // Adjust left & right margins, if they are auto - $width = $style->width; - $left = $style->margin_left; - $right = $style->margin_right; - - $diff = (float)$cb["w"] - (float)$width; - - if ($left === "auto" && $right === "auto") { - if ($diff < 0) { - $left = 0; - $right = $diff; - } else { - $left = $right = $diff / 2; - } - - $style->margin_left = sprintf("%Fpt", $left); - $style->margin_right = sprintf("%Fpt", $right);; - } else { - if ($left === "auto") { - $left = (float)$style->length_in_pt($cb["w"], $cb["w"]) - (float)$style->length_in_pt($right, $cb["w"]) - (float)$style->length_in_pt($width, $cb["w"]); - } - if ($right === "auto") { - $left = (float)$style->length_in_pt($left, $cb["w"]); - } - } - - list($x, $y) = $frame->get_position(); - - // Determine the content edge - $content_x = $x + (float)$left + (float)$style->length_in_pt([$style->padding_left, - $style->border_left_width], $cb["w"]); - $content_y = $y + (float)$style->length_in_pt([$style->margin_top, - $style->border_top_width, - $style->padding_top], $cb["h"]); - - if (isset($cb["h"])) { - $h = $cb["h"]; - } else { - $h = null; - } - - $cellmap = $frame->get_cellmap(); - $col =& $cellmap->get_column(0); - $col["x"] = $content_x; - - $row =& $cellmap->get_row(0); - $row["y"] = $content_y; - - $cellmap->assign_x_positions(); - - // Set the containing block of each child & reflow - foreach ($frame->get_children() as $child) { - // Bail if the page is full - if (!$page->in_nested_table() && $page->is_full()) { - break; - } - - $child->set_containing_block($content_x, $content_y, $width, $h); - $child->reflow(); - - if (!$page->in_nested_table()) { - // Check if a split has occured - $page->check_page_break($child); - } - - } - - // Assign heights to our cells: - $style->height = $this->_calculate_height(); - - if ($style->border_collapse === "collapse") { - // Unset our borders because our cells are now using them - $style->border_style = "none"; - } - - $page->table_reflow_end(); - - // Debugging: - //echo ($this->_frame->get_cellmap()); - - if ($block && $style->float === "none" && $frame->is_in_flow()) { - $block->add_frame_to_line($frame); - $block->add_line(); - } - } - - /** - * @return array|null - */ - function get_min_max_width() - { - if (!is_null($this->_min_max_cache)) { - return $this->_min_max_cache; - } - - $style = $this->_frame->get_style(); - - $this->_frame->normalise(); - - // Add the cells to the cellmap (this will calcluate column widths as - // frames are added) - $this->_frame->get_cellmap()->add_frame($this->_frame); - - // Find the min/max width of the table and sort the columns into - // absolute/percent/auto arrays - $this->_state = []; - $this->_state["min_width"] = 0; - $this->_state["max_width"] = 0; - - $this->_state["percent_used"] = 0; - $this->_state["absolute_used"] = 0; - $this->_state["auto_min"] = 0; - - $this->_state["absolute"] = []; - $this->_state["percent"] = []; - $this->_state["auto"] = []; - - $columns =& $this->_frame->get_cellmap()->get_columns(); - foreach (array_keys($columns) as $i) { - $this->_state["min_width"] += $columns[$i]["min-width"]; - $this->_state["max_width"] += $columns[$i]["max-width"]; - - if ($columns[$i]["absolute"] > 0) { - $this->_state["absolute"][] = $i; - $this->_state["absolute_used"] += $columns[$i]["absolute"]; - } else if ($columns[$i]["percent"] > 0) { - $this->_state["percent"][] = $i; - $this->_state["percent_used"] += $columns[$i]["percent"]; - } else { - $this->_state["auto"][] = $i; - $this->_state["auto_min"] += $columns[$i]["min-width"]; - } - } - - // Account for margins & padding - $dims = [$style->border_left_width, - $style->border_right_width, - $style->padding_left, - $style->padding_right, - $style->margin_left, - $style->margin_right]; - - if ($style->border_collapse !== "collapse") { - list($dims[]) = $style->border_spacing; - } - - $delta = (float)$style->length_in_pt($dims, $this->_frame->get_containing_block("w")); - - $this->_state["min_width"] += $delta; - $this->_state["max_width"] += $delta; - - return $this->_min_max_cache = [ - $this->_state["min_width"], - $this->_state["max_width"], - "min" => $this->_state["min_width"], - "max" => $this->_state["max_width"], - ]; - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/TableCell.php b/vendor/dompdf/dompdf/src/FrameReflower/TableCell.php deleted file mode 100644 index b3c93df..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/TableCell.php +++ /dev/null @@ -1,121 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; -use Dompdf\FrameDecorator\Table as TableFrameDecorator; - -/** - * Reflows table cells - * - * @package dompdf - */ -class TableCell extends Block -{ - /** - * TableCell constructor. - * @param BlockFrameDecorator $frame - */ - function __construct(BlockFrameDecorator $frame) - { - parent::__construct($frame); - } - - /** - * @param BlockFrameDecorator|null $block - */ - function reflow(BlockFrameDecorator $block = null) - { - $style = $this->_frame->get_style(); - - $table = TableFrameDecorator::find_parent_table($this->_frame); - $cellmap = $table->get_cellmap(); - - list($x, $y) = $cellmap->get_frame_position($this->_frame); - $this->_frame->set_position($x, $y); - - $cells = $cellmap->get_spanned_cells($this->_frame); - - $w = 0; - foreach ($cells["columns"] as $i) { - $col = $cellmap->get_column($i); - $w += $col["used-width"]; - } - - //FIXME? - $h = $this->_frame->get_containing_block("h"); - - $left_space = (float)$style->length_in_pt([$style->margin_left, - $style->padding_left, - $style->border_left_width], - $w); - - $right_space = (float)$style->length_in_pt([$style->padding_right, - $style->margin_right, - $style->border_right_width], - $w); - - $top_space = (float)$style->length_in_pt([$style->margin_top, - $style->padding_top, - $style->border_top_width], - $h); - $bottom_space = (float)$style->length_in_pt([$style->margin_bottom, - $style->padding_bottom, - $style->border_bottom_width], - $h); - - $style->width = $cb_w = $w - $left_space - $right_space; - - $content_x = $x + $left_space; - $content_y = $line_y = $y + $top_space; - - // Adjust the first line based on the text-indent property - $indent = (float)$style->length_in_pt($style->text_indent, $w); - $this->_frame->increase_line_width($indent); - - $page = $this->_frame->get_root(); - - // Set the y position of the first line in the cell - $line_box = $this->_frame->get_current_line_box(); - $line_box->y = $line_y; - - // Set the containing blocks and reflow each child - foreach ($this->_frame->get_children() as $child) { - if ($page->is_full()) { - break; - } - - $child->set_containing_block($content_x, $content_y, $cb_w, $h); - $this->process_clear($child); - $child->reflow($this->_frame); - $this->process_float($child, $x + $left_space, $w - $right_space - $left_space); - } - - // Determine our height - $style_height = (float)$style->length_in_pt($style->height, $h); - - $this->_frame->set_content_height($this->_calculate_content_height()); - - $height = max($style_height, (float)$this->_frame->get_content_height()); - - // Let the cellmap know our height - $cell_height = $height / count($cells["rows"]); - - if ($style_height <= $height) { - $cell_height += $top_space + $bottom_space; - } - - foreach ($cells["rows"] as $i) { - $cellmap->set_row_height($i, $cell_height); - } - - $style->height = $height; - $this->_text_align(); - $this->vertical_align(); - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/TableRow.php b/vendor/dompdf/dompdf/src/FrameReflower/TableRow.php deleted file mode 100644 index 5b94473..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/TableRow.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; -use Dompdf\FrameDecorator\Table as TableFrameDecorator; -use Dompdf\FrameDecorator\TableRow as TableRowFrameDecorator; -use Dompdf\Exception; - -/** - * Reflows table rows - * - * @package dompdf - */ -class TableRow extends AbstractFrameReflower -{ - /** - * TableRow constructor. - * @param TableRowFrameDecorator $frame - */ - function __construct(TableRowFrameDecorator $frame) - { - parent::__construct($frame); - } - - /** - * @param BlockFrameDecorator|null $block - */ - function reflow(BlockFrameDecorator $block = null) - { - $page = $this->_frame->get_root(); - - if ($page->is_full()) { - return; - } - - $this->_frame->position(); - $style = $this->_frame->get_style(); - $cb = $this->_frame->get_containing_block(); - - foreach ($this->_frame->get_children() as $child) { - if ($page->is_full()) { - return; - } - - $child->set_containing_block($cb); - $child->reflow(); - } - - if ($page->is_full()) { - return; - } - - $table = TableFrameDecorator::find_parent_table($this->_frame); - $cellmap = $table->get_cellmap(); - $style->width = $cellmap->get_frame_width($this->_frame); - $style->height = $cellmap->get_frame_height($this->_frame); - - $this->_frame->set_position($cellmap->get_frame_position($this->_frame)); - } - - /** - * @throws Exception - */ - function get_min_max_width() - { - throw new Exception("Min/max width is undefined for table rows"); - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/TableRowGroup.php b/vendor/dompdf/dompdf/src/FrameReflower/TableRowGroup.php deleted file mode 100644 index 13a1987..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/TableRowGroup.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; -use Dompdf\FrameDecorator\Table as TableFrameDecorator; - -/** - * Reflows table row groups (e.g. tbody tags) - * - * @package dompdf - */ -class TableRowGroup extends AbstractFrameReflower -{ - - /** - * TableRowGroup constructor. - * @param \Dompdf\Frame $frame - */ - function __construct($frame) - { - parent::__construct($frame); - } - - /** - * @param BlockFrameDecorator|null $block - */ - function reflow(BlockFrameDecorator $block = null) - { - $page = $this->_frame->get_root(); - - $style = $this->_frame->get_style(); - - // Our width is equal to the width of our parent table - $table = TableFrameDecorator::find_parent_table($this->_frame); - - $cb = $this->_frame->get_containing_block(); - - foreach ($this->_frame->get_children() as $child) { - // Bail if the page is full - if ($page->is_full()) { - return; - } - - $child->set_containing_block($cb["x"], $cb["y"], $cb["w"], $cb["h"]); - $child->reflow(); - - // Check if a split has occured - $page->check_page_break($child); - } - - if ($page->is_full()) { - return; - } - - $cellmap = $table->get_cellmap(); - $style->width = $cellmap->get_frame_width($this->_frame); - $style->height = $cellmap->get_frame_height($this->_frame); - - $this->_frame->set_position($cellmap->get_frame_position($this->_frame)); - - if ($table->get_style()->border_collapse === "collapse") { - // Unset our borders because our cells are now using them - $style->border_style = "none"; - } - } -} diff --git a/vendor/dompdf/dompdf/src/FrameReflower/Text.php b/vendor/dompdf/dompdf/src/FrameReflower/Text.php deleted file mode 100644 index ea92343..0000000 --- a/vendor/dompdf/dompdf/src/FrameReflower/Text.php +++ /dev/null @@ -1,512 +0,0 @@ - - * @author Fabien MƩnager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\FrameReflower; - -use Dompdf\FrameDecorator\Block as BlockFrameDecorator; -use Dompdf\FrameDecorator\Text as TextFrameDecorator; -use Dompdf\FontMetrics; -use Dompdf\Helpers; - -/** - * Reflows text frames. - * - * @package dompdf - */ -class Text extends AbstractFrameReflower -{ - - /** - * @var BlockFrameDecorator - */ - protected $_block_parent; // Nearest block-level ancestor - - /** - * @var TextFrameDecorator - */ - protected $_frame; - - // The regex splits on everything that's a separator (^\S double negative), excluding nbsp (\xa0) - // This currently excludes the "narrow nbsp" character - public static $_whitespace_pattern = '/([^\S\xA0]+)/u'; - // The regex splits on everything that's a separator (^\S double negative), excluding nbsp (\xa0), plus dashes - // This currently excludes the "narrow nbsp" character - public static $_wordbreak_pattern = '/([^\S\xA0]+|-+)/u'; - - /** - * @var FontMetrics - */ - private $fontMetrics; - - /** - * @param TextFrameDecorator $frame - * @param FontMetrics $fontMetrics - */ - public function __construct(TextFrameDecorator $frame, FontMetrics $fontMetrics) - { - parent::__construct($frame); - $this->setFontMetrics($fontMetrics); - } - - /** - * @param $text - * @return mixed - */ - protected function _collapse_white_space($text) - { - return preg_replace(self::$_whitespace_pattern, " ", $text); - } - - /** - * @param $text - * @return bool|int - */ - protected function _line_break($text) - { - $style = $this->_frame->get_style(); - $size = $style->font_size; - $font = $style->font_family; - $current_line = $this->_block_parent->get_current_line_box(); - - // Determine the available width - $line_width = $this->_frame->get_containing_block("w"); - $current_line_width = $current_line->left + $current_line->w + $current_line->right; - - $available_width = $line_width - $current_line_width; - - // Account for word-spacing - $word_spacing = (float)$style->length_in_pt($style->word_spacing); - $char_spacing = (float)$style->length_in_pt($style->letter_spacing); - - // Determine the frame width including margin, padding & border - $text_width = $this->getFontMetrics()->getTextWidth($text, $font, $size, $word_spacing, $char_spacing); - $mbp_width = - (float)$style->length_in_pt([$style->margin_left, - $style->border_left_width, - $style->padding_left, - $style->padding_right, - $style->border_right_width, - $style->margin_right], $line_width); - - $frame_width = $text_width + $mbp_width; - -// Debugging: -// Helpers::pre_r("Text: '" . htmlspecialchars($text). "'"); -// Helpers::pre_r("width: " .$frame_width); -// Helpers::pre_r("textwidth + delta: $text_width + $mbp_width"); -// Helpers::pre_r("font-size: $size"); -// Helpers::pre_r("cb[w]: " .$line_width); -// Helpers::pre_r("available width: " . $available_width); -// Helpers::pre_r("current line width: " . $current_line_width); - -// Helpers::pre_r($words); - - if ($frame_width <= $available_width) { - return false; - } - - // split the text into words - $words = preg_split(self::$_wordbreak_pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE); - $wc = count($words); - - // Determine the split point - $width = 0; - $str = ""; - reset($words); - - // @todo support , - for ($i = 0; $i < $wc; $i += 2) { - $word = $words[$i] . (isset($words[$i + 1]) ? $words[$i + 1] : ""); - $word_width = $this->getFontMetrics()->getTextWidth($word, $font, $size, $word_spacing, $char_spacing); - if ($width + $word_width + $mbp_width > $available_width) { - break; - } - - $width += $word_width; - $str .= $word; - } - - $break_word = ($style->word_wrap === "break-word"); - - // The first word has overflowed. Force it onto the line - if ($current_line_width == 0 && $width == 0) { - $s = ""; - $last_width = 0; - - if ($break_word) { - for ($j = 0; $j < strlen($word); $j++) { - $s .= $word[$j]; - $_width = $this->getFontMetrics()->getTextWidth($s, $font, $size, $word_spacing, $char_spacing); - if ($_width > $available_width) { - break; - } - - $last_width = $_width; - } - } - - if ($break_word && $last_width > 0) { - //$width += $last_width; - $str .= substr($s, 0, -1); - } else { - //$width += $word_width; - $str .= $word; - } - } - - $offset = mb_strlen($str); - - // More debugging: - // var_dump($str); - // print_r("Width: ". $width); - // print_r("Offset: " . $offset); - - return $offset; - } - - //........................................................................ - - /** - * @param $text - * @return bool|int - */ - protected function _newline_break($text) - { - if (($i = mb_strpos($text, "\n")) === false) { - return false; - } - - return $i + 1; - } - - protected function _layout_line(): bool - { - $frame = $this->_frame; - $style = $frame->get_style(); - $text = $frame->get_text(); - $size = $style->font_size; - $font = $style->font_family; - - // Determine the text height - $style->height = $this->getFontMetrics()->getFontHeight($font, $size); - - $split = false; - $add_line = false; - - // Handle text transform: - // http://www.w3.org/TR/CSS21/text.html#propdef-text-transform - switch (strtolower($style->text_transform)) { - default: - break; - case "capitalize": - $text = Helpers::mb_ucwords($text); - break; - case "uppercase": - $text = mb_convert_case($text, MB_CASE_UPPER); - break; - case "lowercase": - $text = mb_convert_case($text, MB_CASE_LOWER); - break; - } - - // Handle white-space property: - // http://www.w3.org/TR/CSS21/text.html#propdef-white-space - switch ($style->white_space) { - default: - case "normal": - $frame->set_text($text = $this->_collapse_white_space($text)); - if ($text === "") { - break; - } - - $split = $this->_line_break($text); - break; - - case "pre": - $split = $this->_newline_break($text); - $add_line = $split !== false; - break; - - case "nowrap": - $frame->set_text($text = $this->_collapse_white_space($text)); - break; - /** @noinspection PhpMissingBreakStatementInspection */ - case "pre-line": - // Collapse white-space except for \n - $frame->set_text($text = preg_replace("/[ \t]+/u", " ", $text)); - - if ($text === "") { - break; - } - case "pre-wrap": - $split = $this->_newline_break($text); - - if (($tmp = $this->_line_break($text)) !== false) { - if ($split === false || $tmp < $split) { - $split = $tmp; - } else { - $add_line = true; - } - } else if ($split !== false) { - $add_line = true; - } - - break; - } - - // Handle degenerate case - if ($text === "") { - $split = 0; - } - - if ($split !== false) { - // Handle edge cases - if ($split == 0 && !$frame->is_pre() && empty(trim($text))) { - $frame->set_text(""); - } else if ($split === 0) { - // Remove any trailing white space from the previous sibling - if (($sibling = $frame->get_prev_sibling()) !== null) { - if ($sibling instanceof \Dompdf\FrameDecorator\Text && !$sibling->is_pre()) { - $st = $sibling->get_text(); - if (preg_match(self::$_whitespace_pattern, mb_substr($st, -1))) { - $sibling->set_text(mb_substr($st, 0, -1)); - $sibling->recalculate_width(); - $this->_block_parent->get_current_line_box()->recalculate_width(); - } - } - } - - // Trim newlines from the beginning of the line - //$this->_frame->set_text(ltrim($text, "\n\r")); - - $this->_block_parent->maximize_line_height($style->height, $frame); - $this->_block_parent->add_line(); - $frame->position(); - - // Layout the new line - $add_line = $this->_layout_line(); - } else if ($split < mb_strlen($frame->get_text())) { - // split the line if required - $frame->split_text($split); - - // Do we need to trim spaces on wrapped lines? This might be desired, however, we - // can't trim the lines here or the layout will be affected if trimming the line - // leaves enough space to fit the next word in the text stream (because pdf layout - // is performed elsewhere). - /*if (!$this->_frame->get_prev_sibling() && !$this->_frame->get_next_sibling()) { - $t = $this->_frame->get_text(); - $this->_frame->set_text( trim($t) ); - }*/ - } - - // Remove any trailing white space - if (!$frame->is_pre() && $add_line) { - $t = $frame->get_text(); - if (preg_match(self::$_whitespace_pattern, mb_substr($t, -1))) { - $frame->set_text(mb_substr($t, 0, -1)); - } - } - } else { - // Remove empty space from start and end of line, but only where there isn't an inline sibling - // and the parent node isn't an inline element with siblings - // FIXME: Include non-breaking spaces? - $t = $frame->get_text(); - $parent = $frame->get_parent(); - $is_inline_frame = ($parent instanceof \Dompdf\FrameDecorator\Inline); - - if ((!$is_inline_frame && !$frame->get_next_sibling()) /* || - ( $is_inline_frame && !$parent->get_next_sibling())*/ - ) { // fails BOLD UNDERLINED becomes BOLDUNDERLINED - $t = rtrim($t); - } - - if ((!$is_inline_frame && !$frame->get_prev_sibling()) /* || - ( $is_inline_frame && !$parent->get_prev_sibling())*/ - ) { // AB C fails (the whitespace is removed) - $t = ltrim($t); - } - - $frame->set_text($t); - } - - // Set our new width - $frame->recalculate_width(); - - return $add_line; - } - - /** - * @param BlockFrameDecorator|null $block - */ - function reflow(BlockFrameDecorator $block = null) - { - $frame = $this->_frame; - $page = $frame->get_root(); - $page->check_forced_page_break($this->_frame); - - if ($page->is_full()) { - return; - } - - $this->_block_parent = /*isset($block) ? $block : */ - $frame->find_block_parent(); - - // Left trim the text if this is the first text on the line and we're - // collapsing white space -// if ( $this->_block_parent->get_current_line()->w == 0 && -// ($frame->get_style()->white_space !== "pre" || -// $frame->get_style()->white_space !== "pre-wrap") ) { -// $frame->set_text( ltrim( $frame->get_text() ) ); -// } - - $frame->position(); - - $add_line = $this->_layout_line(); - - if ($block) { - $block->add_frame_to_line($frame); - - if ($add_line === true) { - $block->add_line(); - } - } - } - - //........................................................................ - - // Returns an array(0 => min, 1 => max, "min" => min, "max" => max) of the - // minimum and maximum widths of this frame - function get_min_max_width() - { - /*if ( !is_null($this->_min_max_cache) ) - return $this->_min_max_cache;*/ - $frame = $this->_frame; - $style = $frame->get_style(); - $this->_block_parent = $frame->find_block_parent(); - $line_width = $frame->get_containing_block("w"); - - $str = $text = $frame->get_text(); - $size = $style->font_size; - $font = $style->font_family; - - $word_spacing = (float)$style->length_in_pt($style->word_spacing); - $char_spacing = (float)$style->length_in_pt($style->letter_spacing); - - // determine minimum text width based on the whitespace setting - switch ($style->white_space) { - default: - /** @noinspection PhpMissingBreakStatementInspection */ - case "normal": - $str = preg_replace(self::$_whitespace_pattern, " ", $str); - case "pre-wrap": - case "pre-line": - - // Find the longest word (i.e. minimum length) - - // split the text into words - $words = array_flip(preg_split(self::$_wordbreak_pattern, $str, -1, PREG_SPLIT_DELIM_CAPTURE)); - $root = $this; - array_walk($words, function(&$chunked_text_width, $chunked_text) use ($font, $size, $word_spacing, $char_spacing, $root) { - $chunked_text_width = $root->getFontMetrics()->getTextWidth($chunked_text, $font, $size, $word_spacing, $char_spacing); - }); - - arsort($words); - $min = reset($words); - break; - - case "pre": - $lines = array_flip(preg_split("/\R/u", $str)); - $root = $this; - array_walk($lines, function(&$chunked_text_width, $chunked_text) use ($font, $size, $word_spacing, $char_spacing, $root) { - $chunked_text_width = $root->getFontMetrics()->getTextWidth($chunked_text, $font, $size, $word_spacing, $char_spacing); - }); - - arsort($lines); - $min = reset($lines); - break; - - case "nowrap": - $min = $this->getFontMetrics()->getTextWidth($this->_collapse_white_space($str), $font, $size, $word_spacing, $char_spacing); - break; - } - - // clean up the frame text based on the whitespace setting and use to determine maximum text width - switch ($style->white_space) { - default: - case "normal": - case "nowrap": - $str = preg_replace(self::$_whitespace_pattern, " ", $text); - break; - - case "pre-line": - $str = preg_replace("/[ \t]+/u", " ", $text); - break; - - case "pre-wrap": - // Find the longest word (i.e. minimum length) - $lines = array_flip(preg_split("/\R/u", $text)); - $root = $this; - array_walk($lines, function(&$chunked_text_width, $chunked_text) use ($font, $size, $word_spacing, $char_spacing, $root) { - $chunked_text_width = $root->getFontMetrics()->getTextWidth($chunked_text, $font, $size, $word_spacing, $char_spacing); - }); - arsort($lines); - reset($lines); - $str = key($lines); - break; - } - $max = $this->getFontMetrics()->getTextWidth($str, $font, $size, $word_spacing, $char_spacing); - - $delta = (float)$style->length_in_pt([$style->margin_left, - $style->border_left_width, - $style->padding_left, - $style->padding_right, - $style->border_right_width, - $style->margin_right], $line_width); - $min += $delta; - $min_word = $min; - $max += $delta; - - if ($style->word_wrap === 'break-word') { - // If it is allowed to break words, the min width is the widest character. - // But for performance reasons, we only check the first character. - $char = mb_substr($str, 0, 1); - $min_char = $this->getFontMetrics()->getTextWidth($char, $font, $size, $word_spacing, $char_spacing); - $min = $delta + $min_char; - } - - return $this->_min_max_cache = [$min, $max, $min_word, "min" => $min, "max" => $max, 'min_word' => $min_word]; - } - - /** - * @param FontMetrics $fontMetrics - * @return $this - */ - public function setFontMetrics(FontMetrics $fontMetrics) - { - $this->fontMetrics = $fontMetrics; - return $this; - } - - /** - * @return FontMetrics - */ - public function getFontMetrics() - { - return $this->fontMetrics; - } - - /** - * Determine current frame width based on contents - * - * @return float - */ - public function calculate_auto_width() - { - return $this->_frame->recalculate_width(); - } -} diff --git a/vendor/dompdf/dompdf/src/Helpers.php b/vendor/dompdf/dompdf/src/Helpers.php deleted file mode 100644 index f28508c..0000000 --- a/vendor/dompdf/dompdf/src/Helpers.php +++ /dev/null @@ -1,937 +0,0 @@ - tags if the current sapi is not 'cli'. - * Returns the output string instead of displaying it if $return is true. - * - * @param mixed $mixed variable or expression to display - * @param bool $return - * - * @return string|null - */ - public static function pre_r($mixed, $return = false) - { - if ($return) { - return "
" . print_r($mixed, true) . "
"; - } - - if (php_sapi_name() !== "cli") { - echo "
";
-        }
-
-        print_r($mixed);
-
-        if (php_sapi_name() !== "cli") {
-            echo "
"; - } else { - echo "\n"; - } - - flush(); - - return null; - } - - /** - * builds a full url given a protocol, hostname, base path and url - * - * @param string $protocol - * @param string $host - * @param string $base_path - * @param string $url - * @return string - * - * Initially the trailing slash of $base_path was optional, and conditionally appended. - * However on dynamically created sites, where the page is given as url parameter, - * the base path might not end with an url. - * Therefore do not append a slash, and **require** the $base_url to ending in a slash - * when needed. - * Vice versa, on using the local file system path of a file, make sure that the slash - * is appended (o.k. also for Windows) - */ - public static function build_url($protocol, $host, $base_path, $url) - { - $protocol = mb_strtolower($protocol); - if (strlen($url) == 0) { - //return $protocol . $host . rtrim($base_path, "/\\") . "/"; - return $protocol . $host . $base_path; - } - - // Is the url already fully qualified, a Data URI, or a reference to a named anchor? - // File-protocol URLs may require additional processing (e.g. for URLs with a relative path) - if ((mb_strpos($url, "://") !== false && substr($url, 0, 7) !== "file://") || mb_substr($url, 0, 1) === "#" || mb_strpos($url, "data:") === 0 || mb_strpos($url, "mailto:") === 0 || mb_strpos($url, "tel:") === 0) { - return $url; - } - - if (strpos($url, "file://") === 0) { - $url = substr($url, 7); - $protocol = ""; - } - - $ret = ""; - if ($protocol != "file://") { - $ret = $protocol; - } - - if (!in_array(mb_strtolower($protocol), ["http://", "https://", "ftp://", "ftps://"])) { - //On Windows local file, an abs path can begin also with a '\' or a drive letter and colon - //drive: followed by a relative path would be a drive specific default folder. - //not known in php app code, treat as abs path - //($url[1] !== ':' || ($url[2]!=='\\' && $url[2]!=='/')) - if ($url[0] !== '/' && (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' || (mb_strlen($url) > 1 && $url[0] !== '\\' && $url[1] !== ':'))) { - // For rel path and local access we ignore the host, and run the path through realpath() - $ret .= realpath($base_path) . '/'; - } - $ret .= $url; - $ret = preg_replace('/\?(.*)$/', "", $ret); - return $ret; - } - - // Protocol relative urls (e.g. "//example.org/style.css") - if (strpos($url, '//') === 0) { - $ret .= substr($url, 2); - //remote urls with backslash in html/css are not really correct, but lets be genereous - } elseif ($url[0] === '/' || $url[0] === '\\') { - // Absolute path - $ret .= $host . $url; - } else { - // Relative path - //$base_path = $base_path !== "" ? rtrim($base_path, "/\\") . "/" : ""; - $ret .= $host . $base_path . $url; - } - - // URL should now be complete, final cleanup - $parsed_url = parse_url($ret); - - // reproduced from https://www.php.net/manual/en/function.parse-url.php#106731 - $scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : ''; - $host = isset($parsed_url['host']) ? $parsed_url['host'] : ''; - $port = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : ''; - $user = isset($parsed_url['user']) ? $parsed_url['user'] : ''; - $pass = isset($parsed_url['pass']) ? ':' . $parsed_url['pass'] : ''; - $pass = ($user || $pass) ? "$pass@" : ''; - $path = isset($parsed_url['path']) ? $parsed_url['path'] : ''; - $query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : ''; - $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : ''; - - // partially reproduced from https://stackoverflow.com/a/1243431/264628 - /* replace '//' or '/./' or '/foo/../' with '/' */ - $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#'); - for($n=1; $n>0; $path=preg_replace($re, '/', $path, -1, $n)) {} - - $ret = "$scheme$user$pass$host$port$path$query$fragment"; - - return $ret; - } - - /** - * Builds a HTTP Content-Disposition header string using `$dispositionType` - * and `$filename`. - * - * If the filename contains any characters not in the ISO-8859-1 character - * set, a fallback filename will be included for clients not supporting the - * `filename*` parameter. - * - * @param string $dispositionType - * @param string $filename - * @return string - */ - public static function buildContentDispositionHeader($dispositionType, $filename) - { - $encoding = mb_detect_encoding($filename); - $fallbackfilename = mb_convert_encoding($filename, "ISO-8859-1", $encoding); - $fallbackfilename = str_replace("\"", "", $fallbackfilename); - $encodedfilename = rawurlencode($filename); - - $contentDisposition = "Content-Disposition: $dispositionType; filename=\"$fallbackfilename\""; - if ($fallbackfilename !== $filename) { - $contentDisposition .= "; filename*=UTF-8''$encodedfilename"; - } - - return $contentDisposition; - } - - /** - * Converts decimal numbers to roman numerals - * - * @param int $num - * - * @throws Exception - * @return string - */ - public static function dec2roman($num) - { - - static $ones = ["", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix"]; - static $tens = ["", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc"]; - static $hund = ["", "c", "cc", "ccc", "cd", "d", "dc", "dcc", "dccc", "cm"]; - static $thou = ["", "m", "mm", "mmm"]; - - if (!is_numeric($num)) { - throw new Exception("dec2roman() requires a numeric argument."); - } - - if ($num > 4000 || $num < 0) { - return "(out of range)"; - } - - $num = strrev((string)$num); - - $ret = ""; - switch (mb_strlen($num)) { - /** @noinspection PhpMissingBreakStatementInspection */ - case 4: - $ret .= $thou[$num[3]]; - /** @noinspection PhpMissingBreakStatementInspection */ - case 3: - $ret .= $hund[$num[2]]; - /** @noinspection PhpMissingBreakStatementInspection */ - case 2: - $ret .= $tens[$num[1]]; - /** @noinspection PhpMissingBreakStatementInspection */ - case 1: - $ret .= $ones[$num[0]]; - default: - break; - } - - return $ret; - } - - /** - * Determines whether $value is a percentage or not - * - * @param float $value - * - * @return bool - */ - public static function is_percent($value) - { - return false !== mb_strpos($value, "%"); - } - - /** - * Parses a data URI scheme - * http://en.wikipedia.org/wiki/Data_URI_scheme - * - * @param string $data_uri The data URI to parse - * - * @return array|bool The result with charset, mime type and decoded data - */ - public static function parse_data_uri($data_uri) - { - if (!preg_match('/^data:(?P[a-z0-9\/+-.]+)(;charset=(?P[a-z0-9-])+)?(?P;base64)?\,(?P.*)?/is', $data_uri, $match)) { - return false; - } - - $match['data'] = rawurldecode($match['data']); - $result = [ - 'charset' => $match['charset'] ? $match['charset'] : 'US-ASCII', - 'mime' => $match['mime'] ? $match['mime'] : 'text/plain', - 'data' => $match['base64'] ? base64_decode($match['data']) : $match['data'], - ]; - - return $result; - } - - /** - * Encodes a Uniform Resource Identifier (URI) by replacing non-alphanumeric - * characters with a percent (%) sign followed by two hex digits, excepting - * characters in the URI reserved character set. - * - * Assumes that the URI is a complete URI, so does not encode reserved - * characters that have special meaning in the URI. - * - * Simulates the encodeURI function available in JavaScript - * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURI - * - * Source: http://stackoverflow.com/q/4929584/264628 - * - * @param string $uri The URI to encode - * @return string The original URL with special characters encoded - */ - public static function encodeURI($uri) { - $unescaped = [ - '%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~', - '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')' - ]; - $reserved = [ - '%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','%3A'=>':', - '%40'=>'@','%26'=>'&','%3D'=>'=','%2B'=>'+','%24'=>'$' - ]; - $score = [ - '%23'=>'#' - ]; - return strtr(rawurlencode(rawurldecode($uri)), array_merge($reserved, $unescaped, $score)); - } - - /** - * Decoder for RLE8 compression in windows bitmaps - * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp - * - * @param string $str Data to decode - * @param integer $width Image width - * - * @return string - */ - public static function rle8_decode($str, $width) - { - $lineWidth = $width + (3 - ($width - 1) % 4); - $out = ''; - $cnt = strlen($str); - - for ($i = 0; $i < $cnt; $i++) { - $o = ord($str[$i]); - switch ($o) { - case 0: # ESCAPE - $i++; - switch (ord($str[$i])) { - case 0: # NEW LINE - $padCnt = $lineWidth - strlen($out) % $lineWidth; - if ($padCnt < $lineWidth) { - $out .= str_repeat(chr(0), $padCnt); # pad line - } - break; - case 1: # END OF FILE - $padCnt = $lineWidth - strlen($out) % $lineWidth; - if ($padCnt < $lineWidth) { - $out .= str_repeat(chr(0), $padCnt); # pad line - } - break 3; - case 2: # DELTA - $i += 2; - break; - default: # ABSOLUTE MODE - $num = ord($str[$i]); - for ($j = 0; $j < $num; $j++) { - $out .= $str[++$i]; - } - if ($num % 2) { - $i++; - } - } - break; - default: - $out .= str_repeat($str[++$i], $o); - } - } - return $out; - } - - /** - * Decoder for RLE4 compression in windows bitmaps - * see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp - * - * @param string $str Data to decode - * @param integer $width Image width - * - * @return string - */ - public static function rle4_decode($str, $width) - { - $w = floor($width / 2) + ($width % 2); - $lineWidth = $w + (3 - (($width - 1) / 2) % 4); - $pixels = []; - $cnt = strlen($str); - $c = 0; - - for ($i = 0; $i < $cnt; $i++) { - $o = ord($str[$i]); - switch ($o) { - case 0: # ESCAPE - $i++; - switch (ord($str[$i])) { - case 0: # NEW LINE - while (count($pixels) % $lineWidth != 0) { - $pixels[] = 0; - } - break; - case 1: # END OF FILE - while (count($pixels) % $lineWidth != 0) { - $pixels[] = 0; - } - break 3; - case 2: # DELTA - $i += 2; - break; - default: # ABSOLUTE MODE - $num = ord($str[$i]); - for ($j = 0; $j < $num; $j++) { - if ($j % 2 == 0) { - $c = ord($str[++$i]); - $pixels[] = ($c & 240) >> 4; - } else { - $pixels[] = $c & 15; - } - } - - if ($num % 2 == 0) { - $i++; - } - } - break; - default: - $c = ord($str[++$i]); - for ($j = 0; $j < $o; $j++) { - $pixels[] = ($j % 2 == 0 ? ($c & 240) >> 4 : $c & 15); - } - } - } - - $out = ''; - if (count($pixels) % 2) { - $pixels[] = 0; - } - - $cnt = count($pixels) / 2; - - for ($i = 0; $i < $cnt; $i++) { - $out .= chr(16 * $pixels[2 * $i] + $pixels[2 * $i + 1]); - } - - return $out; - } - - /** - * parse a full url or pathname and return an array(protocol, host, path, - * file + query + fragment) - * - * @param string $url - * @return array - */ - public static function explode_url($url) - { - $protocol = ""; - $host = ""; - $path = ""; - $file = ""; - - $arr = parse_url($url); - if ( isset($arr["scheme"]) ) { - $arr["scheme"] = mb_strtolower($arr["scheme"]); - } - - // Exclude windows drive letters... - if (isset($arr["scheme"]) && $arr["scheme"] !== "file" && strlen($arr["scheme"]) > 1) { - $protocol = $arr["scheme"] . "://"; - - if (isset($arr["user"])) { - $host .= $arr["user"]; - - if (isset($arr["pass"])) { - $host .= ":" . $arr["pass"]; - } - - $host .= "@"; - } - - if (isset($arr["host"])) { - $host .= $arr["host"]; - } - - if (isset($arr["port"])) { - $host .= ":" . $arr["port"]; - } - - if (isset($arr["path"]) && $arr["path"] !== "") { - // Do we have a trailing slash? - if ($arr["path"][mb_strlen($arr["path"]) - 1] === "/") { - $path = $arr["path"]; - $file = ""; - } else { - $path = rtrim(dirname($arr["path"]), '/\\') . "/"; - $file = basename($arr["path"]); - } - } - - if (isset($arr["query"])) { - $file .= "?" . $arr["query"]; - } - - if (isset($arr["fragment"])) { - $file .= "#" . $arr["fragment"]; - } - - } else { - - $i = mb_stripos($url, "file://"); - if ($i !== false) { - $url = mb_substr($url, $i + 7); - } - - $protocol = ""; // "file://"; ? why doesn't this work... It's because of - // network filenames like //COMPU/SHARENAME - - $host = ""; // localhost, really - $file = basename($url); - - $path = dirname($url); - - // Check that the path exists - if ($path !== false) { - $path .= '/'; - - } else { - // generate a url to access the file if no real path found. - $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://'; - - $host = isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : php_uname("n"); - - if (substr($arr["path"], 0, 1) === '/') { - $path = dirname($arr["path"]); - } else { - $path = '/' . rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/') . '/' . $arr["path"]; - } - } - } - - $ret = [$protocol, $host, $path, $file, - "protocol" => $protocol, - "host" => $host, - "path" => $path, - "file" => $file]; - return $ret; - } - - /** - * Print debug messages - * - * @param string $type The type of debug messages to print - * @param string $msg The message to show - */ - public static function dompdf_debug($type, $msg) - { - global $_DOMPDF_DEBUG_TYPES, $_dompdf_show_warnings, $_dompdf_debug; - if (isset($_DOMPDF_DEBUG_TYPES[$type]) && ($_dompdf_show_warnings || $_dompdf_debug)) { - $arr = debug_backtrace(); - - echo basename($arr[0]["file"]) . " (" . $arr[0]["line"] . "): " . $arr[1]["function"] . ": "; - Helpers::pre_r($msg); - } - } - - /** - * Stores warnings in an array for display later - * This function allows warnings generated by the DomDocument parser - * and CSS loader ({@link Stylesheet}) to be captured and displayed - * later. Without this function, errors are displayed immediately and - * PDF streaming is impossible. - * @see http://www.php.net/manual/en/function.set-error_handler.php - * - * @param int $errno - * @param string $errstr - * @param string $errfile - * @param string $errline - * - * @throws Exception - */ - public static function record_warnings($errno, $errstr, $errfile, $errline) - { - // Not a warning or notice - if (!($errno & (E_WARNING | E_NOTICE | E_USER_NOTICE | E_USER_WARNING | E_STRICT | E_DEPRECATED | E_USER_DEPRECATED))) { - throw new Exception($errstr . " $errno"); - } - - global $_dompdf_warnings; - global $_dompdf_show_warnings; - - if ($_dompdf_show_warnings) { - echo $errstr . "\n"; - } - - $_dompdf_warnings[] = $errstr; - } - - /** - * @param $c - * @return bool|string - */ - public static function unichr($c) - { - if ($c <= 0x7F) { - return chr($c); - } else if ($c <= 0x7FF) { - return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F); - } else if ($c <= 0xFFFF) { - return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F) - . chr(0x80 | $c & 0x3F); - } else if ($c <= 0x10FFFF) { - return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F) - . chr(0x80 | $c >> 6 & 0x3F) - . chr(0x80 | $c & 0x3F); - } - return false; - } - - /** - * Converts a CMYK color to RGB - * - * @param float|float[] $c - * @param float $m - * @param float $y - * @param float $k - * - * @return float[] - */ - public static function cmyk_to_rgb($c, $m = null, $y = null, $k = null) - { - if (is_array($c)) { - [$c, $m, $y, $k] = $c; - } - - $c *= 255; - $m *= 255; - $y *= 255; - $k *= 255; - - $r = (1 - round(2.55 * ($c + $k))); - $g = (1 - round(2.55 * ($m + $k))); - $b = (1 - round(2.55 * ($y + $k))); - - if ($r < 0) { - $r = 0; - } - if ($g < 0) { - $g = 0; - } - if ($b < 0) { - $b = 0; - } - - return [ - $r, $g, $b, - "r" => $r, "g" => $g, "b" => $b - ]; - } - - /** - * getimagesize doesn't give a good size for 32bit BMP image v5 - * - * @param string $filename - * @param resource $context - * @return array The same format as getimagesize($filename) - */ - public static function dompdf_getimagesize($filename, $context = null) - { - static $cache = []; - - if (isset($cache[$filename])) { - return $cache[$filename]; - } - - [$width, $height, $type] = getimagesize($filename); - - // Custom types - $types = [ - IMAGETYPE_JPEG => "jpeg", - IMAGETYPE_GIF => "gif", - IMAGETYPE_BMP => "bmp", - IMAGETYPE_PNG => "png", - ]; - - $type = isset($types[$type]) ? $types[$type] : null; - - if ($width == null || $height == null) { - [$data, $headers] = Helpers::getFileContent($filename, $context); - - if (!empty($data)) { - if (substr($data, 0, 2) === "BM") { - $meta = unpack('vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight', $data); - $width = (int)$meta['width']; - $height = (int)$meta['height']; - $type = "bmp"; - } else { - if (strpos($data, "loadFile($filename); - - [$width, $height] = $doc->getDimensions(); - $type = "svg"; - } - } - } - } - - return $cache[$filename] = [$width, $height, $type]; - } - - /** - * Credit goes to mgutt - * http://www.programmierer-forum.de/function-imagecreatefrombmp-welche-variante-laeuft-t143137.htm - * Modified by Fabien Menager to support RGB555 BMP format - */ - public static function imagecreatefrombmp($filename, $context = null) - { - if (!function_exists("imagecreatetruecolor")) { - trigger_error("The PHP GD extension is required, but is not installed.", E_ERROR); - return false; - } - - // version 1.00 - if (!($fh = fopen($filename, 'rb'))) { - trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING); - return false; - } - - $bytes_read = 0; - - // read file header - $meta = unpack('vtype/Vfilesize/Vreserved/Voffset', fread($fh, 14)); - - // check for bitmap - if ($meta['type'] != 19778) { - trigger_error('imagecreatefrombmp: ' . $filename . ' is not a bitmap!', E_USER_WARNING); - return false; - } - - // read image header - $meta += unpack('Vheadersize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vcolors/Vimportant', fread($fh, 40)); - $bytes_read += 40; - - // read additional bitfield header - if ($meta['compression'] == 3) { - $meta += unpack('VrMask/VgMask/VbMask', fread($fh, 12)); - $bytes_read += 12; - } - - // set bytes and padding - $meta['bytes'] = $meta['bits'] / 8; - $meta['decal'] = 4 - (4 * (($meta['width'] * $meta['bytes'] / 4) - floor($meta['width'] * $meta['bytes'] / 4))); - if ($meta['decal'] == 4) { - $meta['decal'] = 0; - } - - // obtain imagesize - if ($meta['imagesize'] < 1) { - $meta['imagesize'] = $meta['filesize'] - $meta['offset']; - // in rare cases filesize is equal to offset so we need to read physical size - if ($meta['imagesize'] < 1) { - $meta['imagesize'] = @filesize($filename) - $meta['offset']; - if ($meta['imagesize'] < 1) { - trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $filename . '!', E_USER_WARNING); - return false; - } - } - } - - // calculate colors - $meta['colors'] = !$meta['colors'] ? pow(2, $meta['bits']) : $meta['colors']; - - // read color palette - $palette = []; - if ($meta['bits'] < 16) { - $palette = unpack('l' . $meta['colors'], fread($fh, $meta['colors'] * 4)); - // in rare cases the color value is signed - if ($palette[1] < 0) { - foreach ($palette as $i => $color) { - $palette[$i] = $color + 16777216; - } - } - } - - // ignore extra bitmap headers - if ($meta['headersize'] > $bytes_read) { - fread($fh, $meta['headersize'] - $bytes_read); - } - - // create gd image - $im = imagecreatetruecolor($meta['width'], $meta['height']); - $data = fread($fh, $meta['imagesize']); - - // uncompress data - switch ($meta['compression']) { - case 1: - $data = Helpers::rle8_decode($data, $meta['width']); - break; - case 2: - $data = Helpers::rle4_decode($data, $meta['width']); - break; - } - - $p = 0; - $vide = chr(0); - $y = $meta['height'] - 1; - $error = 'imagecreatefrombmp: ' . $filename . ' has not enough data!'; - - // loop through the image data beginning with the lower left corner - while ($y >= 0) { - $x = 0; - while ($x < $meta['width']) { - switch ($meta['bits']) { - case 32: - case 24: - if (!($part = substr($data, $p, 3 /*$meta['bytes']*/))) { - trigger_error($error, E_USER_WARNING); - return $im; - } - $color = unpack('V', $part . $vide); - break; - case 16: - if (!($part = substr($data, $p, 2 /*$meta['bytes']*/))) { - trigger_error($error, E_USER_WARNING); - return $im; - } - $color = unpack('v', $part); - - if (empty($meta['rMask']) || $meta['rMask'] != 0xf800) { - $color[1] = (($color[1] & 0x7c00) >> 7) * 65536 + (($color[1] & 0x03e0) >> 2) * 256 + (($color[1] & 0x001f) << 3); // 555 - } else { - $color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3); // 565 - } - break; - case 8: - $color = unpack('n', $vide . substr($data, $p, 1)); - $color[1] = $palette[$color[1] + 1]; - break; - case 4: - $color = unpack('n', $vide . substr($data, floor($p), 1)); - $color[1] = ($p * 2) % 2 == 0 ? $color[1] >> 4 : $color[1] & 0x0F; - $color[1] = $palette[$color[1] + 1]; - break; - case 1: - $color = unpack('n', $vide . substr($data, floor($p), 1)); - switch (($p * 8) % 8) { - case 0: - $color[1] = $color[1] >> 7; - break; - case 1: - $color[1] = ($color[1] & 0x40) >> 6; - break; - case 2: - $color[1] = ($color[1] & 0x20) >> 5; - break; - case 3: - $color[1] = ($color[1] & 0x10) >> 4; - break; - case 4: - $color[1] = ($color[1] & 0x8) >> 3; - break; - case 5: - $color[1] = ($color[1] & 0x4) >> 2; - break; - case 6: - $color[1] = ($color[1] & 0x2) >> 1; - break; - case 7: - $color[1] = ($color[1] & 0x1); - break; - } - $color[1] = $palette[$color[1] + 1]; - break; - default: - trigger_error('imagecreatefrombmp: ' . $filename . ' has ' . $meta['bits'] . ' bits and this is not supported!', E_USER_WARNING); - return false; - } - imagesetpixel($im, $x, $y, $color[1]); - $x++; - $p += $meta['bytes']; - } - $y--; - $p += $meta['decal']; - } - fclose($fh); - return $im; - } - - /** - * Gets the content of the file at the specified path using one of - * the following methods, in preferential order: - * - file_get_contents: if allow_url_fopen is true or the file is local - * - curl: if allow_url_fopen is false and curl is available - * - * @param string $uri - * @param resource $context (ignored if curl is used) - * @param int $offset - * @param int $maxlen (ignored if curl is used) - * @return string[] - */ - public static function getFileContent($uri, $context = null, $offset = 0, $maxlen = null) - { - $content = null; - $headers = null; - [$proto, $host, $path, $file] = Helpers::explode_url($uri); - $is_local_path = ($proto == '' || $proto === 'file://'); - - set_error_handler([self::class, 'record_warnings']); - - try { - if ($is_local_path || ini_get('allow_url_fopen')) { - if ($is_local_path === false) { - $uri = Helpers::encodeURI($uri); - } - if (isset($maxlen)) { - $result = file_get_contents($uri, null, $context, $offset, $maxlen); - } else { - $result = file_get_contents($uri, null, $context, $offset); - } - if ($result !== false) { - $content = $result; - } - if (isset($http_response_header)) { - $headers = $http_response_header; - } - - } elseif (function_exists('curl_exec')) { - $curl = curl_init($uri); - - //TODO: use $context to define additional curl options - curl_setopt($curl, CURLOPT_TIMEOUT, 10); - curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_HEADER, true); - if ($offset > 0) { - curl_setopt($curl, CURLOPT_RESUME_FROM, $offset); - } - - $data = curl_exec($curl); - - if ($data !== false && !curl_errno($curl)) { - switch ($http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE)) { - case 200: - $raw_headers = substr($data, 0, curl_getinfo($curl, CURLINFO_HEADER_SIZE)); - $headers = preg_split("/[\n\r]+/", trim($raw_headers)); - $content = substr($data, curl_getinfo($curl, CURLINFO_HEADER_SIZE)); - break; - } - } - curl_close($curl); - } - } finally { - restore_error_handler(); - } - - return [$content, $headers]; - } - - public static function mb_ucwords($str) { - $max_len = mb_strlen($str); - if ($max_len === 1) { - return mb_strtoupper($str); - } - - $str = mb_strtoupper(mb_substr($str, 0, 1)) . mb_substr($str, 1); - - foreach ([' ', '.', ',', '!', '?', '-', '+'] as $s) { - $pos = 0; - while (($pos = mb_strpos($str, $s, $pos)) !== false) { - $pos++; - // Nothing to do if the separator is the last char of the string - if ($pos !== false && $pos < $max_len) { - // If the char we want to upper is the last char there is nothing to append behind - if ($pos + 1 < $max_len) { - $str = mb_substr($str, 0, $pos) . mb_strtoupper(mb_substr($str, $pos, 1)) . mb_substr($str, $pos + 1); - } else { - $str = mb_substr($str, 0, $pos) . mb_strtoupper(mb_substr($str, $pos, 1)); - } - } - } - } - - return $str; - } -} diff --git a/vendor/dompdf/dompdf/src/Image/Cache.php b/vendor/dompdf/dompdf/src/Image/Cache.php deleted file mode 100644 index 9f9130f..0000000 --- a/vendor/dompdf/dompdf/src/Image/Cache.php +++ /dev/null @@ -1,208 +0,0 @@ - - * @author Helmut Tischer - * @author Fabien Ménager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Image; - -use Dompdf\Dompdf; -use Dompdf\Helpers; -use Dompdf\Exception\ImageException; - -/** - * Static class that resolves image urls and downloads and caches - * remote images if required. - * - * @package dompdf - */ -class Cache -{ - /** - * Array of downloaded images. Cached so that identical images are - * not needlessly downloaded. - * - * @var array - */ - protected static $_cache = []; - - /** - * The url to the "broken image" used when images can't be loaded - * - * @var string - */ - public static $broken_image = "data:image/svg+xml;charset=utf8,%3C?xml version='1.0'?%3E%3Csvg width='64' height='64' xmlns='http://www.w3.org/2000/svg'%3E%3Cg%3E%3Crect stroke='%23666666' id='svg_1' height='60.499994' width='60.166667' y='1.666669' x='1.999998' stroke-width='1.5' fill='none'/%3E%3Cline stroke-linecap='null' stroke-linejoin='null' id='svg_3' y2='59.333253' x2='59.749916' y1='4.333415' x1='4.250079' stroke-width='1.5' stroke='%23999999' fill='none'/%3E%3Cline stroke-linecap='null' stroke-linejoin='null' id='svg_4' y2='59.999665' x2='4.062838' y1='3.750342' x1='60.062164' stroke-width='1.5' stroke='%23999999' fill='none'/%3E%3C/g%3E%3C/svg%3E"; - - public static $error_message = "Image not found or type unknown"; - - /** - * Current dompdf instance - * - * @var Dompdf - */ - protected static $_dompdf; - - /** - * Resolve and fetch an image for use. - * - * @param string $url The url of the image - * @param string $protocol Default protocol if none specified in $url - * @param string $host Default host if none specified in $url - * @param string $base_path Default path if none specified in $url - * @param Dompdf $dompdf The Dompdf instance - * - * @throws ImageException - * @return array An array with two elements: The local path to the image and the image extension - */ - static function resolve_url($url, $protocol, $host, $base_path, Dompdf $dompdf) - { - self::$_dompdf = $dompdf; - - $protocol = mb_strtolower($protocol); - $parsed_url = Helpers::explode_url($url); - $message = null; - - $remote = ($protocol && $protocol !== "file://") || ($parsed_url['protocol'] != ""); - - $data_uri = strpos($parsed_url['protocol'], "data:") === 0; - $full_url = null; - $enable_remote = $dompdf->getOptions()->getIsRemoteEnabled(); - - try { - - // Remote not allowed and is not DataURI - if (!$enable_remote && $remote && !$data_uri) { - throw new ImageException("Remote file access is disabled.", E_WARNING); - } - - // remote allowed or DataURI - if (($enable_remote && $remote) || $data_uri) { - // Download remote files to a temporary directory - $full_url = Helpers::build_url($protocol, $host, $base_path, $url); - - // From cache - if (isset(self::$_cache[$full_url])) { - $resolved_url = self::$_cache[$full_url]; - } // From remote - else { - $tmp_dir = $dompdf->getOptions()->getTempDir(); - if (($resolved_url = @tempnam($tmp_dir, "ca_dompdf_img_")) === false) { - throw new ImageException("Unable to create temporary image in " . $tmp_dir, E_WARNING); - } - $image = ""; - - if ($data_uri) { - if ($parsed_data_uri = Helpers::parse_data_uri($url)) { - $image = $parsed_data_uri['data']; - } - } else { - list($image, $http_response_header) = Helpers::getFileContent($full_url, $dompdf->getHttpContext()); - } - - // Image not found or invalid - if (empty($image)) { - $msg = ($data_uri ? "Data-URI could not be parsed" : "Image not found"); - throw new ImageException($msg, E_WARNING); - } // Image found, put in cache and process - else { - //e.g. fetch.php?media=url.jpg&cache=1 - //- Image file name might be one of the dynamic parts of the url, don't strip off! - //- a remote url does not need to have a file extension at all - //- local cached file does not have a matching file extension - //Therefore get image type from the content - if (@file_put_contents($resolved_url, $image) === false) { - throw new ImageException("Unable to create temporary image in " . $tmp_dir, E_WARNING); - } - } - } - } // Not remote, local image - else { - $resolved_url = Helpers::build_url($protocol, $host, $base_path, $url); - - if ($protocol == "" || $protocol === "file://") { - $realfile = realpath($resolved_url); - - $rootDir = realpath($dompdf->getOptions()->getRootDir()); - if (strpos($realfile, $rootDir) !== 0) { - $chroot = realpath($dompdf->getOptions()->getChroot()); - if (!$chroot || strpos($realfile, $chroot) !== 0) { - throw new ImageException("Permission denied on $resolved_url. The file could not be found under the directory specified by Options::chroot.", E_WARNING); - } - } - - if (!$realfile) { - throw new ImageException("File '$realfile' not found.", E_WARNING); - } - - $resolved_url = $realfile; - } - } - - // Check if the local file is readable - if (!is_readable($resolved_url) || !filesize($resolved_url)) { - throw new ImageException("Image not readable or empty", E_WARNING); - } // Check is the file is an image - else { - list($width, $height, $type) = Helpers::dompdf_getimagesize($resolved_url, $dompdf->getHttpContext()); - - // Known image type - if ($width && $height && in_array($type, ["gif", "png", "jpeg", "bmp", "svg"])) { - //Don't put replacement image into cache - otherwise it will be deleted on cache cleanup. - //Only execute on successful caching of remote image. - if ($enable_remote && $remote || $data_uri) { - self::$_cache[$full_url] = $resolved_url; - } - } // Unknown image type - else { - throw new ImageException("Image type unknown", E_WARNING); - } - } - } catch (ImageException $e) { - $resolved_url = self::$broken_image; - $type = "png"; - $message = self::$error_message; - Helpers::record_warnings($e->getCode(), $e->getMessage() . " \n $url", $e->getFile(), $e->getLine()); - } - - return [$resolved_url, $type, $message]; - } - - /** - * Unlink all cached images (i.e. temporary images either downloaded - * or converted) - */ - static function clear() - { - if (empty(self::$_cache) || self::$_dompdf->getOptions()->getDebugKeepTemp()) { - return; - } - - foreach (self::$_cache as $file) { - if (self::$_dompdf->getOptions()->getDebugPng()) { - print "[clear unlink $file]"; - } - unlink($file); - } - - self::$_cache = []; - } - - static function detect_type($file, $context = null) - { - list(, , $type) = Helpers::dompdf_getimagesize($file, $context); - - return $type; - } - - static function is_broken($url) - { - return $url === self::$broken_image; - } -} - -if (file_exists(realpath(__DIR__ . "/../../lib/res/broken_image.svg"))) { - Cache::$broken_image = realpath(__DIR__ . "/../../lib/res/broken_image.svg"); -} \ No newline at end of file diff --git a/vendor/dompdf/dompdf/src/JavascriptEmbedder.php b/vendor/dompdf/dompdf/src/JavascriptEmbedder.php deleted file mode 100644 index 7a8fce5..0000000 --- a/vendor/dompdf/dompdf/src/JavascriptEmbedder.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf; - -/** - * Embeds Javascript into the PDF document - * - * @package dompdf - */ -class JavascriptEmbedder -{ - - /** - * @var Dompdf - */ - protected $_dompdf; - - /** - * JavascriptEmbedder constructor. - * - * @param Dompdf $dompdf - */ - public function __construct(Dompdf $dompdf) - { - $this->_dompdf = $dompdf; - } - - /** - * @param $script - */ - public function insert($script) - { - $this->_dompdf->getCanvas()->javascript($script); - } - - /** - * @param Frame $frame - */ - public function render(Frame $frame) - { - if (!$this->_dompdf->getOptions()->getIsJavascriptEnabled()) { - return; - } - - $this->insert($frame->get_node()->nodeValue); - } -} diff --git a/vendor/dompdf/dompdf/src/LineBox.php b/vendor/dompdf/dompdf/src/LineBox.php deleted file mode 100644 index 68e1f70..0000000 --- a/vendor/dompdf/dompdf/src/LineBox.php +++ /dev/null @@ -1,303 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf; - -use Dompdf\FrameDecorator\Block; -use Dompdf\FrameDecorator\Page; - -/** - * The line box class - * - * This class represents a line box - * http://www.w3.org/TR/CSS2/visuren.html#line-box - * - * @package dompdf - */ -class LineBox -{ - - /** - * @var Block - */ - protected $_block_frame; - - /** - * @var Frame[] - */ - protected $_frames = []; - - /** - * @var integer - */ - public $wc = 0; - - /** - * @var float - */ - public $y = null; - - /** - * @var float - */ - public $w = 0.0; - - /** - * @var float - */ - public $h = 0.0; - - /** - * @var float - */ - public $left = 0.0; - - /** - * @var float - */ - public $right = 0.0; - - /** - * @var Frame - */ - public $tallest_frame = null; - - /** - * @var bool[] - */ - public $floating_blocks = []; - - /** - * @var bool - */ - public $br = false; - - /** - * Class constructor - * - * @param Block $frame the Block containing this line - * @param int $y - */ - public function __construct(Block $frame, $y = 0) - { - $this->_block_frame = $frame; - $this->_frames = []; - $this->y = $y; - - $this->get_float_offsets(); - } - - /** - * Returns the floating elements inside the first floating parent - * - * @param Page $root - * - * @return Frame[] - */ - public function get_floats_inside(Page $root) - { - $floating_frames = $root->get_floating_frames(); - - if (count($floating_frames) == 0) { - return $floating_frames; - } - - // Find nearest floating element - $p = $this->_block_frame; - while ($p->get_style()->float === "none") { - $parent = $p->get_parent(); - - if (!$parent) { - break; - } - - $p = $parent; - } - - if ($p == $root) { - return $floating_frames; - } - - $parent = $p; - - $childs = []; - - foreach ($floating_frames as $_floating) { - $p = $_floating->get_parent(); - - while (($p = $p->get_parent()) && $p !== $parent); - - if ($p) { - $childs[] = $p; - } - } - - return $childs; - } - - /** - * - */ - public function get_float_offsets() - { - static $anti_infinite_loop = 10000; // FIXME smelly hack - - $reflower = $this->_block_frame->get_reflower(); - - if (!$reflower) { - return; - } - - $cb_w = null; - - $block = $this->_block_frame; - $root = $block->get_root(); - - if (!$root) { - return; - } - - $style = $this->_block_frame->get_style(); - $floating_frames = $this->get_floats_inside($root); - $inside_left_floating_width = 0; - $inside_right_floating_width = 0; - $outside_left_floating_width = 0; - $outside_right_floating_width = 0; - - foreach ($floating_frames as $child_key => $floating_frame) { - $floating_frame_parent = $floating_frame->get_parent(); - $id = $floating_frame->get_id(); - - if (isset($this->floating_blocks[$id])) { - continue; - } - - $float = $floating_frame->get_style()->float; - $floating_width = $floating_frame->get_margin_width(); - - if (!$cb_w) { - $cb_w = $floating_frame->get_containing_block("w"); - } - - $line_w = $this->get_width(); - - if (!$floating_frame->_float_next_line && ($cb_w <= $line_w + $floating_width) && ($cb_w > $line_w)) { - $floating_frame->_float_next_line = true; - continue; - } - - // If the child is still shifted by the floating element - if ($anti_infinite_loop-- > 0 && - $floating_frame->get_position("y") + $floating_frame->get_margin_height() >= $this->y && - $block->get_position("x") + $block->get_margin_width() >= $floating_frame->get_position("x") - ) { - if ($float === "left") { - if ($floating_frame_parent === $this->_block_frame) { - $inside_left_floating_width += $floating_width; - } else { - $outside_left_floating_width += $floating_width; - } - } elseif ($float === "right") { - if ($floating_frame_parent === $this->_block_frame) { - $inside_right_floating_width += $floating_width; - } else { - $outside_right_floating_width += $floating_width; - } - } - - $this->floating_blocks[$id] = true; - } // else, the floating element won't shift anymore - else { - $root->remove_floating_frame($child_key); - } - } - - $this->left += $inside_left_floating_width; - if ($outside_left_floating_width > 0 && $outside_left_floating_width > ((float)$style->length_in_pt($style->margin_left) + (float)$style->length_in_pt($style->padding_left))) { - $this->left += $outside_left_floating_width - (float)$style->length_in_pt($style->margin_left) - (float)$style->length_in_pt($style->padding_left); - } - $this->right += $inside_right_floating_width; - if ($outside_right_floating_width > 0 && $outside_right_floating_width > ((float)$style->length_in_pt($style->margin_left) + (float)$style->length_in_pt($style->padding_right))) { - $this->right += $outside_right_floating_width - (float)$style->length_in_pt($style->margin_right) - (float)$style->length_in_pt($style->padding_right); - } - } - - /** - * @return float - */ - public function get_width() - { - return $this->left + $this->w + $this->right; - } - - /** - * @return Block - */ - public function get_block_frame() - { - return $this->_block_frame; - } - - /** - * @return Frame[] - */ - function &get_frames() - { - return $this->_frames; - } - - /** - * @param Frame $frame - */ - public function add_frame(Frame $frame) - { - $this->_frames[] = $frame; - } - - /** - * Recalculate LineBox width based on the contained frames total width. - * - * @return float - */ - public function recalculate_width() - { - $width = 0; - - foreach ($this->get_frames() as $frame) { - $width += $frame->calculate_auto_width(); - } - - return $this->w = $width; - } - - /** - * @return string - */ - public function __toString() - { - $props = ["wc", "y", "w", "h", "left", "right", "br"]; - $s = ""; - foreach ($props as $prop) { - $s .= "$prop: " . $this->$prop . "\n"; - } - $s .= count($this->_frames) . " frames\n"; - - return $s; - } - /*function __get($prop) { - if (!isset($this->{"_$prop"})) return; - return $this->{"_$prop"}; - }*/ -} - -/* -class LineBoxList implements Iterator { - private $_p = 0; - private $_lines = array(); - -} -*/ diff --git a/vendor/dompdf/dompdf/src/Options.php b/vendor/dompdf/dompdf/src/Options.php deleted file mode 100644 index b46c396..0000000 --- a/vendor/dompdf/dompdf/src/Options.php +++ /dev/null @@ -1,1005 +0,0 @@ - ... tags. - * - * ==== IMPORTANT ==== - * Enabling this for documents you do not trust (e.g. arbitrary remote html - * pages) is a security risk. Embedded scripts are run with the same level of - * system access available to dompdf. Set this option to false (recommended) - * if you wish to process untrusted documents. - * - * This setting may increase the risk of system exploit. Do not change - * this settings without understanding the consequences. Additional - * documentation is available on the dompdf wiki at: - * https://github.com/dompdf/dompdf/wiki - * - * @var bool - */ - private $isPhpEnabled = false; - - /** - * Enable remote file access - * - * If this setting is set to true, DOMPDF will access remote sites for - * images and CSS files as required. - * - * ==== IMPORTANT ==== - * This can be a security risk, in particular in combination with isPhpEnabled and - * allowing remote html code to be passed to $dompdf = new DOMPDF(); $dompdf->load_html(...); - * This allows anonymous users to download legally doubtful internet content which on - * tracing back appears to being downloaded by your server, or allows malicious php code - * in remote html pages to be executed by your server with your account privileges. - * - * This setting may increase the risk of system exploit. Do not change - * this settings without understanding the consequences. Additional - * documentation is available on the dompdf wiki at: - * https://github.com/dompdf/dompdf/wiki - * - * @var bool - */ - private $isRemoteEnabled = false; - - /** - * Enable inline Javascript - * - * If this setting is set to true then DOMPDF will automatically insert - * JavaScript code contained within tags. - * - * @var bool - */ - private $isJavascriptEnabled = true; - - /** - * Use the more-than-experimental HTML5 Lib parser - * - * @var bool - */ - private $isHtml5ParserEnabled = false; - - /** - * Whether to enable font subsetting or not. - * - * @var bool - */ - private $isFontSubsettingEnabled = true; - - /** - * @var bool - */ - private $debugPng = false; - - /** - * @var bool - */ - private $debugKeepTemp = false; - - /** - * @var bool - */ - private $debugCss = false; - - /** - * @var bool - */ - private $debugLayout = false; - - /** - * @var bool - */ - private $debugLayoutLines = true; - - /** - * @var bool - */ - private $debugLayoutBlocks = true; - - /** - * @var bool - */ - private $debugLayoutInline = true; - - /** - * @var bool - */ - private $debugLayoutPaddingBox = true; - - /** - * The PDF rendering backend to use - * - * Valid settings are 'PDFLib', 'CPDF', 'GD', and 'auto'. 'auto' will - * look for PDFLib and use it if found, or if not it will fall back on - * CPDF. 'GD' renders PDFs to graphic files. {@link Dompdf\CanvasFactory} - * ultimately determines which rendering class to instantiate - * based on this setting. - * - * @var string - */ - private $pdfBackend = "CPDF"; - - /** - * PDFlib license key - * - * If you are using a licensed, commercial version of PDFlib, specify - * your license key here. If you are using PDFlib-Lite or are evaluating - * the commercial version of PDFlib, comment out this setting. - * - * @link http://www.pdflib.com - * - * If pdflib present in web server and auto or selected explicitly above, - * a real license code must exist! - * - * @var string - */ - private $pdflibLicense = ""; - - /** - * @var string - * @deprecated - */ - private $adminUsername = "user"; - - /** - * @var string - * @deprecated - */ - private $adminPassword = "password"; - - /** - * @param array $attributes - */ - public function __construct(array $attributes = null) - { - $this->setChroot(realpath(__DIR__ . "/../")); - $this->setRootDir($this->getChroot()); - $this->setTempDir(sys_get_temp_dir()); - $this->setFontDir($this->chroot . "/lib/fonts"); - $this->setFontCache($this->getFontDir()); - $this->setLogOutputFile($this->getTempDir() . "/log.htm"); - - if (null !== $attributes) { - $this->set($attributes); - } - } - - /** - * @param array|string $attributes - * @param null|mixed $value - * @return $this - */ - public function set($attributes, $value = null) - { - if (!is_array($attributes)) { - $attributes = [$attributes => $value]; - } - foreach ($attributes as $key => $value) { - if ($key === 'tempDir' || $key === 'temp_dir') { - $this->setTempDir($value); - } elseif ($key === 'fontDir' || $key === 'font_dir') { - $this->setFontDir($value); - } elseif ($key === 'fontCache' || $key === 'font_cache') { - $this->setFontCache($value); - } elseif ($key === 'chroot') { - $this->setChroot($value); - } elseif ($key === 'logOutputFile' || $key === 'log_output_file') { - $this->setLogOutputFile($value); - } elseif ($key === 'defaultMediaType' || $key === 'default_media_type') { - $this->setDefaultMediaType($value); - } elseif ($key === 'defaultPaperSize' || $key === 'default_paper_size') { - $this->setDefaultPaperSize($value); - } elseif ($key === 'defaultPaperOrientation' || $key === 'default_paper_orientation') { - $this->setDefaultPaperOrientation($value); - } elseif ($key === 'defaultFont' || $key === 'default_font') { - $this->setDefaultFont($value); - } elseif ($key === 'dpi') { - $this->setDpi($value); - } elseif ($key === 'fontHeightRatio' || $key === 'font_height_ratio') { - $this->setFontHeightRatio($value); - } elseif ($key === 'isPhpEnabled' || $key === 'is_php_enabled' || $key === 'enable_php') { - $this->setIsPhpEnabled($value); - } elseif ($key === 'isRemoteEnabled' || $key === 'is_remote_enabled' || $key === 'enable_remote') { - $this->setIsRemoteEnabled($value); - } elseif ($key === 'isJavascriptEnabled' || $key === 'is_javascript_enabled' || $key === 'enable_javascript') { - $this->setIsJavascriptEnabled($value); - } elseif ($key === 'isHtml5ParserEnabled' || $key === 'is_html5_parser_enabled' || $key === 'enable_html5_parser') { - $this->setIsHtml5ParserEnabled($value); - } elseif ($key === 'isFontSubsettingEnabled' || $key === 'is_font_subsetting_enabled' || $key === 'enable_font_subsetting') { - $this->setIsFontSubsettingEnabled($value); - } elseif ($key === 'debugPng' || $key === 'debug_png') { - $this->setDebugPng($value); - } elseif ($key === 'debugKeepTemp' || $key === 'debug_keep_temp') { - $this->setDebugKeepTemp($value); - } elseif ($key === 'debugCss' || $key === 'debug_css') { - $this->setDebugCss($value); - } elseif ($key === 'debugLayout' || $key === 'debug_layout') { - $this->setDebugLayout($value); - } elseif ($key === 'debugLayoutLines' || $key === 'debug_layout_lines') { - $this->setDebugLayoutLines($value); - } elseif ($key === 'debugLayoutBlocks' || $key === 'debug_layout_blocks') { - $this->setDebugLayoutBlocks($value); - } elseif ($key === 'debugLayoutInline' || $key === 'debug_layout_inline') { - $this->setDebugLayoutInline($value); - } elseif ($key === 'debugLayoutPaddingBox' || $key === 'debug_layout_padding_box') { - $this->setDebugLayoutPaddingBox($value); - } elseif ($key === 'pdfBackend' || $key === 'pdf_backend') { - $this->setPdfBackend($value); - } elseif ($key === 'pdflibLicense' || $key === 'pdflib_license') { - $this->setPdflibLicense($value); - } elseif ($key === 'adminUsername' || $key === 'admin_username') { - $this->setAdminUsername($value); - } elseif ($key === 'adminPassword' || $key === 'admin_password') { - $this->setAdminPassword($value); - } - } - return $this; - } - - /** - * @param string $key - * @return mixed - */ - public function get($key) - { - if ($key === 'tempDir' || $key === 'temp_dir') { - return $this->getTempDir(); - } elseif ($key === 'fontDir' || $key === 'font_dir') { - return $this->getFontDir(); - } elseif ($key === 'fontCache' || $key === 'font_cache') { - return $this->getFontCache(); - } elseif ($key === 'chroot') { - return $this->getChroot(); - } elseif ($key === 'logOutputFile' || $key === 'log_output_file') { - return $this->getLogOutputFile(); - } elseif ($key === 'defaultMediaType' || $key === 'default_media_type') { - return $this->getDefaultMediaType(); - } elseif ($key === 'defaultPaperSize' || $key === 'default_paper_size') { - return $this->getDefaultPaperSize(); - } elseif ($key === 'defaultPaperOrientation' || $key === 'default_paper_orientation') { - return $this->getDefaultPaperOrientation(); - } elseif ($key === 'defaultFont' || $key === 'default_font') { - return $this->getDefaultFont(); - } elseif ($key === 'dpi') { - return $this->getDpi(); - } elseif ($key === 'fontHeightRatio' || $key === 'font_height_ratio') { - return $this->getFontHeightRatio(); - } elseif ($key === 'isPhpEnabled' || $key === 'is_php_enabled' || $key === 'enable_php') { - return $this->getIsPhpEnabled(); - } elseif ($key === 'isRemoteEnabled' || $key === 'is_remote_enabled' || $key === 'enable_remote') { - return $this->getIsRemoteEnabled(); - } elseif ($key === 'isJavascriptEnabled' || $key === 'is_javascript_enabled' || $key === 'enable_javascript') { - return $this->getIsJavascriptEnabled(); - } elseif ($key === 'isHtml5ParserEnabled' || $key === 'is_html5_parser_enabled' || $key === 'enable_html5_parser') { - return $this->getIsHtml5ParserEnabled(); - } elseif ($key === 'isFontSubsettingEnabled' || $key === 'is_font_subsetting_enabled' || $key === 'enable_font_subsetting') { - return $this->getIsFontSubsettingEnabled(); - } elseif ($key === 'debugPng' || $key === 'debug_png') { - return $this->getDebugPng(); - } elseif ($key === 'debugKeepTemp' || $key === 'debug_keep_temp') { - return $this->getDebugKeepTemp(); - } elseif ($key === 'debugCss' || $key === 'debug_css') { - return $this->getDebugCss(); - } elseif ($key === 'debugLayout' || $key === 'debug_layout') { - return $this->getDebugLayout(); - } elseif ($key === 'debugLayoutLines' || $key === 'debug_layout_lines') { - return $this->getDebugLayoutLines(); - } elseif ($key === 'debugLayoutBlocks' || $key === 'debug_layout_blocks') { - return $this->getDebugLayoutBlocks(); - } elseif ($key === 'debugLayoutInline' || $key === 'debug_layout_inline') { - return $this->getDebugLayoutInline(); - } elseif ($key === 'debugLayoutPaddingBox' || $key === 'debug_layout_padding_box') { - return $this->getDebugLayoutPaddingBox(); - } elseif ($key === 'pdfBackend' || $key === 'pdf_backend') { - return $this->getPdfBackend(); - } elseif ($key === 'pdflibLicense' || $key === 'pdflib_license') { - return $this->getPdflibLicense(); - } elseif ($key === 'adminUsername' || $key === 'admin_username') { - return $this->getAdminUsername(); - } elseif ($key === 'adminPassword' || $key === 'admin_password') { - return $this->getAdminPassword(); - } - return null; - } - - /** - * @param string $adminPassword - * @return $this - */ - public function setAdminPassword($adminPassword) - { - $this->adminPassword = $adminPassword; - return $this; - } - - /** - * @return string - */ - public function getAdminPassword() - { - return $this->adminPassword; - } - - /** - * @param string $adminUsername - * @return $this - */ - public function setAdminUsername($adminUsername) - { - $this->adminUsername = $adminUsername; - return $this; - } - - /** - * @return string - */ - public function getAdminUsername() - { - return $this->adminUsername; - } - - /** - * @param string $pdfBackend - * @return $this - */ - public function setPdfBackend($pdfBackend) - { - $this->pdfBackend = $pdfBackend; - return $this; - } - - /** - * @return string - */ - public function getPdfBackend() - { - return $this->pdfBackend; - } - - /** - * @param string $pdflibLicense - * @return $this - */ - public function setPdflibLicense($pdflibLicense) - { - $this->pdflibLicense = $pdflibLicense; - return $this; - } - - /** - * @return string - */ - public function getPdflibLicense() - { - return $this->pdflibLicense; - } - - /** - * @param string $chroot - * @return $this - */ - public function setChroot($chroot) - { - $this->chroot = $chroot; - return $this; - } - - /** - * @return string - */ - public function getChroot() - { - return $this->chroot; - } - - /** - * @param boolean $debugCss - * @return $this - */ - public function setDebugCss($debugCss) - { - $this->debugCss = $debugCss; - return $this; - } - - /** - * @return boolean - */ - public function getDebugCss() - { - return $this->debugCss; - } - - /** - * @param boolean $debugKeepTemp - * @return $this - */ - public function setDebugKeepTemp($debugKeepTemp) - { - $this->debugKeepTemp = $debugKeepTemp; - return $this; - } - - /** - * @return boolean - */ - public function getDebugKeepTemp() - { - return $this->debugKeepTemp; - } - - /** - * @param boolean $debugLayout - * @return $this - */ - public function setDebugLayout($debugLayout) - { - $this->debugLayout = $debugLayout; - return $this; - } - - /** - * @return boolean - */ - public function getDebugLayout() - { - return $this->debugLayout; - } - - /** - * @param boolean $debugLayoutBlocks - * @return $this - */ - public function setDebugLayoutBlocks($debugLayoutBlocks) - { - $this->debugLayoutBlocks = $debugLayoutBlocks; - return $this; - } - - /** - * @return boolean - */ - public function getDebugLayoutBlocks() - { - return $this->debugLayoutBlocks; - } - - /** - * @param boolean $debugLayoutInline - * @return $this - */ - public function setDebugLayoutInline($debugLayoutInline) - { - $this->debugLayoutInline = $debugLayoutInline; - return $this; - } - - /** - * @return boolean - */ - public function getDebugLayoutInline() - { - return $this->debugLayoutInline; - } - - /** - * @param boolean $debugLayoutLines - * @return $this - */ - public function setDebugLayoutLines($debugLayoutLines) - { - $this->debugLayoutLines = $debugLayoutLines; - return $this; - } - - /** - * @return boolean - */ - public function getDebugLayoutLines() - { - return $this->debugLayoutLines; - } - - /** - * @param boolean $debugLayoutPaddingBox - * @return $this - */ - public function setDebugLayoutPaddingBox($debugLayoutPaddingBox) - { - $this->debugLayoutPaddingBox = $debugLayoutPaddingBox; - return $this; - } - - /** - * @return boolean - */ - public function getDebugLayoutPaddingBox() - { - return $this->debugLayoutPaddingBox; - } - - /** - * @param boolean $debugPng - * @return $this - */ - public function setDebugPng($debugPng) - { - $this->debugPng = $debugPng; - return $this; - } - - /** - * @return boolean - */ - public function getDebugPng() - { - return $this->debugPng; - } - - /** - * @param string $defaultFont - * @return $this - */ - public function setDefaultFont($defaultFont) - { - $this->defaultFont = $defaultFont; - return $this; - } - - /** - * @return string - */ - public function getDefaultFont() - { - return $this->defaultFont; - } - - /** - * @param string $defaultMediaType - * @return $this - */ - public function setDefaultMediaType($defaultMediaType) - { - $this->defaultMediaType = $defaultMediaType; - return $this; - } - - /** - * @return string - */ - public function getDefaultMediaType() - { - return $this->defaultMediaType; - } - - /** - * @param string $defaultPaperSize - * @return $this - */ - public function setDefaultPaperSize($defaultPaperSize) - { - $this->defaultPaperSize = $defaultPaperSize; - return $this; - } - - /** - * @param string $defaultPaperOrientation - * @return $this - */ - public function setDefaultPaperOrientation($defaultPaperOrientation) - { - $this->defaultPaperOrientation = $defaultPaperOrientation; - return $this; - } - - /** - * @return string - */ - public function getDefaultPaperSize() - { - return $this->defaultPaperSize; - } - - /** - * @return string - */ - public function getDefaultPaperOrientation() - { - return $this->defaultPaperOrientation; - } - - /** - * @param int $dpi - * @return $this - */ - public function setDpi($dpi) - { - $this->dpi = $dpi; - return $this; - } - - /** - * @return int - */ - public function getDpi() - { - return $this->dpi; - } - - /** - * @param string $fontCache - * @return $this - */ - public function setFontCache($fontCache) - { - $this->fontCache = $fontCache; - return $this; - } - - /** - * @return string - */ - public function getFontCache() - { - return $this->fontCache; - } - - /** - * @param string $fontDir - * @return $this - */ - public function setFontDir($fontDir) - { - $this->fontDir = $fontDir; - return $this; - } - - /** - * @return string - */ - public function getFontDir() - { - return $this->fontDir; - } - - /** - * @param float $fontHeightRatio - * @return $this - */ - public function setFontHeightRatio($fontHeightRatio) - { - $this->fontHeightRatio = $fontHeightRatio; - return $this; - } - - /** - * @return float - */ - public function getFontHeightRatio() - { - return $this->fontHeightRatio; - } - - /** - * @param boolean $isFontSubsettingEnabled - * @return $this - */ - public function setIsFontSubsettingEnabled($isFontSubsettingEnabled) - { - $this->isFontSubsettingEnabled = $isFontSubsettingEnabled; - return $this; - } - - /** - * @return boolean - */ - public function getIsFontSubsettingEnabled() - { - return $this->isFontSubsettingEnabled; - } - - /** - * @return boolean - */ - public function isFontSubsettingEnabled() - { - return $this->getIsFontSubsettingEnabled(); - } - - /** - * @param boolean $isHtml5ParserEnabled - * @return $this - */ - public function setIsHtml5ParserEnabled($isHtml5ParserEnabled) - { - $this->isHtml5ParserEnabled = $isHtml5ParserEnabled; - return $this; - } - - /** - * @return boolean - */ - public function getIsHtml5ParserEnabled() - { - return $this->isHtml5ParserEnabled; - } - - /** - * @return boolean - */ - public function isHtml5ParserEnabled() - { - return $this->getIsHtml5ParserEnabled(); - } - - /** - * @param boolean $isJavascriptEnabled - * @return $this - */ - public function setIsJavascriptEnabled($isJavascriptEnabled) - { - $this->isJavascriptEnabled = $isJavascriptEnabled; - return $this; - } - - /** - * @return boolean - */ - public function getIsJavascriptEnabled() - { - return $this->isJavascriptEnabled; - } - - /** - * @return boolean - */ - public function isJavascriptEnabled() - { - return $this->getIsJavascriptEnabled(); - } - - /** - * @param boolean $isPhpEnabled - * @return $this - */ - public function setIsPhpEnabled($isPhpEnabled) - { - $this->isPhpEnabled = $isPhpEnabled; - return $this; - } - - /** - * @return boolean - */ - public function getIsPhpEnabled() - { - return $this->isPhpEnabled; - } - - /** - * @return boolean - */ - public function isPhpEnabled() - { - return $this->getIsPhpEnabled(); - } - - /** - * @param boolean $isRemoteEnabled - * @return $this - */ - public function setIsRemoteEnabled($isRemoteEnabled) - { - $this->isRemoteEnabled = $isRemoteEnabled; - return $this; - } - - /** - * @return boolean - */ - public function getIsRemoteEnabled() - { - return $this->isRemoteEnabled; - } - - /** - * @return boolean - */ - public function isRemoteEnabled() - { - return $this->getIsRemoteEnabled(); - } - - /** - * @param string $logOutputFile - * @return $this - */ - public function setLogOutputFile($logOutputFile) - { - $this->logOutputFile = $logOutputFile; - return $this; - } - - /** - * @return string - */ - public function getLogOutputFile() - { - return $this->logOutputFile; - } - - /** - * @param string $tempDir - * @return $this - */ - public function setTempDir($tempDir) - { - $this->tempDir = $tempDir; - return $this; - } - - /** - * @return string - */ - public function getTempDir() - { - return $this->tempDir; - } - - /** - * @param string $rootDir - * @return $this - */ - public function setRootDir($rootDir) - { - $this->rootDir = $rootDir; - return $this; - } - - /** - * @return string - */ - public function getRootDir() - { - return $this->rootDir; - } -} \ No newline at end of file diff --git a/vendor/dompdf/dompdf/src/PhpEvaluator.php b/vendor/dompdf/dompdf/src/PhpEvaluator.php deleted file mode 100644 index cdebc7a..0000000 --- a/vendor/dompdf/dompdf/src/PhpEvaluator.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf; - -/** - * Executes inline PHP code during the rendering process - * - * @package dompdf - */ -class PhpEvaluator -{ - - /** - * @var Canvas - */ - protected $_canvas; - - /** - * PhpEvaluator constructor. - * @param Canvas $canvas - */ - public function __construct(Canvas $canvas) - { - $this->_canvas = $canvas; - } - - /** - * @param $code - * @param array $vars - */ - public function evaluate($code, $vars = []) - { - if (!$this->_canvas->get_dompdf()->getOptions()->getIsPhpEnabled()) { - return; - } - - // Set up some variables for the inline code - $pdf = $this->_canvas; - $fontMetrics = $pdf->get_dompdf()->getFontMetrics(); - $PAGE_NUM = $pdf->get_page_number(); - $PAGE_COUNT = $pdf->get_page_count(); - - // Override those variables if passed in - foreach ($vars as $k => $v) { - $$k = $v; - } - - eval($code); - } - - /** - * @param Frame $frame - */ - public function render(Frame $frame) - { - $this->evaluate($frame->get_node()->nodeValue); - } -} diff --git a/vendor/dompdf/dompdf/src/Positioner/Absolute.php b/vendor/dompdf/dompdf/src/Positioner/Absolute.php deleted file mode 100644 index ef34a5c..0000000 --- a/vendor/dompdf/dompdf/src/Positioner/Absolute.php +++ /dev/null @@ -1,118 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Positioner; - -use Dompdf\FrameDecorator\AbstractFrameDecorator; - -/** - * Positions absolutely positioned frames - */ -class Absolute extends AbstractPositioner -{ - - /** - * @param AbstractFrameDecorator $frame - */ - function position(AbstractFrameDecorator $frame) - { - $style = $frame->get_style(); - - $p = $frame->find_positionned_parent(); - - list($x, $y, $w, $h) = $frame->get_containing_block(); - - $top = $style->length_in_pt($style->top, $h); - $right = $style->length_in_pt($style->right, $w); - $bottom = $style->length_in_pt($style->bottom, $h); - $left = $style->length_in_pt($style->left, $w); - - if ($p && !($left === "auto" && $right === "auto")) { - // Get the parent's padding box (see http://www.w3.org/TR/CSS21/visuren.html#propdef-top) - list($x, $y, $w, $h) = $p->get_padding_box(); - } - - list($width, $height) = [$frame->get_margin_width(), $frame->get_margin_height()]; - - $orig_style = $frame->get_original_style(); - $orig_width = $orig_style->width; - $orig_height = $orig_style->height; - - /**************************** - * - * Width auto: - * ____________| left=auto | left=fixed | - * right=auto | A | B | - * right=fixed | C | D | - * - * Width fixed: - * ____________| left=auto | left=fixed | - * right=auto | E | F | - * right=fixed | G | H | - *****************************/ - - if ($left === "auto") { - if ($right === "auto") { - // A or E - Keep the frame at the same position - $x = $x + $frame->find_block_parent()->get_current_line_box()->w; - } else { - if ($orig_width === "auto") { - // C - $x += $w - $width - $right; - } else { - // G - $x += $w - $width - $right; - } - } - } else { - if ($right === "auto") { - // B or F - $x += (float)$left; - } else { - if ($orig_width === "auto") { - // D - TODO change width - $x += (float)$left; - } else { - // H - Everything is fixed: left + width win - $x += (float)$left; - } - } - } - - // The same vertically - if ($top === "auto") { - if ($bottom === "auto") { - // A or E - Keep the frame at the same position - $y = $frame->find_block_parent()->get_current_line_box()->y; - } else { - if ($orig_height === "auto") { - // C - $y += (float)$h - $height - (float)$bottom; - } else { - // G - $y += (float)$h - $height - (float)$bottom; - } - } - } else { - if ($bottom === "auto") { - // B or F - $y += (float)$top; - } else { - if ($orig_height === "auto") { - // D - TODO change height - $y += (float)$top; - } else { - // H - Everything is fixed: top + height win - $y += (float)$top; - } - } - } - - $frame->set_position($x, $y); - } -} diff --git a/vendor/dompdf/dompdf/src/Positioner/AbstractPositioner.php b/vendor/dompdf/dompdf/src/Positioner/AbstractPositioner.php deleted file mode 100644 index 2ade6af..0000000 --- a/vendor/dompdf/dompdf/src/Positioner/AbstractPositioner.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Positioner; - -use Dompdf\FrameDecorator\AbstractFrameDecorator; - -/** - * Base AbstractPositioner class - * - * Defines postioner interface - * - * @access private - * @package dompdf - */ -abstract class AbstractPositioner -{ - - /** - * @param AbstractFrameDecorator $frame - * @return mixed - */ - abstract function position(AbstractFrameDecorator $frame); - - /** - * @param AbstractFrameDecorator $frame - * @param $offset_x - * @param $offset_y - * @param bool $ignore_self - */ - function move(AbstractFrameDecorator $frame, $offset_x, $offset_y, $ignore_self = false) - { - list($x, $y) = $frame->get_position(); - - if (!$ignore_self) { - $frame->set_position($x + $offset_x, $y + $offset_y); - } - - foreach ($frame->get_children() as $child) { - $child->move($offset_x, $offset_y); - } - } -} diff --git a/vendor/dompdf/dompdf/src/Positioner/Block.php b/vendor/dompdf/dompdf/src/Positioner/Block.php deleted file mode 100644 index 0c340bc..0000000 --- a/vendor/dompdf/dompdf/src/Positioner/Block.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Positioner; - -use Dompdf\FrameDecorator\AbstractFrameDecorator; - -/** - * Positions block frames - * - * @access private - * @package dompdf - */ -class Block extends AbstractPositioner { - - function position(AbstractFrameDecorator $frame) - { - $style = $frame->get_style(); - $cb = $frame->get_containing_block(); - $p = $frame->find_block_parent(); - - if ($p) { - $float = $style->float; - - if (!$float || $float === "none") { - $p->add_line(true); - } - $y = $p->get_current_line_box()->y; - - } else { - $y = $cb["y"]; - } - - $x = $cb["x"]; - - // Relative positionning - if ($style->position === "relative") { - $top = (float)$style->length_in_pt($style->top, $cb["h"]); - //$right = (float)$style->length_in_pt($style->right, $cb["w"]); - //$bottom = (float)$style->length_in_pt($style->bottom, $cb["h"]); - $left = (float)$style->length_in_pt($style->left, $cb["w"]); - - $x += $left; - $y += $top; - } - - $frame->set_position($x, $y); - } -} diff --git a/vendor/dompdf/dompdf/src/Positioner/Fixed.php b/vendor/dompdf/dompdf/src/Positioner/Fixed.php deleted file mode 100644 index 556254b..0000000 --- a/vendor/dompdf/dompdf/src/Positioner/Fixed.php +++ /dev/null @@ -1,89 +0,0 @@ - - * @author Fabien Ménager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Positioner; - -use Dompdf\FrameDecorator\AbstractFrameDecorator; - -/** - * Positions fixely positioned frames - */ -class Fixed extends AbstractPositioner -{ - - /** - * @param AbstractFrameDecorator $frame - */ - function position(AbstractFrameDecorator $frame) - { - $style = $frame->get_original_style(); - $root = $frame->get_root(); - $initialcb = $root->get_containing_block(); - $initialcb_style = $root->get_style(); - - $p = $frame->find_block_parent(); - if ($p) { - $p->add_line(); - } - - // Compute the margins of the @page style - $margin_top = (float)$initialcb_style->length_in_pt($initialcb_style->margin_top, $initialcb["h"]); - $margin_right = (float)$initialcb_style->length_in_pt($initialcb_style->margin_right, $initialcb["w"]); - $margin_bottom = (float)$initialcb_style->length_in_pt($initialcb_style->margin_bottom, $initialcb["h"]); - $margin_left = (float)$initialcb_style->length_in_pt($initialcb_style->margin_left, $initialcb["w"]); - - // The needed computed style of the element - $height = (float)$style->length_in_pt($style->height, $initialcb["h"]); - $width = (float)$style->length_in_pt($style->width, $initialcb["w"]); - - $top = $style->length_in_pt($style->top, $initialcb["h"]); - $right = $style->length_in_pt($style->right, $initialcb["w"]); - $bottom = $style->length_in_pt($style->bottom, $initialcb["h"]); - $left = $style->length_in_pt($style->left, $initialcb["w"]); - - $y = $margin_top; - if (isset($top)) { - $y = (float)$top + $margin_top; - if ($top === "auto") { - $y = $margin_top; - if (isset($bottom) && $bottom !== "auto") { - $y = $initialcb["h"] - $bottom - $margin_bottom; - if ($frame->is_auto_height()) { - $y -= $height; - } else { - $y -= $frame->get_margin_height(); - } - } - } - } - - $x = $margin_left; - if (isset($left)) { - $x = (float)$left + $margin_left; - if ($left === "auto") { - $x = $margin_left; - if (isset($right) && $right !== "auto") { - $x = $initialcb["w"] - $right - $margin_right; - if ($frame->is_auto_width()) { - $x -= $width; - } else { - $x -= $frame->get_margin_width(); - } - } - } - } - - $frame->set_position($x, $y); - - $children = $frame->get_children(); - foreach ($children as $child) { - $child->set_position($x, $y); - } - } -} \ No newline at end of file diff --git a/vendor/dompdf/dompdf/src/Positioner/Inline.php b/vendor/dompdf/dompdf/src/Positioner/Inline.php deleted file mode 100644 index bcea2ba..0000000 --- a/vendor/dompdf/dompdf/src/Positioner/Inline.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Positioner; - -use Dompdf\FrameDecorator\AbstractFrameDecorator; -use Dompdf\FrameDecorator\Inline as InlineFrameDecorator; -use Dompdf\Exception; - -/** - * Positions inline frames - * - * @package dompdf - */ -class Inline extends AbstractPositioner -{ - - /** - * @param AbstractFrameDecorator $frame - * @throws Exception - */ - function position(AbstractFrameDecorator $frame) - { - /** - * Find our nearest block level parent and access its lines property. - * @var BlockFrameDecorator - */ - $p = $frame->find_block_parent(); - - // Debugging code: - - // Helpers::pre_r("\nPositioning:"); - // Helpers::pre_r("Me: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")"); - // Helpers::pre_r("Parent: " . $p->get_node()->nodeName . " (" . spl_object_hash($p->get_node()) . ")"); - - // End debugging - - if (!$p) { - throw new Exception("No block-level parent found. Not good."); - } - - $f = $frame; - - $cb = $f->get_containing_block(); - $line = $p->get_current_line_box(); - - // Skip the page break if in a fixed position element - $is_fixed = false; - while ($f = $f->get_parent()) { - if ($f->get_style()->position === "fixed") { - $is_fixed = true; - break; - } - } - - $f = $frame; - - if (!$is_fixed && $f->get_parent() && - $f->get_parent() instanceof InlineFrameDecorator && - $f->is_text_node() - ) { - $min_max = $f->get_reflower()->get_min_max_width(); - - // If the frame doesn't fit in the current line, a line break occurs - if ($min_max["min"] > ($cb["w"] - $line->left - $line->w - $line->right)) { - $p->add_line(); - } - } - - $f->set_position($cb["x"] + $line->w, $line->y); - } -} diff --git a/vendor/dompdf/dompdf/src/Positioner/ListBullet.php b/vendor/dompdf/dompdf/src/Positioner/ListBullet.php deleted file mode 100644 index 70bc283..0000000 --- a/vendor/dompdf/dompdf/src/Positioner/ListBullet.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @author Helmut Tischer - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Positioner; - -use Dompdf\FrameDecorator\AbstractFrameDecorator; - -/** - * Positions list bullets - * - * @package dompdf - */ -class ListBullet extends AbstractPositioner -{ - - /** - * @param AbstractFrameDecorator $frame - */ - function position(AbstractFrameDecorator $frame) - { - - // Bullets & friends are positioned an absolute distance to the left of - // the content edge of their parent element - $cb = $frame->get_containing_block(); - - // Note: this differs from most frames in that we must position - // ourselves after determining our width - $x = $cb["x"] - $frame->get_width(); - - $p = $frame->find_block_parent(); - - $y = $p->get_current_line_box()->y; - - // This is a bit of a hack... - $n = $frame->get_next_sibling(); - if ($n) { - $style = $n->get_style(); - $line_height = $style->line_height; - // TODO: should offset take into account the line height of the next sibling (per previous logic)? - // $offset = (float)$style->length_in_pt($line_height, $n->get_containing_block("h")) - $frame->get_height(); - $offset = $line_height - $frame->get_height(); - $y += $offset / 2; - } - - // Now the position is the left top of the block which should be marked with the bullet. - // We tried to find out the y of the start of the first text character within the block. - // But the top margin/padding does not fit, neither from this nor from the next sibling - // The "bit of a hack" above does not work also. - - // Instead let's position the bullet vertically centered to the block which should be marked. - // But for get_next_sibling() the get_containing_block is all zero, and for find_block_parent() - // the get_containing_block is paper width and the entire list as height. - - // if ($p) { - // //$cb = $n->get_containing_block(); - // $cb = $p->get_containing_block(); - // $y += $cb["h"]/2; - // print 'cb:'.$cb["x"].':'.$cb["y"].':'.$cb["w"].':'.$cb["h"].':'; - // } - - // Todo: - // For now give up on the above. Use Guesswork with font y-pos in the middle of the line spacing - - /*$style = $p->get_style(); - $font_size = $style->font_size; - $line_height = (float)$style->length_in_pt($style->line_height, $font_size); - $y += ($line_height - $font_size) / 2; */ - - //Position is x-end y-top of character position of the bullet. - $frame->set_position($x, $y); - } -} diff --git a/vendor/dompdf/dompdf/src/Positioner/NullPositioner.php b/vendor/dompdf/dompdf/src/Positioner/NullPositioner.php deleted file mode 100644 index afdef19..0000000 --- a/vendor/dompdf/dompdf/src/Positioner/NullPositioner.php +++ /dev/null @@ -1,28 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Positioner; - -use Dompdf\FrameDecorator\AbstractFrameDecorator; - -/** - * Dummy positioner - * - * @package dompdf - */ -class NullPositioner extends AbstractPositioner -{ - - /** - * @param AbstractFrameDecorator $frame - */ - function position(AbstractFrameDecorator $frame) - { - return; - } -} diff --git a/vendor/dompdf/dompdf/src/Positioner/TableCell.php b/vendor/dompdf/dompdf/src/Positioner/TableCell.php deleted file mode 100644 index 42b0042..0000000 --- a/vendor/dompdf/dompdf/src/Positioner/TableCell.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Positioner; - -use Dompdf\FrameDecorator\AbstractFrameDecorator; -use Dompdf\FrameDecorator\Table; - -/** - * Positions table cells - * - * @package dompdf - */ -class TableCell extends AbstractPositioner -{ - - /** - * @param AbstractFrameDecorator $frame - */ - function position(AbstractFrameDecorator $frame) - { - $table = Table::find_parent_table($frame); - $cellmap = $table->get_cellmap(); - $frame->set_position($cellmap->get_frame_position($frame)); - } -} diff --git a/vendor/dompdf/dompdf/src/Positioner/TableRow.php b/vendor/dompdf/dompdf/src/Positioner/TableRow.php deleted file mode 100644 index aee2045..0000000 --- a/vendor/dompdf/dompdf/src/Positioner/TableRow.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace Dompdf\Positioner; - -use Dompdf\FrameDecorator\AbstractFrameDecorator; - -/** - * Positions table rows - * - * @package dompdf - */ -class TableRow extends AbstractPositioner -{ - - /** - * @param AbstractFrameDecorator $frame - */ - function position(AbstractFrameDecorator $frame) - { - $cb = $frame->get_containing_block(); - $p = $frame->get_prev_sibling(); - - if ($p) { - $y = $p->get_position("y") + $p->get_margin_height(); - } else { - $y = $cb["y"]; - } - $frame->set_position($cb["x"], $y); - } -} diff --git a/vendor/dompdf/dompdf/src/Renderer.php b/vendor/dompdf/dompdf/src/Renderer.php deleted file mode 100644 index 535fec7..0000000 --- a/vendor/dompdf/dompdf/src/Renderer.php +++ /dev/null @@ -1,295 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf; - -use Dompdf\Renderer\AbstractRenderer; -use Dompdf\Renderer\Block; -use Dompdf\Renderer\Image; -use Dompdf\Renderer\ListBullet; -use Dompdf\Renderer\TableCell; -use Dompdf\Renderer\TableRowGroup; -use Dompdf\Renderer\Text; - -/** - * Concrete renderer - * - * Instantiates several specific renderers in order to render any given frame. - * - * @package dompdf - */ -class Renderer extends AbstractRenderer -{ - - /** - * Array of renderers for specific frame types - * - * @var AbstractRenderer[] - */ - protected $_renderers; - - /** - * Cache of the callbacks array - * - * @var array - */ - private $_callbacks; - - /** - * Advance the canvas to the next page - */ - function new_page() - { - $this->_canvas->new_page(); - } - - /** - * Render frames recursively - * - * @param Frame $frame the frame to render - */ - public function render(Frame $frame) - { - global $_dompdf_debug; - - $this->_check_callbacks("begin_frame", $frame); - - if ($_dompdf_debug) { - echo $frame; - flush(); - } - - $style = $frame->get_style(); - - if (in_array($style->visibility, ["hidden", "collapse"])) { - return; - } - - $display = $style->display; - - // Starts the CSS transformation - if ($style->transform && is_array($style->transform)) { - $this->_canvas->save(); - list($x, $y) = $frame->get_padding_box(); - $origin = $style->transform_origin; - - foreach ($style->transform as $transform) { - list($function, $values) = $transform; - if ($function === "matrix") { - $function = "transform"; - } - - $values = array_map("floatval", $values); - $values[] = $x + (float)$style->length_in_pt($origin[0], (float)$style->length_in_pt($style->width)); - $values[] = $y + (float)$style->length_in_pt($origin[1], (float)$style->length_in_pt($style->height)); - - call_user_func_array([$this->_canvas, $function], $values); - } - } - - switch ($display) { - - case "block": - case "list-item": - case "inline-block": - case "table": - case "inline-table": - $this->_render_frame("block", $frame); - break; - - case "inline": - if ($frame->is_text_node()) { - $this->_render_frame("text", $frame); - } else { - $this->_render_frame("inline", $frame); - } - break; - - case "table-cell": - $this->_render_frame("table-cell", $frame); - break; - - case "table-row-group": - case "table-header-group": - case "table-footer-group": - $this->_render_frame("table-row-group", $frame); - break; - - case "-dompdf-list-bullet": - $this->_render_frame("list-bullet", $frame); - break; - - case "-dompdf-image": - $this->_render_frame("image", $frame); - break; - - case "none": - $node = $frame->get_node(); - - if ($node->nodeName === "script") { - if ($node->getAttribute("type") === "text/php" || - $node->getAttribute("language") === "php" - ) { - // Evaluate embedded php scripts - $this->_render_frame("php", $frame); - } elseif ($node->getAttribute("type") === "text/javascript" || - $node->getAttribute("language") === "javascript" - ) { - // Insert JavaScript - $this->_render_frame("javascript", $frame); - } - } - - // Don't render children, so skip to next iter - return; - - default: - break; - - } - - // Starts the overflow: hidden box - if ($style->overflow === "hidden") { - list($x, $y, $w, $h) = $frame->get_padding_box(); - - // get border radii - $style = $frame->get_style(); - list($tl, $tr, $br, $bl) = $style->get_computed_border_radius($w, $h); - - if ($tl + $tr + $br + $bl > 0) { - $this->_canvas->clipping_roundrectangle($x, $y, (float)$w, (float)$h, $tl, $tr, $br, $bl); - } else { - $this->_canvas->clipping_rectangle($x, $y, (float)$w, (float)$h); - } - } - - $stack = []; - - foreach ($frame->get_children() as $child) { - // < 0 : nagative z-index - // = 0 : no z-index, no stacking context - // = 1 : stacking context without z-index - // > 1 : z-index - $child_style = $child->get_style(); - $child_z_index = $child_style->z_index; - $z_index = 0; - - if ($child_z_index !== "auto") { - $z_index = intval($child_z_index) + 1; - } elseif ($child_style->float !== "none" || $child->is_positionned()) { - $z_index = 1; - } - - $stack[$z_index][] = $child; - } - - ksort($stack); - - foreach ($stack as $by_index) { - foreach ($by_index as $child) { - $this->render($child); - } - } - - // Ends the overflow: hidden box - if ($style->overflow === "hidden") { - $this->_canvas->clipping_end(); - } - - if ($style->transform && is_array($style->transform)) { - $this->_canvas->restore(); - } - - // Check for end frame callback - $this->_check_callbacks("end_frame", $frame); - } - - /** - * Check for callbacks that need to be performed when a given event - * gets triggered on a frame - * - * @param string $event the type of event - * @param Frame $frame the frame that event is triggered on - */ - protected function _check_callbacks($event, $frame) - { - if (!isset($this->_callbacks)) { - $this->_callbacks = $this->_dompdf->getCallbacks(); - } - - if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) { - $info = [0 => $this->_canvas, "canvas" => $this->_canvas, - 1 => $frame, "frame" => $frame]; - $fs = $this->_callbacks[$event]; - foreach ($fs as $f) { - if (is_callable($f)) { - if (is_array($f)) { - $f[0]->{$f[1]}($info); - } else { - $f($info); - } - } - } - } - } - - /** - * Render a single frame - * - * Creates Renderer objects on demand - * - * @param string $type type of renderer to use - * @param Frame $frame the frame to render - */ - protected function _render_frame($type, $frame) - { - - if (!isset($this->_renderers[$type])) { - - switch ($type) { - case "block": - $this->_renderers[$type] = new Block($this->_dompdf); - break; - - case "inline": - $this->_renderers[$type] = new Renderer\Inline($this->_dompdf); - break; - - case "text": - $this->_renderers[$type] = new Text($this->_dompdf); - break; - - case "image": - $this->_renderers[$type] = new Image($this->_dompdf); - break; - - case "table-cell": - $this->_renderers[$type] = new TableCell($this->_dompdf); - break; - - case "table-row-group": - $this->_renderers[$type] = new TableRowGroup($this->_dompdf); - break; - - case "list-bullet": - $this->_renderers[$type] = new ListBullet($this->_dompdf); - break; - - case "php": - $this->_renderers[$type] = new PhpEvaluator($this->_canvas); - break; - - case "javascript": - $this->_renderers[$type] = new JavascriptEmbedder($this->_dompdf); - break; - - } - } - - $this->_renderers[$type]->render($frame); - } -} diff --git a/vendor/dompdf/dompdf/src/Renderer/AbstractRenderer.php b/vendor/dompdf/dompdf/src/Renderer/AbstractRenderer.php deleted file mode 100644 index 8c8d2d4..0000000 --- a/vendor/dompdf/dompdf/src/Renderer/AbstractRenderer.php +++ /dev/null @@ -1,1020 +0,0 @@ - - * @author Helmut Tischer - * @author Fabien Ménager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Renderer; - -use Dompdf\Adapter\CPDF; -use Dompdf\Css\Color; -use Dompdf\Css\Style; -use Dompdf\Dompdf; -use Dompdf\Helpers; -use Dompdf\Frame; -use Dompdf\Image\Cache; - -/** - * Base renderer class - * - * @package dompdf - */ -abstract class AbstractRenderer -{ - - /** - * Rendering backend - * - * @var \Dompdf\Canvas - */ - protected $_canvas; - - /** - * Current dompdf instance - * - * @var Dompdf - */ - protected $_dompdf; - - /** - * Class constructor - * - * @param Dompdf $dompdf The current dompdf instance - */ - function __construct(Dompdf $dompdf) - { - $this->_dompdf = $dompdf; - $this->_canvas = $dompdf->getCanvas(); - } - - /** - * Render a frame. - * - * Specialized in child classes - * - * @param Frame $frame The frame to render - */ - abstract function render(Frame $frame); - - /** - * Render a background image over a rectangular area - * - * @param string $url The background image to load - * @param float $x The left edge of the rectangular area - * @param float $y The top edge of the rectangular area - * @param float $width The width of the rectangular area - * @param float $height The height of the rectangular area - * @param Style $style The associated Style object - * - * @throws \Exception - */ - protected function _background_image($url, $x, $y, $width, $height, $style) - { - if (!function_exists("imagecreatetruecolor")) { - throw new \Exception("The PHP GD extension is required, but is not installed."); - } - - $sheet = $style->get_stylesheet(); - - // Skip degenerate cases - if ($width == 0 || $height == 0) { - return; - } - - $box_width = $width; - $box_height = $height; - - //debugpng - if ($this->_dompdf->getOptions()->getDebugPng()) { - print '[_background_image ' . $url . ']'; - } - - list($img, $type, /*$msg*/) = Cache::resolve_url( - $url, - $sheet->get_protocol(), - $sheet->get_host(), - $sheet->get_base_path(), - $this->_dompdf - ); - - // Bail if the image is no good - if (Cache::is_broken($img)) { - return; - } - - //Try to optimize away reading and composing of same background multiple times - //Postponing read with imagecreatefrom ...() - //final composition parameters and name not known yet - //Therefore read dimension directly from file, instead of creating gd object first. - //$img_w = imagesx($src); $img_h = imagesy($src); - - list($img_w, $img_h) = Helpers::dompdf_getimagesize($img, $this->_dompdf->getHttpContext()); - if (!isset($img_w) || $img_w == 0 || !isset($img_h) || $img_h == 0) { - return; - } - - // save for later check if file needs to be resized. - $org_img_w = $img_w; - $org_img_h = $img_h; - - $repeat = $style->background_repeat; - $dpi = $this->_dompdf->getOptions()->getDpi(); - - //Increase background resolution and dependent box size according to image resolution to be placed in - //Then image can be copied in without resize - $bg_width = round((float)($width * $dpi) / 72); - $bg_height = round((float)($height * $dpi) / 72); - - list($img_w, $img_h) = $this->_resize_background_image( - $img_w, - $img_h, - $bg_width, - $bg_height, - $style->background_size, - $dpi - ); - //Need %bg_x, $bg_y as background pos, where img starts, converted to pixel - - list($bg_x, $bg_y) = $style->background_position; - - if (Helpers::is_percent($bg_x)) { - // The point $bg_x % from the left edge of the image is placed - // $bg_x % from the left edge of the background rectangle - $p = ((float)$bg_x) / 100.0; - $x1 = $p * $img_w; - $x2 = $p * $bg_width; - - $bg_x = $x2 - $x1; - } else { - $bg_x = (float)($style->length_in_pt($bg_x) * $dpi) / 72; - } - - $bg_x = round($bg_x + (float)$style->length_in_pt($style->border_left_width) * $dpi / 72); - - if (Helpers::is_percent($bg_y)) { - // The point $bg_y % from the left edge of the image is placed - // $bg_y % from the left edge of the background rectangle - $p = ((float)$bg_y) / 100.0; - $y1 = $p * $img_h; - $y2 = $p * $bg_height; - - $bg_y = $y2 - $y1; - } else { - $bg_y = (float)($style->length_in_pt($bg_y) * $dpi) / 72; - } - - $bg_y = round($bg_y + (float)$style->length_in_pt($style->border_top_width) * $dpi / 72); - - //clip background to the image area on partial repeat. Nothing to do if img off area - //On repeat, normalize start position to the tile at immediate left/top or 0/0 of area - //On no repeat with positive offset: move size/start to have offset==0 - //Handle x/y Dimensions separately - - if ($repeat !== "repeat" && $repeat !== "repeat-x") { - //No repeat x - if ($bg_x < 0) { - $bg_width = $img_w + $bg_x; - } else { - $x += ($bg_x * 72) / $dpi; - $bg_width = $bg_width - $bg_x; - if ($bg_width > $img_w) { - $bg_width = $img_w; - } - $bg_x = 0; - } - - if ($bg_width <= 0) { - return; - } - - $width = (float)($bg_width * 72) / $dpi; - } else { - //repeat x - if ($bg_x < 0) { - $bg_x = -((-$bg_x) % $img_w); - } else { - $bg_x = $bg_x % $img_w; - if ($bg_x > 0) { - $bg_x -= $img_w; - } - } - } - - if ($repeat !== "repeat" && $repeat !== "repeat-y") { - //no repeat y - if ($bg_y < 0) { - $bg_height = $img_h + $bg_y; - } else { - $y += ($bg_y * 72) / $dpi; - $bg_height = $bg_height - $bg_y; - if ($bg_height > $img_h) { - $bg_height = $img_h; - } - $bg_y = 0; - } - if ($bg_height <= 0) { - return; - } - $height = (float)($bg_height * 72) / $dpi; - } else { - //repeat y - if ($bg_y < 0) { - $bg_y = -((-$bg_y) % $img_h); - } else { - $bg_y = $bg_y % $img_h; - if ($bg_y > 0) { - $bg_y -= $img_h; - } - } - } - - //Optimization, if repeat has no effect - if ($repeat === "repeat" && $bg_y <= 0 && $img_h + $bg_y >= $bg_height) { - $repeat = "repeat-x"; - } - - if ($repeat === "repeat" && $bg_x <= 0 && $img_w + $bg_x >= $bg_width) { - $repeat = "repeat-y"; - } - - if (($repeat === "repeat-x" && $bg_x <= 0 && $img_w + $bg_x >= $bg_width) || - ($repeat === "repeat-y" && $bg_y <= 0 && $img_h + $bg_y >= $bg_height) - ) { - $repeat = "no-repeat"; - } - - //Use filename as indicator only - //different names for different variants to have different copies in the pdf - //This is not dependent of background color of box! .'_'.(is_array($bg_color) ? $bg_color["hex"] : $bg_color) - //Note: Here, bg_* are the start values, not end values after going through the tile loops! - - $filedummy = $img; - - $is_png = false; - $filedummy .= '_' . $bg_width . '_' . $bg_height . '_' . $bg_x . '_' . $bg_y . '_' . $repeat; - - //Optimization to avoid multiple times rendering the same image. - //If check functions are existing and identical image already cached, - //then skip creation of duplicate, because it is not needed by addImagePng - if ($this->_canvas instanceof CPDF && $this->_canvas->get_cpdf()->image_iscached($filedummy)) { - $bg = null; - } else { - // Create a new image to fit over the background rectangle - $bg = imagecreatetruecolor($bg_width, $bg_height); - - switch (strtolower($type)) { - case "png": - $is_png = true; - imagesavealpha($bg, true); - imagealphablending($bg, false); - $src = imagecreatefrompng($img); - break; - - case "jpeg": - $src = imagecreatefromjpeg($img); - break; - - case "gif": - $src = imagecreatefromgif($img); - break; - - case "bmp": - $src = Helpers::imagecreatefrombmp($img); - break; - - default: - return; // Unsupported image type - } - - if ($src == null) { - return; - } - - if ($img_w != $org_img_w || $img_h != $org_img_h) { - $newSrc = imagescale($src, $img_w, $img_h); - imagedestroy($src); - $src = $newSrc; - } - - if ($src == null) { - return; - } - - //Background color if box is not relevant here - //Non transparent image: box clipped to real size. Background non relevant. - //Transparent image: The image controls the transparency and lets shine through whatever background. - //However on transparent image preset the composed image with the transparency color, - //to keep the transparency when copying over the non transparent parts of the tiles. - $ti = imagecolortransparent($src); - $palletsize = imagecolorstotal($src); - - if ($ti >= 0 && $ti < $palletsize) { - $tc = imagecolorsforindex($src, $ti); - $ti = imagecolorallocate($bg, $tc['red'], $tc['green'], $tc['blue']); - imagefill($bg, 0, 0, $ti); - imagecolortransparent($bg, $ti); - } - - //This has only an effect for the non repeatable dimension. - //compute start of src and dest coordinates of the single copy - if ($bg_x < 0) { - $dst_x = 0; - $src_x = -$bg_x; - } else { - $src_x = 0; - $dst_x = $bg_x; - } - - if ($bg_y < 0) { - $dst_y = 0; - $src_y = -$bg_y; - } else { - $src_y = 0; - $dst_y = $bg_y; - } - - //For historical reasons exchange meanings of variables: - //start_* will be the start values, while bg_* will be the temporary start values in the loops - $start_x = $bg_x; - $start_y = $bg_y; - - // Copy regions from the source image to the background - if ($repeat === "no-repeat") { - // Simply place the image on the background - imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $img_h); - - } else if ($repeat === "repeat-x") { - for ($bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w) { - if ($bg_x < 0) { - $dst_x = 0; - $src_x = -$bg_x; - $w = $img_w + $bg_x; - } else { - $dst_x = $bg_x; - $src_x = 0; - $w = $img_w; - } - imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h); - } - } else if ($repeat === "repeat-y") { - - for ($bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h) { - if ($bg_y < 0) { - $dst_y = 0; - $src_y = -$bg_y; - $h = $img_h + $bg_y; - } else { - $dst_y = $bg_y; - $src_y = 0; - $h = $img_h; - } - imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h); - } - } else if ($repeat === "repeat") { - for ($bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h) { - for ($bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w) { - if ($bg_x < 0) { - $dst_x = 0; - $src_x = -$bg_x; - $w = $img_w + $bg_x; - } else { - $dst_x = $bg_x; - $src_x = 0; - $w = $img_w; - } - - if ($bg_y < 0) { - $dst_y = 0; - $src_y = -$bg_y; - $h = $img_h + $bg_y; - } else { - $dst_y = $bg_y; - $src_y = 0; - $h = $img_h; - } - imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h); - } - } - } else { - print 'Unknown repeat!'; - } - - imagedestroy($src); - - } /* End optimize away creation of duplicates */ - - $this->_canvas->clipping_rectangle($x, $y, $box_width, $box_height); - - //img: image url string - //img_w, img_h: original image size in px - //width, height: box size in pt - //bg_width, bg_height: box size in px - //x, y: left/top edge of box on page in pt - //start_x, start_y: placement of image relative to pattern - //$repeat: repeat mode - //$bg: GD object of result image - //$src: GD object of original image - //When using cpdf and optimization to direct png creation from gd object is available, - //don't create temp file, but place gd object directly into the pdf - if (!$is_png && $this->_canvas instanceof CPDF) { - // Note: CPDF_Adapter image converts y position - $this->_canvas->get_cpdf()->addImagePng($filedummy, $x, $this->_canvas->get_height() - $y - $height, $width, $height, $bg); - } else { - $tmp_dir = $this->_dompdf->getOptions()->getTempDir(); - $tmp_name = @tempnam($tmp_dir, "bg_dompdf_img_"); - @unlink($tmp_name); - $tmp_file = "$tmp_name.png"; - - //debugpng - if ($this->_dompdf->getOptions()->getDebugPng()) { - print '[_background_image ' . $tmp_file . ']'; - } - - imagepng($bg, $tmp_file); - $this->_canvas->image($tmp_file, $x, $y, $width, $height); - imagedestroy($bg); - - //debugpng - if ($this->_dompdf->getOptions()->getDebugPng()) { - print '[_background_image unlink ' . $tmp_file . ']'; - } - - if (!$this->_dompdf->getOptions()->getDebugKeepTemp()) { - unlink($tmp_file); - } - } - - $this->_canvas->clipping_end(); - } - - /** - * @param $style - * @param $width - * @return array - */ - protected function _get_dash_pattern($style, $width) - { - $pattern = []; - - switch ($style) { - default: - /*case "solid": - case "double": - case "groove": - case "inset": - case "outset": - case "ridge":*/ - case "none": - break; - - case "dotted": - if ($width <= 1) { - $pattern = [$width, $width * 2]; - } else { - $pattern = [$width]; - } - break; - - case "dashed": - $pattern = [3 * $width]; - break; - } - - return $pattern; - } - - /** - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param int $r1 - * @param int $r2 - */ - protected function _border_none($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - return; - } - - /** - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param int $r1 - * @param int $r2 - */ - protected function _border_hidden($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - return; - } - - // Border rendering functions - - /** - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param int $r1 - * @param int $r2 - */ - protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dotted", $r1, $r2); - } - - - /** - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param int $r1 - * @param int $r2 - */ - protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dashed", $r1, $r2); - } - - - /** - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param int $r1 - * @param int $r2 - */ - protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - // TODO: Solve rendering where one corner is beveled (radius == 0), one corner isn't. - if ($corner_style !== "bevel" || $r1 > 0 || $r2 > 0) { - // do it the simple way - $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "solid", $r1, $r2); - return; - } - - list($top, $right, $bottom, $left) = $widths; - - // All this polygon business is for beveled corners... - switch ($side) { - case "top": - $points = [$x, $y, - $x + $length, $y, - $x + $length - $right, $y + $top, - $x + $left, $y + $top]; - $this->_canvas->polygon($points, $color, null, null, true); - break; - - case "bottom": - $points = [$x, $y, - $x + $length, $y, - $x + $length - $right, $y - $bottom, - $x + $left, $y - $bottom]; - $this->_canvas->polygon($points, $color, null, null, true); - break; - - case "left": - $points = [$x, $y, - $x, $y + $length, - $x + $left, $y + $length - $bottom, - $x + $left, $y + $top]; - $this->_canvas->polygon($points, $color, null, null, true); - break; - - case "right": - $points = [$x, $y, - $x, $y + $length, - $x - $right, $y + $length - $bottom, - $x - $right, $y + $top]; - $this->_canvas->polygon($points, $color, null, null, true); - break; - - default: - return; - } - } - - /** - * @param $side - * @param $ratio - * @param $top - * @param $right - * @param $bottom - * @param $left - * @param $x - * @param $y - * @param $length - * @param $r1 - * @param $r2 - */ - protected function _apply_ratio($side, $ratio, $top, $right, $bottom, $left, &$x, &$y, &$length, &$r1, &$r2) - { - switch ($side) { - case "top": - $r1 -= $left * $ratio; - $r2 -= $right * $ratio; - $x += $left * $ratio; - $y += $top * $ratio; - $length -= $left * $ratio + $right * $ratio; - break; - - case "bottom": - $r1 -= $right * $ratio; - $r2 -= $left * $ratio; - $x += $left * $ratio; - $y -= $bottom * $ratio; - $length -= $left * $ratio + $right * $ratio; - break; - - case "left": - $r1 -= $top * $ratio; - $r2 -= $bottom * $ratio; - $x += $left * $ratio; - $y += $top * $ratio; - $length -= $top * $ratio + $bottom * $ratio; - break; - - case "right": - $r1 -= $bottom * $ratio; - $r2 -= $top * $ratio; - $x -= $right * $ratio; - $y += $top * $ratio; - $length -= $top * $ratio + $bottom * $ratio; - break; - - default: - return; - } - } - - /** - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param int $r1 - * @param int $r2 - */ - protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - list($top, $right, $bottom, $left) = $widths; - - $third_widths = [$top / 3, $right / 3, $bottom / 3, $left / 3]; - - // draw the outer border - $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2); - - $this->_apply_ratio($side, 2 / 3, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); - - $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2); - } - - /** - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param int $r1 - * @param int $r2 - */ - protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - list($top, $right, $bottom, $left) = $widths; - - $half_widths = [$top / 2, $right / 2, $bottom / 2, $left / 2]; - - $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); - - $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); - - $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); - } - - /** - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param int $r1 - * @param int $r2 - */ - protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - list($top, $right, $bottom, $left) = $widths; - - $half_widths = [$top / 2, $right / 2, $bottom / 2, $left / 2]; - - $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); - - $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); - - $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); - } - - /** - * @param $c - * @return mixed - */ - protected function _tint($c) - { - if (!is_numeric($c)) { - return $c; - } - - return min(1, $c + 0.16); - } - - /** - * @param $c - * @return mixed - */ - protected function _shade($c) - { - if (!is_numeric($c)) { - return $c; - } - - return max(0, $c - 0.33); - } - - /** - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param int $r1 - * @param int $r2 - */ - protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - switch ($side) { - case "top": - case "left": - $shade = array_map([$this, "_shade"], $color); - $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2); - break; - - case "bottom": - case "right": - $tint = array_map([$this, "_tint"], $color); - $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2); - break; - - default: - return; - } - } - - /** - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param int $r1 - * @param int $r2 - */ - protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) - { - switch ($side) { - case "top": - case "left": - $tint = array_map([$this, "_tint"], $color); - $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2); - break; - - case "bottom": - case "right": - $shade = array_map([$this, "_shade"], $color); - $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2); - break; - - default: - return; - } - } - - /** - * Draws a solid, dotted, or dashed line, observing the border radius - * - * @param $x - * @param $y - * @param $length - * @param $color - * @param $widths - * @param $side - * @param string $corner_style - * @param $pattern_name - * @param int $r1 - * @param int $r2 - * - * @var $top - */ - protected function _border_line($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $pattern_name, $r1 = 0, $r2 = 0) - { - /** used by $$side */ - list($top, $right, $bottom, $left) = $widths; - $width = $$side; - - $pattern = $this->_get_dash_pattern($pattern_name, $width); - - $half_width = $width / 2; - $r1 -= $half_width; - $r2 -= $half_width; - $adjust = $r1 / 80; - $length -= $width; - - switch ($side) { - case "top": - $x += $half_width; - $y += $half_width; - - if ($r1 > 0) { - $this->_canvas->arc($x + $r1, $y + $r1, $r1, $r1, 90 - $adjust, 135 + $adjust, $color, $width, $pattern); - } - - $this->_canvas->line($x + $r1, $y, $x + $length - $r2, $y, $color, $width, $pattern); - - if ($r2 > 0) { - $this->_canvas->arc($x + $length - $r2, $y + $r2, $r2, $r2, 45 - $adjust, 90 + $adjust, $color, $width, $pattern); - } - break; - - case "bottom": - $x += $half_width; - $y -= $half_width; - - if ($r1 > 0) { - $this->_canvas->arc($x + $r1, $y - $r1, $r1, $r1, 225 - $adjust, 270 + $adjust, $color, $width, $pattern); - } - - $this->_canvas->line($x + $r1, $y, $x + $length - $r2, $y, $color, $width, $pattern); - - if ($r2 > 0) { - $this->_canvas->arc($x + $length - $r2, $y - $r2, $r2, $r2, 270 - $adjust, 315 + $adjust, $color, $width, $pattern); - } - break; - - case "left": - $y += $half_width; - $x += $half_width; - - if ($r1 > 0) { - $this->_canvas->arc($x + $r1, $y + $r1, $r1, $r1, 135 - $adjust, 180 + $adjust, $color, $width, $pattern); - } - - $this->_canvas->line($x, $y + $r1, $x, $y + $length - $r2, $color, $width, $pattern); - - if ($r2 > 0) { - $this->_canvas->arc($x + $r2, $y + $length - $r2, $r2, $r2, 180 - $adjust, 225 + $adjust, $color, $width, $pattern); - } - break; - - case "right": - $y += $half_width; - $x -= $half_width; - - if ($r1 > 0) { - $this->_canvas->arc($x - $r1, $y + $r1, $r1, $r1, 0 - $adjust, 45 + $adjust, $color, $width, $pattern); - } - - $this->_canvas->line($x, $y + $r1, $x, $y + $length - $r2, $color, $width, $pattern); - - if ($r2 > 0) { - $this->_canvas->arc($x - $r2, $y + $length - $r2, $r2, $r2, 315 - $adjust, 360 + $adjust, $color, $width, $pattern); - } - break; - } - } - - /** - * @param $opacity - */ - protected function _set_opacity($opacity) - { - if (is_numeric($opacity) && $opacity <= 1.0 && $opacity >= 0.0) { - $this->_canvas->set_opacity($opacity); - } - } - - /** - * @param $box - * @param string $color - * @param array $style - */ - protected function _debug_layout($box, $color = "red", $style = []) - { - $this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], Color::parse($color), 0.1, $style); - } - - /** - * @param float $img_width - * @param float $img_height - * @param float $container_width - * @param float $container_height - * @param array|string $bg_resize - * @param int $dpi - * @return array - */ - protected function _resize_background_image( - $img_width, - $img_height, - $container_width, - $container_height, - $bg_resize, - $dpi - ) { - // We got two some specific numbers and/or auto definitions - if (is_array($bg_resize)) { - $is_auto_width = $bg_resize[0] === 'auto'; - if ($is_auto_width) { - $new_img_width = $img_width; - } else { - $new_img_width = $bg_resize[0]; - if (Helpers::is_percent($new_img_width)) { - $new_img_width = round(($container_width / 100) * (float)$new_img_width); - } else { - $new_img_width = round($new_img_width * $dpi / 72); - } - } - - $is_auto_height = $bg_resize[1] === 'auto'; - if ($is_auto_height) { - $new_img_height = $img_height; - } else { - $new_img_height = $bg_resize[1]; - if (Helpers::is_percent($new_img_height)) { - $new_img_height = round(($container_height / 100) * (float)$new_img_height); - } else { - $new_img_height = round($new_img_height * $dpi / 72); - } - } - - // if one of both was set to auto the other one needs to scale proportionally - if ($is_auto_width !== $is_auto_height) { - if ($is_auto_height) { - $new_img_height = round($new_img_width * ($img_height / $img_width)); - } else { - $new_img_width = round($new_img_height * ($img_width / $img_height)); - } - } - } else { - $container_ratio = $container_height / $container_width; - - if ($bg_resize === 'cover' || $bg_resize === 'contain') { - $img_ratio = $img_height / $img_width; - - if ( - ($bg_resize === 'cover' && $container_ratio > $img_ratio) || - ($bg_resize === 'contain' && $container_ratio < $img_ratio) - ) { - $new_img_height = $container_height; - $new_img_width = round($container_height / $img_ratio); - } else { - $new_img_width = $container_width; - $new_img_height = round($container_width * $img_ratio); - } - } else { - $new_img_width = $img_width; - $new_img_height = $img_height; - } - } - - return [$new_img_width, $new_img_height]; - } -} diff --git a/vendor/dompdf/dompdf/src/Renderer/Block.php b/vendor/dompdf/dompdf/src/Renderer/Block.php deleted file mode 100644 index 1a054e3..0000000 --- a/vendor/dompdf/dompdf/src/Renderer/Block.php +++ /dev/null @@ -1,266 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Renderer; - -use Dompdf\Frame; -use Dompdf\FrameDecorator\AbstractFrameDecorator; -use Dompdf\Helpers; - -/** - * Renders block frames - * - * @package dompdf - */ -class Block extends AbstractRenderer -{ - - /** - * @param Frame $frame - */ - function render(Frame $frame) - { - $style = $frame->get_style(); - $node = $frame->get_node(); - $dompdf = $this->_dompdf; - $options = $dompdf->getOptions(); - - list($x, $y, $w, $h) = $frame->get_border_box(); - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - if ($node->nodeName === "body") { - $h = $frame->get_containing_block("h") - (float)$style->length_in_pt([ - $style->margin_top, - $style->border_top_width, - $style->border_bottom_width, - $style->margin_bottom], - (float)$style->length_in_pt($style->width)); - } - - // Handle anchors & links - if ($node->nodeName === "a" && $href = $node->getAttribute("href")) { - $href = Helpers::build_url($dompdf->getProtocol(), $dompdf->getBaseHost(), $dompdf->getBasePath(), $href); - $this->_canvas->add_link($href, $x, $y, (float)$w, (float)$h); - } - - // Draw our background, border and content - list($tl, $tr, $br, $bl) = $style->get_computed_border_radius($w, $h); - - if ($tl + $tr + $br + $bl > 0) { - $this->_canvas->clipping_roundrectangle($x, $y, (float)$w, (float)$h, $tl, $tr, $br, $bl); - } - - if (($bg = $style->background_color) !== "transparent") { - $this->_canvas->filled_rectangle($x, $y, (float)$w, (float)$h, $bg); - } - - if (($url = $style->background_image) && $url !== "none") { - $this->_background_image($url, $x, $y, $w, $h, $style); - } - - if ($tl + $tr + $br + $bl > 0) { - $this->_canvas->clipping_end(); - } - - $border_box = [$x, $y, $w, $h]; - $this->_render_border($frame, $border_box); - $this->_render_outline($frame, $border_box); - - if ($options->getDebugLayout()) { - if ($options->getDebugLayoutBlocks()) { - $this->_debug_layout($frame->get_border_box(), "red"); - if ($options->getDebugLayoutPaddingBox()) { - $this->_debug_layout($frame->get_padding_box(), "red", [0.5, 0.5]); - } - } - - if ($options->getDebugLayoutLines() && $frame->get_decorator()) { - foreach ($frame->get_decorator()->get_line_boxes() as $line) { - $frame->_debug_layout([$line->x, $line->y, $line->w, $line->h], "orange"); - } - } - } - - $id = $frame->get_node()->getAttribute("id"); - if (strlen($id) > 0) { - $this->_canvas->add_named_dest($id); - } - } - - /** - * @param AbstractFrameDecorator $frame - * @param null $border_box - * @param string $corner_style - */ - protected function _render_border(AbstractFrameDecorator $frame, $border_box = null, $corner_style = "bevel") - { - $style = $frame->get_style(); - $bp = $style->get_border_properties(); - - if (empty($border_box)) { - $border_box = $frame->get_border_box(); - } - - // find the radius - $radius = $style->get_computed_border_radius($border_box[2], $border_box[3]); // w, h - - // Short-cut: If all the borders are "solid" with the same color and style, and no radius, we'd better draw a rectangle - if ( - in_array($bp["top"]["style"], ["solid", "dashed", "dotted"]) && - $bp["top"] == $bp["right"] && - $bp["right"] == $bp["bottom"] && - $bp["bottom"] == $bp["left"] && - array_sum($radius) == 0 - ) { - $props = $bp["top"]; - if ($props["color"] === "transparent" || $props["width"] <= 0) { - return; - } - - list($x, $y, $w, $h) = $border_box; - $width = (float)$style->length_in_pt($props["width"]); - $pattern = $this->_get_dash_pattern($props["style"], $width); - $this->_canvas->rectangle($x + $width / 2, $y + $width / 2, (float)$w - $width, (float)$h - $width, $props["color"], $width, $pattern); - return; - } - - // Do it the long way - $widths = [ - (float)$style->length_in_pt($bp["top"]["width"]), - (float)$style->length_in_pt($bp["right"]["width"]), - (float)$style->length_in_pt($bp["bottom"]["width"]), - (float)$style->length_in_pt($bp["left"]["width"]) - ]; - - foreach ($bp as $side => $props) { - list($x, $y, $w, $h) = $border_box; - $length = 0; - $r1 = 0; - $r2 = 0; - - if (!$props["style"] || - $props["style"] === "none" || - $props["width"] <= 0 || - $props["color"] == "transparent" - ) { - continue; - } - - switch ($side) { - case "top": - $length = (float)$w; - $r1 = $radius["top-left"]; - $r2 = $radius["top-right"]; - break; - - case "bottom": - $length = (float)$w; - $y += (float)$h; - $r1 = $radius["bottom-left"]; - $r2 = $radius["bottom-right"]; - break; - - case "left": - $length = (float)$h; - $r1 = $radius["top-left"]; - $r2 = $radius["bottom-left"]; - break; - - case "right": - $length = (float)$h; - $x += (float)$w; - $r1 = $radius["top-right"]; - $r2 = $radius["bottom-right"]; - break; - default: - break; - } - $method = "_border_" . $props["style"]; - - // draw rounded corners - $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style, $r1, $r2); - } - } - - /** - * @param AbstractFrameDecorator $frame - * @param null $border_box - * @param string $corner_style - */ - protected function _render_outline(AbstractFrameDecorator $frame, $border_box = null, $corner_style = "bevel") - { - $style = $frame->get_style(); - - $props = [ - "width" => $style->outline_width, - "style" => $style->outline_style, - "color" => $style->outline_color, - ]; - - if (!$props["style"] || $props["style"] === "none" || $props["width"] <= 0) { - return; - } - - if (empty($border_box)) { - $border_box = $frame->get_border_box(); - } - - $offset = (float)$style->length_in_pt($props["width"]); - $pattern = $this->_get_dash_pattern($props["style"], $offset); - - // If the outline style is "solid" we'd better draw a rectangle - if (in_array($props["style"], ["solid", "dashed", "dotted"])) { - $border_box[0] -= $offset / 2; - $border_box[1] -= $offset / 2; - $border_box[2] += $offset; - $border_box[3] += $offset; - - list($x, $y, $w, $h) = $border_box; - $this->_canvas->rectangle($x, $y, (float)$w, (float)$h, $props["color"], $offset, $pattern); - return; - } - - $border_box[0] -= $offset; - $border_box[1] -= $offset; - $border_box[2] += $offset * 2; - $border_box[3] += $offset * 2; - - $method = "_border_" . $props["style"]; - $widths = array_fill(0, 4, (float)$style->length_in_pt($props["width"])); - $sides = ["top", "right", "left", "bottom"]; - $length = 0; - - foreach ($sides as $side) { - list($x, $y, $w, $h) = $border_box; - - switch ($side) { - case "top": - $length = (float)$w; - break; - - case "bottom": - $length = (float)$w; - $y += (float)$h; - break; - - case "left": - $length = (float)$h; - break; - - case "right": - $length = (float)$h; - $x += (float)$w; - break; - default: - break; - } - - $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style); - } - } -} diff --git a/vendor/dompdf/dompdf/src/Renderer/Image.php b/vendor/dompdf/dompdf/src/Renderer/Image.php deleted file mode 100644 index afcaa90..0000000 --- a/vendor/dompdf/dompdf/src/Renderer/Image.php +++ /dev/null @@ -1,143 +0,0 @@ - - * @author Fabien Ménager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Renderer; - -use Dompdf\Frame; -use Dompdf\Image\Cache; - -/** - * Image renderer - * - * @access private - * @package dompdf - */ -class Image extends Block -{ - - /** - * @param Frame $frame - */ - function render(Frame $frame) - { - // Render background & borders - $style = $frame->get_style(); - $cb = $frame->get_containing_block(); - list($x, $y, $w, $h) = $frame->get_border_box(); - - if ($w === 0.0 || $h === 0.0) { - return; - } - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - list($tl, $tr, $br, $bl) = $style->get_computed_border_radius($w, $h); - - $has_border_radius = $tl + $tr + $br + $bl > 0; - - if ($has_border_radius) { - $this->_canvas->clipping_roundrectangle($x, $y, (float)$w, (float)$h, $tl, $tr, $br, $bl); - } - - if (($bg = $style->background_color) !== "transparent") { - $this->_canvas->filled_rectangle($x, $y, (float)$w, (float)$h, $bg); - } - - if (($url = $style->background_image) && $url !== "none") { - $this->_background_image($url, $x, $y, $w, $h, $style); - } - - if ($has_border_radius) { - $this->_canvas->clipping_end(); - } - - $this->_render_border($frame); - $this->_render_outline($frame); - - list($x, $y) = $frame->get_padding_box(); - - $x += (float)$style->length_in_pt($style->padding_left, $cb["w"]); - $y += (float)$style->length_in_pt($style->padding_top, $cb["h"]); - - $w = (float)$style->length_in_pt($style->width, $cb["w"]); - $h = (float)$style->length_in_pt($style->height, $cb["h"]); - - if ($has_border_radius) { - list($wt, $wr, $wb, $wl) = [ - $style->border_top_width, - $style->border_right_width, - $style->border_bottom_width, - $style->border_left_width, - ]; - - // we have to get the "inner" radius - if ($tl > 0) { - $tl -= ($wt + $wl) / 2; - } - if ($tr > 0) { - $tr -= ($wt + $wr) / 2; - } - if ($br > 0) { - $br -= ($wb + $wr) / 2; - } - if ($bl > 0) { - $bl -= ($wb + $wl) / 2; - } - - $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl); - } - - $src = $frame->get_image_url(); - $alt = null; - - if (Cache::is_broken($src) && - $alt = $frame->get_node()->getAttribute("alt") - ) { - $font = $style->font_family; - $size = $style->font_size; - $spacing = $style->word_spacing; - $this->_canvas->text( - $x, - $y, - $alt, - $font, - $size, - $style->color, - $spacing - ); - } else { - $this->_canvas->image($src, $x, $y, $w, $h, $style->image_resolution); - } - - if ($has_border_radius) { - $this->_canvas->clipping_end(); - } - - if ($msg = $frame->get_image_msg()) { - $parts = preg_split("/\s*\n\s*/", $msg); - $height = 10; - $_y = $alt ? $y + $h - count($parts) * $height : $y; - - foreach ($parts as $i => $_part) { - $this->_canvas->text($x, $_y + $i * $height, $_part, "times", $height * 0.8, [0.5, 0.5, 0.5]); - } - } - - if ($this->_dompdf->getOptions()->getDebugLayout() && $this->_dompdf->getOptions()->getDebugLayoutBlocks()) { - $this->_debug_layout($frame->get_border_box(), "blue"); - if ($this->_dompdf->getOptions()->getDebugLayoutPaddingBox()) { - $this->_debug_layout($frame->get_padding_box(), "blue", [0.5, 0.5]); - } - } - - $id = $frame->get_node()->getAttribute("id"); - if (strlen($id) > 0) { - $this->_canvas->add_named_dest($id); - } - } -} diff --git a/vendor/dompdf/dompdf/src/Renderer/Inline.php b/vendor/dompdf/dompdf/src/Renderer/Inline.php deleted file mode 100644 index a258782..0000000 --- a/vendor/dompdf/dompdf/src/Renderer/Inline.php +++ /dev/null @@ -1,158 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Renderer; - -use Dompdf\Frame; -use Dompdf\Helpers; - -/** - * Renders inline frames - * - * @access private - * @package dompdf - */ -class Inline extends AbstractRenderer -{ - function render(Frame $frame) - { - if (!$frame->get_first_child()) { - return; // No children, no service - } - - $style = $frame->get_style(); - $dompdf = $this->_dompdf; - - // Draw the left border if applicable - $bp = $style->get_border_properties(); - $widths = [ - (float)$style->length_in_pt($bp["top"]["width"]), - (float)$style->length_in_pt($bp["right"]["width"]), - (float)$style->length_in_pt($bp["bottom"]["width"]), - (float)$style->length_in_pt($bp["left"]["width"]) - ]; - - // Draw the background & border behind each child. To do this we need - // to figure out just how much space each child takes: - list($x, $y) = $frame->get_first_child()->get_position(); - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - $do_debug_layout_line = $dompdf->getOptions()->getDebugLayout() - && $dompdf->getOptions()->getDebugLayoutInline(); - - list($w, $h) = $this->get_child_size($frame, $do_debug_layout_line); - - // make sure the border and background start inside the left margin - $left_margin = (float)$style->length_in_pt($style->margin_left); - $x += $left_margin; - - // Handle the last child - if (($bg = $style->background_color) !== "transparent") { - $this->_canvas->filled_rectangle($x + $widths[3], $y + $widths[0], $w, $h, $bg); - } - - //On continuation lines (after line break) of inline elements, the style got copied. - //But a non repeatable background image should not be repeated on the next line. - //But removing the background image above has never an effect, and removing it below - //removes it always, even on the initial line. - //Need to handle it elsewhere, e.g. on certain ...clone()... usages. - // Repeat not given: default is Style::__construct - // ... && (!($repeat = $style->background_repeat) || $repeat === "repeat" ... - //different position? $this->_background_image($url, $x, $y, $w, $h, $style); - if (($url = $style->background_image) && $url !== "none") { - $this->_background_image($url, $x + $widths[3], $y + $widths[0], $w, $h, $style); - } - - // Add the border widths - $w += (float)$widths[1] + (float)$widths[3]; - $h += (float)$widths[0] + (float)$widths[2]; - - // If this is the first row, draw the left border too - if ($bp["left"]["style"] !== "none" && $bp["left"]["color"] !== "transparent" && $widths[3] > 0) { - $method = "_border_" . $bp["left"]["style"]; - $this->$method($x, $y, $h, $bp["left"]["color"], $widths, "left"); - } - - // Draw the top & bottom borders - if ($bp["top"]["style"] !== "none" && $bp["top"]["color"] !== "transparent" && $widths[0] > 0) { - $method = "_border_" . $bp["top"]["style"]; - $this->$method($x, $y, $w, $bp["top"]["color"], $widths, "top"); - } - - if ($bp["bottom"]["style"] !== "none" && $bp["bottom"]["color"] !== "transparent" && $widths[2] > 0) { - $method = "_border_" . $bp["bottom"]["style"]; - $this->$method($x, $y + $h, $w, $bp["bottom"]["color"], $widths, "bottom"); - } - - // Helpers::var_dump(get_class($frame->get_next_sibling())); - // $last_row = get_class($frame->get_next_sibling()) !== 'Inline'; - // Draw the right border if this is the last row - if ($bp["right"]["style"] !== "none" && $bp["right"]["color"] !== "transparent" && $widths[1] > 0) { - $method = "_border_" . $bp["right"]["style"]; - $this->$method($x + $w, $y, $h, $bp["right"]["color"], $widths, "right"); - } - - $node = $frame->get_node(); - $id = $node->getAttribute("id"); - if (strlen($id) > 0) { - $this->_canvas->add_named_dest($id); - } - - // Only two levels of links frames - $is_link_node = $node->nodeName === "a"; - if ($is_link_node) { - if (($name = $node->getAttribute("name"))) { - $this->_canvas->add_named_dest($name); - } - } - - if ($frame->get_parent() && $frame->get_parent()->get_node()->nodeName === "a") { - $link_node = $frame->get_parent()->get_node(); - } - - // Handle anchors & links - if ($is_link_node) { - if ($href = $node->getAttribute("href")) { - $href = Helpers::build_url($dompdf->getProtocol(), $dompdf->getBaseHost(), $dompdf->getBasePath(), $href); - $this->_canvas->add_link($href, $x, $y, $w, $h); - } - } - } - - protected function get_child_size(Frame $frame, bool $do_debug_layout_line): array { - $w = 0.0; - $h = 0.0; - - foreach ($frame->get_children() as $child) { - if ($child->get_node()->nodeValue === ' ' && $child->get_prev_sibling() && !$child->get_next_sibling()) { - break; - } - list($child_x, $child_y, $child_w, $child_h) = $child->get_padding_box(); - - $child_h2 = 0.0; - - if ($child_w === 'auto') { - list($child_w, $child_h2) = $this->get_child_size($child, $do_debug_layout_line); - $w += (float)$child_w; - } else { - $w += (float)$child_w; - } - - $h = max($h, $child_h, $child_h2); - - if ($do_debug_layout_line) { - $this->_debug_layout($child->get_border_box(), "blue"); - if ($this->_dompdf->getOptions()->getDebugLayoutPaddingBox()) { - $this->_debug_layout($child->get_padding_box(), "blue", [0.5, 0.5]); - } - } - } - - return [$w, $h]; - } -} \ No newline at end of file diff --git a/vendor/dompdf/dompdf/src/Renderer/ListBullet.php b/vendor/dompdf/dompdf/src/Renderer/ListBullet.php deleted file mode 100644 index d3df029..0000000 --- a/vendor/dompdf/dompdf/src/Renderer/ListBullet.php +++ /dev/null @@ -1,257 +0,0 @@ - - * @author Helmut Tischer - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Renderer; - -use Dompdf\Helpers; -use Dompdf\Frame; -use Dompdf\Image\Cache; -use Dompdf\FrameDecorator\ListBullet as ListBulletFrameDecorator; - -/** - * Renders list bullets - * - * @access private - * @package dompdf - */ -class ListBullet extends AbstractRenderer -{ - /** - * @param $type - * @return mixed|string - */ - static function get_counter_chars($type) - { - static $cache = []; - - if (isset($cache[$type])) { - return $cache[$type]; - } - - $uppercase = false; - $text = ""; - - switch ($type) { - case "decimal-leading-zero": - case "decimal": - case "1": - return "0123456789"; - - case "upper-alpha": - case "upper-latin": - case "A": - $uppercase = true; - case "lower-alpha": - case "lower-latin": - case "a": - $text = "abcdefghijklmnopqrstuvwxyz"; - break; - - case "upper-roman": - case "I": - $uppercase = true; - case "lower-roman": - case "i": - $text = "ivxlcdm"; - break; - - case "lower-greek": - for ($i = 0; $i < 24; $i++) { - $text .= Helpers::unichr($i + 944); - } - break; - } - - if ($uppercase) { - $text = strtoupper($text); - } - - return $cache[$type] = "$text."; - } - - /** - * @param integer $n - * @param string $type - * @param integer $pad - * - * @return string - */ - private function make_counter($n, $type, $pad = null) - { - $n = intval($n); - $text = ""; - $uppercase = false; - - switch ($type) { - case "decimal-leading-zero": - case "decimal": - case "1": - if ($pad) { - $text = str_pad($n, $pad, "0", STR_PAD_LEFT); - } else { - $text = $n; - } - break; - - case "upper-alpha": - case "upper-latin": - case "A": - $uppercase = true; - case "lower-alpha": - case "lower-latin": - case "a": - $text = chr(($n % 26) + ord('a') - 1); - break; - - case "upper-roman": - case "I": - $uppercase = true; - case "lower-roman": - case "i": - $text = Helpers::dec2roman($n); - break; - - case "lower-greek": - $text = Helpers::unichr($n + 944); - break; - } - - if ($uppercase) { - $text = strtoupper($text); - } - - return "$text."; - } - - /** - * @param Frame $frame - */ - function render(Frame $frame) - { - $style = $frame->get_style(); - $font_size = $style->font_size; - $line_height = $style->line_height; - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - $li = $frame->get_parent(); - - // Don't render bullets twice if if was split - if ($li->_splitted) { - return; - } - - // Handle list-style-image - // If list style image is requested but missing, fall back to predefined types - if ($style->list_style_image !== "none" && !Cache::is_broken($img = $frame->get_image_url())) { - list($x, $y) = $frame->get_position(); - - //For expected size and aspect, instead of box size, use image natural size scaled to DPI. - // Resample the bullet image to be consistent with 'auto' sized images - // See also Image::get_min_max_width - // Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary. - //$w = $frame->get_width(); - //$h = $frame->get_height(); - list($width, $height) = Helpers::dompdf_getimagesize($img, $this->_dompdf->getHttpContext()); - $dpi = $this->_dompdf->getOptions()->getDpi(); - $w = ((float)rtrim($width, "px") * 72) / $dpi; - $h = ((float)rtrim($height, "px") * 72) / $dpi; - - $x -= $w; - $y -= ($line_height - $font_size) / 2; //Reverse hinting of list_bullet_positioner - - $this->_canvas->image($img, $x, $y, $w, $h); - } else { - $bullet_style = $style->list_style_type; - - $fill = false; - - switch ($bullet_style) { - default: - /** @noinspection PhpMissingBreakStatementInspection */ - case "disc": - $fill = true; - - case "circle": - list($x, $y) = $frame->get_position(); - $r = ($font_size * (ListBulletFrameDecorator::BULLET_SIZE /*-ListBulletFrameDecorator::BULLET_THICKNESS*/)) / 2; - $x -= $font_size * (ListBulletFrameDecorator::BULLET_SIZE / 2); - $y += ($font_size * (1 - ListBulletFrameDecorator::BULLET_DESCENT)) / 2; - $o = $font_size * ListBulletFrameDecorator::BULLET_THICKNESS; - $this->_canvas->circle($x, $y, $r, $style->color, $o, null, $fill); - break; - - case "square": - list($x, $y) = $frame->get_position(); - $w = $font_size * ListBulletFrameDecorator::BULLET_SIZE; - $x -= $w; - $y += ($font_size * (1 - ListBulletFrameDecorator::BULLET_DESCENT - ListBulletFrameDecorator::BULLET_SIZE)) / 2; - $this->_canvas->filled_rectangle($x, $y, $w, $w, $style->color); - break; - - case "decimal-leading-zero": - case "decimal": - case "lower-alpha": - case "lower-latin": - case "lower-roman": - case "lower-greek": - case "upper-alpha": - case "upper-latin": - case "upper-roman": - case "1": // HTML 4.0 compatibility - case "a": - case "i": - case "A": - case "I": - $pad = null; - if ($bullet_style === "decimal-leading-zero") { - $pad = strlen($li->get_parent()->get_node()->getAttribute("dompdf-children-count")); - } - - $node = $frame->get_node(); - - if (!$node->hasAttribute("dompdf-counter")) { - return; - } - - $index = $node->getAttribute("dompdf-counter"); - $text = $this->make_counter($index, $bullet_style, $pad); - - if (trim($text) == "") { - return; - } - - $spacing = 0; - $font_family = $style->font_family; - - $line = $li->get_containing_line(); - list($x, $y) = [$frame->get_position("x"), $line->y]; - - $x -= $this->_dompdf->getFontMetrics()->getTextWidth($text, $font_family, $font_size, $spacing); - - // Take line-height into account - // TODO: should the line height take into account the line height of the containing block (per previous logic) - // $line_height = (float)$style->length_in_pt($style->line_height, $frame->get_containing_block("h")); - $line_height = $style->line_height; - $y += ($line_height - $font_size) / 4; // FIXME I thought it should be 2, but 4 gives better results - - $this->_canvas->text($x, $y, $text, - $font_family, $font_size, - $style->color, $spacing); - - case "none": - break; - } - } - - $id = $frame->get_node()->getAttribute("id"); - if (strlen($id) > 0) { - $this->_canvas->add_named_dest($id); - } - } -} diff --git a/vendor/dompdf/dompdf/src/Renderer/TableCell.php b/vendor/dompdf/dompdf/src/Renderer/TableCell.php deleted file mode 100644 index 25bdb56..0000000 --- a/vendor/dompdf/dompdf/src/Renderer/TableCell.php +++ /dev/null @@ -1,219 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Renderer; - -use Dompdf\Frame; -use Dompdf\FrameDecorator\Table; - -/** - * Renders table cells - * - * @package dompdf - */ -class TableCell extends Block -{ - - /** - * @param Frame $frame - */ - function render(Frame $frame) - { - $style = $frame->get_style(); - - if (trim($frame->get_node()->nodeValue) === "" && $style->empty_cells === "hide") { - return; - } - - $id = $frame->get_node()->getAttribute("id"); - if (strlen($id) > 0) { - $this->_canvas->add_named_dest($id); - } - - $this->_set_opacity($frame->get_opacity($style->opacity)); - list($x, $y, $w, $h) = $frame->get_border_box(); - - - $table = Table::find_parent_table($frame); - - if ($table->get_style()->border_collapse !== "collapse") { - if (($bg = $style->background_color) !== "transparent") { - $this->_canvas->filled_rectangle($x, $y, (float)$w, (float)$h, $bg); - } - - if (($url = $style->background_image) && $url !== "none") { - $this->_background_image($url, $x, $y, $w, $h, $style); - } - - $this->_render_border($frame); - $this->_render_outline($frame); - return; - } - - // The collapsed case is slightly complicated... - // @todo Add support for outlines here - - $background_position_x = $x; $background_position_y = $y; $background_width = (float)$w; $background_height = (float)$h; - $border_right_width = 0; $border_left_width = 0; $border_top_width = 0; $border_bottom_width = 0; - $border_right_length = 0; $border_left_length = 0; $border_top_length = 0; $border_bottom_length = 0; - - $cellmap = $table->get_cellmap(); - $cells = $cellmap->get_spanned_cells($frame); - - if (is_null($cells)) { - return; - } - - $num_rows = $cellmap->get_num_rows(); - $num_cols = $cellmap->get_num_cols(); - - // Determine the top row spanned by this cell - $i = $cells["rows"][0]; - $top_row = $cellmap->get_row($i); - - // Determine if this cell borders on the bottom of the table. If so, - // then we draw its bottom border. Otherwise the next row down will - // draw its top border instead. - if (in_array($num_rows - 1, $cells["rows"])) { - $draw_bottom = true; - $bottom_row = $cellmap->get_row($num_rows - 1); - } else { - $draw_bottom = false; - } - - // Draw the horizontal borders - $border_function_calls = []; - foreach ($cells["columns"] as $j) { - $bp = $cellmap->get_border_properties($i, $j); - $col = $cellmap->get_column($j); - - $x = $col["x"] - $bp["left"]["width"] / 2; - $y = $top_row["y"] - $bp["top"]["width"] / 2; - $w = $col["used-width"] + ($bp["left"]["width"] + $bp["right"]["width"]) / 2; - - if ($bp["top"]["width"] > 0) { - $widths = [ - (float)$bp["top"]["width"], - (float)$bp["right"]["width"], - (float)$bp["bottom"]["width"], - (float)$bp["left"]["width"] - ]; - - $border_top_width = max($border_top_width, $widths[0]); - - $method = "_border_" . $bp["top"]["style"]; - $border_function_calls[] = [$method, [$x, $y, $w, $bp["top"]["color"], $widths, "top", "square"]]; - } - - if ($draw_bottom) { - $bp = $cellmap->get_border_properties($num_rows - 1, $j); - if ($bp["bottom"]["width"] <= 0) { - continue; - } - - $widths = [ - (float)$bp["top"]["width"], - (float)$bp["right"]["width"], - (float)$bp["bottom"]["width"], - (float)$bp["left"]["width"] - ]; - - $y = $bottom_row["y"] + $bottom_row["height"] + $bp["bottom"]["width"] / 2; - $border_bottom_width = max($border_bottom_width, $widths[2]); - - $method = "_border_" . $bp["bottom"]["style"]; - $border_function_calls[] = [$method, [$x, $y, $w, $bp["bottom"]["color"], $widths, "bottom", "square"]]; - } else { - $adjacent_bp = $cellmap->get_border_properties($i+1, $j); - $border_bottom_width = max($border_bottom_width, $adjacent_bp["top"]["width"]); - } - } - - $j = $cells["columns"][0]; - - $left_col = $cellmap->get_column($j); - - if (in_array($num_cols - 1, $cells["columns"])) { - $draw_right = true; - $right_col = $cellmap->get_column($num_cols - 1); - } else { - $draw_right = false; - } - - // Draw the vertical borders - foreach ($cells["rows"] as $i) { - $bp = $cellmap->get_border_properties($i, $j); - $row = $cellmap->get_row($i); - - $x = $left_col["x"] - $bp["left"]["width"] / 2; - $y = $row["y"] - $bp["top"]["width"] / 2; - $h = $row["height"] + ($bp["top"]["width"] + $bp["bottom"]["width"]) / 2; - - if ($bp["left"]["width"] > 0) { - $widths = [ - (float)$bp["top"]["width"], - (float)$bp["right"]["width"], - (float)$bp["bottom"]["width"], - (float)$bp["left"]["width"] - ]; - - $border_left_width = max($border_left_width, $widths[3]); - - $method = "_border_" . $bp["left"]["style"]; - $border_function_calls[] = [$method, [$x, $y, $h, $bp["left"]["color"], $widths, "left", "square"]]; - } - - if ($draw_right) { - $bp = $cellmap->get_border_properties($i, $num_cols - 1); - if ($bp["right"]["width"] <= 0) { - continue; - } - - $widths = [ - (float)$bp["top"]["width"], - (float)$bp["right"]["width"], - (float)$bp["bottom"]["width"], - (float)$bp["left"]["width"] - ]; - - $x = $right_col["x"] + $right_col["used-width"] + $bp["right"]["width"] / 2; - $border_right_width = max($border_right_width, $widths[1]); - - $method = "_border_" . $bp["right"]["style"]; - $border_function_calls[] = [$method, [$x, $y, $h, $bp["right"]["color"], $widths, "right", "square"]]; - } else { - $adjacent_bp = $cellmap->get_border_properties($i, $j+1); - $border_right_width = max($border_right_width, $adjacent_bp["left"]["width"]); - } - } - - // Draw our background, border and content - if (($bg = $style->background_color) !== "transparent") { - $this->_canvas->filled_rectangle( - $background_position_x + ($border_left_width/2), - $background_position_y + ($border_top_width/2), - (float)$background_width - (($border_left_width + $border_right_width)/2), - (float)$background_height - (($border_top_width + $border_bottom_width)/2), - $bg - ); - } - if (($url = $style->background_image) && $url !== "none") { - $this->_background_image( - $url, - $background_position_x + ($border_left_width/2), - $background_position_y + ($border_top_width/2), - (float)$background_width - (($border_left_width + $border_right_width)/2), - (float)$background_height - (($border_top_width + $border_bottom_width)/2), - $style - ); - } - foreach ($border_function_calls as $border_function_call_params) - { - call_user_func_array([$this, $border_function_call_params[0]], $border_function_call_params[1]); - } - } -} diff --git a/vendor/dompdf/dompdf/src/Renderer/TableRowGroup.php b/vendor/dompdf/dompdf/src/Renderer/TableRowGroup.php deleted file mode 100644 index 41ddd87..0000000 --- a/vendor/dompdf/dompdf/src/Renderer/TableRowGroup.php +++ /dev/null @@ -1,50 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Renderer; - -use Dompdf\Frame; - -/** - * Renders block frames - * - * @package dompdf - */ -class TableRowGroup extends Block -{ - - /** - * @param Frame $frame - */ - function render(Frame $frame) - { - $style = $frame->get_style(); - - $this->_set_opacity($frame->get_opacity($style->opacity)); - - $this->_render_border($frame); - $this->_render_outline($frame); - - if ($this->_dompdf->getOptions()->getDebugLayout() && $this->_dompdf->getOptions()->getDebugLayoutBlocks()) { - $this->_debug_layout($frame->get_border_box(), "red"); - if ($this->_dompdf->getOptions()->getDebugLayoutPaddingBox()) { - $this->_debug_layout($frame->get_padding_box(), "red", [0.5, 0.5]); - } - } - - if ($this->_dompdf->getOptions()->getDebugLayout() && $this->_dompdf->getOptions()->getDebugLayoutLines() && $frame->get_decorator()) { - foreach ($frame->get_decorator()->get_line_boxes() as $line) { - $frame->_debug_layout([$line->x, $line->y, $line->w, $line->h], "orange"); - } - } - - $id = $frame->get_node()->getAttribute("id"); - if (strlen($id) > 0) { - $this->_canvas->add_named_dest($id); - } - } -} diff --git a/vendor/dompdf/dompdf/src/Renderer/Text.php b/vendor/dompdf/dompdf/src/Renderer/Text.php deleted file mode 100644 index ed458d9..0000000 --- a/vendor/dompdf/dompdf/src/Renderer/Text.php +++ /dev/null @@ -1,167 +0,0 @@ - - * @author Helmut Tischer - * @author Fabien Ménager - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace Dompdf\Renderer; - -use Dompdf\Adapter\CPDF; -use Dompdf\Frame; - -/** - * Renders text frames - * - * @package dompdf - */ -class Text extends AbstractRenderer -{ - /** Thickness of underline. Screen: 0.08, print: better less, e.g. 0.04 */ - const DECO_THICKNESS = 0.02; - - //Tweaking if $base and $descent are not accurate. - //Check method_exists( $this->_canvas, "get_cpdf" ) - //- For cpdf these can and must stay 0, because font metrics are used directly. - //- For other renderers, if different values are wanted, separate the parameter sets. - // But $size and $size-$height seem to be accurate enough - - /** Relative to bottom of text, as fraction of height */ - const UNDERLINE_OFFSET = 0.0; - - /** Relative to top of text */ - const OVERLINE_OFFSET = 0.0; - - /** Relative to centre of text. */ - const LINETHROUGH_OFFSET = 0.0; - - /** How far to extend lines past either end, in pt */ - const DECO_EXTENSION = 0.0; - - /** - * @param \Dompdf\FrameDecorator\Text $frame - */ - function render(Frame $frame) - { - $text = $frame->get_text(); - if (trim($text) === "") { - return; - } - - $style = $frame->get_style(); - list($x, $y) = $frame->get_position(); - $cb = $frame->get_containing_block(); - - if (($ml = $style->margin_left) === "auto" || $ml === "none") { - $ml = 0; - } - - if (($pl = $style->padding_left) === "auto" || $pl === "none") { - $pl = 0; - } - - if (($bl = $style->border_left_width) === "auto" || $bl === "none") { - $bl = 0; - } - - $x += (float)$style->length_in_pt([$ml, $pl, $bl], $cb["w"]); - - $font = $style->font_family; - $size = $style->font_size; - $frame_font_size = $frame->get_dompdf()->getFontMetrics()->getFontHeight($font, $size); - $word_spacing = $frame->get_text_spacing() + (float)$style->length_in_pt($style->word_spacing); - $char_spacing = (float)$style->length_in_pt($style->letter_spacing); - $width = $style->width; - - /*$text = str_replace( - array("{PAGE_NUM}"), - array($this->_canvas->get_page_number()), - $text - );*/ - - $this->_canvas->text($x, $y, $text, - $font, $size, - $style->color, $word_spacing, $char_spacing); - - $line = $frame->get_containing_line(); - - // FIXME Instead of using the tallest frame to position, - // the decoration, the text should be well placed - if (false && $line->tallest_frame) { - $base_frame = $line->tallest_frame; - $style = $base_frame->get_style(); - $size = $style->font_size; - } - - $line_thickness = $size * self::DECO_THICKNESS; - $underline_offset = $size * self::UNDERLINE_OFFSET; - $overline_offset = $size * self::OVERLINE_OFFSET; - $linethrough_offset = $size * self::LINETHROUGH_OFFSET; - $underline_position = -0.08; - - if ($this->_canvas instanceof CPDF) { - $cpdf_font = $this->_canvas->get_cpdf()->fonts[$style->font_family]; - - if (isset($cpdf_font["UnderlinePosition"])) { - $underline_position = $cpdf_font["UnderlinePosition"] / 1000; - } - - if (isset($cpdf_font["UnderlineThickness"])) { - $line_thickness = $size * ($cpdf_font["UnderlineThickness"] / 1000); - } - } - - $descent = $size * $underline_position; - $base = $frame_font_size; - - // Handle text decoration: - // http://www.w3.org/TR/CSS21/text.html#propdef-text-decoration - - // Draw all applicable text-decorations. Start with the root and work our way down. - $p = $frame; - $stack = []; - while ($p = $p->get_parent()) { - $stack[] = $p; - } - - while (isset($stack[0])) { - $f = array_pop($stack); - - if (($text_deco = $f->get_style()->text_decoration) === "none") { - continue; - } - - $deco_y = $y; //$line->y; - $color = $f->get_style()->color; - - switch ($text_deco) { - default: - continue 2; - - case "underline": - $deco_y += $base - $descent + $underline_offset + $line_thickness / 2; - break; - - case "overline": - $deco_y += $overline_offset + $line_thickness / 2; - break; - - case "line-through": - $deco_y += $base * 0.7 + $linethrough_offset; - break; - } - - $dx = 0; - $x1 = $x - self::DECO_EXTENSION; - $x2 = $x + $width + $dx + self::DECO_EXTENSION; - $this->_canvas->line($x1, $deco_y, $x2, $deco_y, $color, $line_thickness); - } - - if ($this->_dompdf->getOptions()->getDebugLayout() && $this->_dompdf->getOptions()->getDebugLayoutLines()) { - $text_width = $this->_dompdf->getFontMetrics()->getTextWidth($text, $font, $size); - $this->_debug_layout([$x, $y, $text_width + ($line->wc - 1) * $word_spacing, $frame_font_size], "orange", [0.5, 0.5]); - } - } -} diff --git a/vendor/fzaninotto/faker b/vendor/fzaninotto/faker deleted file mode 160000 index ac73e52..0000000 --- a/vendor/fzaninotto/faker +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ac73e5287024f5e98dd6d0bf10e6a6f7877b7513 diff --git a/vendor/kint-php/kint/LICENSE b/vendor/kint-php/kint/LICENSE deleted file mode 100644 index 01718d4..0000000 --- a/vendor/kint-php/kint/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Šleinius (raveren@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/kint-php/kint/README.md b/vendor/kint-php/kint/README.md deleted file mode 100644 index b23f346..0000000 --- a/vendor/kint-php/kint/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# Kint - debugging helper for PHP developers - -[![](https://travis-ci.org/kint-php/kint.svg?branch=master)](https://travis-ci.org/kint-php/kint) - -![Screenshot](https://kint-php.github.io/kint/images/intro.png) - -## What am I looking at? - -At first glance Kint is just a pretty replacement for **[var_dump()](https://secure.php.net/function.var_dump)**, **[print_r()](https://secure.php.net/function.print_r)** and **[debug_backtrace()](https://secure.php.net/function.debug_backtrace)**. - -However, it's much, *much* more than that. You will eventually wonder how you developed without it. - -## Installation - -One of the main goals of Kint is to be **zero setup**. - -[Download the file](https://raw.githubusercontent.com/kint-php/kint/master/build/kint.phar) and simply -```php -+ sign will open/close it and all its children. -* Triple clicking the + sign in will open/close everything on the page. -* Add heavy classes to the blacklist to improve performance: - `Kint\Parser\BlacklistPlugin::$shallow_blacklist[] = 'Psr\Container\ContainerInterface';` -* To change display theme, use `Kint\Renderer\RichRenderer::$theme = 'theme.css';`. You can pass the absolute path to a CSS file, or use one of the built in themes: - * `original.css` (default) - * `solarized.css` - * `solarized-dark.css` - * `aante-light.css` -* Kint has *keyboard shortcuts*! When Kint is visible, press D on the keyboard and you will be able to traverse the tree with arrows, HJKL, and TAB keys - and expand/collapse nodes with SPACE or ENTER. -* You can write plugins and wrapper functions to customize dump behavior! -* Read [the full documentation](https://kint-php.github.io/kint/) for more information - -## Authors - -[**Jonathan Vollebregt** (jnvsor)](https://github.com/jnvsor) -[**Rokas Šleinius** (raveren)](https://github.com/raveren) - -## License - -Licensed under the MIT License diff --git a/vendor/kint-php/kint/composer.json b/vendor/kint-php/kint/composer.json deleted file mode 100644 index 9fe64a4..0000000 --- a/vendor/kint-php/kint/composer.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "kint-php/kint", - "description": "Kint - debugging tool for PHP developers", - "keywords": ["kint", "php", "debug"], - "type": "library", - "homepage": "https://kint-php.github.io/kint/", - "license": "MIT", - "authors": [ - { - "name": "Jonathan Vollebregt", - "homepage": "https://github.com/jnvsor" - }, - { - "name": "Rokas Šleinius", - "homepage": "https://github.com/raveren" - }, - { - "name": "Contributors", - "homepage": "https://github.com/kint-php/kint/graphs/contributors" - } - ], - "require": { - "php": ">=5.3.6" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.0", - "phpunit/phpunit": "^4.0", - "symfony/finder": "^2.0 || ^3.0 || ^4.0", - "seld/phar-utils": "^1.0", - "vimeo/psalm": "^3.0" - }, - "autoload": { - "files": ["init.php"], - "psr-4": { - "Kint\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "Kint\\Test\\": "tests/" - } - }, - "config": { - "platform": { - "php": "7.3" - } - }, - "scripts": { - "post-update-cmd": "npm ci", - "post-install-cmd": "@post-update-cmd", - "clean": [ - "rm -rf resources/compiled/", - "rm -rf build/" - ], - "format": [ - "@format:php", - "@format:js", - "@format:sass" - ], - "format:php": "php-cs-fixer fix", - "format:js": "npm run format:js", - "format:sass": "npm run format:sass", - "build": [ - "@build:sass", - "@build:js", - "@build:php" - ], - "build:sass": "npm run build:sass", - "build:js": "npm run build:js", - "build:php": "php ./build.php", - "analyze": "psalm --show-info=false" - }, - "suggest": { - "kint-php/kint-twig": "Provides d() and s() functions in twig templates", - "kint-php/kint-js": "Provides a simplified dump to console.log()", - "ext-mbstring": "Provides string encoding detection", - "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages", - "ext-ctype": "Simple data type tests", - "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing", - "symfony/polyfill-iconv": "Replacement for ext-iconv if missing", - "symfony/polyfill-ctype": "Replacement for ext-ctype if missing" - } -} diff --git a/vendor/kint-php/kint/init.php b/vendor/kint-php/kint/init.php deleted file mode 100644 index 952e041..0000000 --- a/vendor/kint-php/kint/init.php +++ /dev/null @@ -1,62 +0,0 @@ -= 0)); -\define('KINT_PHP70', (\version_compare(PHP_VERSION, '7.0') >= 0)); -\define('KINT_PHP72', (\version_compare(PHP_VERSION, '7.2') >= 0)); -\define('KINT_PHP73', (\version_compare(PHP_VERSION, '7.3') >= 0)); -\define('KINT_PHP74', (\version_compare(PHP_VERSION, '7.4') >= 0)); - -// Dynamic default settings -Kint::$file_link_format = \ini_get('xdebug.file_link_format'); -if (isset($_SERVER['DOCUMENT_ROOT'])) { - Kint::$app_root_dirs = array( - $_SERVER['DOCUMENT_ROOT'] => '', - \realpath($_SERVER['DOCUMENT_ROOT']) => '', - ); -} - -Utils::composerSkipFlags(); - -if ((!\defined('KINT_SKIP_FACADE') || !KINT_SKIP_FACADE) && !\class_exists('Kint')) { - \class_alias('Kint\\Kint', 'Kint'); -} - -if (!\defined('KINT_SKIP_HELPERS') || !KINT_SKIP_HELPERS) { - require_once __DIR__.'/init_helpers.php'; -} diff --git a/vendor/kint-php/kint/init_helpers.php b/vendor/kint-php/kint/init_helpers.php deleted file mode 100644 index b961d67..0000000 --- a/vendor/kint-php/kint/init_helpers.php +++ /dev/null @@ -1,84 +0,0 @@ -dl dl{padding:0 0 0 12px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMCAxNTAiPjxwYXRoIGQ9Ik02IDdoMThsLTkgMTV6bTAgMzBoMThsLTkgMTV6bTAgNDVoMThsLTktMTV6bTAgMzBoMThsLTktMTV6bTAgMTJsMTggMThtLTE4IDBsMTgtMTgiIGZpbGw9IiM1NTUiLz48cGF0aCBkPSJNNiAxMjZsMTggMThtLTE4IDBsMTgtMTgiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSIjNTU1Ii8+PC9zdmc+") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #d7d7d7}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#06f;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:red}.kint-rich dfn{font-style:normal;font-family:monospace;color:#1d1e1e}.kint-rich pre{color:#1d1e1e;margin:0 0 0 12px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #d7d7d7;background:#f8f8f8;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(29,30,30,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#f8f8f8;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#1d1e1e;background:#f8f8f8}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #d7d7d7;border-top-width:0;border-bottom-width:0;padding:4px;float:right !important;margin:-4px 0;color:#1d1e1e;background:#f8f8f8;height:24px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#f8f8f8;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#f8f8f8}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#f8f8f8;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#1d1e1e}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#1d1e1e;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#1d1e1e;border-bottom:1px dotted #1d1e1e}.kint-rich ul{list-style:none;padding-left:12px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #d7d7d7}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 12px;padding-left:0;background:#f8f8f8;border:1px solid #d7d7d7;border-top:0}.kint-rich ul.kint-tabs>li{background:#f8f8f8;border:1px solid #d7d7d7;cursor:pointer;display:inline-block;height:24px;margin:2px;padding:0 12px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#aaa;color:red}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#f8f8f8;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:20px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#aaa;color:red}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #d7d7d7;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#aaa}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #d7d7d7;padding:2px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#f8f8f8;color:#1d1e1e}.kint-rich table td{background:#f8f8f8;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #aaa inset}.kint-rich table tr:hover var{color:red}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:4px;padding-bottom:4px;border-bottom:1px solid #f8f8f8}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #aaa;padding-right:8px;margin-right:8px}.kint-rich pre.kint-source>div.kint-highlight{background:#f8f8f8}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #aaa,0 1px #aaa,1px 0 #aaa,0 -1px #aaa;color:#f8f8f8;font-weight:bold}.kint-rich .kint-focused{box-shadow:0 0 3px 2px red}.kint-rich dt{font-weight:normal}.kint-rich dt.kint-parent{margin-top:4px}.kint-rich dl dl{margin-top:4px;padding-left:25px;border-left:none}.kint-rich>dl>dt{background:#f8f8f8}.kint-rich ul{margin:0;padding-left:0}.kint-rich ul:not(.kint-tabs)>li{border-left:0}.kint-rich ul.kint-tabs{background:#f8f8f8;border:1px solid #d7d7d7;border-width:0 1px 1px 1px;padding:4px 0 0 12px;margin-left:-1px;margin-top:-1px}.kint-rich ul.kint-tabs li,.kint-rich ul.kint-tabs li+li{margin:0 0 0 4px}.kint-rich ul.kint-tabs li{border-bottom-width:0;height:25px}.kint-rich ul.kint-tabs li:first-child{margin-left:0}.kint-rich ul.kint-tabs li.kint-active-tab{border-top:1px solid #d7d7d7;background:#fff;font-weight:bold;padding-top:0;border-bottom:1px solid #fff !important;margin-bottom:-1px}.kint-rich ul.kint-tabs li.kint-active-tab:hover{border-bottom:1px solid #fff}.kint-rich ul>li>pre{border:1px solid #d7d7d7}.kint-rich dt:hover+dd>ul{border-color:#aaa}.kint-rich pre{background:#fff;margin-top:4px;margin-left:25px}.kint-rich .kint-source{margin-left:-1px}.kint-rich .kint-source .kint-highlight{background:#cfc}.kint-rich .kint-parent.kint-show>.kint-search{border-bottom-width:1px}.kint-rich table td{background:#fff}.kint-rich table td>dl{padding:0;margin:0}.kint-rich table td>dl>dt.kint-parent{margin:0}.kint-rich table td:first-child,.kint-rich table td,.kint-rich table th{padding:2px 4px}.kint-rich table dd,.kint-rich table dt{background:#fff}.kint-rich table tr:hover>td{box-shadow:none;background:#cfc} diff --git a/vendor/kint-php/kint/resources/compiled/microtime.js b/vendor/kint-php/kint/resources/compiled/microtime.js deleted file mode 100644 index 20e3445..0000000 --- a/vendor/kint-php/kint/resources/compiled/microtime.js +++ /dev/null @@ -1 +0,0 @@ -void 0===window.kintMicrotimeInitialized&&(window.kintMicrotimeInitialized=1,window.addEventListener("load",function(){"use strict";var c={},i=Array.prototype.slice.call(document.querySelectorAll("[data-kint-microtime-group]"),0);i.forEach(function(i){if(i.querySelector(".kint-microtime-lap")){var t=i.getAttribute("data-kint-microtime-group"),e=parseFloat(i.querySelector(".kint-microtime-lap").innerHTML),r=parseFloat(i.querySelector(".kint-microtime-avg").innerHTML);void 0===c[t]&&(c[t]={}),(void 0===c[t].min||c[t].min>e)&&(c[t].min=e),(void 0===c[t].max||c[t].maxdl dl{padding:0 0 0 12px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMCAxNTAiPjxnIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0iI0ZGRiI+PHBhdGggZD0iTTEgMWgyOHYyOEgxem01IDE0aDE4bS05IDlWNk0xIDYxaDI4djI4SDF6bTUgMTRoMTgiIHN0cm9rZT0iIzM3OSIvPjxwYXRoIGQ9Ik0xIDMxaDI4djI4SDF6bTUgMTRoMThtLTkgOVYzNk0xIDkxaDI4djI4SDF6bTUgMTRoMTgiIHN0cm9rZT0iIzVBMyIvPjxwYXRoIGQ9Ik0xIDEyMWgyOHYyOEgxem01IDVsMTggMThtLTE4IDBsMTgtMTgiIHN0cm9rZT0iI0NDQyIvPjwvZz48L3N2Zz4=") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #b6cedb}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#0092db;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:#5cb730}.kint-rich dfn{font-style:normal;font-family:monospace;color:#1d1e1e}.kint-rich pre{color:#1d1e1e;margin:0 0 0 12px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #b6cedb;background:#e0eaef;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(29,30,30,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#e0eaef;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#1d1e1e;background:#e0eaef}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #b6cedb;border-top-width:0;border-bottom-width:0;padding:4px;float:right !important;margin:-4px 0;color:#1d1e1e;background:#c1d4df;height:24px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#d0d0d0;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#e8e8e8}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#c1d4df;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#1d1e1e}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#1d1e1e;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#1d1e1e;border-bottom:1px dotted #1d1e1e}.kint-rich ul{list-style:none;padding-left:12px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #b6cedb}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 12px;padding-left:0;background:#e0eaef;border:1px solid #b6cedb;border-top:0}.kint-rich ul.kint-tabs>li{background:#c1d4df;border:1px solid #b6cedb;cursor:pointer;display:inline-block;height:24px;margin:2px;padding:0 12px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#0092db;color:#5cb730}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#e0eaef;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:20px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#0092db;color:#5cb730}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #b6cedb;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#0092db}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #b6cedb;padding:2px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#c1d4df;color:#1d1e1e}.kint-rich table td{background:#e0eaef;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #0092db inset}.kint-rich table tr:hover var{color:#5cb730}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:4px;padding-bottom:4px;border-bottom:1px solid #c1d4df}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #0092db;padding-right:8px;margin-right:8px}.kint-rich pre.kint-source>div.kint-highlight{background:#c1d4df}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #0092db,0 1px #0092db,1px 0 #0092db,0 -1px #0092db;color:#e0eaef;font-weight:bold}.kint-rich>dl>dt{background:linear-gradient(to bottom, #e3ecf0 0, #c0d4df 100%)}.kint-rich ul.kint-tabs{background:linear-gradient(to bottom, #9dbed0 0px, #b2ccda 100%)}.kint-rich>dl:not(.kint-trace)>dd>ul.kint-tabs li{background:#e0eaef}.kint-rich>dl:not(.kint-trace)>dd>ul.kint-tabs li.kint-active-tab{background:#c1d4df}.kint-rich>dl.kint-trace>dt{background:linear-gradient(to bottom, #c0d4df 0px, #e3ecf0 100%)}.kint-rich .kint-source .kint-highlight{background:#f0eb96} diff --git a/vendor/kint-php/kint/resources/compiled/plain.css b/vendor/kint-php/kint/resources/compiled/plain.css deleted file mode 100644 index ba1eba0..0000000 --- a/vendor/kint-php/kint/resources/compiled/plain.css +++ /dev/null @@ -1 +0,0 @@ -.kint-plain{background:rgba(255,255,255,0.9);white-space:pre;display:block;font-family:monospace;color:#222}.kint-plain i{color:#d00;font-style:normal}.kint-plain u{color:#030;text-decoration:none;font-weight:bold}.kint-plain .kint-microtime-lap{font-weight:bold;text-shadow:1px 0 #fff, 0 1px #fff, -1px 0 #fff, 0 -1px #fff} diff --git a/vendor/kint-php/kint/resources/compiled/plain.js b/vendor/kint-php/kint/resources/compiled/plain.js deleted file mode 100644 index 9791fc9..0000000 --- a/vendor/kint-php/kint/resources/compiled/plain.js +++ /dev/null @@ -1 +0,0 @@ -void 0===window.kintPlain&&(window.kintPlain=function(){"use strict";var i={initLoad:function(){i.style=window.kintShared.dedupe("style.kint-plain-style",i.style),i.script=window.kintShared.dedupe("script.kint-plain-script",i.script)},style:null,script:null};return i}()),window.kintShared.runOnce(window.kintPlain.initLoad); diff --git a/vendor/kint-php/kint/resources/compiled/rich.js b/vendor/kint-php/kint/resources/compiled/rich.js deleted file mode 100644 index 18fb072..0000000 --- a/vendor/kint-php/kint/resources/compiled/rich.js +++ /dev/null @@ -1 +0,0 @@ -void 0===window.kintRich&&(window.kintRich=function(){"use strict";var n={selectText:function(e){var t=window.getSelection(),a=document.createRange();a.selectNodeContents(e),t.removeAllRanges(),t.addRange(a)},each:function(e,t){Array.prototype.slice.call(document.querySelectorAll(e),0).forEach(t)},hasClass:function(e,t){return!!e.classList&&(void 0===t&&(t="kint-show"),e.classList.contains(t))},addClass:function(e,t){void 0===t&&(t="kint-show"),e.classList.add(t)},removeClass:function(e,t){return void 0===t&&(t="kint-show"),e.classList.remove(t),e},toggle:function(e,t){var a=n.getChildren(e);a&&(void 0===t&&(t=n.hasClass(e)),t?n.removeClass(e):n.addClass(e),1===a.childNodes.length&&(a=a.childNodes[0].childNodes[0])&&n.hasClass(a,"kint-parent")&&n.toggle(a,t))},toggleChildren:function(e,t){var a=n.getChildren(e);if(a){var r=a.getElementsByClassName("kint-parent"),o=r.length;for(void 0===t&&(t=!n.hasClass(e));o--;)n.toggle(r[o],t)}},toggleAll:function(e){for(var t=document.getElementsByClassName("kint-parent"),a=t.length,r=!n.hasClass(e.parentNode);a--;)n.toggle(t[a],r)},switchTab:function(e){var t,a=e.previousSibling,r=0;for(n.removeClass(e.parentNode.getElementsByClassName("kint-active-tab")[0],"kint-active-tab"),n.addClass(e,"kint-active-tab");a;)1===a.nodeType&&r++,a=a.previousSibling;t=e.parentNode.nextSibling.childNodes;for(var o=0;o"},openInNewWindow:function(e){var t=window.open();t&&(t.document.open(),t.document.write(n.mktag("html")+n.mktag("head")+n.mktag("title")+"Kint ("+(new Date).toISOString()+")"+n.mktag("/title")+n.mktag('meta charset="utf-8"')+document.getElementsByClassName("kint-rich-script")[0].outerHTML+document.getElementsByClassName("kint-rich-style")[0].outerHTML+n.mktag("/head")+n.mktag("body")+'
'+e.parentNode.outerHTML+"
"+n.mktag("/body")),t.document.close())},sortTable:function(e,a){var t=e.tBodies[0];[].slice.call(e.tBodies[0].rows).sort(function(e,t){if(e=e.cells[a].textContent.trim().toLocaleLowerCase(),t=t.cells[a].textContent.trim().toLocaleLowerCase(),isNaN(e)||isNaN(t)){if(isNaN(e)&&!isNaN(t))return 1;if(isNaN(t)&&!isNaN(e))return-1}else e=parseFloat(e),t=parseFloat(t);return eli:not(.kint-active-tab)",function(e){0===e.offsetWidth&&0===e.offsetHeight||n.keyboardNav.targets.push(e)})},sync:function(e){var t=document.querySelector(".kint-focused");if(t&&n.removeClass(t,"kint-focused"),n.keyboardNav.active){var a=n.keyboardNav.targets[n.keyboardNav.target];n.addClass(a,"kint-focused"),e||n.keyboardNav.scroll(a)}},scroll:function(e){var t=function(e){return e.offsetTop+(e.offsetParent?t(e.offsetParent):0)},a=t(e);if(n.folder){var r=n.folder.querySelector("dd.kint-folder");r.scrollTo(0,a-r.clientHeight/2)}else window.scrollTo(0,a-window.innerHeight/2)},moveCursor:function(e){for(n.keyboardNav.target+=e;n.keyboardNav.target<0;)n.keyboardNav.target+=n.keyboardNav.targets.length;for(;n.keyboardNav.target>=n.keyboardNav.targets.length;)n.keyboardNav.target-=n.keyboardNav.targets.length;n.keyboardNav.sync()},setCursor:function(e){n.keyboardNav.fetchTargets();for(var t=0;tdl dl{padding:0 0 0 15px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMzAgMTUwIj48ZGVmcz48cGF0aCBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNNCAzYTI0IDMyIDAgMCAxIDAgMjQgNDAgMjAtMTAgMCAxIDIzLTEyQTQwIDIwIDEwIDAgMSA0IDN6IiBpZD0iYSIvPjwvZGVmcz48ZyBmaWxsPSIjOTNhMWExIiBzdHJva2U9IiM5M2ExYTEiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxnIGZpbGw9IiM1ODZlNzUiIHN0cm9rZT0iIzU4NmU3NSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzMCkiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxwYXRoIGQ9Ik02IDEyNmwxOCAxOG0tMTggMGwxOC0xOCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9IiM1ODZlNzUiLz48L3N2Zz4=") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #586e75}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#268bd2;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:#2aa198}.kint-rich dfn{font-style:normal;font-family:monospace;color:#93a1a1}.kint-rich pre{color:#839496;margin:0 0 0 15px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #586e75;background:#002b36;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(131,148,150,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#002b36;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#839496;background:#002b36}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #586e75;border-top-width:0;border-bottom-width:0;padding:5px;float:right !important;margin:-5px 0;color:#93a1a1;background:#073642;height:26px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#252525;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#1b1b1b}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#073642;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#839496}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#839496;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#93a1a1;border-bottom:1px dotted #93a1a1}.kint-rich ul{list-style:none;padding-left:15px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #586e75}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 15px;padding-left:0;background:#002b36;border:1px solid #586e75;border-top:0}.kint-rich ul.kint-tabs>li{background:#073642;border:1px solid #586e75;cursor:pointer;display:inline-block;height:30px;margin:3px;padding:0 15px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#268bd2;color:#2aa198}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#002b36;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:25px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#268bd2;color:#2aa198}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #586e75;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#268bd2}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2.5px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #586e75;padding:2.5px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#073642;color:#93a1a1}.kint-rich table td{background:#002b36;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #268bd2 inset}.kint-rich table tr:hover var{color:#2aa198}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:5px;padding-bottom:5px;border-bottom:1px solid #073642}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #268bd2;padding-right:10px;margin-right:10px}.kint-rich pre.kint-source>div.kint-highlight{background:#073642}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #268bd2,0 1px #268bd2,1px 0 #268bd2,0 -1px #268bd2;color:#002b36;font-weight:bold}body{background:#073642;color:#fff}.kint-rich{box-shadow:0 0 5px 3px #073642}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #859900 inset;border-radius:7px}.kint-rich>dl>dt,.kint-rich ul.kint-tabs{box-shadow:4px 0 2px -3px #268bd2 inset}.kint-rich ul.kint-tabs li.kint-active-tab{padding-top:7px;height:34px}.kint-rich footer li{color:#ddd} diff --git a/vendor/kint-php/kint/resources/compiled/solarized.css b/vendor/kint-php/kint/resources/compiled/solarized.css deleted file mode 100644 index db5da0d..0000000 --- a/vendor/kint-php/kint/resources/compiled/solarized.css +++ /dev/null @@ -1 +0,0 @@ -.kint-rich{font-size:13px;overflow-x:auto;white-space:nowrap;background:rgba(255,255,255,0.9)}.kint-rich.kint-folder{position:fixed;bottom:0;left:0;right:0;z-index:999999;width:100%;margin:0;display:none}.kint-rich.kint-folder.kint-show{display:block}.kint-rich.kint-folder dd.kint-folder{max-height:calc(100vh - 100px);padding-right:10px;overflow-y:scroll}.kint-rich::selection,.kint-rich::-moz-selection,.kint-rich::-webkit-selection{background:#268bd2;color:#657b83}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #2aa198}.kint-rich,.kint-rich::before,.kint-rich::after,.kint-rich *,.kint-rich *::before,.kint-rich *::after{box-sizing:border-box;border-radius:0;color:#657b83;float:none !important;font-family:Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;line-height:15px;margin:0;padding:0;text-align:left}.kint-rich{margin:10px 0}.kint-rich dt,.kint-rich dl{width:auto}.kint-rich dt,.kint-rich div.access-path{background:#fdf6e3;border:1px solid #93a1a1;color:#657b83;display:block;font-weight:bold;list-style:none outside none;overflow:auto;padding:5px}.kint-rich dt:hover,.kint-rich div.access-path:hover{border-color:#268bd2}.kint-rich>dl dl{padding:0 0 0 15px}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMzAgMTUwIj48ZGVmcz48cGF0aCBzdHJva2UtbGluZWpvaW49InJvdW5kIiBkPSJNNCAzYTI0IDMyIDAgMCAxIDAgMjQgNDAgMjAtMTAgMCAxIDIzLTEyQTQwIDIwIDEwIDAgMSA0IDN6IiBpZD0iYSIvPjwvZGVmcz48ZyBmaWxsPSIjOTNhMWExIiBzdHJva2U9IiM5M2ExYTEiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxnIGZpbGw9IiM1ODZlNzUiIHN0cm9rZT0iIzU4NmU3NSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzMCkiPjx1c2UgeGxpbms6aHJlZj0iI2EiLz48dXNlIHhsaW5rOmhyZWY9IiNhIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCAtMTUgNDUpIi8+PC9nPjxwYXRoIGQ9Ik02IDEyNmwxOCAxOG0tMTggMGwxOC0xOCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9IiM1ODZlNzUiLz48L3N2Zz4=") no-repeat scroll 0 0/15px 75px transparent;cursor:pointer;display:inline-block;height:15px;width:15px;margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed #93a1a1}.kint-rich dt.kint-parent.kint-show+dd{display:block}.kint-rich var,.kint-rich var a{color:#268bd2;font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:#2aa198}.kint-rich dfn{font-style:normal;font-family:monospace;color:#586e75}.kint-rich pre{color:#657b83;margin:0 0 0 15px;padding:5px;overflow-y:hidden;border-top:0;border:1px solid #93a1a1;background:#fdf6e3;display:block;word-break:normal}.kint-rich .kint-popup-trigger,.kint-rich .kint-access-path-trigger,.kint-rich .kint-search-trigger{background:rgba(101,123,131,0.8);border-radius:3px;height:16px;font-size:16px;margin-left:5px;font-weight:bold;width:16px;text-align:center;float:right !important;cursor:pointer;color:#fdf6e3;position:relative;overflow:hidden;line-height:17.6px}.kint-rich .kint-popup-trigger:hover,.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-search-trigger:hover{color:#657b83;background:#fdf6e3}.kint-rich dt.kint-parent>.kint-popup-trigger{line-height:19.2px}.kint-rich .kint-search-trigger{font-size:20px}.kint-rich input.kint-search{display:none;border:1px solid #93a1a1;border-top-width:0;border-bottom-width:0;padding:5px;float:right !important;margin:-5px 0;color:#586e75;background:#eee8d5;height:26px;width:160px;position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:#e2e2e2;opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:0.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:#f0f0f0}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:#eee8d5;display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:transparent}.kint-rich footer>.kint-popup-trigger{background:transparent;color:#657b83}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:#657b83;text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:#586e75;border-bottom:1px dotted #586e75}.kint-rich ul{list-style:none;padding-left:15px}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed #93a1a1}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 15px;padding-left:0;background:#fdf6e3;border:1px solid #93a1a1;border-top:0}.kint-rich ul.kint-tabs>li{background:#eee8d5;border:1px solid #93a1a1;cursor:pointer;display:inline-block;height:30px;margin:3px;padding:0 15px;vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:#268bd2;color:#2aa198}.kint-rich ul.kint-tabs>li.kint-active-tab{background:#fdf6e3;border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:25px}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul:not(.kint-tabs)>li:not(:first-child){display:none}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:#268bd2;color:#2aa198}.kint-rich dt>.kint-color-preview{width:16px;height:16px;display:inline-block;vertical-align:middle;margin-left:10px;border:1px solid #93a1a1;background-color:#ccc;background-image:url('data:image/svg+xml;utf8,');background-size:100%}.kint-rich dt>.kint-color-preview:hover{border-color:#268bd2}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:2.5px}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:1px solid #93a1a1;padding:2.5px;vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:#eee8d5;color:#586e75}.kint-rich table td{background:#fdf6e3;white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 #268bd2 inset}.kint-rich table tr:hover var{color:#2aa198}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:5px;padding-bottom:5px;border-bottom:1px solid #eee8d5}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid #268bd2;padding-right:10px;margin-right:10px}.kint-rich pre.kint-source>div.kint-highlight{background:#eee8d5}.kint-rich .kint-microtime-lap{text-shadow:-1px 0 #268bd2,0 1px #268bd2,1px 0 #268bd2,0 -1px #268bd2;color:#fdf6e3;font-weight:bold}.kint-rich .kint-focused{box-shadow:0 0 3px 2px #859900 inset;border-radius:7px}.kint-rich>dl>dt,.kint-rich ul.kint-tabs{box-shadow:4px 0 2px -3px #268bd2 inset}.kint-rich ul.kint-tabs li.kint-active-tab{padding-top:7px;height:34px} diff --git a/vendor/kint-php/kint/src/CallFinder.php b/vendor/kint-php/kint/src/CallFinder.php deleted file mode 100644 index e7192a8..0000000 --- a/vendor/kint-php/kint/src/CallFinder.php +++ /dev/null @@ -1,473 +0,0 @@ - true, - T_COMMENT => true, - T_DOC_COMMENT => true, - T_INLINE_HTML => true, - T_OPEN_TAG => true, - T_OPEN_TAG_WITH_ECHO => true, - T_WHITESPACE => true, - ); - - /** - * Things we need to do specially for operator tokens: - * - Refuse to strip spaces around them - * - Wrap the access path in parentheses if there - * are any of these in the final short parameter. - */ - private static $operator = array( - T_AND_EQUAL => true, - T_BOOLEAN_AND => true, - T_BOOLEAN_OR => true, - T_ARRAY_CAST => true, - T_BOOL_CAST => true, - T_CLONE => true, - T_CONCAT_EQUAL => true, - T_DEC => true, - T_DIV_EQUAL => true, - T_DOUBLE_CAST => true, - T_INC => true, - T_INCLUDE => true, - T_INCLUDE_ONCE => true, - T_INSTANCEOF => true, - T_INT_CAST => true, - T_IS_EQUAL => true, - T_IS_GREATER_OR_EQUAL => true, - T_IS_IDENTICAL => true, - T_IS_NOT_EQUAL => true, - T_IS_NOT_IDENTICAL => true, - T_IS_SMALLER_OR_EQUAL => true, - T_LOGICAL_AND => true, - T_LOGICAL_OR => true, - T_LOGICAL_XOR => true, - T_MINUS_EQUAL => true, - T_MOD_EQUAL => true, - T_MUL_EQUAL => true, - T_NEW => true, - T_OBJECT_CAST => true, - T_OR_EQUAL => true, - T_PLUS_EQUAL => true, - T_REQUIRE => true, - T_REQUIRE_ONCE => true, - T_SL => true, - T_SL_EQUAL => true, - T_SR => true, - T_SR_EQUAL => true, - T_STRING_CAST => true, - T_UNSET_CAST => true, - T_XOR_EQUAL => true, - '!' => true, - '%' => true, - '&' => true, - '*' => true, - '+' => true, - '-' => true, - '.' => true, - '/' => true, - ':' => true, - '<' => true, - '=' => true, - '>' => true, - '?' => true, - '^' => true, - '|' => true, - '~' => true, - ); - - private static $strip = array( - '(' => true, - ')' => true, - '[' => true, - ']' => true, - '{' => true, - '}' => true, - T_OBJECT_OPERATOR => true, - T_DOUBLE_COLON => true, - T_NS_SEPARATOR => true, - ); - - public static function getFunctionCalls($source, $line, $function) - { - static $up = array( - '(' => true, - '[' => true, - '{' => true, - T_CURLY_OPEN => true, - T_DOLLAR_OPEN_CURLY_BRACES => true, - ); - static $down = array( - ')' => true, - ']' => true, - '}' => true, - ); - static $modifiers = array( - '!' => true, - '@' => true, - '~' => true, - '+' => true, - '-' => true, - ); - static $identifier = array( - T_DOUBLE_COLON => true, - T_STRING => true, - T_NS_SEPARATOR => true, - ); - - if (KINT_PHP56) { - self::$operator[T_POW] = true; - self::$operator[T_POW_EQUAL] = true; - } - - if (KINT_PHP70) { - self::$operator[T_SPACESHIP] = true; - } - - if (KINT_PHP74) { - self::$operator[T_COALESCE_EQUAL] = true; - } - - $tokens = \token_get_all($source); - $cursor = 1; - $function_calls = array(); - /** @var array Performance optimization preventing backwards loops */ - $prev_tokens = array(null, null, null); - - if (\is_array($function)) { - $class = \explode('\\', $function[0]); - $class = \strtolower(\end($class)); - $function = \strtolower($function[1]); - } else { - $class = null; - $function = \strtolower($function); - } - - // Loop through tokens - foreach ($tokens as $index => $token) { - if (!\is_array($token)) { - continue; - } - - // Count newlines for line number instead of using $token[2] - // since certain situations (String tokens after whitespace) may - // not have the correct line number unless you do this manually - $cursor += \substr_count($token[1], "\n"); - if ($cursor > $line) { - break; - } - - // Store the last real tokens for later - if (isset(self::$ignore[$token[0]])) { - continue; - } - - $prev_tokens = array($prev_tokens[1], $prev_tokens[2], $token); - - // Check if it's the right type to be the function we're looking for - if (T_STRING !== $token[0] || \strtolower($token[1]) !== $function) { - continue; - } - - // Check if it's a function call - $nextReal = self::realTokenIndex($tokens, $index); - if (!isset($nextReal, $tokens[$nextReal]) || '(' !== $tokens[$nextReal]) { - continue; - } - - // Check if it matches the signature - if (null === $class) { - if ($prev_tokens[1] && \in_array($prev_tokens[1][0], array(T_DOUBLE_COLON, T_OBJECT_OPERATOR), true)) { - continue; - } - } else { - if (!$prev_tokens[1] || T_DOUBLE_COLON !== $prev_tokens[1][0]) { - continue; - } - - if (!$prev_tokens[0] || T_STRING !== $prev_tokens[0][0] || \strtolower($prev_tokens[0][1]) !== $class) { - continue; - } - } - - $inner_cursor = $cursor; - $depth = 1; // The depth respective to the function call - $offset = $nextReal + 1; // The start of the function call - $instring = false; // Whether we're in a string or not - $realtokens = false; // Whether the current scope contains anything meaningful or not - $paramrealtokens = false; // Whether the current parameter contains anything meaningful - $params = array(); // All our collected parameters - $shortparam = array(); // The short version of the parameter - $param_start = $offset; // The distance to the start of the parameter - - // Loop through the following tokens until the function call ends - while (isset($tokens[$offset])) { - $token = $tokens[$offset]; - - // Ensure that the $inner_cursor is correct and - // that $token is either a T_ constant or a string - if (\is_array($token)) { - $inner_cursor += \substr_count($token[1], "\n"); - } - - if (!isset(self::$ignore[$token[0]]) && !isset($down[$token[0]])) { - $paramrealtokens = $realtokens = true; - } - - // If it's a token that makes us to up a level, increase the depth - if (isset($up[$token[0]])) { - if (1 === $depth) { - $shortparam[] = $token; - $realtokens = false; - } - - ++$depth; - } elseif (isset($down[$token[0]])) { - --$depth; - - // If this brings us down to the parameter level, and we've had - // real tokens since going up, fill the $shortparam with an ellipsis - if (1 === $depth) { - if ($realtokens) { - $shortparam[] = '...'; - } - $shortparam[] = $token; - } - } elseif ('"' === $token[0]) { - // Strings use the same symbol for up and down, but we can - // only ever be inside one string, so just use a bool for that - if ($instring) { - --$depth; - if (1 === $depth) { - $shortparam[] = '...'; - } - } else { - ++$depth; - } - - $instring = !$instring; - - $shortparam[] = '"'; - } elseif (1 === $depth) { - if (',' === $token[0]) { - $params[] = array( - 'full' => \array_slice($tokens, $param_start, $offset - $param_start), - 'short' => $shortparam, - ); - $shortparam = array(); - $paramrealtokens = false; - $param_start = $offset + 1; - } elseif (T_CONSTANT_ENCAPSED_STRING === $token[0] && \strlen($token[1]) > 2) { - $shortparam[] = $token[1][0].'...'.$token[1][0]; - } else { - $shortparam[] = $token; - } - } - - // Depth has dropped to 0 (So we've hit the closing paren) - if ($depth <= 0) { - if ($paramrealtokens) { - $params[] = array( - 'full' => \array_slice($tokens, $param_start, $offset - $param_start), - 'short' => $shortparam, - ); - } - - break; - } - - ++$offset; - } - - // If we're not passed (or at) the line at the end - // of the function call, we're too early so skip it - if ($inner_cursor < $line) { - continue; - } - - // Format the final output parameters - foreach ($params as &$param) { - $name = self::tokensFormatted($param['short']); - $expression = false; - foreach ($name as $token) { - if (self::tokenIsOperator($token)) { - $expression = true; - break; - } - } - - $param = array( - 'name' => self::tokensToString($name), - 'path' => self::tokensToString(self::tokensTrim($param['full'])), - 'expression' => $expression, - ); - } - - // Get the modifiers - --$index; - - while (isset($tokens[$index])) { - if (!isset(self::$ignore[$tokens[$index][0]]) && !isset($identifier[$tokens[$index][0]])) { - break; - } - - --$index; - } - - $mods = array(); - - while (isset($tokens[$index])) { - if (isset(self::$ignore[$tokens[$index][0]])) { - --$index; - continue; - } - - if (isset($modifiers[$tokens[$index][0]])) { - $mods[] = $tokens[$index]; - --$index; - continue; - } - - break; - } - - $function_calls[] = array( - 'parameters' => $params, - 'modifiers' => $mods, - ); - } - - return $function_calls; - } - - private static function realTokenIndex(array $tokens, $index) - { - ++$index; - - while (isset($tokens[$index])) { - if (!isset(self::$ignore[$tokens[$index][0]])) { - return $index; - } - - ++$index; - } - - return null; - } - - /** - * We need a separate method to check if tokens are operators because we - * occasionally add "..." to short parameter versions. If we simply check - * for `$token[0]` then "..." will incorrectly match the "." operator. - * - * @param array|string $token The token to check - * - * @return bool - */ - private static function tokenIsOperator($token) - { - return '...' !== $token && isset(self::$operator[$token[0]]); - } - - private static function tokensToString(array $tokens) - { - $out = ''; - - foreach ($tokens as $token) { - if (\is_string($token)) { - $out .= $token; - } elseif (\is_array($token)) { - $out .= $token[1]; - } - } - - return $out; - } - - private static function tokensTrim(array $tokens) - { - foreach ($tokens as $index => $token) { - if (isset(self::$ignore[$token[0]])) { - unset($tokens[$index]); - } else { - break; - } - } - - $tokens = \array_reverse($tokens); - - foreach ($tokens as $index => $token) { - if (isset(self::$ignore[$token[0]])) { - unset($tokens[$index]); - } else { - break; - } - } - - return \array_reverse($tokens); - } - - private static function tokensFormatted(array $tokens) - { - $space = false; - - $tokens = self::tokensTrim($tokens); - - $output = array(); - $last = null; - - foreach ($tokens as $index => $token) { - if (isset(self::$ignore[$token[0]])) { - if ($space) { - continue; - } - - $next = $tokens[self::realTokenIndex($tokens, $index)]; - - if (isset(self::$strip[$last[0]]) && !self::tokenIsOperator($next)) { - continue; - } - - if (isset(self::$strip[$next[0]]) && $last && !self::tokenIsOperator($last)) { - continue; - } - - $token = ' '; - $space = true; - } else { - $space = false; - $last = $token; - } - - $output[] = $token; - } - - return $output; - } -} diff --git a/vendor/kint-php/kint/src/Kint.php b/vendor/kint-php/kint/src/Kint.php deleted file mode 100644 index e0ce963..0000000 --- a/vendor/kint-php/kint/src/Kint.php +++ /dev/null @@ -1,756 +0,0 @@ - '', - * app_path() => '', - * config_path() => '', - * database_path() => '', - * public_path() => '', - * resource_path() => '', - * storage_path() => '', - * ]; - * - * Defaults to [$_SERVER['DOCUMENT_ROOT'] => ''] - */ - public static $app_root_dirs = array(); - - /** - * @var int max array/object levels to go deep, if zero no limits are applied - */ - public static $max_depth = 6; - - /** - * @var bool expand all trees by default for rich view - */ - public static $expanded = false; - - /** - * @var bool enable detection when Kint is command line. - * - * Formats output with whitespace only; does not HTML-escape it - */ - public static $cli_detection = true; - - /** - * @var array Kint aliases. Add debug functions in Kint wrappers here to fix modifiers and backtraces - */ - public static $aliases = array( - array('Kint\\Kint', 'dump'), - array('Kint\\Kint', 'trace'), - array('Kint\\Kint', 'dumpArray'), - ); - - /** - * @var array Array of modes to renderer class names - */ - public static $renderers = array( - self::MODE_RICH => 'Kint\\Renderer\\RichRenderer', - self::MODE_PLAIN => 'Kint\\Renderer\\PlainRenderer', - self::MODE_TEXT => 'Kint\\Renderer\\TextRenderer', - self::MODE_CLI => 'Kint\\Renderer\\CliRenderer', - ); - - public static $plugins = array( - 'Kint\\Parser\\ArrayObjectPlugin', - 'Kint\\Parser\\Base64Plugin', - 'Kint\\Parser\\BlacklistPlugin', - 'Kint\\Parser\\ClassMethodsPlugin', - 'Kint\\Parser\\ClassStaticsPlugin', - 'Kint\\Parser\\ClosurePlugin', - 'Kint\\Parser\\ColorPlugin', - 'Kint\\Parser\\DateTimePlugin', - 'Kint\\Parser\\FsPathPlugin', - 'Kint\\Parser\\IteratorPlugin', - 'Kint\\Parser\\JsonPlugin', - 'Kint\\Parser\\MicrotimePlugin', - 'Kint\\Parser\\SimpleXMLElementPlugin', - 'Kint\\Parser\\SplFileInfoPlugin', - 'Kint\\Parser\\SplObjectStoragePlugin', - 'Kint\\Parser\\StreamPlugin', - 'Kint\\Parser\\TablePlugin', - 'Kint\\Parser\\ThrowablePlugin', - 'Kint\\Parser\\TimestampPlugin', - 'Kint\\Parser\\TracePlugin', - 'Kint\\Parser\\XmlPlugin', - ); - - protected static $plugin_pool = array(); - - protected $parser; - protected $renderer; - - public function __construct(Parser $p, Renderer $r) - { - $this->parser = $p; - $this->renderer = $r; - } - - public function setParser(Parser $p) - { - $this->parser = $p; - } - - public function getParser() - { - return $this->parser; - } - - public function setRenderer(Renderer $r) - { - $this->renderer = $r; - } - - public function getRenderer() - { - return $this->renderer; - } - - public function setStatesFromStatics(array $statics) - { - $this->renderer->setStatics($statics); - - $this->parser->setDepthLimit(isset($statics['max_depth']) ? $statics['max_depth'] : false); - $this->parser->clearPlugins(); - - if (!isset($statics['plugins'])) { - return; - } - - $plugins = array(); - - foreach ($statics['plugins'] as $plugin) { - if ($plugin instanceof Plugin) { - $plugins[] = $plugin; - } elseif (\is_string($plugin) && \is_subclass_of($plugin, 'Kint\\Parser\\Plugin')) { - if (!isset(self::$plugin_pool[$plugin])) { - $p = new $plugin(); - self::$plugin_pool[$plugin] = $p; - } - $plugins[] = self::$plugin_pool[$plugin]; - } - } - - $plugins = $this->renderer->filterParserPlugins($plugins); - - foreach ($plugins as $plugin) { - $this->parser->addPlugin($plugin); - } - } - - public function setStatesFromCallInfo(array $info) - { - $this->renderer->setCallInfo($info); - - if (isset($info['modifiers']) && \is_array($info['modifiers']) && \in_array('+', $info['modifiers'], true)) { - $this->parser->setDepthLimit(false); - } - - $this->parser->setCallerClass(isset($info['caller']['class']) ? $info['caller']['class'] : null); - } - - /** - * Renders a list of vars including the pre and post renders. - * - * @param array $vars Data to dump - * @param BasicObject[] $base Base objects - * - * @return string - */ - public function dumpAll(array $vars, array $base) - { - if (\array_keys($vars) !== \array_keys($base)) { - throw new InvalidArgumentException('Kint::dumpAll requires arrays of identical size and keys as arguments'); - } - - $output = $this->renderer->preRender(); - - if ($vars === array()) { - $output .= $this->renderer->renderNothing(); - } - - foreach ($vars as $key => $arg) { - if (!$base[$key] instanceof BasicObject) { - throw new InvalidArgumentException('Kint::dumpAll requires all elements of the second argument to be BasicObject instances'); - } - $output .= $this->dumpVar($arg, $base[$key]); - } - - $output .= $this->renderer->postRender(); - - return $output; - } - - /** - * Dumps and renders a var. - * - * @param mixed $var Data to dump - * @param BasicObject $base Base object - * - * @return string - */ - public function dumpVar(&$var, BasicObject $base) - { - return $this->renderer->render( - $this->parser->parse($var, $base) - ); - } - - /** - * Gets all static settings at once. - * - * @return array Current static settings - */ - public static function getStatics() - { - return array( - 'aliases' => self::$aliases, - 'app_root_dirs' => self::$app_root_dirs, - 'cli_detection' => self::$cli_detection, - 'display_called_from' => self::$display_called_from, - 'enabled_mode' => self::$enabled_mode, - 'expanded' => self::$expanded, - 'file_link_format' => self::$file_link_format, - 'max_depth' => self::$max_depth, - 'mode_default' => self::$mode_default, - 'mode_default_cli' => self::$mode_default_cli, - 'plugins' => self::$plugins, - 'renderers' => self::$renderers, - 'return' => self::$return, - ); - } - - /** - * Creates a Kint instances based on static settings. - * - * Also calls setStatesFromStatics for you - * - * @param array $statics array of statics as returned by getStatics - * - * @return null|\Kint\Kint - */ - public static function createFromStatics(array $statics) - { - $mode = false; - - if (isset($statics['enabled_mode'])) { - $mode = $statics['enabled_mode']; - - if (true === $statics['enabled_mode'] && isset($statics['mode_default'])) { - $mode = $statics['mode_default']; - - if (PHP_SAPI === 'cli' && !empty($statics['cli_detection']) && isset($statics['mode_default_cli'])) { - $mode = $statics['mode_default_cli']; - } - } - } - - if (!$mode) { - return null; - } - - if (!isset($statics['renderers'][$mode])) { - $renderer = new TextRenderer(); - } else { - /** @var Renderer */ - $renderer = new $statics['renderers'][$mode](); - } - - return new self(new Parser(), $renderer); - } - - /** - * Creates base objects given parameter info. - * - * @param array $params Parameters as returned from getCallInfo - * @param int $argc Number of arguments the helper was called with - * - * @return BasicObject[] Base objects for the arguments - */ - public static function getBasesFromParamInfo(array $params, $argc) - { - static $blacklist = array( - 'null', - 'true', - 'false', - 'array(...)', - 'array()', - '[...]', - '[]', - '(...)', - '()', - '"..."', - 'b"..."', - "'...'", - "b'...'", - ); - - $params = \array_values($params); - $bases = array(); - - for ($i = 0; $i < $argc; ++$i) { - if (isset($params[$i])) { - $param = $params[$i]; - } else { - $param = null; - } - - if (!isset($param['name']) || \is_numeric($param['name'])) { - $name = null; - } elseif (\in_array(\strtolower($param['name']), $blacklist, true)) { - $name = null; - } else { - $name = $param['name']; - } - - if (isset($param['path'])) { - $access_path = $param['path']; - - if (!empty($param['expression'])) { - $access_path = '('.$access_path.')'; - } - } else { - $access_path = '$'.$i; - } - - $bases[] = BasicObject::blank($name, $access_path); - } - - return $bases; - } - - /** - * Gets call info from the backtrace, alias, and argument count. - * - * Aliases must be normalized beforehand (Utils::normalizeAliases) - * - * @param array $aliases Call aliases as found in Kint::$aliases - * @param array[] $trace Backtrace - * @param int $argc Number of arguments - * - * @return array{params:null|array, modifiers:array, callee:null|array, caller:null|array, trace:array[]} Call info - */ - public static function getCallInfo(array $aliases, array $trace, $argc) - { - $found = false; - $callee = null; - $caller = null; - $miniTrace = array(); - - foreach ($trace as $index => $frame) { - if (Utils::traceFrameIsListed($frame, $aliases)) { - $found = true; - $miniTrace = array(); - } - - if (!Utils::traceFrameIsListed($frame, array('spl_autoload_call'))) { - $miniTrace[] = $frame; - } - } - - if ($found) { - $callee = \reset($miniTrace) ?: null; - - /** @var null|array Psalm bug workaround */ - $caller = \next($miniTrace) ?: null; - } - - foreach ($miniTrace as $index => $frame) { - if ((0 === $index && $callee === $frame) || isset($frame['file'], $frame['line'])) { - unset($frame['object'], $frame['args']); - $miniTrace[$index] = $frame; - } else { - unset($miniTrace[$index]); - } - } - - $miniTrace = \array_values($miniTrace); - - $call = self::getSingleCall($callee ?: array(), $argc); - - $ret = array( - 'params' => null, - 'modifiers' => array(), - 'callee' => $callee, - 'caller' => $caller, - 'trace' => $miniTrace, - ); - - if ($call) { - $ret['params'] = $call['parameters']; - $ret['modifiers'] = $call['modifiers']; - } - - return $ret; - } - - /** - * Dumps a backtrace. - * - * Functionally equivalent to Kint::dump(1) or Kint::dump(debug_backtrace(true)) - * - * @return int|string - */ - public static function trace() - { - if (!self::$enabled_mode) { - return 0; - } - - Utils::normalizeAliases(self::$aliases); - - $args = \func_get_args(); - - $call_info = self::getCallInfo(self::$aliases, \debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), \count($args)); - - $statics = self::getStatics(); - - if (\in_array('~', $call_info['modifiers'], true)) { - $statics['enabled_mode'] = self::MODE_TEXT; - } - - $kintstance = self::createFromStatics($statics); - if (!$kintstance) { - // Should never happen - return 0; // @codeCoverageIgnore - } - - if (\in_array('-', $call_info['modifiers'], true)) { - while (\ob_get_level()) { - \ob_end_clean(); - } - } - - $kintstance->setStatesFromStatics($statics); - $kintstance->setStatesFromCallInfo($call_info); - - $trimmed_trace = array(); - $trace = \debug_backtrace(true); - - foreach ($trace as $frame) { - if (Utils::traceFrameIsListed($frame, self::$aliases)) { - $trimmed_trace = array(); - } - - $trimmed_trace[] = $frame; - } - - $output = $kintstance->dumpAll( - array($trimmed_trace), - array(BasicObject::blank('Kint\\Kint::trace()', 'debug_backtrace(true)')) - ); - - if (self::$return || \in_array('@', $call_info['modifiers'], true)) { - return $output; - } - - echo $output; - - if (\in_array('-', $call_info['modifiers'], true)) { - \flush(); // @codeCoverageIgnore - } - - return 0; - } - - /** - * Dumps some data. - * - * Functionally equivalent to Kint::dump(1) or Kint::dump(debug_backtrace(true)) - * - * @return int|string - */ - public static function dump() - { - if (!self::$enabled_mode) { - return 0; - } - - Utils::normalizeAliases(self::$aliases); - - $args = \func_get_args(); - - $call_info = self::getCallInfo(self::$aliases, \debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), \count($args)); - - $statics = self::getStatics(); - - if (\in_array('~', $call_info['modifiers'], true)) { - $statics['enabled_mode'] = self::MODE_TEXT; - } - - $kintstance = self::createFromStatics($statics); - if (!$kintstance) { - // Should never happen - return 0; // @codeCoverageIgnore - } - - if (\in_array('-', $call_info['modifiers'], true)) { - while (\ob_get_level()) { - \ob_end_clean(); - } - } - - $kintstance->setStatesFromStatics($statics); - $kintstance->setStatesFromCallInfo($call_info); - - // If the call is Kint::dump(1) then dump a backtrace instead - if ($args === array(1) && (!isset($call_info['params'][0]['name']) || '1' === $call_info['params'][0]['name'])) { - $args = \debug_backtrace(true); - $trace = array(); - - foreach ($args as $index => $frame) { - if (Utils::traceFrameIsListed($frame, self::$aliases)) { - $trace = array(); - } - - $trace[] = $frame; - } - - if (isset($call_info['callee']['function'])) { - $tracename = $call_info['callee']['function'].'(1)'; - if (isset($call_info['callee']['class'], $call_info['callee']['type'])) { - $tracename = $call_info['callee']['class'].$call_info['callee']['type'].$tracename; - } - } else { - $tracename = 'Kint\\Kint::dump(1)'; - } - - $tracebase = BasicObject::blank($tracename, 'debug_backtrace(true)'); - - $output = $kintstance->dumpAll(array($trace), array($tracebase)); - } else { - $bases = self::getBasesFromParamInfo( - isset($call_info['params']) ? $call_info['params'] : array(), - \count($args) - ); - $output = $kintstance->dumpAll($args, $bases); - } - - if (self::$return || \in_array('@', $call_info['modifiers'], true)) { - return $output; - } - - echo $output; - - if (\in_array('-', $call_info['modifiers'], true)) { - \flush(); // @codeCoverageIgnore - } - - return 0; - } - - /** - * generic path display callback, can be configured in app_root_dirs; purpose is - * to show relevant path info and hide as much of the path as possible. - * - * @param string $file - * - * @return string - */ - public static function shortenPath($file) - { - $file = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', $file)), 'strlen')); - - $longest_match = 0; - $match = '/'; - - foreach (self::$app_root_dirs as $path => $alias) { - if (empty($path)) { - continue; - } - - $path = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', $path)), 'strlen')); - - if (\array_slice($file, 0, \count($path)) === $path && \count($path) > $longest_match) { - $longest_match = \count($path); - $match = $alias; - } - } - - if ($longest_match) { - $file = \array_merge(array($match), \array_slice($file, $longest_match)); - - return \implode('/', $file); - } - - // fallback to find common path with Kint dir - $kint = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', KINT_DIR)), 'strlen')); - - foreach ($file as $i => $part) { - if (!isset($kint[$i]) || $kint[$i] !== $part) { - return ($i ? '.../' : '/').\implode('/', \array_slice($file, $i)); - } - } - - return '/'.\implode('/', $file); - } - - public static function getIdeLink($file, $line) - { - return \str_replace(array('%f', '%l'), array($file, $line), self::$file_link_format); - } - - /** - * Returns specific function call info from a stack trace frame, or null if no match could be found. - * - * @param array $frame The stack trace frame in question - * @param int $argc The amount of arguments received - * - * @return null|array{parameters:array, modifiers:array} params and modifiers, or null if a specific call could not be determined - */ - protected static function getSingleCall(array $frame, $argc) - { - if (!isset($frame['file'], $frame['line'], $frame['function']) || !\is_readable($frame['file'])) { - return null; - } - - if (empty($frame['class'])) { - $callfunc = $frame['function']; - } else { - $callfunc = array($frame['class'], $frame['function']); - } - - $calls = CallFinder::getFunctionCalls( - \file_get_contents($frame['file']), - $frame['line'], - $callfunc - ); - - $return = null; - - foreach ($calls as $call) { - $is_unpack = false; - - // Handle argument unpacking as a last resort - if (KINT_PHP56) { - foreach ($call['parameters'] as $i => &$param) { - if (0 === \strpos($param['name'], '...')) { - if ($i < $argc && $i === \count($call['parameters']) - 1) { - for ($j = 1; $j + $i < $argc; ++$j) { - $call['parameters'][] = array( - 'name' => 'array_values('.\substr($param['name'], 3).')['.$j.']', - 'path' => 'array_values('.\substr($param['path'], 3).')['.$j.']', - 'expression' => false, - ); - } - - $param['name'] = 'reset('.\substr($param['name'], 3).')'; - $param['path'] = 'reset('.\substr($param['path'], 3).')'; - $param['expression'] = false; - } else { - $call['parameters'] = \array_slice($call['parameters'], 0, $i); - } - - $is_unpack = true; - break; - } - - if ($i >= $argc) { - continue 2; - } - } - } - - if ($is_unpack || \count($call['parameters']) === $argc) { - if (null === $return) { - $return = $call; - } else { - // If we have multiple calls on the same line with the same amount of arguments, - // we can't be sure which it is so just return null and let them figure it out - return null; - } - } - } - - return $return; - } -} diff --git a/vendor/kint-php/kint/src/Object/BasicObject.php b/vendor/kint-php/kint/src/Object/BasicObject.php deleted file mode 100644 index d69347e..0000000 --- a/vendor/kint-php/kint/src/Object/BasicObject.php +++ /dev/null @@ -1,248 +0,0 @@ -representations[$rep->getName()])) { - return false; - } - - if (null === $pos) { - $this->representations[$rep->getName()] = $rep; - } else { - $this->representations = \array_merge( - \array_slice($this->representations, 0, $pos), - array($rep->getName() => $rep), - \array_slice($this->representations, $pos) - ); - } - - return true; - } - - public function replaceRepresentation(Representation $rep, $pos = null) - { - if (null === $pos) { - $this->representations[$rep->getName()] = $rep; - } else { - $this->removeRepresentation($rep); - $this->addRepresentation($rep, $pos); - } - } - - public function removeRepresentation($rep) - { - if ($rep instanceof Representation) { - unset($this->representations[$rep->getName()]); - } elseif (\is_string($rep)) { - unset($this->representations[$rep]); - } - } - - public function getRepresentation($name) - { - if (isset($this->representations[$name])) { - return $this->representations[$name]; - } - } - - public function getRepresentations() - { - return $this->representations; - } - - public function clearRepresentations() - { - $this->representations = array(); - } - - public function getType() - { - return $this->type; - } - - public function getModifiers() - { - $out = $this->getAccess(); - - if ($this->const) { - $out .= ' const'; - } - - if ($this->static) { - $out .= ' static'; - } - - if (\strlen($out)) { - return \ltrim($out); - } - } - - public function getAccess() - { - switch ($this->access) { - case self::ACCESS_PRIVATE: - return 'private'; - case self::ACCESS_PROTECTED: - return 'protected'; - case self::ACCESS_PUBLIC: - return 'public'; - } - } - - public function getName() - { - return $this->name; - } - - public function getOperator() - { - switch ($this->operator) { - case self::OPERATOR_ARRAY: - return '=>'; - case self::OPERATOR_OBJECT: - return '->'; - case self::OPERATOR_STATIC: - return '::'; - } - } - - public function getSize() - { - return $this->size; - } - - public function getValueShort() - { - if ($rep = $this->value) { - if ('boolean' === $this->type) { - return $rep->contents ? 'true' : 'false'; - } - - if ('integer' === $this->type || 'double' === $this->type) { - return $rep->contents; - } - } - } - - public function getAccessPath() - { - return $this->access_path; - } - - public function transplant(BasicObject $old) - { - $this->name = $old->name; - $this->size = $old->size; - $this->access_path = $old->access_path; - $this->access = $old->access; - $this->static = $old->static; - $this->const = $old->const; - $this->type = $old->type; - $this->depth = $old->depth; - $this->owner_class = $old->owner_class; - $this->operator = $old->operator; - $this->reference = $old->reference; - $this->value = $old->value; - $this->representations += $old->representations; - $this->hints = \array_merge($this->hints, $old->hints); - } - - /** - * Creates a new basic object with a name and access path. - * - * @param null|string $name - * @param null|string $access_path - * - * @return \Kint\Object\BasicObject - */ - public static function blank($name = null, $access_path = null) - { - $o = new self(); - $o->name = $name; - $o->access_path = $access_path; - - return $o; - } - - public static function sortByAccess(BasicObject $a, BasicObject $b) - { - static $sorts = array( - self::ACCESS_PUBLIC => 1, - self::ACCESS_PROTECTED => 2, - self::ACCESS_PRIVATE => 3, - self::ACCESS_NONE => 4, - ); - - return $sorts[$a->access] - $sorts[$b->access]; - } - - public static function sortByName(BasicObject $a, BasicObject $b) - { - $ret = \strnatcasecmp($a->name, $b->name); - - if (0 === $ret) { - return (int) \is_int($b->name) - (int) \is_int($a->name); - } - - return $ret; - } -} diff --git a/vendor/kint-php/kint/src/Object/BlobObject.php b/vendor/kint-php/kint/src/Object/BlobObject.php deleted file mode 100644 index 66d508f..0000000 --- a/vendor/kint-php/kint/src/Object/BlobObject.php +++ /dev/null @@ -1,177 +0,0 @@ -encoding) { - return 'binary '.$this->type; - } - - if ('ASCII' === $this->encoding) { - return $this->type; - } - - return $this->encoding.' '.$this->type; - } - - public function getValueShort() - { - if ($rep = $this->value) { - return '"'.$rep->contents.'"'; - } - } - - public function transplant(BasicObject $old) - { - parent::transplant($old); - - if ($old instanceof self) { - $this->encoding = $old->encoding; - } - } - - public static function strlen($string, $encoding = false) - { - if (\function_exists('mb_strlen')) { - if (false === $encoding) { - $encoding = self::detectEncoding($string); - } - - if ($encoding && 'ASCII' !== $encoding) { - return \mb_strlen($string, $encoding); - } - } - - return \strlen($string); - } - - public static function substr($string, $start, $length = null, $encoding = false) - { - if (\function_exists('mb_substr')) { - if (false === $encoding) { - $encoding = self::detectEncoding($string); - } - - if ($encoding && 'ASCII' !== $encoding) { - return \mb_substr($string, $start, $length, $encoding); - } - } - - // Special case for substr/mb_substr discrepancy - if ('' === $string) { - return ''; - } - - return \substr($string, $start, isset($length) ? $length : PHP_INT_MAX); - } - - public static function detectEncoding($string) - { - if (\function_exists('mb_detect_encoding')) { - if ($ret = \mb_detect_encoding($string, self::$char_encodings, true)) { - return $ret; - } - } - - // Pretty much every character encoding uses first 32 bytes as control - // characters. If it's not a multi-byte format it's safe to say matching - // any control character besides tab, nl, and cr means it's binary. - if (\preg_match('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/', $string)) { - return false; - } - - if (\function_exists('iconv')) { - foreach (self::$legacy_encodings as $encoding) { - if (@\iconv($encoding, $encoding, $string) === $string) { - return $encoding; - } - } - } elseif (!\function_exists('mb_detect_encoding')) { // @codeCoverageIgnore - // If a user has neither mb_detect_encoding, nor iconv, nor the - // polyfills, there's not much we can do about it... - // Pretend it's ASCII and pray the browser renders it properly. - return 'ASCII'; // @codeCoverageIgnore - } - - return false; - } -} diff --git a/vendor/kint-php/kint/src/Object/ClosureObject.php b/vendor/kint-php/kint/src/Object/ClosureObject.php deleted file mode 100644 index 344eceb..0000000 --- a/vendor/kint-php/kint/src/Object/ClosureObject.php +++ /dev/null @@ -1,68 +0,0 @@ -access_path) { - return parent::getAccessPath().'('.$this->getParams().')'; - } - } - - public function getSize() - { - } - - public function getParams() - { - if (null !== $this->paramcache) { - return $this->paramcache; - } - - $out = array(); - - foreach ($this->parameters as $p) { - $type = $p->getType(); - - $ref = $p->reference ? '&' : ''; - - if ($type) { - $out[] = $type.' '.$ref.$p->getName(); - } else { - $out[] = $ref.$p->getName(); - } - } - - return $this->paramcache = \implode(', ', $out); - } -} diff --git a/vendor/kint-php/kint/src/Object/DateTimeObject.php b/vendor/kint-php/kint/src/Object/DateTimeObject.php deleted file mode 100644 index f8b1b3f..0000000 --- a/vendor/kint-php/kint/src/Object/DateTimeObject.php +++ /dev/null @@ -1,53 +0,0 @@ -dt = clone $dt; - } - - public function getValueShort() - { - $stamp = $this->dt->format('Y-m-d H:i:s'); - if ((int) ($micro = $this->dt->format('u'))) { - $stamp .= '.'.$micro; - } - $stamp .= $this->dt->format('P T'); - - return $stamp; - } -} diff --git a/vendor/kint-php/kint/src/Object/InstanceObject.php b/vendor/kint-php/kint/src/Object/InstanceObject.php deleted file mode 100644 index 943b33d..0000000 --- a/vendor/kint-php/kint/src/Object/InstanceObject.php +++ /dev/null @@ -1,78 +0,0 @@ -classname; - } - - public function transplant(BasicObject $old) - { - parent::transplant($old); - - if ($old instanceof self) { - $this->classname = $old->classname; - $this->hash = $old->hash; - $this->filename = $old->filename; - $this->startline = $old->startline; - } - } - - public static function sortByHierarchy($a, $b) - { - if (\is_string($a) && \is_string($b)) { - $aclass = $a; - $bclass = $b; - } elseif (!($a instanceof BasicObject) || !($b instanceof BasicObject)) { - return 0; - } elseif ($a instanceof self && $b instanceof self) { - $aclass = $a->classname; - $bclass = $b->classname; - } else { - return 0; - } - - if (\is_subclass_of($aclass, $bclass)) { - return -1; - } - - if (\is_subclass_of($bclass, $aclass)) { - return 1; - } - - return 0; - } -} diff --git a/vendor/kint-php/kint/src/Object/MethodObject.php b/vendor/kint-php/kint/src/Object/MethodObject.php deleted file mode 100644 index 78d49de..0000000 --- a/vendor/kint-php/kint/src/Object/MethodObject.php +++ /dev/null @@ -1,253 +0,0 @@ -name = $method->getName(); - $this->filename = $method->getFileName(); - $this->startline = $method->getStartLine(); - $this->endline = $method->getEndLine(); - $this->internal = $method->isInternal(); - $this->docstring = $method->getDocComment(); - $this->return_reference = $method->returnsReference(); - - foreach ($method->getParameters() as $param) { - $this->parameters[] = new ParameterObject($param); - } - - if (KINT_PHP70) { - $this->returntype = $method->getReturnType(); - if ($this->returntype) { - $this->returntype = Utils::getTypeString($this->returntype); - } - } - - if ($method instanceof ReflectionMethod) { - $this->static = $method->isStatic(); - $this->operator = $this->static ? BasicObject::OPERATOR_STATIC : BasicObject::OPERATOR_OBJECT; - $this->abstract = $method->isAbstract(); - $this->final = $method->isFinal(); - $this->owner_class = $method->getDeclaringClass()->name; - $this->access = BasicObject::ACCESS_PUBLIC; - if ($method->isProtected()) { - $this->access = BasicObject::ACCESS_PROTECTED; - } elseif ($method->isPrivate()) { - $this->access = BasicObject::ACCESS_PRIVATE; - } - } - - if ($this->internal) { - return; - } - - $docstring = new DocstringRepresentation( - $this->docstring, - $this->filename, - $this->startline - ); - - $docstring->implicit_label = true; - $this->addRepresentation($docstring); - $this->value = $docstring; - } - - public function setAccessPathFrom(InstanceObject $parent) - { - static $magic = array( - '__call' => true, - '__callstatic' => true, - '__clone' => true, - '__construct' => true, - '__debuginfo' => true, - '__destruct' => true, - '__get' => true, - '__invoke' => true, - '__isset' => true, - '__set' => true, - '__set_state' => true, - '__sleep' => true, - '__tostring' => true, - '__unset' => true, - '__wakeup' => true, - ); - - $name = \strtolower($this->name); - - if ('__construct' === $name) { - $this->access_path = 'new \\'.$parent->getType(); - } elseif ('__invoke' === $name) { - $this->access_path = $parent->access_path; - } elseif ('__clone' === $name) { - $this->access_path = 'clone '.$parent->access_path; - $this->showparams = false; - } elseif ('__tostring' === $name) { - $this->access_path = '(string) '.$parent->access_path; - $this->showparams = false; - } elseif (isset($magic[$name])) { - $this->access_path = null; - } elseif ($this->static) { - $this->access_path = '\\'.$this->owner_class.'::'.$this->name; - } else { - $this->access_path = $parent->access_path.'->'.$this->name; - } - } - - public function getValueShort() - { - if (!$this->value || !($this->value instanceof DocstringRepresentation)) { - return parent::getValueShort(); - } - - $ds = $this->value->getDocstringWithoutComments(); - - if (!$ds) { - return null; - } - - $ds = \explode("\n", $ds); - - $out = ''; - - foreach ($ds as $line) { - if (0 === \strlen(\trim($line)) || '@' === $line[0]) { - break; - } - - $out .= $line.' '; - } - - if (\strlen($out)) { - return \rtrim($out); - } - } - - public function getModifiers() - { - $mods = array( - $this->abstract ? 'abstract' : null, - $this->final ? 'final' : null, - $this->getAccess(), - $this->static ? 'static' : null, - ); - - $out = ''; - - foreach ($mods as $word) { - if (null !== $word) { - $out .= $word.' '; - } - } - - if (\strlen($out)) { - return \rtrim($out); - } - } - - public function getAccessPath() - { - if (null !== $this->access_path) { - if ($this->showparams) { - return parent::getAccessPath().'('.$this->getParams().')'; - } - - return parent::getAccessPath(); - } - } - - public function getParams() - { - if (null !== $this->paramcache) { - return $this->paramcache; - } - - $out = array(); - - foreach ($this->parameters as $p) { - $type = $p->getType(); - if ($type) { - $type .= ' '; - } - - $default = $p->getDefault(); - if ($default) { - $default = ' = '.$default; - } - - $ref = $p->reference ? '&' : ''; - - $out[] = $type.$ref.$p->getName().$default; - } - - return $this->paramcache = \implode(', ', $out); - } - - public function getPhpDocUrl() - { - if (!$this->internal) { - return null; - } - - if ($this->owner_class) { - $class = \strtolower($this->owner_class); - } else { - $class = 'function'; - } - - $funcname = \str_replace('_', '-', \strtolower($this->name)); - - if (0 === \strpos($funcname, '--') && 0 !== \strpos($funcname, '-', 2)) { - $funcname = \substr($funcname, 2); - } - - return 'https://secure.php.net/'.$class.'.'.$funcname; - } -} diff --git a/vendor/kint-php/kint/src/Object/ParameterObject.php b/vendor/kint-php/kint/src/Object/ParameterObject.php deleted file mode 100644 index 4bed551..0000000 --- a/vendor/kint-php/kint/src/Object/ParameterObject.php +++ /dev/null @@ -1,100 +0,0 @@ -getType()) { - $this->type_hint = Utils::getTypeString($type); - } - } else { - if ($param->isArray()) { - $this->type_hint = 'array'; - } else { - try { - if ($this->type_hint = $param->getClass()) { - $this->type_hint = $this->type_hint->name; - } - } catch (ReflectionException $e) { - \preg_match('/\\[\\s\\<\\w+?>\\s([\\w]+)/s', $param->__toString(), $matches); - $this->type_hint = isset($matches[1]) ? $matches[1] : ''; - } - } - } - - $this->reference = $param->isPassedByReference(); - $this->name = $param->getName(); - $this->position = $param->getPosition(); - - if ($param->isDefaultValueAvailable()) { - /** @var mixed Psalm bug workaround */ - $default = $param->getDefaultValue(); - switch (\gettype($default)) { - case 'NULL': - $this->default = 'null'; - break; - case 'boolean': - $this->default = $default ? 'true' : 'false'; - break; - case 'array': - $this->default = \count($default) ? 'array(...)' : 'array()'; - break; - default: - $this->default = \var_export($default, true); - break; - } - } - } - - public function getType() - { - return $this->type_hint; - } - - public function getName() - { - return '$'.$this->name; - } - - public function getDefault() - { - return $this->default; - } -} diff --git a/vendor/kint-php/kint/src/Object/Representation/ColorRepresentation.php b/vendor/kint-php/kint/src/Object/Representation/ColorRepresentation.php deleted file mode 100644 index d6a072f..0000000 --- a/vendor/kint-php/kint/src/Object/Representation/ColorRepresentation.php +++ /dev/null @@ -1,576 +0,0 @@ - 'f0f8ff', - 'antiquewhite' => 'faebd7', - 'aqua' => '00ffff', - 'aquamarine' => '7fffd4', - 'azure' => 'f0ffff', - 'beige' => 'f5f5dc', - 'bisque' => 'ffe4c4', - 'black' => '000000', - 'blanchedalmond' => 'ffebcd', - 'blue' => '0000ff', - 'blueviolet' => '8a2be2', - 'brown' => 'a52a2a', - 'burlywood' => 'deb887', - 'cadetblue' => '5f9ea0', - 'chartreuse' => '7fff00', - 'chocolate' => 'd2691e', - 'coral' => 'ff7f50', - 'cornflowerblue' => '6495ed', - 'cornsilk' => 'fff8dc', - 'crimson' => 'dc143c', - 'cyan' => '00ffff', - 'darkblue' => '00008b', - 'darkcyan' => '008b8b', - 'darkgoldenrod' => 'b8860b', - 'darkgray' => 'a9a9a9', - 'darkgreen' => '006400', - 'darkgrey' => 'a9a9a9', - 'darkkhaki' => 'bdb76b', - 'darkmagenta' => '8b008b', - 'darkolivegreen' => '556b2f', - 'darkorange' => 'ff8c00', - 'darkorchid' => '9932cc', - 'darkred' => '8b0000', - 'darksalmon' => 'e9967a', - 'darkseagreen' => '8fbc8f', - 'darkslateblue' => '483d8b', - 'darkslategray' => '2f4f4f', - 'darkslategrey' => '2f4f4f', - 'darkturquoise' => '00ced1', - 'darkviolet' => '9400d3', - 'deeppink' => 'ff1493', - 'deepskyblue' => '00bfff', - 'dimgray' => '696969', - 'dimgrey' => '696969', - 'dodgerblue' => '1e90ff', - 'firebrick' => 'b22222', - 'floralwhite' => 'fffaf0', - 'forestgreen' => '228b22', - 'fuchsia' => 'ff00ff', - 'gainsboro' => 'dcdcdc', - 'ghostwhite' => 'f8f8ff', - 'gold' => 'ffd700', - 'goldenrod' => 'daa520', - 'gray' => '808080', - 'green' => '008000', - 'greenyellow' => 'adff2f', - 'grey' => '808080', - 'honeydew' => 'f0fff0', - 'hotpink' => 'ff69b4', - 'indianred' => 'cd5c5c', - 'indigo' => '4b0082', - 'ivory' => 'fffff0', - 'khaki' => 'f0e68c', - 'lavender' => 'e6e6fa', - 'lavenderblush' => 'fff0f5', - 'lawngreen' => '7cfc00', - 'lemonchiffon' => 'fffacd', - 'lightblue' => 'add8e6', - 'lightcoral' => 'f08080', - 'lightcyan' => 'e0ffff', - 'lightgoldenrodyellow' => 'fafad2', - 'lightgray' => 'd3d3d3', - 'lightgreen' => '90ee90', - 'lightgrey' => 'd3d3d3', - 'lightpink' => 'ffb6c1', - 'lightsalmon' => 'ffa07a', - 'lightseagreen' => '20b2aa', - 'lightskyblue' => '87cefa', - 'lightslategray' => '778899', - 'lightslategrey' => '778899', - 'lightsteelblue' => 'b0c4de', - 'lightyellow' => 'ffffe0', - 'lime' => '00ff00', - 'limegreen' => '32cd32', - 'linen' => 'faf0e6', - 'magenta' => 'ff00ff', - 'maroon' => '800000', - 'mediumaquamarine' => '66cdaa', - 'mediumblue' => '0000cd', - 'mediumorchid' => 'ba55d3', - 'mediumpurple' => '9370db', - 'mediumseagreen' => '3cb371', - 'mediumslateblue' => '7b68ee', - 'mediumspringgreen' => '00fa9a', - 'mediumturquoise' => '48d1cc', - 'mediumvioletred' => 'c71585', - 'midnightblue' => '191970', - 'mintcream' => 'f5fffa', - 'mistyrose' => 'ffe4e1', - 'moccasin' => 'ffe4b5', - 'navajowhite' => 'ffdead', - 'navy' => '000080', - 'oldlace' => 'fdf5e6', - 'olive' => '808000', - 'olivedrab' => '6b8e23', - 'orange' => 'ffa500', - 'orangered' => 'ff4500', - 'orchid' => 'da70d6', - 'palegoldenrod' => 'eee8aa', - 'palegreen' => '98fb98', - 'paleturquoise' => 'afeeee', - 'palevioletred' => 'db7093', - 'papayawhip' => 'ffefd5', - 'peachpuff' => 'ffdab9', - 'peru' => 'cd853f', - 'pink' => 'ffc0cb', - 'plum' => 'dda0dd', - 'powderblue' => 'b0e0e6', - 'purple' => '800080', - 'rebeccapurple' => '663399', - 'red' => 'ff0000', - 'rosybrown' => 'bc8f8f', - 'royalblue' => '4169e1', - 'saddlebrown' => '8b4513', - 'salmon' => 'fa8072', - 'sandybrown' => 'f4a460', - 'seagreen' => '2e8b57', - 'seashell' => 'fff5ee', - 'sienna' => 'a0522d', - 'silver' => 'c0c0c0', - 'skyblue' => '87ceeb', - 'slateblue' => '6a5acd', - 'slategray' => '708090', - 'slategrey' => '708090', - 'snow' => 'fffafa', - 'springgreen' => '00ff7f', - 'steelblue' => '4682b4', - 'tan' => 'd2b48c', - 'teal' => '008080', - 'thistle' => 'd8bfd8', - 'tomato' => 'ff6347', - // To quote MDN: - // "Technically, transparent is a shortcut for rgba(0,0,0,0)." - 'transparent' => '00000000', - 'turquoise' => '40e0d0', - 'violet' => 'ee82ee', - 'wheat' => 'f5deb3', - 'white' => 'ffffff', - 'whitesmoke' => 'f5f5f5', - 'yellow' => 'ffff00', - 'yellowgreen' => '9acd32', - ); - - public $r = 0; - public $g = 0; - public $b = 0; - public $a = 1.0; - public $variant; - public $implicit_label = true; - public $hints = array('color'); - - public function __construct($value) - { - parent::__construct('Color'); - - $this->contents = $value; - $this->setValues($value); - } - - public function getColor($variant = null) - { - if (!$variant) { - $variant = $this->variant; - } - - switch ($variant) { - case self::COLOR_NAME: - $hex = \sprintf('%02x%02x%02x', $this->r, $this->g, $this->b); - $hex_alpha = \sprintf('%02x%02x%02x%02x', $this->r, $this->g, $this->b, \round($this->a * 0xFF)); - - return \array_search($hex, self::$color_map, true) ?: \array_search($hex_alpha, self::$color_map, true); - case self::COLOR_HEX_3: - if (0 === $this->r % 0x11 && 0 === $this->g % 0x11 && 0 === $this->b % 0x11) { - return \sprintf( - '#%1X%1X%1X', - \round($this->r / 0x11), - \round($this->g / 0x11), - \round($this->b / 0x11) - ); - } - - return false; - case self::COLOR_HEX_6: - return \sprintf('#%02X%02X%02X', $this->r, $this->g, $this->b); - case self::COLOR_RGB: - if (1.0 === $this->a) { - return \sprintf('rgb(%d, %d, %d)', $this->r, $this->g, $this->b); - } - - return \sprintf('rgb(%d, %d, %d, %s)', $this->r, $this->g, $this->b, \round($this->a, 4)); - case self::COLOR_RGBA: - return \sprintf('rgba(%d, %d, %d, %s)', $this->r, $this->g, $this->b, \round($this->a, 4)); - case self::COLOR_HSL: - $val = self::rgbToHsl($this->r, $this->g, $this->b); - if (1.0 === $this->a) { - return \vsprintf('hsl(%d, %d%%, %d%%)', $val); - } - - return \sprintf('hsl(%d, %d%%, %d%%, %s)', $val[0], $val[1], $val[2], \round($this->a, 4)); - case self::COLOR_HSLA: - $val = self::rgbToHsl($this->r, $this->g, $this->b); - - return \sprintf('hsla(%d, %d%%, %d%%, %s)', $val[0], $val[1], $val[2], \round($this->a, 4)); - case self::COLOR_HEX_4: - if (0 === $this->r % 0x11 && 0 === $this->g % 0x11 && 0 === $this->b % 0x11 && 0 === ($this->a * 255) % 0x11) { - return \sprintf( - '#%1X%1X%1X%1X', - \round($this->r / 0x11), - \round($this->g / 0x11), - \round($this->b / 0x11), - \round($this->a * 0xF) - ); - } - - return false; - - case self::COLOR_HEX_8: - return \sprintf('#%02X%02X%02X%02X', $this->r, $this->g, $this->b, \round($this->a * 0xFF)); - } - - return false; - } - - public function hasAlpha($variant = null) - { - if (null === $variant) { - $variant = $this->variant; - } - - switch ($variant) { - case self::COLOR_NAME: - case self::COLOR_RGB: - case self::COLOR_HSL: - return \abs($this->a - 1) >= 0.0001; - case self::COLOR_RGBA: - case self::COLOR_HSLA: - case self::COLOR_HEX_4: - case self::COLOR_HEX_8: - return true; - default: - return false; - } - } - - protected function setValues($value) - { - $value = \strtolower(\trim($value)); - // Find out which variant of color input it is - if (isset(self::$color_map[$value])) { - if (!$this->setValuesFromHex(self::$color_map[$value])) { - return; - } - - $variant = self::COLOR_NAME; - } elseif ('#' === $value[0]) { - $variant = $this->setValuesFromHex(\substr($value, 1)); - - if (!$variant) { - return; - } - } else { - $variant = $this->setValuesFromFunction($value); - - if (!$variant) { - return; - } - } - - // If something has gone horribly wrong - if ($this->r > 0xFF || $this->g > 0xFF || $this->b > 0xFF || $this->a > 1) { - $this->variant = null; // @codeCoverageIgnore - } else { - $this->variant = $variant; - $this->r = (int) $this->r; - $this->g = (int) $this->g; - $this->b = (int) $this->b; - $this->a = (float) $this->a; - } - } - - protected function setValuesFromHex($hex) - { - if (!\ctype_xdigit($hex)) { - return null; - } - - switch (\strlen($hex)) { - case 3: - $variant = self::COLOR_HEX_3; - break; - case 6: - $variant = self::COLOR_HEX_6; - break; - case 4: - $variant = self::COLOR_HEX_4; - break; - case 8: - $variant = self::COLOR_HEX_8; - break; - default: - return null; - } - - switch ($variant) { - case self::COLOR_HEX_4: - $this->a = \hexdec($hex[3]) / 0xF; - // no break - case self::COLOR_HEX_3: - $this->r = \hexdec($hex[0]) * 0x11; - $this->g = \hexdec($hex[1]) * 0x11; - $this->b = \hexdec($hex[2]) * 0x11; - break; - case self::COLOR_HEX_8: - $this->a = \hexdec(\substr($hex, 6, 2)) / 0xFF; - // no break - case self::COLOR_HEX_6: - $hex = \str_split($hex, 2); - $this->r = \hexdec($hex[0]); - $this->g = \hexdec($hex[1]); - $this->b = \hexdec($hex[2]); - break; - } - - return $variant; - } - - protected function setValuesFromFunction($value) - { - if (!\preg_match('/^((?:rgb|hsl)a?)\\s*\\(([0-9\\.%,\\s\\/\\-]+)\\)$/i', $value, $match)) { - return null; - } - - switch (\strtolower($match[1])) { - case 'rgb': - $variant = self::COLOR_RGB; - break; - case 'rgba': - $variant = self::COLOR_RGBA; - break; - case 'hsl': - $variant = self::COLOR_HSL; - break; - case 'hsla': - $variant = self::COLOR_HSLA; - break; - default: - return null; // @codeCoverageIgnore - } - - $params = \preg_replace('/[,\\s\\/]+/', ',', \trim($match[2])); - $params = \explode(',', $params); - $params = \array_map('trim', $params); - - if (\count($params) < 3 || \count($params) > 4) { - return null; - } - - foreach ($params as $i => &$color) { - if (false !== \strpos($color, '%')) { - $color = (float) \str_replace('%', '', $color); - - if (3 === $i) { - $color = $color / 100; - } elseif (\in_array($variant, array(self::COLOR_RGB, self::COLOR_RGBA), true)) { - $color = \round($color / 100 * 0xFF); - } - } - - $color = (float) $color; - - if (0 === $i && \in_array($variant, array(self::COLOR_HSL, self::COLOR_HSLA), true)) { - $color = ($color % 360 + 360) % 360; - } - } - - /** @var float[] Psalm bug workaround */ - $params = \array_map('floatval', $params); - - switch ($variant) { - case self::COLOR_RGBA: - case self::COLOR_RGB: - if (\min($params) < 0 || \max($params) > 0xFF) { - return null; - } - break; - case self::COLOR_HSLA: - case self::COLOR_HSL: - if (\min($params) < 0 || $params[0] > 360 || \max($params[1], $params[2]) > 100) { - return null; - } - break; - } - - if (4 === \count($params)) { - if ($params[3] > 1) { - return null; - } - - $this->a = $params[3]; - } - - if (self::COLOR_HSLA === $variant || self::COLOR_HSL === $variant) { - $params = self::hslToRgb($params[0], $params[1], $params[2]); - } - - list($this->r, $this->g, $this->b) = $params; - - return $variant; - } - - /** - * Turns HSL color to RGB. Black magic. - * - * @param float $h Hue - * @param float $s Saturation - * @param float $l Lightness - * - * @return int[] RGB array - */ - public static function hslToRgb($h, $s, $l) - { - if (\min($h, $s, $l) < 0) { - throw new InvalidArgumentException('The parameters for hslToRgb should be no less than 0'); - } - - if ($h > 360 || \max($s, $l) > 100) { - throw new InvalidArgumentException('The parameters for hslToRgb should be no more than 360, 100, and 100 respectively'); - } - - $h /= 360; - $s /= 100; - $l /= 100; - - $m2 = ($l <= 0.5) ? $l * ($s + 1) : $l + $s - $l * $s; - $m1 = $l * 2 - $m2; - - return array( - (int) \round(self::hueToRgb($m1, $m2, $h + 1 / 3) * 0xFF), - (int) \round(self::hueToRgb($m1, $m2, $h) * 0xFF), - (int) \round(self::hueToRgb($m1, $m2, $h - 1 / 3) * 0xFF), - ); - } - - /** - * Converts RGB to HSL. Color inversion of previous black magic is white magic? - * - * @param float|int $red Red - * @param float|int $green Green - * @param float|int $blue Blue - * - * @return float[] HSL array - */ - public static function rgbToHsl($red, $green, $blue) - { - if (\min($red, $green, $blue) < 0) { - throw new InvalidArgumentException('The parameters for rgbToHsl should be no less than 0'); - } - - if (\max($red, $green, $blue) > 0xFF) { - throw new InvalidArgumentException('The parameters for rgbToHsl should be no more than 255'); - } - - $clrMin = \min($red, $green, $blue); - $clrMax = \max($red, $green, $blue); - $deltaMax = $clrMax - $clrMin; - - $L = ($clrMax + $clrMin) / 510; - - if (0 == $deltaMax) { - $H = 0; - $S = 0; - } else { - if (0.5 > $L) { - $S = $deltaMax / ($clrMax + $clrMin); - } else { - $S = $deltaMax / (510 - $clrMax - $clrMin); - } - - if ($clrMax === $red) { - $H = ($green - $blue) / (6.0 * $deltaMax); - - if (0 > $H) { - $H += 1.0; - } - } elseif ($clrMax === $green) { - $H = 1 / 3 + ($blue - $red) / (6.0 * $deltaMax); - } else { - $H = 2 / 3 + ($red - $green) / (6.0 * $deltaMax); - } - } - - return array( - (float) ($H * 360 % 360), - (float) ($S * 100), - (float) ($L * 100), - ); - } - - /** - * Helper function for hslToRgb. Even blacker magic. - * - * - * @param float $m1 - * @param float $m2 - * @param float $hue - * - * @return float Color value - */ - private static function hueToRgb($m1, $m2, $hue) - { - $hue = ($hue < 0) ? $hue + 1 : (($hue > 1) ? $hue - 1 : $hue); - if ($hue * 6 < 1) { - return $m1 + ($m2 - $m1) * $hue * 6; - } - if ($hue * 2 < 1) { - return $m2; - } - if ($hue * 3 < 2) { - return $m1 + ($m2 - $m1) * (2 / 3 - $hue) * 6; - } - - return $m1; - } -} diff --git a/vendor/kint-php/kint/src/Object/Representation/DocstringRepresentation.php b/vendor/kint-php/kint/src/Object/Representation/DocstringRepresentation.php deleted file mode 100644 index 488d8d6..0000000 --- a/vendor/kint-php/kint/src/Object/Representation/DocstringRepresentation.php +++ /dev/null @@ -1,73 +0,0 @@ -file = $file; - $this->line = $line; - $this->class = $class; - $this->contents = $docstring; - } - - /** - * Returns the representation's docstring without surrounding comments. - * - * Note that this will not work flawlessly. - * - * On comments with whitespace after the stars the lines will begin with - * whitespace, since we can't accurately guess how much of an indentation - * is required. - * - * And on lines without stars on the left this may eat bullet points. - * - * Long story short: If you want the docstring read the contents. If you - * absolutely must have it without comments (ie renderValueShort) this will - * probably do. - * - * @return null|string Docstring with comments stripped - */ - public function getDocstringWithoutComments() - { - if (!$this->contents) { - return null; - } - - $string = \substr($this->contents, 3, -2); - $string = \preg_replace('/^\\s*\\*\\s*?(\\S|$)/m', '\\1', $string); - - return \trim($string); - } -} diff --git a/vendor/kint-php/kint/src/Object/Representation/MicrotimeRepresentation.php b/vendor/kint-php/kint/src/Object/Representation/MicrotimeRepresentation.php deleted file mode 100644 index b9f4dac..0000000 --- a/vendor/kint-php/kint/src/Object/Representation/MicrotimeRepresentation.php +++ /dev/null @@ -1,71 +0,0 @@ -seconds = (int) $seconds; - $this->microseconds = (int) $microseconds; - - $this->group = $group; - $this->lap = $lap; - $this->total = $total; - $this->i = $i; - - if ($i) { - $this->avg = $total / $i; - } - - $this->mem = \memory_get_usage(); - $this->mem_real = \memory_get_usage(true); - $this->mem_peak = \memory_get_peak_usage(); - $this->mem_peak_real = \memory_get_peak_usage(true); - } - - public function getDateTime() - { - return DateTime::createFromFormat('U u', $this->seconds.' '.\str_pad($this->microseconds, 6, '0', STR_PAD_LEFT)); - } -} diff --git a/vendor/kint-php/kint/src/Object/Representation/Representation.php b/vendor/kint-php/kint/src/Object/Representation/Representation.php deleted file mode 100644 index 0c911a4..0000000 --- a/vendor/kint-php/kint/src/Object/Representation/Representation.php +++ /dev/null @@ -1,71 +0,0 @@ -label = $label; - - if (null === $name) { - $name = $label; - } - - $this->setName($name); - } - - public function getLabel() - { - if (\is_array($this->contents) && \count($this->contents) > 1) { - return $this->label.' ('.\count($this->contents).')'; - } - - return $this->label; - } - - public function getName() - { - return $this->name; - } - - public function setName($name) - { - $this->name = \preg_replace('/[^a-z0-9]+/', '_', \strtolower($name)); - } - - public function labelIsImplicit() - { - return $this->implicit_label; - } -} diff --git a/vendor/kint-php/kint/src/Object/Representation/SourceRepresentation.php b/vendor/kint-php/kint/src/Object/Representation/SourceRepresentation.php deleted file mode 100644 index c2cf120..0000000 --- a/vendor/kint-php/kint/src/Object/Representation/SourceRepresentation.php +++ /dev/null @@ -1,72 +0,0 @@ -filename = $filename; - $this->line = $line; - - $start_line = \max($line - $padding, 1); - $length = $line + $padding + 1 - $start_line; - $this->source = self::getSource($filename, $start_line, $length); - if (null !== $this->source) { - $this->contents = \implode("\n", $this->source); - } - } - - /** - * Gets section of source code. - * - * @param string $filename Full path to file - * @param int $start_line The first line to display (1 based) - * @param null|int $length Amount of lines to show - * - * @return null|array - */ - public static function getSource($filename, $start_line = 1, $length = null) - { - if (!$filename || !\file_exists($filename) || !\is_readable($filename)) { - return null; - } - - $source = \preg_split("/\r\n|\n|\r/", \file_get_contents($filename)); - $source = \array_combine(\range(1, \count($source)), $source); - $source = \array_slice($source, $start_line - 1, $length, true); - - return $source; - } -} diff --git a/vendor/kint-php/kint/src/Object/Representation/SplFileInfoRepresentation.php b/vendor/kint-php/kint/src/Object/Representation/SplFileInfoRepresentation.php deleted file mode 100644 index 3df50e6..0000000 --- a/vendor/kint-php/kint/src/Object/Representation/SplFileInfoRepresentation.php +++ /dev/null @@ -1,177 +0,0 @@ -getRealPath()) { - $this->realpath = $fileInfo->getRealPath(); - $this->perms = $fileInfo->getPerms(); - $this->size = $fileInfo->getSize(); - $this->owner = $fileInfo->getOwner(); - $this->group = $fileInfo->getGroup(); - $this->ctime = $fileInfo->getCTime(); - $this->mtime = $fileInfo->getMTime(); - } - - $this->path = $fileInfo->getPathname(); - - $this->is_dir = $fileInfo->isDir(); - $this->is_file = $fileInfo->isFile(); - $this->is_link = $fileInfo->isLink(); - - if ($this->is_link) { - $this->linktarget = $fileInfo->getLinkTarget(); - } - - switch ($this->perms & 0xF000) { - case 0xC000: - $this->typename = 'Socket'; - $this->typeflag = 's'; - break; - case 0x6000: - $this->typename = 'Block device'; - $this->typeflag = 'b'; - break; - case 0x2000: - $this->typename = 'Character device'; - $this->typeflag = 'c'; - break; - case 0x1000: - $this->typename = 'Named pipe'; - $this->typeflag = 'p'; - break; - default: - if ($this->is_file) { - if ($this->is_link) { - $this->typename = 'File symlink'; - $this->typeflag = 'l'; - } else { - $this->typename = 'File'; - $this->typeflag = '-'; - } - } elseif ($this->is_dir) { - if ($this->is_link) { - $this->typename = 'Directory symlink'; - $this->typeflag = 'l'; - } else { - $this->typename = 'Directory'; - $this->typeflag = 'd'; - } - } - break; - } - - $this->flags = array($this->typeflag); - - // User - $this->flags[] = (($this->perms & 0400) ? 'r' : '-'); - $this->flags[] = (($this->perms & 0200) ? 'w' : '-'); - if ($this->perms & 0100) { - $this->flags[] = ($this->perms & 04000) ? 's' : 'x'; - } else { - $this->flags[] = ($this->perms & 04000) ? 'S' : '-'; - } - - // Group - $this->flags[] = (($this->perms & 0040) ? 'r' : '-'); - $this->flags[] = (($this->perms & 0020) ? 'w' : '-'); - if ($this->perms & 0010) { - $this->flags[] = ($this->perms & 02000) ? 's' : 'x'; - } else { - $this->flags[] = ($this->perms & 02000) ? 'S' : '-'; - } - - // Other - $this->flags[] = (($this->perms & 0004) ? 'r' : '-'); - $this->flags[] = (($this->perms & 0002) ? 'w' : '-'); - if ($this->perms & 0001) { - $this->flags[] = ($this->perms & 01000) ? 's' : 'x'; - } else { - $this->flags[] = ($this->perms & 01000) ? 'S' : '-'; - } - - $this->contents = \implode($this->flags).' '.$this->owner.' '.$this->group; - $this->contents .= ' '.$this->getSize().' '.$this->getMTime().' '; - - if ($this->is_link && $this->linktarget) { - $this->contents .= $this->path.' -> '.$this->linktarget; - } elseif (null !== $this->realpath && \strlen($this->realpath) < \strlen($this->path)) { - $this->contents .= $this->realpath; - } else { - $this->contents .= $this->path; - } - } - - public function getLabel() - { - return $this->typename.' ('.$this->getSize().')'; - } - - public function getSize() - { - if ($this->size) { - $size = Utils::getHumanReadableBytes($this->size); - - return \round($size['value'], 2).$size['unit']; - } - } - - public function getMTime() - { - $year = \date('Y', $this->mtime); - - if ($year !== \date('Y')) { - return \date('M d Y', $this->mtime); - } - - return \date('M d H:i', $this->mtime); - } -} diff --git a/vendor/kint-php/kint/src/Object/ResourceObject.php b/vendor/kint-php/kint/src/Object/ResourceObject.php deleted file mode 100644 index a43f85d..0000000 --- a/vendor/kint-php/kint/src/Object/ResourceObject.php +++ /dev/null @@ -1,49 +0,0 @@ -resource_type) { - return $this->resource_type.' resource'; - } - - return 'resource'; - } - - public function transplant(BasicObject $old) - { - parent::transplant($old); - - if ($old instanceof self) { - $this->resource_type = $old->resource_type; - } - } -} diff --git a/vendor/kint-php/kint/src/Object/StreamObject.php b/vendor/kint-php/kint/src/Object/StreamObject.php deleted file mode 100644 index 358f274..0000000 --- a/vendor/kint-php/kint/src/Object/StreamObject.php +++ /dev/null @@ -1,54 +0,0 @@ -stream_meta = $meta; - } - - public function getValueShort() - { - if (empty($this->stream_meta['uri'])) { - return; - } - - $uri = $this->stream_meta['uri']; - - if (\stream_is_local($uri)) { - return Kint::shortenPath($uri); - } - - return $uri; - } -} diff --git a/vendor/kint-php/kint/src/Object/ThrowableObject.php b/vendor/kint-php/kint/src/Object/ThrowableObject.php deleted file mode 100644 index 2a86d57..0000000 --- a/vendor/kint-php/kint/src/Object/ThrowableObject.php +++ /dev/null @@ -1,54 +0,0 @@ -message = $throw->getMessage(); - } - - public function getValueShort() - { - if (\strlen($this->message)) { - return '"'.$this->message.'"'; - } - } -} diff --git a/vendor/kint-php/kint/src/Object/TraceFrameObject.php b/vendor/kint-php/kint/src/Object/TraceFrameObject.php deleted file mode 100644 index 4259aee..0000000 --- a/vendor/kint-php/kint/src/Object/TraceFrameObject.php +++ /dev/null @@ -1,100 +0,0 @@ -transplant($base); - - $this->trace = array( - 'function' => isset($raw_frame['function']) ? $raw_frame['function'] : null, - 'line' => isset($raw_frame['line']) ? $raw_frame['line'] : null, - 'file' => isset($raw_frame['file']) ? $raw_frame['file'] : null, - 'class' => isset($raw_frame['class']) ? $raw_frame['class'] : null, - 'type' => isset($raw_frame['type']) ? $raw_frame['type'] : null, - 'object' => null, - 'args' => null, - ); - - if ($this->trace['class'] && \method_exists($this->trace['class'], $this->trace['function'])) { - $func = new ReflectionMethod($this->trace['class'], $this->trace['function']); - $this->trace['function'] = new MethodObject($func); - } elseif (!$this->trace['class'] && \function_exists($this->trace['function'])) { - $func = new ReflectionFunction($this->trace['function']); - $this->trace['function'] = new MethodObject($func); - } - - foreach ($this->value->contents as $frame_prop) { - if ('object' === $frame_prop->name) { - $this->trace['object'] = $frame_prop; - $this->trace['object']->name = null; - $this->trace['object']->operator = BasicObject::OPERATOR_NONE; - } - if ('args' === $frame_prop->name) { - $this->trace['args'] = $frame_prop->value->contents; - - if ($this->trace['function'] instanceof MethodObject) { - foreach (\array_values($this->trace['function']->parameters) as $param) { - if (isset($this->trace['args'][$param->position])) { - $this->trace['args'][$param->position]->name = $param->getName(); - } - } - } - } - } - - $this->clearRepresentations(); - - if (isset($this->trace['file'], $this->trace['line']) && \is_readable($this->trace['file'])) { - $this->addRepresentation(new SourceRepresentation($this->trace['file'], $this->trace['line'])); - } - - if ($this->trace['args']) { - $args = new Representation('Arguments'); - $args->contents = $this->trace['args']; - $this->addRepresentation($args); - } - - if ($this->trace['object']) { - $callee = new Representation('object'); - $callee->label = 'Callee object ['.$this->trace['object']->classname.']'; - $callee->contents[] = $this->trace['object']; - $this->addRepresentation($callee); - } - } -} diff --git a/vendor/kint-php/kint/src/Object/TraceObject.php b/vendor/kint-php/kint/src/Object/TraceObject.php deleted file mode 100644 index a780b08..0000000 --- a/vendor/kint-php/kint/src/Object/TraceObject.php +++ /dev/null @@ -1,45 +0,0 @@ -size) { - return 'empty'; - } - - return parent::getSize(); - } -} diff --git a/vendor/kint-php/kint/src/Parser/ArrayObjectPlugin.php b/vendor/kint-php/kint/src/Parser/ArrayObjectPlugin.php deleted file mode 100644 index 286d255..0000000 --- a/vendor/kint-php/kint/src/Parser/ArrayObjectPlugin.php +++ /dev/null @@ -1,63 +0,0 @@ -getFlags(); - - if (ArrayObject::STD_PROP_LIST === $flags) { - return; - } - - $var->setFlags(ArrayObject::STD_PROP_LIST); - - $o = $this->parser->parse($var, $o); - - $var->setFlags($flags); - - $this->parser->haltParse(); - } -} diff --git a/vendor/kint-php/kint/src/Parser/Base64Plugin.php b/vendor/kint-php/kint/src/Parser/Base64Plugin.php deleted file mode 100644 index 3d7d6bc..0000000 --- a/vendor/kint-php/kint/src/Parser/Base64Plugin.php +++ /dev/null @@ -1,95 +0,0 @@ -depth = $o->depth + 1; - $base_obj->name = 'base64_decode('.$o->name.')'; - - if ($o->access_path) { - $base_obj->access_path = 'base64_decode('.$o->access_path.')'; - } - - $r = new Representation('Base64'); - $r->contents = $this->parser->parse($data, $base_obj); - - if (\strlen($var) > self::$min_length_soft) { - $o->addRepresentation($r, 0); - } else { - $o->addRepresentation($r); - } - } -} diff --git a/vendor/kint-php/kint/src/Parser/BinaryPlugin.php b/vendor/kint-php/kint/src/Parser/BinaryPlugin.php deleted file mode 100644 index 327c297..0000000 --- a/vendor/kint-php/kint/src/Parser/BinaryPlugin.php +++ /dev/null @@ -1,49 +0,0 @@ -encoding, array('ASCII', 'UTF-8'), true)) { - $o->value->hints[] = 'binary'; - } - } -} diff --git a/vendor/kint-php/kint/src/Parser/BlacklistPlugin.php b/vendor/kint-php/kint/src/Parser/BlacklistPlugin.php deleted file mode 100644 index b37e45f..0000000 --- a/vendor/kint-php/kint/src/Parser/BlacklistPlugin.php +++ /dev/null @@ -1,143 +0,0 @@ -parseObject($var, $o); - } - if (\is_array($var)) { - return $this->parseArray($var, $o); - } - } - - protected function parseObject(&$var, BasicObject &$o) - { - foreach (self::$blacklist as $class) { - if ($var instanceof $class) { - return $this->blacklistObject($var, $o); - } - } - - if ($o->depth <= 0) { - return; - } - - foreach (self::$shallow_blacklist as $class) { - if ($var instanceof $class) { - return $this->blacklistObject($var, $o); - } - } - } - - protected function blacklistObject(&$var, BasicObject &$o) - { - $object = new InstanceObject(); - $object->transplant($o); - $object->classname = \get_class($var); - $object->hash = \spl_object_hash($var); - $object->clearRepresentations(); - $object->value = null; - $object->size = null; - $object->hints[] = 'blacklist'; - - $o = $object; - - $this->parser->haltParse(); - } - - protected function parseArray(array &$var, BasicObject &$o) - { - if (\count($var) > self::$array_limit) { - return $this->blacklistArray($var, $o); - } - - if ($o->depth <= 0) { - return; - } - - if (\count($var) > self::$shallow_array_limit) { - return $this->blacklistArray($var, $o); - } - } - - protected function blacklistArray(array &$var, BasicObject &$o) - { - $object = new BasicObject(); - $object->transplant($o); - $object->value = null; - $object->size = \count($var); - $object->hints[] = 'blacklist'; - - $o = $object; - - $this->parser->haltParse(); - } -} diff --git a/vendor/kint-php/kint/src/Parser/ClassMethodsPlugin.php b/vendor/kint-php/kint/src/Parser/ClassMethodsPlugin.php deleted file mode 100644 index e4c2371..0000000 --- a/vendor/kint-php/kint/src/Parser/ClassMethodsPlugin.php +++ /dev/null @@ -1,113 +0,0 @@ -getMethods() as $method) { - $methods[] = new MethodObject($method); - } - - \usort($methods, array('Kint\\Parser\\ClassMethodsPlugin', 'sort')); - - self::$cache[$class] = $methods; - } - - if (!empty(self::$cache[$class])) { - $rep = new Representation('Available methods', 'methods'); - - // Can't cache access paths - foreach (self::$cache[$class] as $m) { - $method = clone $m; - $method->depth = $o->depth + 1; - - if (!$this->parser->childHasPath($o, $method)) { - $method->access_path = null; - } else { - $method->setAccessPathFrom($o); - } - - if ($method->owner_class !== $class && $ds = $method->getRepresentation('docstring')) { - $ds = clone $ds; - $ds->class = $method->owner_class; - $method->replaceRepresentation($ds); - } - - $rep->contents[] = $method; - } - - $o->addRepresentation($rep); - } - } - - private static function sort(MethodObject $a, MethodObject $b) - { - $sort = ((int) $a->static) - ((int) $b->static); - if ($sort) { - return $sort; - } - - $sort = BasicObject::sortByAccess($a, $b); - if ($sort) { - return $sort; - } - - $sort = InstanceObject::sortByHierarchy($a->owner_class, $b->owner_class); - if ($sort) { - return $sort; - } - - return $a->startline - $b->startline; - } -} diff --git a/vendor/kint-php/kint/src/Parser/ClassStaticsPlugin.php b/vendor/kint-php/kint/src/Parser/ClassStaticsPlugin.php deleted file mode 100644 index 0ba58ca..0000000 --- a/vendor/kint-php/kint/src/Parser/ClassStaticsPlugin.php +++ /dev/null @@ -1,122 +0,0 @@ -getConstants() as $name => $val) { - $const = BasicObject::blank($name, '\\'.$class.'::'.$name); - $const->const = true; - $const->depth = $o->depth + 1; - $const->owner_class = $class; - $const->operator = BasicObject::OPERATOR_STATIC; - $const = $this->parser->parse($val, $const); - - $consts[] = $const; - } - - self::$cache[$class] = $consts; - } - - $statics = new Representation('Static class properties', 'statics'); - $statics->contents = self::$cache[$class]; - - foreach ($reflection->getProperties(ReflectionProperty::IS_STATIC) as $static) { - $prop = new BasicObject(); - $prop->name = '$'.$static->getName(); - $prop->depth = $o->depth + 1; - $prop->static = true; - $prop->operator = BasicObject::OPERATOR_STATIC; - $prop->owner_class = $static->getDeclaringClass()->name; - - $prop->access = BasicObject::ACCESS_PUBLIC; - if ($static->isProtected()) { - $prop->access = BasicObject::ACCESS_PROTECTED; - } elseif ($static->isPrivate()) { - $prop->access = BasicObject::ACCESS_PRIVATE; - } - - if ($this->parser->childHasPath($o, $prop)) { - $prop->access_path = '\\'.$prop->owner_class.'::'.$prop->name; - } - - $static->setAccessible(true); - $static = $static->getValue(); - $statics->contents[] = $this->parser->parse($static, $prop); - } - - if (empty($statics->contents)) { - return; - } - - \usort($statics->contents, array('Kint\\Parser\\ClassStaticsPlugin', 'sort')); - - $o->addRepresentation($statics); - } - - private static function sort(BasicObject $a, BasicObject $b) - { - $sort = ((int) $a->const) - ((int) $b->const); - if ($sort) { - return $sort; - } - - $sort = BasicObject::sortByAccess($a, $b); - if ($sort) { - return $sort; - } - - return InstanceObject::sortByHierarchy($a->owner_class, $b->owner_class); - } -} diff --git a/vendor/kint-php/kint/src/Parser/ClosurePlugin.php b/vendor/kint-php/kint/src/Parser/ClosurePlugin.php deleted file mode 100644 index 73e367b..0000000 --- a/vendor/kint-php/kint/src/Parser/ClosurePlugin.php +++ /dev/null @@ -1,94 +0,0 @@ -transplant($o); - $o = $object; - $object->removeRepresentation('properties'); - - $closure = new ReflectionFunction($var); - - $o->filename = $closure->getFileName(); - $o->startline = $closure->getStartLine(); - - foreach ($closure->getParameters() as $param) { - $o->parameters[] = new ParameterObject($param); - } - - $p = new Representation('Parameters'); - $p->contents = &$o->parameters; - $o->addRepresentation($p, 0); - - $statics = array(); - - if (\method_exists($closure, 'getClosureThis') && $v = $closure->getClosureThis()) { - $statics = array('this' => $v); - } - - if (\count($statics = $statics + $closure->getStaticVariables())) { - $statics_parsed = array(); - - foreach ($statics as $name => &$static) { - $obj = BasicObject::blank('$'.$name); - $obj->depth = $o->depth + 1; - $statics_parsed[$name] = $this->parser->parse($static, $obj); - if (null === $statics_parsed[$name]->value) { - $statics_parsed[$name]->access_path = null; - } - } - - $r = new Representation('Uses'); - $r->contents = $statics_parsed; - $o->addRepresentation($r, 0); - } - } -} diff --git a/vendor/kint-php/kint/src/Parser/ColorPlugin.php b/vendor/kint-php/kint/src/Parser/ColorPlugin.php deleted file mode 100644 index 0d748f2..0000000 --- a/vendor/kint-php/kint/src/Parser/ColorPlugin.php +++ /dev/null @@ -1,63 +0,0 @@ - 32) { - return; - } - - $trimmed = \strtolower(\trim($var)); - - if (!isset(ColorRepresentation::$color_map[$trimmed]) && !\preg_match('/^(?:(?:rgb|hsl)[^\\)]{6,}\\)|#[0-9a-fA-F]{3,8})$/', $trimmed)) { - return; - } - - $rep = new ColorRepresentation($var); - - if ($rep->variant) { - $o->removeRepresentation($o->value); - $o->addRepresentation($rep, 0); - $o->hints[] = 'color'; - } - } -} diff --git a/vendor/kint-php/kint/src/Parser/DOMDocumentPlugin.php b/vendor/kint-php/kint/src/Parser/DOMDocumentPlugin.php deleted file mode 100644 index ec08d31..0000000 --- a/vendor/kint-php/kint/src/Parser/DOMDocumentPlugin.php +++ /dev/null @@ -1,328 +0,0 @@ - 'DOMNode', - 'firstChild' => 'DOMNode', - 'lastChild' => 'DOMNode', - 'previousSibling' => 'DOMNode', - 'nextSibling' => 'DOMNode', - 'ownerDocument' => 'DOMDocument', - ); - - /** - * Show all properties and methods. - * - * @var bool - */ - public static $verbose = false; - - public function getTypes() - { - return array('object'); - } - - public function getTriggers() - { - return Parser::TRIGGER_SUCCESS; - } - - public function parse(&$var, BasicObject &$o, $trigger) - { - if (!$o instanceof InstanceObject) { - return; - } - - if ($var instanceof DOMNamedNodeMap || $var instanceof DOMNodeList) { - return $this->parseList($var, $o, $trigger); - } - - if ($var instanceof DOMNode) { - return $this->parseNode($var, $o); - } - } - - protected function parseList(&$var, InstanceObject &$o, $trigger) - { - // Recursion should never happen, should always be stopped at the parent - // DOMNode. Depth limit on the other hand we're going to skip since - // that would show an empty iterator and rather useless. Let the depth - // limit hit the children (DOMNodeList only has DOMNode as children) - if ($trigger & Parser::TRIGGER_RECURSION) { - return; - } - - $o->size = $var->length; - if (0 === $o->size) { - $o->replaceRepresentation(new Representation('Iterator')); - $o->size = null; - - return; - } - - // Depth limit - // Make empty iterator representation since we need it in DOMNode to point out depth limits - if ($this->parser->getDepthLimit() && $o->depth + 1 >= $this->parser->getDepthLimit()) { - $b = new BasicObject(); - $b->name = $o->classname.' Iterator Contents'; - $b->access_path = 'iterator_to_array('.$o->access_path.')'; - $b->depth = $o->depth + 1; - $b->hints[] = 'depth_limit'; - - $r = new Representation('Iterator'); - $r->contents = array($b); - $o->replaceRepresentation($r, 0); - - return; - } - - $data = \iterator_to_array($var); - - $r = new Representation('Iterator'); - $o->replaceRepresentation($r, 0); - - foreach ($data as $key => $item) { - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->name = $item->nodeName; - - if ($o->access_path) { - if ($var instanceof DOMNamedNodeMap) { - $base_obj->access_path = $o->access_path.'->getNamedItem('.\var_export($key, true).')'; - } elseif ($var instanceof DOMNodeList) { - $base_obj->access_path = $o->access_path.'->item('.\var_export($key, true).')'; - } else { - $base_obj->access_path = 'iterator_to_array('.$o->access_path.')'; - } - } - - $r->contents[] = $this->parser->parse($item, $base_obj); - } - } - - protected function parseNode(&$var, InstanceObject &$o) - { - // Fill the properties - // They can't be enumerated through reflection or casting, - // so we have to trust the docs and try them one at a time - $known_properties = array( - 'nodeValue', - 'childNodes', - 'attributes', - ); - - if (self::$verbose) { - $known_properties = array( - 'nodeName', - 'nodeValue', - 'nodeType', - 'parentNode', - 'childNodes', - 'firstChild', - 'lastChild', - 'previousSibling', - 'nextSibling', - 'attributes', - 'ownerDocument', - 'namespaceURI', - 'prefix', - 'localName', - 'baseURI', - 'textContent', - ); - } - - $childNodes = array(); - $attributes = array(); - - $rep = $o->value; - - foreach ($known_properties as $prop) { - $prop_obj = $this->parseProperty($o, $prop, $var); - $rep->contents[] = $prop_obj; - - if ('childNodes' === $prop) { - $childNodes = $prop_obj->getRepresentation('iterator'); - } elseif ('attributes' === $prop) { - $attributes = $prop_obj->getRepresentation('iterator'); - } - } - - if (!self::$verbose) { - $o->removeRepresentation('methods'); - $o->removeRepresentation('properties'); - } - - // Attributes and comments and text nodes don't - // need children or attributes of their own - if (\in_array($o->classname, array('DOMAttr', 'DOMText', 'DOMComment'), true)) { - return; - } - - // Set the attributes - if ($attributes) { - $a = new Representation('Attributes'); - foreach ($attributes->contents as $attribute) { - $a->contents[] = self::textualNodeToString($attribute); - } - $o->addRepresentation($a, 0); - } - - // Set the children - if ($childNodes) { - $c = new Representation('Children'); - - if (1 === \count($childNodes->contents) && ($node = \reset($childNodes->contents)) && \in_array('depth_limit', $node->hints, true)) { - $n = new InstanceObject(); - $n->transplant($node); - $n->name = 'childNodes'; - $n->classname = 'DOMNodeList'; - $c->contents = array($n); - } else { - foreach ($childNodes->contents as $index => $node) { - // Shortcircuit text nodes to plain strings - if ('DOMText' === $node->classname || 'DOMComment' === $node->classname) { - $node = self::textualNodeToString($node); - - // And remove them if they're empty - if (\ctype_space($node->value->contents) || '' === $node->value->contents) { - continue; - } - } - - $c->contents[] = $node; - } - } - - $o->addRepresentation($c, 0); - } - - if (isset($c) && \count($c->contents)) { - $o->size = \count($c->contents); - } - - if (!$o->size) { - $o->size = null; - } - } - - protected function parseProperty(InstanceObject $o, $prop, &$var) - { - // Duplicating (And slightly optimizing) the Parser::parseObject() code here - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->owner_class = $o->classname; - $base_obj->name = $prop; - $base_obj->operator = BasicObject::OPERATOR_OBJECT; - $base_obj->access = BasicObject::ACCESS_PUBLIC; - - if (null !== $o->access_path) { - $base_obj->access_path = $o->access_path; - - if (\preg_match('/^[A-Za-z0-9_]+$/', $base_obj->name)) { - $base_obj->access_path .= '->'.$base_obj->name; - } else { - $base_obj->access_path .= '->{'.\var_export($base_obj->name, true).'}'; - } - } - - if (!isset($var->{$prop})) { - $base_obj->type = 'null'; - } elseif (isset(self::$blacklist[$prop])) { - $b = new InstanceObject(); - $b->transplant($base_obj); - $base_obj = $b; - - $base_obj->hints[] = 'blacklist'; - $base_obj->classname = self::$blacklist[$prop]; - } elseif ('attributes' === $prop) { - $base_obj = $this->parser->parseDeep($var->{$prop}, $base_obj); - } else { - $base_obj = $this->parser->parse($var->{$prop}, $base_obj); - } - - return $base_obj; - } - - protected static function textualNodeToString(InstanceObject $o) - { - if (empty($o->value) || empty($o->value->contents) || empty($o->classname)) { - return; - } - - if (!\in_array($o->classname, array('DOMText', 'DOMAttr', 'DOMComment'), true)) { - return; - } - - foreach ($o->value->contents as $property) { - if ('nodeValue' === $property->name) { - $ret = clone $property; - $ret->name = $o->name; - - return $ret; - } - } - } -} diff --git a/vendor/kint-php/kint/src/Parser/DateTimePlugin.php b/vendor/kint-php/kint/src/Parser/DateTimePlugin.php deleted file mode 100644 index f2cebb6..0000000 --- a/vendor/kint-php/kint/src/Parser/DateTimePlugin.php +++ /dev/null @@ -1,55 +0,0 @@ -transplant($o); - - $o = $object; - } -} diff --git a/vendor/kint-php/kint/src/Parser/FsPathPlugin.php b/vendor/kint-php/kint/src/Parser/FsPathPlugin.php deleted file mode 100644 index 3a8d1e0..0000000 --- a/vendor/kint-php/kint/src/Parser/FsPathPlugin.php +++ /dev/null @@ -1,72 +0,0 @@ - 2048) { - return; - } - - if (!\preg_match('/[\\/\\'.DIRECTORY_SEPARATOR.']/', $var)) { - return; - } - - if (\preg_match('/[?<>"*|]/', $var)) { - return; - } - - if (!@\file_exists($var)) { - return; - } - - if (\in_array($var, self::$blacklist, true)) { - return; - } - - $r = new SplFileInfoRepresentation(new SplFileInfo($var)); - $r->hints[] = 'fspath'; - $o->addRepresentation($r, 0); - } -} diff --git a/vendor/kint-php/kint/src/Parser/IteratorPlugin.php b/vendor/kint-php/kint/src/Parser/IteratorPlugin.php deleted file mode 100644 index 0487a38..0000000 --- a/vendor/kint-php/kint/src/Parser/IteratorPlugin.php +++ /dev/null @@ -1,110 +0,0 @@ -name = $class.' Iterator Contents'; - $b->access_path = 'iterator_to_array('.$o->access_path.', true)'; - $b->depth = $o->depth + 1; - $b->hints[] = 'blacklist'; - - $r = new Representation('Iterator'); - $r->contents = array($b); - - $o->addRepresentation($r); - - return; - } - } - - /** @var array|false */ - $data = \iterator_to_array($var); - - if (false === $data) { - return; - } - - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth; - - if ($o->access_path) { - $base_obj->access_path = 'iterator_to_array('.$o->access_path.')'; - } - - $r = new Representation('Iterator'); - $r->contents = $this->parser->parse($data, $base_obj); - $r->contents = $r->contents->value->contents; - - $primary = $o->getRepresentations(); - $primary = \reset($primary); - if ($primary && $primary === $o->value && $primary->contents === array()) { - $o->addRepresentation($r, 0); - } else { - $o->addRepresentation($r); - } - } -} diff --git a/vendor/kint-php/kint/src/Parser/JsonPlugin.php b/vendor/kint-php/kint/src/Parser/JsonPlugin.php deleted file mode 100644 index 84b2519..0000000 --- a/vendor/kint-php/kint/src/Parser/JsonPlugin.php +++ /dev/null @@ -1,73 +0,0 @@ -depth = $o->depth; - - if ($o->access_path) { - $base_obj->access_path = 'json_decode('.$o->access_path.', true)'; - } - - $r = new Representation('Json'); - $r->contents = $this->parser->parse($json, $base_obj); - - if (!\in_array('depth_limit', $r->contents->hints, true)) { - $r->contents = $r->contents->value->contents; - } - - $o->addRepresentation($r, 0); - } -} diff --git a/vendor/kint-php/kint/src/Parser/MicrotimePlugin.php b/vendor/kint-php/kint/src/Parser/MicrotimePlugin.php deleted file mode 100644 index 5062b59..0000000 --- a/vendor/kint-php/kint/src/Parser/MicrotimePlugin.php +++ /dev/null @@ -1,105 +0,0 @@ -depth) { - return; - } - - if (\is_string($var)) { - if ('microtime()' !== $o->name || !\preg_match('/^0\\.[0-9]{8} [0-9]{10}$/', $var)) { - return; - } - - $usec = (int) \substr($var, 2, 6); - $sec = (int) \substr($var, 11, 10); - } else { - if ('microtime(...)' !== $o->name) { - return; - } - - $sec = \floor($var); - $usec = $var - $sec; - $usec = \floor($usec * 1000000); - } - - $time = $sec + ($usec / 1000000); - - if (null !== self::$last) { - $last_time = self::$last[0] + (self::$last[1] / 1000000); - $lap = $time - $last_time; - ++self::$times; - } else { - $lap = null; - self::$start = $time; - } - - self::$last = array($sec, $usec); - - if (null !== $lap) { - $total = $time - self::$start; - $r = new MicrotimeRepresentation($sec, $usec, self::$group, $lap, $total, self::$times); - } else { - $r = new MicrotimeRepresentation($sec, $usec, self::$group); - } - $r->contents = $var; - $r->implicit_label = true; - - $o->removeRepresentation($o->value); - $o->addRepresentation($r); - $o->hints[] = 'microtime'; - } - - public static function clean() - { - self::$last = null; - self::$start = null; - self::$times = 0; - ++self::$group; - } -} diff --git a/vendor/kint-php/kint/src/Parser/MysqliPlugin.php b/vendor/kint-php/kint/src/Parser/MysqliPlugin.php deleted file mode 100644 index 265299b..0000000 --- a/vendor/kint-php/kint/src/Parser/MysqliPlugin.php +++ /dev/null @@ -1,129 +0,0 @@ - true, - 'connect_errno' => true, - 'connect_error' => true, - ); - - // These are readable on empty mysqli objects, but not on failed connections - protected $empty_readable = array( - 'client_info' => true, - 'errno' => true, - 'error' => true, - ); - - // These are only readable on connected mysqli objects - protected $connected_readable = array( - 'affected_rows' => true, - 'error_list' => true, - 'field_count' => true, - 'host_info' => true, - 'info' => true, - 'insert_id' => true, - 'server_info' => true, - 'server_version' => true, - 'stat' => true, - 'sqlstate' => true, - 'protocol_version' => true, - 'thread_id' => true, - 'warning_count' => true, - ); - - public function getTypes() - { - return array('object'); - } - - public function getTriggers() - { - return Parser::TRIGGER_COMPLETE; - } - - public function parse(&$var, BasicObject &$o, $trigger) - { - if (!$var instanceof Mysqli) { - return; - } - - $connected = false; - $empty = false; - - if (\is_string(@$var->sqlstate)) { - $connected = true; - } elseif (\is_string(@$var->client_info)) { - $empty = true; - } - - foreach ($o->value->contents as $key => $obj) { - if (isset($this->connected_readable[$obj->name])) { - if (!$connected) { - continue; - } - } elseif (isset($this->empty_readable[$obj->name])) { - if (!$connected && !$empty) { - continue; - } - } elseif (!isset($this->always_readable[$obj->name])) { - continue; - } - - if ('null' !== $obj->type) { - continue; - } - - $param = $var->{$obj->name}; - - if (null === $param) { - continue; - } - - $base = BasicObject::blank($obj->name, $obj->access_path); - - $base->depth = $obj->depth; - $base->owner_class = $obj->owner_class; - $base->operator = $obj->operator; - $base->access = $obj->access; - $base->reference = $obj->reference; - - $o->value->contents[$key] = $this->parser->parse($param, $base); - } - } -} diff --git a/vendor/kint-php/kint/src/Parser/Parser.php b/vendor/kint-php/kint/src/Parser/Parser.php deleted file mode 100644 index b7f81c6..0000000 --- a/vendor/kint-php/kint/src/Parser/Parser.php +++ /dev/null @@ -1,604 +0,0 @@ -marker = \uniqid("kint\0", true); - - $this->caller_class = $caller; - - if ($depth_limit) { - $this->depth_limit = $depth_limit; - } - } - - /** - * Set the caller class. - * - * @param null|string $caller Caller class name - */ - public function setCallerClass($caller = null) - { - $this->noRecurseCall(); - - $this->caller_class = $caller; - } - - public function getCallerClass() - { - return $this->caller_class; - } - - /** - * Set the depth limit. - * - * @param false|int $depth_limit Maximum depth to parse data - */ - public function setDepthLimit($depth_limit = false) - { - $this->noRecurseCall(); - - $this->depth_limit = $depth_limit; - } - - public function getDepthLimit() - { - return $this->depth_limit; - } - - /** - * Disables the depth limit and parses a variable. - * - * This should not be used unless you know what you're doing! - * - * @param mixed $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - public function parseDeep(&$var, BasicObject $o) - { - $depth_limit = $this->depth_limit; - $this->depth_limit = false; - - $out = $this->parse($var, $o); - - $this->depth_limit = $depth_limit; - - return $out; - } - - /** - * Parses a variable into a Kint object structure. - * - * @param mixed $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - public function parse(&$var, BasicObject $o) - { - $o->type = \strtolower(\gettype($var)); - - if (!$this->applyPlugins($var, $o, self::TRIGGER_BEGIN)) { - return $o; - } - - switch ($o->type) { - case 'array': - return $this->parseArray($var, $o); - case 'boolean': - case 'double': - case 'integer': - case 'null': - return $this->parseGeneric($var, $o); - case 'object': - return $this->parseObject($var, $o); - case 'resource': - return $this->parseResource($var, $o); - case 'string': - return $this->parseString($var, $o); - default: - return $this->parseUnknown($var, $o); - } - } - - public function addPlugin(Plugin $p) - { - if (!$types = $p->getTypes()) { - return false; - } - - if (!$triggers = $p->getTriggers()) { - return false; - } - - $p->setParser($this); - - foreach ($types as $type) { - if (!isset($this->plugins[$type])) { - $this->plugins[$type] = array( - self::TRIGGER_BEGIN => array(), - self::TRIGGER_SUCCESS => array(), - self::TRIGGER_RECURSION => array(), - self::TRIGGER_DEPTH_LIMIT => array(), - ); - } - - foreach ($this->plugins[$type] as $trigger => &$pool) { - if ($triggers & $trigger) { - $pool[] = $p; - } - } - } - - return true; - } - - public function clearPlugins() - { - $this->plugins = array(); - } - - public function haltParse() - { - $this->parse_break = true; - } - - public function childHasPath(InstanceObject $parent, BasicObject $child) - { - if ('object' === $parent->type && (null !== $parent->access_path || $child->static || $child->const)) { - if (BasicObject::ACCESS_PUBLIC === $child->access) { - return true; - } - - if (BasicObject::ACCESS_PRIVATE === $child->access && $this->caller_class) { - if ($this->caller_class === $child->owner_class) { - return true; - } - } elseif (BasicObject::ACCESS_PROTECTED === $child->access && $this->caller_class) { - if ($this->caller_class === $child->owner_class) { - return true; - } - - if (\is_subclass_of($this->caller_class, $child->owner_class)) { - return true; - } - - if (\is_subclass_of($child->owner_class, $this->caller_class)) { - return true; - } - } - } - - return false; - } - - /** - * Returns an array without the recursion marker in it. - * - * DO NOT pass an array that has had it's marker removed back - * into the parser, it will result in an extra recursion - * - * @param array $array Array potentially containing a recursion marker - * - * @return array Array with recursion marker removed - */ - public function getCleanArray(array $array) - { - unset($array[$this->marker]); - - return $array; - } - - protected function noRecurseCall() - { - $bt = \debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS); - - $caller_frame = array( - 'function' => __FUNCTION__, - ); - - while (isset($bt[0]['object']) && $bt[0]['object'] === $this) { - $caller_frame = \array_shift($bt); - } - - foreach ($bt as $frame) { - if (isset($frame['object']) && $frame['object'] === $this) { - throw new DomainException(__CLASS__.'::'.$caller_frame['function'].' cannot be called from inside a parse'); - } - } - } - - private function parseGeneric(&$var, BasicObject $o) - { - $rep = new Representation('Contents'); - $rep->contents = $var; - $rep->implicit_label = true; - $o->addRepresentation($rep); - $o->value = $rep; - - $this->applyPlugins($var, $o, self::TRIGGER_SUCCESS); - - return $o; - } - - /** - * Parses a string into a Kint BlobObject structure. - * - * @param string $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - private function parseString(&$var, BasicObject $o) - { - $string = new BlobObject(); - $string->transplant($o); - $string->encoding = BlobObject::detectEncoding($var); - $string->size = BlobObject::strlen($var, $string->encoding); - - $rep = new Representation('Contents'); - $rep->contents = $var; - $rep->implicit_label = true; - - $string->addRepresentation($rep); - $string->value = $rep; - - $this->applyPlugins($var, $string, self::TRIGGER_SUCCESS); - - return $string; - } - - /** - * Parses an array into a Kint object structure. - * - * @param array $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - private function parseArray(array &$var, BasicObject $o) - { - $array = new BasicObject(); - $array->transplant($o); - $array->size = \count($var); - - if (isset($var[$this->marker])) { - --$array->size; - $array->hints[] = 'recursion'; - - $this->applyPlugins($var, $array, self::TRIGGER_RECURSION); - - return $array; - } - - $rep = new Representation('Contents'); - $rep->implicit_label = true; - $array->addRepresentation($rep); - $array->value = $rep; - - if (!$array->size) { - $this->applyPlugins($var, $array, self::TRIGGER_SUCCESS); - - return $array; - } - - if ($this->depth_limit && $o->depth >= $this->depth_limit) { - $array->hints[] = 'depth_limit'; - - $this->applyPlugins($var, $array, self::TRIGGER_DEPTH_LIMIT); - - return $array; - } - - $copy = \array_values($var); - - // It's really really hard to access numeric string keys in arrays, - // and it's really really hard to access integer properties in - // objects, so we just use array_values and index by counter to get - // at it reliably for reference testing. This also affects access - // paths since it's pretty much impossible to access these things - // without complicated stuff you should never need to do. - $i = 0; - - // Set the marker for recursion - $var[$this->marker] = $array->depth; - - $refmarker = new stdClass(); - - foreach ($var as $key => &$val) { - if ($key === $this->marker) { - continue; - } - - $child = new BasicObject(); - $child->name = $key; - $child->depth = $array->depth + 1; - $child->access = BasicObject::ACCESS_NONE; - $child->operator = BasicObject::OPERATOR_ARRAY; - - if (null !== $array->access_path) { - if (\is_string($key) && (string) (int) $key === $key) { - $child->access_path = 'array_values('.$array->access_path.')['.$i.']'; // @codeCoverageIgnore - } else { - $child->access_path = $array->access_path.'['.\var_export($key, true).']'; - } - } - - $stash = $val; - $copy[$i] = $refmarker; - if ($val === $refmarker) { - $child->reference = true; - $val = $stash; - } - - $rep->contents[] = $this->parse($val, $child); - ++$i; - } - - $this->applyPlugins($var, $array, self::TRIGGER_SUCCESS); - unset($var[$this->marker]); - - return $array; - } - - /** - * Parses an object into a Kint InstanceObject structure. - * - * @param object $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - private function parseObject(&$var, BasicObject $o) - { - $hash = \spl_object_hash($var); - $values = (array) $var; - - $object = new InstanceObject(); - $object->transplant($o); - $object->classname = \get_class($var); - $object->hash = $hash; - $object->size = \count($values); - - if (isset($this->object_hashes[$hash])) { - $object->hints[] = 'recursion'; - - $this->applyPlugins($var, $object, self::TRIGGER_RECURSION); - - return $object; - } - - $this->object_hashes[$hash] = $object; - - if ($this->depth_limit && $o->depth >= $this->depth_limit) { - $object->hints[] = 'depth_limit'; - - $this->applyPlugins($var, $object, self::TRIGGER_DEPTH_LIMIT); - unset($this->object_hashes[$hash]); - - return $object; - } - - $reflector = new ReflectionObject($var); - - if ($reflector->isUserDefined()) { - $object->filename = $reflector->getFileName(); - $object->startline = $reflector->getStartLine(); - } - - $rep = new Representation('Properties'); - - $copy = \array_values($values); - $refmarker = new stdClass(); - $i = 0; - - // Reflection will not show parent classes private properties, and if a - // property was unset it will happly trigger a notice looking for it. - foreach ($values as $key => &$val) { - // Casting object to array: - // private properties show in the form "\0$owner_class_name\0$property_name"; - // protected properties show in the form "\0*\0$property_name"; - // public properties show in the form "$property_name"; - // http://www.php.net/manual/en/language.types.array.php#language.types.array.casting - - $child = new BasicObject(); - $child->depth = $object->depth + 1; - $child->owner_class = $object->classname; - $child->operator = BasicObject::OPERATOR_OBJECT; - $child->access = BasicObject::ACCESS_PUBLIC; - - $split_key = \explode("\0", $key, 3); - - if (3 === \count($split_key) && '' === $split_key[0]) { - $child->name = $split_key[2]; - if ('*' === $split_key[1]) { - $child->access = BasicObject::ACCESS_PROTECTED; - } else { - $child->access = BasicObject::ACCESS_PRIVATE; - $child->owner_class = $split_key[1]; - } - } elseif (KINT_PHP72) { - $child->name = (string) $key; - } else { - $child->name = $key; // @codeCoverageIgnore - } - - if ($this->childHasPath($object, $child)) { - $child->access_path = $object->access_path; - - if (!KINT_PHP72 && \is_int($child->name)) { - $child->access_path = 'array_values((array) '.$child->access_path.')['.$i.']'; // @codeCoverageIgnore - } elseif (\preg_match('/^[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*$/', $child->name)) { - $child->access_path .= '->'.$child->name; - } else { - $child->access_path .= '->{'.\var_export((string) $child->name, true).'}'; - } - } - - $stash = $val; - $copy[$i] = $refmarker; - if ($val === $refmarker) { - $child->reference = true; - $val = $stash; - } - - $rep->contents[] = $this->parse($val, $child); - ++$i; - } - - $object->addRepresentation($rep); - $object->value = $rep; - $this->applyPlugins($var, $object, self::TRIGGER_SUCCESS); - unset($this->object_hashes[$hash]); - - return $object; - } - - /** - * Parses a resource into a Kint ResourceObject structure. - * - * @param resource $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - private function parseResource(&$var, BasicObject $o) - { - $resource = new ResourceObject(); - $resource->transplant($o); - $resource->resource_type = \get_resource_type($var); - - $this->applyPlugins($var, $resource, self::TRIGGER_SUCCESS); - - return $resource; - } - - /** - * Parses an unknown into a Kint object structure. - * - * @param mixed $var The input variable - * @param BasicObject $o The base object - * - * @return BasicObject - */ - private function parseUnknown(&$var, BasicObject $o) - { - $o->type = 'unknown'; - $this->applyPlugins($var, $o, self::TRIGGER_SUCCESS); - - return $o; - } - - /** - * Applies plugins for an object type. - * - * @param mixed $var variable - * @param BasicObject $o Kint object parsed so far - * @param int $trigger The trigger to check for the plugins - * - * @return bool Continue parsing - */ - private function applyPlugins(&$var, BasicObject &$o, $trigger) - { - $break_stash = $this->parse_break; - - /** @var bool Psalm bug workaround */ - $this->parse_break = false; - - $plugins = array(); - - if (isset($this->plugins[$o->type][$trigger])) { - $plugins = $this->plugins[$o->type][$trigger]; - } - - foreach ($plugins as $plugin) { - try { - $plugin->parse($var, $o, $trigger); - } catch (Exception $e) { - \trigger_error( - 'An exception ('.\get_class($e).') was thrown in '.$e->getFile().' on line '.$e->getLine().' while executing Kint Parser Plugin "'.\get_class($plugin).'". Error message: '.$e->getMessage(), - E_USER_WARNING - ); - } - - if ($this->parse_break) { - $this->parse_break = $break_stash; - - return false; - } - } - - $this->parse_break = $break_stash; - - return true; - } -} diff --git a/vendor/kint-php/kint/src/Parser/Plugin.php b/vendor/kint-php/kint/src/Parser/Plugin.php deleted file mode 100644 index 51d5f0b..0000000 --- a/vendor/kint-php/kint/src/Parser/Plugin.php +++ /dev/null @@ -1,55 +0,0 @@ -parser = $p; - } - - /** - * An array of types (As returned by gettype) for all data this plugin can operate on. - * - * @return array List of types - */ - public function getTypes() - { - return array(); - } - - public function getTriggers() - { - return Parser::TRIGGER_NONE; - } - - abstract public function parse(&$variable, BasicObject &$o, $trigger); -} diff --git a/vendor/kint-php/kint/src/Parser/ProxyPlugin.php b/vendor/kint-php/kint/src/Parser/ProxyPlugin.php deleted file mode 100644 index 3376d3a..0000000 --- a/vendor/kint-php/kint/src/Parser/ProxyPlugin.php +++ /dev/null @@ -1,66 +0,0 @@ -types = $types; - $this->triggers = $triggers; - $this->callback = $callback; - } - - public function getTypes() - { - return $this->types; - } - - public function getTriggers() - { - return $this->triggers; - } - - public function parse(&$var, BasicObject &$o, $trigger) - { - return \call_user_func_array($this->callback, array(&$var, &$o, $trigger, $this->parser)); - } -} diff --git a/vendor/kint-php/kint/src/Parser/SerializePlugin.php b/vendor/kint-php/kint/src/Parser/SerializePlugin.php deleted file mode 100644 index c5dadb8..0000000 --- a/vendor/kint-php/kint/src/Parser/SerializePlugin.php +++ /dev/null @@ -1,108 +0,0 @@ - Unserialization can result in code being loaded and executed due to - * > object instantiation and autoloading, and a malicious user may be able - * > to exploit this. - * - * The natural way to stop that from happening is to just refuse to unserialize - * stuff by default. Which is what we're doing for anything that's not scalar. - * - * @var bool - */ - public static $safe_mode = true; - public static $options = array(true); - - public function getTypes() - { - return array('string'); - } - - public function getTriggers() - { - return Parser::TRIGGER_SUCCESS; - } - - public function parse(&$var, BasicObject &$o, $trigger) - { - $trimmed = \rtrim($var); - - if ('N;' !== $trimmed && !\preg_match('/^(?:[COabis]:\\d+[:;]|d:\\d+(?:\\.\\d+);)/', $trimmed)) { - return; - } - - if (!self::$safe_mode || !\in_array($trimmed[0], array('C', 'O', 'a'), true)) { - // Second parameter only supported on PHP 7 - if (KINT_PHP70) { - // Suppress warnings on unserializeable variable - $data = @\unserialize($trimmed, self::$options); - } else { - $data = @\unserialize($trimmed); - } - - if (false === $data && 'b:0;' !== \substr($trimmed, 0, 4)) { - return; - } - } - - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->name = 'unserialize('.$o->name.')'; - - if ($o->access_path) { - $base_obj->access_path = 'unserialize('.$o->access_path; - if (!KINT_PHP70 || self::$options === array(true)) { - $base_obj->access_path .= ')'; - } elseif (self::$options === array(false)) { - $base_obj->access_path .= ', false)'; - } else { - $base_obj->access_path .= ', Serialize::$options)'; - } - } - - $r = new Representation('Serialized'); - - if (isset($data)) { - $r->contents = $this->parser->parse($data, $base_obj); - } else { - $base_obj->hints[] = 'blacklist'; - $r->contents = $base_obj; - } - - $o->addRepresentation($r, 0); - } -} diff --git a/vendor/kint-php/kint/src/Parser/SimpleXMLElementPlugin.php b/vendor/kint-php/kint/src/Parser/SimpleXMLElementPlugin.php deleted file mode 100644 index b90c863..0000000 --- a/vendor/kint-php/kint/src/Parser/SimpleXMLElementPlugin.php +++ /dev/null @@ -1,154 +0,0 @@ -hints[] = 'simplexml_element'; - - if (!self::$verbose) { - $o->removeRepresentation('properties'); - $o->removeRepresentation('iterator'); - $o->removeRepresentation('methods'); - } - - // Attributes - $a = new Representation('Attributes'); - - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth; - - if ($o->access_path) { - $base_obj->access_path = '(string) '.$o->access_path; - } - - if ($attribs = $var->attributes()) { - $attribs = \iterator_to_array($attribs); - $attribs = \array_map('strval', $attribs); - } else { - $attribs = array(); - } - - // XML attributes are by definition strings and don't have children, - // so up the depth limit in case we're just below the limit since - // there won't be any recursive stuff anyway. - $a->contents = $this->parser->parseDeep($attribs, $base_obj)->value->contents; - - $o->addRepresentation($a, 0); - - // Children - // We need to check children() separately from the values we already parsed because - // text contents won't show up in children() but they will show up in properties. - // - // Why do we still need to check for attributes if we already have an attributes() - // method? Hell if I know! - $children = $var->children(); - - if ($o->value) { - $c = new Representation('Children'); - - foreach ($o->value->contents as $value) { - if ('@attributes' === $value->name) { - continue; - } - - if (isset($children->{$value->name})) { - $i = 0; - - while (isset($children->{$value->name}[$i])) { - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->name = $value->name; - if ($value->access_path) { - $base_obj->access_path = $value->access_path.'['.$i.']'; - } - - $value = $this->parser->parse($children->{$value->name}[$i], $base_obj); - - if ($value->access_path && 'string' === $value->type) { - $value->access_path = '(string) '.$value->access_path; - } - - $c->contents[] = $value; - - ++$i; - } - } - } - - $o->size = \count($c->contents); - - if (!$o->size) { - $o->size = null; - - if (\strlen((string) $var)) { - $base_obj = new BlobObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->name = $o->name; - if ($o->access_path) { - $base_obj->access_path = '(string) '.$o->access_path; - } - - $value = (string) $var; - - $c = new Representation('Contents'); - $c->implicit_label = true; - $c->contents = array($this->parser->parseDeep($value, $base_obj)); - } - } - - $o->addRepresentation($c, 0); - } - } -} diff --git a/vendor/kint-php/kint/src/Parser/SplFileInfoPlugin.php b/vendor/kint-php/kint/src/Parser/SplFileInfoPlugin.php deleted file mode 100644 index 8b72193..0000000 --- a/vendor/kint-php/kint/src/Parser/SplFileInfoPlugin.php +++ /dev/null @@ -1,55 +0,0 @@ -addRepresentation($r, 0); - $o->size = $r->getSize(); - } -} diff --git a/vendor/kint-php/kint/src/Parser/SplObjectStoragePlugin.php b/vendor/kint-php/kint/src/Parser/SplObjectStoragePlugin.php deleted file mode 100644 index 03ff301..0000000 --- a/vendor/kint-php/kint/src/Parser/SplObjectStoragePlugin.php +++ /dev/null @@ -1,54 +0,0 @@ -getRepresentation('iterator'))) { - return; - } - - $r = $o->getRepresentation('iterator'); - if ($r) { - $o->size = !\is_array($r->contents) ? null : \count($r->contents); - } - } -} diff --git a/vendor/kint-php/kint/src/Parser/StreamPlugin.php b/vendor/kint-php/kint/src/Parser/StreamPlugin.php deleted file mode 100644 index 464a3ff..0000000 --- a/vendor/kint-php/kint/src/Parser/StreamPlugin.php +++ /dev/null @@ -1,78 +0,0 @@ -resource_type) { - return; - } - - if (!$meta = \stream_get_meta_data($var)) { - return; - } - - $rep = new Representation('Stream'); - $rep->implicit_label = true; - - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth; - - if ($o->access_path) { - $base_obj->access_path = 'stream_get_meta_data('.$o->access_path.')'; - } - - $rep->contents = $this->parser->parse($meta, $base_obj); - - if (!\in_array('depth_limit', $rep->contents->hints, true)) { - $rep->contents = $rep->contents->value->contents; - } - - $o->addRepresentation($rep, 0); - $o->value = $rep; - - $stream = new StreamObject($meta); - $stream->transplant($o); - $o = $stream; - } -} diff --git a/vendor/kint-php/kint/src/Parser/TablePlugin.php b/vendor/kint-php/kint/src/Parser/TablePlugin.php deleted file mode 100644 index 510c4ff..0000000 --- a/vendor/kint-php/kint/src/Parser/TablePlugin.php +++ /dev/null @@ -1,87 +0,0 @@ -value->contents)) { - return; - } - - $array = $this->parser->getCleanArray($var); - - if (\count($array) < 2) { - return; - } - - // Ensure this is an array of arrays and that all child arrays have the - // same keys. We don't care about their children - if there's another - // "table" inside we'll just make another one down the value tab - $keys = null; - foreach ($array as $elem) { - if (!\is_array($elem) || \count($elem) < 2) { - return; - } - - if (null === $keys) { - $keys = \array_keys($elem); - } elseif (\array_keys($elem) !== $keys) { - return; - } - } - - // Ensure none of the child arrays are recursion or depth limit. We - // don't care if their children are since they are the table cells - foreach ($o->value->contents as $childarray) { - if (empty($childarray->value->contents)) { - return; - } - } - - // Objects by reference for the win! We can do a copy-paste of the value - // representation contents and just slap a new hint on there and hey - // presto we have our table representation with no extra memory used! - $table = new Representation('Table'); - $table->contents = $o->value->contents; - $table->hints[] = 'table'; - $o->addRepresentation($table, 0); - } -} diff --git a/vendor/kint-php/kint/src/Parser/ThrowablePlugin.php b/vendor/kint-php/kint/src/Parser/ThrowablePlugin.php deleted file mode 100644 index 8490d1d..0000000 --- a/vendor/kint-php/kint/src/Parser/ThrowablePlugin.php +++ /dev/null @@ -1,60 +0,0 @@ -transplant($o); - $r = new SourceRepresentation($var->getFile(), $var->getLine()); - $r->showfilename = true; - $throw->addRepresentation($r, 0); - - $o = $throw; - } -} diff --git a/vendor/kint-php/kint/src/Parser/TimestampPlugin.php b/vendor/kint-php/kint/src/Parser/TimestampPlugin.php deleted file mode 100644 index 72958d6..0000000 --- a/vendor/kint-php/kint/src/Parser/TimestampPlugin.php +++ /dev/null @@ -1,71 +0,0 @@ -value->label = 'Timestamp'; - $o->value->hints[] = 'timestamp'; - } - } -} diff --git a/vendor/kint-php/kint/src/Parser/ToStringPlugin.php b/vendor/kint-php/kint/src/Parser/ToStringPlugin.php deleted file mode 100644 index 8b7a65f..0000000 --- a/vendor/kint-php/kint/src/Parser/ToStringPlugin.php +++ /dev/null @@ -1,67 +0,0 @@ -hasMethod('__toString')) { - return; - } - - foreach (self::$blacklist as $class) { - if ($var instanceof $class) { - return; - } - } - - $r = new Representation('toString'); - $r->contents = (string) $var; - - $o->addRepresentation($r); - } -} diff --git a/vendor/kint-php/kint/src/Parser/TracePlugin.php b/vendor/kint-php/kint/src/Parser/TracePlugin.php deleted file mode 100644 index 3554993..0000000 --- a/vendor/kint-php/kint/src/Parser/TracePlugin.php +++ /dev/null @@ -1,92 +0,0 @@ -value) { - return; - } - - $trace = $this->parser->getCleanArray($var); - - if (\count($trace) !== \count($o->value->contents) || !Utils::isTrace($trace)) { - return; - } - - $traceobj = new TraceObject(); - $traceobj->transplant($o); - $rep = $traceobj->value; - - $old_trace = $rep->contents; - - Utils::normalizeAliases(self::$blacklist); - - $rep->contents = array(); - - foreach ($old_trace as $frame) { - $index = $frame->name; - - if (!isset($trace[$index]['function'])) { - // Something's very very wrong here, but it's probably a plugin's fault - continue; - } - - if (Utils::traceFrameIsListed($trace[$index], self::$blacklist)) { - continue; - } - - $rep->contents[$index] = new TraceFrameObject($frame, $trace[$index]); - } - - \ksort($rep->contents); - $rep->contents = \array_values($rep->contents); - - $traceobj->clearRepresentations(); - $traceobj->addRepresentation($rep); - $traceobj->size = \count($rep->contents); - $o = $traceobj; - } -} diff --git a/vendor/kint-php/kint/src/Parser/XmlPlugin.php b/vendor/kint-php/kint/src/Parser/XmlPlugin.php deleted file mode 100644 index 0947e9a..0000000 --- a/vendor/kint-php/kint/src/Parser/XmlPlugin.php +++ /dev/null @@ -1,150 +0,0 @@ -access_path); - - if (empty($xml)) { - return; - } - - list($xml, $access_path, $name) = $xml; - - $base_obj = new BasicObject(); - $base_obj->depth = $o->depth + 1; - $base_obj->name = $name; - $base_obj->access_path = $access_path; - - $r = new Representation('XML'); - $r->contents = $this->parser->parse($xml, $base_obj); - - $o->addRepresentation($r, 0); - } - - protected static function xmlToSimpleXML($var, $parent_path) - { - try { - $errors = \libxml_use_internal_errors(true); - $xml = \simplexml_load_string($var); - \libxml_use_internal_errors($errors); - } catch (Exception $e) { - if (isset($errors)) { - \libxml_use_internal_errors($errors); - } - - return; - } - - if (!$xml) { - return; - } - - if (null === $parent_path) { - $access_path = null; - } else { - $access_path = 'simplexml_load_string('.$parent_path.')'; - } - - $name = $xml->getName(); - - return array($xml, $access_path, $name); - } - - /** - * Get the DOMDocument info. - * - * The documentation of DOMDocument::loadXML() states that while you can - * call it statically, it will give an E_STRICT warning. On my system it - * actually gives an E_DEPRECATED warning, but it works so we'll just add - * an error-silencing '@' to the access path. - * - * If it errors loading then we wouldn't have gotten this far in the first place. - * - * @param string $var The XML string - * @param null|string $parent_path The path to the parent, in this case the XML string - * - * @return null|array The root element DOMNode, the access path, and the root element name - */ - protected static function xmlToDOMDocument($var, $parent_path) - { - // There's no way to check validity in DOMDocument without making errors. For shame! - if (!self::xmlToSimpleXML($var, $parent_path)) { - return null; - } - - $xml = new DOMDocument(); - $xml->loadXML($var); - $xml = $xml->firstChild; - - if (null === $parent_path) { - $access_path = null; - } else { - $access_path = '@\\DOMDocument::loadXML('.$parent_path.')->firstChild'; - } - - $name = $xml->nodeName; - - return array($xml, $access_path, $name); - } -} diff --git a/vendor/kint-php/kint/src/Renderer/CliRenderer.php b/vendor/kint-php/kint/src/Renderer/CliRenderer.php deleted file mode 100644 index 0d0846a..0000000 --- a/vendor/kint-php/kint/src/Renderer/CliRenderer.php +++ /dev/null @@ -1,152 +0,0 @@ -windows_output = KINT_WIN; - } - - if (!self::$terminal_width) { - if (!KINT_WIN && self::$detect_width) { - self::$terminal_width = \exec('tput cols'); - } - - if (self::$terminal_width < self::$min_terminal_width) { - self::$terminal_width = self::$default_width; - } - } - - $this->colors = $this->windows_output ? false : self::$cli_colors; - - $this->header_width = self::$terminal_width; - } - - public function colorValue($string) - { - if (!$this->colors) { - return $string; - } - - return "\x1b[32m".\str_replace("\n", "\x1b[0m\n\x1b[32m", $string)."\x1b[0m"; - } - - public function colorType($string) - { - if (!$this->colors) { - return $string; - } - - return "\x1b[35;1m".\str_replace("\n", "\x1b[0m\n\x1b[35;1m", $string)."\x1b[0m"; - } - - public function colorTitle($string) - { - if (!$this->colors) { - return $string; - } - - return "\x1b[36m".\str_replace("\n", "\x1b[0m\n\x1b[36m", $string)."\x1b[0m"; - } - - public function renderTitle(BasicObject $o) - { - if ($this->windows_output) { - return $this->utf8ToWindows(parent::renderTitle($o)); - } - - return parent::renderTitle($o); - } - - public function preRender() - { - return PHP_EOL; - } - - public function postRender() - { - if ($this->windows_output) { - return $this->utf8ToWindows(parent::postRender()); - } - - return parent::postRender(); - } - - public function escape($string, $encoding = false) - { - return \str_replace("\x1b", '\\x1b', $string); - } - - protected function utf8ToWindows($string) - { - return \str_replace( - array('ā”Œ', '═', '┐', '│', 'ā””', '─', 'ā”˜'), - array("\xda", "\xdc", "\xbf", "\xb3", "\xc0", "\xc4", "\xd9"), - $string - ); - } -} diff --git a/vendor/kint-php/kint/src/Renderer/PlainRenderer.php b/vendor/kint-php/kint/src/Renderer/PlainRenderer.php deleted file mode 100644 index 493a774..0000000 --- a/vendor/kint-php/kint/src/Renderer/PlainRenderer.php +++ /dev/null @@ -1,237 +0,0 @@ - array( - array('Kint\\Renderer\\PlainRenderer', 'renderJs'), - array('Kint\\Renderer\\Text\\MicrotimePlugin', 'renderJs'), - ), - 'style' => array( - array('Kint\\Renderer\\PlainRenderer', 'renderCss'), - ), - 'raw' => array(), - ); - - /** - * Path to the CSS file to load by default. - * - * @var string - */ - public static $theme = 'plain.css'; - - /** - * Output htmlentities instead of utf8. - * - * @var bool - */ - public static $disable_utf8 = false; - - public static $needs_pre_render = true; - - public static $always_pre_render = false; - - protected $force_pre_render = false; - protected $pre_render; - - public function __construct() - { - parent::__construct(); - - $this->pre_render = self::$needs_pre_render; - - if (self::$always_pre_render) { - $this->setPreRender(true); - } - } - - public function setCallInfo(array $info) - { - parent::setCallInfo($info); - - if (\in_array('@', $this->call_info['modifiers'], true)) { - $this->setPreRender(true); - } - } - - public function setStatics(array $statics) - { - parent::setStatics($statics); - - if (!empty($statics['return'])) { - $this->setPreRender(true); - } - } - - public function setPreRender($pre_render) - { - $this->pre_render = $pre_render; - $this->force_pre_render = true; - } - - public function getPreRender() - { - return $this->pre_render; - } - - public function colorValue($string) - { - return ''.$string.''; - } - - public function colorType($string) - { - return ''.$string.''; - } - - public function colorTitle($string) - { - return ''.$string.''; - } - - public function renderTitle(BasicObject $o) - { - if (self::$disable_utf8) { - return $this->utf8ToHtmlentity(parent::renderTitle($o)); - } - - return parent::renderTitle($o); - } - - public function preRender() - { - $output = ''; - - if ($this->pre_render) { - foreach (self::$pre_render_sources as $type => $values) { - $contents = ''; - foreach ($values as $v) { - $contents .= \call_user_func($v, $this); - } - - if (!\strlen($contents)) { - continue; - } - - switch ($type) { - case 'script': - $output .= ''; - break; - case 'style': - $output .= ''; - break; - default: - $output .= $contents; - } - } - - // Don't pre-render on every dump - if (!$this->force_pre_render) { - self::$needs_pre_render = false; - } - } - - return $output.'
'; - } - - public function postRender() - { - if (self::$disable_utf8) { - return $this->utf8ToHtmlentity(parent::postRender()).'
'; - } - - return parent::postRender().''; - } - - public function ideLink($file, $line) - { - $path = $this->escape(Kint::shortenPath($file)).':'.$line; - $ideLink = Kint::getIdeLink($file, $line); - - if (!$ideLink) { - return $path; - } - - $class = ''; - - if (\preg_match('/https?:\\/\\//i', $ideLink)) { - $class = 'class="kint-ide-link" '; - } - - return ''.$path.''; - } - - public function escape($string, $encoding = false) - { - if (false === $encoding) { - $encoding = BlobObject::detectEncoding($string); - } - - $original_encoding = $encoding; - - if (false === $encoding || 'ASCII' === $encoding) { - $encoding = 'UTF-8'; - } - - $string = \htmlspecialchars($string, ENT_NOQUOTES, $encoding); - - // this call converts all non-ASCII characters into numeirc htmlentities - if (\function_exists('mb_encode_numericentity') && 'ASCII' !== $original_encoding) { - $string = \mb_encode_numericentity($string, array(0x80, 0xffff, 0, 0xffff), $encoding); - } - - return $string; - } - - protected function utf8ToHtmlentity($string) - { - return \str_replace( - array('ā”Œ', '═', '┐', '│', 'ā””', '─', 'ā”˜'), - array('┌', '═', '┐', '│', '└', '─', '┘'), - $string - ); - } - - protected static function renderJs() - { - return \file_get_contents(KINT_DIR.'/resources/compiled/shared.js').\file_get_contents(KINT_DIR.'/resources/compiled/plain.js'); - } - - protected static function renderCss() - { - if (\file_exists(KINT_DIR.'/resources/compiled/'.self::$theme)) { - return \file_get_contents(KINT_DIR.'/resources/compiled/'.self::$theme); - } - - return \file_get_contents(self::$theme); - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Renderer.php b/vendor/kint-php/kint/src/Renderer/Renderer.php deleted file mode 100644 index cf8b0a7..0000000 --- a/vendor/kint-php/kint/src/Renderer/Renderer.php +++ /dev/null @@ -1,185 +0,0 @@ -call_info = array( - 'params' => $info['params'], - 'modifiers' => $info['modifiers'], - 'callee' => $info['callee'], - 'caller' => $info['caller'], - 'trace' => $info['trace'], - ); - } - - public function getCallInfo() - { - return $this->call_info; - } - - public function setStatics(array $statics) - { - $this->statics = $statics; - $this->setShowTrace(!empty($statics['display_called_from'])); - } - - public function getStatics() - { - return $this->statics; - } - - public function setShowTrace($show_trace) - { - $this->show_trace = $show_trace; - } - - public function getShowTrace() - { - return $this->show_trace; - } - - /** - * Returns the first compatible plugin available. - * - * @param array $plugins Array of hints to class strings - * @param array $hints Array of object hints - * - * @return array Array of hints to class strings filtered and sorted by object hints - */ - public function matchPlugins(array $plugins, array $hints) - { - $out = array(); - - foreach ($hints as $key) { - if (isset($plugins[$key])) { - $out[$key] = $plugins[$key]; - } - } - - return $out; - } - - public function filterParserPlugins(array $plugins) - { - return $plugins; - } - - public function preRender() - { - return ''; - } - - public function postRender() - { - return ''; - } - - public static function sortPropertiesFull(BasicObject $a, BasicObject $b) - { - $sort = BasicObject::sortByAccess($a, $b); - if ($sort) { - return $sort; - } - - $sort = BasicObject::sortByName($a, $b); - if ($sort) { - return $sort; - } - - return InstanceObject::sortByHierarchy($a->owner_class, $b->owner_class); - } - - /** - * Sorts an array of BasicObject. - * - * @param BasicObject[] $contents Object properties to sort - * @param int $sort - * - * @return BasicObject[] - */ - public static function sortProperties(array $contents, $sort) - { - switch ($sort) { - case self::SORT_VISIBILITY: - /** @var array Containers to quickly stable sort by type */ - $containers = array( - BasicObject::ACCESS_PUBLIC => array(), - BasicObject::ACCESS_PROTECTED => array(), - BasicObject::ACCESS_PRIVATE => array(), - BasicObject::ACCESS_NONE => array(), - ); - - foreach ($contents as $item) { - $containers[$item->access][] = $item; - } - - return \call_user_func_array('array_merge', $containers); - case self::SORT_FULL: - \usort($contents, array('Kint\\Renderer\\Renderer', 'sortPropertiesFull')); - // no break - default: - return $contents; - } - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/BinaryPlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/BinaryPlugin.php deleted file mode 100644 index 5b4d613..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/BinaryPlugin.php +++ /dev/null @@ -1,51 +0,0 @@ -'; - - $chunks = \str_split($r->contents, self::$line_length); - - foreach ($chunks as $index => $chunk) { - $out .= \sprintf('%08X', $index * self::$line_length).":\t"; - $out .= \implode(' ', \str_split(\str_pad(\bin2hex($chunk), 2 * self::$line_length, ' '), self::$chunk_length)); - $out .= "\t".\preg_replace('/[^\\x20-\\x7E]/', '.', $chunk)."\n"; - } - - $out .= ''; - - return $out; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/BlacklistPlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/BlacklistPlugin.php deleted file mode 100644 index fcfedc1..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/BlacklistPlugin.php +++ /dev/null @@ -1,36 +0,0 @@ -'.$this->renderLockedHeader($o, 'Blacklisted').''; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/CallablePlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/CallablePlugin.php deleted file mode 100644 index 5834017..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/CallablePlugin.php +++ /dev/null @@ -1,174 +0,0 @@ -renderMethod($o); - } - - if ($o instanceof ClosureObject) { - return $this->renderClosure($o); - } - - return $this->renderCallable($o); - } - - protected function renderClosure(ClosureObject $o) - { - $children = $this->renderer->renderChildren($o); - - $header = ''; - - if (null !== ($s = $o->getModifiers())) { - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $header .= ''.$this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).')'; - } - - if (null !== ($s = $o->getValueShort())) { - if (RichRenderer::$strlen_max && BlobObject::strlen($s) > RichRenderer::$strlen_max) { - $s = \substr($s, 0, RichRenderer::$strlen_max).'...'; - } - $header .= ' '.$this->renderer->escape($s); - } - - return '
'.$this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header).$children.'
'; - } - - protected function renderCallable(BasicObject $o) - { - $children = $this->renderer->renderChildren($o); - - $header = ''; - - if (null !== ($s = $o->getModifiers())) { - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $header .= ''.$this->renderer->escape($s).''; - } - - if (null !== ($s = $o->getValueShort())) { - if (RichRenderer::$strlen_max && BlobObject::strlen($s) > RichRenderer::$strlen_max) { - $s = \substr($s, 0, RichRenderer::$strlen_max).'...'; - } - $header .= ' '.$this->renderer->escape($s); - } - - return '
'.$this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header).$children.'
'; - } - - protected function renderMethod(MethodObject $o) - { - if (!empty(self::$method_cache[$o->owner_class][$o->name])) { - $children = self::$method_cache[$o->owner_class][$o->name]['children']; - - $header = $this->renderer->renderHeaderWrapper( - $o, - (bool) \strlen($children), - self::$method_cache[$o->owner_class][$o->name]['header'] - ); - - return '
'.$header.$children.'
'; - } - - $children = $this->renderer->renderChildren($o); - - $header = ''; - - if (null !== ($s = $o->getModifiers()) || $o->return_reference) { - $header .= ''.$s; - - if ($o->return_reference) { - if ($s) { - $header .= ' '; - } - $header .= $this->renderer->escape('&'); - } - - $header .= ' '; - } - - if (null !== ($s = $o->getName())) { - $function = $this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).')'; - - if (null !== ($url = $o->getPhpDocUrl())) { - $function = ''.$function.''; - } - - $header .= ''.$function.''; - } - - if (!empty($o->returntype)) { - $header .= ': '; - - if ($o->return_reference) { - $header .= $this->renderer->escape('&'); - } - - $header .= $this->renderer->escape($o->returntype).''; - } elseif ($o->docstring) { - if (\preg_match('/@return\\s+(.*)\\r?\\n/m', $o->docstring, $matches)) { - if (\trim($matches[1])) { - $header .= ': '.$this->renderer->escape(\trim($matches[1])).''; - } - } - } - - if (null !== ($s = $o->getValueShort())) { - if (RichRenderer::$strlen_max && BlobObject::strlen($s) > RichRenderer::$strlen_max) { - $s = \substr($s, 0, RichRenderer::$strlen_max).'...'; - } - $header .= ' '.$this->renderer->escape($s); - } - - if (\strlen($o->owner_class) && \strlen($o->name)) { - self::$method_cache[$o->owner_class][$o->name] = array( - 'header' => $header, - 'children' => $children, - ); - } - - $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); - - return '
'.$header.$children.'
'; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/ClosurePlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/ClosurePlugin.php deleted file mode 100644 index 79a9926..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/ClosurePlugin.php +++ /dev/null @@ -1,59 +0,0 @@ -renderer->renderChildren($o); - - if (!($o instanceof ClosureObject)) { - $header = $this->renderer->renderHeader($o); - } else { - $header = ''; - - if (null !== ($s = $o->getModifiers())) { - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $header .= ''.$this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).') '; - } - - $header .= 'Closure '; - $header .= $this->renderer->escape(Kint::shortenPath($o->filename)).':'.(int) $o->startline; - } - - $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); - - return '
'.$header.$children.'
'; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/ColorPlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/ColorPlugin.php deleted file mode 100644 index 241a815..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/ColorPlugin.php +++ /dev/null @@ -1,100 +0,0 @@ -getRepresentation('color'); - - if (!$r instanceof ColorRepresentation) { - return; - } - - $children = $this->renderer->renderChildren($o); - - $header = $this->renderer->renderHeader($o); - $header .= '
'; - - $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); - - return '
'.$header.$children.'
'; - } - - public function renderTab(Representation $r) - { - if (!$r instanceof ColorRepresentation) { - return; - } - - $out = ''; - - if ($color = $r->getColor(ColorRepresentation::COLOR_NAME)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_3)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_6)) { - $out .= ''.$color."\n"; - } - - if ($r->hasAlpha()) { - if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_4)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_8)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_RGBA)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_HSLA)) { - $out .= ''.$color."\n"; - } - } else { - if ($color = $r->getColor(ColorRepresentation::COLOR_RGB)) { - $out .= ''.$color."\n"; - } - if ($color = $r->getColor(ColorRepresentation::COLOR_HSL)) { - $out .= ''.$color."\n"; - } - } - - if (!\strlen($out)) { - return false; - } - - return '
'.$out.'
'; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/DepthLimitPlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/DepthLimitPlugin.php deleted file mode 100644 index cd92b41..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/DepthLimitPlugin.php +++ /dev/null @@ -1,36 +0,0 @@ -'.$this->renderLockedHeader($o, 'Depth Limit').''; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/DocstringPlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/DocstringPlugin.php deleted file mode 100644 index 19c5309..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/DocstringPlugin.php +++ /dev/null @@ -1,70 +0,0 @@ -contents) as $line) { - $docstring[] = \trim($line); - } - - $docstring = \implode("\n", $docstring); - - $location = array(); - - if ($r->class) { - $location[] = 'Inherited from '.$this->renderer->escape($r->class); - } - if ($r->file && $r->line) { - $location[] = 'Defined in '.$this->renderer->escape(Kint::shortenPath($r->file)).':'.((int) $r->line); - } - - $location = \implode("\n", $location); - - if ($location) { - if (\strlen($docstring)) { - $docstring .= "\n\n"; - } - - $location = ''.$location.''; - } elseif (0 === \strlen($docstring)) { - return ''; - } - - return '
'.$this->renderer->escape($docstring).$location.'
'; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/MicrotimePlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/MicrotimePlugin.php deleted file mode 100644 index a56bb23..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/MicrotimePlugin.php +++ /dev/null @@ -1,68 +0,0 @@ -getDateTime()->format('Y-m-d H:i:s.u'); - if (null !== $r->lap) { - $out .= '
SINCE LAST CALL: '.\round($r->lap, 4).'s.'; - } - if (null !== $r->total) { - $out .= '
SINCE START: '.\round($r->total, 4).'s.'; - } - if (null !== $r->avg) { - $out .= '
AVERAGE DURATION: '.\round($r->avg, 4).'s.'; - } - - $bytes = Utils::getHumanReadableBytes($r->mem); - $out .= '
MEMORY USAGE: '.$r->mem.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - $bytes = Utils::getHumanReadableBytes($r->mem_real); - $out .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - - $bytes = Utils::getHumanReadableBytes($r->mem_peak); - $out .= '
PEAK MEMORY USAGE: '.$r->mem_peak.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - $bytes = Utils::getHumanReadableBytes($r->mem_peak_real); - $out .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - - return '
'.$out.'
'; - } - - public static function renderJs() - { - return \file_get_contents(KINT_DIR.'/resources/compiled/microtime.js'); - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/ObjectPluginInterface.php b/vendor/kint-php/kint/src/Renderer/Rich/ObjectPluginInterface.php deleted file mode 100644 index f46aa29..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/ObjectPluginInterface.php +++ /dev/null @@ -1,33 +0,0 @@ -renderer = $r; - } - - /** - * Renders a locked header. - * - * @param BasicObject $o - * @param string $content - */ - public function renderLockedHeader(BasicObject $o, $content) - { - $header = '
'; - - if (RichRenderer::$access_paths && $o->depth > 0 && $ap = $o->getAccessPath()) { - $header .= ''; - } - - $header .= ''; - - if (null !== ($s = $o->getModifiers())) { - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $header .= ''.$this->renderer->escape($s).' '; - - if ($s = $o->getOperator()) { - $header .= $this->renderer->escape($s, 'ASCII').' '; - } - } - - if (null !== ($s = $o->getType())) { - $s = $this->renderer->escape($s); - - if ($o->reference) { - $s = '&'.$s; - } - - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getSize())) { - $header .= '('.$this->renderer->escape($s).') '; - } - - $header .= $content; - - if (!empty($ap)) { - $header .= '
'.$this->renderer->escape($ap).'
'; - } - - return $header.'
'; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/PluginInterface.php b/vendor/kint-php/kint/src/Renderer/Rich/PluginInterface.php deleted file mode 100644 index 79828e7..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/PluginInterface.php +++ /dev/null @@ -1,33 +0,0 @@ -'.$this->renderLockedHeader($o, 'Recursion').''; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/SimpleXMLElementPlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/SimpleXMLElementPlugin.php deleted file mode 100644 index 6c18931..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/SimpleXMLElementPlugin.php +++ /dev/null @@ -1,81 +0,0 @@ -renderer->renderChildren($o); - - $header = ''; - - if (null !== ($s = $o->getModifiers())) { - $header .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $header .= ''.$this->renderer->escape($s).' '; - - if ($s = $o->getOperator()) { - $header .= $this->renderer->escape($s, 'ASCII').' '; - } - } - - if (null !== ($s = $o->getType())) { - $s = $this->renderer->escape($s); - - if ($o->reference) { - $s = '&'.$s; - } - - $header .= ''.$this->renderer->escape($s).' '; - } - - if (null !== ($s = $o->getSize())) { - $header .= '('.$this->renderer->escape($s).') '; - } - - if (null === $s && $c = $o->getRepresentation('contents')) { - $c = \reset($c->contents); - - if ($c && null !== ($s = $c->getValueShort())) { - if (RichRenderer::$strlen_max && BlobObject::strlen($s) > RichRenderer::$strlen_max) { - $s = \substr($s, 0, RichRenderer::$strlen_max).'...'; - } - $header .= $this->renderer->escape($s); - } - } - - $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); - - return '
'.$header.$children.'
'; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/SourcePlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/SourcePlugin.php deleted file mode 100644 index 5443dbf..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/SourcePlugin.php +++ /dev/null @@ -1,79 +0,0 @@ -source)) { - return false; - } - - $source = $r->source; - - // Trim empty lines from the start and end of the source - foreach ($source as $linenum => $line) { - if (\strlen(\trim($line)) || $linenum === $r->line) { - break; - } - - unset($source[$linenum]); - } - - foreach (\array_reverse($source, true) as $linenum => $line) { - if (\strlen(\trim($line)) || $linenum === $r->line) { - break; - } - - unset($source[$linenum]); - } - - $output = ''; - - foreach ($source as $linenum => $line) { - if ($linenum === $r->line) { - $output .= '
'.$this->renderer->escape($line)."\n".'
'; - } else { - $output .= '
'.$this->renderer->escape($line)."\n".'
'; - } - } - - if ($output) { - \reset($source); - - $data = ''; - if ($r->showfilename) { - $data = ' data-kint-filename="'.$this->renderer->escape($r->filename).'"'; - } - - return '
'.$output.'
'; - } - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/TabPluginInterface.php b/vendor/kint-php/kint/src/Renderer/Rich/TabPluginInterface.php deleted file mode 100644 index 7cdbde7..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/TabPluginInterface.php +++ /dev/null @@ -1,33 +0,0 @@ -'; - - $firstrow = \reset($r->contents); - - foreach ($firstrow->value->contents as $field) { - $out .= ''; - } - - $out .= ''; - - foreach ($r->contents as $row) { - $out .= ''; - - foreach ($row->value->contents as $field) { - $out .= 'getType())) { - $type = $this->renderer->escape($s); - - if ($field->reference) { - $ref = '&'; - $type = $ref.$type; - } - - if (null !== ($s = $field->getSize())) { - $size .= ' ('.$this->renderer->escape($s).')'; - } - } - - if ($type) { - $out .= ' title="'.$type.$size.'"'; - } - - $out .= '>'; - - switch ($field->type) { - case 'boolean': - $out .= $field->value->contents ? ''.$ref.'true' : ''.$ref.'false'; - break; - case 'integer': - case 'double': - $out .= (string) $field->value->contents; - break; - case 'null': - $out .= ''.$ref.'null'; - break; - case 'string': - if ($field->encoding) { - $val = $field->value->contents; - if (RichRenderer::$strlen_max && self::$respect_str_length && BlobObject::strlen($val) > RichRenderer::$strlen_max) { - $val = \substr($val, 0, RichRenderer::$strlen_max).'...'; - } - - $out .= $this->renderer->escape($val); - } else { - $out .= ''.$type.''; - } - break; - case 'array': - $out .= ''.$ref.'array'.$size; - break; - case 'object': - $out .= ''.$ref.$this->renderer->escape($field->classname).''.$size; - break; - case 'resource': - $out .= ''.$ref.'resource'; - break; - default: - $out .= ''.$ref.'unknown'; - break; - } - - if (\in_array('blacklist', $field->hints, true)) { - $out .= ' Blacklisted'; - } elseif (\in_array('recursion', $field->hints, true)) { - $out .= ' Recursion'; - } elseif (\in_array('depth_limit', $field->hints, true)) { - $out .= ' Depth Limit'; - } - - $out .= ''; - } - - $out .= ''; - } - - $out .= '
'.$this->renderer->escape($field->name).'
'; - $out .= $this->renderer->escape($row->name); - $out .= '
'; - - return $out; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/TimestampPlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/TimestampPlugin.php deleted file mode 100644 index 6e3a2f8..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/TimestampPlugin.php +++ /dev/null @@ -1,42 +0,0 @@ -contents); - - if ($dt) { - return '
'.$dt->setTimeZone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s T').'
'; - } - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Rich/TraceFramePlugin.php b/vendor/kint-php/kint/src/Renderer/Rich/TraceFramePlugin.php deleted file mode 100644 index 6ca19bb..0000000 --- a/vendor/kint-php/kint/src/Renderer/Rich/TraceFramePlugin.php +++ /dev/null @@ -1,68 +0,0 @@ -trace['file']) && !empty($o->trace['line'])) { - $header = ''.$this->renderer->ideLink($o->trace['file'], (int) $o->trace['line']).' '; - } else { - $header = 'PHP internal call '; - } - - if ($o->trace['class']) { - $header .= $this->renderer->escape($o->trace['class'].$o->trace['type']); - } - - if (\is_string($o->trace['function'])) { - $function = $this->renderer->escape($o->trace['function'].'()'); - } else { - $function = $this->renderer->escape( - $o->trace['function']->getName().'('.$o->trace['function']->getParams().')' - ); - - if (null !== ($url = $o->trace['function']->getPhpDocUrl())) { - $function = ''.$function.''; - } - } - - $header .= ''.$function.''; - - $children = $this->renderer->renderChildren($o); - $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); - - return '
'.$header.$children.'
'; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/RichRenderer.php b/vendor/kint-php/kint/src/Renderer/RichRenderer.php deleted file mode 100644 index dcd39ee..0000000 --- a/vendor/kint-php/kint/src/Renderer/RichRenderer.php +++ /dev/null @@ -1,612 +0,0 @@ - 'Kint\\Renderer\\Rich\\BlacklistPlugin', - 'callable' => 'Kint\\Renderer\\Rich\\CallablePlugin', - 'closure' => 'Kint\\Renderer\\Rich\\ClosurePlugin', - 'color' => 'Kint\\Renderer\\Rich\\ColorPlugin', - 'depth_limit' => 'Kint\\Renderer\\Rich\\DepthLimitPlugin', - 'recursion' => 'Kint\\Renderer\\Rich\\RecursionPlugin', - 'simplexml_element' => 'Kint\\Renderer\\Rich\\SimpleXMLElementPlugin', - 'trace_frame' => 'Kint\\Renderer\\Rich\\TraceFramePlugin', - ); - - /** - * RichRenderer tab plugins should implement Kint\Renderer\Rich\TabPluginInterface. - */ - public static $tab_plugins = array( - 'binary' => 'Kint\\Renderer\\Rich\\BinaryPlugin', - 'color' => 'Kint\\Renderer\\Rich\\ColorPlugin', - 'docstring' => 'Kint\\Renderer\\Rich\\DocstringPlugin', - 'microtime' => 'Kint\\Renderer\\Rich\\MicrotimePlugin', - 'source' => 'Kint\\Renderer\\Rich\\SourcePlugin', - 'table' => 'Kint\\Renderer\\Rich\\TablePlugin', - 'timestamp' => 'Kint\\Renderer\\Rich\\TimestampPlugin', - ); - - public static $pre_render_sources = array( - 'script' => array( - array('Kint\\Renderer\\RichRenderer', 'renderJs'), - array('Kint\\Renderer\\Rich\\MicrotimePlugin', 'renderJs'), - ), - 'style' => array( - array('Kint\\Renderer\\RichRenderer', 'renderCss'), - ), - 'raw' => array(), - ); - - /** - * Whether or not to render access paths. - * - * Access paths can become incredibly heavy with very deep and wide - * structures. Given mostly public variables it will typically make - * up one quarter of the output HTML size. - * - * If this is an unacceptably large amount and your browser is groaning - * under the weight of the access paths - your first order of buisiness - * should be to get a new browser. Failing that, use this to turn them off. - * - * @var bool - */ - public static $access_paths = true; - - /** - * The maximum length of a string before it is truncated. - * - * Falsey to disable - * - * @var int - */ - public static $strlen_max = 80; - - /** - * Path to the CSS file to load by default. - * - * @var string - */ - public static $theme = 'original.css'; - - /** - * Assume types and sizes don't need to be escaped. - * - * Turn this off if you use anything but ascii in your class names, - * but it'll cause a slowdown of around 10% - * - * @var bool - */ - public static $escape_types = false; - - /** - * Move all dumps to a folder at the bottom of the body. - * - * @var bool - */ - public static $folder = true; - - /** - * Sort mode for object properties. - * - * @var int - */ - public static $sort = self::SORT_NONE; - - public static $needs_pre_render = true; - public static $needs_folder_render = true; - - public static $always_pre_render = false; - - protected $plugin_objs = array(); - protected $expand = false; - protected $force_pre_render = false; - protected $pre_render; - protected $use_folder; - - public function __construct() - { - $this->pre_render = self::$needs_pre_render; - $this->use_folder = self::$folder; - - if (self::$always_pre_render) { - $this->setForcePreRender(); - } - } - - public function setCallInfo(array $info) - { - parent::setCallInfo($info); - - if (\in_array('!', $this->call_info['modifiers'], true)) { - $this->setExpand(true); - $this->use_folder = false; - } - - if (\in_array('@', $this->call_info['modifiers'], true)) { - $this->setForcePreRender(); - } - } - - public function setStatics(array $statics) - { - parent::setStatics($statics); - - if (!empty($statics['expanded'])) { - $this->setExpand(true); - } - - if (!empty($statics['return'])) { - $this->setForcePreRender(); - } - } - - public function setExpand($expand) - { - $this->expand = $expand; - } - - public function getExpand() - { - return $this->expand; - } - - public function setForcePreRender() - { - $this->force_pre_render = true; - $this->pre_render = true; - } - - public function setPreRender($pre_render) - { - $this->setForcePreRender(); // TODO: Remove line in next major version - $this->pre_render = $pre_render; - } - - public function getPreRender() - { - return $this->pre_render; - } - - public function setUseFolder($use_folder) - { - $this->use_folder = $use_folder; - } - - public function getUseFolder() - { - return $this->use_folder; - } - - public function render(BasicObject $o) - { - if ($plugin = $this->getPlugin(self::$object_plugins, $o->hints)) { - if (\strlen($output = $plugin->renderObject($o))) { - return $output; - } - } - - $children = $this->renderChildren($o); - $header = $this->renderHeaderWrapper($o, (bool) \strlen($children), $this->renderHeader($o)); - - return '
'.$header.$children.'
'; - } - - public function renderNothing() - { - return '
No argument
'; - } - - public function renderHeaderWrapper(BasicObject $o, $has_children, $contents) - { - $out = 'expand) { - $out .= ' kint-show'; - } - - $out .= '"'; - } - - $out .= '>'; - - if (self::$access_paths && $o->depth > 0 && $ap = $o->getAccessPath()) { - $out .= ''; - } - - if ($has_children) { - $out .= ''; - - if (0 === $o->depth) { - $out .= ''; - $out .= ''; - } - - $out .= ''; - } - - $out .= $contents; - - if (!empty($ap)) { - $out .= '
'.$this->escape($ap).'
'; - } - - return $out.''; - } - - public function renderHeader(BasicObject $o) - { - $output = ''; - - if (null !== ($s = $o->getModifiers())) { - $output .= ''.$s.' '; - } - - if (null !== ($s = $o->getName())) { - $output .= ''.$this->escape($s).' '; - - if ($s = $o->getOperator()) { - $output .= $this->escape($s, 'ASCII').' '; - } - } - - if (null !== ($s = $o->getType())) { - if (self::$escape_types) { - $s = $this->escape($s); - } - - if ($o->reference) { - $s = '&'.$s; - } - - $output .= ''.$s.' '; - } - - if (null !== ($s = $o->getSize())) { - if (self::$escape_types) { - $s = $this->escape($s); - } - $output .= '('.$s.') '; - } - - if (null !== ($s = $o->getValueShort())) { - $s = \preg_replace('/\\s+/', ' ', $s); - - if (self::$strlen_max) { - $s = Utils::truncateString($s, self::$strlen_max); - } - - $output .= $this->escape($s); - } - - return \trim($output); - } - - public function renderChildren(BasicObject $o) - { - $contents = array(); - $tabs = array(); - - foreach ($o->getRepresentations() as $rep) { - $result = $this->renderTab($o, $rep); - if (\strlen($result)) { - $contents[] = $result; - $tabs[] = $rep; - } - } - - if (empty($tabs)) { - return ''; - } - - $output = '
'; - - if (1 === \count($tabs) && $tabs[0]->labelIsImplicit()) { - $output .= \reset($contents); - } else { - $output .= '
    '; - - foreach ($tabs as $i => $tab) { - if (0 === $i) { - $output .= '
  • '; - } else { - $output .= '
  • '; - } - - $output .= $this->escape($tab->getLabel()).'
  • '; - } - - $output .= '
    '; - - foreach ($contents as $tab) { - $output .= '
  • '.$tab.'
  • '; - } - - $output .= '
'; - } - - return $output.'
'; - } - - public function preRender() - { - $output = ''; - - if ($this->pre_render) { - foreach (self::$pre_render_sources as $type => $values) { - $contents = ''; - foreach ($values as $v) { - $contents .= \call_user_func($v, $this); - } - - if (!\strlen($contents)) { - continue; - } - - switch ($type) { - case 'script': - $output .= ''; - break; - case 'style': - $output .= ''; - break; - default: - $output .= $contents; - } - } - - // Don't pre-render on every dump - if (!$this->force_pre_render) { - self::$needs_pre_render = false; - } - } - - $output .= '
'; - - return $output; - } - - public function postRender() - { - if (!$this->show_trace) { - return '
'; - } - - $output = '
'; - $output .= ' '; - - if (!empty($this->call_info['trace']) && \count($this->call_info['trace']) > 1) { - $output .= ''; - } - - if (isset($this->call_info['callee']['file'])) { - $output .= 'Called from '.$this->ideLink( - $this->call_info['callee']['file'], - $this->call_info['callee']['line'] - ); - } - - if (isset($this->call_info['callee']['function']) && ( - !empty($this->call_info['callee']['class']) || - !\in_array( - $this->call_info['callee']['function'], - array('include', 'include_once', 'require', 'require_once'), - true - ) - ) - ) { - $output .= ' ['; - if (isset($this->call_info['callee']['class'])) { - $output .= $this->call_info['callee']['class']; - } - if (isset($this->call_info['callee']['type'])) { - $output .= $this->call_info['callee']['type']; - } - $output .= $this->call_info['callee']['function'].'()]'; - } - - if (!empty($this->call_info['trace']) && \count($this->call_info['trace']) > 1) { - $output .= '
    '; - foreach ($this->call_info['trace'] as $index => $step) { - if (!$index) { - continue; - } - - $output .= '
  1. '.$this->ideLink($step['file'], $step['line']); // closing tag not required - if (isset($step['function']) - && !\in_array($step['function'], array('include', 'include_once', 'require', 'require_once'), true) - ) { - $output .= ' ['; - if (isset($step['class'])) { - $output .= $step['class']; - } - if (isset($step['type'])) { - $output .= $step['type']; - } - $output .= $step['function'].'()]'; - } - } - $output .= '
'; - } - - $output .= '
'; - - return $output; - } - - public function escape($string, $encoding = false) - { - if (false === $encoding) { - $encoding = BlobObject::detectEncoding($string); - } - - $original_encoding = $encoding; - - if (false === $encoding || 'ASCII' === $encoding) { - $encoding = 'UTF-8'; - } - - $string = \htmlspecialchars($string, ENT_NOQUOTES, $encoding); - - // this call converts all non-ASCII characters into numeirc htmlentities - if (\function_exists('mb_encode_numericentity') && 'ASCII' !== $original_encoding) { - $string = \mb_encode_numericentity($string, array(0x80, 0xffff, 0, 0xffff), $encoding); - } - - return $string; - } - - public function ideLink($file, $line) - { - $path = $this->escape(Kint::shortenPath($file)).':'.$line; - $ideLink = Kint::getIdeLink($file, $line); - - if (!$ideLink) { - return $path; - } - - $class = ''; - - if (\preg_match('/https?:\\/\\//i', $ideLink)) { - $class = 'class="kint-ide-link" '; - } - - return ''.$path.''; - } - - protected function renderTab(BasicObject $o, Representation $rep) - { - if ($plugin = $this->getPlugin(self::$tab_plugins, $rep->hints)) { - if (\strlen($output = $plugin->renderTab($rep))) { - return $output; - } - } - - if (\is_array($rep->contents)) { - $output = ''; - - if ($o instanceof InstanceObject && 'properties' === $rep->getName()) { - foreach (self::sortProperties($rep->contents, self::$sort) as $obj) { - $output .= $this->render($obj); - } - } else { - foreach ($rep->contents as $obj) { - $output .= $this->render($obj); - } - } - - return $output; - } - - if (\is_string($rep->contents)) { - $show_contents = false; - - // If it is the value representation of a string and its whitespace - // was truncated in the header, always display the full string - if ('string' !== $o->type || $o->value !== $rep) { - $show_contents = true; - } else { - if (\preg_match('/(:?[\\r\\n\\t\\f\\v]| {2})/', $rep->contents)) { - $show_contents = true; - } elseif (self::$strlen_max && BlobObject::strlen($o->getValueShort()) > self::$strlen_max) { - $show_contents = true; - } - - if (empty($o->encoding)) { - $show_contents = false; - } - } - - if ($show_contents) { - return '
'.$this->escape($rep->contents)."\n
"; - } - } - - if ($rep->contents instanceof BasicObject) { - return $this->render($rep->contents); - } - } - - protected function getPlugin(array $plugins, array $hints) - { - if ($plugins = $this->matchPlugins($plugins, $hints)) { - $plugin = \end($plugins); - - if (!isset($this->plugin_objs[$plugin])) { - $this->plugin_objs[$plugin] = new $plugin($this); - } - - return $this->plugin_objs[$plugin]; - } - } - - protected static function renderJs() - { - return \file_get_contents(KINT_DIR.'/resources/compiled/shared.js').\file_get_contents(KINT_DIR.'/resources/compiled/rich.js'); - } - - protected static function renderCss() - { - if (\file_exists(KINT_DIR.'/resources/compiled/'.self::$theme)) { - return \file_get_contents(KINT_DIR.'/resources/compiled/'.self::$theme); - } - - return \file_get_contents(self::$theme); - } - - protected static function renderFolder() - { - return '
Kint
'; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Text/BlacklistPlugin.php b/vendor/kint-php/kint/src/Renderer/Text/BlacklistPlugin.php deleted file mode 100644 index 127d32a..0000000 --- a/vendor/kint-php/kint/src/Renderer/Text/BlacklistPlugin.php +++ /dev/null @@ -1,44 +0,0 @@ -depth) { - $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderer->renderHeader($o).' '.$this->renderer->colorValue('BLACKLISTED').PHP_EOL; - - return $out; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Text/DepthLimitPlugin.php b/vendor/kint-php/kint/src/Renderer/Text/DepthLimitPlugin.php deleted file mode 100644 index 310b87e..0000000 --- a/vendor/kint-php/kint/src/Renderer/Text/DepthLimitPlugin.php +++ /dev/null @@ -1,44 +0,0 @@ -depth) { - $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderer->renderHeader($o).' '.$this->renderer->colorValue('DEPTH LIMIT').PHP_EOL; - - return $out; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Text/MicrotimePlugin.php b/vendor/kint-php/kint/src/Renderer/Text/MicrotimePlugin.php deleted file mode 100644 index 9128032..0000000 --- a/vendor/kint-php/kint/src/Renderer/Text/MicrotimePlugin.php +++ /dev/null @@ -1,128 +0,0 @@ -renderer instanceof PlainRenderer) { - $this->useJs = true; - } - } - - public function render(BasicObject $o) - { - $r = $o->getRepresentation('microtime'); - - if (!$r instanceof MicrotimeRepresentation) { - return false; - } - - $out = ''; - - if (0 == $o->depth) { - $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderer->renderHeader($o); - $out .= $this->renderer->renderChildren($o).PHP_EOL; - - $indent = \str_repeat(' ', ($o->depth + 1) * $this->renderer->indent_width); - - if ($this->useJs) { - $out .= ''; - } - - $out .= $indent.$this->renderer->colorType('TIME:').' '; - $out .= $this->renderer->colorValue($r->getDateTime()->format('Y-m-d H:i:s.u')).PHP_EOL; - - if (null !== $r->lap) { - $out .= $indent.$this->renderer->colorType('SINCE LAST CALL:').' '; - - $lap = \round($r->lap, 4); - - if ($this->useJs) { - $lap = ''.$lap.''; - } - - $out .= $this->renderer->colorValue($lap.'s').'.'.PHP_EOL; - } - if (null !== $r->total) { - $out .= $indent.$this->renderer->colorType('SINCE START:').' '; - $out .= $this->renderer->colorValue(\round($r->total, 4).'s').'.'.PHP_EOL; - } - if (null !== $r->avg) { - $out .= $indent.$this->renderer->colorType('AVERAGE DURATION:').' '; - - $avg = \round($r->avg, 4); - - if ($this->useJs) { - $avg = ''.$avg.''; - } - - $out .= $this->renderer->colorValue($avg.'s').'.'.PHP_EOL; - } - - $bytes = Utils::getHumanReadableBytes($r->mem); - $mem = $r->mem.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - $bytes = Utils::getHumanReadableBytes($r->mem_real); - $mem .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - - $out .= $indent.$this->renderer->colorType('MEMORY USAGE:').' '; - $out .= $this->renderer->colorValue($mem).'.'.PHP_EOL; - - $bytes = Utils::getHumanReadableBytes($r->mem_peak); - $mem = $r->mem_peak.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - $bytes = Utils::getHumanReadableBytes($r->mem_peak_real); - $mem .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')'; - - $out .= $indent.$this->renderer->colorType('PEAK MEMORY USAGE:').' '; - $out .= $this->renderer->colorValue($mem).'.'.PHP_EOL; - - if ($this->useJs) { - $out .= ''; - } - - return $out; - } - - public static function renderJs() - { - return RichPlugin::renderJs(); - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Text/Plugin.php b/vendor/kint-php/kint/src/Renderer/Text/Plugin.php deleted file mode 100644 index 9de25c1..0000000 --- a/vendor/kint-php/kint/src/Renderer/Text/Plugin.php +++ /dev/null @@ -1,41 +0,0 @@ -renderer = $r; - } - - abstract public function render(BasicObject $o); -} diff --git a/vendor/kint-php/kint/src/Renderer/Text/RecursionPlugin.php b/vendor/kint-php/kint/src/Renderer/Text/RecursionPlugin.php deleted file mode 100644 index 72c2257..0000000 --- a/vendor/kint-php/kint/src/Renderer/Text/RecursionPlugin.php +++ /dev/null @@ -1,44 +0,0 @@ -depth) { - $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderer->renderHeader($o).' '.$this->renderer->colorValue('RECURSION').PHP_EOL; - - return $out; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/Text/TracePlugin.php b/vendor/kint-php/kint/src/Renderer/Text/TracePlugin.php deleted file mode 100644 index 5833840..0000000 --- a/vendor/kint-php/kint/src/Renderer/Text/TracePlugin.php +++ /dev/null @@ -1,111 +0,0 @@ -depth) { - $out .= $this->renderer->colorTitle($this->renderer->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderer->renderHeader($o).':'.PHP_EOL; - - $indent = \str_repeat(' ', ($o->depth + 1) * $this->renderer->indent_width); - - $i = 1; - foreach ($o->value->contents as $frame) { - $framedesc = $indent.\str_pad($i.': ', 4, ' '); - - if ($frame->trace['file']) { - $framedesc .= $this->renderer->ideLink($frame->trace['file'], $frame->trace['line']).PHP_EOL; - } else { - $framedesc .= 'PHP internal call'.PHP_EOL; - } - - $framedesc .= $indent.' '; - - if ($frame->trace['class']) { - $framedesc .= $this->renderer->escape($frame->trace['class']); - - if ($frame->trace['object']) { - $framedesc .= $this->renderer->escape('->'); - } else { - $framedesc .= '::'; - } - } - - if (\is_string($frame->trace['function'])) { - $framedesc .= $this->renderer->escape($frame->trace['function']).'(...)'; - } elseif ($frame->trace['function'] instanceof MethodObject) { - $framedesc .= $this->renderer->escape($frame->trace['function']->getName()); - $framedesc .= '('.$this->renderer->escape($frame->trace['function']->getParams()).')'; - } - - $out .= $this->renderer->colorType($framedesc).PHP_EOL.PHP_EOL; - - if ($source = $frame->getRepresentation('source')) { - $line_wanted = $source->line; - $source = $source->source; - - // Trim empty lines from the start and end of the source - foreach ($source as $linenum => $line) { - if (\trim($line) || $linenum === $line_wanted) { - break; - } - - unset($source[$linenum]); - } - - foreach (\array_reverse($source, true) as $linenum => $line) { - if (\trim($line) || $linenum === $line_wanted) { - break; - } - - unset($source[$linenum]); - } - - foreach ($source as $lineno => $line) { - if ($lineno == $line_wanted) { - $out .= $indent.$this->renderer->colorValue($this->renderer->escape($line)).PHP_EOL; - } else { - $out .= $indent.$this->renderer->escape($line).PHP_EOL; - } - } - } - - ++$i; - } - - return $out; - } -} diff --git a/vendor/kint-php/kint/src/Renderer/TextRenderer.php b/vendor/kint-php/kint/src/Renderer/TextRenderer.php deleted file mode 100644 index 43b6c40..0000000 --- a/vendor/kint-php/kint/src/Renderer/TextRenderer.php +++ /dev/null @@ -1,346 +0,0 @@ - 'Kint\\Renderer\\Text\\BlacklistPlugin', - 'depth_limit' => 'Kint\\Renderer\\Text\\DepthLimitPlugin', - 'microtime' => 'Kint\\Renderer\\Text\\MicrotimePlugin', - 'recursion' => 'Kint\\Renderer\\Text\\RecursionPlugin', - 'trace' => 'Kint\\Renderer\\Text\\TracePlugin', - ); - - /** - * Parser plugins must be instanceof one of these or - * it will be removed for performance reasons. - */ - public static $parser_plugin_whitelist = array( - 'Kint\\Parser\\BlacklistPlugin', - 'Kint\\Parser\\MicrotimePlugin', - 'Kint\\Parser\\StreamPlugin', - 'Kint\\Parser\\TracePlugin', - ); - - /** - * The maximum length of a string before it is truncated. - * - * Falsey to disable - * - * @var int - */ - public static $strlen_max = 0; - - /** - * The default width of the terminal for headers. - * - * @var int - */ - public static $default_width = 80; - - /** - * Indentation width. - * - * @var int - */ - public static $default_indent = 4; - - /** - * Decorate the header and footer. - * - * @var bool - */ - public static $decorations = true; - - /** - * Sort mode for object properties. - * - * @var int - */ - public static $sort = self::SORT_NONE; - - public $header_width = 80; - public $indent_width = 4; - - protected $plugin_objs = array(); - - public function __construct() - { - $this->header_width = self::$default_width; - $this->indent_width = self::$default_indent; - } - - public function render(BasicObject $o) - { - if ($plugin = $this->getPlugin(self::$plugins, $o->hints)) { - if (\strlen($output = $plugin->render($o))) { - return $output; - } - } - - $out = ''; - - if (0 == $o->depth) { - $out .= $this->colorTitle($this->renderTitle($o)).PHP_EOL; - } - - $out .= $this->renderHeader($o); - $out .= $this->renderChildren($o).PHP_EOL; - - return $out; - } - - public function renderNothing() - { - if (self::$decorations) { - return $this->colorTitle( - $this->boxText('No argument', $this->header_width) - ).PHP_EOL; - } - - return $this->colorTitle('No argument').PHP_EOL; - } - - public function boxText($text, $width) - { - $out = 'ā”Œ'.\str_repeat('─', $width - 2).'┐'.PHP_EOL; - - if (\strlen($text)) { - $text = Utils::truncateString($text, $width - 4); - $text = \str_pad($text, $width - 4); - - $out .= '│ '.$this->escape($text).' │'.PHP_EOL; - } - - $out .= 'ā””'.\str_repeat('─', $width - 2).'ā”˜'; - - return $out; - } - - public function renderTitle(BasicObject $o) - { - $name = (string) $o->getName(); - - if (self::$decorations) { - return $this->boxText($name, $this->header_width); - } - - return Utils::truncateString($name, $this->header_width); - } - - public function renderHeader(BasicObject $o) - { - $output = array(); - - if ($o->depth) { - if (null !== ($s = $o->getModifiers())) { - $output[] = $s; - } - - if (null !== $o->name) { - $output[] = $this->escape(\var_export($o->name, true)); - - if (null !== ($s = $o->getOperator())) { - $output[] = $this->escape($s); - } - } - } - - if (null !== ($s = $o->getType())) { - if ($o->reference) { - $s = '&'.$s; - } - - $output[] = $this->colorType($this->escape($s)); - } - - if (null !== ($s = $o->getSize())) { - $output[] = '('.$this->escape($s).')'; - } - - if (null !== ($s = $o->getValueShort())) { - if (self::$strlen_max) { - $s = Utils::truncateString($s, self::$strlen_max); - } - $output[] = $this->colorValue($this->escape($s)); - } - - return \str_repeat(' ', $o->depth * $this->indent_width).\implode(' ', $output); - } - - public function renderChildren(BasicObject $o) - { - if ('array' === $o->type) { - $output = ' ['; - } elseif ('object' === $o->type) { - $output = ' ('; - } else { - return ''; - } - - $children = ''; - - if ($o->value && \is_array($o->value->contents)) { - if ($o instanceof InstanceObject && 'properties' === $o->value->getName()) { - foreach (self::sortProperties($o->value->contents, self::$sort) as $obj) { - $children .= $this->render($obj); - } - } else { - foreach ($o->value->contents as $child) { - $children .= $this->render($child); - } - } - } - - if ($children) { - $output .= PHP_EOL.$children; - $output .= \str_repeat(' ', $o->depth * $this->indent_width); - } - - if ('array' === $o->type) { - $output .= ']'; - } else { - $output .= ')'; - } - - return $output; - } - - public function colorValue($string) - { - return $string; - } - - public function colorType($string) - { - return $string; - } - - public function colorTitle($string) - { - return $string; - } - - public function postRender() - { - if (self::$decorations) { - $output = \str_repeat('═', $this->header_width); - } else { - $output = ''; - } - - if (!$this->show_trace) { - return $this->colorTitle($output); - } - - if ($output) { - $output .= PHP_EOL; - } - - return $this->colorTitle($output.$this->calledFrom().PHP_EOL); - } - - public function filterParserPlugins(array $plugins) - { - $return = array(); - - foreach ($plugins as $index => $plugin) { - foreach (self::$parser_plugin_whitelist as $whitelist) { - if ($plugin instanceof $whitelist) { - $return[] = $plugin; - continue 2; - } - } - } - - return $return; - } - - public function ideLink($file, $line) - { - return $this->escape(Kint::shortenPath($file)).':'.$line; - } - - public function escape($string, $encoding = false) - { - return $string; - } - - protected function calledFrom() - { - $output = ''; - - if (isset($this->call_info['callee']['file'])) { - $output .= 'Called from '.$this->ideLink( - $this->call_info['callee']['file'], - $this->call_info['callee']['line'] - ); - } - - if (isset($this->call_info['callee']['function']) && ( - !empty($this->call_info['callee']['class']) || - !\in_array( - $this->call_info['callee']['function'], - array('include', 'include_once', 'require', 'require_once'), - true - ) - ) - ) { - $output .= ' ['; - if (isset($this->call_info['callee']['class'])) { - $output .= $this->call_info['callee']['class']; - } - if (isset($this->call_info['callee']['type'])) { - $output .= $this->call_info['callee']['type']; - } - $output .= $this->call_info['callee']['function'].'()]'; - } - - return $output; - } - - protected function getPlugin(array $plugins, array $hints) - { - if ($plugins = $this->matchPlugins($plugins, $hints)) { - $plugin = \end($plugins); - - if (!isset($this->plugin_objs[$plugin])) { - $this->plugin_objs[$plugin] = new $plugin($this); - } - - return $this->plugin_objs[$plugin]; - } - } -} diff --git a/vendor/kint-php/kint/src/Utils.php b/vendor/kint-php/kint/src/Utils.php deleted file mode 100644 index 27a2491..0000000 --- a/vendor/kint-php/kint/src/Utils.php +++ /dev/null @@ -1,240 +0,0 @@ - (float) ($value / \pow(1024, $i)), - 'unit' => $unit[$i], - ); - } - - public static function isSequential(array $array) - { - return \array_keys($array) === \range(0, \count($array) - 1); - } - - public static function composerGetExtras($key = 'kint') - { - $extras = array(); - - if (0 === \strpos(KINT_DIR, 'phar://')) { - // Only run inside phar file, so skip for code coverage - return $extras; // @codeCoverageIgnore - } - - $folder = KINT_DIR.'/vendor'; - - for ($i = 0; $i < 4; ++$i) { - $installed = $folder.'/composer/installed.json'; - - if (\file_exists($installed) && \is_readable($installed)) { - $packages = \json_decode(\file_get_contents($installed), true); - - foreach ($packages as $package) { - if (isset($package['extra'][$key]) && \is_array($package['extra'][$key])) { - $extras = \array_replace($extras, $package['extra'][$key]); - } - } - - $folder = \dirname($folder); - - if (\file_exists($folder.'/composer.json') && \is_readable($folder.'/composer.json')) { - $composer = \json_decode(\file_get_contents($folder.'/composer.json'), true); - - if (isset($composer['extra'][$key]) && \is_array($composer['extra'][$key])) { - $extras = \array_replace($extras, $composer['extra'][$key]); - } - } - - break; - } - - $folder = \dirname($folder); - } - - return $extras; - } - - /** - * @codeCoverageIgnore - */ - public static function composerSkipFlags() - { - $extras = self::composerGetExtras(); - - if (!empty($extras['disable-facade']) && !\defined('KINT_SKIP_FACADE')) { - \define('KINT_SKIP_FACADE', true); - } - - if (!empty($extras['disable-helpers']) && !\defined('KINT_SKIP_HELPERS')) { - \define('KINT_SKIP_HELPERS', true); - } - } - - public static function isTrace(array $trace) - { - if (!self::isSequential($trace)) { - return false; - } - - static $bt_structure = array( - 'function' => 'string', - 'line' => 'integer', - 'file' => 'string', - 'class' => 'string', - 'object' => 'object', - 'type' => 'string', - 'args' => 'array', - ); - - $file_found = false; - - foreach ($trace as $frame) { - if (!\is_array($frame) || !isset($frame['function'])) { - return false; - } - - foreach ($frame as $key => $val) { - if (!isset($bt_structure[$key])) { - return false; - } - - if (\gettype($val) !== $bt_structure[$key]) { - return false; - } - - if ('file' === $key) { - $file_found = true; - } - } - } - - return $file_found; - } - - public static function traceFrameIsListed(array $frame, array $matches) - { - if (isset($frame['class'])) { - $called = array(\strtolower($frame['class']), \strtolower($frame['function'])); - } else { - $called = \strtolower($frame['function']); - } - - return \in_array($called, $matches, true); - } - - public static function normalizeAliases(array &$aliases) - { - static $name_regex = '[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*'; - - foreach ($aliases as $index => &$alias) { - if (\is_array($alias) && 2 === \count($alias)) { - $alias = \array_values(\array_filter($alias, 'is_string')); - - if (2 === \count($alias) && - \preg_match('/^'.$name_regex.'$/', $alias[1]) && - \preg_match('/^\\\\?('.$name_regex.'\\\\)*'.$name_regex.'$/', $alias[0]) - ) { - $alias = array( - \strtolower(\ltrim($alias[0], '\\')), - \strtolower($alias[1]), - ); - } else { - unset($aliases[$index]); - continue; - } - } elseif (\is_string($alias)) { - if (\preg_match('/^\\\\?('.$name_regex.'\\\\)*'.$name_regex.'$/', $alias)) { - $alias = \explode('\\', \strtolower($alias)); - $alias = \end($alias); - } else { - unset($aliases[$index]); - continue; - } - } else { - unset($aliases[$index]); - } - } - - $aliases = \array_values($aliases); - } - - public static function truncateString($input, $length = PHP_INT_MAX, $end = '...', $encoding = false) - { - $length = (int) $length; - $endlength = BlobObject::strlen($end); - - if ($endlength >= $length) { - throw new InvalidArgumentException('Can\'t truncate a string to '.$length.' characters if ending with string '.$endlength.' characters long'); - } - - if (BlobObject::strlen($input, $encoding) > $length) { - return BlobObject::substr($input, 0, $length - $endlength, $encoding).$end; - } - - return $input; - } - - public static function getTypeString(ReflectionType $type) - { - if ($type instanceof ReflectionNamedType) { - return $type->getName(); - } - - return (string) $type; // @codeCoverageIgnore - } -} diff --git a/vendor/laminas/laminas-escaper/CHANGELOG.md b/vendor/laminas/laminas-escaper/CHANGELOG.md deleted file mode 100644 index 086e889..0000000 --- a/vendor/laminas/laminas-escaper/CHANGELOG.md +++ /dev/null @@ -1,73 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file, in reverse chronological order by release. - -## 2.6.1 - 2019-09-05 - -### Added - -- [zendframework/zend-escaper#32](https://github.com/zendframework/zend-escaper/pull/32) adds support for PHP 7.3. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- Nothing. - -## 2.6.0 - 2018-04-25 - -### Added - -- [zendframework/zend-escaper#28](https://github.com/zendframework/zend-escaper/pull/28) adds support for PHP 7.1 and 7.2. - -### Changed - -- [zendframework/zend-escaper#25](https://github.com/zendframework/zend-escaper/pull/25) changes the behavior of the `Escaper` constructor; it now raises an - exception for non-null, non-string `$encoding` arguments. - -### Deprecated - -- Nothing. - -### Removed - -- [zendframework/zend-escaper#28](https://github.com/zendframework/zend-escaper/pull/28) removes support for PHP 5.5. - -- [zendframework/zend-escaper#28](https://github.com/zendframework/zend-escaper/pull/28) removes support for HHVM. - -### Fixed - -- Nothing. - -## 2.5.2 - 2016-06-30 - -### Added - -- [zendframework/zend-escaper#11](https://github.com/zendframework/zend-escaper/pull/11), - [zendframework/zend-escaper#12](https://github.com/zendframework/zend-escaper/pull/12), and - [zendframework/zend-escaper#13](https://github.com/zendframework/zend-escaper/pull/13) prepare and - publish documentation to https://docs.laminas.dev/laminas-escaper/ - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- [zendframework/zend-escaper#3](https://github.com/zendframework/zend-escaper/pull/3) updates the - the escaping mechanism to add support for escaping characters outside the Basic - Multilingual Plane when escaping for JS, CSS, or HTML attributes. diff --git a/vendor/laminas/laminas-escaper/COPYRIGHT.md b/vendor/laminas/laminas-escaper/COPYRIGHT.md deleted file mode 100644 index c4fc4fe..0000000 --- a/vendor/laminas/laminas-escaper/COPYRIGHT.md +++ /dev/null @@ -1,2 +0,0 @@ -Copyright (c) 2019, Laminas Foundation. -All rights reserved. (https://getlaminas.org/) diff --git a/vendor/laminas/laminas-escaper/LICENSE.md b/vendor/laminas/laminas-escaper/LICENSE.md deleted file mode 100644 index 09f53ed..0000000 --- a/vendor/laminas/laminas-escaper/LICENSE.md +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2019, Laminas Foundation -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -- Neither the name of Laminas Foundation nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/laminas/laminas-escaper/README.md b/vendor/laminas/laminas-escaper/README.md deleted file mode 100644 index a779778..0000000 --- a/vendor/laminas/laminas-escaper/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# laminas-escaper - -[![Build Status](https://travis-ci.org/laminas/laminas-escaper.svg?branch=master)](https://travis-ci.org/laminas/laminas-escaper) -[![Coverage Status](https://coveralls.io/repos/github/laminas/laminas-escaper/badge.svg?branch=master)](https://coveralls.io/github/laminas/laminas-escaper?branch=master) - -The OWASP Top 10 web security risks study lists Cross-Site Scripting (XSS) in -second place. PHP’s sole functionality against XSS is limited to two functions -of which one is commonly misapplied. Thus, the laminas-escaper component was written. -It offers developers a way to escape output and defend from XSS and related -vulnerabilities by introducing contextual escaping based on peer-reviewed rules. - -## Installation - -Run the following to install this library: - -```bash -$ composer require laminas/laminas-escaper -``` - -## Documentation - -Browse the documentation online at https://docs.laminas.dev/laminas-escaper/ - -## Support - -* [Issues](https://github.com/laminas/laminas-escaper/issues/) -* [Chat](https://laminas.dev/chat/) -* [Forum](https://discourse.laminas.dev/) diff --git a/vendor/laminas/laminas-escaper/composer.json b/vendor/laminas/laminas-escaper/composer.json deleted file mode 100644 index c39174f..0000000 --- a/vendor/laminas/laminas-escaper/composer.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "laminas/laminas-escaper", - "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", - "license": "BSD-3-Clause", - "keywords": [ - "laminas", - "escaper" - ], - "homepage": "https://laminas.dev", - "support": { - "docs": "https://docs.laminas.dev/laminas-escaper/", - "issues": "https://github.com/laminas/laminas-escaper/issues", - "source": "https://github.com/laminas/laminas-escaper", - "rss": "https://github.com/laminas/laminas-escaper/releases.atom", - "chat": "https://laminas.dev/chat", - "forum": "https://discourse.laminas.dev" - }, - "config": { - "sort-packages": true - }, - "extra": { - "branch-alias": { - "dev-master": "2.6.x-dev", - "dev-develop": "2.7.x-dev" - } - }, - "require": { - "php": "^5.6 || ^7.0", - "laminas/laminas-zendframework-bridge": "^1.0" - }, - "require-dev": { - "laminas/laminas-coding-standard": "~1.0.0", - "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2" - }, - "autoload": { - "psr-4": { - "Laminas\\Escaper\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "LaminasTest\\Escaper\\": "test/" - } - }, - "scripts": { - "check": [ - "@cs-check", - "@test" - ], - "cs-check": "phpcs", - "cs-fix": "phpcbf", - "test": "phpunit --colors=always", - "test-coverage": "phpunit --colors=always --coverage-clover clover.xml" - }, - "replace": { - "zendframework/zend-escaper": "self.version" - } -} diff --git a/vendor/laminas/laminas-escaper/src/Escaper.php b/vendor/laminas/laminas-escaper/src/Escaper.php deleted file mode 100644 index 9f903a5..0000000 --- a/vendor/laminas/laminas-escaper/src/Escaper.php +++ /dev/null @@ -1,391 +0,0 @@ - 'quot', // quotation mark - 38 => 'amp', // ampersand - 60 => 'lt', // less-than sign - 62 => 'gt', // greater-than sign - ]; - - /** - * Current encoding for escaping. If not UTF-8, we convert strings from this encoding - * pre-escaping and back to this encoding post-escaping. - * - * @var string - */ - protected $encoding = 'utf-8'; - - /** - * Holds the value of the special flags passed as second parameter to - * htmlspecialchars(). - * - * @var int - */ - protected $htmlSpecialCharsFlags; - - /** - * Static Matcher which escapes characters for HTML Attribute contexts - * - * @var callable - */ - protected $htmlAttrMatcher; - - /** - * Static Matcher which escapes characters for Javascript contexts - * - * @var callable - */ - protected $jsMatcher; - - /** - * Static Matcher which escapes characters for CSS Attribute contexts - * - * @var callable - */ - protected $cssMatcher; - - /** - * List of all encoding supported by this class - * - * @var array - */ - protected $supportedEncodings = [ - 'iso-8859-1', 'iso8859-1', 'iso-8859-5', 'iso8859-5', - 'iso-8859-15', 'iso8859-15', 'utf-8', 'cp866', - 'ibm866', '866', 'cp1251', 'windows-1251', - 'win-1251', '1251', 'cp1252', 'windows-1252', - '1252', 'koi8-r', 'koi8-ru', 'koi8r', - 'big5', '950', 'gb2312', '936', - 'big5-hkscs', 'shift_jis', 'sjis', 'sjis-win', - 'cp932', '932', 'euc-jp', 'eucjp', - 'eucjp-win', 'macroman' - ]; - - /** - * Constructor: Single parameter allows setting of global encoding for use by - * the current object. - * - * @param string $encoding - * @throws Exception\InvalidArgumentException - */ - public function __construct($encoding = null) - { - if ($encoding !== null) { - if (! is_string($encoding)) { - throw new Exception\InvalidArgumentException( - get_class($this) . ' constructor parameter must be a string, received ' . gettype($encoding) - ); - } - if ($encoding === '') { - throw new Exception\InvalidArgumentException( - get_class($this) . ' constructor parameter does not allow a blank value' - ); - } - - $encoding = strtolower($encoding); - if (! in_array($encoding, $this->supportedEncodings)) { - throw new Exception\InvalidArgumentException( - 'Value of \'' . $encoding . '\' passed to ' . get_class($this) - . ' constructor parameter is invalid. Provide an encoding supported by htmlspecialchars()' - ); - } - - $this->encoding = $encoding; - } - - // We take advantage of ENT_SUBSTITUTE flag to correctly deal with invalid UTF-8 sequences. - $this->htmlSpecialCharsFlags = ENT_QUOTES | ENT_SUBSTITUTE; - - // set matcher callbacks - $this->htmlAttrMatcher = [$this, 'htmlAttrMatcher']; - $this->jsMatcher = [$this, 'jsMatcher']; - $this->cssMatcher = [$this, 'cssMatcher']; - } - - /** - * Return the encoding that all output/input is expected to be encoded in. - * - * @return string - */ - public function getEncoding() - { - return $this->encoding; - } - - /** - * Escape a string for the HTML Body context where there are very few characters - * of special meaning. Internally this will use htmlspecialchars(). - * - * @param string $string - * @return string - */ - public function escapeHtml($string) - { - return htmlspecialchars($string, $this->htmlSpecialCharsFlags, $this->encoding); - } - - /** - * Escape a string for the HTML Attribute context. We use an extended set of characters - * to escape that are not covered by htmlspecialchars() to cover cases where an attribute - * might be unquoted or quoted illegally (e.g. backticks are valid quotes for IE). - * - * @param string $string - * @return string - */ - public function escapeHtmlAttr($string) - { - $string = $this->toUtf8($string); - if ($string === '' || ctype_digit($string)) { - return $string; - } - - $result = preg_replace_callback('/[^a-z0-9,\.\-_]/iSu', $this->htmlAttrMatcher, $string); - return $this->fromUtf8($result); - } - - /** - * Escape a string for the Javascript context. This does not use json_encode(). An extended - * set of characters are escaped beyond ECMAScript's rules for Javascript literal string - * escaping in order to prevent misinterpretation of Javascript as HTML leading to the - * injection of special characters and entities. The escaping used should be tolerant - * of cases where HTML escaping was not applied on top of Javascript escaping correctly. - * Backslash escaping is not used as it still leaves the escaped character as-is and so - * is not useful in a HTML context. - * - * @param string $string - * @return string - */ - public function escapeJs($string) - { - $string = $this->toUtf8($string); - if ($string === '' || ctype_digit($string)) { - return $string; - } - - $result = preg_replace_callback('/[^a-z0-9,\._]/iSu', $this->jsMatcher, $string); - return $this->fromUtf8($result); - } - - /** - * Escape a string for the URI or Parameter contexts. This should not be used to escape - * an entire URI - only a subcomponent being inserted. The function is a simple proxy - * to rawurlencode() which now implements RFC 3986 since PHP 5.3 completely. - * - * @param string $string - * @return string - */ - public function escapeUrl($string) - { - return rawurlencode($string); - } - - /** - * Escape a string for the CSS context. CSS escaping can be applied to any string being - * inserted into CSS and escapes everything except alphanumerics. - * - * @param string $string - * @return string - */ - public function escapeCss($string) - { - $string = $this->toUtf8($string); - if ($string === '' || ctype_digit($string)) { - return $string; - } - - $result = preg_replace_callback('/[^a-z0-9]/iSu', $this->cssMatcher, $string); - return $this->fromUtf8($result); - } - - /** - * Callback function for preg_replace_callback that applies HTML Attribute - * escaping to all matches. - * - * @param array $matches - * @return string - */ - protected function htmlAttrMatcher($matches) - { - $chr = $matches[0]; - $ord = ord($chr); - - /** - * The following replaces characters undefined in HTML with the - * hex entity for the Unicode replacement character. - */ - if (($ord <= 0x1f && $chr != "\t" && $chr != "\n" && $chr != "\r") - || ($ord >= 0x7f && $ord <= 0x9f) - ) { - return '�'; - } - - /** - * Check if the current character to escape has a name entity we should - * replace it with while grabbing the integer value of the character. - */ - if (strlen($chr) > 1) { - $chr = $this->convertEncoding($chr, 'UTF-32BE', 'UTF-8'); - } - - $hex = bin2hex($chr); - $ord = hexdec($hex); - if (isset(static::$htmlNamedEntityMap[$ord])) { - return '&' . static::$htmlNamedEntityMap[$ord] . ';'; - } - - /** - * Per OWASP recommendations, we'll use upper hex entities - * for any other characters where a named entity does not exist. - */ - if ($ord > 255) { - return sprintf('&#x%04X;', $ord); - } - return sprintf('&#x%02X;', $ord); - } - - /** - * Callback function for preg_replace_callback that applies Javascript - * escaping to all matches. - * - * @param array $matches - * @return string - */ - protected function jsMatcher($matches) - { - $chr = $matches[0]; - if (strlen($chr) == 1) { - return sprintf('\\x%02X', ord($chr)); - } - $chr = $this->convertEncoding($chr, 'UTF-16BE', 'UTF-8'); - $hex = strtoupper(bin2hex($chr)); - if (strlen($hex) <= 4) { - return sprintf('\\u%04s', $hex); - } - $highSurrogate = substr($hex, 0, 4); - $lowSurrogate = substr($hex, 4, 4); - return sprintf('\\u%04s\\u%04s', $highSurrogate, $lowSurrogate); - } - - /** - * Callback function for preg_replace_callback that applies CSS - * escaping to all matches. - * - * @param array $matches - * @return string - */ - protected function cssMatcher($matches) - { - $chr = $matches[0]; - if (strlen($chr) == 1) { - $ord = ord($chr); - } else { - $chr = $this->convertEncoding($chr, 'UTF-32BE', 'UTF-8'); - $ord = hexdec(bin2hex($chr)); - } - return sprintf('\\%X ', $ord); - } - - /** - * Converts a string to UTF-8 from the base encoding. The base encoding is set via this - * class' constructor. - * - * @param string $string - * @throws Exception\RuntimeException - * @return string - */ - protected function toUtf8($string) - { - if ($this->getEncoding() === 'utf-8') { - $result = $string; - } else { - $result = $this->convertEncoding($string, 'UTF-8', $this->getEncoding()); - } - - if (! $this->isUtf8($result)) { - throw new Exception\RuntimeException( - sprintf('String to be escaped was not valid UTF-8 or could not be converted: %s', $result) - ); - } - - return $result; - } - - /** - * Converts a string from UTF-8 to the base encoding. The base encoding is set via this - * class' constructor. - * @param string $string - * @return string - */ - protected function fromUtf8($string) - { - if ($this->getEncoding() === 'utf-8') { - return $string; - } - - return $this->convertEncoding($string, $this->getEncoding(), 'UTF-8'); - } - - /** - * Checks if a given string appears to be valid UTF-8 or not. - * - * @param string $string - * @return bool - */ - protected function isUtf8($string) - { - return ($string === '' || preg_match('/^./su', $string)); - } - - /** - * Encoding conversion helper which wraps iconv and mbstring where they exist or throws - * and exception where neither is available. - * - * @param string $string - * @param string $to - * @param array|string $from - * @throws Exception\RuntimeException - * @return string - */ - protected function convertEncoding($string, $to, $from) - { - if (function_exists('iconv')) { - $result = iconv($from, $to, $string); - } elseif (function_exists('mb_convert_encoding')) { - $result = mb_convert_encoding($string, $to, $from); - } else { - throw new Exception\RuntimeException( - get_class($this) - . ' requires either the iconv or mbstring extension to be installed' - . ' when escaping for non UTF-8 strings.' - ); - } - - if ($result === false) { - return ''; // return non-fatal blank string on encoding errors from users - } - return $result; - } -} diff --git a/vendor/laminas/laminas-escaper/src/Exception/ExceptionInterface.php b/vendor/laminas/laminas-escaper/src/Exception/ExceptionInterface.php deleted file mode 100644 index 7ebe04e..0000000 --- a/vendor/laminas/laminas-escaper/src/Exception/ExceptionInterface.php +++ /dev/null @@ -1,13 +0,0 @@ - laminas-project.flf. - -## 0.3.5 - 2019-11-06 - -### Added - -- Nothing. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- [#25](https://github.com/laminas/laminas-zendframework-bridge/pull/25) adds entries for ZendHttp and ZendModule, which are file name segments in files from the zend-feed and zend-config-aggregator-module packages, respectively. - -## 0.3.4 - 2019-11-06 - -### Added - -- Nothing. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- [#24](https://github.com/laminas/laminas-zendframework-bridge/pull/24) adds a rule to never rewrite the string `Doctrine\Zend`. - -- [#23](https://github.com/laminas/laminas-zendframework-bridge/pull/23) adds a missing map for each of ZendAcl and ZendRbac, which occur in the zend-expressive-authorization-acl and zend-expressive-authorization-rbac packages, respectively. - -## 0.3.3 - 2019-11-06 - -### Added - -- [#22](https://github.com/laminas/laminas-zendframework-bridge/pull/22) adds configuration post-processing features, exposed both as a laminas-config-aggregator post processor (for use with Expressive applications) and as a laminas-modulemanager `EVENT_MERGE_CONFIG` listener (for use with MVC applications). When registered, it will post-process the configuration, replacing known Zend Framework-specific strings with their Laminas replacements. A ruleset is provided that ensures dependency configuration is rewritten in a safe manner, routing configuration is skipped, and certain top-level configuration keys are matched exactly (instead of potentially as substrings or word stems). A later release of laminas-migration will auto-register these tools in applications when possible. - -### Changed - -- [#22](https://github.com/laminas/laminas-zendframework-bridge/pull/22) removes support for PHP versions prior to PHP 5.6. We have decided to only support supported PHP versions, whether that support is via php.net or commercial. The lowest supported PHP version we have found is 5.6. Users wishing to migrate to Laminas must at least update to PHP 5.6 before doing so. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- Nothing. - -## 0.3.2 - 2019-10-30 - -### Added - -- Nothing. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- [#21](https://github.com/laminas/laminas-zendframework-bridge/pull/21) removes rewriting of the Amazon library, as it is not moving to Laminas. - -- [#21](https://github.com/laminas/laminas-zendframework-bridge/pull/21) removes rewriting of the GCM and APNS libraries, as they are not moving to Laminas. - -### Fixed - -- [#21](https://github.com/laminas/laminas-zendframework-bridge/pull/21) fixes how the recaptcha and twitter library package and namespaces are rewritten. - -## 0.3.1 - 2019-04-25 - -### Added - -- [#20](https://github.com/laminas/laminas-zendframework-bridge/pull/20) provides an additional autoloader that is _prepended_ to the autoloader - stack. This new autoloader will create class aliases for interfaces, classes, - and traits referenced in type hints and class declarations, ensuring PHP is - able to resolve them correctly during class_alias operations. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- Nothing. - -## 0.3.0 - 2019-04-12 - -### Added - -- Nothing. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- [#16](https://github.com/laminas/laminas-zendframework-bridge/pull/16) removes the `RewriteRules::classRewrite()` method, as it is no longer - needed due to internal refactoring. - -### Fixed - -- [#16](https://github.com/laminas/laminas-zendframework-bridge/pull/16) fixes how the rewrite rules detect the word `Zend` in subnamespaces and - class names to be both more robust and simpler. - -## 0.2.5 - 2019-04-11 - -### Added - -- [#12](https://github.com/laminas/laminas-zendframework-bridge/pull/12) adds functionality for ensuring we alias namespaces and classes that - include the word `Zend` in them; e.g., `Zend\Expressive\ZendView\ZendViewRendererFactory` - will now alias to `Expressive\LaminasView\LaminasViewRendererFactory`. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- Nothing. - -## 0.2.4 - 2019-04-11 - -### Added - -- [#11](https://github.com/laminas/laminas-zendframework-bridge/pull/11) adds maps for the Expressive router adapter packages. - -- [#10](https://github.com/laminas/laminas-zendframework-bridge/pull/10) adds a map for the Psr7Bridge package, as it used `Zend` within a subnamespace. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- Nothing. - -## 0.2.3 - 2019-04-10 - -### Added - -- Nothing. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- [#9](https://github.com/laminas/laminas-zendframework-bridge/pull/9) fixes the mapping for the Problem Details package. - -## 0.2.2 - 2019-04-10 - -### Added - -- Nothing. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- Added a check that the discovered alias exists as a class, interface, or trait - before attempting to call `class_alias()`. - -## 0.2.1 - 2019-04-10 - -### Added - -- Nothing. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- [#8](https://github.com/laminas/laminas-zendframework-bridge/pull/8) fixes mappings for each of zend-expressive-authentication-zendauthentication, - zend-expressive-zendrouter, and zend-expressive-zendviewrenderer. - -## 0.2.0 - 2019-04-01 - -### Added - -- Nothing. - -### Changed - -- [#4](https://github.com/laminas/laminas-zendframework-bridge/pull/4) rewrites the autoloader to be class-based, via the class - `Laminas\ZendFrameworkBridge\Autoloader`. Additionally, the new approach - provides a performance boost by using a balanced tree algorithm, ensuring - matches occur faster. - -### Deprecated - -- Nothing. - -### Removed - -- [#4](https://github.com/laminas/laminas-zendframework-bridge/pull/4) removes function aliasing. Function aliasing will move to the packages that - provide functions. - -### Fixed - -- Nothing. - -## 0.1.0 - 2019-03-27 - -### Added - -- Adds an autoloader file that registers with `spl_autoload_register` a routine - for aliasing legacy ZF class/interface/trait names to Laminas Project - equivalents. - -- Adds autoloader files for aliasing legacy ZF package functions to Laminas - Project equivalents. - -### Changed - -- Nothing. - -### Deprecated - -- Nothing. - -### Removed - -- Nothing. - -### Fixed - -- Nothing. diff --git a/vendor/laminas/laminas-zendframework-bridge/COPYRIGHT.md b/vendor/laminas/laminas-zendframework-bridge/COPYRIGHT.md deleted file mode 100644 index 0a8cccc..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/COPYRIGHT.md +++ /dev/null @@ -1 +0,0 @@ -Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. (https://getlaminas.org/) diff --git a/vendor/laminas/laminas-zendframework-bridge/LICENSE.md b/vendor/laminas/laminas-zendframework-bridge/LICENSE.md deleted file mode 100644 index 10b40f1..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/LICENSE.md +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -- Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -- Neither the name of Laminas Foundation nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/laminas/laminas-zendframework-bridge/README.md b/vendor/laminas/laminas-zendframework-bridge/README.md deleted file mode 100644 index fd79538..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# laminas-zendframework-bridge - -[![Build Status](https://travis-ci.com/laminas/laminas-zendframework-bridge.svg?branch=master)](https://travis-ci.com/laminas/laminas-zendframework-bridge) -[![Coverage Status](https://coveralls.io/repos/github/laminas/laminas-zendframework-bridge/badge.svg?branch=master)](https://coveralls.io/github/laminas/laminas-zendframework-bridge?branch=master) - -This library provides a custom autoloader that aliases legacy Zend Framework, -Apigility, and Expressive classes to their replacements under the Laminas -Project. - -This package should be installed only if you are also using the composer plugin -that installs Laminas packages to replace ZF/Apigility/Expressive packages. - -## Installation - -Run the following to install this library: - -```bash -$ composer require laminas/laminas-zendframework-bridge -``` - -## Support - -* [Issues](https://github.com/laminas/laminas-zendframework-bridge/issues/) -* [Forum](https://discourse.laminas.dev/) diff --git a/vendor/laminas/laminas-zendframework-bridge/composer.json b/vendor/laminas/laminas-zendframework-bridge/composer.json deleted file mode 100644 index 34af15a..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/composer.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "laminas/laminas-zendframework-bridge", - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "license": "BSD-3-Clause", - "keywords": [ - "autoloading", - "laminas", - "zf", - "zendframework" - ], - "support": { - "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", - "source": "https://github.com/laminas/laminas-zendframework-bridge", - "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", - "forum": "https://discourse.laminas.dev/" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "autoload-dev": { - "files": [ - "test/classes.php" - ], - "psr-4": { - "LaminasTest\\ZendFrameworkBridge\\": "test/", - "LaminasTest\\ZendFrameworkBridge\\TestAsset\\": "test/TestAsset/classes/", - "Laminas\\ApiTools\\": "test/TestAsset/LaminasApiTools/", - "Mezzio\\": "test/TestAsset/Mezzio/", - "Laminas\\": "test/TestAsset/Laminas/" - } - }, - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "config": { - "sort-packages": true - }, - "scripts": { - "cs-check": "phpcs", - "cs-fix": "phpcbf", - "test": "phpunit --colors=always", - "test-coverage": "phpunit --colors=always --coverage-clover clover.xml" - } -} diff --git a/vendor/laminas/laminas-zendframework-bridge/config/replacements.php b/vendor/laminas/laminas-zendframework-bridge/config/replacements.php deleted file mode 100644 index f534435..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/config/replacements.php +++ /dev/null @@ -1,372 +0,0 @@ - 'zendframework/zendframework', - 'zend-developer-tools/toolbar/bjy' => 'zend-developer-tools/toolbar/bjy', - 'zend-developer-tools/toolbar/doctrine' => 'zend-developer-tools/toolbar/doctrine', - - // NAMESPACES - // Zend Framework components - 'Zend\\AuraDi\\Config' => 'Laminas\\AuraDi\\Config', - 'Zend\\Authentication' => 'Laminas\\Authentication', - 'Zend\\Barcode' => 'Laminas\\Barcode', - 'Zend\\Cache' => 'Laminas\\Cache', - 'Zend\\Captcha' => 'Laminas\\Captcha', - 'Zend\\Code' => 'Laminas\\Code', - 'ZendCodingStandard\\Sniffs' => 'LaminasCodingStandard\\Sniffs', - 'ZendCodingStandard\\Utils' => 'LaminasCodingStandard\\Utils', - 'Zend\\ComponentInstaller' => 'Laminas\\ComponentInstaller', - 'Zend\\Config' => 'Laminas\\Config', - 'Zend\\ConfigAggregator' => 'Laminas\\ConfigAggregator', - 'Zend\\ConfigAggregatorModuleManager' => 'Laminas\\ConfigAggregatorModuleManager', - 'Zend\\ConfigAggregatorParameters' => 'Laminas\\ConfigAggregatorParameters', - 'Zend\\Console' => 'Laminas\\Console', - 'Zend\\ContainerConfigTest' => 'Laminas\\ContainerConfigTest', - 'Zend\\Crypt' => 'Laminas\\Crypt', - 'Zend\\Db' => 'Laminas\\Db', - 'ZendDeveloperTools' => 'Laminas\\DeveloperTools', - 'Zend\\Di' => 'Laminas\\Di', - 'Zend\\Diactoros' => 'Laminas\\Diactoros', - 'ZendDiagnostics\\Check' => 'Laminas\\Diagnostics\\Check', - 'ZendDiagnostics\\Result' => 'Laminas\\Diagnostics\\Result', - 'ZendDiagnostics\\Runner' => 'Laminas\\Diagnostics\\Runner', - 'Zend\\Dom' => 'Laminas\\Dom', - 'Zend\\Escaper' => 'Laminas\\Escaper', - 'Zend\\EventManager' => 'Laminas\\EventManager', - 'Zend\\Feed' => 'Laminas\\Feed', - 'Zend\\File' => 'Laminas\\File', - 'Zend\\Filter' => 'Laminas\\Filter', - 'Zend\\Form' => 'Laminas\\Form', - 'Zend\\Http' => 'Laminas\\Http', - 'Zend\\HttpHandlerRunner' => 'Laminas\\HttpHandlerRunner', - 'Zend\\Hydrator' => 'Laminas\\Hydrator', - 'Zend\\I18n' => 'Laminas\\I18n', - 'Zend\\InputFilter' => 'Laminas\\InputFilter', - 'Zend\\Json' => 'Laminas\\Json', - 'Zend\\Ldap' => 'Laminas\\Ldap', - 'Zend\\Loader' => 'Laminas\\Loader', - 'Zend\\Log' => 'Laminas\\Log', - 'Zend\\Mail' => 'Laminas\\Mail', - 'Zend\\Math' => 'Laminas\\Math', - 'Zend\\Memory' => 'Laminas\\Memory', - 'Zend\\Mime' => 'Laminas\\Mime', - 'Zend\\ModuleManager' => 'Laminas\\ModuleManager', - 'Zend\\Mvc' => 'Laminas\\Mvc', - 'Zend\\Navigation' => 'Laminas\\Navigation', - 'Zend\\Paginator' => 'Laminas\\Paginator', - 'Zend\\Permissions' => 'Laminas\\Permissions', - 'Zend\\Pimple\\Config' => 'Laminas\\Pimple\\Config', - 'Zend\\ProblemDetails' => 'Mezzio\\ProblemDetails', - 'Zend\\ProgressBar' => 'Laminas\\ProgressBar', - 'Zend\\Psr7Bridge' => 'Laminas\\Psr7Bridge', - 'Zend\\Router' => 'Laminas\\Router', - 'Zend\\Serializer' => 'Laminas\\Serializer', - 'Zend\\Server' => 'Laminas\\Server', - 'Zend\\ServiceManager' => 'Laminas\\ServiceManager', - 'ZendService\\ReCaptcha' => 'Laminas\\ReCaptcha', - 'ZendService\\Twitter' => 'Laminas\\Twitter', - 'Zend\\Session' => 'Laminas\\Session', - 'Zend\\SkeletonInstaller' => 'Laminas\\SkeletonInstaller', - 'Zend\\Soap' => 'Laminas\\Soap', - 'Zend\\Stdlib' => 'Laminas\\Stdlib', - 'Zend\\Stratigility' => 'Laminas\\Stratigility', - 'Zend\\Tag' => 'Laminas\\Tag', - 'Zend\\Test' => 'Laminas\\Test', - 'Zend\\Text' => 'Laminas\\Text', - 'Zend\\Uri' => 'Laminas\\Uri', - 'Zend\\Validator' => 'Laminas\\Validator', - 'Zend\\View' => 'Laminas\\View', - 'ZendXml' => 'Laminas\\Xml', - 'Zend\\Xml2Json' => 'Laminas\\Xml2Json', - 'Zend\\XmlRpc' => 'Laminas\\XmlRpc', - 'ZendOAuth' => 'Laminas\\OAuth', - - // class ZendAcl in zend-expressive-authorization-acl - 'ZendAcl' => 'LaminasAcl', - 'Zend\\Expressive\\Authorization\\Acl\\ZendAcl' => 'Mezzio\\Authorization\\Acl\\LaminasAcl', - // class ZendHttpClientDecorator in zend-feed - 'ZendHttp' => 'LaminasHttp', - // class ZendModuleProvider in zend-config-aggregator-modulemanager - 'ZendModule' => 'LaminasModule', - // class ZendRbac in zend-expressive-authorization-rbac - 'ZendRbac' => 'LaminasRbac', - 'Zend\\Expressive\\Authorization\\Rbac\\ZendRbac' => 'Mezzio\\Authorization\\Rbac\\LaminasRbac', - // class ZendRouter in zend-expressive-router-zendrouter - 'ZendRouter' => 'LaminasRouter', - 'Zend\\Expressive\\Router\\ZendRouter' => 'Mezzio\\Router\\LaminasRouter', - // class ZendViewRenderer in zend-expressive-zendviewrenderer - 'ZendViewRenderer' => 'LaminasViewRenderer', - 'Zend\\Expressive\\ZendView\\ZendViewRenderer' => 'Mezzio\\LaminasView\\LaminasViewRenderer', - 'a\\Zend' => 'a\\Zend', - 'b\\Zend' => 'b\\Zend', - 'c\\Zend' => 'c\\Zend', - 'd\\Zend' => 'd\\Zend', - 'e\\Zend' => 'e\\Zend', - 'f\\Zend' => 'f\\Zend', - 'g\\Zend' => 'g\\Zend', - 'h\\Zend' => 'h\\Zend', - 'i\\Zend' => 'i\\Zend', - 'j\\Zend' => 'j\\Zend', - 'k\\Zend' => 'k\\Zend', - 'l\\Zend' => 'l\\Zend', - 'm\\Zend' => 'm\\Zend', - 'n\\Zend' => 'n\\Zend', - 'o\\Zend' => 'o\\Zend', - 'p\\Zend' => 'p\\Zend', - 'q\\Zend' => 'q\\Zend', - 'r\\Zend' => 'r\\Zend', - 's\\Zend' => 's\\Zend', - 't\\Zend' => 't\\Zend', - 'u\\Zend' => 'u\\Zend', - 'v\\Zend' => 'v\\Zend', - 'w\\Zend' => 'w\\Zend', - 'x\\Zend' => 'x\\Zend', - 'y\\Zend' => 'y\\Zend', - 'z\\Zend' => 'z\\Zend', - - // Expressive - 'Zend\\Expressive' => 'Mezzio', - 'ZendAuthentication' => 'LaminasAuthentication', - 'ZendAcl' => 'LaminasAcl', - 'ZendRbac' => 'LaminasRbac', - 'ZendRouter' => 'LaminasRouter', - 'ExpressiveUrlGenerator' => 'MezzioUrlGenerator', - 'ExpressiveInstaller' => 'MezzioInstaller', - - // Apigility - 'ZF\\Apigility' => 'Laminas\\ApiTools', - 'ZF\\ApiProblem' => 'Laminas\\ApiTools\\ApiProblem', - 'ZF\\AssetManager' => 'Laminas\\ApiTools\\AssetManager', - 'ZF\\ComposerAutoloading' => 'Laminas\\ComposerAutoloading', - 'ZF\\Configuration' => 'Laminas\\ApiTools\\Configuration', - 'ZF\\ContentNegotiation' => 'Laminas\\ApiTools\\ContentNegotiation', - 'ZF\\ContentValidation' => 'Laminas\\ApiTools\\ContentValidation', - 'ZF\\DevelopmentMode' => 'Laminas\\DevelopmentMode', - 'ZF\\Doctrine\\QueryBuilder' => 'Laminas\\ApiTools\\Doctrine\\QueryBuilder', - 'ZF\\Hal' => 'Laminas\\ApiTools\\Hal', - 'ZF\\HttpCache' => 'Laminas\\ApiTools\\HttpCache', - 'ZF\\MvcAuth' => 'Laminas\\ApiTools\\MvcAuth', - 'ZF\\OAuth2' => 'Laminas\\ApiTools\\OAuth2', - 'ZF\\Rest' => 'Laminas\\ApiTools\\Rest', - 'ZF\\Rpc' => 'Laminas\\ApiTools\\Rpc', - 'ZF\\Versioning' => 'Laminas\\ApiTools\\Versioning', - 'a\\ZF' => 'a\\ZF', - 'b\\ZF' => 'b\\ZF', - 'c\\ZF' => 'c\\ZF', - 'd\\ZF' => 'd\\ZF', - 'e\\ZF' => 'e\\ZF', - 'f\\ZF' => 'f\\ZF', - 'g\\ZF' => 'g\\ZF', - 'h\\ZF' => 'h\\ZF', - 'i\\ZF' => 'i\\ZF', - 'j\\ZF' => 'j\\ZF', - 'k\\ZF' => 'k\\ZF', - 'l\\ZF' => 'l\\ZF', - 'm\\ZF' => 'm\\ZF', - 'n\\ZF' => 'n\\ZF', - 'o\\ZF' => 'o\\ZF', - 'p\\ZF' => 'p\\ZF', - 'q\\ZF' => 'q\\ZF', - 'r\\ZF' => 'r\\ZF', - 's\\ZF' => 's\\ZF', - 't\\ZF' => 't\\ZF', - 'u\\ZF' => 'u\\ZF', - 'v\\ZF' => 'v\\ZF', - 'w\\ZF' => 'w\\ZF', - 'x\\ZF' => 'x\\ZF', - 'y\\ZF' => 'y\\ZF', - 'z\\ZF' => 'z\\ZF', - - 'ApigilityModuleInterface' => 'ApiToolsModuleInterface', - 'ApigilityProviderInterface' => 'ApiToolsProviderInterface', - 'ApigilityVersionController' => 'ApiToolsVersionController', - - // PACKAGES - // ZF components, MVC - 'zendframework/skeleton-application' => 'laminas/skeleton-application', - 'zendframework/zend-auradi-config' => 'laminas/laminas-auradi-config', - 'zendframework/zend-authentication' => 'laminas/laminas-authentication', - 'zendframework/zend-barcode' => 'laminas/laminas-barcode', - 'zendframework/zend-cache' => 'laminas/laminas-cache', - 'zendframework/zend-captcha' => 'laminas/laminas-captcha', - 'zendframework/zend-code' => 'laminas/laminas-code', - 'zendframework/zend-coding-standard' => 'laminas/laminas-coding-standard', - 'zendframework/zend-component-installer' => 'laminas/laminas-component-installer', - 'zendframework/zend-composer-autoloading' => 'laminas/laminas-composer-autoloading', - 'zendframework/zend-config-aggregator' => 'laminas/laminas-config-aggregator', - 'zendframework/zend-config' => 'laminas/laminas-config', - 'zendframework/zend-console' => 'laminas/laminas-console', - 'zendframework/zend-container-config-test' => 'laminas/laminas-container-config-test', - 'zendframework/zend-crypt' => 'laminas/laminas-crypt', - 'zendframework/zend-db' => 'laminas/laminas-db', - 'zendframework/zend-developer-tools' => 'laminas/laminas-developer-tools', - 'zendframework/zend-diactoros' => 'laminas/laminas-diactoros', - 'zendframework/zenddiagnostics' => 'laminas/laminas-diagnostics', - 'zendframework/zend-di' => 'laminas/laminas-di', - 'zendframework/zend-dom' => 'laminas/laminas-dom', - 'zendframework/zend-escaper' => 'laminas/laminas-escaper', - 'zendframework/zend-eventmanager' => 'laminas/laminas-eventmanager', - 'zendframework/zend-feed' => 'laminas/laminas-feed', - 'zendframework/zend-file' => 'laminas/laminas-file', - 'zendframework/zend-filter' => 'laminas/laminas-filter', - 'zendframework/zend-form' => 'laminas/laminas-form', - 'zendframework/zend-httphandlerrunner' => 'laminas/laminas-httphandlerrunner', - 'zendframework/zend-http' => 'laminas/laminas-http', - 'zendframework/zend-hydrator' => 'laminas/laminas-hydrator', - 'zendframework/zend-i18n' => 'laminas/laminas-i18n', - 'zendframework/zend-i18n-resources' => 'laminas/laminas-i18n-resources', - 'zendframework/zend-inputfilter' => 'laminas/laminas-inputfilter', - 'zendframework/zend-json' => 'laminas/laminas-json', - 'zendframework/zend-json-server' => 'laminas/laminas-json-server', - 'zendframework/zend-ldap' => 'laminas/laminas-ldap', - 'zendframework/zend-loader' => 'laminas/laminas-loader', - 'zendframework/zend-log' => 'laminas/laminas-log', - 'zendframework/zend-mail' => 'laminas/laminas-mail', - 'zendframework/zend-math' => 'laminas/laminas-math', - 'zendframework/zend-memory' => 'laminas/laminas-memory', - 'zendframework/zend-mime' => 'laminas/laminas-mime', - 'zendframework/zend-modulemanager' => 'laminas/laminas-modulemanager', - 'zendframework/zend-mvc' => 'laminas/laminas-mvc', - 'zendframework/zend-navigation' => 'laminas/laminas-navigation', - 'zendframework/zend-oauth' => 'laminas/laminas-oauth', - 'zendframework/zend-paginator' => 'laminas/laminas-paginator', - 'zendframework/zend-permissions-acl' => 'laminas/laminas-permissions-acl', - 'zendframework/zend-permissions-rbac' => 'laminas/laminas-permissions-rbac', - 'zendframework/zend-pimple-config' => 'laminas/laminas-pimple-config', - 'zendframework/zend-progressbar' => 'laminas/laminas-progressbar', - 'zendframework/zend-psr7bridge' => 'laminas/laminas-psr7bridge', - 'zendframework/zend-recaptcha' => 'laminas/laminas-recaptcha', - 'zendframework/zend-router' => 'laminas/laminas-router', - 'zendframework/zend-serializer' => 'laminas/laminas-serializer', - 'zendframework/zend-server' => 'laminas/laminas-server', - 'zendframework/zend-servicemanager' => 'laminas/laminas-servicemanager', - 'zendframework/zendservice-recaptcha' => 'laminas/laminas-recaptcha', - 'zendframework/zendservice-twitter' => 'laminas/laminas-twitter', - 'zendframework/zend-session' => 'laminas/laminas-session', - 'zendframework/zend-skeleton-installer' => 'laminas/laminas-skeleton-installer', - 'zendframework/zend-soap' => 'laminas/laminas-soap', - 'zendframework/zend-stdlib' => 'laminas/laminas-stdlib', - 'zendframework/zend-stratigility' => 'laminas/laminas-stratigility', - 'zendframework/zend-tag' => 'laminas/laminas-tag', - 'zendframework/zend-test' => 'laminas/laminas-test', - 'zendframework/zend-text' => 'laminas/laminas-text', - 'zendframework/zend-uri' => 'laminas/laminas-uri', - 'zendframework/zend-validator' => 'laminas/laminas-validator', - 'zendframework/zend-view' => 'laminas/laminas-view', - 'zendframework/zend-xml2json' => 'laminas/laminas-xml2json', - 'zendframework/zend-xml' => 'laminas/laminas-xml', - 'zendframework/zend-xmlrpc' => 'laminas/laminas-xmlrpc', - - // Expressive packages - 'zendframework/zend-expressive' => 'mezzio/mezzio', - 'zendframework/zend-expressive-zendrouter' => 'mezzio/mezzio-laminasrouter', - 'zendframework/zend-problem-details' => 'mezzio/mezzio-problem-details', - 'zendframework/zend-expressive-zendviewrenderer' => 'mezzio/mezzio-laminasviewrenderer', - - // Apigility packages - 'zfcampus/apigility-documentation' => 'laminas-api-tools/documentation', - 'zfcampus/statuslib-example' => 'laminas-api-tools/statuslib-example', - 'zfcampus/zf-apigility' => 'laminas-api-tools/api-tools', - 'zfcampus/zf-api-problem' => 'laminas-api-tools/api-tools-api-problem', - 'zfcampus/zf-asset-manager' => 'laminas-api-tools/api-tools-asset-manager', - 'zfcampus/zf-configuration' => 'laminas-api-tools/api-tools-configuration', - 'zfcampus/zf-content-negotiation' => 'laminas-api-tools/api-tools-content-negotiation', - 'zfcampus/zf-content-validation' => 'laminas-api-tools/api-tools-content-validation', - 'zfcampus/zf-development-mode' => 'laminas/laminas-development-mode', - 'zfcampus/zf-doctrine-querybuilder' => 'laminas-api-tools/api-tools-doctrine-querybuilder', - 'zfcampus/zf-hal' => 'laminas-api-tools/api-tools-hal', - 'zfcampus/zf-http-cache' => 'laminas-api-tools/api-tools-http-cache', - 'zfcampus/zf-mvc-auth' => 'laminas-api-tools/api-tools-mvc-auth', - 'zfcampus/zf-oauth2' => 'laminas-api-tools/api-tools-oauth2', - 'zfcampus/zf-rest' => 'laminas-api-tools/api-tools-rest', - 'zfcampus/zf-rpc' => 'laminas-api-tools/api-tools-rpc', - 'zfcampus/zf-versioning' => 'laminas-api-tools/api-tools-versioning', - - // CONFIG KEYS, SCRIPT NAMES, ETC - // ZF components - '::fromZend' => '::fromLaminas', // psr7bridge - '::toZend' => '::toLaminas', // psr7bridge - 'use_zend_loader' => 'use_laminas_loader', // zend-modulemanager - 'zend-config' => 'laminas-config', - 'zend-developer-tools/' => 'laminas-developer-tools/', - 'zend-tag-cloud' => 'laminas-tag-cloud', - 'zenddevelopertools' => 'laminas-developer-tools', - 'zendbarcode' => 'laminasbarcode', - 'ZendBarcode' => 'LaminasBarcode', - 'zendcache' => 'laminascache', - 'ZendCache' => 'LaminasCache', - 'zendconfig' => 'laminasconfig', - 'ZendConfig' => 'LaminasConfig', - 'zendfeed' => 'laminasfeed', - 'ZendFeed' => 'LaminasFeed', - 'zendfilter' => 'laminasfilter', - 'ZendFilter' => 'LaminasFilter', - 'zendform' => 'laminasform', - 'ZendForm' => 'LaminasForm', - 'zendi18n' => 'laminasi18n', - 'ZendI18n' => 'LaminasI18n', - 'zendinputfilter' => 'laminasinputfilter', - 'ZendInputFilter' => 'LaminasInputFilter', - 'zendlog' => 'laminaslog', - 'ZendLog' => 'LaminasLog', - 'zendmail' => 'laminasmail', - 'ZendMail' => 'LaminasMail', - 'zendmvc' => 'laminasmvc', - 'ZendMvc' => 'LaminasMvc', - 'zendpaginator' => 'laminaspaginator', - 'ZendPaginator' => 'LaminasPaginator', - 'zendserializer' => 'laminasserializer', - 'ZendSerializer' => 'LaminasSerializer', - 'zendtag' => 'laminastag', - 'ZendTag' => 'LaminasTag', - 'zendtext' => 'laminastext', - 'ZendText' => 'LaminasText', - 'zendvalidator' => 'laminasvalidator', - 'ZendValidator' => 'LaminasValidator', - 'zendview' => 'laminasview', - 'ZendView' => 'LaminasView', - 'zend-framework.flf' => 'laminas-project.flf', - - // Expressive-related - "'zend-expressive'" => "'mezzio'", - '"zend-expressive"' => '"mezzio"', - 'zend-expressive.' => 'mezzio.', - 'zend-expressive-authorization' => 'mezzio-authorization', - 'zend-expressive-hal' => 'mezzio-hal', - 'zend-expressive-session' => 'mezzio-session', - 'zend-expressive-swoole' => 'mezzio-swoole', - 'zend-expressive-tooling' => 'mezzio-tooling', - - // Apigility-related - "'zf-apigility'" => "'api-tools'", - '"zf-apigility"' => '"api-tools"', - 'zf-apigility/' => 'api-tools/', - 'zf-apigility-admin' => 'api-tools-admin', - 'zf-content-negotiation' => 'api-tools-content-negotiation', - 'zf-hal' => 'api-tools-hal', - 'zf-rest' => 'api-tools-rest', - 'zf-rpc' => 'api-tools-rpc', - 'zf-content-validation' => 'api-tools-content-validation', - 'zf-apigility-ui' => 'api-tools-ui', - 'zf-apigility-documentation-blueprint' => 'api-tools-documentation-blueprint', - 'zf-apigility-documentation-swagger' => 'api-tools-documentation-swagger', - 'zf-apigility-welcome' => 'api-tools-welcome', - 'zf-api-problem' => 'api-tools-api-problem', - 'zf-configuration' => 'api-tools-configuration', - 'zf-http-cache' => 'api-tools-http-cache', - 'zf-mvc-auth' => 'api-tools-mvc-auth', - 'zf-oauth2' => 'api-tools-oauth2', - 'zf-versioning' => 'api-tools-versioning', - 'ZfApigilityDoctrineQueryProviderManager' => 'LaminasApiToolsDoctrineQueryProviderManager', - 'ZfApigilityDoctrineQueryCreateFilterManager' => 'LaminasApiToolsDoctrineQueryCreateFilterManager', - 'zf-apigility-doctrine' => 'api-tools-doctrine', - 'zf-development-mode' => 'laminas-development-mode', - 'zf-doctrine-querybuilder' => 'api-tools-doctrine-querybuilder', - - // 3rd party Apigility packages - 'api-skeletons/zf-' => 'api-skeletons/zf-', // api-skeletons packages - 'zf-oauth2-' => 'zf-oauth2-', // api-skeletons OAuth2-related packages - 'ZF\\OAuth2\\Client' => 'ZF\\OAuth2\\Client', // api-skeletons/zf-oauth2-client - 'ZF\\OAuth2\\Doctrine' => 'ZF\\OAuth2\\Doctrine', // api-skeletons/zf-oauth2-doctrine -]; diff --git a/vendor/laminas/laminas-zendframework-bridge/src/Autoloader.php b/vendor/laminas/laminas-zendframework-bridge/src/Autoloader.php deleted file mode 100644 index 6048766..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/src/Autoloader.php +++ /dev/null @@ -1,172 +0,0 @@ -loadClass($class)) { - $legacy = $namespaces[$check] - . strtr(substr($class, strlen($check)), [ - 'ApiTools' => 'Apigility', - 'Mezzio' => 'Expressive', - 'Laminas' => 'Zend', - ]); - class_alias($class, $legacy); - } - }; - } - - /** - * @return callable - */ - private static function createAppendAutoloader(array $namespaces, ArrayObject $loaded) - { - /** - * @param string $class Class name to autoload - * @return void - */ - return static function ($class) use ($namespaces, $loaded) { - $segments = explode('\\', $class); - - if ($segments[0] === 'ZendService' && isset($segments[1])) { - $segments[0] .= '\\' . $segments[1]; - unset($segments[1]); - $segments = array_values($segments); - } - - $i = 0; - $check = ''; - - // We are checking segments of the namespace to match quicker - while (isset($segments[$i + 1], $namespaces[$check . $segments[$i] . '\\'])) { - $check .= $segments[$i] . '\\'; - ++$i; - } - - if ($check === '') { - return; - } - - $alias = $namespaces[$check] - . strtr(substr($class, strlen($check)), [ - 'Apigility' => 'ApiTools', - 'Expressive' => 'Mezzio', - 'Zend' => 'Laminas', - 'AbstractZendServer' => 'AbstractZendServer', - 'ZendServerDisk' => 'ZendServerDisk', - 'ZendServerShm' => 'ZendServerShm', - 'ZendMonitor' => 'ZendMonitor', - ]); - - $loaded[$alias] = true; - if (class_exists($alias) || interface_exists($alias) || trait_exists($alias)) { - class_alias($alias, $class); - } - }; - } -} diff --git a/vendor/laminas/laminas-zendframework-bridge/src/ConfigPostProcessor.php b/vendor/laminas/laminas-zendframework-bridge/src/ConfigPostProcessor.php deleted file mode 100644 index bac7b97..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/src/ConfigPostProcessor.php +++ /dev/null @@ -1,434 +0,0 @@ - true, - 'factories' => true, - 'invokables' => true, - 'services' => true, - ]; - - /** @var array String keys => string values */ - private $exactReplacements = [ - 'zend-expressive' => 'mezzio', - 'zf-apigility' => 'api-tools', - ]; - - /** @var Replacements */ - private $replacements; - - /** @var callable[] */ - private $rulesets; - - public function __construct() - { - $this->replacements = new Replacements(); - - /* Define the rulesets for replacements. - * - * Each ruleset has the following signature: - * - * @param mixed $value - * @param string[] $keys Full nested key hierarchy leading to the value - * @return null|callable - * - * If no match is made, a null is returned, allowing it to fallback to - * the next ruleset in the list. If a match is made, a callback is returned, - * and that will be used to perform the replacement on the value. - * - * The callback should have the following signature: - * - * @param mixed $value - * @param string[] $keys - * @return mixed The transformed value - */ - $this->rulesets = [ - // Exact values - function ($value) { - return is_string($value) && isset($this->exactReplacements[$value]) - ? [$this, 'replaceExactValue'] - : null; - }, - - // Router (MVC applications) - // We do not want to rewrite these. - function ($value, array $keys) { - $key = array_pop($keys); - // Only worried about a top-level "router" key. - return $key === 'router' && count($keys) === 0 && is_array($value) - ? [$this, 'noopReplacement'] - : null; - }, - - // service- and pluginmanager handling - function ($value) { - return is_array($value) && array_intersect_key(self::SERVICE_MANAGER_KEYS_OF_INTEREST, $value) !== [] - ? [$this, 'replaceDependencyConfiguration'] - : null; - }, - - // Array values - function ($value, array $keys) { - return 0 !== count($keys) && is_array($value) - ? [$this, '__invoke'] - : null; - }, - ]; - } - - /** - * @param string[] $keys Hierarchy of keys, for determining location in - * nested configuration. - * @return array - */ - public function __invoke(array $config, array $keys = []) - { - $rewritten = []; - - foreach ($config as $key => $value) { - // Determine new key from replacements - $newKey = is_string($key) ? $this->replace($key, $keys) : $key; - - // Keep original values with original key, if the key has changed, but only at the top-level. - if (empty($keys) && $newKey !== $key) { - $rewritten[$key] = $value; - } - - // Perform value replacements, if any - $newValue = $this->replace($value, $keys, $newKey); - - // Key does not already exist and/or is not an array value - if (! array_key_exists($newKey, $rewritten) || ! is_array($rewritten[$newKey])) { - // Do not overwrite existing values with null values - $rewritten[$newKey] = array_key_exists($newKey, $rewritten) && null === $newValue - ? $rewritten[$newKey] - : $newValue; - continue; - } - - // New value is null; nothing to do. - if (null === $newValue) { - continue; - } - - // Key already exists as an array value, but $value is not an array - if (! is_array($newValue)) { - $rewritten[$newKey][] = $newValue; - continue; - } - - // Key already exists as an array value, and $value is also an array - $rewritten[$newKey] = static::merge($rewritten[$newKey], $newValue); - } - - return $rewritten; - } - - /** - * Perform substitutions as needed on an individual value. - * - * The $key is provided to allow fine-grained selection of rewrite rules. - * - * @param mixed $value - * @param string[] $keys Key hierarchy - * @param null|int|string $key - * @return mixed - */ - private function replace($value, array $keys, $key = null) - { - // Add new key to the list of keys. - // We do not need to remove it later, as we are working on a copy of the array. - array_push($keys, $key); - - // Identify rewrite strategy and perform replacements - $rewriteRule = $this->replacementRuleMatch($value, $keys); - return $rewriteRule($value, $keys); - } - - /** - * Merge two arrays together. - * - * If an integer key exists in both arrays, the value from the second array - * will be appended to the first array. If both values are arrays, they are - * merged together, else the value of the second array overwrites the one - * of the first array. - * - * Based on zend-stdlib Zend\Stdlib\ArrayUtils::merge - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * - * @return array - */ - public static function merge(array $a, array $b) - { - foreach ($b as $key => $value) { - if (! isset($a[$key]) && ! array_key_exists($key, $a)) { - $a[$key] = $value; - continue; - } - - if (null === $value && array_key_exists($key, $a)) { - // Leave as-is if value from $b is null - continue; - } - - if (is_int($key)) { - $a[] = $value; - continue; - } - - if (is_array($value) && is_array($a[$key])) { - $a[$key] = static::merge($a[$key], $value); - continue; - } - - $a[$key] = $value; - } - - return $a; - } - - /** - * @param mixed $value - * @param null|int|string $key - * @return callable Callable to invoke with value - */ - private function replacementRuleMatch($value, $key = null) - { - foreach ($this->rulesets as $ruleset) { - $result = $ruleset($value, $key); - if (is_callable($result)) { - return $result; - } - } - return [$this, 'fallbackReplacement']; - } - - /** - * Replace a value using the translation table, if the value is a string. - * - * @param mixed $value - * @return mixed - */ - private function fallbackReplacement($value) - { - return is_string($value) - ? $this->replacements->replace($value) - : $value; - } - - /** - * Replace a value matched exactly. - * - * @param mixed $value - * @return mixed - */ - private function replaceExactValue($value) - { - return $this->exactReplacements[$value]; - } - - private function replaceDependencyConfiguration(array $config) - { - $aliases = isset($config['aliases']) && is_array($config['aliases']) - ? $this->replaceDependencyAliases($config['aliases']) - : []; - - if ($aliases) { - $config['aliases'] = $aliases; - } - - $config = $this->replaceDependencyInvokables($config); - $config = $this->replaceDependencyFactories($config); - $config = $this->replaceDependencyServices($config); - - $keys = self::SERVICE_MANAGER_KEYS_OF_INTEREST; - foreach ($config as $key => $data) { - if (isset($keys[$key])) { - continue; - } - - $config[$key] = is_array($data) ? $this->__invoke($data, [$key]) : $data; - } - - return $config; - } - - /** - * Rewrite dependency aliases array - * - * In this case, we want to keep the alias as-is, but rewrite the target. - * - * We need also provide an additional alias if the alias key is a legacy class. - * - * @return array - */ - private function replaceDependencyAliases(array $aliases) - { - foreach ($aliases as $alias => $target) { - if (! is_string($alias) || ! is_string($target)) { - continue; - } - - $newTarget = $this->replacements->replace($target); - $newAlias = $this->replacements->replace($alias); - - $notIn = [$newTarget]; - $name = $newTarget; - while (isset($aliases[$name])) { - $notIn[] = $aliases[$name]; - $name = $aliases[$name]; - } - - if ($newAlias === $alias && ! in_array($alias, $notIn, true)) { - $aliases[$alias] = $newTarget; - continue; - } - - if (isset($aliases[$newAlias])) { - continue; - } - - if (! in_array($newAlias, $notIn, true)) { - $aliases[$alias] = $newAlias; - $aliases[$newAlias] = $newTarget; - } - } - - return $aliases; - } - - /** - * Rewrite dependency invokables array - * - * In this case, we want to keep the alias as-is, but rewrite the target. - * - * We need also provide an additional alias if invokable is defined with - * an alias which is a legacy class. - * - * @return array - */ - private function replaceDependencyInvokables(array $config) - { - if (empty($config['invokables']) || ! is_array($config['invokables'])) { - return $config; - } - - foreach ($config['invokables'] as $alias => $target) { - if (! is_string($alias)) { - continue; - } - - $newTarget = $this->replacements->replace($target); - $newAlias = $this->replacements->replace($alias); - - if ($alias === $target || isset($config['aliases'][$newAlias])) { - $config['invokables'][$alias] = $newTarget; - continue; - } - - $config['invokables'][$newAlias] = $newTarget; - - if ($newAlias === $alias) { - continue; - } - - $config['aliases'][$alias] = $newAlias; - - unset($config['invokables'][$alias]); - } - - return $config; - } - - /** - * @param mixed $value - * @return mixed Returns $value verbatim. - */ - private function noopReplacement($value) - { - return $value; - } - - private function replaceDependencyFactories(array $config) - { - if (empty($config['factories']) || ! is_array($config['factories'])) { - return $config; - } - - foreach ($config['factories'] as $service => $factory) { - if (! is_string($service)) { - continue; - } - - $replacedService = $this->replacements->replace($service); - $factory = is_string($factory) ? $this->replacements->replace($factory) : $factory; - $config['factories'][$replacedService] = $factory; - - if ($replacedService === $service) { - continue; - } - - unset($config['factories'][$service]); - if (isset($config['aliases'][$service])) { - continue; - } - - $config['aliases'][$service] = $replacedService; - } - - return $config; - } - - private function replaceDependencyServices(array $config) - { - if (empty($config['services']) || ! is_array($config['services'])) { - return $config; - } - - foreach ($config['services'] as $service => $serviceInstance) { - if (! is_string($service)) { - continue; - } - - $replacedService = $this->replacements->replace($service); - $serviceInstance = is_array($serviceInstance) ? $this->__invoke($serviceInstance) : $serviceInstance; - - $config['services'][$replacedService] = $serviceInstance; - - if ($service === $replacedService) { - continue; - } - - unset($config['services'][$service]); - - if (isset($config['aliases'][$service])) { - continue; - } - - $config['aliases'][$service] = $replacedService; - } - - return $config; - } -} diff --git a/vendor/laminas/laminas-zendframework-bridge/src/Module.php b/vendor/laminas/laminas-zendframework-bridge/src/Module.php deleted file mode 100644 index d10cb43..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/src/Module.php +++ /dev/null @@ -1,54 +0,0 @@ -getEventManager() - ->attach('mergeConfig', [$this, 'onMergeConfig']); - } - - /** - * Perform substitutions in the merged configuration. - * - * Rewrites keys and values matching known ZF classes, namespaces, and - * configuration keys to their Laminas equivalents. - * - * Type-hinting deliberately omitted to allow unit testing - * without dependencies on packages that do not exist yet. - * - * @param ModuleEvent $event - */ - public function onMergeConfig($event) - { - /** @var ConfigMergerInterface */ - $configMerger = $event->getConfigListener(); - $processor = new ConfigPostProcessor(); - $configMerger->setMergedConfig( - $processor( - $configMerger->getMergedConfig($returnAsObject = false) - ) - ); - } -} diff --git a/vendor/laminas/laminas-zendframework-bridge/src/Replacements.php b/vendor/laminas/laminas-zendframework-bridge/src/Replacements.php deleted file mode 100644 index ca445c0..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/src/Replacements.php +++ /dev/null @@ -1,46 +0,0 @@ -replacements = array_merge( - require __DIR__ . '/../config/replacements.php', - $additionalReplacements - ); - - // Provide multiple variants of strings containing namespace separators - foreach ($this->replacements as $original => $replacement) { - if (false === strpos($original, '\\')) { - continue; - } - $this->replacements[str_replace('\\', '\\\\', $original)] = str_replace('\\', '\\\\', $replacement); - $this->replacements[str_replace('\\', '\\\\\\\\', $original)] = str_replace('\\', '\\\\\\\\', $replacement); - } - } - - /** - * @param string $value - * @return string - */ - public function replace($value) - { - return strtr($value, $this->replacements); - } -} diff --git a/vendor/laminas/laminas-zendframework-bridge/src/RewriteRules.php b/vendor/laminas/laminas-zendframework-bridge/src/RewriteRules.php deleted file mode 100644 index 8dc999f..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/src/RewriteRules.php +++ /dev/null @@ -1,79 +0,0 @@ - 'Mezzio\\ProblemDetails\\', - 'Zend\\Expressive\\' => 'Mezzio\\', - - // Laminas - 'Zend\\' => 'Laminas\\', - 'ZF\\ComposerAutoloading\\' => 'Laminas\\ComposerAutoloading\\', - 'ZF\\DevelopmentMode\\' => 'Laminas\\DevelopmentMode\\', - - // Apigility - 'ZF\\Apigility\\' => 'Laminas\\ApiTools\\', - 'ZF\\' => 'Laminas\\ApiTools\\', - - // ZendXml, API wrappers, zend-http OAuth support, zend-diagnostics, ZendDeveloperTools - 'ZendXml\\' => 'Laminas\\Xml\\', - 'ZendOAuth\\' => 'Laminas\\OAuth\\', - 'ZendDiagnostics\\' => 'Laminas\\Diagnostics\\', - 'ZendService\\ReCaptcha\\' => 'Laminas\\ReCaptcha\\', - 'ZendService\\Twitter\\' => 'Laminas\\Twitter\\', - 'ZendDeveloperTools\\' => 'Laminas\\DeveloperTools\\', - ]; - } - - /** - * @return array - */ - public static function namespaceReverse() - { - return [ - // ZendXml, ZendOAuth, ZendDiagnostics, ZendDeveloperTools - 'Laminas\\Xml\\' => 'ZendXml\\', - 'Laminas\\OAuth\\' => 'ZendOAuth\\', - 'Laminas\\Diagnostics\\' => 'ZendDiagnostics\\', - 'Laminas\\DeveloperTools\\' => 'ZendDeveloperTools\\', - - // Zend Service - 'Laminas\\ReCaptcha\\' => 'ZendService\\ReCaptcha\\', - 'Laminas\\Twitter\\' => 'ZendService\\Twitter\\', - - // Zend - 'Laminas\\' => 'Zend\\', - - // Expressive - 'Mezzio\\ProblemDetails\\' => 'Zend\\ProblemDetails\\', - 'Mezzio\\' => 'Zend\\Expressive\\', - - // Laminas to ZfCampus - 'Laminas\\ComposerAutoloading\\' => 'ZF\\ComposerAutoloading\\', - 'Laminas\\DevelopmentMode\\' => 'ZF\\DevelopmentMode\\', - - // Apigility - 'Laminas\\ApiTools\\Admin\\' => 'ZF\\Apigility\\Admin\\', - 'Laminas\\ApiTools\\Doctrine\\' => 'ZF\\Apigility\\Doctrine\\', - 'Laminas\\ApiTools\\Documentation\\' => 'ZF\\Apigility\\Documentation\\', - 'Laminas\\ApiTools\\Example\\' => 'ZF\\Apigility\\Example\\', - 'Laminas\\ApiTools\\Provider\\' => 'ZF\\Apigility\\Provider\\', - 'Laminas\\ApiTools\\Welcome\\' => 'ZF\\Apiglity\\Welcome\\', - 'Laminas\\ApiTools\\' => 'ZF\\', - ]; - } -} diff --git a/vendor/laminas/laminas-zendframework-bridge/src/autoload.php b/vendor/laminas/laminas-zendframework-bridge/src/autoload.php deleted file mode 100644 index 9f2f2ad..0000000 --- a/vendor/laminas/laminas-zendframework-bridge/src/autoload.php +++ /dev/null @@ -1,9 +0,0 @@ - -Copyright (C) 2014 Jonatan MƤnnchen -Copyright (C) 2014 Jesse G. Donat -Copyright (C) 2018 Nicolas CARPi - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/maennchen/zipstream-php/README.md b/vendor/maennchen/zipstream-php/README.md deleted file mode 100644 index c2e832b..0000000 --- a/vendor/maennchen/zipstream-php/README.md +++ /dev/null @@ -1,123 +0,0 @@ -# ZipStream-PHP - -[![Build Status](https://travis-ci.org/maennchen/ZipStream-PHP.svg?branch=master)](https://travis-ci.org/maennchen/ZipStream-PHP) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/maennchen/ZipStream-PHP/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/maennchen/ZipStream-PHP/) -[![Code Coverage](https://scrutinizer-ci.com/g/maennchen/ZipStream-PHP/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/maennchen/ZipStream-PHP/) -[![Latest Stable Version](https://poser.pugx.org/maennchen/zipstream-php/v/stable)](https://packagist.org/packages/maennchen/zipstream-php) -[![Total Downloads](https://poser.pugx.org/maennchen/zipstream-php/downloads)](https://packagist.org/packages/maennchen/zipstream-php) -[![Financial Contributors on Open Collective](https://opencollective.com/zipstream/all/badge.svg?label=financial+contributors)](https://opencollective.com/zipstream) [![License](https://img.shields.io/github/license/maennchen/zipstream-php.svg)](LICENSE) - -## Overview - -A fast and simple streaming zip file downloader for PHP. Using this library will save you from having to write the Zip to disk. You can directly send it to the user, which is much faster. It can work with S3 buckets or any PSR7 Stream. - -Please see the [LICENSE](LICENSE) file for licensing and warranty information. - -## Installation - -Simply add a dependency on maennchen/zipstream-php to your project's composer.json file if you use Composer to manage the dependencies of your project. Use following command to add the package to your project's dependencies: - -```bash -composer require maennchen/zipstream-php -``` - -## Usage and options - -Here's a simple example: - -```php -// Autoload the dependencies -require 'vendor/autoload.php'; - -// enable output of HTTP headers -$options = new ZipStream\Option\Archive(); -$options->setSendHttpHeaders(true); - -// create a new zipstream object -$zip = new ZipStream\ZipStream('example.zip', $options); - -// create a file named 'hello.txt' -$zip->addFile('hello.txt', 'This is the contents of hello.txt'); - -// add a file named 'some_image.jpg' from a local file 'path/to/image.jpg' -$zip->addFileFromPath('some_image.jpg', 'path/to/image.jpg'); - -// add a file named 'goodbye.txt' from an open stream resource -$fp = tmpfile(); -fwrite($fp, 'The quick brown fox jumped over the lazy dog.'); -rewind($fp); -$zip->addFileFromStream('goodbye.txt', $fp); -fclose($fp); - -// finish the zip stream -$zip->finish(); -``` - -You can also add comments, modify file timestamps, and customize (or -disable) the HTTP headers. It is also possible to specify the storage method when adding files, -the current default storage method is 'deflate' i.e files are stored with Compression mode 0x08. - -See the [Wiki](https://github.com/maennchen/ZipStream-PHP/wiki) for details. - -## Known issue - -The native Mac OS archive extraction tool might not open archives in some conditions. A workaround is to disable the Zip64 feature with the option `$opt->setEnableZip64(false)`. This limits the archive to 4 Gb and 64k files but will allow Mac OS users to open them without issue. See #116. - -The linux `unzip` utility might not handle properly unicode characters. It is recommended to extract with another tool like [7-zip](https://www.7-zip.org/). See #146. - -## Upgrade to version 2.0.0 - -* Only the self opened streams will be closed (#139) -If you were relying on ZipStream to close streams that the library didn't open, -you'll need to close them yourself now. - -## Upgrade to version 1.0.0 - -* All options parameters to all function have been moved from an `array` to structured option objects. See [the wiki](https://github.com/maennchen/ZipStream-PHP/wiki/Available-options) for examples. -* The whole library has been refactored. The minimal PHP requirement has been raised to PHP 7.1. - -## Usage with Symfony and S3 - -You can find example code on [the wiki](https://github.com/maennchen/ZipStream-PHP/wiki/Symfony-example). - -## Contributing - -ZipStream-PHP is a collaborative project. Please take a look at the [CONTRIBUTING.md](CONTRIBUTING.md) file. - -## About the Authors - -* Paul Duncan - https://pablotron.org/ -* Jonatan MƤnnchen - https://maennchen.dev -* Jesse G. Donat - https://donatstudios.com -* Nicolas CARPi - https://www.deltablot.com -* Nik Barham - https://www.brokencube.co.uk - -## Contributors - -### Code Contributors - -This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. - - -### Financial Contributors - -Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/zipstream/contribute)] - -#### Individuals - - - -#### Organizations - -Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/zipstream/contribute)] - - - - - - - - - - - diff --git a/vendor/maennchen/zipstream-php/composer.json b/vendor/maennchen/zipstream-php/composer.json deleted file mode 100644 index 103c78c..0000000 --- a/vendor/maennchen/zipstream-php/composer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "maennchen/zipstream-php", - "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", - "keywords": ["zip", "stream"], - "type": "library", - "license": "MIT", - "authors": [{ - "name": "Paul Duncan", - "email": "pabs@pablotron.org" - }, - { - "name": "Jonatan MƤnnchen", - "email": "jonatan@maennchen.ch" - }, - { - "name": "Jesse Donat", - "email": "donatj@gmail.com" - }, - { - "name": "AndrĆ”s KolesĆ”r", - "email": "kolesar@kolesar.hu" - } - ], - "require": { - "php": ">= 7.1", - "symfony/polyfill-mbstring": "^1.0", - "psr/http-message": "^1.0", - "myclabs/php-enum": "^1.5" - }, - "require-dev": { - "phpunit/phpunit": ">= 7.5", - "guzzlehttp/guzzle": ">= 6.3", - "ext-zip": "*", - "mikey179/vfsstream": "^1.6" - }, - "autoload": { - "psr-4": { - "ZipStream\\": "src/" - } - } -} diff --git a/vendor/maennchen/zipstream-php/phpunit.xml.dist b/vendor/maennchen/zipstream-php/phpunit.xml.dist deleted file mode 100644 index f6e7227..0000000 --- a/vendor/maennchen/zipstream-php/phpunit.xml.dist +++ /dev/null @@ -1,17 +0,0 @@ - - - - test - - - - - - - - - - src - - - diff --git a/vendor/maennchen/zipstream-php/psalm.xml b/vendor/maennchen/zipstream-php/psalm.xml deleted file mode 100644 index 42f355b..0000000 --- a/vendor/maennchen/zipstream-php/psalm.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/maennchen/zipstream-php/src/Bigint.php b/vendor/maennchen/zipstream-php/src/Bigint.php deleted file mode 100644 index 52ccfd2..0000000 --- a/vendor/maennchen/zipstream-php/src/Bigint.php +++ /dev/null @@ -1,172 +0,0 @@ -fillBytes($value, 0, 8); - } - - /** - * Fill the bytes field with int - * - * @param int $value - * @param int $start - * @param int $count - * @return void - */ - protected function fillBytes(int $value, int $start, int $count): void - { - for ($i = 0; $i < $count; $i++) { - $this->bytes[$start + $i] = $i >= PHP_INT_SIZE ? 0 : $value & 0xFF; - $value >>= 8; - } - } - - /** - * Get an instance - * - * @param int $value - * @return Bigint - */ - public static function init(int $value = 0): self - { - return new self($value); - } - - /** - * Fill bytes from low to high - * - * @param int $low - * @param int $high - * @return Bigint - */ - public static function fromLowHigh(int $low, int $high): self - { - $bigint = new Bigint(); - $bigint->fillBytes($low, 0, 4); - $bigint->fillBytes($high, 4, 4); - return $bigint; - } - - /** - * Get high 32 - * - * @return int - */ - public function getHigh32(): int - { - return $this->getValue(4, 4); - } - - /** - * Get value from bytes array - * - * @param int $end - * @param int $length - * @return int - */ - public function getValue(int $end = 0, int $length = 8): int - { - $result = 0; - for ($i = $end + $length - 1; $i >= $end; $i--) { - $result <<= 8; - $result |= $this->bytes[$i]; - } - return $result; - } - - /** - * Get low FF - * - * @param bool $force - * @return float - */ - public function getLowFF(bool $force = false): float - { - if ($force || $this->isOver32()) { - return (float)0xFFFFFFFF; - } - return (float)$this->getLow32(); - } - - /** - * Check if is over 32 - * - * @param bool $force - * @return bool - */ - public function isOver32(bool $force = false): bool - { - // value 0xFFFFFFFF already needs a Zip64 header - return $force || - max(array_slice($this->bytes, 4, 4)) > 0 || - min(array_slice($this->bytes, 0, 4)) === 0xFF; - } - - /** - * Get low 32 - * - * @return int - */ - public function getLow32(): int - { - return $this->getValue(0, 4); - } - - /** - * Get hexadecimal - * - * @return string - */ - public function getHex64(): string - { - $result = '0x'; - for ($i = 7; $i >= 0; $i--) { - $result .= sprintf('%02X', $this->bytes[$i]); - } - return $result; - } - - /** - * Add - * - * @param Bigint $other - * @return Bigint - */ - public function add(Bigint $other): Bigint - { - $result = clone $this; - $overflow = false; - for ($i = 0; $i < 8; $i++) { - $result->bytes[$i] += $other->bytes[$i]; - if ($overflow) { - $result->bytes[$i]++; - $overflow = false; - } - if ($result->bytes[$i] & 0x100) { - $overflow = true; - $result->bytes[$i] &= 0xFF; - } - } - if ($overflow) { - throw new OverflowException; - } - return $result; - } -} diff --git a/vendor/maennchen/zipstream-php/src/DeflateStream.php b/vendor/maennchen/zipstream-php/src/DeflateStream.php deleted file mode 100644 index d6c2728..0000000 --- a/vendor/maennchen/zipstream-php/src/DeflateStream.php +++ /dev/null @@ -1,70 +0,0 @@ -filter) { - $this->removeDeflateFilter(); - $this->seek(0); - $this->addDeflateFilter($this->options); - } else { - rewind($this->stream); - } - } - - /** - * Remove the deflate filter - * - * @return void - */ - public function removeDeflateFilter(): void - { - if (!$this->filter) { - return; - } - stream_filter_remove($this->filter); - $this->filter = null; - } - - /** - * Add a deflate filter - * - * @param Option\File $options - * @return void - */ - public function addDeflateFilter(Option\File $options): void - { - $this->options = $options; - // parameter 4 for stream_filter_append expects array - // so we convert the option object in an array - $optionsArr = [ - 'comment' => $options->getComment(), - 'method' => $options->getMethod(), - 'deflateLevel' => $options->getDeflateLevel(), - 'time' => $options->getTime() - ]; - $this->filter = stream_filter_append( - $this->stream, - 'zlib.deflate', - STREAM_FILTER_READ, - $optionsArr - ); - } -} diff --git a/vendor/maennchen/zipstream-php/src/Exception.php b/vendor/maennchen/zipstream-php/src/Exception.php deleted file mode 100644 index 18ccfbb..0000000 --- a/vendor/maennchen/zipstream-php/src/Exception.php +++ /dev/null @@ -1,11 +0,0 @@ -zip = $zip; - - $this->name = $name; - $this->opt = $opt ?: new FileOptions(); - $this->method = $this->opt->getMethod(); - $this->version = Version::STORE(); - $this->ofs = new Bigint(); - } - - public function processPath(string $path): void - { - if (!is_readable($path)) { - if (!file_exists($path)) { - throw new FileNotFoundException($path); - } - throw new FileNotReadableException($path); - } - if ($this->zip->isLargeFile($path) === false) { - $data = file_get_contents($path); - $this->processData($data); - } else { - $this->method = $this->zip->opt->getLargeFileMethod(); - - $stream = new DeflateStream(fopen($path, 'rb')); - $this->processStream($stream); - $stream->close(); - } - } - - public function processData(string $data): void - { - $this->len = new Bigint(strlen($data)); - $this->crc = crc32($data); - - // compress data if needed - if ($this->method->equals(Method::DEFLATE())) { - $data = gzdeflate($data); - } - - $this->zlen = new Bigint(strlen($data)); - $this->addFileHeader(); - $this->zip->send($data); - $this->addFileFooter(); - } - - /** - * Create and send zip header for this file. - * - * @return void - * @throws \ZipStream\Exception\EncodingException - */ - public function addFileHeader(): void - { - $name = static::filterFilename($this->name); - - // calculate name length - $nameLength = strlen($name); - - // create dos timestamp - $time = static::dosTime($this->opt->getTime()->getTimestamp()); - - $comment = $this->opt->getComment(); - - if (!mb_check_encoding($name, 'ASCII') || - !mb_check_encoding($comment, 'ASCII')) { - // Sets Bit 11: Language encoding flag (EFS). If this bit is set, - // the filename and comment fields for this file - // MUST be encoded using UTF-8. (see APPENDIX D) - if (!mb_check_encoding($name, 'UTF-8') || - !mb_check_encoding($comment, 'UTF-8')) { - throw new EncodingException( - 'File name and comment should use UTF-8 ' . - 'if one of them does not fit into ASCII range.' - ); - } - $this->bits |= self::BIT_EFS_UTF8; - } - - if ($this->method->equals(Method::DEFLATE())) { - $this->version = Version::DEFLATE(); - } - - $force = (boolean)($this->bits & self::BIT_ZERO_HEADER) && - $this->zip->opt->isEnableZip64(); - - $footer = $this->buildZip64ExtraBlock($force); - - // If this file will start over 4GB limit in ZIP file, - // CDR record will have to use Zip64 extension to describe offset - // to keep consistency we use the same value here - if ($this->zip->ofs->isOver32()) { - $this->version = Version::ZIP64(); - } - - $fields = [ - ['V', ZipStream::FILE_HEADER_SIGNATURE], - ['v', $this->version->getValue()], // Version needed to Extract - ['v', $this->bits], // General purpose bit flags - data descriptor flag set - ['v', $this->method->getValue()], // Compression method - ['V', $time], // Timestamp (DOS Format) - ['V', $this->crc], // CRC32 of data (0 -> moved to data descriptor footer) - ['V', $this->zlen->getLowFF($force)], // Length of compressed data (forced to 0xFFFFFFFF for zero header) - ['V', $this->len->getLowFF($force)], // Length of original data (forced to 0xFFFFFFFF for zero header) - ['v', $nameLength], // Length of filename - ['v', strlen($footer)], // Extra data (see above) - ]; - - // pack fields and calculate "total" length - $header = ZipStream::packFields($fields); - - // print header and filename - $data = $header . $name . $footer; - $this->zip->send($data); - - // save header length - $this->hlen = Bigint::init(strlen($data)); - } - - /** - * Strip characters that are not legal in Windows filenames - * to prevent compatibility issues - * - * @param string $filename Unprocessed filename - * @return string - */ - public static function filterFilename(string $filename): string - { - // strip leading slashes from file name - // (fixes bug in windows archive viewer) - $filename = preg_replace('/^\\/+/', '', $filename); - - return str_replace(['\\', ':', '*', '?', '"', '<', '>', '|'], '_', $filename); - } - - /** - * Convert a UNIX timestamp to a DOS timestamp. - * - * @param int $when - * @return int DOS Timestamp - */ - final protected static function dosTime(int $when): int - { - // get date array for timestamp - $d = getdate($when); - - // set lower-bound on dates - if ($d['year'] < 1980) { - $d = array( - 'year' => 1980, - 'mon' => 1, - 'mday' => 1, - 'hours' => 0, - 'minutes' => 0, - 'seconds' => 0 - ); - } - - // remove extra years from 1980 - $d['year'] -= 1980; - - // return date string - return - ($d['year'] << 25) | - ($d['mon'] << 21) | - ($d['mday'] << 16) | - ($d['hours'] << 11) | - ($d['minutes'] << 5) | - ($d['seconds'] >> 1); - } - - protected function buildZip64ExtraBlock(bool $force = false): string - { - - $fields = []; - if ($this->len->isOver32($force)) { - $fields[] = ['P', $this->len]; // Length of original data - } - - if ($this->len->isOver32($force)) { - $fields[] = ['P', $this->zlen]; // Length of compressed data - } - - if ($this->ofs->isOver32()) { - $fields[] = ['P', $this->ofs]; // Offset of local header record - } - - if (!empty($fields)) { - if (!$this->zip->opt->isEnableZip64()) { - throw new OverflowException(); - } - - array_unshift( - $fields, - ['v', 0x0001], // 64 bit extension - ['v', count($fields) * 8] // Length of data block - ); - $this->version = Version::ZIP64(); - } - - return ZipStream::packFields($fields); - } - - /** - * Create and send data descriptor footer for this file. - * - * @return void - */ - - public function addFileFooter(): void - { - - if ($this->bits & self::BIT_ZERO_HEADER) { - // compressed and uncompressed size - $sizeFormat = 'V'; - if ($this->zip->opt->isEnableZip64()) { - $sizeFormat = 'P'; - } - $fields = [ - ['V', ZipStream::DATA_DESCRIPTOR_SIGNATURE], - ['V', $this->crc], // CRC32 - [$sizeFormat, $this->zlen], // Length of compressed data - [$sizeFormat, $this->len], // Length of original data - ]; - - $footer = ZipStream::packFields($fields); - $this->zip->send($footer); - } else { - $footer = ''; - } - $this->totalLength = $this->hlen->add($this->zlen)->add(Bigint::init(strlen($footer))); - $this->zip->addToCdr($this); - } - - public function processStream(StreamInterface $stream): void - { - $this->zlen = new Bigint(); - $this->len = new Bigint(); - - if ($this->zip->opt->isZeroHeader()) { - $this->processStreamWithZeroHeader($stream); - } else { - $this->processStreamWithComputedHeader($stream); - } - } - - protected function processStreamWithZeroHeader(StreamInterface $stream): void - { - $this->bits |= self::BIT_ZERO_HEADER; - $this->addFileHeader(); - $this->readStream($stream, self::COMPUTE | self::SEND); - $this->addFileFooter(); - } - - protected function readStream(StreamInterface $stream, ?int $options = null): void - { - $this->deflateInit(); - $total = 0; - $size = $this->opt->getSize(); - while (!$stream->eof() && ($size === 0 || $total < $size)) { - $data = $stream->read(self::CHUNKED_READ_BLOCK_SIZE); - $total += strlen($data); - if ($size > 0 && $total > $size) { - $data = substr($data, 0 , strlen($data)-($total - $size)); - } - $this->deflateData($stream, $data, $options); - if ($options & self::SEND) { - $this->zip->send($data); - } - } - $this->deflateFinish($options); - } - - protected function deflateInit(): void - { - $this->hash = hash_init(self::HASH_ALGORITHM); - if ($this->method->equals(Method::DEFLATE())) { - $this->deflate = deflate_init( - ZLIB_ENCODING_RAW, - ['level' => $this->opt->getDeflateLevel()] - ); - } - } - - protected function deflateData(StreamInterface $stream, string &$data, ?int $options = null): void - { - if ($options & self::COMPUTE) { - $this->len = $this->len->add(Bigint::init(strlen($data))); - hash_update($this->hash, $data); - } - if ($this->deflate) { - $data = deflate_add( - $this->deflate, - $data, - $stream->eof() - ? ZLIB_FINISH - : ZLIB_NO_FLUSH - ); - } - if ($options & self::COMPUTE) { - $this->zlen = $this->zlen->add(Bigint::init(strlen($data))); - } - } - - protected function deflateFinish(?int $options = null): void - { - if ($options & self::COMPUTE) { - $this->crc = hexdec(hash_final($this->hash)); - } - } - - protected function processStreamWithComputedHeader(StreamInterface $stream): void - { - $this->readStream($stream, self::COMPUTE); - $stream->rewind(); - - // incremental compression with deflate_add - // makes this second read unnecessary - // but it is only available from PHP 7.0 - if (!$this->deflate && $stream instanceof DeflateStream && $this->method->equals(Method::DEFLATE())) { - $stream->addDeflateFilter($this->opt); - $this->zlen = new Bigint(); - while (!$stream->eof()) { - $data = $stream->read(self::CHUNKED_READ_BLOCK_SIZE); - $this->zlen = $this->zlen->add(Bigint::init(strlen($data))); - } - $stream->rewind(); - } - - $this->addFileHeader(); - $this->readStream($stream, self::SEND); - $this->addFileFooter(); - } - - /** - * Send CDR record for specified file. - * - * @return string - */ - public function getCdrFile(): string - { - $name = static::filterFilename($this->name); - - // get attributes - $comment = $this->opt->getComment(); - - // get dos timestamp - $time = static::dosTime($this->opt->getTime()->getTimestamp()); - - $footer = $this->buildZip64ExtraBlock(); - - $fields = [ - ['V', ZipStream::CDR_FILE_SIGNATURE], // Central file header signature - ['v', ZipStream::ZIP_VERSION_MADE_BY], // Made by version - ['v', $this->version->getValue()], // Extract by version - ['v', $this->bits], // General purpose bit flags - data descriptor flag set - ['v', $this->method->getValue()], // Compression method - ['V', $time], // Timestamp (DOS Format) - ['V', $this->crc], // CRC32 - ['V', $this->zlen->getLowFF()], // Compressed Data Length - ['V', $this->len->getLowFF()], // Original Data Length - ['v', strlen($name)], // Length of filename - ['v', strlen($footer)], // Extra data len (see above) - ['v', strlen($comment)], // Length of comment - ['v', 0], // Disk number - ['v', 0], // Internal File Attributes - ['V', 32], // External File Attributes - ['V', $this->ofs->getLowFF()] // Relative offset of local header - ]; - - // pack fields, then append name and comment - $header = ZipStream::packFields($fields); - - return $header . $name . $footer . $comment; - } - - /** - * @return Bigint - */ - public function getTotalLength(): Bigint - { - return $this->totalLength; - } -} diff --git a/vendor/maennchen/zipstream-php/src/Option/Archive.php b/vendor/maennchen/zipstream-php/src/Option/Archive.php deleted file mode 100644 index b6b95cc..0000000 --- a/vendor/maennchen/zipstream-php/src/Option/Archive.php +++ /dev/null @@ -1,261 +0,0 @@ - 4 GB or file count > 64k) - * - * @var bool - */ - private $enableZip64 = true; - /** - * Enable streaming files with single read where - * general purpose bit 3 indicates local file header - * contain zero values in crc and size fields, - * these appear only after file contents - * in data descriptor block. - * - * @var bool - */ - private $zeroHeader = false; - /** - * Enable reading file stat for determining file size. - * When a 32-bit system reads file size that is - * over 2 GB, invalid value appears in file size - * due to integer overflow. Should be disabled on - * 32-bit systems with method addFileFromPath - * if any file may exceed 2 GB. In this case file - * will be read in blocks and correct size will be - * determined from content. - * - * @var bool - */ - private $statFiles = true; - /** - * Enable flush after every write to output stream. - * @var bool - */ - private $flushOutput = false; - /** - * HTTP Content-Disposition. Defaults to - * 'attachment', where - * FILENAME is the specified filename. - * - * Note that this does nothing if you are - * not sending HTTP headers. - * - * @var string - */ - private $contentDisposition = 'attachment'; - /** - * Note that this does nothing if you are - * not sending HTTP headers. - * - * @var string - */ - private $contentType = 'application/x-zip'; - /** - * @var int - */ - private $deflateLevel = 6; - - /** - * @var resource - */ - private $outputStream; - - /** - * Options constructor. - */ - public function __construct() - { - $this->largeFileMethod = Method::STORE(); - $this->outputStream = fopen('php://output', 'wb'); - } - - public function getComment(): string - { - return $this->comment; - } - - public function setComment(string $comment): void - { - $this->comment = $comment; - } - - public function getLargeFileSize(): int - { - return $this->largeFileSize; - } - - public function setLargeFileSize(int $largeFileSize): void - { - $this->largeFileSize = $largeFileSize; - } - - public function getLargeFileMethod(): Method - { - return $this->largeFileMethod; - } - - public function setLargeFileMethod(Method $largeFileMethod): void - { - $this->largeFileMethod = $largeFileMethod; - } - - public function isSendHttpHeaders(): bool - { - return $this->sendHttpHeaders; - } - - public function setSendHttpHeaders(bool $sendHttpHeaders): void - { - $this->sendHttpHeaders = $sendHttpHeaders; - } - - public function getHttpHeaderCallback(): Callable - { - return $this->httpHeaderCallback; - } - - public function setHttpHeaderCallback(Callable $httpHeaderCallback): void - { - $this->httpHeaderCallback = $httpHeaderCallback; - } - - public function isEnableZip64(): bool - { - return $this->enableZip64; - } - - public function setEnableZip64(bool $enableZip64): void - { - $this->enableZip64 = $enableZip64; - } - - public function isZeroHeader(): bool - { - return $this->zeroHeader; - } - - public function setZeroHeader(bool $zeroHeader): void - { - $this->zeroHeader = $zeroHeader; - } - - public function isFlushOutput(): bool - { - return $this->flushOutput; - } - - public function setFlushOutput(bool $flushOutput): void - { - $this->flushOutput = $flushOutput; - } - - public function isStatFiles(): bool - { - return $this->statFiles; - } - - public function setStatFiles(bool $statFiles): void - { - $this->statFiles = $statFiles; - } - - public function getContentDisposition(): string - { - return $this->contentDisposition; - } - - public function setContentDisposition(string $contentDisposition): void - { - $this->contentDisposition = $contentDisposition; - } - - public function getContentType(): string - { - return $this->contentType; - } - - public function setContentType(string $contentType): void - { - $this->contentType = $contentType; - } - - /** - * @return resource - */ - public function getOutputStream() - { - return $this->outputStream; - } - - /** - * @param resource $outputStream - */ - public function setOutputStream($outputStream): void - { - $this->outputStream = $outputStream; - } - - /** - * @return int - */ - public function getDeflateLevel(): int - { - return $this->deflateLevel; - } - - /** - * @param int $deflateLevel - */ - public function setDeflateLevel(int $deflateLevel): void - { - $this->deflateLevel = $deflateLevel; - } -} diff --git a/vendor/maennchen/zipstream-php/src/Option/File.php b/vendor/maennchen/zipstream-php/src/Option/File.php deleted file mode 100644 index 7fd29ea..0000000 --- a/vendor/maennchen/zipstream-php/src/Option/File.php +++ /dev/null @@ -1,116 +0,0 @@ -deflateLevel = $this->deflateLevel ?: $archiveOptions->getDeflateLevel(); - $this->time = $this->time ?: new DateTime(); - } - - /** - * @return string - */ - public function getComment(): string - { - return $this->comment; - } - - /** - * @param string $comment - */ - public function setComment(string $comment): void - { - $this->comment = $comment; - } - - /** - * @return Method - */ - public function getMethod(): Method - { - return $this->method ?: Method::DEFLATE(); - } - - /** - * @param Method $method - */ - public function setMethod(Method $method): void - { - $this->method = $method; - } - - /** - * @return int - */ - public function getDeflateLevel(): int - { - return $this->deflateLevel ?: Archive::DEFAULT_DEFLATE_LEVEL; - } - - /** - * @param int $deflateLevel - */ - public function setDeflateLevel(int $deflateLevel): void - { - $this->deflateLevel = $deflateLevel; - } - - /** - * @return DateTime - */ - public function getTime(): DateTime - { - return $this->time; - } - - /** - * @param DateTime $time - */ - public function setTime(DateTime $time): void - { - $this->time = $time; - } - - /** - * @return int - */ - public function getSize(): int - { - return $this->size; - } - - /** - * @param int $size - */ - public function setSize(int $size): void - { - $this->size = $size; - } -} diff --git a/vendor/maennchen/zipstream-php/src/Option/Method.php b/vendor/maennchen/zipstream-php/src/Option/Method.php deleted file mode 100644 index bbec84c..0000000 --- a/vendor/maennchen/zipstream-php/src/Option/Method.php +++ /dev/null @@ -1,19 +0,0 @@ -stream = $stream; - } - - /** - * Closes the stream and any underlying resources. - * - * @return void - */ - public function close(): void - { - if (is_resource($this->stream)) { - fclose($this->stream); - } - $this->detach(); - } - - /** - * Separates any underlying resources from the stream. - * - * After the stream has been detached, the stream is in an unusable state. - * - * @return resource|null Underlying PHP stream, if any - */ - public function detach() - { - $result = $this->stream; - $this->stream = null; - return $result; - } - - /** - * Reads all data from the stream into a string, from the beginning to end. - * - * This method MUST attempt to seek to the beginning of the stream before - * reading data and read the stream until the end is reached. - * - * Warning: This could attempt to load a large amount of data into memory. - * - * This method MUST NOT raise an exception in order to conform with PHP's - * string casting operations. - * - * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring - * @return string - */ - public function __toString(): string - { - try { - $this->seek(0); - } catch (\RuntimeException $e) {} - return (string) stream_get_contents($this->stream); - } - - /** - * Seek to a position in the stream. - * - * @link http://www.php.net/manual/en/function.fseek.php - * @param int $offset Stream offset - * @param int $whence Specifies how the cursor position will be calculated - * based on the seek offset. Valid values are identical to the built-in - * PHP $whence values for `fseek()`. SEEK_SET: Set position equal to - * offset bytes SEEK_CUR: Set position to current location plus offset - * SEEK_END: Set position to end-of-stream plus offset. - * @throws \RuntimeException on failure. - */ - public function seek($offset, $whence = SEEK_SET): void - { - if (!$this->isSeekable()) { - throw new RuntimeException; - } - if (fseek($this->stream, $offset, $whence) !== 0) { - throw new RuntimeException; - } - } - - /** - * Returns whether or not the stream is seekable. - * - * @return bool - */ - public function isSeekable(): bool - { - return (bool)$this->getMetadata('seekable'); - } - - /** - * Get stream metadata as an associative array or retrieve a specific key. - * - * The keys returned are identical to the keys returned from PHP's - * stream_get_meta_data() function. - * - * @link http://php.net/manual/en/function.stream-get-meta-data.php - * @param string $key Specific metadata to retrieve. - * @return array|mixed|null Returns an associative array if no key is - * provided. Returns a specific key value if a key is provided and the - * value is found, or null if the key is not found. - */ - public function getMetadata($key = null) - { - $metadata = stream_get_meta_data($this->stream); - return $key !== null ? @$metadata[$key] : $metadata; - } - - /** - * Get the size of the stream if known. - * - * @return int|null Returns the size in bytes if known, or null if unknown. - */ - public function getSize(): ?int - { - $stats = fstat($this->stream); - return $stats['size']; - } - - /** - * Returns the current position of the file read/write pointer - * - * @return int Position of the file pointer - * @throws \RuntimeException on error. - */ - public function tell(): int - { - $position = ftell($this->stream); - if ($position === false) { - throw new RuntimeException; - } - return $position; - } - - /** - * Returns true if the stream is at the end of the stream. - * - * @return bool - */ - public function eof(): bool - { - return feof($this->stream); - } - - /** - * Seek to the beginning of the stream. - * - * If the stream is not seekable, this method will raise an exception; - * otherwise, it will perform a seek(0). - * - * @see seek() - * @link http://www.php.net/manual/en/function.fseek.php - * @throws \RuntimeException on failure. - */ - public function rewind(): void - { - $this->seek(0); - } - - /** - * Write data to the stream. - * - * @param string $string The string that is to be written. - * @return int Returns the number of bytes written to the stream. - * @throws \RuntimeException on failure. - */ - public function write($string): int - { - if (!$this->isWritable()) { - throw new RuntimeException; - } - if (fwrite($this->stream, $string) === false) { - throw new RuntimeException; - } - return \mb_strlen($string); - } - - /** - * Returns whether or not the stream is writable. - * - * @return bool - */ - public function isWritable(): bool - { - return preg_match('/[waxc+]/', $this->getMetadata('mode')) === 1; - } - - /** - * Read data from the stream. - * - * @param int $length Read up to $length bytes from the object and return - * them. Fewer than $length bytes may be returned if underlying stream - * call returns fewer bytes. - * @return string Returns the data read from the stream, or an empty string - * if no bytes are available. - * @throws \RuntimeException if an error occurs. - */ - public function read($length): string - { - if (!$this->isReadable()) { - throw new RuntimeException; - } - $result = fread($this->stream, $length); - if ($result === false) { - throw new RuntimeException; - } - return $result; - } - - /** - * Returns whether or not the stream is readable. - * - * @return bool - */ - public function isReadable(): bool - { - return preg_match('/[r+]/', $this->getMetadata('mode')) === 1; - } - - /** - * Returns the remaining contents in a string - * - * @return string - * @throws \RuntimeException if unable to read or an error occurs while - * reading. - */ - public function getContents(): string - { - if (!$this->isReadable()) { - throw new RuntimeException; - } - $result = stream_get_contents($this->stream); - if ($result === false) { - throw new RuntimeException; - } - return $result; - } -} diff --git a/vendor/maennchen/zipstream-php/src/ZipStream.php b/vendor/maennchen/zipstream-php/src/ZipStream.php deleted file mode 100644 index e83038c..0000000 --- a/vendor/maennchen/zipstream-php/src/ZipStream.php +++ /dev/null @@ -1,599 +0,0 @@ -addFile('some_file.gif', $data); - * - * * add second file - * $data = file_get_contents('some_file.gif'); - * $zip->addFile('another_file.png', $data); - * - * 3. Finish the zip stream: - * - * $zip->finish(); - * - * You can also add an archive comment, add comments to individual files, - * and adjust the timestamp of files. See the API documentation for each - * method below for additional information. - * - * Example: - * - * // create a new zip stream object - * $zip = new ZipStream('some_files.zip'); - * - * // list of local files - * $files = array('foo.txt', 'bar.jpg'); - * - * // read and add each file to the archive - * foreach ($files as $path) - * $zip->addFile($path, file_get_contents($path)); - * - * // write archive footer to stream - * $zip->finish(); - */ -class ZipStream -{ - /** - * This number corresponds to the ZIP version/OS used (2 bytes) - * From: https://www.iana.org/assignments/media-types/application/zip - * The upper byte (leftmost one) indicates the host system (OS) for the - * file. Software can use this information to determine - * the line record format for text files etc. The current - * mappings are: - * - * 0 - MS-DOS and OS/2 (F.A.T. file systems) - * 1 - Amiga 2 - VAX/VMS - * 3 - *nix 4 - VM/CMS - * 5 - Atari ST 6 - OS/2 H.P.F.S. - * 7 - Macintosh 8 - Z-System - * 9 - CP/M 10 thru 255 - unused - * - * The lower byte (rightmost one) indicates the version number of the - * software used to encode the file. The value/10 - * indicates the major version number, and the value - * mod 10 is the minor version number. - * Here we are using 6 for the OS, indicating OS/2 H.P.F.S. - * to prevent file permissions issues upon extract (see #84) - * 0x603 is 00000110 00000011 in binary, so 6 and 3 - */ - const ZIP_VERSION_MADE_BY = 0x603; - - /** - * The following signatures end with 0x4b50, which in ASCII isĀ PK, - * the initials of the inventor Phil Katz. - * See https://en.wikipedia.org/wiki/Zip_(file_format)#File_headers - */ - const FILE_HEADER_SIGNATURE = 0x04034b50; - const CDR_FILE_SIGNATURE = 0x02014b50; - const CDR_EOF_SIGNATURE = 0x06054b50; - const DATA_DESCRIPTOR_SIGNATURE = 0x08074b50; - const ZIP64_CDR_EOF_SIGNATURE = 0x06064b50; - const ZIP64_CDR_LOCATOR_SIGNATURE = 0x07064b50; - - /** - * Global Options - * - * @var ArchiveOptions - */ - public $opt; - - /** - * @var array - */ - public $files = []; - - /** - * @var Bigint - */ - public $cdr_ofs; - - /** - * @var Bigint - */ - public $ofs; - - /** - * @var bool - */ - protected $need_headers; - - /** - * @var null|String - */ - protected $output_name; - - /** - * Create a new ZipStream object. - * - * Parameters: - * - * @param String $name - Name of output file (optional). - * @param ArchiveOptions $opt - Archive Options - * - * Large File Support: - * - * By default, the method addFileFromPath() will send send files - * larger than 20 megabytes along raw rather than attempting to - * compress them. You can change both the maximum size and the - * compression behavior using the largeFile* options above, with the - * following caveats: - * - * * For "small" files (e.g. files smaller than largeFileSize), the - * memory use can be up to twice that of the actual file. In other - * words, adding a 10 megabyte file to the archive could potentially - * occupy 20 megabytes of memory. - * - * * Enabling compression on large files (e.g. files larger than - * large_file_size) is extremely slow, because ZipStream has to pass - * over the large file once to calculate header information, and then - * again to compress and send the actual data. - * - * Examples: - * - * // create a new zip file named 'foo.zip' - * $zip = new ZipStream('foo.zip'); - * - * // create a new zip file named 'bar.zip' with a comment - * $opt->setComment = 'this is a comment for the zip file.'; - * $zip = new ZipStream('bar.zip', $opt); - * - * Notes: - * - * In order to let this library send HTTP headers, a filename must be given - * _and_ the option `sendHttpHeaders` must be `true`. This behavior is to - * allow software to send its own headers (including the filename), and - * still use this library. - */ - public function __construct(?string $name = null, ?ArchiveOptions $opt = null) - { - $this->opt = $opt ?: new ArchiveOptions(); - - $this->output_name = $name; - $this->need_headers = $name && $this->opt->isSendHttpHeaders(); - - $this->cdr_ofs = new Bigint(); - $this->ofs = new Bigint(); - } - - /** - * addFile - * - * Add a file to the archive. - * - * @param String $name - path of file in archive (including directory). - * @param String $data - contents of file - * @param FileOptions $options - * - * File Options: - * time - Last-modified timestamp (seconds since the epoch) of - * this file. Defaults to the current time. - * comment - Comment related to this file. - * method - Storage method for file ("store" or "deflate") - * - * Examples: - * - * // add a file named 'foo.txt' - * $data = file_get_contents('foo.txt'); - * $zip->addFile('foo.txt', $data); - * - * // add a file named 'bar.jpg' with a comment and a last-modified - * // time of two hours ago - * $data = file_get_contents('bar.jpg'); - * $opt->setTime = time() - 2 * 3600; - * $opt->setComment = 'this is a comment about bar.jpg'; - * $zip->addFile('bar.jpg', $data, $opt); - */ - public function addFile(string $name, string $data, ?FileOptions $options = null): void - { - $options = $options ?: new FileOptions(); - $options->defaultTo($this->opt); - - $file = new File($this, $name, $options); - $file->processData($data); - } - - /** - * addFileFromPath - * - * Add a file at path to the archive. - * - * Note that large files may be compressed differently than smaller - * files; see the "Large File Support" section above for more - * information. - * - * @param String $name - name of file in archive (including directory path). - * @param String $path - path to file on disk (note: paths should be encoded using - * UNIX-style forward slashes -- e.g '/path/to/some/file'). - * @param FileOptions $options - * - * File Options: - * time - Last-modified timestamp (seconds since the epoch) of - * this file. Defaults to the current time. - * comment - Comment related to this file. - * method - Storage method for file ("store" or "deflate") - * - * Examples: - * - * // add a file named 'foo.txt' from the local file '/tmp/foo.txt' - * $zip->addFileFromPath('foo.txt', '/tmp/foo.txt'); - * - * // add a file named 'bigfile.rar' from the local file - * // '/usr/share/bigfile.rar' with a comment and a last-modified - * // time of two hours ago - * $path = '/usr/share/bigfile.rar'; - * $opt->setTime = time() - 2 * 3600; - * $opt->setComment = 'this is a comment about bar.jpg'; - * $zip->addFileFromPath('bigfile.rar', $path, $opt); - * - * @return void - * @throws \ZipStream\Exception\FileNotFoundException - * @throws \ZipStream\Exception\FileNotReadableException - */ - public function addFileFromPath(string $name, string $path, ?FileOptions $options = null): void - { - $options = $options ?: new FileOptions(); - $options->defaultTo($this->opt); - - $file = new File($this, $name, $options); - $file->processPath($path); - } - - /** - * addFileFromStream - * - * Add an open stream to the archive. - * - * @param String $name - path of file in archive (including directory). - * @param resource $stream - contents of file as a stream resource - * @param FileOptions $options - * - * File Options: - * time - Last-modified timestamp (seconds since the epoch) of - * this file. Defaults to the current time. - * comment - Comment related to this file. - * - * Examples: - * - * // create a temporary file stream and write text to it - * $fp = tmpfile(); - * fwrite($fp, 'The quick brown fox jumped over the lazy dog.'); - * - * // add a file named 'streamfile.txt' from the content of the stream - * $x->addFileFromStream('streamfile.txt', $fp); - * - * @return void - */ - public function addFileFromStream(string $name, $stream, ?FileOptions $options = null): void - { - $options = $options ?: new FileOptions(); - $options->defaultTo($this->opt); - - $file = new File($this, $name, $options); - $file->processStream(new DeflateStream($stream)); - } - - /** - * addFileFromPsr7Stream - * - * Add an open stream to the archive. - * - * @param String $name - path of file in archive (including directory). - * @param StreamInterface $stream - contents of file as a stream resource - * @param FileOptions $options - * - * File Options: - * time - Last-modified timestamp (seconds since the epoch) of - * this file. Defaults to the current time. - * comment - Comment related to this file. - * - * Examples: - * - * // create a temporary file stream and write text to it - * $fp = tmpfile(); - * fwrite($fp, 'The quick brown fox jumped over the lazy dog.'); - * - * // add a file named 'streamfile.txt' from the content of the stream - * $x->addFileFromPsr7Stream('streamfile.txt', $fp); - * - * @return void - */ - public function addFileFromPsr7Stream( - string $name, - StreamInterface $stream, - ?FileOptions $options = null - ): void { - $options = $options ?: new FileOptions(); - $options->defaultTo($this->opt); - - $file = new File($this, $name, $options); - $file->processStream($stream); - } - - /** - * finish - * - * Write zip footer to stream. - * - * Example: - * - * // add a list of files to the archive - * $files = array('foo.txt', 'bar.jpg'); - * foreach ($files as $path) - * $zip->addFile($path, file_get_contents($path)); - * - * // write footer to stream - * $zip->finish(); - * @return void - * - * @throws OverflowException - */ - public function finish(): void - { - // add trailing cdr file records - foreach ($this->files as $cdrFile) { - $this->send($cdrFile); - $this->cdr_ofs = $this->cdr_ofs->add(Bigint::init(strlen($cdrFile))); - } - - // Add 64bit headers (if applicable) - if (count($this->files) >= 0xFFFF || - $this->cdr_ofs->isOver32() || - $this->ofs->isOver32()) { - if (!$this->opt->isEnableZip64()) { - throw new OverflowException(); - } - - $this->addCdr64Eof(); - $this->addCdr64Locator(); - } - - // add trailing cdr eof record - $this->addCdrEof(); - - // The End - $this->clear(); - } - - /** - * Send ZIP64 CDR EOF (Central Directory Record End-of-File) record. - * - * @return void - */ - protected function addCdr64Eof(): void - { - $num_files = count($this->files); - $cdr_length = $this->cdr_ofs; - $cdr_offset = $this->ofs; - - $fields = [ - ['V', static::ZIP64_CDR_EOF_SIGNATURE], // ZIP64 end of central file header signature - ['P', 44], // Length of data below this header (length of block - 12) = 44 - ['v', static::ZIP_VERSION_MADE_BY], // Made by version - ['v', Version::ZIP64], // Extract by version - ['V', 0x00], // disk number - ['V', 0x00], // no of disks - ['P', $num_files], // no of entries on disk - ['P', $num_files], // no of entries in cdr - ['P', $cdr_length], // CDR size - ['P', $cdr_offset], // CDR offset - ]; - - $ret = static::packFields($fields); - $this->send($ret); - } - - /** - * Create a format string and argument list for pack(), then call - * pack() and return the result. - * - * @param array $fields - * @return string - */ - public static function packFields(array $fields): string - { - $fmt = ''; - $args = []; - - // populate format string and argument list - foreach ($fields as [$format, $value]) { - if ($format === 'P') { - $fmt .= 'VV'; - if ($value instanceof Bigint) { - $args[] = $value->getLow32(); - $args[] = $value->getHigh32(); - } else { - $args[] = $value; - $args[] = 0; - } - } else { - if ($value instanceof Bigint) { - $value = $value->getLow32(); - } - $fmt .= $format; - $args[] = $value; - } - } - - // prepend format string to argument list - array_unshift($args, $fmt); - - // build output string from header and compressed data - return pack(...$args); - } - - /** - * Send string, sending HTTP headers if necessary. - * Flush output after write if configure option is set. - * - * @param String $str - * @return void - */ - public function send(string $str): void - { - if ($this->need_headers) { - $this->sendHttpHeaders(); - } - $this->need_headers = false; - - fwrite($this->opt->getOutputStream(), $str); - - if ($this->opt->isFlushOutput()) { - // flush output buffer if it is on and flushable - $status = ob_get_status(); - if (isset($status['flags']) && ($status['flags'] & PHP_OUTPUT_HANDLER_FLUSHABLE)) { - ob_flush(); - } - - // Flush system buffers after flushing userspace output buffer - flush(); - } - } - - /** - * Send HTTP headers for this stream. - * - * @return void - */ - protected function sendHttpHeaders(): void - { - // grab content disposition - $disposition = $this->opt->getContentDisposition(); - - if ($this->output_name) { - // Various different browsers dislike various characters here. Strip them all for safety. - $safe_output = trim(str_replace(['"', "'", '\\', ';', "\n", "\r"], '', $this->output_name)); - - // Check if we need to UTF-8 encode the filename - $urlencoded = rawurlencode($safe_output); - $disposition .= "; filename*=UTF-8''{$urlencoded}"; - } - - $headers = array( - 'Content-Type' => $this->opt->getContentType(), - 'Content-Disposition' => $disposition, - 'Pragma' => 'public', - 'Cache-Control' => 'public, must-revalidate', - 'Content-Transfer-Encoding' => 'binary' - ); - - $call = $this->opt->getHttpHeaderCallback(); - foreach ($headers as $key => $val) { - $call("$key: $val"); - } - } - - /** - * Send ZIP64 CDR Locator (Central Directory Record Locator) record. - * - * @return void - */ - protected function addCdr64Locator(): void - { - $cdr_offset = $this->ofs->add($this->cdr_ofs); - - $fields = [ - ['V', static::ZIP64_CDR_LOCATOR_SIGNATURE], // ZIP64 end of central file header signature - ['V', 0x00], // Disc number containing CDR64EOF - ['P', $cdr_offset], // CDR offset - ['V', 1], // Total number of disks - ]; - - $ret = static::packFields($fields); - $this->send($ret); - } - - /** - * Send CDR EOF (Central Directory Record End-of-File) record. - * - * @return void - */ - protected function addCdrEof(): void - { - $num_files = count($this->files); - $cdr_length = $this->cdr_ofs; - $cdr_offset = $this->ofs; - - // grab comment (if specified) - $comment = $this->opt->getComment(); - - $fields = [ - ['V', static::CDR_EOF_SIGNATURE], // end of central file header signature - ['v', 0x00], // disk number - ['v', 0x00], // no of disks - ['v', min($num_files, 0xFFFF)], // no of entries on disk - ['v', min($num_files, 0xFFFF)], // no of entries in cdr - ['V', $cdr_length->getLowFF()], // CDR size - ['V', $cdr_offset->getLowFF()], // CDR offset - ['v', strlen($comment)], // Zip Comment size - ]; - - $ret = static::packFields($fields) . $comment; - $this->send($ret); - } - - /** - * Clear all internal variables. Note that the stream object is not - * usable after this. - * - * @return void - */ - protected function clear(): void - { - $this->files = []; - $this->ofs = new Bigint(); - $this->cdr_ofs = new Bigint(); - $this->opt = new ArchiveOptions(); - } - - /** - * Is this file larger than large_file_size? - * - * @param string $path - * @return bool - */ - public function isLargeFile(string $path): bool - { - if (!$this->opt->isStatFiles()) { - return false; - } - $stat = stat($path); - return $stat['size'] > $this->opt->getLargeFileSize(); - } - - /** - * Save file attributes for trailing CDR record. - * - * @param File $file - * @return void - */ - public function addToCdr(File $file): void - { - $file->ofs = $this->ofs; - $this->ofs = $this->ofs->add($file->getTotalLength()); - $this->files[] = $file->getCdrFile(); - } -} diff --git a/vendor/maennchen/zipstream-php/test/BigintTest.php b/vendor/maennchen/zipstream-php/test/BigintTest.php deleted file mode 100644 index ac9c7c2..0000000 --- a/vendor/maennchen/zipstream-php/test/BigintTest.php +++ /dev/null @@ -1,65 +0,0 @@ -assertSame('0x0000000012345678', $bigint->getHex64()); - $this->assertSame(0x12345678, $bigint->getLow32()); - $this->assertSame(0, $bigint->getHigh32()); - } - - public function testConstructLarge(): void - { - $bigint = new Bigint(0x87654321); - $this->assertSame('0x0000000087654321', $bigint->getHex64()); - $this->assertSame('87654321', bin2hex(pack('N', $bigint->getLow32()))); - $this->assertSame(0, $bigint->getHigh32()); - } - - public function testAddSmallValue(): void - { - $bigint = new Bigint(1); - $bigint = $bigint->add(Bigint::init(2)); - $this->assertSame(3, $bigint->getLow32()); - $this->assertFalse($bigint->isOver32()); - $this->assertTrue($bigint->isOver32(true)); - $this->assertSame($bigint->getLowFF(), (float)$bigint->getLow32()); - $this->assertSame($bigint->getLowFF(true), (float)0xFFFFFFFF); - } - - public function testAddWithOverflowAtLowestByte(): void - { - $bigint = new Bigint(0xFF); - $bigint = $bigint->add(Bigint::init(0x01)); - $this->assertSame(0x100, $bigint->getLow32()); - } - - public function testAddWithOverflowAtInteger32(): void - { - $bigint = new Bigint(0xFFFFFFFE); - $this->assertFalse($bigint->isOver32()); - $bigint = $bigint->add(Bigint::init(0x01)); - $this->assertTrue($bigint->isOver32()); - $bigint = $bigint->add(Bigint::init(0x01)); - $this->assertSame('0x0000000100000000', $bigint->getHex64()); - $this->assertTrue($bigint->isOver32()); - $this->assertSame((float)0xFFFFFFFF, $bigint->getLowFF()); - } - - public function testAddWithOverflowAtInteger64(): void - { - $bigint = Bigint::fromLowHigh(0xFFFFFFFF, 0xFFFFFFFF); - $this->assertSame('0xFFFFFFFFFFFFFFFF', $bigint->getHex64()); - $this->expectException(OverflowException::class); - $bigint->add(Bigint::init(1)); - } -} diff --git a/vendor/maennchen/zipstream-php/test/ZipStreamTest.php b/vendor/maennchen/zipstream-php/test/ZipStreamTest.php deleted file mode 100644 index 6549b0b..0000000 --- a/vendor/maennchen/zipstream-php/test/ZipStreamTest.php +++ /dev/null @@ -1,586 +0,0 @@ -expectException(\ZipStream\Exception\FileNotFoundException::class); - // Get ZipStream Object - $zip = new ZipStream(); - - // Trigger error by adding a file which doesn't exist - $zip->addFileFromPath('foobar.php', '/foo/bar/foobar.php'); - } - - public function testFileNotReadableException(): void - { - // create new virtual filesystem - $root = vfsStream::setup('vfs'); - // create a virtual file with no permissions - $file = vfsStream::newFile('foo.txt', 0000)->at($root)->setContent('bar'); - $zip = new ZipStream(); - $this->expectException(\ZipStream\Exception\FileNotReadableException::class); - $zip->addFileFromPath('foo.txt', $file->url()); - } - - public function testDostime(): void - { - // Allows testing of protected method - $class = new \ReflectionClass(File::class); - $method = $class->getMethod('dostime'); - $method->setAccessible(true); - - $this->assertSame($method->invoke(null, 1416246368), 1165069764); - - // January 1 1980 - DOS Epoch. - $this->assertSame($method->invoke(null, 315532800), 2162688); - - // January 1 1970 -> January 1 1980 due to minimum DOS Epoch. @todo Throw Exception? - $this->assertSame($method->invoke(null, 0), 2162688); - } - - public function testAddFile(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $zip->addFile('sample.txt', 'Sample String Data'); - $zip->addFile('test/sample.txt', 'More Simple Sample Data'); - - $zip->finish(); - fclose($stream); - - $tmpDir = $this->validateAndExtractZip($tmp); - - $files = $this->getRecursiveFileList($tmpDir); - $this->assertEquals(['sample.txt', 'test/sample.txt'], $files); - - $this->assertStringEqualsFile($tmpDir . '/sample.txt', 'Sample String Data'); - $this->assertStringEqualsFile($tmpDir . '/test/sample.txt', 'More Simple Sample Data'); - } - - /** - * @return array - */ - protected function getTmpFileStream(): array - { - $tmp = tempnam(sys_get_temp_dir(), 'zipstreamtest'); - $stream = fopen($tmp, 'wb+'); - - return array($tmp, $stream); - } - - /** - * @param string $tmp - * @return string - */ - protected function validateAndExtractZip($tmp): string - { - $tmpDir = $this->getTmpDir(); - - $zipArch = new \ZipArchive; - $res = $zipArch->open($tmp); - - if ($res !== true) { - $this->fail("Failed to open {$tmp}. Code: $res"); - - return $tmpDir; - } - - $this->assertEquals(0, $zipArch->status); - $this->assertEquals(0, $zipArch->statusSys); - - $zipArch->extractTo($tmpDir); - $zipArch->close(); - - return $tmpDir; - } - - protected function getTmpDir(): string - { - $tmp = tempnam(sys_get_temp_dir(), 'zipstreamtest'); - unlink($tmp); - mkdir($tmp) or $this->fail('Failed to make directory'); - - return $tmp; - } - - /** - * @param string $path - * @return string[] - */ - protected function getRecursiveFileList(string $path): array - { - $data = array(); - $path = (string)realpath($path); - $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path)); - - $pathLen = strlen($path); - foreach ($files as $file) { - $filePath = $file->getRealPath(); - if (!is_dir($filePath)) { - $data[] = substr($filePath, $pathLen + 1); - } - } - - sort($data); - - return $data; - } - - public function testAddFileUtf8NameComment(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $name = 'Ć”rvĆ­ztűrő tükƶrfĆŗrógĆ©p.txt'; - $content = 'Sample String Data'; - $comment = - 'Filename has every special characters ' . - 'from Hungarian language in lowercase. ' . - 'In uppercase: ĆĆÅ°ÅĆœĆ–ĆšĆ“Ć‰'; - - $fileOptions = new FileOptions(); - $fileOptions->setComment($comment); - - $zip->addFile($name, $content, $fileOptions); - $zip->finish(); - fclose($stream); - - $tmpDir = $this->validateAndExtractZip($tmp); - - $files = $this->getRecursiveFileList($tmpDir); - $this->assertEquals(array($name), $files); - $this->assertStringEqualsFile($tmpDir . '/' . $name, $content); - - $zipArch = new \ZipArchive(); - $zipArch->open($tmp); - $this->assertEquals($comment, $zipArch->getCommentName($name)); - } - - public function testAddFileUtf8NameNonUtfComment(): void - { - $this->expectException(\ZipStream\Exception\EncodingException::class); - - $stream = $this->getTmpFileStream()[1]; - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $name = 'Ć”.txt'; - $content = 'any'; - $comment = 'Ć”'; - - $fileOptions = new FileOptions(); - $fileOptions->setComment(mb_convert_encoding($comment, 'ISO-8859-2', 'UTF-8')); - - $zip->addFile($name, $content, $fileOptions); - } - - public function testAddFileNonUtf8NameUtfComment(): void - { - $this->expectException(\ZipStream\Exception\EncodingException::class); - - $stream = $this->getTmpFileStream()[1]; - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $name = 'Ć”.txt'; - $content = 'any'; - $comment = 'Ć”'; - - $fileOptions = new FileOptions(); - $fileOptions->setComment($comment); - - $zip->addFile(mb_convert_encoding($name, 'ISO-8859-2', 'UTF-8'), $content, $fileOptions); - } - - public function testAddFileWithStorageMethod(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); - - $zip->addFile('sample.txt', 'Sample String Data', $fileOptions); - $zip->addFile('test/sample.txt', 'More Simple Sample Data'); - $zip->finish(); - fclose($stream); - - $zipArch = new \ZipArchive(); - $zipArch->open($tmp); - - $sample1 = $zipArch->statName('sample.txt'); - $sample12 = $zipArch->statName('test/sample.txt'); - $this->assertEquals($sample1['comp_method'], Method::STORE); - $this->assertEquals($sample12['comp_method'], Method::DEFLATE); - - $zipArch->close(); - } - - public function testDecompressFileWithMacUnarchiver(): void - { - if (!file_exists(self::OSX_ARCHIVE_UTILITY)) { - $this->markTestSkipped('The Mac OSX Archive Utility is not available.'); - } - - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $folder = uniqid('', true); - - $zip->addFile($folder . '/sample.txt', 'Sample Data'); - $zip->finish(); - fclose($stream); - - exec(escapeshellarg(self::OSX_ARCHIVE_UTILITY) . ' ' . escapeshellarg($tmp), $output, $returnStatus); - - $this->assertEquals(0, $returnStatus); - $this->assertCount(0, $output); - - $this->assertFileExists(dirname($tmp) . '/' . $folder . '/sample.txt'); - $this->assertStringEqualsFile(dirname($tmp) . '/' . $folder . '/sample.txt', 'Sample Data'); - } - - public function testAddFileFromPath(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - [$tmpExample, $streamExample] = $this->getTmpFileStream(); - fwrite($streamExample, 'Sample String Data'); - fclose($streamExample); - $zip->addFileFromPath('sample.txt', $tmpExample); - - [$tmpExample, $streamExample] = $this->getTmpFileStream(); - fwrite($streamExample, 'More Simple Sample Data'); - fclose($streamExample); - $zip->addFileFromPath('test/sample.txt', $tmpExample); - - $zip->finish(); - fclose($stream); - - $tmpDir = $this->validateAndExtractZip($tmp); - - $files = $this->getRecursiveFileList($tmpDir); - $this->assertEquals(array('sample.txt', 'test/sample.txt'), $files); - - $this->assertStringEqualsFile($tmpDir . '/sample.txt', 'Sample String Data'); - $this->assertStringEqualsFile($tmpDir . '/test/sample.txt', 'More Simple Sample Data'); - } - - public function testAddFileFromPathWithStorageMethod(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); - - [$tmpExample, $streamExample] = $this->getTmpFileStream(); - fwrite($streamExample, 'Sample String Data'); - fclose($streamExample); - $zip->addFileFromPath('sample.txt', $tmpExample, $fileOptions); - - [$tmpExample, $streamExample] = $this->getTmpFileStream(); - fwrite($streamExample, 'More Simple Sample Data'); - fclose($streamExample); - $zip->addFileFromPath('test/sample.txt', $tmpExample); - - $zip->finish(); - fclose($stream); - - $zipArch = new \ZipArchive(); - $zipArch->open($tmp); - - $sample1 = $zipArch->statName('sample.txt'); - $this->assertEquals(Method::STORE, $sample1['comp_method']); - - $sample2 = $zipArch->statName('test/sample.txt'); - $this->assertEquals(Method::DEFLATE, $sample2['comp_method']); - - $zipArch->close(); - } - - public function testAddLargeFileFromPath(): void - { - $methods = [Method::DEFLATE(), Method::STORE()]; - $falseTrue = [false, true]; - foreach ($methods as $method) { - foreach ($falseTrue as $zeroHeader) { - foreach ($falseTrue as $zip64) { - if ($zeroHeader && $method->equals(Method::DEFLATE())) { - continue; - } - $this->addLargeFileFileFromPath($method, $zeroHeader, $zip64); - } - } - } - } - - protected function addLargeFileFileFromPath($method, $zeroHeader, $zip64): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - $options->setLargeFileMethod($method); - $options->setLargeFileSize(5); - $options->setZeroHeader($zeroHeader); - $options->setEnableZip64($zip64); - - $zip = new ZipStream(null, $options); - - [$tmpExample, $streamExample] = $this->getTmpFileStream(); - for ($i = 0; $i <= 10000; $i++) { - fwrite($streamExample, sha1((string)$i)); - if ($i % 100 === 0) { - fwrite($streamExample, "\n"); - } - } - fclose($streamExample); - $shaExample = sha1_file($tmpExample); - $zip->addFileFromPath('sample.txt', $tmpExample); - unlink($tmpExample); - - $zip->finish(); - fclose($stream); - - $tmpDir = $this->validateAndExtractZip($tmp); - - $files = $this->getRecursiveFileList($tmpDir); - $this->assertEquals(array('sample.txt'), $files); - - $this->assertEquals(sha1_file($tmpDir . '/sample.txt'), $shaExample, "SHA-1 Mismatch Method: {$method}"); - } - - public function testAddFileFromStream(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - // In this test we can't use temporary stream to feed data - // because zlib.deflate filter gives empty string before PHP 7 - // it works fine with file stream - $streamExample = fopen(__FILE__, 'rb'); - $zip->addFileFromStream('sample.txt', $streamExample); -// fclose($streamExample); - - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); - - $streamExample2 = fopen('php://temp', 'wb+'); - fwrite($streamExample2, 'More Simple Sample Data'); - rewind($streamExample2); // move the pointer back to the beginning of file. - $zip->addFileFromStream('test/sample.txt', $streamExample2, $fileOptions); -// fclose($streamExample2); - - $zip->finish(); - fclose($stream); - - $tmpDir = $this->validateAndExtractZip($tmp); - - $files = $this->getRecursiveFileList($tmpDir); - $this->assertEquals(array('sample.txt', 'test/sample.txt'), $files); - - $this->assertStringEqualsFile(__FILE__, file_get_contents($tmpDir . '/sample.txt')); - $this->assertStringEqualsFile($tmpDir . '/test/sample.txt', 'More Simple Sample Data'); - } - - public function testAddFileFromStreamWithStorageMethod(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); - - $streamExample = fopen('php://temp', 'wb+'); - fwrite($streamExample, 'Sample String Data'); - rewind($streamExample); // move the pointer back to the beginning of file. - $zip->addFileFromStream('sample.txt', $streamExample, $fileOptions); -// fclose($streamExample); - - $streamExample2 = fopen('php://temp', 'bw+'); - fwrite($streamExample2, 'More Simple Sample Data'); - rewind($streamExample2); // move the pointer back to the beginning of file. - $zip->addFileFromStream('test/sample.txt', $streamExample2); -// fclose($streamExample2); - - $zip->finish(); - fclose($stream); - - $zipArch = new \ZipArchive(); - $zipArch->open($tmp); - - $sample1 = $zipArch->statName('sample.txt'); - $this->assertEquals(Method::STORE, $sample1['comp_method']); - - $sample2 = $zipArch->statName('test/sample.txt'); - $this->assertEquals(Method::DEFLATE, $sample2['comp_method']); - - $zipArch->close(); - } - - public function testAddFileFromPsr7Stream(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $body = 'Sample String Data'; - $response = new Response(200, [], $body); - - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); - - $zip->addFileFromPsr7Stream('sample.json', $response->getBody(), $fileOptions); - $zip->finish(); - fclose($stream); - - $tmpDir = $this->validateAndExtractZip($tmp); - - $files = $this->getRecursiveFileList($tmpDir); - $this->assertEquals(array('sample.json'), $files); - $this->assertStringEqualsFile($tmpDir . '/sample.json', $body); - } - - public function testAddFileFromPsr7StreamWithFileSizeSet(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - - $zip = new ZipStream(null, $options); - - $body = 'Sample String Data'; - $fileSize = strlen($body); - // Add fake padding - $fakePadding = "\0\0\0\0\0\0"; - $response = new Response(200, [], $body . $fakePadding); - - $fileOptions = new FileOptions(); - $fileOptions->setMethod(Method::STORE()); - $fileOptions->setSize($fileSize); - $zip->addFileFromPsr7Stream('sample.json', $response->getBody(), $fileOptions); - $zip->finish(); - fclose($stream); - - $tmpDir = $this->validateAndExtractZip($tmp); - - $files = $this->getRecursiveFileList($tmpDir); - $this->assertEquals(array('sample.json'), $files); - $this->assertStringEqualsFile($tmpDir . '/sample.json', $body); - } - - public function testCreateArchiveWithFlushOptionSet(): void - { - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - $options->setFlushOutput(true); - - $zip = new ZipStream(null, $options); - - $zip->addFile('sample.txt', 'Sample String Data'); - $zip->addFile('test/sample.txt', 'More Simple Sample Data'); - - $zip->finish(); - fclose($stream); - - $tmpDir = $this->validateAndExtractZip($tmp); - - $files = $this->getRecursiveFileList($tmpDir); - $this->assertEquals(['sample.txt', 'test/sample.txt'], $files); - - $this->assertStringEqualsFile($tmpDir . '/sample.txt', 'Sample String Data'); - $this->assertStringEqualsFile($tmpDir . '/test/sample.txt', 'More Simple Sample Data'); - } - - public function testCreateArchiveWithOutputBufferingOffAndFlushOptionSet(): void - { - // WORKAROUND (1/2): remove phpunit's output buffer in order to run test without any buffering - ob_end_flush(); - $this->assertEquals(0, ob_get_level()); - - [$tmp, $stream] = $this->getTmpFileStream(); - - $options = new ArchiveOptions(); - $options->setOutputStream($stream); - $options->setFlushOutput(true); - - $zip = new ZipStream(null, $options); - - $zip->addFile('sample.txt', 'Sample String Data'); - - $zip->finish(); - fclose($stream); - - $tmpDir = $this->validateAndExtractZip($tmp); - $this->assertStringEqualsFile($tmpDir . '/sample.txt', 'Sample String Data'); - - // WORKAROUND (2/2): add back output buffering so that PHPUnit doesn't complain that it is missing - ob_start(); - } -} diff --git a/vendor/maennchen/zipstream-php/test/bootstrap.php b/vendor/maennchen/zipstream-php/test/bootstrap.php deleted file mode 100644 index b43c9bd..0000000 --- a/vendor/maennchen/zipstream-php/test/bootstrap.php +++ /dev/null @@ -1,6 +0,0 @@ -setOutputStream(fopen('php://memory', 'wb')); - $fileOpt->setTime(clone $expectedTime); - - $zip = new ZipStream(null, $archiveOpt); - - $zip->addFile('sample.txt', 'Sample', $fileOpt); - - $zip->finish(); - - $this->assertEquals($expectedTime, $fileOpt->getTime()); - } -} diff --git a/vendor/markbaker/complex/README.md b/vendor/markbaker/complex/README.md deleted file mode 100644 index c306394..0000000 --- a/vendor/markbaker/complex/README.md +++ /dev/null @@ -1,156 +0,0 @@ -PHPComplex -========== - ---- - -PHP Class for handling Complex numbers - -Master: [![Build Status](https://travis-ci.org/MarkBaker/PHPComplex.png?branch=master)](http://travis-ci.org/MarkBaker/PHPComplex) - -Develop: [![Build Status](https://travis-ci.org/MarkBaker/PHPComplex.png?branch=develop)](http://travis-ci.org/MarkBaker/PHPComplex) - -[![Complex Numbers](https://imgs.xkcd.com/comics/complex_numbers_2x.png)](https://xkcd.com/2028/) - ---- - -The library currently provides the following operations: - - - addition - - subtraction - - multiplication - - division - - division by - - division into - -together with functions for - - - theta (polar theta angle) - - rho (polar distance/radius) - - conjugate - * negative - - inverse (1 / complex) - - cos (cosine) - - acos (inverse cosine) - - cosh (hyperbolic cosine) - - acosh (inverse hyperbolic cosine) - - sin (sine) - - asin (inverse sine) - - sinh (hyperbolic sine) - - asinh (inverse hyperbolic sine) - - sec (secant) - - asec (inverse secant) - - sech (hyperbolic secant) - - asech (inverse hyperbolic secant) - - csc (cosecant) - - acsc (inverse cosecant) - - csch (hyperbolic secant) - - acsch (inverse hyperbolic secant) - - tan (tangent) - - atan (inverse tangent) - - tanh (hyperbolic tangent) - - atanh (inverse hyperbolic tangent) - - cot (cotangent) - - acot (inverse cotangent) - - coth (hyperbolic cotangent) - - acoth (inverse hyperbolic cotangent) - - sqrt (square root) - - exp (exponential) - - ln (natural log) - - log10 (base-10 log) - - log2 (base-2 log) - - pow (raised to the power of a real number) - - ---- - -# Usage - -To create a new complex object, you can provide either the real, imaginary and suffix parts as individual values, or as an array of values passed passed to the constructor; or a string representing the value. e.g - -``` -$real = 1.23; -$imaginary = -4.56; -$suffix = 'i'; - -$complexObject = new Complex\Complex($real, $imaginary, $suffix); -``` -or -``` -$real = 1.23; -$imaginary = -4.56; -$suffix = 'i'; - -$arguments = [$real, $imaginary, $suffix]; - -$complexObject = new Complex\Complex($arguments); -``` -or -``` -$complexString = '1.23-4.56i'; - -$complexObject = new Complex\Complex($complexString); -``` - -Complex objects are immutable: whenever you call a method or pass a complex value to a function that returns a complex value, a new Complex object will be returned, and the original will remain unchanged. -This also allows you to chain multiple methods as you would for a fluent interface (as long as they are methods that will return a Complex result). - -## Performing Mathematical Operations - -To perform mathematical operations with Complex values, you can call the appropriate method against a complex value, passing other values as arguments - -``` -$complexString1 = '1.23-4.56i'; -$complexString2 = '2.34+5.67i'; - -$complexObject = new Complex\Complex($complexString1); -echo $complexObject->add($complexString2); -``` -or pass all values to the appropriate function -``` -$complexString1 = '1.23-4.56i'; -$complexString2 = '2.34+5.67i'; - -echo Complex\add($complexString1, $complexString2); -``` -If you want to perform the same operation against multiple values (e.g. to add three or more complex numbers), then you can pass multiple arguments to any of the operations. - -You can pass these arguments as Complex objects, or as an array or string that will parse to a complex object. - -## Using functions - -When calling any of the available functions for a complex value, you can either call the relevant method for the Complex object -``` -$complexString = '1.23-4.56i'; - -$complexObject = new Complex\Complex($complexString); -echo $complexObject->sinh(); -``` -or you can call the function as you would in procedural code, passing the Complex object as an argument -``` -$complexString = '1.23-4.56i'; - -$complexObject = new Complex\Complex($complexString); -echo Complex\sinh($complexObject); -``` -When called procedurally using the function, you can pass in the argument as a Complex object, or as an array or string that will parse to a complex object. -``` -$complexString = '1.23-4.56i'; - -echo Complex\sinh($complexString); -``` - -In the case of the `pow()` function (the only implemented function that requires an additional argument) you need to pass both arguments when calling the function procedurally - -``` -$complexString = '1.23-4.56i'; - -$complexObject = new Complex\Complex($complexString); -echo Complex\pow($complexObject, 2); -``` -or pass the additional argument when calling the method -``` -$complexString = '1.23-4.56i'; - -$complexObject = new Complex\Complex($complexString); -echo $complexObject->pow(2); -``` diff --git a/vendor/markbaker/complex/classes/Autoloader.php b/vendor/markbaker/complex/classes/Autoloader.php deleted file mode 100644 index 792ecef..0000000 --- a/vendor/markbaker/complex/classes/Autoloader.php +++ /dev/null @@ -1,53 +0,0 @@ -regex = $regex; - parent::__construct($it, $regex); - } -} - -class FilenameFilter extends FilesystemRegexFilter -{ - // Filter files against the regex - public function accept() - { - return (!$this->isFile() || preg_match($this->regex, $this->getFilename())); - } -} - - -$srcFolder = __DIR__ . DIRECTORY_SEPARATOR . 'src'; -$srcDirectory = new RecursiveDirectoryIterator($srcFolder); - -$filteredFileList = new FilenameFilter($srcDirectory, '/(?:php)$/i'); -$filteredFileList = new FilenameFilter($filteredFileList, '/^(?!.*(Complex|Exception)\.php).*$/i'); - -foreach (new RecursiveIteratorIterator($filteredFileList) as $file) { - if ($file->isFile()) { - include_once $file; - } -} diff --git a/vendor/markbaker/complex/classes/src/Complex.php b/vendor/markbaker/complex/classes/src/Complex.php deleted file mode 100644 index f7ba162..0000000 --- a/vendor/markbaker/complex/classes/src/Complex.php +++ /dev/null @@ -1,390 +0,0 @@ -realPart = (float) $realPart; - $this->imaginaryPart = (float) $imaginaryPart; - $this->suffix = strtolower($suffix); - } - - /** - * Gets the real part of this complex number - * - * @return Float - */ - public function getReal(): float - { - return $this->realPart; - } - - /** - * Gets the imaginary part of this complex number - * - * @return Float - */ - public function getImaginary(): float - { - return $this->imaginaryPart; - } - - /** - * Gets the suffix of this complex number - * - * @return String - */ - public function getSuffix(): string - { - return $this->suffix; - } - - /** - * Returns true if this is a real value, false if a complex value - * - * @return Bool - */ - public function isReal(): bool - { - return $this->imaginaryPart == 0.0; - } - - /** - * Returns true if this is a complex value, false if a real value - * - * @return Bool - */ - public function isComplex(): bool - { - return !$this->isReal(); - } - - public function format(): string - { - $str = ""; - if ($this->imaginaryPart != 0.0) { - if (\abs($this->imaginaryPart) != 1.0) { - $str .= $this->imaginaryPart . $this->suffix; - } else { - $str .= (($this->imaginaryPart < 0.0) ? '-' : '') . $this->suffix; - } - } - if ($this->realPart != 0.0) { - if (($str) && ($this->imaginaryPart > 0.0)) { - $str = "+" . $str; - } - $str = $this->realPart . $str; - } - if (!$str) { - $str = "0.0"; - } - - return $str; - } - - public function __toString(): string - { - return $this->format(); - } - - /** - * Validates whether the argument is a valid complex number, converting scalar or array values if possible - * - * @param mixed $complex The value to validate - * @return Complex - * @throws Exception If the argument isn't a Complex number or cannot be converted to one - */ - public static function validateComplexArgument($complex): Complex - { - if (is_scalar($complex) || is_array($complex)) { - $complex = new Complex($complex); - } elseif (!is_object($complex) || !($complex instanceof Complex)) { - throw new Exception('Value is not a valid complex number'); - } - - return $complex; - } - - /** - * Returns the reverse of this complex number - * - * @return Complex - */ - public function reverse(): Complex - { - return new Complex( - $this->imaginaryPart, - $this->realPart, - ($this->realPart == 0.0) ? null : $this->suffix - ); - } - - public function invertImaginary(): Complex - { - return new Complex( - $this->realPart, - $this->imaginaryPart * -1, - ($this->imaginaryPart == 0.0) ? null : $this->suffix - ); - } - - public function invertReal(): Complex - { - return new Complex( - $this->realPart * -1, - $this->imaginaryPart, - ($this->imaginaryPart == 0.0) ? null : $this->suffix - ); - } - - protected static $functions = [ - 'abs', - 'acos', - 'acosh', - 'acot', - 'acoth', - 'acsc', - 'acsch', - 'argument', - 'asec', - 'asech', - 'asin', - 'asinh', - 'atan', - 'atanh', - 'conjugate', - 'cos', - 'cosh', - 'cot', - 'coth', - 'csc', - 'csch', - 'exp', - 'inverse', - 'ln', - 'log2', - 'log10', - 'negative', - 'pow', - 'rho', - 'sec', - 'sech', - 'sin', - 'sinh', - 'sqrt', - 'tan', - 'tanh', - 'theta', - ]; - - protected static $operations = [ - 'add', - 'subtract', - 'multiply', - 'divideby', - 'divideinto', - ]; - - /** - * Returns the result of the function call or operation - * - * @return Complex|float - * @throws Exception|\InvalidArgumentException - */ - public function __call($functionName, $arguments) - { - $functionName = strtolower(str_replace('_', '', $functionName)); - - // Test for function calls - if (in_array($functionName, self::$functions, true)) { - $functionName = "\\" . __NAMESPACE__ . "\\{$functionName}"; - return $functionName($this, ...$arguments); - } - // Test for operation calls - if (in_array($functionName, self::$operations, true)) { - $functionName = "\\" . __NAMESPACE__ . "\\{$functionName}"; - return $functionName($this, ...$arguments); - } - throw new Exception('Complex Function or Operation does not exist'); - } -} diff --git a/vendor/markbaker/complex/classes/src/Exception.php b/vendor/markbaker/complex/classes/src/Exception.php deleted file mode 100644 index a2beb73..0000000 --- a/vendor/markbaker/complex/classes/src/Exception.php +++ /dev/null @@ -1,13 +0,0 @@ -getReal() - $invsqrt->getImaginary(), - $complex->getImaginary() + $invsqrt->getReal() - ); - $log = ln($adjust); - - return new Complex( - $log->getImaginary(), - -1 * $log->getReal() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/acosh.php b/vendor/markbaker/complex/classes/src/functions/acosh.php deleted file mode 100644 index 18a992e..0000000 --- a/vendor/markbaker/complex/classes/src/functions/acosh.php +++ /dev/null @@ -1,34 +0,0 @@ -isReal() && ($complex->getReal() > 1)) { - return new Complex(\acosh($complex->getReal())); - } - - $acosh = acos($complex) - ->reverse(); - if ($acosh->getReal() < 0.0) { - $acosh = $acosh->invertReal(); - } - - return $acosh; -} diff --git a/vendor/markbaker/complex/classes/src/functions/acot.php b/vendor/markbaker/complex/classes/src/functions/acot.php deleted file mode 100644 index 4ddc2dd..0000000 --- a/vendor/markbaker/complex/classes/src/functions/acot.php +++ /dev/null @@ -1,25 +0,0 @@ -getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return new Complex(INF); - } - - return asin(inverse($complex)); -} diff --git a/vendor/markbaker/complex/classes/src/functions/acsch.php b/vendor/markbaker/complex/classes/src/functions/acsch.php deleted file mode 100644 index 66d9bdf..0000000 --- a/vendor/markbaker/complex/classes/src/functions/acsch.php +++ /dev/null @@ -1,29 +0,0 @@ -getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return new Complex(INF); - } - - return asinh(inverse($complex)); -} diff --git a/vendor/markbaker/complex/classes/src/functions/argument.php b/vendor/markbaker/complex/classes/src/functions/argument.php deleted file mode 100644 index 17217bb..0000000 --- a/vendor/markbaker/complex/classes/src/functions/argument.php +++ /dev/null @@ -1,28 +0,0 @@ -getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return new Complex(INF); - } - - return acos(inverse($complex)); -} diff --git a/vendor/markbaker/complex/classes/src/functions/asech.php b/vendor/markbaker/complex/classes/src/functions/asech.php deleted file mode 100644 index 929b0d1..0000000 --- a/vendor/markbaker/complex/classes/src/functions/asech.php +++ /dev/null @@ -1,29 +0,0 @@ -getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return new Complex(INF); - } - - return acosh(inverse($complex)); -} diff --git a/vendor/markbaker/complex/classes/src/functions/asin.php b/vendor/markbaker/complex/classes/src/functions/asin.php deleted file mode 100644 index b675046..0000000 --- a/vendor/markbaker/complex/classes/src/functions/asin.php +++ /dev/null @@ -1,37 +0,0 @@ -getReal() - $complex->getImaginary(), - $invsqrt->getImaginary() + $complex->getReal() - ); - $log = ln($adjust); - - return new Complex( - $log->getImaginary(), - -1 * $log->getReal() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/asinh.php b/vendor/markbaker/complex/classes/src/functions/asinh.php deleted file mode 100644 index 3e5c294..0000000 --- a/vendor/markbaker/complex/classes/src/functions/asinh.php +++ /dev/null @@ -1,33 +0,0 @@ -isReal() && ($complex->getReal() > 1)) { - return new Complex(\asinh($complex->getReal())); - } - - $asinh = clone $complex; - $asinh = $asinh->reverse() - ->invertReal(); - $asinh = asin($asinh); - return $asinh->reverse() - ->invertImaginary(); -} diff --git a/vendor/markbaker/complex/classes/src/functions/atan.php b/vendor/markbaker/complex/classes/src/functions/atan.php deleted file mode 100644 index ecbea80..0000000 --- a/vendor/markbaker/complex/classes/src/functions/atan.php +++ /dev/null @@ -1,45 +0,0 @@ -isReal()) { - return new Complex(\atan($complex->getReal())); - } - - $t1Value = new Complex(-1 * $complex->getImaginary(), $complex->getReal()); - $uValue = new Complex(1, 0); - - $d1Value = clone $uValue; - $d1Value = subtract($d1Value, $t1Value); - $d2Value = add($t1Value, $uValue); - $uResult = $d1Value->divideBy($d2Value); - $uResult = ln($uResult); - - return new Complex( - (($uResult->getImaginary() == M_PI) ? -M_PI : $uResult->getImaginary()) * -0.5, - $uResult->getReal() * 0.5, - $complex->getSuffix() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/atanh.php b/vendor/markbaker/complex/classes/src/functions/atanh.php deleted file mode 100644 index 189493b..0000000 --- a/vendor/markbaker/complex/classes/src/functions/atanh.php +++ /dev/null @@ -1,38 +0,0 @@ -isReal()) { - $real = $complex->getReal(); - if ($real >= -1.0 && $real <= 1.0) { - return new Complex(\atanh($real)); - } else { - return new Complex(\atanh(1 / $real), (($real < 0.0) ? M_PI_2 : -1 * M_PI_2)); - } - } - - $iComplex = clone $complex; - $iComplex = $iComplex->invertImaginary() - ->reverse(); - return atan($iComplex) - ->invertReal() - ->reverse(); -} diff --git a/vendor/markbaker/complex/classes/src/functions/conjugate.php b/vendor/markbaker/complex/classes/src/functions/conjugate.php deleted file mode 100644 index 5266617..0000000 --- a/vendor/markbaker/complex/classes/src/functions/conjugate.php +++ /dev/null @@ -1,28 +0,0 @@ -getReal(), - -1 * $complex->getImaginary(), - $complex->getSuffix() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/cos.php b/vendor/markbaker/complex/classes/src/functions/cos.php deleted file mode 100644 index 0c6ea1a..0000000 --- a/vendor/markbaker/complex/classes/src/functions/cos.php +++ /dev/null @@ -1,34 +0,0 @@ -isReal()) { - return new Complex(\cos($complex->getReal())); - } - - return conjugate( - new Complex( - \cos($complex->getReal()) * \cosh($complex->getImaginary()), - \sin($complex->getReal()) * \sinh($complex->getImaginary()), - $complex->getSuffix() - ) - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/cosh.php b/vendor/markbaker/complex/classes/src/functions/cosh.php deleted file mode 100644 index ee674c2..0000000 --- a/vendor/markbaker/complex/classes/src/functions/cosh.php +++ /dev/null @@ -1,32 +0,0 @@ -isReal()) { - return new Complex(\cosh($complex->getReal())); - } - - return new Complex( - \cosh($complex->getReal()) * \cos($complex->getImaginary()), - \sinh($complex->getReal()) * \sin($complex->getImaginary()), - $complex->getSuffix() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/cot.php b/vendor/markbaker/complex/classes/src/functions/cot.php deleted file mode 100644 index 693d0f7..0000000 --- a/vendor/markbaker/complex/classes/src/functions/cot.php +++ /dev/null @@ -1,29 +0,0 @@ -getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return new Complex(INF); - } - - return inverse(tan($complex)); -} diff --git a/vendor/markbaker/complex/classes/src/functions/coth.php b/vendor/markbaker/complex/classes/src/functions/coth.php deleted file mode 100644 index 1ff1ad5..0000000 --- a/vendor/markbaker/complex/classes/src/functions/coth.php +++ /dev/null @@ -1,24 +0,0 @@ -getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return new Complex(INF); - } - - return inverse(sin($complex)); -} diff --git a/vendor/markbaker/complex/classes/src/functions/csch.php b/vendor/markbaker/complex/classes/src/functions/csch.php deleted file mode 100644 index acaa6c0..0000000 --- a/vendor/markbaker/complex/classes/src/functions/csch.php +++ /dev/null @@ -1,29 +0,0 @@ -getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return new Complex(INF); - } - - return inverse(sinh($complex)); -} diff --git a/vendor/markbaker/complex/classes/src/functions/exp.php b/vendor/markbaker/complex/classes/src/functions/exp.php deleted file mode 100644 index 8ab3b3e..0000000 --- a/vendor/markbaker/complex/classes/src/functions/exp.php +++ /dev/null @@ -1,34 +0,0 @@ -getReal() == 0.0) && (\abs($complex->getImaginary()) == M_PI)) { - return new Complex(-1.0, 0.0); - } - - $rho = \exp($complex->getReal()); - - return new Complex( - $rho * \cos($complex->getImaginary()), - $rho * \sin($complex->getImaginary()), - $complex->getSuffix() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/inverse.php b/vendor/markbaker/complex/classes/src/functions/inverse.php deleted file mode 100644 index 563e3fd..0000000 --- a/vendor/markbaker/complex/classes/src/functions/inverse.php +++ /dev/null @@ -1,29 +0,0 @@ -getReal() == 0.0 && $complex->getImaginary() == 0.0) { - throw new \InvalidArgumentException('Division by zero'); - } - - return $complex->divideInto(1.0); -} diff --git a/vendor/markbaker/complex/classes/src/functions/ln.php b/vendor/markbaker/complex/classes/src/functions/ln.php deleted file mode 100644 index d57bb7a..0000000 --- a/vendor/markbaker/complex/classes/src/functions/ln.php +++ /dev/null @@ -1,33 +0,0 @@ -getReal() == 0.0) && ($complex->getImaginary() == 0.0)) { - throw new \InvalidArgumentException(); - } - - return new Complex( - \log(rho($complex)), - theta($complex), - $complex->getSuffix() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/log10.php b/vendor/markbaker/complex/classes/src/functions/log10.php deleted file mode 100644 index ce4d001..0000000 --- a/vendor/markbaker/complex/classes/src/functions/log10.php +++ /dev/null @@ -1,32 +0,0 @@ -getReal() == 0.0) && ($complex->getImaginary() == 0.0)) { - throw new \InvalidArgumentException(); - } elseif (($complex->getReal() > 0.0) && ($complex->getImaginary() == 0.0)) { - return new Complex(\log10($complex->getReal()), 0.0, $complex->getSuffix()); - } - - return ln($complex) - ->multiply(\log10(Complex::EULER)); -} diff --git a/vendor/markbaker/complex/classes/src/functions/log2.php b/vendor/markbaker/complex/classes/src/functions/log2.php deleted file mode 100644 index 21b3e2a..0000000 --- a/vendor/markbaker/complex/classes/src/functions/log2.php +++ /dev/null @@ -1,32 +0,0 @@ -getReal() == 0.0) && ($complex->getImaginary() == 0.0)) { - throw new \InvalidArgumentException(); - } elseif (($complex->getReal() > 0.0) && ($complex->getImaginary() == 0.0)) { - return new Complex(\log($complex->getReal(), 2), 0.0, $complex->getSuffix()); - } - - return ln($complex) - ->multiply(\log(Complex::EULER, 2)); -} diff --git a/vendor/markbaker/complex/classes/src/functions/negative.php b/vendor/markbaker/complex/classes/src/functions/negative.php deleted file mode 100644 index 232e178..0000000 --- a/vendor/markbaker/complex/classes/src/functions/negative.php +++ /dev/null @@ -1,31 +0,0 @@ -getReal(), - -1 * $complex->getImaginary(), - $complex->getSuffix() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/pow.php b/vendor/markbaker/complex/classes/src/functions/pow.php deleted file mode 100644 index da3340f..0000000 --- a/vendor/markbaker/complex/classes/src/functions/pow.php +++ /dev/null @@ -1,40 +0,0 @@ -getImaginary() == 0.0 && $complex->getReal() >= 0.0) { - return new Complex(\pow($complex->getReal(), $power)); - } - - $rValue = \sqrt(($complex->getReal() * $complex->getReal()) + ($complex->getImaginary() * $complex->getImaginary())); - $rPower = \pow($rValue, $power); - $theta = $complex->argument() * $power; - if ($theta == 0) { - return new Complex(1); - } - - return new Complex($rPower * \cos($theta), $rPower * \sin($theta), $complex->getSuffix()); -} diff --git a/vendor/markbaker/complex/classes/src/functions/rho.php b/vendor/markbaker/complex/classes/src/functions/rho.php deleted file mode 100644 index d5264a7..0000000 --- a/vendor/markbaker/complex/classes/src/functions/rho.php +++ /dev/null @@ -1,28 +0,0 @@ -getReal() * $complex->getReal()) + - ($complex->getImaginary() * $complex->getImaginary()) - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/sec.php b/vendor/markbaker/complex/classes/src/functions/sec.php deleted file mode 100644 index 1c7768d..0000000 --- a/vendor/markbaker/complex/classes/src/functions/sec.php +++ /dev/null @@ -1,25 +0,0 @@ -isReal()) { - return new Complex(\sin($complex->getReal())); - } - - return new Complex( - \sin($complex->getReal()) * \cosh($complex->getImaginary()), - \cos($complex->getReal()) * \sinh($complex->getImaginary()), - $complex->getSuffix() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/sinh.php b/vendor/markbaker/complex/classes/src/functions/sinh.php deleted file mode 100644 index f051a8e..0000000 --- a/vendor/markbaker/complex/classes/src/functions/sinh.php +++ /dev/null @@ -1,32 +0,0 @@ -isReal()) { - return new Complex(\sinh($complex->getReal())); - } - - return new Complex( - \sinh($complex->getReal()) * \cos($complex->getImaginary()), - \cosh($complex->getReal()) * \sin($complex->getImaginary()), - $complex->getSuffix() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/sqrt.php b/vendor/markbaker/complex/classes/src/functions/sqrt.php deleted file mode 100644 index 17c19c7..0000000 --- a/vendor/markbaker/complex/classes/src/functions/sqrt.php +++ /dev/null @@ -1,29 +0,0 @@ -getSuffix()); -} diff --git a/vendor/markbaker/complex/classes/src/functions/tan.php b/vendor/markbaker/complex/classes/src/functions/tan.php deleted file mode 100644 index 6996a3a..0000000 --- a/vendor/markbaker/complex/classes/src/functions/tan.php +++ /dev/null @@ -1,40 +0,0 @@ -isReal()) { - return new Complex(\tan($complex->getReal())); - } - - $real = $complex->getReal(); - $imaginary = $complex->getImaginary(); - $divisor = 1 + \pow(\tan($real), 2) * \pow(\tanh($imaginary), 2); - if ($divisor == 0.0) { - throw new \InvalidArgumentException('Division by zero'); - } - - return new Complex( - \pow(sech($imaginary)->getReal(), 2) * \tan($real) / $divisor, - \pow(sec($real)->getReal(), 2) * \tanh($imaginary) / $divisor, - $complex->getSuffix() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/tanh.php b/vendor/markbaker/complex/classes/src/functions/tanh.php deleted file mode 100644 index a401042..0000000 --- a/vendor/markbaker/complex/classes/src/functions/tanh.php +++ /dev/null @@ -1,35 +0,0 @@ -getReal(); - $imaginary = $complex->getImaginary(); - $divisor = \cos($imaginary) * \cos($imaginary) + \sinh($real) * \sinh($real); - if ($divisor == 0.0) { - throw new \InvalidArgumentException('Division by zero'); - } - - return new Complex( - \sinh($real) * \cosh($real) / $divisor, - 0.5 * \sin(2 * $imaginary) / $divisor, - $complex->getSuffix() - ); -} diff --git a/vendor/markbaker/complex/classes/src/functions/theta.php b/vendor/markbaker/complex/classes/src/functions/theta.php deleted file mode 100644 index f022abb..0000000 --- a/vendor/markbaker/complex/classes/src/functions/theta.php +++ /dev/null @@ -1,38 +0,0 @@ -getReal() == 0.0) { - if ($complex->isReal()) { - return 0.0; - } elseif ($complex->getImaginary() < 0.0) { - return M_PI / -2; - } - return M_PI / 2; - } elseif ($complex->getReal() > 0.0) { - return \atan($complex->getImaginary() / $complex->getReal()); - } elseif ($complex->getImaginary() < 0.0) { - return -(M_PI - \atan(\abs($complex->getImaginary()) / \abs($complex->getReal()))); - } - - return M_PI - \atan($complex->getImaginary() / \abs($complex->getReal())); -} diff --git a/vendor/markbaker/complex/classes/src/operations/add.php b/vendor/markbaker/complex/classes/src/operations/add.php deleted file mode 100644 index 6963bb0..0000000 --- a/vendor/markbaker/complex/classes/src/operations/add.php +++ /dev/null @@ -1,46 +0,0 @@ -isComplex() && $complex->isComplex() && - $result->getSuffix() !== $complex->getSuffix()) { - throw new Exception('Suffix Mismatch'); - } - - $real = $result->getReal() + $complex->getReal(); - $imaginary = $result->getImaginary() + $complex->getImaginary(); - - $result = new Complex( - $real, - $imaginary, - ($imaginary == 0.0) ? null : max($result->getSuffix(), $complex->getSuffix()) - ); - } - - return $result; -} diff --git a/vendor/markbaker/complex/classes/src/operations/divideby.php b/vendor/markbaker/complex/classes/src/operations/divideby.php deleted file mode 100644 index a680931..0000000 --- a/vendor/markbaker/complex/classes/src/operations/divideby.php +++ /dev/null @@ -1,56 +0,0 @@ -isComplex() && $complex->isComplex() && - $result->getSuffix() !== $complex->getSuffix()) { - throw new Exception('Suffix Mismatch'); - } - if ($complex->getReal() == 0.0 && $complex->getImaginary() == 0.0) { - throw new \InvalidArgumentException('Division by zero'); - } - - $delta1 = ($result->getReal() * $complex->getReal()) + - ($result->getImaginary() * $complex->getImaginary()); - $delta2 = ($result->getImaginary() * $complex->getReal()) - - ($result->getReal() * $complex->getImaginary()); - $delta3 = ($complex->getReal() * $complex->getReal()) + - ($complex->getImaginary() * $complex->getImaginary()); - - $real = $delta1 / $delta3; - $imaginary = $delta2 / $delta3; - - $result = new Complex( - $real, - $imaginary, - ($imaginary == 0.0) ? null : max($result->getSuffix(), $complex->getSuffix()) - ); - } - - return $result; -} diff --git a/vendor/markbaker/complex/classes/src/operations/divideinto.php b/vendor/markbaker/complex/classes/src/operations/divideinto.php deleted file mode 100644 index 7086993..0000000 --- a/vendor/markbaker/complex/classes/src/operations/divideinto.php +++ /dev/null @@ -1,56 +0,0 @@ -isComplex() && $complex->isComplex() && - $result->getSuffix() !== $complex->getSuffix()) { - throw new Exception('Suffix Mismatch'); - } - if ($result->getReal() == 0.0 && $result->getImaginary() == 0.0) { - throw new \InvalidArgumentException('Division by zero'); - } - - $delta1 = ($complex->getReal() * $result->getReal()) + - ($complex->getImaginary() * $result->getImaginary()); - $delta2 = ($complex->getImaginary() * $result->getReal()) - - ($complex->getReal() * $result->getImaginary()); - $delta3 = ($result->getReal() * $result->getReal()) + - ($result->getImaginary() * $result->getImaginary()); - - $real = $delta1 / $delta3; - $imaginary = $delta2 / $delta3; - - $result = new Complex( - $real, - $imaginary, - ($imaginary == 0.0) ? null : max($result->getSuffix(), $complex->getSuffix()) - ); - } - - return $result; -} diff --git a/vendor/markbaker/complex/classes/src/operations/multiply.php b/vendor/markbaker/complex/classes/src/operations/multiply.php deleted file mode 100644 index 06a52b2..0000000 --- a/vendor/markbaker/complex/classes/src/operations/multiply.php +++ /dev/null @@ -1,48 +0,0 @@ -isComplex() && $complex->isComplex() && - $result->getSuffix() !== $complex->getSuffix()) { - throw new Exception('Suffix Mismatch'); - } - - $real = ($result->getReal() * $complex->getReal()) - - ($result->getImaginary() * $complex->getImaginary()); - $imaginary = ($result->getReal() * $complex->getImaginary()) + - ($result->getImaginary() * $complex->getReal()); - - $result = new Complex( - $real, - $imaginary, - ($imaginary == 0.0) ? null : max($result->getSuffix(), $complex->getSuffix()) - ); - } - - return $result; -} diff --git a/vendor/markbaker/complex/classes/src/operations/subtract.php b/vendor/markbaker/complex/classes/src/operations/subtract.php deleted file mode 100644 index 0d9985c..0000000 --- a/vendor/markbaker/complex/classes/src/operations/subtract.php +++ /dev/null @@ -1,46 +0,0 @@ -isComplex() && $complex->isComplex() && - $result->getSuffix() !== $complex->getSuffix()) { - throw new Exception('Suffix Mismatch'); - } - - $real = $result->getReal() - $complex->getReal(); - $imaginary = $result->getImaginary() - $complex->getImaginary(); - - $result = new Complex( - $real, - $imaginary, - ($imaginary == 0.0) ? null : max($result->getSuffix(), $complex->getSuffix()) - ); - } - - return $result; -} diff --git a/vendor/markbaker/complex/composer.json b/vendor/markbaker/complex/composer.json deleted file mode 100644 index a343d6e..0000000 --- a/vendor/markbaker/complex/composer.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "markbaker/complex", - "type": "library", - "description": "PHP Class for working with complex numbers", - "keywords": ["complex", "mathematics"], - "homepage": "https://github.com/MarkBaker/PHPComplex", - "license": "MIT", - "authors": [ - { - "name": "Mark Baker", - "email": "mark@lange.demon.co.uk" - } - ], - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", - "phpdocumentor/phpdocumentor": "2.*", - "phpmd/phpmd": "2.*", - "sebastian/phpcpd": "^4.0", - "phploc/phploc": "^4.0", - "squizlabs/php_codesniffer": "^3.4", - "phpcompatibility/php-compatibility": "^9.0", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0" - }, - "autoload": { - "psr-4": { - "Complex\\": "classes/src/" - }, - "files": [ - "classes/src/functions/abs.php", - "classes/src/functions/acos.php", - "classes/src/functions/acosh.php", - "classes/src/functions/acot.php", - "classes/src/functions/acoth.php", - "classes/src/functions/acsc.php", - "classes/src/functions/acsch.php", - "classes/src/functions/argument.php", - "classes/src/functions/asec.php", - "classes/src/functions/asech.php", - "classes/src/functions/asin.php", - "classes/src/functions/asinh.php", - "classes/src/functions/atan.php", - "classes/src/functions/atanh.php", - "classes/src/functions/conjugate.php", - "classes/src/functions/cos.php", - "classes/src/functions/cosh.php", - "classes/src/functions/cot.php", - "classes/src/functions/coth.php", - "classes/src/functions/csc.php", - "classes/src/functions/csch.php", - "classes/src/functions/exp.php", - "classes/src/functions/inverse.php", - "classes/src/functions/ln.php", - "classes/src/functions/log2.php", - "classes/src/functions/log10.php", - "classes/src/functions/negative.php", - "classes/src/functions/pow.php", - "classes/src/functions/rho.php", - "classes/src/functions/sec.php", - "classes/src/functions/sech.php", - "classes/src/functions/sin.php", - "classes/src/functions/sinh.php", - "classes/src/functions/sqrt.php", - "classes/src/functions/tan.php", - "classes/src/functions/tanh.php", - "classes/src/functions/theta.php", - "classes/src/operations/add.php", - "classes/src/operations/subtract.php", - "classes/src/operations/multiply.php", - "classes/src/operations/divideby.php", - "classes/src/operations/divideinto.php" - ] - }, - "scripts": { - "style": "phpcs --report-width=200 --standard=PSR2 --report=summary,full classes/src/ unitTests/classes/src -n", - "mess": "phpmd classes/src/ xml codesize,unusedcode,design,naming -n", - "lines": "phploc classes/src/ -n", - "cpd": "phpcpd classes/src/ -n", - "versions": "phpcs --report-width=200 --standard=PHPCompatibility --report=summary,full classes/src/ --runtime-set testVersion 7.2- -n" - }, - "minimum-stability": "dev" -} diff --git a/vendor/markbaker/complex/examples/complexTest.php b/vendor/markbaker/complex/examples/complexTest.php deleted file mode 100644 index 7dafd8a..0000000 --- a/vendor/markbaker/complex/examples/complexTest.php +++ /dev/null @@ -1,154 +0,0 @@ -add(456); -echo $x, PHP_EOL; - -$x = new Complex(123.456); -$x->add(789.012); -echo $x, PHP_EOL; - -$x = new Complex(123.456, 78.90); -$x->add(new Complex(-987.654, -32.1)); -echo $x, PHP_EOL; - -$x = new Complex(123.456, 78.90); -$x->add(-987.654); -echo $x, PHP_EOL; - -$x = new Complex(-987.654, -32.1); -$x->add(new Complex(0, 1)); -echo $x, PHP_EOL; - -$x = new Complex(-987.654, -32.1); -$x->add(new Complex(0, -1)); -echo $x, PHP_EOL; - - -echo PHP_EOL, 'Subtract', PHP_EOL; - -$x = new Complex(123); -$x->subtract(456); -echo $x, PHP_EOL; - -$x = new Complex(123.456); -$x->subtract(789.012); -echo $x, PHP_EOL; - -$x = new Complex(123.456, 78.90); -$x->subtract(new Complex(-987.654, -32.1)); -echo $x, PHP_EOL; - -$x = new Complex(123.456, 78.90); -$x->subtract(-987.654); -echo $x, PHP_EOL; - -$x = new Complex(-987.654, -32.1); -$x->subtract(new Complex(0, 1)); -echo $x, PHP_EOL; - -$x = new Complex(-987.654, -32.1); -$x->subtract(new Complex(0, -1)); -echo $x, PHP_EOL; - - -echo PHP_EOL, 'Multiply', PHP_EOL; - -$x = new Complex(123); -$x->multiply(456); -echo $x, PHP_EOL; - -$x = new Complex(123.456); -$x->multiply(789.012); -echo $x, PHP_EOL; - -$x = new Complex(123.456, 78.90); -$x->multiply(new Complex(-987.654, -32.1)); -echo $x, PHP_EOL; - -$x = new Complex(123.456, 78.90); -$x->multiply(-987.654); -echo $x, PHP_EOL; - -$x = new Complex(-987.654, -32.1); -$x->multiply(new Complex(0, 1)); -echo $x, PHP_EOL; - -$x = new Complex(-987.654, -32.1); -$x->multiply(new Complex(0, -1)); -echo $x, PHP_EOL; - - -echo PHP_EOL, 'Divide By', PHP_EOL; - -$x = new Complex(123); -$x->divideBy(456); -echo $x, PHP_EOL; - -$x = new Complex(123.456); -$x->divideBy(789.012); -echo $x, PHP_EOL; - -$x = new Complex(123.456, 78.90); -$x->divideBy(new Complex(-987.654, -32.1)); -echo $x, PHP_EOL; - -$x = new Complex(123.456, 78.90); -$x->divideBy(-987.654); -echo $x, PHP_EOL; - -$x = new Complex(-987.654, -32.1); -$x->divideBy(new Complex(0, 1)); -echo $x, PHP_EOL; - -$x = new Complex(-987.654, -32.1); -$x->divideBy(new Complex(0, -1)); -echo $x, PHP_EOL; - - -echo PHP_EOL, 'Divide Into', PHP_EOL; - -$x = new Complex(123); -$x->divideInto(456); -echo $x, PHP_EOL; - -$x = new Complex(123.456); -$x->divideInto(789.012); -echo $x, PHP_EOL; - -$x = new Complex(123.456, 78.90); -$x->divideInto(new Complex(-987.654, -32.1)); -echo $x, PHP_EOL; - -$x = new Complex(123.456, 78.90); -$x->divideInto(-987.654); -echo $x, PHP_EOL; - -$x = new Complex(-987.654, -32.1); -$x->divideInto(new Complex(0, 1)); -echo $x, PHP_EOL; - -$x = new Complex(-987.654, -32.1); -$x->divideInto(new Complex(0, -1)); -echo $x, PHP_EOL; diff --git a/vendor/markbaker/complex/examples/testFunctions.php b/vendor/markbaker/complex/examples/testFunctions.php deleted file mode 100644 index 4d5ed73..0000000 --- a/vendor/markbaker/complex/examples/testFunctions.php +++ /dev/null @@ -1,52 +0,0 @@ -getMessage(), PHP_EOL; - } - } - echo PHP_EOL; - } -} diff --git a/vendor/markbaker/complex/examples/testOperations.php b/vendor/markbaker/complex/examples/testOperations.php deleted file mode 100644 index f791263..0000000 --- a/vendor/markbaker/complex/examples/testOperations.php +++ /dev/null @@ -1,34 +0,0 @@ - ', $result, PHP_EOL; - -echo PHP_EOL; - -echo 'Subtraction', PHP_EOL; - -$result = \Complex\subtract(...$values); -echo '=> ', $result, PHP_EOL; - -echo PHP_EOL; - -echo 'Multiplication', PHP_EOL; - -$result = \Complex\multiply(...$values); -echo '=> ', $result, PHP_EOL; diff --git a/vendor/markbaker/complex/license.md b/vendor/markbaker/complex/license.md deleted file mode 100644 index 5b4b156..0000000 --- a/vendor/markbaker/complex/license.md +++ /dev/null @@ -1,25 +0,0 @@ -The MIT License (MIT) -===================== - -Copyright Ā© `2017` `Mark Baker` - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the ā€œSoftwareā€), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ā€œAS ISā€, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/markbaker/matrix/README.md b/vendor/markbaker/matrix/README.md deleted file mode 100644 index 66a1de4..0000000 --- a/vendor/markbaker/matrix/README.md +++ /dev/null @@ -1,165 +0,0 @@ -PHPMatrix -========== - ---- - -PHP Class for handling Matrices - -Master: [![Build Status](https://travis-ci.org/MarkBaker/PHPMatrix.png?branch=master)](http://travis-ci.org/MarkBaker/PHPMatrix) - -Develop: [![Build Status](https://travis-ci.org/MarkBaker/PHPMatrix.png?branch=develop)](http://travis-ci.org/MarkBaker/PHPMatrix) - -[![Matrix Transform](https://imgs.xkcd.com/comics/matrix_transform.png)](https://xkcd.com/184/) - -Matrix Transform - ---- - -This library currently provides the following operations: - - - addition - - direct sum - - subtraction - - multiplication - - division (using [A].[B]-1) - - division by - - division into - -together with functions for - - - adjoint - - antidiagonal - - cofactors - - determinant - - diagonal - - identity - - inverse - - minors - - trace - - transpose - - -## TO DO - - - power() - - EigenValues - - EigenVectors - - Decomposition - ---- - -# Usage - -To create a new Matrix object, provide an array as the constructor argument - -``` -$grid = [ - [16, 3, 2, 13], - [ 5, 10, 11, 8], - [ 9, 6, 7, 12], - [ 4, 15, 14, 1], -]; - -$matrix = new Matrix\Matrix($grid); -``` -The `Builder` class provides helper methods for creating specific matrices, specifically an identity matrix of a specified size; or a matrix of a specified dimensions, with every cell containing a set value. -``` -$matrix = new Matrix\Builder::createFilledMatrix(1, 5, 3); -``` -Will create a matrix of 5 rows and 3 columns, filled with a `1` in every cell; while -``` -$matrix = new Matrix\Builder::createIdentityMatrix(3); -``` -will create a 3x3 identity matrix. - - -Matrix objects are immutable: whenever you call a method or pass a grid to a function that returns a matrix value, a new Matrix object will be returned, and the original will remain unchanged. This also allows you to chain multiple methods as you would for a fluent interface (as long as they are methods that will return a Matrix result). - -## Performing Mathematical Operations - -To perform mathematical operations with Matrices, you can call the appropriate method against a matrix value, passing other values as arguments - -``` -$matrix1 = new Matrix([ - [2, 7, 6], - [9, 5, 1], - [4, 3, 8], -]); -$matrix2 = new Matrix([ - [1, 2, 3], - [4, 5, 6], - [7, 8, 9], -]); - -echo $matrix1->multiply($matrix2); -``` -or pass all values to the appropriate function -``` -$matrix1 = new Matrix([ - [2, 7, 6], - [9, 5, 1], - [4, 3, 8], -]); -$matrix2 = new Matrix([ - [1, 2, 3], - [4, 5, 6], - [7, 8, 9], -]); - -echo Matrix\multiply($matrix1, $matrix2); -``` -You can pass in the arguments as Matrix objects, or as arrays. - -If you want to perform the same operation against multiple values (e.g. to add three or more matrices), then you can pass multiple arguments to any of the operations. - -## Using functions - -When calling any of the available functions for a matrix value, you can either call the relevant method for the Matrix object -``` -$grid = [ - [16, 3, 2, 13], - [ 5, 10, 11, 8], - [ 9, 6, 7, 12], - [ 4, 15, 14, 1], -]; - -$matrix = new Matrix\Matrix($grid); - -echo $matrix->trace(); -``` -or you can call the function as you would in procedural code, passing the Matrix object as an argument -``` -$grid = [ - [16, 3, 2, 13], - [ 5, 10, 11, 8], - [ 9, 6, 7, 12], - [ 4, 15, 14, 1], -]; - -$matrix = new Matrix\Matrix($grid); -echo Matrix\trace($matrix); -``` -When called procedurally using the function, you can pass in the argument as a Matrix object, or as an array. -``` -$grid = [ - [16, 3, 2, 13], - [ 5, 10, 11, 8], - [ 9, 6, 7, 12], - [ 4, 15, 14, 1], -]; - -echo Matrix\trace($grid); -``` -As an alternative, it is also possible to call the method directly from the `Functions` class. -``` -$grid = [ - [16, 3, 2, 13], - [ 5, 10, 11, 8], - [ 9, 6, 7, 12], - [ 4, 15, 14, 1], -]; - -$matrix = new Matrix\Matrix($grid); -echo Matrix\Functions::trace($matrix); -``` -Used this way, methods must be called statically, and the argument must be the Matrix object, and cannot be an array. diff --git a/vendor/markbaker/matrix/buildPhar.php b/vendor/markbaker/matrix/buildPhar.php deleted file mode 100644 index e1b8f96..0000000 --- a/vendor/markbaker/matrix/buildPhar.php +++ /dev/null @@ -1,62 +0,0 @@ - 'Mark Baker ', - 'Description' => 'PHP Class for working with Matrix numbers', - 'Copyright' => 'Mark Baker (c) 2013-' . date('Y'), - 'Timestamp' => time(), - 'Version' => '0.1.0', - 'Date' => date('Y-m-d') -); - -// cleanup -if (file_exists($pharName)) { - echo "Removed: {$pharName}\n"; - unlink($pharName); -} - -echo "Building phar file...\n"; - -// the phar object -$phar = new Phar($pharName, null, 'Matrix'); -$phar->buildFromDirectory($sourceDir); -$phar->setStub( -<<<'EOT' -getMessage()); - exit(1); - } - - include 'phar://functions/sqrt.php'; - - __HALT_COMPILER(); -EOT -); -$phar->setMetadata($metaData); -$phar->compressFiles(Phar::GZ); - -echo "Complete.\n"; - -exit(); diff --git a/vendor/markbaker/matrix/classes/Autoloader.php b/vendor/markbaker/matrix/classes/Autoloader.php deleted file mode 100644 index 279d176..0000000 --- a/vendor/markbaker/matrix/classes/Autoloader.php +++ /dev/null @@ -1,53 +0,0 @@ -regex = $regex; - parent::__construct($it, $regex); - } -} - -class FilenameFilter extends FilesystemRegexFilter -{ - // Filter files against the regex - public function accept() - { - return (!$this->isFile() || preg_match($this->regex, $this->getFilename())); - } -} - - -$srcFolder = __DIR__ . DIRECTORY_SEPARATOR . 'src'; -$srcDirectory = new RecursiveDirectoryIterator($srcFolder); - -$filteredFileList = new FilenameFilter($srcDirectory, '/(?:php)$/i'); -$filteredFileList = new FilenameFilter($filteredFileList, '/^(?!.*(Matrix|Exception)\.php).*$/i'); - -foreach (new RecursiveIteratorIterator($filteredFileList) as $file) { - if ($file->isFile()) { - include_once $file; - } -} diff --git a/vendor/markbaker/matrix/classes/src/Builder.php b/vendor/markbaker/matrix/classes/src/Builder.php deleted file mode 100644 index 6bc334a..0000000 --- a/vendor/markbaker/matrix/classes/src/Builder.php +++ /dev/null @@ -1,70 +0,0 @@ -toArray(); - - for ($x = 0; $x < $dimensions; ++$x) { - $grid[$x][$x] = 1; - } - - return new Matrix($grid); - } -} diff --git a/vendor/markbaker/matrix/classes/src/Exception.php b/vendor/markbaker/matrix/classes/src/Exception.php deleted file mode 100644 index 55a428c..0000000 --- a/vendor/markbaker/matrix/classes/src/Exception.php +++ /dev/null @@ -1,13 +0,0 @@ -isSquare()) { - throw new Exception('Adjoint can only be calculated for a square matrix'); - } - - return self::getAdjoint($matrix); - } - - /** - * Calculate the cofactors of the matrix - * - * @param Matrix $matrix The matrix whose cofactors we wish to calculate - * @return Matrix - * - * @throws Exception - */ - private static function getCofactors(Matrix $matrix) - { - $cofactors = self::getMinors($matrix); - $dimensions = $matrix->rows; - - $cof = 1; - for ($i = 0; $i < $dimensions; ++$i) { - $cofs = $cof; - for ($j = 0; $j < $dimensions; ++$j) { - $cofactors[$i][$j] *= $cofs; - $cofs = -$cofs; - } - $cof = -$cof; - } - - return new Matrix($cofactors); - } - - /** - * Return the cofactors of this matrix - * - * @param Matrix $matrix The matrix whose cofactors we wish to calculate - * @return Matrix - * - * @throws Exception - */ - public static function cofactors(Matrix $matrix) - { - if (!$matrix->isSquare()) { - throw new Exception('Cofactors can only be calculated for a square matrix'); - } - - return self::getCofactors($matrix); - } - - /** - * @param Matrix $matrix - * @param int $row - * @param int $column - * @return float - * @throws Exception - */ - private static function getDeterminantSegment(Matrix $matrix, $row, $column) - { - $tmpMatrix = $matrix->toArray(); - unset($tmpMatrix[$row]); - array_walk( - $tmpMatrix, - function (&$row) use ($column) { - unset($row[$column]); - } - ); - - return self::getDeterminant(new Matrix($tmpMatrix)); - } - - /** - * Calculate the determinant of the matrix - * - * @param Matrix $matrix The matrix whose determinant we wish to calculate - * @return float - * - * @throws Exception - */ - private static function getDeterminant(Matrix $matrix) - { - $dimensions = $matrix->rows; - $determinant = 0; - - switch ($dimensions) { - case 1: - $determinant = $matrix->getValue(1, 1); - break; - case 2: - $determinant = $matrix->getValue(1, 1) * $matrix->getValue(2, 2) - - $matrix->getValue(1, 2) * $matrix->getValue(2, 1); - break; - default: - for ($i = 1; $i <= $dimensions; ++$i) { - $det = $matrix->getValue(1, $i) * self::getDeterminantSegment($matrix, 0, $i - 1); - if (($i % 2) == 0) { - $determinant -= $det; - } else { - $determinant += $det; - } - } - break; - } - - return $determinant; - } - - /** - * Return the determinant of this matrix - * - * @param Matrix $matrix The matrix whose determinant we wish to calculate - * @return float - * @throws Exception - **/ - public static function determinant(Matrix $matrix) - { - if (!$matrix->isSquare()) { - throw new Exception('Determinant can only be calculated for a square matrix'); - } - - return self::getDeterminant($matrix); - } - - /** - * Return the diagonal of this matrix - * - * @param Matrix $matrix The matrix whose diagonal we wish to calculate - * @return Matrix - * @throws Exception - **/ - public static function diagonal(Matrix $matrix) - { - if (!$matrix->isSquare()) { - throw new Exception('Diagonal can only be extracted from a square matrix'); - } - - $dimensions = $matrix->rows; - $grid = Builder::createFilledMatrix(0, $dimensions, $dimensions) - ->toArray(); - - for ($i = 0; $i < $dimensions; ++$i) { - $grid[$i][$i] = $matrix->getValue($i + 1, $i + 1); - } - - return new Matrix($grid); - } - - /** - * Return the antidiagonal of this matrix - * - * @param Matrix $matrix The matrix whose antidiagonal we wish to calculate - * @return Matrix - * @throws Exception - **/ - public static function antidiagonal(Matrix $matrix) - { - if (!$matrix->isSquare()) { - throw new Exception('Anti-Diagonal can only be extracted from a square matrix'); - } - - $dimensions = $matrix->rows; - $grid = Builder::createFilledMatrix(0, $dimensions, $dimensions) - ->toArray(); - - for ($i = 0; $i < $dimensions; ++$i) { - $grid[$i][$dimensions - $i - 1] = $matrix->getValue($i + 1, $dimensions - $i); - } - - return new Matrix($grid); - } - - /** - * Return the identity matrix - * The identity matrix, or sometimes ambiguously called a unit matrix, of size n is the n Ɨ n square matrix - * with ones on the main diagonal and zeros elsewhere - * - * @param Matrix $matrix The matrix whose identity we wish to calculate - * @return Matrix - * @throws Exception - **/ - public static function identity(Matrix $matrix) - { - if (!$matrix->isSquare()) { - throw new Exception('Identity can only be created for a square matrix'); - } - - $dimensions = $matrix->rows; - - return Builder::createIdentityMatrix($dimensions); - } - - /** - * Return the inverse of this matrix - * - * @param Matrix $matrix The matrix whose inverse we wish to calculate - * @return Matrix - * @throws Exception - **/ - public static function inverse(Matrix $matrix) - { - if (!$matrix->isSquare()) { - throw new Exception('Inverse can only be calculated for a square matrix'); - } - - $determinant = self::getDeterminant($matrix); - if ($determinant == 0.0) { - throw new Exception('Inverse can only be calculated for a matrix with a non-zero determinant'); - } - - if ($matrix->rows == 1) { - return new Matrix([[1 / $matrix->getValue(1, 1)]]); - } - - return self::getAdjoint($matrix) - ->multiply(1 / $determinant); - } - - /** - * Calculate the minors of the matrix - * - * @param Matrix $matrix The matrix whose minors we wish to calculate - * @return array[] - * - * @throws Exception - */ - protected static function getMinors(Matrix $matrix) - { - $minors = $matrix->toArray(); - $dimensions = $matrix->rows; - if ($dimensions == 1) { - return $minors; - } - - for ($i = 0; $i < $dimensions; ++$i) { - for ($j = 0; $j < $dimensions; ++$j) { - $minors[$i][$j] = self::getDeterminantSegment($matrix, $i, $j); - } - } - - return $minors; - } - - /** - * Return the minors of the matrix - * The minor of a matrix A is the determinant of some smaller square matrix, cut down from A by removing one or - * more of its rows or columns. - * Minors obtained by removing just one row and one column from square matrices (first minors) are required for - * calculating matrix cofactors, which in turn are useful for computing both the determinant and inverse of - * square matrices. - * - * @param Matrix $matrix The matrix whose minors we wish to calculate - * @return Matrix - * @throws Exception - **/ - public static function minors(Matrix $matrix) - { - if (!$matrix->isSquare()) { - throw new Exception('Minors can only be calculated for a square matrix'); - } - - return new Matrix(self::getMinors($matrix)); - } - - /** - * Return the trace of this matrix - * The trace is defined as the sum of the elements on the main diagonal (the diagonal from the upper left to the lower right) - * of the matrix - * - * @param Matrix $matrix The matrix whose trace we wish to calculate - * @return float - * @throws Exception - **/ - public static function trace(Matrix $matrix) - { - if (!$matrix->isSquare()) { - throw new Exception('Trace can only be extracted from a square matrix'); - } - - $dimensions = $matrix->rows; - $result = 0; - for ($i = 1; $i <= $dimensions; ++$i) { - $result += $matrix->getValue($i, $i); - } - - return $result; - } - - /** - * Return the transpose of this matrix - * - * @param Matrix $matrix The matrix whose transpose we wish to calculate - * @return Matrix - **/ - public static function transpose(Matrix $matrix) - { - $array = array_values(array_merge([null], $matrix->toArray())); - $grid = call_user_func_array( - 'array_map', - $array - ); - - return new Matrix($grid); - } -} diff --git a/vendor/markbaker/matrix/classes/src/Matrix.php b/vendor/markbaker/matrix/classes/src/Matrix.php deleted file mode 100644 index e4e3140..0000000 --- a/vendor/markbaker/matrix/classes/src/Matrix.php +++ /dev/null @@ -1,400 +0,0 @@ -buildFromArray(array_values($grid)); - } - - /* - * Create a new Matrix object from an array of values - * - * @param array $grid - */ - protected function buildFromArray(array $grid): void - { - $this->rows = count($grid); - $columns = array_reduce( - $grid, - function ($carry, $value) { - return max($carry, is_array($value) ? count($value) : 1); - } - ); - $this->columns = $columns; - - array_walk( - $grid, - function (&$value) use ($columns) { - if (!is_array($value)) { - $value = [$value]; - } - $value = array_pad(array_values($value), $columns, null); - } - ); - - $this->grid = $grid; - } - - /** - * Validate that a row number is a positive integer - * - * @param int $row - * @return int - * @throws Exception - */ - public static function validateRow(int $row): int - { - if ((!is_numeric($row)) || (intval($row) < 1)) { - throw new Exception('Invalid Row'); - } - - return (int)$row; - } - - /** - * Validate that a column number is a positive integer - * - * @param int $column - * @return int - * @throws Exception - */ - public static function validateColumn(int $column): int - { - if ((!is_numeric($column)) || (intval($column) < 1)) { - throw new Exception('Invalid Column'); - } - - return (int)$column; - } - - /** - * Validate that a row number falls within the set of rows for this matrix - * - * @param int $row - * @return int - * @throws Exception - */ - protected function validateRowInRange(int $row): int - { - $row = static::validateRow($row); - if ($row > $this->rows) { - throw new Exception('Requested Row exceeds matrix size'); - } - - return $row; - } - - /** - * Validate that a column number falls within the set of columns for this matrix - * - * @param int $column - * @return int - * @throws Exception - */ - protected function validateColumnInRange(int $column): int - { - $column = static::validateColumn($column); - if ($column > $this->columns) { - throw new Exception('Requested Column exceeds matrix size'); - } - - return $column; - } - - /** - * Return a new matrix as a subset of rows from this matrix, starting at row number $row, and $rowCount rows - * A $rowCount value of 0 will return all rows of the matrix from $row - * A negative $rowCount value will return rows until that many rows from the end of the matrix - * - * Note that row numbers start from 1, not from 0 - * - * @param int $row - * @param int $rowCount - * @return static - * @throws Exception - */ - public function getRows(int $row, int $rowCount = 1): Matrix - { - $row = $this->validateRowInRange($row); - if ($rowCount === 0) { - $rowCount = $this->rows - $row + 1; - } - - return new static(array_slice($this->grid, $row - 1, (int)$rowCount)); - } - - /** - * Return a new matrix as a subset of columns from this matrix, starting at column number $column, and $columnCount columns - * A $columnCount value of 0 will return all columns of the matrix from $column - * A negative $columnCount value will return columns until that many columns from the end of the matrix - * - * Note that column numbers start from 1, not from 0 - * - * @param int $column - * @param int $columnCount - * @return Matrix - * @throws Exception - */ - public function getColumns(int $column, int $columnCount = 1): Matrix - { - $column = $this->validateColumnInRange($column); - if ($columnCount < 1) { - $columnCount = $this->columns + $columnCount - $column + 1; - } - - $grid = []; - for ($i = $column - 1; $i < $column + $columnCount - 1; ++$i) { - $grid[] = array_column($this->grid, $i); - } - - return (new static($grid))->transpose(); - } - - /** - * Return a new matrix as a subset of rows from this matrix, dropping rows starting at row number $row, - * and $rowCount rows - * A negative $rowCount value will drop rows until that many rows from the end of the matrix - * A $rowCount value of 0 will remove all rows of the matrix from $row - * - * Note that row numbers start from 1, not from 0 - * - * @param int $row - * @param int $rowCount - * @return static - * @throws Exception - */ - public function dropRows(int $row, int $rowCount = 1): Matrix - { - $this->validateRowInRange($row); - if ($rowCount === 0) { - $rowCount = $this->rows - $row + 1; - } - - $grid = $this->grid; - array_splice($grid, $row - 1, (int)$rowCount); - - return new static($grid); - } - - /** - * Return a new matrix as a subset of columns from this matrix, dropping columns starting at column number $column, - * and $columnCount columns - * A negative $columnCount value will drop columns until that many columns from the end of the matrix - * A $columnCount value of 0 will remove all columns of the matrix from $column - * - * Note that column numbers start from 1, not from 0 - * - * @param int $column - * @param int $columnCount - * @return static - * @throws Exception - */ - public function dropColumns(int $column, int $columnCount = 1): Matrix - { - $this->validateColumnInRange($column); - if ($columnCount < 1) { - $columnCount = $this->columns + $columnCount - $column + 1; - } - - $grid = $this->grid; - array_walk( - $grid, - function (&$row) use ($column, $columnCount) { - array_splice($row, $column - 1, (int)$columnCount); - } - ); - - return new static($grid); - } - - /** - * Return a value from this matrix, from the "cell" identified by the row and column numbers - * Note that row and column numbers start from 1, not from 0 - * - * @param int $row - * @param int $column - * @return mixed - * @throws Exception - */ - public function getValue(int $row, int $column) - { - $row = $this->validateRowInRange($row); - $column = $this->validateColumnInRange($column); - - return $this->grid[$row - 1][$column - 1]; - } - - /** - * Returns a Generator that will yield each row of the matrix in turn as a vector matrix - * or the value of each cell if the matrix is a vector - * - * @return \Generator|Matrix[]|mixed[] - */ - public function rows(): \Generator - { - foreach ($this->grid as $i => $row) { - yield $i + 1 => ($this->columns == 1) - ? $row[0] - : new static([$row]); - } - } - - /** - * Returns a Generator that will yield each column of the matrix in turn as a vector matrix - * or the value of each cell if the matrix is a vector - * - * @return \Generator|Matrix[]|mixed[] - */ - public function columns(): \Generator - { - for ($i = 0; $i < $this->columns; ++$i) { - yield $i + 1 => ($this->rows == 1) - ? $this->grid[0][$i] - : new static(array_column($this->grid, $i)); - } - } - - /** - * Identify if the row and column dimensions of this matrix are equal, - * i.e. if it is a "square" matrix - * - * @return bool - */ - public function isSquare(): bool - { - return $this->rows == $this->columns; - } - - /** - * Identify if this matrix is a vector - * i.e. if it comprises only a single row or a single column - * - * @return bool - */ - public function isVector(): bool - { - return $this->rows == 1 || $this->columns == 1; - } - - /** - * Return the matrix as a 2-dimensional array - * - * @return array - */ - public function toArray(): array - { - return $this->grid; - } - - protected static $getters = [ - 'rows', - 'columns', - ]; - - /** - * Access specific properties as read-only (no setters) - * - * @param string $propertyName - * @return mixed - * @throws Exception - */ - public function __get(string $propertyName) - { - $propertyName = strtolower($propertyName); - - // Test for function calls - if (in_array($propertyName, self::$getters)) { - return $this->$propertyName; - } - - throw new Exception('Property does not exist'); - } - - protected static $functions = [ - 'antidiagonal', - 'adjoint', - 'cofactors', - 'determinant', - 'diagonal', - 'identity', - 'inverse', - 'minors', - 'trace', - 'transpose', - ]; - - protected static $operations = [ - 'add', - 'subtract', - 'multiply', - 'divideby', - 'divideinto', - 'directsum', - ]; - - /** - * Returns the result of the function call or operation - * - * @param string $functionName - * @param mixed[] $arguments - * @return Matrix|float - * @throws Exception - */ - public function __call(string $functionName, $arguments) - { - $functionName = strtolower(str_replace('_', '', $functionName)); - - if (in_array($functionName, self::$functions, true) || in_array($functionName, self::$operations, true)) { - $functionName = "\\" . __NAMESPACE__ . "\\{$functionName}"; - if (is_callable($functionName)) { - $arguments = array_values(array_merge([$this], $arguments)); - return call_user_func_array($functionName, $arguments); - } - } - throw new Exception('Function or Operation does not exist'); - } -} diff --git a/vendor/markbaker/matrix/classes/src/Operators/Addition.php b/vendor/markbaker/matrix/classes/src/Operators/Addition.php deleted file mode 100644 index 543f56e..0000000 --- a/vendor/markbaker/matrix/classes/src/Operators/Addition.php +++ /dev/null @@ -1,68 +0,0 @@ -addMatrix($value); - } elseif (is_numeric($value)) { - return $this->addScalar($value); - } - - throw new Exception('Invalid argument for addition'); - } - - /** - * Execute the addition for a scalar - * - * @param mixed $value The numeric value to add to the current base value - * @return $this The operation object, allowing multiple additions to be chained - **/ - protected function addScalar($value): Operator - { - for ($row = 0; $row < $this->rows; ++$row) { - for ($column = 0; $column < $this->columns; ++$column) { - $this->matrix[$row][$column] += $value; - } - } - - return $this; - } - - /** - * Execute the addition for a matrix - * - * @param Matrix $value The numeric value to add to the current base value - * @return $this The operation object, allowing multiple additions to be chained - * @throws Exception If the provided argument is not appropriate for the operation - **/ - protected function addMatrix(Matrix $value): Operator - { - $this->validateMatchingDimensions($value); - - for ($row = 0; $row < $this->rows; ++$row) { - for ($column = 0; $column < $this->columns; ++$column) { - $this->matrix[$row][$column] += $value->getValue($row + 1, $column + 1); - } - } - - return $this; - } -} diff --git a/vendor/markbaker/matrix/classes/src/Operators/DirectSum.php b/vendor/markbaker/matrix/classes/src/Operators/DirectSum.php deleted file mode 100644 index cc51ef9..0000000 --- a/vendor/markbaker/matrix/classes/src/Operators/DirectSum.php +++ /dev/null @@ -1,64 +0,0 @@ -directSumMatrix($value); - } - - throw new Exception('Invalid argument for addition'); - } - - /** - * Execute the direct sum for a matrix - * - * @param Matrix $value The numeric value to concatenate/direct sum with the current base value - * @return $this The operation object, allowing multiple additions to be chained - **/ - private function directSumMatrix($value): Operator - { - $originalColumnCount = count($this->matrix[0]); - $originalRowCount = count($this->matrix); - $valColumnCount = $value->columns; - $valRowCount = $value->rows; - $value = $value->toArray(); - - for ($row = 0; $row < $this->rows; ++$row) { - $this->matrix[$row] = array_merge($this->matrix[$row], array_fill(0, $valColumnCount, 0)); - } - - $this->matrix = array_merge( - $this->matrix, - array_fill(0, $valRowCount, array_fill(0, $originalColumnCount, 0)) - ); - - for ($row = $originalRowCount; $row < $originalRowCount + $valRowCount; ++$row) { - array_splice( - $this->matrix[$row], - $originalColumnCount, - $valColumnCount, - $value[$row - $originalRowCount] - ); - } - - return $this; - } -} diff --git a/vendor/markbaker/matrix/classes/src/Operators/Division.php b/vendor/markbaker/matrix/classes/src/Operators/Division.php deleted file mode 100644 index b262f59..0000000 --- a/vendor/markbaker/matrix/classes/src/Operators/Division.php +++ /dev/null @@ -1,38 +0,0 @@ -multiplyMatrix($value); - } elseif (is_numeric($value)) { - return $this->multiplyScalar(1 / $value); - } - - throw new Exception('Invalid argument for division'); - } -} diff --git a/vendor/markbaker/matrix/classes/src/Operators/Multiplication.php b/vendor/markbaker/matrix/classes/src/Operators/Multiplication.php deleted file mode 100644 index e75d0ad..0000000 --- a/vendor/markbaker/matrix/classes/src/Operators/Multiplication.php +++ /dev/null @@ -1,77 +0,0 @@ -multiplyMatrix($value); - } elseif (is_numeric($value)) { - return $this->multiplyScalar($value); - } - - throw new Exception('Invalid argument for multiplication'); - } - - /** - * Execute the multiplication for a scalar - * - * @param mixed $value The numeric value to multiply with the current base value - * @return $this The operation object, allowing multiple mutiplications to be chained - **/ - protected function multiplyScalar($value): Operator - { - for ($row = 0; $row < $this->rows; ++$row) { - for ($column = 0; $column < $this->columns; ++$column) { - $this->matrix[$row][$column] *= $value; - } - } - - return $this; - } - - /** - * Execute the multiplication for a matrix - * - * @param Matrix $value The numeric value to multiply with the current base value - * @return $this The operation object, allowing multiple mutiplications to be chained - * @throws Exception If the provided argument is not appropriate for the operation - **/ - protected function multiplyMatrix(Matrix $value): Operator - { - $this->validateReflectingDimensions($value); - - $newRows = $this->rows; - $newColumns = $value->columns; - $matrix = Builder::createFilledMatrix(0, $newRows, $newColumns) - ->toArray(); - for ($row = 0; $row < $newRows; ++$row) { - for ($column = 0; $column < $newColumns; ++$column) { - $columnData = $value->getColumns($column + 1)->toArray(); - foreach ($this->matrix[$row] as $key => $valueData) { - $matrix[$row][$column] += $valueData * $columnData[$key][0]; - } - } - } - $this->matrix = $matrix; - - return $this; - } -} diff --git a/vendor/markbaker/matrix/classes/src/Operators/Operator.php b/vendor/markbaker/matrix/classes/src/Operators/Operator.php deleted file mode 100644 index 39e36c6..0000000 --- a/vendor/markbaker/matrix/classes/src/Operators/Operator.php +++ /dev/null @@ -1,78 +0,0 @@ -rows = $matrix->rows; - $this->columns = $matrix->columns; - $this->matrix = $matrix->toArray(); - } - - /** - * Compare the dimensions of the matrices being operated on to see if they are valid for addition/subtraction - * - * @param Matrix $matrix The second Matrix object on which the operation will be performed - * @throws Exception - */ - protected function validateMatchingDimensions(Matrix $matrix): void - { - if (($this->rows != $matrix->rows) || ($this->columns != $matrix->columns)) { - throw new Exception('Matrices have mismatched dimensions'); - } - } - - /** - * Compare the dimensions of the matrices being operated on to see if they are valid for multiplication/division - * - * @param Matrix $matrix The second Matrix object on which the operation will be performed - * @throws Exception - */ - protected function validateReflectingDimensions(Matrix $matrix): void - { - if ($this->columns != $matrix->rows) { - throw new Exception('Matrices have mismatched dimensions'); - } - } - - /** - * Return the result of the operation - * - * @return Matrix - */ - public function result(): Matrix - { - return new Matrix($this->matrix); - } -} diff --git a/vendor/markbaker/matrix/classes/src/Operators/Subtraction.php b/vendor/markbaker/matrix/classes/src/Operators/Subtraction.php deleted file mode 100644 index b7e14fa..0000000 --- a/vendor/markbaker/matrix/classes/src/Operators/Subtraction.php +++ /dev/null @@ -1,68 +0,0 @@ -subtractMatrix($value); - } elseif (is_numeric($value)) { - return $this->subtractScalar($value); - } - - throw new Exception('Invalid argument for subtraction'); - } - - /** - * Execute the subtraction for a scalar - * - * @param mixed $value The numeric value to subtracted from the current base value - * @return $this The operation object, allowing multiple additions to be chained - **/ - protected function subtractScalar($value): Operator - { - for ($row = 0; $row < $this->rows; ++$row) { - for ($column = 0; $column < $this->columns; ++$column) { - $this->matrix[$row][$column] -= $value; - } - } - - return $this; - } - - /** - * Execute the subtraction for a matrix - * - * @param Matrix $value The numeric value to subtract from the current base value - * @return $this The operation object, allowing multiple subtractions to be chained - * @throws Exception If the provided argument is not appropriate for the operation - **/ - protected function subtractMatrix(Matrix $value): Operator - { - $this->validateMatchingDimensions($value); - - for ($row = 0; $row < $this->rows; ++$row) { - for ($column = 0; $column < $this->columns; ++$column) { - $this->matrix[$row][$column] -= $value->getValue($row + 1, $column + 1); - } - } - - return $this; - } -} diff --git a/vendor/markbaker/matrix/classes/src/functions/adjoint.php b/vendor/markbaker/matrix/classes/src/functions/adjoint.php deleted file mode 100644 index ec1933f..0000000 --- a/vendor/markbaker/matrix/classes/src/functions/adjoint.php +++ /dev/null @@ -1,30 +0,0 @@ - $matrixValues The matrices to add - * @return Matrix - * @throws Exception - */ -function add(...$matrixValues): Matrix -{ - if (count($matrixValues) < 2) { - throw new Exception('Addition operation requires at least 2 arguments'); - } - - $matrix = array_shift($matrixValues); - - if (is_array($matrix)) { - $matrix = new Matrix($matrix); - } - if (!$matrix instanceof Matrix) { - throw new Exception('Addition arguments must be Matrix or array'); - } - - $result = new Addition($matrix); - - foreach ($matrixValues as $matrix) { - $result->execute($matrix); - } - - return $result->result(); -} diff --git a/vendor/markbaker/matrix/classes/src/operations/directsum.php b/vendor/markbaker/matrix/classes/src/operations/directsum.php deleted file mode 100644 index 0fb540d..0000000 --- a/vendor/markbaker/matrix/classes/src/operations/directsum.php +++ /dev/null @@ -1,44 +0,0 @@ - $matrixValues The matrices to add - * @return Matrix - * @throws Exception - */ -function directsum(...$matrixValues): Matrix -{ - if (count($matrixValues) < 2) { - throw new Exception('DirectSum operation requires at least 2 arguments'); - } - - $matrix = array_shift($matrixValues); - - if (is_array($matrix)) { - $matrix = new Matrix($matrix); - } - if (!$matrix instanceof Matrix) { - throw new Exception('DirectSum arguments must be Matrix or array'); - } - - $result = new DirectSum($matrix); - - foreach ($matrixValues as $matrix) { - $result->execute($matrix); - } - - return $result->result(); -} diff --git a/vendor/markbaker/matrix/classes/src/operations/divideby.php b/vendor/markbaker/matrix/classes/src/operations/divideby.php deleted file mode 100644 index 3c6074b..0000000 --- a/vendor/markbaker/matrix/classes/src/operations/divideby.php +++ /dev/null @@ -1,44 +0,0 @@ - $matrixValues The matrices to divide - * @return Matrix - * @throws Exception - */ -function divideby(...$matrixValues): Matrix -{ - if (count($matrixValues) < 2) { - throw new Exception('Division operation requires at least 2 arguments'); - } - - $matrix = array_shift($matrixValues); - - if (is_array($matrix)) { - $matrix = new Matrix($matrix); - } - if (!$matrix instanceof Matrix) { - throw new Exception('Division arguments must be Matrix or array'); - } - - $result = new Division($matrix); - - foreach ($matrixValues as $matrix) { - $result->execute($matrix); - } - - return $result->result(); -} diff --git a/vendor/markbaker/matrix/classes/src/operations/divideinto.php b/vendor/markbaker/matrix/classes/src/operations/divideinto.php deleted file mode 100644 index d0487c8..0000000 --- a/vendor/markbaker/matrix/classes/src/operations/divideinto.php +++ /dev/null @@ -1,44 +0,0 @@ - $matrixValues The numbers to divide - * @return Matrix - * @throws Exception - */ -function divideinto(...$matrixValues): Matrix -{ - if (count($matrixValues) < 2) { - throw new Exception('Division operation requires at least 2 arguments'); - } - - $matrix = array_shift($matrixValues); - - if (is_array($matrix)) { - $matrix = new Matrix($matrix); - } - if (!$matrix instanceof Matrix) { - throw new Exception('Division arguments must be Matrix or array'); - } - - $result = new Division($matrix); - - foreach ($matrixValues as $matrix) { - $result->execute($matrix); - } - - return $result->result(); -} diff --git a/vendor/markbaker/matrix/classes/src/operations/multiply.php b/vendor/markbaker/matrix/classes/src/operations/multiply.php deleted file mode 100644 index 10bca05..0000000 --- a/vendor/markbaker/matrix/classes/src/operations/multiply.php +++ /dev/null @@ -1,44 +0,0 @@ - $matrixValues The matrices to multiply - * @return Matrix - * @throws Exception - */ -function multiply(...$matrixValues): Matrix -{ - if (count($matrixValues) < 2) { - throw new Exception('Multiplication operation requires at least 2 arguments'); - } - - $matrix = array_shift($matrixValues); - - if (is_array($matrix)) { - $matrix = new Matrix($matrix); - } - if (!$matrix instanceof Matrix) { - throw new Exception('Multiplication arguments must be Matrix or array'); - } - - $result = new Multiplication($matrix); - - foreach ($matrixValues as $matrix) { - $result->execute($matrix); - } - - return $result->result(); -} diff --git a/vendor/markbaker/matrix/classes/src/operations/subtract.php b/vendor/markbaker/matrix/classes/src/operations/subtract.php deleted file mode 100644 index 55a827f..0000000 --- a/vendor/markbaker/matrix/classes/src/operations/subtract.php +++ /dev/null @@ -1,44 +0,0 @@ - $matrixValues The matrices to subtract - * @return Matrix - * @throws Exception - */ -function subtract(...$matrixValues): Matrix -{ - if (count($matrixValues) < 2) { - throw new Exception('Subtraction operation requires at least 2 arguments'); - } - - $matrix = array_shift($matrixValues); - - if (is_array($matrix)) { - $matrix = new Matrix($matrix); - } - if (!$matrix instanceof Matrix) { - throw new Exception('Subtraction arguments must be Matrix or array'); - } - - $result = new Subtraction($matrix); - - foreach ($matrixValues as $matrix) { - $result->execute($matrix); - } - - return $result->result(); -} diff --git a/vendor/markbaker/matrix/composer.json b/vendor/markbaker/matrix/composer.json deleted file mode 100644 index 1386afc..0000000 --- a/vendor/markbaker/matrix/composer.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "markbaker/matrix", - "type": "library", - "description": "PHP Class for working with matrices", - "keywords": ["matrix", "vector", "mathematics"], - "homepage": "https://github.com/MarkBaker/PHPMatrix", - "license": "MIT", - "authors": [ - { - "name": "Mark Baker", - "email": "mark@demon-angel.eu" - } - ], - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", - "phpdocumentor/phpdocumentor": "2.*", - "phpmd/phpmd": "2.*", - "sebastian/phpcpd": "^4.0", - "phploc/phploc": "^4.0", - "squizlabs/php_codesniffer": "^3.4", - "phpcompatibility/php-compatibility": "^9.0", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0" - }, - "autoload": { - "psr-4": { - "Matrix\\": "classes/src/" - }, - "files": [ - "classes/src/functions/adjoint.php", - "classes/src/functions/antidiagonal.php", - "classes/src/functions/cofactors.php", - "classes/src/functions/determinant.php", - "classes/src/functions/diagonal.php", - "classes/src/functions/identity.php", - "classes/src/functions/inverse.php", - "classes/src/functions/minors.php", - "classes/src/functions/trace.php", - "classes/src/functions/transpose.php", - "classes/src/operations/add.php", - "classes/src/operations/directsum.php", - "classes/src/operations/subtract.php", - "classes/src/operations/multiply.php", - "classes/src/operations/divideby.php", - "classes/src/operations/divideinto.php" - ] - }, - "autoload-dev": { - "psr-4": { - "Matrix\\Test\\": "unitTests/classes/src/" - }, - "files": [ - "unitTests/classes/src/functions/adjointTest.php", - "unitTests/classes/src/functions/antidiagonalTest.php", - "unitTests/classes/src/functions/cofactorsTest.php", - "unitTests/classes/src/functions/determinantTest.php", - "unitTests/classes/src/functions/diagonalTest.php", - "unitTests/classes/src/functions/identityTest.php", - "unitTests/classes/src/functions/inverseTest.php", - "unitTests/classes/src/functions/minorsTest.php", - "unitTests/classes/src/functions/traceTest.php", - "unitTests/classes/src/functions/transposeTest.php", - "unitTests/classes/src/operations/addTest.php", - "unitTests/classes/src/operations/directsumTest.php", - "unitTests/classes/src/operations/subtractTest.php", - "unitTests/classes/src/operations/multiplyTest.php", - "unitTests/classes/src/operations/dividebyTest.php", - "unitTests/classes/src/operations/divideintoTest.php" - ] - }, - "scripts": { - "style": "phpcs --report-width=200 --standard=PSR2 --report=summary,full classes/src/ unitTests/classes/src -n", - "test": "phpunit -c phpunit.xml.dist", - "mess": "phpmd classes/src/ xml codesize,unusedcode,design,naming -n", - "lines": "phploc classes/src/ -n", - "cpd": "phpcpd classes/src/ -n", - "versions": "phpcs --report-width=200 --standard=PHPCompatibility --report=summary,full classes/src/ --runtime-set testVersion 7.2- -n", - "coverage": "phpunit -c phpunit.xml.dist --coverage-text --coverage-html ./build/coverage" - }, - "minimum-stability": "dev" -} diff --git a/vendor/markbaker/matrix/examples/test.php b/vendor/markbaker/matrix/examples/test.php deleted file mode 100644 index d8b56dc..0000000 --- a/vendor/markbaker/matrix/examples/test.php +++ /dev/null @@ -1,19 +0,0 @@ -directsum(new Matrix\Matrix($grid2)); - -var_dump($new); diff --git a/vendor/markbaker/matrix/infection.json.dist b/vendor/markbaker/matrix/infection.json.dist deleted file mode 100644 index eddaa70..0000000 --- a/vendor/markbaker/matrix/infection.json.dist +++ /dev/null @@ -1,17 +0,0 @@ -{ - "timeout": 1, - "source": { - "directories": [ - "classes\/src" - ] - }, - "logs": { - "text": "build/infection/text.log", - "summary": "build/infection/summary.log", - "debug": "build/infection/debug.log", - "perMutator": "build/infection/perMutator.md" - }, - "mutators": { - "@default": true - } -} diff --git a/vendor/markbaker/matrix/license.md b/vendor/markbaker/matrix/license.md deleted file mode 100644 index 7329058..0000000 --- a/vendor/markbaker/matrix/license.md +++ /dev/null @@ -1,25 +0,0 @@ -The MIT License (MIT) -===================== - -Copyright Ā© `2018` `Mark Baker` - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the ā€œSoftwareā€), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ā€œAS ISā€, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/markbaker/matrix/phpstan.neon b/vendor/markbaker/matrix/phpstan.neon deleted file mode 100644 index 1607abd..0000000 --- a/vendor/markbaker/matrix/phpstan.neon +++ /dev/null @@ -1,5 +0,0 @@ -parameters: - ignoreErrors: - - '#Property [A-Za-z\\]+::\$[A-Za-z]+ has no typehint specified#' - - '#Method [A-Za-z\\]+::[A-Za-z]+\(\) has no return typehint specified#' - checkMissingIterableValueType: false diff --git a/vendor/mikey179/vfsstream/CHANGELOG.md b/vendor/mikey179/vfsstream/CHANGELOG.md deleted file mode 100644 index bbc1055..0000000 --- a/vendor/mikey179/vfsstream/CHANGELOG.md +++ /dev/null @@ -1,247 +0,0 @@ -1.6.8 (2019-10-30) ------------------- - - * Fix `StringBasedFileContent::doRead` to always return a string (#204) - -1.6.7 (2019-07-31) ------------------- - - * fix PHP 7.4 deprecation warnings (backported #189 from master) - -1.6.6 (2019-04-08) ------------------- - - * backported #174 from master, original PR provided by @localheinz - - -1.6.5 (2017-08-01) ------------------- - - * fixed #157 seeking before beginning of file should fail, reported and fixed by @merijnvdk - * structure array in `vfsStream::create()` and `vfsStream::setup()` now can contain instances of `org\bovigo\vfs\content\FileContent` and `org\bovigo\vfs\vfsStreamFile`, patch provivded by Joshua Smith (@jsmitty12) - - -1.6.4 (2016-07-18) ------------------- - - * fixed #134 type safe directory names, reported and fixed by Sebastian Hopfe - - -1.6.3 (2016-04-09) ------------------- - - * fixed #131 recursive mkdir() fails if the last dirname is '0' - - -1.6.2 (2016-01-13) ------------------- - - * fixed #128 duplicate "valid" files/directories and incorrect file names - - -1.6.1 (2015-12-04) ------------------- - - * `vfsStream::url()` didn't urlencode single path parts while `vfsStream::path()` did urldecode them - * fixed #120, #122: create directory with trailing slash results in "Uninitialized string offset: 0" - - -1.6.0 (2015-10-06) ------------------- - - * added `vfsStreamWrapper::unregister()`, provided by @malkusch with #114 - * fixed #115: incorrect handling of `..` in root directory on PHP 5.5, fix provided by @acoulton with #116 - - -1.5.0 (2015-03-29) ------------------- - - * implemented #91: `vfsStream::copyFromFileSystem()` should create large file instances - * implemented #92: `vfsStream::copyFromFileSystem()` should respect block devices - * fixed #107: `touch()` does not respect file permissions - * fixed #105: vfs directory structure is not reset after each test - * fixed #104: vfsStream can't handle url encoded pathes - - -1.4.0 (2014-09-14) ------------------- - - * implemented #85: Added support for emulating block devices in the virtual filesystem, feature provided by Harris Borawski - * fixed #68: Unlink a non-existing file now triggers a PHP warning - - -1.3.0 (2014-07-21) ------------------- - - * implemented #79: possibility to mock large files without large memory footprint, see https://github.com/mikey179/vfsStream/wiki/MockingLargeFiles - * implemented #67: added partial support for text-mode translation flag (i.e., no actual translation of line endings takes place) so it no longer throws an exception (provided by Anthon Pang) - * fixed issue #74: issue with trailing windows path separators (provided by Sebastian Krüger) - * fixed issue #50: difference between real file system and vfs with `RecursiveDirectoryIterator` - * fixed issue #80: touch with no arguments for modification and access time behave incorrect - * deprecated `org\bovigo\vfs\vfsStreamFile::readUntilEnd()` - * deprecated `org\bovigo\vfs\vfsStreamFile::getBytesRead()` - - -1.2.0 (2013-04-01) ------------------- - - * implemented issue #34: provide `url()` method on all `vfsStreamContent` instances - * added `org\bovigo\vfs\vfsStreamContent::url()` - * added `org\bovigo\vfs\vfsStreamContent::path()` - * fixed issue #40: flock implementation doesn't work correctly, patch provided by Kamil Dziedzic - * fixed issue #49: call to member function on a non-object when trying to delete a file one above root where a file with same name in root exists - * fixed issue #51: `unlink()` must consider permissions of directory where file is inside, not of the file to unlink itself - * fixed issue #52: `chmod()`, `chown()` and `chgrp()` must consider permissions of directory where file/directory is inside - * fixed issue #53: `chmod()`, `chown()` and `chgrp()` must consider current user and current owner of file/directoy to change - - -1.1.0 (2012-08-25) ------------------- - - * implemented issue #11: add support for `streamWrapper::stream_metadata()` vfsStream now supports `touch()`, `chown()`, `chgrp()` and `chmod()` - * implemented issue #33: add support for `stream_truncate()` (provided by https://github.com/nikcorg) - * implemented issue #35: size limit (quota) for VFS - - -1.0.0 (2012-05-15) ------------------- - - * raised requirement for PHP version to 5.3.0 - * migrated codebase to use namespaces - * changed distribution from PEAR to Composer - * implemented issue #30: support "c" mode for `fopen()` - * fixed issue #31: prohibit aquiring locks when already locked / release lock on `fclose()` - * fixed issue #32: problems when subfolder has same name as folder - * fixed issue #36: `vfsStreamWrapper::stream_open()` should return false while trying to open existing non-writable file, patch provided by Alexander Peresypkin - - -0.11.2 (2012-01-14) -------------------- - - * fixed issue #29: set permissions properly when using `vfsStream::copyFromFileSystem()`, patch provided by predakanga - * fixed failing tests under PHP > 5.3.2 - - -0.11.1 (2011-12-04) -------------------- - - * fixed issue #28: `mkdir()` overwrites existing directories/files - - -0.11.0 (2011-11-29) -------------------- - - * implemented issue #20: `vfsStream::create()` removes old structure - * implemented issue #4: possibility to copy structure from existing file system - * fixed issue #23: `unlink()` should not remove any directory - * fixed issue #25: `vfsStreamDirectory::hasChild()` gives false positives for nested paths, patch provided by Andrew Coulton - * fixed issue #26: opening a file for reading only should not update its modification time, reported and initial patch provided by Ludovic Chabant - - -0.10.1 (2011-08-22) -------------------- - - * fixed issue #16: replace `vfsStreamContent` to `vfsStreamContainer` for autocompletion - * fixed issue #17: `vfsStream::create()` has issues with numeric directories, patch provided by mathieuk - - -0.10.0 (2011-07-22) -------------------- - - * added new method `vfsStreamContainer::hasChildren()` and `vfsStreamDirectory::hasChildren()` - * implemented issue #14: less verbose way to initialize vfsStream - * implemented issue #13: remove deprecated method `vfsStreamContent::setFilemtime()` - * implemented issue #6: locking meachanism for files - * ensured that `stream_set_blocking()`, `stream_set_timeout()` and `stream_set_write_buffer()` on vfsStream urls have the same behaviour with PHP 5.2 and 5.3 - * implemented issue #10: method to print directory structure - - -0.9.0 (2011-07-13) ------------------- - - * implemented feature request issue #7: add support for `fileatime()` and `filectime()` - * fixed issue #3: add support for `streamWrapper::stream_cast()` - * fixed issue #9: resolve path not called everywhere its needed - * deprecated `vfsStreamAbstractContent::setFilemtime()`, use `vfsStreamAbstractContent::lastModified()` instead, will be removed with 0.10.0 - - -0.8.0 (2010-10-08) ------------------- - - * implemented enhancement #6: use `vfsStream::umask()` to influence initial file mode for files and directories - * implemented enhancement #19: support of .. in the url, patch provided by Guislain Duthieuw - * fixed issue #18: `getChild()` returns NULL when child's name contains parent name - * fixed bug with incomplete error message when accessing non-existing files on root level - - -0.7.0 (2010-06-08) ------------------- - - * added new `vfsStream::setup()` method to simplify vfsStream usage - * fixed issue #15: `mkdir()` creates a subfolder in a folder without permissions - - -0.6.0 (2010-02-15) ------------------- - - * added support for `$mode` param when opening files, implements enhancement #7 and fixes issue #13 - * `vfsStreamWrapper::stream_open()` now evaluates `$options` for `STREAM_REPORT_ERRORS` - - -0.5.0 (2010-01-25) ------------------- - - * added support for `rename()`, patch provided by Benoit Aubuchon - * added support for . as directory alias so that `vfs://foo/.` resolves to `vfs://foo`, can be used as workaround for bug #8 - - -0.4.0 (2009-07-13) ------------------- - - * added support for file modes, users and groups (with restrictions, see http://code.google.com/p/bovigo/wiki/vfsStreamDocsKnownIssues) - * fixed bug #5: `vfsStreamDirectory::addChild()` does not replace child with same name - * fixed bug with `is_writable()` because of missing `stat()` fields, patch provided by Sergey Galkin - - -0.3.2 (2009-02-16) ------------------- - - * support trailing slashes on directories in vfsStream urls, patch provided by Gabriel Birke - * fixed bug #4: vfsstream can only be read once, reported by Christoph Bloemer - * enabled multiple iterations at the same time over the same directory - - -0.3.1 (2008-02-18) ------------------- - - * fixed path/directory separator issues under linux systems - * fixed uid/gid issues under linux systems - - -0.3.0 (2008-01-02) ------------------- - - * added support for `rmdir()` - * added `vfsStream::newDirectory()`, dropped `vfsStreamDirectory::ceate()` - * added new interface `vfsStreamContainer` - * added `vfsStreamContent::at()` which allows code like `$file = vfsStream::newFile('file.txt.')->withContent('foo')->at($otherDir);` - * added `vfsStreamContent::lastModified()`, made `vfsStreamContent::setFilemtime()` an alias for this - * moved from Stubbles development environment to bovigo - * refactorings to reduce crap index of various methods - - -0.2.0 (2007-12-29) ------------------- - - * moved `vfsStreamWrapper::PROTOCOL` to `vfsStream::SCHEME` - * added new `vfsStream::url()` method to assist in creating correct vfsStream urls - * added `vfsStream::path()` method as opposite to `vfsStream::url()` - * a call to `vfsStreamWrapper::register()` will now reset the root to null, implemented on request from David Zuelke - * added support for `is_readable()`, `is_dir()`, `is_file()` - * added `vfsStream::newFile()` to be able to do `$file = vfsStream::newFile("foo.txt")->withContent("bar");` - - -0.1.0 (2007-12-14) ------------------- - - * Initial release. diff --git a/vendor/mikey179/vfsstream/LICENSE b/vendor/mikey179/vfsstream/LICENSE deleted file mode 100644 index 1d41ab9..0000000 --- a/vendor/mikey179/vfsstream/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2007-2015, Frank Kleine -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of Stubbles nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/mikey179/vfsstream/README.md b/vendor/mikey179/vfsstream/README.md deleted file mode 100644 index a1b47ee..0000000 --- a/vendor/mikey179/vfsstream/README.md +++ /dev/null @@ -1,8 +0,0 @@ -You can find documentation in the [wiki](https://github.com/mikey179/vfsStream/wiki). - -Also you might want to check [vfsStream examples](https://github.com/mikey179/vfsStream-examples). - - -[![Build Status](https://secure.travis-ci.org/mikey179/vfsStream.png)](http://travis-ci.org/mikey179/vfsStream) [![Build Status Windows](https://ci.appveyor.com/api/projects/status/6whqgluyeggspjp1/branch/master?svg=true)](https://ci.appveyor.com/project/mikey179/vfsstream) [![Coverage Status](https://coveralls.io/repos/github/bovigo/vfsStream/badge.svg?branch=v1.x)](https://coveralls.io/github/bovigo/vfsStream?branch=v1.x) - -[![Latest Stable Version](https://poser.pugx.org/mikey179/vfsStream/version.png)](https://packagist.org/packages/mikey179/vfsStream) [![Latest Unstable Version](https://poser.pugx.org/mikey179/vfsStream/v/unstable.png)](//packagist.org/packages/mikey179/vfsStream) diff --git a/vendor/mikey179/vfsstream/appveyor.yml b/vendor/mikey179/vfsstream/appveyor.yml deleted file mode 100644 index e7fdf00..0000000 --- a/vendor/mikey179/vfsstream/appveyor.yml +++ /dev/null @@ -1,22 +0,0 @@ -build: false -shallow_clone: true - -cache: - - .\php -> appveyor.yml - -init: - - set PATH=%PATH%;.\php - - set COMPOSER_NO_INTERACTION=1 - - set CACHED=0 - -install: - - if exist .\php (set CACHED=1) else (mkdir .\php) - - if %CACHED%==0 cd .\php - - if %CACHED%==0 curl --fail --location --silent --show-error -o php.zip https://windows.php.net/downloads/releases/archives/php-7.0.7-nts-Win32-VC14-x64.zip - - if %CACHED%==0 appveyor DownloadFile https://getcomposer.org/composer.phar - - if %CACHED%==0 7z x php.zip -y - - if %CACHED%==0 cd .. - -test_script: - - php -d extension_dir=.\php\ext -d extension=php_openssl.dll .\php\composer.phar install - - vendor/bin/phpunit.bat --coverage-text diff --git a/vendor/mikey179/vfsstream/composer.json b/vendor/mikey179/vfsstream/composer.json deleted file mode 100644 index 9d1f3f0..0000000 --- a/vendor/mikey179/vfsstream/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "mikey179/vfsstream", - "type": "library", - "homepage": "http://vfs.bovigo.org/", - "description": "Virtual file system to mock the real file system in unit tests.", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Frank Kleine", - "homepage": "http://frankkleine.de/", - "role": "Developer" - } - ], - "support": { - "issues": "https://github.com/bovigo/vfsStream/issues", - "source": "https://github.com/bovigo/vfsStream/tree/master", - "wiki": "https://github.com/bovigo/vfsStream/wiki" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5|^5.0" - }, - "autoload": { - "psr-0": { "org\\bovigo\\vfs\\": "src/main/php" } - }, - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - } -} diff --git a/vendor/mikey179/vfsstream/phpunit.xml.dist b/vendor/mikey179/vfsstream/phpunit.xml.dist deleted file mode 100644 index 1e6720a..0000000 --- a/vendor/mikey179/vfsstream/phpunit.xml.dist +++ /dev/null @@ -1,44 +0,0 @@ - - - - - ./src/test/phpt - ./src/test/php - - - - - - src/main/php - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/DotDirectory.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/DotDirectory.php deleted file mode 100644 index b17b979..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/DotDirectory.php +++ /dev/null @@ -1,35 +0,0 @@ -amount = $amount; - } - - /** - * create with unlimited space - * - * @return Quota - */ - public static function unlimited() - { - return new self(self::UNLIMITED); - } - - /** - * checks if a quota is set - * - * @return bool - */ - public function isLimited() - { - return self::UNLIMITED < $this->amount; - } - - /** - * checks if given used space exceeda quota limit - * - * - * @param int $usedSpace - * @return int - */ - public function spaceLeft($usedSpace) - { - if (self::UNLIMITED === $this->amount) { - return $usedSpace; - } - - if ($usedSpace >= $this->amount) { - return 0; - } - - $spaceLeft = $this->amount - $usedSpace; - if (0 >= $spaceLeft) { - return 0; - } - - return $spaceLeft; - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/FileContent.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/FileContent.php deleted file mode 100644 index 606fe5e..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/FileContent.php +++ /dev/null @@ -1,71 +0,0 @@ -size = $size; - } - - /** - * create large file with given size in kilobyte - * - * @param int $kilobyte - * @return LargeFileContent - */ - public static function withKilobytes($kilobyte) - { - return new self($kilobyte * 1024); - } - - /** - * create large file with given size in megabyte - * - * @param int $megabyte - * @return LargeFileContent - */ - public static function withMegabytes($megabyte) - { - return self::withKilobytes($megabyte * 1024); - } - - /** - * create large file with given size in gigabyte - * - * @param int $gigabyte - * @return LargeFileContent - */ - public static function withGigabytes($gigabyte) - { - return self::withMegabytes($gigabyte * 1024); - } - - /** - * returns actual content - * - * @return string - */ - public function content() - { - return $this->doRead(0, $this->size); - } - - /** - * returns size of content - * - * @return int - */ - public function size() - { - return $this->size; - } - - /** - * actual reading of given byte count starting at given offset - * - * @param int $offset - * @param int $count - */ - protected function doRead($offset, $count) - { - if (($offset + $count) > $this->size) { - $count = $this->size - $offset; - } - - $result = ''; - for ($i = 0; $i < $count; $i++) { - if (isset($this->content[$i + $offset])) { - $result .= $this->content[$i + $offset]; - } else { - $result .= ' '; - } - } - - return $result; - } - - /** - * actual writing of data with specified length at given offset - * - * @param string $data - * @param int $offset - * @param int $length - */ - protected function doWrite($data, $offset, $length) - { - for ($i = 0; $i < $length; $i++) { - $this->content[$i + $offset] = substr($data, $i, 1); - } - - if ($offset >= $this->size) { - $this->size += $length; - } elseif (($offset + $length) > $this->size) { - $this->size = $offset + $length; - } - } - - /** - * Truncates a file to a given length - * - * @param int $size length to truncate file to - * @return bool - */ - public function truncate($size) - { - $this->size = $size; - foreach (array_filter(array_keys($this->content), - function($pos) use ($size) - { - return $pos >= $size; - } - ) as $removePos) { - unset($this->content[$removePos]); - } - - return true; - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/SeekableFileContent.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/SeekableFileContent.php deleted file mode 100644 index e4c3d9b..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/SeekableFileContent.php +++ /dev/null @@ -1,134 +0,0 @@ -doRead($this->offset, $count); - $this->offset += $count; - return $data; - } - - /** - * actual reading of given byte count starting at given offset - * - * @param int $offset - * @param int $count - */ - protected abstract function doRead($offset, $count); - - /** - * seeks to the given offset - * - * @param int $offset - * @param int $whence - * @return bool - */ - public function seek($offset, $whence) - { - $newOffset = $this->offset; - switch ($whence) { - case SEEK_CUR: - $newOffset += $offset; - break; - - case SEEK_END: - $newOffset = $this->size() + $offset; - break; - - case SEEK_SET: - $newOffset = $offset; - break; - - default: - return false; - } - - if ($newOffset<0) { - return false; - } - $this->offset = $newOffset; - return true; - } - - /** - * checks whether pointer is at end of file - * - * @return bool - */ - public function eof() - { - return $this->size() <= $this->offset; - } - - /** - * writes an amount of data - * - * @param string $data - * @return amount of written bytes - */ - public function write($data) - { - $dataLength = strlen($data); - $this->doWrite($data, $this->offset, $dataLength); - $this->offset += $dataLength; - return $dataLength; - } - - /** - * actual writing of data with specified length at given offset - * - * @param string $data - * @param int $offset - * @param int $length - */ - protected abstract function doWrite($data, $offset, $length); - - /** - * for backwards compatibility with vfsStreamFile::bytesRead() - * - * @return int - * @deprecated - */ - public function bytesRead() - { - return $this->offset; - } - - /** - * for backwards compatibility with vfsStreamFile::readUntilEnd() - * - * @return string - * @deprecated - */ - public function readUntilEnd() - { - return substr($this->content(), $this->offset); - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/StringBasedFileContent.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/StringBasedFileContent.php deleted file mode 100644 index 77adf8e..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/content/StringBasedFileContent.php +++ /dev/null @@ -1,97 +0,0 @@ -content = $content; - } - - /** - * returns actual content - * - * @return string - */ - public function content() - { - return $this->content; - } - - /** - * returns size of content - * - * @return int - */ - public function size() - { - return strlen($this->content); - } - - /** - * actual reading of length starting at given offset - * - * @param int $offset - * @param int $count - */ - protected function doRead($offset, $count) - { - return (string) substr($this->content, $offset, $count); - } - - /** - * actual writing of data with specified length at given offset - * - * @param string $data - * @param int $offset - * @param int $length - */ - protected function doWrite($data, $offset, $length) - { - $this->content = substr($this->content, 0, $offset) - . $data - . substr($this->content, $offset + $length); - } - - /** - * Truncates a file to a given length - * - * @param int $size length to truncate file to - * @return bool - */ - public function truncate($size) - { - if ($size > $this->size()) { - // Pad with null-chars if we're "truncating up" - $this->content .= str_repeat("\0", $size - $this->size()); - } else { - $this->content = substr($this->content, 0, $size); - } - - return true; - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStream.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStream.php deleted file mode 100644 index 1eb382d..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStream.php +++ /dev/null @@ -1,479 +0,0 @@ - - * array('Core' = array('AbstractFactory' => array('test.php' => 'some text content', - * 'other.php' => 'Some more text content', - * 'Invalid.csv' => 'Something else', - * ), - * 'AnEmptyFolder' => array(), - * 'badlocation.php' => 'some bad content', - * ) - * ) - * - * the resulting directory tree will look like this: - *
-     * root
-     * \- Core
-     *  |- badlocation.php
-     *  |- AbstractFactory
-     *  | |- test.php
-     *  | |- other.php
-     *  | \- Invalid.csv
-     *  \- AnEmptyFolder
-     * 
- * Arrays will become directories with their key as directory name, and - * strings becomes files with their key as file name and their value as file - * content. - * - * @param string $rootDirName name of root directory - * @param int $permissions file permissions of root directory - * @param array $structure directory structure to add under root directory - * @return \org\bovigo\vfs\vfsStreamDirectory - * @since 0.7.0 - * @see https://github.com/mikey179/vfsStream/issues/14 - * @see https://github.com/mikey179/vfsStream/issues/20 - */ - public static function setup($rootDirName = 'root', $permissions = null, array $structure = array()) - { - vfsStreamWrapper::register(); - return self::create($structure, vfsStreamWrapper::setRoot(self::newDirectory($rootDirName, $permissions))); - } - - /** - * creates vfsStream directory structure from an array and adds it to given base dir - * - * Assumed $structure contains an array like this: - * - * array('Core' = array('AbstractFactory' => array('test.php' => 'some text content', - * 'other.php' => 'Some more text content', - * 'Invalid.csv' => 'Something else', - * ), - * 'AnEmptyFolder' => array(), - * 'badlocation.php' => 'some bad content', - * ) - * ) - * - * the resulting directory tree will look like this: - *
-     * baseDir
-     * \- Core
-     *  |- badlocation.php
-     *  |- AbstractFactory
-     *  | |- test.php
-     *  | |- other.php
-     *  | \- Invalid.csv
-     *  \- AnEmptyFolder
-     * 
- * Arrays will become directories with their key as directory name, and - * strings becomes files with their key as file name and their value as file - * content. - * - * If no baseDir is given it will try to add the structure to the existing - * root directory without replacing existing childs except those with equal - * names. - * - * @param array $structure directory structure to add under root directory - * @param vfsStreamDirectory $baseDir base directory to add structure to - * @return vfsStreamDirectory - * @throws \InvalidArgumentException - * @since 0.10.0 - * @see https://github.com/mikey179/vfsStream/issues/14 - * @see https://github.com/mikey179/vfsStream/issues/20 - */ - public static function create(array $structure, vfsStreamDirectory $baseDir = null) - { - if (null === $baseDir) { - $baseDir = vfsStreamWrapper::getRoot(); - } - - if (null === $baseDir) { - throw new \InvalidArgumentException('No baseDir given and no root directory set.'); - } - - return self::addStructure($structure, $baseDir); - } - - /** - * helper method to create subdirectories recursively - * - * @param array $structure subdirectory structure to add - * @param vfsStreamDirectory $baseDir directory to add the structure to - * @return vfsStreamDirectory - */ - protected static function addStructure(array $structure, vfsStreamDirectory $baseDir) - { - foreach ($structure as $name => $data) { - $name = (string) $name; - if (is_array($data) === true) { - self::addStructure($data, self::newDirectory($name)->at($baseDir)); - } elseif (is_string($data) === true) { - $matches = null; - preg_match('/^\[(.*)\]$/', $name, $matches); - if ($matches !== array()) { - self::newBlock($matches[1])->withContent($data)->at($baseDir); - } else { - self::newFile($name)->withContent($data)->at($baseDir); - } - } elseif ($data instanceof FileContent) { - self::newFile($name)->withContent($data)->at($baseDir); - } elseif ($data instanceof vfsStreamFile) { - $baseDir->addChild($data); - } - } - - return $baseDir; - } - - /** - * copies the file system structure from given path into the base dir - * - * If no baseDir is given it will try to add the structure to the existing - * root directory without replacing existing childs except those with equal - * names. - * File permissions are copied as well. - * Please note that file contents will only be copied if their file size - * does not exceed the given $maxFileSize which defaults to 1024 KB. In case - * the file is larger file content will be mocked, see - * https://github.com/mikey179/vfsStream/wiki/MockingLargeFiles. - * - * @param string $path path to copy the structure from - * @param vfsStreamDirectory $baseDir directory to add the structure to - * @param int $maxFileSize maximum file size of files to copy content from - * @return vfsStreamDirectory - * @throws \InvalidArgumentException - * @since 0.11.0 - * @see https://github.com/mikey179/vfsStream/issues/4 - */ - public static function copyFromFileSystem($path, vfsStreamDirectory $baseDir = null, $maxFileSize = 1048576) - { - if (null === $baseDir) { - $baseDir = vfsStreamWrapper::getRoot(); - } - - if (null === $baseDir) { - throw new \InvalidArgumentException('No baseDir given and no root directory set.'); - } - - $dir = new \DirectoryIterator($path); - foreach ($dir as $fileinfo) { - switch (filetype($fileinfo->getPathname())) { - case 'file': - if ($fileinfo->getSize() <= $maxFileSize) { - $content = file_get_contents($fileinfo->getPathname()); - } else { - $content = new LargeFileContent($fileinfo->getSize()); - } - - self::newFile( - $fileinfo->getFilename(), - octdec(substr(sprintf('%o', $fileinfo->getPerms()), -4)) - ) - ->withContent($content) - ->at($baseDir); - break; - - case 'dir': - if (!$fileinfo->isDot()) { - self::copyFromFileSystem( - $fileinfo->getPathname(), - self::newDirectory( - $fileinfo->getFilename(), - octdec(substr(sprintf('%o', $fileinfo->getPerms()), -4)) - )->at($baseDir), - $maxFileSize - ); - } - - break; - - case 'block': - self::newBlock( - $fileinfo->getFilename(), - octdec(substr(sprintf('%o', $fileinfo->getPerms()), -4)) - )->at($baseDir); - break; - } - } - - return $baseDir; - } - - /** - * returns a new file with given name - * - * @param string $name name of file to create - * @param int $permissions permissions of file to create - * @return vfsStreamFile - */ - public static function newFile($name, $permissions = null) - { - return new vfsStreamFile($name, $permissions); - } - - /** - * returns a new directory with given name - * - * If the name contains slashes, a new directory structure will be created. - * The returned directory will always be the parent directory of this - * directory structure. - * - * @param string $name name of directory to create - * @param int $permissions permissions of directory to create - * @return vfsStreamDirectory - */ - public static function newDirectory($name, $permissions = null) - { - if ('/' === substr($name, 0, 1)) { - $name = substr($name, 1); - } - - $firstSlash = strpos($name, '/'); - if (false === $firstSlash) { - return new vfsStreamDirectory($name, $permissions); - } - - $ownName = substr($name, 0, $firstSlash); - $subDirs = substr($name, $firstSlash + 1); - $directory = new vfsStreamDirectory($ownName, $permissions); - if (is_string($subDirs) && strlen($subDirs) > 0) { - self::newDirectory($subDirs, $permissions)->at($directory); - } - - return $directory; - } - - /** - * returns a new block with the given name - * - * @param string $name name of the block device - * @param int $permissions permissions of block to create - * @return vfsStreamBlock - */ - public static function newBlock($name, $permissions = null) - { - return new vfsStreamBlock($name, $permissions); - } - - /** - * returns current user - * - * If the system does not support posix_getuid() the current user will be root (0). - * - * @return int - */ - public static function getCurrentUser() - { - return function_exists('posix_getuid') ? posix_getuid() : self::OWNER_ROOT; - } - - /** - * returns current group - * - * If the system does not support posix_getgid() the current group will be root (0). - * - * @return int - */ - public static function getCurrentGroup() - { - return function_exists('posix_getgid') ? posix_getgid() : self::GROUP_ROOT; - } - - /** - * use visitor to inspect a content structure - * - * If the given content is null it will fall back to use the current root - * directory of the stream wrapper. - * - * Returns given visitor for method chaining comfort. - * - * @param vfsStreamVisitor $visitor the visitor who inspects - * @param vfsStreamContent $content directory structure to inspect - * @return vfsStreamVisitor - * @throws \InvalidArgumentException - * @since 0.10.0 - * @see https://github.com/mikey179/vfsStream/issues/10 - */ - public static function inspect(vfsStreamVisitor $visitor, vfsStreamContent $content = null) - { - if (null !== $content) { - return $visitor->visit($content); - } - - $root = vfsStreamWrapper::getRoot(); - if (null === $root) { - throw new \InvalidArgumentException('No content given and no root directory set.'); - } - - return $visitor->visitDirectory($root); - } - - /** - * sets quota to given amount of bytes - * - * @param int $bytes - * @since 1.1.0 - */ - public static function setQuota($bytes) - { - vfsStreamWrapper::setQuota(new Quota($bytes)); - } - - /** - * checks if vfsStream lists dotfiles in directory listings - * - * @return bool - * @since 1.3.0 - */ - public static function useDotfiles() - { - return self::$dotFiles; - } - - /** - * disable dotfiles in directory listings - * - * @since 1.3.0 - */ - public static function disableDotfiles() - { - self::$dotFiles = false; - } - - /** - * enable dotfiles in directory listings - * - * @since 1.3.0 - */ - public static function enableDotfiles() - { - self::$dotFiles = true; - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamAbstractContent.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamAbstractContent.php deleted file mode 100644 index 7db2be2..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamAbstractContent.php +++ /dev/null @@ -1,418 +0,0 @@ -name = "{$name}"; - $time = time(); - if (null === $permissions) { - $permissions = $this->getDefaultPermissions() & ~vfsStream::umask(); - } - - $this->lastAccessed = $time; - $this->lastAttributeModified = $time; - $this->lastModified = $time; - $this->permissions = $permissions; - $this->user = vfsStream::getCurrentUser(); - $this->group = vfsStream::getCurrentGroup(); - } - - /** - * returns default permissions for concrete implementation - * - * @return int - * @since 0.8.0 - */ - protected abstract function getDefaultPermissions(); - - /** - * returns the file name of the content - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * renames the content - * - * @param string $newName - */ - public function rename($newName) - { - $this->name = "{$newName}"; - } - - /** - * checks whether the container can be applied to given name - * - * @param string $name - * @return bool - */ - public function appliesTo($name) - { - if ($name === $this->name) { - return true; - } - - $segment_name = $this->name.'/'; - return (strncmp($segment_name, $name, strlen($segment_name)) == 0); - } - - /** - * returns the type of the container - * - * @return int - */ - public function getType() - { - return $this->type; - } - - /** - * sets the last modification time of the stream content - * - * @param int $filemtime - * @return $this - */ - public function lastModified($filemtime) - { - $this->lastModified = $filemtime; - return $this; - } - - /** - * returns the last modification time of the stream content - * - * @return int - */ - public function filemtime() - { - return $this->lastModified; - } - - /** - * sets last access time of the stream content - * - * @param int $fileatime - * @return $this - * @since 0.9 - */ - public function lastAccessed($fileatime) - { - $this->lastAccessed = $fileatime; - return $this; - } - - /** - * returns the last access time of the stream content - * - * @return int - * @since 0.9 - */ - public function fileatime() - { - return $this->lastAccessed; - } - - /** - * sets the last attribute modification time of the stream content - * - * @param int $filectime - * @return $this - * @since 0.9 - */ - public function lastAttributeModified($filectime) - { - $this->lastAttributeModified = $filectime; - return $this; - } - - /** - * returns the last attribute modification time of the stream content - * - * @return int - * @since 0.9 - */ - public function filectime() - { - return $this->lastAttributeModified; - } - - /** - * adds content to given container - * - * @param vfsStreamContainer $container - * @return $this - */ - public function at(vfsStreamContainer $container) - { - $container->addChild($this); - return $this; - } - - /** - * change file mode to given permissions - * - * @param int $permissions - * @return $this - */ - public function chmod($permissions) - { - $this->permissions = $permissions; - $this->lastAttributeModified = time(); - clearstatcache(); - return $this; - } - - /** - * returns permissions - * - * @return int - */ - public function getPermissions() - { - return $this->permissions; - } - - /** - * checks whether content is readable - * - * @param int $user id of user to check for - * @param int $group id of group to check for - * @return bool - */ - public function isReadable($user, $group) - { - if ($this->user === $user) { - $check = 0400; - } elseif ($this->group === $group) { - $check = 0040; - } else { - $check = 0004; - } - - return (bool) ($this->permissions & $check); - } - - /** - * checks whether content is writable - * - * @param int $user id of user to check for - * @param int $group id of group to check for - * @return bool - */ - public function isWritable($user, $group) - { - if ($this->user === $user) { - $check = 0200; - } elseif ($this->group === $group) { - $check = 0020; - } else { - $check = 0002; - } - - return (bool) ($this->permissions & $check); - } - - /** - * checks whether content is executable - * - * @param int $user id of user to check for - * @param int $group id of group to check for - * @return bool - */ - public function isExecutable($user, $group) - { - if ($this->user === $user) { - $check = 0100; - } elseif ($this->group === $group) { - $check = 0010; - } else { - $check = 0001; - } - - return (bool) ($this->permissions & $check); - } - - /** - * change owner of file to given user - * - * @param int $user - * @return $this - */ - public function chown($user) - { - $this->user = $user; - $this->lastAttributeModified = time(); - return $this; - } - - /** - * checks whether file is owned by given user - * - * @param int $user - * @return bool - */ - public function isOwnedByUser($user) - { - return $this->user === $user; - } - - /** - * returns owner of file - * - * @return int - */ - public function getUser() - { - return $this->user; - } - - /** - * change owner group of file to given group - * - * @param int $group - * @return $this - */ - public function chgrp($group) - { - $this->group = $group; - $this->lastAttributeModified = time(); - return $this; - } - - /** - * checks whether file is owned by group - * - * @param int $group - * @return bool - */ - public function isOwnedByGroup($group) - { - return $this->group === $group; - } - - /** - * returns owner group of file - * - * @return int - */ - public function getGroup() - { - return $this->group; - } - - /** - * sets parent path - * - * @param string $parentPath - * @internal only to be set by parent - * @since 1.2.0 - */ - public function setParentPath($parentPath) - { - $this->parentPath = $parentPath; - } - - /** - * returns path to this content - * - * @return string - * @since 1.2.0 - */ - public function path() - { - if (null === $this->parentPath) { - return $this->name; - } - - return $this->parentPath . '/' . $this->name; - } - - /** - * returns complete vfsStream url for this content - * - * @return string - * @since 1.2.0 - */ - public function url() - { - return vfsStream::url($this->path()); - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamBlock.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamBlock.php deleted file mode 100644 index 128a96a..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamBlock.php +++ /dev/null @@ -1,34 +0,0 @@ -type = vfsStreamContent::TYPE_BLOCK; - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamContainer.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamContainer.php deleted file mode 100644 index 74faa9a..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamContainer.php +++ /dev/null @@ -1,61 +0,0 @@ -children = $children; - if (vfsStream::useDotfiles()) { - array_unshift($this->children, new DotDirectory('.'), new DotDirectory('..')); - } - - reset($this->children); - } - - /** - * resets children pointer - */ - public function rewind() - { - reset($this->children); - } - - /** - * returns the current child - * - * @return vfsStreamContent - */ - public function current() - { - $child = current($this->children); - if (false === $child) { - return null; - } - - return $child; - } - - /** - * returns the name of the current child - * - * @return string - */ - public function key() - { - $child = current($this->children); - if (false === $child) { - return null; - } - - return $child->getName(); - } - - /** - * iterates to next child - */ - public function next() - { - next($this->children); - } - - /** - * checks if the current value is valid - * - * @return bool - */ - public function valid() - { - return (false !== current($this->children)); - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamContent.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamContent.php deleted file mode 100644 index 03b5bab..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamContent.php +++ /dev/null @@ -1,213 +0,0 @@ -type = vfsStreamContent::TYPE_DIR; - parent::__construct($name, $permissions); - } - - /** - * returns default permissions for concrete implementation - * - * @return int - * @since 0.8.0 - */ - protected function getDefaultPermissions() - { - return 0777; - } - - /** - * returns size of directory - * - * The size of a directory is always 0 bytes. To calculate the summarized - * size of all children in the directory use sizeSummarized(). - * - * @return int - */ - public function size() - { - return 0; - } - - /** - * returns summarized size of directory and its children - * - * @return int - */ - public function sizeSummarized() - { - $size = 0; - foreach ($this->children as $child) { - if ($child->getType() === vfsStreamContent::TYPE_DIR) { - $size += $child->sizeSummarized(); - } else { - $size += $child->size(); - } - } - - return $size; - } - - /** - * renames the content - * - * @param string $newName - * @throws vfsStreamException - */ - public function rename($newName) - { - if (strstr($newName, '/') !== false) { - throw new vfsStreamException('Directory name can not contain /.'); - } - - parent::rename($newName); - } - - - /** - * sets parent path - * - * @param string $parentPath - * @internal only to be set by parent - * @since 1.2.0 - */ - public function setParentPath($parentPath) - { - parent::setParentPath($parentPath); - foreach ($this->children as $child) { - $child->setParentPath($this->path()); - } - } - - /** - * adds child to the directory - * - * @param vfsStreamContent $child - */ - public function addChild(vfsStreamContent $child) - { - $child->setParentPath($this->path()); - $this->children[$child->getName()] = $child; - $this->updateModifications(); - } - - /** - * removes child from the directory - * - * @param string $name - * @return bool - */ - public function removeChild($name) - { - foreach ($this->children as $key => $child) { - if ($child->appliesTo($name)) { - $child->setParentPath(null); - unset($this->children[$key]); - $this->updateModifications(); - return true; - } - } - - return false; - } - - /** - * updates internal timestamps - */ - protected function updateModifications() - { - $time = time(); - $this->lastAttributeModified = $time; - $this->lastModified = $time; - } - - /** - * checks whether the container contains a child with the given name - * - * @param string $name - * @return bool - */ - public function hasChild($name) - { - return ($this->getChild($name) !== null); - } - - /** - * returns the child with the given name - * - * @param string $name - * @return vfsStreamContent - */ - public function getChild($name) - { - $childName = $this->getRealChildName($name); - foreach ($this->children as $child) { - if ($child->getName() === $childName) { - return $child; - } - - if ($child->appliesTo($childName) === true && $child->hasChild($childName) === true) { - return $child->getChild($childName); - } - } - - return null; - } - - /** - * helper method to detect the real child name - * - * @param string $name - * @return string - */ - protected function getRealChildName($name) - { - if ($this->appliesTo($name) === true) { - return self::getChildName($name, $this->name); - } - - return $name; - } - - /** - * helper method to calculate the child name - * - * @param string $name - * @param string $ownName - * @return string - */ - protected static function getChildName($name, $ownName) - { - if ($name === $ownName) { - return $name; - } - - return substr($name, strlen($ownName) + 1); - } - - /** - * checks whether directory contains any children - * - * @return bool - * @since 0.10.0 - */ - public function hasChildren() - { - return (count($this->children) > 0); - } - - /** - * returns a list of children for this directory - * - * @return vfsStreamContent[] - */ - public function getChildren() - { - return array_values($this->children); - } - - /** - * returns iterator for the children - * - * @return vfsStreamContainerIterator - */ - public function getIterator() - { - return new vfsStreamContainerIterator($this->children); - } - - /** - * checks whether dir is a dot dir - * - * @return bool - */ - public function isDot() - { - if ('.' === $this->name || '..' === $this->name) { - return true; - } - - return false; - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamException.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamException.php deleted file mode 100644 index b78afd1..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamException.php +++ /dev/null @@ -1,19 +0,0 @@ -content = new StringBasedFileContent(null); - $this->type = vfsStreamContent::TYPE_FILE; - parent::__construct($name, $permissions); - } - - /** - * returns default permissions for concrete implementation - * - * @return int - * @since 0.8.0 - */ - protected function getDefaultPermissions() - { - return 0666; - } - - /** - * checks whether the container can be applied to given name - * - * @param string $name - * @return bool - */ - public function appliesTo($name) - { - return ($name === $this->name); - } - - /** - * alias for withContent() - * - * @param string $content - * @return vfsStreamFile - * @see withContent() - */ - public function setContent($content) - { - return $this->withContent($content); - } - - /** - * sets the contents of the file - * - * Setting content with this method does not change the time when the file - * was last modified. - * - * @param string]FileContent $content - * @return vfsStreamFile - * @throws \InvalidArgumentException - */ - public function withContent($content) - { - if (is_string($content)) { - $this->content = new StringBasedFileContent($content); - } elseif ($content instanceof FileContent) { - $this->content = $content; - } else { - throw new \InvalidArgumentException('Given content must either be a string or an instance of org\bovigo\vfs\content\FileContent'); - } - - return $this; - } - - /** - * returns the contents of the file - * - * Getting content does not change the time when the file - * was last accessed. - * - * @return string - */ - public function getContent() - { - return $this->content->content(); - } - - /** - * simply open the file - * - * @since 0.9 - */ - public function open() - { - $this->content->seek(0, SEEK_SET); - $this->lastAccessed = time(); - } - - /** - * open file and set pointer to end of file - * - * @since 0.9 - */ - public function openForAppend() - { - $this->content->seek(0, SEEK_END); - $this->lastAccessed = time(); - } - - /** - * open file and truncate content - * - * @since 0.9 - */ - public function openWithTruncate() - { - $this->open(); - $this->content->truncate(0); - $time = time(); - $this->lastAccessed = $time; - $this->lastModified = $time; - } - - /** - * reads the given amount of bytes from content - * - * Using this method changes the time when the file was last accessed. - * - * @param int $count - * @return string - */ - public function read($count) - { - $this->lastAccessed = time(); - return $this->content->read($count); - } - - /** - * returns the content until its end from current offset - * - * Using this method changes the time when the file was last accessed. - * - * @return string - * @deprecated since 1.3.0 - */ - public function readUntilEnd() - { - $this->lastAccessed = time(); - return $this->content->readUntilEnd(); - } - - /** - * writes an amount of data - * - * Using this method changes the time when the file was last modified. - * - * @param string $data - * @return amount of written bytes - */ - public function write($data) - { - $this->lastModified = time(); - return $this->content->write($data); - } - - /** - * Truncates a file to a given length - * - * @param int $size length to truncate file to - * @return bool - * @since 1.1.0 - */ - public function truncate($size) - { - $this->content->truncate($size); - $this->lastModified = time(); - return true; - } - - /** - * checks whether pointer is at end of file - * - * @return bool - */ - public function eof() - { - return $this->content->eof(); - } - - /** - * returns the current position within the file - * - * @return int - * @deprecated since 1.3.0 - */ - public function getBytesRead() - { - return $this->content->bytesRead(); - } - - /** - * seeks to the given offset - * - * @param int $offset - * @param int $whence - * @return bool - */ - public function seek($offset, $whence) - { - return $this->content->seek($offset, $whence); - } - - /** - * returns size of content - * - * @return int - */ - public function size() - { - return $this->content->size(); - } - - - /** - * locks file for - * - * @param resource|vfsStreamWrapper $resource - * @param int $operation - * @return bool - * @since 0.10.0 - * @see https://github.com/mikey179/vfsStream/issues/6 - * @see https://github.com/mikey179/vfsStream/issues/40 - */ - public function lock($resource, $operation) - { - if ((LOCK_NB & $operation) == LOCK_NB) { - $operation = $operation - LOCK_NB; - } - - // call to lock file on the same file handler firstly releases the lock - $this->unlock($resource); - - if (LOCK_EX === $operation) { - if ($this->isLocked()) { - return false; - } - - $this->setExclusiveLock($resource); - } elseif(LOCK_SH === $operation) { - if ($this->hasExclusiveLock()) { - return false; - } - - $this->addSharedLock($resource); - } - - return true; - } - - /** - * Removes lock from file acquired by given resource - * - * @param resource|vfsStreamWrapper $resource - * @see https://github.com/mikey179/vfsStream/issues/40 - */ - public function unlock($resource) { - if ($this->hasExclusiveLock($resource)) { - $this->exclusiveLock = null; - } - if ($this->hasSharedLock($resource)) { - unset($this->sharedLock[$this->getResourceId($resource)]); - } - } - - /** - * Set exlusive lock on file by given resource - * - * @param resource|vfsStreamWrapper $resource - * @see https://github.com/mikey179/vfsStream/issues/40 - */ - protected function setExclusiveLock($resource) { - $this->exclusiveLock = $this->getResourceId($resource); - } - - /** - * Add shared lock on file by given resource - * - * @param resource|vfsStreamWrapper $resource - * @see https://github.com/mikey179/vfsStream/issues/40 - */ - protected function addSharedLock($resource) { - $this->sharedLock[$this->getResourceId($resource)] = true; - } - - /** - * checks whether file is locked - * - * @param resource|vfsStreamWrapper $resource - * @return bool - * @since 0.10.0 - * @see https://github.com/mikey179/vfsStream/issues/6 - * @see https://github.com/mikey179/vfsStream/issues/40 - */ - public function isLocked($resource = null) - { - return $this->hasSharedLock($resource) || $this->hasExclusiveLock($resource); - } - - /** - * checks whether file is locked in shared mode - * - * @param resource|vfsStreamWrapper $resource - * @return bool - * @since 0.10.0 - * @see https://github.com/mikey179/vfsStream/issues/6 - * @see https://github.com/mikey179/vfsStream/issues/40 - */ - public function hasSharedLock($resource = null) - { - if (null !== $resource) { - return isset($this->sharedLock[$this->getResourceId($resource)]); - } - - return !empty($this->sharedLock); - } - - /** - * Returns unique resource id - * - * @param resource|vfsStreamWrapper $resource - * @return string - * @see https://github.com/mikey179/vfsStream/issues/40 - */ - public function getResourceId($resource) { - if (is_resource($resource)) { - $data = stream_get_meta_data($resource); - $resource = $data['wrapper_data']; - } - - return spl_object_hash($resource); - } - - /** - * checks whether file is locked in exclusive mode - * - * @param resource|vfsStreamWrapper $resource - * @return bool - * @since 0.10.0 - * @see https://github.com/mikey179/vfsStream/issues/6 - * @see https://github.com/mikey179/vfsStream/issues/40 - */ - public function hasExclusiveLock($resource = null) - { - if (null !== $resource) { - return $this->exclusiveLock === $this->getResourceId($resource); - } - - return null !== $this->exclusiveLock; - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamWrapper.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamWrapper.php deleted file mode 100644 index 368b2fb..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/vfsStreamWrapper.php +++ /dev/null @@ -1,1012 +0,0 @@ -getName() === $path) { - return self::$root; - } - - if ($this->isInRoot($path) && self::$root->hasChild($path) === true) { - return self::$root->getChild($path); - } - - return null; - } - - /** - * helper method to detect whether given path is in root path - * - * @param string $path - * @return bool - */ - private function isInRoot($path) - { - return substr($path, 0, strlen(self::$root->getName())) === self::$root->getName(); - } - - /** - * returns content for given path but only when it is of given type - * - * @param string $path - * @param int $type - * @return vfsStreamContent - */ - protected function getContentOfType($path, $type) - { - $content = $this->getContent($path); - if (null !== $content && $content->getType() === $type) { - return $content; - } - - return null; - } - - /** - * splits path into its dirname and the basename - * - * @param string $path - * @return string[] - */ - protected function splitPath($path) - { - $lastSlashPos = strrpos($path, '/'); - if (false === $lastSlashPos) { - return array('dirname' => '', 'basename' => $path); - } - - return array('dirname' => substr($path, 0, $lastSlashPos), - 'basename' => substr($path, $lastSlashPos + 1) - ); - } - - /** - * helper method to resolve a path from /foo/bar/. to /foo/bar - * - * @param string $path - * @return string - */ - protected function resolvePath($path) - { - $newPath = array(); - foreach (explode('/', $path) as $pathPart) { - if ('.' !== $pathPart) { - if ('..' !== $pathPart) { - $newPath[] = $pathPart; - } elseif (count($newPath) > 1) { - array_pop($newPath); - } - } - } - - return implode('/', $newPath); - } - - /** - * open the stream - * - * @param string $path the path to open - * @param string $mode mode for opening - * @param string $options options for opening - * @param string $opened_path full path that was actually opened - * @return bool - */ - public function stream_open($path, $mode, $options, $opened_path) - { - $extended = ((strstr($mode, '+') !== false) ? (true) : (false)); - $mode = str_replace(array('t', 'b', '+'), '', $mode); - if (in_array($mode, array('r', 'w', 'a', 'x', 'c')) === false) { - if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { - trigger_error('Illegal mode ' . $mode . ', use r, w, a, x or c, flavoured with t, b and/or +', E_USER_WARNING); - } - - return false; - } - - $this->mode = $this->calculateMode($mode, $extended); - $path = $this->resolvePath(vfsStream::path($path)); - $this->content = $this->getContentOfType($path, vfsStreamContent::TYPE_FILE); - if (null !== $this->content) { - if (self::WRITE === $mode) { - if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { - trigger_error('File ' . $path . ' already exists, can not open with mode x', E_USER_WARNING); - } - - return false; - } - - if ( - (self::TRUNCATE === $mode || self::APPEND === $mode) && - $this->content->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false - ) { - return false; - } - - if (self::TRUNCATE === $mode) { - $this->content->openWithTruncate(); - } elseif (self::APPEND === $mode) { - $this->content->openForAppend(); - } else { - if (!$this->content->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup())) { - if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { - trigger_error('Permission denied', E_USER_WARNING); - } - return false; - } - $this->content->open(); - } - - return true; - } - - $content = $this->createFile($path, $mode, $options); - if (false === $content) { - return false; - } - - $this->content = $content; - return true; - } - - /** - * creates a file at given path - * - * @param string $path the path to open - * @param string $mode mode for opening - * @param string $options options for opening - * @return bool - */ - private function createFile($path, $mode = null, $options = null) - { - $names = $this->splitPath($path); - if (empty($names['dirname']) === true) { - if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { - trigger_error('File ' . $names['basename'] . ' does not exist', E_USER_WARNING); - } - - return false; - } - - $dir = $this->getContentOfType($names['dirname'], vfsStreamContent::TYPE_DIR); - if (null === $dir) { - if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { - trigger_error('Directory ' . $names['dirname'] . ' does not exist', E_USER_WARNING); - } - - return false; - } elseif ($dir->hasChild($names['basename']) === true) { - if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { - trigger_error('Directory ' . $names['dirname'] . ' already contains a director named ' . $names['basename'], E_USER_WARNING); - } - - return false; - } - - if (self::READ === $mode) { - if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { - trigger_error('Can not open non-existing file ' . $path . ' for reading', E_USER_WARNING); - } - - return false; - } - - if ($dir->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { - if (($options & STREAM_REPORT_ERRORS) === STREAM_REPORT_ERRORS) { - trigger_error('Can not create new file in non-writable path ' . $names['dirname'], E_USER_WARNING); - } - - return false; - } - - return vfsStream::newFile($names['basename'])->at($dir); - } - - /** - * calculates the file mode - * - * @param string $mode opening mode: r, w, a or x - * @param bool $extended true if + was set with opening mode - * @return int - */ - protected function calculateMode($mode, $extended) - { - if (true === $extended) { - return self::ALL; - } - - if (self::READ === $mode) { - return self::READONLY; - } - - return self::WRITEONLY; - } - - /** - * closes the stream - * - * @see https://github.com/mikey179/vfsStream/issues/40 - */ - public function stream_close() - { - $this->content->lock($this, LOCK_UN); - } - - /** - * read the stream up to $count bytes - * - * @param int $count amount of bytes to read - * @return string - */ - public function stream_read($count) - { - if (self::WRITEONLY === $this->mode) { - return ''; - } - - if ($this->content->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { - return ''; - } - - return $this->content->read($count); - } - - /** - * writes data into the stream - * - * @param string $data - * @return int amount of bytes written - */ - public function stream_write($data) - { - if (self::READONLY === $this->mode) { - return 0; - } - - if ($this->content->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { - return 0; - } - - if (self::$quota->isLimited()) { - $data = substr($data, 0, self::$quota->spaceLeft(self::$root->sizeSummarized())); - } - - return $this->content->write($data); - } - - /** - * truncates a file to a given length - * - * @param int $size length to truncate file to - * @return bool - * @since 1.1.0 - */ - public function stream_truncate($size) - { - if (self::READONLY === $this->mode) { - return false; - } - - if ($this->content->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { - return false; - } - - if ($this->content->getType() !== vfsStreamContent::TYPE_FILE) { - return false; - } - - if (self::$quota->isLimited() && $this->content->size() < $size) { - $maxSize = self::$quota->spaceLeft(self::$root->sizeSummarized()); - if (0 === $maxSize) { - return false; - } - - if ($size > $maxSize) { - $size = $maxSize; - } - } - - return $this->content->truncate($size); - } - - /** - * sets metadata like owner, user or permissions - * - * @param string $path - * @param int $option - * @param mixed $var - * @return bool - * @since 1.1.0 - */ - public function stream_metadata($path, $option, $var) - { - $path = $this->resolvePath(vfsStream::path($path)); - $content = $this->getContent($path); - switch ($option) { - case STREAM_META_TOUCH: - if (null === $content) { - $content = $this->createFile($path, null, STREAM_REPORT_ERRORS); - // file creation may not be allowed at provided path - if (false === $content) { - return false; - } - } - - $currentTime = time(); - $content->lastModified(((isset($var[0])) ? ($var[0]) : ($currentTime))) - ->lastAccessed(((isset($var[1])) ? ($var[1]) : ($currentTime))); - return true; - - case STREAM_META_OWNER_NAME: - return false; - - case STREAM_META_OWNER: - if (null === $content) { - return false; - } - - return $this->doPermChange($path, - $content, - function() use ($content, $var) - { - $content->chown($var); - } - ); - - case STREAM_META_GROUP_NAME: - return false; - - case STREAM_META_GROUP: - if (null === $content) { - return false; - } - - return $this->doPermChange($path, - $content, - function() use ($content, $var) - { - $content->chgrp($var); - } - ); - - case STREAM_META_ACCESS: - if (null === $content) { - return false; - } - - return $this->doPermChange($path, - $content, - function() use ($content, $var) - { - $content->chmod($var); - } - ); - - default: - return false; - } - } - - /** - * executes given permission change when necessary rights allow such a change - * - * @param string $path - * @param vfsStreamAbstractContent $content - * @param \Closure $change - * @return bool - */ - private function doPermChange($path, vfsStreamAbstractContent $content, \Closure $change) - { - if (!$content->isOwnedByUser(vfsStream::getCurrentUser())) { - return false; - } - - if (self::$root->getName() !== $path) { - $names = $this->splitPath($path); - $parent = $this->getContent($names['dirname']); - if (!$parent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup())) { - return false; - } - } - - $change(); - return true; - } - - /** - * checks whether stream is at end of file - * - * @return bool - */ - public function stream_eof() - { - return $this->content->eof(); - } - - /** - * returns the current position of the stream - * - * @return int - */ - public function stream_tell() - { - return $this->content->getBytesRead(); - } - - /** - * seeks to the given offset - * - * @param int $offset - * @param int $whence - * @return bool - */ - public function stream_seek($offset, $whence) - { - return $this->content->seek($offset, $whence); - } - - /** - * flushes unstored data into storage - * - * @return bool - */ - public function stream_flush() - { - return true; - } - - /** - * returns status of stream - * - * @return array - */ - public function stream_stat() - { - $fileStat = array('dev' => 0, - 'ino' => 0, - 'mode' => $this->content->getType() | $this->content->getPermissions(), - 'nlink' => 0, - 'uid' => $this->content->getUser(), - 'gid' => $this->content->getGroup(), - 'rdev' => 0, - 'size' => $this->content->size(), - 'atime' => $this->content->fileatime(), - 'mtime' => $this->content->filemtime(), - 'ctime' => $this->content->filectime(), - 'blksize' => -1, - 'blocks' => -1 - ); - return array_merge(array_values($fileStat), $fileStat); - } - - /** - * retrieve the underlaying resource - * - * Please note that this method always returns false as there is no - * underlaying resource to return. - * - * @param int $cast_as - * @since 0.9.0 - * @see https://github.com/mikey179/vfsStream/issues/3 - * @return bool - */ - public function stream_cast($cast_as) - { - return false; - } - - /** - * set lock status for stream - * - * @param int $operation - * @return bool - * @since 0.10.0 - * @see https://github.com/mikey179/vfsStream/issues/6 - * @see https://github.com/mikey179/vfsStream/issues/31 - * @see https://github.com/mikey179/vfsStream/issues/40 - */ - public function stream_lock($operation) - { - if ((LOCK_NB & $operation) == LOCK_NB) { - $operation = $operation - LOCK_NB; - } - - return $this->content->lock($this, $operation); - } - - /** - * sets options on the stream - * - * @param int $option key of option to set - * @param int $arg1 - * @param int $arg2 - * @return bool - * @since 0.10.0 - * @see https://github.com/mikey179/vfsStream/issues/15 - * @see http://www.php.net/manual/streamwrapper.stream-set-option.php - */ - public function stream_set_option($option, $arg1, $arg2) - { - switch ($option) { - case STREAM_OPTION_BLOCKING: - // break omitted - - case STREAM_OPTION_READ_TIMEOUT: - // break omitted - - case STREAM_OPTION_WRITE_BUFFER: - // break omitted - - default: - // nothing to do here - } - - return false; - } - - /** - * remove the data under the given path - * - * @param string $path - * @return bool - */ - public function unlink($path) - { - $realPath = $this->resolvePath(vfsStream::path($path)); - $content = $this->getContent($realPath); - if (null === $content) { - trigger_error('unlink(' . $path . '): No such file or directory', E_USER_WARNING); - return false; - } - - if ($content->getType() !== vfsStreamContent::TYPE_FILE) { - trigger_error('unlink(' . $path . '): Operation not permitted', E_USER_WARNING); - return false; - } - - return $this->doUnlink($realPath); - } - - /** - * removes a path - * - * @param string $path - * @return bool - */ - protected function doUnlink($path) - { - if (self::$root->getName() === $path) { - // delete root? very brave. :) - self::$root = null; - clearstatcache(); - return true; - } - - $names = $this->splitPath($path); - $content = $this->getContent($names['dirname']); - if (!$content->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup())) { - return false; - } - - clearstatcache(); - return $content->removeChild($names['basename']); - } - - /** - * rename from one path to another - * - * @param string $path_from - * @param string $path_to - * @return bool - * @author Benoit Aubuchon - */ - public function rename($path_from, $path_to) - { - $srcRealPath = $this->resolvePath(vfsStream::path($path_from)); - $dstRealPath = $this->resolvePath(vfsStream::path($path_to)); - $srcContent = $this->getContent($srcRealPath); - if (null == $srcContent) { - trigger_error(' No such file or directory', E_USER_WARNING); - return false; - } - $dstNames = $this->splitPath($dstRealPath); - $dstParentContent = $this->getContent($dstNames['dirname']); - if (null == $dstParentContent) { - trigger_error('No such file or directory', E_USER_WARNING); - return false; - } - if (!$dstParentContent->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup())) { - trigger_error('Permission denied', E_USER_WARNING); - return false; - } - if ($dstParentContent->getType() !== vfsStreamContent::TYPE_DIR) { - trigger_error('Target is not a directory', E_USER_WARNING); - return false; - } - - // remove old source first, so we can rename later - // (renaming first would lead to not being able to remove the old path) - if (!$this->doUnlink($srcRealPath)) { - return false; - } - - $dstContent = $srcContent; - // Renaming the filename - $dstContent->rename($dstNames['basename']); - // Copying to the destination - $dstParentContent->addChild($dstContent); - return true; - } - - /** - * creates a new directory - * - * @param string $path - * @param int $mode - * @param int $options - * @return bool - */ - public function mkdir($path, $mode, $options) - { - $umask = vfsStream::umask(); - if (0 < $umask) { - $permissions = $mode & ~$umask; - } else { - $permissions = $mode; - } - - $path = $this->resolvePath(vfsStream::path($path)); - if (null !== $this->getContent($path)) { - trigger_error('mkdir(): Path vfs://' . $path . ' exists', E_USER_WARNING); - return false; - } - - if (null === self::$root) { - self::$root = vfsStream::newDirectory($path, $permissions); - return true; - } - - $maxDepth = count(explode('/', $path)); - $names = $this->splitPath($path); - $newDirs = $names['basename']; - $dir = null; - $i = 0; - while ($dir === null && $i < $maxDepth) { - $dir = $this->getContent($names['dirname']); - $names = $this->splitPath($names['dirname']); - if (null == $dir) { - $newDirs = $names['basename'] . '/' . $newDirs; - } - - $i++; - } - - if (null === $dir - || $dir->getType() !== vfsStreamContent::TYPE_DIR - || $dir->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { - return false; - } - - $recursive = ((STREAM_MKDIR_RECURSIVE & $options) !== 0) ? (true) : (false); - if (strpos($newDirs, '/') !== false && false === $recursive) { - return false; - } - - vfsStream::newDirectory($newDirs, $permissions)->at($dir); - return true; - } - - /** - * removes a directory - * - * @param string $path - * @param int $options - * @return bool - * @todo consider $options with STREAM_MKDIR_RECURSIVE - */ - public function rmdir($path, $options) - { - $path = $this->resolvePath(vfsStream::path($path)); - $child = $this->getContentOfType($path, vfsStreamContent::TYPE_DIR); - if (null === $child) { - return false; - } - - // can only remove empty directories - if (count($child->getChildren()) > 0) { - return false; - } - - if (self::$root->getName() === $path) { - // delete root? very brave. :) - self::$root = null; - clearstatcache(); - return true; - } - - $names = $this->splitPath($path); - $dir = $this->getContentOfType($names['dirname'], vfsStreamContent::TYPE_DIR); - if ($dir->isWritable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { - return false; - } - - clearstatcache(); - return $dir->removeChild($child->getName()); - } - - /** - * opens a directory - * - * @param string $path - * @param int $options - * @return bool - */ - public function dir_opendir($path, $options) - { - $path = $this->resolvePath(vfsStream::path($path)); - $this->dir = $this->getContentOfType($path, vfsStreamContent::TYPE_DIR); - if (null === $this->dir || $this->dir->isReadable(vfsStream::getCurrentUser(), vfsStream::getCurrentGroup()) === false) { - return false; - } - - $this->dirIterator = $this->dir->getIterator(); - return true; - } - - /** - * reads directory contents - * - * @return string - */ - public function dir_readdir() - { - $dir = $this->dirIterator->current(); - if (null === $dir) { - return false; - } - - $this->dirIterator->next(); - return $dir->getName(); - } - - /** - * reset directory iteration - * - * @return bool - */ - public function dir_rewinddir() - { - return $this->dirIterator->rewind(); - } - - /** - * closes directory - * - * @return bool - */ - public function dir_closedir() - { - $this->dirIterator = null; - return true; - } - - /** - * returns status of url - * - * @param string $path path of url to return status for - * @param int $flags flags set by the stream API - * @return array - */ - public function url_stat($path, $flags) - { - $content = $this->getContent($this->resolvePath(vfsStream::path($path))); - if (null === $content) { - if (($flags & STREAM_URL_STAT_QUIET) != STREAM_URL_STAT_QUIET) { - trigger_error(' No such file or directory: ' . $path, E_USER_WARNING); - } - - return false; - - } - - $fileStat = array('dev' => 0, - 'ino' => 0, - 'mode' => $content->getType() | $content->getPermissions(), - 'nlink' => 0, - 'uid' => $content->getUser(), - 'gid' => $content->getGroup(), - 'rdev' => 0, - 'size' => $content->size(), - 'atime' => $content->fileatime(), - 'mtime' => $content->filemtime(), - 'ctime' => $content->filectime(), - 'blksize' => -1, - 'blocks' => -1 - ); - return array_merge(array_values($fileStat), $fileStat); - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamAbstractVisitor.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamAbstractVisitor.php deleted file mode 100644 index f9e597b..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamAbstractVisitor.php +++ /dev/null @@ -1,64 +0,0 @@ -getType()) { - case vfsStreamContent::TYPE_BLOCK: - $this->visitBlockDevice($content); - break; - - case vfsStreamContent::TYPE_FILE: - $this->visitFile($content); - break; - - case vfsStreamContent::TYPE_DIR: - if (!$content->isDot()) { - $this->visitDirectory($content); - } - - break; - - default: - throw new \InvalidArgumentException('Unknown content type ' . $content->getType() . ' for ' . $content->getName()); - } - - return $this; - } - - /** - * visit a block device and process it - * - * @param vfsStreamBlock $block - * @return vfsStreamVisitor - */ - public function visitBlockDevice(vfsStreamBlock $block) - { - return $this->visitFile($block); - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamPrintVisitor.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamPrintVisitor.php deleted file mode 100644 index 15b0bc0..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamPrintVisitor.php +++ /dev/null @@ -1,107 +0,0 @@ -out = $out; - } - - /** - * visit a file and process it - * - * @param vfsStreamFile $file - * @return vfsStreamPrintVisitor - */ - public function visitFile(vfsStreamFile $file) - { - $this->printContent($file->getName()); - return $this; - } - - /** - * visit a block device and process it - * - * @param vfsStreamBlock $block - * @return vfsStreamPrintVisitor - */ - public function visitBlockDevice(vfsStreamBlock $block) - { - $name = '[' . $block->getName() . ']'; - $this->printContent($name); - return $this; - } - - /** - * visit a directory and process it - * - * @param vfsStreamDirectory $dir - * @return vfsStreamPrintVisitor - */ - public function visitDirectory(vfsStreamDirectory $dir) - { - $this->printContent($dir->getName()); - $this->depth++; - foreach ($dir as $child) { - $this->visit($child); - } - - $this->depth--; - return $this; - } - - /** - * helper method to print the content - * - * @param string $name - */ - protected function printContent($name) - { - fwrite($this->out, str_repeat(' ', $this->depth) . '- ' . $name . "\n"); - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamStructureVisitor.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamStructureVisitor.php deleted file mode 100644 index 47acc45..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamStructureVisitor.php +++ /dev/null @@ -1,111 +0,0 @@ -reset(); - } - - /** - * visit a file and process it - * - * @param vfsStreamFile $file - * @return vfsStreamStructureVisitor - */ - public function visitFile(vfsStreamFile $file) - { - $this->current[$file->getName()] = $file->getContent(); - return $this; - } - - /** - * visit a block device and process it - * - * @param vfsStreamBlock $block - * @return vfsStreamStructureVisitor - */ - public function visitBlockDevice(vfsStreamBlock $block) - { - $this->current['[' . $block->getName() . ']'] = $block->getContent(); - return $this; - } - - /** - * visit a directory and process it - * - * @param vfsStreamDirectory $dir - * @return vfsStreamStructureVisitor - */ - public function visitDirectory(vfsStreamDirectory $dir) - { - $this->current[$dir->getName()] = array(); - $tmp =& $this->current; - $this->current =& $tmp[$dir->getName()]; - foreach ($dir as $child) { - $this->visit($child); - } - - $this->current =& $tmp; - return $this; - } - - /** - * returns structure of visited contents - * - * @return array - * @api - */ - public function getStructure() - { - return $this->structure; - } - - /** - * resets structure so visitor could be reused - * - * @return vfsStreamStructureVisitor - */ - public function reset() - { - $this->structure = array(); - $this->current =& $this->structure; - return $this; - } -} diff --git a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamVisitor.php b/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamVisitor.php deleted file mode 100644 index 2170105..0000000 --- a/vendor/mikey179/vfsstream/src/main/php/org/bovigo/vfs/visitor/vfsStreamVisitor.php +++ /dev/null @@ -1,55 +0,0 @@ -getMockBuilder($originalClassName) - ->setMethods($methods) - ->getMock() - ; - } - - return parent::getMock($originalClassName, $methods, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods, $proxyTarget); - } -} - -// The only deprecation warnings we need to ignore/handle are in PHP 7.4 so far -if (PHP_VERSION_ID >= 70400) { - function customErrorHandler($errno, $errstr, $errfile, $errline) { - // We know about this deprecation warning exists and it's already been - // fixed in the 2.x branch. For BC reasons in the 1.x branch, we'll - // ignore this warning to let tests pass. - if ($errno === E_DEPRECATED) { - if ($errstr === "Function ReflectionType::__toString() is deprecated") { - return true; - } - } - - // Any other error should be left up to PHPUnit to handle - return \PHPUnit_Util_ErrorHandler::handleError($errno, $errstr, $errfile, $errline); - } - - set_error_handler("customErrorHandler"); -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/DirectoryIterationTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/DirectoryIterationTestCase.php deleted file mode 100644 index 4f30b03..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/DirectoryIterationTestCase.php +++ /dev/null @@ -1,318 +0,0 @@ -assertEquals($expectedCount, - $actualCount, - 'Directory foo contains ' . $expectedCount . ' children, but got ' . $actualCount . ' children while iterating over directory contents' - ); - } - - /** - * @param \Closure $dotFilesSwitch - * @param string[] $expectedDirectories - * @test - * @dataProvider provideSwitchWithExpectations - */ - public function directoryIteration(\Closure $dotFilesSwitch, array $expectedDirectories) - { - $dotFilesSwitch(); - $dir = dir($this->fooURL); - $i = 0; - while (false !== ($entry = $dir->read())) { - $i++; - $this->assertTrue(in_array($entry, $expectedDirectories)); - } - - $this->assertDirectoryCount(count($expectedDirectories), $i); - $dir->rewind(); - $i = 0; - while (false !== ($entry = $dir->read())) { - $i++; - $this->assertTrue(in_array($entry, $expectedDirectories)); - } - - $this->assertDirectoryCount(count($expectedDirectories), $i); - $dir->close(); - } - - /** - * @param \Closure $dotFilesSwitch - * @param string[] $expectedDirectories - * @test - * @dataProvider provideSwitchWithExpectations - */ - public function directoryIterationWithDot(\Closure $dotFilesSwitch, array $expectedDirectories) - { - $dotFilesSwitch(); - $dir = dir($this->fooURL . '/.'); - $i = 0; - while (false !== ($entry = $dir->read())) { - $i++; - $this->assertTrue(in_array($entry, $expectedDirectories)); - } - - $this->assertDirectoryCount(count($expectedDirectories), $i); - $dir->rewind(); - $i = 0; - while (false !== ($entry = $dir->read())) { - $i++; - $this->assertTrue(in_array($entry, $expectedDirectories)); - } - - $this->assertDirectoryCount(count($expectedDirectories), $i); - $dir->close(); - } - - /** - * assure that a directory iteration works as expected - * - * @param \Closure $dotFilesSwitch - * @param string[] $expectedDirectories - * @test - * @dataProvider provideSwitchWithExpectations - * @group regression - * @group bug_2 - */ - public function directoryIterationWithOpenDir_Bug_2(\Closure $dotFilesSwitch, array $expectedDirectories) - { - $dotFilesSwitch(); - $handle = opendir($this->fooURL); - $i = 0; - while (false !== ($entry = readdir($handle))) { - $i++; - $this->assertTrue(in_array($entry, $expectedDirectories)); - } - - $this->assertDirectoryCount(count($expectedDirectories), $i); - - rewinddir($handle); - $i = 0; - while (false !== ($entry = readdir($handle))) { - $i++; - $this->assertTrue(in_array($entry, $expectedDirectories)); - } - - $this->assertDirectoryCount(count($expectedDirectories), $i); - closedir($handle); - } - - /** - * assure that a directory iteration works as expected - * - * @author Christoph Bloemer - * @param \Closure $dotFilesSwitch - * @param string[] $expectedDirectories - * @test - * @dataProvider provideSwitchWithExpectations - * @group regression - * @group bug_4 - */ - public function directoryIteration_Bug_4(\Closure $dotFilesSwitch, array $expectedDirectories) - { - $dotFilesSwitch(); - $dir = $this->fooURL; - $list1 = array(); - if ($handle = opendir($dir)) { - while (false !== ($listItem = readdir($handle))) { - if ('.' != $listItem && '..' != $listItem) { - if (is_file($dir . '/' . $listItem) === true) { - $list1[] = 'File:[' . $listItem . ']'; - } elseif (is_dir($dir . '/' . $listItem) === true) { - $list1[] = 'Folder:[' . $listItem . ']'; - } - } - } - - closedir($handle); - } - - $list2 = array(); - if ($handle = opendir($dir)) { - while (false !== ($listItem = readdir($handle))) { - if ('.' != $listItem && '..' != $listItem) { - if (is_file($dir . '/' . $listItem) === true) { - $list2[] = 'File:[' . $listItem . ']'; - } elseif (is_dir($dir . '/' . $listItem) === true) { - $list2[] = 'Folder:[' . $listItem . ']'; - } - } - } - - closedir($handle); - } - - $this->assertEquals($list1, $list2); - $this->assertEquals(2, count($list1)); - $this->assertEquals(2, count($list2)); - } - - /** - * assure that a directory iteration works as expected - * - * @param \Closure $dotFilesSwitch - * @param string[] $expectedDirectories - * @test - * @dataProvider provideSwitchWithExpectations - */ - public function directoryIterationShouldBeIndependent(\Closure $dotFilesSwitch, array $expectedDirectories) - { - $dotFilesSwitch(); - $list1 = array(); - $list2 = array(); - $handle1 = opendir($this->fooURL); - if (false !== ($listItem = readdir($handle1))) { - $list1[] = $listItem; - } - - $handle2 = opendir($this->fooURL); - if (false !== ($listItem = readdir($handle2))) { - $list2[] = $listItem; - } - - if (false !== ($listItem = readdir($handle1))) { - $list1[] = $listItem; - } - - if (false !== ($listItem = readdir($handle2))) { - $list2[] = $listItem; - } - - closedir($handle1); - closedir($handle2); - $this->assertEquals($list1, $list2); - $this->assertEquals(2, count($list1)); - $this->assertEquals(2, count($list2)); - } - - /** - * @test - * @group issue_50 - */ - public function recursiveDirectoryIterationWithDotsEnabled() - { - vfsStream::enableDotfiles(); - vfsStream::setup(); - $structure = array( - 'Core' => array( - 'AbstractFactory' => array( - 'test.php' => 'some text content', - 'other.php' => 'Some more text content', - 'Invalid.csv' => 'Something else', - ), - 'AnEmptyFolder' => array(), - 'badlocation.php' => 'some bad content', - ) - ); - $root = vfsStream::create($structure); - $rootPath = vfsStream::url($root->getName()); - - $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($rootPath), - \RecursiveIteratorIterator::CHILD_FIRST); - $pathes = array(); - foreach ($iterator as $fullFileName => $fileSPLObject) { - $pathes[] = $fullFileName; - } - - $this->assertEquals(array('vfs://root'.DIRECTORY_SEPARATOR.'.', - 'vfs://root'.DIRECTORY_SEPARATOR.'..', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'.', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'..', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'.', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'..', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'test.php', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'other.php', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'Invalid.csv', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AnEmptyFolder'.DIRECTORY_SEPARATOR.'.', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AnEmptyFolder'.DIRECTORY_SEPARATOR.'..', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AnEmptyFolder', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'badlocation.php', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core' - ), - $pathes - ); - } - - /** - * @test - * @group issue_50 - */ - public function recursiveDirectoryIterationWithDotsDisabled() - { - vfsStream::disableDotfiles(); - vfsStream::setup(); - $structure = array( - 'Core' => array( - 'AbstractFactory' => array( - 'test.php' => 'some text content', - 'other.php' => 'Some more text content', - 'Invalid.csv' => 'Something else', - ), - 'AnEmptyFolder' => array(), - 'badlocation.php' => 'some bad content', - ) - ); - $root = vfsStream::create($structure); - $rootPath = vfsStream::url($root->getName()); - - $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($rootPath), - \RecursiveIteratorIterator::CHILD_FIRST); - $pathes = array(); - foreach ($iterator as $fullFileName => $fileSPLObject) { - $pathes[] = $fullFileName; - } - - $this->assertEquals(array('vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'test.php', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'other.php', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory'.DIRECTORY_SEPARATOR.'Invalid.csv', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AbstractFactory', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'AnEmptyFolder', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core'.DIRECTORY_SEPARATOR.'badlocation.php', - 'vfs://root'.DIRECTORY_SEPARATOR.'Core' - ), - $pathes - ); - } -} \ No newline at end of file diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/FilenameTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/FilenameTestCase.php deleted file mode 100644 index 5326bd4..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/FilenameTestCase.php +++ /dev/null @@ -1,88 +0,0 @@ -rootDir = vfsStream::url('root'); - $this->lostAndFound = $this->rootDir . '/lost+found/'; - mkdir($this->lostAndFound); - } - - /** - * @test - */ - public function worksWithCorrectName() - { - $results = array(); - $it = new \RecursiveDirectoryIterator($this->lostAndFound); - foreach ($it as $f) { - $results[] = $f->getPathname(); - } - - $this->assertEquals( - array( - 'vfs://root/lost+found' . DIRECTORY_SEPARATOR . '.', - 'vfs://root/lost+found' . DIRECTORY_SEPARATOR . '..' - ), - $results - ); - } - - /** - * @test - * @expectedException UnexpectedValueException - * @expectedExceptionMessage failed to open dir - */ - public function doesNotWorkWithInvalidName() - { - $results = array(); - $it = new \RecursiveDirectoryIterator($this->rootDir . '/lost found/'); - foreach ($it as $f) { - $results[] = $f->getPathname(); - } - } - - /** - * @test - */ - public function returnsCorrectNames() - { - $results = array(); - $it = new \RecursiveDirectoryIterator($this->rootDir); - foreach ($it as $f) { - $results[] = $f->getPathname(); - } - - $this->assertEquals( - array( - 'vfs://root' . DIRECTORY_SEPARATOR . '.', - 'vfs://root' . DIRECTORY_SEPARATOR . '..', - 'vfs://root' . DIRECTORY_SEPARATOR . 'lost+found' - ), - $results - ); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/Issue104TestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/Issue104TestCase.php deleted file mode 100644 index 895f601..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/Issue104TestCase.php +++ /dev/null @@ -1,52 +0,0 @@ - array( - 'schema.xsd' => ' - - ', - ) - ); - vfsStream::setup('root', null, $structure); - $doc = new \DOMDocument(); - $this->assertTrue($doc->load(vfsStream::url('root/foo bar/schema.xsd'))); - } - - /** - * @test - */ - public function vfsStreamCanHandleUrlEncodedPath() - { - $content = ' - - '; - $structure = array('foo bar' => array( - 'schema.xsd' => $content, - ) - ); - vfsStream::setup('root', null, $structure); - $this->assertEquals( - $content, - file_get_contents(vfsStream::url('root/foo bar/schema.xsd')) - ); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/PermissionsTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/PermissionsTestCase.php deleted file mode 100644 index e99a55a..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/PermissionsTestCase.php +++ /dev/null @@ -1,118 +0,0 @@ - array('test.file' => '')); - $this->root = vfsStream::setup('root', null, $structure); - } - - /** - * @test - * @group issue_52 - */ - public function canNotChangePermissionWhenDirectoryNotWriteable() - { - $this->root->getChild('test_directory')->chmod(0444); - $this->assertFalse(@chmod(vfsStream::url('root/test_directory/test.file'), 0777)); - } - - /** - * @test - * @group issue_53 - */ - public function canNotChangePermissionWhenFileNotOwned() - { - $this->root->getChild('test_directory')->getChild('test.file')->chown(vfsStream::OWNER_USER_1); - $this->assertFalse(@chmod(vfsStream::url('root/test_directory/test.file'), 0777)); - } - - /** - * @test - * @group issue_52 - */ - public function canNotChangeOwnerWhenDirectoryNotWriteable() - { - $this->root->getChild('test_directory')->chmod(0444); - $this->assertFalse(@chown(vfsStream::url('root/test_directory/test.file'), vfsStream::OWNER_USER_2)); - } - - /** - * @test - * @group issue_53 - */ - public function canNotChangeOwnerWhenFileNotOwned() - { - $this->root->getChild('test_directory')->getChild('test.file')->chown(vfsStream::OWNER_USER_1); - $this->assertFalse(@chown(vfsStream::url('root/test_directory/test.file'), vfsStream::OWNER_USER_2)); - } - - /** - * @test - * @group issue_52 - */ - public function canNotChangeGroupWhenDirectoryNotWriteable() - { - $this->root->getChild('test_directory')->chmod(0444); - $this->assertFalse(@chgrp(vfsStream::url('root/test_directory/test.file'), vfsStream::GROUP_USER_2)); - } - - /** - * @test - * @group issue_53 - */ - public function canNotChangeGroupWhenFileNotOwned() - { - $this->root->getChild('test_directory')->getChild('test.file')->chown(vfsStream::OWNER_USER_1); - $this->assertFalse(@chgrp(vfsStream::url('root/test_directory/test.file'), vfsStream::GROUP_USER_2)); - } - - /** - * @test - * @group issue_107 - * @expectedException PHPUnit_Framework_Error - * @expectedExceptionMessage Can not create new file in non-writable path root - * @requires PHP 5.4 - * @since 1.5.0 - */ - public function touchOnNonWriteableDirectoryTriggersError() - { - $this->root->chmod(0555); - touch($this->root->url() . '/touch.txt'); - } - - /** - * @test - * @group issue_107 - * @requires PHP 5.4 - * @since 1.5.0 - */ - public function touchOnNonWriteableDirectoryDoesNotCreateFile() - { - $this->root->chmod(0555); - $this->assertFalse(@touch($this->root->url() . '/touch.txt')); - $this->assertFalse($this->root->hasChild('touch.txt')); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/QuotaTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/QuotaTestCase.php deleted file mode 100644 index 8c0f5b2..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/QuotaTestCase.php +++ /dev/null @@ -1,80 +0,0 @@ -quota = new Quota(10); - } - - /** - * @test - */ - public function unlimitedQuotaIsNotLimited() - { - $this->assertFalse(Quota::unlimited()->isLimited()); - } - - /** - * @test - */ - public function limitedQuotaIsLimited() - { - $this->assertTrue($this->quota->isLimited()); - } - - /** - * @test - */ - public function unlimitedQuotaHasAlwaysSpaceLeft() - { - $this->assertEquals(303, Quota::unlimited()->spaceLeft(303)); - } - - /** - * @test - */ - public function hasNoSpaceLeftWhenUsedSpaceIsLargerThanQuota() - { - $this->assertEquals(0, $this->quota->spaceLeft(11)); - } - - /** - * @test - */ - public function hasNoSpaceLeftWhenUsedSpaceIsEqualToQuota() - { - $this->assertEquals(0, $this->quota->spaceLeft(10)); - } - - /** - * @test - */ - public function hasSpaceLeftWhenUsedSpaceIsLowerThanQuota() - { - $this->assertEquals(1, $this->quota->spaceLeft(9)); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/UnlinkTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/UnlinkTestCase.php deleted file mode 100644 index c33a4c2..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/UnlinkTestCase.php +++ /dev/null @@ -1,58 +0,0 @@ - array('test.file' => '')); - $root = vfsStream::setup('root', null, $structure); - $root->getChild('test_directory')->chmod(0777); - $root->getChild('test_directory')->getChild('test.file')->chmod(0444); - $this->assertTrue(@unlink(vfsStream::url('root/test_directory/test.file'))); - } - - /** - * @test - * @group issue_51 - */ - public function canNotRemoveWritableFileFromNonWritableDirectory() - { - $structure = array('test_directory' => array('test.file' => '')); - $root = vfsStream::setup('root', null, $structure); - $root->getChild('test_directory')->chmod(0444); - $root->getChild('test_directory')->getChild('test.file')->chmod(0777); - $this->assertFalse(@unlink(vfsStream::url('root/test_directory/test.file'))); - } - - /** - * @test - * @since 1.4.0 - * @group issue_68 - */ - public function unlinkNonExistingFileTriggersError() - { - vfsStream::setup(); - try { - $this->assertFalse(unlink('vfs://root/foo.txt')); - } catch (\PHPUnit_Framework_Error $fe) { - $this->assertEquals('unlink(vfs://root/foo.txt): No such file or directory', $fe->getMessage()); - } - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/content/LargeFileContentTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/content/LargeFileContentTestCase.php deleted file mode 100644 index c9015e1..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/content/LargeFileContentTestCase.php +++ /dev/null @@ -1,225 +0,0 @@ -largeFileContent = new LargeFileContent(100); - } - - /** - * @test - */ - public function hasSizeOriginallyGiven() - { - $this->assertEquals(100, $this->largeFileContent->size()); - } - - /** - * @test - */ - public function contentIsFilledUpWithSpacesIfNoDataWritten() - { - $this->assertEquals( - str_repeat(' ', 100), - $this->largeFileContent->content() - ); - } - - /** - * @test - */ - public function readReturnsSpacesWhenNothingWrittenAtOffset() - { - $this->assertEquals( - str_repeat(' ', 10), - $this->largeFileContent->read(10) - ); - } - - /** - * @test - */ - public function readReturnsContentFilledWithSpaces() - { - $this->largeFileContent->write('foobarbaz'); - $this->largeFileContent->seek(0, SEEK_SET); - $this->assertEquals( - 'foobarbaz ', - $this->largeFileContent->read(10) - ); - } - - /** - * @test - */ - public function writesDataAtStartWhenOffsetNotMoved() - { - $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); - $this->assertEquals( - 'foobarbaz' . str_repeat(' ', 91), - $this->largeFileContent->content() - ); - } - - /** - * @test - */ - public function writeDataAtStartDoesNotIncreaseSize() - { - $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); - $this->assertEquals(100, $this->largeFileContent->size()); - } - - /** - * @test - */ - public function writesDataAtOffsetWhenOffsetMoved() - { - $this->largeFileContent->seek(50, SEEK_SET); - $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); - $this->assertEquals( - str_repeat(' ', 50) . 'foobarbaz' . str_repeat(' ', 41), - $this->largeFileContent->content() - ); - } - - /** - * @test - */ - public function writeDataInBetweenDoesNotIncreaseSize() - { - $this->largeFileContent->seek(50, SEEK_SET); - $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); - $this->assertEquals(100, $this->largeFileContent->size()); - } - - /** - * @test - */ - public function writesDataOverEndWhenOffsetAndDataLengthLargerThanSize() - { - $this->largeFileContent->seek(95, SEEK_SET); - $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); - $this->assertEquals( - str_repeat(' ', 95) . 'foobarbaz', - $this->largeFileContent->content() - ); - } - - /** - * @test - */ - public function writeDataOverLastOffsetIncreasesSize() - { - $this->largeFileContent->seek(95, SEEK_SET); - $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); - $this->assertEquals(104, $this->largeFileContent->size()); - } - - /** - * @test - */ - public function writesDataAfterEndWhenOffsetAfterEnd() - { - $this->largeFileContent->seek(0, SEEK_END); - $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); - $this->assertEquals( - str_repeat(' ', 100) . 'foobarbaz', - $this->largeFileContent->content() - ); - } - - /** - * @test - */ - public function writeDataAfterLastOffsetIncreasesSize() - { - $this->largeFileContent->seek(0, SEEK_END); - $this->assertEquals(9, $this->largeFileContent->write('foobarbaz')); - $this->assertEquals(109, $this->largeFileContent->size()); - } - - /** - * @test - */ - public function truncateReducesSize() - { - $this->assertTrue($this->largeFileContent->truncate(50)); - $this->assertEquals(50, $this->largeFileContent->size()); - } - - /** - * @test - */ - public function truncateRemovesWrittenContentAfterOffset() - { - $this->largeFileContent->seek(45, SEEK_SET); - $this->largeFileContent->write('foobarbaz'); - $this->assertTrue($this->largeFileContent->truncate(50)); - $this->assertEquals( - str_repeat(' ', 45) . 'fooba', - $this->largeFileContent->content() - ); - } - - /** - * @test - */ - public function createInstanceWithKilobytes() - { - $this->assertEquals( - 100 * 1024, - LargeFileContent::withKilobytes(100) - ->size() - ); - } - - /** - * @test - */ - public function createInstanceWithMegabytes() - { - $this->assertEquals( - 100 * 1024 * 1024, - LargeFileContent::withMegabytes(100) - ->size() - ); - } - - /** - * @test - */ - public function createInstanceWithGigabytes() - { - $this->assertEquals( - 100 * 1024 * 1024 * 1024, - LargeFileContent::withGigabytes(100) - ->size() - ); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/content/StringBasedFileContentTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/content/StringBasedFileContentTestCase.php deleted file mode 100644 index 137a092..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/content/StringBasedFileContentTestCase.php +++ /dev/null @@ -1,232 +0,0 @@ -stringBasedFileContent = new StringBasedFileContent('foobarbaz'); - } - - /** - * @test - */ - public function hasContentOriginallySet() - { - $this->assertEquals('foobarbaz', $this->stringBasedFileContent->content()); - } - - /** - * @test - */ - public function hasNotReachedEofAfterCreation() - { - $this->assertFalse($this->stringBasedFileContent->eof()); - } - - /** - * @test - */ - public function sizeEqualsLengthOfGivenString() - { - $this->assertEquals(9, $this->stringBasedFileContent->size()); - } - - /** - * @test - */ - public function readReturnsSubstringWithRequestedLength() - { - $this->assertEquals('foo', $this->stringBasedFileContent->read(3)); - } - - /** - * @test - */ - public function readMovesOffset() - { - $this->assertEquals('foo', $this->stringBasedFileContent->read(3)); - $this->assertEquals('bar', $this->stringBasedFileContent->read(3)); - $this->assertEquals('baz', $this->stringBasedFileContent->read(3)); - } - - /** - * @test - */ - public function reaMoreThanSizeReturnsWholeContent() - { - $this->assertEquals('foobarbaz', $this->stringBasedFileContent->read(10)); - } - - /** - * @test - */ - public function readAfterEndReturnsEmptyString() - { - // Read more than the length of the string to test substr() returning - // false. - $this->stringBasedFileContent->read(10); - $this->assertSame('', $this->stringBasedFileContent->read(3)); - } - - /** - * @test - */ - public function readDoesNotChangeSize() - { - $this->stringBasedFileContent->read(3); - $this->assertEquals(9, $this->stringBasedFileContent->size()); - } - - /** - * @test - */ - public function readLessThenSizeDoesNotReachEof() - { - $this->stringBasedFileContent->read(3); - $this->assertFalse($this->stringBasedFileContent->eof()); - } - - /** - * @test - */ - public function readSizeReachesEof() - { - $this->stringBasedFileContent->read(9); - $this->assertTrue($this->stringBasedFileContent->eof()); - } - - /** - * @test - */ - public function readMoreThanSizeReachesEof() - { - $this->stringBasedFileContent->read(10); - $this->assertTrue($this->stringBasedFileContent->eof()); - } - - /** - * @test - */ - public function seekWithInvalidOptionReturnsFalse() - { - $this->assertFalse($this->stringBasedFileContent->seek(0, 55)); - } - - /** - * @test - */ - public function canSeekToGivenOffset() - { - $this->assertTrue($this->stringBasedFileContent->seek(5, SEEK_SET)); - $this->assertEquals('rbaz', $this->stringBasedFileContent->read(10)); - } - - /** - * @test - */ - public function canSeekFromCurrentOffset() - { - $this->assertTrue($this->stringBasedFileContent->seek(5, SEEK_SET)); - $this->assertTrue($this->stringBasedFileContent->seek(2, SEEK_CUR)); - $this->assertEquals('az', $this->stringBasedFileContent->read(10)); - } - - /** - * @test - */ - public function canSeekToEnd() - { - $this->assertTrue($this->stringBasedFileContent->seek(0, SEEK_END)); - $this->assertEquals('', $this->stringBasedFileContent->read(10)); - } - - /** - * @test - */ - public function writeOverwritesExistingContentWhenOffsetNotAtEof() - { - $this->assertEquals(3, $this->stringBasedFileContent->write('bar')); - $this->assertEquals('barbarbaz', $this->stringBasedFileContent->content()); - } - - /** - * @test - */ - public function writeAppendsContentWhenOffsetAtEof() - { - $this->assertTrue($this->stringBasedFileContent->seek(0, SEEK_END)); - $this->assertEquals(3, $this->stringBasedFileContent->write('bar')); - $this->assertEquals('foobarbazbar', $this->stringBasedFileContent->content()); - } - - /** - * @test - * @group issue_33 - * @since 1.1.0 - */ - public function truncateRemovesSuperflouosContent() - { - $this->assertTrue($this->stringBasedFileContent->truncate(6)); - $this->assertEquals('foobar', $this->stringBasedFileContent->content()); - } - - /** - * @test - * @group issue_33 - * @since 1.1.0 - */ - public function truncateDecreasesSize() - { - $this->assertTrue($this->stringBasedFileContent->truncate(6)); - $this->assertEquals(6, $this->stringBasedFileContent->size()); - } - - /** - * @test - * @group issue_33 - * @since 1.1.0 - */ - public function truncateToGreaterSizeAddsZeroBytes() - { - $this->assertTrue($this->stringBasedFileContent->truncate(25)); - $this->assertEquals( - "foobarbaz\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", - $this->stringBasedFileContent->content() - ); - } - - /** - * @test - * @group issue_33 - * @since 1.1.0 - */ - public function truncateToGreaterSizeIncreasesSize() - { - $this->assertTrue($this->stringBasedFileContent->truncate(25)); - $this->assertEquals(25, $this->stringBasedFileContent->size()); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/proxy/vfsStreamWrapperRecordingProxy.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/proxy/vfsStreamWrapperRecordingProxy.php deleted file mode 100644 index 1ed84b5..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/proxy/vfsStreamWrapperRecordingProxy.php +++ /dev/null @@ -1,325 +0,0 @@ - - */ - public static function getMethodCalls($path) - { - if (isset(self::$calledMethods[$path]) === true) { - return self::$calledMethods[$path]; - } - - return array(); - } - - /** - * helper method for setting up vfsStream with the proxy - * - * @param string $rootDirName optional name of root directory - * @param int $permissions optional file permissions of root directory - * @return vfsStreamDirectory - * @throws vfsStreamException - */ - public static function setup($rootDirName = 'root', $permissions = null) - { - self::$root = vfsStream::newDirectory($rootDirName, $permissions); - if (true === self::$registered) { - return self::$root; - } - - if (@stream_wrapper_register(vfsStream::SCHEME, __CLASS__) === false) { - throw new vfsStreamException('A handler has already been registered for the ' . vfsStream::SCHEME . ' protocol.'); - } - - self::$registered = true; - return self::$root; - } - - /** - * open the stream - * - * @param string $path the path to open - * @param string $mode mode for opening - * @param string $options options for opening - * @param string $opened_path full path that was actually opened - * @return bool - */ - public function stream_open($path, $mode, $options, $opened_path) - { - $this->path = $path; - self::recordMethodCall('stream_open', $this->path); - return parent::stream_open($path, $mode, $options, $opened_path); - } - - /** - * closes the stream - */ - public function stream_close() - { - self::recordMethodCall('stream_close', $this->path); - return parent::stream_close(); - } - - /** - * read the stream up to $count bytes - * - * @param int $count amount of bytes to read - * @return string - */ - public function stream_read($count) - { - self::recordMethodCall('stream_read', $this->path); - return parent::stream_read($count); - } - - /** - * writes data into the stream - * - * @param string $data - * @return int amount of bytes written - */ - public function stream_write($data) - { - self::recordMethodCall('stream_write', $this->path); - return parent::stream_write($data); - } - - /** - * checks whether stream is at end of file - * - * @return bool - */ - public function stream_eof() - { - self::recordMethodCall('stream_eof', $this->path); - return parent::stream_eof(); - } - - /** - * returns the current position of the stream - * - * @return int - */ - public function stream_tell() - { - self::recordMethodCall('stream_tell', $this->path); - return parent::stream_tell(); - } - - /** - * seeks to the given offset - * - * @param int $offset - * @param int $whence - * @return bool - */ - public function stream_seek($offset, $whence) - { - self::recordMethodCall('stream_seek', $this->path); - return parent::stream_seek($offset, $whence); - } - - /** - * flushes unstored data into storage - * - * @return bool - */ - public function stream_flush() - { - self::recordMethodCall('stream_flush', $this->path); - return parent::stream_flush(); - } - - /** - * returns status of stream - * - * @return array - */ - public function stream_stat() - { - self::recordMethodCall('stream_stat', $this->path); - return parent::stream_stat(); - } - - /** - * retrieve the underlaying resource - * - * @param int $cast_as - * @return bool - */ - public function stream_cast($cast_as) - { - self::recordMethodCall('stream_cast', $this->path); - return parent::stream_cast($cast_as); - } - - /** - * set lock status for stream - * - * @param int $operation - * @return bool - */ - public function stream_lock($operation) - { - self::recordMethodCall('stream_link', $this->path); - return parent::stream_lock($operation); - } - - /** - * remove the data under the given path - * - * @param string $path - * @return bool - */ - public function unlink($path) - { - self::recordMethodCall('unlink', $path); - return parent::unlink($path); - } - - /** - * rename from one path to another - * - * @param string $path_from - * @param string $path_to - * @return bool - */ - public function rename($path_from, $path_to) - { - self::recordMethodCall('rename', $path_from); - return parent::rename($path_from, $path_to); - } - - /** - * creates a new directory - * - * @param string $path - * @param int $mode - * @param int $options - * @return bool - */ - public function mkdir($path, $mode, $options) - { - self::recordMethodCall('mkdir', $path); - return parent::mkdir($path, $mode, $options); - } - - /** - * removes a directory - * - * @param string $path - * @param int $options - * @return bool - */ - public function rmdir($path, $options) - { - self::recordMethodCall('rmdir', $path); - return parent::rmdir($path, $options); - } - - /** - * opens a directory - * - * @param string $path - * @param int $options - * @return bool - */ - public function dir_opendir($path, $options) - { - $this->path = $path; - self::recordMethodCall('dir_opendir', $this->path); - return parent::dir_opendir($path, $options); - } - - /** - * reads directory contents - * - * @return string - */ - public function dir_readdir() - { - self::recordMethodCall('dir_readdir', $this->path); - return parent::dir_readdir(); - } - - /** - * reset directory iteration - * - * @return bool - */ - public function dir_rewinddir() - { - self::recordMethodCall('dir_rewinddir', $this->path); - return parent::dir_rewinddir(); - } - - /** - * closes directory - * - * @return bool - */ - public function dir_closedir() - { - self::recordMethodCall('dir_closedir', $this->path); - return parent::dir_closedir(); - } - - /** - * returns status of url - * - * @param string $path path of url to return status for - * @param int $flags flags set by the stream API - * @return array - */ - public function url_stat($path, $flags) - { - self::recordMethodCall('url_stat', $path); - return parent::url_stat($path, $flags); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamAbstractContentTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamAbstractContentTestCase.php deleted file mode 100644 index faff3d6..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamAbstractContentTestCase.php +++ /dev/null @@ -1,1053 +0,0 @@ -assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function executePermissionsForUser() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0100); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertTrue($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function executePermissionsForGroup() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0010); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function executePermissionsForOther() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0001); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function writePermissionsForUser() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0200); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertTrue($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function writePermissionsForGroup() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0020); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function writePermissionsForOther() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0002); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function executeAndWritePermissionsForUser() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0300); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertTrue($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertTrue($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function executeAndWritePermissionsForGroup() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0030); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function executeAndWritePermissionsForOther() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0003); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function readPermissionsForUser() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0400); - $this->assertTrue($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function readPermissionsForGroup() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0040); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function readPermissionsForOther() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0004); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function readAndExecutePermissionsForUser() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0500); - $this->assertTrue($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertTrue($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function readAndExecutePermissionsForGroup() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0050); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function readAndExecutePermissionsForOther() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0005); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function readAndWritePermissionsForUser() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0600); - $this->assertTrue($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertTrue($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function readAndWritePermissionsForGroup() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0060); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function readAndWritePermissionsForOther() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0006); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function allPermissionsForUser() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0700); - $this->assertTrue($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertTrue($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertTrue($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function allPermissionsForGroup() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0070); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - -1 - ) - ); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function allPermissionsForOther() - { - $abstractContent = new TestvfsStreamAbstractContent('foo', 0007); - $this->assertFalse($abstractContent->isReadable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isReadable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isReadable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isWritable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isWritable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isWritable(-1, - -1 - ) - ); - $this->assertFalse($abstractContent->isExecutable(vfsStream::getCurrentUser(), - vfsStream::getCurrentGroup() - ) - ); - $this->assertFalse($abstractContent->isExecutable(-1, - vfsStream::getCurrentGroup() - ) - ); - $this->assertTrue($abstractContent->isExecutable(-1, - -1 - ) - ); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamBlockTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamBlockTestCase.php deleted file mode 100644 index cd8e1a4..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamBlockTestCase.php +++ /dev/null @@ -1,89 +0,0 @@ -block = new vfsStreamBlock('foo'); - } - - /** - * test default values and methods - * - * @test - */ - public function defaultValues() - { - $this->assertEquals(vfsStreamContent::TYPE_BLOCK, $this->block->getType()); - $this->assertEquals('foo', $this->block->getName()); - $this->assertTrue($this->block->appliesTo('foo')); - $this->assertFalse($this->block->appliesTo('foo/bar')); - $this->assertFalse($this->block->appliesTo('bar')); - } - - /** - * tests how external functions see this object - * - * @test - */ - public function external() - { - $root = vfsStream::setup('root'); - $root->addChild(vfsStream::newBlock('foo')); - $this->assertEquals('block', filetype(vfsStream::url('root/foo'))); - } - - /** - * tests adding a complex structure - * - * @test - */ - public function addStructure() - { - $structure = array( - 'topLevel' => array( - 'thisIsAFile' => 'file contents', - '[blockDevice]' => 'block contents' - ) - ); - - $root = vfsStream::create($structure); - - $this->assertSame('block', filetype(vfsStream::url('root/topLevel/blockDevice'))); - } - - /** - * tests that a blank name for a block device throws an exception - * @test - * @expectedException org\bovigo\vfs\vfsStreamException - */ - public function createWithEmptyName() - { - $structure = array( - 'topLevel' => array( - 'thisIsAFile' => 'file contents', - '[]' => 'block contents' - ) - ); - - $root = vfsStream::create($structure); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamContainerIteratorTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamContainerIteratorTestCase.php deleted file mode 100644 index 934e014..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamContainerIteratorTestCase.php +++ /dev/null @@ -1,111 +0,0 @@ -dir = new vfsStreamDirectory('foo'); - $this->mockChild1 = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $this->mockChild1->expects($this->any()) - ->method('getName') - ->will($this->returnValue('bar')); - $this->dir->addChild($this->mockChild1); - $this->mockChild2 = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $this->mockChild2->expects($this->any()) - ->method('getName') - ->will($this->returnValue('baz')); - $this->dir->addChild($this->mockChild2); - } - - /** - * clean up test environment - */ - public function tearDown() - { - vfsStream::enableDotfiles(); - } - - /** - * @return array - */ - public function provideSwitchWithExpectations() - { - return array(array(function() { vfsStream::disableDotfiles(); }, - array() - ), - array(function() { vfsStream::enableDotfiles(); }, - array('.', '..') - ) - ); - } - - private function getDirName($dir) - { - if (is_string($dir)) { - return $dir; - } - - - return $dir->getName(); - } - - /** - * @param \Closure $dotFilesSwitch - * @param array $dirNames - * @test - * @dataProvider provideSwitchWithExpectations - */ - public function iteration(\Closure $dotFilesSwitch, array $dirs) - { - $dirs[] = $this->mockChild1; - $dirs[] = $this->mockChild2; - $dotFilesSwitch(); - $dirIterator = $this->dir->getIterator(); - foreach ($dirs as $dir) { - $this->assertEquals($this->getDirName($dir), $dirIterator->key()); - $this->assertTrue($dirIterator->valid()); - if (!is_string($dir)) { - $this->assertSame($dir, $dirIterator->current()); - } - - $dirIterator->next(); - } - - $this->assertFalse($dirIterator->valid()); - $this->assertNull($dirIterator->key()); - $this->assertNull($dirIterator->current()); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryIssue134TestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryIssue134TestCase.php deleted file mode 100644 index c1c0dda..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryIssue134TestCase.php +++ /dev/null @@ -1,64 +0,0 @@ -rootDirectory = vfsStream::newDirectory('/'); - $this->rootDirectory->addChild(vfsStream::newDirectory('var/log/app')); - - } - - /** - * Test: should save directory name as string internal - * - * @small - */ - public function testShouldSaveDirectoryNameAsStringInternal() - { - $dir = $this->rootDirectory->getChild('var/log/app'); - - $dir->addChild(vfsStream::newDirectory(80)); - - static::assertNotNull($this->rootDirectory->getChild('var/log/app/80')); - } - - - - /** - * Test: should rename directory name as string internal - * - * @small - */ - public function testShouldRenameDirectoryNameAsStringInternal() - { - $dir = $this->rootDirectory->getChild('var/log/app'); - - $dir->addChild(vfsStream::newDirectory(80)); - - $child = $this->rootDirectory->getChild('var/log/app/80'); - $child->rename(90); - - static::assertNotNull($this->rootDirectory->getChild('var/log/app/90')); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryIssue18TestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryIssue18TestCase.php deleted file mode 100644 index fdf45b2..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryIssue18TestCase.php +++ /dev/null @@ -1,80 +0,0 @@ -rootDirectory = vfsStream::newDirectory('/'); - $this->rootDirectory->addChild(vfsStream::newDirectory('var/log/app')); - $dir = $this->rootDirectory->getChild('var/log/app'); - $dir->addChild(vfsStream::newDirectory('app1')); - $dir->addChild(vfsStream::newDirectory('app2')); - $dir->addChild(vfsStream::newDirectory('foo')); - } - - /** - * @test - */ - public function shouldContainThreeSubdirectories() - { - $this->assertEquals(3, - count($this->rootDirectory->getChild('var/log/app')->getChildren()) - ); - } - - /** - * @test - */ - public function shouldContainSubdirectoryFoo() - { - $this->assertTrue($this->rootDirectory->getChild('var/log/app')->hasChild('foo')); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', - $this->rootDirectory->getChild('var/log/app')->getChild('foo') - ); - } - - /** - * @test - */ - public function shouldContainSubdirectoryApp1() - { - $this->assertTrue($this->rootDirectory->getChild('var/log/app')->hasChild('app1')); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', - $this->rootDirectory->getChild('var/log/app')->getChild('app1') - ); - } - - /** - * @test - */ - public function shouldContainSubdirectoryApp2() - { - $this->assertTrue($this->rootDirectory->getChild('var/log/app')->hasChild('app2')); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', - $this->rootDirectory->getChild('var/log/app')->getChild('app2') - ); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryTestCase.php deleted file mode 100644 index 19ed51b..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamDirectoryTestCase.php +++ /dev/null @@ -1,334 +0,0 @@ -dir = new vfsStreamDirectory('foo'); - } - - /** - * assure that a directory seperator inside the name throws an exception - * - * @test - * @expectedException org\bovigo\vfs\vfsStreamException - */ - public function invalidCharacterInName() - { - $dir = new vfsStreamDirectory('foo/bar'); - } - - /** - * test default values and methods - * - * @test - */ - public function defaultValues() - { - $this->assertEquals(vfsStreamContent::TYPE_DIR, $this->dir->getType()); - $this->assertEquals('foo', $this->dir->getName()); - $this->assertTrue($this->dir->appliesTo('foo')); - $this->assertTrue($this->dir->appliesTo('foo/bar')); - $this->assertFalse($this->dir->appliesTo('bar')); - $this->assertEquals(array(), $this->dir->getChildren()); - } - - /** - * test renaming the directory - * - * @test - */ - public function rename() - { - $this->dir->rename('bar'); - $this->assertEquals('bar', $this->dir->getName()); - $this->assertFalse($this->dir->appliesTo('foo')); - $this->assertFalse($this->dir->appliesTo('foo/bar')); - $this->assertTrue($this->dir->appliesTo('bar')); - } - - /** - * renaming the directory to an invalid name throws a vfsStreamException - * - * @test - * @expectedException org\bovigo\vfs\vfsStreamException - */ - public function renameToInvalidNameThrowsvfsStreamException() - { - $this->dir->rename('foo/baz'); - } - - /** - * @test - * @since 0.10.0 - */ - public function hasNoChildrenByDefault() - { - $this->assertFalse($this->dir->hasChildren()); - } - - /** - * @test - * @since 0.10.0 - */ - public function hasChildrenReturnsTrueIfAtLeastOneChildPresent() - { - $mockChild = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $mockChild->expects($this->any()) - ->method('appliesTo') - ->will($this->returnValue(false)); - $mockChild->expects($this->any()) - ->method('getName') - ->will($this->returnValue('baz')); - $this->dir->addChild($mockChild); - $this->assertTrue($this->dir->hasChildren()); - } - - /** - * @test - */ - public function hasChildReturnsFalseForNonExistingChild() - { - $this->assertFalse($this->dir->hasChild('bar')); - } - - /** - * @test - */ - public function getChildReturnsNullForNonExistingChild() - { - $this->assertNull($this->dir->getChild('bar')); - } - - /** - * @test - */ - public function removeChildReturnsFalseForNonExistingChild() - { - $this->assertFalse($this->dir->removeChild('bar')); - } - - /** - * @test - */ - public function nonExistingChild() - { - $mockChild = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $mockChild->expects($this->any()) - ->method('appliesTo') - ->will($this->returnValue(false)); - $mockChild->expects($this->any()) - ->method('getName') - ->will($this->returnValue('baz')); - $this->dir->addChild($mockChild); - $this->assertFalse($this->dir->removeChild('bar')); - } - - /** - * test that adding, handling and removing of a child works as expected - * - * @test - */ - public function childHandling() - { - $mockChild = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $mockChild->expects($this->any()) - ->method('getType') - ->will($this->returnValue(vfsStreamContent::TYPE_FILE)); - $mockChild->expects($this->any()) - ->method('getName') - ->will($this->returnValue('bar')); - $mockChild->expects($this->any()) - ->method('appliesTo') - ->with($this->equalTo('bar')) - ->will($this->returnValue(true)); - $mockChild->expects($this->once()) - ->method('size') - ->will($this->returnValue(5)); - $this->dir->addChild($mockChild); - $this->assertTrue($this->dir->hasChild('bar')); - $bar = $this->dir->getChild('bar'); - $this->assertSame($mockChild, $bar); - $this->assertEquals(array($mockChild), $this->dir->getChildren()); - $this->assertEquals(0, $this->dir->size()); - $this->assertEquals(5, $this->dir->sizeSummarized()); - $this->assertTrue($this->dir->removeChild('bar')); - $this->assertEquals(array(), $this->dir->getChildren()); - $this->assertEquals(0, $this->dir->size()); - $this->assertEquals(0, $this->dir->sizeSummarized()); - } - - /** - * test that adding, handling and removing of a child works as expected - * - * @test - */ - public function childHandlingWithSubdirectory() - { - $mockChild = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $mockChild->expects($this->any()) - ->method('getType') - ->will($this->returnValue(vfsStreamContent::TYPE_FILE)); - $mockChild->expects($this->any()) - ->method('getName') - ->will($this->returnValue('bar')); - $mockChild->expects($this->once()) - ->method('size') - ->will($this->returnValue(5)); - $subdir = new vfsStreamDirectory('subdir'); - $subdir->addChild($mockChild); - $this->dir->addChild($subdir); - $this->assertTrue($this->dir->hasChild('subdir')); - $this->assertSame($subdir, $this->dir->getChild('subdir')); - $this->assertEquals(array($subdir), $this->dir->getChildren()); - $this->assertEquals(0, $this->dir->size()); - $this->assertEquals(5, $this->dir->sizeSummarized()); - $this->assertTrue($this->dir->removeChild('subdir')); - $this->assertEquals(array(), $this->dir->getChildren()); - $this->assertEquals(0, $this->dir->size()); - $this->assertEquals(0, $this->dir->sizeSummarized()); - } - - /** - * dd - * - * @test - * @group regression - * @group bug_5 - */ - public function addChildReplacesChildWithSameName_Bug_5() - { - $mockChild1 = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $mockChild1->expects($this->any()) - ->method('getType') - ->will($this->returnValue(vfsStreamContent::TYPE_FILE)); - $mockChild1->expects($this->any()) - ->method('getName') - ->will($this->returnValue('bar')); - $mockChild2 = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $mockChild2->expects($this->any()) - ->method('getType') - ->will($this->returnValue(vfsStreamContent::TYPE_FILE)); - $mockChild2->expects($this->any()) - ->method('getName') - ->will($this->returnValue('bar')); - $this->dir->addChild($mockChild1); - $this->assertTrue($this->dir->hasChild('bar')); - $this->assertSame($mockChild1, $this->dir->getChild('bar')); - $this->dir->addChild($mockChild2); - $this->assertTrue($this->dir->hasChild('bar')); - $this->assertSame($mockChild2, $this->dir->getChild('bar')); - } - - /** - * When testing for a nested path, verify that directory separators are respected properly - * so that subdir1/subdir2 is not considered equal to subdir1Xsubdir2. - * - * @test - * @group bug_24 - * @group regression - */ - public function explicitTestForSeparatorWithNestedPaths_Bug_24() - { - $mockChild = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $mockChild->expects($this->any()) - ->method('getType') - ->will($this->returnValue(vfsStreamContent::TYPE_FILE)); - $mockChild->expects($this->any()) - ->method('getName') - ->will($this->returnValue('bar')); - - $subdir1 = new vfsStreamDirectory('subdir1'); - $this->dir->addChild($subdir1); - - $subdir2 = new vfsStreamDirectory('subdir2'); - $subdir1->addChild($subdir2); - - $subdir2->addChild($mockChild); - - $this->assertTrue($this->dir->hasChild('subdir1'), "Level 1 path with separator exists"); - $this->assertTrue($this->dir->hasChild('subdir1/subdir2'), "Level 2 path with separator exists"); - $this->assertTrue($this->dir->hasChild('subdir1/subdir2/bar'), "Level 3 path with separator exists"); - $this->assertFalse($this->dir->hasChild('subdir1.subdir2'), "Path with period does not exist"); - $this->assertFalse($this->dir->hasChild('subdir1.subdir2/bar'), "Nested path with period does not exist"); - } - - - /** - * setting and retrieving permissions for a directory - * - * @test - * @group permissions - */ - public function permissions() - { - $this->assertEquals(0777, $this->dir->getPermissions()); - $this->assertSame($this->dir, $this->dir->chmod(0755)); - $this->assertEquals(0755, $this->dir->getPermissions()); - } - - /** - * setting and retrieving permissions for a directory - * - * @test - * @group permissions - */ - public function permissionsSet() - { - $this->dir = new vfsStreamDirectory('foo', 0755); - $this->assertEquals(0755, $this->dir->getPermissions()); - $this->assertSame($this->dir, $this->dir->chmod(0700)); - $this->assertEquals(0700, $this->dir->getPermissions()); - } - - /** - * setting and retrieving owner of a file - * - * @test - * @group permissions - */ - public function owner() - { - $this->assertEquals(vfsStream::getCurrentUser(), $this->dir->getUser()); - $this->assertTrue($this->dir->isOwnedByUser(vfsStream::getCurrentUser())); - $this->assertSame($this->dir, $this->dir->chown(vfsStream::OWNER_USER_1)); - $this->assertEquals(vfsStream::OWNER_USER_1, $this->dir->getUser()); - $this->assertTrue($this->dir->isOwnedByUser(vfsStream::OWNER_USER_1)); - } - - /** - * setting and retrieving owner group of a file - * - * @test - * @group permissions - */ - public function group() - { - $this->assertEquals(vfsStream::getCurrentGroup(), $this->dir->getGroup()); - $this->assertTrue($this->dir->isOwnedByGroup(vfsStream::getCurrentGroup())); - $this->assertSame($this->dir, $this->dir->chgrp(vfsStream::GROUP_USER_1)); - $this->assertEquals(vfsStream::GROUP_USER_1, $this->dir->getGroup()); - $this->assertTrue($this->dir->isOwnedByGroup(vfsStream::GROUP_USER_1)); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamExLockTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamExLockTestCase.php deleted file mode 100644 index 66ad14d..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamExLockTestCase.php +++ /dev/null @@ -1,55 +0,0 @@ -at($root); - - } - - /** - * This test verifies the current behaviour where vfsStream URLs do not work - * with file_put_contents() and LOCK_EX. The test is intended to break once - * PHP changes this so we get notified about the change. - * - * @test - */ - public function filePutContentsLockShouldReportError() - { - @file_put_contents(vfsStream::url('root/testfile'), "some string\n", LOCK_EX); - $php_error = error_get_last(); - $this->assertEquals("file_put_contents(): Exclusive locks may only be set for regular files", $php_error['message']); - } - - /** - * @test - */ - public function flockSouldPass() - { - $fp = fopen(vfsStream::url('root/testfile'), 'w'); - flock($fp, LOCK_EX); - fwrite($fp, "another string\n"); - flock($fp, LOCK_UN); - fclose($fp); - $this->assertEquals("another string\n", file_get_contents(vfsStream::url('root/testfile'))); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamFileTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamFileTestCase.php deleted file mode 100644 index 82b74f1..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamFileTestCase.php +++ /dev/null @@ -1,337 +0,0 @@ -file = new vfsStreamFile('foo'); - } - - /** - * test default values and methods - * - * @test - */ - public function defaultValues() - { - $this->assertEquals(vfsStreamContent::TYPE_FILE, $this->file->getType()); - $this->assertEquals('foo', $this->file->getName()); - $this->assertTrue($this->file->appliesTo('foo')); - $this->assertFalse($this->file->appliesTo('foo/bar')); - $this->assertFalse($this->file->appliesTo('bar')); - } - - /** - * test setting and getting the content of a file - * - * @test - */ - public function content() - { - $this->assertNull($this->file->getContent()); - $this->assertSame($this->file, $this->file->setContent('bar')); - $this->assertEquals('bar', $this->file->getContent()); - $this->assertSame($this->file, $this->file->withContent('baz')); - $this->assertEquals('baz', $this->file->getContent()); - } - - /** - * test renaming the directory - * - * @test - */ - public function rename() - { - $this->file->rename('bar'); - $this->assertEquals('bar', $this->file->getName()); - $this->assertFalse($this->file->appliesTo('foo')); - $this->assertFalse($this->file->appliesTo('foo/bar')); - $this->assertTrue($this->file->appliesTo('bar')); - } - - /** - * test reading contents from the file - * - * @test - */ - public function readEmptyFile() - { - $this->assertTrue($this->file->eof()); - $this->assertEquals(0, $this->file->size()); - $this->assertEquals('', $this->file->read(5)); - $this->assertEquals(5, $this->file->getBytesRead()); - $this->assertTrue($this->file->eof()); - } - - /** - * test reading contents from the file - * - * @test - */ - public function read() - { - $this->file->setContent('foobarbaz'); - $this->assertFalse($this->file->eof()); - $this->assertEquals(9, $this->file->size()); - $this->assertEquals('foo', $this->file->read(3)); - $this->assertEquals(3, $this->file->getBytesRead()); - $this->assertFalse($this->file->eof()); - $this->assertEquals(9, $this->file->size()); - $this->assertEquals('bar', $this->file->read(3)); - $this->assertEquals(6, $this->file->getBytesRead()); - $this->assertFalse($this->file->eof()); - $this->assertEquals(9, $this->file->size()); - $this->assertEquals('baz', $this->file->read(3)); - $this->assertEquals(9, $this->file->getBytesRead()); - $this->assertEquals(9, $this->file->size()); - $this->assertTrue($this->file->eof()); - $this->assertEquals('', $this->file->read(3)); - } - - /** - * test seeking to offset - * - * @test - */ - public function seekEmptyFile() - { - $this->assertFalse($this->file->seek(0, 55)); - $this->assertTrue($this->file->seek(0, SEEK_SET)); - $this->assertEquals(0, $this->file->getBytesRead()); - $this->assertTrue($this->file->seek(5, SEEK_SET)); - $this->assertEquals(5, $this->file->getBytesRead()); - $this->assertTrue($this->file->seek(0, SEEK_CUR)); - $this->assertEquals(5, $this->file->getBytesRead()); - $this->assertTrue($this->file->seek(2, SEEK_CUR)); - $this->assertEquals(7, $this->file->getBytesRead()); - $this->assertTrue($this->file->seek(0, SEEK_END)); - $this->assertEquals(0, $this->file->getBytesRead()); - $this->assertTrue($this->file->seek(2, SEEK_END)); - $this->assertEquals(2, $this->file->getBytesRead()); - } - - /** - * @test - * @since 1.6.5 - */ - public function seekEmptyFileBeforeBeginningDoesNotChangeOffset() - { - $this->assertFalse($this->file->seek(-5, SEEK_SET), 'Seek before beginning of file'); - $this->assertEquals(0, $this->file->getBytesRead()); - } - - /** - * test seeking to offset - * - * @test - */ - public function seekRead() - { - $this->file->setContent('foobarbaz'); - $this->assertFalse($this->file->seek(0, 55)); - $this->assertTrue($this->file->seek(0, SEEK_SET)); - $this->assertEquals('foobarbaz', $this->file->readUntilEnd()); - $this->assertEquals(0, $this->file->getBytesRead()); - $this->assertTrue($this->file->seek(5, SEEK_SET)); - $this->assertEquals('rbaz', $this->file->readUntilEnd()); - $this->assertEquals(5, $this->file->getBytesRead()); - $this->assertTrue($this->file->seek(0, SEEK_CUR)); - $this->assertEquals('rbaz', $this->file->readUntilEnd()); - $this->assertEquals(5, $this->file->getBytesRead(), 5); - $this->assertTrue($this->file->seek(2, SEEK_CUR)); - $this->assertEquals('az', $this->file->readUntilEnd()); - $this->assertEquals(7, $this->file->getBytesRead()); - $this->assertTrue($this->file->seek(0, SEEK_END)); - $this->assertEquals('', $this->file->readUntilEnd()); - $this->assertEquals(9, $this->file->getBytesRead()); - $this->assertTrue($this->file->seek(2, SEEK_END)); - $this->assertEquals('', $this->file->readUntilEnd()); - $this->assertEquals(11, $this->file->getBytesRead()); - } - - /** - * @test - * @since 1.6.5 - */ - public function seekFileBeforeBeginningDoesNotChangeOffset() - { - $this->file->setContent('foobarbaz'); - $this->assertFalse($this->file->seek(-5, SEEK_SET), 'Seek before beginning of file'); - $this->assertEquals(0, $this->file->getBytesRead()); - $this->assertTrue($this->file->seek(2, SEEK_CUR)); - $this->assertFalse($this->file->seek(-5, SEEK_SET), 'Seek before beginning of file'); - $this->assertEquals(2, $this->file->getBytesRead()); - $this->assertEquals('obarbaz', $this->file->readUntilEnd()); - $this->assertFalse($this->file->seek(-5, SEEK_CUR), 'Seek before beginning of file'); - $this->assertEquals(2, $this->file->getBytesRead()); - $this->assertEquals('obarbaz', $this->file->readUntilEnd()); - $this->assertFalse($this->file->seek(-20, SEEK_END), 'Seek before beginning of file'); - $this->assertEquals(2, $this->file->getBytesRead()); - $this->assertEquals('obarbaz', $this->file->readUntilEnd()); - } - - /** - * test writing data into the file - * - * @test - */ - public function writeEmptyFile() - { - $this->assertEquals(3, $this->file->write('foo')); - $this->assertEquals('foo', $this->file->getContent()); - $this->assertEquals(3, $this->file->size()); - $this->assertEquals(3, $this->file->write('bar')); - $this->assertEquals('foobar', $this->file->getContent()); - $this->assertEquals(6, $this->file->size()); - } - - /** - * test writing data into the file - * - * @test - */ - public function write() - { - $this->file->setContent('foobarbaz'); - $this->assertTrue($this->file->seek(3, SEEK_SET)); - $this->assertEquals(3, $this->file->write('foo')); - $this->assertEquals('foofoobaz', $this->file->getContent()); - $this->assertEquals(9, $this->file->size()); - $this->assertEquals(3, $this->file->write('bar')); - $this->assertEquals('foofoobar', $this->file->getContent()); - $this->assertEquals(9, $this->file->size()); - } - - /** - * setting and retrieving permissions for a file - * - * @test - * @group permissions - */ - public function permissions() - { - $this->assertEquals(0666, $this->file->getPermissions()); - $this->assertSame($this->file, $this->file->chmod(0644)); - $this->assertEquals(0644, $this->file->getPermissions()); - } - - /** - * setting and retrieving permissions for a file - * - * @test - * @group permissions - */ - public function permissionsSet() - { - $this->file = new vfsStreamFile('foo', 0644); - $this->assertEquals(0644, $this->file->getPermissions()); - $this->assertSame($this->file, $this->file->chmod(0600)); - $this->assertEquals(0600, $this->file->getPermissions()); - } - - /** - * setting and retrieving owner of a file - * - * @test - * @group permissions - */ - public function owner() - { - $this->assertEquals(vfsStream::getCurrentUser(), $this->file->getUser()); - $this->assertTrue($this->file->isOwnedByUser(vfsStream::getCurrentUser())); - $this->assertSame($this->file, $this->file->chown(vfsStream::OWNER_USER_1)); - $this->assertEquals(vfsStream::OWNER_USER_1, $this->file->getUser()); - $this->assertTrue($this->file->isOwnedByUser(vfsStream::OWNER_USER_1)); - } - - /** - * setting and retrieving owner group of a file - * - * @test - * @group permissions - */ - public function group() - { - $this->assertEquals(vfsStream::getCurrentGroup(), $this->file->getGroup()); - $this->assertTrue($this->file->isOwnedByGroup(vfsStream::getCurrentGroup())); - $this->assertSame($this->file, $this->file->chgrp(vfsStream::GROUP_USER_1)); - $this->assertEquals(vfsStream::GROUP_USER_1, $this->file->getGroup()); - $this->assertTrue($this->file->isOwnedByGroup(vfsStream::GROUP_USER_1)); - } - - /** - * @test - * @group issue_33 - * @since 1.1.0 - */ - public function truncateRemovesSuperflouosContent() - { - $this->assertEquals(11, $this->file->write("lorem ipsum")); - $this->assertTrue($this->file->truncate(5)); - $this->assertEquals(5, $this->file->size()); - $this->assertEquals('lorem', $this->file->getContent()); - } - - /** - * @test - * @group issue_33 - * @since 1.1.0 - */ - public function truncateToGreaterSizeAddsZeroBytes() - { - $this->assertEquals(11, $this->file->write("lorem ipsum")); - $this->assertTrue($this->file->truncate(25)); - $this->assertEquals(25, $this->file->size()); - $this->assertEquals("lorem ipsum\0\0\0\0\0\0\0\0\0\0\0\0\0\0", $this->file->getContent()); - } - - /** - * @test - * @group issue_79 - * @since 1.3.0 - */ - public function withContentAcceptsAnyFileContentInstance() - { - $mockFileContent = $this->bc_getMock('org\bovigo\vfs\content\FileContent'); - $mockFileContent->expects($this->once()) - ->method('content') - ->will($this->returnValue('foobarbaz')); - $this->assertEquals( - 'foobarbaz', - $this->file->withContent($mockFileContent) - ->getContent() - ); - } - - /** - * @test - * @group issue_79 - * @expectedException \InvalidArgumentException - * @since 1.3.0 - */ - public function withContentThrowsInvalidArgumentExceptionWhenContentIsNoStringAndNoFileContent() - { - $this->file->withContent(313); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamGlobTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamGlobTestCase.php deleted file mode 100644 index 2dec563..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamGlobTestCase.php +++ /dev/null @@ -1,28 +0,0 @@ -assertEmpty(glob(vfsStream::url('example'), GLOB_MARK)); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamResolveIncludePathTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamResolveIncludePathTestCase.php deleted file mode 100644 index 74fb773..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamResolveIncludePathTestCase.php +++ /dev/null @@ -1,61 +0,0 @@ -backupIncludePath = get_include_path(); - vfsStream::setup(); - mkdir('vfs://root/a/path', 0777, true); - set_include_path('vfs://root/a' . PATH_SEPARATOR . $this->backupIncludePath); - } - - /** - * clean up test environment - */ - public function tearDown() - { - set_include_path($this->backupIncludePath); - } - - /** - * @test - */ - public function knownFileCanBeResolved() - { - file_put_contents('vfs://root/a/path/knownFile.php', ''); - $this->assertEquals('vfs://root/a/path/knownFile.php', stream_resolve_include_path('path/knownFile.php')); - } - - /** - * @test - */ - public function unknownFileCanNotBeResolvedYieldsFalse() - { - $this->assertFalse(@stream_resolve_include_path('path/unknownFile.php')); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamTestCase.php deleted file mode 100644 index cc2bad7..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamTestCase.php +++ /dev/null @@ -1,780 +0,0 @@ -assertEquals('vfs://foo', vfsStream::url('foo')); - $this->assertEquals('vfs://foo/bar.baz', vfsStream::url('foo/bar.baz')); - $this->assertEquals('vfs://foo/bar.baz', vfsStream::url('foo\bar.baz')); - } - - /** - * assure that url2path conversion works correct - * - * @test - */ - public function path() - { - $this->assertEquals('foo', vfsStream::path('vfs://foo')); - $this->assertEquals('foo/bar.baz', vfsStream::path('vfs://foo/bar.baz')); - $this->assertEquals('foo/bar.baz', vfsStream::path('vfs://foo\bar.baz')); - } - - /** - * windows directory separators are converted into default separator - * - * @author Gabriel Birke - * @test - */ - public function pathConvertsWindowsDirectorySeparators() - { - $this->assertEquals('foo/bar', vfsStream::path('vfs://foo\\bar')); - } - - /** - * trailing whitespace should be removed - * - * @author Gabriel Birke - * @test - */ - public function pathRemovesTrailingWhitespace() - { - $this->assertEquals('foo/bar', vfsStream::path('vfs://foo/bar ')); - } - - /** - * trailing slashes are removed - * - * @author Gabriel Birke - * @test - */ - public function pathRemovesTrailingSlash() - { - $this->assertEquals('foo/bar', vfsStream::path('vfs://foo/bar/')); - } - - /** - * trailing slash and whitespace should be removed - * - * @author Gabriel Birke - * @test - */ - public function pathRemovesTrailingSlashAndWhitespace() - { - $this->assertEquals('foo/bar', vfsStream::path('vfs://foo/bar/ ')); - } - - /** - * double slashes should be replaced by single slash - * - * @author Gabriel Birke - * @test - */ - public function pathRemovesDoubleSlashes() - { - // Regular path - $this->assertEquals('my/path', vfsStream::path('vfs://my/path')); - // Path with double slashes - $this->assertEquals('my/path', vfsStream::path('vfs://my//path')); - } - - /** - * test to create a new file - * - * @test - */ - public function newFile() - { - $file = vfsStream::newFile('filename.txt'); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamFile', $file); - $this->assertEquals('filename.txt', $file->getName()); - $this->assertEquals(0666, $file->getPermissions()); - } - - /** - * test to create a new file with non-default permissions - * - * @test - * @group permissions - */ - public function newFileWithDifferentPermissions() - { - $file = vfsStream::newFile('filename.txt', 0644); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamFile', $file); - $this->assertEquals('filename.txt', $file->getName()); - $this->assertEquals(0644, $file->getPermissions()); - } - - /** - * test to create a new directory structure - * - * @test - */ - public function newSingleDirectory() - { - $foo = vfsStream::newDirectory('foo'); - $this->assertEquals('foo', $foo->getName()); - $this->assertEquals(0, count($foo->getChildren())); - $this->assertEquals(0777, $foo->getPermissions()); - } - - /** - * test to create a new directory structure with non-default permissions - * - * @test - * @group permissions - */ - public function newSingleDirectoryWithDifferentPermissions() - { - $foo = vfsStream::newDirectory('foo', 0755); - $this->assertEquals('foo', $foo->getName()); - $this->assertEquals(0, count($foo->getChildren())); - $this->assertEquals(0755, $foo->getPermissions()); - } - - /** - * test to create a new directory structure - * - * @test - */ - public function newDirectoryStructure() - { - $foo = vfsStream::newDirectory('foo/bar/baz'); - $this->assertEquals('foo', $foo->getName()); - $this->assertEquals(0777, $foo->getPermissions()); - $this->assertTrue($foo->hasChild('bar')); - $this->assertTrue($foo->hasChild('bar/baz')); - $this->assertFalse($foo->hasChild('baz')); - $bar = $foo->getChild('bar'); - $this->assertEquals('bar', $bar->getName()); - $this->assertEquals(0777, $bar->getPermissions()); - $this->assertTrue($bar->hasChild('baz')); - $baz1 = $bar->getChild('baz'); - $this->assertEquals('baz', $baz1->getName()); - $this->assertEquals(0777, $baz1->getPermissions()); - $baz2 = $foo->getChild('bar/baz'); - $this->assertSame($baz1, $baz2); - } - - /** - * test that correct directory structure is created - * - * @test - */ - public function newDirectoryWithSlashAtStart() - { - $foo = vfsStream::newDirectory('/foo/bar/baz', 0755); - $this->assertEquals('foo', $foo->getName()); - $this->assertEquals(0755, $foo->getPermissions()); - $this->assertTrue($foo->hasChild('bar')); - $this->assertTrue($foo->hasChild('bar/baz')); - $this->assertFalse($foo->hasChild('baz')); - $bar = $foo->getChild('bar'); - $this->assertEquals('bar', $bar->getName()); - $this->assertEquals(0755, $bar->getPermissions()); - $this->assertTrue($bar->hasChild('baz')); - $baz1 = $bar->getChild('baz'); - $this->assertEquals('baz', $baz1->getName()); - $this->assertEquals(0755, $baz1->getPermissions()); - $baz2 = $foo->getChild('bar/baz'); - $this->assertSame($baz1, $baz2); - } - - /** - * @test - * @group setup - * @since 0.7.0 - */ - public function setupRegistersStreamWrapperAndCreatesRootDirectoryWithDefaultNameAndPermissions() - { - $root = vfsStream::setup(); - $this->assertSame($root, vfsStreamWrapper::getRoot()); - $this->assertEquals('root', $root->getName()); - $this->assertEquals(0777, $root->getPermissions()); - } - - /** - * @test - * @group setup - * @since 0.7.0 - */ - public function setupRegistersStreamWrapperAndCreatesRootDirectoryWithGivenNameAndDefaultPermissions() - { - $root = vfsStream::setup('foo'); - $this->assertSame($root, vfsStreamWrapper::getRoot()); - $this->assertEquals('foo', $root->getName()); - $this->assertEquals(0777, $root->getPermissions()); - } - - /** - * @test - * @group setup - * @since 0.7.0 - */ - public function setupRegistersStreamWrapperAndCreatesRootDirectoryWithGivenNameAndPermissions() - { - $root = vfsStream::setup('foo', 0444); - $this->assertSame($root, vfsStreamWrapper::getRoot()); - $this->assertEquals('foo', $root->getName()); - $this->assertEquals(0444, $root->getPermissions()); - } - - /** - * @test - * @group issue_14 - * @group issue_20 - * @since 0.10.0 - */ - public function setupWithEmptyArrayIsEqualToSetup() - { - $root = vfsStream::setup('example', - 0755, - array() - ); - $this->assertEquals('example', $root->getName()); - $this->assertEquals(0755, $root->getPermissions()); - $this->assertFalse($root->hasChildren()); - } - - /** - * @test - * @group issue_14 - * @group issue_20 - * @since 0.10.0 - */ - public function setupArraysAreTurnedIntoSubdirectories() - { - $root = vfsStream::setup('root', - null, - array('test' => array()) - ); - $this->assertTrue($root->hasChildren()); - $this->assertTrue($root->hasChild('test')); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', - $root->getChild('test') - ); - $this->assertFalse($root->getChild('test')->hasChildren()); - } - - /** - * @test - * @group issue_14 - * @group issue_20 - * @since 0.10.0 - */ - public function setupStringsAreTurnedIntoFilesWithContent() - { - $root = vfsStream::setup('root', - null, - array('test.txt' => 'some content') - ); - $this->assertTrue($root->hasChildren()); - $this->assertTrue($root->hasChild('test.txt')); - $this->assertVfsFile($root->getChild('test.txt'), 'some content'); - } - - /** - * @test - * @group issue_14 - * @group issue_20 - * @since 0.10.0 - */ - public function setupWorksRecursively() - { - $root = vfsStream::setup('root', - null, - array('test' => array('foo' => array('test.txt' => 'hello'), - 'baz.txt' => 'world' - ) - ) - ); - $this->assertTrue($root->hasChildren()); - $this->assertTrue($root->hasChild('test')); - $test = $root->getChild('test'); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $test); - $this->assertTrue($test->hasChildren()); - $this->assertTrue($test->hasChild('baz.txt')); - $this->assertVfsFile($test->getChild('baz.txt'), 'world'); - - $this->assertTrue($test->hasChild('foo')); - $foo = $test->getChild('foo'); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $foo); - $this->assertTrue($foo->hasChildren()); - $this->assertTrue($foo->hasChild('test.txt')); - $this->assertVfsFile($foo->getChild('test.txt'), 'hello'); - } - - /** - * @test - * @group issue_17 - * @group issue_20 - */ - public function setupCastsNumericDirectoriesToStrings() - { - $root = vfsStream::setup('root', - null, - array(2011 => array ('test.txt' => 'some content')) - ); - $this->assertTrue($root->hasChild('2011')); - - $directory = $root->getChild('2011'); - $this->assertVfsFile($directory->getChild('test.txt'), 'some content'); - - $this->assertTrue(file_exists('vfs://root/2011/test.txt')); - } - - /** - * @test - * @group issue_20 - * @since 0.11.0 - */ - public function createArraysAreTurnedIntoSubdirectories() - { - $baseDir = vfsStream::create(array('test' => array()), new vfsStreamDirectory('baseDir')); - $this->assertTrue($baseDir->hasChildren()); - $this->assertTrue($baseDir->hasChild('test')); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', - $baseDir->getChild('test') - ); - $this->assertFalse($baseDir->getChild('test')->hasChildren()); - } - - /** - * @test - * @group issue_20 - * @since 0.11.0 - */ - public function createArraysAreTurnedIntoSubdirectoriesOfRoot() - { - $root = vfsStream::setup(); - $this->assertSame($root, vfsStream::create(array('test' => array()))); - $this->assertTrue($root->hasChildren()); - $this->assertTrue($root->hasChild('test')); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', - $root->getChild('test') - ); - $this->assertFalse($root->getChild('test')->hasChildren()); - } - - /** - * @test - * @group issue_20 - * @expectedException \InvalidArgumentException - * @since 0.11.0 - */ - public function createThrowsExceptionIfNoBaseDirGivenAndNoRootSet() - { - vfsStream::create(array('test' => array())); - } - - /** - * @test - * @group issue_20 - * @since 0.11.0 - */ - public function createWorksRecursively() - { - $baseDir = vfsStream::create(array('test' => array('foo' => array('test.txt' => 'hello'), - 'baz.txt' => 'world' - ) - ), - new vfsStreamDirectory('baseDir') - ); - $this->assertTrue($baseDir->hasChildren()); - $this->assertTrue($baseDir->hasChild('test')); - $test = $baseDir->getChild('test'); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $test); - $this->assertTrue($test->hasChildren()); - $this->assertTrue($test->hasChild('baz.txt')); - $this->assertVfsFile($test->getChild('baz.txt'), 'world'); - - $this->assertTrue($test->hasChild('foo')); - $foo = $test->getChild('foo'); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $foo); - $this->assertTrue($foo->hasChildren()); - $this->assertTrue($foo->hasChild('test.txt')); - $this->assertVfsFile($foo->getChild('test.txt'), 'hello'); - } - - /** - * @test - * @group issue_20 - * @since 0.11.0 - */ - public function createWorksRecursivelyWithRoot() - { - $root = vfsStream::setup(); - $this->assertSame($root, - vfsStream::create(array('test' => array('foo' => array('test.txt' => 'hello'), - 'baz.txt' => 'world' - ) - ) - ) - ); - $this->assertTrue($root->hasChildren()); - $this->assertTrue($root->hasChild('test')); - $test = $root->getChild('test'); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $test); - $this->assertTrue($test->hasChildren()); - $this->assertTrue($test->hasChild('baz.txt')); - $this->assertVfsFile($test->getChild('baz.txt'), 'world'); - - $this->assertTrue($test->hasChild('foo')); - $foo = $test->getChild('foo'); - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamDirectory', $foo); - $this->assertTrue($foo->hasChildren()); - $this->assertTrue($foo->hasChild('test.txt')); - $this->assertVfsFile($foo->getChild('test.txt'), 'hello'); - } - - /** - * @test - * @group issue_20 - * @since 0.10.0 - */ - public function createStringsAreTurnedIntoFilesWithContent() - { - $baseDir = vfsStream::create(array('test.txt' => 'some content'), new vfsStreamDirectory('baseDir')); - $this->assertTrue($baseDir->hasChildren()); - $this->assertTrue($baseDir->hasChild('test.txt')); - $this->assertVfsFile($baseDir->getChild('test.txt'), 'some content'); - } - - /** - * @test - * @group issue_20 - * @since 0.11.0 - */ - public function createStringsAreTurnedIntoFilesWithContentWithRoot() - { - $root = vfsStream::setup(); - $this->assertSame($root, - vfsStream::create(array('test.txt' => 'some content')) - ); - $this->assertTrue($root->hasChildren()); - $this->assertTrue($root->hasChild('test.txt')); - $this->assertVfsFile($root->getChild('test.txt'), 'some content'); - } - - /** - * @test - * @group issue_20 - * @since 0.11.0 - */ - public function createCastsNumericDirectoriesToStrings() - { - $baseDir = vfsStream::create(array(2011 => array ('test.txt' => 'some content')), new vfsStreamDirectory('baseDir')); - $this->assertTrue($baseDir->hasChild('2011')); - - $directory = $baseDir->getChild('2011'); - $this->assertVfsFile($directory->getChild('test.txt'), 'some content'); - } - - /** - * @test - * @group issue_20 - * @since 0.11.0 - */ - public function createCastsNumericDirectoriesToStringsWithRoot() - { - $root = vfsStream::setup(); - $this->assertSame($root, - vfsStream::create(array(2011 => array ('test.txt' => 'some content'))) - ); - $this->assertTrue($root->hasChild('2011')); - - $directory = $root->getChild('2011'); - $this->assertVfsFile($directory->getChild('test.txt'), 'some content'); - } - - /** - * helper function for assertions on vfsStreamFile - * - * @param vfsStreamFile $file - * @param string $content - */ - protected function assertVfsFile(vfsStreamFile $file, $content) - { - $this->assertInstanceOf('org\\bovigo\\vfs\\vfsStreamFile', - $file - ); - $this->assertEquals($content, - $file->getContent() - ); - } - - /** - * @test - * @group issue_10 - * @since 0.10.0 - */ - public function inspectWithContentGivesContentToVisitor() - { - $mockContent = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $mockVisitor = $this->bc_getMock('org\\bovigo\\vfs\\visitor\\vfsStreamVisitor'); - $mockVisitor->expects($this->once()) - ->method('visit') - ->with($this->equalTo($mockContent)) - ->will($this->returnValue($mockVisitor)); - $this->assertSame($mockVisitor, vfsStream::inspect($mockVisitor, $mockContent)); - } - - /** - * @test - * @group issue_10 - * @since 0.10.0 - */ - public function inspectWithoutContentGivesRootToVisitor() - { - $root = vfsStream::setup(); - $mockVisitor = $this->bc_getMock('org\\bovigo\\vfs\\visitor\\vfsStreamVisitor'); - $mockVisitor->expects($this->once()) - ->method('visitDirectory') - ->with($this->equalTo($root)) - ->will($this->returnValue($mockVisitor)); - $this->assertSame($mockVisitor, vfsStream::inspect($mockVisitor)); - } - - /** - * @test - * @group issue_10 - * @expectedException \InvalidArgumentException - * @since 0.10.0 - */ - public function inspectWithoutContentAndWithoutRootThrowsInvalidArgumentException() - { - $mockVisitor = $this->bc_getMock('org\\bovigo\\vfs\\visitor\\vfsStreamVisitor'); - $mockVisitor->expects($this->never()) - ->method('visit'); - $mockVisitor->expects($this->never()) - ->method('visitDirectory'); - vfsStream::inspect($mockVisitor); - } - - /** - * returns path to file system copy resource directory - * - * @return string - */ - protected function getFileSystemCopyDir() - { - return realpath(dirname(__FILE__) . '/../../../../resources/filesystemcopy'); - } - - /** - * @test - * @group issue_4 - * @expectedException \InvalidArgumentException - * @since 0.11.0 - */ - public function copyFromFileSystemThrowsExceptionIfNoBaseDirGivenAndNoRootSet() - { - vfsStream::copyFromFileSystem($this->getFileSystemCopyDir()); - } - - /** - * @test - * @group issue_4 - * @since 0.11.0 - */ - public function copyFromEmptyFolder() - { - $baseDir = vfsStream::copyFromFileSystem($this->getFileSystemCopyDir() . '/emptyFolder', - vfsStream::newDirectory('test') - ); - $baseDir->removeChild('.gitignore'); - $this->assertFalse($baseDir->hasChildren()); - } - - /** - * @test - * @group issue_4 - * @since 0.11.0 - */ - public function copyFromEmptyFolderWithRoot() - { - $root = vfsStream::setup(); - $this->assertEquals($root, - vfsStream::copyFromFileSystem($this->getFileSystemCopyDir() . '/emptyFolder') - ); - $root->removeChild('.gitignore'); - $this->assertFalse($root->hasChildren()); - } - - /** - * @test - * @group issue_4 - * @since 0.11.0 - */ - public function copyFromWithSubFolders() - { - $baseDir = vfsStream::copyFromFileSystem($this->getFileSystemCopyDir(), - vfsStream::newDirectory('test'), - 3 - ); - $this->assertTrue($baseDir->hasChildren()); - $this->assertTrue($baseDir->hasChild('emptyFolder')); - $this->assertTrue($baseDir->hasChild('withSubfolders')); - $subfolderDir = $baseDir->getChild('withSubfolders'); - $this->assertTrue($subfolderDir->hasChild('subfolder1')); - $this->assertTrue($subfolderDir->getChild('subfolder1')->hasChild('file1.txt')); - $this->assertVfsFile($subfolderDir->getChild('subfolder1/file1.txt'), ' '); - $this->assertTrue($subfolderDir->hasChild('subfolder2')); - $this->assertTrue($subfolderDir->hasChild('aFile.txt')); - $this->assertVfsFile($subfolderDir->getChild('aFile.txt'), 'foo'); - } - - /** - * @test - * @group issue_4 - * @since 0.11.0 - */ - public function copyFromWithSubFoldersWithRoot() - { - $root = vfsStream::setup(); - $this->assertEquals($root, - vfsStream::copyFromFileSystem($this->getFileSystemCopyDir(), - null, - 3 - ) - ); - $this->assertTrue($root->hasChildren()); - $this->assertTrue($root->hasChild('emptyFolder')); - $this->assertTrue($root->hasChild('withSubfolders')); - $subfolderDir = $root->getChild('withSubfolders'); - $this->assertTrue($subfolderDir->hasChild('subfolder1')); - $this->assertTrue($subfolderDir->getChild('subfolder1')->hasChild('file1.txt')); - $this->assertVfsFile($subfolderDir->getChild('subfolder1/file1.txt'), ' '); - $this->assertTrue($subfolderDir->hasChild('subfolder2')); - $this->assertTrue($subfolderDir->hasChild('aFile.txt')); - $this->assertVfsFile($subfolderDir->getChild('aFile.txt'), 'foo'); - } - - /** - * @test - * @group issue_4 - * @group issue_29 - * @since 0.11.2 - */ - public function copyFromPreservesFilePermissions() - { - if (DIRECTORY_SEPARATOR !== '/') { - $this->markTestSkipped('Only applicable on Linux style systems.'); - } - - $copyDir = $this->getFileSystemCopyDir(); - $root = vfsStream::setup(); - $this->assertEquals($root, - vfsStream::copyFromFileSystem($copyDir, - null - ) - ); - $this->assertEquals(fileperms($copyDir . '/withSubfolders') - vfsStreamContent::TYPE_DIR, - $root->getChild('withSubfolders') - ->getPermissions() - ); - $this->assertEquals(fileperms($copyDir . '/withSubfolders/aFile.txt') - vfsStreamContent::TYPE_FILE, - $root->getChild('withSubfolders/aFile.txt') - ->getPermissions() - ); - } - - /** - * To test this the max file size is reduced to something reproduceable. - * - * @test - * @group issue_91 - * @since 1.5.0 - */ - public function copyFromFileSystemMocksLargeFiles() - { - if (DIRECTORY_SEPARATOR !== '/') { - $this->markTestSkipped('Only applicable on Linux style systems.'); - } - - $copyDir = $this->getFileSystemCopyDir(); - $root = vfsStream::setup(); - vfsStream::copyFromFileSystem($copyDir, $root, 3); - $this->assertEquals( - ' ', - $root->getChild('withSubfolders/subfolder1/file1.txt')->getContent() - ); - } - - /** - * @test - * @group issue_121 - * @since 1.6.1 - */ - public function createDirectoryWithTrailingSlashShouldNotCreateSubdirectoryWithEmptyName() - { - $directory = vfsStream::newDirectory('foo/'); - $this->assertFalse($directory->hasChildren()); - } - - /** - * @test - * @group issue_149 - */ - public function addStructureHandlesVfsStreamFileObjects() - { - $structure = array( - 'topLevel' => array( - 'thisIsAFile' => 'file contents', - vfsStream::newFile('anotherFile'), - ), - ); - - vfsStream::setup(); - $root = vfsStream::create($structure); - - $this->assertTrue($root->hasChild('topLevel/anotherFile')); - } - - /** - * @test - * @group issue_149 - */ - public function createHandlesLargeFileContentObjects() - { - $structure = array( - 'topLevel' => array( - 'thisIsAFile' => 'file contents', - 'anotherFile' => LargeFileContent::withMegabytes(2), - ), - ); - - vfsStream::setup(); - $root = vfsStream::create($structure); - - $this->assertTrue($root->hasChild('topLevel/anotherFile')); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamUmaskTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamUmaskTestCase.php deleted file mode 100644 index 7cac13c..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamUmaskTestCase.php +++ /dev/null @@ -1,194 +0,0 @@ -assertEquals(vfsStream::umask(), - vfsStream::umask() - ); - $this->assertEquals(0000, - vfsStream::umask() - ); - } - - /** - * @test - */ - public function changingUmaskSettingReturnsOldUmaskSetting() - { - $this->assertEquals(0000, - vfsStream::umask(0022) - ); - $this->assertEquals(0022, - vfsStream::umask() - ); - } - - /** - * @test - */ - public function createFileWithDefaultUmaskSetting() - { - $file = new vfsStreamFile('foo'); - $this->assertEquals(0666, $file->getPermissions()); - } - - /** - * @test - */ - public function createFileWithDifferentUmaskSetting() - { - vfsStream::umask(0022); - $file = new vfsStreamFile('foo'); - $this->assertEquals(0644, $file->getPermissions()); - } - - /** - * @test - */ - public function createDirectoryWithDefaultUmaskSetting() - { - $directory = new vfsStreamDirectory('foo'); - $this->assertEquals(0777, $directory->getPermissions()); - } - - /** - * @test - */ - public function createDirectoryWithDifferentUmaskSetting() - { - vfsStream::umask(0022); - $directory = new vfsStreamDirectory('foo'); - $this->assertEquals(0755, $directory->getPermissions()); - } - - /** - * @test - */ - public function createFileUsingStreamWithDefaultUmaskSetting() - { - $root = vfsStream::setup(); - file_put_contents(vfsStream::url('root/newfile.txt'), 'file content'); - $this->assertEquals(0666, $root->getChild('newfile.txt')->getPermissions()); - } - - /** - * @test - */ - public function createFileUsingStreamWithDifferentUmaskSetting() - { - $root = vfsStream::setup(); - vfsStream::umask(0022); - file_put_contents(vfsStream::url('root/newfile.txt'), 'file content'); - $this->assertEquals(0644, $root->getChild('newfile.txt')->getPermissions()); - } - - /** - * @test - */ - public function createDirectoryUsingStreamWithDefaultUmaskSetting() - { - $root = vfsStream::setup(); - mkdir(vfsStream::url('root/newdir')); - $this->assertEquals(0777, $root->getChild('newdir')->getPermissions()); - } - - /** - * @test - */ - public function createDirectoryUsingStreamWithDifferentUmaskSetting() - { - $root = vfsStream::setup(); - vfsStream::umask(0022); - mkdir(vfsStream::url('root/newdir')); - $this->assertEquals(0755, $root->getChild('newdir')->getPermissions()); - } - - /** - * @test - */ - public function createDirectoryUsingStreamWithExplicit0() - { - $root = vfsStream::setup(); - vfsStream::umask(0022); - mkdir(vfsStream::url('root/newdir'), null); - $this->assertEquals(0000, $root->getChild('newdir')->getPermissions()); - } - - /** - * @test - * - */ - public function createDirectoryUsingStreamWithDifferentUmaskSettingButExplicit0777() - { - $root = vfsStream::setup(); - vfsStream::umask(0022); - mkdir(vfsStream::url('root/newdir'), 0777); - $this->assertEquals(0755, $root->getChild('newdir')->getPermissions()); - } - - /** - * @test - */ - public function createDirectoryUsingStreamWithDifferentUmaskSettingButExplicitModeRequestedByCall() - { - $root = vfsStream::setup(); - vfsStream::umask(0022); - mkdir(vfsStream::url('root/newdir'), 0700); - $this->assertEquals(0700, $root->getChild('newdir')->getPermissions()); - } - - /** - * @test - */ - public function defaultUmaskSettingDoesNotInfluenceSetup() - { - $root = vfsStream::setup(); - $this->assertEquals(0777, $root->getPermissions()); - } - - /** - * @test - */ - public function umaskSettingShouldBeRespectedBySetup() - { - vfsStream::umask(0022); - $root = vfsStream::setup(); - $this->assertEquals(0755, $root->getPermissions()); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperAlreadyRegisteredTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperAlreadyRegisteredTestCase.php deleted file mode 100644 index 279a2ce..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperAlreadyRegisteredTestCase.php +++ /dev/null @@ -1,62 +0,0 @@ -bc_getMock('org\\bovigo\\vfs\\vfsStreamWrapper'); - stream_wrapper_register(vfsStream::SCHEME, get_class($mock)); - } - - /** - * clean up test environment - */ - public function tearDown() - { - TestvfsStreamWrapper::unregister(); - } - - /** - * registering the stream wrapper when another stream wrapper is already - * registered for the vfs scheme should throw an exception - * - * @test - * @expectedException org\bovigo\vfs\vfsStreamException - */ - public function registerOverAnotherStreamWrapper() - { - vfsStreamWrapper::register(); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperBaseTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperBaseTestCase.php deleted file mode 100644 index 4c12a45..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperBaseTestCase.php +++ /dev/null @@ -1,98 +0,0 @@ -fooURL = vfsStream::url('foo'); - $this->barURL = vfsStream::url('foo/bar'); - $this->baz1URL = vfsStream::url('foo/bar/baz1'); - $this->baz2URL = vfsStream::url('foo/baz2'); - $this->foo = new vfsStreamDirectory('foo'); - $this->bar = new vfsStreamDirectory('bar'); - $this->baz1 = vfsStream::newFile('baz1') - ->lastModified(300) - ->lastAccessed(300) - ->lastAttributeModified(300) - ->withContent('baz 1'); - $this->baz2 = vfsStream::newFile('baz2') - ->withContent('baz2') - ->lastModified(400) - ->lastAccessed(400) - ->lastAttributeModified(400); - $this->bar->addChild($this->baz1); - $this->foo->addChild($this->bar); - $this->foo->addChild($this->baz2); - $this->foo->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - $this->bar->lastModified(200) - ->lastAccessed(100) - ->lastAttributeModified(100); - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot($this->foo); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperDirSeparatorTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperDirSeparatorTestCase.php deleted file mode 100644 index 35fc0ce..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperDirSeparatorTestCase.php +++ /dev/null @@ -1,72 +0,0 @@ -root = vfsStream::setup(); - } - - /** - * @test - */ - public function fileCanBeAccessedUsingWinDirSeparator() - { - vfsStream::newFile('foo/bar/baz.txt') - ->at($this->root) - ->withContent('test'); - $this->assertEquals('test', file_get_contents('vfs://root/foo\bar\baz.txt')); - } - - - /** - * @test - */ - public function directoryCanBeCreatedUsingWinDirSeparator() - { - mkdir('vfs://root/dir\bar\foo', true, 0777); - $this->assertTrue($this->root->hasChild('dir')); - $this->assertTrue($this->root->getChild('dir')->hasChild('bar')); - $this->assertTrue($this->root->getChild('dir/bar')->hasChild('foo')); - } - - /** - * @test - */ - public function directoryExitsTestUsingTrailingWinDirSeparator() - { - $structure = array( - 'dir' => array( - 'bar' => array( - ) - ) - ); - vfsStream::create($structure, $this->root); - - $this->assertTrue(file_exists(vfsStream::url('root/').'dir\\')); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperDirTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperDirTestCase.php deleted file mode 100644 index 5f840c4..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperDirTestCase.php +++ /dev/null @@ -1,500 +0,0 @@ -assertFalse(mkdir(vfsStream::url('another'))); - $this->assertEquals(2, count($this->foo->getChildren())); - $this->assertSame($this->foo, vfsStreamWrapper::getRoot()); - } - - /** - * mkdir() should not overwrite existing root - * - * @test - */ - public function mkdirNoNewRootRecursively() - { - $this->assertFalse(mkdir(vfsStream::url('another/more'), 0777, true)); - $this->assertEquals(2, count($this->foo->getChildren())); - $this->assertSame($this->foo, vfsStreamWrapper::getRoot()); - } - - /** - * assert that mkdir() creates the correct directory structure - * - * @test - * @group permissions - */ - public function mkdirNonRecursively() - { - $this->assertFalse(mkdir($this->barURL . '/another/more')); - $this->assertEquals(2, count($this->foo->getChildren())); - $this->assertTrue(mkdir($this->fooURL . '/another')); - $this->assertEquals(3, count($this->foo->getChildren())); - $this->assertEquals(0777, $this->foo->getChild('another')->getPermissions()); - } - - /** - * assert that mkdir() creates the correct directory structure - * - * @test - * @group permissions - */ - public function mkdirRecursively() - { - $this->assertTrue(mkdir($this->fooURL . '/another/more', 0777, true)); - $this->assertEquals(3, count($this->foo->getChildren())); - $another = $this->foo->getChild('another'); - $this->assertTrue($another->hasChild('more')); - $this->assertEquals(0777, $this->foo->getChild('another')->getPermissions()); - $this->assertEquals(0777, $this->foo->getChild('another')->getChild('more')->getPermissions()); - } - - /** - * @test - * @group issue_9 - * @since 0.9.0 - */ - public function mkdirWithDots() - { - $this->assertTrue(mkdir($this->fooURL . '/another/../more/.', 0777, true)); - $this->assertEquals(3, count($this->foo->getChildren())); - $this->assertTrue($this->foo->hasChild('more')); - } - - /** - * no root > new directory becomes root - * - * @test - * @group permissions - */ - public function mkdirWithoutRootCreatesNewRoot() - { - vfsStreamWrapper::register(); - $this->assertTrue(@mkdir(vfsStream::url('foo'))); - $this->assertEquals(vfsStreamContent::TYPE_DIR, vfsStreamWrapper::getRoot()->getType()); - $this->assertEquals('foo', vfsStreamWrapper::getRoot()->getName()); - $this->assertEquals(0777, vfsStreamWrapper::getRoot()->getPermissions()); - } - - /** - * trying to create a subdirectory of a file should not work - * - * @test - */ - public function mkdirOnFileReturnsFalse() - { - $this->assertFalse(mkdir($this->baz1URL . '/another/more', 0777, true)); - } - - /** - * assert that mkdir() creates the correct directory structure - * - * @test - * @group permissions - */ - public function mkdirNonRecursivelyDifferentPermissions() - { - $this->assertTrue(mkdir($this->fooURL . '/another', 0755)); - $this->assertEquals(0755, $this->foo->getChild('another')->getPermissions()); - } - - /** - * assert that mkdir() creates the correct directory structure - * - * @test - * @group permissions - */ - public function mkdirRecursivelyDifferentPermissions() - { - $this->assertTrue(mkdir($this->fooURL . '/another/more', 0755, true)); - $this->assertEquals(3, count($this->foo->getChildren())); - $another = $this->foo->getChild('another'); - $this->assertTrue($another->hasChild('more')); - $this->assertEquals(0755, $this->foo->getChild('another')->getPermissions()); - $this->assertEquals(0755, $this->foo->getChild('another')->getChild('more')->getPermissions()); - } - - /** - * assert that mkdir() creates the correct directory structure - * - * @test - * @group permissions - */ - public function mkdirRecursivelyUsesDefaultPermissions() - { - $this->foo->chmod(0700); - $this->assertTrue(mkdir($this->fooURL . '/another/more', 0777, true)); - $this->assertEquals(3, count($this->foo->getChildren())); - $another = $this->foo->getChild('another'); - $this->assertTrue($another->hasChild('more')); - $this->assertEquals(0777, $this->foo->getChild('another')->getPermissions()); - $this->assertEquals(0777, $this->foo->getChild('another')->getChild('more')->getPermissions()); - } - - /** - * no root > new directory becomes root - * - * @test - * @group permissions - */ - public function mkdirWithoutRootCreatesNewRootDifferentPermissions() - { - vfsStreamWrapper::register(); - $this->assertTrue(@mkdir(vfsStream::url('foo'), 0755)); - $this->assertEquals(vfsStreamContent::TYPE_DIR, vfsStreamWrapper::getRoot()->getType()); - $this->assertEquals('foo', vfsStreamWrapper::getRoot()->getName()); - $this->assertEquals(0755, vfsStreamWrapper::getRoot()->getPermissions()); - } - - /** - * no root > new directory becomes root - * - * @test - * @group permissions - */ - public function mkdirWithoutRootCreatesNewRootWithDefaultPermissions() - { - vfsStreamWrapper::register(); - $this->assertTrue(@mkdir(vfsStream::url('foo'))); - $this->assertEquals(vfsStreamContent::TYPE_DIR, vfsStreamWrapper::getRoot()->getType()); - $this->assertEquals('foo', vfsStreamWrapper::getRoot()->getName()); - $this->assertEquals(0777, vfsStreamWrapper::getRoot()->getPermissions()); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function mkdirDirCanNotCreateNewDirInNonWritingDirectory() - { - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot(new vfsStreamDirectory('root')); - vfsStreamWrapper::getRoot()->addChild(new vfsStreamDirectory('restrictedFolder', 0000)); - $this->assertFalse(is_writable(vfsStream::url('root/restrictedFolder/'))); - $this->assertFalse(mkdir(vfsStream::url('root/restrictedFolder/newFolder'))); - $this->assertFalse(vfsStreamWrapper::getRoot()->hasChild('restrictedFolder/newFolder')); - } - - /** - * @test - * @group issue_28 - */ - public function mkDirShouldNotOverwriteExistingDirectories() - { - vfsStream::setup('root'); - $dir = vfsStream::url('root/dir'); - $this->assertTrue(mkdir($dir)); - $this->assertFalse(@mkdir($dir)); - } - - /** - * @test - * @group issue_28 - * @expectedException PHPUnit_Framework_Error - * @expectedExceptionMessage mkdir(): Path vfs://root/dir exists - */ - public function mkDirShouldNotOverwriteExistingDirectoriesAndTriggerE_USER_WARNING() - { - vfsStream::setup('root'); - $dir = vfsStream::url('root/dir'); - $this->assertTrue(mkdir($dir)); - $this->assertFalse(mkdir($dir)); - } - - /** - * @test - * @group issue_28 - */ - public function mkDirShouldNotOverwriteExistingFiles() - { - $root = vfsStream::setup('root'); - vfsStream::newFile('test.txt')->at($root); - $this->assertFalse(@mkdir(vfsStream::url('root/test.txt'))); - } - - /** - * @test - * @group issue_28 - * @expectedException PHPUnit_Framework_Error - * @expectedExceptionMessage mkdir(): Path vfs://root/test.txt exists - */ - public function mkDirShouldNotOverwriteExistingFilesAndTriggerE_USER_WARNING() - { - $root = vfsStream::setup('root'); - vfsStream::newFile('test.txt')->at($root); - $this->assertFalse(mkdir(vfsStream::url('root/test.txt'))); - } - - /** - * @test - * @group issue_131 - * @since 1.6.3 - */ - public function allowsRecursiveMkDirWithDirectoryName0() - { - vfsStream::setup('root'); - $subdir = vfsStream::url('root/a/0'); - mkdir($subdir, 0777, true); - $this->assertFileExists($subdir); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function canNotIterateOverNonReadableDirectory() - { - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0000)); - $this->assertFalse(@opendir(vfsStream::url('root'))); - $this->assertFalse(@dir(vfsStream::url('root'))); - } - - /** - * assert is_dir() returns correct result - * - * @test - */ - public function is_dir() - { - $this->assertTrue(is_dir($this->fooURL)); - $this->assertTrue(is_dir($this->fooURL . '/.')); - $this->assertTrue(is_dir($this->barURL)); - $this->assertTrue(is_dir($this->barURL . '/.')); - $this->assertFalse(is_dir($this->baz1URL)); - $this->assertFalse(is_dir($this->baz2URL)); - $this->assertFalse(is_dir($this->fooURL . '/another')); - $this->assertFalse(is_dir(vfsStream::url('another'))); - } - - /** - * can not unlink without root - * - * @test - */ - public function canNotUnlinkDirectoryWithoutRoot() - { - vfsStreamWrapper::register(); - $this->assertFalse(@rmdir(vfsStream::url('foo'))); - } - - /** - * rmdir() can not remove files - * - * @test - */ - public function rmdirCanNotRemoveFiles() - { - $this->assertFalse(rmdir($this->baz1URL)); - $this->assertFalse(rmdir($this->baz2URL)); - } - - /** - * rmdir() can not remove a non-existing directory - * - * @test - */ - public function rmdirCanNotRemoveNonExistingDirectory() - { - $this->assertFalse(rmdir($this->fooURL . '/another')); - } - - /** - * rmdir() can not remove non-empty directories - * - * @test - */ - public function rmdirCanNotRemoveNonEmptyDirectory() - { - $this->assertFalse(rmdir($this->fooURL)); - $this->assertFalse(rmdir($this->barURL)); - } - - /** - * @test - */ - public function rmdirCanRemoveEmptyDirectory() - { - vfsStream::newDirectory('empty')->at($this->foo); - $this->assertTrue($this->foo->hasChild('empty')); - $this->assertTrue(rmdir($this->fooURL . '/empty')); - $this->assertFalse($this->foo->hasChild('empty')); - } - - /** - * @test - */ - public function rmdirCanRemoveEmptyDirectoryWithDot() - { - vfsStream::newDirectory('empty')->at($this->foo); - $this->assertTrue($this->foo->hasChild('empty')); - $this->assertTrue(rmdir($this->fooURL . '/empty/.')); - $this->assertFalse($this->foo->hasChild('empty')); - } - - /** - * rmdir() can remove empty directories - * - * @test - */ - public function rmdirCanRemoveEmptyRoot() - { - $this->foo->removeChild('bar'); - $this->foo->removeChild('baz2'); - $this->assertTrue(rmdir($this->fooURL)); - $this->assertFalse(file_exists($this->fooURL)); // make sure statcache was cleared - $this->assertNull(vfsStreamWrapper::getRoot()); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function rmdirDirCanNotRemoveDirFromNonWritingDirectory() - { - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0000)); - vfsStreamWrapper::getRoot()->addChild(new vfsStreamDirectory('nonRemovableFolder')); - $this->assertFalse(is_writable(vfsStream::url('root'))); - $this->assertFalse(rmdir(vfsStream::url('root/nonRemovableFolder'))); - $this->assertTrue(vfsStreamWrapper::getRoot()->hasChild('nonRemovableFolder')); - } - - /** - * @test - * @group permissions - * @group bug_17 - */ - public function issue17() - { - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0770)); - vfsStreamWrapper::getRoot()->chgrp(vfsStream::GROUP_USER_1) - ->chown(vfsStream::OWNER_USER_1); - $this->assertFalse(mkdir(vfsStream::url('root/doesNotWork'))); - $this->assertFalse(vfsStreamWrapper::getRoot()->hasChild('doesNotWork')); - } - - /** - * @test - * @group bug_19 - */ - public function accessWithDoubleDotReturnsCorrectContent() - { - $this->assertEquals('baz2', - file_get_contents(vfsStream::url('foo/bar/../baz2')) - ); - } - - /** - * @test - * @group bug_115 - */ - public function accessWithExcessDoubleDotsReturnsCorrectContent() - { - $this->assertEquals('baz2', - file_get_contents(vfsStream::url('foo/../../../../bar/../baz2')) - ); - } - - /** - * @test - * @group bug_115 - */ - public function alwaysResolvesRootDirectoryAsOwnParentWithDoubleDot() - { - vfsStreamWrapper::getRoot()->chown(vfsStream::OWNER_USER_1); - - $this->assertTrue(is_dir(vfsStream::url('foo/..'))); - $stat = stat(vfsStream::url('foo/..')); - $this->assertEquals( - vfsStream::OWNER_USER_1, - $stat['uid'] - ); - } - - - /** - * @test - * @since 0.11.0 - * @group issue_23 - */ - public function unlinkCanNotRemoveNonEmptyDirectory() - { - try { - $this->assertFalse(unlink($this->barURL)); - } catch (\PHPUnit_Framework_Error $fe) { - $this->assertEquals('unlink(vfs://foo/bar): Operation not permitted', $fe->getMessage()); - } - - $this->assertTrue($this->foo->hasChild('bar')); - $this->assertFileExists($this->barURL); - } - - /** - * @test - * @since 0.11.0 - * @group issue_23 - */ - public function unlinkCanNotRemoveEmptyDirectory() - { - vfsStream::newDirectory('empty')->at($this->foo); - try { - $this->assertTrue(unlink($this->fooURL . '/empty')); - } catch (\PHPUnit_Framework_Error $fe) { - $this->assertEquals('unlink(vfs://foo/empty): Operation not permitted', $fe->getMessage()); - } - - $this->assertTrue($this->foo->hasChild('empty')); - $this->assertFileExists($this->fooURL . '/empty'); - } - - /** - * @test - * @group issue_32 - */ - public function canCreateFolderOfSameNameAsParentFolder() - { - $root = vfsStream::setup('testFolder'); - mkdir(vfsStream::url('testFolder') . '/testFolder/subTestFolder', 0777, true); - $this->assertTrue(file_exists(vfsStream::url('testFolder/testFolder/subTestFolder/.'))); - } - - /** - * @test - * @group issue_32 - */ - public function canRetrieveFolderOfSameNameAsParentFolder() - { - $root = vfsStream::setup('testFolder'); - mkdir(vfsStream::url('testFolder') . '/testFolder/subTestFolder', 0777, true); - $this->assertTrue($root->hasChild('testFolder')); - $this->assertNotNull($root->getChild('testFolder')); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFileTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFileTestCase.php deleted file mode 100644 index 3ac9fb8..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFileTestCase.php +++ /dev/null @@ -1,457 +0,0 @@ -assertEquals('baz2', file_get_contents($this->baz2URL)); - $this->assertEquals('baz 1', file_get_contents($this->baz1URL)); - $this->assertFalse(@file_get_contents($this->barURL)); - $this->assertFalse(@file_get_contents($this->fooURL)); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function file_get_contentsNonReadableFile() - { - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot(new vfsStreamDirectory('root')); - vfsStream::newFile('new.txt', 0000)->at(vfsStreamWrapper::getRoot())->withContent('content'); - $this->assertEquals('', @file_get_contents(vfsStream::url('root/new.txt'))); - } - - /** - * assert that file_put_contents() delivers correct file contents - * - * @test - */ - public function file_put_contentsExistingFile() - { - $this->assertEquals(14, file_put_contents($this->baz2URL, 'baz is not bar')); - $this->assertEquals('baz is not bar', $this->baz2->getContent()); - $this->assertEquals(6, file_put_contents($this->baz1URL, 'foobar')); - $this->assertEquals('foobar', $this->baz1->getContent()); - $this->assertFalse(@file_put_contents($this->barURL, 'This does not work.')); - $this->assertFalse(@file_put_contents($this->fooURL, 'This does not work, too.')); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function file_put_contentsExistingFileNonWritableDirectory() - { - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0000)); - vfsStream::newFile('new.txt')->at(vfsStreamWrapper::getRoot())->withContent('content'); - $this->assertEquals(15, @file_put_contents(vfsStream::url('root/new.txt'), 'This does work.')); - $this->assertEquals('This does work.', file_get_contents(vfsStream::url('root/new.txt'))); - - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function file_put_contentsExistingNonWritableFile() - { - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot(new vfsStreamDirectory('root')); - vfsStream::newFile('new.txt', 0400)->at(vfsStreamWrapper::getRoot())->withContent('content'); - $this->assertFalse(@file_put_contents(vfsStream::url('root/new.txt'), 'This does not work.')); - $this->assertEquals('content', file_get_contents(vfsStream::url('root/new.txt'))); - } - - /** - * assert that file_put_contents() delivers correct file contents - * - * @test - */ - public function file_put_contentsNonExistingFile() - { - $this->assertEquals(14, file_put_contents($this->fooURL . '/baznot.bar', 'baz is not bar')); - $this->assertEquals(3, count($this->foo->getChildren())); - $this->assertEquals(14, file_put_contents($this->barURL . '/baznot.bar', 'baz is not bar')); - $this->assertEquals(2, count($this->bar->getChildren())); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function file_put_contentsNonExistingFileNonWritableDirectory() - { - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0000)); - $this->assertFalse(@file_put_contents(vfsStream::url('root/new.txt'), 'This does not work.')); - $this->assertFalse(file_exists(vfsStream::url('root/new.txt'))); - - } - - /** - * using a file pointer should work without any problems - * - * @test - */ - public function usingFilePointer() - { - $fp = fopen($this->baz1URL, 'r'); - $this->assertEquals(0, ftell($fp)); - $this->assertFalse(feof($fp)); - $this->assertEquals(0, fseek($fp, 2)); - $this->assertEquals(2, ftell($fp)); - $this->assertEquals(0, fseek($fp, 1, SEEK_CUR)); - $this->assertEquals(3, ftell($fp)); - $this->assertEquals(0, fseek($fp, 1, SEEK_END)); - $this->assertEquals(6, ftell($fp)); - $this->assertTrue(feof($fp)); - $this->assertEquals(0, fseek($fp, 2)); - $this->assertFalse(feof($fp)); - $this->assertEquals(2, ftell($fp)); - $this->assertEquals('z', fread($fp, 1)); - $this->assertEquals(3, ftell($fp)); - $this->assertEquals(' 1', fread($fp, 8092)); - $this->assertEquals(5, ftell($fp)); - $this->assertTrue(fclose($fp)); - } - - /** - * assert is_file() returns correct result - * - * @test - */ - public function is_file() - { - $this->assertFalse(is_file($this->fooURL)); - $this->assertFalse(is_file($this->barURL)); - $this->assertTrue(is_file($this->baz1URL)); - $this->assertTrue(is_file($this->baz2URL)); - $this->assertFalse(is_file($this->fooURL . '/another')); - $this->assertFalse(is_file(vfsStream::url('another'))); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function issue13CanNotOverwriteFiles() - { - $vfsFile = vfsStream::url('foo/overwrite.txt'); - file_put_contents($vfsFile, 'test'); - file_put_contents($vfsFile, 'd'); - $this->assertEquals('d', file_get_contents($vfsFile)); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function appendContentIfOpenedWithModeA() - { - $vfsFile = vfsStream::url('foo/overwrite.txt'); - file_put_contents($vfsFile, 'test'); - $fp = fopen($vfsFile, 'ab'); - fwrite($fp, 'd'); - fclose($fp); - $this->assertEquals('testd', file_get_contents($vfsFile)); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function canOverwriteNonExistingFileWithModeX() - { - $vfsFile = vfsStream::url('foo/overwrite.txt'); - $fp = fopen($vfsFile, 'xb'); - fwrite($fp, 'test'); - fclose($fp); - $this->assertEquals('test', file_get_contents($vfsFile)); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function canNotOverwriteExistingFileWithModeX() - { - $vfsFile = vfsStream::url('foo/overwrite.txt'); - file_put_contents($vfsFile, 'test'); - $this->assertFalse(@fopen($vfsFile, 'xb')); - $this->assertEquals('test', file_get_contents($vfsFile)); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function canNotOpenNonExistingFileReadonly() - { - $this->assertFalse(@fopen(vfsStream::url('foo/doesNotExist.txt'), 'rb')); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function canNotOpenNonExistingFileReadAndWrite() - { - $this->assertFalse(@fopen(vfsStream::url('foo/doesNotExist.txt'), 'rb+')); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function canNotOpenWithIllegalMode() - { - $this->assertFalse(@fopen($this->baz2URL, 'invalid')); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function canNotWriteToReadOnlyFile() - { - $fp = fopen($this->baz2URL, 'rb'); - $this->assertEquals('baz2', fread($fp, 4096)); - $this->assertEquals(0, fwrite($fp, 'foo')); - fclose($fp); - $this->assertEquals('baz2', file_get_contents($this->baz2URL)); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function canNotReadFromWriteOnlyFileWithModeW() - { - $fp = fopen($this->baz2URL, 'wb'); - $this->assertEquals('', fread($fp, 4096)); - $this->assertEquals(3, fwrite($fp, 'foo')); - fseek($fp, 0); - $this->assertEquals('', fread($fp, 4096)); - fclose($fp); - $this->assertEquals('foo', file_get_contents($this->baz2URL)); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function canNotReadFromWriteOnlyFileWithModeA() - { - $fp = fopen($this->baz2URL, 'ab'); - $this->assertEquals('', fread($fp, 4096)); - $this->assertEquals(3, fwrite($fp, 'foo')); - fseek($fp, 0); - $this->assertEquals('', fread($fp, 4096)); - fclose($fp); - $this->assertEquals('baz2foo', file_get_contents($this->baz2URL)); - } - - /** - * @test - * @group issue7 - * @group issue13 - */ - public function canNotReadFromWriteOnlyFileWithModeX() - { - $vfsFile = vfsStream::url('foo/modeXtest.txt'); - $fp = fopen($vfsFile, 'xb'); - $this->assertEquals('', fread($fp, 4096)); - $this->assertEquals(3, fwrite($fp, 'foo')); - fseek($fp, 0); - $this->assertEquals('', fread($fp, 4096)); - fclose($fp); - $this->assertEquals('foo', file_get_contents($vfsFile)); - } - - /** - * @test - * @group permissions - * @group bug_15 - */ - public function canNotRemoveFileFromDirectoryWithoutWritePermissions() - { - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot(new vfsStreamDirectory('root', 0000)); - vfsStream::newFile('new.txt')->at(vfsStreamWrapper::getRoot()); - $this->assertFalse(unlink(vfsStream::url('root/new.txt'))); - $this->assertTrue(file_exists(vfsStream::url('root/new.txt'))); - } - - /** - * @test - * @group issue_30 - */ - public function truncatesFileWhenOpenedWithModeW() - { - $vfsFile = vfsStream::url('foo/overwrite.txt'); - file_put_contents($vfsFile, 'test'); - $fp = fopen($vfsFile, 'wb'); - $this->assertEquals('', file_get_contents($vfsFile)); - fclose($fp); - } - - /** - * @test - * @group issue_30 - */ - public function createsNonExistingFileWhenOpenedWithModeC() - { - $vfsFile = vfsStream::url('foo/tobecreated.txt'); - $fp = fopen($vfsFile, 'cb'); - fwrite($fp, 'some content'); - $this->assertTrue($this->foo->hasChild('tobecreated.txt')); - fclose($fp); - $this->assertEquals('some content', file_get_contents($vfsFile)); - } - - /** - * @test - * @group issue_30 - */ - public function createsNonExistingFileWhenOpenedWithModeCplus() - { - $vfsFile = vfsStream::url('foo/tobecreated.txt'); - $fp = fopen($vfsFile, 'cb+'); - fwrite($fp, 'some content'); - $this->assertTrue($this->foo->hasChild('tobecreated.txt')); - fclose($fp); - $this->assertEquals('some content', file_get_contents($vfsFile)); - } - - /** - * @test - * @group issue_30 - */ - public function doesNotTruncateFileWhenOpenedWithModeC() - { - $vfsFile = vfsStream::url('foo/overwrite.txt'); - file_put_contents($vfsFile, 'test'); - $fp = fopen($vfsFile, 'cb'); - $this->assertEquals('test', file_get_contents($vfsFile)); - fclose($fp); - } - - /** - * @test - * @group issue_30 - */ - public function setsPointerToStartWhenOpenedWithModeC() - { - $vfsFile = vfsStream::url('foo/overwrite.txt'); - file_put_contents($vfsFile, 'test'); - $fp = fopen($vfsFile, 'cb'); - $this->assertEquals(0, ftell($fp)); - fclose($fp); - } - - /** - * @test - * @group issue_30 - */ - public function doesNotTruncateFileWhenOpenedWithModeCplus() - { - $vfsFile = vfsStream::url('foo/overwrite.txt'); - file_put_contents($vfsFile, 'test'); - $fp = fopen($vfsFile, 'cb+'); - $this->assertEquals('test', file_get_contents($vfsFile)); - fclose($fp); - } - - /** - * @test - * @group issue_30 - */ - public function setsPointerToStartWhenOpenedWithModeCplus() - { - $vfsFile = vfsStream::url('foo/overwrite.txt'); - file_put_contents($vfsFile, 'test'); - $fp = fopen($vfsFile, 'cb+'); - $this->assertEquals(0, ftell($fp)); - fclose($fp); - } - - /** - * @test - */ - public function cannotOpenExistingNonwritableFileWithModeA() - { - $this->baz1->chmod(0400); - $this->assertFalse(@fopen($this->baz1URL, 'a')); - } - - /** - * @test - */ - public function cannotOpenExistingNonwritableFileWithModeW() - { - $this->baz1->chmod(0400); - $this->assertFalse(@fopen($this->baz1URL, 'w')); - } - - /** - * @test - */ - public function cannotOpenNonReadableFileWithModeR() - { - $this->baz1->chmod(0); - $this->assertFalse(@fopen($this->baz1URL, 'r')); - } - - /** - * @test - */ - public function cannotRenameToNonWritableDir() - { - $this->bar->chmod(0); - $this->assertFalse(@rename($this->baz2URL, vfsStream::url('foo/bar/baz3'))); - } - - /** - * @test - * @group issue_38 - */ - public function cannotReadFileFromNonReadableDir() - { - $this->markTestSkipped("Issue #38."); - $this->bar->chmod(0); - $this->assertFalse(@file_get_contents($this->baz1URL)); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFileTimesTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFileTimesTestCase.php deleted file mode 100644 index cd3ea22..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFileTimesTestCase.php +++ /dev/null @@ -1,314 +0,0 @@ -lastModified(50) - ->lastAccessed(50) - ->lastAttributeModified(50); - $this->fooUrl = vfsStream::url('root/foo.txt'); - $this->barUrl = vfsStream::url('root/bar'); - $this->bazUrl = vfsStream::url('root/bar/baz.txt'); - } - - /** - * helper assertion for the tests - * - * @param string $url url to check - * @param vfsStreamContent $content content to compare - */ - protected function assertFileTimesEqualStreamTimes($url, vfsStreamContent $content) - { - $this->assertEquals(filemtime($url), $content->filemtime()); - $this->assertEquals(fileatime($url), $content->fileatime()); - $this->assertEquals(filectime($url), $content->filectime()); - } - - /** - * @test - * @group issue_7 - * @group issue_26 - */ - public function openFileChangesAttributeTimeOnly() - { - $file = vfsStream::newFile('foo.txt') - ->withContent('test') - ->at(vfsStreamWrapper::getRoot()) - ->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - fclose(fopen($this->fooUrl, 'rb')); - $this->assertGreaterThan(time() - 2, fileatime($this->fooUrl)); - $this->assertLessThanOrEqual(time(), fileatime($this->fooUrl)); - $this->assertLessThanOrEqual(100, filemtime($this->fooUrl)); - $this->assertEquals(100, filectime($this->fooUrl)); - $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file); - } - - /** - * @test - * @group issue_7 - * @group issue_26 - */ - public function fileGetContentsChangesAttributeTimeOnly() - { - $file = vfsStream::newFile('foo.txt') - ->withContent('test') - ->at(vfsStreamWrapper::getRoot()) - ->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - file_get_contents($this->fooUrl); - $this->assertGreaterThan(time() - 2, fileatime($this->fooUrl)); - $this->assertLessThanOrEqual(time(), fileatime($this->fooUrl)); - $this->assertLessThanOrEqual(100, filemtime($this->fooUrl)); - $this->assertEquals(100, filectime($this->fooUrl)); - $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file); - } - - /** - * @test - * @group issue_7 - * @group issue_26 - */ - public function openFileWithTruncateChangesAttributeAndModificationTime() - { - $file = vfsStream::newFile('foo.txt') - ->withContent('test') - ->at(vfsStreamWrapper::getRoot()) - ->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - fclose(fopen($this->fooUrl, 'wb')); - $this->assertGreaterThan(time() - 2, filemtime($this->fooUrl)); - $this->assertGreaterThan(time() - 2, fileatime($this->fooUrl)); - $this->assertLessThanOrEqual(time(), filemtime($this->fooUrl)); - $this->assertLessThanOrEqual(time(), fileatime($this->fooUrl)); - $this->assertEquals(100, filectime($this->fooUrl)); - $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file); - } - - /** - * @test - * @group issue_7 - */ - public function readFileChangesAccessTime() - { - $file = vfsStream::newFile('foo.txt') - ->withContent('test') - ->at(vfsStreamWrapper::getRoot()) - ->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - $fp = fopen($this->fooUrl, 'rb'); - $openTime = time(); - sleep(2); - fread($fp, 1024); - fclose($fp); - $this->assertLessThanOrEqual($openTime, filemtime($this->fooUrl)); - $this->assertLessThanOrEqual($openTime + 3, fileatime($this->fooUrl)); - $this->assertEquals(100, filectime($this->fooUrl)); - $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file); - } - - /** - * @test - * @group issue_7 - */ - public function writeFileChangesModificationTime() - { - $file = vfsStream::newFile('foo.txt') - ->at(vfsStreamWrapper::getRoot()) - ->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - $fp = fopen($this->fooUrl, 'wb'); - $openTime = time(); - sleep(2); - fwrite($fp, 'test'); - fclose($fp); - $this->assertLessThanOrEqual($openTime + 3, filemtime($this->fooUrl)); - $this->assertLessThanOrEqual($openTime, fileatime($this->fooUrl)); - $this->assertEquals(100, filectime($this->fooUrl)); - $this->assertFileTimesEqualStreamTimes($this->fooUrl, $file); - - } - - /** - * @test - * @group issue_7 - */ - public function createNewFileSetsAllTimesToCurrentTime() - { - file_put_contents($this->fooUrl, 'test'); - $this->assertLessThanOrEqual(time(), filemtime($this->fooUrl)); - $this->assertEquals(fileatime($this->fooUrl), filectime($this->fooUrl)); - $this->assertEquals(fileatime($this->fooUrl), filemtime($this->fooUrl)); - $this->assertFileTimesEqualStreamTimes($this->fooUrl, vfsStreamWrapper::getRoot()->getChild('foo.txt')); - } - - /** - * @test - * @group issue_7 - */ - public function createNewFileChangesAttributeAndModificationTimeOfContainingDirectory() - { - $dir = vfsStream::newDirectory('bar') - ->at(vfsStreamWrapper::getRoot()) - ->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - file_put_contents($this->bazUrl, 'test'); - $this->assertLessThanOrEqual(time(), filemtime($this->barUrl)); - $this->assertLessThanOrEqual(time(), filectime($this->barUrl)); - $this->assertEquals(100, fileatime($this->barUrl)); - $this->assertFileTimesEqualStreamTimes($this->barUrl, $dir); - } - - /** - * @test - * @group issue_7 - */ - public function addNewFileNameWithLinkFunctionChangesAttributeTimeOfOriginalFile() - { - $this->markTestSkipped('Links are currently not supported by vfsStream.'); - } - - /** - * @test - * @group issue_7 - */ - public function addNewFileNameWithLinkFunctionChangesAttributeAndModificationTimeOfDirectoryContainingLink() - { - $this->markTestSkipped('Links are currently not supported by vfsStream.'); - } - - /** - * @test - * @group issue_7 - */ - public function removeFileChangesAttributeAndModificationTimeOfContainingDirectory() - { - $dir = vfsStream::newDirectory('bar') - ->at(vfsStreamWrapper::getRoot()); - $file = vfsStream::newFile('baz.txt') - ->at($dir) - ->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - $dir->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - unlink($this->bazUrl); - $this->assertLessThanOrEqual(time(), filemtime($this->barUrl)); - $this->assertLessThanOrEqual(time(), filectime($this->barUrl)); - $this->assertEquals(100, fileatime($this->barUrl)); - $this->assertFileTimesEqualStreamTimes($this->barUrl, $dir); - } - - /** - * @test - * @group issue_7 - */ - public function renameFileChangesAttributeAndModificationTimeOfAffectedDirectories() - { - $target = vfsStream::newDirectory('target') - ->at(vfsStreamWrapper::getRoot()) - ->lastModified(200) - ->lastAccessed(200) - ->lastAttributeModified(200); - $source = vfsStream::newDirectory('bar') - ->at(vfsStreamWrapper::getRoot()); - $file = vfsStream::newFile('baz.txt') - ->at($source) - ->lastModified(300) - ->lastAccessed(300) - ->lastAttributeModified(300); - $source->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - rename($this->bazUrl, vfsStream::url('root/target/baz.txt')); - $this->assertLessThanOrEqual(time(), filemtime($this->barUrl)); - $this->assertLessThanOrEqual(time(), filectime($this->barUrl)); - $this->assertEquals(100, fileatime($this->barUrl)); - $this->assertFileTimesEqualStreamTimes($this->barUrl, $source); - $this->assertLessThanOrEqual(time(), filemtime(vfsStream::url('root/target'))); - $this->assertLessThanOrEqual(time(), filectime(vfsStream::url('root/target'))); - $this->assertEquals(200, fileatime(vfsStream::url('root/target'))); - $this->assertFileTimesEqualStreamTimes(vfsStream::url('root/target'), $target); - } - - /** - * @test - * @group issue_7 - */ - public function renameFileDoesNotChangeFileTimesOfFileItself() - { - $target = vfsStream::newDirectory('target') - ->at(vfsStreamWrapper::getRoot()) - ->lastModified(200) - ->lastAccessed(200) - ->lastAttributeModified(200); - $source = vfsStream::newDirectory('bar') - ->at(vfsStreamWrapper::getRoot()); - $file = vfsStream::newFile('baz.txt') - ->at($source) - ->lastModified(300) - ->lastAccessed(300) - ->lastAttributeModified(300); - $source->lastModified(100) - ->lastAccessed(100) - ->lastAttributeModified(100); - rename($this->bazUrl, vfsStream::url('root/target/baz.txt')); - $this->assertEquals(300, filemtime(vfsStream::url('root/target/baz.txt'))); - $this->assertEquals(300, filectime(vfsStream::url('root/target/baz.txt'))); - $this->assertEquals(300, fileatime(vfsStream::url('root/target/baz.txt'))); - $this->assertFileTimesEqualStreamTimes(vfsStream::url('root/target/baz.txt'), $file); - } - - /** - * @test - * @group issue_7 - */ - public function changeFileAttributesChangesAttributeTimeOfFileItself() - { - $this->markTestSkipped('Changing file attributes via stream wrapper for self-defined streams is not supported by PHP.'); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFlockTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFlockTestCase.php deleted file mode 100644 index 3fb137f..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperFlockTestCase.php +++ /dev/null @@ -1,439 +0,0 @@ -root = vfsStream::setup(); - } - - /** - * @test - */ - public function fileIsNotLockedByDefault() - { - $this->assertFalse(vfsStream::newFile('foo.txt')->isLocked()); - } - - /** - * @test - */ - public function streamIsNotLockedByDefault() - { - file_put_contents(vfsStream::url('root/foo.txt'), 'content'); - $this->assertFalse($this->root->getChild('foo.txt')->isLocked()); - } - - /** - * @test - */ - public function canAquireSharedLock() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $this->assertTrue(flock($fp, LOCK_SH)); - $this->assertTrue($file->isLocked()); - $this->assertTrue($file->hasSharedLock()); - $this->assertFalse($file->hasExclusiveLock()); - fclose($fp); - - } - - /** - * @test - */ - public function canAquireSharedLockWithNonBlockingFlockCall() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $this->assertTrue(flock($fp, LOCK_SH | LOCK_NB)); - $this->assertTrue($file->isLocked()); - $this->assertTrue($file->hasSharedLock()); - $this->assertFalse($file->hasExclusiveLock()); - fclose($fp); - - } - - /** - * @test - */ - public function canAquireEclusiveLock() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $this->assertTrue(flock($fp, LOCK_EX)); - $this->assertTrue($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertTrue($file->hasExclusiveLock()); - fclose($fp); - } - - /** - * @test - */ - public function canAquireEclusiveLockWithNonBlockingFlockCall() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $this->assertTrue(flock($fp, LOCK_EX | LOCK_NB)); - $this->assertTrue($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertTrue($file->hasExclusiveLock()); - fclose($fp); - } - - /** - * @test - */ - public function canRemoveLock() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp, LOCK_EX); - $this->assertTrue(flock($fp, LOCK_UN)); - $this->assertFalse($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertFalse($file->hasExclusiveLock()); - fclose($fp); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canRemoveLockWhenNotLocked() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $this->assertTrue(flock($fp, LOCK_UN)); - $this->assertFalse($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertFalse($file->hasSharedLock($fp)); - $this->assertFalse($file->hasExclusiveLock()); - $this->assertFalse($file->hasExclusiveLock($fp)); - fclose($fp); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canRemoveSharedLockWithoutRemovingSharedLockOnOtherFileHandler() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp1, LOCK_SH); - $file->lock($fp2, LOCK_SH); - $this->assertTrue(flock($fp1, LOCK_UN)); - $this->assertTrue($file->hasSharedLock()); - $this->assertFalse($file->hasSharedLock($fp1)); - $this->assertTrue($file->hasSharedLock($fp2)); - fclose($fp1); - fclose($fp2); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canNotRemoveSharedLockAcquiredOnOtherFileHandler() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp1, LOCK_SH); - $this->assertTrue(flock($fp2, LOCK_UN)); - $this->assertTrue($file->isLocked()); - $this->assertTrue($file->hasSharedLock()); - $this->assertFalse($file->hasExclusiveLock()); - fclose($fp1); - fclose($fp2); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canNotRemoveExlusiveLockAcquiredOnOtherFileHandler() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp1, LOCK_EX); - $this->assertTrue(flock($fp2, LOCK_UN)); - $this->assertTrue($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertTrue($file->hasExclusiveLock()); - fclose($fp1); - fclose($fp2); - } - - /** - * @test - */ - public function canRemoveLockWithNonBlockingFlockCall() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp, LOCK_EX); - $this->assertTrue(flock($fp, LOCK_UN | LOCK_NB)); - $this->assertFalse($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertFalse($file->hasExclusiveLock()); - fclose($fp); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canNotAquireExclusiveLockIfAlreadyExclusivelyLockedOnOtherFileHandler() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp1, LOCK_EX); - $this->assertFalse(flock($fp2, LOCK_EX + LOCK_NB)); - $this->assertTrue($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertTrue($file->hasExclusiveLock()); - $this->assertTrue($file->hasExclusiveLock($fp1)); - $this->assertFalse($file->hasExclusiveLock($fp2)); - fclose($fp1); - fclose($fp2); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canAquireExclusiveLockIfAlreadySelfExclusivelyLocked() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp, LOCK_EX); - $this->assertTrue(flock($fp, LOCK_EX + LOCK_NB)); - $this->assertTrue($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertTrue($file->hasExclusiveLock()); - fclose($fp); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canNotAquireExclusiveLockIfAlreadySharedLockedOnOtherFileHandler() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp1, LOCK_SH); - $this->assertFalse(flock($fp2, LOCK_EX)); - $this->assertTrue($file->isLocked()); - $this->assertTrue($file->hasSharedLock()); - $this->assertFalse($file->hasExclusiveLock()); - fclose($fp1); - fclose($fp2); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canAquireExclusiveLockIfAlreadySelfSharedLocked() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp, LOCK_SH); - $this->assertTrue(flock($fp, LOCK_EX)); - $this->assertTrue($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertTrue($file->hasExclusiveLock()); - fclose($fp); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canNotAquireSharedLockIfAlreadyExclusivelyLockedOnOtherFileHandler() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp1, LOCK_EX); - $this->assertFalse(flock($fp2, LOCK_SH + LOCK_NB)); - $this->assertTrue($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertTrue($file->hasExclusiveLock()); - fclose($fp1); - fclose($fp2); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canAquireSharedLockIfAlreadySelfExclusivelyLocked() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp, LOCK_EX); - $this->assertTrue(flock($fp, LOCK_SH + LOCK_NB)); - $this->assertTrue($file->isLocked()); - $this->assertTrue($file->hasSharedLock()); - $this->assertFalse($file->hasExclusiveLock()); - fclose($fp); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canAquireSharedLockIfAlreadySelfSharedLocked() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp, LOCK_SH); - $this->assertTrue(flock($fp, LOCK_SH)); - $this->assertTrue($file->isLocked()); - $this->assertTrue($file->hasSharedLock()); - $this->assertFalse($file->hasExclusiveLock()); - fclose($fp); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function canAquireSharedLockIfAlreadySharedLockedOnOtherFileHandler() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp1, LOCK_SH); - $this->assertTrue(flock($fp2, LOCK_SH)); - $this->assertTrue($file->isLocked()); - $this->assertTrue($file->hasSharedLock()); - $this->assertTrue($file->hasSharedLock($fp1)); - $this->assertTrue($file->hasSharedLock($fp2)); - $this->assertFalse($file->hasExclusiveLock()); - fclose($fp1); - fclose($fp2); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/31 - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_31 - * @group issue_40 - */ - public function removesExclusiveLockOnStreamClose() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp, LOCK_EX); - fclose($fp); - $this->assertFalse($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertFalse($file->hasExclusiveLock()); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/31 - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_31 - * @group issue_40 - */ - public function removesSharedLockOnStreamClose() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp, LOCK_SH); - fclose($fp); - $this->assertFalse($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertFalse($file->hasExclusiveLock()); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function notRemovesExclusiveLockOnStreamCloseIfExclusiveLockAcquiredOnOtherFileHandler() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp2, LOCK_EX); - fclose($fp1); - $this->assertTrue($file->isLocked()); - $this->assertFalse($file->hasSharedLock()); - $this->assertTrue($file->hasExclusiveLock()); - $this->assertTrue($file->hasExclusiveLock($fp2)); - fclose($fp2); - } - - /** - * @see https://github.com/mikey179/vfsStream/issues/40 - * @test - * @group issue_40 - */ - public function notRemovesSharedLockOnStreamCloseIfSharedLockAcquiredOnOtherFileHandler() - { - $file = vfsStream::newFile('foo.txt')->at($this->root); - $fp1 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $fp2 = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $file->lock($fp2, LOCK_SH); - fclose($fp1); - $this->assertTrue($file->isLocked()); - $this->assertTrue($file->hasSharedLock()); - $this->assertTrue($file->hasSharedLock($fp2)); - $this->assertFalse($file->hasExclusiveLock()); - fclose($fp2); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperLargeFileTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperLargeFileTestCase.php deleted file mode 100644 index fb5d9fd..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperLargeFileTestCase.php +++ /dev/null @@ -1,81 +0,0 @@ -largeFile = vfsStream::newFile('large.txt') - ->withContent(LargeFileContent::withGigabytes(100)) - ->at($root); - } - - /** - * @test - */ - public function hasLargeFileSize() - { - if (PHP_INT_MAX == 2147483647) { - $this->markTestSkipped('Requires 64-bit version of PHP'); - } - - $this->assertEquals( - 100 * 1024 * 1024 * 1024, - filesize($this->largeFile->url()) - ); - } - - /** - * @test - */ - public function canReadFromLargeFile() - { - $fp = fopen($this->largeFile->url(), 'rb'); - $data = fread($fp, 15); - fclose($fp); - $this->assertEquals(str_repeat(' ', 15), $data); - } - - /** - * @test - */ - public function canWriteIntoLargeFile() - { - $fp = fopen($this->largeFile->url(), 'rb+'); - fseek($fp, 100 * 1024 * 1024, SEEK_SET); - fwrite($fp, 'foobarbaz'); - fclose($fp); - $this->largeFile->seek((100 * 1024 * 1024) - 3, SEEK_SET); - $this->assertEquals( - ' foobarbaz ', - $this->largeFile->read(15) - ); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperQuotaTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperQuotaTestCase.php deleted file mode 100644 index 9503190..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperQuotaTestCase.php +++ /dev/null @@ -1,223 +0,0 @@ -root = vfsStream::setup(); - vfsStream::setQuota(10); - } - - /** - * @test - */ - public function writeLessThanQuotaWritesEverything() - { - $this->assertEquals(9, file_put_contents(vfsStream::url('root/file.txt'), '123456789')); - $this->assertEquals('123456789', $this->root->getChild('file.txt')->getContent()); - } - - /** - * @test - */ - public function writeUpToQotaWritesEverything() - { - $this->assertEquals(10, file_put_contents(vfsStream::url('root/file.txt'), '1234567890')); - $this->assertEquals('1234567890', $this->root->getChild('file.txt')->getContent()); - } - - /** - * @test - */ - public function writeMoreThanQotaWritesOnlyUpToQuota() - { - try { - file_put_contents(vfsStream::url('root/file.txt'), '12345678901'); - } catch (\PHPUnit_Framework_Error $e) { - $this->assertEquals('file_put_contents(): Only 10 of 11 bytes written, possibly out of free disk space', - $e->getMessage() - ); - } - - $this->assertEquals('1234567890', $this->root->getChild('file.txt')->getContent()); - } - - /** - * @test - */ - public function considersAllFilesForQuota() - { - vfsStream::newFile('foo.txt') - ->withContent('foo') - ->at(vfsStream::newDirectory('bar') - ->at($this->root) - ); - try { - file_put_contents(vfsStream::url('root/file.txt'), '12345678901'); - } catch (\PHPUnit_Framework_Error $e) { - $this->assertEquals('file_put_contents(): Only 7 of 11 bytes written, possibly out of free disk space', - $e->getMessage() - ); - } - - $this->assertEquals('1234567', $this->root->getChild('file.txt')->getContent()); - } - - /** - * @test - * @group issue_33 - */ - public function truncateToLessThanQuotaWritesEverything() - { - if (version_compare(PHP_VERSION, '5.4.0', '<')) { - $this->markTestSkipped('Requires PHP 5.4'); - } - - if (strstr(PHP_VERSION, 'hiphop') !== false) { - $this->markTestSkipped('Not supported on hhvm'); - } - - $fp = fopen(vfsStream::url('root/file.txt'), 'w+'); - $this->assertTrue(ftruncate($fp, 9)); - fclose($fp); - $this->assertEquals(9, - $this->root->getChild('file.txt')->size() - ); - $this->assertEquals("\0\0\0\0\0\0\0\0\0", - $this->root->getChild('file.txt')->getContent() - ); - } - - /** - * @test - * @group issue_33 - */ - public function truncateUpToQotaWritesEverything() - { - if (version_compare(PHP_VERSION, '5.4.0', '<')) { - $this->markTestSkipped('Requires PHP 5.4'); - } - - if (strstr(PHP_VERSION, 'hiphop') !== false) { - $this->markTestSkipped('Not supported on hhvm'); - } - - $fp = fopen(vfsStream::url('root/file.txt'), 'w+'); - $this->assertTrue(ftruncate($fp, 10)); - fclose($fp); - $this->assertEquals(10, - $this->root->getChild('file.txt')->size() - ); - $this->assertEquals("\0\0\0\0\0\0\0\0\0\0", - $this->root->getChild('file.txt')->getContent() - ); - } - - /** - * @test - * @group issue_33 - */ - public function truncateToMoreThanQotaWritesOnlyUpToQuota() - { - if (version_compare(PHP_VERSION, '5.4.0', '<')) { - $this->markTestSkipped('Requires PHP 5.4'); - } - - if (strstr(PHP_VERSION, 'hiphop') !== false) { - $this->markTestSkipped('Not supported on hhvm'); - } - - $fp = fopen(vfsStream::url('root/file.txt'), 'w+'); - $this->assertTrue(ftruncate($fp, 11)); - fclose($fp); - $this->assertEquals(10, - $this->root->getChild('file.txt')->size() - ); - $this->assertEquals("\0\0\0\0\0\0\0\0\0\0", - $this->root->getChild('file.txt')->getContent() - ); - } - - /** - * @test - * @group issue_33 - */ - public function truncateConsidersAllFilesForQuota() - { - if (version_compare(PHP_VERSION, '5.4.0', '<')) { - $this->markTestSkipped('Requires PHP 5.4'); - } - - if (strstr(PHP_VERSION, 'hiphop') !== false) { - $this->markTestSkipped('Not supported on hhvm'); - } - - vfsStream::newFile('bar.txt') - ->withContent('bar') - ->at(vfsStream::newDirectory('bar') - ->at($this->root) - ); - $fp = fopen(vfsStream::url('root/file.txt'), 'w+'); - $this->assertTrue(ftruncate($fp, 11)); - fclose($fp); - $this->assertEquals(7, - $this->root->getChild('file.txt')->size() - ); - $this->assertEquals("\0\0\0\0\0\0\0", - $this->root->getChild('file.txt')->getContent() - ); - } - - /** - * @test - * @group issue_33 - */ - public function canNotTruncateToGreaterLengthWhenDiscQuotaReached() - { - if (version_compare(PHP_VERSION, '5.4.0', '<')) { - $this->markTestSkipped('Requires PHP 5.4'); - } - - if (strstr(PHP_VERSION, 'hiphop') !== false) { - $this->markTestSkipped('Not supported on hhvm'); - } - - vfsStream::newFile('bar.txt') - ->withContent('1234567890') - ->at(vfsStream::newDirectory('bar') - ->at($this->root) - ); - $fp = fopen(vfsStream::url('root/file.txt'), 'w+'); - $this->assertFalse(ftruncate($fp, 11)); - fclose($fp); - $this->assertEquals(0, - $this->root->getChild('file.txt')->size() - ); - $this->assertEquals('', - $this->root->getChild('file.txt')->getContent() - ); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperSetOptionTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperSetOptionTestCase.php deleted file mode 100644 index ff2ab14..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperSetOptionTestCase.php +++ /dev/null @@ -1,75 +0,0 @@ -root = vfsStream::setup(); - vfsStream::newFile('foo.txt')->at($this->root); - } - - /** - * @test - */ - public function setBlockingDoesNotWork() - { - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $this->assertFalse(stream_set_blocking($fp, 1)); - fclose($fp); - } - - /** - * @test - */ - public function removeBlockingDoesNotWork() - { - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $this->assertFalse(stream_set_blocking($fp, 0)); - fclose($fp); - } - - /** - * @test - */ - public function setTimeoutDoesNotWork() - { - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $this->assertFalse(stream_set_timeout($fp, 1)); - fclose($fp); - } - - /** - * @test - */ - public function setWriteBufferDoesNotWork() - { - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $this->assertEquals(-1, stream_set_write_buffer($fp, 512)); - fclose($fp); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperStreamSelectTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperStreamSelectTestCase.php deleted file mode 100644 index 9dc2530..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperStreamSelectTestCase.php +++ /dev/null @@ -1,34 +0,0 @@ -at($root)->withContent('testContent'); - - $fp = fopen(vfsStream::url('root/foo.txt'), 'rb'); - $readarray = array($fp); - $writearray = array(); - $exceptarray = array(); - stream_select($readarray, $writearray, $exceptarray, 1); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperTestCase.php deleted file mode 100644 index f2b3234..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperTestCase.php +++ /dev/null @@ -1,789 +0,0 @@ -assertSame($this->foo, vfsStreamWrapper::getRoot()); - vfsStreamWrapper::register(); - $this->assertNull(vfsStreamWrapper::getRoot()); - } - - /** - * @test - * @since 0.11.0 - */ - public function setRootReturnsRoot() - { - vfsStreamWrapper::register(); - $root = vfsStream::newDirectory('root'); - $this->assertSame($root, vfsStreamWrapper::setRoot($root)); - } - - /** - * assure that filesize is returned correct - * - * @test - */ - public function filesize() - { - $this->assertEquals(0, filesize($this->fooURL)); - $this->assertEquals(0, filesize($this->fooURL . '/.')); - $this->assertEquals(0, filesize($this->barURL)); - $this->assertEquals(0, filesize($this->barURL . '/.')); - $this->assertEquals(4, filesize($this->baz2URL)); - $this->assertEquals(5, filesize($this->baz1URL)); - } - - /** - * assert that file_exists() delivers correct result - * - * @test - */ - public function file_exists() - { - $this->assertTrue(file_exists($this->fooURL)); - $this->assertTrue(file_exists($this->fooURL . '/.')); - $this->assertTrue(file_exists($this->barURL)); - $this->assertTrue(file_exists($this->barURL . '/.')); - $this->assertTrue(file_exists($this->baz1URL)); - $this->assertTrue(file_exists($this->baz2URL)); - $this->assertFalse(file_exists($this->fooURL . '/another')); - $this->assertFalse(file_exists(vfsStream::url('another'))); - } - - /** - * assert that filemtime() delivers correct result - * - * @test - */ - public function filemtime() - { - $this->assertEquals(100, filemtime($this->fooURL)); - $this->assertEquals(100, filemtime($this->fooURL . '/.')); - $this->assertEquals(200, filemtime($this->barURL)); - $this->assertEquals(200, filemtime($this->barURL . '/.')); - $this->assertEquals(300, filemtime($this->baz1URL)); - $this->assertEquals(400, filemtime($this->baz2URL)); - } - - /** - * @test - * @group issue_23 - */ - public function unlinkRemovesFilesOnly() - { - $this->assertTrue(unlink($this->baz2URL)); - $this->assertFalse(file_exists($this->baz2URL)); // make sure statcache was cleared - $this->assertEquals(array($this->bar), $this->foo->getChildren()); - $this->assertFalse(@unlink($this->fooURL . '/another')); - $this->assertFalse(@unlink(vfsStream::url('another'))); - $this->assertEquals(array($this->bar), $this->foo->getChildren()); - } - - /** - * @test - * @group issue_49 - */ - public function unlinkReturnsFalseWhenFileDoesNotExist() - { - vfsStream::setup()->addChild(vfsStream::newFile('foo.blubb')); - $this->assertFalse(@unlink(vfsStream::url('foo.blubb2'))); - } - - /** - * @test - * @group issue_49 - */ - public function unlinkReturnsFalseWhenFileDoesNotExistAndFileWithSameNameExistsInRoot() - { - vfsStream::setup()->addChild(vfsStream::newFile('foo.blubb')); - $this->assertFalse(@unlink(vfsStream::url('foo.blubb'))); - } - - /** - * assert dirname() returns correct directory name - * - * @test - */ - public function dirname() - { - $this->assertEquals($this->fooURL, dirname($this->barURL)); - $this->assertEquals($this->barURL, dirname($this->baz1URL)); - # returns "vfs:" instead of "." - # however this seems not to be fixable because dirname() does not - # call the stream wrapper - #$this->assertEquals(dirname(vfsStream::url('doesNotExist')), '.'); - } - - /** - * assert basename() returns correct file name - * - * @test - */ - public function basename() - { - $this->assertEquals('bar', basename($this->barURL)); - $this->assertEquals('baz1', basename($this->baz1URL)); - $this->assertEquals('doesNotExist', basename(vfsStream::url('doesNotExist'))); - } - - /** - * assert is_readable() works correct - * - * @test - */ - public function is_readable() - { - $this->assertTrue(is_readable($this->fooURL)); - $this->assertTrue(is_readable($this->fooURL . '/.')); - $this->assertTrue(is_readable($this->barURL)); - $this->assertTrue(is_readable($this->barURL . '/.')); - $this->assertTrue(is_readable($this->baz1URL)); - $this->assertTrue(is_readable($this->baz2URL)); - $this->assertFalse(is_readable($this->fooURL . '/another')); - $this->assertFalse(is_readable(vfsStream::url('another'))); - - $this->foo->chmod(0222); - $this->assertFalse(is_readable($this->fooURL)); - - $this->baz1->chmod(0222); - $this->assertFalse(is_readable($this->baz1URL)); - } - - /** - * assert is_writable() works correct - * - * @test - */ - public function is_writable() - { - $this->assertTrue(is_writable($this->fooURL)); - $this->assertTrue(is_writable($this->fooURL . '/.')); - $this->assertTrue(is_writable($this->barURL)); - $this->assertTrue(is_writable($this->barURL . '/.')); - $this->assertTrue(is_writable($this->baz1URL)); - $this->assertTrue(is_writable($this->baz2URL)); - $this->assertFalse(is_writable($this->fooURL . '/another')); - $this->assertFalse(is_writable(vfsStream::url('another'))); - - $this->foo->chmod(0444); - $this->assertFalse(is_writable($this->fooURL)); - - $this->baz1->chmod(0444); - $this->assertFalse(is_writable($this->baz1URL)); - } - - /** - * assert is_executable() works correct - * - * @test - */ - public function is_executable() - { - $this->assertFalse(is_executable($this->baz1URL)); - $this->baz1->chmod(0766); - $this->assertTrue(is_executable($this->baz1URL)); - $this->assertFalse(is_executable($this->baz2URL)); - } - - /** - * assert is_executable() works correct - * - * @test - */ - public function directoriesAndNonExistingFilesAreSometimesExecutable() - { - // Inconsistent behavior has been fixed in 7.3 - // see https://github.com/php/php-src/commit/94b4abdbc4d - if (PHP_VERSION_ID >= 70300) { - $this->assertTrue(is_executable($this->fooURL)); - $this->assertTrue(is_executable($this->fooURL . '/.')); - $this->assertTrue(is_executable($this->barURL)); - $this->assertTrue(is_executable($this->barURL . '/.')); - } else { - $this->assertFalse(is_executable($this->fooURL)); - $this->assertFalse(is_executable($this->fooURL . '/.')); - $this->assertFalse(is_executable($this->barURL)); - $this->assertFalse(is_executable($this->barURL . '/.')); - } - - $this->assertFalse(is_executable($this->fooURL . '/another')); - $this->assertFalse(is_executable(vfsStream::url('another'))); - } - - /** - * file permissions - * - * @test - * @group permissions - */ - public function chmod() - { - $this->assertEquals(40777, decoct(fileperms($this->fooURL))); - $this->assertEquals(40777, decoct(fileperms($this->fooURL . '/.'))); - $this->assertEquals(40777, decoct(fileperms($this->barURL))); - $this->assertEquals(40777, decoct(fileperms($this->barURL . '/.'))); - $this->assertEquals(100666, decoct(fileperms($this->baz1URL))); - $this->assertEquals(100666, decoct(fileperms($this->baz2URL))); - - $this->foo->chmod(0755); - $this->bar->chmod(0700); - $this->baz1->chmod(0644); - $this->baz2->chmod(0600); - $this->assertEquals(40755, decoct(fileperms($this->fooURL))); - $this->assertEquals(40755, decoct(fileperms($this->fooURL . '/.'))); - $this->assertEquals(40700, decoct(fileperms($this->barURL))); - $this->assertEquals(40700, decoct(fileperms($this->barURL . '/.'))); - $this->assertEquals(100644, decoct(fileperms($this->baz1URL))); - $this->assertEquals(100600, decoct(fileperms($this->baz2URL))); - } - - /** - * @test - * @group issue_11 - * @group permissions - */ - public function chmodModifiesPermissions() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->assertFalse(@chmod($this->fooURL, 0755)); - $this->assertFalse(@chmod($this->barURL, 0711)); - $this->assertFalse(@chmod($this->baz1URL, 0644)); - $this->assertFalse(@chmod($this->baz2URL, 0664)); - $this->assertEquals(40777, decoct(fileperms($this->fooURL))); - $this->assertEquals(40777, decoct(fileperms($this->barURL))); - $this->assertEquals(100666, decoct(fileperms($this->baz1URL))); - $this->assertEquals(100666, decoct(fileperms($this->baz2URL))); - } else { - $this->assertTrue(chmod($this->fooURL, 0755)); - $this->assertTrue(chmod($this->barURL, 0711)); - $this->assertTrue(chmod($this->baz1URL, 0644)); - $this->assertTrue(chmod($this->baz2URL, 0664)); - $this->assertEquals(40755, decoct(fileperms($this->fooURL))); - $this->assertEquals(40711, decoct(fileperms($this->barURL))); - $this->assertEquals(100644, decoct(fileperms($this->baz1URL))); - $this->assertEquals(100664, decoct(fileperms($this->baz2URL))); - } - } - - /** - * @test - * @group permissions - */ - public function fileownerIsCurrentUserByDefault() - { - $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->fooURL)); - $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->fooURL . '/.')); - $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->barURL)); - $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->barURL . '/.')); - $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->baz1URL)); - $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->baz2URL)); - } - - /** - * @test - * @group issue_11 - * @group permissions - */ - public function chownChangesUser() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->foo->chown(vfsStream::OWNER_USER_1); - $this->bar->chown(vfsStream::OWNER_USER_1); - $this->baz1->chown(vfsStream::OWNER_USER_2); - $this->baz2->chown(vfsStream::OWNER_USER_2); - } else { - chown($this->fooURL, vfsStream::OWNER_USER_1); - chown($this->barURL, vfsStream::OWNER_USER_1); - chown($this->baz1URL, vfsStream::OWNER_USER_2); - chown($this->baz2URL, vfsStream::OWNER_USER_2); - } - - $this->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->fooURL)); - $this->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->fooURL . '/.')); - $this->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->barURL)); - $this->assertEquals(vfsStream::OWNER_USER_1, fileowner($this->barURL . '/.')); - $this->assertEquals(vfsStream::OWNER_USER_2, fileowner($this->baz1URL)); - $this->assertEquals(vfsStream::OWNER_USER_2, fileowner($this->baz2URL)); - } - - /** - * @test - * @group issue_11 - * @group permissions - */ - public function chownDoesNotWorkOnVfsStreamUrls() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->assertFalse(@chown($this->fooURL, vfsStream::OWNER_USER_2)); - $this->assertEquals(vfsStream::getCurrentUser(), fileowner($this->fooURL)); - } - } - - /** - * @test - * @group issue_11 - * @group permissions - */ - public function groupIsCurrentGroupByDefault() - { - $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->fooURL)); - $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->fooURL . '/.')); - $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->barURL)); - $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->barURL . '/.')); - $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->baz1URL)); - $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->baz2URL)); - } - - /** - * @test - * @group issue_11 - * @group permissions - */ - public function chgrp() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->foo->chgrp(vfsStream::GROUP_USER_1); - $this->bar->chgrp(vfsStream::GROUP_USER_1); - $this->baz1->chgrp(vfsStream::GROUP_USER_2); - $this->baz2->chgrp(vfsStream::GROUP_USER_2); - } else { - chgrp($this->fooURL, vfsStream::GROUP_USER_1); - chgrp($this->barURL, vfsStream::GROUP_USER_1); - chgrp($this->baz1URL, vfsStream::GROUP_USER_2); - chgrp($this->baz2URL, vfsStream::GROUP_USER_2); - } - - $this->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->fooURL)); - $this->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->fooURL . '/.')); - $this->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->barURL)); - $this->assertEquals(vfsStream::GROUP_USER_1, filegroup($this->barURL . '/.')); - $this->assertEquals(vfsStream::GROUP_USER_2, filegroup($this->baz1URL)); - $this->assertEquals(vfsStream::GROUP_USER_2, filegroup($this->baz2URL)); - } - - /** - * @test - * @group issue_11 - * @group permissions - */ - public function chgrpDoesNotWorkOnVfsStreamUrls() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->assertFalse(@chgrp($this->fooURL, vfsStream::GROUP_USER_2)); - $this->assertEquals(vfsStream::getCurrentGroup(), filegroup($this->fooURL)); - } - } - - /** - * @test - * @author Benoit Aubuchon - */ - public function renameDirectory() - { - // move foo/bar to foo/baz3 - $baz3URL = vfsStream::url('foo/baz3'); - $this->assertTrue(rename($this->barURL, $baz3URL)); - $this->assertFileExists($baz3URL); - $this->assertFileNotExists($this->barURL); - } - - /** - * @test - */ - public function renameDirectoryWithDots() - { - // move foo/bar to foo/baz3 - $baz3URL = vfsStream::url('foo/baz3'); - $this->assertTrue(rename($this->barURL . '/.', $baz3URL)); - $this->assertFileExists($baz3URL); - $this->assertFileNotExists($this->barURL); - } - - /** - * @test - * @group issue_9 - * @since 0.9.0 - */ - public function renameDirectoryWithDotsInTarget() - { - // move foo/bar to foo/baz3 - $baz3URL = vfsStream::url('foo/../baz3/.'); - $this->assertTrue(rename($this->barURL . '/.', $baz3URL)); - $this->assertFileExists($baz3URL); - $this->assertFileNotExists($this->barURL); - } - - /** - * @test - * @author Benoit Aubuchon - */ - public function renameDirectoryOverwritingExistingFile() - { - // move foo/bar to foo/baz2 - $this->assertTrue(rename($this->barURL, $this->baz2URL)); - $this->assertFileExists(vfsStream::url('foo/baz2/baz1')); - $this->assertFileNotExists($this->barURL); - } - - /** - * @test - * @expectedException PHPUnit_Framework_Error - */ - public function renameFileIntoFile() - { - // foo/baz2 is a file, so it can not be turned into a directory - $baz3URL = vfsStream::url('foo/baz2/baz3'); - $this->assertTrue(rename($this->baz1URL, $baz3URL)); - $this->assertFileExists($baz3URL); - $this->assertFileNotExists($this->baz1URL); - } - - /** - * @test - * @author Benoit Aubuchon - */ - public function renameFileToDirectory() - { - // move foo/bar/baz1 to foo/baz3 - $baz3URL = vfsStream::url('foo/baz3'); - $this->assertTrue(rename($this->baz1URL, $baz3URL)); - $this->assertFileExists($this->barURL); - $this->assertFileExists($baz3URL); - $this->assertFileNotExists($this->baz1URL); - } - - /** - * assert that trying to rename from a non existing file trigger a warning - * - * @expectedException PHPUnit_Framework_Error - * @test - */ - public function renameOnSourceFileNotFound() - { - rename(vfsStream::url('notfound'), $this->baz1URL); - } - /** - * assert that trying to rename to a directory that is not found trigger a warning - - * @expectedException PHPUnit_Framework_Error - * @test - */ - public function renameOnDestinationDirectoryFileNotFound() - { - rename($this->baz1URL, vfsStream::url('foo/notfound/file2')); - } - /** - * stat() and fstat() should return the same result - * - * @test - */ - public function statAndFstatReturnSameResult() - { - $fp = fopen($this->baz2URL, 'r'); - $this->assertEquals(stat($this->baz2URL), - fstat($fp) - ); - fclose($fp); - } - - /** - * stat() returns full data - * - * @test - */ - public function statReturnsFullDataForFiles() - { - $this->assertEquals(array(0 => 0, - 1 => 0, - 2 => 0100666, - 3 => 0, - 4 => vfsStream::getCurrentUser(), - 5 => vfsStream::getCurrentGroup(), - 6 => 0, - 7 => 4, - 8 => 400, - 9 => 400, - 10 => 400, - 11 => -1, - 12 => -1, - 'dev' => 0, - 'ino' => 0, - 'mode' => 0100666, - 'nlink' => 0, - 'uid' => vfsStream::getCurrentUser(), - 'gid' => vfsStream::getCurrentGroup(), - 'rdev' => 0, - 'size' => 4, - 'atime' => 400, - 'mtime' => 400, - 'ctime' => 400, - 'blksize' => -1, - 'blocks' => -1 - ), - stat($this->baz2URL) - ); - } - - /** - * @test - */ - public function statReturnsFullDataForDirectories() - { - $this->assertEquals(array(0 => 0, - 1 => 0, - 2 => 0040777, - 3 => 0, - 4 => vfsStream::getCurrentUser(), - 5 => vfsStream::getCurrentGroup(), - 6 => 0, - 7 => 0, - 8 => 100, - 9 => 100, - 10 => 100, - 11 => -1, - 12 => -1, - 'dev' => 0, - 'ino' => 0, - 'mode' => 0040777, - 'nlink' => 0, - 'uid' => vfsStream::getCurrentUser(), - 'gid' => vfsStream::getCurrentGroup(), - 'rdev' => 0, - 'size' => 0, - 'atime' => 100, - 'mtime' => 100, - 'ctime' => 100, - 'blksize' => -1, - 'blocks' => -1 - ), - stat($this->fooURL) - ); - } - - /** - * @test - */ - public function statReturnsFullDataForDirectoriesWithDot() - { - $this->assertEquals(array(0 => 0, - 1 => 0, - 2 => 0040777, - 3 => 0, - 4 => vfsStream::getCurrentUser(), - 5 => vfsStream::getCurrentGroup(), - 6 => 0, - 7 => 0, - 8 => 100, - 9 => 100, - 10 => 100, - 11 => -1, - 12 => -1, - 'dev' => 0, - 'ino' => 0, - 'mode' => 0040777, - 'nlink' => 0, - 'uid' => vfsStream::getCurrentUser(), - 'gid' => vfsStream::getCurrentGroup(), - 'rdev' => 0, - 'size' => 0, - 'atime' => 100, - 'mtime' => 100, - 'ctime' => 100, - 'blksize' => -1, - 'blocks' => -1 - ), - stat($this->fooURL . '/.') - ); - } - - /** - * @test - * @expectedException PHPUnit_Framework_Error - */ - public function openFileWithoutDirectory() - { - vfsStreamWrapper::register(); - $this->assertFalse(file_get_contents(vfsStream::url('file.txt'))); - } - - /** - * @test - * @group issue_33 - * @since 1.1.0 - * @requires PHP 5.4.0 - */ - public function truncateRemovesSuperflouosContent() - { - if (strstr(PHP_VERSION, 'hiphop') !== false) { - $this->markTestSkipped('Not supported on hhvm'); - } - - $handle = fopen($this->baz1URL, "r+"); - $this->assertTrue(ftruncate($handle, 0)); - $this->assertEquals(0, filesize($this->baz1URL)); - $this->assertEquals('', file_get_contents($this->baz1URL)); - fclose($handle); - } - - /** - * @test - * @group issue_33 - * @since 1.1.0 - * @requires PHP 5.4.0 - */ - public function truncateToGreaterSizeAddsZeroBytes() - { - if (strstr(PHP_VERSION, 'hiphop') !== false) { - $this->markTestSkipped('Not supported on hhvm'); - } - - $handle = fopen($this->baz1URL, "r+"); - $this->assertTrue(ftruncate($handle, 25)); - $this->assertEquals(25, filesize($this->baz1URL)); - $this->assertEquals("baz 1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", - file_get_contents($this->baz1URL)); - fclose($handle); - } - - /** - * @test - * @group issue_11 - * @requires PHP 5.4.0 - */ - public function touchCreatesNonExistingFile() - { - $this->assertTrue(touch($this->fooURL . '/new.txt')); - $this->assertTrue($this->foo->hasChild('new.txt')); - } - - /** - * @test - * @group issue_11 - * @requires PHP 5.4.0 - */ - public function touchChangesAccessAndModificationTimeForFile() - { - $this->assertTrue(touch($this->baz1URL, 303, 313)); - $this->assertEquals(303, $this->baz1->filemtime()); - $this->assertEquals(313, $this->baz1->fileatime()); - } - - /** - * @test - * @group issue_11 - * @group issue_80 - * @requires PHP 5.4.0 - */ - public function touchChangesTimesToCurrentTimestampWhenNoTimesGiven() - { - $this->assertTrue(touch($this->baz1URL)); - $this->assertEquals(time(), $this->baz1->filemtime(), '', 1); - $this->assertEquals(time(), $this->baz1->fileatime(), '', 1); - } - - /** - * @test - * @group issue_11 - * @requires PHP 5.4.0 - */ - public function touchWithModifiedTimeChangesAccessAndModifiedTime() - { - $this->assertTrue(touch($this->baz1URL, 303)); - $this->assertEquals(303, $this->baz1->filemtime()); - $this->assertEquals(303, $this->baz1->fileatime()); - } - - /** - * @test - * @group issue_11 - * @requires PHP 5.4.0 - */ - public function touchChangesAccessAndModificationTimeForDirectory() - { - $this->assertTrue(touch($this->fooURL, 303, 313)); - $this->assertEquals(303, $this->foo->filemtime()); - $this->assertEquals(313, $this->foo->fileatime()); - } - - /** - * @test - * @group issue_34 - * @since 1.2.0 - */ - public function pathesAreCorrectlySet() - { - $this->assertEquals(vfsStream::path($this->fooURL), $this->foo->path()); - $this->assertEquals(vfsStream::path($this->barURL), $this->bar->path()); - $this->assertEquals(vfsStream::path($this->baz1URL), $this->baz1->path()); - $this->assertEquals(vfsStream::path($this->baz2URL), $this->baz2->path()); - } - - /** - * @test - * @group issue_34 - * @since 1.2.0 - */ - public function urlsAreCorrectlySet() - { - $this->assertEquals($this->fooURL, $this->foo->url()); - $this->assertEquals($this->barURL, $this->bar->url()); - $this->assertEquals($this->baz1URL, $this->baz1->url()); - $this->assertEquals($this->baz2URL, $this->baz2->url()); - } - - /** - * @test - * @group issue_34 - * @since 1.2.0 - */ - public function pathIsUpdatedAfterMove() - { - // move foo/bar/baz1 to foo/baz3 - $baz3URL = vfsStream::url('foo/baz3'); - $this->assertTrue(rename($this->baz1URL, $baz3URL)); - $this->assertEquals(vfsStream::path($baz3URL), $this->baz1->path()); - } - - /** - * @test - * @group issue_34 - * @since 1.2.0 - */ - public function urlIsUpdatedAfterMove() - { - // move foo/bar/baz1 to foo/baz3 - $baz3URL = vfsStream::url('foo/baz3'); - $this->assertTrue(rename($this->baz1URL, $baz3URL)); - $this->assertEquals($baz3URL, $this->baz1->url()); - } - - /** - * @test - */ - public function fileCopy() - { - $baz3URL = vfsStream::url('foo/baz3'); - $this->assertTrue(copy($this->baz1URL, $baz3URL)); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperUnregisterTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperUnregisterTestCase.php deleted file mode 100644 index 4e27685..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperUnregisterTestCase.php +++ /dev/null @@ -1,75 +0,0 @@ -assertNotContains(vfsStream::SCHEME, stream_get_wrappers()); - } - - /** - * Unregistering a third party wrapper for vfs:// fails. - * - * @test - * @expectedException org\bovigo\vfs\vfsStreamException - * @runInSeparateProcess - */ - public function unregisterThirdPartyVfsScheme() - { - // Unregister possible registered URL wrapper. - vfsStreamWrapper::unregister(); - - $mock = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamWrapper'); - stream_wrapper_register(vfsStream::SCHEME, get_class($mock)); - - vfsStreamWrapper::unregister(); - } - - /** - * Unregistering when not in registered state will fail. - * - * @test - * @expectedException org\bovigo\vfs\vfsStreamException - * @runInSeparateProcess - */ - public function unregisterWhenNotInRegisteredState() - { - vfsStreamWrapper::register(); - stream_wrapper_unregister(vfsStream::SCHEME); - vfsStreamWrapper::unregister(); - } - - /** - * Unregistering while not registers won't fail. - * - * @test - */ - public function unregisterWhenNotRegistered() - { - // Unregister possible registered URL wrapper. - vfsStreamWrapper::unregister(); - - $this->assertNotContains(vfsStream::SCHEME, stream_get_wrappers()); - vfsStreamWrapper::unregister(); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperWithoutRootTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperWithoutRootTestCase.php deleted file mode 100644 index 8267a32..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamWrapperWithoutRootTestCase.php +++ /dev/null @@ -1,63 +0,0 @@ - no directory to open - * - * @test - */ - public function canNotOpenDirectory() - { - $this->assertFalse(@dir(vfsStream::url('foo'))); - } - - /** - * can not unlink without root - * - * @test - */ - public function canNotUnlink() - { - $this->assertFalse(@unlink(vfsStream::url('foo'))); - } - - /** - * can not open a file without root - * - * @test - */ - public function canNotOpen() - { - $this->assertFalse(@fopen(vfsStream::url('foo'), 'r')); - } - - /** - * can not rename a file without root - * - * @test - */ - public function canNotRename() - { - $this->assertFalse(@rename(vfsStream::url('foo'), vfsStream::url('bar'))); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamZipTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamZipTestCase.php deleted file mode 100644 index 210642c..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/vfsStreamZipTestCase.php +++ /dev/null @@ -1,52 +0,0 @@ -markTestSkipped('No ext/zip installed, skipping test.'); - } - - $this->markTestSkipped('Zip extension can not work with vfsStream urls.'); - - vfsStreamWrapper::register(); - vfsStreamWrapper::setRoot(vfsStream::newDirectory('root')); - - } - - /** - * @test - */ - public function createZipArchive() - { - $zip = new ZipArchive(); - $this->assertTrue($zip->open(vfsStream::url('root/test.zip'), ZipArchive::CREATE)); - $this->assertTrue($zip->addFromString("testfile1.txt", "#1 This is a test string added as testfile1.txt.\n")); - $this->assertTrue($zip->addFromString("testfile2.txt", "#2 This is a test string added as testfile2.txt.\n")); - $zip->setArchiveComment('a test'); - var_dump($zip); - $this->assertTrue($zip->close()); - var_dump($zip->getStatusString()); - var_dump($zip->close()); - var_dump($zip->getStatusString()); - var_dump($zip); - var_dump(file_exists(vfsStream::url('root/test.zip'))); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamAbstractVisitorTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamAbstractVisitorTestCase.php deleted file mode 100644 index dfb3ed5..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamAbstractVisitorTestCase.php +++ /dev/null @@ -1,98 +0,0 @@ -abstractVisitor = $this->bc_getMock('org\\bovigo\\vfs\\visitor\\vfsStreamAbstractVisitor', - array('visitFile', 'visitDirectory') - ); - } - - /** - * @test - * @expectedException \InvalidArgumentException - */ - public function visitThrowsInvalidArgumentExceptionOnUnknownContentType() - { - $mockContent = $this->bc_getMock('org\\bovigo\\vfs\\vfsStreamContent'); - $mockContent->expects($this->any()) - ->method('getType') - ->will($this->returnValue('invalid')); - $this->assertSame($this->abstractVisitor, - $this->abstractVisitor->visit($mockContent) - ); - } - - /** - * @test - */ - public function visitWithFileCallsVisitFile() - { - $file = new vfsStreamFile('foo.txt'); - $this->abstractVisitor->expects($this->once()) - ->method('visitFile') - ->with($this->equalTo($file)); - $this->assertSame($this->abstractVisitor, - $this->abstractVisitor->visit($file) - ); - } - - /** - * tests that a block device eventually calls out to visit file - * - * @test - */ - public function visitWithBlockCallsVisitFile() - { - $block = new vfsStreamBlock('foo'); - $this->abstractVisitor->expects($this->once()) - ->method('visitFile') - ->with($this->equalTo($block)); - $this->assertSame($this->abstractVisitor, - $this->abstractVisitor->visit($block) - ); - } - - /** - * @test - */ - public function visitWithDirectoryCallsVisitDirectory() - { - $dir = new vfsStreamDirectory('bar'); - $this->abstractVisitor->expects($this->once()) - ->method('visitDirectory') - ->with($this->equalTo($dir)); - $this->assertSame($this->abstractVisitor, - $this->abstractVisitor->visit($dir) - ); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamPrintVisitorTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamPrintVisitorTestCase.php deleted file mode 100644 index 294bd77..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamPrintVisitorTestCase.php +++ /dev/null @@ -1,102 +0,0 @@ -at(vfsStream::setup()); - $printVisitor = new vfsStreamPrintVisitor(fopen('vfs://root/foo.txt', 'wb')); - $this->assertSame($printVisitor, - $printVisitor->visitFile(vfsStream::newFile('bar.txt')) - ); - $this->assertEquals("- bar.txt\n", $output->getContent()); - } - - /** - * @test - */ - public function visitFileWritesBlockDeviceToStream() - { - $output = vfsStream::newFile('foo.txt') - ->at(vfsStream::setup()); - $printVisitor = new vfsStreamPrintVisitor(fopen('vfs://root/foo.txt', 'wb')); - $this->assertSame($printVisitor, - $printVisitor->visitBlockDevice(vfsStream::newBlock('bar')) - ); - $this->assertEquals("- [bar]\n", $output->getContent()); - } - - /** - * @test - */ - public function visitDirectoryWritesDirectoryNameToStream() - { - $output = vfsStream::newFile('foo.txt') - ->at(vfsStream::setup()); - $printVisitor = new vfsStreamPrintVisitor(fopen('vfs://root/foo.txt', 'wb')); - $this->assertSame($printVisitor, - $printVisitor->visitDirectory(vfsStream::newDirectory('baz')) - ); - $this->assertEquals("- baz\n", $output->getContent()); - } - - /** - * @test - */ - public function visitRecursiveDirectoryStructure() - { - $root = vfsStream::setup('root', - null, - array('test' => array('foo' => array('test.txt' => 'hello'), - 'baz.txt' => 'world' - ), - 'foo.txt' => '' - ) - ); - $printVisitor = new vfsStreamPrintVisitor(fopen('vfs://root/foo.txt', 'wb')); - $this->assertSame($printVisitor, - $printVisitor->visitDirectory($root) - ); - $this->assertEquals("- root\n - test\n - foo\n - test.txt\n - baz.txt\n - foo.txt\n", file_get_contents('vfs://root/foo.txt')); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamStructureVisitorTestCase.php b/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamStructureVisitorTestCase.php deleted file mode 100644 index c9df234..0000000 --- a/vendor/mikey179/vfsstream/src/test/php/org/bovigo/vfs/visitor/vfsStreamStructureVisitorTestCase.php +++ /dev/null @@ -1,85 +0,0 @@ -assertEquals(array('foo.txt' => 'test'), - $structureVisitor->visitFile(vfsStream::newFile('foo.txt') - ->withContent('test') - ) - ->getStructure() - ); - } - - /** - * @test - */ - public function visitFileCreatesStructureForBlock() - { - $structureVisitor = new vfsStreamStructureVisitor(); - $this->assertEquals(array('[foo]' => 'test'), - $structureVisitor->visitBlockDevice(vfsStream::newBlock('foo') - ->withContent('test') - ) - ->getStructure() - ); - } - - /** - * @test - */ - public function visitDirectoryCreatesStructureForDirectory() - { - $structureVisitor = new vfsStreamStructureVisitor(); - $this->assertEquals(array('baz' => array()), - $structureVisitor->visitDirectory(vfsStream::newDirectory('baz')) - ->getStructure() - ); - } - - /** - * @test - */ - public function visitRecursiveDirectoryStructure() - { - $root = vfsStream::setup('root', - null, - array('test' => array('foo' => array('test.txt' => 'hello'), - 'baz.txt' => 'world' - ), - 'foo.txt' => '' - ) - ); - $structureVisitor = new vfsStreamStructureVisitor(); - $this->assertEquals(array('root' => array('test' => array('foo' => array('test.txt' => 'hello'), - 'baz.txt' => 'world' - ), - 'foo.txt' => '' - ), - ), - $structureVisitor->visitDirectory($root) - ->getStructure() - ); - } -} diff --git a/vendor/mikey179/vfsstream/src/test/phpt/bug71287.phpt b/vendor/mikey179/vfsstream/src/test/phpt/bug71287.phpt deleted file mode 100644 index ea2efb7..0000000 --- a/vendor/mikey179/vfsstream/src/test/phpt/bug71287.phpt +++ /dev/null @@ -1,23 +0,0 @@ ---TEST-- -Reproduce octal output from stream wrapper invocation - -See https://bugs.php.net/bug.php?id=71287 -See https://github.com/mikey179/vfsStream/issues/120 ---FILE-- - ---EXPECTF-- -Warning: file_put_contents(): Only 7 of 9 bytes written, possibly out of free disk space in %s on line %d \ No newline at end of file diff --git a/vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/emptyFolder/.gitignore b/vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/emptyFolder/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/withSubfolders/aFile.txt b/vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/withSubfolders/aFile.txt deleted file mode 100644 index 1910281..0000000 --- a/vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/withSubfolders/aFile.txt +++ /dev/null @@ -1 +0,0 @@ -foo \ No newline at end of file diff --git a/vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/withSubfolders/subfolder1/file1.txt b/vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/withSubfolders/subfolder1/file1.txt deleted file mode 100644 index f6ea049..0000000 --- a/vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/withSubfolders/subfolder1/file1.txt +++ /dev/null @@ -1 +0,0 @@ -foobar \ No newline at end of file diff --git a/vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/withSubfolders/subfolder2/.gitignore b/vendor/mikey179/vfsstream/src/test/resources/filesystemcopy/withSubfolders/subfolder2/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/myclabs/deep-copy/.github/FUNDING.yml b/vendor/myclabs/deep-copy/.github/FUNDING.yml deleted file mode 100644 index b8da664..0000000 --- a/vendor/myclabs/deep-copy/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# These are supported funding model platforms - -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: "packagist/myclabs/deep-copy" -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/vendor/myclabs/deep-copy/LICENSE b/vendor/myclabs/deep-copy/LICENSE deleted file mode 100644 index c3e8350..0000000 --- a/vendor/myclabs/deep-copy/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 My C-Sense - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/myclabs/deep-copy/README.md b/vendor/myclabs/deep-copy/README.md deleted file mode 100644 index 007ad5b..0000000 --- a/vendor/myclabs/deep-copy/README.md +++ /dev/null @@ -1,375 +0,0 @@ -# DeepCopy - -DeepCopy helps you create deep copies (clones) of your objects. It is designed to handle cycles in the association graph. - -[![Build Status](https://travis-ci.org/myclabs/DeepCopy.png?branch=1.x)](https://travis-ci.org/myclabs/DeepCopy) -[![Coverage Status](https://coveralls.io/repos/myclabs/DeepCopy/badge.png?branch=1.x)](https://coveralls.io/r/myclabs/DeepCopy?branch=1.x) -[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/myclabs/DeepCopy/badges/quality-score.png?s=2747100c19b275f93a777e3297c6c12d1b68b934)](https://scrutinizer-ci.com/g/myclabs/DeepCopy/) -[![Total Downloads](https://poser.pugx.org/myclabs/deep-copy/downloads.svg)](https://packagist.org/packages/myclabs/deep-copy) - -## Table of Contents - -1. [How](#how) -1. [Why](#why) - 1. [Using simply `clone`](#using-simply-clone) - 1. [Overridding `__clone()`](#overridding-__clone) - 1. [With `DeepCopy`](#with-deepcopy) -1. [How it works](#how-it-works) -1. [Going further](#going-further) - 1. [Matchers](#matchers) - 1. [Property name](#property-name) - 1. [Specific property](#specific-property) - 1. [Type](#type) - 1. [Filters](#filters) - 1. [`SetNullFilter`](#setnullfilter-filter) - 1. [`KeepFilter`](#keepfilter-filter) - 1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter-filter) - 1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter-filter) - 1. [`DoctrineProxyFilter`](#doctrineproxyfilter-filter) - 1. [`ReplaceFilter`](#replacefilter-type-filter) - 1. [`ShallowCopyFilter`](#shallowcopyfilter-type-filter) -1. [Edge cases](#edge-cases) -1. [Contributing](#contributing) - 1. [Tests](#tests) - - -## How? - -Install with Composer: - -```json -composer require myclabs/deep-copy -``` - -Use simply: - -```php -use DeepCopy\DeepCopy; - -$copier = new DeepCopy(); -$myCopy = $copier->copy($myObject); -``` - - -## Why? - -- How do you create copies of your objects? - -```php -$myCopy = clone $myObject; -``` - -- How do you create **deep** copies of your objects (i.e. copying also all the objects referenced in the properties)? - -You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior -yourself. - -- But how do you handle **cycles** in the association graph? - -Now you're in for a big mess :( - -![association graph](doc/graph.png) - - -### Using simply `clone` - -![Using clone](doc/clone.png) - - -### Overridding `__clone()` - -![Overridding __clone](doc/deep-clone.png) - - -### With `DeepCopy` - -![With DeepCopy](doc/deep-copy.png) - - -## How it works - -DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it -keeps a hash map of all instances and thus preserves the object graph. - -To use it: - -```php -use function DeepCopy\deep_copy; - -$copy = deep_copy($var); -``` - -Alternatively, you can create your own `DeepCopy` instance to configure it differently for example: - -```php -use DeepCopy\DeepCopy; - -$copier = new DeepCopy(true); - -$copy = $copier->copy($var); -``` - -You may want to roll your own deep copy function: - -```php -namespace Acme; - -use DeepCopy\DeepCopy; - -function deep_copy($var) -{ - static $copier = null; - - if (null === $copier) { - $copier = new DeepCopy(true); - } - - return $copier->copy($var); -} -``` - - -## Going further - -You can add filters to customize the copy process. - -The method to add a filter is `DeepCopy\DeepCopy::addFilter($filter, $matcher)`, -with `$filter` implementing `DeepCopy\Filter\Filter` -and `$matcher` implementing `DeepCopy\Matcher\Matcher`. - -We provide some generic filters and matchers. - - -### Matchers - - - `DeepCopy\Matcher` applies on a object attribute. - - `DeepCopy\TypeMatcher` applies on any element found in graph, including array elements. - - -#### Property name - -The `PropertyNameMatcher` will match a property by its name: - -```php -use DeepCopy\Matcher\PropertyNameMatcher; - -// Will apply a filter to any property of any objects named "id" -$matcher = new PropertyNameMatcher('id'); -``` - - -#### Specific property - -The `PropertyMatcher` will match a specific property of a specific class: - -```php -use DeepCopy\Matcher\PropertyMatcher; - -// Will apply a filter to the property "id" of any objects of the class "MyClass" -$matcher = new PropertyMatcher('MyClass', 'id'); -``` - - -#### Type - -The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of -[gettype()](http://php.net/manual/en/function.gettype.php) function): - -```php -use DeepCopy\TypeMatcher\TypeMatcher; - -// Will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection -$matcher = new TypeMatcher('Doctrine\Common\Collections\Collection'); -``` - - -### Filters - -- `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher` -- `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher` - - -#### `SetNullFilter` (filter) - -Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have -any ID: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\SetNullFilter; -use DeepCopy\Matcher\PropertyNameMatcher; - -$object = MyClass::load(123); -echo $object->id; // 123 - -$copier = new DeepCopy(); -$copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); - -$copy = $copier->copy($object); - -echo $copy->id; // null -``` - - -#### `KeepFilter` (filter) - -If you want a property to remain untouched (for example, an association to an object): - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\KeepFilter; -use DeepCopy\Matcher\PropertyMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category')); - -$copy = $copier->copy($object); -// $copy->category has not been touched -``` - - -#### `DoctrineCollectionFilter` (filter) - -If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter; -use DeepCopy\Matcher\PropertyTypeMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection')); - -$copy = $copier->copy($object); -``` - - -#### `DoctrineEmptyCollectionFilter` (filter) - -If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the -`DoctrineEmptyCollectionFilter` - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter; -use DeepCopy\Matcher\PropertyMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty')); - -$copy = $copier->copy($object); - -// $copy->myProperty will return an empty collection -``` - - -#### `DoctrineProxyFilter` (filter) - -If you use Doctrine and use cloning on lazy loaded entities, you might encounter errors mentioning missing fields on a -Doctrine proxy class (...\\\_\_CG\_\_\Proxy). -You can use the `DoctrineProxyFilter` to load the actual entity behind the Doctrine proxy class. -**Make sure, though, to put this as one of your very first filters in the filter chain so that the entity is loaded -before other filters are applied!** - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; -use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; - -$copier = new DeepCopy(); -$copier->addFilter(new DoctrineProxyFilter(), new DoctrineProxyMatcher()); - -$copy = $copier->copy($object); - -// $copy should now contain a clone of all entities, including those that were not yet fully loaded. -``` - - -#### `ReplaceFilter` (type filter) - -1. If you want to replace the value of a property: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\Filter\ReplaceFilter; -use DeepCopy\Matcher\PropertyMatcher; - -$copier = new DeepCopy(); -$callback = function ($currentValue) { - return $currentValue . ' (copy)' -}; -$copier->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title')); - -$copy = $copier->copy($object); - -// $copy->title will contain the data returned by the callback, e.g. 'The title (copy)' -``` - -2. If you want to replace whole element: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\TypeFilter\ReplaceFilter; -use DeepCopy\TypeMatcher\TypeMatcher; - -$copier = new DeepCopy(); -$callback = function (MyClass $myClass) { - return get_class($myClass); -}; -$copier->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass')); - -$copy = $copier->copy([new MyClass, 'some string', new MyClass]); - -// $copy will contain ['MyClass', 'some string', 'MyClass'] -``` - - -The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable. - - -#### `ShallowCopyFilter` (type filter) - -Stop *DeepCopy* from recursively copying element, using standard `clone` instead: - -```php -use DeepCopy\DeepCopy; -use DeepCopy\TypeFilter\ShallowCopyFilter; -use DeepCopy\TypeMatcher\TypeMatcher; -use Mockery as m; - -$this->deepCopy = new DeepCopy(); -$this->deepCopy->addTypeFilter( - new ShallowCopyFilter, - new TypeMatcher(m\MockInterface::class) -); - -$myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class)); -// All mocks will be just cloned, not deep copied -``` - - -## Edge cases - -The following structures cannot be deep-copied with PHP Reflection. As a result they are shallow cloned and filters are -not applied. There is two ways for you to handle them: - -- Implement your own `__clone()` method -- Use a filter with a type matcher - - -## Contributing - -DeepCopy is distributed under the MIT license. - - -### Tests - -Running the tests is simple: - -```php -vendor/bin/phpunit -``` - -### Support - -Get professional support via [the Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-myclabs-deep-copy?utm_source=packagist-myclabs-deep-copy&utm_medium=referral&utm_campaign=readme). diff --git a/vendor/myclabs/deep-copy/composer.json b/vendor/myclabs/deep-copy/composer.json deleted file mode 100644 index 45656c9..0000000 --- a/vendor/myclabs/deep-copy/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "myclabs/deep-copy", - "type": "library", - "description": "Create deep copies (clones) of your objects", - "keywords": ["clone", "copy", "duplicate", "object", "object graph"], - "license": "MIT", - - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, - "files": [ - "src/DeepCopy/deep_copy.php" - ] - }, - "autoload-dev": { - "psr-4": { - "DeepCopy\\": "fixtures/", - "DeepCopyTest\\": "tests/DeepCopyTest/" - } - }, - - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" - }, - "replace": { - "myclabs/deep-copy": "self.version" - }, - - "config": { - "sort-packages": true - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php deleted file mode 100644 index 15e5c68..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php +++ /dev/null @@ -1,298 +0,0 @@ - Filter, 'matcher' => Matcher] pairs. - */ - private $filters = []; - - /** - * Type Filters to apply. - * - * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - */ - private $typeFilters = []; - - /** - * @var bool - */ - private $skipUncloneable = false; - - /** - * @var bool - */ - private $useCloneMethod; - - /** - * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used - * instead of the regular deep cloning. - */ - public function __construct($useCloneMethod = false) - { - $this->useCloneMethod = $useCloneMethod; - - $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); - $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); - $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); - } - - /** - * If enabled, will not throw an exception when coming across an uncloneable property. - * - * @param $skipUncloneable - * - * @return $this - */ - public function skipUncloneable($skipUncloneable = true) - { - $this->skipUncloneable = $skipUncloneable; - - return $this; - } - - /** - * Deep copies the given object. - * - * @param mixed $object - * - * @return mixed - */ - public function copy($object) - { - $this->hashMap = []; - - return $this->recursiveCopy($object); - } - - public function addFilter(Filter $filter, Matcher $matcher) - { - $this->filters[] = [ - 'matcher' => $matcher, - 'filter' => $filter, - ]; - } - - public function prependFilter(Filter $filter, Matcher $matcher) - { - array_unshift($this->filters, [ - 'matcher' => $matcher, - 'filter' => $filter, - ]); - } - - public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) - { - $this->typeFilters[] = [ - 'matcher' => $matcher, - 'filter' => $filter, - ]; - } - - private function recursiveCopy($var) - { - // Matches Type Filter - if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { - return $filter->apply($var); - } - - // Resource - if (is_resource($var)) { - return $var; - } - - // Array - if (is_array($var)) { - return $this->copyArray($var); - } - - // Scalar - if (! is_object($var)) { - return $var; - } - - // Object - return $this->copyObject($var); - } - - /** - * Copy an array - * @param array $array - * @return array - */ - private function copyArray(array $array) - { - foreach ($array as $key => $value) { - $array[$key] = $this->recursiveCopy($value); - } - - return $array; - } - - /** - * Copies an object. - * - * @param object $object - * - * @throws CloneException - * - * @return object - */ - private function copyObject($object) - { - $objectHash = spl_object_hash($object); - - if (isset($this->hashMap[$objectHash])) { - return $this->hashMap[$objectHash]; - } - - $reflectedObject = new ReflectionObject($object); - $isCloneable = $reflectedObject->isCloneable(); - - if (false === $isCloneable) { - if ($this->skipUncloneable) { - $this->hashMap[$objectHash] = $object; - - return $object; - } - - throw new CloneException( - sprintf( - 'The class "%s" is not cloneable.', - $reflectedObject->getName() - ) - ); - } - - $newObject = clone $object; - $this->hashMap[$objectHash] = $newObject; - - if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { - return $newObject; - } - - if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { - return $newObject; - } - - foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { - $this->copyObjectProperty($newObject, $property); - } - - return $newObject; - } - - private function copyObjectProperty($object, ReflectionProperty $property) - { - // Ignore static properties - if ($property->isStatic()) { - return; - } - - // Apply the filters - foreach ($this->filters as $item) { - /** @var Matcher $matcher */ - $matcher = $item['matcher']; - /** @var Filter $filter */ - $filter = $item['filter']; - - if ($matcher->matches($object, $property->getName())) { - $filter->apply( - $object, - $property->getName(), - function ($object) { - return $this->recursiveCopy($object); - } - ); - - // If a filter matches, we stop processing this property - return; - } - } - - $property->setAccessible(true); - - // Ignore uninitialized properties (for PHP >7.4) - if (method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { - return; - } - - $propertyValue = $property->getValue($object); - - // Copy the property - $property->setValue($object, $this->recursiveCopy($propertyValue)); - } - - /** - * Returns first filter that matches variable, `null` if no such filter found. - * - * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and - * 'matcher' with value of type {@see TypeMatcher} - * @param mixed $var - * - * @return TypeFilter|null - */ - private function getFirstMatchedTypeFilter(array $filterRecords, $var) - { - $matched = $this->first( - $filterRecords, - function (array $record) use ($var) { - /* @var TypeMatcher $matcher */ - $matcher = $record['matcher']; - - return $matcher->matches($var); - } - ); - - return isset($matched) ? $matched['filter'] : null; - } - - /** - * Returns first element that matches predicate, `null` if no such element found. - * - * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. - * @param callable $predicate Predicate arguments are: element. - * - * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' - * with value of type {@see TypeMatcher} or `null`. - */ - private function first(array $elements, callable $predicate) - { - foreach ($elements as $element) { - if (call_user_func($predicate, $element)) { - return $element; - } - } - - return null; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php deleted file mode 100644 index c046706..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php +++ /dev/null @@ -1,9 +0,0 @@ -setAccessible(true); - $oldCollection = $reflectionProperty->getValue($object); - - $newCollection = $oldCollection->map( - function ($item) use ($objectCopier) { - return $objectCopier($item); - } - ); - - $reflectionProperty->setValue($object, $newCollection); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php deleted file mode 100644 index 7b33fd5..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php +++ /dev/null @@ -1,28 +0,0 @@ -setAccessible(true); - - $reflectionProperty->setValue($object, new ArrayCollection()); - } -} \ No newline at end of file diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php deleted file mode 100644 index 8bee8f7..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php +++ /dev/null @@ -1,22 +0,0 @@ -__load(); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php deleted file mode 100644 index 85ba18c..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php +++ /dev/null @@ -1,18 +0,0 @@ -callback = $callable; - } - - /** - * Replaces the object property by the result of the callback called with the object property. - * - * {@inheritdoc} - */ - public function apply($object, $property, $objectCopier) - { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - $reflectionProperty->setAccessible(true); - - $value = call_user_func($this->callback, $reflectionProperty->getValue($object)); - - $reflectionProperty->setValue($object, $value); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php deleted file mode 100644 index bea86b8..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php +++ /dev/null @@ -1,24 +0,0 @@ -setAccessible(true); - $reflectionProperty->setValue($object, null); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php deleted file mode 100644 index ec8856f..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php +++ /dev/null @@ -1,22 +0,0 @@ -class = $class; - $this->property = $property; - } - - /** - * Matches a specific property of a specific class. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return ($object instanceof $this->class) && $property == $this->property; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php deleted file mode 100644 index c8ec0d2..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php +++ /dev/null @@ -1,32 +0,0 @@ -property = $property; - } - - /** - * Matches a property by its name. - * - * {@inheritdoc} - */ - public function matches($object, $property) - { - return $property == $this->property; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php deleted file mode 100644 index a6b0c0b..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php +++ /dev/null @@ -1,46 +0,0 @@ -propertyType = $propertyType; - } - - /** - * {@inheritdoc} - */ - public function matches($object, $property) - { - try { - $reflectionProperty = ReflectionHelper::getProperty($object, $property); - } catch (ReflectionException $exception) { - return false; - } - - $reflectionProperty->setAccessible(true); - - return $reflectionProperty->getValue($object) instanceof $this->propertyType; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php b/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php deleted file mode 100644 index 742410c..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php +++ /dev/null @@ -1,78 +0,0 @@ -getProperties() does not return private properties from ancestor classes. - * - * @author muratyaman@gmail.com - * @see http://php.net/manual/en/reflectionclass.getproperties.php - * - * @param ReflectionClass $ref - * - * @return ReflectionProperty[] - */ - public static function getProperties(ReflectionClass $ref) - { - $props = $ref->getProperties(); - $propsArr = array(); - - foreach ($props as $prop) { - $propertyName = $prop->getName(); - $propsArr[$propertyName] = $prop; - } - - if ($parentClass = $ref->getParentClass()) { - $parentPropsArr = self::getProperties($parentClass); - foreach ($propsArr as $key => $property) { - $parentPropsArr[$key] = $property; - } - - return $parentPropsArr; - } - - return $propsArr; - } - - /** - * Retrieves property by name from object and all its ancestors. - * - * @param object|string $object - * @param string $name - * - * @throws PropertyException - * @throws ReflectionException - * - * @return ReflectionProperty - */ - public static function getProperty($object, $name) - { - $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); - - if ($reflection->hasProperty($name)) { - return $reflection->getProperty($name); - } - - if ($parentClass = $reflection->getParentClass()) { - return self::getProperty($parentClass->getName(), $name); - } - - throw new PropertyException( - sprintf( - 'The class "%s" doesn\'t have a property with the given name: "%s".', - is_object($object) ? get_class($object) : $object, - $name - ) - ); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php deleted file mode 100644 index becd1cf..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php +++ /dev/null @@ -1,33 +0,0 @@ - $propertyValue) { - $copy->{$propertyName} = $propertyValue; - } - - return $copy; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php deleted file mode 100644 index 164f8b8..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php +++ /dev/null @@ -1,30 +0,0 @@ -callback = $callable; - } - - /** - * {@inheritdoc} - */ - public function apply($element) - { - return call_user_func($this->callback, $element); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php deleted file mode 100644 index a5fbd7a..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php +++ /dev/null @@ -1,17 +0,0 @@ -copier = $copier; - } - - /** - * {@inheritdoc} - */ - public function apply($arrayObject) - { - $clone = clone $arrayObject; - foreach ($arrayObject->getArrayCopy() as $k => $v) { - $clone->offsetSet($k, $this->copier->copy($v)); - } - - return $clone; - } -} - diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php deleted file mode 100644 index c5644cf..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php +++ /dev/null @@ -1,10 +0,0 @@ -copier = $copier; - } - - /** - * {@inheritdoc} - */ - public function apply($element) - { - $newElement = clone $element; - - $copy = $this->createCopyClosure(); - - return $copy($newElement); - } - - private function createCopyClosure() - { - $copier = $this->copier; - - $copy = function (SplDoublyLinkedList $list) use ($copier) { - // Replace each element in the list with a deep copy of itself - for ($i = 1; $i <= $list->count(); $i++) { - $copy = $copier->recursiveCopy($list->shift()); - - $list->push($copy); - } - - return $list; - }; - - return Closure::bind($copy, null, DeepCopy::class); - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php deleted file mode 100644 index 5785a7d..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php +++ /dev/null @@ -1,13 +0,0 @@ -type = $type; - } - - /** - * @param mixed $element - * - * @return boolean - */ - public function matches($element) - { - return is_object($element) ? is_a($element, $this->type) : gettype($element) === $this->type; - } -} diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php b/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php deleted file mode 100644 index 55dcc92..0000000 --- a/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php +++ /dev/null @@ -1,20 +0,0 @@ -copy($value); - } -} diff --git a/vendor/myclabs/php-enum/LICENSE b/vendor/myclabs/php-enum/LICENSE deleted file mode 100644 index 2a8cf22..0000000 --- a/vendor/myclabs/php-enum/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 My C-Labs - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT -NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/myclabs/php-enum/README.md b/vendor/myclabs/php-enum/README.md deleted file mode 100644 index bf1c91d..0000000 --- a/vendor/myclabs/php-enum/README.md +++ /dev/null @@ -1,134 +0,0 @@ -# PHP Enum implementation inspired from SplEnum - -[![Build Status](https://travis-ci.org/myclabs/php-enum.png?branch=master)](https://travis-ci.org/myclabs/php-enum) -[![Latest Stable Version](https://poser.pugx.org/myclabs/php-enum/version.png)](https://packagist.org/packages/myclabs/php-enum) -[![Total Downloads](https://poser.pugx.org/myclabs/php-enum/downloads.png)](https://packagist.org/packages/myclabs/php-enum) -[![psalm](https://shepherd.dev/github/myclabs/php-enum/coverage.svg)](https://shepherd.dev/github/myclabs/php-enum) - -Maintenance for this project is [supported via Tidelift](https://tidelift.com/subscription/pkg/packagist-myclabs-php-enum?utm_source=packagist-myclabs-php-enum&utm_medium=referral&utm_campaign=readme). - -## Why? - -First, and mainly, `SplEnum` is not integrated to PHP, you have to install the extension separately. - -Using an enum instead of class constants provides the following advantages: - -- You can use an enum as a parameter type: `function setAction(Action $action) {` -- You can use an enum as a return type: `function getAction() : Action {` -- You can enrich the enum with methods (e.g. `format`, `parse`, …) -- You can extend the enum to add new values (make your enum `final` to prevent it) -- You can get a list of all the possible values (see below) - -This Enum class is not intended to replace class constants, but only to be used when it makes sense. - -## Installation - -``` -composer require myclabs/php-enum -``` - -## Declaration - -```php -use MyCLabs\Enum\Enum; - -/** - * Action enum - */ -class Action extends Enum -{ - private const VIEW = 'view'; - private const EDIT = 'edit'; -} -``` - -## Usage - -```php -$action = Action::VIEW(); - -// or with a dynamic key: -$action = Action::$key(); -// or with a dynamic value: -$action = new Action($value); -``` - -As you can see, static methods are automatically implemented to provide quick access to an enum value. - -One advantage over using class constants is to be able to use an enum as a parameter type: - -```php -function setAction(Action $action) { - // ... -} -``` - -## Documentation - -- `__construct()` The constructor checks that the value exist in the enum -- `__toString()` You can `echo $myValue`, it will display the enum value (value of the constant) -- `getValue()` Returns the current value of the enum -- `getKey()` Returns the key of the current value on Enum -- `equals()` Tests whether enum instances are equal (returns `true` if enum values are equal, `false` otherwise) - -Static methods: - -- `toArray()` method Returns all possible values as an array (constant name in key, constant value in value) -- `keys()` Returns the names (keys) of all constants in the Enum class -- `values()` Returns instances of the Enum class of all Enum constants (constant name in key, Enum instance in value) -- `isValid()` Check if tested value is valid on enum set -- `isValidKey()` Check if tested key is valid on enum set -- `search()` Return key for searched value - -### Static methods - -```php -class Action extends Enum -{ - private const VIEW = 'view'; - private const EDIT = 'edit'; -} - -// Static method: -$action = Action::VIEW(); -$action = Action::EDIT(); -``` - -Static method helpers are implemented using [`__callStatic()`](http://www.php.net/manual/en/language.oop5.overloading.php#object.callstatic). - -If you care about IDE autocompletion, you can either implement the static methods yourself: - -```php -class Action extends Enum -{ - private const VIEW = 'view'; - - /** - * @return Action - */ - public static function VIEW() { - return new Action(self::VIEW); - } -} -``` - -or you can use phpdoc (this is supported in PhpStorm for example): - -```php -/** - * @method static Action VIEW() - * @method static Action EDIT() - */ -class Action extends Enum -{ - private const VIEW = 'view'; - private const EDIT = 'edit'; -} -``` - -## Related projects - -- [Doctrine enum mapping](https://github.com/acelaya/doctrine-enum-type) -- [Symfony ParamConverter integration](https://github.com/Ex3v/MyCLabsEnumParamConverter) -- [PHPStan integration](https://github.com/timeweb/phpstan-enum) -- [Yii2 enum mapping](https://github.com/KartaviK/yii2-enum) diff --git a/vendor/myclabs/php-enum/SECURITY.md b/vendor/myclabs/php-enum/SECURITY.md deleted file mode 100644 index 84fd4e3..0000000 --- a/vendor/myclabs/php-enum/SECURITY.md +++ /dev/null @@ -1,11 +0,0 @@ -# Security Policy - -## Supported Versions - -Only the latest stable release is supported. - -## Reporting a Vulnerability - -To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). - -Tidelift will coordinate the fix and disclosure. diff --git a/vendor/myclabs/php-enum/composer.json b/vendor/myclabs/php-enum/composer.json deleted file mode 100644 index 6861a5c..0000000 --- a/vendor/myclabs/php-enum/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "myclabs/php-enum", - "type": "library", - "description": "PHP Enum implementation", - "keywords": ["enum"], - "homepage": "http://github.com/myclabs/php-enum", - "license": "MIT", - "authors": [ - { - "name": "PHP Enum contributors", - "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" - } - ], - "autoload": { - "psr-4": { - "MyCLabs\\Enum\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "MyCLabs\\Tests\\Enum\\": "tests/" - } - }, - "require": { - "php": ">=7.1", - "ext-json": "*" - }, - "require-dev": { - "phpunit/phpunit": "^7", - "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^3.8" - } -} diff --git a/vendor/myclabs/php-enum/psalm.xml b/vendor/myclabs/php-enum/psalm.xml deleted file mode 100644 index b07e929..0000000 --- a/vendor/myclabs/php-enum/psalm.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - diff --git a/vendor/myclabs/php-enum/src/Enum.php b/vendor/myclabs/php-enum/src/Enum.php deleted file mode 100644 index b8b9327..0000000 --- a/vendor/myclabs/php-enum/src/Enum.php +++ /dev/null @@ -1,250 +0,0 @@ - - * @author Daniel Costa - * @author Mirosław Filip - * - * @psalm-template T - * @psalm-immutable - */ -abstract class Enum implements \JsonSerializable -{ - /** - * Enum value - * - * @var mixed - * @psalm-var T - */ - protected $value; - - /** - * Store existing constants in a static cache per object. - * - * - * @var array - * @psalm-var array> - */ - protected static $cache = []; - - /** - * Cache of instances of the Enum class - * - * @var array - * @psalm-var array> - */ - protected static $instances = []; - - /** - * Creates a new value of some type - * - * @psalm-pure - * @param mixed $value - * - * @psalm-param static|T $value - * @throws \UnexpectedValueException if incompatible type is given. - */ - public function __construct($value) - { - if ($value instanceof static) { - /** @psalm-var T */ - $value = $value->getValue(); - } - - if (!$this->isValid($value)) { - /** @psalm-suppress InvalidCast */ - throw new \UnexpectedValueException("Value '$value' is not part of the enum " . static::class); - } - - /** @psalm-var T */ - $this->value = $value; - } - - /** - * @psalm-pure - * @return mixed - * @psalm-return T - */ - public function getValue() - { - return $this->value; - } - - /** - * Returns the enum key (i.e. the constant name). - * - * @psalm-pure - * @return mixed - */ - public function getKey() - { - return static::search($this->value); - } - - /** - * @psalm-pure - * @psalm-suppress InvalidCast - * @return string - */ - public function __toString() - { - return (string)$this->value; - } - - /** - * Determines if Enum should be considered equal with the variable passed as a parameter. - * Returns false if an argument is an object of different class or not an object. - * - * This method is final, for more information read https://github.com/myclabs/php-enum/issues/4 - * - * @psalm-pure - * @psalm-param mixed $variable - * @return bool - */ - final public function equals($variable = null): bool - { - return $variable instanceof self - && $this->getValue() === $variable->getValue() - && static::class === \get_class($variable); - } - - /** - * Returns the names (keys) of all constants in the Enum class - * - * @psalm-pure - * @psalm-return list - * @return array - */ - public static function keys() - { - return \array_keys(static::toArray()); - } - - /** - * Returns instances of the Enum class of all Enum constants - * - * @psalm-pure - * @psalm-return array - * @return static[] Constant name in key, Enum instance in value - */ - public static function values() - { - $values = array(); - - /** @psalm-var T $value */ - foreach (static::toArray() as $key => $value) { - $values[$key] = new static($value); - } - - return $values; - } - - /** - * Returns all possible values as an array - * - * @psalm-pure - * @psalm-suppress ImpureStaticProperty - * - * @psalm-return array - * @return array Constant name in key, constant value in value - */ - public static function toArray() - { - $class = static::class; - - if (!isset(static::$cache[$class])) { - $reflection = new \ReflectionClass($class); - static::$cache[$class] = $reflection->getConstants(); - } - - return static::$cache[$class]; - } - - /** - * Check if is valid enum value - * - * @param $value - * @psalm-param mixed $value - * @psalm-pure - * @return bool - */ - public static function isValid($value) - { - return \in_array($value, static::toArray(), true); - } - - /** - * Check if is valid enum key - * - * @param $key - * @psalm-param string $key - * @psalm-pure - * @return bool - */ - public static function isValidKey($key) - { - $array = static::toArray(); - - return isset($array[$key]) || \array_key_exists($key, $array); - } - - /** - * Return key for value - * - * @param $value - * - * @psalm-param mixed $value - * @psalm-pure - * @return mixed - */ - public static function search($value) - { - return \array_search($value, static::toArray(), true); - } - - /** - * Returns a value when called statically like so: MyEnum::SOME_VALUE() given SOME_VALUE is a class constant - * - * @param string $name - * @param array $arguments - * - * @return static - * @throws \BadMethodCallException - */ - public static function __callStatic($name, $arguments) - { - $class = static::class; - if (!isset(self::$instances[$class][$name])) { - $array = static::toArray(); - if (!isset($array[$name]) && !\array_key_exists($name, $array)) { - $message = "No static method or enum constant '$name' in class " . static::class; - throw new \BadMethodCallException($message); - } - return self::$instances[$class][$name] = new static($array[$name]); - } - return clone self::$instances[$class][$name]; - } - - /** - * Specify data which should be serialized to JSON. This method returns data that can be serialized by json_encode() - * natively. - * - * @return mixed - * @link http://php.net/manual/en/jsonserializable.jsonserialize.php - * @psalm-pure - */ - public function jsonSerialize() - { - return $this->getValue(); - } -} diff --git a/vendor/myclabs/php-enum/src/PHPUnit/Comparator.php b/vendor/myclabs/php-enum/src/PHPUnit/Comparator.php deleted file mode 100644 index 302bf80..0000000 --- a/vendor/myclabs/php-enum/src/PHPUnit/Comparator.php +++ /dev/null @@ -1,54 +0,0 @@ -register(new \MyCLabs\Enum\PHPUnit\Comparator()); - */ -final class Comparator extends \SebastianBergmann\Comparator\Comparator -{ - public function accepts($expected, $actual) - { - return $expected instanceof Enum && ( - $actual instanceof Enum || $actual === null - ); - } - - /** - * @param Enum $expected - * @param Enum|null $actual - * - * @return void - */ - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false) - { - if ($expected->equals($actual)) { - return; - } - - throw new ComparisonFailure( - $expected, - $actual, - $this->formatEnum($expected), - $this->formatEnum($actual), - false, - 'Failed asserting that two Enums are equal.' - ); - } - - private function formatEnum(Enum $enum = null) - { - if ($enum === null) { - return "null"; - } - - return get_class($enum)."::{$enum->getKey()}()"; - } -} diff --git a/vendor/phar-io/manifest/.gitignore b/vendor/phar-io/manifest/.gitignore deleted file mode 100644 index 374459d..0000000 --- a/vendor/phar-io/manifest/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/.idea -/.php_cs.cache -/src/autoload.php -/tools -/vendor - -/build diff --git a/vendor/phar-io/manifest/.php_cs b/vendor/phar-io/manifest/.php_cs deleted file mode 100644 index 159d6a3..0000000 --- a/vendor/phar-io/manifest/.php_cs +++ /dev/null @@ -1,67 +0,0 @@ -files() - ->in('src') - ->in('tests') - ->name('*.php'); - -return Symfony\CS\Config\Config::create() - ->setUsingCache(true) - ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) - ->fixers( - array( - 'align_double_arrow', - 'align_equals', - 'concat_with_spaces', - 'duplicate_semicolon', - 'elseif', - 'empty_return', - 'encoding', - 'eof_ending', - 'extra_empty_lines', - 'function_call_space', - 'function_declaration', - 'indentation', - 'join_function', - 'line_after_namespace', - 'linefeed', - 'list_commas', - 'lowercase_constants', - 'lowercase_keywords', - 'method_argument_space', - 'multiple_use', - 'namespace_no_leading_whitespace', - 'no_blank_lines_after_class_opening', - 'no_empty_lines_after_phpdocs', - 'parenthesis', - 'php_closing_tag', - 'phpdoc_indent', - 'phpdoc_no_access', - 'phpdoc_no_empty_return', - 'phpdoc_no_package', - 'phpdoc_params', - 'phpdoc_scalar', - 'phpdoc_separation', - 'phpdoc_to_comment', - 'phpdoc_trim', - 'phpdoc_types', - 'phpdoc_var_without_name', - 'remove_lines_between_uses', - 'return', - 'self_accessor', - 'short_array_syntax', - 'short_tag', - 'single_line_after_imports', - 'single_quote', - 'spaces_before_semicolon', - 'spaces_cast', - 'ternary_spaces', - 'trailing_spaces', - 'trim_array_spaces', - 'unused_use', - 'visibility', - 'whitespacy_lines' - ) - ) - ->finder($finder); - diff --git a/vendor/phar-io/manifest/.travis.yml b/vendor/phar-io/manifest/.travis.yml deleted file mode 100644 index b4be10f..0000000 --- a/vendor/phar-io/manifest/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -os: -- linux - -language: php - -before_install: - - wget https://phar.io/releases/phive.phar - - wget https://phar.io/releases/phive.phar.asc - - gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys 0x9B2D5D79 - - gpg --verify phive.phar.asc phive.phar - - chmod +x phive.phar - - sudo mv phive.phar /usr/bin/phive - -install: - - ant setup - -script: ./tools/phpunit - -php: - - 5.6 - - 7.0 - - 7.1 - - 7.0snapshot - - 7.1snapshot - - master - -matrix: - allow_failures: - - php: master - fast_finish: true - -notifications: - email: false diff --git a/vendor/phar-io/manifest/LICENSE b/vendor/phar-io/manifest/LICENSE deleted file mode 100644 index 96051b1..0000000 --- a/vendor/phar-io/manifest/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -manifest - -Copyright (c) 2016 Arne Blankerts , Sebastian Heuer , Sebastian Bergmann , and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Arne Blankerts nor the names of contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/phar-io/manifest/README.md b/vendor/phar-io/manifest/README.md deleted file mode 100644 index e6d0b05..0000000 --- a/vendor/phar-io/manifest/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Manifest - -Component for reading [phar.io](https://phar.io/) manifest information from a [PHP Archive (PHAR)](http://php.net/phar). - -[![Build Status](https://travis-ci.org/phar-io/manifest.svg?branch=master)](https://travis-ci.org/phar-io/manifest) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/phar-io/manifest/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/phar-io/manifest/?branch=master) -[![SensioLabsInsight](https://insight.sensiolabs.com/projects/d8cc6035-69ad-477d-bd1a-ccc605480fd7/mini.png)](https://insight.sensiolabs.com/projects/d8cc6035-69ad-477d-bd1a-ccc605480fd7) - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phar-io/manifest - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phar-io/manifest - -## Usage - -```php -use PharIo\Manifest\ManifestLoader; -use PharIo\Manifest\ManifestSerializer; - -$manifest = ManifestLoader::fromFile('manifest.xml'); - -var_dump($manifest); - -echo (new ManifestSerializer)->serializeToString($manifest); -``` diff --git a/vendor/phar-io/manifest/build.xml b/vendor/phar-io/manifest/build.xml deleted file mode 100644 index fc6eb1a..0000000 --- a/vendor/phar-io/manifest/build.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phar-io/manifest/composer.json b/vendor/phar-io/manifest/composer.json deleted file mode 100644 index cfaa7fa..0000000 --- a/vendor/phar-io/manifest/composer.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "phar-io/manifest", - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "support": { - "issues": "https://github.com/phar-io/manifest/issues" - }, - "require": { - "php": "^5.6 || ^7.0", - "ext-dom": "*", - "ext-phar": "*", - "phar-io/version": "^2.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} - diff --git a/vendor/phar-io/manifest/composer.lock b/vendor/phar-io/manifest/composer.lock deleted file mode 100644 index d876819..0000000 --- a/vendor/phar-io/manifest/composer.lock +++ /dev/null @@ -1,69 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "content-hash": "f00846dde236d314a19d00d268d737dd", - "packages": [ - { - "name": "phar-io/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2018-07-08T19:19:57+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^5.6 || ^7.0", - "ext-dom": "*", - "ext-phar": "*" - }, - "platform-dev": [] -} diff --git a/vendor/phar-io/manifest/examples/example-01.php b/vendor/phar-io/manifest/examples/example-01.php deleted file mode 100644 index 345c407..0000000 --- a/vendor/phar-io/manifest/examples/example-01.php +++ /dev/null @@ -1,23 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use PharIo\Manifest\ManifestLoader; -use PharIo\Manifest\ManifestSerializer; - -require __DIR__ . '/../vendor/autoload.php'; - -$manifest = ManifestLoader::fromFile(__DIR__ . '/../tests/_fixture/phpunit-5.6.5.xml'); - -echo sprintf( - "Manifest for %s (%s):\n\n", - $manifest->getName(), - $manifest->getVersion()->getVersionString() -); -echo (new ManifestSerializer)->serializeToString($manifest); diff --git a/vendor/phar-io/manifest/phive.xml b/vendor/phar-io/manifest/phive.xml deleted file mode 100644 index 69f2f91..0000000 --- a/vendor/phar-io/manifest/phive.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/vendor/phar-io/manifest/phpunit.xml b/vendor/phar-io/manifest/phpunit.xml deleted file mode 100644 index 2d7708e..0000000 --- a/vendor/phar-io/manifest/phpunit.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - tests - - - - - src - - - diff --git a/vendor/phar-io/manifest/src/ManifestDocumentMapper.php b/vendor/phar-io/manifest/src/ManifestDocumentMapper.php deleted file mode 100644 index d41e4f9..0000000 --- a/vendor/phar-io/manifest/src/ManifestDocumentMapper.php +++ /dev/null @@ -1,193 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PharIo\Version\Exception as VersionException; -use PharIo\Version\VersionConstraintParser; - -class ManifestDocumentMapper { - /** - * @param ManifestDocument $document - * - * @returns Manifest - * - * @throws ManifestDocumentMapperException - */ - public function map(ManifestDocument $document) { - try { - $contains = $document->getContainsElement(); - $type = $this->mapType($contains); - $copyright = $this->mapCopyright($document->getCopyrightElement()); - $requirements = $this->mapRequirements($document->getRequiresElement()); - $bundledComponents = $this->mapBundledComponents($document); - - return new Manifest( - new ApplicationName($contains->getName()), - new Version($contains->getVersion()), - $type, - $copyright, - $requirements, - $bundledComponents - ); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException($e->getMessage(), $e->getCode(), $e); - } catch (Exception $e) { - throw new ManifestDocumentMapperException($e->getMessage(), $e->getCode(), $e); - } - } - - /** - * @param ContainsElement $contains - * - * @return Type - * - * @throws ManifestDocumentMapperException - */ - private function mapType(ContainsElement $contains) { - switch ($contains->getType()) { - case 'application': - return Type::application(); - case 'library': - return Type::library(); - case 'extension': - return $this->mapExtension($contains->getExtensionElement()); - } - - throw new ManifestDocumentMapperException( - sprintf('Unsupported type %s', $contains->getType()) - ); - } - - /** - * @param CopyrightElement $copyright - * - * @return CopyrightInformation - * - * @throws InvalidUrlException - * @throws InvalidEmailException - */ - private function mapCopyright(CopyrightElement $copyright) { - $authors = new AuthorCollection(); - - foreach($copyright->getAuthorElements() as $authorElement) { - $authors->add( - new Author( - $authorElement->getName(), - new Email($authorElement->getEmail()) - ) - ); - } - - $licenseElement = $copyright->getLicenseElement(); - $license = new License( - $licenseElement->getType(), - new Url($licenseElement->getUrl()) - ); - - return new CopyrightInformation( - $authors, - $license - ); - } - - /** - * @param RequiresElement $requires - * - * @return RequirementCollection - * - * @throws ManifestDocumentMapperException - */ - private function mapRequirements(RequiresElement $requires) { - $collection = new RequirementCollection(); - $phpElement = $requires->getPHPElement(); - $parser = new VersionConstraintParser; - - try { - $versionConstraint = $parser->parse($phpElement->getVersion()); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException( - sprintf('Unsupported version constraint - %s', $e->getMessage()), - $e->getCode(), - $e - ); - } - - $collection->add( - new PhpVersionRequirement( - $versionConstraint - ) - ); - - if (!$phpElement->hasExtElements()) { - return $collection; - } - - foreach($phpElement->getExtElements() as $extElement) { - $collection->add( - new PhpExtensionRequirement($extElement->getName()) - ); - } - - return $collection; - } - - /** - * @param ManifestDocument $document - * - * @return BundledComponentCollection - */ - private function mapBundledComponents(ManifestDocument $document) { - $collection = new BundledComponentCollection(); - - if (!$document->hasBundlesElement()) { - return $collection; - } - - foreach($document->getBundlesElement()->getComponentElements() as $componentElement) { - $collection->add( - new BundledComponent( - $componentElement->getName(), - new Version( - $componentElement->getVersion() - ) - ) - ); - } - - return $collection; - } - - /** - * @param ExtensionElement $extension - * - * @return Extension - * - * @throws ManifestDocumentMapperException - */ - private function mapExtension(ExtensionElement $extension) { - try { - $parser = new VersionConstraintParser; - $versionConstraint = $parser->parse($extension->getCompatible()); - - return Type::extension( - new ApplicationName($extension->getFor()), - $versionConstraint - ); - } catch (VersionException $e) { - throw new ManifestDocumentMapperException( - sprintf('Unsupported version constraint - %s', $e->getMessage()), - $e->getCode(), - $e - ); - } - } -} diff --git a/vendor/phar-io/manifest/src/ManifestLoader.php b/vendor/phar-io/manifest/src/ManifestLoader.php deleted file mode 100644 index 81c5c90..0000000 --- a/vendor/phar-io/manifest/src/ManifestLoader.php +++ /dev/null @@ -1,66 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ManifestLoader { - /** - * @param string $filename - * - * @return Manifest - * - * @throws ManifestLoaderException - */ - public static function fromFile($filename) { - try { - return (new ManifestDocumentMapper())->map( - ManifestDocument::fromFile($filename) - ); - } catch (Exception $e) { - throw new ManifestLoaderException( - sprintf('Loading %s failed.', $filename), - $e->getCode(), - $e - ); - } - } - - /** - * @param string $filename - * - * @return Manifest - * - * @throws ManifestLoaderException - */ - public static function fromPhar($filename) { - return self::fromFile('phar://' . $filename . '/manifest.xml'); - } - - /** - * @param string $manifest - * - * @return Manifest - * - * @throws ManifestLoaderException - */ - public static function fromString($manifest) { - try { - return (new ManifestDocumentMapper())->map( - ManifestDocument::fromString($manifest) - ); - } catch (Exception $e) { - throw new ManifestLoaderException( - 'Processing string failed', - $e->getCode(), - $e - ); - } - } -} diff --git a/vendor/phar-io/manifest/src/ManifestSerializer.php b/vendor/phar-io/manifest/src/ManifestSerializer.php deleted file mode 100644 index 4c18ddd..0000000 --- a/vendor/phar-io/manifest/src/ManifestSerializer.php +++ /dev/null @@ -1,163 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\AnyVersionConstraint; -use PharIo\Version\Version; -use PharIo\Version\VersionConstraint; -use XMLWriter; - -class ManifestSerializer { - /** - * @var XMLWriter - */ - private $xmlWriter; - - public function serializeToFile(Manifest $manifest, $filename) { - file_put_contents( - $filename, - $this->serializeToString($manifest) - ); - } - - public function serializeToString(Manifest $manifest) { - $this->startDocument(); - - $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType()); - $this->addCopyright($manifest->getCopyrightInformation()); - $this->addRequirements($manifest->getRequirements()); - $this->addBundles($manifest->getBundledComponents()); - - return $this->finishDocument(); - } - - private function startDocument() { - $xmlWriter = new XMLWriter(); - $xmlWriter->openMemory(); - $xmlWriter->setIndent(true); - $xmlWriter->setIndentString(str_repeat(' ', 4)); - $xmlWriter->startDocument('1.0', 'UTF-8'); - $xmlWriter->startElement('phar'); - $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0'); - - $this->xmlWriter = $xmlWriter; - } - - private function finishDocument() { - $this->xmlWriter->endElement(); - $this->xmlWriter->endDocument(); - - return $this->xmlWriter->outputMemory(); - } - - private function addContains($name, Version $version, Type $type) { - $this->xmlWriter->startElement('contains'); - $this->xmlWriter->writeAttribute('name', $name); - $this->xmlWriter->writeAttribute('version', $version->getVersionString()); - - switch (true) { - case $type->isApplication(): { - $this->xmlWriter->writeAttribute('type', 'application'); - break; - } - - case $type->isLibrary(): { - $this->xmlWriter->writeAttribute('type', 'library'); - break; - } - - case $type->isExtension(): { - /* @var $type Extension */ - $this->xmlWriter->writeAttribute('type', 'extension'); - $this->addExtension($type->getApplicationName(), $type->getVersionConstraint()); - break; - } - - default: { - $this->xmlWriter->writeAttribute('type', 'custom'); - } - } - - $this->xmlWriter->endElement(); - } - - private function addCopyright(CopyrightInformation $copyrightInformation) { - $this->xmlWriter->startElement('copyright'); - - foreach($copyrightInformation->getAuthors() as $author) { - $this->xmlWriter->startElement('author'); - $this->xmlWriter->writeAttribute('name', $author->getName()); - $this->xmlWriter->writeAttribute('email', (string) $author->getEmail()); - $this->xmlWriter->endElement(); - } - - $license = $copyrightInformation->getLicense(); - - $this->xmlWriter->startElement('license'); - $this->xmlWriter->writeAttribute('type', $license->getName()); - $this->xmlWriter->writeAttribute('url', $license->getUrl()); - $this->xmlWriter->endElement(); - - $this->xmlWriter->endElement(); - } - - private function addRequirements(RequirementCollection $requirementCollection) { - $phpRequirement = new AnyVersionConstraint(); - $extensions = []; - - foreach($requirementCollection as $requirement) { - if ($requirement instanceof PhpVersionRequirement) { - $phpRequirement = $requirement->getVersionConstraint(); - continue; - } - - if ($requirement instanceof PhpExtensionRequirement) { - $extensions[] = (string) $requirement; - } - } - - $this->xmlWriter->startElement('requires'); - $this->xmlWriter->startElement('php'); - $this->xmlWriter->writeAttribute('version', $phpRequirement->asString()); - - foreach($extensions as $extension) { - $this->xmlWriter->startElement('ext'); - $this->xmlWriter->writeAttribute('name', $extension); - $this->xmlWriter->endElement(); - } - - $this->xmlWriter->endElement(); - $this->xmlWriter->endElement(); - } - - private function addBundles(BundledComponentCollection $bundledComponentCollection) { - if (count($bundledComponentCollection) === 0) { - return; - } - $this->xmlWriter->startElement('bundles'); - - foreach($bundledComponentCollection as $bundledComponent) { - $this->xmlWriter->startElement('component'); - $this->xmlWriter->writeAttribute('name', $bundledComponent->getName()); - $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString()); - $this->xmlWriter->endElement(); - } - - $this->xmlWriter->endElement(); - } - - private function addExtension($application, VersionConstraint $versionConstraint) { - $this->xmlWriter->startElement('extension'); - $this->xmlWriter->writeAttribute('for', $application); - $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString()); - $this->xmlWriter->endElement(); - } -} diff --git a/vendor/phar-io/manifest/src/exceptions/Exception.php b/vendor/phar-io/manifest/src/exceptions/Exception.php deleted file mode 100644 index 3ce46f2..0000000 --- a/vendor/phar-io/manifest/src/exceptions/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -interface Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php b/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php deleted file mode 100644 index a53735a..0000000 --- a/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php +++ /dev/null @@ -1,16 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class InvalidApplicationNameException extends \InvalidArgumentException implements Exception { - const NotAString = 1; - const InvalidFormat = 2; -} diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php b/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php deleted file mode 100644 index 854399b..0000000 --- a/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php +++ /dev/null @@ -1,14 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class InvalidEmailException extends \InvalidArgumentException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php b/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php deleted file mode 100644 index cdd8323..0000000 --- a/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php +++ /dev/null @@ -1,14 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class InvalidUrlException extends \InvalidArgumentException implements Exception { -} diff --git a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php b/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php deleted file mode 100644 index 8b40195..0000000 --- a/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php +++ /dev/null @@ -1,6 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class Application extends Type { - /** - * @return bool - */ - public function isApplication() { - return true; - } -} diff --git a/vendor/phar-io/manifest/src/values/ApplicationName.php b/vendor/phar-io/manifest/src/values/ApplicationName.php deleted file mode 100644 index 1e71af4..0000000 --- a/vendor/phar-io/manifest/src/values/ApplicationName.php +++ /dev/null @@ -1,65 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ApplicationName { - /** - * @var string - */ - private $name; - - /** - * ApplicationName constructor. - * - * @param string $name - * - * @throws InvalidApplicationNameException - */ - public function __construct($name) { - $this->ensureIsString($name); - $this->ensureValidFormat($name); - $this->name = $name; - } - - /** - * @return string - */ - public function __toString() { - return $this->name; - } - - public function isEqual(ApplicationName $name) { - return $this->name === $name->name; - } - - /** - * @param string $name - * - * @throws InvalidApplicationNameException - */ - private function ensureValidFormat($name) { - if (!preg_match('#\w/\w#', $name)) { - throw new InvalidApplicationNameException( - sprintf('Format of name "%s" is not valid - expected: vendor/packagename', $name), - InvalidApplicationNameException::InvalidFormat - ); - } - } - - private function ensureIsString($name) { - if (!is_string($name)) { - throw new InvalidApplicationNameException( - 'Name must be a string', - InvalidApplicationNameException::NotAString - ); - } - } -} diff --git a/vendor/phar-io/manifest/src/values/Author.php b/vendor/phar-io/manifest/src/values/Author.php deleted file mode 100644 index 8295f51..0000000 --- a/vendor/phar-io/manifest/src/values/Author.php +++ /dev/null @@ -1,57 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class Author { - /** - * @var string - */ - private $name; - - /** - * @var Email - */ - private $email; - - /** - * @param string $name - * @param Email $email - */ - public function __construct($name, Email $email) { - $this->name = $name; - $this->email = $email; - } - - /** - * @return string - */ - public function getName() { - return $this->name; - } - - /** - * @return Email - */ - public function getEmail() { - return $this->email; - } - - /** - * @return string - */ - public function __toString() { - return sprintf( - '%s <%s>', - $this->name, - $this->email - ); - } -} diff --git a/vendor/phar-io/manifest/src/values/AuthorCollection.php b/vendor/phar-io/manifest/src/values/AuthorCollection.php deleted file mode 100644 index d915879..0000000 --- a/vendor/phar-io/manifest/src/values/AuthorCollection.php +++ /dev/null @@ -1,43 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class AuthorCollection implements \Countable, \IteratorAggregate { - /** - * @var Author[] - */ - private $authors = []; - - public function add(Author $author) { - $this->authors[] = $author; - } - - /** - * @return Author[] - */ - public function getAuthors() { - return $this->authors; - } - - /** - * @return int - */ - public function count() { - return count($this->authors); - } - - /** - * @return AuthorCollectionIterator - */ - public function getIterator() { - return new AuthorCollectionIterator($this); - } -} diff --git a/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php b/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php deleted file mode 100644 index 792a050..0000000 --- a/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php +++ /dev/null @@ -1,56 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class AuthorCollectionIterator implements \Iterator { - /** - * @var Author[] - */ - private $authors = []; - - /** - * @var int - */ - private $position; - - public function __construct(AuthorCollection $authors) { - $this->authors = $authors->getAuthors(); - } - - public function rewind() { - $this->position = 0; - } - - /** - * @return bool - */ - public function valid() { - return $this->position < count($this->authors); - } - - /** - * @return int - */ - public function key() { - return $this->position; - } - - /** - * @return Author - */ - public function current() { - return $this->authors[$this->position]; - } - - public function next() { - $this->position++; - } -} diff --git a/vendor/phar-io/manifest/src/values/BundledComponent.php b/vendor/phar-io/manifest/src/values/BundledComponent.php deleted file mode 100644 index 846d15a..0000000 --- a/vendor/phar-io/manifest/src/values/BundledComponent.php +++ /dev/null @@ -1,48 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; - -class BundledComponent { - /** - * @var string - */ - private $name; - - /** - * @var Version - */ - private $version; - - /** - * @param string $name - * @param Version $version - */ - public function __construct($name, Version $version) { - $this->name = $name; - $this->version = $version; - } - - /** - * @return string - */ - public function getName() { - return $this->name; - } - - /** - * @return Version - */ - public function getVersion() { - return $this->version; - } -} diff --git a/vendor/phar-io/manifest/src/values/BundledComponentCollection.php b/vendor/phar-io/manifest/src/values/BundledComponentCollection.php deleted file mode 100644 index 2dbb918..0000000 --- a/vendor/phar-io/manifest/src/values/BundledComponentCollection.php +++ /dev/null @@ -1,43 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class BundledComponentCollection implements \Countable, \IteratorAggregate { - /** - * @var BundledComponent[] - */ - private $bundledComponents = []; - - public function add(BundledComponent $bundledComponent) { - $this->bundledComponents[] = $bundledComponent; - } - - /** - * @return BundledComponent[] - */ - public function getBundledComponents() { - return $this->bundledComponents; - } - - /** - * @return int - */ - public function count() { - return count($this->bundledComponents); - } - - /** - * @return BundledComponentCollectionIterator - */ - public function getIterator() { - return new BundledComponentCollectionIterator($this); - } -} diff --git a/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php b/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php deleted file mode 100644 index 13b8f05..0000000 --- a/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php +++ /dev/null @@ -1,56 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class BundledComponentCollectionIterator implements \Iterator { - /** - * @var BundledComponent[] - */ - private $bundledComponents = []; - - /** - * @var int - */ - private $position; - - public function __construct(BundledComponentCollection $bundledComponents) { - $this->bundledComponents = $bundledComponents->getBundledComponents(); - } - - public function rewind() { - $this->position = 0; - } - - /** - * @return bool - */ - public function valid() { - return $this->position < count($this->bundledComponents); - } - - /** - * @return int - */ - public function key() { - return $this->position; - } - - /** - * @return BundledComponent - */ - public function current() { - return $this->bundledComponents[$this->position]; - } - - public function next() { - $this->position++; - } -} diff --git a/vendor/phar-io/manifest/src/values/CopyrightInformation.php b/vendor/phar-io/manifest/src/values/CopyrightInformation.php deleted file mode 100644 index ece60b1..0000000 --- a/vendor/phar-io/manifest/src/values/CopyrightInformation.php +++ /dev/null @@ -1,42 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class CopyrightInformation { - /** - * @var AuthorCollection - */ - private $authors; - - /** - * @var License - */ - private $license; - - public function __construct(AuthorCollection $authors, License $license) { - $this->authors = $authors; - $this->license = $license; - } - - /** - * @return AuthorCollection - */ - public function getAuthors() { - return $this->authors; - } - - /** - * @return License - */ - public function getLicense() { - return $this->license; - } -} diff --git a/vendor/phar-io/manifest/src/values/Email.php b/vendor/phar-io/manifest/src/values/Email.php deleted file mode 100644 index 57cce04..0000000 --- a/vendor/phar-io/manifest/src/values/Email.php +++ /dev/null @@ -1,47 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class Email { - /** - * @var string - */ - private $email; - - /** - * @param string $email - * - * @throws InvalidEmailException - */ - public function __construct($email) { - $this->ensureEmailIsValid($email); - - $this->email = $email; - } - - /** - * @return string - */ - public function __toString() { - return $this->email; - } - - /** - * @param string $url - * - * @throws InvalidEmailException - */ - private function ensureEmailIsValid($url) { - if (filter_var($url, \FILTER_VALIDATE_EMAIL) === false) { - throw new InvalidEmailException; - } - } -} diff --git a/vendor/phar-io/manifest/src/values/Extension.php b/vendor/phar-io/manifest/src/values/Extension.php deleted file mode 100644 index 90d6a6f..0000000 --- a/vendor/phar-io/manifest/src/values/Extension.php +++ /dev/null @@ -1,75 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PharIo\Version\VersionConstraint; - -class Extension extends Type { - /** - * @var ApplicationName - */ - private $application; - - /** - * @var VersionConstraint - */ - private $versionConstraint; - - /** - * @param ApplicationName $application - * @param VersionConstraint $versionConstraint - */ - public function __construct(ApplicationName $application, VersionConstraint $versionConstraint) { - $this->application = $application; - $this->versionConstraint = $versionConstraint; - } - - /** - * @return ApplicationName - */ - public function getApplicationName() { - return $this->application; - } - - /** - * @return VersionConstraint - */ - public function getVersionConstraint() { - return $this->versionConstraint; - } - - /** - * @return bool - */ - public function isExtension() { - return true; - } - - /** - * @param ApplicationName $name - * - * @return bool - */ - public function isExtensionFor(ApplicationName $name) { - return $this->application->isEqual($name); - } - - /** - * @param ApplicationName $name - * @param Version $version - * - * @return bool - */ - public function isCompatibleWith(ApplicationName $name, Version $version) { - return $this->isExtensionFor($name) && $this->versionConstraint->complies($version); - } -} diff --git a/vendor/phar-io/manifest/src/values/Library.php b/vendor/phar-io/manifest/src/values/Library.php deleted file mode 100644 index a6ff944..0000000 --- a/vendor/phar-io/manifest/src/values/Library.php +++ /dev/null @@ -1,20 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class Library extends Type { - /** - * @return bool - */ - public function isLibrary() { - return true; - } -} diff --git a/vendor/phar-io/manifest/src/values/License.php b/vendor/phar-io/manifest/src/values/License.php deleted file mode 100644 index e278670..0000000 --- a/vendor/phar-io/manifest/src/values/License.php +++ /dev/null @@ -1,42 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class License { - /** - * @var string - */ - private $name; - - /** - * @var Url - */ - private $url; - - public function __construct($name, Url $url) { - $this->name = $name; - $this->url = $url; - } - - /** - * @return string - */ - public function getName() { - return $this->name; - } - - /** - * @return Url - */ - public function getUrl() { - return $this->url; - } -} diff --git a/vendor/phar-io/manifest/src/values/Manifest.php b/vendor/phar-io/manifest/src/values/Manifest.php deleted file mode 100644 index 217acef..0000000 --- a/vendor/phar-io/manifest/src/values/Manifest.php +++ /dev/null @@ -1,138 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; - -class Manifest { - /** - * @var ApplicationName - */ - private $name; - - /** - * @var Version - */ - private $version; - - /** - * @var Type - */ - private $type; - - /** - * @var CopyrightInformation - */ - private $copyrightInformation; - - /** - * @var RequirementCollection - */ - private $requirements; - - /** - * @var BundledComponentCollection - */ - private $bundledComponents; - - public function __construct(ApplicationName $name, Version $version, Type $type, CopyrightInformation $copyrightInformation, RequirementCollection $requirements, BundledComponentCollection $bundledComponents) { - $this->name = $name; - $this->version = $version; - $this->type = $type; - $this->copyrightInformation = $copyrightInformation; - $this->requirements = $requirements; - $this->bundledComponents = $bundledComponents; - } - - /** - * @return ApplicationName - */ - public function getName() { - return $this->name; - } - - /** - * @return Version - */ - public function getVersion() { - return $this->version; - } - - /** - * @return Type - */ - public function getType() { - return $this->type; - } - - /** - * @return CopyrightInformation - */ - public function getCopyrightInformation() { - return $this->copyrightInformation; - } - - /** - * @return RequirementCollection - */ - public function getRequirements() { - return $this->requirements; - } - - /** - * @return BundledComponentCollection - */ - public function getBundledComponents() { - return $this->bundledComponents; - } - - /** - * @return bool - */ - public function isApplication() { - return $this->type->isApplication(); - } - - /** - * @return bool - */ - public function isLibrary() { - return $this->type->isLibrary(); - } - - /** - * @return bool - */ - public function isExtension() { - return $this->type->isExtension(); - } - - /** - * @param ApplicationName $application - * @param Version|null $version - * - * @return bool - */ - public function isExtensionFor(ApplicationName $application, Version $version = null) { - if (!$this->isExtension()) { - return false; - } - - /** @var Extension $type */ - $type = $this->type; - - if ($version !== null) { - return $type->isCompatibleWith($application, $version); - } - - return $type->isExtensionFor($application); - } -} diff --git a/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php b/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php deleted file mode 100644 index 6dd9296..0000000 --- a/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php +++ /dev/null @@ -1,32 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class PhpExtensionRequirement implements Requirement { - /** - * @var string - */ - private $extension; - - /** - * @param string $extension - */ - public function __construct($extension) { - $this->extension = $extension; - } - - /** - * @return string - */ - public function __toString() { - return $this->extension; - } -} diff --git a/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php b/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php deleted file mode 100644 index 8ad3e76..0000000 --- a/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php +++ /dev/null @@ -1,31 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\VersionConstraint; - -class PhpVersionRequirement implements Requirement { - /** - * @var VersionConstraint - */ - private $versionConstraint; - - public function __construct(VersionConstraint $versionConstraint) { - $this->versionConstraint = $versionConstraint; - } - - /** - * @return VersionConstraint - */ - public function getVersionConstraint() { - return $this->versionConstraint; - } -} diff --git a/vendor/phar-io/manifest/src/values/Requirement.php b/vendor/phar-io/manifest/src/values/Requirement.php deleted file mode 100644 index 03bb56d..0000000 --- a/vendor/phar-io/manifest/src/values/Requirement.php +++ /dev/null @@ -1,14 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -interface Requirement { -} diff --git a/vendor/phar-io/manifest/src/values/RequirementCollection.php b/vendor/phar-io/manifest/src/values/RequirementCollection.php deleted file mode 100644 index af0e09b..0000000 --- a/vendor/phar-io/manifest/src/values/RequirementCollection.php +++ /dev/null @@ -1,43 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class RequirementCollection implements \Countable, \IteratorAggregate { - /** - * @var Requirement[] - */ - private $requirements = []; - - public function add(Requirement $requirement) { - $this->requirements[] = $requirement; - } - - /** - * @return Requirement[] - */ - public function getRequirements() { - return $this->requirements; - } - - /** - * @return int - */ - public function count() { - return count($this->requirements); - } - - /** - * @return RequirementCollectionIterator - */ - public function getIterator() { - return new RequirementCollectionIterator($this); - } -} diff --git a/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php b/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php deleted file mode 100644 index 9bb7003..0000000 --- a/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php +++ /dev/null @@ -1,56 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class RequirementCollectionIterator implements \Iterator { - /** - * @var Requirement[] - */ - private $requirements = []; - - /** - * @var int - */ - private $position; - - public function __construct(RequirementCollection $requirements) { - $this->requirements = $requirements->getRequirements(); - } - - public function rewind() { - $this->position = 0; - } - - /** - * @return bool - */ - public function valid() { - return $this->position < count($this->requirements); - } - - /** - * @return int - */ - public function key() { - return $this->position; - } - - /** - * @return Requirement - */ - public function current() { - return $this->requirements[$this->position]; - } - - public function next() { - $this->position++; - } -} diff --git a/vendor/phar-io/manifest/src/values/Type.php b/vendor/phar-io/manifest/src/values/Type.php deleted file mode 100644 index 31fbd44..0000000 --- a/vendor/phar-io/manifest/src/values/Type.php +++ /dev/null @@ -1,60 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\VersionConstraint; - -abstract class Type { - /** - * @return Application - */ - public static function application() { - return new Application; - } - - /** - * @return Library - */ - public static function library() { - return new Library; - } - - /** - * @param ApplicationName $application - * @param VersionConstraint $versionConstraint - * - * @return Extension - */ - public static function extension(ApplicationName $application, VersionConstraint $versionConstraint) { - return new Extension($application, $versionConstraint); - } - - /** - * @return bool - */ - public function isApplication() { - return false; - } - - /** - * @return bool - */ - public function isLibrary() { - return false; - } - - /** - * @return bool - */ - public function isExtension() { - return false; - } -} diff --git a/vendor/phar-io/manifest/src/values/Url.php b/vendor/phar-io/manifest/src/values/Url.php deleted file mode 100644 index 37917c8..0000000 --- a/vendor/phar-io/manifest/src/values/Url.php +++ /dev/null @@ -1,47 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class Url { - /** - * @var string - */ - private $url; - - /** - * @param string $url - * - * @throws InvalidUrlException - */ - public function __construct($url) { - $this->ensureUrlIsValid($url); - - $this->url = $url; - } - - /** - * @return string - */ - public function __toString() { - return $this->url; - } - - /** - * @param string $url - * - * @throws InvalidUrlException - */ - private function ensureUrlIsValid($url) { - if (filter_var($url, \FILTER_VALIDATE_URL) === false) { - throw new InvalidUrlException; - } - } -} diff --git a/vendor/phar-io/manifest/src/xml/AuthorElement.php b/vendor/phar-io/manifest/src/xml/AuthorElement.php deleted file mode 100644 index a32f397..0000000 --- a/vendor/phar-io/manifest/src/xml/AuthorElement.php +++ /dev/null @@ -1,21 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class AuthorElement extends ManifestElement { - public function getName() { - return $this->getAttributeValue('name'); - } - - public function getEmail() { - return $this->getAttributeValue('email'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php b/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php deleted file mode 100644 index 1240d8c..0000000 --- a/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php +++ /dev/null @@ -1,19 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class AuthorElementCollection extends ElementCollection { - public function current() { - return new AuthorElement( - $this->getCurrentElement() - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/BundlesElement.php b/vendor/phar-io/manifest/src/xml/BundlesElement.php deleted file mode 100644 index b90023e..0000000 --- a/vendor/phar-io/manifest/src/xml/BundlesElement.php +++ /dev/null @@ -1,19 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class BundlesElement extends ManifestElement { - public function getComponentElements() { - return new ComponentElementCollection( - $this->getChildrenByName('component') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ComponentElement.php b/vendor/phar-io/manifest/src/xml/ComponentElement.php deleted file mode 100644 index 64ed6b0..0000000 --- a/vendor/phar-io/manifest/src/xml/ComponentElement.php +++ /dev/null @@ -1,21 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ComponentElement extends ManifestElement { - public function getName() { - return $this->getAttributeValue('name'); - } - - public function getVersion() { - return $this->getAttributeValue('version'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php b/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php deleted file mode 100644 index 9d375f9..0000000 --- a/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php +++ /dev/null @@ -1,19 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ComponentElementCollection extends ElementCollection { - public function current() { - return new ComponentElement( - $this->getCurrentElement() - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ContainsElement.php b/vendor/phar-io/manifest/src/xml/ContainsElement.php deleted file mode 100644 index 8172f33..0000000 --- a/vendor/phar-io/manifest/src/xml/ContainsElement.php +++ /dev/null @@ -1,31 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ContainsElement extends ManifestElement { - public function getName() { - return $this->getAttributeValue('name'); - } - - public function getVersion() { - return $this->getAttributeValue('version'); - } - - public function getType() { - return $this->getAttributeValue('type'); - } - - public function getExtensionElement() { - return new ExtensionElement( - $this->getChildByName('extension') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/CopyrightElement.php b/vendor/phar-io/manifest/src/xml/CopyrightElement.php deleted file mode 100644 index bf7848e..0000000 --- a/vendor/phar-io/manifest/src/xml/CopyrightElement.php +++ /dev/null @@ -1,25 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class CopyrightElement extends ManifestElement { - public function getAuthorElements() { - return new AuthorElementCollection( - $this->getChildrenByName('author') - ); - } - - public function getLicenseElement() { - return new LicenseElement( - $this->getChildByName('license') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ElementCollection.php b/vendor/phar-io/manifest/src/xml/ElementCollection.php deleted file mode 100644 index 284e77b..0000000 --- a/vendor/phar-io/manifest/src/xml/ElementCollection.php +++ /dev/null @@ -1,58 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use DOMElement; -use DOMNodeList; - -abstract class ElementCollection implements \Iterator { - /** - * @var DOMNodeList - */ - private $nodeList; - - private $position; - - /** - * ElementCollection constructor. - * - * @param DOMNodeList $nodeList - */ - public function __construct(DOMNodeList $nodeList) { - $this->nodeList = $nodeList; - $this->position = 0; - } - - abstract public function current(); - - /** - * @return DOMElement - */ - protected function getCurrentElement() { - return $this->nodeList->item($this->position); - } - - public function next() { - $this->position++; - } - - public function key() { - return $this->position; - } - - public function valid() { - return $this->position < $this->nodeList->length; - } - - public function rewind() { - $this->position = 0; - } -} diff --git a/vendor/phar-io/manifest/src/xml/ExtElement.php b/vendor/phar-io/manifest/src/xml/ExtElement.php deleted file mode 100644 index 7a824ab..0000000 --- a/vendor/phar-io/manifest/src/xml/ExtElement.php +++ /dev/null @@ -1,17 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ExtElement extends ManifestElement { - public function getName() { - return $this->getAttributeValue('name'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ExtElementCollection.php b/vendor/phar-io/manifest/src/xml/ExtElementCollection.php deleted file mode 100644 index 17acc62..0000000 --- a/vendor/phar-io/manifest/src/xml/ExtElementCollection.php +++ /dev/null @@ -1,20 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ExtElementCollection extends ElementCollection { - public function current() { - return new ExtElement( - $this->getCurrentElement() - ); - } - -} diff --git a/vendor/phar-io/manifest/src/xml/ExtensionElement.php b/vendor/phar-io/manifest/src/xml/ExtensionElement.php deleted file mode 100644 index 536c085..0000000 --- a/vendor/phar-io/manifest/src/xml/ExtensionElement.php +++ /dev/null @@ -1,21 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class ExtensionElement extends ManifestElement { - public function getFor() { - return $this->getAttributeValue('for'); - } - - public function getCompatible() { - return $this->getAttributeValue('compatible'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/LicenseElement.php b/vendor/phar-io/manifest/src/xml/LicenseElement.php deleted file mode 100644 index ee001df..0000000 --- a/vendor/phar-io/manifest/src/xml/LicenseElement.php +++ /dev/null @@ -1,21 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class LicenseElement extends ManifestElement { - public function getType() { - return $this->getAttributeValue('type'); - } - - public function getUrl() { - return $this->getAttributeValue('url'); - } -} diff --git a/vendor/phar-io/manifest/src/xml/ManifestDocument.php b/vendor/phar-io/manifest/src/xml/ManifestDocument.php deleted file mode 100644 index 9b0bd9d..0000000 --- a/vendor/phar-io/manifest/src/xml/ManifestDocument.php +++ /dev/null @@ -1,118 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use DOMDocument; -use DOMElement; - -class ManifestDocument { - const XMLNS = 'https://phar.io/xml/manifest/1.0'; - - /** - * @var DOMDocument - */ - private $dom; - - /** - * ManifestDocument constructor. - * - * @param DOMDocument $dom - */ - private function __construct(DOMDocument $dom) { - $this->ensureCorrectDocumentType($dom); - - $this->dom = $dom; - } - - public static function fromFile($filename) { - if (!file_exists($filename)) { - throw new ManifestDocumentException( - sprintf('File "%s" not found', $filename) - ); - } - - return self::fromString( - file_get_contents($filename) - ); - } - - public static function fromString($xmlString) { - $prev = libxml_use_internal_errors(true); - libxml_clear_errors(); - - $dom = new DOMDocument(); - $dom->loadXML($xmlString); - - $errors = libxml_get_errors(); - libxml_use_internal_errors($prev); - - if (count($errors) !== 0) { - throw new ManifestDocumentLoadingException($errors); - } - - return new self($dom); - } - - public function getContainsElement() { - return new ContainsElement( - $this->fetchElementByName('contains') - ); - } - - public function getCopyrightElement() { - return new CopyrightElement( - $this->fetchElementByName('copyright') - ); - } - - public function getRequiresElement() { - return new RequiresElement( - $this->fetchElementByName('requires') - ); - } - - public function hasBundlesElement() { - return $this->dom->getElementsByTagNameNS(self::XMLNS, 'bundles')->length === 1; - } - - public function getBundlesElement() { - return new BundlesElement( - $this->fetchElementByName('bundles') - ); - } - - private function ensureCorrectDocumentType(DOMDocument $dom) { - $root = $dom->documentElement; - - if ($root->localName !== 'phar' || $root->namespaceURI !== self::XMLNS) { - throw new ManifestDocumentException('Not a phar.io manifest document'); - } - } - - /** - * @param $elementName - * - * @return DOMElement - * - * @throws ManifestDocumentException - */ - private function fetchElementByName($elementName) { - $element = $this->dom->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); - - if (!$element instanceof DOMElement) { - throw new ManifestDocumentException( - sprintf('Element %s missing', $elementName) - ); - } - - return $element; - } -} diff --git a/vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php b/vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php deleted file mode 100644 index 59ac5c6..0000000 --- a/vendor/phar-io/manifest/src/xml/ManifestDocumentLoadingException.php +++ /dev/null @@ -1,48 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use LibXMLError; - -class ManifestDocumentLoadingException extends \Exception implements Exception { - /** - * @var LibXMLError[] - */ - private $libxmlErrors; - - /** - * ManifestDocumentLoadingException constructor. - * - * @param LibXMLError[] $libxmlErrors - */ - public function __construct(array $libxmlErrors) { - $this->libxmlErrors = $libxmlErrors; - $first = $this->libxmlErrors[0]; - - parent::__construct( - sprintf( - '%s (Line: %d / Column: %d / File: %s)', - $first->message, - $first->line, - $first->column, - $first->file - ), - $first->code - ); - } - - /** - * @return LibXMLError[] - */ - public function getLibxmlErrors() { - return $this->libxmlErrors; - } -} diff --git a/vendor/phar-io/manifest/src/xml/ManifestElement.php b/vendor/phar-io/manifest/src/xml/ManifestElement.php deleted file mode 100644 index 09d07cc..0000000 --- a/vendor/phar-io/manifest/src/xml/ManifestElement.php +++ /dev/null @@ -1,100 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use DOMElement; -use DOMNodeList; - -class ManifestElement { - const XMLNS = 'https://phar.io/xml/manifest/1.0'; - - /** - * @var DOMElement - */ - private $element; - - /** - * ContainsElement constructor. - * - * @param DOMElement $element - */ - public function __construct(DOMElement $element) { - $this->element = $element; - } - - /** - * @param string $name - * - * @return string - * - * @throws ManifestElementException - */ - protected function getAttributeValue($name) { - if (!$this->element->hasAttribute($name)) { - throw new ManifestElementException( - sprintf( - 'Attribute %s not set on element %s', - $name, - $this->element->localName - ) - ); - } - - return $this->element->getAttribute($name); - } - - /** - * @param $elementName - * - * @return DOMElement - * - * @throws ManifestElementException - */ - protected function getChildByName($elementName) { - $element = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->item(0); - - if (!$element instanceof DOMElement) { - throw new ManifestElementException( - sprintf('Element %s missing', $elementName) - ); - } - - return $element; - } - - /** - * @param $elementName - * - * @return DOMNodeList - * - * @throws ManifestElementException - */ - protected function getChildrenByName($elementName) { - $elementList = $this->element->getElementsByTagNameNS(self::XMLNS, $elementName); - - if ($elementList->length === 0) { - throw new ManifestElementException( - sprintf('Element(s) %s missing', $elementName) - ); - } - - return $elementList; - } - - /** - * @param string $elementName - * - * @return bool - */ - protected function hasChild($elementName) { - return $this->element->getElementsByTagNameNS(self::XMLNS, $elementName)->length !== 0; - } -} diff --git a/vendor/phar-io/manifest/src/xml/PhpElement.php b/vendor/phar-io/manifest/src/xml/PhpElement.php deleted file mode 100644 index e7340c0..0000000 --- a/vendor/phar-io/manifest/src/xml/PhpElement.php +++ /dev/null @@ -1,27 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class PhpElement extends ManifestElement { - public function getVersion() { - return $this->getAttributeValue('version'); - } - - public function hasExtElements() { - return $this->hasChild('ext'); - } - - public function getExtElements() { - return new ExtElementCollection( - $this->getChildrenByName('ext') - ); - } -} diff --git a/vendor/phar-io/manifest/src/xml/RequiresElement.php b/vendor/phar-io/manifest/src/xml/RequiresElement.php deleted file mode 100644 index 5f41b2e..0000000 --- a/vendor/phar-io/manifest/src/xml/RequiresElement.php +++ /dev/null @@ -1,19 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -class RequiresElement extends ManifestElement { - public function getPHPElement() { - return new PhpElement( - $this->getChildByName('php') - ); - } -} diff --git a/vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php b/vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php deleted file mode 100644 index c69d761..0000000 --- a/vendor/phar-io/manifest/tests/ManifestDocumentMapperTest.php +++ /dev/null @@ -1,110 +0,0 @@ -assertInstanceOf( - Manifest::class, - $mapper->map($manifestDocument) - ); - } - - public function dataProvider() { - return [ - 'application' => [__DIR__ . '/_fixture/phpunit-5.6.5.xml'], - 'library' => [__DIR__ . '/_fixture/library.xml'], - 'extension' => [__DIR__ . '/_fixture/extension.xml'] - ]; - } - - public function testThrowsExceptionOnUnsupportedType() { - $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/custom.xml'); - $mapper = new ManifestDocumentMapper(); - - $this->expectException(ManifestDocumentMapperException::class); - $mapper->map($manifestDocument); - } - - public function testInvalidVersionInformationThrowsException() { - $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/invalidversion.xml'); - $mapper = new ManifestDocumentMapper(); - - $this->expectException(ManifestDocumentMapperException::class); - $mapper->map($manifestDocument); - } - - public function testInvalidVersionConstraintThrowsException() { - $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/invalidversionconstraint.xml'); - $mapper = new ManifestDocumentMapper(); - - $this->expectException(ManifestDocumentMapperException::class); - $mapper->map($manifestDocument); - } - - /** - * @uses \PharIo\Manifest\ExtensionElement - */ - public function testInvalidCompatibleConstraintThrowsException() { - $manifestDocument = ManifestDocument::fromFile(__DIR__ . '/_fixture/extension-invalidcompatible.xml'); - $mapper = new ManifestDocumentMapper(); - - $this->expectException(ManifestDocumentMapperException::class); - $mapper->map($manifestDocument); - } - -} diff --git a/vendor/phar-io/manifest/tests/ManifestLoaderTest.php b/vendor/phar-io/manifest/tests/ManifestLoaderTest.php deleted file mode 100644 index 919143a..0000000 --- a/vendor/phar-io/manifest/tests/ManifestLoaderTest.php +++ /dev/null @@ -1,83 +0,0 @@ -assertInstanceOf( - Manifest::class, - ManifestLoader::fromFile(__DIR__ . '/_fixture/library.xml') - ); - } - - public function testCanBeLoadedFromString() { - $this->assertInstanceOf( - Manifest::class, - ManifestLoader::fromString( - file_get_contents(__DIR__ . '/_fixture/library.xml') - ) - ); - } - - public function testCanBeLoadedFromPhar() { - $this->assertInstanceOf( - Manifest::class, - ManifestLoader::fromPhar(__DIR__ . '/_fixture/test.phar') - ); - - } - - public function testLoadingNonExistingFileThrowsException() { - $this->expectException(ManifestLoaderException::class); - ManifestLoader::fromFile('/not/existing'); - } - - /** - * @uses \PharIo\Manifest\ManifestDocumentLoadingException - */ - public function testLoadingInvalidXmlThrowsException() { - $this->expectException(ManifestLoaderException::class); - ManifestLoader::fromString(''); - } - -} diff --git a/vendor/phar-io/manifest/tests/ManifestSerializerTest.php b/vendor/phar-io/manifest/tests/ManifestSerializerTest.php deleted file mode 100644 index 5fdf799..0000000 --- a/vendor/phar-io/manifest/tests/ManifestSerializerTest.php +++ /dev/null @@ -1,114 +0,0 @@ -assertXmlStringEqualsXmlString( - $expected, - $serializer->serializeToString($manifest) - ); - } - - public function dataProvider() { - return [ - 'application' => [file_get_contents(__DIR__ . '/_fixture/phpunit-5.6.5.xml')], - 'library' => [file_get_contents(__DIR__ . '/_fixture/library.xml')], - 'extension' => [file_get_contents(__DIR__ . '/_fixture/extension.xml')] - ]; - } - - /** - * @uses \PharIo\Manifest\Library - * @uses \PharIo\Manifest\ApplicationName - */ - public function testCanSerializeToFile() { - $src = __DIR__ . '/_fixture/library.xml'; - $dest = '/tmp/' . uniqid('serializer', true); - $manifest = ManifestLoader::fromFile($src); - $serializer = new ManifestSerializer(); - $serializer->serializeToFile($manifest, $dest); - $this->assertXmlFileEqualsXmlFile($src, $dest); - unlink($dest); - } - - /** - * @uses \PharIo\Manifest\ApplicationName - */ - public function testCanHandleUnknownType() { - $type = $this->getMockForAbstractClass(Type::class); - $manifest = new Manifest( - new ApplicationName('testvendor/testname'), - new Version('1.0.0'), - $type, - new CopyrightInformation( - new AuthorCollection(), - new License('bsd-3', new Url('https://some/uri')) - ), - new RequirementCollection(), - new BundledComponentCollection() - ); - - $serializer = new ManifestSerializer(); - $this->assertXmlStringEqualsXmlFile( - __DIR__ . '/_fixture/custom.xml', - $serializer->serializeToString($manifest) - ); - } -} diff --git a/vendor/phar-io/manifest/tests/_fixture/custom.xml b/vendor/phar-io/manifest/tests/_fixture/custom.xml deleted file mode 100644 index 4f43828..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/custom.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml b/vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml deleted file mode 100644 index a78111c..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/extension-invalidcompatible.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/phar-io/manifest/tests/_fixture/extension.xml b/vendor/phar-io/manifest/tests/_fixture/extension.xml deleted file mode 100644 index a870aee..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/extension.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/vendor/phar-io/manifest/tests/_fixture/invalidversion.xml b/vendor/phar-io/manifest/tests/_fixture/invalidversion.xml deleted file mode 100644 index 788dd4c..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/invalidversion.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml b/vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml deleted file mode 100644 index f881f8b..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/invalidversionconstraint.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/vendor/phar-io/manifest/tests/_fixture/library.xml b/vendor/phar-io/manifest/tests/_fixture/library.xml deleted file mode 100644 index a5e2523..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/library.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/vendor/phar-io/manifest/tests/_fixture/manifest.xml b/vendor/phar-io/manifest/tests/_fixture/manifest.xml deleted file mode 100644 index a5e2523..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/manifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml b/vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml deleted file mode 100644 index aadbea2..0000000 --- a/vendor/phar-io/manifest/tests/_fixture/phpunit-5.6.5.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phar-io/manifest/tests/_fixture/test.phar b/vendor/phar-io/manifest/tests/_fixture/test.phar deleted file mode 100644 index d2a3e39..0000000 Binary files a/vendor/phar-io/manifest/tests/_fixture/test.phar and /dev/null differ diff --git a/vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php b/vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php deleted file mode 100644 index 70f7553..0000000 --- a/vendor/phar-io/manifest/tests/exceptions/ManifestDocumentLoadingExceptionTest.php +++ /dev/null @@ -1,19 +0,0 @@ -loadXML(''); - $exception = new ManifestDocumentLoadingException(libxml_get_errors()); - libxml_use_internal_errors($prev); - - $this->assertContainsOnlyInstancesOf(LibXMLError::class, $exception->getLibxmlErrors()); - } - -} diff --git a/vendor/phar-io/manifest/tests/values/ApplicationNameTest.php b/vendor/phar-io/manifest/tests/values/ApplicationNameTest.php deleted file mode 100644 index 8ed3f3a..0000000 --- a/vendor/phar-io/manifest/tests/values/ApplicationNameTest.php +++ /dev/null @@ -1,57 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -class ApplicationNameTest extends TestCase { - - public function testCanBeCreatedWithValidName() { - $this->assertInstanceOf( - ApplicationName::class, - new ApplicationName('foo/bar') - ); - } - - public function testUsingInvalidFormatForNameThrowsException() { - $this->expectException(InvalidApplicationNameException::class); - $this->expectExceptionCode(InvalidApplicationNameException::InvalidFormat); - new ApplicationName('foo'); - } - - public function testUsingWrongTypeForNameThrowsException() { - $this->expectException(InvalidApplicationNameException::class); - $this->expectExceptionCode(InvalidApplicationNameException::NotAString); - new ApplicationName(123); - } - - public function testReturnsTrueForEqualNamesWhenCompared() { - $app = new ApplicationName('foo/bar'); - $this->assertTrue( - $app->isEqual($app) - ); - } - - public function testReturnsFalseForNonEqualNamesWhenCompared() { - $app1 = new ApplicationName('foo/bar'); - $app2 = new ApplicationName('foo/foo'); - $this->assertFalse( - $app1->isEqual($app2) - ); - } - - public function testCanBeConvertedToString() { - $this->assertEquals( - 'foo/bar', - new ApplicationName('foo/bar') - ); - } -} diff --git a/vendor/phar-io/manifest/tests/values/ApplicationTest.php b/vendor/phar-io/manifest/tests/values/ApplicationTest.php deleted file mode 100644 index 86b5da6..0000000 --- a/vendor/phar-io/manifest/tests/values/ApplicationTest.php +++ /dev/null @@ -1,44 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\Application - * @covers PharIo\Manifest\Type - */ -class ApplicationTest extends TestCase { - /** - * @var Application - */ - private $type; - - protected function setUp() { - $this->type = Type::application(); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(Application::class, $this->type); - } - - public function testIsApplication() { - $this->assertTrue($this->type->isApplication()); - } - - public function testIsNotLibrary() { - $this->assertFalse($this->type->isLibrary()); - } - - public function testIsNotExtension() { - $this->assertFalse($this->type->isExtension()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php b/vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php deleted file mode 100644 index 0fa1b95..0000000 --- a/vendor/phar-io/manifest/tests/values/AuthorCollectionTest.php +++ /dev/null @@ -1,62 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Manifest\AuthorCollection - * @covers \PharIo\Manifest\AuthorCollectionIterator - * - * @uses \PharIo\Manifest\Author - * @uses \PharIo\Manifest\Email - */ -class AuthorCollectionTest extends TestCase { - /** - * @var AuthorCollection - */ - private $collection; - - /** - * @var Author - */ - private $item; - - protected function setUp() { - $this->collection = new AuthorCollection; - $this->item = new Author('Joe Developer', new Email('user@example.com')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(AuthorCollection::class, $this->collection); - } - - public function testCanBeCounted() { - $this->collection->add($this->item); - - $this->assertCount(1, $this->collection); - } - - public function testCanBeIterated() { - $this->collection->add( - new Author('Dummy First', new Email('dummy@example.com')) - ); - $this->collection->add($this->item); - $this->assertContains($this->item, $this->collection); - } - - public function testKeyPositionCanBeRetreived() { - $this->collection->add($this->item); - foreach($this->collection as $key => $item) { - $this->assertEquals(0, $key); - } - } -} diff --git a/vendor/phar-io/manifest/tests/values/AuthorTest.php b/vendor/phar-io/manifest/tests/values/AuthorTest.php deleted file mode 100644 index b7317fa..0000000 --- a/vendor/phar-io/manifest/tests/values/AuthorTest.php +++ /dev/null @@ -1,45 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\Author - * - * @uses PharIo\Manifest\Email - */ -class AuthorTest extends TestCase { - /** - * @var Author - */ - private $author; - - protected function setUp() { - $this->author = new Author('Joe Developer', new Email('user@example.com')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(Author::class, $this->author); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('Joe Developer', $this->author->getName()); - } - - public function testEmailCanBeRetrieved() { - $this->assertEquals('user@example.com', $this->author->getEmail()); - } - - public function testCanBeUsedAsString() { - $this->assertEquals('Joe Developer ', $this->author); - } -} diff --git a/vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php b/vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php deleted file mode 100644 index 66cd0c4..0000000 --- a/vendor/phar-io/manifest/tests/values/BundledComponentCollectionTest.php +++ /dev/null @@ -1,63 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Manifest\BundledComponentCollection - * @covers \PharIo\Manifest\BundledComponentCollectionIterator - * - * @uses \PharIo\Manifest\BundledComponent - * @uses \PharIo\Version\Version - */ -class BundledComponentCollectionTest extends TestCase { - /** - * @var BundledComponentCollection - */ - private $collection; - - /** - * @var BundledComponent - */ - private $item; - - protected function setUp() { - $this->collection = new BundledComponentCollection; - $this->item = new BundledComponent('phpunit/php-code-coverage', new Version('4.0.2')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(BundledComponentCollection::class, $this->collection); - } - - public function testCanBeCounted() { - $this->collection->add($this->item); - - $this->assertCount(1, $this->collection); - } - - public function testCanBeIterated() { - $this->collection->add($this->createMock(BundledComponent::class)); - $this->collection->add($this->item); - - $this->assertContains($this->item, $this->collection); - } - - public function testKeyPositionCanBeRetreived() { - $this->collection->add($this->item); - foreach($this->collection as $key => $item) { - $this->assertEquals(0, $key); - } - } - -} diff --git a/vendor/phar-io/manifest/tests/values/BundledComponentTest.php b/vendor/phar-io/manifest/tests/values/BundledComponentTest.php deleted file mode 100644 index 01b8e13..0000000 --- a/vendor/phar-io/manifest/tests/values/BundledComponentTest.php +++ /dev/null @@ -1,42 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\BundledComponent - * - * @uses \PharIo\Version\Version - */ -class BundledComponentTest extends TestCase { - /** - * @var BundledComponent - */ - private $bundledComponent; - - protected function setUp() { - $this->bundledComponent = new BundledComponent('phpunit/php-code-coverage', new Version('4.0.2')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(BundledComponent::class, $this->bundledComponent); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('phpunit/php-code-coverage', $this->bundledComponent->getName()); - } - - public function testVersionCanBeRetrieved() { - $this->assertEquals('4.0.2', $this->bundledComponent->getVersion()->getVersionString()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php b/vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php deleted file mode 100644 index de738f4..0000000 --- a/vendor/phar-io/manifest/tests/values/CopyrightInformationTest.php +++ /dev/null @@ -1,62 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\CopyrightInformation - * - * @uses PharIo\Manifest\AuthorCollection - * @uses PharIo\Manifest\AuthorCollectionIterator - * @uses PharIo\Manifest\Author - * @uses PharIo\Manifest\Email - * @uses PharIo\Manifest\License - * @uses PharIo\Manifest\Url - */ -class CopyrightInformationTest extends TestCase { - /** - * @var CopyrightInformation - */ - private $copyrightInformation; - - /** - * @var Author - */ - private $author; - - /** - * @var License - */ - private $license; - - protected function setUp() { - $this->author = new Author('Joe Developer', new Email('user@example.com')); - $this->license = new License('BSD-3-Clause', new Url('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE')); - - $authors = new AuthorCollection; - $authors->add($this->author); - - $this->copyrightInformation = new CopyrightInformation($authors, $this->license); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(CopyrightInformation::class, $this->copyrightInformation); - } - - public function testAuthorsCanBeRetrieved() { - $this->assertContains($this->author, $this->copyrightInformation->getAuthors()); - } - - public function testLicenseCanBeRetrieved() { - $this->assertEquals($this->license, $this->copyrightInformation->getLicense()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/EmailTest.php b/vendor/phar-io/manifest/tests/values/EmailTest.php deleted file mode 100644 index ee38531..0000000 --- a/vendor/phar-io/manifest/tests/values/EmailTest.php +++ /dev/null @@ -1,35 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\Email - */ -class EmailTest extends TestCase { - public function testCanBeCreatedForValidEmail() { - $this->assertInstanceOf(Email::class, new Email('user@example.com')); - } - - public function testCanBeUsedAsString() { - $this->assertEquals('user@example.com', new Email('user@example.com')); - } - - /** - * @covers PharIo\Manifest\InvalidEmailException - */ - public function testCannotBeCreatedForInvalidEmail() { - $this->expectException(InvalidEmailException::class); - - new Email('invalid'); - } -} diff --git a/vendor/phar-io/manifest/tests/values/ExtensionTest.php b/vendor/phar-io/manifest/tests/values/ExtensionTest.php deleted file mode 100644 index 1c9d676..0000000 --- a/vendor/phar-io/manifest/tests/values/ExtensionTest.php +++ /dev/null @@ -1,109 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\AnyVersionConstraint; -use PharIo\Version\Version; -use PharIo\Version\VersionConstraint; -use PharIo\Version\VersionConstraintParser; -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Manifest\Extension - * @covers \PharIo\Manifest\Type - * - * @uses \PharIo\Version\VersionConstraint - * @uses \PharIo\Manifest\ApplicationName - */ -class ExtensionTest extends TestCase { - /** - * @var Extension - */ - private $type; - - /** - * @var ApplicationName|\PHPUnit_Framework_MockObject_MockObject - */ - private $name; - - protected function setUp() { - $this->name = $this->createMock(ApplicationName::class); - $this->type = Type::extension($this->name, new AnyVersionConstraint); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(Extension::class, $this->type); - } - - public function testIsNotApplication() { - $this->assertFalse($this->type->isApplication()); - } - - public function testIsNotLibrary() { - $this->assertFalse($this->type->isLibrary()); - } - - public function testIsExtension() { - $this->assertTrue($this->type->isExtension()); - } - - public function testApplicationCanBeRetrieved() - { - $this->assertInstanceOf(ApplicationName::class, $this->type->getApplicationName()); - } - - public function testVersionConstraintCanBeRetrieved() { - $this->assertInstanceOf( - VersionConstraint::class, - $this->type->getVersionConstraint() - ); - } - - public function testApplicationCanBeQueried() - { - $this->name->method('isEqual')->willReturn(true); - $this->assertTrue( - $this->type->isExtensionFor($this->createMock(ApplicationName::class)) - ); - } - - public function testCompatibleWithReturnsTrueForMatchingVersionConstraintAndApplicaiton() { - $app = new ApplicationName('foo/bar'); - $extension = Type::extension($app, (new VersionConstraintParser)->parse('^1.0')); - $version = new Version('1.0.0'); - - $this->assertTrue( - $extension->isCompatibleWith($app, $version) - ); - } - - public function testCompatibleWithReturnsFalseForNotMatchingVersionConstraint() { - $app = new ApplicationName('foo/bar'); - $extension = Type::extension($app, (new VersionConstraintParser)->parse('^1.0')); - $version = new Version('2.0.0'); - - $this->assertFalse( - $extension->isCompatibleWith($app, $version) - ); - } - - public function testCompatibleWithReturnsFalseForNotMatchingApplication() { - $app1 = new ApplicationName('foo/bar'); - $app2 = new ApplicationName('foo/foo'); - $extension = Type::extension($app1, (new VersionConstraintParser)->parse('^1.0')); - $version = new Version('1.0.0'); - - $this->assertFalse( - $extension->isCompatibleWith($app2, $version) - ); - } - -} diff --git a/vendor/phar-io/manifest/tests/values/LibraryTest.php b/vendor/phar-io/manifest/tests/values/LibraryTest.php deleted file mode 100644 index f8d1c64..0000000 --- a/vendor/phar-io/manifest/tests/values/LibraryTest.php +++ /dev/null @@ -1,44 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\Library - * @covers PharIo\Manifest\Type - */ -class LibraryTest extends TestCase { - /** - * @var Library - */ - private $type; - - protected function setUp() { - $this->type = Type::library(); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(Library::class, $this->type); - } - - public function testIsNotApplication() { - $this->assertFalse($this->type->isApplication()); - } - - public function testIsLibrary() { - $this->assertTrue($this->type->isLibrary()); - } - - public function testIsNotExtension() { - $this->assertFalse($this->type->isExtension()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/LicenseTest.php b/vendor/phar-io/manifest/tests/values/LicenseTest.php deleted file mode 100644 index c9c5c3c..0000000 --- a/vendor/phar-io/manifest/tests/values/LicenseTest.php +++ /dev/null @@ -1,41 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\License - * - * @uses PharIo\Manifest\Url - */ -class LicenseTest extends TestCase { - /** - * @var License - */ - private $license; - - protected function setUp() { - $this->license = new License('BSD-3-Clause', new Url('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(License::class, $this->license); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('BSD-3-Clause', $this->license->getName()); - } - - public function testUrlCanBeRetrieved() { - $this->assertEquals('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE', $this->license->getUrl()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/ManifestTest.php b/vendor/phar-io/manifest/tests/values/ManifestTest.php deleted file mode 100644 index cff0a68..0000000 --- a/vendor/phar-io/manifest/tests/values/ManifestTest.php +++ /dev/null @@ -1,187 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\Version; -use PharIo\Version\AnyVersionConstraint; -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Manifest\Manifest - * - * @uses \PharIo\Manifest\ApplicationName - * @uses \PharIo\Manifest\Author - * @uses \PharIo\Manifest\AuthorCollection - * @uses \PharIo\Manifest\BundledComponent - * @uses \PharIo\Manifest\BundledComponentCollection - * @uses \PharIo\Manifest\CopyrightInformation - * @uses \PharIo\Manifest\Email - * @uses \PharIo\Manifest\License - * @uses \PharIo\Manifest\RequirementCollection - * @uses \PharIo\Manifest\PhpVersionRequirement - * @uses \PharIo\Manifest\Type - * @uses \PharIo\Manifest\Application - * @uses \PharIo\Manifest\Url - * @uses \PharIo\Version\Version - * @uses \PharIo\Version\VersionConstraint - */ -class ManifestTest extends TestCase { - /** - * @var ApplicationName - */ - private $name; - - /** - * @var Version - */ - private $version; - - /** - * @var Type - */ - private $type; - - /** - * @var CopyrightInformation - */ - private $copyrightInformation; - - /** - * @var RequirementCollection - */ - private $requirements; - - /** - * @var BundledComponentCollection - */ - private $bundledComponents; - - /** - * @var Manifest - */ - private $manifest; - - protected function setUp() { - $this->version = new Version('5.6.5'); - - $this->type = Type::application(); - - $author = new Author('Joe Developer', new Email('user@example.com')); - $license = new License('BSD-3-Clause', new Url('https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE')); - - $authors = new AuthorCollection; - $authors->add($author); - - $this->copyrightInformation = new CopyrightInformation($authors, $license); - - $this->requirements = new RequirementCollection; - $this->requirements->add(new PhpVersionRequirement(new AnyVersionConstraint)); - - $this->bundledComponents = new BundledComponentCollection; - $this->bundledComponents->add(new BundledComponent('phpunit/php-code-coverage', new Version('4.0.2'))); - - $this->name = new ApplicationName('phpunit/phpunit'); - - $this->manifest = new Manifest( - $this->name, - $this->version, - $this->type, - $this->copyrightInformation, - $this->requirements, - $this->bundledComponents - ); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(Manifest::class, $this->manifest); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals($this->name, $this->manifest->getName()); - } - - public function testVersionCanBeRetrieved() { - $this->assertEquals($this->version, $this->manifest->getVersion()); - } - - public function testTypeCanBeRetrieved() { - $this->assertEquals($this->type, $this->manifest->getType()); - } - - public function testTypeCanBeQueried() { - $this->assertTrue($this->manifest->isApplication()); - $this->assertFalse($this->manifest->isLibrary()); - $this->assertFalse($this->manifest->isExtension()); - } - - public function testCopyrightInformationCanBeRetrieved() { - $this->assertEquals($this->copyrightInformation, $this->manifest->getCopyrightInformation()); - } - - public function testRequirementsCanBeRetrieved() { - $this->assertEquals($this->requirements, $this->manifest->getRequirements()); - } - - public function testBundledComponentsCanBeRetrieved() { - $this->assertEquals($this->bundledComponents, $this->manifest->getBundledComponents()); - } - - /** - * @uses \PharIo\Manifest\Extension - */ - public function testExtendedApplicationCanBeQueriedForExtension() - { - $appName = new ApplicationName('foo/bar'); - $manifest = new Manifest( - new ApplicationName('foo/foo'), - new Version('1.0.0'), - Type::extension($appName, new AnyVersionConstraint), - $this->copyrightInformation, - new RequirementCollection, - new BundledComponentCollection - ); - - $this->assertTrue($manifest->isExtensionFor($appName)); - } - - public function testNonExtensionReturnsFalseWhenQueriesForExtension() { - $appName = new ApplicationName('foo/bar'); - $manifest = new Manifest( - new ApplicationName('foo/foo'), - new Version('1.0.0'), - Type::library(), - $this->copyrightInformation, - new RequirementCollection, - new BundledComponentCollection - ); - - $this->assertFalse($manifest->isExtensionFor($appName)); - } - - /** - * @uses \PharIo\Manifest\Extension - */ - public function testExtendedApplicationCanBeQueriedForExtensionWithVersion() - { - $appName = new ApplicationName('foo/bar'); - $manifest = new Manifest( - new ApplicationName('foo/foo'), - new Version('1.0.0'), - Type::extension($appName, new AnyVersionConstraint), - $this->copyrightInformation, - new RequirementCollection, - new BundledComponentCollection - ); - - $this->assertTrue($manifest->isExtensionFor($appName, new Version('1.2.3'))); - } - -} diff --git a/vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php b/vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php deleted file mode 100644 index ae1c058..0000000 --- a/vendor/phar-io/manifest/tests/values/PhpExtensionRequirementTest.php +++ /dev/null @@ -1,26 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\PhpExtensionRequirement - */ -class PhpExtensionRequirementTest extends TestCase { - public function testCanBeCreated() { - $this->assertInstanceOf(PhpExtensionRequirement::class, new PhpExtensionRequirement('dom')); - } - - public function testCanBeUsedAsString() { - $this->assertEquals('dom', new PhpExtensionRequirement('dom')); - } -} diff --git a/vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php b/vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php deleted file mode 100644 index 67ac41a..0000000 --- a/vendor/phar-io/manifest/tests/values/PhpVersionRequirementTest.php +++ /dev/null @@ -1,38 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\ExactVersionConstraint; -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\PhpVersionRequirement - * - * @uses \PharIo\Version\VersionConstraint - */ -class PhpVersionRequirementTest extends TestCase { - /** - * @var PhpVersionRequirement - */ - private $requirement; - - protected function setUp() { - $this->requirement = new PhpVersionRequirement(new ExactVersionConstraint('7.1.0')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(PhpVersionRequirement::class, $this->requirement); - } - - public function testVersionConstraintCanBeRetrieved() { - $this->assertEquals('7.1.0', $this->requirement->getVersionConstraint()->asString()); - } -} diff --git a/vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php b/vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php deleted file mode 100644 index 2afeb1a..0000000 --- a/vendor/phar-io/manifest/tests/values/RequirementCollectionTest.php +++ /dev/null @@ -1,63 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PharIo\Version\ExactVersionConstraint; -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Manifest\RequirementCollection - * @covers \PharIo\Manifest\RequirementCollectionIterator - * - * @uses \PharIo\Manifest\PhpVersionRequirement - * @uses \PharIo\Version\VersionConstraint - */ -class RequirementCollectionTest extends TestCase { - /** - * @var RequirementCollection - */ - private $collection; - - /** - * @var Requirement - */ - private $item; - - protected function setUp() { - $this->collection = new RequirementCollection; - $this->item = new PhpVersionRequirement(new ExactVersionConstraint('7.1.0')); - } - - public function testCanBeCreated() { - $this->assertInstanceOf(RequirementCollection::class, $this->collection); - } - - public function testCanBeCounted() { - $this->collection->add($this->item); - - $this->assertCount(1, $this->collection); - } - - public function testCanBeIterated() { - $this->collection->add(new PhpVersionRequirement(new ExactVersionConstraint('5.6.0'))); - $this->collection->add($this->item); - - $this->assertContains($this->item, $this->collection); - } - - public function testKeyPositionCanBeRetreived() { - $this->collection->add($this->item); - foreach($this->collection as $key => $item) { - $this->assertEquals(0, $key); - } - } - -} diff --git a/vendor/phar-io/manifest/tests/values/UrlTest.php b/vendor/phar-io/manifest/tests/values/UrlTest.php deleted file mode 100644 index 20f09c1..0000000 --- a/vendor/phar-io/manifest/tests/values/UrlTest.php +++ /dev/null @@ -1,35 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Manifest; - -use PHPUnit\Framework\TestCase; - -/** - * @covers PharIo\Manifest\Url - */ -class UrlTest extends TestCase { - public function testCanBeCreatedForValidUrl() { - $this->assertInstanceOf(Url::class, new Url('https://phar.io/')); - } - - public function testCanBeUsedAsString() { - $this->assertEquals('https://phar.io/', new Url('https://phar.io/')); - } - - /** - * @covers PharIo\Manifest\InvalidUrlException - */ - public function testCannotBeCreatedForInvalidUrl() { - $this->expectException(InvalidUrlException::class); - - new Url('invalid'); - } -} diff --git a/vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php b/vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php deleted file mode 100644 index 588558e..0000000 --- a/vendor/phar-io/manifest/tests/xml/AuthorElementCollectionTest.php +++ /dev/null @@ -1,18 +0,0 @@ -loadXML(''); - $collection = new AuthorElementCollection($dom->childNodes); - - foreach($collection as $authorElement) { - $this->assertInstanceOf(AuthorElement::class, $authorElement); - } - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/AuthorElementTest.php b/vendor/phar-io/manifest/tests/xml/AuthorElementTest.php deleted file mode 100644 index 6fce1d4..0000000 --- a/vendor/phar-io/manifest/tests/xml/AuthorElementTest.php +++ /dev/null @@ -1,25 +0,0 @@ -loadXML(''); - $this->author = new AuthorElement($dom->documentElement); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('Reiner Zufall', $this->author->getName()); - } - - public function testEmailCanBeRetrieved() { - $this->assertEquals('reiner@zufall.de', $this->author->getEmail()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/BundlesElementTest.php b/vendor/phar-io/manifest/tests/xml/BundlesElementTest.php deleted file mode 100644 index 7872795..0000000 --- a/vendor/phar-io/manifest/tests/xml/BundlesElementTest.php +++ /dev/null @@ -1,41 +0,0 @@ -dom = new DOMDocument(); - $this->dom->loadXML(''); - $this->bundles = new BundlesElement($this->dom->documentElement); - } - - public function testThrowsExceptionWhenGetComponentElementsIsCalledButNodesAreMissing() { - $this->expectException(ManifestElementException::class); - $this->bundles->getComponentElements(); - } - - public function testGetComponentElementsReturnsComponentElementCollection() { - $this->addComponent(); - $this->assertInstanceOf( - ComponentElementCollection::class, $this->bundles->getComponentElements() - ); - } - - private function addComponent() { - $this->dom->documentElement->appendChild( - $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'component') - ); - } -} diff --git a/vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php b/vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php deleted file mode 100644 index 9fe2378..0000000 --- a/vendor/phar-io/manifest/tests/xml/ComponentElementCollectionTest.php +++ /dev/null @@ -1,18 +0,0 @@ -loadXML(''); - $collection = new ComponentElementCollection($dom->childNodes); - - foreach($collection as $componentElement) { - $this->assertInstanceOf(ComponentElement::class, $componentElement); - } - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ComponentElementTest.php b/vendor/phar-io/manifest/tests/xml/ComponentElementTest.php deleted file mode 100644 index 1996585..0000000 --- a/vendor/phar-io/manifest/tests/xml/ComponentElementTest.php +++ /dev/null @@ -1,25 +0,0 @@ -loadXML(''); - $this->component = new ComponentElement($dom->documentElement); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('phar-io/phive', $this->component->getName()); - } - - public function testEmailCanBeRetrieved() { - $this->assertEquals('0.6.0', $this->component->getVersion()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ContainsElementTest.php b/vendor/phar-io/manifest/tests/xml/ContainsElementTest.php deleted file mode 100644 index ed08600..0000000 --- a/vendor/phar-io/manifest/tests/xml/ContainsElementTest.php +++ /dev/null @@ -1,63 +0,0 @@ -loadXML(''); - $this->domElement = $dom->documentElement; - $this->contains = new ContainsElement($this->domElement); - } - - public function testVersionCanBeRetrieved() { - $this->assertEquals('5.6.5', $this->contains->getVersion()); - } - - public function testThrowsExceptionWhenVersionAttributeIsMissing() { - $this->domElement->removeAttribute('version'); - $this->expectException(ManifestElementException::class); - $this->contains->getVersion(); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('phpunit/phpunit', $this->contains->getName()); - } - - public function testThrowsExceptionWhenNameAttributeIsMissing() { - $this->domElement->removeAttribute('name'); - $this->expectException(ManifestElementException::class); - $this->contains->getName(); - } - - public function testTypeCanBeRetrieved() { - $this->assertEquals('application', $this->contains->getType()); - } - - public function testThrowsExceptionWhenTypeAttributeIsMissing() { - $this->domElement->removeAttribute('type'); - $this->expectException(ManifestElementException::class); - $this->contains->getType(); - } - - public function testGetExtensionElementReturnsExtensionElement() { - $this->domElement->appendChild( - $this->domElement->ownerDocument->createElementNS('https://phar.io/xml/manifest/1.0', 'extension') - ); - $this->assertInstanceOf(ExtensionElement::class, $this->contains->getExtensionElement()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php b/vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php deleted file mode 100644 index c74a2ce..0000000 --- a/vendor/phar-io/manifest/tests/xml/CopyrightElementTest.php +++ /dev/null @@ -1,52 +0,0 @@ -dom = new DOMDocument(); - $this->dom->loadXML(''); - $this->copyright = new CopyrightElement($this->dom->documentElement); - } - - public function testThrowsExceptionWhenGetAuthroElementsIsCalledButNodesAreMissing() { - $this->expectException(ManifestElementException::class); - $this->copyright->getAuthorElements(); - } - - public function testThrowsExceptionWhenGetLicenseElementIsCalledButNodeIsMissing() { - $this->expectException(ManifestElementException::class); - $this->copyright->getLicenseElement(); - } - - public function testGetAuthorElementsReturnsAuthorElementCollection() { - $this->dom->documentElement->appendChild( - $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'author') - ); - $this->assertInstanceOf( - AuthorElementCollection::class, $this->copyright->getAuthorElements() - ); - } - - public function testGetLicenseElementReturnsLicenseElement() { - $this->dom->documentElement->appendChild( - $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'license') - ); - $this->assertInstanceOf( - LicenseElement::class, $this->copyright->getLicenseElement() - ); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php b/vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php deleted file mode 100644 index 7a456d2..0000000 --- a/vendor/phar-io/manifest/tests/xml/ExtElementCollectionTest.php +++ /dev/null @@ -1,19 +0,0 @@ -loadXML(''); - $collection = new ExtElementCollection($dom->childNodes); - - foreach($collection as $position => $extElement) { - $this->assertInstanceOf(ExtElement::class, $extElement); - $this->assertEquals(0, $position); - } - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ExtElementTest.php b/vendor/phar-io/manifest/tests/xml/ExtElementTest.php deleted file mode 100644 index db6ecbc..0000000 --- a/vendor/phar-io/manifest/tests/xml/ExtElementTest.php +++ /dev/null @@ -1,21 +0,0 @@ -loadXML(''); - $this->ext = new ExtElement($dom->documentElement); - } - - public function testNameCanBeRetrieved() { - $this->assertEquals('dom', $this->ext->getName()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php b/vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php deleted file mode 100644 index 58965d8..0000000 --- a/vendor/phar-io/manifest/tests/xml/ExtensionElementTest.php +++ /dev/null @@ -1,25 +0,0 @@ -loadXML(''); - $this->extension = new ExtensionElement($dom->documentElement); - } - - public function testNForCanBeRetrieved() { - $this->assertEquals('phar-io/phive', $this->extension->getFor()); - } - - public function testCompatibleVersionConstraintCanBeRetrieved() { - $this->assertEquals('~0.6', $this->extension->getCompatible()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/LicenseElementTest.php b/vendor/phar-io/manifest/tests/xml/LicenseElementTest.php deleted file mode 100644 index 5b1ffcb..0000000 --- a/vendor/phar-io/manifest/tests/xml/LicenseElementTest.php +++ /dev/null @@ -1,25 +0,0 @@ -loadXML(''); - $this->license = new LicenseElement($dom->documentElement); - } - - public function testTypeCanBeRetrieved() { - $this->assertEquals('BSD-3', $this->license->getType()); - } - - public function testUrlCanBeRetrieved() { - $this->assertEquals('https://some.tld/LICENSE', $this->license->getUrl()); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php b/vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php deleted file mode 100644 index 3dd59bf..0000000 --- a/vendor/phar-io/manifest/tests/xml/ManifestDocumentTest.php +++ /dev/null @@ -1,110 +0,0 @@ -expectException(ManifestDocumentException::class); - ManifestDocument::fromFile('/does/not/exist'); - } - - public function testCanBeCreatedFromFile() { - $this->assertInstanceOf( - ManifestDocument::class, - ManifestDocument::fromFile(__DIR__ . '/../_fixture/phpunit-5.6.5.xml') - ); - } - - public function testCaneBeConstructedFromString() { - $content = file_get_contents(__DIR__ . '/../_fixture/phpunit-5.6.5.xml'); - $this->assertInstanceOf( - ManifestDocument::class, - ManifestDocument::fromString($content) - ); - } - - public function testThrowsExceptionOnInvalidXML() { - $this->expectException(ManifestDocumentLoadingException::class); - ManifestDocument::fromString(''); - } - - public function testLoadingDocumentWithWrongRootNameThrowsException() { - $this->expectException(ManifestDocumentException::class); - ManifestDocument::fromString(''); - } - - public function testLoadingDocumentWithWrongNamespaceThrowsException() { - $this->expectException(ManifestDocumentException::class); - ManifestDocument::fromString(''); - } - - public function testContainsElementCanBeRetrieved() { - $this->assertInstanceOf( - ContainsElement::class, - $this->loadFixture()->getContainsElement() - ); - } - - public function testRequiresElementCanBeRetrieved() { - $this->assertInstanceOf( - RequiresElement::class, - $this->loadFixture()->getRequiresElement() - ); - } - - public function testCopyrightElementCanBeRetrieved() { - $this->assertInstanceOf( - CopyrightElement::class, - $this->loadFixture()->getCopyrightElement() - ); - } - - public function testBundlesElementCanBeRetrieved() { - $this->assertInstanceOf( - BundlesElement::class, - $this->loadFixture()->getBundlesElement() - ); - } - - public function testThrowsExceptionWhenContainsIsMissing() { - $this->expectException(ManifestDocumentException::class); - $this->loadEmptyFixture()->getContainsElement(); - } - - public function testThrowsExceptionWhenCopyirhgtIsMissing() { - $this->expectException(ManifestDocumentException::class); - $this->loadEmptyFixture()->getCopyrightElement(); - } - - public function testThrowsExceptionWhenRequiresIsMissing() { - $this->expectException(ManifestDocumentException::class); - $this->loadEmptyFixture()->getRequiresElement(); - } - - public function testThrowsExceptionWhenBundlesIsMissing() { - $this->expectException(ManifestDocumentException::class); - $this->loadEmptyFixture()->getBundlesElement(); - } - - public function testHasBundlesReturnsTrueWhenBundlesNodeIsPresent() { - $this->assertTrue( - $this->loadFixture()->hasBundlesElement() - ); - } - - public function testHasBundlesReturnsFalseWhenBundlesNoNodeIsPresent() { - $this->assertFalse( - $this->loadEmptyFixture()->hasBundlesElement() - ); - } - - private function loadFixture() { - return ManifestDocument::fromFile(__DIR__ . '/../_fixture/phpunit-5.6.5.xml'); - } - - private function loadEmptyFixture() { - return ManifestDocument::fromString( - '' - ); - } -} diff --git a/vendor/phar-io/manifest/tests/xml/PhpElementTest.php b/vendor/phar-io/manifest/tests/xml/PhpElementTest.php deleted file mode 100644 index 62dd359..0000000 --- a/vendor/phar-io/manifest/tests/xml/PhpElementTest.php +++ /dev/null @@ -1,48 +0,0 @@ -dom = new DOMDocument(); - $this->dom->loadXML(''); - $this->php = new PhpElement($this->dom->documentElement); - } - - public function testVersionConstraintCanBeRetrieved() { - $this->assertEquals('^5.6 || ^7.0', $this->php->getVersion()); - } - - public function testHasExtElementsReturnsFalseWhenNoExtensionsAreRequired() { - $this->assertFalse($this->php->hasExtElements()); - } - - public function testHasExtElementsReturnsTrueWhenExtensionsAreRequired() { - $this->addExtElement(); - $this->assertTrue($this->php->hasExtElements()); - } - - public function testGetExtElementsReturnsExtElementCollection() { - $this->addExtElement(); - $this->assertInstanceOf(ExtElementCollection::class, $this->php->getExtElements()); - } - - private function addExtElement() { - $this->dom->documentElement->appendChild( - $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'ext') - ); - } - -} diff --git a/vendor/phar-io/manifest/tests/xml/RequiresElementTest.php b/vendor/phar-io/manifest/tests/xml/RequiresElementTest.php deleted file mode 100644 index 35ddc82..0000000 --- a/vendor/phar-io/manifest/tests/xml/RequiresElementTest.php +++ /dev/null @@ -1,37 +0,0 @@ -dom = new DOMDocument(); - $this->dom->loadXML(''); - $this->requires = new RequiresElement($this->dom->documentElement); - } - - public function testThrowsExceptionWhenGetPhpElementIsCalledButElementIsMissing() { - $this->expectException(ManifestElementException::class); - $this->requires->getPHPElement(); - } - - public function testHasExtElementsReturnsTrueWhenExtensionsAreRequired() { - $this->dom->documentElement->appendChild( - $this->dom->createElementNS('https://phar.io/xml/manifest/1.0', 'php') - ); - - $this->assertInstanceOf(PhpElement::class, $this->requires->getPHPElement()); - } - -} diff --git a/vendor/phar-io/version/.gitignore b/vendor/phar-io/version/.gitignore deleted file mode 100644 index 1c8f2e6..0000000 --- a/vendor/phar-io/version/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/.idea -/.php_cs.cache -/composer.lock -/src/autoload.php -/tools -/vendor - diff --git a/vendor/phar-io/version/.php_cs b/vendor/phar-io/version/.php_cs deleted file mode 100644 index 159d6a3..0000000 --- a/vendor/phar-io/version/.php_cs +++ /dev/null @@ -1,67 +0,0 @@ -files() - ->in('src') - ->in('tests') - ->name('*.php'); - -return Symfony\CS\Config\Config::create() - ->setUsingCache(true) - ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) - ->fixers( - array( - 'align_double_arrow', - 'align_equals', - 'concat_with_spaces', - 'duplicate_semicolon', - 'elseif', - 'empty_return', - 'encoding', - 'eof_ending', - 'extra_empty_lines', - 'function_call_space', - 'function_declaration', - 'indentation', - 'join_function', - 'line_after_namespace', - 'linefeed', - 'list_commas', - 'lowercase_constants', - 'lowercase_keywords', - 'method_argument_space', - 'multiple_use', - 'namespace_no_leading_whitespace', - 'no_blank_lines_after_class_opening', - 'no_empty_lines_after_phpdocs', - 'parenthesis', - 'php_closing_tag', - 'phpdoc_indent', - 'phpdoc_no_access', - 'phpdoc_no_empty_return', - 'phpdoc_no_package', - 'phpdoc_params', - 'phpdoc_scalar', - 'phpdoc_separation', - 'phpdoc_to_comment', - 'phpdoc_trim', - 'phpdoc_types', - 'phpdoc_var_without_name', - 'remove_lines_between_uses', - 'return', - 'self_accessor', - 'short_array_syntax', - 'short_tag', - 'single_line_after_imports', - 'single_quote', - 'spaces_before_semicolon', - 'spaces_cast', - 'ternary_spaces', - 'trailing_spaces', - 'trim_array_spaces', - 'unused_use', - 'visibility', - 'whitespacy_lines' - ) - ) - ->finder($finder); - diff --git a/vendor/phar-io/version/.travis.yml b/vendor/phar-io/version/.travis.yml deleted file mode 100644 index b4be10f..0000000 --- a/vendor/phar-io/version/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -os: -- linux - -language: php - -before_install: - - wget https://phar.io/releases/phive.phar - - wget https://phar.io/releases/phive.phar.asc - - gpg --keyserver hkps.pool.sks-keyservers.net --recv-keys 0x9B2D5D79 - - gpg --verify phive.phar.asc phive.phar - - chmod +x phive.phar - - sudo mv phive.phar /usr/bin/phive - -install: - - ant setup - -script: ./tools/phpunit - -php: - - 5.6 - - 7.0 - - 7.1 - - 7.0snapshot - - 7.1snapshot - - master - -matrix: - allow_failures: - - php: master - fast_finish: true - -notifications: - email: false diff --git a/vendor/phar-io/version/CHANGELOG.md b/vendor/phar-io/version/CHANGELOG.md deleted file mode 100644 index ab9df36..0000000 --- a/vendor/phar-io/version/CHANGELOG.md +++ /dev/null @@ -1,44 +0,0 @@ -# Changelog - -All notable changes to phar-io/version are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [2.0.1] - 08.07.2018 - -### Fixed - -- Versions without a pre-release suffix are now always considered greater -than versions without a pre-release suffix. Example: `3.0.0 > 3.0.0-alpha.1` - -## [2.0.0] - 23.06.2018 - -Changes to public API: - -- `PreReleaseSuffix::construct()`: optional parameter `$number` removed -- `PreReleaseSuffix::isGreaterThan()`: introduced -- `Version::hasPreReleaseSuffix()`: introduced - -### Added - -- [#11](https://github.com/phar-io/version/issues/11): Added support for pre-release version suffixes. Supported values are: - - `dev` - - `beta` (also abbreviated form `b`) - - `rc` - - `alpha` (also abbreviated form `a`) - - `patch` (also abbreviated form `p`) - - All values can be followed by a number, e.g. `beta3`. - - When comparing versions, the pre-release suffix is taken into account. Example: -`1.5.0 > 1.5.0-beta1 > 1.5.0-alpha3 > 1.5.0-alpha2 > 1.5.0-dev11` - -### Changed - -- reorganized the source directories - -### Fixed - -- [#10](https://github.com/phar-io/version/issues/10): Version numbers containing -a numeric suffix as seen in Debian packages are now supported. - -[2.0.1]: https://github.com/phar-io/version/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/phar-io/version/compare/1.0.1...2.0.0 diff --git a/vendor/phar-io/version/LICENSE b/vendor/phar-io/version/LICENSE deleted file mode 100644 index 359dbc5..0000000 --- a/vendor/phar-io/version/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -phar-io/version - -Copyright (c) 2016-2017 Arne Blankerts , Sebastian Heuer and contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of Arne Blankerts nor the names of contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, -OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/phar-io/version/README.md b/vendor/phar-io/version/README.md deleted file mode 100644 index 76e6e98..0000000 --- a/vendor/phar-io/version/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# Version - -Library for handling version information and constraints - -[![Build Status](https://travis-ci.org/phar-io/version.svg?branch=master)](https://travis-ci.org/phar-io/version) - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phar-io/version - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phar-io/version - -## Version constraints - -A Version constraint describes a range of versions or a discrete version number. The format of version numbers follows the schema of [semantic versioning](http://semver.org): `..`. A constraint might contain an operator that describes the range. - -Beside the typical mathematical operators like `<=`, `>=`, there are two special operators: - -*Caret operator*: `^1.0` -can be written as `>=1.0.0 <2.0.0` and read as Ā»every Version within major version `1`Ā«. - -*Tilde operator*: `~1.0.0` -can be written as `>=1.0.0 <1.1.0` and read as Ā»every version within minor version `1.1`. The behavior of tilde operator depends on whether a patch level version is provided or not. If no patch level is provided, tilde operator behaves like the caret operator: `~1.0` is identical to `^1.0`. - -## Usage examples - -Parsing version constraints and check discrete versions for compliance: - -```php - -use PharIo\Version\Version; -use PharIo\Version\VersionConstraintParser; - -$parser = new VersionConstraintParser(); -$caret_constraint = $parser->parse( '^7.0' ); - -$caret_constraint->complies( new Version( '7.0.17' ) ); // true -$caret_constraint->complies( new Version( '7.1.0' ) ); // true -$caret_constraint->complies( new Version( '6.4.34' ) ); // false - -$tilde_constraint = $parser->parse( '~1.1.0' ); - -$tilde_constraint->complies( new Version( '1.1.4' ) ); // true -$tilde_constraint->complies( new Version( '1.2.0' ) ); // false -``` - -As of version 2.0.0, pre-release labels are supported and taken into account when comparing versions: - -```php - -$leftVersion = new PharIo\Version\Version('3.0.0-alpha.1'); -$rightVersion = new PharIo\Version\Version('3.0.0-alpha.2'); - -$leftVersion->isGreaterThan($rightVersion); // false -$rightVersion->isGreaterThan($leftVersion); // true - -``` diff --git a/vendor/phar-io/version/build.xml b/vendor/phar-io/version/build.xml deleted file mode 100644 index 943c957..0000000 --- a/vendor/phar-io/version/build.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phar-io/version/composer.json b/vendor/phar-io/version/composer.json deleted file mode 100644 index 891e8b1..0000000 --- a/vendor/phar-io/version/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "phar-io/version", - "description": "Library for handling version information and constraints", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "support": { - "issues": "https://github.com/phar-io/version/issues" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "autoload": { - "classmap": [ - "src/" - ] - } -} - diff --git a/vendor/phar-io/version/phive.xml b/vendor/phar-io/version/phive.xml deleted file mode 100644 index 0c3bc6f..0000000 --- a/vendor/phar-io/version/phive.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/vendor/phar-io/version/phpunit.xml b/vendor/phar-io/version/phpunit.xml deleted file mode 100644 index c21ffbc..0000000 --- a/vendor/phar-io/version/phpunit.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - tests - - - - - src - - - diff --git a/vendor/phar-io/version/src/PreReleaseSuffix.php b/vendor/phar-io/version/src/PreReleaseSuffix.php deleted file mode 100644 index e936c0e..0000000 --- a/vendor/phar-io/version/src/PreReleaseSuffix.php +++ /dev/null @@ -1,95 +0,0 @@ - 0, - 'a' => 1, - 'alpha' => 1, - 'b' => 2, - 'beta' => 2, - 'rc' => 3, - 'p' => 4, - 'patch' => 4, - ]; - - /** - * @var string - */ - private $value; - - /** - * @var int - */ - private $valueScore; - - /** - * @var int - */ - private $number = 0; - - /** - * @param string $value - */ - public function __construct($value) { - $this->parseValue($value); - } - - /** - * @return string - */ - public function getValue() { - return $this->value; - } - - /** - * @return int|null - */ - public function getNumber() { - return $this->number; - } - - /** - * @param PreReleaseSuffix $suffix - * - * @return bool - */ - public function isGreaterThan(PreReleaseSuffix $suffix) { - if ($this->valueScore > $suffix->valueScore) { - return true; - } - - if ($this->valueScore < $suffix->valueScore) { - return false; - } - - return $this->getNumber() > $suffix->getNumber(); - } - - /** - * @param $value - * - * @return int - */ - private function mapValueToScore($value) { - if (array_key_exists($value, $this->valueScoreMap)) { - return $this->valueScoreMap[$value]; - } - - return 0; - } - - private function parseValue($value) { - $regex = '/-?(dev|beta|b|rc|alpha|a|patch|p)\.?(\d*).*$/i'; - if (preg_match($regex, $value, $matches) !== 1) { - throw new InvalidPreReleaseSuffixException(sprintf('Invalid label %s', $value)); - } - - $this->value = $matches[1]; - if (isset($matches[2])) { - $this->number = (int)$matches[2]; - } - $this->valueScore = $this->mapValueToScore($this->value); - } -} diff --git a/vendor/phar-io/version/src/Version.php b/vendor/phar-io/version/src/Version.php deleted file mode 100644 index 73e1b98..0000000 --- a/vendor/phar-io/version/src/Version.php +++ /dev/null @@ -1,175 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class Version { - /** - * @var VersionNumber - */ - private $major; - - /** - * @var VersionNumber - */ - private $minor; - - /** - * @var VersionNumber - */ - private $patch; - - /** - * @var PreReleaseSuffix - */ - private $preReleaseSuffix; - - /** - * @var string - */ - private $versionString = ''; - - /** - * @param string $versionString - */ - public function __construct($versionString) { - $this->ensureVersionStringIsValid($versionString); - - $this->versionString = $versionString; - } - - /** - * @return PreReleaseSuffix - */ - public function getPreReleaseSuffix() { - return $this->preReleaseSuffix; - } - - /** - * @return string - */ - public function getVersionString() { - return $this->versionString; - } - - /** - * @return bool - */ - public function hasPreReleaseSuffix() { - return $this->preReleaseSuffix !== null; - } - - /** - * @param Version $version - * - * @return bool - */ - public function isGreaterThan(Version $version) { - if ($version->getMajor()->getValue() > $this->getMajor()->getValue()) { - return false; - } - - if ($version->getMajor()->getValue() < $this->getMajor()->getValue()) { - return true; - } - - if ($version->getMinor()->getValue() > $this->getMinor()->getValue()) { - return false; - } - - if ($version->getMinor()->getValue() < $this->getMinor()->getValue()) { - return true; - } - - if ($version->getPatch()->getValue() > $this->getPatch()->getValue()) { - return false; - } - - if ($version->getPatch()->getValue() < $this->getPatch()->getValue()) { - return true; - } - - if (!$version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { - return false; - } - - if ($version->hasPreReleaseSuffix() && !$this->hasPreReleaseSuffix()) { - return true; - } - - if (!$version->hasPreReleaseSuffix() && $this->hasPreReleaseSuffix()) { - return false; - } - - return $this->getPreReleaseSuffix()->isGreaterThan($version->getPreReleaseSuffix()); - } - - /** - * @return VersionNumber - */ - public function getMajor() { - return $this->major; - } - - /** - * @return VersionNumber - */ - public function getMinor() { - return $this->minor; - } - - /** - * @return VersionNumber - */ - public function getPatch() { - return $this->patch; - } - - /** - * @param array $matches - */ - private function parseVersion(array $matches) { - $this->major = new VersionNumber($matches['Major']); - $this->minor = new VersionNumber($matches['Minor']); - $this->patch = isset($matches['Patch']) ? new VersionNumber($matches['Patch']) : new VersionNumber(null); - - if (isset($matches['PreReleaseSuffix'])) { - $this->preReleaseSuffix = new PreReleaseSuffix($matches['PreReleaseSuffix']); - } - } - - /** - * @param string $version - * - * @throws InvalidVersionException - */ - private function ensureVersionStringIsValid($version) { - $regex = '/^v? - (?(0|(?:[1-9][0-9]*))) - \\. - (?(0|(?:[1-9][0-9]*))) - (\\. - (?(0|(?:[1-9][0-9]*))) - )? - (?: - - - (?(?:(dev|beta|b|RC|alpha|a|patch|p)\.?\d*)) - )? - $/x'; - - if (preg_match($regex, $version, $matches) !== 1) { - throw new InvalidVersionException( - sprintf("Version string '%s' does not follow SemVer semantics", $version) - ); - } - - $this->parseVersion($matches); - } -} diff --git a/vendor/phar-io/version/src/VersionConstraintParser.php b/vendor/phar-io/version/src/VersionConstraintParser.php deleted file mode 100644 index ed46843..0000000 --- a/vendor/phar-io/version/src/VersionConstraintParser.php +++ /dev/null @@ -1,122 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class VersionConstraintParser { - /** - * @param string $value - * - * @return VersionConstraint - * - * @throws UnsupportedVersionConstraintException - */ - public function parse($value) { - - if (strpos($value, '||') !== false) { - return $this->handleOrGroup($value); - } - - if (!preg_match('/^[\^~\*]?[\d.\*]+(?:-.*)?$/', $value)) { - throw new UnsupportedVersionConstraintException( - sprintf('Version constraint %s is not supported.', $value) - ); - } - - switch ($value[0]) { - case '~': - return $this->handleTildeOperator($value); - case '^': - return $this->handleCaretOperator($value); - } - - $version = new VersionConstraintValue($value); - - if ($version->getMajor()->isAny()) { - return new AnyVersionConstraint(); - } - - if ($version->getMinor()->isAny()) { - return new SpecificMajorVersionConstraint( - $version->getVersionString(), - $version->getMajor()->getValue() - ); - } - - if ($version->getPatch()->isAny()) { - return new SpecificMajorAndMinorVersionConstraint( - $version->getVersionString(), - $version->getMajor()->getValue(), - $version->getMinor()->getValue() - ); - } - - return new ExactVersionConstraint($version->getVersionString()); - } - - /** - * @param $value - * - * @return OrVersionConstraintGroup - */ - private function handleOrGroup($value) { - $constraints = []; - - foreach (explode('||', $value) as $groupSegment) { - $constraints[] = $this->parse(trim($groupSegment)); - } - - return new OrVersionConstraintGroup($value, $constraints); - } - - /** - * @param string $value - * - * @return AndVersionConstraintGroup - */ - private function handleTildeOperator($value) { - $version = new Version(substr($value, 1)); - $constraints = [ - new GreaterThanOrEqualToVersionConstraint($value, $version) - ]; - - if ($version->getPatch()->isAny()) { - $constraints[] = new SpecificMajorVersionConstraint( - $value, - $version->getMajor()->getValue() - ); - } else { - $constraints[] = new SpecificMajorAndMinorVersionConstraint( - $value, - $version->getMajor()->getValue(), - $version->getMinor()->getValue() - ); - } - - return new AndVersionConstraintGroup($value, $constraints); - } - - /** - * @param string $value - * - * @return AndVersionConstraintGroup - */ - private function handleCaretOperator($value) { - $version = new Version(substr($value, 1)); - - return new AndVersionConstraintGroup( - $value, - [ - new GreaterThanOrEqualToVersionConstraint($value, $version), - new SpecificMajorVersionConstraint($value, $version->getMajor()->getValue()) - ] - ); - } -} diff --git a/vendor/phar-io/version/src/VersionConstraintValue.php b/vendor/phar-io/version/src/VersionConstraintValue.php deleted file mode 100644 index 8c975b8..0000000 --- a/vendor/phar-io/version/src/VersionConstraintValue.php +++ /dev/null @@ -1,123 +0,0 @@ -versionString = $versionString; - - $this->parseVersion($versionString); - } - - /** - * @return string - */ - public function getLabel() { - return $this->label; - } - - /** - * @return string - */ - public function getBuildMetaData() { - return $this->buildMetaData; - } - - /** - * @return string - */ - public function getVersionString() { - return $this->versionString; - } - - /** - * @return VersionNumber - */ - public function getMajor() { - return $this->major; - } - - /** - * @return VersionNumber - */ - public function getMinor() { - return $this->minor; - } - - /** - * @return VersionNumber - */ - public function getPatch() { - return $this->patch; - } - - /** - * @param $versionString - */ - private function parseVersion($versionString) { - $this->extractBuildMetaData($versionString); - $this->extractLabel($versionString); - - $versionSegments = explode('.', $versionString); - $this->major = new VersionNumber($versionSegments[0]); - - $minorValue = isset($versionSegments[1]) ? $versionSegments[1] : null; - $patchValue = isset($versionSegments[2]) ? $versionSegments[2] : null; - - $this->minor = new VersionNumber($minorValue); - $this->patch = new VersionNumber($patchValue); - } - - /** - * @param string $versionString - */ - private function extractBuildMetaData(&$versionString) { - if (preg_match('/\+(.*)/', $versionString, $matches) == 1) { - $this->buildMetaData = $matches[1]; - $versionString = str_replace($matches[0], '', $versionString); - } - } - - /** - * @param string $versionString - */ - private function extractLabel(&$versionString) { - if (preg_match('/\-(.*)/', $versionString, $matches) == 1) { - $this->label = $matches[1]; - $versionString = str_replace($matches[0], '', $versionString); - } - } -} diff --git a/vendor/phar-io/version/src/VersionNumber.php b/vendor/phar-io/version/src/VersionNumber.php deleted file mode 100644 index ab512ed..0000000 --- a/vendor/phar-io/version/src/VersionNumber.php +++ /dev/null @@ -1,41 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class VersionNumber { - /** - * @var int - */ - private $value; - - /** - * @param mixed $value - */ - public function __construct($value) { - if (is_numeric($value)) { - $this->value = $value; - } - } - - /** - * @return bool - */ - public function isAny() { - return $this->value === null; - } - - /** - * @return int - */ - public function getValue() { - return $this->value; - } -} diff --git a/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php b/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php deleted file mode 100644 index b732dbc..0000000 --- a/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php +++ /dev/null @@ -1,32 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -abstract class AbstractVersionConstraint implements VersionConstraint { - /** - * @var string - */ - private $originalValue = ''; - - /** - * @param string $originalValue - */ - public function __construct($originalValue) { - $this->originalValue = $originalValue; - } - - /** - * @return string - */ - public function asString() { - return $this->originalValue; - } -} diff --git a/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php b/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php deleted file mode 100644 index d9efeef..0000000 --- a/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php +++ /dev/null @@ -1,43 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class AndVersionConstraintGroup extends AbstractVersionConstraint { - /** - * @var VersionConstraint[] - */ - private $constraints = []; - - /** - * @param string $originalValue - * @param VersionConstraint[] $constraints - */ - public function __construct($originalValue, array $constraints) { - parent::__construct($originalValue); - - $this->constraints = $constraints; - } - - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - foreach ($this->constraints as $constraint) { - if (!$constraint->complies($version)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php b/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php deleted file mode 100644 index 13ca2ef..0000000 --- a/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php +++ /dev/null @@ -1,29 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class AnyVersionConstraint implements VersionConstraint { - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - return true; - } - - /** - * @return string - */ - public function asString() { - return '*'; - } -} diff --git a/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php b/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php deleted file mode 100644 index b214117..0000000 --- a/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php +++ /dev/null @@ -1,22 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class ExactVersionConstraint extends AbstractVersionConstraint { - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - return $this->asString() == $version->getVersionString(); - } -} diff --git a/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php b/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php deleted file mode 100644 index 47039a8..0000000 --- a/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php +++ /dev/null @@ -1,38 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class GreaterThanOrEqualToVersionConstraint extends AbstractVersionConstraint { - /** - * @var Version - */ - private $minimalVersion; - - /** - * @param string $originalValue - * @param Version $minimalVersion - */ - public function __construct($originalValue, Version $minimalVersion) { - parent::__construct($originalValue); - - $this->minimalVersion = $minimalVersion; - } - - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - return $version->getVersionString() == $this->minimalVersion->getVersionString() - || $version->isGreaterThan($this->minimalVersion); - } -} diff --git a/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php b/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php deleted file mode 100644 index 274407f..0000000 --- a/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php +++ /dev/null @@ -1,43 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class OrVersionConstraintGroup extends AbstractVersionConstraint { - /** - * @var VersionConstraint[] - */ - private $constraints = []; - - /** - * @param string $originalValue - * @param VersionConstraint[] $constraints - */ - public function __construct($originalValue, array $constraints) { - parent::__construct($originalValue); - - $this->constraints = $constraints; - } - - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - foreach ($this->constraints as $constraint) { - if ($constraint->complies($version)) { - return true; - } - } - - return false; - } -} diff --git a/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php b/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php deleted file mode 100644 index 3d58905..0000000 --- a/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php +++ /dev/null @@ -1,48 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class SpecificMajorAndMinorVersionConstraint extends AbstractVersionConstraint { - /** - * @var int - */ - private $major = 0; - - /** - * @var int - */ - private $minor = 0; - - /** - * @param string $originalValue - * @param int $major - * @param int $minor - */ - public function __construct($originalValue, $major, $minor) { - parent::__construct($originalValue); - - $this->major = $major; - $this->minor = $minor; - } - - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - if ($version->getMajor()->getValue() != $this->major) { - return false; - } - - return $version->getMinor()->getValue() == $this->minor; - } -} diff --git a/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php b/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php deleted file mode 100644 index bbac47b..0000000 --- a/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php +++ /dev/null @@ -1,37 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -class SpecificMajorVersionConstraint extends AbstractVersionConstraint { - /** - * @var int - */ - private $major = 0; - - /** - * @param string $originalValue - * @param int $major - */ - public function __construct($originalValue, $major) { - parent::__construct($originalValue); - - $this->major = $major; - } - - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version) { - return $version->getMajor()->getValue() == $this->major; - } -} diff --git a/vendor/phar-io/version/src/constraints/VersionConstraint.php b/vendor/phar-io/version/src/constraints/VersionConstraint.php deleted file mode 100644 index 9558163..0000000 --- a/vendor/phar-io/version/src/constraints/VersionConstraint.php +++ /dev/null @@ -1,26 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -interface VersionConstraint { - /** - * @param Version $version - * - * @return bool - */ - public function complies(Version $version); - - /** - * @return string - */ - public function asString(); - -} diff --git a/vendor/phar-io/version/src/exceptions/Exception.php b/vendor/phar-io/version/src/exceptions/Exception.php deleted file mode 100644 index b99e4dd..0000000 --- a/vendor/phar-io/version/src/exceptions/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -interface Exception { -} diff --git a/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php b/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php deleted file mode 100644 index 225fe71..0000000 --- a/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php +++ /dev/null @@ -1,7 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -final class UnsupportedVersionConstraintException extends \RuntimeException implements Exception { -} diff --git a/vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php b/vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php deleted file mode 100644 index f3e1ba8..0000000 --- a/vendor/phar-io/version/tests/Integration/VersionConstraintParserTest.php +++ /dev/null @@ -1,146 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\VersionConstraintParser - */ -class VersionConstraintParserTest extends TestCase { - /** - * @dataProvider versionStringProvider - * - * @param string $versionString - * @param VersionConstraint $expectedConstraint - */ - public function testReturnsExpectedConstraint($versionString, VersionConstraint $expectedConstraint) { - $parser = new VersionConstraintParser; - - $this->assertEquals($expectedConstraint, $parser->parse($versionString)); - } - - /** - * @dataProvider unsupportedVersionStringProvider - * - * @param string $versionString - */ - public function testThrowsExceptionIfVersionStringIsNotSupported($versionString) { - $parser = new VersionConstraintParser; - - $this->expectException(UnsupportedVersionConstraintException::class); - - $parser->parse($versionString); - } - - /** - * @return array - */ - public function versionStringProvider() { - return [ - ['1.0.2', new ExactVersionConstraint('1.0.2')], - [ - '~4.6', - new AndVersionConstraintGroup( - '~4.6', - [ - new GreaterThanOrEqualToVersionConstraint('~4.6', new Version('4.6')), - new SpecificMajorVersionConstraint('~4.6', 4) - ] - ) - ], - [ - '~4.6.2', - new AndVersionConstraintGroup( - '~4.6.2', - [ - new GreaterThanOrEqualToVersionConstraint('~4.6.2', new Version('4.6.2')), - new SpecificMajorAndMinorVersionConstraint('~4.6.2', 4, 6) - ] - ) - ], - [ - '^2.6.1', - new AndVersionConstraintGroup( - '^2.6.1', - [ - new GreaterThanOrEqualToVersionConstraint('^2.6.1', new Version('2.6.1')), - new SpecificMajorVersionConstraint('^2.6.1', 2) - ] - ) - ], - ['5.1.*', new SpecificMajorAndMinorVersionConstraint('5.1.*', 5, 1)], - ['5.*', new SpecificMajorVersionConstraint('5.*', 5)], - ['*', new AnyVersionConstraint()], - [ - '1.0.2 || 1.0.5', - new OrVersionConstraintGroup( - '1.0.2 || 1.0.5', - [ - new ExactVersionConstraint('1.0.2'), - new ExactVersionConstraint('1.0.5') - ] - ) - ], - [ - '^5.6 || ^7.0', - new OrVersionConstraintGroup( - '^5.6 || ^7.0', - [ - new AndVersionConstraintGroup( - '^5.6', [ - new GreaterThanOrEqualToVersionConstraint('^5.6', new Version('5.6')), - new SpecificMajorVersionConstraint('^5.6', 5) - ] - ), - new AndVersionConstraintGroup( - '^7.0', [ - new GreaterThanOrEqualToVersionConstraint('^7.0', new Version('7.0')), - new SpecificMajorVersionConstraint('^7.0', 7) - ] - ) - ] - ) - ], - ['7.0.28-1', new ExactVersionConstraint('7.0.28-1')], - [ - '^3.0.0-alpha1', - new AndVersionConstraintGroup( - '^3.0.0-alpha1', - [ - new GreaterThanOrEqualToVersionConstraint('^3.0.0-alpha1', new Version('3.0.0-alpha1')), - new SpecificMajorVersionConstraint('^3.0.0-alpha1', 3) - ] - ) - ], - [ - '^3.0.0-alpha.1', - new AndVersionConstraintGroup( - '^3.0.0-alpha.1', - [ - new GreaterThanOrEqualToVersionConstraint('^3.0.0-alpha.1', new Version('3.0.0-alpha.1')), - new SpecificMajorVersionConstraint('^3.0.0-alpha.1', 3) - ] - ) - ] - ]; - } - - public function unsupportedVersionStringProvider() { - return [ - ['foo'], - ['+1.0.2'], - ['>=2.0'], - ['^5.6 || >= 7.0'], - ['2.0 || foo'] - ]; - } -} diff --git a/vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php deleted file mode 100644 index c618566..0000000 --- a/vendor/phar-io/version/tests/Unit/AbstractVersionConstraintTest.php +++ /dev/null @@ -1,25 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\AbstractVersionConstraint - */ -class AbstractVersionConstraintTest extends TestCase { - public function testAsString() { - /** @var AbstractVersionConstraint|\PHPUnit_Framework_MockObject_MockObject $constraint */ - $constraint = $this->getMockForAbstractClass(AbstractVersionConstraint::class, ['foo']); - - $this->assertSame('foo', $constraint->asString()); - } -} diff --git a/vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php b/vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php deleted file mode 100644 index c2c5ec0..0000000 --- a/vendor/phar-io/version/tests/Unit/AndVersionConstraintGroupTest.php +++ /dev/null @@ -1,52 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\AndVersionConstraintGroup - */ -class AndVersionConstraintGroupTest extends TestCase { - public function testReturnsFalseIfOneConstraintReturnsFalse() { - $firstConstraint = $this->createMock(VersionConstraint::class); - $secondConstraint = $this->createMock(VersionConstraint::class); - - $firstConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(true)); - - $secondConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(false)); - - $group = new AndVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]); - - $this->assertFalse($group->complies(new Version('1.0.0'))); - } - - public function testReturnsTrueIfAllConstraintsReturnsTrue() { - $firstConstraint = $this->createMock(VersionConstraint::class); - $secondConstraint = $this->createMock(VersionConstraint::class); - - $firstConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(true)); - - $secondConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(true)); - - $group = new AndVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]); - - $this->assertTrue($group->complies(new Version('1.0.0'))); - } -} diff --git a/vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php deleted file mode 100644 index 6883099..0000000 --- a/vendor/phar-io/version/tests/Unit/AnyVersionConstraintTest.php +++ /dev/null @@ -1,41 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\AnyVersionConstraint - */ -class AnyVersionConstraintTest extends TestCase { - public function versionProvider() { - return [ - [new Version('1.0.2')], - [new Version('4.8')], - [new Version('0.1.1-dev')] - ]; - } - - /** - * @dataProvider versionProvider - * - * @param Version $version - */ - public function testReturnsTrue(Version $version) { - $constraint = new AnyVersionConstraint; - - $this->assertTrue($constraint->complies($version)); - } - - public function testAsString() { - $this->assertSame('*', (new AnyVersionConstraint())->asString()); - } -} diff --git a/vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php deleted file mode 100644 index ebba024..0000000 --- a/vendor/phar-io/version/tests/Unit/ExactVersionConstraintTest.php +++ /dev/null @@ -1,58 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\ExactVersionConstraint - */ -class ExactVersionConstraintTest extends TestCase { - public function compliantVersionProvider() { - return [ - ['1.0.2', new Version('1.0.2')], - ['4.8.9', new Version('4.8.9')], - ['4.8', new Version('4.8')], - ]; - } - - public function nonCompliantVersionProvider() { - return [ - ['1.0.2', new Version('1.0.3')], - ['4.8.9', new Version('4.7.9')], - ['4.8', new Version('4.8.5')], - ]; - } - - /** - * @dataProvider compliantVersionProvider - * - * @param string $constraintValue - * @param Version $version - */ - public function testReturnsTrueForCompliantVersion($constraintValue, Version $version) { - $constraint = new ExactVersionConstraint($constraintValue); - - $this->assertTrue($constraint->complies($version)); - } - - /** - * @dataProvider nonCompliantVersionProvider - * - * @param string $constraintValue - * @param Version $version - */ - public function testReturnsFalseForNonCompliantVersion($constraintValue, Version $version) { - $constraint = new ExactVersionConstraint($constraintValue); - - $this->assertFalse($constraint->complies($version)); - } -} diff --git a/vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php deleted file mode 100644 index 3cbb11d..0000000 --- a/vendor/phar-io/version/tests/Unit/GreaterThanOrEqualToVersionConstraintTest.php +++ /dev/null @@ -1,47 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\GreaterThanOrEqualToVersionConstraint - */ -class GreaterThanOrEqualToVersionConstraintTest extends TestCase { - public function versionProvider() { - return [ - // compliant versions - [new Version('1.0.2'), new Version('1.0.2'), true], - [new Version('1.0.2'), new Version('1.0.3'), true], - [new Version('1.0.2'), new Version('1.1.1'), true], - [new Version('1.0.2'), new Version('2.0.0'), true], - [new Version('1.0.2'), new Version('1.0.3'), true], - // non-compliant versions - [new Version('1.0.2'), new Version('1.0.1'), false], - [new Version('1.9.8'), new Version('0.9.9'), false], - [new Version('2.3.1'), new Version('2.2.3'), false], - [new Version('3.0.2'), new Version('2.9.9'), false], - ]; - } - - /** - * @dataProvider versionProvider - * - * @param Version $constraintVersion - * @param Version $version - * @param bool $expectedResult - */ - public function testReturnsTrueForCompliantVersions(Version $constraintVersion, Version $version, $expectedResult) { - $constraint = new GreaterThanOrEqualToVersionConstraint('foo', $constraintVersion); - - $this->assertSame($expectedResult, $constraint->complies($version)); - } -} diff --git a/vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php b/vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php deleted file mode 100644 index 088d557..0000000 --- a/vendor/phar-io/version/tests/Unit/OrVersionConstraintGroupTest.php +++ /dev/null @@ -1,65 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\OrVersionConstraintGroup - */ -class OrVersionConstraintGroupTest extends TestCase { - public function testReturnsTrueIfOneConstraintReturnsFalse() { - $firstConstraint = $this->createMock(VersionConstraint::class); - $secondConstraint = $this->createMock(VersionConstraint::class); - - $firstConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(false)); - - $secondConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(true)); - - $group = new OrVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]); - - $this->assertTrue($group->complies(new Version('1.0.0'))); - } - - public function testReturnsTrueIfAllConstraintsReturnsTrue() { - $firstConstraint = $this->createMock(VersionConstraint::class); - $secondConstraint = $this->createMock(VersionConstraint::class); - - $firstConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(true)); - - $group = new OrVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]); - - $this->assertTrue($group->complies(new Version('1.0.0'))); - } - - public function testReturnsFalseIfAllConstraintsReturnsFalse() { - $firstConstraint = $this->createMock(VersionConstraint::class); - $secondConstraint = $this->createMock(VersionConstraint::class); - - $firstConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(false)); - - $secondConstraint->expects($this->once()) - ->method('complies') - ->will($this->returnValue(false)); - - $group = new OrVersionConstraintGroup('foo', [$firstConstraint, $secondConstraint]); - - $this->assertFalse($group->complies(new Version('1.0.0'))); - } -} diff --git a/vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php b/vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php deleted file mode 100644 index e09a66d..0000000 --- a/vendor/phar-io/version/tests/Unit/PreReleaseSuffixTest.php +++ /dev/null @@ -1,46 +0,0 @@ -assertSame($expectedResult, $leftSuffix->isGreaterThan($rightSuffix)); - } - - public function greaterThanProvider() { - return [ - ['alpha1', 'alpha2', false], - ['alpha2', 'alpha1', true], - ['beta1', 'alpha3', true], - ['b1', 'alpha3', true], - ['b1', 'a3', true], - ['dev1', 'alpha2', false], - ['dev1', 'alpha2', false], - ['alpha2', 'dev5', true], - ['rc1', 'beta2', true], - ['patch5', 'rc7', true], - ['alpha1', 'alpha.2', false], - ['alpha.3', 'alpha2', true], - ['alpha.3', 'alpha.2', true], - ]; - } -} diff --git a/vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php deleted file mode 100644 index 6025889..0000000 --- a/vendor/phar-io/version/tests/Unit/SpecificMajorAndMinorVersionConstraintTest.php +++ /dev/null @@ -1,45 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\SpecificMajorAndMinorVersionConstraint - */ -class SpecificMajorAndMinorVersionConstraintTest extends TestCase { - public function versionProvider() { - return [ - // compliant versions - [1, 0, new Version('1.0.2'), true], - [1, 0, new Version('1.0.3'), true], - [1, 1, new Version('1.1.1'), true], - // non-compliant versions - [2, 9, new Version('0.9.9'), false], - [3, 2, new Version('2.2.3'), false], - [2, 8, new Version('2.9.9'), false], - ]; - } - - /** - * @dataProvider versionProvider - * - * @param int $major - * @param int $minor - * @param Version $version - * @param bool $expectedResult - */ - public function testReturnsTrueForCompliantVersions($major, $minor, Version $version, $expectedResult) { - $constraint = new SpecificMajorAndMinorVersionConstraint('foo', $major, $minor); - - $this->assertSame($expectedResult, $constraint->complies($version)); - } -} diff --git a/vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php b/vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php deleted file mode 100644 index 6dc3b71..0000000 --- a/vendor/phar-io/version/tests/Unit/SpecificMajorVersionConstraintTest.php +++ /dev/null @@ -1,44 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\SpecificMajorVersionConstraint - */ -class SpecificMajorVersionConstraintTest extends TestCase { - public function versionProvider() { - return [ - // compliant versions - [1, new Version('1.0.2'), true], - [1, new Version('1.0.3'), true], - [1, new Version('1.1.1'), true], - // non-compliant versions - [2, new Version('0.9.9'), false], - [3, new Version('2.2.3'), false], - [3, new Version('2.9.9'), false], - ]; - } - - /** - * @dataProvider versionProvider - * - * @param int $major - * @param Version $version - * @param bool $expectedResult - */ - public function testReturnsTrueForCompliantVersions($major, Version $version, $expectedResult) { - $constraint = new SpecificMajorVersionConstraint('foo', $major); - - $this->assertSame($expectedResult, $constraint->complies($version)); - } -} diff --git a/vendor/phar-io/version/tests/Unit/VersionTest.php b/vendor/phar-io/version/tests/Unit/VersionTest.php deleted file mode 100644 index 6b4897a..0000000 --- a/vendor/phar-io/version/tests/Unit/VersionTest.php +++ /dev/null @@ -1,113 +0,0 @@ -, Sebastian Heuer , Sebastian Bergmann - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace PharIo\Version; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \PharIo\Version\Version - */ -class VersionTest extends TestCase { - /** - * @dataProvider versionProvider - * - * @param string $versionString - * @param string $expectedMajor - * @param string $expectedMinor - * @param string $expectedPatch - * @param string $expectedPreReleaseValue - * @param int $expectedReleaseCount - */ - public function testParsesVersionNumbers( - $versionString, - $expectedMajor, - $expectedMinor, - $expectedPatch, - $expectedPreReleaseValue = '', - $expectedReleaseCount = 0 - ) { - $version = new Version($versionString); - - $this->assertSame($expectedMajor, $version->getMajor()->getValue()); - $this->assertSame($expectedMinor, $version->getMinor()->getValue()); - $this->assertSame($expectedPatch, $version->getPatch()->getValue()); - if ($expectedPreReleaseValue !== '') { - $this->assertSame($expectedPreReleaseValue, $version->getPreReleaseSuffix()->getValue()); - } - if ($expectedReleaseCount !== 0) { - $this->assertSame($expectedReleaseCount, $version->getPreReleaseSuffix()->getNumber()); - } - - $this->assertSame($versionString, $version->getVersionString()); - } - - public function versionProvider() { - return [ - ['0.0.1', '0', '0', '1'], - ['0.1.2', '0', '1', '2'], - ['1.0.0-alpha', '1', '0', '0', 'alpha'], - ['3.4.12-dev3', '3', '4', '12', 'dev', 3], - ]; - } - - /** - * @dataProvider versionGreaterThanProvider - * - * @param Version $versionA - * @param Version $versionB - * @param bool $expectedResult - */ - public function testIsGreaterThan(Version $versionA, Version $versionB, $expectedResult) { - $this->assertSame($expectedResult, $versionA->isGreaterThan($versionB)); - } - - /** - * @return array - */ - public function versionGreaterThanProvider() { - return [ - [new Version('1.0.0'), new Version('1.0.1'), false], - [new Version('1.0.1'), new Version('1.0.0'), true], - [new Version('1.1.0'), new Version('1.0.1'), true], - [new Version('1.1.0'), new Version('2.0.1'), false], - [new Version('1.1.0'), new Version('1.1.0'), false], - [new Version('2.5.8'), new Version('1.6.8'), true], - [new Version('2.5.8'), new Version('2.6.8'), false], - [new Version('2.5.8'), new Version('3.1.2'), false], - [new Version('3.0.0-alpha1'), new Version('3.0.0-alpha2'), false], - [new Version('3.0.0-alpha2'), new Version('3.0.0-alpha1'), true], - [new Version('3.0.0-alpha.1'), new Version('3.0.0'), false], - [new Version('3.0.0'), new Version('3.0.0-alpha.1'), true], - ]; - } - - /** - * @dataProvider invalidVersionStringProvider - * - * @param string $versionString - */ - public function testThrowsExceptionIfVersionStringDoesNotFollowSemVer($versionString) { - $this->expectException(InvalidVersionException::class); - new Version($versionString); - } - - /** - * @return array - */ - public function invalidVersionStringProvider() { - return [ - ['foo'], - ['0.0.1-dev+ABC', '0', '0', '1', 'dev', 'ABC'], - ['1.0.0-x.7.z.92', '1', '0', '0', 'x.7.z.92'] - ]; - } - -} diff --git a/vendor/phenx/php-font-lib/.gitattributes b/vendor/phenx/php-font-lib/.gitattributes deleted file mode 100644 index 623abe8..0000000 --- a/vendor/phenx/php-font-lib/.gitattributes +++ /dev/null @@ -1,12 +0,0 @@ -*.json text -*.xml text -*.php text -*.LGPL text -*.md text -*.skel text -*.css text -*.inc text -*.js text -*.html text -*.txt text -*.svg text diff --git a/vendor/phenx/php-font-lib/.gitignore b/vendor/phenx/php-font-lib/.gitignore deleted file mode 100644 index d2b601e..0000000 --- a/vendor/phenx/php-font-lib/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.DS_Store -composer.lock -vendor -.idea -.project diff --git a/vendor/phenx/php-font-lib/.htaccess b/vendor/phenx/php-font-lib/.htaccess deleted file mode 100644 index d02bd68..0000000 --- a/vendor/phenx/php-font-lib/.htaccess +++ /dev/null @@ -1 +0,0 @@ -#deny from all \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/.travis.yml b/vendor/phenx/php-font-lib/.travis.yml deleted file mode 100644 index a38c93e..0000000 --- a/vendor/phenx/php-font-lib/.travis.yml +++ /dev/null @@ -1,36 +0,0 @@ -language: php - -env: - - PREFER_LOWEST="--prefer-lowest" - - PREFER_LOWEST="" - -php: - - 5.6 - - 7.0 - - 7.1 - - 7.2 - - 7.3 - - 7.4 - - nightly - -matrix: - include: - - php: 5.4 - dist: trusty - - php: 5.5 - dist: trusty - allow_failures: - - php: nightly - fast_finish: true - -before_script: - - composer dump-autoload - - composer self-update - - composer update --prefer-source $PREFER_LOWEST - -script: bin/phpunit - - -# Use Travis' new container-based infrastructure. -# See http://docs.travis-ci.com/user/migrating-from-legacy/#How-can-I-use-container-based-infrastructure%3F -sudo: false diff --git a/vendor/phenx/php-font-lib/LICENSE b/vendor/phenx/php-font-lib/LICENSE deleted file mode 100644 index bca992d..0000000 --- a/vendor/phenx/php-font-lib/LICENSE +++ /dev/null @@ -1,456 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/README.md b/vendor/phenx/php-font-lib/README.md deleted file mode 100644 index f166ced..0000000 --- a/vendor/phenx/php-font-lib/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# PHP Font Lib - -[![Build Status](https://travis-ci.org/PhenX/php-font-lib.svg?branch=master)](https://travis-ci.org/PhenX/php-font-lib) - - -This library can be used to: - * Read TrueType, OpenType (with TrueType glyphs), WOFF font files - * Extract basic info (name, style, etc) - * Extract advanced info (horizontal metrics, glyph names, glyph shapes, etc) - * Make an Adobe Font Metrics (AFM) file from a font - -You can find a demo GUI [here](http://pxd.me/php-font-lib/www/font_explorer.html). - -This project was initiated by the need to read font files in the [DOMPDF project](https://github.com/dompdf/dompdf). - -Usage Example -------------- - -``` -$font = \FontLib\Font::load('../../fontfile.ttf'); -$font->parse(); // for getFontWeight() to work this call must be done first! -echo $font->getFontName() .'
'; -echo $font->getFontSubfamily() .'
'; -echo $font->getFontSubfamilyID() .'
'; -echo $font->getFontFullName() .'
'; -echo $font->getFontVersion() .'
'; -echo $font->getFontWeight() .'
'; -echo $font->getFontPostscriptName() .'
'; -``` diff --git a/vendor/phenx/php-font-lib/bower.json b/vendor/phenx/php-font-lib/bower.json deleted file mode 100644 index 0a4a45b..0000000 --- a/vendor/phenx/php-font-lib/bower.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "php-font-lib", - "version": "0.3.1", - "license": "LGPL-3.0", - "keywords": [ - "font", - "parse", - "export", - "truetype", - "opentype", - "woff" - ], - "homepage": "https://github.com/PhenX/php-font-lib", - "_release": "0.3.1", - "_resolution": { - "type": "version", - "tag": "v0.3.1", - "commit": "d13682b7e27d14a6323c441426f3dde1cd86c751" - }, - "_source": "https://github.com/PhenX/php-font-lib.git", - "_target": "*", - "_originalSource": "https://github.com/PhenX/php-font-lib.git" -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/composer.json b/vendor/phenx/php-font-lib/composer.json deleted file mode 100644 index 18cf0ca..0000000 --- a/vendor/phenx/php-font-lib/composer.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "phenx/php-font-lib", - "type": "library", - "description": "A library to read, parse, export and make subsets of different types of font files.", - "homepage": "https://github.com/PhenX/php-font-lib", - "license": "LGPL-3.0", - "authors": [ - { - "name": "Fabien MƩnager", - "email": "fabien.menager@gmail.com" - } - ], - "autoload": { - "psr-4": { - "FontLib\\": "src/FontLib" - } - }, - "config": { - "bin-dir": "bin" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7" - } -} diff --git a/vendor/phenx/php-font-lib/index.php b/vendor/phenx/php-font-lib/index.php deleted file mode 100644 index 7ed173a..0000000 --- a/vendor/phenx/php-font-lib/index.php +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/maps/adobe-standard-encoding.map b/vendor/phenx/php-font-lib/maps/adobe-standard-encoding.map deleted file mode 100644 index 230d4a1..0000000 --- a/vendor/phenx/php-font-lib/maps/adobe-standard-encoding.map +++ /dev/null @@ -1,231 +0,0 @@ -// Adobe Standard Encoding table for ttf2pt1 -// Thomas Henlich - -=20 U+0020 SPACE -=21 U+0021 EXCLAMATION MARK -=22 U+0022 QUOTATION MARK -=23 U+0023 NUMBER SIGN -=24 U+0024 DOLLAR SIGN -=25 U+0025 PERCENT SIGN -=26 U+0026 AMPERSAND -=27 U+2019 RIGHT SINGLE QUOTATION MARK -=28 U+0028 LEFT PARENTHESIS -=29 U+0029 RIGHT PARENTHESIS -=2A U+002A ASTERISK -=2B U+002B PLUS SIGN -=2C U+002C COMMA -=2D U+002D HYPHEN-MINUS -=2E U+002E FULL STOP -=2F U+002F SOLIDUS -=30 U+0030 DIGIT ZERO -=31 U+0031 DIGIT ONE -=32 U+0032 DIGIT TWO -=33 U+0033 DIGIT THREE -=34 U+0034 DIGIT FOUR -=35 U+0035 DIGIT FIVE -=36 U+0036 DIGIT SIX -=37 U+0037 DIGIT SEVEN -=38 U+0038 DIGIT EIGHT -=39 U+0039 DIGIT NINE -=3A U+003A COLON -=3B U+003B SEMICOLON -=3C U+003C LESS-THAN SIGN -=3D U+003D EQUALS SIGN -=3E U+003E GREATER-THAN SIGN -=3F U+003F QUESTION MARK -=40 U+0040 COMMERCIAL AT -=41 U+0041 LATIN CAPITAL LETTER A -=42 U+0042 LATIN CAPITAL LETTER B -=43 U+0043 LATIN CAPITAL LETTER C -=44 U+0044 LATIN CAPITAL LETTER D -=45 U+0045 LATIN CAPITAL LETTER E -=46 U+0046 LATIN CAPITAL LETTER F -=47 U+0047 LATIN CAPITAL LETTER G -=48 U+0048 LATIN CAPITAL LETTER H -=49 U+0049 LATIN CAPITAL LETTER I -=4A U+004A LATIN CAPITAL LETTER J -=4B U+004B LATIN CAPITAL LETTER K -=4C U+004C LATIN CAPITAL LETTER L -=4D U+004D LATIN CAPITAL LETTER M -=4E U+004E LATIN CAPITAL LETTER N -=4F U+004F LATIN CAPITAL LETTER O -=50 U+0050 LATIN CAPITAL LETTER P -=51 U+0051 LATIN CAPITAL LETTER Q -=52 U+0052 LATIN CAPITAL LETTER R -=53 U+0053 LATIN CAPITAL LETTER S -=54 U+0054 LATIN CAPITAL LETTER T -=55 U+0055 LATIN CAPITAL LETTER U -=56 U+0056 LATIN CAPITAL LETTER V -=57 U+0057 LATIN CAPITAL LETTER W -=58 U+0058 LATIN CAPITAL LETTER X -=59 U+0059 LATIN CAPITAL LETTER Y -=5A U+005A LATIN CAPITAL LETTER Z -=5B U+005B LEFT SQUARE BRACKET -=5C U+005C REVERSE SOLIDUS -=5D U+005D RIGHT SQUARE BRACKET -=5E U+005E CIRCUMFLEX ACCENT -=5F U+005F LOW LINE -=60 U+2018 LEFT SINGLE QUOTATION MARK -=61 U+0061 LATIN SMALL LETTER A -=62 U+0062 LATIN SMALL LETTER B -=63 U+0063 LATIN SMALL LETTER C -=64 U+0064 LATIN SMALL LETTER D -=65 U+0065 LATIN SMALL LETTER E -=66 U+0066 LATIN SMALL LETTER F -=67 U+0067 LATIN SMALL LETTER G -=68 U+0068 LATIN SMALL LETTER H -=69 U+0069 LATIN SMALL LETTER I -=6A U+006A LATIN SMALL LETTER J -=6B U+006B LATIN SMALL LETTER K -=6C U+006C LATIN SMALL LETTER L -=6D U+006D LATIN SMALL LETTER M -=6E U+006E LATIN SMALL LETTER N -=6F U+006F LATIN SMALL LETTER O -=70 U+0070 LATIN SMALL LETTER P -=71 U+0071 LATIN SMALL LETTER Q -=72 U+0072 LATIN SMALL LETTER R -=73 U+0073 LATIN SMALL LETTER S -=74 U+0074 LATIN SMALL LETTER T -=75 U+0075 LATIN SMALL LETTER U -=76 U+0076 LATIN SMALL LETTER V -=77 U+0077 LATIN SMALL LETTER W -=78 U+0078 LATIN SMALL LETTER X -=79 U+0079 LATIN SMALL LETTER Y -=7A U+007A LATIN SMALL LETTER Z -=7B U+007B LEFT CURLY BRACKET -=7C U+007C VERTICAL LINE -=7D U+007D RIGHT CURLY BRACKET -=7E U+007E TILDE -=A1 U+00A1 INVERTED EXCLAMATION MARK -=A2 U+00A2 CENT SIGN -=A3 U+00A3 POUND SIGN -=A4 U+2044 FRACTION SLASH -=A5 U+00A5 YEN SIGN -=A6 U+0192 LATIN SMALL LETTER F WITH HOOK -=A7 U+00A7 SECTION SIGN -=A8 U+00A4 CURRENCY SIGN -=A9 U+0027 APOSTROPHE -=AA U+201C LEFT DOUBLE QUOTATION MARK -=AB U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -=AC U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK -=AD U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -=AE U+FB01 LATIN SMALL LIGATURE FI -=AF U+FB02 LATIN SMALL LIGATURE FL -=B1 U+2013 EN DASH -=B2 U+2020 DAGGER -=B3 U+2021 DOUBLE DAGGER -=B4 U+00B7 MIDDLE DOT -=B6 U+00B6 PILCROW SIGN -=B7 U+2022 BULLET -=B8 U+201A SINGLE LOW-9 QUOTATION MARK -=B9 U+201E DOUBLE LOW-9 QUOTATION MARK -=BA U+201D RIGHT DOUBLE QUOTATION MARK -=BB U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -=BC U+2026 HORIZONTAL ELLIPSIS -=BD U+2030 PER MILLE SIGN -=BF U+00BF INVERTED QUESTION MARK -=C1 U+0060 GRAVE ACCENT -=C2 U+00B4 ACUTE ACCENT -=C3 U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT -=C4 U+02DC SMALL TILDE -=C5 U+00AF MACRON -=C6 U+02D8 BREVE -=C7 U+02D9 DOT ABOVE -=C8 U+00A8 DIAERESIS -=CA U+02DA RING ABOVE -=CB U+00B8 CEDILLA -=CD U+02DD DOUBLE ACUTE ACCENT -=CE U+02DB OGONEK -=CF U+02C7 CARON -=D0 U+2014 EM DASH -=E1 U+00C6 LATIN CAPITAL LETTER AE -=E3 U+00AA FEMININE ORDINAL INDICATOR -=E8 U+0141 LATIN CAPITAL LETTER L WITH STROKE -=E9 U+00D8 LATIN CAPITAL LETTER O WITH STROKE -=EA U+0152 LATIN CAPITAL LIGATURE OE -=EB U+00BA MASCULINE ORDINAL INDICATOR -=F1 U+00E6 LATIN SMALL LETTER AE -=F5 U+0131 LATIN SMALL LETTER DOTLESS I -=F8 U+0142 LATIN SMALL LETTER L WITH STROKE -=F9 U+00F8 LATIN SMALL LETTER O WITH STROKE -=FA U+0153 LATIN SMALL LIGATURE OE -=FB U+00DF LATIN SMALL LETTER SHARP S - -// unencoded characters: -=100 U+00E7 LATIN SMALL LETTER C WITH CEDILLA -=101 U+00FF LATIN SMALL LETTER Y WITH DIAERESIS -=102 U+00E3 LATIN SMALL LETTER A WITH TILDE -=103 U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX -=104 U+00B3 SUPERSCRIPT THREE -=105 U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX -=106 U+00FE LATIN SMALL LETTER THORN -=107 U+00E8 LATIN SMALL LETTER E WITH GRAVE -=108 U+00B2 SUPERSCRIPT TWO -=109 U+00E9 LATIN SMALL LETTER E WITH ACUTE -=10A U+00F5 LATIN SMALL LETTER O WITH TILDE -=10B U+00C1 LATIN CAPITAL LETTER A WITH ACUTE -=10C U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX -=10D U+00FD LATIN SMALL LETTER Y WITH ACUTE -=10E U+00FC LATIN SMALL LETTER U WITH DIAERESIS -=10F U+00BE VULGAR FRACTION THREE QUARTERS -=110 U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX -=111 U+00D0 LATIN CAPITAL LETTER ETH -=112 U+00EB LATIN SMALL LETTER E WITH DIAERESIS -=113 U+00F9 LATIN SMALL LETTER U WITH GRAVE -=114 U+2122 TRADE MARK SIGN -=115 U+00F2 LATIN SMALL LETTER O WITH GRAVE -=116 U+0161 LATIN SMALL LETTER S WITH CARON -=117 U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS -=118 U+00FA LATIN SMALL LETTER U WITH ACUTE -=119 U+00E0 LATIN SMALL LETTER A WITH GRAVE -=11A U+00F1 LATIN SMALL LETTER N WITH TILDE -=11B U+00E5 LATIN SMALL LETTER A WITH RING ABOVE -=11C U+017E LATIN SMALL LETTER Z WITH CARON -=11D U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX -=11E U+00D1 LATIN CAPITAL LETTER N WITH TILDE -=11F U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX -=120 U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX -=121 U+00CD LATIN CAPITAL LETTER I WITH ACUTE -=122 U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA -=123 U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS -=124 U+0160 LATIN CAPITAL LETTER S WITH CARON -=125 U+00CC LATIN CAPITAL LETTER I WITH GRAVE -=126 U+00E4 LATIN SMALL LETTER A WITH DIAERESIS -=127 U+00D2 LATIN CAPITAL LETTER O WITH GRAVE -=128 U+00C8 LATIN CAPITAL LETTER E WITH GRAVE -=129 U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS -=12A U+00AE REGISTERED SIGN -=12B U+00D5 LATIN CAPITAL LETTER O WITH TILDE -=12C U+00BC VULGAR FRACTION ONE QUARTER -=12D U+00D9 LATIN CAPITAL LETTER U WITH GRAVE -=12E U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX -=12F U+00DE LATIN CAPITAL LETTER THORN -=130 U+00F7 DIVISION SIGN -=131 U+00C3 LATIN CAPITAL LETTER A WITH TILDE -=132 U+00DA LATIN CAPITAL LETTER U WITH ACUTE -=133 U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX -=134 U+00AC NOT SIGN -=135 U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE -=136 U+00EF LATIN SMALL LETTER I WITH DIAERESIS -=137 U+00ED LATIN SMALL LETTER I WITH ACUTE -=138 U+00E1 LATIN SMALL LETTER A WITH ACUTE -=139 U+00B1 PLUS-MINUS SIGN -=13A U+00D7 MULTIPLICATION SIGN -=13B U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS -=13C U+2212 MINUS SIGN -=13D U+00B9 SUPERSCRIPT ONE -=13E U+00C9 LATIN CAPITAL LETTER E WITH ACUTE -=13F U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX -=140 U+00A9 COPYRIGHT SIGN -=141 U+00C0 LATIN CAPITAL LETTER A WITH GRAVE -=142 U+00F6 LATIN SMALL LETTER O WITH DIAERESIS -=143 U+00F3 LATIN SMALL LETTER O WITH ACUTE -=144 U+00B0 DEGREE SIGN -=145 U+00EC LATIN SMALL LETTER I WITH GRAVE -=146 U+00B5 MICRO SIGN -=147 U+00D3 LATIN CAPITAL LETTER O WITH ACUTE -=148 U+00F0 LATIN SMALL LETTER ETH -=149 U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS -=14A U+00DD LATIN CAPITAL LETTER Y WITH ACUTE -=14B U+00A6 BROKEN BAR -=14C U+00BD VULGAR FRACTION ONE HALF diff --git a/vendor/phenx/php-font-lib/maps/cp1250.map b/vendor/phenx/php-font-lib/maps/cp1250.map deleted file mode 100644 index ec110af..0000000 --- a/vendor/phenx/php-font-lib/maps/cp1250.map +++ /dev/null @@ -1,251 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!89 U+2030 perthousand -!8A U+0160 Scaron -!8B U+2039 guilsinglleft -!8C U+015A Sacute -!8D U+0164 Tcaron -!8E U+017D Zcaron -!8F U+0179 Zacute -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9A U+0161 scaron -!9B U+203A guilsinglright -!9C U+015B sacute -!9D U+0165 tcaron -!9E U+017E zcaron -!9F U+017A zacute -!A0 U+00A0 space -!A1 U+02C7 caron -!A2 U+02D8 breve -!A3 U+0141 Lslash -!A4 U+00A4 currency -!A5 U+0104 Aogonek -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+015E Scedilla -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+017B Zdotaccent -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+02DB ogonek -!B3 U+0142 lslash -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+0105 aogonek -!BA U+015F scedilla -!BB U+00BB guillemotright -!BC U+013D Lcaron -!BD U+02DD hungarumlaut -!BE U+013E lcaron -!BF U+017C zdotaccent -!C0 U+0154 Racute -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+0139 Lacute -!C6 U+0106 Cacute -!C7 U+00C7 Ccedilla -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0118 Eogonek -!CB U+00CB Edieresis -!CC U+011A Ecaron -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+010E Dcaron -!D0 U+0110 Dcroat -!D1 U+0143 Nacute -!D2 U+0147 Ncaron -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+0150 Ohungarumlaut -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+0158 Rcaron -!D9 U+016E Uring -!DA U+00DA Uacute -!DB U+0170 Uhungarumlaut -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+0162 Tcommaaccent -!DF U+00DF germandbls -!E0 U+0155 racute -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+013A lacute -!E6 U+0107 cacute -!E7 U+00E7 ccedilla -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+0119 eogonek -!EB U+00EB edieresis -!EC U+011B ecaron -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+010F dcaron -!F0 U+0111 dcroat -!F1 U+0144 nacute -!F2 U+0148 ncaron -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+0151 ohungarumlaut -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+0159 rcaron -!F9 U+016F uring -!FA U+00FA uacute -!FB U+0171 uhungarumlaut -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+0163 tcommaaccent -!FF U+02D9 dotaccent diff --git a/vendor/phenx/php-font-lib/maps/cp1251.map b/vendor/phenx/php-font-lib/maps/cp1251.map deleted file mode 100644 index de6a198..0000000 --- a/vendor/phenx/php-font-lib/maps/cp1251.map +++ /dev/null @@ -1,255 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0402 afii10051 -!81 U+0403 afii10052 -!82 U+201A quotesinglbase -!83 U+0453 afii10100 -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+20AC Euro -!89 U+2030 perthousand -!8A U+0409 afii10058 -!8B U+2039 guilsinglleft -!8C U+040A afii10059 -!8D U+040C afii10061 -!8E U+040B afii10060 -!8F U+040F afii10145 -!90 U+0452 afii10099 -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9A U+0459 afii10106 -!9B U+203A guilsinglright -!9C U+045A afii10107 -!9D U+045C afii10109 -!9E U+045B afii10108 -!9F U+045F afii10193 -!A0 U+00A0 space -!A1 U+040E afii10062 -!A2 U+045E afii10110 -!A3 U+0408 afii10057 -!A4 U+00A4 currency -!A5 U+0490 afii10050 -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+0401 afii10023 -!A9 U+00A9 copyright -!AA U+0404 afii10053 -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+0407 afii10056 -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+0406 afii10055 -!B3 U+0456 afii10103 -!B4 U+0491 afii10098 -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+0451 afii10071 -!B9 U+2116 afii61352 -!BA U+0454 afii10101 -!BB U+00BB guillemotright -!BC U+0458 afii10105 -!BD U+0405 afii10054 -!BE U+0455 afii10102 -!BF U+0457 afii10104 -!C0 U+0410 afii10017 -!C1 U+0411 afii10018 -!C2 U+0412 afii10019 -!C3 U+0413 afii10020 -!C4 U+0414 afii10021 -!C5 U+0415 afii10022 -!C6 U+0416 afii10024 -!C7 U+0417 afii10025 -!C8 U+0418 afii10026 -!C9 U+0419 afii10027 -!CA U+041A afii10028 -!CB U+041B afii10029 -!CC U+041C afii10030 -!CD U+041D afii10031 -!CE U+041E afii10032 -!CF U+041F afii10033 -!D0 U+0420 afii10034 -!D1 U+0421 afii10035 -!D2 U+0422 afii10036 -!D3 U+0423 afii10037 -!D4 U+0424 afii10038 -!D5 U+0425 afii10039 -!D6 U+0426 afii10040 -!D7 U+0427 afii10041 -!D8 U+0428 afii10042 -!D9 U+0429 afii10043 -!DA U+042A afii10044 -!DB U+042B afii10045 -!DC U+042C afii10046 -!DD U+042D afii10047 -!DE U+042E afii10048 -!DF U+042F afii10049 -!E0 U+0430 afii10065 -!E1 U+0431 afii10066 -!E2 U+0432 afii10067 -!E3 U+0433 afii10068 -!E4 U+0434 afii10069 -!E5 U+0435 afii10070 -!E6 U+0436 afii10072 -!E7 U+0437 afii10073 -!E8 U+0438 afii10074 -!E9 U+0439 afii10075 -!EA U+043A afii10076 -!EB U+043B afii10077 -!EC U+043C afii10078 -!ED U+043D afii10079 -!EE U+043E afii10080 -!EF U+043F afii10081 -!F0 U+0440 afii10082 -!F1 U+0441 afii10083 -!F2 U+0442 afii10084 -!F3 U+0443 afii10085 -!F4 U+0444 afii10086 -!F5 U+0445 afii10087 -!F6 U+0446 afii10088 -!F7 U+0447 afii10089 -!F8 U+0448 afii10090 -!F9 U+0449 afii10091 -!FA U+044A afii10092 -!FB U+044B afii10093 -!FC U+044C afii10094 -!FD U+044D afii10095 -!FE U+044E afii10096 -!FF U+044F afii10097 diff --git a/vendor/phenx/php-font-lib/maps/cp1252.map b/vendor/phenx/php-font-lib/maps/cp1252.map deleted file mode 100644 index dd490e5..0000000 --- a/vendor/phenx/php-font-lib/maps/cp1252.map +++ /dev/null @@ -1,251 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8A U+0160 Scaron -!8B U+2039 guilsinglleft -!8C U+0152 OE -!8E U+017D Zcaron -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9A U+0161 scaron -!9B U+203A guilsinglright -!9C U+0153 oe -!9E U+017E zcaron -!9F U+0178 Ydieresis -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+00D0 Eth -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+00DE Thorn -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+00F0 eth -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+00FE thorn -!FF U+00FF ydieresis diff --git a/vendor/phenx/php-font-lib/maps/cp1253.map b/vendor/phenx/php-font-lib/maps/cp1253.map deleted file mode 100644 index 4bd826f..0000000 --- a/vendor/phenx/php-font-lib/maps/cp1253.map +++ /dev/null @@ -1,239 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9B U+203A guilsinglright -!A0 U+00A0 space -!A1 U+0385 dieresistonos -!A2 U+0386 Alphatonos -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+2015 afii00208 -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+0384 tonos -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+0388 Epsilontonos -!B9 U+0389 Etatonos -!BA U+038A Iotatonos -!BB U+00BB guillemotright -!BC U+038C Omicrontonos -!BD U+00BD onehalf -!BE U+038E Upsilontonos -!BF U+038F Omegatonos -!C0 U+0390 iotadieresistonos -!C1 U+0391 Alpha -!C2 U+0392 Beta -!C3 U+0393 Gamma -!C4 U+0394 Delta -!C5 U+0395 Epsilon -!C6 U+0396 Zeta -!C7 U+0397 Eta -!C8 U+0398 Theta -!C9 U+0399 Iota -!CA U+039A Kappa -!CB U+039B Lambda -!CC U+039C Mu -!CD U+039D Nu -!CE U+039E Xi -!CF U+039F Omicron -!D0 U+03A0 Pi -!D1 U+03A1 Rho -!D3 U+03A3 Sigma -!D4 U+03A4 Tau -!D5 U+03A5 Upsilon -!D6 U+03A6 Phi -!D7 U+03A7 Chi -!D8 U+03A8 Psi -!D9 U+03A9 Omega -!DA U+03AA Iotadieresis -!DB U+03AB Upsilondieresis -!DC U+03AC alphatonos -!DD U+03AD epsilontonos -!DE U+03AE etatonos -!DF U+03AF iotatonos -!E0 U+03B0 upsilondieresistonos -!E1 U+03B1 alpha -!E2 U+03B2 beta -!E3 U+03B3 gamma -!E4 U+03B4 delta -!E5 U+03B5 epsilon -!E6 U+03B6 zeta -!E7 U+03B7 eta -!E8 U+03B8 theta -!E9 U+03B9 iota -!EA U+03BA kappa -!EB U+03BB lambda -!EC U+03BC mu -!ED U+03BD nu -!EE U+03BE xi -!EF U+03BF omicron -!F0 U+03C0 pi -!F1 U+03C1 rho -!F2 U+03C2 sigma1 -!F3 U+03C3 sigma -!F4 U+03C4 tau -!F5 U+03C5 upsilon -!F6 U+03C6 phi -!F7 U+03C7 chi -!F8 U+03C8 psi -!F9 U+03C9 omega -!FA U+03CA iotadieresis -!FB U+03CB upsilondieresis -!FC U+03CC omicrontonos -!FD U+03CD upsilontonos -!FE U+03CE omegatonos diff --git a/vendor/phenx/php-font-lib/maps/cp1254.map b/vendor/phenx/php-font-lib/maps/cp1254.map deleted file mode 100644 index 829473b..0000000 --- a/vendor/phenx/php-font-lib/maps/cp1254.map +++ /dev/null @@ -1,249 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8A U+0160 Scaron -!8B U+2039 guilsinglleft -!8C U+0152 OE -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9A U+0161 scaron -!9B U+203A guilsinglright -!9C U+0153 oe -!9F U+0178 Ydieresis -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+011E Gbreve -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0130 Idotaccent -!DE U+015E Scedilla -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+011F gbreve -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0131 dotlessi -!FE U+015F scedilla -!FF U+00FF ydieresis diff --git a/vendor/phenx/php-font-lib/maps/cp1255.map b/vendor/phenx/php-font-lib/maps/cp1255.map deleted file mode 100644 index 079e10c..0000000 --- a/vendor/phenx/php-font-lib/maps/cp1255.map +++ /dev/null @@ -1,233 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9B U+203A guilsinglright -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+20AA afii57636 -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00D7 multiply -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD sfthyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 middot -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00F7 divide -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+05B0 afii57799 -!C1 U+05B1 afii57801 -!C2 U+05B2 afii57800 -!C3 U+05B3 afii57802 -!C4 U+05B4 afii57793 -!C5 U+05B5 afii57794 -!C6 U+05B6 afii57795 -!C7 U+05B7 afii57798 -!C8 U+05B8 afii57797 -!C9 U+05B9 afii57806 -!CB U+05BB afii57796 -!CC U+05BC afii57807 -!CD U+05BD afii57839 -!CE U+05BE afii57645 -!CF U+05BF afii57841 -!D0 U+05C0 afii57842 -!D1 U+05C1 afii57804 -!D2 U+05C2 afii57803 -!D3 U+05C3 afii57658 -!D4 U+05F0 afii57716 -!D5 U+05F1 afii57717 -!D6 U+05F2 afii57718 -!D7 U+05F3 gereshhebrew -!D8 U+05F4 gershayimhebrew -!E0 U+05D0 afii57664 -!E1 U+05D1 afii57665 -!E2 U+05D2 afii57666 -!E3 U+05D3 afii57667 -!E4 U+05D4 afii57668 -!E5 U+05D5 afii57669 -!E6 U+05D6 afii57670 -!E7 U+05D7 afii57671 -!E8 U+05D8 afii57672 -!E9 U+05D9 afii57673 -!EA U+05DA afii57674 -!EB U+05DB afii57675 -!EC U+05DC afii57676 -!ED U+05DD afii57677 -!EE U+05DE afii57678 -!EF U+05DF afii57679 -!F0 U+05E0 afii57680 -!F1 U+05E1 afii57681 -!F2 U+05E2 afii57682 -!F3 U+05E3 afii57683 -!F4 U+05E4 afii57684 -!F5 U+05E5 afii57685 -!F6 U+05E6 afii57686 -!F7 U+05E7 afii57687 -!F8 U+05E8 afii57688 -!F9 U+05E9 afii57689 -!FA U+05EA afii57690 -!FD U+200E afii299 -!FE U+200F afii300 diff --git a/vendor/phenx/php-font-lib/maps/cp1257.map b/vendor/phenx/php-font-lib/maps/cp1257.map deleted file mode 100644 index 2f2ecfa..0000000 --- a/vendor/phenx/php-font-lib/maps/cp1257.map +++ /dev/null @@ -1,244 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!8D U+00A8 dieresis -!8E U+02C7 caron -!8F U+00B8 cedilla -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!99 U+2122 trademark -!9B U+203A guilsinglright -!9D U+00AF macron -!9E U+02DB ogonek -!A0 U+00A0 space -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00D8 Oslash -!A9 U+00A9 copyright -!AA U+0156 Rcommaaccent -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00C6 AE -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00F8 oslash -!B9 U+00B9 onesuperior -!BA U+0157 rcommaaccent -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00E6 ae -!C0 U+0104 Aogonek -!C1 U+012E Iogonek -!C2 U+0100 Amacron -!C3 U+0106 Cacute -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+0118 Eogonek -!C7 U+0112 Emacron -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0179 Zacute -!CB U+0116 Edotaccent -!CC U+0122 Gcommaaccent -!CD U+0136 Kcommaaccent -!CE U+012A Imacron -!CF U+013B Lcommaaccent -!D0 U+0160 Scaron -!D1 U+0143 Nacute -!D2 U+0145 Ncommaaccent -!D3 U+00D3 Oacute -!D4 U+014C Omacron -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+0172 Uogonek -!D9 U+0141 Lslash -!DA U+015A Sacute -!DB U+016A Umacron -!DC U+00DC Udieresis -!DD U+017B Zdotaccent -!DE U+017D Zcaron -!DF U+00DF germandbls -!E0 U+0105 aogonek -!E1 U+012F iogonek -!E2 U+0101 amacron -!E3 U+0107 cacute -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+0119 eogonek -!E7 U+0113 emacron -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+017A zacute -!EB U+0117 edotaccent -!EC U+0123 gcommaaccent -!ED U+0137 kcommaaccent -!EE U+012B imacron -!EF U+013C lcommaaccent -!F0 U+0161 scaron -!F1 U+0144 nacute -!F2 U+0146 ncommaaccent -!F3 U+00F3 oacute -!F4 U+014D omacron -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+0173 uogonek -!F9 U+0142 lslash -!FA U+015B sacute -!FB U+016B umacron -!FC U+00FC udieresis -!FD U+017C zdotaccent -!FE U+017E zcaron -!FF U+02D9 dotaccent diff --git a/vendor/phenx/php-font-lib/maps/cp1258.map b/vendor/phenx/php-font-lib/maps/cp1258.map deleted file mode 100644 index fed915f..0000000 --- a/vendor/phenx/php-font-lib/maps/cp1258.map +++ /dev/null @@ -1,247 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!82 U+201A quotesinglbase -!83 U+0192 florin -!84 U+201E quotedblbase -!85 U+2026 ellipsis -!86 U+2020 dagger -!87 U+2021 daggerdbl -!88 U+02C6 circumflex -!89 U+2030 perthousand -!8B U+2039 guilsinglleft -!8C U+0152 OE -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!98 U+02DC tilde -!99 U+2122 trademark -!9B U+203A guilsinglright -!9C U+0153 oe -!9F U+0178 Ydieresis -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+0300 gravecomb -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+0110 Dcroat -!D1 U+00D1 Ntilde -!D2 U+0309 hookabovecomb -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+01A0 Ohorn -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+01AF Uhorn -!DE U+0303 tildecomb -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+0301 acutecomb -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+0111 dcroat -!F1 U+00F1 ntilde -!F2 U+0323 dotbelowcomb -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+01A1 ohorn -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+01B0 uhorn -!FE U+20AB dong -!FF U+00FF ydieresis diff --git a/vendor/phenx/php-font-lib/maps/cp874.map b/vendor/phenx/php-font-lib/maps/cp874.map deleted file mode 100644 index 1006e6b..0000000 --- a/vendor/phenx/php-font-lib/maps/cp874.map +++ /dev/null @@ -1,225 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+20AC Euro -!85 U+2026 ellipsis -!91 U+2018 quoteleft -!92 U+2019 quoteright -!93 U+201C quotedblleft -!94 U+201D quotedblright -!95 U+2022 bullet -!96 U+2013 endash -!97 U+2014 emdash -!A0 U+00A0 space -!A1 U+0E01 kokaithai -!A2 U+0E02 khokhaithai -!A3 U+0E03 khokhuatthai -!A4 U+0E04 khokhwaithai -!A5 U+0E05 khokhonthai -!A6 U+0E06 khorakhangthai -!A7 U+0E07 ngonguthai -!A8 U+0E08 chochanthai -!A9 U+0E09 chochingthai -!AA U+0E0A chochangthai -!AB U+0E0B sosothai -!AC U+0E0C chochoethai -!AD U+0E0D yoyingthai -!AE U+0E0E dochadathai -!AF U+0E0F topatakthai -!B0 U+0E10 thothanthai -!B1 U+0E11 thonangmonthothai -!B2 U+0E12 thophuthaothai -!B3 U+0E13 nonenthai -!B4 U+0E14 dodekthai -!B5 U+0E15 totaothai -!B6 U+0E16 thothungthai -!B7 U+0E17 thothahanthai -!B8 U+0E18 thothongthai -!B9 U+0E19 nonuthai -!BA U+0E1A bobaimaithai -!BB U+0E1B poplathai -!BC U+0E1C phophungthai -!BD U+0E1D fofathai -!BE U+0E1E phophanthai -!BF U+0E1F fofanthai -!C0 U+0E20 phosamphaothai -!C1 U+0E21 momathai -!C2 U+0E22 yoyakthai -!C3 U+0E23 roruathai -!C4 U+0E24 ruthai -!C5 U+0E25 lolingthai -!C6 U+0E26 luthai -!C7 U+0E27 wowaenthai -!C8 U+0E28 sosalathai -!C9 U+0E29 sorusithai -!CA U+0E2A sosuathai -!CB U+0E2B hohipthai -!CC U+0E2C lochulathai -!CD U+0E2D oangthai -!CE U+0E2E honokhukthai -!CF U+0E2F paiyannoithai -!D0 U+0E30 saraathai -!D1 U+0E31 maihanakatthai -!D2 U+0E32 saraaathai -!D3 U+0E33 saraamthai -!D4 U+0E34 saraithai -!D5 U+0E35 saraiithai -!D6 U+0E36 sarauethai -!D7 U+0E37 saraueethai -!D8 U+0E38 sarauthai -!D9 U+0E39 sarauuthai -!DA U+0E3A phinthuthai -!DF U+0E3F bahtthai -!E0 U+0E40 saraethai -!E1 U+0E41 saraaethai -!E2 U+0E42 saraothai -!E3 U+0E43 saraaimaimuanthai -!E4 U+0E44 saraaimaimalaithai -!E5 U+0E45 lakkhangyaothai -!E6 U+0E46 maiyamokthai -!E7 U+0E47 maitaikhuthai -!E8 U+0E48 maiekthai -!E9 U+0E49 maithothai -!EA U+0E4A maitrithai -!EB U+0E4B maichattawathai -!EC U+0E4C thanthakhatthai -!ED U+0E4D nikhahitthai -!EE U+0E4E yamakkanthai -!EF U+0E4F fongmanthai -!F0 U+0E50 zerothai -!F1 U+0E51 onethai -!F2 U+0E52 twothai -!F3 U+0E53 threethai -!F4 U+0E54 fourthai -!F5 U+0E55 fivethai -!F6 U+0E56 sixthai -!F7 U+0E57 seventhai -!F8 U+0E58 eightthai -!F9 U+0E59 ninethai -!FA U+0E5A angkhankhuthai -!FB U+0E5B khomutthai diff --git a/vendor/phenx/php-font-lib/maps/iso-8859-1.map b/vendor/phenx/php-font-lib/maps/iso-8859-1.map deleted file mode 100644 index 61740a3..0000000 --- a/vendor/phenx/php-font-lib/maps/iso-8859-1.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+00D0 Eth -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+00DE Thorn -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+00F0 eth -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+00FE thorn -!FF U+00FF ydieresis diff --git a/vendor/phenx/php-font-lib/maps/iso-8859-11.map b/vendor/phenx/php-font-lib/maps/iso-8859-11.map deleted file mode 100644 index 9168812..0000000 --- a/vendor/phenx/php-font-lib/maps/iso-8859-11.map +++ /dev/null @@ -1,248 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0E01 kokaithai -!A2 U+0E02 khokhaithai -!A3 U+0E03 khokhuatthai -!A4 U+0E04 khokhwaithai -!A5 U+0E05 khokhonthai -!A6 U+0E06 khorakhangthai -!A7 U+0E07 ngonguthai -!A8 U+0E08 chochanthai -!A9 U+0E09 chochingthai -!AA U+0E0A chochangthai -!AB U+0E0B sosothai -!AC U+0E0C chochoethai -!AD U+0E0D yoyingthai -!AE U+0E0E dochadathai -!AF U+0E0F topatakthai -!B0 U+0E10 thothanthai -!B1 U+0E11 thonangmonthothai -!B2 U+0E12 thophuthaothai -!B3 U+0E13 nonenthai -!B4 U+0E14 dodekthai -!B5 U+0E15 totaothai -!B6 U+0E16 thothungthai -!B7 U+0E17 thothahanthai -!B8 U+0E18 thothongthai -!B9 U+0E19 nonuthai -!BA U+0E1A bobaimaithai -!BB U+0E1B poplathai -!BC U+0E1C phophungthai -!BD U+0E1D fofathai -!BE U+0E1E phophanthai -!BF U+0E1F fofanthai -!C0 U+0E20 phosamphaothai -!C1 U+0E21 momathai -!C2 U+0E22 yoyakthai -!C3 U+0E23 roruathai -!C4 U+0E24 ruthai -!C5 U+0E25 lolingthai -!C6 U+0E26 luthai -!C7 U+0E27 wowaenthai -!C8 U+0E28 sosalathai -!C9 U+0E29 sorusithai -!CA U+0E2A sosuathai -!CB U+0E2B hohipthai -!CC U+0E2C lochulathai -!CD U+0E2D oangthai -!CE U+0E2E honokhukthai -!CF U+0E2F paiyannoithai -!D0 U+0E30 saraathai -!D1 U+0E31 maihanakatthai -!D2 U+0E32 saraaathai -!D3 U+0E33 saraamthai -!D4 U+0E34 saraithai -!D5 U+0E35 saraiithai -!D6 U+0E36 sarauethai -!D7 U+0E37 saraueethai -!D8 U+0E38 sarauthai -!D9 U+0E39 sarauuthai -!DA U+0E3A phinthuthai -!DF U+0E3F bahtthai -!E0 U+0E40 saraethai -!E1 U+0E41 saraaethai -!E2 U+0E42 saraothai -!E3 U+0E43 saraaimaimuanthai -!E4 U+0E44 saraaimaimalaithai -!E5 U+0E45 lakkhangyaothai -!E6 U+0E46 maiyamokthai -!E7 U+0E47 maitaikhuthai -!E8 U+0E48 maiekthai -!E9 U+0E49 maithothai -!EA U+0E4A maitrithai -!EB U+0E4B maichattawathai -!EC U+0E4C thanthakhatthai -!ED U+0E4D nikhahitthai -!EE U+0E4E yamakkanthai -!EF U+0E4F fongmanthai -!F0 U+0E50 zerothai -!F1 U+0E51 onethai -!F2 U+0E52 twothai -!F3 U+0E53 threethai -!F4 U+0E54 fourthai -!F5 U+0E55 fivethai -!F6 U+0E56 sixthai -!F7 U+0E57 seventhai -!F8 U+0E58 eightthai -!F9 U+0E59 ninethai -!FA U+0E5A angkhankhuthai -!FB U+0E5B khomutthai diff --git a/vendor/phenx/php-font-lib/maps/iso-8859-15.map b/vendor/phenx/php-font-lib/maps/iso-8859-15.map deleted file mode 100644 index 6c2b571..0000000 --- a/vendor/phenx/php-font-lib/maps/iso-8859-15.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+20AC Euro -!A5 U+00A5 yen -!A6 U+0160 Scaron -!A7 U+00A7 section -!A8 U+0161 scaron -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+017D Zcaron -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+017E zcaron -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+0152 OE -!BD U+0153 oe -!BE U+0178 Ydieresis -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+00D0 Eth -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+00DE Thorn -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+00F0 eth -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+00FE thorn -!FF U+00FF ydieresis diff --git a/vendor/phenx/php-font-lib/maps/iso-8859-16.map b/vendor/phenx/php-font-lib/maps/iso-8859-16.map deleted file mode 100644 index 202c8fe..0000000 --- a/vendor/phenx/php-font-lib/maps/iso-8859-16.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0104 Aogonek -!A2 U+0105 aogonek -!A3 U+0141 Lslash -!A4 U+20AC Euro -!A5 U+201E quotedblbase -!A6 U+0160 Scaron -!A7 U+00A7 section -!A8 U+0161 scaron -!A9 U+00A9 copyright -!AA U+0218 Scommaaccent -!AB U+00AB guillemotleft -!AC U+0179 Zacute -!AD U+00AD hyphen -!AE U+017A zacute -!AF U+017B Zdotaccent -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+010C Ccaron -!B3 U+0142 lslash -!B4 U+017D Zcaron -!B5 U+201D quotedblright -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+017E zcaron -!B9 U+010D ccaron -!BA U+0219 scommaaccent -!BB U+00BB guillemotright -!BC U+0152 OE -!BD U+0153 oe -!BE U+0178 Ydieresis -!BF U+017C zdotaccent -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+0106 Cacute -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+0110 Dcroat -!D1 U+0143 Nacute -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+0150 Ohungarumlaut -!D6 U+00D6 Odieresis -!D7 U+015A Sacute -!D8 U+0170 Uhungarumlaut -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0118 Eogonek -!DE U+021A Tcommaaccent -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+0107 cacute -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+0111 dcroat -!F1 U+0144 nacute -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+0151 ohungarumlaut -!F6 U+00F6 odieresis -!F7 U+015B sacute -!F8 U+0171 uhungarumlaut -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0119 eogonek -!FE U+021B tcommaaccent -!FF U+00FF ydieresis diff --git a/vendor/phenx/php-font-lib/maps/iso-8859-2.map b/vendor/phenx/php-font-lib/maps/iso-8859-2.map deleted file mode 100644 index 65ae09f..0000000 --- a/vendor/phenx/php-font-lib/maps/iso-8859-2.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0104 Aogonek -!A2 U+02D8 breve -!A3 U+0141 Lslash -!A4 U+00A4 currency -!A5 U+013D Lcaron -!A6 U+015A Sacute -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+0160 Scaron -!AA U+015E Scedilla -!AB U+0164 Tcaron -!AC U+0179 Zacute -!AD U+00AD hyphen -!AE U+017D Zcaron -!AF U+017B Zdotaccent -!B0 U+00B0 degree -!B1 U+0105 aogonek -!B2 U+02DB ogonek -!B3 U+0142 lslash -!B4 U+00B4 acute -!B5 U+013E lcaron -!B6 U+015B sacute -!B7 U+02C7 caron -!B8 U+00B8 cedilla -!B9 U+0161 scaron -!BA U+015F scedilla -!BB U+0165 tcaron -!BC U+017A zacute -!BD U+02DD hungarumlaut -!BE U+017E zcaron -!BF U+017C zdotaccent -!C0 U+0154 Racute -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+0102 Abreve -!C4 U+00C4 Adieresis -!C5 U+0139 Lacute -!C6 U+0106 Cacute -!C7 U+00C7 Ccedilla -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0118 Eogonek -!CB U+00CB Edieresis -!CC U+011A Ecaron -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+010E Dcaron -!D0 U+0110 Dcroat -!D1 U+0143 Nacute -!D2 U+0147 Ncaron -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+0150 Ohungarumlaut -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+0158 Rcaron -!D9 U+016E Uring -!DA U+00DA Uacute -!DB U+0170 Uhungarumlaut -!DC U+00DC Udieresis -!DD U+00DD Yacute -!DE U+0162 Tcommaaccent -!DF U+00DF germandbls -!E0 U+0155 racute -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+0103 abreve -!E4 U+00E4 adieresis -!E5 U+013A lacute -!E6 U+0107 cacute -!E7 U+00E7 ccedilla -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+0119 eogonek -!EB U+00EB edieresis -!EC U+011B ecaron -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+010F dcaron -!F0 U+0111 dcroat -!F1 U+0144 nacute -!F2 U+0148 ncaron -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+0151 ohungarumlaut -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+0159 rcaron -!F9 U+016F uring -!FA U+00FA uacute -!FB U+0171 uhungarumlaut -!FC U+00FC udieresis -!FD U+00FD yacute -!FE U+0163 tcommaaccent -!FF U+02D9 dotaccent diff --git a/vendor/phenx/php-font-lib/maps/iso-8859-4.map b/vendor/phenx/php-font-lib/maps/iso-8859-4.map deleted file mode 100644 index a7d87bf..0000000 --- a/vendor/phenx/php-font-lib/maps/iso-8859-4.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0104 Aogonek -!A2 U+0138 kgreenlandic -!A3 U+0156 Rcommaaccent -!A4 U+00A4 currency -!A5 U+0128 Itilde -!A6 U+013B Lcommaaccent -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+0160 Scaron -!AA U+0112 Emacron -!AB U+0122 Gcommaaccent -!AC U+0166 Tbar -!AD U+00AD hyphen -!AE U+017D Zcaron -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+0105 aogonek -!B2 U+02DB ogonek -!B3 U+0157 rcommaaccent -!B4 U+00B4 acute -!B5 U+0129 itilde -!B6 U+013C lcommaaccent -!B7 U+02C7 caron -!B8 U+00B8 cedilla -!B9 U+0161 scaron -!BA U+0113 emacron -!BB U+0123 gcommaaccent -!BC U+0167 tbar -!BD U+014A Eng -!BE U+017E zcaron -!BF U+014B eng -!C0 U+0100 Amacron -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+012E Iogonek -!C8 U+010C Ccaron -!C9 U+00C9 Eacute -!CA U+0118 Eogonek -!CB U+00CB Edieresis -!CC U+0116 Edotaccent -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+012A Imacron -!D0 U+0110 Dcroat -!D1 U+0145 Ncommaaccent -!D2 U+014C Omacron -!D3 U+0136 Kcommaaccent -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+0172 Uogonek -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0168 Utilde -!DE U+016A Umacron -!DF U+00DF germandbls -!E0 U+0101 amacron -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+012F iogonek -!E8 U+010D ccaron -!E9 U+00E9 eacute -!EA U+0119 eogonek -!EB U+00EB edieresis -!EC U+0117 edotaccent -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+012B imacron -!F0 U+0111 dcroat -!F1 U+0146 ncommaaccent -!F2 U+014D omacron -!F3 U+0137 kcommaaccent -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+0173 uogonek -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0169 utilde -!FE U+016B umacron -!FF U+02D9 dotaccent diff --git a/vendor/phenx/php-font-lib/maps/iso-8859-5.map b/vendor/phenx/php-font-lib/maps/iso-8859-5.map deleted file mode 100644 index f9cd4ed..0000000 --- a/vendor/phenx/php-font-lib/maps/iso-8859-5.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+0401 afii10023 -!A2 U+0402 afii10051 -!A3 U+0403 afii10052 -!A4 U+0404 afii10053 -!A5 U+0405 afii10054 -!A6 U+0406 afii10055 -!A7 U+0407 afii10056 -!A8 U+0408 afii10057 -!A9 U+0409 afii10058 -!AA U+040A afii10059 -!AB U+040B afii10060 -!AC U+040C afii10061 -!AD U+00AD hyphen -!AE U+040E afii10062 -!AF U+040F afii10145 -!B0 U+0410 afii10017 -!B1 U+0411 afii10018 -!B2 U+0412 afii10019 -!B3 U+0413 afii10020 -!B4 U+0414 afii10021 -!B5 U+0415 afii10022 -!B6 U+0416 afii10024 -!B7 U+0417 afii10025 -!B8 U+0418 afii10026 -!B9 U+0419 afii10027 -!BA U+041A afii10028 -!BB U+041B afii10029 -!BC U+041C afii10030 -!BD U+041D afii10031 -!BE U+041E afii10032 -!BF U+041F afii10033 -!C0 U+0420 afii10034 -!C1 U+0421 afii10035 -!C2 U+0422 afii10036 -!C3 U+0423 afii10037 -!C4 U+0424 afii10038 -!C5 U+0425 afii10039 -!C6 U+0426 afii10040 -!C7 U+0427 afii10041 -!C8 U+0428 afii10042 -!C9 U+0429 afii10043 -!CA U+042A afii10044 -!CB U+042B afii10045 -!CC U+042C afii10046 -!CD U+042D afii10047 -!CE U+042E afii10048 -!CF U+042F afii10049 -!D0 U+0430 afii10065 -!D1 U+0431 afii10066 -!D2 U+0432 afii10067 -!D3 U+0433 afii10068 -!D4 U+0434 afii10069 -!D5 U+0435 afii10070 -!D6 U+0436 afii10072 -!D7 U+0437 afii10073 -!D8 U+0438 afii10074 -!D9 U+0439 afii10075 -!DA U+043A afii10076 -!DB U+043B afii10077 -!DC U+043C afii10078 -!DD U+043D afii10079 -!DE U+043E afii10080 -!DF U+043F afii10081 -!E0 U+0440 afii10082 -!E1 U+0441 afii10083 -!E2 U+0442 afii10084 -!E3 U+0443 afii10085 -!E4 U+0444 afii10086 -!E5 U+0445 afii10087 -!E6 U+0446 afii10088 -!E7 U+0447 afii10089 -!E8 U+0448 afii10090 -!E9 U+0449 afii10091 -!EA U+044A afii10092 -!EB U+044B afii10093 -!EC U+044C afii10094 -!ED U+044D afii10095 -!EE U+044E afii10096 -!EF U+044F afii10097 -!F0 U+2116 afii61352 -!F1 U+0451 afii10071 -!F2 U+0452 afii10099 -!F3 U+0453 afii10100 -!F4 U+0454 afii10101 -!F5 U+0455 afii10102 -!F6 U+0456 afii10103 -!F7 U+0457 afii10104 -!F8 U+0458 afii10105 -!F9 U+0459 afii10106 -!FA U+045A afii10107 -!FB U+045B afii10108 -!FC U+045C afii10109 -!FD U+00A7 section -!FE U+045E afii10110 -!FF U+045F afii10193 diff --git a/vendor/phenx/php-font-lib/maps/iso-8859-7.map b/vendor/phenx/php-font-lib/maps/iso-8859-7.map deleted file mode 100644 index e163796..0000000 --- a/vendor/phenx/php-font-lib/maps/iso-8859-7.map +++ /dev/null @@ -1,250 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+2018 quoteleft -!A2 U+2019 quoteright -!A3 U+00A3 sterling -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AF U+2015 afii00208 -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+0384 tonos -!B5 U+0385 dieresistonos -!B6 U+0386 Alphatonos -!B7 U+00B7 periodcentered -!B8 U+0388 Epsilontonos -!B9 U+0389 Etatonos -!BA U+038A Iotatonos -!BB U+00BB guillemotright -!BC U+038C Omicrontonos -!BD U+00BD onehalf -!BE U+038E Upsilontonos -!BF U+038F Omegatonos -!C0 U+0390 iotadieresistonos -!C1 U+0391 Alpha -!C2 U+0392 Beta -!C3 U+0393 Gamma -!C4 U+0394 Delta -!C5 U+0395 Epsilon -!C6 U+0396 Zeta -!C7 U+0397 Eta -!C8 U+0398 Theta -!C9 U+0399 Iota -!CA U+039A Kappa -!CB U+039B Lambda -!CC U+039C Mu -!CD U+039D Nu -!CE U+039E Xi -!CF U+039F Omicron -!D0 U+03A0 Pi -!D1 U+03A1 Rho -!D3 U+03A3 Sigma -!D4 U+03A4 Tau -!D5 U+03A5 Upsilon -!D6 U+03A6 Phi -!D7 U+03A7 Chi -!D8 U+03A8 Psi -!D9 U+03A9 Omega -!DA U+03AA Iotadieresis -!DB U+03AB Upsilondieresis -!DC U+03AC alphatonos -!DD U+03AD epsilontonos -!DE U+03AE etatonos -!DF U+03AF iotatonos -!E0 U+03B0 upsilondieresistonos -!E1 U+03B1 alpha -!E2 U+03B2 beta -!E3 U+03B3 gamma -!E4 U+03B4 delta -!E5 U+03B5 epsilon -!E6 U+03B6 zeta -!E7 U+03B7 eta -!E8 U+03B8 theta -!E9 U+03B9 iota -!EA U+03BA kappa -!EB U+03BB lambda -!EC U+03BC mu -!ED U+03BD nu -!EE U+03BE xi -!EF U+03BF omicron -!F0 U+03C0 pi -!F1 U+03C1 rho -!F2 U+03C2 sigma1 -!F3 U+03C3 sigma -!F4 U+03C4 tau -!F5 U+03C5 upsilon -!F6 U+03C6 phi -!F7 U+03C7 chi -!F8 U+03C8 psi -!F9 U+03C9 omega -!FA U+03CA iotadieresis -!FB U+03CB upsilondieresis -!FC U+03CC omicrontonos -!FD U+03CD upsilontonos -!FE U+03CE omegatonos diff --git a/vendor/phenx/php-font-lib/maps/iso-8859-9.map b/vendor/phenx/php-font-lib/maps/iso-8859-9.map deleted file mode 100644 index 48c123a..0000000 --- a/vendor/phenx/php-font-lib/maps/iso-8859-9.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+0080 .notdef -!81 U+0081 .notdef -!82 U+0082 .notdef -!83 U+0083 .notdef -!84 U+0084 .notdef -!85 U+0085 .notdef -!86 U+0086 .notdef -!87 U+0087 .notdef -!88 U+0088 .notdef -!89 U+0089 .notdef -!8A U+008A .notdef -!8B U+008B .notdef -!8C U+008C .notdef -!8D U+008D .notdef -!8E U+008E .notdef -!8F U+008F .notdef -!90 U+0090 .notdef -!91 U+0091 .notdef -!92 U+0092 .notdef -!93 U+0093 .notdef -!94 U+0094 .notdef -!95 U+0095 .notdef -!96 U+0096 .notdef -!97 U+0097 .notdef -!98 U+0098 .notdef -!99 U+0099 .notdef -!9A U+009A .notdef -!9B U+009B .notdef -!9C U+009C .notdef -!9D U+009D .notdef -!9E U+009E .notdef -!9F U+009F .notdef -!A0 U+00A0 space -!A1 U+00A1 exclamdown -!A2 U+00A2 cent -!A3 U+00A3 sterling -!A4 U+00A4 currency -!A5 U+00A5 yen -!A6 U+00A6 brokenbar -!A7 U+00A7 section -!A8 U+00A8 dieresis -!A9 U+00A9 copyright -!AA U+00AA ordfeminine -!AB U+00AB guillemotleft -!AC U+00AC logicalnot -!AD U+00AD hyphen -!AE U+00AE registered -!AF U+00AF macron -!B0 U+00B0 degree -!B1 U+00B1 plusminus -!B2 U+00B2 twosuperior -!B3 U+00B3 threesuperior -!B4 U+00B4 acute -!B5 U+00B5 mu -!B6 U+00B6 paragraph -!B7 U+00B7 periodcentered -!B8 U+00B8 cedilla -!B9 U+00B9 onesuperior -!BA U+00BA ordmasculine -!BB U+00BB guillemotright -!BC U+00BC onequarter -!BD U+00BD onehalf -!BE U+00BE threequarters -!BF U+00BF questiondown -!C0 U+00C0 Agrave -!C1 U+00C1 Aacute -!C2 U+00C2 Acircumflex -!C3 U+00C3 Atilde -!C4 U+00C4 Adieresis -!C5 U+00C5 Aring -!C6 U+00C6 AE -!C7 U+00C7 Ccedilla -!C8 U+00C8 Egrave -!C9 U+00C9 Eacute -!CA U+00CA Ecircumflex -!CB U+00CB Edieresis -!CC U+00CC Igrave -!CD U+00CD Iacute -!CE U+00CE Icircumflex -!CF U+00CF Idieresis -!D0 U+011E Gbreve -!D1 U+00D1 Ntilde -!D2 U+00D2 Ograve -!D3 U+00D3 Oacute -!D4 U+00D4 Ocircumflex -!D5 U+00D5 Otilde -!D6 U+00D6 Odieresis -!D7 U+00D7 multiply -!D8 U+00D8 Oslash -!D9 U+00D9 Ugrave -!DA U+00DA Uacute -!DB U+00DB Ucircumflex -!DC U+00DC Udieresis -!DD U+0130 Idotaccent -!DE U+015E Scedilla -!DF U+00DF germandbls -!E0 U+00E0 agrave -!E1 U+00E1 aacute -!E2 U+00E2 acircumflex -!E3 U+00E3 atilde -!E4 U+00E4 adieresis -!E5 U+00E5 aring -!E6 U+00E6 ae -!E7 U+00E7 ccedilla -!E8 U+00E8 egrave -!E9 U+00E9 eacute -!EA U+00EA ecircumflex -!EB U+00EB edieresis -!EC U+00EC igrave -!ED U+00ED iacute -!EE U+00EE icircumflex -!EF U+00EF idieresis -!F0 U+011F gbreve -!F1 U+00F1 ntilde -!F2 U+00F2 ograve -!F3 U+00F3 oacute -!F4 U+00F4 ocircumflex -!F5 U+00F5 otilde -!F6 U+00F6 odieresis -!F7 U+00F7 divide -!F8 U+00F8 oslash -!F9 U+00F9 ugrave -!FA U+00FA uacute -!FB U+00FB ucircumflex -!FC U+00FC udieresis -!FD U+0131 dotlessi -!FE U+015F scedilla -!FF U+00FF ydieresis diff --git a/vendor/phenx/php-font-lib/maps/koi8-r.map b/vendor/phenx/php-font-lib/maps/koi8-r.map deleted file mode 100644 index 6ad5d05..0000000 --- a/vendor/phenx/php-font-lib/maps/koi8-r.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+2500 SF100000 -!81 U+2502 SF110000 -!82 U+250C SF010000 -!83 U+2510 SF030000 -!84 U+2514 SF020000 -!85 U+2518 SF040000 -!86 U+251C SF080000 -!87 U+2524 SF090000 -!88 U+252C SF060000 -!89 U+2534 SF070000 -!8A U+253C SF050000 -!8B U+2580 upblock -!8C U+2584 dnblock -!8D U+2588 block -!8E U+258C lfblock -!8F U+2590 rtblock -!90 U+2591 ltshade -!91 U+2592 shade -!92 U+2593 dkshade -!93 U+2320 integraltp -!94 U+25A0 filledbox -!95 U+2219 periodcentered -!96 U+221A radical -!97 U+2248 approxequal -!98 U+2264 lessequal -!99 U+2265 greaterequal -!9A U+00A0 space -!9B U+2321 integralbt -!9C U+00B0 degree -!9D U+00B2 twosuperior -!9E U+00B7 periodcentered -!9F U+00F7 divide -!A0 U+2550 SF430000 -!A1 U+2551 SF240000 -!A2 U+2552 SF510000 -!A3 U+0451 afii10071 -!A4 U+2553 SF520000 -!A5 U+2554 SF390000 -!A6 U+2555 SF220000 -!A7 U+2556 SF210000 -!A8 U+2557 SF250000 -!A9 U+2558 SF500000 -!AA U+2559 SF490000 -!AB U+255A SF380000 -!AC U+255B SF280000 -!AD U+255C SF270000 -!AE U+255D SF260000 -!AF U+255E SF360000 -!B0 U+255F SF370000 -!B1 U+2560 SF420000 -!B2 U+2561 SF190000 -!B3 U+0401 afii10023 -!B4 U+2562 SF200000 -!B5 U+2563 SF230000 -!B6 U+2564 SF470000 -!B7 U+2565 SF480000 -!B8 U+2566 SF410000 -!B9 U+2567 SF450000 -!BA U+2568 SF460000 -!BB U+2569 SF400000 -!BC U+256A SF540000 -!BD U+256B SF530000 -!BE U+256C SF440000 -!BF U+00A9 copyright -!C0 U+044E afii10096 -!C1 U+0430 afii10065 -!C2 U+0431 afii10066 -!C3 U+0446 afii10088 -!C4 U+0434 afii10069 -!C5 U+0435 afii10070 -!C6 U+0444 afii10086 -!C7 U+0433 afii10068 -!C8 U+0445 afii10087 -!C9 U+0438 afii10074 -!CA U+0439 afii10075 -!CB U+043A afii10076 -!CC U+043B afii10077 -!CD U+043C afii10078 -!CE U+043D afii10079 -!CF U+043E afii10080 -!D0 U+043F afii10081 -!D1 U+044F afii10097 -!D2 U+0440 afii10082 -!D3 U+0441 afii10083 -!D4 U+0442 afii10084 -!D5 U+0443 afii10085 -!D6 U+0436 afii10072 -!D7 U+0432 afii10067 -!D8 U+044C afii10094 -!D9 U+044B afii10093 -!DA U+0437 afii10073 -!DB U+0448 afii10090 -!DC U+044D afii10095 -!DD U+0449 afii10091 -!DE U+0447 afii10089 -!DF U+044A afii10092 -!E0 U+042E afii10048 -!E1 U+0410 afii10017 -!E2 U+0411 afii10018 -!E3 U+0426 afii10040 -!E4 U+0414 afii10021 -!E5 U+0415 afii10022 -!E6 U+0424 afii10038 -!E7 U+0413 afii10020 -!E8 U+0425 afii10039 -!E9 U+0418 afii10026 -!EA U+0419 afii10027 -!EB U+041A afii10028 -!EC U+041B afii10029 -!ED U+041C afii10030 -!EE U+041D afii10031 -!EF U+041E afii10032 -!F0 U+041F afii10033 -!F1 U+042F afii10049 -!F2 U+0420 afii10034 -!F3 U+0421 afii10035 -!F4 U+0422 afii10036 -!F5 U+0423 afii10037 -!F6 U+0416 afii10024 -!F7 U+0412 afii10019 -!F8 U+042C afii10046 -!F9 U+042B afii10045 -!FA U+0417 afii10025 -!FB U+0428 afii10042 -!FC U+042D afii10047 -!FD U+0429 afii10043 -!FE U+0427 afii10041 -!FF U+042A afii10044 diff --git a/vendor/phenx/php-font-lib/maps/koi8-u.map b/vendor/phenx/php-font-lib/maps/koi8-u.map deleted file mode 100644 index 40a7e4f..0000000 --- a/vendor/phenx/php-font-lib/maps/koi8-u.map +++ /dev/null @@ -1,256 +0,0 @@ -!00 U+0000 .notdef -!01 U+0001 .notdef -!02 U+0002 .notdef -!03 U+0003 .notdef -!04 U+0004 .notdef -!05 U+0005 .notdef -!06 U+0006 .notdef -!07 U+0007 .notdef -!08 U+0008 .notdef -!09 U+0009 .notdef -!0A U+000A .notdef -!0B U+000B .notdef -!0C U+000C .notdef -!0D U+000D .notdef -!0E U+000E .notdef -!0F U+000F .notdef -!10 U+0010 .notdef -!11 U+0011 .notdef -!12 U+0012 .notdef -!13 U+0013 .notdef -!14 U+0014 .notdef -!15 U+0015 .notdef -!16 U+0016 .notdef -!17 U+0017 .notdef -!18 U+0018 .notdef -!19 U+0019 .notdef -!1A U+001A .notdef -!1B U+001B .notdef -!1C U+001C .notdef -!1D U+001D .notdef -!1E U+001E .notdef -!1F U+001F .notdef -!20 U+0020 space -!21 U+0021 exclam -!22 U+0022 quotedbl -!23 U+0023 numbersign -!24 U+0024 dollar -!25 U+0025 percent -!26 U+0026 ampersand -!27 U+0027 quotesingle -!28 U+0028 parenleft -!29 U+0029 parenright -!2A U+002A asterisk -!2B U+002B plus -!2C U+002C comma -!2D U+002D hyphen -!2E U+002E period -!2F U+002F slash -!30 U+0030 zero -!31 U+0031 one -!32 U+0032 two -!33 U+0033 three -!34 U+0034 four -!35 U+0035 five -!36 U+0036 six -!37 U+0037 seven -!38 U+0038 eight -!39 U+0039 nine -!3A U+003A colon -!3B U+003B semicolon -!3C U+003C less -!3D U+003D equal -!3E U+003E greater -!3F U+003F question -!40 U+0040 at -!41 U+0041 A -!42 U+0042 B -!43 U+0043 C -!44 U+0044 D -!45 U+0045 E -!46 U+0046 F -!47 U+0047 G -!48 U+0048 H -!49 U+0049 I -!4A U+004A J -!4B U+004B K -!4C U+004C L -!4D U+004D M -!4E U+004E N -!4F U+004F O -!50 U+0050 P -!51 U+0051 Q -!52 U+0052 R -!53 U+0053 S -!54 U+0054 T -!55 U+0055 U -!56 U+0056 V -!57 U+0057 W -!58 U+0058 X -!59 U+0059 Y -!5A U+005A Z -!5B U+005B bracketleft -!5C U+005C backslash -!5D U+005D bracketright -!5E U+005E asciicircum -!5F U+005F underscore -!60 U+0060 grave -!61 U+0061 a -!62 U+0062 b -!63 U+0063 c -!64 U+0064 d -!65 U+0065 e -!66 U+0066 f -!67 U+0067 g -!68 U+0068 h -!69 U+0069 i -!6A U+006A j -!6B U+006B k -!6C U+006C l -!6D U+006D m -!6E U+006E n -!6F U+006F o -!70 U+0070 p -!71 U+0071 q -!72 U+0072 r -!73 U+0073 s -!74 U+0074 t -!75 U+0075 u -!76 U+0076 v -!77 U+0077 w -!78 U+0078 x -!79 U+0079 y -!7A U+007A z -!7B U+007B braceleft -!7C U+007C bar -!7D U+007D braceright -!7E U+007E asciitilde -!7F U+007F .notdef -!80 U+2500 SF100000 -!81 U+2502 SF110000 -!82 U+250C SF010000 -!83 U+2510 SF030000 -!84 U+2514 SF020000 -!85 U+2518 SF040000 -!86 U+251C SF080000 -!87 U+2524 SF090000 -!88 U+252C SF060000 -!89 U+2534 SF070000 -!8A U+253C SF050000 -!8B U+2580 upblock -!8C U+2584 dnblock -!8D U+2588 block -!8E U+258C lfblock -!8F U+2590 rtblock -!90 U+2591 ltshade -!91 U+2592 shade -!92 U+2593 dkshade -!93 U+2320 integraltp -!94 U+25A0 filledbox -!95 U+2022 bullet -!96 U+221A radical -!97 U+2248 approxequal -!98 U+2264 lessequal -!99 U+2265 greaterequal -!9A U+00A0 space -!9B U+2321 integralbt -!9C U+00B0 degree -!9D U+00B2 twosuperior -!9E U+00B7 periodcentered -!9F U+00F7 divide -!A0 U+2550 SF430000 -!A1 U+2551 SF240000 -!A2 U+2552 SF510000 -!A3 U+0451 afii10071 -!A4 U+0454 afii10101 -!A5 U+2554 SF390000 -!A6 U+0456 afii10103 -!A7 U+0457 afii10104 -!A8 U+2557 SF250000 -!A9 U+2558 SF500000 -!AA U+2559 SF490000 -!AB U+255A SF380000 -!AC U+255B SF280000 -!AD U+0491 afii10098 -!AE U+255D SF260000 -!AF U+255E SF360000 -!B0 U+255F SF370000 -!B1 U+2560 SF420000 -!B2 U+2561 SF190000 -!B3 U+0401 afii10023 -!B4 U+0404 afii10053 -!B5 U+2563 SF230000 -!B6 U+0406 afii10055 -!B7 U+0407 afii10056 -!B8 U+2566 SF410000 -!B9 U+2567 SF450000 -!BA U+2568 SF460000 -!BB U+2569 SF400000 -!BC U+256A SF540000 -!BD U+0490 afii10050 -!BE U+256C SF440000 -!BF U+00A9 copyright -!C0 U+044E afii10096 -!C1 U+0430 afii10065 -!C2 U+0431 afii10066 -!C3 U+0446 afii10088 -!C4 U+0434 afii10069 -!C5 U+0435 afii10070 -!C6 U+0444 afii10086 -!C7 U+0433 afii10068 -!C8 U+0445 afii10087 -!C9 U+0438 afii10074 -!CA U+0439 afii10075 -!CB U+043A afii10076 -!CC U+043B afii10077 -!CD U+043C afii10078 -!CE U+043D afii10079 -!CF U+043E afii10080 -!D0 U+043F afii10081 -!D1 U+044F afii10097 -!D2 U+0440 afii10082 -!D3 U+0441 afii10083 -!D4 U+0442 afii10084 -!D5 U+0443 afii10085 -!D6 U+0436 afii10072 -!D7 U+0432 afii10067 -!D8 U+044C afii10094 -!D9 U+044B afii10093 -!DA U+0437 afii10073 -!DB U+0448 afii10090 -!DC U+044D afii10095 -!DD U+0449 afii10091 -!DE U+0447 afii10089 -!DF U+044A afii10092 -!E0 U+042E afii10048 -!E1 U+0410 afii10017 -!E2 U+0411 afii10018 -!E3 U+0426 afii10040 -!E4 U+0414 afii10021 -!E5 U+0415 afii10022 -!E6 U+0424 afii10038 -!E7 U+0413 afii10020 -!E8 U+0425 afii10039 -!E9 U+0418 afii10026 -!EA U+0419 afii10027 -!EB U+041A afii10028 -!EC U+041B afii10029 -!ED U+041C afii10030 -!EE U+041D afii10031 -!EF U+041E afii10032 -!F0 U+041F afii10033 -!F1 U+042F afii10049 -!F2 U+0420 afii10034 -!F3 U+0421 afii10035 -!F4 U+0422 afii10036 -!F5 U+0423 afii10037 -!F6 U+0416 afii10024 -!F7 U+0412 afii10019 -!F8 U+042C afii10046 -!F9 U+042B afii10045 -!FA U+0417 afii10025 -!FB U+0428 afii10042 -!FC U+042D afii10047 -!FD U+0429 afii10043 -!FE U+0427 afii10041 -!FF U+042A afii10044 diff --git a/vendor/phenx/php-font-lib/phpunit.xml.dist b/vendor/phenx/php-font-lib/phpunit.xml.dist deleted file mode 100644 index c8bb022..0000000 --- a/vendor/phenx/php-font-lib/phpunit.xml.dist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - ./tests/FontLib/ - - - - \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/sample-fonts/IntelClear-Light.ttf b/vendor/phenx/php-font-lib/sample-fonts/IntelClear-Light.ttf deleted file mode 100644 index 17451c6..0000000 Binary files a/vendor/phenx/php-font-lib/sample-fonts/IntelClear-Light.ttf and /dev/null differ diff --git a/vendor/phenx/php-font-lib/sample-fonts/NotoSansShavian-Regular.ttf b/vendor/phenx/php-font-lib/sample-fonts/NotoSansShavian-Regular.ttf deleted file mode 100644 index 29ebdb5..0000000 Binary files a/vendor/phenx/php-font-lib/sample-fonts/NotoSansShavian-Regular.ttf and /dev/null differ diff --git a/vendor/phenx/php-font-lib/src/FontLib/AdobeFontMetrics.php b/vendor/phenx/php-font-lib/src/FontLib/AdobeFontMetrics.php deleted file mode 100644 index a0e973b..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/AdobeFontMetrics.php +++ /dev/null @@ -1,217 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib; - -use FontLib\Table\Type\name; -use FontLib\TrueType\File; - -/** - * Adobe Font Metrics file creation utility class. - * - * @package php-font-lib - */ -class AdobeFontMetrics { - private $f; - - /** - * @var File - */ - private $font; - - function __construct(File $font) { - $this->font = $font; - } - - function write($file, $encoding = null) { - $map_data = array(); - - if ($encoding) { - $encoding = preg_replace("/[^a-z0-9-_]/", "", $encoding); - $map_file = dirname(__FILE__) . "/../maps/$encoding.map"; - if (!file_exists($map_file)) { - throw new \Exception("Unkown encoding ($encoding)"); - } - - $map = new EncodingMap($map_file); - $map_data = $map->parse(); - } - - $this->f = fopen($file, "w+"); - - $font = $this->font; - - $this->startSection("FontMetrics", 4.1); - $this->addPair("Notice", "Converted by PHP-font-lib"); - $this->addPair("Comment", "https://github.com/PhenX/php-font-lib"); - - $encoding_scheme = ($encoding ? $encoding : "FontSpecific"); - $this->addPair("EncodingScheme", $encoding_scheme); - - $records = $font->getData("name", "records"); - foreach ($records as $id => $record) { - if (!isset(name::$nameIdCodes[$id]) || preg_match("/[\r\n]/", $record->string)) { - continue; - } - - $this->addPair(name::$nameIdCodes[$id], $record->string); - } - - $os2 = $font->getData("OS/2"); - $this->addPair("Weight", ($os2["usWeightClass"] > 400 ? "Bold" : "Medium")); - - $post = $font->getData("post"); - $this->addPair("ItalicAngle", $post["italicAngle"]); - $this->addPair("IsFixedPitch", ($post["isFixedPitch"] ? "true" : "false")); - $this->addPair("UnderlineThickness", $font->normalizeFUnit($post["underlineThickness"])); - $this->addPair("UnderlinePosition", $font->normalizeFUnit($post["underlinePosition"])); - - $hhea = $font->getData("hhea"); - - if (isset($hhea["ascent"])) { - $this->addPair("FontHeightOffset", $font->normalizeFUnit($hhea["lineGap"])); - $this->addPair("Ascender", $font->normalizeFUnit($hhea["ascent"])); - $this->addPair("Descender", $font->normalizeFUnit($hhea["descent"])); - } - else { - $this->addPair("FontHeightOffset", $font->normalizeFUnit($os2["typoLineGap"])); - $this->addPair("Ascender", $font->normalizeFUnit($os2["typoAscender"])); - $this->addPair("Descender", -abs($font->normalizeFUnit($os2["typoDescender"]))); - } - - $head = $font->getData("head"); - $this->addArray("FontBBox", array( - $font->normalizeFUnit($head["xMin"]), - $font->normalizeFUnit($head["yMin"]), - $font->normalizeFUnit($head["xMax"]), - $font->normalizeFUnit($head["yMax"]), - )); - - $glyphIndexArray = $font->getUnicodeCharMap(); - - if ($glyphIndexArray) { - $hmtx = $font->getData("hmtx"); - $names = $font->getData("post", "names"); - - $this->startSection("CharMetrics", count($hmtx)); - - if ($encoding) { - foreach ($map_data as $code => $value) { - list($c, $name) = $value; - - if (!isset($glyphIndexArray[$c])) { - continue; - } - - $g = $glyphIndexArray[$c]; - - if (!isset($hmtx[$g])) { - $hmtx[$g] = $hmtx[0]; - } - - $this->addMetric(array( - "C" => ($code > 255 ? -1 : $code), - "WX" => $font->normalizeFUnit($hmtx[$g][0]), - "N" => $name, - )); - } - } - else { - foreach ($glyphIndexArray as $c => $g) { - if (!isset($hmtx[$g])) { - $hmtx[$g] = $hmtx[0]; - } - - $this->addMetric(array( - "U" => $c, - "WX" => $font->normalizeFUnit($hmtx[$g][0]), - "N" => (isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $c)), - "G" => $g, - )); - } - } - - $this->endSection("CharMetrics"); - - $kern = $font->getData("kern", "subtable"); - $tree = is_array($kern) ? $kern["tree"] : null; - - if (!$encoding && is_array($tree)) { - $this->startSection("KernData"); - $this->startSection("KernPairs", count($tree, COUNT_RECURSIVE) - count($tree)); - - foreach ($tree as $left => $values) { - if (!is_array($values)) { - continue; - } - if (!isset($glyphIndexArray[$left])) { - continue; - } - - $left_gid = $glyphIndexArray[$left]; - - if (!isset($names[$left_gid])) { - continue; - } - - $left_name = $names[$left_gid]; - - $this->addLine(""); - - foreach ($values as $right => $value) { - if (!isset($glyphIndexArray[$right])) { - continue; - } - - $right_gid = $glyphIndexArray[$right]; - - if (!isset($names[$right_gid])) { - continue; - } - - $right_name = $names[$right_gid]; - $this->addPair("KPX", "$left_name $right_name $value"); - } - } - - $this->endSection("KernPairs"); - $this->endSection("KernData"); - } - } - - $this->endSection("FontMetrics"); - } - - function addLine($line) { - fwrite($this->f, "$line\n"); - } - - function addPair($key, $value) { - $this->addLine("$key $value"); - } - - function addArray($key, $array) { - $this->addLine("$key " . implode(" ", $array)); - } - - function addMetric($data) { - $array = array(); - foreach ($data as $key => $value) { - $array[] = "$key $value"; - } - $this->addLine(implode(" ; ", $array)); - } - - function startSection($name, $value = "") { - $this->addLine("Start$name $value"); - } - - function endSection($name) { - $this->addLine("End$name"); - } -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/Autoloader.php b/vendor/phenx/php-font-lib/src/FontLib/Autoloader.php deleted file mode 100644 index cd30545..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Autoloader.php +++ /dev/null @@ -1,43 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib; - -/** - * Autoloads FontLib classes - * - * @package php-font-lib - */ -class Autoloader { - const PREFIX = 'FontLib'; - - /** - * Register the autoloader - */ - public static function register() { - spl_autoload_register(array(new self, 'autoload')); - } - - /** - * Autoloader - * - * @param string - */ - public static function autoload($class) { - $prefixLength = strlen(self::PREFIX); - if (0 === strncmp(self::PREFIX, $class, $prefixLength)) { - $file = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, $prefixLength)); - $file = realpath(__DIR__ . (empty($file) ? '' : DIRECTORY_SEPARATOR) . $file . '.php'); - if (file_exists($file)) { - require_once $file; - } - } - } -} - -Autoloader::register(); \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/BinaryStream.php b/vendor/phenx/php-font-lib/src/FontLib/BinaryStream.php deleted file mode 100644 index ab10454..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/BinaryStream.php +++ /dev/null @@ -1,444 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib; - -/** - * Generic font file binary stream. - * - * @package php-font-lib - */ -class BinaryStream { - /** - * @var resource The file pointer - */ - protected $f; - - const uint8 = 1; - const int8 = 2; - const uint16 = 3; - const int16 = 4; - const uint32 = 5; - const int32 = 6; - const shortFrac = 7; - const Fixed = 8; - const FWord = 9; - const uFWord = 10; - const F2Dot14 = 11; - const longDateTime = 12; - const char = 13; - - const modeRead = "rb"; - const modeWrite = "wb"; - const modeReadWrite = "rb+"; - - static function backtrace() { - var_dump(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)); - } - - /** - * Open a font file in read mode - * - * @param string $filename The file name of the font to open - * - * @return bool - */ - public function load($filename) { - return $this->open($filename, self::modeRead); - } - - /** - * Open a font file in a chosen mode - * - * @param string $filename The file name of the font to open - * @param string $mode The opening mode - * - * @throws \Exception - * @return bool - */ - public function open($filename, $mode = self::modeRead) { - if (!in_array($mode, array(self::modeRead, self::modeWrite, self::modeReadWrite))) { - throw new \Exception("Unkown file open mode"); - } - - $this->f = fopen($filename, $mode); - - return $this->f != false; - } - - /** - * Close the internal file pointer - */ - public function close() { - return fclose($this->f) != false; - } - - /** - * Change the internal file pointer - * - * @param resource $fp - * - * @throws \Exception - */ - public function setFile($fp) { - if (!is_resource($fp)) { - throw new \Exception('$fp is not a valid resource'); - } - - $this->f = $fp; - } - - /** - * Create a temporary file in write mode - * - * @param bool $allow_memory Allow in-memory files - * - * @return resource the temporary file pointer resource - */ - public static function getTempFile($allow_memory = true) { - $f = null; - - if ($allow_memory) { - $f = fopen("php://temp", "rb+"); - } - else { - $f = fopen(tempnam(sys_get_temp_dir(), "fnt"), "rb+"); - } - - return $f; - } - - /** - * Move the internal file pinter to $offset bytes - * - * @param int $offset - * - * @return bool True if the $offset position exists in the file - */ - public function seek($offset) { - return fseek($this->f, $offset, SEEK_SET) == 0; - } - - /** - * Gives the current position in the file - * - * @return int The current position - */ - public function pos() { - return ftell($this->f); - } - - public function skip($n) { - fseek($this->f, $n, SEEK_CUR); - } - - public function read($n) { - if ($n < 1) { - return ""; - } - - return fread($this->f, $n); - } - - public function write($data, $length = null) { - if ($data === null || $data === "" || $data === false) { - return 0; - } - - return fwrite($this->f, $data, $length); - } - - public function readUInt8() { - return ord($this->read(1)); - } - - public function readUInt8Many($count) { - return array_values(unpack("C*", $this->read($count))); - } - - public function writeUInt8($data) { - return $this->write(chr($data), 1); - } - - public function readInt8() { - $v = $this->readUInt8(); - - if ($v >= 0x80) { - $v -= 0x100; - } - - return $v; - } - - public function readInt8Many($count) { - return array_values(unpack("c*", $this->read($count))); - } - - public function writeInt8($data) { - if ($data < 0) { - $data += 0x100; - } - - return $this->writeUInt8($data); - } - - public function readUInt16() { - $a = unpack("nn", $this->read(2)); - - return $a["n"]; - } - - public function readUInt16Many($count) { - return array_values(unpack("n*", $this->read($count * 2))); - } - - public function readUFWord() { - return $this->readUInt16(); - } - - public function writeUInt16($data) { - return $this->write(pack("n", $data), 2); - } - - public function writeUFWord($data) { - return $this->writeUInt16($data); - } - - public function readInt16() { - $a = unpack("nn", $this->read(2)); - $v = $a["n"]; - - if ($v >= 0x8000) { - $v -= 0x10000; - } - - return $v; - } - - public function readInt16Many($count) { - $vals = array_values(unpack("n*", $this->read($count * 2))); - foreach ($vals as &$v) { - if ($v >= 0x8000) { - $v -= 0x10000; - } - } - - return $vals; - } - - public function readFWord() { - return $this->readInt16(); - } - - public function writeInt16($data) { - if ($data < 0) { - $data += 0x10000; - } - - return $this->writeUInt16($data); - } - - public function writeFWord($data) { - return $this->writeInt16($data); - } - - public function readUInt32() { - $a = unpack("NN", $this->read(4)); - - return $a["N"]; - } - - public function writeUInt32($data) { - return $this->write(pack("N", $data), 4); - } - - public function readFixed() { - $d = $this->readInt16(); - $d2 = $this->readUInt16(); - - return round($d + $d2 / 0x10000, 4); - } - - public function writeFixed($data) { - $left = floor($data); - $right = ($data - $left) * 0x10000; - - return $this->writeInt16($left) + $this->writeUInt16($right); - } - - public function readLongDateTime() { - $this->readUInt32(); // ignored - $date = $this->readUInt32() - 2082844800; - - # PHP_INT_MIN isn't defined in PHP < 7.0 - $php_int_min = defined("PHP_INT_MIN") ? PHP_INT_MIN : ~PHP_INT_MAX; - - if (is_string($date) || $date > PHP_INT_MAX || $date < $php_int_min) { - $date = 0; - } - - return strftime("%Y-%m-%d %H:%M:%S", $date); - } - - public function writeLongDateTime($data) { - $date = strtotime($data); - $date += 2082844800; - - return $this->writeUInt32(0) + $this->writeUInt32($date); - } - - public function unpack($def) { - $d = array(); - foreach ($def as $name => $type) { - $d[$name] = $this->r($type); - } - - return $d; - } - - public function pack($def, $data) { - $bytes = 0; - foreach ($def as $name => $type) { - $bytes += $this->w($type, $data[$name]); - } - - return $bytes; - } - - /** - * Read a data of type $type in the file from the current position - * - * @param mixed $type The data type to read - * - * @return mixed The data that was read - */ - public function r($type) { - switch ($type) { - case self::uint8: - return $this->readUInt8(); - case self::int8: - return $this->readInt8(); - case self::uint16: - return $this->readUInt16(); - case self::int16: - return $this->readInt16(); - case self::uint32: - return $this->readUInt32(); - case self::int32: - return $this->readUInt32(); - case self::shortFrac: - return $this->readFixed(); - case self::Fixed: - return $this->readFixed(); - case self::FWord: - return $this->readInt16(); - case self::uFWord: - return $this->readUInt16(); - case self::F2Dot14: - return $this->readInt16(); - case self::longDateTime: - return $this->readLongDateTime(); - case self::char: - return $this->read(1); - default: - if (is_array($type)) { - if ($type[0] == self::char) { - return $this->read($type[1]); - } - if ($type[0] == self::uint16) { - return $this->readUInt16Many($type[1]); - } - if ($type[0] == self::int16) { - return $this->readInt16Many($type[1]); - } - if ($type[0] == self::uint8) { - return $this->readUInt8Many($type[1]); - } - if ($type[0] == self::int8) { - return $this->readInt8Many($type[1]); - } - - $ret = array(); - for ($i = 0; $i < $type[1]; $i++) { - $ret[] = $this->r($type[0]); - } - - return $ret; - } - - return null; - } - } - - /** - * Write $data of type $type in the file from the current position - * - * @param mixed $type The data type to write - * @param mixed $data The data to write - * - * @return int The number of bytes read - */ - public function w($type, $data) { - switch ($type) { - case self::uint8: - return $this->writeUInt8($data); - case self::int8: - return $this->writeInt8($data); - case self::uint16: - return $this->writeUInt16($data); - case self::int16: - return $this->writeInt16($data); - case self::uint32: - return $this->writeUInt32($data); - case self::int32: - return $this->writeUInt32($data); - case self::shortFrac: - return $this->writeFixed($data); - case self::Fixed: - return $this->writeFixed($data); - case self::FWord: - return $this->writeInt16($data); - case self::uFWord: - return $this->writeUInt16($data); - case self::F2Dot14: - return $this->writeInt16($data); - case self::longDateTime: - return $this->writeLongDateTime($data); - case self::char: - return $this->write($data, 1); - default: - if (is_array($type)) { - if ($type[0] == self::char) { - return $this->write($data, $type[1]); - } - - $ret = 0; - for ($i = 0; $i < $type[1]; $i++) { - if (isset($data[$i])) { - $ret += $this->w($type[0], $data[$i]); - } - } - - return $ret; - } - - return null; - } - } - - /** - * Converts a Uint32 value to string - * - * @param int $uint32 - * - * @return string The string - */ - public function convertUInt32ToStr($uint32) { - return chr(($uint32 >> 24) & 0xFF) . chr(($uint32 >> 16) & 0xFF) . chr(($uint32 >> 8) & 0xFF) . chr($uint32 & 0xFF); - } -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/EOT/File.php b/vendor/phenx/php-font-lib/src/FontLib/EOT/File.php deleted file mode 100644 index 13d5925..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/EOT/File.php +++ /dev/null @@ -1,160 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\EOT; - -/** - * EOT font file. - * - * @package php-font-lib - */ -class File extends \FontLib\TrueType\File { - const TTEMBED_SUBSET = 0x00000001; - const TTEMBED_TTCOMPRESSED = 0x00000004; - const TTEMBED_FAILIFVARIATIONSIMULATED = 0x00000010; - const TTMBED_EMBEDEUDC = 0x00000020; - const TTEMBED_VALIDATIONTESTS = 0x00000040; // Deprecated - const TTEMBED_WEBOBJECT = 0x00000080; - const TTEMBED_XORENCRYPTDATA = 0x10000000; - - /** - * @var Header - */ - public $header; - - function parseHeader() { - if (!empty($this->header)) { - return; - } - - $this->header = new Header($this); - $this->header->parse(); - } - - function parse() { - $this->parseHeader(); - - $flags = $this->header->data["Flags"]; - - if ($flags & self::TTEMBED_TTCOMPRESSED) { - $mtx_version = $this->readUInt8(); - $mtx_copy_limit = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8(); - $mtx_offset_1 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8(); - $mtx_offset_2 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8(); - /* - var_dump("$mtx_version $mtx_copy_limit $mtx_offset_1 $mtx_offset_2"); - - $pos = $this->pos(); - $size = $mtx_offset_1 - $pos; - var_dump("pos: $pos"); - var_dump("size: $size");*/ - } - - if ($flags & self::TTEMBED_XORENCRYPTDATA) { - // Process XOR - } - // TODO Read font data ... - } - - /** - * Little endian version of the read method - * - * @param int $n The number of bytes to read - * - * @return string - */ - public function read($n) { - if ($n < 1) { - return ""; - } - - $string = fread($this->f, $n); - $chunks = str_split($string, 2); - $chunks = array_map("strrev", $chunks); - - return implode("", $chunks); - } - - public function readUInt32() { - $uint32 = parent::readUInt32(); - - return $uint32 >> 16 & 0x0000FFFF | $uint32 << 16 & 0xFFFF0000; - } - - /** - * Get font copyright - * - * @return string|null - */ - function getFontCopyright() { - return null; - } - - /** - * Get font name - * - * @return string|null - */ - function getFontName() { - return $this->header->data["FamilyName"]; - } - - /** - * Get font subfamily - * - * @return string|null - */ - function getFontSubfamily() { - return $this->header->data["StyleName"]; - } - - /** - * Get font subfamily ID - * - * @return string|null - */ - function getFontSubfamilyID() { - return $this->header->data["StyleName"]; - } - - /** - * Get font full name - * - * @return string|null - */ - function getFontFullName() { - return $this->header->data["FullName"]; - } - - /** - * Get font version - * - * @return string|null - */ - function getFontVersion() { - return $this->header->data["VersionName"]; - } - - /** - * Get font weight - * - * @return string|null - */ - function getFontWeight() { - return $this->header->data["Weight"]; - } - - /** - * Get font Postscript name - * - * @return string|null - */ - function getFontPostscriptName() { - return null; - } -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/EOT/Header.php b/vendor/phenx/php-font-lib/src/FontLib/EOT/Header.php deleted file mode 100644 index 960e36a..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/EOT/Header.php +++ /dev/null @@ -1,113 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\EOT; - -use Exception; -use FontLib\Font; - -/** - * TrueType font file header. - * - * @package php-font-lib - * - * @property File $font - */ -class Header extends \FontLib\Header { - protected $def = array( - "format" => self::uint32, - "numTables" => self::uint16, - "searchRange" => self::uint16, - "entrySelector" => self::uint16, - "rangeShift" => self::uint16, - ); - - public function parse() { - $font = $this->font; - - $this->data = $font->unpack(array( - "EOTSize" => self::uint32, - "FontDataSize" => self::uint32, - "Version" => self::uint32, - "Flags" => self::uint32, - "FontPANOSE" => array(self::uint8, 10), - "Charset" => self::uint8, - "Italic" => self::uint8, - "Weight" => self::uint32, - "fsType" => self::uint16, - "MagicNumber" => self::uint16, - "UnicodeRange1" => self::uint32, - "UnicodeRange2" => self::uint32, - "UnicodeRange3" => self::uint32, - "UnicodeRange4" => self::uint32, - "CodePageRange1" => self::uint32, - "CodePageRange2" => self::uint32, - "CheckSumAdjustment" => self::uint32, - "Reserved1" => self::uint32, - "Reserved2" => self::uint32, - "Reserved3" => self::uint32, - "Reserved4" => self::uint32, - )); - - $this->data["Padding1"] = $font->readUInt16(); - $this->readString("FamilyName"); - - $this->data["Padding2"] = $font->readUInt16(); - $this->readString("StyleName"); - - $this->data["Padding3"] = $font->readUInt16(); - $this->readString("VersionName"); - - $this->data["Padding4"] = $font->readUInt16(); - $this->readString("FullName"); - - switch ($this->data["Version"]) { - default: - throw new Exception("Unknown EOT version " . $this->data["Version"]); - - case 0x00010000: - // Nothing to do more - break; - - case 0x00020001: - $this->data["Padding5"] = $font->readUInt16(); - $this->readString("RootString"); - break; - - case 0x00020002: - $this->data["Padding5"] = $font->readUInt16(); - $this->readString("RootString"); - - $this->data["RootStringCheckSum"] = $font->readUInt32(); - $this->data["EUDCCodePage"] = $font->readUInt32(); - - $this->data["Padding6"] = $font->readUInt16(); - $this->readString("Signature"); - - $this->data["EUDCFlags"] = $font->readUInt32(); - $this->data["EUDCFontSize"] = $font->readUInt32(); - break; - } - - if (!empty($this->data["RootString"])) { - $this->data["RootString"] = explode("\0", $this->data["RootString"]); - } - } - - private function readString($name) { - $font = $this->font; - $size = $font->readUInt16(); - - $this->data["{$name}Size"] = $size; - $this->data[$name] = Font::UTF16ToUTF8($font->read($size)); - } - - public function encode() { - //return $this->font->pack($this->def, $this->data); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/EncodingMap.php b/vendor/phenx/php-font-lib/src/FontLib/EncodingMap.php deleted file mode 100644 index 2acdebc..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/EncodingMap.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib; - -/** - * Encoding map used to map a code point to a Unicode char. - * - * @package php-font-lib - */ -class EncodingMap { - private $f; - - function __construct($file) { - $this->f = fopen($file, "r"); - } - - function parse() { - $map = array(); - - while ($line = fgets($this->f)) { - if (preg_match('/^[\!\=]([0-9A-F]{2,})\s+U\+([0-9A-F]{2})([0-9A-F]{2})\s+([^\s]+)/', $line, $matches)) { - $unicode = (hexdec($matches[2]) << 8) + hexdec($matches[3]); - $map[hexdec($matches[1])] = array($unicode, $matches[4]); - } - } - - ksort($map); - - return $map; - } -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/Exception/FontNotFoundException.php b/vendor/phenx/php-font-lib/src/FontLib/Exception/FontNotFoundException.php deleted file mode 100644 index d97f252..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Exception/FontNotFoundException.php +++ /dev/null @@ -1,11 +0,0 @@ -message = 'Font not found in: ' . $fontPath; - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Font.php b/vendor/phenx/php-font-lib/src/FontLib/Font.php deleted file mode 100644 index ecc216e..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Font.php +++ /dev/null @@ -1,89 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib; - -use FontLib\Exception\FontNotFoundException; - -/** - * Generic font file. - * - * @package php-font-lib - */ -class Font { - static $debug = false; - - /** - * @param string $file The font file - * - * @return TrueType\File|null $file - */ - public static function load($file) { - if(!file_exists($file)){ - throw new FontNotFoundException($file); - } - - $header = file_get_contents($file, false, null, null, 4); - $class = null; - - switch ($header) { - case "\x00\x01\x00\x00": - case "true": - case "typ1": - $class = "TrueType\\File"; - break; - - case "OTTO": - $class = "OpenType\\File"; - break; - - case "wOFF": - $class = "WOFF\\File"; - break; - - case "ttcf": - $class = "TrueType\\Collection"; - break; - - // Unknown type or EOT - default: - $magicNumber = file_get_contents($file, false, null, 34, 2); - - if ($magicNumber === "LP") { - $class = "EOT\\File"; - } - } - - if ($class) { - $class = "FontLib\\$class"; - - /** @var TrueType\File $obj */ - $obj = new $class; - $obj->load($file); - - return $obj; - } - - return null; - } - - static function d($str) { - if (!self::$debug) { - return; - } - echo "$str\n"; - } - - static function UTF16ToUTF8($str) { - return mb_convert_encoding($str, "utf-8", "utf-16"); - } - - static function UTF8ToUTF16($str) { - return mb_convert_encoding($str, "utf-16", "utf-8"); - } -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/Glyph/Outline.php b/vendor/phenx/php-font-lib/src/FontLib/Glyph/Outline.php deleted file mode 100644 index 330db09..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Glyph/Outline.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $ - */ -namespace FontLib\Glyph; - -use FontLib\Table\Type\glyf; -use FontLib\TrueType\File; -use FontLib\BinaryStream; - -/** - * `glyf` font table. - * - * @package php-font-lib - */ -class Outline extends BinaryStream { - /** - * @var \FontLib\Table\Type\glyf - */ - protected $table; - - protected $offset; - protected $size; - - // Data - public $numberOfContours; - public $xMin; - public $yMin; - public $xMax; - public $yMax; - - public $raw; - - /** - * @param glyf $table - * @param $offset - * @param $size - * - * @return Outline - */ - static function init(glyf $table, $offset, $size, BinaryStream $font) { - $font->seek($offset); - - if ($font->readInt16() > -1) { - /** @var OutlineSimple $glyph */ - $glyph = new OutlineSimple($table, $offset, $size); - } - else { - /** @var OutlineComposite $glyph */ - $glyph = new OutlineComposite($table, $offset, $size); - } - - $glyph->parse($font); - - return $glyph; - } - - /** - * @return File - */ - function getFont() { - return $this->table->getFont(); - } - - function __construct(glyf $table, $offset = null, $size = null) { - $this->table = $table; - $this->offset = $offset; - $this->size = $size; - } - - function parse(BinaryStream $font) { - $font->seek($this->offset); - - if (!$this->size) { - return; - } - - $this->raw = $font->read($this->size); - } - - function parseData() { - $font = $this->getFont(); - $font->seek($this->offset); - - $this->numberOfContours = $font->readInt16(); - $this->xMin = $font->readFWord(); - $this->yMin = $font->readFWord(); - $this->xMax = $font->readFWord(); - $this->yMax = $font->readFWord(); - } - - function encode() { - $font = $this->getFont(); - - return $font->write($this->raw, strlen($this->raw)); - } - - function getSVGContours() { - // Inherit - } - - function getGlyphIDs() { - return array(); - } -} - diff --git a/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComponent.php b/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComponent.php deleted file mode 100644 index 9cafaf4..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComponent.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $ - */ - -namespace FontLib\Glyph; -/** - * Glyph outline component - * - * @package php-font-lib - */ -class OutlineComponent { - public $flags; - public $glyphIndex; - public $a, $b, $c, $d, $e, $f; - public $point_compound; - public $point_component; - public $instructions; - - function getMatrix() { - return array( - $this->a, $this->b, - $this->c, $this->d, - $this->e, $this->f, - ); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComposite.php b/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComposite.php deleted file mode 100644 index 8ab0d2c..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineComposite.php +++ /dev/null @@ -1,242 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $ - */ - -namespace FontLib\Glyph; - -/** - * Composite glyph outline - * - * @package php-font-lib - */ -class OutlineComposite extends Outline { - const ARG_1_AND_2_ARE_WORDS = 0x0001; - const ARGS_ARE_XY_VALUES = 0x0002; - const ROUND_XY_TO_GRID = 0x0004; - const WE_HAVE_A_SCALE = 0x0008; - const MORE_COMPONENTS = 0x0020; - const WE_HAVE_AN_X_AND_Y_SCALE = 0x0040; - const WE_HAVE_A_TWO_BY_TWO = 0x0080; - const WE_HAVE_INSTRUCTIONS = 0x0100; - const USE_MY_METRICS = 0x0200; - const OVERLAP_COMPOUND = 0x0400; - - /** - * @var OutlineComponent[] - */ - public $components = array(); - - function getGlyphIDs() { - if (empty($this->components)) { - $this->parseData(); - } - - $glyphIDs = array(); - foreach ($this->components as $_component) { - $glyphIDs[] = $_component->glyphIndex; - - $_glyph = $this->table->data[$_component->glyphIndex]; - - if ($_glyph !== $this) { - $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs()); - } - } - - return $glyphIDs; - } - - /*function parse() { - //$this->parseData(); - }*/ - - function parseData() { - parent::parseData(); - - $font = $this->getFont(); - - do { - $flags = $font->readUInt16(); - $glyphIndex = $font->readUInt16(); - - $a = 1.0; - $b = 0.0; - $c = 0.0; - $d = 1.0; - $e = 0.0; - $f = 0.0; - - $point_compound = null; - $point_component = null; - - $instructions = null; - - if ($flags & self::ARG_1_AND_2_ARE_WORDS) { - if ($flags & self::ARGS_ARE_XY_VALUES) { - $e = $font->readInt16(); - $f = $font->readInt16(); - } - else { - $point_compound = $font->readUInt16(); - $point_component = $font->readUInt16(); - } - } - else { - if ($flags & self::ARGS_ARE_XY_VALUES) { - $e = $font->readInt8(); - $f = $font->readInt8(); - } - else { - $point_compound = $font->readUInt8(); - $point_component = $font->readUInt8(); - } - } - - if ($flags & self::WE_HAVE_A_SCALE) { - $a = $d = $font->readInt16(); - } - elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) { - $a = $font->readInt16(); - $d = $font->readInt16(); - } - elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) { - $a = $font->readInt16(); - $b = $font->readInt16(); - $c = $font->readInt16(); - $d = $font->readInt16(); - } - - //if ($flags & self::WE_HAVE_INSTRUCTIONS) { - // - //} - - $component = new OutlineComponent(); - $component->flags = $flags; - $component->glyphIndex = $glyphIndex; - $component->a = $a; - $component->b = $b; - $component->c = $c; - $component->d = $d; - $component->e = $e; - $component->f = $f; - $component->point_compound = $point_compound; - $component->point_component = $point_component; - $component->instructions = $instructions; - - $this->components[] = $component; - } while ($flags & self::MORE_COMPONENTS); - } - - function encode() { - $font = $this->getFont(); - - $gids = $font->getSubset(); - - $size = $font->writeInt16(-1); - $size += $font->writeFWord($this->xMin); - $size += $font->writeFWord($this->yMin); - $size += $font->writeFWord($this->xMax); - $size += $font->writeFWord($this->yMax); - - foreach ($this->components as $_i => $_component) { - $flags = 0; - if ($_component->point_component === null && $_component->point_compound === null) { - $flags |= self::ARGS_ARE_XY_VALUES; - - if (abs($_component->e) > 0x7F || abs($_component->f) > 0x7F) { - $flags |= self::ARG_1_AND_2_ARE_WORDS; - } - } - elseif ($_component->point_component > 0xFF || $_component->point_compound > 0xFF) { - $flags |= self::ARG_1_AND_2_ARE_WORDS; - } - - if ($_component->b == 0 && $_component->c == 0) { - if ($_component->a == $_component->d) { - if ($_component->a != 1.0) { - $flags |= self::WE_HAVE_A_SCALE; - } - } - else { - $flags |= self::WE_HAVE_AN_X_AND_Y_SCALE; - } - } - else { - $flags |= self::WE_HAVE_A_TWO_BY_TWO; - } - - if ($_i < count($this->components) - 1) { - $flags |= self::MORE_COMPONENTS; - } - - $size += $font->writeUInt16($flags); - - $new_gid = array_search($_component->glyphIndex, $gids); - $size += $font->writeUInt16($new_gid); - - if ($flags & self::ARG_1_AND_2_ARE_WORDS) { - if ($flags & self::ARGS_ARE_XY_VALUES) { - $size += $font->writeInt16($_component->e); - $size += $font->writeInt16($_component->f); - } - else { - $size += $font->writeUInt16($_component->point_compound); - $size += $font->writeUInt16($_component->point_component); - } - } - else { - if ($flags & self::ARGS_ARE_XY_VALUES) { - $size += $font->writeInt8($_component->e); - $size += $font->writeInt8($_component->f); - } - else { - $size += $font->writeUInt8($_component->point_compound); - $size += $font->writeUInt8($_component->point_component); - } - } - - if ($flags & self::WE_HAVE_A_SCALE) { - $size += $font->writeInt16($_component->a); - } - elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) { - $size += $font->writeInt16($_component->a); - $size += $font->writeInt16($_component->d); - } - elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) { - $size += $font->writeInt16($_component->a); - $size += $font->writeInt16($_component->b); - $size += $font->writeInt16($_component->c); - $size += $font->writeInt16($_component->d); - } - } - - return $size; - } - - public function getSVGContours() { - $contours = array(); - - /** @var \FontLib\Table\Type\glyf $glyph_data */ - $glyph_data = $this->getFont()->getTableObject("glyf"); - - /** @var Outline[] $glyphs */ - $glyphs = $glyph_data->data; - - foreach ($this->components as $component) { - $_glyph = $glyphs[$component->glyphIndex]; - - if ($_glyph !== $this) { - $contours[] = array( - "contours" => $_glyph->getSVGContours(), - "transform" => $component->getMatrix(), - ); - } - } - - return $contours; - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineSimple.php b/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineSimple.php deleted file mode 100644 index 3c023de..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Glyph/OutlineSimple.php +++ /dev/null @@ -1,335 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @version $Id: Font_Table_glyf.php 46 2012-04-02 20:22:38Z fabien.menager $ - */ - -namespace FontLib\Glyph; - -/** - * `glyf` font table. - * - * @package php-font-lib - */ -class OutlineSimple extends Outline { - const ON_CURVE = 0x01; - const X_SHORT_VECTOR = 0x02; - const Y_SHORT_VECTOR = 0x04; - const REPEAT = 0x08; - const THIS_X_IS_SAME = 0x10; - const THIS_Y_IS_SAME = 0x20; - - public $instructions; - public $points; - - function parseData() { - parent::parseData(); - - if (!$this->size) { - return; - } - - $font = $this->getFont(); - - $noc = $this->numberOfContours; - - if ($noc == 0) { - return; - } - - $endPtsOfContours = $font->r(array(self::uint16, $noc)); - - $instructionLength = $font->readUInt16(); - $this->instructions = $font->r(array(self::uint8, $instructionLength)); - - $count = $endPtsOfContours[$noc - 1] + 1; - - // Flags - $flags = array(); - for ($index = 0; $index < $count; $index++) { - $flags[$index] = $font->readUInt8(); - - if ($flags[$index] & self::REPEAT) { - $repeats = $font->readUInt8(); - - for ($i = 1; $i <= $repeats; $i++) { - $flags[$index + $i] = $flags[$index]; - } - - $index += $repeats; - } - } - - $points = array(); - foreach ($flags as $i => $flag) { - $points[$i]["onCurve"] = $flag & self::ON_CURVE; - $points[$i]["endOfContour"] = in_array($i, $endPtsOfContours); - } - - // X Coords - $x = 0; - for ($i = 0; $i < $count; $i++) { - $flag = $flags[$i]; - - if ($flag & self::THIS_X_IS_SAME) { - if ($flag & self::X_SHORT_VECTOR) { - $x += $font->readUInt8(); - } - } - else { - if ($flag & self::X_SHORT_VECTOR) { - $x -= $font->readUInt8(); - } - else { - $x += $font->readInt16(); - } - } - - $points[$i]["x"] = $x; - } - - // Y Coords - $y = 0; - for ($i = 0; $i < $count; $i++) { - $flag = $flags[$i]; - - if ($flag & self::THIS_Y_IS_SAME) { - if ($flag & self::Y_SHORT_VECTOR) { - $y += $font->readUInt8(); - } - } - else { - if ($flag & self::Y_SHORT_VECTOR) { - $y -= $font->readUInt8(); - } - else { - $y += $font->readInt16(); - } - } - - $points[$i]["y"] = $y; - } - - $this->points = $points; - } - - public function splitSVGPath($path) { - preg_match_all('/([a-z])|(-?\d+(?:\.\d+)?)/i', $path, $matches, PREG_PATTERN_ORDER); - - return $matches[0]; - } - - public function makePoints($path) { - $path = $this->splitSVGPath($path); - $l = count($path); - $i = 0; - - $points = array(); - - while ($i < $l) { - switch ($path[$i]) { - // moveTo - case "M": - $points[] = array( - "onCurve" => true, - "x" => $path[++$i], - "y" => $path[++$i], - "endOfContour" => false, - ); - break; - - // lineTo - case "L": - $points[] = array( - "onCurve" => true, - "x" => $path[++$i], - "y" => $path[++$i], - "endOfContour" => false, - ); - break; - - // quadraticCurveTo - case "Q": - $points[] = array( - "onCurve" => false, - "x" => $path[++$i], - "y" => $path[++$i], - "endOfContour" => false, - ); - $points[] = array( - "onCurve" => true, - "x" => $path[++$i], - "y" => $path[++$i], - "endOfContour" => false, - ); - break; - - // closePath - /** @noinspection PhpMissingBreakStatementInspection */ - case "z": - $points[count($points) - 1]["endOfContour"] = true; - - default: - $i++; - break; - } - } - - return $points; - } - - function encode() { - if (empty($this->points)) { - return parent::encode(); - } - - return $this->size = $this->encodePoints($this->points); - } - - public function encodePoints($points) { - $endPtsOfContours = array(); - $flags = array(); - $coords_x = array(); - $coords_y = array(); - - $last_x = 0; - $last_y = 0; - $xMin = $yMin = 0xFFFF; - $xMax = $yMax = -0xFFFF; - foreach ($points as $i => $point) { - $flag = 0; - if ($point["onCurve"]) { - $flag |= self::ON_CURVE; - } - - if ($point["endOfContour"]) { - $endPtsOfContours[] = $i; - } - - // Simplified, we could do some optimizations - if ($point["x"] == $last_x) { - $flag |= self::THIS_X_IS_SAME; - } - else { - $x = intval($point["x"]); - $xMin = min($x, $xMin); - $xMax = max($x, $xMax); - $coords_x[] = $x - $last_x; // int16 - } - - // Simplified, we could do some optimizations - if ($point["y"] == $last_y) { - $flag |= self::THIS_Y_IS_SAME; - } - else { - $y = intval($point["y"]); - $yMin = min($y, $yMin); - $yMax = max($y, $yMax); - $coords_y[] = $y - $last_y; // int16 - } - - $flags[] = $flag; - $last_x = $point["x"]; - $last_y = $point["y"]; - } - - $font = $this->getFont(); - - $l = 0; - $l += $font->writeInt16(count($endPtsOfContours)); // endPtsOfContours - $l += $font->writeFWord(isset($this->xMin) ? $this->xMin : $xMin); // xMin - $l += $font->writeFWord(isset($this->yMin) ? $this->yMin : $yMin); // yMin - $l += $font->writeFWord(isset($this->xMax) ? $this->xMax : $xMax); // xMax - $l += $font->writeFWord(isset($this->yMax) ? $this->yMax : $yMax); // yMax - - // Simple glyf - $l += $font->w(array(self::uint16, count($endPtsOfContours)), $endPtsOfContours); // endPtsOfContours - $l += $font->writeUInt16(0); // instructionLength - $l += $font->w(array(self::uint8, count($flags)), $flags); // flags - $l += $font->w(array(self::int16, count($coords_x)), $coords_x); // xCoordinates - $l += $font->w(array(self::int16, count($coords_y)), $coords_y); // yCoordinates - return $l; - } - - public function getSVGContours($points = null) { - $path = ""; - - if (!$points) { - if (empty($this->points)) { - $this->parseData(); - } - - $points = $this->points; - } - - $length = count($points); - $firstIndex = 0; - $count = 0; - - for ($i = 0; $i < $length; $i++) { - $count++; - - if ($points[$i]["endOfContour"]) { - $path .= $this->getSVGPath($points, $firstIndex, $count); - $firstIndex = $i + 1; - $count = 0; - } - } - - return $path; - } - - protected function getSVGPath($points, $startIndex, $count) { - $offset = 0; - $path = ""; - - while ($offset < $count) { - $point = $points[$startIndex + $offset % $count]; - $point_p1 = $points[$startIndex + ($offset + 1) % $count]; - - if ($offset == 0) { - $path .= "M{$point['x']},{$point['y']} "; - } - - if ($point["onCurve"]) { - if ($point_p1["onCurve"]) { - $path .= "L{$point_p1['x']},{$point_p1['y']} "; - $offset++; - } - else { - $point_p2 = $points[$startIndex + ($offset + 2) % $count]; - - if ($point_p2["onCurve"]) { - $path .= "Q{$point_p1['x']},{$point_p1['y']},{$point_p2['x']},{$point_p2['y']} "; - } - else { - $path .= "Q{$point_p1['x']},{$point_p1['y']}," . $this->midValue($point_p1['x'], $point_p2['x']) . "," . $this->midValue($point_p1['y'], $point_p2['y']) . " "; - } - - $offset += 2; - } - } - else { - if ($point_p1["onCurve"]) { - $path .= "Q{$point['x']},{$point['y']},{$point_p1['x']},{$point_p1['y']} "; - } - else { - $path .= "Q{$point['x']},{$point['y']}," . $this->midValue($point['x'], $point_p1['x']) . "," . $this->midValue($point['y'], $point_p1['y']) . " "; - } - - $offset++; - } - } - - $path .= "z "; - - return $path; - } - - function midValue($a, $b) { - return $a + ($b - $a) / 2; - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Header.php b/vendor/phenx/php-font-lib/src/FontLib/Header.php deleted file mode 100644 index cbf137e..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Header.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace FontLib; - -use FontLib\TrueType\File; - -/** - * Font header container. - * - * @package php-font-lib - */ -abstract class Header extends BinaryStream { - /** - * @var File - */ - protected $font; - protected $def = array(); - - public $data; - - public function __construct(File $font) { - $this->font = $font; - } - - public function encode() { - return $this->font->pack($this->def, $this->data); - } - - public function parse() { - $this->data = $this->font->unpack($this->def); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/OpenType/File.php b/vendor/phenx/php-font-lib/src/FontLib/OpenType/File.php deleted file mode 100644 index 9c6df96..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/OpenType/File.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\OpenType; - -/** - * Open Type font, the same as a TrueType one. - * - * @package php-font-lib - */ -class File extends \FontLib\TrueType\File { - // -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/OpenType/TableDirectoryEntry.php b/vendor/phenx/php-font-lib/src/FontLib/OpenType/TableDirectoryEntry.php deleted file mode 100644 index dd75a3e..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/OpenType/TableDirectoryEntry.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\OpenType; - -/** - * Open Type Table directory entry, the same as a TrueType one. - * - * @package php-font-lib - */ -class TableDirectoryEntry extends \FontLib\TrueType\TableDirectoryEntry { - -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/DirectoryEntry.php b/vendor/phenx/php-font-lib/src/FontLib/Table/DirectoryEntry.php deleted file mode 100644 index 2b5846d..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/DirectoryEntry.php +++ /dev/null @@ -1,129 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace FontLib\Table; - -use FontLib\TrueType\File; -use FontLib\Font; -use FontLib\BinaryStream; - -/** - * Generic Font table directory entry. - * - * @package php-font-lib - */ -class DirectoryEntry extends BinaryStream { - /** - * @var File - */ - protected $font; - - /** - * @var Table - */ - protected $font_table; - - public $entryLength = 4; - - public $tag; - public $checksum; - public $offset; - public $length; - - protected $origF; - - static function computeChecksum($data) { - $len = strlen($data); - $mod = $len % 4; - - if ($mod) { - $data = str_pad($data, $len + (4 - $mod), "\0"); - } - - $len = strlen($data); - - $hi = 0x0000; - $lo = 0x0000; - - for ($i = 0; $i < $len; $i += 4) { - $hi += (ord($data[$i]) << 8) + ord($data[$i + 1]); - $lo += (ord($data[$i + 2]) << 8) + ord($data[$i + 3]); - $hi += $lo >> 16; - $lo = $lo & 0xFFFF; - $hi = $hi & 0xFFFF; - } - - return ($hi << 8) + $lo; - } - - function __construct(File $font) { - $this->font = $font; - $this->f = $font->f; - } - - function parse() { - $this->tag = $this->font->read(4); - } - - function open($filename, $mode = self::modeRead) { - // void - } - - function setTable(Table $font_table) { - $this->font_table = $font_table; - } - - function encode($entry_offset) { - Font::d("\n==== $this->tag ===="); - //Font::d("Entry offset = $entry_offset"); - - $data = $this->font_table; - $font = $this->font; - - $table_offset = $font->pos(); - $this->offset = $table_offset; - $table_length = $data->encode(); - - $font->seek($table_offset); - $table_data = $font->read($table_length); - - $font->seek($entry_offset); - - $font->write($this->tag, 4); - $font->writeUInt32(self::computeChecksum($table_data)); - $font->writeUInt32($table_offset); - $font->writeUInt32($table_length); - - Font::d("Bytes written = $table_length"); - - $font->seek($table_offset + $table_length); - } - - /** - * @return File - */ - function getFont() { - return $this->font; - } - - function startRead() { - $this->font->seek($this->offset); - } - - function endRead() { - // - } - - function startWrite() { - $this->font->seek($this->offset); - } - - function endWrite() { - // - } -} - diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Table.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Table.php deleted file mode 100644 index b127112..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Table.php +++ /dev/null @@ -1,93 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace FontLib\Table; - -use FontLib\TrueType\File; -use FontLib\Font; -use FontLib\BinaryStream; - -/** - * Generic font table. - * - * @package php-font-lib - */ -class Table extends BinaryStream { - /** - * @var DirectoryEntry - */ - protected $entry; - protected $def = array(); - - public $data; - - final public function __construct(DirectoryEntry $entry) { - $this->entry = $entry; - $entry->setTable($this); - } - - /** - * @return File - */ - public function getFont() { - return $this->entry->getFont(); - } - - protected function _encode() { - if (empty($this->data)) { - Font::d(" >> Table is empty"); - - return 0; - } - - return $this->getFont()->pack($this->def, $this->data); - } - - protected function _parse() { - $this->data = $this->getFont()->unpack($this->def); - } - - protected function _parseRaw() { - $this->data = $this->getFont()->read($this->entry->length); - } - - protected function _encodeRaw() { - return $this->getFont()->write($this->data, $this->entry->length); - } - - public function toHTML() { - return "
" . var_export($this->data, true) . "
"; - } - - final public function encode() { - $this->entry->startWrite(); - - if (false && empty($this->def)) { - $length = $this->_encodeRaw(); - } - else { - $length = $this->_encode(); - } - - $this->entry->endWrite(); - - return $length; - } - - final public function parse() { - $this->entry->startRead(); - - if (false && empty($this->def)) { - $this->_parseRaw(); - } - else { - $this->_parse(); - } - - $this->entry->endRead(); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/cmap.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/cmap.php deleted file mode 100644 index 7db77e1..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/cmap.php +++ /dev/null @@ -1,298 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; -use FontLib\Table\Table; - -/** - * `cmap` font table. - * - * @package php-font-lib - */ -class cmap extends Table { - private static $header_format = array( - "version" => self::uint16, - "numberSubtables" => self::uint16, - ); - - private static $subtable_header_format = array( - "platformID" => self::uint16, - "platformSpecificID" => self::uint16, - "offset" => self::uint32, - ); - - private static $subtable_v4_format = array( - "length" => self::uint16, - "language" => self::uint16, - "segCountX2" => self::uint16, - "searchRange" => self::uint16, - "entrySelector" => self::uint16, - "rangeShift" => self::uint16, - ); - - private static $subtable_v12_format = array( - "length" => self::uint32, - "language" => self::uint32, - "ngroups" => self::uint32 - ); - - protected function _parse() { - $font = $this->getFont(); - - $cmap_offset = $font->pos(); - - $data = $font->unpack(self::$header_format); - - $subtables = array(); - for ($i = 0; $i < $data["numberSubtables"]; $i++) { - $subtables[] = $font->unpack(self::$subtable_header_format); - } - - $data["subtables"] = $subtables; - - foreach ($data["subtables"] as $i => &$subtable) { - $font->seek($cmap_offset + $subtable["offset"]); - - $subtable["format"] = $font->readUInt16(); - - // @todo Only CMAP version 4 and 12 - if (($subtable["format"] != 4) && ($subtable["format"] != 12)) { - unset($data["subtables"][$i]); - $data["numberSubtables"]--; - continue; - } - - if ($subtable["format"] == 12) { - - $font->readUInt16(); - - $subtable += $font->unpack(self::$subtable_v12_format); - - $glyphIndexArray = array(); - $endCodes = array(); - $startCodes = array(); - - for ($p = 0; $p < $subtable['ngroups']; $p++) { - - $startCode = $startCodes[] = $font->readUInt32(); - $endCode = $endCodes[] = $font->readUInt32(); - $startGlyphCode = $font->readUInt32(); - - for ($c = $startCode; $c <= $endCode; $c++) { - $glyphIndexArray[$c] = $startGlyphCode; - $startGlyphCode++; - } - } - - $subtable += array( - "startCode" => $startCodes, - "endCode" => $endCodes, - "glyphIndexArray" => $glyphIndexArray, - ); - - } - else if ($subtable["format"] == 4) { - - $subtable += $font->unpack(self::$subtable_v4_format); - - $segCount = $subtable["segCountX2"] / 2; - $subtable["segCount"] = $segCount; - - $endCode = $font->readUInt16Many($segCount); - - $font->readUInt16(); // reservedPad - - $startCode = $font->readUInt16Many($segCount); - $idDelta = $font->readInt16Many($segCount); - - $ro_start = $font->pos(); - $idRangeOffset = $font->readUInt16Many($segCount); - - $glyphIndexArray = array(); - for ($i = 0; $i < $segCount; $i++) { - $c1 = $startCode[$i]; - $c2 = $endCode[$i]; - $d = $idDelta[$i]; - $ro = $idRangeOffset[$i]; - - if ($ro > 0) { - $font->seek($subtable["offset"] + 2 * $i + $ro); - } - - for ($c = $c1; $c <= $c2; $c++) { - if ($ro == 0) { - $gid = ($c + $d) & 0xFFFF; - } - else { - $offset = ($c - $c1) * 2 + $ro; - $offset = $ro_start + 2 * $i + $offset; - - $font->seek($offset); - $gid = $font->readUInt16(); - - if ($gid != 0) { - $gid = ($gid + $d) & 0xFFFF; - } - } - - if ($gid > 0) { - $glyphIndexArray[$c] = $gid; - } - } - } - - $subtable += array( - "endCode" => $endCode, - "startCode" => $startCode, - "idDelta" => $idDelta, - "idRangeOffset" => $idRangeOffset, - "glyphIndexArray" => $glyphIndexArray, - ); - } - } - - $this->data = $data; - } - - function _encode() { - $font = $this->getFont(); - - $subset = $font->getSubset(); - $glyphIndexArray = $font->getUnicodeCharMap(); - - $newGlyphIndexArray = array(); - foreach ($glyphIndexArray as $code => $gid) { - $new_gid = array_search($gid, $subset); - if ($new_gid !== false) { - $newGlyphIndexArray[$code] = $new_gid; - } - } - - ksort($newGlyphIndexArray); // Sort by char code - - $segments = array(); - - $i = -1; - $prevCode = 0xFFFF; - $prevGid = 0xFFFF; - - foreach ($newGlyphIndexArray as $code => $gid) { - if ( - $prevCode + 1 != $code || - $prevGid + 1 != $gid - ) { - $i++; - $segments[$i] = array(); - } - - $segments[$i][] = array($code, $gid); - - $prevCode = $code; - $prevGid = $gid; - } - - $segments[][] = array(0xFFFF, 0xFFFF); - - $startCode = array(); - $endCode = array(); - $idDelta = array(); - - foreach ($segments as $codes) { - $start = reset($codes); - $end = end($codes); - - $startCode[] = $start[0]; - $endCode[] = $end[0]; - $idDelta[] = $start[1] - $start[0]; - } - - $segCount = count($startCode); - $idRangeOffset = array_fill(0, $segCount, 0); - - $searchRange = 1; - $entrySelector = 0; - while ($searchRange * 2 <= $segCount) { - $searchRange *= 2; - $entrySelector++; - } - $searchRange *= 2; - $rangeShift = $segCount * 2 - $searchRange; - - $subtables = array( - array( - // header - "platformID" => 3, // Unicode - "platformSpecificID" => 1, - "offset" => null, - - // subtable - "format" => 4, - "length" => null, - "language" => 0, - "segCount" => $segCount, - "segCountX2" => $segCount * 2, - "searchRange" => $searchRange, - "entrySelector" => $entrySelector, - "rangeShift" => $rangeShift, - "startCode" => $startCode, - "endCode" => $endCode, - "idDelta" => $idDelta, - "idRangeOffset" => $idRangeOffset, - "glyphIndexArray" => $newGlyphIndexArray, - ) - ); - - $data = array( - "version" => 0, - "numberSubtables" => count($subtables), - "subtables" => $subtables, - ); - - $length = $font->pack(self::$header_format, $data); - - $subtable_headers_size = $data["numberSubtables"] * 8; // size of self::$subtable_header_format - $subtable_headers_offset = $font->pos(); - - $length += $font->write(str_repeat("\0", $subtable_headers_size), $subtable_headers_size); - - // write subtables data - foreach ($data["subtables"] as $i => $subtable) { - $length_before = $length; - $data["subtables"][$i]["offset"] = $length; - - $length += $font->writeUInt16($subtable["format"]); - - $before_subheader = $font->pos(); - $length += $font->pack(self::$subtable_v4_format, $subtable); - - $segCount = $subtable["segCount"]; - $length += $font->w(array(self::uint16, $segCount), $subtable["endCode"]); - $length += $font->writeUInt16(0); // reservedPad - $length += $font->w(array(self::uint16, $segCount), $subtable["startCode"]); - $length += $font->w(array(self::int16, $segCount), $subtable["idDelta"]); - $length += $font->w(array(self::uint16, $segCount), $subtable["idRangeOffset"]); - $length += $font->w(array(self::uint16, $segCount), array_values($subtable["glyphIndexArray"])); - - $after_subtable = $font->pos(); - - $subtable["length"] = $length - $length_before; - $font->seek($before_subheader); - $length += $font->pack(self::$subtable_v4_format, $subtable); - - $font->seek($after_subtable); - } - - // write subtables headers - $font->seek($subtable_headers_offset); - foreach ($data["subtables"] as $subtable) { - $font->pack(self::$subtable_header_format, $subtable); - } - - return $length; - } -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/glyf.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/glyf.php deleted file mode 100644 index 1fbec3f..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/glyf.php +++ /dev/null @@ -1,154 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; - -use FontLib\Table\Table; -use FontLib\Glyph\Outline; -use FontLib\Glyph\OutlineSimple; - -/** - * `glyf` font table. - * - * @package php-font-lib - * @property Outline[] $data - */ -class glyf extends Table { - protected function _parse() { - $font = $this->getFont(); - $offset = $font->pos(); - - $loca = $font->getData("loca"); - $real_loca = array_slice($loca, 0, -1); // Not the last dummy loca entry - - $data = array(); - - foreach ($real_loca as $gid => $location) { - $_offset = $offset + $loca[$gid]; - $_size = $loca[$gid + 1] - $loca[$gid]; - $data[$gid] = Outline::init($this, $_offset, $_size, $font); - } - - $this->data = $data; - } - - public function getGlyphIDs($gids = array()) { - $glyphIDs = array(); - - foreach ($gids as $_gid) { - $_glyph = $this->data[$_gid]; - $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs()); - } - - return array_unique(array_merge($gids, $glyphIDs)); - } - - public function toHTML() { - $max = 160; - $font = $this->getFont(); - - $head = $font->getData("head"); - $head_json = json_encode($head); - - $os2 = $font->getData("OS/2"); - $os2_json = json_encode($os2); - - $hmtx = $font->getData("hmtx"); - $hmtx_json = json_encode($hmtx); - - $names = $font->getData("post", "names"); - $glyphIndexArray = array_flip($font->getUnicodeCharMap()); - - $width = (abs($head["xMin"]) + $head["xMax"]); - $height = (abs($head["yMin"]) + $head["yMax"]); - - $ratio = 1; - if ($width > $max || $height > $max) { - $ratio = max($width, $height) / $max; - $width = round($width / $ratio); - $height = round($height / $ratio); - } - - $n = 500; - - $s = "

" . "Only the first $n simple glyphs are shown (" . count($this->data) . " total) -
Simple glyph
-
Composite glyph
- Zoom: -

- "; - - foreach ($this->data as $g => $glyph) { - if ($n-- <= 0) { - break; - } - - $glyph->parseData(); - - $shape = array( - "SVGContours" => $glyph->getSVGContours(), - "xMin" => $glyph->xMin, - "yMin" => $glyph->yMin, - "xMax" => $glyph->xMax, - "yMax" => $glyph->yMax, - ); - $shape_json = json_encode($shape); - - $type = ($glyph instanceof OutlineSimple ? "simple" : "composite"); - $char = isset($glyphIndexArray[$g]) ? $glyphIndexArray[$g] : 0; - $name = isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $char); - $char = $char ? "&#{$glyphIndexArray[$g]};" : ""; - - $s .= "
- $g - $char - $name - "; - - if ($type == "composite") { - foreach ($glyph->getGlyphIDs() as $_id) { - $s .= "$_id "; - } - } - - $s .= "
- -
- "; - } - - return $s; - } - - - protected function _encode() { - $font = $this->getFont(); - $subset = $font->getSubset(); - $data = $this->data; - - $loca = array(); - - $length = 0; - foreach ($subset as $gid) { - $loca[] = $length; - $length += $data[$gid]->encode(); - } - - $loca[] = $length; // dummy loca - $font->getTableObject("loca")->data = $loca; - - return $length; - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/head.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/head.php deleted file mode 100644 index 6349f14..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/head.php +++ /dev/null @@ -1,46 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; -use FontLib\Table\Table; -use Exception; - -/** - * `head` font table. - * - * @package php-font-lib - */ -class head extends Table { - protected $def = array( - "tableVersion" => self::Fixed, - "fontRevision" => self::Fixed, - "checkSumAdjustment" => self::uint32, - "magicNumber" => self::uint32, - "flags" => self::uint16, - "unitsPerEm" => self::uint16, - "created" => self::longDateTime, - "modified" => self::longDateTime, - "xMin" => self::FWord, - "yMin" => self::FWord, - "xMax" => self::FWord, - "yMax" => self::FWord, - "macStyle" => self::uint16, - "lowestRecPPEM" => self::uint16, - "fontDirectionHint" => self::int16, - "indexToLocFormat" => self::int16, - "glyphDataFormat" => self::int16, - ); - - protected function _parse() { - parent::_parse(); - - if ($this->data["magicNumber"] != 0x5F0F3CF5) { - throw new Exception("Incorrect magic number (" . dechex($this->data["magicNumber"]) . ")"); - } - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/hhea.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/hhea.php deleted file mode 100644 index dc60a14..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/hhea.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; -use FontLib\Table\Table; - -/** - * `hhea` font table. - * - * @package php-font-lib - */ -class hhea extends Table { - protected $def = array( - "version" => self::Fixed, - "ascent" => self::FWord, - "descent" => self::FWord, - "lineGap" => self::FWord, - "advanceWidthMax" => self::uFWord, - "minLeftSideBearing" => self::FWord, - "minRightSideBearing" => self::FWord, - "xMaxExtent" => self::FWord, - "caretSlopeRise" => self::int16, - "caretSlopeRun" => self::int16, - "caretOffset" => self::FWord, - self::int16, - self::int16, - self::int16, - self::int16, - "metricDataFormat" => self::int16, - "numOfLongHorMetrics" => self::uint16, - ); - - function _encode() { - $font = $this->getFont(); - $this->data["numOfLongHorMetrics"] = count($font->getSubset()); - - return parent::_encode(); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/hmtx.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/hmtx.php deleted file mode 100644 index 76e3307..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/hmtx.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; -use FontLib\Table\Table; - -/** - * `hmtx` font table. - * - * @package php-font-lib - */ -class hmtx extends Table { - protected function _parse() { - $font = $this->getFont(); - $offset = $font->pos(); - - $numOfLongHorMetrics = $font->getData("hhea", "numOfLongHorMetrics"); - $numGlyphs = $font->getData("maxp", "numGlyphs"); - - $font->seek($offset); - - $data = array(); - $metrics = $font->readUInt16Many($numOfLongHorMetrics * 2); - for ($gid = 0, $mid = 0; $gid < $numOfLongHorMetrics; $gid++) { - $advanceWidth = isset($metrics[$mid]) ? $metrics[$mid] : 0; - $mid += 1; - $leftSideBearing = isset($metrics[$mid]) ? $metrics[$mid] : 0; - $mid += 1; - $data[$gid] = array($advanceWidth, $leftSideBearing); - } - - if ($numOfLongHorMetrics < $numGlyphs) { - $lastWidth = end($data); - $data = array_pad($data, $numGlyphs, $lastWidth); - } - - $this->data = $data; - } - - protected function _encode() { - $font = $this->getFont(); - $subset = $font->getSubset(); - $data = $this->data; - - $length = 0; - - foreach ($subset as $gid) { - $length += $font->writeUInt16($data[$gid][0]); - $length += $font->writeUInt16($data[$gid][1]); - } - - return $length; - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/kern.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/kern.php deleted file mode 100644 index 9875946..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/kern.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; -use FontLib\Table\Table; - -/** - * `kern` font table. - * - * @package php-font-lib - */ -class kern extends Table { - protected function _parse() { - $font = $this->getFont(); - - $data = $font->unpack(array( - "version" => self::uint16, - "nTables" => self::uint16, - - // only the first subtable will be parsed - "subtableVersion" => self::uint16, - "length" => self::uint16, - "coverage" => self::uint16, - )); - - $data["format"] = ($data["coverage"] >> 8); - - $subtable = array(); - - switch ($data["format"]) { - case 0: - $subtable = $font->unpack(array( - "nPairs" => self::uint16, - "searchRange" => self::uint16, - "entrySelector" => self::uint16, - "rangeShift" => self::uint16, - )); - - $pairs = array(); - $tree = array(); - - $values = $font->readUInt16Many($subtable["nPairs"] * 3); - for ($i = 0, $idx = 0; $i < $subtable["nPairs"]; $i++) { - $left = $values[$idx++]; - $right = $values[$idx++]; - $value = $values[$idx++]; - - if ($value >= 0x8000) { - $value -= 0x10000; - } - - $pairs[] = array( - "left" => $left, - "right" => $right, - "value" => $value, - ); - - $tree[$left][$right] = $value; - } - - //$subtable["pairs"] = $pairs; - $subtable["tree"] = $tree; - break; - - case 1: - case 2: - case 3: - break; - } - - $data["subtable"] = $subtable; - - $this->data = $data; - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/loca.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/loca.php deleted file mode 100644 index cbc2a20..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/loca.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; -use FontLib\Table\Table; - -/** - * `loca` font table. - * - * @package php-font-lib - */ -class loca extends Table { - protected function _parse() { - $font = $this->getFont(); - $offset = $font->pos(); - - $indexToLocFormat = $font->getData("head", "indexToLocFormat"); - $numGlyphs = $font->getData("maxp", "numGlyphs"); - - $font->seek($offset); - - $data = array(); - - // 2 bytes - if ($indexToLocFormat == 0) { - $d = $font->read(($numGlyphs + 1) * 2); - $loc = unpack("n*", $d); - - for ($i = 0; $i <= $numGlyphs; $i++) { - $data[] = isset($loc[$i + 1]) ? $loc[$i + 1] * 2 : 0; - } - } - - // 4 bytes - else { - if ($indexToLocFormat == 1) { - $d = $font->read(($numGlyphs + 1) * 4); - $loc = unpack("N*", $d); - - for ($i = 0; $i <= $numGlyphs; $i++) { - $data[] = isset($loc[$i + 1]) ? $loc[$i + 1] : 0; - } - } - } - - $this->data = $data; - } - - function _encode() { - $font = $this->getFont(); - $data = $this->data; - - $indexToLocFormat = $font->getData("head", "indexToLocFormat"); - $numGlyphs = $font->getData("maxp", "numGlyphs"); - $length = 0; - - // 2 bytes - if ($indexToLocFormat == 0) { - for ($i = 0; $i <= $numGlyphs; $i++) { - $length += $font->writeUInt16($data[$i] / 2); - } - } - - // 4 bytes - else { - if ($indexToLocFormat == 1) { - for ($i = 0; $i <= $numGlyphs; $i++) { - $length += $font->writeUInt32($data[$i]); - } - } - } - - return $length; - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/maxp.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/maxp.php deleted file mode 100644 index b4ebae0..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/maxp.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; -use FontLib\Table\Table; - -/** - * `maxp` font table. - * - * @package php-font-lib - */ -class maxp extends Table { - protected $def = array( - "version" => self::Fixed, - "numGlyphs" => self::uint16, - "maxPoints" => self::uint16, - "maxContours" => self::uint16, - "maxComponentPoints" => self::uint16, - "maxComponentContours" => self::uint16, - "maxZones" => self::uint16, - "maxTwilightPoints" => self::uint16, - "maxStorage" => self::uint16, - "maxFunctionDefs" => self::uint16, - "maxInstructionDefs" => self::uint16, - "maxStackElements" => self::uint16, - "maxSizeOfInstructions" => self::uint16, - "maxComponentElements" => self::uint16, - "maxComponentDepth" => self::uint16, - ); - - function _encode() { - $font = $this->getFont(); - $this->data["numGlyphs"] = count($font->getSubset()); - - return parent::_encode(); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/name.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/name.php deleted file mode 100644 index 794824d..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/name.php +++ /dev/null @@ -1,193 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; - -use FontLib\Table\Table; -use FontLib\Font; - -/** - * `name` font table. - * - * @package php-font-lib - */ -class name extends Table { - private static $header_format = array( - "format" => self::uint16, - "count" => self::uint16, - "stringOffset" => self::uint16, - ); - - const NAME_COPYRIGHT = 0; - const NAME_NAME = 1; - const NAME_SUBFAMILY = 2; - const NAME_SUBFAMILY_ID = 3; - const NAME_FULL_NAME = 4; - const NAME_VERSION = 5; - const NAME_POSTSCRIPT_NAME = 6; - const NAME_TRADEMARK = 7; - const NAME_MANUFACTURER = 8; - const NAME_DESIGNER = 9; - const NAME_DESCRIPTION = 10; - const NAME_VENDOR_URL = 11; - const NAME_DESIGNER_URL = 12; - const NAME_LICENSE = 13; - const NAME_LICENSE_URL = 14; - const NAME_PREFERRE_FAMILY = 16; - const NAME_PREFERRE_SUBFAMILY = 17; - const NAME_COMPAT_FULL_NAME = 18; - const NAME_SAMPLE_TEXT = 19; - - static $nameIdCodes = array( - 0 => "Copyright", - 1 => "FontName", - 2 => "FontSubfamily", - 3 => "UniqueID", - 4 => "FullName", - 5 => "Version", - 6 => "PostScriptName", - 7 => "Trademark", - 8 => "Manufacturer", - 9 => "Designer", - 10 => "Description", - 11 => "FontVendorURL", - 12 => "FontDesignerURL", - 13 => "LicenseDescription", - 14 => "LicenseURL", - // 15 - 16 => "PreferredFamily", - 17 => "PreferredSubfamily", - 18 => "CompatibleFullName", - 19 => "SampleText", - ); - - static $platforms = array( - 0 => "Unicode", - 1 => "Macintosh", - // 2 => Reserved - 3 => "Microsoft", - ); - - static $platformSpecific = array( - // Unicode - 0 => array( - 0 => "Default semantics", - 1 => "Version 1.1 semantics", - 2 => "ISO 10646 1993 semantics (deprecated)", - 3 => "Unicode 2.0 or later semantics", - ), - - // Macintosh - 1 => array( - 0 => "Roman", - 1 => "Japanese", - 2 => "Traditional Chinese", - 3 => "Korean", - 4 => "Arabic", - 5 => "Hebrew", - 6 => "Greek", - 7 => "Russian", - 8 => "RSymbol", - 9 => "Devanagari", - 10 => "Gurmukhi", - 11 => "Gujarati", - 12 => "Oriya", - 13 => "Bengali", - 14 => "Tamil", - 15 => "Telugu", - 16 => "Kannada", - 17 => "Malayalam", - 18 => "Sinhalese", - 19 => "Burmese", - 20 => "Khmer", - 21 => "Thai", - 22 => "Laotian", - 23 => "Georgian", - 24 => "Armenian", - 25 => "Simplified Chinese", - 26 => "Tibetan", - 27 => "Mongolian", - 28 => "Geez", - 29 => "Slavic", - 30 => "Vietnamese", - 31 => "Sindhi", - ), - - // Microsoft - 3 => array( - 0 => "Symbol", - 1 => "Unicode BMP (UCS-2)", - 2 => "ShiftJIS", - 3 => "PRC", - 4 => "Big5", - 5 => "Wansung", - 6 => "Johab", - // 7 => Reserved - // 8 => Reserved - // 9 => Reserved - 10 => "Unicode UCS-4", - ), - ); - - protected function _parse() { - $font = $this->getFont(); - - $tableOffset = $font->pos(); - - $data = $font->unpack(self::$header_format); - - $records = array(); - for ($i = 0; $i < $data["count"]; $i++) { - $record = new nameRecord(); - $record_data = $font->unpack(nameRecord::$format); - $record->map($record_data); - - $records[] = $record; - } - - $names = array(); - foreach ($records as $record) { - $font->seek($tableOffset + $data["stringOffset"] + $record->offset); - $s = $font->read($record->length); - $record->string = Font::UTF16ToUTF8($s); - $names[$record->nameID] = $record; - } - - $data["records"] = $names; - - $this->data = $data; - } - - protected function _encode() { - $font = $this->getFont(); - - /** @var nameRecord[] $records */ - $records = $this->data["records"]; - $count_records = count($records); - - $this->data["count"] = $count_records; - $this->data["stringOffset"] = 6 + $count_records * 12; // 6 => uint16 * 3, 12 => sizeof self::$record_format - - $length = $font->pack(self::$header_format, $this->data); - - $offset = 0; - foreach ($records as $record) { - $record->length = mb_strlen($record->getUTF16(), "8bit"); - $record->offset = $offset; - $offset += $record->length; - $length += $font->pack(nameRecord::$format, (array)$record); - } - - foreach ($records as $record) { - $str = $record->getUTF16(); - $length += $font->write($str, mb_strlen($str, "8bit")); - } - - return $length; - } -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/nameRecord.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/nameRecord.php deleted file mode 100644 index 2073c20..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/nameRecord.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ -namespace FontLib\Table\Type; - -use FontLib\Font; -use FontLib\BinaryStream; - -/** - * Font table name record. - * - * @package php-font-lib - */ -class nameRecord extends BinaryStream { - public $platformID; - public $platformSpecificID; - public $languageID; - public $nameID; - public $length; - public $offset; - public $string; - - public static $format = array( - "platformID" => self::uint16, - "platformSpecificID" => self::uint16, - "languageID" => self::uint16, - "nameID" => self::uint16, - "length" => self::uint16, - "offset" => self::uint16, - ); - - public function map($data) { - foreach ($data as $key => $value) { - $this->$key = $value; - } - } - - public function getUTF8() { - return $this->string; - } - - public function getUTF16() { - return Font::UTF8ToUTF16($this->string); - } - - function __toString() { - return $this->string; - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/os2.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/os2.php deleted file mode 100644 index 19a3e21..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/os2.php +++ /dev/null @@ -1,47 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; -use FontLib\Table\Table; - -/** - * `OS/2` font table. - * - * @package php-font-lib - */ -class os2 extends Table { - protected $def = array( - "version" => self::uint16, - "xAvgCharWidth" => self::int16, - "usWeightClass" => self::uint16, - "usWidthClass" => self::uint16, - "fsType" => self::int16, - "ySubscriptXSize" => self::int16, - "ySubscriptYSize" => self::int16, - "ySubscriptXOffset" => self::int16, - "ySubscriptYOffset" => self::int16, - "ySuperscriptXSize" => self::int16, - "ySuperscriptYSize" => self::int16, - "ySuperscriptXOffset" => self::int16, - "ySuperscriptYOffset" => self::int16, - "yStrikeoutSize" => self::int16, - "yStrikeoutPosition" => self::int16, - "sFamilyClass" => self::int16, - "panose" => array(self::uint8, 10), - "ulCharRange" => array(self::uint32, 4), - "achVendID" => array(self::char, 4), - "fsSelection" => self::uint16, - "fsFirstCharIndex" => self::uint16, - "fsLastCharIndex" => self::uint16, - "typoAscender" => self::int16, - "typoDescender" => self::int16, - "typoLineGap" => self::int16, - "winAscent" => self::int16, - "winDescent" => self::int16, - ); -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/post.php b/vendor/phenx/php-font-lib/src/FontLib/Table/Type/post.php deleted file mode 100644 index ec5806b..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/Table/Type/post.php +++ /dev/null @@ -1,141 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\Table\Type; -use FontLib\Table\Table; -use FontLib\TrueType\File; - -/** - * `post` font table. - * - * @package php-font-lib - */ -class post extends Table { - protected $def = array( - "format" => self::Fixed, - "italicAngle" => self::Fixed, - "underlinePosition" => self::FWord, - "underlineThickness" => self::FWord, - "isFixedPitch" => self::uint32, - "minMemType42" => self::uint32, - "maxMemType42" => self::uint32, - "minMemType1" => self::uint32, - "maxMemType1" => self::uint32, - ); - - protected function _parse() { - $font = $this->getFont(); - $data = $font->unpack($this->def); - - $names = array(); - - switch ($data["format"]) { - case 1: - $names = File::$macCharNames; - break; - - case 2: - $data["numberOfGlyphs"] = $font->readUInt16(); - - $glyphNameIndex = $font->readUInt16Many($data["numberOfGlyphs"]); - - $data["glyphNameIndex"] = $glyphNameIndex; - - $namesPascal = array(); - for ($i = 0; $i < $data["numberOfGlyphs"]; $i++) { - $len = $font->readUInt8(); - $namesPascal[] = $font->read($len); - } - - foreach ($glyphNameIndex as $g => $index) { - if ($index < 258) { - $names[$g] = File::$macCharNames[$index]; - } - else { - $names[$g] = $namesPascal[$index - 258]; - } - } - - break; - - case 2.5: - // TODO - break; - - case 3: - // nothing - break; - - case 4: - // TODO - break; - } - - $data["names"] = $names; - - $this->data = $data; - } - - function _encode() { - $font = $this->getFont(); - $data = $this->data; - $data["format"] = 3; - - $length = $font->pack($this->def, $data); - - return $length; - /* - $subset = $font->getSubset(); - - switch($data["format"]) { - case 1: - // nothing to do - break; - - case 2: - $old_names = $data["names"]; - - $glyphNameIndex = range(0, count($subset)); - - $names = array(); - foreach($subset as $gid) { - $names[] = $data["names"][$data["glyphNameIndex"][$gid]]; - } - - $numberOfGlyphs = count($names); - $length += $font->writeUInt16($numberOfGlyphs); - - foreach($glyphNameIndex as $gni) { - $length += $font->writeUInt16($gni); - } - - //$names = array_slice($names, 257); - foreach($names as $name) { - $len = strlen($name); - $length += $font->writeUInt8($len); - $length += $font->write($name, $len); - } - - break; - - case 2.5: - // TODO - break; - - case 3: - // nothing - break; - - case 4: - // TODO - break; - } - - return $length;*/ - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/TrueType/Collection.php b/vendor/phenx/php-font-lib/src/FontLib/TrueType/Collection.php deleted file mode 100644 index 460ef4d..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/TrueType/Collection.php +++ /dev/null @@ -1,100 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\TrueType; - -use Countable; -use FontLib\BinaryStream; -use Iterator; -use OutOfBoundsException; - -/** - * TrueType collection font file. - * - * @package php-font-lib - */ -class Collection extends BinaryStream implements Iterator, Countable { - /** - * Current iterator position. - * - * @var integer - */ - private $position = 0; - - protected $collectionOffsets = array(); - protected $collection = array(); - protected $version; - protected $numFonts; - - function parse() { - if (isset($this->numFonts)) { - return; - } - - $this->read(4); // tag name - - $this->version = $this->readFixed(); - $this->numFonts = $this->readUInt32(); - - for ($i = 0; $i < $this->numFonts; $i++) { - $this->collectionOffsets[] = $this->readUInt32(); - } - } - - /** - * @param int $fontId - * - * @throws OutOfBoundsException - * @return File - */ - function getFont($fontId) { - $this->parse(); - - if (!isset($this->collectionOffsets[$fontId])) { - throw new OutOfBoundsException(); - } - - if (isset($this->collection[$fontId])) { - return $this->collection[$fontId]; - } - - $font = new File(); - $font->f = $this->f; - $font->setTableOffset($this->collectionOffsets[$fontId]); - - return $this->collection[$fontId] = $font; - } - - function current() { - return $this->getFont($this->position); - } - - function key() { - return $this->position; - } - - function next() { - return ++$this->position; - } - - function rewind() { - $this->position = 0; - } - - function valid() { - $this->parse(); - - return isset($this->collectionOffsets[$this->position]); - } - - function count() { - $this->parse(); - - return $this->numFonts; - } -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/TrueType/File.php b/vendor/phenx/php-font-lib/src/FontLib/TrueType/File.php deleted file mode 100644 index b61da0f..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/TrueType/File.php +++ /dev/null @@ -1,471 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\TrueType; - -use FontLib\AdobeFontMetrics; -use FontLib\Font; -use FontLib\BinaryStream; -use FontLib\Table\Table; -use FontLib\Table\DirectoryEntry; -use FontLib\Table\Type\glyf; -use FontLib\Table\Type\name; -use FontLib\Table\Type\nameRecord; - -/** - * TrueType font file. - * - * @package php-font-lib - */ -class File extends BinaryStream { - /** - * @var Header - */ - public $header = array(); - - private $tableOffset = 0; // Used for TTC - - private static $raw = false; - - protected $directory = array(); - protected $data = array(); - - protected $glyph_subset = array(); - - public $glyph_all = array(); - - static $macCharNames = array( - ".notdef", ".null", "CR", - "space", "exclam", "quotedbl", "numbersign", - "dollar", "percent", "ampersand", "quotesingle", - "parenleft", "parenright", "asterisk", "plus", - "comma", "hyphen", "period", "slash", - "zero", "one", "two", "three", - "four", "five", "six", "seven", - "eight", "nine", "colon", "semicolon", - "less", "equal", "greater", "question", - "at", "A", "B", "C", "D", "E", "F", "G", - "H", "I", "J", "K", "L", "M", "N", "O", - "P", "Q", "R", "S", "T", "U", "V", "W", - "X", "Y", "Z", "bracketleft", - "backslash", "bracketright", "asciicircum", "underscore", - "grave", "a", "b", "c", "d", "e", "f", "g", - "h", "i", "j", "k", "l", "m", "n", "o", - "p", "q", "r", "s", "t", "u", "v", "w", - "x", "y", "z", "braceleft", - "bar", "braceright", "asciitilde", "Adieresis", - "Aring", "Ccedilla", "Eacute", "Ntilde", - "Odieresis", "Udieresis", "aacute", "agrave", - "acircumflex", "adieresis", "atilde", "aring", - "ccedilla", "eacute", "egrave", "ecircumflex", - "edieresis", "iacute", "igrave", "icircumflex", - "idieresis", "ntilde", "oacute", "ograve", - "ocircumflex", "odieresis", "otilde", "uacute", - "ugrave", "ucircumflex", "udieresis", "dagger", - "degree", "cent", "sterling", "section", - "bullet", "paragraph", "germandbls", "registered", - "copyright", "trademark", "acute", "dieresis", - "notequal", "AE", "Oslash", "infinity", - "plusminus", "lessequal", "greaterequal", "yen", - "mu", "partialdiff", "summation", "product", - "pi", "integral", "ordfeminine", "ordmasculine", - "Omega", "ae", "oslash", "questiondown", - "exclamdown", "logicalnot", "radical", "florin", - "approxequal", "increment", "guillemotleft", "guillemotright", - "ellipsis", "nbspace", "Agrave", "Atilde", - "Otilde", "OE", "oe", "endash", - "emdash", "quotedblleft", "quotedblright", "quoteleft", - "quoteright", "divide", "lozenge", "ydieresis", - "Ydieresis", "fraction", "currency", "guilsinglleft", - "guilsinglright", "fi", "fl", "daggerdbl", - "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", - "Acircumflex", "Ecircumflex", "Aacute", "Edieresis", - "Egrave", "Iacute", "Icircumflex", "Idieresis", - "Igrave", "Oacute", "Ocircumflex", "applelogo", - "Ograve", "Uacute", "Ucircumflex", "Ugrave", - "dotlessi", "circumflex", "tilde", "macron", - "breve", "dotaccent", "ring", "cedilla", - "hungarumlaut", "ogonek", "caron", "Lslash", - "lslash", "Scaron", "scaron", "Zcaron", - "zcaron", "brokenbar", "Eth", "eth", - "Yacute", "yacute", "Thorn", "thorn", - "minus", "multiply", "onesuperior", "twosuperior", - "threesuperior", "onehalf", "onequarter", "threequarters", - "franc", "Gbreve", "gbreve", "Idot", - "Scedilla", "scedilla", "Cacute", "cacute", - "Ccaron", "ccaron", "dmacron" - ); - - function getTable() { - $this->parseTableEntries(); - - return $this->directory; - } - - function setTableOffset($offset) { - $this->tableOffset = $offset; - } - - function parse() { - $this->parseTableEntries(); - - $this->data = array(); - - foreach ($this->directory as $tag => $table) { - if (empty($this->data[$tag])) { - $this->readTable($tag); - } - } - } - - function utf8toUnicode($str) { - $len = strlen($str); - $out = array(); - - for ($i = 0; $i < $len; $i++) { - $uni = -1; - $h = ord($str[$i]); - - if ($h <= 0x7F) { - $uni = $h; - } - elseif ($h >= 0xC2) { - if (($h <= 0xDF) && ($i < $len - 1)) { - $uni = ($h & 0x1F) << 6 | (ord($str[++$i]) & 0x3F); - } - elseif (($h <= 0xEF) && ($i < $len - 2)) { - $uni = ($h & 0x0F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); - } - elseif (($h <= 0xF4) && ($i < $len - 3)) { - $uni = ($h & 0x0F) << 18 | (ord($str[++$i]) & 0x3F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); - } - } - - if ($uni >= 0) { - $out[] = $uni; - } - } - - return $out; - } - - function getUnicodeCharMap() { - $subtable = null; - foreach ($this->getData("cmap", "subtables") as $_subtable) { - if ($_subtable["platformID"] == 0 || $_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1) { - $subtable = $_subtable; - break; - } - } - - if ($subtable) { - return $subtable["glyphIndexArray"]; - } - - return null; - } - - function setSubset($subset) { - if (!is_array($subset)) { - $subset = $this->utf8toUnicode($subset); - } - - $subset = array_unique($subset); - - $glyphIndexArray = $this->getUnicodeCharMap(); - - if (!$glyphIndexArray) { - return; - } - - $gids = array( - 0, // .notdef - 1, // .null - ); - - foreach ($subset as $code) { - if (!isset($glyphIndexArray[$code])) { - continue; - } - - $gid = $glyphIndexArray[$code]; - $gids[$gid] = $gid; - } - - /** @var glyf $glyf */ - $glyf = $this->getTableObject("glyf"); - $gids = $glyf->getGlyphIDs($gids); - - sort($gids); - - $this->glyph_subset = $gids; - $this->glyph_all = array_values($glyphIndexArray); // FIXME - } - - function getSubset() { - if (empty($this->glyph_subset)) { - return $this->glyph_all; - } - - return $this->glyph_subset; - } - - function encode($tags = array()) { - if (!self::$raw) { - $tags = array_merge(array("head", "hhea", "cmap", "hmtx", "maxp", "glyf", "loca", "name", "post"), $tags); - } - else { - $tags = array_keys($this->directory); - } - - $num_tables = count($tags); - $n = 16; // @todo - - Font::d("Tables : " . implode(", ", $tags)); - - /** @var DirectoryEntry[] $entries */ - $entries = array(); - foreach ($tags as $tag) { - if (!isset($this->directory[$tag])) { - Font::d(" >> '$tag' table doesn't exist"); - continue; - } - - $entries[$tag] = $this->directory[$tag]; - } - - $this->header->data["numTables"] = $num_tables; - $this->header->encode(); - - $directory_offset = $this->pos(); - $offset = $directory_offset + $num_tables * $n; - $this->seek($offset); - - $i = 0; - foreach ($entries as $entry) { - $entry->encode($directory_offset + $i * $n); - $i++; - } - } - - function parseHeader() { - if (!empty($this->header)) { - return; - } - - $this->seek($this->tableOffset); - - $this->header = new Header($this); - $this->header->parse(); - } - - function getFontType(){ - $class_parts = explode("\\", get_class($this)); - return $class_parts[1]; - } - - function parseTableEntries() { - $this->parseHeader(); - - if (!empty($this->directory)) { - return; - } - - if (empty($this->header->data["numTables"])) { - return; - } - - - $type = $this->getFontType(); - $class = "FontLib\\$type\\TableDirectoryEntry"; - - for ($i = 0; $i < $this->header->data["numTables"]; $i++) { - /** @var TableDirectoryEntry $entry */ - $entry = new $class($this); - $entry->parse(); - - $this->directory[$entry->tag] = $entry; - } - } - - function normalizeFUnit($value, $base = 1000) { - return round($value * ($base / $this->getData("head", "unitsPerEm"))); - } - - protected function readTable($tag) { - $this->parseTableEntries(); - - if (!self::$raw) { - $name_canon = preg_replace("/[^a-z0-9]/", "", strtolower($tag)); - - $class = "FontLib\\Table\\Type\\$name_canon"; - - if (!isset($this->directory[$tag]) || !@class_exists($class)) { - return; - } - } - else { - $class = "FontLib\\Table\\Table"; - } - - /** @var Table $table */ - $table = new $class($this->directory[$tag]); - $table->parse(); - - $this->data[$tag] = $table; - } - - /** - * @param $name - * - * @return Table - */ - public function getTableObject($name) { - return $this->data[$name]; - } - - public function setTableObject($name, Table $data) { - $this->data[$name] = $data; - } - - public function getData($name, $key = null) { - $this->parseTableEntries(); - - if (empty($this->data[$name])) { - $this->readTable($name); - } - - if (!isset($this->data[$name])) { - return null; - } - - if (!$key) { - return $this->data[$name]->data; - } - else { - return $this->data[$name]->data[$key]; - } - } - - function addDirectoryEntry(DirectoryEntry $entry) { - $this->directory[$entry->tag] = $entry; - } - - function saveAdobeFontMetrics($file, $encoding = null) { - $afm = new AdobeFontMetrics($this); - $afm->write($file, $encoding); - } - - /** - * Get a specific name table string value from its ID - * - * @param int $nameID The name ID - * - * @return string|null - */ - function getNameTableString($nameID) { - /** @var nameRecord[] $records */ - $records = $this->getData("name", "records"); - - if (!isset($records[$nameID])) { - return null; - } - - return $records[$nameID]->string; - } - - /** - * Get font copyright - * - * @return string|null - */ - function getFontCopyright() { - return $this->getNameTableString(name::NAME_COPYRIGHT); - } - - /** - * Get font name - * - * @return string|null - */ - function getFontName() { - return $this->getNameTableString(name::NAME_NAME); - } - - /** - * Get font subfamily - * - * @return string|null - */ - function getFontSubfamily() { - return $this->getNameTableString(name::NAME_SUBFAMILY); - } - - /** - * Get font subfamily ID - * - * @return string|null - */ - function getFontSubfamilyID() { - return $this->getNameTableString(name::NAME_SUBFAMILY_ID); - } - - /** - * Get font full name - * - * @return string|null - */ - function getFontFullName() { - return $this->getNameTableString(name::NAME_FULL_NAME); - } - - /** - * Get font version - * - * @return string|null - */ - function getFontVersion() { - return $this->getNameTableString(name::NAME_VERSION); - } - - /** - * Get font weight - * - * @return string|null - */ - function getFontWeight() { - return $this->getTableObject("OS/2")->data["usWeightClass"]; - } - - /** - * Get font Postscript name - * - * @return string|null - */ - function getFontPostscriptName() { - return $this->getNameTableString(name::NAME_POSTSCRIPT_NAME); - } - - function reduce() { - $names_to_keep = array( - name::NAME_COPYRIGHT, - name::NAME_NAME, - name::NAME_SUBFAMILY, - name::NAME_SUBFAMILY_ID, - name::NAME_FULL_NAME, - name::NAME_VERSION, - name::NAME_POSTSCRIPT_NAME, - ); - - foreach ($this->data["name"]->data["records"] as $id => $rec) { - if (!in_array($id, $names_to_keep)) { - unset($this->data["name"]->data["records"][$id]); - } - } - } -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/TrueType/Header.php b/vendor/phenx/php-font-lib/src/FontLib/TrueType/Header.php deleted file mode 100644 index 7ff79cc..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/TrueType/Header.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\TrueType; - -/** - * TrueType font file header. - * - * @package php-font-lib - */ -class Header extends \FontLib\Header { - protected $def = array( - "format" => self::uint32, - "numTables" => self::uint16, - "searchRange" => self::uint16, - "entrySelector" => self::uint16, - "rangeShift" => self::uint16, - ); - - public function parse() { - parent::parse(); - - $format = $this->data["format"]; - $this->data["formatText"] = $this->convertUInt32ToStr($format); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php b/vendor/phenx/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php deleted file mode 100644 index fc4fe55..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\TrueType; - -use FontLib\Table\DirectoryEntry; - -/** - * TrueType table directory entry. - * - * @package php-font-lib - */ -class TableDirectoryEntry extends DirectoryEntry { - function __construct(File $font) { - parent::__construct($font); - } - - function parse() { - parent::parse(); - - $font = $this->font; - $this->checksum = $font->readUInt32(); - $this->offset = $font->readUInt32(); - $this->length = $font->readUInt32(); - $this->entryLength += 12; - } -} - diff --git a/vendor/phenx/php-font-lib/src/FontLib/WOFF/File.php b/vendor/phenx/php-font-lib/src/FontLib/WOFF/File.php deleted file mode 100644 index 9e54b3f..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/WOFF/File.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\WOFF; - -use FontLib\Table\DirectoryEntry; - -/** - * WOFF font file. - * - * @package php-font-lib - * - * @property TableDirectoryEntry[] $directory - */ -class File extends \FontLib\TrueType\File { - function parseHeader() { - if (!empty($this->header)) { - return; - } - - $this->header = new Header($this); - $this->header->parse(); - } - - public function load($file) { - parent::load($file); - - $this->parseTableEntries(); - $dataOffset = $this->pos() + count($this->directory) * 20; - - $fw = $this->getTempFile(false); - $fr = $this->f; - - $this->f = $fw; - $offset = $this->header->encode(); - - foreach ($this->directory as $entry) { - // Read ... - $this->f = $fr; - $this->seek($entry->offset); - $data = $this->read($entry->length); - - if ($entry->length < $entry->origLength) { - $data = gzuncompress($data); - } - - // Prepare data ... - $length = strlen($data); - $entry->length = $entry->origLength = $length; - $entry->offset = $dataOffset; - - // Write ... - $this->f = $fw; - - // Woff Entry - $this->seek($offset); - $offset += $this->write($entry->tag, 4); // tag - $offset += $this->writeUInt32($dataOffset); // offset - $offset += $this->writeUInt32($length); // length - $offset += $this->writeUInt32($length); // origLength - $offset += $this->writeUInt32(DirectoryEntry::computeChecksum($data)); // checksum - - // Data - $this->seek($dataOffset); - $dataOffset += $this->write($data, $length); - } - - $this->f = $fw; - $this->seek(0); - - // Need to re-parse this, don't know why - $this->header = null; - $this->directory = array(); - $this->parseTableEntries(); - } -} diff --git a/vendor/phenx/php-font-lib/src/FontLib/WOFF/Header.php b/vendor/phenx/php-font-lib/src/FontLib/WOFF/Header.php deleted file mode 100644 index 65a6f14..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/WOFF/Header.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\WOFF; - -/** - * WOFF font file header. - * - * @package php-font-lib - */ -class Header extends \FontLib\TrueType\Header { - protected $def = array( - "format" => self::uint32, - "flavor" => self::uint32, - "length" => self::uint32, - "numTables" => self::uint16, - self::uint16, - "totalSfntSize" => self::uint32, - "majorVersion" => self::uint16, - "minorVersion" => self::uint16, - "metaOffset" => self::uint32, - "metaLength" => self::uint32, - "metaOrigLength" => self::uint32, - "privOffset" => self::uint32, - "privLength" => self::uint32, - ); -} \ No newline at end of file diff --git a/vendor/phenx/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php b/vendor/phenx/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php deleted file mode 100644 index eb67c9c..0000000 --- a/vendor/phenx/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - */ - -namespace FontLib\WOFF; - -use FontLib\Table\DirectoryEntry; - -/** - * WOFF font file table directory entry. - * - * @package php-font-lib - */ -class TableDirectoryEntry extends DirectoryEntry { - public $origLength; - - function __construct(File $font) { - parent::__construct($font); - } - - function parse() { - parent::parse(); - - $font = $this->font; - $this->offset = $font->readUInt32(); - $this->length = $font->readUInt32(); - $this->origLength = $font->readUInt32(); - $this->checksum = $font->readUInt32(); - } -} diff --git a/vendor/phenx/php-font-lib/tests/FontLib/FontTest.php b/vendor/phenx/php-font-lib/tests/FontLib/FontTest.php deleted file mode 100644 index b998a49..0000000 --- a/vendor/phenx/php-font-lib/tests/FontLib/FontTest.php +++ /dev/null @@ -1,49 +0,0 @@ -assertInstanceOf('FontLib\TrueType\File', $trueTypeFont); - } - - public function test12CmapFormat() - { - $trueTypeFont = Font::load('sample-fonts/NotoSansShavian-Regular.ttf'); - - $trueTypeFont->parse(); - - $cmapTable = $trueTypeFont->getData("cmap", "subtables"); - - $cmapFormat4Table = $cmapTable[0]; - - $this->assertEquals(4, $cmapFormat4Table['format']); - $this->assertEquals(6, $cmapFormat4Table['segCount']); - $this->assertEquals($cmapFormat4Table['segCount'], count($cmapFormat4Table['startCode'])); - $this->assertEquals($cmapFormat4Table['segCount'], count($cmapFormat4Table['endCode'])); - - $cmapFormat12Table = $cmapTable[1]; - - $this->assertEquals(12, $cmapFormat12Table['format']); - $this->assertEquals(6, $cmapFormat12Table['ngroups']); - $this->assertEquals(6, count($cmapFormat12Table['startCode'])); - $this->assertEquals(6, count($cmapFormat12Table['endCode'])); - $this->assertEquals(53, count($cmapFormat12Table['glyphIndexArray'])); - } - -} diff --git a/vendor/phenx/php-svg-lib/.gitattributes b/vendor/phenx/php-svg-lib/.gitattributes deleted file mode 100644 index 86d3b92..0000000 --- a/vendor/phenx/php-svg-lib/.gitattributes +++ /dev/null @@ -1,9 +0,0 @@ -*.json text -*.xml text -*.php text -*.md text -*.css text -*.js text -*.html text -*.htm text -*.svg text diff --git a/vendor/phenx/php-svg-lib/.gitignore b/vendor/phenx/php-svg-lib/.gitignore deleted file mode 100644 index 7181efd..0000000 --- a/vendor/phenx/php-svg-lib/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -excluded -gui -.idea \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/.travis.yml b/vendor/phenx/php-svg-lib/.travis.yml deleted file mode 100644 index fe318f9..0000000 --- a/vendor/phenx/php-svg-lib/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -language: php - -php: - - 5.6 - - 7.0 - - 7.1 - - 7.2 - - nightly - -before_script: - - composer self-update - - composer install --prefer-source --no-interaction --dev - -script: phpunit - -matrix: - allow_failures: - - php: 5.6 - - php: nightly - fast_finish: true diff --git a/vendor/phenx/php-svg-lib/COPYING b/vendor/phenx/php-svg-lib/COPYING deleted file mode 100644 index 0a04128..0000000 --- a/vendor/phenx/php-svg-lib/COPYING +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/phenx/php-svg-lib/COPYING.GPL b/vendor/phenx/php-svg-lib/COPYING.GPL deleted file mode 100644 index f288702..0000000 --- a/vendor/phenx/php-svg-lib/COPYING.GPL +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/vendor/phenx/php-svg-lib/README.md b/vendor/phenx/php-svg-lib/README.md deleted file mode 100644 index f11cde9..0000000 --- a/vendor/phenx/php-svg-lib/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# SVG file parsing / rendering library - -[![Build Status](https://travis-ci.org/PhenX/php-svg-lib.svg?branch=master)](https://travis-ci.org/PhenX/php-svg-lib) -[![Coverage Status](https://coveralls.io/repos/PhenX/php-svg-lib/badge.svg)](https://coveralls.io/r/PhenX/php-svg-lib) - - -[![Latest Stable Version](https://poser.pugx.org/phenx/php-svg-lib/v/stable)](https://packagist.org/packages/phenx/php-svg-lib) -[![Total Downloads](https://poser.pugx.org/phenx/php-svg-lib/downloads)](https://packagist.org/packages/phenx/php-svg-lib) -[![Latest Unstable Version](https://poser.pugx.org/phenx/php-svg-lib/v/unstable)](https://packagist.org/packages/phenx/php-svg-lib) -[![License](https://poser.pugx.org/phenx/php-svg-lib/license)](https://packagist.org/packages/phenx/php-svg-lib) - -The main purpose of this lib is to rasterize SVG to a surface which can be an image or a PDF for example, through a `\Svg\Surface` PHP interface. - -This project was initialized by the need to render SVG documents inside PDF files for the [DomPdf](http://dompdf.github.io) project. \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/composer.json b/vendor/phenx/php-svg-lib/composer.json deleted file mode 100644 index 3a57553..0000000 --- a/vendor/phenx/php-svg-lib/composer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "phenx/php-svg-lib", - "type": "library", - "description": "A library to read, parse and export to PDF SVG files.", - "homepage": "https://github.com/PhenX/php-svg-lib", - "license": "LGPL-3.0", - "authors": [ - { - "name": "Fabien MĆ©nager", - "email": "fabien.menager@gmail.com" - } - ], - "autoload": { - "psr-4": { - "Svg\\": "src/Svg" - } - }, - "autoload-dev": { - "psr-4": { - "Svg\\Tests\\": "tests/Svg" - } - }, - "require": { - "sabberworm/php-css-parser": "^8.3" - }, - "require-dev": { - "phpunit/phpunit": "^5.5|^6.5" - } -} diff --git a/vendor/phenx/php-svg-lib/phpunit.xml b/vendor/phenx/php-svg-lib/phpunit.xml deleted file mode 100644 index 9559d96..0000000 --- a/vendor/phenx/php-svg-lib/phpunit.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - ./tests/Svg/ - - - \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/DefaultStyle.php b/vendor/phenx/php-svg-lib/src/Svg/DefaultStyle.php deleted file mode 100644 index c0535c7..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/DefaultStyle.php +++ /dev/null @@ -1,29 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg; - -class DefaultStyle extends Style -{ - public $color = ''; - public $opacity = 1.0; - public $display = 'inline'; - - public $fill = 'black'; - public $fillOpacity = 1.0; - public $fillRule = 'nonzero'; - - public $stroke = 'none'; - public $strokeOpacity = 1.0; - public $strokeLinecap = 'butt'; - public $strokeLinejoin = 'miter'; - public $strokeMiterlimit = 4; - public $strokeWidth = 1.0; - public $strokeDasharray = 0; - public $strokeDashoffset = 0; -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Document.php b/vendor/phenx/php-svg-lib/src/Svg/Document.php deleted file mode 100644 index 4ecdc76..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Document.php +++ /dev/null @@ -1,404 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg; - -use Svg\Surface\SurfaceInterface; -use Svg\Tag\AbstractTag; -use Svg\Tag\Anchor; -use Svg\Tag\Circle; -use Svg\Tag\Ellipse; -use Svg\Tag\Group; -use Svg\Tag\ClipPath; -use Svg\Tag\Image; -use Svg\Tag\Line; -use Svg\Tag\LinearGradient; -use Svg\Tag\Path; -use Svg\Tag\Polygon; -use Svg\Tag\Polyline; -use Svg\Tag\Rect; -use Svg\Tag\Stop; -use Svg\Tag\Text; -use Svg\Tag\StyleTag; -use Svg\Tag\UseTag; - -class Document extends AbstractTag -{ - protected $filename; - public $inDefs = false; - - protected $x; - protected $y; - protected $width; - protected $height; - - protected $subPathInit; - protected $pathBBox; - protected $viewBox; - - /** @var resource */ - protected $parser; - - /** @var SurfaceInterface */ - protected $surface; - - /** @var AbstractTag[] */ - protected $stack = array(); - - /** @var AbstractTag[] */ - protected $defs = array(); - - /** @var \Sabberworm\CSS\CSSList\Document[] */ - protected $styleSheets = array(); - - public function loadFile($filename) - { - $this->filename = $filename; - } - - protected function initParser() { - $parser = xml_parser_create("utf-8"); - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); - xml_set_element_handler( - $parser, - array($this, "_tagStart"), - array($this, "_tagEnd") - ); - xml_set_character_data_handler( - $parser, - array($this, "_charData") - ); - - return $this->parser = $parser; - } - - public function __construct() { - - } - - /** - * @return SurfaceInterface - */ - public function getSurface() - { - return $this->surface; - } - - public function getStack() - { - return $this->stack; - } - - public function getWidth() - { - return $this->width; - } - - public function getHeight() - { - return $this->height; - } - - public function getDimensions() { - $rootAttributes = null; - - $parser = xml_parser_create("utf-8"); - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); - xml_set_element_handler( - $parser, - function ($parser, $name, $attributes) use (&$rootAttributes) { - if ($name === "svg" && $rootAttributes === null) { - $attributes = array_change_key_case($attributes, CASE_LOWER); - - $rootAttributes = $attributes; - } - }, - function ($parser, $name) {} - ); - - $fp = fopen($this->filename, "r"); - while ($line = fread($fp, 8192)) { - xml_parse($parser, $line, false); - - if ($rootAttributes !== null) { - break; - } - } - - xml_parser_free($parser); - - return $this->handleSizeAttributes($rootAttributes); - } - - public function handleSizeAttributes($attributes){ - if ($this->width === null) { - if (isset($attributes["width"])) { - $width = Style::convertSize($attributes["width"], 400); - $this->width = $width; - } - - if (isset($attributes["height"])) { - $height = Style::convertSize($attributes["height"], 300); - $this->height = $height; - } - - if (isset($attributes['viewbox'])) { - $viewBox = preg_split('/[\s,]+/is', trim($attributes['viewbox'])); - if (count($viewBox) == 4) { - $this->x = $viewBox[0]; - $this->y = $viewBox[1]; - - if (!$this->width) { - $this->width = $viewBox[2]; - } - if (!$this->height) { - $this->height = $viewBox[3]; - } - } - } - } - - return array( - 0 => $this->width, - 1 => $this->height, - - "width" => $this->width, - "height" => $this->height, - ); - } - - public function getDocument(){ - return $this; - } - - /** - * Append a style sheet - * - * @param \Sabberworm\CSS\CSSList\Document $stylesheet - */ - public function appendStyleSheet($stylesheet) { - $this->styleSheets[] = $stylesheet; - } - - /** - * Get the document style sheets - * - * @return \Sabberworm\CSS\CSSList\Document[] - */ - public function getStyleSheets() { - return $this->styleSheets; - } - - protected function before($attributes) - { - $surface = $this->getSurface(); - - $style = new DefaultStyle(); - $style->inherit($this); - $style->fromAttributes($attributes); - - $this->setStyle($style); - - $surface->setStyle($style); - } - - public function render(SurfaceInterface $surface) - { - $this->inDefs = false; - $this->surface = $surface; - - $parser = $this->initParser(); - - if ($this->x || $this->y) { - $surface->translate(-$this->x, -$this->y); - } - - $fp = fopen($this->filename, "r"); - while ($line = fread($fp, 8192)) { - xml_parse($parser, $line, false); - } - - xml_parse($parser, "", true); - - xml_parser_free($parser); - } - - protected function svgOffset($attributes) - { - $this->attributes = $attributes; - - $this->handleSizeAttributes($attributes); - } - - public function getDef($id) { - $id = ltrim($id, "#"); - - return isset($this->defs[$id]) ? $this->defs[$id] : null; - } - - private function _tagStart($parser, $name, $attributes) - { - $this->x = 0; - $this->y = 0; - - $tag = null; - - $attributes = array_change_key_case($attributes, CASE_LOWER); - - switch (strtolower($name)) { - case 'defs': - $this->inDefs = true; - return; - - case 'svg': - if (count($this->attributes)) { - $tag = new Group($this, $name); - } - else { - $tag = $this; - $this->svgOffset($attributes); - } - break; - - case 'path': - $tag = new Path($this, $name); - break; - - case 'rect': - $tag = new Rect($this, $name); - break; - - case 'circle': - $tag = new Circle($this, $name); - break; - - case 'ellipse': - $tag = new Ellipse($this, $name); - break; - - case 'image': - $tag = new Image($this, $name); - break; - - case 'line': - $tag = new Line($this, $name); - break; - - case 'polyline': - $tag = new Polyline($this, $name); - break; - - case 'polygon': - $tag = new Polygon($this, $name); - break; - - case 'lineargradient': - $tag = new LinearGradient($this, $name); - break; - - case 'radialgradient': - $tag = new LinearGradient($this, $name); - break; - - case 'stop': - $tag = new Stop($this, $name); - break; - - case 'style': - $tag = new StyleTag($this, $name); - break; - - case 'a': - $tag = new Anchor($this, $name); - break; - - case 'g': - case 'symbol': - $tag = new Group($this, $name); - break; - - case 'clippath': - $tag = new ClipPath($this, $name); - break; - - case 'use': - $tag = new UseTag($this, $name); - break; - - case 'text': - $tag = new Text($this, $name); - break; - - case 'desc': - return; - } - - if ($tag) { - if (isset($attributes["id"])) { - $this->defs[$attributes["id"]] = $tag; - } - else { - /** @var AbstractTag $top */ - $top = end($this->stack); - if ($top && $top != $tag) { - $top->children[] = $tag; - } - } - - $this->stack[] = $tag; - - $tag->handle($attributes); - } - } - - function _charData($parser, $data) - { - $stack_top = end($this->stack); - - if ($stack_top instanceof Text || $stack_top instanceof StyleTag) { - $stack_top->appendText($data); - } - } - - function _tagEnd($parser, $name) - { - /** @var AbstractTag $tag */ - $tag = null; - switch (strtolower($name)) { - case 'defs': - $this->inDefs = false; - return; - - case 'svg': - case 'path': - case 'rect': - case 'circle': - case 'ellipse': - case 'image': - case 'line': - case 'polyline': - case 'polygon': - case 'radialgradient': - case 'lineargradient': - case 'stop': - case 'style': - case 'text': - case 'g': - case 'symbol': - case 'clippath': - case 'use': - case 'a': - $tag = array_pop($this->stack); - break; - } - - if (!$this->inDefs && $tag) { - $tag->handleEnd(); - } - } -} diff --git a/vendor/phenx/php-svg-lib/src/Svg/Gradient/Stop.php b/vendor/phenx/php-svg-lib/src/Svg/Gradient/Stop.php deleted file mode 100644 index 14a36bd..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Gradient/Stop.php +++ /dev/null @@ -1,16 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Gradient; - -class Stop -{ - public $offset; - public $color; - public $opacity = 1.0; -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Style.php b/vendor/phenx/php-svg-lib/src/Svg/Style.php deleted file mode 100644 index a007872..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Style.php +++ /dev/null @@ -1,550 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg; - -use Svg\Tag\AbstractTag; - -class Style -{ - const TYPE_COLOR = 1; - const TYPE_LENGTH = 2; - const TYPE_NAME = 3; - const TYPE_ANGLE = 4; - const TYPE_NUMBER = 5; - - public $color; - public $opacity; - public $display; - - public $fill; - public $fillOpacity; - public $fillRule; - - public $stroke; - public $strokeOpacity; - public $strokeLinecap; - public $strokeLinejoin; - public $strokeMiterlimit; - public $strokeWidth; - public $strokeDasharray; - public $strokeDashoffset; - - public $fontFamily = 'serif'; - public $fontSize = 12; - public $fontWeight = 'normal'; - public $fontStyle = 'normal'; - public $textAnchor = 'start'; - - protected function getStyleMap() - { - return array( - 'color' => array('color', self::TYPE_COLOR), - 'opacity' => array('opacity', self::TYPE_NUMBER), - 'display' => array('display', self::TYPE_NAME), - - 'fill' => array('fill', self::TYPE_COLOR), - 'fill-opacity' => array('fillOpacity', self::TYPE_NUMBER), - 'fill-rule' => array('fillRule', self::TYPE_NAME), - - 'stroke' => array('stroke', self::TYPE_COLOR), - 'stroke-dasharray' => array('strokeDasharray', self::TYPE_NAME), - 'stroke-dashoffset' => array('strokeDashoffset', self::TYPE_NUMBER), - 'stroke-linecap' => array('strokeLinecap', self::TYPE_NAME), - 'stroke-linejoin' => array('strokeLinejoin', self::TYPE_NAME), - 'stroke-miterlimit' => array('strokeMiterlimit', self::TYPE_NUMBER), - 'stroke-opacity' => array('strokeOpacity', self::TYPE_NUMBER), - 'stroke-width' => array('strokeWidth', self::TYPE_NUMBER), - - 'font-family' => array('fontFamily', self::TYPE_NAME), - 'font-size' => array('fontSize', self::TYPE_NUMBER), - 'font-weight' => array('fontWeight', self::TYPE_NAME), - 'font-style' => array('fontStyle', self::TYPE_NAME), - 'text-anchor' => array('textAnchor', self::TYPE_NAME), - ); - } - - /** - * @param $attributes - * - * @return Style - */ - public function fromAttributes($attributes) - { - $this->fillStyles($attributes); - - if (isset($attributes["style"])) { - $styles = self::parseCssStyle($attributes["style"]); - $this->fillStyles($styles); - } - } - - public function inherit(AbstractTag $tag) { - $group = $tag->getParentGroup(); - if ($group) { - $parent_style = $group->getStyle(); - - foreach ($parent_style as $_key => $_value) { - if ($_value !== null) { - $this->$_key = $_value; - } - } - } - } - - public function fromStyleSheets(AbstractTag $tag, $attributes) { - $class = isset($attributes["class"]) ? preg_split('/\s+/', trim($attributes["class"])) : null; - - $stylesheets = $tag->getDocument()->getStyleSheets(); - - $styles = array(); - - foreach ($stylesheets as $_sc) { - - /** @var \Sabberworm\CSS\RuleSet\DeclarationBlock $_decl */ - foreach ($_sc->getAllDeclarationBlocks() as $_decl) { - - /** @var \Sabberworm\CSS\Property\Selector $_selector */ - foreach ($_decl->getSelectors() as $_selector) { - $_selector = $_selector->getSelector(); - - // Match class name - if ($class !== null) { - foreach ($class as $_class) { - if ($_selector === ".$_class") { - /** @var \Sabberworm\CSS\Rule\Rule $_rule */ - foreach ($_decl->getRules() as $_rule) { - $styles[$_rule->getRule()] = $_rule->getValue() . ""; - } - - break 2; - } - } - } - - // Match tag name - if ($_selector === $tag->tagName) { - /** @var \Sabberworm\CSS\Rule\Rule $_rule */ - foreach ($_decl->getRules() as $_rule) { - $styles[$_rule->getRule()] = $_rule->getValue() . ""; - } - - break; - } - } - } - } - - $this->fillStyles($styles); - } - - protected function fillStyles($styles) - { - foreach ($this->getStyleMap() as $from => $spec) { - if (isset($styles[$from])) { - list($to, $type) = $spec; - $value = null; - switch ($type) { - case self::TYPE_COLOR: - $value = self::parseColor($styles[$from]); - break; - - case self::TYPE_NUMBER: - $value = ($styles[$from] === null) ? null : (float)$styles[$from]; - break; - - default: - $value = $styles[$from]; - } - - if ($value !== null) { - $this->$to = $value; - } - } - } - } - - static function parseColor($color) - { - $color = strtolower(trim($color)); - - $parts = preg_split('/[^,]\s+/', $color, 2); - - if (count($parts) == 2) { - $color = $parts[1]; - } - else { - $color = $parts[0]; - } - - if ($color === "none") { - return "none"; - } - - // SVG color name - if (isset(self::$colorNames[$color])) { - return self::parseHexColor(self::$colorNames[$color]); - } - - // Hex color - if ($color[0] === "#") { - return self::parseHexColor($color); - } - - // RGB color - if (strpos($color, "rgb") !== false) { - return self::getTriplet($color); - } - - // RGB color - if (strpos($color, "hsl") !== false) { - $triplet = self::getTriplet($color, true); - - if ($triplet == null) { - return null; - } - - list($h, $s, $l) = $triplet; - - $r = $l; - $g = $l; - $b = $l; - $v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s); - if ($v > 0) { - $m = $l + $l - $v; - $sv = ($v - $m) / $v; - $h *= 6.0; - $sextant = floor($h); - $fract = $h - $sextant; - $vsf = $v * $sv * $fract; - $mid1 = $m + $vsf; - $mid2 = $v - $vsf; - - switch ($sextant) { - case 0: - $r = $v; - $g = $mid1; - $b = $m; - break; - case 1: - $r = $mid2; - $g = $v; - $b = $m; - break; - case 2: - $r = $m; - $g = $v; - $b = $mid1; - break; - case 3: - $r = $m; - $g = $mid2; - $b = $v; - break; - case 4: - $r = $mid1; - $g = $m; - $b = $v; - break; - case 5: - $r = $v; - $g = $m; - $b = $mid2; - break; - } - } - - return array( - $r * 255.0, - $g * 255.0, - $b * 255.0, - ); - } - - // Gradient - if (strpos($color, "url(#") !== false) { - $i = strpos($color, "("); - $j = strpos($color, ")"); - - // Bad url format - if ($i === false || $j === false) { - return null; - } - - return trim(substr($color, $i + 1, $j - $i - 1)); - } - - return null; - } - - static function getTriplet($color, $percent = false) { - $i = strpos($color, "("); - $j = strpos($color, ")"); - - // Bad color value - if ($i === false || $j === false) { - return null; - } - - $triplet = preg_split("/\\s*,\\s*/", trim(substr($color, $i + 1, $j - $i - 1))); - - if (count($triplet) != 3) { - return null; - } - - foreach (array_keys($triplet) as $c) { - $triplet[$c] = trim($triplet[$c]); - - if ($percent) { - if ($triplet[$c][strlen($triplet[$c]) - 1] === "%") { - $triplet[$c] = floatval($triplet[$c]) / 100; - } - else { - $triplet[$c] = $triplet[$c] / 255; - } - } - else { - if ($triplet[$c][strlen($triplet[$c]) - 1] === "%") { - $triplet[$c] = round(floatval($triplet[$c]) * 2.55); - } - } - } - - return $triplet; - } - - static function parseHexColor($hex) - { - $c = array(0, 0, 0); - - // #FFFFFF - if (isset($hex[6])) { - $c[0] = hexdec(substr($hex, 1, 2)); - $c[1] = hexdec(substr($hex, 3, 2)); - $c[2] = hexdec(substr($hex, 5, 2)); - } else { - $c[0] = hexdec($hex[1] . $hex[1]); - $c[1] = hexdec($hex[2] . $hex[2]); - $c[2] = hexdec($hex[3] . $hex[3]); - } - - return $c; - } - - /** - * Simple CSS parser - * - * @param $style - * - * @return array - */ - static function parseCssStyle($style) - { - $matches = array(); - preg_match_all("/([a-z-]+)\\s*:\\s*([^;$]+)/si", $style, $matches, PREG_SET_ORDER); - - $styles = array(); - foreach ($matches as $match) { - $styles[$match[1]] = $match[2]; - } - - return $styles; - } - - /** - * Convert a size to a float - * - * @param string $size SVG size - * @param float $dpi DPI - * @param float $referenceSize Reference size - * - * @return float|null - */ - static function convertSize($size, $referenceSize = 11.0, $dpi = 96.0) { - $size = trim(strtolower($size)); - - if (is_numeric($size)) { - return $size; - } - - if ($pos = strpos($size, "px")) { - return floatval(substr($size, 0, $pos)); - } - - if ($pos = strpos($size, "pt")) { - return floatval(substr($size, 0, $pos)); - } - - if ($pos = strpos($size, "cm")) { - return floatval(substr($size, 0, $pos)) * $dpi; - } - - if ($pos = strpos($size, "%")) { - return $referenceSize * substr($size, 0, $pos) / 100; - } - - if ($pos = strpos($size, "em")) { - return $referenceSize * substr($size, 0, $pos); - } - - // TODO cm, mm, pc, in, etc - - return null; - } - - static $colorNames = array( - 'antiquewhite' => '#FAEBD7', - 'aqua' => '#00FFFF', - 'aquamarine' => '#7FFFD4', - 'beige' => '#F5F5DC', - 'black' => '#000000', - 'blue' => '#0000FF', - 'brown' => '#A52A2A', - 'cadetblue' => '#5F9EA0', - 'chocolate' => '#D2691E', - 'cornflowerblue' => '#6495ED', - 'crimson' => '#DC143C', - 'darkblue' => '#00008B', - 'darkgoldenrod' => '#B8860B', - 'darkgreen' => '#006400', - 'darkmagenta' => '#8B008B', - 'darkorange' => '#FF8C00', - 'darkred' => '#8B0000', - 'darkseagreen' => '#8FBC8F', - 'darkslategray' => '#2F4F4F', - 'darkviolet' => '#9400D3', - 'deepskyblue' => '#00BFFF', - 'dodgerblue' => '#1E90FF', - 'firebrick' => '#B22222', - 'forestgreen' => '#228B22', - 'fuchsia' => '#FF00FF', - 'gainsboro' => '#DCDCDC', - 'gold' => '#FFD700', - 'gray' => '#808080', - 'green' => '#008000', - 'greenyellow' => '#ADFF2F', - 'hotpink' => '#FF69B4', - 'indigo' => '#4B0082', - 'khaki' => '#F0E68C', - 'lavenderblush' => '#FFF0F5', - 'lemonchiffon' => '#FFFACD', - 'lightcoral' => '#F08080', - 'lightgoldenrodyellow' => '#FAFAD2', - 'lightgreen' => '#90EE90', - 'lightsalmon' => '#FFA07A', - 'lightskyblue' => '#87CEFA', - 'lightslategray' => '#778899', - 'lightyellow' => '#FFFFE0', - 'lime' => '#00FF00', - 'limegreen' => '#32CD32', - 'magenta' => '#FF00FF', - 'maroon' => '#800000', - 'mediumaquamarine' => '#66CDAA', - 'mediumorchid' => '#BA55D3', - 'mediumseagreen' => '#3CB371', - 'mediumspringgreen' => '#00FA9A', - 'mediumvioletred' => '#C71585', - 'midnightblue' => '#191970', - 'mintcream' => '#F5FFFA', - 'moccasin' => '#FFE4B5', - 'navy' => '#000080', - 'olive' => '#808000', - 'orange' => '#FFA500', - 'orchid' => '#DA70D6', - 'palegreen' => '#98FB98', - 'palevioletred' => '#D87093', - 'peachpuff' => '#FFDAB9', - 'pink' => '#FFC0CB', - 'powderblue' => '#B0E0E6', - 'purple' => '#800080', - 'red' => '#FF0000', - 'royalblue' => '#4169E1', - 'salmon' => '#FA8072', - 'seagreen' => '#2E8B57', - 'sienna' => '#A0522D', - 'silver' => '#C0C0C0', - 'skyblue' => '#87CEEB', - 'slategray' => '#708090', - 'springgreen' => '#00FF7F', - 'steelblue' => '#4682B4', - 'tan' => '#D2B48C', - 'teal' => '#008080', - 'thistle' => '#D8BFD8', - 'turquoise' => '#40E0D0', - 'violetred' => '#D02090', - 'white' => '#FFFFFF', - 'yellow' => '#FFFF00', - 'aliceblue' => '#f0f8ff', - 'azure' => '#f0ffff', - 'bisque' => '#ffe4c4', - 'blanchedalmond' => '#ffebcd', - 'blueviolet' => '#8a2be2', - 'burlywood' => '#deb887', - 'chartreuse' => '#7fff00', - 'coral' => '#ff7f50', - 'cornsilk' => '#fff8dc', - 'cyan' => '#00ffff', - 'darkcyan' => '#008b8b', - 'darkgray' => '#a9a9a9', - 'darkgrey' => '#a9a9a9', - 'darkkhaki' => '#bdb76b', - 'darkolivegreen' => '#556b2f', - 'darkorchid' => '#9932cc', - 'darksalmon' => '#e9967a', - 'darkslateblue' => '#483d8b', - 'darkslategrey' => '#2f4f4f', - 'darkturquoise' => '#00ced1', - 'deeppink' => '#ff1493', - 'dimgray' => '#696969', - 'dimgrey' => '#696969', - 'floralwhite' => '#fffaf0', - 'ghostwhite' => '#f8f8ff', - 'goldenrod' => '#daa520', - 'grey' => '#808080', - 'honeydew' => '#f0fff0', - 'indianred' => '#cd5c5c', - 'ivory' => '#fffff0', - 'lavender' => '#e6e6fa', - 'lawngreen' => '#7cfc00', - 'lightblue' => '#add8e6', - 'lightcyan' => '#e0ffff', - 'lightgray' => '#d3d3d3', - 'lightgrey' => '#d3d3d3', - 'lightpink' => '#ffb6c1', - 'lightseagreen' => '#20b2aa', - 'lightslategrey' => '#778899', - 'lightsteelblue' => '#b0c4de', - 'linen' => '#faf0e6', - 'mediumblue' => '#0000cd', - 'mediumpurple' => '#9370db', - 'mediumslateblue' => '#7b68ee', - 'mediumturquoise' => '#48d1cc', - 'mistyrose' => '#ffe4e1', - 'navajowhite' => '#ffdead', - 'oldlace' => '#fdf5e6', - 'olivedrab' => '#6b8e23', - 'orangered' => '#ff4500', - 'palegoldenrod' => '#eee8aa', - 'paleturquoise' => '#afeeee', - 'papayawhip' => '#ffefd5', - 'peru' => '#cd853f', - 'plum' => '#dda0dd', - 'rosybrown' => '#bc8f8f', - 'saddlebrown' => '#8b4513', - 'sandybrown' => '#f4a460', - 'seashell' => '#fff5ee', - 'slateblue' => '#6a5acd', - 'slategrey' => '#708090', - 'snow' => '#fffafa', - 'tomato' => '#ff6347', - 'violet' => '#ee82ee', - 'wheat' => '#f5deb3', - 'whitesmoke' => '#f5f5f5', - 'yellowgreen' => '#9acd32', - ); -} diff --git a/vendor/phenx/php-svg-lib/src/Svg/Surface/CPdf.php b/vendor/phenx/php-svg-lib/src/Svg/Surface/CPdf.php deleted file mode 100644 index 2dce8f3..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Surface/CPdf.php +++ /dev/null @@ -1,4768 +0,0 @@ - - * @author Orion Richardson - * @author Helmut Tischer - * @author Ryan H. Masten - * @author Brian Sweeney - * @author Fabien MĆ©nager - * @license Public Domain http://creativecommons.org/licenses/publicdomain/ - * @package Cpdf - */ - -namespace Svg\Surface; - -class CPdf -{ - - /** - * @var integer The current number of pdf objects in the document - */ - public $numObj = 0; - - /** - * @var array This array contains all of the pdf objects, ready for final assembly - */ - public $objects = array(); - - /** - * @var integer The objectId (number within the objects array) of the document catalog - */ - public $catalogId; - - /** - * @var array Array carrying information about the fonts that the system currently knows about - * Used to ensure that a font is not loaded twice, among other things - */ - public $fonts = array(); - - /** - * @var string The default font metrics file to use if no other font has been loaded. - * The path to the directory containing the font metrics should be included - */ - public $defaultFont = './fonts/Helvetica.afm'; - - /** - * @string A record of the current font - */ - public $currentFont = ''; - - /** - * @var string The current base font - */ - public $currentBaseFont = ''; - - /** - * @var integer The number of the current font within the font array - */ - public $currentFontNum = 0; - - /** - * @var integer - */ - public $currentNode; - - /** - * @var integer Object number of the current page - */ - public $currentPage; - - /** - * @var integer Object number of the currently active contents block - */ - public $currentContents; - - /** - * @var integer Number of fonts within the system - */ - public $numFonts = 0; - - /** - * @var integer Number of graphic state resources used - */ - private $numStates = 0; - - /** - * @var array Current color for fill operations, defaults to inactive value, - * all three components should be between 0 and 1 inclusive when active - */ - public $currentColor = null; - - /** - * @var string Fill rule (nonzero or evenodd) - */ - public $fillRule = "nonzero"; - - /** - * @var array Current color for stroke operations (lines etc.) - */ - public $currentStrokeColor = null; - - /** - * @var string Current style that lines are drawn in - */ - public $currentLineStyle = ''; - - /** - * @var array Current line transparency (partial graphics state) - */ - public $currentLineTransparency = array("mode" => "Normal", "opacity" => 1.0); - - /** - * array Current fill transparency (partial graphics state) - */ - public $currentFillTransparency = array("mode" => "Normal", "opacity" => 1.0); - - /** - * @var array An array which is used to save the state of the document, mainly the colors and styles - * it is used to temporarily change to another state, the change back to what it was before - */ - public $stateStack = array(); - - /** - * @var integer Number of elements within the state stack - */ - public $nStateStack = 0; - - /** - * @var integer Number of page objects within the document - */ - public $numPages = 0; - - /** - * @var array Object Id storage stack - */ - public $stack = array(); - - /** - * @var integer Number of elements within the object Id storage stack - */ - public $nStack = 0; - - /** - * an array which contains information about the objects which are not firmly attached to pages - * these have been added with the addObject function - */ - public $looseObjects = array(); - - /** - * array contains infomation about how the loose objects are to be added to the document - */ - public $addLooseObjects = array(); - - /** - * @var integer The objectId of the information object for the document - * this contains authorship, title etc. - */ - public $infoObject = 0; - - /** - * @var integer Number of images being tracked within the document - */ - public $numImages = 0; - - /** - * @var array An array containing options about the document - * it defaults to turning on the compression of the objects - */ - public $options = array('compression' => true); - - /** - * @var integer The objectId of the first page of the document - */ - public $firstPageId; - - /** - * @var float Used to track the last used value of the inter-word spacing, this is so that it is known - * when the spacing is changed. - */ - public $wordSpaceAdjust = 0; - - /** - * @var float Used to track the last used value of the inter-letter spacing, this is so that it is known - * when the spacing is changed. - */ - public $charSpaceAdjust = 0; - - /** - * @var integer The object Id of the procset object - */ - public $procsetObjectId; - - /** - * @var array Store the information about the relationship between font families - * this used so that the code knows which font is the bold version of another font, etc. - * the value of this array is initialised in the constuctor function. - */ - public $fontFamilies = array(); - - /** - * @var string Folder for php serialized formats of font metrics files. - * If empty string, use same folder as original metrics files. - * This can be passed in from class creator. - * If this folder does not exist or is not writable, Cpdf will be **much** slower. - * Because of potential trouble with php safe mode, folder cannot be created at runtime. - */ - public $fontcache = ''; - - /** - * @var integer The version of the font metrics cache file. - * This value must be manually incremented whenever the internal font data structure is modified. - */ - public $fontcacheVersion = 6; - - /** - * @var string Temporary folder. - * If empty string, will attempty system tmp folder. - * This can be passed in from class creator. - * Only used for conversion of gd images to jpeg images. - */ - public $tmp = ''; - - /** - * @var string Track if the current font is bolded or italicised - */ - public $currentTextState = ''; - - /** - * @var string Messages are stored here during processing, these can be selected afterwards to give some useful debug information - */ - public $messages = ''; - - /** - * @var string The ancryption array for the document encryption is stored here - */ - public $arc4 = ''; - - /** - * @var integer The object Id of the encryption information - */ - public $arc4_objnum = 0; - - /** - * @var string The file identifier, used to uniquely identify a pdf document - */ - public $fileIdentifier = ''; - - /** - * @var boolean A flag to say if a document is to be encrypted or not - */ - public $encrypted = false; - - /** - * @var string The encryption key for the encryption of all the document content (structure is not encrypted) - */ - public $encryptionKey = ''; - - /** - * @var array Array which forms a stack to keep track of nested callback functions - */ - public $callback = array(); - - /** - * @var integer The number of callback functions in the callback array - */ - public $nCallback = 0; - - /** - * @var array Store label->id pairs for named destinations, these will be used to replace internal links - * done this way so that destinations can be defined after the location that links to them - */ - public $destinations = array(); - - /** - * @var array Store the stack for the transaction commands, each item in here is a record of the values of all the - * publiciables within the class, so that the user can rollback at will (from each 'start' command) - * note that this includes the objects array, so these can be large. - */ - public $checkpoint = ''; - - /** - * @var array Table of Image origin filenames and image labels which were already added with o_image(). - * Allows to merge identical images - */ - public $imagelist = array(); - - /** - * @var boolean Whether the text passed in should be treated as Unicode or just local character set. - */ - public $isUnicode = false; - - /** - * @var string the JavaScript code of the document - */ - public $javascript = ''; - - /** - * @var boolean whether the compression is possible - */ - protected $compressionReady = false; - - /** - * @var array Current page size - */ - protected $currentPageSize = array("width" => 0, "height" => 0); - - /** - * @var array All the chars that will be required in the font subsets - */ - protected $stringSubsets = array(); - - /** - * @var string The target internal encoding - */ - static protected $targetEncoding = 'iso-8859-1'; - - /** - * @var array The list of the core fonts - */ - static protected $coreFonts = array( - 'courier', - 'courier-bold', - 'courier-oblique', - 'courier-boldoblique', - 'helvetica', - 'helvetica-bold', - 'helvetica-oblique', - 'helvetica-boldoblique', - 'times-roman', - 'times-bold', - 'times-italic', - 'times-bolditalic', - 'symbol', - 'zapfdingbats' - ); - - /** - * Class constructor - * This will start a new document - * - * @param array $pageSize Array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero. - * @param boolean $isUnicode Whether text will be treated as Unicode or not. - * @param string $fontcache The font cache folder - * @param string $tmp The temporary folder - */ - function __construct($pageSize = array(0, 0, 612, 792), $isUnicode = false, $fontcache = '', $tmp = '') - { - $this->isUnicode = $isUnicode; - $this->fontcache = $fontcache; - $this->tmp = $tmp; - $this->newDocument($pageSize); - - $this->compressionReady = function_exists('gzcompress'); - - if (in_array('Windows-1252', mb_list_encodings())) { - self::$targetEncoding = 'Windows-1252'; - } - - // also initialize the font families that are known about already - $this->setFontFamily('init'); - // $this->fileIdentifier = md5('xxxxxxxx'.time()); - } - - /** - * Document object methods (internal use only) - * - * There is about one object method for each type of object in the pdf document - * Each function has the same call list ($id,$action,$options). - * $id = the object ID of the object, or what it is to be if it is being created - * $action = a string specifying the action to be performed, though ALL must support: - * 'new' - create the object with the id $id - * 'out' - produce the output for the pdf object - * $options = optional, a string or array containing the various parameters for the object - * - * These, in conjunction with the output function are the ONLY way for output to be produced - * within the pdf 'file'. - */ - - /** - * Destination object, used to specify the location for the user to jump to, presently on opening - */ - protected function o_destination($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array('t' => 'destination', 'info' => array()); - $tmp = ''; - switch ($options['type']) { - case 'XYZ': - case 'FitR': - $tmp = ' ' . $options['p3'] . $tmp; - case 'FitH': - case 'FitV': - case 'FitBH': - case 'FitBV': - $tmp = ' ' . $options['p1'] . ' ' . $options['p2'] . $tmp; - case 'Fit': - case 'FitB': - $tmp = $options['type'] . $tmp; - $this->objects[$id]['info']['string'] = $tmp; - $this->objects[$id]['info']['page'] = $options['page']; - } - break; - - case 'out': - $tmp = $o['info']; - $res = "\n$id 0 obj\n" . '[' . $tmp['page'] . ' 0 R /' . $tmp['string'] . "]\nendobj"; - - return $res; - } - } - - /** - * set the viewer preferences - */ - protected function o_viewerPreferences($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array('t' => 'viewerPreferences', 'info' => array()); - break; - - case 'add': - foreach ($options as $k => $v) { - switch ($k) { - case 'HideToolbar': - case 'HideMenubar': - case 'HideWindowUI': - case 'FitWindow': - case 'CenterWindow': - case 'NonFullScreenPageMode': - case 'Direction': - $o['info'][$k] = $v; - break; - } - } - break; - - case 'out': - $res = "\n$id 0 obj\n<< "; - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - $res .= "\n>>\n"; - - return $res; - } - } - - /** - * define the document catalog, the overall controller for the document - */ - protected function o_catalog($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array('t' => 'catalog', 'info' => array()); - $this->catalogId = $id; - break; - - case 'outlines': - case 'pages': - case 'openHere': - case 'javascript': - $o['info'][$action] = $options; - break; - - case 'viewerPreferences': - if (!isset($o['info']['viewerPreferences'])) { - $this->numObj++; - $this->o_viewerPreferences($this->numObj, 'new'); - $o['info']['viewerPreferences'] = $this->numObj; - } - - $vp = $o['info']['viewerPreferences']; - $this->o_viewerPreferences($vp, 'add', $options); - - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Catalog"; - - foreach ($o['info'] as $k => $v) { - switch ($k) { - case 'outlines': - $res .= "\n/Outlines $v 0 R"; - break; - - case 'pages': - $res .= "\n/Pages $v 0 R"; - break; - - case 'viewerPreferences': - $res .= "\n/ViewerPreferences $v 0 R"; - break; - - case 'openHere': - $res .= "\n/OpenAction $v 0 R"; - break; - - case 'javascript': - $res .= "\n/Names <>"; - break; - } - } - - $res .= " >>\nendobj"; - - return $res; - } - } - - /** - * object which is a parent to the pages in the document - */ - protected function o_pages($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array('t' => 'pages', 'info' => array()); - $this->o_catalog($this->catalogId, 'pages', $id); - break; - - case 'page': - if (!is_array($options)) { - // then it will just be the id of the new page - $o['info']['pages'][] = $options; - } else { - // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative - // and pos is either 'before' or 'after', saying where this page will fit. - if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) { - $i = array_search($options['rid'], $o['info']['pages']); - if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) { - - // then there is a match - // make a space - switch ($options['pos']) { - case 'before': - $k = $i; - break; - - case 'after': - $k = $i + 1; - break; - - default: - $k = -1; - break; - } - - if ($k >= 0) { - for ($j = count($o['info']['pages']) - 1; $j >= $k; $j--) { - $o['info']['pages'][$j + 1] = $o['info']['pages'][$j]; - } - - $o['info']['pages'][$k] = $options['id']; - } - } - } - } - break; - - case 'procset': - $o['info']['procset'] = $options; - break; - - case 'mediaBox': - $o['info']['mediaBox'] = $options; - // which should be an array of 4 numbers - $this->currentPageSize = array('width' => $options[2], 'height' => $options[3]); - break; - - case 'font': - $o['info']['fonts'][] = array('objNum' => $options['objNum'], 'fontNum' => $options['fontNum']); - break; - - case 'extGState': - $o['info']['extGStates'][] = array('objNum' => $options['objNum'], 'stateNum' => $options['stateNum']); - break; - - case 'xObject': - $o['info']['xObjects'][] = array('objNum' => $options['objNum'], 'label' => $options['label']); - break; - - case 'out': - if (count($o['info']['pages'])) { - $res = "\n$id 0 obj\n<< /Type /Pages\n/Kids ["; - foreach ($o['info']['pages'] as $v) { - $res .= "$v 0 R\n"; - } - - $res .= "]\n/Count " . count($this->objects[$id]['info']['pages']); - - if ((isset($o['info']['fonts']) && count($o['info']['fonts'])) || - isset($o['info']['procset']) || - (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) - ) { - $res .= "\n/Resources <<"; - - if (isset($o['info']['procset'])) { - $res .= "\n/ProcSet " . $o['info']['procset'] . " 0 R"; - } - - if (isset($o['info']['fonts']) && count($o['info']['fonts'])) { - $res .= "\n/Font << "; - foreach ($o['info']['fonts'] as $finfo) { - $res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - - if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) { - $res .= "\n/XObject << "; - foreach ($o['info']['xObjects'] as $finfo) { - $res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - - if (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) { - $res .= "\n/ExtGState << "; - foreach ($o['info']['extGStates'] as $gstate) { - $res .= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R"; - } - $res .= "\n>>"; - } - - $res .= "\n>>"; - if (isset($o['info']['mediaBox'])) { - $tmp = $o['info']['mediaBox']; - $res .= "\n/MediaBox [" . sprintf( - '%.3F %.3F %.3F %.3F', - $tmp[0], - $tmp[1], - $tmp[2], - $tmp[3] - ) . ']'; - } - } - - $res .= "\n >>\nendobj"; - } else { - $res = "\n$id 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj"; - } - - return $res; - } - } - - /** - * define the outlines in the doc, empty for now - */ - protected function o_outlines($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array('t' => 'outlines', 'info' => array('outlines' => array())); - $this->o_catalog($this->catalogId, 'outlines', $id); - break; - - case 'outline': - $o['info']['outlines'][] = $options; - break; - - case 'out': - if (count($o['info']['outlines'])) { - $res = "\n$id 0 obj\n<< /Type /Outlines /Kids ["; - foreach ($o['info']['outlines'] as $v) { - $res .= "$v 0 R "; - } - - $res .= "] /Count " . count($o['info']['outlines']) . " >>\nendobj"; - } else { - $res = "\n$id 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj"; - } - - return $res; - } - } - - /** - * an object to hold the font description - */ - protected function o_font($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array( - 't' => 'font', - 'info' => array( - 'name' => $options['name'], - 'fontFileName' => $options['fontFileName'], - 'SubType' => 'Type1' - ) - ); - $fontNum = $this->numFonts; - $this->objects[$id]['info']['fontNum'] = $fontNum; - - // deal with the encoding and the differences - if (isset($options['differences'])) { - // then we'll need an encoding dictionary - $this->numObj++; - $this->o_fontEncoding($this->numObj, 'new', $options); - $this->objects[$id]['info']['encodingDictionary'] = $this->numObj; - } else { - if (isset($options['encoding'])) { - // we can specify encoding here - switch ($options['encoding']) { - case 'WinAnsiEncoding': - case 'MacRomanEncoding': - case 'MacExpertEncoding': - $this->objects[$id]['info']['encoding'] = $options['encoding']; - break; - - case 'none': - break; - - default: - $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; - break; - } - } else { - $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; - } - } - - if ($this->fonts[$options['fontFileName']]['isUnicode']) { - // For Unicode fonts, we need to incorporate font data into - // sub-sections that are linked from the primary font section. - // Look at o_fontGIDtoCID and o_fontDescendentCID functions - // for more informaiton. - // - // All of this code is adapted from the excellent changes made to - // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) - - $toUnicodeId = ++$this->numObj; - $this->o_contents($toUnicodeId, 'new', 'raw'); - $this->objects[$id]['info']['toUnicode'] = $toUnicodeId; - - $stream = <<> def -/CMapName /Adobe-Identity-UCS def -/CMapType 2 def -1 begincodespacerange -<0000> -endcodespacerange -1 beginbfrange -<0000> <0000> -endbfrange -endcmap -CMapName currentdict /CMap defineresource pop -end -end -EOT; - - $res = "<>\n"; - $res .= "stream\n" . $stream . "endstream"; - - $this->objects[$toUnicodeId]['c'] = $res; - - $cidFontId = ++$this->numObj; - $this->o_fontDescendentCID($cidFontId, 'new', $options); - $this->objects[$id]['info']['cidFont'] = $cidFontId; - } - - // also tell the pages node about the new font - $this->o_pages($this->currentNode, 'font', array('fontNum' => $fontNum, 'objNum' => $id)); - break; - - case 'add': - foreach ($options as $k => $v) { - switch ($k) { - case 'BaseFont': - $o['info']['name'] = $v; - break; - case 'FirstChar': - case 'LastChar': - case 'Widths': - case 'FontDescriptor': - case 'SubType': - $this->addMessage('o_font ' . $k . " : " . $v); - $o['info'][$k] = $v; - break; - } - } - - // pass values down to descendent font - if (isset($o['info']['cidFont'])) { - $this->o_fontDescendentCID($o['info']['cidFont'], 'add', $options); - } - break; - - case 'out': - if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) { - // For Unicode fonts, we need to incorporate font data into - // sub-sections that are linked from the primary font section. - // Look at o_fontGIDtoCID and o_fontDescendentCID functions - // for more informaiton. - // - // All of this code is adapted from the excellent changes made to - // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) - - $res = "\n$id 0 obj\n<objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array('t' => 'fontDescriptor', 'info' => $options); - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /FontDescriptor\n"; - foreach ($o['info'] as $label => $value) { - switch ($label) { - case 'Ascent': - case 'CapHeight': - case 'Descent': - case 'Flags': - case 'ItalicAngle': - case 'StemV': - case 'AvgWidth': - case 'Leading': - case 'MaxWidth': - case 'MissingWidth': - case 'StemH': - case 'XHeight': - case 'CharSet': - if (mb_strlen($value, '8bit')) { - $res .= "/$label $value\n"; - } - - break; - case 'FontFile': - case 'FontFile2': - case 'FontFile3': - $res .= "/$label $value 0 R\n"; - break; - - case 'FontBBox': - $res .= "/$label [$value[0] $value[1] $value[2] $value[3]]\n"; - break; - - case 'FontName': - $res .= "/$label /$value\n"; - break; - } - } - - $res .= ">>\nendobj"; - - return $res; - } - } - - /** - * the font encoding - */ - protected function o_fontEncoding($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - // the options array should contain 'differences' and maybe 'encoding' - $this->objects[$id] = array('t' => 'fontEncoding', 'info' => $options); - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Encoding\n"; - if (!isset($o['info']['encoding'])) { - $o['info']['encoding'] = 'WinAnsiEncoding'; - } - - if ($o['info']['encoding'] !== 'none') { - $res .= "/BaseEncoding /" . $o['info']['encoding'] . "\n"; - } - - $res .= "/Differences \n["; - - $onum = -100; - - foreach ($o['info']['differences'] as $num => $label) { - if ($num != $onum + 1) { - // we cannot make use of consecutive numbering - $res .= "\n$num /$label"; - } else { - $res .= " /$label"; - } - - $onum = $num; - } - - $res .= "\n]\n>>\nendobj"; - - return $res; - } - } - - /** - * a descendent cid font, needed for unicode fonts - */ - protected function o_fontDescendentCID($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array('t' => 'fontDescendentCID', 'info' => $options); - - // we need a CID system info section - $cidSystemInfoId = ++$this->numObj; - $this->o_contents($cidSystemInfoId, 'new', 'raw'); - $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId; - $res = "<objects[$cidSystemInfoId]['c'] = $res; - - // and a CID to GID map - $cidToGidMapId = ++$this->numObj; - $this->o_fontGIDtoCIDMap($cidToGidMapId, 'new', $options); - $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId; - break; - - case 'add': - foreach ($options as $k => $v) { - switch ($k) { - case 'BaseFont': - $o['info']['name'] = $v; - break; - - case 'FirstChar': - case 'LastChar': - case 'MissingWidth': - case 'FontDescriptor': - case 'SubType': - $this->addMessage("o_fontDescendentCID $k : $v"); - $o['info'][$k] = $v; - break; - } - } - - // pass values down to cid to gid map - $this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options); - break; - - case 'out': - $res = "\n$id 0 obj\n"; - $res .= "<fonts[$o['info']['fontFileName']]['CIDWidths'])) { - $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths']; - $w = ''; - foreach ($cid_widths as $cid => $width) { - $w .= "$cid [$width] "; - } - $res .= "/W [$w]\n"; - } - - $res .= "/CIDToGIDMap " . $o['info']['cidToGidMap'] . " 0 R\n"; - $res .= ">>\n"; - $res .= "endobj"; - - return $res; - } - } - - /** - * a font glyph to character map, needed for unicode fonts - */ - protected function o_fontGIDtoCIDMap($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array('t' => 'fontGIDtoCIDMap', 'info' => $options); - break; - - case 'out': - $res = "\n$id 0 obj\n"; - $fontFileName = $o['info']['fontFileName']; - $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']); - - $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) && - $this->fonts[$fontFileName]['CIDtoGID_Compressed']; - - if (!$compressed && isset($o['raw'])) { - $res .= $tmp; - } else { - $res .= "<<"; - - if (!$compressed && $this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on this content stream - $compressed = true; - $tmp = gzcompress($tmp, 6); - } - if ($compressed) { - $res .= "\n/Filter /FlateDecode"; - } - - $res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream"; - } - - $res .= "\nendobj"; - - return $res; - } - } - - /** - * the document procset, solves some problems with printing to old PS printers - */ - protected function o_procset($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array('t' => 'procset', 'info' => array('PDF' => 1, 'Text' => 1)); - $this->o_pages($this->currentNode, 'procset', $id); - $this->procsetObjectId = $id; - break; - - case 'add': - // this is to add new items to the procset list, despite the fact that this is considered - // obselete, the items are required for printing to some postscript printers - switch ($options) { - case 'ImageB': - case 'ImageC': - case 'ImageI': - $o['info'][$options] = 1; - break; - } - break; - - case 'out': - $res = "\n$id 0 obj\n["; - foreach ($o['info'] as $label => $val) { - $res .= "/$label "; - } - $res .= "]\nendobj"; - - return $res; - } - } - - /** - * define the document information - */ - protected function o_info($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->infoObject = $id; - $date = 'D:' . @date('Ymd'); - $this->objects[$id] = array( - 't' => 'info', - 'info' => array( - 'Creator' => 'R and OS php pdf writer, http://www.ros.co.nz', - 'CreationDate' => $date - ) - ); - break; - case 'Title': - case 'Author': - case 'Subject': - case 'Keywords': - case 'Creator': - case 'Producer': - case 'CreationDate': - case 'ModDate': - case 'Trapped': - $o['info'][$action] = $options; - break; - - case 'out': - if ($this->encrypted) { - $this->encryptInit($id); - } - - $res = "\n$id 0 obj\n<<\n"; - foreach ($o['info'] as $k => $v) { - $res .= "/$k ("; - - if ($this->encrypted) { - $v = $this->ARC4($v); - } // dates must be outputted as-is, without Unicode transformations - elseif (!in_array($k, array('CreationDate', 'ModDate'))) { - $v = $this->filterText($v); - } - - $res .= $v; - $res .= ")\n"; - } - - $res .= ">>\nendobj"; - - return $res; - } - } - - /** - * an action object, used to link to URLS initially - */ - protected function o_action($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - if (is_array($options)) { - $this->objects[$id] = array('t' => 'action', 'info' => $options, 'type' => $options['type']); - } else { - // then assume a URI action - $this->objects[$id] = array('t' => 'action', 'info' => $options, 'type' => 'URI'); - } - break; - - case 'out': - if ($this->encrypted) { - $this->encryptInit($id); - } - - $res = "\n$id 0 obj\n<< /Type /Action"; - switch ($o['type']) { - case 'ilink': - if (!isset($this->destinations[(string)$o['info']['label']])) { - break; - } - - // there will be an 'label' setting, this is the name of the destination - $res .= "\n/S /GoTo\n/D " . $this->destinations[(string)$o['info']['label']] . " 0 R"; - break; - - case 'URI': - $res .= "\n/S /URI\n/URI ("; - if ($this->encrypted) { - $res .= $this->filterText($this->ARC4($o['info']), true, false); - } else { - $res .= $this->filterText($o['info'], true, false); - } - - $res .= ")"; - break; - } - - $res .= "\n>>\nendobj"; - - return $res; - } - } - - /** - * an annotation object, this will add an annotation to the current page. - * initially will support just link annotations - */ - protected function o_annotation($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - // add the annotation to the current page - $pageId = $this->currentPage; - $this->o_page($pageId, 'annot', $id); - - // and add the action object which is going to be required - switch ($options['type']) { - case 'link': - $this->objects[$id] = array('t' => 'annotation', 'info' => $options); - $this->numObj++; - $this->o_action($this->numObj, 'new', $options['url']); - $this->objects[$id]['info']['actionId'] = $this->numObj; - break; - - case 'ilink': - // this is to a named internal link - $label = $options['label']; - $this->objects[$id] = array('t' => 'annotation', 'info' => $options); - $this->numObj++; - $this->o_action($this->numObj, 'new', array('type' => 'ilink', 'label' => $label)); - $this->objects[$id]['info']['actionId'] = $this->numObj; - break; - } - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Annot"; - switch ($o['info']['type']) { - case 'link': - case 'ilink': - $res .= "\n/Subtype /Link"; - break; - } - $res .= "\n/A " . $o['info']['actionId'] . " 0 R"; - $res .= "\n/Border [0 0 0]"; - $res .= "\n/H /I"; - $res .= "\n/Rect [ "; - - foreach ($o['info']['rect'] as $v) { - $res .= sprintf("%.4F ", $v); - } - - $res .= "]"; - $res .= "\n>>\nendobj"; - - return $res; - } - } - - /** - * a page object, it also creates a contents object to hold its contents - */ - protected function o_page($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->numPages++; - $this->objects[$id] = array( - 't' => 'page', - 'info' => array( - 'parent' => $this->currentNode, - 'pageNum' => $this->numPages - ) - ); - - if (is_array($options)) { - // then this must be a page insertion, array should contain 'rid','pos'=[before|after] - $options['id'] = $id; - $this->o_pages($this->currentNode, 'page', $options); - } else { - $this->o_pages($this->currentNode, 'page', $id); - } - - $this->currentPage = $id; - //make a contents object to go with this page - $this->numObj++; - $this->o_contents($this->numObj, 'new', $id); - $this->currentContents = $this->numObj; - $this->objects[$id]['info']['contents'] = array(); - $this->objects[$id]['info']['contents'][] = $this->numObj; - - $match = ($this->numPages % 2 ? 'odd' : 'even'); - foreach ($this->addLooseObjects as $oId => $target) { - if ($target === 'all' || $match === $target) { - $this->objects[$id]['info']['contents'][] = $oId; - } - } - break; - - case 'content': - $o['info']['contents'][] = $options; - break; - - case 'annot': - // add an annotation to this page - if (!isset($o['info']['annot'])) { - $o['info']['annot'] = array(); - } - - // $options should contain the id of the annotation dictionary - $o['info']['annot'][] = $options; - break; - - case 'out': - $res = "\n$id 0 obj\n<< /Type /Page"; - $res .= "\n/Parent " . $o['info']['parent'] . " 0 R"; - - if (isset($o['info']['annot'])) { - $res .= "\n/Annots ["; - foreach ($o['info']['annot'] as $aId) { - $res .= " $aId 0 R"; - } - $res .= " ]"; - } - - $count = count($o['info']['contents']); - if ($count == 1) { - $res .= "\n/Contents " . $o['info']['contents'][0] . " 0 R"; - } else { - if ($count > 1) { - $res .= "\n/Contents [\n"; - - // reverse the page contents so added objects are below normal content - //foreach (array_reverse($o['info']['contents']) as $cId) { - // Back to normal now that I've got transparency working --Benj - foreach ($o['info']['contents'] as $cId) { - $res .= "$cId 0 R\n"; - } - $res .= "]"; - } - } - - $res .= "\n>>\nendobj"; - - return $res; - } - } - - /** - * the contents objects hold all of the content which appears on pages - */ - protected function o_contents($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array('t' => 'contents', 'c' => '', 'info' => array()); - if (mb_strlen($options, '8bit') && intval($options)) { - // then this contents is the primary for a page - $this->objects[$id]['onPage'] = $options; - } else { - if ($options === 'raw') { - // then this page contains some other type of system object - $this->objects[$id]['raw'] = 1; - } - } - break; - - case 'add': - // add more options to the decleration - foreach ($options as $k => $v) { - $o['info'][$k] = $v; - } - - case 'out': - $tmp = $o['c']; - $res = "\n$id 0 obj\n"; - - if (isset($this->objects[$id]['raw'])) { - $res .= $tmp; - } else { - $res .= "<<"; - if ($this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on this content stream - $res .= " /Filter /FlateDecode"; - $tmp = gzcompress($tmp, 6); - } - - if ($this->encrypted) { - $this->encryptInit($id); - $tmp = $this->ARC4($tmp); - } - - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - - $res .= "\n/Length " . mb_strlen($tmp, '8bit') . " >>\nstream\n$tmp\nendstream"; - } - - $res .= "\nendobj"; - - return $res; - } - } - - protected function o_embedjs($id, $action) - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array( - 't' => 'embedjs', - 'info' => array( - 'Names' => '[(EmbeddedJS) ' . ($id + 1) . ' 0 R]' - ) - ); - break; - - case 'out': - $res = "\n$id 0 obj\n<< "; - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - $res .= "\n>>\nendobj"; - - return $res; - } - } - - protected function o_javascript($id, $action, $code = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - $this->objects[$id] = array( - 't' => 'javascript', - 'info' => array( - 'S' => '/JavaScript', - 'JS' => '(' . $this->filterText($code) . ')', - ) - ); - break; - - case 'out': - $res = "\n$id 0 obj\n<< "; - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - $res .= "\n>>\nendobj"; - - return $res; - } - } - - /** - * an image object, will be an XObject in the document, includes description and data - */ - protected function o_image($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - // make the new object - $this->objects[$id] = array('t' => 'image', 'data' => &$options['data'], 'info' => array()); - - $info =& $this->objects[$id]['info']; - - $info['Type'] = '/XObject'; - $info['Subtype'] = '/Image'; - $info['Width'] = $options['iw']; - $info['Height'] = $options['ih']; - - if (isset($options['masked']) && $options['masked']) { - $info['SMask'] = ($this->numObj - 1) . ' 0 R'; - } - - if (!isset($options['type']) || $options['type'] === 'jpg') { - if (!isset($options['channels'])) { - $options['channels'] = 3; - } - - switch ($options['channels']) { - case 1: - $info['ColorSpace'] = '/DeviceGray'; - break; - case 4: - $info['ColorSpace'] = '/DeviceCMYK'; - break; - default: - $info['ColorSpace'] = '/DeviceRGB'; - break; - } - - if ($info['ColorSpace'] === '/DeviceCMYK') { - $info['Decode'] = '[1 0 1 0 1 0 1 0]'; - } - - $info['Filter'] = '/DCTDecode'; - $info['BitsPerComponent'] = 8; - } else { - if ($options['type'] === 'png') { - $info['Filter'] = '/FlateDecode'; - $info['DecodeParms'] = '<< /Predictor 15 /Colors ' . $options['ncolor'] . ' /Columns ' . $options['iw'] . ' /BitsPerComponent ' . $options['bitsPerComponent'] . '>>'; - - if ($options['isMask']) { - $info['ColorSpace'] = '/DeviceGray'; - } else { - if (mb_strlen($options['pdata'], '8bit')) { - $tmp = ' [ /Indexed /DeviceRGB ' . (mb_strlen($options['pdata'], '8bit') / 3 - 1) . ' '; - $this->numObj++; - $this->o_contents($this->numObj, 'new'); - $this->objects[$this->numObj]['c'] = $options['pdata']; - $tmp .= $this->numObj . ' 0 R'; - $tmp .= ' ]'; - $info['ColorSpace'] = $tmp; - - if (isset($options['transparency'])) { - $transparency = $options['transparency']; - switch ($transparency['type']) { - case 'indexed': - $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] '; - $info['Mask'] = $tmp; - break; - - case 'color-key': - $tmp = ' [ ' . - $transparency['r'] . ' ' . $transparency['r'] . - $transparency['g'] . ' ' . $transparency['g'] . - $transparency['b'] . ' ' . $transparency['b'] . - ' ] '; - $info['Mask'] = $tmp; - break; - } - } - } else { - if (isset($options['transparency'])) { - $transparency = $options['transparency']; - - switch ($transparency['type']) { - case 'indexed': - $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] '; - $info['Mask'] = $tmp; - break; - - case 'color-key': - $tmp = ' [ ' . - $transparency['r'] . ' ' . $transparency['r'] . ' ' . - $transparency['g'] . ' ' . $transparency['g'] . ' ' . - $transparency['b'] . ' ' . $transparency['b'] . - ' ] '; - $info['Mask'] = $tmp; - break; - } - } - $info['ColorSpace'] = '/' . $options['color']; - } - } - - $info['BitsPerComponent'] = $options['bitsPerComponent']; - } - } - - // assign it a place in the named resource dictionary as an external object, according to - // the label passed in with it. - $this->o_pages($this->currentNode, 'xObject', array('label' => $options['label'], 'objNum' => $id)); - - // also make sure that we have the right procset object for it. - $this->o_procset($this->procsetObjectId, 'add', 'ImageC'); - break; - - case 'out': - $tmp = &$o['data']; - $res = "\n$id 0 obj\n<<"; - - foreach ($o['info'] as $k => $v) { - $res .= "\n/$k $v"; - } - - if ($this->encrypted) { - $this->encryptInit($id); - $tmp = $this->ARC4($tmp); - } - - $res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream\nendobj"; - - return $res; - } - } - - /** - * graphics state object - */ - protected function o_extGState($id, $action, $options = "") - { - static $valid_params = array( - "LW", - "LC", - "LC", - "LJ", - "ML", - "D", - "RI", - "OP", - "op", - "OPM", - "Font", - "BG", - "BG2", - "UCR", - "TR", - "TR2", - "HT", - "FL", - "SM", - "SA", - "BM", - "SMask", - "CA", - "ca", - "AIS", - "TK" - ); - - if ($action !== "new") { - $o = &$this->objects[$id]; - } - - switch ($action) { - case "new": - $this->objects[$id] = array('t' => 'extGState', 'info' => $options); - - // Tell the pages about the new resource - $this->numStates++; - $this->o_pages($this->currentNode, 'extGState', array("objNum" => $id, "stateNum" => $this->numStates)); - break; - - case "out": - $res = "\n$id 0 obj\n<< /Type /ExtGState\n"; - - foreach ($o["info"] as $k => $v) { - if (!in_array($k, $valid_params)) { - continue; - } - $res .= "/$k $v\n"; - } - - $res .= ">>\nendobj"; - - return $res; - } - } - - /** - * encryption object. - */ - protected function o_encryption($id, $action, $options = '') - { - if ($action !== 'new') { - $o = &$this->objects[$id]; - } - - switch ($action) { - case 'new': - // make the new object - $this->objects[$id] = array('t' => 'encryption', 'info' => $options); - $this->arc4_objnum = $id; - - // figure out the additional paramaters required - $pad = chr(0x28) . chr(0xBF) . chr(0x4E) . chr(0x5E) . chr(0x4E) . chr(0x75) . chr(0x8A) . chr(0x41) - . chr(0x64) . chr(0x00) . chr(0x4E) . chr(0x56) . chr(0xFF) . chr(0xFA) . chr(0x01) . chr(0x08) - . chr(0x2E) . chr(0x2E) . chr(0x00) . chr(0xB6) . chr(0xD0) . chr(0x68) . chr(0x3E) . chr(0x80) - . chr(0x2F) . chr(0x0C) . chr(0xA9) . chr(0xFE) . chr(0x64) . chr(0x53) . chr(0x69) . chr(0x7A); - - $len = mb_strlen($options['owner'], '8bit'); - - if ($len > 32) { - $owner = substr($options['owner'], 0, 32); - } else { - if ($len < 32) { - $owner = $options['owner'] . substr($pad, 0, 32 - $len); - } else { - $owner = $options['owner']; - } - } - - $len = mb_strlen($options['user'], '8bit'); - if ($len > 32) { - $user = substr($options['user'], 0, 32); - } else { - if ($len < 32) { - $user = $options['user'] . substr($pad, 0, 32 - $len); - } else { - $user = $options['user']; - } - } - - $tmp = $this->md5_16($owner); - $okey = substr($tmp, 0, 5); - $this->ARC4_init($okey); - $ovalue = $this->ARC4($user); - $this->objects[$id]['info']['O'] = $ovalue; - - // now make the u value, phew. - $tmp = $this->md5_16( - $user . $ovalue . chr($options['p']) . chr(255) . chr(255) . chr(255) . $this->fileIdentifier - ); - - $ukey = substr($tmp, 0, 5); - $this->ARC4_init($ukey); - $this->encryptionKey = $ukey; - $this->encrypted = true; - $uvalue = $this->ARC4($pad); - $this->objects[$id]['info']['U'] = $uvalue; - $this->encryptionKey = $ukey; - // initialize the arc4 array - break; - - case 'out': - $res = "\n$id 0 obj\n<<"; - $res .= "\n/Filter /Standard"; - $res .= "\n/V 1"; - $res .= "\n/R 2"; - $res .= "\n/O (" . $this->filterText($o['info']['O'], true, false) . ')'; - $res .= "\n/U (" . $this->filterText($o['info']['U'], true, false) . ')'; - // and the p-value needs to be converted to account for the twos-complement approach - $o['info']['p'] = (($o['info']['p'] ^ 255) + 1) * -1; - $res .= "\n/P " . ($o['info']['p']); - $res .= "\n>>\nendobj"; - - return $res; - } - } - - /** - * ARC4 functions - * A series of function to implement ARC4 encoding in PHP - */ - - /** - * calculate the 16 byte version of the 128 bit md5 digest of the string - */ - function md5_16($string) - { - $tmp = md5($string); - $out = ''; - for ($i = 0; $i <= 30; $i = $i + 2) { - $out .= chr(hexdec(substr($tmp, $i, 2))); - } - - return $out; - } - - /** - * initialize the encryption for processing a particular object - */ - function encryptInit($id) - { - $tmp = $this->encryptionKey; - $hex = dechex($id); - if (mb_strlen($hex, '8bit') < 6) { - $hex = substr('000000', 0, 6 - mb_strlen($hex, '8bit')) . $hex; - } - $tmp .= chr(hexdec(substr($hex, 4, 2))) . chr(hexdec(substr($hex, 2, 2))) . chr( - hexdec(substr($hex, 0, 2)) - ) . chr(0) . chr(0); - $key = $this->md5_16($tmp); - $this->ARC4_init(substr($key, 0, 10)); - } - - /** - * initialize the ARC4 encryption - */ - function ARC4_init($key = '') - { - $this->arc4 = ''; - - // setup the control array - if (mb_strlen($key, '8bit') == 0) { - return; - } - - $k = ''; - while (mb_strlen($k, '8bit') < 256) { - $k .= $key; - } - - $k = substr($k, 0, 256); - for ($i = 0; $i < 256; $i++) { - $this->arc4 .= chr($i); - } - - $j = 0; - - for ($i = 0; $i < 256; $i++) { - $t = $this->arc4[$i]; - $j = ($j + ord($t) + ord($k[$i])) % 256; - $this->arc4[$i] = $this->arc4[$j]; - $this->arc4[$j] = $t; - } - } - - /** - * ARC4 encrypt a text string - */ - function ARC4($text) - { - $len = mb_strlen($text, '8bit'); - $a = 0; - $b = 0; - $c = $this->arc4; - $out = ''; - for ($i = 0; $i < $len; $i++) { - $a = ($a + 1) % 256; - $t = $c[$a]; - $b = ($b + ord($t)) % 256; - $c[$a] = $c[$b]; - $c[$b] = $t; - $k = ord($c[(ord($c[$a]) + ord($c[$b])) % 256]); - $out .= chr(ord($text[$i]) ^ $k); - } - - return $out; - } - - /** - * functions which can be called to adjust or add to the document - */ - - /** - * add a link in the document to an external URL - */ - function addLink($url, $x0, $y0, $x1, $y1) - { - $this->numObj++; - $info = array('type' => 'link', 'url' => $url, 'rect' => array($x0, $y0, $x1, $y1)); - $this->o_annotation($this->numObj, 'new', $info); - } - - /** - * add a link in the document to an internal destination (ie. within the document) - */ - function addInternalLink($label, $x0, $y0, $x1, $y1) - { - $this->numObj++; - $info = array('type' => 'ilink', 'label' => $label, 'rect' => array($x0, $y0, $x1, $y1)); - $this->o_annotation($this->numObj, 'new', $info); - } - - /** - * set the encryption of the document - * can be used to turn it on and/or set the passwords which it will have. - * also the functions that the user will have are set here, such as print, modify, add - */ - function setEncryption($userPass = '', $ownerPass = '', $pc = array()) - { - $p = bindec("11000000"); - - $options = array('print' => 4, 'modify' => 8, 'copy' => 16, 'add' => 32); - - foreach ($pc as $k => $v) { - if ($v && isset($options[$k])) { - $p += $options[$k]; - } else { - if (isset($options[$v])) { - $p += $options[$v]; - } - } - } - - // implement encryption on the document - if ($this->arc4_objnum == 0) { - // then the block does not exist already, add it. - $this->numObj++; - if (mb_strlen($ownerPass) == 0) { - $ownerPass = $userPass; - } - - $this->o_encryption($this->numObj, 'new', array('user' => $userPass, 'owner' => $ownerPass, 'p' => $p)); - } - } - - /** - * should be used for internal checks, not implemented as yet - */ - function checkAllHere() - { - } - - /** - * return the pdf stream as a string returned from the function - */ - function output($debug = false) - { - if ($debug) { - // turn compression off - $this->options['compression'] = false; - } - - if ($this->javascript) { - $this->numObj++; - - $js_id = $this->numObj; - $this->o_embedjs($js_id, 'new'); - $this->o_javascript(++$this->numObj, 'new', $this->javascript); - - $id = $this->catalogId; - - $this->o_catalog($id, 'javascript', $js_id); - } - - if ($this->arc4_objnum) { - $this->ARC4_init($this->encryptionKey); - } - - $this->checkAllHere(); - - $xref = array(); - $content = '%PDF-1.3'; - $pos = mb_strlen($content, '8bit'); - - foreach ($this->objects as $k => $v) { - $tmp = 'o_' . $v['t']; - $cont = $this->$tmp($k, 'out'); - $content .= $cont; - $xref[] = $pos; - $pos += mb_strlen($cont, '8bit'); - } - - $content .= "\nxref\n0 " . (count($xref) + 1) . "\n0000000000 65535 f \n"; - - foreach ($xref as $p) { - $content .= str_pad($p, 10, "0", STR_PAD_LEFT) . " 00000 n \n"; - } - - $content .= "trailer\n<<\n/Size " . (count($xref) + 1) . "\n/Root 1 0 R\n/Info $this->infoObject 0 R\n"; - - // if encryption has been applied to this document then add the marker for this dictionary - if ($this->arc4_objnum > 0) { - $content .= "/Encrypt $this->arc4_objnum 0 R\n"; - } - - if (mb_strlen($this->fileIdentifier, '8bit')) { - $content .= "/ID[<$this->fileIdentifier><$this->fileIdentifier>]\n"; - } - - // account for \n added at start of xref table - $pos++; - - $content .= ">>\nstartxref\n$pos\n%%EOF\n"; - - return $content; - } - - /** - * intialize a new document - * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum - * this function is called automatically by the constructor function - */ - private function newDocument($pageSize = array(0, 0, 612, 792)) - { - $this->numObj = 0; - $this->objects = array(); - - $this->numObj++; - $this->o_catalog($this->numObj, 'new'); - - $this->numObj++; - $this->o_outlines($this->numObj, 'new'); - - $this->numObj++; - $this->o_pages($this->numObj, 'new'); - - $this->o_pages($this->numObj, 'mediaBox', $pageSize); - $this->currentNode = 3; - - $this->numObj++; - $this->o_procset($this->numObj, 'new'); - - $this->numObj++; - $this->o_info($this->numObj, 'new'); - - $this->numObj++; - $this->o_page($this->numObj, 'new'); - - // need to store the first page id as there is no way to get it to the user during - // startup - $this->firstPageId = $this->currentContents; - } - - /** - * open the font file and return a php structure containing it. - * first check if this one has been done before and saved in a form more suited to php - * note that if a php serialized version does not exist it will try and make one, but will - * require write access to the directory to do it... it is MUCH faster to have these serialized - * files. - */ - private function openFont($font) - { - // assume that $font contains the path and file but not the extension - $pos = strrpos($font, '/'); - - if ($pos === false) { - $dir = './'; - $name = $font; - } else { - $dir = substr($font, 0, $pos + 1); - $name = substr($font, $pos + 1); - } - - $fontcache = $this->fontcache; - if ($fontcache == '') { - $fontcache = $dir; - } - - //$name filename without folder and extension of font metrics - //$dir folder of font metrics - //$fontcache folder of runtime created php serialized version of font metrics. - // If this is not given, the same folder as the font metrics will be used. - // Storing and reusing serialized versions improves speed much - - $this->addMessage("openFont: $font - $name"); - - if (!$this->isUnicode || in_array(mb_strtolower(basename($name)), self::$coreFonts)) { - $metrics_name = "$name.afm"; - } else { - $metrics_name = "$name.ufm"; - } - - $cache_name = "$metrics_name.php"; - $this->addMessage("metrics: $metrics_name, cache: $cache_name"); - - if (file_exists($fontcache . $cache_name)) { - $this->addMessage("openFont: php file exists $fontcache$cache_name"); - $this->fonts[$font] = require($fontcache . $cache_name); - - if (!isset($this->fonts[$font]['_version_']) || $this->fonts[$font]['_version_'] != $this->fontcacheVersion) { - // if the font file is old, then clear it out and prepare for re-creation - $this->addMessage('openFont: clear out, make way for new version.'); - $this->fonts[$font] = null; - unset($this->fonts[$font]); - } - } else { - $old_cache_name = "php_$metrics_name"; - if (file_exists($fontcache . $old_cache_name)) { - $this->addMessage( - "openFont: php file doesn't exist $fontcache$cache_name, creating it from the old format" - ); - $old_cache = file_get_contents($fontcache . $old_cache_name); - file_put_contents($fontcache . $cache_name, 'openFont($font); - } - } - - if (!isset($this->fonts[$font]) && file_exists($dir . $metrics_name)) { - // then rebuild the php_.afm file from the .afm file - $this->addMessage("openFont: build php file from $dir$metrics_name"); - $data = array(); - - // 20 => 'space' - $data['codeToName'] = array(); - - // Since we're not going to enable Unicode for the core fonts we need to use a font-based - // setting for Unicode support rather than a global setting. - $data['isUnicode'] = (strtolower(substr($metrics_name, -3)) !== 'afm'); - - $cidtogid = ''; - if ($data['isUnicode']) { - $cidtogid = str_pad('', 256 * 256 * 2, "\x00"); - } - - $file = file($dir . $metrics_name); - - foreach ($file as $rowA) { - $row = trim($rowA); - $pos = strpos($row, ' '); - - if ($pos) { - // then there must be some keyword - $key = substr($row, 0, $pos); - switch ($key) { - case 'FontName': - case 'FullName': - case 'FamilyName': - case 'PostScriptName': - case 'Weight': - case 'ItalicAngle': - case 'IsFixedPitch': - case 'CharacterSet': - case 'UnderlinePosition': - case 'UnderlineThickness': - case 'Version': - case 'EncodingScheme': - case 'CapHeight': - case 'XHeight': - case 'Ascender': - case 'Descender': - case 'StdHW': - case 'StdVW': - case 'StartCharMetrics': - case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font. Otherwise it's too big. - $data[$key] = trim(substr($row, $pos)); - break; - - case 'FontBBox': - $data[$key] = explode(' ', trim(substr($row, $pos))); - break; - - //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; - case 'C': // Found in AFM files - $bits = explode(';', trim($row)); - $dtmp = array(); - - foreach ($bits as $bit) { - $bits2 = explode(' ', trim($bit)); - if (mb_strlen($bits2[0], '8bit') == 0) { - continue; - } - - if (count($bits2) > 2) { - $dtmp[$bits2[0]] = array(); - for ($i = 1; $i < count($bits2); $i++) { - $dtmp[$bits2[0]][] = $bits2[$i]; - } - } else { - if (count($bits2) == 2) { - $dtmp[$bits2[0]] = $bits2[1]; - } - } - } - - $c = (int)$dtmp['C']; - $n = $dtmp['N']; - $width = floatval($dtmp['WX']); - - if ($c >= 0) { - if ($c != hexdec($n)) { - $data['codeToName'][$c] = $n; - } - $data['C'][$c] = $width; - } else { - $data['C'][$n] = $width; - } - - if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') { - $data['MissingWidth'] = $width; - } - - break; - - // U 827 ; WX 0 ; N squaresubnosp ; G 675 ; - case 'U': // Found in UFM files - if (!$data['isUnicode']) { - break; - } - - $bits = explode(';', trim($row)); - $dtmp = array(); - - foreach ($bits as $bit) { - $bits2 = explode(' ', trim($bit)); - if (mb_strlen($bits2[0], '8bit') === 0) { - continue; - } - - if (count($bits2) > 2) { - $dtmp[$bits2[0]] = array(); - for ($i = 1; $i < count($bits2); $i++) { - $dtmp[$bits2[0]][] = $bits2[$i]; - } - } else { - if (count($bits2) == 2) { - $dtmp[$bits2[0]] = $bits2[1]; - } - } - } - - $c = (int)$dtmp['U']; - $n = $dtmp['N']; - $glyph = $dtmp['G']; - $width = floatval($dtmp['WX']); - - if ($c >= 0) { - // Set values in CID to GID map - if ($c >= 0 && $c < 0xFFFF && $glyph) { - $cidtogid[$c * 2] = chr($glyph >> 8); - $cidtogid[$c * 2 + 1] = chr($glyph & 0xFF); - } - - if ($c != hexdec($n)) { - $data['codeToName'][$c] = $n; - } - $data['C'][$c] = $width; - } else { - $data['C'][$n] = $width; - } - - if (!isset($data['MissingWidth']) && $c == -1 && $n === '.notdef') { - $data['MissingWidth'] = $width; - } - - break; - - case 'KPX': - break; // don't include them as they are not used yet - //KPX Adieresis yacute -40 - $bits = explode(' ', trim($row)); - $data['KPX'][$bits[1]][$bits[2]] = $bits[3]; - break; - } - } - } - - if ($this->compressionReady && $this->options['compression']) { - // then implement ZLIB based compression on CIDtoGID string - $data['CIDtoGID_Compressed'] = true; - $cidtogid = gzcompress($cidtogid, 6); - } - $data['CIDtoGID'] = base64_encode($cidtogid); - $data['_version_'] = $this->fontcacheVersion; - $this->fonts[$font] = $data; - - //Because of potential trouble with php safe mode, expect that the folder already exists. - //If not existing, this will hit performance because of missing cached results. - if (is_dir(substr($fontcache, 0, -1)) && is_writable(substr($fontcache, 0, -1))) { - file_put_contents($fontcache . $cache_name, 'fonts[$font])) { - $this->addMessage("openFont: no font file found for $font. Do you need to run load_font.php?"); - } - - //pre_r($this->messages); - } - - /** - * if the font is not loaded then load it and make the required object - * else just make it the current font - * the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding' - * note that encoding='none' will need to be used for symbolic fonts - * and 'differences' => an array of mappings between numbers 0->255 and character names. - * - */ - function selectFont($fontName, $encoding = '', $set = true) - { - $ext = substr($fontName, -4); - if ($ext === '.afm' || $ext === '.ufm') { - $fontName = substr($fontName, 0, mb_strlen($fontName) - 4); - } - - if (!isset($this->fonts[$fontName])) { - $this->addMessage("selectFont: selecting - $fontName - $encoding, $set"); - - // load the file - $this->openFont($fontName); - - if (isset($this->fonts[$fontName])) { - $this->numObj++; - $this->numFonts++; - - $font = &$this->fonts[$fontName]; - - //$this->numFonts = md5($fontName); - $pos = strrpos($fontName, '/'); - // $dir = substr($fontName,0,$pos+1); - $name = substr($fontName, $pos + 1); - $options = array('name' => $name, 'fontFileName' => $fontName); - - if (is_array($encoding)) { - // then encoding and differences might be set - if (isset($encoding['encoding'])) { - $options['encoding'] = $encoding['encoding']; - } - - if (isset($encoding['differences'])) { - $options['differences'] = $encoding['differences']; - } - } else { - if (mb_strlen($encoding, '8bit')) { - // then perhaps only the encoding has been set - $options['encoding'] = $encoding; - } - } - - $fontObj = $this->numObj; - $this->o_font($this->numObj, 'new', $options); - $font['fontNum'] = $this->numFonts; - - // if this is a '.afm' font, and there is a '.pfa' file to go with it ( as there - // should be for all non-basic fonts), then load it into an object and put the - // references into the font object - $basefile = $fontName; - - $fbtype = ''; - if (file_exists("$basefile.pfb")) { - $fbtype = 'pfb'; - } else { - if (file_exists("$basefile.ttf")) { - $fbtype = 'ttf'; - } - } - - $fbfile = "$basefile.$fbtype"; - - // $pfbfile = substr($fontName,0,strlen($fontName)-4).'.pfb'; - // $ttffile = substr($fontName,0,strlen($fontName)-4).'.ttf'; - $this->addMessage('selectFont: checking for - ' . $fbfile); - - // OAR - I don't understand this old check - // if (substr($fontName, -4) === '.afm' && strlen($fbtype)) { - if ($fbtype) { - $adobeFontName = isset($font['PostScriptName']) ? $font['PostScriptName'] : $font['FontName']; - // $fontObj = $this->numObj; - $this->addMessage("selectFont: adding font file - $fbfile - $adobeFontName"); - - // find the array of font widths, and put that into an object. - $firstChar = -1; - $lastChar = 0; - $widths = array(); - $cid_widths = array(); - - foreach ($font['C'] as $num => $d) { - if (intval($num) > 0 || $num == '0') { - if (!$font['isUnicode']) { - // With Unicode, widths array isn't used - if ($lastChar > 0 && $num > $lastChar + 1) { - for ($i = $lastChar + 1; $i < $num; $i++) { - $widths[] = 0; - } - } - } - - $widths[] = $d; - - if ($font['isUnicode']) { - $cid_widths[$num] = $d; - } - - if ($firstChar == -1) { - $firstChar = $num; - } - - $lastChar = $num; - } - } - - // also need to adjust the widths for the differences array - if (isset($options['differences'])) { - foreach ($options['differences'] as $charNum => $charName) { - if ($charNum > $lastChar) { - if (!$font['isUnicode']) { - // With Unicode, widths array isn't used - for ($i = $lastChar + 1; $i <= $charNum; $i++) { - $widths[] = 0; - } - } - - $lastChar = $charNum; - } - - if (isset($font['C'][$charName])) { - $widths[$charNum - $firstChar] = $font['C'][$charName]; - if ($font['isUnicode']) { - $cid_widths[$charName] = $font['C'][$charName]; - } - } - } - } - - if ($font['isUnicode']) { - $font['CIDWidths'] = $cid_widths; - } - - $this->addMessage('selectFont: FirstChar = ' . $firstChar); - $this->addMessage('selectFont: LastChar = ' . $lastChar); - - $widthid = -1; - - if (!$font['isUnicode']) { - // With Unicode, widths array isn't used - - $this->numObj++; - $this->o_contents($this->numObj, 'new', 'raw'); - $this->objects[$this->numObj]['c'] .= '[' . implode(' ', $widths) . ']'; - $widthid = $this->numObj; - } - - $missing_width = 500; - $stemV = 70; - - if (isset($font['MissingWidth'])) { - $missing_width = $font['MissingWidth']; - } - if (isset($font['StdVW'])) { - $stemV = $font['StdVW']; - } else { - if (isset($font['Weight']) && preg_match('!(bold|black)!i', $font['Weight'])) { - $stemV = 120; - } - } - - // load the pfb file, and put that into an object too. - // note that pdf supports only binary format type 1 font files, though there is a - // simple utility to convert them from pfa to pfb. - // FIXME: should we move font subset creation to CPDF::output? See notes in issue #750. - if (!$this->isUnicode || $fbtype !== 'ttf' || empty($this->stringSubsets)) { - $data = file_get_contents($fbfile); - } else { - $this->stringSubsets[$fontName][] = 32; // Force space if not in yet - - $subset = $this->stringSubsets[$fontName]; - sort($subset); - - // Load font - $font_obj = Font::load($fbfile); - $font_obj->parse(); - - // Define subset - $font_obj->setSubset($subset); - $font_obj->reduce(); - - // Write new font - $tmp_name = "$fbfile.tmp." . uniqid(); - $font_obj->open($tmp_name, Font_Binary_Stream::modeWrite); - $font_obj->encode(array("OS/2")); - $font_obj->close(); - - // Parse the new font to get cid2gid and widths - $font_obj = Font::load($tmp_name); - - // Find Unicode char map table - $subtable = null; - foreach ($font_obj->getData("cmap", "subtables") as $_subtable) { - if ($_subtable["platformID"] == 0 || $_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1) { - $subtable = $_subtable; - break; - } - } - - if ($subtable) { - $glyphIndexArray = $subtable["glyphIndexArray"]; - $hmtx = $font_obj->getData("hmtx"); - - unset($glyphIndexArray[0xFFFF]); - - $cidtogid = str_pad('', max(array_keys($glyphIndexArray)) * 2 + 1, "\x00"); - $font['CIDWidths'] = array(); - foreach ($glyphIndexArray as $cid => $gid) { - if ($cid >= 0 && $cid < 0xFFFF && $gid) { - $cidtogid[$cid * 2] = chr($gid >> 8); - $cidtogid[$cid * 2 + 1] = chr($gid & 0xFF); - } - - $width = $font_obj->normalizeFUnit(isset($hmtx[$gid]) ? $hmtx[$gid][0] : $hmtx[0][0]); - $font['CIDWidths'][$cid] = $width; - } - - $font['CIDtoGID'] = base64_encode(gzcompress($cidtogid)); - $font['CIDtoGID_Compressed'] = true; - - $data = file_get_contents($tmp_name); - } else { - $data = file_get_contents($fbfile); - } - - $font_obj->close(); - unlink($tmp_name); - } - - // create the font descriptor - $this->numObj++; - $fontDescriptorId = $this->numObj; - - $this->numObj++; - $pfbid = $this->numObj; - - // determine flags (more than a little flakey, hopefully will not matter much) - $flags = 0; - - if ($font['ItalicAngle'] != 0) { - $flags += pow(2, 6); - } - - if ($font['IsFixedPitch'] === 'true') { - $flags += 1; - } - - $flags += pow(2, 5); // assume non-sybolic - $list = array( - 'Ascent' => 'Ascender', - 'CapHeight' => 'CapHeight', - 'MissingWidth' => 'MissingWidth', - 'Descent' => 'Descender', - 'FontBBox' => 'FontBBox', - 'ItalicAngle' => 'ItalicAngle' - ); - $fdopt = array( - 'Flags' => $flags, - 'FontName' => $adobeFontName, - 'StemV' => $stemV - ); - - foreach ($list as $k => $v) { - if (isset($font[$v])) { - $fdopt[$k] = $font[$v]; - } - } - - if ($fbtype === 'pfb') { - $fdopt['FontFile'] = $pfbid; - } else { - if ($fbtype === 'ttf') { - $fdopt['FontFile2'] = $pfbid; - } - } - - $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt); - - // embed the font program - $this->o_contents($this->numObj, 'new'); - $this->objects[$pfbid]['c'] .= $data; - - // determine the cruicial lengths within this file - if ($fbtype === 'pfb') { - $l1 = strpos($data, 'eexec') + 6; - $l2 = strpos($data, '00000000') - $l1; - $l3 = mb_strlen($data, '8bit') - $l2 - $l1; - $this->o_contents( - $this->numObj, - 'add', - array('Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3) - ); - } else { - if ($fbtype == 'ttf') { - $l1 = mb_strlen($data, '8bit'); - $this->o_contents($this->numObj, 'add', array('Length1' => $l1)); - } - } - - // tell the font object about all this new stuff - $tmp = array( - 'BaseFont' => $adobeFontName, - 'MissingWidth' => $missing_width, - 'Widths' => $widthid, - 'FirstChar' => $firstChar, - 'LastChar' => $lastChar, - 'FontDescriptor' => $fontDescriptorId - ); - - if ($fbtype === 'ttf') { - $tmp['SubType'] = 'TrueType'; - } - - $this->addMessage("adding extra info to font.($fontObj)"); - - foreach ($tmp as $fk => $fv) { - $this->addMessage("$fk : $fv"); - } - - $this->o_font($fontObj, 'add', $tmp); - } else { - $this->addMessage( - 'selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts' - ); - } - - // also set the differences here, note that this means that these will take effect only the - //first time that a font is selected, else they are ignored - if (isset($options['differences'])) { - $font['differences'] = $options['differences']; - } - } - } - - if ($set && isset($this->fonts[$fontName])) { - // so if for some reason the font was not set in the last one then it will not be selected - $this->currentBaseFont = $fontName; - - // the next lines mean that if a new font is selected, then the current text state will be - // applied to it as well. - $this->currentFont = $this->currentBaseFont; - $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; - - //$this->setCurrentFont(); - } - - return $this->currentFontNum; - //return $this->numObj; - } - - /** - * sets up the current font, based on the font families, and the current text state - * note that this system is quite flexible, a bold-italic font can be completely different to a - * italic-bold font, and even bold-bold will have to be defined within the family to have meaning - * This function is to be called whenever the currentTextState is changed, it will update - * the currentFont setting to whatever the appropriatte family one is. - * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont - * This function will change the currentFont to whatever it should be, but will not change the - * currentBaseFont. - */ - private function setCurrentFont() - { - // if (strlen($this->currentBaseFont) == 0){ - // // then assume an initial font - // $this->selectFont($this->defaultFont); - // } - // $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1); - // if (strlen($this->currentTextState) - // && isset($this->fontFamilies[$cf]) - // && isset($this->fontFamilies[$cf][$this->currentTextState])){ - // // then we are in some state or another - // // and this font has a family, and the current setting exists within it - // // select the font, then return it - // $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState]; - // $this->selectFont($nf,'',0); - // $this->currentFont = $nf; - // $this->currentFontNum = $this->fonts[$nf]['fontNum']; - // } else { - // // the this font must not have the right family member for the current state - // // simply assume the base font - $this->currentFont = $this->currentBaseFont; - $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; - // } - } - - /** - * function for the user to find out what the ID is of the first page that was created during - * startup - useful if they wish to add something to it later. - */ - function getFirstPageId() - { - return $this->firstPageId; - } - - /** - * add content to the currently active object - */ - private function addContent($content) - { - $this->objects[$this->currentContents]['c'] .= $content; - } - - /** - * sets the color for fill operations - */ - function setColor($color, $force = false) - { - $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null); - - if (!$force && $this->currentColor == $new_color) { - return; - } - - if (isset($new_color[3])) { - //$this->currentColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F k", $this->currentColor)); - } else { - if (isset($new_color[2])) { - //$this->currentColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F rg", $new_color)); - } - } - } - - /** - * sets the color for fill operations - */ - function setFillRule($fillRule) - { - if (!in_array($fillRule, array("nonzero", "evenodd"))) { - return; - } - - $this->fillRule = $fillRule; - } - - /** - * sets the color for stroke operations - */ - function setStrokeColor($color, $force = false) - { - $new_color = array($color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null); - - if (!$force && $this->currentStrokeColor == $new_color) { - return; - } - - if (isset($new_color[3])) { - //$this->currentStrokeColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F K", $this->currentStrokeColor)); - } else { - if (isset($new_color[2])) { - //$this->currentStrokeColor = $new_color; - $this->addContent(vsprintf("\n%.3F %.3F %.3F RG", $new_color)); - } - } - } - - /** - * Set the graphics state for compositions - */ - function setGraphicsState($parameters) - { - // Create a new graphics state object - // FIXME: should actually keep track of states that have already been created... - $this->numObj++; - $this->o_extGState($this->numObj, 'new', $parameters); - $this->addContent("\n/GS$this->numStates gs"); - } - - /** - * Set current blend mode & opacity for lines. - * - * Valid blend modes are: - * - * Normal, Multiply, Screen, Overlay, Darken, Lighten, - * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, - * Exclusion - * - * @param string $mode the blend mode to use - * @param float $opacity 0.0 fully transparent, 1.0 fully opaque - */ - function setLineTransparency($mode, $opacity) - { - static $blend_modes = array( - "Normal", - "Multiply", - "Screen", - "Overlay", - "Darken", - "Lighten", - "ColorDogde", - "ColorBurn", - "HardLight", - "SoftLight", - "Difference", - "Exclusion" - ); - - if (!in_array($mode, $blend_modes)) { - $mode = "Normal"; - } - - // Only create a new graphics state if required - if ($mode === $this->currentLineTransparency["mode"] && - $opacity == $this->currentLineTransparency["opacity"] - ) { - return; - } - - $this->currentLineTransparency["mode"] = $mode; - $this->currentLineTransparency["opacity"] = $opacity; - - $options = array( - "BM" => "/$mode", - "CA" => (float)$opacity - ); - - $this->setGraphicsState($options); - } - - /** - * Set current blend mode & opacity for filled objects. - * - * Valid blend modes are: - * - * Normal, Multiply, Screen, Overlay, Darken, Lighten, - * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, - * Exclusion - * - * @param string $mode the blend mode to use - * @param float $opacity 0.0 fully transparent, 1.0 fully opaque - */ - function setFillTransparency($mode, $opacity) - { - static $blend_modes = array( - "Normal", - "Multiply", - "Screen", - "Overlay", - "Darken", - "Lighten", - "ColorDogde", - "ColorBurn", - "HardLight", - "SoftLight", - "Difference", - "Exclusion" - ); - - if (!in_array($mode, $blend_modes)) { - $mode = "Normal"; - } - - if ($mode === $this->currentFillTransparency["mode"] && - $opacity == $this->currentFillTransparency["opacity"] - ) { - return; - } - - $this->currentFillTransparency["mode"] = $mode; - $this->currentFillTransparency["opacity"] = $opacity; - - $options = array( - "BM" => "/$mode", - "ca" => (float)$opacity, - ); - - $this->setGraphicsState($options); - } - - function lineTo($x, $y) - { - $this->addContent(sprintf("\n%.3F %.3F l", $x, $y)); - } - - function moveTo($x, $y) - { - $this->addContent(sprintf("\n%.3F %.3F m", $x, $y)); - } - - /** - * draw a bezier curve based on 4 control points - */ - function curveTo($x1, $y1, $x2, $y2, $x3, $y3) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F %.3F %.3F c", $x1, $y1, $x2, $y2, $x3, $y3)); - } - - /** - * draw a bezier curve based on 4 control points - */ - function quadTo($cpx, $cpy, $x, $y) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F v", $cpx, $cpy, $x, $y)); - } - - function closePath() - { - $this->addContent(' h'); - } - - function endPath() - { - $this->addContent(' n'); - } - - /** - * draw an ellipse - * note that the part and filled ellipse are just special cases of this function - * - * draws an ellipse in the current line style - * centered at $x0,$y0, radii $r1,$r2 - * if $r2 is not set, then a circle is drawn - * from $astart to $afinish, measured in degrees, running anti-clockwise from the right hand side of the ellipse. - * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a - * pretty crappy shape at 2, as we are approximating with bezier curves. - */ - function ellipse( - $x0, - $y0, - $r1, - $r2 = 0, - $angle = 0, - $nSeg = 8, - $astart = 0, - $afinish = 360, - $close = true, - $fill = false, - $stroke = true, - $incomplete = false - ) { - if ($r1 == 0) { - return; - } - - if ($r2 == 0) { - $r2 = $r1; - } - - if ($nSeg < 2) { - $nSeg = 2; - } - - $astart = deg2rad((float)$astart); - $afinish = deg2rad((float)$afinish); - $totalAngle = $afinish - $astart; - - $dt = $totalAngle / $nSeg; - $dtm = $dt / 3; - - if ($angle != 0) { - $a = -1 * deg2rad((float)$angle); - - $this->addContent( - sprintf("\n q %.3F %.3F %.3F %.3F %.3F %.3F cm", cos($a), -sin($a), sin($a), cos($a), $x0, $y0) - ); - - $x0 = 0; - $y0 = 0; - } - - $t1 = $astart; - $a0 = $x0 + $r1 * cos($t1); - $b0 = $y0 + $r2 * sin($t1); - $c0 = -$r1 * sin($t1); - $d0 = $r2 * cos($t1); - - if (!$incomplete) { - $this->addContent(sprintf("\n%.3F %.3F m ", $a0, $b0)); - } - - for ($i = 1; $i <= $nSeg; $i++) { - // draw this bit of the total curve - $t1 = $i * $dt + $astart; - $a1 = $x0 + $r1 * cos($t1); - $b1 = $y0 + $r2 * sin($t1); - $c1 = -$r1 * sin($t1); - $d1 = $r2 * cos($t1); - - $this->addContent( - sprintf( - "\n%.3F %.3F %.3F %.3F %.3F %.3F c", - ($a0 + $c0 * $dtm), - ($b0 + $d0 * $dtm), - ($a1 - $c1 * $dtm), - ($b1 - $d1 * $dtm), - $a1, - $b1 - ) - ); - - $a0 = $a1; - $b0 = $b1; - $c0 = $c1; - $d0 = $d1; - } - - if (!$incomplete) { - if ($fill) { - $this->addContent(' f'); - } - - if ($stroke) { - if ($close) { - $this->addContent(' s'); // small 's' signifies closing the path as well - } else { - $this->addContent(' S'); - } - } - } - - if ($angle != 0) { - $this->addContent(' Q'); - } - } - - /** - * this sets the line drawing style. - * width, is the thickness of the line in user units - * cap is the type of cap to put on the line, values can be 'butt','round','square' - * where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the - * end of the line. - * join can be 'miter', 'round', 'bevel' - * dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the - * on and off dashes. - * (2) represents 2 on, 2 off, 2 on , 2 off ... - * (2,1) is 2 on, 1 off, 2 on, 1 off.. etc - * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts. - */ - function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0) - { - // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day - $string = ''; - - if ($width > 0) { - $string .= sprintf("%.3F w", $width); - } - - $ca = array('butt' => 0, 'round' => 1, 'square' => 2); - - if (isset($ca[$cap])) { - $string .= " $ca[$cap] J"; - } - - $ja = array('miter' => 0, 'round' => 1, 'bevel' => 2); - - if (isset($ja[$join])) { - $string .= " $ja[$join] j"; - } - - if (is_array($dash)) { - $string .= ' [ ' . implode(' ', $dash) . " ] $phase d"; - } - - $this->currentLineStyle = $string; - $this->addContent("\n$string"); - } - - function rect($x1, $y1, $width, $height) - { - $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re", $x1, $y1, $width, $height)); - } - - function stroke() - { - $this->addContent("\nS"); - } - - function fill() - { - $this->addContent("\nf".($this->fillRule === "evenodd" ? "*" : "")); - } - - function fillStroke() - { - $this->addContent("\nb".($this->fillRule === "evenodd" ? "*" : "")); - } - - /** - * save the current graphic state - */ - function save() - { - $this->addContent("\nq"); - } - - /** - * restore the last graphic state - */ - function restore() - { - $this->addContent("\nQ"); - } - - /** - * scale - * - * @param float $s_x scaling factor for width as percent - * @param float $s_y scaling factor for height as percent - * @param float $x Origin abscisse - * @param float $y Origin ordinate - */ - function scale($s_x, $s_y, $x, $y) - { - $y = $this->currentPageSize["height"] - $y; - - $tm = array( - $s_x, 0, - 0, $s_y, - $x * (1 - $s_x), $y * (1 - $s_y) - ); - - $this->transform($tm); - } - - /** - * translate - * - * @param float $t_x movement to the right - * @param float $t_y movement to the bottom - */ - function translate($t_x, $t_y) - { - $tm = array( - 1, 0, - 0, 1, - $t_x, -$t_y - ); - - $this->transform($tm); - } - - /** - * rotate - * - * @param float $angle angle in degrees for counter-clockwise rotation - * @param float $x Origin abscisse - * @param float $y Origin ordinate - */ - function rotate($angle, $x, $y) - { - $y = $this->currentPageSize["height"] - $y; - - $a = deg2rad($angle); - $cos_a = cos($a); - $sin_a = sin($a); - - $tm = array( - $cos_a, -$sin_a, - $sin_a, $cos_a, - $x - $sin_a * $y - $cos_a * $x, $y - $cos_a * $y + $sin_a * $x, - ); - - $this->transform($tm); - } - - /** - * skew - * - * @param float $angle_x - * @param float $angle_y - * @param float $x Origin abscisse - * @param float $y Origin ordinate - */ - function skew($angle_x, $angle_y, $x, $y) - { - $y = $this->currentPageSize["height"] - $y; - - $tan_x = tan(deg2rad($angle_x)); - $tan_y = tan(deg2rad($angle_y)); - - $tm = array( - 1, -$tan_y, - -$tan_x, 1, - $tan_x * $y, $tan_y * $x, - ); - - $this->transform($tm); - } - - /** - * apply graphic transformations - * - * @param array $tm transformation matrix - */ - function transform($tm) - { - $this->addContent(vsprintf("\n %.3F %.3F %.3F %.3F %.3F %.3F cm", $tm)); - } - - /** - * add a new page to the document - * this also makes the new page the current active object - */ - function newPage($insert = 0, $id = 0, $pos = 'after') - { - // if there is a state saved, then go up the stack closing them - // then on the new page, re-open them with the right setings - - if ($this->nStateStack) { - for ($i = $this->nStateStack; $i >= 1; $i--) { - $this->restoreState($i); - } - } - - $this->numObj++; - - if ($insert) { - // the id from the ezPdf class is the id of the contents of the page, not the page object itself - // query that object to find the parent - $rid = $this->objects[$id]['onPage']; - $opt = array('rid' => $rid, 'pos' => $pos); - $this->o_page($this->numObj, 'new', $opt); - } else { - $this->o_page($this->numObj, 'new'); - } - - // if there is a stack saved, then put that onto the page - if ($this->nStateStack) { - for ($i = 1; $i <= $this->nStateStack; $i++) { - $this->saveState($i); - } - } - - // and if there has been a stroke or fill color set, then transfer them - if (isset($this->currentColor)) { - $this->setColor($this->currentColor, true); - } - - if (isset($this->currentStrokeColor)) { - $this->setStrokeColor($this->currentStrokeColor, true); - } - - // if there is a line style set, then put this in too - if (mb_strlen($this->currentLineStyle, '8bit')) { - $this->addContent("\n$this->currentLineStyle"); - } - - // the call to the o_page object set currentContents to the present page, so this can be returned as the page id - return $this->currentContents; - } - - /** - * output the pdf code, streaming it to the browser - * the relevant headers are set so that hopefully the browser will recognise it - */ - function stream($options = '') - { - // setting the options allows the adjustment of the headers - // values at the moment are: - // 'Content-Disposition' => 'filename' - sets the filename, though not too sure how well this will - // work as in my trial the browser seems to use the filename of the php file with .pdf on the end - // 'Accept-Ranges' => 1 or 0 - if this is not set to 1, then this header is not included, off by default - // this header seems to have caused some problems despite tha fact that it is supposed to solve - // them, so I am leaving it off by default. - // 'compress' = > 1 or 0 - apply content stream compression, this is on (1) by default - // 'Attachment' => 1 or 0 - if 1, force the browser to open a download dialog - if (!is_array($options)) { - $options = array(); - } - - if (headers_sent()) { - die("Unable to stream pdf: headers already sent"); - } - - $debug = empty($options['compression']); - $tmp = ltrim($this->output($debug)); - - header("Cache-Control: private"); - header("Content-type: application/pdf"); - - //FIXME: I don't know that this is sufficient for determining content length (i.e. what about transport compression?) - header("Content-Length: " . mb_strlen($tmp, '8bit')); - $fileName = (isset($options['Content-Disposition']) ? $options['Content-Disposition'] : 'file.pdf'); - - if (!isset($options["Attachment"])) { - $options["Attachment"] = true; - } - - $attachment = $options["Attachment"] ? "attachment" : "inline"; - - // detect the character encoding of the incoming file - $encoding = mb_detect_encoding($fileName); - $fallbackfilename = mb_convert_encoding($fileName, "ISO-8859-1", $encoding); - $encodedfallbackfilename = rawurlencode($fallbackfilename); - $encodedfilename = rawurlencode($fileName); - - header( - "Content-Disposition: $attachment; filename=" . $encodedfallbackfilename . "; filename*=UTF-8''$encodedfilename" - ); - - if (isset($options['Accept-Ranges']) && $options['Accept-Ranges'] == 1) { - //FIXME: Is this the correct value ... spec says 1#range-unit - header("Accept-Ranges: " . mb_strlen($tmp, '8bit')); - } - - echo $tmp; - flush(); - } - - /** - * return the height in units of the current font in the given size - */ - function getFontHeight($size) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $font = $this->fonts[$this->currentFont]; - - // for the current font, and the given size, what is the height of the font in user units - if (isset($font['Ascender']) && isset($font['Descender'])) { - $h = $font['Ascender'] - $font['Descender']; - } else { - $h = $font['FontBBox'][3] - $font['FontBBox'][1]; - } - - // have to adjust by a font offset for Windows fonts. unfortunately it looks like - // the bounding box calculations are wrong and I don't know why. - if (isset($font['FontHeightOffset'])) { - // For CourierNew from Windows this needs to be -646 to match the - // Adobe native Courier font. - // - // For FreeMono from GNU this needs to be -337 to match the - // Courier font. - // - // Both have been added manually to the .afm and .ufm files. - $h += (int)$font['FontHeightOffset']; - } - - return $size * $h / 1000; - } - - function getFontXHeight($size) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $font = $this->fonts[$this->currentFont]; - - // for the current font, and the given size, what is the height of the font in user units - if (isset($font['XHeight'])) { - $xh = $font['Ascender'] - $font['Descender']; - } else { - $xh = $this->getFontHeight($size) / 2; - } - - return $size * $xh / 1000; - } - - /** - * return the font descender, this will normally return a negative number - * if you add this number to the baseline, you get the level of the bottom of the font - * it is in the pdf user units - */ - function getFontDescender($size) - { - // note that this will most likely return a negative value - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - //$h = $this->fonts[$this->currentFont]['FontBBox'][1]; - $h = $this->fonts[$this->currentFont]['Descender']; - - return $size * $h / 1000; - } - - /** - * filter the text, this is applied to all text just before being inserted into the pdf document - * it escapes the various things that need to be escaped, and so on - * - * @access private - */ - function filterText($text, $bom = true, $convert_encoding = true) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - if ($convert_encoding) { - $cf = $this->currentFont; - if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) { - //$text = html_entity_decode($text, ENT_QUOTES, 'UTF-8'); - $text = $this->utf8toUtf16BE($text, $bom); - } else { - //$text = html_entity_decode($text, ENT_QUOTES); - $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8'); - } - } - - // the chr(13) substitution fixes a bug seen in TCPDF (bug #1421290) - return strtr($text, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r')); - } - - /** - * given a start position and information about how text is to be laid out, calculate where - * on the page the text will end - */ - private function getTextPosition($x, $y, $angle, $size, $wa, $text) - { - // given this information return an array containing x and y for the end position as elements 0 and 1 - $w = $this->getTextWidth($size, $text); - - // need to adjust for the number of spaces in this text - $words = explode(' ', $text); - $nspaces = count($words) - 1; - $w += $wa * $nspaces; - $a = deg2rad((float)$angle); - - return array(cos($a) * $w + $x, -sin($a) * $w + $y); - } - - /** - * Callback method used by smallCaps - * - * @param array $matches - * - * @return string - */ - function toUpper($matches) - { - return mb_strtoupper($matches[0]); - } - - function concatMatches($matches) - { - $str = ""; - foreach ($matches as $match) { - $str .= $match[0]; - } - - return $str; - } - - /** - * add text to the document, at a specified location, size and angle on the page - */ - function registerText($font, $text) - { - if (!$this->isUnicode || in_array(mb_strtolower(basename($font)), self::$coreFonts)) { - return; - } - - if (!isset($this->stringSubsets[$font])) { - $this->stringSubsets[$font] = array(); - } - - $this->stringSubsets[$font] = array_unique( - array_merge($this->stringSubsets[$font], $this->utf8toCodePointsArray($text)) - ); - } - - /** - * add text to the document, at a specified location, size and angle on the page - */ - function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false) - { - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $text = str_replace(array("\r", "\n"), "", $text); - - if ($smallCaps) { - preg_match_all("/(\P{Ll}+)/u", $text, $matches, PREG_SET_ORDER); - $lower = $this->concatMatches($matches); - d($lower); - - preg_match_all("/(\p{Ll}+)/u", $text, $matches, PREG_SET_ORDER); - $other = $this->concatMatches($matches); - d($other); - - //$text = preg_replace_callback("/\p{Ll}/u", array($this, "toUpper"), $text); - } - - // if there are any open callbacks, then they should be called, to show the start of the line - if ($this->nCallback > 0) { - for ($i = $this->nCallback; $i > 0; $i--) { - // call each function - $info = array( - 'x' => $x, - 'y' => $y, - 'angle' => $angle, - 'status' => 'sol', - 'p' => $this->callback[$i]['p'], - 'nCallback' => $this->callback[$i]['nCallback'], - 'height' => $this->callback[$i]['height'], - 'descender' => $this->callback[$i]['descender'] - ); - - $func = $this->callback[$i]['f']; - $this->$func($info); - } - } - - if ($angle == 0) { - $this->addContent(sprintf("\nBT %.3F %.3F Td", $x, $y)); - } else { - $a = deg2rad((float)$angle); - $this->addContent( - sprintf("\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm", cos($a), -sin($a), sin($a), cos($a), $x, $y) - ); - } - - if ($wordSpaceAdjust != 0 || $wordSpaceAdjust != $this->wordSpaceAdjust) { - $this->wordSpaceAdjust = $wordSpaceAdjust; - $this->addContent(sprintf(" %.3F Tw", $wordSpaceAdjust)); - } - - if ($charSpaceAdjust != 0 || $charSpaceAdjust != $this->charSpaceAdjust) { - $this->charSpaceAdjust = $charSpaceAdjust; - $this->addContent(sprintf(" %.3F Tc", $charSpaceAdjust)); - } - - $len = mb_strlen($text); - $start = 0; - - if ($start < $len) { - $part = $text; // OAR - Don't need this anymore, given that $start always equals zero. substr($text, $start); - $place_text = $this->filterText($part, false); - // modify unicode text so that extra word spacing is manually implemented (bug #) - $cf = $this->currentFont; - if ($this->fonts[$cf]['isUnicode'] && $wordSpaceAdjust != 0) { - $space_scale = 1000 / $size; - //$place_text = str_replace(' ', ') ( ) '.($this->getTextWidth($size, chr(32), $wordSpaceAdjust)*-75).' (', $place_text); - $place_text = str_replace(' ', ' ) ' . (-round($space_scale * $wordSpaceAdjust)) . ' (', $place_text); - } - $this->addContent(" /F$this->currentFontNum " . sprintf('%.1F Tf ', $size)); - $this->addContent(" [($place_text)] TJ"); - } - - $this->addContent(' ET'); - - // if there are any open callbacks, then they should be called, to show the end of the line - if ($this->nCallback > 0) { - for ($i = $this->nCallback; $i > 0; $i--) { - // call each function - $tmp = $this->getTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text); - $info = array( - 'x' => $tmp[0], - 'y' => $tmp[1], - 'angle' => $angle, - 'status' => 'eol', - 'p' => $this->callback[$i]['p'], - 'nCallback' => $this->callback[$i]['nCallback'], - 'height' => $this->callback[$i]['height'], - 'descender' => $this->callback[$i]['descender'] - ); - $func = $this->callback[$i]['f']; - $this->$func($info); - } - } - } - - /** - * calculate how wide a given text string will be on a page, at a given size. - * this can be called externally, but is also used by the other class functions - */ - function getTextWidth($size, $text, $word_spacing = 0, $char_spacing = 0) - { - static $ord_cache = array(); - - // this function should not change any of the settings, though it will need to - // track any directives which change during calculation, so copy them at the start - // and put them back at the end. - $store_currentTextState = $this->currentTextState; - - if (!$this->numFonts) { - $this->selectFont($this->defaultFont); - } - - $text = str_replace(array("\r", "\n"), "", $text); - - // converts a number or a float to a string so it can get the width - $text = "$text"; - - // hmm, this is where it all starts to get tricky - use the font information to - // calculate the width of each character, add them up and convert to user units - $w = 0; - $cf = $this->currentFont; - $current_font = $this->fonts[$cf]; - $space_scale = 1000 / ($size > 0 ? $size : 1); - $n_spaces = 0; - - if ($current_font['isUnicode']) { - // for Unicode, use the code points array to calculate width rather - // than just the string itself - $unicode = $this->utf8toCodePointsArray($text); - - foreach ($unicode as $char) { - // check if we have to replace character - if (isset($current_font['differences'][$char])) { - $char = $current_font['differences'][$char]; - } - - if (isset($current_font['C'][$char])) { - $char_width = $current_font['C'][$char]; - - // add the character width - $w += $char_width; - - // add additional padding for space - if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space - $w += $word_spacing * $space_scale; - $n_spaces++; - } - } - } - - // add additionnal char spacing - if ($char_spacing != 0) { - $w += $char_spacing * $space_scale * (count($unicode) + $n_spaces); - } - - } else { - // If CPDF is in Unicode mode but the current font does not support Unicode we need to convert the character set to Windows-1252 - if ($this->isUnicode) { - $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8'); - } - - $len = mb_strlen($text, 'Windows-1252'); - - for ($i = 0; $i < $len; $i++) { - $c = $text[$i]; - $char = isset($ord_cache[$c]) ? $ord_cache[$c] : ($ord_cache[$c] = ord($c)); - - // check if we have to replace character - if (isset($current_font['differences'][$char])) { - $char = $current_font['differences'][$char]; - } - - if (isset($current_font['C'][$char])) { - $char_width = $current_font['C'][$char]; - - // add the character width - $w += $char_width; - - // add additional padding for space - if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space - $w += $word_spacing * $space_scale; - $n_spaces++; - } - } - } - - // add additionnal char spacing - if ($char_spacing != 0) { - $w += $char_spacing * $space_scale * ($len + $n_spaces); - } - } - - $this->currentTextState = $store_currentTextState; - $this->setCurrentFont(); - - return $w * $size / 1000; - } - - /** - * this will be called at a new page to return the state to what it was on the - * end of the previous page, before the stack was closed down - * This is to get around not being able to have open 'q' across pages - * - */ - function saveState($pageEnd = 0) - { - if ($pageEnd) { - // this will be called at a new page to return the state to what it was on the - // end of the previous page, before the stack was closed down - // This is to get around not being able to have open 'q' across pages - $opt = $this->stateStack[$pageEnd]; - // ok to use this as stack starts numbering at 1 - $this->setColor($opt['col'], true); - $this->setStrokeColor($opt['str'], true); - $this->addContent("\n" . $opt['lin']); - // $this->currentLineStyle = $opt['lin']; - } else { - $this->nStateStack++; - $this->stateStack[$this->nStateStack] = array( - 'col' => $this->currentColor, - 'str' => $this->currentStrokeColor, - 'lin' => $this->currentLineStyle - ); - } - - $this->save(); - } - - /** - * restore a previously saved state - */ - function restoreState($pageEnd = 0) - { - if (!$pageEnd) { - $n = $this->nStateStack; - $this->currentColor = $this->stateStack[$n]['col']; - $this->currentStrokeColor = $this->stateStack[$n]['str']; - $this->addContent("\n" . $this->stateStack[$n]['lin']); - $this->currentLineStyle = $this->stateStack[$n]['lin']; - $this->stateStack[$n] = null; - unset($this->stateStack[$n]); - $this->nStateStack--; - } - - $this->restore(); - } - - /** - * make a loose object, the output will go into this object, until it is closed, then will revert to - * the current one. - * this object will not appear until it is included within a page. - * the function will return the object number - */ - function openObject() - { - $this->nStack++; - $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage); - // add a new object of the content type, to hold the data flow - $this->numObj++; - $this->o_contents($this->numObj, 'new'); - $this->currentContents = $this->numObj; - $this->looseObjects[$this->numObj] = 1; - - return $this->numObj; - } - - /** - * open an existing object for editing - */ - function reopenObject($id) - { - $this->nStack++; - $this->stack[$this->nStack] = array('c' => $this->currentContents, 'p' => $this->currentPage); - $this->currentContents = $id; - - // also if this object is the primary contents for a page, then set the current page to its parent - if (isset($this->objects[$id]['onPage'])) { - $this->currentPage = $this->objects[$id]['onPage']; - } - } - - /** - * close an object - */ - function closeObject() - { - // close the object, as long as there was one open in the first place, which will be indicated by - // an objectId on the stack. - if ($this->nStack > 0) { - $this->currentContents = $this->stack[$this->nStack]['c']; - $this->currentPage = $this->stack[$this->nStack]['p']; - $this->nStack--; - // easier to probably not worry about removing the old entries, they will be overwritten - // if there are new ones. - } - } - - /** - * stop an object from appearing on pages from this point on - */ - function stopObject($id) - { - // if an object has been appearing on pages up to now, then stop it, this page will - // be the last one that could contian it. - if (isset($this->addLooseObjects[$id])) { - $this->addLooseObjects[$id] = ''; - } - } - - /** - * after an object has been created, it wil only show if it has been added, using this function. - */ - function addObject($id, $options = 'add') - { - // add the specified object to the page - if (isset($this->looseObjects[$id]) && $this->currentContents != $id) { - // then it is a valid object, and it is not being added to itself - switch ($options) { - case 'all': - // then this object is to be added to this page (done in the next block) and - // all future new pages. - $this->addLooseObjects[$id] = 'all'; - - case 'add': - if (isset($this->objects[$this->currentContents]['onPage'])) { - // then the destination contents is the primary for the page - // (though this object is actually added to that page) - $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id); - } - break; - - case 'even': - $this->addLooseObjects[$id] = 'even'; - $pageObjectId = $this->objects[$this->currentContents]['onPage']; - if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 0) { - $this->addObject($id); - // hacky huh :) - } - break; - - case 'odd': - $this->addLooseObjects[$id] = 'odd'; - $pageObjectId = $this->objects[$this->currentContents]['onPage']; - if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 1) { - $this->addObject($id); - // hacky huh :) - } - break; - - case 'next': - $this->addLooseObjects[$id] = 'all'; - break; - - case 'nexteven': - $this->addLooseObjects[$id] = 'even'; - break; - - case 'nextodd': - $this->addLooseObjects[$id] = 'odd'; - break; - } - } - } - - /** - * return a storable representation of a specific object - */ - function serializeObject($id) - { - if (array_key_exists($id, $this->objects)) { - return serialize($this->objects[$id]); - } - } - - /** - * restore an object from its stored representation. returns its new object id. - */ - function restoreSerializedObject($obj) - { - $obj_id = $this->openObject(); - $this->objects[$obj_id] = unserialize($obj); - $this->closeObject(); - - return $obj_id; - } - - /** - * add content to the documents info object - */ - function addInfo($label, $value = 0) - { - // this will only work if the label is one of the valid ones. - // modify this so that arrays can be passed as well. - // if $label is an array then assume that it is key => value pairs - // else assume that they are both scalar, anything else will probably error - if (is_array($label)) { - foreach ($label as $l => $v) { - $this->o_info($this->infoObject, $l, $v); - } - } else { - $this->o_info($this->infoObject, $label, $value); - } - } - - /** - * set the viewer preferences of the document, it is up to the browser to obey these. - */ - function setPreferences($label, $value = 0) - { - // this will only work if the label is one of the valid ones. - if (is_array($label)) { - foreach ($label as $l => $v) { - $this->o_catalog($this->catalogId, 'viewerPreferences', array($l => $v)); - } - } else { - $this->o_catalog($this->catalogId, 'viewerPreferences', array($label => $value)); - } - } - - /** - * extract an integer from a position in a byte stream - */ - private function getBytes(&$data, $pos, $num) - { - // return the integer represented by $num bytes from $pos within $data - $ret = 0; - for ($i = 0; $i < $num; $i++) { - $ret *= 256; - $ret += ord($data[$pos + $i]); - } - - return $ret; - } - - /** - * Check if image already added to pdf image directory. - * If yes, need not to create again (pass empty data) - */ - function image_iscached($imgname) - { - return isset($this->imagelist[$imgname]); - } - - /** - * add a PNG image into the document, from a GD object - * this should work with remote files - * - * @param string $file The PNG file - * @param float $x X position - * @param float $y Y position - * @param float $w Width - * @param float $h Height - * @param resource $img A GD resource - * @param bool $is_mask true if the image is a mask - * @param bool $mask true if the image is masked - */ - function addImagePng($file, $x, $y, $w = 0.0, $h = 0.0, &$img, $is_mask = false, $mask = null) - { - if (!function_exists("imagepng")) { - throw new Exception("The PHP GD extension is required, but is not installed."); - } - - //if already cached, need not to read again - if (isset($this->imagelist[$file])) { - $data = null; - } else { - // Example for transparency handling on new image. Retain for current image - // $tIndex = imagecolortransparent($img); - // if ($tIndex > 0) { - // $tColor = imagecolorsforindex($img, $tIndex); - // $new_tIndex = imagecolorallocate($new_img, $tColor['red'], $tColor['green'], $tColor['blue']); - // imagefill($new_img, 0, 0, $new_tIndex); - // imagecolortransparent($new_img, $new_tIndex); - // } - // blending mode (literal/blending) on drawing into current image. not relevant when not saved or not drawn - //imagealphablending($img, true); - - //default, but explicitely set to ensure pdf compatibility - imagesavealpha($img, false/*!$is_mask && !$mask*/); - - $error = 0; - - ob_start(); - @imagepng($img); - $data = ob_get_clean(); - - if ($data == '') { - $error = 1; - $errormsg = 'trouble writing file from GD'; - } - - if ($error) { - $this->addMessage('PNG error - (' . $file . ') ' . $errormsg); - - return; - } - } //End isset($this->imagelist[$file]) (png Duplicate removal) - - $this->addPngFromBuf($file, $x, $y, $w, $h, $data, $is_mask, $mask); - } - - protected function addImagePngAlpha($file, $x, $y, $w, $h, $byte) - { - // generate images - $img = imagecreatefrompng($file); - - if ($img === false) { - return; - } - - // FIXME The pixel transformation doesn't work well with 8bit PNGs - $eight_bit = ($byte & 4) !== 4; - - $wpx = imagesx($img); - $hpx = imagesy($img); - - imagesavealpha($img, false); - - // create temp alpha file - $tempfile_alpha = tempnam($this->tmp, "cpdf_img_"); - @unlink($tempfile_alpha); - $tempfile_alpha = "$tempfile_alpha.png"; - - // create temp plain file - $tempfile_plain = tempnam($this->tmp, "cpdf_img_"); - @unlink($tempfile_plain); - $tempfile_plain = "$tempfile_plain.png"; - - $imgalpha = imagecreate($wpx, $hpx); - imagesavealpha($imgalpha, false); - - // generate gray scale palette (0 -> 255) - for ($c = 0; $c < 256; ++$c) { - imagecolorallocate($imgalpha, $c, $c, $c); - } - - // Use PECL gmagick + Graphics Magic to process transparent PNG images - if (extension_loaded("gmagick")) { - $gmagick = new Gmagick($file); - $gmagick->setimageformat('png'); - - // Get opacity channel (negative of alpha channel) - $alpha_channel_neg = clone $gmagick; - $alpha_channel_neg->separateimagechannel(Gmagick::CHANNEL_OPACITY); - - // Negate opacity channel - $alpha_channel = new Gmagick(); - $alpha_channel->newimage($wpx, $hpx, "#FFFFFF", "png"); - $alpha_channel->compositeimage($alpha_channel_neg, Gmagick::COMPOSITE_DIFFERENCE, 0, 0); - $alpha_channel->separateimagechannel(Gmagick::CHANNEL_RED); - $alpha_channel->writeimage($tempfile_alpha); - - // Cast to 8bit+palette - $imgalpha_ = imagecreatefrompng($tempfile_alpha); - imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx); - imagedestroy($imgalpha_); - imagepng($imgalpha, $tempfile_alpha); - - // Make opaque image - $color_channels = new Gmagick(); - $color_channels->newimage($wpx, $hpx, "#FFFFFF", "png"); - $color_channels->compositeimage($gmagick, Gmagick::COMPOSITE_COPYRED, 0, 0); - $color_channels->compositeimage($gmagick, Gmagick::COMPOSITE_COPYGREEN, 0, 0); - $color_channels->compositeimage($gmagick, Gmagick::COMPOSITE_COPYBLUE, 0, 0); - $color_channels->writeimage($tempfile_plain); - - $imgplain = imagecreatefrompng($tempfile_plain); - } // Use PECL imagick + ImageMagic to process transparent PNG images - elseif (extension_loaded("imagick")) { - // Native cloning was added to pecl-imagick in svn commit 263814 - // the first version containing it was 3.0.1RC1 - static $imagickClonable = null; - if ($imagickClonable === null) { - $imagickClonable = version_compare(phpversion('imagick'), '3.0.1rc1') > 0; - } - - $imagick = new Imagick($file); - $imagick->setFormat('png'); - - // Get opacity channel (negative of alpha channel) - $alpha_channel = $imagickClonable ? clone $imagick : $imagick->clone(); - $alpha_channel->separateImageChannel(Imagick::CHANNEL_ALPHA); - $alpha_channel->negateImage(true); - $alpha_channel->writeImage($tempfile_alpha); - - // Cast to 8bit+palette - $imgalpha_ = imagecreatefrompng($tempfile_alpha); - imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx); - imagedestroy($imgalpha_); - imagepng($imgalpha, $tempfile_alpha); - - // Make opaque image - $color_channels = new Imagick(); - $color_channels->newImage($wpx, $hpx, "#FFFFFF", "png"); - $color_channels->compositeImage($imagick, Imagick::COMPOSITE_COPYRED, 0, 0); - $color_channels->compositeImage($imagick, Imagick::COMPOSITE_COPYGREEN, 0, 0); - $color_channels->compositeImage($imagick, Imagick::COMPOSITE_COPYBLUE, 0, 0); - $color_channels->writeImage($tempfile_plain); - - $imgplain = imagecreatefrompng($tempfile_plain); - } else { - // allocated colors cache - $allocated_colors = array(); - - // extract alpha channel - for ($xpx = 0; $xpx < $wpx; ++$xpx) { - for ($ypx = 0; $ypx < $hpx; ++$ypx) { - $color = imagecolorat($img, $xpx, $ypx); - $col = imagecolorsforindex($img, $color); - $alpha = $col['alpha']; - - if ($eight_bit) { - // with gamma correction - $gammacorr = 2.2; - $pixel = pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255; - } else { - // without gamma correction - $pixel = (127 - $alpha) * 2; - - $key = $col['red'] . $col['green'] . $col['blue']; - - if (!isset($allocated_colors[$key])) { - $pixel_img = imagecolorallocate($img, $col['red'], $col['green'], $col['blue']); - $allocated_colors[$key] = $pixel_img; - } else { - $pixel_img = $allocated_colors[$key]; - } - - imagesetpixel($img, $xpx, $ypx, $pixel_img); - } - - imagesetpixel($imgalpha, $xpx, $ypx, $pixel); - } - } - - // extract image without alpha channel - $imgplain = imagecreatetruecolor($wpx, $hpx); - imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx); - imagedestroy($img); - - imagepng($imgalpha, $tempfile_alpha); - imagepng($imgplain, $tempfile_plain); - } - - // embed mask image - $this->addImagePng($tempfile_alpha, $x, $y, $w, $h, $imgalpha, true); - imagedestroy($imgalpha); - - // embed image, masked with previously embedded mask - $this->addImagePng($tempfile_plain, $x, $y, $w, $h, $imgplain, false, true); - imagedestroy($imgplain); - - // remove temp files - unlink($tempfile_alpha); - unlink($tempfile_plain); - } - - /** - * add a PNG image into the document, from a file - * this should work with remote files - */ - function addPngFromFile($file, $x, $y, $w = 0, $h = 0) - { - if (!function_exists("imagecreatefrompng")) { - throw new Exception("The PHP GD extension is required, but is not installed."); - } - - //if already cached, need not to read again - if (isset($this->imagelist[$file])) { - $img = null; - } else { - $info = file_get_contents($file, false, null, 24, 5); - $meta = unpack("CbitDepth/CcolorType/CcompressionMethod/CfilterMethod/CinterlaceMethod", $info); - $bit_depth = $meta["bitDepth"]; - $color_type = $meta["colorType"]; - - // http://www.w3.org/TR/PNG/#11IHDR - // 3 => indexed - // 4 => greyscale with alpha - // 6 => fullcolor with alpha - $is_alpha = in_array($color_type, array(4, 6)) || ($color_type == 3 && $bit_depth != 4); - - if ($is_alpha) { // exclude grayscale alpha - return $this->addImagePngAlpha($file, $x, $y, $w, $h, $color_type); - } - - //png files typically contain an alpha channel. - //pdf file format or class.pdf does not support alpha blending. - //on alpha blended images, more transparent areas have a color near black. - //This appears in the result on not storing the alpha channel. - //Correct would be the box background image or its parent when transparent. - //But this would make the image dependent on the background. - //Therefore create an image with white background and copy in - //A more natural background than black is white. - //Therefore create an empty image with white background and merge the - //image in with alpha blending. - $imgtmp = @imagecreatefrompng($file); - if (!$imgtmp) { - return; - } - $sx = imagesx($imgtmp); - $sy = imagesy($imgtmp); - $img = imagecreatetruecolor($sx, $sy); - imagealphablending($img, true); - - // @todo is it still needed ?? - $ti = imagecolortransparent($imgtmp); - if ($ti >= 0) { - $tc = imagecolorsforindex($imgtmp, $ti); - $ti = imagecolorallocate($img, $tc['red'], $tc['green'], $tc['blue']); - imagefill($img, 0, 0, $ti); - imagecolortransparent($img, $ti); - } else { - imagefill($img, 1, 1, imagecolorallocate($img, 255, 255, 255)); - } - - imagecopy($img, $imgtmp, 0, 0, 0, 0, $sx, $sy); - imagedestroy($imgtmp); - } - $this->addImagePng($file, $x, $y, $w, $h, $img); - - if ($img) { - imagedestroy($img); - } - } - - /** - * add a PNG image into the document, from a memory buffer of the file - */ - function addPngFromBuf($file, $x, $y, $w = 0.0, $h = 0.0, &$data, $is_mask = false, $mask = null) - { - if (isset($this->imagelist[$file])) { - $data = null; - $info['width'] = $this->imagelist[$file]['w']; - $info['height'] = $this->imagelist[$file]['h']; - $label = $this->imagelist[$file]['label']; - } else { - if ($data == null) { - $this->addMessage('addPngFromBuf error - data not present!'); - - return; - } - - $error = 0; - - if (!$error) { - $header = chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10); - - if (mb_substr($data, 0, 8, '8bit') != $header) { - $error = 1; - - $errormsg = 'this file does not have a valid header'; - } - } - - if (!$error) { - // set pointer - $p = 8; - $len = mb_strlen($data, '8bit'); - - // cycle through the file, identifying chunks - $haveHeader = 0; - $info = array(); - $idata = ''; - $pdata = ''; - - while ($p < $len) { - $chunkLen = $this->getBytes($data, $p, 4); - $chunkType = mb_substr($data, $p + 4, 4, '8bit'); - - switch ($chunkType) { - case 'IHDR': - // this is where all the file information comes from - $info['width'] = $this->getBytes($data, $p + 8, 4); - $info['height'] = $this->getBytes($data, $p + 12, 4); - $info['bitDepth'] = ord($data[$p + 16]); - $info['colorType'] = ord($data[$p + 17]); - $info['compressionMethod'] = ord($data[$p + 18]); - $info['filterMethod'] = ord($data[$p + 19]); - $info['interlaceMethod'] = ord($data[$p + 20]); - - //print_r($info); - $haveHeader = 1; - if ($info['compressionMethod'] != 0) { - $error = 1; - - //debugpng - if (DEBUGPNG) { - print '[addPngFromFile unsupported compression method ' . $file . ']'; - } - - $errormsg = 'unsupported compression method'; - } - - if ($info['filterMethod'] != 0) { - $error = 1; - - //debugpng - if (DEBUGPNG) { - print '[addPngFromFile unsupported filter method ' . $file . ']'; - } - - $errormsg = 'unsupported filter method'; - } - break; - - case 'PLTE': - $pdata .= mb_substr($data, $p + 8, $chunkLen, '8bit'); - break; - - case 'IDAT': - $idata .= mb_substr($data, $p + 8, $chunkLen, '8bit'); - break; - - case 'tRNS': - //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk - //print "tRNS found, color type = ".$info['colorType']."\n"; - $transparency = array(); - - switch ($info['colorType']) { - // indexed color, rbg - case 3: - /* corresponding to entries in the plte chunk - Alpha for palette index 0: 1 byte - Alpha for palette index 1: 1 byte - ...etc... - */ - // there will be one entry for each palette entry. up until the last non-opaque entry. - // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent) - $transparency['type'] = 'indexed'; - $trans = 0; - - for ($i = $chunkLen; $i >= 0; $i--) { - if (ord($data[$p + 8 + $i]) == 0) { - $trans = $i; - } - } - - $transparency['data'] = $trans; - break; - - // grayscale - case 0: - /* corresponding to entries in the plte chunk - Gray: 2 bytes, range 0 .. (2^bitdepth)-1 - */ - // $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale - $transparency['type'] = 'indexed'; - $transparency['data'] = ord($data[$p + 8 + 1]); - break; - - // truecolor - case 2: - /* corresponding to entries in the plte chunk - Red: 2 bytes, range 0 .. (2^bitdepth)-1 - Green: 2 bytes, range 0 .. (2^bitdepth)-1 - Blue: 2 bytes, range 0 .. (2^bitdepth)-1 - */ - $transparency['r'] = $this->getBytes($data, $p + 8, 2); - // r from truecolor - $transparency['g'] = $this->getBytes($data, $p + 10, 2); - // g from truecolor - $transparency['b'] = $this->getBytes($data, $p + 12, 2); - // b from truecolor - - $transparency['type'] = 'color-key'; - break; - - //unsupported transparency type - default: - if (DEBUGPNG) { - print '[addPngFromFile unsupported transparency type ' . $file . ']'; - } - break; - } - - // KS End new code - break; - - default: - break; - } - - $p += $chunkLen + 12; - } - - if (!$haveHeader) { - $error = 1; - - //debugpng - if (DEBUGPNG) { - print '[addPngFromFile information header is missing ' . $file . ']'; - } - - $errormsg = 'information header is missing'; - } - - if (isset($info['interlaceMethod']) && $info['interlaceMethod']) { - $error = 1; - - //debugpng - if (DEBUGPNG) { - print '[addPngFromFile no support for interlaced images in pdf ' . $file . ']'; - } - - $errormsg = 'There appears to be no support for interlaced images in pdf.'; - } - } - - if (!$error && $info['bitDepth'] > 8) { - $error = 1; - - //debugpng - if (DEBUGPNG) { - print '[addPngFromFile bit depth of 8 or less is supported ' . $file . ']'; - } - - $errormsg = 'only bit depth of 8 or less is supported'; - } - - if (!$error) { - switch ($info['colorType']) { - case 3: - $color = 'DeviceRGB'; - $ncolor = 1; - break; - - case 2: - $color = 'DeviceRGB'; - $ncolor = 3; - break; - - case 0: - $color = 'DeviceGray'; - $ncolor = 1; - break; - - default: - $error = 1; - - //debugpng - if (DEBUGPNG) { - print '[addPngFromFile alpha channel not supported: ' . $info['colorType'] . ' ' . $file . ']'; - } - - $errormsg = 'transparancey alpha channel not supported, transparency only supported for palette images.'; - } - } - - if ($error) { - $this->addMessage('PNG error - (' . $file . ') ' . $errormsg); - - return; - } - - //print_r($info); - // so this image is ok... add it in. - $this->numImages++; - $im = $this->numImages; - $label = "I$im"; - $this->numObj++; - - // $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width'])); - $options = array( - 'label' => $label, - 'data' => $idata, - 'bitsPerComponent' => $info['bitDepth'], - 'pdata' => $pdata, - 'iw' => $info['width'], - 'ih' => $info['height'], - 'type' => 'png', - 'color' => $color, - 'ncolor' => $ncolor, - 'masked' => $mask, - 'isMask' => $is_mask - ); - - if (isset($transparency)) { - $options['transparency'] = $transparency; - } - - $this->o_image($this->numObj, 'new', $options); - $this->imagelist[$file] = array('label' => $label, 'w' => $info['width'], 'h' => $info['height']); - } - - if ($is_mask) { - return; - } - - if ($w <= 0 && $h <= 0) { - $w = $info['width']; - $h = $info['height']; - } - - if ($w <= 0) { - $w = $h / $info['height'] * $info['width']; - } - - if ($h <= 0) { - $h = $w * $info['height'] / $info['width']; - } - - $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ", $w, $h, $x, $y, $label)); - } - - /** - * add a JPEG image into the document, from a file - */ - function addJpegFromFile($img, $x, $y, $w = 0, $h = 0) - { - // attempt to add a jpeg image straight from a file, using no GD commands - // note that this function is unable to operate on a remote file. - - if (!file_exists($img)) { - return; - } - - if ($this->image_iscached($img)) { - $data = null; - $imageWidth = $this->imagelist[$img]['w']; - $imageHeight = $this->imagelist[$img]['h']; - $channels = $this->imagelist[$img]['c']; - } else { - $tmp = getimagesize($img); - $imageWidth = $tmp[0]; - $imageHeight = $tmp[1]; - - if (isset($tmp['channels'])) { - $channels = $tmp['channels']; - } else { - $channels = 3; - } - - $data = file_get_contents($img); - } - - if ($w <= 0 && $h <= 0) { - $w = $imageWidth; - } - - if ($w == 0) { - $w = $h / $imageHeight * $imageWidth; - } - - if ($h == 0) { - $h = $w * $imageHeight / $imageWidth; - } - - $this->addJpegImage_common($data, $x, $y, $w, $h, $imageWidth, $imageHeight, $channels, $img); - } - - /** - * common code used by the two JPEG adding functions - */ - private function addJpegImage_common( - &$data, - $x, - $y, - $w = 0, - $h = 0, - $imageWidth, - $imageHeight, - $channels = 3, - $imgname - ) { - if ($this->image_iscached($imgname)) { - $label = $this->imagelist[$imgname]['label']; - //debugpng - //if (DEBUGPNG) print '[addJpegImage_common Duplicate '.$imgname.']'; - - } else { - if ($data == null) { - $this->addMessage('addJpegImage_common error - (' . $imgname . ') data not present!'); - - return; - } - - // note that this function is not to be called externally - // it is just the common code between the GD and the file options - $this->numImages++; - $im = $this->numImages; - $label = "I$im"; - $this->numObj++; - - $this->o_image( - $this->numObj, - 'new', - array( - 'label' => $label, - 'data' => &$data, - 'iw' => $imageWidth, - 'ih' => $imageHeight, - 'channels' => $channels - ) - ); - - $this->imagelist[$imgname] = array( - 'label' => $label, - 'w' => $imageWidth, - 'h' => $imageHeight, - 'c' => $channels - ); - } - - $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ ", $w, $h, $x, $y, $label)); - } - - /** - * specify where the document should open when it first starts - */ - function openHere($style, $a = 0, $b = 0, $c = 0) - { - // this function will open the document at a specified page, in a specified style - // the values for style, and the required paramters are: - // 'XYZ' left, top, zoom - // 'Fit' - // 'FitH' top - // 'FitV' left - // 'FitR' left,bottom,right - // 'FitB' - // 'FitBH' top - // 'FitBV' left - $this->numObj++; - $this->o_destination( - $this->numObj, - 'new', - array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c) - ); - $id = $this->catalogId; - $this->o_catalog($id, 'openHere', $this->numObj); - } - - /** - * Add JavaScript code to the PDF document - * - * @param string $code - * - * @return void - */ - function addJavascript($code) - { - $this->javascript .= $code; - } - - /** - * create a labelled destination within the document - */ - function addDestination($label, $style, $a = 0, $b = 0, $c = 0) - { - // associates the given label with the destination, it is done this way so that a destination can be specified after - // it has been linked to - // styles are the same as the 'openHere' function - $this->numObj++; - $this->o_destination( - $this->numObj, - 'new', - array('page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c) - ); - $id = $this->numObj; - - // store the label->idf relationship, note that this means that labels can be used only once - $this->destinations["$label"] = $id; - } - - /** - * define font families, this is used to initialize the font families for the default fonts - * and for the user to add new ones for their fonts. The default bahavious can be overridden should - * that be desired. - */ - function setFontFamily($family, $options = '') - { - if (!is_array($options)) { - if ($family === 'init') { - // set the known family groups - // these font families will be used to enable bold and italic markers to be included - // within text streams. html forms will be used... - $this->fontFamilies['Helvetica.afm'] = - array( - 'b' => 'Helvetica-Bold.afm', - 'i' => 'Helvetica-Oblique.afm', - 'bi' => 'Helvetica-BoldOblique.afm', - 'ib' => 'Helvetica-BoldOblique.afm' - ); - - $this->fontFamilies['Courier.afm'] = - array( - 'b' => 'Courier-Bold.afm', - 'i' => 'Courier-Oblique.afm', - 'bi' => 'Courier-BoldOblique.afm', - 'ib' => 'Courier-BoldOblique.afm' - ); - - $this->fontFamilies['Times-Roman.afm'] = - array( - 'b' => 'Times-Bold.afm', - 'i' => 'Times-Italic.afm', - 'bi' => 'Times-BoldItalic.afm', - 'ib' => 'Times-BoldItalic.afm' - ); - } - } else { - - // the user is trying to set a font family - // note that this can also be used to set the base ones to something else - if (mb_strlen($family)) { - $this->fontFamilies[$family] = $options; - } - } - } - - /** - * used to add messages for use in debugging - */ - function addMessage($message) - { - $this->messages .= $message . "\n"; - } - - /** - * a few functions which should allow the document to be treated transactionally. - */ - function transaction($action) - { - switch ($action) { - case 'start': - // store all the data away into the checkpoint variable - $data = get_object_vars($this); - $this->checkpoint = $data; - unset($data); - break; - - case 'commit': - if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) { - $tmp = $this->checkpoint['checkpoint']; - $this->checkpoint = $tmp; - unset($tmp); - } else { - $this->checkpoint = ''; - } - break; - - case 'rewind': - // do not destroy the current checkpoint, but move us back to the state then, so that we can try again - if (is_array($this->checkpoint)) { - // can only abort if were inside a checkpoint - $tmp = $this->checkpoint; - - foreach ($tmp as $k => $v) { - if ($k !== 'checkpoint') { - $this->$k = $v; - } - } - unset($tmp); - } - break; - - case 'abort': - if (is_array($this->checkpoint)) { - // can only abort if were inside a checkpoint - $tmp = $this->checkpoint; - foreach ($tmp as $k => $v) { - $this->$k = $v; - } - unset($tmp); - } - break; - } - } -} diff --git a/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php b/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php deleted file mode 100644 index fc85797..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php +++ /dev/null @@ -1,486 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Surface; - -use Svg\Document; -use Svg\Style; - -class SurfaceCpdf implements SurfaceInterface -{ - const DEBUG = false; - - /** @var \CPdf\CPdf */ - private $canvas; - - private $width; - private $height; - - /** @var Style */ - private $style; - - public function __construct(Document $doc, $canvas = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $dimensions = $doc->getDimensions(); - $w = $dimensions["width"]; - $h = $dimensions["height"]; - - if (!$canvas) { - $canvas = new \CPdf\CPdf(array(0, 0, $w, $h)); - $refl = new \ReflectionClass($canvas); - $canvas->fontcache = realpath(dirname($refl->getFileName()) . "/../../fonts/")."/"; - } - - // Flip PDF coordinate system so that the origin is in - // the top left rather than the bottom left - $canvas->transform(array( - 1, 0, - 0, -1, - 0, $h - )); - - $this->width = $w; - $this->height = $h; - - $this->canvas = $canvas; - } - - function out() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - return $this->canvas->output(); - } - - public function save() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->save(); - } - - public function restore() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->restore(); - } - - public function scale($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->transform($x, 0, 0, $y, 0, 0); - } - - public function rotate($angle) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $a = deg2rad($angle); - $cos_a = cos($a); - $sin_a = sin($a); - - $this->transform( - $cos_a, $sin_a, - -$sin_a, $cos_a, - 0, 0 - ); - } - - public function translate($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->transform( - 1, 0, - 0, 1, - $x, $y - ); - } - - public function transform($a, $b, $c, $d, $e, $f) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->canvas->transform(array($a, $b, $c, $d, $e, $f)); - } - - public function beginPath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - // TODO: Implement beginPath() method. - } - - public function closePath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->closePath(); - } - - public function fillStroke() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->fillStroke(); - } - - public function clip() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->clip(); - } - - public function fillText($text, $x, $y, $maxWidth = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->addText($x, $y, $this->style->fontSize, $text); - } - - public function strokeText($text, $x, $y, $maxWidth = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->addText($x, $y, $this->style->fontSize, $text); - } - - public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - if (strpos($image, "data:") === 0) { - $parts = explode(',', $image, 2); - - $data = $parts[1]; - $base64 = false; - - $token = strtok($parts[0], ';'); - while ($token !== false) { - if ($token == 'base64') { - $base64 = true; - } - - $token = strtok(';'); - } - - if ($base64) { - $data = base64_decode($data); - } - } - else { - $data = file_get_contents($image); - } - - $image = tempnam("", "svg"); - file_put_contents($image, $data); - - $img = $this->image($image, $sx, $sy, $sw, $sh, "normal"); - - - unlink($image); - } - - public static function getimagesize($filename) - { - static $cache = array(); - - if (isset($cache[$filename])) { - return $cache[$filename]; - } - - list($width, $height, $type) = getimagesize($filename); - - if ($width == null || $height == null) { - $data = file_get_contents($filename, null, null, 0, 26); - - if (substr($data, 0, 2) === "BM") { - $meta = unpack('vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight', $data); - $width = (int)$meta['width']; - $height = (int)$meta['height']; - $type = IMAGETYPE_BMP; - } - } - - return $cache[$filename] = array($width, $height, $type); - } - - function image($img, $x, $y, $w, $h, $resolution = "normal") - { - list($width, $height, $type) = $this->getimagesize($img); - - switch ($type) { - case IMAGETYPE_JPEG: - $this->canvas->addJpegFromFile($img, $x, $y - $h, $w, $h); - break; - - case IMAGETYPE_GIF: - case IMAGETYPE_BMP: - // @todo use cache for BMP and GIF - $img = $this->_convert_gif_bmp_to_png($img, $type); - - case IMAGETYPE_PNG: - $this->canvas->addPngFromFile($img, $x, $y - $h, $w, $h); - break; - - default: - } - } - - public function lineTo($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->lineTo($x, $y); - } - - public function moveTo($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->moveTo($x, $y); - } - - public function quadraticCurveTo($cpx, $cpy, $x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - // FIXME not accurate - $this->canvas->quadTo($cpx, $cpy, $x, $y); - } - - public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->curveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y); - } - - public function arcTo($x1, $y1, $x2, $y2, $radius) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - } - - public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->ellipse($x, $y, $radius, $radius, 0, 8, $startAngle, $endAngle, false, false, false, true); - } - - public function circle($x, $y, $radius) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->ellipse($x, $y, $radius, $radius, 0, 8, 0, 360, true, false, false, false); - } - - public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->ellipse($x, $y, $radiusX, $radiusY, 0, 8, 0, 360, false, false, false, false); - } - - public function fillRect($x, $y, $w, $h) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->rect($x, $y, $w, $h); - $this->fill(); - } - - public function rect($x, $y, $w, $h, $rx = 0, $ry = 0) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $canvas = $this->canvas; - - if ($rx <= 0.000001/* && $ry <= 0.000001*/) { - $canvas->rect($x, $y, $w, $h); - - return; - } - - $rx = min($rx, $w / 2); - $rx = min($rx, $h / 2); - - /* Define a path for a rectangle with corners rounded by a given radius. - * Start from the lower left corner and proceed counterclockwise. - */ - $this->moveTo($x + $rx, $y); - - /* Start of the arc segment in the lower right corner */ - $this->lineTo($x + $w - $rx, $y); - - /* Arc segment in the lower right corner */ - $this->arc($x + $w - $rx, $y + $rx, $rx, 270, 360); - - /* Start of the arc segment in the upper right corner */ - $this->lineTo($x + $w, $y + $h - $rx ); - - /* Arc segment in the upper right corner */ - $this->arc($x + $w - $rx, $y + $h - $rx, $rx, 0, 90); - - /* Start of the arc segment in the upper left corner */ - $this->lineTo($x + $rx, $y + $h); - - /* Arc segment in the upper left corner */ - $this->arc($x + $rx, $y + $h - $rx, $rx, 90, 180); - - /* Start of the arc segment in the lower left corner */ - $this->lineTo($x , $y + $rx); - - /* Arc segment in the lower left corner */ - $this->arc($x + $rx, $y + $rx, $rx, 180, 270); - } - - public function fill() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->fill(); - } - - public function strokeRect($x, $y, $w, $h) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->rect($x, $y, $w, $h); - $this->stroke(); - } - - public function stroke() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->stroke(); - } - - public function endPath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->endPath(); - } - - public function measureText($text) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $style = $this->getStyle(); - $this->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight); - - return $this->canvas->getTextWidth($this->getStyle()->fontSize, $text); - } - - public function getStyle() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - return $this->style; - } - - public function setStyle(Style $style) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->style = $style; - $canvas = $this->canvas; - - if (is_array($style->stroke) && $stroke = $style->stroke) { - $canvas->setStrokeColor(array((float)$stroke[0]/255, (float)$stroke[1]/255, (float)$stroke[2]/255), true); - } - - if (is_array($style->fill) && $fill = $style->fill) { - $canvas->setColor(array((float)$fill[0]/255, (float)$fill[1]/255, (float)$fill[2]/255), true); - } - - if ($fillRule = strtolower($style->fillRule)) { - $canvas->setFillRule($fillRule); - } - - $opacity = $style->opacity; - if ($opacity !== null && $opacity < 1.0) { - $canvas->setLineTransparency("Normal", $opacity); - $canvas->currentLineTransparency = null; - - $canvas->setFillTransparency("Normal", $opacity); - $canvas->currentFillTransparency = null; - } - else { - $fillOpacity = $style->fillOpacity; - if ($fillOpacity !== null && $fillOpacity < 1.0) { - $canvas->setFillTransparency("Normal", $fillOpacity); - $canvas->currentFillTransparency = null; - } - - $strokeOpacity = $style->strokeOpacity; - if ($strokeOpacity !== null && $strokeOpacity < 1.0) { - $canvas->setLineTransparency("Normal", $strokeOpacity); - $canvas->currentLineTransparency = null; - } - } - - $dashArray = null; - if ($style->strokeDasharray) { - $dashArray = preg_split('/\s*,\s*/', $style->strokeDasharray); - } - - $canvas->setLineStyle( - $style->strokeWidth, - $style->strokeLinecap, - $style->strokeLinejoin, - $dashArray - ); - - $this->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight); - } - - public function setFont($family, $style, $weight) - { - $map = array( - "serif" => "Times", - "sans-serif" => "Helvetica", - "fantasy" => "Symbol", - "cursive" => "Times", - "monospace" => "Courier", - - "arial" => "Helvetica", - "verdana" => "Helvetica", - ); - - $styleMap = array( - 'Helvetica' => array( - 'b' => 'Helvetica-Bold', - 'i' => 'Helvetica-Oblique', - 'bi' => 'Helvetica-BoldOblique', - ), - 'Courier' => array( - 'b' => 'Courier-Bold', - 'i' => 'Courier-Oblique', - 'bi' => 'Courier-BoldOblique', - ), - 'Times' => array( - '' => 'Times-Roman', - 'b' => 'Times-Bold', - 'i' => 'Times-Italic', - 'bi' => 'Times-BoldItalic', - ), - ); - - $family = strtolower($family); - $style = strtolower($style); - $weight = strtolower($weight); - - if (isset($map[$family])) { - $family = $map[$family]; - } - - if (isset($styleMap[$family])) { - $key = ""; - - if ($weight === "bold" || $weight === "bolder" || (is_numeric($weight) && $weight >= 600)) { - $key .= "b"; - } - - if ($style === "italic" || $style === "oblique") { - $key .= "i"; - } - - if (isset($styleMap[$family][$key])) { - $family = $styleMap[$family][$key]; - } - } - - $this->canvas->selectFont("$family.afm"); - } -} diff --git a/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceGmagick.php b/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceGmagick.php deleted file mode 100644 index 5d41906..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceGmagick.php +++ /dev/null @@ -1,308 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Surface; - -use Svg\Style; - -class SurfaceGmagick implements SurfaceInterface -{ - const DEBUG = false; - - /** @var \GmagickDraw */ - private $canvas; - - private $width; - private $height; - - /** @var Style */ - private $style; - - public function __construct($w, $h) - { - if (self::DEBUG) { - echo __FUNCTION__ . "\n"; - } - $this->width = $w; - $this->height = $h; - - $canvas = new \GmagickDraw(); - - $this->canvas = $canvas; - } - - function out() - { - if (self::DEBUG) { - echo __FUNCTION__ . "\n"; - } - - $image = new \Gmagick(); - $image->newimage($this->width, $this->height); - $image->drawimage($this->canvas); - - $tmp = tempnam("", "gm"); - - $image->write($tmp); - - return file_get_contents($tmp); - } - - public function save() - { - if (self::DEBUG) { - echo __FUNCTION__ . "\n"; - } - $this->canvas->save(); - } - - public function restore() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->restore(); - } - - public function scale($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->scale($x, $y); - } - - public function rotate($angle) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->rotate($angle); - } - - public function translate($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->translate($x, $y); - } - - public function transform($a, $b, $c, $d, $e, $f) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->concat($a, $b, $c, $d, $e, $f); - } - - public function beginPath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - // TODO: Implement beginPath() method. - } - - public function closePath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->closepath(); - } - - public function fillStroke() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->fill_stroke(); - } - - public function clip() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->clip(); - } - - public function fillText($text, $x, $y, $maxWidth = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->set_text_pos($x, $y); - $this->canvas->show($text); - } - - public function strokeText($text, $x, $y, $maxWidth = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - // TODO: Implement drawImage() method. - } - - public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - if (strpos($image, "data:") === 0) { - $data = substr($image, strpos($image, ";") + 1); - if (strpos($data, "base64") === 0) { - $data = base64_decode(substr($data, 7)); - } - - $image = tempnam("", "svg"); - file_put_contents($image, $data); - } - - $img = $this->canvas->load_image("auto", $image, ""); - - $sy = $sy - $sh; - $this->canvas->fit_image($img, $sx, $sy, 'boxsize={' . "$sw $sh" . '} fitmethod=entire'); - } - - public function lineTo($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->lineto($x, $y); - } - - public function moveTo($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->moveto($x, $y); - } - - public function quadraticCurveTo($cpx, $cpy, $x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - // TODO: Implement quadraticCurveTo() method. - } - - public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->curveto($cp1x, $cp1y, $cp2x, $cp2y, $x, $y); - } - - public function arcTo($x1, $y1, $x2, $y2, $radius) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - } - - public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->arc($x, $y, $radius, $startAngle, $endAngle); - } - - public function circle($x, $y, $radius) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->circle($x, $y, $radius); - } - - public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->ellipse($x, $y, $radiusX, $radiusY); - } - - public function fillRect($x, $y, $w, $h) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->rect($x, $y, $w, $h); - $this->fill(); - } - - public function rect($x, $y, $w, $h, $rx = 0, $ry = 0) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->rect($x, $y, $w, $h); - } - - public function fill() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->fill(); - } - - public function strokeRect($x, $y, $w, $h) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->rect($x, $y, $w, $h); - $this->stroke(); - } - - public function stroke() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->stroke(); - } - - public function endPath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - //$this->canvas->endPath(); - } - - public function measureText($text) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $style = $this->getStyle(); - $font = $this->getFont($style->fontFamily, $style->fontStyle); - - return $this->canvas->stringwidth($text, $font, $this->getStyle()->fontSize); - } - - public function getStyle() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - return $this->style; - } - - public function setStyle(Style $style) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->style = $style; - $canvas = $this->canvas; - - if (is_array($style->stroke) && $stroke = $style->stroke) { - $canvas->setcolor("stroke", "rgb", $stroke[0] / 255, $stroke[1] / 255, $stroke[2] / 255, null); - } - - if (is_array($style->fill) && $fill = $style->fill) { - // $canvas->setcolor("fill", "rgb", $fill[0] / 255, $fill[1] / 255, $fill[2] / 255, null); - } - - $opts = array(); - if ($style->strokeWidth > 0.000001) { - $opts[] = "linewidth=$style->strokeWidth"; - } - - if (in_array($style->strokeLinecap, array("butt", "round", "projecting"))) { - $opts[] = "linecap=$style->strokeLinecap"; - } - - if (in_array($style->strokeLinejoin, array("miter", "round", "bevel"))) { - $opts[] = "linejoin=$style->strokeLinejoin"; - } - - $canvas->set_graphics_option(implode(" ", $opts)); - - $font = $this->getFont($style->fontFamily, $style->fontStyle); - $canvas->setfont($font, $style->fontSize); - } - - private function getFont($family, $style) - { - $map = array( - "serif" => "Times", - "sans-serif" => "Helvetica", - "fantasy" => "Symbol", - "cursive" => "serif", - "monospance" => "Courier", - ); - - $family = strtolower($family); - if (isset($map[$family])) { - $family = $map[$family]; - } - - return $this->canvas->load_font($family, "unicode", "fontstyle=$style"); - } - - public function setFont($family, $style, $weight) - { - // TODO: Implement setFont() method. - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceInterface.php b/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceInterface.php deleted file mode 100644 index fb007ed..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfaceInterface.php +++ /dev/null @@ -1,90 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Surface; - -use Svg\Style; - -/** - * Interface Surface, like CanvasRenderingContext2D - * - * @package Svg - */ -interface SurfaceInterface -{ - public function save(); - - public function restore(); - - // transformations (default transform is the identity matrix) - public function scale($x, $y); - - public function rotate($angle); - - public function translate($x, $y); - - public function transform($a, $b, $c, $d, $e, $f); - - // path ends - public function beginPath(); - - public function closePath(); - - public function fill(); - - public function stroke(); - - public function endPath(); - - public function fillStroke(); - - public function clip(); - - // text (see also the CanvasDrawingStyles interface) - public function fillText($text, $x, $y, $maxWidth = null); - - public function strokeText($text, $x, $y, $maxWidth = null); - - public function measureText($text); - - // drawing images - public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null); - - // paths - public function lineTo($x, $y); - - public function moveTo($x, $y); - - public function quadraticCurveTo($cpx, $cpy, $x, $y); - - public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y); - - public function arcTo($x1, $y1, $x2, $y2, $radius); - - public function circle($x, $y, $radius); - - public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false); - - public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise); - - // Rectangle - public function rect($x, $y, $w, $h, $rx = 0, $ry = 0); - - public function fillRect($x, $y, $w, $h); - - public function strokeRect($x, $y, $w, $h); - - public function setStyle(Style $style); - - /** - * @return Style - */ - public function getStyle(); - - public function setFont($family, $style, $weight); -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfacePDFLib.php b/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfacePDFLib.php deleted file mode 100644 index a4d1734..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Surface/SurfacePDFLib.php +++ /dev/null @@ -1,422 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Surface; - -use Svg\Style; -use Svg\Document; - -class SurfacePDFLib implements SurfaceInterface -{ - const DEBUG = false; - - private $canvas; - - private $width; - private $height; - - /** @var Style */ - private $style; - - public function __construct(Document $doc, $canvas = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $dimensions = $doc->getDimensions(); - $w = $dimensions["width"]; - $h = $dimensions["height"]; - - if (!$canvas) { - $canvas = new \PDFlib(); - - /* all strings are expected as utf8 */ - $canvas->set_option("stringformat=utf8"); - $canvas->set_option("errorpolicy=return"); - - /* open new PDF file; insert a file name to create the PDF on disk */ - if ($canvas->begin_document("", "") == 0) { - die("Error: " . $canvas->get_errmsg()); - } - $canvas->set_info("Creator", "PDFlib starter sample"); - $canvas->set_info("Title", "starter_graphics"); - - $canvas->begin_page_ext($w, $h, ""); - } - - // Flip PDF coordinate system so that the origin is in - // the top left rather than the bottom left - $canvas->setmatrix( - 1, 0, - 0, -1, - 0, $h - ); - - $this->width = $w; - $this->height = $h; - - $this->canvas = $canvas; - } - - function out() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->canvas->end_page_ext(""); - $this->canvas->end_document(""); - - return $this->canvas->get_buffer(); - } - - public function save() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->save(); - } - - public function restore() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->restore(); - } - - public function scale($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->scale($x, $y); - } - - public function rotate($angle) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->rotate($angle); - } - - public function translate($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->translate($x, $y); - } - - public function transform($a, $b, $c, $d, $e, $f) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->concat($a, $b, $c, $d, $e, $f); - } - - public function beginPath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - // TODO: Implement beginPath() method. - } - - public function closePath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->closepath(); - } - - public function fillStroke() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->fill_stroke(); - } - - public function clip() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->clip(); - } - - public function fillText($text, $x, $y, $maxWidth = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->set_text_pos($x, $y); - $this->canvas->show($text); - } - - public function strokeText($text, $x, $y, $maxWidth = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - // TODO: Implement drawImage() method. - } - - public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - if (strpos($image, "data:") === 0) { - $data = substr($image, strpos($image, ";") + 1); - if (strpos($data, "base64") === 0) { - $data = base64_decode(substr($data, 7)); - } - } - else { - $data = file_get_contents($image); - } - - $image = tempnam("", "svg"); - file_put_contents($image, $data); - - $img = $this->canvas->load_image("auto", $image, ""); - - $sy = $sy - $sh; - $this->canvas->fit_image($img, $sx, $sy, 'boxsize={' . "$sw $sh" . '} fitmethod=entire'); - - unlink($image); - } - - public function lineTo($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->lineto($x, $y); - } - - public function moveTo($x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->moveto($x, $y); - } - - public function quadraticCurveTo($cpx, $cpy, $x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - // FIXME not accurate - $this->canvas->curveTo($cpx, $cpy, $cpx, $cpy, $x, $y); - } - - public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->curveto($cp1x, $cp1y, $cp2x, $cp2y, $x, $y); - } - - public function arcTo($x1, $y1, $x2, $y2, $radius) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - } - - public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->arc($x, $y, $radius, $startAngle, $endAngle); - } - - public function circle($x, $y, $radius) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->circle($x, $y, $radius); - } - - public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->ellipse($x, $y, $radiusX, $radiusY); - } - - public function fillRect($x, $y, $w, $h) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->rect($x, $y, $w, $h); - $this->fill(); - } - - public function rect($x, $y, $w, $h, $rx = 0, $ry = 0) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $canvas = $this->canvas; - - if ($rx <= 0.000001/* && $ry <= 0.000001*/) { - $canvas->rect($x, $y, $w, $h); - - return; - } - - /* Define a path for a rectangle with corners rounded by a given radius. - * Start from the lower left corner and proceed counterclockwise. - */ - $canvas->moveto($x + $rx, $y); - - /* Start of the arc segment in the lower right corner */ - $canvas->lineto($x + $w - $rx, $y); - - /* Arc segment in the lower right corner */ - $canvas->arc($x + $w - $rx, $y + $rx, $rx, 270, 360); - - /* Start of the arc segment in the upper right corner */ - $canvas->lineto($x + $w, $y + $h - $rx ); - - /* Arc segment in the upper right corner */ - $canvas->arc($x + $w - $rx, $y + $h - $rx, $rx, 0, 90); - - /* Start of the arc segment in the upper left corner */ - $canvas->lineto($x + $rx, $y + $h); - - /* Arc segment in the upper left corner */ - $canvas->arc($x + $rx, $y + $h - $rx, $rx, 90, 180); - - /* Start of the arc segment in the lower left corner */ - $canvas->lineto($x , $y + $rx); - - /* Arc segment in the lower left corner */ - $canvas->arc($x + $rx, $y + $rx, $rx, 180, 270); - } - - public function fill() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->fill(); - } - - public function strokeRect($x, $y, $w, $h) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->rect($x, $y, $w, $h); - $this->stroke(); - } - - public function stroke() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->stroke(); - } - - public function endPath() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $this->canvas->endPath(); - } - - public function measureText($text) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - $style = $this->getStyle(); - $font = $this->getFont($style->fontFamily, $style->fontStyle); - - return $this->canvas->stringwidth($text, $font, $this->getStyle()->fontSize); - } - - public function getStyle() - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - return $this->style; - } - - public function setStyle(Style $style) - { - if (self::DEBUG) echo __FUNCTION__ . "\n"; - - $this->style = $style; - $canvas = $this->canvas; - - if ($stroke = $style->stroke && is_array($style->stroke)) { - $canvas->setcolor( - "stroke", - "rgb", - $stroke[0] / 255, - $stroke[1] / 255, - $stroke[2] / 255, - null - ); - } - - if ($fill = $style->fill && is_array($style->fill)) { - $canvas->setcolor( - "fill", - "rgb", - $fill[0] / 255, - $fill[1] / 255, - $fill[2] / 255, - null - ); - } - - if ($fillRule = strtolower($style->fillRule)) { - $map = array( - "nonzero" => "winding", - "evenodd" => "evenodd", - ); - - if (isset($map[$fillRule])) { - $fillRule = $map[$fillRule]; - - $canvas->set_parameter("fillrule", $fillRule); - } - } - - $opts = array(); - if ($style->strokeWidth > 0.000001) { - $opts[] = "linewidth=$style->strokeWidth"; - } - - if (in_array($style->strokeLinecap, array("butt", "round", "projecting"))) { - $opts[] = "linecap=$style->strokeLinecap"; - } - - if (in_array($style->strokeLinejoin, array("miter", "round", "bevel"))) { - $opts[] = "linejoin=$style->strokeLinejoin"; - } - - $canvas->set_graphics_option(implode(" ", $opts)); - - $opts = array(); - $opacity = $style->opacity; - if ($opacity !== null && $opacity < 1.0) { - $opts[] = "opacityfill=$opacity"; - $opts[] = "opacitystroke=$opacity"; - } - else { - $fillOpacity = $style->fillOpacity; - if ($fillOpacity !== null && $fillOpacity < 1.0) { - $opts[] = "opacityfill=$fillOpacity"; - } - - $strokeOpacity = $style->strokeOpacity; - if ($strokeOpacity !== null && $strokeOpacity < 1.0) { - $opts[] = "opacitystroke=$strokeOpacity"; - } - } - - if (count($opts)) { - $gs = $canvas->create_gstate(implode(" ", $opts)); - $canvas->set_gstate($gs); - } - - $font = $this->getFont($style->fontFamily, $style->fontStyle); - if ($font) { - $canvas->setfont($font, $style->fontSize); - } - } - - private function getFont($family, $style) - { - $map = array( - "serif" => "Times", - "sans-serif" => "Helvetica", - "fantasy" => "Symbol", - "cursive" => "Times", - "monospace" => "Courier", - - "arial" => "Helvetica", - "verdana" => "Helvetica", - ); - - $family = strtolower($family); - if (isset($map[$family])) { - $family = $map[$family]; - } - - return $this->canvas->load_font($family, "unicode", "fontstyle=$style"); - } - - public function setFont($family, $style, $weight) - { - // TODO: Implement setFont() method. - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/AbstractTag.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/AbstractTag.php deleted file mode 100644 index 7044cdd..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/AbstractTag.php +++ /dev/null @@ -1,190 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -use Svg\Document; -use Svg\Style; - -abstract class AbstractTag -{ - /** @var Document */ - protected $document; - - public $tagName; - - /** @var Style */ - protected $style; - - protected $attributes = array(); - - protected $hasShape = true; - - /** @var self[] */ - protected $children = array(); - - public function __construct(Document $document, $tagName) - { - $this->document = $document; - $this->tagName = $tagName; - } - - public function getDocument(){ - return $this->document; - } - - /** - * @return Group|null - */ - public function getParentGroup() { - $stack = $this->getDocument()->getStack(); - for ($i = count($stack)-2; $i >= 0; $i--) { - $tag = $stack[$i]; - - if ($tag instanceof Group || $tag instanceof Document) { - return $tag; - } - } - - return null; - } - - public function handle($attributes) - { - $this->attributes = $attributes; - - if (!$this->getDocument()->inDefs) { - $this->before($attributes); - $this->start($attributes); - } - } - - public function handleEnd() - { - if (!$this->getDocument()->inDefs) { - $this->end(); - $this->after(); - } - } - - protected function before($attributes) - { - } - - protected function start($attributes) - { - } - - protected function end() - { - } - - protected function after() - { - } - - public function getAttributes() - { - return $this->attributes; - } - - protected function setStyle(Style $style) - { - $this->style = $style; - - if ($style->display === "none") { - $this->hasShape = false; - } - } - - /** - * @return Style - */ - public function getStyle() - { - return $this->style; - } - - /** - * Make a style object from the tag and its attributes - * - * @param array $attributes - * - * @return Style - */ - protected function makeStyle($attributes) { - $style = new Style(); - $style->inherit($this); - $style->fromStyleSheets($this, $attributes); - $style->fromAttributes($attributes); - - return $style; - } - - protected function applyTransform($attributes) - { - - if (isset($attributes["transform"])) { - $surface = $this->document->getSurface(); - - $transform = $attributes["transform"]; - - $match = array(); - preg_match_all( - '/(matrix|translate|scale|rotate|skewX|skewY)\((.*?)\)/is', - $transform, - $match, - PREG_SET_ORDER - ); - - $transformations = array(); - if (count($match[0])) { - foreach ($match as $_match) { - $arguments = preg_split('/[ ,]+/', $_match[2]); - array_unshift($arguments, $_match[1]); - $transformations[] = $arguments; - } - } - - foreach ($transformations as $t) { - switch ($t[0]) { - case "matrix": - $surface->transform($t[1], $t[2], $t[3], $t[4], $t[5], $t[6]); - break; - - case "translate": - $surface->translate($t[1], isset($t[2]) ? $t[2] : 0); - break; - - case "scale": - $surface->scale($t[1], isset($t[2]) ? $t[2] : $t[1]); - break; - - case "rotate": - if (isset($t[2])) { - $t[3] = isset($t[3]) ? $t[3] : 0; - $surface->translate($t[2], $t[3]); - $surface->rotate($t[1]); - $surface->translate(-$t[2], -$t[3]); - } else { - $surface->rotate($t[1]); - } - break; - - case "skewX": - $surface->skewX($t[1]); - break; - - case "skewY": - $surface->skewY($t[1]); - break; - } - } - } - } -} diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Anchor.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Anchor.php deleted file mode 100644 index 9a4b3fe..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Anchor.php +++ /dev/null @@ -1,14 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class Anchor extends Group -{ - -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Circle.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Circle.php deleted file mode 100644 index 2e516b4..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Circle.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class Circle extends Shape -{ - protected $cx = 0; - protected $cy = 0; - protected $r; - - public function start($attributes) - { - if (isset($attributes['cx'])) { - $this->cx = $attributes['cx']; - } - if (isset($attributes['cy'])) { - $this->cy = $attributes['cy']; - } - if (isset($attributes['r'])) { - $this->r = $attributes['r']; - } - - $this->document->getSurface()->circle($this->cx, $this->cy, $this->r); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/ClipPath.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/ClipPath.php deleted file mode 100644 index 54ee084..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/ClipPath.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -use Svg\Style; - -class ClipPath extends AbstractTag -{ - protected function before($attributes) - { - $surface = $this->document->getSurface(); - - $surface->save(); - - $style = $this->makeStyle($attributes); - - $this->setStyle($style); - $surface->setStyle($style); - - $this->applyTransform($attributes); - } - - protected function after() - { - $this->document->getSurface()->restore(); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Ellipse.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Ellipse.php deleted file mode 100644 index 483e51e..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Ellipse.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class Ellipse extends Shape -{ - protected $cx = 0; - protected $cy = 0; - protected $rx = 0; - protected $ry = 0; - - public function start($attributes) - { - parent::start($attributes); - - if (isset($attributes['cx'])) { - $this->cx = $attributes['cx']; - } - if (isset($attributes['cy'])) { - $this->cy = $attributes['cy']; - } - if (isset($attributes['rx'])) { - $this->rx = $attributes['rx']; - } - if (isset($attributes['ry'])) { - $this->ry = $attributes['ry']; - } - - $this->document->getSurface()->ellipse($this->cx, $this->cy, $this->rx, $this->ry, 0, 0, 360, false); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Group.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Group.php deleted file mode 100644 index 542bfbd..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Group.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -use Svg\Style; - -class Group extends AbstractTag -{ - protected function before($attributes) - { - $surface = $this->document->getSurface(); - - $surface->save(); - - $style = $this->makeStyle($attributes); - - $this->setStyle($style); - $surface->setStyle($style); - - $this->applyTransform($attributes); - } - - protected function after() - { - $this->document->getSurface()->restore(); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Image.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Image.php deleted file mode 100644 index f356b28..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Image.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class Image extends AbstractTag -{ - protected $x = 0; - protected $y = 0; - protected $width = 0; - protected $height = 0; - protected $href = null; - - protected function before($attributes) - { - parent::before($attributes); - - $surface = $this->document->getSurface(); - $surface->save(); - - $this->applyTransform($attributes); - } - - public function start($attributes) - { - $document = $this->document; - $height = $this->document->getHeight(); - $this->y = $height; - - if (isset($attributes['x'])) { - $this->x = $attributes['x']; - } - if (isset($attributes['y'])) { - $this->y = $height - $attributes['y']; - } - - if (isset($attributes['width'])) { - $this->width = $attributes['width']; - } - if (isset($attributes['height'])) { - $this->height = $attributes['height']; - } - - if (isset($attributes['xlink:href'])) { - $this->href = $attributes['xlink:href']; - } - - $document->getSurface()->transform(1, 0, 0, -1, 0, $height); - - $document->getSurface()->drawImage($this->href, $this->x, $this->y, $this->width, $this->height); - } - - protected function after() - { - $this->document->getSurface()->restore(); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Line.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Line.php deleted file mode 100644 index 42504bc..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Line.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class Line extends Shape -{ - protected $x1 = 0; - protected $y1 = 0; - - protected $x2 = 0; - protected $y2 = 0; - - public function start($attributes) - { - if (isset($attributes['x1'])) { - $this->x1 = $attributes['x1']; - } - if (isset($attributes['y1'])) { - $this->y1 = $attributes['y1']; - } - if (isset($attributes['x2'])) { - $this->x2 = $attributes['x2']; - } - if (isset($attributes['y2'])) { - $this->y2 = $attributes['y2']; - } - - $surface = $this->document->getSurface(); - $surface->moveTo($this->x1, $this->y1); - $surface->lineTo($this->x2, $this->y2); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/LinearGradient.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/LinearGradient.php deleted file mode 100644 index 605ec23..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/LinearGradient.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - - -use Svg\Gradient; -use Svg\Style; - -class LinearGradient extends AbstractTag -{ - protected $x1; - protected $y1; - protected $x2; - protected $y2; - - /** @var Gradient\Stop[] */ - protected $stops = array(); - - public function start($attributes) - { - parent::start($attributes); - - if (isset($attributes['x1'])) { - $this->x1 = $attributes['x1']; - } - if (isset($attributes['y1'])) { - $this->y1 = $attributes['y1']; - } - if (isset($attributes['x2'])) { - $this->x2 = $attributes['x2']; - } - if (isset($attributes['y2'])) { - $this->y2 = $attributes['y2']; - } - } - - public function getStops() { - if (empty($this->stops)) { - foreach ($this->children as $_child) { - if ($_child->tagName != "stop") { - continue; - } - - $_stop = new Gradient\Stop(); - $_attributes = $_child->attributes; - - // Style - if (isset($_attributes["style"])) { - $_style = Style::parseCssStyle($_attributes["style"]); - - if (isset($_style["stop-color"])) { - $_stop->color = Style::parseColor($_style["stop-color"]); - } - - if (isset($_style["stop-opacity"])) { - $_stop->opacity = max(0, min(1.0, $_style["stop-opacity"])); - } - } - - // Attributes - if (isset($_attributes["offset"])) { - $_stop->offset = $_attributes["offset"]; - } - if (isset($_attributes["stop-color"])) { - $_stop->color = Style::parseColor($_attributes["stop-color"]); - } - if (isset($_attributes["stop-opacity"])) { - $_stop->opacity = max(0, min(1.0, $_attributes["stop-opacity"])); - } - - $this->stops[] = $_stop; - } - } - - return $this->stops; - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Path.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Path.php deleted file mode 100644 index c43d638..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Path.php +++ /dev/null @@ -1,528 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -use Svg\Surface\SurfaceInterface; - -class Path extends Shape -{ - static $commandLengths = array( - 'm' => 2, - 'l' => 2, - 'h' => 1, - 'v' => 1, - 'c' => 6, - 's' => 4, - 'q' => 4, - 't' => 2, - 'a' => 7, - ); - - static $repeatedCommands = array( - 'm' => 'l', - 'M' => 'L', - ); - - public function start($attributes) - { - if (!isset($attributes['d'])) { - $this->hasShape = false; - - return; - } - - $commands = array(); - preg_match_all('/([MZLHVCSQTAmzlhvcsqta])([eE ,\-.\d]+)*/', $attributes['d'], $commands, PREG_SET_ORDER); - - $path = array(); - foreach ($commands as $c) { - if (count($c) == 3) { - $arguments = array(); - preg_match_all('/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/i', $c[2], $arguments, PREG_PATTERN_ORDER); - $item = $arguments[0]; - $commandLower = strtolower($c[1]); - - if ( - isset(self::$commandLengths[$commandLower]) && - ($commandLength = self::$commandLengths[$commandLower]) && - count($item) > $commandLength - ) { - $repeatedCommand = isset(self::$repeatedCommands[$c[1]]) ? self::$repeatedCommands[$c[1]] : $c[1]; - $command = $c[1]; - - for ($k = 0, $klen = count($item); $k < $klen; $k += $commandLength) { - $_item = array_slice($item, $k, $k + $commandLength); - array_unshift($_item, $command); - $path[] = $_item; - - $command = $repeatedCommand; - } - } else { - array_unshift($item, $c[1]); - $path[] = $item; - } - - } else { - $item = array($c[1]); - - $path[] = $item; - } - } - - $surface = $this->document->getSurface(); - - // From https://github.com/kangax/fabric.js/blob/master/src/shapes/path.class.js - $current = null; // current instruction - $previous = null; - $subpathStartX = 0; - $subpathStartY = 0; - $x = 0; // current x - $y = 0; // current y - $controlX = 0; // current control point x - $controlY = 0; // current control point y - $tempX = null; - $tempY = null; - $tempControlX = null; - $tempControlY = null; - $l = 0; //-((this.width / 2) + $this.pathOffset.x), - $t = 0; //-((this.height / 2) + $this.pathOffset.y), - $methodName = null; - - foreach ($path as $current) { - switch ($current[0]) { // first letter - case 'l': // lineto, relative - $x += $current[1]; - $y += $current[2]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'L': // lineto, absolute - $x = $current[1]; - $y = $current[2]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'h': // horizontal lineto, relative - $x += $current[1]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'H': // horizontal lineto, absolute - $x = $current[1]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'v': // vertical lineto, relative - $y += $current[1]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'V': // verical lineto, absolute - $y = $current[1]; - $surface->lineTo($x + $l, $y + $t); - break; - - case 'm': // moveTo, relative - $x += $current[1]; - $y += $current[2]; - $subpathStartX = $x; - $subpathStartY = $y; - $surface->moveTo($x + $l, $y + $t); - break; - - case 'M': // moveTo, absolute - $x = $current[1]; - $y = $current[2]; - $subpathStartX = $x; - $subpathStartY = $y; - $surface->moveTo($x + $l, $y + $t); - break; - - case 'c': // bezierCurveTo, relative - $tempX = $x + $current[5]; - $tempY = $y + $current[6]; - $controlX = $x + $current[3]; - $controlY = $y + $current[4]; - $surface->bezierCurveTo( - $x + $current[1] + $l, // x1 - $y + $current[2] + $t, // y1 - $controlX + $l, // x2 - $controlY + $t, // y2 - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - break; - - case 'C': // bezierCurveTo, absolute - $x = $current[5]; - $y = $current[6]; - $controlX = $current[3]; - $controlY = $current[4]; - $surface->bezierCurveTo( - $current[1] + $l, - $current[2] + $t, - $controlX + $l, - $controlY + $t, - $x + $l, - $y + $t - ); - break; - - case 's': // shorthand cubic bezierCurveTo, relative - - // transform to absolute x,y - $tempX = $x + $current[3]; - $tempY = $y + $current[4]; - - if (!preg_match('/[CcSs]/', $previous[0])) { - // If there is no previous command or if the previous command was not a C, c, S, or s, - // the control point is coincident with the current point - $controlX = $x; - $controlY = $y; - } else { - // calculate reflection of previous control points - $controlX = 2 * $x - $controlX; - $controlY = 2 * $y - $controlY; - } - - $surface->bezierCurveTo( - $controlX + $l, - $controlY + $t, - $x + $current[1] + $l, - $y + $current[2] + $t, - $tempX + $l, - $tempY + $t - ); - // set control point to 2nd one of this command - // "... the first control point is assumed to be - // the reflection of the second control point on - // the previous command relative to the current point." - $controlX = $x + $current[1]; - $controlY = $y + $current[2]; - - $x = $tempX; - $y = $tempY; - break; - - case 'S': // shorthand cubic bezierCurveTo, absolute - $tempX = $current[3]; - $tempY = $current[4]; - - if (!preg_match('/[CcSs]/', $previous[0])) { - // If there is no previous command or if the previous command was not a C, c, S, or s, - // the control point is coincident with the current point - $controlX = $x; - $controlY = $y; - } else { - // calculate reflection of previous control points - $controlX = 2 * $x - $controlX; - $controlY = 2 * $y - $controlY; - } - - $surface->bezierCurveTo( - $controlX + $l, - $controlY + $t, - $current[1] + $l, - $current[2] + $t, - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - - // set control point to 2nd one of this command - // "... the first control point is assumed to be - // the reflection of the second control point on - // the previous command relative to the current point." - $controlX = $current[1]; - $controlY = $current[2]; - - break; - - case 'q': // quadraticCurveTo, relative - // transform to absolute x,y - $tempX = $x + $current[3]; - $tempY = $y + $current[4]; - - $controlX = $x + $current[1]; - $controlY = $y + $current[2]; - - $surface->quadraticCurveTo( - $controlX + $l, - $controlY + $t, - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - break; - - case 'Q': // quadraticCurveTo, absolute - $tempX = $current[3]; - $tempY = $current[4]; - - $surface->quadraticCurveTo( - $current[1] + $l, - $current[2] + $t, - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - $controlX = $current[1]; - $controlY = $current[2]; - break; - - case 't': // shorthand quadraticCurveTo, relative - - // transform to absolute x,y - $tempX = $x + $current[1]; - $tempY = $y + $current[2]; - - if (preg_match("/[QqTt]/", $previous[0])) { - // If there is no previous command or if the previous command was not a Q, q, T or t, - // assume the control point is coincident with the current point - $controlX = $x; - $controlY = $y; - } else { - if ($previous[0] === 't') { - // calculate reflection of previous control points for t - $controlX = 2 * $x - $tempControlX; - $controlY = 2 * $y - $tempControlY; - } else { - if ($previous[0] === 'q') { - // calculate reflection of previous control points for q - $controlX = 2 * $x - $controlX; - $controlY = 2 * $y - $controlY; - } - } - } - - $tempControlX = $controlX; - $tempControlY = $controlY; - - $surface->quadraticCurveTo( - $controlX + $l, - $controlY + $t, - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - $controlX = $x + $current[1]; - $controlY = $y + $current[2]; - break; - - case 'T': - $tempX = $current[1]; - $tempY = $current[2]; - - // calculate reflection of previous control points - $controlX = 2 * $x - $controlX; - $controlY = 2 * $y - $controlY; - $surface->quadraticCurveTo( - $controlX + $l, - $controlY + $t, - $tempX + $l, - $tempY + $t - ); - $x = $tempX; - $y = $tempY; - break; - - case 'a': - // TODO: optimize this - $this->drawArc( - $surface, - $x + $l, - $y + $t, - array( - $current[1], - $current[2], - $current[3], - $current[4], - $current[5], - $current[6] + $x + $l, - $current[7] + $y + $t - ) - ); - $x += $current[6]; - $y += $current[7]; - break; - - case 'A': - // TODO: optimize this - $this->drawArc( - $surface, - $x + $l, - $y + $t, - array( - $current[1], - $current[2], - $current[3], - $current[4], - $current[5], - $current[6] + $l, - $current[7] + $t - ) - ); - $x = $current[6]; - $y = $current[7]; - break; - - case 'z': - case 'Z': - $x = $subpathStartX; - $y = $subpathStartY; - $surface->closePath(); - break; - } - $previous = $current; - } - } - - function drawArc(SurfaceInterface $surface, $fx, $fy, $coords) - { - $rx = $coords[0]; - $ry = $coords[1]; - $rot = $coords[2]; - $large = $coords[3]; - $sweep = $coords[4]; - $tx = $coords[5]; - $ty = $coords[6]; - $segs = array( - array(), - array(), - array(), - array(), - ); - - $segsNorm = $this->arcToSegments($tx - $fx, $ty - $fy, $rx, $ry, $large, $sweep, $rot); - - for ($i = 0, $len = count($segsNorm); $i < $len; $i++) { - $segs[$i][0] = $segsNorm[$i][0] + $fx; - $segs[$i][1] = $segsNorm[$i][1] + $fy; - $segs[$i][2] = $segsNorm[$i][2] + $fx; - $segs[$i][3] = $segsNorm[$i][3] + $fy; - $segs[$i][4] = $segsNorm[$i][4] + $fx; - $segs[$i][5] = $segsNorm[$i][5] + $fy; - - call_user_func_array(array($surface, "bezierCurveTo"), $segs[$i]); - } - } - - function arcToSegments($toX, $toY, $rx, $ry, $large, $sweep, $rotateX) - { - $th = $rotateX * M_PI / 180; - $sinTh = sin($th); - $cosTh = cos($th); - $fromX = 0; - $fromY = 0; - - $rx = abs($rx); - $ry = abs($ry); - - $px = -$cosTh * $toX * 0.5 - $sinTh * $toY * 0.5; - $py = -$cosTh * $toY * 0.5 + $sinTh * $toX * 0.5; - $rx2 = $rx * $rx; - $ry2 = $ry * $ry; - $py2 = $py * $py; - $px2 = $px * $px; - $pl = $rx2 * $ry2 - $rx2 * $py2 - $ry2 * $px2; - $root = 0; - - if ($pl < 0) { - $s = sqrt(1 - $pl / ($rx2 * $ry2)); - $rx *= $s; - $ry *= $s; - } else { - $root = ($large == $sweep ? -1.0 : 1.0) * sqrt($pl / ($rx2 * $py2 + $ry2 * $px2)); - } - - $cx = $root * $rx * $py / $ry; - $cy = -$root * $ry * $px / $rx; - $cx1 = $cosTh * $cx - $sinTh * $cy + $toX * 0.5; - $cy1 = $sinTh * $cx + $cosTh * $cy + $toY * 0.5; - $mTheta = $this->calcVectorAngle(1, 0, ($px - $cx) / $rx, ($py - $cy) / $ry); - $dtheta = $this->calcVectorAngle(($px - $cx) / $rx, ($py - $cy) / $ry, (-$px - $cx) / $rx, (-$py - $cy) / $ry); - - if ($sweep == 0 && $dtheta > 0) { - $dtheta -= 2 * M_PI; - } else { - if ($sweep == 1 && $dtheta < 0) { - $dtheta += 2 * M_PI; - } - } - - // $Convert $into $cubic $bezier $segments <= 90deg - $segments = ceil(abs($dtheta / M_PI * 2)); - $result = array(); - $mDelta = $dtheta / $segments; - $mT = 8 / 3 * sin($mDelta / 4) * sin($mDelta / 4) / sin($mDelta / 2); - $th3 = $mTheta + $mDelta; - - for ($i = 0; $i < $segments; $i++) { - $result[$i] = $this->segmentToBezier( - $mTheta, - $th3, - $cosTh, - $sinTh, - $rx, - $ry, - $cx1, - $cy1, - $mT, - $fromX, - $fromY - ); - $fromX = $result[$i][4]; - $fromY = $result[$i][5]; - $mTheta = $th3; - $th3 += $mDelta; - } - - return $result; - } - - function segmentToBezier($th2, $th3, $cosTh, $sinTh, $rx, $ry, $cx1, $cy1, $mT, $fromX, $fromY) - { - $costh2 = cos($th2); - $sinth2 = sin($th2); - $costh3 = cos($th3); - $sinth3 = sin($th3); - $toX = $cosTh * $rx * $costh3 - $sinTh * $ry * $sinth3 + $cx1; - $toY = $sinTh * $rx * $costh3 + $cosTh * $ry * $sinth3 + $cy1; - $cp1X = $fromX + $mT * (-$cosTh * $rx * $sinth2 - $sinTh * $ry * $costh2); - $cp1Y = $fromY + $mT * (-$sinTh * $rx * $sinth2 + $cosTh * $ry * $costh2); - $cp2X = $toX + $mT * ($cosTh * $rx * $sinth3 + $sinTh * $ry * $costh3); - $cp2Y = $toY + $mT * ($sinTh * $rx * $sinth3 - $cosTh * $ry * $costh3); - - return array( - $cp1X, - $cp1Y, - $cp2X, - $cp2Y, - $toX, - $toY - ); - } - - function calcVectorAngle($ux, $uy, $vx, $vy) - { - $ta = atan2($uy, $ux); - $tb = atan2($vy, $vx); - if ($tb >= $ta) { - return $tb - $ta; - } else { - return 2 * M_PI - ($ta - $tb); - } - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Polygon.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Polygon.php deleted file mode 100644 index 3100c5e..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Polygon.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class Polygon extends Shape -{ - public function start($attributes) - { - $tmp = array(); - preg_match_all('/([\-]*[0-9\.]+)/', $attributes['points'], $tmp); - - $points = $tmp[0]; - $count = count($points); - - $surface = $this->document->getSurface(); - list($x, $y) = $points; - $surface->moveTo($x, $y); - - for ($i = 2; $i < $count; $i += 2) { - $x = $points[$i]; - $y = $points[$i + 1]; - $surface->lineTo($x, $y); - } - - $surface->closePath(); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Polyline.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Polyline.php deleted file mode 100644 index c2837f5..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Polyline.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class Polyline extends Shape -{ - public function start($attributes) - { - $tmp = array(); - preg_match_all('/([\-]*[0-9\.]+)/', $attributes['points'], $tmp); - - $points = $tmp[0]; - $count = count($points); - - $surface = $this->document->getSurface(); - list($x, $y) = $points; - $surface->moveTo($x, $y); - - for ($i = 2; $i < $count; $i += 2) { - $x = $points[$i]; - $y = $points[$i + 1]; - $surface->lineTo($x, $y); - } - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/RadialGradient.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/RadialGradient.php deleted file mode 100644 index 93987b3..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/RadialGradient.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class RadialGradient extends AbstractTag -{ - public function start($attributes) - { - - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Rect.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Rect.php deleted file mode 100644 index 1e925a8..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Rect.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class Rect extends Shape -{ - protected $x = 0; - protected $y = 0; - protected $width = 0; - protected $height = 0; - protected $rx = 0; - protected $ry = 0; - - public function start($attributes) - { - if (isset($attributes['x'])) { - $this->x = $attributes['x']; - } - if (isset($attributes['y'])) { - $this->y = $attributes['y']; - } - - if (isset($attributes['width'])) { - if ('%' === substr($attributes['width'], -1)) { - $factor = substr($attributes['width'], 0, -1) / 100; - $this->width = $this->document->getWidth() * $factor; - } else { - $this->width = $attributes['width']; - } - } - if (isset($attributes['height'])) { - if ('%' === substr($attributes['height'], -1)) { - $factor = substr($attributes['height'], 0, -1) / 100; - $this->height = $this->document->getHeight() * $factor; - } else { - $this->height = $attributes['height']; - } - } - - if (isset($attributes['rx'])) { - $this->rx = $attributes['rx']; - } - if (isset($attributes['ry'])) { - $this->ry = $attributes['ry']; - } - - $this->document->getSurface()->rect($this->x, $this->y, $this->width, $this->height, $this->rx, $this->ry); - } -} diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Shape.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Shape.php deleted file mode 100644 index 0a2bfae..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Shape.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -use Svg\Style; - -class Shape extends AbstractTag -{ - protected function before($attributes) - { - $surface = $this->document->getSurface(); - - $surface->save(); - - $style = $this->makeStyle($attributes); - - $this->setStyle($style); - $surface->setStyle($style); - - $this->applyTransform($attributes); - } - - protected function after() - { - $surface = $this->document->getSurface(); - - if ($this->hasShape) { - $style = $surface->getStyle(); - - $fill = $style->fill && is_array($style->fill); - $stroke = $style->stroke && is_array($style->stroke); - - if ($fill) { - if ($stroke) { - $surface->fillStroke(); - } else { -// if (is_string($style->fill)) { -// /** @var LinearGradient|RadialGradient $gradient */ -// $gradient = $this->getDocument()->getDef($style->fill); -// -// var_dump($gradient->getStops()); -// } - - $surface->fill(); - } - } - elseif ($stroke) { - $surface->stroke(); - } - else { - $surface->endPath(); - } - } - - $surface->restore(); - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Stop.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Stop.php deleted file mode 100644 index 666a2ac..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Stop.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class Stop extends AbstractTag -{ - public function start($attributes) - { - - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/StyleTag.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/StyleTag.php deleted file mode 100644 index cda5493..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/StyleTag.php +++ /dev/null @@ -1,27 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -use Sabberworm\CSS; - -class StyleTag extends AbstractTag -{ - protected $text = ""; - - public function end() - { - $parser = new CSS\Parser($this->text); - $this->document->appendStyleSheet($parser->parse()); - } - - public function appendText($text) - { - $this->text .= $text; - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/Text.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/Text.php deleted file mode 100644 index 83b5afe..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/Text.php +++ /dev/null @@ -1,70 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class Text extends Shape -{ - protected $x = 0; - protected $y = 0; - protected $text = ""; - - public function start($attributes) - { - $document = $this->document; - $height = $this->document->getHeight(); - $this->y = $height; - - if (isset($attributes['x'])) { - $this->x = $attributes['x']; - } - if (isset($attributes['y'])) { - $this->y = $height - $attributes['y']; - } - - $document->getSurface()->transform(1, 0, 0, -1, 0, $height); - } - - public function end() - { - $surface = $this->document->getSurface(); - $x = $this->x; - $y = $this->y; - $style = $surface->getStyle(); - $surface->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight); - - switch ($style->textAnchor) { - case "middle": - $width = $surface->measureText($this->text); - $x -= $width / 2; - break; - - case "end": - $width = $surface->measureText($this->text); - $x -= $width; - break; - } - - $surface->fillText($this->getText(), $x, $y); - } - - protected function after() - { - $this->document->getSurface()->restore(); - } - - public function appendText($text) - { - $this->text .= $text; - } - - public function getText() - { - return trim($this->text); - } -} diff --git a/vendor/phenx/php-svg-lib/src/Svg/Tag/UseTag.php b/vendor/phenx/php-svg-lib/src/Svg/Tag/UseTag.php deleted file mode 100644 index b88a6cc..0000000 --- a/vendor/phenx/php-svg-lib/src/Svg/Tag/UseTag.php +++ /dev/null @@ -1,96 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -namespace Svg\Tag; - -class UseTag extends AbstractTag -{ - protected $x = 0; - protected $y = 0; - protected $width; - protected $height; - - /** @var AbstractTag */ - protected $reference; - - protected function before($attributes) - { - if (isset($attributes['x'])) { - $this->x = $attributes['x']; - } - if (isset($attributes['y'])) { - $this->y = $attributes['y']; - } - - if (isset($attributes['width'])) { - $this->width = $attributes['width']; - } - if (isset($attributes['height'])) { - $this->height = $attributes['height']; - } - - parent::before($attributes); - - $document = $this->getDocument(); - - $link = $attributes["xlink:href"]; - $this->reference = $document->getDef($link); - - if ($this->reference) { - $this->reference->before($attributes); - } - - $surface = $document->getSurface(); - $surface->save(); - - $surface->translate($this->x, $this->y); - } - - protected function after() { - parent::after(); - - if ($this->reference) { - $this->reference->after(); - } - - $this->getDocument()->getSurface()->restore(); - } - - public function handle($attributes) - { - parent::handle($attributes); - - if (!$this->reference) { - return; - } - - $attributes = array_merge($this->reference->attributes, $attributes); - - $this->reference->handle($attributes); - - foreach ($this->reference->children as $_child) { - $_attributes = array_merge($_child->attributes, $attributes); - $_child->handle($_attributes); - } - } - - public function handleEnd() - { - parent::handleEnd(); - - if (!$this->reference) { - return; - } - - $this->reference->handleEnd(); - - foreach ($this->reference->children as $_child) { - $_child->handleEnd(); - } - } -} \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/src/autoload.php b/vendor/phenx/php-svg-lib/src/autoload.php deleted file mode 100644 index b0e2b9c..0000000 --- a/vendor/phenx/php-svg-lib/src/autoload.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @license GNU LGPLv3+ http://www.gnu.org/copyleft/lesser.html - */ - -spl_autoload_register(function($class) { - if (0 === strpos($class, "Svg")) { - $file = str_replace('\\', DIRECTORY_SEPARATOR, $class); - $file = realpath(__DIR__ . DIRECTORY_SEPARATOR . $file . '.php'); - if (file_exists($file)) { - include_once $file; - } - } -}); \ No newline at end of file diff --git a/vendor/phenx/php-svg-lib/tests/Svg/StyleTest.php b/vendor/phenx/php-svg-lib/tests/Svg/StyleTest.php deleted file mode 100644 index f434a07..0000000 --- a/vendor/phenx/php-svg-lib/tests/Svg/StyleTest.php +++ /dev/null @@ -1,59 +0,0 @@ -assertEquals("none", Style::parseColor("none")); - $this->assertEquals(array(255, 0, 0), Style::parseColor("RED")); - $this->assertEquals(array(0, 0, 255), Style::parseColor("blue")); - $this->assertEquals(null, Style::parseColor("foo")); - $this->assertEquals(array(0, 0, 0), Style::parseColor("black")); - $this->assertEquals(array(255, 255, 255), Style::parseColor("white")); - $this->assertEquals(array(0, 0, 0), Style::parseColor("#000000")); - $this->assertEquals(array(255, 255, 255), Style::parseColor("#ffffff")); - $this->assertEquals(array(0, 0, 0), Style::parseColor("rgb(0,0,0)")); - $this->assertEquals(array(255, 255, 255), Style::parseColor("rgb(255,255,255)")); - $this->assertEquals(array(0, 0, 0), Style::parseColor("rgb(0, 0, 0)")); - $this->assertEquals(array(255, 255, 255), Style::parseColor("rgb(255, 255, 255)")); - } - - public function test_fromAttributes() - { - $style = new Style(); - - $attributes = array( - "color" => "blue", - "fill" => "#fff", - "stroke" => "none", - ); - - $style->fromAttributes($attributes); - - $this->assertEquals(array(0, 0, 255), $style->color); - $this->assertEquals(array(255, 255, 255), $style->fill); - $this->assertEquals("none", $style->stroke); - } - - public function test_convertSize() - { - $this->assertEquals(1, Style::convertSize(1)); - $this->assertEquals(10, Style::convertSize("10px")); // FIXME - $this->assertEquals(10, Style::convertSize("10pt")); - $this->assertEquals(8, Style::convertSize("80%", 10, 72)); - } - -} - diff --git a/vendor/phpdocumentor/reflection-common/.github/dependabot.yml b/vendor/phpdocumentor/reflection-common/.github/dependabot.yml deleted file mode 100644 index c630ffa..0000000 --- a/vendor/phpdocumentor/reflection-common/.github/dependabot.yml +++ /dev/null @@ -1,7 +0,0 @@ -version: 2 -updates: -- package-ecosystem: composer - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 diff --git a/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml b/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml deleted file mode 100644 index 484410e..0000000 --- a/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml +++ /dev/null @@ -1,223 +0,0 @@ -on: - push: - branches: - - 2.x - pull_request: -name: Qa workflow -jobs: - setup: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - - name: Restore/cache tools folder - uses: actions/cache@v1 - with: - path: tools - key: all-tools-${{ github.sha }} - restore-keys: | - all-tools-${{ github.sha }}- - all-tools- - - - name: composer - uses: docker://composer - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - args: install --no-interaction --prefer-dist --optimize-autoloader - - - name: Install phive - run: make install-phive - - - name: Install PHAR dependencies - run: tools/phive.phar --no-progress install --copy --trust-gpg-keys 4AA394086372C20A,8A03EA3B385DBAA1 --force-accept-unsigned - - phpunit-with-coverage: - runs-on: ubuntu-latest - name: Unit tests - needs: setup - steps: - - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: 7.2 - ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 - coverage: pcov - - - name: Restore/cache tools folder - uses: actions/cache@v1 - with: - path: tools - key: all-tools-${{ github.sha }} - restore-keys: | - all-tools-${{ github.sha }}- - all-tools- - - - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ubuntu-latest-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ubuntu-latest-composer- - - - name: Install Composer dependencies - run: | - composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - - - name: Run PHPUnit - run: php tools/phpunit - - phpunit: - runs-on: ${{ matrix.operating-system }} - strategy: - matrix: - operating-system: - - ubuntu-latest - - windows-latest - - macOS-latest - php-versions: ['7.2', '7.3', '7.4', '8.0'] - name: Unit tests for PHP version ${{ matrix.php-versions }} on ${{ matrix.operating-system }} - needs: - - setup - - phpunit-with-coverage - steps: - - uses: actions/checkout@v2 - - - name: Restore/cache tools folder - uses: actions/cache@v1 - with: - path: tools - key: all-tools-${{ github.sha }} - restore-keys: | - all-tools-${{ github.sha }}- - all-tools- - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-versions }} - ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Install Composer dependencies - run: | - composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - - - name: Run PHPUnit - continue-on-error: true - run: php tools/phpunit - - codestyle: - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - name: Code style check - uses: phpDocumentor/coding-standard@latest - with: - args: -s - - phpstan: - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - name: PHPStan - uses: phpDocumentor/phpstan-ga@latest - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - args: analyse src --configuration phpstan.neon - - psalm: - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: 7.2 - ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 - tools: psalm - coverage: none - - - name: Get composer cache directory - id: composer-cache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache composer dependencies - uses: actions/cache@v1 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - - name: Install Composer dependencies - run: | - composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader - - - name: Psalm - run: psalm --output-format=github - - bc_check: - name: BC Check - runs-on: ubuntu-latest - needs: [setup, phpunit] - steps: - - uses: actions/checkout@v2 - - name: fetch tags - run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* - - name: Restore/cache vendor folder - uses: actions/cache@v1 - with: - path: vendor - key: all-build-${{ hashFiles('**/composer.lock') }} - restore-keys: | - all-build-${{ hashFiles('**/composer.lock') }} - all-build- - - name: Roave BC Check - uses: docker://nyholm/roave-bc-check-ga diff --git a/vendor/phpdocumentor/reflection-common/LICENSE b/vendor/phpdocumentor/reflection-common/LICENSE deleted file mode 100644 index ed6926c..0000000 --- a/vendor/phpdocumentor/reflection-common/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 phpDocumentor - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/vendor/phpdocumentor/reflection-common/README.md b/vendor/phpdocumentor/reflection-common/README.md deleted file mode 100644 index 70f830d..0000000 --- a/vendor/phpdocumentor/reflection-common/README.md +++ /dev/null @@ -1,11 +0,0 @@ -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -![Qa workflow](https://github.com/phpDocumentor/ReflectionCommon/workflows/Qa%20workflow/badge.svg) -[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionCommon.svg)](https://coveralls.io/github/phpDocumentor/ReflectionCommon?branch=master) -[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) -[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) -[![Stable Version](https://img.shields.io/packagist/v/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) -[![Unstable Version](https://img.shields.io/packagist/vpre/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) - - -ReflectionCommon -================ diff --git a/vendor/phpdocumentor/reflection-common/composer.json b/vendor/phpdocumentor/reflection-common/composer.json deleted file mode 100644 index 4d128b4..0000000 --- a/vendor/phpdocumentor/reflection-common/composer.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "phpdocumentor/reflection-common", - "keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN"], - "homepage": "http://www.phpdoc.org", - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "license": "MIT", - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "require": { - "php": "^7.2 || ^8.0" - }, - "autoload" : { - "psr-4" : { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "require-dev": { - }, - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - } -} diff --git a/vendor/phpdocumentor/reflection-common/src/Element.php b/vendor/phpdocumentor/reflection-common/src/Element.php deleted file mode 100644 index 8923e4f..0000000 --- a/vendor/phpdocumentor/reflection-common/src/Element.php +++ /dev/null @@ -1,30 +0,0 @@ -fqsen = $fqsen; - - if (isset($matches[2])) { - $this->name = $matches[2]; - } else { - $matches = explode('\\', $fqsen); - $name = end($matches); - assert(is_string($name)); - $this->name = trim($name, '()'); - } - } - - /** - * converts this class to string. - */ - public function __toString() : string - { - return $this->fqsen; - } - - /** - * Returns the name of the element without path. - */ - public function getName() : string - { - return $this->name; - } -} diff --git a/vendor/phpdocumentor/reflection-common/src/Location.php b/vendor/phpdocumentor/reflection-common/src/Location.php deleted file mode 100644 index 177deed..0000000 --- a/vendor/phpdocumentor/reflection-common/src/Location.php +++ /dev/null @@ -1,53 +0,0 @@ -lineNumber = $lineNumber; - $this->columnNumber = $columnNumber; - } - - /** - * Returns the line number that is covered by this location. - */ - public function getLineNumber() : int - { - return $this->lineNumber; - } - - /** - * Returns the column number (character position on a line) for this location object. - */ - public function getColumnNumber() : int - { - return $this->columnNumber; - } -} diff --git a/vendor/phpdocumentor/reflection-common/src/Project.php b/vendor/phpdocumentor/reflection-common/src/Project.php deleted file mode 100644 index 57839fd..0000000 --- a/vendor/phpdocumentor/reflection-common/src/Project.php +++ /dev/null @@ -1,25 +0,0 @@ -create($docComment); -``` - -The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock` -whose methods can be queried: - -```php -// Contains the summary for this DocBlock -$summary = $docblock->getSummary(); - -// Contains \phpDocumentor\Reflection\DocBlock\Description object -$description = $docblock->getDescription(); - -// You can either cast it to string -$description = (string) $docblock->getDescription(); - -// Or use the render method to get a string representation of the Description. -$description = $docblock->getDescription()->render(); -``` - -> For more examples it would be best to review the scripts in the [`/examples` folder](/examples). diff --git a/vendor/phpdocumentor/reflection-docblock/composer.json b/vendor/phpdocumentor/reflection-docblock/composer.json deleted file mode 100644 index 7038f48..0000000 --- a/vendor/phpdocumentor/reflection-docblock/composer.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "phpdocumentor/reflection-docblock", - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1", - "phpdocumentor/reflection-common": "^2.2", - "ext-filter": "*" - }, - "require-dev": { - "mockery/mockery": "~1.3.2" - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "phpDocumentor\\Reflection\\": "tests/unit" - } - }, - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php deleted file mode 100644 index f3403d6..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php +++ /dev/null @@ -1,204 +0,0 @@ -summary = $summary; - $this->description = $description ?: new DocBlock\Description(''); - foreach ($tags as $tag) { - $this->addTag($tag); - } - - $this->context = $context; - $this->location = $location; - - $this->isTemplateEnd = $isTemplateEnd; - $this->isTemplateStart = $isTemplateStart; - } - - public function getSummary() : string - { - return $this->summary; - } - - public function getDescription() : DocBlock\Description - { - return $this->description; - } - - /** - * Returns the current context. - */ - public function getContext() : ?Types\Context - { - return $this->context; - } - - /** - * Returns the current location. - */ - public function getLocation() : ?Location - { - return $this->location; - } - - /** - * Returns whether this DocBlock is the start of a Template section. - * - * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker - * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. - * - * An example of such an opening is: - * - * ``` - * /**#@+ - * * My DocBlock - * * / - * ``` - * - * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all - * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). - * - * @see self::isTemplateEnd() for the check whether a closing marker was provided. - */ - public function isTemplateStart() : bool - { - return $this->isTemplateStart; - } - - /** - * Returns whether this DocBlock is the end of a Template section. - * - * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. - */ - public function isTemplateEnd() : bool - { - return $this->isTemplateEnd; - } - - /** - * Returns the tags for this DocBlock. - * - * @return Tag[] - */ - public function getTags() : array - { - return $this->tags; - } - - /** - * Returns an array of tags matching the given name. If no tags are found - * an empty array is returned. - * - * @param string $name String to search by. - * - * @return Tag[] - */ - public function getTagsByName(string $name) : array - { - $result = []; - - foreach ($this->getTags() as $tag) { - if ($tag->getName() !== $name) { - continue; - } - - $result[] = $tag; - } - - return $result; - } - - /** - * Checks if a tag of a certain type is present in this DocBlock. - * - * @param string $name Tag name to check for. - */ - public function hasTag(string $name) : bool - { - foreach ($this->getTags() as $tag) { - if ($tag->getName() === $name) { - return true; - } - } - - return false; - } - - /** - * Remove a tag from this DocBlock. - * - * @param Tag $tagToRemove The tag to remove. - */ - public function removeTag(Tag $tagToRemove) : void - { - foreach ($this->tags as $key => $tag) { - if ($tag === $tagToRemove) { - unset($this->tags[$key]); - break; - } - } - } - - /** - * Adds a tag to this DocBlock. - * - * @param Tag $tag The tag to add. - */ - private function addTag(Tag $tag) : void - { - $this->tags[] = $tag; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php deleted file mode 100644 index 7b11b80..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php +++ /dev/null @@ -1,114 +0,0 @@ -create('This is a {@see Description}', $context); - * - * The description factory will interpret the given body and create a body template and list of tags from them, and pass - * that onto the constructor if this class. - * - * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace - * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial - * > type names and FQSENs. - * - * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: - * - * $description = new Description( - * 'This is a %1$s', - * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] - * ); - * - * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object - * is mainly responsible for rendering. - * - * @see DescriptionFactory to create a new Description. - * @see Description\Formatter for the formatting of the body and tags. - */ -class Description -{ - /** @var string */ - private $bodyTemplate; - - /** @var Tag[] */ - private $tags; - - /** - * Initializes a Description with its body (template) and a listing of the tags used in the body template. - * - * @param Tag[] $tags - */ - public function __construct(string $bodyTemplate, array $tags = []) - { - $this->bodyTemplate = $bodyTemplate; - $this->tags = $tags; - } - - /** - * Returns the body template. - */ - public function getBodyTemplate() : string - { - return $this->bodyTemplate; - } - - /** - * Returns the tags for this DocBlock. - * - * @return Tag[] - */ - public function getTags() : array - { - return $this->tags; - } - - /** - * Renders this description as a string where the provided formatter will format the tags in the expected string - * format. - */ - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new PassthroughFormatter(); - } - - $tags = []; - foreach ($this->tags as $tag) { - $tags[] = '{' . $formatter->format($tag) . '}'; - } - - return vsprintf($this->bodyTemplate, $tags); - } - - /** - * Returns a plain string representation of this description. - */ - public function __toString() : string - { - return $this->render(); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php deleted file mode 100644 index c27d2a0..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php +++ /dev/null @@ -1,177 +0,0 @@ -tagFactory = $tagFactory; - } - - /** - * Returns the parsed text of this description. - */ - public function create(string $contents, ?TypeContext $context = null) : Description - { - $tokens = $this->lex($contents); - $count = count($tokens); - $tagCount = 0; - $tags = []; - - for ($i = 1; $i < $count; $i += 2) { - $tags[] = $this->tagFactory->create($tokens[$i], $context); - $tokens[$i] = '%' . ++$tagCount . '$s'; - } - - //In order to allow "literal" inline tags, the otherwise invalid - //sequence "{@}" is changed to "@", and "{}" is changed to "}". - //"%" is escaped to "%%" because of vsprintf. - //See unit tests for examples. - for ($i = 0; $i < $count; $i += 2) { - $tokens[$i] = str_replace(['{@}', '{}', '%'], ['@', '}', '%%'], $tokens[$i]); - } - - return new Description(implode('', $tokens), $tags); - } - - /** - * Strips the contents from superfluous whitespace and splits the description into a series of tokens. - * - * @return string[] A series of tokens of which the description text is composed. - */ - private function lex(string $contents) : array - { - $contents = $this->removeSuperfluousStartingWhitespace($contents); - - // performance optimalization; if there is no inline tag, don't bother splitting it up. - if (strpos($contents, '{@') === false) { - return [$contents]; - } - - return Utils::pregSplit( - '/\{ - # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. - (?!@\}) - # We want to capture the whole tag line, but without the inline tag delimiters. - (\@ - # Match everything up to the next delimiter. - [^{}]* - # Nested inline tag content should not be captured, or it will appear in the result separately. - (?: - # Match nested inline tags. - (?: - # Because we did not catch the tag delimiters earlier, we must be explicit with them here. - # Notice that this also matches "{}", as a way to later introduce it as an escape sequence. - \{(?1)?\} - | - # Make sure we match hanging "{". - \{ - ) - # Match content after the nested inline tag. - [^{}]* - )* # If there are more inline tags, match them as well. We use "*" since there may not be any - # nested inline tags. - ) - \}/Sux', - $contents, - 0, - PREG_SPLIT_DELIM_CAPTURE - ); - } - - /** - * Removes the superfluous from a multi-line description. - * - * When a description has more than one line then it can happen that the second and subsequent lines have an - * additional indentation. This is commonly in use with tags like this: - * - * {@}since 1.1.0 This is an example - * description where we have an - * indentation in the second and - * subsequent lines. - * - * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent - * lines and this may cause rendering issues when, for example, using a Markdown converter. - */ - private function removeSuperfluousStartingWhitespace(string $contents) : string - { - $lines = explode("\n", $contents); - - // if there is only one line then we don't have lines with superfluous whitespace and - // can use the contents as-is - if (count($lines) <= 1) { - return $contents; - } - - // determine how many whitespace characters need to be stripped - $startingSpaceCount = 9999999; - for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { - // lines with a no length do not count as they are not indented at all - if (trim($lines[$i]) === '') { - continue; - } - - // determine the number of prefixing spaces by checking the difference in line length before and after - // an ltrim - $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); - } - - // strip the number of spaces from each line - if ($startingSpaceCount > 0) { - for ($i = 1, $iMax = count($lines); $i < $iMax; ++$i) { - $lines[$i] = substr($lines[$i], $startingSpaceCount); - } - } - - return implode("\n", $lines); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php deleted file mode 100644 index 7249efb..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php +++ /dev/null @@ -1,157 +0,0 @@ -getFilePath(); - - $file = $this->getExampleFileContents($filename); - if (!$file) { - return sprintf('** File not found : %s **', $filename); - } - - return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); - } - - /** - * Registers the project's root directory where an 'examples' folder can be expected. - */ - public function setSourceDirectory(string $directory = '') : void - { - $this->sourceDirectory = $directory; - } - - /** - * Returns the project's root directory where an 'examples' folder can be expected. - */ - public function getSourceDirectory() : string - { - return $this->sourceDirectory; - } - - /** - * Registers a series of directories that may contain examples. - * - * @param string[] $directories - */ - public function setExampleDirectories(array $directories) : void - { - $this->exampleDirectories = $directories; - } - - /** - * Returns a series of directories that may contain examples. - * - * @return string[] - */ - public function getExampleDirectories() : array - { - return $this->exampleDirectories; - } - - /** - * Attempts to find the requested example file and returns its contents or null if no file was found. - * - * This method will try several methods in search of the given example file, the first one it encounters is - * returned: - * - * 1. Iterates through all examples folders for the given filename - * 2. Checks the source folder for the given filename - * 3. Checks the 'examples' folder in the current working directory for examples - * 4. Checks the path relative to the current working directory for the given filename - * - * @return string[] all lines of the example file - */ - private function getExampleFileContents(string $filename) : ?array - { - $normalizedPath = null; - - foreach ($this->exampleDirectories as $directory) { - $exampleFileFromConfig = $this->constructExamplePath($directory, $filename); - if (is_readable($exampleFileFromConfig)) { - $normalizedPath = $exampleFileFromConfig; - break; - } - } - - if (!$normalizedPath) { - if (is_readable($this->getExamplePathFromSource($filename))) { - $normalizedPath = $this->getExamplePathFromSource($filename); - } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { - $normalizedPath = $this->getExamplePathFromExampleDirectory($filename); - } elseif (is_readable($filename)) { - $normalizedPath = $filename; - } - } - - $lines = $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : false; - - return $lines !== false ? $lines : null; - } - - /** - * Get example filepath based on the example directory inside your project. - */ - private function getExamplePathFromExampleDirectory(string $file) : string - { - return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; - } - - /** - * Returns a path to the example file in the given directory.. - */ - private function constructExamplePath(string $directory, string $file) : string - { - return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; - } - - /** - * Get example filepath based on sourcecode. - */ - private function getExamplePathFromSource(string $file) : string - { - return sprintf( - '%s%s%s', - trim($this->getSourceDirectory(), '\\/'), - DIRECTORY_SEPARATOR, - trim($file, '"') - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php deleted file mode 100644 index 531970b..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php +++ /dev/null @@ -1,151 +0,0 @@ -indent = $indent; - $this->indentString = $indentString; - $this->isFirstLineIndented = $indentFirstLine; - $this->lineLength = $lineLength; - $this->tagFormatter = $tagFormatter ?: new PassthroughFormatter(); - } - - /** - * Generate a DocBlock comment. - * - * @param DocBlock $docblock The DocBlock to serialize. - * - * @return string The serialized doc block. - */ - public function getDocComment(DocBlock $docblock) : string - { - $indent = str_repeat($this->indentString, $this->indent); - $firstIndent = $this->isFirstLineIndented ? $indent : ''; - // 3 === strlen(' * ') - $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; - - $text = $this->removeTrailingSpaces( - $indent, - $this->addAsterisksForEachLine( - $indent, - $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength) - ) - ); - - $comment = $firstIndent . "/**\n"; - if ($text) { - $comment .= $indent . ' * ' . $text . "\n"; - $comment .= $indent . " *\n"; - } - - $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); - - return $comment . $indent . ' */'; - } - - private function removeTrailingSpaces(string $indent, string $text) : string - { - return str_replace( - sprintf("\n%s * \n", $indent), - sprintf("\n%s *\n", $indent), - $text - ); - } - - private function addAsterisksForEachLine(string $indent, string $text) : string - { - return str_replace( - "\n", - sprintf("\n%s * ", $indent), - $text - ); - } - - private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, ?int $wrapLength) : string - { - $text = $docblock->getSummary() . ((string) $docblock->getDescription() ? "\n\n" . $docblock->getDescription() - : ''); - if ($wrapLength !== null) { - $text = wordwrap($text, $wrapLength); - - return $text; - } - - return $text; - } - - private function addTagBlock(DocBlock $docblock, ?int $wrapLength, string $indent, string $comment) : string - { - foreach ($docblock->getTags() as $tag) { - $tagText = $this->tagFormatter->format($tag); - if ($wrapLength !== null) { - $tagText = wordwrap($tagText, $wrapLength); - } - - $tagText = str_replace( - "\n", - sprintf("\n%s * ", $indent), - $tagText - ); - - $comment .= sprintf("%s * %s\n", $indent, $tagText); - } - - return $comment; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php deleted file mode 100644 index e64b587..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php +++ /dev/null @@ -1,347 +0,0 @@ - Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise - * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to - * > verify that a dependency is actually passed. - * - * This Factory also features a Service Locator component that is used to pass the right dependencies to the - * `create` method of a tag; each dependency should be registered as a service or as a parameter. - * - * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass - * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. - */ -final class StandardTagFactory implements TagFactory -{ - /** PCRE regular expression matching a tag name. */ - public const REGEX_TAGNAME = '[\w\-\_\\\\:]+'; - - /** - * @var array> An array with a tag as a key, and an - * FQCN to a class that handles it as an array value. - */ - private $tagHandlerMappings = [ - 'author' => Author::class, - 'covers' => Covers::class, - 'deprecated' => Deprecated::class, - // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', - 'link' => LinkTag::class, - 'method' => Method::class, - 'param' => Param::class, - 'property-read' => PropertyRead::class, - 'property' => Property::class, - 'property-write' => PropertyWrite::class, - 'return' => Return_::class, - 'see' => SeeTag::class, - 'since' => Since::class, - 'source' => Source::class, - 'throw' => Throws::class, - 'throws' => Throws::class, - 'uses' => Uses::class, - 'var' => Var_::class, - 'version' => Version::class, - ]; - - /** - * @var array> An array with a anotation s a key, and an - * FQCN to a class that handles it as an array value. - */ - private $annotationMappings = []; - - /** - * @var ReflectionParameter[][] a lazy-loading cache containing parameters - * for each tagHandler that has been used. - */ - private $tagHandlerParameterCache = []; - - /** @var FqsenResolver */ - private $fqsenResolver; - - /** - * @var mixed[] an array representing a simple Service Locator where we can store parameters and - * services that can be inserted into the Factory Methods of Tag Handlers. - */ - private $serviceLocator = []; - - /** - * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. - * - * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property - * is used. - * - * @see self::registerTagHandler() to add a new tag handler to the existing default list. - * - * @param array> $tagHandlers - */ - public function __construct(FqsenResolver $fqsenResolver, ?array $tagHandlers = null) - { - $this->fqsenResolver = $fqsenResolver; - if ($tagHandlers !== null) { - $this->tagHandlerMappings = $tagHandlers; - } - - $this->addService($fqsenResolver, FqsenResolver::class); - } - - public function create(string $tagLine, ?TypeContext $context = null) : Tag - { - if (!$context) { - $context = new TypeContext(''); - } - - [$tagName, $tagBody] = $this->extractTagParts($tagLine); - - return $this->createTag(trim($tagBody), $tagName, $context); - } - - /** - * @param mixed $value - */ - public function addParameter(string $name, $value) : void - { - $this->serviceLocator[$name] = $value; - } - - public function addService(object $service, ?string $alias = null) : void - { - $this->serviceLocator[$alias ?: get_class($service)] = $service; - } - - public function registerTagHandler(string $tagName, string $handler) : void - { - Assert::stringNotEmpty($tagName); - Assert::classExists($handler); - Assert::implementsInterface($handler, Tag::class); - - if (strpos($tagName, '\\') && $tagName[0] !== '\\') { - throw new InvalidArgumentException( - 'A namespaced tag must have a leading backslash as it must be fully qualified' - ); - } - - $this->tagHandlerMappings[$tagName] = $handler; - } - - /** - * Extracts all components for a tag. - * - * @return string[] - */ - private function extractTagParts(string $tagLine) : array - { - $matches = []; - if (!preg_match('/^@(' . self::REGEX_TAGNAME . ')((?:[\s\(\{])\s*([^\s].*)|$)/us', $tagLine, $matches)) { - throw new InvalidArgumentException( - 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors' - ); - } - - if (count($matches) < 3) { - $matches[] = ''; - } - - return array_slice($matches, 1); - } - - /** - * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the - * body was invalid. - */ - private function createTag(string $body, string $name, TypeContext $context) : Tag - { - $handlerClassName = $this->findHandlerClassName($name, $context); - $arguments = $this->getArgumentsForParametersFromWiring( - $this->fetchParametersForHandlerFactoryMethod($handlerClassName), - $this->getServiceLocatorWithDynamicParameters($context, $name, $body) - ); - - try { - $callable = [$handlerClassName, 'create']; - Assert::isCallable($callable); - /** @phpstan-var callable(string): ?Tag $callable */ - $tag = call_user_func_array($callable, $arguments); - - return $tag ?? InvalidTag::create($body, $name); - } catch (InvalidArgumentException $e) { - return InvalidTag::create($body, $name)->withError($e); - } - } - - /** - * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). - * - * @return class-string - */ - private function findHandlerClassName(string $tagName, TypeContext $context) : string - { - $handlerClassName = Generic::class; - if (isset($this->tagHandlerMappings[$tagName])) { - $handlerClassName = $this->tagHandlerMappings[$tagName]; - } elseif ($this->isAnnotation($tagName)) { - // TODO: Annotation support is planned for a later stage and as such is disabled for now - $tagName = (string) $this->fqsenResolver->resolve($tagName, $context); - if (isset($this->annotationMappings[$tagName])) { - $handlerClassName = $this->annotationMappings[$tagName]; - } - } - - return $handlerClassName; - } - - /** - * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. - * - * @param ReflectionParameter[] $parameters - * @param mixed[] $locator - * - * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters - * is provided with this method. - */ - private function getArgumentsForParametersFromWiring(array $parameters, array $locator) : array - { - $arguments = []; - foreach ($parameters as $parameter) { - $type = $parameter->getType(); - $typeHint = null; - if ($type instanceof ReflectionNamedType) { - $typeHint = $type->getName(); - if ($typeHint === 'self') { - $declaringClass = $parameter->getDeclaringClass(); - if ($declaringClass !== null) { - $typeHint = $declaringClass->getName(); - } - } - } - - if (isset($locator[$typeHint])) { - $arguments[] = $locator[$typeHint]; - continue; - } - - $parameterName = $parameter->getName(); - if (isset($locator[$parameterName])) { - $arguments[] = $locator[$parameterName]; - continue; - } - - $arguments[] = null; - } - - return $arguments; - } - - /** - * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given - * tag handler class name. - * - * @param class-string $handlerClassName - * - * @return ReflectionParameter[] - */ - private function fetchParametersForHandlerFactoryMethod(string $handlerClassName) : array - { - if (!isset($this->tagHandlerParameterCache[$handlerClassName])) { - $methodReflection = new ReflectionMethod($handlerClassName, 'create'); - $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); - } - - return $this->tagHandlerParameterCache[$handlerClassName]; - } - - /** - * Returns a copy of this class' Service Locator with added dynamic parameters, - * such as the tag's name, body and Context. - * - * @param TypeContext $context The Context (namespace and aliasses) that may be - * passed and is used to resolve FQSENs. - * @param string $tagName The name of the tag that may be - * passed onto the factory method of the Tag class. - * @param string $tagBody The body of the tag that may be - * passed onto the factory method of the Tag class. - * - * @return mixed[] - */ - private function getServiceLocatorWithDynamicParameters( - TypeContext $context, - string $tagName, - string $tagBody - ) : array { - return array_merge( - $this->serviceLocator, - [ - 'name' => $tagName, - 'body' => $tagBody, - TypeContext::class => $context, - ] - ); - } - - /** - * Returns whether the given tag belongs to an annotation. - * - * @todo this method should be populated once we implement Annotation notation support. - */ - private function isAnnotation(string $tagContent) : bool - { - // 1. Contains a namespace separator - // 2. Contains parenthesis - // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part - // of the annotation class name matches the found tag name - - return false; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php deleted file mode 100644 index f55de91..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php +++ /dev/null @@ -1,32 +0,0 @@ - $handler FQCN of handler. - * - * @throws InvalidArgumentException If the tag name is not a string. - * @throws InvalidArgumentException If the tag name is namespaced (contains backslashes) but - * does not start with a backslash. - * @throws InvalidArgumentException If the handler is not a string. - * @throws InvalidArgumentException If the handler is not an existing class. - * @throws InvalidArgumentException If the handler does not implement the {@see Tag} interface. - */ - public function registerTagHandler(string $tagName, string $handler) : void; -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php deleted file mode 100644 index d120757..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php +++ /dev/null @@ -1,100 +0,0 @@ -authorName = $authorName; - $this->authorEmail = $authorEmail; - } - - /** - * Gets the author's name. - * - * @return string The author's name. - */ - public function getAuthorName() : string - { - return $this->authorName; - } - - /** - * Returns the author's email. - * - * @return string The author's email. - */ - public function getEmail() : string - { - return $this->authorEmail; - } - - /** - * Returns this tag in string form. - */ - public function __toString() : string - { - if ($this->authorEmail) { - $authorEmail = '<' . $this->authorEmail . '>'; - } else { - $authorEmail = ''; - } - - $authorName = (string) $this->authorName; - - return $authorName . ($authorEmail !== '' ? ($authorName !== '' ? ' ' : '') . $authorEmail : ''); - } - - /** - * Attempts to create a new Author object based on †he tag body. - */ - public static function create(string $body) : ?self - { - $splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches); - if (!$splitTagContent) { - return null; - } - - $authorName = trim($matches[1]); - $email = isset($matches[2]) ? trim($matches[2]) : ''; - - return new static($authorName, $email); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php deleted file mode 100644 index fbcd402..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php +++ /dev/null @@ -1,53 +0,0 @@ -name; - } - - public function getDescription() : ?Description - { - return $this->description; - } - - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - - return $formatter->format($this); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php deleted file mode 100644 index 9e52e5e..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php +++ /dev/null @@ -1,100 +0,0 @@ -refers = $refers; - $this->description = $description; - } - - public static function create( - string $body, - ?DescriptionFactory $descriptionFactory = null, - ?FqsenResolver $resolver = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($descriptionFactory); - Assert::notNull($resolver); - - $parts = Utils::pregSplit('/\s+/Su', $body, 2); - - return new static( - self::resolveFqsen($parts[0], $resolver, $context), - $descriptionFactory->create($parts[1] ?? '', $context) - ); - } - - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen - { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; - } - - return new Fqsen($resolved . '::' . $fqsenParts[1]); - } - - /** - * Returns the structural element this tag refers to. - */ - public function getReference() : Fqsen - { - return $this->refers; - } - - /** - * Returns a string representation of this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $refers = (string) $this->refers; - - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php deleted file mode 100644 index 68e8f03..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php +++ /dev/null @@ -1,108 +0,0 @@ -version = $version; - $this->description = $description; - } - - /** - * @return static - */ - public static function create( - ?string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - if (empty($body)) { - return new static(); - } - - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { - return new static( - null, - $descriptionFactory !== null ? $descriptionFactory->create($body, $context) : null - ); - } - - Assert::notNull($descriptionFactory); - - return new static( - $matches[1], - $descriptionFactory->create($matches[2] ?? '', $context) - ); - } - - /** - * Gets the version section of the tag. - */ - public function getVersion() : ?string - { - return $this->version; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $version = (string) $this->version; - - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php deleted file mode 100644 index 3face1e..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php +++ /dev/null @@ -1,199 +0,0 @@ -filePath = $filePath; - $this->startingLine = $startingLine; - $this->lineCount = $lineCount; - if ($content !== null) { - $this->content = trim($content); - } - - $this->isURI = $isURI; - } - - public function getContent() : string - { - if ($this->content === null || $this->content === '') { - $filePath = $this->filePath; - if ($this->isURI) { - $filePath = $this->isUriRelative($this->filePath) - ? str_replace('%2F', '/', rawurlencode($this->filePath)) - : $this->filePath; - } - - return trim($filePath); - } - - return $this->content; - } - - public function getDescription() : ?string - { - return $this->content; - } - - public static function create(string $body) : ?Tag - { - // File component: File path in quotes or File URI / Source information - if (!preg_match('/^\s*(?:(\"[^\"]+\")|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) { - return null; - } - - $filePath = null; - $fileUri = null; - if ($matches[1] !== '') { - $filePath = $matches[1]; - } else { - $fileUri = $matches[2]; - } - - $startingLine = 1; - $lineCount = 0; - $description = null; - - if (array_key_exists(3, $matches)) { - $description = $matches[3]; - - // Starting line / Number of lines / Description - if (preg_match('/^([1-9]\d*)(?:\s+((?1))\s*)?(.*)$/sux', $matches[3], $contentMatches)) { - $startingLine = (int) $contentMatches[1]; - if (isset($contentMatches[2])) { - $lineCount = (int) $contentMatches[2]; - } - - if (array_key_exists(3, $contentMatches)) { - $description = $contentMatches[3]; - } - } - } - - return new static( - $filePath ?? ($fileUri ?? ''), - $fileUri !== null, - $startingLine, - $lineCount, - $description - ); - } - - /** - * Returns the file path. - * - * @return string Path to a file to use as an example. - * May also be an absolute URI. - */ - public function getFilePath() : string - { - return trim($this->filePath, '"'); - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - $filePath = (string) $this->filePath; - $isDefaultLine = $this->startingLine === 1 && $this->lineCount === 0; - $startingLine = !$isDefaultLine ? (string) $this->startingLine : ''; - $lineCount = !$isDefaultLine ? (string) $this->lineCount : ''; - $content = (string) $this->content; - - return $filePath - . ($startingLine !== '' - ? ($filePath !== '' ? ' ' : '') . $startingLine - : '') - . ($lineCount !== '' - ? ($filePath !== '' || $startingLine !== '' ? ' ' : '') . $lineCount - : '') - . ($content !== '' - ? ($filePath !== '' || $startingLine !== '' || $lineCount !== '' ? ' ' : '') . $content - : ''); - } - - /** - * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). - */ - private function isUriRelative(string $uri) : bool - { - return strpos($uri, ':') === false; - } - - public function getStartingLine() : int - { - return $this->startingLine; - } - - public function getLineCount() : int - { - return $this->lineCount; - } - - public function getName() : string - { - return 'example'; - } - - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - - return $formatter->format($this); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php deleted file mode 100644 index f6f0bb5..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php +++ /dev/null @@ -1,25 +0,0 @@ -maxLen = max($this->maxLen, strlen($tag->getName())); - } - } - - /** - * Formats the given tag to return a simple plain text version. - */ - public function format(Tag $tag) : string - { - return '@' . $tag->getName() . - str_repeat( - ' ', - $this->maxLen - strlen($tag->getName()) + 1 - ) . - $tag; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php deleted file mode 100644 index f26d22f..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php +++ /dev/null @@ -1,29 +0,0 @@ -getName() . ' ' . $tag); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php deleted file mode 100644 index a7b423f..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php +++ /dev/null @@ -1,88 +0,0 @@ -validateTagName($name); - - $this->name = $name; - $this->description = $description; - } - - /** - * Creates a new tag that represents any unknown tag type. - * - * @return static - */ - public static function create( - string $body, - string $name = '', - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($name); - Assert::notNull($descriptionFactory); - - $description = $body !== '' ? $descriptionFactory->create($body, $context) : null; - - return new static($name, $description); - } - - /** - * Returns the tag as a serialized string - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - return $description; - } - - /** - * Validates if the tag name matches the expected format, otherwise throws an exception. - */ - private function validateTagName(string $name) : void - { - if (!preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { - throw new InvalidArgumentException( - 'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' - . 'hyphens and backslashes.' - ); - } - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php deleted file mode 100644 index e3deb5a..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php +++ /dev/null @@ -1,144 +0,0 @@ -name = $name; - $this->body = $body; - } - - public function getException() : ?Throwable - { - return $this->throwable; - } - - public function getName() : string - { - return $this->name; - } - - public static function create(string $body, string $name = '') : self - { - return new self($name, $body); - } - - public function withError(Throwable $exception) : self - { - $this->flattenExceptionBacktrace($exception); - $tag = new self($this->name, $this->body); - $tag->throwable = $exception; - - return $tag; - } - - /** - * Removes all complex types from backtrace - * - * Not all objects are serializable. So we need to remove them from the - * stored exception to be sure that we do not break existing library usage. - */ - private function flattenExceptionBacktrace(Throwable $exception) : void - { - $traceProperty = (new ReflectionClass(Exception::class))->getProperty('trace'); - $traceProperty->setAccessible(true); - - do { - $trace = $exception->getTrace(); - if (isset($trace[0]['args'])) { - $trace = array_map( - function (array $call) : array { - $call['args'] = array_map([$this, 'flattenArguments'], $call['args']); - - return $call; - }, - $trace - ); - } - - $traceProperty->setValue($exception, $trace); - $exception = $exception->getPrevious(); - } while ($exception !== null); - - $traceProperty->setAccessible(false); - } - - /** - * @param mixed $value - * - * @return mixed - * - * @throws ReflectionException - */ - private function flattenArguments($value) - { - if ($value instanceof Closure) { - $closureReflection = new ReflectionFunction($value); - $value = sprintf( - '(Closure at %s:%s)', - $closureReflection->getFileName(), - $closureReflection->getStartLine() - ); - } elseif (is_object($value)) { - $value = sprintf('object(%s)', get_class($value)); - } elseif (is_resource($value)) { - $value = sprintf('resource(%s)', get_resource_type($value)); - } elseif (is_array($value)) { - $value = array_map([$this, 'flattenArguments'], $value); - } - - return $value; - } - - public function render(?Formatter $formatter = null) : string - { - if ($formatter === null) { - $formatter = new Formatter\PassthroughFormatter(); - } - - return $formatter->format($this); - } - - public function __toString() : string - { - return $this->body; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php deleted file mode 100644 index 226bbe0..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php +++ /dev/null @@ -1,78 +0,0 @@ -link = $link; - $this->description = $description; - } - - public static function create( - string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::notNull($descriptionFactory); - - $parts = Utils::pregSplit('/\s+/Su', $body, 2); - $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; - - return new static($parts[0], $description); - } - - /** - * Gets the link - */ - public function getLink() : string - { - return $this->link; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $link = (string) $this->link; - - return $link . ($description !== '' ? ($link !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php deleted file mode 100644 index 08c0407..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php +++ /dev/null @@ -1,279 +0,0 @@ - - * @var array> - */ - private $arguments; - - /** @var bool */ - private $isStatic; - - /** @var Type */ - private $returnType; - - /** - * @param array> $arguments - * - * @phpstan-param array $arguments - */ - public function __construct( - string $methodName, - array $arguments = [], - ?Type $returnType = null, - bool $static = false, - ?Description $description = null - ) { - Assert::stringNotEmpty($methodName); - - if ($returnType === null) { - $returnType = new Void_(); - } - - $this->methodName = $methodName; - $this->arguments = $this->filterArguments($arguments); - $this->returnType = $returnType; - $this->isStatic = $static; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : ?self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - // 1. none or more whitespace - // 2. optionally the keyword "static" followed by whitespace - // 3. optionally a word with underscores followed by whitespace : as - // type for the return value - // 4. then optionally a word with underscores followed by () and - // whitespace : as method name as used by phpDocumentor - // 5. then a word with underscores, followed by ( and any character - // until a ) and whitespace : as method name with signature - // 6. any remaining text : as description - if (!preg_match( - '/^ - # Static keyword - # Declares a static method ONLY if type is also present - (?: - (static) - \s+ - )? - # Return type - (?: - ( - (?:[\w\|_\\\\]*\$this[\w\|_\\\\]*) - | - (?: - (?:[\w\|_\\\\]+) - # array notation - (?:\[\])* - )*+ - ) - \s+ - )? - # Method name - ([\w_]+) - # Arguments - (?: - \(([^\)]*)\) - )? - \s* - # Description - (.*) - $/sux', - $body, - $matches - )) { - return null; - } - - [, $static, $returnType, $methodName, $argumentLines, $description] = $matches; - - $static = $static === 'static'; - - if ($returnType === '') { - $returnType = 'void'; - } - - $returnType = $typeResolver->resolve($returnType, $context); - $description = $descriptionFactory->create($description, $context); - - /** @phpstan-var array $arguments */ - $arguments = []; - if ($argumentLines !== '') { - $argumentsExploded = explode(',', $argumentLines); - foreach ($argumentsExploded as $argument) { - $argument = explode(' ', self::stripRestArg(trim($argument)), 2); - if (strpos($argument[0], '$') === 0) { - $argumentName = substr($argument[0], 1); - $argumentType = new Mixed_(); - } else { - $argumentType = $typeResolver->resolve($argument[0], $context); - $argumentName = ''; - if (isset($argument[1])) { - $argument[1] = self::stripRestArg($argument[1]); - $argumentName = substr($argument[1], 1); - } - } - - $arguments[] = ['name' => $argumentName, 'type' => $argumentType]; - } - } - - return new static($methodName, $arguments, $returnType, $static, $description); - } - - /** - * Retrieves the method name. - */ - public function getMethodName() : string - { - return $this->methodName; - } - - /** - * @return array> - * - * @phpstan-return array - */ - public function getArguments() : array - { - return $this->arguments; - } - - /** - * Checks whether the method tag describes a static method or not. - * - * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. - */ - public function isStatic() : bool - { - return $this->isStatic; - } - - public function getReturnType() : Type - { - return $this->returnType; - } - - public function __toString() : string - { - $arguments = []; - foreach ($this->arguments as $argument) { - $arguments[] = $argument['type'] . ' $' . $argument['name']; - } - - $argumentStr = '(' . implode(', ', $arguments) . ')'; - - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $static = $this->isStatic ? 'static' : ''; - - $returnType = (string) $this->returnType; - - $methodName = (string) $this->methodName; - - return $static - . ($returnType !== '' ? ($static !== '' ? ' ' : '') . $returnType : '') - . ($methodName !== '' ? ($static !== '' || $returnType !== '' ? ' ' : '') . $methodName : '') - . $argumentStr - . ($description !== '' ? ' ' . $description : ''); - } - - /** - * @param mixed[][]|string[] $arguments - * - * @return mixed[][] - * - * @phpstan-param array $arguments - * @phpstan-return array - */ - private function filterArguments(array $arguments = []) : array - { - $result = []; - foreach ($arguments as $argument) { - if (is_string($argument)) { - $argument = ['name' => $argument]; - } - - if (!isset($argument['type'])) { - $argument['type'] = new Mixed_(); - } - - $keys = array_keys($argument); - sort($keys); - if ($keys !== ['name', 'type']) { - throw new InvalidArgumentException( - 'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true) - ); - } - - $result[] = $argument; - } - - return $result; - } - - private static function stripRestArg(string $argument) : string - { - if (strpos($argument, '...') === 0) { - $argument = trim(substr($argument, 3)); - } - - return $argument; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php deleted file mode 100644 index 83419e9..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php +++ /dev/null @@ -1,172 +0,0 @@ -name = 'param'; - $this->variableName = $variableName; - $this->type = $type; - $this->isVariadic = $isVariadic; - $this->description = $description; - $this->isReference = $isReference; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - - $type = null; - $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - $isVariadic = false; - $isReference = false; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && !self::strStartsWithVariable($firstPart)) { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ or ...$ or &$ or &...$ it must be the variable name - if (isset($parts[0]) && self::strStartsWithVariable($parts[0])) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - - Assert::notNull($variableName); - - if (strpos($variableName, '$') === 0) { - $variableName = substr($variableName, 1); - } elseif (strpos($variableName, '&$') === 0) { - $isReference = true; - $variableName = substr($variableName, 2); - } elseif (strpos($variableName, '...$') === 0) { - $isVariadic = true; - $variableName = substr($variableName, 4); - } elseif (strpos($variableName, '&...$') === 0) { - $isVariadic = true; - $isReference = true; - $variableName = substr($variableName, 5); - } - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $isVariadic, $description, $isReference); - } - - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - - /** - * Returns whether this tag is variadic. - */ - public function isVariadic() : bool - { - return $this->isVariadic; - } - - /** - * Returns whether this tag is passed by reference. - */ - public function isReference() : bool - { - return $this->isReference; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $variableName = ''; - if ($this->variableName) { - $variableName .= ($this->isReference ? '&' : '') . ($this->isVariadic ? '...' : ''); - $variableName .= '$' . $this->variableName; - } - - $type = (string) $this->type; - - return $type - . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') - . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } - - private static function strStartsWithVariable(string $str) : bool - { - return strpos($str, '$') === 0 - || - strpos($str, '...$') === 0 - || - strpos($str, '&$') === 0 - || - strpos($str, '&...$') === 0; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php deleted file mode 100644 index 0389757..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php +++ /dev/null @@ -1,119 +0,0 @@ -name = 'property'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - - $type = (string) $this->type; - - return $type - . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') - . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php deleted file mode 100644 index 7ff55d5..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php +++ /dev/null @@ -1,119 +0,0 @@ -name = 'property-read'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - - $type = (string) $this->type; - - return $type - . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') - . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php deleted file mode 100644 index cc1e4b6..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php +++ /dev/null @@ -1,119 +0,0 @@ -name = 'property-write'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - $type = null; - $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - - $type = (string) $this->type; - - return $type - . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') - . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php deleted file mode 100644 index cede74c..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php +++ /dev/null @@ -1,38 +0,0 @@ -fqsen = $fqsen; - } - - /** - * @return string string representation of the referenced fqsen - */ - public function __toString() : string - { - return (string) $this->fqsen; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php deleted file mode 100644 index 5eedcbc..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php +++ /dev/null @@ -1,22 +0,0 @@ -uri = $uri; - } - - public function __toString() : string - { - return $this->uri; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php deleted file mode 100644 index 546a0ea..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php +++ /dev/null @@ -1,64 +0,0 @@ -name = 'return'; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$type, $description] = self::extractTypeFromBody($body); - - $type = $typeResolver->resolve($type, $context); - $description = $descriptionFactory->create($description, $context); - - return new static($type, $description); - } - - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $type = $this->type ? '' . $this->type : 'mixed'; - - return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php deleted file mode 100644 index 73311df..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php +++ /dev/null @@ -1,105 +0,0 @@ -refers = $refers; - $this->description = $description; - } - - public static function create( - string $body, - ?FqsenResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::notNull($descriptionFactory); - - $parts = Utils::pregSplit('/\s+/Su', $body, 2); - $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; - - // https://tools.ietf.org/html/rfc2396#section-3 - if (preg_match('/\w:\/\/\w/i', $parts[0])) { - return new static(new Url($parts[0]), $description); - } - - return new static(new FqsenRef(self::resolveFqsen($parts[0], $typeResolver, $context)), $description); - } - - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen - { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; - } - - return new Fqsen($resolved . '::' . $fqsenParts[1]); - } - - /** - * Returns the ref of this tag. - */ - public function getReference() : Reference - { - return $this->refers; - } - - /** - * Returns a string representation of this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $refers = (string) $this->refers; - - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php deleted file mode 100644 index 32de527..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php +++ /dev/null @@ -1,102 +0,0 @@ -version = $version; - $this->description = $description; - } - - public static function create( - ?string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : ?self { - if (empty($body)) { - return new static(); - } - - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { - return null; - } - - Assert::notNull($descriptionFactory); - - return new static( - $matches[1], - $descriptionFactory->create($matches[2] ?? '', $context) - ); - } - - /** - * Gets the version section of the tag. - */ - public function getVersion() : ?string - { - return $this->version; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $version = (string) $this->version; - - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php deleted file mode 100644 index f0c3101..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php +++ /dev/null @@ -1,117 +0,0 @@ -startingLine = (int) $startingLine; - $this->lineCount = $lineCount !== null ? (int) $lineCount : null; - $this->description = $description; - } - - public static function create( - string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($descriptionFactory); - - $startingLine = 1; - $lineCount = null; - $description = null; - - // Starting line / Number of lines / Description - if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $body, $matches)) { - $startingLine = (int) $matches[1]; - if (isset($matches[2]) && $matches[2] !== '') { - $lineCount = (int) $matches[2]; - } - - $description = $matches[3]; - } - - return new static($startingLine, $lineCount, $descriptionFactory->create($description??'', $context)); - } - - /** - * Gets the starting line. - * - * @return int The starting line, relative to the structural element's - * location. - */ - public function getStartingLine() : int - { - return $this->startingLine; - } - - /** - * Returns the number of lines. - * - * @return int|null The number of lines, relative to the starting line. NULL - * means "to the end". - */ - public function getLineCount() : ?int - { - return $this->lineCount; - } - - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $startingLine = (string) $this->startingLine; - - $lineCount = $this->lineCount !== null ? '' . $this->lineCount : ''; - - return $startingLine - . ($lineCount !== '' - ? ($startingLine || $startingLine === '0' ? ' ' : '') . $lineCount - : '') - . ($description !== '' - ? ($startingLine || $startingLine === '0' || $lineCount !== '' ? ' ' : '') . $description - : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php deleted file mode 100644 index 0083d34..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php +++ /dev/null @@ -1,65 +0,0 @@ -type; - } - - /** - * @return string[] - */ - protected static function extractTypeFromBody(string $body) : array - { - $type = ''; - $nestingLevel = 0; - for ($i = 0, $iMax = strlen($body); $i < $iMax; $i++) { - $character = $body[$i]; - - if ($nestingLevel === 0 && trim($character) === '') { - break; - } - - $type .= $character; - if (in_array($character, ['<', '(', '[', '{'])) { - $nestingLevel++; - continue; - } - - if (in_array($character, ['>', ')', ']', '}'])) { - $nestingLevel--; - continue; - } - } - - $description = trim(substr($body, strlen($type))); - - return [$type, $description]; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php deleted file mode 100644 index d4dc947..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php +++ /dev/null @@ -1,64 +0,0 @@ -name = 'throws'; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$type, $description] = self::extractTypeFromBody($body); - - $type = $typeResolver->resolve($type, $context); - $description = $descriptionFactory->create($description, $context); - - return new static($type, $description); - } - - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $type = (string) $this->type; - - return $type . ($description !== '' ? ($type !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php deleted file mode 100644 index 4d52afc..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php +++ /dev/null @@ -1,99 +0,0 @@ -refers = $refers; - $this->description = $description; - } - - public static function create( - string $body, - ?FqsenResolver $resolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::notNull($resolver); - Assert::notNull($descriptionFactory); - - $parts = Utils::pregSplit('/\s+/Su', $body, 2); - - return new static( - self::resolveFqsen($parts[0], $resolver, $context), - $descriptionFactory->create($parts[1] ?? '', $context) - ); - } - - private static function resolveFqsen(string $parts, ?FqsenResolver $fqsenResolver, ?TypeContext $context) : Fqsen - { - Assert::notNull($fqsenResolver); - $fqsenParts = explode('::', $parts); - $resolved = $fqsenResolver->resolve($fqsenParts[0], $context); - - if (!array_key_exists(1, $fqsenParts)) { - return $resolved; - } - - return new Fqsen($resolved . '::' . $fqsenParts[1]); - } - - /** - * Returns the structural element this tag refers to. - */ - public function getReference() : Fqsen - { - return $this->refers; - } - - /** - * Returns a string representation of this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $refers = (string) $this->refers; - - return $refers . ($description !== '' ? ($refers !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php deleted file mode 100644 index 762c262..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php +++ /dev/null @@ -1,120 +0,0 @@ -name = 'var'; - $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; - } - - public static function create( - string $body, - ?TypeResolver $typeResolver = null, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : self { - Assert::stringNotEmpty($body); - Assert::notNull($typeResolver); - Assert::notNull($descriptionFactory); - - [$firstPart, $body] = self::extractTypeFromBody($body); - - $parts = Utils::pregSplit('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); - $type = null; - $variableName = ''; - - // if the first item that is encountered is not a variable; it is a type - if ($firstPart && $firstPart[0] !== '$') { - $type = $typeResolver->resolve($firstPart, $context); - } else { - // first part is not a type; we should prepend it to the parts array for further processing - array_unshift($parts, $firstPart); - } - - // if the next item starts with a $ it must be the variable name - if (isset($parts[0]) && strpos($parts[0], '$') === 0) { - $variableName = array_shift($parts); - if ($type) { - array_shift($parts); - } - - Assert::notNull($variableName); - - $variableName = substr($variableName, 1); - } - - $description = $descriptionFactory->create(implode('', $parts), $context); - - return new static($variableName, $type, $description); - } - - /** - * Returns the variable's name. - */ - public function getVariableName() : ?string - { - return $this->variableName; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - if ($this->variableName) { - $variableName = '$' . $this->variableName; - } else { - $variableName = ''; - } - - $type = (string) $this->type; - - return $type - . ($variableName !== '' ? ($type !== '' ? ' ' : '') . $variableName : '') - . ($description !== '' ? ($type !== '' || $variableName !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php deleted file mode 100644 index 460c86d..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php +++ /dev/null @@ -1,105 +0,0 @@ -version = $version; - $this->description = $description; - } - - public static function create( - ?string $body, - ?DescriptionFactory $descriptionFactory = null, - ?TypeContext $context = null - ) : ?self { - if (empty($body)) { - return new static(); - } - - $matches = []; - if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { - return null; - } - - $description = null; - if ($descriptionFactory !== null) { - $description = $descriptionFactory->create($matches[2] ?? '', $context); - } - - return new static( - $matches[1], - $description - ); - } - - /** - * Gets the version section of the tag. - */ - public function getVersion() : ?string - { - return $this->version; - } - - /** - * Returns a string representation for this tag. - */ - public function __toString() : string - { - if ($this->description) { - $description = $this->description->render(); - } else { - $description = ''; - } - - $version = (string) $this->version; - - return $version . ($description !== '' ? ($version !== '' ? ' ' : '') . $description : ''); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php deleted file mode 100644 index cf04e5a..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php +++ /dev/null @@ -1,286 +0,0 @@ -descriptionFactory = $descriptionFactory; - $this->tagFactory = $tagFactory; - } - - /** - * Factory method for easy instantiation. - * - * @param array> $additionalTags - */ - public static function createInstance(array $additionalTags = []) : self - { - $fqsenResolver = new FqsenResolver(); - $tagFactory = new StandardTagFactory($fqsenResolver); - $descriptionFactory = new DescriptionFactory($tagFactory); - - $tagFactory->addService($descriptionFactory); - $tagFactory->addService(new TypeResolver($fqsenResolver)); - - $docBlockFactory = new self($descriptionFactory, $tagFactory); - foreach ($additionalTags as $tagName => $tagHandler) { - $docBlockFactory->registerTagHandler($tagName, $tagHandler); - } - - return $docBlockFactory; - } - - /** - * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the - * getDocComment method (such as a ReflectionClass object). - */ - public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock - { - if (is_object($docblock)) { - if (!method_exists($docblock, 'getDocComment')) { - $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; - - throw new InvalidArgumentException($exceptionMessage); - } - - $docblock = $docblock->getDocComment(); - Assert::string($docblock); - } - - Assert::stringNotEmpty($docblock); - - if ($context === null) { - $context = new Types\Context(''); - } - - $parts = $this->splitDocBlock($this->stripDocComment($docblock)); - - [$templateMarker, $summary, $description, $tags] = $parts; - - return new DocBlock( - $summary, - $description ? $this->descriptionFactory->create($description, $context) : null, - $this->parseTagBlock($tags, $context), - $context, - $location, - $templateMarker === '#@+', - $templateMarker === '#@-' - ); - } - - /** - * @param class-string $handler - */ - public function registerTagHandler(string $tagName, string $handler) : void - { - $this->tagFactory->registerTagHandler($tagName, $handler); - } - - /** - * Strips the asterisks from the DocBlock comment. - * - * @param string $comment String containing the comment text. - */ - private function stripDocComment(string $comment) : string - { - $comment = preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]?(.*)?#u', '$1', $comment); - Assert::string($comment); - $comment = trim($comment); - - // reg ex above is not able to remove */ from a single line docblock - if (substr($comment, -2) === '*/') { - $comment = trim(substr($comment, 0, -2)); - } - - return str_replace(["\r\n", "\r"], "\n", $comment); - } - - // phpcs:disable - /** - * Splits the DocBlock into a template marker, summary, description and block of tags. - * - * @param string $comment Comment to split into the sub-parts. - * - * @return string[] containing the template marker (if any), summary, description and a string containing the tags. - * - * @author Mike van Riel for extending the regex with template marker support. - * - * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. - */ - private function splitDocBlock(string $comment) : array - { - // phpcs:enable - // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This - // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the - // performance impact of running a regular expression - if (strpos($comment, '@') === 0) { - return ['', '', '', $comment]; - } - - // clears all extra horizontal whitespace from the line endings to prevent parsing issues - $comment = preg_replace('/\h*$/Sum', '', $comment); - Assert::string($comment); - /* - * Splits the docblock into a template marker, summary, description and tags section. - * - * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may - * occur after it and will be stripped). - * - The short description is started from the first character until a dot is encountered followed by a - * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing - * errors). This is optional. - * - The long description, any character until a new line is encountered followed by an @ and word - * characters (a tag). This is optional. - * - Tags; the remaining characters - * - * Big thanks to RichardJ for contributing this Regular Expression - */ - preg_match( - '/ - \A - # 1. Extract the template marker - (?:(\#\@\+|\#\@\-)\n?)? - - # 2. Extract the summary - (?: - (?! @\pL ) # The summary may not start with an @ - ( - [^\n.]+ - (?: - (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines - [\n.]* (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line - [^\n.]+ # Include anything else - )* - \.? - )? - ) - - # 3. Extract the description - (?: - \s* # Some form of whitespace _must_ precede a description because a summary must be there - (?! @\pL ) # The description may not start with an @ - ( - [^\n]+ - (?: \n+ - (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line - [^\n]+ # Include anything else - )* - ) - )? - - # 4. Extract the tags (anything that follows) - (\s+ [\s\S]*)? # everything that follows - /ux', - $comment, - $matches - ); - array_shift($matches); - - while (count($matches) < 4) { - $matches[] = ''; - } - - return $matches; - } - - /** - * Creates the tag objects. - * - * @param string $tags Tag block to parse. - * @param Types\Context $context Context of the parsed Tag - * - * @return DocBlock\Tag[] - */ - private function parseTagBlock(string $tags, Types\Context $context) : array - { - $tags = $this->filterTagBlock($tags); - if ($tags === null) { - return []; - } - - $result = []; - $lines = $this->splitTagBlockIntoTagLines($tags); - foreach ($lines as $key => $tagLine) { - $result[$key] = $this->tagFactory->create(trim($tagLine), $context); - } - - return $result; - } - - /** - * @return string[] - */ - private function splitTagBlockIntoTagLines(string $tags) : array - { - $result = []; - foreach (explode("\n", $tags) as $tagLine) { - if ($tagLine !== '' && strpos($tagLine, '@') === 0) { - $result[] = $tagLine; - } else { - $result[count($result) - 1] .= "\n" . $tagLine; - } - } - - return $result; - } - - private function filterTagBlock(string $tags) : ?string - { - $tags = trim($tags); - if (!$tags) { - return null; - } - - if ($tags[0] !== '@') { - // @codeCoverageIgnoreStart - // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that - // we didn't foresee. - - throw new LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); - - // @codeCoverageIgnoreEnd - } - - return $tags; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php deleted file mode 100644 index ef039a4..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -> $additionalTags - */ - public static function createInstance(array $additionalTags = []) : DocBlockFactory; - - /** - * @param string|object $docblock - */ - public function create($docblock, ?Types\Context $context = null, ?Location $location = null) : DocBlock; -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php b/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php deleted file mode 100644 index 77aa40e..0000000 --- a/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php +++ /dev/null @@ -1,38 +0,0 @@ - please note that if you want to pass partial class names that additional steps are necessary, see the - > chapter `Resolving partial classes and FQSENs` for more information. - -Where the FqsenResolver can resolve: - -- Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`) -- Function expressions (i.e. `@see \MyNamespace\myFunction()`) -- Class expressions (i.e. `@see \MyNamespace\MyClass`) -- Interface expressions (i.e. `@see \MyNamespace\MyInterface`) -- Trait expressions (i.e. `@see \MyNamespace\MyTrait`) -- Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`) -- Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`) -- Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`) - -## Resolving a type - -In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` and call its `resolve` method like this: - -```php -$typeResolver = new \phpDocumentor\Reflection\TypeResolver(); -$type = $typeResolver->resolve('string|integer'); -``` - -In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two -elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type -`\phpDocumentor\Reflection\Types\Integer`. - -The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. - -### Resolving nullable types - -Php 7.1 introduced nullable types e.g. `?string`. Type resolver will resolve the original type without the nullable notation `?` -just like it would do without the `?`. After that the type is wrapped in a `\phpDocumentor\Reflection\Types\Nullable` object. -The `Nullable` type has a method to fetch the actual type. - -## Resolving an FQSEN - -A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: - -```php -$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); -$fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()'); -``` - -In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. - -The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. - -## Resolving partial Classes and Structural Element Names - -Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class names. - -For example, you have this file: - -```php -namespace My\Example; - -use phpDocumentor\Reflection\Types; - -class Classy -{ - /** - * @var Types\Context - * @see Classy::otherFunction() - */ - public function __construct($context) {} - - public function otherFunction(){} -} -``` - -Suppose that you would want to resolve (and expand) the type in the `@var` tag and the element name in the `@see` tag. - -For the resolvers to know how to expand partial names you have to provide a bit of _Context_ for them by instantiating a new class named `\phpDocumentor\Reflection\Types\Context` with the name of the namespace and the aliases that are in play. - -### Creating a Context - -You can do this by manually creating a Context like this: - -```php -$context = new \phpDocumentor\Reflection\Types\Context( - '\My\Example', - [ 'Types' => '\phpDocumentor\Reflection\Types'] -); -``` - -Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector object or by providing the namespace that you'd like to extract and the source code of the file in which the given type expression occurs. - -```php -$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); -$context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct')); -``` - -or - -```php -$contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); -$context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php')); -``` - -### Using the Context - -After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver class as second argument and the Resolvers will take this into account when resolving partial names. - -To obtain the resolved class name for the `@var` tag in the example above you can do: - -```php -$typeResolver = new \phpDocumentor\Reflection\TypeResolver(); -$type = $typeResolver->resolve('Types\Context', $context); -``` - -When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be `phpDocumentor\Reflection\Types\Context`. - -> Why is the FQSEN wrapped in another object `Object_`? -> -> The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. - -Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To resolve that you can do the following: - -```php -$fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); -$type = $fqsenResolver->resolve('Classy::otherFunction()', $context); -``` - -Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the `resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to `\My\Example\Classy::otherFunction()`. diff --git a/vendor/phpdocumentor/type-resolver/composer.json b/vendor/phpdocumentor/type-resolver/composer.json deleted file mode 100644 index 242ecbe..0000000 --- a/vendor/phpdocumentor/type-resolver/composer.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "phpdocumentor/type-resolver", - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*" - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "phpDocumentor\\Reflection\\": ["tests/unit", "tests/benchmark"] - } - }, - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - } -} diff --git a/vendor/phpdocumentor/type-resolver/composer.lock b/vendor/phpdocumentor/type-resolver/composer.lock deleted file mode 100644 index 8fa8b87..0000000 --- a/vendor/phpdocumentor/type-resolver/composer.lock +++ /dev/null @@ -1,71 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "ee8aea1f755e1772266bc7e041d8ee5b", - "packages": [ - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2020-06-27T09:03:43+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.2 || ^8.0" - }, - "platform-dev": { - "ext-tokenizer": "*" - } -} diff --git a/vendor/phpdocumentor/type-resolver/phpbench.json b/vendor/phpdocumentor/type-resolver/phpbench.json deleted file mode 100644 index ced1eba..0000000 --- a/vendor/phpdocumentor/type-resolver/phpbench.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "bootstrap": "vendor/autoload.php", - "path": "tests/benchmark", - "extensions": [ - "Jaapio\\Blackfire\\Extension" - ], - "blackfire" : { - "env": "c12030d0-c177-47e2-b466-4994c40dc993" - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php b/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php deleted file mode 100644 index 6447a01..0000000 --- a/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php +++ /dev/null @@ -1,79 +0,0 @@ -isFqsen($fqsen)) { - return new Fqsen($fqsen); - } - - return $this->resolvePartialStructuralElementName($fqsen, $context); - } - - /** - * Tests whether the given type is a Fully Qualified Structural Element Name. - */ - private function isFqsen(string $type) : bool - { - return strpos($type, self::OPERATOR_NAMESPACE) === 0; - } - - /** - * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation - * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. - * - * @throws InvalidArgumentException When type is not a valid FQSEN. - */ - private function resolvePartialStructuralElementName(string $type, Context $context) : Fqsen - { - $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); - - $namespaceAliases = $context->getNamespaceAliases(); - - // if the first segment is not an alias; prepend namespace name and return - if (!isset($namespaceAliases[$typeParts[0]])) { - $namespace = $context->getNamespace(); - if ($namespace !== '') { - $namespace .= self::OPERATOR_NAMESPACE; - } - - return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); - } - - $typeParts[0] = $namespaceAliases[$typeParts[0]]; - - return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoType.php b/vendor/phpdocumentor/type-resolver/src/PseudoType.php deleted file mode 100644 index f94cff5..0000000 --- a/vendor/phpdocumentor/type-resolver/src/PseudoType.php +++ /dev/null @@ -1,19 +0,0 @@ - List of recognized keywords and unto which Value Object they map - * @psalm-var array> - */ - private $keywords = [ - 'string' => Types\String_::class, - 'class-string' => Types\ClassString::class, - 'int' => Types\Integer::class, - 'integer' => Types\Integer::class, - 'bool' => Types\Boolean::class, - 'boolean' => Types\Boolean::class, - 'real' => Types\Float_::class, - 'float' => Types\Float_::class, - 'double' => Types\Float_::class, - 'object' => Object_::class, - 'mixed' => Types\Mixed_::class, - 'array' => Array_::class, - 'resource' => Types\Resource_::class, - 'void' => Types\Void_::class, - 'null' => Types\Null_::class, - 'scalar' => Types\Scalar::class, - 'callback' => Types\Callable_::class, - 'callable' => Types\Callable_::class, - 'false' => PseudoTypes\False_::class, - 'true' => PseudoTypes\True_::class, - 'self' => Types\Self_::class, - '$this' => Types\This::class, - 'static' => Types\Static_::class, - 'parent' => Types\Parent_::class, - 'iterable' => Iterable_::class, - ]; - - /** - * @var FqsenResolver - * @psalm-readonly - */ - private $fqsenResolver; - - /** - * Initializes this TypeResolver with the means to create and resolve Fqsen objects. - */ - public function __construct(?FqsenResolver $fqsenResolver = null) - { - $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); - } - - /** - * Analyzes the given type and returns the FQCN variant. - * - * When a type is provided this method checks whether it is not a keyword or - * Fully Qualified Class Name. If so it will use the given namespace and - * aliases to expand the type to a FQCN representation. - * - * This method only works as expected if the namespace and aliases are set; - * no dynamic reflection is being performed here. - * - * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be - * replaced with another namespace. - * @uses Context::getNamespace() to determine with what to prefix the type name. - * - * @param string $type The relative or absolute type. - */ - public function resolve(string $type, ?Context $context = null) : Type - { - $type = trim($type); - if (!$type) { - throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); - } - - if ($context === null) { - $context = new Context(''); - } - - // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)`, `[]`, '<', '>' and type names - $tokens = preg_split( - '/(\\||\\?|<|>|&|, ?|\\(|\\)|\\[\\]+)/', - $type, - -1, - PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE - ); - - if ($tokens === false) { - throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); - } - - /** @var ArrayIterator $tokenIterator */ - $tokenIterator = new ArrayIterator($tokens); - - return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); - } - - /** - * Analyse each tokens and creates types - * - * @param ArrayIterator $tokens the iterator on tokens - * @param int $parserContext on of self::PARSER_* constants, indicating - * the context where we are in the parsing - */ - private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext) : Type - { - $types = []; - $token = ''; - $compoundToken = '|'; - while ($tokens->valid()) { - $token = $tokens->current(); - if ($token === null) { - throw new RuntimeException( - 'Unexpected nullable character' - ); - } - - if ($token === '|' || $token === '&') { - if (count($types) === 0) { - throw new RuntimeException( - 'A type is missing before a type separator' - ); - } - - if (!in_array($parserContext, [ - self::PARSER_IN_COMPOUND, - self::PARSER_IN_ARRAY_EXPRESSION, - self::PARSER_IN_COLLECTION_EXPRESSION, - ], true) - ) { - throw new RuntimeException( - 'Unexpected type separator' - ); - } - - $compoundToken = $token; - $tokens->next(); - } elseif ($token === '?') { - if (!in_array($parserContext, [ - self::PARSER_IN_COMPOUND, - self::PARSER_IN_ARRAY_EXPRESSION, - self::PARSER_IN_COLLECTION_EXPRESSION, - ], true) - ) { - throw new RuntimeException( - 'Unexpected nullable character' - ); - } - - $tokens->next(); - $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); - $types[] = new Nullable($type); - } elseif ($token === '(') { - $tokens->next(); - $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); - - $token = $tokens->current(); - if ($token === null) { // Someone did not properly close their array expression .. - break; - } - - $tokens->next(); - - $resolvedType = new Expression($type); - - $types[] = $resolvedType; - } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && $token[0] === ')') { - break; - } elseif ($token === '<') { - if (count($types) === 0) { - throw new RuntimeException( - 'Unexpected collection operator "<", class name is missing' - ); - } - - $classType = array_pop($types); - if ($classType !== null) { - if ((string) $classType === 'class-string') { - $types[] = $this->resolveClassString($tokens, $context); - } else { - $types[] = $this->resolveCollection($tokens, $classType, $context); - } - } - - $tokens->next(); - } elseif ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION - && ($token === '>' || trim($token) === ',') - ) { - break; - } elseif ($token === self::OPERATOR_ARRAY) { - end($types); - $last = key($types); - $lastItem = $types[$last]; - if ($lastItem instanceof Expression) { - $lastItem = $lastItem->getValueType(); - } - - $types[$last] = new Array_($lastItem); - - $tokens->next(); - } else { - $type = $this->resolveSingleType($token, $context); - $tokens->next(); - if ($parserContext === self::PARSER_IN_NULLABLE) { - return $type; - } - - $types[] = $type; - } - } - - if ($token === '|' || $token === '&') { - throw new RuntimeException( - 'A type is missing after a type separator' - ); - } - - if (count($types) === 0) { - if ($parserContext === self::PARSER_IN_NULLABLE) { - throw new RuntimeException( - 'A type is missing after a nullable character' - ); - } - - if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { - throw new RuntimeException( - 'A type is missing in an array expression' - ); - } - - if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { - throw new RuntimeException( - 'A type is missing in a collection expression' - ); - } - } elseif (count($types) === 1) { - return $types[0]; - } - - if ($compoundToken === '|') { - return new Compound(array_values($types)); - } - - return new Intersection(array_values($types)); - } - - /** - * resolve the given type into a type object - * - * @param string $type the type string, representing a single type - * - * @return Type|Array_|Object_ - * - * @psalm-mutation-free - */ - private function resolveSingleType(string $type, Context $context) : object - { - switch (true) { - case $this->isKeyword($type): - return $this->resolveKeyword($type); - case $this->isFqsen($type): - return $this->resolveTypedObject($type); - case $this->isPartialStructuralElementName($type): - return $this->resolveTypedObject($type, $context); - - // @codeCoverageIgnoreStart - default: - // I haven't got the foggiest how the logic would come here but added this as a defense. - throw new RuntimeException( - 'Unable to resolve type "' . $type . '", there is no known method to resolve it' - ); - } - - // @codeCoverageIgnoreEnd - } - - /** - * Adds a keyword to the list of Keywords and associates it with a specific Value Object. - * - * @psalm-param class-string $typeClassName - */ - public function addKeyword(string $keyword, string $typeClassName) : void - { - if (!class_exists($typeClassName)) { - throw new InvalidArgumentException( - 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' - . ' but we could not find the class ' . $typeClassName - ); - } - - if (!in_array(Type::class, class_implements($typeClassName), true)) { - throw new InvalidArgumentException( - 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"' - ); - } - - $this->keywords[$keyword] = $typeClassName; - } - - /** - * Detects whether the given type represents a PHPDoc keyword. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @psalm-mutation-free - */ - private function isKeyword(string $type) : bool - { - return array_key_exists(strtolower($type), $this->keywords); - } - - /** - * Detects whether the given type represents a relative structural element name. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @psalm-mutation-free - */ - private function isPartialStructuralElementName(string $type) : bool - { - return ($type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type); - } - - /** - * Tests whether the given type is a Fully Qualified Structural Element Name. - * - * @psalm-mutation-free - */ - private function isFqsen(string $type) : bool - { - return strpos($type, self::OPERATOR_NAMESPACE) === 0; - } - - /** - * Resolves the given keyword (such as `string`) into a Type object representing that keyword. - * - * @psalm-mutation-free - */ - private function resolveKeyword(string $type) : Type - { - $className = $this->keywords[strtolower($type)]; - - return new $className(); - } - - /** - * Resolves the given FQSEN string into an FQSEN object. - * - * @psalm-mutation-free - */ - private function resolveTypedObject(string $type, ?Context $context = null) : Object_ - { - return new Object_($this->fqsenResolver->resolve($type, $context)); - } - - /** - * Resolves class string - * - * @param ArrayIterator $tokens - */ - private function resolveClassString(ArrayIterator $tokens, Context $context) : Type - { - $tokens->next(); - - $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - - if (!$classType instanceof Object_ || $classType->getFqsen() === null) { - throw new RuntimeException( - $classType . ' is not a class string' - ); - } - - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException( - 'class-string: ">" is missing' - ); - } - - throw new RuntimeException( - 'Unexpected character "' . $token . '", ">" is missing' - ); - } - - return new ClassString($classType->getFqsen()); - } - - /** - * Resolves the collection values and keys - * - * @param ArrayIterator $tokens - * - * @return Array_|Iterable_|Collection - */ - private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context) : Type - { - $isArray = ((string) $classType === 'array'); - $isIterable = ((string) $classType === 'iterable'); - - // allow only "array", "iterable" or class name before "<" - if (!$isArray && !$isIterable - && (!$classType instanceof Object_ || $classType->getFqsen() === null)) { - throw new RuntimeException( - $classType . ' is not a collection' - ); - } - - $tokens->next(); - - $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - $keyType = null; - - $token = $tokens->current(); - if ($token !== null && trim($token) === ',') { - // if we have a comma, then we just parsed the key type, not the value type - $keyType = $valueType; - if ($isArray) { - // check the key type for an "array" collection. We allow only - // strings or integers. - if (!$keyType instanceof String_ && - !$keyType instanceof Integer && - !$keyType instanceof Compound - ) { - throw new RuntimeException( - 'An array can have only integers or strings as keys' - ); - } - - if ($keyType instanceof Compound) { - foreach ($keyType->getIterator() as $item) { - if (!$item instanceof String_ && - !$item instanceof Integer - ) { - throw new RuntimeException( - 'An array can have only integers or strings as keys' - ); - } - } - } - } - - $tokens->next(); - // now let's parse the value type - $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - } - - $token = $tokens->current(); - if ($token !== '>') { - if (empty($token)) { - throw new RuntimeException( - 'Collection: ">" is missing' - ); - } - - throw new RuntimeException( - 'Unexpected character "' . $token . '", ">" is missing' - ); - } - - if ($isArray) { - return new Array_($valueType, $keyType); - } - - if ($isIterable) { - return new Iterable_($valueType, $keyType); - } - - if ($classType instanceof Object_) { - return $this->makeCollectionFromObject($classType, $valueType, $keyType); - } - - throw new RuntimeException('Invalid $classType provided'); - } - - /** - * @psalm-pure - */ - private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null) : Collection - { - return new Collection($object->getFqsen(), $valueType, $keyType); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php b/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php deleted file mode 100644 index bbea4f1..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php +++ /dev/null @@ -1,83 +0,0 @@ -valueType = $valueType; - $this->defaultKeyType = new Compound([new String_(), new Integer()]); - $this->keyType = $keyType; - } - - /** - * Returns the type for the keys of this array. - */ - public function getKeyType() : Type - { - return $this->keyType ?? $this->defaultKeyType; - } - - /** - * Returns the value for the keys of this array. - */ - public function getValueType() : Type - { - return $this->valueType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - if ($this->keyType) { - return 'array<' . $this->keyType . ',' . $this->valueType . '>'; - } - - if ($this->valueType instanceof Mixed_) { - return 'array'; - } - - if ($this->valueType instanceof Compound) { - return '(' . $this->valueType . ')[]'; - } - - return $this->valueType . '[]'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php b/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php deleted file mode 100644 index 9522295..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php +++ /dev/null @@ -1,124 +0,0 @@ - - */ -abstract class AggregatedType implements Type, IteratorAggregate -{ - /** - * @psalm-allow-private-mutation - * @var array - */ - private $types = []; - - /** @var string */ - private $token; - - /** - * @param array $types - */ - public function __construct(array $types, string $token) - { - foreach ($types as $type) { - $this->add($type); - } - - $this->token = $token; - } - - /** - * Returns the type at the given index. - */ - public function get(int $index) : ?Type - { - if (!$this->has($index)) { - return null; - } - - return $this->types[$index]; - } - - /** - * Tests if this compound type has a type with the given index. - */ - public function has(int $index) : bool - { - return array_key_exists($index, $this->types); - } - - /** - * Tests if this compound type contains the given type. - */ - public function contains(Type $type) : bool - { - foreach ($this->types as $typePart) { - // if the type is duplicate; do not add it - if ((string) $typePart === (string) $type) { - return true; - } - } - - return false; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return implode($this->token, $this->types); - } - - /** - * @return ArrayIterator - */ - public function getIterator() : ArrayIterator - { - return new ArrayIterator($this->types); - } - - /** - * @psalm-suppress ImpureMethodCall - */ - private function add(Type $type) : void - { - if ($type instanceof self) { - foreach ($type->getIterator() as $subType) { - $this->add($subType); - } - - return; - } - - // if the type is duplicate; do not add it - if ($this->contains($type)) { - return; - } - - $this->types[] = $type; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Array_.php b/vendor/phpdocumentor/type-resolver/src/Types/Array_.php deleted file mode 100644 index 7f880e2..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Array_.php +++ /dev/null @@ -1,29 +0,0 @@ -fqsen = $fqsen; - } - - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - if ($this->fqsen === null) { - return 'class-string'; - } - - return 'class-string<' . (string) $this->fqsen . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Collection.php b/vendor/phpdocumentor/type-resolver/src/Types/Collection.php deleted file mode 100644 index 84b4463..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Collection.php +++ /dev/null @@ -1,68 +0,0 @@ -` - * 2. `ACollectionObject` - * - * - ACollectionObject can be 'array' or an object that can act as an array - * - aValueType and aKeyType can be any type expression - * - * @psalm-immutable - */ -final class Collection extends AbstractList -{ - /** @var Fqsen|null */ - private $fqsen; - - /** - * Initializes this representation of an array with the given Type or Fqsen. - */ - public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) - { - parent::__construct($valueType, $keyType); - - $this->fqsen = $fqsen; - } - - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - $objectType = (string) ($this->fqsen ?? 'object'); - - if ($this->keyType === null) { - return $objectType . '<' . $this->valueType . '>'; - } - - return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php deleted file mode 100644 index ad426cc..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php +++ /dev/null @@ -1,38 +0,0 @@ - $types - */ - public function __construct(array $types) - { - parent::__construct($types, '|'); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Context.php b/vendor/phpdocumentor/type-resolver/src/Types/Context.php deleted file mode 100644 index c134d7c..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Context.php +++ /dev/null @@ -1,97 +0,0 @@ - Fully Qualified Namespace. - * @psalm-var array - */ - private $namespaceAliases; - - /** - * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) - * format (without a preceding `\`). - * - * @param string $namespace The namespace where this DocBlock resides in. - * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. - * - * @psalm-param array $namespaceAliases - */ - public function __construct(string $namespace, array $namespaceAliases = []) - { - $this->namespace = $namespace !== 'global' && $namespace !== 'default' - ? trim($namespace, '\\') - : ''; - - foreach ($namespaceAliases as $alias => $fqnn) { - if ($fqnn[0] === '\\') { - $fqnn = substr($fqnn, 1); - } - - if ($fqnn[strlen($fqnn) - 1] === '\\') { - $fqnn = substr($fqnn, 0, -1); - } - - $namespaceAliases[$alias] = $fqnn; - } - - $this->namespaceAliases = $namespaceAliases; - } - - /** - * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. - */ - public function getNamespace() : string - { - return $this->namespace; - } - - /** - * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent - * the alias for the imported Namespace. - * - * @return string[] - * - * @psalm-return array - */ - public function getNamespaceAliases() : array - { - return $this->namespaceAliases; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php b/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php deleted file mode 100644 index 5d09d56..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php +++ /dev/null @@ -1,423 +0,0 @@ - $reflector */ - - return $this->createFromReflectionClass($reflector); - } - - if ($reflector instanceof ReflectionParameter) { - return $this->createFromReflectionParameter($reflector); - } - - if ($reflector instanceof ReflectionMethod) { - return $this->createFromReflectionMethod($reflector); - } - - if ($reflector instanceof ReflectionProperty) { - return $this->createFromReflectionProperty($reflector); - } - - if ($reflector instanceof ReflectionClassConstant) { - return $this->createFromReflectionClassConstant($reflector); - } - - throw new UnexpectedValueException('Unhandled \Reflector instance given: ' . get_class($reflector)); - } - - private function createFromReflectionParameter(ReflectionParameter $parameter) : Context - { - $class = $parameter->getDeclaringClass(); - if (!$class) { - throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); - } - - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @var ReflectionClass $class */ - - return $this->createFromReflectionClass($class); - } - - private function createFromReflectionMethod(ReflectionMethod $method) : Context - { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @var ReflectionClass $class */ - $class = $method->getDeclaringClass(); - - return $this->createFromReflectionClass($class); - } - - private function createFromReflectionProperty(ReflectionProperty $property) : Context - { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @var ReflectionClass $class */ - $class = $property->getDeclaringClass(); - - return $this->createFromReflectionClass($class); - } - - private function createFromReflectionClassConstant(ReflectionClassConstant $constant) : Context - { - //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable - /** @var ReflectionClass $class */ - $class = $constant->getDeclaringClass(); - - return $this->createFromReflectionClass($class); - } - - /** - * @param ReflectionClass $class - */ - private function createFromReflectionClass(ReflectionClass $class) : Context - { - $fileName = $class->getFileName(); - $namespace = $class->getNamespaceName(); - - if (is_string($fileName) && file_exists($fileName)) { - $contents = file_get_contents($fileName); - if ($contents === false) { - throw new RuntimeException('Unable to read file "' . $fileName . '"'); - } - - return $this->createForNamespace($namespace, $contents); - } - - return new Context($namespace, []); - } - - /** - * Build a Context for a namespace in the provided file contents. - * - * @see Context for more information on Contexts. - * - * @param string $namespace It does not matter if a `\` precedes the namespace name, - * this method first normalizes. - * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. - */ - public function createForNamespace(string $namespace, string $fileContents) : Context - { - $namespace = trim($namespace, '\\'); - $useStatements = []; - $currentNamespace = ''; - $tokens = new ArrayIterator(token_get_all($fileContents)); - - while ($tokens->valid()) { - $currentToken = $tokens->current(); - switch ($currentToken[0]) { - case T_NAMESPACE: - $currentNamespace = $this->parseNamespace($tokens); - break; - case T_CLASS: - // Fast-forward the iterator through the class so that any - // T_USE tokens found within are skipped - these are not - // valid namespace use statements so should be ignored. - $braceLevel = 0; - $firstBraceFound = false; - while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { - $currentToken = $tokens->current(); - if ($currentToken === '{' - || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], true)) { - if (!$firstBraceFound) { - $firstBraceFound = true; - } - - ++$braceLevel; - } - - if ($currentToken === '}') { - --$braceLevel; - } - - $tokens->next(); - } - - break; - case T_USE: - if ($currentNamespace === $namespace) { - $useStatements += $this->parseUseStatement($tokens); - } - - break; - } - - $tokens->next(); - } - - return new Context($namespace, $useStatements); - } - - /** - * Deduce the name from tokens when we are at the T_NAMESPACE token. - * - * @param ArrayIterator $tokens - */ - private function parseNamespace(ArrayIterator $tokens) : string - { - // skip to the first string or namespace separator - $this->skipToNextStringOrNamespaceSeparator($tokens); - - $name = ''; - $acceptedTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED]; - while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, true)) { - $name .= $tokens->current()[1]; - $tokens->next(); - } - - return $name; - } - - /** - * Deduce the names of all imports when we are at the T_USE token. - * - * @param ArrayIterator $tokens - * - * @return string[] - * - * @psalm-return array - */ - private function parseUseStatement(ArrayIterator $tokens) : array - { - $uses = []; - - while ($tokens->valid()) { - $this->skipToNextStringOrNamespaceSeparator($tokens); - - $uses += $this->extractUseStatements($tokens); - $currentToken = $tokens->current(); - if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { - return $uses; - } - } - - return $uses; - } - - /** - * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. - * - * @param ArrayIterator $tokens - */ - private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens) : void - { - while ($tokens->valid()) { - $currentToken = $tokens->current(); - if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], true)) { - break; - } - - if ($currentToken[0] === T_NAME_QUALIFIED) { - break; - } - - if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === T_NAME_FULLY_QUALIFIED) { - break; - } - - $tokens->next(); - } - } - - /** - * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of - * a USE statement yet. This will return a key/value array of the alias => namespace. - * - * @param ArrayIterator $tokens - * - * @return string[] - * - * @psalm-suppress TypeDoesNotContainType - * - * @psalm-return array - */ - private function extractUseStatements(ArrayIterator $tokens) : array - { - $extractedUseStatements = []; - $groupedNs = ''; - $currentNs = ''; - $currentAlias = ''; - $state = 'start'; - - while ($tokens->valid()) { - $currentToken = $tokens->current(); - $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; - $tokenValue = is_string($currentToken) ? null : $currentToken[1]; - switch ($state) { - case 'start': - switch ($tokenId) { - case T_STRING: - case T_NS_SEPARATOR: - $currentNs .= (string) $tokenValue; - $currentAlias = $tokenValue; - break; - case T_NAME_QUALIFIED: - case T_NAME_FULLY_QUALIFIED: - $currentNs .= (string) $tokenValue; - $currentAlias = substr( - (string) $tokenValue, - (int) (strrpos((string) $tokenValue, '\\')) + 1 - ); - break; - case T_CURLY_OPEN: - case '{': - $state = 'grouped'; - $groupedNs = $currentNs; - break; - case T_AS: - $state = 'start-alias'; - break; - case self::T_LITERAL_USE_SEPARATOR: - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - - break; - case 'start-alias': - switch ($tokenId) { - case T_STRING: - $currentAlias = $tokenValue; - break; - case self::T_LITERAL_USE_SEPARATOR: - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - - break; - case 'grouped': - switch ($tokenId) { - case T_STRING: - case T_NS_SEPARATOR: - $currentNs .= (string) $tokenValue; - $currentAlias = $tokenValue; - break; - case T_AS: - $state = 'grouped-alias'; - break; - case self::T_LITERAL_USE_SEPARATOR: - $state = 'grouped'; - $extractedUseStatements[(string) $currentAlias] = $currentNs; - $currentNs = $groupedNs; - $currentAlias = ''; - break; - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - - break; - case 'grouped-alias': - switch ($tokenId) { - case T_STRING: - $currentAlias = $tokenValue; - break; - case self::T_LITERAL_USE_SEPARATOR: - $state = 'grouped'; - $extractedUseStatements[(string) $currentAlias] = $currentNs; - $currentNs = $groupedNs; - $currentAlias = ''; - break; - case self::T_LITERAL_END_OF_USE: - $state = 'end'; - break; - default: - break; - } - } - - if ($state === 'end') { - break; - } - - $tokens->next(); - } - - if ($groupedNs !== $currentNs) { - $extractedUseStatements[(string) $currentAlias] = $currentNs; - } - - return $extractedUseStatements; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Expression.php b/vendor/phpdocumentor/type-resolver/src/Types/Expression.php deleted file mode 100644 index 4a8ae1f..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Expression.php +++ /dev/null @@ -1,51 +0,0 @@ -valueType = $valueType; - } - - /** - * Returns the value for the keys of this array. - */ - public function getValueType() : Type - { - return $this->valueType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return '(' . $this->valueType . ')'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Float_.php b/vendor/phpdocumentor/type-resolver/src/Types/Float_.php deleted file mode 100644 index e70ce7d..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Float_.php +++ /dev/null @@ -1,32 +0,0 @@ - $types - */ - public function __construct(array $types) - { - parent::__construct($types, '&'); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php b/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php deleted file mode 100644 index a03a7cd..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php +++ /dev/null @@ -1,38 +0,0 @@ -keyType) { - return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; - } - - if ($this->valueType instanceof Mixed_) { - return 'iterable'; - } - - return 'iterable<' . $this->valueType . '>'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php b/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php deleted file mode 100644 index 2fedff4..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php +++ /dev/null @@ -1,32 +0,0 @@ -realType = $realType; - } - - /** - * Provide access to the actual type directly, if needed. - */ - public function getActualType() : Type - { - return $this->realType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - */ - public function __toString() : string - { - return '?' . $this->realType->__toString(); - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Object_.php b/vendor/phpdocumentor/type-resolver/src/Types/Object_.php deleted file mode 100644 index 4cfe2a0..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Object_.php +++ /dev/null @@ -1,68 +0,0 @@ -fqsen = $fqsen; - } - - /** - * Returns the FQSEN associated with this object. - */ - public function getFqsen() : ?Fqsen - { - return $this->fqsen; - } - - public function __toString() : string - { - if ($this->fqsen) { - return (string) $this->fqsen; - } - - return 'object'; - } -} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php b/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php deleted file mode 100644 index 08900ab..0000000 --- a/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php +++ /dev/null @@ -1,34 +0,0 @@ - - - - samples - src - tests - - samples/Header.php - */tests/Core/*/*Test\.(inc|css|js)$ - - - - - - - - - - - - diff --git a/vendor/phpoffice/phpspreadsheet/CHANGELOG.md b/vendor/phpoffice/phpspreadsheet/CHANGELOG.md deleted file mode 100644 index 2a43bae..0000000 --- a/vendor/phpoffice/phpspreadsheet/CHANGELOG.md +++ /dev/null @@ -1,587 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com) -and this project adheres to [Semantic Versioning](https://semver.org). - -## 1.15.0 - 2020-10-11 - -### Added - -- Implemented Page Order for Xlsx and Xls Readers, and provided Page Settings (Orientation, Scale, Horizontal/Vertical Centering, Page Order, Margins) support for Ods, Gnumeric and Xls Readers [#1559](https://github.com/PHPOffice/PhpSpreadsheet/pull/1559) -- Implementation of the Excel `LOGNORM.DIST()`, `NORM.S.DIST()`, `GAMMA()` and `GAUSS()` functions. [#1588](https://github.com/PHPOffice/PhpSpreadsheet/pull/1588) -- Named formula implementation, and improved handling of Defined Names generally [#1535](https://github.com/PHPOffice/PhpSpreadsheet/pull/1535) - - Defined Names are now case-insensitive - - Distinction between named ranges and named formulae - - Correct handling of union and intersection operators in named ranges - - Correct evaluation of named range operators in calculations - - fix resolution of relative named range values in the calculation engine; previously all named range values had been treated as absolute. - - Calculation support for named formulae - - Support for nested ranges and formulae (named ranges and formulae that reference other named ranges/formulae) in calculations - - Introduction of a helper to convert address formats between R1C1 and A1 (and the reverse) - - Proper support for both named ranges and named formulae in all appropriate Readers - - **Xlsx** (Previously only simple named ranges were supported) - - **Xls** (Previously only simple named ranges were supported) - - **Gnumeric** (Previously neither named ranges nor formulae were supported) - - **Ods** (Previously neither named ranges nor formulae were supported) - - **Xml** (Previously neither named ranges nor formulae were supported) - - Proper support for named ranges and named formulae in all appropriate Writers - - **Xlsx** (Previously only simple named ranges were supported) - - **Xls** (Previously neither named ranges nor formulae were supported) - Still not supported, but some parser issues resolved that previously failed to differentiate between a defined name and a function name - - **Ods** (Previously neither named ranges nor formulae were supported) -- Support for PHP 8.0 - -### Changed - -- Improve Coverage for ODS Reader [#1545](https://github.com/phpoffice/phpspreadsheet/pull/1545) -- Named formula implementation, and improved handling of Defined Names generally [#1535](https://github.com/PHPOffice/PhpSpreadsheet/pull/1535) -- fix resolution of relative named range values in the calculation engine; previously all named range values had been treated as absolute. -- Drop $this->spreadSheet null check from Xlsx Writer [#1646](https://github.com/phpoffice/phpspreadsheet/pull/1646) -- Improving Coverage for Excel2003 XML Reader [#1557](https://github.com/phpoffice/phpspreadsheet/pull/1557) - -### Deprecated - -- **IMPORTANT NOTE:** This Introduces a **BC break** in the handling of named ranges. Previously, a named range cell reference of `B2` would be treated identically to a named range cell reference of `$B2` or `B$2` or `$B$2` because the calculation engine treated then all as absolute references. These changes "fix" that, so the calculation engine now handles relative references in named ranges correctly. - This change that resolves previously incorrect behaviour in the calculation may affect users who have dynamically defined named ranges using relative references when they should have used absolute references. - -### Removed - -- Nothing. - -### Fixed - -- PrintArea causes exception [#1544](https://github.com/phpoffice/phpspreadsheet/pull/1544) -- Calculation/DateTime Failure With PHP8 [#1661](https://github.com/phpoffice/phpspreadsheet/pull/1661) -- Reader/Gnumeric Failure with PHP8 [#1662](https://github.com/phpoffice/phpspreadsheet/pull/1662) -- ReverseSort bug, exposed but not caused by PHP8 [#1660](https://github.com/phpoffice/phpspreadsheet/pull/1660) -- Bug setting Superscript/Subscript to false [#1567](https://github.com/phpoffice/phpspreadsheet/pull/1567) - -## 1.14.1 - 2020-07-19 - -### Added - -- nothing - -### Fixed - -- WEBSERVICE is HTTP client agnostic and must be configured via `Settings::setHttpClient()` [#1562](https://github.com/PHPOffice/PhpSpreadsheet/issues/1562) -- Borders were not complete on rowspanned columns using HTML reader [#1473](https://github.com/PHPOffice/PhpSpreadsheet/pull/1473) - -### Changed - -## 1.14.0 - 2020-06-29 - -### Added - -- Add support for IFS() logical function [#1442](https://github.com/PHPOffice/PhpSpreadsheet/pull/1442) -- Add Cell Address Helper to provide conversions between the R1C1 and A1 address formats [#1558](https://github.com/PHPOffice/PhpSpreadsheet/pull/1558) -- Add ability to edit Html/Pdf before saving [#1499](https://github.com/PHPOffice/PhpSpreadsheet/pull/1499) -- Add ability to set codepage explicitly for BIFF5 [#1018](https://github.com/PHPOffice/PhpSpreadsheet/issues/1018) -- Added support for the WEBSERVICE function [#1409](https://github.com/PHPOffice/PhpSpreadsheet/pull/1409) - -### Fixed - -- Resolve evaluation of utf-8 named ranges in calculation engine [#1522](https://github.com/PHPOffice/PhpSpreadsheet/pull/1522) -- Fix HLOOKUP on single row [#1512](https://github.com/PHPOffice/PhpSpreadsheet/pull/1512) -- Fix MATCH when comparing different numeric types [#1521](https://github.com/PHPOffice/PhpSpreadsheet/pull/1521) -- Fix exact MATCH on ranges with empty cells [#1520](https://github.com/PHPOffice/PhpSpreadsheet/pull/1520) -- Fix for Issue [#1516](https://github.com/PHPOffice/PhpSpreadsheet/issues/1516) (Cloning worksheet makes corrupted Xlsx) [#1530](https://github.com/PHPOffice/PhpSpreadsheet/pull/1530) -- Fix For Issue [#1509](https://github.com/PHPOffice/PhpSpreadsheet/issues/1509) (Can not set empty enclosure for CSV) [#1518](https://github.com/PHPOffice/PhpSpreadsheet/pull/1518) -- Fix for Issue [#1505](https://github.com/PHPOffice/PhpSpreadsheet/issues/1505) (TypeError : Argument 4 passed to PhpOffice\PhpSpreadsheet\Writer\Xlsx\Worksheet::writeAttributeIf() must be of the type string) [#1525](https://github.com/PHPOffice/PhpSpreadsheet/pull/1525) -- Fix for Issue [#1495](https://github.com/PHPOffice/PhpSpreadsheet/issues/1495) (Sheet index being changed when multiple sheets are used in formula) [#1500]((https://github.com/PHPOffice/PhpSpreadsheet/pull/1500)) -- Fix for Issue [#1533](https://github.com/PHPOffice/PhpSpreadsheet/issues/1533) (A reference to a cell containing a string starting with "#" leads to errors in the generated xlsx.) [#1534](https://github.com/PHPOffice/PhpSpreadsheet/pull/1534) -- Xls Writer - Correct Timestamp Bug [#1493](https://github.com/PHPOffice/PhpSpreadsheet/pull/1493) -- Don't ouput row and columns without any cells in HTML writer [#1235](https://github.com/PHPOffice/PhpSpreadsheet/issues/1235) - -## 1.13.0 - 2020-05-31 - -### Added - -- Support writing to streams in all writers [#1292](https://github.com/PHPOffice/PhpSpreadsheet/issues/1292) -- Support CSV files with data wrapping a lot of lines [#1468](https://github.com/PHPOffice/PhpSpreadsheet/pull/1468) -- Support protection of worksheet by a specific hash algorithm [#1485](https://github.com/PHPOffice/PhpSpreadsheet/pull/1485) - -### Fixed - -- Fix Chart samples by updating chart parameter from 0 to DataSeries::EMPTY_AS_GAP [#1448](https://github.com/PHPOffice/PhpSpreadsheet/pull/1448) -- Fix return type in docblock for the Cells::get() [#1398](https://github.com/PHPOffice/PhpSpreadsheet/pull/1398) -- Fix RATE, PRICE, XIRR, and XNPV Functions [#1456](https://github.com/PHPOffice/PhpSpreadsheet/pull/1456) -- Save Excel 2010+ functions properly in XLSX [#1461](https://github.com/PHPOffice/PhpSpreadsheet/pull/1461) -- Several improvements in HTML writer [#1464](https://github.com/PHPOffice/PhpSpreadsheet/pull/1464) -- Fix incorrect behaviour when saving XLSX file with drawings [#1462](https://github.com/PHPOffice/PhpSpreadsheet/pull/1462), -- Fix Crash while trying setting a cell the value "123456\n" [#1476](https://github.com/PHPOffice/PhpSpreadsheet/pull/1481) -- Improved DATEDIF() function and reduced errors for Y and YM units [#1466](https://github.com/PHPOffice/PhpSpreadsheet/pull/1466) -- Stricter typing for mergeCells [#1494](https://github.com/PHPOffice/PhpSpreadsheet/pull/1494) - -### Changed - -- Drop support for PHP 7.1, according to https://phpspreadsheet.readthedocs.io/en/latest/#php-version-support -- Drop partial migration tool in favor of complete migration via RectorPHP [#1445](https://github.com/PHPOffice/PhpSpreadsheet/issues/1445) -- Limit composer package to `src/` [#1424](https://github.com/PHPOffice/PhpSpreadsheet/pull/1424) - -## 1.12.0 - 2020-04-27 - -### Added - -- Improved the ARABIC function to also handle short-hand roman numerals -- Added support for the FLOOR.MATH and FLOOR.PRECISE functions [#1351](https://github.com/PHPOffice/PhpSpreadsheet/pull/1351) - -### Fixed - -- Fix ROUNDUP and ROUNDDOWN for floating-point rounding error [#1404](https://github.com/PHPOffice/PhpSpreadsheet/pull/1404) -- Fix ROUNDUP and ROUNDDOWN for negative number [#1417](https://github.com/PHPOffice/PhpSpreadsheet/pull/1417) -- Fix loading styles from vmlDrawings when containing whitespace [#1347](https://github.com/PHPOffice/PhpSpreadsheet/issues/1347) -- Fix incorrect behavior when removing last row [#1365](https://github.com/PHPOffice/PhpSpreadsheet/pull/1365) -- MATCH with a static array should return the position of the found value based on the values submitted [#1332](https://github.com/PHPOffice/PhpSpreadsheet/pull/1332) -- Fix Xlsx Reader's handling of undefined fill color [#1353](https://github.com/PHPOffice/PhpSpreadsheet/pull/1353) - -## 1.11.0 - 2020-03-02 - -### Added - -- Added support for the BASE function -- Added support for the ARABIC function -- Conditionals - Extend Support for (NOT)CONTAINSBLANKS [#1278](https://github.com/PHPOffice/PhpSpreadsheet/pull/1278) - -### Fixed - -- Handle Error in Formula Processing Better for Xls [#1267](https://github.com/PHPOffice/PhpSpreadsheet/pull/1267) -- Handle ConditionalStyle NumberFormat When Reading Xlsx File [#1296](https://github.com/PHPOffice/PhpSpreadsheet/pull/1296) -- Fix Xlsx Writer's handling of decimal commas [#1282](https://github.com/PHPOffice/PhpSpreadsheet/pull/1282) -- Fix for issue by removing test code mistakenly left in [#1328](https://github.com/PHPOffice/PhpSpreadsheet/pull/1328) -- Fix for Xls writer wrong selected cells and active sheet [#1256](https://github.com/PHPOffice/PhpSpreadsheet/pull/1256) -- Fix active cell when freeze pane is used [#1323](https://github.com/PHPOffice/PhpSpreadsheet/pull/1323) -- Fix XLSX file loading with autofilter containing '$' [#1326](https://github.com/PHPOffice/PhpSpreadsheet/pull/1326) -- PHPDoc - Use `@return $this` for fluent methods [#1362](https://github.com/PHPOffice/PhpSpreadsheet/pull/1362) - -## 1.10.1 - 2019-12-02 - -### Changed - -- PHP 7.4 compatibility - -### Fixed - -- FLOOR() function accept negative number and negative significance [#1245](https://github.com/PHPOffice/PhpSpreadsheet/pull/1245) -- Correct column style even when using rowspan [#1249](https://github.com/PHPOffice/PhpSpreadsheet/pull/1249) -- Do not confuse defined names and cell refs [#1263](https://github.com/PHPOffice/PhpSpreadsheet/pull/1263) -- XLSX reader/writer keep decimal for floats with a zero decimal part [#1262](https://github.com/PHPOffice/PhpSpreadsheet/pull/1262) -- ODS writer prevent invalid numeric value if locale decimal separator is comma [#1268](https://github.com/PHPOffice/PhpSpreadsheet/pull/1268) -- Xlsx writer actually writes plotVisOnly and dispBlanksAs from chart properties [#1266](https://github.com/PHPOffice/PhpSpreadsheet/pull/1266) - -## 1.10.0 - 2019-11-18 - -### Changed - -- Change license from LGPL 2.1 to MIT [#140](https://github.com/PHPOffice/PhpSpreadsheet/issues/140) - -### Added - -- Implementation of IFNA() logical function -- Support "showZeros" worksheet option to change how Excel shows and handles "null" values returned from a calculation -- Allow HTML Reader to accept HTML as a string into an existing spreadsheet [#1212](https://github.com/PHPOffice/PhpSpreadsheet/pull/1212) - -### Fixed - -- IF implementation properly handles the value `#N/A` [#1165](https://github.com/PHPOffice/PhpSpreadsheet/pull/1165) -- Formula Parser: Wrong line count for stuff like "MyOtherSheet!A:D" [#1215](https://github.com/PHPOffice/PhpSpreadsheet/issues/1215) -- Call garbage collector after removing a column to prevent stale cached values -- Trying to remove a column that doesn't exist deletes the latest column -- Keep big integer as integer instead of lossely casting to float [#874](https://github.com/PHPOffice/PhpSpreadsheet/pull/874) -- Fix branch pruning handling of non boolean conditions [#1167](https://github.com/PHPOffice/PhpSpreadsheet/pull/1167) -- Fix ODS Reader when no DC namespace are defined [#1182](https://github.com/PHPOffice/PhpSpreadsheet/pull/1182) -- Fixed Functions->ifCondition for allowing <> and empty condition [#1206](https://github.com/PHPOffice/PhpSpreadsheet/pull/1206) -- Validate XIRR inputs and return correct error values [#1120](https://github.com/PHPOffice/PhpSpreadsheet/issues/1120) -- Allow to read xlsx files with exotic workbook names like "workbook2.xml" [#1183](https://github.com/PHPOffice/PhpSpreadsheet/pull/1183) - -## 1.9.0 - 2019-08-17 - -### Changed - -- Drop support for PHP 5.6 and 7.0, according to https://phpspreadsheet.readthedocs.io/en/latest/#php-version-support - -### Added - -- When <br> appears in a table cell, set the cell to wrap [#1071](https://github.com/PHPOffice/PhpSpreadsheet/issues/1071) and [#1070](https://github.com/PHPOffice/PhpSpreadsheet/pull/1070) -- Add MAXIFS, MINIFS, COUNTIFS and Remove MINIF, MAXIF [#1056](https://github.com/PHPOffice/PhpSpreadsheet/issues/1056) -- HLookup needs an ordered list even if range_lookup is set to false [#1055](https://github.com/PHPOffice/PhpSpreadsheet/issues/1055) and [#1076](https://github.com/PHPOffice/PhpSpreadsheet/pull/1076) -- Improve performance of IF function calls via ranch pruning to avoid resolution of every branches [#844](https://github.com/PHPOffice/PhpSpreadsheet/pull/844) -- MATCH function supports `*?~` Excel functionality, when match_type=0 [#1116](https://github.com/PHPOffice/PhpSpreadsheet/issues/1116) -- Allow HTML Reader to accept HTML as a string [#1136](https://github.com/PHPOffice/PhpSpreadsheet/pull/1136) - -### Fixed - -- Fix to AVERAGEIF() function when called with a third argument -- Eliminate duplicate fill none style entries [#1066](https://github.com/PHPOffice/PhpSpreadsheet/issues/1066) -- Fix number format masks containing literal (non-decimal point) dots [#1079](https://github.com/PHPOffice/PhpSpreadsheet/issues/1079) -- Fix number format masks containing named colours that were being misinterpreted as date formats; and add support for masks that fully replace the value with a full text string [#1009](https://github.com/PHPOffice/PhpSpreadsheet/issues/1009) -- Stricter-typed comparison testing in COUNTIF() and COUNTIFS() evaluation [#1046](https://github.com/PHPOffice/PhpSpreadsheet/issues/1046) -- COUPNUM should not return zero when settlement is in the last period [#1020](https://github.com/PHPOffice/PhpSpreadsheet/issues/1020) and [#1021](https://github.com/PHPOffice/PhpSpreadsheet/pull/1021) -- Fix handling of named ranges referencing sheets with spaces or "!" in their title -- Cover `getSheetByName()` with tests for name with quote and spaces [#739](https://github.com/PHPOffice/PhpSpreadsheet/issues/739) -- Best effort to support invalid colspan values in HTML reader - [#878](https://github.com/PHPOffice/PhpSpreadsheet/pull/878) -- Fixes incorrect rows deletion [#868](https://github.com/PHPOffice/PhpSpreadsheet/issues/868) -- MATCH function fix (value search by type, stop search when match_type=-1 and unordered element encountered) [#1116](https://github.com/PHPOffice/PhpSpreadsheet/issues/1116) -- Fix `getCalculatedValue()` error with more than two INDIRECT [#1115](https://github.com/PHPOffice/PhpSpreadsheet/pull/1115) -- Writer\Html did not hide columns [#985](https://github.com/PHPOffice/PhpSpreadsheet/pull/985) - -## 1.8.2 - 2019-07-08 - -### Fixed - -- Uncaught error when opening ods file and properties aren't defined [#1047](https://github.com/PHPOffice/PhpSpreadsheet/issues/1047) -- Xlsx Reader Cell datavalidations bug [#1052](https://github.com/PHPOffice/PhpSpreadsheet/pull/1052) - -## 1.8.1 - 2019-07-02 - -### Fixed - -- Allow nullable theme for Xlsx Style Reader class [#1043](https://github.com/PHPOffice/PhpSpreadsheet/issues/1043) - -## 1.8.0 - 2019-07-01 - -### Security Fix (CVE-2019-12331) - -- Detect double-encoded xml in the Security scanner, and reject as suspicious. -- This change also broadens the scope of the `libxml_disable_entity_loader` setting when reading XML-based formats, so that it is enabled while the xml is being parsed and not simply while it is loaded. - On some versions of PHP, this can cause problems because it is not thread-safe, and can affect other PHP scripts running on the same server. This flag is set to true when instantiating a loader, and back to its original setting when the Reader is no longer in scope, or manually unset. -- Provide a check to identify whether libxml_disable_entity_loader is thread-safe or not. - - `XmlScanner::threadSafeLibxmlDisableEntityLoaderAvailability()` -- Provide an option to disable the libxml_disable_entity_loader call through settings. This is not recommended as it reduces the security of the XML-based readers, and should only be used if you understand the consequences and have no other choice. - -### Added - -- Added support for the SWITCH function [#963](https://github.com/PHPOffice/PhpSpreadsheet/issues/963) and [#983](https://github.com/PHPOffice/PhpSpreadsheet/pull/983) -- Add accounting number format style [#974](https://github.com/PHPOffice/PhpSpreadsheet/pull/974) - -### Fixed - -- Whitelist `tsv` extension when opening CSV files [#429](https://github.com/PHPOffice/PhpSpreadsheet/issues/429) -- Fix a SUMIF warning with some versions of PHP when having different length of arrays provided as input [#873](https://github.com/PHPOffice/PhpSpreadsheet/pull/873) -- Fix incorrectly handled backslash-escaped space characters in number format - -## 1.7.0 - 2019-05-26 - -- Added support for inline styles in Html reader (borders, alignment, width, height) -- QuotedText cells no longer treated as formulae if the content begins with a `=` -- Clean handling for DDE in formulae - -### Fixed - -- Fix handling for escaped enclosures and new lines in CSV Separator Inference -- Fix MATCH an error was appearing when comparing strings against 0 (always true) -- Fix wrong calculation of highest column with specified row [#700](https://github.com/PHPOffice/PhpSpreadsheet/issues/700) -- Fix VLOOKUP -- Fix return type hint - -## 1.6.0 - 2019-01-02 - -### Added - -- Refactored Matrix Functions to use external Matrix library -- Possibility to specify custom colors of values for pie and donut charts [#768](https://github.com/PHPOffice/PhpSpreadsheet/pull/768) - -### Fixed - -- Improve XLSX parsing speed if no readFilter is applied [#772](https://github.com/PHPOffice/PhpSpreadsheet/issues/772) -- Fix column names if read filter calls in XLSX reader skip columns [#777](https://github.com/PHPOffice/PhpSpreadsheet/pull/777) -- XLSX reader can now ignore blank cells, using the setReadEmptyCells(false) method. [#810](https://github.com/PHPOffice/PhpSpreadsheet/issues/810) -- Fix LOOKUP function which was breaking on edge cases [#796](https://github.com/PHPOffice/PhpSpreadsheet/issues/796) -- Fix VLOOKUP with exact matches [#809](https://github.com/PHPOffice/PhpSpreadsheet/pull/809) -- Support COUNTIFS multiple arguments [#830](https://github.com/PHPOffice/PhpSpreadsheet/pull/830) -- Change `libxml_disable_entity_loader()` as shortly as possible [#819](https://github.com/PHPOffice/PhpSpreadsheet/pull/819) -- Improved memory usage and performance when loading large spreadsheets [#822](https://github.com/PHPOffice/PhpSpreadsheet/pull/822) -- Improved performance when loading large spreadsheets [#825](https://github.com/PHPOffice/PhpSpreadsheet/pull/825) -- Improved performance when loading large spreadsheets [#824](https://github.com/PHPOffice/PhpSpreadsheet/pull/824) -- Fix color from CSS when reading from HTML [#831](https://github.com/PHPOffice/PhpSpreadsheet/pull/831) -- Fix infinite loop when reading invalid ODS files [#832](https://github.com/PHPOffice/PhpSpreadsheet/pull/832) -- Fix time format for duration is incorrect [#666](https://github.com/PHPOffice/PhpSpreadsheet/pull/666) -- Fix iconv unsupported `//IGNORE//TRANSLIT` on IBM i [#791](https://github.com/PHPOffice/PhpSpreadsheet/issues/791) - -### Changed - -- `master` is the new default branch, `develop` does not exist anymore - -## 1.5.2 - 2018-11-25 - -### Security - -- Improvements to the design of the XML Security Scanner [#771](https://github.com/PHPOffice/PhpSpreadsheet/issues/771) - -## 1.5.1 - 2018-11-20 - -### Security - -- Fix and improve XXE security scanning for XML-based and HTML Readers [#771](https://github.com/PHPOffice/PhpSpreadsheet/issues/771) - -### Added - -- Support page margin in mPDF [#750](https://github.com/PHPOffice/PhpSpreadsheet/issues/750) - -### Fixed - -- Support numeric condition in SUMIF, SUMIFS, AVERAGEIF, COUNTIF, MAXIF and MINIF [#683](https://github.com/PHPOffice/PhpSpreadsheet/issues/683) -- SUMIFS containing multiple conditions [#704](https://github.com/PHPOffice/PhpSpreadsheet/issues/704) -- Csv reader avoid notice when the file is empty [#743](https://github.com/PHPOffice/PhpSpreadsheet/pull/743) -- Fix print area parser for XLSX reader [#734](https://github.com/PHPOffice/PhpSpreadsheet/pull/734) -- Support overriding `DefaultValueBinder::dataTypeForValue()` without overriding `DefaultValueBinder::bindValue()` [#735](https://github.com/PHPOffice/PhpSpreadsheet/pull/735) -- Mpdf export can exceed pcre.backtrack_limit [#637](https://github.com/PHPOffice/PhpSpreadsheet/issues/637) -- Fix index overflow on data values array [#748](https://github.com/PHPOffice/PhpSpreadsheet/pull/748) - -## 1.5.0 - 2018-10-21 - -### Added - -- PHP 7.3 support -- Add the DAYS() function [#594](https://github.com/PHPOffice/PhpSpreadsheet/pull/594) - -### Fixed - -- Sheet title can contain exclamation mark [#325](https://github.com/PHPOffice/PhpSpreadsheet/issues/325) -- Xls file cause the exception during open by Xls reader [#402](https://github.com/PHPOffice/PhpSpreadsheet/issues/402) -- Skip non numeric value in SUMIF [#618](https://github.com/PHPOffice/PhpSpreadsheet/pull/618) -- OFFSET should allow omitted height and width [#561](https://github.com/PHPOffice/PhpSpreadsheet/issues/561) -- Correctly determine delimiter when CSV contains line breaks inside enclosures [#716](https://github.com/PHPOffice/PhpSpreadsheet/issues/716) - -## 1.4.1 - 2018-09-30 - -### Fixed - -- Remove locale from formatting string [#644](https://github.com/PHPOffice/PhpSpreadsheet/pull/644) -- Allow iterators to go out of bounds with prev [#587](https://github.com/PHPOffice/PhpSpreadsheet/issues/587) -- Fix warning when reading xlsx without styles [#631](https://github.com/PHPOffice/PhpSpreadsheet/pull/631) -- Fix broken sample links on windows due to $baseDir having backslash [#653](https://github.com/PHPOffice/PhpSpreadsheet/pull/653) - -## 1.4.0 - 2018-08-06 - -### Added - -- Add excel function EXACT(value1, value2) support [#595](https://github.com/PHPOffice/PhpSpreadsheet/pull/595) -- Support workbook view attributes for Xlsx format [#523](https://github.com/PHPOffice/PhpSpreadsheet/issues/523) -- Read and write hyperlink for drawing image [#490](https://github.com/PHPOffice/PhpSpreadsheet/pull/490) -- Added calculation engine support for the new bitwise functions that were added in MS Excel 2013 - - BITAND() Returns a Bitwise 'And' of two numbers - - BITOR() Returns a Bitwise 'Or' of two number - - BITXOR() Returns a Bitwise 'Exclusive Or' of two numbers - - BITLSHIFT() Returns a number shifted left by a specified number of bits - - BITRSHIFT() Returns a number shifted right by a specified number of bits -- Added calculation engine support for other new functions that were added in MS Excel 2013 and MS Excel 2016 - - Text Functions - - CONCAT() Synonym for CONCATENATE() - - NUMBERVALUE() Converts text to a number, in a locale-independent way - - UNICHAR() Synonym for CHAR() in PHPSpreadsheet, which has always used UTF-8 internally - - UNIORD() Synonym for ORD() in PHPSpreadsheet, which has always used UTF-8 internally - - TEXTJOIN() Joins together two or more text strings, separated by a delimiter - - Logical Functions - - XOR() Returns a logical Exclusive Or of all arguments - - Date/Time Functions - - ISOWEEKNUM() Returns the ISO 8601 week number of the year for a given date - - Lookup and Reference Functions - - FORMULATEXT() Returns a formula as a string - - Financial Functions - - PDURATION() Calculates the number of periods required for an investment to reach a specified value - - RRI() Calculates the interest rate required for an investment to grow to a specified future value - - Engineering Functions - - ERF.PRECISE() Returns the error function integrated between 0 and a supplied limit - - ERFC.PRECISE() Synonym for ERFC - - Math and Trig Functions - - SEC() Returns the secant of an angle - - SECH() Returns the hyperbolic secant of an angle - - CSC() Returns the cosecant of an angle - - CSCH() Returns the hyperbolic cosecant of an angle - - COT() Returns the cotangent of an angle - - COTH() Returns the hyperbolic cotangent of an angle - - ACOT() Returns the cotangent of an angle - - ACOTH() Returns the hyperbolic cotangent of an angle -- Refactored Complex Engineering Functions to use external complex number library -- Added calculation engine support for the new complex number functions that were added in MS Excel 2013 - - IMCOSH() Returns the hyperbolic cosine of a complex number - - IMCOT() Returns the cotangent of a complex number - - IMCSC() Returns the cosecant of a complex number - - IMCSCH() Returns the hyperbolic cosecant of a complex number - - IMSEC() Returns the secant of a complex number - - IMSECH() Returns the hyperbolic secant of a complex number - - IMSINH() Returns the hyperbolic sine of a complex number - - IMTAN() Returns the tangent of a complex number - -### Fixed - -- Fix ISFORMULA() function to work with a cell reference to another worksheet -- Xlsx reader crashed when reading a file with workbook protection [#553](https://github.com/PHPOffice/PhpSpreadsheet/pull/553) -- Cell formats with escaped spaces were causing incorrect date formatting [#557](https://github.com/PHPOffice/PhpSpreadsheet/issues/557) -- Could not open CSV file containing HTML fragment [#564](https://github.com/PHPOffice/PhpSpreadsheet/issues/564) -- Exclude the vendor folder in migration [#481](https://github.com/PHPOffice/PhpSpreadsheet/issues/481) -- Chained operations on cell ranges involving borders operated on last cell only [#428](https://github.com/PHPOffice/PhpSpreadsheet/issues/428) -- Avoid memory exhaustion when cloning worksheet with a drawing [#437](https://github.com/PHPOffice/PhpSpreadsheet/issues/437) -- Migration tool keep variables containing $PHPExcel untouched [#598](https://github.com/PHPOffice/PhpSpreadsheet/issues/598) -- Rowspans/colspans were incorrect when adding worksheet using loadIntoExisting [#619](https://github.com/PHPOffice/PhpSpreadsheet/issues/619) - -## 1.3.1 - 2018-06-12 - -### Fixed - -- Ranges across Z and AA columns incorrectly threw an exception [#545](https://github.com/PHPOffice/PhpSpreadsheet/issues/545) - -## 1.3.0 - 2018-06-10 - -### Added - -- Support to read Xlsm templates with form elements, macros, printer settings, protected elements and back compatibility drawing, and save result without losing important elements of document [#435](https://github.com/PHPOffice/PhpSpreadsheet/issues/435) -- Expose sheet title maximum length as `Worksheet::SHEET_TITLE_MAXIMUM_LENGTH` [#482](https://github.com/PHPOffice/PhpSpreadsheet/issues/482) -- Allow escape character to be set in CSV reader [#492](https://github.com/PHPOffice/PhpSpreadsheet/issues/492) - -### Fixed - -- Subtotal 9 in a group that has other subtotals 9 exclude the totals of the other subtotals in the range [#332](https://github.com/PHPOffice/PhpSpreadsheet/issues/332) -- `Helper\Html` support UTF-8 HTML input [#444](https://github.com/PHPOffice/PhpSpreadsheet/issues/444) -- Xlsx loaded an extra empty comment for each real comment [#375](https://github.com/PHPOffice/PhpSpreadsheet/issues/375) -- Xlsx reader do not read rows and columns filtered out in readFilter at all [#370](https://github.com/PHPOffice/PhpSpreadsheet/issues/370) -- Make newer Excel versions properly recalculate formulas on document open [#456](https://github.com/PHPOffice/PhpSpreadsheet/issues/456) -- `Coordinate::extractAllCellReferencesInRange()` throws an exception for an invalid range [#519](https://github.com/PHPOffice/PhpSpreadsheet/issues/519) -- Fixed parsing of conditionals in COUNTIF functions [#526](https://github.com/PHPOffice/PhpSpreadsheet/issues/526) -- Corruption errors for saved Xlsx docs with frozen panes [#532](https://github.com/PHPOffice/PhpSpreadsheet/issues/532) - -## 1.2.1 - 2018-04-10 - -### Fixed - -- Plain text and richtext mixed in same cell can be read [#442](https://github.com/PHPOffice/PhpSpreadsheet/issues/442) - -## 1.2.0 - 2018-03-04 - -### Added - -- HTML writer creates a generator meta tag [#312](https://github.com/PHPOffice/PhpSpreadsheet/issues/312) -- Support invalid zoom value in XLSX format [#350](https://github.com/PHPOffice/PhpSpreadsheet/pull/350) -- Support for `_xlfn.` prefixed functions and `ISFORMULA`, `MODE.SNGL`, `STDEV.S`, `STDEV.P` [#390](https://github.com/PHPOffice/PhpSpreadsheet/pull/390) - -### Fixed - -- Avoid potentially unsupported PSR-16 cache keys [#354](https://github.com/PHPOffice/PhpSpreadsheet/issues/354) -- Check for MIME type to know if CSV reader can read a file [#167](https://github.com/PHPOffice/PhpSpreadsheet/issues/167) -- Use proper € symbol for currency format [#379](https://github.com/PHPOffice/PhpSpreadsheet/pull/379) -- Read printing area correctly when skipping some sheets [#371](https://github.com/PHPOffice/PhpSpreadsheet/issues/371) -- Avoid incorrectly overwriting calculated value type [#394](https://github.com/PHPOffice/PhpSpreadsheet/issues/394) -- Select correct cell when calling freezePane [#389](https://github.com/PHPOffice/PhpSpreadsheet/issues/389) -- `setStrikethrough()` did not set the font [#403](https://github.com/PHPOffice/PhpSpreadsheet/issues/403) - -## 1.1.0 - 2018-01-28 - -### Added - -- Support for PHP 7.2 -- Support cell comments in HTML writer and reader [#308](https://github.com/PHPOffice/PhpSpreadsheet/issues/308) -- Option to stop at a conditional styling, if it matches (only XLSX format) [#292](https://github.com/PHPOffice/PhpSpreadsheet/pull/292) -- Support for line width for data series when rendering Xlsx [#329](https://github.com/PHPOffice/PhpSpreadsheet/pull/329) - -### Fixed - -- Better auto-detection of CSV separators [#305](https://github.com/PHPOffice/PhpSpreadsheet/issues/305) -- Support for shape style ending with `;` [#304](https://github.com/PHPOffice/PhpSpreadsheet/issues/304) -- Freeze Panes takes wrong coordinates for XLSX [#322](https://github.com/PHPOffice/PhpSpreadsheet/issues/322) -- `COLUMNS` and `ROWS` functions crashed in some cases [#336](https://github.com/PHPOffice/PhpSpreadsheet/issues/336) -- Support XML file without styles [#331](https://github.com/PHPOffice/PhpSpreadsheet/pull/331) -- Cell coordinates which are already a range cause an exception [#319](https://github.com/PHPOffice/PhpSpreadsheet/issues/319) - -## 1.0.0 - 2017-12-25 - -### Added - -- Support to write merged cells in ODS format [#287](https://github.com/PHPOffice/PhpSpreadsheet/issues/287) -- Able to set the `topLeftCell` in freeze panes [#261](https://github.com/PHPOffice/PhpSpreadsheet/pull/261) -- Support `DateTimeImmutable` as cell value -- Support migration of prefixed classes - -### Fixed - -- Can read very small HTML files [#194](https://github.com/PHPOffice/PhpSpreadsheet/issues/194) -- Written DataValidation was corrupted [#290](https://github.com/PHPOffice/PhpSpreadsheet/issues/290) -- Date format compatible with both LibreOffice and Excel [#298](https://github.com/PHPOffice/PhpSpreadsheet/issues/298) - -### BREAKING CHANGE - -- Constant `TYPE_DOUGHTNUTCHART` is now `TYPE_DOUGHNUTCHART`. - -## 1.0.0-beta2 - 2017-11-26 - -### Added - -- Support for chart fill color - @CrazyBite [#158](https://github.com/PHPOffice/PhpSpreadsheet/pull/158) -- Support for read Hyperlink for xml - @GreatHumorist [#223](https://github.com/PHPOffice/PhpSpreadsheet/pull/223) -- Support for cell value validation according to data validation rules - @SailorMax [#257](https://github.com/PHPOffice/PhpSpreadsheet/pull/257) -- Support for custom implementation, or configuration, of PDF libraries - @SailorMax [#266](https://github.com/PHPOffice/PhpSpreadsheet/pull/266) - -### Changed - -- Merge data-validations to reduce written worksheet size - @billblume [#131](https://github.com/PHPOffice/PhpSpreadSheet/issues/131) -- Throws exception if a XML file is invalid - @GreatHumorist [#222](https://github.com/PHPOffice/PhpSpreadsheet/pull/222) -- Upgrade to mPDF 7.0+ [#144](https://github.com/PHPOffice/PhpSpreadsheet/issues/144) - -### Fixed - -- Control characters in cell values are automatically escaped [#212](https://github.com/PHPOffice/PhpSpreadsheet/issues/212) -- Prevent color changing when copy/pasting xls files written by PhpSpreadsheet to another file - @al-lala [#218](https://github.com/PHPOffice/PhpSpreadsheet/issues/218) -- Add cell reference automatic when there is no cell reference('r' attribute) in Xlsx file. - @GreatHumorist [#225](https://github.com/PHPOffice/PhpSpreadsheet/pull/225) Refer to [#201](https://github.com/PHPOffice/PhpSpreadsheet/issues/201) -- `Reader\Xlsx::getFromZipArchive()` function return false if the zip entry could not be located. - @anton-harvey [#268](https://github.com/PHPOffice/PhpSpreadsheet/pull/268) - -### BREAKING CHANGE - -- Extracted coordinate method to dedicate class [migration guide](./docs/topics/migration-from-PHPExcel.md). -- Column indexes are based on 1, see the [migration guide](./docs/topics/migration-from-PHPExcel.md). -- Standardization of array keys used for style, see the [migration guide](./docs/topics/migration-from-PHPExcel.md). -- Easier usage of PDF writers, and other custom readers and writers, see the [migration guide](./docs/topics/migration-from-PHPExcel.md). -- Easier usage of chart renderers, see the [migration guide](./docs/topics/migration-from-PHPExcel.md). -- Rename a few more classes to keep them in their related namespaces: - - `CalcEngine` => `Calculation\Engine` - - `PhpSpreadsheet\Calculation` => `PhpSpreadsheet\Calculation\Calculation` - - `PhpSpreadsheet\Cell` => `PhpSpreadsheet\Cell\Cell` - - `PhpSpreadsheet\Chart` => `PhpSpreadsheet\Chart\Chart` - - `PhpSpreadsheet\RichText` => `PhpSpreadsheet\RichText\RichText` - - `PhpSpreadsheet\Style` => `PhpSpreadsheet\Style\Style` - - `PhpSpreadsheet\Worksheet` => `PhpSpreadsheet\Worksheet\Worksheet` - -## 1.0.0-beta - 2017-08-17 - -### Added - -- Initial implementation of SUMIFS() function -- Additional codepages -- MemoryDrawing not working in HTML writer [#808](https://github.com/PHPOffice/PHPExcel/issues/808) -- CSV Reader can auto-detect the separator used in file [#141](https://github.com/PHPOffice/PhpSpreadsheet/pull/141) -- HTML Reader supports some basic inline styles [#180](https://github.com/PHPOffice/PhpSpreadsheet/pull/180) - -### Changed - -- Start following [SemVer](https://semver.org) properly. - -### Fixed - -- Fix to getCell() method when cell reference includes a worksheet reference - @MarkBaker -- Ignore inlineStr type if formula element exists - @ncrypthic [#570](https://github.com/PHPOffice/PHPExcel/issues/570) -- Excel 2007 Reader freezes because of conditional formatting - @rentalhost [#575](https://github.com/PHPOffice/PHPExcel/issues/575) -- Readers will now parse files containing worksheet titles over 31 characters [#176](https://github.com/PHPOffice/PhpSpreadsheet/pull/176) -- Fixed PHP8 deprecation warning for libxml_disable_entity_loader() [#1625](https://github.com/phpoffice/phpspreadsheet/pull/1625) - -### General - -- Whitespace after toRichTextObject() - @MarkBaker [#554](https://github.com/PHPOffice/PHPExcel/issues/554) -- Optimize vlookup() sort - @umpirsky [#548](https://github.com/PHPOffice/PHPExcel/issues/548) -- c:max and c:min elements shall NOT be inside c:orientation elements - @vitalyrepin [#869](https://github.com/PHPOffice/PHPExcel/pull/869) -- Implement actual timezone adjustment into PHPExcel_Shared_Date::PHPToExcel - @sim642 [#489](https://github.com/PHPOffice/PHPExcel/pull/489) - -### BREAKING CHANGE - -- Introduction of namespaces for all classes, eg: `PHPExcel_Calculation_Functions` becomes `PhpOffice\PhpSpreadsheet\Calculation\Functions` -- Some classes were renamed for clarity and/or consistency: - -For a comprehensive list of all class changes, and a semi-automated migration path, read the [migration guide](./docs/topics/migration-from-PHPExcel.md). - -- Dropped `PHPExcel_Calculation_Functions::VERSION()`. Composer or git should be used to know the version. -- Dropped `PHPExcel_Settings::setPdfRenderer()` and `PHPExcel_Settings::setPdfRenderer()`. Composer should be used to autoload PDF libs. -- Dropped support for HHVM - -## Previous versions of PHPExcel - -The changelog for the project when it was called PHPExcel is [still available](./CHANGELOG.PHPExcel.md). diff --git a/vendor/phpoffice/phpspreadsheet/CONTRIBUTING.md b/vendor/phpoffice/phpspreadsheet/CONTRIBUTING.md deleted file mode 100644 index aed13fe..0000000 --- a/vendor/phpoffice/phpspreadsheet/CONTRIBUTING.md +++ /dev/null @@ -1,11 +0,0 @@ -# Want to contribute? - -If you would like to contribute, here are some notes and guidelines: - - - All new development happens on feature/fix branches, and are then merged to the `master` branch once stable; so the `master` branch is always the most up-to-date, working code - - Tagged releases are made from the `master` branch - - If you are going to be submitting a pull request, please fork from `master`, and submit your pull request back as a fix/feature branch referencing the GitHub issue number - - Code style might be automatically fixed by `composer fix` - - All code changes must be validated by `composer check` - - [Helpful article about forking](https://help.github.com/articles/fork-a-repo/ "Forking a GitHub repository") - - [Helpful article about pull requests](https://help.github.com/articles/using-pull-requests/ "Pull Requests") diff --git a/vendor/phpoffice/phpspreadsheet/LICENSE b/vendor/phpoffice/phpspreadsheet/LICENSE deleted file mode 100644 index 3ec5723..0000000 --- a/vendor/phpoffice/phpspreadsheet/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 PhpSpreadsheet Authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/phpoffice/phpspreadsheet/README.md b/vendor/phpoffice/phpspreadsheet/README.md deleted file mode 100644 index 0cef832..0000000 --- a/vendor/phpoffice/phpspreadsheet/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# PhpSpreadsheet - -[![Build Status](https://travis-ci.org/PHPOffice/PhpSpreadsheet.svg?branch=master)](https://travis-ci.org/PHPOffice/PhpSpreadsheet) -[![Code Quality](https://scrutinizer-ci.com/g/PHPOffice/PhpSpreadsheet/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/PHPOffice/PhpSpreadsheet/?branch=master) -[![Code Coverage](https://scrutinizer-ci.com/g/PHPOffice/PhpSpreadsheet/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/PHPOffice/PhpSpreadsheet/?branch=master) -[![Total Downloads](https://img.shields.io/packagist/dt/PHPOffice/PhpSpreadsheet)](https://packagist.org/packages/phpoffice/phpspreadsheet) -[![Latest Stable Version](https://img.shields.io/github/v/release/PHPOffice/PhpSpreadsheet)](https://packagist.org/packages/phpoffice/phpspreadsheet) -[![License](https://img.shields.io/github/license/PHPOffice/PhpSpreadsheet)](https://packagist.org/packages/phpoffice/phpspreadsheet) -[![Join the chat at https://gitter.im/PHPOffice/PhpSpreadsheet](https://img.shields.io/badge/GITTER-join%20chat-green.svg)](https://gitter.im/PHPOffice/PhpSpreadsheet) - -PhpSpreadsheet is a library written in pure PHP and offers a set of classes that -allow you to read and write various spreadsheet file formats such as Excel and LibreOffice Calc. - -## Documentation - -Read more about it, including install instructions, in the [official documentation](https://phpspreadsheet.readthedocs.io). Or check out the [API documentation](https://phpoffice.github.io/PhpSpreadsheet). - -Please ask your support questions on [StackOverflow](https://stackoverflow.com/questions/tagged/phpspreadsheet), or have a quick chat on [Gitter](https://gitter.im/PHPOffice/PhpSpreadsheet). - -## PHPExcel vs PhpSpreadsheet ? - -PhpSpreadsheet is the next version of PHPExcel. It breaks compatibility to dramatically improve the code base quality (namespaces, PSR compliance, use of latest PHP language features, etc.). - -Because all efforts have shifted to PhpSpreadsheet, PHPExcel will no longer be maintained. All contributions for PHPExcel, patches and new features, should target PhpSpreadsheet `master` branch. - -Do you need to migrate? There is [an automated tool](/docs/topics/migration-from-PHPExcel.md) for that. - -## License - -PhpSpreadsheet is licensed under [MIT](https://github.com/PHPOffice/PhpSpreadsheet/blob/master/LICENSE). diff --git a/vendor/phpoffice/phpspreadsheet/composer.json b/vendor/phpoffice/phpspreadsheet/composer.json deleted file mode 100644 index 0fcb255..0000000 --- a/vendor/phpoffice/phpspreadsheet/composer.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "phpoffice/phpspreadsheet", - "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", - "keywords": ["PHP", "OpenXML", "Excel", "xlsx", "xls", "ods", "gnumeric", "spreadsheet"], - "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Maarten Balliauw", - "homepage": "https://blog.maartenballiauw.be" - }, - { - "name": "Mark Baker", - "homepage": "https://markbakeruk.net" - }, - { - "name": "Franck Lefevre", - "homepage": "https://rootslabs.net" - }, - { - "name": "Erik Tilt" - }, - { - "name": "Adrien Crivelli" - } - ], - "scripts": { - "check": [ - "php-cs-fixer fix --ansi --dry-run --diff", - "phpcs", - "phpunit --color=always" - ], - "fix": [ - "php-cs-fixer fix --ansi" - ], - "versions": [ - "phpcs --report-width=200 samples/ src/ tests/ --ignore=samples/Header.php --standard=PHPCompatibility --runtime-set testVersion 7.2- -n" - ] - }, - "require": { - "php": "^7.2|^8.0", - "ext-ctype": "*", - "ext-dom": "*", - "ext-gd": "*", - "ext-iconv": "*", - "ext-fileinfo": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-SimpleXML": "*", - "ext-xml": "*", - "ext-xmlreader": "*", - "ext-xmlwriter": "*", - "ext-zip": "*", - "ext-zlib": "*", - "maennchen/zipstream-php": "^2.1", - "markbaker/complex": "^1.5|^2.0", - "markbaker/matrix": "^1.2|^2.0", - "psr/simple-cache": "^1.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0" - }, - "require-dev": { - "dompdf/dompdf": "^0.8.5", - "friendsofphp/php-cs-fixer": "^2.16", - "jpgraph/jpgraph": "^4.0", - "mpdf/mpdf": "^8.0", - "phpcompatibility/php-compatibility": "^9.3", - "phpunit/phpunit": "^8.5|^9.3", - "squizlabs/php_codesniffer": "^3.5", - "tecnickcom/tcpdf": "^6.3" - }, - "suggest": { - "mpdf/mpdf": "Option for rendering PDF with PDF Writer", - "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", - "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", - "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers" - }, - "autoload": { - "psr-4": { - "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" - } - }, - "autoload-dev": { - "psr-4": { - "PhpOffice\\PhpSpreadsheetTests\\": "tests/PhpSpreadsheetTests" - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php deleted file mode 100644 index 99260e3..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php +++ /dev/null @@ -1,5327 +0,0 @@ -=-]*)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?\b([a-z]{1,3})\$?(\d{1,7})(?![\w.])'; - // Cell reference (with or without a sheet reference) ensuring absolute/relative - const CALCULATION_REGEXP_CELLREF_RELATIVE = '((([^\s\(,!&%^\/\*\+<>=-]*)|(\'[^\']*\')|(\"[^\"]*\"))!)?(\$?\b[a-z]{1,3})(\$?\d{1,7})(?![\w.])'; - // Cell ranges ensuring absolute/relative - const CALCULATION_REGEXP_COLUMNRANGE_RELATIVE = '(\$?[a-z]{1,3}):(\$?[a-z]{1,3})'; - const CALCULATION_REGEXP_ROWRANGE_RELATIVE = '(\$?\d{1,7}):(\$?\d{1,7})'; - // Defined Names: Named Range of cells, or Named Formulae - const CALCULATION_REGEXP_DEFINEDNAME = '((([^\s,!&%^\/\*\+<>=-]*)|(\'[^\']*\')|(\"[^\"]*\"))!)?([_\p{L}][_\p{L}\p{N}\.]*)'; - // Error - const CALCULATION_REGEXP_ERROR = '\#[A-Z][A-Z0_\/]*[!\?]?'; - - /** constants */ - const RETURN_ARRAY_AS_ERROR = 'error'; - const RETURN_ARRAY_AS_VALUE = 'value'; - const RETURN_ARRAY_AS_ARRAY = 'array'; - - const FORMULA_OPEN_FUNCTION_BRACE = '{'; - const FORMULA_CLOSE_FUNCTION_BRACE = '}'; - const FORMULA_STRING_QUOTE = '"'; - - private static $returnArrayAsType = self::RETURN_ARRAY_AS_VALUE; - - /** - * Instance of this class. - * - * @var Calculation - */ - private static $instance; - - /** - * Instance of the spreadsheet this Calculation Engine is using. - * - * @var Spreadsheet - */ - private $spreadsheet; - - /** - * Calculation cache. - * - * @var array - */ - private $calculationCache = []; - - /** - * Calculation cache enabled. - * - * @var bool - */ - private $calculationCacheEnabled = true; - - /** - * Used to generate unique store keys. - * - * @var int - */ - private $branchStoreKeyCounter = 0; - - private $branchPruningEnabled = true; - - /** - * List of operators that can be used within formulae - * The true/false value indicates whether it is a binary operator or a unary operator. - * - * @var array - */ - private static $operators = [ - '+' => true, '-' => true, '*' => true, '/' => true, - '^' => true, '&' => true, '%' => false, '~' => false, - '>' => true, '<' => true, '=' => true, '>=' => true, - '<=' => true, '<>' => true, '|' => true, ':' => true, - ]; - - /** - * List of binary operators (those that expect two operands). - * - * @var array - */ - private static $binaryOperators = [ - '+' => true, '-' => true, '*' => true, '/' => true, - '^' => true, '&' => true, '>' => true, '<' => true, - '=' => true, '>=' => true, '<=' => true, '<>' => true, - '|' => true, ':' => true, - ]; - - /** - * The debug log generated by the calculation engine. - * - * @var Logger - */ - private $debugLog; - - /** - * Flag to determine how formula errors should be handled - * If true, then a user error will be triggered - * If false, then an exception will be thrown. - * - * @var bool - */ - public $suppressFormulaErrors = false; - - /** - * Error message for any error that was raised/thrown by the calculation engine. - * - * @var string - */ - public $formulaError; - - /** - * Reference Helper. - * - * @var ReferenceHelper - */ - private static $referenceHelper; - - /** - * An array of the nested cell references accessed by the calculation engine, used for the debug log. - * - * @var CyclicReferenceStack - */ - private $cyclicReferenceStack; - - private $cellStack = []; - - /** - * Current iteration counter for cyclic formulae - * If the value is 0 (or less) then cyclic formulae will throw an exception, - * otherwise they will iterate to the limit defined here before returning a result. - * - * @var int - */ - private $cyclicFormulaCounter = 1; - - private $cyclicFormulaCell = ''; - - /** - * Number of iterations for cyclic formulae. - * - * @var int - */ - public $cyclicFormulaCount = 1; - - /** - * Epsilon Precision used for comparisons in calculations. - * - * @var float - */ - private $delta = 0.1e-12; - - /** - * The current locale setting. - * - * @var string - */ - private static $localeLanguage = 'en_us'; // US English (default locale) - - /** - * List of available locale settings - * Note that this is read for the locale subdirectory only when requested. - * - * @var string[] - */ - private static $validLocaleLanguages = [ - 'en', // English (default language) - ]; - - /** - * Locale-specific argument separator for function arguments. - * - * @var string - */ - private static $localeArgumentSeparator = ','; - - private static $localeFunctions = []; - - /** - * Locale-specific translations for Excel constants (True, False and Null). - * - * @var string[] - */ - public static $localeBoolean = [ - 'TRUE' => 'TRUE', - 'FALSE' => 'FALSE', - 'NULL' => 'NULL', - ]; - - /** - * Excel constant string translations to their PHP equivalents - * Constant conversion from text name/value to actual (datatyped) value. - * - * @var string[] - */ - private static $excelConstants = [ - 'TRUE' => true, - 'FALSE' => false, - 'NULL' => null, - ]; - - // PhpSpreadsheet functions - private static $phpSpreadsheetFunctions = [ - 'ABS' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'abs', - 'argumentCount' => '1', - ], - 'ACCRINT' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'ACCRINT'], - 'argumentCount' => '4-7', - ], - 'ACCRINTM' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'ACCRINTM'], - 'argumentCount' => '3-5', - ], - 'ACOS' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'acos', - 'argumentCount' => '1', - ], - 'ACOSH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'acosh', - 'argumentCount' => '1', - ], - 'ACOT' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'ACOT'], - 'argumentCount' => '1', - ], - 'ACOTH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'ACOTH'], - 'argumentCount' => '1', - ], - 'ADDRESS' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'cellAddress'], - 'argumentCount' => '2-5', - ], - 'AGGREGATE' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3+', - ], - 'AMORDEGRC' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'AMORDEGRC'], - 'argumentCount' => '6,7', - ], - 'AMORLINC' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'AMORLINC'], - 'argumentCount' => '6,7', - ], - 'AND' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'logicalAnd'], - 'argumentCount' => '1+', - ], - 'ARABIC' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'ARABIC'], - 'argumentCount' => '1', - ], - 'AREAS' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'ASC' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'ASIN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'asin', - 'argumentCount' => '1', - ], - 'ASINH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'asinh', - 'argumentCount' => '1', - ], - 'ATAN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'atan', - 'argumentCount' => '1', - ], - 'ATAN2' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'ATAN2'], - 'argumentCount' => '2', - ], - 'ATANH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'atanh', - 'argumentCount' => '1', - ], - 'AVEDEV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'AVEDEV'], - 'argumentCount' => '1+', - ], - 'AVERAGE' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'AVERAGE'], - 'argumentCount' => '1+', - ], - 'AVERAGEA' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'AVERAGEA'], - 'argumentCount' => '1+', - ], - 'AVERAGEIF' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'AVERAGEIF'], - 'argumentCount' => '2,3', - ], - 'AVERAGEIFS' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3+', - ], - 'BAHTTEXT' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'BASE' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'BASE'], - 'argumentCount' => '2,3', - ], - 'BESSELI' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BESSELI'], - 'argumentCount' => '2', - ], - 'BESSELJ' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BESSELJ'], - 'argumentCount' => '2', - ], - 'BESSELK' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BESSELK'], - 'argumentCount' => '2', - ], - 'BESSELY' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BESSELY'], - 'argumentCount' => '2', - ], - 'BETADIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'BETADIST'], - 'argumentCount' => '3-5', - ], - 'BETA.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '4-6', - ], - 'BETAINV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'BETAINV'], - 'argumentCount' => '3-5', - ], - 'BETA.INV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'BETAINV'], - 'argumentCount' => '3-5', - ], - 'BIN2DEC' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BINTODEC'], - 'argumentCount' => '1', - ], - 'BIN2HEX' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BINTOHEX'], - 'argumentCount' => '1,2', - ], - 'BIN2OCT' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BINTOOCT'], - 'argumentCount' => '1,2', - ], - 'BINOMDIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'BINOMDIST'], - 'argumentCount' => '4', - ], - 'BINOM.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'BINOMDIST'], - 'argumentCount' => '4', - ], - 'BINOM.DIST.RANGE' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3,4', - ], - 'BINOM.INV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3', - ], - 'BITAND' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BITAND'], - 'argumentCount' => '2', - ], - 'BITOR' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BITOR'], - 'argumentCount' => '2', - ], - 'BITXOR' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BITOR'], - 'argumentCount' => '2', - ], - 'BITLSHIFT' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BITLSHIFT'], - 'argumentCount' => '2', - ], - 'BITRSHIFT' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'BITRSHIFT'], - 'argumentCount' => '2', - ], - 'CEILING' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'CEILING'], - 'argumentCount' => '2', - ], - 'CEILING.MATH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3', - ], - 'CEILING.PRECISE' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'CELL' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1,2', - ], - 'CHAR' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'CHARACTER'], - 'argumentCount' => '1', - ], - 'CHIDIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'CHIDIST'], - 'argumentCount' => '2', - ], - 'CHISQ.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3', - ], - 'CHISQ.DIST.RT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'CHIDIST'], - 'argumentCount' => '2', - ], - 'CHIINV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'CHIINV'], - 'argumentCount' => '2', - ], - 'CHISQ.INV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'CHISQ.INV.RT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'CHIINV'], - 'argumentCount' => '2', - ], - 'CHITEST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'CHISQ.TEST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'CHOOSE' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'CHOOSE'], - 'argumentCount' => '2+', - ], - 'CLEAN' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'TRIMNONPRINTABLE'], - 'argumentCount' => '1', - ], - 'CODE' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'ASCIICODE'], - 'argumentCount' => '1', - ], - 'COLUMN' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'COLUMN'], - 'argumentCount' => '-1', - 'passByReference' => [true], - ], - 'COLUMNS' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'COLUMNS'], - 'argumentCount' => '1', - ], - 'COMBIN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'COMBIN'], - 'argumentCount' => '2', - ], - 'COMBINA' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'COMPLEX' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'COMPLEX'], - 'argumentCount' => '2,3', - ], - 'CONCAT' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'CONCATENATE'], - 'argumentCount' => '1+', - ], - 'CONCATENATE' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'CONCATENATE'], - 'argumentCount' => '1+', - ], - 'CONFIDENCE' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'CONFIDENCE'], - 'argumentCount' => '3', - ], - 'CONFIDENCE.NORM' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'CONFIDENCE'], - 'argumentCount' => '3', - ], - 'CONFIDENCE.T' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3', - ], - 'CONVERT' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'CONVERTUOM'], - 'argumentCount' => '3', - ], - 'CORREL' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'CORREL'], - 'argumentCount' => '2', - ], - 'COS' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'cos', - 'argumentCount' => '1', - ], - 'COSH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'cosh', - 'argumentCount' => '1', - ], - 'COT' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'COT'], - 'argumentCount' => '1', - ], - 'COTH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'COTH'], - 'argumentCount' => '1', - ], - 'COUNT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'COUNT'], - 'argumentCount' => '1+', - ], - 'COUNTA' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'COUNTA'], - 'argumentCount' => '1+', - ], - 'COUNTBLANK' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'COUNTBLANK'], - 'argumentCount' => '1', - ], - 'COUNTIF' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'COUNTIF'], - 'argumentCount' => '2', - ], - 'COUNTIFS' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'COUNTIFS'], - 'argumentCount' => '2+', - ], - 'COUPDAYBS' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'COUPDAYBS'], - 'argumentCount' => '3,4', - ], - 'COUPDAYS' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'COUPDAYS'], - 'argumentCount' => '3,4', - ], - 'COUPDAYSNC' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'COUPDAYSNC'], - 'argumentCount' => '3,4', - ], - 'COUPNCD' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'COUPNCD'], - 'argumentCount' => '3,4', - ], - 'COUPNUM' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'COUPNUM'], - 'argumentCount' => '3,4', - ], - 'COUPPCD' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'COUPPCD'], - 'argumentCount' => '3,4', - ], - 'COVAR' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'COVAR'], - 'argumentCount' => '2', - ], - 'COVARIANCE.P' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'COVAR'], - 'argumentCount' => '2', - ], - 'COVARIANCE.S' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'CRITBINOM' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'CRITBINOM'], - 'argumentCount' => '3', - ], - 'CSC' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'CSC'], - 'argumentCount' => '1', - ], - 'CSCH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'CSCH'], - 'argumentCount' => '1', - ], - 'CUBEKPIMEMBER' => [ - 'category' => Category::CATEGORY_CUBE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '?', - ], - 'CUBEMEMBER' => [ - 'category' => Category::CATEGORY_CUBE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '?', - ], - 'CUBEMEMBERPROPERTY' => [ - 'category' => Category::CATEGORY_CUBE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '?', - ], - 'CUBERANKEDMEMBER' => [ - 'category' => Category::CATEGORY_CUBE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '?', - ], - 'CUBESET' => [ - 'category' => Category::CATEGORY_CUBE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '?', - ], - 'CUBESETCOUNT' => [ - 'category' => Category::CATEGORY_CUBE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '?', - ], - 'CUBEVALUE' => [ - 'category' => Category::CATEGORY_CUBE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '?', - ], - 'CUMIPMT' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'CUMIPMT'], - 'argumentCount' => '6', - ], - 'CUMPRINC' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'CUMPRINC'], - 'argumentCount' => '6', - ], - 'DATE' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'DATE'], - 'argumentCount' => '3', - ], - 'DATEDIF' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'DATEDIF'], - 'argumentCount' => '2,3', - ], - 'DATEVALUE' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'DATEVALUE'], - 'argumentCount' => '1', - ], - 'DAVERAGE' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DAVERAGE'], - 'argumentCount' => '3', - ], - 'DAY' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'DAYOFMONTH'], - 'argumentCount' => '1', - ], - 'DAYS' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'DAYS'], - 'argumentCount' => '2', - ], - 'DAYS360' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'DAYS360'], - 'argumentCount' => '2,3', - ], - 'DB' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'DB'], - 'argumentCount' => '4,5', - ], - 'DBCS' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'DCOUNT' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DCOUNT'], - 'argumentCount' => '3', - ], - 'DCOUNTA' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DCOUNTA'], - 'argumentCount' => '3', - ], - 'DDB' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'DDB'], - 'argumentCount' => '4,5', - ], - 'DEC2BIN' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'DECTOBIN'], - 'argumentCount' => '1,2', - ], - 'DEC2HEX' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'DECTOHEX'], - 'argumentCount' => '1,2', - ], - 'DEC2OCT' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'DECTOOCT'], - 'argumentCount' => '1,2', - ], - 'DECIMAL' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'DEGREES' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'rad2deg', - 'argumentCount' => '1', - ], - 'DELTA' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'DELTA'], - 'argumentCount' => '1,2', - ], - 'DEVSQ' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'DEVSQ'], - 'argumentCount' => '1+', - ], - 'DGET' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DGET'], - 'argumentCount' => '3', - ], - 'DISC' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'DISC'], - 'argumentCount' => '4,5', - ], - 'DMAX' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DMAX'], - 'argumentCount' => '3', - ], - 'DMIN' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DMIN'], - 'argumentCount' => '3', - ], - 'DOLLAR' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'DOLLAR'], - 'argumentCount' => '1,2', - ], - 'DOLLARDE' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'DOLLARDE'], - 'argumentCount' => '2', - ], - 'DOLLARFR' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'DOLLARFR'], - 'argumentCount' => '2', - ], - 'DPRODUCT' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DPRODUCT'], - 'argumentCount' => '3', - ], - 'DSTDEV' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DSTDEV'], - 'argumentCount' => '3', - ], - 'DSTDEVP' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DSTDEVP'], - 'argumentCount' => '3', - ], - 'DSUM' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DSUM'], - 'argumentCount' => '3', - ], - 'DURATION' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '5,6', - ], - 'DVAR' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DVAR'], - 'argumentCount' => '3', - ], - 'DVARP' => [ - 'category' => Category::CATEGORY_DATABASE, - 'functionCall' => [Database::class, 'DVARP'], - 'argumentCount' => '3', - ], - 'EDATE' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'EDATE'], - 'argumentCount' => '2', - ], - 'EFFECT' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'EFFECT'], - 'argumentCount' => '2', - ], - 'ENCODEURL' => [ - 'category' => Category::CATEGORY_WEB, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'EOMONTH' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'EOMONTH'], - 'argumentCount' => '2', - ], - 'ERF' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'ERF'], - 'argumentCount' => '1,2', - ], - 'ERF.PRECISE' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'ERFPRECISE'], - 'argumentCount' => '1', - ], - 'ERFC' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'ERFC'], - 'argumentCount' => '1', - ], - 'ERFC.PRECISE' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'ERFC'], - 'argumentCount' => '1', - ], - 'ERROR.TYPE' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'errorType'], - 'argumentCount' => '1', - ], - 'EVEN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'EVEN'], - 'argumentCount' => '1', - ], - 'EXACT' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'EXACT'], - 'argumentCount' => '2', - ], - 'EXP' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'exp', - 'argumentCount' => '1', - ], - 'EXPONDIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'EXPONDIST'], - 'argumentCount' => '3', - ], - 'EXPON.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'EXPONDIST'], - 'argumentCount' => '3', - ], - 'FACT' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'FACT'], - 'argumentCount' => '1', - ], - 'FACTDOUBLE' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'FACTDOUBLE'], - 'argumentCount' => '1', - ], - 'FALSE' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'FALSE'], - 'argumentCount' => '0', - ], - 'FDIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3', - ], - 'F.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'FDIST2'], - 'argumentCount' => '4', - ], - 'F.DIST.RT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3', - ], - 'FILTER' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3+', - ], - 'FILTERXML' => [ - 'category' => Category::CATEGORY_WEB, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'FIND' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'SEARCHSENSITIVE'], - 'argumentCount' => '2,3', - ], - 'FINDB' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'SEARCHSENSITIVE'], - 'argumentCount' => '2,3', - ], - 'FINV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3', - ], - 'F.INV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3', - ], - 'F.INV.RT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3', - ], - 'FISHER' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'FISHER'], - 'argumentCount' => '1', - ], - 'FISHERINV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'FISHERINV'], - 'argumentCount' => '1', - ], - 'FIXED' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'FIXEDFORMAT'], - 'argumentCount' => '1-3', - ], - 'FLOOR' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'FLOOR'], - 'argumentCount' => '2', - ], - 'FLOOR.MATH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'FLOORMATH'], - 'argumentCount' => '3', - ], - 'FLOOR.PRECISE' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'FLOORPRECISE'], - 'argumentCount' => '2', - ], - 'FORECAST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'FORECAST'], - 'argumentCount' => '3', - ], - 'FORECAST.ETS' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3-6', - ], - 'FORECAST.ETS.CONFINT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3-6', - ], - 'FORECAST.ETS.SEASONALITY' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2-4', - ], - 'FORECAST.ETS.STAT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3-6', - ], - 'FORECAST.LINEAR' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'FORECAST'], - 'argumentCount' => '3', - ], - 'FORMULATEXT' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'FORMULATEXT'], - 'argumentCount' => '1', - 'passCellReference' => true, - 'passByReference' => [true], - ], - 'FREQUENCY' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'FTEST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'F.TEST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'FV' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'FV'], - 'argumentCount' => '3-5', - ], - 'FVSCHEDULE' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'FVSCHEDULE'], - 'argumentCount' => '2', - ], - 'GAMMA' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'GAMMAFunction'], - 'argumentCount' => '1', - ], - 'GAMMADIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'GAMMADIST'], - 'argumentCount' => '4', - ], - 'GAMMA.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'GAMMADIST'], - 'argumentCount' => '4', - ], - 'GAMMAINV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'GAMMAINV'], - 'argumentCount' => '3', - ], - 'GAMMA.INV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'GAMMAINV'], - 'argumentCount' => '3', - ], - 'GAMMALN' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'GAMMALN'], - 'argumentCount' => '1', - ], - 'GAMMALN.PRECISE' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'GAMMALN'], - 'argumentCount' => '1', - ], - 'GAUSS' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'GAUSS'], - 'argumentCount' => '1', - ], - 'GCD' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'GCD'], - 'argumentCount' => '1+', - ], - 'GEOMEAN' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'GEOMEAN'], - 'argumentCount' => '1+', - ], - 'GESTEP' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'GESTEP'], - 'argumentCount' => '1,2', - ], - 'GETPIVOTDATA' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2+', - ], - 'GROWTH' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'GROWTH'], - 'argumentCount' => '1-4', - ], - 'HARMEAN' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'HARMEAN'], - 'argumentCount' => '1+', - ], - 'HEX2BIN' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'HEXTOBIN'], - 'argumentCount' => '1,2', - ], - 'HEX2DEC' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'HEXTODEC'], - 'argumentCount' => '1', - ], - 'HEX2OCT' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'HEXTOOCT'], - 'argumentCount' => '1,2', - ], - 'HLOOKUP' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'HLOOKUP'], - 'argumentCount' => '3,4', - ], - 'HOUR' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'HOUROFDAY'], - 'argumentCount' => '1', - ], - 'HYPERLINK' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'HYPERLINK'], - 'argumentCount' => '1,2', - 'passCellReference' => true, - ], - 'HYPGEOMDIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'HYPGEOMDIST'], - 'argumentCount' => '4', - ], - 'HYPGEOM.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '5', - ], - 'IF' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'statementIf'], - 'argumentCount' => '1-3', - ], - 'IFERROR' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'IFERROR'], - 'argumentCount' => '2', - ], - 'IFNA' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'IFNA'], - 'argumentCount' => '2', - ], - 'IFS' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'IFS'], - 'argumentCount' => '2+', - ], - 'IMABS' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMABS'], - 'argumentCount' => '1', - ], - 'IMAGINARY' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMAGINARY'], - 'argumentCount' => '1', - ], - 'IMARGUMENT' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMARGUMENT'], - 'argumentCount' => '1', - ], - 'IMCONJUGATE' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMCONJUGATE'], - 'argumentCount' => '1', - ], - 'IMCOS' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMCOS'], - 'argumentCount' => '1', - ], - 'IMCOSH' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMCOSH'], - 'argumentCount' => '1', - ], - 'IMCOT' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMCOT'], - 'argumentCount' => '1', - ], - 'IMCSC' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMCSC'], - 'argumentCount' => '1', - ], - 'IMCSCH' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMCSCH'], - 'argumentCount' => '1', - ], - 'IMDIV' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMDIV'], - 'argumentCount' => '2', - ], - 'IMEXP' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMEXP'], - 'argumentCount' => '1', - ], - 'IMLN' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMLN'], - 'argumentCount' => '1', - ], - 'IMLOG10' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMLOG10'], - 'argumentCount' => '1', - ], - 'IMLOG2' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMLOG2'], - 'argumentCount' => '1', - ], - 'IMPOWER' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMPOWER'], - 'argumentCount' => '2', - ], - 'IMPRODUCT' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMPRODUCT'], - 'argumentCount' => '1+', - ], - 'IMREAL' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMREAL'], - 'argumentCount' => '1', - ], - 'IMSEC' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMSEC'], - 'argumentCount' => '1', - ], - 'IMSECH' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMSECH'], - 'argumentCount' => '1', - ], - 'IMSIN' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMSIN'], - 'argumentCount' => '1', - ], - 'IMSINH' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMSINH'], - 'argumentCount' => '1', - ], - 'IMSQRT' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMSQRT'], - 'argumentCount' => '1', - ], - 'IMSUB' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMSUB'], - 'argumentCount' => '2', - ], - 'IMSUM' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMSUM'], - 'argumentCount' => '1+', - ], - 'IMTAN' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'IMTAN'], - 'argumentCount' => '1', - ], - 'INDEX' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'INDEX'], - 'argumentCount' => '1-4', - ], - 'INDIRECT' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'INDIRECT'], - 'argumentCount' => '1,2', - 'passCellReference' => true, - ], - 'INFO' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'INT' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'INT'], - 'argumentCount' => '1', - ], - 'INTERCEPT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'INTERCEPT'], - 'argumentCount' => '2', - ], - 'INTRATE' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'INTRATE'], - 'argumentCount' => '4,5', - ], - 'IPMT' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'IPMT'], - 'argumentCount' => '4-6', - ], - 'IRR' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'IRR'], - 'argumentCount' => '1,2', - ], - 'ISBLANK' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isBlank'], - 'argumentCount' => '1', - ], - 'ISERR' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isErr'], - 'argumentCount' => '1', - ], - 'ISERROR' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isError'], - 'argumentCount' => '1', - ], - 'ISEVEN' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isEven'], - 'argumentCount' => '1', - ], - 'ISFORMULA' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isFormula'], - 'argumentCount' => '1', - 'passCellReference' => true, - 'passByReference' => [true], - ], - 'ISLOGICAL' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isLogical'], - 'argumentCount' => '1', - ], - 'ISNA' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isNa'], - 'argumentCount' => '1', - ], - 'ISNONTEXT' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isNonText'], - 'argumentCount' => '1', - ], - 'ISNUMBER' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isNumber'], - 'argumentCount' => '1', - ], - 'ISO.CEILING' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1,2', - ], - 'ISODD' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isOdd'], - 'argumentCount' => '1', - ], - 'ISOWEEKNUM' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'ISOWEEKNUM'], - 'argumentCount' => '1', - ], - 'ISPMT' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'ISPMT'], - 'argumentCount' => '4', - ], - 'ISREF' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'ISTEXT' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'isText'], - 'argumentCount' => '1', - ], - 'JIS' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'KURT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'KURT'], - 'argumentCount' => '1+', - ], - 'LARGE' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'LARGE'], - 'argumentCount' => '2', - ], - 'LCM' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'LCM'], - 'argumentCount' => '1+', - ], - 'LEFT' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'LEFT'], - 'argumentCount' => '1,2', - ], - 'LEFTB' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'LEFT'], - 'argumentCount' => '1,2', - ], - 'LEN' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'STRINGLENGTH'], - 'argumentCount' => '1', - ], - 'LENB' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'STRINGLENGTH'], - 'argumentCount' => '1', - ], - 'LINEST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'LINEST'], - 'argumentCount' => '1-4', - ], - 'LN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'log', - 'argumentCount' => '1', - ], - 'LOG' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'logBase'], - 'argumentCount' => '1,2', - ], - 'LOG10' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'log10', - 'argumentCount' => '1', - ], - 'LOGEST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'LOGEST'], - 'argumentCount' => '1-4', - ], - 'LOGINV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'LOGINV'], - 'argumentCount' => '3', - ], - 'LOGNORMDIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'LOGNORMDIST'], - 'argumentCount' => '3', - ], - 'LOGNORM.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'LOGNORMDIST2'], - 'argumentCount' => '4', - ], - 'LOGNORM.INV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'LOGINV'], - 'argumentCount' => '3', - ], - 'LOOKUP' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'LOOKUP'], - 'argumentCount' => '2,3', - ], - 'LOWER' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'LOWERCASE'], - 'argumentCount' => '1', - ], - 'MATCH' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'MATCH'], - 'argumentCount' => '2,3', - ], - 'MAX' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MAX'], - 'argumentCount' => '1+', - ], - 'MAXA' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MAXA'], - 'argumentCount' => '1+', - ], - 'MAXIFS' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MAXIFS'], - 'argumentCount' => '3+', - ], - 'MDETERM' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'MDETERM'], - 'argumentCount' => '1', - ], - 'MDURATION' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '5,6', - ], - 'MEDIAN' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MEDIAN'], - 'argumentCount' => '1+', - ], - 'MEDIANIF' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2+', - ], - 'MID' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'MID'], - 'argumentCount' => '3', - ], - 'MIDB' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'MID'], - 'argumentCount' => '3', - ], - 'MIN' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MIN'], - 'argumentCount' => '1+', - ], - 'MINA' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MINA'], - 'argumentCount' => '1+', - ], - 'MINIFS' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MINIFS'], - 'argumentCount' => '3+', - ], - 'MINUTE' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'MINUTE'], - 'argumentCount' => '1', - ], - 'MINVERSE' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'MINVERSE'], - 'argumentCount' => '1', - ], - 'MIRR' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'MIRR'], - 'argumentCount' => '3', - ], - 'MMULT' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'MMULT'], - 'argumentCount' => '2', - ], - 'MOD' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'MOD'], - 'argumentCount' => '2', - ], - 'MODE' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MODE'], - 'argumentCount' => '1+', - ], - 'MODE.MULT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1+', - ], - 'MODE.SNGL' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'MODE'], - 'argumentCount' => '1+', - ], - 'MONTH' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'MONTHOFYEAR'], - 'argumentCount' => '1', - ], - 'MROUND' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'MROUND'], - 'argumentCount' => '2', - ], - 'MULTINOMIAL' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'MULTINOMIAL'], - 'argumentCount' => '1+', - ], - 'MUNIT' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'N' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'n'], - 'argumentCount' => '1', - ], - 'NA' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'NA'], - 'argumentCount' => '0', - ], - 'NEGBINOMDIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'NEGBINOMDIST'], - 'argumentCount' => '3', - ], - 'NEGBINOM.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '4', - ], - 'NETWORKDAYS' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'NETWORKDAYS'], - 'argumentCount' => '2-3', - ], - 'NETWORKDAYS.INTL' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2-4', - ], - 'NOMINAL' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'NOMINAL'], - 'argumentCount' => '2', - ], - 'NORMDIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'NORMDIST'], - 'argumentCount' => '4', - ], - 'NORM.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'NORMDIST'], - 'argumentCount' => '4', - ], - 'NORMINV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'NORMINV'], - 'argumentCount' => '3', - ], - 'NORM.INV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'NORMINV'], - 'argumentCount' => '3', - ], - 'NORMSDIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'NORMSDIST'], - 'argumentCount' => '1', - ], - 'NORM.S.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'NORMSDIST2'], - 'argumentCount' => '1,2', - ], - 'NORMSINV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'NORMSINV'], - 'argumentCount' => '1', - ], - 'NORM.S.INV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'NORMSINV'], - 'argumentCount' => '1', - ], - 'NOT' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'NOT'], - 'argumentCount' => '1', - ], - 'NOW' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'DATETIMENOW'], - 'argumentCount' => '0', - ], - 'NPER' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'NPER'], - 'argumentCount' => '3-5', - ], - 'NPV' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'NPV'], - 'argumentCount' => '2+', - ], - 'NUMBERVALUE' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'NUMBERVALUE'], - 'argumentCount' => '1+', - ], - 'OCT2BIN' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'OCTTOBIN'], - 'argumentCount' => '1,2', - ], - 'OCT2DEC' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'OCTTODEC'], - 'argumentCount' => '1', - ], - 'OCT2HEX' => [ - 'category' => Category::CATEGORY_ENGINEERING, - 'functionCall' => [Engineering::class, 'OCTTOHEX'], - 'argumentCount' => '1,2', - ], - 'ODD' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'ODD'], - 'argumentCount' => '1', - ], - 'ODDFPRICE' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '8,9', - ], - 'ODDFYIELD' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '8,9', - ], - 'ODDLPRICE' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '7,8', - ], - 'ODDLYIELD' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '7,8', - ], - 'OFFSET' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'OFFSET'], - 'argumentCount' => '3-5', - 'passCellReference' => true, - 'passByReference' => [true], - ], - 'OR' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'logicalOr'], - 'argumentCount' => '1+', - ], - 'PDURATION' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'PDURATION'], - 'argumentCount' => '3', - ], - 'PEARSON' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'CORREL'], - 'argumentCount' => '2', - ], - 'PERCENTILE' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'PERCENTILE'], - 'argumentCount' => '2', - ], - 'PERCENTILE.EXC' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'PERCENTILE.INC' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'PERCENTILE'], - 'argumentCount' => '2', - ], - 'PERCENTRANK' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'PERCENTRANK'], - 'argumentCount' => '2,3', - ], - 'PERCENTRANK.EXC' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2,3', - ], - 'PERCENTRANK.INC' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'PERCENTRANK'], - 'argumentCount' => '2,3', - ], - 'PERMUT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'PERMUT'], - 'argumentCount' => '2', - ], - 'PERMUTATIONA' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'PHONETIC' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'PHI' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1', - ], - 'PI' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'pi', - 'argumentCount' => '0', - ], - 'PMT' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'PMT'], - 'argumentCount' => '3-5', - ], - 'POISSON' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'POISSON'], - 'argumentCount' => '3', - ], - 'POISSON.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'POISSON'], - 'argumentCount' => '3', - ], - 'POWER' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'POWER'], - 'argumentCount' => '2', - ], - 'PPMT' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'PPMT'], - 'argumentCount' => '4-6', - ], - 'PRICE' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'PRICE'], - 'argumentCount' => '6,7', - ], - 'PRICEDISC' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'PRICEDISC'], - 'argumentCount' => '4,5', - ], - 'PRICEMAT' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'PRICEMAT'], - 'argumentCount' => '5,6', - ], - 'PROB' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3,4', - ], - 'PRODUCT' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'PRODUCT'], - 'argumentCount' => '1+', - ], - 'PROPER' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'PROPERCASE'], - 'argumentCount' => '1', - ], - 'PV' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'PV'], - 'argumentCount' => '3-5', - ], - 'QUARTILE' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'QUARTILE'], - 'argumentCount' => '2', - ], - 'QUARTILE.EXC' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'QUARTILE.INC' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'QUARTILE'], - 'argumentCount' => '2', - ], - 'QUOTIENT' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'QUOTIENT'], - 'argumentCount' => '2', - ], - 'RADIANS' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'deg2rad', - 'argumentCount' => '1', - ], - 'RAND' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'RAND'], - 'argumentCount' => '0', - ], - 'RANDARRAY' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '0-5', - ], - 'RANDBETWEEN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'RAND'], - 'argumentCount' => '2', - ], - 'RANK' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'RANK'], - 'argumentCount' => '2,3', - ], - 'RANK.AVG' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2,3', - ], - 'RANK.EQ' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'RANK'], - 'argumentCount' => '2,3', - ], - 'RATE' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'RATE'], - 'argumentCount' => '3-6', - ], - 'RECEIVED' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'RECEIVED'], - 'argumentCount' => '4-5', - ], - 'REPLACE' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'REPLACE'], - 'argumentCount' => '4', - ], - 'REPLACEB' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'REPLACE'], - 'argumentCount' => '4', - ], - 'REPT' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => 'str_repeat', - 'argumentCount' => '2', - ], - 'RIGHT' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'RIGHT'], - 'argumentCount' => '1,2', - ], - 'RIGHTB' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'RIGHT'], - 'argumentCount' => '1,2', - ], - 'ROMAN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'ROMAN'], - 'argumentCount' => '1,2', - ], - 'ROUND' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'round', - 'argumentCount' => '2', - ], - 'ROUNDDOWN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'ROUNDDOWN'], - 'argumentCount' => '2', - ], - 'ROUNDUP' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'ROUNDUP'], - 'argumentCount' => '2', - ], - 'ROW' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'ROW'], - 'argumentCount' => '-1', - 'passByReference' => [true], - ], - 'ROWS' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'ROWS'], - 'argumentCount' => '1', - ], - 'RRI' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'RRI'], - 'argumentCount' => '3', - ], - 'RSQ' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'RSQ'], - 'argumentCount' => '2', - ], - 'RTD' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1+', - ], - 'SEARCH' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'SEARCHINSENSITIVE'], - 'argumentCount' => '2,3', - ], - 'SEARCHB' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'SEARCHINSENSITIVE'], - 'argumentCount' => '2,3', - ], - 'SEC' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SEC'], - 'argumentCount' => '1', - ], - 'SECH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SECH'], - 'argumentCount' => '1', - ], - 'SECOND' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'SECOND'], - 'argumentCount' => '1', - ], - 'SEQUENCE' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'SERIESSUM' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SERIESSUM'], - 'argumentCount' => '4', - ], - 'SHEET' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '0,1', - ], - 'SHEETS' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '0,1', - ], - 'SIGN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SIGN'], - 'argumentCount' => '1', - ], - 'SIN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'sin', - 'argumentCount' => '1', - ], - 'SINH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'sinh', - 'argumentCount' => '1', - ], - 'SKEW' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'SKEW'], - 'argumentCount' => '1+', - ], - 'SKEW.P' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1+', - ], - 'SLN' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'SLN'], - 'argumentCount' => '3', - ], - 'SLOPE' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'SLOPE'], - 'argumentCount' => '2', - ], - 'SMALL' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'SMALL'], - 'argumentCount' => '2', - ], - 'SORT' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1+', - ], - 'SORTBY' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2+', - ], - 'SQRT' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'sqrt', - 'argumentCount' => '1', - ], - 'SQRTPI' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SQRTPI'], - 'argumentCount' => '1', - ], - 'STANDARDIZE' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'STANDARDIZE'], - 'argumentCount' => '3', - ], - 'STDEV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'STDEV'], - 'argumentCount' => '1+', - ], - 'STDEV.S' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'STDEV'], - 'argumentCount' => '1+', - ], - 'STDEV.P' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'STDEVP'], - 'argumentCount' => '1+', - ], - 'STDEVA' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'STDEVA'], - 'argumentCount' => '1+', - ], - 'STDEVP' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'STDEVP'], - 'argumentCount' => '1+', - ], - 'STDEVPA' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'STDEVPA'], - 'argumentCount' => '1+', - ], - 'STEYX' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'STEYX'], - 'argumentCount' => '2', - ], - 'SUBSTITUTE' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'SUBSTITUTE'], - 'argumentCount' => '3,4', - ], - 'SUBTOTAL' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SUBTOTAL'], - 'argumentCount' => '2+', - 'passCellReference' => true, - ], - 'SUM' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SUM'], - 'argumentCount' => '1+', - ], - 'SUMIF' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SUMIF'], - 'argumentCount' => '2,3', - ], - 'SUMIFS' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SUMIFS'], - 'argumentCount' => '3+', - ], - 'SUMPRODUCT' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SUMPRODUCT'], - 'argumentCount' => '1+', - ], - 'SUMSQ' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SUMSQ'], - 'argumentCount' => '1+', - ], - 'SUMX2MY2' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SUMX2MY2'], - 'argumentCount' => '2', - ], - 'SUMX2PY2' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SUMX2PY2'], - 'argumentCount' => '2', - ], - 'SUMXMY2' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'SUMXMY2'], - 'argumentCount' => '2', - ], - 'SWITCH' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'statementSwitch'], - 'argumentCount' => '3+', - ], - 'SYD' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'SYD'], - 'argumentCount' => '4', - ], - 'T' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'RETURNSTRING'], - 'argumentCount' => '1', - ], - 'TAN' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'tan', - 'argumentCount' => '1', - ], - 'TANH' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => 'tanh', - 'argumentCount' => '1', - ], - 'TBILLEQ' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'TBILLEQ'], - 'argumentCount' => '3', - ], - 'TBILLPRICE' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'TBILLPRICE'], - 'argumentCount' => '3', - ], - 'TBILLYIELD' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'TBILLYIELD'], - 'argumentCount' => '3', - ], - 'TDIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'TDIST'], - 'argumentCount' => '3', - ], - 'T.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3', - ], - 'T.DIST.2T' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'T.DIST.RT' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'TEXT' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'TEXTFORMAT'], - 'argumentCount' => '2', - ], - 'TEXTJOIN' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'TEXTJOIN'], - 'argumentCount' => '3+', - ], - 'TIME' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'TIME'], - 'argumentCount' => '3', - ], - 'TIMEVALUE' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'TIMEVALUE'], - 'argumentCount' => '1', - ], - 'TINV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'TINV'], - 'argumentCount' => '2', - ], - 'T.INV' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'TINV'], - 'argumentCount' => '2', - ], - 'T.INV.2T' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'TODAY' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'DATENOW'], - 'argumentCount' => '0', - ], - 'TRANSPOSE' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'TRANSPOSE'], - 'argumentCount' => '1', - ], - 'TREND' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'TREND'], - 'argumentCount' => '1-4', - ], - 'TRIM' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'TRIMSPACES'], - 'argumentCount' => '1', - ], - 'TRIMMEAN' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'TRIMMEAN'], - 'argumentCount' => '2', - ], - 'TRUE' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'TRUE'], - 'argumentCount' => '0', - ], - 'TRUNC' => [ - 'category' => Category::CATEGORY_MATH_AND_TRIG, - 'functionCall' => [MathTrig::class, 'TRUNC'], - 'argumentCount' => '1,2', - ], - 'TTEST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '4', - ], - 'T.TEST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '4', - ], - 'TYPE' => [ - 'category' => Category::CATEGORY_INFORMATION, - 'functionCall' => [Functions::class, 'TYPE'], - 'argumentCount' => '1', - ], - 'UNICHAR' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'CHARACTER'], - 'argumentCount' => '1', - ], - 'UNICODE' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'ASCIICODE'], - 'argumentCount' => '1', - ], - 'UNIQUE' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '1+', - ], - 'UPPER' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'UPPERCASE'], - 'argumentCount' => '1', - ], - 'USDOLLAR' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2', - ], - 'VALUE' => [ - 'category' => Category::CATEGORY_TEXT_AND_DATA, - 'functionCall' => [TextData::class, 'VALUE'], - 'argumentCount' => '1', - ], - 'VAR' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'VARFunc'], - 'argumentCount' => '1+', - ], - 'VAR.P' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'VARP'], - 'argumentCount' => '1+', - ], - 'VAR.S' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'VARFunc'], - 'argumentCount' => '1+', - ], - 'VARA' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'VARA'], - 'argumentCount' => '1+', - ], - 'VARP' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'VARP'], - 'argumentCount' => '1+', - ], - 'VARPA' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'VARPA'], - 'argumentCount' => '1+', - ], - 'VDB' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '5-7', - ], - 'VLOOKUP' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [LookupRef::class, 'VLOOKUP'], - 'argumentCount' => '3,4', - ], - 'WEBSERVICE' => [ - 'category' => Category::CATEGORY_WEB, - 'functionCall' => [Web::class, 'WEBSERVICE'], - 'argumentCount' => '1', - ], - 'WEEKDAY' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'WEEKDAY'], - 'argumentCount' => '1,2', - ], - 'WEEKNUM' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'WEEKNUM'], - 'argumentCount' => '1,2', - ], - 'WEIBULL' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'WEIBULL'], - 'argumentCount' => '4', - ], - 'WEIBULL.DIST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'WEIBULL'], - 'argumentCount' => '4', - ], - 'WORKDAY' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'WORKDAY'], - 'argumentCount' => '2-3', - ], - 'WORKDAY.INTL' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2-4', - ], - 'XIRR' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'XIRR'], - 'argumentCount' => '2,3', - ], - 'XLOOKUP' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '3-6', - ], - 'XNPV' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'XNPV'], - 'argumentCount' => '3', - ], - 'XMATCH' => [ - 'category' => Category::CATEGORY_LOOKUP_AND_REFERENCE, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '2,3', - ], - 'XOR' => [ - 'category' => Category::CATEGORY_LOGICAL, - 'functionCall' => [Logical::class, 'logicalXor'], - 'argumentCount' => '1+', - ], - 'YEAR' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'YEAR'], - 'argumentCount' => '1', - ], - 'YEARFRAC' => [ - 'category' => Category::CATEGORY_DATE_AND_TIME, - 'functionCall' => [DateTime::class, 'YEARFRAC'], - 'argumentCount' => '2,3', - ], - 'YIELD' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Functions::class, 'DUMMY'], - 'argumentCount' => '6,7', - ], - 'YIELDDISC' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'YIELDDISC'], - 'argumentCount' => '4,5', - ], - 'YIELDMAT' => [ - 'category' => Category::CATEGORY_FINANCIAL, - 'functionCall' => [Financial::class, 'YIELDMAT'], - 'argumentCount' => '5,6', - ], - 'ZTEST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'ZTEST'], - 'argumentCount' => '2-3', - ], - 'Z.TEST' => [ - 'category' => Category::CATEGORY_STATISTICAL, - 'functionCall' => [Statistical::class, 'ZTEST'], - 'argumentCount' => '2-3', - ], - ]; - - // Internal functions used for special control purposes - private static $controlFunctions = [ - 'MKMATRIX' => [ - 'argumentCount' => '*', - 'functionCall' => [__CLASS__, 'mkMatrix'], - ], - 'NAME.ERROR' => [ - 'argumentCount' => '*', - 'functionCall' => [Functions::class, 'NAME'], - ], - ]; - - public function __construct(?Spreadsheet $spreadsheet = null) - { - $this->delta = 1 * 10 ** (0 - ini_get('precision')); - - $this->spreadsheet = $spreadsheet; - $this->cyclicReferenceStack = new CyclicReferenceStack(); - $this->debugLog = new Logger($this->cyclicReferenceStack); - self::$referenceHelper = ReferenceHelper::getInstance(); - } - - private static function loadLocales(): void - { - $localeFileDirectory = __DIR__ . '/locale/'; - foreach (glob($localeFileDirectory . '*', GLOB_ONLYDIR) as $filename) { - $filename = substr($filename, strlen($localeFileDirectory)); - if ($filename != 'en') { - self::$validLocaleLanguages[] = $filename; - } - } - } - - /** - * Get an instance of this class. - * - * @param Spreadsheet $spreadsheet Injected spreadsheet for working with a PhpSpreadsheet Spreadsheet object, - * or NULL to create a standalone claculation engine - * - * @return Calculation - */ - public static function getInstance(?Spreadsheet $spreadsheet = null) - { - if ($spreadsheet !== null) { - $instance = $spreadsheet->getCalculationEngine(); - if (isset($instance)) { - return $instance; - } - } - - if (!isset(self::$instance) || (self::$instance === null)) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Flush the calculation cache for any existing instance of this class - * but only if a Calculation instance exists. - */ - public function flushInstance(): void - { - $this->clearCalculationCache(); - $this->clearBranchStore(); - } - - /** - * Get the Logger for this calculation engine instance. - * - * @return Logger - */ - public function getDebugLog() - { - return $this->debugLog; - } - - /** - * __clone implementation. Cloning should not be allowed in a Singleton! - */ - final public function __clone() - { - throw new Exception('Cloning the calculation engine is not allowed!'); - } - - /** - * Return the locale-specific translation of TRUE. - * - * @return string locale-specific translation of TRUE - */ - public static function getTRUE() - { - return self::$localeBoolean['TRUE']; - } - - /** - * Return the locale-specific translation of FALSE. - * - * @return string locale-specific translation of FALSE - */ - public static function getFALSE() - { - return self::$localeBoolean['FALSE']; - } - - /** - * Set the Array Return Type (Array or Value of first element in the array). - * - * @param string $returnType Array return type - * - * @return bool Success or failure - */ - public static function setArrayReturnType($returnType) - { - if ( - ($returnType == self::RETURN_ARRAY_AS_VALUE) || - ($returnType == self::RETURN_ARRAY_AS_ERROR) || - ($returnType == self::RETURN_ARRAY_AS_ARRAY) - ) { - self::$returnArrayAsType = $returnType; - - return true; - } - - return false; - } - - /** - * Return the Array Return Type (Array or Value of first element in the array). - * - * @return string $returnType Array return type - */ - public static function getArrayReturnType() - { - return self::$returnArrayAsType; - } - - /** - * Is calculation caching enabled? - * - * @return bool - */ - public function getCalculationCacheEnabled() - { - return $this->calculationCacheEnabled; - } - - /** - * Enable/disable calculation cache. - * - * @param bool $pValue - */ - public function setCalculationCacheEnabled($pValue): void - { - $this->calculationCacheEnabled = $pValue; - $this->clearCalculationCache(); - } - - /** - * Enable calculation cache. - */ - public function enableCalculationCache(): void - { - $this->setCalculationCacheEnabled(true); - } - - /** - * Disable calculation cache. - */ - public function disableCalculationCache(): void - { - $this->setCalculationCacheEnabled(false); - } - - /** - * Clear calculation cache. - */ - public function clearCalculationCache(): void - { - $this->calculationCache = []; - } - - /** - * Clear calculation cache for a specified worksheet. - * - * @param string $worksheetName - */ - public function clearCalculationCacheForWorksheet($worksheetName): void - { - if (isset($this->calculationCache[$worksheetName])) { - unset($this->calculationCache[$worksheetName]); - } - } - - /** - * Rename calculation cache for a specified worksheet. - * - * @param string $fromWorksheetName - * @param string $toWorksheetName - */ - public function renameCalculationCacheForWorksheet($fromWorksheetName, $toWorksheetName): void - { - if (isset($this->calculationCache[$fromWorksheetName])) { - $this->calculationCache[$toWorksheetName] = &$this->calculationCache[$fromWorksheetName]; - unset($this->calculationCache[$fromWorksheetName]); - } - } - - /** - * Enable/disable calculation cache. - * - * @param mixed $enabled - */ - public function setBranchPruningEnabled($enabled): void - { - $this->branchPruningEnabled = $enabled; - } - - public function enableBranchPruning(): void - { - $this->setBranchPruningEnabled(true); - } - - public function disableBranchPruning(): void - { - $this->setBranchPruningEnabled(false); - } - - public function clearBranchStore(): void - { - $this->branchStoreKeyCounter = 0; - } - - /** - * Get the currently defined locale code. - * - * @return string - */ - public function getLocale() - { - return self::$localeLanguage; - } - - /** - * Set the locale code. - * - * @param string $locale The locale to use for formula translation, eg: 'en_us' - * - * @return bool - */ - public function setLocale($locale) - { - // Identify our locale and language - $language = $locale = strtolower($locale); - if (strpos($locale, '_') !== false) { - [$language] = explode('_', $locale); - } - if (count(self::$validLocaleLanguages) == 1) { - self::loadLocales(); - } - // Test whether we have any language data for this language (any locale) - if (in_array($language, self::$validLocaleLanguages)) { - // initialise language/locale settings - self::$localeFunctions = []; - self::$localeArgumentSeparator = ','; - self::$localeBoolean = ['TRUE' => 'TRUE', 'FALSE' => 'FALSE', 'NULL' => 'NULL']; - // Default is English, if user isn't requesting english, then read the necessary data from the locale files - if ($locale != 'en_us') { - // Search for a file with a list of function names for locale - $functionNamesFile = __DIR__ . '/locale/' . str_replace('_', DIRECTORY_SEPARATOR, $locale) . DIRECTORY_SEPARATOR . 'functions'; - if (!file_exists($functionNamesFile)) { - // If there isn't a locale specific function file, look for a language specific function file - $functionNamesFile = __DIR__ . '/locale/' . $language . DIRECTORY_SEPARATOR . 'functions'; - if (!file_exists($functionNamesFile)) { - return false; - } - } - // Retrieve the list of locale or language specific function names - $localeFunctions = file($functionNamesFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - foreach ($localeFunctions as $localeFunction) { - [$localeFunction] = explode('##', $localeFunction); // Strip out comments - if (strpos($localeFunction, '=') !== false) { - [$fName, $lfName] = explode('=', $localeFunction); - $fName = trim($fName); - $lfName = trim($lfName); - if ((isset(self::$phpSpreadsheetFunctions[$fName])) && ($lfName != '') && ($fName != $lfName)) { - self::$localeFunctions[$fName] = $lfName; - } - } - } - // Default the TRUE and FALSE constants to the locale names of the TRUE() and FALSE() functions - if (isset(self::$localeFunctions['TRUE'])) { - self::$localeBoolean['TRUE'] = self::$localeFunctions['TRUE']; - } - if (isset(self::$localeFunctions['FALSE'])) { - self::$localeBoolean['FALSE'] = self::$localeFunctions['FALSE']; - } - - $configFile = __DIR__ . '/locale/' . str_replace('_', DIRECTORY_SEPARATOR, $locale) . DIRECTORY_SEPARATOR . 'config'; - if (!file_exists($configFile)) { - $configFile = __DIR__ . '/locale/' . $language . DIRECTORY_SEPARATOR . 'config'; - } - if (file_exists($configFile)) { - $localeSettings = file($configFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - foreach ($localeSettings as $localeSetting) { - [$localeSetting] = explode('##', $localeSetting); // Strip out comments - if (strpos($localeSetting, '=') !== false) { - [$settingName, $settingValue] = explode('=', $localeSetting); - $settingName = strtoupper(trim($settingName)); - switch ($settingName) { - case 'ARGUMENTSEPARATOR': - self::$localeArgumentSeparator = trim($settingValue); - - break; - } - } - } - } - } - - self::$functionReplaceFromExcel = self::$functionReplaceToExcel = - self::$functionReplaceFromLocale = self::$functionReplaceToLocale = null; - self::$localeLanguage = $locale; - - return true; - } - - return false; - } - - /** - * @param string $fromSeparator - * @param string $toSeparator - * @param string $formula - * @param bool $inBraces - * - * @return string - */ - public static function translateSeparator($fromSeparator, $toSeparator, $formula, &$inBraces) - { - $strlen = mb_strlen($formula); - for ($i = 0; $i < $strlen; ++$i) { - $chr = mb_substr($formula, $i, 1); - switch ($chr) { - case self::FORMULA_OPEN_FUNCTION_BRACE: - $inBraces = true; - - break; - case self::FORMULA_CLOSE_FUNCTION_BRACE: - $inBraces = false; - - break; - case $fromSeparator: - if (!$inBraces) { - $formula = mb_substr($formula, 0, $i) . $toSeparator . mb_substr($formula, $i + 1); - } - } - } - - return $formula; - } - - /** - * @param string[] $from - * @param string[] $to - * @param string $formula - * @param string $fromSeparator - * @param string $toSeparator - * - * @return string - */ - private static function translateFormula(array $from, array $to, $formula, $fromSeparator, $toSeparator) - { - // Convert any Excel function names to the required language - if (self::$localeLanguage !== 'en_us') { - $inBraces = false; - // If there is the possibility of braces within a quoted string, then we don't treat those as matrix indicators - if (strpos($formula, self::FORMULA_STRING_QUOTE) !== false) { - // So instead we skip replacing in any quoted strings by only replacing in every other array element after we've exploded - // the formula - $temp = explode(self::FORMULA_STRING_QUOTE, $formula); - $i = false; - foreach ($temp as &$value) { - // Only count/replace in alternating array entries - if ($i = !$i) { - $value = preg_replace($from, $to, $value); - $value = self::translateSeparator($fromSeparator, $toSeparator, $value, $inBraces); - } - } - unset($value); - // Then rebuild the formula string - $formula = implode(self::FORMULA_STRING_QUOTE, $temp); - } else { - // If there's no quoted strings, then we do a simple count/replace - $formula = preg_replace($from, $to, $formula); - $formula = self::translateSeparator($fromSeparator, $toSeparator, $formula, $inBraces); - } - } - - return $formula; - } - - private static $functionReplaceFromExcel = null; - - private static $functionReplaceToLocale = null; - - public function _translateFormulaToLocale($formula) - { - if (self::$functionReplaceFromExcel === null) { - self::$functionReplaceFromExcel = []; - foreach (array_keys(self::$localeFunctions) as $excelFunctionName) { - self::$functionReplaceFromExcel[] = '/(@?[^\w\.])' . preg_quote($excelFunctionName, '/') . '([\s]*\()/Ui'; - } - foreach (array_keys(self::$localeBoolean) as $excelBoolean) { - self::$functionReplaceFromExcel[] = '/(@?[^\w\.])' . preg_quote($excelBoolean, '/') . '([^\w\.])/Ui'; - } - } - - if (self::$functionReplaceToLocale === null) { - self::$functionReplaceToLocale = []; - foreach (self::$localeFunctions as $localeFunctionName) { - self::$functionReplaceToLocale[] = '$1' . trim($localeFunctionName) . '$2'; - } - foreach (self::$localeBoolean as $localeBoolean) { - self::$functionReplaceToLocale[] = '$1' . trim($localeBoolean) . '$2'; - } - } - - return self::translateFormula(self::$functionReplaceFromExcel, self::$functionReplaceToLocale, $formula, ',', self::$localeArgumentSeparator); - } - - private static $functionReplaceFromLocale = null; - - private static $functionReplaceToExcel = null; - - public function _translateFormulaToEnglish($formula) - { - if (self::$functionReplaceFromLocale === null) { - self::$functionReplaceFromLocale = []; - foreach (self::$localeFunctions as $localeFunctionName) { - self::$functionReplaceFromLocale[] = '/(@?[^\w\.])' . preg_quote($localeFunctionName, '/') . '([\s]*\()/Ui'; - } - foreach (self::$localeBoolean as $excelBoolean) { - self::$functionReplaceFromLocale[] = '/(@?[^\w\.])' . preg_quote($excelBoolean, '/') . '([^\w\.])/Ui'; - } - } - - if (self::$functionReplaceToExcel === null) { - self::$functionReplaceToExcel = []; - foreach (array_keys(self::$localeFunctions) as $excelFunctionName) { - self::$functionReplaceToExcel[] = '$1' . trim($excelFunctionName) . '$2'; - } - foreach (array_keys(self::$localeBoolean) as $excelBoolean) { - self::$functionReplaceToExcel[] = '$1' . trim($excelBoolean) . '$2'; - } - } - - return self::translateFormula(self::$functionReplaceFromLocale, self::$functionReplaceToExcel, $formula, self::$localeArgumentSeparator, ','); - } - - public static function localeFunc($function) - { - if (self::$localeLanguage !== 'en_us') { - $functionName = trim($function, '('); - if (isset(self::$localeFunctions[$functionName])) { - $brace = ($functionName != $function); - $function = self::$localeFunctions[$functionName]; - if ($brace) { - $function .= '('; - } - } - } - - return $function; - } - - /** - * Wrap string values in quotes. - * - * @param mixed $value - * - * @return mixed - */ - public static function wrapResult($value) - { - if (is_string($value)) { - // Error values cannot be "wrapped" - if (preg_match('/^' . self::CALCULATION_REGEXP_ERROR . '$/i', $value, $match)) { - // Return Excel errors "as is" - return $value; - } - // Return strings wrapped in quotes - return self::FORMULA_STRING_QUOTE . $value . self::FORMULA_STRING_QUOTE; - } elseif ((is_float($value)) && ((is_nan($value)) || (is_infinite($value)))) { - // Convert numeric errors to NaN error - return Functions::NAN(); - } - - return $value; - } - - /** - * Remove quotes used as a wrapper to identify string values. - * - * @param mixed $value - * - * @return mixed - */ - public static function unwrapResult($value) - { - if (is_string($value)) { - if ((isset($value[0])) && ($value[0] == self::FORMULA_STRING_QUOTE) && (substr($value, -1) == self::FORMULA_STRING_QUOTE)) { - return substr($value, 1, -1); - } - // Convert numeric errors to NAN error - } elseif ((is_float($value)) && ((is_nan($value)) || (is_infinite($value)))) { - return Functions::NAN(); - } - - return $value; - } - - /** - * Calculate cell value (using formula from a cell ID) - * Retained for backward compatibility. - * - * @param Cell $pCell Cell to calculate - * - * @return mixed - */ - public function calculate(?Cell $pCell = null) - { - try { - return $this->calculateCellValue($pCell); - } catch (\Exception $e) { - throw new Exception($e->getMessage()); - } - } - - /** - * Calculate the value of a cell formula. - * - * @param Cell $pCell Cell to calculate - * @param bool $resetLog Flag indicating whether the debug log should be reset or not - * - * @return mixed - */ - public function calculateCellValue(?Cell $pCell = null, $resetLog = true) - { - if ($pCell === null) { - return null; - } - - $returnArrayAsType = self::$returnArrayAsType; - if ($resetLog) { - // Initialise the logging settings if requested - $this->formulaError = null; - $this->debugLog->clearLog(); - $this->cyclicReferenceStack->clear(); - $this->cyclicFormulaCounter = 1; - - self::$returnArrayAsType = self::RETURN_ARRAY_AS_ARRAY; - } - - // Execute the calculation for the cell formula - $this->cellStack[] = [ - 'sheet' => $pCell->getWorksheet()->getTitle(), - 'cell' => $pCell->getCoordinate(), - ]; - - try { - $result = self::unwrapResult($this->_calculateFormulaValue($pCell->getValue(), $pCell->getCoordinate(), $pCell)); - $cellAddress = array_pop($this->cellStack); - $this->spreadsheet->getSheetByName($cellAddress['sheet'])->getCell($cellAddress['cell']); - } catch (\Exception $e) { - $cellAddress = array_pop($this->cellStack); - $this->spreadsheet->getSheetByName($cellAddress['sheet'])->getCell($cellAddress['cell']); - - throw new Exception($e->getMessage()); - } - - if ((is_array($result)) && (self::$returnArrayAsType != self::RETURN_ARRAY_AS_ARRAY)) { - self::$returnArrayAsType = $returnArrayAsType; - $testResult = Functions::flattenArray($result); - if (self::$returnArrayAsType == self::RETURN_ARRAY_AS_ERROR) { - return Functions::VALUE(); - } - // If there's only a single cell in the array, then we allow it - if (count($testResult) != 1) { - // If keys are numeric, then it's a matrix result rather than a cell range result, so we permit it - $r = array_keys($result); - $r = array_shift($r); - if (!is_numeric($r)) { - return Functions::VALUE(); - } - if (is_array($result[$r])) { - $c = array_keys($result[$r]); - $c = array_shift($c); - if (!is_numeric($c)) { - return Functions::VALUE(); - } - } - } - $result = array_shift($testResult); - } - self::$returnArrayAsType = $returnArrayAsType; - - if ($result === null && $pCell->getWorksheet()->getSheetView()->getShowZeros()) { - return 0; - } elseif ((is_float($result)) && ((is_nan($result)) || (is_infinite($result)))) { - return Functions::NAN(); - } - - return $result; - } - - /** - * Validate and parse a formula string. - * - * @param string $formula Formula to parse - * - * @return array|bool - */ - public function parseFormula($formula) - { - // Basic validation that this is indeed a formula - // We return an empty array if not - $formula = trim($formula); - if ((!isset($formula[0])) || ($formula[0] != '=')) { - return []; - } - $formula = ltrim(substr($formula, 1)); - if (!isset($formula[0])) { - return []; - } - - // Parse the formula and return the token stack - return $this->internalParseFormula($formula); - } - - /** - * Calculate the value of a formula. - * - * @param string $formula Formula to parse - * @param string $cellID Address of the cell to calculate - * @param Cell $pCell Cell to calculate - * - * @return mixed - */ - public function calculateFormula($formula, $cellID = null, ?Cell $pCell = null) - { - // Initialise the logging settings - $this->formulaError = null; - $this->debugLog->clearLog(); - $this->cyclicReferenceStack->clear(); - - $resetCache = $this->getCalculationCacheEnabled(); - if ($this->spreadsheet !== null && $cellID === null && $pCell === null) { - $cellID = 'A1'; - $pCell = $this->spreadsheet->getActiveSheet()->getCell($cellID); - } else { - // Disable calculation cacheing because it only applies to cell calculations, not straight formulae - // But don't actually flush any cache - $this->calculationCacheEnabled = false; - } - - // Execute the calculation - try { - $result = self::unwrapResult($this->_calculateFormulaValue($formula, $cellID, $pCell)); - } catch (\Exception $e) { - throw new Exception($e->getMessage()); - } - - if ($this->spreadsheet === null) { - // Reset calculation cacheing to its previous state - $this->calculationCacheEnabled = $resetCache; - } - - return $result; - } - - /** - * @param string $cellReference - * @param mixed $cellValue - * - * @return bool - */ - public function getValueFromCache($cellReference, &$cellValue) - { - // Is calculation cacheing enabled? - // Is the value present in calculation cache? - $this->debugLog->writeDebugLog('Testing cache value for cell ', $cellReference); - if (($this->calculationCacheEnabled) && (isset($this->calculationCache[$cellReference]))) { - $this->debugLog->writeDebugLog('Retrieving value for cell ', $cellReference, ' from cache'); - // Return the cached result - - $cellValue = $this->calculationCache[$cellReference]; - - return true; - } - - return false; - } - - /** - * @param string $cellReference - * @param mixed $cellValue - */ - public function saveValueToCache($cellReference, $cellValue): void - { - if ($this->calculationCacheEnabled) { - $this->calculationCache[$cellReference] = $cellValue; - } - } - - /** - * Parse a cell formula and calculate its value. - * - * @param string $formula The formula to parse and calculate - * @param string $cellID The ID (e.g. A3) of the cell that we are calculating - * @param Cell $pCell Cell to calculate - * - * @return mixed - */ - public function _calculateFormulaValue($formula, $cellID = null, ?Cell $pCell = null) - { - $cellValue = null; - - // Quote-Prefixed cell values cannot be formulae, but are treated as strings - if ($pCell !== null && $pCell->getStyle()->getQuotePrefix() === true) { - return self::wrapResult((string) $formula); - } - - if (preg_match('/^=\s*cmd\s*\|/miu', $formula) !== 0) { - return self::wrapResult($formula); - } - - // Basic validation that this is indeed a formula - // We simply return the cell value if not - $formula = trim($formula); - if ($formula[0] != '=') { - return self::wrapResult($formula); - } - $formula = ltrim(substr($formula, 1)); - if (!isset($formula[0])) { - return self::wrapResult($formula); - } - - $pCellParent = ($pCell !== null) ? $pCell->getWorksheet() : null; - $wsTitle = ($pCellParent !== null) ? $pCellParent->getTitle() : "\x00Wrk"; - $wsCellReference = $wsTitle . '!' . $cellID; - - if (($cellID !== null) && ($this->getValueFromCache($wsCellReference, $cellValue))) { - return $cellValue; - } - $this->debugLog->writeDebugLog('Evaluating formula for cell ', $wsCellReference); - - if (($wsTitle[0] !== "\x00") && ($this->cyclicReferenceStack->onStack($wsCellReference))) { - if ($this->cyclicFormulaCount <= 0) { - $this->cyclicFormulaCell = ''; - - return $this->raiseFormulaError('Cyclic Reference in Formula'); - } elseif ($this->cyclicFormulaCell === $wsCellReference) { - ++$this->cyclicFormulaCounter; - if ($this->cyclicFormulaCounter >= $this->cyclicFormulaCount) { - $this->cyclicFormulaCell = ''; - - return $cellValue; - } - } elseif ($this->cyclicFormulaCell == '') { - if ($this->cyclicFormulaCounter >= $this->cyclicFormulaCount) { - return $cellValue; - } - $this->cyclicFormulaCell = $wsCellReference; - } - } - - $this->debugLog->writeDebugLog('Formula for cell ', $wsCellReference, ' is ', $formula); - // Parse the formula onto the token stack and calculate the value - $this->cyclicReferenceStack->push($wsCellReference); - $cellValue = $this->processTokenStack($this->internalParseFormula($formula, $pCell), $cellID, $pCell); - $this->cyclicReferenceStack->pop(); - - // Save to calculation cache - if ($cellID !== null) { - $this->saveValueToCache($wsCellReference, $cellValue); - } - - // Return the calculated value - return $cellValue; - } - - /** - * Ensure that paired matrix operands are both matrices and of the same size. - * - * @param mixed &$operand1 First matrix operand - * @param mixed &$operand2 Second matrix operand - * @param int $resize Flag indicating whether the matrices should be resized to match - * and (if so), whether the smaller dimension should grow or the - * larger should shrink. - * 0 = no resize - * 1 = shrink to fit - * 2 = extend to fit - * - * @return array - */ - private static function checkMatrixOperands(&$operand1, &$operand2, $resize = 1) - { - // Examine each of the two operands, and turn them into an array if they aren't one already - // Note that this function should only be called if one or both of the operand is already an array - if (!is_array($operand1)) { - [$matrixRows, $matrixColumns] = self::getMatrixDimensions($operand2); - $operand1 = array_fill(0, $matrixRows, array_fill(0, $matrixColumns, $operand1)); - $resize = 0; - } elseif (!is_array($operand2)) { - [$matrixRows, $matrixColumns] = self::getMatrixDimensions($operand1); - $operand2 = array_fill(0, $matrixRows, array_fill(0, $matrixColumns, $operand2)); - $resize = 0; - } - - [$matrix1Rows, $matrix1Columns] = self::getMatrixDimensions($operand1); - [$matrix2Rows, $matrix2Columns] = self::getMatrixDimensions($operand2); - if (($matrix1Rows == $matrix2Columns) && ($matrix2Rows == $matrix1Columns)) { - $resize = 1; - } - - if ($resize == 2) { - // Given two matrices of (potentially) unequal size, convert the smaller in each dimension to match the larger - self::resizeMatricesExtend($operand1, $operand2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns); - } elseif ($resize == 1) { - // Given two matrices of (potentially) unequal size, convert the larger in each dimension to match the smaller - self::resizeMatricesShrink($operand1, $operand2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns); - } - - return [$matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns]; - } - - /** - * Read the dimensions of a matrix, and re-index it with straight numeric keys starting from row 0, column 0. - * - * @param array &$matrix matrix operand - * - * @return int[] An array comprising the number of rows, and number of columns - */ - public static function getMatrixDimensions(array &$matrix) - { - $matrixRows = count($matrix); - $matrixColumns = 0; - foreach ($matrix as $rowKey => $rowValue) { - if (!is_array($rowValue)) { - $matrix[$rowKey] = [$rowValue]; - $matrixColumns = max(1, $matrixColumns); - } else { - $matrix[$rowKey] = array_values($rowValue); - $matrixColumns = max(count($rowValue), $matrixColumns); - } - } - $matrix = array_values($matrix); - - return [$matrixRows, $matrixColumns]; - } - - /** - * Ensure that paired matrix operands are both matrices of the same size. - * - * @param mixed &$matrix1 First matrix operand - * @param mixed &$matrix2 Second matrix operand - * @param int $matrix1Rows Row size of first matrix operand - * @param int $matrix1Columns Column size of first matrix operand - * @param int $matrix2Rows Row size of second matrix operand - * @param int $matrix2Columns Column size of second matrix operand - */ - private static function resizeMatricesShrink(&$matrix1, &$matrix2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns): void - { - if (($matrix2Columns < $matrix1Columns) || ($matrix2Rows < $matrix1Rows)) { - if ($matrix2Rows < $matrix1Rows) { - for ($i = $matrix2Rows; $i < $matrix1Rows; ++$i) { - unset($matrix1[$i]); - } - } - if ($matrix2Columns < $matrix1Columns) { - for ($i = 0; $i < $matrix1Rows; ++$i) { - for ($j = $matrix2Columns; $j < $matrix1Columns; ++$j) { - unset($matrix1[$i][$j]); - } - } - } - } - - if (($matrix1Columns < $matrix2Columns) || ($matrix1Rows < $matrix2Rows)) { - if ($matrix1Rows < $matrix2Rows) { - for ($i = $matrix1Rows; $i < $matrix2Rows; ++$i) { - unset($matrix2[$i]); - } - } - if ($matrix1Columns < $matrix2Columns) { - for ($i = 0; $i < $matrix2Rows; ++$i) { - for ($j = $matrix1Columns; $j < $matrix2Columns; ++$j) { - unset($matrix2[$i][$j]); - } - } - } - } - } - - /** - * Ensure that paired matrix operands are both matrices of the same size. - * - * @param mixed &$matrix1 First matrix operand - * @param mixed &$matrix2 Second matrix operand - * @param int $matrix1Rows Row size of first matrix operand - * @param int $matrix1Columns Column size of first matrix operand - * @param int $matrix2Rows Row size of second matrix operand - * @param int $matrix2Columns Column size of second matrix operand - */ - private static function resizeMatricesExtend(&$matrix1, &$matrix2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns): void - { - if (($matrix2Columns < $matrix1Columns) || ($matrix2Rows < $matrix1Rows)) { - if ($matrix2Columns < $matrix1Columns) { - for ($i = 0; $i < $matrix2Rows; ++$i) { - $x = $matrix2[$i][$matrix2Columns - 1]; - for ($j = $matrix2Columns; $j < $matrix1Columns; ++$j) { - $matrix2[$i][$j] = $x; - } - } - } - if ($matrix2Rows < $matrix1Rows) { - $x = $matrix2[$matrix2Rows - 1]; - for ($i = 0; $i < $matrix1Rows; ++$i) { - $matrix2[$i] = $x; - } - } - } - - if (($matrix1Columns < $matrix2Columns) || ($matrix1Rows < $matrix2Rows)) { - if ($matrix1Columns < $matrix2Columns) { - for ($i = 0; $i < $matrix1Rows; ++$i) { - $x = $matrix1[$i][$matrix1Columns - 1]; - for ($j = $matrix1Columns; $j < $matrix2Columns; ++$j) { - $matrix1[$i][$j] = $x; - } - } - } - if ($matrix1Rows < $matrix2Rows) { - $x = $matrix1[$matrix1Rows - 1]; - for ($i = 0; $i < $matrix2Rows; ++$i) { - $matrix1[$i] = $x; - } - } - } - } - - /** - * Format details of an operand for display in the log (based on operand type). - * - * @param mixed $value First matrix operand - * - * @return mixed - */ - private function showValue($value) - { - if ($this->debugLog->getWriteDebugLog()) { - $testArray = Functions::flattenArray($value); - if (count($testArray) == 1) { - $value = array_pop($testArray); - } - - if (is_array($value)) { - $returnMatrix = []; - $pad = $rpad = ', '; - foreach ($value as $row) { - if (is_array($row)) { - $returnMatrix[] = implode($pad, array_map([$this, 'showValue'], $row)); - $rpad = '; '; - } else { - $returnMatrix[] = $this->showValue($row); - } - } - - return '{ ' . implode($rpad, $returnMatrix) . ' }'; - } elseif (is_string($value) && (trim($value, self::FORMULA_STRING_QUOTE) == $value)) { - return self::FORMULA_STRING_QUOTE . $value . self::FORMULA_STRING_QUOTE; - } elseif (is_bool($value)) { - return ($value) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE']; - } - } - - return Functions::flattenSingleValue($value); - } - - /** - * Format type and details of an operand for display in the log (based on operand type). - * - * @param mixed $value First matrix operand - * - * @return null|string - */ - private function showTypeDetails($value) - { - if ($this->debugLog->getWriteDebugLog()) { - $testArray = Functions::flattenArray($value); - if (count($testArray) == 1) { - $value = array_pop($testArray); - } - - if ($value === null) { - return 'a NULL value'; - } elseif (is_float($value)) { - $typeString = 'a floating point number'; - } elseif (is_int($value)) { - $typeString = 'an integer number'; - } elseif (is_bool($value)) { - $typeString = 'a boolean'; - } elseif (is_array($value)) { - $typeString = 'a matrix'; - } else { - if ($value == '') { - return 'an empty string'; - } elseif ($value[0] == '#') { - return 'a ' . $value . ' error'; - } - $typeString = 'a string'; - } - - return $typeString . ' with a value of ' . $this->showValue($value); - } - } - - /** - * @param string $formula - * - * @return false|string False indicates an error - */ - private function convertMatrixReferences($formula) - { - static $matrixReplaceFrom = [self::FORMULA_OPEN_FUNCTION_BRACE, ';', self::FORMULA_CLOSE_FUNCTION_BRACE]; - static $matrixReplaceTo = ['MKMATRIX(MKMATRIX(', '),MKMATRIX(', '))']; - - // Convert any Excel matrix references to the MKMATRIX() function - if (strpos($formula, self::FORMULA_OPEN_FUNCTION_BRACE) !== false) { - // If there is the possibility of braces within a quoted string, then we don't treat those as matrix indicators - if (strpos($formula, self::FORMULA_STRING_QUOTE) !== false) { - // So instead we skip replacing in any quoted strings by only replacing in every other array element after we've exploded - // the formula - $temp = explode(self::FORMULA_STRING_QUOTE, $formula); - // Open and Closed counts used for trapping mismatched braces in the formula - $openCount = $closeCount = 0; - $i = false; - foreach ($temp as &$value) { - // Only count/replace in alternating array entries - if ($i = !$i) { - $openCount += substr_count($value, self::FORMULA_OPEN_FUNCTION_BRACE); - $closeCount += substr_count($value, self::FORMULA_CLOSE_FUNCTION_BRACE); - $value = str_replace($matrixReplaceFrom, $matrixReplaceTo, $value); - } - } - unset($value); - // Then rebuild the formula string - $formula = implode(self::FORMULA_STRING_QUOTE, $temp); - } else { - // If there's no quoted strings, then we do a simple count/replace - $openCount = substr_count($formula, self::FORMULA_OPEN_FUNCTION_BRACE); - $closeCount = substr_count($formula, self::FORMULA_CLOSE_FUNCTION_BRACE); - $formula = str_replace($matrixReplaceFrom, $matrixReplaceTo, $formula); - } - // Trap for mismatched braces and trigger an appropriate error - if ($openCount < $closeCount) { - if ($openCount > 0) { - return $this->raiseFormulaError("Formula Error: Mismatched matrix braces '}'"); - } - - return $this->raiseFormulaError("Formula Error: Unexpected '}' encountered"); - } elseif ($openCount > $closeCount) { - if ($closeCount > 0) { - return $this->raiseFormulaError("Formula Error: Mismatched matrix braces '{'"); - } - - return $this->raiseFormulaError("Formula Error: Unexpected '{' encountered"); - } - } - - return $formula; - } - - private static function mkMatrix(...$args) - { - return $args; - } - - // Binary Operators - // These operators always work on two values - // Array key is the operator, the value indicates whether this is a left or right associative operator - private static $operatorAssociativity = [ - '^' => 0, // Exponentiation - '*' => 0, '/' => 0, // Multiplication and Division - '+' => 0, '-' => 0, // Addition and Subtraction - '&' => 0, // Concatenation - '|' => 0, ':' => 0, // Intersect and Range - '>' => 0, '<' => 0, '=' => 0, '>=' => 0, '<=' => 0, '<>' => 0, // Comparison - ]; - - // Comparison (Boolean) Operators - // These operators work on two values, but always return a boolean result - private static $comparisonOperators = ['>' => true, '<' => true, '=' => true, '>=' => true, '<=' => true, '<>' => true]; - - // Operator Precedence - // This list includes all valid operators, whether binary (including boolean) or unary (such as %) - // Array key is the operator, the value is its precedence - private static $operatorPrecedence = [ - ':' => 8, // Range - '|' => 7, // Intersect - '~' => 6, // Negation - '%' => 5, // Percentage - '^' => 4, // Exponentiation - '*' => 3, '/' => 3, // Multiplication and Division - '+' => 2, '-' => 2, // Addition and Subtraction - '&' => 1, // Concatenation - '>' => 0, '<' => 0, '=' => 0, '>=' => 0, '<=' => 0, '<>' => 0, // Comparison - ]; - - // Convert infix to postfix notation - - /** - * @param string $formula - * - * @return bool - */ - private function internalParseFormula($formula, ?Cell $pCell = null) - { - if (($formula = $this->convertMatrixReferences(trim($formula))) === false) { - return false; - } - - // If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent worksheet), - // so we store the parent worksheet so that we can re-attach it when necessary - $pCellParent = ($pCell !== null) ? $pCell->getWorksheet() : null; - - $regexpMatchString = '/^(' . self::CALCULATION_REGEXP_FUNCTION . - '|' . self::CALCULATION_REGEXP_CELLREF . - '|' . self::CALCULATION_REGEXP_NUMBER . - '|' . self::CALCULATION_REGEXP_STRING . - '|' . self::CALCULATION_REGEXP_OPENBRACE . - '|' . self::CALCULATION_REGEXP_DEFINEDNAME . - '|' . self::CALCULATION_REGEXP_ERROR . - ')/sui'; - - // Start with initialisation - $index = 0; - $stack = new Stack(); - $output = []; - $expectingOperator = false; // We use this test in syntax-checking the expression to determine when a - // - is a negation or + is a positive operator rather than an operation - $expectingOperand = false; // We use this test in syntax-checking the expression to determine whether an operand - // should be null in a function call - - // IF branch pruning - // currently pending storeKey (last item of the storeKeysStack - $pendingStoreKey = null; - // stores a list of storeKeys (string[]) - $pendingStoreKeysStack = []; - $expectingConditionMap = []; // ['storeKey' => true, ...] - $expectingThenMap = []; // ['storeKey' => true, ...] - $expectingElseMap = []; // ['storeKey' => true, ...] - $parenthesisDepthMap = []; // ['storeKey' => 4, ...] - - // The guts of the lexical parser - // Loop through the formula extracting each operator and operand in turn - while (true) { - // Branch pruning: we adapt the output item to the context (it will - // be used to limit its computation) - $currentCondition = null; - $currentOnlyIf = null; - $currentOnlyIfNot = null; - $previousStoreKey = null; - $pendingStoreKey = end($pendingStoreKeysStack); - - if ($this->branchPruningEnabled) { - // this is a condition ? - if (isset($expectingConditionMap[$pendingStoreKey]) && $expectingConditionMap[$pendingStoreKey]) { - $currentCondition = $pendingStoreKey; - $stackDepth = count($pendingStoreKeysStack); - if ($stackDepth > 1) { // nested if - $previousStoreKey = $pendingStoreKeysStack[$stackDepth - 2]; - } - } - if (isset($expectingThenMap[$pendingStoreKey]) && $expectingThenMap[$pendingStoreKey]) { - $currentOnlyIf = $pendingStoreKey; - } elseif (isset($previousStoreKey)) { - if (isset($expectingThenMap[$previousStoreKey]) && $expectingThenMap[$previousStoreKey]) { - $currentOnlyIf = $previousStoreKey; - } - } - if (isset($expectingElseMap[$pendingStoreKey]) && $expectingElseMap[$pendingStoreKey]) { - $currentOnlyIfNot = $pendingStoreKey; - } elseif (isset($previousStoreKey)) { - if (isset($expectingElseMap[$previousStoreKey]) && $expectingElseMap[$previousStoreKey]) { - $currentOnlyIfNot = $previousStoreKey; - } - } - } - - $opCharacter = $formula[$index]; // Get the first character of the value at the current index position - - if ((isset(self::$comparisonOperators[$opCharacter])) && (strlen($formula) > $index) && (isset(self::$comparisonOperators[$formula[$index + 1]]))) { - $opCharacter .= $formula[++$index]; - } - // Find out if we're currently at the beginning of a number, variable, cell reference, function, parenthesis or operand - $isOperandOrFunction = preg_match($regexpMatchString, substr($formula, $index), $match); - if ($opCharacter == '-' && !$expectingOperator) { // Is it a negation instead of a minus? - // Put a negation on the stack - $stack->push('Unary Operator', '~', null, $currentCondition, $currentOnlyIf, $currentOnlyIfNot); - ++$index; // and drop the negation symbol - } elseif ($opCharacter == '%' && $expectingOperator) { - // Put a percentage on the stack - $stack->push('Unary Operator', '%', null, $currentCondition, $currentOnlyIf, $currentOnlyIfNot); - ++$index; - } elseif ($opCharacter == '+' && !$expectingOperator) { // Positive (unary plus rather than binary operator plus) can be discarded? - ++$index; // Drop the redundant plus symbol - } elseif ((($opCharacter == '~') || ($opCharacter == '|')) && (!$isOperandOrFunction)) { // We have to explicitly deny a tilde or pipe, because they are legal - return $this->raiseFormulaError("Formula Error: Illegal character '~'"); // on the stack but not in the input expression - } elseif ((isset(self::$operators[$opCharacter]) || $isOperandOrFunction) && $expectingOperator) { // Are we putting an operator on the stack? - while ( - $stack->count() > 0 && - ($o2 = $stack->last()) && - isset(self::$operators[$o2['value']]) && - @(self::$operatorAssociativity[$opCharacter] ? self::$operatorPrecedence[$opCharacter] < self::$operatorPrecedence[$o2['value']] : self::$operatorPrecedence[$opCharacter] <= self::$operatorPrecedence[$o2['value']]) - ) { - $output[] = $stack->pop(); // Swap operands and higher precedence operators from the stack to the output - } - - // Finally put our current operator onto the stack - $stack->push('Binary Operator', $opCharacter, null, $currentCondition, $currentOnlyIf, $currentOnlyIfNot); - - ++$index; - $expectingOperator = false; - } elseif ($opCharacter == ')' && $expectingOperator) { // Are we expecting to close a parenthesis? - $expectingOperand = false; - while (($o2 = $stack->pop()) && $o2['value'] != '(') { // Pop off the stack back to the last ( - if ($o2 === null) { - return $this->raiseFormulaError('Formula Error: Unexpected closing brace ")"'); - } - $output[] = $o2; - } - $d = $stack->last(2); - - // Branch pruning we decrease the depth whether is it a function - // call or a parenthesis - if (!empty($pendingStoreKey)) { - --$parenthesisDepthMap[$pendingStoreKey]; - } - - if (is_array($d) && preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $d['value'], $matches)) { // Did this parenthesis just close a function? - if (!empty($pendingStoreKey) && $parenthesisDepthMap[$pendingStoreKey] == -1) { - // we are closing an IF( - if ($d['value'] != 'IF(') { - return $this->raiseFormulaError('Parser bug we should be in an "IF("'); - } - if ($expectingConditionMap[$pendingStoreKey]) { - return $this->raiseFormulaError('We should not be expecting a condition'); - } - $expectingThenMap[$pendingStoreKey] = false; - $expectingElseMap[$pendingStoreKey] = false; - --$parenthesisDepthMap[$pendingStoreKey]; - array_pop($pendingStoreKeysStack); - unset($pendingStoreKey); - } - - $functionName = $matches[1]; // Get the function name - $d = $stack->pop(); - $argumentCount = $d['value']; // See how many arguments there were (argument count is the next value stored on the stack) - $output[] = $d; // Dump the argument count on the output - $output[] = $stack->pop(); // Pop the function and push onto the output - if (isset(self::$controlFunctions[$functionName])) { - $expectedArgumentCount = self::$controlFunctions[$functionName]['argumentCount']; - $functionCall = self::$controlFunctions[$functionName]['functionCall']; - } elseif (isset(self::$phpSpreadsheetFunctions[$functionName])) { - $expectedArgumentCount = self::$phpSpreadsheetFunctions[$functionName]['argumentCount']; - $functionCall = self::$phpSpreadsheetFunctions[$functionName]['functionCall']; - } else { // did we somehow push a non-function on the stack? this should never happen - return $this->raiseFormulaError('Formula Error: Internal error, non-function on stack'); - } - // Check the argument count - $argumentCountError = false; - if (is_numeric($expectedArgumentCount)) { - if ($expectedArgumentCount < 0) { - if ($argumentCount > abs($expectedArgumentCount)) { - $argumentCountError = true; - $expectedArgumentCountString = 'no more than ' . abs($expectedArgumentCount); - } - } else { - if ($argumentCount != $expectedArgumentCount) { - $argumentCountError = true; - $expectedArgumentCountString = $expectedArgumentCount; - } - } - } elseif ($expectedArgumentCount != '*') { - $isOperandOrFunction = preg_match('/(\d*)([-+,])(\d*)/', $expectedArgumentCount, $argMatch); - switch ($argMatch[2]) { - case '+': - if ($argumentCount < $argMatch[1]) { - $argumentCountError = true; - $expectedArgumentCountString = $argMatch[1] . ' or more '; - } - - break; - case '-': - if (($argumentCount < $argMatch[1]) || ($argumentCount > $argMatch[3])) { - $argumentCountError = true; - $expectedArgumentCountString = 'between ' . $argMatch[1] . ' and ' . $argMatch[3]; - } - - break; - case ',': - if (($argumentCount != $argMatch[1]) && ($argumentCount != $argMatch[3])) { - $argumentCountError = true; - $expectedArgumentCountString = 'either ' . $argMatch[1] . ' or ' . $argMatch[3]; - } - - break; - } - } - if ($argumentCountError) { - return $this->raiseFormulaError("Formula Error: Wrong number of arguments for $functionName() function: $argumentCount given, " . $expectedArgumentCountString . ' expected'); - } - } - ++$index; - } elseif ($opCharacter == ',') { // Is this the separator for function arguments? - if ( - !empty($pendingStoreKey) && - $parenthesisDepthMap[$pendingStoreKey] == 0 - ) { - // We must go to the IF next argument - if ($expectingConditionMap[$pendingStoreKey]) { - $expectingConditionMap[$pendingStoreKey] = false; - $expectingThenMap[$pendingStoreKey] = true; - } elseif ($expectingThenMap[$pendingStoreKey]) { - $expectingThenMap[$pendingStoreKey] = false; - $expectingElseMap[$pendingStoreKey] = true; - } elseif ($expectingElseMap[$pendingStoreKey]) { - return $this->raiseFormulaError('Reaching fourth argument of an IF'); - } - } - while (($o2 = $stack->pop()) && $o2['value'] != '(') { // Pop off the stack back to the last ( - if ($o2 === null) { - return $this->raiseFormulaError('Formula Error: Unexpected ,'); - } - $output[] = $o2; // pop the argument expression stuff and push onto the output - } - // If we've a comma when we're expecting an operand, then what we actually have is a null operand; - // so push a null onto the stack - if (($expectingOperand) || (!$expectingOperator)) { - $output[] = ['type' => 'NULL Value', 'value' => self::$excelConstants['NULL'], 'reference' => null]; - } - // make sure there was a function - $d = $stack->last(2); - if (!preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $d['value'], $matches)) { - return $this->raiseFormulaError('Formula Error: Unexpected ,'); - } - $d = $stack->pop(); - $itemStoreKey = $d['storeKey'] ?? null; - $itemOnlyIf = $d['onlyIf'] ?? null; - $itemOnlyIfNot = $d['onlyIfNot'] ?? null; - $stack->push($d['type'], ++$d['value'], $d['reference'], $itemStoreKey, $itemOnlyIf, $itemOnlyIfNot); // increment the argument count - $stack->push('Brace', '(', null, $itemStoreKey, $itemOnlyIf, $itemOnlyIfNot); // put the ( back on, we'll need to pop back to it again - $expectingOperator = false; - $expectingOperand = true; - ++$index; - } elseif ($opCharacter == '(' && !$expectingOperator) { - if (!empty($pendingStoreKey)) { // Branch pruning: we go deeper - ++$parenthesisDepthMap[$pendingStoreKey]; - } - $stack->push('Brace', '(', null, $currentCondition, $currentOnlyIf, $currentOnlyIf); - ++$index; - } elseif ($isOperandOrFunction && !$expectingOperator) { // do we now have a function/variable/number? - $expectingOperator = true; - $expectingOperand = false; - $val = $match[1]; - $length = strlen($val); - if (preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $val, $matches)) { - $val = preg_replace('/\s/u', '', $val); - if (isset(self::$phpSpreadsheetFunctions[strtoupper($matches[1])]) || isset(self::$controlFunctions[strtoupper($matches[1])])) { // it's a function - $valToUpper = strtoupper($val); - } else { - $valToUpper = 'NAME.ERROR('; - } - // here $matches[1] will contain values like "IF" - // and $val "IF(" - if ($this->branchPruningEnabled && ($valToUpper == 'IF(')) { // we handle a new if - $pendingStoreKey = $this->getUnusedBranchStoreKey(); - $pendingStoreKeysStack[] = $pendingStoreKey; - $expectingConditionMap[$pendingStoreKey] = true; - $parenthesisDepthMap[$pendingStoreKey] = 0; - } else { // this is not an if but we go deeper - if (!empty($pendingStoreKey) && array_key_exists($pendingStoreKey, $parenthesisDepthMap)) { - ++$parenthesisDepthMap[$pendingStoreKey]; - } - } - - $stack->push('Function', $valToUpper, null, $currentCondition, $currentOnlyIf, $currentOnlyIfNot); - // tests if the function is closed right after opening - $ax = preg_match('/^\s*\)/u', substr($formula, $index + $length)); - if ($ax) { - $stack->push('Operand Count for Function ' . $valToUpper . ')', 0, null, $currentCondition, $currentOnlyIf, $currentOnlyIfNot); - $expectingOperator = true; - } else { - $stack->push('Operand Count for Function ' . $valToUpper . ')', 1, null, $currentCondition, $currentOnlyIf, $currentOnlyIfNot); - $expectingOperator = false; - } - $stack->push('Brace', '('); - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/i', $val, $matches)) { - // Watch for this case-change when modifying to allow cell references in different worksheets... - // Should only be applied to the actual cell column, not the worksheet name - // If the last entry on the stack was a : operator, then we have a cell range reference - $testPrevOp = $stack->last(1); - if ($testPrevOp !== null && $testPrevOp['value'] == ':') { - // If we have a worksheet reference, then we're playing with a 3D reference - if ($matches[2] == '') { - // Otherwise, we 'inherit' the worksheet reference from the start cell reference - // The start of the cell range reference should be the last entry in $output - $rangeStartCellRef = $output[count($output) - 1]['value']; - preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/i', $rangeStartCellRef, $rangeStartMatches); - if ($rangeStartMatches[2] > '') { - $val = $rangeStartMatches[2] . '!' . $val; - } - } else { - $rangeStartCellRef = $output[count($output) - 1]['value']; - preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/i', $rangeStartCellRef, $rangeStartMatches); - if ($rangeStartMatches[2] !== $matches[2]) { - return $this->raiseFormulaError('3D Range references are not yet supported'); - } - } - } - - $outputItem = $stack->getStackItem('Cell Reference', $val, $val, $currentCondition, $currentOnlyIf, $currentOnlyIfNot); - - $output[] = $outputItem; - } else { // it's a variable, constant, string, number or boolean - // If the last entry on the stack was a : operator, then we may have a row or column range reference - $testPrevOp = $stack->last(1); - if ($testPrevOp !== null && $testPrevOp['value'] === ':') { - $startRowColRef = $output[count($output) - 1]['value']; - [$rangeWS1, $startRowColRef] = Worksheet::extractSheetTitle($startRowColRef, true); - $rangeSheetRef = $rangeWS1; - if ($rangeWS1 != '') { - $rangeWS1 .= '!'; - } - [$rangeWS2, $val] = Worksheet::extractSheetTitle($val, true); - if ($rangeWS2 != '') { - $rangeWS2 .= '!'; - } else { - $rangeWS2 = $rangeWS1; - } - $refSheet = $pCellParent; - if ($pCellParent !== null && $rangeSheetRef !== $pCellParent->getTitle()) { - $refSheet = $pCellParent->getParent()->getSheetByName($rangeSheetRef); - } - if ( - (is_int($startRowColRef)) && (ctype_digit($val)) && - ($startRowColRef <= 1048576) && ($val <= 1048576) - ) { - // Row range - $endRowColRef = ($refSheet !== null) ? $refSheet->getHighestColumn() : 'XFD'; // Max 16,384 columns for Excel2007 - $output[count($output) - 1]['value'] = $rangeWS1 . 'A' . $startRowColRef; - $val = $rangeWS2 . $endRowColRef . $val; - } elseif ( - (ctype_alpha($startRowColRef)) && (ctype_alpha($val)) && - (strlen($startRowColRef) <= 3) && (strlen($val) <= 3) - ) { - // Column range - $endRowColRef = ($refSheet !== null) ? $refSheet->getHighestRow() : 1048576; // Max 1,048,576 rows for Excel2007 - $output[count($output) - 1]['value'] = $rangeWS1 . strtoupper($startRowColRef) . '1'; - $val = $rangeWS2 . $val . $endRowColRef; - } - } - - $localeConstant = false; - $stackItemType = 'Value'; - $stackItemReference = null; - if ($opCharacter == self::FORMULA_STRING_QUOTE) { - // UnEscape any quotes within the string - $val = self::wrapResult(str_replace('""', self::FORMULA_STRING_QUOTE, self::unwrapResult($val))); - } elseif (is_numeric($val)) { - if ((strpos($val, '.') !== false) || (stripos($val, 'e') !== false) || ($val > PHP_INT_MAX) || ($val < -PHP_INT_MAX)) { - $val = (float) $val; - } else { - $val = (int) $val; - } - } elseif (isset(self::$excelConstants[trim(strtoupper($val))])) { - $stackItemType = 'Constant'; - $excelConstant = trim(strtoupper($val)); - $val = self::$excelConstants[$excelConstant]; - } elseif (($localeConstant = array_search(trim(strtoupper($val)), self::$localeBoolean)) !== false) { - $stackItemType = 'Constant'; - $val = self::$excelConstants[$localeConstant]; - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '.*/miu', $val, $match)) { - $stackItemType = 'Defined Name'; - $stackItemReference = $val; - } - $details = $stack->getStackItem($stackItemType, $val, $stackItemReference, $currentCondition, $currentOnlyIf, $currentOnlyIfNot); - if ($localeConstant) { - $details['localeValue'] = $localeConstant; - } - $output[] = $details; - } - $index += $length; - } elseif ($opCharacter == '$') { // absolute row or column range - ++$index; - } elseif ($opCharacter == ')') { // miscellaneous error checking - if ($expectingOperand) { - $output[] = ['type' => 'NULL Value', 'value' => self::$excelConstants['NULL'], 'reference' => null]; - $expectingOperand = false; - $expectingOperator = true; - } else { - return $this->raiseFormulaError("Formula Error: Unexpected ')'"); - } - } elseif (isset(self::$operators[$opCharacter]) && !$expectingOperator) { - return $this->raiseFormulaError("Formula Error: Unexpected operator '$opCharacter'"); - } else { // I don't even want to know what you did to get here - return $this->raiseFormulaError('Formula Error: An unexpected error occurred'); - } - // Test for end of formula string - if ($index == strlen($formula)) { - // Did we end with an operator?. - // Only valid for the % unary operator - if ((isset(self::$operators[$opCharacter])) && ($opCharacter != '%')) { - return $this->raiseFormulaError("Formula Error: Operator '$opCharacter' has no operands"); - } - - break; - } - // Ignore white space - while (($formula[$index] == "\n") || ($formula[$index] == "\r")) { - ++$index; - } - - if ($formula[$index] == ' ') { - while ($formula[$index] == ' ') { - ++$index; - } - - // If we're expecting an operator, but only have a space between the previous and next operands (and both are - // Cell References) then we have an INTERSECTION operator - if ( - ($expectingOperator) && - ((preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '.*/Ui', substr($formula, $index), $match)) && - ($output[count($output) - 1]['type'] == 'Cell Reference') || - (preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '.*/miu', substr($formula, $index), $match)) && - ($output[count($output) - 1]['type'] == 'Defined Name' || $output[count($output) - 1]['type'] == 'Value') - ) - ) { - while ( - $stack->count() > 0 && - ($o2 = $stack->last()) && - isset(self::$operators[$o2['value']]) && - @(self::$operatorAssociativity[$opCharacter] ? self::$operatorPrecedence[$opCharacter] < self::$operatorPrecedence[$o2['value']] : self::$operatorPrecedence[$opCharacter] <= self::$operatorPrecedence[$o2['value']]) - ) { - $output[] = $stack->pop(); // Swap operands and higher precedence operators from the stack to the output - } - $stack->push('Binary Operator', '|'); // Put an Intersect Operator on the stack - $expectingOperator = false; - } - } - } - - while (($op = $stack->pop()) !== null) { // pop everything off the stack and push onto output - if ((is_array($op) && $op['value'] == '(') || ($op === '(')) { - return $this->raiseFormulaError("Formula Error: Expecting ')'"); // if there are any opening braces on the stack, then braces were unbalanced - } - $output[] = $op; - } - - return $output; - } - - private static function dataTestReference(&$operandData) - { - $operand = $operandData['value']; - if (($operandData['reference'] === null) && (is_array($operand))) { - $rKeys = array_keys($operand); - $rowKey = array_shift($rKeys); - $cKeys = array_keys(array_keys($operand[$rowKey])); - $colKey = array_shift($cKeys); - if (ctype_upper($colKey)) { - $operandData['reference'] = $colKey . $rowKey; - } - } - - return $operand; - } - - // evaluate postfix notation - - /** - * @param mixed $tokens - * @param null|string $cellID - * - * @return bool - */ - private function processTokenStack($tokens, $cellID = null, ?Cell $pCell = null) - { - if ($tokens == false) { - return false; - } - - // If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent cell collection), - // so we store the parent cell collection so that we can re-attach it when necessary - $pCellWorksheet = ($pCell !== null) ? $pCell->getWorksheet() : null; - $pCellParent = ($pCell !== null) ? $pCell->getParent() : null; - $stack = new Stack(); - - // Stores branches that have been pruned - $fakedForBranchPruning = []; - // help us to know when pruning ['branchTestId' => true/false] - $branchStore = []; - // Loop through each token in turn - foreach ($tokens as $tokenData) { - $token = $tokenData['value']; - - // Branch pruning: skip useless resolutions - $storeKey = $tokenData['storeKey'] ?? null; - if ($this->branchPruningEnabled && isset($tokenData['onlyIf'])) { - $onlyIfStoreKey = $tokenData['onlyIf']; - $storeValue = $branchStore[$onlyIfStoreKey] ?? null; - $storeValueAsBool = ($storeValue === null) ? - true : (bool) Functions::flattenSingleValue($storeValue); - if (is_array($storeValue)) { - $wrappedItem = end($storeValue); - $storeValue = end($wrappedItem); - } - - if ( - isset($storeValue) - && ( - !$storeValueAsBool - || Functions::isError($storeValue) - || ($storeValue === 'Pruned branch') - ) - ) { - // If branching value is not true, we don't need to compute - if (!isset($fakedForBranchPruning['onlyIf-' . $onlyIfStoreKey])) { - $stack->push('Value', 'Pruned branch (only if ' . $onlyIfStoreKey . ') ' . $token); - $fakedForBranchPruning['onlyIf-' . $onlyIfStoreKey] = true; - } - - if (isset($storeKey)) { - // We are processing an if condition - // We cascade the pruning to the depending branches - $branchStore[$storeKey] = 'Pruned branch'; - $fakedForBranchPruning['onlyIfNot-' . $storeKey] = true; - $fakedForBranchPruning['onlyIf-' . $storeKey] = true; - } - - continue; - } - } - - if ($this->branchPruningEnabled && isset($tokenData['onlyIfNot'])) { - $onlyIfNotStoreKey = $tokenData['onlyIfNot']; - $storeValue = $branchStore[$onlyIfNotStoreKey] ?? null; - $storeValueAsBool = ($storeValue === null) ? - true : (bool) Functions::flattenSingleValue($storeValue); - if (is_array($storeValue)) { - $wrappedItem = end($storeValue); - $storeValue = end($wrappedItem); - } - if ( - isset($storeValue) - && ( - $storeValueAsBool - || Functions::isError($storeValue) - || ($storeValue === 'Pruned branch')) - ) { - // If branching value is true, we don't need to compute - if (!isset($fakedForBranchPruning['onlyIfNot-' . $onlyIfNotStoreKey])) { - $stack->push('Value', 'Pruned branch (only if not ' . $onlyIfNotStoreKey . ') ' . $token); - $fakedForBranchPruning['onlyIfNot-' . $onlyIfNotStoreKey] = true; - } - - if (isset($storeKey)) { - // We are processing an if condition - // We cascade the pruning to the depending branches - $branchStore[$storeKey] = 'Pruned branch'; - $fakedForBranchPruning['onlyIfNot-' . $storeKey] = true; - $fakedForBranchPruning['onlyIf-' . $storeKey] = true; - } - - continue; - } - } - - // if the token is a binary operator, pop the top two values off the stack, do the operation, and push the result back on the stack - if (isset(self::$binaryOperators[$token])) { - // We must have two operands, error if we don't - if (($operand2Data = $stack->pop()) === null) { - return $this->raiseFormulaError('Internal error - Operand value missing from stack'); - } - if (($operand1Data = $stack->pop()) === null) { - return $this->raiseFormulaError('Internal error - Operand value missing from stack'); - } - - $operand1 = self::dataTestReference($operand1Data); - $operand2 = self::dataTestReference($operand2Data); - - // Log what we're doing - if ($token == ':') { - $this->debugLog->writeDebugLog('Evaluating Range ', $this->showValue($operand1Data['reference']), ' ', $token, ' ', $this->showValue($operand2Data['reference'])); - } else { - $this->debugLog->writeDebugLog('Evaluating ', $this->showValue($operand1), ' ', $token, ' ', $this->showValue($operand2)); - } - - // Process the operation in the appropriate manner - switch ($token) { - // Comparison (Boolean) Operators - case '>': // Greater than - case '<': // Less than - case '>=': // Greater than or Equal to - case '<=': // Less than or Equal to - case '=': // Equality - case '<>': // Inequality - $result = $this->executeBinaryComparisonOperation($cellID, $operand1, $operand2, $token, $stack); - if (isset($storeKey)) { - $branchStore[$storeKey] = $result; - } - - break; - // Binary Operators - case ':': // Range - if (strpos($operand1Data['reference'], '!') !== false) { - [$sheet1, $operand1Data['reference']] = Worksheet::extractSheetTitle($operand1Data['reference'], true); - } else { - $sheet1 = ($pCellParent !== null) ? $pCellWorksheet->getTitle() : ''; - } - - [$sheet2, $operand2Data['reference']] = Worksheet::extractSheetTitle($operand2Data['reference'], true); - if (empty($sheet2)) { - $sheet2 = $sheet1; - } - - if ($sheet1 == $sheet2) { - if ($operand1Data['reference'] === null) { - if ((trim($operand1Data['value']) != '') && (is_numeric($operand1Data['value']))) { - $operand1Data['reference'] = $pCell->getColumn() . $operand1Data['value']; - } elseif (trim($operand1Data['reference']) == '') { - $operand1Data['reference'] = $pCell->getCoordinate(); - } else { - $operand1Data['reference'] = $operand1Data['value'] . $pCell->getRow(); - } - } - if ($operand2Data['reference'] === null) { - if ((trim($operand2Data['value']) != '') && (is_numeric($operand2Data['value']))) { - $operand2Data['reference'] = $pCell->getColumn() . $operand2Data['value']; - } elseif (trim($operand2Data['reference']) == '') { - $operand2Data['reference'] = $pCell->getCoordinate(); - } else { - $operand2Data['reference'] = $operand2Data['value'] . $pCell->getRow(); - } - } - - $oData = array_merge(explode(':', $operand1Data['reference']), explode(':', $operand2Data['reference'])); - $oCol = $oRow = []; - foreach ($oData as $oDatum) { - $oCR = Coordinate::coordinateFromString($oDatum); - $oCol[] = Coordinate::columnIndexFromString($oCR[0]) - 1; - $oRow[] = $oCR[1]; - } - $cellRef = Coordinate::stringFromColumnIndex(min($oCol) + 1) . min($oRow) . ':' . Coordinate::stringFromColumnIndex(max($oCol) + 1) . max($oRow); - if ($pCellParent !== null) { - $cellValue = $this->extractCellRange($cellRef, $this->spreadsheet->getSheetByName($sheet1), false); - } else { - return $this->raiseFormulaError('Unable to access Cell Reference'); - } - $stack->push('Cell Reference', $cellValue, $cellRef); - } else { - $stack->push('Error', Functions::REF(), null); - } - - break; - case '+': // Addition - $result = $this->executeNumericBinaryOperation($operand1, $operand2, $token, 'plusEquals', $stack); - if (isset($storeKey)) { - $branchStore[$storeKey] = $result; - } - - break; - case '-': // Subtraction - $result = $this->executeNumericBinaryOperation($operand1, $operand2, $token, 'minusEquals', $stack); - if (isset($storeKey)) { - $branchStore[$storeKey] = $result; - } - - break; - case '*': // Multiplication - $result = $this->executeNumericBinaryOperation($operand1, $operand2, $token, 'arrayTimesEquals', $stack); - if (isset($storeKey)) { - $branchStore[$storeKey] = $result; - } - - break; - case '/': // Division - $result = $this->executeNumericBinaryOperation($operand1, $operand2, $token, 'arrayRightDivide', $stack); - if (isset($storeKey)) { - $branchStore[$storeKey] = $result; - } - - break; - case '^': // Exponential - $result = $this->executeNumericBinaryOperation($operand1, $operand2, $token, 'power', $stack); - if (isset($storeKey)) { - $branchStore[$storeKey] = $result; - } - - break; - case '&': // Concatenation - // If either of the operands is a matrix, we need to treat them both as matrices - // (converting the other operand to a matrix if need be); then perform the required - // matrix operation - if (is_bool($operand1)) { - $operand1 = ($operand1) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE']; - } - if (is_bool($operand2)) { - $operand2 = ($operand2) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE']; - } - if ((is_array($operand1)) || (is_array($operand2))) { - // Ensure that both operands are arrays/matrices - self::checkMatrixOperands($operand1, $operand2, 2); - - try { - // Convert operand 1 from a PHP array to a matrix - $matrix = new Shared\JAMA\Matrix($operand1); - // Perform the required operation against the operand 1 matrix, passing in operand 2 - $matrixResult = $matrix->concat($operand2); - $result = $matrixResult->getArray(); - } catch (\Exception $ex) { - $this->debugLog->writeDebugLog('JAMA Matrix Exception: ', $ex->getMessage()); - $result = '#VALUE!'; - } - } else { - $result = self::FORMULA_STRING_QUOTE . str_replace('""', self::FORMULA_STRING_QUOTE, self::unwrapResult($operand1) . self::unwrapResult($operand2)) . self::FORMULA_STRING_QUOTE; - } - $this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result)); - $stack->push('Value', $result); - - if (isset($storeKey)) { - $branchStore[$storeKey] = $result; - } - - break; - case '|': // Intersect - $rowIntersect = array_intersect_key($operand1, $operand2); - $cellIntersect = $oCol = $oRow = []; - foreach (array_keys($rowIntersect) as $row) { - $oRow[] = $row; - foreach ($rowIntersect[$row] as $col => $data) { - $oCol[] = Coordinate::columnIndexFromString($col) - 1; - $cellIntersect[$row] = array_intersect_key($operand1[$row], $operand2[$row]); - } - } - if (count(Functions::flattenArray($cellIntersect)) === 0) { - $this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($cellIntersect)); - $stack->push('Error', Functions::null(), null); - } else { - $cellRef = Coordinate::stringFromColumnIndex(min($oCol) + 1) . min($oRow) . ':' . - Coordinate::stringFromColumnIndex(max($oCol) + 1) . max($oRow); - $this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($cellIntersect)); - $stack->push('Value', $cellIntersect, $cellRef); - } - - break; - } - - // if the token is a unary operator, pop one value off the stack, do the operation, and push it back on - } elseif (($token === '~') || ($token === '%')) { - if (($arg = $stack->pop()) === null) { - return $this->raiseFormulaError('Internal error - Operand value missing from stack'); - } - $arg = $arg['value']; - if ($token === '~') { - $this->debugLog->writeDebugLog('Evaluating Negation of ', $this->showValue($arg)); - $multiplier = -1; - } else { - $this->debugLog->writeDebugLog('Evaluating Percentile of ', $this->showValue($arg)); - $multiplier = 0.01; - } - if (is_array($arg)) { - self::checkMatrixOperands($arg, $multiplier, 2); - - try { - $matrix1 = new Shared\JAMA\Matrix($arg); - $matrixResult = $matrix1->arrayTimesEquals($multiplier); - $result = $matrixResult->getArray(); - } catch (\Exception $ex) { - $this->debugLog->writeDebugLog('JAMA Matrix Exception: ', $ex->getMessage()); - $result = '#VALUE!'; - } - $this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result)); - $stack->push('Value', $result); - if (isset($storeKey)) { - $branchStore[$storeKey] = $result; - } - } else { - $this->executeNumericBinaryOperation($multiplier, $arg, '*', 'arrayTimesEquals', $stack); - } - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/i', $token, $matches)) { - $cellRef = null; - if (isset($matches[8])) { - if ($pCell === null) { - // We can't access the range, so return a REF error - $cellValue = Functions::REF(); - } else { - $cellRef = $matches[6] . $matches[7] . ':' . $matches[9] . $matches[10]; - if ($matches[2] > '') { - $matches[2] = trim($matches[2], "\"'"); - if ((strpos($matches[2], '[') !== false) || (strpos($matches[2], ']') !== false)) { - // It's a Reference to an external spreadsheet (not currently supported) - return $this->raiseFormulaError('Unable to access External Workbook'); - } - $matches[2] = trim($matches[2], "\"'"); - $this->debugLog->writeDebugLog('Evaluating Cell Range ', $cellRef, ' in worksheet ', $matches[2]); - if ($pCellParent !== null) { - $cellValue = $this->extractCellRange($cellRef, $this->spreadsheet->getSheetByName($matches[2]), false); - } else { - return $this->raiseFormulaError('Unable to access Cell Reference'); - } - $this->debugLog->writeDebugLog('Evaluation Result for cells ', $cellRef, ' in worksheet ', $matches[2], ' is ', $this->showTypeDetails($cellValue)); - } else { - $this->debugLog->writeDebugLog('Evaluating Cell Range ', $cellRef, ' in current worksheet'); - if ($pCellParent !== null) { - $cellValue = $this->extractCellRange($cellRef, $pCellWorksheet, false); - } else { - return $this->raiseFormulaError('Unable to access Cell Reference'); - } - $this->debugLog->writeDebugLog('Evaluation Result for cells ', $cellRef, ' is ', $this->showTypeDetails($cellValue)); - } - } - } else { - if ($pCell === null) { - // We can't access the cell, so return a REF error - $cellValue = Functions::REF(); - } else { - $cellRef = $matches[6] . $matches[7]; - if ($matches[2] > '') { - $matches[2] = trim($matches[2], "\"'"); - if ((strpos($matches[2], '[') !== false) || (strpos($matches[2], ']') !== false)) { - // It's a Reference to an external spreadsheet (not currently supported) - return $this->raiseFormulaError('Unable to access External Workbook'); - } - $this->debugLog->writeDebugLog('Evaluating Cell ', $cellRef, ' in worksheet ', $matches[2]); - if ($pCellParent !== null) { - $cellSheet = $this->spreadsheet->getSheetByName($matches[2]); - if ($cellSheet && $cellSheet->cellExists($cellRef)) { - $cellValue = $this->extractCellRange($cellRef, $this->spreadsheet->getSheetByName($matches[2]), false); - $pCell->attach($pCellParent); - } else { - $cellValue = null; - } - } else { - return $this->raiseFormulaError('Unable to access Cell Reference'); - } - $this->debugLog->writeDebugLog('Evaluation Result for cell ', $cellRef, ' in worksheet ', $matches[2], ' is ', $this->showTypeDetails($cellValue)); - } else { - $this->debugLog->writeDebugLog('Evaluating Cell ', $cellRef, ' in current worksheet'); - if ($pCellParent->has($cellRef)) { - $cellValue = $this->extractCellRange($cellRef, $pCellWorksheet, false); - $pCell->attach($pCellParent); - } else { - $cellValue = null; - } - $this->debugLog->writeDebugLog('Evaluation Result for cell ', $cellRef, ' is ', $this->showTypeDetails($cellValue)); - } - } - } - $stack->push('Value', $cellValue, $cellRef); - if (isset($storeKey)) { - $branchStore[$storeKey] = $cellValue; - } - - // if the token is a function, pop arguments off the stack, hand them to the function, and push the result back on - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_FUNCTION . '$/miu', $token, $matches)) { - if ($pCellParent) { - $pCell->attach($pCellParent); - } - - $functionName = $matches[1]; - $argCount = $stack->pop(); - $argCount = $argCount['value']; - if ($functionName != 'MKMATRIX') { - $this->debugLog->writeDebugLog('Evaluating Function ', self::localeFunc($functionName), '() with ', (($argCount == 0) ? 'no' : $argCount), ' argument', (($argCount == 1) ? '' : 's')); - } - if ((isset(self::$phpSpreadsheetFunctions[$functionName])) || (isset(self::$controlFunctions[$functionName]))) { // function - if (isset(self::$phpSpreadsheetFunctions[$functionName])) { - $functionCall = self::$phpSpreadsheetFunctions[$functionName]['functionCall']; - $passByReference = isset(self::$phpSpreadsheetFunctions[$functionName]['passByReference']); - $passCellReference = isset(self::$phpSpreadsheetFunctions[$functionName]['passCellReference']); - } elseif (isset(self::$controlFunctions[$functionName])) { - $functionCall = self::$controlFunctions[$functionName]['functionCall']; - $passByReference = isset(self::$controlFunctions[$functionName]['passByReference']); - $passCellReference = isset(self::$controlFunctions[$functionName]['passCellReference']); - } - // get the arguments for this function - $args = $argArrayVals = []; - for ($i = 0; $i < $argCount; ++$i) { - $arg = $stack->pop(); - $a = $argCount - $i - 1; - if ( - ($passByReference) && - (isset(self::$phpSpreadsheetFunctions[$functionName]['passByReference'][$a])) && - (self::$phpSpreadsheetFunctions[$functionName]['passByReference'][$a]) - ) { - if ($arg['reference'] === null) { - $args[] = $cellID; - if ($functionName != 'MKMATRIX') { - $argArrayVals[] = $this->showValue($cellID); - } - } else { - $args[] = $arg['reference']; - if ($functionName != 'MKMATRIX') { - $argArrayVals[] = $this->showValue($arg['reference']); - } - } - } else { - $args[] = self::unwrapResult($arg['value']); - if ($functionName != 'MKMATRIX') { - $argArrayVals[] = $this->showValue($arg['value']); - } - } - } - - // Reverse the order of the arguments - krsort($args); - - if (($passByReference) && ($argCount == 0)) { - $args[] = $cellID; - $argArrayVals[] = $this->showValue($cellID); - } - - if ($functionName != 'MKMATRIX') { - if ($this->debugLog->getWriteDebugLog()) { - krsort($argArrayVals); - $this->debugLog->writeDebugLog('Evaluating ', self::localeFunc($functionName), '( ', implode(self::$localeArgumentSeparator . ' ', Functions::flattenArray($argArrayVals)), ' )'); - } - } - - // Process the argument with the appropriate function call - $args = $this->addCellReference($args, $passCellReference, $functionCall, $pCell); - - if (!is_array($functionCall)) { - foreach ($args as &$arg) { - $arg = Functions::flattenSingleValue($arg); - } - unset($arg); - } - - $result = call_user_func_array($functionCall, $args); - - if ($functionName != 'MKMATRIX') { - $this->debugLog->writeDebugLog('Evaluation Result for ', self::localeFunc($functionName), '() function call is ', $this->showTypeDetails($result)); - } - $stack->push('Value', self::wrapResult($result)); - if (isset($storeKey)) { - $branchStore[$storeKey] = $result; - } - } - } else { - // if the token is a number, boolean, string or an Excel error, push it onto the stack - if (isset(self::$excelConstants[strtoupper($token)])) { - $excelConstant = strtoupper($token); - $stack->push('Constant Value', self::$excelConstants[$excelConstant]); - if (isset($storeKey)) { - $branchStore[$storeKey] = self::$excelConstants[$excelConstant]; - } - $this->debugLog->writeDebugLog('Evaluating Constant ', $excelConstant, ' as ', $this->showTypeDetails(self::$excelConstants[$excelConstant])); - } elseif ((is_numeric($token)) || ($token === null) || (is_bool($token)) || ($token == '') || ($token[0] == self::FORMULA_STRING_QUOTE) || ($token[0] == '#')) { - $stack->push('Value', $token); - if (isset($storeKey)) { - $branchStore[$storeKey] = $token; - } - // if the token is a named range or formula, evaluate it and push the result onto the stack - } elseif (preg_match('/^' . self::CALCULATION_REGEXP_DEFINEDNAME . '$/miu', $token, $matches)) { - $definedName = $matches[6]; - if ($pCell === null || $pCellWorksheet === null) { - return $this->raiseFormulaError("undefined name '$token'"); - } - - $this->debugLog->writeDebugLog('Evaluating Defined Name ', $definedName); - $namedRange = DefinedName::resolveName($definedName, $pCellWorksheet); - if ($namedRange === null) { - return $this->raiseFormulaError("undefined name '$definedName'"); - } - - $result = $this->evaluateDefinedName($pCell, $namedRange, $pCellWorksheet, $stack); - if (isset($storeKey)) { - $branchStore[$storeKey] = $result; - } - } else { - return $this->raiseFormulaError("undefined name '$token'"); - } - } - } - // when we're out of tokens, the stack should have a single element, the final result - if ($stack->count() != 1) { - return $this->raiseFormulaError('internal error'); - } - $output = $stack->pop(); - $output = $output['value']; - - return $output; - } - - private function validateBinaryOperand(&$operand, &$stack) - { - if (is_array($operand)) { - if ((count($operand, COUNT_RECURSIVE) - count($operand)) == 1) { - do { - $operand = array_pop($operand); - } while (is_array($operand)); - } - } - // Numbers, matrices and booleans can pass straight through, as they're already valid - if (is_string($operand)) { - // We only need special validations for the operand if it is a string - // Start by stripping off the quotation marks we use to identify true excel string values internally - if ($operand > '' && $operand[0] == self::FORMULA_STRING_QUOTE) { - $operand = self::unwrapResult($operand); - } - // If the string is a numeric value, we treat it as a numeric, so no further testing - if (!is_numeric($operand)) { - // If not a numeric, test to see if the value is an Excel error, and so can't be used in normal binary operations - if ($operand > '' && $operand[0] == '#') { - $stack->push('Value', $operand); - $this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($operand)); - - return false; - } elseif (!Shared\StringHelper::convertToNumberIfFraction($operand)) { - // If not a numeric or a fraction, then it's a text string, and so can't be used in mathematical binary operations - $stack->push('Error', '#VALUE!'); - $this->debugLog->writeDebugLog('Evaluation Result is a ', $this->showTypeDetails('#VALUE!')); - - return false; - } - } - } - - // return a true if the value of the operand is one that we can use in normal binary operations - return true; - } - - /** - * @param null|string $cellID - * @param mixed $operand1 - * @param mixed $operand2 - * @param string $operation - * @param bool $recursingArrays - * - * @return mixed - */ - private function executeBinaryComparisonOperation($cellID, $operand1, $operand2, $operation, Stack &$stack, $recursingArrays = false) - { - // If we're dealing with matrix operations, we want a matrix result - if ((is_array($operand1)) || (is_array($operand2))) { - $result = []; - if ((is_array($operand1)) && (!is_array($operand2))) { - foreach ($operand1 as $x => $operandData) { - $this->debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operandData), ' ', $operation, ' ', $this->showValue($operand2)); - $this->executeBinaryComparisonOperation($cellID, $operandData, $operand2, $operation, $stack); - $r = $stack->pop(); - $result[$x] = $r['value']; - } - } elseif ((!is_array($operand1)) && (is_array($operand2))) { - foreach ($operand2 as $x => $operandData) { - $this->debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operand1), ' ', $operation, ' ', $this->showValue($operandData)); - $this->executeBinaryComparisonOperation($cellID, $operand1, $operandData, $operation, $stack); - $r = $stack->pop(); - $result[$x] = $r['value']; - } - } else { - if (!$recursingArrays) { - self::checkMatrixOperands($operand1, $operand2, 2); - } - foreach ($operand1 as $x => $operandData) { - $this->debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operandData), ' ', $operation, ' ', $this->showValue($operand2[$x])); - $this->executeBinaryComparisonOperation($cellID, $operandData, $operand2[$x], $operation, $stack, true); - $r = $stack->pop(); - $result[$x] = $r['value']; - } - } - // Log the result details - $this->debugLog->writeDebugLog('Comparison Evaluation Result is ', $this->showTypeDetails($result)); - // And push the result onto the stack - $stack->push('Array', $result); - - return $result; - } - - // Simple validate the two operands if they are string values - if (is_string($operand1) && $operand1 > '' && $operand1[0] == self::FORMULA_STRING_QUOTE) { - $operand1 = self::unwrapResult($operand1); - } - if (is_string($operand2) && $operand2 > '' && $operand2[0] == self::FORMULA_STRING_QUOTE) { - $operand2 = self::unwrapResult($operand2); - } - - // Use case insensitive comparaison if not OpenOffice mode - if (Functions::getCompatibilityMode() != Functions::COMPATIBILITY_OPENOFFICE) { - if (is_string($operand1)) { - $operand1 = strtoupper($operand1); - } - if (is_string($operand2)) { - $operand2 = strtoupper($operand2); - } - } - - $useLowercaseFirstComparison = is_string($operand1) && is_string($operand2) && Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE; - - // execute the necessary operation - switch ($operation) { - // Greater than - case '>': - if ($useLowercaseFirstComparison) { - $result = $this->strcmpLowercaseFirst($operand1, $operand2) > 0; - } else { - $result = ($operand1 > $operand2); - } - - break; - // Less than - case '<': - if ($useLowercaseFirstComparison) { - $result = $this->strcmpLowercaseFirst($operand1, $operand2) < 0; - } else { - $result = ($operand1 < $operand2); - } - - break; - // Equality - case '=': - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = (abs($operand1 - $operand2) < $this->delta); - } else { - $result = strcmp($operand1, $operand2) == 0; - } - - break; - // Greater than or equal - case '>=': - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = ((abs($operand1 - $operand2) < $this->delta) || ($operand1 > $operand2)); - } elseif ($useLowercaseFirstComparison) { - $result = $this->strcmpLowercaseFirst($operand1, $operand2) >= 0; - } else { - $result = strcmp($operand1, $operand2) >= 0; - } - - break; - // Less than or equal - case '<=': - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = ((abs($operand1 - $operand2) < $this->delta) || ($operand1 < $operand2)); - } elseif ($useLowercaseFirstComparison) { - $result = $this->strcmpLowercaseFirst($operand1, $operand2) <= 0; - } else { - $result = strcmp($operand1, $operand2) <= 0; - } - - break; - // Inequality - case '<>': - if (is_numeric($operand1) && is_numeric($operand2)) { - $result = (abs($operand1 - $operand2) > 1E-14); - } else { - $result = strcmp($operand1, $operand2) != 0; - } - - break; - } - - // Log the result details - $this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result)); - // And push the result onto the stack - $stack->push('Value', $result); - - return $result; - } - - /** - * Compare two strings in the same way as strcmp() except that lowercase come before uppercase letters. - * - * @param string $str1 First string value for the comparison - * @param string $str2 Second string value for the comparison - * - * @return int - */ - private function strcmpLowercaseFirst($str1, $str2) - { - $inversedStr1 = Shared\StringHelper::strCaseReverse($str1); - $inversedStr2 = Shared\StringHelper::strCaseReverse($str2); - - return strcmp($inversedStr1, $inversedStr2); - } - - /** - * @param mixed $operand1 - * @param mixed $operand2 - * @param mixed $operation - * @param string $matrixFunction - * @param mixed $stack - * - * @return bool|mixed - */ - private function executeNumericBinaryOperation($operand1, $operand2, $operation, $matrixFunction, &$stack) - { - // Validate the two operands - if (!$this->validateBinaryOperand($operand1, $stack)) { - return false; - } - if (!$this->validateBinaryOperand($operand2, $stack)) { - return false; - } - - // If either of the operands is a matrix, we need to treat them both as matrices - // (converting the other operand to a matrix if need be); then perform the required - // matrix operation - if ((is_array($operand1)) || (is_array($operand2))) { - // Ensure that both operands are arrays/matrices of the same size - self::checkMatrixOperands($operand1, $operand2, 2); - - try { - // Convert operand 1 from a PHP array to a matrix - $matrix = new Shared\JAMA\Matrix($operand1); - // Perform the required operation against the operand 1 matrix, passing in operand 2 - $matrixResult = $matrix->$matrixFunction($operand2); - $result = $matrixResult->getArray(); - } catch (\Exception $ex) { - $this->debugLog->writeDebugLog('JAMA Matrix Exception: ', $ex->getMessage()); - $result = '#VALUE!'; - } - } else { - if ( - (Functions::getCompatibilityMode() != Functions::COMPATIBILITY_OPENOFFICE) && - ((is_string($operand1) && !is_numeric($operand1) && strlen($operand1) > 0) || - (is_string($operand2) && !is_numeric($operand2) && strlen($operand2) > 0)) - ) { - $result = Functions::VALUE(); - } else { - // If we're dealing with non-matrix operations, execute the necessary operation - switch ($operation) { - // Addition - case '+': - $result = $operand1 + $operand2; - - break; - // Subtraction - case '-': - $result = $operand1 - $operand2; - - break; - // Multiplication - case '*': - $result = $operand1 * $operand2; - - break; - // Division - case '/': - if ($operand2 == 0) { - // Trap for Divide by Zero error - $stack->push('Error', '#DIV/0!'); - $this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails('#DIV/0!')); - - return false; - } - $result = $operand1 / $operand2; - - break; - // Power - case '^': - $result = $operand1 ** $operand2; - - break; - } - } - } - - // Log the result details - $this->debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result)); - // And push the result onto the stack - $stack->push('Value', $result); - - return $result; - } - - // trigger an error, but nicely, if need be - protected function raiseFormulaError($errorMessage) - { - $this->formulaError = $errorMessage; - $this->cyclicReferenceStack->clear(); - if (!$this->suppressFormulaErrors) { - throw new Exception($errorMessage); - } - trigger_error($errorMessage, E_USER_ERROR); - - return false; - } - - /** - * Extract range values. - * - * @param string &$pRange String based range representation - * @param Worksheet $pSheet Worksheet - * @param bool $resetLog Flag indicating whether calculation log should be reset or not - * - * @return mixed Array of values in range if range contains more than one element. Otherwise, a single value is returned. - */ - public function extractCellRange(&$pRange = 'A1', ?Worksheet $pSheet = null, $resetLog = true) - { - // Return value - $returnValue = []; - - if ($pSheet !== null) { - $pSheetName = $pSheet->getTitle(); - if (strpos($pRange, '!') !== false) { - [$pSheetName, $pRange] = Worksheet::extractSheetTitle($pRange, true); - $pSheet = $this->spreadsheet->getSheetByName($pSheetName); - } - - // Extract range - $aReferences = Coordinate::extractAllCellReferencesInRange($pRange); - $pRange = $pSheetName . '!' . $pRange; - if (!isset($aReferences[1])) { - $currentCol = ''; - $currentRow = 0; - // Single cell in range - sscanf($aReferences[0], '%[A-Z]%d', $currentCol, $currentRow); - if ($pSheet->cellExists($aReferences[0])) { - $returnValue[$currentRow][$currentCol] = $pSheet->getCell($aReferences[0])->getCalculatedValue($resetLog); - } else { - $returnValue[$currentRow][$currentCol] = null; - } - } else { - // Extract cell data for all cells in the range - foreach ($aReferences as $reference) { - $currentCol = ''; - $currentRow = 0; - // Extract range - sscanf($reference, '%[A-Z]%d', $currentCol, $currentRow); - if ($pSheet->cellExists($reference)) { - $returnValue[$currentRow][$currentCol] = $pSheet->getCell($reference)->getCalculatedValue($resetLog); - } else { - $returnValue[$currentRow][$currentCol] = null; - } - } - } - } - - return $returnValue; - } - - /** - * Extract range values. - * - * @param string &$pRange String based range representation - * @param Worksheet $pSheet Worksheet - * @param bool $resetLog Flag indicating whether calculation log should be reset or not - * - * @return mixed Array of values in range if range contains more than one element. Otherwise, a single value is returned. - */ - public function extractNamedRange(&$pRange = 'A1', ?Worksheet $pSheet = null, $resetLog = true) - { - // Return value - $returnValue = []; - - if ($pSheet !== null) { - $pSheetName = $pSheet->getTitle(); - if (strpos($pRange, '!') !== false) { - [$pSheetName, $pRange] = Worksheet::extractSheetTitle($pRange, true); - $pSheet = $this->spreadsheet->getSheetByName($pSheetName); - } - - // Named range? - $namedRange = DefinedName::resolveName($pRange, $pSheet); - if ($namedRange === null) { - return Functions::REF(); - } - - $pSheet = $namedRange->getWorksheet(); - $pRange = $namedRange->getValue(); - $splitRange = Coordinate::splitRange($pRange); - // Convert row and column references - if (ctype_alpha($splitRange[0][0])) { - $pRange = $splitRange[0][0] . '1:' . $splitRange[0][1] . $namedRange->getWorksheet()->getHighestRow(); - } elseif (ctype_digit($splitRange[0][0])) { - $pRange = 'A' . $splitRange[0][0] . ':' . $namedRange->getWorksheet()->getHighestColumn() . $splitRange[0][1]; - } - - // Extract range - $aReferences = Coordinate::extractAllCellReferencesInRange($pRange); - if (!isset($aReferences[1])) { - // Single cell (or single column or row) in range - [$currentCol, $currentRow] = Coordinate::coordinateFromString($aReferences[0]); - if ($pSheet->cellExists($aReferences[0])) { - $returnValue[$currentRow][$currentCol] = $pSheet->getCell($aReferences[0])->getCalculatedValue($resetLog); - } else { - $returnValue[$currentRow][$currentCol] = null; - } - } else { - // Extract cell data for all cells in the range - foreach ($aReferences as $reference) { - // Extract range - [$currentCol, $currentRow] = Coordinate::coordinateFromString($reference); - if ($pSheet->cellExists($reference)) { - $returnValue[$currentRow][$currentCol] = $pSheet->getCell($reference)->getCalculatedValue($resetLog); - } else { - $returnValue[$currentRow][$currentCol] = null; - } - } - } - } - - return $returnValue; - } - - /** - * Is a specific function implemented? - * - * @param string $pFunction Function Name - * - * @return bool - */ - public function isImplemented($pFunction) - { - $pFunction = strtoupper($pFunction); - $notImplemented = !isset(self::$phpSpreadsheetFunctions[$pFunction]) || (is_array(self::$phpSpreadsheetFunctions[$pFunction]['functionCall']) && self::$phpSpreadsheetFunctions[$pFunction]['functionCall'][1] === 'DUMMY'); - - return !$notImplemented; - } - - /** - * Get a list of all implemented functions as an array of function objects. - * - * @return array of Category - */ - public function getFunctions() - { - return self::$phpSpreadsheetFunctions; - } - - /** - * Get a list of implemented Excel function names. - * - * @return array - */ - public function getImplementedFunctionNames() - { - $returnValue = []; - foreach (self::$phpSpreadsheetFunctions as $functionName => $function) { - if ($this->isImplemented($functionName)) { - $returnValue[] = $functionName; - } - } - - return $returnValue; - } - - /** - * Add cell reference if needed while making sure that it is the last argument. - * - * @param bool $passCellReference - * @param array|string $functionCall - * - * @return array - */ - private function addCellReference(array $args, $passCellReference, $functionCall, ?Cell $pCell = null) - { - if ($passCellReference) { - if (is_array($functionCall)) { - $className = $functionCall[0]; - $methodName = $functionCall[1]; - - $reflectionMethod = new ReflectionMethod($className, $methodName); - $argumentCount = count($reflectionMethod->getParameters()); - while (count($args) < $argumentCount - 1) { - $args[] = null; - } - } - - $args[] = $pCell; - } - - return $args; - } - - private function getUnusedBranchStoreKey() - { - $storeKeyValue = 'storeKey-' . $this->branchStoreKeyCounter; - ++$this->branchStoreKeyCounter; - - return $storeKeyValue; - } - - private function getTokensAsString($tokens) - { - $tokensStr = array_map(function ($token) { - $value = $token['value'] ?? 'no value'; - while (is_array($value)) { - $value = array_pop($value); - } - - return $value; - }, $tokens); - - return '[ ' . implode(' | ', $tokensStr) . ' ]'; - } - - /** - * @return mixed|string - */ - private function evaluateDefinedName(Cell $pCell, DefinedName $namedRange, Worksheet $pCellWorksheet, Stack $stack) - { - $definedNameScope = $namedRange->getScope(); - if ($definedNameScope !== null && $definedNameScope !== $pCellWorksheet) { - // The defined name isn't in our current scope, so #REF - $result = Functions::REF(); - $stack->push('Error', $result, $namedRange->getName()); - - return $result; - } - - $definedNameValue = $namedRange->getValue(); - $definedNameType = $namedRange->isFormula() ? 'Formula' : 'Range'; - $definedNameWorksheet = $namedRange->getWorksheet(); - - if ($definedNameValue[0] !== '=') { - $definedNameValue = '=' . $definedNameValue; - } - - $this->debugLog->writeDebugLog("Defined Name is a {$definedNameType} with a value of {$definedNameValue}"); - - $recursiveCalculationCell = ($definedNameWorksheet !== null && $definedNameWorksheet !== $pCellWorksheet) - ? $definedNameWorksheet->getCell('A1') - : $pCell; - $recursiveCalculationCellAddress = $recursiveCalculationCell !== null - ? $recursiveCalculationCell->getCoordinate() - : null; - - // Adjust relative references in ranges and formulae so that we execute the calculation for the correct rows and columns - $definedNameValue = self::$referenceHelper->updateFormulaReferencesAnyWorksheet( - $definedNameValue, - Coordinate::columnIndexFromString($pCell->getColumn()) - 1, - $pCell->getRow() - 1 - ); - - $this->debugLog->writeDebugLog("Value adjusted for relative references is {$definedNameValue}"); - - $recursiveCalculator = new self($this->spreadsheet); - $recursiveCalculator->getDebugLog()->setWriteDebugLog($this->getDebugLog()->getWriteDebugLog()); - $recursiveCalculator->getDebugLog()->setEchoDebugLog($this->getDebugLog()->getEchoDebugLog()); - $result = $recursiveCalculator->_calculateFormulaValue($definedNameValue, $recursiveCalculationCellAddress, $recursiveCalculationCell); - - if ($this->getDebugLog()->getWriteDebugLog()) { - $this->debugLog->mergeDebugLog(array_slice($recursiveCalculator->getDebugLog()->getLog(), 3)); - $this->debugLog->writeDebugLog("Evaluation Result for Named {$definedNameType} {$namedRange->getName()} is {$this->showTypeDetails($result)}"); - } - - $stack->push('Defined Name', $result, $namedRange->getName()); - - return $result; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Category.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Category.php deleted file mode 100644 index 96bb72a..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Category.php +++ /dev/null @@ -1,20 +0,0 @@ - $criteriaName) { - $testCondition = []; - $testConditionCount = 0; - foreach ($criteria as $row => $criterion) { - if ($criterion[$key] > '') { - $testCondition[] = '[:' . $criteriaName . ']' . Functions::ifCondition($criterion[$key]); - ++$testConditionCount; - } - } - if ($testConditionCount > 1) { - $testConditions[] = 'OR(' . implode(',', $testCondition) . ')'; - ++$testConditionsCount; - } elseif ($testConditionCount == 1) { - $testConditions[] = $testCondition[0]; - ++$testConditionsCount; - } - } - - if ($testConditionsCount > 1) { - $testConditionSet = 'AND(' . implode(',', $testConditions) . ')'; - } elseif ($testConditionsCount == 1) { - $testConditionSet = $testConditions[0]; - } - - // Loop through each row of the database - foreach ($database as $dataRow => $dataValues) { - // Substitute actual values from the database row for our [:placeholders] - $testConditionList = $testConditionSet; - foreach ($criteriaNames as $key => $criteriaName) { - $k = array_search($criteriaName, $fieldNames); - if (isset($dataValues[$k])) { - $dataValue = $dataValues[$k]; - $dataValue = (is_string($dataValue)) ? Calculation::wrapResult(strtoupper($dataValue)) : $dataValue; - $testConditionList = str_replace('[:' . $criteriaName . ']', $dataValue, $testConditionList); - } - } - // evaluate the criteria against the row data - $result = Calculation::getInstance()->_calculateFormulaValue('=' . $testConditionList); - // If the row failed to meet the criteria, remove it from the database - if (!$result) { - unset($database[$dataRow]); - } - } - - return $database; - } - - private static function getFilteredColumn($database, $field, $criteria) - { - // reduce the database to a set of rows that match all the criteria - $database = self::filter($database, $criteria); - // extract an array of values for the requested column - $colData = []; - foreach ($database as $row) { - $colData[] = $row[$field]; - } - - return $colData; - } - - /** - * DAVERAGE. - * - * Averages the values in a column of a list or database that match conditions you specify. - * - * Excel Function: - * DAVERAGE(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return float|string - */ - public static function DAVERAGE($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - return Statistical::AVERAGE( - self::getFilteredColumn($database, $field, $criteria) - ); - } - - /** - * DCOUNT. - * - * Counts the cells that contain numbers in a column of a list or database that match conditions - * that you specify. - * - * Excel Function: - * DCOUNT(database,[field],criteria) - * - * Excel Function: - * DAVERAGE(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return int - * - * @TODO The field argument is optional. If field is omitted, DCOUNT counts all records in the - * database that match the criteria. - */ - public static function DCOUNT($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - return Statistical::COUNT( - self::getFilteredColumn($database, $field, $criteria) - ); - } - - /** - * DCOUNTA. - * - * Counts the nonblank cells in a column of a list or database that match conditions that you specify. - * - * Excel Function: - * DCOUNTA(database,[field],criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return int - * - * @TODO The field argument is optional. If field is omitted, DCOUNTA counts all records in the - * database that match the criteria. - */ - public static function DCOUNTA($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // reduce the database to a set of rows that match all the criteria - $database = self::filter($database, $criteria); - // extract an array of values for the requested column - $colData = []; - foreach ($database as $row) { - $colData[] = $row[$field]; - } - - // Return - return Statistical::COUNTA( - self::getFilteredColumn($database, $field, $criteria) - ); - } - - /** - * DGET. - * - * Extracts a single value from a column of a list or database that matches conditions that you - * specify. - * - * Excel Function: - * DGET(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return mixed - */ - public static function DGET($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - $colData = self::getFilteredColumn($database, $field, $criteria); - if (count($colData) > 1) { - return Functions::NAN(); - } - - return $colData[0]; - } - - /** - * DMAX. - * - * Returns the largest number in a column of a list or database that matches conditions you that - * specify. - * - * Excel Function: - * DMAX(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return float - */ - public static function DMAX($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - return Statistical::MAX( - self::getFilteredColumn($database, $field, $criteria) - ); - } - - /** - * DMIN. - * - * Returns the smallest number in a column of a list or database that matches conditions you that - * specify. - * - * Excel Function: - * DMIN(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return float - */ - public static function DMIN($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - return Statistical::MIN( - self::getFilteredColumn($database, $field, $criteria) - ); - } - - /** - * DPRODUCT. - * - * Multiplies the values in a column of a list or database that match conditions that you specify. - * - * Excel Function: - * DPRODUCT(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return float - */ - public static function DPRODUCT($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - return MathTrig::PRODUCT( - self::getFilteredColumn($database, $field, $criteria) - ); - } - - /** - * DSTDEV. - * - * Estimates the standard deviation of a population based on a sample by using the numbers in a - * column of a list or database that match conditions that you specify. - * - * Excel Function: - * DSTDEV(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return float|string - */ - public static function DSTDEV($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - return Statistical::STDEV( - self::getFilteredColumn($database, $field, $criteria) - ); - } - - /** - * DSTDEVP. - * - * Calculates the standard deviation of a population based on the entire population by using the - * numbers in a column of a list or database that match conditions that you specify. - * - * Excel Function: - * DSTDEVP(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return float|string - */ - public static function DSTDEVP($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - return Statistical::STDEVP( - self::getFilteredColumn($database, $field, $criteria) - ); - } - - /** - * DSUM. - * - * Adds the numbers in a column of a list or database that match conditions that you specify. - * - * Excel Function: - * DSUM(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return float - */ - public static function DSUM($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - return MathTrig::SUM( - self::getFilteredColumn($database, $field, $criteria) - ); - } - - /** - * DVAR. - * - * Estimates the variance of a population based on a sample by using the numbers in a column - * of a list or database that match conditions that you specify. - * - * Excel Function: - * DVAR(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return float|string (string if result is an error) - */ - public static function DVAR($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - return Statistical::VARFunc( - self::getFilteredColumn($database, $field, $criteria) - ); - } - - /** - * DVARP. - * - * Calculates the variance of a population based on the entire population by using the numbers - * in a column of a list or database that match conditions that you specify. - * - * Excel Function: - * DVARP(database,field,criteria) - * - * @param mixed[] $database The range of cells that makes up the list or database. - * A database is a list of related data in which rows of related - * information are records, and columns of data are fields. The - * first row of the list contains labels for each column. - * @param int|string $field Indicates which column is used in the function. Enter the - * column label enclosed between double quotation marks, such as - * "Age" or "Yield," or a number (without quotation marks) that - * represents the position of the column within the list: 1 for - * the first column, 2 for the second column, and so on. - * @param mixed[] $criteria The range of cells that contains the conditions you specify. - * You can use any range for the criteria argument, as long as it - * includes at least one column label and at least one cell below - * the column label in which you specify a condition for the - * column. - * - * @return float|string (string if result is an error) - */ - public static function DVARP($database, $field, $criteria) - { - $field = self::fieldExtract($database, $field); - if ($field === null) { - return null; - } - - // Return - return Statistical::VARP( - self::getFilteredColumn($database, $field, $criteria) - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php deleted file mode 100644 index 4c2b108..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php +++ /dev/null @@ -1,1651 +0,0 @@ -format('m'); - $oYear = (int) $PHPDateObject->format('Y'); - - $adjustmentMonthsString = (string) $adjustmentMonths; - if ($adjustmentMonths > 0) { - $adjustmentMonthsString = '+' . $adjustmentMonths; - } - if ($adjustmentMonths != 0) { - $PHPDateObject->modify($adjustmentMonthsString . ' months'); - } - $nMonth = (int) $PHPDateObject->format('m'); - $nYear = (int) $PHPDateObject->format('Y'); - - $monthDiff = ($nMonth - $oMonth) + (($nYear - $oYear) * 12); - if ($monthDiff != $adjustmentMonths) { - $adjustDays = (int) $PHPDateObject->format('d'); - $adjustDaysString = '-' . $adjustDays . ' days'; - $PHPDateObject->modify($adjustDaysString); - } - - return $PHPDateObject; - } - - /** - * DATETIMENOW. - * - * Returns the current date and time. - * The NOW function is useful when you need to display the current date and time on a worksheet or - * calculate a value based on the current date and time, and have that value updated each time you - * open the worksheet. - * - * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date - * and time format of your regional settings. PhpSpreadsheet does not change cell formatting in this way. - * - * Excel Function: - * NOW() - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function DATETIMENOW() - { - $saveTimeZone = date_default_timezone_get(); - date_default_timezone_set('UTC'); - $retValue = false; - switch (Functions::getReturnDateType()) { - case Functions::RETURNDATE_EXCEL: - $retValue = (float) Date::PHPToExcel(time()); - - break; - case Functions::RETURNDATE_UNIX_TIMESTAMP: - $retValue = (int) time(); - - break; - case Functions::RETURNDATE_PHP_DATETIME_OBJECT: - $retValue = new \DateTime(); - - break; - } - date_default_timezone_set($saveTimeZone); - - return $retValue; - } - - /** - * DATENOW. - * - * Returns the current date. - * The NOW function is useful when you need to display the current date and time on a worksheet or - * calculate a value based on the current date and time, and have that value updated each time you - * open the worksheet. - * - * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date - * and time format of your regional settings. PhpSpreadsheet does not change cell formatting in this way. - * - * Excel Function: - * TODAY() - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function DATENOW() - { - $saveTimeZone = date_default_timezone_get(); - date_default_timezone_set('UTC'); - $retValue = false; - $excelDateTime = floor(Date::PHPToExcel(time())); - switch (Functions::getReturnDateType()) { - case Functions::RETURNDATE_EXCEL: - $retValue = (float) $excelDateTime; - - break; - case Functions::RETURNDATE_UNIX_TIMESTAMP: - $retValue = (int) Date::excelToTimestamp($excelDateTime); - - break; - case Functions::RETURNDATE_PHP_DATETIME_OBJECT: - $retValue = Date::excelToDateTimeObject($excelDateTime); - - break; - } - date_default_timezone_set($saveTimeZone); - - return $retValue; - } - - /** - * DATE. - * - * The DATE function returns a value that represents a particular date. - * - * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date - * format of your regional settings. PhpSpreadsheet does not change cell formatting in this way. - * - * Excel Function: - * DATE(year,month,day) - * - * PhpSpreadsheet is a lot more forgiving than MS Excel when passing non numeric values to this function. - * A Month name or abbreviation (English only at this point) such as 'January' or 'Jan' will still be accepted, - * as will a day value with a suffix (e.g. '21st' rather than simply 21); again only English language. - * - * @param int $year The value of the year argument can include one to four digits. - * Excel interprets the year argument according to the configured - * date system: 1900 or 1904. - * If year is between 0 (zero) and 1899 (inclusive), Excel adds that - * value to 1900 to calculate the year. For example, DATE(108,1,2) - * returns January 2, 2008 (1900+108). - * If year is between 1900 and 9999 (inclusive), Excel uses that - * value as the year. For example, DATE(2008,1,2) returns January 2, - * 2008. - * If year is less than 0 or is 10000 or greater, Excel returns the - * #NUM! error value. - * @param int $month A positive or negative integer representing the month of the year - * from 1 to 12 (January to December). - * If month is greater than 12, month adds that number of months to - * the first month in the year specified. For example, DATE(2008,14,2) - * returns the serial number representing February 2, 2009. - * If month is less than 1, month subtracts the magnitude of that - * number of months, plus 1, from the first month in the year - * specified. For example, DATE(2008,-3,2) returns the serial number - * representing September 2, 2007. - * @param int $day A positive or negative integer representing the day of the month - * from 1 to 31. - * If day is greater than the number of days in the month specified, - * day adds that number of days to the first day in the month. For - * example, DATE(2008,1,35) returns the serial number representing - * February 4, 2008. - * If day is less than 1, day subtracts the magnitude that number of - * days, plus one, from the first day of the month specified. For - * example, DATE(2008,1,-15) returns the serial number representing - * December 16, 2007. - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function DATE($year = 0, $month = 1, $day = 1) - { - $year = Functions::flattenSingleValue($year); - $month = Functions::flattenSingleValue($month); - $day = Functions::flattenSingleValue($day); - - if (($month !== null) && (!is_numeric($month))) { - $month = Date::monthStringToNumber($month); - } - - if (($day !== null) && (!is_numeric($day))) { - $day = Date::dayStringToNumber($day); - } - - $year = ($year !== null) ? StringHelper::testStringAsNumeric($year) : 0; - $month = ($month !== null) ? StringHelper::testStringAsNumeric($month) : 0; - $day = ($day !== null) ? StringHelper::testStringAsNumeric($day) : 0; - if ( - (!is_numeric($year)) || - (!is_numeric($month)) || - (!is_numeric($day)) - ) { - return Functions::VALUE(); - } - $year = (int) $year; - $month = (int) $month; - $day = (int) $day; - - $baseYear = Date::getExcelCalendar(); - // Validate parameters - if ($year < ($baseYear - 1900)) { - return Functions::NAN(); - } - if ((($baseYear - 1900) != 0) && ($year < $baseYear) && ($year >= 1900)) { - return Functions::NAN(); - } - - if (($year < $baseYear) && ($year >= ($baseYear - 1900))) { - $year += 1900; - } - - if ($month < 1) { - // Handle year/month adjustment if month < 1 - --$month; - $year += ceil($month / 12) - 1; - $month = 13 - abs($month % 12); - } elseif ($month > 12) { - // Handle year/month adjustment if month > 12 - $year += floor($month / 12); - $month = ($month % 12); - } - - // Re-validate the year parameter after adjustments - if (($year < $baseYear) || ($year >= 10000)) { - return Functions::NAN(); - } - - // Execute function - $excelDateValue = Date::formattedPHPToExcel($year, $month, $day); - switch (Functions::getReturnDateType()) { - case Functions::RETURNDATE_EXCEL: - return (float) $excelDateValue; - case Functions::RETURNDATE_UNIX_TIMESTAMP: - return (int) Date::excelToTimestamp($excelDateValue); - case Functions::RETURNDATE_PHP_DATETIME_OBJECT: - return Date::excelToDateTimeObject($excelDateValue); - } - } - - /** - * TIME. - * - * The TIME function returns a value that represents a particular time. - * - * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the time - * format of your regional settings. PhpSpreadsheet does not change cell formatting in this way. - * - * Excel Function: - * TIME(hour,minute,second) - * - * @param int $hour A number from 0 (zero) to 32767 representing the hour. - * Any value greater than 23 will be divided by 24 and the remainder - * will be treated as the hour value. For example, TIME(27,0,0) = - * TIME(3,0,0) = .125 or 3:00 AM. - * @param int $minute A number from 0 to 32767 representing the minute. - * Any value greater than 59 will be converted to hours and minutes. - * For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM. - * @param int $second A number from 0 to 32767 representing the second. - * Any value greater than 59 will be converted to hours, minutes, - * and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148 - * or 12:33:20 AM - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function TIME($hour = 0, $minute = 0, $second = 0) - { - $hour = Functions::flattenSingleValue($hour); - $minute = Functions::flattenSingleValue($minute); - $second = Functions::flattenSingleValue($second); - - if ($hour == '') { - $hour = 0; - } - if ($minute == '') { - $minute = 0; - } - if ($second == '') { - $second = 0; - } - - if ((!is_numeric($hour)) || (!is_numeric($minute)) || (!is_numeric($second))) { - return Functions::VALUE(); - } - $hour = (int) $hour; - $minute = (int) $minute; - $second = (int) $second; - - if ($second < 0) { - $minute += floor($second / 60); - $second = 60 - abs($second % 60); - if ($second == 60) { - $second = 0; - } - } elseif ($second >= 60) { - $minute += floor($second / 60); - $second = $second % 60; - } - if ($minute < 0) { - $hour += floor($minute / 60); - $minute = 60 - abs($minute % 60); - if ($minute == 60) { - $minute = 0; - } - } elseif ($minute >= 60) { - $hour += floor($minute / 60); - $minute = $minute % 60; - } - - if ($hour > 23) { - $hour = $hour % 24; - } elseif ($hour < 0) { - return Functions::NAN(); - } - - // Execute function - switch (Functions::getReturnDateType()) { - case Functions::RETURNDATE_EXCEL: - $date = 0; - $calendar = Date::getExcelCalendar(); - if ($calendar != Date::CALENDAR_WINDOWS_1900) { - $date = 1; - } - - return (float) Date::formattedPHPToExcel($calendar, 1, $date, $hour, $minute, $second); - case Functions::RETURNDATE_UNIX_TIMESTAMP: - return (int) Date::excelToTimestamp(Date::formattedPHPToExcel(1970, 1, 1, $hour, $minute, $second)); // -2147468400; // -2147472000 + 3600 - case Functions::RETURNDATE_PHP_DATETIME_OBJECT: - $dayAdjust = 0; - if ($hour < 0) { - $dayAdjust = floor($hour / 24); - $hour = 24 - abs($hour % 24); - if ($hour == 24) { - $hour = 0; - } - } elseif ($hour >= 24) { - $dayAdjust = floor($hour / 24); - $hour = $hour % 24; - } - $phpDateObject = new \DateTime('1900-01-01 ' . $hour . ':' . $minute . ':' . $second); - if ($dayAdjust != 0) { - $phpDateObject->modify($dayAdjust . ' days'); - } - - return $phpDateObject; - } - } - - /** - * DATEVALUE. - * - * Returns a value that represents a particular date. - * Use DATEVALUE to convert a date represented by a text string to an Excel or PHP date/time stamp - * value. - * - * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date - * format of your regional settings. PhpSpreadsheet does not change cell formatting in this way. - * - * Excel Function: - * DATEVALUE(dateValue) - * - * @param string $dateValue Text that represents a date in a Microsoft Excel date format. - * For example, "1/30/2008" or "30-Jan-2008" are text strings within - * quotation marks that represent dates. Using the default date - * system in Excel for Windows, date_text must represent a date from - * January 1, 1900, to December 31, 9999. Using the default date - * system in Excel for the Macintosh, date_text must represent a date - * from January 1, 1904, to December 31, 9999. DATEVALUE returns the - * #VALUE! error value if date_text is out of this range. - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function DATEVALUE($dateValue = 1) - { - $dateValue = trim(Functions::flattenSingleValue($dateValue), '"'); - // Strip any ordinals because they're allowed in Excel (English only) - $dateValue = preg_replace('/(\d)(st|nd|rd|th)([ -\/])/Ui', '$1$3', $dateValue); - // Convert separators (/ . or space) to hyphens (should also handle dot used for ordinals in some countries, e.g. Denmark, Germany) - $dateValue = str_replace(['/', '.', '-', ' '], ' ', $dateValue); - - $yearFound = false; - $t1 = explode(' ', $dateValue); - foreach ($t1 as &$t) { - if ((is_numeric($t)) && ($t > 31)) { - if ($yearFound) { - return Functions::VALUE(); - } - if ($t < 100) { - $t += 1900; - } - $yearFound = true; - } - } - if ((count($t1) == 1) && (strpos($t, ':') !== false)) { - // We've been fed a time value without any date - return 0.0; - } elseif (count($t1) == 2) { - // We only have two parts of the date: either day/month or month/year - if ($yearFound) { - array_unshift($t1, 1); - } else { - if (is_numeric($t1[1]) && $t1[1] > 29) { - $t1[1] += 1900; - array_unshift($t1, 1); - } else { - $t1[] = date('Y'); - } - } - } - unset($t); - $dateValue = implode(' ', $t1); - - $PHPDateArray = date_parse($dateValue); - if (($PHPDateArray === false) || ($PHPDateArray['error_count'] > 0)) { - $testVal1 = strtok($dateValue, '- '); - if ($testVal1 !== false) { - $testVal2 = strtok('- '); - if ($testVal2 !== false) { - $testVal3 = strtok('- '); - if ($testVal3 === false) { - $testVal3 = strftime('%Y'); - } - } else { - return Functions::VALUE(); - } - } else { - return Functions::VALUE(); - } - if ($testVal1 < 31 && $testVal2 < 12 && $testVal3 < 12 && strlen($testVal3) == 2) { - $testVal3 += 2000; - } - $PHPDateArray = date_parse($testVal1 . '-' . $testVal2 . '-' . $testVal3); - if (($PHPDateArray === false) || ($PHPDateArray['error_count'] > 0)) { - $PHPDateArray = date_parse($testVal2 . '-' . $testVal1 . '-' . $testVal3); - if (($PHPDateArray === false) || ($PHPDateArray['error_count'] > 0)) { - return Functions::VALUE(); - } - } - } - - if (($PHPDateArray !== false) && ($PHPDateArray['error_count'] == 0)) { - // Execute function - if ($PHPDateArray['year'] == '') { - $PHPDateArray['year'] = strftime('%Y'); - } - if ($PHPDateArray['year'] < 1900) { - return Functions::VALUE(); - } - if ($PHPDateArray['month'] == '') { - $PHPDateArray['month'] = strftime('%m'); - } - if ($PHPDateArray['day'] == '') { - $PHPDateArray['day'] = strftime('%d'); - } - if (!checkdate($PHPDateArray['month'], $PHPDateArray['day'], $PHPDateArray['year'])) { - return Functions::VALUE(); - } - $excelDateValue = floor( - Date::formattedPHPToExcel( - $PHPDateArray['year'], - $PHPDateArray['month'], - $PHPDateArray['day'], - $PHPDateArray['hour'], - $PHPDateArray['minute'], - $PHPDateArray['second'] - ) - ); - switch (Functions::getReturnDateType()) { - case Functions::RETURNDATE_EXCEL: - return (float) $excelDateValue; - case Functions::RETURNDATE_UNIX_TIMESTAMP: - return (int) Date::excelToTimestamp($excelDateValue); - case Functions::RETURNDATE_PHP_DATETIME_OBJECT: - return new \DateTime($PHPDateArray['year'] . '-' . $PHPDateArray['month'] . '-' . $PHPDateArray['day'] . ' 00:00:00'); - } - } - - return Functions::VALUE(); - } - - /** - * TIMEVALUE. - * - * Returns a value that represents a particular time. - * Use TIMEVALUE to convert a time represented by a text string to an Excel or PHP date/time stamp - * value. - * - * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the time - * format of your regional settings. PhpSpreadsheet does not change cell formatting in this way. - * - * Excel Function: - * TIMEVALUE(timeValue) - * - * @param string $timeValue A text string that represents a time in any one of the Microsoft - * Excel time formats; for example, "6:45 PM" and "18:45" text strings - * within quotation marks that represent time. - * Date information in time_text is ignored. - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function TIMEVALUE($timeValue) - { - $timeValue = trim(Functions::flattenSingleValue($timeValue), '"'); - $timeValue = str_replace(['/', '.'], '-', $timeValue); - - $arraySplit = preg_split('/[\/:\-\s]/', $timeValue); - if ((count($arraySplit) == 2 || count($arraySplit) == 3) && $arraySplit[0] > 24) { - $arraySplit[0] = ($arraySplit[0] % 24); - $timeValue = implode(':', $arraySplit); - } - - $PHPDateArray = date_parse($timeValue); - if (($PHPDateArray !== false) && ($PHPDateArray['error_count'] == 0)) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) { - $excelDateValue = Date::formattedPHPToExcel( - $PHPDateArray['year'], - $PHPDateArray['month'], - $PHPDateArray['day'], - $PHPDateArray['hour'], - $PHPDateArray['minute'], - $PHPDateArray['second'] - ); - } else { - $excelDateValue = Date::formattedPHPToExcel(1900, 1, 1, $PHPDateArray['hour'], $PHPDateArray['minute'], $PHPDateArray['second']) - 1; - } - - switch (Functions::getReturnDateType()) { - case Functions::RETURNDATE_EXCEL: - return (float) $excelDateValue; - case Functions::RETURNDATE_UNIX_TIMESTAMP: - return (int) $phpDateValue = Date::excelToTimestamp($excelDateValue + 25569) - 3600; - case Functions::RETURNDATE_PHP_DATETIME_OBJECT: - return new \DateTime('1900-01-01 ' . $PHPDateArray['hour'] . ':' . $PHPDateArray['minute'] . ':' . $PHPDateArray['second']); - } - } - - return Functions::VALUE(); - } - - /** - * DATEDIF. - * - * @param mixed $startDate Excel date serial value, PHP date/time stamp, PHP DateTime object - * or a standard date string - * @param mixed $endDate Excel date serial value, PHP date/time stamp, PHP DateTime object - * or a standard date string - * @param string $unit - * - * @return int|string Interval between the dates - */ - public static function DATEDIF($startDate = 0, $endDate = 0, $unit = 'D') - { - $startDate = Functions::flattenSingleValue($startDate); - $endDate = Functions::flattenSingleValue($endDate); - $unit = strtoupper(Functions::flattenSingleValue($unit)); - - if (is_string($startDate = self::getDateValue($startDate))) { - return Functions::VALUE(); - } - if (is_string($endDate = self::getDateValue($endDate))) { - return Functions::VALUE(); - } - - // Validate parameters - if ($startDate > $endDate) { - return Functions::NAN(); - } - - // Execute function - $difference = $endDate - $startDate; - - $PHPStartDateObject = Date::excelToDateTimeObject($startDate); - $startDays = $PHPStartDateObject->format('j'); - $startMonths = $PHPStartDateObject->format('n'); - $startYears = $PHPStartDateObject->format('Y'); - - $PHPEndDateObject = Date::excelToDateTimeObject($endDate); - $endDays = $PHPEndDateObject->format('j'); - $endMonths = $PHPEndDateObject->format('n'); - $endYears = $PHPEndDateObject->format('Y'); - - $PHPDiffDateObject = $PHPEndDateObject->diff($PHPStartDateObject); - - switch ($unit) { - case 'D': - $retVal = (int) $difference; - - break; - case 'M': - $retVal = (int) 12 * $PHPDiffDateObject->format('%y') + $PHPDiffDateObject->format('%m'); - - break; - case 'Y': - $retVal = (int) $PHPDiffDateObject->format('%y'); - - break; - case 'MD': - if ($endDays < $startDays) { - $retVal = $endDays; - $PHPEndDateObject->modify('-' . $endDays . ' days'); - $adjustDays = $PHPEndDateObject->format('j'); - $retVal += ($adjustDays - $startDays); - } else { - $retVal = (int) $PHPDiffDateObject->format('%d'); - } - - break; - case 'YM': - $retVal = (int) $PHPDiffDateObject->format('%m'); - - break; - case 'YD': - $retVal = (int) $difference; - if ($endYears > $startYears) { - $isLeapStartYear = $PHPStartDateObject->format('L'); - $wasLeapEndYear = $PHPEndDateObject->format('L'); - - // Adjust end year to be as close as possible as start year - while ($PHPEndDateObject >= $PHPStartDateObject) { - $PHPEndDateObject->modify('-1 year'); - $endYears = $PHPEndDateObject->format('Y'); - } - $PHPEndDateObject->modify('+1 year'); - - // Get the result - $retVal = $PHPEndDateObject->diff($PHPStartDateObject)->days; - - // Adjust for leap years cases - $isLeapEndYear = $PHPEndDateObject->format('L'); - $limit = new \DateTime($PHPEndDateObject->format('Y-02-29')); - if (!$isLeapStartYear && !$wasLeapEndYear && $isLeapEndYear && $PHPEndDateObject >= $limit) { - --$retVal; - } - } - - break; - default: - $retVal = Functions::VALUE(); - } - - return $retVal; - } - - /** - * DAYS. - * - * Returns the number of days between two dates - * - * Excel Function: - * DAYS(endDate, startDate) - * - * @param DateTimeImmutable|float|int|string $endDate Excel date serial value (float), - * PHP date timestamp (integer), PHP DateTime object, or a standard date string - * @param DateTimeImmutable|float|int|string $startDate Excel date serial value (float), - * PHP date timestamp (integer), PHP DateTime object, or a standard date string - * - * @return int|string Number of days between start date and end date or an error - */ - public static function DAYS($endDate = 0, $startDate = 0) - { - $startDate = Functions::flattenSingleValue($startDate); - $endDate = Functions::flattenSingleValue($endDate); - - $startDate = self::getDateValue($startDate); - if (is_string($startDate)) { - return Functions::VALUE(); - } - - $endDate = self::getDateValue($endDate); - if (is_string($endDate)) { - return Functions::VALUE(); - } - - // Execute function - $PHPStartDateObject = Date::excelToDateTimeObject($startDate); - $PHPEndDateObject = Date::excelToDateTimeObject($endDate); - - $diff = $PHPStartDateObject->diff($PHPEndDateObject); - $days = $diff->days; - - if ($diff->invert) { - $days = -$days; - } - - return $days; - } - - /** - * DAYS360. - * - * Returns the number of days between two dates based on a 360-day year (twelve 30-day months), - * which is used in some accounting calculations. Use this function to help compute payments if - * your accounting system is based on twelve 30-day months. - * - * Excel Function: - * DAYS360(startDate,endDate[,method]) - * - * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * @param bool $method US or European Method - * FALSE or omitted: U.S. (NASD) method. If the starting date is - * the last day of a month, it becomes equal to the 30th of the - * same month. If the ending date is the last day of a month and - * the starting date is earlier than the 30th of a month, the - * ending date becomes equal to the 1st of the next month; - * otherwise the ending date becomes equal to the 30th of the - * same month. - * TRUE: European method. Starting dates and ending dates that - * occur on the 31st of a month become equal to the 30th of the - * same month. - * - * @return int|string Number of days between start date and end date - */ - public static function DAYS360($startDate = 0, $endDate = 0, $method = false) - { - $startDate = Functions::flattenSingleValue($startDate); - $endDate = Functions::flattenSingleValue($endDate); - - if (is_string($startDate = self::getDateValue($startDate))) { - return Functions::VALUE(); - } - if (is_string($endDate = self::getDateValue($endDate))) { - return Functions::VALUE(); - } - - if (!is_bool($method)) { - return Functions::VALUE(); - } - - // Execute function - $PHPStartDateObject = Date::excelToDateTimeObject($startDate); - $startDay = $PHPStartDateObject->format('j'); - $startMonth = $PHPStartDateObject->format('n'); - $startYear = $PHPStartDateObject->format('Y'); - - $PHPEndDateObject = Date::excelToDateTimeObject($endDate); - $endDay = $PHPEndDateObject->format('j'); - $endMonth = $PHPEndDateObject->format('n'); - $endYear = $PHPEndDateObject->format('Y'); - - return self::dateDiff360($startDay, $startMonth, $startYear, $endDay, $endMonth, $endYear, !$method); - } - - /** - * YEARFRAC. - * - * Calculates the fraction of the year represented by the number of whole days between two dates - * (the start_date and the end_date). - * Use the YEARFRAC worksheet function to identify the proportion of a whole year's benefits or - * obligations to assign to a specific term. - * - * Excel Function: - * YEARFRAC(startDate,endDate[,method]) - * See https://lists.oasis-open.org/archives/office-formula/200806/msg00039.html - * for description of algorithm used in Excel - * - * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * @param int $method Method used for the calculation - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string fraction of the year, or a string containing an error - */ - public static function YEARFRAC($startDate = 0, $endDate = 0, $method = 0) - { - $startDate = Functions::flattenSingleValue($startDate); - $endDate = Functions::flattenSingleValue($endDate); - $method = Functions::flattenSingleValue($method); - - if (is_string($startDate = self::getDateValue($startDate))) { - return Functions::VALUE(); - } - if (is_string($endDate = self::getDateValue($endDate))) { - return Functions::VALUE(); - } - if ($startDate > $endDate) { - $temp = $startDate; - $startDate = $endDate; - $endDate = $temp; - } - - if (((is_numeric($method)) && (!is_string($method))) || ($method == '')) { - switch ($method) { - case 0: - return self::DAYS360($startDate, $endDate) / 360; - case 1: - $days = self::DATEDIF($startDate, $endDate); - $startYear = self::YEAR($startDate); - $endYear = self::YEAR($endDate); - $years = $endYear - $startYear + 1; - $startMonth = self::MONTHOFYEAR($startDate); - $startDay = self::DAYOFMONTH($startDate); - $endMonth = self::MONTHOFYEAR($endDate); - $endDay = self::DAYOFMONTH($endDate); - $startMonthDay = 100 * $startMonth + $startDay; - $endMonthDay = 100 * $endMonth + $endDay; - if ($years == 1) { - if (self::isLeapYear($endYear)) { - $tmpCalcAnnualBasis = 366; - } else { - $tmpCalcAnnualBasis = 365; - } - } elseif ($years == 2 && $startMonthDay >= $endMonthDay) { - if (self::isLeapYear($startYear)) { - if ($startMonthDay <= 229) { - $tmpCalcAnnualBasis = 366; - } else { - $tmpCalcAnnualBasis = 365; - } - } elseif (self::isLeapYear($endYear)) { - if ($endMonthDay >= 229) { - $tmpCalcAnnualBasis = 366; - } else { - $tmpCalcAnnualBasis = 365; - } - } else { - $tmpCalcAnnualBasis = 365; - } - } else { - $tmpCalcAnnualBasis = 0; - for ($year = $startYear; $year <= $endYear; ++$year) { - $tmpCalcAnnualBasis += self::isLeapYear($year) ? 366 : 365; - } - $tmpCalcAnnualBasis /= $years; - } - - return $days / $tmpCalcAnnualBasis; - case 2: - return self::DATEDIF($startDate, $endDate) / 360; - case 3: - return self::DATEDIF($startDate, $endDate) / 365; - case 4: - return self::DAYS360($startDate, $endDate, true) / 360; - } - } - - return Functions::VALUE(); - } - - /** - * NETWORKDAYS. - * - * Returns the number of whole working days between start_date and end_date. Working days - * exclude weekends and any dates identified in holidays. - * Use NETWORKDAYS to calculate employee benefits that accrue based on the number of days - * worked during a specific term. - * - * Excel Function: - * NETWORKDAYS(startDate,endDate[,holidays[,holiday[,...]]]) - * - * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * - * @return int|string Interval between the dates - */ - public static function NETWORKDAYS($startDate, $endDate, ...$dateArgs) - { - // Retrieve the mandatory start and end date that are referenced in the function definition - $startDate = Functions::flattenSingleValue($startDate); - $endDate = Functions::flattenSingleValue($endDate); - // Get the optional days - $dateArgs = Functions::flattenArray($dateArgs); - - // Validate the start and end dates - if (is_string($startDate = $sDate = self::getDateValue($startDate))) { - return Functions::VALUE(); - } - $startDate = (float) floor($startDate); - if (is_string($endDate = $eDate = self::getDateValue($endDate))) { - return Functions::VALUE(); - } - $endDate = (float) floor($endDate); - - if ($sDate > $eDate) { - $startDate = $eDate; - $endDate = $sDate; - } - - // Execute function - $startDoW = 6 - self::WEEKDAY($startDate, 2); - if ($startDoW < 0) { - $startDoW = 0; - } - $endDoW = self::WEEKDAY($endDate, 2); - if ($endDoW >= 6) { - $endDoW = 0; - } - - $wholeWeekDays = floor(($endDate - $startDate) / 7) * 5; - $partWeekDays = $endDoW + $startDoW; - if ($partWeekDays > 5) { - $partWeekDays -= 5; - } - - // Test any extra holiday parameters - $holidayCountedArray = []; - foreach ($dateArgs as $holidayDate) { - if (is_string($holidayDate = self::getDateValue($holidayDate))) { - return Functions::VALUE(); - } - if (($holidayDate >= $startDate) && ($holidayDate <= $endDate)) { - if ((self::WEEKDAY($holidayDate, 2) < 6) && (!in_array($holidayDate, $holidayCountedArray))) { - --$partWeekDays; - $holidayCountedArray[] = $holidayDate; - } - } - } - - if ($sDate > $eDate) { - return 0 - ($wholeWeekDays + $partWeekDays); - } - - return $wholeWeekDays + $partWeekDays; - } - - /** - * WORKDAY. - * - * Returns the date that is the indicated number of working days before or after a date (the - * starting date). Working days exclude weekends and any dates identified as holidays. - * Use WORKDAY to exclude weekends or holidays when you calculate invoice due dates, expected - * delivery times, or the number of days of work performed. - * - * Excel Function: - * WORKDAY(startDate,endDays[,holidays[,holiday[,...]]]) - * - * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * @param int $endDays The number of nonweekend and nonholiday days before or after - * startDate. A positive value for days yields a future date; a - * negative value yields a past date. - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function WORKDAY($startDate, $endDays, ...$dateArgs) - { - // Retrieve the mandatory start date and days that are referenced in the function definition - $startDate = Functions::flattenSingleValue($startDate); - $endDays = Functions::flattenSingleValue($endDays); - // Get the optional days - $dateArgs = Functions::flattenArray($dateArgs); - - if ((is_string($startDate = self::getDateValue($startDate))) || (!is_numeric($endDays))) { - return Functions::VALUE(); - } - $startDate = (float) floor($startDate); - $endDays = (int) floor($endDays); - // If endDays is 0, we always return startDate - if ($endDays == 0) { - return $startDate; - } - - $decrementing = $endDays < 0; - - // Adjust the start date if it falls over a weekend - - $startDoW = self::WEEKDAY($startDate, 3); - if (self::WEEKDAY($startDate, 3) >= 5) { - $startDate += ($decrementing) ? -$startDoW + 4 : 7 - $startDoW; - ($decrementing) ? $endDays++ : $endDays--; - } - - // Add endDays - $endDate = (float) $startDate + ((int) ($endDays / 5) * 7) + ($endDays % 5); - - // Adjust the calculated end date if it falls over a weekend - $endDoW = self::WEEKDAY($endDate, 3); - if ($endDoW >= 5) { - $endDate += ($decrementing) ? -$endDoW + 4 : 7 - $endDoW; - } - - // Test any extra holiday parameters - if (!empty($dateArgs)) { - $holidayCountedArray = $holidayDates = []; - foreach ($dateArgs as $holidayDate) { - if (($holidayDate !== null) && (trim($holidayDate) > '')) { - if (is_string($holidayDate = self::getDateValue($holidayDate))) { - return Functions::VALUE(); - } - if (self::WEEKDAY($holidayDate, 3) < 5) { - $holidayDates[] = $holidayDate; - } - } - } - if ($decrementing) { - rsort($holidayDates, SORT_NUMERIC); - } else { - sort($holidayDates, SORT_NUMERIC); - } - foreach ($holidayDates as $holidayDate) { - if ($decrementing) { - if (($holidayDate <= $startDate) && ($holidayDate >= $endDate)) { - if (!in_array($holidayDate, $holidayCountedArray)) { - --$endDate; - $holidayCountedArray[] = $holidayDate; - } - } - } else { - if (($holidayDate >= $startDate) && ($holidayDate <= $endDate)) { - if (!in_array($holidayDate, $holidayCountedArray)) { - ++$endDate; - $holidayCountedArray[] = $holidayDate; - } - } - } - // Adjust the calculated end date if it falls over a weekend - $endDoW = self::WEEKDAY($endDate, 3); - if ($endDoW >= 5) { - $endDate += ($decrementing) ? -$endDoW + 4 : 7 - $endDoW; - } - } - } - - switch (Functions::getReturnDateType()) { - case Functions::RETURNDATE_EXCEL: - return (float) $endDate; - case Functions::RETURNDATE_UNIX_TIMESTAMP: - return (int) Date::excelToTimestamp($endDate); - case Functions::RETURNDATE_PHP_DATETIME_OBJECT: - return Date::excelToDateTimeObject($endDate); - } - } - - /** - * DAYOFMONTH. - * - * Returns the day of the month, for a specified date. The day is given as an integer - * ranging from 1 to 31. - * - * Excel Function: - * DAY(dateValue) - * - * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * - * @return int|string Day of the month - */ - public static function DAYOFMONTH($dateValue = 1) - { - $dateValue = Functions::flattenSingleValue($dateValue); - - if ($dateValue === null) { - $dateValue = 1; - } elseif (is_string($dateValue = self::getDateValue($dateValue))) { - return Functions::VALUE(); - } - - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_EXCEL) { - if ($dateValue < 0.0) { - return Functions::NAN(); - } elseif ($dateValue < 1.0) { - return 0; - } - } - - // Execute function - $PHPDateObject = Date::excelToDateTimeObject($dateValue); - - return (int) $PHPDateObject->format('j'); - } - - /** - * WEEKDAY. - * - * Returns the day of the week for a specified date. The day is given as an integer - * ranging from 0 to 7 (dependent on the requested style). - * - * Excel Function: - * WEEKDAY(dateValue[,style]) - * - * @param int $dateValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * @param int $style A number that determines the type of return value - * 1 or omitted Numbers 1 (Sunday) through 7 (Saturday). - * 2 Numbers 1 (Monday) through 7 (Sunday). - * 3 Numbers 0 (Monday) through 6 (Sunday). - * - * @return int|string Day of the week value - */ - public static function WEEKDAY($dateValue = 1, $style = 1) - { - $dateValue = Functions::flattenSingleValue($dateValue); - $style = Functions::flattenSingleValue($style); - - if (!is_numeric($style)) { - return Functions::VALUE(); - } elseif (($style < 1) || ($style > 3)) { - return Functions::NAN(); - } - $style = floor($style); - - if ($dateValue === null) { - $dateValue = 1; - } elseif (is_string($dateValue = self::getDateValue($dateValue))) { - return Functions::VALUE(); - } elseif ($dateValue < 0.0) { - return Functions::NAN(); - } - - // Execute function - $PHPDateObject = Date::excelToDateTimeObject($dateValue); - $DoW = (int) $PHPDateObject->format('w'); - - $firstDay = 1; - switch ($style) { - case 1: - ++$DoW; - - break; - case 2: - if ($DoW === 0) { - $DoW = 7; - } - - break; - case 3: - if ($DoW === 0) { - $DoW = 7; - } - $firstDay = 0; - --$DoW; - - break; - } - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_EXCEL) { - // Test for Excel's 1900 leap year, and introduce the error as required - if (($PHPDateObject->format('Y') == 1900) && ($PHPDateObject->format('n') <= 2)) { - --$DoW; - if ($DoW < $firstDay) { - $DoW += 7; - } - } - } - - return $DoW; - } - - const STARTWEEK_SUNDAY = 1; - const STARTWEEK_MONDAY = 2; - const STARTWEEK_MONDAY_ALT = 11; - const STARTWEEK_TUESDAY = 12; - const STARTWEEK_WEDNESDAY = 13; - const STARTWEEK_THURSDAY = 14; - const STARTWEEK_FRIDAY = 15; - const STARTWEEK_SATURDAY = 16; - const STARTWEEK_SUNDAY_ALT = 17; - const DOW_SUNDAY = 1; - const DOW_MONDAY = 2; - const DOW_TUESDAY = 3; - const DOW_WEDNESDAY = 4; - const DOW_THURSDAY = 5; - const DOW_FRIDAY = 6; - const DOW_SATURDAY = 7; - const STARTWEEK_MONDAY_ISO = 21; - const METHODARR = [ - self::STARTWEEK_SUNDAY => self::DOW_SUNDAY, - self::DOW_MONDAY, - self::STARTWEEK_MONDAY_ALT => self::DOW_MONDAY, - self::DOW_TUESDAY, - self::DOW_WEDNESDAY, - self::DOW_THURSDAY, - self::DOW_FRIDAY, - self::DOW_SATURDAY, - self::DOW_SUNDAY, - self::STARTWEEK_MONDAY_ISO => self::STARTWEEK_MONDAY_ISO, - ]; - - /** - * WEEKNUM. - * - * Returns the week of the year for a specified date. - * The WEEKNUM function considers the week containing January 1 to be the first week of the year. - * However, there is a European standard that defines the first week as the one with the majority - * of days (four or more) falling in the new year. This means that for years in which there are - * three days or less in the first week of January, the WEEKNUM function returns week numbers - * that are incorrect according to the European standard. - * - * Excel Function: - * WEEKNUM(dateValue[,style]) - * - * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * @param int $method Week begins on Sunday or Monday - * 1 or omitted Week begins on Sunday. - * 2 Week begins on Monday. - * 11 Week begins on Monday. - * 12 Week begins on Tuesday. - * 13 Week begins on Wednesday. - * 14 Week begins on Thursday. - * 15 Week begins on Friday. - * 16 Week begins on Saturday. - * 17 Week begins on Sunday. - * 21 ISO (Jan. 4 is week 1, begins on Monday). - * - * @return int|string Week Number - */ - public static function WEEKNUM($dateValue = 1, $method = self::STARTWEEK_SUNDAY) - { - $dateValue = Functions::flattenSingleValue($dateValue); - $method = Functions::flattenSingleValue($method); - - if (!is_numeric($method)) { - return Functions::VALUE(); - } - $method = (int) $method; - if (!array_key_exists($method, self::METHODARR)) { - return Functions::NaN(); - } - $method = self::METHODARR[$method]; - - $dateValue = self::getDateValue($dateValue); - if (is_string($dateValue)) { - return Functions::VALUE(); - } - if ($dateValue < 0.0) { - return Functions::NAN(); - } - - // Execute function - $PHPDateObject = Date::excelToDateTimeObject($dateValue); - if ($method == self::STARTWEEK_MONDAY_ISO) { - return (int) $PHPDateObject->format('W'); - } - $dayOfYear = $PHPDateObject->format('z'); - $PHPDateObject->modify('-' . $dayOfYear . ' days'); - $firstDayOfFirstWeek = $PHPDateObject->format('w'); - $daysInFirstWeek = (6 - $firstDayOfFirstWeek + $method) % 7; - $daysInFirstWeek += 7 * !$daysInFirstWeek; - $endFirstWeek = $daysInFirstWeek - 1; - $weekOfYear = floor(($dayOfYear - $endFirstWeek + 13) / 7); - - return (int) $weekOfYear; - } - - /** - * ISOWEEKNUM. - * - * Returns the ISO 8601 week number of the year for a specified date. - * - * Excel Function: - * ISOWEEKNUM(dateValue) - * - * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * - * @return int|string Week Number - */ - public static function ISOWEEKNUM($dateValue = 1) - { - $dateValue = Functions::flattenSingleValue($dateValue); - - if ($dateValue === null) { - $dateValue = 1; - } elseif (is_string($dateValue = self::getDateValue($dateValue))) { - return Functions::VALUE(); - } elseif ($dateValue < 0.0) { - return Functions::NAN(); - } - - // Execute function - $PHPDateObject = Date::excelToDateTimeObject($dateValue); - - return (int) $PHPDateObject->format('W'); - } - - /** - * MONTHOFYEAR. - * - * Returns the month of a date represented by a serial number. - * The month is given as an integer, ranging from 1 (January) to 12 (December). - * - * Excel Function: - * MONTH(dateValue) - * - * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * - * @return int|string Month of the year - */ - public static function MONTHOFYEAR($dateValue = 1) - { - $dateValue = Functions::flattenSingleValue($dateValue); - - if (empty($dateValue)) { - $dateValue = 1; - } - if (is_string($dateValue = self::getDateValue($dateValue))) { - return Functions::VALUE(); - } elseif ($dateValue < 0.0) { - return Functions::NAN(); - } - - // Execute function - $PHPDateObject = Date::excelToDateTimeObject($dateValue); - - return (int) $PHPDateObject->format('n'); - } - - /** - * YEAR. - * - * Returns the year corresponding to a date. - * The year is returned as an integer in the range 1900-9999. - * - * Excel Function: - * YEAR(dateValue) - * - * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * - * @return int|string Year - */ - public static function YEAR($dateValue = 1) - { - $dateValue = Functions::flattenSingleValue($dateValue); - - if ($dateValue === null) { - $dateValue = 1; - } elseif (is_string($dateValue = self::getDateValue($dateValue))) { - return Functions::VALUE(); - } elseif ($dateValue < 0.0) { - return Functions::NAN(); - } - - // Execute function - $PHPDateObject = Date::excelToDateTimeObject($dateValue); - - return (int) $PHPDateObject->format('Y'); - } - - /** - * HOUROFDAY. - * - * Returns the hour of a time value. - * The hour is given as an integer, ranging from 0 (12:00 A.M.) to 23 (11:00 P.M.). - * - * Excel Function: - * HOUR(timeValue) - * - * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard time string - * - * @return int|string Hour - */ - public static function HOUROFDAY($timeValue = 0) - { - $timeValue = Functions::flattenSingleValue($timeValue); - - if (!is_numeric($timeValue)) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) { - $testVal = strtok($timeValue, '/-: '); - if (strlen($testVal) < strlen($timeValue)) { - return Functions::VALUE(); - } - } - $timeValue = self::getTimeValue($timeValue); - if (is_string($timeValue)) { - return Functions::VALUE(); - } - } - // Execute function - if ($timeValue >= 1) { - $timeValue = fmod($timeValue, 1); - } elseif ($timeValue < 0.0) { - return Functions::NAN(); - } - $timeValue = Date::excelToTimestamp($timeValue); - - return (int) gmdate('G', $timeValue); - } - - /** - * MINUTE. - * - * Returns the minutes of a time value. - * The minute is given as an integer, ranging from 0 to 59. - * - * Excel Function: - * MINUTE(timeValue) - * - * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard time string - * - * @return int|string Minute - */ - public static function MINUTE($timeValue = 0) - { - $timeValue = $timeTester = Functions::flattenSingleValue($timeValue); - - if (!is_numeric($timeValue)) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) { - $testVal = strtok($timeValue, '/-: '); - if (strlen($testVal) < strlen($timeValue)) { - return Functions::VALUE(); - } - } - $timeValue = self::getTimeValue($timeValue); - if (is_string($timeValue)) { - return Functions::VALUE(); - } - } - // Execute function - if ($timeValue >= 1) { - $timeValue = fmod($timeValue, 1); - } elseif ($timeValue < 0.0) { - return Functions::NAN(); - } - $timeValue = Date::excelToTimestamp($timeValue); - - return (int) gmdate('i', $timeValue); - } - - /** - * SECOND. - * - * Returns the seconds of a time value. - * The second is given as an integer in the range 0 (zero) to 59. - * - * Excel Function: - * SECOND(timeValue) - * - * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard time string - * - * @return int|string Second - */ - public static function SECOND($timeValue = 0) - { - $timeValue = Functions::flattenSingleValue($timeValue); - - if (!is_numeric($timeValue)) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) { - $testVal = strtok($timeValue, '/-: '); - if (strlen($testVal) < strlen($timeValue)) { - return Functions::VALUE(); - } - } - $timeValue = self::getTimeValue($timeValue); - if (is_string($timeValue)) { - return Functions::VALUE(); - } - } - // Execute function - if ($timeValue >= 1) { - $timeValue = fmod($timeValue, 1); - } elseif ($timeValue < 0.0) { - return Functions::NAN(); - } - $timeValue = Date::excelToTimestamp($timeValue); - - return (int) gmdate('s', $timeValue); - } - - /** - * EDATE. - * - * Returns the serial number that represents the date that is the indicated number of months - * before or after a specified date (the start_date). - * Use EDATE to calculate maturity dates or due dates that fall on the same day of the month - * as the date of issue. - * - * Excel Function: - * EDATE(dateValue,adjustmentMonths) - * - * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * @param int $adjustmentMonths The number of months before or after start_date. - * A positive value for months yields a future date; - * a negative value yields a past date. - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function EDATE($dateValue = 1, $adjustmentMonths = 0) - { - $dateValue = Functions::flattenSingleValue($dateValue); - $adjustmentMonths = Functions::flattenSingleValue($adjustmentMonths); - - if (!is_numeric($adjustmentMonths)) { - return Functions::VALUE(); - } - $adjustmentMonths = floor($adjustmentMonths); - - if (is_string($dateValue = self::getDateValue($dateValue))) { - return Functions::VALUE(); - } - - // Execute function - $PHPDateObject = self::adjustDateByMonths($dateValue, $adjustmentMonths); - - switch (Functions::getReturnDateType()) { - case Functions::RETURNDATE_EXCEL: - return (float) Date::PHPToExcel($PHPDateObject); - case Functions::RETURNDATE_UNIX_TIMESTAMP: - return (int) Date::excelToTimestamp(Date::PHPToExcel($PHPDateObject)); - case Functions::RETURNDATE_PHP_DATETIME_OBJECT: - return $PHPDateObject; - } - } - - /** - * EOMONTH. - * - * Returns the date value for the last day of the month that is the indicated number of months - * before or after start_date. - * Use EOMONTH to calculate maturity dates or due dates that fall on the last day of the month. - * - * Excel Function: - * EOMONTH(dateValue,adjustmentMonths) - * - * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), - * PHP DateTime object, or a standard date string - * @param int $adjustmentMonths The number of months before or after start_date. - * A positive value for months yields a future date; - * a negative value yields a past date. - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function EOMONTH($dateValue = 1, $adjustmentMonths = 0) - { - $dateValue = Functions::flattenSingleValue($dateValue); - $adjustmentMonths = Functions::flattenSingleValue($adjustmentMonths); - - if (!is_numeric($adjustmentMonths)) { - return Functions::VALUE(); - } - $adjustmentMonths = floor($adjustmentMonths); - - if (is_string($dateValue = self::getDateValue($dateValue))) { - return Functions::VALUE(); - } - - // Execute function - $PHPDateObject = self::adjustDateByMonths($dateValue, $adjustmentMonths + 1); - $adjustDays = (int) $PHPDateObject->format('d'); - $adjustDaysString = '-' . $adjustDays . ' days'; - $PHPDateObject->modify($adjustDaysString); - - switch (Functions::getReturnDateType()) { - case Functions::RETURNDATE_EXCEL: - return (float) Date::PHPToExcel($PHPDateObject); - case Functions::RETURNDATE_UNIX_TIMESTAMP: - return (int) Date::excelToTimestamp(Date::PHPToExcel($PHPDateObject)); - case Functions::RETURNDATE_PHP_DATETIME_OBJECT: - return $PHPDateObject; - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php deleted file mode 100644 index b688e05..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php +++ /dev/null @@ -1,73 +0,0 @@ -stack); - } - - /** - * Push a new entry onto the stack. - * - * @param mixed $value - */ - public function push($value): void - { - $this->stack[$value] = $value; - } - - /** - * Pop the last entry from the stack. - * - * @return mixed - */ - public function pop() - { - return array_pop($this->stack); - } - - /** - * Test to see if a specified entry exists on the stack. - * - * @param mixed $value The value to test - * - * @return bool - */ - public function onStack($value) - { - return isset($this->stack[$value]); - } - - /** - * Clear the stack. - */ - public function clear(): void - { - $this->stack = []; - } - - /** - * Return an array of all entries on the stack. - * - * @return mixed[] - */ - public function showStack() - { - return $this->stack; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php deleted file mode 100644 index 3c0f237..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php +++ /dev/null @@ -1,140 +0,0 @@ -cellStack = $stack; - } - - /** - * Enable/Disable Calculation engine logging. - * - * @param bool $pValue - */ - public function setWriteDebugLog($pValue): void - { - $this->writeDebugLog = $pValue; - } - - /** - * Return whether calculation engine logging is enabled or disabled. - * - * @return bool - */ - public function getWriteDebugLog() - { - return $this->writeDebugLog; - } - - /** - * Enable/Disable echoing of debug log information. - * - * @param bool $pValue - */ - public function setEchoDebugLog($pValue): void - { - $this->echoDebugLog = $pValue; - } - - /** - * Return whether echoing of debug log information is enabled or disabled. - * - * @return bool - */ - public function getEchoDebugLog() - { - return $this->echoDebugLog; - } - - /** - * Write an entry to the calculation engine debug log. - */ - public function writeDebugLog(...$args): void - { - // Only write the debug log if logging is enabled - if ($this->writeDebugLog) { - $message = implode('', $args); - $cellReference = implode(' -> ', $this->cellStack->showStack()); - if ($this->echoDebugLog) { - echo $cellReference, - ($this->cellStack->count() > 0 ? ' => ' : ''), - $message, - PHP_EOL; - } - $this->debugLog[] = $cellReference . - ($this->cellStack->count() > 0 ? ' => ' : '') . - $message; - } - } - - /** - * Write a series of entries to the calculation engine debug log. - * - * @param string[] $args - */ - public function mergeDebugLog(array $args): void - { - if ($this->writeDebugLog) { - foreach ($args as $entry) { - $this->writeDebugLog($entry); - } - } - } - - /** - * Clear the calculation engine debug log. - */ - public function clearLog(): void - { - $this->debugLog = []; - } - - /** - * Return the calculation engine debug log. - * - * @return string[] - */ - public function getLog() - { - return $this->debugLog; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php deleted file mode 100644 index 1256dd9..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php +++ /dev/null @@ -1,2760 +0,0 @@ - ['Group' => 'Mass', 'Unit Name' => 'Gram', 'AllowPrefix' => true], - 'sg' => ['Group' => 'Mass', 'Unit Name' => 'Slug', 'AllowPrefix' => false], - 'lbm' => ['Group' => 'Mass', 'Unit Name' => 'Pound mass (avoirdupois)', 'AllowPrefix' => false], - 'u' => ['Group' => 'Mass', 'Unit Name' => 'U (atomic mass unit)', 'AllowPrefix' => true], - 'ozm' => ['Group' => 'Mass', 'Unit Name' => 'Ounce mass (avoirdupois)', 'AllowPrefix' => false], - 'm' => ['Group' => 'Distance', 'Unit Name' => 'Meter', 'AllowPrefix' => true], - 'mi' => ['Group' => 'Distance', 'Unit Name' => 'Statute mile', 'AllowPrefix' => false], - 'Nmi' => ['Group' => 'Distance', 'Unit Name' => 'Nautical mile', 'AllowPrefix' => false], - 'in' => ['Group' => 'Distance', 'Unit Name' => 'Inch', 'AllowPrefix' => false], - 'ft' => ['Group' => 'Distance', 'Unit Name' => 'Foot', 'AllowPrefix' => false], - 'yd' => ['Group' => 'Distance', 'Unit Name' => 'Yard', 'AllowPrefix' => false], - 'ang' => ['Group' => 'Distance', 'Unit Name' => 'Angstrom', 'AllowPrefix' => true], - 'Pica' => ['Group' => 'Distance', 'Unit Name' => 'Pica (1/72 in)', 'AllowPrefix' => false], - 'yr' => ['Group' => 'Time', 'Unit Name' => 'Year', 'AllowPrefix' => false], - 'day' => ['Group' => 'Time', 'Unit Name' => 'Day', 'AllowPrefix' => false], - 'hr' => ['Group' => 'Time', 'Unit Name' => 'Hour', 'AllowPrefix' => false], - 'mn' => ['Group' => 'Time', 'Unit Name' => 'Minute', 'AllowPrefix' => false], - 'sec' => ['Group' => 'Time', 'Unit Name' => 'Second', 'AllowPrefix' => true], - 'Pa' => ['Group' => 'Pressure', 'Unit Name' => 'Pascal', 'AllowPrefix' => true], - 'p' => ['Group' => 'Pressure', 'Unit Name' => 'Pascal', 'AllowPrefix' => true], - 'atm' => ['Group' => 'Pressure', 'Unit Name' => 'Atmosphere', 'AllowPrefix' => true], - 'at' => ['Group' => 'Pressure', 'Unit Name' => 'Atmosphere', 'AllowPrefix' => true], - 'mmHg' => ['Group' => 'Pressure', 'Unit Name' => 'mm of Mercury', 'AllowPrefix' => true], - 'N' => ['Group' => 'Force', 'Unit Name' => 'Newton', 'AllowPrefix' => true], - 'dyn' => ['Group' => 'Force', 'Unit Name' => 'Dyne', 'AllowPrefix' => true], - 'dy' => ['Group' => 'Force', 'Unit Name' => 'Dyne', 'AllowPrefix' => true], - 'lbf' => ['Group' => 'Force', 'Unit Name' => 'Pound force', 'AllowPrefix' => false], - 'J' => ['Group' => 'Energy', 'Unit Name' => 'Joule', 'AllowPrefix' => true], - 'e' => ['Group' => 'Energy', 'Unit Name' => 'Erg', 'AllowPrefix' => true], - 'c' => ['Group' => 'Energy', 'Unit Name' => 'Thermodynamic calorie', 'AllowPrefix' => true], - 'cal' => ['Group' => 'Energy', 'Unit Name' => 'IT calorie', 'AllowPrefix' => true], - 'eV' => ['Group' => 'Energy', 'Unit Name' => 'Electron volt', 'AllowPrefix' => true], - 'ev' => ['Group' => 'Energy', 'Unit Name' => 'Electron volt', 'AllowPrefix' => true], - 'HPh' => ['Group' => 'Energy', 'Unit Name' => 'Horsepower-hour', 'AllowPrefix' => false], - 'hh' => ['Group' => 'Energy', 'Unit Name' => 'Horsepower-hour', 'AllowPrefix' => false], - 'Wh' => ['Group' => 'Energy', 'Unit Name' => 'Watt-hour', 'AllowPrefix' => true], - 'wh' => ['Group' => 'Energy', 'Unit Name' => 'Watt-hour', 'AllowPrefix' => true], - 'flb' => ['Group' => 'Energy', 'Unit Name' => 'Foot-pound', 'AllowPrefix' => false], - 'BTU' => ['Group' => 'Energy', 'Unit Name' => 'BTU', 'AllowPrefix' => false], - 'btu' => ['Group' => 'Energy', 'Unit Name' => 'BTU', 'AllowPrefix' => false], - 'HP' => ['Group' => 'Power', 'Unit Name' => 'Horsepower', 'AllowPrefix' => false], - 'h' => ['Group' => 'Power', 'Unit Name' => 'Horsepower', 'AllowPrefix' => false], - 'W' => ['Group' => 'Power', 'Unit Name' => 'Watt', 'AllowPrefix' => true], - 'w' => ['Group' => 'Power', 'Unit Name' => 'Watt', 'AllowPrefix' => true], - 'T' => ['Group' => 'Magnetism', 'Unit Name' => 'Tesla', 'AllowPrefix' => true], - 'ga' => ['Group' => 'Magnetism', 'Unit Name' => 'Gauss', 'AllowPrefix' => true], - 'C' => ['Group' => 'Temperature', 'Unit Name' => 'Celsius', 'AllowPrefix' => false], - 'cel' => ['Group' => 'Temperature', 'Unit Name' => 'Celsius', 'AllowPrefix' => false], - 'F' => ['Group' => 'Temperature', 'Unit Name' => 'Fahrenheit', 'AllowPrefix' => false], - 'fah' => ['Group' => 'Temperature', 'Unit Name' => 'Fahrenheit', 'AllowPrefix' => false], - 'K' => ['Group' => 'Temperature', 'Unit Name' => 'Kelvin', 'AllowPrefix' => false], - 'kel' => ['Group' => 'Temperature', 'Unit Name' => 'Kelvin', 'AllowPrefix' => false], - 'tsp' => ['Group' => 'Liquid', 'Unit Name' => 'Teaspoon', 'AllowPrefix' => false], - 'tbs' => ['Group' => 'Liquid', 'Unit Name' => 'Tablespoon', 'AllowPrefix' => false], - 'oz' => ['Group' => 'Liquid', 'Unit Name' => 'Fluid Ounce', 'AllowPrefix' => false], - 'cup' => ['Group' => 'Liquid', 'Unit Name' => 'Cup', 'AllowPrefix' => false], - 'pt' => ['Group' => 'Liquid', 'Unit Name' => 'U.S. Pint', 'AllowPrefix' => false], - 'us_pt' => ['Group' => 'Liquid', 'Unit Name' => 'U.S. Pint', 'AllowPrefix' => false], - 'uk_pt' => ['Group' => 'Liquid', 'Unit Name' => 'U.K. Pint', 'AllowPrefix' => false], - 'qt' => ['Group' => 'Liquid', 'Unit Name' => 'Quart', 'AllowPrefix' => false], - 'gal' => ['Group' => 'Liquid', 'Unit Name' => 'Gallon', 'AllowPrefix' => false], - 'l' => ['Group' => 'Liquid', 'Unit Name' => 'Litre', 'AllowPrefix' => true], - 'lt' => ['Group' => 'Liquid', 'Unit Name' => 'Litre', 'AllowPrefix' => true], - ]; - - /** - * Details of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM(). - * - * @var mixed[] - */ - private static $conversionMultipliers = [ - 'Y' => ['multiplier' => 1E24, 'name' => 'yotta'], - 'Z' => ['multiplier' => 1E21, 'name' => 'zetta'], - 'E' => ['multiplier' => 1E18, 'name' => 'exa'], - 'P' => ['multiplier' => 1E15, 'name' => 'peta'], - 'T' => ['multiplier' => 1E12, 'name' => 'tera'], - 'G' => ['multiplier' => 1E9, 'name' => 'giga'], - 'M' => ['multiplier' => 1E6, 'name' => 'mega'], - 'k' => ['multiplier' => 1E3, 'name' => 'kilo'], - 'h' => ['multiplier' => 1E2, 'name' => 'hecto'], - 'e' => ['multiplier' => 1E1, 'name' => 'deka'], - 'd' => ['multiplier' => 1E-1, 'name' => 'deci'], - 'c' => ['multiplier' => 1E-2, 'name' => 'centi'], - 'm' => ['multiplier' => 1E-3, 'name' => 'milli'], - 'u' => ['multiplier' => 1E-6, 'name' => 'micro'], - 'n' => ['multiplier' => 1E-9, 'name' => 'nano'], - 'p' => ['multiplier' => 1E-12, 'name' => 'pico'], - 'f' => ['multiplier' => 1E-15, 'name' => 'femto'], - 'a' => ['multiplier' => 1E-18, 'name' => 'atto'], - 'z' => ['multiplier' => 1E-21, 'name' => 'zepto'], - 'y' => ['multiplier' => 1E-24, 'name' => 'yocto'], - ]; - - /** - * Details of the Units of measure conversion factors, organised by group. - * - * @var mixed[] - */ - private static $unitConversions = [ - 'Mass' => [ - 'g' => [ - 'g' => 1.0, - 'sg' => 6.85220500053478E-05, - 'lbm' => 2.20462291469134E-03, - 'u' => 6.02217000000000E+23, - 'ozm' => 3.52739718003627E-02, - ], - 'sg' => [ - 'g' => 1.45938424189287E+04, - 'sg' => 1.0, - 'lbm' => 3.21739194101647E+01, - 'u' => 8.78866000000000E+27, - 'ozm' => 5.14782785944229E+02, - ], - 'lbm' => [ - 'g' => 4.5359230974881148E+02, - 'sg' => 3.10810749306493E-02, - 'lbm' => 1.0, - 'u' => 2.73161000000000E+26, - 'ozm' => 1.60000023429410E+01, - ], - 'u' => [ - 'g' => 1.66053100460465E-24, - 'sg' => 1.13782988532950E-28, - 'lbm' => 3.66084470330684E-27, - 'u' => 1.0, - 'ozm' => 5.85735238300524E-26, - ], - 'ozm' => [ - 'g' => 2.83495152079732E+01, - 'sg' => 1.94256689870811E-03, - 'lbm' => 6.24999908478882E-02, - 'u' => 1.70725600000000E+25, - 'ozm' => 1.0, - ], - ], - 'Distance' => [ - 'm' => [ - 'm' => 1.0, - 'mi' => 6.21371192237334E-04, - 'Nmi' => 5.39956803455724E-04, - 'in' => 3.93700787401575E+01, - 'ft' => 3.28083989501312E+00, - 'yd' => 1.09361329797891E+00, - 'ang' => 1.00000000000000E+10, - 'Pica' => 2.83464566929116E+03, - ], - 'mi' => [ - 'm' => 1.60934400000000E+03, - 'mi' => 1.0, - 'Nmi' => 8.68976241900648E-01, - 'in' => 6.33600000000000E+04, - 'ft' => 5.28000000000000E+03, - 'yd' => 1.76000000000000E+03, - 'ang' => 1.60934400000000E+13, - 'Pica' => 4.56191999999971E+06, - ], - 'Nmi' => [ - 'm' => 1.85200000000000E+03, - 'mi' => 1.15077944802354E+00, - 'Nmi' => 1.0, - 'in' => 7.29133858267717E+04, - 'ft' => 6.07611548556430E+03, - 'yd' => 2.02537182785694E+03, - 'ang' => 1.85200000000000E+13, - 'Pica' => 5.24976377952723E+06, - ], - 'in' => [ - 'm' => 2.54000000000000E-02, - 'mi' => 1.57828282828283E-05, - 'Nmi' => 1.37149028077754E-05, - 'in' => 1.0, - 'ft' => 8.33333333333333E-02, - 'yd' => 2.77777777686643E-02, - 'ang' => 2.54000000000000E+08, - 'Pica' => 7.19999999999955E+01, - ], - 'ft' => [ - 'm' => 3.04800000000000E-01, - 'mi' => 1.89393939393939E-04, - 'Nmi' => 1.64578833693305E-04, - 'in' => 1.20000000000000E+01, - 'ft' => 1.0, - 'yd' => 3.33333333223972E-01, - 'ang' => 3.04800000000000E+09, - 'Pica' => 8.63999999999946E+02, - ], - 'yd' => [ - 'm' => 9.14400000300000E-01, - 'mi' => 5.68181818368230E-04, - 'Nmi' => 4.93736501241901E-04, - 'in' => 3.60000000118110E+01, - 'ft' => 3.00000000000000E+00, - 'yd' => 1.0, - 'ang' => 9.14400000300000E+09, - 'Pica' => 2.59200000085023E+03, - ], - 'ang' => [ - 'm' => 1.00000000000000E-10, - 'mi' => 6.21371192237334E-14, - 'Nmi' => 5.39956803455724E-14, - 'in' => 3.93700787401575E-09, - 'ft' => 3.28083989501312E-10, - 'yd' => 1.09361329797891E-10, - 'ang' => 1.0, - 'Pica' => 2.83464566929116E-07, - ], - 'Pica' => [ - 'm' => 3.52777777777800E-04, - 'mi' => 2.19205948372629E-07, - 'Nmi' => 1.90484761219114E-07, - 'in' => 1.38888888888898E-02, - 'ft' => 1.15740740740748E-03, - 'yd' => 3.85802469009251E-04, - 'ang' => 3.52777777777800E+06, - 'Pica' => 1.0, - ], - ], - 'Time' => [ - 'yr' => [ - 'yr' => 1.0, - 'day' => 365.25, - 'hr' => 8766.0, - 'mn' => 525960.0, - 'sec' => 31557600.0, - ], - 'day' => [ - 'yr' => 2.73785078713210E-03, - 'day' => 1.0, - 'hr' => 24.0, - 'mn' => 1440.0, - 'sec' => 86400.0, - ], - 'hr' => [ - 'yr' => 1.14077116130504E-04, - 'day' => 4.16666666666667E-02, - 'hr' => 1.0, - 'mn' => 60.0, - 'sec' => 3600.0, - ], - 'mn' => [ - 'yr' => 1.90128526884174E-06, - 'day' => 6.94444444444444E-04, - 'hr' => 1.66666666666667E-02, - 'mn' => 1.0, - 'sec' => 60.0, - ], - 'sec' => [ - 'yr' => 3.16880878140289E-08, - 'day' => 1.15740740740741E-05, - 'hr' => 2.77777777777778E-04, - 'mn' => 1.66666666666667E-02, - 'sec' => 1.0, - ], - ], - 'Pressure' => [ - 'Pa' => [ - 'Pa' => 1.0, - 'p' => 1.0, - 'atm' => 9.86923299998193E-06, - 'at' => 9.86923299998193E-06, - 'mmHg' => 7.50061707998627E-03, - ], - 'p' => [ - 'Pa' => 1.0, - 'p' => 1.0, - 'atm' => 9.86923299998193E-06, - 'at' => 9.86923299998193E-06, - 'mmHg' => 7.50061707998627E-03, - ], - 'atm' => [ - 'Pa' => 1.01324996583000E+05, - 'p' => 1.01324996583000E+05, - 'atm' => 1.0, - 'at' => 1.0, - 'mmHg' => 760.0, - ], - 'at' => [ - 'Pa' => 1.01324996583000E+05, - 'p' => 1.01324996583000E+05, - 'atm' => 1.0, - 'at' => 1.0, - 'mmHg' => 760.0, - ], - 'mmHg' => [ - 'Pa' => 1.33322363925000E+02, - 'p' => 1.33322363925000E+02, - 'atm' => 1.31578947368421E-03, - 'at' => 1.31578947368421E-03, - 'mmHg' => 1.0, - ], - ], - 'Force' => [ - 'N' => [ - 'N' => 1.0, - 'dyn' => 1.0E+5, - 'dy' => 1.0E+5, - 'lbf' => 2.24808923655339E-01, - ], - 'dyn' => [ - 'N' => 1.0E-5, - 'dyn' => 1.0, - 'dy' => 1.0, - 'lbf' => 2.24808923655339E-06, - ], - 'dy' => [ - 'N' => 1.0E-5, - 'dyn' => 1.0, - 'dy' => 1.0, - 'lbf' => 2.24808923655339E-06, - ], - 'lbf' => [ - 'N' => 4.448222, - 'dyn' => 4.448222E+5, - 'dy' => 4.448222E+5, - 'lbf' => 1.0, - ], - ], - 'Energy' => [ - 'J' => [ - 'J' => 1.0, - 'e' => 9.99999519343231E+06, - 'c' => 2.39006249473467E-01, - 'cal' => 2.38846190642017E-01, - 'eV' => 6.24145700000000E+18, - 'ev' => 6.24145700000000E+18, - 'HPh' => 3.72506430801000E-07, - 'hh' => 3.72506430801000E-07, - 'Wh' => 2.77777916238711E-04, - 'wh' => 2.77777916238711E-04, - 'flb' => 2.37304222192651E+01, - 'BTU' => 9.47815067349015E-04, - 'btu' => 9.47815067349015E-04, - ], - 'e' => [ - 'J' => 1.00000048065700E-07, - 'e' => 1.0, - 'c' => 2.39006364353494E-08, - 'cal' => 2.38846305445111E-08, - 'eV' => 6.24146000000000E+11, - 'ev' => 6.24146000000000E+11, - 'HPh' => 3.72506609848824E-14, - 'hh' => 3.72506609848824E-14, - 'Wh' => 2.77778049754611E-11, - 'wh' => 2.77778049754611E-11, - 'flb' => 2.37304336254586E-06, - 'BTU' => 9.47815522922962E-11, - 'btu' => 9.47815522922962E-11, - ], - 'c' => [ - 'J' => 4.18399101363672E+00, - 'e' => 4.18398900257312E+07, - 'c' => 1.0, - 'cal' => 9.99330315287563E-01, - 'eV' => 2.61142000000000E+19, - 'ev' => 2.61142000000000E+19, - 'HPh' => 1.55856355899327E-06, - 'hh' => 1.55856355899327E-06, - 'Wh' => 1.16222030532950E-03, - 'wh' => 1.16222030532950E-03, - 'flb' => 9.92878733152102E+01, - 'BTU' => 3.96564972437776E-03, - 'btu' => 3.96564972437776E-03, - ], - 'cal' => [ - 'J' => 4.18679484613929E+00, - 'e' => 4.18679283372801E+07, - 'c' => 1.00067013349059E+00, - 'cal' => 1.0, - 'eV' => 2.61317000000000E+19, - 'ev' => 2.61317000000000E+19, - 'HPh' => 1.55960800463137E-06, - 'hh' => 1.55960800463137E-06, - 'Wh' => 1.16299914807955E-03, - 'wh' => 1.16299914807955E-03, - 'flb' => 9.93544094443283E+01, - 'BTU' => 3.96830723907002E-03, - 'btu' => 3.96830723907002E-03, - ], - 'eV' => [ - 'J' => 1.60219000146921E-19, - 'e' => 1.60218923136574E-12, - 'c' => 3.82933423195043E-20, - 'cal' => 3.82676978535648E-20, - 'eV' => 1.0, - 'ev' => 1.0, - 'HPh' => 5.96826078912344E-26, - 'hh' => 5.96826078912344E-26, - 'Wh' => 4.45053000026614E-23, - 'wh' => 4.45053000026614E-23, - 'flb' => 3.80206452103492E-18, - 'BTU' => 1.51857982414846E-22, - 'btu' => 1.51857982414846E-22, - ], - 'ev' => [ - 'J' => 1.60219000146921E-19, - 'e' => 1.60218923136574E-12, - 'c' => 3.82933423195043E-20, - 'cal' => 3.82676978535648E-20, - 'eV' => 1.0, - 'ev' => 1.0, - 'HPh' => 5.96826078912344E-26, - 'hh' => 5.96826078912344E-26, - 'Wh' => 4.45053000026614E-23, - 'wh' => 4.45053000026614E-23, - 'flb' => 3.80206452103492E-18, - 'BTU' => 1.51857982414846E-22, - 'btu' => 1.51857982414846E-22, - ], - 'HPh' => [ - 'J' => 2.68451741316170E+06, - 'e' => 2.68451612283024E+13, - 'c' => 6.41616438565991E+05, - 'cal' => 6.41186757845835E+05, - 'eV' => 1.67553000000000E+25, - 'ev' => 1.67553000000000E+25, - 'HPh' => 1.0, - 'hh' => 1.0, - 'Wh' => 7.45699653134593E+02, - 'wh' => 7.45699653134593E+02, - 'flb' => 6.37047316692964E+07, - 'BTU' => 2.54442605275546E+03, - 'btu' => 2.54442605275546E+03, - ], - 'hh' => [ - 'J' => 2.68451741316170E+06, - 'e' => 2.68451612283024E+13, - 'c' => 6.41616438565991E+05, - 'cal' => 6.41186757845835E+05, - 'eV' => 1.67553000000000E+25, - 'ev' => 1.67553000000000E+25, - 'HPh' => 1.0, - 'hh' => 1.0, - 'Wh' => 7.45699653134593E+02, - 'wh' => 7.45699653134593E+02, - 'flb' => 6.37047316692964E+07, - 'BTU' => 2.54442605275546E+03, - 'btu' => 2.54442605275546E+03, - ], - 'Wh' => [ - 'J' => 3.59999820554720E+03, - 'e' => 3.59999647518369E+10, - 'c' => 8.60422069219046E+02, - 'cal' => 8.59845857713046E+02, - 'eV' => 2.24692340000000E+22, - 'ev' => 2.24692340000000E+22, - 'HPh' => 1.34102248243839E-03, - 'hh' => 1.34102248243839E-03, - 'Wh' => 1.0, - 'wh' => 1.0, - 'flb' => 8.54294774062316E+04, - 'BTU' => 3.41213254164705E+00, - 'btu' => 3.41213254164705E+00, - ], - 'wh' => [ - 'J' => 3.59999820554720E+03, - 'e' => 3.59999647518369E+10, - 'c' => 8.60422069219046E+02, - 'cal' => 8.59845857713046E+02, - 'eV' => 2.24692340000000E+22, - 'ev' => 2.24692340000000E+22, - 'HPh' => 1.34102248243839E-03, - 'hh' => 1.34102248243839E-03, - 'Wh' => 1.0, - 'wh' => 1.0, - 'flb' => 8.54294774062316E+04, - 'BTU' => 3.41213254164705E+00, - 'btu' => 3.41213254164705E+00, - ], - 'flb' => [ - 'J' => 4.21400003236424E-02, - 'e' => 4.21399800687660E+05, - 'c' => 1.00717234301644E-02, - 'cal' => 1.00649785509554E-02, - 'eV' => 2.63015000000000E+17, - 'ev' => 2.63015000000000E+17, - 'HPh' => 1.56974211145130E-08, - 'hh' => 1.56974211145130E-08, - 'Wh' => 1.17055614802000E-05, - 'wh' => 1.17055614802000E-05, - 'flb' => 1.0, - 'BTU' => 3.99409272448406E-05, - 'btu' => 3.99409272448406E-05, - ], - 'BTU' => [ - 'J' => 1.05505813786749E+03, - 'e' => 1.05505763074665E+10, - 'c' => 2.52165488508168E+02, - 'cal' => 2.51996617135510E+02, - 'eV' => 6.58510000000000E+21, - 'ev' => 6.58510000000000E+21, - 'HPh' => 3.93015941224568E-04, - 'hh' => 3.93015941224568E-04, - 'Wh' => 2.93071851047526E-01, - 'wh' => 2.93071851047526E-01, - 'flb' => 2.50369750774671E+04, - 'BTU' => 1.0, - 'btu' => 1.0, - ], - 'btu' => [ - 'J' => 1.05505813786749E+03, - 'e' => 1.05505763074665E+10, - 'c' => 2.52165488508168E+02, - 'cal' => 2.51996617135510E+02, - 'eV' => 6.58510000000000E+21, - 'ev' => 6.58510000000000E+21, - 'HPh' => 3.93015941224568E-04, - 'hh' => 3.93015941224568E-04, - 'Wh' => 2.93071851047526E-01, - 'wh' => 2.93071851047526E-01, - 'flb' => 2.50369750774671E+04, - 'BTU' => 1.0, - 'btu' => 1.0, - ], - ], - 'Power' => [ - 'HP' => [ - 'HP' => 1.0, - 'h' => 1.0, - 'W' => 7.45701000000000E+02, - 'w' => 7.45701000000000E+02, - ], - 'h' => [ - 'HP' => 1.0, - 'h' => 1.0, - 'W' => 7.45701000000000E+02, - 'w' => 7.45701000000000E+02, - ], - 'W' => [ - 'HP' => 1.34102006031908E-03, - 'h' => 1.34102006031908E-03, - 'W' => 1.0, - 'w' => 1.0, - ], - 'w' => [ - 'HP' => 1.34102006031908E-03, - 'h' => 1.34102006031908E-03, - 'W' => 1.0, - 'w' => 1.0, - ], - ], - 'Magnetism' => [ - 'T' => [ - 'T' => 1.0, - 'ga' => 10000.0, - ], - 'ga' => [ - 'T' => 0.0001, - 'ga' => 1.0, - ], - ], - 'Liquid' => [ - 'tsp' => [ - 'tsp' => 1.0, - 'tbs' => 3.33333333333333E-01, - 'oz' => 1.66666666666667E-01, - 'cup' => 2.08333333333333E-02, - 'pt' => 1.04166666666667E-02, - 'us_pt' => 1.04166666666667E-02, - 'uk_pt' => 8.67558516821960E-03, - 'qt' => 5.20833333333333E-03, - 'gal' => 1.30208333333333E-03, - 'l' => 4.92999408400710E-03, - 'lt' => 4.92999408400710E-03, - ], - 'tbs' => [ - 'tsp' => 3.00000000000000E+00, - 'tbs' => 1.0, - 'oz' => 5.00000000000000E-01, - 'cup' => 6.25000000000000E-02, - 'pt' => 3.12500000000000E-02, - 'us_pt' => 3.12500000000000E-02, - 'uk_pt' => 2.60267555046588E-02, - 'qt' => 1.56250000000000E-02, - 'gal' => 3.90625000000000E-03, - 'l' => 1.47899822520213E-02, - 'lt' => 1.47899822520213E-02, - ], - 'oz' => [ - 'tsp' => 6.00000000000000E+00, - 'tbs' => 2.00000000000000E+00, - 'oz' => 1.0, - 'cup' => 1.25000000000000E-01, - 'pt' => 6.25000000000000E-02, - 'us_pt' => 6.25000000000000E-02, - 'uk_pt' => 5.20535110093176E-02, - 'qt' => 3.12500000000000E-02, - 'gal' => 7.81250000000000E-03, - 'l' => 2.95799645040426E-02, - 'lt' => 2.95799645040426E-02, - ], - 'cup' => [ - 'tsp' => 4.80000000000000E+01, - 'tbs' => 1.60000000000000E+01, - 'oz' => 8.00000000000000E+00, - 'cup' => 1.0, - 'pt' => 5.00000000000000E-01, - 'us_pt' => 5.00000000000000E-01, - 'uk_pt' => 4.16428088074541E-01, - 'qt' => 2.50000000000000E-01, - 'gal' => 6.25000000000000E-02, - 'l' => 2.36639716032341E-01, - 'lt' => 2.36639716032341E-01, - ], - 'pt' => [ - 'tsp' => 9.60000000000000E+01, - 'tbs' => 3.20000000000000E+01, - 'oz' => 1.60000000000000E+01, - 'cup' => 2.00000000000000E+00, - 'pt' => 1.0, - 'us_pt' => 1.0, - 'uk_pt' => 8.32856176149081E-01, - 'qt' => 5.00000000000000E-01, - 'gal' => 1.25000000000000E-01, - 'l' => 4.73279432064682E-01, - 'lt' => 4.73279432064682E-01, - ], - 'us_pt' => [ - 'tsp' => 9.60000000000000E+01, - 'tbs' => 3.20000000000000E+01, - 'oz' => 1.60000000000000E+01, - 'cup' => 2.00000000000000E+00, - 'pt' => 1.0, - 'us_pt' => 1.0, - 'uk_pt' => 8.32856176149081E-01, - 'qt' => 5.00000000000000E-01, - 'gal' => 1.25000000000000E-01, - 'l' => 4.73279432064682E-01, - 'lt' => 4.73279432064682E-01, - ], - 'uk_pt' => [ - 'tsp' => 1.15266000000000E+02, - 'tbs' => 3.84220000000000E+01, - 'oz' => 1.92110000000000E+01, - 'cup' => 2.40137500000000E+00, - 'pt' => 1.20068750000000E+00, - 'us_pt' => 1.20068750000000E+00, - 'uk_pt' => 1.0, - 'qt' => 6.00343750000000E-01, - 'gal' => 1.50085937500000E-01, - 'l' => 5.68260698087162E-01, - 'lt' => 5.68260698087162E-01, - ], - 'qt' => [ - 'tsp' => 1.92000000000000E+02, - 'tbs' => 6.40000000000000E+01, - 'oz' => 3.20000000000000E+01, - 'cup' => 4.00000000000000E+00, - 'pt' => 2.00000000000000E+00, - 'us_pt' => 2.00000000000000E+00, - 'uk_pt' => 1.66571235229816E+00, - 'qt' => 1.0, - 'gal' => 2.50000000000000E-01, - 'l' => 9.46558864129363E-01, - 'lt' => 9.46558864129363E-01, - ], - 'gal' => [ - 'tsp' => 7.68000000000000E+02, - 'tbs' => 2.56000000000000E+02, - 'oz' => 1.28000000000000E+02, - 'cup' => 1.60000000000000E+01, - 'pt' => 8.00000000000000E+00, - 'us_pt' => 8.00000000000000E+00, - 'uk_pt' => 6.66284940919265E+00, - 'qt' => 4.00000000000000E+00, - 'gal' => 1.0, - 'l' => 3.78623545651745E+00, - 'lt' => 3.78623545651745E+00, - ], - 'l' => [ - 'tsp' => 2.02840000000000E+02, - 'tbs' => 6.76133333333333E+01, - 'oz' => 3.38066666666667E+01, - 'cup' => 4.22583333333333E+00, - 'pt' => 2.11291666666667E+00, - 'us_pt' => 2.11291666666667E+00, - 'uk_pt' => 1.75975569552166E+00, - 'qt' => 1.05645833333333E+00, - 'gal' => 2.64114583333333E-01, - 'l' => 1.0, - 'lt' => 1.0, - ], - 'lt' => [ - 'tsp' => 2.02840000000000E+02, - 'tbs' => 6.76133333333333E+01, - 'oz' => 3.38066666666667E+01, - 'cup' => 4.22583333333333E+00, - 'pt' => 2.11291666666667E+00, - 'us_pt' => 2.11291666666667E+00, - 'uk_pt' => 1.75975569552166E+00, - 'qt' => 1.05645833333333E+00, - 'gal' => 2.64114583333333E-01, - 'l' => 1.0, - 'lt' => 1.0, - ], - ], - ]; - - /** - * parseComplex. - * - * Parses a complex number into its real and imaginary parts, and an I or J suffix - * - * @deprecated 2.0.0 No longer used by internal code. Please use the Complex\Complex class instead - * - * @param string $complexNumber The complex number - * - * @return mixed[] Indexed on "real", "imaginary" and "suffix" - */ - public static function parseComplex($complexNumber) - { - $complex = new Complex($complexNumber); - - return [ - 'real' => $complex->getReal(), - 'imaginary' => $complex->getImaginary(), - 'suffix' => $complex->getSuffix(), - ]; - } - - /** - * Formats a number base string value with leading zeroes. - * - * @param string $xVal The "number" to pad - * @param int $places The length that we want to pad this value - * - * @return string The padded "number" - */ - private static function nbrConversionFormat($xVal, $places) - { - if ($places !== null) { - if (is_numeric($places)) { - $places = (int) $places; - } else { - return Functions::VALUE(); - } - if ($places < 0) { - return Functions::NAN(); - } - if (strlen($xVal) <= $places) { - return substr(str_pad($xVal, $places, '0', STR_PAD_LEFT), -10); - } - - return Functions::NAN(); - } - - return substr($xVal, -10); - } - - /** - * BESSELI. - * - * Returns the modified Bessel function In(x), which is equivalent to the Bessel function evaluated - * for purely imaginary arguments - * - * Excel Function: - * BESSELI(x,ord) - * - * @param float $x The value at which to evaluate the function. - * If x is nonnumeric, BESSELI returns the #VALUE! error value. - * @param int $ord The order of the Bessel function. - * If ord is not an integer, it is truncated. - * If $ord is nonnumeric, BESSELI returns the #VALUE! error value. - * If $ord < 0, BESSELI returns the #NUM! error value. - * - * @return float|string Result, or a string containing an error - */ - public static function BESSELI($x, $ord) - { - $x = ($x === null) ? 0.0 : Functions::flattenSingleValue($x); - $ord = ($ord === null) ? 0.0 : Functions::flattenSingleValue($ord); - - if ((is_numeric($x)) && (is_numeric($ord))) { - $ord = floor($ord); - if ($ord < 0) { - return Functions::NAN(); - } - - if (abs($x) <= 30) { - $fResult = $fTerm = ($x / 2) ** $ord / MathTrig::FACT($ord); - $ordK = 1; - $fSqrX = ($x * $x) / 4; - do { - $fTerm *= $fSqrX; - $fTerm /= ($ordK * ($ordK + $ord)); - $fResult += $fTerm; - } while ((abs($fTerm) > 1e-12) && (++$ordK < 100)); - } else { - $f_2_PI = 2 * M_PI; - - $fXAbs = abs($x); - $fResult = exp($fXAbs) / sqrt($f_2_PI * $fXAbs); - if (($ord & 1) && ($x < 0)) { - $fResult = -$fResult; - } - } - - return (is_nan($fResult)) ? Functions::NAN() : $fResult; - } - - return Functions::VALUE(); - } - - /** - * BESSELJ. - * - * Returns the Bessel function - * - * Excel Function: - * BESSELJ(x,ord) - * - * @param float $x The value at which to evaluate the function. - * If x is nonnumeric, BESSELJ returns the #VALUE! error value. - * @param int $ord The order of the Bessel function. If n is not an integer, it is truncated. - * If $ord is nonnumeric, BESSELJ returns the #VALUE! error value. - * If $ord < 0, BESSELJ returns the #NUM! error value. - * - * @return float|string Result, or a string containing an error - */ - public static function BESSELJ($x, $ord) - { - $x = ($x === null) ? 0.0 : Functions::flattenSingleValue($x); - $ord = ($ord === null) ? 0.0 : Functions::flattenSingleValue($ord); - - if ((is_numeric($x)) && (is_numeric($ord))) { - $ord = floor($ord); - if ($ord < 0) { - return Functions::NAN(); - } - - $fResult = 0; - if (abs($x) <= 30) { - $fResult = $fTerm = ($x / 2) ** $ord / MathTrig::FACT($ord); - $ordK = 1; - $fSqrX = ($x * $x) / -4; - do { - $fTerm *= $fSqrX; - $fTerm /= ($ordK * ($ordK + $ord)); - $fResult += $fTerm; - } while ((abs($fTerm) > 1e-12) && (++$ordK < 100)); - } else { - $f_PI_DIV_2 = M_PI / 2; - $f_PI_DIV_4 = M_PI / 4; - - $fXAbs = abs($x); - $fResult = sqrt(Functions::M_2DIVPI / $fXAbs) * cos($fXAbs - $ord * $f_PI_DIV_2 - $f_PI_DIV_4); - if (($ord & 1) && ($x < 0)) { - $fResult = -$fResult; - } - } - - return (is_nan($fResult)) ? Functions::NAN() : $fResult; - } - - return Functions::VALUE(); - } - - private static function besselK0($fNum) - { - if ($fNum <= 2) { - $fNum2 = $fNum * 0.5; - $y = ($fNum2 * $fNum2); - $fRet = -log($fNum2) * self::BESSELI($fNum, 0) + - (-0.57721566 + $y * (0.42278420 + $y * (0.23069756 + $y * (0.3488590e-1 + $y * (0.262698e-2 + $y * - (0.10750e-3 + $y * 0.74e-5)))))); - } else { - $y = 2 / $fNum; - $fRet = exp(-$fNum) / sqrt($fNum) * - (1.25331414 + $y * (-0.7832358e-1 + $y * (0.2189568e-1 + $y * (-0.1062446e-1 + $y * - (0.587872e-2 + $y * (-0.251540e-2 + $y * 0.53208e-3)))))); - } - - return $fRet; - } - - private static function besselK1($fNum) - { - if ($fNum <= 2) { - $fNum2 = $fNum * 0.5; - $y = ($fNum2 * $fNum2); - $fRet = log($fNum2) * self::BESSELI($fNum, 1) + - (1 + $y * (0.15443144 + $y * (-0.67278579 + $y * (-0.18156897 + $y * (-0.1919402e-1 + $y * - (-0.110404e-2 + $y * (-0.4686e-4))))))) / $fNum; - } else { - $y = 2 / $fNum; - $fRet = exp(-$fNum) / sqrt($fNum) * - (1.25331414 + $y * (0.23498619 + $y * (-0.3655620e-1 + $y * (0.1504268e-1 + $y * (-0.780353e-2 + $y * - (0.325614e-2 + $y * (-0.68245e-3))))))); - } - - return $fRet; - } - - /** - * BESSELK. - * - * Returns the modified Bessel function Kn(x), which is equivalent to the Bessel functions evaluated - * for purely imaginary arguments. - * - * Excel Function: - * BESSELK(x,ord) - * - * @param float $x The value at which to evaluate the function. - * If x is nonnumeric, BESSELK returns the #VALUE! error value. - * @param int $ord The order of the Bessel function. If n is not an integer, it is truncated. - * If $ord is nonnumeric, BESSELK returns the #VALUE! error value. - * If $ord < 0, BESSELK returns the #NUM! error value. - * - * @return float|string Result, or a string containing an error - */ - public static function BESSELK($x, $ord) - { - $x = ($x === null) ? 0.0 : Functions::flattenSingleValue($x); - $ord = ($ord === null) ? 0.0 : Functions::flattenSingleValue($ord); - - if ((is_numeric($x)) && (is_numeric($ord))) { - if (($ord < 0) || ($x == 0.0)) { - return Functions::NAN(); - } - - switch (floor($ord)) { - case 0: - $fBk = self::besselK0($x); - - break; - case 1: - $fBk = self::besselK1($x); - - break; - default: - $fTox = 2 / $x; - $fBkm = self::besselK0($x); - $fBk = self::besselK1($x); - for ($n = 1; $n < $ord; ++$n) { - $fBkp = $fBkm + $n * $fTox * $fBk; - $fBkm = $fBk; - $fBk = $fBkp; - } - } - - return (is_nan($fBk)) ? Functions::NAN() : $fBk; - } - - return Functions::VALUE(); - } - - private static function besselY0($fNum) - { - if ($fNum < 8.0) { - $y = ($fNum * $fNum); - $f1 = -2957821389.0 + $y * (7062834065.0 + $y * (-512359803.6 + $y * (10879881.29 + $y * (-86327.92757 + $y * 228.4622733)))); - $f2 = 40076544269.0 + $y * (745249964.8 + $y * (7189466.438 + $y * (47447.26470 + $y * (226.1030244 + $y)))); - $fRet = $f1 / $f2 + 0.636619772 * self::BESSELJ($fNum, 0) * log($fNum); - } else { - $z = 8.0 / $fNum; - $y = ($z * $z); - $xx = $fNum - 0.785398164; - $f1 = 1 + $y * (-0.1098628627e-2 + $y * (0.2734510407e-4 + $y * (-0.2073370639e-5 + $y * 0.2093887211e-6))); - $f2 = -0.1562499995e-1 + $y * (0.1430488765e-3 + $y * (-0.6911147651e-5 + $y * (0.7621095161e-6 + $y * (-0.934945152e-7)))); - $fRet = sqrt(0.636619772 / $fNum) * (sin($xx) * $f1 + $z * cos($xx) * $f2); - } - - return $fRet; - } - - private static function besselY1($fNum) - { - if ($fNum < 8.0) { - $y = ($fNum * $fNum); - $f1 = $fNum * (-0.4900604943e13 + $y * (0.1275274390e13 + $y * (-0.5153438139e11 + $y * (0.7349264551e9 + $y * - (-0.4237922726e7 + $y * 0.8511937935e4))))); - $f2 = 0.2499580570e14 + $y * (0.4244419664e12 + $y * (0.3733650367e10 + $y * (0.2245904002e8 + $y * - (0.1020426050e6 + $y * (0.3549632885e3 + $y))))); - $fRet = $f1 / $f2 + 0.636619772 * (self::BESSELJ($fNum, 1) * log($fNum) - 1 / $fNum); - } else { - $fRet = sqrt(0.636619772 / $fNum) * sin($fNum - 2.356194491); - } - - return $fRet; - } - - /** - * BESSELY. - * - * Returns the Bessel function, which is also called the Weber function or the Neumann function. - * - * Excel Function: - * BESSELY(x,ord) - * - * @param float $x The value at which to evaluate the function. - * If x is nonnumeric, BESSELK returns the #VALUE! error value. - * @param int $ord The order of the Bessel function. If n is not an integer, it is truncated. - * If $ord is nonnumeric, BESSELK returns the #VALUE! error value. - * If $ord < 0, BESSELK returns the #NUM! error value. - * - * @return float|string Result, or a string containing an error - */ - public static function BESSELY($x, $ord) - { - $x = ($x === null) ? 0.0 : Functions::flattenSingleValue($x); - $ord = ($ord === null) ? 0.0 : Functions::flattenSingleValue($ord); - - if ((is_numeric($x)) && (is_numeric($ord))) { - if (($ord < 0) || ($x == 0.0)) { - return Functions::NAN(); - } - - switch (floor($ord)) { - case 0: - $fBy = self::besselY0($x); - - break; - case 1: - $fBy = self::besselY1($x); - - break; - default: - $fTox = 2 / $x; - $fBym = self::besselY0($x); - $fBy = self::besselY1($x); - for ($n = 1; $n < $ord; ++$n) { - $fByp = $n * $fTox * $fBy - $fBym; - $fBym = $fBy; - $fBy = $fByp; - } - } - - return (is_nan($fBy)) ? Functions::NAN() : $fBy; - } - - return Functions::VALUE(); - } - - /** - * BINTODEC. - * - * Return a binary value as decimal. - * - * Excel Function: - * BIN2DEC(x) - * - * @param string $x The binary number (as a string) that you want to convert. The number - * cannot contain more than 10 characters (10 bits). The most significant - * bit of number is the sign bit. The remaining 9 bits are magnitude bits. - * Negative numbers are represented using two's-complement notation. - * If number is not a valid binary number, or if number contains more than - * 10 characters (10 bits), BIN2DEC returns the #NUM! error value. - * - * @return string - */ - public static function BINTODEC($x) - { - $x = Functions::flattenSingleValue($x); - - if (is_bool($x)) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) { - $x = (int) $x; - } else { - return Functions::VALUE(); - } - } - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) { - $x = floor($x); - } - $x = (string) $x; - if (strlen($x) > preg_match_all('/[01]/', $x, $out)) { - return Functions::NAN(); - } - if (strlen($x) > 10) { - return Functions::NAN(); - } elseif (strlen($x) == 10) { - // Two's Complement - $x = substr($x, -9); - - return '-' . (512 - bindec($x)); - } - - return bindec($x); - } - - /** - * BINTOHEX. - * - * Return a binary value as hex. - * - * Excel Function: - * BIN2HEX(x[,places]) - * - * @param string $x The binary number (as a string) that you want to convert. The number - * cannot contain more than 10 characters (10 bits). The most significant - * bit of number is the sign bit. The remaining 9 bits are magnitude bits. - * Negative numbers are represented using two's-complement notation. - * If number is not a valid binary number, or if number contains more than - * 10 characters (10 bits), BIN2HEX returns the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, BIN2HEX uses the - * minimum number of characters necessary. Places is useful for padding the - * return value with leading 0s (zeros). - * If places is not an integer, it is truncated. - * If places is nonnumeric, BIN2HEX returns the #VALUE! error value. - * If places is negative, BIN2HEX returns the #NUM! error value. - * - * @return string - */ - public static function BINTOHEX($x, $places = null) - { - $x = Functions::flattenSingleValue($x); - $places = Functions::flattenSingleValue($places); - - // Argument X - if (is_bool($x)) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) { - $x = (int) $x; - } else { - return Functions::VALUE(); - } - } - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) { - $x = floor($x); - } - $x = (string) $x; - if (strlen($x) > preg_match_all('/[01]/', $x, $out)) { - return Functions::NAN(); - } - if (strlen($x) > 10) { - return Functions::NAN(); - } elseif (strlen($x) == 10) { - // Two's Complement - return str_repeat('F', 8) . substr(strtoupper(dechex(bindec(substr($x, -9)))), -2); - } - $hexVal = (string) strtoupper(dechex(bindec($x))); - - return self::nbrConversionFormat($hexVal, $places); - } - - /** - * BINTOOCT. - * - * Return a binary value as octal. - * - * Excel Function: - * BIN2OCT(x[,places]) - * - * @param string $x The binary number (as a string) that you want to convert. The number - * cannot contain more than 10 characters (10 bits). The most significant - * bit of number is the sign bit. The remaining 9 bits are magnitude bits. - * Negative numbers are represented using two's-complement notation. - * If number is not a valid binary number, or if number contains more than - * 10 characters (10 bits), BIN2OCT returns the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, BIN2OCT uses the - * minimum number of characters necessary. Places is useful for padding the - * return value with leading 0s (zeros). - * If places is not an integer, it is truncated. - * If places is nonnumeric, BIN2OCT returns the #VALUE! error value. - * If places is negative, BIN2OCT returns the #NUM! error value. - * - * @return string - */ - public static function BINTOOCT($x, $places = null) - { - $x = Functions::flattenSingleValue($x); - $places = Functions::flattenSingleValue($places); - - if (is_bool($x)) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) { - $x = (int) $x; - } else { - return Functions::VALUE(); - } - } - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) { - $x = floor($x); - } - $x = (string) $x; - if (strlen($x) > preg_match_all('/[01]/', $x, $out)) { - return Functions::NAN(); - } - if (strlen($x) > 10) { - return Functions::NAN(); - } elseif (strlen($x) == 10) { - // Two's Complement - return str_repeat('7', 7) . substr(strtoupper(decoct(bindec(substr($x, -9)))), -3); - } - $octVal = (string) decoct(bindec($x)); - - return self::nbrConversionFormat($octVal, $places); - } - - /** - * DECTOBIN. - * - * Return a decimal value as binary. - * - * Excel Function: - * DEC2BIN(x[,places]) - * - * @param string $x The decimal integer you want to convert. If number is negative, - * valid place values are ignored and DEC2BIN returns a 10-character - * (10-bit) binary number in which the most significant bit is the sign - * bit. The remaining 9 bits are magnitude bits. Negative numbers are - * represented using two's-complement notation. - * If number < -512 or if number > 511, DEC2BIN returns the #NUM! error - * value. - * If number is nonnumeric, DEC2BIN returns the #VALUE! error value. - * If DEC2BIN requires more than places characters, it returns the #NUM! - * error value. - * @param int $places The number of characters to use. If places is omitted, DEC2BIN uses - * the minimum number of characters necessary. Places is useful for - * padding the return value with leading 0s (zeros). - * If places is not an integer, it is truncated. - * If places is nonnumeric, DEC2BIN returns the #VALUE! error value. - * If places is zero or negative, DEC2BIN returns the #NUM! error value. - * - * @return string - */ - public static function DECTOBIN($x, $places = null) - { - $x = Functions::flattenSingleValue($x); - $places = Functions::flattenSingleValue($places); - - if (is_bool($x)) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) { - $x = (int) $x; - } else { - return Functions::VALUE(); - } - } - $x = (string) $x; - if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) { - return Functions::VALUE(); - } - - $x = (string) floor($x); - if ($x < -512 || $x > 511) { - return Functions::NAN(); - } - - $r = decbin($x); - // Two's Complement - $r = substr($r, -10); - if (strlen($r) >= 11) { - return Functions::NAN(); - } - - return self::nbrConversionFormat($r, $places); - } - - /** - * DECTOHEX. - * - * Return a decimal value as hex. - * - * Excel Function: - * DEC2HEX(x[,places]) - * - * @param string $x The decimal integer you want to convert. If number is negative, - * places is ignored and DEC2HEX returns a 10-character (40-bit) - * hexadecimal number in which the most significant bit is the sign - * bit. The remaining 39 bits are magnitude bits. Negative numbers - * are represented using two's-complement notation. - * If number < -549,755,813,888 or if number > 549,755,813,887, - * DEC2HEX returns the #NUM! error value. - * If number is nonnumeric, DEC2HEX returns the #VALUE! error value. - * If DEC2HEX requires more than places characters, it returns the - * #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, DEC2HEX uses - * the minimum number of characters necessary. Places is useful for - * padding the return value with leading 0s (zeros). - * If places is not an integer, it is truncated. - * If places is nonnumeric, DEC2HEX returns the #VALUE! error value. - * If places is zero or negative, DEC2HEX returns the #NUM! error value. - * - * @return string - */ - public static function DECTOHEX($x, $places = null) - { - $x = Functions::flattenSingleValue($x); - $places = Functions::flattenSingleValue($places); - - if (is_bool($x)) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) { - $x = (int) $x; - } else { - return Functions::VALUE(); - } - } - $x = (string) $x; - if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) { - return Functions::VALUE(); - } - $x = (string) floor($x); - $r = strtoupper(dechex($x)); - if (strlen($r) == 8) { - // Two's Complement - $r = 'FF' . $r; - } - - return self::nbrConversionFormat($r, $places); - } - - /** - * DECTOOCT. - * - * Return an decimal value as octal. - * - * Excel Function: - * DEC2OCT(x[,places]) - * - * @param string $x The decimal integer you want to convert. If number is negative, - * places is ignored and DEC2OCT returns a 10-character (30-bit) - * octal number in which the most significant bit is the sign bit. - * The remaining 29 bits are magnitude bits. Negative numbers are - * represented using two's-complement notation. - * If number < -536,870,912 or if number > 536,870,911, DEC2OCT - * returns the #NUM! error value. - * If number is nonnumeric, DEC2OCT returns the #VALUE! error value. - * If DEC2OCT requires more than places characters, it returns the - * #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, DEC2OCT uses - * the minimum number of characters necessary. Places is useful for - * padding the return value with leading 0s (zeros). - * If places is not an integer, it is truncated. - * If places is nonnumeric, DEC2OCT returns the #VALUE! error value. - * If places is zero or negative, DEC2OCT returns the #NUM! error value. - * - * @return string - */ - public static function DECTOOCT($x, $places = null) - { - $xorig = $x; - $x = Functions::flattenSingleValue($x); - $places = Functions::flattenSingleValue($places); - - if (is_bool($x)) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) { - $x = (int) $x; - } else { - return Functions::VALUE(); - } - } - $x = (string) $x; - if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) { - return Functions::VALUE(); - } - $x = (string) floor($x); - $r = decoct($x); - if (strlen($r) == 11) { - // Two's Complement - $r = substr($r, -10); - } - - return self::nbrConversionFormat($r, $places); - } - - /** - * HEXTOBIN. - * - * Return a hex value as binary. - * - * Excel Function: - * HEX2BIN(x[,places]) - * - * @param string $x the hexadecimal number you want to convert. - * Number cannot contain more than 10 characters. - * The most significant bit of number is the sign bit (40th bit from the right). - * The remaining 9 bits are magnitude bits. - * Negative numbers are represented using two's-complement notation. - * If number is negative, HEX2BIN ignores places and returns a 10-character binary number. - * If number is negative, it cannot be less than FFFFFFFE00, - * and if number is positive, it cannot be greater than 1FF. - * If number is not a valid hexadecimal number, HEX2BIN returns the #NUM! error value. - * If HEX2BIN requires more than places characters, it returns the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, - * HEX2BIN uses the minimum number of characters necessary. Places - * is useful for padding the return value with leading 0s (zeros). - * If places is not an integer, it is truncated. - * If places is nonnumeric, HEX2BIN returns the #VALUE! error value. - * If places is negative, HEX2BIN returns the #NUM! error value. - * - * @return string - */ - public static function HEXTOBIN($x, $places = null) - { - $x = Functions::flattenSingleValue($x); - $places = Functions::flattenSingleValue($places); - - if (is_bool($x)) { - return Functions::VALUE(); - } - $x = (string) $x; - if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) { - return Functions::NAN(); - } - - return self::DECTOBIN(self::HEXTODEC($x), $places); - } - - /** - * HEXTODEC. - * - * Return a hex value as decimal. - * - * Excel Function: - * HEX2DEC(x) - * - * @param string $x The hexadecimal number you want to convert. This number cannot - * contain more than 10 characters (40 bits). The most significant - * bit of number is the sign bit. The remaining 39 bits are magnitude - * bits. Negative numbers are represented using two's-complement - * notation. - * If number is not a valid hexadecimal number, HEX2DEC returns the - * #NUM! error value. - * - * @return string - */ - public static function HEXTODEC($x) - { - $x = Functions::flattenSingleValue($x); - - if (is_bool($x)) { - return Functions::VALUE(); - } - $x = (string) $x; - if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) { - return Functions::NAN(); - } - - if (strlen($x) > 10) { - return Functions::NAN(); - } - - $binX = ''; - foreach (str_split($x) as $char) { - $binX .= str_pad(base_convert($char, 16, 2), 4, '0', STR_PAD_LEFT); - } - if (strlen($binX) == 40 && $binX[0] == '1') { - for ($i = 0; $i < 40; ++$i) { - $binX[$i] = ($binX[$i] == '1' ? '0' : '1'); - } - - return (bindec($binX) + 1) * -1; - } - - return bindec($binX); - } - - /** - * HEXTOOCT. - * - * Return a hex value as octal. - * - * Excel Function: - * HEX2OCT(x[,places]) - * - * @param string $x The hexadecimal number you want to convert. Number cannot - * contain more than 10 characters. The most significant bit of - * number is the sign bit. The remaining 39 bits are magnitude - * bits. Negative numbers are represented using two's-complement - * notation. - * If number is negative, HEX2OCT ignores places and returns a - * 10-character octal number. - * If number is negative, it cannot be less than FFE0000000, and - * if number is positive, it cannot be greater than 1FFFFFFF. - * If number is not a valid hexadecimal number, HEX2OCT returns - * the #NUM! error value. - * If HEX2OCT requires more than places characters, it returns - * the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, HEX2OCT - * uses the minimum number of characters necessary. Places is - * useful for padding the return value with leading 0s (zeros). - * If places is not an integer, it is truncated. - * If places is nonnumeric, HEX2OCT returns the #VALUE! error - * value. - * If places is negative, HEX2OCT returns the #NUM! error value. - * - * @return string - */ - public static function HEXTOOCT($x, $places = null) - { - $x = Functions::flattenSingleValue($x); - $places = Functions::flattenSingleValue($places); - - if (is_bool($x)) { - return Functions::VALUE(); - } - $x = (string) $x; - if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) { - return Functions::NAN(); - } - - $decimal = self::HEXTODEC($x); - if ($decimal < -536870912 || $decimal > 536870911) { - return Functions::NAN(); - } - - return self::DECTOOCT($decimal, $places); - } - - /** - * OCTTOBIN. - * - * Return an octal value as binary. - * - * Excel Function: - * OCT2BIN(x[,places]) - * - * @param string $x The octal number you want to convert. Number may not - * contain more than 10 characters. The most significant - * bit of number is the sign bit. The remaining 29 bits - * are magnitude bits. Negative numbers are represented - * using two's-complement notation. - * If number is negative, OCT2BIN ignores places and returns - * a 10-character binary number. - * If number is negative, it cannot be less than 7777777000, - * and if number is positive, it cannot be greater than 777. - * If number is not a valid octal number, OCT2BIN returns - * the #NUM! error value. - * If OCT2BIN requires more than places characters, it - * returns the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, - * OCT2BIN uses the minimum number of characters necessary. - * Places is useful for padding the return value with - * leading 0s (zeros). - * If places is not an integer, it is truncated. - * If places is nonnumeric, OCT2BIN returns the #VALUE! - * error value. - * If places is negative, OCT2BIN returns the #NUM! error - * value. - * - * @return string - */ - public static function OCTTOBIN($x, $places = null) - { - $x = Functions::flattenSingleValue($x); - $places = Functions::flattenSingleValue($places); - - if (is_bool($x)) { - return Functions::VALUE(); - } - $x = (string) $x; - if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) { - return Functions::NAN(); - } - - return self::DECTOBIN(self::OCTTODEC($x), $places); - } - - /** - * OCTTODEC. - * - * Return an octal value as decimal. - * - * Excel Function: - * OCT2DEC(x) - * - * @param string $x The octal number you want to convert. Number may not contain - * more than 10 octal characters (30 bits). The most significant - * bit of number is the sign bit. The remaining 29 bits are - * magnitude bits. Negative numbers are represented using - * two's-complement notation. - * If number is not a valid octal number, OCT2DEC returns the - * #NUM! error value. - * - * @return string - */ - public static function OCTTODEC($x) - { - $x = Functions::flattenSingleValue($x); - - if (is_bool($x)) { - return Functions::VALUE(); - } - $x = (string) $x; - if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) { - return Functions::NAN(); - } - $binX = ''; - foreach (str_split($x) as $char) { - $binX .= str_pad(decbin((int) $char), 3, '0', STR_PAD_LEFT); - } - if (strlen($binX) == 30 && $binX[0] == '1') { - for ($i = 0; $i < 30; ++$i) { - $binX[$i] = ($binX[$i] == '1' ? '0' : '1'); - } - - return (bindec($binX) + 1) * -1; - } - - return bindec($binX); - } - - /** - * OCTTOHEX. - * - * Return an octal value as hex. - * - * Excel Function: - * OCT2HEX(x[,places]) - * - * @param string $x The octal number you want to convert. Number may not contain - * more than 10 octal characters (30 bits). The most significant - * bit of number is the sign bit. The remaining 29 bits are - * magnitude bits. Negative numbers are represented using - * two's-complement notation. - * If number is negative, OCT2HEX ignores places and returns a - * 10-character hexadecimal number. - * If number is not a valid octal number, OCT2HEX returns the - * #NUM! error value. - * If OCT2HEX requires more than places characters, it returns - * the #NUM! error value. - * @param int $places The number of characters to use. If places is omitted, OCT2HEX - * uses the minimum number of characters necessary. Places is useful - * for padding the return value with leading 0s (zeros). - * If places is not an integer, it is truncated. - * If places is nonnumeric, OCT2HEX returns the #VALUE! error value. - * If places is negative, OCT2HEX returns the #NUM! error value. - * - * @return string - */ - public static function OCTTOHEX($x, $places = null) - { - $x = Functions::flattenSingleValue($x); - $places = Functions::flattenSingleValue($places); - - if (is_bool($x)) { - return Functions::VALUE(); - } - $x = (string) $x; - if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) { - return Functions::NAN(); - } - $hexVal = strtoupper(dechex(self::OCTTODEC($x))); - - return self::nbrConversionFormat($hexVal, $places); - } - - /** - * COMPLEX. - * - * Converts real and imaginary coefficients into a complex number of the form x +/- yi or x +/- yj. - * - * Excel Function: - * COMPLEX(realNumber,imaginary[,suffix]) - * - * @param float $realNumber the real coefficient of the complex number - * @param float $imaginary the imaginary coefficient of the complex number - * @param string $suffix The suffix for the imaginary component of the complex number. - * If omitted, the suffix is assumed to be "i". - * - * @return string - */ - public static function COMPLEX($realNumber = 0.0, $imaginary = 0.0, $suffix = 'i') - { - $realNumber = ($realNumber === null) ? 0.0 : Functions::flattenSingleValue($realNumber); - $imaginary = ($imaginary === null) ? 0.0 : Functions::flattenSingleValue($imaginary); - $suffix = ($suffix === null) ? 'i' : Functions::flattenSingleValue($suffix); - - if ( - ((is_numeric($realNumber)) && (is_numeric($imaginary))) && - (($suffix == 'i') || ($suffix == 'j') || ($suffix == '')) - ) { - $complex = new Complex($realNumber, $imaginary, $suffix); - - return (string) $complex; - } - - return Functions::VALUE(); - } - - /** - * IMAGINARY. - * - * Returns the imaginary coefficient of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMAGINARY(complexNumber) - * - * @param string $complexNumber the complex number for which you want the imaginary - * coefficient - * - * @return float - */ - public static function IMAGINARY($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (new Complex($complexNumber))->getImaginary(); - } - - /** - * IMREAL. - * - * Returns the real coefficient of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMREAL(complexNumber) - * - * @param string $complexNumber the complex number for which you want the real coefficient - * - * @return float - */ - public static function IMREAL($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (new Complex($complexNumber))->getReal(); - } - - /** - * IMABS. - * - * Returns the absolute value (modulus) of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMABS(complexNumber) - * - * @param string $complexNumber the complex number for which you want the absolute value - * - * @return float - */ - public static function IMABS($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (new Complex($complexNumber))->abs(); - } - - /** - * IMARGUMENT. - * - * Returns the argument theta of a complex number, i.e. the angle in radians from the real - * axis to the representation of the number in polar coordinates. - * - * Excel Function: - * IMARGUMENT(complexNumber) - * - * @param string $complexNumber the complex number for which you want the argument theta - * - * @return float|string - */ - public static function IMARGUMENT($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - $complex = new Complex($complexNumber); - if ($complex->getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return Functions::DIV0(); - } - - return $complex->argument(); - } - - /** - * IMCONJUGATE. - * - * Returns the complex conjugate of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMCONJUGATE(complexNumber) - * - * @param string $complexNumber the complex number for which you want the conjugate - * - * @return string - */ - public static function IMCONJUGATE($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->conjugate(); - } - - /** - * IMCOS. - * - * Returns the cosine of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMCOS(complexNumber) - * - * @param string $complexNumber the complex number for which you want the cosine - * - * @return float|string - */ - public static function IMCOS($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->cos(); - } - - /** - * IMCOSH. - * - * Returns the hyperbolic cosine of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMCOSH(complexNumber) - * - * @param string $complexNumber the complex number for which you want the hyperbolic cosine - * - * @return float|string - */ - public static function IMCOSH($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->cosh(); - } - - /** - * IMCOT. - * - * Returns the cotangent of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMCOT(complexNumber) - * - * @param string $complexNumber the complex number for which you want the cotangent - * - * @return float|string - */ - public static function IMCOT($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->cot(); - } - - /** - * IMCSC. - * - * Returns the cosecant of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMCSC(complexNumber) - * - * @param string $complexNumber the complex number for which you want the cosecant - * - * @return float|string - */ - public static function IMCSC($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->csc(); - } - - /** - * IMCSCH. - * - * Returns the hyperbolic cosecant of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMCSCH(complexNumber) - * - * @param string $complexNumber the complex number for which you want the hyperbolic cosecant - * - * @return float|string - */ - public static function IMCSCH($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->csch(); - } - - /** - * IMSIN. - * - * Returns the sine of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMSIN(complexNumber) - * - * @param string $complexNumber the complex number for which you want the sine - * - * @return float|string - */ - public static function IMSIN($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->sin(); - } - - /** - * IMSINH. - * - * Returns the hyperbolic sine of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMSINH(complexNumber) - * - * @param string $complexNumber the complex number for which you want the hyperbolic sine - * - * @return float|string - */ - public static function IMSINH($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->sinh(); - } - - /** - * IMSEC. - * - * Returns the secant of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMSEC(complexNumber) - * - * @param string $complexNumber the complex number for which you want the secant - * - * @return float|string - */ - public static function IMSEC($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->sec(); - } - - /** - * IMSECH. - * - * Returns the hyperbolic secant of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMSECH(complexNumber) - * - * @param string $complexNumber the complex number for which you want the hyperbolic secant - * - * @return float|string - */ - public static function IMSECH($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->sech(); - } - - /** - * IMTAN. - * - * Returns the tangent of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMTAN(complexNumber) - * - * @param string $complexNumber the complex number for which you want the tangent - * - * @return float|string - */ - public static function IMTAN($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->tan(); - } - - /** - * IMSQRT. - * - * Returns the square root of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMSQRT(complexNumber) - * - * @param string $complexNumber the complex number for which you want the square root - * - * @return string - */ - public static function IMSQRT($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - $theta = self::IMARGUMENT($complexNumber); - if ($theta === Functions::DIV0()) { - return '0'; - } - - return (string) (new Complex($complexNumber))->sqrt(); - } - - /** - * IMLN. - * - * Returns the natural logarithm of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMLN(complexNumber) - * - * @param string $complexNumber the complex number for which you want the natural logarithm - * - * @return string - */ - public static function IMLN($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - $complex = new Complex($complexNumber); - if ($complex->getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return Functions::NAN(); - } - - return (string) (new Complex($complexNumber))->ln(); - } - - /** - * IMLOG10. - * - * Returns the common logarithm (base 10) of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMLOG10(complexNumber) - * - * @param string $complexNumber the complex number for which you want the common logarithm - * - * @return string - */ - public static function IMLOG10($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - $complex = new Complex($complexNumber); - if ($complex->getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return Functions::NAN(); - } - - return (string) (new Complex($complexNumber))->log10(); - } - - /** - * IMLOG2. - * - * Returns the base-2 logarithm of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMLOG2(complexNumber) - * - * @param string $complexNumber the complex number for which you want the base-2 logarithm - * - * @return string - */ - public static function IMLOG2($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - $complex = new Complex($complexNumber); - if ($complex->getReal() == 0.0 && $complex->getImaginary() == 0.0) { - return Functions::NAN(); - } - - return (string) (new Complex($complexNumber))->log2(); - } - - /** - * IMEXP. - * - * Returns the exponential of a complex number in x + yi or x + yj text format. - * - * Excel Function: - * IMEXP(complexNumber) - * - * @param string $complexNumber the complex number for which you want the exponential - * - * @return string - */ - public static function IMEXP($complexNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - - return (string) (new Complex($complexNumber))->exp(); - } - - /** - * IMPOWER. - * - * Returns a complex number in x + yi or x + yj text format raised to a power. - * - * Excel Function: - * IMPOWER(complexNumber,realNumber) - * - * @param string $complexNumber the complex number you want to raise to a power - * @param float $realNumber the power to which you want to raise the complex number - * - * @return string - */ - public static function IMPOWER($complexNumber, $realNumber) - { - $complexNumber = Functions::flattenSingleValue($complexNumber); - $realNumber = Functions::flattenSingleValue($realNumber); - - if (!is_numeric($realNumber)) { - return Functions::VALUE(); - } - - return (string) (new Complex($complexNumber))->pow($realNumber); - } - - /** - * IMDIV. - * - * Returns the quotient of two complex numbers in x + yi or x + yj text format. - * - * Excel Function: - * IMDIV(complexDividend,complexDivisor) - * - * @param string $complexDividend the complex numerator or dividend - * @param string $complexDivisor the complex denominator or divisor - * - * @return string - */ - public static function IMDIV($complexDividend, $complexDivisor) - { - $complexDividend = Functions::flattenSingleValue($complexDividend); - $complexDivisor = Functions::flattenSingleValue($complexDivisor); - - try { - return (string) (new Complex($complexDividend))->divideby(new Complex($complexDivisor)); - } catch (ComplexException $e) { - return Functions::NAN(); - } - } - - /** - * IMSUB. - * - * Returns the difference of two complex numbers in x + yi or x + yj text format. - * - * Excel Function: - * IMSUB(complexNumber1,complexNumber2) - * - * @param string $complexNumber1 the complex number from which to subtract complexNumber2 - * @param string $complexNumber2 the complex number to subtract from complexNumber1 - * - * @return string - */ - public static function IMSUB($complexNumber1, $complexNumber2) - { - $complexNumber1 = Functions::flattenSingleValue($complexNumber1); - $complexNumber2 = Functions::flattenSingleValue($complexNumber2); - - try { - return (string) (new Complex($complexNumber1))->subtract(new Complex($complexNumber2)); - } catch (ComplexException $e) { - return Functions::NAN(); - } - } - - /** - * IMSUM. - * - * Returns the sum of two or more complex numbers in x + yi or x + yj text format. - * - * Excel Function: - * IMSUM(complexNumber[,complexNumber[,...]]) - * - * @param string ...$complexNumbers Series of complex numbers to add - * - * @return string - */ - public static function IMSUM(...$complexNumbers) - { - // Return value - $returnValue = new Complex(0.0); - $aArgs = Functions::flattenArray($complexNumbers); - - try { - // Loop through the arguments - foreach ($aArgs as $complex) { - $returnValue = $returnValue->add(new Complex($complex)); - } - } catch (ComplexException $e) { - return Functions::NAN(); - } - - return (string) $returnValue; - } - - /** - * IMPRODUCT. - * - * Returns the product of two or more complex numbers in x + yi or x + yj text format. - * - * Excel Function: - * IMPRODUCT(complexNumber[,complexNumber[,...]]) - * - * @param string ...$complexNumbers Series of complex numbers to multiply - * - * @return string - */ - public static function IMPRODUCT(...$complexNumbers) - { - // Return value - $returnValue = new Complex(1.0); - $aArgs = Functions::flattenArray($complexNumbers); - - try { - // Loop through the arguments - foreach ($aArgs as $complex) { - $returnValue = $returnValue->multiply(new Complex($complex)); - } - } catch (ComplexException $e) { - return Functions::NAN(); - } - - return (string) $returnValue; - } - - /** - * DELTA. - * - * Tests whether two values are equal. Returns 1 if number1 = number2; returns 0 otherwise. - * Use this function to filter a set of values. For example, by summing several DELTA - * functions you calculate the count of equal pairs. This function is also known as the - * Kronecker Delta function. - * - * Excel Function: - * DELTA(a[,b]) - * - * @param float $a the first number - * @param float $b The second number. If omitted, b is assumed to be zero. - * - * @return int - */ - public static function DELTA($a, $b = 0) - { - $a = Functions::flattenSingleValue($a); - $b = Functions::flattenSingleValue($b); - - return (int) ($a == $b); - } - - /** - * GESTEP. - * - * Excel Function: - * GESTEP(number[,step]) - * - * Returns 1 if number >= step; returns 0 (zero) otherwise - * Use this function to filter a set of values. For example, by summing several GESTEP - * functions you calculate the count of values that exceed a threshold. - * - * @param float $number the value to test against step - * @param float $step The threshold value. - * If you omit a value for step, GESTEP uses zero. - * - * @return int - */ - public static function GESTEP($number, $step = 0) - { - $number = Functions::flattenSingleValue($number); - $step = Functions::flattenSingleValue($step); - - return (int) ($number >= $step); - } - - // - // Private method to calculate the erf value - // - private static $twoSqrtPi = 1.128379167095512574; - - public static function erfVal($x) - { - if (abs($x) > 2.2) { - return 1 - self::erfcVal($x); - } - $sum = $term = $x; - $xsqr = ($x * $x); - $j = 1; - do { - $term *= $xsqr / $j; - $sum -= $term / (2 * $j + 1); - ++$j; - $term *= $xsqr / $j; - $sum += $term / (2 * $j + 1); - ++$j; - if ($sum == 0.0) { - break; - } - } while (abs($term / $sum) > Functions::PRECISION); - - return self::$twoSqrtPi * $sum; - } - - /** - * Validate arguments passed to the bitwise functions. - * - * @param mixed $value - * - * @return int - */ - private static function validateBitwiseArgument($value) - { - $value = Functions::flattenSingleValue($value); - - if (is_int($value)) { - return $value; - } elseif (is_numeric($value)) { - if ($value == (int) ($value)) { - $value = (int) ($value); - if (($value > 2 ** 48 - 1) || ($value < 0)) { - throw new Exception(Functions::NAN()); - } - - return $value; - } - - throw new Exception(Functions::NAN()); - } - - throw new Exception(Functions::VALUE()); - } - - /** - * BITAND. - * - * Returns the bitwise AND of two integer values. - * - * Excel Function: - * BITAND(number1, number2) - * - * @param int $number1 - * @param int $number2 - * - * @return int|string - */ - public static function BITAND($number1, $number2) - { - try { - $number1 = self::validateBitwiseArgument($number1); - $number2 = self::validateBitwiseArgument($number2); - } catch (Exception $e) { - return $e->getMessage(); - } - - return $number1 & $number2; - } - - /** - * BITOR. - * - * Returns the bitwise OR of two integer values. - * - * Excel Function: - * BITOR(number1, number2) - * - * @param int $number1 - * @param int $number2 - * - * @return int|string - */ - public static function BITOR($number1, $number2) - { - try { - $number1 = self::validateBitwiseArgument($number1); - $number2 = self::validateBitwiseArgument($number2); - } catch (Exception $e) { - return $e->getMessage(); - } - - return $number1 | $number2; - } - - /** - * BITXOR. - * - * Returns the bitwise XOR of two integer values. - * - * Excel Function: - * BITXOR(number1, number2) - * - * @param int $number1 - * @param int $number2 - * - * @return int|string - */ - public static function BITXOR($number1, $number2) - { - try { - $number1 = self::validateBitwiseArgument($number1); - $number2 = self::validateBitwiseArgument($number2); - } catch (Exception $e) { - return $e->getMessage(); - } - - return $number1 ^ $number2; - } - - /** - * BITLSHIFT. - * - * Returns the number value shifted left by shift_amount bits. - * - * Excel Function: - * BITLSHIFT(number, shift_amount) - * - * @param int $number - * @param int $shiftAmount - * - * @return int|string - */ - public static function BITLSHIFT($number, $shiftAmount) - { - try { - $number = self::validateBitwiseArgument($number); - } catch (Exception $e) { - return $e->getMessage(); - } - - $shiftAmount = Functions::flattenSingleValue($shiftAmount); - - $result = $number << $shiftAmount; - if ($result > 2 ** 48 - 1) { - return Functions::NAN(); - } - - return $result; - } - - /** - * BITRSHIFT. - * - * Returns the number value shifted right by shift_amount bits. - * - * Excel Function: - * BITRSHIFT(number, shift_amount) - * - * @param int $number - * @param int $shiftAmount - * - * @return int|string - */ - public static function BITRSHIFT($number, $shiftAmount) - { - try { - $number = self::validateBitwiseArgument($number); - } catch (Exception $e) { - return $e->getMessage(); - } - - $shiftAmount = Functions::flattenSingleValue($shiftAmount); - - return $number >> $shiftAmount; - } - - /** - * ERF. - * - * Returns the error function integrated between the lower and upper bound arguments. - * - * Note: In Excel 2007 or earlier, if you input a negative value for the upper or lower bound arguments, - * the function would return a #NUM! error. However, in Excel 2010, the function algorithm was - * improved, so that it can now calculate the function for both positive and negative ranges. - * PhpSpreadsheet follows Excel 2010 behaviour, and accepts negative arguments. - * - * Excel Function: - * ERF(lower[,upper]) - * - * @param float $lower lower bound for integrating ERF - * @param float $upper upper bound for integrating ERF. - * If omitted, ERF integrates between zero and lower_limit - * - * @return float|string - */ - public static function ERF($lower, $upper = null) - { - $lower = Functions::flattenSingleValue($lower); - $upper = Functions::flattenSingleValue($upper); - - if (is_numeric($lower)) { - if ($upper === null) { - return self::erfVal($lower); - } - if (is_numeric($upper)) { - return self::erfVal($upper) - self::erfVal($lower); - } - } - - return Functions::VALUE(); - } - - /** - * ERFPRECISE. - * - * Returns the error function integrated between the lower and upper bound arguments. - * - * Excel Function: - * ERF.PRECISE(limit) - * - * @param float $limit bound for integrating ERF - * - * @return float|string - */ - public static function ERFPRECISE($limit) - { - $limit = Functions::flattenSingleValue($limit); - - return self::ERF($limit); - } - - // - // Private method to calculate the erfc value - // - private static $oneSqrtPi = 0.564189583547756287; - - private static function erfcVal($x) - { - if (abs($x) < 2.2) { - return 1 - self::erfVal($x); - } - if ($x < 0) { - return 2 - self::ERFC(-$x); - } - $a = $n = 1; - $b = $c = $x; - $d = ($x * $x) + 0.5; - $q1 = $q2 = $b / $d; - $t = 0; - do { - $t = $a * $n + $b * $x; - $a = $b; - $b = $t; - $t = $c * $n + $d * $x; - $c = $d; - $d = $t; - $n += 0.5; - $q1 = $q2; - $q2 = $b / $d; - } while ((abs($q1 - $q2) / $q2) > Functions::PRECISION); - - return self::$oneSqrtPi * exp(-$x * $x) * $q2; - } - - /** - * ERFC. - * - * Returns the complementary ERF function integrated between x and infinity - * - * Note: In Excel 2007 or earlier, if you input a negative value for the lower bound argument, - * the function would return a #NUM! error. However, in Excel 2010, the function algorithm was - * improved, so that it can now calculate the function for both positive and negative x values. - * PhpSpreadsheet follows Excel 2010 behaviour, and accepts nagative arguments. - * - * Excel Function: - * ERFC(x) - * - * @param float $x The lower bound for integrating ERFC - * - * @return float|string - */ - public static function ERFC($x) - { - $x = Functions::flattenSingleValue($x); - - if (is_numeric($x)) { - return self::erfcVal($x); - } - - return Functions::VALUE(); - } - - /** - * getConversionGroups - * Returns a list of the different conversion groups for UOM conversions. - * - * @return array - */ - public static function getConversionGroups() - { - $conversionGroups = []; - foreach (self::$conversionUnits as $conversionUnit) { - $conversionGroups[] = $conversionUnit['Group']; - } - - return array_merge(array_unique($conversionGroups)); - } - - /** - * getConversionGroupUnits - * Returns an array of units of measure, for a specified conversion group, or for all groups. - * - * @param string $group The group whose units of measure you want to retrieve - * - * @return array - */ - public static function getConversionGroupUnits($group = null) - { - $conversionGroups = []; - foreach (self::$conversionUnits as $conversionUnit => $conversionGroup) { - if (($group === null) || ($conversionGroup['Group'] == $group)) { - $conversionGroups[$conversionGroup['Group']][] = $conversionUnit; - } - } - - return $conversionGroups; - } - - /** - * getConversionGroupUnitDetails. - * - * @param string $group The group whose units of measure you want to retrieve - * - * @return array - */ - public static function getConversionGroupUnitDetails($group = null) - { - $conversionGroups = []; - foreach (self::$conversionUnits as $conversionUnit => $conversionGroup) { - if (($group === null) || ($conversionGroup['Group'] == $group)) { - $conversionGroups[$conversionGroup['Group']][] = [ - 'unit' => $conversionUnit, - 'description' => $conversionGroup['Unit Name'], - ]; - } - } - - return $conversionGroups; - } - - /** - * getConversionMultipliers - * Returns an array of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM(). - * - * @return array of mixed - */ - public static function getConversionMultipliers() - { - return self::$conversionMultipliers; - } - - /** - * CONVERTUOM. - * - * Converts a number from one measurement system to another. - * For example, CONVERT can translate a table of distances in miles to a table of distances - * in kilometers. - * - * Excel Function: - * CONVERT(value,fromUOM,toUOM) - * - * @param float $value the value in fromUOM to convert - * @param string $fromUOM the units for value - * @param string $toUOM the units for the result - * - * @return float|string - */ - public static function CONVERTUOM($value, $fromUOM, $toUOM) - { - $value = Functions::flattenSingleValue($value); - $fromUOM = Functions::flattenSingleValue($fromUOM); - $toUOM = Functions::flattenSingleValue($toUOM); - - if (!is_numeric($value)) { - return Functions::VALUE(); - } - $fromMultiplier = 1.0; - if (isset(self::$conversionUnits[$fromUOM])) { - $unitGroup1 = self::$conversionUnits[$fromUOM]['Group']; - } else { - $fromMultiplier = substr($fromUOM, 0, 1); - $fromUOM = substr($fromUOM, 1); - if (isset(self::$conversionMultipliers[$fromMultiplier])) { - $fromMultiplier = self::$conversionMultipliers[$fromMultiplier]['multiplier']; - } else { - return Functions::NA(); - } - if ((isset(self::$conversionUnits[$fromUOM])) && (self::$conversionUnits[$fromUOM]['AllowPrefix'])) { - $unitGroup1 = self::$conversionUnits[$fromUOM]['Group']; - } else { - return Functions::NA(); - } - } - $value *= $fromMultiplier; - - $toMultiplier = 1.0; - if (isset(self::$conversionUnits[$toUOM])) { - $unitGroup2 = self::$conversionUnits[$toUOM]['Group']; - } else { - $toMultiplier = substr($toUOM, 0, 1); - $toUOM = substr($toUOM, 1); - if (isset(self::$conversionMultipliers[$toMultiplier])) { - $toMultiplier = self::$conversionMultipliers[$toMultiplier]['multiplier']; - } else { - return Functions::NA(); - } - if ((isset(self::$conversionUnits[$toUOM])) && (self::$conversionUnits[$toUOM]['AllowPrefix'])) { - $unitGroup2 = self::$conversionUnits[$toUOM]['Group']; - } else { - return Functions::NA(); - } - } - if ($unitGroup1 != $unitGroup2) { - return Functions::NA(); - } - - if (($fromUOM == $toUOM) && ($fromMultiplier == $toMultiplier)) { - // We've already factored $fromMultiplier into the value, so we need - // to reverse it again - return $value / $fromMultiplier; - } elseif ($unitGroup1 == 'Temperature') { - if (($fromUOM == 'F') || ($fromUOM == 'fah')) { - if (($toUOM == 'F') || ($toUOM == 'fah')) { - return $value; - } - $value = (($value - 32) / 1.8); - if (($toUOM == 'K') || ($toUOM == 'kel')) { - $value += 273.15; - } - - return $value; - } elseif ( - (($fromUOM == 'K') || ($fromUOM == 'kel')) && - (($toUOM == 'K') || ($toUOM == 'kel')) - ) { - return $value; - } elseif ( - (($fromUOM == 'C') || ($fromUOM == 'cel')) && - (($toUOM == 'C') || ($toUOM == 'cel')) - ) { - return $value; - } - if (($toUOM == 'F') || ($toUOM == 'fah')) { - if (($fromUOM == 'K') || ($fromUOM == 'kel')) { - $value -= 273.15; - } - - return ($value * 1.8) + 32; - } - if (($toUOM == 'C') || ($toUOM == 'cel')) { - return $value - 273.15; - } - - return $value + 273.15; - } - - return ($value * self::$unitConversions[$unitGroup1][$fromUOM][$toUOM]) / $toMultiplier; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Exception.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Exception.php deleted file mode 100644 index 87c7d22..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Exception.php +++ /dev/null @@ -1,26 +0,0 @@ -line = $line; - $e->file = $file; - - throw $e; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ExceptionHandler.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ExceptionHandler.php deleted file mode 100644 index 41e51d4..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ExceptionHandler.php +++ /dev/null @@ -1,22 +0,0 @@ -format('d') == $testDate->format('t'); - } - - private static function couponFirstPeriodDate($settlement, $maturity, $frequency, $next) - { - $months = 12 / $frequency; - - $result = Date::excelToDateTimeObject($maturity); - $eom = self::isLastDayOfMonth($result); - - while ($settlement < Date::PHPToExcel($result)) { - $result->modify('-' . $months . ' months'); - } - if ($next) { - $result->modify('+' . $months . ' months'); - } - - if ($eom) { - $result->modify('-1 day'); - } - - return Date::PHPToExcel($result); - } - - private static function isValidFrequency($frequency) - { - if (($frequency == 1) || ($frequency == 2) || ($frequency == 4)) { - return true; - } - - return false; - } - - /** - * daysPerYear. - * - * Returns the number of days in a specified year, as defined by the "basis" value - * - * @param int|string $year The year against which we're testing - * @param int|string $basis The type of day count: - * 0 or omitted US (NASD) 360 - * 1 Actual (365 or 366 in a leap year) - * 2 360 - * 3 365 - * 4 European 360 - * - * @return int|string Result, or a string containing an error - */ - private static function daysPerYear($year, $basis = 0) - { - switch ($basis) { - case 0: - case 2: - case 4: - $daysPerYear = 360; - - break; - case 3: - $daysPerYear = 365; - - break; - case 1: - $daysPerYear = (DateTime::isLeapYear($year)) ? 366 : 365; - - break; - default: - return Functions::NAN(); - } - - return $daysPerYear; - } - - private static function interestAndPrincipal($rate = 0, $per = 0, $nper = 0, $pv = 0, $fv = 0, $type = 0) - { - $pmt = self::PMT($rate, $nper, $pv, $fv, $type); - $capital = $pv; - for ($i = 1; $i <= $per; ++$i) { - $interest = ($type && $i == 1) ? 0 : -$capital * $rate; - $principal = $pmt - $interest; - $capital += $principal; - } - - return [$interest, $principal]; - } - - /** - * ACCRINT. - * - * Returns the accrued interest for a security that pays periodic interest. - * - * Excel Function: - * ACCRINT(issue,firstinterest,settlement,rate,par,frequency[,basis]) - * - * @param mixed $issue the security's issue date - * @param mixed $firstinterest the security's first interest date - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue date - * when the security is traded to the buyer. - * @param float $rate the security's annual coupon rate - * @param float $par The security's par value. - * If you omit par, ACCRINT uses $1,000. - * @param int $frequency the number of coupon payments per year. - * Valid frequency values are: - * 1 Annual - * 2 Semi-Annual - * 4 Quarterly - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string Result, or a string containing an error - */ - public static function ACCRINT($issue, $firstinterest, $settlement, $rate, $par = 1000, $frequency = 1, $basis = 0) - { - $issue = Functions::flattenSingleValue($issue); - $firstinterest = Functions::flattenSingleValue($firstinterest); - $settlement = Functions::flattenSingleValue($settlement); - $rate = Functions::flattenSingleValue($rate); - $par = ($par === null) ? 1000 : Functions::flattenSingleValue($par); - $frequency = ($frequency === null) ? 1 : Functions::flattenSingleValue($frequency); - $basis = ($basis === null) ? 0 : Functions::flattenSingleValue($basis); - - // Validate - if ((is_numeric($rate)) && (is_numeric($par))) { - $rate = (float) $rate; - $par = (float) $par; - if (($rate <= 0) || ($par <= 0)) { - return Functions::NAN(); - } - $daysBetweenIssueAndSettlement = DateTime::YEARFRAC($issue, $settlement, $basis); - if (!is_numeric($daysBetweenIssueAndSettlement)) { - // return date error - return $daysBetweenIssueAndSettlement; - } - - return $par * $rate * $daysBetweenIssueAndSettlement; - } - - return Functions::VALUE(); - } - - /** - * ACCRINTM. - * - * Returns the accrued interest for a security that pays interest at maturity. - * - * Excel Function: - * ACCRINTM(issue,settlement,rate[,par[,basis]]) - * - * @param mixed $issue The security's issue date - * @param mixed $settlement The security's settlement (or maturity) date - * @param float $rate The security's annual coupon rate - * @param float $par The security's par value. - * If you omit par, ACCRINT uses $1,000. - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string Result, or a string containing an error - */ - public static function ACCRINTM($issue, $settlement, $rate, $par = 1000, $basis = 0) - { - $issue = Functions::flattenSingleValue($issue); - $settlement = Functions::flattenSingleValue($settlement); - $rate = Functions::flattenSingleValue($rate); - $par = ($par === null) ? 1000 : Functions::flattenSingleValue($par); - $basis = ($basis === null) ? 0 : Functions::flattenSingleValue($basis); - - // Validate - if ((is_numeric($rate)) && (is_numeric($par))) { - $rate = (float) $rate; - $par = (float) $par; - if (($rate <= 0) || ($par <= 0)) { - return Functions::NAN(); - } - $daysBetweenIssueAndSettlement = DateTime::YEARFRAC($issue, $settlement, $basis); - if (!is_numeric($daysBetweenIssueAndSettlement)) { - // return date error - return $daysBetweenIssueAndSettlement; - } - - return $par * $rate * $daysBetweenIssueAndSettlement; - } - - return Functions::VALUE(); - } - - /** - * AMORDEGRC. - * - * Returns the depreciation for each accounting period. - * This function is provided for the French accounting system. If an asset is purchased in - * the middle of the accounting period, the prorated depreciation is taken into account. - * The function is similar to AMORLINC, except that a depreciation coefficient is applied in - * the calculation depending on the life of the assets. - * This function will return the depreciation until the last period of the life of the assets - * or until the cumulated value of depreciation is greater than the cost of the assets minus - * the salvage value. - * - * Excel Function: - * AMORDEGRC(cost,purchased,firstPeriod,salvage,period,rate[,basis]) - * - * @param float $cost The cost of the asset - * @param mixed $purchased Date of the purchase of the asset - * @param mixed $firstPeriod Date of the end of the first period - * @param mixed $salvage The salvage value at the end of the life of the asset - * @param float $period The period - * @param float $rate Rate of depreciation - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float - */ - public static function AMORDEGRC($cost, $purchased, $firstPeriod, $salvage, $period, $rate, $basis = 0) - { - $cost = Functions::flattenSingleValue($cost); - $purchased = Functions::flattenSingleValue($purchased); - $firstPeriod = Functions::flattenSingleValue($firstPeriod); - $salvage = Functions::flattenSingleValue($salvage); - $period = floor(Functions::flattenSingleValue($period)); - $rate = Functions::flattenSingleValue($rate); - $basis = ($basis === null) ? 0 : (int) Functions::flattenSingleValue($basis); - - // The depreciation coefficients are: - // Life of assets (1/rate) Depreciation coefficient - // Less than 3 years 1 - // Between 3 and 4 years 1.5 - // Between 5 and 6 years 2 - // More than 6 years 2.5 - $fUsePer = 1.0 / $rate; - if ($fUsePer < 3.0) { - $amortiseCoeff = 1.0; - } elseif ($fUsePer < 5.0) { - $amortiseCoeff = 1.5; - } elseif ($fUsePer <= 6.0) { - $amortiseCoeff = 2.0; - } else { - $amortiseCoeff = 2.5; - } - - $rate *= $amortiseCoeff; - $fNRate = round(DateTime::YEARFRAC($purchased, $firstPeriod, $basis) * $rate * $cost, 0); - $cost -= $fNRate; - $fRest = $cost - $salvage; - - for ($n = 0; $n < $period; ++$n) { - $fNRate = round($rate * $cost, 0); - $fRest -= $fNRate; - - if ($fRest < 0.0) { - switch ($period - $n) { - case 0: - case 1: - return round($cost * 0.5, 0); - default: - return 0.0; - } - } - $cost -= $fNRate; - } - - return $fNRate; - } - - /** - * AMORLINC. - * - * Returns the depreciation for each accounting period. - * This function is provided for the French accounting system. If an asset is purchased in - * the middle of the accounting period, the prorated depreciation is taken into account. - * - * Excel Function: - * AMORLINC(cost,purchased,firstPeriod,salvage,period,rate[,basis]) - * - * @param float $cost The cost of the asset - * @param mixed $purchased Date of the purchase of the asset - * @param mixed $firstPeriod Date of the end of the first period - * @param mixed $salvage The salvage value at the end of the life of the asset - * @param float $period The period - * @param float $rate Rate of depreciation - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float - */ - public static function AMORLINC($cost, $purchased, $firstPeriod, $salvage, $period, $rate, $basis = 0) - { - $cost = Functions::flattenSingleValue($cost); - $purchased = Functions::flattenSingleValue($purchased); - $firstPeriod = Functions::flattenSingleValue($firstPeriod); - $salvage = Functions::flattenSingleValue($salvage); - $period = Functions::flattenSingleValue($period); - $rate = Functions::flattenSingleValue($rate); - $basis = ($basis === null) ? 0 : (int) Functions::flattenSingleValue($basis); - - $fOneRate = $cost * $rate; - $fCostDelta = $cost - $salvage; - // Note, quirky variation for leap years on the YEARFRAC for this function - $purchasedYear = DateTime::YEAR($purchased); - $yearFrac = DateTime::YEARFRAC($purchased, $firstPeriod, $basis); - - if (($basis == 1) && ($yearFrac < 1) && (DateTime::isLeapYear($purchasedYear))) { - $yearFrac *= 365 / 366; - } - - $f0Rate = $yearFrac * $rate * $cost; - $nNumOfFullPeriods = (int) (($cost - $salvage - $f0Rate) / $fOneRate); - - if ($period == 0) { - return $f0Rate; - } elseif ($period <= $nNumOfFullPeriods) { - return $fOneRate; - } elseif ($period == ($nNumOfFullPeriods + 1)) { - return $fCostDelta - $fOneRate * $nNumOfFullPeriods - $f0Rate; - } - - return 0.0; - } - - /** - * COUPDAYBS. - * - * Returns the number of days from the beginning of the coupon period to the settlement date. - * - * Excel Function: - * COUPDAYBS(settlement,maturity,frequency[,basis]) - * - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue - * date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param int $frequency the number of coupon payments per year. - * Valid frequency values are: - * 1 Annual - * 2 Semi-Annual - * 4 Quarterly - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string - */ - public static function COUPDAYBS($settlement, $maturity, $frequency, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $frequency = (int) Functions::flattenSingleValue($frequency); - $basis = ($basis === null) ? 0 : (int) Functions::flattenSingleValue($basis); - - if (is_string($settlement = DateTime::getDateValue($settlement))) { - return Functions::VALUE(); - } - if (is_string($maturity = DateTime::getDateValue($maturity))) { - return Functions::VALUE(); - } - - if ( - ($settlement >= $maturity) || - (!self::isValidFrequency($frequency)) || - (($basis < 0) || ($basis > 4)) - ) { - return Functions::NAN(); - } - - $daysPerYear = self::daysPerYear(DateTime::YEAR($settlement), $basis); - $prev = self::couponFirstPeriodDate($settlement, $maturity, $frequency, false); - - if ($basis == 1) { - return abs(DateTime::DAYS($prev, $settlement)); - } - - return DateTime::YEARFRAC($prev, $settlement, $basis) * $daysPerYear; - } - - /** - * COUPDAYS. - * - * Returns the number of days in the coupon period that contains the settlement date. - * - * Excel Function: - * COUPDAYS(settlement,maturity,frequency[,basis]) - * - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue - * date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param mixed $frequency the number of coupon payments per year. - * Valid frequency values are: - * 1 Annual - * 2 Semi-Annual - * 4 Quarterly - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string - */ - public static function COUPDAYS($settlement, $maturity, $frequency, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $frequency = (int) Functions::flattenSingleValue($frequency); - $basis = ($basis === null) ? 0 : (int) Functions::flattenSingleValue($basis); - - if (is_string($settlement = DateTime::getDateValue($settlement))) { - return Functions::VALUE(); - } - if (is_string($maturity = DateTime::getDateValue($maturity))) { - return Functions::VALUE(); - } - - if ( - ($settlement >= $maturity) || - (!self::isValidFrequency($frequency)) || - (($basis < 0) || ($basis > 4)) - ) { - return Functions::NAN(); - } - - switch ($basis) { - case 3: - // Actual/365 - return 365 / $frequency; - case 1: - // Actual/actual - if ($frequency == 1) { - $daysPerYear = self::daysPerYear(DateTime::YEAR($settlement), $basis); - - return $daysPerYear / $frequency; - } - $prev = self::couponFirstPeriodDate($settlement, $maturity, $frequency, false); - $next = self::couponFirstPeriodDate($settlement, $maturity, $frequency, true); - - return $next - $prev; - default: - // US (NASD) 30/360, Actual/360 or European 30/360 - return 360 / $frequency; - } - } - - /** - * COUPDAYSNC. - * - * Returns the number of days from the settlement date to the next coupon date. - * - * Excel Function: - * COUPDAYSNC(settlement,maturity,frequency[,basis]) - * - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue - * date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param mixed $frequency the number of coupon payments per year. - * Valid frequency values are: - * 1 Annual - * 2 Semi-Annual - * 4 Quarterly - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string - */ - public static function COUPDAYSNC($settlement, $maturity, $frequency, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $frequency = (int) Functions::flattenSingleValue($frequency); - $basis = ($basis === null) ? 0 : (int) Functions::flattenSingleValue($basis); - - if (is_string($settlement = DateTime::getDateValue($settlement))) { - return Functions::VALUE(); - } - if (is_string($maturity = DateTime::getDateValue($maturity))) { - return Functions::VALUE(); - } - - if ( - ($settlement >= $maturity) || - (!self::isValidFrequency($frequency)) || - (($basis < 0) || ($basis > 4)) - ) { - return Functions::NAN(); - } - - $daysPerYear = self::daysPerYear(DateTime::YEAR($settlement), $basis); - $next = self::couponFirstPeriodDate($settlement, $maturity, $frequency, true); - - return DateTime::YEARFRAC($settlement, $next, $basis) * $daysPerYear; - } - - /** - * COUPNCD. - * - * Returns the next coupon date after the settlement date. - * - * Excel Function: - * COUPNCD(settlement,maturity,frequency[,basis]) - * - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue - * date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param mixed $frequency the number of coupon payments per year. - * Valid frequency values are: - * 1 Annual - * 2 Semi-Annual - * 4 Quarterly - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function COUPNCD($settlement, $maturity, $frequency, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $frequency = (int) Functions::flattenSingleValue($frequency); - $basis = ($basis === null) ? 0 : (int) Functions::flattenSingleValue($basis); - - if (is_string($settlement = DateTime::getDateValue($settlement))) { - return Functions::VALUE(); - } - if (is_string($maturity = DateTime::getDateValue($maturity))) { - return Functions::VALUE(); - } - - if ( - ($settlement >= $maturity) || - (!self::isValidFrequency($frequency)) || - (($basis < 0) || ($basis > 4)) - ) { - return Functions::NAN(); - } - - return self::couponFirstPeriodDate($settlement, $maturity, $frequency, true); - } - - /** - * COUPNUM. - * - * Returns the number of coupons payable between the settlement date and maturity date, - * rounded up to the nearest whole coupon. - * - * Excel Function: - * COUPNUM(settlement,maturity,frequency[,basis]) - * - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue - * date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param mixed $frequency the number of coupon payments per year. - * Valid frequency values are: - * 1 Annual - * 2 Semi-Annual - * 4 Quarterly - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return int|string - */ - public static function COUPNUM($settlement, $maturity, $frequency, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $frequency = (int) Functions::flattenSingleValue($frequency); - $basis = ($basis === null) ? 0 : (int) Functions::flattenSingleValue($basis); - - if (is_string($settlement = DateTime::getDateValue($settlement))) { - return Functions::VALUE(); - } - if (is_string($maturity = DateTime::getDateValue($maturity))) { - return Functions::VALUE(); - } - - if ( - ($settlement >= $maturity) || - (!self::isValidFrequency($frequency)) || - (($basis < 0) || ($basis > 4)) - ) { - return Functions::NAN(); - } - - $yearsBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity, 0); - - return ceil($yearsBetweenSettlementAndMaturity * $frequency); - } - - /** - * COUPPCD. - * - * Returns the previous coupon date before the settlement date. - * - * Excel Function: - * COUPPCD(settlement,maturity,frequency[,basis]) - * - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue - * date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param mixed $frequency the number of coupon payments per year. - * Valid frequency values are: - * 1 Annual - * 2 Semi-Annual - * 4 Quarterly - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, - * depending on the value of the ReturnDateType flag - */ - public static function COUPPCD($settlement, $maturity, $frequency, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $frequency = (int) Functions::flattenSingleValue($frequency); - $basis = ($basis === null) ? 0 : (int) Functions::flattenSingleValue($basis); - - if (is_string($settlement = DateTime::getDateValue($settlement))) { - return Functions::VALUE(); - } - if (is_string($maturity = DateTime::getDateValue($maturity))) { - return Functions::VALUE(); - } - - if ( - ($settlement >= $maturity) || - (!self::isValidFrequency($frequency)) || - (($basis < 0) || ($basis > 4)) - ) { - return Functions::NAN(); - } - - return self::couponFirstPeriodDate($settlement, $maturity, $frequency, false); - } - - /** - * CUMIPMT. - * - * Returns the cumulative interest paid on a loan between the start and end periods. - * - * Excel Function: - * CUMIPMT(rate,nper,pv,start,end[,type]) - * - * @param float $rate The Interest rate - * @param int $nper The total number of payment periods - * @param float $pv Present Value - * @param int $start The first period in the calculation. - * Payment periods are numbered beginning with 1. - * @param int $end the last period in the calculation - * @param int $type A number 0 or 1 and indicates when payments are due: - * 0 or omitted At the end of the period. - * 1 At the beginning of the period. - * - * @return float|string - */ - public static function CUMIPMT($rate, $nper, $pv, $start, $end, $type = 0) - { - $rate = Functions::flattenSingleValue($rate); - $nper = (int) Functions::flattenSingleValue($nper); - $pv = Functions::flattenSingleValue($pv); - $start = (int) Functions::flattenSingleValue($start); - $end = (int) Functions::flattenSingleValue($end); - $type = (int) Functions::flattenSingleValue($type); - - // Validate parameters - if ($type != 0 && $type != 1) { - return Functions::NAN(); - } - if ($start < 1 || $start > $end) { - return Functions::VALUE(); - } - - // Calculate - $interest = 0; - for ($per = $start; $per <= $end; ++$per) { - $interest += self::IPMT($rate, $per, $nper, $pv, 0, $type); - } - - return $interest; - } - - /** - * CUMPRINC. - * - * Returns the cumulative principal paid on a loan between the start and end periods. - * - * Excel Function: - * CUMPRINC(rate,nper,pv,start,end[,type]) - * - * @param float $rate The Interest rate - * @param int $nper The total number of payment periods - * @param float $pv Present Value - * @param int $start The first period in the calculation. - * Payment periods are numbered beginning with 1. - * @param int $end the last period in the calculation - * @param int $type A number 0 or 1 and indicates when payments are due: - * 0 or omitted At the end of the period. - * 1 At the beginning of the period. - * - * @return float|string - */ - public static function CUMPRINC($rate, $nper, $pv, $start, $end, $type = 0) - { - $rate = Functions::flattenSingleValue($rate); - $nper = (int) Functions::flattenSingleValue($nper); - $pv = Functions::flattenSingleValue($pv); - $start = (int) Functions::flattenSingleValue($start); - $end = (int) Functions::flattenSingleValue($end); - $type = (int) Functions::flattenSingleValue($type); - - // Validate parameters - if ($type != 0 && $type != 1) { - return Functions::NAN(); - } - if ($start < 1 || $start > $end) { - return Functions::VALUE(); - } - - // Calculate - $principal = 0; - for ($per = $start; $per <= $end; ++$per) { - $principal += self::PPMT($rate, $per, $nper, $pv, 0, $type); - } - - return $principal; - } - - /** - * DB. - * - * Returns the depreciation of an asset for a specified period using the - * fixed-declining balance method. - * This form of depreciation is used if you want to get a higher depreciation value - * at the beginning of the depreciation (as opposed to linear depreciation). The - * depreciation value is reduced with every depreciation period by the depreciation - * already deducted from the initial cost. - * - * Excel Function: - * DB(cost,salvage,life,period[,month]) - * - * @param float $cost Initial cost of the asset - * @param float $salvage Value at the end of the depreciation. - * (Sometimes called the salvage value of the asset) - * @param int $life Number of periods over which the asset is depreciated. - * (Sometimes called the useful life of the asset) - * @param int $period The period for which you want to calculate the - * depreciation. Period must use the same units as life. - * @param int $month Number of months in the first year. If month is omitted, - * it defaults to 12. - * - * @return float|string - */ - public static function DB($cost, $salvage, $life, $period, $month = 12) - { - $cost = Functions::flattenSingleValue($cost); - $salvage = Functions::flattenSingleValue($salvage); - $life = Functions::flattenSingleValue($life); - $period = Functions::flattenSingleValue($period); - $month = Functions::flattenSingleValue($month); - - // Validate - if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period)) && (is_numeric($month))) { - $cost = (float) $cost; - $salvage = (float) $salvage; - $life = (int) $life; - $period = (int) $period; - $month = (int) $month; - if ($cost == 0) { - return 0.0; - } elseif (($cost < 0) || (($salvage / $cost) < 0) || ($life <= 0) || ($period < 1) || ($month < 1)) { - return Functions::NAN(); - } - // Set Fixed Depreciation Rate - $fixedDepreciationRate = 1 - ($salvage / $cost) ** (1 / $life); - $fixedDepreciationRate = round($fixedDepreciationRate, 3); - - // Loop through each period calculating the depreciation - $previousDepreciation = 0; - $depreciation = 0; - for ($per = 1; $per <= $period; ++$per) { - if ($per == 1) { - $depreciation = $cost * $fixedDepreciationRate * $month / 12; - } elseif ($per == ($life + 1)) { - $depreciation = ($cost - $previousDepreciation) * $fixedDepreciationRate * (12 - $month) / 12; - } else { - $depreciation = ($cost - $previousDepreciation) * $fixedDepreciationRate; - } - $previousDepreciation += $depreciation; - } - - return $depreciation; - } - - return Functions::VALUE(); - } - - /** - * DDB. - * - * Returns the depreciation of an asset for a specified period using the - * double-declining balance method or some other method you specify. - * - * Excel Function: - * DDB(cost,salvage,life,period[,factor]) - * - * @param float $cost Initial cost of the asset - * @param float $salvage Value at the end of the depreciation. - * (Sometimes called the salvage value of the asset) - * @param int $life Number of periods over which the asset is depreciated. - * (Sometimes called the useful life of the asset) - * @param int $period The period for which you want to calculate the - * depreciation. Period must use the same units as life. - * @param float $factor The rate at which the balance declines. - * If factor is omitted, it is assumed to be 2 (the - * double-declining balance method). - * - * @return float|string - */ - public static function DDB($cost, $salvage, $life, $period, $factor = 2.0) - { - $cost = Functions::flattenSingleValue($cost); - $salvage = Functions::flattenSingleValue($salvage); - $life = Functions::flattenSingleValue($life); - $period = Functions::flattenSingleValue($period); - $factor = Functions::flattenSingleValue($factor); - - // Validate - if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period)) && (is_numeric($factor))) { - $cost = (float) $cost; - $salvage = (float) $salvage; - $life = (int) $life; - $period = (int) $period; - $factor = (float) $factor; - if (($cost <= 0) || (($salvage / $cost) < 0) || ($life <= 0) || ($period < 1) || ($factor <= 0.0) || ($period > $life)) { - return Functions::NAN(); - } - // Set Fixed Depreciation Rate - $fixedDepreciationRate = 1 - ($salvage / $cost) ** (1 / $life); - $fixedDepreciationRate = round($fixedDepreciationRate, 3); - - // Loop through each period calculating the depreciation - $previousDepreciation = 0; - $depreciation = 0; - for ($per = 1; $per <= $period; ++$per) { - $depreciation = min(($cost - $previousDepreciation) * ($factor / $life), ($cost - $salvage - $previousDepreciation)); - $previousDepreciation += $depreciation; - } - - return $depreciation; - } - - return Functions::VALUE(); - } - - /** - * DISC. - * - * Returns the discount rate for a security. - * - * Excel Function: - * DISC(settlement,maturity,price,redemption[,basis]) - * - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue - * date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param int $price The security's price per $100 face value - * @param int $redemption The security's redemption value per $100 face value - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string - */ - public static function DISC($settlement, $maturity, $price, $redemption, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $price = Functions::flattenSingleValue($price); - $redemption = Functions::flattenSingleValue($redemption); - $basis = Functions::flattenSingleValue($basis); - - // Validate - if ((is_numeric($price)) && (is_numeric($redemption)) && (is_numeric($basis))) { - $price = (float) $price; - $redemption = (float) $redemption; - $basis = (int) $basis; - if (($price <= 0) || ($redemption <= 0)) { - return Functions::NAN(); - } - $daysBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity, $basis); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { - // return date error - return $daysBetweenSettlementAndMaturity; - } - - return (1 - $price / $redemption) / $daysBetweenSettlementAndMaturity; - } - - return Functions::VALUE(); - } - - /** - * DOLLARDE. - * - * Converts a dollar price expressed as an integer part and a fraction - * part into a dollar price expressed as a decimal number. - * Fractional dollar numbers are sometimes used for security prices. - * - * Excel Function: - * DOLLARDE(fractional_dollar,fraction) - * - * @param float $fractional_dollar Fractional Dollar - * @param int $fraction Fraction - * - * @return float|string - */ - public static function DOLLARDE($fractional_dollar = null, $fraction = 0) - { - $fractional_dollar = Functions::flattenSingleValue($fractional_dollar); - $fraction = (int) Functions::flattenSingleValue($fraction); - - // Validate parameters - if ($fractional_dollar === null || $fraction < 0) { - return Functions::NAN(); - } - if ($fraction == 0) { - return Functions::DIV0(); - } - - $dollars = floor($fractional_dollar); - $cents = fmod($fractional_dollar, 1); - $cents /= $fraction; - $cents *= 10 ** ceil(log10($fraction)); - - return $dollars + $cents; - } - - /** - * DOLLARFR. - * - * Converts a dollar price expressed as a decimal number into a dollar price - * expressed as a fraction. - * Fractional dollar numbers are sometimes used for security prices. - * - * Excel Function: - * DOLLARFR(decimal_dollar,fraction) - * - * @param float $decimal_dollar Decimal Dollar - * @param int $fraction Fraction - * - * @return float|string - */ - public static function DOLLARFR($decimal_dollar = null, $fraction = 0) - { - $decimal_dollar = Functions::flattenSingleValue($decimal_dollar); - $fraction = (int) Functions::flattenSingleValue($fraction); - - // Validate parameters - if ($decimal_dollar === null || $fraction < 0) { - return Functions::NAN(); - } - if ($fraction == 0) { - return Functions::DIV0(); - } - - $dollars = floor($decimal_dollar); - $cents = fmod($decimal_dollar, 1); - $cents *= $fraction; - $cents *= 10 ** (-ceil(log10($fraction))); - - return $dollars + $cents; - } - - /** - * EFFECT. - * - * Returns the effective interest rate given the nominal rate and the number of - * compounding payments per year. - * - * Excel Function: - * EFFECT(nominal_rate,npery) - * - * @param float $nominal_rate Nominal interest rate - * @param int $npery Number of compounding payments per year - * - * @return float|string - */ - public static function EFFECT($nominal_rate = 0, $npery = 0) - { - $nominal_rate = Functions::flattenSingleValue($nominal_rate); - $npery = (int) Functions::flattenSingleValue($npery); - - // Validate parameters - if ($nominal_rate <= 0 || $npery < 1) { - return Functions::NAN(); - } - - return (1 + $nominal_rate / $npery) ** $npery - 1; - } - - /** - * FV. - * - * Returns the Future Value of a cash flow with constant payments and interest rate (annuities). - * - * Excel Function: - * FV(rate,nper,pmt[,pv[,type]]) - * - * @param float $rate The interest rate per period - * @param int $nper Total number of payment periods in an annuity - * @param float $pmt The payment made each period: it cannot change over the - * life of the annuity. Typically, pmt contains principal - * and interest but no other fees or taxes. - * @param float $pv present Value, or the lump-sum amount that a series of - * future payments is worth right now - * @param int $type A number 0 or 1 and indicates when payments are due: - * 0 or omitted At the end of the period. - * 1 At the beginning of the period. - * - * @return float|string - */ - public static function FV($rate = 0, $nper = 0, $pmt = 0, $pv = 0, $type = 0) - { - $rate = Functions::flattenSingleValue($rate); - $nper = Functions::flattenSingleValue($nper); - $pmt = Functions::flattenSingleValue($pmt); - $pv = Functions::flattenSingleValue($pv); - $type = Functions::flattenSingleValue($type); - - // Validate parameters - if ($type != 0 && $type != 1) { - return Functions::NAN(); - } - - // Calculate - if ($rate !== null && $rate != 0) { - return -$pv * (1 + $rate) ** $nper - $pmt * (1 + $rate * $type) * ((1 + $rate) ** $nper - 1) / $rate; - } - - return -$pv - $pmt * $nper; - } - - /** - * FVSCHEDULE. - * - * Returns the future value of an initial principal after applying a series of compound interest rates. - * Use FVSCHEDULE to calculate the future value of an investment with a variable or adjustable rate. - * - * Excel Function: - * FVSCHEDULE(principal,schedule) - * - * @param float $principal the present value - * @param float[] $schedule an array of interest rates to apply - * - * @return float - */ - public static function FVSCHEDULE($principal, $schedule) - { - $principal = Functions::flattenSingleValue($principal); - $schedule = Functions::flattenArray($schedule); - - foreach ($schedule as $rate) { - $principal *= 1 + $rate; - } - - return $principal; - } - - /** - * INTRATE. - * - * Returns the interest rate for a fully invested security. - * - * Excel Function: - * INTRATE(settlement,maturity,investment,redemption[,basis]) - * - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param int $investment the amount invested in the security - * @param int $redemption the amount to be received at maturity - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string - */ - public static function INTRATE($settlement, $maturity, $investment, $redemption, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $investment = Functions::flattenSingleValue($investment); - $redemption = Functions::flattenSingleValue($redemption); - $basis = Functions::flattenSingleValue($basis); - - // Validate - if ((is_numeric($investment)) && (is_numeric($redemption)) && (is_numeric($basis))) { - $investment = (float) $investment; - $redemption = (float) $redemption; - $basis = (int) $basis; - if (($investment <= 0) || ($redemption <= 0)) { - return Functions::NAN(); - } - $daysBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity, $basis); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { - // return date error - return $daysBetweenSettlementAndMaturity; - } - - return (($redemption / $investment) - 1) / ($daysBetweenSettlementAndMaturity); - } - - return Functions::VALUE(); - } - - /** - * IPMT. - * - * Returns the interest payment for a given period for an investment based on periodic, constant payments and a constant interest rate. - * - * Excel Function: - * IPMT(rate,per,nper,pv[,fv][,type]) - * - * @param float $rate Interest rate per period - * @param int $per Period for which we want to find the interest - * @param int $nper Number of periods - * @param float $pv Present Value - * @param float $fv Future Value - * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period - * - * @return float|string - */ - public static function IPMT($rate, $per, $nper, $pv, $fv = 0, $type = 0) - { - $rate = Functions::flattenSingleValue($rate); - $per = (int) Functions::flattenSingleValue($per); - $nper = (int) Functions::flattenSingleValue($nper); - $pv = Functions::flattenSingleValue($pv); - $fv = Functions::flattenSingleValue($fv); - $type = (int) Functions::flattenSingleValue($type); - - // Validate parameters - if ($type != 0 && $type != 1) { - return Functions::NAN(); - } - if ($per <= 0 || $per > $nper) { - return Functions::VALUE(); - } - - // Calculate - $interestAndPrincipal = self::interestAndPrincipal($rate, $per, $nper, $pv, $fv, $type); - - return $interestAndPrincipal[0]; - } - - /** - * IRR. - * - * Returns the internal rate of return for a series of cash flows represented by the numbers in values. - * These cash flows do not have to be even, as they would be for an annuity. However, the cash flows must occur - * at regular intervals, such as monthly or annually. The internal rate of return is the interest rate received - * for an investment consisting of payments (negative values) and income (positive values) that occur at regular - * periods. - * - * Excel Function: - * IRR(values[,guess]) - * - * @param float[] $values An array or a reference to cells that contain numbers for which you want - * to calculate the internal rate of return. - * Values must contain at least one positive value and one negative value to - * calculate the internal rate of return. - * @param float $guess A number that you guess is close to the result of IRR - * - * @return float|string - */ - public static function IRR($values, $guess = 0.1) - { - if (!is_array($values)) { - return Functions::VALUE(); - } - $values = Functions::flattenArray($values); - $guess = Functions::flattenSingleValue($guess); - - // create an initial range, with a root somewhere between 0 and guess - $x1 = 0.0; - $x2 = $guess; - $f1 = self::NPV($x1, $values); - $f2 = self::NPV($x2, $values); - for ($i = 0; $i < self::FINANCIAL_MAX_ITERATIONS; ++$i) { - if (($f1 * $f2) < 0.0) { - break; - } - if (abs($f1) < abs($f2)) { - $f1 = self::NPV($x1 += 1.6 * ($x1 - $x2), $values); - } else { - $f2 = self::NPV($x2 += 1.6 * ($x2 - $x1), $values); - } - } - if (($f1 * $f2) > 0.0) { - return Functions::VALUE(); - } - - $f = self::NPV($x1, $values); - if ($f < 0.0) { - $rtb = $x1; - $dx = $x2 - $x1; - } else { - $rtb = $x2; - $dx = $x1 - $x2; - } - - for ($i = 0; $i < self::FINANCIAL_MAX_ITERATIONS; ++$i) { - $dx *= 0.5; - $x_mid = $rtb + $dx; - $f_mid = self::NPV($x_mid, $values); - if ($f_mid <= 0.0) { - $rtb = $x_mid; - } - if ((abs($f_mid) < self::FINANCIAL_PRECISION) || (abs($dx) < self::FINANCIAL_PRECISION)) { - return $x_mid; - } - } - - return Functions::VALUE(); - } - - /** - * ISPMT. - * - * Returns the interest payment for an investment based on an interest rate and a constant payment schedule. - * - * Excel Function: - * =ISPMT(interest_rate, period, number_payments, PV) - * - * interest_rate is the interest rate for the investment - * - * period is the period to calculate the interest rate. It must be betweeen 1 and number_payments. - * - * number_payments is the number of payments for the annuity - * - * PV is the loan amount or present value of the payments - */ - public static function ISPMT(...$args) - { - // Return value - $returnValue = 0; - - // Get the parameters - $aArgs = Functions::flattenArray($args); - $interestRate = array_shift($aArgs); - $period = array_shift($aArgs); - $numberPeriods = array_shift($aArgs); - $principleRemaining = array_shift($aArgs); - - // Calculate - $principlePayment = ($principleRemaining * 1.0) / ($numberPeriods * 1.0); - for ($i = 0; $i <= $period; ++$i) { - $returnValue = $interestRate * $principleRemaining * -1; - $principleRemaining -= $principlePayment; - // principle needs to be 0 after the last payment, don't let floating point screw it up - if ($i == $numberPeriods) { - $returnValue = 0; - } - } - - return $returnValue; - } - - /** - * MIRR. - * - * Returns the modified internal rate of return for a series of periodic cash flows. MIRR considers both - * the cost of the investment and the interest received on reinvestment of cash. - * - * Excel Function: - * MIRR(values,finance_rate, reinvestment_rate) - * - * @param float[] $values An array or a reference to cells that contain a series of payments and - * income occurring at regular intervals. - * Payments are negative value, income is positive values. - * @param float $finance_rate The interest rate you pay on the money used in the cash flows - * @param float $reinvestment_rate The interest rate you receive on the cash flows as you reinvest them - * - * @return float|string Result, or a string containing an error - */ - public static function MIRR($values, $finance_rate, $reinvestment_rate) - { - if (!is_array($values)) { - return Functions::VALUE(); - } - $values = Functions::flattenArray($values); - $finance_rate = Functions::flattenSingleValue($finance_rate); - $reinvestment_rate = Functions::flattenSingleValue($reinvestment_rate); - $n = count($values); - - $rr = 1.0 + $reinvestment_rate; - $fr = 1.0 + $finance_rate; - - $npv_pos = $npv_neg = 0.0; - foreach ($values as $i => $v) { - if ($v >= 0) { - $npv_pos += $v / $rr ** $i; - } else { - $npv_neg += $v / $fr ** $i; - } - } - - if (($npv_neg == 0) || ($npv_pos == 0) || ($reinvestment_rate <= -1)) { - return Functions::VALUE(); - } - - $mirr = ((-$npv_pos * $rr ** $n) - / ($npv_neg * ($rr))) ** (1.0 / ($n - 1)) - 1.0; - - return is_finite($mirr) ? $mirr : Functions::VALUE(); - } - - /** - * NOMINAL. - * - * Returns the nominal interest rate given the effective rate and the number of compounding payments per year. - * - * @param float $effect_rate Effective interest rate - * @param int $npery Number of compounding payments per year - * - * @return float|string Result, or a string containing an error - */ - public static function NOMINAL($effect_rate = 0, $npery = 0) - { - $effect_rate = Functions::flattenSingleValue($effect_rate); - $npery = (int) Functions::flattenSingleValue($npery); - - // Validate parameters - if ($effect_rate <= 0 || $npery < 1) { - return Functions::NAN(); - } - - // Calculate - return $npery * (($effect_rate + 1) ** (1 / $npery) - 1); - } - - /** - * NPER. - * - * Returns the number of periods for a cash flow with constant periodic payments (annuities), and interest rate. - * - * @param float $rate Interest rate per period - * @param int $pmt Periodic payment (annuity) - * @param float $pv Present Value - * @param float $fv Future Value - * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period - * - * @return float|string Result, or a string containing an error - */ - public static function NPER($rate = 0, $pmt = 0, $pv = 0, $fv = 0, $type = 0) - { - $rate = Functions::flattenSingleValue($rate); - $pmt = Functions::flattenSingleValue($pmt); - $pv = Functions::flattenSingleValue($pv); - $fv = Functions::flattenSingleValue($fv); - $type = Functions::flattenSingleValue($type); - - // Validate parameters - if ($type != 0 && $type != 1) { - return Functions::NAN(); - } - - // Calculate - if ($rate !== null && $rate != 0) { - if ($pmt == 0 && $pv == 0) { - return Functions::NAN(); - } - - return log(($pmt * (1 + $rate * $type) / $rate - $fv) / ($pv + $pmt * (1 + $rate * $type) / $rate)) / log(1 + $rate); - } - if ($pmt == 0) { - return Functions::NAN(); - } - - return (-$pv - $fv) / $pmt; - } - - /** - * NPV. - * - * Returns the Net Present Value of a cash flow series given a discount rate. - * - * @return float - */ - public static function NPV(...$args) - { - // Return value - $returnValue = 0; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - - // Calculate - $rate = array_shift($aArgs); - $countArgs = count($aArgs); - for ($i = 1; $i <= $countArgs; ++$i) { - // Is it a numeric value? - if (is_numeric($aArgs[$i - 1])) { - $returnValue += $aArgs[$i - 1] / (1 + $rate) ** $i; - } - } - - // Return - return $returnValue; - } - - /** - * PDURATION. - * - * Calculates the number of periods required for an investment to reach a specified value. - * - * @param float $rate Interest rate per period - * @param float $pv Present Value - * @param float $fv Future Value - * - * @return float|string Result, or a string containing an error - */ - public static function PDURATION($rate = 0, $pv = 0, $fv = 0) - { - $rate = Functions::flattenSingleValue($rate); - $pv = Functions::flattenSingleValue($pv); - $fv = Functions::flattenSingleValue($fv); - - // Validate parameters - if (!is_numeric($rate) || !is_numeric($pv) || !is_numeric($fv)) { - return Functions::VALUE(); - } elseif ($rate <= 0.0 || $pv <= 0.0 || $fv <= 0.0) { - return Functions::NAN(); - } - - return (log($fv) - log($pv)) / log(1 + $rate); - } - - /** - * PMT. - * - * Returns the constant payment (annuity) for a cash flow with a constant interest rate. - * - * @param float $rate Interest rate per period - * @param int $nper Number of periods - * @param float $pv Present Value - * @param float $fv Future Value - * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period - * - * @return float|string Result, or a string containing an error - */ - public static function PMT($rate = 0, $nper = 0, $pv = 0, $fv = 0, $type = 0) - { - $rate = Functions::flattenSingleValue($rate); - $nper = Functions::flattenSingleValue($nper); - $pv = Functions::flattenSingleValue($pv); - $fv = Functions::flattenSingleValue($fv); - $type = Functions::flattenSingleValue($type); - - // Validate parameters - if ($type != 0 && $type != 1) { - return Functions::NAN(); - } - - // Calculate - if ($rate !== null && $rate != 0) { - return (-$fv - $pv * (1 + $rate) ** $nper) / (1 + $rate * $type) / (((1 + $rate) ** $nper - 1) / $rate); - } - - return (-$pv - $fv) / $nper; - } - - /** - * PPMT. - * - * Returns the interest payment for a given period for an investment based on periodic, constant payments and a constant interest rate. - * - * @param float $rate Interest rate per period - * @param int $per Period for which we want to find the interest - * @param int $nper Number of periods - * @param float $pv Present Value - * @param float $fv Future Value - * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period - * - * @return float|string Result, or a string containing an error - */ - public static function PPMT($rate, $per, $nper, $pv, $fv = 0, $type = 0) - { - $rate = Functions::flattenSingleValue($rate); - $per = (int) Functions::flattenSingleValue($per); - $nper = (int) Functions::flattenSingleValue($nper); - $pv = Functions::flattenSingleValue($pv); - $fv = Functions::flattenSingleValue($fv); - $type = (int) Functions::flattenSingleValue($type); - - // Validate parameters - if ($type != 0 && $type != 1) { - return Functions::NAN(); - } - if ($per <= 0 || $per > $nper) { - return Functions::VALUE(); - } - - // Calculate - $interestAndPrincipal = self::interestAndPrincipal($rate, $per, $nper, $pv, $fv, $type); - - return $interestAndPrincipal[1]; - } - - private static function validatePrice($settlement, $maturity, $rate, $yield, $redemption, $frequency, $basis) - { - if (is_string($settlement)) { - return Functions::VALUE(); - } - if (is_string($maturity)) { - return Functions::VALUE(); - } - if (!is_numeric($rate)) { - return Functions::VALUE(); - } - if (!is_numeric($yield)) { - return Functions::VALUE(); - } - if (!is_numeric($redemption)) { - return Functions::VALUE(); - } - if (!is_numeric($frequency)) { - return Functions::VALUE(); - } - if (!is_numeric($basis)) { - return Functions::VALUE(); - } - - return ''; - } - - public static function PRICE($settlement, $maturity, $rate, $yield, $redemption, $frequency, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $rate = Functions::flattenSingleValue($rate); - $yield = Functions::flattenSingleValue($yield); - $redemption = Functions::flattenSingleValue($redemption); - $frequency = Functions::flattenSingleValue($frequency); - $basis = Functions::flattenSingleValue($basis); - - $settlement = DateTime::getDateValue($settlement); - $maturity = DateTime::getDateValue($maturity); - $rslt = self::validatePrice($settlement, $maturity, $rate, $yield, $redemption, $frequency, $basis); - if ($rslt) { - return $rslt; - } - $rate = (float) $rate; - $yield = (float) $yield; - $redemption = (float) $redemption; - $frequency = (int) $frequency; - $basis = (int) $basis; - - if ( - ($settlement > $maturity) || - (!self::isValidFrequency($frequency)) || - (($basis < 0) || ($basis > 4)) - ) { - return Functions::NAN(); - } - - $dsc = self::COUPDAYSNC($settlement, $maturity, $frequency, $basis); - $e = self::COUPDAYS($settlement, $maturity, $frequency, $basis); - $n = self::COUPNUM($settlement, $maturity, $frequency, $basis); - $a = self::COUPDAYBS($settlement, $maturity, $frequency, $basis); - - $baseYF = 1.0 + ($yield / $frequency); - $rfp = 100 * ($rate / $frequency); - $de = $dsc / $e; - - $result = $redemption / $baseYF ** (--$n + $de); - for ($k = 0; $k <= $n; ++$k) { - $result += $rfp / ($baseYF ** ($k + $de)); - } - $result -= $rfp * ($a / $e); - - return $result; - } - - /** - * PRICEDISC. - * - * Returns the price per $100 face value of a discounted security. - * - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param int $discount The security's discount rate - * @param int $redemption The security's redemption value per $100 face value - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string Result, or a string containing an error - */ - public static function PRICEDISC($settlement, $maturity, $discount, $redemption, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $discount = (float) Functions::flattenSingleValue($discount); - $redemption = (float) Functions::flattenSingleValue($redemption); - $basis = (int) Functions::flattenSingleValue($basis); - - // Validate - if ((is_numeric($discount)) && (is_numeric($redemption)) && (is_numeric($basis))) { - if (($discount <= 0) || ($redemption <= 0)) { - return Functions::NAN(); - } - $daysBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity, $basis); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { - // return date error - return $daysBetweenSettlementAndMaturity; - } - - return $redemption * (1 - $discount * $daysBetweenSettlementAndMaturity); - } - - return Functions::VALUE(); - } - - /** - * PRICEMAT. - * - * Returns the price per $100 face value of a security that pays interest at maturity. - * - * @param mixed $settlement The security's settlement date. - * The security's settlement date is the date after the issue date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param mixed $issue The security's issue date - * @param int $rate The security's interest rate at date of issue - * @param int $yield The security's annual yield - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string Result, or a string containing an error - */ - public static function PRICEMAT($settlement, $maturity, $issue, $rate, $yield, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $issue = Functions::flattenSingleValue($issue); - $rate = Functions::flattenSingleValue($rate); - $yield = Functions::flattenSingleValue($yield); - $basis = (int) Functions::flattenSingleValue($basis); - - // Validate - if (is_numeric($rate) && is_numeric($yield)) { - if (($rate <= 0) || ($yield <= 0)) { - return Functions::NAN(); - } - $daysPerYear = self::daysPerYear(DateTime::YEAR($settlement), $basis); - if (!is_numeric($daysPerYear)) { - return $daysPerYear; - } - $daysBetweenIssueAndSettlement = DateTime::YEARFRAC($issue, $settlement, $basis); - if (!is_numeric($daysBetweenIssueAndSettlement)) { - // return date error - return $daysBetweenIssueAndSettlement; - } - $daysBetweenIssueAndSettlement *= $daysPerYear; - $daysBetweenIssueAndMaturity = DateTime::YEARFRAC($issue, $maturity, $basis); - if (!is_numeric($daysBetweenIssueAndMaturity)) { - // return date error - return $daysBetweenIssueAndMaturity; - } - $daysBetweenIssueAndMaturity *= $daysPerYear; - $daysBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity, $basis); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { - // return date error - return $daysBetweenSettlementAndMaturity; - } - $daysBetweenSettlementAndMaturity *= $daysPerYear; - - return (100 + (($daysBetweenIssueAndMaturity / $daysPerYear) * $rate * 100)) / - (1 + (($daysBetweenSettlementAndMaturity / $daysPerYear) * $yield)) - - (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate * 100); - } - - return Functions::VALUE(); - } - - /** - * PV. - * - * Returns the Present Value of a cash flow with constant payments and interest rate (annuities). - * - * @param float $rate Interest rate per period - * @param int $nper Number of periods - * @param float $pmt Periodic payment (annuity) - * @param float $fv Future Value - * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period - * - * @return float|string Result, or a string containing an error - */ - public static function PV($rate = 0, $nper = 0, $pmt = 0, $fv = 0, $type = 0) - { - $rate = Functions::flattenSingleValue($rate); - $nper = Functions::flattenSingleValue($nper); - $pmt = Functions::flattenSingleValue($pmt); - $fv = Functions::flattenSingleValue($fv); - $type = Functions::flattenSingleValue($type); - - // Validate parameters - if ($type != 0 && $type != 1) { - return Functions::NAN(); - } - - // Calculate - if ($rate !== null && $rate != 0) { - return (-$pmt * (1 + $rate * $type) * (((1 + $rate) ** $nper - 1) / $rate) - $fv) / (1 + $rate) ** $nper; - } - - return -$fv - $pmt * $nper; - } - - /** - * RATE. - * - * Returns the interest rate per period of an annuity. - * RATE is calculated by iteration and can have zero or more solutions. - * If the successive results of RATE do not converge to within 0.0000001 after 20 iterations, - * RATE returns the #NUM! error value. - * - * Excel Function: - * RATE(nper,pmt,pv[,fv[,type[,guess]]]) - * - * @param float $nper The total number of payment periods in an annuity - * @param float $pmt The payment made each period and cannot change over the life - * of the annuity. - * Typically, pmt includes principal and interest but no other - * fees or taxes. - * @param float $pv The present value - the total amount that a series of future - * payments is worth now - * @param float $fv The future value, or a cash balance you want to attain after - * the last payment is made. If fv is omitted, it is assumed - * to be 0 (the future value of a loan, for example, is 0). - * @param int $type A number 0 or 1 and indicates when payments are due: - * 0 or omitted At the end of the period. - * 1 At the beginning of the period. - * @param float $guess Your guess for what the rate will be. - * If you omit guess, it is assumed to be 10 percent. - * - * @return float|string - */ - public static function RATE($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1) - { - $nper = (int) Functions::flattenSingleValue($nper); - $pmt = Functions::flattenSingleValue($pmt); - $pv = Functions::flattenSingleValue($pv); - $fv = ($fv === null) ? 0.0 : Functions::flattenSingleValue($fv); - $type = ($type === null) ? 0 : (int) Functions::flattenSingleValue($type); - $guess = ($guess === null) ? 0.1 : Functions::flattenSingleValue($guess); - - $rate = $guess; - // rest of code adapted from python/numpy - $close = false; - $iter = 0; - while (!$close && $iter < self::FINANCIAL_MAX_ITERATIONS) { - $nextdiff = self::rateNextGuess($rate, $nper, $pmt, $pv, $fv, $type); - if (!is_numeric($nextdiff)) { - break; - } - $rate1 = $rate - $nextdiff; - $close = abs($rate1 - $rate) < self::FINANCIAL_PRECISION; - ++$iter; - $rate = $rate1; - } - - return $close ? $rate : Functions::NAN(); - } - - private static function rateNextGuess($rate, $nper, $pmt, $pv, $fv, $type) - { - if ($rate == 0) { - return Functions::NAN(); - } - $tt1 = ($rate + 1) ** $nper; - $tt2 = ($rate + 1) ** ($nper - 1); - $numerator = $fv + $tt1 * $pv + $pmt * ($tt1 - 1) * ($rate * $type + 1) / $rate; - $denominator = $nper * $tt2 * $pv - $pmt * ($tt1 - 1) * ($rate * $type + 1) / ($rate * $rate) - + $nper * $pmt * $tt2 * ($rate * $type + 1) / $rate - + $pmt * ($tt1 - 1) * $type / $rate; - if ($denominator == 0) { - return Functions::NAN(); - } - - return $numerator / $denominator; - } - - /** - * RECEIVED. - * - * Returns the price per $100 face value of a discounted security. - * - * @param mixed $settlement The security's settlement date. - * The security settlement date is the date after the issue date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param int $investment The amount invested in the security - * @param int $discount The security's discount rate - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string Result, or a string containing an error - */ - public static function RECEIVED($settlement, $maturity, $investment, $discount, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $investment = (float) Functions::flattenSingleValue($investment); - $discount = (float) Functions::flattenSingleValue($discount); - $basis = (int) Functions::flattenSingleValue($basis); - - // Validate - if ((is_numeric($investment)) && (is_numeric($discount)) && (is_numeric($basis))) { - if (($investment <= 0) || ($discount <= 0)) { - return Functions::NAN(); - } - $daysBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity, $basis); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { - // return date error - return $daysBetweenSettlementAndMaturity; - } - - return $investment / (1 - ($discount * $daysBetweenSettlementAndMaturity)); - } - - return Functions::VALUE(); - } - - /** - * RRI. - * - * Calculates the interest rate required for an investment to grow to a specified future value . - * - * @param float $nper The number of periods over which the investment is made - * @param float $pv Present Value - * @param float $fv Future Value - * - * @return float|string Result, or a string containing an error - */ - public static function RRI($nper = 0, $pv = 0, $fv = 0) - { - $nper = Functions::flattenSingleValue($nper); - $pv = Functions::flattenSingleValue($pv); - $fv = Functions::flattenSingleValue($fv); - - // Validate parameters - if (!is_numeric($nper) || !is_numeric($pv) || !is_numeric($fv)) { - return Functions::VALUE(); - } elseif ($nper <= 0.0 || $pv <= 0.0 || $fv < 0.0) { - return Functions::NAN(); - } - - return ($fv / $pv) ** (1 / $nper) - 1; - } - - /** - * SLN. - * - * Returns the straight-line depreciation of an asset for one period - * - * @param mixed $cost Initial cost of the asset - * @param mixed $salvage Value at the end of the depreciation - * @param mixed $life Number of periods over which the asset is depreciated - * - * @return float|string Result, or a string containing an error - */ - public static function SLN($cost, $salvage, $life) - { - $cost = Functions::flattenSingleValue($cost); - $salvage = Functions::flattenSingleValue($salvage); - $life = Functions::flattenSingleValue($life); - - // Calculate - if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life))) { - if ($life < 0) { - return Functions::NAN(); - } - - return ($cost - $salvage) / $life; - } - - return Functions::VALUE(); - } - - /** - * SYD. - * - * Returns the sum-of-years' digits depreciation of an asset for a specified period. - * - * @param mixed $cost Initial cost of the asset - * @param mixed $salvage Value at the end of the depreciation - * @param mixed $life Number of periods over which the asset is depreciated - * @param mixed $period Period - * - * @return float|string Result, or a string containing an error - */ - public static function SYD($cost, $salvage, $life, $period) - { - $cost = Functions::flattenSingleValue($cost); - $salvage = Functions::flattenSingleValue($salvage); - $life = Functions::flattenSingleValue($life); - $period = Functions::flattenSingleValue($period); - - // Calculate - if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period))) { - if (($life < 1) || ($period > $life)) { - return Functions::NAN(); - } - - return (($cost - $salvage) * ($life - $period + 1) * 2) / ($life * ($life + 1)); - } - - return Functions::VALUE(); - } - - /** - * TBILLEQ. - * - * Returns the bond-equivalent yield for a Treasury bill. - * - * @param mixed $settlement The Treasury bill's settlement date. - * The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer. - * @param mixed $maturity The Treasury bill's maturity date. - * The maturity date is the date when the Treasury bill expires. - * @param int $discount The Treasury bill's discount rate - * - * @return float|string Result, or a string containing an error - */ - public static function TBILLEQ($settlement, $maturity, $discount) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $discount = Functions::flattenSingleValue($discount); - - // Use TBILLPRICE for validation - $testValue = self::TBILLPRICE($settlement, $maturity, $discount); - if (is_string($testValue)) { - return $testValue; - } - - if (is_string($maturity = DateTime::getDateValue($maturity))) { - return Functions::VALUE(); - } - - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) { - ++$maturity; - $daysBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity) * 360; - } else { - $daysBetweenSettlementAndMaturity = (DateTime::getDateValue($maturity) - DateTime::getDateValue($settlement)); - } - - return (365 * $discount) / (360 - $discount * $daysBetweenSettlementAndMaturity); - } - - /** - * TBILLPRICE. - * - * Returns the yield for a Treasury bill. - * - * @param mixed $settlement The Treasury bill's settlement date. - * The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer. - * @param mixed $maturity The Treasury bill's maturity date. - * The maturity date is the date when the Treasury bill expires. - * @param int $discount The Treasury bill's discount rate - * - * @return float|string Result, or a string containing an error - */ - public static function TBILLPRICE($settlement, $maturity, $discount) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $discount = Functions::flattenSingleValue($discount); - - if (is_string($maturity = DateTime::getDateValue($maturity))) { - return Functions::VALUE(); - } - - // Validate - if (is_numeric($discount)) { - if ($discount <= 0) { - return Functions::NAN(); - } - - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) { - ++$maturity; - $daysBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity) * 360; - if (!is_numeric($daysBetweenSettlementAndMaturity)) { - // return date error - return $daysBetweenSettlementAndMaturity; - } - } else { - $daysBetweenSettlementAndMaturity = (DateTime::getDateValue($maturity) - DateTime::getDateValue($settlement)); - } - - if ($daysBetweenSettlementAndMaturity > 360) { - return Functions::NAN(); - } - - $price = 100 * (1 - (($discount * $daysBetweenSettlementAndMaturity) / 360)); - if ($price <= 0) { - return Functions::NAN(); - } - - return $price; - } - - return Functions::VALUE(); - } - - /** - * TBILLYIELD. - * - * Returns the yield for a Treasury bill. - * - * @param mixed $settlement The Treasury bill's settlement date. - * The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer. - * @param mixed $maturity The Treasury bill's maturity date. - * The maturity date is the date when the Treasury bill expires. - * @param int $price The Treasury bill's price per $100 face value - * - * @return float|mixed|string - */ - public static function TBILLYIELD($settlement, $maturity, $price) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $price = Functions::flattenSingleValue($price); - - // Validate - if (is_numeric($price)) { - if ($price <= 0) { - return Functions::NAN(); - } - - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) { - ++$maturity; - $daysBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity) * 360; - if (!is_numeric($daysBetweenSettlementAndMaturity)) { - // return date error - return $daysBetweenSettlementAndMaturity; - } - } else { - $daysBetweenSettlementAndMaturity = (DateTime::getDateValue($maturity) - DateTime::getDateValue($settlement)); - } - - if ($daysBetweenSettlementAndMaturity > 360) { - return Functions::NAN(); - } - - return ((100 - $price) / $price) * (360 / $daysBetweenSettlementAndMaturity); - } - - return Functions::VALUE(); - } - - private static function bothNegAndPos($neg, $pos) - { - return $neg && $pos; - } - - private static function xirrPart2(&$values) - { - $valCount = count($values); - $foundpos = false; - $foundneg = false; - for ($i = 0; $i < $valCount; ++$i) { - $fld = $values[$i]; - if (!is_numeric($fld)) { - return Functions::VALUE(); - } elseif ($fld > 0) { - $foundpos = true; - } elseif ($fld < 0) { - $foundneg = true; - } - } - if (!self::bothNegAndPos($foundneg, $foundpos)) { - return Functions::NAN(); - } - - return ''; - } - - private static function xirrPart1(&$values, &$dates) - { - if ((!is_array($values)) && (!is_array($dates))) { - return Functions::NA(); - } - $values = Functions::flattenArray($values); - $dates = Functions::flattenArray($dates); - if (count($values) != count($dates)) { - return Functions::NAN(); - } - - $datesCount = count($dates); - for ($i = 0; $i < $datesCount; ++$i) { - $dates[$i] = DateTime::getDateValue($dates[$i]); - if (!is_numeric($dates[$i])) { - return Functions::VALUE(); - } - } - - return self::xirrPart2($values); - } - - private static function xirrPart3($values, $dates, $x1, $x2) - { - $f = self::xnpvOrdered($x1, $values, $dates, false); - if ($f < 0.0) { - $rtb = $x1; - $dx = $x2 - $x1; - } else { - $rtb = $x2; - $dx = $x1 - $x2; - } - - $rslt = Functions::VALUE(); - for ($i = 0; $i < self::FINANCIAL_MAX_ITERATIONS; ++$i) { - $dx *= 0.5; - $x_mid = $rtb + $dx; - $f_mid = self::xnpvOrdered($x_mid, $values, $dates, false); - if ($f_mid <= 0.0) { - $rtb = $x_mid; - } - if ((abs($f_mid) < self::FINANCIAL_PRECISION) || (abs($dx) < self::FINANCIAL_PRECISION)) { - $rslt = $x_mid; - - break; - } - } - - return $rslt; - } - - /** - * XIRR. - * - * Returns the internal rate of return for a schedule of cash flows that is not necessarily periodic. - * - * Excel Function: - * =XIRR(values,dates,guess) - * - * @param float[] $values A series of cash flow payments - * The series of values must contain at least one positive value & one negative value - * @param mixed[] $dates A series of payment dates - * The first payment date indicates the beginning of the schedule of payments - * All other dates must be later than this date, but they may occur in any order - * @param float $guess An optional guess at the expected answer - * - * @return float|mixed|string - */ - public static function XIRR($values, $dates, $guess = 0.1) - { - $rslt = self::xirrPart1($values, $dates); - if ($rslt) { - return $rslt; - } - - // create an initial range, with a root somewhere between 0 and guess - $guess = Functions::flattenSingleValue($guess); - $x1 = 0.0; - $x2 = $guess ? $guess : 0.1; - $f1 = self::xnpvOrdered($x1, $values, $dates, false); - $f2 = self::xnpvOrdered($x2, $values, $dates, false); - $found = false; - for ($i = 0; $i < self::FINANCIAL_MAX_ITERATIONS; ++$i) { - if (!is_numeric($f1) || !is_numeric($f2)) { - break; - } - if (($f1 * $f2) < 0.0) { - $found = true; - - break; - } elseif (abs($f1) < abs($f2)) { - $f1 = self::xnpvOrdered($x1 += 1.6 * ($x1 - $x2), $values, $dates, false); - } else { - $f2 = self::xnpvOrdered($x2 += 1.6 * ($x2 - $x1), $values, $dates, false); - } - } - if (!$found) { - return Functions::NAN(); - } - - return self::xirrPart3($values, $dates, $x1, $x2); - } - - /** - * XNPV. - * - * Returns the net present value for a schedule of cash flows that is not necessarily periodic. - * To calculate the net present value for a series of cash flows that is periodic, use the NPV function. - * - * Excel Function: - * =XNPV(rate,values,dates) - * - * @param float $rate the discount rate to apply to the cash flows - * @param float[] $values A series of cash flows that corresponds to a schedule of payments in dates. - * The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. - * If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. - * The series of values must contain at least one positive value and one negative value. - * @param mixed[] $dates A schedule of payment dates that corresponds to the cash flow payments. - * The first payment date indicates the beginning of the schedule of payments. - * All other dates must be later than this date, but they may occur in any order. - * - * @return float|mixed|string - */ - public static function XNPV($rate, $values, $dates) - { - return self::xnpvOrdered($rate, $values, $dates, true); - } - - private static function validateXnpv($rate, $values, $dates) - { - if (!is_numeric($rate)) { - return Functions::VALUE(); - } - $valCount = count($values); - if ($valCount != count($dates)) { - return Functions::NAN(); - } - if ($valCount > 1 && ((min($values) > 0) || (max($values) < 0))) { - return Functions::NAN(); - } - $date0 = DateTime::getDateValue($dates[0]); - if (is_string($date0)) { - return Functions::VALUE(); - } - - return ''; - } - - private static function xnpvOrdered($rate, $values, $dates, $ordered = true) - { - $rate = Functions::flattenSingleValue($rate); - $values = Functions::flattenArray($values); - $dates = Functions::flattenArray($dates); - $valCount = count($values); - $date0 = DateTime::getDateValue($dates[0]); - $rslt = self::validateXnpv($rate, $values, $dates); - if ($rslt) { - return $rslt; - } - $xnpv = 0.0; - for ($i = 0; $i < $valCount; ++$i) { - if (!is_numeric($values[$i])) { - return Functions::VALUE(); - } - $datei = DateTime::getDateValue($dates[$i]); - if (is_string($datei)) { - return Functions::VALUE(); - } - if ($date0 > $datei) { - $dif = $ordered ? Functions::NAN() : -DateTime::DATEDIF($datei, $date0, 'd'); - } else { - $dif = DateTime::DATEDIF($date0, $datei, 'd'); - } - if (!is_numeric($dif)) { - return $dif; - } - $xnpv += $values[$i] / (1 + $rate) ** ($dif / 365); - } - - return is_finite($xnpv) ? $xnpv : Functions::VALUE(); - } - - /** - * YIELDDISC. - * - * Returns the annual yield of a security that pays interest at maturity. - * - * @param mixed $settlement The security's settlement date. - * The security's settlement date is the date after the issue date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param int $price The security's price per $100 face value - * @param int $redemption The security's redemption value per $100 face value - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string Result, or a string containing an error - */ - public static function YIELDDISC($settlement, $maturity, $price, $redemption, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $price = Functions::flattenSingleValue($price); - $redemption = Functions::flattenSingleValue($redemption); - $basis = (int) Functions::flattenSingleValue($basis); - - // Validate - if (is_numeric($price) && is_numeric($redemption)) { - if (($price <= 0) || ($redemption <= 0)) { - return Functions::NAN(); - } - $daysPerYear = self::daysPerYear(DateTime::YEAR($settlement), $basis); - if (!is_numeric($daysPerYear)) { - return $daysPerYear; - } - $daysBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity, $basis); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { - // return date error - return $daysBetweenSettlementAndMaturity; - } - $daysBetweenSettlementAndMaturity *= $daysPerYear; - - return (($redemption - $price) / $price) * ($daysPerYear / $daysBetweenSettlementAndMaturity); - } - - return Functions::VALUE(); - } - - /** - * YIELDMAT. - * - * Returns the annual yield of a security that pays interest at maturity. - * - * @param mixed $settlement The security's settlement date. - * The security's settlement date is the date after the issue date when the security is traded to the buyer. - * @param mixed $maturity The security's maturity date. - * The maturity date is the date when the security expires. - * @param mixed $issue The security's issue date - * @param int $rate The security's interest rate at date of issue - * @param int $price The security's price per $100 face value - * @param int $basis The type of day count to use. - * 0 or omitted US (NASD) 30/360 - * 1 Actual/actual - * 2 Actual/360 - * 3 Actual/365 - * 4 European 30/360 - * - * @return float|string Result, or a string containing an error - */ - public static function YIELDMAT($settlement, $maturity, $issue, $rate, $price, $basis = 0) - { - $settlement = Functions::flattenSingleValue($settlement); - $maturity = Functions::flattenSingleValue($maturity); - $issue = Functions::flattenSingleValue($issue); - $rate = Functions::flattenSingleValue($rate); - $price = Functions::flattenSingleValue($price); - $basis = (int) Functions::flattenSingleValue($basis); - - // Validate - if (is_numeric($rate) && is_numeric($price)) { - if (($rate <= 0) || ($price <= 0)) { - return Functions::NAN(); - } - $daysPerYear = self::daysPerYear(DateTime::YEAR($settlement), $basis); - if (!is_numeric($daysPerYear)) { - return $daysPerYear; - } - $daysBetweenIssueAndSettlement = DateTime::YEARFRAC($issue, $settlement, $basis); - if (!is_numeric($daysBetweenIssueAndSettlement)) { - // return date error - return $daysBetweenIssueAndSettlement; - } - $daysBetweenIssueAndSettlement *= $daysPerYear; - $daysBetweenIssueAndMaturity = DateTime::YEARFRAC($issue, $maturity, $basis); - if (!is_numeric($daysBetweenIssueAndMaturity)) { - // return date error - return $daysBetweenIssueAndMaturity; - } - $daysBetweenIssueAndMaturity *= $daysPerYear; - $daysBetweenSettlementAndMaturity = DateTime::YEARFRAC($settlement, $maturity, $basis); - if (!is_numeric($daysBetweenSettlementAndMaturity)) { - // return date error - return $daysBetweenSettlementAndMaturity; - } - $daysBetweenSettlementAndMaturity *= $daysPerYear; - - return ((1 + (($daysBetweenIssueAndMaturity / $daysPerYear) * $rate) - (($price / 100) + (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate))) / - (($price / 100) + (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate))) * - ($daysPerYear / $daysBetweenSettlementAndMaturity); - } - - return Functions::VALUE(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php deleted file mode 100644 index c11af83..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php +++ /dev/null @@ -1,631 +0,0 @@ -<'; - const OPERATORS_POSTFIX = '%'; - - /** - * Formula. - * - * @var string - */ - private $formula; - - /** - * Tokens. - * - * @var FormulaToken[] - */ - private $tokens = []; - - /** - * Create a new FormulaParser. - * - * @param string $pFormula Formula to parse - */ - public function __construct($pFormula = '') - { - // Check parameters - if ($pFormula === null) { - throw new Exception('Invalid parameter passed: formula'); - } - - // Initialise values - $this->formula = trim($pFormula); - // Parse! - $this->parseToTokens(); - } - - /** - * Get Formula. - * - * @return string - */ - public function getFormula() - { - return $this->formula; - } - - /** - * Get Token. - * - * @param int $pId Token id - * - * @return string - */ - public function getToken($pId = 0) - { - if (isset($this->tokens[$pId])) { - return $this->tokens[$pId]; - } - - throw new Exception("Token with id $pId does not exist."); - } - - /** - * Get Token count. - * - * @return int - */ - public function getTokenCount() - { - return count($this->tokens); - } - - /** - * Get Tokens. - * - * @return FormulaToken[] - */ - public function getTokens() - { - return $this->tokens; - } - - /** - * Parse to tokens. - */ - private function parseToTokens(): void - { - // No attempt is made to verify formulas; assumes formulas are derived from Excel, where - // they can only exist if valid; stack overflows/underflows sunk as nulls without exceptions. - - // Check if the formula has a valid starting = - $formulaLength = strlen($this->formula); - if ($formulaLength < 2 || $this->formula[0] != '=') { - return; - } - - // Helper variables - $tokens1 = $tokens2 = $stack = []; - $inString = $inPath = $inRange = $inError = false; - $token = $previousToken = $nextToken = null; - - $index = 1; - $value = ''; - - $ERRORS = ['#NULL!', '#DIV/0!', '#VALUE!', '#REF!', '#NAME?', '#NUM!', '#N/A']; - $COMPARATORS_MULTI = ['>=', '<=', '<>']; - - while ($index < $formulaLength) { - // state-dependent character evaluation (order is important) - - // double-quoted strings - // embeds are doubled - // end marks token - if ($inString) { - if ($this->formula[$index] == self::QUOTE_DOUBLE) { - if ((($index + 2) <= $formulaLength) && ($this->formula[$index + 1] == self::QUOTE_DOUBLE)) { - $value .= self::QUOTE_DOUBLE; - ++$index; - } else { - $inString = false; - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND, FormulaToken::TOKEN_SUBTYPE_TEXT); - $value = ''; - } - } else { - $value .= $this->formula[$index]; - } - ++$index; - - continue; - } - - // single-quoted strings (links) - // embeds are double - // end does not mark a token - if ($inPath) { - if ($this->formula[$index] == self::QUOTE_SINGLE) { - if ((($index + 2) <= $formulaLength) && ($this->formula[$index + 1] == self::QUOTE_SINGLE)) { - $value .= self::QUOTE_SINGLE; - ++$index; - } else { - $inPath = false; - } - } else { - $value .= $this->formula[$index]; - } - ++$index; - - continue; - } - - // bracked strings (R1C1 range index or linked workbook name) - // no embeds (changed to "()" by Excel) - // end does not mark a token - if ($inRange) { - if ($this->formula[$index] == self::BRACKET_CLOSE) { - $inRange = false; - } - $value .= $this->formula[$index]; - ++$index; - - continue; - } - - // error values - // end marks a token, determined from absolute list of values - if ($inError) { - $value .= $this->formula[$index]; - ++$index; - if (in_array($value, $ERRORS)) { - $inError = false; - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND, FormulaToken::TOKEN_SUBTYPE_ERROR); - $value = ''; - } - - continue; - } - - // scientific notation check - if (strpos(self::OPERATORS_SN, $this->formula[$index]) !== false) { - if (strlen($value) > 1) { - if (preg_match('/^[1-9]{1}(\\.\\d+)?E{1}$/', $this->formula[$index]) != 0) { - $value .= $this->formula[$index]; - ++$index; - - continue; - } - } - } - - // independent character evaluation (order not important) - - // establish state-dependent character evaluations - if ($this->formula[$index] == self::QUOTE_DOUBLE) { - if (strlen($value) > 0) { - // unexpected - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_UNKNOWN); - $value = ''; - } - $inString = true; - ++$index; - - continue; - } - - if ($this->formula[$index] == self::QUOTE_SINGLE) { - if (strlen($value) > 0) { - // unexpected - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_UNKNOWN); - $value = ''; - } - $inPath = true; - ++$index; - - continue; - } - - if ($this->formula[$index] == self::BRACKET_OPEN) { - $inRange = true; - $value .= self::BRACKET_OPEN; - ++$index; - - continue; - } - - if ($this->formula[$index] == self::ERROR_START) { - if (strlen($value) > 0) { - // unexpected - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_UNKNOWN); - $value = ''; - } - $inError = true; - $value .= self::ERROR_START; - ++$index; - - continue; - } - - // mark start and end of arrays and array rows - if ($this->formula[$index] == self::BRACE_OPEN) { - if (strlen($value) > 0) { - // unexpected - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_UNKNOWN); - $value = ''; - } - - $tmp = new FormulaToken('ARRAY', FormulaToken::TOKEN_TYPE_FUNCTION, FormulaToken::TOKEN_SUBTYPE_START); - $tokens1[] = $tmp; - $stack[] = clone $tmp; - - $tmp = new FormulaToken('ARRAYROW', FormulaToken::TOKEN_TYPE_FUNCTION, FormulaToken::TOKEN_SUBTYPE_START); - $tokens1[] = $tmp; - $stack[] = clone $tmp; - - ++$index; - - continue; - } - - if ($this->formula[$index] == self::SEMICOLON) { - if (strlen($value) > 0) { - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); - $value = ''; - } - - $tmp = array_pop($stack); - $tmp->setValue(''); - $tmp->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_STOP); - $tokens1[] = $tmp; - - $tmp = new FormulaToken(',', FormulaToken::TOKEN_TYPE_ARGUMENT); - $tokens1[] = $tmp; - - $tmp = new FormulaToken('ARRAYROW', FormulaToken::TOKEN_TYPE_FUNCTION, FormulaToken::TOKEN_SUBTYPE_START); - $tokens1[] = $tmp; - $stack[] = clone $tmp; - - ++$index; - - continue; - } - - if ($this->formula[$index] == self::BRACE_CLOSE) { - if (strlen($value) > 0) { - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); - $value = ''; - } - - $tmp = array_pop($stack); - $tmp->setValue(''); - $tmp->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_STOP); - $tokens1[] = $tmp; - - $tmp = array_pop($stack); - $tmp->setValue(''); - $tmp->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_STOP); - $tokens1[] = $tmp; - - ++$index; - - continue; - } - - // trim white-space - if ($this->formula[$index] == self::WHITESPACE) { - if (strlen($value) > 0) { - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); - $value = ''; - } - $tokens1[] = new FormulaToken('', FormulaToken::TOKEN_TYPE_WHITESPACE); - ++$index; - while (($this->formula[$index] == self::WHITESPACE) && ($index < $formulaLength)) { - ++$index; - } - - continue; - } - - // multi-character comparators - if (($index + 2) <= $formulaLength) { - if (in_array(substr($this->formula, $index, 2), $COMPARATORS_MULTI)) { - if (strlen($value) > 0) { - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); - $value = ''; - } - $tokens1[] = new FormulaToken(substr($this->formula, $index, 2), FormulaToken::TOKEN_TYPE_OPERATORINFIX, FormulaToken::TOKEN_SUBTYPE_LOGICAL); - $index += 2; - - continue; - } - } - - // standard infix operators - if (strpos(self::OPERATORS_INFIX, $this->formula[$index]) !== false) { - if (strlen($value) > 0) { - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); - $value = ''; - } - $tokens1[] = new FormulaToken($this->formula[$index], FormulaToken::TOKEN_TYPE_OPERATORINFIX); - ++$index; - - continue; - } - - // standard postfix operators (only one) - if (strpos(self::OPERATORS_POSTFIX, $this->formula[$index]) !== false) { - if (strlen($value) > 0) { - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); - $value = ''; - } - $tokens1[] = new FormulaToken($this->formula[$index], FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX); - ++$index; - - continue; - } - - // start subexpression or function - if ($this->formula[$index] == self::PAREN_OPEN) { - if (strlen($value) > 0) { - $tmp = new FormulaToken($value, FormulaToken::TOKEN_TYPE_FUNCTION, FormulaToken::TOKEN_SUBTYPE_START); - $tokens1[] = $tmp; - $stack[] = clone $tmp; - $value = ''; - } else { - $tmp = new FormulaToken('', FormulaToken::TOKEN_TYPE_SUBEXPRESSION, FormulaToken::TOKEN_SUBTYPE_START); - $tokens1[] = $tmp; - $stack[] = clone $tmp; - } - ++$index; - - continue; - } - - // function, subexpression, or array parameters, or operand unions - if ($this->formula[$index] == self::COMMA) { - if (strlen($value) > 0) { - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); - $value = ''; - } - - $tmp = array_pop($stack); - $tmp->setValue(''); - $tmp->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_STOP); - $stack[] = $tmp; - - if ($tmp->getTokenType() == FormulaToken::TOKEN_TYPE_FUNCTION) { - $tokens1[] = new FormulaToken(',', FormulaToken::TOKEN_TYPE_OPERATORINFIX, FormulaToken::TOKEN_SUBTYPE_UNION); - } else { - $tokens1[] = new FormulaToken(',', FormulaToken::TOKEN_TYPE_ARGUMENT); - } - ++$index; - - continue; - } - - // stop subexpression - if ($this->formula[$index] == self::PAREN_CLOSE) { - if (strlen($value) > 0) { - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); - $value = ''; - } - - $tmp = array_pop($stack); - $tmp->setValue(''); - $tmp->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_STOP); - $tokens1[] = $tmp; - - ++$index; - - continue; - } - - // token accumulation - $value .= $this->formula[$index]; - ++$index; - } - - // dump remaining accumulation - if (strlen($value) > 0) { - $tokens1[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERAND); - } - - // move tokenList to new set, excluding unnecessary white-space tokens and converting necessary ones to intersections - $tokenCount = count($tokens1); - for ($i = 0; $i < $tokenCount; ++$i) { - $token = $tokens1[$i]; - if (isset($tokens1[$i - 1])) { - $previousToken = $tokens1[$i - 1]; - } else { - $previousToken = null; - } - if (isset($tokens1[$i + 1])) { - $nextToken = $tokens1[$i + 1]; - } else { - $nextToken = null; - } - - if ($token === null) { - continue; - } - - if ($token->getTokenType() != FormulaToken::TOKEN_TYPE_WHITESPACE) { - $tokens2[] = $token; - - continue; - } - - if ($previousToken === null) { - continue; - } - - if ( - !( - (($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_FUNCTION) && ($previousToken->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_STOP)) || - (($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($previousToken->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_STOP)) || - ($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_OPERAND) - ) - ) { - continue; - } - - if ($nextToken === null) { - continue; - } - - if ( - !( - (($nextToken->getTokenType() == FormulaToken::TOKEN_TYPE_FUNCTION) && ($nextToken->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_START)) || - (($nextToken->getTokenType() == FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($nextToken->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_START)) || - ($nextToken->getTokenType() == FormulaToken::TOKEN_TYPE_OPERAND) - ) - ) { - continue; - } - - $tokens2[] = new FormulaToken($value, FormulaToken::TOKEN_TYPE_OPERATORINFIX, FormulaToken::TOKEN_SUBTYPE_INTERSECTION); - } - - // move tokens to final list, switching infix "-" operators to prefix when appropriate, switching infix "+" operators - // to noop when appropriate, identifying operand and infix-operator subtypes, and pulling "@" from function names - $this->tokens = []; - - $tokenCount = count($tokens2); - for ($i = 0; $i < $tokenCount; ++$i) { - $token = $tokens2[$i]; - if (isset($tokens2[$i - 1])) { - $previousToken = $tokens2[$i - 1]; - } else { - $previousToken = null; - } - if (isset($tokens2[$i + 1])) { - $nextToken = $tokens2[$i + 1]; - } else { - $nextToken = null; - } - - if ($token === null) { - continue; - } - - if ($token->getTokenType() == FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getValue() == '-') { - if ($i == 0) { - $token->setTokenType(FormulaToken::TOKEN_TYPE_OPERATORPREFIX); - } elseif ( - (($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_FUNCTION) && - ($previousToken->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_STOP)) || - (($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && - ($previousToken->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_STOP)) || - ($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX) || - ($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_OPERAND) - ) { - $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_MATH); - } else { - $token->setTokenType(FormulaToken::TOKEN_TYPE_OPERATORPREFIX); - } - - $this->tokens[] = $token; - - continue; - } - - if ($token->getTokenType() == FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getValue() == '+') { - if ($i == 0) { - continue; - } elseif ( - (($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_FUNCTION) && - ($previousToken->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_STOP)) || - (($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && - ($previousToken->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_STOP)) || - ($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX) || - ($previousToken->getTokenType() == FormulaToken::TOKEN_TYPE_OPERAND) - ) { - $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_MATH); - } else { - continue; - } - - $this->tokens[] = $token; - - continue; - } - - if ( - $token->getTokenType() == FormulaToken::TOKEN_TYPE_OPERATORINFIX && - $token->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_NOTHING - ) { - if (strpos('<>=', substr($token->getValue(), 0, 1)) !== false) { - $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_LOGICAL); - } elseif ($token->getValue() == '&') { - $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_CONCATENATION); - } else { - $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_MATH); - } - - $this->tokens[] = $token; - - continue; - } - - if ( - $token->getTokenType() == FormulaToken::TOKEN_TYPE_OPERAND && - $token->getTokenSubType() == FormulaToken::TOKEN_SUBTYPE_NOTHING - ) { - if (!is_numeric($token->getValue())) { - if (strtoupper($token->getValue()) == 'TRUE' || strtoupper($token->getValue()) == 'FALSE') { - $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_LOGICAL); - } else { - $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_RANGE); - } - } else { - $token->setTokenSubType(FormulaToken::TOKEN_SUBTYPE_NUMBER); - } - - $this->tokens[] = $token; - - continue; - } - - if ($token->getTokenType() == FormulaToken::TOKEN_TYPE_FUNCTION) { - if (strlen($token->getValue()) > 0) { - if (substr($token->getValue(), 0, 1) == '@') { - $token->setValue(substr($token->getValue(), 1)); - } - } - } - - $this->tokens[] = $token; - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaToken.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaToken.php deleted file mode 100644 index 4d225de..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaToken.php +++ /dev/null @@ -1,150 +0,0 @@ -value = $pValue; - $this->tokenType = $pTokenType; - $this->tokenSubType = $pTokenSubType; - } - - /** - * Get Value. - * - * @return string - */ - public function getValue() - { - return $this->value; - } - - /** - * Set Value. - * - * @param string $value - */ - public function setValue($value): void - { - $this->value = $value; - } - - /** - * Get Token Type (represented by TOKEN_TYPE_*). - * - * @return string - */ - public function getTokenType() - { - return $this->tokenType; - } - - /** - * Set Token Type (represented by TOKEN_TYPE_*). - * - * @param string $value - */ - public function setTokenType($value): void - { - $this->tokenType = $value; - } - - /** - * Get Token SubType (represented by TOKEN_SUBTYPE_*). - * - * @return string - */ - public function getTokenSubType() - { - return $this->tokenSubType; - } - - /** - * Set Token SubType (represented by TOKEN_SUBTYPE_*). - * - * @param string $value - */ - public function setTokenSubType($value): void - { - $this->tokenSubType = $value; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php deleted file mode 100644 index 2e8a7ec..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php +++ /dev/null @@ -1,658 +0,0 @@ - '#NULL!', - 'divisionbyzero' => '#DIV/0!', - 'value' => '#VALUE!', - 'reference' => '#REF!', - 'name' => '#NAME?', - 'num' => '#NUM!', - 'na' => '#N/A', - 'gettingdata' => '#GETTING_DATA', - ]; - - /** - * Set the Compatibility Mode. - * - * @param string $compatibilityMode Compatibility Mode - * Permitted values are: - * Functions::COMPATIBILITY_EXCEL 'Excel' - * Functions::COMPATIBILITY_GNUMERIC 'Gnumeric' - * Functions::COMPATIBILITY_OPENOFFICE 'OpenOfficeCalc' - * - * @return bool (Success or Failure) - */ - public static function setCompatibilityMode($compatibilityMode) - { - if ( - ($compatibilityMode == self::COMPATIBILITY_EXCEL) || - ($compatibilityMode == self::COMPATIBILITY_GNUMERIC) || - ($compatibilityMode == self::COMPATIBILITY_OPENOFFICE) - ) { - self::$compatibilityMode = $compatibilityMode; - - return true; - } - - return false; - } - - /** - * Return the current Compatibility Mode. - * - * @return string Compatibility Mode - * Possible Return values are: - * Functions::COMPATIBILITY_EXCEL 'Excel' - * Functions::COMPATIBILITY_GNUMERIC 'Gnumeric' - * Functions::COMPATIBILITY_OPENOFFICE 'OpenOfficeCalc' - */ - public static function getCompatibilityMode() - { - return self::$compatibilityMode; - } - - /** - * Set the Return Date Format used by functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object). - * - * @param string $returnDateType Return Date Format - * Permitted values are: - * Functions::RETURNDATE_UNIX_TIMESTAMP 'P' - * Functions::RETURNDATE_PHP_DATETIME_OBJECT 'O' - * Functions::RETURNDATE_EXCEL 'E' - * - * @return bool Success or failure - */ - public static function setReturnDateType($returnDateType) - { - if ( - ($returnDateType == self::RETURNDATE_UNIX_TIMESTAMP) || - ($returnDateType == self::RETURNDATE_PHP_DATETIME_OBJECT) || - ($returnDateType == self::RETURNDATE_EXCEL) - ) { - self::$returnDateType = $returnDateType; - - return true; - } - - return false; - } - - /** - * Return the current Return Date Format for functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object). - * - * @return string Return Date Format - * Possible Return values are: - * Functions::RETURNDATE_UNIX_TIMESTAMP 'P' - * Functions::RETURNDATE_PHP_DATETIME_OBJECT 'O' - * Functions::RETURNDATE_EXCEL 'E' - */ - public static function getReturnDateType() - { - return self::$returnDateType; - } - - /** - * DUMMY. - * - * @return string #Not Yet Implemented - */ - public static function DUMMY() - { - return '#Not Yet Implemented'; - } - - /** - * DIV0. - * - * @return string #Not Yet Implemented - */ - public static function DIV0() - { - return self::$errorCodes['divisionbyzero']; - } - - /** - * NA. - * - * Excel Function: - * =NA() - * - * Returns the error value #N/A - * #N/A is the error value that means "no value is available." - * - * @return string #N/A! - */ - public static function NA() - { - return self::$errorCodes['na']; - } - - /** - * NaN. - * - * Returns the error value #NUM! - * - * @return string #NUM! - */ - public static function NAN() - { - return self::$errorCodes['num']; - } - - /** - * NAME. - * - * Returns the error value #NAME? - * - * @return string #NAME? - */ - public static function NAME() - { - return self::$errorCodes['name']; - } - - /** - * REF. - * - * Returns the error value #REF! - * - * @return string #REF! - */ - public static function REF() - { - return self::$errorCodes['reference']; - } - - /** - * NULL. - * - * Returns the error value #NULL! - * - * @return string #NULL! - */ - public static function null() - { - return self::$errorCodes['null']; - } - - /** - * VALUE. - * - * Returns the error value #VALUE! - * - * @return string #VALUE! - */ - public static function VALUE() - { - return self::$errorCodes['value']; - } - - public static function isMatrixValue($idx) - { - return (substr_count($idx, '.') <= 1) || (preg_match('/\.[A-Z]/', $idx) > 0); - } - - public static function isValue($idx) - { - return substr_count($idx, '.') == 0; - } - - public static function isCellValue($idx) - { - return substr_count($idx, '.') > 1; - } - - public static function ifCondition($condition) - { - $condition = self::flattenSingleValue($condition); - - if ($condition === '') { - $condition = '=""'; - } - - if (!is_string($condition) || !in_array($condition[0], ['>', '<', '='])) { - if (!is_numeric($condition)) { - $condition = Calculation::wrapResult(strtoupper($condition)); - } - - return str_replace('""""', '""', '=' . $condition); - } - preg_match('/(=|<[>=]?|>=?)(.*)/', $condition, $matches); - [, $operator, $operand] = $matches; - - if (is_numeric(trim($operand, '"'))) { - $operand = trim($operand, '"'); - } elseif (!is_numeric($operand)) { - $operand = str_replace('"', '""', $operand); - $operand = Calculation::wrapResult(strtoupper($operand)); - } - - return str_replace('""""', '""', $operator . $operand); - } - - /** - * ERROR_TYPE. - * - * @param mixed $value Value to check - * - * @return bool - */ - public static function errorType($value = '') - { - $value = self::flattenSingleValue($value); - - $i = 1; - foreach (self::$errorCodes as $errorCode) { - if ($value === $errorCode) { - return $i; - } - ++$i; - } - - return self::NA(); - } - - /** - * IS_BLANK. - * - * @param mixed $value Value to check - * - * @return bool - */ - public static function isBlank($value = null) - { - if ($value !== null) { - $value = self::flattenSingleValue($value); - } - - return $value === null; - } - - /** - * IS_ERR. - * - * @param mixed $value Value to check - * - * @return bool - */ - public static function isErr($value = '') - { - $value = self::flattenSingleValue($value); - - return self::isError($value) && (!self::isNa(($value))); - } - - /** - * IS_ERROR. - * - * @param mixed $value Value to check - * - * @return bool - */ - public static function isError($value = '') - { - $value = self::flattenSingleValue($value); - - if (!is_string($value)) { - return false; - } - - return in_array($value, self::$errorCodes); - } - - /** - * IS_NA. - * - * @param mixed $value Value to check - * - * @return bool - */ - public static function isNa($value = '') - { - $value = self::flattenSingleValue($value); - - return $value === self::NA(); - } - - /** - * IS_EVEN. - * - * @param mixed $value Value to check - * - * @return bool|string - */ - public static function isEven($value = null) - { - $value = self::flattenSingleValue($value); - - if ($value === null) { - return self::NAME(); - } elseif ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) { - return self::VALUE(); - } - - return $value % 2 == 0; - } - - /** - * IS_ODD. - * - * @param mixed $value Value to check - * - * @return bool|string - */ - public static function isOdd($value = null) - { - $value = self::flattenSingleValue($value); - - if ($value === null) { - return self::NAME(); - } elseif ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) { - return self::VALUE(); - } - - return abs($value) % 2 == 1; - } - - /** - * IS_NUMBER. - * - * @param mixed $value Value to check - * - * @return bool - */ - public static function isNumber($value = null) - { - $value = self::flattenSingleValue($value); - - if (is_string($value)) { - return false; - } - - return is_numeric($value); - } - - /** - * IS_LOGICAL. - * - * @param mixed $value Value to check - * - * @return bool - */ - public static function isLogical($value = null) - { - $value = self::flattenSingleValue($value); - - return is_bool($value); - } - - /** - * IS_TEXT. - * - * @param mixed $value Value to check - * - * @return bool - */ - public static function isText($value = null) - { - $value = self::flattenSingleValue($value); - - return is_string($value) && !self::isError($value); - } - - /** - * IS_NONTEXT. - * - * @param mixed $value Value to check - * - * @return bool - */ - public static function isNonText($value = null) - { - return !self::isText($value); - } - - /** - * N. - * - * Returns a value converted to a number - * - * @param null|mixed $value The value you want converted - * - * @return number N converts values listed in the following table - * If value is or refers to N returns - * A number That number - * A date The serial number of that date - * TRUE 1 - * FALSE 0 - * An error value The error value - * Anything else 0 - */ - public static function n($value = null) - { - while (is_array($value)) { - $value = array_shift($value); - } - - switch (gettype($value)) { - case 'double': - case 'float': - case 'integer': - return $value; - case 'boolean': - return (int) $value; - case 'string': - // Errors - if ((strlen($value) > 0) && ($value[0] == '#')) { - return $value; - } - - break; - } - - return 0; - } - - /** - * TYPE. - * - * Returns a number that identifies the type of a value - * - * @param null|mixed $value The value you want tested - * - * @return number N converts values listed in the following table - * If value is or refers to N returns - * A number 1 - * Text 2 - * Logical Value 4 - * An error value 16 - * Array or Matrix 64 - */ - public static function TYPE($value = null) - { - $value = self::flattenArrayIndexed($value); - if (is_array($value) && (count($value) > 1)) { - end($value); - $a = key($value); - // Range of cells is an error - if (self::isCellValue($a)) { - return 16; - // Test for Matrix - } elseif (self::isMatrixValue($a)) { - return 64; - } - } elseif (empty($value)) { - // Empty Cell - return 1; - } - $value = self::flattenSingleValue($value); - - if (($value === null) || (is_float($value)) || (is_int($value))) { - return 1; - } elseif (is_bool($value)) { - return 4; - } elseif (is_array($value)) { - return 64; - } elseif (is_string($value)) { - // Errors - if ((strlen($value) > 0) && ($value[0] == '#')) { - return 16; - } - - return 2; - } - - return 0; - } - - /** - * Convert a multi-dimensional array to a simple 1-dimensional array. - * - * @param array $array Array to be flattened - * - * @return array Flattened array - */ - public static function flattenArray($array) - { - if (!is_array($array)) { - return (array) $array; - } - - $arrayValues = []; - foreach ($array as $value) { - if (is_array($value)) { - foreach ($value as $val) { - if (is_array($val)) { - foreach ($val as $v) { - $arrayValues[] = $v; - } - } else { - $arrayValues[] = $val; - } - } - } else { - $arrayValues[] = $value; - } - } - - return $arrayValues; - } - - /** - * Convert a multi-dimensional array to a simple 1-dimensional array, but retain an element of indexing. - * - * @param array $array Array to be flattened - * - * @return array Flattened array - */ - public static function flattenArrayIndexed($array) - { - if (!is_array($array)) { - return (array) $array; - } - - $arrayValues = []; - foreach ($array as $k1 => $value) { - if (is_array($value)) { - foreach ($value as $k2 => $val) { - if (is_array($val)) { - foreach ($val as $k3 => $v) { - $arrayValues[$k1 . '.' . $k2 . '.' . $k3] = $v; - } - } else { - $arrayValues[$k1 . '.' . $k2] = $val; - } - } - } else { - $arrayValues[$k1] = $value; - } - } - - return $arrayValues; - } - - /** - * Convert an array to a single scalar value by extracting the first element. - * - * @param mixed $value Array or scalar value - * - * @return mixed - */ - public static function flattenSingleValue($value = '') - { - while (is_array($value)) { - $value = array_shift($value); - } - - return $value; - } - - /** - * ISFORMULA. - * - * @param mixed $cellReference The cell to check - * @param Cell $pCell The current cell (containing this formula) - * - * @return bool|string - */ - public static function isFormula($cellReference = '', ?Cell $pCell = null) - { - if ($pCell === null) { - return self::REF(); - } - - preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $cellReference, $matches); - - $cellReference = $matches[6] . $matches[7]; - $worksheetName = str_replace("''", "'", trim($matches[2], "'")); - - $worksheet = (!empty($worksheetName)) - ? $pCell->getWorksheet()->getParent()->getSheetByName($worksheetName) - : $pCell->getWorksheet(); - - return $worksheet->getCell($cellReference)->isFormula(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php deleted file mode 100644 index 69c543c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php +++ /dev/null @@ -1,390 +0,0 @@ - 0) && ($returnValue == $argCount); - } - - /** - * LOGICAL_OR. - * - * Returns boolean TRUE if any argument is TRUE; returns FALSE if all arguments are FALSE. - * - * Excel Function: - * =OR(logical1[,logical2[, ...]]) - * - * The arguments must evaluate to logical values such as TRUE or FALSE, or the arguments must be arrays - * or references that contain logical values. - * - * Boolean arguments are treated as True or False as appropriate - * Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False - * If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds - * the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value - * - * @param mixed $args Data values - * - * @return bool|string the logical OR of the arguments - */ - public static function logicalOr(...$args) - { - $args = Functions::flattenArray($args); - - if (count($args) == 0) { - return Functions::VALUE(); - } - - $args = array_filter($args, function ($value) { - return $value !== null || (is_string($value) && trim($value) == ''); - }); - - $returnValue = self::countTrueValues($args); - if (is_string($returnValue)) { - return $returnValue; - } - - return $returnValue > 0; - } - - /** - * LOGICAL_XOR. - * - * Returns the Exclusive Or logical operation for one or more supplied conditions. - * i.e. the Xor function returns TRUE if an odd number of the supplied conditions evaluate to TRUE, and FALSE otherwise. - * - * Excel Function: - * =XOR(logical1[,logical2[, ...]]) - * - * The arguments must evaluate to logical values such as TRUE or FALSE, or the arguments must be arrays - * or references that contain logical values. - * - * Boolean arguments are treated as True or False as appropriate - * Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False - * If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds - * the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value - * - * @param mixed $args Data values - * - * @return bool|string the logical XOR of the arguments - */ - public static function logicalXor(...$args) - { - $args = Functions::flattenArray($args); - - if (count($args) == 0) { - return Functions::VALUE(); - } - - $args = array_filter($args, function ($value) { - return $value !== null || (is_string($value) && trim($value) == ''); - }); - - $returnValue = self::countTrueValues($args); - if (is_string($returnValue)) { - return $returnValue; - } - - return $returnValue % 2 == 1; - } - - /** - * NOT. - * - * Returns the boolean inverse of the argument. - * - * Excel Function: - * =NOT(logical) - * - * The argument must evaluate to a logical value such as TRUE or FALSE - * - * Boolean arguments are treated as True or False as appropriate - * Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False - * If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds - * the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value - * - * @param mixed $logical A value or expression that can be evaluated to TRUE or FALSE - * - * @return bool|string the boolean inverse of the argument - */ - public static function NOT($logical = false) - { - $logical = Functions::flattenSingleValue($logical); - - if (is_string($logical)) { - $logical = strtoupper($logical); - if (($logical == 'TRUE') || ($logical == Calculation::getTRUE())) { - return false; - } elseif (($logical == 'FALSE') || ($logical == Calculation::getFALSE())) { - return true; - } - - return Functions::VALUE(); - } - - return !$logical; - } - - /** - * STATEMENT_IF. - * - * Returns one value if a condition you specify evaluates to TRUE and another value if it evaluates to FALSE. - * - * Excel Function: - * =IF(condition[,returnIfTrue[,returnIfFalse]]) - * - * Condition is any value or expression that can be evaluated to TRUE or FALSE. - * For example, A10=100 is a logical expression; if the value in cell A10 is equal to 100, - * the expression evaluates to TRUE. Otherwise, the expression evaluates to FALSE. - * This argument can use any comparison calculation operator. - * ReturnIfTrue is the value that is returned if condition evaluates to TRUE. - * For example, if this argument is the text string "Within budget" and the condition argument evaluates to TRUE, - * then the IF function returns the text "Within budget" - * If condition is TRUE and ReturnIfTrue is blank, this argument returns 0 (zero). To display the word TRUE, use - * the logical value TRUE for this argument. - * ReturnIfTrue can be another formula. - * ReturnIfFalse is the value that is returned if condition evaluates to FALSE. - * For example, if this argument is the text string "Over budget" and the condition argument evaluates to FALSE, - * then the IF function returns the text "Over budget". - * If condition is FALSE and ReturnIfFalse is omitted, then the logical value FALSE is returned. - * If condition is FALSE and ReturnIfFalse is blank, then the value 0 (zero) is returned. - * ReturnIfFalse can be another formula. - * - * @param mixed $condition Condition to evaluate - * @param mixed $returnIfTrue Value to return when condition is true - * @param mixed $returnIfFalse Optional value to return when condition is false - * - * @return mixed The value of returnIfTrue or returnIfFalse determined by condition - */ - public static function statementIf($condition = true, $returnIfTrue = 0, $returnIfFalse = false) - { - if (Functions::isError($condition)) { - return $condition; - } - - $condition = ($condition === null) ? true : (bool) Functions::flattenSingleValue($condition); - $returnIfTrue = ($returnIfTrue === null) ? 0 : Functions::flattenSingleValue($returnIfTrue); - $returnIfFalse = ($returnIfFalse === null) ? false : Functions::flattenSingleValue($returnIfFalse); - - return ($condition) ? $returnIfTrue : $returnIfFalse; - } - - /** - * STATEMENT_SWITCH. - * - * Returns corresponding with first match (any data type such as a string, numeric, date, etc). - * - * Excel Function: - * =SWITCH (expression, value1, result1, value2, result2, ... value_n, result_n [, default]) - * - * Expression - * The expression to compare to a list of values. - * value1, value2, ... value_n - * A list of values that are compared to expression. The SWITCH function is looking for the first value that matches the expression. - * result1, result2, ... result_n - * A list of results. The SWITCH function returns the corresponding result when a value matches expression. - * default - * Optional. It is the default to return if expression does not match any of the values (value1, value2, ... value_n). - * - * @param mixed $arguments Statement arguments - * - * @return mixed The value of matched expression - */ - public static function statementSwitch(...$arguments) - { - $result = Functions::VALUE(); - - if (count($arguments) > 0) { - $targetValue = Functions::flattenSingleValue($arguments[0]); - $argc = count($arguments) - 1; - $switchCount = floor($argc / 2); - $switchSatisfied = false; - $hasDefaultClause = $argc % 2 !== 0; - $defaultClause = $argc % 2 === 0 ? null : $arguments[count($arguments) - 1]; - - if ($switchCount) { - for ($index = 0; $index < $switchCount; ++$index) { - if ($targetValue == $arguments[$index * 2 + 1]) { - $result = $arguments[$index * 2 + 2]; - $switchSatisfied = true; - - break; - } - } - } - - if (!$switchSatisfied) { - $result = $hasDefaultClause ? $defaultClause : Functions::NA(); - } - } - - return $result; - } - - /** - * IFERROR. - * - * Excel Function: - * =IFERROR(testValue,errorpart) - * - * @param mixed $testValue Value to check, is also the value returned when no error - * @param mixed $errorpart Value to return when testValue is an error condition - * - * @return mixed The value of errorpart or testValue determined by error condition - */ - public static function IFERROR($testValue = '', $errorpart = '') - { - $testValue = ($testValue === null) ? '' : Functions::flattenSingleValue($testValue); - $errorpart = ($errorpart === null) ? '' : Functions::flattenSingleValue($errorpart); - - return self::statementIf(Functions::isError($testValue), $errorpart, $testValue); - } - - /** - * IFNA. - * - * Excel Function: - * =IFNA(testValue,napart) - * - * @param mixed $testValue Value to check, is also the value returned when not an NA - * @param mixed $napart Value to return when testValue is an NA condition - * - * @return mixed The value of errorpart or testValue determined by error condition - */ - public static function IFNA($testValue = '', $napart = '') - { - $testValue = ($testValue === null) ? '' : Functions::flattenSingleValue($testValue); - $napart = ($napart === null) ? '' : Functions::flattenSingleValue($napart); - - return self::statementIf(Functions::isNa($testValue), $napart, $testValue); - } - - /** - * IFS. - * - * Excel Function: - * =IFS(testValue1;returnIfTrue1;testValue2;returnIfTrue2;...;testValue_n;returnIfTrue_n) - * - * testValue1 ... testValue_n - * Conditions to Evaluate - * returnIfTrue1 ... returnIfTrue_n - * Value returned if corresponding testValue (nth) was true - * - * @param mixed ...$arguments Statement arguments - * - * @return mixed|string The value of returnIfTrue_n, if testValue_n was true. #N/A if none of testValues was true - */ - public static function IFS(...$arguments) - { - if (count($arguments) % 2 != 0) { - return Functions::NA(); - } - // We use instance of Exception as a falseValue in order to prevent string collision with value in cell - $falseValueException = new Exception(); - for ($i = 0; $i < count($arguments); $i += 2) { - $testValue = ($arguments[$i] === null) ? '' : Functions::flattenSingleValue($arguments[$i]); - $returnIfTrue = ($arguments[$i + 1] === null) ? '' : Functions::flattenSingleValue($arguments[$i + 1]); - $result = self::statementIf($testValue, $returnIfTrue, $falseValueException); - - if ($result !== $falseValueException) { - return $result; - } - } - - return Functions::NA(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef.php deleted file mode 100644 index 45aa923..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef.php +++ /dev/null @@ -1,968 +0,0 @@ - '') { - if (strpos($sheetText, ' ') !== false) { - $sheetText = "'" . $sheetText . "'"; - } - $sheetText .= '!'; - } - if ((!is_bool($referenceStyle)) || $referenceStyle) { - $rowRelative = $columnRelative = '$'; - $column = Coordinate::stringFromColumnIndex($column); - if (($relativity == 2) || ($relativity == 4)) { - $columnRelative = ''; - } - if (($relativity == 3) || ($relativity == 4)) { - $rowRelative = ''; - } - - return $sheetText . $columnRelative . $column . $rowRelative . $row; - } - if (($relativity == 2) || ($relativity == 4)) { - $column = '[' . $column . ']'; - } - if (($relativity == 3) || ($relativity == 4)) { - $row = '[' . $row . ']'; - } - - return $sheetText . 'R' . $row . 'C' . $column; - } - - /** - * COLUMN. - * - * Returns the column number of the given cell reference - * If the cell reference is a range of cells, COLUMN returns the column numbers of each column in the reference as a horizontal array. - * If cell reference is omitted, and the function is being called through the calculation engine, then it is assumed to be the - * reference of the cell in which the COLUMN function appears; otherwise this function returns 0. - * - * Excel Function: - * =COLUMN([cellAddress]) - * - * @param null|array|string $cellAddress A reference to a range of cells for which you want the column numbers - * - * @return int|int[] - */ - public static function COLUMN($cellAddress = null) - { - if ($cellAddress === null || trim($cellAddress) === '') { - return 0; - } - - if (is_array($cellAddress)) { - foreach ($cellAddress as $columnKey => $value) { - $columnKey = preg_replace('/[^a-z]/i', '', $columnKey); - - return (int) Coordinate::columnIndexFromString($columnKey); - } - } else { - [$sheet, $cellAddress] = Worksheet::extractSheetTitle($cellAddress, true); - if (strpos($cellAddress, ':') !== false) { - [$startAddress, $endAddress] = explode(':', $cellAddress); - $startAddress = preg_replace('/[^a-z]/i', '', $startAddress); - $endAddress = preg_replace('/[^a-z]/i', '', $endAddress); - $returnValue = []; - do { - $returnValue[] = (int) Coordinate::columnIndexFromString($startAddress); - } while ($startAddress++ != $endAddress); - - return $returnValue; - } - $cellAddress = preg_replace('/[^a-z]/i', '', $cellAddress); - - return (int) Coordinate::columnIndexFromString($cellAddress); - } - } - - /** - * COLUMNS. - * - * Returns the number of columns in an array or reference. - * - * Excel Function: - * =COLUMNS(cellAddress) - * - * @param null|array|string $cellAddress An array or array formula, or a reference to a range of cells for which you want the number of columns - * - * @return int|string The number of columns in cellAddress, or a string if arguments are invalid - */ - public static function COLUMNS($cellAddress = null) - { - if ($cellAddress === null || $cellAddress === '') { - return 1; - } elseif (!is_array($cellAddress)) { - return Functions::VALUE(); - } - - reset($cellAddress); - $isMatrix = (is_numeric(key($cellAddress))); - [$columns, $rows] = Calculation::getMatrixDimensions($cellAddress); - - if ($isMatrix) { - return $rows; - } - - return $columns; - } - - /** - * ROW. - * - * Returns the row number of the given cell reference - * If the cell reference is a range of cells, ROW returns the row numbers of each row in the reference as a vertical array. - * If cell reference is omitted, and the function is being called through the calculation engine, then it is assumed to be the - * reference of the cell in which the ROW function appears; otherwise this function returns 0. - * - * Excel Function: - * =ROW([cellAddress]) - * - * @param null|array|string $cellAddress A reference to a range of cells for which you want the row numbers - * - * @return int|mixed[]|string - */ - public static function ROW($cellAddress = null) - { - if ($cellAddress === null || trim($cellAddress) === '') { - return 0; - } - - if (is_array($cellAddress)) { - foreach ($cellAddress as $columnKey => $rowValue) { - foreach ($rowValue as $rowKey => $cellValue) { - return (int) preg_replace('/\D/', '', $rowKey); - } - } - } else { - [$sheet, $cellAddress] = Worksheet::extractSheetTitle($cellAddress, true); - if (strpos($cellAddress, ':') !== false) { - [$startAddress, $endAddress] = explode(':', $cellAddress); - $startAddress = preg_replace('/\D/', '', $startAddress); - $endAddress = preg_replace('/\D/', '', $endAddress); - $returnValue = []; - do { - $returnValue[][] = (int) $startAddress; - } while ($startAddress++ != $endAddress); - - return $returnValue; - } - [$cellAddress] = explode(':', $cellAddress); - - return (int) preg_replace('/\D/', '', $cellAddress); - } - } - - /** - * ROWS. - * - * Returns the number of rows in an array or reference. - * - * Excel Function: - * =ROWS(cellAddress) - * - * @param null|array|string $cellAddress An array or array formula, or a reference to a range of cells for which you want the number of rows - * - * @return int|string The number of rows in cellAddress, or a string if arguments are invalid - */ - public static function ROWS($cellAddress = null) - { - if ($cellAddress === null || $cellAddress === '') { - return 1; - } elseif (!is_array($cellAddress)) { - return Functions::VALUE(); - } - - reset($cellAddress); - $isMatrix = (is_numeric(key($cellAddress))); - [$columns, $rows] = Calculation::getMatrixDimensions($cellAddress); - - if ($isMatrix) { - return $columns; - } - - return $rows; - } - - /** - * HYPERLINK. - * - * Excel Function: - * =HYPERLINK(linkURL,displayName) - * - * @param string $linkURL Value to check, is also the value returned when no error - * @param string $displayName Value to return when testValue is an error condition - * @param Cell $pCell The cell to set the hyperlink in - * - * @return mixed The value of $displayName (or $linkURL if $displayName was blank) - */ - public static function HYPERLINK($linkURL = '', $displayName = null, ?Cell $pCell = null) - { - $linkURL = ($linkURL === null) ? '' : Functions::flattenSingleValue($linkURL); - $displayName = ($displayName === null) ? '' : Functions::flattenSingleValue($displayName); - - if ((!is_object($pCell)) || (trim($linkURL) == '')) { - return Functions::REF(); - } - - if ((is_object($displayName)) || trim($displayName) == '') { - $displayName = $linkURL; - } - - $pCell->getHyperlink()->setUrl($linkURL); - $pCell->getHyperlink()->setTooltip($displayName); - - return $displayName; - } - - /** - * INDIRECT. - * - * Returns the reference specified by a text string. - * References are immediately evaluated to display their contents. - * - * Excel Function: - * =INDIRECT(cellAddress) - * - * NOTE - INDIRECT() does not yet support the optional a1 parameter introduced in Excel 2010 - * - * @param null|array|string $cellAddress $cellAddress The cell address of the current cell (containing this formula) - * @param Cell $pCell The current cell (containing this formula) - * - * @return mixed The cells referenced by cellAddress - * - * @TODO Support for the optional a1 parameter introduced in Excel 2010 - */ - public static function INDIRECT($cellAddress = null, ?Cell $pCell = null) - { - $cellAddress = Functions::flattenSingleValue($cellAddress); - if ($cellAddress === null || $cellAddress === '') { - return Functions::REF(); - } - - $cellAddress1 = $cellAddress; - $cellAddress2 = null; - if (strpos($cellAddress, ':') !== false) { - [$cellAddress1, $cellAddress2] = explode(':', $cellAddress); - } - - if ( - (!preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $cellAddress1, $matches)) || - (($cellAddress2 !== null) && (!preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $cellAddress2, $matches))) - ) { - if (!preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/i', $cellAddress1, $matches)) { - return Functions::REF(); - } - - if (strpos($cellAddress, '!') !== false) { - [$sheetName, $cellAddress] = Worksheet::extractSheetTitle($cellAddress, true); - $sheetName = trim($sheetName, "'"); - $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName); - } else { - $pSheet = $pCell->getWorksheet(); - } - - return Calculation::getInstance()->extractNamedRange($cellAddress, $pSheet, false); - } - - if (strpos($cellAddress, '!') !== false) { - [$sheetName, $cellAddress] = Worksheet::extractSheetTitle($cellAddress, true); - $sheetName = trim($sheetName, "'"); - $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName); - } else { - $pSheet = $pCell->getWorksheet(); - } - - return Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, false); - } - - /** - * OFFSET. - * - * Returns a reference to a range that is a specified number of rows and columns from a cell or range of cells. - * The reference that is returned can be a single cell or a range of cells. You can specify the number of rows and - * the number of columns to be returned. - * - * Excel Function: - * =OFFSET(cellAddress, rows, cols, [height], [width]) - * - * @param null|string $cellAddress The reference from which you want to base the offset. Reference must refer to a cell or - * range of adjacent cells; otherwise, OFFSET returns the #VALUE! error value. - * @param mixed $rows The number of rows, up or down, that you want the upper-left cell to refer to. - * Using 5 as the rows argument specifies that the upper-left cell in the reference is - * five rows below reference. Rows can be positive (which means below the starting reference) - * or negative (which means above the starting reference). - * @param mixed $columns The number of columns, to the left or right, that you want the upper-left cell of the result - * to refer to. Using 5 as the cols argument specifies that the upper-left cell in the - * reference is five columns to the right of reference. Cols can be positive (which means - * to the right of the starting reference) or negative (which means to the left of the - * starting reference). - * @param mixed $height The height, in number of rows, that you want the returned reference to be. Height must be a positive number. - * @param mixed $width The width, in number of columns, that you want the returned reference to be. Width must be a positive number. - * - * @return string A reference to a cell or range of cells - */ - public static function OFFSET($cellAddress = null, $rows = 0, $columns = 0, $height = null, $width = null, ?Cell $pCell = null) - { - $rows = Functions::flattenSingleValue($rows); - $columns = Functions::flattenSingleValue($columns); - $height = Functions::flattenSingleValue($height); - $width = Functions::flattenSingleValue($width); - if ($cellAddress === null) { - return 0; - } - - if (!is_object($pCell)) { - return Functions::REF(); - } - - $sheetName = null; - if (strpos($cellAddress, '!')) { - [$sheetName, $cellAddress] = Worksheet::extractSheetTitle($cellAddress, true); - $sheetName = trim($sheetName, "'"); - } - if (strpos($cellAddress, ':')) { - [$startCell, $endCell] = explode(':', $cellAddress); - } else { - $startCell = $endCell = $cellAddress; - } - [$startCellColumn, $startCellRow] = Coordinate::coordinateFromString($startCell); - [$endCellColumn, $endCellRow] = Coordinate::coordinateFromString($endCell); - - $startCellRow += $rows; - $startCellColumn = Coordinate::columnIndexFromString($startCellColumn) - 1; - $startCellColumn += $columns; - - if (($startCellRow <= 0) || ($startCellColumn < 0)) { - return Functions::REF(); - } - $endCellColumn = Coordinate::columnIndexFromString($endCellColumn) - 1; - if (($width != null) && (!is_object($width))) { - $endCellColumn = $startCellColumn + $width - 1; - } else { - $endCellColumn += $columns; - } - $startCellColumn = Coordinate::stringFromColumnIndex($startCellColumn + 1); - - if (($height != null) && (!is_object($height))) { - $endCellRow = $startCellRow + $height - 1; - } else { - $endCellRow += $rows; - } - - if (($endCellRow <= 0) || ($endCellColumn < 0)) { - return Functions::REF(); - } - $endCellColumn = Coordinate::stringFromColumnIndex($endCellColumn + 1); - - $cellAddress = $startCellColumn . $startCellRow; - if (($startCellColumn != $endCellColumn) || ($startCellRow != $endCellRow)) { - $cellAddress .= ':' . $endCellColumn . $endCellRow; - } - - if ($sheetName !== null) { - $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName); - } else { - $pSheet = $pCell->getWorksheet(); - } - - return Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, false); - } - - /** - * CHOOSE. - * - * Uses lookup_value to return a value from the list of value arguments. - * Use CHOOSE to select one of up to 254 values based on the lookup_value. - * - * Excel Function: - * =CHOOSE(index_num, value1, [value2], ...) - * - * @return mixed The selected value - */ - public static function CHOOSE(...$chooseArgs) - { - $chosenEntry = Functions::flattenArray(array_shift($chooseArgs)); - $entryCount = count($chooseArgs) - 1; - - if (is_array($chosenEntry)) { - $chosenEntry = array_shift($chosenEntry); - } - if ((is_numeric($chosenEntry)) && (!is_bool($chosenEntry))) { - --$chosenEntry; - } else { - return Functions::VALUE(); - } - $chosenEntry = floor($chosenEntry); - if (($chosenEntry < 0) || ($chosenEntry > $entryCount)) { - return Functions::VALUE(); - } - - if (is_array($chooseArgs[$chosenEntry])) { - return Functions::flattenArray($chooseArgs[$chosenEntry]); - } - - return $chooseArgs[$chosenEntry]; - } - - /** - * MATCH. - * - * The MATCH function searches for a specified item in a range of cells - * - * Excel Function: - * =MATCH(lookup_value, lookup_array, [match_type]) - * - * @param mixed $lookupValue The value that you want to match in lookup_array - * @param mixed $lookupArray The range of cells being searched - * @param mixed $matchType The number -1, 0, or 1. -1 means above, 0 means exact match, 1 means below. - * If match_type is 1 or -1, the list has to be ordered. - * - * @return int|string The relative position of the found item - */ - public static function MATCH($lookupValue, $lookupArray, $matchType = 1) - { - $lookupArray = Functions::flattenArray($lookupArray); - $lookupValue = Functions::flattenSingleValue($lookupValue); - $matchType = ($matchType === null) ? 1 : (int) Functions::flattenSingleValue($matchType); - - // MATCH is not case sensitive, so we convert lookup value to be lower cased in case it's string type. - if (is_string($lookupValue)) { - $lookupValue = StringHelper::strToLower($lookupValue); - } - - // Lookup_value type has to be number, text, or logical values - if ((!is_numeric($lookupValue)) && (!is_string($lookupValue)) && (!is_bool($lookupValue))) { - return Functions::NA(); - } - - // Match_type is 0, 1 or -1 - if (($matchType !== 0) && ($matchType !== -1) && ($matchType !== 1)) { - return Functions::NA(); - } - - // Lookup_array should not be empty - $lookupArraySize = count($lookupArray); - if ($lookupArraySize <= 0) { - return Functions::NA(); - } - - if ($matchType == 1) { - // If match_type is 1 the list has to be processed from last to first - - $lookupArray = array_reverse($lookupArray); - $keySet = array_reverse(array_keys($lookupArray)); - } - - // Lookup_array should contain only number, text, or logical values, or empty (null) cells - foreach ($lookupArray as $i => $lookupArrayValue) { - // check the type of the value - if ( - (!is_numeric($lookupArrayValue)) && (!is_string($lookupArrayValue)) && - (!is_bool($lookupArrayValue)) && ($lookupArrayValue !== null) - ) { - return Functions::NA(); - } - // Convert strings to lowercase for case-insensitive testing - if (is_string($lookupArrayValue)) { - $lookupArray[$i] = StringHelper::strToLower($lookupArrayValue); - } - if (($lookupArrayValue === null) && (($matchType == 1) || ($matchType == -1))) { - unset($lookupArray[$i]); - } - } - - // ** - // find the match - // ** - - if ($matchType === 0 || $matchType === 1) { - foreach ($lookupArray as $i => $lookupArrayValue) { - $typeMatch = ((gettype($lookupValue) === gettype($lookupArrayValue)) || (is_numeric($lookupValue) && is_numeric($lookupArrayValue))); - $exactTypeMatch = $typeMatch && $lookupArrayValue === $lookupValue; - $nonOnlyNumericExactMatch = !$typeMatch && $lookupArrayValue === $lookupValue; - $exactMatch = $exactTypeMatch || $nonOnlyNumericExactMatch; - - if ($matchType === 0) { - if ($typeMatch && is_string($lookupValue) && (bool) preg_match('/([\?\*])/', $lookupValue)) { - $splitString = $lookupValue; - $chars = array_map(function ($i) use ($splitString) { - return mb_substr($splitString, $i, 1); - }, range(0, mb_strlen($splitString) - 1)); - - $length = count($chars); - $pattern = '/^'; - for ($j = 0; $j < $length; ++$j) { - if ($chars[$j] === '~') { - if (isset($chars[$j + 1])) { - if ($chars[$j + 1] === '*') { - $pattern .= preg_quote($chars[$j + 1], '/'); - ++$j; - } elseif ($chars[$j + 1] === '?') { - $pattern .= preg_quote($chars[$j + 1], '/'); - ++$j; - } - } else { - $pattern .= preg_quote($chars[$j], '/'); - } - } elseif ($chars[$j] === '*') { - $pattern .= '.*'; - } elseif ($chars[$j] === '?') { - $pattern .= '.{1}'; - } else { - $pattern .= preg_quote($chars[$j], '/'); - } - } - - $pattern .= '$/'; - if ((bool) preg_match($pattern, $lookupArrayValue)) { - // exact match - return $i + 1; - } - } elseif ($exactMatch) { - // exact match - return $i + 1; - } - } elseif (($matchType === 1) && $typeMatch && ($lookupArrayValue <= $lookupValue)) { - $i = array_search($i, $keySet); - - // The current value is the (first) match - return $i + 1; - } - } - } else { - $maxValueKey = null; - - // The basic algorithm is: - // Iterate and keep the highest match until the next element is smaller than the searched value. - // Return immediately if perfect match is found - foreach ($lookupArray as $i => $lookupArrayValue) { - $typeMatch = gettype($lookupValue) === gettype($lookupArrayValue); - $exactTypeMatch = $typeMatch && $lookupArrayValue === $lookupValue; - $nonOnlyNumericExactMatch = !$typeMatch && $lookupArrayValue === $lookupValue; - $exactMatch = $exactTypeMatch || $nonOnlyNumericExactMatch; - - if ($exactMatch) { - // Another "special" case. If a perfect match is found, - // the algorithm gives up immediately - return $i + 1; - } elseif ($typeMatch & $lookupArrayValue >= $lookupValue) { - $maxValueKey = $i + 1; - } elseif ($typeMatch & $lookupArrayValue < $lookupValue) { - //Excel algorithm gives up immediately if the first element is smaller than the searched value - break; - } - } - - if ($maxValueKey !== null) { - return $maxValueKey; - } - } - - // Unsuccessful in finding a match, return #N/A error value - return Functions::NA(); - } - - /** - * INDEX. - * - * Uses an index to choose a value from a reference or array - * - * Excel Function: - * =INDEX(range_array, row_num, [column_num]) - * - * @param mixed $arrayValues A range of cells or an array constant - * @param mixed $rowNum The row in array from which to return a value. If row_num is omitted, column_num is required. - * @param mixed $columnNum The column in array from which to return a value. If column_num is omitted, row_num is required. - * - * @return mixed the value of a specified cell or array of cells - */ - public static function INDEX($arrayValues, $rowNum = 0, $columnNum = 0) - { - $rowNum = Functions::flattenSingleValue($rowNum); - $columnNum = Functions::flattenSingleValue($columnNum); - - if (($rowNum < 0) || ($columnNum < 0)) { - return Functions::VALUE(); - } - - if (!is_array($arrayValues) || ($rowNum > count($arrayValues))) { - return Functions::REF(); - } - - $rowKeys = array_keys($arrayValues); - $columnKeys = @array_keys($arrayValues[$rowKeys[0]]); - - if ($columnNum > count($columnKeys)) { - return Functions::VALUE(); - } elseif ($columnNum == 0) { - if ($rowNum == 0) { - return $arrayValues; - } - $rowNum = $rowKeys[--$rowNum]; - $returnArray = []; - foreach ($arrayValues as $arrayColumn) { - if (is_array($arrayColumn)) { - if (isset($arrayColumn[$rowNum])) { - $returnArray[] = $arrayColumn[$rowNum]; - } else { - return [$rowNum => $arrayValues[$rowNum]]; - } - } else { - return $arrayValues[$rowNum]; - } - } - - return $returnArray; - } - $columnNum = $columnKeys[--$columnNum]; - if ($rowNum > count($rowKeys)) { - return Functions::VALUE(); - } elseif ($rowNum == 0) { - return $arrayValues[$columnNum]; - } - $rowNum = $rowKeys[--$rowNum]; - - return $arrayValues[$rowNum][$columnNum]; - } - - /** - * TRANSPOSE. - * - * @param array $matrixData A matrix of values - * - * @return array - * - * Unlike the Excel TRANSPOSE function, which will only work on a single row or column, this function will transpose a full matrix - */ - public static function TRANSPOSE($matrixData) - { - $returnMatrix = []; - if (!is_array($matrixData)) { - $matrixData = [[$matrixData]]; - } - - $column = 0; - foreach ($matrixData as $matrixRow) { - $row = 0; - foreach ($matrixRow as $matrixCell) { - $returnMatrix[$row][$column] = $matrixCell; - ++$row; - } - ++$column; - } - - return $returnMatrix; - } - - private static function vlookupSort($a, $b) - { - reset($a); - $firstColumn = key($a); - $aLower = StringHelper::strToLower($a[$firstColumn]); - $bLower = StringHelper::strToLower($b[$firstColumn]); - if ($aLower == $bLower) { - return 0; - } - - return ($aLower < $bLower) ? -1 : 1; - } - - /** - * VLOOKUP - * The VLOOKUP function searches for value in the left-most column of lookup_array and returns the value in the same row based on the index_number. - * - * @param mixed $lookup_value The value that you want to match in lookup_array - * @param mixed $lookup_array The range of cells being searched - * @param mixed $index_number The column number in table_array from which the matching value must be returned. The first column is 1. - * @param mixed $not_exact_match determines if you are looking for an exact match based on lookup_value - * - * @return mixed The value of the found cell - */ - public static function VLOOKUP($lookup_value, $lookup_array, $index_number, $not_exact_match = true) - { - $lookup_value = Functions::flattenSingleValue($lookup_value); - $index_number = Functions::flattenSingleValue($index_number); - $not_exact_match = Functions::flattenSingleValue($not_exact_match); - - // index_number must be greater than or equal to 1 - if ($index_number < 1) { - return Functions::VALUE(); - } - - // index_number must be less than or equal to the number of columns in lookup_array - if ((!is_array($lookup_array)) || (empty($lookup_array))) { - return Functions::REF(); - } - $f = array_keys($lookup_array); - $firstRow = array_pop($f); - if ((!is_array($lookup_array[$firstRow])) || ($index_number > count($lookup_array[$firstRow]))) { - return Functions::REF(); - } - $columnKeys = array_keys($lookup_array[$firstRow]); - $returnColumn = $columnKeys[--$index_number]; - $firstColumn = array_shift($columnKeys); - - if (!$not_exact_match) { - uasort($lookup_array, ['self', 'vlookupSort']); - } - - $lookupLower = StringHelper::strToLower($lookup_value); - $rowNumber = $rowValue = false; - foreach ($lookup_array as $rowKey => $rowData) { - $firstLower = StringHelper::strToLower($rowData[$firstColumn]); - - // break if we have passed possible keys - if ( - (is_numeric($lookup_value) && is_numeric($rowData[$firstColumn]) && ($rowData[$firstColumn] > $lookup_value)) || - (!is_numeric($lookup_value) && !is_numeric($rowData[$firstColumn]) && ($firstLower > $lookupLower)) - ) { - break; - } - // remember the last key, but only if datatypes match - if ( - (is_numeric($lookup_value) && is_numeric($rowData[$firstColumn])) || - (!is_numeric($lookup_value) && !is_numeric($rowData[$firstColumn])) - ) { - if ($not_exact_match) { - $rowNumber = $rowKey; - - continue; - } elseif ( - ($firstLower == $lookupLower) - // Spreadsheets software returns first exact match, - // we have sorted and we might have broken key orders - // we want the first one (by its initial index) - && (($rowNumber == false) || ($rowKey < $rowNumber)) - ) { - $rowNumber = $rowKey; - } - } - } - - if ($rowNumber !== false) { - // return the appropriate value - return $lookup_array[$rowNumber][$returnColumn]; - } - - return Functions::NA(); - } - - /** - * HLOOKUP - * The HLOOKUP function searches for value in the top-most row of lookup_array and returns the value in the same column based on the index_number. - * - * @param mixed $lookup_value The value that you want to match in lookup_array - * @param mixed $lookup_array The range of cells being searched - * @param mixed $index_number The row number in table_array from which the matching value must be returned. The first row is 1. - * @param mixed $not_exact_match determines if you are looking for an exact match based on lookup_value - * - * @return mixed The value of the found cell - */ - public static function HLOOKUP($lookup_value, $lookup_array, $index_number, $not_exact_match = true) - { - $lookup_value = Functions::flattenSingleValue($lookup_value); - $index_number = Functions::flattenSingleValue($index_number); - $not_exact_match = Functions::flattenSingleValue($not_exact_match); - - // index_number must be greater than or equal to 1 - if ($index_number < 1) { - return Functions::VALUE(); - } - - // index_number must be less than or equal to the number of columns in lookup_array - if ((!is_array($lookup_array)) || (empty($lookup_array))) { - return Functions::REF(); - } - $f = array_keys($lookup_array); - $firstRow = reset($f); - if ((!is_array($lookup_array[$firstRow])) || ($index_number > count($lookup_array))) { - return Functions::REF(); - } - - $firstkey = $f[0] - 1; - $returnColumn = $firstkey + $index_number; - $firstColumn = array_shift($f); - $rowNumber = null; - foreach ($lookup_array[$firstColumn] as $rowKey => $rowData) { - // break if we have passed possible keys - $bothNumeric = is_numeric($lookup_value) && is_numeric($rowData); - $bothNotNumeric = !is_numeric($lookup_value) && !is_numeric($rowData); - $lookupLower = StringHelper::strToLower($lookup_value); - $rowDataLower = StringHelper::strToLower($rowData); - - if ( - $not_exact_match && ( - ($bothNumeric && $rowData > $lookup_value) || - ($bothNotNumeric && $rowDataLower > $lookupLower) - ) - ) { - break; - } - - // Remember the last key, but only if datatypes match (as in VLOOKUP) - if ($bothNumeric || $bothNotNumeric) { - if ($not_exact_match) { - $rowNumber = $rowKey; - - continue; - } elseif ( - $rowDataLower === $lookupLower - && ($rowNumber === null || $rowKey < $rowNumber) - ) { - $rowNumber = $rowKey; - } - } - } - - if ($rowNumber !== null) { - // otherwise return the appropriate value - return $lookup_array[$returnColumn][$rowNumber]; - } - - return Functions::NA(); - } - - /** - * LOOKUP - * The LOOKUP function searches for value either from a one-row or one-column range or from an array. - * - * @param mixed $lookup_value The value that you want to match in lookup_array - * @param mixed $lookup_vector The range of cells being searched - * @param null|mixed $result_vector The column from which the matching value must be returned - * - * @return mixed The value of the found cell - */ - public static function LOOKUP($lookup_value, $lookup_vector, $result_vector = null) - { - $lookup_value = Functions::flattenSingleValue($lookup_value); - - if (!is_array($lookup_vector)) { - return Functions::NA(); - } - $hasResultVector = isset($result_vector); - $lookupRows = count($lookup_vector); - $l = array_keys($lookup_vector); - $l = array_shift($l); - $lookupColumns = count($lookup_vector[$l]); - // we correctly orient our results - if (($lookupRows === 1 && $lookupColumns > 1) || (!$hasResultVector && $lookupRows === 2 && $lookupColumns !== 2)) { - $lookup_vector = self::TRANSPOSE($lookup_vector); - $lookupRows = count($lookup_vector); - $l = array_keys($lookup_vector); - $lookupColumns = count($lookup_vector[array_shift($l)]); - } - - if ($result_vector === null) { - $result_vector = $lookup_vector; - } - $resultRows = count($result_vector); - $l = array_keys($result_vector); - $l = array_shift($l); - $resultColumns = count($result_vector[$l]); - // we correctly orient our results - if ($resultRows === 1 && $resultColumns > 1) { - $result_vector = self::TRANSPOSE($result_vector); - $resultRows = count($result_vector); - $r = array_keys($result_vector); - $resultColumns = count($result_vector[array_shift($r)]); - } - - if ($lookupRows === 2 && !$hasResultVector) { - $result_vector = array_pop($lookup_vector); - $lookup_vector = array_shift($lookup_vector); - } - - if ($lookupColumns !== 2) { - foreach ($lookup_vector as &$value) { - if (is_array($value)) { - $k = array_keys($value); - $key1 = $key2 = array_shift($k); - ++$key2; - $dataValue1 = $value[$key1]; - } else { - $key1 = 0; - $key2 = 1; - $dataValue1 = $value; - } - $dataValue2 = array_shift($result_vector); - if (is_array($dataValue2)) { - $dataValue2 = array_shift($dataValue2); - } - $value = [$key1 => $dataValue1, $key2 => $dataValue2]; - } - unset($value); - } - - return self::VLOOKUP($lookup_value, $lookup_vector, 2); - } - - /** - * FORMULATEXT. - * - * @param mixed $cellReference The cell to check - * @param Cell $pCell The current cell (containing this formula) - * - * @return string - */ - public static function FORMULATEXT($cellReference = '', ?Cell $pCell = null) - { - if ($pCell === null) { - return Functions::REF(); - } - - preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $cellReference, $matches); - - $cellReference = $matches[6] . $matches[7]; - $worksheetName = trim($matches[3], "'"); - $worksheet = (!empty($worksheetName)) - ? $pCell->getWorksheet()->getParent()->getSheetByName($worksheetName) - : $pCell->getWorksheet(); - - if (!$worksheet->getCell($cellReference)->isFormula()) { - return Functions::NA(); - } - - return $worksheet->getCell($cellReference)->getValue(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php deleted file mode 100644 index 7539659..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php +++ /dev/null @@ -1,1815 +0,0 @@ - 1; --$i) { - if (($value % $i) == 0) { - $factorArray = array_merge($factorArray, self::factors($value / $i)); - $factorArray = array_merge($factorArray, self::factors($i)); - if ($i <= sqrt($value)) { - break; - } - } - } - if (!empty($factorArray)) { - rsort($factorArray); - - return $factorArray; - } - - return [(int) $value]; - } - - private static function romanCut($num, $n) - { - return ($num - ($num % $n)) / $n; - } - - /** - * ARABIC. - * - * Converts a Roman numeral to an Arabic numeral. - * - * Excel Function: - * ARABIC(text) - * - * @param string $roman - * - * @return int|string the arabic numberal contrived from the roman numeral - */ - public static function ARABIC($roman) - { - // An empty string should return 0 - $roman = substr(trim(strtoupper((string) Functions::flattenSingleValue($roman))), 0, 255); - if ($roman === '') { - return 0; - } - - // Convert the roman numeral to an arabic number - $negativeNumber = $roman[0] === '-'; - if ($negativeNumber) { - $roman = substr($roman, 1); - } - - try { - $arabic = self::calculateArabic(str_split($roman)); - } catch (Exception $e) { - return Functions::VALUE(); // Invalid character detected - } - - if ($negativeNumber) { - $arabic *= -1; // The number should be negative - } - - return $arabic; - } - - /** - * Recursively calculate the arabic value of a roman numeral. - * - * @param int $sum - * @param int $subtract - * - * @return int - */ - protected static function calculateArabic(array $roman, &$sum = 0, $subtract = 0) - { - $lookup = [ - 'M' => 1000, - 'D' => 500, - 'C' => 100, - 'L' => 50, - 'X' => 10, - 'V' => 5, - 'I' => 1, - ]; - - $numeral = array_shift($roman); - if (!isset($lookup[$numeral])) { - throw new Exception('Invalid character detected'); - } - - $arabic = $lookup[$numeral]; - if (count($roman) > 0 && isset($lookup[$roman[0]]) && $arabic < $lookup[$roman[0]]) { - $subtract += $arabic; - } else { - $sum += ($arabic - $subtract); - $subtract = 0; - } - - if (count($roman) > 0) { - self::calculateArabic($roman, $sum, $subtract); - } - - return $sum; - } - - /** - * ATAN2. - * - * This function calculates the arc tangent of the two variables x and y. It is similar to - * calculating the arc tangent of y Ć· x, except that the signs of both arguments are used - * to determine the quadrant of the result. - * The arctangent is the angle from the x-axis to a line containing the origin (0, 0) and a - * point with coordinates (xCoordinate, yCoordinate). The angle is given in radians between - * -pi and pi, excluding -pi. - * - * Note that the Excel ATAN2() function accepts its arguments in the reverse order to the standard - * PHP atan2() function, so we need to reverse them here before calling the PHP atan() function. - * - * Excel Function: - * ATAN2(xCoordinate,yCoordinate) - * - * @param float $xCoordinate the x-coordinate of the point - * @param float $yCoordinate the y-coordinate of the point - * - * @return float|string the inverse tangent of the specified x- and y-coordinates, or a string containing an error - */ - public static function ATAN2($xCoordinate = null, $yCoordinate = null) - { - $xCoordinate = Functions::flattenSingleValue($xCoordinate); - $yCoordinate = Functions::flattenSingleValue($yCoordinate); - - $xCoordinate = ($xCoordinate !== null) ? $xCoordinate : 0.0; - $yCoordinate = ($yCoordinate !== null) ? $yCoordinate : 0.0; - - if ( - ((is_numeric($xCoordinate)) || (is_bool($xCoordinate))) && - ((is_numeric($yCoordinate))) || (is_bool($yCoordinate)) - ) { - $xCoordinate = (float) $xCoordinate; - $yCoordinate = (float) $yCoordinate; - - if (($xCoordinate == 0) && ($yCoordinate == 0)) { - return Functions::DIV0(); - } - - return atan2($yCoordinate, $xCoordinate); - } - - return Functions::VALUE(); - } - - /** - * BASE. - * - * Converts a number into a text representation with the given radix (base). - * - * Excel Function: - * BASE(Number, Radix [Min_length]) - * - * @param float $number - * @param float $radix - * @param int $minLength - * - * @return string the text representation with the given radix (base) - */ - public static function BASE($number, $radix, $minLength = null) - { - $number = Functions::flattenSingleValue($number); - $radix = Functions::flattenSingleValue($radix); - $minLength = Functions::flattenSingleValue($minLength); - - if (is_numeric($number) && is_numeric($radix) && ($minLength === null || is_numeric($minLength))) { - // Truncate to an integer - $number = (int) $number; - $radix = (int) $radix; - $minLength = (int) $minLength; - - if ($number < 0 || $number >= 2 ** 53 || $radix < 2 || $radix > 36) { - return Functions::NAN(); // Numeric range constraints - } - - $outcome = strtoupper((string) base_convert($number, 10, $radix)); - if ($minLength !== null) { - $outcome = str_pad($outcome, $minLength, '0', STR_PAD_LEFT); // String padding - } - - return $outcome; - } - - return Functions::VALUE(); - } - - /** - * CEILING. - * - * Returns number rounded up, away from zero, to the nearest multiple of significance. - * For example, if you want to avoid using pennies in your prices and your product is - * priced at $4.42, use the formula =CEILING(4.42,0.05) to round prices up to the - * nearest nickel. - * - * Excel Function: - * CEILING(number[,significance]) - * - * @param float $number the number you want to round - * @param float $significance the multiple to which you want to round - * - * @return float|string Rounded Number, or a string containing an error - */ - public static function CEILING($number, $significance = null) - { - $number = Functions::flattenSingleValue($number); - $significance = Functions::flattenSingleValue($significance); - - if ( - ($significance === null) && - (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) - ) { - $significance = $number / abs($number); - } - - if ((is_numeric($number)) && (is_numeric($significance))) { - if (($number == 0.0) || ($significance == 0.0)) { - return 0.0; - } elseif (self::SIGN($number) == self::SIGN($significance)) { - return ceil($number / $significance) * $significance; - } - - return Functions::NAN(); - } - - return Functions::VALUE(); - } - - /** - * COMBIN. - * - * Returns the number of combinations for a given number of items. Use COMBIN to - * determine the total possible number of groups for a given number of items. - * - * Excel Function: - * COMBIN(numObjs,numInSet) - * - * @param int $numObjs Number of different objects - * @param int $numInSet Number of objects in each combination - * - * @return int|string Number of combinations, or a string containing an error - */ - public static function COMBIN($numObjs, $numInSet) - { - $numObjs = Functions::flattenSingleValue($numObjs); - $numInSet = Functions::flattenSingleValue($numInSet); - - if ((is_numeric($numObjs)) && (is_numeric($numInSet))) { - if ($numObjs < $numInSet) { - return Functions::NAN(); - } elseif ($numInSet < 0) { - return Functions::NAN(); - } - - return round(self::FACT($numObjs) / self::FACT($numObjs - $numInSet)) / self::FACT($numInSet); - } - - return Functions::VALUE(); - } - - /** - * EVEN. - * - * Returns number rounded up to the nearest even integer. - * You can use this function for processing items that come in twos. For example, - * a packing crate accepts rows of one or two items. The crate is full when - * the number of items, rounded up to the nearest two, matches the crate's - * capacity. - * - * Excel Function: - * EVEN(number) - * - * @param float $number Number to round - * - * @return int|string Rounded Number, or a string containing an error - */ - public static function EVEN($number) - { - $number = Functions::flattenSingleValue($number); - - if ($number === null) { - return 0; - } elseif (is_bool($number)) { - $number = (int) $number; - } - - if (is_numeric($number)) { - $significance = 2 * self::SIGN($number); - - return (int) self::CEILING($number, $significance); - } - - return Functions::VALUE(); - } - - /** - * FACT. - * - * Returns the factorial of a number. - * The factorial of a number is equal to 1*2*3*...* number. - * - * Excel Function: - * FACT(factVal) - * - * @param float $factVal Factorial Value - * - * @return int|string Factorial, or a string containing an error - */ - public static function FACT($factVal) - { - $factVal = Functions::flattenSingleValue($factVal); - - if (is_numeric($factVal)) { - if ($factVal < 0) { - return Functions::NAN(); - } - $factLoop = floor($factVal); - if ( - (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) && - ($factVal > $factLoop) - ) { - return Functions::NAN(); - } - - $factorial = 1; - while ($factLoop > 1) { - $factorial *= $factLoop--; - } - - return $factorial; - } - - return Functions::VALUE(); - } - - /** - * FACTDOUBLE. - * - * Returns the double factorial of a number. - * - * Excel Function: - * FACTDOUBLE(factVal) - * - * @param float $factVal Factorial Value - * - * @return int|string Double Factorial, or a string containing an error - */ - public static function FACTDOUBLE($factVal) - { - $factLoop = Functions::flattenSingleValue($factVal); - - if (is_numeric($factLoop)) { - $factLoop = floor($factLoop); - if ($factVal < 0) { - return Functions::NAN(); - } - $factorial = 1; - while ($factLoop > 1) { - $factorial *= $factLoop--; - --$factLoop; - } - - return $factorial; - } - - return Functions::VALUE(); - } - - /** - * FLOOR. - * - * Rounds number down, toward zero, to the nearest multiple of significance. - * - * Excel Function: - * FLOOR(number[,significance]) - * - * @param float $number Number to round - * @param float $significance Significance - * - * @return float|string Rounded Number, or a string containing an error - */ - public static function FLOOR($number, $significance = null) - { - $number = Functions::flattenSingleValue($number); - $significance = Functions::flattenSingleValue($significance); - - if ( - ($significance === null) && - (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) - ) { - $significance = $number / abs($number); - } - - if ((is_numeric($number)) && (is_numeric($significance))) { - if ($significance == 0.0) { - return Functions::DIV0(); - } elseif ($number == 0.0) { - return 0.0; - } elseif (self::SIGN($significance) == 1) { - return floor($number / $significance) * $significance; - } elseif (self::SIGN($number) == -1 && self::SIGN($significance) == -1) { - return floor($number / $significance) * $significance; - } - - return Functions::NAN(); - } - - return Functions::VALUE(); - } - - /** - * FLOOR.MATH. - * - * Round a number down to the nearest integer or to the nearest multiple of significance. - * - * Excel Function: - * FLOOR.MATH(number[,significance[,mode]]) - * - * @param float $number Number to round - * @param float $significance Significance - * @param int $mode direction to round negative numbers - * - * @return float|string Rounded Number, or a string containing an error - */ - public static function FLOORMATH($number, $significance = null, $mode = 0) - { - $number = Functions::flattenSingleValue($number); - $significance = Functions::flattenSingleValue($significance); - $mode = Functions::flattenSingleValue($mode); - - if (is_numeric($number) && $significance === null) { - $significance = $number / abs($number); - } - - if (is_numeric($number) && is_numeric($significance) && is_numeric($mode)) { - if ($significance == 0.0) { - return Functions::DIV0(); - } elseif ($number == 0.0) { - return 0.0; - } elseif (self::SIGN($significance) == -1 || (self::SIGN($number) == -1 && !empty($mode))) { - return ceil($number / $significance) * $significance; - } - - return floor($number / $significance) * $significance; - } - - return Functions::VALUE(); - } - - /** - * FLOOR.PRECISE. - * - * Rounds number down, toward zero, to the nearest multiple of significance. - * - * Excel Function: - * FLOOR.PRECISE(number[,significance]) - * - * @param float $number Number to round - * @param float $significance Significance - * - * @return float|string Rounded Number, or a string containing an error - */ - public static function FLOORPRECISE($number, $significance = 1) - { - $number = Functions::flattenSingleValue($number); - $significance = Functions::flattenSingleValue($significance); - - if ((is_numeric($number)) && (is_numeric($significance))) { - if ($significance == 0.0) { - return Functions::DIV0(); - } elseif ($number == 0.0) { - return 0.0; - } - - return floor($number / abs($significance)) * abs($significance); - } - - return Functions::VALUE(); - } - - private static function evaluateGCD($a, $b) - { - return $b ? self::evaluateGCD($b, $a % $b) : $a; - } - - /** - * GCD. - * - * Returns the greatest common divisor of a series of numbers. - * The greatest common divisor is the largest integer that divides both - * number1 and number2 without a remainder. - * - * Excel Function: - * GCD(number1[,number2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return int|mixed|string Greatest Common Divisor, or a string containing an error - */ - public static function GCD(...$args) - { - $args = Functions::flattenArray($args); - // Loop through arguments - foreach (Functions::flattenArray($args) as $value) { - if (!is_numeric($value)) { - return Functions::VALUE(); - } elseif ($value < 0) { - return Functions::NAN(); - } - } - - $gcd = (int) array_pop($args); - do { - $gcd = self::evaluateGCD($gcd, (int) array_pop($args)); - } while (!empty($args)); - - return $gcd; - } - - /** - * INT. - * - * Casts a floating point value to an integer - * - * Excel Function: - * INT(number) - * - * @param float $number Number to cast to an integer - * - * @return int|string Integer value, or a string containing an error - */ - public static function INT($number) - { - $number = Functions::flattenSingleValue($number); - - if ($number === null) { - return 0; - } elseif (is_bool($number)) { - return (int) $number; - } - if (is_numeric($number)) { - return (int) floor($number); - } - - return Functions::VALUE(); - } - - /** - * LCM. - * - * Returns the lowest common multiplier of a series of numbers - * The least common multiple is the smallest positive integer that is a multiple - * of all integer arguments number1, number2, and so on. Use LCM to add fractions - * with different denominators. - * - * Excel Function: - * LCM(number1[,number2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return int|string Lowest Common Multiplier, or a string containing an error - */ - public static function LCM(...$args) - { - $returnValue = 1; - $allPoweredFactors = []; - // Loop through arguments - foreach (Functions::flattenArray($args) as $value) { - if (!is_numeric($value)) { - return Functions::VALUE(); - } - if ($value == 0) { - return 0; - } elseif ($value < 0) { - return Functions::NAN(); - } - $myFactors = self::factors(floor($value)); - $myCountedFactors = array_count_values($myFactors); - $myPoweredFactors = []; - foreach ($myCountedFactors as $myCountedFactor => $myCountedPower) { - $myPoweredFactors[$myCountedFactor] = $myCountedFactor ** $myCountedPower; - } - foreach ($myPoweredFactors as $myPoweredValue => $myPoweredFactor) { - if (isset($allPoweredFactors[$myPoweredValue])) { - if ($allPoweredFactors[$myPoweredValue] < $myPoweredFactor) { - $allPoweredFactors[$myPoweredValue] = $myPoweredFactor; - } - } else { - $allPoweredFactors[$myPoweredValue] = $myPoweredFactor; - } - } - } - foreach ($allPoweredFactors as $allPoweredFactor) { - $returnValue *= (int) $allPoweredFactor; - } - - return $returnValue; - } - - /** - * LOG_BASE. - * - * Returns the logarithm of a number to a specified base. The default base is 10. - * - * Excel Function: - * LOG(number[,base]) - * - * @param float $number The positive real number for which you want the logarithm - * @param float $base The base of the logarithm. If base is omitted, it is assumed to be 10. - * - * @return float|string The result, or a string containing an error - */ - public static function logBase($number = null, $base = 10) - { - $number = Functions::flattenSingleValue($number); - $base = ($base === null) ? 10 : (float) Functions::flattenSingleValue($base); - - if ((!is_numeric($base)) || (!is_numeric($number))) { - return Functions::VALUE(); - } - if (($base <= 0) || ($number <= 0)) { - return Functions::NAN(); - } - - return log($number, $base); - } - - /** - * MDETERM. - * - * Returns the matrix determinant of an array. - * - * Excel Function: - * MDETERM(array) - * - * @param array $matrixValues A matrix of values - * - * @return float|string The result, or a string containing an error - */ - public static function MDETERM($matrixValues) - { - $matrixData = []; - if (!is_array($matrixValues)) { - $matrixValues = [[$matrixValues]]; - } - - $row = $maxColumn = 0; - foreach ($matrixValues as $matrixRow) { - if (!is_array($matrixRow)) { - $matrixRow = [$matrixRow]; - } - $column = 0; - foreach ($matrixRow as $matrixCell) { - if ((is_string($matrixCell)) || ($matrixCell === null)) { - return Functions::VALUE(); - } - $matrixData[$row][$column] = $matrixCell; - ++$column; - } - if ($column > $maxColumn) { - $maxColumn = $column; - } - ++$row; - } - - $matrix = new Matrix($matrixData); - if (!$matrix->isSquare()) { - return Functions::VALUE(); - } - - try { - return $matrix->determinant(); - } catch (MatrixException $ex) { - return Functions::VALUE(); - } - } - - /** - * MINVERSE. - * - * Returns the inverse matrix for the matrix stored in an array. - * - * Excel Function: - * MINVERSE(array) - * - * @param array $matrixValues A matrix of values - * - * @return array|string The result, or a string containing an error - */ - public static function MINVERSE($matrixValues) - { - $matrixData = []; - if (!is_array($matrixValues)) { - $matrixValues = [[$matrixValues]]; - } - - $row = $maxColumn = 0; - foreach ($matrixValues as $matrixRow) { - if (!is_array($matrixRow)) { - $matrixRow = [$matrixRow]; - } - $column = 0; - foreach ($matrixRow as $matrixCell) { - if ((is_string($matrixCell)) || ($matrixCell === null)) { - return Functions::VALUE(); - } - $matrixData[$row][$column] = $matrixCell; - ++$column; - } - if ($column > $maxColumn) { - $maxColumn = $column; - } - ++$row; - } - - $matrix = new Matrix($matrixData); - if (!$matrix->isSquare()) { - return Functions::VALUE(); - } - - if ($matrix->determinant() == 0.0) { - return Functions::NAN(); - } - - try { - return $matrix->inverse()->toArray(); - } catch (MatrixException $ex) { - return Functions::VALUE(); - } - } - - /** - * MMULT. - * - * @param array $matrixData1 A matrix of values - * @param array $matrixData2 A matrix of values - * - * @return array|string The result, or a string containing an error - */ - public static function MMULT($matrixData1, $matrixData2) - { - $matrixAData = $matrixBData = []; - if (!is_array($matrixData1)) { - $matrixData1 = [[$matrixData1]]; - } - if (!is_array($matrixData2)) { - $matrixData2 = [[$matrixData2]]; - } - - try { - $rowA = 0; - foreach ($matrixData1 as $matrixRow) { - if (!is_array($matrixRow)) { - $matrixRow = [$matrixRow]; - } - $columnA = 0; - foreach ($matrixRow as $matrixCell) { - if ((!is_numeric($matrixCell)) || ($matrixCell === null)) { - return Functions::VALUE(); - } - $matrixAData[$rowA][$columnA] = $matrixCell; - ++$columnA; - } - ++$rowA; - } - $matrixA = new Matrix($matrixAData); - $rowB = 0; - foreach ($matrixData2 as $matrixRow) { - if (!is_array($matrixRow)) { - $matrixRow = [$matrixRow]; - } - $columnB = 0; - foreach ($matrixRow as $matrixCell) { - if ((!is_numeric($matrixCell)) || ($matrixCell === null)) { - return Functions::VALUE(); - } - $matrixBData[$rowB][$columnB] = $matrixCell; - ++$columnB; - } - ++$rowB; - } - $matrixB = new Matrix($matrixBData); - - if ($columnA != $rowB) { - return Functions::VALUE(); - } - - return $matrixA->multiply($matrixB)->toArray(); - } catch (MatrixException $ex) { - return Functions::VALUE(); - } - } - - /** - * MOD. - * - * @param int $a Dividend - * @param int $b Divisor - * - * @return int|string Remainder, or a string containing an error - */ - public static function MOD($a = 1, $b = 1) - { - $a = (float) Functions::flattenSingleValue($a); - $b = (float) Functions::flattenSingleValue($b); - - if ($b == 0.0) { - return Functions::DIV0(); - } elseif (($a < 0.0) && ($b > 0.0)) { - return $b - fmod(abs($a), $b); - } elseif (($a > 0.0) && ($b < 0.0)) { - return $b + fmod($a, abs($b)); - } - - return fmod($a, $b); - } - - /** - * MROUND. - * - * Rounds a number to the nearest multiple of a specified value - * - * @param float $number Number to round - * @param int $multiple Multiple to which you want to round $number - * - * @return float|string Rounded Number, or a string containing an error - */ - public static function MROUND($number, $multiple) - { - $number = Functions::flattenSingleValue($number); - $multiple = Functions::flattenSingleValue($multiple); - - if ((is_numeric($number)) && (is_numeric($multiple))) { - if ($multiple == 0) { - return 0; - } - if ((self::SIGN($number)) == (self::SIGN($multiple))) { - $multiplier = 1 / $multiple; - - return round($number * $multiplier) / $multiplier; - } - - return Functions::NAN(); - } - - return Functions::VALUE(); - } - - /** - * MULTINOMIAL. - * - * Returns the ratio of the factorial of a sum of values to the product of factorials. - * - * @param mixed[] $args An array of mixed values for the Data Series - * - * @return float|string The result, or a string containing an error - */ - public static function MULTINOMIAL(...$args) - { - $summer = 0; - $divisor = 1; - // Loop through arguments - foreach (Functions::flattenArray($args) as $arg) { - // Is it a numeric value? - if (is_numeric($arg)) { - if ($arg < 1) { - return Functions::NAN(); - } - $summer += floor($arg); - $divisor *= self::FACT($arg); - } else { - return Functions::VALUE(); - } - } - - // Return - if ($summer > 0) { - $summer = self::FACT($summer); - - return $summer / $divisor; - } - - return 0; - } - - /** - * ODD. - * - * Returns number rounded up to the nearest odd integer. - * - * @param float $number Number to round - * - * @return int|string Rounded Number, or a string containing an error - */ - public static function ODD($number) - { - $number = Functions::flattenSingleValue($number); - - if ($number === null) { - return 1; - } elseif (is_bool($number)) { - return 1; - } elseif (is_numeric($number)) { - $significance = self::SIGN($number); - if ($significance == 0) { - return 1; - } - - $result = self::CEILING($number, $significance); - if ($result == self::EVEN($result)) { - $result += $significance; - } - - return (int) $result; - } - - return Functions::VALUE(); - } - - /** - * POWER. - * - * Computes x raised to the power y. - * - * @param float $x - * @param float $y - * - * @return float|string The result, or a string containing an error - */ - public static function POWER($x = 0, $y = 2) - { - $x = Functions::flattenSingleValue($x); - $y = Functions::flattenSingleValue($y); - - // Validate parameters - if ($x == 0.0 && $y == 0.0) { - return Functions::NAN(); - } elseif ($x == 0.0 && $y < 0.0) { - return Functions::DIV0(); - } - - // Return - $result = $x ** $y; - - return (!is_nan($result) && !is_infinite($result)) ? $result : Functions::NAN(); - } - - /** - * PRODUCT. - * - * PRODUCT returns the product of all the values and cells referenced in the argument list. - * - * Excel Function: - * PRODUCT(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float - */ - public static function PRODUCT(...$args) - { - // Return value - $returnValue = null; - - // Loop through arguments - foreach (Functions::flattenArray($args) as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - if ($returnValue === null) { - $returnValue = $arg; - } else { - $returnValue *= $arg; - } - } - } - - // Return - if ($returnValue === null) { - return 0; - } - - return $returnValue; - } - - /** - * QUOTIENT. - * - * QUOTIENT function returns the integer portion of a division. Numerator is the divided number - * and denominator is the divisor. - * - * Excel Function: - * QUOTIENT(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float - */ - public static function QUOTIENT(...$args) - { - // Return value - $returnValue = null; - - // Loop through arguments - foreach (Functions::flattenArray($args) as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - if ($returnValue === null) { - $returnValue = ($arg == 0) ? 0 : $arg; - } else { - if (($returnValue == 0) || ($arg == 0)) { - $returnValue = 0; - } else { - $returnValue /= $arg; - } - } - } - } - - // Return - return (int) $returnValue; - } - - /** - * RAND. - * - * @param int $min Minimal value - * @param int $max Maximal value - * - * @return int Random number - */ - public static function RAND($min = 0, $max = 0) - { - $min = Functions::flattenSingleValue($min); - $max = Functions::flattenSingleValue($max); - - if ($min == 0 && $max == 0) { - return (mt_rand(0, 10000000)) / 10000000; - } - - return mt_rand($min, $max); - } - - public static function ROMAN($aValue, $style = 0) - { - $aValue = Functions::flattenSingleValue($aValue); - $style = ($style === null) ? 0 : (int) Functions::flattenSingleValue($style); - if ((!is_numeric($aValue)) || ($aValue < 0) || ($aValue >= 4000)) { - return Functions::VALUE(); - } - $aValue = (int) $aValue; - if ($aValue == 0) { - return ''; - } - - $mill = ['', 'M', 'MM', 'MMM', 'MMMM', 'MMMMM']; - $cent = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM']; - $tens = ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC']; - $ones = ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX']; - - $roman = ''; - while ($aValue > 5999) { - $roman .= 'M'; - $aValue -= 1000; - } - $m = self::romanCut($aValue, 1000); - $aValue %= 1000; - $c = self::romanCut($aValue, 100); - $aValue %= 100; - $t = self::romanCut($aValue, 10); - $aValue %= 10; - - return $roman . $mill[$m] . $cent[$c] . $tens[$t] . $ones[$aValue]; - } - - /** - * ROUNDUP. - * - * Rounds a number up to a specified number of decimal places - * - * @param float $number Number to round - * @param int $digits Number of digits to which you want to round $number - * - * @return float|string Rounded Number, or a string containing an error - */ - public static function ROUNDUP($number, $digits) - { - $number = Functions::flattenSingleValue($number); - $digits = Functions::flattenSingleValue($digits); - - if ((is_numeric($number)) && (is_numeric($digits))) { - if ($number < 0.0) { - return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN); - } - - return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_DOWN); - } - - return Functions::VALUE(); - } - - /** - * ROUNDDOWN. - * - * Rounds a number down to a specified number of decimal places - * - * @param float $number Number to round - * @param int $digits Number of digits to which you want to round $number - * - * @return float|string Rounded Number, or a string containing an error - */ - public static function ROUNDDOWN($number, $digits) - { - $number = Functions::flattenSingleValue($number); - $digits = Functions::flattenSingleValue($digits); - - if ((is_numeric($number)) && (is_numeric($digits))) { - if ($number < 0.0) { - return round($number + 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP); - } - - return round($number - 0.5 * 0.1 ** $digits, $digits, PHP_ROUND_HALF_UP); - } - - return Functions::VALUE(); - } - - /** - * SERIESSUM. - * - * Returns the sum of a power series - * - * @param mixed[] $args An array of mixed values for the Data Series - * - * @return float|string The result, or a string containing an error - */ - public static function SERIESSUM(...$args) - { - $returnValue = 0; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - - $x = array_shift($aArgs); - $n = array_shift($aArgs); - $m = array_shift($aArgs); - - if ((is_numeric($x)) && (is_numeric($n)) && (is_numeric($m))) { - // Calculate - $i = 0; - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $returnValue += $arg * $x ** ($n + ($m * $i++)); - } else { - return Functions::VALUE(); - } - } - - return $returnValue; - } - - return Functions::VALUE(); - } - - /** - * SIGN. - * - * Determines the sign of a number. Returns 1 if the number is positive, zero (0) - * if the number is 0, and -1 if the number is negative. - * - * @param float $number Number to round - * - * @return int|string sign value, or a string containing an error - */ - public static function SIGN($number) - { - $number = Functions::flattenSingleValue($number); - - if (is_bool($number)) { - return (int) $number; - } - if (is_numeric($number)) { - if ($number == 0.0) { - return 0; - } - - return $number / abs($number); - } - - return Functions::VALUE(); - } - - /** - * SQRTPI. - * - * Returns the square root of (number * pi). - * - * @param float $number Number - * - * @return float|string Square Root of Number * Pi, or a string containing an error - */ - public static function SQRTPI($number) - { - $number = Functions::flattenSingleValue($number); - - if (is_numeric($number)) { - if ($number < 0) { - return Functions::NAN(); - } - - return sqrt($number * M_PI); - } - - return Functions::VALUE(); - } - - protected static function filterHiddenArgs($cellReference, $args) - { - return array_filter( - $args, - function ($index) use ($cellReference) { - [, $row, $column] = explode('.', $index); - - return $cellReference->getWorksheet()->getRowDimension($row)->getVisible() && - $cellReference->getWorksheet()->getColumnDimension($column)->getVisible(); - }, - ARRAY_FILTER_USE_KEY - ); - } - - protected static function filterFormulaArgs($cellReference, $args) - { - return array_filter( - $args, - function ($index) use ($cellReference) { - [, $row, $column] = explode('.', $index); - if ($cellReference->getWorksheet()->cellExists($column . $row)) { - //take this cell out if it contains the SUBTOTAL or AGGREGATE functions in a formula - $isFormula = $cellReference->getWorksheet()->getCell($column . $row)->isFormula(); - $cellFormula = !preg_match('/^=.*\b(SUBTOTAL|AGGREGATE)\s*\(/i', $cellReference->getWorksheet()->getCell($column . $row)->getValue()); - - return !$isFormula || $cellFormula; - } - - return true; - }, - ARRAY_FILTER_USE_KEY - ); - } - - /** - * SUBTOTAL. - * - * Returns a subtotal in a list or database. - * - * @param int $functionType - * A number 1 to 11 that specifies which function to - * use in calculating subtotals within a range - * list - * Numbers 101 to 111 shadow the functions of 1 to 11 - * but ignore any values in the range that are - * in hidden rows or columns - * @param mixed[] $args A mixed data series of values - * - * @return float|string - */ - public static function SUBTOTAL($functionType, ...$args) - { - $cellReference = array_pop($args); - $aArgs = Functions::flattenArrayIndexed($args); - $subtotal = Functions::flattenSingleValue($functionType); - - // Calculate - if ((is_numeric($subtotal)) && (!is_string($subtotal))) { - if ($subtotal > 100) { - $aArgs = self::filterHiddenArgs($cellReference, $aArgs); - $subtotal -= 100; - } - - $aArgs = self::filterFormulaArgs($cellReference, $aArgs); - switch ($subtotal) { - case 1: - return Statistical::AVERAGE($aArgs); - case 2: - return Statistical::COUNT($aArgs); - case 3: - return Statistical::COUNTA($aArgs); - case 4: - return Statistical::MAX($aArgs); - case 5: - return Statistical::MIN($aArgs); - case 6: - return self::PRODUCT($aArgs); - case 7: - return Statistical::STDEV($aArgs); - case 8: - return Statistical::STDEVP($aArgs); - case 9: - return self::SUM($aArgs); - case 10: - return Statistical::VARFunc($aArgs); - case 11: - return Statistical::VARP($aArgs); - } - } - - return Functions::VALUE(); - } - - /** - * SUM. - * - * SUM computes the sum of all the values and cells referenced in the argument list. - * - * Excel Function: - * SUM(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float - */ - public static function SUM(...$args) - { - $returnValue = 0; - - // Loop through the arguments - foreach (Functions::flattenArray($args) as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $returnValue += $arg; - } elseif (Functions::isError($arg)) { - return $arg; - } - } - - return $returnValue; - } - - /** - * SUMIF. - * - * Counts the number of cells that contain numbers within the list of arguments - * - * Excel Function: - * SUMIF(value1[,value2[, ...]],condition) - * - * @param mixed $aArgs Data values - * @param string $condition the criteria that defines which cells will be summed - * @param mixed $sumArgs - * - * @return float - */ - public static function SUMIF($aArgs, $condition, $sumArgs = []) - { - $returnValue = 0; - - $aArgs = Functions::flattenArray($aArgs); - $sumArgs = Functions::flattenArray($sumArgs); - if (empty($sumArgs)) { - $sumArgs = $aArgs; - } - $condition = Functions::ifCondition($condition); - // Loop through arguments - foreach ($aArgs as $key => $arg) { - if (!is_numeric($arg)) { - $arg = str_replace('"', '""', $arg); - $arg = Calculation::wrapResult(strtoupper($arg)); - } - - $testCondition = '=' . $arg . $condition; - $sumValue = array_key_exists($key, $sumArgs) ? $sumArgs[$key] : 0; - - if ( - is_numeric($sumValue) && - Calculation::getInstance()->_calculateFormulaValue($testCondition) - ) { - // Is it a value within our criteria and only numeric can be added to the result - $returnValue += $sumValue; - } - } - - return $returnValue; - } - - /** - * SUMIFS. - * - * Counts the number of cells that contain numbers within the list of arguments - * - * Excel Function: - * SUMIFS(value1[,value2[, ...]],condition) - * - * @param mixed $args Data values - * - * @return float - */ - public static function SUMIFS(...$args) - { - $arrayList = $args; - - // Return value - $returnValue = 0; - - $sumArgs = Functions::flattenArray(array_shift($arrayList)); - $aArgsArray = []; - $conditions = []; - - while (count($arrayList) > 0) { - $aArgsArray[] = Functions::flattenArray(array_shift($arrayList)); - $conditions[] = Functions::ifCondition(array_shift($arrayList)); - } - - // Loop through each sum and see if arguments and conditions are true - foreach ($sumArgs as $index => $value) { - $valid = true; - - foreach ($conditions as $cidx => $condition) { - $arg = $aArgsArray[$cidx][$index]; - - // Loop through arguments - if (!is_numeric($arg)) { - $arg = Calculation::wrapResult(strtoupper($arg)); - } - $testCondition = '=' . $arg . $condition; - if (!Calculation::getInstance()->_calculateFormulaValue($testCondition)) { - // Is not a value within our criteria - $valid = false; - - break; // if false found, don't need to check other conditions - } - } - - if ($valid) { - $returnValue += $value; - } - } - - // Return - return $returnValue; - } - - /** - * SUMPRODUCT. - * - * Excel Function: - * SUMPRODUCT(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string The result, or a string containing an error - */ - public static function SUMPRODUCT(...$args) - { - $arrayList = $args; - - $wrkArray = Functions::flattenArray(array_shift($arrayList)); - $wrkCellCount = count($wrkArray); - - for ($i = 0; $i < $wrkCellCount; ++$i) { - if ((!is_numeric($wrkArray[$i])) || (is_string($wrkArray[$i]))) { - $wrkArray[$i] = 0; - } - } - - foreach ($arrayList as $matrixData) { - $array2 = Functions::flattenArray($matrixData); - $count = count($array2); - if ($wrkCellCount != $count) { - return Functions::VALUE(); - } - - foreach ($array2 as $i => $val) { - if ((!is_numeric($val)) || (is_string($val))) { - $val = 0; - } - $wrkArray[$i] *= $val; - } - } - - return array_sum($wrkArray); - } - - /** - * SUMSQ. - * - * SUMSQ returns the sum of the squares of the arguments - * - * Excel Function: - * SUMSQ(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float - */ - public static function SUMSQ(...$args) - { - $returnValue = 0; - - // Loop through arguments - foreach (Functions::flattenArray($args) as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $returnValue += ($arg * $arg); - } - } - - return $returnValue; - } - - /** - * SUMX2MY2. - * - * @param mixed[] $matrixData1 Matrix #1 - * @param mixed[] $matrixData2 Matrix #2 - * - * @return float - */ - public static function SUMX2MY2($matrixData1, $matrixData2) - { - $array1 = Functions::flattenArray($matrixData1); - $array2 = Functions::flattenArray($matrixData2); - $count = min(count($array1), count($array2)); - - $result = 0; - for ($i = 0; $i < $count; ++$i) { - if ( - ((is_numeric($array1[$i])) && (!is_string($array1[$i]))) && - ((is_numeric($array2[$i])) && (!is_string($array2[$i]))) - ) { - $result += ($array1[$i] * $array1[$i]) - ($array2[$i] * $array2[$i]); - } - } - - return $result; - } - - /** - * SUMX2PY2. - * - * @param mixed[] $matrixData1 Matrix #1 - * @param mixed[] $matrixData2 Matrix #2 - * - * @return float - */ - public static function SUMX2PY2($matrixData1, $matrixData2) - { - $array1 = Functions::flattenArray($matrixData1); - $array2 = Functions::flattenArray($matrixData2); - $count = min(count($array1), count($array2)); - - $result = 0; - for ($i = 0; $i < $count; ++$i) { - if ( - ((is_numeric($array1[$i])) && (!is_string($array1[$i]))) && - ((is_numeric($array2[$i])) && (!is_string($array2[$i]))) - ) { - $result += ($array1[$i] * $array1[$i]) + ($array2[$i] * $array2[$i]); - } - } - - return $result; - } - - /** - * SUMXMY2. - * - * @param mixed[] $matrixData1 Matrix #1 - * @param mixed[] $matrixData2 Matrix #2 - * - * @return float - */ - public static function SUMXMY2($matrixData1, $matrixData2) - { - $array1 = Functions::flattenArray($matrixData1); - $array2 = Functions::flattenArray($matrixData2); - $count = min(count($array1), count($array2)); - - $result = 0; - for ($i = 0; $i < $count; ++$i) { - if ( - ((is_numeric($array1[$i])) && (!is_string($array1[$i]))) && - ((is_numeric($array2[$i])) && (!is_string($array2[$i]))) - ) { - $result += ($array1[$i] - $array2[$i]) * ($array1[$i] - $array2[$i]); - } - } - - return $result; - } - - /** - * TRUNC. - * - * Truncates value to the number of fractional digits by number_digits. - * - * @param float $value - * @param int $digits - * - * @return float|string Truncated value, or a string containing an error - */ - public static function TRUNC($value = 0, $digits = 0) - { - $value = Functions::flattenSingleValue($value); - $digits = Functions::flattenSingleValue($digits); - - // Validate parameters - if ((!is_numeric($value)) || (!is_numeric($digits))) { - return Functions::VALUE(); - } - $digits = floor($digits); - - // Truncate - $adjust = 10 ** $digits; - - if (($digits > 0) && (rtrim((int) ((abs($value) - abs((int) $value)) * $adjust), '0') < $adjust / 10)) { - return $value; - } - - return ((int) ($value * $adjust)) / $adjust; - } - - /** - * SEC. - * - * Returns the secant of an angle. - * - * @param float $angle Number - * - * @return float|string The secant of the angle - */ - public static function SEC($angle) - { - $angle = Functions::flattenSingleValue($angle); - - if (!is_numeric($angle)) { - return Functions::VALUE(); - } - - $result = cos($angle); - - return ($result == 0.0) ? Functions::DIV0() : 1 / $result; - } - - /** - * SECH. - * - * Returns the hyperbolic secant of an angle. - * - * @param float $angle Number - * - * @return float|string The hyperbolic secant of the angle - */ - public static function SECH($angle) - { - $angle = Functions::flattenSingleValue($angle); - - if (!is_numeric($angle)) { - return Functions::VALUE(); - } - - $result = cosh($angle); - - return ($result == 0.0) ? Functions::DIV0() : 1 / $result; - } - - /** - * CSC. - * - * Returns the cosecant of an angle. - * - * @param float $angle Number - * - * @return float|string The cosecant of the angle - */ - public static function CSC($angle) - { - $angle = Functions::flattenSingleValue($angle); - - if (!is_numeric($angle)) { - return Functions::VALUE(); - } - - $result = sin($angle); - - return ($result == 0.0) ? Functions::DIV0() : 1 / $result; - } - - /** - * CSCH. - * - * Returns the hyperbolic cosecant of an angle. - * - * @param float $angle Number - * - * @return float|string The hyperbolic cosecant of the angle - */ - public static function CSCH($angle) - { - $angle = Functions::flattenSingleValue($angle); - - if (!is_numeric($angle)) { - return Functions::VALUE(); - } - - $result = sinh($angle); - - return ($result == 0.0) ? Functions::DIV0() : 1 / $result; - } - - /** - * COT. - * - * Returns the cotangent of an angle. - * - * @param float $angle Number - * - * @return float|string The cotangent of the angle - */ - public static function COT($angle) - { - $angle = Functions::flattenSingleValue($angle); - - if (!is_numeric($angle)) { - return Functions::VALUE(); - } - - $result = tan($angle); - - return ($result == 0.0) ? Functions::DIV0() : 1 / $result; - } - - /** - * COTH. - * - * Returns the hyperbolic cotangent of an angle. - * - * @param float $angle Number - * - * @return float|string The hyperbolic cotangent of the angle - */ - public static function COTH($angle) - { - $angle = Functions::flattenSingleValue($angle); - - if (!is_numeric($angle)) { - return Functions::VALUE(); - } - - $result = tanh($angle); - - return ($result == 0.0) ? Functions::DIV0() : 1 / $result; - } - - /** - * ACOT. - * - * Returns the arccotangent of a number. - * - * @param float $number Number - * - * @return float|string The arccotangent of the number - */ - public static function ACOT($number) - { - $number = Functions::flattenSingleValue($number); - - if (!is_numeric($number)) { - return Functions::VALUE(); - } - - return (M_PI / 2) - atan($number); - } - - /** - * ACOTH. - * - * Returns the hyperbolic arccotangent of a number. - * - * @param float $number Number - * - * @return float|string The hyperbolic arccotangent of the number - */ - public static function ACOTH($number) - { - $number = Functions::flattenSingleValue($number); - - if (!is_numeric($number)) { - return Functions::VALUE(); - } - - $result = log(($number + 1) / ($number - 1)) / 2; - - return is_nan($result) ? Functions::NAN() : $result; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php deleted file mode 100644 index 19f40f2..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php +++ /dev/null @@ -1,3906 +0,0 @@ - $value) { - if ((is_bool($value)) || (is_string($value)) || ($value === null)) { - unset($array1[$key], $array2[$key]); - } - } - foreach ($array2 as $key => $value) { - if ((is_bool($value)) || (is_string($value)) || ($value === null)) { - unset($array1[$key], $array2[$key]); - } - } - $array1 = array_merge($array1); - $array2 = array_merge($array2); - - return true; - } - - /** - * Incomplete beta function. - * - * @author Jaco van Kooten - * @author Paul Meagher - * - * The computation is based on formulas from Numerical Recipes, Chapter 6.4 (W.H. Press et al, 1992). - * - * @param mixed $x require 0<=x<=1 - * @param mixed $p require p>0 - * @param mixed $q require q>0 - * - * @return float 0 if x<0, p<=0, q<=0 or p+q>2.55E305 and 1 if x>1 to avoid errors and over/underflow - */ - private static function incompleteBeta($x, $p, $q) - { - if ($x <= 0.0) { - return 0.0; - } elseif ($x >= 1.0) { - return 1.0; - } elseif (($p <= 0.0) || ($q <= 0.0) || (($p + $q) > self::LOG_GAMMA_X_MAX_VALUE)) { - return 0.0; - } - $beta_gam = exp((0 - self::logBeta($p, $q)) + $p * log($x) + $q * log(1.0 - $x)); - if ($x < ($p + 1.0) / ($p + $q + 2.0)) { - return $beta_gam * self::betaFraction($x, $p, $q) / $p; - } - - return 1.0 - ($beta_gam * self::betaFraction(1 - $x, $q, $p) / $q); - } - - // Function cache for logBeta function - private static $logBetaCacheP = 0.0; - - private static $logBetaCacheQ = 0.0; - - private static $logBetaCacheResult = 0.0; - - /** - * The natural logarithm of the beta function. - * - * @param mixed $p require p>0 - * @param mixed $q require q>0 - * - * @return float 0 if p<=0, q<=0 or p+q>2.55E305 to avoid errors and over/underflow - * - * @author Jaco van Kooten - */ - private static function logBeta($p, $q) - { - if ($p != self::$logBetaCacheP || $q != self::$logBetaCacheQ) { - self::$logBetaCacheP = $p; - self::$logBetaCacheQ = $q; - if (($p <= 0.0) || ($q <= 0.0) || (($p + $q) > self::LOG_GAMMA_X_MAX_VALUE)) { - self::$logBetaCacheResult = 0.0; - } else { - self::$logBetaCacheResult = self::logGamma($p) + self::logGamma($q) - self::logGamma($p + $q); - } - } - - return self::$logBetaCacheResult; - } - - /** - * Evaluates of continued fraction part of incomplete beta function. - * Based on an idea from Numerical Recipes (W.H. Press et al, 1992). - * - * @author Jaco van Kooten - * - * @param mixed $x - * @param mixed $p - * @param mixed $q - * - * @return float - */ - private static function betaFraction($x, $p, $q) - { - $c = 1.0; - $sum_pq = $p + $q; - $p_plus = $p + 1.0; - $p_minus = $p - 1.0; - $h = 1.0 - $sum_pq * $x / $p_plus; - if (abs($h) < self::XMININ) { - $h = self::XMININ; - } - $h = 1.0 / $h; - $frac = $h; - $m = 1; - $delta = 0.0; - while ($m <= self::MAX_ITERATIONS && abs($delta - 1.0) > Functions::PRECISION) { - $m2 = 2 * $m; - // even index for d - $d = $m * ($q - $m) * $x / (($p_minus + $m2) * ($p + $m2)); - $h = 1.0 + $d * $h; - if (abs($h) < self::XMININ) { - $h = self::XMININ; - } - $h = 1.0 / $h; - $c = 1.0 + $d / $c; - if (abs($c) < self::XMININ) { - $c = self::XMININ; - } - $frac *= $h * $c; - // odd index for d - $d = -($p + $m) * ($sum_pq + $m) * $x / (($p + $m2) * ($p_plus + $m2)); - $h = 1.0 + $d * $h; - if (abs($h) < self::XMININ) { - $h = self::XMININ; - } - $h = 1.0 / $h; - $c = 1.0 + $d / $c; - if (abs($c) < self::XMININ) { - $c = self::XMININ; - } - $delta = $h * $c; - $frac *= $delta; - ++$m; - } - - return $frac; - } - - /** - * logGamma function. - * - * @version 1.1 - * - * @author Jaco van Kooten - * - * Original author was Jaco van Kooten. Ported to PHP by Paul Meagher. - * - * The natural logarithm of the gamma function.
- * Based on public domain NETLIB (Fortran) code by W. J. Cody and L. Stoltz
- * Applied Mathematics Division
- * Argonne National Laboratory
- * Argonne, IL 60439
- *

- * References: - *

    - *
  1. W. J. Cody and K. E. Hillstrom, 'Chebyshev Approximations for the Natural - * Logarithm of the Gamma Function,' Math. Comp. 21, 1967, pp. 198-203.
  2. - *
  3. K. E. Hillstrom, ANL/AMD Program ANLC366S, DGAMMA/DLGAMA, May, 1969.
  4. - *
  5. Hart, Et. Al., Computer Approximations, Wiley and sons, New York, 1968.
  6. - *
- *

- *

- * From the original documentation: - *

- *

- * This routine calculates the LOG(GAMMA) function for a positive real argument X. - * Computation is based on an algorithm outlined in references 1 and 2. - * The program uses rational functions that theoretically approximate LOG(GAMMA) - * to at least 18 significant decimal digits. The approximation for X > 12 is from - * reference 3, while approximations for X < 12.0 are similar to those in reference - * 1, but are unpublished. The accuracy achieved depends on the arithmetic system, - * the compiler, the intrinsic functions, and proper selection of the - * machine-dependent constants. - *

- *

- * Error returns:
- * The program returns the value XINF for X .LE. 0.0 or when overflow would occur. - * The computation is believed to be free of underflow and overflow. - *

- * - * @return float MAX_VALUE for x < 0.0 or when overflow would occur, i.e. x > 2.55E305 - */ - - // Function cache for logGamma - private static $logGammaCacheResult = 0.0; - - private static $logGammaCacheX = 0.0; - - private static function logGamma($x) - { - // Log Gamma related constants - static $lg_d1 = -0.5772156649015328605195174; - static $lg_d2 = 0.4227843350984671393993777; - static $lg_d4 = 1.791759469228055000094023; - - static $lg_p1 = [ - 4.945235359296727046734888, - 201.8112620856775083915565, - 2290.838373831346393026739, - 11319.67205903380828685045, - 28557.24635671635335736389, - 38484.96228443793359990269, - 26377.48787624195437963534, - 7225.813979700288197698961, - ]; - static $lg_p2 = [ - 4.974607845568932035012064, - 542.4138599891070494101986, - 15506.93864978364947665077, - 184793.2904445632425417223, - 1088204.76946882876749847, - 3338152.967987029735917223, - 5106661.678927352456275255, - 3074109.054850539556250927, - ]; - static $lg_p4 = [ - 14745.02166059939948905062, - 2426813.369486704502836312, - 121475557.4045093227939592, - 2663432449.630976949898078, - 29403789566.34553899906876, - 170266573776.5398868392998, - 492612579337.743088758812, - 560625185622.3951465078242, - ]; - static $lg_q1 = [ - 67.48212550303777196073036, - 1113.332393857199323513008, - 7738.757056935398733233834, - 27639.87074403340708898585, - 54993.10206226157329794414, - 61611.22180066002127833352, - 36351.27591501940507276287, - 8785.536302431013170870835, - ]; - static $lg_q2 = [ - 183.0328399370592604055942, - 7765.049321445005871323047, - 133190.3827966074194402448, - 1136705.821321969608938755, - 5267964.117437946917577538, - 13467014.54311101692290052, - 17827365.30353274213975932, - 9533095.591844353613395747, - ]; - static $lg_q4 = [ - 2690.530175870899333379843, - 639388.5654300092398984238, - 41355999.30241388052042842, - 1120872109.61614794137657, - 14886137286.78813811542398, - 101680358627.2438228077304, - 341747634550.7377132798597, - 446315818741.9713286462081, - ]; - static $lg_c = [ - -0.001910444077728, - 8.4171387781295e-4, - -5.952379913043012e-4, - 7.93650793500350248e-4, - -0.002777777777777681622553, - 0.08333333333333333331554247, - 0.0057083835261, - ]; - - // Rough estimate of the fourth root of logGamma_xBig - static $lg_frtbig = 2.25e76; - static $pnt68 = 0.6796875; - - if ($x == self::$logGammaCacheX) { - return self::$logGammaCacheResult; - } - $y = $x; - if ($y > 0.0 && $y <= self::LOG_GAMMA_X_MAX_VALUE) { - if ($y <= self::EPS) { - $res = -log($y); - } elseif ($y <= 1.5) { - // --------------------- - // EPS .LT. X .LE. 1.5 - // --------------------- - if ($y < $pnt68) { - $corr = -log($y); - $xm1 = $y; - } else { - $corr = 0.0; - $xm1 = $y - 1.0; - } - if ($y <= 0.5 || $y >= $pnt68) { - $xden = 1.0; - $xnum = 0.0; - for ($i = 0; $i < 8; ++$i) { - $xnum = $xnum * $xm1 + $lg_p1[$i]; - $xden = $xden * $xm1 + $lg_q1[$i]; - } - $res = $corr + $xm1 * ($lg_d1 + $xm1 * ($xnum / $xden)); - } else { - $xm2 = $y - 1.0; - $xden = 1.0; - $xnum = 0.0; - for ($i = 0; $i < 8; ++$i) { - $xnum = $xnum * $xm2 + $lg_p2[$i]; - $xden = $xden * $xm2 + $lg_q2[$i]; - } - $res = $corr + $xm2 * ($lg_d2 + $xm2 * ($xnum / $xden)); - } - } elseif ($y <= 4.0) { - // --------------------- - // 1.5 .LT. X .LE. 4.0 - // --------------------- - $xm2 = $y - 2.0; - $xden = 1.0; - $xnum = 0.0; - for ($i = 0; $i < 8; ++$i) { - $xnum = $xnum * $xm2 + $lg_p2[$i]; - $xden = $xden * $xm2 + $lg_q2[$i]; - } - $res = $xm2 * ($lg_d2 + $xm2 * ($xnum / $xden)); - } elseif ($y <= 12.0) { - // ---------------------- - // 4.0 .LT. X .LE. 12.0 - // ---------------------- - $xm4 = $y - 4.0; - $xden = -1.0; - $xnum = 0.0; - for ($i = 0; $i < 8; ++$i) { - $xnum = $xnum * $xm4 + $lg_p4[$i]; - $xden = $xden * $xm4 + $lg_q4[$i]; - } - $res = $lg_d4 + $xm4 * ($xnum / $xden); - } else { - // --------------------------------- - // Evaluate for argument .GE. 12.0 - // --------------------------------- - $res = 0.0; - if ($y <= $lg_frtbig) { - $res = $lg_c[6]; - $ysq = $y * $y; - for ($i = 0; $i < 6; ++$i) { - $res = $res / $ysq + $lg_c[$i]; - } - $res /= $y; - $corr = log($y); - $res = $res + log(self::SQRT2PI) - 0.5 * $corr; - $res += $y * ($corr - 1.0); - } - } - } else { - // -------------------------- - // Return for bad arguments - // -------------------------- - $res = self::MAX_VALUE; - } - // ------------------------------ - // Final adjustments and return - // ------------------------------ - self::$logGammaCacheX = $x; - self::$logGammaCacheResult = $res; - - return $res; - } - - // - // Private implementation of the incomplete Gamma function - // - private static function incompleteGamma($a, $x) - { - static $max = 32; - $summer = 0; - for ($n = 0; $n <= $max; ++$n) { - $divisor = $a; - for ($i = 1; $i <= $n; ++$i) { - $divisor *= ($a + $i); - } - $summer += ($x ** $n / $divisor); - } - - return $x ** $a * exp(0 - $x) * $summer; - } - - // - // Private implementation of the Gamma function - // - private static function gamma($data) - { - if ($data == 0.0) { - return 0; - } - - static $p0 = 1.000000000190015; - static $p = [ - 1 => 76.18009172947146, - 2 => -86.50532032941677, - 3 => 24.01409824083091, - 4 => -1.231739572450155, - 5 => 1.208650973866179e-3, - 6 => -5.395239384953e-6, - ]; - - $y = $x = $data; - $tmp = $x + 5.5; - $tmp -= ($x + 0.5) * log($tmp); - - $summer = $p0; - for ($j = 1; $j <= 6; ++$j) { - $summer += ($p[$j] / ++$y); - } - - return exp(0 - $tmp + log(self::SQRT2PI * $summer / $x)); - } - - /* - * inverse_ncdf.php - * ------------------- - * begin : Friday, January 16, 2004 - * copyright : (C) 2004 Michael Nickerson - * email : nickersonm@yahoo.com - * - */ - private static function inverseNcdf($p) - { - // Inverse ncdf approximation by Peter J. Acklam, implementation adapted to - // PHP by Michael Nickerson, using Dr. Thomas Ziegler's C implementation as - // a guide. http://home.online.no/~pjacklam/notes/invnorm/index.html - // I have not checked the accuracy of this implementation. Be aware that PHP - // will truncate the coeficcients to 14 digits. - - // You have permission to use and distribute this function freely for - // whatever purpose you want, but please show common courtesy and give credit - // where credit is due. - - // Input paramater is $p - probability - where 0 < p < 1. - - // Coefficients in rational approximations - static $a = [ - 1 => -3.969683028665376e+01, - 2 => 2.209460984245205e+02, - 3 => -2.759285104469687e+02, - 4 => 1.383577518672690e+02, - 5 => -3.066479806614716e+01, - 6 => 2.506628277459239e+00, - ]; - - static $b = [ - 1 => -5.447609879822406e+01, - 2 => 1.615858368580409e+02, - 3 => -1.556989798598866e+02, - 4 => 6.680131188771972e+01, - 5 => -1.328068155288572e+01, - ]; - - static $c = [ - 1 => -7.784894002430293e-03, - 2 => -3.223964580411365e-01, - 3 => -2.400758277161838e+00, - 4 => -2.549732539343734e+00, - 5 => 4.374664141464968e+00, - 6 => 2.938163982698783e+00, - ]; - - static $d = [ - 1 => 7.784695709041462e-03, - 2 => 3.224671290700398e-01, - 3 => 2.445134137142996e+00, - 4 => 3.754408661907416e+00, - ]; - - // Define lower and upper region break-points. - $p_low = 0.02425; //Use lower region approx. below this - $p_high = 1 - $p_low; //Use upper region approx. above this - - if (0 < $p && $p < $p_low) { - // Rational approximation for lower region. - $q = sqrt(-2 * log($p)); - - return ((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / - (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1); - } elseif ($p_low <= $p && $p <= $p_high) { - // Rational approximation for central region. - $q = $p - 0.5; - $r = $q * $q; - - return ((((($a[1] * $r + $a[2]) * $r + $a[3]) * $r + $a[4]) * $r + $a[5]) * $r + $a[6]) * $q / - ((((($b[1] * $r + $b[2]) * $r + $b[3]) * $r + $b[4]) * $r + $b[5]) * $r + 1); - } elseif ($p_high < $p && $p < 1) { - // Rational approximation for upper region. - $q = sqrt(-2 * log(1 - $p)); - - return -((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / - (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1); - } - // If 0 < p < 1, return a null value - return Functions::NULL(); - } - - /** - * MS Excel does not count Booleans if passed as cell values, but they are counted if passed as literals. - * OpenOffice Calc always counts Booleans. - * Gnumeric never counts Booleans. - * - * @param mixed $arg - * @param mixed $k - * - * @return int|mixed - */ - private static function testAcceptedBoolean($arg, $k) - { - if ( - (is_bool($arg)) && - ((!Functions::isCellValue($k) && (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_EXCEL)) || - (Functions::getCompatibilityMode() === Functions::COMPATIBILITY_OPENOFFICE)) - ) { - $arg = (int) $arg; - } - - return $arg; - } - - /** - * @param mixed $arg - * @param mixed $k - * - * @return bool - */ - private static function isAcceptedCountable($arg, $k) - { - if ( - ((is_numeric($arg)) && (!is_string($arg))) || - ((is_numeric($arg)) && (!Functions::isCellValue($k)) && - (Functions::getCompatibilityMode() !== Functions::COMPATIBILITY_GNUMERIC)) - ) { - return true; - } - - return false; - } - - /** - * AVEDEV. - * - * Returns the average of the absolute deviations of data points from their mean. - * AVEDEV is a measure of the variability in a data set. - * - * Excel Function: - * AVEDEV(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string - */ - public static function AVEDEV(...$args) - { - $aArgs = Functions::flattenArrayIndexed($args); - - // Return value - $returnValue = 0; - - $aMean = self::AVERAGE(...$args); - if ($aMean === Functions::DIV0()) { - return Functions::NAN(); - } elseif ($aMean === Functions::VALUE()) { - return Functions::VALUE(); - } - - $aCount = 0; - foreach ($aArgs as $k => $arg) { - $arg = self::testAcceptedBoolean($arg, $k); - // Is it a numeric value? - // Strings containing numeric values are only counted if they are string literals (not cell values) - // and then only in MS Excel and in Open Office, not in Gnumeric - if ((is_string($arg)) && (!is_numeric($arg)) && (!Functions::isCellValue($k))) { - return Functions::VALUE(); - } - if (self::isAcceptedCountable($arg, $k)) { - $returnValue += abs($arg - $aMean); - ++$aCount; - } - } - - // Return - if ($aCount === 0) { - return Functions::DIV0(); - } - - return $returnValue / $aCount; - } - - /** - * AVERAGE. - * - * Returns the average (arithmetic mean) of the arguments - * - * Excel Function: - * AVERAGE(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string - */ - public static function AVERAGE(...$args) - { - $returnValue = $aCount = 0; - - // Loop through arguments - foreach (Functions::flattenArrayIndexed($args) as $k => $arg) { - $arg = self::testAcceptedBoolean($arg, $k); - // Is it a numeric value? - // Strings containing numeric values are only counted if they are string literals (not cell values) - // and then only in MS Excel and in Open Office, not in Gnumeric - if ((is_string($arg)) && (!is_numeric($arg)) && (!Functions::isCellValue($k))) { - return Functions::VALUE(); - } - if (self::isAcceptedCountable($arg, $k)) { - $returnValue += $arg; - ++$aCount; - } - } - - // Return - if ($aCount > 0) { - return $returnValue / $aCount; - } - - return Functions::DIV0(); - } - - /** - * AVERAGEA. - * - * Returns the average of its arguments, including numbers, text, and logical values - * - * Excel Function: - * AVERAGEA(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string - */ - public static function AVERAGEA(...$args) - { - $returnValue = null; - - $aCount = 0; - // Loop through arguments - foreach (Functions::flattenArrayIndexed($args) as $k => $arg) { - if ( - (is_bool($arg)) && - (!Functions::isMatrixValue($k)) - ) { - } else { - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { - if (is_bool($arg)) { - $arg = (int) $arg; - } elseif (is_string($arg)) { - $arg = 0; - } - $returnValue += $arg; - ++$aCount; - } - } - } - - if ($aCount > 0) { - return $returnValue / $aCount; - } - - return Functions::DIV0(); - } - - /** - * AVERAGEIF. - * - * Returns the average value from a range of cells that contain numbers within the list of arguments - * - * Excel Function: - * AVERAGEIF(value1[,value2[, ...]],condition) - * - * @param mixed $aArgs Data values - * @param string $condition the criteria that defines which cells will be checked - * @param mixed[] $averageArgs Data values - * - * @return float|string - */ - public static function AVERAGEIF($aArgs, $condition, $averageArgs = []) - { - $returnValue = 0; - - $aArgs = Functions::flattenArray($aArgs); - $averageArgs = Functions::flattenArray($averageArgs); - if (empty($averageArgs)) { - $averageArgs = $aArgs; - } - $condition = Functions::ifCondition($condition); - $conditionIsNumeric = strpos($condition, '"') === false; - - // Loop through arguments - $aCount = 0; - foreach ($aArgs as $key => $arg) { - if (!is_numeric($arg)) { - if ($conditionIsNumeric) { - continue; - } - $arg = Calculation::wrapResult(strtoupper($arg)); - } elseif (!$conditionIsNumeric) { - continue; - } - $testCondition = '=' . $arg . $condition; - if (Calculation::getInstance()->_calculateFormulaValue($testCondition)) { - $returnValue += $averageArgs[$key]; - ++$aCount; - } - } - - if ($aCount > 0) { - return $returnValue / $aCount; - } - - return Functions::DIV0(); - } - - /** - * BETADIST. - * - * Returns the beta distribution. - * - * @param float $value Value at which you want to evaluate the distribution - * @param float $alpha Parameter to the distribution - * @param float $beta Parameter to the distribution - * @param mixed $rMin - * @param mixed $rMax - * - * @return float|string - */ - public static function BETADIST($value, $alpha, $beta, $rMin = 0, $rMax = 1) - { - $value = Functions::flattenSingleValue($value); - $alpha = Functions::flattenSingleValue($alpha); - $beta = Functions::flattenSingleValue($beta); - $rMin = Functions::flattenSingleValue($rMin); - $rMax = Functions::flattenSingleValue($rMax); - - if ((is_numeric($value)) && (is_numeric($alpha)) && (is_numeric($beta)) && (is_numeric($rMin)) && (is_numeric($rMax))) { - if (($value < $rMin) || ($value > $rMax) || ($alpha <= 0) || ($beta <= 0) || ($rMin == $rMax)) { - return Functions::NAN(); - } - if ($rMin > $rMax) { - $tmp = $rMin; - $rMin = $rMax; - $rMax = $tmp; - } - $value -= $rMin; - $value /= ($rMax - $rMin); - - return self::incompleteBeta($value, $alpha, $beta); - } - - return Functions::VALUE(); - } - - /** - * BETAINV. - * - * Returns the inverse of the Beta distribution. - * - * @param float $probability Probability at which you want to evaluate the distribution - * @param float $alpha Parameter to the distribution - * @param float $beta Parameter to the distribution - * @param float $rMin Minimum value - * @param float $rMax Maximum value - * - * @return float|string - */ - public static function BETAINV($probability, $alpha, $beta, $rMin = 0, $rMax = 1) - { - $probability = Functions::flattenSingleValue($probability); - $alpha = Functions::flattenSingleValue($alpha); - $beta = Functions::flattenSingleValue($beta); - $rMin = Functions::flattenSingleValue($rMin); - $rMax = Functions::flattenSingleValue($rMax); - - if ((is_numeric($probability)) && (is_numeric($alpha)) && (is_numeric($beta)) && (is_numeric($rMin)) && (is_numeric($rMax))) { - if (($alpha <= 0) || ($beta <= 0) || ($rMin == $rMax) || ($probability <= 0) || ($probability > 1)) { - return Functions::NAN(); - } - if ($rMin > $rMax) { - $tmp = $rMin; - $rMin = $rMax; - $rMax = $tmp; - } - $a = 0; - $b = 2; - - $i = 0; - while ((($b - $a) > Functions::PRECISION) && ($i++ < self::MAX_ITERATIONS)) { - $guess = ($a + $b) / 2; - $result = self::BETADIST($guess, $alpha, $beta); - if (($result == $probability) || ($result == 0)) { - $b = $a; - } elseif ($result > $probability) { - $b = $guess; - } else { - $a = $guess; - } - } - if ($i == self::MAX_ITERATIONS) { - return Functions::NA(); - } - - return round($rMin + $guess * ($rMax - $rMin), 12); - } - - return Functions::VALUE(); - } - - /** - * BINOMDIST. - * - * Returns the individual term binomial distribution probability. Use BINOMDIST in problems with - * a fixed number of tests or trials, when the outcomes of any trial are only success or failure, - * when trials are independent, and when the probability of success is constant throughout the - * experiment. For example, BINOMDIST can calculate the probability that two of the next three - * babies born are male. - * - * @param float $value Number of successes in trials - * @param float $trials Number of trials - * @param float $probability Probability of success on each trial - * @param bool $cumulative - * - * @return float|string - */ - public static function BINOMDIST($value, $trials, $probability, $cumulative) - { - $value = Functions::flattenSingleValue($value); - $trials = Functions::flattenSingleValue($trials); - $probability = Functions::flattenSingleValue($probability); - - if ((is_numeric($value)) && (is_numeric($trials)) && (is_numeric($probability))) { - $value = floor($value); - $trials = floor($trials); - if (($value < 0) || ($value > $trials)) { - return Functions::NAN(); - } - if (($probability < 0) || ($probability > 1)) { - return Functions::NAN(); - } - if ((is_numeric($cumulative)) || (is_bool($cumulative))) { - if ($cumulative) { - $summer = 0; - for ($i = 0; $i <= $value; ++$i) { - $summer += MathTrig::COMBIN($trials, $i) * $probability ** $i * (1 - $probability) ** ($trials - $i); - } - - return $summer; - } - - return MathTrig::COMBIN($trials, $value) * $probability ** $value * (1 - $probability) ** ($trials - $value); - } - } - - return Functions::VALUE(); - } - - /** - * CHIDIST. - * - * Returns the one-tailed probability of the chi-squared distribution. - * - * @param float $value Value for the function - * @param float $degrees degrees of freedom - * - * @return float|string - */ - public static function CHIDIST($value, $degrees) - { - $value = Functions::flattenSingleValue($value); - $degrees = Functions::flattenSingleValue($degrees); - - if ((is_numeric($value)) && (is_numeric($degrees))) { - $degrees = floor($degrees); - if ($degrees < 1) { - return Functions::NAN(); - } - if ($value < 0) { - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) { - return 1; - } - - return Functions::NAN(); - } - - return 1 - (self::incompleteGamma($degrees / 2, $value / 2) / self::gamma($degrees / 2)); - } - - return Functions::VALUE(); - } - - /** - * CHIINV. - * - * Returns the one-tailed probability of the chi-squared distribution. - * - * @param float $probability Probability for the function - * @param float $degrees degrees of freedom - * - * @return float|string - */ - public static function CHIINV($probability, $degrees) - { - $probability = Functions::flattenSingleValue($probability); - $degrees = Functions::flattenSingleValue($degrees); - - if ((is_numeric($probability)) && (is_numeric($degrees))) { - $degrees = floor($degrees); - - $xLo = 100; - $xHi = 0; - - $x = $xNew = 1; - $dx = 1; - $i = 0; - - while ((abs($dx) > Functions::PRECISION) && ($i++ < self::MAX_ITERATIONS)) { - // Apply Newton-Raphson step - $result = 1 - (self::incompleteGamma($degrees / 2, $x / 2) / self::gamma($degrees / 2)); - $error = $result - $probability; - if ($error == 0.0) { - $dx = 0; - } elseif ($error < 0.0) { - $xLo = $x; - } else { - $xHi = $x; - } - // Avoid division by zero - if ($result != 0.0) { - $dx = $error / $result; - $xNew = $x - $dx; - } - // If the NR fails to converge (which for example may be the - // case if the initial guess is too rough) we apply a bisection - // step to determine a more narrow interval around the root. - if (($xNew < $xLo) || ($xNew > $xHi) || ($result == 0.0)) { - $xNew = ($xLo + $xHi) / 2; - $dx = $xNew - $x; - } - $x = $xNew; - } - if ($i == self::MAX_ITERATIONS) { - return Functions::NA(); - } - - return round($x, 12); - } - - return Functions::VALUE(); - } - - /** - * CONFIDENCE. - * - * Returns the confidence interval for a population mean - * - * @param float $alpha - * @param float $stdDev Standard Deviation - * @param float $size - * - * @return float|string - */ - public static function CONFIDENCE($alpha, $stdDev, $size) - { - $alpha = Functions::flattenSingleValue($alpha); - $stdDev = Functions::flattenSingleValue($stdDev); - $size = Functions::flattenSingleValue($size); - - if ((is_numeric($alpha)) && (is_numeric($stdDev)) && (is_numeric($size))) { - $size = floor($size); - if (($alpha <= 0) || ($alpha >= 1)) { - return Functions::NAN(); - } - if (($stdDev <= 0) || ($size < 1)) { - return Functions::NAN(); - } - - return self::NORMSINV(1 - $alpha / 2) * $stdDev / sqrt($size); - } - - return Functions::VALUE(); - } - - /** - * CORREL. - * - * Returns covariance, the average of the products of deviations for each data point pair. - * - * @param mixed $yValues array of mixed Data Series Y - * @param null|mixed $xValues array of mixed Data Series X - * - * @return float|string - */ - public static function CORREL($yValues, $xValues = null) - { - if (($xValues === null) || (!is_array($yValues)) || (!is_array($xValues))) { - return Functions::VALUE(); - } - if (!self::checkTrendArrays($yValues, $xValues)) { - return Functions::VALUE(); - } - $yValueCount = count($yValues); - $xValueCount = count($xValues); - - if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { - return Functions::NA(); - } elseif ($yValueCount == 1) { - return Functions::DIV0(); - } - - $bestFitLinear = Trend::calculate(Trend::TREND_LINEAR, $yValues, $xValues); - - return $bestFitLinear->getCorrelation(); - } - - /** - * COUNT. - * - * Counts the number of cells that contain numbers within the list of arguments - * - * Excel Function: - * COUNT(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return int - */ - public static function COUNT(...$args) - { - $returnValue = 0; - - // Loop through arguments - $aArgs = Functions::flattenArrayIndexed($args); - foreach ($aArgs as $k => $arg) { - $arg = self::testAcceptedBoolean($arg, $k); - // Is it a numeric value? - // Strings containing numeric values are only counted if they are string literals (not cell values) - // and then only in MS Excel and in Open Office, not in Gnumeric - if (self::isAcceptedCountable($arg, $k)) { - ++$returnValue; - } - } - - return $returnValue; - } - - /** - * COUNTA. - * - * Counts the number of cells that are not empty within the list of arguments - * - * Excel Function: - * COUNTA(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return int - */ - public static function COUNTA(...$args) - { - $returnValue = 0; - - // Loop through arguments - $aArgs = Functions::flattenArrayIndexed($args); - foreach ($aArgs as $k => $arg) { - // Nulls are counted if literals, but not if cell values - if ($arg !== null || (!Functions::isCellValue($k))) { - ++$returnValue; - } - } - - return $returnValue; - } - - /** - * COUNTBLANK. - * - * Counts the number of empty cells within the list of arguments - * - * Excel Function: - * COUNTBLANK(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return int - */ - public static function COUNTBLANK(...$args) - { - $returnValue = 0; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - foreach ($aArgs as $arg) { - // Is it a blank cell? - if (($arg === null) || ((is_string($arg)) && ($arg == ''))) { - ++$returnValue; - } - } - - return $returnValue; - } - - /** - * COUNTIF. - * - * Counts the number of cells that contain numbers within the list of arguments - * - * Excel Function: - * COUNTIF(value1[,value2[, ...]],condition) - * - * @param mixed $aArgs Data values - * @param string $condition the criteria that defines which cells will be counted - * - * @return int - */ - public static function COUNTIF($aArgs, $condition) - { - $returnValue = 0; - - $aArgs = Functions::flattenArray($aArgs); - $condition = Functions::ifCondition($condition); - $conditionIsNumeric = strpos($condition, '"') === false; - // Loop through arguments - foreach ($aArgs as $arg) { - if (!is_numeric($arg)) { - if ($conditionIsNumeric) { - continue; - } - $arg = Calculation::wrapResult(strtoupper($arg)); - } elseif (!$conditionIsNumeric) { - continue; - } - $testCondition = '=' . $arg . $condition; - if (Calculation::getInstance()->_calculateFormulaValue($testCondition)) { - // Is it a value within our criteria - ++$returnValue; - } - } - - return $returnValue; - } - - /** - * COUNTIFS. - * - * Counts the number of cells that contain numbers within the list of arguments - * - * Excel Function: - * COUNTIFS(criteria_range1, criteria1, [criteria_range2, criteria2]…) - * - * @param mixed $args Criterias - * - * @return int - */ - public static function COUNTIFS(...$args) - { - $arrayList = $args; - - // Return value - $returnValue = 0; - - if (empty($arrayList)) { - return $returnValue; - } - - $aArgsArray = []; - $conditions = []; - - while (count($arrayList) > 0) { - $aArgsArray[] = Functions::flattenArray(array_shift($arrayList)); - $conditions[] = Functions::ifCondition(array_shift($arrayList)); - } - - // Loop through each arg and see if arguments and conditions are true - foreach (array_keys($aArgsArray[0]) as $index) { - $valid = true; - - foreach ($conditions as $cidx => $condition) { - $conditionIsNumeric = strpos($condition, '"') === false; - $arg = $aArgsArray[$cidx][$index]; - - // Loop through arguments - if (!is_numeric($arg)) { - if ($conditionIsNumeric) { - $valid = false; - - break; // if false found, don't need to check other conditions - } - $arg = Calculation::wrapResult(strtoupper($arg)); - } elseif (!$conditionIsNumeric) { - $valid = false; - - break; // if false found, don't need to check other conditions - } - $testCondition = '=' . $arg . $condition; - if (!Calculation::getInstance()->_calculateFormulaValue($testCondition)) { - // Is not a value within our criteria - $valid = false; - - break; // if false found, don't need to check other conditions - } - } - - if ($valid) { - ++$returnValue; - } - } - - // Return - return $returnValue; - } - - /** - * COVAR. - * - * Returns covariance, the average of the products of deviations for each data point pair. - * - * @param mixed $yValues array of mixed Data Series Y - * @param mixed $xValues array of mixed Data Series X - * - * @return float|string - */ - public static function COVAR($yValues, $xValues) - { - if (!self::checkTrendArrays($yValues, $xValues)) { - return Functions::VALUE(); - } - $yValueCount = count($yValues); - $xValueCount = count($xValues); - - if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { - return Functions::NA(); - } elseif ($yValueCount == 1) { - return Functions::DIV0(); - } - - $bestFitLinear = Trend::calculate(Trend::TREND_LINEAR, $yValues, $xValues); - - return $bestFitLinear->getCovariance(); - } - - /** - * CRITBINOM. - * - * Returns the smallest value for which the cumulative binomial distribution is greater - * than or equal to a criterion value - * - * See https://support.microsoft.com/en-us/help/828117/ for details of the algorithm used - * - * @param float $trials number of Bernoulli trials - * @param float $probability probability of a success on each trial - * @param float $alpha criterion value - * - * @return int|string - * - * @TODO Warning. This implementation differs from the algorithm detailed on the MS - * web site in that $CumPGuessMinus1 = $CumPGuess - 1 rather than $CumPGuess - $PGuess - * This eliminates a potential endless loop error, but may have an adverse affect on the - * accuracy of the function (although all my tests have so far returned correct results). - */ - public static function CRITBINOM($trials, $probability, $alpha) - { - $trials = floor(Functions::flattenSingleValue($trials)); - $probability = Functions::flattenSingleValue($probability); - $alpha = Functions::flattenSingleValue($alpha); - - if ((is_numeric($trials)) && (is_numeric($probability)) && (is_numeric($alpha))) { - $trials = (int) $trials; - if ($trials < 0) { - return Functions::NAN(); - } elseif (($probability < 0.0) || ($probability > 1.0)) { - return Functions::NAN(); - } elseif (($alpha < 0.0) || ($alpha > 1.0)) { - return Functions::NAN(); - } - - if ($alpha <= 0.5) { - $t = sqrt(log(1 / ($alpha * $alpha))); - $trialsApprox = 0 - ($t + (2.515517 + 0.802853 * $t + 0.010328 * $t * $t) / (1 + 1.432788 * $t + 0.189269 * $t * $t + 0.001308 * $t * $t * $t)); - } else { - $t = sqrt(log(1 / (1 - $alpha) ** 2)); - $trialsApprox = $t - (2.515517 + 0.802853 * $t + 0.010328 * $t * $t) / (1 + 1.432788 * $t + 0.189269 * $t * $t + 0.001308 * $t * $t * $t); - } - - $Guess = floor($trials * $probability + $trialsApprox * sqrt($trials * $probability * (1 - $probability))); - if ($Guess < 0) { - $Guess = 0; - } elseif ($Guess > $trials) { - $Guess = $trials; - } - - $TotalUnscaledProbability = $UnscaledPGuess = $UnscaledCumPGuess = 0.0; - $EssentiallyZero = 10e-12; - - $m = floor($trials * $probability); - ++$TotalUnscaledProbability; - if ($m == $Guess) { - ++$UnscaledPGuess; - } - if ($m <= $Guess) { - ++$UnscaledCumPGuess; - } - - $PreviousValue = 1; - $Done = false; - $k = $m + 1; - while ((!$Done) && ($k <= $trials)) { - $CurrentValue = $PreviousValue * ($trials - $k + 1) * $probability / ($k * (1 - $probability)); - $TotalUnscaledProbability += $CurrentValue; - if ($k == $Guess) { - $UnscaledPGuess += $CurrentValue; - } - if ($k <= $Guess) { - $UnscaledCumPGuess += $CurrentValue; - } - if ($CurrentValue <= $EssentiallyZero) { - $Done = true; - } - $PreviousValue = $CurrentValue; - ++$k; - } - - $PreviousValue = 1; - $Done = false; - $k = $m - 1; - while ((!$Done) && ($k >= 0)) { - $CurrentValue = $PreviousValue * $k + 1 * (1 - $probability) / (($trials - $k) * $probability); - $TotalUnscaledProbability += $CurrentValue; - if ($k == $Guess) { - $UnscaledPGuess += $CurrentValue; - } - if ($k <= $Guess) { - $UnscaledCumPGuess += $CurrentValue; - } - if ($CurrentValue <= $EssentiallyZero) { - $Done = true; - } - $PreviousValue = $CurrentValue; - --$k; - } - - $PGuess = $UnscaledPGuess / $TotalUnscaledProbability; - $CumPGuess = $UnscaledCumPGuess / $TotalUnscaledProbability; - - $CumPGuessMinus1 = $CumPGuess - 1; - - while (true) { - if (($CumPGuessMinus1 < $alpha) && ($CumPGuess >= $alpha)) { - return $Guess; - } elseif (($CumPGuessMinus1 < $alpha) && ($CumPGuess < $alpha)) { - $PGuessPlus1 = $PGuess * ($trials - $Guess) * $probability / $Guess / (1 - $probability); - $CumPGuessMinus1 = $CumPGuess; - $CumPGuess = $CumPGuess + $PGuessPlus1; - $PGuess = $PGuessPlus1; - ++$Guess; - } elseif (($CumPGuessMinus1 >= $alpha) && ($CumPGuess >= $alpha)) { - $PGuessMinus1 = $PGuess * $Guess * (1 - $probability) / ($trials - $Guess + 1) / $probability; - $CumPGuess = $CumPGuessMinus1; - $CumPGuessMinus1 = $CumPGuessMinus1 - $PGuess; - $PGuess = $PGuessMinus1; - --$Guess; - } - } - } - - return Functions::VALUE(); - } - - /** - * DEVSQ. - * - * Returns the sum of squares of deviations of data points from their sample mean. - * - * Excel Function: - * DEVSQ(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string - */ - public static function DEVSQ(...$args) - { - $aArgs = Functions::flattenArrayIndexed($args); - - // Return value - $returnValue = null; - - $aMean = self::AVERAGE($aArgs); - if ($aMean != Functions::DIV0()) { - $aCount = -1; - foreach ($aArgs as $k => $arg) { - // Is it a numeric value? - if ( - (is_bool($arg)) && - ((!Functions::isCellValue($k)) || - (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE)) - ) { - $arg = (int) $arg; - } - if ((is_numeric($arg)) && (!is_string($arg))) { - if ($returnValue === null) { - $returnValue = ($arg - $aMean) ** 2; - } else { - $returnValue += ($arg - $aMean) ** 2; - } - ++$aCount; - } - } - - // Return - if ($returnValue === null) { - return Functions::NAN(); - } - - return $returnValue; - } - - return Functions::NA(); - } - - /** - * EXPONDIST. - * - * Returns the exponential distribution. Use EXPONDIST to model the time between events, - * such as how long an automated bank teller takes to deliver cash. For example, you can - * use EXPONDIST to determine the probability that the process takes at most 1 minute. - * - * @param float $value Value of the function - * @param float $lambda The parameter value - * @param bool $cumulative - * - * @return float|string - */ - public static function EXPONDIST($value, $lambda, $cumulative) - { - $value = Functions::flattenSingleValue($value); - $lambda = Functions::flattenSingleValue($lambda); - $cumulative = Functions::flattenSingleValue($cumulative); - - if ((is_numeric($value)) && (is_numeric($lambda))) { - if (($value < 0) || ($lambda < 0)) { - return Functions::NAN(); - } - if ((is_numeric($cumulative)) || (is_bool($cumulative))) { - if ($cumulative) { - return 1 - exp(0 - $value * $lambda); - } - - return $lambda * exp(0 - $value * $lambda); - } - } - - return Functions::VALUE(); - } - - private static function betaFunction($a, $b) - { - return (self::gamma($a) * self::gamma($b)) / self::gamma($a + $b); - } - - private static function regularizedIncompleteBeta($value, $a, $b) - { - return self::incompleteBeta($value, $a, $b) / self::betaFunction($a, $b); - } - - /** - * F.DIST. - * - * Returns the F probability distribution. - * You can use this function to determine whether two data sets have different degrees of diversity. - * For example, you can examine the test scores of men and women entering high school, and determine - * if the variability in the females is different from that found in the males. - * - * @param float $value Value of the function - * @param int $u The numerator degrees of freedom - * @param int $v The denominator degrees of freedom - * @param bool $cumulative If cumulative is TRUE, F.DIST returns the cumulative distribution function; - * if FALSE, it returns the probability density function. - * - * @return float|string - */ - public static function FDIST2($value, $u, $v, $cumulative) - { - $value = Functions::flattenSingleValue($value); - $u = Functions::flattenSingleValue($u); - $v = Functions::flattenSingleValue($v); - $cumulative = Functions::flattenSingleValue($cumulative); - - if (is_numeric($value) && is_numeric($u) && is_numeric($v)) { - if ($value < 0 || $u < 1 || $v < 1) { - return Functions::NAN(); - } - - $cumulative = (bool) $cumulative; - $u = (int) $u; - $v = (int) $v; - - if ($cumulative) { - $adjustedValue = ($u * $value) / ($u * $value + $v); - - return self::incompleteBeta($adjustedValue, $u / 2, $v / 2); - } - - return (self::gamma(($v + $u) / 2) / (self::gamma($u / 2) * self::gamma($v / 2))) * - (($u / $v) ** ($u / 2)) * - (($value ** (($u - 2) / 2)) / ((1 + ($u / $v) * $value) ** (($u + $v) / 2))); - } - - return Functions::VALUE(); - } - - /** - * FISHER. - * - * Returns the Fisher transformation at x. This transformation produces a function that - * is normally distributed rather than skewed. Use this function to perform hypothesis - * testing on the correlation coefficient. - * - * @param float $value - * - * @return float|string - */ - public static function FISHER($value) - { - $value = Functions::flattenSingleValue($value); - - if (is_numeric($value)) { - if (($value <= -1) || ($value >= 1)) { - return Functions::NAN(); - } - - return 0.5 * log((1 + $value) / (1 - $value)); - } - - return Functions::VALUE(); - } - - /** - * FISHERINV. - * - * Returns the inverse of the Fisher transformation. Use this transformation when - * analyzing correlations between ranges or arrays of data. If y = FISHER(x), then - * FISHERINV(y) = x. - * - * @param float $value - * - * @return float|string - */ - public static function FISHERINV($value) - { - $value = Functions::flattenSingleValue($value); - - if (is_numeric($value)) { - return (exp(2 * $value) - 1) / (exp(2 * $value) + 1); - } - - return Functions::VALUE(); - } - - /** - * FORECAST. - * - * Calculates, or predicts, a future value by using existing values. The predicted value is a y-value for a given x-value. - * - * @param float $xValue Value of X for which we want to find Y - * @param mixed $yValues array of mixed Data Series Y - * @param mixed $xValues of mixed Data Series X - * - * @return bool|float|string - */ - public static function FORECAST($xValue, $yValues, $xValues) - { - $xValue = Functions::flattenSingleValue($xValue); - if (!is_numeric($xValue)) { - return Functions::VALUE(); - } elseif (!self::checkTrendArrays($yValues, $xValues)) { - return Functions::VALUE(); - } - $yValueCount = count($yValues); - $xValueCount = count($xValues); - - if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { - return Functions::NA(); - } elseif ($yValueCount == 1) { - return Functions::DIV0(); - } - - $bestFitLinear = Trend::calculate(Trend::TREND_LINEAR, $yValues, $xValues); - - return $bestFitLinear->getValueOfYForX($xValue); - } - - /** - * GAMMA. - * - * Return the gamma function value. - * - * @param float $value - * - * @return float|string The result, or a string containing an error - */ - public static function GAMMAFunction($value) - { - $value = Functions::flattenSingleValue($value); - if (!is_numeric($value)) { - return Functions::VALUE(); - } elseif ((((int) $value) == ((float) $value)) && $value <= 0.0) { - return Functions::NAN(); - } - - return self::gamma($value); - } - - /** - * GAMMADIST. - * - * Returns the gamma distribution. - * - * @param float $value Value at which you want to evaluate the distribution - * @param float $a Parameter to the distribution - * @param float $b Parameter to the distribution - * @param bool $cumulative - * - * @return float|string - */ - public static function GAMMADIST($value, $a, $b, $cumulative) - { - $value = Functions::flattenSingleValue($value); - $a = Functions::flattenSingleValue($a); - $b = Functions::flattenSingleValue($b); - - if ((is_numeric($value)) && (is_numeric($a)) && (is_numeric($b))) { - if (($value < 0) || ($a <= 0) || ($b <= 0)) { - return Functions::NAN(); - } - if ((is_numeric($cumulative)) || (is_bool($cumulative))) { - if ($cumulative) { - return self::incompleteGamma($a, $value / $b) / self::gamma($a); - } - - return (1 / ($b ** $a * self::gamma($a))) * $value ** ($a - 1) * exp(0 - ($value / $b)); - } - } - - return Functions::VALUE(); - } - - /** - * GAMMAINV. - * - * Returns the inverse of the Gamma distribution. - * - * @param float $probability Probability at which you want to evaluate the distribution - * @param float $alpha Parameter to the distribution - * @param float $beta Parameter to the distribution - * - * @return float|string - */ - public static function GAMMAINV($probability, $alpha, $beta) - { - $probability = Functions::flattenSingleValue($probability); - $alpha = Functions::flattenSingleValue($alpha); - $beta = Functions::flattenSingleValue($beta); - - if ((is_numeric($probability)) && (is_numeric($alpha)) && (is_numeric($beta))) { - if (($alpha <= 0) || ($beta <= 0) || ($probability < 0) || ($probability > 1)) { - return Functions::NAN(); - } - - $xLo = 0; - $xHi = $alpha * $beta * 5; - - $x = $xNew = 1; - $dx = 1024; - $i = 0; - - while ((abs($dx) > Functions::PRECISION) && ($i++ < self::MAX_ITERATIONS)) { - // Apply Newton-Raphson step - $error = self::GAMMADIST($x, $alpha, $beta, true) - $probability; - if ($error < 0.0) { - $xLo = $x; - } else { - $xHi = $x; - } - $pdf = self::GAMMADIST($x, $alpha, $beta, false); - // Avoid division by zero - if ($pdf != 0.0) { - $dx = $error / $pdf; - $xNew = $x - $dx; - } - // If the NR fails to converge (which for example may be the - // case if the initial guess is too rough) we apply a bisection - // step to determine a more narrow interval around the root. - if (($xNew < $xLo) || ($xNew > $xHi) || ($pdf == 0.0)) { - $xNew = ($xLo + $xHi) / 2; - $dx = $xNew - $x; - } - $x = $xNew; - } - if ($i == self::MAX_ITERATIONS) { - return Functions::NA(); - } - - return $x; - } - - return Functions::VALUE(); - } - - /** - * GAMMALN. - * - * Returns the natural logarithm of the gamma function. - * - * @param float $value - * - * @return float|string - */ - public static function GAMMALN($value) - { - $value = Functions::flattenSingleValue($value); - - if (is_numeric($value)) { - if ($value <= 0) { - return Functions::NAN(); - } - - return log(self::gamma($value)); - } - - return Functions::VALUE(); - } - - /** - * GAUSS. - * - * Calculates the probability that a member of a standard normal population will fall between - * the mean and z standard deviations from the mean. - * - * @param float $value - * - * @return float|string The result, or a string containing an error - */ - public static function GAUSS($value) - { - $value = Functions::flattenSingleValue($value); - if (!is_numeric($value)) { - return Functions::VALUE(); - } - - return self::NORMDIST($value, 0, 1, true) - 0.5; - } - - /** - * GEOMEAN. - * - * Returns the geometric mean of an array or range of positive data. For example, you - * can use GEOMEAN to calculate average growth rate given compound interest with - * variable rates. - * - * Excel Function: - * GEOMEAN(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string - */ - public static function GEOMEAN(...$args) - { - $aArgs = Functions::flattenArray($args); - - $aMean = MathTrig::PRODUCT($aArgs); - if (is_numeric($aMean) && ($aMean > 0)) { - $aCount = self::COUNT($aArgs); - if (self::MIN($aArgs) > 0) { - return $aMean ** (1 / $aCount); - } - } - - return Functions::NAN(); - } - - /** - * GROWTH. - * - * Returns values along a predicted exponential Trend - * - * @param mixed[] $yValues Data Series Y - * @param mixed[] $xValues Data Series X - * @param mixed[] $newValues Values of X for which we want to find Y - * @param bool $const a logical value specifying whether to force the intersect to equal 0 - * - * @return array of float - */ - public static function GROWTH($yValues, $xValues = [], $newValues = [], $const = true) - { - $yValues = Functions::flattenArray($yValues); - $xValues = Functions::flattenArray($xValues); - $newValues = Functions::flattenArray($newValues); - $const = ($const === null) ? true : (bool) Functions::flattenSingleValue($const); - - $bestFitExponential = Trend::calculate(Trend::TREND_EXPONENTIAL, $yValues, $xValues, $const); - if (empty($newValues)) { - $newValues = $bestFitExponential->getXValues(); - } - - $returnArray = []; - foreach ($newValues as $xValue) { - $returnArray[0][] = $bestFitExponential->getValueOfYForX($xValue); - } - - return $returnArray; - } - - /** - * HARMEAN. - * - * Returns the harmonic mean of a data set. The harmonic mean is the reciprocal of the - * arithmetic mean of reciprocals. - * - * Excel Function: - * HARMEAN(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string - */ - public static function HARMEAN(...$args) - { - // Return value - $returnValue = 0; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - if (self::MIN($aArgs) < 0) { - return Functions::NAN(); - } - $aCount = 0; - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - if ($arg <= 0) { - return Functions::NAN(); - } - $returnValue += (1 / $arg); - ++$aCount; - } - } - - // Return - if ($aCount > 0) { - return 1 / ($returnValue / $aCount); - } - - return Functions::NA(); - } - - /** - * HYPGEOMDIST. - * - * Returns the hypergeometric distribution. HYPGEOMDIST returns the probability of a given number of - * sample successes, given the sample size, population successes, and population size. - * - * @param float $sampleSuccesses Number of successes in the sample - * @param float $sampleNumber Size of the sample - * @param float $populationSuccesses Number of successes in the population - * @param float $populationNumber Population size - * - * @return float|string - */ - public static function HYPGEOMDIST($sampleSuccesses, $sampleNumber, $populationSuccesses, $populationNumber) - { - $sampleSuccesses = Functions::flattenSingleValue($sampleSuccesses); - $sampleNumber = Functions::flattenSingleValue($sampleNumber); - $populationSuccesses = Functions::flattenSingleValue($populationSuccesses); - $populationNumber = Functions::flattenSingleValue($populationNumber); - - if ((is_numeric($sampleSuccesses)) && (is_numeric($sampleNumber)) && (is_numeric($populationSuccesses)) && (is_numeric($populationNumber))) { - $sampleSuccesses = floor($sampleSuccesses); - $sampleNumber = floor($sampleNumber); - $populationSuccesses = floor($populationSuccesses); - $populationNumber = floor($populationNumber); - - if (($sampleSuccesses < 0) || ($sampleSuccesses > $sampleNumber) || ($sampleSuccesses > $populationSuccesses)) { - return Functions::NAN(); - } - if (($sampleNumber <= 0) || ($sampleNumber > $populationNumber)) { - return Functions::NAN(); - } - if (($populationSuccesses <= 0) || ($populationSuccesses > $populationNumber)) { - return Functions::NAN(); - } - - return MathTrig::COMBIN($populationSuccesses, $sampleSuccesses) * - MathTrig::COMBIN($populationNumber - $populationSuccesses, $sampleNumber - $sampleSuccesses) / - MathTrig::COMBIN($populationNumber, $sampleNumber); - } - - return Functions::VALUE(); - } - - /** - * INTERCEPT. - * - * Calculates the point at which a line will intersect the y-axis by using existing x-values and y-values. - * - * @param mixed[] $yValues Data Series Y - * @param mixed[] $xValues Data Series X - * - * @return float|string - */ - public static function INTERCEPT($yValues, $xValues) - { - if (!self::checkTrendArrays($yValues, $xValues)) { - return Functions::VALUE(); - } - $yValueCount = count($yValues); - $xValueCount = count($xValues); - - if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { - return Functions::NA(); - } elseif ($yValueCount == 1) { - return Functions::DIV0(); - } - - $bestFitLinear = Trend::calculate(Trend::TREND_LINEAR, $yValues, $xValues); - - return $bestFitLinear->getIntersect(); - } - - /** - * KURT. - * - * Returns the kurtosis of a data set. Kurtosis characterizes the relative peakedness - * or flatness of a distribution compared with the normal distribution. Positive - * kurtosis indicates a relatively peaked distribution. Negative kurtosis indicates a - * relatively flat distribution. - * - * @param array ...$args Data Series - * - * @return float|string - */ - public static function KURT(...$args) - { - $aArgs = Functions::flattenArrayIndexed($args); - $mean = self::AVERAGE($aArgs); - $stdDev = self::STDEV($aArgs); - - if ($stdDev > 0) { - $count = $summer = 0; - // Loop through arguments - foreach ($aArgs as $k => $arg) { - if ( - (is_bool($arg)) && - (!Functions::isMatrixValue($k)) - ) { - } else { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $summer += (($arg - $mean) / $stdDev) ** 4; - ++$count; - } - } - } - - // Return - if ($count > 3) { - return $summer * ($count * ($count + 1) / (($count - 1) * ($count - 2) * ($count - 3))) - (3 * ($count - 1) ** 2 / (($count - 2) * ($count - 3))); - } - } - - return Functions::DIV0(); - } - - /** - * LARGE. - * - * Returns the nth largest value in a data set. You can use this function to - * select a value based on its relative standing. - * - * Excel Function: - * LARGE(value1[,value2[, ...]],entry) - * - * @param mixed $args Data values - * - * @return float|string The result, or a string containing an error - */ - public static function LARGE(...$args) - { - $aArgs = Functions::flattenArray($args); - $entry = array_pop($aArgs); - - if ((is_numeric($entry)) && (!is_string($entry))) { - $entry = (int) floor($entry); - - // Calculate - $mArgs = []; - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $mArgs[] = $arg; - } - } - $count = self::COUNT($mArgs); - --$entry; - if (($entry < 0) || ($entry >= $count) || ($count == 0)) { - return Functions::NAN(); - } - rsort($mArgs); - - return $mArgs[$entry]; - } - - return Functions::VALUE(); - } - - /** - * LINEST. - * - * Calculates the statistics for a line by using the "least squares" method to calculate a straight line that best fits your data, - * and then returns an array that describes the line. - * - * @param mixed[] $yValues Data Series Y - * @param null|mixed[] $xValues Data Series X - * @param bool $const a logical value specifying whether to force the intersect to equal 0 - * @param bool $stats a logical value specifying whether to return additional regression statistics - * - * @return array|int|string The result, or a string containing an error - */ - public static function LINEST($yValues, $xValues = null, $const = true, $stats = false) - { - $const = ($const === null) ? true : (bool) Functions::flattenSingleValue($const); - $stats = ($stats === null) ? false : (bool) Functions::flattenSingleValue($stats); - if ($xValues === null) { - $xValues = range(1, count(Functions::flattenArray($yValues))); - } - - if (!self::checkTrendArrays($yValues, $xValues)) { - return Functions::VALUE(); - } - $yValueCount = count($yValues); - $xValueCount = count($xValues); - - if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { - return Functions::NA(); - } elseif ($yValueCount == 1) { - return 0; - } - - $bestFitLinear = Trend::calculate(Trend::TREND_LINEAR, $yValues, $xValues, $const); - if ($stats) { - return [ - [ - $bestFitLinear->getSlope(), - $bestFitLinear->getSlopeSE(), - $bestFitLinear->getGoodnessOfFit(), - $bestFitLinear->getF(), - $bestFitLinear->getSSRegression(), - ], - [ - $bestFitLinear->getIntersect(), - $bestFitLinear->getIntersectSE(), - $bestFitLinear->getStdevOfResiduals(), - $bestFitLinear->getDFResiduals(), - $bestFitLinear->getSSResiduals(), - ], - ]; - } - - return [ - $bestFitLinear->getSlope(), - $bestFitLinear->getIntersect(), - ]; - } - - /** - * LOGEST. - * - * Calculates an exponential curve that best fits the X and Y data series, - * and then returns an array that describes the line. - * - * @param mixed[] $yValues Data Series Y - * @param null|mixed[] $xValues Data Series X - * @param bool $const a logical value specifying whether to force the intersect to equal 0 - * @param bool $stats a logical value specifying whether to return additional regression statistics - * - * @return array|int|string The result, or a string containing an error - */ - public static function LOGEST($yValues, $xValues = null, $const = true, $stats = false) - { - $const = ($const === null) ? true : (bool) Functions::flattenSingleValue($const); - $stats = ($stats === null) ? false : (bool) Functions::flattenSingleValue($stats); - if ($xValues === null) { - $xValues = range(1, count(Functions::flattenArray($yValues))); - } - - if (!self::checkTrendArrays($yValues, $xValues)) { - return Functions::VALUE(); - } - $yValueCount = count($yValues); - $xValueCount = count($xValues); - - foreach ($yValues as $value) { - if ($value <= 0.0) { - return Functions::NAN(); - } - } - - if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { - return Functions::NA(); - } elseif ($yValueCount == 1) { - return 1; - } - - $bestFitExponential = Trend::calculate(Trend::TREND_EXPONENTIAL, $yValues, $xValues, $const); - if ($stats) { - return [ - [ - $bestFitExponential->getSlope(), - $bestFitExponential->getSlopeSE(), - $bestFitExponential->getGoodnessOfFit(), - $bestFitExponential->getF(), - $bestFitExponential->getSSRegression(), - ], - [ - $bestFitExponential->getIntersect(), - $bestFitExponential->getIntersectSE(), - $bestFitExponential->getStdevOfResiduals(), - $bestFitExponential->getDFResiduals(), - $bestFitExponential->getSSResiduals(), - ], - ]; - } - - return [ - $bestFitExponential->getSlope(), - $bestFitExponential->getIntersect(), - ]; - } - - /** - * LOGINV. - * - * Returns the inverse of the normal cumulative distribution - * - * @param float $probability - * @param float $mean - * @param float $stdDev - * - * @return float|string The result, or a string containing an error - * - * @TODO Try implementing P J Acklam's refinement algorithm for greater - * accuracy if I can get my head round the mathematics - * (as described at) http://home.online.no/~pjacklam/notes/invnorm/ - */ - public static function LOGINV($probability, $mean, $stdDev) - { - $probability = Functions::flattenSingleValue($probability); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); - - if ((is_numeric($probability)) && (is_numeric($mean)) && (is_numeric($stdDev))) { - if (($probability < 0) || ($probability > 1) || ($stdDev <= 0)) { - return Functions::NAN(); - } - - return exp($mean + $stdDev * self::NORMSINV($probability)); - } - - return Functions::VALUE(); - } - - /** - * LOGNORMDIST. - * - * Returns the cumulative lognormal distribution of x, where ln(x) is normally distributed - * with parameters mean and standard_dev. - * - * @param float $value - * @param float $mean - * @param float $stdDev - * - * @return float|string The result, or a string containing an error - */ - public static function LOGNORMDIST($value, $mean, $stdDev) - { - $value = Functions::flattenSingleValue($value); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); - - if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) { - if (($value <= 0) || ($stdDev <= 0)) { - return Functions::NAN(); - } - - return self::NORMSDIST((log($value) - $mean) / $stdDev); - } - - return Functions::VALUE(); - } - - /** - * LOGNORM.DIST. - * - * Returns the lognormal distribution of x, where ln(x) is normally distributed - * with parameters mean and standard_dev. - * - * @param float $value - * @param float $mean - * @param float $stdDev - * @param bool $cumulative - * - * @return float|string The result, or a string containing an error - */ - public static function LOGNORMDIST2($value, $mean, $stdDev, $cumulative = false) - { - $value = Functions::flattenSingleValue($value); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); - $cumulative = (bool) Functions::flattenSingleValue($cumulative); - - if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) { - if (($value <= 0) || ($stdDev <= 0)) { - return Functions::NAN(); - } - - if ($cumulative === true) { - return self::NORMSDIST2((log($value) - $mean) / $stdDev, true); - } - - return (1 / (sqrt(2 * M_PI) * $stdDev * $value)) * - exp(0 - ((log($value) - $mean) ** 2 / (2 * $stdDev ** 2))); - } - - return Functions::VALUE(); - } - - /** - * MAX. - * - * MAX returns the value of the element of the values passed that has the highest value, - * with negative numbers considered smaller than positive numbers. - * - * Excel Function: - * MAX(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float - */ - public static function MAX(...$args) - { - $returnValue = null; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - if (($returnValue === null) || ($arg > $returnValue)) { - $returnValue = $arg; - } - } - } - - if ($returnValue === null) { - return 0; - } - - return $returnValue; - } - - /** - * MAXA. - * - * Returns the greatest value in a list of arguments, including numbers, text, and logical values - * - * Excel Function: - * MAXA(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float - */ - public static function MAXA(...$args) - { - $returnValue = null; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { - if (is_bool($arg)) { - $arg = (int) $arg; - } elseif (is_string($arg)) { - $arg = 0; - } - if (($returnValue === null) || ($arg > $returnValue)) { - $returnValue = $arg; - } - } - } - - if ($returnValue === null) { - return 0; - } - - return $returnValue; - } - - /** - * MAXIFS. - * - * Counts the maximum value within a range of cells that contain numbers within the list of arguments - * - * Excel Function: - * MAXIFS(max_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...) - * - * @param mixed $args Data range and criterias - * - * @return float - */ - public static function MAXIFS(...$args) - { - $arrayList = $args; - - // Return value - $returnValue = null; - - $maxArgs = Functions::flattenArray(array_shift($arrayList)); - $aArgsArray = []; - $conditions = []; - - while (count($arrayList) > 0) { - $aArgsArray[] = Functions::flattenArray(array_shift($arrayList)); - $conditions[] = Functions::ifCondition(array_shift($arrayList)); - } - - // Loop through each arg and see if arguments and conditions are true - foreach ($maxArgs as $index => $value) { - $valid = true; - - foreach ($conditions as $cidx => $condition) { - $arg = $aArgsArray[$cidx][$index]; - - // Loop through arguments - if (!is_numeric($arg)) { - $arg = Calculation::wrapResult(strtoupper($arg)); - } - $testCondition = '=' . $arg . $condition; - if (!Calculation::getInstance()->_calculateFormulaValue($testCondition)) { - // Is not a value within our criteria - $valid = false; - - break; // if false found, don't need to check other conditions - } - } - - if ($valid) { - $returnValue = $returnValue === null ? $value : max($value, $returnValue); - } - } - - // Return - return $returnValue; - } - - /** - * MEDIAN. - * - * Returns the median of the given numbers. The median is the number in the middle of a set of numbers. - * - * Excel Function: - * MEDIAN(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string The result, or a string containing an error - */ - public static function MEDIAN(...$args) - { - $returnValue = Functions::NAN(); - - $mArgs = []; - // Loop through arguments - $aArgs = Functions::flattenArray($args); - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $mArgs[] = $arg; - } - } - - $mValueCount = count($mArgs); - if ($mValueCount > 0) { - sort($mArgs, SORT_NUMERIC); - $mValueCount = $mValueCount / 2; - if ($mValueCount == floor($mValueCount)) { - $returnValue = ($mArgs[$mValueCount--] + $mArgs[$mValueCount]) / 2; - } else { - $mValueCount = floor($mValueCount); - $returnValue = $mArgs[$mValueCount]; - } - } - - return $returnValue; - } - - /** - * MIN. - * - * MIN returns the value of the element of the values passed that has the smallest value, - * with negative numbers considered smaller than positive numbers. - * - * Excel Function: - * MIN(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float - */ - public static function MIN(...$args) - { - $returnValue = null; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - if (($returnValue === null) || ($arg < $returnValue)) { - $returnValue = $arg; - } - } - } - - if ($returnValue === null) { - return 0; - } - - return $returnValue; - } - - /** - * MINA. - * - * Returns the smallest value in a list of arguments, including numbers, text, and logical values - * - * Excel Function: - * MINA(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float - */ - public static function MINA(...$args) - { - $returnValue = null; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { - if (is_bool($arg)) { - $arg = (int) $arg; - } elseif (is_string($arg)) { - $arg = 0; - } - if (($returnValue === null) || ($arg < $returnValue)) { - $returnValue = $arg; - } - } - } - - if ($returnValue === null) { - return 0; - } - - return $returnValue; - } - - /** - * MINIFS. - * - * Returns the minimum value within a range of cells that contain numbers within the list of arguments - * - * Excel Function: - * MINIFS(min_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...) - * - * @param mixed $args Data range and criterias - * - * @return float - */ - public static function MINIFS(...$args) - { - $arrayList = $args; - - // Return value - $returnValue = null; - - $minArgs = Functions::flattenArray(array_shift($arrayList)); - $aArgsArray = []; - $conditions = []; - - while (count($arrayList) > 0) { - $aArgsArray[] = Functions::flattenArray(array_shift($arrayList)); - $conditions[] = Functions::ifCondition(array_shift($arrayList)); - } - - // Loop through each arg and see if arguments and conditions are true - foreach ($minArgs as $index => $value) { - $valid = true; - - foreach ($conditions as $cidx => $condition) { - $arg = $aArgsArray[$cidx][$index]; - - // Loop through arguments - if (!is_numeric($arg)) { - $arg = Calculation::wrapResult(strtoupper($arg)); - } - $testCondition = '=' . $arg . $condition; - if (!Calculation::getInstance()->_calculateFormulaValue($testCondition)) { - // Is not a value within our criteria - $valid = false; - - break; // if false found, don't need to check other conditions - } - } - - if ($valid) { - $returnValue = $returnValue === null ? $value : min($value, $returnValue); - } - } - - // Return - return $returnValue; - } - - // - // Special variant of array_count_values that isn't limited to strings and integers, - // but can work with floating point numbers as values - // - private static function modeCalc($data) - { - $frequencyArray = []; - $index = 0; - $maxfreq = 0; - $maxfreqkey = ''; - $maxfreqdatum = ''; - foreach ($data as $datum) { - $found = false; - ++$index; - foreach ($frequencyArray as $key => $value) { - if ((string) $value['value'] == (string) $datum) { - ++$frequencyArray[$key]['frequency']; - $freq = $frequencyArray[$key]['frequency']; - if ($freq > $maxfreq) { - $maxfreq = $freq; - $maxfreqkey = $key; - $maxfreqdatum = $datum; - } elseif ($freq == $maxfreq) { - if ($frequencyArray[$key]['index'] < $frequencyArray[$maxfreqkey]['index']) { - $maxfreqkey = $key; - $maxfreqdatum = $datum; - } - } - $found = true; - - break; - } - } - if (!$found) { - $frequencyArray[] = [ - 'value' => $datum, - 'frequency' => 1, - 'index' => $index, - ]; - } - } - - if ($maxfreq <= 1) { - return Functions::NA(); - } - - return $maxfreqdatum; - } - - /** - * MODE. - * - * Returns the most frequently occurring, or repetitive, value in an array or range of data - * - * Excel Function: - * MODE(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string The result, or a string containing an error - */ - public static function MODE(...$args) - { - $returnValue = Functions::NA(); - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - - $mArgs = []; - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $mArgs[] = $arg; - } - } - - if (!empty($mArgs)) { - return self::modeCalc($mArgs); - } - - return $returnValue; - } - - /** - * NEGBINOMDIST. - * - * Returns the negative binomial distribution. NEGBINOMDIST returns the probability that - * there will be number_f failures before the number_s-th success, when the constant - * probability of a success is probability_s. This function is similar to the binomial - * distribution, except that the number of successes is fixed, and the number of trials is - * variable. Like the binomial, trials are assumed to be independent. - * - * @param float $failures Number of Failures - * @param float $successes Threshold number of Successes - * @param float $probability Probability of success on each trial - * - * @return float|string The result, or a string containing an error - */ - public static function NEGBINOMDIST($failures, $successes, $probability) - { - $failures = floor(Functions::flattenSingleValue($failures)); - $successes = floor(Functions::flattenSingleValue($successes)); - $probability = Functions::flattenSingleValue($probability); - - if ((is_numeric($failures)) && (is_numeric($successes)) && (is_numeric($probability))) { - if (($failures < 0) || ($successes < 1)) { - return Functions::NAN(); - } elseif (($probability < 0) || ($probability > 1)) { - return Functions::NAN(); - } - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) { - if (($failures + $successes - 1) <= 0) { - return Functions::NAN(); - } - } - - return (MathTrig::COMBIN($failures + $successes - 1, $successes - 1)) * ($probability ** $successes) * ((1 - $probability) ** $failures); - } - - return Functions::VALUE(); - } - - /** - * NORMDIST. - * - * Returns the normal distribution for the specified mean and standard deviation. This - * function has a very wide range of applications in statistics, including hypothesis - * testing. - * - * @param float $value - * @param float $mean Mean Value - * @param float $stdDev Standard Deviation - * @param bool $cumulative - * - * @return float|string The result, or a string containing an error - */ - public static function NORMDIST($value, $mean, $stdDev, $cumulative) - { - $value = Functions::flattenSingleValue($value); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); - - if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) { - if ($stdDev < 0) { - return Functions::NAN(); - } - if ((is_numeric($cumulative)) || (is_bool($cumulative))) { - if ($cumulative) { - return 0.5 * (1 + Engineering::erfVal(($value - $mean) / ($stdDev * sqrt(2)))); - } - - return (1 / (self::SQRT2PI * $stdDev)) * exp(0 - (($value - $mean) ** 2 / (2 * ($stdDev * $stdDev)))); - } - } - - return Functions::VALUE(); - } - - /** - * NORMINV. - * - * Returns the inverse of the normal cumulative distribution for the specified mean and standard deviation. - * - * @param float $probability - * @param float $mean Mean Value - * @param float $stdDev Standard Deviation - * - * @return float|string The result, or a string containing an error - */ - public static function NORMINV($probability, $mean, $stdDev) - { - $probability = Functions::flattenSingleValue($probability); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); - - if ((is_numeric($probability)) && (is_numeric($mean)) && (is_numeric($stdDev))) { - if (($probability < 0) || ($probability > 1)) { - return Functions::NAN(); - } - if ($stdDev < 0) { - return Functions::NAN(); - } - - return (self::inverseNcdf($probability) * $stdDev) + $mean; - } - - return Functions::VALUE(); - } - - /** - * NORMSDIST. - * - * Returns the standard normal cumulative distribution function. The distribution has - * a mean of 0 (zero) and a standard deviation of one. Use this function in place of a - * table of standard normal curve areas. - * - * @param float $value - * - * @return float|string The result, or a string containing an error - */ - public static function NORMSDIST($value) - { - $value = Functions::flattenSingleValue($value); - if (!is_numeric($value)) { - return Functions::VALUE(); - } - - return self::NORMDIST($value, 0, 1, true); - } - - /** - * NORM.S.DIST. - * - * Returns the standard normal cumulative distribution function. The distribution has - * a mean of 0 (zero) and a standard deviation of one. Use this function in place of a - * table of standard normal curve areas. - * - * @param float $value - * @param bool $cumulative - * - * @return float|string The result, or a string containing an error - */ - public static function NORMSDIST2($value, $cumulative) - { - $value = Functions::flattenSingleValue($value); - if (!is_numeric($value)) { - return Functions::VALUE(); - } - $cumulative = (bool) Functions::flattenSingleValue($cumulative); - - return self::NORMDIST($value, 0, 1, $cumulative); - } - - /** - * NORMSINV. - * - * Returns the inverse of the standard normal cumulative distribution - * - * @param float $value - * - * @return float|string The result, or a string containing an error - */ - public static function NORMSINV($value) - { - return self::NORMINV($value, 0, 1); - } - - /** - * PERCENTILE. - * - * Returns the nth percentile of values in a range.. - * - * Excel Function: - * PERCENTILE(value1[,value2[, ...]],entry) - * - * @param mixed $args Data values - * - * @return float|string The result, or a string containing an error - */ - public static function PERCENTILE(...$args) - { - $aArgs = Functions::flattenArray($args); - - // Calculate - $entry = array_pop($aArgs); - - if ((is_numeric($entry)) && (!is_string($entry))) { - if (($entry < 0) || ($entry > 1)) { - return Functions::NAN(); - } - $mArgs = []; - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $mArgs[] = $arg; - } - } - $mValueCount = count($mArgs); - if ($mValueCount > 0) { - sort($mArgs); - $count = self::COUNT($mArgs); - $index = $entry * ($count - 1); - $iBase = floor($index); - if ($index == $iBase) { - return $mArgs[$index]; - } - $iNext = $iBase + 1; - $iProportion = $index - $iBase; - - return $mArgs[$iBase] + (($mArgs[$iNext] - $mArgs[$iBase]) * $iProportion); - } - } - - return Functions::VALUE(); - } - - /** - * PERCENTRANK. - * - * Returns the rank of a value in a data set as a percentage of the data set. - * - * @param float[] $valueSet An array of, or a reference to, a list of numbers - * @param int $value the number whose rank you want to find - * @param int $significance the number of significant digits for the returned percentage value - * - * @return float|string (string if result is an error) - */ - public static function PERCENTRANK($valueSet, $value, $significance = 3) - { - $valueSet = Functions::flattenArray($valueSet); - $value = Functions::flattenSingleValue($value); - $significance = ($significance === null) ? 3 : (int) Functions::flattenSingleValue($significance); - - foreach ($valueSet as $key => $valueEntry) { - if (!is_numeric($valueEntry)) { - unset($valueSet[$key]); - } - } - sort($valueSet, SORT_NUMERIC); - $valueCount = count($valueSet); - if ($valueCount == 0) { - return Functions::NAN(); - } - - $valueAdjustor = $valueCount - 1; - if (($value < $valueSet[0]) || ($value > $valueSet[$valueAdjustor])) { - return Functions::NA(); - } - - $pos = array_search($value, $valueSet); - if ($pos === false) { - $pos = 0; - $testValue = $valueSet[0]; - while ($testValue < $value) { - $testValue = $valueSet[++$pos]; - } - --$pos; - $pos += (($value - $valueSet[$pos]) / ($testValue - $valueSet[$pos])); - } - - return round($pos / $valueAdjustor, $significance); - } - - /** - * PERMUT. - * - * Returns the number of permutations for a given number of objects that can be - * selected from number objects. A permutation is any set or subset of objects or - * events where internal order is significant. Permutations are different from - * combinations, for which the internal order is not significant. Use this function - * for lottery-style probability calculations. - * - * @param int $numObjs Number of different objects - * @param int $numInSet Number of objects in each permutation - * - * @return int|string Number of permutations, or a string containing an error - */ - public static function PERMUT($numObjs, $numInSet) - { - $numObjs = Functions::flattenSingleValue($numObjs); - $numInSet = Functions::flattenSingleValue($numInSet); - - if ((is_numeric($numObjs)) && (is_numeric($numInSet))) { - $numInSet = floor($numInSet); - if ($numObjs < $numInSet) { - return Functions::NAN(); - } - - return round(MathTrig::FACT($numObjs) / MathTrig::FACT($numObjs - $numInSet)); - } - - return Functions::VALUE(); - } - - /** - * POISSON. - * - * Returns the Poisson distribution. A common application of the Poisson distribution - * is predicting the number of events over a specific time, such as the number of - * cars arriving at a toll plaza in 1 minute. - * - * @param float $value - * @param float $mean Mean Value - * @param bool $cumulative - * - * @return float|string The result, or a string containing an error - */ - public static function POISSON($value, $mean, $cumulative) - { - $value = Functions::flattenSingleValue($value); - $mean = Functions::flattenSingleValue($mean); - - if ((is_numeric($value)) && (is_numeric($mean))) { - if (($value < 0) || ($mean <= 0)) { - return Functions::NAN(); - } - if ((is_numeric($cumulative)) || (is_bool($cumulative))) { - if ($cumulative) { - $summer = 0; - $floor = floor($value); - for ($i = 0; $i <= $floor; ++$i) { - $summer += $mean ** $i / MathTrig::FACT($i); - } - - return exp(0 - $mean) * $summer; - } - - return (exp(0 - $mean) * $mean ** $value) / MathTrig::FACT($value); - } - } - - return Functions::VALUE(); - } - - /** - * QUARTILE. - * - * Returns the quartile of a data set. - * - * Excel Function: - * QUARTILE(value1[,value2[, ...]],entry) - * - * @param mixed $args Data values - * - * @return float|string The result, or a string containing an error - */ - public static function QUARTILE(...$args) - { - $aArgs = Functions::flattenArray($args); - - // Calculate - $entry = floor(array_pop($aArgs)); - - if ((is_numeric($entry)) && (!is_string($entry))) { - $entry /= 4; - if (($entry < 0) || ($entry > 1)) { - return Functions::NAN(); - } - - return self::PERCENTILE($aArgs, $entry); - } - - return Functions::VALUE(); - } - - /** - * RANK. - * - * Returns the rank of a number in a list of numbers. - * - * @param int $value the number whose rank you want to find - * @param float[] $valueSet An array of, or a reference to, a list of numbers - * @param int $order Order to sort the values in the value set - * - * @return float|string The result, or a string containing an error - */ - public static function RANK($value, $valueSet, $order = 0) - { - $value = Functions::flattenSingleValue($value); - $valueSet = Functions::flattenArray($valueSet); - $order = ($order === null) ? 0 : (int) Functions::flattenSingleValue($order); - - foreach ($valueSet as $key => $valueEntry) { - if (!is_numeric($valueEntry)) { - unset($valueSet[$key]); - } - } - - if ($order == 0) { - rsort($valueSet, SORT_NUMERIC); - } else { - sort($valueSet, SORT_NUMERIC); - } - $pos = array_search($value, $valueSet); - if ($pos === false) { - return Functions::NA(); - } - - return ++$pos; - } - - /** - * RSQ. - * - * Returns the square of the Pearson product moment correlation coefficient through data points in known_y's and known_x's. - * - * @param mixed[] $yValues Data Series Y - * @param mixed[] $xValues Data Series X - * - * @return float|string The result, or a string containing an error - */ - public static function RSQ($yValues, $xValues) - { - if (!self::checkTrendArrays($yValues, $xValues)) { - return Functions::VALUE(); - } - $yValueCount = count($yValues); - $xValueCount = count($xValues); - - if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { - return Functions::NA(); - } elseif ($yValueCount == 1) { - return Functions::DIV0(); - } - - $bestFitLinear = Trend::calculate(Trend::TREND_LINEAR, $yValues, $xValues); - - return $bestFitLinear->getGoodnessOfFit(); - } - - /** - * SKEW. - * - * Returns the skewness of a distribution. Skewness characterizes the degree of asymmetry - * of a distribution around its mean. Positive skewness indicates a distribution with an - * asymmetric tail extending toward more positive values. Negative skewness indicates a - * distribution with an asymmetric tail extending toward more negative values. - * - * @param array ...$args Data Series - * - * @return float|string The result, or a string containing an error - */ - public static function SKEW(...$args) - { - $aArgs = Functions::flattenArrayIndexed($args); - $mean = self::AVERAGE($aArgs); - $stdDev = self::STDEV($aArgs); - - $count = $summer = 0; - // Loop through arguments - foreach ($aArgs as $k => $arg) { - if ( - (is_bool($arg)) && - (!Functions::isMatrixValue($k)) - ) { - } else { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $summer += (($arg - $mean) / $stdDev) ** 3; - ++$count; - } - } - } - - if ($count > 2) { - return $summer * ($count / (($count - 1) * ($count - 2))); - } - - return Functions::DIV0(); - } - - /** - * SLOPE. - * - * Returns the slope of the linear regression line through data points in known_y's and known_x's. - * - * @param mixed[] $yValues Data Series Y - * @param mixed[] $xValues Data Series X - * - * @return float|string The result, or a string containing an error - */ - public static function SLOPE($yValues, $xValues) - { - if (!self::checkTrendArrays($yValues, $xValues)) { - return Functions::VALUE(); - } - $yValueCount = count($yValues); - $xValueCount = count($xValues); - - if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { - return Functions::NA(); - } elseif ($yValueCount == 1) { - return Functions::DIV0(); - } - - $bestFitLinear = Trend::calculate(Trend::TREND_LINEAR, $yValues, $xValues); - - return $bestFitLinear->getSlope(); - } - - /** - * SMALL. - * - * Returns the nth smallest value in a data set. You can use this function to - * select a value based on its relative standing. - * - * Excel Function: - * SMALL(value1[,value2[, ...]],entry) - * - * @param mixed $args Data values - * - * @return float|string The result, or a string containing an error - */ - public static function SMALL(...$args) - { - $aArgs = Functions::flattenArray($args); - - // Calculate - $entry = array_pop($aArgs); - - if ((is_numeric($entry)) && (!is_string($entry))) { - $entry = (int) floor($entry); - - $mArgs = []; - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $mArgs[] = $arg; - } - } - $count = self::COUNT($mArgs); - --$entry; - if (($entry < 0) || ($entry >= $count) || ($count == 0)) { - return Functions::NAN(); - } - sort($mArgs); - - return $mArgs[$entry]; - } - - return Functions::VALUE(); - } - - /** - * STANDARDIZE. - * - * Returns a normalized value from a distribution characterized by mean and standard_dev. - * - * @param float $value Value to normalize - * @param float $mean Mean Value - * @param float $stdDev Standard Deviation - * - * @return float|string Standardized value, or a string containing an error - */ - public static function STANDARDIZE($value, $mean, $stdDev) - { - $value = Functions::flattenSingleValue($value); - $mean = Functions::flattenSingleValue($mean); - $stdDev = Functions::flattenSingleValue($stdDev); - - if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) { - if ($stdDev <= 0) { - return Functions::NAN(); - } - - return ($value - $mean) / $stdDev; - } - - return Functions::VALUE(); - } - - /** - * STDEV. - * - * Estimates standard deviation based on a sample. The standard deviation is a measure of how - * widely values are dispersed from the average value (the mean). - * - * Excel Function: - * STDEV(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string The result, or a string containing an error - */ - public static function STDEV(...$args) - { - $aArgs = Functions::flattenArrayIndexed($args); - - // Return value - $returnValue = null; - - $aMean = self::AVERAGE($aArgs); - if ($aMean !== null) { - $aCount = -1; - foreach ($aArgs as $k => $arg) { - if ( - (is_bool($arg)) && - ((!Functions::isCellValue($k)) || (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE)) - ) { - $arg = (int) $arg; - } - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - if ($returnValue === null) { - $returnValue = ($arg - $aMean) ** 2; - } else { - $returnValue += ($arg - $aMean) ** 2; - } - ++$aCount; - } - } - - // Return - if (($aCount > 0) && ($returnValue >= 0)) { - return sqrt($returnValue / $aCount); - } - } - - return Functions::DIV0(); - } - - /** - * STDEVA. - * - * Estimates standard deviation based on a sample, including numbers, text, and logical values - * - * Excel Function: - * STDEVA(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string - */ - public static function STDEVA(...$args) - { - $aArgs = Functions::flattenArrayIndexed($args); - - $returnValue = null; - - $aMean = self::AVERAGEA($aArgs); - if ($aMean !== null) { - $aCount = -1; - foreach ($aArgs as $k => $arg) { - if ( - (is_bool($arg)) && - (!Functions::isMatrixValue($k)) - ) { - } else { - // Is it a numeric value? - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { - if (is_bool($arg)) { - $arg = (int) $arg; - } elseif (is_string($arg)) { - $arg = 0; - } - if ($returnValue === null) { - $returnValue = ($arg - $aMean) ** 2; - } else { - $returnValue += ($arg - $aMean) ** 2; - } - ++$aCount; - } - } - } - - if (($aCount > 0) && ($returnValue >= 0)) { - return sqrt($returnValue / $aCount); - } - } - - return Functions::DIV0(); - } - - /** - * STDEVP. - * - * Calculates standard deviation based on the entire population - * - * Excel Function: - * STDEVP(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string - */ - public static function STDEVP(...$args) - { - $aArgs = Functions::flattenArrayIndexed($args); - - $returnValue = null; - - $aMean = self::AVERAGE($aArgs); - if ($aMean !== null) { - $aCount = 0; - foreach ($aArgs as $k => $arg) { - if ( - (is_bool($arg)) && - ((!Functions::isCellValue($k)) || (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE)) - ) { - $arg = (int) $arg; - } - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - if ($returnValue === null) { - $returnValue = ($arg - $aMean) ** 2; - } else { - $returnValue += ($arg - $aMean) ** 2; - } - ++$aCount; - } - } - - if (($aCount > 0) && ($returnValue >= 0)) { - return sqrt($returnValue / $aCount); - } - } - - return Functions::DIV0(); - } - - /** - * STDEVPA. - * - * Calculates standard deviation based on the entire population, including numbers, text, and logical values - * - * Excel Function: - * STDEVPA(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string - */ - public static function STDEVPA(...$args) - { - $aArgs = Functions::flattenArrayIndexed($args); - - $returnValue = null; - - $aMean = self::AVERAGEA($aArgs); - if ($aMean !== null) { - $aCount = 0; - foreach ($aArgs as $k => $arg) { - if ( - (is_bool($arg)) && - (!Functions::isMatrixValue($k)) - ) { - } else { - // Is it a numeric value? - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { - if (is_bool($arg)) { - $arg = (int) $arg; - } elseif (is_string($arg)) { - $arg = 0; - } - if ($returnValue === null) { - $returnValue = ($arg - $aMean) ** 2; - } else { - $returnValue += ($arg - $aMean) ** 2; - } - ++$aCount; - } - } - } - - if (($aCount > 0) && ($returnValue >= 0)) { - return sqrt($returnValue / $aCount); - } - } - - return Functions::DIV0(); - } - - /** - * STEYX. - * - * Returns the standard error of the predicted y-value for each x in the regression. - * - * @param mixed[] $yValues Data Series Y - * @param mixed[] $xValues Data Series X - * - * @return float|string - */ - public static function STEYX($yValues, $xValues) - { - if (!self::checkTrendArrays($yValues, $xValues)) { - return Functions::VALUE(); - } - $yValueCount = count($yValues); - $xValueCount = count($xValues); - - if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { - return Functions::NA(); - } elseif ($yValueCount == 1) { - return Functions::DIV0(); - } - - $bestFitLinear = Trend::calculate(Trend::TREND_LINEAR, $yValues, $xValues); - - return $bestFitLinear->getStdevOfResiduals(); - } - - /** - * TDIST. - * - * Returns the probability of Student's T distribution. - * - * @param float $value Value for the function - * @param float $degrees degrees of freedom - * @param float $tails number of tails (1 or 2) - * - * @return float|string The result, or a string containing an error - */ - public static function TDIST($value, $degrees, $tails) - { - $value = Functions::flattenSingleValue($value); - $degrees = floor(Functions::flattenSingleValue($degrees)); - $tails = floor(Functions::flattenSingleValue($tails)); - - if ((is_numeric($value)) && (is_numeric($degrees)) && (is_numeric($tails))) { - if (($value < 0) || ($degrees < 1) || ($tails < 1) || ($tails > 2)) { - return Functions::NAN(); - } - // tdist, which finds the probability that corresponds to a given value - // of t with k degrees of freedom. This algorithm is translated from a - // pascal function on p81 of "Statistical Computing in Pascal" by D - // Cooke, A H Craven & G M Clark (1985: Edward Arnold (Pubs.) Ltd: - // London). The above Pascal algorithm is itself a translation of the - // fortran algoritm "AS 3" by B E Cooper of the Atlas Computer - // Laboratory as reported in (among other places) "Applied Statistics - // Algorithms", editied by P Griffiths and I D Hill (1985; Ellis - // Horwood Ltd.; W. Sussex, England). - $tterm = $degrees; - $ttheta = atan2($value, sqrt($tterm)); - $tc = cos($ttheta); - $ts = sin($ttheta); - - if (($degrees % 2) == 1) { - $ti = 3; - $tterm = $tc; - } else { - $ti = 2; - $tterm = 1; - } - - $tsum = $tterm; - while ($ti < $degrees) { - $tterm *= $tc * $tc * ($ti - 1) / $ti; - $tsum += $tterm; - $ti += 2; - } - $tsum *= $ts; - if (($degrees % 2) == 1) { - $tsum = Functions::M_2DIVPI * ($tsum + $ttheta); - } - $tValue = 0.5 * (1 + $tsum); - if ($tails == 1) { - return 1 - abs($tValue); - } - - return 1 - abs((1 - $tValue) - $tValue); - } - - return Functions::VALUE(); - } - - /** - * TINV. - * - * Returns the one-tailed probability of the chi-squared distribution. - * - * @param float $probability Probability for the function - * @param float $degrees degrees of freedom - * - * @return float|string The result, or a string containing an error - */ - public static function TINV($probability, $degrees) - { - $probability = Functions::flattenSingleValue($probability); - $degrees = floor(Functions::flattenSingleValue($degrees)); - - if ((is_numeric($probability)) && (is_numeric($degrees))) { - $xLo = 100; - $xHi = 0; - - $x = $xNew = 1; - $dx = 1; - $i = 0; - - while ((abs($dx) > Functions::PRECISION) && ($i++ < self::MAX_ITERATIONS)) { - // Apply Newton-Raphson step - $result = self::TDIST($x, $degrees, 2); - $error = $result - $probability; - if ($error == 0.0) { - $dx = 0; - } elseif ($error < 0.0) { - $xLo = $x; - } else { - $xHi = $x; - } - // Avoid division by zero - if ($result != 0.0) { - $dx = $error / $result; - $xNew = $x - $dx; - } - // If the NR fails to converge (which for example may be the - // case if the initial guess is too rough) we apply a bisection - // step to determine a more narrow interval around the root. - if (($xNew < $xLo) || ($xNew > $xHi) || ($result == 0.0)) { - $xNew = ($xLo + $xHi) / 2; - $dx = $xNew - $x; - } - $x = $xNew; - } - if ($i == self::MAX_ITERATIONS) { - return Functions::NA(); - } - - return round($x, 12); - } - - return Functions::VALUE(); - } - - /** - * TREND. - * - * Returns values along a linear Trend - * - * @param mixed[] $yValues Data Series Y - * @param mixed[] $xValues Data Series X - * @param mixed[] $newValues Values of X for which we want to find Y - * @param bool $const a logical value specifying whether to force the intersect to equal 0 - * - * @return array of float - */ - public static function TREND($yValues, $xValues = [], $newValues = [], $const = true) - { - $yValues = Functions::flattenArray($yValues); - $xValues = Functions::flattenArray($xValues); - $newValues = Functions::flattenArray($newValues); - $const = ($const === null) ? true : (bool) Functions::flattenSingleValue($const); - - $bestFitLinear = Trend::calculate(Trend::TREND_LINEAR, $yValues, $xValues, $const); - if (empty($newValues)) { - $newValues = $bestFitLinear->getXValues(); - } - - $returnArray = []; - foreach ($newValues as $xValue) { - $returnArray[0][] = $bestFitLinear->getValueOfYForX($xValue); - } - - return $returnArray; - } - - /** - * TRIMMEAN. - * - * Returns the mean of the interior of a data set. TRIMMEAN calculates the mean - * taken by excluding a percentage of data points from the top and bottom tails - * of a data set. - * - * Excel Function: - * TRIMEAN(value1[,value2[, ...]], $discard) - * - * @param mixed $args Data values - * - * @return float|string - */ - public static function TRIMMEAN(...$args) - { - $aArgs = Functions::flattenArray($args); - - // Calculate - $percent = array_pop($aArgs); - - if ((is_numeric($percent)) && (!is_string($percent))) { - if (($percent < 0) || ($percent > 1)) { - return Functions::NAN(); - } - $mArgs = []; - foreach ($aArgs as $arg) { - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $mArgs[] = $arg; - } - } - $discard = floor(self::COUNT($mArgs) * $percent / 2); - sort($mArgs); - for ($i = 0; $i < $discard; ++$i) { - array_pop($mArgs); - array_shift($mArgs); - } - - return self::AVERAGE($mArgs); - } - - return Functions::VALUE(); - } - - /** - * VARFunc. - * - * Estimates variance based on a sample. - * - * Excel Function: - * VAR(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string (string if result is an error) - */ - public static function VARFunc(...$args) - { - $returnValue = Functions::DIV0(); - - $summerA = $summerB = 0; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - $aCount = 0; - foreach ($aArgs as $arg) { - if (is_bool($arg)) { - $arg = (int) $arg; - } - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $summerA += ($arg * $arg); - $summerB += $arg; - ++$aCount; - } - } - - if ($aCount > 1) { - $summerA *= $aCount; - $summerB *= $summerB; - $returnValue = ($summerA - $summerB) / ($aCount * ($aCount - 1)); - } - - return $returnValue; - } - - /** - * VARA. - * - * Estimates variance based on a sample, including numbers, text, and logical values - * - * Excel Function: - * VARA(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string (string if result is an error) - */ - public static function VARA(...$args) - { - $returnValue = Functions::DIV0(); - - $summerA = $summerB = 0; - - // Loop through arguments - $aArgs = Functions::flattenArrayIndexed($args); - $aCount = 0; - foreach ($aArgs as $k => $arg) { - if ( - (is_string($arg)) && - (Functions::isValue($k)) - ) { - return Functions::VALUE(); - } elseif ( - (is_string($arg)) && - (!Functions::isMatrixValue($k)) - ) { - } else { - // Is it a numeric value? - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { - if (is_bool($arg)) { - $arg = (int) $arg; - } elseif (is_string($arg)) { - $arg = 0; - } - $summerA += ($arg * $arg); - $summerB += $arg; - ++$aCount; - } - } - } - - if ($aCount > 1) { - $summerA *= $aCount; - $summerB *= $summerB; - $returnValue = ($summerA - $summerB) / ($aCount * ($aCount - 1)); - } - - return $returnValue; - } - - /** - * VARP. - * - * Calculates variance based on the entire population - * - * Excel Function: - * VARP(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string (string if result is an error) - */ - public static function VARP(...$args) - { - // Return value - $returnValue = Functions::DIV0(); - - $summerA = $summerB = 0; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - $aCount = 0; - foreach ($aArgs as $arg) { - if (is_bool($arg)) { - $arg = (int) $arg; - } - // Is it a numeric value? - if ((is_numeric($arg)) && (!is_string($arg))) { - $summerA += ($arg * $arg); - $summerB += $arg; - ++$aCount; - } - } - - if ($aCount > 0) { - $summerA *= $aCount; - $summerB *= $summerB; - $returnValue = ($summerA - $summerB) / ($aCount * $aCount); - } - - return $returnValue; - } - - /** - * VARPA. - * - * Calculates variance based on the entire population, including numbers, text, and logical values - * - * Excel Function: - * VARPA(value1[,value2[, ...]]) - * - * @param mixed ...$args Data values - * - * @return float|string (string if result is an error) - */ - public static function VARPA(...$args) - { - $returnValue = Functions::DIV0(); - - $summerA = $summerB = 0; - - // Loop through arguments - $aArgs = Functions::flattenArrayIndexed($args); - $aCount = 0; - foreach ($aArgs as $k => $arg) { - if ( - (is_string($arg)) && - (Functions::isValue($k)) - ) { - return Functions::VALUE(); - } elseif ( - (is_string($arg)) && - (!Functions::isMatrixValue($k)) - ) { - } else { - // Is it a numeric value? - if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { - if (is_bool($arg)) { - $arg = (int) $arg; - } elseif (is_string($arg)) { - $arg = 0; - } - $summerA += ($arg * $arg); - $summerB += $arg; - ++$aCount; - } - } - } - - if ($aCount > 0) { - $summerA *= $aCount; - $summerB *= $summerB; - $returnValue = ($summerA - $summerB) / ($aCount * $aCount); - } - - return $returnValue; - } - - /** - * WEIBULL. - * - * Returns the Weibull distribution. Use this distribution in reliability - * analysis, such as calculating a device's mean time to failure. - * - * @param float $value - * @param float $alpha Alpha Parameter - * @param float $beta Beta Parameter - * @param bool $cumulative - * - * @return float|string (string if result is an error) - */ - public static function WEIBULL($value, $alpha, $beta, $cumulative) - { - $value = Functions::flattenSingleValue($value); - $alpha = Functions::flattenSingleValue($alpha); - $beta = Functions::flattenSingleValue($beta); - - if ((is_numeric($value)) && (is_numeric($alpha)) && (is_numeric($beta))) { - if (($value < 0) || ($alpha <= 0) || ($beta <= 0)) { - return Functions::NAN(); - } - if ((is_numeric($cumulative)) || (is_bool($cumulative))) { - if ($cumulative) { - return 1 - exp(0 - ($value / $beta) ** $alpha); - } - - return ($alpha / $beta ** $alpha) * $value ** ($alpha - 1) * exp(0 - ($value / $beta) ** $alpha); - } - } - - return Functions::VALUE(); - } - - /** - * ZTEST. - * - * Returns the Weibull distribution. Use this distribution in reliability - * analysis, such as calculating a device's mean time to failure. - * - * @param float $dataSet - * @param float $m0 Alpha Parameter - * @param float $sigma Beta Parameter - * - * @return float|string (string if result is an error) - */ - public static function ZTEST($dataSet, $m0, $sigma = null) - { - $dataSet = Functions::flattenArrayIndexed($dataSet); - $m0 = Functions::flattenSingleValue($m0); - $sigma = Functions::flattenSingleValue($sigma); - - if ($sigma === null) { - $sigma = self::STDEV($dataSet); - } - $n = count($dataSet); - - return 1 - self::NORMSDIST((self::AVERAGE($dataSet) - $m0) / ($sigma / sqrt($n))); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php deleted file mode 100644 index da95883..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php +++ /dev/null @@ -1,675 +0,0 @@ - 1) { - $character = mb_substr($characters, 0, 1, 'UTF-8'); - } - - return self::unicodeToOrd($character); - } - - /** - * CONCATENATE. - * - * @return string - */ - public static function CONCATENATE(...$args) - { - $returnValue = ''; - - // Loop through arguments - $aArgs = Functions::flattenArray($args); - foreach ($aArgs as $arg) { - if (is_bool($arg)) { - $arg = self::convertBooleanValue($arg); - } - $returnValue .= $arg; - } - - return $returnValue; - } - - /** - * DOLLAR. - * - * This function converts a number to text using currency format, with the decimals rounded to the specified place. - * The format used is $#,##0.00_);($#,##0.00).. - * - * @param float $value The value to format - * @param int $decimals The number of digits to display to the right of the decimal point. - * If decimals is negative, number is rounded to the left of the decimal point. - * If you omit decimals, it is assumed to be 2 - * - * @return string - */ - public static function DOLLAR($value = 0, $decimals = 2) - { - $value = Functions::flattenSingleValue($value); - $decimals = $decimals === null ? 0 : Functions::flattenSingleValue($decimals); - - // Validate parameters - if (!is_numeric($value) || !is_numeric($decimals)) { - return Functions::NAN(); - } - $decimals = floor($decimals); - - $mask = '$#,##0'; - if ($decimals > 0) { - $mask .= '.' . str_repeat('0', $decimals); - } else { - $round = 10 ** abs($decimals); - if ($value < 0) { - $round = 0 - $round; - } - $value = MathTrig::MROUND($value, $round); - } - - return NumberFormat::toFormattedString($value, $mask); - } - - /** - * SEARCHSENSITIVE. - * - * @param string $needle The string to look for - * @param string $haystack The string in which to look - * @param int $offset Offset within $haystack - * - * @return string - */ - public static function SEARCHSENSITIVE($needle, $haystack, $offset = 1) - { - $needle = Functions::flattenSingleValue($needle); - $haystack = Functions::flattenSingleValue($haystack); - $offset = Functions::flattenSingleValue($offset); - - if (!is_bool($needle)) { - if (is_bool($haystack)) { - $haystack = ($haystack) ? Calculation::getTRUE() : Calculation::getFALSE(); - } - - if (($offset > 0) && (StringHelper::countCharacters($haystack) > $offset)) { - if (StringHelper::countCharacters($needle) === 0) { - return $offset; - } - - $pos = mb_strpos($haystack, $needle, --$offset, 'UTF-8'); - if ($pos !== false) { - return ++$pos; - } - } - } - - return Functions::VALUE(); - } - - /** - * SEARCHINSENSITIVE. - * - * @param string $needle The string to look for - * @param string $haystack The string in which to look - * @param int $offset Offset within $haystack - * - * @return string - */ - public static function SEARCHINSENSITIVE($needle, $haystack, $offset = 1) - { - $needle = Functions::flattenSingleValue($needle); - $haystack = Functions::flattenSingleValue($haystack); - $offset = Functions::flattenSingleValue($offset); - - if (!is_bool($needle)) { - if (is_bool($haystack)) { - $haystack = ($haystack) ? Calculation::getTRUE() : Calculation::getFALSE(); - } - - if (($offset > 0) && (StringHelper::countCharacters($haystack) > $offset)) { - if (StringHelper::countCharacters($needle) === 0) { - return $offset; - } - - $pos = mb_stripos($haystack, $needle, --$offset, 'UTF-8'); - if ($pos !== false) { - return ++$pos; - } - } - } - - return Functions::VALUE(); - } - - /** - * FIXEDFORMAT. - * - * @param mixed $value Value to check - * @param int $decimals - * @param bool $no_commas - * - * @return string - */ - public static function FIXEDFORMAT($value, $decimals = 2, $no_commas = false) - { - $value = Functions::flattenSingleValue($value); - $decimals = Functions::flattenSingleValue($decimals); - $no_commas = Functions::flattenSingleValue($no_commas); - - // Validate parameters - if (!is_numeric($value) || !is_numeric($decimals)) { - return Functions::NAN(); - } - $decimals = (int) floor($decimals); - - $valueResult = round($value, $decimals); - if ($decimals < 0) { - $decimals = 0; - } - if (!$no_commas) { - $valueResult = number_format( - $valueResult, - $decimals, - StringHelper::getDecimalSeparator(), - StringHelper::getThousandsSeparator() - ); - } - - return (string) $valueResult; - } - - /** - * LEFT. - * - * @param string $value Value - * @param int $chars Number of characters - * - * @return string - */ - public static function LEFT($value = '', $chars = 1) - { - $value = Functions::flattenSingleValue($value); - $chars = Functions::flattenSingleValue($chars); - - if ($chars < 0) { - return Functions::VALUE(); - } - - if (is_bool($value)) { - $value = ($value) ? Calculation::getTRUE() : Calculation::getFALSE(); - } - - return mb_substr($value, 0, $chars, 'UTF-8'); - } - - /** - * MID. - * - * @param string $value Value - * @param int $start Start character - * @param int $chars Number of characters - * - * @return string - */ - public static function MID($value = '', $start = 1, $chars = null) - { - $value = Functions::flattenSingleValue($value); - $start = Functions::flattenSingleValue($start); - $chars = Functions::flattenSingleValue($chars); - - if (($start < 1) || ($chars < 0)) { - return Functions::VALUE(); - } - - if (is_bool($value)) { - $value = ($value) ? Calculation::getTRUE() : Calculation::getFALSE(); - } - - if (empty($chars)) { - return ''; - } - - return mb_substr($value, --$start, $chars, 'UTF-8'); - } - - /** - * RIGHT. - * - * @param string $value Value - * @param int $chars Number of characters - * - * @return string - */ - public static function RIGHT($value = '', $chars = 1) - { - $value = Functions::flattenSingleValue($value); - $chars = Functions::flattenSingleValue($chars); - - if ($chars < 0) { - return Functions::VALUE(); - } - - if (is_bool($value)) { - $value = ($value) ? Calculation::getTRUE() : Calculation::getFALSE(); - } - - return mb_substr($value, mb_strlen($value, 'UTF-8') - $chars, $chars, 'UTF-8'); - } - - /** - * STRINGLENGTH. - * - * @param string $value Value - * - * @return int - */ - public static function STRINGLENGTH($value = '') - { - $value = Functions::flattenSingleValue($value); - - if (is_bool($value)) { - $value = ($value) ? Calculation::getTRUE() : Calculation::getFALSE(); - } - - return mb_strlen($value, 'UTF-8'); - } - - /** - * LOWERCASE. - * - * Converts a string value to upper case. - * - * @param string $mixedCaseString - * - * @return string - */ - public static function LOWERCASE($mixedCaseString) - { - $mixedCaseString = Functions::flattenSingleValue($mixedCaseString); - - if (is_bool($mixedCaseString)) { - $mixedCaseString = ($mixedCaseString) ? Calculation::getTRUE() : Calculation::getFALSE(); - } - - return StringHelper::strToLower($mixedCaseString); - } - - /** - * UPPERCASE. - * - * Converts a string value to upper case. - * - * @param string $mixedCaseString - * - * @return string - */ - public static function UPPERCASE($mixedCaseString) - { - $mixedCaseString = Functions::flattenSingleValue($mixedCaseString); - - if (is_bool($mixedCaseString)) { - $mixedCaseString = ($mixedCaseString) ? Calculation::getTRUE() : Calculation::getFALSE(); - } - - return StringHelper::strToUpper($mixedCaseString); - } - - /** - * PROPERCASE. - * - * Converts a string value to upper case. - * - * @param string $mixedCaseString - * - * @return string - */ - public static function PROPERCASE($mixedCaseString) - { - $mixedCaseString = Functions::flattenSingleValue($mixedCaseString); - - if (is_bool($mixedCaseString)) { - $mixedCaseString = ($mixedCaseString) ? Calculation::getTRUE() : Calculation::getFALSE(); - } - - return StringHelper::strToTitle($mixedCaseString); - } - - /** - * REPLACE. - * - * @param string $oldText String to modify - * @param int $start Start character - * @param int $chars Number of characters - * @param string $newText String to replace in defined position - * - * @return string - */ - public static function REPLACE($oldText, $start, $chars, $newText) - { - $oldText = Functions::flattenSingleValue($oldText); - $start = Functions::flattenSingleValue($start); - $chars = Functions::flattenSingleValue($chars); - $newText = Functions::flattenSingleValue($newText); - - $left = self::LEFT($oldText, $start - 1); - $right = self::RIGHT($oldText, self::STRINGLENGTH($oldText) - ($start + $chars) + 1); - - return $left . $newText . $right; - } - - /** - * SUBSTITUTE. - * - * @param string $text Value - * @param string $fromText From Value - * @param string $toText To Value - * @param int $instance Instance Number - * - * @return string - */ - public static function SUBSTITUTE($text = '', $fromText = '', $toText = '', $instance = 0) - { - $text = Functions::flattenSingleValue($text); - $fromText = Functions::flattenSingleValue($fromText); - $toText = Functions::flattenSingleValue($toText); - $instance = floor(Functions::flattenSingleValue($instance)); - - if ($instance == 0) { - return str_replace($fromText, $toText, $text); - } - - $pos = -1; - while ($instance > 0) { - $pos = mb_strpos($text, $fromText, $pos + 1, 'UTF-8'); - if ($pos === false) { - break; - } - --$instance; - } - - if ($pos !== false) { - return self::REPLACE($text, ++$pos, mb_strlen($fromText, 'UTF-8'), $toText); - } - - return $text; - } - - /** - * RETURNSTRING. - * - * @param mixed $testValue Value to check - * - * @return null|string - */ - public static function RETURNSTRING($testValue = '') - { - $testValue = Functions::flattenSingleValue($testValue); - - if (is_string($testValue)) { - return $testValue; - } - - return null; - } - - /** - * TEXTFORMAT. - * - * @param mixed $value Value to check - * @param string $format Format mask to use - * - * @return string - */ - public static function TEXTFORMAT($value, $format) - { - $value = Functions::flattenSingleValue($value); - $format = Functions::flattenSingleValue($format); - - if ((is_string($value)) && (!is_numeric($value)) && Date::isDateTimeFormatCode($format)) { - $value = DateTime::DATEVALUE($value); - } - - return (string) NumberFormat::toFormattedString($value, $format); - } - - /** - * VALUE. - * - * @param mixed $value Value to check - * - * @return DateTimeInterface|float|int|string A string if arguments are invalid - */ - public static function VALUE($value = '') - { - $value = Functions::flattenSingleValue($value); - - if (!is_numeric($value)) { - $numberValue = str_replace( - StringHelper::getThousandsSeparator(), - '', - trim($value, " \t\n\r\0\x0B" . StringHelper::getCurrencyCode()) - ); - if (is_numeric($numberValue)) { - return (float) $numberValue; - } - - $dateSetting = Functions::getReturnDateType(); - Functions::setReturnDateType(Functions::RETURNDATE_EXCEL); - - if (strpos($value, ':') !== false) { - $timeValue = DateTime::TIMEVALUE($value); - if ($timeValue !== Functions::VALUE()) { - Functions::setReturnDateType($dateSetting); - - return $timeValue; - } - } - $dateValue = DateTime::DATEVALUE($value); - if ($dateValue !== Functions::VALUE()) { - Functions::setReturnDateType($dateSetting); - - return $dateValue; - } - Functions::setReturnDateType($dateSetting); - - return Functions::VALUE(); - } - - return (float) $value; - } - - /** - * NUMBERVALUE. - * - * @param mixed $value Value to check - * @param string $decimalSeparator decimal separator, defaults to locale defined value - * @param string $groupSeparator group/thosands separator, defaults to locale defined value - * - * @return float|string - */ - public static function NUMBERVALUE($value = '', $decimalSeparator = null, $groupSeparator = null) - { - $value = Functions::flattenSingleValue($value); - $decimalSeparator = Functions::flattenSingleValue($decimalSeparator); - $groupSeparator = Functions::flattenSingleValue($groupSeparator); - - if (!is_numeric($value)) { - $decimalSeparator = empty($decimalSeparator) ? StringHelper::getDecimalSeparator() : $decimalSeparator; - $groupSeparator = empty($groupSeparator) ? StringHelper::getThousandsSeparator() : $groupSeparator; - - $decimalPositions = preg_match_all('/' . preg_quote($decimalSeparator) . '/', $value, $matches, PREG_OFFSET_CAPTURE); - if ($decimalPositions > 1) { - return Functions::VALUE(); - } - $decimalOffset = array_pop($matches[0])[1]; - if (strpos($value, $groupSeparator, $decimalOffset) !== false) { - return Functions::VALUE(); - } - - $value = str_replace([$groupSeparator, $decimalSeparator], ['', '.'], $value); - - // Handle the special case of trailing % signs - $percentageString = rtrim($value, '%'); - if (!is_numeric($percentageString)) { - return Functions::VALUE(); - } - - $percentageAdjustment = strlen($value) - strlen($percentageString); - if ($percentageAdjustment) { - $value = (float) $percentageString; - $value /= 10 ** ($percentageAdjustment * 2); - } - } - - return (float) $value; - } - - /** - * Compares two text strings and returns TRUE if they are exactly the same, FALSE otherwise. - * EXACT is case-sensitive but ignores formatting differences. - * Use EXACT to test text being entered into a document. - * - * @param $value1 - * @param $value2 - * - * @return bool - */ - public static function EXACT($value1, $value2) - { - $value1 = Functions::flattenSingleValue($value1); - $value2 = Functions::flattenSingleValue($value2); - - return (string) $value2 === (string) $value1; - } - - /** - * TEXTJOIN. - * - * @param mixed $delimiter - * @param mixed $ignoreEmpty - * @param mixed $args - * - * @return string - */ - public static function TEXTJOIN($delimiter, $ignoreEmpty, ...$args) - { - // Loop through arguments - $aArgs = Functions::flattenArray($args); - foreach ($aArgs as $key => &$arg) { - if ($ignoreEmpty && trim($arg) == '') { - unset($aArgs[$key]); - } elseif (is_bool($arg)) { - $arg = self::convertBooleanValue($arg); - } - } - - return implode($delimiter, $aArgs); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Token/Stack.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Token/Stack.php deleted file mode 100644 index 941e1ad..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Token/Stack.php +++ /dev/null @@ -1,149 +0,0 @@ -count; - } - - /** - * Push a new entry onto the stack. - * - * @param mixed $type - * @param mixed $value - * @param mixed $reference - * @param null|string $storeKey will store the result under this alias - * @param null|string $onlyIf will only run computation if the matching - * store key is true - * @param null|string $onlyIfNot will only run computation if the matching - * store key is false - */ - public function push( - $type, - $value, - $reference = null, - $storeKey = null, - $onlyIf = null, - $onlyIfNot = null - ): void { - $stackItem = $this->getStackItem($type, $value, $reference, $storeKey, $onlyIf, $onlyIfNot); - - $this->stack[$this->count++] = $stackItem; - - if ($type == 'Function') { - $localeFunction = Calculation::localeFunc($value); - if ($localeFunction != $value) { - $this->stack[($this->count - 1)]['localeValue'] = $localeFunction; - } - } - } - - public function getStackItem( - $type, - $value, - $reference = null, - $storeKey = null, - $onlyIf = null, - $onlyIfNot = null - ) { - $stackItem = [ - 'type' => $type, - 'value' => $value, - 'reference' => $reference, - ]; - - if (isset($storeKey)) { - $stackItem['storeKey'] = $storeKey; - } - - if (isset($onlyIf)) { - $stackItem['onlyIf'] = $onlyIf; - } - - if (isset($onlyIfNot)) { - $stackItem['onlyIfNot'] = $onlyIfNot; - } - - return $stackItem; - } - - /** - * Pop the last entry from the stack. - * - * @return mixed - */ - public function pop() - { - if ($this->count > 0) { - return $this->stack[--$this->count]; - } - - return null; - } - - /** - * Return an entry from the stack without removing it. - * - * @param int $n number indicating how far back in the stack we want to look - * - * @return mixed - */ - public function last($n = 1) - { - if ($this->count - $n < 0) { - return null; - } - - return $this->stack[$this->count - $n]; - } - - /** - * Clear the stack. - */ - public function clear(): void - { - $this->stack = []; - $this->count = 0; - } - - public function __toString() - { - $str = 'Stack: '; - foreach ($this->stack as $index => $item) { - if ($index > $this->count - 1) { - break; - } - $value = $item['value'] ?? 'no value'; - while (is_array($value)) { - $value = array_pop($value); - } - $str .= $value . ' |> '; - } - - return $str; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Web.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Web.php deleted file mode 100644 index 5cfd2ea..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Web.php +++ /dev/null @@ -1,53 +0,0 @@ - 2048) { - return Functions::VALUE(); // Invalid URL length - } - - if (!preg_match('/^http[s]?:\/\//', $url)) { - return Functions::VALUE(); // Invalid protocol - } - - // Get results from the the webservice - $client = Settings::getHttpClient(); - $requestFactory = Settings::getRequestFactory(); - $request = $requestFactory->createRequest('GET', $url); - - try { - $response = $client->sendRequest($request); - } catch (ClientExceptionInterface $e) { - return Functions::VALUE(); // cURL error - } - - if ($response->getStatusCode() != 200) { - return Functions::VALUE(); // cURL error - } - - $output = $response->getBody()->getContents(); - if (strlen($output) > 32767) { - return Functions::VALUE(); // Output not a string or too long - } - - return $output; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/functionlist.txt b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/functionlist.txt deleted file mode 100644 index e71d18f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/functionlist.txt +++ /dev/null @@ -1,395 +0,0 @@ -ABS -ACCRINT -ACCRINTM -ACOS -ACOSH -ACOT -ACOTH -ADDRESS -AMORDEGRC -AMORLINC -AND -ARABIC -AREAS -ASC -ASIN -ASINH -ATAN -ATAN2 -ATANH -AVEDEV -AVERAGE -AVERAGEA -AVERAGEIF -AVERAGEIFS -BAHTTEXT -BASE -BESSELI -BESSELJ -BESSELK -BESSELY -BETADIST -BETAINV -BIN2DEC -BIN2HEX -BIN2OCT -BINOMDIST -BITAND -BITLSHIFT -BITOR -BITRSHIFT -BITXOR -CEILING -CELL -CHAR -CHIDIST -CHIINV -CHITEST -CHOOSE -CLEAN -CODE -COLUMN -COLUMNS -COMBIN -COMPLEX -CONCAT -CONCATENATE -CONFIDENCE -CONVERT -CORREL -COS -COSH -COT -COTH -COUNT -COUNTA -COUNTBLANK -COUNTIF -COUNTIFS -COUPDAYBS -COUPDAYBS -COUPDAYSNC -COUPNCD -COUPNUM -COUPPCD -COVAR -CRITBINOM -CSC -CSCH -CUBEKPIMEMBER -CUBEMEMBER -CUBEMEMBERPROPERTY -CUBERANKEDMEMBER -CUBESET -CUBESETCOUNT -CUBEVALUE -CUMIPMT -CUMPRINC -DATE -DATEDIF -DATEVALUE -DAVERAGE -DAY -DAYS -DAYS360 -DB -DCOUNT -DCOUNTA -DDB -DEC2BIN -DEC2HEX -DEC2OCT -DEGREES -DELTA -DEVSQ -DGET -DISC -DMAX -DMIN -DOLLAR -DOLLARDE -DOLLARFR -DPRODUCT -DSTDEV -DSTDEVP -DSUM -DURATION -DVAR -DVARP -EDATE -EFFECT -EOMONTH -ERF -ERF.PRECISE -ERFC -ERFC.PRECISE -ERROR.TYPE -EVEN -EXACT -EXP -EXPONDIST -FACT -FACTDOUBLE -FALSE -FDIST -FIND -FINDB -FINV -FISHER -FISHERINV -FIXED -FLOOR -FLOOR.MATH -FLOOR.PRECISE -FORECAST -FREQUENCY -FTEST -FV -FVSCHEDULE -GAMAMDIST -GAMMAINV -GAMMALN -GCD -GEOMEAN -GESTEP -GETPIVOTDATA -GROWTH -HARMEAN -HEX2BIN -HEX2OCT -HLOOKUP -HOUR -HYPERLINK -HYPGEOMDIST -IF -IFERROR -IFS -IMABS -IMAGINARY -IMARGUMENT -IMCONJUGATE -IMCOS -IMCOSH -IMCOT -IMCSC -IMCSCH -IMEXP -IMLN -IMLOG10 -IMLOG2 -IMPOWER -IMPRODUCT -IMREAL -IMSEC -IMSECH -IMSIN -IMSINH -IMSQRT -IMSUB -IMSUM -IMTAN -INDEX -INDIRECT -INFO -INT -INTERCEPT -INTRATE -IPMT -IRR -ISBLANK -ISERR -ISERROR -ISEVEN -ISLOGICAL -ISNA -ISNONTEXT -ISNUMBER -ISODD -ISOWEEKNUM -ISPMT -ISREF -ISTEXT -JIS -KURT -LARGE -LCM -LEFT -LEFTB -LEN -LENB -LINEST -LN -LOG -LOG10 -LOGEST -LOGINV -LOGNORMDIST -LOOKUP -LOWER -MATCH -MAX -MAXA -MAXIFS -MDETERM -MDURATION -MEDIAN -MID -MIDB -MIN -MINA -MINIFS -MINUTE -MINVERSE -MIRR -MMULT -MOD -MODE -MONTH -MROUND -MULTINOMIAL -N -NA -NEGBINOMDIST -NETWORKDAYS -NOMINAL -NORMDIST -NORMINV -NORMSDIST -NORMSINV -NOT -NOW -NPER -NPV -NUMBERVALUE -OCT2BIN -OCT2DEC -OCT2HEX -ODD -ODDFPRICE -ODDFYIELD -ODDLPRICE -ODDLYIELD -OFFSET -OR -PDURATION -PEARSON -PERCENTILE -PERCENTRANK -PERMUT -PHONETIC -PI -PMT -POISSON -POWER -PPMT -PRICE -PRICEDISC -PRICEMAT -PROB -PRODUCT -PROPER -PV -QUARTILE -QUOTIENT -RADIANS -RAND -RANDBETWEEN -RANK -RATE -RECEIVED -REPLACE -REPLACEB -REPT -RIGHT -RIGHTB -ROMAN -ROUND -ROUNDDOWN -ROUNDUP -ROW -ROWS -RRI -RSQ -RTD -SEARCH -SEARCHB -SEC -SECH -SECOND -SERIESSUM -SHEET -SHEETS -SIGN -SIN -SINH -SKEW -SLN -SLOPE -SMALL -SQRT -SQRTPI -STANDARDIZE -STDEV -STDEV.A -STDEV.P -STDEVA -STDEVP -STDEVPA -STEYX -SUBSTITUTE -SUBTOTAL -SUM -SUMIF -SUMIFS -SUMPRODUCT -SUMSQ -SUMX2MY2 -SUMX2PY2 -SUMXMY2 -SWITCH -SYD -T -TAN -TANH -TBILLEQ -TBILLPRICE -TBILLYIELD -TDIST -TEXT -TEXTJOIN -TIME -TIMEVALUE -TINV -TODAY -TRANSPOSE -TREND -TRIM -TRIMMEAN -TRUE -TRUNC -TTEST -TYPE -UNICHAR -UNIORD -UPPER -USDOLLAR -VALUE -VAR -VARA -VARP -VARPA -VDB -VLOOKUP -WEEKDAY -WEEKNUM -WEIBULL -WORKDAY -XIRR -XNPV -XOR -YEAR -YEARFRAC -YIELD -YIELDDISC -YIELDMAT -ZTEST diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/bg/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/bg/config deleted file mode 100644 index 86f94d3..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/bg/config +++ /dev/null @@ -1,27 +0,0 @@ -## -## PhpSpreadsheet -## -## -## - - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = лв - - -## -## Excel Error Codes (For future use) - -## -NULL = #ŠŸŠ ŠŠ—ŠŠž! -DIV0 = #ДЕЛ/0! -VALUE = #Š”Š¢ŠžŠ™ŠŠžŠ”Š¢! -REF = #РЕФ! -NAME = #Š˜ŠœŠ•? -NUM = #Š§Š˜Š”Š›Šž! -NA = #Š/Š” diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/bg/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/bg/functions deleted file mode 100644 index 4bc1574..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/bg/functions +++ /dev/null @@ -1,417 +0,0 @@ -## -## PhpSpreadsheet -## -## -## Data in this file derived from information provided by web-junior (http://www.web-junior.net/) -## -## - - -## -## Add-in and Automation functions Š¤ŃƒŠ½ŠŗŃ†ŠøŠø наГстроек Šø автоматизации -## -GETPIVOTDATA = ŠŸŠžŠ›Š£Š§Š˜Š¢Š¬.Š”ŠŠŠŠ«Š•.Š”Š’ŠžŠ”ŠŠžŠ™.Š¢ŠŠ‘Š›Š˜Š¦Š« ## Возвращает Ганные, Ń…Ń€Š°Š½ŃŃ‰ŠøŠµŃŃ в отчете своГной таблицы. - - -## -## Cube functions Š¤ŃƒŠ½ŠŗŃ†ŠøŠø Куб -## -CUBEKPIMEMBER = ŠšŠ£Š‘Š­Š›Š•ŠœŠ•ŠŠ¢ŠšŠ˜ŠŸ ## Возвращает свойство ŠŗŠ»ŃŽŃ‡ŠµŠ²Š¾Š³Š¾ инГикатора ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚Šø Ā«(КИП)Ā» Šø отображает ŠøŠ¼Ń «КИП» в ŃŃ‡ŠµŠ¹ŠŗŠµ. «КИП» ŠæŃ€ŠµŠ“ŃŃ‚Š°Š²Š»ŃŠµŃ‚ собой ŠŗŠ¾Š»ŠøŃ‡ŠµŃŃ‚Š²ŠµŠ½Š½ŃƒŃŽ Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ, Ń‚Š°ŠŗŃƒŃŽ как ŠµŠ¶ŠµŠ¼ŠµŃŃŃ‡Š½Š°Ń Š²Š°Š»Š¾Š²Š°Ń ŠæŃ€ŠøŠ±Ń‹Š»ŃŒ или ŠµŠ¶ŠµŠŗŠ²Š°Ń€Ń‚Š°Š»ŃŒŠ½Š°Ń Ń‚ŠµŠŗŃƒŃ‡ŠµŃŃ‚ŃŒ каГров, используемой Š“Š»Ń ŠŗŠ¾Š½Ń‚Ń€Š¾Š»Ń ŃŃ„Ń„ŠµŠŗŃ‚ŠøŠ²Š½Š¾ŃŃ‚Šø работы организации. -CUBEMEMBER = ŠšŠ£Š‘Š­Š›Š•ŠœŠ•ŠŠ¢ ## Возвращает ŃŠ»ŠµŠ¼ŠµŠ½Ń‚ или кортеж ŠøŠ· куба. Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ Š“Š»Ń проверки ŃŃƒŃ‰ŠµŃŃ‚Š²Š¾Š²Š°Š½ŠøŃ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š° или кортежа в кубе. -CUBEMEMBERPROPERTY = ŠšŠ£Š‘Š”Š’ŠžŠ™Š”Š¢Š’ŠžŠ­Š›Š•ŠœŠ•ŠŠ¢Š ## Возвращает значение свойства ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š° ŠøŠ· куба. Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ Š“Š»Ń проверки ŃŃƒŃ‰ŠµŃŃ‚Š²Š¾Š²Š°Š½ŠøŃ имени ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š° в кубе Šø возвращает указанное свойство Š“Š»Ń ŃŃ‚Š¾Š³Š¾ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š°. -CUBERANKEDMEMBER = ŠšŠ£Š‘ŠŸŠžŠ Š­Š›Š•ŠœŠ•ŠŠ¢ ## Возвращает n-ый или ранжированный ŃŠ»ŠµŠ¼ŠµŠ½Ń‚ в множество. Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ Š“Š»Ń Š²Š¾Š·Š²Ń€Š°Ń‰ŠµŠ½ŠøŃ оГного или Š½ŠµŃŠŗŠ¾Š»ŃŒŠŗŠøŃ… ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² в множество, например, Š»ŃƒŃ‡ŃˆŠµŠ³Š¾ проГавца или 10 Š»ŃƒŃ‡ŃˆŠøŃ… ŃŃ‚ŃƒŠ“ŠµŠ½Ń‚Š¾Š². -CUBESET = ŠšŠ£Š‘ŠœŠŠžŠ– ## ŠžŠæŃ€ŠµŠ“ŠµŠ»ŃŠµŃ‚ Š²Ń‹Ń‡ŠøŃŠ»ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾Šµ множество ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² или кортежей, Š¾Ń‚ŠæŃ€Š°Š²Š»ŃŃ на сервер выражение, которое созГает множество, а затем возвращает его в Microsoft Office Excel. -CUBESETCOUNT = ŠšŠ£Š‘Š§Š˜Š”Š›ŠžŠ­Š›ŠœŠŠžŠ– ## Возвращает число ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² множества. -CUBEVALUE = ŠšŠ£Š‘Š—ŠŠŠ§Š•ŠŠ˜Š• ## Возвращает обобщенное значение ŠøŠ· куба. - - -## -## Database functions Š¤ŃƒŠ½ŠŗŃ†ŠøŠø Š“Š»Ń работы с базами Ганных -## -DAVERAGE = Š”Š”Š Š—ŠŠŠ§ ## Возвращает среГнее значение выбранных записей базы Ганных. -DCOUNT = БДЧЁТ ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество числовых ŃŃ‡ŠµŠµŠŗ в базе Ганных. -DCOUNTA = БДЧЁТА ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество Š½ŠµŠæŃƒŃŃ‚ых ŃŃ‡ŠµŠµŠŗ в базе Ганных. -DGET = Š‘Š˜Š—Š’Š›Š•Š§Š¬ ## Š˜Š·Š²Š»ŠµŠŗŠ°ŠµŃ‚ ŠøŠ· базы Ганных оГну запись, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŃƒŃŽ заГанному ŃƒŃŠ»Š¾Š²ŠøŃŽ. -DMAX = Š”ŠœŠŠšŠ” ## Возвращает максимальное значение среГи выГеленных записей базы Ганных. -DMIN = Š”ŠœŠ˜Š ## Возвращает минимальное значение среГи выГеленных записей базы Ганных. -DPRODUCT = Š‘Š”ŠŸŠ ŠžŠ˜Š—Š’Š•Š” ## ŠŸŠµŃ€ŠµŠ¼Š½Š¾Š¶Š°ŠµŃ‚ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ опреГеленного ŠæŠ¾Š»Ń в Š·Š°ŠæŠøŃŃŃ… базы Ганных, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŃ… ŃƒŃŠ»Š¾Š²ŠøŃŽ. -DSTDEV = Š”Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ› ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ станГартное отклонение по выборке Š“Š»Ń выГеленных записей базы Ганных. -DSTDEVP = Š”Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ›ŠŸ ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ станГартное отклонение по Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø Š“Š»Ń выГеленных записей базы Ганных -DSUM = Š‘Š”Š”Š£ŠœŠœ ## Š”ŃƒŠ¼Š¼ŠøŃ€ŃƒŠµŃ‚ числа в поле Š“Š»Ń записей базы Ганных, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŃ… ŃƒŃŠ»Š¾Š²ŠøŃŽ. -DVAR = Š‘Š”Š”Š˜Š”ŠŸ ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ по выборке ŠøŠ· выГеленных записей базы Ганных -DVARP = Š‘Š”Š”Š˜Š”ŠŸŠŸ ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ по Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø Š“Š»Ń выГеленных записей базы Ганных - - -## -## Date and time functions Š¤ŃƒŠ½ŠŗŃ†ŠøŠø Гаты Šø времени -## -DATE = ДАТА ## Возвращает Š·Š°Š“Š°Š½Š½ŃƒŃŽ Š“Š°Ń‚Ńƒ в числовом формате. -DATEVALUE = Š”ŠŠ¢ŠŠ—ŠŠŠ§ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ ŠøŠ· текстового формата в числовой формат. -DAY = Š”Š•ŠŠ¬ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в Гень Š¼ŠµŃŃŃ†Š°. -DAYS360 = Š”ŠŠ•Š™360 ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ количество Гней межГу Š“Š²ŃƒŠ¼Ń Гатами на основе 360-Гневного гоГа. -EDATE = Š”ŠŠ¢ŠŠœŠ•Š” ## Возвращает Š“Š°Ń‚Ńƒ в числовом формате, Š¾Ń‚ŃŃ‚Š¾ŃŃ‰ŃƒŃŽ на заГанное число Š¼ŠµŃŃŃ†ŠµŠ² впереГ или назаГ от Š½Š°Ń‡Š°Š»ŃŒŠ½Š¾Š¹ Гаты. -EOMONTH = ŠšŠžŠŠœŠ•Š”ŠÆŠ¦Š ## Возвращает Š“Š°Ń‚Ńƒ в числовом формате Š“Š»Ń послеГнего Š“Š½Ń Š¼ŠµŃŃŃ†Š°, Š¾Ń‚ŃŃ‚Š¾ŃŃ‰ŠµŠ³Š¾ впереГ или назаГ на заГанное число Š¼ŠµŃŃŃ†ŠµŠ². -HOUR = ЧАД ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в часы. -MINUTE = ŠœŠ˜ŠŠ£Š¢Š« ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в Š¼ŠøŠ½ŃƒŃ‚Ń‹. -MONTH = ŠœŠ•Š”ŠÆŠ¦ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в Š¼ŠµŃŃŃ†Ń‹. -NETWORKDAYS = Š§Š˜Š”Š¢Š ŠŠ‘Š”ŠŠ˜ ## Возвращает количество рабочих Гней межГу Š“Š²ŃƒŠ¼Ń Гатами. -NOW = ТДАТА ## Возвращает Ń‚ŠµŠŗŃƒŃ‰ŃƒŃŽ Š“Š°Ń‚Ńƒ Šø Š²Ń€ŠµŠ¼Ń в числовом формате. -SECOND = Š”Š•ŠšŠ£ŠŠ”Š« ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в ŃŠµŠŗŃƒŠ½Š“Ń‹. -TIME = Š’Š Š•ŠœŠÆ ## Возвращает заГанное Š²Ń€ŠµŠ¼Ń в числовом формате. -TIMEVALUE = Š’Š Š•ŠœŠ—ŠŠŠ§ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š²Ń€ŠµŠ¼Ń ŠøŠ· текстового формата в числовой формат. -TODAY = Š”Š•Š“ŠžŠ”ŠŠÆ ## Возвращает Ń‚ŠµŠŗŃƒŃ‰ŃƒŃŽ Š“Š°Ń‚Ńƒ в числовом формате. -WEEKDAY = Š”Š•ŠŠ¬ŠŠ•Š” ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в Гень неГели. -WEEKNUM = ŠŠžŠœŠŠ•Š”Š•Š›Š˜ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ числовое преГставление в число, которое ŃƒŠŗŠ°Š·Ń‹Š²Š°ŠµŃ‚, на ŠŗŠ°ŠŗŃƒŃŽ Š½ŠµŠ“ŠµŠ»ŃŽ гоГа ŠæŃ€ŠøŃ…Š¾Š“ŠøŃ‚ŃŃ ŃƒŠŗŠ°Š·Š°Š½Š½Š°Ń Гата. -WORKDAY = Š ŠŠ‘Š”Š•ŠŠ¬ ## Возвращает Š“Š°Ń‚Ńƒ в числовом формате, Š¾Ń‚ŃŃ‚Š¾ŃŃ‰ŃƒŃŽ впереГ или назаГ на заГанное количество рабочих Гней. -YEAR = Š“ŠžŠ” ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в гоГ. -YEARFRAC = Š”ŠžŠ›ŠÆŠ“ŠžŠ”Š ## Возвращает Š“Š¾Š»ŃŽ гоГа, ŠŗŠ¾Ń‚Š¾Ń€ŃƒŃŽ ŃŠ¾ŃŃ‚Š°Š²Š»ŃŠµŃ‚ количество Гней межГу Š½Š°Ń‡Š°Š»ŃŒŠ½Š¾Š¹ Šø конечной Гатами. - - -## -## Engineering functions Š˜Š½Š¶ŠµŠ½ŠµŃ€Š½Ń‹Šµ Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -BESSELI = БЕДДЕЛЬ.I ## Возвращает Š¼Š¾Š“ŠøŃ„ŠøŃ†ŠøŃ€Š¾Š²Š°Š½Š½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Š‘ŠµŃŃŠµŠ»Ń In(x). -BESSELJ = БЕДДЕЛЬ.J ## Возвращает Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Š‘ŠµŃŃŠµŠ»Ń Jn(x). -BESSELK = БЕДДЕЛЬ.K ## Возвращает Š¼Š¾Š“ŠøŃ„ŠøŃ†ŠøŃ€Š¾Š²Š°Š½Š½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Š‘ŠµŃŃŠµŠ»Ń Kn(x). -BESSELY = БЕДДЕЛЬ.Y ## Возвращает Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Š‘ŠµŃŃŠµŠ»Ń Yn(x). -BIN2DEC = ДВ.Š’.ДЕД ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Гвоичное число в Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ. -BIN2HEX = ДВ.Š’.ŠØŠ•Š”Š¢Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Гвоичное число в ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ. -BIN2OCT = ДВ.Š’.Š’ŠžŠ”Š¬Šœ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Гвоичное число в Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ. -COMPLEX = ŠšŠžŠœŠŸŠ›Š•ŠšŠ”Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚Ń‹ при вещественной Šø мнимой Ń‡Š°ŃŃ‚ŃŃ… комплексного числа в комплексное число. -CONVERT = ŠŸŠ Š•ŠžŠ‘Š  ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ число ŠøŠ· оГной системы еГиниц ŠøŠ·Š¼ŠµŃ€ŠµŠ½ŠøŃ в Š“Ń€ŃƒŠ³ŃƒŃŽ. -DEC2BIN = ДЕД.Š’.ДВ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ число в Гвоичное. -DEC2HEX = ДЕД.Š’.ŠØŠ•Š”Š¢Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ число в ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ. -DEC2OCT = ДЕД.Š’.Š’ŠžŠ”Š¬Šœ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ число в Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ. -DELTA = ДЕЛЬТА ## ŠŸŃ€Š¾Š²ŠµŃ€ŃŠµŃ‚ равенство Š“Š²ŃƒŃ… значений. -ERF = Š¤ŠžŠØ ## Возвращает Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ ошибки. -ERFC = Š”Š¤ŠžŠØ ## Возвращает Š“Š¾ŠæŠ¾Š»Š½ŠøŃ‚ŠµŠ»ŃŒŠ½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ ошибки. -GESTEP = ŠŸŠžŠ ŠžŠ“ ## ŠŸŃ€Š¾Š²ŠµŃ€ŃŠµŃ‚, не ŠæŃ€ŠµŠ²Ń‹ŃˆŠ°ŠµŃ‚ ли Ганное число порогового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -HEX2BIN = ŠØŠ•Š”Š¢Š.Š’.ДВ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в Гвоичное. -HEX2DEC = ŠØŠ•Š”Š¢Š.Š’.ДЕД ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ. -HEX2OCT = ŠØŠ•Š”Š¢Š.Š’.Š’ŠžŠ”Š¬Šœ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ. -IMABS = ŠœŠŠ˜Šœ.ABS ## Возвращает Š°Š±ŃŠ¾Š»ŃŽŃ‚Š½ŃƒŃŽ Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ (моГуль) комплексного числа. -IMAGINARY = ŠœŠŠ˜Šœ.ЧАДТЬ ## Возвращает ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ при мнимой части комплексного числа. -IMARGUMENT = ŠœŠŠ˜Šœ.ŠŠ Š“Š£ŠœŠ•ŠŠ¢ ## Возвращает значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а комплексного числа (тета) — угол, выраженный в раГианах. -IMCONJUGATE = ŠœŠŠ˜Šœ.Š”ŠžŠŸŠ ŠÆŠ– ## Возвращает комплексно-ŃŠ¾ŠæŃ€ŃŠ¶ŠµŠ½Š½Š¾Šµ комплексное число. -IMCOS = ŠœŠŠ˜Šœ.COS ## Возвращает косинус комплексного числа. -IMDIV = ŠœŠŠ˜Šœ.ДЕЛ ## Возвращает частное от Š“ŠµŠ»ŠµŠ½ŠøŃ Š“Š²ŃƒŃ… комплексных чисел. -IMEXP = ŠœŠŠ˜Šœ.EXP ## Возвращает ŃŠŗŃŠæŠ¾Š½ŠµŠ½Ń‚Ńƒ комплексного числа. -IMLN = ŠœŠŠ˜Šœ.LN ## Возвращает Š½Š°Ń‚ŃƒŃ€Š°Š»ŃŒŠ½Ń‹Š¹ логарифм комплексного числа. -IMLOG10 = ŠœŠŠ˜Šœ.LOG10 ## Возвращает обычный (Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Š¹) логарифм комплексного числа. -IMLOG2 = ŠœŠŠ˜Šœ.LOG2 ## Возвращает Гвоичный логарифм комплексного числа. -IMPOWER = ŠœŠŠ˜Šœ.Š”Š¢Š•ŠŸŠ•ŠŠ¬ ## Возвращает комплексное число, возвеГенное в Ń†ŠµŠ»ŃƒŃŽ ŃŃ‚ŠµŠæŠµŠ½ŃŒ. -IMPRODUCT = ŠœŠŠ˜Šœ.ŠŸŠ ŠžŠ˜Š—Š’Š•Š” ## Возвращает произвеГение от 2 Го 29 комплексных чисел. -IMREAL = ŠœŠŠ˜Šœ.ВЕЩ ## Возвращает ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ при вещественной части комплексного числа. -IMSIN = ŠœŠŠ˜Šœ.SIN ## Возвращает синус комплексного числа. -IMSQRT = ŠœŠŠ˜Šœ.ŠšŠžŠ Š•ŠŠ¬ ## Возвращает значение кваГратного ŠŗŠ¾Ń€Š½Ń ŠøŠ· комплексного числа. -IMSUB = ŠœŠŠ˜Šœ.Š ŠŠ—Š ## Возвращает Ń€Š°Š·Š½Š¾ŃŃ‚ŃŒ Š“Š²ŃƒŃ… комплексных чисел. -IMSUM = ŠœŠŠ˜Šœ.ДУММ ## Возвращает сумму комплексных чисел. -OCT2BIN = Š’ŠžŠ”Š¬Šœ.Š’.ДВ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в Гвоичное. -OCT2DEC = Š’ŠžŠ”Š¬Šœ.Š’.ДЕД ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ. -OCT2HEX = Š’ŠžŠ”Š¬Šœ.Š’.ŠØŠ•Š”Š¢Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ. - - -## -## Financial functions Финансовые Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -ACCRINT = ŠŠŠšŠžŠŸŠ”ŠžŠ„ŠžŠ” ## Возвращает накопленный процент по ценным бумагам с периоГической выплатой процентов. -ACCRINTM = ŠŠŠšŠžŠŸŠ”ŠžŠ„ŠžŠ”ŠŸŠžŠ“ŠŠØ ## Возвращает накопленный процент по ценным бумагам, проценты по которым Š²Ń‹ŠæŠ»Š°Ń‡ŠøŠ²Š°ŃŽŃ‚ся в срок ŠæŠ¾Š³Š°ŃˆŠµŠ½ŠøŃ. -AMORDEGRC = ŠŠœŠžŠ Š£Šœ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации Š“Š»Ń кажГого периоГа, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃ ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ амортизации. -AMORLINC = ŠŠœŠžŠ Š£Š’ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации Š“Š»Ń кажГого периоГа. -COUPDAYBS = Š”ŠŠ•Š™ŠšŠ£ŠŸŠžŠŠ”Šž ## Возвращает количество Гней от начала Š“ŠµŠ¹ŃŃ‚Š²ŠøŃ купона Го Гаты ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ. -COUPDAYS = Š”ŠŠ•Š™ŠšŠ£ŠŸŠžŠ ## Возвращает число Гней в периоГе купона, соГержащем Š“Š°Ń‚Ńƒ ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ. -COUPDAYSNC = Š”ŠŠ•Š™ŠšŠ£ŠŸŠžŠŠŸŠžŠ”Š›Š• ## Возвращает число Гней от Гаты ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ Го срока ŃŠ»ŠµŠ“ŃƒŃŽŃ‰ŠµŠ³Š¾ купона. -COUPNCD = Š”ŠŠ¢ŠŠšŠ£ŠŸŠžŠŠŸŠžŠ”Š›Š• ## Возвращает ŃŠ»ŠµŠ“ŃƒŃŽŃ‰ŃƒŃŽ Š“Š°Ń‚Ńƒ купона после Гаты ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ. -COUPNUM = Š§Š˜Š”Š›ŠšŠ£ŠŸŠžŠ ## Возвращает количество купонов, которые Š¼Š¾Š³ŃƒŃ‚ Š±Ń‹Ń‚ŃŒ оплачены межГу Гатой ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ Šø сроком Š²ŃŃ‚ŃƒŠæŠ»ŠµŠ½ŠøŃ в силу. -COUPPCD = Š”ŠŠ¢ŠŠšŠ£ŠŸŠžŠŠ”Šž ## Возвращает ŠæŃ€ŠµŠ“Ń‹Š“ŃƒŃ‰ŃƒŃŽ Š“Š°Ń‚Ńƒ купона переГ Гатой ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ. -CUMIPMT = ŠžŠ‘Š©ŠŸŠ›ŠŠ¢ ## Возвращает Š¾Š±Ń‰ŃƒŃŽ Š²Ń‹ŠæŠ»Š°Ń‚Ńƒ, ŠæŃ€Š¾ŠøŠ·Š²ŠµŠ“ŠµŠ½Š½ŃƒŃŽ межГу Š“Š²ŃƒŠ¼Ń периоГическими выплатами. -CUMPRINC = ŠžŠ‘Š©Š”ŠžŠ„ŠžŠ” ## Возвращает Š¾Š±Ń‰ŃƒŃŽ Š²Ń‹ŠæŠ»Š°Ń‚Ńƒ по займу межГу Š“Š²ŃƒŠ¼Ń периоГами. -DB = Š¤Š£Šž ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации актива Š“Š»Ń заГанного периоГа, Ń€Š°ŃŃŃ‡ŠøŃ‚Š°Š½Š½ŃƒŃŽ метоГом фиксированного ŃƒŠ¼ŠµŠ½ŃŒŃˆŠµŠ½ŠøŃ остатка. -DDB = Š”Š”ŠžŠ‘ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации актива за Ганный периоГ, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃ метоГ Гвойного ŃƒŠ¼ŠµŠ½ŃŒŃˆŠµŠ½ŠøŃ остатка или иной ŃŠ²Š½Š¾ ŃƒŠŗŠ°Š·Š°Š½Š½Ń‹Š¹ метоГ. -DISC = Š”ŠšŠ˜Š”ŠšŠ ## Возвращает Š½Š¾Ń€Š¼Ńƒ скиГки Š“Š»Ń ценных бумаг. -DOLLARDE = РУБЛЬ.ДЕД ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Ń†ŠµŠ½Ńƒ в Ń€ŃƒŠ±Š»ŃŃ…, Š²Ń‹Ń€Š°Š¶ŠµŠ½Š½ŃƒŃŽ в виГе Гроби, в Ń†ŠµŠ½Ńƒ в Ń€ŃƒŠ±Š»ŃŃ…, Š²Ń‹Ń€Š°Š¶ŠµŠ½Š½ŃƒŃŽ Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Š¼ числом. -DOLLARFR = РУБЛЬ.Š”Š ŠžŠ‘Š¬ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Ń†ŠµŠ½Ńƒ в Ń€ŃƒŠ±Š»ŃŃ…, Š²Ń‹Ń€Š°Š¶ŠµŠ½Š½ŃƒŃŽ Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Š¼ числом, в Ń†ŠµŠ½Ńƒ в Ń€ŃƒŠ±Š»ŃŃ…, Š²Ń‹Ń€Š°Š¶ŠµŠ½Š½ŃƒŃŽ в виГе Гроби. -DURATION = Š”Š›Š˜Š¢ ## Возвращает ŠµŠ¶ŠµŠ³Š¾Š“Š½ŃƒŃŽ ŠæŃ€Š¾Š“Š¾Š»Š¶ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚ŃŒ Š“ŠµŠ¹ŃŃ‚Š²ŠøŃ ценных бумаг с периоГическими выплатами по процентам. -EFFECT = Š­Š¤Š¤Š•ŠšŠ¢ ## Возвращает Š“ŠµŠ¹ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŠµ ежегоГные процентные ставки. -FV = БД ## Возвращает Š±ŃƒŠ“ŃƒŃ‰ŃƒŃŽ ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒ инвестиции. -FVSCHEDULE = Š‘Š—Š ŠŠ”ŠŸŠ˜Š” ## Возвращает Š±ŃƒŠ“ŃƒŃ‰ŃƒŃŽ ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒ ŠæŠµŃ€Š²Š¾Š½Š°Ń‡Š°Š»ŃŒŠ½Š¾Š¹ основной ŃŃƒŠ¼Š¼Ń‹ после Š½Š°Ń‡ŠøŃŠ»ŠµŠ½ŠøŃ Ń€ŃŠ“Š° сложных процентов. -INTRATE = Š˜ŠŠžŠ ŠœŠ ## Возвращает ŠæŃ€Š¾Ń†ŠµŠ½Ń‚Š½ŃƒŃŽ ŃŃ‚Š°Š²ŠŗŃƒ Š“Š»Ń ŠæŠ¾Š»Š½Š¾ŃŃ‚ŃŒŃŽ инвестированных ценных бумаг. -IPMT = ŠŸŠ ŠŸŠ›Š¢ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ выплаты прибыли на Š²Š»Š¾Š¶ŠµŠ½ŠøŃ за Ганный периоГ. -IRR = ВДД ## Возвращает Š²Š½ŃƒŃ‚Ń€ŠµŠ½Š½ŃŽŃŽ ŃŃ‚Š°Š²ŠŗŃƒ ГохоГности Š“Š»Ń Ń€ŃŠ“Š° потоков Генежных среГств. -ISPMT = ŠŸŠ ŠžŠ¦ŠŸŠ›ŠŠ¢ ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ выплаты за ŃƒŠŗŠ°Š·Š°Š½Š½Ń‹Š¹ периоГ инвестиции. -MDURATION = ŠœŠ”Š›Š˜Š¢ ## Возвращает Š¼Š¾Š“ŠøŃ„ŠøŃ†ŠøŃ€Š¾Š²Š°Š½Š½ŃƒŃŽ Š“Š»ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚ŃŒ ŠœŠ°ŠŗŠ¾Š»ŠµŃ Š“Š»Ń ценных бумаг с преГполагаемой номинальной ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒŃŽ 100 Ń€ŃƒŠ±Š»ŠµŠ¹. -MIRR = ŠœŠ’Š”Š” ## Возвращает Š²Š½ŃƒŃ‚Ń€ŠµŠ½Š½ŃŽŃŽ ŃŃ‚Š°Š²ŠŗŃƒ ГохоГности, при которой ŠæŠ¾Š»Š¾Š¶ŠøŃ‚ŠµŠ»ŃŒŠ½Ń‹Šµ Šø Š¾Ń‚Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Ń‹Šµ Генежные потоки ŠøŠ¼ŠµŃŽŃ‚ разные Š·Š½Š°Ń‡ŠµŠ½ŠøŃ ставки. -NOMINAL = ŠŠžŠœŠ˜ŠŠŠ› ## Возвращает Š½Š¾Š¼ŠøŠ½Š°Š»ŃŒŠ½ŃƒŃŽ Š³Š¾Š“Š¾Š²ŃƒŃŽ ŠæŃ€Š¾Ń†ŠµŠ½Ń‚Š½ŃƒŃŽ ŃŃ‚Š°Š²ŠŗŃƒ. -NPER = ŠšŠŸŠ•Š  ## Возвращает общее количество периоГов выплаты Š“Š»Ń Ганного вклаГа. -NPV = ЧПД ## Возвращает Ń‡ŠøŃŃ‚ŃƒŃŽ ŠæŃ€ŠøŠ²ŠµŠ“ŠµŠ½Š½ŃƒŃŽ ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒ инвестиции, основанной на серии периоГических Генежных потоков Šø ставке Š“ŠøŃŠŗŠ¾Š½Ń‚ŠøŃ€Š¾Š²Š°Š½ŠøŃ. -ODDFPRICE = Š¦Š•ŠŠŠŸŠ•Š Š’ŠŠ•Š Š•Š“ ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ Š½Š°Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Š¾Š¹ стоимости ценных бумаг с Š½ŠµŃ€ŠµŠ³ŃƒŠ»ŃŃ€Š½Ń‹Š¼ первым периоГом. -ODDFYIELD = Š”ŠžŠ„ŠžŠ”ŠŸŠ•Š Š’ŠŠ•Š Š•Š“ ## Возвращает ГохоГ по ценным бумагам с Š½ŠµŃ€ŠµŠ³ŃƒŠ»ŃŃ€Š½Ń‹Š¼ первым периоГом. -ODDLPRICE = Š¦Š•ŠŠŠŸŠžŠ”Š›ŠŠ•Š Š•Š“ ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ Š½Š°Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Š¾Š¹ стоимости ценных бумаг с Š½ŠµŃ€ŠµŠ³ŃƒŠ»ŃŃ€Š½Ń‹Š¼ послеГним периоГом. -ODDLYIELD = Š”ŠžŠ„ŠžŠ”ŠŸŠžŠ”Š›ŠŠ•Š Š•Š“ ## Возвращает ГохоГ по ценным бумагам с Š½ŠµŃ€ŠµŠ³ŃƒŠ»ŃŃ€Š½Ń‹Š¼ послеГним периоГом. -PMT = ŠŸŠ›Š¢ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ выплаты за оГин периоГ Š°Š½Š½ŃƒŠøŃ‚ŠµŃ‚Š°. -PPMT = ŠžŠ”ŠŸŠ›Š¢ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ выплат в погашение основной ŃŃƒŠ¼Š¼Ń‹ по инвестиции за заГанный периоГ. -PRICE = Š¦Š•ŠŠ ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ Š½Š°Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Š¾Š¹ стоимости ценных бумаг, по которым ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøŃ‚ŃŃ ŠæŠµŃ€ŠøŠ¾Š“ŠøŃ‡ŠµŃŠŗŠ°Ń выплата процентов. -PRICEDISC = Š¦Š•ŠŠŠ”ŠšŠ˜Š”ŠšŠ ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ номинальной стоимости ценных бумаг, на которые сГелана скиГка. -PRICEMAT = Š¦Š•ŠŠŠŸŠžŠ“ŠŠØ ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ номинальной стоимости ценных бумаг, проценты по которым Š²Ń‹ŠæŠ»Š°Ń‡ŠøŠ²Š°ŃŽŃ‚ся в срок ŠæŠ¾Š³Š°ŃˆŠµŠ½ŠøŃ. -PV = ПД ## Возвращает ŠæŃ€ŠøŠ²ŠµŠ“ŠµŠ½Š½ŃƒŃŽ (Šŗ Ń‚ŠµŠŗŃƒŃ‰ŠµŠ¼Ńƒ Š¼Š¾Š¼ŠµŠ½Ń‚Ńƒ) ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒ инвестиции. -RATE = Š”Š¢ŠŠ’ŠšŠ ## Возвращает ŠæŃ€Š¾Ń†ŠµŠ½Ń‚Š½ŃƒŃŽ ŃŃ‚Š°Š²ŠŗŃƒ по Š°Š½Š½ŃƒŠøŃ‚ŠµŃ‚Ńƒ за оГин периоГ. -RECEIVED = ŠŸŠžŠ›Š£Š§Š•ŠŠž ## Возвращает сумму, ŠæŠ¾Š»ŃƒŃ‡ŠµŠ½Š½ŃƒŃŽ Šŗ ŃŃ€Š¾ŠŗŃƒ ŠæŠ¾Š³Š°ŃˆŠµŠ½ŠøŃ ŠæŠ¾Š»Š½Š¾ŃŃ‚ŃŒŃŽ обеспеченных ценных бумаг. -SLN = ŠŠŸŠ› ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ линейной амортизации актива за оГин периоГ. -SYD = АДЧ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации актива за Ганный периоГ, Ń€Š°ŃŃŃ‡ŠøŃ‚Š°Š½Š½ŃƒŃŽ метоГом ŃŃƒŠ¼Š¼Ń‹ гоГовых чисел. -TBILLEQ = Š ŠŠ’ŠŠžŠšŠ§Š•Šš ## Возвращает ŃŠŗŠ²ŠøŠ²Š°Š»ŠµŠ½Ń‚Š½Ń‹Š¹ облигации ГохоГ по ŠŗŠ°Š·Š½Š°Ń‡ŠµŠ¹ŃŠŗŠ¾Š¼Ńƒ Ń‡ŠµŠŗŃƒ. -TBILLPRICE = Š¦Š•ŠŠŠšŠ§Š•Šš ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ Š½Š°Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Š¾Š¹ стоимости Š“Š»Ń казначейского чека. -TBILLYIELD = Š”ŠžŠ„ŠžŠ”ŠšŠ§Š•Šš ## Возвращает ГохоГ по ŠŗŠ°Š·Š½Š°Ń‡ŠµŠ¹ŃŠŗŠ¾Š¼Ńƒ Ń‡ŠµŠŗŃƒ. -VDB = ŠŸŠ£Šž ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации актива Š“Š»Ń указанного или частичного периоГа при использовании метоГа ŃŠ¾ŠŗŃ€Š°Ń‰Š°ŃŽŃ‰ŠµŠ³Š¾ŃŃ баланса. -XIRR = Š§Š˜Š”Š¢Š’ŠŠ”ŠžŠ„ ## Возвращает Š²Š½ŃƒŃ‚Ń€ŠµŠ½Š½ŃŽŃŽ ŃŃ‚Š°Š²ŠŗŃƒ ГохоГности Š“Š»Ń графика Генежных потоков, которые не Š¾Š±ŃŠ·Š°Ń‚ŠµŠ»ŃŒŠ½Š¾ Š½Š¾ŃŃŃ‚ периоГический характер. -XNPV = Š§Š˜Š”Š¢ŠŠ— ## Возвращает Ń‡ŠøŃŃ‚ŃƒŃŽ ŠæŃ€ŠøŠ²ŠµŠ“ŠµŠ½Š½ŃƒŃŽ ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒ Š“Š»Ń Генежных потоков, которые не Š¾Š±ŃŠ·Š°Ń‚ŠµŠ»ŃŒŠ½Š¾ ŃŠ²Š»ŃŃŽŃ‚ŃŃ периоГическими. -YIELD = Š”ŠžŠ„ŠžŠ” ## Возвращает ГохоГ от ценных бумаг, по которым ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŃŃ‚ŃŃ периоГические выплаты процентов. -YIELDDISC = Š”ŠžŠ„ŠžŠ”Š”ŠšŠ˜Š”ŠšŠ ## Возвращает гоГовой ГохоГ по ценным бумагам, на которые сГелана скиГка (пример — казначейские чеки). -YIELDMAT = Š”ŠžŠ„ŠžŠ”ŠŸŠžŠ“ŠŠØ ## Возвращает гоГовой ГохоГ от ценных бумаг, проценты по которым Š²Ń‹ŠæŠ»Š°Ń‡ŠøŠ²Š°ŃŽŃ‚ся в срок ŠæŠ¾Š³Š°ŃˆŠµŠ½ŠøŃ. - - -## -## Information functions Š˜Š½Ń„Š¾Ń€Š¼Š°Ń†ŠøŠ¾Š½Š½Ń‹Šµ Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -CELL = ŠÆŠ§Š•Š™ŠšŠ ## Возвращает ŠøŠ½Ń„Š¾Ń€Š¼Š°Ń†ŠøŃŽ о формате, расположении или соГержимом ŃŃ‡ŠµŠ¹ŠŗŠø. -ERROR.TYPE = ТИП.ŠžŠØŠ˜Š‘ŠšŠ˜ ## Возвращает числовой коГ, ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŠ¹ Ń‚ŠøŠæŃƒ ошибки. -INFO = Š˜ŠŠ¤ŠžŠ Šœ ## Возвращает ŠøŠ½Ń„Š¾Ń€Š¼Š°Ń†ŠøŃŽ о Ń‚ŠµŠŗŃƒŃ‰ŠµŠ¹ операционной среГе. -ISBLANK = Š•ŠŸŠ£Š”Š¢Šž ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŠ²Š»ŃŠµŃ‚ŃŃ ссылкой на ŠæŃƒŃŃ‚ŃƒŃŽ ŃŃ‡ŠµŠ¹ŠŗŃƒ. -ISERR = Š•ŠžŠØ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŃŃ‹Š»Š°ŠµŃ‚ŃŃ на Š»ŃŽŠ±Š¾Šµ значение ошибки, кроме #Š/Š”. -ISERROR = Š•ŠžŠØŠ˜Š‘ŠšŠ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŃŃ‹Š»Š°ŠµŃ‚ŃŃ на Š»ŃŽŠ±Š¾Šµ значение ошибки. -ISEVEN = Š•Š§ŠŠ¢Š ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а ŃŠ²Š»ŃŠµŃ‚ŃŃ четным числом. -ISLOGICAL = Š•Š›ŠžŠ“Š˜Š§ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŃŃ‹Š»Š°ŠµŃ‚ŃŃ на логическое значение. -ISNA = Š•ŠŠ” ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŃŃ‹Š»Š°ŠµŃ‚ŃŃ на значение ошибки #Š/Š”. -ISNONTEXT = Š•ŠŠ•Š¢Š•ŠšŠ”Š¢ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а не ŃŠ²Š»ŃŠµŃ‚ŃŃ текстом. -ISNUMBER = Š•Š§Š˜Š”Š›Šž ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŃŃ‹Š»Š°ŠµŃ‚ŃŃ на число. -ISODD = Š•ŠŠ•Š§ŠŠ¢ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а ŃŠ²Š»ŃŠµŃ‚ŃŃ нечетным числом. -ISREF = Š•Š”Š”Š«Š›ŠšŠ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а ŃŠ²Š»ŃŠµŃ‚ŃŃ ссылкой. -ISTEXT = Š•Š¢Š•ŠšŠ”Š¢ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а ŃŠ²Š»ŃŠµŃ‚ŃŃ текстом. -N = Ч ## Возвращает значение, преобразованное в число. -NA = ŠŠ” ## Возвращает значение ошибки #Š/Š”. -TYPE = ТИП ## Возвращает число, Š¾Š±Š¾Š·Š½Š°Ń‡Š°ŃŽŃ‰ŠµŠµ тип Ганных Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. - - -## -## Logical functions Логические Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -AND = И ## Renvoie VRAI si tous ses arguments sont VRAI. -FALSE = Š›ŠžŠ–Š¬ ## Возвращает логическое значение Š›ŠžŠ–Ь. -IF = Š•Š”Š›Š˜ ## Š’Ń‹ŠæŠ¾Š»Š½ŃŠµŃ‚ ŠæŃ€Š¾Š²ŠµŃ€ŠŗŃƒ ŃƒŃŠ»Š¾Š²ŠøŃ. -IFERROR = Š•Š”Š›Š˜ŠžŠØŠ˜Š‘ŠšŠ ## Возвращает ввеГённое значение, если вычисление по Ń„Š¾Ń€Š¼ŃƒŠ»Šµ вызывает ошибку; в противном ŃŠ»ŃƒŃ‡Š°Šµ Ń„ŃƒŠ½ŠŗŃ†ŠøŃ возвращает Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚ Š²Ń‹Ń‡ŠøŃŠ»ŠµŠ½ŠøŃ. -NOT = ŠŠ• ## ŠœŠµŠ½ŃŠµŃ‚ логическое значение своего Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а на противоположное. -OR = Š˜Š›Š˜ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Ń…Š¾Ń‚Ń бы оГин Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ имеет значение Š˜Š”Š¢Š˜ŠŠ. -TRUE = Š˜Š”Š¢Š˜ŠŠ ## Возвращает логическое значение Š˜Š”Š¢Š˜ŠŠ. - - -## -## Lookup and reference functions Š¤ŃƒŠ½ŠŗŃ†ŠøŠø ссылки Šø поиска -## -ADDRESS = АДРЕД ## Возвращает ŃŃŃ‹Š»ŠŗŃƒ на Š¾Ń‚Š“ŠµŠ»ŃŒŠ½ŃƒŃŽ ŃŃ‡ŠµŠ¹ŠŗŃƒ листа в виГе текста. -AREAS = ŠžŠ‘Š›ŠŠ”Š¢Š˜ ## Возвращает количество областей в ссылке. -CHOOSE = Š’Š«Š‘ŠžŠ  ## Выбирает значение ŠøŠ· списка значений по инГексу. -COLUMN = Š”Š¢ŠžŠ›Š‘Š•Š¦ ## Возвращает номер столбца, на который ŃƒŠŗŠ°Š·Ń‹Š²Š°ŠµŃ‚ ссылка. -COLUMNS = Š§Š˜Š”Š›Š”Š¢ŠžŠ›Š‘ ## Возвращает количество столбцов в ссылке. -HLOOKUP = Š“ŠŸŠ  ## Š˜Ń‰ŠµŃ‚ в первой строке массива Šø возвращает значение отмеченной ŃŃ‡ŠµŠ¹ŠŗŠø -HYPERLINK = Š“Š˜ŠŸŠ•Š Š”Š”Š«Š›ŠšŠ ## ДозГает ŃŃŃ‹Š»ŠŗŃƒ, Š¾Ń‚ŠŗŃ€Ń‹Š²Š°ŃŽŃ‰ŃƒŃŽ Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚, который Š½Š°Ń…Š¾Š“ŠøŃ‚ŃŃ на сервере сети, в интрасети или в Š˜Š½Ń‚ернете. -INDEX = Š˜ŠŠ”Š•ŠšŠ” ## Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ инГекс Š“Š»Ń выбора Š·Š½Š°Ń‡ŠµŠ½ŠøŃ ŠøŠ· ссылки или массива. -INDIRECT = ДВДДЫЛ ## Возвращает ŃŃŃ‹Š»ŠŗŃƒ, Š·Š°Š“Š°Š½Š½ŃƒŃŽ текстовым значением. -LOOKUP = ŠŸŠ ŠžŠ”ŠœŠžŠ¢Š  ## Š˜Ń‰ŠµŃ‚ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в векторе или массиве. -MATCH = ŠŸŠžŠ˜Š”ŠšŠŸŠžŠ— ## Š˜Ń‰ŠµŃ‚ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в ссылке или массиве. -OFFSET = Š”ŠœŠ•Š© ## Возвращает смещение ссылки Š¾Ń‚Š½Š¾ŃŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ заГанной ссылки. -ROW = Š”Š¢Š ŠžŠšŠ ## Возвращает номер строки, Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŃŠµŠ¼Š¾Š¹ ссылкой. -ROWS = Š§Š”Š¢Š ŠžŠš ## Возвращает количество строк в ссылке. -RTD = ДРВ ## Š˜Š·Š²Š»ŠµŠŗŠ°ŠµŃ‚ Ганные Ń€ŠµŠ°Š»ŃŒŠ½Š¾Š³Š¾ времени ŠøŠ· программ, ŠæŠ¾Š“Š“ŠµŃ€Š¶ŠøŠ²Š°ŃŽŃ‰ŠøŃ… Š°Š²Ń‚Š¾Š¼Š°Ń‚ŠøŠ·Š°Ń†ŠøŃŽ COM (ŠŸŃ€Š¾Š³Ń€Š°Š¼Š¼ŠøŃ€Š¾Š²Š°Š½ŠøŠµ Š¾Š±ŃŠŠµŠŗŃ‚Š¾Š². ДтанГартное среГство Š“Š»Ń работы с Š¾Š±ŃŠŠµŠŗŃ‚Š°Š¼Šø некоторого ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŠøŠ· Š“Ń€ŃƒŠ³Š¾Š³Š¾ ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ или среГства разработки. ŠŸŃ€Š¾Š³Ń€Š°Š¼Š¼ŠøŃ€Š¾Š²Š°Š½ŠøŠµ Š¾Š±ŃŠŠµŠŗŃ‚Š¾Š² (ранее называемое программированием OLE) ŃŠ²Š»ŃŠµŃ‚ŃŃ Ń„ŃƒŠ½ŠŗŃ†ŠøŠµŠ¹ моГели COM (Component Object Model, моГель компонентных Š¾Š±ŃŠŠµŠŗŃ‚Š¾Š²).). -TRANSPOSE = Š¢Š ŠŠŠ”ŠŸ ## Возвращает транспонированный массив. -VLOOKUP = Š’ŠŸŠ  ## Š˜Ń‰ŠµŃ‚ значение в первом столбце массива Šø возвращает значение ŠøŠ· ŃŃ‡ŠµŠ¹ŠŗŠø в найГенной строке Šø указанном столбце. - - -## -## Math and trigonometry functions ŠœŠ°Ń‚ŠµŠ¼Š°Ń‚ŠøŃ‡ŠµŃŠŗŠøŠµ Šø тригонометрические Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -ABS = ABS ## Возвращает моГуль (Š°Š±ŃŠ¾Š»ŃŽŃ‚Š½ŃƒŃŽ Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ) числа. -ACOS = ACOS ## Возвращает Š°Ń€ŠŗŠŗŠ¾ŃŠøŠ½ŃƒŃ числа. -ACOSH = ACOSH ## Возвращает гиперболический Š°Ń€ŠŗŠŗŠ¾ŃŠøŠ½ŃƒŃ числа. -ASIN = ASIN ## Возвращает Š°Ń€ŠŗŃŠøŠ½ŃƒŃ числа. -ASINH = ASINH ## Возвращает гиперболический Š°Ń€ŠŗŃŠøŠ½ŃƒŃ числа. -ATAN = ATAN ## Возвращает арктангенс числа. -ATAN2 = ATAN2 ## Возвращает арктангенс Š“Š»Ń заГанных коорГинат x Šø y. -ATANH = ATANH ## Возвращает гиперболический арктангенс числа. -CEILING = ŠžŠšŠ Š’Š’Š•Š Š„ ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего целого или Го ближайшего кратного указанному Š·Š½Š°Ń‡ŠµŠ½ŠøŃŽ. -COMBIN = Š§Š˜Š”Š›ŠšŠžŠœŠ‘ ## Возвращает количество комбинаций Š“Š»Ń заГанного числа Š¾Š±ŃŠŠµŠŗŃ‚ов. -COS = COS ## Возвращает косинус числа. -COSH = COSH ## Возвращает гиперболический косинус числа. -DEGREES = ГРАДУДЫ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ раГианы в Š³Ń€Š°Š“ŃƒŃŃ‹. -EVEN = Š§ŠŠ¢Š ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего четного целого. -EXP = EXP ## Возвращает число e, возвеГенное в ŃƒŠŗŠ°Š·Š°Š½Š½ŃƒŃŽ ŃŃ‚ŠµŠæŠµŠ½ŃŒ. -FACT = ФАКТР ## Возвращает факториал числа. -FACTDOUBLE = Š”Š’Š¤ŠŠšŠ¢Š  ## Возвращает Гвойной факториал числа. -FLOOR = ŠžŠšŠ Š’ŠŠ˜Š— ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего меньшего по Š¼Š¾Š“ŃƒŠ»ŃŽ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -GCD = ŠŠžŠ” ## Возвращает наибольший общий Š“ŠµŠ»ŠøŃ‚ŠµŠ»ŃŒ. -INT = Š¦Š•Š›ŠžŠ• ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего меньшего целого. -LCM = ŠŠžŠš ## Возвращает наименьшее общее кратное. -LN = LN ## Возвращает Š½Š°Ń‚ŃƒŃ€Š°Š»ŃŒŠ½Ń‹Š¹ логарифм числа. -LOG = LOG ## Возвращает логарифм числа по заГанному Š¾ŃŠ½Š¾Š²Š°Š½ŠøŃŽ. -LOG10 = LOG10 ## Возвращает Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Š¹ логарифм числа. -MDETERM = ŠœŠžŠŸŠ Š•Š” ## Возвращает Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŠøŃ‚ŠµŠ»ŃŒ матрицы массива. -MINVERSE = ŠœŠžŠ‘Š  ## Возвращает Š¾Š±Ń€Š°Ń‚Š½ŃƒŃŽ Š¼Š°Ń‚Ń€ŠøŃ†Ńƒ массива. -MMULT = ŠœŠ£ŠœŠŠžŠ– ## Возвращает произвеГение матриц Š“Š²ŃƒŃ… массивов. -MOD = ŠžŠ”Š¢ŠŠ¢ ## Возвращает остаток от Š“ŠµŠ»ŠµŠ½ŠøŃ. -MROUND = ŠžŠšŠ Š£Š“Š›Š¢ ## Возвращает число, Š¾ŠŗŃ€ŃƒŠ³Š»ŠµŠ½Š½Š¾Šµ с Ń‚Ń€ŠµŠ±ŃƒŠµŠ¼Š¾Š¹ Ń‚Š¾Ń‡Š½Š¾ŃŃ‚ŃŒŃŽ. -MULTINOMIAL = ŠœŠ£Š›Š¬Š¢Š˜ŠŠžŠœ ## Возвращает Š¼ŃƒŠ»ŃŒŃ‚ŠøŠ½Š¾Š¼ŠøŠ°Š»ŃŒŠ½Ń‹Š¹ ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ множества чисел. -ODD = ŠŠ•Š§ŠŠ¢ ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего нечетного целого. -PI = ПИ ## Возвращает число пи. -POWER = Š”Š¢Š•ŠŸŠ•ŠŠ¬ ## Возвращает Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚ Š²Š¾Š·Š²ŠµŠ“ŠµŠ½ŠøŃ числа в ŃŃ‚ŠµŠæŠµŠ½ŃŒ. -PRODUCT = ŠŸŠ ŠžŠ˜Š—Š’Š•Š” ## Возвращает произвеГение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -QUOTIENT = Š§ŠŠ”Š¢ŠŠžŠ• ## Возвращает Ń†ŠµŠ»ŃƒŃŽ Ń‡Š°ŃŃ‚ŃŒ частного при Гелении. -RADIANS = Š ŠŠ”Š˜ŠŠŠ« ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š³Ń€Š°Š“ŃƒŃŃ‹ в раГианы. -RAND = Š”Š›Š§Š˜Š” ## Возвращает ŃŠ»ŃƒŃ‡Š°Š¹Š½Š¾Šµ число в интервале от 0 Го 1. -RANDBETWEEN = Š”Š›Š£Š§ŠœŠ•Š–Š”Š£ ## Возвращает ŃŠ»ŃƒŃ‡Š°Š¹Š½Š¾Šµ число в интервале межГу Š“Š²ŃƒŠ¼Ń заГанными числами. -ROMAN = Š Š˜ŠœŠ”ŠšŠžŠ• ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ арабские цифры в римские в виГе текста. -ROUND = ŠžŠšŠ Š£Š“Š› ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го указанного количества Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Ń… Ń€Š°Š·Ń€ŃŠ“Š¾Š². -ROUNDDOWN = ŠžŠšŠ Š£Š“Š›Š’ŠŠ˜Š— ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего меньшего по Š¼Š¾Š“ŃƒŠ»ŃŽ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -ROUNDUP = ŠžŠšŠ Š£Š“Š›Š’Š’Š•Š Š„ ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего большего по Š¼Š¾Š“ŃƒŠ»ŃŽ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -SERIESSUM = Š ŠÆŠ”.ДУММ ## Возвращает сумму степенного Ń€ŃŠ“Š°, Š²Ń‹Ń‡ŠøŃŠ»ŠµŠ½Š½ŃƒŃŽ по Ń„Š¾Ń€Š¼ŃƒŠ»Šµ. -SIGN = Š—ŠŠŠš ## Возвращает знак числа. -SIN = SIN ## Возвращает синус заГанного угла. -SINH = SINH ## Возвращает гиперболический синус числа. -SQRT = ŠšŠžŠ Š•ŠŠ¬ ## Возвращает ŠæŠ¾Š»Š¾Š¶ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾Šµ значение кваГратного ŠŗŠ¾Ń€Š½Ń. -SQRTPI = ŠšŠžŠ Š•ŠŠ¬ŠŸŠ˜ ## Возвращает кваГратный ŠŗŠ¾Ń€ŠµŠ½ŃŒ ŠøŠ· Š·Š½Š°Ń‡ŠµŠ½ŠøŃ Š²Ń‹Ń€Š°Š¶ŠµŠ½ŠøŃ (число * ПИ). -SUBTOTAL = ŠŸŠ ŠžŠœŠ•Š–Š£Š¢ŠžŠ§ŠŠ«Š•.Š˜Š¢ŠžŠ“Š˜ ## Возвращает ŠæŃ€Š¾Š¼ŠµŠ¶ŃƒŃ‚Š¾Ń‡Š½Ń‹Š¹ итог в списке или базе Ганных. -SUM = ДУММ ## Š”ŃƒŠ¼Š¼ŠøŃ€ŃƒŠµŃ‚ Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚Ń‹. -SUMIF = Š”Š£ŠœŠœŠ•Š”Š›Š˜ ## Š”ŃƒŠ¼Š¼ŠøŃ€ŃƒŠµŃ‚ ŃŃ‡ŠµŠ¹ŠŗŠø, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŠµ заГанному ŃƒŃŠ»Š¾Š²ŠøŃŽ. -SUMIFS = Š”Š£ŠœŠœŠ•Š”Š›Š˜ŠœŠ ## Š”ŃƒŠ¼Š¼ŠøŃ€ŃƒŠµŃ‚ Гиапазон ŃŃ‡ŠµŠµŠŗ, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŃ… нескольким ŃƒŃŠ»Š¾Š²ŠøŃŠ¼. -SUMPRODUCT = Š”Š£ŠœŠœŠŸŠ ŠžŠ˜Š—Š’ ## Возвращает сумму произвеГений ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŃ… ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² массивов. -SUMSQ = Š”Š£ŠœŠœŠšŠ’ ## Возвращает сумму кваГратов Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -SUMX2MY2 = Š”Š£ŠœŠœŠ ŠŠ—ŠŠšŠ’ ## Возвращает сумму разностей кваГратов ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŃ… значений в Š“Š²ŃƒŃ… массивах. -SUMX2PY2 = Š”Š£ŠœŠœŠ”Š£ŠœŠœŠšŠ’ ## Возвращает сумму сумм кваГратов ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŃ… ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² Š“Š²ŃƒŃ… массивов. -SUMXMY2 = Š”Š£ŠœŠœŠšŠ’Š ŠŠ—Š ## Возвращает сумму кваГратов разностей ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŃ… значений в Š“Š²ŃƒŃ… массивах. -TAN = TAN ## Возвращает тангенс числа. -TANH = TANH ## Возвращает гиперболический тангенс числа. -TRUNC = ŠžŠ¢Š‘Š  ## ŠžŃ‚Š±Ń€Š°ŃŃ‹Š²Š°ŠµŃ‚ Š“Ń€Š¾Š±Š½ŃƒŃŽ Ń‡Š°ŃŃ‚ŃŒ числа. - - -## -## Statistical functions Дтатистические Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -AVEDEV = Š”Š ŠžŠ¢ŠšŠ› ## Возвращает среГнее арифметическое Š°Š±ŃŠ¾Š»ŃŽŃ‚ных значений отклонений точек Ганных от среГнего. -AVERAGE = Š”Š Š—ŠŠŠ§ ## Возвращает среГнее арифметическое Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -AVERAGEA = Š”Š Š—ŠŠŠ§Š ## Возвращает среГнее арифметическое Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -AVERAGEIF = Š”Š Š—ŠŠŠ§Š•Š”Š›Š˜ ## Возвращает среГнее значение (среГнее арифметическое) всех ŃŃ‡ŠµŠµŠŗ в Гиапазоне, которые ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‚ Ганному ŃƒŃŠ»Š¾Š²ŠøŃŽ. -AVERAGEIFS = Š”Š Š—ŠŠŠ§Š•Š”Š›Š˜ŠœŠ ## Возвращает среГнее значение (среГнее арифметическое) всех ŃŃ‡ŠµŠµŠŗ, которые ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‚ нескольким ŃƒŃŠ»Š¾Š²ŠøŃŠ¼. -BETADIST = Š‘Š•Š¢ŠŠ ŠŠ”ŠŸ ## Возвращает ŠøŠ½Ń‚ŠµŠ³Ń€Š°Š»ŃŒŠ½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ бета-Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -BETAINV = Š‘Š•Š¢ŠŠžŠ‘Š  ## Возвращает Š¾Š±Ń€Š°Ń‚Š½ŃƒŃŽ ŠøŠ½Ń‚ŠµŠ³Ń€Š°Š»ŃŒŠ½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ указанного бета-Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -BINOMDIST = Š‘Š˜ŠŠžŠœŠ ŠŠ”ŠŸ ## Возвращает Š¾Ń‚Š“ŠµŠ»ŃŒŠ½Š¾Šµ значение биномиального Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -CHIDIST = ЄИ2РАДП ## Возвращает Š¾Š“Š½Š¾ŃŃ‚Š¾Ń€Š¾Š½Š½ŃŽŃŽ Š²ŠµŃ€Š¾ŃŃ‚Š½Š¾ŃŃ‚ŃŒ Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ Ń…Šø-кваГрат. -CHIINV = ЄИ2ŠžŠ‘Š  ## Возвращает обратное значение оГносторонней Š²ŠµŃ€Š¾ŃŃ‚ности Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ Ń…Šø-кваГрат. -CHITEST = ЄИ2ТЕДТ ## Возвращает тест на Š½ŠµŠ·Š°Š²ŠøŃŠøŠ¼Š¾ŃŃ‚ŃŒ. -CONFIDENCE = Š”ŠžŠ’Š•Š Š˜Š¢ ## Возвращает Š“Š¾Š²ŠµŃ€ŠøŃ‚ŠµŠ»ŃŒŠ½Ń‹Š¹ интервал Š“Š»Ń среГнего Š·Š½Š°Ń‡ŠµŠ½ŠøŃ по Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø. -CORREL = ŠšŠžŠ Š Š•Š› ## Возвращает ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ ŠŗŠ¾Ń€Ń€ŠµŠ»ŃŃ†ŠøŠø межГу Š“Š²ŃƒŠ¼Ń множествами Ганных. -COUNT = ДЧЁТ ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество чисел в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -COUNTA = ДЧЁТЗ ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество значений в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -COUNTBLANK = Š”Š§Š˜Š¢ŠŠ¢Š¬ŠŸŠ£Š”Š¢ŠžŠ¢Š« ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество ŠæŃƒŃŃ‚ых ŃŃ‡ŠµŠµŠŗ в Гиапазоне -COUNTIF = Š”Š§ŠŠ¢Š•Š”Š›Š˜ ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество ŃŃ‡ŠµŠµŠŗ в Гиапазоне, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŃ… заГанному ŃƒŃŠ»Š¾Š²ŠøŃŽ -COUNTIFS = Š”Š§ŠŠ¢Š•Š”Š›Š˜ŠœŠ ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество ŃŃ‡ŠµŠµŠŗ Š²Š½ŃƒŃ‚Ń€Šø Гиапазона, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŃ… нескольким ŃƒŃŠ»Š¾Š²ŠøŃŠ¼. -COVAR = ŠšŠžŠ’ŠŠ  ## Возвращает ŠŗŠ¾Š²Š°Ń€ŠøŠ°Ń†ŠøŃŽ, среГнее произвеГений парных отклонений -CRITBINOM = ŠšŠ Š˜Š¢Š‘Š˜ŠŠžŠœ ## Возвращает наименьшее значение, Š“Š»Ń которого ŠøŠ½Ń‚ŠµŠ³Ń€Š°Š»ŃŒŠ½Š¾Šµ биномиальное распреГеление меньше или равно заГанному ŠŗŃ€ŠøŃ‚ŠµŃ€ŠøŃŽ. -DEVSQ = ŠšŠ’ŠŠ”Š ŠžŠ¢ŠšŠ› ## Возвращает сумму кваГратов отклонений. -EXPONDIST = ЭКДПРАДП ## Возвращает ŃŠŗŃŠæŠ¾Š½ŠµŠ½Ń†ŠøŠ°Š»ŃŒŠ½Š¾Šµ распреГеление. -FDIST = FРАДП ## Возвращает F-распреГеление Š²ŠµŃ€Š¾ŃŃ‚ности. -FINV = FŠ ŠŠ”ŠŸŠžŠ‘Š  ## Возвращает обратное значение Š“Š»Ń F-Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ Š²ŠµŃ€Š¾ŃŃ‚Š½Š¾ŃŃ‚Šø. -FISHER = Š¤Š˜ŠØŠ•Š  ## Возвращает преобразование Š¤ŠøŃˆŠµŃ€Š°. -FISHERINV = Š¤Š˜ŠØŠ•Š ŠžŠ‘Š  ## Возвращает обратное преобразование Š¤ŠøŃˆŠµŃ€Š°. -FORECAST = ŠŸŠ Š•Š”Š”ŠšŠŠ— ## Возвращает значение линейного тренГа. -FREQUENCY = Š§ŠŠ”Š¢ŠžŠ¢Š ## Возвращает распреГеление частот в виГе Š²ŠµŃ€Ń‚ŠøŠŗŠ°Š»ŃŒŠ½Š¾Š³Š¾ массива. -FTEST = ФТЕДТ ## Возвращает Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚ F-теста. -GAMMADIST = Š“ŠŠœŠœŠŠ ŠŠ”ŠŸ ## Возвращает гамма-распреГеление. -GAMMAINV = Š“ŠŠœŠœŠŠžŠ‘Š  ## Возвращает обратное гамма-распреГеление. -GAMMALN = Š“ŠŠœŠœŠŠŠ›ŠžŠ“ ## Возвращает Š½Š°Ń‚ŃƒŃ€Š°Š»ŃŒŠ½Ń‹Š¹ логарифм гамма Ń„ŃƒŠ½ŠŗŃ†ŠøŠø, Ī“(x). -GEOMEAN = Š”Š Š“Š•ŠžŠœ ## Возвращает среГнее геометрическое. -GROWTH = Š ŠžŠ”Š¢ ## Возвращает Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в соответствии с ŃŠŗŃŠæŠ¾Š½ŠµŠ½Ń†ŠøŠ°Š»ŃŒŠ½Ń‹Š¼ тренГом. -HARMEAN = Š”Š Š“ŠŠ Šœ ## Возвращает среГнее гармоническое. -HYPGEOMDIST = Š“Š˜ŠŸŠ•Š Š“Š•ŠžŠœŠ•Š¢ ## Возвращает гипергеометрическое распреГеление. -INTERCEPT = ŠžŠ¢Š Š•Š—ŠžŠš ## Возвращает отрезок, отсекаемый на оси линией линейной регрессии. -KURT = Š­ŠšŠ”Š¦Š•Š”Š” ## Возвращает ŃŠŗŃŃ†ŠµŃŃ множества Ганных. -LARGE = ŠŠŠ˜Š‘ŠžŠ›Š¬ŠØŠ˜Š™ ## Возвращает k-ое наибольшее значение в множестве Ганных. -LINEST = Š›Š˜ŠŠ•Š™Š ## Возвращает параметры линейного тренГа. -LOGEST = Š›Š“Š Š¤ŠŸŠ Š˜Š‘Š› ## Возвращает параметры ŃŠŗŃŠæŠ¾Š½ŠµŠ½Ń†ŠøŠ°Š»ŃŒŠ½Š¾Š³Š¾ тренГа. -LOGINV = Š›ŠžŠ“ŠŠžŠ ŠœŠžŠ‘Š  ## Возвращает обратное логарифмическое Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½Š¾Šµ распреГеление. -LOGNORMDIST = Š›ŠžŠ“ŠŠžŠ ŠœŠ ŠŠ”ŠŸ ## Возвращает ŠøŠ½Ń‚ŠµŠ³Ń€Š°Š»ŃŒŠ½Š¾Šµ логарифмическое Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½Š¾Šµ распреГеление. -MAX = МАКД ## Возвращает наибольшее значение в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -MAXA = МАКДА ## Возвращает наибольшее значение в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -MEDIAN = ŠœŠ•Š”Š˜ŠŠŠ ## Возвращает меГиану заГанных чисел. -MIN = ŠœŠ˜Š ## Возвращает наименьшее значение в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -MINA = ŠœŠ˜ŠŠ ## Возвращает наименьшее значение в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -MODE = ŠœŠžŠ”Š ## Возвращает значение моГы множества Ганных. -NEGBINOMDIST = ŠžŠ¢Š Š‘Š˜ŠŠžŠœŠ ŠŠ”ŠŸ ## Возвращает Š¾Ń‚Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Š¾Šµ биномиальное распреГеление. -NORMDIST = ŠŠžŠ ŠœŠ ŠŠ”ŠŸ ## Возвращает Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -NORMINV = ŠŠžŠ ŠœŠžŠ‘Š  ## Возвращает обратное Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½Š¾Šµ распреГеление. -NORMSDIST = ŠŠžŠ ŠœŠ”Š¢Š ŠŠ”ŠŸ ## Возвращает станГартное Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½Š¾Šµ ŠøŠ½Ń‚ŠµŠ³Ń€Š°Š»ŃŒŠ½Š¾Šµ распреГеление. -NORMSINV = ŠŠžŠ ŠœŠ”Š¢ŠžŠ‘Š  ## Возвращает обратное значение станГартного Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½Š¾Š³Š¾ Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -PEARSON = ŠŸŠ˜Š Š”ŠžŠ ## Возвращает ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ ŠŗŠ¾Ń€Ń€ŠµŠ»ŃŃ†ŠøŠø ŠŸŠøŃ€ŃŠ¾Š½Š°. -PERCENTILE = ŠŸŠ•Š Š”Š•ŠŠ¢Š˜Š›Š¬ ## Возвращает k-ую ŠæŠµŃ€ŃŠµŠ½Ń‚ŠøŠ»ŃŒ Š“Š»Ń значений Гиапазона. -PERCENTRANK = ŠŸŠ ŠžŠ¦Š•ŠŠ¢Š ŠŠŠ“ ## Возвращает ŠæŃ€Š¾Ń†ŠµŠ½Ń‚Š½ŃƒŃŽ Š½Š¾Ń€Š¼Ńƒ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в множестве Ганных. -PERMUT = ŠŸŠ•Š Š•Š”Š¢ ## Возвращает количество перестановок Š“Š»Ń заГанного числа Š¾Š±ŃŠŠµŠŗŃ‚ов. -POISSON = ŠŸŠ£ŠŠ”Š”ŠžŠ ## Возвращает распреГеление Пуассона. -PROB = Š’Š•Š ŠžŠÆŠ¢ŠŠžŠ”Š¢Š¬ ## Возвращает Š²ŠµŃ€Š¾ŃŃ‚Š½Š¾ŃŃ‚ŃŒ того, что значение ŠøŠ· Гиапазона Š½Š°Ń…Š¾Š“ŠøŃ‚ŃŃ Š²Š½ŃƒŃ‚Ń€Šø заГанных преГелов. -QUARTILE = ŠšŠ’ŠŠ Š¢Š˜Š›Š¬ ## Возвращает ŠŗŠ²Š°Ń€Ń‚ŠøŠ»ŃŒ множества Ганных. -RANK = Š ŠŠŠ“ ## Возвращает ранг числа в списке чисел. -RSQ = ŠšŠ’ŠŸŠ˜Š Š”ŠžŠ ## Возвращает кваГрат ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚Š° ŠŗŠ¾Ń€Ń€ŠµŠ»ŃŃ†ŠøŠø ŠŸŠøŃ€ŃŠ¾Š½Š°. -SKEW = Š”ŠšŠžŠ” ## Возвращает Š°ŃŠøŠ¼Š¼ŠµŃ‚Ń€ŠøŃŽ Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -SLOPE = ŠŠŠšŠ›ŠžŠ ## Возвращает наклон линии линейной регрессии. -SMALL = ŠŠŠ˜ŠœŠ•ŠŠ¬ŠØŠ˜Š™ ## Возвращает k-ое наименьшее значение в множестве Ганных. -STANDARDIZE = ŠŠžŠ ŠœŠŠ›Š˜Š—ŠŠ¦Š˜ŠÆ ## Возвращает нормализованное значение. -STDEV = Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ›ŠžŠ ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ станГартное отклонение по выборке. -STDEVA = Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ›ŠžŠŠ ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ станГартное отклонение по выборке, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -STDEVP = Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ›ŠžŠŠŸ ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ станГартное отклонение по Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø. -STDEVPA = Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ›ŠžŠŠŸŠ ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ станГартное отклонение по Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -STEYX = Š”Š¢ŠžŠØYX ## Возвращает ŃŃ‚Š°Š½Š“Š°Ń€Ń‚Š½ŃƒŃŽ ошибку преГсказанных значений y Š“Š»Ń кажГого Š·Š½Š°Ń‡ŠµŠ½ŠøŃ x в регрессии. -TDIST = Š”Š¢Š¬Š®Š”Š ŠŠ”ŠŸ ## Возвращает t-распреГеление Š”Ń‚ŃŒŃŽŠ“ŠµŠ½Ń‚Š°. -TINV = Š”Š¢Š¬Š®Š”Š ŠŠ”ŠŸŠžŠ‘Š  ## Возвращает обратное t-распреГеление Š”Ń‚ŃŒŃŽŠ“ŠµŠ½Ń‚Š°. -TREND = Š¢Š•ŠŠ”Š•ŠŠ¦Š˜ŠÆ ## Возвращает Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в соответствии с линейным тренГом. -TRIMMEAN = Š£Š Š•Š—Š”Š Š•Š”ŠŠ•Š• ## Возвращает среГнее Š²Š½ŃƒŃ‚ренности множества Ганных. -TTEST = ТТЕДТ ## Возвращает Š²ŠµŃ€Š¾ŃŃ‚Š½Š¾ŃŃ‚ŃŒ, ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŃƒŃŽ ŠŗŃ€ŠøŃ‚ŠµŃ€ŠøŃŽ Š”Ń‚ŃŒŃŽŠ“ŠµŠ½Ń‚Š°. -VAR = Š”Š˜Š”ŠŸ ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ по выборке. -VARA = Š”Š˜Š”ŠŸŠ ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ по выборке, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -VARP = Š”Š˜Š”ŠŸŠ  ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ Š“Š»Ń Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø. -VARPA = Š”Š˜Š”ŠŸŠ Š ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ Š“Š»Ń Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -WEIBULL = ВЕЙБУЛЛ ## Возвращает распреГеление Š’ŠµŠ¹Š±ŃƒŠ»Š»Š°. -ZTEST = ZТЕДТ ## Возвращает Š“Š²ŃƒŃŃ‚Š¾Ń€Š¾Š½Š½ŠµŠµ P-значение z-теста. - - -## -## Text functions Текстовые Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -ASC = ASC ## Š”Š»Ń ŃŠ·Ń‹ŠŗŠ¾Š² с Š“Š²ŃƒŃ…Š±Š°Š¹Ń‚Š¾Š²Ń‹Š¼Šø наборами знаков (например, катакана) ŠæŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŠæŠ¾Š»Š½Š¾ŃˆŠøŃ€ŠøŠ½Š½Ń‹Šµ (Š“Š²ŃƒŃ…Š±Š°Š¹Ń‚Š¾Š²Ń‹Šµ) знаки в ŠæŠ¾Š»ŃƒŃˆŠøŃ€ŠøŠ½Š½Ń‹Šµ (оГнобайтовые). -BAHTTEXT = Š‘ŠŠ¢Š¢Š•ŠšŠ”Š¢ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ число в текст, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃ Генежный формат ß (БАТ). -CHAR = Š”Š˜ŠœŠ’ŠžŠ› ## Возвращает знак с заГанным коГом. -CLEAN = ŠŸŠ•Š§Š”Š˜ŠœŠ’ ## Š£Š“Š°Š»ŃŠµŃ‚ все непечатаемые знаки ŠøŠ· текста. -CODE = ŠšŠžŠ”Š”Š˜ŠœŠ’ ## Возвращает числовой коГ первого знака в текстовой строке. -CONCATENATE = Š”Š¦Š•ŠŸŠ˜Š¢Š¬ ## ŠžŠ±ŃŠŠµŠ“ŠøŠ½ŃŠµŃ‚ несколько текстовых ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² в оГин. -DOLLAR = РУБЛЬ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ число в текст, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃ Генежный формат. -EXACT = Š”ŠžŠ’ŠŸŠŠ” ## ŠŸŃ€Š¾Š²ŠµŃ€ŃŠµŃ‚ ŠøŠ“ŠµŠ½Ń‚ŠøŃ‡Š½Š¾ŃŃ‚ŃŒ Š“Š²ŃƒŃ… текстовых значений. -FIND = ŠŠŠ™Š¢Š˜ ## Š˜Ń‰ŠµŃ‚ Š²Ń…Š¾Š¶Š“ŠµŠ½ŠøŃ оГного текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в Š“Ń€ŃƒŠ³Š¾Š¼ (с ŃƒŃ‡ŠµŃ‚Š¾Š¼ регистра). -FINDB = ŠŠŠ™Š¢Š˜Š‘ ## Š˜Ń‰ŠµŃ‚ Š²Ń…Š¾Š¶Š“ŠµŠ½ŠøŃ оГного текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в Š“Ń€ŃƒŠ³Š¾Š¼ (с ŃƒŃ‡ŠµŃ‚Š¾Š¼ регистра). -FIXED = Š¤Š˜ŠšŠ”Š˜Š ŠžŠ’ŠŠŠŠ«Š™ ## Š¤Š¾Ń€Š¼Š°Ń‚ŠøŃ€ŃƒŠµŃ‚ число Šø ŠæŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ его в текст с заГанным числом Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Ń… знаков. -JIS = JIS ## Š”Š»Ń ŃŠ·Ń‹ŠŗŠ¾Š² с Š“Š²ŃƒŃ…Š±Š°Š¹Ń‚Š¾Š²Ń‹Š¼Šø наборами знаков (например, катакана) ŠæŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŠæŠ¾Š»ŃƒŃˆŠøŃ€ŠøŠ½Š½Ń‹Šµ (оГнобайтовые) знаки в текстовой строке в ŠæŠ¾Š»Š½Š¾ŃˆŠøŃ€ŠøŠ½Š½Ń‹Šµ (Š“Š²ŃƒŃ…Š±Š°Š¹Ń‚Š¾Š²Ń‹Šµ). -LEFT = Š›Š•Š’Š”Š˜ŠœŠ’ ## Возвращает крайние слева знаки текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -LEFTB = ЛЕВБ ## Возвращает крайние слева знаки текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -LEN = ДЛДТР ## Возвращает количество знаков в текстовой строке. -LENB = Š”Š›Š˜ŠŠ‘ ## Возвращает количество знаков в текстовой строке. -LOWER = Š”Š¢Š ŠžŠ§Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ все Š±ŃƒŠŗŠ²Ń‹ текста в строчные. -MID = ПДТР ## Возвращает заГанное число знаков ŠøŠ· строки текста, Š½Š°Ń‡ŠøŠ½Š°Ń с указанной позиции. -MIDB = ŠŸŠ”Š¢Š Š‘ ## Возвращает заГанное число знаков ŠøŠ· строки текста, Š½Š°Ń‡ŠøŠ½Š°Ń с указанной позиции. -PHONETIC = PHONETIC ## Š˜Š·Š²Š»ŠµŠŗŠ°ŠµŃ‚ фонетические (Ń„ŃƒŃ€ŠøŠ³Š°Š½Š°) знаки ŠøŠ· текстовой строки. -PROPER = ŠŸŠ ŠžŠŸŠŠŠ§ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŠæŠµŃ€Š²ŃƒŃŽ букву в кажГом слове текста в ŠæŃ€Š¾ŠæŠøŃŠ½ŃƒŃŽ. -REPLACE = Š—ŠŠœŠ•ŠŠ˜Š¢Š¬ ## Š—Š°Š¼ŠµŠ½ŃŠµŃ‚ знаки в тексте. -REPLACEB = Š—ŠŠœŠ•ŠŠ˜Š¢Š¬Š‘ ## Š—Š°Š¼ŠµŠ½ŃŠµŃ‚ знаки в тексте. -REPT = ŠŸŠžŠ’Š¢ŠžŠ  ## ŠŸŠ¾Š²Ń‚Š¾Ń€ŃŠµŃ‚ текст заГанное число раз. -RIGHT = ŠŸŠ ŠŠ’Š”Š˜ŠœŠ’ ## Возвращает крайние справа знаки текстовой строки. -RIGHTB = ŠŸŠ ŠŠ’Š‘ ## Возвращает крайние справа знаки текстовой строки. -SEARCH = ŠŸŠžŠ˜Š”Šš ## Š˜Ń‰ŠµŃ‚ Š²Ń…Š¾Š¶Š“ŠµŠ½ŠøŃ оГного текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в Š“Ń€ŃƒŠ³Š¾Š¼ (без ŃƒŃ‡ŠµŃ‚Š° регистра). -SEARCHB = ŠŸŠžŠ˜Š”ŠšŠ‘ ## Š˜Ń‰ŠµŃ‚ Š²Ń…Š¾Š¶Š“ŠµŠ½ŠøŃ оГного текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в Š“Ń€ŃƒŠ³Š¾Š¼ (без ŃƒŃ‡ŠµŃ‚Š° регистра). -SUBSTITUTE = ŠŸŠžŠ”Š”Š¢ŠŠ’Š˜Š¢Š¬ ## Š—Š°Š¼ŠµŠ½ŃŠµŃ‚ в текстовой строке старый текст новым. -T = Š¢ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚Ń‹ в текст. -TEXT = Š¢Š•ŠšŠ”Š¢ ## Š¤Š¾Ń€Š¼Š°Ń‚ŠøŃ€ŃƒŠµŃ‚ число Šø ŠæŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ его в текст. -TRIM = Š”Š–ŠŸŠ ŠžŠ‘Š•Š›Š« ## Š£Š“Š°Š»ŃŠµŃ‚ ŠøŠ· текста пробелы. -UPPER = ŠŸŠ ŠžŠŸŠ˜Š”Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ все Š±ŃƒŠŗŠ²Ń‹ текста в прописные. -VALUE = Š—ŠŠŠ§Š•Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ текстовый Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ в число. diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/cs/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/cs/config deleted file mode 100644 index df51373..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/cs/config +++ /dev/null @@ -1,23 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = Kč - - -## -## Excel Error Codes (For future use) -## -NULL = #NULL! -DIV0 = #DIV/0! -VALUE = #HODNOTA! -REF = #REF! -NAME = #NƁZEV? -NUM = #NUM! -NA = #N/A diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/cs/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/cs/functions deleted file mode 100644 index 733d406..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/cs/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions Funkce doplňkÅÆ a automatizace -## -GETPIVOTDATA = ZƍSKATKONTDATA ## VrĆ”tĆ­ data uloženĆ” v kontingenčnĆ­ tabulce. PomocĆ­ funkce ZƍSKATKONTDATA můžete načƭst souhrnnĆ” data z kontingenčnĆ­ tabulky, pokud jsou tato data v kontingenčnĆ­ sestavě zobrazena. - - -## -## Cube functions Funkce pro prĆ”ci s krychlemi -## -CUBEKPIMEMBER = CUBEKPIMEMBER ## VrĆ”tĆ­ nĆ”zev, vlastnost a velikost klƭčovĆ©ho ukazatele výkonu (KUV) a zobrazĆ­ v buňce nĆ”zev a vlastnost. Klƭčový ukazatel výkonu je kvantifikovatelnĆ” veličina, například hrubý měsƭčnĆ­ zisk nebo čtvrtletnĆ­ obrat na zaměstnance, kterĆ” se používĆ” pro sledovĆ”nĆ­ výkonnosti organizace. -CUBEMEMBER = CUBEMEMBER ## VrĆ”tĆ­ člen nebo n-tici v hierarchii krychle. Slouží k ověřenĆ­, zda v krychli existuje člen nebo n-tice. -CUBEMEMBERPROPERTY = CUBEMEMBERPROPERTY ## VrĆ”tĆ­ hodnotu vlastnosti člena v krychli. Slouží k ověřenĆ­, zda v krychli existuje člen s daným nĆ”zvem, a k vrĆ”cenĆ­ konkrĆ©tnĆ­ vlastnosti tohoto člena. -CUBERANKEDMEMBER = CUBERANKEDMEMBER ## VrĆ”tĆ­ n-tý nebo pořadový člen sady. Použijte ji pro vrĆ”cenĆ­ jednoho nebo vĆ­ce prvkÅÆ sady, například obchodnĆ­ka s nejvyŔŔím obratem nebo deseti nejlepŔích studentÅÆ. -CUBESET = CUBESET ## Definuje vypočtenou sadu členÅÆ nebo n-tic odeslĆ”nĆ­m výrazu sady do krychle na serveru, který vytvoří sadu a potom ji vrĆ”tĆ­ do aplikace Microsoft Office Excel. -CUBESETCOUNT = CUBESETCOUNT ## VrĆ”tĆ­ počet položek v množině -CUBEVALUE = CUBEVALUE ## VrĆ”tĆ­ Ćŗhrnnou hodnotu z krychle. - - -## -## Database functions Funkce databĆ”ze -## -DAVERAGE = DPRÅ®MĚR ## VrĆ”tĆ­ prÅÆměr vybraných položek databĆ”ze. -DCOUNT = DPOČET ## SpočƭtĆ” buňky databĆ”ze obsahujĆ­cĆ­ čƭsla. -DCOUNTA = DPOČET2 ## SpočƭtĆ” buňky databĆ”ze, kterĆ© nejsou prĆ”zdnĆ©. -DGET = DZƍSKAT ## Extrahuje z databĆ”ze jeden zĆ”znam splňujĆ­cĆ­ zadanĆ” kritĆ©ria. -DMAX = DMAX ## VrĆ”tĆ­ maximĆ”lnĆ­ hodnotu z vybraných položek databĆ”ze. -DMIN = DMIN ## VrĆ”tĆ­ minimĆ”lnĆ­ hodnotu z vybraných položek databĆ”ze. -DPRODUCT = DSOUČIN ## VynĆ”sobĆ­ hodnoty určitĆ©ho pole zĆ”znamÅÆ v databĆ”zi, kterĆ© splňujĆ­ danĆ” kritĆ©ria. -DSTDEV = DSMODCH.VƝBĚR ## Odhadne směrodatnou odchylku výběru vybraných položek databĆ”ze. -DSTDEVP = DSMODCH ## Vypočte směrodatnou odchylku zĆ”kladnĆ­ho souboru vybraných položek databĆ”ze. -DSUM = DSUMA ## Sečte čƭsla ve sloupcovĆ©m poli zĆ”znamÅÆ databĆ”ze, kterĆ” splňujĆ­ danĆ” kritĆ©ria. -DVAR = DVAR.VƝBĚR ## Odhadne rozptyl výběru vybraných položek databĆ”ze. -DVARP = DVAR ## Vypočte rozptyl zĆ”kladnĆ­ho souboru vybraných položek databĆ”ze. - - -## -## Date and time functions Funkce data a času -## -DATE = DATUM ## VrĆ”tĆ­ pořadovĆ© čƭslo určitĆ©ho data. -DATEVALUE = DATUMHODN ## Převede datum ve formě textu na pořadovĆ© čƭslo. -DAY = DEN ## Převede pořadovĆ© čƭslo na den v měsĆ­ci. -DAYS360 = ROK360 ## VrĆ”tĆ­ počet dnĆ­ mezi dvěma daty na zĆ”kladě roku s 360 dny. -EDATE = EDATE ## VrĆ”tĆ­ pořadovĆ© čƭslo data, kterĆ© označuje určený počet měsĆ­cÅÆ před nebo po poÄĆ”tečnĆ­m datu. -EOMONTH = EOMONTH ## VrĆ”tĆ­ pořadovĆ© čƭslo poslednĆ­ho dne měsĆ­ce před nebo po zadanĆ©m počtu měsĆ­cÅÆ. -HOUR = HODINA ## Převede pořadovĆ© čƭslo na hodinu. -MINUTE = MINUTA ## Převede pořadovĆ© čƭslo na minutu. -MONTH = MĚSƍC ## Převede pořadovĆ© čƭslo na měsĆ­c. -NETWORKDAYS = NETWORKDAYS ## VrĆ”tĆ­ počet celých pracovnĆ­ch dnĆ­ mezi dvěma daty. -NOW = NYNƍ ## VrĆ”tĆ­ pořadovĆ© čƭslo aktuĆ”lnĆ­ho data a času. -SECOND = SEKUNDA ## Převede pořadovĆ© čƭslo na sekundu. -TIME = ČAS ## VrĆ”tĆ­ pořadovĆ© čƭslo určitĆ©ho času. -TIMEVALUE = ČASHODN ## Převede čas ve formě textu na pořadovĆ© čƭslo. -TODAY = DNES ## VrĆ”tĆ­ pořadovĆ© čƭslo dneÅ”nĆ­ho data. -WEEKDAY = DENTƝDNE ## Převede pořadovĆ© čƭslo na den v týdnu. -WEEKNUM = WEEKNUM ## Převede pořadovĆ© čƭslo na čƭslo představujĆ­cĆ­ čƭselnou pozici týdne v roce. -WORKDAY = WORKDAY ## VrĆ”tĆ­ pořadovĆ© čƭslo data před nebo po zadanĆ©m počtu pracovnĆ­ch dnĆ­. -YEAR = ROK ## Převede pořadovĆ© čƭslo na rok. -YEARFRAC = YEARFRAC ## VrĆ”tĆ­ ÄĆ”st roku vyjĆ”dřenou zlomkem a představujĆ­cĆ­ počet celých dnĆ­ mezi poÄĆ”tečnĆ­m a koncovým datem. - - -## -## Engineering functions InženýrskĆ© funkce (TechnickĆ© funkce) -## -BESSELI = BESSELI ## VrĆ”tĆ­ modifikovanou Besselovu funkci In(x). -BESSELJ = BESSELJ ## VrĆ”tĆ­ modifikovanou Besselovu funkci Jn(x). -BESSELK = BESSELK ## VrĆ”tĆ­ modifikovanou Besselovu funkci Kn(x). -BESSELY = BESSELY ## VrĆ”tĆ­ Besselovu funkci Yn(x). -BIN2DEC = BIN2DEC ## Převede binĆ”rnĆ­ čƭslo na desĆ­tkovĆ©. -BIN2HEX = BIN2HEX ## Převede binĆ”rnĆ­ čƭslo na Å”estnĆ”ctkovĆ©. -BIN2OCT = BIN2OCT ## Převede binĆ”rnĆ­ čƭslo na osmičkovĆ©. -COMPLEX = COMPLEX ## Převede reĆ”lnou a imaginĆ”rnĆ­ ÄĆ”st na komplexnĆ­ čƭslo. -CONVERT = CONVERT ## Převede čƭslo do jinĆ©ho jednotkovĆ©ho měrnĆ©ho systĆ©mu. -DEC2BIN = DEC2BIN ## Převede desĆ­tkovĆ©ho čƭsla na dvojkovĆ© -DEC2HEX = DEC2HEX ## Převede desĆ­tkovĆ© čƭslo na Å”estnĆ”ctkovĆ©. -DEC2OCT = DEC2OCT ## Převede desĆ­tkovĆ© čƭslo na osmičkovĆ©. -DELTA = DELTA ## Testuje rovnost dvou hodnot. -ERF = ERF ## VrĆ”tĆ­ chybovou funkci. -ERFC = ERFC ## VrĆ”tĆ­ doplňkovou chybovou funkci. -GESTEP = GESTEP ## Testuje, zda je čƭslo větŔí než meznĆ­ hodnota. -HEX2BIN = HEX2BIN ## Převede Å”estnĆ”ctkovĆ© čƭslo na binĆ”rnĆ­. -HEX2DEC = HEX2DEC ## Převede Å”estnĆ”ctkovĆ© čƭslo na desĆ­tkovĆ©. -HEX2OCT = HEX2OCT ## Převede Å”estnĆ”ctkovĆ© čƭslo na osmičkovĆ©. -IMABS = IMABS ## VrĆ”tĆ­ absolutnĆ­ hodnotu (modul) komplexnĆ­ho čƭsla. -IMAGINARY = IMAGINARY ## VrĆ”tĆ­ imaginĆ”rnĆ­ ÄĆ”st komplexnĆ­ho čƭsla. -IMARGUMENT = IMARGUMENT ## VrĆ”tĆ­ argument thĆ©ta, Ćŗhel vyjĆ”dřený v radiĆ”nech. -IMCONJUGATE = IMCONJUGATE ## VrĆ”tĆ­ komplexně sdruženĆ© čƭslo ke komplexnĆ­mu čƭslu. -IMCOS = IMCOS ## VrĆ”tĆ­ kosinus komplexnĆ­ho čƭsla. -IMDIV = IMDIV ## VrĆ”tĆ­ podĆ­l dvou komplexnĆ­ch čƭsel. -IMEXP = IMEXP ## VrĆ”tĆ­ exponenciĆ”lnĆ­ tvar komplexnĆ­ho čƭsla. -IMLN = IMLN ## VrĆ”tĆ­ přirozený logaritmus komplexnĆ­ho čƭsla. -IMLOG10 = IMLOG10 ## VrĆ”tĆ­ dekadický logaritmus komplexnĆ­ho čƭsla. -IMLOG2 = IMLOG2 ## VrĆ”tĆ­ logaritmus komplexnĆ­ho čƭsla při zĆ”kladu 2. -IMPOWER = IMPOWER ## VrĆ”tĆ­ komplexnĆ­ čƭslo umocněnĆ© na celĆ© čƭslo. -IMPRODUCT = IMPRODUCT ## VrĆ”tĆ­ součin komplexnĆ­ch čƭsel. -IMREAL = IMREAL ## VrĆ”tĆ­ reĆ”lnou ÄĆ”st komplexnĆ­ho čƭsla. -IMSIN = IMSIN ## VrĆ”tĆ­ sinus komplexnĆ­ho čƭsla. -IMSQRT = IMSQRT ## VrĆ”tĆ­ druhou odmocninu komplexnĆ­ho čƭsla. -IMSUB = IMSUB ## VrĆ”tĆ­ rozdĆ­l mezi dvěma komplexnĆ­mi čƭsly. -IMSUM = IMSUM ## VrĆ”tĆ­ součet dvou komplexnĆ­ch čƭsel. -OCT2BIN = OCT2BIN ## Převede osmičkovĆ© čƭslo na binĆ”rnĆ­. -OCT2DEC = OCT2DEC ## Převede osmičkovĆ© čƭslo na desĆ­tkovĆ©. -OCT2HEX = OCT2HEX ## Převede osmičkovĆ© čƭslo na Å”estnĆ”ctkovĆ©. - - -## -## Financial functions FinančnĆ­ funkce -## -ACCRINT = ACCRINT ## VrĆ”tĆ­ nahromaděný Ćŗrok z cennĆ©ho papĆ­ru, ze kterĆ©ho je Ćŗrok placen v pravidelných termĆ­nech. -ACCRINTM = ACCRINTM ## VrĆ”tĆ­ nahromaděný Ćŗrok z cennĆ©ho papĆ­ru, ze kterĆ©ho je Ćŗrok placen k datu splatnosti. -AMORDEGRC = AMORDEGRC ## VrĆ”tĆ­ lineĆ”rnĆ­ amortizaci v každĆ©m ĆŗÄetnĆ­m obdobĆ­ pomocĆ­ koeficientu amortizace. -AMORLINC = AMORLINC ## VrĆ”tĆ­ lineĆ”rnĆ­ amortizaci v každĆ©m ĆŗÄetnĆ­m obdobĆ­. -COUPDAYBS = COUPDAYBS ## VrĆ”tĆ­ počet dnÅÆ od zaÄĆ”tku obdobĆ­ placenĆ­ kupónÅÆ do data splatnosti. -COUPDAYS = COUPDAYS ## VrĆ”tĆ­ počet dnÅÆ v obdobĆ­ placenĆ­ kupónÅÆ, kterĆ© obsahuje den zĆŗÄtovĆ”nĆ­. -COUPDAYSNC = COUPDAYSNC ## VrĆ”tĆ­ počet dnÅÆ od data zĆŗÄtovĆ”nĆ­ do nĆ”sledujĆ­cĆ­ho data placenĆ­ kupónu. -COUPNCD = COUPNCD ## VrĆ”tĆ­ nĆ”sledujĆ­cĆ­ datum placenĆ­ kupónu po datu zĆŗÄtovĆ”nĆ­. -COUPNUM = COUPNUM ## VrĆ”tĆ­ počet kupónÅÆ splatných mezi datem zĆŗÄtovĆ”nĆ­ a datem splatnosti. -COUPPCD = COUPPCD ## VrĆ”tĆ­ předchozĆ­ datum placenĆ­ kupónu před datem zĆŗÄtovĆ”nĆ­. -CUMIPMT = CUMIPMT ## VrĆ”tĆ­ kumulativnĆ­ Ćŗrok splacený mezi dvěma obdobĆ­mi. -CUMPRINC = CUMPRINC ## VrĆ”tĆ­ kumulativnĆ­ jistinu splacenou mezi dvěma obdobĆ­mi pÅÆjčky. -DB = ODPIS.ZRYCH ## VrĆ”tĆ­ odpis aktiva za určitĆ© obdobĆ­ pomocĆ­ degresivnĆ­ metody odpisu s pevným zÅÆstatkem. -DDB = ODPIS.ZRYCH2 ## VrĆ”tĆ­ odpis aktiva za určitĆ© obdobĆ­ pomocĆ­ dvojitĆ© degresivnĆ­ metody odpisu nebo jinĆ© metody, kterou zadĆ”te. -DISC = DISC ## VrĆ”tĆ­ diskontnĆ­ sazbu cennĆ©ho papĆ­ru. -DOLLARDE = DOLLARDE ## Převede ÄĆ”stku v korunĆ”ch vyjĆ”dřenou zlomkem na ÄĆ”stku v korunĆ”ch vyjĆ”dřenou desetinným čƭslem. -DOLLARFR = DOLLARFR ## Převede ÄĆ”stku v korunĆ”ch vyjĆ”dřenou desetinným čƭslem na ÄĆ”stku v korunĆ”ch vyjĆ”dřenou zlomkem. -DURATION = DURATION ## VrĆ”tĆ­ ročnĆ­ dobu cennĆ©ho papĆ­ru s pravidelnými Ćŗrokovými sazbami. -EFFECT = EFFECT ## VrĆ”tĆ­ efektivnĆ­ ročnĆ­ Ćŗrokovou sazbu. -FV = BUDHODNOTA ## VrĆ”tĆ­ budoucĆ­ hodnotu investice. -FVSCHEDULE = FVSCHEDULE ## VrĆ”tĆ­ budoucĆ­ hodnotu poÄĆ”tečnĆ­ jistiny po použitĆ­ sĆ©rie sazeb složitĆ©ho Ćŗroku. -INTRATE = INTRATE ## VrĆ”tĆ­ Ćŗrokovou sazbu plně investovanĆ©ho cennĆ©ho papĆ­ru. -IPMT = PLATBA.ÚROK ## VrĆ”tĆ­ výŔku Ćŗroku investice za danĆ© obdobĆ­. -IRR = MƍRA.VƝNOSNOSTI ## VrĆ”tĆ­ vnitřnĆ­ výnosovĆ© procento sĆ©rie peněžnĆ­ch tokÅÆ. -ISPMT = ISPMT ## Vypočte výŔi Ćŗroku z investice zaplacenĆ©ho během určitĆ©ho obdobĆ­. -MDURATION = MDURATION ## VrĆ”tĆ­ Macauleyho modifikovanou dobu cennĆ©ho papĆ­ru o nominĆ”lnĆ­ hodnotě 100 Kč. -MIRR = MOD.MƍRA.VƝNOSNOSTI ## VrĆ”tĆ­ vnitřnĆ­ sazbu výnosu, přičemž kladnĆ© a zĆ”pornĆ© hodnoty peněžnĆ­ch prostředkÅÆ jsou financovĆ”ny podle rÅÆzných sazeb. -NOMINAL = NOMINAL ## VrĆ”tĆ­ nominĆ”lnĆ­ ročnĆ­ Ćŗrokovou sazbu. -NPER = POČET.OBDOBƍ ## VrĆ”tĆ­ počet obdobĆ­ pro investici. -NPV = ČISTƁ.SOUČHODNOTA ## VrĆ”tĆ­ čistou současnou hodnotu investice vypočƭtanou na zĆ”kladě sĆ©rie pravidelných peněžnĆ­ch tokÅÆ a diskontnĆ­ sazby. -ODDFPRICE = ODDFPRICE ## VrĆ”tĆ­ cenu cennĆ©ho papĆ­ru o nominĆ”lnĆ­ hodnotě 100 Kč s odliÅ”ným prvnĆ­m obdobĆ­m. -ODDFYIELD = ODDFYIELD ## VrĆ”tĆ­ výnos cennĆ©ho papĆ­ru s odliÅ”ným prvnĆ­m obdobĆ­m. -ODDLPRICE = ODDLPRICE ## VrĆ”tĆ­ cenu cennĆ©ho papĆ­ru o nominĆ”lnĆ­ hodnotě 100 Kč s odliÅ”ným poslednĆ­m obdobĆ­m. -ODDLYIELD = ODDLYIELD ## VrĆ”tĆ­ výnos cennĆ©ho papĆ­ru s odliÅ”ným poslednĆ­m obdobĆ­m. -PMT = PLATBA ## VrĆ”tĆ­ hodnotu pravidelnĆ© splĆ”tky anuity. -PPMT = PLATBA.ZƁKLAD ## VrĆ”tĆ­ hodnotu splĆ”tky jistiny pro zadanou investici za danĆ© obdobĆ­. -PRICE = PRICE ## VrĆ”tĆ­ cenu cennĆ©ho papĆ­ru o nominĆ”lnĆ­ hodnotě 100 Kč, ze kterĆ©ho je Ćŗrok placen v pravidelných termĆ­nech. -PRICEDISC = PRICEDISC ## VrĆ”tĆ­ cenu diskontnĆ­ho cennĆ©ho papĆ­ru o nominĆ”lnĆ­ hodnotě 100 Kč. -PRICEMAT = PRICEMAT ## VrĆ”tĆ­ cenu cennĆ©ho papĆ­ru o nominĆ”lnĆ­ hodnotě 100 Kč, ze kterĆ©ho je Ćŗrok placen k datu splatnosti. -PV = SOUČHODNOTA ## VrĆ”tĆ­ současnou hodnotu investice. -RATE = ÚROKOVƁ.MƍRA ## VrĆ”tĆ­ Ćŗrokovou sazbu vztaženou na obdobĆ­ anuity. -RECEIVED = RECEIVED ## VrĆ”tĆ­ ÄĆ”stku obdrženou k datu splatnosti plně investovanĆ©ho cennĆ©ho papĆ­ru. -SLN = ODPIS.LIN ## VrĆ”tĆ­ přímĆ© odpisy aktiva pro jedno obdobĆ­. -SYD = ODPIS.NELIN ## VrĆ”tĆ­ směrnĆ© čƭslo ročnĆ­ch odpisÅÆ aktiva pro zadanĆ© obdobĆ­. -TBILLEQ = TBILLEQ ## VrĆ”tĆ­ výnos směnky stĆ”tnĆ­ pokladny ekvivalentnĆ­ výnosu obligace. -TBILLPRICE = TBILLPRICE ## VrĆ”tĆ­ cenu směnky stĆ”tnĆ­ pokladny o nominĆ”lnĆ­ hodnotě 100 Kč. -TBILLYIELD = TBILLYIELD ## VrĆ”tĆ­ výnos směnky stĆ”tnĆ­ pokladny. -VDB = ODPIS.ZA.INT ## VrĆ”tĆ­ odpis aktiva pro určitĆ© obdobĆ­ nebo ÄĆ”st obdobĆ­ pomocĆ­ degresivnĆ­ metody odpisu. -XIRR = XIRR ## VrĆ”tĆ­ vnitřnĆ­ výnosnost pro harmonogram peněžnĆ­ch tokÅÆ, který nemusĆ­ být nutně periodický. -XNPV = XNPV ## VrĆ”tĆ­ čistou současnou hodnotu pro harmonogram peněžnĆ­ch tokÅÆ, který nemusĆ­ být nutně periodický. -YIELD = YIELD ## VrĆ”tĆ­ výnos cennĆ©ho papĆ­ru, ze kterĆ©ho je Ćŗrok placen v pravidelných termĆ­nech. -YIELDDISC = YIELDDISC ## VrĆ”tĆ­ ročnĆ­ výnos diskontnĆ­ho cennĆ©ho papĆ­ru, například směnky stĆ”tnĆ­ pokladny. -YIELDMAT = YIELDMAT ## VrĆ”tĆ­ ročnĆ­ výnos cennĆ©ho papĆ­ru, ze kterĆ©ho je Ćŗrok placen k datu splatnosti. - - -## -## Information functions InformačnĆ­ funkce -## -CELL = POLƍČKO ## VrĆ”tĆ­ informace o formĆ”tovĆ”nĆ­, umĆ­stěnĆ­ nebo obsahu buňky. -ERROR.TYPE = CHYBA.TYP ## VrĆ”tĆ­ čƭslo odpovĆ­dajĆ­cĆ­ typu chyby. -INFO = O.PROSTŘEDƍ ## VrĆ”tĆ­ informace o aktuĆ”lnĆ­m pracovnĆ­m prostředĆ­. -ISBLANK = JE.PRƁZDNƉ ## VrĆ”tĆ­ hodnotu PRAVDA, pokud se argument hodnota odkazuje na prĆ”zdnou buňku. -ISERR = JE.CHYBA ## VrĆ”tĆ­ hodnotu PRAVDA, pokud je argument hodnota libovolnĆ” chybovĆ” hodnota (kromě #N/A). -ISERROR = JE.CHYBHODN ## VrĆ”tĆ­ hodnotu PRAVDA, pokud je argument hodnota libovolnĆ” chybovĆ” hodnota. -ISEVEN = ISEVEN ## VrĆ”tĆ­ hodnotu PRAVDA, pokud je čƭslo sudĆ©. -ISLOGICAL = JE.LOGHODN ## VrĆ”tĆ­ hodnotu PRAVDA, pokud je argument hodnota logickĆ” hodnota. -ISNA = JE.NEDEF ## VrĆ”tĆ­ hodnotu PRAVDA, pokud je argument hodnota chybovĆ” hodnota #N/A. -ISNONTEXT = JE.NETEXT ## VrĆ”tĆ­ hodnotu PRAVDA, pokud argument hodnota nenĆ­ text. -ISNUMBER = JE.ČƍSLO ## VrĆ”tĆ­ hodnotu PRAVDA, pokud je argument hodnota čƭslo. -ISODD = ISODD ## VrĆ”tĆ­ hodnotu PRAVDA, pokud je čƭslo lichĆ©. -ISREF = JE.ODKAZ ## VrĆ”tĆ­ hodnotu PRAVDA, pokud je argument hodnota odkaz. -ISTEXT = JE.TEXT ## VrĆ”tĆ­ hodnotu PRAVDA, pokud je argument hodnota text. -N = N ## VrĆ”tĆ­ hodnotu převedenou na čƭslo. -NA = NEDEF ## VrĆ”tĆ­ chybovou hodnotu #N/A. -TYPE = TYP ## VrĆ”tĆ­ čƭslo označujĆ­cĆ­ datový typ hodnoty. - - -## -## Logical functions LogickĆ© funkce -## -AND = A ## VrĆ”tĆ­ hodnotu PRAVDA, majĆ­-li vÅ”echny argumenty hodnotu PRAVDA. -FALSE = NEPRAVDA ## VrĆ”tĆ­ logickou hodnotu NEPRAVDA. -IF = KDYŽ ## Určƭ, který logický test mĆ” proběhnout. -IFERROR = IFERROR ## Pokud je vzorec vyhodnocen jako chyba, vrĆ”tĆ­ zadanou hodnotu. V opačnĆ©m případě vrĆ”tĆ­ výsledek vzorce. -NOT = NE ## Provede logickou negaci argumentu funkce. -OR = NEBO ## VrĆ”tĆ­ hodnotu PRAVDA, je-li alespoň jeden argument roven hodnotě PRAVDA. -TRUE = PRAVDA ## VrĆ”tĆ­ logickou hodnotu PRAVDA. - - -## -## Lookup and reference functions VyhledĆ”vacĆ­ funkce -## -ADDRESS = ODKAZ ## VrĆ”tĆ­ textový odkaz na jednu buňku listu. -AREAS = POČET.BLOKÅ® ## VrĆ”tĆ­ počet oblastĆ­ v odkazu. -CHOOSE = ZVOLIT ## ZvolĆ­ hodnotu ze seznamu hodnot. -COLUMN = SLOUPEC ## VrĆ”tĆ­ čƭslo sloupce odkazu. -COLUMNS = SLOUPCE ## VrĆ”tĆ­ počet sloupcÅÆ v odkazu. -HLOOKUP = VVYHLEDAT ## ProhledĆ” hornĆ­ řÔdek matice a vrĆ”tĆ­ hodnotu určenĆ© buňky. -HYPERLINK = HYPERTEXTOVƝ.ODKAZ ## Vytvoří zĆ”stupce nebo odkaz, který otevře dokument uložený na sĆ­Å„ovĆ©m serveru, v sĆ­ti intranet nebo Internet. -INDEX = INDEX ## PomocĆ­ rejstříku zvolĆ­ hodnotu z odkazu nebo matice. -INDIRECT = NEPÅ˜ĆMƝ.ODKAZ ## VrĆ”tĆ­ odkaz určený textovou hodnotou. -LOOKUP = VYHLEDAT ## VyhledĆ” hodnoty ve vektoru nebo matici. -MATCH = POZVYHLEDAT ## VyhledĆ” hodnoty v odkazu nebo matici. -OFFSET = POSUN ## VrĆ”tĆ­ posun odkazu od zadanĆ©ho odkazu. -ROW = ŘÁDEK ## VrĆ”tĆ­ čƭslo řÔdku odkazu. -ROWS = ŘÁDKY ## VrĆ”tĆ­ počet řÔdkÅÆ v odkazu. -RTD = RTD ## Načte data reĆ”lnĆ©ho času z programu, který podporuje automatizaci modelu COM (Automatizace: ZpÅÆsob prĆ”ce s objekty určitĆ© aplikace z jinĆ© aplikace nebo nĆ”stroje pro vývoj. Automatizace (dříve nazývanĆ” automatizace OLE) je počƭtačovým standardem a je funkcĆ­ modelu COM (Component Object Model).). -TRANSPOSE = TRANSPOZICE ## VrĆ”tĆ­ transponovanou matici. -VLOOKUP = SVYHLEDAT ## ProhledĆ” prvnĆ­ sloupec matice, přesune kurzor v řÔdku a vrĆ”tĆ­ hodnotu buňky. - - -## -## Math and trigonometry functions MatematickĆ© a trigonometrickĆ© funkce -## -ABS = ABS ## VrĆ”tĆ­ absolutnĆ­ hodnotu čƭsla. -ACOS = ARCCOS ## VrĆ”tĆ­ arkuskosinus čƭsla. -ACOSH = ARCCOSH ## VrĆ”tĆ­ hyperbolický arkuskosinus čƭsla. -ASIN = ARCSIN ## VrĆ”tĆ­ arkussinus čƭsla. -ASINH = ARCSINH ## VrĆ”tĆ­ hyperbolický arkussinus čƭsla. -ATAN = ARCTG ## VrĆ”tĆ­ arkustangens čƭsla. -ATAN2 = ARCTG2 ## VrĆ”tĆ­ arkustangens x-ovĆ© a y-ovĆ© souřadnice. -ATANH = ARCTGH ## VrĆ”tĆ­ hyperbolický arkustangens čƭsla. -CEILING = ZAOKR.NAHORU ## ZaokrouhlĆ­ čƭslo na nejbližŔí celĆ© čƭslo nebo na nejbližŔí nĆ”sobek zadanĆ© hodnoty. -COMBIN = KOMBINACE ## VrĆ”tĆ­ počet kombinacĆ­ pro daný počet položek. -COS = COS ## VrĆ”tĆ­ kosinus čƭsla. -COSH = COSH ## VrĆ”tĆ­ hyperbolický kosinus čƭsla. -DEGREES = DEGREES ## Převede radiĆ”ny na stupně. -EVEN = ZAOKROUHLIT.NA.SUDƉ ## ZaokrouhlĆ­ čƭslo nahoru na nejbližŔí celĆ© sudĆ© čƭslo. -EXP = EXP ## VrĆ”tĆ­ zĆ”klad přirozenĆ©ho logaritmu e umocněný na zadanĆ© čƭslo. -FACT = FAKTORIƁL ## VrĆ”tĆ­ faktoriĆ”l čƭsla. -FACTDOUBLE = FACTDOUBLE ## VrĆ”tĆ­ dvojitý faktoriĆ”l čƭsla. -FLOOR = ZAOKR.DOLÅ® ## ZaokrouhlĆ­ čƭslo dolÅÆ, směrem k nule. -GCD = GCD ## VrĆ”tĆ­ největŔí společný dělitel. -INT = CELƁ.ČÁST ## ZaokrouhlĆ­ čƭslo dolÅÆ na nejbližŔí celĆ© čƭslo. -LCM = LCM ## VrĆ”tĆ­ nejmenŔí společný nĆ”sobek. -LN = LN ## VrĆ”tĆ­ přirozený logaritmus čƭsla. -LOG = LOGZ ## VrĆ”tĆ­ logaritmus čƭsla při zadanĆ©m zĆ”kladu. -LOG10 = LOG ## VrĆ”tĆ­ dekadický logaritmus čƭsla. -MDETERM = DETERMINANT ## VrĆ”tĆ­ determinant matice. -MINVERSE = INVERZE ## VrĆ”tĆ­ inverznĆ­ matici. -MMULT = SOUČIN.MATIC ## VrĆ”tĆ­ součin dvou matic. -MOD = MOD ## VrĆ”tĆ­ zbytek po dělenĆ­. -MROUND = MROUND ## VrĆ”tĆ­ čƭslo zaokrouhlenĆ© na požadovaný nĆ”sobek. -MULTINOMIAL = MULTINOMIAL ## VrĆ”tĆ­ mnohočlen z množiny čƭsel. -ODD = ZAOKROUHLIT.NA.LICHƉ ## ZaokrouhlĆ­ čƭslo nahoru na nejbližŔí celĆ© lichĆ© čƭslo. -PI = PI ## VrĆ”tĆ­ hodnotu čƭsla pĆ­. -POWER = POWER ## UmocnĆ­ čƭslo na zadanou mocninu. -PRODUCT = SOUČIN ## VynĆ”sobĆ­ argumenty funkce. -QUOTIENT = QUOTIENT ## VrĆ”tĆ­ celou ÄĆ”st dělenĆ­. -RADIANS = RADIANS ## Převede stupně na radiĆ”ny. -RAND = NƁHČƍSLO ## VrĆ”tĆ­ nĆ”hodnĆ© čƭslo mezi 0 a 1. -RANDBETWEEN = RANDBETWEEN ## VrĆ”tĆ­ nĆ”hodnĆ© čƭslo mezi zadanými čƭsly. -ROMAN = ROMAN ## Převede arabskou čƭslici na římskou ve formĆ”tu textu. -ROUND = ZAOKROUHLIT ## ZaokrouhlĆ­ čƭslo na zadaný počet čƭslic. -ROUNDDOWN = ROUNDDOWN ## ZaokrouhlĆ­ čƭslo dolÅÆ, směrem k nule. -ROUNDUP = ROUNDUP ## ZaokrouhlĆ­ čƭslo nahoru, směrem od nuly. -SERIESSUM = SERIESSUM ## VrĆ”tĆ­ součet mocninnĆ© řady určenĆ© podle vzorce. -SIGN = SIGN ## VrĆ”tĆ­ znamĆ©nko čƭsla. -SIN = SIN ## VrĆ”tĆ­ sinus danĆ©ho Ćŗhlu. -SINH = SINH ## VrĆ”tĆ­ hyperbolický sinus čƭsla. -SQRT = ODMOCNINA ## VrĆ”tĆ­ kladnou druhou odmocninu. -SQRTPI = SQRTPI ## VrĆ”tĆ­ druhou odmocninu výrazu (čƭslo * pĆ­). -SUBTOTAL = SUBTOTAL ## VrĆ”tĆ­ souhrn v seznamu nebo databĆ”zi. -SUM = SUMA ## Sečte argumenty funkce. -SUMIF = SUMIF ## Sečte buňky vybranĆ© podle zadaných kritĆ©riĆ­. -SUMIFS = SUMIFS ## Sečte buňky určenĆ© vĆ­ce zadanými podmĆ­nkami. -SUMPRODUCT = SOUČIN.SKALƁRNƍ ## VrĆ”tĆ­ součet součinÅÆ odpovĆ­dajĆ­cĆ­ch prvkÅÆ matic. -SUMSQ = SUMA.ČTVERCÅ® ## VrĆ”tĆ­ součet čtvercÅÆ argumentÅÆ. -SUMX2MY2 = SUMX2MY2 ## VrĆ”tĆ­ součet rozdĆ­lu čtvercÅÆ odpovĆ­dajĆ­cĆ­ch hodnot ve dvou maticĆ­ch. -SUMX2PY2 = SUMX2PY2 ## VrĆ”tĆ­ součet součtu čtvercÅÆ odpovĆ­dajĆ­cĆ­ch hodnot ve dvou maticĆ­ch. -SUMXMY2 = SUMXMY2 ## VrĆ”tĆ­ součet čtvercÅÆ rozdĆ­lÅÆ odpovĆ­dajĆ­cĆ­ch hodnot ve dvou maticĆ­ch. -TAN = TGTG ## VrĆ”tĆ­ tangens čƭsla. -TANH = TGH ## VrĆ”tĆ­ hyperbolický tangens čƭsla. -TRUNC = USEKNOUT ## ZkrĆ”tĆ­ čƭslo na celĆ© čƭslo. - - -## -## Statistical functions StatistickĆ© funkce -## -AVEDEV = PRÅ®MODCHYLKA ## VrĆ”tĆ­ prÅÆměrnou hodnotu absolutnĆ­ch odchylek datových bodÅÆ od jejich střednĆ­ hodnoty. -AVERAGE = PRÅ®MĚR ## VrĆ”tĆ­ prÅÆměrnou hodnotu argumentÅÆ. -AVERAGEA = AVERAGEA ## VrĆ”tĆ­ prÅÆměrnou hodnotu argumentÅÆ včetně čƭsel, textu a logických hodnot. -AVERAGEIF = AVERAGEIF ## VrĆ”tĆ­ prÅÆměrnou hodnotu (aritmetický prÅÆměr) vÅ”ech buněk v oblasti, kterĆ© vyhovujĆ­ přísluÅ”nĆ© podmĆ­nce. -AVERAGEIFS = AVERAGEIFS ## VrĆ”tĆ­ prÅÆměrnou hodnotu (aritmetický prÅÆměr) vÅ”ech buněk vyhovujĆ­cĆ­ch několika podmĆ­nkĆ”m. -BETADIST = BETADIST ## VrĆ”tĆ­ hodnotu součtovĆ©ho rozdělenĆ­ beta. -BETAINV = BETAINV ## VrĆ”tĆ­ inverznĆ­ hodnotu součtovĆ©ho rozdělenĆ­ pro zadanĆ© rozdělenĆ­ beta. -BINOMDIST = BINOMDIST ## VrĆ”tĆ­ hodnotu binomickĆ©ho rozdělenĆ­ pravděpodobnosti jednotlivých veličin. -CHIDIST = CHIDIST ## VrĆ”tĆ­ jednostrannou pravděpodobnost rozdělenĆ­ chĆ­-kvadrĆ”t. -CHIINV = CHIINV ## VrĆ”tĆ­ hodnotu funkce inverznĆ­ k distribučnĆ­ funkci jednostrannĆ© pravděpodobnosti rozdělenĆ­ chĆ­-kvadrĆ”t. -CHITEST = CHITEST ## VrĆ”tĆ­ test nezĆ”vislosti. -CONFIDENCE = CONFIDENCE ## VrĆ”tĆ­ interval spolehlivosti pro střednĆ­ hodnotu zĆ”kladnĆ­ho souboru. -CORREL = CORREL ## VrĆ”tĆ­ korelačnĆ­ koeficient mezi dvěma množinami dat. -COUNT = POČET ## VrĆ”tĆ­ počet čƭsel v seznamu argumentÅÆ. -COUNTA = POČET2 ## VrĆ”tĆ­ počet hodnot v seznamu argumentÅÆ. -COUNTBLANK = COUNTBLANK ## SpočƭtĆ” počet prĆ”zdných buněk v oblasti. -COUNTIF = COUNTIF ## SpočƭtĆ” buňky v oblasti, kterĆ© odpovĆ­dajĆ­ zadaným kritĆ©riĆ­m. -COUNTIFS = COUNTIFS ## SpočƭtĆ” buňky v oblasti, kterĆ© odpovĆ­dajĆ­ vĆ­ce kritĆ©riĆ­m. -COVAR = COVAR ## VrĆ”tĆ­ hodnotu kovariance, prÅÆměrnou hodnotu součinÅÆ pĆ”rových odchylek -CRITBINOM = CRITBINOM ## VrĆ”tĆ­ nejmenŔí hodnotu, pro kterou mĆ” součtovĆ© binomickĆ© rozdělenĆ­ hodnotu větŔí nebo rovnu hodnotě kritĆ©ria. -DEVSQ = DEVSQ ## VrĆ”tĆ­ součet čtvercÅÆ odchylek. -EXPONDIST = EXPONDIST ## VrĆ”tĆ­ hodnotu exponenciĆ”lnĆ­ho rozdělenĆ­. -FDIST = FDIST ## VrĆ”tĆ­ hodnotu rozdělenĆ­ pravděpodobnosti F. -FINV = FINV ## VrĆ”tĆ­ hodnotu inverznĆ­ funkce k distribučnĆ­ funkci rozdělenĆ­ F. -FISHER = FISHER ## VrĆ”tĆ­ hodnotu Fisherovy transformace. -FISHERINV = FISHERINV ## VrĆ”tĆ­ hodnotu inverznĆ­ funkce k Fisherově transformaci. -FORECAST = FORECAST ## VrĆ”tĆ­ hodnotu lineĆ”rnĆ­ho trendu. -FREQUENCY = ČETNOSTI ## VrĆ”tĆ­ četnost rozdělenĆ­ jako svislou matici. -FTEST = FTEST ## VrĆ”tĆ­ výsledek F-testu. -GAMMADIST = GAMMADIST ## VrĆ”tĆ­ hodnotu rozdělenĆ­ gama. -GAMMAINV = GAMMAINV ## VrĆ”tĆ­ hodnotu inverznĆ­ funkce k distribučnĆ­ funkci součtovĆ©ho rozdělenĆ­ gama. -GAMMALN = GAMMALN ## VrĆ”tĆ­ přirozený logaritmus funkce gama, Ī“(x). -GEOMEAN = GEOMEAN ## VrĆ”tĆ­ geometrický prÅÆměr. -GROWTH = LOGLINTREND ## VrĆ”tĆ­ hodnoty exponenciĆ”lnĆ­ho trendu. -HARMEAN = HARMEAN ## VrĆ”tĆ­ harmonický prÅÆměr. -HYPGEOMDIST = HYPGEOMDIST ## VrĆ”tĆ­ hodnotu hypergeometrickĆ©ho rozdělenĆ­. -INTERCEPT = INTERCEPT ## VrĆ”tĆ­ Ćŗsek lineĆ”rnĆ­ regresnĆ­ ÄĆ”ry. -KURT = KURT ## VrĆ”tĆ­ hodnotu excesu množiny dat. -LARGE = LARGE ## VrĆ”tĆ­ k-tou největŔí hodnotu množiny dat. -LINEST = LINREGRESE ## VrĆ”tĆ­ parametry lineĆ”rnĆ­ho trendu. -LOGEST = LOGLINREGRESE ## VrĆ”tĆ­ parametry exponenciĆ”lnĆ­ho trendu. -LOGINV = LOGINV ## VrĆ”tĆ­ inverznĆ­ funkci k distribučnĆ­ funkci logaritmicko-normĆ”lnĆ­ho rozdělenĆ­. -LOGNORMDIST = LOGNORMDIST ## VrĆ”tĆ­ hodnotu součtovĆ©ho logaritmicko-normĆ”lnĆ­ho rozdělenĆ­. -MAX = MAX ## VrĆ”tĆ­ maximĆ”lnĆ­ hodnotu seznamu argumentÅÆ. -MAXA = MAXA ## VrĆ”tĆ­ maximĆ”lnĆ­ hodnotu seznamu argumentÅÆ včetně čƭsel, textu a logických hodnot. -MEDIAN = MEDIAN ## VrĆ”tĆ­ střednĆ­ hodnotu zadaných čƭsel. -MIN = MIN ## VrĆ”tĆ­ minimĆ”lnĆ­ hodnotu seznamu argumentÅÆ. -MINA = MINA ## VrĆ”tĆ­ nejmenŔí hodnotu v seznamu argumentÅÆ včetně čƭsel, textu a logických hodnot. -MODE = MODE ## VrĆ”tĆ­ hodnotu, kterĆ” se v množině dat vyskytuje nejčastěji. -NEGBINOMDIST = NEGBINOMDIST ## VrĆ”tĆ­ hodnotu negativnĆ­ho binomickĆ©ho rozdělenĆ­. -NORMDIST = NORMDIST ## VrĆ”tĆ­ hodnotu normĆ”lnĆ­ho součtovĆ©ho rozdělenĆ­. -NORMINV = NORMINV ## VrĆ”tĆ­ inverznĆ­ funkci k funkci normĆ”lnĆ­ho součtovĆ©ho rozdělenĆ­. -NORMSDIST = NORMSDIST ## VrĆ”tĆ­ hodnotu standardnĆ­ho normĆ”lnĆ­ho součtovĆ©ho rozdělenĆ­. -NORMSINV = NORMSINV ## VrĆ”tĆ­ inverznĆ­ funkci k funkci standardnĆ­ho normĆ”lnĆ­ho součtovĆ©ho rozdělenĆ­. -PEARSON = PEARSON ## VrĆ”tĆ­ PearsonÅÆv výsledný momentový korelačnĆ­ koeficient. -PERCENTILE = PERCENTIL ## VrĆ”tĆ­ hodnotu k-tĆ©ho percentilu hodnot v oblasti. -PERCENTRANK = PERCENTRANK ## VrĆ”tĆ­ pořadĆ­ hodnoty v množině dat vyjĆ”dřenĆ© procentuĆ”lnĆ­ ÄĆ”stĆ­ množiny dat. -PERMUT = PERMUTACE ## VrĆ”tĆ­ počet permutacĆ­ pro zadaný počet objektÅÆ. -POISSON = POISSON ## VrĆ”tĆ­ hodnotu distribučnĆ­ funkce Poissonova rozdělenĆ­. -PROB = PROB ## VrĆ”tĆ­ pravděpodobnost výskytu hodnot v oblasti mezi dvěma meznĆ­mi hodnotami. -QUARTILE = QUARTIL ## VrĆ”tĆ­ hodnotu kvartilu množiny dat. -RANK = RANK ## VrĆ”tĆ­ pořadĆ­ čƭsla v seznamu čƭsel. -RSQ = RKQ ## VrĆ”tĆ­ druhou mocninu Pearsonova výslednĆ©ho momentovĆ©ho korelačnĆ­ho koeficientu. -SKEW = SKEW ## VrĆ”tĆ­ zeÅ”ikmenĆ­ rozdělenĆ­. -SLOPE = SLOPE ## VrĆ”tĆ­ směrnici lineĆ”rnĆ­ regresnĆ­ ÄĆ”ry. -SMALL = SMALL ## VrĆ”tĆ­ k-tou nejmenŔí hodnotu množiny dat. -STANDARDIZE = STANDARDIZE ## VrĆ”tĆ­ normalizovanou hodnotu. -STDEV = SMODCH.VƝBĚR ## Vypočte směrodatnou odchylku výběru. -STDEVA = STDEVA ## Vypočte směrodatnou odchylku výběru včetně čƭsel, textu a logických hodnot. -STDEVP = SMODCH ## Vypočte směrodatnou odchylku zĆ”kladnĆ­ho souboru. -STDEVPA = STDEVPA ## Vypočte směrodatnou odchylku zĆ”kladnĆ­ho souboru včetně čƭsel, textu a logických hodnot. -STEYX = STEYX ## VrĆ”tĆ­ standardnĆ­ chybu předpovězenĆ© hodnoty y pro každou hodnotu x v regresi. -TDIST = TDIST ## VrĆ”tĆ­ hodnotu Studentova t-rozdělenĆ­. -TINV = TINV ## VrĆ”tĆ­ inverznĆ­ funkci k distribučnĆ­ funkci Studentova t-rozdělenĆ­. -TREND = LINTREND ## VrĆ”tĆ­ hodnoty lineĆ”rnĆ­ho trendu. -TRIMMEAN = TRIMMEAN ## VrĆ”tĆ­ střednĆ­ hodnotu vnitřnĆ­ ÄĆ”sti množiny dat. -TTEST = TTEST ## VrĆ”tĆ­ pravděpodobnost spojenou se Studentovým t-testem. -VAR = VAR.VƝBĚR ## Vypočte rozptyl výběru. -VARA = VARA ## Vypočte rozptyl výběru včetně čƭsel, textu a logických hodnot. -VARP = VAR ## Vypočte rozptyl zĆ”kladnĆ­ho souboru. -VARPA = VARPA ## Vypočte rozptyl zĆ”kladnĆ­ho souboru včetně čƭsel, textu a logických hodnot. -WEIBULL = WEIBULL ## VrĆ”tĆ­ hodnotu Weibullova rozdělenĆ­. -ZTEST = ZTEST ## VrĆ”tĆ­ jednostrannou P-hodnotu z-testu. - - -## -## Text functions TextovĆ© funkce -## -ASC = ASC ## ZměnĆ­ znaky s plnou Ŕířkou (dvoubajtovĆ©)v řetězci znakÅÆ na znaky s polovičnĆ­ Ŕířkou (jednobajtovĆ©). -BAHTTEXT = BAHTTEXT ## Převede čƭslo na text ve formĆ”tu, měny ß (baht). -CHAR = ZNAK ## VrĆ”tĆ­ znak určený čƭslem kódu. -CLEAN = VYČISTIT ## Odebere z textu vÅ”echny netisknutelnĆ© znaky. -CODE = KƓD ## VrĆ”tĆ­ čƭselný kód prvnĆ­ho znaku zadanĆ©ho textovĆ©ho řetězce. -CONCATENATE = CONCATENATE ## SpojĆ­ několik textových položek do jednĆ©. -DOLLAR = KČ ## Převede čƭslo na text ve formĆ”tu měny Kč (českĆ” koruna). -EXACT = STEJNƉ ## Zkontroluje, zda jsou dvě textovĆ© hodnoty shodnĆ©. -FIND = NAJƍT ## Nalezne textovou hodnotu uvnitř jinĆ© (rozliÅ”uje malĆ” a velkĆ” pĆ­smena). -FINDB = FINDB ## Nalezne textovou hodnotu uvnitř jinĆ© (rozliÅ”uje malĆ” a velkĆ” pĆ­smena). -FIXED = ZAOKROUHLIT.NA.TEXT ## ZformĆ”tuje čƭslo jako text s pevným počtem desetinných mĆ­st. -JIS = JIS ## ZměnĆ­ znaky s polovičnĆ­ Ŕířkou (jednobajtovĆ©) v řetězci znakÅÆ na znaky s plnou Ŕířkou (dvoubajtovĆ©). -LEFT = ZLEVA ## VrĆ”tĆ­ prvnĆ­ znaky textovĆ© hodnoty umĆ­stěnĆ© nejvĆ­ce vlevo. -LEFTB = LEFTB ## VrĆ”tĆ­ prvnĆ­ znaky textovĆ© hodnoty umĆ­stěnĆ© nejvĆ­ce vlevo. -LEN = DƉLKA ## VrĆ”tĆ­ počet znakÅÆ textovĆ©ho řetězce. -LENB = LENB ## VrĆ”tĆ­ počet znakÅÆ textovĆ©ho řetězce. -LOWER = MALƁ ## Převede text na malĆ” pĆ­smena. -MID = ČÁST ## VrĆ”tĆ­ určitý počet znakÅÆ textovĆ©ho řetězce počƭnaje zadaným mĆ­stem. -MIDB = MIDB ## VrĆ”tĆ­ určitý počet znakÅÆ textovĆ©ho řetězce počƭnaje zadaným mĆ­stem. -PHONETIC = ZVUKOVƉ ## Extrahuje fonetickĆ© znaky (furigana) z textovĆ©ho řetězce. -PROPER = VELKƁ2 ## Převede prvnĆ­ pĆ­smeno každĆ©ho slova textovĆ© hodnoty na velkĆ©. -REPLACE = NAHRADIT ## NahradĆ­ znaky uvnitř textu. -REPLACEB = NAHRADITB ## NahradĆ­ znaky uvnitř textu. -REPT = OPAKOVAT ## Zopakuje text podle zadanĆ©ho počtu opakovĆ”nĆ­. -RIGHT = ZPRAVA ## VrĆ”tĆ­ prvnĆ­ znaky textovĆ© hodnoty umĆ­stěnĆ© nejvĆ­ce vpravo. -RIGHTB = RIGHTB ## VrĆ”tĆ­ prvnĆ­ znaky textovĆ© hodnoty umĆ­stěnĆ© nejvĆ­ce vpravo. -SEARCH = HLEDAT ## Nalezne textovou hodnotu uvnitř jinĆ© (malĆ” a velkĆ” pĆ­smena nejsou rozliÅ”ovĆ”na). -SEARCHB = SEARCHB ## Nalezne textovou hodnotu uvnitř jinĆ© (malĆ” a velkĆ” pĆ­smena nejsou rozliÅ”ovĆ”na). -SUBSTITUTE = DOSADIT ## V textovĆ©m řetězci nahradĆ­ starý text novým. -T = T ## Převede argumenty na text. -TEXT = HODNOTA.NA.TEXT ## ZformĆ”tuje čƭslo a převede ho na text. -TRIM = PROČISTIT ## OdstranĆ­ z textu mezery. -UPPER = VELKƁ ## Převede text na velkĆ” pĆ­smena. -VALUE = HODNOTA ## Převede textový argument na čƭslo. diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/config deleted file mode 100644 index a7aa8fe..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/config +++ /dev/null @@ -1,25 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = kr - - - -## -## Excel Error Codes (For future use) - -## -NULL = #NUL! -DIV0 = #DIVISION/0! -VALUE = #VƆRDI! -REF = #REFERENCE! -NAME = #NAVN? -NUM = #NUM! -NA = #I/T diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/functions deleted file mode 100644 index d02aa2e..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/da/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions TilfĆøjelsesprogram- og automatiseringsfunktioner -## -GETPIVOTDATA = HENTPIVOTDATA ## Returnerer data, der er lagret i en pivottabelrapport - - -## -## Cube functions Kubefunktioner -## -CUBEKPIMEMBER = KUBE.KPI.MEDLEM ## Returnerer navn, egenskab og mĆ„l for en KPI-indikator og viser navnet og egenskaben i cellen. En KPI-indikator er en mĆ„lbar stĆørrelse, f.eks. bruttooverskud pr. mĆ„ned eller personaleudskiftning pr. kvartal, der bruges til at overvĆ„ge en organisations prƦstationer. -CUBEMEMBER = KUBE.MEDLEM ## Returnerer et medlem eller en tupel fra kubehierarkiet. Bruges til at validere, om et medlem eller en tupel findes i kuben. -CUBEMEMBERPROPERTY = KUBEMEDLEM.EGENSKAB ## Returnerer vƦrdien af en egenskab for et medlem i kuben. Bruges til at validere, om et medlemsnavn findes i kuben, og returnere den angivne egenskab for medlemmet. -CUBERANKEDMEMBER = KUBEMEDLEM.RANG ## Returnerer det n'te eller rangordnede medlem i et sƦt. Bruges til at returnere et eller flere elementer i et sƦt, f.eks. topsƦlgere eller de 10 bedste elever. -CUBESET = KUBESƆT ## Definerer et beregnet sƦt medlemmer eller tupler ved at sende et sƦtudtryk til kuben pĆ„ serveren, som opretter sƦttet og returnerer det til Microsoft Office Excel. -CUBESETCOUNT = KUBESƆT.TƆL ## Returnerer antallet af elementer i et sƦt. -CUBEVALUE = KUBEVƆRDI ## Returnerer en sammenlagt (aggregeret) vƦrdi fra en kube. - - -## -## Database functions Databasefunktioner -## -DAVERAGE = DMIDDEL ## Returnerer gennemsnittet af markerede databaseposter -DCOUNT = DTƆL ## TƦller de celler, der indeholder tal, i en database -DCOUNTA = DTƆLV ## TƦller udfyldte celler i en database -DGET = DHENT ## Uddrager en enkelt post, der opfylder de angivne kriterier, fra en database -DMAX = DMAKS ## Returnerer den stĆørste vƦrdi blandt markerede databaseposter -DMIN = DMIN ## Returnerer den mindste vƦrdi blandt markerede databaseposter -DPRODUCT = DPRODUKT ## Ganger vƦrdierne i et bestemt felt med poster, der opfylder kriterierne i en database -DSTDEV = DSTDAFV ## Beregner et skĆøn over standardafvigelsen baseret pĆ„ en stikprĆøve af markerede databaseposter -DSTDEVP = DSTDAFVP ## Beregner standardafvigelsen baseret pĆ„ hele populationen af markerede databaseposter -DSUM = DSUM ## SammenlƦgger de tal i feltkolonnen i databasen, der opfylder kriterierne -DVAR = DVARIANS ## Beregner varians baseret pĆ„ en stikprĆøve af markerede databaseposter -DVARP = DVARIANSP ## Beregner varians baseret pĆ„ hele populationen af markerede databaseposter - - -## -## Date and time functions Dato- og klokkeslƦtsfunktioner -## -DATE = DATO ## Returnerer serienummeret for en bestemt dato -DATEVALUE = DATOVƆRDI ## Konverterer en dato i form af tekst til et serienummer -DAY = DAG ## Konverterer et serienummer til en dag i mĆ„neden -DAYS360 = DAGE360 ## Beregner antallet af dage mellem to datoer pĆ„ grundlag af et Ć„r med 360 dage -EDATE = EDATO ## Returnerer serienummeret for den dato, der ligger det angivne antal mĆ„neder fĆør eller efter startdatoen -EOMONTH = SLUT.Pƅ.MƅNED ## Returnerer serienummeret pĆ„ den sidste dag i mĆ„neden fĆør eller efter et angivet antal mĆ„neder -HOUR = TIME ## Konverterer et serienummer til en time -MINUTE = MINUT ## Konverterer et serienummer til et minut -MONTH = MƅNED ## Konverterer et serienummer til en mĆ„ned -NETWORKDAYS = ANTAL.ARBEJDSDAGE ## Returnerer antallet af hele arbejdsdage mellem to datoer -NOW = NU ## Returnerer serienummeret for den aktuelle dato eller det aktuelle klokkeslƦt -SECOND = SEKUND ## Konverterer et serienummer til et sekund -TIME = KLOKKESLƆT ## Returnerer serienummeret for et bestemt klokkeslƦt -TIMEVALUE = TIDSVƆRDI ## Konverterer et klokkeslƦt i form af tekst til et serienummer -TODAY = IDAG ## Returnerer serienummeret for dags dato -WEEKDAY = UGEDAG ## Konverterer et serienummer til en ugedag -WEEKNUM = UGE.NR ## Konverterer et serienummer til et tal, der angiver ugenummeret i Ć„ret -WORKDAY = ARBEJDSDAG ## Returnerer serienummeret for dagen fĆør eller efter det angivne antal arbejdsdage -YEAR = ƅR ## Konverterer et serienummer til et Ć„r -YEARFRAC = ƅR.BRƘK ## Returnerer Ć„rsbrĆøken, der reprƦsenterer antallet af hele dage mellem startdato og slutdato - - -## -## Engineering functions Tekniske funktioner -## -BESSELI = BESSELI ## Returnerer den modificerede Bessel-funktion In(x) -BESSELJ = BESSELJ ## Returnerer Bessel-funktionen Jn(x) -BESSELK = BESSELK ## Returnerer den modificerede Bessel-funktion Kn(x) -BESSELY = BESSELY ## Returnerer Bessel-funktionen Yn(x) -BIN2DEC = BIN.TIL.DEC ## Konverterer et binƦrt tal til et decimaltal -BIN2HEX = BIN.TIL.HEX ## Konverterer et binƦrt tal til et heksadecimalt tal -BIN2OCT = BIN.TIL.OKT ## Konverterer et binƦrt tal til et oktaltal. -COMPLEX = KOMPLEKS ## Konverterer reelle og imaginƦre koefficienter til et komplekst tal -CONVERT = KONVERTER ## Konverterer et tal fra Ć©n mĆ„leenhed til en anden -DEC2BIN = DEC.TIL.BIN ## Konverterer et decimaltal til et binƦrt tal -DEC2HEX = DEC.TIL.HEX ## Konverterer et decimaltal til et heksadecimalt tal -DEC2OCT = DEC.TIL.OKT ## Konverterer et decimaltal til et oktaltal -DELTA = DELTA ## Tester, om to vƦrdier er ens -ERF = FEJLFUNK ## Returner fejlfunktionen -ERFC = FEJLFUNK.KOMP ## Returnerer den komplementƦre fejlfunktion -GESTEP = GETRIN ## Tester, om et tal er stĆørre end en grƦnsevƦrdi -HEX2BIN = HEX.TIL.BIN ## Konverterer et heksadecimalt tal til et binƦrt tal -HEX2DEC = HEX.TIL.DEC ## Konverterer et decimaltal til et heksadecimalt tal -HEX2OCT = HEX.TIL.OKT ## Konverterer et heksadecimalt tal til et oktaltal -IMABS = IMAGABS ## Returnerer den absolutte vƦrdi (modulus) for et komplekst tal -IMAGINARY = IMAGINƆR ## Returnerer den imaginƦre koefficient for et komplekst tal -IMARGUMENT = IMAGARGUMENT ## Returnerer argumentet theta, en vinkel udtrykt i radianer -IMCONJUGATE = IMAGKONJUGERE ## Returnerer den komplekse konjugation af et komplekst tal -IMCOS = IMAGCOS ## Returnerer et komplekst tals cosinus -IMDIV = IMAGDIV ## Returnerer kvotienten for to komplekse tal -IMEXP = IMAGEKSP ## Returnerer et komplekst tals eksponentialfunktion -IMLN = IMAGLN ## Returnerer et komplekst tals naturlige logaritme -IMLOG10 = IMAGLOG10 ## Returnerer et komplekst tals sƦdvanlige logaritme (titalslogaritme) -IMLOG2 = IMAGLOG2 ## Returnerer et komplekst tals sƦdvanlige logaritme (totalslogaritme) -IMPOWER = IMAGPOTENS ## Returnerer et komplekst tal oplĆøftet i en heltalspotens -IMPRODUCT = IMAGPRODUKT ## Returnerer produktet af komplekse tal -IMREAL = IMAGREELT ## Returnerer den reelle koefficient for et komplekst tal -IMSIN = IMAGSIN ## Returnerer et komplekst tals sinus -IMSQRT = IMAGKVROD ## Returnerer et komplekst tals kvadratrod -IMSUB = IMAGSUB ## Returnerer forskellen mellem to komplekse tal -IMSUM = IMAGSUM ## Returnerer summen af komplekse tal -OCT2BIN = OKT.TIL.BIN ## Konverterer et oktaltal til et binƦrt tal -OCT2DEC = OKT.TIL.DEC ## Konverterer et oktaltal til et decimaltal -OCT2HEX = OKT.TIL.HEX ## Konverterer et oktaltal til et heksadecimalt tal - - -## -## Financial functions Finansielle funktioner -## -ACCRINT = PƅLƘBRENTE ## Returnerer den pĆ„lĆøbne rente for et vƦrdipapir med periodiske renteudbetalinger -ACCRINTM = PƅLƘBRENTE.UDLƘB ## Returnerer den pĆ„lĆøbne rente for et vƦrdipapir, hvor renteudbetalingen finder sted ved papirets udlĆøb -AMORDEGRC = AMORDEGRC ## Returnerer afskrivningsbelĆøbet for hver regnskabsperiode ved hjƦlp af en afskrivningskoefficient -AMORLINC = AMORLINC ## Returnerer afskrivningsbelĆøbet for hver regnskabsperiode -COUPDAYBS = KUPONDAGE.SA ## Returnerer antallet af dage fra starten af kuponperioden til afregningsdatoen -COUPDAYS = KUPONDAGE.A ## Returnerer antallet af dage fra begyndelsen af kuponperioden til afregningsdatoen -COUPDAYSNC = KUPONDAGE.ANK ## Returnerer antallet af dage i den kuponperiode, der indeholder afregningsdatoen -COUPNCD = KUPONDAG.NƆSTE ## Returnerer den nƦste kupondato efter afregningsdatoen -COUPNUM = KUPONBETALINGER ## Returnerer antallet af kuponudbetalinger mellem afregnings- og udlĆøbsdatoen -COUPPCD = KUPONDAG.FORRIGE ## Returnerer den forrige kupondato fĆør afregningsdatoen -CUMIPMT = AKKUM.RENTE ## Returnerer den akkumulerede rente, der betales pĆ„ et lĆ„n mellem to perioder -CUMPRINC = AKKUM.HOVEDSTOL ## Returnerer den akkumulerede nedbringelse af hovedstol mellem to perioder -DB = DB ## Returnerer afskrivningen pĆ„ et aktiv i en angivet periode ved anvendelse af saldometoden -DDB = DSA ## Returnerer afskrivningsbelĆøbet for et aktiv over en bestemt periode ved anvendelse af dobbeltsaldometoden eller en anden afskrivningsmetode, som du angiver -DISC = DISKONTO ## Returnerer et vƦrdipapirs diskonto -DOLLARDE = KR.DECIMAL ## Konverterer en kronepris udtrykt som brĆøk til en kronepris udtrykt som decimaltal -DOLLARFR = KR.BRƘK ## Konverterer en kronepris udtrykt som decimaltal til en kronepris udtrykt som brĆøk -DURATION = VARIGHED ## Returnerer den Ć„rlige lĆøbetid for et vƦrdipapir med periodiske renteudbetalinger -EFFECT = EFFEKTIV.RENTE ## Returnerer den Ć„rlige effektive rente -FV = FV ## Returnerer fremtidsvƦrdien af en investering -FVSCHEDULE = FVTABEL ## Returnerer den fremtidige vƦrdi af en hovedstol, nĆ„r der er tilskrevet rente og rentes rente efter forskellige rentesatser -INTRATE = RENTEFOD ## Returnerer renten pĆ„ et fuldt ud investeret vƦrdipapir -IPMT = R.YDELSE ## Returnerer renten fra en investering for en given periode -IRR = IA ## Returnerer den interne rente for en rƦkke pengestrĆømme -ISPMT = ISPMT ## Beregner den betalte rente i lĆøbet af en bestemt investeringsperiode -MDURATION = MVARIGHED ## Returnerer Macauleys modificerede lĆøbetid for et vƦrdipapir med en formodet pari pĆ„ kr. 100 -MIRR = MIA ## Returnerer den interne forrentning, hvor positive og negative pengestrĆømme finansieres til forskellig rente -NOMINAL = NOMINEL ## Returnerer den Ć„rlige nominelle rente -NPER = NPER ## Returnerer antallet af perioder for en investering -NPV = NUTIDSVƆRDI ## Returnerer nettonutidsvƦrdien for en investering baseret pĆ„ en rƦkke periodiske pengestrĆømme og en diskonteringssats -ODDFPRICE = ULIGE.KURS.PƅLYDENDE ## Returnerer kursen pr. kr. 100 nominel vƦrdi for et vƦrdipapir med en ulige (kort eller lang) fĆørste periode -ODDFYIELD = ULIGE.FƘRSTE.AFKAST ## Returnerer afkastet for et vƦrdipapir med ulige fĆørste periode -ODDLPRICE = ULIGE.SIDSTE.KURS ## Returnerer kursen pr. kr. 100 nominel vƦrdi for et vƦrdipapir med ulige sidste periode -ODDLYIELD = ULIGE.SIDSTE.AFKAST ## Returnerer afkastet for et vƦrdipapir med ulige sidste periode -PMT = YDELSE ## Returnerer renten fra en investering for en given periode -PPMT = H.YDELSE ## Returnerer ydelsen pĆ„ hovedstolen for en investering i en given periode -PRICE = KURS ## Returnerer kursen pr. kr 100 nominel vƦrdi for et vƦrdipapir med periodiske renteudbetalinger -PRICEDISC = KURS.DISKONTO ## Returnerer kursen pr. kr 100 nominel vƦrdi for et diskonteret vƦrdipapir -PRICEMAT = KURS.UDLƘB ## Returnerer kursen pr. kr 100 nominel vƦrdi for et vƦrdipapir, hvor renten udbetales ved papirets udlĆøb -PV = NV ## Returnerer den nuvƦrende vƦrdi af en investering -RATE = RENTE ## Returnerer renten i hver periode for en annuitet -RECEIVED = MODTAGET.VED.UDLƘB ## Returnerer det belĆøb, der modtages ved udlĆøbet af et fuldt ud investeret vƦrdipapir -SLN = LA ## Returnerer den lineƦre afskrivning for et aktiv i en enkelt periode -SYD = ƅRSAFSKRIVNING ## Returnerer den Ć„rlige afskrivning pĆ„ et aktiv i en bestemt periode -TBILLEQ = STATSOBLIGATION ## Returnerer det obligationsƦkvivalente afkast for en statsobligation -TBILLPRICE = STATSOBLIGATION.KURS ## Returnerer kursen pr. kr 100 nominel vƦrdi for en statsobligation -TBILLYIELD = STATSOBLIGATION.AFKAST ## Returnerer en afkastet pĆ„ en statsobligation -VDB = VSA ## Returnerer afskrivningen pĆ„ et aktiv i en angivet periode, herunder delperioder, ved brug af dobbeltsaldometoden -XIRR = INTERN.RENTE ## Returnerer den interne rente for en plan over pengestrĆømme, der ikke behĆøver at vƦre periodiske -XNPV = NETTO.NUTIDSVƆRDI ## Returnerer nutidsvƦrdien for en plan over pengestrĆømme, der ikke behĆøver at vƦre periodiske -YIELD = AFKAST ## Returnerer afkastet for et vƦrdipapir med periodiske renteudbetalinger -YIELDDISC = AFKAST.DISKONTO ## Returnerer det Ć„rlige afkast for et diskonteret vƦrdipapir, f.eks. en statsobligation -YIELDMAT = AFKAST.UDLƘBSDATO ## Returnerer det Ć„rlige afkast for et vƦrdipapir, hvor renten udbetales ved papirets udlĆøb - - -## -## Information functions Informationsfunktioner -## -CELL = CELLE ## Returnerer oplysninger om formatering, placering eller indhold af en celle -ERROR.TYPE = FEJLTYPE ## Returnerer et tal, der svarer til en fejltype -INFO = INFO ## Returnerer oplysninger om det aktuelle operativmiljĆø -ISBLANK = ER.TOM ## Returnerer SAND, hvis vƦrdien er tom -ISERR = ER.FJL ## Returnerer SAND, hvis vƦrdien er en fejlvƦrdi undtagen #I/T -ISERROR = ER.FEJL ## Returnerer SAND, hvis vƦrdien er en fejlvƦrdi -ISEVEN = ER.LIGE ## Returnerer SAND, hvis tallet er lige -ISLOGICAL = ER.LOGISK ## Returnerer SAND, hvis vƦrdien er en logisk vƦrdi -ISNA = ER.IKKE.TILGƆNGELIG ## Returnerer SAND, hvis vƦrdien er fejlvƦrdien #I/T -ISNONTEXT = ER.IKKE.TEKST ## Returnerer SAND, hvis vƦrdien ikke er tekst -ISNUMBER = ER.TAL ## Returnerer SAND, hvis vƦrdien er et tal -ISODD = ER.ULIGE ## Returnerer SAND, hvis tallet er ulige -ISREF = ER.REFERENCE ## Returnerer SAND, hvis vƦrdien er en reference -ISTEXT = ER.TEKST ## Returnerer SAND, hvis vƦrdien er tekst -N = TAL ## Returnerer en vƦrdi konverteret til et tal -NA = IKKE.TILGƆNGELIG ## Returnerer fejlvƦrdien #I/T -TYPE = VƆRDITYPE ## Returnerer et tal, der angiver datatypen for en vƦrdi - - -## -## Logical functions Logiske funktioner -## -AND = OG ## Returnerer SAND, hvis alle argumenterne er sande -FALSE = FALSK ## Returnerer den logiske vƦrdi FALSK -IF = HVIS ## Angiver en logisk test, der skal udfĆøres -IFERROR = HVIS.FEJL ## Returnerer en vƦrdi, du angiver, hvis en formel evauleres som en fejl. Returnerer i modsat fald resultatet af formlen -NOT = IKKE ## Vender argumentets logik om -OR = ELLER ## Returneret vƦrdien SAND, hvis mindst Ć©t argument er sandt -TRUE = SAND ## Returnerer den logiske vƦrdi SAND - - -## -## Lookup and reference functions Opslags- og referencefunktioner -## -ADDRESS = ADRESSE ## Returnerer en reference som tekst til en enkelt celle i et regneark -AREAS = OMRƅDER ## Returnerer antallet af omrĆ„der i en reference -CHOOSE = VƆLG ## VƦlger en vƦrdi pĆ„ en liste med vƦrdier -COLUMN = KOLONNE ## Returnerer kolonnenummeret i en reference -COLUMNS = KOLONNER ## Returnerer antallet af kolonner i en reference -HLOOKUP = VOPSLAG ## SĆøger i den Ćøverste rƦkke af en matrix og returnerer vƦrdien af den angivne celle -HYPERLINK = HYPERLINK ## Opretter en genvej kaldet et hyperlink, der Ć„bner et dokument, som er lagret pĆ„ en netvƦrksserver, pĆ„ et intranet eller pĆ„ internettet -INDEX = INDEKS ## Anvender et indeks til at vƦlge en vƦrdi fra en reference eller en matrix -INDIRECT = INDIREKTE ## Returnerer en reference, der er angivet af en tekstvƦrdi -LOOKUP = SLƅ.OP ## SĆøger vƦrdier i en vektor eller en matrix -MATCH = SAMMENLIGN ## SĆøger vƦrdier i en reference eller en matrix -OFFSET = FORSKYDNING ## Returnerer en reference forskudt i forhold til en given reference -ROW = RƆKKE ## Returnerer rƦkkenummeret for en reference -ROWS = RƆKKER ## Returnerer antallet af rƦkker i en reference -RTD = RTD ## Henter realtidsdata fra et program, der understĆøtter COM-automatisering (Automation: En metode til at arbejde med objekter fra et andet program eller udviklingsvƦrktĆøj. Automation, som tidligere blev kaldt OLE Automation, er en industristandard og en funktion i COM (Component Object Model).) -TRANSPOSE = TRANSPONER ## Returnerer en transponeret matrix -VLOOKUP = LOPSLAG ## SĆøger i Ćøverste rƦkke af en matrix og flytter pĆ„ tvƦrs af rƦkken for at returnere en cellevƦrdi - - -## -## Math and trigonometry functions Matematiske og trigonometriske funktioner -## -ABS = ABS ## Returnerer den absolutte vƦrdi af et tal -ACOS = ARCCOS ## Returnerer et tals arcus cosinus -ACOSH = ARCCOSH ## Returnerer den inverse hyperbolske cosinus af tal -ASIN = ARCSIN ## Returnerer et tals arcus sinus -ASINH = ARCSINH ## Returnerer den inverse hyperbolske sinus for tal -ATAN = ARCTAN ## Returnerer et tals arcus tangens -ATAN2 = ARCTAN2 ## Returnerer de angivne x- og y-koordinaters arcus tangens -ATANH = ARCTANH ## Returnerer et tals inverse hyperbolske tangens -CEILING = AFRUND.LOFT ## Afrunder et tal til nƦrmeste heltal eller til nƦrmeste multiplum af betydning -COMBIN = KOMBIN ## Returnerer antallet af kombinationer for et givet antal objekter -COS = COS ## Returnerer et tals cosinus -COSH = COSH ## Returnerer den inverse hyperbolske cosinus af et tal -DEGREES = GRADER ## Konverterer radianer til grader -EVEN = LIGE ## Runder et tal op til nƦrmeste lige heltal -EXP = EKSP ## Returnerer e oplĆøftet til en potens af et angivet tal -FACT = FAKULTET ## Returnerer et tals fakultet -FACTDOUBLE = DOBBELT.FAKULTET ## Returnerer et tals dobbelte fakultet -FLOOR = AFRUND.GULV ## Runder et tal ned mod nul -GCD = STƘRSTE.FƆLLES.DIVISOR ## Returnerer den stĆørste fƦlles divisor -INT = HELTAL ## Nedrunder et tal til det nƦrmeste heltal -LCM = MINDSTE.FƆLLES.MULTIPLUM ## Returnerer det mindste fƦlles multiplum -LN = LN ## Returnerer et tals naturlige logaritme -LOG = LOG ## Returnerer logaritmen for et tal pĆ„ grundlag af et angivet grundtal -LOG10 = LOG10 ## Returnerer titalslogaritmen af et tal -MDETERM = MDETERM ## Returnerer determinanten for en matrix -MINVERSE = MINVERT ## Returnerer den inverse matrix for en matrix -MMULT = MPRODUKT ## Returnerer matrixproduktet af to matrixer -MOD = REST ## Returnerer restvƦrdien fra division -MROUND = MAFRUND ## Returnerer et tal afrundet til det Ćønskede multiplum -MULTINOMIAL = MULTINOMIAL ## Returnerer et multinomialt talsƦt -ODD = ULIGE ## Runder et tal op til nƦrmeste ulige heltal -PI = PI ## Returnerer vƦrdien af pi -POWER = POTENS ## Returnerer resultatet af et tal oplĆøftet til en potens -PRODUCT = PRODUKT ## Multiplicerer argumenterne -QUOTIENT = KVOTIENT ## Returnerer heltalsdelen ved division -RADIANS = RADIANER ## Konverterer grader til radianer -RAND = SLUMP ## Returnerer et tilfƦldigt tal mellem 0 og 1 -RANDBETWEEN = SLUMP.MELLEM ## Returnerer et tilfƦldigt tal mellem de tal, der angives -ROMAN = ROMERTAL ## Konverterer et arabertal til romertal som tekst -ROUND = AFRUND ## Afrunder et tal til et angivet antal decimaler -ROUNDDOWN = RUND.NED ## Runder et tal ned mod nul -ROUNDUP = RUND.OP ## Runder et tal op, vƦk fra 0 (nul) -SERIESSUM = SERIESUM ## Returnerer summen af en potensserie baseret pĆ„ en formel -SIGN = FORTEGN ## Returnerer et tals fortegn -SIN = SIN ## Returnerer en given vinkels sinusvƦrdi -SINH = SINH ## Returnerer den hyperbolske sinus af et tal -SQRT = KVROD ## Returnerer en positiv kvadratrod -SQRTPI = KVRODPI ## Returnerer kvadratroden af (tal * pi;) -SUBTOTAL = SUBTOTAL ## Returnerer en subtotal pĆ„ en liste eller i en database -SUM = SUM ## LƦgger argumenterne sammen -SUMIF = SUM.HVIS ## LƦgger de celler sammen, der er specificeret af et givet kriterium. -SUMIFS = SUM.HVISER ## LƦgger de celler i et omrĆ„de sammen, der opfylder flere kriterier. -SUMPRODUCT = SUMPRODUKT ## Returnerer summen af produkter af ens matrixkomponenter -SUMSQ = SUMKV ## Returnerer summen af argumenternes kvadrater -SUMX2MY2 = SUMX2MY2 ## Returnerer summen af differensen mellem kvadrater af ens vƦrdier i to matrixer -SUMX2PY2 = SUMX2PY2 ## Returnerer summen af summen af kvadrater af tilsvarende vƦrdier i to matrixer -SUMXMY2 = SUMXMY2 ## Returnerer summen af kvadrater af differenser mellem ens vƦrdier i to matrixer -TAN = TAN ## Returnerer et tals tangens -TANH = TANH ## Returnerer et tals hyperbolske tangens -TRUNC = AFKORT ## Afkorter et tal til et heltal - - -## -## Statistical functions Statistiske funktioner -## -AVEDEV = MAD ## Returnerer den gennemsnitlige numeriske afvigelse fra stikprĆøvens middelvƦrdi -AVERAGE = MIDDEL ## Returnerer middelvƦrdien af argumenterne -AVERAGEA = MIDDELV ## Returnerer middelvƦrdien af argumenterne og medtager tal, tekst og logiske vƦrdier -AVERAGEIF = MIDDEL.HVIS ## Returnerer gennemsnittet (den aritmetiske middelvƦrdi) af alle de celler, der opfylder et givet kriterium, i et omrĆ„de -AVERAGEIFS = MIDDEL.HVISER ## Returnerer gennemsnittet (den aritmetiske middelvƦrdi) af alle de celler, der opfylder flere kriterier. -BETADIST = BETAFORDELING ## Returnerer den kumulative betafordelingsfunktion -BETAINV = BETAINV ## Returnerer den inverse kumulative fordelingsfunktion for en angivet betafordeling -BINOMDIST = BINOMIALFORDELING ## Returnerer punktsandsynligheden for binomialfordelingen -CHIDIST = CHIFORDELING ## Returnerer fraktilsandsynligheden for en chi2-fordeling -CHIINV = CHIINV ## Returnerer den inverse fraktilsandsynlighed for en chi2-fordeling -CHITEST = CHITEST ## Foretager en test for uafhƦngighed -CONFIDENCE = KONFIDENSINTERVAL ## Returnerer et konfidensinterval for en population -CORREL = KORRELATION ## Returnerer korrelationskoefficienten mellem to datasƦt -COUNT = TƆL ## TƦller antallet af tal pĆ„ en liste med argumenter -COUNTA = TƆLV ## TƦller antallet af vƦrdier pĆ„ en liste med argumenter -COUNTBLANK = ANTAL.BLANKE ## TƦller antallet af tomme celler i et omrĆ„de -COUNTIF = TƆLHVIS ## TƦller antallet af celler, som opfylder de givne kriterier, i et omrĆ„de -COUNTIFS = TƆL.HVISER ## TƦller antallet af de celler, som opfylder flere kriterier, i et omrĆ„de -COVAR = KOVARIANS ## Beregner kovariansen mellem to stokastiske variabler -CRITBINOM = KRITBINOM ## Returnerer den mindste vƦrdi for x, for hvilken det gƦlder, at fordelingsfunktionen er mindre end eller lig med kriterievƦrdien. -DEVSQ = SAK ## Returnerer summen af de kvadrerede afvigelser fra middelvƦrdien -EXPONDIST = EKSPFORDELING ## Returnerer eksponentialfordelingen -FDIST = FFORDELING ## Returnerer fraktilsandsynligheden for F-fordelingen -FINV = FINV ## Returnerer den inverse fraktilsandsynlighed for F-fordelingen -FISHER = FISHER ## Returnerer Fisher-transformationen -FISHERINV = FISHERINV ## Returnerer den inverse Fisher-transformation -FORECAST = PROGNOSE ## Returnerer en prognosevƦrdi baseret pĆ„ lineƦr tendens -FREQUENCY = FREKVENS ## Returnerer en frekvensfordeling i en sĆøjlevektor -FTEST = FTEST ## Returnerer resultatet af en F-test til sammenligning af varians -GAMMADIST = GAMMAFORDELING ## Returnerer fordelingsfunktionen for gammafordelingen -GAMMAINV = GAMMAINV ## Returnerer den inverse fordelingsfunktion for gammafordelingen -GAMMALN = GAMMALN ## Returnerer den naturlige logaritme til gammafordelingen, G(x) -GEOMEAN = GEOMIDDELVƆRDI ## Returnerer det geometriske gennemsnit -GROWTH = FORƘGELSE ## Returnerer vƦrdier langs en eksponentiel tendens -HARMEAN = HARMIDDELVƆRDI ## Returnerer det harmoniske gennemsnit -HYPGEOMDIST = HYPGEOFORDELING ## Returnerer punktsandsynligheden i en hypergeometrisk fordeling -INTERCEPT = SKƆRING ## Returnerer afskƦringsvƦrdien pĆ„ y-aksen i en lineƦr regression -KURT = TOPSTEJL ## Returnerer kurtosisvƦrdien for en stokastisk variabel -LARGE = STOR ## Returnerer den k'te stĆørste vƦrdi i et datasƦt -LINEST = LINREGR ## Returnerer parameterestimaterne for en lineƦr tendens -LOGEST = LOGREGR ## Returnerer parameterestimaterne for en eksponentiel tendens -LOGINV = LOGINV ## Returnerer den inverse fordelingsfunktion for lognormalfordelingen -LOGNORMDIST = LOGNORMFORDELING ## Returnerer fordelingsfunktionen for lognormalfordelingen -MAX = MAKS ## Returnerer den maksimale vƦrdi pĆ„ en liste med argumenter. -MAXA = MAKSV ## Returnerer den maksimale vƦrdi pĆ„ en liste med argumenter og medtager tal, tekst og logiske vƦrdier -MEDIAN = MEDIAN ## Returnerer medianen for de angivne tal -MIN = MIN ## Returnerer den mindste vƦrdi pĆ„ en liste med argumenter. -MINA = MINV ## Returnerer den mindste vƦrdi pĆ„ en liste med argumenter og medtager tal, tekst og logiske vƦrdier -MODE = HYPPIGST ## Returnerer den hyppigste vƦrdi i et datasƦt -NEGBINOMDIST = NEGBINOMFORDELING ## Returnerer den negative binomialfordeling -NORMDIST = NORMFORDELING ## Returnerer fordelingsfunktionen for normalfordelingen -NORMINV = NORMINV ## Returnerer den inverse fordelingsfunktion for normalfordelingen -NORMSDIST = STANDARDNORMFORDELING ## Returnerer fordelingsfunktionen for standardnormalfordelingen -NORMSINV = STANDARDNORMINV ## Returnerer den inverse fordelingsfunktion for standardnormalfordelingen -PEARSON = PEARSON ## Returnerer Pearsons korrelationskoefficient -PERCENTILE = FRAKTIL ## Returnerer den k'te fraktil for datasƦttet -PERCENTRANK = PROCENTPLADS ## Returnerer den procentuelle rang for en given vƦrdi i et datasƦt -PERMUT = PERMUT ## Returnerer antallet af permutationer for et givet sƦt objekter -POISSON = POISSON ## Returnerer fordelingsfunktionen for en Poisson-fordeling -PROB = SANDSYNLIGHED ## Returnerer intervalsandsynligheden -QUARTILE = KVARTIL ## Returnerer kvartilen i et givet datasƦt -RANK = PLADS ## Returnerer rangen for et tal pĆ„ en liste med tal -RSQ = FORKLARINGSGRAD ## Returnerer R2-vƦrdien fra en simpel lineƦr regression -SKEW = SKƆVHED ## Returnerer skƦvheden for en stokastisk variabel -SLOPE = HƆLDNING ## Returnerer estimatet pĆ„ hƦldningen fra en simpel lineƦr regression -SMALL = MINDSTE ## Returnerer den k'te mindste vƦrdi i datasƦttet -STANDARDIZE = STANDARDISER ## Returnerer en standardiseret vƦrdi -STDEV = STDAFV ## Estimerer standardafvigelsen pĆ„ basis af en stikprĆøve -STDEVA = STDAFVV ## Beregner standardafvigelsen pĆ„ basis af en prĆøve og medtager tal, tekst og logiske vƦrdier -STDEVP = STDAFVP ## Beregner standardafvigelsen pĆ„ basis af en hel population -STDEVPA = STDAFVPV ## Beregner standardafvigelsen pĆ„ basis af en hel population og medtager tal, tekst og logiske vƦrdier -STEYX = STFYX ## Returnerer standardafvigelsen for de estimerede y-vƦrdier i den simple lineƦre regression -TDIST = TFORDELING ## Returnerer fordelingsfunktionen for Student's t-fordeling -TINV = TINV ## Returnerer den inverse fordelingsfunktion for Student's t-fordeling -TREND = TENDENS ## Returnerer vƦrdi under antagelse af en lineƦr tendens -TRIMMEAN = TRIMMIDDELVƆRDI ## Returnerer den trimmede middelvƦrdi for datasƦttet -TTEST = TTEST ## Returnerer den sandsynlighed, der er forbundet med Student's t-test -VAR = VARIANS ## Beregner variansen pĆ„ basis af en prĆøve -VARA = VARIANSV ## Beregner variansen pĆ„ basis af en prĆøve og medtager tal, tekst og logiske vƦrdier -VARP = VARIANSP ## Beregner variansen pĆ„ basis af hele populationen -VARPA = VARIANSPV ## Beregner variansen pĆ„ basis af hele populationen og medtager tal, tekst og logiske vƦrdier -WEIBULL = WEIBULL ## Returnerer fordelingsfunktionen for Weibull-fordelingen -ZTEST = ZTEST ## Returnerer sandsynlighedsvƦrdien ved en en-sidet z-test - - -## -## Text functions Tekstfunktioner -## -ASC = ASC ## Ɔndrer engelske tegn i fuld bredde (dobbelt-byte) eller katakana i en tegnstreng til tegn i halv bredde (enkelt-byte) -BAHTTEXT = BAHTTEKST ## Konverterer et tal til tekst ved hjƦlp af valutaformatet ß (baht) -CHAR = TEGN ## Returnerer det tegn, der svarer til kodenummeret -CLEAN = RENS ## Fjerner alle tegn, der ikke kan udskrives, fra tekst -CODE = KODE ## Returnerer en numerisk kode for det fĆørste tegn i en tekststreng -CONCATENATE = SAMMENKƆDNING ## SammenkƦder adskillige tekstelementer til Ć©t tekstelement -DOLLAR = KR ## Konverterer et tal til tekst ved hjƦlp af valutaformatet kr. (kroner) -EXACT = EKSAKT ## Kontrollerer, om to tekstvƦrdier er identiske -FIND = FIND ## SĆøger efter en tekstvƦrdi i en anden tekstvƦrdi (der skelnes mellem store og smĆ„ bogstaver) -FINDB = FINDB ## SĆøger efter en tekstvƦrdi i en anden tekstvƦrdi (der skelnes mellem store og smĆ„ bogstaver) -FIXED = FAST ## Formaterer et tal som tekst med et fast antal decimaler -JIS = JIS ## Ɔndrer engelske tegn i halv bredde (enkelt-byte) eller katakana i en tegnstreng til tegn i fuld bredde (dobbelt-byte) -LEFT = VENSTRE ## Returnerer tegnet lƦngst til venstre i en tekstvƦrdi -LEFTB = VENSTREB ## Returnerer tegnet lƦngst til venstre i en tekstvƦrdi -LEN = LƆNGDE ## Returnerer antallet af tegn i en tekststreng -LENB = LƆNGDEB ## Returnerer antallet af tegn i en tekststreng -LOWER = SMƅ.BOGSTAVER ## Konverterer tekst til smĆ„ bogstaver -MID = MIDT ## Returnerer et bestemt antal tegn fra en tekststreng fra og med den angivne startposition -MIDB = MIDTB ## Returnerer et bestemt antal tegn fra en tekststreng fra og med den angivne startposition -PHONETIC = FONETISK ## Uddrager de fonetiske (furigana) tegn fra en tekststreng -PROPER = STORT.FORBOGSTAV ## Konverterer fĆørste bogstav i hvert ord i teksten til stort bogstav -REPLACE = ERSTAT ## Erstatter tegn i tekst -REPLACEB = ERSTATB ## Erstatter tegn i tekst -REPT = GENTAG ## Gentager tekst et givet antal gange -RIGHT = HƘJRE ## Returnerer tegnet lƦngste til hĆøjre i en tekstvƦrdi -RIGHTB = HƘJREB ## Returnerer tegnet lƦngste til hĆøjre i en tekstvƦrdi -SEARCH = SƘG ## SĆøger efter en tekstvƦrdi i en anden tekstvƦrdi (der skelnes ikke mellem store og smĆ„ bogstaver) -SEARCHB = SƘGB ## SĆøger efter en tekstvƦrdi i en anden tekstvƦrdi (der skelnes ikke mellem store og smĆ„ bogstaver) -SUBSTITUTE = UDSKIFT ## Udskifter gammel tekst med ny tekst i en tekststreng -T = T ## Konverterer argumenterne til tekst -TEXT = TEKST ## Formaterer et tal og konverterer det til tekst -TRIM = FJERN.OVERFLƘDIGE.BLANKE ## Fjerner mellemrum fra tekst -UPPER = STORE.BOGSTAVER ## Konverterer tekst til store bogstaver -VALUE = VƆRDI ## Konverterer et tekstargument til et tal diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/config deleted file mode 100644 index 9751c4b..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = € - - -## -## Excel Error Codes (For future use) - -## -NULL = #NULL! -DIV0 = #DIV/0! -VALUE = #WERT! -REF = #BEZUG! -NAME = #NAME? -NUM = #ZAHL! -NA = #NV diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/functions deleted file mode 100644 index 01df42f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/de/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions Add-In- und Automatisierungsfunktionen -## -GETPIVOTDATA = PIVOTDATENZUORDNEN ## In einem PivotTable-Bericht gespeicherte Daten werden zurückgegeben. - - -## -## Cube functions Cubefunktionen -## -CUBEKPIMEMBER = CUBEKPIELEMENT ## Gibt Name, Eigenschaft und Measure eines Key Performance Indicators (KPI) zurück und zeigt den Namen und die Eigenschaft in der Zelle an. Ein KPI ist ein quantifizierbares Maß, wie z. B. der monatliche Bruttogewinn oder die vierteljƤhrliche Mitarbeiterfluktuation, mit dessen Hilfe das Leistungsverhalten eines Unternehmens überwacht werden kann. -CUBEMEMBER = CUBEELEMENT ## Gibt ein Element oder ein Tuple in einer Cubehierarchie zurück. Wird verwendet, um zu überprüfen, ob das Element oder Tuple im Cube vorhanden ist. -CUBEMEMBERPROPERTY = CUBEELEMENTEIGENSCHAFT ## Gibt den Wert einer Elementeigenschaft im Cube zurück. Wird verwendet, um zu überprüfen, ob ein Elementname im Cube vorhanden ist, und um die für dieses Element angegebene Eigenschaft zurückzugeben. -CUBERANKEDMEMBER = CUBERANGELEMENT ## Gibt das n-te oder n-rangige Element in einer Menge zurück. Wird verwendet, um mindestens ein Element in einer Menge zurückzugeben, wie z. B. bester Vertriebsmitarbeiter oder 10 beste Kursteilnehmer. -CUBESET = CUBEMENGE ## Definiert eine berechnete Menge Elemente oder Tuples durch Senden eines Mengenausdrucks an den Cube auf dem Server, der die Menge erstellt und an Microsoft Office Excel zurückgibt. -CUBESETCOUNT = CUBEMENGENANZAHL ## Gibt die Anzahl der Elemente in einer Menge zurück. -CUBEVALUE = CUBEWERT ## Gibt einen Aggregatwert aus einem Cube zurück. - - -## -## Database functions Datenbankfunktionen -## -DAVERAGE = DBMITTELWERT ## Gibt den Mittelwert der ausgewƤhlten DatenbankeintrƤge zurück -DCOUNT = DBANZAHL ## ZƤhlt die Zellen mit Zahlen in einer Datenbank -DCOUNTA = DBANZAHL2 ## ZƤhlt nicht leere Zellen in einer Datenbank -DGET = DBAUSZUG ## Extrahiert aus einer Datenbank einen einzelnen Datensatz, der den angegebenen Kriterien entspricht -DMAX = DBMAX ## Gibt den größten Wert aus ausgewƤhlten DatenbankeintrƤgen zurück -DMIN = DBMIN ## Gibt den kleinsten Wert aus ausgewƤhlten DatenbankeintrƤgen zurück -DPRODUCT = DBPRODUKT ## Multipliziert die Werte in einem bestimmten Feld mit DatensƤtzen, die den Kriterien in einer Datenbank entsprechen -DSTDEV = DBSTDABW ## SchƤtzt die Standardabweichung auf der Grundlage einer Stichprobe aus ausgewƤhlten DatenbankeintrƤgen -DSTDEVP = DBSTDABWN ## Berechnet die Standardabweichung auf der Grundlage der Grundgesamtheit ausgewƤhlter DatenbankeintrƤge -DSUM = DBSUMME ## Addiert die Zahlen in der Feldspalte mit DatensƤtzen in der Datenbank, die den Kriterien entsprechen -DVAR = DBVARIANZ ## SchƤtzt die Varianz auf der Grundlage ausgewƤhlter DatenbankeintrƤge -DVARP = DBVARIANZEN ## Berechnet die Varianz auf der Grundlage der Grundgesamtheit ausgewƤhlter DatenbankeintrƤge - - -## -## Date and time functions Datums- und Zeitfunktionen -## -DATE = DATUM ## Gibt die fortlaufende Zahl eines bestimmten Datums zurück -DATEVALUE = DATWERT ## Wandelt ein Datum in Form von Text in eine fortlaufende Zahl um -DAY = TAG ## Wandelt eine fortlaufende Zahl in den Tag des Monats um -DAYS360 = TAGE360 ## Berechnet die Anzahl der Tage zwischen zwei Datumsangaben ausgehend von einem Jahr, das 360 Tage hat -EDATE = EDATUM ## Gibt die fortlaufende Zahl des Datums zurück, bei dem es sich um die angegebene Anzahl von Monaten vor oder nach dem Anfangstermin handelt -EOMONTH = MONATSENDE ## Gibt die fortlaufende Zahl des letzten Tags des Monats vor oder nach einer festgelegten Anzahl von Monaten zurück -HOUR = STUNDE ## Wandelt eine fortlaufende Zahl in eine Stunde um -MINUTE = MINUTE ## Wandelt eine fortlaufende Zahl in eine Minute um -MONTH = MONAT ## Wandelt eine fortlaufende Zahl in einen Monat um -NETWORKDAYS = NETTOARBEITSTAGE ## Gibt die Anzahl von ganzen Arbeitstagen zwischen zwei Datumswerten zurück -NOW = JETZT ## Gibt die fortlaufende Zahl des aktuellen Datums und der aktuellen Uhrzeit zurück -SECOND = SEKUNDE ## Wandelt eine fortlaufende Zahl in eine Sekunde um -TIME = ZEIT ## Gibt die fortlaufende Zahl einer bestimmten Uhrzeit zurück -TIMEVALUE = ZEITWERT ## Wandelt eine Uhrzeit in Form von Text in eine fortlaufende Zahl um -TODAY = HEUTE ## Gibt die fortlaufende Zahl des heutigen Datums zurück -WEEKDAY = WOCHENTAG ## Wandelt eine fortlaufende Zahl in den Wochentag um -WEEKNUM = KALENDERWOCHE ## Wandelt eine fortlaufende Zahl in eine Zahl um, die angibt, in welche Woche eines Jahres das angegebene Datum fƤllt -WORKDAY = ARBEITSTAG ## Gibt die fortlaufende Zahl des Datums vor oder nach einer bestimmten Anzahl von Arbeitstagen zurück -YEAR = JAHR ## Wandelt eine fortlaufende Zahl in ein Jahr um -YEARFRAC = BRTEILJAHRE ## Gibt die Anzahl der ganzen Tage zwischen Ausgangsdatum und Enddatum in Bruchteilen von Jahren zurück - - -## -## Engineering functions Konstruktionsfunktionen -## -BESSELI = BESSELI ## Gibt die geƤnderte Besselfunktion In(x) zurück -BESSELJ = BESSELJ ## Gibt die Besselfunktion Jn(x) zurück -BESSELK = BESSELK ## Gibt die geƤnderte Besselfunktion Kn(x) zurück -BESSELY = BESSELY ## Gibt die Besselfunktion Yn(x) zurück -BIN2DEC = BININDEZ ## Wandelt eine binƤre Zahl (Dualzahl) in eine dezimale Zahl um -BIN2HEX = BININHEX ## Wandelt eine binƤre Zahl (Dualzahl) in eine hexadezimale Zahl um -BIN2OCT = BININOKT ## Wandelt eine binƤre Zahl (Dualzahl) in eine oktale Zahl um -COMPLEX = KOMPLEXE ## Wandelt den Real- und ImaginƤrteil in eine komplexe Zahl um -CONVERT = UMWANDELN ## Wandelt eine Zahl von einem Maßsystem in ein anderes um -DEC2BIN = DEZINBIN ## Wandelt eine dezimale Zahl in eine binƤre Zahl (Dualzahl) um -DEC2HEX = DEZINHEX ## Wandelt eine dezimale Zahl in eine hexadezimale Zahl um -DEC2OCT = DEZINOKT ## Wandelt eine dezimale Zahl in eine oktale Zahl um -DELTA = DELTA ## Überprüft, ob zwei Werte gleich sind -ERF = GAUSSFEHLER ## Gibt die Gauss'sche Fehlerfunktion zurück -ERFC = GAUSSFKOMPL ## Gibt das Komplement zur Gauss'schen Fehlerfunktion zurück -GESTEP = GGANZZAHL ## Überprüft, ob eine Zahl größer als ein gegebener Schwellenwert ist -HEX2BIN = HEXINBIN ## Wandelt eine hexadezimale Zahl in eine BinƤrzahl um -HEX2DEC = HEXINDEZ ## Wandelt eine hexadezimale Zahl in eine dezimale Zahl um -HEX2OCT = HEXINOKT ## Wandelt eine hexadezimale Zahl in eine Oktalzahl um -IMABS = IMABS ## Gibt den Absolutbetrag (Modulo) einer komplexen Zahl zurück -IMAGINARY = IMAGINƄRTEIL ## Gibt den ImaginƤrteil einer komplexen Zahl zurück -IMARGUMENT = IMARGUMENT ## Gibt das Argument Theta zurück, einen Winkel, der als Bogenmaß ausgedrückt wird -IMCONJUGATE = IMKONJUGIERTE ## Gibt die konjugierte komplexe Zahl zu einer komplexen Zahl zurück -IMCOS = IMCOS ## Gibt den Kosinus einer komplexen Zahl zurück -IMDIV = IMDIV ## Gibt den Quotienten zweier komplexer Zahlen zurück -IMEXP = IMEXP ## Gibt die algebraische Form einer in exponentieller Schreibweise vorliegenden komplexen Zahl zurück -IMLN = IMLN ## Gibt den natürlichen Logarithmus einer komplexen Zahl zurück -IMLOG10 = IMLOG10 ## Gibt den Logarithmus einer komplexen Zahl zur Basis 10 zurück -IMLOG2 = IMLOG2 ## Gibt den Logarithmus einer komplexen Zahl zur Basis 2 zurück -IMPOWER = IMAPOTENZ ## Potenziert eine komplexe Zahl mit einer ganzen Zahl -IMPRODUCT = IMPRODUKT ## Gibt das Produkt von komplexen Zahlen zurück -IMREAL = IMREALTEIL ## Gibt den Realteil einer komplexen Zahl zurück -IMSIN = IMSIN ## Gibt den Sinus einer komplexen Zahl zurück -IMSQRT = IMWURZEL ## Gibt die Quadratwurzel einer komplexen Zahl zurück -IMSUB = IMSUB ## Gibt die Differenz zwischen zwei komplexen Zahlen zurück -IMSUM = IMSUMME ## Gibt die Summe von komplexen Zahlen zurück -OCT2BIN = OKTINBIN ## Wandelt eine oktale Zahl in eine binƤre Zahl (Dualzahl) um -OCT2DEC = OKTINDEZ ## Wandelt eine oktale Zahl in eine dezimale Zahl um -OCT2HEX = OKTINHEX ## Wandelt eine oktale Zahl in eine hexadezimale Zahl um - - -## -## Financial functions Finanzmathematische Funktionen -## -ACCRINT = AUFGELZINS ## Gibt die aufgelaufenen Zinsen (Stückzinsen) eines Wertpapiers mit periodischen Zinszahlungen zurück -ACCRINTM = AUFGELZINSF ## Gibt die aufgelaufenen Zinsen (Stückzinsen) eines Wertpapiers zurück, die bei FƤlligkeit ausgezahlt werden -AMORDEGRC = AMORDEGRK ## Gibt die Abschreibung für die einzelnen AbschreibungszeitrƤume mithilfe eines Abschreibungskoeffizienten zurück -AMORLINC = AMORLINEARK ## Gibt die Abschreibung für die einzelnen AbschreibungszeitrƤume zurück -COUPDAYBS = ZINSTERMTAGVA ## Gibt die Anzahl der Tage vom Anfang des Zinstermins bis zum Abrechnungstermin zurück -COUPDAYS = ZINSTERMTAGE ## Gibt die Anzahl der Tage der Zinsperiode zurück, die den Abrechnungstermin einschließt -COUPDAYSNC = ZINSTERMTAGNZ ## Gibt die Anzahl der Tage vom Abrechnungstermin bis zum nƤchsten Zinstermin zurück -COUPNCD = ZINSTERMNZ ## Gibt das Datum des ersten Zinstermins nach dem Abrechnungstermin zurück -COUPNUM = ZINSTERMZAHL ## Gibt die Anzahl der Zinstermine zwischen Abrechnungs- und FƤlligkeitsdatum zurück -COUPPCD = ZINSTERMVZ ## Gibt das Datum des letzten Zinstermins vor dem Abrechnungstermin zurück -CUMIPMT = KUMZINSZ ## Berechnet die kumulierten Zinsen, die zwischen zwei Perioden zu zahlen sind -CUMPRINC = KUMKAPITAL ## Berechnet die aufgelaufene Tilgung eines Darlehens, die zwischen zwei Perioden zu zahlen ist -DB = GDA2 ## Gibt die geometrisch-degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode zurück -DDB = GDA ## Gibt die Abschreibung eines Anlageguts für einen angegebenen Zeitraum unter Verwendung der degressiven Doppelraten-Abschreibung oder eines anderen von Ihnen angegebenen Abschreibungsverfahrens zurück -DISC = DISAGIO ## Gibt den in Prozent ausgedrückten Abzinsungssatz eines Wertpapiers zurück -DOLLARDE = NOTIERUNGDEZ ## Wandelt eine Notierung, die als Dezimalbruch ausgedrückt wurde, in eine Dezimalzahl um -DOLLARFR = NOTIERUNGBRU ## Wandelt eine Notierung, die als Dezimalzahl ausgedrückt wurde, in einen Dezimalbruch um -DURATION = DURATION ## Gibt die jƤhrliche Duration eines Wertpapiers mit periodischen Zinszahlungen zurück -EFFECT = EFFEKTIV ## Gibt die jƤhrliche Effektivverzinsung zurück -FV = ZW ## Gibt den zukünftigen Wert (Endwert) einer Investition zurück -FVSCHEDULE = ZW2 ## Gibt den aufgezinsten Wert des Anfangskapitals für eine Reihe periodisch unterschiedlicher ZinssƤtze zurück -INTRATE = ZINSSATZ ## Gibt den Zinssatz eines voll investierten Wertpapiers zurück -IPMT = ZINSZ ## Gibt die Zinszahlung einer Investition für die angegebene Periode zurück -IRR = IKV ## Gibt den internen Zinsfuß einer Investition ohne Finanzierungskosten oder Reinvestitionsgewinne zurück -ISPMT = ISPMT ## Berechnet die wƤhrend eines bestimmten Zeitraums für eine Investition gezahlten Zinsen -MDURATION = MDURATION ## Gibt die geƤnderte Dauer für ein Wertpapier mit einem angenommenen Nennwert von 100 € zurück -MIRR = QIKV ## Gibt den internen Zinsfuß zurück, wobei positive und negative Zahlungen zu unterschiedlichen SƤtzen finanziert werden -NOMINAL = NOMINAL ## Gibt die jƤhrliche Nominalverzinsung zurück -NPER = ZZR ## Gibt die Anzahl der Zahlungsperioden einer Investition zurück -NPV = NBW ## Gibt den Nettobarwert einer Investition auf Basis periodisch anfallender Zahlungen und eines Abzinsungsfaktors zurück -ODDFPRICE = UNREGER.KURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers mit einem unregelmäßigen ersten Zinstermin zurück -ODDFYIELD = UNREGER.REND ## Gibt die Rendite eines Wertpapiers mit einem unregelmäßigen ersten Zinstermin zurück -ODDLPRICE = UNREGLE.KURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers mit einem unregelmäßigen letzten Zinstermin zurück -ODDLYIELD = UNREGLE.REND ## Gibt die Rendite eines Wertpapiers mit einem unregelmäßigen letzten Zinstermin zurück -PMT = RMZ ## Gibt die periodische Zahlung für eine AnnuitƤt zurück -PPMT = KAPZ ## Gibt die Kapitalrückzahlung einer Investition für eine angegebene Periode zurück -PRICE = KURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück, das periodisch Zinsen auszahlt -PRICEDISC = KURSDISAGIO ## Gibt den Kurs pro 100 € Nennwert eines unverzinslichen Wertpapiers zurück -PRICEMAT = KURSFƄLLIG ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück, das Zinsen am FƤlligkeitsdatum auszahlt -PV = BW ## Gibt den Barwert einer Investition zurück -RATE = ZINS ## Gibt den Zinssatz pro Zeitraum einer AnnuitƤt zurück -RECEIVED = AUSZAHLUNG ## Gibt den Auszahlungsbetrag eines voll investierten Wertpapiers am FƤlligkeitstermin zurück -SLN = LIA ## Gibt die lineare Abschreibung eines Wirtschaftsguts pro Periode zurück -SYD = DIA ## Gibt die arithmetisch-degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode zurück -TBILLEQ = TBILLƄQUIV ## Gibt die Rendite für ein Wertpapier zurück -TBILLPRICE = TBILLKURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück -TBILLYIELD = TBILLRENDITE ## Gibt die Rendite für ein Wertpapier zurück -VDB = VDB ## Gibt die degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode oder Teilperiode zurück -XIRR = XINTZINSFUSS ## Gibt den internen Zinsfuß einer Reihe nicht periodisch anfallender Zahlungen zurück -XNPV = XKAPITALWERT ## Gibt den Nettobarwert (Kapitalwert) einer Reihe nicht periodisch anfallender Zahlungen zurück -YIELD = RENDITE ## Gibt die Rendite eines Wertpapiers zurück, das periodisch Zinsen auszahlt -YIELDDISC = RENDITEDIS ## Gibt die jƤhrliche Rendite eines unverzinslichen Wertpapiers zurück -YIELDMAT = RENDITEFƄLL ## Gibt die jƤhrliche Rendite eines Wertpapiers zurück, das Zinsen am FƤlligkeitsdatum auszahlt - - -## -## Information functions Informationsfunktionen -## -CELL = ZELLE ## Gibt Informationen zu Formatierung, Position oder Inhalt einer Zelle zurück -ERROR.TYPE = FEHLER.TYP ## Gibt eine Zahl zurück, die einem Fehlertyp entspricht -INFO = INFO ## Gibt Informationen zur aktuellen Betriebssystemumgebung zurück -ISBLANK = ISTLEER ## Gibt WAHR zurück, wenn der Wert leer ist -ISERR = ISTFEHL ## Gibt WAHR zurück, wenn der Wert ein beliebiger Fehlerwert außer #N/V ist -ISERROR = ISTFEHLER ## Gibt WAHR zurück, wenn der Wert ein beliebiger Fehlerwert ist -ISEVEN = ISTGERADE ## Gibt WAHR zurück, wenn es sich um eine gerade Zahl handelt -ISLOGICAL = ISTLOG ## Gibt WAHR zurück, wenn der Wert ein Wahrheitswert ist -ISNA = ISTNV ## Gibt WAHR zurück, wenn der Wert der Fehlerwert #N/V ist -ISNONTEXT = ISTKTEXT ## Gibt WAHR zurück, wenn der Wert ein Element ist, das keinen Text enthƤlt -ISNUMBER = ISTZAHL ## Gibt WAHR zurück, wenn der Wert eine Zahl ist -ISODD = ISTUNGERADE ## Gibt WAHR zurück, wenn es sich um eine ungerade Zahl handelt -ISREF = ISTBEZUG ## Gibt WAHR zurück, wenn der Wert ein Bezug ist -ISTEXT = ISTTEXT ## Gibt WAHR zurück, wenn der Wert ein Element ist, das Text enthƤlt -N = N ## Gibt den in eine Zahl umgewandelten Wert zurück -NA = NV ## Gibt den Fehlerwert #NV zurück -TYPE = TYP ## Gibt eine Zahl zurück, die den Datentyp des angegebenen Werts anzeigt - - -## -## Logical functions Logische Funktionen -## -AND = UND ## Gibt WAHR zurück, wenn alle zugehƶrigen Argumente WAHR sind -FALSE = FALSCH ## Gibt den Wahrheitswert FALSCH zurück -IF = WENN ## Gibt einen logischen Test zum Ausführen an -IFERROR = WENNFEHLER ## Gibt einen von Ihnen festgelegten Wert zurück, wenn die Auswertung der Formel zu einem Fehler führt; andernfalls wird das Ergebnis der Formel zurückgegeben -NOT = NICHT ## Kehrt den Wahrheitswert der zugehƶrigen Argumente um -OR = ODER ## Gibt WAHR zurück, wenn ein Argument WAHR ist -TRUE = WAHR ## Gibt den Wahrheitswert WAHR zurück - - -## -## Lookup and reference functions Nachschlage- und Verweisfunktionen -## -ADDRESS = ADRESSE ## Gibt einen Bezug auf eine einzelne Zelle in einem Tabellenblatt als Text zurück -AREAS = BEREICHE ## Gibt die Anzahl der innerhalb eines Bezugs aufgeführten Bereiche zurück -CHOOSE = WAHL ## WƤhlt einen Wert aus eine Liste mit Werten aus -COLUMN = SPALTE ## Gibt die Spaltennummer eines Bezugs zurück -COLUMNS = SPALTEN ## Gibt die Anzahl der Spalten in einem Bezug zurück -HLOOKUP = HVERWEIS ## Sucht in der obersten Zeile einer Matrix und gibt den Wert der angegebenen Zelle zurück -HYPERLINK = HYPERLINK ## Erstellt eine Verknüpfung, über die ein auf einem Netzwerkserver, in einem Intranet oder im Internet gespeichertes Dokument geƶffnet wird -INDEX = INDEX ## Verwendet einen Index, um einen Wert aus einem Bezug oder einer Matrix auszuwƤhlen -INDIRECT = INDIREKT ## Gibt einen Bezug zurück, der von einem Textwert angegeben wird -LOOKUP = LOOKUP ## Sucht Werte in einem Vektor oder einer Matrix -MATCH = VERGLEICH ## Sucht Werte in einem Bezug oder einer Matrix -OFFSET = BEREICH.VERSCHIEBEN ## Gibt einen Bezugoffset aus einem gegebenen Bezug zurück -ROW = ZEILE ## Gibt die Zeilennummer eines Bezugs zurück -ROWS = ZEILEN ## Gibt die Anzahl der Zeilen in einem Bezug zurück -RTD = RTD ## Ruft Echtzeitdaten von einem Programm ab, das die COM-Automatisierung (Automatisierung: Ein Verfahren, bei dem aus einer Anwendung oder einem Entwicklungstool heraus mit den Objekten einer anderen Anwendung gearbeitet wird. Die früher als OLE-Automatisierung bezeichnete Automatisierung ist ein Industriestandard und eine Funktion von COM (Component Object Model).) unterstützt -TRANSPOSE = MTRANS ## Gibt die transponierte Matrix einer Matrix zurück -VLOOKUP = SVERWEIS ## Sucht in der ersten Spalte einer Matrix und arbeitet sich durch die Zeile, um den Wert einer Zelle zurückzugeben - - -## -## Math and trigonometry functions Mathematische und trigonometrische Funktionen -## -ABS = ABS ## Gibt den Absolutwert einer Zahl zurück -ACOS = ARCCOS ## Gibt den Arkuskosinus einer Zahl zurück -ACOSH = ARCCOSHYP ## Gibt den umgekehrten hyperbolischen Kosinus einer Zahl zurück -ASIN = ARCSIN ## Gibt den Arkussinus einer Zahl zurück -ASINH = ARCSINHYP ## Gibt den umgekehrten hyperbolischen Sinus einer Zahl zurück -ATAN = ARCTAN ## Gibt den Arkustangens einer Zahl zurück -ATAN2 = ARCTAN2 ## Gibt den Arkustangens einer x- und einer y-Koordinate zurück -ATANH = ARCTANHYP ## Gibt den umgekehrten hyperbolischen Tangens einer Zahl zurück -CEILING = OBERGRENZE ## Rundet eine Zahl auf die nƤchste ganze Zahl oder das nƤchste Vielfache von Schritt -COMBIN = KOMBINATIONEN ## Gibt die Anzahl der Kombinationen für eine bestimmte Anzahl von Objekten zurück -COS = COS ## Gibt den Kosinus einer Zahl zurück -COSH = COSHYP ## Gibt den hyperbolischen Kosinus einer Zahl zurück -DEGREES = GRAD ## Wandelt Bogenmaß (Radiant) in Grad um -EVEN = GERADE ## Rundet eine Zahl auf die nƤchste gerade ganze Zahl auf -EXP = EXP ## Potenziert die Basis e mit der als Argument angegebenen Zahl -FACT = FAKULTƄT ## Gibt die FakultƤt einer Zahl zurück -FACTDOUBLE = ZWEIFAKULTƄT ## Gibt die FakultƤt zu Zahl mit SchrittlƤnge 2 zurück -FLOOR = UNTERGRENZE ## Rundet die Zahl auf Anzahl_Stellen ab -GCD = GGT ## Gibt den größten gemeinsamen Teiler zurück -INT = GANZZAHL ## Rundet eine Zahl auf die nƤchstkleinere ganze Zahl ab -LCM = KGV ## Gibt das kleinste gemeinsame Vielfache zurück -LN = LN ## Gibt den natürlichen Logarithmus einer Zahl zurück -LOG = LOG ## Gibt den Logarithmus einer Zahl zu der angegebenen Basis zurück -LOG10 = LOG10 ## Gibt den Logarithmus einer Zahl zur Basis 10 zurück -MDETERM = MDET ## Gibt die Determinante einer Matrix zurück -MINVERSE = MINV ## Gibt die inverse Matrix einer Matrix zurück -MMULT = MMULT ## Gibt das Produkt zweier Matrizen zurück -MOD = REST ## Gibt den Rest einer Division zurück -MROUND = VRUNDEN ## Gibt eine auf das gewünschte Vielfache gerundete Zahl zurück -MULTINOMIAL = POLYNOMIAL ## Gibt den Polynomialkoeffizienten einer Gruppe von Zahlen zurück -ODD = UNGERADE ## Rundet eine Zahl auf die nƤchste ungerade ganze Zahl auf -PI = PI ## Gibt den Wert Pi zurück -POWER = POTENZ ## Gibt als Ergebnis eine potenzierte Zahl zurück -PRODUCT = PRODUKT ## Multipliziert die zugehƶrigen Argumente -QUOTIENT = QUOTIENT ## Gibt den ganzzahligen Anteil einer Division zurück -RADIANS = BOGENMASS ## Wandelt Grad in Bogenmaß (Radiant) um -RAND = ZUFALLSZAHL ## Gibt eine Zufallszahl zwischen 0 und 1 zurück -RANDBETWEEN = ZUFALLSBEREICH ## Gibt eine Zufallszahl aus dem festgelegten Bereich zurück -ROMAN = RƖMISCH ## Wandelt eine arabische Zahl in eine rƶmische Zahl als Text um -ROUND = RUNDEN ## Rundet eine Zahl auf eine bestimmte Anzahl von Dezimalstellen -ROUNDDOWN = ABRUNDEN ## Rundet die Zahl auf Anzahl_Stellen ab -ROUNDUP = AUFRUNDEN ## Rundet die Zahl auf Anzahl_Stellen auf -SERIESSUM = POTENZREIHE ## Gibt die Summe von Potenzen (zur Berechnung von Potenzreihen und dichotomen Wahrscheinlichkeiten) zurück -SIGN = VORZEICHEN ## Gibt das Vorzeichen einer Zahl zurück -SIN = SIN ## Gibt den Sinus einer Zahl zurück -SINH = SINHYP ## Gibt den hyperbolischen Sinus einer Zahl zurück -SQRT = WURZEL ## Gibt die Quadratwurzel einer Zahl zurück -SQRTPI = WURZELPI ## Gibt die Wurzel aus der mit Pi (pi) multiplizierten Zahl zurück -SUBTOTAL = TEILERGEBNIS ## Gibt ein Teilergebnis in einer Liste oder Datenbank zurück -SUM = SUMME ## Addiert die zugehƶrigen Argumente -SUMIF = SUMMEWENN ## Addiert Zahlen, die mit den Suchkriterien übereinstimmen -SUMIFS = SUMMEWENNS ## Die Zellen, die mehrere Kriterien erfüllen, werden in einem Bereich hinzugefügt -SUMPRODUCT = SUMMENPRODUKT ## Gibt die Summe der Produkte zusammengehƶriger Matrixkomponenten zurück -SUMSQ = QUADRATESUMME ## Gibt die Summe der quadrierten Argumente zurück -SUMX2MY2 = SUMMEX2MY2 ## Gibt die Summe der Differenzen der Quadrate für zusammengehƶrige Komponenten zweier Matrizen zurück -SUMX2PY2 = SUMMEX2PY2 ## Gibt die Summe der Quadrate für zusammengehƶrige Komponenten zweier Matrizen zurück -SUMXMY2 = SUMMEXMY2 ## Gibt die Summe der quadrierten Differenzen für zusammengehƶrige Komponenten zweier Matrizen zurück -TAN = TAN ## Gibt den Tangens einer Zahl zurück -TANH = TANHYP ## Gibt den hyperbolischen Tangens einer Zahl zurück -TRUNC = KÜRZEN ## Schneidet die Kommastellen einer Zahl ab und gibt als Ergebnis eine ganze Zahl zurück - - -## -## Statistical functions Statistische Funktionen -## -AVEDEV = MITTELABW ## Gibt die durchschnittliche absolute Abweichung einer Reihe von MerkmalsausprƤgungen und ihrem Mittelwert zurück -AVERAGE = MITTELWERT ## Gibt den Mittelwert der zugehƶrigen Argumente zurück -AVERAGEA = MITTELWERTA ## Gibt den Mittelwert der zugehƶrigen Argumente, die Zahlen, Text und Wahrheitswerte enthalten, zurück -AVERAGEIF = MITTELWERTWENN ## Der Durchschnittswert (arithmetisches Mittel) für alle Zellen in einem Bereich, die einem angegebenen Kriterium entsprechen, wird zurückgegeben -AVERAGEIFS = MITTELWERTWENNS ## Gibt den Durchschnittswert (arithmetisches Mittel) aller Zellen zurück, die mehreren Kriterien entsprechen -BETADIST = BETAVERT ## Gibt die Werte der kumulierten Betaverteilungsfunktion zurück -BETAINV = BETAINV ## Gibt das Quantil der angegebenen Betaverteilung zurück -BINOMDIST = BINOMVERT ## Gibt Wahrscheinlichkeiten einer binomialverteilten Zufallsvariablen zurück -CHIDIST = CHIVERT ## Gibt Werte der Verteilungsfunktion (1-Alpha) einer Chi-Quadrat-verteilten Zufallsgröße zurück -CHIINV = CHIINV ## Gibt Quantile der Verteilungsfunktion (1-Alpha) der Chi-Quadrat-Verteilung zurück -CHITEST = CHITEST ## Gibt die Teststatistik eines UnabhƤngigkeitstests zurück -CONFIDENCE = KONFIDENZ ## Ermƶglicht die Berechnung des 1-Alpha Konfidenzintervalls für den Erwartungswert einer Zufallsvariablen -CORREL = KORREL ## Gibt den Korrelationskoeffizienten zweier Reihen von MerkmalsausprƤgungen zurück -COUNT = ANZAHL ## Gibt die Anzahl der Zahlen in der Liste mit Argumenten an -COUNTA = ANZAHL2 ## Gibt die Anzahl der Werte in der Liste mit Argumenten an -COUNTBLANK = ANZAHLLEEREZELLEN ## Gibt die Anzahl der leeren Zellen in einem Bereich an -COUNTIF = ZƄHLENWENN ## Gibt die Anzahl der Zellen in einem Bereich an, deren Inhalte mit den Suchkriterien übereinstimmen -COUNTIFS = ZƄHLENWENNS ## Gibt die Anzahl der Zellen in einem Bereich an, deren Inhalte mit mehreren Suchkriterien übereinstimmen -COVAR = KOVAR ## Gibt die Kovarianz zurück, den Mittelwert der für alle Datenpunktpaare gebildeten Produkte der Abweichungen -CRITBINOM = KRITBINOM ## Gibt den kleinsten Wert zurück, für den die kumulierten Wahrscheinlichkeiten der Binomialverteilung kleiner oder gleich einer Grenzwahrscheinlichkeit sind -DEVSQ = SUMQUADABW ## Gibt die Summe der quadrierten Abweichungen der Datenpunkte von ihrem Stichprobenmittelwert zurück -EXPONDIST = EXPONVERT ## Gibt Wahrscheinlichkeiten einer exponential verteilten Zufallsvariablen zurück -FDIST = FVERT ## Gibt Werte der Verteilungsfunktion (1-Alpha) einer F-verteilten Zufallsvariablen zurück -FINV = FINV ## Gibt Quantile der F-Verteilung zurück -FISHER = FISHER ## Gibt die Fisher-Transformation zurück -FISHERINV = FISHERINV ## Gibt die Umkehrung der Fisher-Transformation zurück -FORECAST = PROGNOSE ## Gibt einen Wert zurück, der sich aus einem linearen Trend ergibt -FREQUENCY = HƄUFIGKEIT ## Gibt eine HƤufigkeitsverteilung als vertikale Matrix zurück -FTEST = FTEST ## Gibt die Teststatistik eines F-Tests zurück -GAMMADIST = GAMMAVERT ## Gibt Wahrscheinlichkeiten einer gammaverteilten Zufallsvariablen zurück -GAMMAINV = GAMMAINV ## Gibt Quantile der Gammaverteilung zurück -GAMMALN = GAMMALN ## Gibt den natürlichen Logarithmus der Gammafunktion zurück, Ī“(x) -GEOMEAN = GEOMITTEL ## Gibt das geometrische Mittel zurück -GROWTH = VARIATION ## Gibt Werte zurück, die sich aus einem exponentiellen Trend ergeben -HARMEAN = HARMITTEL ## Gibt das harmonische Mittel zurück -HYPGEOMDIST = HYPGEOMVERT ## Gibt Wahrscheinlichkeiten einer hypergeometrisch-verteilten Zufallsvariablen zurück -INTERCEPT = ACHSENABSCHNITT ## Gibt den Schnittpunkt der Regressionsgeraden zurück -KURT = KURT ## Gibt die Kurtosis (Exzess) einer Datengruppe zurück -LARGE = KGRƖSSTE ## Gibt den k-größten Wert einer Datengruppe zurück -LINEST = RGP ## Gibt die Parameter eines linearen Trends zurück -LOGEST = RKP ## Gibt die Parameter eines exponentiellen Trends zurück -LOGINV = LOGINV ## Gibt Quantile der Lognormalverteilung zurück -LOGNORMDIST = LOGNORMVERT ## Gibt Werte der Verteilungsfunktion einer lognormalverteilten Zufallsvariablen zurück -MAX = MAX ## Gibt den Maximalwert einer Liste mit Argumenten zurück -MAXA = MAXA ## Gibt den Maximalwert einer Liste mit Argumenten zurück, die Zahlen, Text und Wahrheitswerte enthalten -MEDIAN = MEDIAN ## Gibt den Median der angegebenen Zahlen zurück -MIN = MIN ## Gibt den Minimalwert einer Liste mit Argumenten zurück -MINA = MINA ## Gibt den kleinsten Wert einer Liste mit Argumenten zurück, die Zahlen, Text und Wahrheitswerte enthalten -MODE = MODALWERT ## Gibt den am hƤufigsten vorkommenden Wert in einer Datengruppe zurück -NEGBINOMDIST = NEGBINOMVERT ## Gibt Wahrscheinlichkeiten einer negativen, binominal verteilten Zufallsvariablen zurück -NORMDIST = NORMVERT ## Gibt Wahrscheinlichkeiten einer normal verteilten Zufallsvariablen zurück -NORMINV = NORMINV ## Gibt Quantile der Normalverteilung zurück -NORMSDIST = STANDNORMVERT ## Gibt Werte der Verteilungsfunktion einer standardnormalverteilten Zufallsvariablen zurück -NORMSINV = STANDNORMINV ## Gibt Quantile der Standardnormalverteilung zurück -PEARSON = PEARSON ## Gibt den Pearsonschen Korrelationskoeffizienten zurück -PERCENTILE = QUANTIL ## Gibt das Alpha-Quantil einer Gruppe von Daten zurück -PERCENTRANK = QUANTILSRANG ## Gibt den prozentualen Rang (Alpha) eines Werts in einer Datengruppe zurück -PERMUT = VARIATIONEN ## Gibt die Anzahl der Mƶglichkeiten zurück, um k Elemente aus einer Menge von n Elementen ohne Zurücklegen zu ziehen -POISSON = POISSON ## Gibt Wahrscheinlichkeiten einer poissonverteilten Zufallsvariablen zurück -PROB = WAHRSCHBEREICH ## Gibt die Wahrscheinlichkeit für ein von zwei Werten eingeschlossenes Intervall zurück -QUARTILE = QUARTILE ## Gibt die Quartile der Datengruppe zurück -RANK = RANG ## Gibt den Rang zurück, den eine Zahl innerhalb einer Liste von Zahlen einnimmt -RSQ = BESTIMMTHEITSMASS ## Gibt das Quadrat des Pearsonschen Korrelationskoeffizienten zurück -SKEW = SCHIEFE ## Gibt die Schiefe einer Verteilung zurück -SLOPE = STEIGUNG ## Gibt die Steigung der Regressionsgeraden zurück -SMALL = KKLEINSTE ## Gibt den k-kleinsten Wert einer Datengruppe zurück -STANDARDIZE = STANDARDISIERUNG ## Gibt den standardisierten Wert zurück -STDEV = STABW ## SchƤtzt die Standardabweichung ausgehend von einer Stichprobe -STDEVA = STABWA ## SchƤtzt die Standardabweichung ausgehend von einer Stichprobe, die Zahlen, Text und Wahrheitswerte enthƤlt -STDEVP = STABWN ## Berechnet die Standardabweichung ausgehend von der Grundgesamtheit -STDEVPA = STABWNA ## Berechnet die Standardabweichung ausgehend von der Grundgesamtheit, die Zahlen, Text und Wahrheitswerte enthƤlt -STEYX = STFEHLERYX ## Gibt den Standardfehler der geschƤtzten y-Werte für alle x-Werte der Regression zurück -TDIST = TVERT ## Gibt Werte der Verteilungsfunktion (1-Alpha) einer (Student) t-verteilten Zufallsvariablen zurück -TINV = TINV ## Gibt Quantile der t-Verteilung zurück -TREND = TREND ## Gibt Werte zurück, die sich aus einem linearen Trend ergeben -TRIMMEAN = GESTUTZTMITTEL ## Gibt den Mittelwert einer Datengruppe zurück, ohne die Randwerte zu berücksichtigen -TTEST = TTEST ## Gibt die Teststatistik eines Student'schen t-Tests zurück -VAR = VARIANZ ## SchƤtzt die Varianz ausgehend von einer Stichprobe -VARA = VARIANZA ## SchƤtzt die Varianz ausgehend von einer Stichprobe, die Zahlen, Text und Wahrheitswerte enthƤlt -VARP = VARIANZEN ## Berechnet die Varianz ausgehend von der Grundgesamtheit -VARPA = VARIANZENA ## Berechnet die Varianz ausgehend von der Grundgesamtheit, die Zahlen, Text und Wahrheitswerte enthƤlt -WEIBULL = WEIBULL ## Gibt Wahrscheinlichkeiten einer weibullverteilten Zufallsvariablen zurück -ZTEST = GTEST ## Gibt den einseitigen Wahrscheinlichkeitswert für einen Gausstest (Normalverteilung) zurück - - -## -## Text functions Textfunktionen -## -ASC = ASC ## Konvertiert DB-Text in einer Zeichenfolge (lateinische Buchstaben oder Katakana) in SB-Text -BAHTTEXT = BAHTTEXT ## Wandelt eine Zahl in Text im WƤhrungsformat ß (Baht) um -CHAR = ZEICHEN ## Gibt das der Codezahl entsprechende Zeichen zurück -CLEAN = SƄUBERN ## Lƶscht alle nicht druckbaren Zeichen aus einem Text -CODE = CODE ## Gibt die Codezahl des ersten Zeichens in einem Text zurück -CONCATENATE = VERKETTEN ## Verknüpft mehrere Textelemente zu einem Textelement -DOLLAR = DM ## Wandelt eine Zahl in Text im WƤhrungsformat € (Euro) um -EXACT = IDENTISCH ## Prüft, ob zwei Textwerte identisch sind -FIND = FINDEN ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird unterschieden) -FINDB = FINDENB ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird unterschieden) -FIXED = FEST ## Formatiert eine Zahl als Text mit einer festen Anzahl von Dezimalstellen -JIS = JIS ## Konvertiert SB-Text in einer Zeichenfolge (lateinische Buchstaben oder Katakana) in DB-Text -LEFT = LINKS ## Gibt die Zeichen ganz links in einem Textwert zurück -LEFTB = LINKSB ## Gibt die Zeichen ganz links in einem Textwert zurück -LEN = LƄNGE ## Gibt die Anzahl der Zeichen in einer Zeichenfolge zurück -LENB = LƄNGEB ## Gibt die Anzahl der Zeichen in einer Zeichenfolge zurück -LOWER = KLEIN ## Wandelt Text in Kleinbuchstaben um -MID = TEIL ## Gibt eine bestimmte Anzahl Zeichen aus einer Zeichenfolge ab der von Ihnen angegebenen Stelle zurück -MIDB = TEILB ## Gibt eine bestimmte Anzahl Zeichen aus einer Zeichenfolge ab der von Ihnen angegebenen Stelle zurück -PHONETIC = PHONETIC ## Extrahiert die phonetischen (Furigana-)Zeichen aus einer Textzeichenfolge -PROPER = GROSS2 ## Wandelt den ersten Buchstaben aller Wƶrter eines Textwerts in Großbuchstaben um -REPLACE = ERSETZEN ## Ersetzt Zeichen in Text -REPLACEB = ERSETZENB ## Ersetzt Zeichen in Text -REPT = WIEDERHOLEN ## Wiederholt einen Text so oft wie angegeben -RIGHT = RECHTS ## Gibt die Zeichen ganz rechts in einem Textwert zurück -RIGHTB = RECHTSB ## Gibt die Zeichen ganz rechts in einem Textwert zurück -SEARCH = SUCHEN ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird nicht unterschieden) -SEARCHB = SUCHENB ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird nicht unterschieden) -SUBSTITUTE = WECHSELN ## Ersetzt in einer Zeichenfolge neuen Text gegen alten -T = T ## Wandelt die zugehƶrigen Argumente in Text um -TEXT = TEXT ## Formatiert eine Zahl und wandelt sie in Text um -TRIM = GLƄTTEN ## Entfernt Leerzeichen aus Text -UPPER = GROSS ## Wandelt Text in Großbuchstaben um -VALUE = WERT ## Wandelt ein Textargument in eine Zahl um diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/en/uk/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/en/uk/config deleted file mode 100644 index 859e4be..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/en/uk/config +++ /dev/null @@ -1,8 +0,0 @@ -## -## PhpSpreadsheet -## - -## -## (For future use) -## -currencySymbol = Ā£ diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/config deleted file mode 100644 index 5b9b948..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = $ ## I'm surprised that the Excel Documentation suggests $ rather than € - - -## -## Excel Error Codes (For future use) - -## -NULL = #Ā”NULO! -DIV0 = #Ā”DIV/0! -VALUE = #Ā”VALOR! -REF = #Ā”REF! -NAME = #ĀæNOMBRE? -NUM = #Ā”NÚM! -NA = #N/A diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/functions deleted file mode 100644 index ac1ac86..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/es/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions Funciones de complementos y automatización -## -GETPIVOTDATA = IMPORTARDATOSDINAMICOS ## Devuelve los datos almacenados en un informe de tabla dinĆ”mica. - - -## -## Cube functions Funciones de cubo -## -CUBEKPIMEMBER = MIEMBROKPICUBO ## Devuelve un nombre, propiedad y medida de indicador de rendimiento clave (KPI) y muestra el nombre y la propiedad en la celda. Un KPI es una medida cuantificable, como los beneficios brutos mensuales o la facturación trimestral por empleado, que se usa para supervisar el rendimiento de una organización. -CUBEMEMBER = MIEMBROCUBO ## Devuelve un miembro o tupla en una jerarquĆ­a de cubo. Se usa para validar la existencia del miembro o la tupla en el cubo. -CUBEMEMBERPROPERTY = PROPIEDADMIEMBROCUBO ## Devuelve el valor de una propiedad de miembro del cubo Se usa para validar la existencia de un nombre de miembro en el cubo y para devolver la propiedad especificada para este miembro. -CUBERANKEDMEMBER = MIEMBRORANGOCUBO ## Devuelve el miembro n, o clasificado, de un conjunto. Se usa para devolver uno o mĆ”s elementos de un conjunto, por ejemplo, el representante con mejores ventas o los diez mejores alumnos. -CUBESET = CONJUNTOCUBO ## Define un conjunto calculado de miembros o tuplas mediante el envĆ­o de una expresión de conjunto al cubo en el servidor, lo que crea el conjunto y, despuĆ©s, devuelve dicho conjunto a Microsoft Office Excel. -CUBESETCOUNT = RECUENTOCONJUNTOCUBO ## Devuelve el nĆŗmero de elementos de un conjunto. -CUBEVALUE = VALORCUBO ## Devuelve un valor agregado de un cubo. - - -## -## Database functions Funciones de base de datos -## -DAVERAGE = BDPROMEDIO ## Devuelve el promedio de las entradas seleccionadas en la base de datos. -DCOUNT = BDCONTAR ## Cuenta el nĆŗmero de celdas que contienen nĆŗmeros en una base de datos. -DCOUNTA = BDCONTARA ## Cuenta el nĆŗmero de celdas no vacĆ­as en una base de datos. -DGET = BDEXTRAER ## Extrae de una base de datos un Ćŗnico registro que cumple los criterios especificados. -DMAX = BDMAX ## Devuelve el valor mĆ”ximo de las entradas seleccionadas de la base de datos. -DMIN = BDMIN ## Devuelve el valor mĆ­nimo de las entradas seleccionadas de la base de datos. -DPRODUCT = BDPRODUCTO ## Multiplica los valores de un campo concreto de registros de una base de datos que cumplen los criterios especificados. -DSTDEV = BDDESVEST ## Calcula la desviación estĆ”ndar a partir de una muestra de entradas seleccionadas en la base de datos. -DSTDEVP = BDDESVESTP ## Calcula la desviación estĆ”ndar en función de la población total de las entradas seleccionadas de la base de datos. -DSUM = BDSUMA ## Suma los nĆŗmeros de la columna de campo de los registros de la base de datos que cumplen los criterios. -DVAR = BDVAR ## Calcula la varianza a partir de una muestra de entradas seleccionadas de la base de datos. -DVARP = BDVARP ## Calcula la varianza a partir de la población total de entradas seleccionadas de la base de datos. - - -## -## Date and time functions Funciones de fecha y hora -## -DATE = FECHA ## Devuelve el nĆŗmero de serie correspondiente a una fecha determinada. -DATEVALUE = FECHANUMERO ## Convierte una fecha con formato de texto en un valor de nĆŗmero de serie. -DAY = DIA ## Convierte un nĆŗmero de serie en un valor de dĆ­a del mes. -DAYS360 = DIAS360 ## Calcula el nĆŗmero de dĆ­as entre dos fechas a partir de un aƱo de 360 dĆ­as. -EDATE = FECHA.MES ## Devuelve el nĆŗmero de serie de la fecha equivalente al nĆŗmero indicado de meses anteriores o posteriores a la fecha inicial. -EOMONTH = FIN.MES ## Devuelve el nĆŗmero de serie correspondiente al Ćŗltimo dĆ­a del mes anterior o posterior a un nĆŗmero de meses especificado. -HOUR = HORA ## Convierte un nĆŗmero de serie en un valor de hora. -MINUTE = MINUTO ## Convierte un nĆŗmero de serie en un valor de minuto. -MONTH = MES ## Convierte un nĆŗmero de serie en un valor de mes. -NETWORKDAYS = DIAS.LAB ## Devuelve el nĆŗmero de todos los dĆ­as laborables existentes entre dos fechas. -NOW = AHORA ## Devuelve el nĆŗmero de serie correspondiente a la fecha y hora actuales. -SECOND = SEGUNDO ## Convierte un nĆŗmero de serie en un valor de segundo. -TIME = HORA ## Devuelve el nĆŗmero de serie correspondiente a una hora determinada. -TIMEVALUE = HORANUMERO ## Convierte una hora con formato de texto en un valor de nĆŗmero de serie. -TODAY = HOY ## Devuelve el nĆŗmero de serie correspondiente al dĆ­a actual. -WEEKDAY = DIASEM ## Convierte un nĆŗmero de serie en un valor de dĆ­a de la semana. -WEEKNUM = NUM.DE.SEMANA ## Convierte un nĆŗmero de serie en un nĆŗmero que representa el lugar numĆ©rico correspondiente a una semana de un aƱo. -WORKDAY = DIA.LAB ## Devuelve el nĆŗmero de serie de la fecha que tiene lugar antes o despuĆ©s de un nĆŗmero determinado de dĆ­as laborables. -YEAR = AƑO ## Convierte un nĆŗmero de serie en un valor de aƱo. -YEARFRAC = FRAC.AƑO ## Devuelve la fracción de aƱo que representa el nĆŗmero total de dĆ­as existentes entre el valor de fecha_inicial y el de fecha_final. - - -## -## Engineering functions Funciones de ingenierĆ­a -## -BESSELI = BESSELI ## Devuelve la función Bessel In(x) modificada. -BESSELJ = BESSELJ ## Devuelve la función Bessel Jn(x). -BESSELK = BESSELK ## Devuelve la función Bessel Kn(x) modificada. -BESSELY = BESSELY ## Devuelve la función Bessel Yn(x). -BIN2DEC = BIN.A.DEC ## Convierte un nĆŗmero binario en decimal. -BIN2HEX = BIN.A.HEX ## Convierte un nĆŗmero binario en hexadecimal. -BIN2OCT = BIN.A.OCT ## Convierte un nĆŗmero binario en octal. -COMPLEX = COMPLEJO ## Convierte coeficientes reales e imaginarios en un nĆŗmero complejo. -CONVERT = CONVERTIR ## Convierte un nĆŗmero de un sistema de medida a otro. -DEC2BIN = DEC.A.BIN ## Convierte un nĆŗmero decimal en binario. -DEC2HEX = DEC.A.HEX ## Convierte un nĆŗmero decimal en hexadecimal. -DEC2OCT = DEC.A.OCT ## Convierte un nĆŗmero decimal en octal. -DELTA = DELTA ## Comprueba si dos valores son iguales. -ERF = FUN.ERROR ## Devuelve la función de error. -ERFC = FUN.ERROR.COMPL ## Devuelve la función de error complementario. -GESTEP = MAYOR.O.IGUAL ## Comprueba si un nĆŗmero es mayor que un valor de umbral. -HEX2BIN = HEX.A.BIN ## Convierte un nĆŗmero hexadecimal en binario. -HEX2DEC = HEX.A.DEC ## Convierte un nĆŗmero hexadecimal en decimal. -HEX2OCT = HEX.A.OCT ## Convierte un nĆŗmero hexadecimal en octal. -IMABS = IM.ABS ## Devuelve el valor absoluto (módulo) de un nĆŗmero complejo. -IMAGINARY = IMAGINARIO ## Devuelve el coeficiente imaginario de un nĆŗmero complejo. -IMARGUMENT = IM.ANGULO ## Devuelve el argumento theta, un Ć”ngulo expresado en radianes. -IMCONJUGATE = IM.CONJUGADA ## Devuelve la conjugada compleja de un nĆŗmero complejo. -IMCOS = IM.COS ## Devuelve el coseno de un nĆŗmero complejo. -IMDIV = IM.DIV ## Devuelve el cociente de dos nĆŗmeros complejos. -IMEXP = IM.EXP ## Devuelve el valor exponencial de un nĆŗmero complejo. -IMLN = IM.LN ## Devuelve el logaritmo natural (neperiano) de un nĆŗmero complejo. -IMLOG10 = IM.LOG10 ## Devuelve el logaritmo en base 10 de un nĆŗmero complejo. -IMLOG2 = IM.LOG2 ## Devuelve el logaritmo en base 2 de un nĆŗmero complejo. -IMPOWER = IM.POT ## Devuelve un nĆŗmero complejo elevado a una potencia entera. -IMPRODUCT = IM.PRODUCT ## Devuelve el producto de nĆŗmeros complejos. -IMREAL = IM.REAL ## Devuelve el coeficiente real de un nĆŗmero complejo. -IMSIN = IM.SENO ## Devuelve el seno de un nĆŗmero complejo. -IMSQRT = IM.RAIZ2 ## Devuelve la raĆ­z cuadrada de un nĆŗmero complejo. -IMSUB = IM.SUSTR ## Devuelve la diferencia entre dos nĆŗmeros complejos. -IMSUM = IM.SUM ## Devuelve la suma de nĆŗmeros complejos. -OCT2BIN = OCT.A.BIN ## Convierte un nĆŗmero octal en binario. -OCT2DEC = OCT.A.DEC ## Convierte un nĆŗmero octal en decimal. -OCT2HEX = OCT.A.HEX ## Convierte un nĆŗmero octal en hexadecimal. - - -## -## Financial functions Funciones financieras -## -ACCRINT = INT.ACUM ## Devuelve el interĆ©s acumulado de un valor bursĆ”til con pagos de interĆ©s periódicos. -ACCRINTM = INT.ACUM.V ## Devuelve el interĆ©s acumulado de un valor bursĆ”til con pagos de interĆ©s al vencimiento. -AMORDEGRC = AMORTIZ.PROGRE ## Devuelve la amortización de cada perĆ­odo contable mediante el uso de un coeficiente de amortización. -AMORLINC = AMORTIZ.LIN ## Devuelve la amortización de cada uno de los perĆ­odos contables. -COUPDAYBS = CUPON.DIAS.L1 ## Devuelve el nĆŗmero de dĆ­as desde el principio del perĆ­odo de un cupón hasta la fecha de liquidación. -COUPDAYS = CUPON.DIAS ## Devuelve el nĆŗmero de dĆ­as del perĆ­odo (entre dos cupones) donde se encuentra la fecha de liquidación. -COUPDAYSNC = CUPON.DIAS.L2 ## Devuelve el nĆŗmero de dĆ­as desde la fecha de liquidación hasta la fecha del próximo cupón. -COUPNCD = CUPON.FECHA.L2 ## Devuelve la fecha del próximo cupón despuĆ©s de la fecha de liquidación. -COUPNUM = CUPON.NUM ## Devuelve el nĆŗmero de pagos de cupón entre la fecha de liquidación y la fecha de vencimiento. -COUPPCD = CUPON.FECHA.L1 ## Devuelve la fecha de cupón anterior a la fecha de liquidación. -CUMIPMT = PAGO.INT.ENTRE ## Devuelve el interĆ©s acumulado pagado entre dos perĆ­odos. -CUMPRINC = PAGO.PRINC.ENTRE ## Devuelve el capital acumulado pagado de un prĆ©stamo entre dos perĆ­odos. -DB = DB ## Devuelve la amortización de un bien durante un perĆ­odo especĆ­fico a travĆ©s del mĆ©todo de amortización de saldo fijo. -DDB = DDB ## Devuelve la amortización de un bien durante un perĆ­odo especĆ­fico a travĆ©s del mĆ©todo de amortización por doble disminución de saldo u otro mĆ©todo que se especifique. -DISC = TASA.DESC ## Devuelve la tasa de descuento de un valor bursĆ”til. -DOLLARDE = MONEDA.DEC ## Convierte una cotización de un valor bursĆ”til expresada en forma fraccionaria en una cotización de un valor bursĆ”til expresada en forma decimal. -DOLLARFR = MONEDA.FRAC ## Convierte una cotización de un valor bursĆ”til expresada en forma decimal en una cotización de un valor bursĆ”til expresada en forma fraccionaria. -DURATION = DURACION ## Devuelve la duración anual de un valor bursĆ”til con pagos de interĆ©s periódico. -EFFECT = INT.EFECTIVO ## Devuelve la tasa de interĆ©s anual efectiva. -FV = VF ## Devuelve el valor futuro de una inversión. -FVSCHEDULE = VF.PLAN ## Devuelve el valor futuro de un capital inicial despuĆ©s de aplicar una serie de tasas de interĆ©s compuesto. -INTRATE = TASA.INT ## Devuelve la tasa de interĆ©s para la inversión total de un valor bursĆ”til. -IPMT = PAGOINT ## Devuelve el pago de intereses de una inversión durante un perĆ­odo determinado. -IRR = TIR ## Devuelve la tasa interna de retorno para una serie de flujos de efectivo periódicos. -ISPMT = INT.PAGO.DIR ## Calcula el interĆ©s pagado durante un perĆ­odo especĆ­fico de una inversión. -MDURATION = DURACION.MODIF ## Devuelve la duración de Macauley modificada de un valor bursĆ”til con un valor nominal supuesto de 100 $. -MIRR = TIRM ## Devuelve la tasa interna de retorno donde se financian flujos de efectivo positivos y negativos a tasas diferentes. -NOMINAL = TASA.NOMINAL ## Devuelve la tasa nominal de interĆ©s anual. -NPER = NPER ## Devuelve el nĆŗmero de perĆ­odos de una inversión. -NPV = VNA ## Devuelve el valor neto actual de una inversión en función de una serie de flujos periódicos de efectivo y una tasa de descuento. -ODDFPRICE = PRECIO.PER.IRREGULAR.1 ## Devuelve el precio por un valor nominal de 100 $ de un valor bursĆ”til con un primer perĆ­odo impar. -ODDFYIELD = RENDTO.PER.IRREGULAR.1 ## Devuelve el rendimiento de un valor bursĆ”til con un primer perĆ­odo impar. -ODDLPRICE = PRECIO.PER.IRREGULAR.2 ## Devuelve el precio por un valor nominal de 100 $ de un valor bursĆ”til con un Ćŗltimo perĆ­odo impar. -ODDLYIELD = RENDTO.PER.IRREGULAR.2 ## Devuelve el rendimiento de un valor bursĆ”til con un Ćŗltimo perĆ­odo impar. -PMT = PAGO ## Devuelve el pago periódico de una anualidad. -PPMT = PAGOPRIN ## Devuelve el pago de capital de una inversión durante un perĆ­odo determinado. -PRICE = PRECIO ## Devuelve el precio por un valor nominal de 100 $ de un valor bursĆ”til que paga una tasa de interĆ©s periódico. -PRICEDISC = PRECIO.DESCUENTO ## Devuelve el precio por un valor nominal de 100 $ de un valor bursĆ”til con descuento. -PRICEMAT = PRECIO.VENCIMIENTO ## Devuelve el precio por un valor nominal de 100 $ de un valor bursĆ”til que paga interĆ©s a su vencimiento. -PV = VALACT ## Devuelve el valor actual de una inversión. -RATE = TASA ## Devuelve la tasa de interĆ©s por perĆ­odo de una anualidad. -RECEIVED = CANTIDAD.RECIBIDA ## Devuelve la cantidad recibida al vencimiento de un valor bursĆ”til completamente invertido. -SLN = SLN ## Devuelve la amortización por mĆ©todo directo de un bien en un perĆ­odo dado. -SYD = SYD ## Devuelve la amortización por suma de dĆ­gitos de los aƱos de un bien durante un perĆ­odo especificado. -TBILLEQ = LETRA.DE.TES.EQV.A.BONO ## Devuelve el rendimiento de un bono equivalente a una letra del Tesoro (de EE.UU.) -TBILLPRICE = LETRA.DE.TES.PRECIO ## Devuelve el precio por un valor nominal de 100 $ de una letra del Tesoro (de EE.UU.) -TBILLYIELD = LETRA.DE.TES.RENDTO ## Devuelve el rendimiento de una letra del Tesoro (de EE.UU.) -VDB = DVS ## Devuelve la amortización de un bien durante un perĆ­odo especĆ­fico o parcial a travĆ©s del mĆ©todo de cĆ”lculo del saldo en disminución. -XIRR = TIR.NO.PER ## Devuelve la tasa interna de retorno para un flujo de efectivo que no es necesariamente periódico. -XNPV = VNA.NO.PER ## Devuelve el valor neto actual para un flujo de efectivo que no es necesariamente periódico. -YIELD = RENDTO ## Devuelve el rendimiento de un valor bursĆ”til que paga intereses periódicos. -YIELDDISC = RENDTO.DESC ## Devuelve el rendimiento anual de un valor bursĆ”til con descuento; por ejemplo, una letra del Tesoro (de EE.UU.) -YIELDMAT = RENDTO.VENCTO ## Devuelve el rendimiento anual de un valor bursĆ”til que paga intereses al vencimiento. - - -## -## Information functions Funciones de información -## -CELL = CELDA ## Devuelve información acerca del formato, la ubicación o el contenido de una celda. -ERROR.TYPE = TIPO.DE.ERROR ## Devuelve un nĆŗmero que corresponde a un tipo de error. -INFO = INFO ## Devuelve información acerca del entorno operativo en uso. -ISBLANK = ESBLANCO ## Devuelve VERDADERO si el valor estĆ” en blanco. -ISERR = ESERR ## Devuelve VERDADERO si el valor es cualquier valor de error excepto #N/A. -ISERROR = ESERROR ## Devuelve VERDADERO si el valor es cualquier valor de error. -ISEVEN = ES.PAR ## Devuelve VERDADERO si el nĆŗmero es par. -ISLOGICAL = ESLOGICO ## Devuelve VERDADERO si el valor es un valor lógico. -ISNA = ESNOD ## Devuelve VERDADERO si el valor es el valor de error #N/A. -ISNONTEXT = ESNOTEXTO ## Devuelve VERDADERO si el valor no es texto. -ISNUMBER = ESNUMERO ## Devuelve VERDADERO si el valor es un nĆŗmero. -ISODD = ES.IMPAR ## Devuelve VERDADERO si el nĆŗmero es impar. -ISREF = ESREF ## Devuelve VERDADERO si el valor es una referencia. -ISTEXT = ESTEXTO ## Devuelve VERDADERO si el valor es texto. -N = N ## Devuelve un valor convertido en un nĆŗmero. -NA = ND ## Devuelve el valor de error #N/A. -TYPE = TIPO ## Devuelve un nĆŗmero que indica el tipo de datos de un valor. - - -## -## Logical functions Funciones lógicas -## -AND = Y ## Devuelve VERDADERO si todos sus argumentos son VERDADERO. -FALSE = FALSO ## Devuelve el valor lógico FALSO. -IF = SI ## Especifica una prueba lógica que realizar. -IFERROR = SI.ERROR ## Devuelve un valor que se especifica si una fórmula lo evalĆŗa como un error; de lo contrario, devuelve el resultado de la fórmula. -NOT = NO ## Invierte el valor lógico del argumento. -OR = O ## Devuelve VERDADERO si cualquier argumento es VERDADERO. -TRUE = VERDADERO ## Devuelve el valor lógico VERDADERO. - - -## -## Lookup and reference functions Funciones de bĆŗsqueda y referencia -## -ADDRESS = DIRECCION ## Devuelve una referencia como texto a una sola celda de una hoja de cĆ”lculo. -AREAS = AREAS ## Devuelve el nĆŗmero de Ć”reas de una referencia. -CHOOSE = ELEGIR ## Elige un valor de una lista de valores. -COLUMN = COLUMNA ## Devuelve el nĆŗmero de columna de una referencia. -COLUMNS = COLUMNAS ## Devuelve el nĆŗmero de columnas de una referencia. -HLOOKUP = BUSCARH ## Busca en la fila superior de una matriz y devuelve el valor de la celda indicada. -HYPERLINK = HIPERVINCULO ## Crea un acceso directo o un salto que abre un documento almacenado en un servidor de red, en una intranet o en Internet. -INDEX = INDICE ## Usa un Ć­ndice para elegir un valor de una referencia o matriz. -INDIRECT = INDIRECTO ## Devuelve una referencia indicada por un valor de texto. -LOOKUP = BUSCAR ## Busca valores de un vector o una matriz. -MATCH = COINCIDIR ## Busca valores de una referencia o matriz. -OFFSET = DESREF ## Devuelve un desplazamiento de referencia respecto a una referencia dada. -ROW = FILA ## Devuelve el nĆŗmero de fila de una referencia. -ROWS = FILAS ## Devuelve el nĆŗmero de filas de una referencia. -RTD = RDTR ## Recupera datos en tiempo real desde un programa compatible con la automatización COM (automatización: modo de trabajar con los objetos de una aplicación desde otra aplicación o herramienta de entorno. La automatización, antes denominada automatización OLE, es un estĆ”ndar de la industria y una función del Modelo de objetos componentes (COM).). -TRANSPOSE = TRANSPONER ## Devuelve la transposición de una matriz. -VLOOKUP = BUSCARV ## Busca en la primera columna de una matriz y se mueve en horizontal por la fila para devolver el valor de una celda. - - -## -## Math and trigonometry functions Funciones matemĆ”ticas y trigonomĆ©tricas -## -ABS = ABS ## Devuelve el valor absoluto de un nĆŗmero. -ACOS = ACOS ## Devuelve el arcocoseno de un nĆŗmero. -ACOSH = ACOSH ## Devuelve el coseno hiperbólico inverso de un nĆŗmero. -ASIN = ASENO ## Devuelve el arcoseno de un nĆŗmero. -ASINH = ASENOH ## Devuelve el seno hiperbólico inverso de un nĆŗmero. -ATAN = ATAN ## Devuelve la arcotangente de un nĆŗmero. -ATAN2 = ATAN2 ## Devuelve la arcotangente de las coordenadas "x" e "y". -ATANH = ATANH ## Devuelve la tangente hiperbólica inversa de un nĆŗmero. -CEILING = MULTIPLO.SUPERIOR ## Redondea un nĆŗmero al entero mĆ”s próximo o al mĆŗltiplo significativo mĆ”s cercano. -COMBIN = COMBINAT ## Devuelve el nĆŗmero de combinaciones para un nĆŗmero determinado de objetos. -COS = COS ## Devuelve el coseno de un nĆŗmero. -COSH = COSH ## Devuelve el coseno hiperbólico de un nĆŗmero. -DEGREES = GRADOS ## Convierte radianes en grados. -EVEN = REDONDEA.PAR ## Redondea un nĆŗmero hasta el entero par mĆ”s próximo. -EXP = EXP ## Devuelve e elevado a la potencia de un nĆŗmero dado. -FACT = FACT ## Devuelve el factorial de un nĆŗmero. -FACTDOUBLE = FACT.DOBLE ## Devuelve el factorial doble de un nĆŗmero. -FLOOR = MULTIPLO.INFERIOR ## Redondea un nĆŗmero hacia abajo, en dirección hacia cero. -GCD = M.C.D ## Devuelve el mĆ”ximo comĆŗn divisor. -INT = ENTERO ## Redondea un nĆŗmero hacia abajo hasta el entero mĆ”s próximo. -LCM = M.C.M ## Devuelve el mĆ­nimo comĆŗn mĆŗltiplo. -LN = LN ## Devuelve el logaritmo natural (neperiano) de un nĆŗmero. -LOG = LOG ## Devuelve el logaritmo de un nĆŗmero en una base especificada. -LOG10 = LOG10 ## Devuelve el logaritmo en base 10 de un nĆŗmero. -MDETERM = MDETERM ## Devuelve la determinante matricial de una matriz. -MINVERSE = MINVERSA ## Devuelve la matriz inversa de una matriz. -MMULT = MMULT ## Devuelve el producto de matriz de dos matrices. -MOD = RESIDUO ## Devuelve el resto de la división. -MROUND = REDOND.MULT ## Devuelve un nĆŗmero redondeado al mĆŗltiplo deseado. -MULTINOMIAL = MULTINOMIAL ## Devuelve el polinomio de un conjunto de nĆŗmeros. -ODD = REDONDEA.IMPAR ## Redondea un nĆŗmero hacia arriba hasta el entero impar mĆ”s próximo. -PI = PI ## Devuelve el valor de pi. -POWER = POTENCIA ## Devuelve el resultado de elevar un nĆŗmero a una potencia. -PRODUCT = PRODUCTO ## Multiplica sus argumentos. -QUOTIENT = COCIENTE ## Devuelve la parte entera de una división. -RADIANS = RADIANES ## Convierte grados en radianes. -RAND = ALEATORIO ## Devuelve un nĆŗmero aleatorio entre 0 y 1. -RANDBETWEEN = ALEATORIO.ENTRE ## Devuelve un nĆŗmero aleatorio entre los nĆŗmeros que especifique. -ROMAN = NUMERO.ROMANO ## Convierte un nĆŗmero arĆ”bigo en nĆŗmero romano, con formato de texto. -ROUND = REDONDEAR ## Redondea un nĆŗmero al nĆŗmero de decimales especificado. -ROUNDDOWN = REDONDEAR.MENOS ## Redondea un nĆŗmero hacia abajo, en dirección hacia cero. -ROUNDUP = REDONDEAR.MAS ## Redondea un nĆŗmero hacia arriba, en dirección contraria a cero. -SERIESSUM = SUMA.SERIES ## Devuelve la suma de una serie de potencias en función de la fórmula. -SIGN = SIGNO ## Devuelve el signo de un nĆŗmero. -SIN = SENO ## Devuelve el seno de un Ć”ngulo determinado. -SINH = SENOH ## Devuelve el seno hiperbólico de un nĆŗmero. -SQRT = RAIZ ## Devuelve la raĆ­z cuadrada positiva de un nĆŗmero. -SQRTPI = RAIZ2PI ## Devuelve la raĆ­z cuadrada de un nĆŗmero multiplicado por PI (nĆŗmero * pi). -SUBTOTAL = SUBTOTALES ## Devuelve un subtotal en una lista o base de datos. -SUM = SUMA ## Suma sus argumentos. -SUMIF = SUMAR.SI ## Suma las celdas especificadas que cumplen unos criterios determinados. -SUMIFS = SUMAR.SI.CONJUNTO ## Suma las celdas de un rango que cumplen varios criterios. -SUMPRODUCT = SUMAPRODUCTO ## Devuelve la suma de los productos de los correspondientes componentes de matriz. -SUMSQ = SUMA.CUADRADOS ## Devuelve la suma de los cuadrados de los argumentos. -SUMX2MY2 = SUMAX2MENOSY2 ## Devuelve la suma de la diferencia de los cuadrados de los valores correspondientes de dos matrices. -SUMX2PY2 = SUMAX2MASY2 ## Devuelve la suma de la suma de los cuadrados de los valores correspondientes de dos matrices. -SUMXMY2 = SUMAXMENOSY2 ## Devuelve la suma de los cuadrados de las diferencias de los valores correspondientes de dos matrices. -TAN = TAN ## Devuelve la tangente de un nĆŗmero. -TANH = TANH ## Devuelve la tangente hiperbólica de un nĆŗmero. -TRUNC = TRUNCAR ## Trunca un nĆŗmero a un entero. - - -## -## Statistical functions Funciones estadĆ­sticas -## -AVEDEV = DESVPROM ## Devuelve el promedio de las desviaciones absolutas de la media de los puntos de datos. -AVERAGE = PROMEDIO ## Devuelve el promedio de sus argumentos. -AVERAGEA = PROMEDIOA ## Devuelve el promedio de sus argumentos, incluidos nĆŗmeros, texto y valores lógicos. -AVERAGEIF = PROMEDIO.SI ## Devuelve el promedio (media aritmĆ©tica) de todas las celdas de un rango que cumplen unos criterios determinados. -AVERAGEIFS = PROMEDIO.SI.CONJUNTO ## Devuelve el promedio (media aritmĆ©tica) de todas las celdas que cumplen mĆŗltiples criterios. -BETADIST = DISTR.BETA ## Devuelve la función de distribución beta acumulativa. -BETAINV = DISTR.BETA.INV ## Devuelve la función inversa de la función de distribución acumulativa de una distribución beta especificada. -BINOMDIST = DISTR.BINOM ## Devuelve la probabilidad de una variable aleatoria discreta siguiendo una distribución binomial. -CHIDIST = DISTR.CHI ## Devuelve la probabilidad de una variable aleatoria continua siguiendo una distribución chi cuadrado de una sola cola. -CHIINV = PRUEBA.CHI.INV ## Devuelve la función inversa de la probabilidad de una variable aleatoria continua siguiendo una distribución chi cuadrado de una sola cola. -CHITEST = PRUEBA.CHI ## Devuelve la prueba de independencia. -CONFIDENCE = INTERVALO.CONFIANZA ## Devuelve el intervalo de confianza de la media de una población. -CORREL = COEF.DE.CORREL ## Devuelve el coeficiente de correlación entre dos conjuntos de datos. -COUNT = CONTAR ## Cuenta cuĆ”ntos nĆŗmeros hay en la lista de argumentos. -COUNTA = CONTARA ## Cuenta cuĆ”ntos valores hay en la lista de argumentos. -COUNTBLANK = CONTAR.BLANCO ## Cuenta el nĆŗmero de celdas en blanco de un rango. -COUNTIF = CONTAR.SI ## Cuenta el nĆŗmero de celdas, dentro del rango, que cumplen el criterio especificado. -COUNTIFS = CONTAR.SI.CONJUNTO ## Cuenta el nĆŗmero de celdas, dentro del rango, que cumplen varios criterios. -COVAR = COVAR ## Devuelve la covarianza, que es el promedio de los productos de las desviaciones para cada pareja de puntos de datos. -CRITBINOM = BINOM.CRIT ## Devuelve el menor valor cuya distribución binomial acumulativa es menor o igual a un valor de criterio. -DEVSQ = DESVIA2 ## Devuelve la suma de los cuadrados de las desviaciones. -EXPONDIST = DISTR.EXP ## Devuelve la distribución exponencial. -FDIST = DISTR.F ## Devuelve la distribución de probabilidad F. -FINV = DISTR.F.INV ## Devuelve la función inversa de la distribución de probabilidad F. -FISHER = FISHER ## Devuelve la transformación Fisher. -FISHERINV = PRUEBA.FISHER.INV ## Devuelve la función inversa de la transformación Fisher. -FORECAST = PRONOSTICO ## Devuelve un valor en una tendencia lineal. -FREQUENCY = FRECUENCIA ## Devuelve una distribución de frecuencia como una matriz vertical. -FTEST = PRUEBA.F ## Devuelve el resultado de una prueba F. -GAMMADIST = DISTR.GAMMA ## Devuelve la distribución gamma. -GAMMAINV = DISTR.GAMMA.INV ## Devuelve la función inversa de la distribución gamma acumulativa. -GAMMALN = GAMMA.LN ## Devuelve el logaritmo natural de la función gamma, G(x). -GEOMEAN = MEDIA.GEOM ## Devuelve la media geomĆ©trica. -GROWTH = CRECIMIENTO ## Devuelve valores en una tendencia exponencial. -HARMEAN = MEDIA.ARMO ## Devuelve la media armónica. -HYPGEOMDIST = DISTR.HIPERGEOM ## Devuelve la distribución hipergeomĆ©trica. -INTERCEPT = INTERSECCION.EJE ## Devuelve la intersección de la lĆ­nea de regresión lineal. -KURT = CURTOSIS ## Devuelve la curtosis de un conjunto de datos. -LARGE = K.ESIMO.MAYOR ## Devuelve el k-Ć©simo mayor valor de un conjunto de datos. -LINEST = ESTIMACION.LINEAL ## Devuelve los parĆ”metros de una tendencia lineal. -LOGEST = ESTIMACION.LOGARITMICA ## Devuelve los parĆ”metros de una tendencia exponencial. -LOGINV = DISTR.LOG.INV ## Devuelve la función inversa de la distribución logarĆ­tmico-normal. -LOGNORMDIST = DISTR.LOG.NORM ## Devuelve la distribución logarĆ­tmico-normal acumulativa. -MAX = MAX ## Devuelve el valor mĆ”ximo de una lista de argumentos. -MAXA = MAXA ## Devuelve el valor mĆ”ximo de una lista de argumentos, incluidos nĆŗmeros, texto y valores lógicos. -MEDIAN = MEDIANA ## Devuelve la mediana de los nĆŗmeros dados. -MIN = MIN ## Devuelve el valor mĆ­nimo de una lista de argumentos. -MINA = MINA ## Devuelve el valor mĆ­nimo de una lista de argumentos, incluidos nĆŗmeros, texto y valores lógicos. -MODE = MODA ## Devuelve el valor mĆ”s comĆŗn de un conjunto de datos. -NEGBINOMDIST = NEGBINOMDIST ## Devuelve la distribución binomial negativa. -NORMDIST = DISTR.NORM ## Devuelve la distribución normal acumulativa. -NORMINV = DISTR.NORM.INV ## Devuelve la función inversa de la distribución normal acumulativa. -NORMSDIST = DISTR.NORM.ESTAND ## Devuelve la distribución normal estĆ”ndar acumulativa. -NORMSINV = DISTR.NORM.ESTAND.INV ## Devuelve la función inversa de la distribución normal estĆ”ndar acumulativa. -PEARSON = PEARSON ## Devuelve el coeficiente de momento de correlación de producto Pearson. -PERCENTILE = PERCENTIL ## Devuelve el k-Ć©simo percentil de los valores de un rango. -PERCENTRANK = RANGO.PERCENTIL ## Devuelve el rango porcentual de un valor de un conjunto de datos. -PERMUT = PERMUTACIONES ## Devuelve el nĆŗmero de permutaciones de un nĆŗmero determinado de objetos. -POISSON = POISSON ## Devuelve la distribución de Poisson. -PROB = PROBABILIDAD ## Devuelve la probabilidad de que los valores de un rango se encuentren entre dos lĆ­mites. -QUARTILE = CUARTIL ## Devuelve el cuartil de un conjunto de datos. -RANK = JERARQUIA ## Devuelve la jerarquĆ­a de un nĆŗmero en una lista de nĆŗmeros. -RSQ = COEFICIENTE.R2 ## Devuelve el cuadrado del coeficiente de momento de correlación de producto Pearson. -SKEW = COEFICIENTE.ASIMETRIA ## Devuelve la asimetrĆ­a de una distribución. -SLOPE = PENDIENTE ## Devuelve la pendiente de la lĆ­nea de regresión lineal. -SMALL = K.ESIMO.MENOR ## Devuelve el k-Ć©simo menor valor de un conjunto de datos. -STANDARDIZE = NORMALIZACION ## Devuelve un valor normalizado. -STDEV = DESVEST ## Calcula la desviación estĆ”ndar a partir de una muestra. -STDEVA = DESVESTA ## Calcula la desviación estĆ”ndar a partir de una muestra, incluidos nĆŗmeros, texto y valores lógicos. -STDEVP = DESVESTP ## Calcula la desviación estĆ”ndar en función de toda la población. -STDEVPA = DESVESTPA ## Calcula la desviación estĆ”ndar en función de toda la población, incluidos nĆŗmeros, texto y valores lógicos. -STEYX = ERROR.TIPICO.XY ## Devuelve el error estĆ”ndar del valor de "y" previsto para cada "x" de la regresión. -TDIST = DISTR.T ## Devuelve la distribución de t de Student. -TINV = DISTR.T.INV ## Devuelve la función inversa de la distribución de t de Student. -TREND = TENDENCIA ## Devuelve valores en una tendencia lineal. -TRIMMEAN = MEDIA.ACOTADA ## Devuelve la media del interior de un conjunto de datos. -TTEST = PRUEBA.T ## Devuelve la probabilidad asociada a una prueba t de Student. -VAR = VAR ## Calcula la varianza en función de una muestra. -VARA = VARA ## Calcula la varianza en función de una muestra, incluidos nĆŗmeros, texto y valores lógicos. -VARP = VARP ## Calcula la varianza en función de toda la población. -VARPA = VARPA ## Calcula la varianza en función de toda la población, incluidos nĆŗmeros, texto y valores lógicos. -WEIBULL = DIST.WEIBULL ## Devuelve la distribución de Weibull. -ZTEST = PRUEBA.Z ## Devuelve el valor de una probabilidad de una cola de una prueba z. - - -## -## Text functions Funciones de texto -## -ASC = ASC ## Convierte las letras inglesas o katakana de ancho completo (de dos bytes) dentro de una cadena de caracteres en caracteres de ancho medio (de un byte). -BAHTTEXT = TEXTOBAHT ## Convierte un nĆŗmero en texto, con el formato de moneda ß (Baht). -CHAR = CARACTER ## Devuelve el carĆ”cter especificado por el nĆŗmero de código. -CLEAN = LIMPIAR ## Quita del texto todos los caracteres no imprimibles. -CODE = CODIGO ## Devuelve un código numĆ©rico del primer carĆ”cter de una cadena de texto. -CONCATENATE = CONCATENAR ## Concatena varios elementos de texto en uno solo. -DOLLAR = MONEDA ## Convierte un nĆŗmero en texto, con el formato de moneda $ (dólar). -EXACT = IGUAL ## Comprueba si dos valores de texto son idĆ©nticos. -FIND = ENCONTRAR ## Busca un valor de texto dentro de otro (distingue mayĆŗsculas de minĆŗsculas). -FINDB = ENCONTRARB ## Busca un valor de texto dentro de otro (distingue mayĆŗsculas de minĆŗsculas). -FIXED = DECIMAL ## Da formato a un nĆŗmero como texto con un nĆŗmero fijo de decimales. -JIS = JIS ## Convierte las letras inglesas o katakana de ancho medio (de un byte) dentro de una cadena de caracteres en caracteres de ancho completo (de dos bytes). -LEFT = IZQUIERDA ## Devuelve los caracteres del lado izquierdo de un valor de texto. -LEFTB = IZQUIERDAB ## Devuelve los caracteres del lado izquierdo de un valor de texto. -LEN = LARGO ## Devuelve el nĆŗmero de caracteres de una cadena de texto. -LENB = LARGOB ## Devuelve el nĆŗmero de caracteres de una cadena de texto. -LOWER = MINUSC ## Pone el texto en minĆŗsculas. -MID = EXTRAE ## Devuelve un nĆŗmero especĆ­fico de caracteres de una cadena de texto que comienza en la posición que se especifique. -MIDB = EXTRAEB ## Devuelve un nĆŗmero especĆ­fico de caracteres de una cadena de texto que comienza en la posición que se especifique. -PHONETIC = FONETICO ## Extrae los caracteres fonĆ©ticos (furigana) de una cadena de texto. -PROPER = NOMPROPIO ## Pone en mayĆŗscula la primera letra de cada palabra de un valor de texto. -REPLACE = REEMPLAZAR ## Reemplaza caracteres de texto. -REPLACEB = REEMPLAZARB ## Reemplaza caracteres de texto. -REPT = REPETIR ## Repite el texto un nĆŗmero determinado de veces. -RIGHT = DERECHA ## Devuelve los caracteres del lado derecho de un valor de texto. -RIGHTB = DERECHAB ## Devuelve los caracteres del lado derecho de un valor de texto. -SEARCH = HALLAR ## Busca un valor de texto dentro de otro (no distingue mayĆŗsculas de minĆŗsculas). -SEARCHB = HALLARB ## Busca un valor de texto dentro de otro (no distingue mayĆŗsculas de minĆŗsculas). -SUBSTITUTE = SUSTITUIR ## Sustituye texto nuevo por texto antiguo en una cadena de texto. -T = T ## Convierte sus argumentos a texto. -TEXT = TEXTO ## Da formato a un nĆŗmero y lo convierte en texto. -TRIM = ESPACIOS ## Quita los espacios del texto. -UPPER = MAYUSC ## Pone el texto en mayĆŗsculas. -VALUE = VALOR ## Convierte un argumento de texto en un nĆŗmero. diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/config deleted file mode 100644 index 22aaf58..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = $ # Symbol not known, should it be a € (Euro)? - - -## -## Excel Error Codes (For future use) - -## -NULL = #TYHJƄ! -DIV0 = #JAKO/0! -VALUE = #ARVO! -REF = #VIITTAUS! -NAME = #NIMI? -NUM = #LUKU! -NA = #PUUTTUU diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/functions deleted file mode 100644 index 289e0ea..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fi/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions Apuohjelma- ja automaatiofunktiot -## -GETPIVOTDATA = NOUDA.PIVOT.TIEDOT ## Palauttaa pivot-taulukkoraporttiin tallennettuja tietoja. - - -## -## Cube functions Kuutiofunktiot -## -CUBEKPIMEMBER = KUUTIOKPIJƄSEN ## Palauttaa suorituskykyilmaisimen (KPI) nimen, ominaisuuden sekƤ mitan ja nƤyttƤƤ nimen sekƤ ominaisuuden solussa. KPI on mitattavissa oleva suure, kuten kuukauden bruttotuotto tai vuosineljƤnneksen tyƶntekijƤkohtainen liikevaihto, joiden avulla tarkkaillaan organisaation suorituskykyƤ. -CUBEMEMBER = KUUTIONJƄSEN ## Palauttaa kuutiohierarkian jƤsenen tai monikon. TƤllƤ funktiolla voit tarkistaa, ettƤ jƤsen tai monikko on olemassa kuutiossa. -CUBEMEMBERPROPERTY = KUUTIONJƄSENENOMINAISUUS ## Palauttaa kuution jƤsenominaisuuden arvon. TƤllƤ funktiolla voit tarkistaa, ettƤ nimi on olemassa kuutiossa, ja palauttaa tƤmƤn jƤsenen mƤƤritetyn ominaisuuden. -CUBERANKEDMEMBER = KUUTIONLUOKITELTUJƄSEN ## Palauttaa joukon n:nnen jƤsenen. TƤllƤ funktiolla voit palauttaa joukosta elementtejƤ, kuten parhaan myyjƤn tai 10 parasta opiskelijaa. -CUBESET = KUUTIOJOUKKO ## MƤƤrittƤƤ lasketun jƤsen- tai monikkojoukon lƤhettƤmƤllƤ joukon lausekkeita palvelimessa olevalle kuutiolle. Palvelin luo joukon ja palauttaa sen Microsoft Office Excelille. -CUBESETCOUNT = KUUTIOJOUKKOJENMƄƄRƄ ## Palauttaa joukon kohteiden mƤƤrƤn. -CUBEVALUE = KUUTIONARVO ## Palauttaa koostetun arvon kuutiosta. - - -## -## Database functions Tietokantafunktiot -## -DAVERAGE = TKESKIARVO ## Palauttaa valittujen tietokantamerkintƶjen keskiarvon. -DCOUNT = TLASKE ## Laskee tietokannan lukuja sisƤltƤvien solujen mƤƤrƤn. -DCOUNTA = TLASKEA ## Laskee tietokannan tietoja sisƤltƤvien solujen mƤƤrƤn. -DGET = TNOUDA ## Hakee mƤƤritettyjƤ ehtoja vastaavan tietueen tietokannasta. -DMAX = TMAKS ## Palauttaa suurimman arvon tietokannasta valittujen arvojen joukosta. -DMIN = TMIN ## Palauttaa pienimmƤn arvon tietokannasta valittujen arvojen joukosta. -DPRODUCT = TTULO ## Kertoo mƤƤritetyn ehdon tƤyttƤvien tietokannan tietueiden tietyssƤ kentƤssƤ olevat arvot. -DSTDEV = TKESKIHAJONTA ## Laskee keskihajonnan tietokannasta valituista arvoista muodostuvan otoksen perusteella. -DSTDEVP = TKESKIHAJONTAP ## Laskee keskihajonnan tietokannasta valittujen arvojen koko populaation perusteella. -DSUM = TSUMMA ## LisƤƤ luvut mƤƤritetyn ehdon tƤyttƤvien tietokannan tietueiden kenttƤsarakkeeseen. -DVAR = TVARIANSSI ## Laskee varianssin tietokannasta valittujen arvojen otoksen perusteella. -DVARP = TVARIANSSIP ## Laskee varianssin tietokannasta valittujen arvojen koko populaation perusteella. - - -## -## Date and time functions PƤivƤmƤƤrƤ- ja aikafunktiot -## -DATE = PƄIVƄYS ## Palauttaa annetun pƤivƤmƤƤrƤn jƤrjestysluvun. -DATEVALUE = PƄIVƄYSARVO ## Muuntaa tekstimuodossa olevan pƤivƤmƤƤrƤn jƤrjestysluvuksi. -DAY = PƄIVƄ ## Muuntaa jƤrjestysluvun kuukauden pƤivƤksi. -DAYS360 = PƄIVƄT360 ## Laskee kahden pƤivƤmƤƤrƤn vƤlisten pƤivien mƤƤrƤn kƤyttƤen perustana 360-pƤivƤistƤ vuotta. -EDATE = PƄIVƄ.KUUKAUSI ## Palauttaa jƤrjestyslukuna pƤivƤmƤƤrƤn, joka poikkeaa aloituspƤivƤn pƤivƤmƤƤrƤstƤ annetun kuukausimƤƤrƤn verran joko eteen- tai taaksepƤin. -EOMONTH = KUUKAUSI.LOPPU ## Palauttaa jƤrjestyslukuna sen kuukauden viimeisen pƤivƤmƤƤrƤn, joka poikkeaa annetun kuukausimƤƤrƤn verran eteen- tai taaksepƤin. -HOUR = TUNNIT ## Muuntaa jƤrjestysluvun tunneiksi. -MINUTE = MINUUTIT ## Muuntaa jƤrjestysluvun minuuteiksi. -MONTH = KUUKAUSI ## Muuntaa jƤrjestysluvun kuukausiksi. -NETWORKDAYS = TYƖPƄIVƄT ## Palauttaa kahden pƤivƤmƤƤrƤn vƤlissƤ olevien tƤysien tyƶpƤivien mƤƤrƤn. -NOW = NYT ## Palauttaa kuluvan pƤivƤmƤƤrƤn ja ajan jƤrjestysnumeron. -SECOND = SEKUNNIT ## Muuntaa jƤrjestysluvun sekunneiksi. -TIME = AIKA ## Palauttaa annetun kellonajan jƤrjestysluvun. -TIMEVALUE = AIKA_ARVO ## Muuntaa tekstimuodossa olevan kellonajan jƤrjestysluvuksi. -TODAY = TƄMƄ.PƄIVƄ ## Palauttaa kuluvan pƤivƤn pƤivƤmƤƤrƤn jƤrjestysluvun. -WEEKDAY = VIIKONPƄIVƄ ## Muuntaa jƤrjestysluvun viikonpƤivƤksi. -WEEKNUM = VIIKKO.NRO ## Muuntaa jƤrjestysluvun luvuksi, joka ilmaisee viikon jƤrjestysluvun vuoden alusta laskettuna. -WORKDAY = TYƖPƄIVƄ ## Palauttaa jƤrjestysluvun pƤivƤmƤƤrƤlle, joka sijaitsee annettujen tyƶpƤivien verran eteen tai taaksepƤin. -YEAR = VUOSI ## Muuntaa jƤrjestysluvun vuosiksi. -YEARFRAC = VUOSI.OSA ## Palauttaa mƤƤritettyjen pƤivƤmƤƤrien (aloituspƤivƤ ja lopetuspƤivƤ) vƤlisen osan vuodesta. - - -## -## Engineering functions Tekniset funktiot -## -BESSELI = BESSELI ## Palauttaa muunnetun Bessel-funktion In(x). -BESSELJ = BESSELJ ## Palauttaa Bessel-funktion Jn(x). -BESSELK = BESSELK ## Palauttaa muunnetun Bessel-funktion Kn(x). -BESSELY = BESSELY ## Palauttaa Bessel-funktion Yn(x). -BIN2DEC = BINDES ## Muuntaa binaariluvun desimaaliluvuksi. -BIN2HEX = BINHEKSA ## Muuntaa binaariluvun heksadesimaaliluvuksi. -BIN2OCT = BINOKT ## Muuntaa binaariluvun oktaaliluvuksi. -COMPLEX = KOMPLEKSI ## Muuntaa reaali- ja imaginaariosien kertoimet kompleksiluvuksi. -CONVERT = MUUNNA ## Muuntaa luvun toisen mittajƤrjestelmƤn mukaiseksi. -DEC2BIN = DESBIN ## Muuntaa desimaaliluvun binaariluvuksi. -DEC2HEX = DESHEKSA ## Muuntaa kymmenjƤrjestelmƤn luvun heksadesimaaliluvuksi. -DEC2OCT = DESOKT ## Muuntaa kymmenjƤrjestelmƤn luvun oktaaliluvuksi. -DELTA = SAMA.ARVO ## Tarkistaa, ovatko kaksi arvoa yhtƤ suuria. -ERF = VIRHEFUNKTIO ## Palauttaa virhefunktion. -ERFC = VIRHEFUNKTIO.KOMPLEMENTTI ## Palauttaa komplementtivirhefunktion. -GESTEP = RAJA ## Testaa, onko luku suurempi kuin kynnysarvo. -HEX2BIN = HEKSABIN ## Muuntaa heksadesimaaliluvun binaariluvuksi. -HEX2DEC = HEKSADES ## Muuntaa heksadesimaaliluvun desimaaliluvuksi. -HEX2OCT = HEKSAOKT ## Muuntaa heksadesimaaliluvun oktaaliluvuksi. -IMABS = KOMPLEKSI.ITSEISARVO ## Palauttaa kompleksiluvun itseisarvon (moduluksen). -IMAGINARY = KOMPLEKSI.IMAG ## Palauttaa kompleksiluvun imaginaariosan kertoimen. -IMARGUMENT = KOMPLEKSI.ARG ## Palauttaa theeta-argumentin, joka on radiaaneina annettu kulma. -IMCONJUGATE = KOMPLEKSI.KONJ ## Palauttaa kompleksiluvun konjugaattiluvun. -IMCOS = KOMPLEKSI.COS ## Palauttaa kompleksiluvun kosinin. -IMDIV = KOMPLEKSI.OSAM ## Palauttaa kahden kompleksiluvun osamƤƤrƤn. -IMEXP = KOMPLEKSI.EKSP ## Palauttaa kompleksiluvun eksponentin. -IMLN = KOMPLEKSI.LN ## Palauttaa kompleksiluvun luonnollisen logaritmin. -IMLOG10 = KOMPLEKSI.LOG10 ## Palauttaa kompleksiluvun kymmenkantaisen logaritmin. -IMLOG2 = KOMPLEKSI.LOG2 ## Palauttaa kompleksiluvun kaksikantaisen logaritmin. -IMPOWER = KOMPLEKSI.POT ## Palauttaa kokonaislukupotenssiin korotetun kompleksiluvun. -IMPRODUCT = KOMPLEKSI.TULO ## Palauttaa kompleksilukujen tulon. -IMREAL = KOMPLEKSI.REAALI ## Palauttaa kompleksiluvun reaaliosan kertoimen. -IMSIN = KOMPLEKSI.SIN ## Palauttaa kompleksiluvun sinin. -IMSQRT = KOMPLEKSI.NELIƖJ ## Palauttaa kompleksiluvun neliƶjuuren. -IMSUB = KOMPLEKSI.EROTUS ## Palauttaa kahden kompleksiluvun erotuksen. -IMSUM = KOMPLEKSI.SUM ## Palauttaa kompleksilukujen summan. -OCT2BIN = OKTBIN ## Muuntaa oktaaliluvun binaariluvuksi. -OCT2DEC = OKTDES ## Muuntaa oktaaliluvun desimaaliluvuksi. -OCT2HEX = OKTHEKSA ## Muuntaa oktaaliluvun heksadesimaaliluvuksi. - - -## -## Financial functions Rahoitusfunktiot -## -ACCRINT = KERTYNYT.KORKO ## Laskee arvopaperille kertyneen koron, kun korko kertyy sƤƤnnƶllisin vƤliajoin. -ACCRINTM = KERTYNYT.KORKO.LOPUSSA ## Laskee arvopaperille kertyneen koron, kun korko maksetaan erƤpƤivƤnƤ. -AMORDEGRC = AMORDEGRC ## Laskee kunkin laskentakauden poiston poistokerrointa kƤyttƤmƤllƤ. -AMORLINC = AMORLINC ## Palauttaa kunkin laskentakauden poiston. -COUPDAYBS = KORKOPƄIVƄT.ALUSTA ## Palauttaa koronmaksukauden aloituspƤivƤn ja tilityspƤivƤn vƤlisen ajanjakson pƤivien mƤƤrƤn. -COUPDAYS = KORKOPƄIVƄT ## Palauttaa pƤivien mƤƤrƤn koronmaksukaudelta, johon tilityspƤivƤ kuuluu. -COUPDAYSNC = KORKOPƄIVƄT.SEURAAVA ## Palauttaa tilityspƤivƤn ja seuraavan koronmaksupƤivƤn vƤlisen ajanjakson pƤivien mƤƤrƤn. -COUPNCD = KORKOMAKSU.SEURAAVA ## Palauttaa tilityspƤivƤn jƤlkeisen seuraavan koronmaksupƤivƤn. -COUPNUM = KORKOPƄIVƄJAKSOT ## Palauttaa arvopaperin ostopƤivƤn ja erƤƤntymispƤivƤn vƤlisten koronmaksupƤivien mƤƤrƤn. -COUPPCD = KORKOPƄIVƄ.EDELLINEN ## Palauttaa tilityspƤivƤƤ edeltƤvƤn koronmaksupƤivƤn. -CUMIPMT = MAKSETTU.KORKO ## Palauttaa kahden jakson vƤlisenƤ aikana kertyneen koron. -CUMPRINC = MAKSETTU.LYHENNYS ## Palauttaa lainalle kahden jakson vƤlisenƤ aikana kertyneen lyhennyksen. -DB = DB ## Palauttaa kauden kirjanpidollisen poiston amerikkalaisen DB-menetelmƤn (Fixed-declining balance) mukaan. -DDB = DDB ## Palauttaa kauden kirjanpidollisen poiston amerikkalaisen DDB-menetelmƤn (Double-Declining Balance) tai jonkin muun mƤƤrittƤmƤsi menetelmƤn mukaan. -DISC = DISKONTTOKORKO ## Palauttaa arvopaperin diskonttokoron. -DOLLARDE = VALUUTTA.DES ## Muuntaa murtolukuna ilmoitetun valuuttamƤƤrƤn desimaaliluvuksi. -DOLLARFR = VALUUTTA.MURTO ## Muuntaa desimaalilukuna ilmaistun valuuttamƤƤrƤn murtoluvuksi. -DURATION = KESTO ## Palauttaa keston arvopaperille, jonka koronmaksu tapahtuu sƤƤnnƶllisesti. -EFFECT = KORKO.EFEKT ## Palauttaa todellisen vuosikoron. -FV = TULEVA.ARVO ## Palauttaa sijoituksen tulevan arvon. -FVSCHEDULE = TULEVA.ARVO.ERIKORKO ## Palauttaa pƤƤoman tulevan arvon, kun pƤƤomalle on kertynyt korkoa vaihtelevasti. -INTRATE = KORKO.ARVOPAPERI ## Palauttaa arvopaperin korkokannan tƤysin sijoitetulle arvopaperille. -IPMT = IPMT ## Laskee sijoitukselle tai lainalle tiettynƤ ajanjaksona kertyvƤn koron. -IRR = SISƄINEN.KORKO ## Laskee sisƤisen korkokannan kassavirrasta muodostuvalle sarjalle. -ISPMT = ONMAKSU ## Laskee sijoituksen maksetun koron tietyllƤ jaksolla. -MDURATION = KESTO.MUUNN ## Palauttaa muunnetun Macauley-keston arvopaperille, jonka oletettu nimellisarvo on 100 euroa. -MIRR = MSISƄINEN ## Palauttaa sisƤisen korkokannan, kun positiivisten ja negatiivisten kassavirtojen rahoituskorko on erilainen. -NOMINAL = KORKO.VUOSI ## Palauttaa vuosittaisen nimelliskoron. -NPER = NJAKSO ## Palauttaa sijoituksen jaksojen mƤƤrƤn. -NPV = NNA ## Palauttaa sijoituksen nykyarvon toistuvista kassavirroista muodostuvan sarjan ja diskonttokoron perusteella. -ODDFPRICE = PARITON.ENS.NIMELLISARVO ## Palauttaa arvopaperin hinnan tilanteessa, jossa ensimmƤinen jakso on pariton. -ODDFYIELD = PARITON.ENS.TUOTTO ## Palauttaa arvopaperin tuoton tilanteessa, jossa ensimmƤinen jakso on pariton. -ODDLPRICE = PARITON.VIIM.NIMELLISARVO ## Palauttaa arvopaperin hinnan tilanteessa, jossa viimeinen jakso on pariton. -ODDLYIELD = PARITON.VIIM.TUOTTO ## Palauttaa arvopaperin tuoton tilanteessa, jossa viimeinen jakso on pariton. -PMT = MAKSU ## Palauttaa annuiteetin kausittaisen maksuerƤn. -PPMT = PPMT ## Laskee sijoitukselle tai lainalle tiettynƤ ajanjaksona maksettavan lyhennyksen. -PRICE = HINTA ## Palauttaa hinnan 100 euron nimellisarvoa kohden arvopaperille, jonka korko maksetaan sƤƤnnƶllisin vƤliajoin. -PRICEDISC = HINTA.DISK ## Palauttaa diskontatun arvopaperin hinnan 100 euron nimellisarvoa kohden. -PRICEMAT = HINTA.LUNASTUS ## Palauttaa hinnan 100 euron nimellisarvoa kohden arvopaperille, jonka korko maksetaan erƤƤntymispƤivƤnƤ. -PV = NA ## Palauttaa sijoituksen nykyarvon. -RATE = KORKO ## Palauttaa annuiteetin kausittaisen korkokannan. -RECEIVED = SAATU.HINTA ## Palauttaa arvopaperin tuoton erƤƤntymispƤivƤnƤ kokonaan maksetulle sijoitukselle. -SLN = STP ## Palauttaa sijoituksen tasapoiston yhdeltƤ jaksolta. -SYD = VUOSIPOISTO ## Palauttaa sijoituksen vuosipoiston annettuna kautena amerikkalaisen SYD-menetelmƤn (Sum-of-Year's Digits) avulla. -TBILLEQ = OBLIG.TUOTTOPROS ## Palauttaa valtion obligaation tuoton vastaavana joukkovelkakirjan tuottona. -TBILLPRICE = OBLIG.HINTA ## Palauttaa obligaation hinnan 100 euron nimellisarvoa kohden. -TBILLYIELD = OBLIG.TUOTTO ## Palauttaa obligaation tuoton. -VDB = VDB ## Palauttaa annetun kauden tai kauden osan kirjanpidollisen poiston amerikkalaisen DB-menetelmƤn (Fixed-declining balance) mukaan. -XIRR = SISƄINEN.KORKO.JAKSOTON ## Palauttaa sisƤisen korkokannan kassavirtojen sarjoille, jotka eivƤt vƤlttƤmƤttƤ ole sƤƤnnƶllisiƤ. -XNPV = NNA.JAKSOTON ## Palauttaa nettonykyarvon kassavirtasarjalle, joka ei vƤlttƤmƤttƤ ole kausittainen. -YIELD = TUOTTO ## Palauttaa tuoton arvopaperille, jonka korko maksetaan sƤƤnnƶllisin vƤliajoin. -YIELDDISC = TUOTTO.DISK ## Palauttaa diskontatun arvopaperin, kuten obligaation, vuosittaisen tuoton. -YIELDMAT = TUOTTO.ERƄP ## Palauttaa erƤƤntymispƤivƤnƤƤn korkoa tuottavan arvopaperin vuosittaisen tuoton. - - -## -## Information functions Erikoisfunktiot -## -CELL = SOLU ## Palauttaa tietoja solun muotoilusta, sijainnista ja sisƤllƶstƤ. -ERROR.TYPE = VIRHEEN.LAJI ## Palauttaa virhetyyppiƤ vastaavan luvun. -INFO = KUVAUS ## Palauttaa tietoja nykyisestƤ kƤyttƶympƤristƶstƤ. -ISBLANK = ONTYHJƄ ## Palauttaa arvon TOSI, jos arvo on tyhjƤ. -ISERR = ONVIRH ## Palauttaa arvon TOSI, jos arvo on mikƤ tahansa virhearvo paitsi arvo #PUUTTUU!. -ISERROR = ONVIRHE ## Palauttaa arvon TOSI, jos arvo on mikƤ tahansa virhearvo. -ISEVEN = ONPARILLINEN ## Palauttaa arvon TOSI, jos arvo on parillinen. -ISLOGICAL = ONTOTUUS ## Palauttaa arvon TOSI, jos arvo on mikƤ tahansa looginen arvo. -ISNA = ONPUUTTUU ## Palauttaa arvon TOSI, jos virhearvo on #PUUTTUU!. -ISNONTEXT = ONEI_TEKSTI ## Palauttaa arvon TOSI, jos arvo ei ole teksti. -ISNUMBER = ONLUKU ## Palauttaa arvon TOSI, jos arvo on luku. -ISODD = ONPARITON ## Palauttaa arvon TOSI, jos arvo on pariton. -ISREF = ONVIITT ## Palauttaa arvon TOSI, jos arvo on viittaus. -ISTEXT = ONTEKSTI ## Palauttaa arvon TOSI, jos arvo on teksti. -N = N ## Palauttaa arvon luvuksi muunnettuna. -NA = PUUTTUU ## Palauttaa virhearvon #PUUTTUU!. -TYPE = TYYPPI ## Palauttaa luvun, joka ilmaisee arvon tietotyypin. - - -## -## Logical functions Loogiset funktiot -## -AND = JA ## Palauttaa arvon TOSI, jos kaikkien argumenttien arvo on TOSI. -FALSE = EPƄTOSI ## Palauttaa totuusarvon EPƄTOSI. -IF = JOS ## MƤƤrittƤƤ suoritettavan loogisen testin. -IFERROR = JOSVIRHE ## Palauttaa mƤƤrittƤmƤsi arvon, jos kaavan tulos on virhe; muussa tapauksessa palauttaa kaavan tuloksen. -NOT = EI ## KƤƤntƤƤ argumentin loogisen arvon. -OR = TAI ## Palauttaa arvon TOSI, jos minkƤ tahansa argumentin arvo on TOSI. -TRUE = TOSI ## Palauttaa totuusarvon TOSI. - - -## -## Lookup and reference functions Haku- ja viitefunktiot -## -ADDRESS = OSOITE ## Palauttaa laskentataulukon soluun osoittavan viittauksen tekstinƤ. -AREAS = ALUEET ## Palauttaa viittauksessa olevien alueiden mƤƤrƤn. -CHOOSE = VALITSE.INDEKSI ## Valitsee arvon arvoluettelosta. -COLUMN = SARAKE ## Palauttaa viittauksen sarakenumeron. -COLUMNS = SARAKKEET ## Palauttaa viittauksessa olevien sarakkeiden mƤƤrƤn. -HLOOKUP = VHAKU ## Suorittaa haun matriisin ylimmƤltƤ riviltƤ ja palauttaa mƤƤritetyn solun arvon. -HYPERLINK = HYPERLINKKI ## Luo pikakuvakkeen tai tekstin, joka avaa verkkopalvelimeen, intranetiin tai Internetiin tallennetun tiedoston. -INDEX = INDEKSI ## Valitsee arvon viittauksesta tai matriisista indeksin mukaan. -INDIRECT = EPƄSUORA ## Palauttaa tekstiarvona ilmaistun viittauksen. -LOOKUP = HAKU ## Etsii arvoja vektorista tai matriisista. -MATCH = VASTINE ## Etsii arvoja viittauksesta tai matriisista. -OFFSET = SIIRTYMƄ ## Palauttaa annetun viittauksen siirtymƤn. -ROW = RIVI ## Palauttaa viittauksen rivinumeron. -ROWS = RIVIT ## Palauttaa viittauksessa olevien rivien mƤƤrƤn. -RTD = RTD ## Noutaa COM-automaatiota (automaatio: Tapa kƤsitellƤ sovelluksen objekteja toisesta sovelluksesta tai kehitystyƶkalusta. Automaatio, jota aiemmin kutsuttiin OLE-automaatioksi, on teollisuusstandardi ja COM-mallin (Component Object Model) ominaisuus.) tukevasta ohjelmasta reaaliaikaisia tietoja. -TRANSPOSE = TRANSPONOI ## Palauttaa matriisin kƤƤnteismatriisin. -VLOOKUP = PHAKU ## Suorittaa haun matriisin ensimmƤisestƤ sarakkeesta ja palauttaa rivillƤ olevan solun arvon. - - -## -## Math and trigonometry functions Matemaattiset ja trigonometriset funktiot -## -ABS = ITSEISARVO ## Palauttaa luvun itseisarvon. -ACOS = ACOS ## Palauttaa luvun arkuskosinin. -ACOSH = ACOSH ## Palauttaa luvun kƤƤnteisen hyperbolisen kosinin. -ASIN = ASIN ## Palauttaa luvun arkussinin. -ASINH = ASINH ## Palauttaa luvun kƤƤnteisen hyperbolisen sinin. -ATAN = ATAN ## Palauttaa luvun arkustangentin. -ATAN2 = ATAN2 ## Palauttaa arkustangentin x- ja y-koordinaatin perusteella. -ATANH = ATANH ## Palauttaa luvun kƤƤnteisen hyperbolisen tangentin. -CEILING = PYƖRISTƄ.KERR.YLƖS ## PyƶristƤƤ luvun lƤhimpƤƤn kokonaislukuun tai tarkkuusargumentin lƤhimpƤƤn kerrannaiseen. -COMBIN = KOMBINAATIO ## Palauttaa mahdollisten kombinaatioiden mƤƤrƤn annetulle objektien mƤƤrƤlle. -COS = COS ## Palauttaa luvun kosinin. -COSH = COSH ## Palauttaa luvun hyperbolisen kosinin. -DEGREES = ASTEET ## Muuntaa radiaanit asteiksi. -EVEN = PARILLINEN ## PyƶristƤƤ luvun ylƶspƤin lƤhimpƤƤn parilliseen kokonaislukuun. -EXP = EKSPONENTTI ## Palauttaa e:n korotettuna annetun luvun osoittamaan potenssiin. -FACT = KERTOMA ## Palauttaa luvun kertoman. -FACTDOUBLE = KERTOMA.OSA ## Palauttaa luvun osakertoman. -FLOOR = PYƖRISTƄ.KERR.ALAS ## PyƶristƤƤ luvun alaspƤin (nollaa kohti). -GCD = SUURIN.YHT.TEKIJƄ ## Palauttaa suurimman yhteisen tekijƤn. -INT = KOKONAISLUKU ## PyƶristƤƤ luvun alaspƤin lƤhimpƤƤn kokonaislukuun. -LCM = PIENIN.YHT.JAETTAVA ## Palauttaa pienimmƤn yhteisen tekijƤn. -LN = LUONNLOG ## Palauttaa luvun luonnollisen logaritmin. -LOG = LOG ## Laskee luvun logaritmin kƤyttƤmƤllƤ annettua kantalukua. -LOG10 = LOG10 ## Palauttaa luvun kymmenkantaisen logaritmin. -MDETERM = MDETERM ## Palauttaa matriisin matriisideterminantin. -MINVERSE = MKƄƄNTEINEN ## Palauttaa matriisin kƤƤnteismatriisin. -MMULT = MKERRO ## Palauttaa kahden matriisin tulon. -MOD = JAKOJ ## Palauttaa jakolaskun jƤƤnnƶksen. -MROUND = PYƖRISTƄ.KERR ## Palauttaa luvun pyƶristettynƤ annetun luvun kerrannaiseen. -MULTINOMIAL = MULTINOMI ## Palauttaa lukujoukon multinomin. -ODD = PARITON ## PyƶristƤƤ luvun ylƶspƤin lƤhimpƤƤn parittomaan kokonaislukuun. -PI = PII ## Palauttaa piin arvon. -POWER = POTENSSI ## Palauttaa luvun korotettuna haluttuun potenssiin. -PRODUCT = TULO ## Kertoo annetut argumentit. -QUOTIENT = OSAMƄƄRƄ ## Palauttaa osamƤƤrƤn kokonaislukuosan. -RADIANS = RADIAANIT ## Muuntaa asteet radiaaneiksi. -RAND = SATUNNAISLUKU ## Palauttaa satunnaisluvun vƤliltƤ 0–1. -RANDBETWEEN = SATUNNAISLUKU.VƄLILTƄ ## Palauttaa satunnaisluvun mƤƤritettyjen lukujen vƤliltƤ. -ROMAN = ROMAN ## Muuntaa arabialaisen numeron tekstimuotoiseksi roomalaiseksi numeroksi. -ROUND = PYƖRISTƄ ## PyƶristƤƤ luvun annettuun mƤƤrƤƤn desimaaleja. -ROUNDDOWN = PYƖRISTƄ.DES.ALAS ## PyƶristƤƤ luvun alaspƤin (nollaa kohti). -ROUNDUP = PYƖRISTƄ.DES.YLƖS ## PyƶristƤƤ luvun ylƶspƤin (poispƤin nollasta). -SERIESSUM = SARJA.SUMMA ## Palauttaa kaavaan perustuvan potenssisarjan arvon. -SIGN = ETUMERKKI ## Palauttaa luvun etumerkin. -SIN = SIN ## Palauttaa annetun kulman sinin. -SINH = SINH ## Palauttaa luvun hyperbolisen sinin. -SQRT = NELIƖJUURI ## Palauttaa positiivisen neliƶjuuren. -SQRTPI = NELIƖJUURI.PII ## Palauttaa tulon (luku * pii) neliƶjuuren. -SUBTOTAL = VƄLISUMMA ## Palauttaa luettelon tai tietokannan vƤlisumman. -SUM = SUMMA ## Laskee yhteen annetut argumentit. -SUMIF = SUMMA.JOS ## Laskee ehdot tƤyttƤvien solujen summan. -SUMIFS = SUMMA.JOS.JOUKKO ## Laskee yhteen solualueen useita ehtoja vastaavat solut. -SUMPRODUCT = TULOJEN.SUMMA ## Palauttaa matriisin toisiaan vastaavien osien tulojen summan. -SUMSQ = NELIƖSUMMA ## Palauttaa argumenttien neliƶiden summan. -SUMX2MY2 = NELIƖSUMMIEN.EROTUS ## Palauttaa kahden matriisin toisiaan vastaavien arvojen laskettujen neliƶsummien erotuksen. -SUMX2PY2 = NELIƖSUMMIEN.SUMMA ## Palauttaa kahden matriisin toisiaan vastaavien arvojen neliƶsummien summan. -SUMXMY2 = EROTUSTEN.NELIƖSUMMA ## Palauttaa kahden matriisin toisiaan vastaavien arvojen erotusten neliƶsumman. -TAN = TAN ## Palauttaa luvun tangentin. -TANH = TANH ## Palauttaa luvun hyperbolisen tangentin. -TRUNC = KATKAISE ## Katkaisee luvun kokonaisluvuksi. - - -## -## Statistical functions Tilastolliset funktiot -## -AVEDEV = KESKIPOIKKEAMA ## Palauttaa hajontojen itseisarvojen keskiarvon. -AVERAGE = KESKIARVO ## Palauttaa argumenttien keskiarvon. -AVERAGEA = KESKIARVOA ## Palauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, keskiarvon. -AVERAGEIF = KESKIARVO.JOS ## Palauttaa alueen niiden solujen keskiarvon (aritmeettisen keskiarvon), jotka tƤyttƤvƤt annetut ehdot. -AVERAGEIFS = KESKIARVO.JOS.JOUKKO ## Palauttaa niiden solujen keskiarvon (aritmeettisen keskiarvon), jotka vastaavat useita ehtoja. -BETADIST = BEETAJAKAUMA ## Palauttaa kumulatiivisen beetajakaumafunktion arvon. -BETAINV = BEETAJAKAUMA.KƄƄNT ## Palauttaa mƤƤritetyn beetajakauman kƤƤnteisen kumulatiivisen jakaumafunktion arvon. -BINOMDIST = BINOMIJAKAUMA ## Palauttaa yksittƤisen termin binomijakaumatodennƤkƶisyyden. -CHIDIST = CHIJAKAUMA ## Palauttaa yksisuuntaisen chi-neliƶn jakauman todennƤkƶisyyden. -CHIINV = CHIJAKAUMA.KƄƄNT ## Palauttaa yksisuuntaisen chi-neliƶn jakauman todennƤkƶisyyden kƤƤnteisarvon. -CHITEST = CHITESTI ## Palauttaa riippumattomuustestin tuloksen. -CONFIDENCE = LUOTTAMUSVƄLI ## Palauttaa luottamusvƤlin populaation keskiarvolle. -CORREL = KORRELAATIO ## Palauttaa kahden arvojoukon korrelaatiokertoimen. -COUNT = LASKE ## Laskee argumenttiluettelossa olevien lukujen mƤƤrƤn. -COUNTA = LASKE.A ## Laskee argumenttiluettelossa olevien arvojen mƤƤrƤn. -COUNTBLANK = LASKE.TYHJƄT ## Laskee alueella olevien tyhjien solujen mƤƤrƤn. -COUNTIF = LASKE.JOS ## Laskee alueella olevien sellaisten solujen mƤƤrƤn, joiden sisƤltƶ vastaa annettuja ehtoja. -COUNTIFS = LASKE.JOS.JOUKKO ## Laskee alueella olevien sellaisten solujen mƤƤrƤn, joiden sisƤltƶ vastaa useita ehtoja. -COVAR = KOVARIANSSI ## Palauttaa kovarianssin, joka on keskiarvo havaintoaineiston kunkin pisteparin poikkeamien tuloista. -CRITBINOM = BINOMIJAKAUMA.KRIT ## Palauttaa pienimmƤn arvon, jossa binomijakauman kertymƤfunktion arvo on pienempi tai yhtƤ suuri kuin vertailuarvo. -DEVSQ = OIKAISTU.NELIƖSUMMA ## Palauttaa keskipoikkeamien neliƶsumman. -EXPONDIST = EKSPONENTIAALIJAKAUMA ## Palauttaa eksponentiaalijakauman. -FDIST = FJAKAUMA ## Palauttaa F-todennƤkƶisyysjakauman. -FINV = FJAKAUMA.KƄƄNT ## Palauttaa F-todennƤkƶisyysjakauman kƤƤnteisfunktion. -FISHER = FISHER ## Palauttaa Fisher-muunnoksen. -FISHERINV = FISHER.KƄƄNT ## Palauttaa kƤƤnteisen Fisher-muunnoksen. -FORECAST = ENNUSTE ## Palauttaa lineaarisen trendin arvon. -FREQUENCY = TAAJUUS ## Palauttaa frekvenssijakautuman pystysuuntaisena matriisina. -FTEST = FTESTI ## Palauttaa F-testin tuloksen. -GAMMADIST = GAMMAJAKAUMA ## Palauttaa gammajakauman. -GAMMAINV = GAMMAJAKAUMA.KƄƄNT ## Palauttaa kƤƤnteisen gammajakauman kertymƤfunktion. -GAMMALN = GAMMALN ## Palauttaa gammafunktion luonnollisen logaritmin G(x). -GEOMEAN = KESKIARVO.GEOM ## Palauttaa geometrisen keskiarvon. -GROWTH = KASVU ## Palauttaa eksponentiaalisen trendin arvon. -HARMEAN = KESKIARVO.HARM ## Palauttaa harmonisen keskiarvon. -HYPGEOMDIST = HYPERGEOM.JAKAUMA ## Palauttaa hypergeometrisen jakauman. -INTERCEPT = LEIKKAUSPISTE ## Palauttaa lineaarisen regressiosuoran leikkauspisteen. -KURT = KURT ## Palauttaa tietoalueen vinous-arvon eli huipukkuuden. -LARGE = SUURI ## Palauttaa tietojoukon k:nneksi suurimman arvon. -LINEST = LINREGR ## Palauttaa lineaarisen trendin parametrit. -LOGEST = LOGREGR ## Palauttaa eksponentiaalisen trendin parametrit. -LOGINV = LOGNORM.JAKAUMA.KƄƄNT ## Palauttaa lognormeeratun jakauman kƤƤnteisfunktion. -LOGNORMDIST = LOGNORM.JAKAUMA ## Palauttaa lognormaalisen jakauman kertymƤfunktion. -MAX = MAKS ## Palauttaa suurimman arvon argumenttiluettelosta. -MAXA = MAKSA ## Palauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, suurimman arvon. -MEDIAN = MEDIAANI ## Palauttaa annettujen lukujen mediaanin. -MIN = MIN ## Palauttaa pienimmƤn arvon argumenttiluettelosta. -MINA = MINA ## Palauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, pienimmƤn arvon. -MODE = MOODI ## Palauttaa tietojoukossa useimmin esiintyvƤn arvon. -NEGBINOMDIST = BINOMIJAKAUMA.NEG ## Palauttaa negatiivisen binomijakauman. -NORMDIST = NORM.JAKAUMA ## Palauttaa normaalijakauman kertymƤfunktion. -NORMINV = NORM.JAKAUMA.KƄƄNT ## Palauttaa kƤƤnteisen normaalijakauman kertymƤfunktion. -NORMSDIST = NORM.JAKAUMA.NORMIT ## Palauttaa normitetun normaalijakauman kertymƤfunktion. -NORMSINV = NORM.JAKAUMA.NORMIT.KƄƄNT ## Palauttaa normitetun normaalijakauman kertymƤfunktion kƤƤnteisarvon. -PEARSON = PEARSON ## Palauttaa Pearsonin tulomomenttikorrelaatiokertoimen. -PERCENTILE = PROSENTTIPISTE ## Palauttaa alueen arvojen k:nnen prosenttipisteen. -PERCENTRANK = PROSENTTIJƄRJESTYS ## Palauttaa tietojoukon arvon prosentuaalisen jƤrjestysluvun. -PERMUT = PERMUTAATIO ## Palauttaa mahdollisten permutaatioiden mƤƤrƤn annetulle objektien mƤƤrƤlle. -POISSON = POISSON ## Palauttaa Poissonin todennƤkƶisyysjakauman. -PROB = TODENNƄKƖISYYS ## Palauttaa todennƤkƶisyyden sille, ettƤ arvot ovat tietyltƤ vƤliltƤ. -QUARTILE = NELJƄNNES ## Palauttaa tietoalueen neljƤnneksen. -RANK = ARVON.MUKAAN ## Palauttaa luvun paikan lukuarvoluettelossa. -RSQ = PEARSON.NELIƖ ## Palauttaa Pearsonin tulomomenttikorrelaatiokertoimen neliƶn. -SKEW = JAKAUMAN.VINOUS ## Palauttaa jakauman vinouden. -SLOPE = KULMAKERROIN ## Palauttaa lineaarisen regressiosuoran kulmakertoimen. -SMALL = PIENI ## Palauttaa tietojoukon k:nneksi pienimmƤn arvon. -STANDARDIZE = NORMITA ## Palauttaa normitetun arvon. -STDEV = KESKIHAJONTA ## Laskee populaation keskihajonnan otoksen perusteella. -STDEVA = KESKIHAJONTAA ## Laskee populaation keskihajonnan otoksen perusteella, mukaan lukien luvut, tekstin ja loogiset arvot. -STDEVP = KESKIHAJONTAP ## Laskee normaalijakautuman koko populaation perusteella. -STDEVPA = KESKIHAJONTAPA ## Laskee populaation keskihajonnan koko populaation perusteella, mukaan lukien luvut, tekstin ja totuusarvot. -STEYX = KESKIVIRHE ## Palauttaa regression kutakin x-arvoa vastaavan ennustetun y-arvon keskivirheen. -TDIST = TJAKAUMA ## Palauttaa t-jakautuman. -TINV = TJAKAUMA.KƄƄNT ## Palauttaa kƤƤnteisen t-jakauman. -TREND = SUUNTAUS ## Palauttaa lineaarisen trendin arvoja. -TRIMMEAN = KESKIARVO.TASATTU ## Palauttaa tietojoukon tasatun keskiarvon. -TTEST = TTESTI ## Palauttaa t-testiin liittyvƤn todennƤkƶisyyden. -VAR = VAR ## Arvioi populaation varianssia otoksen perusteella. -VARA = VARA ## Laskee populaation varianssin otoksen perusteella, mukaan lukien luvut, tekstin ja loogiset arvot. -VARP = VARP ## Laskee varianssin koko populaation perusteella. -VARPA = VARPA ## Laskee populaation varianssin koko populaation perusteella, mukaan lukien luvut, tekstin ja totuusarvot. -WEIBULL = WEIBULL ## Palauttaa Weibullin jakauman. -ZTEST = ZTESTI ## Palauttaa z-testin yksisuuntaisen todennƤkƶisyysarvon. - - -## -## Text functions Tekstifunktiot -## -ASC = ASC ## Muuntaa merkkijonossa olevat englanninkieliset DBCS- tai katakana-merkit SBCS-merkeiksi. -BAHTTEXT = BAHTTEKSTI ## Muuntaa luvun tekstiksi ß (baht) -valuuttamuotoa kƤyttƤmƤllƤ. -CHAR = MERKKI ## Palauttaa koodin lukua vastaavan merkin. -CLEAN = SIIVOA ## Poistaa tekstistƤ kaikki tulostumattomat merkit. -CODE = KOODI ## Palauttaa tekstimerkkijonon ensimmƤisen merkin numerokoodin. -CONCATENATE = KETJUTA ## YhdistƤƤ useat merkkijonot yhdeksi merkkijonoksi. -DOLLAR = VALUUTTA ## Muuntaa luvun tekstiksi $ (dollari) -valuuttamuotoa kƤyttƤmƤllƤ. -EXACT = VERTAA ## Tarkistaa, ovatko kaksi tekstiarvoa samanlaiset. -FIND = ETSI ## Etsii tekstiarvon toisen tekstin sisƤltƤ (tunnistaa isot ja pienet kirjaimet). -FINDB = ETSIB ## Etsii tekstiarvon toisen tekstin sisƤltƤ (tunnistaa isot ja pienet kirjaimet). -FIXED = KIINTEƄ ## Muotoilee luvun tekstiksi, jossa on kiinteƤ mƤƤrƤ desimaaleja. -JIS = JIS ## Muuntaa merkkijonossa olevat englanninkieliset SBCS- tai katakana-merkit DBCS-merkeiksi. -LEFT = VASEN ## Palauttaa tekstiarvon vasemmanpuoliset merkit. -LEFTB = VASENB ## Palauttaa tekstiarvon vasemmanpuoliset merkit. -LEN = PITUUS ## Palauttaa tekstimerkkijonon merkkien mƤƤrƤn. -LENB = PITUUSB ## Palauttaa tekstimerkkijonon merkkien mƤƤrƤn. -LOWER = PIENET ## Muuntaa tekstin pieniksi kirjaimiksi. -MID = POIMI.TEKSTI ## Palauttaa mƤƤritetyn mƤƤrƤn merkkejƤ merkkijonosta alkaen annetusta kohdasta. -MIDB = POIMI.TEKSTIB ## Palauttaa mƤƤritetyn mƤƤrƤn merkkejƤ merkkijonosta alkaen annetusta kohdasta. -PHONETIC = FONEETTINEN ## Hakee foneettiset (furigana) merkit merkkijonosta. -PROPER = ERISNIMI ## Muuttaa merkkijonon kunkin sanan ensimmƤisen kirjaimen isoksi. -REPLACE = KORVAA ## Korvaa tekstissƤ olevat merkit. -REPLACEB = KORVAAB ## Korvaa tekstissƤ olevat merkit. -REPT = TOISTA ## Toistaa tekstin annetun mƤƤrƤn kertoja. -RIGHT = OIKEA ## Palauttaa tekstiarvon oikeanpuoliset merkit. -RIGHTB = OIKEAB ## Palauttaa tekstiarvon oikeanpuoliset merkit. -SEARCH = KƄY.LƄPI ## Etsii tekstiarvon toisen tekstin sisƤltƤ (isot ja pienet kirjaimet tulkitaan samoiksi merkeiksi). -SEARCHB = KƄY.LƄPIB ## Etsii tekstiarvon toisen tekstin sisƤltƤ (isot ja pienet kirjaimet tulkitaan samoiksi merkeiksi). -SUBSTITUTE = VAIHDA ## Korvaa merkkijonossa olevan tekstin toisella. -T = T ## Muuntaa argumentit tekstiksi. -TEXT = TEKSTI ## Muotoilee luvun ja muuntaa sen tekstiksi. -TRIM = POISTA.VƄLIT ## Poistaa vƤlilyƶnnit tekstistƤ. -UPPER = ISOT ## Muuntaa tekstin isoiksi kirjaimiksi. -VALUE = ARVO ## Muuntaa tekstiargumentin luvuksi. diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/config deleted file mode 100644 index 8189598..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = € - - -## -## Excel Error Codes (For future use) - -## -NULL = #NUL! -DIV0 = #DIV/0! -VALUE = #VALEUR! -REF = #REF! -NAME = #NOM? -NUM = #NOMBRE! -NA = #N/A diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/functions deleted file mode 100644 index 7f40d5f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/fr/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions Fonctions de complĆ©ment et d’automatisation -## -GETPIVOTDATA = LIREDONNEESTABCROISDYNAMIQUE ## Renvoie les donnĆ©es stockĆ©es dans un rapport de tableau croisĆ© dynamique. - - -## -## Cube functions Fonctions Cube -## -CUBEKPIMEMBER = MEMBREKPICUBE ## Renvoie un nom, une propriĆ©tĆ© et une mesure d’indicateur de performance clĆ© et affiche le nom et la propriĆ©tĆ© dans la cellule. Un indicateur de performance clĆ© est une mesure quantifiable, telle que la marge bĆ©nĆ©ficiaire brute mensuelle ou la rotation trimestrielle du personnel, utilisĆ©e pour Ć©valuer les performances d’une entreprise. -CUBEMEMBER = MEMBRECUBE ## Renvoie un membre ou un uplet dans une hiĆ©rarchie de cubes. Utilisez cette fonction pour valider l’existence du membre ou de l’uplet dans le cube. -CUBEMEMBERPROPERTY = PROPRIETEMEMBRECUBE ## Renvoie la valeur d’une propriĆ©tĆ© de membre du cube. Utilisez cette fonction pour valider l’existence d’un nom de membre dans le cube et pour renvoyer la propriĆ©tĆ© spĆ©cifiĆ©e pour ce membre. -CUBERANKEDMEMBER = RANGMEMBRECUBE ## Renvoie le niĆØme membre ou le membre placĆ© Ć  un certain rang dans un ensemble. Utilisez cette fonction pour renvoyer un ou plusieurs Ć©lĆ©ments d’un ensemble, tels que les meilleurs vendeurs ou les 10 meilleurs Ć©tudiants. -CUBESET = JEUCUBE ## DĆ©finit un ensemble calculĆ© de membres ou d’uplets en envoyant une expression dĆ©finie au cube sur le serveur qui crĆ©e l’ensemble et le renvoie Ć  Microsoft Office Excel. -CUBESETCOUNT = NBJEUCUBE ## Renvoie le nombre d’élĆ©ments dans un jeu. -CUBEVALUE = VALEURCUBE ## Renvoie une valeur d’agrĆ©gation issue d’un cube. - - -## -## Database functions Fonctions de base de donnĆ©es -## -DAVERAGE = BDMOYENNE ## Renvoie la moyenne des entrĆ©es de base de donnĆ©es sĆ©lectionnĆ©es. -DCOUNT = BCOMPTE ## Compte le nombre de cellules d’une base de donnĆ©es qui contiennent des nombres. -DCOUNTA = BDNBVAL ## Compte les cellules non vides d’une base de donnĆ©es. -DGET = BDLIRE ## Extrait d’une base de donnĆ©es un enregistrement unique rĆ©pondant aux critĆØres spĆ©cifiĆ©s. -DMAX = BDMAX ## Renvoie la valeur maximale des entrĆ©es de base de donnĆ©es sĆ©lectionnĆ©es. -DMIN = BDMIN ## Renvoie la valeur minimale des entrĆ©es de base de donnĆ©es sĆ©lectionnĆ©es. -DPRODUCT = BDPRODUIT ## Multiplie les valeurs d’un champ particulier des enregistrements d’une base de donnĆ©es, qui rĆ©pondent aux critĆØres spĆ©cifiĆ©s. -DSTDEV = BDECARTYPE ## Calcule l’écart type pour un Ć©chantillon d’entrĆ©es de base de donnĆ©es sĆ©lectionnĆ©es. -DSTDEVP = BDECARTYPEP ## Calcule l’écart type pour l’ensemble d’une population d’entrĆ©es de base de donnĆ©es sĆ©lectionnĆ©es. -DSUM = BDSOMME ## Ajoute les nombres dans la colonne de champ des enregistrements de la base de donnĆ©es, qui rĆ©pondent aux critĆØres. -DVAR = BDVAR ## Calcule la variance pour un Ć©chantillon d’entrĆ©es de base de donnĆ©es sĆ©lectionnĆ©es. -DVARP = BDVARP ## Calcule la variance pour l’ensemble d’une population d’entrĆ©es de base de donnĆ©es sĆ©lectionnĆ©es. - - -## -## Date and time functions Fonctions de date et d’heure -## -DATE = DATE ## Renvoie le numĆ©ro de sĆ©rie d’une date prĆ©cise. -DATEVALUE = DATEVAL ## Convertit une date reprĆ©sentĆ©e sous forme de texte en numĆ©ro de sĆ©rie. -DAY = JOUR ## Convertit un numĆ©ro de sĆ©rie en jour du mois. -DAYS360 = JOURS360 ## Calcule le nombre de jours qui sĆ©parent deux dates sur la base d’une annĆ©e de 360 jours. -EDATE = MOIS.DECALER ## Renvoie le numĆ©ro sĆ©quentiel de la date qui reprĆ©sente une date spĆ©cifiĆ©e (l’argument date_dĆ©part), corrigĆ©e en plus ou en moins du nombre de mois indiquĆ©. -EOMONTH = FIN.MOIS ## Renvoie le numĆ©ro sĆ©quentiel de la date du dernier jour du mois prĆ©cĆ©dant ou suivant la date_dĆ©part du nombre de mois indiquĆ©. -HOUR = HEURE ## Convertit un numĆ©ro de sĆ©rie en heure. -MINUTE = MINUTE ## Convertit un numĆ©ro de sĆ©rie en minute. -MONTH = MOIS ## Convertit un numĆ©ro de sĆ©rie en mois. -NETWORKDAYS = NB.JOURS.OUVRES ## Renvoie le nombre de jours ouvrĆ©s entiers compris entre deux dates. -NOW = MAINTENANT ## Renvoie le numĆ©ro de sĆ©rie de la date et de l’heure du jour. -SECOND = SECONDE ## Convertit un numĆ©ro de sĆ©rie en seconde. -TIME = TEMPS ## Renvoie le numĆ©ro de sĆ©rie d’une heure prĆ©cise. -TIMEVALUE = TEMPSVAL ## Convertit une date reprĆ©sentĆ©e sous forme de texte en numĆ©ro de sĆ©rie. -TODAY = AUJOURDHUI ## Renvoie le numĆ©ro de sĆ©rie de la date du jour. -WEEKDAY = JOURSEM ## Convertit un numĆ©ro de sĆ©rie en jour de la semaine. -WEEKNUM = NO.SEMAINE ## Convertit un numĆ©ro de sĆ©rie en un numĆ©ro reprĆ©sentant l’ordre de la semaine dans l’annĆ©e. -WORKDAY = SERIE.JOUR.OUVRE ## Renvoie le numĆ©ro de sĆ©rie de la date avant ou aprĆØs le nombre de jours ouvrĆ©s spĆ©cifiĆ©s. -YEAR = ANNEE ## Convertit un numĆ©ro de sĆ©rie en annĆ©e. -YEARFRAC = FRACTION.ANNEE ## Renvoie la fraction de l’annĆ©e reprĆ©sentant le nombre de jours entre la date de dĆ©but et la date de fin. - - -## -## Engineering functions Fonctions d’ingĆ©nierie -## -BESSELI = BESSELI ## Renvoie la fonction Bessel modifiĆ©e In(x). -BESSELJ = BESSELJ ## Renvoie la fonction Bessel Jn(x). -BESSELK = BESSELK ## Renvoie la fonction Bessel modifiĆ©e Kn(x). -BESSELY = BESSELY ## Renvoie la fonction Bessel Yn(x). -BIN2DEC = BINDEC ## Convertit un nombre binaire en nombre dĆ©cimal. -BIN2HEX = BINHEX ## Convertit un nombre binaire en nombre hexadĆ©cimal. -BIN2OCT = BINOCT ## Convertit un nombre binaire en nombre octal. -COMPLEX = COMPLEXE ## Convertit des coefficients rĆ©el et imaginaire en un nombre complexe. -CONVERT = CONVERT ## Convertit un nombre d’une unitĆ© de mesure Ć  une autre. -DEC2BIN = DECBIN ## Convertit un nombre dĆ©cimal en nombre binaire. -DEC2HEX = DECHEX ## Convertit un nombre dĆ©cimal en nombre hexadĆ©cimal. -DEC2OCT = DECOCT ## Convertit un nombre dĆ©cimal en nombre octal. -DELTA = DELTA ## Teste l’égalitĆ© de deux nombres. -ERF = ERF ## Renvoie la valeur de la fonction d’erreur. -ERFC = ERFC ## Renvoie la valeur de la fonction d’erreur complĆ©mentaire. -GESTEP = SUP.SEUIL ## Teste si un nombre est supĆ©rieur Ć  une valeur de seuil. -HEX2BIN = HEXBIN ## Convertit un nombre hexadĆ©cimal en nombre binaire. -HEX2DEC = HEXDEC ## Convertit un nombre hexadĆ©cimal en nombre dĆ©cimal. -HEX2OCT = HEXOCT ## Convertit un nombre hexadĆ©cimal en nombre octal. -IMABS = COMPLEXE.MODULE ## Renvoie la valeur absolue (module) d’un nombre complexe. -IMAGINARY = COMPLEXE.IMAGINAIRE ## Renvoie le coefficient imaginaire d’un nombre complexe. -IMARGUMENT = COMPLEXE.ARGUMENT ## Renvoie l’argument thĆŖta, un angle exprimĆ© en radians. -IMCONJUGATE = COMPLEXE.CONJUGUE ## Renvoie le nombre complexe conjuguĆ© d’un nombre complexe. -IMCOS = IMCOS ## Renvoie le cosinus d’un nombre complexe. -IMDIV = COMPLEXE.DIV ## Renvoie le quotient de deux nombres complexes. -IMEXP = COMPLEXE.EXP ## Renvoie la fonction exponentielle d’un nombre complexe. -IMLN = COMPLEXE.LN ## Renvoie le logarithme nĆ©pĆ©rien d’un nombre complexe. -IMLOG10 = COMPLEXE.LOG10 ## Calcule le logarithme en base 10 d’un nombre complexe. -IMLOG2 = COMPLEXE.LOG2 ## Calcule le logarithme en base 2 d’un nombre complexe. -IMPOWER = COMPLEXE.PUISSANCE ## Renvoie un nombre complexe Ć©levĆ© Ć  une puissance entiĆØre. -IMPRODUCT = COMPLEXE.PRODUIT ## Renvoie le produit de plusieurs nombres complexes. -IMREAL = COMPLEXE.REEL ## Renvoie le coefficient rĆ©el d’un nombre complexe. -IMSIN = COMPLEXE.SIN ## Renvoie le sinus d’un nombre complexe. -IMSQRT = COMPLEXE.RACINE ## Renvoie la racine carrĆ©e d’un nombre complexe. -IMSUB = COMPLEXE.DIFFERENCE ## Renvoie la diffĆ©rence entre deux nombres complexes. -IMSUM = COMPLEXE.SOMME ## Renvoie la somme de plusieurs nombres complexes. -OCT2BIN = OCTBIN ## Convertit un nombre octal en nombre binaire. -OCT2DEC = OCTDEC ## Convertit un nombre octal en nombre dĆ©cimal. -OCT2HEX = OCTHEX ## Convertit un nombre octal en nombre hexadĆ©cimal. - - -## -## Financial functions Fonctions financiĆØres -## -ACCRINT = INTERET.ACC ## Renvoie l’intĆ©rĆŖt couru non Ć©chu d’un titre dont l’intĆ©rĆŖt est perƧu pĆ©riodiquement. -ACCRINTM = INTERET.ACC.MAT ## Renvoie l’intĆ©rĆŖt couru non Ć©chu d’un titre dont l’intĆ©rĆŖt est perƧu Ć  l’échĆ©ance. -AMORDEGRC = AMORDEGRC ## Renvoie l’amortissement correspondant Ć  chaque pĆ©riode comptable en utilisant un coefficient d’amortissement. -AMORLINC = AMORLINC ## Renvoie l’amortissement d’un bien Ć  la fin d’une pĆ©riode fiscale donnĆ©e. -COUPDAYBS = NB.JOURS.COUPON.PREC ## Renvoie le nombre de jours entre le dĆ©but de la pĆ©riode de coupon et la date de liquidation. -COUPDAYS = NB.JOURS.COUPONS ## Renvoie le nombre de jours pour la pĆ©riode du coupon contenant la date de liquidation. -COUPDAYSNC = NB.JOURS.COUPON.SUIV ## Renvoie le nombre de jours entre la date de liquidation et la date du coupon suivant la date de liquidation. -COUPNCD = DATE.COUPON.SUIV ## Renvoie la premiĆØre date de coupon ultĆ©rieure Ć  la date de rĆØglement. -COUPNUM = NB.COUPONS ## Renvoie le nombre de coupons dus entre la date de rĆØglement et la date d’échĆ©ance. -COUPPCD = DATE.COUPON.PREC ## Renvoie la date de coupon prĆ©cĆ©dant la date de rĆØglement. -CUMIPMT = CUMUL.INTER ## Renvoie l’intĆ©rĆŖt cumulĆ© payĆ© sur un emprunt entre deux pĆ©riodes. -CUMPRINC = CUMUL.PRINCPER ## Renvoie le montant cumulĆ© des remboursements du capital d’un emprunt effectuĆ©s entre deux pĆ©riodes. -DB = DB ## Renvoie l’amortissement d’un bien pour une pĆ©riode spĆ©cifiĆ©e en utilisant la mĆ©thode de l’amortissement dĆ©gressif Ć  taux fixe. -DDB = DDB ## Renvoie l’amortissement d’un bien pour toute pĆ©riode spĆ©cifiĆ©e, en utilisant la mĆ©thode de l’amortissement dĆ©gressif Ć  taux double ou selon un coefficient Ć  spĆ©cifier. -DISC = TAUX.ESCOMPTE ## Calcule le taux d’escompte d’une transaction. -DOLLARDE = PRIX.DEC ## Convertit un prix en euros, exprimĆ© sous forme de fraction, en un prix en euros exprimĆ© sous forme de nombre dĆ©cimal. -DOLLARFR = PRIX.FRAC ## Convertit un prix en euros, exprimĆ© sous forme de nombre dĆ©cimal, en un prix en euros exprimĆ© sous forme de fraction. -DURATION = DUREE ## Renvoie la durĆ©e, en annĆ©es, d’un titre dont l’intĆ©rĆŖt est perƧu pĆ©riodiquement. -EFFECT = TAUX.EFFECTIF ## Renvoie le taux d’intĆ©rĆŖt annuel effectif. -FV = VC ## Renvoie la valeur future d’un investissement. -FVSCHEDULE = VC.PAIEMENTS ## Calcule la valeur future d’un investissement en appliquant une sĆ©rie de taux d’intĆ©rĆŖt composites. -INTRATE = TAUX.INTERET ## Affiche le taux d’intĆ©rĆŖt d’un titre totalement investi. -IPMT = INTPER ## Calcule le montant des intĆ©rĆŖts d’un investissement pour une pĆ©riode donnĆ©e. -IRR = TRI ## Calcule le taux de rentabilitĆ© interne d’un investissement pour une succession de trĆ©soreries. -ISPMT = ISPMT ## Calcule le montant des intĆ©rĆŖts d’un investissement pour une pĆ©riode donnĆ©e. -MDURATION = DUREE.MODIFIEE ## Renvoie la durĆ©e de Macauley modifiĆ©e pour un titre ayant une valeur nominale hypothĆ©tique de 100_euros. -MIRR = TRIM ## Calcule le taux de rentabilitĆ© interne lorsque les paiements positifs et nĆ©gatifs sont financĆ©s Ć  des taux diffĆ©rents. -NOMINAL = TAUX.NOMINAL ## Calcule le taux d’intĆ©rĆŖt nominal annuel. -NPER = NPM ## Renvoie le nombre de versements nĆ©cessaires pour rembourser un emprunt. -NPV = VAN ## Calcule la valeur actuelle nette d’un investissement basĆ© sur une sĆ©rie de dĆ©caissements et un taux d’escompte. -ODDFPRICE = PRIX.PCOUPON.IRREG ## Renvoie le prix par tranche de valeur nominale de 100 euros d’un titre dont la premiĆØre pĆ©riode de coupon est irrĆ©guliĆØre. -ODDFYIELD = REND.PCOUPON.IRREG ## Renvoie le taux de rendement d’un titre dont la premiĆØre pĆ©riode de coupon est irrĆ©guliĆØre. -ODDLPRICE = PRIX.DCOUPON.IRREG ## Renvoie le prix par tranche de valeur nominale de 100 euros d’un titre dont la premiĆØre pĆ©riode de coupon est irrĆ©guliĆØre. -ODDLYIELD = REND.DCOUPON.IRREG ## Renvoie le taux de rendement d’un titre dont la derniĆØre pĆ©riode de coupon est irrĆ©guliĆØre. -PMT = VPM ## Calcule le paiement pĆ©riodique d’un investissement donnĆ©. -PPMT = PRINCPER ## Calcule, pour une pĆ©riode donnĆ©e, la part de remboursement du principal d’un investissement. -PRICE = PRIX.TITRE ## Renvoie le prix d’un titre rapportant des intĆ©rĆŖts pĆ©riodiques, pour une valeur nominale de 100 euros. -PRICEDISC = VALEUR.ENCAISSEMENT ## Renvoie la valeur d’encaissement d’un escompte commercial, pour une valeur nominale de 100 euros. -PRICEMAT = PRIX.TITRE.ECHEANCE ## Renvoie le prix d’un titre dont la valeur nominale est 100 euros et qui rapporte des intĆ©rĆŖts Ć  l’échĆ©ance. -PV = PV ## Calcule la valeur actuelle d’un investissement. -RATE = TAUX ## Calcule le taux d’intĆ©rĆŖt par pĆ©riode pour une annuitĆ©. -RECEIVED = VALEUR.NOMINALE ## Renvoie la valeur nominale Ć  Ć©chĆ©ance d’un effet de commerce. -SLN = AMORLIN ## Calcule l’amortissement linĆ©aire d’un bien pour une pĆ©riode donnĆ©e. -SYD = SYD ## Calcule l’amortissement d’un bien pour une pĆ©riode donnĆ©e sur la base de la mĆ©thode amĆ©ricaine Sum-of-Years Digits (amortissement dĆ©gressif Ć  taux dĆ©croissant appliquĆ© Ć  une valeur constante). -TBILLEQ = TAUX.ESCOMPTE.R ## Renvoie le taux d’escompte rationnel d’un bon du TrĆ©sor. -TBILLPRICE = PRIX.BON.TRESOR ## Renvoie le prix d’un bon du TrĆ©sor d’une valeur nominale de 100 euros. -TBILLYIELD = RENDEMENT.BON.TRESOR ## Calcule le taux de rendement d’un bon du TrĆ©sor. -VDB = VDB ## Renvoie l’amortissement d’un bien pour une pĆ©riode spĆ©cifiĆ©e ou partielle en utilisant une mĆ©thode de l’amortissement dĆ©gressif Ć  taux fixe. -XIRR = TRI.PAIEMENTS ## Calcule le taux de rentabilitĆ© interne d’un ensemble de paiements non pĆ©riodiques. -XNPV = VAN.PAIEMENTS ## Renvoie la valeur actuelle nette d’un ensemble de paiements non pĆ©riodiques. -YIELD = RENDEMENT.TITRE ## Calcule le rendement d’un titre rapportant des intĆ©rĆŖts pĆ©riodiquement. -YIELDDISC = RENDEMENT.SIMPLE ## Calcule le taux de rendement d’un emprunt Ć  intĆ©rĆŖt simple (par exemple, un bon du TrĆ©sor). -YIELDMAT = RENDEMENT.TITRE.ECHEANCE ## Renvoie le rendement annuel d’un titre qui rapporte des intĆ©rĆŖts Ć  l’échĆ©ance. - - -## -## Information functions Fonctions d’information -## -CELL = CELLULE ## Renvoie des informations sur la mise en forme, l’emplacement et le contenu d’une cellule. -ERROR.TYPE = TYPE.ERREUR ## Renvoie un nombre correspondant Ć  un type d’erreur. -INFO = INFORMATIONS ## Renvoie des informations sur l’environnement d’exploitation actuel. -ISBLANK = ESTVIDE ## Renvoie VRAI si l’argument valeur est vide. -ISERR = ESTERR ## Renvoie VRAI si l’argument valeur fait rĆ©fĆ©rence Ć  une valeur d’erreur, sauf #N/A. -ISERROR = ESTERREUR ## Renvoie VRAI si l’argument valeur fait rĆ©fĆ©rence Ć  une valeur d’erreur. -ISEVEN = EST.PAIR ## Renvoie VRAI si le chiffre est pair. -ISLOGICAL = ESTLOGIQUE ## Renvoie VRAI si l’argument valeur fait rĆ©fĆ©rence Ć  une valeur logique. -ISNA = ESTNA ## Renvoie VRAI si l’argument valeur fait rĆ©fĆ©rence Ć  la valeur d’erreur #N/A. -ISNONTEXT = ESTNONTEXTE ## Renvoie VRAI si l’argument valeur ne se prĆ©sente pas sous forme de texte. -ISNUMBER = ESTNUM ## Renvoie VRAI si l’argument valeur reprĆ©sente un nombre. -ISODD = EST.IMPAIR ## Renvoie VRAI si le chiffre est impair. -ISREF = ESTREF ## Renvoie VRAI si l’argument valeur est une rĆ©fĆ©rence. -ISTEXT = ESTTEXTE ## Renvoie VRAI si l’argument valeur se prĆ©sente sous forme de texte. -N = N ## Renvoie une valeur convertie en nombre. -NA = NA ## Renvoie la valeur d’erreur #N/A. -TYPE = TYPE ## Renvoie un nombre indiquant le type de donnĆ©es d’une valeur. - - -## -## Logical functions Fonctions logiques -## -AND = ET ## Renvoie VRAI si tous ses arguments sont VRAI. -FALSE = FAUX ## Renvoie la valeur logique FAUX. -IF = SI ## SpĆ©cifie un test logique Ć  effectuer. -IFERROR = SIERREUR ## Renvoie une valeur que vous spĆ©cifiez si une formule gĆ©nĆØre une erreur ; sinon, elle renvoie le rĆ©sultat de la formule. -NOT = NON ## Inverse la logique de cet argument. -OR = OU ## Renvoie VRAI si un des arguments est VRAI. -TRUE = VRAI ## Renvoie la valeur logique VRAI. - - -## -## Lookup and reference functions Fonctions de recherche et de rĆ©fĆ©rence -## -ADDRESS = ADRESSE ## Renvoie une rĆ©fĆ©rence sous forme de texte Ć  une seule cellule d’une feuille de calcul. -AREAS = ZONES ## Renvoie le nombre de zones dans une rĆ©fĆ©rence. -CHOOSE = CHOISIR ## Choisit une valeur dans une liste. -COLUMN = COLONNE ## Renvoie le numĆ©ro de colonne d’une rĆ©fĆ©rence. -COLUMNS = COLONNES ## Renvoie le nombre de colonnes dans une rĆ©fĆ©rence. -HLOOKUP = RECHERCHEH ## Effectue une recherche dans la premiĆØre ligne d’une matrice et renvoie la valeur de la cellule indiquĆ©e. -HYPERLINK = LIEN_HYPERTEXTE ## CrĆ©e un raccourci ou un renvoi qui ouvre un document stockĆ© sur un serveur rĆ©seau, sur un rĆ©seau Intranet ou sur Internet. -INDEX = INDEX ## Utilise un index pour choisir une valeur provenant d’une rĆ©fĆ©rence ou d’une matrice. -INDIRECT = INDIRECT ## Renvoie une rĆ©fĆ©rence indiquĆ©e par une valeur de texte. -LOOKUP = RECHERCHE ## Recherche des valeurs dans un vecteur ou une matrice. -MATCH = EQUIV ## Recherche des valeurs dans une rĆ©fĆ©rence ou une matrice. -OFFSET = DECALER ## Renvoie une rĆ©fĆ©rence dĆ©calĆ©e par rapport Ć  une rĆ©fĆ©rence donnĆ©e. -ROW = LIGNE ## Renvoie le numĆ©ro de ligne d’une rĆ©fĆ©rence. -ROWS = LIGNES ## Renvoie le nombre de lignes dans une rĆ©fĆ©rence. -RTD = RTD ## Extrait les donnĆ©es en temps rĆ©el Ć  partir d’un programme prenant en charge l’automation COM (Automation : utilisation des objets d'une application Ć  partir d'une autre application ou d'un autre outil de dĆ©veloppement. Autrefois appelĆ©e OLE Automation, Automation est une norme industrielle et une fonctionnalitĆ© du modĆØle d'objet COM (Component Object Model).). -TRANSPOSE = TRANSPOSE ## Renvoie la transposition d’une matrice. -VLOOKUP = RECHERCHEV ## Effectue une recherche dans la premiĆØre colonne d’une matrice et se dĆ©place sur la ligne pour renvoyer la valeur d’une cellule. - - -## -## Math and trigonometry functions Fonctions mathĆ©matiques et trigonomĆ©triques -## -ABS = ABS ## Renvoie la valeur absolue d’un nombre. -ACOS = ACOS ## Renvoie l’arccosinus d’un nombre. -ACOSH = ACOSH ## Renvoie le cosinus hyperbolique inverse d’un nombre. -ASIN = ASIN ## Renvoie l’arcsinus d’un nombre. -ASINH = ASINH ## Renvoie le sinus hyperbolique inverse d’un nombre. -ATAN = ATAN ## Renvoie l’arctangente d’un nombre. -ATAN2 = ATAN2 ## Renvoie l’arctangente des coordonnĆ©es x et y. -ATANH = ATANH ## Renvoie la tangente hyperbolique inverse d’un nombre. -CEILING = PLAFOND ## Arrondit un nombre au nombre entier le plus proche ou au multiple le plus proche de l’argument prĆ©cision en s’éloignant de zĆ©ro. -COMBIN = COMBIN ## Renvoie le nombre de combinaisons que l’on peut former avec un nombre donnĆ© d’objets. -COS = COS ## Renvoie le cosinus d’un nombre. -COSH = COSH ## Renvoie le cosinus hyperbolique d’un nombre. -DEGREES = DEGRES ## Convertit des radians en degrĆ©s. -EVEN = PAIR ## Arrondit un nombre au nombre entier pair le plus proche en s’éloignant de zĆ©ro. -EXP = EXP ## Renvoie e Ć©levĆ© Ć  la puissance d’un nombre donnĆ©. -FACT = FACT ## Renvoie la factorielle d’un nombre. -FACTDOUBLE = FACTDOUBLE ## Renvoie la factorielle double d’un nombre. -FLOOR = PLANCHER ## Arrondit un nombre en tendant vers 0 (zĆ©ro). -GCD = PGCD ## Renvoie le plus grand commun diviseur. -INT = ENT ## Arrondit un nombre Ć  l’entier immĆ©diatement infĆ©rieur. -LCM = PPCM ## Renvoie le plus petit commun multiple. -LN = LN ## Renvoie le logarithme nĆ©pĆ©rien d’un nombre. -LOG = LOG ## Renvoie le logarithme d’un nombre dans la base spĆ©cifiĆ©e. -LOG10 = LOG10 ## Calcule le logarithme en base 10 d’un nombre. -MDETERM = DETERMAT ## Renvoie le dĆ©terminant d’une matrice. -MINVERSE = INVERSEMAT ## Renvoie la matrice inverse d’une matrice. -MMULT = PRODUITMAT ## Renvoie le produit de deux matrices. -MOD = MOD ## Renvoie le reste d’une division. -MROUND = ARRONDI.AU.MULTIPLE ## Donne l’arrondi d’un nombre au multiple spĆ©cifiĆ©. -MULTINOMIAL = MULTINOMIALE ## Calcule la multinomiale d’un ensemble de nombres. -ODD = IMPAIR ## Renvoie le nombre, arrondi Ć  la valeur du nombre entier impair le plus proche en s’éloignant de zĆ©ro. -PI = PI ## Renvoie la valeur de pi. -POWER = PUISSANCE ## Renvoie la valeur du nombre Ć©levĆ© Ć  une puissance. -PRODUCT = PRODUIT ## Multiplie ses arguments. -QUOTIENT = QUOTIENT ## Renvoie la partie entiĆØre du rĆ©sultat d’une division. -RADIANS = RADIANS ## Convertit des degrĆ©s en radians. -RAND = ALEA ## Renvoie un nombre alĆ©atoire compris entre 0 et 1. -RANDBETWEEN = ALEA.ENTRE.BORNES ## Renvoie un nombre alĆ©atoire entre les nombres que vous spĆ©cifiez. -ROMAN = ROMAIN ## Convertit des chiffres arabes en chiffres romains, sous forme de texte. -ROUND = ARRONDI ## Arrondit un nombre au nombre de chiffres indiquĆ©. -ROUNDDOWN = ARRONDI.INF ## Arrondit un nombre en tendant vers 0 (zĆ©ro). -ROUNDUP = ARRONDI.SUP ## Arrondit un nombre Ć  l’entier supĆ©rieur, en s’éloignant de zĆ©ro. -SERIESSUM = SOMME.SERIES ## Renvoie la somme d’une sĆ©rie gĆ©omĆ©trique en s’appuyant sur la formule suivante : -SIGN = SIGNE ## Renvoie le signe d’un nombre. -SIN = SIN ## Renvoie le sinus d’un angle donnĆ©. -SINH = SINH ## Renvoie le sinus hyperbolique d’un nombre. -SQRT = RACINE ## Renvoie la racine carrĆ©e d’un nombre. -SQRTPI = RACINE.PI ## Renvoie la racine carrĆ©e de (nombre * pi). -SUBTOTAL = SOUS.TOTAL ## Renvoie un sous-total dans une liste ou une base de donnĆ©es. -SUM = SOMME ## Calcule la somme de ses arguments. -SUMIF = SOMME.SI ## Additionne les cellules spĆ©cifiĆ©es si elles rĆ©pondent Ć  un critĆØre donnĆ©. -SUMIFS = SOMME.SI.ENS ## Ajoute les cellules d’une plage qui rĆ©pondent Ć  plusieurs critĆØres. -SUMPRODUCT = SOMMEPROD ## Multiplie les valeurs correspondantes des matrices spĆ©cifiĆ©es et calcule la somme de ces produits. -SUMSQ = SOMME.CARRES ## Renvoie la somme des carrĆ©s des arguments. -SUMX2MY2 = SOMME.X2MY2 ## Renvoie la somme de la diffĆ©rence des carrĆ©s des valeurs correspondantes de deux matrices. -SUMX2PY2 = SOMME.X2PY2 ## Renvoie la somme de la somme des carrĆ©s des valeurs correspondantes de deux matrices. -SUMXMY2 = SOMME.XMY2 ## Renvoie la somme des carrĆ©s des diffĆ©rences entre les valeurs correspondantes de deux matrices. -TAN = TAN ## Renvoie la tangente d’un nombre. -TANH = TANH ## Renvoie la tangente hyperbolique d’un nombre. -TRUNC = TRONQUE ## Renvoie la partie entiĆØre d’un nombre. - - -## -## Statistical functions Fonctions statistiques -## -AVEDEV = ECART.MOYEN ## Renvoie la moyenne des Ć©carts absolus observĆ©s dans la moyenne des points de donnĆ©es. -AVERAGE = MOYENNE ## Renvoie la moyenne de ses arguments. -AVERAGEA = AVERAGEA ## Renvoie la moyenne de ses arguments, nombres, texte et valeurs logiques inclus. -AVERAGEIF = MOYENNE.SI ## Renvoie la moyenne (arithmĆ©tique) de toutes les cellules d’une plage qui rĆ©pondent Ć  des critĆØres donnĆ©s. -AVERAGEIFS = MOYENNE.SI.ENS ## Renvoie la moyenne (arithmĆ©tique) de toutes les cellules qui rĆ©pondent Ć  plusieurs critĆØres. -BETADIST = LOI.BETA ## Renvoie la fonction de distribution cumulĆ©e. -BETAINV = BETA.INVERSE ## Renvoie l’inverse de la fonction de distribution cumulĆ©e pour une distribution bĆŖta spĆ©cifiĆ©e. -BINOMDIST = LOI.BINOMIALE ## Renvoie la probabilitĆ© d’une variable alĆ©atoire discrĆØte suivant la loi binomiale. -CHIDIST = LOI.KHIDEUX ## Renvoie la probabilitĆ© unilatĆ©rale de la distribution khi-deux. -CHIINV = KHIDEUX.INVERSE ## Renvoie l’inverse de la probabilitĆ© unilatĆ©rale de la distribution khi-deux. -CHITEST = TEST.KHIDEUX ## Renvoie le test d’indĆ©pendance. -CONFIDENCE = INTERVALLE.CONFIANCE ## Renvoie l’intervalle de confiance pour une moyenne de population. -CORREL = COEFFICIENT.CORRELATION ## Renvoie le coefficient de corrĆ©lation entre deux sĆ©ries de donnĆ©es. -COUNT = NB ## DĆ©termine les nombres compris dans la liste des arguments. -COUNTA = NBVAL ## DĆ©termine le nombre de valeurs comprises dans la liste des arguments. -COUNTBLANK = NB.VIDE ## Compte le nombre de cellules vides dans une plage. -COUNTIF = NB.SI ## Compte le nombre de cellules qui rĆ©pondent Ć  un critĆØre donnĆ© dans une plage. -COUNTIFS = NB.SI.ENS ## Compte le nombre de cellules Ć  l’intĆ©rieur d’une plage qui rĆ©pondent Ć  plusieurs critĆØres. -COVAR = COVARIANCE ## Renvoie la covariance, moyenne des produits des Ć©carts pour chaque sĆ©rie d’observations. -CRITBINOM = CRITERE.LOI.BINOMIALE ## Renvoie la plus petite valeur pour laquelle la distribution binomiale cumulĆ©e est infĆ©rieure ou Ć©gale Ć  une valeur de critĆØre. -DEVSQ = SOMME.CARRES.ECARTS ## Renvoie la somme des carrĆ©s des Ć©carts. -EXPONDIST = LOI.EXPONENTIELLE ## Renvoie la distribution exponentielle. -FDIST = LOI.F ## Renvoie la distribution de probabilitĆ© F. -FINV = INVERSE.LOI.F ## Renvoie l’inverse de la distribution de probabilitĆ© F. -FISHER = FISHER ## Renvoie la transformation de Fisher. -FISHERINV = FISHER.INVERSE ## Renvoie l’inverse de la transformation de Fisher. -FORECAST = PREVISION ## Calcule une valeur par rapport Ć  une tendance linĆ©aire. -FREQUENCY = FREQUENCE ## Calcule la frĆ©quence d’apparition des valeurs dans une plage de valeurs, puis renvoie des nombres sous forme de matrice verticale. -FTEST = TEST.F ## Renvoie le rĆ©sultat d’un test F. -GAMMADIST = LOI.GAMMA ## Renvoie la probabilitĆ© d’une variable alĆ©atoire suivant une loi Gamma. -GAMMAINV = LOI.GAMMA.INVERSE ## Renvoie, pour une probabilitĆ© donnĆ©e, la valeur d’une variable alĆ©atoire suivant une loi Gamma. -GAMMALN = LNGAMMA ## Renvoie le logarithme nĆ©pĆ©rien de la fonction Gamma, G(x) -GEOMEAN = MOYENNE.GEOMETRIQUE ## Renvoie la moyenne gĆ©omĆ©trique. -GROWTH = CROISSANCE ## Calcule des valeurs par rapport Ć  une tendance exponentielle. -HARMEAN = MOYENNE.HARMONIQUE ## Renvoie la moyenne harmonique. -HYPGEOMDIST = LOI.HYPERGEOMETRIQUE ## Renvoie la probabilitĆ© d’une variable alĆ©atoire discrĆØte suivant une loi hypergĆ©omĆ©trique. -INTERCEPT = ORDONNEE.ORIGINE ## Renvoie l’ordonnĆ©e Ć  l’origine d’une droite de rĆ©gression linĆ©aire. -KURT = KURTOSIS ## Renvoie le kurtosis d’une sĆ©rie de donnĆ©es. -LARGE = GRANDE.VALEUR ## Renvoie la k-iĆØme plus grande valeur d’une sĆ©rie de donnĆ©es. -LINEST = DROITEREG ## Renvoie les paramĆØtres d’une tendance linĆ©aire. -LOGEST = LOGREG ## Renvoie les paramĆØtres d’une tendance exponentielle. -LOGINV = LOI.LOGNORMALE.INVERSE ## Renvoie l’inverse de la probabilitĆ© pour une variable alĆ©atoire suivant la loi lognormale. -LOGNORMDIST = LOI.LOGNORMALE ## Renvoie la probabilitĆ© d’une variable alĆ©atoire continue suivant une loi lognormale. -MAX = MAX ## Renvoie la valeur maximale contenue dans une liste d’arguments. -MAXA = MAXA ## Renvoie la valeur maximale d’une liste d’arguments, nombres, texte et valeurs logiques inclus. -MEDIAN = MEDIANE ## Renvoie la valeur mĆ©diane des nombres donnĆ©s. -MIN = MIN ## Renvoie la valeur minimale contenue dans une liste d’arguments. -MINA = MINA ## Renvoie la plus petite valeur d’une liste d’arguments, nombres, texte et valeurs logiques inclus. -MODE = MODE ## Renvoie la valeur la plus courante d’une sĆ©rie de donnĆ©es. -NEGBINOMDIST = LOI.BINOMIALE.NEG ## Renvoie la probabilitĆ© d’une variable alĆ©atoire discrĆØte suivant une loi binomiale nĆ©gative. -NORMDIST = LOI.NORMALE ## Renvoie la probabilitĆ© d’une variable alĆ©atoire continue suivant une loi normale. -NORMINV = LOI.NORMALE.INVERSE ## Renvoie, pour une probabilitĆ© donnĆ©e, la valeur d’une variable alĆ©atoire suivant une loi normale standard. -NORMSDIST = LOI.NORMALE.STANDARD ## Renvoie la probabilitĆ© d’une variable alĆ©atoire continue suivant une loi normale standard. -NORMSINV = LOI.NORMALE.STANDARD.INVERSE ## Renvoie l’inverse de la distribution cumulĆ©e normale standard. -PEARSON = PEARSON ## Renvoie le coefficient de corrĆ©lation d’échantillonnage de Pearson. -PERCENTILE = CENTILE ## Renvoie le k-iĆØme centile des valeurs d’une plage. -PERCENTRANK = RANG.POURCENTAGE ## Renvoie le rang en pourcentage d’une valeur d’une sĆ©rie de donnĆ©es. -PERMUT = PERMUTATION ## Renvoie le nombre de permutations pour un nombre donnĆ© d’objets. -POISSON = LOI.POISSON ## Renvoie la probabilitĆ© d’une variable alĆ©atoire suivant une loi de Poisson. -PROB = PROBABILITE ## Renvoie la probabilitĆ© que des valeurs d’une plage soient comprises entre deux limites. -QUARTILE = QUARTILE ## Renvoie le quartile d’une sĆ©rie de donnĆ©es. -RANK = RANG ## Renvoie le rang d’un nombre contenu dans une liste. -RSQ = COEFFICIENT.DETERMINATION ## Renvoie la valeur du coefficient de dĆ©termination R^2 d’une rĆ©gression linĆ©aire. -SKEW = COEFFICIENT.ASYMETRIE ## Renvoie l’asymĆ©trie d’une distribution. -SLOPE = PENTE ## Renvoie la pente d’une droite de rĆ©gression linĆ©aire. -SMALL = PETITE.VALEUR ## Renvoie la k-iĆØme plus petite valeur d’une sĆ©rie de donnĆ©es. -STANDARDIZE = CENTREE.REDUITE ## Renvoie une valeur centrĆ©e rĆ©duite. -STDEV = ECARTYPE ## Ɖvalue l’écart type d’une population en se basant sur un Ć©chantillon de cette population. -STDEVA = STDEVA ## Ɖvalue l’écart type d’une population en se basant sur un Ć©chantillon de cette population, nombres, texte et valeurs logiques inclus. -STDEVP = ECARTYPEP ## Calcule l’écart type d’une population Ć  partir de la population entiĆØre. -STDEVPA = STDEVPA ## Calcule l’écart type d’une population Ć  partir de l’ensemble de la population, nombres, texte et valeurs logiques inclus. -STEYX = ERREUR.TYPE.XY ## Renvoie l’erreur type de la valeur y prĆ©vue pour chaque x de la rĆ©gression. -TDIST = LOI.STUDENT ## Renvoie la probabilitĆ© d’une variable alĆ©atoire suivant une loi T de Student. -TINV = LOI.STUDENT.INVERSE ## Renvoie, pour une probabilitĆ© donnĆ©e, la valeur d’une variable alĆ©atoire suivant une loi T de Student. -TREND = TENDANCE ## Renvoie des valeurs par rapport Ć  une tendance linĆ©aire. -TRIMMEAN = MOYENNE.REDUITE ## Renvoie la moyenne de l’intĆ©rieur d’une sĆ©rie de donnĆ©es. -TTEST = TEST.STUDENT ## Renvoie la probabilitĆ© associĆ©e Ć  un test T de Student. -VAR = VAR ## Calcule la variance sur la base d’un Ć©chantillon. -VARA = VARA ## Estime la variance d’une population en se basant sur un Ć©chantillon de cette population, nombres, texte et valeurs logiques incluses. -VARP = VAR.P ## Calcule la variance sur la base de l’ensemble de la population. -VARPA = VARPA ## Calcule la variance d’une population en se basant sur la population entiĆØre, nombres, texte et valeurs logiques inclus. -WEIBULL = LOI.WEIBULL ## Renvoie la probabilitĆ© d’une variable alĆ©atoire suivant une loi de Weibull. -ZTEST = TEST.Z ## Renvoie la valeur de probabilitĆ© unilatĆ©rale d’un test z. - - -## -## Text functions Fonctions de texte -## -ASC = ASC ## Change les caractĆØres anglais ou katakana Ć  pleine chasse (codĆ©s sur deux octets) Ć  l’intĆ©rieur d’une chaĆ®ne de caractĆØres en caractĆØres Ć  demi-chasse (codĆ©s sur un octet). -BAHTTEXT = BAHTTEXT ## Convertit un nombre en texte en utilisant le format monĆ©taire ß (baht). -CHAR = CAR ## Renvoie le caractĆØre spĆ©cifiĆ© par le code numĆ©rique. -CLEAN = EPURAGE ## Supprime tous les caractĆØres de contrĆ“le du texte. -CODE = CODE ## Renvoie le numĆ©ro de code du premier caractĆØre du texte. -CONCATENATE = CONCATENER ## Assemble plusieurs Ć©lĆ©ments textuels de faƧon Ć  n’en former qu’un seul. -DOLLAR = EURO ## Convertit un nombre en texte en utilisant le format monĆ©taire € (euro). -EXACT = EXACT ## VĆ©rifie si deux valeurs de texte sont identiques. -FIND = TROUVE ## Trouve un valeur textuelle dans une autre, en respectant la casse. -FINDB = TROUVERB ## Trouve un valeur textuelle dans une autre, en respectant la casse. -FIXED = CTXT ## Convertit un nombre au format texte avec un nombre de dĆ©cimales spĆ©cifiĆ©. -JIS = JIS ## Change les caractĆØres anglais ou katakana Ć  demi-chasse (codĆ©s sur un octet) Ć  l’intĆ©rieur d’une chaĆ®ne de caractĆØres en caractĆØres Ć  Ć  pleine chasse (codĆ©s sur deux octets). -LEFT = GAUCHE ## Renvoie des caractĆØres situĆ©s Ć  l’extrĆŖme gauche d’une chaĆ®ne de caractĆØres. -LEFTB = GAUCHEB ## Renvoie des caractĆØres situĆ©s Ć  l’extrĆŖme gauche d’une chaĆ®ne de caractĆØres. -LEN = NBCAR ## Renvoie le nombre de caractĆØres contenus dans une chaĆ®ne de texte. -LENB = LENB ## Renvoie le nombre de caractĆØres contenus dans une chaĆ®ne de texte. -LOWER = MINUSCULE ## Convertit le texte en minuscules. -MID = STXT ## Renvoie un nombre dĆ©terminĆ© de caractĆØres d’une chaĆ®ne de texte Ć  partir de la position que vous indiquez. -MIDB = STXTB ## Renvoie un nombre dĆ©terminĆ© de caractĆØres d’une chaĆ®ne de texte Ć  partir de la position que vous indiquez. -PHONETIC = PHONETIQUE ## Extrait les caractĆØres phonĆ©tiques (furigana) d’une chaĆ®ne de texte. -PROPER = NOMPROPRE ## Met en majuscules la premiĆØre lettre de chaque mot dans une chaĆ®ne textuelle. -REPLACE = REMPLACER ## Remplace des caractĆØres dans un texte. -REPLACEB = REMPLACERB ## Remplace des caractĆØres dans un texte. -REPT = REPT ## RĆ©pĆØte un texte un certain nombre de fois. -RIGHT = DROITE ## Renvoie des caractĆØres situĆ©s Ć  l’extrĆŖme droite d’une chaĆ®ne de caractĆØres. -RIGHTB = DROITEB ## Renvoie des caractĆØres situĆ©s Ć  l’extrĆŖme droite d’une chaĆ®ne de caractĆØres. -SEARCH = CHERCHE ## Trouve un texte dans un autre texte (sans respecter la casse). -SEARCHB = CHERCHERB ## Trouve un texte dans un autre texte (sans respecter la casse). -SUBSTITUTE = SUBSTITUE ## Remplace l’ancien texte d’une chaĆ®ne de caractĆØres par un nouveau. -T = T ## Convertit ses arguments en texte. -TEXT = TEXTE ## Convertit un nombre au format texte. -TRIM = SUPPRESPACE ## Supprime les espaces du texte. -UPPER = MAJUSCULE ## Convertit le texte en majuscules. -VALUE = CNUM ## Convertit un argument textuel en nombre diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/config deleted file mode 100644 index db61436..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/config +++ /dev/null @@ -1,23 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = Ft - - -## -## Excel Error Codes (For future use) -## -NULL = #NULLA! -DIV0 = #ZƉRƓOSZTƓ! -VALUE = #ƉRTƉK! -REF = #HIV! -NAME = #NƉV? -NUM = #SZƁM! -NA = #HIƁNYZIK diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/functions deleted file mode 100644 index 3adffeb..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/hu/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions BővĆ­tmĆ©nyek Ć©s automatizĆ”lĆ”si függvĆ©nyek -## -GETPIVOTDATA = KIMUTATƁSADATOT.VESZ ## A kimutatĆ”sokban tĆ”rolt adatok visszaadĆ”sĆ”ra hasznĆ”lható. - - -## -## Cube functions KockafüggvĆ©nyek -## -CUBEKPIMEMBER = KOCKA.FŐTELJMUT ## Egy fő teljesĆ­tmĆ©nymutató (KPI) nevĆ©t, tulajdonsĆ”gĆ”t Ć©s mĆ©rtĆ©kegysĆ©gĆ©t adja eredmĆ©nyül, a nevet Ć©s a tulajdonsĆ”got megjelenĆ­ti a cellĆ”ban. A KPI-k szĆ”mszerűsĆ­thető mĆ©rĆ©si lehetősĆ©get jelentenek – ilyen mutató pĆ©ldĆ”ul a havi bruttó nyeresĆ©g vagy az egy alkalmazottra jutó negyedĆ©ves forgalom –, egy szervezet teljesĆ­tmĆ©nyĆ©nek nyomonkƶvetĆ©sĆ©re hasznĆ”lhatók. -CUBEMEMBER = KOCKA.TAG ## Kockahierachia tagjĆ”t vagy rekordjĆ”t adja eredmĆ©nyül. Ellenőrizhető vele, hogy szerepel-e a kockĆ”ban az adott tag vagy rekord. -CUBEMEMBERPROPERTY = KOCKA.TAG.TUL ## A kocka egyik tagtulajdonsĆ”gĆ”nak Ć©rtĆ©kĆ©t adja eredmĆ©nyül. HasznĆ”latĆ”val ellenőrizhető, hogy szerepel-e egy tagnĆ©v a kockĆ”ban, eredmĆ©nye pedig az erre a tagra vonatkozó, megadott tulajdonsĆ”g. -CUBERANKEDMEMBER = KOCKA.HALM.ELEM ## Egy halmaz rangsor szerinti n-edik tagjĆ”t adja eredmĆ©nyül. HasznĆ”latĆ”val egy halmaz egy vagy tƶbb elemĆ©t kaphatja meg, pĆ©ldĆ”ul a legnagyobb teljesĆ­tmĆ©nyű üzletkƶtőt vagy a 10 legjobb tanulót. -CUBESET = KOCKA.HALM ## SzĆ”mĆ­tott tagok vagy rekordok halmazĆ”t adja eredmĆ©nyül, ehhez egy beĆ”llĆ­tott kifejezĆ©st elküld a kiszolgĆ”lón talĆ”lható kockĆ”nak, majd ezt a halmazt adja vissza a Microsoft Office Excel alkalmazĆ”snak. -CUBESETCOUNT = KOCKA.HALM.DB ## Egy halmaz elemszĆ”mĆ”t adja eredmĆ©nyül. -CUBEVALUE = KOCKA.ƉRTƉK ## KockĆ”ból ƶsszesĆ­tett Ć©rtĆ©ket ad eredmĆ©nyül. - - -## -## Database functions AdatbĆ”zis-kezelő függvĆ©nyek -## -DAVERAGE = AB.ƁTLAG ## A kijelƶlt adatbĆ”ziselemek Ć”tlagĆ”t szĆ”mĆ­tja ki. -DCOUNT = AB.DARAB ## MegszĆ”molja, hogy az adatbĆ”zisban hĆ”ny cella tartalmaz szĆ”mokat. -DCOUNTA = AB.DARAB2 ## MegszĆ”molja az adatbĆ”zisban lĆ©vő nem üres cellĆ”kat. -DGET = AB.MEZŐ ## Egy adatbĆ”zisból egyetlen olyan rekordot ad vissza, amely megfelel a megadott feltĆ©teleknek. -DMAX = AB.MAX ## A kivĆ”lasztott adatbĆ”ziselemek kƶzül a legnagyobb Ć©rtĆ©ket adja eredmĆ©nyül. -DMIN = AB.MIN ## A kijelƶlt adatbĆ”ziselemek kƶzül a legkisebb Ć©rtĆ©ket adja eredmĆ©nyül. -DPRODUCT = AB.SZORZAT ## Az adatbĆ”zis megadott feltĆ©teleknek eleget tevő rekordjaira ƶsszeszorozza a megadott mezőben talĆ”lható szĆ”mĆ©rtĆ©keket, Ć©s eredmĆ©nyül ezt a szorzatot adja. -DSTDEV = AB.SZƓRƁS ## A kijelƶlt adatbĆ”ziselemek egy mintĆ”ja alapjĆ”n megbecsüli a szórĆ”st. -DSTDEVP = AB.SZƓRƁS2 ## A kijelƶlt adatbĆ”ziselemek teljes sokasĆ”ga alapjĆ”n kiszĆ”mĆ­tja a szórĆ”st. -DSUM = AB.SZUM ## Ɩsszeadja a feltĆ©telnek megfelelő adatbĆ”zisrekordok mezőoszlopĆ”ban a szĆ”mokat. -DVAR = AB.VAR ## A kijelƶlt adatbĆ”ziselemek mintĆ”ja alapjĆ”n becslĆ©st ad a szórĆ”snĆ©gyzetre. -DVARP = AB.VAR2 ## A kijelƶlt adatbĆ”ziselemek teljes sokasĆ”ga alapjĆ”n kiszĆ”mĆ­tja a szórĆ”snĆ©gyzetet. - - -## -## Date and time functions DĆ”tumfüggvĆ©nyek -## -DATE = DƁTUM ## Adott dĆ”tum dĆ”tumĆ©rtĆ©kĆ©t adja eredmĆ©nyül. -DATEVALUE = DƁTUMƉRTƉK ## SzƶvegkĆ©nt megadott dĆ”tumot dĆ”tumĆ©rtĆ©kkĆ© alakĆ­t Ć”t. -DAY = NAP ## DĆ”tumĆ©rtĆ©ket a hónap egy napjĆ”vĆ” (0-31) alakĆ­t. -DAYS360 = NAP360 ## KĆ©t dĆ”tum kƶzĆ© eső napok szĆ”mĆ”t szĆ”mĆ­tja ki a 360 napos Ć©v alapjĆ”n. -EDATE = EDATE ## Adott dĆ”tumnĆ”l adott szĆ”mĆŗ hónappal korĆ”bbi vagy kĆ©sőbbi dĆ”tum dĆ”tumĆ©rtĆ©kĆ©t adja eredmĆ©nyül. -EOMONTH = EOMONTH ## Adott dĆ”tumnĆ”l adott szĆ”mĆŗ hónappal korĆ”bbi vagy kĆ©sőbbi hónap utolsó napjĆ”nak dĆ”tumĆ©rtĆ©kĆ©t adja eredmĆ©nyül. -HOUR = ƓRA ## IdőértĆ©ket órĆ”kkĆ” alakĆ­t. -MINUTE = PERC ## IdőértĆ©ket percekkĆ© alakĆ­t. -MONTH = HƓNAP ## IdőértĆ©ket hónapokkĆ” alakĆ­t. -NETWORKDAYS = NETWORKDAYS ## KĆ©t dĆ”tum kƶzƶtt a teljes munkanapok szĆ”mĆ”t adja meg. -NOW = MOST ## A napi dĆ”tum dĆ”tumĆ©rtĆ©kĆ©t Ć©s a pontos idő időértĆ©kĆ©t adja eredmĆ©nyül. -SECOND = MPERC ## IdőértĆ©ket mĆ”sodpercekkĆ© alakĆ­t Ć”t. -TIME = IDŐ ## Adott időpont időértĆ©kĆ©t adja meg. -TIMEVALUE = IDŐÉRTƉK ## SzƶvegkĆ©nt megadott időpontot időértĆ©kkĆ© alakĆ­t Ć”t. -TODAY = MA ## A napi dĆ”tum dĆ”tumĆ©rtĆ©kĆ©t adja eredmĆ©nyül. -WEEKDAY = HƉT.NAPJA ## DĆ”tumĆ©rtĆ©ket a hĆ©t napjĆ”vĆ” alakĆ­tja Ć”t. -WEEKNUM = WEEKNUM ## VisszatĆ©rĆ©si Ć©rtĆ©ke egy szĆ”m, amely azt mutatja meg, hogy a megadott dĆ”tum az Ć©v hĆ”nyadik hetĆ©re esik. -WORKDAY = WORKDAY ## Adott dĆ”tumnĆ”l adott munkanappal korĆ”bbi vagy kĆ©sőbbi dĆ”tum dĆ”tumĆ©rtĆ©kĆ©t adja eredmĆ©nyül. -YEAR = ƉV ## SorszĆ”mot Ć©vvĆ© alakĆ­t Ć”t. -YEARFRAC = YEARFRAC ## Az adott dĆ”tumok kƶzƶtti teljes napok szĆ”mĆ”t tƶrtĆ©vkĆ©nt adja meg. - - -## -## Engineering functions MĆ©rnƶki függvĆ©nyek -## -BESSELI = BESSELI ## Az In(x) módosĆ­tott Bessel-függvĆ©ny Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -BESSELJ = BESSELJ ## A Jn(x) Bessel-függvĆ©ny Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -BESSELK = BESSELK ## A Kn(x) módosĆ­tott Bessel-függvĆ©ny Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -BESSELY = BESSELY ## Az Yn(x) módosĆ­tott Bessel-függvĆ©ny Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -BIN2DEC = BIN2DEC ## BinĆ”ris szĆ”mot decimĆ”lissĆ” alakĆ­t Ć”t. -BIN2HEX = BIN2HEX ## BinĆ”ris szĆ”mot hexadecimĆ”lissĆ” alakĆ­t Ć”t. -BIN2OCT = BIN2OCT ## BinĆ”ris szĆ”mot oktĆ”lissĆ” alakĆ­t Ć”t. -COMPLEX = COMPLEX ## Valós Ć©s kĆ©pzetes rĆ©szből komplex szĆ”mot kĆ©pez. -CONVERT = CONVERT ## MĆ©rtĆ©kegysĆ©geket vĆ”lt Ć”t. -DEC2BIN = DEC2BIN ## DecimĆ”lis szĆ”mot binĆ”rissĆ” alakĆ­t Ć”t. -DEC2HEX = DEC2HEX ## DecimĆ”lis szĆ”mot hexadecimĆ”lissĆ” alakĆ­t Ć”t. -DEC2OCT = DEC2OCT ## DecimĆ”lis szĆ”mot oktĆ”lissĆ” alakĆ­t Ć”t. -DELTA = DELTA ## Azt vizsgĆ”lja, hogy kĆ©t Ć©rtĆ©k egyenlő-e. -ERF = ERF ## A hibafüggvĆ©ny Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -ERFC = ERFC ## A kiegĆ©szĆ­tett hibafüggvĆ©ny Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -GESTEP = GESTEP ## Azt vizsgĆ”lja, hogy egy szĆ”m nagyobb-e adott küszƶbĆ©rtĆ©knĆ©l. -HEX2BIN = HEX2BIN ## HexadecimĆ”lis szĆ”mot binĆ”rissĆ” alakĆ­t Ć”t. -HEX2DEC = HEX2DEC ## HexadecimĆ”lis szĆ”mot decimĆ”lissĆ” alakĆ­t Ć”t. -HEX2OCT = HEX2OCT ## HexadecimĆ”lis szĆ”mot oktĆ”lissĆ” alakĆ­t Ć”t. -IMABS = IMABS ## Komplex szĆ”m abszolĆŗt Ć©rtĆ©kĆ©t (modulusĆ”t) adja eredmĆ©nyül. -IMAGINARY = IMAGINARY ## Komplex szĆ”m kĆ©pzetes rĆ©szĆ©t adja eredmĆ©nyül. -IMARGUMENT = IMARGUMENT ## A komplex szĆ”m radiĆ”nban kifejezett thĆ©ta argumentumĆ”t adja eredmĆ©nyül. -IMCONJUGATE = IMCONJUGATE ## Komplex szĆ”m komplex konjugĆ”ltjĆ”t adja eredmĆ©nyül. -IMCOS = IMCOS ## Komplex szĆ”m koszinuszĆ”t adja eredmĆ©nyül. -IMDIV = IMDIV ## KĆ©t komplex szĆ”m hĆ”nyadosĆ”t adja eredmĆ©nyül. -IMEXP = IMEXP ## Az e szĆ”m komplex kitevőjű hatvĆ”nyĆ”t adja eredmĆ©nyül. -IMLN = IMLN ## Komplex szĆ”m termĆ©szetes logaritmusĆ”t adja eredmĆ©nyül. -IMLOG10 = IMLOG10 ## Komplex szĆ”m tĆ­zes alapĆŗ logaritmusĆ”t adja eredmĆ©nyül. -IMLOG2 = IMLOG2 ## Komplex szĆ”m kettes alapĆŗ logaritmusĆ”t adja eredmĆ©nyül. -IMPOWER = IMPOWER ## Komplex szĆ”m hatvĆ”nyĆ”t adja eredmĆ©nyül. -IMPRODUCT = IMPRODUCT ## Komplex szĆ”mok szorzatĆ”t adja eredmĆ©nyül. -IMREAL = IMREAL ## Komplex szĆ”m valós rĆ©szĆ©t adja eredmĆ©nyül. -IMSIN = IMSIN ## Komplex szĆ”m szinuszĆ”t adja eredmĆ©nyül. -IMSQRT = IMSQRT ## Komplex szĆ”m nĆ©gyzetgyƶkĆ©t adja eredmĆ©nyül. -IMSUB = IMSUB ## KĆ©t komplex szĆ”m külƶnbsĆ©gĆ©t adja eredmĆ©nyül. -IMSUM = IMSUM ## Komplex szĆ”mok ƶsszegĆ©t adja eredmĆ©nyül. -OCT2BIN = OCT2BIN ## OktĆ”lis szĆ”mot binĆ”rissĆ” alakĆ­t Ć”t. -OCT2DEC = OCT2DEC ## OktĆ”lis szĆ”mot decimĆ”lissĆ” alakĆ­t Ć”t. -OCT2HEX = OCT2HEX ## OktĆ”lis szĆ”mot hexadecimĆ”lissĆ” alakĆ­t Ć”t. - - -## -## Financial functions PĆ©nzügyi függvĆ©nyek -## -ACCRINT = ACCRINT ## Periodikusan kamatozó Ć©rtĆ©kpapĆ­r felszaporodott kamatĆ”t adja eredmĆ©nyül. -ACCRINTM = ACCRINTM ## LejĆ”ratkor kamatozó Ć©rtĆ©kpapĆ­r felszaporodott kamatĆ”t adja eredmĆ©nyül. -AMORDEGRC = AMORDEGRC ## Ɓllóeszkƶz lineĆ”ris Ć©rtĆ©kcsƶkkenĆ©sĆ©t adja meg az egyes kƶnyvelĆ©si időszakokra vonatkozóan. -AMORLINC = AMORLINC ## Az egyes kƶnyvelĆ©si időszakokban az Ć©rtĆ©kcsƶkkenĆ©st adja meg. -COUPDAYBS = COUPDAYBS ## A szelvĆ©nyidőszak kezdetĆ©től a kifizetĆ©s időpontjĆ”ig eltelt napokat adja vissza. -COUPDAYS = COUPDAYS ## A kifizetĆ©s időpontjĆ”t magĆ”ban foglaló szelvĆ©nyperiódus hosszĆ”t adja meg napokban. -COUPDAYSNC = COUPDAYSNC ## A kifizetĆ©s időpontja Ć©s a legkƶzelebbi szelvĆ©nydĆ”tum kƶzƶtti napok szĆ”mĆ”t adja meg. -COUPNCD = COUPNCD ## A kifizetĆ©st kƶvető legelső szelvĆ©nydĆ”tumot adja eredmĆ©nyül. -COUPNUM = COUPNUM ## A kifizetĆ©s Ć©s a lejĆ”rat időpontja kƶzƶtt kifizetendő szelvĆ©nyek szĆ”mĆ”t adja eredmĆ©nyül. -COUPPCD = COUPPCD ## A kifizetĆ©s előtti utolsó szelvĆ©nydĆ”tumot adja eredmĆ©nyül. -CUMIPMT = CUMIPMT ## KĆ©t fizetĆ©si időszak kƶzƶtt kifizetett kamat halmozott Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -CUMPRINC = CUMPRINC ## KĆ©t fizetĆ©si időszak kƶzƶtt kifizetett rĆ©szletek halmozott (kamatot nem tartalmazó) Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -DB = KCS2 ## Eszkƶz adott időszak alatti Ć©rtĆ©kcsƶkkenĆ©sĆ©t szĆ”mĆ­tja ki a lineĆ”ris leĆ­rĆ”si modell alkalmazĆ”sĆ”val. -DDB = KCSA ## Eszkƶz Ć©rtĆ©kcsƶkkenĆ©sĆ©t szĆ”mĆ­tja ki adott időszakra vonatkozóan a progresszĆ­v vagy egyĆ©b megadott leĆ­rĆ”si modell alkalmazĆ”sĆ”val. -DISC = DISC ## ƉrtĆ©kpapĆ­r leszĆ”mĆ­tolĆ”si kamatlĆ”bĆ”t adja eredmĆ©nyül. -DOLLARDE = DOLLARDE ## Egy kƶzƶnsĆ©ges tƶrtkĆ©nt megadott szĆ”mot tizedes tƶrttĆ© alakĆ­t Ć”t. -DOLLARFR = DOLLARFR ## Tizedes tƶrtkĆ©nt megadott szĆ”mot kƶzƶnsĆ©ges tƶrttĆ© alakĆ­t Ć”t. -DURATION = DURATION ## Periodikus kamatfizetĆ©sű Ć©rtĆ©kpapĆ­r Ć©ves kamatĆ©rzĆ©kenysĆ©gĆ©t adja eredmĆ©nyül. -EFFECT = EFFECT ## Az Ć©ves tĆ©nyleges kamatlĆ”b Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -FV = JBƉ ## BefektetĆ©s jƶvőbeli Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -FVSCHEDULE = FVSCHEDULE ## A kezdőtőke adott kamatlĆ”bak szerint megnƶvelt jƶvőbeli Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -INTRATE = INTRATE ## A lejĆ”ratig teljesen lekƶtƶtt Ć©rtĆ©kpapĆ­r kamatrĆ”tĆ”jĆ”t adja eredmĆ©nyül. -IPMT = RRƉSZLET ## HiteltƶrlesztĆ©sen belül a tőketƶrlesztĆ©s nagysĆ”gĆ”t szĆ”mĆ­tja ki adott időszakra. -IRR = BMR ## A befektetĆ©s belső megtĆ©rülĆ©si rĆ”tĆ”jĆ”t szĆ”mĆ­tja ki pĆ©nzĆ”ramlĆ”shoz. -ISPMT = LRƉSZLETKAMAT ## A befektetĆ©s adott időszakĆ”ra fizetett kamatot szĆ”mĆ­tja ki. -MDURATION = MDURATION ## Egy 100 Ft nĆ©vĆ©rtĆ©kű Ć©rtĆ©kpapĆ­r Macauley-fĆ©le módosĆ­tott kamatĆ©rzĆ©kenysĆ©gĆ©t adja eredmĆ©nyül. -MIRR = MEGTƉRÜLƉS ## A befektetĆ©s belső megtĆ©rülĆ©si rĆ”tĆ”jĆ”t szĆ”mĆ­tja ki a kƶltsĆ©gek Ć©s a bevĆ©telek külƶnbƶző kamatlĆ”ba mellett. -NOMINAL = NOMINAL ## Az Ć©ves nĆ©vleges kamatlĆ”b Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -NPER = PER.SZƁM ## A tƶrlesztĆ©si időszakok szĆ”mĆ”t adja meg. -NPV = NMƉ ## BefektetĆ©shez kapcsolódó pĆ©nzĆ”ramlĆ”s nettó jelenĆ©rtĆ©kĆ©t szĆ”mĆ­tja ki ismert pĆ©nzĆ”ramlĆ”s Ć©s kamatlĆ”b mellett. -ODDFPRICE = ODDFPRICE ## Egy 100 Ft nĆ©vĆ©rtĆ©kű, a futamidő elejĆ©n tƶredĆ©k-időszakos Ć©rtĆ©kpapĆ­r Ć”rĆ”t adja eredmĆ©nyül. -ODDFYIELD = ODDFYIELD ## A futamidő elejĆ©n tƶredĆ©k-időszakos Ć©rtĆ©kpapĆ­r hozamĆ”t adja eredmĆ©nyül. -ODDLPRICE = ODDLPRICE ## Egy 100 Ft nĆ©vĆ©rtĆ©kű, a futamidő vĆ©gĆ©n tƶredĆ©k-időszakos Ć©rtĆ©kpapĆ­r Ć”rĆ”t adja eredmĆ©nyül. -ODDLYIELD = ODDLYIELD ## A futamidő vĆ©gĆ©n tƶredĆ©k-időszakos Ć©rtĆ©kpapĆ­r hozamĆ”t adja eredmĆ©nyül. -PMT = RƉSZLET ## A tƶrlesztĆ©si időszakra vonatkozó tƶrlesztĆ©si ƶsszeget szĆ”mĆ­tja ki. -PPMT = PRƉSZLET ## HiteltƶrlesztĆ©sen belül a tőketƶrlesztĆ©s nagysĆ”gĆ”t szĆ”mĆ­tja ki adott időszakra. -PRICE = PRICE ## Egy 100 Ft nĆ©vĆ©rtĆ©kű, periodikusan kamatozó Ć©rtĆ©kpapĆ­r Ć”rĆ”t adja eredmĆ©nyül. -PRICEDISC = PRICEDISC ## Egy 100 Ft nĆ©vĆ©rtĆ©kű leszĆ”mĆ­tolt Ć©rtĆ©kpapĆ­r Ć”rĆ”t adja eredmĆ©nyül. -PRICEMAT = PRICEMAT ## Egy 100 Ft nĆ©vĆ©rtĆ©kű, a lejĆ”ratkor kamatozó Ć©rtĆ©kpapĆ­r Ć”rĆ”t adja eredmĆ©nyül. -PV = MƉ ## BefektetĆ©s jelenlegi Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -RATE = RƁTA ## Egy tƶrlesztĆ©si időszakban az egy időszakra eső kamatlĆ”b nagysĆ”gĆ”t szĆ”mĆ­tja ki. -RECEIVED = RECEIVED ## A lejĆ”ratig teljesen lekƶtƶtt Ć©rtĆ©kpapĆ­r lejĆ”ratakor kapott ƶsszegĆ©t adja eredmĆ©nyül. -SLN = LCSA ## TĆ”rgyi eszkƶz egy időszakra eső amortizĆ”ciójĆ”t adja meg bruttó Ć©rtĆ©k szerinti lineĆ”ris leĆ­rĆ”si kulcsot alkalmazva. -SYD = SYD ## TĆ”rgyi eszkƶz Ć©rtĆ©kcsƶkkenĆ©sĆ©t szĆ”mĆ­tja ki adott időszakra az Ć©vek szĆ”mjegyƶsszegĆ©vel dolgozó módszer alapjĆ”n. -TBILLEQ = TBILLEQ ## KincstĆ”rjegy kƶtvĆ©ny-egyenĆ©rtĆ©kű hozamĆ”t adja eredmĆ©nyül. -TBILLPRICE = TBILLPRICE ## Egy 100 Ft nĆ©vĆ©rtĆ©kű kincstĆ”rjegy Ć”rĆ”t adja eredmĆ©nyül. -TBILLYIELD = TBILLYIELD ## KincstĆ”rjegy hozamĆ”t adja eredmĆ©nyül. -VDB = ƉCSRI ## TĆ”rgyi eszkƶz amortizĆ”ciójĆ”t szĆ”mĆ­tja ki megadott vagy rĆ©szidőszakra a csƶkkenő egyenleg módszerĆ©nek alkalmazĆ”sĆ”val. -XIRR = XIRR ## Ütemezett kĆ©szpĆ©nzforgalom (cash flow) belső megtĆ©rülĆ©si kamatrĆ”tĆ”jĆ”t adja eredmĆ©nyül. -XNPV = XNPV ## Ütemezett kĆ©szpĆ©nzforgalom (cash flow) nettó jelenlegi Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -YIELD = YIELD ## Periodikusan kamatozó Ć©rtĆ©kpapĆ­r hozamĆ”t adja eredmĆ©nyül. -YIELDDISC = YIELDDISC ## LeszĆ”mĆ­tolt Ć©rtĆ©kpapĆ­r (pĆ©ldĆ”ul kincstĆ”rjegy) Ć©ves hozamĆ”t adja eredmĆ©nyül. -YIELDMAT = YIELDMAT ## LejĆ”ratkor kamatozó Ć©rtĆ©kpapĆ­r Ć©ves hozamĆ”t adja eredmĆ©nyül. - - -## -## Information functions InformĆ”ciós függvĆ©nyek -## -CELL = CELLA ## Egy cella formĆ”tumĆ”ra, elhelyezkedĆ©sĆ©re vagy tartalmĆ”ra vonatkozó adatokat ad eredmĆ©nyül. -ERROR.TYPE = HIBA.TƍPUS ## Egy hibatĆ­pushoz tartozó szĆ”mot ad eredmĆ©nyül. -INFO = INFƓ ## A rendszer- Ć©s munkakƶrnyezet pillanatnyi Ć”llapotĆ”ról ad felvilĆ”gosĆ­tĆ”st. -ISBLANK = ÜRES ## EredmĆ©nye IGAZ, ha az Ć©rtĆ©k üres. -ISERR = HIBA ## EredmĆ©nye IGAZ, ha az Ć©rtĆ©k valamelyik hibaĆ©rtĆ©k a #HIƁNYZIK kivĆ©telĆ©vel. -ISERROR = HIBƁS ## EredmĆ©nye IGAZ, ha az Ć©rtĆ©k valamelyik hibaĆ©rtĆ©k. -ISEVEN = ISEVEN ## EredmĆ©nye IGAZ, ha argumentuma pĆ”ros szĆ”m. -ISLOGICAL = LOGIKAI ## EredmĆ©nye IGAZ, ha az Ć©rtĆ©k logikai Ć©rtĆ©k. -ISNA = NINCS ## EredmĆ©nye IGAZ, ha az Ć©rtĆ©k a #HIƁNYZIK hibaĆ©rtĆ©k. -ISNONTEXT = NEM.SZƖVEG ## EredmĆ©nye IGAZ, ha az Ć©rtĆ©k nem szƶveg. -ISNUMBER = SZƁM ## EredmĆ©nye IGAZ, ha az Ć©rtĆ©k szĆ”m. -ISODD = ISODD ## EredmĆ©nye IGAZ, ha argumentuma pĆ”ratlan szĆ”m. -ISREF = HIVATKOZƁS ## EredmĆ©nye IGAZ, ha az Ć©rtĆ©k hivatkozĆ”s. -ISTEXT = SZƖVEG.E ## EredmĆ©nye IGAZ, ha az Ć©rtĆ©k szƶveg. -N = N ## ArgumentumĆ”nak Ć©rtĆ©kĆ©t szĆ”mmĆ” alakĆ­tja. -NA = HIƁNYZIK ## EredmĆ©nye a #HIƁNYZIK hibaĆ©rtĆ©k. -TYPE = TƍPUS ## ƉrtĆ©k adattĆ­pusĆ”nak azonosĆ­tószĆ”mĆ”t adja eredmĆ©nyül. - - -## -## Logical functions Logikai függvĆ©nyek -## -AND = ƉS ## EredmĆ©nye IGAZ, ha minden argumentuma IGAZ. -FALSE = HAMIS ## A HAMIS logikai Ć©rtĆ©ket adja eredmĆ©nyül. -IF = HA ## Logikai vizsgĆ”latot hajt vĆ©gre. -IFERROR = HAHIBA ## A megadott Ć©rtĆ©ket adja vissza, ha egy kĆ©plet hibĆ”hoz vezet; mĆ”s esetben a kĆ©plet Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -NOT = NEM ## Argumentuma Ć©rtĆ©kĆ©nek ellentettjĆ©t adja eredmĆ©nyül. -OR = VAGY ## EredmĆ©nye IGAZ, ha bĆ”rmely argumentuma IGAZ. -TRUE = IGAZ ## Az IGAZ logikai Ć©rtĆ©ket adja eredmĆ©nyül. - - -## -## Lookup and reference functions KeresĆ©si Ć©s hivatkozĆ”si függvĆ©nyek -## -ADDRESS = CƍM ## A munkalap egy cellĆ”jĆ”ra való hivatkozĆ”st adja szƶvegkĆ©nt eredmĆ©nyül. -AREAS = TERÜLET ## HivatkozĆ”sban a területek szĆ”mĆ”t adja eredmĆ©nyül. -CHOOSE = VƁLASZT ## ƉrtĆ©kek listĆ”jĆ”ból vĆ”laszt ki egy elemet. -COLUMN = OSZLOP ## Egy hivatkozĆ”s oszlopszĆ”mĆ”t adja eredmĆ©nyül. -COLUMNS = OSZLOPOK ## A hivatkozĆ”sban talĆ”lható oszlopok szĆ”mĆ”t adja eredmĆ©nyül. -HLOOKUP = VKERES ## A megadott tƶmb felső sorĆ”ban adott Ć©rtĆ©kű elemet keres, Ć©s a megtalĆ”lt elem oszlopĆ”ból adott sorban elhelyezkedő Ć©rtĆ©kkel tĆ©r vissza. -HYPERLINK = HIPERHIVATKOZƁS ## HĆ”lózati kiszolgĆ”lón, intraneten vagy az interneten tĆ”rolt dokumentumot megnyitó parancsikont vagy hivatkozĆ”st hoz lĆ©tre. -INDEX = INDEX ## Tƶmb- vagy hivatkozĆ”s indexszel megadott Ć©rtĆ©kĆ©t adja vissza. -INDIRECT = INDIREKT ## Szƶveg megadott hivatkozĆ”st ad eredmĆ©nyül. -LOOKUP = KERES ## Vektorban vagy tƶmbben keres meg Ć©rtĆ©keket. -MATCH = HOL.VAN ## HivatkozĆ”sban vagy tƶmbben Ć©rtĆ©keket keres. -OFFSET = OFSZET ## HivatkozĆ”s egy mĆ”sik hivatkozĆ”stól szĆ”mĆ­tott tĆ”volsĆ”gĆ”t adja meg. -ROW = SOR ## Egy hivatkozĆ”s sorĆ”nak szĆ”mĆ”t adja meg. -ROWS = SOROK ## Egy hivatkozĆ”s sorainak szĆ”mĆ”t adja meg. -RTD = RTD ## Valós idejű adatokat keres vissza a COM automatizmust (automatizĆ”lĆ”s: Egy alkalmazĆ”s objektumaival való munka mĆ”sik alkalmazĆ”sból vagy fejlesztőeszkƶzből. A korĆ”bban OLE automatizmusnak nevezett automatizĆ”lĆ”s iparĆ”gi szabvĆ”ny, a Component Object Model (COM) szolgĆ”ltatĆ”sa.) tĆ”mogató programból. -TRANSPOSE = TRANSZPONƁLƁS ## Egy tƶmb transzponĆ”ltjĆ”t adja eredmĆ©nyül. -VLOOKUP = FKERES ## A megadott tƶmb bal szĆ©lső oszlopĆ”ban megkeres egy Ć©rtĆ©ket, majd annak sora Ć©s a megadott oszlop metszĆ©spontjĆ”ban levő Ć©rtĆ©ked adja eredmĆ©nyül. - - -## -## Math and trigonometry functions Matematikai Ć©s trigonometrikus függvĆ©nyek -## -ABS = ABS ## Egy szĆ”m abszolĆŗt Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -ACOS = ARCCOS ## Egy szĆ”m arkusz koszinuszĆ”t szĆ”mĆ­tja ki. -ACOSH = ACOSH ## Egy szĆ”m inverz koszinusz hiperbolikuszĆ”t szĆ”mĆ­tja ki. -ASIN = ARCSIN ## Egy szĆ”m arkusz szinuszĆ”t szĆ”mĆ­tja ki. -ASINH = ASINH ## Egy szĆ”m inverz szinusz hiperbolikuszĆ”t szĆ”mĆ­tja ki. -ATAN = ARCTAN ## Egy szĆ”m arkusz tangensĆ©t szĆ”mĆ­tja ki. -ATAN2 = ARCTAN2 ## X Ć©s y koordinĆ”tĆ”k alapjĆ”n szĆ”mĆ­tja ki az arkusz tangens Ć©rtĆ©ket. -ATANH = ATANH ## A szĆ”m inverz tangens hiperbolikuszĆ”t szĆ”mĆ­tja ki. -CEILING = PLAFON ## Egy szĆ”mot a legkƶzelebbi egĆ©szre vagy a pontossĆ”gkĆ©nt megadott Ć©rtĆ©k legkƶzelebb eső tƶbbszƶrƶsĆ©re kerekĆ­t. -COMBIN = KOMBINƁCIƓK ## Adott szĆ”mĆŗ objektum ƶsszes lehetsĆ©ges kombinĆ”cióinak szĆ”mĆ”t szĆ”mĆ­tja ki. -COS = COS ## Egy szĆ”m koszinuszĆ”t szĆ”mĆ­tja ki. -COSH = COSH ## Egy szĆ”m koszinusz hiperbolikuszĆ”t szĆ”mĆ­tja ki. -DEGREES = FOK ## RadiĆ”nt fokkĆ” alakĆ­t Ć”t. -EVEN = PƁROS ## Egy szĆ”mot a legkƶzelebbi pĆ”ros egĆ©sz szĆ”mra kerekĆ­t. -EXP = KITEVŐ ## Az e adott kitevőjű hatvĆ”nyĆ”t adja eredmĆ©nyül. -FACT = FAKT ## Egy szĆ”m faktoriĆ”lisĆ”t szĆ”mĆ­tja ki. -FACTDOUBLE = FACTDOUBLE ## Egy szĆ”m dupla faktoriĆ”lisĆ”t adja eredmĆ©nyül. -FLOOR = PADLƓ ## Egy szĆ”mot lefelĆ©, a nulla felĆ© kerekĆ­t. -GCD = GCD ## A legnagyobb kƶzƶs osztót adja eredmĆ©nyül. -INT = INT ## Egy szĆ”mot lefelĆ© kerekĆ­t a legkƶzelebbi egĆ©szre. -LCM = LCM ## A legkisebb kƶzƶs tƶbbszƶrƶst adja eredmĆ©nyül. -LN = LN ## Egy szĆ”m termĆ©szetes logaritmusĆ”t szĆ”mĆ­tja ki. -LOG = LOG ## Egy szĆ”m adott alapĆŗ logaritmusĆ”t szĆ”mĆ­tja ki. -LOG10 = LOG10 ## Egy szĆ”m 10-es alapĆŗ logaritmusĆ”t szĆ”mĆ­tja ki. -MDETERM = MDETERM ## Egy tƶmb mĆ”trix-determinĆ”nsĆ”t szĆ”mĆ­tja ki. -MINVERSE = INVERZ.MƁTRIX ## Egy tƶmb mĆ”trix inverzĆ©t adja eredmĆ©nyül. -MMULT = MSZORZAT ## KĆ©t tƶmb mĆ”trix-szorzatĆ”t adja meg. -MOD = MARADƉK ## Egy szĆ”m osztĆ”si maradĆ©kĆ”t adja eredmĆ©nyül. -MROUND = MROUND ## A kĆ­vĆ”nt tƶbbszƶrƶsĆ©re kerekĆ­tett Ć©rtĆ©ket ad eredmĆ©nyül. -MULTINOMIAL = MULTINOMIAL ## SzĆ”mhalmaz multinomiĆ”lisĆ”t adja eredmĆ©nyül. -ODD = PƁRATLAN ## Egy szĆ”mot a legkƶzelebbi pĆ”ratlan szĆ”mra kerekĆ­t. -PI = PI ## A pi matematikai Ć”llandót adja vissza. -POWER = HATVƁNY ## Egy szĆ”m adott kitevőjű hatvĆ”nyĆ”t szĆ”mĆ­tja ki. -PRODUCT = SZORZAT ## Argumentumai szorzatĆ”t szĆ”mĆ­tja ki. -QUOTIENT = QUOTIENT ## Egy hĆ”nyados egĆ©sz rĆ©szĆ©t adja eredmĆ©nyül. -RADIANS = RADIƁN ## Fokot radiĆ”nnĆ” alakĆ­t Ć”t. -RAND = VƉL ## Egy 0 Ć©s 1 kƶzƶtti vĆ©letlen szĆ”mot ad eredmĆ©nyül. -RANDBETWEEN = RANDBETWEEN ## Megadott szĆ”mok kƶzĆ© eső vĆ©letlen szĆ”mot Ć”llĆ­t elő. -ROMAN = RƓMAI ## Egy szĆ”mot római szĆ”mokkal kifejezve szƶvegkĆ©nt ad eredmĆ©nyül. -ROUND = KEREKƍTƉS ## Egy szĆ”mot adott szĆ”mĆŗ szĆ”mjegyre kerekĆ­t. -ROUNDDOWN = KEREKƍTƉS.LE ## Egy szĆ”mot lefelĆ©, a nulla felĆ© kerekĆ­t. -ROUNDUP = KEREKƍTƉS.FEL ## Egy szĆ”mot felfelĆ©, a nullĆ”tól tĆ”volabbra kerekĆ­t. -SERIESSUM = SERIESSUM ## HatvĆ”nysor ƶsszegĆ©t adja eredmĆ©nyül. -SIGN = ELŐJEL ## Egy szĆ”m előjelĆ©t adja meg. -SIN = SIN ## Egy szƶg szinuszĆ”t szĆ”mĆ­tja ki. -SINH = SINH ## Egy szĆ”m szinusz hiperbolikuszĆ”t szĆ”mĆ­tja ki. -SQRT = GYƖK ## Egy szĆ”m pozitĆ­v nĆ©gyzetgyƶkĆ©t szĆ”mĆ­tja ki. -SQRTPI = SQRTPI ## A (szĆ”m*pi) nĆ©gyzetgyƶkĆ©t adja eredmĆ©nyül. -SUBTOTAL = RƉSZƖSSZEG ## Lista vagy adatbĆ”zis rĆ©szƶsszegĆ©t adja eredmĆ©nyül. -SUM = SZUM ## Ɩsszeadja az argumentumlistĆ”jĆ”ban lĆ©vő szĆ”mokat. -SUMIF = SZUMHA ## A megadott feltĆ©teleknek eleget tevő cellĆ”kban talĆ”lható Ć©rtĆ©keket adja ƶssze. -SUMIFS = SZUMHATƖBB ## Tƶbb megadott feltĆ©telnek eleget tĆ©vő tartomĆ”nycellĆ”k ƶsszegĆ©t adja eredmĆ©nyül. -SUMPRODUCT = SZORZATƖSSZEG ## A megfelelő tƶmbelemek szorzatĆ”nak ƶsszegĆ©t szĆ”mĆ­tja ki. -SUMSQ = NƉGYZETƖSSZEG ## Argumentumai nĆ©gyzetĆ©nek ƶsszegĆ©t szĆ”mĆ­tja ki. -SUMX2MY2 = SZUMX2BŐLY2 ## KĆ©t tƶmb megfelelő elemei nĆ©gyzetĆ©nek külƶnbsĆ©gĆ©t ƶsszegzi. -SUMX2PY2 = SZUMX2MEGY2 ## KĆ©t tƶmb megfelelő elemei nĆ©gyzetĆ©nek ƶsszegĆ©t ƶsszegzi. -SUMXMY2 = SZUMXBŐLY2 ## KĆ©t tƶmb megfelelő elemei külƶnbsĆ©gĆ©nek nĆ©gyzetƶsszegĆ©t szĆ”mĆ­tja ki. -TAN = TAN ## Egy szĆ”m tangensĆ©t szĆ”mĆ­tja ki. -TANH = TANH ## Egy szĆ”m tangens hiperbolikuszĆ”t szĆ”mĆ­tja ki. -TRUNC = CSONK ## Egy szĆ”mot egĆ©sszĆ© csonkĆ­t. - - -## -## Statistical functions Statisztikai függvĆ©nyek -## -AVEDEV = ƁTL.ELTƉRƉS ## Az adatpontoknak Ć”tlaguktól való Ć”tlagos abszolĆŗt eltĆ©rĆ©sĆ©t szĆ”mĆ­tja ki. -AVERAGE = ƁTLAG ## Argumentumai Ć”tlagĆ”t szĆ”mĆ­tja ki. -AVERAGEA = ƁTLAGA ## Argumentumai Ć”tlagĆ”t szĆ”mĆ­tja ki (beleĆ©rtve a szĆ”mokat, szƶveget Ć©s logikai Ć©rtĆ©keket). -AVERAGEIF = ƁTLAGHA ## A megadott feltĆ©telnek eleget tĆ©vő tartomĆ”ny cellĆ”inak Ć”tlagĆ”t (szĆ”mtani kƶzepĆ©t) adja eredmĆ©nyül. -AVERAGEIFS = ƁTLAGHATƖBB ## A megadott feltĆ©teleknek eleget tĆ©vő cellĆ”k Ć”tlagĆ”t (szĆ”mtani kƶzepĆ©t) adja eredmĆ©nyül. -BETADIST = BƉTA.ELOSZLƁS ## A bĆ©ta-eloszlĆ”s függvĆ©nyt szĆ”mĆ­tja ki. -BETAINV = INVERZ.BƉTA ## Adott bĆ©ta-eloszlĆ”shoz kiszĆ”mĆ­tja a bĆ©ta eloszlĆ”sfüggvĆ©ny inverzĆ©t. -BINOMDIST = BINOM.ELOSZLƁS ## A diszkrĆ©t binomiĆ”lis eloszlĆ”s valószĆ­nűsĆ©gĆ©rtĆ©kĆ©t szĆ”mĆ­tja ki. -CHIDIST = KHI.ELOSZLƁS ## A khi-nĆ©gyzet-eloszlĆ”s egyszĆ©lű valószĆ­nűsĆ©gĆ©rtĆ©kĆ©t szĆ”mĆ­tja ki. -CHIINV = INVERZ.KHI ## A khi-nĆ©gyzet-eloszlĆ”s egyszĆ©lű valószĆ­nűsĆ©gĆ©rtĆ©kĆ©nek inverzĆ©t szĆ”mĆ­tja ki. -CHITEST = KHI.PRƓBA ## FüggetlensĆ©gvizsgĆ”latot hajt vĆ©gre. -CONFIDENCE = MEGBƍZHATƓSƁG ## Egy statisztikai sokasĆ”g vĆ”rható Ć©rtĆ©kĆ©nek megbĆ­zhatósĆ”gi intervallumĆ”t adja eredmĆ©nyül. -CORREL = KORREL ## KĆ©t adathalmaz korrelĆ”ciós együtthatójĆ”t szĆ”mĆ­tja ki. -COUNT = DARAB ## MegszĆ”molja, hogy argumentumlistĆ”jĆ”ban hĆ”ny szĆ”m talĆ”lható. -COUNTA = DARAB2 ## MegszĆ”molja, hogy argumentumlistĆ”jĆ”ban hĆ”ny Ć©rtĆ©k talĆ”lható. -COUNTBLANK = DARABÜRES ## Egy tartomĆ”nyban ƶsszeszĆ”molja az üres cellĆ”kat. -COUNTIF = DARABTELI ## Egy tartomĆ”nyban ƶsszeszĆ”molja azokat a cellĆ”kat, amelyek eleget tesznek a megadott feltĆ©telnek. -COUNTIFS = DARABHATƖBB ## Egy tartomĆ”nyban ƶsszeszĆ”molja azokat a cellĆ”kat, amelyek eleget tesznek tƶbb feltĆ©telnek. -COVAR = KOVAR ## A kovarianciĆ”t, azaz a pĆ”ronkĆ©nti eltĆ©rĆ©sek szorzatĆ”nak Ć”tlagĆ”t szĆ”mĆ­tja ki. -CRITBINOM = KRITBINOM ## Azt a legkisebb szĆ”mot adja eredmĆ©nyül, amelyre a binomiĆ”lis eloszlĆ”sfüggvĆ©ny Ć©rtĆ©ke nem kisebb egy adott hatĆ”rĆ©rtĆ©knĆ©l. -DEVSQ = SQ ## Az Ć”tlagtól való eltĆ©rĆ©sek nĆ©gyzetĆ©nek ƶsszegĆ©t szĆ”mĆ­tja ki. -EXPONDIST = EXP.ELOSZLƁS ## Az exponenciĆ”lis eloszlĆ”s Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -FDIST = F.ELOSZLƁS ## Az F-eloszlĆ”s Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -FINV = INVERZ.F ## Az F-eloszlĆ”s inverzĆ©nek Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -FISHER = FISHER ## Fisher-transzformĆ”ciót hajt vĆ©gre. -FISHERINV = INVERZ.FISHER ## A Fisher-transzformĆ”ció inverzĆ©t hajtja vĆ©gre. -FORECAST = ELŐREJELZƉS ## Az ismert Ć©rtĆ©kek alapjĆ”n lineĆ”ris regresszióval becsült Ć©rtĆ©ket ad eredmĆ©nyül. -FREQUENCY = GYAKORISƁG ## A gyakorisĆ”gi vagy empirikus eloszlĆ”s Ć©rtĆ©kĆ©t függőleges tƶmbkĆ©nt adja eredmĆ©nyül. -FTEST = F.PRƓBA ## Az F-próba Ć©rtĆ©kĆ©t adja eredmĆ©nyül. -GAMMADIST = GAMMA.ELOSZLƁS ## A gamma-eloszlĆ”s Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -GAMMAINV = INVERZ.GAMMA ## A gamma-eloszlĆ”s eloszlĆ”sfüggvĆ©nye inverzĆ©nek Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -GAMMALN = GAMMALN ## A gamma-függvĆ©ny termĆ©szetes logaritmusĆ”t szĆ”mĆ­tja ki. -GEOMEAN = MƉRTANI.KƖZƉP ## Argumentumai mĆ©rtani kƶzĆ©pĆ©rtĆ©kĆ©t szĆ”mĆ­tja ki. -GROWTH = NƖV ## ExponenciĆ”lis regresszió alapjĆ”n ad becslĆ©st. -HARMEAN = HARM.KƖZƉP ## Argumentumai harmonikus Ć”tlagĆ”t szĆ”mĆ­tja ki. -HYPGEOMDIST = HIPERGEOM.ELOSZLƁS ## A hipergeometriai eloszlĆ”s Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -INTERCEPT = METSZ ## A regressziós egyenes y tengellyel való metszĆ©spontjĆ”t hatĆ”rozza meg. -KURT = CSÚCSOSSƁG ## Egy adathalmaz csĆŗcsossĆ”gĆ”t szĆ”mĆ­tja ki. -LARGE = NAGY ## Egy adathalmaz k-adik legnagyobb elemĆ©t adja eredmĆ©nyül. -LINEST = LIN.ILL ## A legkisebb nĆ©gyzetek módszerĆ©vel az adatokra illesztett egyenes paramĆ©tereit hatĆ”rozza meg. -LOGEST = LOG.ILL ## Az adatokra illesztett exponenciĆ”lis gƶrbe paramĆ©tereit hatĆ”rozza meg. -LOGINV = INVERZ.LOG.ELOSZLƁS ## A lognormĆ”lis eloszlĆ”s inverzĆ©t szĆ”mĆ­tja ki. -LOGNORMDIST = LOG.ELOSZLƁS ## A lognormĆ”lis eloszlĆ”sfüggvĆ©ny Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -MAX = MAX ## Az argumentumai kƶzƶtt szereplő legnagyobb szĆ”mot adja meg. -MAXA = MAX2 ## Az argumentumai kƶzƶtt szereplő legnagyobb szĆ”mot adja meg (beleĆ©rtve a szĆ”mokat, szƶveget Ć©s logikai Ć©rtĆ©keket). -MEDIAN = MEDIƁN ## Adott szĆ”mhalmaz mediĆ”njĆ”t szĆ”mĆ­tja ki. -MIN = MIN ## Az argumentumai kƶzƶtt szereplő legkisebb szĆ”mot adja meg. -MINA = MIN2 ## Az argumentumai kƶzƶtt szereplő legkisebb szĆ”mot adja meg, beleĆ©rtve a szĆ”mokat, szƶveget Ć©s logikai Ć©rtĆ©keket. -MODE = MƓDUSZ ## Egy adathalmazból kivĆ”lasztja a leggyakrabban előforduló szĆ”mot. -NEGBINOMDIST = NEGBINOM.ELOSZL ## A negatĆ­v binomiĆ”lis eloszlĆ”s Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -NORMDIST = NORM.ELOSZL ## A normĆ”lis eloszlĆ”s Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -NORMINV = INVERZ.NORM ## A normĆ”lis eloszlĆ”s eloszlĆ”sfüggvĆ©nye inverzĆ©nek Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -NORMSDIST = STNORMELOSZL ## A standard normĆ”lis eloszlĆ”s eloszlĆ”sfüggvĆ©nyĆ©nek Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -NORMSINV = INVERZ.STNORM ## A standard normĆ”lis eloszlĆ”s eloszlĆ”sfüggvĆ©nye inverzĆ©nek Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -PEARSON = PEARSON ## A Pearson-fĆ©le korrelĆ”ciós együtthatót szĆ”mĆ­tja ki. -PERCENTILE = PERCENTILIS ## Egy tartomĆ”nyban talĆ”lható Ć©rtĆ©kek k-adik percentilisĆ©t, azaz szĆ”zalĆ©kosztĆ”lyĆ”t adja eredmĆ©nyül. -PERCENTRANK = SZƁZALƉKRANG ## Egy Ć©rtĆ©knek egy adathalmazon belül vett szĆ”zalĆ©kos rangjĆ”t (elhelyezkedĆ©sĆ©t) szĆ”mĆ­tja ki. -PERMUT = VARIƁCIƓK ## Adott szĆ”mĆŗ objektum k-ad osztĆ”lyĆŗ ismĆ©tlĆ©s nĆ©lküli variĆ”cióinak szĆ”mĆ”t szĆ”mĆ­tja ki. -POISSON = POISSON ## A Poisson-eloszlĆ”s Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -PROB = VALƓSZƍNŰSƉG ## Annak valószĆ­nűsĆ©gĆ©t szĆ”mĆ­tja ki, hogy adott Ć©rtĆ©kek kĆ©t hatĆ”rĆ©rtĆ©k kƶzĆ© esnek. -QUARTILE = KVARTILIS ## Egy adathalmaz kvartilisĆ©t (negyedszintjĆ©t) szĆ”mĆ­tja ki. -RANK = SORSZƁM ## KiszĆ”mĆ­tja, hogy egy szĆ”m hĆ”nyadik egy szĆ”msorozatban. -RSQ = RNƉGYZET ## KiszĆ”mĆ­tja a Pearson-fĆ©le szorzatmomentum korrelĆ”ciós együtthatójĆ”nak nĆ©gyzetĆ©t. -SKEW = FERDESƉG ## Egy eloszlĆ”s ferdesĆ©gĆ©t hatĆ”rozza meg. -SLOPE = MEREDEKSƉG ## Egy lineĆ”ris regressziós egyenes meredeksĆ©gĆ©t szĆ”mĆ­tja ki. -SMALL = KICSI ## Egy adathalmaz k-adik legkisebb elemĆ©t adja meg. -STANDARDIZE = NORMALIZƁLƁS ## NormalizĆ”lt Ć©rtĆ©ket ad eredmĆ©nyül. -STDEV = SZƓRƁS ## Egy statisztikai sokasĆ”g mintĆ”jĆ”ból kiszĆ”mĆ­tja annak szórĆ”sĆ”t. -STDEVA = SZƓRƁSA ## Egy statisztikai sokasĆ”g mintĆ”jĆ”ból kiszĆ”mĆ­tja annak szórĆ”sĆ”t (beleĆ©rtve a szĆ”mokat, szƶveget Ć©s logikai Ć©rtĆ©keket). -STDEVP = SZƓRƁSP ## Egy statisztikai sokasĆ”g egĆ©szĆ©ből kiszĆ”mĆ­tja annak szórĆ”sĆ”t. -STDEVPA = SZƓRƁSPA ## Egy statisztikai sokasĆ”g egĆ©szĆ©ből kiszĆ”mĆ­tja annak szórĆ”sĆ”t (beleĆ©rtve szĆ”mokat, szƶveget Ć©s logikai Ć©rtĆ©keket). -STEYX = STHIBAYX ## Egy regresszió esetĆ©n az egyes x-Ć©rtĆ©kek alapjĆ”n meghatĆ”rozott y-Ć©rtĆ©kek standard hibĆ”jĆ”t szĆ”mĆ­tja ki. -TDIST = T.ELOSZLƁS ## A Student-fĆ©le t-eloszlĆ”s Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -TINV = INVERZ.T ## A Student-fĆ©le t-eloszlĆ”s inverzĆ©t szĆ”mĆ­tja ki. -TREND = TREND ## LineĆ”ris trend Ć©rtĆ©keit szĆ”mĆ­tja ki. -TRIMMEAN = RƉSZƁTLAG ## Egy adathalmaz kƶzĆ©pső rĆ©szĆ©nek Ć”tlagĆ”t szĆ”mĆ­tja ki. -TTEST = T.PRƓBA ## A Student-fĆ©le t-próbĆ”hoz tartozó valószĆ­nűsĆ©get szĆ”mĆ­tja ki. -VAR = VAR ## Minta alapjĆ”n becslĆ©st ad a varianciĆ”ra. -VARA = VARA ## Minta alapjĆ”n becslĆ©st ad a varianciĆ”ra (beleĆ©rtve szĆ”mokat, szƶveget Ć©s logikai Ć©rtĆ©keket). -VARP = VARP ## Egy statisztikai sokasĆ”g varianciĆ”jĆ”t szĆ”mĆ­tja ki. -VARPA = VARPA ## Egy statisztikai sokasĆ”g varianciĆ”jĆ”t szĆ”mĆ­tja ki (beleĆ©rtve szĆ”mokat, szƶveget Ć©s logikai Ć©rtĆ©keket). -WEIBULL = WEIBULL ## A Weibull-fĆ©le eloszlĆ”s Ć©rtĆ©kĆ©t szĆ”mĆ­tja ki. -ZTEST = Z.PRƓBA ## Az egyszĆ©lű z-próbĆ”val kapott valószĆ­nűsĆ©gĆ©rtĆ©ket szĆ”mĆ­tja ki. - - -## -## Text functions Szƶvegműveletekhez hasznĆ”lható függvĆ©nyek -## -ASC = ASC ## Szƶveg teljes szĆ©lessĆ©gű (kĆ©tbĆ”jtos) latin Ć©s katakana karaktereit fĆ©lszĆ©lessĆ©gű (egybĆ”jtos) karakterekkĆ© alakĆ­tja. -BAHTTEXT = BAHTSZƖVEG ## SzĆ”mot szƶveggĆ© alakĆ­t a ß (baht) pĆ©nznemformĆ”tum hasznĆ”latĆ”val. -CHAR = KARAKTER ## A kódszĆ”mmal meghatĆ”rozott karaktert adja eredmĆ©nyül. -CLEAN = TISZTƍT ## A szƶvegből eltĆ”volĆ­tja az ƶsszes nem nyomtatható karaktert. -CODE = KƓD ## Karaktersorozat első karakterĆ©nek numerikus kódjĆ”t adja eredmĆ©nyül. -CONCATENATE = ƖSSZEFŰZ ## Tƶbb szƶvegelemet egyetlen szƶveges elemmĆ© fűz ƶssze. -DOLLAR = FORINT ## SzĆ”mot pĆ©nznem formĆ”tumĆŗ szƶveggĆ© alakĆ­t Ć”t. -EXACT = AZONOS ## MegvizsgĆ”lja, hogy kĆ©t Ć©rtĆ©k azonos-e. -FIND = SZƖVEG.TALƁL ## Karaktersorozatot keres egy mĆ”sikban (a kis- Ć©s nagybetűk megkülƶnbƶztetĆ©sĆ©vel). -FINDB = SZƖVEG.TALƁL2 ## Karaktersorozatot keres egy mĆ”sikban (a kis- Ć©s nagybetűk megkülƶnbƶztetĆ©sĆ©vel). -FIXED = FIX ## SzĆ”mot szƶveges formĆ”tumĆŗra alakĆ­t adott szĆ”mĆŗ tizedesjegyre kerekĆ­tve. -JIS = JIS ## A fĆ©lszĆ©lessĆ©gű (egybĆ”jtos) latin Ć©s a katakana karaktereket teljes szĆ©lessĆ©gű (kĆ©tbĆ”jtos) karakterekkĆ© alakĆ­tja. -LEFT = BAL ## Szƶveg bal szĆ©lső karaktereit adja eredmĆ©nyül. -LEFTB = BAL2 ## Szƶveg bal szĆ©lső karaktereit adja eredmĆ©nyül. -LEN = HOSSZ ## Szƶveg karakterekben mĆ©rt hosszĆ”t adja eredmĆ©nyül. -LENB = HOSSZ2 ## Szƶveg karakterekben mĆ©rt hosszĆ”t adja eredmĆ©nyül. -LOWER = KISBETŰ ## Szƶveget kisbetűssĆ© alakĆ­t Ć”t. -MID = KƖZƉP ## A szƶveg adott pozĆ­ciójĆ”tól kezdve megadott szĆ”mĆŗ karaktert ad vissza eredmĆ©nykĆ©nt. -MIDB = KƖZƉP2 ## A szƶveg adott pozĆ­ciójĆ”tól kezdve megadott szĆ”mĆŗ karaktert ad vissza eredmĆ©nykĆ©nt. -PHONETIC = PHONETIC ## Szƶveg furigana (fonetikus) karaktereit adja vissza. -PROPER = TNƉV ## Szƶveg minden szavĆ”nak kezdőbetűjĆ©t nagybetűsre cserĆ©li. -REPLACE = CSERE ## A szƶvegen belül karaktereket cserĆ©l. -REPLACEB = CSERE2 ## A szƶvegen belül karaktereket cserĆ©l. -REPT = SOKSZOR ## Megadott szĆ”mĆŗ alkalommal megismĆ©tel egy szƶvegrĆ©szt. -RIGHT = JOBB ## SzƶvegrĆ©sz jobb szĆ©lső karaktereit adja eredmĆ©nyül. -RIGHTB = JOBB2 ## SzƶvegrĆ©sz jobb szĆ©lső karaktereit adja eredmĆ©nyül. -SEARCH = SZƖVEG.KERES ## Karaktersorozatot keres egy mĆ”sikban (a kis- Ć©s nagybetűk kƶzƶtt nem tesz külƶnbsĆ©get). -SEARCHB = SZƖVEG.KERES2 ## Karaktersorozatot keres egy mĆ”sikban (a kis- Ć©s nagybetűk kƶzƶtt nem tesz külƶnbsĆ©get). -SUBSTITUTE = HELYETTE ## Szƶvegben adott karaktereket mĆ”sikra cserĆ©l. -T = T ## ArgumentumĆ”t szƶveggĆ© alakĆ­tja Ć”t. -TEXT = SZƖVEG ## SzĆ”mĆ©rtĆ©ket alakĆ­t Ć”t adott szĆ”mformĆ”tumĆŗ szƶveggĆ©. -TRIM = TRIM ## A szƶvegből eltĆ”volĆ­tja a szókƶzƶket. -UPPER = NAGYBETŰS ## Szƶveget nagybetűssĆ© alakĆ­t Ć”t. -VALUE = ƉRTƉK ## Szƶveget szĆ”mmĆ” alakĆ­t Ć”t. diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/it/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/it/config deleted file mode 100644 index 6cc013a..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/it/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = € - - -## -## Excel Error Codes (For future use) - -## -NULL = #NULLO! -DIV0 = #DIV/0! -VALUE = #VALORE! -REF = #RIF! -NAME = #NOME? -NUM = #NUM! -NA = #N/D diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/it/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/it/functions deleted file mode 100644 index 1901baf..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/it/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions Funzioni di automazione e dei componenti aggiuntivi -## -GETPIVOTDATA = INFO.DATI.TAB.PIVOT ## Restituisce i dati memorizzati in un rapporto di tabella pivot - - -## -## Cube functions Funzioni cubo -## -CUBEKPIMEMBER = MEMBRO.KPI.CUBO ## Restituisce il nome, la proprietĆ  e la misura di un indicatore di prestazioni chiave (KPI) e visualizza il nome e la proprietĆ  nella cella. Un KPI ĆØ una misura quantificabile, ad esempio l'utile lordo mensile o il fatturato trimestrale dei dipendenti, utilizzata per il monitoraggio delle prestazioni di un'organizzazione. -CUBEMEMBER = MEMBRO.CUBO ## Restituisce un membro o una tupla in una gerarchia di cubi. Consente di verificare l'esistenza del membro o della tupla nel cubo. -CUBEMEMBERPROPERTY = PROPRIETƀ.MEMBRO.CUBO ## Restituisce il valore di una proprietĆ  di un membro del cubo. Consente di verificare l'esistenza di un nome di membro all'interno del cubo e di restituire la proprietĆ  specificata per tale membro. -CUBERANKEDMEMBER = MEMBRO.CUBO.CON.RANGO ## Restituisce l'n-esimo membro o il membro ordinato di un insieme. Consente di restituire uno o più elementi in un insieme, ad esempio l'agente di vendita migliore o i primi 10 studenti. -CUBESET = SET.CUBO ## Definisce un insieme di tuple o membri calcolati mediante l'invio di un'espressione di insieme al cubo sul server. In questo modo l'insieme viene creato e restituito a Microsoft Office Excel. -CUBESETCOUNT = CONTA.SET.CUBO ## Restituisce il numero di elementi di un insieme. -CUBEVALUE = VALORE.CUBO ## Restituisce un valore aggregato da un cubo. - - -## -## Database functions Funzioni di database -## -DAVERAGE = DB.MEDIA ## Restituisce la media di voci del database selezionate -DCOUNT = DB.CONTA.NUMERI ## Conta le celle di un database contenenti numeri -DCOUNTA = DB.CONTA.VALORI ## Conta le celle non vuote in un database -DGET = DB.VALORI ## Estrae da un database un singolo record che soddisfa i criteri specificati -DMAX = DB.MAX ## Restituisce il valore massimo dalle voci selezionate in un database -DMIN = DB.MIN ## Restituisce il valore minimo dalle voci di un database selezionate -DPRODUCT = DB.PRODOTTO ## Moltiplica i valori in un determinato campo di record che soddisfano i criteri del database -DSTDEV = DB.DEV.ST ## Restituisce una stima della deviazione standard sulla base di un campione di voci di un database selezionate -DSTDEVP = DB.DEV.ST.POP ## Calcola la deviazione standard sulla base di tutte le voci di un database selezionate -DSUM = DB.SOMMA ## Aggiunge i numeri nel campo colonna di record del database che soddisfa determinati criteri -DVAR = DB.VAR ## Restituisce una stima della varianza sulla base di un campione da voci di un database selezionate -DVARP = DB.VAR.POP ## Calcola la varianza sulla base di tutte le voci di un database selezionate - - -## -## Date and time functions Funzioni data e ora -## -DATE = DATA ## Restituisce il numero seriale di una determinata data -DATEVALUE = DATA.VALORE ## Converte una data sotto forma di testo in un numero seriale -DAY = GIORNO ## Converte un numero seriale in un giorno del mese -DAYS360 = GIORNO360 ## Calcola il numero di giorni compreso tra due date basandosi su un anno di 360 giorni -EDATE = DATA.MESE ## Restituisce il numero seriale della data che rappresenta il numero di mesi prima o dopo la data di inizio -EOMONTH = FINE.MESE ## Restituisce il numero seriale dell'ultimo giorno del mese, prima o dopo un determinato numero di mesi -HOUR = ORA ## Converte un numero seriale in un'ora -MINUTE = MINUTO ## Converte un numero seriale in un minuto -MONTH = MESE ## Converte un numero seriale in un mese -NETWORKDAYS = GIORNI.LAVORATIVI.TOT ## Restituisce il numero di tutti i giorni lavorativi compresi fra due date -NOW = ADESSO ## Restituisce il numero seriale della data e dell'ora corrente -SECOND = SECONDO ## Converte un numero seriale in un secondo -TIME = ORARIO ## Restituisce il numero seriale di una determinata ora -TIMEVALUE = ORARIO.VALORE ## Converte un orario in forma di testo in un numero seriale -TODAY = OGGI ## Restituisce il numero seriale relativo alla data odierna -WEEKDAY = GIORNO.SETTIMANA ## Converte un numero seriale in un giorno della settimana -WEEKNUM = NUM.SETTIMANA ## Converte un numero seriale in un numero che rappresenta la posizione numerica di una settimana nell'anno -WORKDAY = GIORNO.LAVORATIVO ## Restituisce il numero della data prima o dopo un determinato numero di giorni lavorativi -YEAR = ANNO ## Converte un numero seriale in un anno -YEARFRAC = FRAZIONE.ANNO ## Restituisce la frazione dell'anno che rappresenta il numero dei giorni compresi tra una data_ iniziale e una data_finale - - -## -## Engineering functions Funzioni ingegneristiche -## -BESSELI = BESSEL.I ## Restituisce la funzione di Bessel modificata In(x) -BESSELJ = BESSEL.J ## Restituisce la funzione di Bessel Jn(x) -BESSELK = BESSEL.K ## Restituisce la funzione di Bessel modificata Kn(x) -BESSELY = BESSEL.Y ## Restituisce la funzione di Bessel Yn(x) -BIN2DEC = BINARIO.DECIMALE ## Converte un numero binario in decimale -BIN2HEX = BINARIO.HEX ## Converte un numero binario in esadecimale -BIN2OCT = BINARIO.OCT ## Converte un numero binario in ottale -COMPLEX = COMPLESSO ## Converte i coefficienti reali e immaginari in numeri complessi -CONVERT = CONVERTI ## Converte un numero da un sistema di misura in un altro -DEC2BIN = DECIMALE.BINARIO ## Converte un numero decimale in binario -DEC2HEX = DECIMALE.HEX ## Converte un numero decimale in esadecimale -DEC2OCT = DECIMALE.OCT ## Converte un numero decimale in ottale -DELTA = DELTA ## Verifica se due valori sono uguali -ERF = FUNZ.ERRORE ## Restituisce la funzione di errore -ERFC = FUNZ.ERRORE.COMP ## Restituisce la funzione di errore complementare -GESTEP = SOGLIA ## Verifica se un numero ĆØ maggiore del valore di soglia -HEX2BIN = HEX.BINARIO ## Converte un numero esadecimale in binario -HEX2DEC = HEX.DECIMALE ## Converte un numero esadecimale in decimale -HEX2OCT = HEX.OCT ## Converte un numero esadecimale in ottale -IMABS = COMP.MODULO ## Restituisce il valore assoluto (modulo) di un numero complesso -IMAGINARY = COMP.IMMAGINARIO ## Restituisce il coefficiente immaginario di un numero complesso -IMARGUMENT = COMP.ARGOMENTO ## Restituisce l'argomento theta, un angolo espresso in radianti -IMCONJUGATE = COMP.CONIUGATO ## Restituisce il complesso coniugato del numero complesso -IMCOS = COMP.COS ## Restituisce il coseno di un numero complesso -IMDIV = COMP.DIV ## Restituisce il quoziente di due numeri complessi -IMEXP = COMP.EXP ## Restituisce il valore esponenziale di un numero complesso -IMLN = COMP.LN ## Restituisce il logaritmo naturale di un numero complesso -IMLOG10 = COMP.LOG10 ## Restituisce il logaritmo in base 10 di un numero complesso -IMLOG2 = COMP.LOG2 ## Restituisce un logaritmo in base 2 di un numero complesso -IMPOWER = COMP.POTENZA ## Restituisce il numero complesso elevato a una potenza intera -IMPRODUCT = COMP.PRODOTTO ## Restituisce il prodotto di numeri complessi compresi tra 2 e 29 -IMREAL = COMP.PARTE.REALE ## Restituisce il coefficiente reale di un numero complesso -IMSIN = COMP.SEN ## Restituisce il seno di un numero complesso -IMSQRT = COMP.RADQ ## Restituisce la radice quadrata di un numero complesso -IMSUB = COMP.DIFF ## Restituisce la differenza fra due numeri complessi -IMSUM = COMP.SOMMA ## Restituisce la somma di numeri complessi -OCT2BIN = OCT.BINARIO ## Converte un numero ottale in binario -OCT2DEC = OCT.DECIMALE ## Converte un numero ottale in decimale -OCT2HEX = OCT.HEX ## Converte un numero ottale in esadecimale - - -## -## Financial functions Funzioni finanziarie -## -ACCRINT = INT.MATURATO.PER ## Restituisce l'interesse maturato di un titolo che paga interessi periodici -ACCRINTM = INT.MATURATO.SCAD ## Restituisce l'interesse maturato di un titolo che paga interessi alla scadenza -AMORDEGRC = AMMORT.DEGR ## Restituisce l'ammortamento per ogni periodo contabile utilizzando un coefficiente di ammortamento -AMORLINC = AMMORT.PER ## Restituisce l'ammortamento per ogni periodo contabile -COUPDAYBS = GIORNI.CED.INIZ.LIQ ## Restituisce il numero dei giorni che vanno dall'inizio del periodo di durata della cedola alla data di liquidazione -COUPDAYS = GIORNI.CED ## Restituisce il numero dei giorni relativi al periodo della cedola che contiene la data di liquidazione -COUPDAYSNC = GIORNI.CED.NUOVA ## Restituisce il numero di giorni che vanno dalla data di liquidazione alla data della cedola successiva -COUPNCD = DATA.CED.SUCC ## Restituisce un numero che rappresenta la data della cedola successiva alla data di liquidazione -COUPNUM = NUM.CED ## Restituisce il numero di cedole pagabili fra la data di liquidazione e la data di scadenza -COUPPCD = DATA.CED.PREC ## Restituisce un numero che rappresenta la data della cedola precedente alla data di liquidazione -CUMIPMT = INT.CUMUL ## Restituisce l'interesse cumulativo pagato fra due periodi -CUMPRINC = CAP.CUM ## Restituisce il capitale cumulativo pagato per estinguere un debito fra due periodi -DB = DB ## Restituisce l'ammortamento di un bene per un periodo specificato utilizzando il metodo di ammortamento a quote fisse decrescenti -DDB = AMMORT ## Restituisce l'ammortamento di un bene per un periodo specificato utilizzando il metodo di ammortamento a doppie quote decrescenti o altri metodi specificati -DISC = TASSO.SCONTO ## Restituisce il tasso di sconto per un titolo -DOLLARDE = VALUTA.DEC ## Converte un prezzo valuta, espresso come frazione, in prezzo valuta, espresso come numero decimale -DOLLARFR = VALUTA.FRAZ ## Converte un prezzo valuta, espresso come numero decimale, in prezzo valuta, espresso come frazione -DURATION = DURATA ## Restituisce la durata annuale di un titolo con i pagamenti di interesse periodico -EFFECT = EFFETTIVO ## Restituisce l'effettivo tasso di interesse annuo -FV = VAL.FUT ## Restituisce il valore futuro di un investimento -FVSCHEDULE = VAL.FUT.CAPITALE ## Restituisce il valore futuro di un capitale iniziale dopo aver applicato una serie di tassi di interesse composti -INTRATE = TASSO.INT ## Restituisce il tasso di interesse per un titolo interamente investito -IPMT = INTERESSI ## Restituisce il valore degli interessi per un investimento relativo a un periodo specifico -IRR = TIR.COST ## Restituisce il tasso di rendimento interno per una serie di flussi di cassa -ISPMT = INTERESSE.RATA ## Calcola l'interesse di un investimento pagato durante un periodo specifico -MDURATION = DURATA.M ## Restituisce la durata Macauley modificata per un titolo con un valore presunto di € 100 -MIRR = TIR.VAR ## Restituisce il tasso di rendimento interno in cui i flussi di cassa positivi e negativi sono finanziati a tassi differenti -NOMINAL = NOMINALE ## Restituisce il tasso di interesse nominale annuale -NPER = NUM.RATE ## Restituisce un numero di periodi relativi a un investimento -NPV = VAN ## Restituisce il valore attuale netto di un investimento basato su una serie di flussi di cassa periodici e sul tasso di sconto -ODDFPRICE = PREZZO.PRIMO.IRR ## Restituisce il prezzo di un titolo dal valore nominale di € 100 avente il primo periodo di durata irregolare -ODDFYIELD = REND.PRIMO.IRR ## Restituisce il rendimento di un titolo avente il primo periodo di durata irregolare -ODDLPRICE = PREZZO.ULTIMO.IRR ## Restituisce il prezzo di un titolo dal valore nominale di € 100 avente l'ultimo periodo di durata irregolare -ODDLYIELD = REND.ULTIMO.IRR ## Restituisce il rendimento di un titolo avente l'ultimo periodo di durata irregolare -PMT = RATA ## Restituisce il pagamento periodico di una rendita annua -PPMT = P.RATA ## Restituisce il pagamento sul capitale di un investimento per un dato periodo -PRICE = PREZZO ## Restituisce il prezzo di un titolo dal valore nominale di € 100 che paga interessi periodici -PRICEDISC = PREZZO.SCONT ## Restituisce il prezzo di un titolo scontato dal valore nominale di € 100 -PRICEMAT = PREZZO.SCAD ## Restituisce il prezzo di un titolo dal valore nominale di € 100 che paga gli interessi alla scadenza -PV = VA ## Restituisce il valore attuale di un investimento -RATE = TASSO ## Restituisce il tasso di interesse per un periodo di un'annualitĆ  -RECEIVED = RICEV.SCAD ## Restituisce l'ammontare ricevuto alla scadenza di un titolo interamente investito -SLN = AMMORT.COST ## Restituisce l'ammortamento a quote costanti di un bene per un singolo periodo -SYD = AMMORT.ANNUO ## Restituisce l'ammortamento a somma degli anni di un bene per un periodo specificato -TBILLEQ = BOT.EQUIV ## Restituisce il rendimento equivalente ad un'obbligazione per un Buono ordinario del Tesoro -TBILLPRICE = BOT.PREZZO ## Restituisce il prezzo di un Buono del Tesoro dal valore nominale di € 100 -TBILLYIELD = BOT.REND ## Restituisce il rendimento di un Buono del Tesoro -VDB = AMMORT.VAR ## Restituisce l'ammortamento di un bene per un periodo specificato o parziale utilizzando il metodo a doppie quote proporzionali ai valori residui -XIRR = TIR.X ## Restituisce il tasso di rendimento interno di un impiego di flussi di cassa -XNPV = VAN.X ## Restituisce il valore attuale netto di un impiego di flussi di cassa non necessariamente periodici -YIELD = REND ## Restituisce il rendimento di un titolo che frutta interessi periodici -YIELDDISC = REND.TITOLI.SCONT ## Restituisce il rendimento annuale di un titolo scontato, ad esempio un Buono del Tesoro -YIELDMAT = REND.SCAD ## Restituisce il rendimento annuo di un titolo che paga interessi alla scadenza - - -## -## Information functions Funzioni relative alle informazioni -## -CELL = CELLA ## Restituisce le informazioni sulla formattazione, la posizione o i contenuti di una cella -ERROR.TYPE = ERRORE.TIPO ## Restituisce un numero che corrisponde a un tipo di errore -INFO = INFO ## Restituisce le informazioni sull'ambiente operativo corrente -ISBLANK = VAL.VUOTO ## Restituisce VERO se il valore ĆØ vuoto -ISERR = VAL.ERR ## Restituisce VERO se il valore ĆØ un valore di errore qualsiasi tranne #N/D -ISERROR = VAL.ERRORE ## Restituisce VERO se il valore ĆØ un valore di errore qualsiasi -ISEVEN = VAL.PARI ## Restituisce VERO se il numero ĆØ pari -ISLOGICAL = VAL.LOGICO ## Restituisce VERO se il valore ĆØ un valore logico -ISNA = VAL.NON.DISP ## Restituisce VERO se il valore ĆØ un valore di errore #N/D -ISNONTEXT = VAL.NON.TESTO ## Restituisce VERO se il valore non ĆØ in formato testo -ISNUMBER = VAL.NUMERO ## Restituisce VERO se il valore ĆØ un numero -ISODD = VAL.DISPARI ## Restituisce VERO se il numero ĆØ dispari -ISREF = VAL.RIF ## Restituisce VERO se il valore ĆØ un riferimento -ISTEXT = VAL.TESTO ## Restituisce VERO se il valore ĆØ in formato testo -N = NUM ## Restituisce un valore convertito in numero -NA = NON.DISP ## Restituisce il valore di errore #N/D -TYPE = TIPO ## Restituisce un numero che indica il tipo di dati relativi a un valore - - -## -## Logical functions Funzioni logiche -## -AND = E ## Restituisce VERO se tutti gli argomenti sono VERO -FALSE = FALSO ## Restituisce il valore logico FALSO -IF = SE ## Specifica un test logico da eseguire -IFERROR = SE.ERRORE ## Restituisce un valore specificato se una formula fornisce un errore come risultato; in caso contrario, restituisce il risultato della formula -NOT = NON ## Inverte la logica degli argomenti -OR = O ## Restituisce VERO se un argomento qualsiasi ĆØ VERO -TRUE = VERO ## Restituisce il valore logico VERO - - -## -## Lookup and reference functions Funzioni di ricerca e di riferimento -## -ADDRESS = INDIRIZZO ## Restituisce un riferimento come testo in una singola cella di un foglio di lavoro -AREAS = AREE ## Restituisce il numero di aree in un riferimento -CHOOSE = SCEGLI ## Sceglie un valore da un elenco di valori -COLUMN = RIF.COLONNA ## Restituisce il numero di colonna di un riferimento -COLUMNS = COLONNE ## Restituisce il numero di colonne in un riferimento -HLOOKUP = CERCA.ORIZZ ## Effettua una ricerca nella riga superiore di una matrice e restituisce il valore della cella specificata -HYPERLINK = COLLEG.IPERTESTUALE ## Crea un collegamento che apre un documento memorizzato in un server di rete, una rete Intranet o Internet -INDEX = INDICE ## Utilizza un indice per scegliere un valore da un riferimento o da una matrice -INDIRECT = INDIRETTO ## Restituisce un riferimento specificato da un valore testo -LOOKUP = CERCA ## Ricerca i valori in un vettore o in una matrice -MATCH = CONFRONTA ## Ricerca i valori in un riferimento o in una matrice -OFFSET = SCARTO ## Restituisce uno scarto di riferimento da un riferimento dato -ROW = RIF.RIGA ## Restituisce il numero di riga di un riferimento -ROWS = RIGHE ## Restituisce il numero delle righe in un riferimento -RTD = DATITEMPOREALE ## Recupera dati in tempo reale da un programma che supporta l'automazione COM (automazione: Metodo per utilizzare gli oggetti di un'applicazione da un'altra applicazione o da un altro strumento di sviluppo. Precedentemente nota come automazione OLE, l'automazione ĆØ uno standard del settore e una caratteristica del modello COM (Component Object Model).) -TRANSPOSE = MATR.TRASPOSTA ## Restituisce la trasposizione di una matrice -VLOOKUP = CERCA.VERT ## Effettua una ricerca nella prima colonna di una matrice e si sposta attraverso la riga per restituire il valore di una cella - - -## -## Math and trigonometry functions Funzioni matematiche e trigonometriche -## -ABS = ASS ## Restituisce il valore assoluto di un numero. -ACOS = ARCCOS ## Restituisce l'arcocoseno di un numero -ACOSH = ARCCOSH ## Restituisce l'inverso del coseno iperbolico di un numero -ASIN = ARCSEN ## Restituisce l'arcoseno di un numero -ASINH = ARCSENH ## Restituisce l'inverso del seno iperbolico di un numero -ATAN = ARCTAN ## Restituisce l'arcotangente di un numero -ATAN2 = ARCTAN.2 ## Restituisce l'arcotangente delle coordinate x e y specificate -ATANH = ARCTANH ## Restituisce l'inverso della tangente iperbolica di un numero -CEILING = ARROTONDA.ECCESSO ## Arrotonda un numero per eccesso all'intero più vicino o al multiplo più vicino a peso -COMBIN = COMBINAZIONE ## Restituisce il numero di combinazioni possibili per un numero assegnato di elementi -COS = COS ## Restituisce il coseno dell'angolo specificato -COSH = COSH ## Restituisce il coseno iperbolico di un numero -DEGREES = GRADI ## Converte i radianti in gradi -EVEN = PARI ## Arrotonda il valore assoluto di un numero per eccesso al più vicino intero pari -EXP = ESP ## Restituisce il numero e elevato alla potenza di num -FACT = FATTORIALE ## Restituisce il fattoriale di un numero -FACTDOUBLE = FATT.DOPPIO ## Restituisce il fattoriale doppio di un numero -FLOOR = ARROTONDA.DIFETTO ## Arrotonda un numero per difetto al multiplo più vicino a zero -GCD = MCD ## Restituisce il massimo comune divisore -INT = INT ## Arrotonda un numero per difetto al numero intero più vicino -LCM = MCM ## Restituisce il minimo comune multiplo -LN = LN ## Restituisce il logaritmo naturale di un numero -LOG = LOG ## Restituisce il logaritmo di un numero in una specificata base -LOG10 = LOG10 ## Restituisce il logaritmo in base 10 di un numero -MDETERM = MATR.DETERM ## Restituisce il determinante di una matrice -MINVERSE = MATR.INVERSA ## Restituisce l'inverso di una matrice -MMULT = MATR.PRODOTTO ## Restituisce il prodotto di due matrici -MOD = RESTO ## Restituisce il resto della divisione -MROUND = ARROTONDA.MULTIPLO ## Restituisce un numero arrotondato al multiplo desiderato -MULTINOMIAL = MULTINOMIALE ## Restituisce il multinomiale di un insieme di numeri -ODD = DISPARI ## Arrotonda un numero per eccesso al più vicino intero dispari -PI = PI.GRECO ## Restituisce il valore di pi greco -POWER = POTENZA ## Restituisce il risultato di un numero elevato a potenza -PRODUCT = PRODOTTO ## Moltiplica i suoi argomenti -QUOTIENT = QUOZIENTE ## Restituisce la parte intera di una divisione -RADIANS = RADIANTI ## Converte i gradi in radianti -RAND = CASUALE ## Restituisce un numero casuale compreso tra 0 e 1 -RANDBETWEEN = CASUALE.TRA ## Restituisce un numero casuale compreso tra i numeri specificati -ROMAN = ROMANO ## Restituisce il numero come numero romano sotto forma di testo -ROUND = ARROTONDA ## Arrotonda il numero al numero di cifre specificato -ROUNDDOWN = ARROTONDA.PER.DIF ## Arrotonda il valore assoluto di un numero per difetto -ROUNDUP = ARROTONDA.PER.ECC ## Arrotonda il valore assoluto di un numero per eccesso -SERIESSUM = SOMMA.SERIE ## Restituisce la somma di una serie di potenze in base alla formula -SIGN = SEGNO ## Restituisce il segno di un numero -SIN = SEN ## Restituisce il seno di un dato angolo -SINH = SENH ## Restituisce il seno iperbolico di un numero -SQRT = RADQ ## Restituisce una radice quadrata -SQRTPI = RADQ.PI.GRECO ## Restituisce la radice quadrata di un numero (numero * pi greco) -SUBTOTAL = SUBTOTALE ## Restituisce un subtotale in un elenco o in un database -SUM = SOMMA ## Somma i suoi argomenti -SUMIF = SOMMA.SE ## Somma le celle specificate da un dato criterio -SUMIFS = SOMMA.PIƙ.SE ## Somma le celle in un intervallo che soddisfano più criteri -SUMPRODUCT = MATR.SOMMA.PRODOTTO ## Restituisce la somma dei prodotti dei componenti corrispondenti della matrice -SUMSQ = SOMMA.Q ## Restituisce la somma dei quadrati degli argomenti -SUMX2MY2 = SOMMA.DIFF.Q ## Restituisce la somma della differenza dei quadrati dei corrispondenti elementi in due matrici -SUMX2PY2 = SOMMA.SOMMA.Q ## Restituisce la somma della somma dei quadrati dei corrispondenti elementi in due matrici -SUMXMY2 = SOMMA.Q.DIFF ## Restituisce la somma dei quadrati delle differenze dei corrispondenti elementi in due matrici -TAN = TAN ## Restituisce la tangente di un numero -TANH = TANH ## Restituisce la tangente iperbolica di un numero -TRUNC = TRONCA ## Tronca la parte decimale di un numero - - -## -## Statistical functions Funzioni statistiche -## -AVEDEV = MEDIA.DEV ## Restituisce la media delle deviazioni assolute delle coordinate rispetto alla loro media -AVERAGE = MEDIA ## Restituisce la media degli argomenti -AVERAGEA = MEDIA.VALORI ## Restituisce la media degli argomenti, inclusi i numeri, il testo e i valori logici -AVERAGEIF = MEDIA.SE ## Restituisce la media aritmetica di tutte le celle in un intervallo che soddisfano un determinato criterio -AVERAGEIFS = MEDIA.PIƙ.SE ## Restituisce la media aritmetica di tutte le celle che soddisfano più criteri -BETADIST = DISTRIB.BETA ## Restituisce la funzione di distribuzione cumulativa beta -BETAINV = INV.BETA ## Restituisce l'inverso della funzione di distribuzione cumulativa per una distribuzione beta specificata -BINOMDIST = DISTRIB.BINOM ## Restituisce la distribuzione binomiale per il termine individuale -CHIDIST = DISTRIB.CHI ## Restituisce la probabilitĆ  a una coda per la distribuzione del chi quadrato -CHIINV = INV.CHI ## Restituisce l'inverso della probabilitĆ  ad una coda per la distribuzione del chi quadrato -CHITEST = TEST.CHI ## Restituisce il test per l'indipendenza -CONFIDENCE = CONFIDENZA ## Restituisce l'intervallo di confidenza per una popolazione -CORREL = CORRELAZIONE ## Restituisce il coefficiente di correlazione tra due insiemi di dati -COUNT = CONTA.NUMERI ## Conta la quantitĆ  di numeri nell'elenco di argomenti -COUNTA = CONTA.VALORI ## Conta il numero di valori nell'elenco di argomenti -COUNTBLANK = CONTA.VUOTE ## Conta il numero di celle vuote all'interno di un intervallo -COUNTIF = CONTA.SE ## Conta il numero di celle all'interno di un intervallo che soddisfa i criteri specificati -COUNTIFS = CONTA.PIƙ.SE ## Conta il numero di celle in un intervallo che soddisfano più criteri. -COVAR = COVARIANZA ## Calcola la covarianza, la media dei prodotti delle deviazioni accoppiate -CRITBINOM = CRIT.BINOM ## Restituisce il più piccolo valore per il quale la distribuzione cumulativa binomiale risulta maggiore o uguale ad un valore di criterio -DEVSQ = DEV.Q ## Restituisce la somma dei quadrati delle deviazioni -EXPONDIST = DISTRIB.EXP ## Restituisce la distribuzione esponenziale -FDIST = DISTRIB.F ## Restituisce la distribuzione di probabilitĆ  F -FINV = INV.F ## Restituisce l'inverso della distribuzione della probabilitĆ  F -FISHER = FISHER ## Restituisce la trasformazione di Fisher -FISHERINV = INV.FISHER ## Restituisce l'inverso della trasformazione di Fisher -FORECAST = PREVISIONE ## Restituisce i valori lungo una tendenza lineare -FREQUENCY = FREQUENZA ## Restituisce la distribuzione di frequenza come matrice verticale -FTEST = TEST.F ## Restituisce il risultato di un test F -GAMMADIST = DISTRIB.GAMMA ## Restituisce la distribuzione gamma -GAMMAINV = INV.GAMMA ## Restituisce l'inverso della distribuzione cumulativa gamma -GAMMALN = LN.GAMMA ## Restituisce il logaritmo naturale della funzione gamma, G(x) -GEOMEAN = MEDIA.GEOMETRICA ## Restituisce la media geometrica -GROWTH = CRESCITA ## Restituisce i valori lungo una linea di tendenza esponenziale -HARMEAN = MEDIA.ARMONICA ## Restituisce la media armonica -HYPGEOMDIST = DISTRIB.IPERGEOM ## Restituisce la distribuzione ipergeometrica -INTERCEPT = INTERCETTA ## Restituisce l'intercetta della retta di regressione lineare -KURT = CURTOSI ## Restituisce la curtosi di un insieme di dati -LARGE = GRANDE ## Restituisce il k-esimo valore più grande in un insieme di dati -LINEST = REGR.LIN ## Restituisce i parametri di una tendenza lineare -LOGEST = REGR.LOG ## Restituisce i parametri di una linea di tendenza esponenziale -LOGINV = INV.LOGNORM ## Restituisce l'inverso di una distribuzione lognormale -LOGNORMDIST = DISTRIB.LOGNORM ## Restituisce la distribuzione lognormale cumulativa -MAX = MAX ## Restituisce il valore massimo in un elenco di argomenti -MAXA = MAX.VALORI ## Restituisce il valore massimo in un elenco di argomenti, inclusi i numeri, il testo e i valori logici -MEDIAN = MEDIANA ## Restituisce la mediana dei numeri specificati -MIN = MIN ## Restituisce il valore minimo in un elenco di argomenti -MINA = MIN.VALORI ## Restituisce il più piccolo valore in un elenco di argomenti, inclusi i numeri, il testo e i valori logici -MODE = MODA ## Restituisce il valore più comune in un insieme di dati -NEGBINOMDIST = DISTRIB.BINOM.NEG ## Restituisce la distribuzione binomiale negativa -NORMDIST = DISTRIB.NORM ## Restituisce la distribuzione cumulativa normale -NORMINV = INV.NORM ## Restituisce l'inverso della distribuzione cumulativa normale standard -NORMSDIST = DISTRIB.NORM.ST ## Restituisce la distribuzione cumulativa normale standard -NORMSINV = INV.NORM.ST ## Restituisce l'inverso della distribuzione cumulativa normale -PEARSON = PEARSON ## Restituisce il coefficiente del momento di correlazione di Pearson -PERCENTILE = PERCENTILE ## Restituisce il k-esimo dato percentile di valori in un intervallo -PERCENTRANK = PERCENT.RANGO ## Restituisce il rango di un valore in un insieme di dati come percentuale -PERMUT = PERMUTAZIONE ## Restituisce il numero delle permutazioni per un determinato numero di oggetti -POISSON = POISSON ## Restituisce la distribuzione di Poisson -PROB = PROBABILITƀ ## Calcola la probabilitĆ  che dei valori in un intervallo siano compresi tra due limiti -QUARTILE = QUARTILE ## Restituisce il quartile di un insieme di dati -RANK = RANGO ## Restituisce il rango di un numero in un elenco di numeri -RSQ = RQ ## Restituisce la radice quadrata del coefficiente di momento di correlazione di Pearson -SKEW = ASIMMETRIA ## Restituisce il grado di asimmetria di una distribuzione -SLOPE = PENDENZA ## Restituisce la pendenza di una retta di regressione lineare -SMALL = PICCOLO ## Restituisce il k-esimo valore più piccolo in un insieme di dati -STANDARDIZE = NORMALIZZA ## Restituisce un valore normalizzato -STDEV = DEV.ST ## Restituisce una stima della deviazione standard sulla base di un campione -STDEVA = DEV.ST.VALORI ## Restituisce una stima della deviazione standard sulla base di un campione, inclusi i numeri, il testo e i valori logici -STDEVP = DEV.ST.POP ## Calcola la deviazione standard sulla base di un'intera popolazione -STDEVPA = DEV.ST.POP.VALORI ## Calcola la deviazione standard sulla base sull'intera popolazione, inclusi i numeri, il testo e i valori logici -STEYX = ERR.STD.YX ## Restituisce l'errore standard del valore previsto per y per ogni valore x nella regressione -TDIST = DISTRIB.T ## Restituisce la distribuzione t di Student -TINV = INV.T ## Restituisce l'inversa della distribuzione t di Student -TREND = TENDENZA ## Restituisce i valori lungo una linea di tendenza lineare -TRIMMEAN = MEDIA.TRONCATA ## Restituisce la media della parte interna di un insieme di dati -TTEST = TEST.T ## Restituisce la probabilitĆ  associata ad un test t di Student -VAR = VAR ## Stima la varianza sulla base di un campione -VARA = VAR.VALORI ## Stima la varianza sulla base di un campione, inclusi i numeri, il testo e i valori logici -VARP = VAR.POP ## Calcola la varianza sulla base dell'intera popolazione -VARPA = VAR.POP.VALORI ## Calcola la deviazione standard sulla base sull'intera popolazione, inclusi i numeri, il testo e i valori logici -WEIBULL = WEIBULL ## Restituisce la distribuzione di Weibull -ZTEST = TEST.Z ## Restituisce il valore di probabilitĆ  a una coda per un test z - - -## -## Text functions Funzioni di testo -## -ASC = ASC ## Modifica le lettere inglesi o il katakana a doppio byte all'interno di una stringa di caratteri in caratteri a singolo byte -BAHTTEXT = BAHTTESTO ## Converte un numero in testo, utilizzando il formato valuta ß (baht) -CHAR = CODICE.CARATT ## Restituisce il carattere specificato dal numero di codice -CLEAN = LIBERA ## Elimina dal testo tutti i caratteri che non ĆØ possibile stampare -CODE = CODICE ## Restituisce il codice numerico del primo carattere di una stringa di testo -CONCATENATE = CONCATENA ## Unisce diversi elementi di testo in un unico elemento di testo -DOLLAR = VALUTA ## Converte un numero in testo, utilizzando il formato valuta € (euro) -EXACT = IDENTICO ## Verifica se due valori di testo sono uguali -FIND = TROVA ## Rileva un valore di testo all'interno di un altro (distinzione tra maiuscole e minuscole) -FINDB = TROVA.B ## Rileva un valore di testo all'interno di un altro (distinzione tra maiuscole e minuscole) -FIXED = FISSO ## Formatta un numero come testo con un numero fisso di decimali -JIS = ORDINAMENTO.JIS ## Modifica le lettere inglesi o i caratteri katakana a byte singolo all'interno di una stringa di caratteri in caratteri a byte doppio. -LEFT = SINISTRA ## Restituisce il carattere più a sinistra di un valore di testo -LEFTB = SINISTRA.B ## Restituisce il carattere più a sinistra di un valore di testo -LEN = LUNGHEZZA ## Restituisce il numero di caratteri di una stringa di testo -LENB = LUNB ## Restituisce il numero di caratteri di una stringa di testo -LOWER = MINUSC ## Converte il testo in lettere minuscole -MID = MEDIA ## Restituisce un numero specifico di caratteri di una stringa di testo a partire dalla posizione specificata -MIDB = MEDIA.B ## Restituisce un numero specifico di caratteri di una stringa di testo a partire dalla posizione specificata -PHONETIC = FURIGANA ## Estrae i caratteri fonetici (furigana) da una stringa di testo. -PROPER = MAIUSC.INIZ ## Converte in maiuscolo la prima lettera di ogni parola di un valore di testo -REPLACE = RIMPIAZZA ## Sostituisce i caratteri all'interno di un testo -REPLACEB = SOSTITUISCI.B ## Sostituisce i caratteri all'interno di un testo -REPT = RIPETI ## Ripete un testo per un dato numero di volte -RIGHT = DESTRA ## Restituisce il carattere più a destra di un valore di testo -RIGHTB = DESTRA.B ## Restituisce il carattere più a destra di un valore di testo -SEARCH = RICERCA ## Rileva un valore di testo all'interno di un altro (non ĆØ sensibile alle maiuscole e minuscole) -SEARCHB = CERCA.B ## Rileva un valore di testo all'interno di un altro (non ĆØ sensibile alle maiuscole e minuscole) -SUBSTITUTE = SOSTITUISCI ## Sostituisce il nuovo testo al testo contenuto in una stringa -T = T ## Converte gli argomenti in testo -TEXT = TESTO ## Formatta un numero e lo converte in testo -TRIM = ANNULLA.SPAZI ## Elimina gli spazi dal testo -UPPER = MAIUSC ## Converte il testo in lettere maiuscole -VALUE = VALORE ## Converte un argomento di testo in numero diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/config deleted file mode 100644 index 8376022..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = € - - -## -## Excel Error Codes (For future use) - -## -NULL = #LEEG! -DIV0 = #DEEL/0! -VALUE = #WAARDE! -REF = #VERW! -NAME = #NAAM? -NUM = #GETAL! -NA = #N/B diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/functions deleted file mode 100644 index 2518f42..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/nl/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions Automatiseringsfuncties en functies in invoegtoepassingen -## -GETPIVOTDATA = DRAAITABEL.OPHALEN ## Geeft gegevens uit een draaitabelrapport als resultaat - - -## -## Cube functions Kubusfuncties -## -CUBEKPIMEMBER = KUBUSKPILID ## Retourneert de naam, eigenschap en waarde van een KPI (prestatie-indicator) en geeft de naam en de eigenschap in de cel weer. Een KPI is een meetbare waarde, zoals de maandelijkse brutowinst of de omzet per kwartaal per werknemer, die wordt gebruikt om de prestaties van een organisatie te bewaken -CUBEMEMBER = KUBUSLID ## Retourneert een lid of tupel in een kubushiĆ«rarchie. Wordt gebruikt om te controleren of het lid of de tupel in de kubus aanwezig is -CUBEMEMBERPROPERTY = KUBUSLIDEIGENSCHAP ## Retourneert de waarde van een lideigenschap in de kubus. Wordt gebruikt om te controleren of de lidnaam in de kubus bestaat en retourneert de opgegeven eigenschap voor dit lid -CUBERANKEDMEMBER = KUBUSGERANGCHIKTLID ## Retourneert het zoveelste, gerangschikte lid in een set. Wordt gebruikt om een of meer elementen in een set te retourneren, zoals de tien beste verkopers of de tien beste studenten -CUBESET = KUBUSSET ## Definieert een berekende set leden of tupels door een ingestelde expressie naar de kubus op de server te sturen, alwaar de set wordt gemaakt en vervolgens wordt geretourneerd naar Microsoft Office Excel -CUBESETCOUNT = KUBUSSETAANTAL ## Retourneert het aantal onderdelen in een set -CUBEVALUE = KUBUSWAARDE ## Retourneert een samengestelde waarde van een kubus - - -## -## Database functions Databasefuncties -## -DAVERAGE = DBGEMIDDELDE ## Berekent de gemiddelde waarde in geselecteerde databasegegevens -DCOUNT = DBAANTAL ## Telt de cellen met getallen in een database -DCOUNTA = DBAANTALC ## Telt de niet-lege cellen in een database -DGET = DBLEZEN ## Retourneert ƩƩn record dat voldoet aan de opgegeven criteria uit een database -DMAX = DBMAX ## Retourneert de maximumwaarde in de geselecteerde databasegegevens -DMIN = DBMIN ## Retourneert de minimumwaarde in de geselecteerde databasegegevens -DPRODUCT = DBPRODUCT ## Vermenigvuldigt de waarden in een bepaald veld van de records die voldoen aan de criteria in een database -DSTDEV = DBSTDEV ## Maakt een schatting van de standaarddeviatie op basis van een steekproef uit geselecteerde databasegegevens -DSTDEVP = DBSTDEVP ## Berekent de standaarddeviatie op basis van de volledige populatie van geselecteerde databasegegevens -DSUM = DBSOM ## Telt de getallen uit een kolom records in de database op die voldoen aan de criteria -DVAR = DBVAR ## Maakt een schatting van de variantie op basis van een steekproef uit geselecteerde databasegegevens -DVARP = DBVARP ## Berekent de variantie op basis van de volledige populatie van geselecteerde databasegegevens - - -## -## Date and time functions Datum- en tijdfuncties -## -DATE = DATUM ## Geeft als resultaat het seriĆ«le getal van een opgegeven datum -DATEVALUE = DATUMWAARDE ## Converteert een datum in de vorm van tekst naar een serieel getal -DAY = DAG ## Converteert een serieel getal naar een dag van de maand -DAYS360 = DAGEN360 ## Berekent het aantal dagen tussen twee datums op basis van een jaar met 360 dagen -EDATE = ZELFDE.DAG ## Geeft als resultaat het seriĆ«le getal van een datum die het opgegeven aantal maanden voor of na de begindatum ligt -EOMONTH = LAATSTE.DAG ## Geeft als resultaat het seriĆ«le getal van de laatste dag van de maand voor of na het opgegeven aantal maanden -HOUR = UUR ## Converteert een serieel getal naar uren -MINUTE = MINUUT ## Converteert een serieel naar getal minuten -MONTH = MAAND ## Converteert een serieel getal naar een maand -NETWORKDAYS = NETTO.WERKDAGEN ## Geeft als resultaat het aantal hele werkdagen tussen twee datums -NOW = NU ## Geeft als resultaat het seriĆ«le getal van de huidige datum en tijd -SECOND = SECONDE ## Converteert een serieel getal naar seconden -TIME = TIJD ## Geeft als resultaat het seriĆ«le getal van een bepaald tijdstip -TIMEVALUE = TIJDWAARDE ## Converteert de tijd in de vorm van tekst naar een serieel getal -TODAY = VANDAAG ## Geeft als resultaat het seriĆ«le getal van de huidige datum -WEEKDAY = WEEKDAG ## Converteert een serieel getal naar een weekdag -WEEKNUM = WEEKNUMMER ## Converteert een serieel getal naar een weeknummer -WORKDAY = WERKDAG ## Geeft als resultaat het seriĆ«le getal van de datum voor of na een bepaald aantal werkdagen -YEAR = JAAR ## Converteert een serieel getal naar een jaar -YEARFRAC = JAAR.DEEL ## Geeft als resultaat het gedeelte van het jaar, uitgedrukt in het aantal hele dagen tussen begindatum en einddatum - - -## -## Engineering functions Technische functies -## -BESSELI = BESSEL.Y ## Geeft als resultaat de gewijzigde Bessel-functie In(x) -BESSELJ = BESSEL.J ## Geeft als resultaat de Bessel-functie Jn(x) -BESSELK = BESSEL.K ## Geeft als resultaat de gewijzigde Bessel-functie Kn(x) -BESSELY = BESSEL.Y ## Geeft als resultaat de gewijzigde Bessel-functie Yn(x) -BIN2DEC = BIN.N.DEC ## Converteert een binair getal naar een decimaal getal -BIN2HEX = BIN.N.HEX ## Converteert een binair getal naar een hexadecimaal getal -BIN2OCT = BIN.N.OCT ## Converteert een binair getal naar een octaal getal -COMPLEX = COMPLEX ## Converteert reĆ«le en imaginaire coĆ«fficiĆ«nten naar een complex getal -CONVERT = CONVERTEREN ## Converteert een getal in de ene maateenheid naar een getal in een andere maateenheid -DEC2BIN = DEC.N.BIN ## Converteert een decimaal getal naar een binair getal -DEC2HEX = DEC.N.HEX ## Converteert een decimaal getal naar een hexadecimaal getal -DEC2OCT = DEC.N.OCT ## Converteert een decimaal getal naar een octaal getal -DELTA = DELTA ## Test of twee waarden gelijk zijn -ERF = FOUTFUNCTIE ## Geeft als resultaat de foutfunctie -ERFC = FOUT.COMPLEMENT ## Geeft als resultaat de complementaire foutfunctie -GESTEP = GROTER.DAN ## Test of een getal groter is dan de drempelwaarde -HEX2BIN = HEX.N.BIN ## Converteert een hexadecimaal getal naar een binair getal -HEX2DEC = HEX.N.DEC ## Converteert een hexadecimaal getal naar een decimaal getal -HEX2OCT = HEX.N.OCT ## Converteert een hexadecimaal getal naar een octaal getal -IMABS = C.ABS ## Geeft als resultaat de absolute waarde (modulus) van een complex getal -IMAGINARY = C.IM.DEEL ## Geeft als resultaat de imaginaire coĆ«fficiĆ«nt van een complex getal -IMARGUMENT = C.ARGUMENT ## Geeft als resultaat het argument thĆØta, een hoek uitgedrukt in radialen -IMCONJUGATE = C.TOEGEVOEGD ## Geeft als resultaat het complexe toegevoegde getal van een complex getal -IMCOS = C.COS ## Geeft als resultaat de cosinus van een complex getal -IMDIV = C.QUOTIENT ## Geeft als resultaat het quotiĆ«nt van twee complexe getallen -IMEXP = C.EXP ## Geeft als resultaat de exponent van een complex getal -IMLN = C.LN ## Geeft als resultaat de natuurlijke logaritme van een complex getal -IMLOG10 = C.LOG10 ## Geeft als resultaat de logaritme met grondtal 10 van een complex getal -IMLOG2 = C.LOG2 ## Geeft als resultaat de logaritme met grondtal 2 van een complex getal -IMPOWER = C.MACHT ## Geeft als resultaat een complex getal dat is verheven tot de macht van een geheel getal -IMPRODUCT = C.PRODUCT ## Geeft als resultaat het product van complexe getallen -IMREAL = C.REEEL.DEEL ## Geeft als resultaat de reĆ«le coĆ«fficiĆ«nt van een complex getal -IMSIN = C.SIN ## Geeft als resultaat de sinus van een complex getal -IMSQRT = C.WORTEL ## Geeft als resultaat de vierkantswortel van een complex getal -IMSUB = C.VERSCHIL ## Geeft als resultaat het verschil tussen twee complexe getallen -IMSUM = C.SOM ## Geeft als resultaat de som van complexe getallen -OCT2BIN = OCT.N.BIN ## Converteert een octaal getal naar een binair getal -OCT2DEC = OCT.N.DEC ## Converteert een octaal getal naar een decimaal getal -OCT2HEX = OCT.N.HEX ## Converteert een octaal getal naar een hexadecimaal getal - - -## -## Financial functions FinanciĆ«le functies -## -ACCRINT = SAMENG.RENTE ## Berekent de opgelopen rente voor een waardepapier waarvan de rente periodiek wordt uitgekeerd -ACCRINTM = SAMENG.RENTE.V ## Berekent de opgelopen rente voor een waardepapier waarvan de rente op de vervaldatum wordt uitgekeerd -AMORDEGRC = AMORDEGRC ## Geeft als resultaat de afschrijving voor elke boekingsperiode door een afschrijvingscoĆ«fficiĆ«nt toe te passen -AMORLINC = AMORLINC ## Berekent de afschrijving voor elke boekingsperiode -COUPDAYBS = COUP.DAGEN.BB ## Berekent het aantal dagen vanaf het begin van de coupontermijn tot de stortingsdatum -COUPDAYS = COUP.DAGEN ## Geeft als resultaat het aantal dagen in de coupontermijn waarin de stortingsdatum valt -COUPDAYSNC = COUP.DAGEN.VV ## Geeft als resultaat het aantal dagen vanaf de stortingsdatum tot de volgende couponvervaldatum -COUPNCD = COUP.DATUM.NB ## Geeft als resultaat de volgende coupondatum na de stortingsdatum -COUPNUM = COUP.AANTAL ## Geeft als resultaat het aantal coupons dat nog moet worden uitbetaald tussen de stortingsdatum en de vervaldatum -COUPPCD = COUP.DATUM.VB ## Geeft als resultaat de vorige couponvervaldatum vóór de stortingsdatum -CUMIPMT = CUM.RENTE ## Geeft als resultaat de cumulatieve rente die tussen twee termijnen is uitgekeerd -CUMPRINC = CUM.HOOFDSOM ## Geeft als resultaat de cumulatieve hoofdsom van een lening die tussen twee termijnen is terugbetaald -DB = DB ## Geeft als resultaat de afschrijving van activa voor een bepaalde periode met behulp van de 'fixed declining balance'-methode -DDB = DDB ## Geeft als resultaat de afschrijving van activa over een bepaalde termijn met behulp van de 'double declining balance'-methode of een andere methode die u opgeeft -DISC = DISCONTO ## Geeft als resultaat het discontopercentage voor een waardepapier -DOLLARDE = EURO.DE ## Converteert een prijs in euro's, uitgedrukt in een breuk, naar een prijs in euro's, uitgedrukt in een decimaal getal -DOLLARFR = EURO.BR ## Converteert een prijs in euro's, uitgedrukt in een decimaal getal, naar een prijs in euro's, uitgedrukt in een breuk -DURATION = DUUR ## Geeft als resultaat de gewogen gemiddelde looptijd voor een waardepapier met periodieke rentebetalingen -EFFECT = EFFECT.RENTE ## Geeft als resultaat het effectieve jaarlijkse rentepercentage -FV = TW ## Geeft als resultaat de toekomstige waarde van een investering -FVSCHEDULE = TOEK.WAARDE2 ## Geeft als resultaat de toekomstige waarde van een bepaalde hoofdsom na het toepassen van een reeks samengestelde rentepercentages -INTRATE = RENTEPERCENTAGE ## Geeft als resultaat het rentepercentage voor een volgestort waardepapier -IPMT = IBET ## Geeft als resultaat de te betalen rente voor een investering over een bepaalde termijn -IRR = IR ## Geeft als resultaat de interne rentabiliteit voor een reeks cashflows -ISPMT = ISBET ## Geeft als resultaat de rente die is betaald tijdens een bepaalde termijn van een investering -MDURATION = AANG.DUUR ## Geeft als resultaat de aangepaste Macauley-looptijd voor een waardepapier, aangenomen dat de nominale waarde € 100 bedraagt -MIRR = GIR ## Geeft als resultaat de interne rentabiliteit voor een serie cashflows, waarbij voor betalingen een ander rentepercentage geldt dan voor inkomsten -NOMINAL = NOMINALE.RENTE ## Geeft als resultaat het nominale jaarlijkse rentepercentage -NPER = NPER ## Geeft als resultaat het aantal termijnen van een investering -NPV = NHW ## Geeft als resultaat de netto huidige waarde van een investering op basis van een reeks periodieke cashflows en een discontopercentage -ODDFPRICE = AFW.ET.PRIJS ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier met een afwijkende eerste termijn -ODDFYIELD = AFW.ET.REND ## Geeft als resultaat het rendement voor een waardepapier met een afwijkende eerste termijn -ODDLPRICE = AFW.LT.PRIJS ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier met een afwijkende laatste termijn -ODDLYIELD = AFW.LT.REND ## Geeft als resultaat het rendement voor een waardepapier met een afwijkende laatste termijn -PMT = BET ## Geeft als resultaat de periodieke betaling voor een annuĆÆteit -PPMT = PBET ## Geeft als resultaat de afbetaling op de hoofdsom voor een bepaalde termijn -PRICE = PRIJS.NOM ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier waarvan de rente periodiek wordt uitgekeerd -PRICEDISC = PRIJS.DISCONTO ## Geeft als resultaat de prijs per € 100 nominale waarde voor een verdisconteerd waardepapier -PRICEMAT = PRIJS.VERVALDAG ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier waarvan de rente wordt uitgekeerd op de vervaldatum -PV = HW ## Geeft als resultaat de huidige waarde van een investering -RATE = RENTE ## Geeft als resultaat het periodieke rentepercentage voor een annuĆÆteit -RECEIVED = OPBRENGST ## Geeft als resultaat het bedrag dat op de vervaldatum wordt uitgekeerd voor een volgestort waardepapier -SLN = LIN.AFSCHR ## Geeft als resultaat de lineaire afschrijving van activa over ƩƩn termijn -SYD = SYD ## Geeft als resultaat de afschrijving van activa over een bepaalde termijn met behulp van de 'Sum-Of-Years-Digits'-methode -TBILLEQ = SCHATK.OBL ## Geeft als resultaat het rendement op schatkistpapier, dat op dezelfde manier wordt berekend als het rendement op obligaties -TBILLPRICE = SCHATK.PRIJS ## Bepaalt de prijs per € 100 nominale waarde voor schatkistpapier -TBILLYIELD = SCHATK.REND ## Berekent het rendement voor schatkistpapier -VDB = VDB ## Geeft als resultaat de afschrijving van activa over een gehele of gedeeltelijke termijn met behulp van de 'declining balance'-methode -XIRR = IR.SCHEMA ## Berekent de interne rentabiliteit voor een betalingsschema van cashflows -XNPV = NHW2 ## Berekent de huidige nettowaarde voor een betalingsschema van cashflows -YIELD = RENDEMENT ## Geeft als resultaat het rendement voor een waardepapier waarvan de rente periodiek wordt uitgekeerd -YIELDDISC = REND.DISCONTO ## Geeft als resultaat het jaarlijkse rendement voor een verdisconteerd waardepapier, bijvoorbeeld schatkistpapier -YIELDMAT = REND.VERVAL ## Geeft als resultaat het jaarlijkse rendement voor een waardepapier waarvan de rente wordt uitgekeerd op de vervaldatum - - -## -## Information functions Informatiefuncties -## -CELL = CEL ## Geeft als resultaat informatie over de opmaak, locatie of inhoud van een cel -ERROR.TYPE = TYPE.FOUT ## Geeft als resultaat een getal dat overeenkomt met een van de foutwaarden van Microsoft Excel -INFO = INFO ## Geeft als resultaat informatie over de huidige besturingsomgeving -ISBLANK = ISLEEG ## Geeft als resultaat WAAR als de waarde leeg is -ISERR = ISFOUT2 ## Geeft als resultaat WAAR als de waarde een foutwaarde is, met uitzondering van #N/B -ISERROR = ISFOUT ## Geeft als resultaat WAAR als de waarde een foutwaarde is -ISEVEN = IS.EVEN ## Geeft als resultaat WAAR als het getal even is -ISLOGICAL = ISLOGISCH ## Geeft als resultaat WAAR als de waarde een logische waarde is -ISNA = ISNB ## Geeft als resultaat WAAR als de waarde de foutwaarde #N/B is -ISNONTEXT = ISGEENTEKST ## Geeft als resultaat WAAR als de waarde geen tekst is -ISNUMBER = ISGETAL ## Geeft als resultaat WAAR als de waarde een getal is -ISODD = IS.ONEVEN ## Geeft als resultaat WAAR als het getal oneven is -ISREF = ISVERWIJZING ## Geeft als resultaat WAAR als de waarde een verwijzing is -ISTEXT = ISTEKST ## Geeft als resultaat WAAR als de waarde tekst is -N = N ## Geeft als resultaat een waarde die is geconverteerd naar een getal -NA = NB ## Geeft als resultaat de foutwaarde #N/B -TYPE = TYPE ## Geeft als resultaat een getal dat het gegevenstype van een waarde aangeeft - - -## -## Logical functions Logische functies -## -AND = EN ## Geeft als resultaat WAAR als alle argumenten WAAR zijn -FALSE = ONWAAR ## Geeft als resultaat de logische waarde ONWAAR -IF = ALS ## Geeft een logische test aan -IFERROR = ALS.FOUT ## Retourneert een waarde die u opgeeft als een formule een fout oplevert, anders wordt het resultaat van de formule geretourneerd -NOT = NIET ## Keert de logische waarde van het argument om -OR = OF ## Geeft als resultaat WAAR als minimaal een van de argumenten WAAR is -TRUE = WAAR ## Geeft als resultaat de logische waarde WAAR - - -## -## Lookup and reference functions Zoek- en verwijzingsfuncties -## -ADDRESS = ADRES ## Geeft als resultaat een verwijzing, in de vorm van tekst, naar ƩƩn bepaalde cel in een werkblad -AREAS = BEREIKEN ## Geeft als resultaat het aantal bereiken in een verwijzing -CHOOSE = KIEZEN ## Kiest een waarde uit een lijst met waarden -COLUMN = KOLOM ## Geeft als resultaat het kolomnummer van een verwijzing -COLUMNS = KOLOMMEN ## Geeft als resultaat het aantal kolommen in een verwijzing -HLOOKUP = HORIZ.ZOEKEN ## Zoekt in de bovenste rij van een matrix naar een bepaalde waarde en geeft als resultaat de gevonden waarde in de opgegeven cel -HYPERLINK = HYPERLINK ## Maakt een snelkoppeling of een sprong waarmee een document wordt geopend dat is opgeslagen op een netwerkserver, een intranet of op internet -INDEX = INDEX ## Kiest met een index een waarde uit een verwijzing of een matrix -INDIRECT = INDIRECT ## Geeft als resultaat een verwijzing die wordt aangegeven met een tekstwaarde -LOOKUP = ZOEKEN ## Zoekt naar bepaalde waarden in een vector of een matrix -MATCH = VERGELIJKEN ## Zoekt naar bepaalde waarden in een verwijzing of een matrix -OFFSET = VERSCHUIVING ## Geeft als resultaat een nieuwe verwijzing die is verschoven ten opzichte van een bepaalde verwijzing -ROW = RIJ ## Geeft als resultaat het rijnummer van een verwijzing -ROWS = RIJEN ## Geeft als resultaat het aantal rijen in een verwijzing -RTD = RTG ## Haalt realtimegegevens op uit een programma dat COM-automatisering (automatisering: een methode waarmee de ene toepassing objecten van een andere toepassing of ontwikkelprogramma kan besturen. Automatisering werd vroeger OLE-automatisering genoemd. Automatisering is een industrienorm die deel uitmaakt van het Component Object Model (COM).) ondersteunt -TRANSPOSE = TRANSPONEREN ## Geeft als resultaat de getransponeerde van een matrix -VLOOKUP = VERT.ZOEKEN ## Zoekt in de meest linkse kolom van een matrix naar een bepaalde waarde en geeft als resultaat de waarde in de opgegeven cel - - -## -## Math and trigonometry functions Wiskundige en trigonometrische functies -## -ABS = ABS ## Geeft als resultaat de absolute waarde van een getal -ACOS = BOOGCOS ## Geeft als resultaat de boogcosinus van een getal -ACOSH = BOOGCOSH ## Geeft als resultaat de inverse cosinus hyperbolicus van een getal -ASIN = BOOGSIN ## Geeft als resultaat de boogsinus van een getal -ASINH = BOOGSINH ## Geeft als resultaat de inverse sinus hyperbolicus van een getal -ATAN = BOOGTAN ## Geeft als resultaat de boogtangens van een getal -ATAN2 = BOOGTAN2 ## Geeft als resultaat de boogtangens van de x- en y-coƶrdinaten -ATANH = BOOGTANH ## Geeft als resultaat de inverse tangens hyperbolicus van een getal -CEILING = AFRONDEN.BOVEN ## Rondt de absolute waarde van een getal naar boven af op het dichtstbijzijnde gehele getal of het dichtstbijzijnde significante veelvoud -COMBIN = COMBINATIES ## Geeft als resultaat het aantal combinaties voor een bepaald aantal objecten -COS = COS ## Geeft als resultaat de cosinus van een getal -COSH = COSH ## Geeft als resultaat de cosinus hyperbolicus van een getal -DEGREES = GRADEN ## Converteert radialen naar graden -EVEN = EVEN ## Rondt het getal af op het dichtstbijzijnde gehele even getal -EXP = EXP ## Verheft e tot de macht van een bepaald getal -FACT = FACULTEIT ## Geeft als resultaat de faculteit van een getal -FACTDOUBLE = DUBBELE.FACULTEIT ## Geeft als resultaat de dubbele faculteit van een getal -FLOOR = AFRONDEN.BENEDEN ## Rondt de absolute waarde van een getal naar beneden af -GCD = GGD ## Geeft als resultaat de grootste gemene deler -INT = INTEGER ## Rondt een getal naar beneden af op het dichtstbijzijnde gehele getal -LCM = KGV ## Geeft als resultaat het kleinste gemene veelvoud -LN = LN ## Geeft als resultaat de natuurlijke logaritme van een getal -LOG = LOG ## Geeft als resultaat de logaritme met het opgegeven grondtal van een getal -LOG10 = LOG10 ## Geeft als resultaat de logaritme met grondtal 10 van een getal -MDETERM = DETERMINANTMAT ## Geeft als resultaat de determinant van een matrix -MINVERSE = INVERSEMAT ## Geeft als resultaat de inverse van een matrix -MMULT = PRODUCTMAT ## Geeft als resultaat het product van twee matrices -MOD = REST ## Geeft als resultaat het restgetal van een deling -MROUND = AFRONDEN.N.VEELVOUD ## Geeft als resultaat een getal afgerond op het gewenste veelvoud -MULTINOMIAL = MULTINOMIAAL ## Geeft als resultaat de multinomiaalcoĆ«fficiĆ«nt van een reeks getallen -ODD = ONEVEN ## Rondt de absolute waarde van het getal naar boven af op het dichtstbijzijnde gehele oneven getal -PI = PI ## Geeft als resultaat de waarde van pi -POWER = MACHT ## Verheft een getal tot een macht -PRODUCT = PRODUCT ## Vermenigvuldigt de argumenten met elkaar -QUOTIENT = QUOTIENT ## Geeft als resultaat de uitkomst van een deling als geheel getal -RADIANS = RADIALEN ## Converteert graden naar radialen -RAND = ASELECT ## Geeft als resultaat een willekeurig getal tussen 0 en 1 -RANDBETWEEN = ASELECTTUSSEN ## Geeft een willekeurig getal tussen de getallen die u hebt opgegeven -ROMAN = ROMEINS ## Converteert een Arabisch getal naar een Romeins getal en geeft het resultaat weer in de vorm van tekst -ROUND = AFRONDEN ## Rondt een getal af op het opgegeven aantal decimalen -ROUNDDOWN = AFRONDEN.NAAR.BENEDEN ## Rondt de absolute waarde van een getal naar beneden af -ROUNDUP = AFRONDEN.NAAR.BOVEN ## Rondt de absolute waarde van een getal naar boven af -SERIESSUM = SOM.MACHTREEKS ## Geeft als resultaat de som van een machtreeks die is gebaseerd op de formule -SIGN = POS.NEG ## Geeft als resultaat het teken van een getal -SIN = SIN ## Geeft als resultaat de sinus van de opgegeven hoek -SINH = SINH ## Geeft als resultaat de sinus hyperbolicus van een getal -SQRT = WORTEL ## Geeft als resultaat de positieve vierkantswortel van een getal -SQRTPI = WORTEL.PI ## Geeft als resultaat de vierkantswortel van (getal * pi) -SUBTOTAL = SUBTOTAAL ## Geeft als resultaat een subtotaal voor een bereik -SUM = SOM ## Telt de argumenten op -SUMIF = SOM.ALS ## Telt de getallen bij elkaar op die voldoen aan een bepaald criterium -SUMIFS = SOMMEN.ALS ## Telt de cellen in een bereik op die aan meerdere criteria voldoen -SUMPRODUCT = SOMPRODUCT ## Geeft als resultaat de som van de producten van de corresponderende matrixelementen -SUMSQ = KWADRATENSOM ## Geeft als resultaat de som van de kwadraten van de argumenten -SUMX2MY2 = SOM.X2MINY2 ## Geeft als resultaat de som van het verschil tussen de kwadraten van corresponderende waarden in twee matrices -SUMX2PY2 = SOM.X2PLUSY2 ## Geeft als resultaat de som van de kwadratensom van corresponderende waarden in twee matrices -SUMXMY2 = SOM.XMINY.2 ## Geeft als resultaat de som van de kwadraten van de verschillen tussen de corresponderende waarden in twee matrices -TAN = TAN ## Geeft als resultaat de tangens van een getal -TANH = TANH ## Geeft als resultaat de tangens hyperbolicus van een getal -TRUNC = GEHEEL ## Kapt een getal af tot een geheel getal - - -## -## Statistical functions Statistische functies -## -AVEDEV = GEM.DEVIATIE ## Geeft als resultaat het gemiddelde van de absolute deviaties van gegevenspunten ten opzichte van hun gemiddelde waarde -AVERAGE = GEMIDDELDE ## Geeft als resultaat het gemiddelde van de argumenten -AVERAGEA = GEMIDDELDEA ## Geeft als resultaat het gemiddelde van de argumenten, inclusief getallen, tekst en logische waarden -AVERAGEIF = GEMIDDELDE.ALS ## Geeft het gemiddelde (rekenkundig gemiddelde) als resultaat van alle cellen in een bereik die voldoen aan de opgegeven criteria -AVERAGEIFS = GEMIDDELDEN.ALS ## Geeft het gemiddelde (rekenkundig gemiddelde) als resultaat van alle cellen die aan meerdere criteria voldoen -BETADIST = BETA.VERD ## Geeft als resultaat de cumulatieve bĆØta-verdelingsfunctie -BETAINV = BETA.INV ## Geeft als resultaat de inverse van de cumulatieve verdelingsfunctie voor een gegeven bĆØta-verdeling -BINOMDIST = BINOMIALE.VERD ## Geeft als resultaat de binomiale verdeling -CHIDIST = CHI.KWADRAAT ## Geeft als resultaat de eenzijdige kans van de chi-kwadraatverdeling -CHIINV = CHI.KWADRAAT.INV ## Geeft als resultaat de inverse van een eenzijdige kans van de chi-kwadraatverdeling -CHITEST = CHI.TOETS ## Geeft als resultaat de onafhankelijkheidstoets -CONFIDENCE = BETROUWBAARHEID ## Geeft als resultaat het betrouwbaarheidsinterval van een gemiddelde waarde voor de elementen van een populatie -CORREL = CORRELATIE ## Geeft als resultaat de correlatiecoĆ«fficiĆ«nt van twee gegevensverzamelingen -COUNT = AANTAL ## Telt het aantal getallen in de argumentenlijst -COUNTA = AANTALARG ## Telt het aantal waarden in de argumentenlijst -COUNTBLANK = AANTAL.LEGE.CELLEN ## Telt het aantal lege cellen in een bereik -COUNTIF = AANTAL.ALS ## Telt in een bereik het aantal cellen die voldoen aan een bepaald criterium -COUNTIFS = AANTALLEN.ALS ## Telt in een bereik het aantal cellen die voldoen aan meerdere criteria -COVAR = COVARIANTIE ## Geeft als resultaat de covariantie, het gemiddelde van de producten van de gepaarde deviaties -CRITBINOM = CRIT.BINOM ## Geeft als resultaat de kleinste waarde waarvoor de binomiale verdeling kleiner is dan of gelijk is aan het criterium -DEVSQ = DEV.KWAD ## Geeft als resultaat de som van de deviaties in het kwadraat -EXPONDIST = EXPON.VERD ## Geeft als resultaat de exponentiĆ«le verdeling -FDIST = F.VERDELING ## Geeft als resultaat de F-verdeling -FINV = F.INVERSE ## Geeft als resultaat de inverse van de F-verdeling -FISHER = FISHER ## Geeft als resultaat de Fisher-transformatie -FISHERINV = FISHER.INV ## Geeft als resultaat de inverse van de Fisher-transformatie -FORECAST = VOORSPELLEN ## Geeft als resultaat een waarde op basis van een lineaire trend -FREQUENCY = FREQUENTIE ## Geeft als resultaat een frequentieverdeling in de vorm van een verticale matrix -FTEST = F.TOETS ## Geeft als resultaat een F-toets -GAMMADIST = GAMMA.VERD ## Geeft als resultaat de gamma-verdeling -GAMMAINV = GAMMA.INV ## Geeft als resultaat de inverse van de cumulatieve gamma-verdeling -GAMMALN = GAMMA.LN ## Geeft als resultaat de natuurlijke logaritme van de gamma-functie, G(x) -GEOMEAN = MEETK.GEM ## Geeft als resultaat het meetkundige gemiddelde -GROWTH = GROEI ## Geeft als resultaat de waarden voor een exponentiĆ«le trend -HARMEAN = HARM.GEM ## Geeft als resultaat het harmonische gemiddelde -HYPGEOMDIST = HYPERGEO.VERD ## Geeft als resultaat de hypergeometrische verdeling -INTERCEPT = SNIJPUNT ## Geeft als resultaat het snijpunt van de lineaire regressielijn met de y-as -KURT = KURTOSIS ## Geeft als resultaat de kurtosis van een gegevensverzameling -LARGE = GROOTSTE ## Geeft als resultaat de op k-1 na grootste waarde in een gegevensverzameling -LINEST = LIJNSCH ## Geeft als resultaat de parameters van een lineaire trend -LOGEST = LOGSCH ## Geeft als resultaat de parameters van een exponentiĆ«le trend -LOGINV = LOG.NORM.INV ## Geeft als resultaat de inverse van de logaritmische normale verdeling -LOGNORMDIST = LOG.NORM.VERD ## Geeft als resultaat de cumulatieve logaritmische normale verdeling -MAX = MAX ## Geeft als resultaat de maximumwaarde in een lijst met argumenten -MAXA = MAXA ## Geeft als resultaat de maximumwaarde in een lijst met argumenten, inclusief getallen, tekst en logische waarden -MEDIAN = MEDIAAN ## Geeft als resultaat de mediaan van de opgegeven getallen -MIN = MIN ## Geeft als resultaat de minimumwaarde in een lijst met argumenten -MINA = MINA ## Geeft als resultaat de minimumwaarde in een lijst met argumenten, inclusief getallen, tekst en logische waarden -MODE = MODUS ## Geeft als resultaat de meest voorkomende waarde in een gegevensverzameling -NEGBINOMDIST = NEG.BINOM.VERD ## Geeft als resultaat de negatieve binomiaalverdeling -NORMDIST = NORM.VERD ## Geeft als resultaat de cumulatieve normale verdeling -NORMINV = NORM.INV ## Geeft als resultaat de inverse van de cumulatieve standaardnormale verdeling -NORMSDIST = STAND.NORM.VERD ## Geeft als resultaat de cumulatieve standaardnormale verdeling -NORMSINV = STAND.NORM.INV ## Geeft als resultaat de inverse van de cumulatieve normale verdeling -PEARSON = PEARSON ## Geeft als resultaat de correlatiecoĆ«fficiĆ«nt van Pearson -PERCENTILE = PERCENTIEL ## Geeft als resultaat het k-de percentiel van waarden in een bereik -PERCENTRANK = PERCENT.RANG ## Geeft als resultaat de positie, in procenten uitgedrukt, van een waarde in de rangorde van een gegevensverzameling -PERMUT = PERMUTATIES ## Geeft als resultaat het aantal permutaties voor een gegeven aantal objecten -POISSON = POISSON ## Geeft als resultaat de Poisson-verdeling -PROB = KANS ## Geeft als resultaat de kans dat waarden zich tussen twee grenzen bevinden -QUARTILE = KWARTIEL ## Geeft als resultaat het kwartiel van een gegevensverzameling -RANK = RANG ## Geeft als resultaat het rangnummer van een getal in een lijst getallen -RSQ = R.KWADRAAT ## Geeft als resultaat het kwadraat van de Pearson-correlatiecoĆ«fficiĆ«nt -SKEW = SCHEEFHEID ## Geeft als resultaat de mate van asymmetrie van een verdeling -SLOPE = RICHTING ## Geeft als resultaat de richtingscoĆ«fficiĆ«nt van een lineaire regressielijn -SMALL = KLEINSTE ## Geeft als resultaat de op k-1 na kleinste waarde in een gegevensverzameling -STANDARDIZE = NORMALISEREN ## Geeft als resultaat een genormaliseerde waarde -STDEV = STDEV ## Maakt een schatting van de standaarddeviatie op basis van een steekproef -STDEVA = STDEVA ## Maakt een schatting van de standaarddeviatie op basis van een steekproef, inclusief getallen, tekst en logische waarden -STDEVP = STDEVP ## Berekent de standaarddeviatie op basis van de volledige populatie -STDEVPA = STDEVPA ## Berekent de standaarddeviatie op basis van de volledige populatie, inclusief getallen, tekst en logische waarden -STEYX = STAND.FOUT.YX ## Geeft als resultaat de standaardfout in de voorspelde y-waarde voor elke x in een regressie -TDIST = T.VERD ## Geeft als resultaat de Student T-verdeling -TINV = T.INV ## Geeft als resultaat de inverse van de Student T-verdeling -TREND = TREND ## Geeft als resultaat de waarden voor een lineaire trend -TRIMMEAN = GETRIMD.GEM ## Geeft als resultaat het gemiddelde van waarden in een gegevensverzameling -TTEST = T.TOETS ## Geeft als resultaat de kans met behulp van de Student T-toets -VAR = VAR ## Maakt een schatting van de variantie op basis van een steekproef -VARA = VARA ## Maakt een schatting van de variantie op basis van een steekproef, inclusief getallen, tekst en logische waarden -VARP = VARP ## Berekent de variantie op basis van de volledige populatie -VARPA = VARPA ## Berekent de standaarddeviatie op basis van de volledige populatie, inclusief getallen, tekst en logische waarden -WEIBULL = WEIBULL ## Geeft als resultaat de Weibull-verdeling -ZTEST = Z.TOETS ## Geeft als resultaat de eenzijdige kanswaarde van een Z-toets - - -## -## Text functions Tekstfuncties -## -ASC = ASC ## Wijzigt Nederlandse letters of katakanatekens over de volle breedte (dubbel-bytetekens) binnen een tekenreeks in tekens over de halve breedte (enkel-bytetekens) -BAHTTEXT = BAHT.TEKST ## Converteert een getal naar tekst met de valutanotatie ß (baht) -CHAR = TEKEN ## Geeft als resultaat het teken dat hoort bij de opgegeven code -CLEAN = WISSEN.CONTROL ## Verwijdert alle niet-afdrukbare tekens uit een tekst -CODE = CODE ## Geeft als resultaat de numerieke code voor het eerste teken in een tekenreeks -CONCATENATE = TEKST.SAMENVOEGEN ## Voegt verschillende tekstfragmenten samen tot ƩƩn tekstfragment -DOLLAR = EURO ## Converteert een getal naar tekst met de valutanotatie € (euro) -EXACT = GELIJK ## Controleert of twee tekenreeksen identiek zijn -FIND = VIND.ALLES ## Zoekt een bepaalde tekenreeks in een tekst (waarbij onderscheid wordt gemaakt tussen hoofdletters en kleine letters) -FINDB = VIND.ALLES.B ## Zoekt een bepaalde tekenreeks in een tekst (waarbij onderscheid wordt gemaakt tussen hoofdletters en kleine letters) -FIXED = VAST ## Maakt een getal als tekst met een vast aantal decimalen op -JIS = JIS ## Wijzigt Nederlandse letters of katakanatekens over de halve breedte (enkel-bytetekens) binnen een tekenreeks in tekens over de volle breedte (dubbel-bytetekens) -LEFT = LINKS ## Geeft als resultaat de meest linkse tekens in een tekenreeks -LEFTB = LINKSB ## Geeft als resultaat de meest linkse tekens in een tekenreeks -LEN = LENGTE ## Geeft als resultaat het aantal tekens in een tekenreeks -LENB = LENGTEB ## Geeft als resultaat het aantal tekens in een tekenreeks -LOWER = KLEINE.LETTERS ## Zet tekst om in kleine letters -MID = MIDDEN ## Geeft als resultaat een bepaald aantal tekens van een tekenreeks vanaf de positie die u opgeeft -MIDB = DEELB ## Geeft als resultaat een bepaald aantal tekens van een tekenreeks vanaf de positie die u opgeeft -PHONETIC = FONETISCH ## Haalt de fonetische tekens (furigana) uit een tekenreeks op -PROPER = BEGINLETTERS ## Zet de eerste letter van elk woord in een tekst om in een hoofdletter -REPLACE = VERVANG ## Vervangt tekens binnen een tekst -REPLACEB = VERVANGENB ## Vervangt tekens binnen een tekst -REPT = HERHALING ## Herhaalt een tekst een aantal malen -RIGHT = RECHTS ## Geeft als resultaat de meest rechtse tekens in een tekenreeks -RIGHTB = RECHTSB ## Geeft als resultaat de meest rechtse tekens in een tekenreeks -SEARCH = VIND.SPEC ## Zoekt een bepaalde tekenreeks in een tekst (waarbij geen onderscheid wordt gemaakt tussen hoofdletters en kleine letters) -SEARCHB = VIND.SPEC.B ## Zoekt een bepaalde tekenreeks in een tekst (waarbij geen onderscheid wordt gemaakt tussen hoofdletters en kleine letters) -SUBSTITUTE = SUBSTITUEREN ## Vervangt oude tekst door nieuwe tekst in een tekenreeks -T = T ## Converteert de argumenten naar tekst -TEXT = TEKST ## Maakt een getal op en converteert het getal naar tekst -TRIM = SPATIES.WISSEN ## Verwijdert de spaties uit een tekst -UPPER = HOOFDLETTERS ## Zet tekst om in hoofdletters -VALUE = WAARDE ## Converteert tekst naar een getal diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/no/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/no/config deleted file mode 100644 index c7f4152..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/no/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = kr - - -## -## Excel Error Codes (For future use) - -## -NULL = #NULL! -DIV0 = #DIV/0! -VALUE = #VERDI! -REF = #REF! -NAME = #NAVN? -NUM = #NUM! -NA = #I/T diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/no/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/no/functions deleted file mode 100644 index ab2a379..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/no/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions Funksjonene Tillegg og Automatisering -## -GETPIVOTDATA = HENTPIVOTDATA ## Returnerer data som er lagret i en pivottabellrapport - - -## -## Cube functions Kubefunksjoner -## -CUBEKPIMEMBER = KUBEKPIMEDLEM ## Returnerer navnet, egenskapen og mĆ„let for en viktig ytelsesindikator (KPI), og viser navnet og egenskapen i cellen. En KPI er en mĆ„lbar enhet, for eksempel mĆ„nedlig bruttoinntjening eller kvartalsvis inntjening per ansatt, og brukes til Ć„ overvĆ„ke ytelsen i en organisasjon. -CUBEMEMBER = KUBEMEDLEM ## Returnerer et medlem eller en tuppel i et kubehierarki. Brukes til Ć„ validere at medlemmet eller tuppelen finnes i kuben. -CUBEMEMBERPROPERTY = KUBEMEDLEMEGENSKAP ## Returnerer verdien til en medlemsegenskap i kuben. Brukes til Ć„ validere at et medlemsnavn finnes i kuben, og til Ć„ returnere den angitte egenskapen for dette medlemmet. -CUBERANKEDMEMBER = KUBERANGERTMEDLEM ## Returnerer det n-te, eller rangerte, medlemmet i et sett. Brukes til Ć„ returnere ett eller flere elementer i et sett, for eksempel de 10 beste studentene. -CUBESET = KUBESETT ## Definerer et beregnet sett av medlemmer eller tuppeler ved Ć„ sende et settuttrykk til kuben pĆ„ serveren, noe som oppretter settet og deretter returnerer dette settet til Microsoft Office Excel. -CUBESETCOUNT = KUBESETTANTALL ## Returnerer antallet elementer i et sett. -CUBEVALUE = KUBEVERDI ## Returnerer en aggregert verdi fra en kube. - - -## -## Database functions Databasefunksjoner -## -DAVERAGE = DGJENNOMSNITT ## Returnerer gjennomsnittet av merkede databaseposter -DCOUNT = DANTALL ## Teller celler som inneholder tall i en database -DCOUNTA = DANTALLA ## Teller celler som ikke er tomme i en database -DGET = DHENT ## Trekker ut fra en database en post som oppfyller angitte vilkĆ„r -DMAX = DMAKS ## Returnerer maksimumsverdien fra merkede databaseposter -DMIN = DMIN ## Returnerer minimumsverdien fra merkede databaseposter -DPRODUCT = DPRODUKT ## Multipliserer verdiene i et bestemt felt med poster som oppfyller vilkĆ„rene i en database -DSTDEV = DSTDAV ## Estimerer standardavviket basert pĆ„ et utvalg av merkede databaseposter -DSTDEVP = DSTAVP ## Beregner standardavviket basert pĆ„ at merkede databaseposter utgjĆør hele populasjonen -DSUM = DSUMMER ## Legger til tallene i feltkolonnen med poster, i databasen som oppfyller vilkĆ„rene -DVAR = DVARIANS ## Estimerer variansen basert pĆ„ et utvalg av merkede databaseposter -DVARP = DVARIANSP ## Beregner variansen basert pĆ„ at merkede databaseposter utgjĆør hele populasjonen - - -## -## Date and time functions Dato- og tidsfunksjoner -## -DATE = DATO ## Returnerer serienummeret som svarer til en bestemt dato -DATEVALUE = DATOVERDI ## Konverterer en dato med tekstformat til et serienummer -DAY = DAG ## Konverterer et serienummer til en dag i mĆ„neden -DAYS360 = DAGER360 ## Beregner antall dager mellom to datoer basert pĆ„ et Ć„r med 360 dager -EDATE = DAG.ETTER ## Returnerer serienummeret som svarer til datoen som er det indikerte antall mĆ„neder fĆør eller etter startdatoen -EOMONTH = MƅNEDSSLUTT ## Returnerer serienummeret som svarer til siste dag i mĆ„neden, fĆør eller etter et angitt antall mĆ„neder -HOUR = TIME ## Konverterer et serienummer til en time -MINUTE = MINUTT ## Konverterer et serienummer til et minutt -MONTH = MƅNED ## Konverterer et serienummer til en mĆ„ned -NETWORKDAYS = NETT.ARBEIDSDAGER ## Returnerer antall hele arbeidsdager mellom to datoer -NOW = Nƅ ## Returnerer serienummeret som svarer til gjeldende dato og klokkeslett -SECOND = SEKUND ## Konverterer et serienummer til et sekund -TIME = TID ## Returnerer serienummeret som svarer til et bestemt klokkeslett -TIMEVALUE = TIDSVERDI ## Konverterer et klokkeslett i tekstformat til et serienummer -TODAY = IDAG ## Returnerer serienummeret som svarer til dagens dato -WEEKDAY = UKEDAG ## Konverterer et serienummer til en ukedag -WEEKNUM = UKENR ## Konverterer et serienummer til et tall som representerer hvilket nummer uken har i et Ć„r -WORKDAY = ARBEIDSDAG ## Returnerer serienummeret som svarer til datoen fĆør eller etter et angitt antall arbeidsdager -YEAR = ƅR ## Konverterer et serienummer til et Ć„r -YEARFRAC = ƅRDEL ## Returnerer brĆøkdelen for Ć„ret, som svarer til antall hele dager mellom startdato og sluttdato - - -## -## Engineering functions Tekniske funksjoner -## -BESSELI = BESSELI ## Returnerer den endrede Bessel-funksjonen In(x) -BESSELJ = BESSELJ ## Returnerer Bessel-funksjonen Jn(x) -BESSELK = BESSELK ## Returnerer den endrede Bessel-funksjonen Kn(x) -BESSELY = BESSELY ## Returnerer Bessel-funksjonen Yn(x) -BIN2DEC = BINTILDES ## Konverterer et binƦrt tall til et desimaltall -BIN2HEX = BINTILHEKS ## Konverterer et binƦrt tall til et heksadesimaltall -BIN2OCT = BINTILOKT ## Konverterer et binƦrt tall til et oktaltall -COMPLEX = KOMPLEKS ## Konverterer reelle og imaginƦre koeffisienter til et komplekst tall -CONVERT = KONVERTER ## Konverterer et tall fra ett mĆ„lsystem til et annet -DEC2BIN = DESTILBIN ## Konverterer et desimaltall til et binƦrtall -DEC2HEX = DESTILHEKS ## Konverterer et heltall i 10-tallsystemet til et heksadesimalt tall -DEC2OCT = DESTILOKT ## Konverterer et heltall i 10-tallsystemet til et oktaltall -DELTA = DELTA ## UndersĆøker om to verdier er like -ERF = FEILF ## Returnerer feilfunksjonen -ERFC = FEILFK ## Returnerer den komplementƦre feilfunksjonen -GESTEP = GRENSEVERDI ## Tester om et tall er stĆørre enn en terskelverdi -HEX2BIN = HEKSTILBIN ## Konverterer et heksadesimaltall til et binƦrt tall -HEX2DEC = HEKSTILDES ## Konverterer et heksadesimalt tall til et heltall i 10-tallsystemet -HEX2OCT = HEKSTILOKT ## Konverterer et heksadesimalt tall til et oktaltall -IMABS = IMABS ## Returnerer absoluttverdien (koeffisienten) til et komplekst tall -IMAGINARY = IMAGINƆR ## Returnerer den imaginƦre koeffisienten til et komplekst tall -IMARGUMENT = IMARGUMENT ## Returnerer argumentet theta, som er en vinkel uttrykt i radianer -IMCONJUGATE = IMKONJUGERT ## Returnerer den komplekse konjugaten til et komplekst tall -IMCOS = IMCOS ## Returnerer cosinus til et komplekst tall -IMDIV = IMDIV ## Returnerer kvotienten til to komplekse tall -IMEXP = IMEKSP ## Returnerer eksponenten til et komplekst tall -IMLN = IMLN ## Returnerer den naturlige logaritmen for et komplekst tall -IMLOG10 = IMLOG10 ## Returnerer logaritmen med grunntall 10 for et komplekst tall -IMLOG2 = IMLOG2 ## Returnerer logaritmen med grunntall 2 for et komplekst tall -IMPOWER = IMOPPHƘY ## Returnerer et komplekst tall opphĆøyd til en heltallspotens -IMPRODUCT = IMPRODUKT ## Returnerer produktet av komplekse tall -IMREAL = IMREELL ## Returnerer den reelle koeffisienten til et komplekst tall -IMSIN = IMSIN ## Returnerer sinus til et komplekst tall -IMSQRT = IMROT ## Returnerer kvadratroten av et komplekst tall -IMSUB = IMSUB ## Returnerer differansen mellom to komplekse tall -IMSUM = IMSUMMER ## Returnerer summen av komplekse tall -OCT2BIN = OKTTILBIN ## Konverterer et oktaltall til et binƦrt tall -OCT2DEC = OKTTILDES ## Konverterer et oktaltall til et desimaltall -OCT2HEX = OKTTILHEKS ## Konverterer et oktaltall til et heksadesimaltall - - -## -## Financial functions Ƙkonomiske funksjoner -## -ACCRINT = PƅLƘPT.PERIODISK.RENTE ## Returnerer pĆ„lĆøpte renter for et verdipapir som betaler periodisk rente -ACCRINTM = PƅLƘPT.FORFALLSRENTE ## Returnerer den pĆ„lĆøpte renten for et verdipapir som betaler rente ved forfall -AMORDEGRC = AMORDEGRC ## Returnerer avskrivningen for hver regnskapsperiode ved hjelp av en avskrivingskoeffisient -AMORLINC = AMORLINC ## Returnerer avskrivingen for hver regnskapsperiode -COUPDAYBS = OBLIG.DAGER.FF ## Returnerer antall dager fra begynnelsen av den rentebƦrende perioden til innlĆøsningsdatoen -COUPDAYS = OBLIG.DAGER ## Returnerer antall dager i den rentebƦrende perioden som inneholder innlĆøsningsdatoen -COUPDAYSNC = OBLIG.DAGER.NF ## Returnerer antall dager fra betalingsdato til neste renteinnbetalingsdato -COUPNCD = OBLIG.DAGER.EF ## Returnerer obligasjonsdatoen som kommer etter oppgjĆørsdatoen -COUPNUM = OBLIG.ANTALL ## Returnerer antall obligasjoner som skal betales mellom oppgjĆørsdatoen og forfallsdatoen -COUPPCD = OBLIG.DAG.FORRIGE ## Returnerer obligasjonsdatoen som kommer fĆør oppgjĆørsdatoen -CUMIPMT = SAMLET.RENTE ## Returnerer den kumulative renten som er betalt mellom to perioder -CUMPRINC = SAMLET.HOVEDSTOL ## Returnerer den kumulative hovedstolen som er betalt for et lĆ„n mellom to perioder -DB = DAVSKR ## Returnerer avskrivningen for et aktivum i en angitt periode, foretatt med fast degressiv avskrivning -DDB = DEGRAVS ## Returnerer avskrivningen for et aktivum for en gitt periode, ved hjelp av dobbel degressiv avskrivning eller en metode som du selv angir -DISC = DISKONTERT ## Returnerer diskonteringsraten for et verdipapir -DOLLARDE = DOLLARDE ## Konverterer en valutapris uttrykt som en brĆøk, til en valutapris uttrykt som et desimaltall -DOLLARFR = DOLLARBR ## Konverterer en valutapris uttrykt som et desimaltall, til en valutapris uttrykt som en brĆøk -DURATION = VARIGHET ## Returnerer Ć„rlig varighet for et verdipapir med renter som betales periodisk -EFFECT = EFFEKTIV.RENTE ## Returnerer den effektive Ć„rlige rentesatsen -FV = SLUTTVERDI ## Returnerer fremtidig verdi for en investering -FVSCHEDULE = SVPLAN ## Returnerer den fremtidige verdien av en inngĆ„ende hovedstol etter Ć„ ha anvendt en serie med sammensatte rentesatser -INTRATE = RENTESATS ## Returnerer rentefoten av et fullfinansiert verdipapir -IPMT = RAVDRAG ## Returnerer betalte renter pĆ„ en investering for en gitt periode -IRR = IR ## Returnerer internrenten for en serie kontantstrĆømmer -ISPMT = ER.AVDRAG ## Beregner renten som er betalt for en investering i lĆøpet av en bestemt periode -MDURATION = MVARIGHET ## Returnerer Macauleys modifiserte varighet for et verdipapir med en antatt pĆ„lydende verdi pĆ„ kr 100,00 -MIRR = MODIR ## Returnerer internrenten der positive og negative kontantstrĆømmer finansieres med forskjellige satser -NOMINAL = NOMINELL ## Returnerer Ć„rlig nominell rentesats -NPER = PERIODER ## Returnerer antall perioder for en investering -NPV = NNV ## Returnerer netto nĆ„verdi for en investering, basert pĆ„ en serie periodiske kontantstrĆømmer og en rentesats -ODDFPRICE = AVVIKFP.PRIS ## Returnerer pris pĆ„lydende kr 100 for et verdipapir med en odde fĆørste periode -ODDFYIELD = AVVIKFP.AVKASTNING ## Returnerer avkastingen for et verdipapir med en odde fĆørste periode -ODDLPRICE = AVVIKSP.PRIS ## Returnerer pris pĆ„lydende kr 100 for et verdipapir med en odde siste periode -ODDLYIELD = AVVIKSP.AVKASTNING ## Returnerer avkastingen for et verdipapir med en odde siste periode -PMT = AVDRAG ## Returnerer periodisk betaling for en annuitet -PPMT = AMORT ## Returnerer betalingen pĆ„ hovedstolen for en investering i en gitt periode -PRICE = PRIS ## Returnerer prisen per pĆ„lydende kr 100 for et verdipapir som gir periodisk avkastning -PRICEDISC = PRIS.DISKONTERT ## Returnerer prisen per pĆ„lydende kr 100 for et diskontert verdipapir -PRICEMAT = PRIS.FORFALL ## Returnerer prisen per pĆ„lydende kr 100 av et verdipapir som betaler rente ved forfall -PV = NƅVERDI ## Returnerer nĆ„verdien av en investering -RATE = RENTE ## Returnerer rentesatsen per periode for en annuitet -RECEIVED = MOTTATT.AVKAST ## Returnerer summen som mottas ved forfallsdato for et fullinvestert verdipapir -SLN = LINAVS ## Returnerer den lineƦre avskrivningen for et aktivum i Ć©n periode -SYD = ƅRSAVS ## Returnerer Ć„rsavskrivningen for et aktivum i en angitt periode -TBILLEQ = TBILLEKV ## Returnerer den obligasjonsekvivalente avkastningen for en statsobligasjon -TBILLPRICE = TBILLPRIS ## Returnerer prisen per pĆ„lydende kr 100 for en statsobligasjon -TBILLYIELD = TBILLAVKASTNING ## Returnerer avkastningen til en statsobligasjon -VDB = VERDIAVS ## Returnerer avskrivningen for et aktivum i en angitt periode eller delperiode, ved hjelp av degressiv avskrivning -XIRR = XIR ## Returnerer internrenten for en serie kontantstrĆømmer som ikke nĆødvendigvis er periodiske -XNPV = XNNV ## Returnerer netto nĆ„verdi for en serie kontantstrĆømmer som ikke nĆødvendigvis er periodiske -YIELD = AVKAST ## Returnerer avkastningen pĆ„ et verdipapir som betaler periodisk rente -YIELDDISC = AVKAST.DISKONTERT ## Returnerer Ć„rlig avkastning for et diskontert verdipapir, for eksempel en statskasseveksel -YIELDMAT = AVKAST.FORFALL ## Returnerer den Ć„rlige avkastningen for et verdipapir som betaler rente ved forfallsdato - - -## -## Information functions Informasjonsfunksjoner -## -CELL = CELLE ## Returnerer informasjon om formatering, plassering eller innholdet til en celle -ERROR.TYPE = FEIL.TYPE ## Returnerer et tall som svarer til en feiltype -INFO = INFO ## Returnerer informasjon om gjeldende operativmiljĆø -ISBLANK = ERTOM ## Returnerer SANN hvis verdien er tom -ISERR = ERFEIL ## Returnerer SANN hvis verdien er en hvilken som helst annen feilverdi enn #I/T -ISERROR = ERFEIL ## Returnerer SANN hvis verdien er en hvilken som helst feilverdi -ISEVEN = ERPARTALL ## Returnerer SANN hvis tallet er et partall -ISLOGICAL = ERLOGISK ## Returnerer SANN hvis verdien er en logisk verdi -ISNA = ERIT ## Returnerer SANN hvis verdien er feilverdien #I/T -ISNONTEXT = ERIKKETEKST ## Returnerer SANN hvis verdien ikke er tekst -ISNUMBER = ERTALL ## Returnerer SANN hvis verdien er et tall -ISODD = ERODDETALL ## Returnerer SANN hvis tallet er et oddetall -ISREF = ERREF ## Returnerer SANN hvis verdien er en referanse -ISTEXT = ERTEKST ## Returnerer SANN hvis verdien er tekst -N = N ## Returnerer en verdi som er konvertert til et tall -NA = IT ## Returnerer feilverdien #I/T -TYPE = VERDITYPE ## Returnerer et tall som indikerer datatypen til en verdi - - -## -## Logical functions Logiske funksjoner -## -AND = OG ## Returnerer SANN hvis alle argumentene er lik SANN -FALSE = USANN ## Returnerer den logiske verdien USANN -IF = HVIS ## Angir en logisk test som skal utfĆøres -IFERROR = HVISFEIL ## Returnerer en verdi du angir hvis en formel evaluerer til en feil. Ellers returnerer den resultatet av formelen. -NOT = IKKE ## Reverserer logikken til argumentet -OR = ELLER ## Returnerer SANN hvis ett eller flere argumenter er lik SANN -TRUE = SANN ## Returnerer den logiske verdien SANN - - -## -## Lookup and reference functions Oppslag- og referansefunksjoner -## -ADDRESS = ADRESSE ## Returnerer en referanse som tekst til en enkelt celle i et regneark -AREAS = OMRƅDER ## Returnerer antall omrĆ„der i en referanse -CHOOSE = VELG ## Velger en verdi fra en liste med verdier -COLUMN = KOLONNE ## Returnerer kolonnenummeret for en referanse -COLUMNS = KOLONNER ## Returnerer antall kolonner i en referanse -HLOOKUP = FINN.KOLONNE ## Leter i den Ćøverste raden i en matrise og returnerer verdien for den angitte cellen -HYPERLINK = HYPERKOBLING ## Oppretter en snarvei eller et hopp som Ć„pner et dokument som er lagret pĆ„ en nettverksserver, et intranett eller Internett -INDEX = INDEKS ## Bruker en indeks til Ć„ velge en verdi fra en referanse eller matrise -INDIRECT = INDIREKTE ## Returnerer en referanse angitt av en tekstverdi -LOOKUP = SLƅ.OPP ## SlĆ„r opp verdier i en vektor eller matrise -MATCH = SAMMENLIGNE ## SlĆ„r opp verdier i en referanse eller matrise -OFFSET = FORSKYVNING ## Returnerer en referanseforskyvning fra en gitt referanse -ROW = RAD ## Returnerer radnummeret for en referanse -ROWS = RADER ## Returnerer antall rader i en referanse -RTD = RTD ## Henter sanntidsdata fra et program som stĆøtter COM-automatisering (automatisering: En mĆ„te Ć„ arbeide pĆ„ med programobjekter fra et annet program- eller utviklingsverktĆøy. Tidligere kalt OLE-automatisering. Automatisering er en bransjestandard og en funksjon i Component Object Model (COM).) -TRANSPOSE = TRANSPONER ## Returnerer transponeringen av en matrise -VLOOKUP = FINN.RAD ## Leter i den fĆørste kolonnen i en matrise og flytter bortover raden for Ć„ returnere verdien til en celle - - -## -## Math and trigonometry functions Matematikk- og trigonometrifunksjoner -## -ABS = ABS ## Returnerer absoluttverdien til et tall -ACOS = ARCCOS ## Returnerer arcus cosinus til et tall -ACOSH = ARCCOSH ## Returnerer den inverse hyperbolske cosinus til et tall -ASIN = ARCSIN ## Returnerer arcus sinus til et tall -ASINH = ARCSINH ## Returnerer den inverse hyperbolske sinus til et tall -ATAN = ARCTAN ## Returnerer arcus tangens til et tall -ATAN2 = ARCTAN2 ## Returnerer arcus tangens fra x- og y-koordinater -ATANH = ARCTANH ## Returnerer den inverse hyperbolske tangens til et tall -CEILING = AVRUND.GJELDENDE.MULTIPLUM ## Runder av et tall til nƦrmeste heltall eller til nƦrmeste signifikante multiplum -COMBIN = KOMBINASJON ## Returnerer antall kombinasjoner for ett gitt antall objekter -COS = COS ## Returnerer cosinus til et tall -COSH = COSH ## Returnerer den hyperbolske cosinus til et tall -DEGREES = GRADER ## Konverterer radianer til grader -EVEN = AVRUND.TIL.PARTALL ## Runder av et tall oppover til nƦrmeste heltall som er et partall -EXP = EKSP ## Returnerer e opphĆøyd i en angitt potens -FACT = FAKULTET ## Returnerer fakultet til et tall -FACTDOUBLE = DOBBELFAKT ## Returnerer et talls doble fakultet -FLOOR = AVRUND.GJELDENDE.MULTIPLUM.NED ## Avrunder et tall nedover, mot null -GCD = SFF ## Returnerer hĆøyeste felles divisor -INT = HELTALL ## Avrunder et tall nedover til nƦrmeste heltall -LCM = MFM ## Returnerer minste felles multiplum -LN = LN ## Returnerer den naturlige logaritmen til et tall -LOG = LOG ## Returnerer logaritmen for et tall til et angitt grunntall -LOG10 = LOG10 ## Returnerer logaritmen med grunntall 10 for et tall -MDETERM = MDETERM ## Returnerer matrisedeterminanten til en matrise -MINVERSE = MINVERS ## Returnerer den inverse matrisen til en matrise -MMULT = MMULT ## Returnerer matriseproduktet av to matriser -MOD = REST ## Returnerer resten fra en divisjon -MROUND = MRUND ## Returnerer et tall avrundet til det Ćønskede multiplum -MULTINOMIAL = MULTINOMINELL ## Returnerer det multinominelle for et sett med tall -ODD = AVRUND.TIL.ODDETALL ## Runder av et tall oppover til nƦrmeste heltall som er et oddetall -PI = PI ## Returnerer verdien av pi -POWER = OPPHƘYD.I ## Returnerer resultatet av et tall opphĆøyd i en potens -PRODUCT = PRODUKT ## Multipliserer argumentene -QUOTIENT = KVOTIENT ## Returnerer heltallsdelen av en divisjon -RADIANS = RADIANER ## Konverterer grader til radianer -RAND = TILFELDIG ## Returnerer et tilfeldig tall mellom 0 og 1 -RANDBETWEEN = TILFELDIGMELLOM ## Returnerer et tilfeldig tall innenfor et angitt omrĆ„de -ROMAN = ROMERTALL ## Konverterer vanlige tall til romertall, som tekst -ROUND = AVRUND ## Avrunder et tall til et angitt antall sifre -ROUNDDOWN = AVRUND.NED ## Avrunder et tall nedover, mot null -ROUNDUP = AVRUND.OPP ## Runder av et tall oppover, bort fra null -SERIESSUM = SUMMER.REKKE ## Returnerer summen av en geometrisk rekke, basert pĆ„ formelen -SIGN = FORTEGN ## Returnerer fortegnet for et tall -SIN = SIN ## Returnerer sinus til en gitt vinkel -SINH = SINH ## Returnerer den hyperbolske sinus til et tall -SQRT = ROT ## Returnerer en positiv kvadratrot -SQRTPI = ROTPI ## Returnerer kvadratroten av (tall * pi) -SUBTOTAL = DELSUM ## Returnerer en delsum i en liste eller database -SUM = SUMMER ## Legger sammen argumentene -SUMIF = SUMMERHVIS ## Legger sammen cellene angitt ved et gitt vilkĆ„r -SUMIFS = SUMMER.HVIS.SETT ## Legger sammen cellene i et omrĆ„de som oppfyller flere vilkĆ„r -SUMPRODUCT = SUMMERPRODUKT ## Returnerer summen av produktene av tilsvarende matrisekomponenter -SUMSQ = SUMMERKVADRAT ## Returnerer kvadratsummen av argumentene -SUMX2MY2 = SUMMERX2MY2 ## Returnerer summen av differansen av kvadratene for tilsvarende verdier i to matriser -SUMX2PY2 = SUMMERX2PY2 ## Returnerer summen av kvadratsummene for tilsvarende verdier i to matriser -SUMXMY2 = SUMMERXMY2 ## Returnerer summen av kvadratene av differansen for tilsvarende verdier i to matriser -TAN = TAN ## Returnerer tangens for et tall -TANH = TANH ## Returnerer den hyperbolske tangens for et tall -TRUNC = AVKORT ## Korter av et tall til et heltall - - -## -## Statistical functions Statistiske funksjoner -## -AVEDEV = GJENNOMSNITTSAVVIK ## Returnerer datapunktenes gjennomsnittlige absoluttavvik fra middelverdien -AVERAGE = GJENNOMSNITT ## Returnerer gjennomsnittet for argumentene -AVERAGEA = GJENNOMSNITTA ## Returnerer gjennomsnittet for argumentene, inkludert tall, tekst og logiske verdier -AVERAGEIF = GJENNOMSNITTHVIS ## Returnerer gjennomsnittet (aritmetisk gjennomsnitt) av alle cellene i et omrĆ„de som oppfyller et bestemt vilkĆ„r -AVERAGEIFS = GJENNOMSNITT.HVIS.SETT ## Returnerer gjennomsnittet (aritmetisk middelverdi) av alle celler som oppfyller flere vilkĆ„r. -BETADIST = BETA.FORDELING ## Returnerer den kumulative betafordelingsfunksjonen -BETAINV = INVERS.BETA.FORDELING ## Returnerer den inverse verdien til fordelingsfunksjonen for en angitt betafordeling -BINOMDIST = BINOM.FORDELING ## Returnerer den individuelle binomiske sannsynlighetsfordelingen -CHIDIST = KJI.FORDELING ## Returnerer den ensidige sannsynligheten for en kjikvadrert fordeling -CHIINV = INVERS.KJI.FORDELING ## Returnerer den inverse av den ensidige sannsynligheten for den kjikvadrerte fordelingen -CHITEST = KJI.TEST ## UtfĆører testen for uavhengighet -CONFIDENCE = KONFIDENS ## Returnerer konfidensintervallet til gjennomsnittet for en populasjon -CORREL = KORRELASJON ## Returnerer korrelasjonskoeffisienten mellom to datasett -COUNT = ANTALL ## Teller hvor mange tall som er i argumentlisten -COUNTA = ANTALLA ## Teller hvor mange verdier som er i argumentlisten -COUNTBLANK = TELLBLANKE ## Teller antall tomme celler i et omrĆ„de. -COUNTIF = ANTALL.HVIS ## Teller antall celler i et omrĆ„de som oppfyller gitte vilkĆ„r -COUNTIFS = ANTALL.HVIS.SETT ## Teller antallet ikke-tomme celler i et omrĆ„de som oppfyller flere vilkĆ„r -COVAR = KOVARIANS ## Returnerer kovariansen, gjennomsnittet av produktene av parvise avvik -CRITBINOM = GRENSE.BINOM ## Returnerer den minste verdien der den kumulative binomiske fordelingen er mindre enn eller lik en vilkĆ„rsverdi -DEVSQ = AVVIK.KVADRERT ## Returnerer summen av kvadrerte avvik -EXPONDIST = EKSP.FORDELING ## Returnerer eksponentialfordelingen -FDIST = FFORDELING ## Returnerer F-sannsynlighetsfordelingen -FINV = FFORDELING.INVERS ## Returnerer den inverse av den sannsynlige F-fordelingen -FISHER = FISHER ## Returnerer Fisher-transformasjonen -FISHERINV = FISHERINV ## Returnerer den inverse av Fisher-transformasjonen -FORECAST = PROGNOSE ## Returnerer en verdi langs en lineƦr trend -FREQUENCY = FREKVENS ## Returnerer en frekvensdistribusjon som en loddrett matrise -FTEST = FTEST ## Returnerer resultatet av en F-test -GAMMADIST = GAMMAFORDELING ## Returnerer gammafordelingen -GAMMAINV = GAMMAINV ## Returnerer den inverse av den gammakumulative fordelingen -GAMMALN = GAMMALN ## Returnerer den naturlige logaritmen til gammafunksjonen G(x) -GEOMEAN = GJENNOMSNITT.GEOMETRISK ## Returnerer den geometriske middelverdien -GROWTH = VEKST ## Returnerer verdier langs en eksponentiell trend -HARMEAN = GJENNOMSNITT.HARMONISK ## Returnerer den harmoniske middelverdien -HYPGEOMDIST = HYPGEOM.FORDELING ## Returnerer den hypergeometriske fordelingen -INTERCEPT = SKJƆRINGSPUNKT ## Returnerer skjƦringspunktet til den lineƦre regresjonslinjen -KURT = KURT ## Returnerer kurtosen til et datasett -LARGE = N.STƘRST ## Returnerer den n-te stĆørste verdien i et datasett -LINEST = RETTLINJE ## Returnerer parameterne til en lineƦr trend -LOGEST = KURVE ## Returnerer parameterne til en eksponentiell trend -LOGINV = LOGINV ## Returnerer den inverse lognormale fordelingen -LOGNORMDIST = LOGNORMFORD ## Returnerer den kumulative lognormale fordelingen -MAX = STƘRST ## Returnerer maksimumsverdien i en argumentliste -MAXA = MAKSA ## Returnerer maksimumsverdien i en argumentliste, inkludert tall, tekst og logiske verdier -MEDIAN = MEDIAN ## Returnerer medianen til tallene som er gitt -MIN = MIN ## Returnerer minimumsverdien i en argumentliste -MINA = MINA ## Returnerer den minste verdien i en argumentliste, inkludert tall, tekst og logiske verdier -MODE = MODUS ## Returnerer den vanligste verdien i et datasett -NEGBINOMDIST = NEGBINOM.FORDELING ## Returnerer den negative binomiske fordelingen -NORMDIST = NORMALFORDELING ## Returnerer den kumulative normalfordelingen -NORMINV = NORMINV ## Returnerer den inverse kumulative normalfordelingen -NORMSDIST = NORMSFORDELING ## Returnerer standard kumulativ normalfordeling -NORMSINV = NORMSINV ## Returnerer den inverse av den den kumulative standard normalfordelingen -PEARSON = PEARSON ## Returnerer produktmomentkorrelasjonskoeffisienten, Pearson -PERCENTILE = PERSENTIL ## Returnerer den n-te persentil av verdiene i et omrĆ„de -PERCENTRANK = PROSENTDEL ## Returnerer prosentrangeringen av en verdi i et datasett -PERMUT = PERMUTER ## Returnerer antall permutasjoner for et gitt antall objekter -POISSON = POISSON ## Returnerer Poissons sannsynlighetsfordeling -PROB = SANNSYNLIG ## Returnerer sannsynligheten for at verdier i et omrĆ„de ligger mellom to grenser -QUARTILE = KVARTIL ## Returnerer kvartilen til et datasett -RANK = RANG ## Returnerer rangeringen av et tall, eller plassen tallet har i en rekke -RSQ = RKVADRAT ## Returnerer kvadratet av produktmomentkorrelasjonskoeffisienten (Pearsons r) -SKEW = SKJEVFORDELING ## Returnerer skjevheten i en fordeling -SLOPE = STIGNINGSTALL ## Returnerer stigningtallet for den lineƦre regresjonslinjen -SMALL = N.MINST ## Returnerer den n-te minste verdien i et datasett -STANDARDIZE = NORMALISER ## Returnerer en normalisert verdi -STDEV = STDAV ## Estimere standardavvik pĆ„ grunnlag av et utvalg -STDEVA = STDAVVIKA ## Estimerer standardavvik basert pĆ„ et utvalg, inkludert tall, tekst og logiske verdier -STDEVP = STDAVP ## Beregner standardavvik basert pĆ„ hele populasjonen -STDEVPA = STDAVVIKPA ## Beregner standardavvik basert pĆ„ hele populasjonen, inkludert tall, tekst og logiske verdier -STEYX = STANDARDFEIL ## Returnerer standardfeilen for den predikerte y-verdien for hver x i regresjonen -TDIST = TFORDELING ## Returnerer en Student t-fordeling -TINV = TINV ## Returnerer den inverse Student t-fordelingen -TREND = TREND ## Returnerer verdier langs en lineƦr trend -TRIMMEAN = TRIMMET.GJENNOMSNITT ## Returnerer den interne middelverdien til et datasett -TTEST = TTEST ## Returnerer sannsynligheten assosiert med en Student t-test -VAR = VARIANS ## Estimerer varians basert pĆ„ et utvalg -VARA = VARIANSA ## Estimerer varians basert pĆ„ et utvalg, inkludert tall, tekst og logiske verdier -VARP = VARIANSP ## Beregner varians basert pĆ„ hele populasjonen -VARPA = VARIANSPA ## Beregner varians basert pĆ„ hele populasjonen, inkludert tall, tekst og logiske verdier -WEIBULL = WEIBULL.FORDELING ## Returnerer Weibull-fordelingen -ZTEST = ZTEST ## Returnerer den ensidige sannsynlighetsverdien for en z-test - - -## -## Text functions Tekstfunksjoner -## -ASC = STIGENDE ## Endrer fullbreddes (dobbeltbyte) engelske bokstaver eller katakana i en tegnstreng, til halvbreddes (enkeltbyte) tegn -BAHTTEXT = BAHTTEKST ## Konverterer et tall til tekst, og bruker valutaformatet ß (baht) -CHAR = TEGNKODE ## Returnerer tegnet som svarer til kodenummeret -CLEAN = RENSK ## Fjerner alle tegn som ikke kan skrives ut, fra teksten -CODE = KODE ## Returnerer en numerisk kode for det fĆørste tegnet i en tekststreng -CONCATENATE = KJEDE.SAMMEN ## SlĆ„r sammen flere tekstelementer til ett tekstelement -DOLLAR = VALUTA ## Konverterer et tall til tekst, og bruker valutaformatet $ (dollar) -EXACT = EKSAKT ## Kontrollerer om to tekstverdier er like -FIND = FINN ## Finner en tekstverdi inne i en annen (skiller mellom store og smĆ„ bokstaver) -FINDB = FINNB ## Finner en tekstverdi inne i en annen (skiller mellom store og smĆ„ bokstaver) -FIXED = FASTSATT ## Formaterer et tall som tekst med et bestemt antall desimaler -JIS = JIS ## Endrer halvbreddes (enkeltbyte) engelske bokstaver eller katakana i en tegnstreng, til fullbreddes (dobbeltbyte) tegn -LEFT = VENSTRE ## Returnerer tegnene lengst til venstre i en tekstverdi -LEFTB = VENSTREB ## Returnerer tegnene lengst til venstre i en tekstverdi -LEN = LENGDE ## Returnerer antall tegn i en tekststreng -LENB = LENGDEB ## Returnerer antall tegn i en tekststreng -LOWER = SMƅ ## Konverterer tekst til smĆ„ bokstaver -MID = DELTEKST ## Returnerer et angitt antall tegn fra en tekststreng, og begynner fra posisjonen du angir -MIDB = DELTEKSTB ## Returnerer et angitt antall tegn fra en tekststreng, og begynner fra posisjonen du angir -PHONETIC = FURIGANA ## Trekker ut fonetiske tegn (furigana) fra en tekststreng -PROPER = STOR.FORBOKSTAV ## Gir den fĆørste bokstaven i hvert ord i en tekstverdi stor forbokstav -REPLACE = ERSTATT ## Erstatter tegn i en tekst -REPLACEB = ERSTATTB ## Erstatter tegn i en tekst -REPT = GJENTA ## Gjentar tekst et gitt antall ganger -RIGHT = HƘYRE ## Returnerer tegnene lengst til hĆøyre i en tekstverdi -RIGHTB = HƘYREB ## Returnerer tegnene lengst til hĆøyre i en tekstverdi -SEARCH = SƘK ## Finner en tekstverdi inne i en annen (skiller ikke mellom store og smĆ„ bokstaver) -SEARCHB = SƘKB ## Finner en tekstverdi inne i en annen (skiller ikke mellom store og smĆ„ bokstaver) -SUBSTITUTE = BYTT.UT ## Bytter ut gammel tekst med ny tekst i en tekststreng -T = T ## Konverterer argumentene til tekst -TEXT = TEKST ## Formaterer et tall og konverterer det til tekst -TRIM = TRIMME ## Fjerner mellomrom fra tekst -UPPER = STORE ## Konverterer tekst til store bokstaver -VALUE = VERDI ## Konverterer et tekstargument til et tall diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pl/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pl/config deleted file mode 100644 index 00f8b9a..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pl/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = zł - - -## -## Excel Error Codes (For future use) - -## -NULL = #ZERO! -DIV0 = #DZIEL/0! -VALUE = #ARG! -REF = #ADR! -NAME = #NAZWA? -NUM = #LICZBA! -NA = #N/D! diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pl/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pl/functions deleted file mode 100644 index 907a4ff..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pl/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions Funkcje dodatków i automatyzacji -## -GETPIVOTDATA = WEŹDANETABELI ## Zwraca dane przechowywane w raporcie tabeli przestawnej. - - -## -## Cube functions Funkcje modułów -## -CUBEKPIMEMBER = ELEMENT.KPI.MODUŁU ## Zwraca nazwę, właściwość i miarę kluczowego wskaÅŗnika wydajności (KPI) oraz wyświetla nazwę i właściwość w komórce. WskaÅŗnik KPI jest miarą ilościową, taką jak miesięczny zysk brutto lub kwartalna fluktuacja pracowników, używaną do monitorowania wydajności organizacji. -CUBEMEMBER = ELEMENT.MODUŁU ## Zwraca element lub krotkę z hierarchii modułu. Służy do sprawdzania, czy element lub krotka istnieje w module. -CUBEMEMBERPROPERTY = WŁAŚCIWOŚĆ.ELEMENTU.MODUŁU ## Zwraca wartość właściwości elementu w module. Służy do sprawdzania, czy nazwa elementu istnieje w module, i zwracania określonej właściwości dla tego elementu. -CUBERANKEDMEMBER = USZEREGOWANY.ELEMENT.MODUŁU ## Zwraca n-ty (albo uszeregowany) element zestawu. Służy do zwracania elementu lub elementów zestawu, na przykład najlepszego sprzedawcy lub 10 najlepszych studentów. -CUBESET = ZESTAW.MODUŁÓW ## Definiuje obliczony zestaw elementów lub krotek, wysyłając wyrażenie zestawu do serwera modułu, który tworzy zestaw i zwraca go do programu Microsoft Office Excel. -CUBESETCOUNT = LICZNIK.MODUŁÓW.ZESTAWU ## Zwraca liczbę elementów zestawu. -CUBEVALUE = WARTOŚĆ.MODUŁU ## Zwraca zagregowaną wartość z modułu. - - -## -## Database functions Funkcje baz danych -## -DAVERAGE = BD.ŚREDNIA ## Zwraca wartość średniej wybranych wpisów bazy danych. -DCOUNT = BD.ILE.REKORDƓW ## Zlicza komórki zawierające liczby w bazie danych. -DCOUNTA = BD.ILE.REKORDƓW.A ## Zlicza niepuste komórki w bazie danych. -DGET = BD.POLE ## Wyodrębnia z bazy danych jeden rekord spełniający określone kryteria. -DMAX = BD.MAX ## Zwraca wartość maksymalną z wybranych wpisów bazy danych. -DMIN = BD.MIN ## Zwraca wartość minimalną z wybranych wpisów bazy danych. -DPRODUCT = BD.ILOCZYN ## Mnoży wartości w konkretnym, spełniającym kryteria polu rekordów bazy danych. -DSTDEV = BD.ODCH.STANDARD ## Szacuje odchylenie standardowe na podstawie próbki z wybranych wpisów bazy danych. -DSTDEVP = BD.ODCH.STANDARD.POPUL ## Oblicza odchylenie standardowe na podstawie całej populacji wybranych wpisów bazy danych. -DSUM = BD.SUMA ## Dodaje liczby w kolumnie pól rekordów bazy danych, które spełniają kryteria. -DVAR = BD.WARIANCJA ## Szacuje wariancję na podstawie próbki z wybranych wpisów bazy danych. -DVARP = BD.WARIANCJA.POPUL ## Oblicza wariancję na podstawie całej populacji wybranych wpisów bazy danych. - - -## -## Date and time functions Funkcje dat, godzin i czasu -## -DATE = DATA ## Zwraca liczbę seryjną dla wybranej daty. -DATEVALUE = DATA.WARTOŚĆ ## Konwertuje datę w formie tekstu na liczbę seryjną. -DAY = DZIEŃ ## Konwertuje liczbę seryjną na dzień miesiąca. -DAYS360 = DNI.360 ## Oblicza liczbę dni między dwiema datami na podstawie roku 360-dniowego. -EDATE = UPŁDNI ## Zwraca liczbę seryjną daty jako wskazaną liczbę miesięcy przed określoną datą początkową lub po niej. -EOMONTH = EOMONTH ## Zwraca liczbę seryjną ostatniego dnia miesiąca przed określoną liczbą miesięcy lub po niej. -HOUR = GODZINA ## Konwertuje liczbę seryjną na godzinę. -MINUTE = MINUTA ## Konwertuje liczbę seryjną na minutę. -MONTH = MIESIĄC ## Konwertuje liczbę seryjną na miesiąc. -NETWORKDAYS = NETWORKDAYS ## Zwraca liczbę pełnych dni roboczych między dwiema datami. -NOW = TERAZ ## Zwraca liczbę seryjną bieżącej daty i godziny. -SECOND = SEKUNDA ## Konwertuje liczbę seryjną na sekundę. -TIME = CZAS ## Zwraca liczbę seryjną określonego czasu. -TIMEVALUE = CZAS.WARTOŚĆ ## Konwertuje czas w formie tekstu na liczbę seryjną. -TODAY = DZIŚ ## Zwraca liczbę seryjną dla daty bieżącej. -WEEKDAY = DZIEŃ.TYG ## Konwertuje liczbę seryjną na dzień tygodnia. -WEEKNUM = WEEKNUM ## Konwertuje liczbę seryjną na liczbę reprezentującą numer tygodnia w roku. -WORKDAY = WORKDAY ## Zwraca liczbę seryjną dla daty przed określoną liczbą dni roboczych lub po niej. -YEAR = ROK ## Konwertuje liczbę seryjną na rok. -YEARFRAC = YEARFRAC ## Zwraca część roku reprezentowaną przez pełną liczbę dni między datą początkową a datą końcową. - - -## -## Engineering functions Funkcje inżynierskie -## -BESSELI = BESSELI ## Zwraca wartość zmodyfikowanej funkcji Bessela In(x). -BESSELJ = BESSELJ ## Zwraca wartość funkcji Bessela Jn(x). -BESSELK = BESSELK ## Zwraca wartość zmodyfikowanej funkcji Bessela Kn(x). -BESSELY = BESSELY ## Zwraca wartość funkcji Bessela Yn(x). -BIN2DEC = BIN2DEC ## Konwertuje liczbę w postaci dwójkowej na liczbę w postaci dziesiętnej. -BIN2HEX = BIN2HEX ## Konwertuje liczbę w postaci dwójkowej na liczbę w postaci szesnastkowej. -BIN2OCT = BIN2OCT ## Konwertuje liczbę w postaci dwójkowej na liczbę w postaci ósemkowej. -COMPLEX = COMPLEX ## Konwertuje część rzeczywistą i urojoną na liczbę zespoloną. -CONVERT = CONVERT ## Konwertuje liczbę z jednego systemu miar na inny. -DEC2BIN = DEC2BIN ## Konwertuje liczbę w postaci dziesiętnej na postać dwójkową. -DEC2HEX = DEC2HEX ## Konwertuje liczbę w postaci dziesiętnej na liczbę w postaci szesnastkowej. -DEC2OCT = DEC2OCT ## Konwertuje liczbę w postaci dziesiętnej na liczbę w postaci ósemkowej. -DELTA = DELTA ## Sprawdza, czy dwie wartości są równe. -ERF = ERF ## Zwraca wartość funkcji błędu. -ERFC = ERFC ## Zwraca wartość komplementarnej funkcji błędu. -GESTEP = GESTEP ## Sprawdza, czy liczba jest większa niż wartość progowa. -HEX2BIN = HEX2BIN ## Konwertuje liczbę w postaci szesnastkowej na liczbę w postaci dwójkowej. -HEX2DEC = HEX2DEC ## Konwertuje liczbę w postaci szesnastkowej na liczbę w postaci dziesiętnej. -HEX2OCT = HEX2OCT ## Konwertuje liczbę w postaci szesnastkowej na liczbę w postaci ósemkowej. -IMABS = IMABS ## Zwraca wartość bezwzględną (moduł) liczby zespolonej. -IMAGINARY = IMAGINARY ## Zwraca wartość części urojonej liczby zespolonej. -IMARGUMENT = IMARGUMENT ## Zwraca wartość argumentu liczby zespolonej, przy czym kąt wyrażony jest w radianach. -IMCONJUGATE = IMCONJUGATE ## Zwraca wartość liczby sprzężonej danej liczby zespolonej. -IMCOS = IMCOS ## Zwraca wartość cosinusa liczby zespolonej. -IMDIV = IMDIV ## Zwraca wartość ilorazu dwóch liczb zespolonych. -IMEXP = IMEXP ## Zwraca postać wykładniczą liczby zespolonej. -IMLN = IMLN ## Zwraca wartość logarytmu naturalnego liczby zespolonej. -IMLOG10 = IMLOG10 ## Zwraca wartość logarytmu dziesiętnego liczby zespolonej. -IMLOG2 = IMLOG2 ## Zwraca wartość logarytmu liczby zespolonej przy podstawie 2. -IMPOWER = IMPOWER ## Zwraca wartość liczby zespolonej podniesionej do potęgi całkowitej. -IMPRODUCT = IMPRODUCT ## Zwraca wartość iloczynu liczb zespolonych. -IMREAL = IMREAL ## Zwraca wartość części rzeczywistej liczby zespolonej. -IMSIN = IMSIN ## Zwraca wartość sinusa liczby zespolonej. -IMSQRT = IMSQRT ## Zwraca wartość pierwiastka kwadratowego z liczby zespolonej. -IMSUB = IMSUB ## Zwraca wartość różnicy dwóch liczb zespolonych. -IMSUM = IMSUM ## Zwraca wartość sumy liczb zespolonych. -OCT2BIN = OCT2BIN ## Konwertuje liczbę w postaci ósemkowej na liczbę w postaci dwójkowej. -OCT2DEC = OCT2DEC ## Konwertuje liczbę w postaci ósemkowej na liczbę w postaci dziesiętnej. -OCT2HEX = OCT2HEX ## Konwertuje liczbę w postaci ósemkowej na liczbę w postaci szesnastkowej. - - -## -## Financial functions Funkcje finansowe -## -ACCRINT = ACCRINT ## Zwraca narosłe odsetki dla papieru wartościowego z oprocentowaniem okresowym. -ACCRINTM = ACCRINTM ## Zwraca narosłe odsetki dla papieru wartościowego z oprocentowaniem w terminie wykupu. -AMORDEGRC = AMORDEGRC ## Zwraca amortyzację dla każdego okresu rozliczeniowego z wykorzystaniem współczynnika amortyzacji. -AMORLINC = AMORLINC ## Zwraca amortyzację dla każdego okresu rozliczeniowego. -COUPDAYBS = COUPDAYBS ## Zwraca liczbę dni od początku okresu dywidendy do dnia rozliczeniowego. -COUPDAYS = COUPDAYS ## Zwraca liczbę dni w okresie dywidendy, z uwzględnieniem dnia rozliczeniowego. -COUPDAYSNC = COUPDAYSNC ## Zwraca liczbę dni od dnia rozliczeniowego do daty następnego dnia dywidendy. -COUPNCD = COUPNCD ## Zwraca dzień następnej dywidendy po dniu rozliczeniowym. -COUPNUM = COUPNUM ## Zwraca liczbę dywidend płatnych między dniem rozliczeniowym a dniem wykupu. -COUPPCD = COUPPCD ## Zwraca dzień poprzedniej dywidendy przed dniem rozliczeniowym. -CUMIPMT = CUMIPMT ## Zwraca wartość procentu składanego płatnego między dwoma okresami. -CUMPRINC = CUMPRINC ## Zwraca wartość kapitału skumulowanego spłaty pożyczki między dwoma okresami. -DB = DB ## Zwraca amortyzację środka trwałego w danym okresie metodą degresywną z zastosowaniem stałej bazowej. -DDB = DDB ## Zwraca amortyzację środka trwałego za podany okres metodą degresywną z zastosowaniem podwójnej bazowej lub metodą określoną przez użytkownika. -DISC = DISC ## Zwraca wartość stopy dyskontowej papieru wartościowego. -DOLLARDE = DOLLARDE ## Konwertuje cenę w postaci ułamkowej na cenę wyrażoną w postaci dziesiętnej. -DOLLARFR = DOLLARFR ## Konwertuje cenę wyrażoną w postaci dziesiętnej na cenę wyrażoną w postaci ułamkowej. -DURATION = DURATION ## Zwraca wartość rocznego przychodu z papieru wartościowego o okresowych wypłatach oprocentowania. -EFFECT = EFFECT ## Zwraca wartość efektywnej rocznej stopy procentowej. -FV = FV ## Zwraca przyszłą wartość lokaty. -FVSCHEDULE = FVSCHEDULE ## Zwraca przyszłą wartość kapitału początkowego wraz z szeregiem procentów składanych. -INTRATE = INTRATE ## Zwraca wartość stopy procentowej papieru wartościowego całkowicie ulokowanego. -IPMT = IPMT ## Zwraca wysokość spłaty oprocentowania lokaty za dany okres. -IRR = IRR ## Zwraca wartość wewnętrznej stopy zwrotu dla serii przepływów gotówkowych. -ISPMT = ISPMT ## Oblicza wysokość spłaty oprocentowania za dany okres lokaty. -MDURATION = MDURATION ## Zwraca wartość zmodyfikowanego okresu Macauleya dla papieru wartościowego o założonej wartości nominalnej 100 zł. -MIRR = MIRR ## Zwraca wartość wewnętrznej stopy zwrotu dla przypadku, gdy dodatnie i ujemne przepływy gotówkowe mają różne stopy. -NOMINAL = NOMINAL ## Zwraca wysokość nominalnej rocznej stopy procentowej. -NPER = NPER ## Zwraca liczbę okresów dla lokaty. -NPV = NPV ## Zwraca wartość bieżącą netto lokaty na podstawie szeregu okresowych przepływów gotówkowych i stopy dyskontowej. -ODDFPRICE = ODDFPRICE ## Zwraca cenę za 100 zł wartości nominalnej papieru wartościowego z nietypowym pierwszym okresem. -ODDFYIELD = ODDFYIELD ## Zwraca rentowność papieru wartościowego z nietypowym pierwszym okresem. -ODDLPRICE = ODDLPRICE ## Zwraca cenę za 100 zł wartości nominalnej papieru wartościowego z nietypowym ostatnim okresem. -ODDLYIELD = ODDLYIELD ## Zwraca rentowność papieru wartościowego z nietypowym ostatnim okresem. -PMT = PMT ## Zwraca wartość okresowej płatności raty rocznej. -PPMT = PPMT ## Zwraca wysokość spłaty kapitału w przypadku lokaty dla danego okresu. -PRICE = PRICE ## Zwraca cenę za 100 zł wartości nominalnej papieru wartościowego z oprocentowaniem okresowym. -PRICEDISC = PRICEDISC ## Zwraca cenę za 100 zł wartości nominalnej papieru wartościowego zdyskontowanego. -PRICEMAT = PRICEMAT ## Zwraca cenę za 100 zł wartości nominalnej papieru wartościowego z oprocentowaniem w terminie wykupu. -PV = PV ## Zwraca wartość bieżącą lokaty. -RATE = RATE ## Zwraca wysokość stopy procentowej w okresie raty rocznej. -RECEIVED = RECEIVED ## Zwraca wartość kapitału otrzymanego przy wykupie papieru wartościowego całkowicie ulokowanego. -SLN = SLN ## Zwraca amortyzację środka trwałego za jeden okres metodą liniową. -SYD = SYD ## Zwraca amortyzację środka trwałego za dany okres metodą sumy cyfr lat amortyzacji. -TBILLEQ = TBILLEQ ## Zwraca rentowność ekwiwalentu obligacji dla bonu skarbowego. -TBILLPRICE = TBILLPRICE ## Zwraca cenę za 100 zł wartości nominalnej bonu skarbowego. -TBILLYIELD = TBILLYIELD ## Zwraca rentowność bonu skarbowego. -VDB = VDB ## Oblicza amortyzację środka trwałego w danym okresie lub jego części metodą degresywną. -XIRR = XIRR ## Zwraca wartość wewnętrznej stopy zwrotu dla serii rozłożonych w czasie przepływów gotówkowych, niekoniecznie okresowych. -XNPV = XNPV ## Zwraca wartość bieżącą netto dla serii rozłożonych w czasie przepływów gotówkowych, niekoniecznie okresowych. -YIELD = YIELD ## Zwraca rentowność papieru wartościowego z oprocentowaniem okresowym. -YIELDDISC = YIELDDISC ## Zwraca roczną rentowność zdyskontowanego papieru wartościowego, na przykład bonu skarbowego. -YIELDMAT = YIELDMAT ## Zwraca roczną rentowność papieru wartościowego oprocentowanego przy wykupie. - - -## -## Information functions Funkcje informacyjne -## -CELL = KOMƓRKA ## Zwraca informacje o formacie, położeniu lub zawartości komórki. -ERROR.TYPE = NR.BŁĘDU ## Zwraca liczbę odpowiadającą typowi błędu. -INFO = INFO ## Zwraca informację o aktualnym środowisku pracy. -ISBLANK = CZY.PUSTA ## Zwraca wartość PRAWDA, jeśli wartość jest pusta. -ISERR = CZY.BŁ ## Zwraca wartość PRAWDA, jeśli wartość jest dowolną wartością błędu, z wyjątkiem #N/D!. -ISERROR = CZY.BŁĄD ## Zwraca wartość PRAWDA, jeśli wartość jest dowolną wartością błędu. -ISEVEN = ISEVEN ## Zwraca wartość PRAWDA, jeśli liczba jest parzysta. -ISLOGICAL = CZY.LOGICZNA ## Zwraca wartość PRAWDA, jeśli wartość jest wartością logiczną. -ISNA = CZY.BRAK ## Zwraca wartość PRAWDA, jeśli wartość jest wartością błędu #N/D!. -ISNONTEXT = CZY.NIE.TEKST ## Zwraca wartość PRAWDA, jeśli wartość nie jest tekstem. -ISNUMBER = CZY.LICZBA ## Zwraca wartość PRAWDA, jeśli wartość jest liczbą. -ISODD = ISODD ## Zwraca wartość PRAWDA, jeśli liczba jest nieparzysta. -ISREF = CZY.ADR ## Zwraca wartość PRAWDA, jeśli wartość jest odwołaniem. -ISTEXT = CZY.TEKST ## Zwraca wartość PRAWDA, jeśli wartość jest tekstem. -N = L ## Zwraca wartość przekonwertowaną na postać liczbową. -NA = BRAK ## Zwraca wartość błędu #N/D!. -TYPE = TYP ## Zwraca liczbę wskazującą typ danych wartości. - - -## -## Logical functions Funkcje logiczne -## -AND = ORAZ ## Zwraca wartość PRAWDA, jeśli wszystkie argumenty mają wartość PRAWDA. -FALSE = FAŁSZ ## Zwraca wartość logiczną FAŁSZ. -IF = JEÅ»ELI ## Określa warunek logiczny do sprawdzenia. -IFERROR = JEÅ»ELI.BŁĄD ## Zwraca określoną wartość, jeśli wynikiem obliczenia formuły jest błąd; w przeciwnym przypadku zwraca wynik formuły. -NOT = NIE ## Odwraca wartość logiczną argumentu. -OR = LUB ## Zwraca wartość PRAWDA, jeśli co najmniej jeden z argumentów ma wartość PRAWDA. -TRUE = PRAWDA ## Zwraca wartość logiczną PRAWDA. - - -## -## Lookup and reference functions Funkcje wyszukiwania i odwołań -## -ADDRESS = ADRES ## Zwraca odwołanie do jednej komórki w arkuszu jako wartość tekstową. -AREAS = OBSZARY ## Zwraca liczbę obszarów występujących w odwołaniu. -CHOOSE = WYBIERZ ## Wybiera wartość z listy wartości. -COLUMN = NR.KOLUMNY ## Zwraca numer kolumny z odwołania. -COLUMNS = LICZBA.KOLUMN ## Zwraca liczbę kolumn dla danego odwołania. -HLOOKUP = WYSZUKAJ.POZIOMO ## Przegląda górny wiersz tablicy i zwraca wartość wskazanej komórki. -HYPERLINK = HIPERŁĄCZE ## Tworzy skrót lub skok, który pozwala otwierać dokument przechowywany na serwerze sieciowym, w sieci intranet lub w Internecie. -INDEX = INDEKS ## Używa indeksu do wybierania wartości z odwołania lub tablicy. -INDIRECT = ADR.POŚR ## Zwraca odwołanie określone przez wartość tekstową. -LOOKUP = WYSZUKAJ ## Wyszukuje wartości w wektorze lub tablicy. -MATCH = PODAJ.POZYCJĘ ## Wyszukuje wartości w odwołaniu lub w tablicy. -OFFSET = PRZESUNIĘCIE ## Zwraca adres przesunięty od danego odwołania. -ROW = WIERSZ ## Zwraca numer wiersza odwołania. -ROWS = ILE.WIERSZY ## Zwraca liczbę wierszy dla danego odwołania. -RTD = RTD ## Pobiera dane w czasie rzeczywistym z programu obsługującego automatyzację COM (Automatyzacja: Sposób pracy z obiektami aplikacji pochodzącymi z innej aplikacji lub narzędzia projektowania. Nazywana wcześniej Automatyzacją OLE, Automatyzacja jest standardem przemysłowym i funkcją obiektowego modelu składników (COM, Component Object Model).). -TRANSPOSE = TRANSPONUJ ## Zwraca transponowaną tablicę. -VLOOKUP = WYSZUKAJ.PIONOWO ## Przeszukuje pierwszą kolumnę tablicy i przechodzi wzdłuż wiersza, aby zwrócić wartość komórki. - - -## -## Math and trigonometry functions Funkcje matematyczne i trygonometryczne -## -ABS = MODUŁ.LICZBY ## Zwraca wartość absolutną liczby. -ACOS = ACOS ## Zwraca arcus cosinus liczby. -ACOSH = ACOSH ## Zwraca arcus cosinus hiperboliczny liczby. -ASIN = ASIN ## Zwraca arcus sinus liczby. -ASINH = ASINH ## Zwraca arcus sinus hiperboliczny liczby. -ATAN = ATAN ## Zwraca arcus tangens liczby. -ATAN2 = ATAN2 ## Zwraca arcus tangens liczby na podstawie współrzędnych x i y. -ATANH = ATANH ## Zwraca arcus tangens hiperboliczny liczby. -CEILING = ZAOKR.W.GƓRĘ ## Zaokrągla liczbę do najbliższej liczby całkowitej lub do najbliższej wielokrotności dokładności. -COMBIN = KOMBINACJE ## Zwraca liczbę kombinacji dla danej liczby obiektów. -COS = COS ## Zwraca cosinus liczby. -COSH = COSH ## Zwraca cosinus hiperboliczny liczby. -DEGREES = STOPNIE ## Konwertuje radiany na stopnie. -EVEN = ZAOKR.DO.PARZ ## Zaokrągla liczbę w górę do najbliższej liczby parzystej. -EXP = EXP ## Zwraca wartość liczby e podniesionej do potęgi określonej przez podaną liczbę. -FACT = SILNIA ## Zwraca silnię liczby. -FACTDOUBLE = FACTDOUBLE ## Zwraca podwójną silnię liczby. -FLOOR = ZAOKR.W.DÓŁ ## Zaokrągla liczbę w dół, w kierunku zera. -GCD = GCD ## Zwraca największy wspólny dzielnik. -INT = ZAOKR.DO.CAŁK ## Zaokrągla liczbę w dół do najbliższej liczby całkowitej. -LCM = LCM ## Zwraca najmniejszą wspólną wielokrotność. -LN = LN ## Zwraca logarytm naturalny podanej liczby. -LOG = LOG ## Zwraca logarytm danej liczby przy zadanej podstawie. -LOG10 = LOG10 ## Zwraca logarytm dziesiętny liczby. -MDETERM = WYZNACZNIK.MACIERZY ## Zwraca wyznacznik macierzy tablicy. -MINVERSE = MACIERZ.ODW ## Zwraca odwrotność macierzy tablicy. -MMULT = MACIERZ.ILOCZYN ## Zwraca iloczyn macierzy dwóch tablic. -MOD = MOD ## Zwraca resztę z dzielenia. -MROUND = MROUND ## Zwraca liczbę zaokrągloną do żądanej wielokrotności. -MULTINOMIAL = MULTINOMIAL ## Zwraca wielomian dla zbioru liczb. -ODD = ZAOKR.DO.NPARZ ## Zaokrągla liczbę w górę do najbliższej liczby nieparzystej. -PI = PI ## Zwraca wartość liczby Pi. -POWER = POTĘGA ## Zwraca liczbę podniesioną do potęgi. -PRODUCT = ILOCZYN ## Mnoży argumenty. -QUOTIENT = QUOTIENT ## Zwraca iloraz (całkowity). -RADIANS = RADIANY ## Konwertuje stopnie na radiany. -RAND = LOS ## Zwraca liczbę pseudolosową z zakresu od 0 do 1. -RANDBETWEEN = RANDBETWEEN ## Zwraca liczbę pseudolosową z zakresu określonego przez podane argumenty. -ROMAN = RZYMSKIE ## Konwertuje liczbę arabską na rzymską jako tekst. -ROUND = ZAOKR ## Zaokrągla liczbę do określonej liczby cyfr. -ROUNDDOWN = ZAOKR.DÓŁ ## Zaokrągla liczbę w dół, w kierunku zera. -ROUNDUP = ZAOKR.GƓRA ## Zaokrągla liczbę w górę, w kierunku od zera. -SERIESSUM = SERIESSUM ## Zwraca sumę szeregu potęgowego na podstawie wzoru. -SIGN = ZNAK.LICZBY ## Zwraca znak liczby. -SIN = SIN ## Zwraca sinus danego kąta. -SINH = SINH ## Zwraca sinus hiperboliczny liczby. -SQRT = PIERWIASTEK ## Zwraca dodatni pierwiastek kwadratowy. -SQRTPI = SQRTPI ## Zwraca pierwiastek kwadratowy iloczynu (liczba * Pi). -SUBTOTAL = SUMY.POŚREDNIE ## Zwraca sumę częściową listy lub bazy danych. -SUM = SUMA ## Dodaje argumenty. -SUMIF = SUMA.JEÅ»ELI ## Dodaje komórki określone przez podane kryterium. -SUMIFS = SUMA.WARUNKƓW ## Dodaje komórki w zakresie, które spełniają wiele kryteriów. -SUMPRODUCT = SUMA.ILOCZYNƓW ## Zwraca sumę iloczynów odpowiednich elementów tablicy. -SUMSQ = SUMA.KWADRATƓW ## Zwraca sumę kwadratów argumentów. -SUMX2MY2 = SUMA.X2.M.Y2 ## Zwraca sumę różnic kwadratów odpowiednich wartości w dwóch tablicach. -SUMX2PY2 = SUMA.X2.P.Y2 ## Zwraca sumę sum kwadratów odpowiednich wartości w dwóch tablicach. -SUMXMY2 = SUMA.XMY.2 ## Zwraca sumę kwadratów różnic odpowiednich wartości w dwóch tablicach. -TAN = TAN ## Zwraca tangens liczby. -TANH = TANH ## Zwraca tangens hiperboliczny liczby. -TRUNC = LICZBA.CAŁK ## Przycina liczbę do wartości całkowitej. - - -## -## Statistical functions Funkcje statystyczne -## -AVEDEV = ODCH.ŚREDNIE ## Zwraca średnią wartość odchyleń absolutnych punktów danych od ich wartości średniej. -AVERAGE = ŚREDNIA ## Zwraca wartość średnią argumentów. -AVERAGEA = ŚREDNIA.A ## Zwraca wartość średnią argumentów, z uwzględnieniem liczb, tekstów i wartości logicznych. -AVERAGEIF = ŚREDNIA.JEÅ»ELI ## Zwraca średnią (średnią arytmetyczną) wszystkich komórek w zakresie, które spełniają podane kryteria. -AVERAGEIFS = ŚREDNIA.WARUNKƓW ## Zwraca średnią (średnią arytmetyczną) wszystkich komórek, które spełniają jedno lub więcej kryteriów. -BETADIST = ROZKŁAD.BETA ## Zwraca skumulowaną funkcję gęstości prawdopodobieństwa beta. -BETAINV = ROZKŁAD.BETA.ODW ## Zwraca odwrotność skumulowanej funkcji gęstości prawdopodobieństwa beta. -BINOMDIST = ROZKŁAD.DWUM ## Zwraca pojedynczy składnik dwumianowego rozkładu prawdopodobieństwa. -CHIDIST = ROZKŁAD.CHI ## Zwraca wartość jednostronnego prawdopodobieństwa rozkładu chi-kwadrat. -CHIINV = ROZKŁAD.CHI.ODW ## Zwraca odwrotność wartości jednostronnego prawdopodobieństwa rozkładu chi-kwadrat. -CHITEST = TEST.CHI ## Zwraca test niezależności. -CONFIDENCE = UFNOŚĆ ## Zwraca interwał ufności dla średniej populacji. -CORREL = WSP.KORELACJI ## Zwraca współczynnik korelacji dwóch zbiorów danych. -COUNT = ILE.LICZB ## Zlicza liczby znajdujące się na liście argumentów. -COUNTA = ILE.NIEPUSTYCH ## Zlicza wartości znajdujące się na liście argumentów. -COUNTBLANK = LICZ.PUSTE ## Zwraca liczbę pustych komórek w pewnym zakresie. -COUNTIF = LICZ.JEÅ»ELI ## Zlicza komórki wewnątrz zakresu, które spełniają podane kryteria. -COUNTIFS = LICZ.WARUNKI ## Zlicza komórki wewnątrz zakresu, które spełniają wiele kryteriów. -COVAR = KOWARIANCJA ## Zwraca kowariancję, czyli średnią wartość iloczynów odpowiednich odchyleń. -CRITBINOM = PRƓG.ROZKŁAD.DWUM ## Zwraca najmniejszą wartość, dla której skumulowany rozkład dwumianowy jest mniejszy niż wartość kryterium lub równy jej. -DEVSQ = ODCH.KWADRATOWE ## Zwraca sumę kwadratów odchyleń. -EXPONDIST = ROZKŁAD.EXP ## Zwraca rozkład wykładniczy. -FDIST = ROZKŁAD.F ## Zwraca rozkład prawdopodobieństwa F. -FINV = ROZKŁAD.F.ODW ## Zwraca odwrotność rozkładu prawdopodobieństwa F. -FISHER = ROZKŁAD.FISHER ## Zwraca transformację Fishera. -FISHERINV = ROZKŁAD.FISHER.ODW ## Zwraca odwrotność transformacji Fishera. -FORECAST = REGLINX ## Zwraca wartość trendu liniowego. -FREQUENCY = CZĘSTOŚĆ ## Zwraca rozkład częstotliwości jako tablicę pionową. -FTEST = TEST.F ## Zwraca wynik testu F. -GAMMADIST = ROZKŁAD.GAMMA ## Zwraca rozkład gamma. -GAMMAINV = ROZKŁAD.GAMMA.ODW ## Zwraca odwrotność skumulowanego rozkładu gamma. -GAMMALN = ROZKŁAD.LIN.GAMMA ## Zwraca logarytm naturalny funkcji gamma, Ī“(x). -GEOMEAN = ŚREDNIA.GEOMETRYCZNA ## Zwraca średnią geometryczną. -GROWTH = REGEXPW ## Zwraca wartości trendu wykładniczego. -HARMEAN = ŚREDNIA.HARMONICZNA ## Zwraca średnią harmoniczną. -HYPGEOMDIST = ROZKŁAD.HIPERGEOM ## Zwraca rozkład hipergeometryczny. -INTERCEPT = ODCIĘTA ## Zwraca punkt przecięcia osi pionowej z linią regresji liniowej. -KURT = KURTOZA ## Zwraca kurtozę zbioru danych. -LARGE = MAX.K ## Zwraca k-tą największą wartość ze zbioru danych. -LINEST = REGLINP ## Zwraca parametry trendu liniowego. -LOGEST = REGEXPP ## Zwraca parametry trendu wykładniczego. -LOGINV = ROZKŁAD.LOG.ODW ## Zwraca odwrotność rozkładu logarytmu naturalnego. -LOGNORMDIST = ROZKŁAD.LOG ## Zwraca skumulowany rozkład logarytmu naturalnego. -MAX = MAX ## Zwraca maksymalną wartość listy argumentów. -MAXA = MAX.A ## Zwraca maksymalną wartość listy argumentów, z uwzględnieniem liczb, tekstów i wartości logicznych. -MEDIAN = MEDIANA ## Zwraca medianę podanych liczb. -MIN = MIN ## Zwraca minimalną wartość listy argumentów. -MINA = MIN.A ## Zwraca najmniejszą wartość listy argumentów, z uwzględnieniem liczb, tekstów i wartości logicznych. -MODE = WYST.NAJCZĘŚCIEJ ## Zwraca wartość najczęściej występującą w zbiorze danych. -NEGBINOMDIST = ROZKŁAD.DWUM.PRZEC ## Zwraca ujemny rozkład dwumianowy. -NORMDIST = ROZKŁAD.NORMALNY ## Zwraca rozkład normalny skumulowany. -NORMINV = ROZKŁAD.NORMALNY.ODW ## Zwraca odwrotność rozkładu normalnego skumulowanego. -NORMSDIST = ROZKŁAD.NORMALNY.S ## Zwraca standardowy rozkład normalny skumulowany. -NORMSINV = ROZKŁAD.NORMALNY.S.ODW ## Zwraca odwrotność standardowego rozkładu normalnego skumulowanego. -PEARSON = PEARSON ## Zwraca współczynnik korelacji momentu iloczynu Pearsona. -PERCENTILE = PERCENTYL ## Wyznacza k-ty percentyl wartości w zakresie. -PERCENTRANK = PROCENT.POZYCJA ## Zwraca procentową pozycję wartości w zbiorze danych. -PERMUT = PERMUTACJE ## Zwraca liczbę permutacji dla danej liczby obiektów. -POISSON = ROZKŁAD.POISSON ## Zwraca rozkład Poissona. -PROB = PRAWDPD ## Zwraca prawdopodobieństwo, że wartości w zakresie leżą pomiędzy dwiema granicami. -QUARTILE = KWARTYL ## Wyznacza kwartyl zbioru danych. -RANK = POZYCJA ## Zwraca pozycję liczby na liście liczb. -RSQ = R.KWADRAT ## Zwraca kwadrat współczynnika korelacji momentu iloczynu Pearsona. -SKEW = SKOŚNOŚĆ ## Zwraca skośność rozkładu. -SLOPE = NACHYLENIE ## Zwraca nachylenie linii regresji liniowej. -SMALL = MIN.K ## Zwraca k-tą najmniejszą wartość ze zbioru danych. -STANDARDIZE = NORMALIZUJ ## Zwraca wartość znormalizowaną. -STDEV = ODCH.STANDARDOWE ## Szacuje odchylenie standardowe na podstawie próbki. -STDEVA = ODCH.STANDARDOWE.A ## Szacuje odchylenie standardowe na podstawie próbki, z uwzględnieniem liczb, tekstów i wartości logicznych. -STDEVP = ODCH.STANDARD.POPUL ## Oblicza odchylenie standardowe na podstawie całej populacji. -STDEVPA = ODCH.STANDARD.POPUL.A ## Oblicza odchylenie standardowe na podstawie całej populacji, z uwzględnieniem liczb, teksów i wartości logicznych. -STEYX = REGBŁSTD ## Zwraca błąd standardowy przewidzianej wartości y dla każdej wartości x w regresji. -TDIST = ROZKŁAD.T ## Zwraca rozkład t-Studenta. -TINV = ROZKŁAD.T.ODW ## Zwraca odwrotność rozkładu t-Studenta. -TREND = REGLINW ## Zwraca wartości trendu liniowego. -TRIMMEAN = ŚREDNIA.WEWN ## Zwraca średnią wartość dla wnętrza zbioru danych. -TTEST = TEST.T ## Zwraca prawdopodobieństwo związane z testem t-Studenta. -VAR = WARIANCJA ## Szacuje wariancję na podstawie próbki. -VARA = WARIANCJA.A ## Szacuje wariancję na podstawie próbki, z uwzględnieniem liczb, tekstów i wartości logicznych. -VARP = WARIANCJA.POPUL ## Oblicza wariancję na podstawie całej populacji. -VARPA = WARIANCJA.POPUL.A ## Oblicza wariancję na podstawie całej populacji, z uwzględnieniem liczb, tekstów i wartości logicznych. -WEIBULL = ROZKŁAD.WEIBULL ## Zwraca rozkład Weibulla. -ZTEST = TEST.Z ## Zwraca wartość jednostronnego prawdopodobieństwa testu z. - - -## -## Text functions Funkcje tekstowe -## -ASC = ASC ## Zamienia litery angielskie lub katakana o pełnej szerokości (dwubajtowe) w ciągu znaków na znaki o szerokości połówkowej (jednobajtowe). -BAHTTEXT = BAHTTEXT ## Konwertuje liczbę na tekst, stosując format walutowy ß (baht). -CHAR = ZNAK ## Zwraca znak o podanym numerze kodu. -CLEAN = OCZYŚĆ ## Usuwa z tekstu wszystkie znaki, które nie mogą być drukowane. -CODE = KOD ## Zwraca kod numeryczny pierwszego znaku w ciągu tekstowym. -CONCATENATE = ZŁĄCZ.TEKSTY ## Łączy kilka oddzielnych tekstów w jeden tekst. -DOLLAR = KWOTA ## Konwertuje liczbę na tekst, stosując format walutowy $ (dolar). -EXACT = PORƓWNAJ ## Sprawdza identyczność dwóch wartości tekstowych. -FIND = ZNAJDŹ ## Znajduje jedną wartość tekstową wewnątrz innej (z uwzględnieniem wielkich i małych liter). -FINDB = ZNAJDŹB ## Znajduje jedną wartość tekstową wewnątrz innej (z uwzględnieniem wielkich i małych liter). -FIXED = ZAOKR.DO.TEKST ## Formatuje liczbę jako tekst przy stałej liczbie miejsc dziesiętnych. -JIS = JIS ## Zmienia litery angielskie lub katakana o szerokości połówkowej (jednobajtowe) w ciągu znaków na znaki o pełnej szerokości (dwubajtowe). -LEFT = LEWY ## Zwraca skrajne lewe znaki z wartości tekstowej. -LEFTB = LEWYB ## Zwraca skrajne lewe znaki z wartości tekstowej. -LEN = DŁ ## Zwraca liczbę znaków ciągu tekstowego. -LENB = DŁ.B ## Zwraca liczbę znaków ciągu tekstowego. -LOWER = LITERY.MAŁE ## Konwertuje wielkie litery tekstu na małe litery. -MID = FRAGMENT.TEKSTU ## Zwraca określoną liczbę znaków z ciągu tekstowego, zaczynając od zadanej pozycji. -MIDB = FRAGMENT.TEKSTU.B ## Zwraca określoną liczbę znaków z ciągu tekstowego, zaczynając od zadanej pozycji. -PHONETIC = PHONETIC ## Wybiera znaki fonetyczne (furigana) z ciągu tekstowego. -PROPER = Z.WIELKIEJ.LITERY ## Zastępuje pierwszą literę każdego wyrazu tekstu wielką literą. -REPLACE = ZASTĄP ## Zastępuje znaki w tekście. -REPLACEB = ZASTĄP.B ## Zastępuje znaki w tekście. -REPT = POWT ## Powiela tekst daną liczbę razy. -RIGHT = PRAWY ## Zwraca skrajne prawe znaki z wartości tekstowej. -RIGHTB = PRAWYB ## Zwraca skrajne prawe znaki z wartości tekstowej. -SEARCH = SZUKAJ.TEKST ## Wyszukuje jedną wartość tekstową wewnątrz innej (bez uwzględniania wielkości liter). -SEARCHB = SZUKAJ.TEKST.B ## Wyszukuje jedną wartość tekstową wewnątrz innej (bez uwzględniania wielkości liter). -SUBSTITUTE = PODSTAW ## Podstawia nowy tekst w miejsce poprzedniego tekstu w ciągu tekstowym. -T = T ## Konwertuje argumenty na tekst. -TEXT = TEKST ## Formatuje liczbę i konwertuje ją na tekst. -TRIM = USUŃ.ZBĘDNE.ODSTĘPY ## Usuwa spacje z tekstu. -UPPER = LITERY.WIELKIE ## Konwertuje znaki tekstu na wielkie litery. -VALUE = WARTOŚĆ ## Konwertuje argument tekstowy na liczbę. diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/config deleted file mode 100644 index 904f99f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = R$ - - -## -## Excel Error Codes (For future use) - -## -NULL = #NULO! -DIV0 = #DIV/0! -VALUE = #VALOR! -REF = #REF! -NAME = #NOME? -NUM = #NÚM! -NA = #N/D diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/functions deleted file mode 100644 index a062a7f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/br/functions +++ /dev/null @@ -1,408 +0,0 @@ -## -## Add-in and Automation functions FunƧƵes Suplemento e Automação -## -GETPIVOTDATA = INFODADOSTABELADINƂMICA ## Retorna os dados armazenados em um relatório de tabela dinĆ¢mica - - -## -## Cube functions FunƧƵes de Cubo -## -CUBEKPIMEMBER = MEMBROKPICUBO ## Retorna o nome de um KPI (indicador de desempenho-chave), uma propriedade e uma medida e exibe o nome e a propriedade na cĆ©lula. Um KPI Ć© uma medida quantificĆ”vel, como o lucro bruto mensal ou a rotatividade trimestral dos funcionĆ”rios, usada para monitorar o desempenho de uma organização. -CUBEMEMBER = MEMBROCUBO ## Retorna um membro ou tupla em uma hierarquia de cubo. Use para validar se o membro ou tupla existe no cubo. -CUBEMEMBERPROPERTY = PROPRIEDADEMEMBROCUBO ## Retorna o valor da propriedade de um membro no cubo. Usada para validar a existĆŖncia do nome do membro no cubo e para retornar a propriedade especificada para esse membro. -CUBERANKEDMEMBER = MEMBROCLASSIFICADOCUBO ## Retorna o enĆ©simo membro, ou o membro ordenado, em um conjunto. Use para retornar um ou mais elementos em um conjunto, assim como o melhor vendedor ou os dez melhores alunos. -CUBESET = CONJUNTOCUBO ## Define um conjunto calculado de membros ou tuplas enviando uma expressĆ£o do conjunto para o cubo no servidor, que cria o conjunto e o retorna para o Microsoft Office Excel. -CUBESETCOUNT = CONTAGEMCONJUNTOCUBO ## Retorna o nĆŗmero de itens em um conjunto. -CUBEVALUE = VALORCUBO ## Retorna um valor agregado de um cubo. - - -## -## Database functions FunƧƵes de banco de dados -## -DAVERAGE = BDMƉDIA ## Retorna a mĆ©dia das entradas selecionadas de um banco de dados -DCOUNT = BDCONTAR ## Conta as cĆ©lulas que contĆŖm nĆŗmeros em um banco de dados -DCOUNTA = BDCONTARA ## Conta cĆ©lulas nĆ£o vazias em um banco de dados -DGET = BDEXTRAIR ## Extrai de um banco de dados um Ćŗnico registro que corresponde a um critĆ©rio especĆ­fico -DMAX = BDMƁX ## Retorna o valor mĆ”ximo de entradas selecionadas de um banco de dados -DMIN = BDMƍN ## Retorna o valor mĆ­nimo de entradas selecionadas de um banco de dados -DPRODUCT = BDMULTIPL ## Multiplica os valores em um campo especĆ­fico de registros que correspondem ao critĆ©rio em um banco de dados -DSTDEV = BDEST ## Estima o desvio padrĆ£o com base em uma amostra de entradas selecionadas de um banco de dados -DSTDEVP = BDDESVPA ## Calcula o desvio padrĆ£o com base na população inteira de entradas selecionadas de um banco de dados -DSUM = BDSOMA ## Adiciona os nĆŗmeros Ć  coluna de campos de registros do banco de dados que correspondem ao critĆ©rio -DVAR = BDVAREST ## Estima a variĆ¢ncia com base em uma amostra de entradas selecionadas de um banco de dados -DVARP = BDVARP ## Calcula a variĆ¢ncia com base na população inteira de entradas selecionadas de um banco de dados - - -## -## Date and time functions FunƧƵes de data e hora -## -DATE = DATA ## Retorna o nĆŗmero de sĆ©rie de uma data especĆ­fica -DATEVALUE = DATA.VALOR ## Converte uma data na forma de texto para um nĆŗmero de sĆ©rie -DAY = DIA ## Converte um nĆŗmero de sĆ©rie em um dia do mĆŖs -DAYS360 = DIAS360 ## Calcula o nĆŗmero de dias entre duas datas com base em um ano de 360 dias -EDATE = DATAM ## Retorna o nĆŗmero de sĆ©rie da data que Ć© o nĆŗmero indicado de meses antes ou depois da data inicial -EOMONTH = FIMMÊS ## Retorna o nĆŗmero de sĆ©rie do Ćŗltimo dia do mĆŖs antes ou depois de um nĆŗmero especificado de meses -HOUR = HORA ## Converte um nĆŗmero de sĆ©rie em uma hora -MINUTE = MINUTO ## Converte um nĆŗmero de sĆ©rie em um minuto -MONTH = MÊS ## Converte um nĆŗmero de sĆ©rie em um mĆŖs -NETWORKDAYS = DIATRABALHOTOTAL ## Retorna o nĆŗmero de dias Ćŗteis inteiros entre duas datas -NOW = AGORA ## Retorna o nĆŗmero de sĆ©rie seqüencial da data e hora atuais -SECOND = SEGUNDO ## Converte um nĆŗmero de sĆ©rie em um segundo -TIME = HORA ## Retorna o nĆŗmero de sĆ©rie de uma hora especĆ­fica -TIMEVALUE = VALOR.TEMPO ## Converte um horĆ”rio na forma de texto para um nĆŗmero de sĆ©rie -TODAY = HOJE ## Retorna o nĆŗmero de sĆ©rie da data de hoje -WEEKDAY = DIA.DA.SEMANA ## Converte um nĆŗmero de sĆ©rie em um dia da semana -WEEKNUM = NÚMSEMANA ## Converte um nĆŗmero de sĆ©rie em um nĆŗmero que representa onde a semana cai numericamente em um ano -WORKDAY = DIATRABALHO ## Retorna o nĆŗmero de sĆ©rie da data antes ou depois de um nĆŗmero especĆ­fico de dias Ćŗteis -YEAR = ANO ## Converte um nĆŗmero de sĆ©rie em um ano -YEARFRAC = FRAƇƃOANO ## Retorna a fração do ano que representa o nĆŗmero de dias entre data_inicial e data_final - - -## -## Engineering functions FunƧƵes de engenharia -## -BESSELI = BESSELI ## Retorna a função de Bessel In(x) modificada -BESSELJ = BESSELJ ## Retorna a função de Bessel Jn(x) -BESSELK = BESSELK ## Retorna a função de Bessel Kn(x) modificada -BESSELY = BESSELY ## Retorna a função de Bessel Yn(x) -BIN2DEC = BIN2DEC ## Converte um nĆŗmero binĆ”rio em decimal -BIN2HEX = BIN2HEX ## Converte um nĆŗmero binĆ”rio em hexadecimal -BIN2OCT = BIN2OCT ## Converte um nĆŗmero binĆ”rio em octal -COMPLEX = COMPLEX ## Converte coeficientes reais e imaginĆ”rios e um nĆŗmero complexo -CONVERT = CONVERTER ## Converte um nĆŗmero de um sistema de medida para outro -DEC2BIN = DECABIN ## Converte um nĆŗmero decimal em binĆ”rio -DEC2HEX = DECAHEX ## Converte um nĆŗmero decimal em hexadecimal -DEC2OCT = DECAOCT ## Converte um nĆŗmero decimal em octal -DELTA = DELTA ## Testa se dois valores sĆ£o iguais -ERF = FUNERRO ## Retorna a função de erro -ERFC = FUNERROCOMPL ## Retorna a função de erro complementar -GESTEP = DEGRAU ## Testa se um nĆŗmero Ć© maior do que um valor limite -HEX2BIN = HEXABIN ## Converte um nĆŗmero hexadecimal em binĆ”rio -HEX2DEC = HEXADEC ## Converte um nĆŗmero hexadecimal em decimal -HEX2OCT = HEXAOCT ## Converte um nĆŗmero hexadecimal em octal -IMABS = IMABS ## Retorna o valor absoluto (módulo) de um nĆŗmero complexo -IMAGINARY = IMAGINƁRIO ## Retorna o coeficiente imaginĆ”rio de um nĆŗmero complexo -IMARGUMENT = IMARG ## Retorna o argumento teta, um Ć¢ngulo expresso em radianos -IMCONJUGATE = IMCONJ ## Retorna o conjugado complexo de um nĆŗmero complexo -IMCOS = IMCOS ## Retorna o cosseno de um nĆŗmero complexo -IMDIV = IMDIV ## Retorna o quociente de dois nĆŗmeros complexos -IMEXP = IMEXP ## Retorna o exponencial de um nĆŗmero complexo -IMLN = IMLN ## Retorna o logaritmo natural de um nĆŗmero complexo -IMLOG10 = IMLOG10 ## Retorna o logaritmo de base 10 de um nĆŗmero complexo -IMLOG2 = IMLOG2 ## Retorna o logaritmo de base 2 de um nĆŗmero complexo -IMPOWER = IMPOT ## Retorna um nĆŗmero complexo elevado a uma potĆŖncia inteira -IMPRODUCT = IMPROD ## Retorna o produto de nĆŗmeros complexos -IMREAL = IMREAL ## Retorna o coeficiente real de um nĆŗmero complexo -IMSIN = IMSENO ## Retorna o seno de um nĆŗmero complexo -IMSQRT = IMRAIZ ## Retorna a raiz quadrada de um nĆŗmero complexo -IMSUB = IMSUBTR ## Retorna a diferenƧa entre dois nĆŗmeros complexos -IMSUM = IMSOMA ## Retorna a soma de nĆŗmeros complexos -OCT2BIN = OCTABIN ## Converte um nĆŗmero octal em binĆ”rio -OCT2DEC = OCTADEC ## Converte um nĆŗmero octal em decimal -OCT2HEX = OCTAHEX ## Converte um nĆŗmero octal em hexadecimal - - -## -## Financial functions FunƧƵes financeiras -## -ACCRINT = JUROSACUM ## Retorna a taxa de juros acumulados de um tĆ­tulo que paga uma taxa periódica de juros -ACCRINTM = JUROSACUMV ## Retorna os juros acumulados de um tĆ­tulo que paga juros no vencimento -AMORDEGRC = AMORDEGRC ## Retorna a depreciação para cada perĆ­odo contĆ”bil usando o coeficiente de depreciação -AMORLINC = AMORLINC ## Retorna a depreciação para cada perĆ­odo contĆ”bil -COUPDAYBS = CUPDIASINLIQ ## Retorna o nĆŗmero de dias do inĆ­cio do perĆ­odo de cupom atĆ© a data de liquidação -COUPDAYS = CUPDIAS ## Retorna o nĆŗmero de dias no perĆ­odo de cupom que contĆ©m a data de quitação -COUPDAYSNC = CUPDIASPRƓX ## Retorna o nĆŗmero de dias da data de liquidação atĆ© a data do próximo cupom -COUPNCD = CUPDATAPRƓX ## Retorna a próxima data de cupom após a data de quitação -COUPNUM = CUPNÚM ## Retorna o nĆŗmero de cupons pagĆ”veis entre as datas de quitação e vencimento -COUPPCD = CUPDATAANT ## Retorna a data de cupom anterior Ć  data de quitação -CUMIPMT = PGTOJURACUM ## Retorna os juros acumulados pagos entre dois perĆ­odos -CUMPRINC = PGTOCAPACUM ## Retorna o capital acumulado pago sobre um emprĆ©stimo entre dois perĆ­odos -DB = BD ## Retorna a depreciação de um ativo para um perĆ­odo especificado, usando o mĆ©todo de balanƧo de declĆ­nio fixo -DDB = BDD ## Retorna a depreciação de um ativo com relação a um perĆ­odo especificado usando o mĆ©todo de saldos decrescentes duplos ou qualquer outro mĆ©todo especificado por vocĆŖ -DISC = DESC ## Retorna a taxa de desconto de um tĆ­tulo -DOLLARDE = MOEDADEC ## Converte um preƧo em formato de moeda, na forma fracionĆ”ria, em um preƧo na forma decimal -DOLLARFR = MOEDAFRA ## Converte um preƧo, apresentado na forma decimal, em um preƧo apresentado na forma fracionĆ”ria -DURATION = DURAƇƃO ## Retorna a duração anual de um tĆ­tulo com pagamentos de juros periódicos -EFFECT = EFETIVA ## Retorna a taxa de juros anual efetiva -FV = VF ## Retorna o valor futuro de um investimento -FVSCHEDULE = VFPLANO ## Retorna o valor futuro de um capital inicial após a aplicação de uma sĆ©rie de taxas de juros compostas -INTRATE = TAXAJUROS ## Retorna a taxa de juros de um tĆ­tulo totalmente investido -IPMT = IPGTO ## Retorna o pagamento de juros para um investimento em um determinado perĆ­odo -IRR = TIR ## Retorna a taxa interna de retorno de uma sĆ©rie de fluxos de caixa -ISPMT = ƉPGTO ## Calcula os juros pagos durante um perĆ­odo especĆ­fico de um investimento -MDURATION = MDURAƇƃO ## Retorna a duração de Macauley modificada para um tĆ­tulo com um valor de paridade equivalente a R$ 100 -MIRR = MTIR ## Calcula a taxa interna de retorno em que fluxos de caixa positivos e negativos sĆ£o financiados com diferentes taxas -NOMINAL = NOMINAL ## Retorna a taxa de juros nominal anual -NPER = NPER ## Retorna o nĆŗmero de perĆ­odos de um investimento -NPV = VPL ## Retorna o valor lĆ­quido atual de um investimento com base em uma sĆ©rie de fluxos de caixa periódicos e em uma taxa de desconto -ODDFPRICE = PREƇOPRIMINC ## Retorna o preƧo por R$ 100 de valor nominal de um tĆ­tulo com um primeiro perĆ­odo indefinido -ODDFYIELD = LUCROPRIMINC ## Retorna o rendimento de um tĆ­tulo com um primeiro perĆ­odo indefinido -ODDLPRICE = PREƇOÚLTINC ## Retorna o preƧo por R$ 100 de valor nominal de um tĆ­tulo com um Ćŗltimo perĆ­odo de cupom indefinido -ODDLYIELD = LUCROÚLTINC ## Retorna o rendimento de um tĆ­tulo com um Ćŗltimo perĆ­odo indefinido -PMT = PGTO ## Retorna o pagamento periódico de uma anuidade -PPMT = PPGTO ## Retorna o pagamento de capital para determinado perĆ­odo de investimento -PRICE = PREƇO ## Retorna a preƧo por R$ 100,00 de valor nominal de um tĆ­tulo que paga juros periódicos -PRICEDISC = PREƇODESC ## Retorna o preƧo por R$ 100,00 de valor nominal de um tĆ­tulo descontado -PRICEMAT = PREƇOVENC ## Retorna o preƧo por R$ 100,00 de valor nominal de um tĆ­tulo que paga juros no vencimento -PV = VP ## Retorna o valor presente de um investimento -RATE = TAXA ## Retorna a taxa de juros por perĆ­odo de uma anuidade -RECEIVED = RECEBER ## Retorna a quantia recebida no vencimento de um tĆ­tulo totalmente investido -SLN = DPD ## Retorna a depreciação em linha reta de um ativo durante um perĆ­odo -SYD = SDA ## Retorna a depreciação dos dĆ­gitos da soma dos anos de um ativo para um perĆ­odo especificado -TBILLEQ = OTN ## Retorna o rendimento de um tĆ­tulo equivalente a uma obrigação do Tesouro -TBILLPRICE = OTNVALOR ## Retorna o preƧo por R$ 100,00 de valor nominal de uma obrigação do Tesouro -TBILLYIELD = OTNLUCRO ## Retorna o rendimento de uma obrigação do Tesouro -VDB = BDV ## Retorna a depreciação de um ativo para um perĆ­odo especificado ou parcial usando um mĆ©todo de balanƧo declinante -XIRR = XTIR ## Fornece a taxa interna de retorno para um programa de fluxos de caixa que nĆ£o Ć© necessariamente periódico -XNPV = XVPL ## Retorna o valor presente lĆ­quido de um programa de fluxos de caixa que nĆ£o Ć© necessariamente periódico -YIELD = LUCRO ## Retorna o lucro de um tĆ­tulo que paga juros periódicos -YIELDDISC = LUCRODESC ## Retorna o rendimento anual de um tĆ­tulo descontado. Por exemplo, uma obrigação do Tesouro -YIELDMAT = LUCROVENC ## Retorna o lucro anual de um tĆ­tulo que paga juros no vencimento - - -## -## Information functions FunƧƵes de informação -## -CELL = CƉL ## Retorna informaƧƵes sobre formatação, localização ou conteĆŗdo de uma cĆ©lula -ERROR.TYPE = TIPO.ERRO ## Retorna um nĆŗmero correspondente a um tipo de erro -INFO = INFORMAƇƃO ## Retorna informaƧƵes sobre o ambiente operacional atual -ISBLANK = ƉCƉL.VAZIA ## Retorna VERDADEIRO se o valor for vazio -ISERR = ƉERRO ## Retorna VERDADEIRO se o valor for um valor de erro diferente de #N/D -ISERROR = ƉERROS ## Retorna VERDADEIRO se o valor for um valor de erro -ISEVEN = ƉPAR ## Retorna VERDADEIRO se o nĆŗmero for par -ISLOGICAL = ƉLƓGICO ## Retorna VERDADEIRO se o valor for um valor lógico -ISNA = Ɖ.NƃO.DISP ## Retorna VERDADEIRO se o valor for o valor de erro #N/D -ISNONTEXT = Ɖ.NƃO.TEXTO ## Retorna VERDADEIRO se o valor for diferente de texto -ISNUMBER = ƉNÚM ## Retorna VERDADEIRO se o valor for um nĆŗmero -ISODD = ƉIMPAR ## Retorna VERDADEIRO se o nĆŗmero for Ć­mpar -ISREF = ƉREF ## Retorna VERDADEIRO se o valor for uma referĆŖncia -ISTEXT = ƉTEXTO ## Retorna VERDADEIRO se o valor for texto -N = N ## Retorna um valor convertido em um nĆŗmero -NA = NƃO.DISP ## Retorna o valor de erro #N/D -TYPE = TIPO ## Retorna um nĆŗmero indicando o tipo de dados de um valor - - -## -## Logical functions FunƧƵes lógicas -## -AND = E ## Retorna VERDADEIRO se todos os seus argumentos forem VERDADEIROS -FALSE = FALSO ## Retorna o valor lógico FALSO -IF = SE ## Especifica um teste lógico a ser executado -IFERROR = SEERRO ## RetornarĆ” um valor que vocĆŖ especifica se uma fórmula for avaliada para um erro; do contrĆ”rio, retornarĆ” o resultado da fórmula -NOT = NƃO ## Inverte o valor lógico do argumento -OR = OU ## Retorna VERDADEIRO se um dos argumentos for VERDADEIRO -TRUE = VERDADEIRO ## Retorna o valor lógico VERDADEIRO - - -## -## Lookup and reference functions FunƧƵes de pesquisa e referĆŖncia -## -ADDRESS = ENDEREƇO ## Retorna uma referĆŖncia como texto para uma Ćŗnica cĆ©lula em uma planilha -AREAS = ƁREAS ## Retorna o nĆŗmero de Ć”reas em uma referĆŖncia -CHOOSE = ESCOLHER ## Escolhe um valor a partir de uma lista de valores -COLUMN = COL ## Retorna o nĆŗmero da coluna de uma referĆŖncia -COLUMNS = COLS ## Retorna o nĆŗmero de colunas em uma referĆŖncia -HLOOKUP = PROCH ## Procura na linha superior de uma matriz e retorna o valor da cĆ©lula especificada -HYPERLINK = HYPERLINK ## Cria um atalho ou salto que abre um documento armazenado em um servidor de rede, uma intranet ou na Internet -INDEX = ƍNDICE ## Usa um Ć­ndice para escolher um valor de uma referĆŖncia ou matriz -INDIRECT = INDIRETO ## Retorna uma referĆŖncia indicada por um valor de texto -LOOKUP = PROC ## Procura valores em um vetor ou em uma matriz -MATCH = CORRESP ## Procura valores em uma referĆŖncia ou em uma matriz -OFFSET = DESLOC ## Retorna um deslocamento de referĆŖncia com base em uma determinada referĆŖncia -ROW = LIN ## Retorna o nĆŗmero da linha de uma referĆŖncia -ROWS = LINS ## Retorna o nĆŗmero de linhas em uma referĆŖncia -RTD = RTD ## Recupera dados em tempo real de um programa que ofereƧa suporte a automação COM (automação: uma forma de trabalhar com objetos de um aplicativo a partir de outro aplicativo ou ferramenta de desenvolvimento. Chamada inicialmente de automação OLE, a automação Ć© um padrĆ£o industrial e um recurso do modelo de objeto componente (COM).) -TRANSPOSE = TRANSPOR ## Retorna a transposição de uma matriz -VLOOKUP = PROCV ## Procura na primeira coluna de uma matriz e move ao longo da linha para retornar o valor de uma cĆ©lula - - -## -## Math and trigonometry functions FunƧƵes matemĆ”ticas e trigonomĆ©tricas -## -ABS = ABS ## Retorna o valor absoluto de um nĆŗmero -ACOS = ACOS ## Retorna o arco cosseno de um nĆŗmero -ACOSH = ACOSH ## Retorna o cosseno hiperbólico inverso de um nĆŗmero -ASIN = ASEN ## Retorna o arco seno de um nĆŗmero -ASINH = ASENH ## Retorna o seno hiperbólico inverso de um nĆŗmero -ATAN = ATAN ## Retorna o arco tangente de um nĆŗmero -ATAN2 = ATAN2 ## Retorna o arco tangente das coordenadas x e y especificadas -ATANH = ATANH ## Retorna a tangente hiperbólica inversa de um nĆŗmero -CEILING = TETO ## Arredonda um nĆŗmero para o inteiro mais próximo ou para o mĆŗltiplo mais próximo de significĆ¢ncia -COMBIN = COMBIN ## Retorna o nĆŗmero de combinaƧƵes de um determinado nĆŗmero de objetos -COS = COS ## Retorna o cosseno de um nĆŗmero -COSH = COSH ## Retorna o cosseno hiperbólico de um nĆŗmero -DEGREES = GRAUS ## Converte radianos em graus -EVEN = PAR ## Arredonda um nĆŗmero para cima atĆ© o inteiro par mais próximo -EXP = EXP ## Retorna e elevado Ć  potĆŖncia de um nĆŗmero especificado -FACT = FATORIAL ## Retorna o fatorial de um nĆŗmero -FACTDOUBLE = FATDUPLO ## Retorna o fatorial duplo de um nĆŗmero -FLOOR = ARREDMULTB ## Arredonda um nĆŗmero para baixo atĆ© zero -GCD = MDC ## Retorna o mĆ”ximo divisor comum -INT = INT ## Arredonda um nĆŗmero para baixo atĆ© o nĆŗmero inteiro mais próximo -LCM = MMC ## Retorna o mĆ­nimo mĆŗltiplo comum -LN = LN ## Retorna o logaritmo natural de um nĆŗmero -LOG = LOG ## Retorna o logaritmo de um nĆŗmero de uma base especificada -LOG10 = LOG10 ## Retorna o logaritmo de base 10 de um nĆŗmero -MDETERM = MATRIZ.DETERM ## Retorna o determinante de uma matriz de uma variĆ”vel do tipo matriz -MINVERSE = MATRIZ.INVERSO ## Retorna a matriz inversa de uma matriz -MMULT = MATRIZ.MULT ## Retorna o produto de duas matrizes -MOD = RESTO ## Retorna o resto da divisĆ£o -MROUND = MARRED ## Retorna um nĆŗmero arredondado ao mĆŗltiplo desejado -MULTINOMIAL = MULTINOMIAL ## Retorna o multinomial de um conjunto de nĆŗmeros -ODD = ƍMPAR ## Arredonda um nĆŗmero para cima atĆ© o inteiro Ć­mpar mais próximo -PI = PI ## Retorna o valor de Pi -POWER = POTÊNCIA ## Fornece o resultado de um nĆŗmero elevado a uma potĆŖncia -PRODUCT = MULT ## Multiplica seus argumentos -QUOTIENT = QUOCIENTE ## Retorna a parte inteira de uma divisĆ£o -RADIANS = RADIANOS ## Converte graus em radianos -RAND = ALEATƓRIO ## Retorna um nĆŗmero aleatório entre 0 e 1 -RANDBETWEEN = ALEATƓRIOENTRE ## Retorna um nĆŗmero aleatório entre os nĆŗmeros especificados -ROMAN = ROMANO ## Converte um algarismo arĆ”bico em romano, como texto -ROUND = ARRED ## Arredonda um nĆŗmero atĆ© uma quantidade especificada de dĆ­gitos -ROUNDDOWN = ARREDONDAR.PARA.BAIXO ## Arredonda um nĆŗmero para baixo atĆ© zero -ROUNDUP = ARREDONDAR.PARA.CIMA ## Arredonda um nĆŗmero para cima, afastando-o de zero -SERIESSUM = SOMASEQÜÊNCIA ## Retorna a soma de uma sĆ©rie polinomial baseada na fórmula -SIGN = SINAL ## Retorna o sinal de um nĆŗmero -SIN = SEN ## Retorna o seno de um Ć¢ngulo dado -SINH = SENH ## Retorna o seno hiperbólico de um nĆŗmero -SQRT = RAIZ ## Retorna uma raiz quadrada positiva -SQRTPI = RAIZPI ## Retorna a raiz quadrada de (nĆŗm* pi) -SUBTOTAL = SUBTOTAL ## Retorna um subtotal em uma lista ou em um banco de dados -SUM = SOMA ## Soma seus argumentos -SUMIF = SOMASE ## Adiciona as cĆ©lulas especificadas por um determinado critĆ©rio -SUMIFS = SOMASE ## Adiciona as cĆ©lulas em um intervalo que atende a vĆ”rios critĆ©rios -SUMPRODUCT = SOMARPRODUTO ## Retorna a soma dos produtos de componentes correspondentes de matrizes -SUMSQ = SOMAQUAD ## Retorna a soma dos quadrados dos argumentos -SUMX2MY2 = SOMAX2DY2 ## Retorna a soma da diferenƧa dos quadrados dos valores correspondentes em duas matrizes -SUMX2PY2 = SOMAX2SY2 ## Retorna a soma da soma dos quadrados dos valores correspondentes em duas matrizes -SUMXMY2 = SOMAXMY2 ## Retorna a soma dos quadrados das diferenƧas dos valores correspondentes em duas matrizes -TAN = TAN ## Retorna a tangente de um nĆŗmero -TANH = TANH ## Retorna a tangente hiperbólica de um nĆŗmero -TRUNC = TRUNCAR ## Trunca um nĆŗmero para um inteiro - - -## -## Statistical functions FunƧƵes estatĆ­sticas -## -AVEDEV = DESV.MƉDIO ## Retorna a mĆ©dia aritmĆ©tica dos desvios mĆ©dios dos pontos de dados a partir de sua mĆ©dia -AVERAGE = MƉDIA ## Retorna a mĆ©dia dos argumentos -AVERAGEA = MƉDIAA ## Retorna a mĆ©dia dos argumentos, inclusive nĆŗmeros, texto e valores lógicos -AVERAGEIF = MƉDIASE ## Retorna a mĆ©dia (mĆ©dia aritmĆ©tica) de todas as cĆ©lulas em um intervalo que atendem a um determinado critĆ©rio -AVERAGEIFS = MƉDIASES ## Retorna a mĆ©dia (mĆ©dia aritmĆ©tica) de todas as cĆ©lulas que atendem a mĆŗltiplos critĆ©rios. -BETADIST = DISTBETA ## Retorna a função de distribuição cumulativa beta -BETAINV = BETA.ACUM.INV ## Retorna o inverso da função de distribuição cumulativa para uma distribuição beta especificada -BINOMDIST = DISTRBINOM ## Retorna a probabilidade de distribuição binomial do termo individual -CHIDIST = DIST.QUI ## Retorna a probabilidade unicaudal da distribuição qui-quadrada -CHIINV = INV.QUI ## Retorna o inverso da probabilidade uni-caudal da distribuição qui-quadrada -CHITEST = TESTE.QUI ## Retorna o teste para independĆŖncia -CONFIDENCE = INT.CONFIANƇA ## Retorna o intervalo de confianƧa para uma mĆ©dia da população -CORREL = CORREL ## Retorna o coeficiente de correlação entre dois conjuntos de dados -COUNT = CONT.NÚM ## Calcula quantos nĆŗmeros hĆ” na lista de argumentos -COUNTA = CONT.VALORES ## Calcula quantos valores hĆ” na lista de argumentos -COUNTBLANK = CONTAR.VAZIO ## Conta o nĆŗmero de cĆ©lulas vazias no intervalo especificado -COUNTIF = CONT.SE ## Calcula o nĆŗmero de cĆ©lulas nĆ£o vazias em um intervalo que corresponde a determinados critĆ©rios -COUNTIFS = CONT.SES ## Conta o nĆŗmero de cĆ©lulas dentro de um intervalo que atende a mĆŗltiplos critĆ©rios -COVAR = COVAR ## Retorna a covariĆ¢ncia, a mĆ©dia dos produtos dos desvios pares -CRITBINOM = CRIT.BINOM ## Retorna o menor valor para o qual a distribuição binomial cumulativa Ć© menor ou igual ao valor padrĆ£o -DEVSQ = DESVQ ## Retorna a soma dos quadrados dos desvios -EXPONDIST = DISTEXPON ## Retorna a distribuição exponencial -FDIST = DISTF ## Retorna a distribuição de probabilidade F -FINV = INVF ## Retorna o inverso da distribuição de probabilidades F -FISHER = FISHER ## Retorna a transformação Fisher -FISHERINV = FISHERINV ## Retorna o inverso da transformação Fisher -FORECAST = PREVISƃO ## Retorna um valor ao longo de uma linha reta -FREQUENCY = FREQÜÊNCIA ## Retorna uma distribuição de freqüência como uma matriz vertical -FTEST = TESTEF ## Retorna o resultado de um teste F -GAMMADIST = DISTGAMA ## Retorna a distribuição gama -GAMMAINV = INVGAMA ## Retorna o inverso da distribuição cumulativa gama -GAMMALN = LNGAMA ## Retorna o logaritmo natural da função gama, G(x) -GEOMEAN = MƉDIA.GEOMƉTRICA ## Retorna a mĆ©dia geomĆ©trica -GROWTH = CRESCIMENTO ## Retorna valores ao longo de uma tendĆŖncia exponencial -HARMEAN = MƉDIA.HARMƔNICA ## Retorna a mĆ©dia harmĆ“nica -HYPGEOMDIST = DIST.HIPERGEOM ## Retorna a distribuição hipergeomĆ©trica -INTERCEPT = INTERCEPƇƃO ## Retorna a intercepção da linha de regressĆ£o linear -KURT = CURT ## Retorna a curtose de um conjunto de dados -LARGE = MAIOR ## Retorna o maior valor k-Ć©simo de um conjunto de dados -LINEST = PROJ.LIN ## Retorna os parĆ¢metros de uma tendĆŖncia linear -LOGEST = PROJ.LOG ## Retorna os parĆ¢metros de uma tendĆŖncia exponencial -LOGINV = INVLOG ## Retorna o inverso da distribuição lognormal -LOGNORMDIST = DIST.LOGNORMAL ## Retorna a distribuição lognormal cumulativa -MAX = MƁXIMO ## Retorna o valor mĆ”ximo em uma lista de argumentos -MAXA = MƁXIMOA ## Retorna o maior valor em uma lista de argumentos, inclusive nĆŗmeros, texto e valores lógicos -MEDIAN = MED ## Retorna a mediana dos nĆŗmeros indicados -MIN = MƍNIMO ## Retorna o valor mĆ­nimo em uma lista de argumentos -MINA = MƍNIMOA ## Retorna o menor valor em uma lista de argumentos, inclusive nĆŗmeros, texto e valores lógicos -MODE = MODO ## Retorna o valor mais comum em um conjunto de dados -NEGBINOMDIST = DIST.BIN.NEG ## Retorna a distribuição binomial negativa -NORMDIST = DIST.NORM ## Retorna a distribuição cumulativa normal -NORMINV = INV.NORM ## Retorna o inverso da distribuição cumulativa normal -NORMSDIST = DIST.NORMP ## Retorna a distribuição cumulativa normal padrĆ£o -NORMSINV = INV.NORMP ## Retorna o inverso da distribuição cumulativa normal padrĆ£o -PEARSON = PEARSON ## Retorna o coeficiente de correlação do momento do produto Pearson -PERCENTILE = PERCENTIL ## Retorna o k-Ć©simo percentil de valores em um intervalo -PERCENTRANK = ORDEM.PORCENTUAL ## Retorna a ordem percentual de um valor em um conjunto de dados -PERMUT = PERMUT ## Retorna o nĆŗmero de permutaƧƵes de um determinado nĆŗmero de objetos -POISSON = POISSON ## Retorna a distribuição Poisson -PROB = PROB ## Retorna a probabilidade de valores em um intervalo estarem entre dois limites -QUARTILE = QUARTIL ## Retorna o quartil do conjunto de dados -RANK = ORDEM ## Retorna a posição de um nĆŗmero em uma lista de nĆŗmeros -RSQ = RQUAD ## Retorna o quadrado do coeficiente de correlação do momento do produto de Pearson -SKEW = DISTORƇƃO ## Retorna a distorção de uma distribuição -SLOPE = INCLINAƇƃO ## Retorna a inclinação da linha de regressĆ£o linear -SMALL = MENOR ## Retorna o menor valor k-Ć©simo do conjunto de dados -STANDARDIZE = PADRONIZAR ## Retorna um valor normalizado -STDEV = DESVPAD ## Estima o desvio padrĆ£o com base em uma amostra -STDEVA = DESVPADA ## Estima o desvio padrĆ£o com base em uma amostra, inclusive nĆŗmeros, texto e valores lógicos -STDEVP = DESVPADP ## Calcula o desvio padrĆ£o com base na população total -STDEVPA = DESVPADPA ## Calcula o desvio padrĆ£o com base na população total, inclusive nĆŗmeros, texto e valores lógicos -STEYX = EPADYX ## Retorna o erro padrĆ£o do valor-y previsto para cada x da regressĆ£o -TDIST = DISTT ## Retorna a distribuição t de Student -TINV = INVT ## Retorna o inverso da distribuição t de Student -TREND = TENDÊNCIA ## Retorna valores ao longo de uma tendĆŖncia linear -TRIMMEAN = MƉDIA.INTERNA ## Retorna a mĆ©dia do interior de um conjunto de dados -TTEST = TESTET ## Retorna a probabilidade associada ao teste t de Student -VAR = VAR ## Estima a variĆ¢ncia com base em uma amostra -VARA = VARA ## Estima a variĆ¢ncia com base em uma amostra, inclusive nĆŗmeros, texto e valores lógicos -VARP = VARP ## Calcula a variĆ¢ncia com base na população inteira -VARPA = VARPA ## Calcula a variĆ¢ncia com base na população total, inclusive nĆŗmeros, texto e valores lógicos -WEIBULL = WEIBULL ## Retorna a distribuição Weibull -ZTEST = TESTEZ ## Retorna o valor de probabilidade uni-caudal de um teste-z - - -## -## Text functions FunƧƵes de texto -## -ASC = ASC ## Altera letras do inglĆŖs ou katakana de largura total (bytes duplos) dentro de uma seqüência de caracteres para caracteres de meia largura (byte Ćŗnico) -BAHTTEXT = BAHTTEXT ## Converte um nĆŗmero em um texto, usando o formato de moeda ß (baht) -CHAR = CARACT ## Retorna o caractere especificado pelo nĆŗmero de código -CLEAN = TIRAR ## Remove todos os caracteres do texto que nĆ£o podem ser impressos -CODE = CƓDIGO ## Retorna um código numĆ©rico para o primeiro caractere de uma seqüência de caracteres de texto -CONCATENATE = CONCATENAR ## Agrupa vĆ”rios itens de texto em um Ćŗnico item de texto -DOLLAR = MOEDA ## Converte um nĆŗmero em texto, usando o formato de moeda $ (dólar) -EXACT = EXATO ## Verifica se dois valores de texto sĆ£o idĆŖnticos -FIND = PROCURAR ## Procura um valor de texto dentro de outro (diferencia maiĆŗsculas de minĆŗsculas) -FINDB = PROCURARB ## Procura um valor de texto dentro de outro (diferencia maiĆŗsculas de minĆŗsculas) -FIXED = DEF.NÚM.DEC ## Formata um nĆŗmero como texto com um nĆŗmero fixo de decimais -JIS = JIS ## Altera letras do inglĆŖs ou katakana de meia largura (byte Ćŗnico) dentro de uma seqüência de caracteres para caracteres de largura total (bytes duplos) -LEFT = ESQUERDA ## Retorna os caracteres mais Ć  esquerda de um valor de texto -LEFTB = ESQUERDAB ## Retorna os caracteres mais Ć  esquerda de um valor de texto -LEN = NÚM.CARACT ## Retorna o nĆŗmero de caracteres em uma seqüência de texto -LENB = NÚM.CARACTB ## Retorna o nĆŗmero de caracteres em uma seqüência de texto -LOWER = MINÚSCULA ## Converte texto para minĆŗsculas -MID = EXT.TEXTO ## Retorna um nĆŗmero especĆ­fico de caracteres de uma seqüência de texto comeƧando na posição especificada -MIDB = EXT.TEXTOB ## Retorna um nĆŗmero especĆ­fico de caracteres de uma seqüência de texto comeƧando na posição especificada -PHONETIC = FONƉTICA ## Extrai os caracteres fonĆ©ticos (furigana) de uma seqüência de caracteres de texto -PROPER = PRI.MAIÚSCULA ## Coloca a primeira letra de cada palavra em maiĆŗscula em um valor de texto -REPLACE = MUDAR ## Muda os caracteres dentro do texto -REPLACEB = MUDARB ## Muda os caracteres dentro do texto -REPT = REPT ## Repete o texto um determinado nĆŗmero de vezes -RIGHT = DIREITA ## Retorna os caracteres mais Ć  direita de um valor de texto -RIGHTB = DIREITAB ## Retorna os caracteres mais Ć  direita de um valor de texto -SEARCH = LOCALIZAR ## Localiza um valor de texto dentro de outro (nĆ£o diferencia maiĆŗsculas de minĆŗsculas) -SEARCHB = LOCALIZARB ## Localiza um valor de texto dentro de outro (nĆ£o diferencia maiĆŗsculas de minĆŗsculas) -SUBSTITUTE = SUBSTITUIR ## Substitui um novo texto por um texto antigo em uma seqüência de texto -T = T ## Converte os argumentos em texto -TEXT = TEXTO ## Formata um nĆŗmero e o converte em texto -TRIM = ARRUMAR ## Remove espaƧos do texto -UPPER = MAIÚSCULA ## Converte o texto em maiĆŗsculas -VALUE = VALOR ## Converte um argumento de texto em um nĆŗmero diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/config deleted file mode 100644 index cd85c17..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = € - - -## -## Excel Error Codes (For future use) - -## -NULL = #NULO! -DIV0 = #DIV/0! -VALUE = #VALOR! -REF = #REF! -NAME = #NOME? -NUM = #NÚM! -NA = #N/D diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/functions deleted file mode 100644 index ba4eb47..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/pt/functions +++ /dev/null @@ -1,408 +0,0 @@ -## -## Add-in and Automation functions FunƧƵes de Suplemento e Automatização -## -GETPIVOTDATA = OBTERDADOSDIN ## Devolve dados armazenados num relatório de Tabela DinĆ¢mica - - -## -## Cube functions FunƧƵes de cubo -## -CUBEKPIMEMBER = MEMBROKPICUBO ## Devolve o nome, propriedade e medição de um KPI (key performance indicator) e apresenta o nome e a propriedade na cĆ©lula. Um KPI Ć© uma medida quantificĆ”vel, como, por exemplo, o lucro mensal bruto ou a rotatividade trimestral de pessoal, utilizada para monitorizar o desempenho de uma organização. -CUBEMEMBER = MEMBROCUBO ## Devolve um membro ou cadeia de identificação numa hierarquia de cubo. Utilizada para validar a existĆŖncia do membro ou cadeia de identificação no cubo. -CUBEMEMBERPROPERTY = PROPRIEDADEMEMBROCUBO ## Devolve o valor de uma propriedade de membro no cubo. Utilizada para validar a existĆŖncia de um nome de membro no cubo e para devolver a propriedade especificada para esse membro. -CUBERANKEDMEMBER = MEMBROCLASSIFICADOCUBO ## Devolve o enĆ©simo ou a classificação mais alta num conjunto. Utilizada para devolver um ou mais elementos num conjunto, tal como o melhor vendedor ou os 10 melhores alunos. -CUBESET = CONJUNTOCUBO ## Define um conjunto calculado de membros ou cadeias de identificação enviando uma expressĆ£o de conjunto para o cubo no servidor, que cria o conjunto e, em seguida, devolve o conjunto ao Microsoft Office Excel. -CUBESETCOUNT = CONTARCONJUNTOCUBO ## Devolve o nĆŗmero de itens num conjunto. -CUBEVALUE = VALORCUBO ## Devolve um valor agregado do cubo. - - -## -## Database functions FunƧƵes de base de dados -## -DAVERAGE = BDMƉDIA ## Devolve a mĆ©dia das entradas da base de dados seleccionadas -DCOUNT = BDCONTAR ## Conta as cĆ©lulas que contĆŖm nĆŗmeros numa base de dados -DCOUNTA = BDCONTAR.VAL ## Conta as cĆ©lulas que nĆ£o estejam em branco numa base de dados -DGET = BDOBTER ## Extrai de uma base de dados um Ćŗnico registo que corresponde aos critĆ©rios especificados -DMAX = BDMƁX ## Devolve o valor mĆ”ximo das entradas da base de dados seleccionadas -DMIN = BDMƍN ## Devolve o valor mĆ­nimo das entradas da base de dados seleccionadas -DPRODUCT = BDMULTIPL ## Multiplica os valores de um determinado campo de registos que correspondem aos critĆ©rios numa base de dados -DSTDEV = BDDESVPAD ## Calcula o desvio-padrĆ£o com base numa amostra de entradas da base de dados seleccionadas -DSTDEVP = BDDESVPADP ## Calcula o desvio-padrĆ£o com base na população total das entradas da base de dados seleccionadas -DSUM = BDSOMA ## Adiciona os nĆŗmeros na coluna de campo dos registos de base de dados que correspondem aos critĆ©rios -DVAR = BDVAR ## Calcula a variĆ¢ncia com base numa amostra das entradas de base de dados seleccionadas -DVARP = BDVARP ## Calcula a variĆ¢ncia com base na população total das entradas de base de dados seleccionadas - - -## -## Date and time functions FunƧƵes de data e hora -## -DATE = DATA ## Devolve o nĆŗmero de sĆ©rie de uma determinada data -DATEVALUE = DATA.VALOR ## Converte uma data em forma de texto num nĆŗmero de sĆ©rie -DAY = DIA ## Converte um nĆŗmero de sĆ©rie num dia do mĆŖs -DAYS360 = DIAS360 ## Calcula o nĆŗmero de dias entre duas datas com base num ano com 360 dias -EDATE = DATAM ## Devolve um nĆŗmero de sĆ©rie de data que corresponde ao nĆŗmero de meses indicado antes ou depois da data de inĆ­cio -EOMONTH = FIMMÊS ## Devolve o nĆŗmero de sĆ©rie do Ćŗltimo dia do mĆŖs antes ou depois de um nĆŗmero de meses especificado -HOUR = HORA ## Converte um nĆŗmero de sĆ©rie numa hora -MINUTE = MINUTO ## Converte um nĆŗmero de sĆ©rie num minuto -MONTH = MÊS ## Converte um nĆŗmero de sĆ©rie num mĆŖs -NETWORKDAYS = DIATRABALHOTOTAL ## Devolve o nĆŗmero total de dias Ćŗteis entre duas datas -NOW = AGORA ## Devolve o nĆŗmero de sĆ©rie da data e hora actuais -SECOND = SEGUNDO ## Converte um nĆŗmero de sĆ©rie num segundo -TIME = TEMPO ## Devolve o nĆŗmero de sĆ©rie de um determinado tempo -TIMEVALUE = VALOR.TEMPO ## Converte um tempo em forma de texto num nĆŗmero de sĆ©rie -TODAY = HOJE ## Devolve o nĆŗmero de sĆ©rie da data actual -WEEKDAY = DIA.SEMANA ## Converte um nĆŗmero de sĆ©rie num dia da semana -WEEKNUM = NÚMSEMANA ## Converte um nĆŗmero de sĆ©rie num nĆŗmero que representa o nĆŗmero da semana num determinado ano -WORKDAY = DIA.TRABALHO ## Devolve o nĆŗmero de sĆ©rie da data antes ou depois de um nĆŗmero de dias Ćŗteis especificado -YEAR = ANO ## Converte um nĆŗmero de sĆ©rie num ano -YEARFRAC = FRACƇƃOANO ## Devolve a fracção de ano que representa o nĆŗmero de dias inteiros entre a data_de_inĆ­cio e a data_de_fim - - -## -## Engineering functions FunƧƵes de engenharia -## -BESSELI = BESSELI ## Devolve a função de Bessel modificada In(x) -BESSELJ = BESSELJ ## Devolve a função de Bessel Jn(x) -BESSELK = BESSELK ## Devolve a função de Bessel modificada Kn(x) -BESSELY = BESSELY ## Devolve a função de Bessel Yn(x) -BIN2DEC = BINADEC ## Converte um nĆŗmero binĆ”rio em decimal -BIN2HEX = BINAHEX ## Converte um nĆŗmero binĆ”rio em hexadecimal -BIN2OCT = BINAOCT ## Converte um nĆŗmero binĆ”rio em octal -COMPLEX = COMPLEXO ## Converte coeficientes reais e imaginĆ”rios num nĆŗmero complexo -CONVERT = CONVERTER ## Converte um nĆŗmero de um sistema de medida noutro -DEC2BIN = DECABIN ## Converte um nĆŗmero decimal em binĆ”rio -DEC2HEX = DECAHEX ## Converte um nĆŗmero decimal em hexadecimal -DEC2OCT = DECAOCT ## Converte um nĆŗmero decimal em octal -DELTA = DELTA ## Testa se dois valores sĆ£o iguais -ERF = FUNCERRO ## Devolve a função de erro -ERFC = FUNCERROCOMPL ## Devolve a função de erro complementar -GESTEP = DEGRAU ## Testa se um nĆŗmero Ć© maior do que um valor limite -HEX2BIN = HEXABIN ## Converte um nĆŗmero hexadecimal em binĆ”rio -HEX2DEC = HEXADEC ## Converte um nĆŗmero hexadecimal em decimal -HEX2OCT = HEXAOCT ## Converte um nĆŗmero hexadecimal em octal -IMABS = IMABS ## Devolve o valor absoluto (módulo) de um nĆŗmero complexo -IMAGINARY = IMAGINƁRIO ## Devolve o coeficiente imaginĆ”rio de um nĆŗmero complexo -IMARGUMENT = IMARG ## Devolve o argumento Teta, um Ć¢ngulo expresso em radianos -IMCONJUGATE = IMCONJ ## Devolve o conjugado complexo de um nĆŗmero complexo -IMCOS = IMCOS ## Devolve o co-seno de um nĆŗmero complexo -IMDIV = IMDIV ## Devolve o quociente de dois nĆŗmeros complexos -IMEXP = IMEXP ## Devolve o exponencial de um nĆŗmero complexo -IMLN = IMLN ## Devolve o logaritmo natural de um nĆŗmero complexo -IMLOG10 = IMLOG10 ## Devolve o logaritmo de base 10 de um nĆŗmero complexo -IMLOG2 = IMLOG2 ## Devolve o logaritmo de base 2 de um nĆŗmero complexo -IMPOWER = IMPOT ## Devolve um nĆŗmero complexo elevado a uma potĆŖncia inteira -IMPRODUCT = IMPROD ## Devolve o produto de nĆŗmeros complexos -IMREAL = IMREAL ## Devolve o coeficiente real de um nĆŗmero complexo -IMSIN = IMSENO ## Devolve o seno de um nĆŗmero complexo -IMSQRT = IMRAIZ ## Devolve a raiz quadrada de um nĆŗmero complexo -IMSUB = IMSUBTR ## Devolve a diferenƧa entre dois nĆŗmeros complexos -IMSUM = IMSOMA ## Devolve a soma de nĆŗmeros complexos -OCT2BIN = OCTABIN ## Converte um nĆŗmero octal em binĆ”rio -OCT2DEC = OCTADEC ## Converte um nĆŗmero octal em decimal -OCT2HEX = OCTAHEX ## Converte um nĆŗmero octal em hexadecimal - - -## -## Financial functions FunƧƵes financeiras -## -ACCRINT = JUROSACUM ## Devolve os juros acumulados de um tĆ­tulo que paga juros periódicos -ACCRINTM = JUROSACUMV ## Devolve os juros acumulados de um tĆ­tulo que paga juros no vencimento -AMORDEGRC = AMORDEGRC ## Devolve a depreciação correspondente a cada perĆ­odo contabilĆ­stico utilizando um coeficiente de depreciação -AMORLINC = AMORLINC ## Devolve a depreciação correspondente a cada perĆ­odo contabilĆ­stico -COUPDAYBS = CUPDIASINLIQ ## Devolve o nĆŗmero de dias entre o inĆ­cio do perĆ­odo do cupĆ£o e a data de regularização -COUPDAYS = CUPDIAS ## Devolve o nĆŗmero de dias no perĆ­odo do cupĆ£o que contĆ©m a data de regularização -COUPDAYSNC = CUPDIASPRƓX ## Devolve o nĆŗmero de dias entre a data de regularização e a data do cupĆ£o seguinte -COUPNCD = CUPDATAPRƓX ## Devolve a data do cupĆ£o seguinte após a data de regularização -COUPNUM = CUPNÚM ## Devolve o nĆŗmero de cupƵes a serem pagos entre a data de regularização e a data de vencimento -COUPPCD = CUPDATAANT ## Devolve a data do cupĆ£o anterior antes da data de regularização -CUMIPMT = PGTOJURACUM ## Devolve os juros cumulativos pagos entre dois perĆ­odos -CUMPRINC = PGTOCAPACUM ## Devolve o capital cumulativo pago a tĆ­tulo de emprĆ©stimo entre dois perĆ­odos -DB = BD ## Devolve a depreciação de um activo relativo a um perĆ­odo especificado utilizando o mĆ©todo das quotas degressivas fixas -DDB = BDD ## Devolve a depreciação de um activo relativo a um perĆ­odo especificado utilizando o mĆ©todo das quotas degressivas duplas ou qualquer outro mĆ©todo especificado -DISC = DESC ## Devolve a taxa de desconto de um tĆ­tulo -DOLLARDE = MOEDADEC ## Converte um preƧo em unidade monetĆ”ria, expresso como uma fracção, num preƧo em unidade monetĆ”ria, expresso como um nĆŗmero decimal -DOLLARFR = MOEDAFRA ## Converte um preƧo em unidade monetĆ”ria, expresso como um nĆŗmero decimal, num preƧo em unidade monetĆ”ria, expresso como uma fracção -DURATION = DURAƇƃO ## Devolve a duração anual de um tĆ­tulo com pagamentos de juros periódicos -EFFECT = EFECTIVA ## Devolve a taxa de juros anual efectiva -FV = VF ## Devolve o valor futuro de um investimento -FVSCHEDULE = VFPLANO ## Devolve o valor futuro de um capital inicial após a aplicação de uma sĆ©rie de taxas de juro compostas -INTRATE = TAXAJUROS ## Devolve a taxa de juros de um tĆ­tulo investido na totalidade -IPMT = IPGTO ## Devolve o pagamento dos juros de um investimento durante um determinado perĆ­odo -IRR = TIR ## Devolve a taxa de rentabilidade interna para uma sĆ©rie de fluxos monetĆ”rios -ISPMT = Ɖ.PGTO ## Calcula os juros pagos durante um perĆ­odo especĆ­fico de um investimento -MDURATION = MDURAƇƃO ## Devolve a duração modificada de Macauley de um tĆ­tulo com um valor de paridade equivalente a € 100 -MIRR = MTIR ## Devolve a taxa interna de rentabilidade em que os fluxos monetĆ”rios positivos e negativos sĆ£o financiados com taxas diferentes -NOMINAL = NOMINAL ## Devolve a taxa de juros nominal anual -NPER = NPER ## Devolve o nĆŗmero de perĆ­odos de um investimento -NPV = VAL ## Devolve o valor actual lĆ­quido de um investimento com base numa sĆ©rie de fluxos monetĆ”rios periódicos e numa taxa de desconto -ODDFPRICE = PREƇOPRIMINC ## Devolve o preƧo por € 100 do valor nominal de um tĆ­tulo com um perĆ­odo inicial incompleto -ODDFYIELD = LUCROPRIMINC ## Devolve o lucro de um tĆ­tulo com um perĆ­odo inicial incompleto -ODDLPRICE = PREƇOÚLTINC ## Devolve o preƧo por € 100 do valor nominal de um tĆ­tulo com um perĆ­odo final incompleto -ODDLYIELD = LUCROÚLTINC ## Devolve o lucro de um tĆ­tulo com um perĆ­odo final incompleto -PMT = PGTO ## Devolve o pagamento periódico de uma anuidade -PPMT = PPGTO ## Devolve o pagamento sobre o capital de um investimento num determinado perĆ­odo -PRICE = PREƇO ## Devolve o preƧo por € 100 do valor nominal de um tĆ­tulo que paga juros periódicos -PRICEDISC = PREƇODESC ## Devolve o preƧo por € 100 do valor nominal de um tĆ­tulo descontado -PRICEMAT = PREƇOVENC ## Devolve o preƧo por € 100 do valor nominal de um tĆ­tulo que paga juros no vencimento -PV = VA ## Devolve o valor actual de um investimento -RATE = TAXA ## Devolve a taxa de juros por perĆ­odo de uma anuidade -RECEIVED = RECEBER ## Devolve o montante recebido no vencimento de um tĆ­tulo investido na totalidade -SLN = AMORT ## Devolve uma depreciação linear de um activo durante um perĆ­odo -SYD = AMORTD ## Devolve a depreciação por algarismos da soma dos anos de um activo durante um perĆ­odo especificado -TBILLEQ = OTN ## Devolve o lucro de um tĆ­tulo equivalente a uma Obrigação do Tesouro -TBILLPRICE = OTNVALOR ## Devolve o preƧo por € 100 de valor nominal de uma Obrigação do Tesouro -TBILLYIELD = OTNLUCRO ## Devolve o lucro de uma Obrigação do Tesouro -VDB = BDV ## Devolve a depreciação de um activo relativo a um perĆ­odo especĆ­fico ou parcial utilizando um mĆ©todo de quotas degressivas -XIRR = XTIR ## Devolve a taxa interna de rentabilidade de um plano de fluxos monetĆ”rios que nĆ£o seja necessariamente periódica -XNPV = XVAL ## Devolve o valor actual lĆ­quido de um plano de fluxos monetĆ”rios que nĆ£o seja necessariamente periódico -YIELD = LUCRO ## Devolve o lucro de um tĆ­tulo que paga juros periódicos -YIELDDISC = LUCRODESC ## Devolve o lucro anual de um tĆ­tulo emitido abaixo do valor nominal, por exemplo, uma Obrigação do Tesouro -YIELDMAT = LUCROVENC ## Devolve o lucro anual de um tĆ­tulo que paga juros na data de vencimento - - -## -## Information functions FunƧƵes de informação -## -CELL = CƉL ## Devolve informaƧƵes sobre a formatação, localização ou conteĆŗdo de uma cĆ©lula -ERROR.TYPE = TIPO.ERRO ## Devolve um nĆŗmero correspondente a um tipo de erro -INFO = INFORMAƇƃO ## Devolve informaƧƵes sobre o ambiente de funcionamento actual -ISBLANK = Ɖ.CƉL.VAZIA ## Devolve VERDADEIRO se o valor estiver em branco -ISERR = Ɖ.ERROS ## Devolve VERDADEIRO se o valor for um valor de erro diferente de #N/D -ISERROR = Ɖ.ERRO ## Devolve VERDADEIRO se o valor for um valor de erro -ISEVEN = ƉPAR ## Devolve VERDADEIRO se o nĆŗmero for par -ISLOGICAL = Ɖ.LƓGICO ## Devolve VERDADEIRO se o valor for lógico -ISNA = Ɖ.NƃO.DISP ## Devolve VERDADEIRO se o valor for o valor de erro #N/D -ISNONTEXT = Ɖ.NƃO.TEXTO ## Devolve VERDADEIRO se o valor nĆ£o for texto -ISNUMBER = Ɖ.NÚM ## Devolve VERDADEIRO se o valor for um nĆŗmero -ISODD = ƉƍMPAR ## Devolve VERDADEIRO se o nĆŗmero for Ć­mpar -ISREF = Ɖ.REF ## Devolve VERDADEIRO se o valor for uma referĆŖncia -ISTEXT = Ɖ.TEXTO ## Devolve VERDADEIRO se o valor for texto -N = N ## Devolve um valor convertido num nĆŗmero -NA = NƃO.DISP ## Devolve o valor de erro #N/D -TYPE = TIPO ## Devolve um nĆŗmero que indica o tipo de dados de um valor - - -## -## Logical functions FunƧƵes lógicas -## -AND = E ## Devolve VERDADEIRO se todos os respectivos argumentos corresponderem a VERDADEIRO -FALSE = FALSO ## Devolve o valor lógico FALSO -IF = SE ## Especifica um teste lógico a ser executado -IFERROR = SE.ERRO ## Devolve um valor definido pelo utilizador se ocorrer um erro na fórmula, e devolve o resultado da fórmula se nĆ£o ocorrer nenhum erro -NOT = NƃO ## Inverte a lógica do respectivo argumento -OR = OU ## Devolve VERDADEIRO se qualquer argumento for VERDADEIRO -TRUE = VERDADEIRO ## Devolve o valor lógico VERDADEIRO - - -## -## Lookup and reference functions FunƧƵes de pesquisa e referĆŖncia -## -ADDRESS = ENDEREƇO ## Devolve uma referĆŖncia a uma Ćŗnica cĆ©lula numa folha de cĆ”lculo como texto -AREAS = ƁREAS ## Devolve o nĆŗmero de Ć”reas numa referĆŖncia -CHOOSE = SELECCIONAR ## Selecciona um valor a partir de uma lista de valores -COLUMN = COL ## Devolve o nĆŗmero da coluna de uma referĆŖncia -COLUMNS = COLS ## Devolve o nĆŗmero de colunas numa referĆŖncia -HLOOKUP = PROCH ## Procura na linha superior de uma matriz e devolve o valor da cĆ©lula indicada -HYPERLINK = HIPERLIGAƇƃO ## Cria um atalho ou hiperligação que abre um documento armazenado num servidor de rede, numa intranet ou na Internet -INDEX = ƍNDICE ## Utiliza um Ć­ndice para escolher um valor de uma referĆŖncia ou de uma matriz -INDIRECT = INDIRECTO ## Devolve uma referĆŖncia indicada por um valor de texto -LOOKUP = PROC ## Procura valores num vector ou numa matriz -MATCH = CORRESP ## Procura valores numa referĆŖncia ou numa matriz -OFFSET = DESLOCAMENTO ## Devolve o deslocamento de referĆŖncia de uma determinada referĆŖncia -ROW = LIN ## Devolve o nĆŗmero da linha de uma referĆŖncia -ROWS = LINS ## Devolve o nĆŗmero de linhas numa referĆŖncia -RTD = RTD ## ObtĆ©m dados em tempo real a partir de um programa que suporte automatização COM (automatização: modo de trabalhar com objectos de uma aplicação a partir de outra aplicação ou ferramenta de desenvolvimento. Anteriormente conhecida como automatização OLE, a automatização Ć© uma norma da indĆŗstria de software e uma funcionalidade COM (Component Object Model).) -TRANSPOSE = TRANSPOR ## Devolve a transposição de uma matriz -VLOOKUP = PROCV ## Procura na primeira coluna de uma matriz e percorre a linha para devolver o valor de uma cĆ©lula - - -## -## Math and trigonometry functions FunƧƵes matemĆ”ticas e trigonomĆ©tricas -## -ABS = ABS ## Devolve o valor absoluto de um nĆŗmero -ACOS = ACOS ## Devolve o arco de co-seno de um nĆŗmero -ACOSH = ACOSH ## Devolve o co-seno hiperbólico inverso de um nĆŗmero -ASIN = ASEN ## Devolve o arco de seno de um nĆŗmero -ASINH = ASENH ## Devolve o seno hiperbólico inverso de um nĆŗmero -ATAN = ATAN ## Devolve o arco de tangente de um nĆŗmero -ATAN2 = ATAN2 ## Devolve o arco de tangente das coordenadas x e y -ATANH = ATANH ## Devolve a tangente hiperbólica inversa de um nĆŗmero -CEILING = ARRED.EXCESSO ## Arredonda um nĆŗmero para o nĆŗmero inteiro mais próximo ou para o mĆŗltiplo de significĆ¢ncia mais próximo -COMBIN = COMBIN ## Devolve o nĆŗmero de combinaƧƵes de um determinado nĆŗmero de objectos -COS = COS ## Devolve o co-seno de um nĆŗmero -COSH = COSH ## Devolve o co-seno hiperbólico de um nĆŗmero -DEGREES = GRAUS ## Converte radianos em graus -EVEN = PAR ## Arredonda um nĆŗmero por excesso para o nĆŗmero inteiro mais próximo -EXP = EXP ## Devolve e elevado Ć  potĆŖncia de um determinado nĆŗmero -FACT = FACTORIAL ## Devolve o factorial de um nĆŗmero -FACTDOUBLE = FACTDUPLO ## Devolve o factorial duplo de um nĆŗmero -FLOOR = ARRED.DEFEITO ## Arredonda um nĆŗmero por defeito atĆ© zero -GCD = MDC ## Devolve o maior divisor comum -INT = INT ## Arredonda um nĆŗmero por defeito para o nĆŗmero inteiro mais próximo -LCM = MMC ## Devolve o mĆ­nimo mĆŗltiplo comum -LN = LN ## Devolve o logaritmo natural de um nĆŗmero -LOG = LOG ## Devolve o logaritmo de um nĆŗmero com uma base especificada -LOG10 = LOG10 ## Devolve o logaritmo de base 10 de um nĆŗmero -MDETERM = MATRIZ.DETERM ## Devolve o determinante matricial de uma matriz -MINVERSE = MATRIZ.INVERSA ## Devolve o inverso matricial de uma matriz -MMULT = MATRIZ.MULT ## Devolve o produto matricial de duas matrizes -MOD = RESTO ## Devolve o resto da divisĆ£o -MROUND = MARRED ## Devolve um nĆŗmero arredondado para o mĆŗltiplo pretendido -MULTINOMIAL = POLINOMIAL ## Devolve o polinomial de um conjunto de nĆŗmeros -ODD = ƍMPAR ## Arredonda por excesso um nĆŗmero para o nĆŗmero inteiro Ć­mpar mais próximo -PI = PI ## Devolve o valor de pi -POWER = POTÊNCIA ## Devolve o resultado de um nĆŗmero elevado a uma potĆŖncia -PRODUCT = PRODUTO ## Multiplica os respectivos argumentos -QUOTIENT = QUOCIENTE ## Devolve a parte inteira de uma divisĆ£o -RADIANS = RADIANOS ## Converte graus em radianos -RAND = ALEATƓRIO ## Devolve um nĆŗmero aleatório entre 0 e 1 -RANDBETWEEN = ALEATƓRIOENTRE ## Devolve um nĆŗmero aleatório entre os nĆŗmeros especificados -ROMAN = ROMANO ## Converte um nĆŗmero Ć”rabe em romano, como texto -ROUND = ARRED ## Arredonda um nĆŗmero para um nĆŗmero de dĆ­gitos especificado -ROUNDDOWN = ARRED.PARA.BAIXO ## Arredonda um nĆŗmero por defeito atĆ© zero -ROUNDUP = ARRED.PARA.CIMA ## Arredonda um nĆŗmero por excesso, afastando-o de zero -SERIESSUM = SOMASƉRIE ## Devolve a soma de uma sĆ©rie de potĆŖncias baseada na fórmula -SIGN = SINAL ## Devolve o sinal de um nĆŗmero -SIN = SEN ## Devolve o seno de um determinado Ć¢ngulo -SINH = SENH ## Devolve o seno hiperbólico de um nĆŗmero -SQRT = RAIZQ ## Devolve uma raiz quadrada positiva -SQRTPI = RAIZPI ## Devolve a raiz quadrada de (nĆŗm * pi) -SUBTOTAL = SUBTOTAL ## Devolve um subtotal numa lista ou base de dados -SUM = SOMA ## Adiciona os respectivos argumentos -SUMIF = SOMA.SE ## Adiciona as cĆ©lulas especificadas por um determinado critĆ©rio -SUMIFS = SOMA.SE.S ## Adiciona as cĆ©lulas num intervalo que cumpre vĆ”rios critĆ©rios -SUMPRODUCT = SOMARPRODUTO ## Devolve a soma dos produtos de componentes de matrizes correspondentes -SUMSQ = SOMARQUAD ## Devolve a soma dos quadrados dos argumentos -SUMX2MY2 = SOMAX2DY2 ## Devolve a soma da diferenƧa dos quadrados dos valores correspondentes em duas matrizes -SUMX2PY2 = SOMAX2SY2 ## Devolve a soma da soma dos quadrados dos valores correspondentes em duas matrizes -SUMXMY2 = SOMAXMY2 ## Devolve a soma dos quadrados da diferenƧa dos valores correspondentes em duas matrizes -TAN = TAN ## Devolve a tangente de um nĆŗmero -TANH = TANH ## Devolve a tangente hiperbólica de um nĆŗmero -TRUNC = TRUNCAR ## Trunca um nĆŗmero para um nĆŗmero inteiro - - -## -## Statistical functions FunƧƵes estatĆ­sticas -## -AVEDEV = DESV.MƉDIO ## Devolve a mĆ©dia aritmĆ©tica dos desvios absolutos Ć  mĆ©dia dos pontos de dados -AVERAGE = MƉDIA ## Devolve a mĆ©dia dos respectivos argumentos -AVERAGEA = MƉDIAA ## Devolve uma mĆ©dia dos respectivos argumentos, incluindo nĆŗmeros, texto e valores lógicos -AVERAGEIF = MƉDIA.SE ## Devolve a mĆ©dia aritmĆ©tica de todas as cĆ©lulas num intervalo que cumprem determinado critĆ©rio -AVERAGEIFS = MƉDIA.SE.S ## Devolve a mĆ©dia aritmĆ©tica de todas as cĆ©lulas que cumprem mĆŗltiplos critĆ©rios -BETADIST = DISTBETA ## Devolve a função de distribuição cumulativa beta -BETAINV = BETA.ACUM.INV ## Devolve o inverso da função de distribuição cumulativa relativamente a uma distribuição beta especĆ­fica -BINOMDIST = DISTRBINOM ## Devolve a probabilidade de distribuição binomial de termo individual -CHIDIST = DIST.CHI ## Devolve a probabilidade unicaudal da distribuição qui-quadrada -CHIINV = INV.CHI ## Devolve o inverso da probabilidade unicaudal da distribuição qui-quadrada -CHITEST = TESTE.CHI ## Devolve o teste para independĆŖncia -CONFIDENCE = INT.CONFIANƇA ## Devolve o intervalo de confianƧa correspondente a uma mĆ©dia de população -CORREL = CORREL ## Devolve o coeficiente de correlação entre dois conjuntos de dados -COUNT = CONTAR ## Conta os nĆŗmeros que existem na lista de argumentos -COUNTA = CONTAR.VAL ## Conta os valores que existem na lista de argumentos -COUNTBLANK = CONTAR.VAZIO ## Conta o nĆŗmero de cĆ©lulas em branco num intervalo -COUNTIF = CONTAR.SE ## Calcula o nĆŗmero de cĆ©lulas num intervalo que corresponde aos critĆ©rios determinados -COUNTIFS = CONTAR.SE.S ## Conta o nĆŗmero de cĆ©lulas num intervalo que cumprem mĆŗltiplos critĆ©rios -COVAR = COVAR ## Devolve a covariĆ¢ncia, que Ć© a mĆ©dia dos produtos de desvios de pares -CRITBINOM = CRIT.BINOM ## Devolve o menor valor em que a distribuição binomial cumulativa Ć© inferior ou igual a um valor de critĆ©rio -DEVSQ = DESVQ ## Devolve a soma dos quadrados dos desvios -EXPONDIST = DISTEXPON ## Devolve a distribuição exponencial -FDIST = DISTF ## Devolve a distribuição da probabilidade F -FINV = INVF ## Devolve o inverso da distribuição da probabilidade F -FISHER = FISHER ## Devolve a transformação Fisher -FISHERINV = FISHERINV ## Devolve o inverso da transformação Fisher -FORECAST = PREVISƃO ## Devolve um valor ao longo de uma tendĆŖncia linear -FREQUENCY = FREQUÊNCIA ## Devolve uma distribuição de frequĆŖncia como uma matriz vertical -FTEST = TESTEF ## Devolve o resultado de um teste F -GAMMADIST = DISTGAMA ## Devolve a distribuição gama -GAMMAINV = INVGAMA ## Devolve o inverso da distribuição gama cumulativa -GAMMALN = LNGAMA ## Devolve o logaritmo natural da função gama, Ī“(x) -GEOMEAN = MƉDIA.GEOMƉTRICA ## Devolve a mĆ©dia geomĆ©trica -GROWTH = CRESCIMENTO ## Devolve valores ao longo de uma tendĆŖncia exponencial -HARMEAN = MƉDIA.HARMƓNICA ## Devolve a mĆ©dia harmónica -HYPGEOMDIST = DIST.HIPERGEOM ## Devolve a distribuição hipergeomĆ©trica -INTERCEPT = INTERCEPTAR ## Devolve a intercepção da linha de regressĆ£o linear -KURT = CURT ## Devolve a curtose de um conjunto de dados -LARGE = MAIOR ## Devolve o maior valor k-Ć©simo de um conjunto de dados -LINEST = PROJ.LIN ## Devolve os parĆ¢metros de uma tendĆŖncia linear -LOGEST = PROJ.LOG ## Devolve os parĆ¢metros de uma tendĆŖncia exponencial -LOGINV = INVLOG ## Devolve o inverso da distribuição normal logarĆ­tmica -LOGNORMDIST = DIST.NORMALLOG ## Devolve a distribuição normal logarĆ­tmica cumulativa -MAX = MƁXIMO ## Devolve o valor mĆ”ximo numa lista de argumentos -MAXA = MƁXIMOA ## Devolve o valor mĆ”ximo numa lista de argumentos, incluindo nĆŗmeros, texto e valores lógicos -MEDIAN = MED ## Devolve a mediana dos nĆŗmeros indicados -MIN = MƍNIMO ## Devolve o valor mĆ­nimo numa lista de argumentos -MINA = MƍNIMOA ## Devolve o valor mĆ­nimo numa lista de argumentos, incluindo nĆŗmeros, texto e valores lógicos -MODE = MODA ## Devolve o valor mais comum num conjunto de dados -NEGBINOMDIST = DIST.BIN.NEG ## Devolve a distribuição binominal negativa -NORMDIST = DIST.NORM ## Devolve a distribuição cumulativa normal -NORMINV = INV.NORM ## Devolve o inverso da distribuição cumulativa normal -NORMSDIST = DIST.NORMP ## Devolve a distribuição cumulativa normal padrĆ£o -NORMSINV = INV.NORMP ## Devolve o inverso da distribuição cumulativa normal padrĆ£o -PEARSON = PEARSON ## Devolve o coeficiente de correlação momento/produto de Pearson -PERCENTILE = PERCENTIL ## Devolve o k-Ć©simo percentil de valores num intervalo -PERCENTRANK = ORDEM.PERCENTUAL ## Devolve a ordem percentual de um valor num conjunto de dados -PERMUT = PERMUTAR ## Devolve o nĆŗmero de permutaƧƵes de um determinado nĆŗmero de objectos -POISSON = POISSON ## Devolve a distribuição de Poisson -PROB = PROB ## Devolve a probabilidade dos valores num intervalo se encontrarem entre dois limites -QUARTILE = QUARTIL ## Devolve o quartil de um conjunto de dados -RANK = ORDEM ## Devolve a ordem de um nĆŗmero numa lista numĆ©rica -RSQ = RQUAD ## Devolve o quadrado do coeficiente de correlação momento/produto de Pearson -SKEW = DISTORƇƃO ## Devolve a distorção de uma distribuição -SLOPE = DECLIVE ## Devolve o declive da linha de regressĆ£o linear -SMALL = MENOR ## Devolve o menor valor de k-Ć©simo de um conjunto de dados -STANDARDIZE = NORMALIZAR ## Devolve um valor normalizado -STDEV = DESVPAD ## Calcula o desvio-padrĆ£o com base numa amostra -STDEVA = DESVPADA ## Calcula o desvio-padrĆ£o com base numa amostra, incluindo nĆŗmeros, texto e valores lógicos -STDEVP = DESVPADP ## Calcula o desvio-padrĆ£o com base na população total -STDEVPA = DESVPADPA ## Calcula o desvio-padrĆ£o com base na população total, incluindo nĆŗmeros, texto e valores lógicos -STEYX = EPADYX ## Devolve o erro-padrĆ£o do valor de y previsto para cada x na regressĆ£o -TDIST = DISTT ## Devolve a distribuição t de Student -TINV = INVT ## Devolve o inverso da distribuição t de Student -TREND = TENDÊNCIA ## Devolve valores ao longo de uma tendĆŖncia linear -TRIMMEAN = MƉDIA.INTERNA ## Devolve a mĆ©dia do interior de um conjunto de dados -TTEST = TESTET ## Devolve a probabilidade associada ao teste t de Student -VAR = VAR ## Calcula a variĆ¢ncia com base numa amostra -VARA = VARA ## Calcula a variĆ¢ncia com base numa amostra, incluindo nĆŗmeros, texto e valores lógicos -VARP = VARP ## Calcula a variĆ¢ncia com base na população total -VARPA = VARPA ## Calcula a variĆ¢ncia com base na população total, incluindo nĆŗmeros, texto e valores lógicos -WEIBULL = WEIBULL ## Devolve a distribuição Weibull -ZTEST = TESTEZ ## Devolve o valor de probabilidade unicaudal de um teste-z - - -## -## Text functions FunƧƵes de texto -## -ASC = ASC ## Altera letras ou katakana de largura total (byte duplo) numa cadeia de caracteres para caracteres de largura mĆ©dia (byte Ćŗnico) -BAHTTEXT = TEXTO.BAHT ## Converte um nĆŗmero em texto, utilizando o formato monetĆ”rio ß (baht) -CHAR = CARƁCT ## Devolve o carĆ”cter especificado pelo nĆŗmero de código -CLEAN = LIMPAR ## Remove do texto todos os caracteres nĆ£o imprimĆ­veis -CODE = CƓDIGO ## Devolve um código numĆ©rico correspondente ao primeiro carĆ”cter numa cadeia de texto -CONCATENATE = CONCATENAR ## Agrupa vĆ”rios itens de texto num Ćŗnico item de texto -DOLLAR = MOEDA ## Converte um nĆŗmero em texto, utilizando o formato monetĆ”rio € (Euro) -EXACT = EXACTO ## Verifica se dois valores de texto sĆ£o idĆŖnticos -FIND = LOCALIZAR ## Localiza um valor de texto dentro de outro (sensĆ­vel Ć s maiĆŗsculas e minĆŗsculas) -FINDB = LOCALIZARB ## Localiza um valor de texto dentro de outro (sensĆ­vel Ć s maiĆŗsculas e minĆŗsculas) -FIXED = FIXA ## Formata um nĆŗmero como texto com um nĆŗmero fixo de decimais -JIS = JIS ## Altera letras ou katakana de largura mĆ©dia (byte Ćŗnico) numa cadeia de caracteres para caracteres de largura total (byte duplo) -LEFT = ESQUERDA ## Devolve os caracteres mais Ć  esquerda de um valor de texto -LEFTB = ESQUERDAB ## Devolve os caracteres mais Ć  esquerda de um valor de texto -LEN = NÚM.CARACT ## Devolve o nĆŗmero de caracteres de uma cadeia de texto -LENB = NÚM.CARACTB ## Devolve o nĆŗmero de caracteres de uma cadeia de texto -LOWER = MINÚSCULAS ## Converte o texto em minĆŗsculas -MID = SEG.TEXTO ## Devolve um nĆŗmero especĆ­fico de caracteres de uma cadeia de texto, a partir da posição especificada -MIDB = SEG.TEXTOB ## Devolve um nĆŗmero especĆ­fico de caracteres de uma cadeia de texto, a partir da posição especificada -PHONETIC = FONƉTICA ## Retira os caracteres fonĆ©ticos (furigana) de uma cadeia de texto -PROPER = INICIAL.MAIÚSCULA ## Coloca em maiĆŗsculas a primeira letra de cada palavra de um valor de texto -REPLACE = SUBSTITUIR ## Substitui caracteres no texto -REPLACEB = SUBSTITUIRB ## Substitui caracteres no texto -REPT = REPETIR ## Repete texto um determinado nĆŗmero de vezes -RIGHT = DIREITA ## Devolve os caracteres mais Ć  direita de um valor de texto -RIGHTB = DIREITAB ## Devolve os caracteres mais Ć  direita de um valor de texto -SEARCH = PROCURAR ## Localiza um valor de texto dentro de outro (nĆ£o sensĆ­vel a maiĆŗsculas e minĆŗsculas) -SEARCHB = PROCURARB ## Localiza um valor de texto dentro de outro (nĆ£o sensĆ­vel a maiĆŗsculas e minĆŗsculas) -SUBSTITUTE = SUBST ## Substitui texto novo por texto antigo numa cadeia de texto -T = T ## Converte os respectivos argumentos em texto -TEXT = TEXTO ## Formata um nĆŗmero e converte-o em texto -TRIM = COMPACTAR ## Remove espaƧos do texto -UPPER = MAIÚSCULAS ## Converte texto em maiĆŗsculas -VALUE = VALOR ## Converte um argumento de texto num nĆŗmero diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/config deleted file mode 100644 index 9ee9e6c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = р - - -## -## Excel Error Codes (For future use) - -## -NULL = #ŠŸŠ£Š”Š¢Šž! -DIV0 = #ДЕЛ/0! -VALUE = #Š—ŠŠŠ§! -REF = #ДДЫЛ! -NAME = #ИМЯ? -NUM = #Š§Š˜Š”Š›Šž! -NA = #Š/Š” diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/functions deleted file mode 100644 index 3597dbf..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/ru/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from information provided by web-junior (http://www.web-junior.net/) -## -## - - -## -## Add-in and Automation functions Š¤ŃƒŠ½ŠŗŃ†ŠøŠø наГстроек Šø автоматизации -## -GETPIVOTDATA = ŠŸŠžŠ›Š£Š§Š˜Š¢Š¬.Š”ŠŠŠŠ«Š•.Š”Š’ŠžŠ”ŠŠžŠ™.Š¢ŠŠ‘Š›Š˜Š¦Š« ## Возвращает Ганные, Ń…Ń€Š°Š½ŃŃ‰ŠøŠµŃŃ в отчете своГной таблицы. - - -## -## Cube functions Š¤ŃƒŠ½ŠŗŃ†ŠøŠø Куб -## -CUBEKPIMEMBER = ŠšŠ£Š‘Š­Š›Š•ŠœŠ•ŠŠ¢ŠšŠ˜ŠŸ ## Возвращает свойство ŠŗŠ»ŃŽŃ‡ŠµŠ²Š¾Š³Š¾ инГикатора ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚Šø Ā«(КИП)Ā» Šø отображает ŠøŠ¼Ń «КИП» в ŃŃ‡ŠµŠ¹ŠŗŠµ. «КИП» ŠæŃ€ŠµŠ“ŃŃ‚Š°Š²Š»ŃŠµŃ‚ собой ŠŗŠ¾Š»ŠøŃ‡ŠµŃŃ‚Š²ŠµŠ½Š½ŃƒŃŽ Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ, Ń‚Š°ŠŗŃƒŃŽ как ŠµŠ¶ŠµŠ¼ŠµŃŃŃ‡Š½Š°Ń Š²Š°Š»Š¾Š²Š°Ń ŠæŃ€ŠøŠ±Ń‹Š»ŃŒ или ŠµŠ¶ŠµŠŗŠ²Š°Ń€Ń‚Š°Š»ŃŒŠ½Š°Ń Ń‚ŠµŠŗŃƒŃ‡ŠµŃŃ‚ŃŒ каГров, используемой Š“Š»Ń ŠŗŠ¾Š½Ń‚Ń€Š¾Š»Ń ŃŃ„Ń„ŠµŠŗŃ‚ŠøŠ²Š½Š¾ŃŃ‚Šø работы организации. -CUBEMEMBER = ŠšŠ£Š‘Š­Š›Š•ŠœŠ•ŠŠ¢ ## Возвращает ŃŠ»ŠµŠ¼ŠµŠ½Ń‚ или кортеж ŠøŠ· куба. Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ Š“Š»Ń проверки ŃŃƒŃ‰ŠµŃŃ‚Š²Š¾Š²Š°Š½ŠøŃ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š° или кортежа в кубе. -CUBEMEMBERPROPERTY = ŠšŠ£Š‘Š”Š’ŠžŠ™Š”Š¢Š’ŠžŠ­Š›Š•ŠœŠ•ŠŠ¢Š ## Возвращает значение свойства ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š° ŠøŠ· куба. Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ Š“Š»Ń проверки ŃŃƒŃ‰ŠµŃŃ‚Š²Š¾Š²Š°Š½ŠøŃ имени ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š° в кубе Šø возвращает указанное свойство Š“Š»Ń ŃŃ‚Š¾Š³Š¾ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š°. -CUBERANKEDMEMBER = ŠšŠ£Š‘ŠŸŠžŠ Š­Š›Š•ŠœŠ•ŠŠ¢ ## Возвращает n-ый или ранжированный ŃŠ»ŠµŠ¼ŠµŠ½Ń‚ в множество. Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ Š“Š»Ń Š²Š¾Š·Š²Ń€Š°Ń‰ŠµŠ½ŠøŃ оГного или Š½ŠµŃŠŗŠ¾Š»ŃŒŠŗŠøŃ… ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² в множество, например, Š»ŃƒŃ‡ŃˆŠµŠ³Š¾ проГавца или 10 Š»ŃƒŃ‡ŃˆŠøŃ… ŃŃ‚ŃƒŠ“ŠµŠ½Ń‚Š¾Š². -CUBESET = ŠšŠ£Š‘ŠœŠŠžŠ– ## ŠžŠæŃ€ŠµŠ“ŠµŠ»ŃŠµŃ‚ Š²Ń‹Ń‡ŠøŃŠ»ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾Šµ множество ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² или кортежей, Š¾Ń‚ŠæŃ€Š°Š²Š»ŃŃ на сервер выражение, которое созГает множество, а затем возвращает его в Microsoft Office Excel. -CUBESETCOUNT = ŠšŠ£Š‘Š§Š˜Š”Š›ŠžŠ­Š›ŠœŠŠžŠ– ## Возвращает число ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² множества. -CUBEVALUE = ŠšŠ£Š‘Š—ŠŠŠ§Š•ŠŠ˜Š• ## Возвращает обобщенное значение ŠøŠ· куба. - - -## -## Database functions Š¤ŃƒŠ½ŠŗŃ†ŠøŠø Š“Š»Ń работы с базами Ганных -## -DAVERAGE = Š”Š”Š Š—ŠŠŠ§ ## Возвращает среГнее значение выбранных записей базы Ганных. -DCOUNT = БДЧЁТ ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество числовых ŃŃ‡ŠµŠµŠŗ в базе Ганных. -DCOUNTA = БДЧЁТА ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество Š½ŠµŠæŃƒŃŃ‚ых ŃŃ‡ŠµŠµŠŗ в базе Ганных. -DGET = Š‘Š˜Š—Š’Š›Š•Š§Š¬ ## Š˜Š·Š²Š»ŠµŠŗŠ°ŠµŃ‚ ŠøŠ· базы Ганных оГну запись, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŃƒŃŽ заГанному ŃƒŃŠ»Š¾Š²ŠøŃŽ. -DMAX = Š”ŠœŠŠšŠ” ## Возвращает максимальное значение среГи выГеленных записей базы Ганных. -DMIN = Š”ŠœŠ˜Š ## Возвращает минимальное значение среГи выГеленных записей базы Ганных. -DPRODUCT = Š‘Š”ŠŸŠ ŠžŠ˜Š—Š’Š•Š” ## ŠŸŠµŃ€ŠµŠ¼Š½Š¾Š¶Š°ŠµŃ‚ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ опреГеленного ŠæŠ¾Š»Ń в Š·Š°ŠæŠøŃŃŃ… базы Ганных, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŃ… ŃƒŃŠ»Š¾Š²ŠøŃŽ. -DSTDEV = Š”Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ› ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ станГартное отклонение по выборке Š“Š»Ń выГеленных записей базы Ганных. -DSTDEVP = Š”Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ›ŠŸ ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ станГартное отклонение по Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø Š“Š»Ń выГеленных записей базы Ганных -DSUM = Š‘Š”Š”Š£ŠœŠœ ## Š”ŃƒŠ¼Š¼ŠøŃ€ŃƒŠµŃ‚ числа в поле Š“Š»Ń записей базы Ганных, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŃ… ŃƒŃŠ»Š¾Š²ŠøŃŽ. -DVAR = Š‘Š”Š”Š˜Š”ŠŸ ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ по выборке ŠøŠ· выГеленных записей базы Ганных -DVARP = Š‘Š”Š”Š˜Š”ŠŸŠŸ ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ по Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø Š“Š»Ń выГеленных записей базы Ганных - - -## -## Date and time functions Š¤ŃƒŠ½ŠŗŃ†ŠøŠø Гаты Šø времени -## -DATE = ДАТА ## Возвращает Š·Š°Š“Š°Š½Š½ŃƒŃŽ Š“Š°Ń‚Ńƒ в числовом формате. -DATEVALUE = Š”ŠŠ¢ŠŠ—ŠŠŠ§ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ ŠøŠ· текстового формата в числовой формат. -DAY = Š”Š•ŠŠ¬ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в Гень Š¼ŠµŃŃŃ†Š°. -DAYS360 = Š”ŠŠ•Š™360 ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ количество Гней межГу Š“Š²ŃƒŠ¼Ń Гатами на основе 360-Гневного гоГа. -EDATE = Š”ŠŠ¢ŠŠœŠ•Š” ## Возвращает Š“Š°Ń‚Ńƒ в числовом формате, Š¾Ń‚ŃŃ‚Š¾ŃŃ‰ŃƒŃŽ на заГанное число Š¼ŠµŃŃŃ†ŠµŠ² впереГ или назаГ от Š½Š°Ń‡Š°Š»ŃŒŠ½Š¾Š¹ Гаты. -EOMONTH = ŠšŠžŠŠœŠ•Š”ŠÆŠ¦Š ## Возвращает Š“Š°Ń‚Ńƒ в числовом формате Š“Š»Ń послеГнего Š“Š½Ń Š¼ŠµŃŃŃ†Š°, Š¾Ń‚ŃŃ‚Š¾ŃŃ‰ŠµŠ³Š¾ впереГ или назаГ на заГанное число Š¼ŠµŃŃŃ†ŠµŠ². -HOUR = ЧАД ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в часы. -MINUTE = ŠœŠ˜ŠŠ£Š¢Š« ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в Š¼ŠøŠ½ŃƒŃ‚Ń‹. -MONTH = ŠœŠ•Š”ŠÆŠ¦ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в Š¼ŠµŃŃŃ†Ń‹. -NETWORKDAYS = Š§Š˜Š”Š¢Š ŠŠ‘Š”ŠŠ˜ ## Возвращает количество рабочих Гней межГу Š“Š²ŃƒŠ¼Ń Гатами. -NOW = ТДАТА ## Возвращает Ń‚ŠµŠŗŃƒŃ‰ŃƒŃŽ Š“Š°Ń‚Ńƒ Šø Š²Ń€ŠµŠ¼Ń в числовом формате. -SECOND = Š”Š•ŠšŠ£ŠŠ”Š« ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в ŃŠµŠŗŃƒŠ½Š“Ń‹. -TIME = Š’Š Š•ŠœŠÆ ## Возвращает заГанное Š²Ń€ŠµŠ¼Ń в числовом формате. -TIMEVALUE = Š’Š Š•ŠœŠ—ŠŠŠ§ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š²Ń€ŠµŠ¼Ń ŠøŠ· текстового формата в числовой формат. -TODAY = Š”Š•Š“ŠžŠ”ŠŠÆ ## Возвращает Ń‚ŠµŠŗŃƒŃ‰ŃƒŃŽ Š“Š°Ń‚Ńƒ в числовом формате. -WEEKDAY = Š”Š•ŠŠ¬ŠŠ•Š” ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в Гень неГели. -WEEKNUM = ŠŠžŠœŠŠ•Š”Š•Š›Š˜ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ числовое преГставление в число, которое ŃƒŠŗŠ°Š·Ń‹Š²Š°ŠµŃ‚, на ŠŗŠ°ŠŗŃƒŃŽ Š½ŠµŠ“ŠµŠ»ŃŽ гоГа ŠæŃ€ŠøŃ…Š¾Š“ŠøŃ‚ŃŃ ŃƒŠŗŠ°Š·Š°Š½Š½Š°Ń Гата. -WORKDAY = Š ŠŠ‘Š”Š•ŠŠ¬ ## Возвращает Š“Š°Ń‚Ńƒ в числовом формате, Š¾Ń‚ŃŃ‚Š¾ŃŃ‰ŃƒŃŽ впереГ или назаГ на заГанное количество рабочих Гней. -YEAR = Š“ŠžŠ” ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“Š°Ń‚Ńƒ в числовом формате в гоГ. -YEARFRAC = Š”ŠžŠ›ŠÆŠ“ŠžŠ”Š ## Возвращает Š“Š¾Š»ŃŽ гоГа, ŠŗŠ¾Ń‚Š¾Ń€ŃƒŃŽ ŃŠ¾ŃŃ‚Š°Š²Š»ŃŠµŃ‚ количество Гней межГу Š½Š°Ń‡Š°Š»ŃŒŠ½Š¾Š¹ Šø конечной Гатами. - - -## -## Engineering functions Š˜Š½Š¶ŠµŠ½ŠµŃ€Š½Ń‹Šµ Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -BESSELI = БЕДДЕЛЬ.I ## Возвращает Š¼Š¾Š“ŠøŃ„ŠøŃ†ŠøŃ€Š¾Š²Š°Š½Š½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Š‘ŠµŃŃŠµŠ»Ń In(x). -BESSELJ = БЕДДЕЛЬ.J ## Возвращает Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Š‘ŠµŃŃŠµŠ»Ń Jn(x). -BESSELK = БЕДДЕЛЬ.K ## Возвращает Š¼Š¾Š“ŠøŃ„ŠøŃ†ŠøŃ€Š¾Š²Š°Š½Š½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Š‘ŠµŃŃŠµŠ»Ń Kn(x). -BESSELY = БЕДДЕЛЬ.Y ## Возвращает Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Š‘ŠµŃŃŠµŠ»Ń Yn(x). -BIN2DEC = ДВ.Š’.ДЕД ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Гвоичное число в Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ. -BIN2HEX = ДВ.Š’.ŠØŠ•Š”Š¢Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Гвоичное число в ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ. -BIN2OCT = ДВ.Š’.Š’ŠžŠ”Š¬Šœ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Гвоичное число в Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ. -COMPLEX = ŠšŠžŠœŠŸŠ›Š•ŠšŠ”Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚Ń‹ при вещественной Šø мнимой Ń‡Š°ŃŃ‚ŃŃ… комплексного числа в комплексное число. -CONVERT = ŠŸŠ Š•ŠžŠ‘Š  ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ число ŠøŠ· оГной системы еГиниц ŠøŠ·Š¼ŠµŃ€ŠµŠ½ŠøŃ в Š“Ń€ŃƒŠ³ŃƒŃŽ. -DEC2BIN = ДЕД.Š’.ДВ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ число в Гвоичное. -DEC2HEX = ДЕД.Š’.ŠØŠ•Š”Š¢Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ число в ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ. -DEC2OCT = ДЕД.Š’.Š’ŠžŠ”Š¬Šœ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ число в Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ. -DELTA = ДЕЛЬТА ## ŠŸŃ€Š¾Š²ŠµŃ€ŃŠµŃ‚ равенство Š“Š²ŃƒŃ… значений. -ERF = Š¤ŠžŠØ ## Возвращает Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ ошибки. -ERFC = Š”Š¤ŠžŠØ ## Возвращает Š“Š¾ŠæŠ¾Š»Š½ŠøŃ‚ŠµŠ»ŃŒŠ½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ ошибки. -GESTEP = ŠŸŠžŠ ŠžŠ“ ## ŠŸŃ€Š¾Š²ŠµŃ€ŃŠµŃ‚, не ŠæŃ€ŠµŠ²Ń‹ŃˆŠ°ŠµŃ‚ ли Ганное число порогового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -HEX2BIN = ŠØŠ•Š”Š¢Š.Š’.ДВ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в Гвоичное. -HEX2DEC = ŠØŠ•Š”Š¢Š.Š’.ДЕД ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ. -HEX2OCT = ŠØŠ•Š”Š¢Š.Š’.Š’ŠžŠ”Š¬Šœ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ. -IMABS = ŠœŠŠ˜Šœ.ABS ## Возвращает Š°Š±ŃŠ¾Š»ŃŽŃ‚Š½ŃƒŃŽ Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ (моГуль) комплексного числа. -IMAGINARY = ŠœŠŠ˜Šœ.ЧАДТЬ ## Возвращает ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ при мнимой части комплексного числа. -IMARGUMENT = ŠœŠŠ˜Šœ.ŠŠ Š“Š£ŠœŠ•ŠŠ¢ ## Возвращает значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а комплексного числа (тета) — угол, выраженный в раГианах. -IMCONJUGATE = ŠœŠŠ˜Šœ.Š”ŠžŠŸŠ ŠÆŠ– ## Возвращает комплексно-ŃŠ¾ŠæŃ€ŃŠ¶ŠµŠ½Š½Š¾Šµ комплексное число. -IMCOS = ŠœŠŠ˜Šœ.COS ## Возвращает косинус комплексного числа. -IMDIV = ŠœŠŠ˜Šœ.ДЕЛ ## Возвращает частное от Š“ŠµŠ»ŠµŠ½ŠøŃ Š“Š²ŃƒŃ… комплексных чисел. -IMEXP = ŠœŠŠ˜Šœ.EXP ## Возвращает ŃŠŗŃŠæŠ¾Š½ŠµŠ½Ń‚Ńƒ комплексного числа. -IMLN = ŠœŠŠ˜Šœ.LN ## Возвращает Š½Š°Ń‚ŃƒŃ€Š°Š»ŃŒŠ½Ń‹Š¹ логарифм комплексного числа. -IMLOG10 = ŠœŠŠ˜Šœ.LOG10 ## Возвращает обычный (Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Š¹) логарифм комплексного числа. -IMLOG2 = ŠœŠŠ˜Šœ.LOG2 ## Возвращает Гвоичный логарифм комплексного числа. -IMPOWER = ŠœŠŠ˜Šœ.Š”Š¢Š•ŠŸŠ•ŠŠ¬ ## Возвращает комплексное число, возвеГенное в Ń†ŠµŠ»ŃƒŃŽ ŃŃ‚ŠµŠæŠµŠ½ŃŒ. -IMPRODUCT = ŠœŠŠ˜Šœ.ŠŸŠ ŠžŠ˜Š—Š’Š•Š” ## Возвращает произвеГение от 2 Го 29 комплексных чисел. -IMREAL = ŠœŠŠ˜Šœ.ВЕЩ ## Возвращает ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ при вещественной части комплексного числа. -IMSIN = ŠœŠŠ˜Šœ.SIN ## Возвращает синус комплексного числа. -IMSQRT = ŠœŠŠ˜Šœ.ŠšŠžŠ Š•ŠŠ¬ ## Возвращает значение кваГратного ŠŗŠ¾Ń€Š½Ń ŠøŠ· комплексного числа. -IMSUB = ŠœŠŠ˜Šœ.Š ŠŠ—Š ## Возвращает Ń€Š°Š·Š½Š¾ŃŃ‚ŃŒ Š“Š²ŃƒŃ… комплексных чисел. -IMSUM = ŠœŠŠ˜Šœ.ДУММ ## Возвращает сумму комплексных чисел. -OCT2BIN = Š’ŠžŠ”Š¬Šœ.Š’.ДВ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в Гвоичное. -OCT2DEC = Š’ŠžŠ”Š¬Šœ.Š’.ДЕД ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в Š“ŠµŃŃŃ‚ŠøŃ‡Š½Š¾Šµ. -OCT2HEX = Š’ŠžŠ”Š¬Šœ.Š’.ŠØŠ•Š”Š¢Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š²Š¾ŃŃŒŠ¼ŠµŃ€ŠøŃ‡Š½Š¾Šµ число в ŃˆŠµŃŃ‚Š½Š°Š“Ń†Š°Ń‚ŠµŃ€ŠøŃ‡Š½Š¾Šµ. - - -## -## Financial functions Финансовые Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -ACCRINT = ŠŠŠšŠžŠŸŠ”ŠžŠ„ŠžŠ” ## Возвращает накопленный процент по ценным бумагам с периоГической выплатой процентов. -ACCRINTM = ŠŠŠšŠžŠŸŠ”ŠžŠ„ŠžŠ”ŠŸŠžŠ“ŠŠØ ## Возвращает накопленный процент по ценным бумагам, проценты по которым Š²Ń‹ŠæŠ»Š°Ń‡ŠøŠ²Š°ŃŽŃ‚ся в срок ŠæŠ¾Š³Š°ŃˆŠµŠ½ŠøŃ. -AMORDEGRC = ŠŠœŠžŠ Š£Šœ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации Š“Š»Ń кажГого периоГа, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃ ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ амортизации. -AMORLINC = ŠŠœŠžŠ Š£Š’ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации Š“Š»Ń кажГого периоГа. -COUPDAYBS = Š”ŠŠ•Š™ŠšŠ£ŠŸŠžŠŠ”Šž ## Возвращает количество Гней от начала Š“ŠµŠ¹ŃŃ‚Š²ŠøŃ купона Го Гаты ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ. -COUPDAYS = Š”ŠŠ•Š™ŠšŠ£ŠŸŠžŠ ## Возвращает число Гней в периоГе купона, соГержащем Š“Š°Ń‚Ńƒ ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ. -COUPDAYSNC = Š”ŠŠ•Š™ŠšŠ£ŠŸŠžŠŠŸŠžŠ”Š›Š• ## Возвращает число Гней от Гаты ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ Го срока ŃŠ»ŠµŠ“ŃƒŃŽŃ‰ŠµŠ³Š¾ купона. -COUPNCD = Š”ŠŠ¢ŠŠšŠ£ŠŸŠžŠŠŸŠžŠ”Š›Š• ## Возвращает ŃŠ»ŠµŠ“ŃƒŃŽŃ‰ŃƒŃŽ Š“Š°Ń‚Ńƒ купона после Гаты ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ. -COUPNUM = Š§Š˜Š”Š›ŠšŠ£ŠŸŠžŠ ## Возвращает количество купонов, которые Š¼Š¾Š³ŃƒŃ‚ Š±Ń‹Ń‚ŃŒ оплачены межГу Гатой ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ Šø сроком Š²ŃŃ‚ŃƒŠæŠ»ŠµŠ½ŠøŃ в силу. -COUPPCD = Š”ŠŠ¢ŠŠšŠ£ŠŸŠžŠŠ”Šž ## Возвращает ŠæŃ€ŠµŠ“Ń‹Š“ŃƒŃ‰ŃƒŃŽ Š“Š°Ń‚Ńƒ купона переГ Гатой ŃŠ¾Š³Š»Š°ŃˆŠµŠ½ŠøŃ. -CUMIPMT = ŠžŠ‘Š©ŠŸŠ›ŠŠ¢ ## Возвращает Š¾Š±Ń‰ŃƒŃŽ Š²Ń‹ŠæŠ»Š°Ń‚Ńƒ, ŠæŃ€Š¾ŠøŠ·Š²ŠµŠ“ŠµŠ½Š½ŃƒŃŽ межГу Š“Š²ŃƒŠ¼Ń периоГическими выплатами. -CUMPRINC = ŠžŠ‘Š©Š”ŠžŠ„ŠžŠ” ## Возвращает Š¾Š±Ń‰ŃƒŃŽ Š²Ń‹ŠæŠ»Š°Ń‚Ńƒ по займу межГу Š“Š²ŃƒŠ¼Ń периоГами. -DB = Š¤Š£Šž ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации актива Š“Š»Ń заГанного периоГа, Ń€Š°ŃŃŃ‡ŠøŃ‚Š°Š½Š½ŃƒŃŽ метоГом фиксированного ŃƒŠ¼ŠµŠ½ŃŒŃˆŠµŠ½ŠøŃ остатка. -DDB = Š”Š”ŠžŠ‘ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации актива за Ганный периоГ, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃ метоГ Гвойного ŃƒŠ¼ŠµŠ½ŃŒŃˆŠµŠ½ŠøŃ остатка или иной ŃŠ²Š½Š¾ ŃƒŠŗŠ°Š·Š°Š½Š½Ń‹Š¹ метоГ. -DISC = Š”ŠšŠ˜Š”ŠšŠ ## Возвращает Š½Š¾Ń€Š¼Ńƒ скиГки Š“Š»Ń ценных бумаг. -DOLLARDE = РУБЛЬ.ДЕД ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Ń†ŠµŠ½Ńƒ в Ń€ŃƒŠ±Š»ŃŃ…, Š²Ń‹Ń€Š°Š¶ŠµŠ½Š½ŃƒŃŽ в виГе Гроби, в Ń†ŠµŠ½Ńƒ в Ń€ŃƒŠ±Š»ŃŃ…, Š²Ń‹Ń€Š°Š¶ŠµŠ½Š½ŃƒŃŽ Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Š¼ числом. -DOLLARFR = РУБЛЬ.Š”Š ŠžŠ‘Š¬ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Ń†ŠµŠ½Ńƒ в Ń€ŃƒŠ±Š»ŃŃ…, Š²Ń‹Ń€Š°Š¶ŠµŠ½Š½ŃƒŃŽ Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Š¼ числом, в Ń†ŠµŠ½Ńƒ в Ń€ŃƒŠ±Š»ŃŃ…, Š²Ń‹Ń€Š°Š¶ŠµŠ½Š½ŃƒŃŽ в виГе Гроби. -DURATION = Š”Š›Š˜Š¢ ## Возвращает ŠµŠ¶ŠµŠ³Š¾Š“Š½ŃƒŃŽ ŠæŃ€Š¾Š“Š¾Š»Š¶ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚ŃŒ Š“ŠµŠ¹ŃŃ‚Š²ŠøŃ ценных бумаг с периоГическими выплатами по процентам. -EFFECT = Š­Š¤Š¤Š•ŠšŠ¢ ## Возвращает Š“ŠµŠ¹ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŠµ ежегоГные процентные ставки. -FV = БД ## Возвращает Š±ŃƒŠ“ŃƒŃ‰ŃƒŃŽ ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒ инвестиции. -FVSCHEDULE = Š‘Š—Š ŠŠ”ŠŸŠ˜Š” ## Возвращает Š±ŃƒŠ“ŃƒŃ‰ŃƒŃŽ ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒ ŠæŠµŃ€Š²Š¾Š½Š°Ń‡Š°Š»ŃŒŠ½Š¾Š¹ основной ŃŃƒŠ¼Š¼Ń‹ после Š½Š°Ń‡ŠøŃŠ»ŠµŠ½ŠøŃ Ń€ŃŠ“Š° сложных процентов. -INTRATE = Š˜ŠŠžŠ ŠœŠ ## Возвращает ŠæŃ€Š¾Ń†ŠµŠ½Ń‚Š½ŃƒŃŽ ŃŃ‚Š°Š²ŠŗŃƒ Š“Š»Ń ŠæŠ¾Š»Š½Š¾ŃŃ‚ŃŒŃŽ инвестированных ценных бумаг. -IPMT = ŠŸŠ ŠŸŠ›Š¢ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ выплаты прибыли на Š²Š»Š¾Š¶ŠµŠ½ŠøŃ за Ганный периоГ. -IRR = ВДД ## Возвращает Š²Š½ŃƒŃ‚Ń€ŠµŠ½Š½ŃŽŃŽ ŃŃ‚Š°Š²ŠŗŃƒ ГохоГности Š“Š»Ń Ń€ŃŠ“Š° потоков Генежных среГств. -ISPMT = ŠŸŠ ŠžŠ¦ŠŸŠ›ŠŠ¢ ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ выплаты за ŃƒŠŗŠ°Š·Š°Š½Š½Ń‹Š¹ периоГ инвестиции. -MDURATION = ŠœŠ”Š›Š˜Š¢ ## Возвращает Š¼Š¾Š“ŠøŃ„ŠøŃ†ŠøŃ€Š¾Š²Š°Š½Š½ŃƒŃŽ Š“Š»ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚ŃŒ ŠœŠ°ŠŗŠ¾Š»ŠµŃ Š“Š»Ń ценных бумаг с преГполагаемой номинальной ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒŃŽ 100 Ń€ŃƒŠ±Š»ŠµŠ¹. -MIRR = ŠœŠ’Š”Š” ## Возвращает Š²Š½ŃƒŃ‚Ń€ŠµŠ½Š½ŃŽŃŽ ŃŃ‚Š°Š²ŠŗŃƒ ГохоГности, при которой ŠæŠ¾Š»Š¾Š¶ŠøŃ‚ŠµŠ»ŃŒŠ½Ń‹Šµ Šø Š¾Ń‚Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Ń‹Šµ Генежные потоки ŠøŠ¼ŠµŃŽŃ‚ разные Š·Š½Š°Ń‡ŠµŠ½ŠøŃ ставки. -NOMINAL = ŠŠžŠœŠ˜ŠŠŠ› ## Возвращает Š½Š¾Š¼ŠøŠ½Š°Š»ŃŒŠ½ŃƒŃŽ Š³Š¾Š“Š¾Š²ŃƒŃŽ ŠæŃ€Š¾Ń†ŠµŠ½Ń‚Š½ŃƒŃŽ ŃŃ‚Š°Š²ŠŗŃƒ. -NPER = ŠšŠŸŠ•Š  ## Возвращает общее количество периоГов выплаты Š“Š»Ń Ганного вклаГа. -NPV = ЧПД ## Возвращает Ń‡ŠøŃŃ‚ŃƒŃŽ ŠæŃ€ŠøŠ²ŠµŠ“ŠµŠ½Š½ŃƒŃŽ ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒ инвестиции, основанной на серии периоГических Генежных потоков Šø ставке Š“ŠøŃŠŗŠ¾Š½Ń‚ŠøŃ€Š¾Š²Š°Š½ŠøŃ. -ODDFPRICE = Š¦Š•ŠŠŠŸŠ•Š Š’ŠŠ•Š Š•Š“ ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ Š½Š°Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Š¾Š¹ стоимости ценных бумаг с Š½ŠµŃ€ŠµŠ³ŃƒŠ»ŃŃ€Š½Ń‹Š¼ первым периоГом. -ODDFYIELD = Š”ŠžŠ„ŠžŠ”ŠŸŠ•Š Š’ŠŠ•Š Š•Š“ ## Возвращает ГохоГ по ценным бумагам с Š½ŠµŃ€ŠµŠ³ŃƒŠ»ŃŃ€Š½Ń‹Š¼ первым периоГом. -ODDLPRICE = Š¦Š•ŠŠŠŸŠžŠ”Š›ŠŠ•Š Š•Š“ ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ Š½Š°Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Š¾Š¹ стоимости ценных бумаг с Š½ŠµŃ€ŠµŠ³ŃƒŠ»ŃŃ€Š½Ń‹Š¼ послеГним периоГом. -ODDLYIELD = Š”ŠžŠ„ŠžŠ”ŠŸŠžŠ”Š›ŠŠ•Š Š•Š“ ## Возвращает ГохоГ по ценным бумагам с Š½ŠµŃ€ŠµŠ³ŃƒŠ»ŃŃ€Š½Ń‹Š¼ послеГним периоГом. -PMT = ŠŸŠ›Š¢ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ выплаты за оГин периоГ Š°Š½Š½ŃƒŠøŃ‚ŠµŃ‚Š°. -PPMT = ŠžŠ”ŠŸŠ›Š¢ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ выплат в погашение основной ŃŃƒŠ¼Š¼Ń‹ по инвестиции за заГанный периоГ. -PRICE = Š¦Š•ŠŠ ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ Š½Š°Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Š¾Š¹ стоимости ценных бумаг, по которым ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøŃ‚ŃŃ ŠæŠµŃ€ŠøŠ¾Š“ŠøŃ‡ŠµŃŠŗŠ°Ń выплата процентов. -PRICEDISC = Š¦Š•ŠŠŠ”ŠšŠ˜Š”ŠšŠ ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ номинальной стоимости ценных бумаг, на которые сГелана скиГка. -PRICEMAT = Š¦Š•ŠŠŠŸŠžŠ“ŠŠØ ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ номинальной стоимости ценных бумаг, проценты по которым Š²Ń‹ŠæŠ»Š°Ń‡ŠøŠ²Š°ŃŽŃ‚ся в срок ŠæŠ¾Š³Š°ŃˆŠµŠ½ŠøŃ. -PV = ПД ## Возвращает ŠæŃ€ŠøŠ²ŠµŠ“ŠµŠ½Š½ŃƒŃŽ (Šŗ Ń‚ŠµŠŗŃƒŃ‰ŠµŠ¼Ńƒ Š¼Š¾Š¼ŠµŠ½Ń‚Ńƒ) ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒ инвестиции. -RATE = Š”Š¢ŠŠ’ŠšŠ ## Возвращает ŠæŃ€Š¾Ń†ŠµŠ½Ń‚Š½ŃƒŃŽ ŃŃ‚Š°Š²ŠŗŃƒ по Š°Š½Š½ŃƒŠøŃ‚ŠµŃ‚Ńƒ за оГин периоГ. -RECEIVED = ŠŸŠžŠ›Š£Š§Š•ŠŠž ## Возвращает сумму, ŠæŠ¾Š»ŃƒŃ‡ŠµŠ½Š½ŃƒŃŽ Šŗ ŃŃ€Š¾ŠŗŃƒ ŠæŠ¾Š³Š°ŃˆŠµŠ½ŠøŃ ŠæŠ¾Š»Š½Š¾ŃŃ‚ŃŒŃŽ обеспеченных ценных бумаг. -SLN = ŠŠŸŠ› ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ линейной амортизации актива за оГин периоГ. -SYD = АДЧ ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации актива за Ганный периоГ, Ń€Š°ŃŃŃ‡ŠøŃ‚Š°Š½Š½ŃƒŃŽ метоГом ŃŃƒŠ¼Š¼Ń‹ гоГовых чисел. -TBILLEQ = Š ŠŠ’ŠŠžŠšŠ§Š•Šš ## Возвращает ŃŠŗŠ²ŠøŠ²Š°Š»ŠµŠ½Ń‚Š½Ń‹Š¹ облигации ГохоГ по ŠŗŠ°Š·Š½Š°Ń‡ŠµŠ¹ŃŠŗŠ¾Š¼Ńƒ Ń‡ŠµŠŗŃƒ. -TBILLPRICE = Š¦Š•ŠŠŠšŠ§Š•Šš ## Возвращает Ń†ŠµŠ½Ńƒ за 100 Ń€ŃƒŠ±Š»ŠµŠ¹ Š½Š°Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Š¾Š¹ стоимости Š“Š»Ń казначейского чека. -TBILLYIELD = Š”ŠžŠ„ŠžŠ”ŠšŠ§Š•Šš ## Возвращает ГохоГ по ŠŗŠ°Š·Š½Š°Ń‡ŠµŠ¹ŃŠŗŠ¾Š¼Ńƒ Ń‡ŠµŠŗŃƒ. -VDB = ŠŸŠ£Šž ## Возвращает Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ амортизации актива Š“Š»Ń указанного или частичного периоГа при использовании метоГа ŃŠ¾ŠŗŃ€Š°Ń‰Š°ŃŽŃ‰ŠµŠ³Š¾ŃŃ баланса. -XIRR = Š§Š˜Š”Š¢Š’ŠŠ”ŠžŠ„ ## Возвращает Š²Š½ŃƒŃ‚Ń€ŠµŠ½Š½ŃŽŃŽ ŃŃ‚Š°Š²ŠŗŃƒ ГохоГности Š“Š»Ń графика Генежных потоков, которые не Š¾Š±ŃŠ·Š°Ń‚ŠµŠ»ŃŒŠ½Š¾ Š½Š¾ŃŃŃ‚ периоГический характер. -XNPV = Š§Š˜Š”Š¢ŠŠ— ## Возвращает Ń‡ŠøŃŃ‚ŃƒŃŽ ŠæŃ€ŠøŠ²ŠµŠ“ŠµŠ½Š½ŃƒŃŽ ŃŃ‚Š¾ŠøŠ¼Š¾ŃŃ‚ŃŒ Š“Š»Ń Генежных потоков, которые не Š¾Š±ŃŠ·Š°Ń‚ŠµŠ»ŃŒŠ½Š¾ ŃŠ²Š»ŃŃŽŃ‚ŃŃ периоГическими. -YIELD = Š”ŠžŠ„ŠžŠ” ## Возвращает ГохоГ от ценных бумаг, по которым ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŃŃ‚ŃŃ периоГические выплаты процентов. -YIELDDISC = Š”ŠžŠ„ŠžŠ”Š”ŠšŠ˜Š”ŠšŠ ## Возвращает гоГовой ГохоГ по ценным бумагам, на которые сГелана скиГка (пример — казначейские чеки). -YIELDMAT = Š”ŠžŠ„ŠžŠ”ŠŸŠžŠ“ŠŠØ ## Возвращает гоГовой ГохоГ от ценных бумаг, проценты по которым Š²Ń‹ŠæŠ»Š°Ń‡ŠøŠ²Š°ŃŽŃ‚ся в срок ŠæŠ¾Š³Š°ŃˆŠµŠ½ŠøŃ. - - -## -## Information functions Š˜Š½Ń„Š¾Ń€Š¼Š°Ń†ŠøŠ¾Š½Š½Ń‹Šµ Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -CELL = ŠÆŠ§Š•Š™ŠšŠ ## Возвращает ŠøŠ½Ń„Š¾Ń€Š¼Š°Ń†ŠøŃŽ о формате, расположении или соГержимом ŃŃ‡ŠµŠ¹ŠŗŠø. -ERROR.TYPE = ТИП.ŠžŠØŠ˜Š‘ŠšŠ˜ ## Возвращает числовой коГ, ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŠ¹ Ń‚ŠøŠæŃƒ ошибки. -INFO = Š˜ŠŠ¤ŠžŠ Šœ ## Возвращает ŠøŠ½Ń„Š¾Ń€Š¼Š°Ń†ŠøŃŽ о Ń‚ŠµŠŗŃƒŃ‰ŠµŠ¹ операционной среГе. -ISBLANK = Š•ŠŸŠ£Š”Š¢Šž ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŠ²Š»ŃŠµŃ‚ŃŃ ссылкой на ŠæŃƒŃŃ‚ŃƒŃŽ ŃŃ‡ŠµŠ¹ŠŗŃƒ. -ISERR = Š•ŠžŠØ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŃŃ‹Š»Š°ŠµŃ‚ŃŃ на Š»ŃŽŠ±Š¾Šµ значение ошибки, кроме #Š/Š”. -ISERROR = Š•ŠžŠØŠ˜Š‘ŠšŠ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŃŃ‹Š»Š°ŠµŃ‚ŃŃ на Š»ŃŽŠ±Š¾Šµ значение ошибки. -ISEVEN = Š•Š§ŠŠ¢Š ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а ŃŠ²Š»ŃŠµŃ‚ŃŃ четным числом. -ISLOGICAL = Š•Š›ŠžŠ“Š˜Š§ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŃŃ‹Š»Š°ŠµŃ‚ŃŃ на логическое значение. -ISNA = Š•ŠŠ” ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŃŃ‹Š»Š°ŠµŃ‚ŃŃ на значение ошибки #Š/Š”. -ISNONTEXT = Š•ŠŠ•Š¢Š•ŠšŠ”Š¢ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а не ŃŠ²Š»ŃŠµŃ‚ŃŃ текстом. -ISNUMBER = Š•Š§Š˜Š”Š›Šž ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ ŃŃŃ‹Š»Š°ŠµŃ‚ŃŃ на число. -ISODD = Š•ŠŠ•Š§ŠŠ¢ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а ŃŠ²Š»ŃŠµŃ‚ŃŃ нечетным числом. -ISREF = Š•Š”Š”Š«Š›ŠšŠ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а ŃŠ²Š»ŃŠµŃ‚ŃŃ ссылкой. -ISTEXT = Š•Š¢Š•ŠšŠ”Š¢ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если значение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а ŃŠ²Š»ŃŠµŃ‚ŃŃ текстом. -N = Ч ## Возвращает значение, преобразованное в число. -NA = ŠŠ” ## Возвращает значение ошибки #Š/Š”. -TYPE = ТИП ## Возвращает число, Š¾Š±Š¾Š·Š½Š°Ń‡Š°ŃŽŃ‰ŠµŠµ тип Ганных Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. - - -## -## Logical functions Логические Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -AND = И ## Renvoie VRAI si tous ses arguments sont VRAI. -FALSE = Š›ŠžŠ–Š¬ ## Возвращает логическое значение Š›ŠžŠ–Ь. -IF = Š•Š”Š›Š˜ ## Š’Ń‹ŠæŠ¾Š»Š½ŃŠµŃ‚ ŠæŃ€Š¾Š²ŠµŃ€ŠŗŃƒ ŃƒŃŠ»Š¾Š²ŠøŃ. -IFERROR = Š•Š”Š›Š˜ŠžŠØŠ˜Š‘ŠšŠ ## Возвращает ввеГённое значение, если вычисление по Ń„Š¾Ń€Š¼ŃƒŠ»Šµ вызывает ошибку; в противном ŃŠ»ŃƒŃ‡Š°Šµ Ń„ŃƒŠ½ŠŗŃ†ŠøŃ возвращает Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚ Š²Ń‹Ń‡ŠøŃŠ»ŠµŠ½ŠøŃ. -NOT = ŠŠ• ## ŠœŠµŠ½ŃŠµŃ‚ логическое значение своего Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚а на противоположное. -OR = Š˜Š›Š˜ ## Возвращает значение Š˜Š”Š¢Š˜ŠŠ, если Ń…Š¾Ń‚Ń бы оГин Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ имеет значение Š˜Š”Š¢Š˜ŠŠ. -TRUE = Š˜Š”Š¢Š˜ŠŠ ## Возвращает логическое значение Š˜Š”Š¢Š˜ŠŠ. - - -## -## Lookup and reference functions Š¤ŃƒŠ½ŠŗŃ†ŠøŠø ссылки Šø поиска -## -ADDRESS = АДРЕД ## Возвращает ŃŃŃ‹Š»ŠŗŃƒ на Š¾Ń‚Š“ŠµŠ»ŃŒŠ½ŃƒŃŽ ŃŃ‡ŠµŠ¹ŠŗŃƒ листа в виГе текста. -AREAS = ŠžŠ‘Š›ŠŠ”Š¢Š˜ ## Возвращает количество областей в ссылке. -CHOOSE = Š’Š«Š‘ŠžŠ  ## Выбирает значение ŠøŠ· списка значений по инГексу. -COLUMN = Š”Š¢ŠžŠ›Š‘Š•Š¦ ## Возвращает номер столбца, на который ŃƒŠŗŠ°Š·Ń‹Š²Š°ŠµŃ‚ ссылка. -COLUMNS = Š§Š˜Š”Š›Š”Š¢ŠžŠ›Š‘ ## Возвращает количество столбцов в ссылке. -HLOOKUP = Š“ŠŸŠ  ## Š˜Ń‰ŠµŃ‚ в первой строке массива Šø возвращает значение отмеченной ŃŃ‡ŠµŠ¹ŠŗŠø -HYPERLINK = Š“Š˜ŠŸŠ•Š Š”Š”Š«Š›ŠšŠ ## ДозГает ŃŃŃ‹Š»ŠŗŃƒ, Š¾Ń‚ŠŗŃ€Ń‹Š²Š°ŃŽŃ‰ŃƒŃŽ Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚, который Š½Š°Ń…Š¾Š“ŠøŃ‚ŃŃ на сервере сети, в интрасети или в Š˜Š½Ń‚ернете. -INDEX = Š˜ŠŠ”Š•ŠšŠ” ## Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ инГекс Š“Š»Ń выбора Š·Š½Š°Ń‡ŠµŠ½ŠøŃ ŠøŠ· ссылки или массива. -INDIRECT = ДВДДЫЛ ## Возвращает ŃŃŃ‹Š»ŠŗŃƒ, Š·Š°Š“Š°Š½Š½ŃƒŃŽ текстовым значением. -LOOKUP = ŠŸŠ ŠžŠ”ŠœŠžŠ¢Š  ## Š˜Ń‰ŠµŃ‚ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в векторе или массиве. -MATCH = ŠŸŠžŠ˜Š”ŠšŠŸŠžŠ— ## Š˜Ń‰ŠµŃ‚ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в ссылке или массиве. -OFFSET = Š”ŠœŠ•Š© ## Возвращает смещение ссылки Š¾Ń‚Š½Š¾ŃŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ заГанной ссылки. -ROW = Š”Š¢Š ŠžŠšŠ ## Возвращает номер строки, Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŃŠµŠ¼Š¾Š¹ ссылкой. -ROWS = Š§Š”Š¢Š ŠžŠš ## Возвращает количество строк в ссылке. -RTD = ДРВ ## Š˜Š·Š²Š»ŠµŠŗŠ°ŠµŃ‚ Ганные Ń€ŠµŠ°Š»ŃŒŠ½Š¾Š³Š¾ времени ŠøŠ· программ, ŠæŠ¾Š“Š“ŠµŃ€Š¶ŠøŠ²Š°ŃŽŃ‰ŠøŃ… Š°Š²Ń‚Š¾Š¼Š°Ń‚ŠøŠ·Š°Ń†ŠøŃŽ COM (ŠŸŃ€Š¾Š³Ń€Š°Š¼Š¼ŠøŃ€Š¾Š²Š°Š½ŠøŠµ Š¾Š±ŃŠŠµŠŗŃ‚Š¾Š². ДтанГартное среГство Š“Š»Ń работы с Š¾Š±ŃŠŠµŠŗŃ‚Š°Š¼Šø некоторого ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ ŠøŠ· Š“Ń€ŃƒŠ³Š¾Š³Š¾ ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ или среГства разработки. ŠŸŃ€Š¾Š³Ń€Š°Š¼Š¼ŠøŃ€Š¾Š²Š°Š½ŠøŠµ Š¾Š±ŃŠŠµŠŗŃ‚Š¾Š² (ранее называемое программированием OLE) ŃŠ²Š»ŃŠµŃ‚ŃŃ Ń„ŃƒŠ½ŠŗŃ†ŠøŠµŠ¹ моГели COM (Component Object Model, моГель компонентных Š¾Š±ŃŠŠµŠŗŃ‚Š¾Š²).). -TRANSPOSE = Š¢Š ŠŠŠ”ŠŸ ## Возвращает транспонированный массив. -VLOOKUP = Š’ŠŸŠ  ## Š˜Ń‰ŠµŃ‚ значение в первом столбце массива Šø возвращает значение ŠøŠ· ŃŃ‡ŠµŠ¹ŠŗŠø в найГенной строке Šø указанном столбце. - - -## -## Math and trigonometry functions ŠœŠ°Ń‚ŠµŠ¼Š°Ń‚ŠøŃ‡ŠµŃŠŗŠøŠµ Šø тригонометрические Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -ABS = ABS ## Возвращает моГуль (Š°Š±ŃŠ¾Š»ŃŽŃ‚Š½ŃƒŃŽ Š²ŠµŠ»ŠøŃ‡ŠøŠ½Ńƒ) числа. -ACOS = ACOS ## Возвращает Š°Ń€ŠŗŠŗŠ¾ŃŠøŠ½ŃƒŃ числа. -ACOSH = ACOSH ## Возвращает гиперболический Š°Ń€ŠŗŠŗŠ¾ŃŠøŠ½ŃƒŃ числа. -ASIN = ASIN ## Возвращает Š°Ń€ŠŗŃŠøŠ½ŃƒŃ числа. -ASINH = ASINH ## Возвращает гиперболический Š°Ń€ŠŗŃŠøŠ½ŃƒŃ числа. -ATAN = ATAN ## Возвращает арктангенс числа. -ATAN2 = ATAN2 ## Возвращает арктангенс Š“Š»Ń заГанных коорГинат x Šø y. -ATANH = ATANH ## Возвращает гиперболический арктангенс числа. -CEILING = ŠžŠšŠ Š’Š’Š•Š Š„ ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего целого или Го ближайшего кратного указанному Š·Š½Š°Ń‡ŠµŠ½ŠøŃŽ. -COMBIN = Š§Š˜Š”Š›ŠšŠžŠœŠ‘ ## Возвращает количество комбинаций Š“Š»Ń заГанного числа Š¾Š±ŃŠŠµŠŗŃ‚ов. -COS = COS ## Возвращает косинус числа. -COSH = COSH ## Возвращает гиперболический косинус числа. -DEGREES = ГРАДУДЫ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ раГианы в Š³Ń€Š°Š“ŃƒŃŃ‹. -EVEN = Š§ŠŠ¢Š ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего четного целого. -EXP = EXP ## Возвращает число e, возвеГенное в ŃƒŠŗŠ°Š·Š°Š½Š½ŃƒŃŽ ŃŃ‚ŠµŠæŠµŠ½ŃŒ. -FACT = ФАКТР ## Возвращает факториал числа. -FACTDOUBLE = Š”Š’Š¤ŠŠšŠ¢Š  ## Возвращает Гвойной факториал числа. -FLOOR = ŠžŠšŠ Š’ŠŠ˜Š— ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего меньшего по Š¼Š¾Š“ŃƒŠ»ŃŽ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -GCD = ŠŠžŠ” ## Возвращает наибольший общий Š“ŠµŠ»ŠøŃ‚ŠµŠ»ŃŒ. -INT = Š¦Š•Š›ŠžŠ• ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего меньшего целого. -LCM = ŠŠžŠš ## Возвращает наименьшее общее кратное. -LN = LN ## Возвращает Š½Š°Ń‚ŃƒŃ€Š°Š»ŃŒŠ½Ń‹Š¹ логарифм числа. -LOG = LOG ## Возвращает логарифм числа по заГанному Š¾ŃŠ½Š¾Š²Š°Š½ŠøŃŽ. -LOG10 = LOG10 ## Возвращает Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Š¹ логарифм числа. -MDETERM = ŠœŠžŠŸŠ Š•Š” ## Возвращает Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŠøŃ‚ŠµŠ»ŃŒ матрицы массива. -MINVERSE = ŠœŠžŠ‘Š  ## Возвращает Š¾Š±Ń€Š°Ń‚Š½ŃƒŃŽ Š¼Š°Ń‚Ń€ŠøŃ†Ńƒ массива. -MMULT = ŠœŠ£ŠœŠŠžŠ– ## Возвращает произвеГение матриц Š“Š²ŃƒŃ… массивов. -MOD = ŠžŠ”Š¢ŠŠ¢ ## Возвращает остаток от Š“ŠµŠ»ŠµŠ½ŠøŃ. -MROUND = ŠžŠšŠ Š£Š“Š›Š¢ ## Возвращает число, Š¾ŠŗŃ€ŃƒŠ³Š»ŠµŠ½Š½Š¾Šµ с Ń‚Ń€ŠµŠ±ŃƒŠµŠ¼Š¾Š¹ Ń‚Š¾Ń‡Š½Š¾ŃŃ‚ŃŒŃŽ. -MULTINOMIAL = ŠœŠ£Š›Š¬Š¢Š˜ŠŠžŠœ ## Возвращает Š¼ŃƒŠ»ŃŒŃ‚ŠøŠ½Š¾Š¼ŠøŠ°Š»ŃŒŠ½Ń‹Š¹ ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ множества чисел. -ODD = ŠŠ•Š§ŠŠ¢ ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего нечетного целого. -PI = ПИ ## Возвращает число пи. -POWER = Š”Š¢Š•ŠŸŠ•ŠŠ¬ ## Возвращает Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚ Š²Š¾Š·Š²ŠµŠ“ŠµŠ½ŠøŃ числа в ŃŃ‚ŠµŠæŠµŠ½ŃŒ. -PRODUCT = ŠŸŠ ŠžŠ˜Š—Š’Š•Š” ## Возвращает произвеГение Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -QUOTIENT = Š§ŠŠ”Š¢ŠŠžŠ• ## Возвращает Ń†ŠµŠ»ŃƒŃŽ Ń‡Š°ŃŃ‚ŃŒ частного при Гелении. -RADIANS = Š ŠŠ”Š˜ŠŠŠ« ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š³Ń€Š°Š“ŃƒŃŃ‹ в раГианы. -RAND = Š”Š›Š§Š˜Š” ## Возвращает ŃŠ»ŃƒŃ‡Š°Š¹Š½Š¾Šµ число в интервале от 0 Го 1. -RANDBETWEEN = Š”Š›Š£Š§ŠœŠ•Š–Š”Š£ ## Возвращает ŃŠ»ŃƒŃ‡Š°Š¹Š½Š¾Šµ число в интервале межГу Š“Š²ŃƒŠ¼Ń заГанными числами. -ROMAN = Š Š˜ŠœŠ”ŠšŠžŠ• ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ арабские цифры в римские в виГе текста. -ROUND = ŠžŠšŠ Š£Š“Š› ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го указанного количества Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Ń… Ń€Š°Š·Ń€ŃŠ“Š¾Š². -ROUNDDOWN = ŠžŠšŠ Š£Š“Š›Š’ŠŠ˜Š— ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего меньшего по Š¼Š¾Š“ŃƒŠ»ŃŽ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -ROUNDUP = ŠžŠšŠ Š£Š“Š›Š’Š’Š•Š Š„ ## ŠžŠŗŃ€ŃƒŠ³Š»ŃŠµŃ‚ число Го ближайшего большего по Š¼Š¾Š“ŃƒŠ»ŃŽ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -SERIESSUM = Š ŠÆŠ”.ДУММ ## Возвращает сумму степенного Ń€ŃŠ“Š°, Š²Ń‹Ń‡ŠøŃŠ»ŠµŠ½Š½ŃƒŃŽ по Ń„Š¾Ń€Š¼ŃƒŠ»Šµ. -SIGN = Š—ŠŠŠš ## Возвращает знак числа. -SIN = SIN ## Возвращает синус заГанного угла. -SINH = SINH ## Возвращает гиперболический синус числа. -SQRT = ŠšŠžŠ Š•ŠŠ¬ ## Возвращает ŠæŠ¾Š»Š¾Š¶ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾Šµ значение кваГратного ŠŗŠ¾Ń€Š½Ń. -SQRTPI = ŠšŠžŠ Š•ŠŠ¬ŠŸŠ˜ ## Возвращает кваГратный ŠŗŠ¾Ń€ŠµŠ½ŃŒ ŠøŠ· Š·Š½Š°Ń‡ŠµŠ½ŠøŃ Š²Ń‹Ń€Š°Š¶ŠµŠ½ŠøŃ (число * ПИ). -SUBTOTAL = ŠŸŠ ŠžŠœŠ•Š–Š£Š¢ŠžŠ§ŠŠ«Š•.Š˜Š¢ŠžŠ“Š˜ ## Возвращает ŠæŃ€Š¾Š¼ŠµŠ¶ŃƒŃ‚Š¾Ń‡Š½Ń‹Š¹ итог в списке или базе Ганных. -SUM = ДУММ ## Š”ŃƒŠ¼Š¼ŠøŃ€ŃƒŠµŃ‚ Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚Ń‹. -SUMIF = Š”Š£ŠœŠœŠ•Š”Š›Š˜ ## Š”ŃƒŠ¼Š¼ŠøŃ€ŃƒŠµŃ‚ ŃŃ‡ŠµŠ¹ŠŗŠø, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŠµ заГанному ŃƒŃŠ»Š¾Š²ŠøŃŽ. -SUMIFS = Š”Š£ŠœŠœŠ•Š”Š›Š˜ŠœŠ ## Š”ŃƒŠ¼Š¼ŠøŃ€ŃƒŠµŃ‚ Гиапазон ŃŃ‡ŠµŠµŠŗ, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŃ… нескольким ŃƒŃŠ»Š¾Š²ŠøŃŠ¼. -SUMPRODUCT = Š”Š£ŠœŠœŠŸŠ ŠžŠ˜Š—Š’ ## Возвращает сумму произвеГений ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŃ… ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² массивов. -SUMSQ = Š”Š£ŠœŠœŠšŠ’ ## Возвращает сумму кваГратов Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -SUMX2MY2 = Š”Š£ŠœŠœŠ ŠŠ—ŠŠšŠ’ ## Возвращает сумму разностей кваГратов ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŃ… значений в Š“Š²ŃƒŃ… массивах. -SUMX2PY2 = Š”Š£ŠœŠœŠ”Š£ŠœŠœŠšŠ’ ## Возвращает сумму сумм кваГратов ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŃ… ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² Š“Š²ŃƒŃ… массивов. -SUMXMY2 = Š”Š£ŠœŠœŠšŠ’Š ŠŠ—Š ## Возвращает сумму кваГратов разностей ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŃ… значений в Š“Š²ŃƒŃ… массивах. -TAN = TAN ## Возвращает тангенс числа. -TANH = TANH ## Возвращает гиперболический тангенс числа. -TRUNC = ŠžŠ¢Š‘Š  ## ŠžŃ‚Š±Ń€Š°ŃŃ‹Š²Š°ŠµŃ‚ Š“Ń€Š¾Š±Š½ŃƒŃŽ Ń‡Š°ŃŃ‚ŃŒ числа. - - -## -## Statistical functions Дтатистические Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -AVEDEV = Š”Š ŠžŠ¢ŠšŠ› ## Возвращает среГнее арифметическое Š°Š±ŃŠ¾Š»ŃŽŃ‚ных значений отклонений точек Ганных от среГнего. -AVERAGE = Š”Š Š—ŠŠŠ§ ## Возвращает среГнее арифметическое Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -AVERAGEA = Š”Š Š—ŠŠŠ§Š ## Возвращает среГнее арифметическое Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -AVERAGEIF = Š”Š Š—ŠŠŠ§Š•Š”Š›Š˜ ## Возвращает среГнее значение (среГнее арифметическое) всех ŃŃ‡ŠµŠµŠŗ в Гиапазоне, которые ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‚ Ганному ŃƒŃŠ»Š¾Š²ŠøŃŽ. -AVERAGEIFS = Š”Š Š—ŠŠŠ§Š•Š”Š›Š˜ŠœŠ ## Возвращает среГнее значение (среГнее арифметическое) всех ŃŃ‡ŠµŠµŠŗ, которые ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‚ нескольким ŃƒŃŠ»Š¾Š²ŠøŃŠ¼. -BETADIST = Š‘Š•Š¢ŠŠ ŠŠ”ŠŸ ## Возвращает ŠøŠ½Ń‚ŠµŠ³Ń€Š°Š»ŃŒŠ½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ бета-Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -BETAINV = Š‘Š•Š¢ŠŠžŠ‘Š  ## Возвращает Š¾Š±Ń€Š°Ń‚Š½ŃƒŃŽ ŠøŠ½Ń‚ŠµŠ³Ń€Š°Š»ŃŒŠ½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ указанного бета-Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -BINOMDIST = Š‘Š˜ŠŠžŠœŠ ŠŠ”ŠŸ ## Возвращает Š¾Ń‚Š“ŠµŠ»ŃŒŠ½Š¾Šµ значение биномиального Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -CHIDIST = ЄИ2РАДП ## Возвращает Š¾Š“Š½Š¾ŃŃ‚Š¾Ń€Š¾Š½Š½ŃŽŃŽ Š²ŠµŃ€Š¾ŃŃ‚Š½Š¾ŃŃ‚ŃŒ Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ Ń…Šø-кваГрат. -CHIINV = ЄИ2ŠžŠ‘Š  ## Возвращает обратное значение оГносторонней Š²ŠµŃ€Š¾ŃŃ‚ности Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ Ń…Šø-кваГрат. -CHITEST = ЄИ2ТЕДТ ## Возвращает тест на Š½ŠµŠ·Š°Š²ŠøŃŠøŠ¼Š¾ŃŃ‚ŃŒ. -CONFIDENCE = Š”ŠžŠ’Š•Š Š˜Š¢ ## Возвращает Š“Š¾Š²ŠµŃ€ŠøŃ‚ŠµŠ»ŃŒŠ½Ń‹Š¹ интервал Š“Š»Ń среГнего Š·Š½Š°Ń‡ŠµŠ½ŠøŃ по Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø. -CORREL = ŠšŠžŠ Š Š•Š› ## Возвращает ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ ŠŗŠ¾Ń€Ń€ŠµŠ»ŃŃ†ŠøŠø межГу Š“Š²ŃƒŠ¼Ń множествами Ганных. -COUNT = ДЧЁТ ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество чисел в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -COUNTA = ДЧЁТЗ ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество значений в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -COUNTBLANK = Š”Š§Š˜Š¢ŠŠ¢Š¬ŠŸŠ£Š”Š¢ŠžŠ¢Š« ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество ŠæŃƒŃŃ‚ых ŃŃ‡ŠµŠµŠŗ в Гиапазоне -COUNTIF = Š”Š§ŠŠ¢Š•Š”Š›Š˜ ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество ŃŃ‡ŠµŠµŠŗ в Гиапазоне, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŃ… заГанному ŃƒŃŠ»Š¾Š²ŠøŃŽ -COUNTIFS = Š”Š§ŠŠ¢Š•Š”Š›Š˜ŠœŠ ## ŠŸŠ¾Š“ŃŃ‡ŠøŃ‚Ń‹Š²Š°ŠµŃ‚ количество ŃŃ‡ŠµŠµŠŗ Š²Š½ŃƒŃ‚Ń€Šø Гиапазона, ŃƒŠ“Š¾Š²Š»ŠµŃ‚Š²Š¾Ń€ŃŃŽŃ‰ŠøŃ… нескольким ŃƒŃŠ»Š¾Š²ŠøŃŠ¼. -COVAR = ŠšŠžŠ’ŠŠ  ## Возвращает ŠŗŠ¾Š²Š°Ń€ŠøŠ°Ń†ŠøŃŽ, среГнее произвеГений парных отклонений -CRITBINOM = ŠšŠ Š˜Š¢Š‘Š˜ŠŠžŠœ ## Возвращает наименьшее значение, Š“Š»Ń которого ŠøŠ½Ń‚ŠµŠ³Ń€Š°Š»ŃŒŠ½Š¾Šµ биномиальное распреГеление меньше или равно заГанному ŠŗŃ€ŠøŃ‚ŠµŃ€ŠøŃŽ. -DEVSQ = ŠšŠ’ŠŠ”Š ŠžŠ¢ŠšŠ› ## Возвращает сумму кваГратов отклонений. -EXPONDIST = ЭКДПРАДП ## Возвращает ŃŠŗŃŠæŠ¾Š½ŠµŠ½Ń†ŠøŠ°Š»ŃŒŠ½Š¾Šµ распреГеление. -FDIST = FРАДП ## Возвращает F-распреГеление Š²ŠµŃ€Š¾ŃŃ‚ности. -FINV = FŠ ŠŠ”ŠŸŠžŠ‘Š  ## Возвращает обратное значение Š“Š»Ń F-Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ Š²ŠµŃ€Š¾ŃŃ‚Š½Š¾ŃŃ‚Šø. -FISHER = Š¤Š˜ŠØŠ•Š  ## Возвращает преобразование Š¤ŠøŃˆŠµŃ€Š°. -FISHERINV = Š¤Š˜ŠØŠ•Š ŠžŠ‘Š  ## Возвращает обратное преобразование Š¤ŠøŃˆŠµŃ€Š°. -FORECAST = ŠŸŠ Š•Š”Š”ŠšŠŠ— ## Возвращает значение линейного тренГа. -FREQUENCY = Š§ŠŠ”Š¢ŠžŠ¢Š ## Возвращает распреГеление частот в виГе Š²ŠµŃ€Ń‚ŠøŠŗŠ°Š»ŃŒŠ½Š¾Š³Š¾ массива. -FTEST = ФТЕДТ ## Возвращает Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚ F-теста. -GAMMADIST = Š“ŠŠœŠœŠŠ ŠŠ”ŠŸ ## Возвращает гамма-распреГеление. -GAMMAINV = Š“ŠŠœŠœŠŠžŠ‘Š  ## Возвращает обратное гамма-распреГеление. -GAMMALN = Š“ŠŠœŠœŠŠŠ›ŠžŠ“ ## Возвращает Š½Š°Ń‚ŃƒŃ€Š°Š»ŃŒŠ½Ń‹Š¹ логарифм гамма Ń„ŃƒŠ½ŠŗŃ†ŠøŠø, Ī“(x). -GEOMEAN = Š”Š Š“Š•ŠžŠœ ## Возвращает среГнее геометрическое. -GROWTH = Š ŠžŠ”Š¢ ## Возвращает Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в соответствии с ŃŠŗŃŠæŠ¾Š½ŠµŠ½Ń†ŠøŠ°Š»ŃŒŠ½Ń‹Š¼ тренГом. -HARMEAN = Š”Š Š“ŠŠ Šœ ## Возвращает среГнее гармоническое. -HYPGEOMDIST = Š“Š˜ŠŸŠ•Š Š“Š•ŠžŠœŠ•Š¢ ## Возвращает гипергеометрическое распреГеление. -INTERCEPT = ŠžŠ¢Š Š•Š—ŠžŠš ## Возвращает отрезок, отсекаемый на оси линией линейной регрессии. -KURT = Š­ŠšŠ”Š¦Š•Š”Š” ## Возвращает ŃŠŗŃŃ†ŠµŃŃ множества Ганных. -LARGE = ŠŠŠ˜Š‘ŠžŠ›Š¬ŠØŠ˜Š™ ## Возвращает k-ое наибольшее значение в множестве Ганных. -LINEST = Š›Š˜ŠŠ•Š™Š ## Возвращает параметры линейного тренГа. -LOGEST = Š›Š“Š Š¤ŠŸŠ Š˜Š‘Š› ## Возвращает параметры ŃŠŗŃŠæŠ¾Š½ŠµŠ½Ń†ŠøŠ°Š»ŃŒŠ½Š¾Š³Š¾ тренГа. -LOGINV = Š›ŠžŠ“ŠŠžŠ ŠœŠžŠ‘Š  ## Возвращает обратное логарифмическое Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½Š¾Šµ распреГеление. -LOGNORMDIST = Š›ŠžŠ“ŠŠžŠ ŠœŠ ŠŠ”ŠŸ ## Возвращает ŠøŠ½Ń‚ŠµŠ³Ń€Š°Š»ŃŒŠ½Š¾Šµ логарифмическое Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½Š¾Šµ распреГеление. -MAX = МАКД ## Возвращает наибольшее значение в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -MAXA = МАКДА ## Возвращает наибольшее значение в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -MEDIAN = ŠœŠ•Š”Š˜ŠŠŠ ## Возвращает меГиану заГанных чисел. -MIN = ŠœŠ˜Š ## Возвращает наименьшее значение в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов. -MINA = ŠœŠ˜ŠŠ ## Возвращает наименьшее значение в списке Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ов, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -MODE = ŠœŠžŠ”Š ## Возвращает значение моГы множества Ганных. -NEGBINOMDIST = ŠžŠ¢Š Š‘Š˜ŠŠžŠœŠ ŠŠ”ŠŸ ## Возвращает Š¾Ń‚Ń€ŠøŃ†Š°Ń‚ŠµŠ»ŃŒŠ½Š¾Šµ биномиальное распреГеление. -NORMDIST = ŠŠžŠ ŠœŠ ŠŠ”ŠŸ ## Возвращает Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½ŃƒŃŽ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -NORMINV = ŠŠžŠ ŠœŠžŠ‘Š  ## Возвращает обратное Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½Š¾Šµ распреГеление. -NORMSDIST = ŠŠžŠ ŠœŠ”Š¢Š ŠŠ”ŠŸ ## Возвращает станГартное Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½Š¾Šµ ŠøŠ½Ń‚ŠµŠ³Ń€Š°Š»ŃŒŠ½Š¾Šµ распреГеление. -NORMSINV = ŠŠžŠ ŠœŠ”Š¢ŠžŠ‘Š  ## Возвращает обратное значение станГартного Š½Š¾Ń€Š¼Š°Š»ŃŒŠ½Š¾Š³Š¾ Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -PEARSON = ŠŸŠ˜Š Š”ŠžŠ ## Возвращает ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ ŠŗŠ¾Ń€Ń€ŠµŠ»ŃŃ†ŠøŠø ŠŸŠøŃ€ŃŠ¾Š½Š°. -PERCENTILE = ŠŸŠ•Š Š”Š•ŠŠ¢Š˜Š›Š¬ ## Возвращает k-ую ŠæŠµŃ€ŃŠµŠ½Ń‚ŠøŠ»ŃŒ Š“Š»Ń значений Гиапазона. -PERCENTRANK = ŠŸŠ ŠžŠ¦Š•ŠŠ¢Š ŠŠŠ“ ## Возвращает ŠæŃ€Š¾Ń†ŠµŠ½Ń‚Š½ŃƒŃŽ Š½Š¾Ń€Š¼Ńƒ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в множестве Ганных. -PERMUT = ŠŸŠ•Š Š•Š”Š¢ ## Возвращает количество перестановок Š“Š»Ń заГанного числа Š¾Š±ŃŠŠµŠŗŃ‚ов. -POISSON = ŠŸŠ£ŠŠ”Š”ŠžŠ ## Возвращает распреГеление Пуассона. -PROB = Š’Š•Š ŠžŠÆŠ¢ŠŠžŠ”Š¢Š¬ ## Возвращает Š²ŠµŃ€Š¾ŃŃ‚Š½Š¾ŃŃ‚ŃŒ того, что значение ŠøŠ· Гиапазона Š½Š°Ń…Š¾Š“ŠøŃ‚ŃŃ Š²Š½ŃƒŃ‚Ń€Šø заГанных преГелов. -QUARTILE = ŠšŠ’ŠŠ Š¢Š˜Š›Š¬ ## Возвращает ŠŗŠ²Š°Ń€Ń‚ŠøŠ»ŃŒ множества Ганных. -RANK = Š ŠŠŠ“ ## Возвращает ранг числа в списке чисел. -RSQ = ŠšŠ’ŠŸŠ˜Š Š”ŠžŠ ## Возвращает кваГрат ŠŗŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚Š° ŠŗŠ¾Ń€Ń€ŠµŠ»ŃŃ†ŠøŠø ŠŸŠøŃ€ŃŠ¾Š½Š°. -SKEW = Š”ŠšŠžŠ” ## Возвращает Š°ŃŠøŠ¼Š¼ŠµŃ‚Ń€ŠøŃŽ Ń€Š°ŃŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ. -SLOPE = ŠŠŠšŠ›ŠžŠ ## Возвращает наклон линии линейной регрессии. -SMALL = ŠŠŠ˜ŠœŠ•ŠŠ¬ŠØŠ˜Š™ ## Возвращает k-ое наименьшее значение в множестве Ганных. -STANDARDIZE = ŠŠžŠ ŠœŠŠ›Š˜Š—ŠŠ¦Š˜ŠÆ ## Возвращает нормализованное значение. -STDEV = Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ›ŠžŠ ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ станГартное отклонение по выборке. -STDEVA = Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ›ŠžŠŠ ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ станГартное отклонение по выборке, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -STDEVP = Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ›ŠžŠŠŸ ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ станГартное отклонение по Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø. -STDEVPA = Š”Š¢ŠŠŠ”ŠžŠ¢ŠšŠ›ŠžŠŠŸŠ ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ станГартное отклонение по Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -STEYX = Š”Š¢ŠžŠØYX ## Возвращает ŃŃ‚Š°Š½Š“Š°Ń€Ń‚Š½ŃƒŃŽ ошибку преГсказанных значений y Š“Š»Ń кажГого Š·Š½Š°Ń‡ŠµŠ½ŠøŃ x в регрессии. -TDIST = Š”Š¢Š¬Š®Š”Š ŠŠ”ŠŸ ## Возвращает t-распреГеление Š”Ń‚ŃŒŃŽŠ“ŠµŠ½Ń‚Š°. -TINV = Š”Š¢Š¬Š®Š”Š ŠŠ”ŠŸŠžŠ‘Š  ## Возвращает обратное t-распреГеление Š”Ń‚ŃŒŃŽŠ“ŠµŠ½Ń‚Š°. -TREND = Š¢Š•ŠŠ”Š•ŠŠ¦Š˜ŠÆ ## Возвращает Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в соответствии с линейным тренГом. -TRIMMEAN = Š£Š Š•Š—Š”Š Š•Š”ŠŠ•Š• ## Возвращает среГнее Š²Š½ŃƒŃ‚ренности множества Ганных. -TTEST = ТТЕДТ ## Возвращает Š²ŠµŃ€Š¾ŃŃ‚Š½Š¾ŃŃ‚ŃŒ, ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŃƒŃŽ ŠŗŃ€ŠøŃ‚ŠµŃ€ŠøŃŽ Š”Ń‚ŃŒŃŽŠ“ŠµŠ½Ń‚Š°. -VAR = Š”Š˜Š”ŠŸ ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ по выборке. -VARA = Š”Š˜Š”ŠŸŠ ## ŠžŃ†ŠµŠ½ŠøŠ²Š°ŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ по выборке, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -VARP = Š”Š˜Š”ŠŸŠ  ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ Š“Š»Ń Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø. -VARPA = Š”Š˜Š”ŠŸŠ Š ## Š’Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ Š“ŠøŃŠæŠµŃ€ŃŠøŃŽ Š“Š»Ń Š³ŠµŠ½ŠµŃ€Š°Š»ŃŒŠ½Š¾Š¹ ŃŠ¾Š²Š¾ŠŗŃƒŠæŠ½Š¾ŃŃ‚Šø, Š²ŠŗŠ»ŃŽŃ‡Š°Ń числа, текст Šø логические Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -WEIBULL = ВЕЙБУЛЛ ## Возвращает распреГеление Š’ŠµŠ¹Š±ŃƒŠ»Š»Š°. -ZTEST = ZТЕДТ ## Возвращает Š“Š²ŃƒŃŃ‚Š¾Ń€Š¾Š½Š½ŠµŠµ P-значение z-теста. - - -## -## Text functions Текстовые Ń„ŃƒŠ½ŠŗŃ†ŠøŠø -## -ASC = ASC ## Š”Š»Ń ŃŠ·Ń‹ŠŗŠ¾Š² с Š“Š²ŃƒŃ…Š±Š°Š¹Ń‚Š¾Š²Ń‹Š¼Šø наборами знаков (например, катакана) ŠæŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŠæŠ¾Š»Š½Š¾ŃˆŠøŃ€ŠøŠ½Š½Ń‹Šµ (Š“Š²ŃƒŃ…Š±Š°Š¹Ń‚Š¾Š²Ń‹Šµ) знаки в ŠæŠ¾Š»ŃƒŃˆŠøŃ€ŠøŠ½Š½Ń‹Šµ (оГнобайтовые). -BAHTTEXT = Š‘ŠŠ¢Š¢Š•ŠšŠ”Š¢ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ число в текст, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃ Генежный формат ß (БАТ). -CHAR = Š”Š˜ŠœŠ’ŠžŠ› ## Возвращает знак с заГанным коГом. -CLEAN = ŠŸŠ•Š§Š”Š˜ŠœŠ’ ## Š£Š“Š°Š»ŃŠµŃ‚ все непечатаемые знаки ŠøŠ· текста. -CODE = ŠšŠžŠ”Š”Š˜ŠœŠ’ ## Возвращает числовой коГ первого знака в текстовой строке. -CONCATENATE = Š”Š¦Š•ŠŸŠ˜Š¢Š¬ ## ŠžŠ±ŃŠŠµŠ“ŠøŠ½ŃŠµŃ‚ несколько текстовых ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² в оГин. -DOLLAR = РУБЛЬ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ число в текст, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃ Генежный формат. -EXACT = Š”ŠžŠ’ŠŸŠŠ” ## ŠŸŃ€Š¾Š²ŠµŃ€ŃŠµŃ‚ ŠøŠ“ŠµŠ½Ń‚ŠøŃ‡Š½Š¾ŃŃ‚ŃŒ Š“Š²ŃƒŃ… текстовых значений. -FIND = ŠŠŠ™Š¢Š˜ ## Š˜Ń‰ŠµŃ‚ Š²Ń…Š¾Š¶Š“ŠµŠ½ŠøŃ оГного текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в Š“Ń€ŃƒŠ³Š¾Š¼ (с ŃƒŃ‡ŠµŃ‚Š¾Š¼ регистра). -FINDB = ŠŠŠ™Š¢Š˜Š‘ ## Š˜Ń‰ŠµŃ‚ Š²Ń…Š¾Š¶Š“ŠµŠ½ŠøŃ оГного текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в Š“Ń€ŃƒŠ³Š¾Š¼ (с ŃƒŃ‡ŠµŃ‚Š¾Š¼ регистра). -FIXED = Š¤Š˜ŠšŠ”Š˜Š ŠžŠ’ŠŠŠŠ«Š™ ## Š¤Š¾Ń€Š¼Š°Ń‚ŠøŃ€ŃƒŠµŃ‚ число Šø ŠæŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ его в текст с заГанным числом Š“ŠµŃŃŃ‚ŠøŃ‡Š½Ń‹Ń… знаков. -JIS = JIS ## Š”Š»Ń ŃŠ·Ń‹ŠŗŠ¾Š² с Š“Š²ŃƒŃ…Š±Š°Š¹Ń‚Š¾Š²Ń‹Š¼Šø наборами знаков (например, катакана) ŠæŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŠæŠ¾Š»ŃƒŃˆŠøŃ€ŠøŠ½Š½Ń‹Šµ (оГнобайтовые) знаки в текстовой строке в ŠæŠ¾Š»Š½Š¾ŃˆŠøŃ€ŠøŠ½Š½Ń‹Šµ (Š“Š²ŃƒŃ…Š±Š°Š¹Ń‚Š¾Š²Ń‹Šµ). -LEFT = Š›Š•Š’Š”Š˜ŠœŠ’ ## Возвращает крайние слева знаки текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -LEFTB = ЛЕВБ ## Возвращает крайние слева знаки текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ. -LEN = ДЛДТР ## Возвращает количество знаков в текстовой строке. -LENB = Š”Š›Š˜ŠŠ‘ ## Возвращает количество знаков в текстовой строке. -LOWER = Š”Š¢Š ŠžŠ§Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ все Š±ŃƒŠŗŠ²Ń‹ текста в строчные. -MID = ПДТР ## Возвращает заГанное число знаков ŠøŠ· строки текста, Š½Š°Ń‡ŠøŠ½Š°Ń с указанной позиции. -MIDB = ŠŸŠ”Š¢Š Š‘ ## Возвращает заГанное число знаков ŠøŠ· строки текста, Š½Š°Ń‡ŠøŠ½Š°Ń с указанной позиции. -PHONETIC = PHONETIC ## Š˜Š·Š²Š»ŠµŠŗŠ°ŠµŃ‚ фонетические (Ń„ŃƒŃ€ŠøŠ³Š°Š½Š°) знаки ŠøŠ· текстовой строки. -PROPER = ŠŸŠ ŠžŠŸŠŠŠ§ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ ŠæŠµŃ€Š²ŃƒŃŽ букву в кажГом слове текста в ŠæŃ€Š¾ŠæŠøŃŠ½ŃƒŃŽ. -REPLACE = Š—ŠŠœŠ•ŠŠ˜Š¢Š¬ ## Š—Š°Š¼ŠµŠ½ŃŠµŃ‚ знаки в тексте. -REPLACEB = Š—ŠŠœŠ•ŠŠ˜Š¢Š¬Š‘ ## Š—Š°Š¼ŠµŠ½ŃŠµŃ‚ знаки в тексте. -REPT = ŠŸŠžŠ’Š¢ŠžŠ  ## ŠŸŠ¾Š²Ń‚Š¾Ń€ŃŠµŃ‚ текст заГанное число раз. -RIGHT = ŠŸŠ ŠŠ’Š”Š˜ŠœŠ’ ## Возвращает крайние справа знаки текстовой строки. -RIGHTB = ŠŸŠ ŠŠ’Š‘ ## Возвращает крайние справа знаки текстовой строки. -SEARCH = ŠŸŠžŠ˜Š”Šš ## Š˜Ń‰ŠµŃ‚ Š²Ń…Š¾Š¶Š“ŠµŠ½ŠøŃ оГного текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в Š“Ń€ŃƒŠ³Š¾Š¼ (без ŃƒŃ‡ŠµŃ‚Š° регистра). -SEARCHB = ŠŸŠžŠ˜Š”ŠšŠ‘ ## Š˜Ń‰ŠµŃ‚ Š²Ń…Š¾Š¶Š“ŠµŠ½ŠøŃ оГного текстового Š·Š½Š°Ń‡ŠµŠ½ŠøŃ в Š“Ń€ŃƒŠ³Š¾Š¼ (без ŃƒŃ‡ŠµŃ‚Š° регистра). -SUBSTITUTE = ŠŸŠžŠ”Š”Š¢ŠŠ’Š˜Š¢Š¬ ## Š—Š°Š¼ŠµŠ½ŃŠµŃ‚ в текстовой строке старый текст новым. -T = Š¢ ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚Ń‹ в текст. -TEXT = Š¢Š•ŠšŠ”Š¢ ## Š¤Š¾Ń€Š¼Š°Ń‚ŠøŃ€ŃƒŠµŃ‚ число Šø ŠæŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ его в текст. -TRIM = Š”Š–ŠŸŠ ŠžŠ‘Š•Š›Š« ## Š£Š“Š°Š»ŃŠµŃ‚ ŠøŠ· текста пробелы. -UPPER = ŠŸŠ ŠžŠŸŠ˜Š”Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ все Š±ŃƒŠŗŠ²Ń‹ текста в прописные. -VALUE = Š—ŠŠŠ§Š•Š ## ŠŸŃ€ŠµŠ¾Š±Ń€Š°Š·ŃƒŠµŃ‚ текстовый Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ в число. diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/config deleted file mode 100644 index bf72cc4..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = kr - - -## -## Excel Error Codes (For future use) - -## -NULL = #SkƤrning! -DIV0 = #Division/0! -VALUE = #VƤrdefel! -REF = #Referens! -NAME = #Namn? -NUM = #Ogiltigt! -NA = #Saknas! diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/functions deleted file mode 100644 index 73b2deb..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/sv/functions +++ /dev/null @@ -1,408 +0,0 @@ -## -## Add-in and Automation functions TillƤggs- och automatiseringsfunktioner -## -GETPIVOTDATA = HƄMTA.PIVOTDATA ## Returnerar data som lagrats i en pivottabellrapport - - -## -## Cube functions Kubfunktioner -## -CUBEKPIMEMBER = KUBKPIMEDLEM ## Returnerar namn, egenskap och mĆ„tt fƶr en KPI och visar namnet och egenskapen i cellen. En KPI, eller prestandaindikator, Ƥr ett kvantifierbart mĆ„tt, t.ex. mĆ„natlig bruttovinst eller personalomsƤttning per kvartal, som anvƤnds fƶr att analysera ett fƶretags resultat. -CUBEMEMBER = KUBMEDLEM ## Returnerar en medlem eller ett par i en kubhierarki. AnvƤnds fƶr att verifiera att medlemmen eller paret finns i kuben. -CUBEMEMBERPROPERTY = KUBMEDLEMSEGENSKAP ## Returnerar vƤrdet fƶr en medlemsegenskap i kuben. AnvƤnds fƶr att verifiera att ett medlemsnamn finns i kuben, samt fƶr att returnera den angivna egenskapen fƶr medlemmen. -CUBERANKEDMEMBER = KUBRANGORDNADMEDLEM ## Returnerar den n:te, eller rangordnade, medlemmen i en uppsƤttning. AnvƤnds fƶr att returnera ett eller flera element i en uppsƤttning, till exempelvis den bƤsta fƶrsƤljaren eller de tio bƤsta eleverna. -CUBESET = KUBINSTƄLLNING ## Definierar en berƤknad uppsƤttning medlemmar eller par genom att skicka ett bestƤmt uttryck till kuben pĆ„ servern, som skapar uppsƤttningen och sedan returnerar den till Microsoft Office Excel. -CUBESETCOUNT = KUBINSTƄLLNINGANTAL ## Returnerar antalet objekt i en uppsƤttning. -CUBEVALUE = KUBVƄRDE ## Returnerar ett mƤngdvƤrde frĆ„n en kub. - - -## -## Database functions Databasfunktioner -## -DAVERAGE = DMEDEL ## Returnerar medelvƤrdet av databasposterna -DCOUNT = DANTAL ## RƤknar antalet celler som innehĆ„ller tal i en databas -DCOUNTA = DANTALV ## RƤknar ifyllda celler i en databas -DGET = DHƄMTA ## HƤmtar en enstaka post frĆ„n en databas som uppfyller de angivna villkoren -DMAX = DMAX ## Returnerar det stƶrsta vƤrdet frĆ„n databasposterna -DMIN = DMIN ## Returnerar det minsta vƤrdet frĆ„n databasposterna -DPRODUCT = DPRODUKT ## Multiplicerar vƤrdena i ett visst fƤlt i poster som uppfyller villkoret -DSTDEV = DSTDAV ## Uppskattar standardavvikelsen baserat pĆ„ ett urval av databasposterna -DSTDEVP = DSTDAVP ## BerƤknar standardavvikelsen utifrĆ„n hela populationen av valda databasposter -DSUM = DSUMMA ## Summerar talen i kolumnfƤlt i databasposter som uppfyller villkoret -DVAR = DVARIANS ## Uppskattar variansen baserat pĆ„ ett urval av databasposterna -DVARP = DVARIANSP ## BerƤknar variansen utifrĆ„n hela populationen av valda databasposter - - -## -## Date and time functions Tid- och datumfunktioner -## -DATE = DATUM ## Returnerar ett serienummer fƶr ett visst datum -DATEVALUE = DATUMVƄRDE ## Konverterar ett datum i textformat till ett serienummer -DAY = DAG ## Konverterar ett serienummer till dag i mĆ„naden -DAYS360 = DAGAR360 ## BerƤknar antalet dagar mellan tvĆ„ datum baserat pĆ„ ett 360-dagarsĆ„r -EDATE = EDATUM ## Returnerar serienumret fƶr ett datum som infaller ett visst antal mĆ„nader fƶre eller efter startdatumet -EOMONTH = SLUTMƅNAD ## Returnerar serienumret fƶr sista dagen i mĆ„naden ett visst antal mĆ„nader tidigare eller senare -HOUR = TIMME ## Konverterar ett serienummer till en timme -MINUTE = MINUT ## Konverterar ett serienummer till en minut -MONTH = MƅNAD ## Konverterar ett serienummer till en mĆ„nad -NETWORKDAYS = NETTOARBETSDAGAR ## Returnerar antalet hela arbetsdagar mellan tvĆ„ datum -NOW = NU ## Returnerar serienumret fƶr dagens datum och aktuell tid -SECOND = SEKUND ## Konverterar ett serienummer till en sekund -TIME = KLOCKSLAG ## Returnerar serienumret fƶr en viss tid -TIMEVALUE = TIDVƄRDE ## Konverterar en tid i textformat till ett serienummer -TODAY = IDAG ## Returnerar serienumret fƶr dagens datum -WEEKDAY = VECKODAG ## Konverterar ett serienummer till en dag i veckan -WEEKNUM = VECKONR ## Konverterar ett serienummer till ett veckonummer -WORKDAY = ARBETSDAGAR ## Returnerar serienumret fƶr ett datum ett visst antal arbetsdagar tidigare eller senare -YEAR = ƅR ## Konverterar ett serienummer till ett Ć„r -YEARFRAC = ƅRDEL ## Returnerar en del av ett Ć„r som representerar antalet hela dagar mellan start- och slutdatum - - -## -## Engineering functions Tekniska funktioner -## -BESSELI = BESSELI ## Returnerar den modifierade Bessel-funktionen In(x) -BESSELJ = BESSELJ ## Returnerar Bessel-funktionen Jn(x) -BESSELK = BESSELK ## Returnerar den modifierade Bessel-funktionen Kn(x) -BESSELY = BESSELY ## Returnerar Bessel-funktionen Yn(x) -BIN2DEC = BIN.TILL.DEC ## Omvandlar ett binƤrt tal till decimalt -BIN2HEX = BIN.TILL.HEX ## Omvandlar ett binƤrt tal till hexadecimalt -BIN2OCT = BIN.TILL.OKT ## Omvandlar ett binƤrt tal till oktalt -COMPLEX = KOMPLEX ## Omvandlar reella och imaginƤra koefficienter till ett komplext tal -CONVERT = KONVERTERA ## Omvandlar ett tal frĆ„n ett mĆ„ttsystem till ett annat -DEC2BIN = DEC.TILL.BIN ## Omvandlar ett decimalt tal till binƤrt -DEC2HEX = DEC.TILL.HEX ## Omvandlar ett decimalt tal till hexadecimalt -DEC2OCT = DEC.TILL.OKT ## Omvandlar ett decimalt tal till oktalt -DELTA = DELTA ## Testar om tvĆ„ vƤrden Ƥr lika -ERF = FELF ## Returnerar felfunktionen -ERFC = FELFK ## Returnerar den komplementƤra felfunktionen -GESTEP = SLSTEG ## Testar om ett tal Ƥr stƶrre Ƥn ett trƶskelvƤrde -HEX2BIN = HEX.TILL.BIN ## Omvandlar ett hexadecimalt tal till binƤrt -HEX2DEC = HEX.TILL.DEC ## Omvandlar ett hexadecimalt tal till decimalt -HEX2OCT = HEX.TILL.OKT ## Omvandlar ett hexadecimalt tal till oktalt -IMABS = IMABS ## Returnerar absolutvƤrdet (modulus) fƶr ett komplext tal -IMAGINARY = IMAGINƄR ## Returnerar den imaginƤra koefficienten fƶr ett komplext tal -IMARGUMENT = IMARGUMENT ## Returnerar det komplexa talets argument, en vinkel uttryckt i radianer -IMCONJUGATE = IMKONJUGAT ## Returnerar det komplexa talets konjugat -IMCOS = IMCOS ## Returnerar cosinus fƶr ett komplext tal -IMDIV = IMDIV ## Returnerar kvoten fƶr tvĆ„ komplexa tal -IMEXP = IMEUPPHƖJT ## Returnerar exponenten fƶr ett komplext tal -IMLN = IMLN ## Returnerar den naturliga logaritmen fƶr ett komplext tal -IMLOG10 = IMLOG10 ## Returnerar 10-logaritmen fƶr ett komplext tal -IMLOG2 = IMLOG2 ## Returnerar 2-logaritmen fƶr ett komplext tal -IMPOWER = IMUPPHƖJT ## Returnerar ett komplext tal upphƶjt till en exponent -IMPRODUCT = IMPRODUKT ## Returnerar produkten av komplexa tal -IMREAL = IMREAL ## Returnerar den reella koefficienten fƶr ett komplext tal -IMSIN = IMSIN ## Returnerar sinus fƶr ett komplext tal -IMSQRT = IMROT ## Returnerar kvadratroten av ett komplext tal -IMSUB = IMDIFF ## Returnerar differensen mellan tvĆ„ komplexa tal -IMSUM = IMSUM ## Returnerar summan av komplexa tal -OCT2BIN = OKT.TILL.BIN ## Omvandlar ett oktalt tal till binƤrt -OCT2DEC = OKT.TILL.DEC ## Omvandlar ett oktalt tal till decimalt -OCT2HEX = OKT.TILL.HEX ## Omvandlar ett oktalt tal till hexadecimalt - - -## -## Financial functions Finansiella funktioner -## -ACCRINT = UPPLRƄNTA ## Returnerar den upplupna rƤntan fƶr vƤrdepapper med periodisk rƤnta -ACCRINTM = UPPLOBLRƄNTA ## Returnerar den upplupna rƤntan fƶr ett vƤrdepapper som ger avkastning pĆ„ fƶrfallodagen -AMORDEGRC = AMORDEGRC ## Returnerar avskrivningen fƶr varje redovisningsperiod med hjƤlp av en avskrivningskoefficient -AMORLINC = AMORLINC ## Returnerar avskrivningen fƶr varje redovisningsperiod -COUPDAYBS = KUPDAGBB ## Returnerar antal dagar frĆ„n bƶrjan av kupongperioden till likviddagen -COUPDAYS = KUPDAGARS ## Returnerar antalet dagar i kupongperioden som innehĆ„ller betalningsdatumet -COUPDAYSNC = KUPDAGNK ## Returnerar antalet dagar frĆ„n betalningsdatumet till nƤsta kupongdatum -COUPNCD = KUPNKD ## Returnerar nƤsta kupongdatum efter likviddagen -COUPNUM = KUPANT ## Returnerar kuponger som fƶrfaller till betalning mellan likviddagen och fƶrfallodagen -COUPPCD = KUPFKD ## Returnerar fƶregĆ„ende kupongdatum fƶre likviddagen -CUMIPMT = KUMRƄNTA ## Returnerar den ackumulerade rƤntan som betalats mellan tvĆ„ perioder -CUMPRINC = KUMPRIS ## Returnerar det ackumulerade kapitalbeloppet som betalats pĆ„ ett lĆ„n mellan tvĆ„ perioder -DB = DB ## Returnerar avskrivningen fƶr en tillgĆ„ng under en angiven tid enligt metoden fƶr fast degressiv avskrivning -DDB = DEGAVSKR ## Returnerar en tillgĆ„ngs vƤrdeminskning under en viss period med hjƤlp av dubbel degressiv avskrivning eller nĆ„gon annan metod som du anger -DISC = DISK ## Returnerar diskonteringsrƤntan fƶr ett vƤrdepapper -DOLLARDE = DECTAL ## Omvandlar ett pris uttryckt som ett brĆ„k till ett decimaltal -DOLLARFR = BRƅK ## Omvandlar ett pris i kronor uttryckt som ett decimaltal till ett brĆ„k -DURATION = LƖPTID ## Returnerar den Ć„rliga lƶptiden fƶr en sƤkerhet med periodiska rƤntebetalningar -EFFECT = EFFRƄNTA ## Returnerar den Ć„rliga effektiva rƤntesatsen -FV = SLUTVƄRDE ## Returnerar det framtida vƤrdet pĆ„ en investering -FVSCHEDULE = FƖRRƄNTNING ## Returnerar det framtida vƤrdet av ett begynnelsekapital berƤknat pĆ„ olika rƤntenivĆ„er -INTRATE = ƅRSRƄNTA ## Returnerar rƤntesatsen fƶr ett betalt vƤrdepapper -IPMT = RBETALNING ## Returnerar rƤntedelen av en betalning fƶr en given period -IRR = IR ## Returnerar internrƤntan fƶr en serie betalningar -ISPMT = RALƅN ## BerƤknar rƤntan som har betalats under en specifik betalningsperiod -MDURATION = MLƖPTID ## Returnerar den modifierade Macauley-lƶptiden fƶr ett vƤrdepapper med det antagna nominella vƤrdet 100 kr -MIRR = MODIR ## Returnerar internrƤntan dƤr positiva och negativa betalningar finansieras med olika rƤntor -NOMINAL = NOMRƄNTA ## Returnerar den Ć„rliga nominella rƤntesatsen -NPER = PERIODER ## Returnerar antalet perioder fƶr en investering -NPV = NETNUVƄRDE ## Returnerar nuvƤrdet av en serie periodiska betalningar vid en given diskonteringsrƤnta -ODDFPRICE = UDDAFPRIS ## Returnerar priset per 100 kr nominellt vƤrde fƶr ett vƤrdepapper med en udda fƶrsta period -ODDFYIELD = UDDAFAVKASTNING ## Returnerar avkastningen fƶr en sƤkerhet med en udda fƶrsta period -ODDLPRICE = UDDASPRIS ## Returnerar priset per 100 kr nominellt vƤrde fƶr ett vƤrdepapper med en udda sista period -ODDLYIELD = UDDASAVKASTNING ## Returnerar avkastningen fƶr en sƤkerhet med en udda sista period -PMT = BETALNING ## Returnerar den periodiska betalningen fƶr en annuitet -PPMT = AMORT ## Returnerar amorteringsdelen av en annuitetsbetalning fƶr en given period -PRICE = PRIS ## Returnerar priset per 100 kr nominellt vƤrde fƶr ett vƤrdepapper som ger periodisk rƤnta -PRICEDISC = PRISDISK ## Returnerar priset per 100 kr nominellt vƤrde fƶr ett diskonterat vƤrdepapper -PRICEMAT = PRISFƖRF ## Returnerar priset per 100 kr nominellt vƤrde fƶr ett vƤrdepapper som ger rƤnta pĆ„ fƶrfallodagen -PV = PV ## Returnerar nuvƤrdet av en serie lika stora periodiska betalningar -RATE = RƄNTA ## Returnerar rƤntesatsen per period i en annuitet -RECEIVED = BELOPP ## Returnerar beloppet som utdelas pĆ„ fƶrfallodagen fƶr ett betalat vƤrdepapper -SLN = LINAVSKR ## Returnerar den linjƤra avskrivningen fƶr en tillgĆ„ng under en period -SYD = ƅRSAVSKR ## Returnerar den Ć„rliga avskrivningssumman fƶr en tillgĆ„ng under en angiven period -TBILLEQ = SSVXEKV ## Returnerar avkastningen motsvarande en obligation fƶr en statsskuldvƤxel -TBILLPRICE = SSVXPRIS ## Returnerar priset per 100 kr nominellt vƤrde fƶr en statsskuldvƤxel -TBILLYIELD = SSVXRƄNTA ## Returnerar avkastningen fƶr en statsskuldvƤxel -VDB = VDEGRAVSKR ## Returnerar avskrivningen fƶr en tillgĆ„ng under en angiven period (med degressiv avskrivning) -XIRR = XIRR ## Returnerar internrƤntan fƶr en serie betalningar som inte nƶdvƤndigtvis Ƥr periodiska -XNPV = XNUVƄRDE ## Returnerar det nuvarande nettovƤrdet fƶr en serie betalningar som inte nƶdvƤndigtvis Ƥr periodiska -YIELD = NOMAVK ## Returnerar avkastningen fƶr ett vƤrdepapper som ger periodisk rƤnta -YIELDDISC = NOMAVKDISK ## Returnerar den Ć„rliga avkastningen fƶr diskonterade vƤrdepapper, exempelvis en statsskuldvƤxel -YIELDMAT = NOMAVKFƖRF ## Returnerar den Ć„rliga avkastningen fƶr ett vƤrdepapper som ger rƤnta pĆ„ fƶrfallodagen - - -## -## Information functions Informationsfunktioner -## -CELL = CELL ## Returnerar information om formatering, plats och innehĆ„ll i en cell -ERROR.TYPE = FEL.TYP ## Returnerar ett tal som motsvarar ett felvƤrde -INFO = INFO ## Returnerar information om operativsystemet -ISBLANK = ƄRREF ## Returnerar SANT om vƤrdet Ƥr tomt -ISERR = Ƅ ## Returnerar SANT om vƤrdet Ƥr ett felvƤrde annat Ƥn #SAKNAS! -ISERROR = ƄRFEL ## Returnerar SANT om vƤrdet Ƥr ett felvƤrde -ISEVEN = ƄRJƄMN ## Returnerar SANT om talet Ƥr jƤmnt -ISLOGICAL = ƄREJTEXT ## Returnerar SANT om vƤrdet Ƥr ett logiskt vƤrde -ISNA = ƄRLOGISK ## Returnerar SANT om vƤrdet Ƥr felvƤrdet #SAKNAS! -ISNONTEXT = ƄRSAKNAD ## Returnerar SANT om vƤrdet inte Ƥr text -ISNUMBER = ƄRTAL ## Returnerar SANT om vƤrdet Ƥr ett tal -ISODD = ƄRUDDA ## Returnerar SANT om talet Ƥr udda -ISREF = ƄRTOM ## Returnerar SANT om vƤrdet Ƥr en referens -ISTEXT = ƄRTEXT ## Returnerar SANT om vƤrdet Ƥr text -N = N ## Returnerar ett vƤrde omvandlat till ett tal -NA = SAKNAS ## Returnerar felvƤrdet #SAKNAS! -TYPE = VƄRDETYP ## Returnerar ett tal som anger vƤrdets datatyp - - -## -## Logical functions Logiska funktioner -## -AND = OCH ## Returnerar SANT om alla argument Ƥr sanna -FALSE = FALSKT ## Returnerar det logiska vƤrdet FALSKT -IF = OM ## Anger vilket logiskt test som ska utfƶras -IFERROR = OMFEL ## Returnerar ett vƤrde som du anger om en formel utvƤrderar till ett fel; annars returneras resultatet av formeln -NOT = ICKE ## Inverterar logiken fƶr argumenten -OR = ELLER ## Returnerar SANT om nĆ„got argument Ƥr SANT -TRUE = SANT ## Returnerar det logiska vƤrdet SANT - - -## -## Lookup and reference functions Sƶk- och referensfunktioner -## -ADDRESS = ADRESS ## Returnerar en referens som text till en enstaka cell i ett kalkylblad -AREAS = OMRƅDEN ## Returnerar antalet omrĆ„den i en referens -CHOOSE = VƄLJ ## VƤljer ett vƤrde i en lista ƶver vƤrden -COLUMN = KOLUMN ## Returnerar kolumnnumret fƶr en referens -COLUMNS = KOLUMNER ## Returnerar antalet kolumner i en referens -HLOOKUP = LETAKOLUMN ## Sƶker i den ƶversta raden i en matris och returnerar vƤrdet fƶr angiven cell -HYPERLINK = HYPERLƄNK ## Skapar en genvƤg eller ett hopp till ett dokument i nƤtverket, i ett intranƤt eller pĆ„ Internet -INDEX = INDEX ## AnvƤnder ett index fƶr ett vƤlja ett vƤrde i en referens eller matris -INDIRECT = INDIREKT ## Returnerar en referens som anges av ett textvƤrde -LOOKUP = LETAUPP ## Letar upp vƤrden i en vektor eller matris -MATCH = PASSA ## Letar upp vƤrden i en referens eller matris -OFFSET = FƖRSKJUTNING ## Returnerar en referens fƶrskjuten i fƶrhĆ„llande till en given referens -ROW = RAD ## Returnerar radnumret fƶr en referens -ROWS = RADER ## Returnerar antalet rader i en referens -RTD = RTD ## HƤmtar realtidsdata frĆ„n ett program som stƶder COM-automation (Automation: Ett sƤtt att arbeta med ett programs objekt frĆ„n ett annat program eller utvecklingsverktyg. Detta kallades tidigare fƶr OLE Automation, och Ƥr en branschstandard och ingĆ„r i Component Object Model (COM).) -TRANSPOSE = TRANSPONERA ## Transponerar en matris -VLOOKUP = LETARAD ## Letar i den fƶrsta kolumnen i en matris och flyttar ƶver raden fƶr att returnera vƤrdet fƶr en cell - - -## -## Math and trigonometry functions Matematiska och trigonometriska funktioner -## -ABS = ABS ## Returnerar absolutvƤrdet av ett tal -ACOS = ARCCOS ## Returnerar arcus cosinus fƶr ett tal -ACOSH = ARCCOSH ## Returnerar inverterad hyperbolisk cosinus fƶr ett tal -ASIN = ARCSIN ## Returnerar arcus cosinus fƶr ett tal -ASINH = ARCSINH ## Returnerar hyperbolisk arcus sinus fƶr ett tal -ATAN = ARCTAN ## Returnerar arcus tangens fƶr ett tal -ATAN2 = ARCTAN2 ## Returnerar arcus tangens fƶr en x- och en y- koordinat -ATANH = ARCTANH ## Returnerar hyperbolisk arcus tangens fƶr ett tal -CEILING = RUNDA.UPP ## Avrundar ett tal till nƤrmaste heltal eller nƤrmaste signifikanta multipel -COMBIN = KOMBIN ## Returnerar antalet kombinationer fƶr ett givet antal objekt -COS = COS ## Returnerar cosinus fƶr ett tal -COSH = COSH ## Returnerar hyperboliskt cosinus fƶr ett tal -DEGREES = GRADER ## Omvandlar radianer till grader -EVEN = JƄMN ## Avrundar ett tal uppĆ„t till nƤrmaste heltal -EXP = EXP ## Returnerar e upphƶjt till ett givet tal -FACT = FAKULTET ## Returnerar fakulteten fƶr ett tal -FACTDOUBLE = DUBBELFAKULTET ## Returnerar dubbelfakulteten fƶr ett tal -FLOOR = RUNDA.NED ## Avrundar ett tal nedĆ„t mot noll -GCD = SGD ## Returnerar den stƶrsta gemensamma nƤmnaren -INT = HELTAL ## Avrundar ett tal nedĆ„t till nƤrmaste heltal -LCM = MGM ## Returnerar den minsta gemensamma multipeln -LN = LN ## Returnerar den naturliga logaritmen fƶr ett tal -LOG = LOG ## Returnerar logaritmen fƶr ett tal fƶr en given bas -LOG10 = LOG10 ## Returnerar 10-logaritmen fƶr ett tal -MDETERM = MDETERM ## Returnerar matrisen som Ƥr avgƶrandet av en matris -MINVERSE = MINVERT ## Returnerar matrisinversen av en matris -MMULT = MMULT ## Returnerar matrisprodukten av tvĆ„ matriser -MOD = REST ## Returnerar resten vid en division -MROUND = MAVRUNDA ## Returnerar ett tal avrundat till en given multipel -MULTINOMIAL = MULTINOMIAL ## Returnerar multinomialen fƶr en uppsƤttning tal -ODD = UDDA ## Avrundar ett tal uppĆ„t till nƤrmaste udda heltal -PI = PI ## Returnerar vƤrdet pi -POWER = UPPHƖJT.TILL ## Returnerar resultatet av ett tal upphƶjt till en exponent -PRODUCT = PRODUKT ## Multiplicerar argumenten -QUOTIENT = KVOT ## Returnerar heltalsdelen av en division -RADIANS = RADIANER ## Omvandlar grader till radianer -RAND = SLUMP ## Returnerar ett slumptal mellan 0 och 1 -RANDBETWEEN = SLUMP.MELLAN ## Returnerar ett slumptal mellan de tal som du anger -ROMAN = ROMERSK ## Omvandlar vanliga (arabiska) siffror till romerska som text -ROUND = AVRUNDA ## Avrundar ett tal till ett angivet antal siffror -ROUNDDOWN = AVRUNDA.NEDƅT ## Avrundar ett tal nedĆ„t mot noll -ROUNDUP = AVRUNDA.UPPƅT ## Avrundar ett tal uppĆ„t, frĆ„n noll -SERIESSUM = SERIESUMMA ## Returnerar summan av en potensserie baserat pĆ„ formeln -SIGN = TECKEN ## Returnerar tecknet fƶr ett tal -SIN = SIN ## Returnerar sinus fƶr en given vinkel -SINH = SINH ## Returnerar hyperbolisk sinus fƶr ett tal -SQRT = ROT ## Returnerar den positiva kvadratroten -SQRTPI = ROTPI ## Returnerar kvadratroten fƶr (tal * pi) -SUBTOTAL = DELSUMMA ## Returnerar en delsumma i en lista eller databas -SUM = SUMMA ## Summerar argumenten -SUMIF = SUMMA.OM ## Summerar celler enligt ett angivet villkor -SUMIFS = SUMMA.OMF ## LƤgger till cellerna i ett omrĆ„de som uppfyller flera kriterier -SUMPRODUCT = PRODUKTSUMMA ## Returnerar summan av produkterna i motsvarande matriskomponenter -SUMSQ = KVADRATSUMMA ## Returnerar summan av argumentens kvadrater -SUMX2MY2 = SUMMAX2MY2 ## Returnerar summan av differensen mellan kvadraterna fƶr motsvarande vƤrden i tvĆ„ matriser -SUMX2PY2 = SUMMAX2PY2 ## Returnerar summan av summan av kvadraterna av motsvarande vƤrden i tvĆ„ matriser -SUMXMY2 = SUMMAXMY2 ## Returnerar summan av kvadraten av skillnaden mellan motsvarande vƤrden i tvĆ„ matriser -TAN = TAN ## Returnerar tangens fƶr ett tal -TANH = TANH ## Returnerar hyperbolisk tangens fƶr ett tal -TRUNC = AVKORTA ## Avkortar ett tal till ett heltal - - -## -## Statistical functions Statistiska funktioner -## -AVEDEV = MEDELAVV ## Returnerar medelvƤrdet fƶr datapunkters absoluta avvikelse frĆ„n deras medelvƤrde -AVERAGE = MEDEL ## Returnerar medelvƤrdet av argumenten -AVERAGEA = AVERAGEA ## Returnerar medelvƤrdet av argumenten, inklusive tal, text och logiska vƤrden -AVERAGEIF = MEDELOM ## Returnerar medelvƤrdet (aritmetiskt medelvƤrde) fƶr alla celler i ett omrĆ„de som uppfyller ett givet kriterium -AVERAGEIFS = MEDELOMF ## Returnerar medelvƤrdet (det aritmetiska medelvƤrdet) fƶr alla celler som uppfyller flera villkor. -BETADIST = BETAFƖRD ## Returnerar den kumulativa betafƶrdelningsfunktionen -BETAINV = BETAINV ## Returnerar inversen till den kumulativa fƶrdelningsfunktionen fƶr en viss betafƶrdelning -BINOMDIST = BINOMFƖRD ## Returnerar den individuella binomialfƶrdelningen -CHIDIST = CHI2FƖRD ## Returnerar den ensidiga sannolikheten av c2-fƶrdelningen -CHIINV = CHI2INV ## Returnerar inversen av chi2-fƶrdelningen -CHITEST = CHI2TEST ## Returnerar oberoendetesten -CONFIDENCE = KONFIDENS ## Returnerar konfidensintervallet fƶr en populations medelvƤrde -CORREL = KORREL ## Returnerar korrelationskoefficienten mellan tvĆ„ datamƤngder -COUNT = ANTAL ## RƤknar hur mĆ„nga tal som finns bland argumenten -COUNTA = ANTALV ## RƤknar hur mĆ„nga vƤrden som finns bland argumenten -COUNTBLANK = ANTAL.TOMMA ## RƤknar antalet tomma celler i ett omrĆ„de -COUNTIF = ANTAL.OM ## RƤknar antalet celler i ett omrĆ„de som uppfyller angivna villkor. -COUNTIFS = ANTAL.OMF ## RƤknar antalet celler i ett omrĆ„de som uppfyller flera villkor. -COVAR = KOVAR ## Returnerar kovariansen, d.v.s. medelvƤrdet av produkterna fƶr parade avvikelser -CRITBINOM = KRITBINOM ## Returnerar det minsta vƤrdet fƶr vilket den kumulativa binomialfƶrdelningen Ƥr mindre Ƥn eller lika med ett villkorsvƤrde -DEVSQ = KVADAVV ## Returnerar summan av kvadrater pĆ„ avvikelser -EXPONDIST = EXPONFƖRD ## Returnerar exponentialfƶrdelningen -FDIST = FFƖRD ## Returnerar F-sannolikhetsfƶrdelningen -FINV = FINV ## Returnerar inversen till F-sannolikhetsfƶrdelningen -FISHER = FISHER ## Returnerar Fisher-transformationen -FISHERINV = FISHERINV ## Returnerar inversen till Fisher-transformationen -FORECAST = PREDIKTION ## Returnerar ett vƤrde lƤngs en linjƤr trendlinje -FREQUENCY = FREKVENS ## Returnerar en frekvensfƶrdelning som en lodrƤt matris -FTEST = FTEST ## Returnerar resultatet av en F-test -GAMMADIST = GAMMAFƖRD ## Returnerar gammafƶrdelningen -GAMMAINV = GAMMAINV ## Returnerar inversen till den kumulativa gammafƶrdelningen -GAMMALN = GAMMALN ## Returnerar den naturliga logaritmen fƶr gammafunktionen, G(x) -GEOMEAN = GEOMEDEL ## Returnerar det geometriska medelvƤrdet -GROWTH = EXPTREND ## Returnerar vƤrden lƤngs en exponentiell trend -HARMEAN = HARMMEDEL ## Returnerar det harmoniska medelvƤrdet -HYPGEOMDIST = HYPGEOMFƖRD ## Returnerar den hypergeometriska fƶrdelningen -INTERCEPT = SKƄRNINGSPUNKT ## Returnerar skƤrningspunkten fƶr en linjƤr regressionslinje -KURT = TOPPIGHET ## Returnerar toppigheten av en mƤngd data -LARGE = STƖRSTA ## Returnerar det n:te stƶrsta vƤrdet i en mƤngd data -LINEST = REGR ## Returnerar parametrar till en linjƤr trendlinje -LOGEST = EXPREGR ## Returnerar parametrarna i en exponentiell trend -LOGINV = LOGINV ## Returnerar inversen till den lognormala fƶrdelningen -LOGNORMDIST = LOGNORMFƖRD ## Returnerar den kumulativa lognormala fƶrdelningen -MAX = MAX ## Returnerar det stƶrsta vƤrdet i en lista av argument -MAXA = MAXA ## Returnerar det stƶrsta vƤrdet i en lista av argument, inklusive tal, text och logiska vƤrden -MEDIAN = MEDIAN ## Returnerar medianen fƶr angivna tal -MIN = MIN ## Returnerar det minsta vƤrdet i en lista med argument -MINA = MINA ## Returnerar det minsta vƤrdet i en lista ƶver argument, inklusive tal, text och logiska vƤrden -MODE = TYPVƄRDE ## Returnerar det vanligaste vƤrdet i en datamƤngd -NEGBINOMDIST = NEGBINOMFƖRD ## Returnerar den negativa binomialfƶrdelningen -NORMDIST = NORMFƖRD ## Returnerar den kumulativa normalfƶrdelningen -NORMINV = NORMINV ## Returnerar inversen till den kumulativa normalfƶrdelningen -NORMSDIST = NORMSFƖRD ## Returnerar den kumulativa standardnormalfƶrdelningen -NORMSINV = NORMSINV ## Returnerar inversen till den kumulativa standardnormalfƶrdelningen -PEARSON = PEARSON ## Returnerar korrelationskoefficienten till Pearsons momentprodukt -PERCENTILE = PERCENTIL ## Returnerar den n:te percentilen av vƤrden i ett omrĆ„de -PERCENTRANK = PROCENTRANG ## Returnerar procentrangen fƶr ett vƤrde i en datamƤngd -PERMUT = PERMUT ## Returnerar antal permutationer fƶr ett givet antal objekt -POISSON = POISSON ## Returnerar Poisson-fƶrdelningen -PROB = SANNOLIKHET ## Returnerar sannolikheten att vƤrden i ett omrĆ„de ligger mellan tvĆ„ grƤnser -QUARTILE = KVARTIL ## Returnerar kvartilen av en mƤngd data -RANK = RANG ## Returnerar rangordningen fƶr ett tal i en lista med tal -RSQ = RKV ## Returnerar kvadraten av Pearsons produktmomentkorrelationskoefficient -SKEW = SNEDHET ## Returnerar snedheten fƶr en fƶrdelning -SLOPE = LUTNING ## Returnerar lutningen pĆ„ en linjƤr regressionslinje -SMALL = MINSTA ## Returnerar det n:te minsta vƤrdet i en mƤngd data -STANDARDIZE = STANDARDISERA ## Returnerar ett normaliserat vƤrde -STDEV = STDAV ## Uppskattar standardavvikelsen baserat pĆ„ ett urval -STDEVA = STDEVA ## Uppskattar standardavvikelsen baserat pĆ„ ett urval, inklusive tal, text och logiska vƤrden -STDEVP = STDAVP ## BerƤknar standardavvikelsen baserat pĆ„ hela populationen -STDEVPA = STDEVPA ## BerƤknar standardavvikelsen baserat pĆ„ hela populationen, inklusive tal, text och logiska vƤrden -STEYX = STDFELYX ## Returnerar standardfelet fƶr ett fƶrutspĆ„tt y-vƤrde fƶr varje x-vƤrde i regressionen -TDIST = TFƖRD ## Returnerar Students t-fƶrdelning -TINV = TINV ## Returnerar inversen till Students t-fƶrdelning -TREND = TREND ## Returnerar vƤrden lƤngs en linjƤr trend -TRIMMEAN = TRIMMEDEL ## Returnerar medelvƤrdet av mittpunkterna i en datamƤngd -TTEST = TTEST ## Returnerar sannolikheten berƤknad ur Students t-test -VAR = VARIANS ## Uppskattar variansen baserat pĆ„ ett urval -VARA = VARA ## Uppskattar variansen baserat pĆ„ ett urval, inklusive tal, text och logiska vƤrden -VARP = VARIANSP ## BerƤknar variansen baserat pĆ„ hela populationen -VARPA = VARPA ## BerƤknar variansen baserat pĆ„ hela populationen, inklusive tal, text och logiska vƤrden -WEIBULL = WEIBULL ## Returnerar Weibull-fƶrdelningen -ZTEST = ZTEST ## Returnerar det ensidiga sannolikhetsvƤrdet av ett z-test - - -## -## Text functions Textfunktioner -## -ASC = ASC ## Ƅndrar helbredds (dubbel byte) engelska bokstƤver eller katakana inom en teckenstrƤng till tecken med halvt breddsteg (enkel byte) -BAHTTEXT = BAHTTEXT ## Omvandlar ett tal till text med valutaformatet ß (baht) -CHAR = TECKENKOD ## Returnerar tecknet som anges av kod -CLEAN = STƄDA ## Tar bort alla icke utskrivbara tecken i en text -CODE = KOD ## Returnerar en numerisk kod fƶr det fƶrsta tecknet i en textstrƤng -CONCATENATE = SAMMANFOGA ## Sammanfogar flera textdelar till en textstrƤng -DOLLAR = VALUTA ## Omvandlar ett tal till text med valutaformat -EXACT = EXAKT ## Kontrollerar om tvĆ„ textvƤrden Ƥr identiska -FIND = HITTA ## Hittar en text i en annan (skiljer pĆ„ gemener och versaler) -FINDB = HITTAB ## Hittar en text i en annan (skiljer pĆ„ gemener och versaler) -FIXED = FASTTAL ## Formaterar ett tal som text med ett fast antal decimaler -JIS = JIS ## Ƅndrar halvbredds (enkel byte) engelska bokstƤver eller katakana inom en teckenstrƤng till tecken med helt breddsteg (dubbel byte) -LEFT = VƄNSTER ## Returnerar tecken lƤngst till vƤnster i en strƤng -LEFTB = VƄNSTERB ## Returnerar tecken lƤngst till vƤnster i en strƤng -LEN = LƄNGD ## Returnerar antalet tecken i en textstrƤng -LENB = LƄNGDB ## Returnerar antalet tecken i en textstrƤng -LOWER = GEMENER ## Omvandlar text till gemener -MID = EXTEXT ## Returnerar angivet antal tecken frĆ„n en text med bƶrjan vid den position som du anger -MIDB = EXTEXTB ## Returnerar angivet antal tecken frĆ„n en text med bƶrjan vid den position som du anger -PHONETIC = PHONETIC ## Returnerar de fonetiska (furigana) tecknen i en textstrƤng -PROPER = INITIAL ## Ƅndrar fƶrsta bokstaven i varje ord i ett textvƤrde till versal -REPLACE = ERSƄTT ## ErsƤtter tecken i text -REPLACEB = ERSƄTTB ## ErsƤtter tecken i text -REPT = REP ## Upprepar en text ett bestƤmt antal gĆ„nger -RIGHT = HƖGER ## Returnerar tecken lƤngst till hƶger i en strƤng -RIGHTB = HƖGERB ## Returnerar tecken lƤngst till hƶger i en strƤng -SEARCH = SƖK ## Hittar ett textvƤrde i ett annat (skiljer inte pĆ„ gemener och versaler) -SEARCHB = SƖKB ## Hittar ett textvƤrde i ett annat (skiljer inte pĆ„ gemener och versaler) -SUBSTITUTE = BYT.UT ## ErsƤtter gammal text med ny text i en textstrƤng -T = T ## Omvandlar argumenten till text -TEXT = TEXT ## Formaterar ett tal och omvandlar det till text -TRIM = RENSA ## Tar bort blanksteg frĆ„n text -UPPER = VERSALER ## Omvandlar text till versaler -VALUE = TEXTNUM ## Omvandlar ett textargument till ett tal diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/tr/config b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/tr/config deleted file mode 100644 index 266e000..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/tr/config +++ /dev/null @@ -1,24 +0,0 @@ -## -## PhpSpreadsheet -## - -ArgumentSeparator = ; - - -## -## (For future use) -## -currencySymbol = YTL - - -## -## Excel Error Codes (For future use) - -## -NULL = #BOŞ! -DIV0 = #SAYI/0! -VALUE = #DEĞER! -REF = #BAŞV! -NAME = #AD? -NUM = #SAYI! -NA = #YOK diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/tr/functions b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/tr/functions deleted file mode 100644 index f03563a..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/locale/tr/functions +++ /dev/null @@ -1,416 +0,0 @@ -## -## PhpSpreadsheet -## -## Data in this file derived from https://www.excel-function-translation.com/ -## -## - - -## -## Add-in and Automation functions Eklenti ve Otomasyon fonksiyonları -## -GETPIVOTDATA = ƖZETVERİAL ## Bir Ɩzet Tablo raporunda saklanan verileri verir. - - -## -## Cube functions Küp işlevleri -## -CUBEKPIMEMBER = KÜPKPIÜYE ## Kilit performans gƶstergesi (KPI-Key Performance Indicator) adını, ƶzelliğini ve ƶlçüsünü verir ve hücredeki ad ve ƶzelliği gƶsterir. KPI, bir kurumun performansını izlemek iƧin kullanılan aylık brüt kĆ¢r ya da üç aylık Ƨalışan giriş Ƨıkışları gibi ƶlçülebilen bir birimdir. -CUBEMEMBER = KÜPÜYE ## Bir küp hiyerarşisinde bir üyeyi veya kaydı verir. Üye veya kaydın küpte varolduğunu doğrulamak iƧin kullanılır. -CUBEMEMBERPROPERTY = KÜPÜYEƖZELLİĞİ ## Bir küpte bir üyenin ƶzelliğinin değerini verir. Küp iƧinde üye adının varlığını doğrulamak ve bu üyenin belli ƶzelliklerini getirmek iƧin kullanılır. -CUBERANKEDMEMBER = KÜPÜYESIRASI ## Bir küme iƧindeki üyenin derecesini veya kaƧıncı olduğunu verir. En iyi satış elemanı, veya en iyi on öğrenci gibi bir kümedeki bir veya daha fazla öğeyi getirmek iƧin kullanılır. -CUBESET = KÜPKÜME ## Kümeyi oluşturan ve ardından bu kümeyi Microsoft Office Excel'e getiren sunucudaki küpe küme ifadelerini gƶndererek hesaplanan üye veya kayıt kümesini tanımlar. -CUBESETCOUNT = KÜPKÜMESAY ## Bir kümedeki öğelerin sayısını getirir. -CUBEVALUE = KÜPDEĞER ## Bir küpten toplam değeri getirir. - - -## -## Database functions Veritabanı işlevleri -## -DAVERAGE = VSEƇORT ## SeƧili veritabanı girdilerinin ortalamasını verir. -DCOUNT = VSEƇSAY ## Veritabanında sayı iƧeren hücre sayısını hesaplar. -DCOUNTA = VSEƇSAYDOLU ## Veritabanındaki boş olmayan hücreleri sayar. -DGET = VAL ## Veritabanından, belirtilen ƶlçütlerle eşleşen tek bir rapor Ƨıkarır. -DMAX = VSEƇMAK ## SeƧili veritabanı girişlerinin en yüksek değerini verir. -DMIN = VSEƇMİN ## SeƧili veritabanı girişlerinin en düşük değerini verir. -DPRODUCT = VSEƇƇARP ## Kayıtların belli bir alanında bulunan, bir veritabanındaki ƶlçütlerle eşleşen değerleri Ƨarpar. -DSTDEV = VSEƇSTDSAPMA ## SeƧili veritabanı girişlerinden oluşan bir ƶrneğe dayanarak, standart sapmayı tahmin eder. -DSTDEVP = VSEƇSTDSAPMAS ## Standart sapmayı, seƧili veritabanı girişlerinin tüm popülasyonunu esas alarak hesaplar. -DSUM = VSEƇTOPLA ## Kayıtların alan sütununda bulunan, ƶlçütle eşleşen sayıları toplar. -DVAR = VSEƇVAR ## SeƧili veritabanı girişlerinden oluşan bir ƶrneği esas alarak farkı tahmin eder. -DVARP = VSEƇVARS ## SeƧili veritabanı girişlerinin tüm popülasyonunu esas alarak farkı hesaplar. - - -## -## Date and time functions Tarih ve saat işlevleri -## -DATE = TARİH ## Belirli bir tarihin seri numarasını verir. -DATEVALUE = TARİHSAYISI ## Metin biƧimindeki bir tarihi seri numarasına dƶnüştürür. -DAY = GÜN ## Seri numarasını, ayın bir gününe dƶnüştürür. -DAYS360 = GÜN360 ## İki tarih arasındaki gün sayısını, 360 günlük yılı esas alarak hesaplar. -EDATE = SERİTARİH ## BaşlangıƧ tarihinden itibaren, belirtilen ay sayısından ƶnce veya sonraki tarihin seri numarasını verir. -EOMONTH = SERİAY ## Belirtilen sayıda ay ƶnce veya sonraki ayın son gününün seri numarasını verir. -HOUR = SAAT ## Bir seri numarasını saate dƶnüştürür. -MINUTE = DAKİKA ## Bir seri numarasını dakikaya dƶnüştürür. -MONTH = AY ## Bir seri numarasını aya dƶnüştürür. -NETWORKDAYS = TAMİŞGÜNÜ ## İki tarih arasındaki tam Ƨalışma günlerinin sayısını verir. -NOW = ŞİMDİ ## GeƧerli tarihin ve saatin seri numarasını verir. -SECOND = SANİYE ## Bir seri numarasını saniyeye dƶnüştürür. -TIME = ZAMAN ## Belirli bir zamanın seri numarasını verir. -TIMEVALUE = ZAMANSAYISI ## Metin biƧimindeki zamanı seri numarasına dƶnüştürür. -TODAY = BUGÜN ## Bugünün tarihini seri numarasına dƶnüştürür. -WEEKDAY = HAFTANINGÜNÜ ## Bir seri numarasını, haftanın gününe dƶnüştürür. -WEEKNUM = HAFTASAY ## Dizisel değerini, haftanın yıl iƧinde bulunduğu konumu sayısal olarak gƶsteren sayıya dƶnüştürür. -WORKDAY = İŞGÜNÜ ## Belirtilen sayıda Ƨalışma günü ƶncesinin ya da sonrasının tarihinin seri numarasını verir. -YEAR = YIL ## Bir seri numarasını yıla dƶnüştürür. -YEARFRAC = YILORAN ## BaşlangıƧ_tarihi ve bitiş_tarihi arasındaki tam günleri gƶsteren yıl kesrini verir. - - -## -## Engineering functions Mühendislik işlevleri -## -BESSELI = BESSELI ## Değiştirilmiş Bessel fonksiyonu In(x)'i verir. -BESSELJ = BESSELJ ## Bessel fonksiyonu Jn(x)'i verir. -BESSELK = BESSELK ## Değiştirilmiş Bessel fonksiyonu Kn(x)'i verir. -BESSELY = BESSELY ## Bessel fonksiyonu Yn(x)'i verir. -BIN2DEC = BIN2DEC ## İkili bir sayıyı, ondalık sayıya dƶnüştürür. -BIN2HEX = BIN2HEX ## İkili bir sayıyı, onaltılıya dƶnüştürür. -BIN2OCT = BIN2OCT ## İkili bir sayıyı, sekizliye dƶnüştürür. -COMPLEX = KARMAŞIK ## GerƧek ve sanal katsayıları, karmaşık sayıya dƶnüştürür. -CONVERT = ƇEVİR ## Bir sayıyı, bir ƶlçüm sisteminden bir başka ƶlçüm sistemine dƶnüştürür. -DEC2BIN = DEC2BIN ## Ondalık bir sayıyı, ikiliye dƶnüştürür. -DEC2HEX = DEC2HEX ## Ondalık bir sayıyı, onaltılıya dƶnüştürür. -DEC2OCT = DEC2OCT ## Ondalık bir sayıyı sekizliğe dƶnüştürür. -DELTA = DELTA ## İki değerin eşit olup olmadığını sınar. -ERF = HATAİŞLEV ## Hata işlevini verir. -ERFC = TÜMHATAİŞLEV ## Tümleyici hata işlevini verir. -GESTEP = BESINIR ## Bir sayının eşik değerinden büyük olup olmadığını sınar. -HEX2BIN = HEX2BIN ## Onaltılı bir sayıyı ikiliye dƶnüştürür. -HEX2DEC = HEX2DEC ## Onaltılı bir sayıyı ondalığa dƶnüştürür. -HEX2OCT = HEX2OCT ## Onaltılı bir sayıyı sekizliğe dƶnüştürür. -IMABS = SANMUTLAK ## Karmaşık bir sayının mutlak değerini (modül) verir. -IMAGINARY = SANAL ## Karmaşık bir sayının sanal katsayısını verir. -IMARGUMENT = SANBAĞ_DEĞİŞKEN ## Radyanlarla belirtilen bir aƧı olan teta bağımsız değişkenini verir. -IMCONJUGATE = SANEŞLENEK ## Karmaşık bir sayının karmaşık eşleniğini verir. -IMCOS = SANCOS ## Karmaşık bir sayının kosinüsünü verir. -IMDIV = SANBƖL ## İki karmaşık sayının bƶlümünü verir. -IMEXP = SANÜS ## Karmaşık bir sayının üssünü verir. -IMLN = SANLN ## Karmaşık bir sayının doğal logaritmasını verir. -IMLOG10 = SANLOG10 ## Karmaşık bir sayının, 10 tabanında logaritmasını verir. -IMLOG2 = SANLOG2 ## Karmaşık bir sayının 2 tabanında logaritmasını verir. -IMPOWER = SANÜSSÜ ## Karmaşık bir sayıyı, bir tamsayı üssüne yükseltilmiş olarak verir. -IMPRODUCT = SANƇARP ## Karmaşık sayıların Ƨarpımını verir. -IMREAL = SANGERƇEK ## Karmaşık bir sayının, gerƧek katsayısını verir. -IMSIN = SANSIN ## Karmaşık bir sayının sinüsünü verir. -IMSQRT = SANKAREKƖK ## Karmaşık bir sayının karekƶkünü verir. -IMSUB = SANƇIKAR ## İki karmaşık sayının farkını verir. -IMSUM = SANTOPLA ## Karmaşık sayıların toplamını verir. -OCT2BIN = OCT2BIN ## Sekizli bir sayıyı ikiliye dƶnüştürür. -OCT2DEC = OCT2DEC ## Sekizli bir sayıyı ondalığa dƶnüştürür. -OCT2HEX = OCT2HEX ## Sekizli bir sayıyı onaltılıya dƶnüştürür. - - -## -## Financial functions Finansal fonksiyonlar -## -ACCRINT = GERƇEKFAİZ ## Dƶnemsel faiz ƶdeyen hisse senedine ilişkin tahakkuk eden faizi getirir. -ACCRINTM = GERƇEKFAİZV ## Vadesinde ƶdeme yapan bir tahvilin tahakkuk etmiş faizini verir. -AMORDEGRC = AMORDEGRC ## Yıpranma katsayısı kullanarak her hesap dƶneminin değer kaybını verir. -AMORLINC = AMORLINC ## Her hesap dƶnemi iƧindeki yıpranmayı verir. -COUPDAYBS = KUPONGÜNBD ## Kupon süresinin başlangıcından alış tarihine kadar olan süredeki gün sayısını verir. -COUPDAYS = KUPONGÜN ## Kupon süresindeki, gün sayısını, alış tarihini de iƧermek üzere, verir. -COUPDAYSNC = KUPONGÜNDSK ## Alış tarihinden bir sonraki kupon tarihine kadar olan gün sayısını verir. -COUPNCD = KUPONGÜNSKT ## Alış tarihinden bir sonraki kupon tarihini verir. -COUPNUM = KUPONSAYI ## Alış tarihiyle vade tarihi arasında ƶdenecek kuponların sayısını verir. -COUPPCD = KUPONGÜNƖKT ## Alış tarihinden bir ƶnceki kupon tarihini verir. -CUMIPMT = AİƇVERİMORANI ## İki dƶnem arasında ƶdenen kümülatif faizi verir. -CUMPRINC = ANA_PARA_ƖDEMESİ ## İki dƶnem arasında bir borƧ üzerine ƶdenen birikimli temeli verir. -DB = AZALANBAKİYE ## Bir malın belirtilen bir süre iƧindeki yıpranmasını, sabit azalan bakiye yƶntemini kullanarak verir. -DDB = ƇİFTAZALANBAKİYE ## Bir malın belirtilen bir süre iƧindeki yıpranmasını, Ƨift azalan bakiye yƶntemi ya da sizin belirttiğiniz başka bir yƶntemi kullanarak verir. -DISC = İNDİRİM ## Bir tahvilin indirim oranını verir. -DOLLARDE = LİRAON ## Kesir olarak tanımlanmış lira fiyatını, ondalık sayı olarak tanımlanmış lira fiyatına dƶnüştürür. -DOLLARFR = LİRAKES ## Ondalık sayı olarak tanımlanmış lira fiyatını, kesir olarak tanımlanmış lira fiyatına dƶnüştürür. -DURATION = SÜRE ## Belli aralıklarla faiz ƶdemesi yapan bir tahvilin yıllık süresini verir. -EFFECT = ETKİN ## Efektif yıllık faiz oranını verir. -FV = ANBD ## Bir yatırımın gelecekteki değerini verir. -FVSCHEDULE = GDPROGRAM ## Bir seri birleşik faiz oranı uyguladıktan sonra, bir başlangıƧtaki anaparanın gelecekteki değerini verir. -INTRATE = FAİZORANI ## Tam olarak yatırım yapılmış bir tahvilin faiz oranını verir. -IPMT = FAİZTUTARI ## Bir yatırımın verilen bir süre iƧin faiz ƶdemesini verir. -IRR = İƇ_VERİM_ORANI ## Bir para akışı serisi iƧin, iƧ verim oranını verir. -ISPMT = ISPMT ## Yatırımın belirli bir dƶnemi boyunca ƶdenen faizi hesaplar. -MDURATION = MSÜRE ## Varsayılan par değeri 10.000.000 lira olan bir tahvil iƧin Macauley değiştirilmiş süreyi verir. -MIRR = D_İƇ_VERİM_ORANI ## Pozitif ve negatif para akışlarının farklı oranlarda finanse edildiği durumlarda, iƧ verim oranını verir. -NOMINAL = NOMİNAL ## Yıllık nominal faiz oranını verir. -NPER = DƖNEM_SAYISI ## Bir yatırımın dƶnem sayısını verir. -NPV = NBD ## Bir yatırımın bugünkü net değerini, bir dƶnemsel para akışları serisine ve bir indirim oranına bağlı olarak verir. -ODDFPRICE = TEKYDEĞER ## Tek bir ilk dƶnemi olan bir tahvilin değerini, her 100.000.000 lirada bir verir. -ODDFYIELD = TEKYƖDEME ## Tek bir ilk dƶnemi olan bir tahvilin ƶdemesini verir. -ODDLPRICE = TEKSDEĞER ## Tek bir son dƶnemi olan bir tahvilin fiyatını her 10.000.000 lirada bir verir. -ODDLYIELD = TEKSƖDEME ## Tek bir son dƶnemi olan bir tahvilin ƶdemesini verir. -PMT = DEVRESEL_ƖDEME ## Bir yıllık dƶnemsel ƶdemeyi verir. -PPMT = ANA_PARA_ƖDEMESİ ## Verilen bir süre iƧin, bir yatırımın anaparasına dayanan ƶdemeyi verir. -PRICE = DEĞER ## Dƶnemsel faiz ƶdeyen bir tahvilin fiyatını 10.000.00 liralık değer başına verir. -PRICEDISC = DEĞERİND ## İndirimli bir tahvilin fiyatını 10.000.000 liralık nominal değer başına verir. -PRICEMAT = DEĞERVADE ## Faizini vade sonunda ƶdeyen bir tahvilin fiyatını 10.000.000 nominal değer başına verir. -PV = BD ## Bir yatırımın bugünkü değerini verir. -RATE = FAİZ_ORANI ## Bir yıllık dƶnem başına düşen faiz oranını verir. -RECEIVED = GETİRİ ## Tam olarak yatırılmış bir tahvilin vadesinin bitiminde alınan miktarı verir. -SLN = DA ## Bir malın bir dƶnem iƧindeki doğrusal yıpranmasını verir. -SYD = YAT ## Bir malın belirli bir dƶnem iƧin olan amortismanını verir. -TBILLEQ = HTAHEŞ ## Bir Hazine bonosunun bono eşdeğeri ƶdemesini verir. -TBILLPRICE = HTAHDEĞER ## Bir Hazine bonosunun değerini, 10.000.000 liralık nominal değer başına verir. -TBILLYIELD = HTAHƖDEME ## Bir Hazine bonosunun ƶdemesini verir. -VDB = DAB ## Bir malın amortismanını, belirlenmiş ya da kısmi bir dƶnem iƧin, bir azalan bakiye yƶntemi kullanarak verir. -XIRR = AİƇVERİMORANI ## Dƶnemsel olması gerekmeyen bir para akışları programı iƧin, iƧ verim oranını verir. -XNPV = ANBD ## Dƶnemsel olması gerekmeyen bir para akışları programı iƧin, bugünkü net değeri verir. -YIELD = ƖDEME ## Belirli aralıklarla faiz ƶdeyen bir tahvilin ƶdemesini verir. -YIELDDISC = ƖDEMEİND ## İndirimli bir tahvilin yıllık ƶdemesini verir; ƶrneğin, bir Hazine bonosunun. -YIELDMAT = ƖDEMEVADE ## Vadesinin bitiminde faiz ƶdeyen bir tahvilin yıllık ƶdemesini verir. - - -## -## Information functions Bilgi fonksiyonları -## -CELL = HÜCRE ## Bir hücrenin biƧimlendirmesi, konumu ya da iƧeriği hakkında bilgi verir. -ERROR.TYPE = HATA.TİPİ ## Bir hata türüne ilişkin sayıları verir. -INFO = BİLGİ ## GeƧerli işletim ortamı hakkında bilgi verir. -ISBLANK = EBOŞSA ## Değer boşsa, DOĞRU verir. -ISERR = EHATA ## Değer, #YOK dışındaki bir hata değeriyse, DOĞRU verir. -ISERROR = EHATALIYSA ## Değer, herhangi bir hata değeriyse, DOĞRU verir. -ISEVEN = ƇİFTTİR ## Sayı Ƨiftse, DOĞRU verir. -ISLOGICAL = EMANTIKSALSA ## Değer, mantıksal bir değerse, DOĞRU verir. -ISNA = EYOKSA ## Değer, #YOK hata değeriyse, DOĞRU verir. -ISNONTEXT = EMETİNDEĞİLSE ## Değer, metin değilse, DOĞRU verir. -ISNUMBER = ESAYIYSA ## Değer, bir sayıysa, DOĞRU verir. -ISODD = TEKTİR ## Sayı tekse, DOĞRU verir. -ISREF = EREFSE ## Değer bir başvuruysa, DOĞRU verir. -ISTEXT = EMETİNSE ## Değer bir metinse DOĞRU verir. -N = N ## Sayıya dƶnüştürülmüş bir değer verir. -NA = YOKSAY ## #YOK hata değerini verir. -TYPE = TİP ## Bir değerin veri türünü belirten bir sayı verir. - - -## -## Logical functions Mantıksal fonksiyonlar -## -AND = VE ## Bütün bağımsız değişkenleri DOĞRU ise, DOĞRU verir. -FALSE = YANLIŞ ## YANLIŞ mantıksal değerini verir. -IF = EĞER ## GerƧekleştirilecek bir mantıksal sınama belirtir. -IFERROR = EĞERHATA ## Formül hatalıysa belirttiğiniz değeri verir; bunun dışındaki durumlarda formülün sonucunu verir. -NOT = DEĞİL ## Bağımsız değişkeninin mantığını tersine Ƨevirir. -OR = YADA ## Bağımsız değişkenlerden herhangi birisi DOĞRU ise, DOĞRU verir. -TRUE = DOĞRU ## DOĞRU mantıksal değerini verir. - - -## -## Lookup and reference functions Arama ve Başvuru fonksiyonları -## -ADDRESS = ADRES ## Bir başvuruyu, Ƨalışma sayfasındaki tek bir hücreye metin olarak verir. -AREAS = ALANSAY ## Renvoie le nombre de zones dans une rĆ©fĆ©rence. -CHOOSE = ELEMAN ## Değerler listesinden bir değer seƧer. -COLUMN = SÜTUN ## Bir başvurunun sütun sayısını verir. -COLUMNS = SÜTUNSAY ## Bir başvurudaki sütunların sayısını verir. -HLOOKUP = YATAYARA ## Bir dizinin en üst satırına bakar ve belirtilen hücrenin değerini verir. -HYPERLINK = KƖPRÜ ## Bir ağ sunucusunda, bir intranette ya da Internet'te depolanan bir belgeyi aƧan bir kısayol ya da atlama oluşturur. -INDEX = İNDİS ## Başvurudan veya diziden bir değer seƧmek iƧin, bir dizin kullanır. -INDIRECT = DOLAYLI ## Metin değeriyle belirtilen bir başvuru verir. -LOOKUP = ARA ## Bir vektƶrdeki veya dizideki değerleri arar. -MATCH = KAƇINCI ## Bir başvurudaki veya dizideki değerleri arar. -OFFSET = KAYDIR ## Verilen bir başvurudan, bir başvuru kaydırmayı verir. -ROW = SATIR ## Bir başvurunun satır sayısını verir. -ROWS = SATIRSAY ## Bir başvurudaki satırların sayısını verir. -RTD = RTD ## COM otomasyonunu destekleyen programdan gerƧek zaman verileri alır. -TRANSPOSE = DEVRİK_DƖNĆœÅžĆœM ## Bir dizinin devrik dƶnüşümünü verir. -VLOOKUP = DĆœÅžEYARA ## Bir dizinin ilk sütununa bakar ve bir hücrenin değerini vermek iƧin satır boyunca hareket eder. - - -## -## Math and trigonometry functions Matematik ve trigonometri fonksiyonları -## -ABS = MUTLAK ## Bir sayının mutlak değerini verir. -ACOS = ACOS ## Bir sayının ark kosinüsünü verir. -ACOSH = ACOSH ## Bir sayının ters hiperbolik kosinüsünü verir. -ASIN = ASİN ## Bir sayının ark sinüsünü verir. -ASINH = ASİNH ## Bir sayının ters hiperbolik sinüsünü verir. -ATAN = ATAN ## Bir sayının ark tanjantını verir. -ATAN2 = ATAN2 ## Ark tanjantı, x- ve y- koordinatlarından verir. -ATANH = ATANH ## Bir sayının ters hiperbolik tanjantını verir. -CEILING = TAVANAYUVARLA ## Bir sayıyı, en yakın tamsayıya ya da en yakın katına yuvarlar. -COMBIN = KOMBİNASYON ## Verilen sayıda öğenin kombinasyon sayısını verir. -COS = COS ## Bir sayının kosinüsünü verir. -COSH = COSH ## Bir sayının hiperbolik kosinüsünü verir. -DEGREES = DERECE ## Radyanları dereceye dƶnüştürür. -EVEN = ƇİFT ## Bir sayıyı, en yakın daha büyük Ƨift tamsayıya yuvarlar. -EXP = ÜS ## e'yi, verilen bir sayının üssüne yükseltilmiş olarak verir. -FACT = ƇARPINIM ## Bir sayının faktƶrünü verir. -FACTDOUBLE = ƇİFTFAKTƖR ## Bir sayının Ƨift Ƨarpınımını verir. -FLOOR = TABANAYUVARLA ## Bir sayıyı, daha küçük sayıya, sıfıra yakınsayarak yuvarlar. -GCD = OBEB ## En büyük ortak bƶleni verir. -INT = TAMSAYI ## Bir sayıyı aşağıya doğru en yakın tamsayıya yuvarlar. -LCM = OKEK ## En küçük ortak katı verir. -LN = LN ## Bir sayının doğal logaritmasını verir. -LOG = LOG ## Bir sayının, belirtilen bir tabandaki logaritmasını verir. -LOG10 = LOG10 ## Bir sayının 10 tabanında logaritmasını verir. -MDETERM = DETERMİNANT ## Bir dizinin dizey determinantını verir. -MINVERSE = DİZEY_TERS ## Bir dizinin dizey tersini verir. -MMULT = DƇARP ## İki dizinin dizey Ƨarpımını verir. -MOD = MODÜLO ## Bƶlmeden kalanı verir. -MROUND = KYUVARLA ## İstenen kata yuvarlanmış bir sayı verir. -MULTINOMIAL = ƇOKTERİMLİ ## Bir sayılar kümesinin Ƨok terimlisini verir. -ODD = TEK ## Bir sayıyı en yakın daha büyük tek sayıya yuvarlar. -PI = Pİ ## Pi değerini verir. -POWER = KUVVET ## Bir üsse yükseltilmiş sayının sonucunu verir. -PRODUCT = ƇARPIM ## Bağımsız değişkenlerini Ƨarpar. -QUOTIENT = BƖLÜM ## Bir bƶlme işleminin tamsayı kısmını verir. -RADIANS = RADYAN ## Dereceleri radyanlara dƶnüştürür. -RAND = S_SAYI_ÜRET ## 0 ile 1 arasında rastgele bir sayı verir. -RANDBETWEEN = RASTGELEARALIK ## Belirttiğiniz sayılar arasında rastgele bir sayı verir. -ROMAN = ROMEN ## Bir normal rakamı, metin olarak, romen rakamına Ƨevirir. -ROUND = YUVARLA ## Bir sayıyı, belirtilen basamak sayısına yuvarlar. -ROUNDDOWN = AŞAĞIYUVARLA ## Bir sayıyı, daha küçük sayıya, sıfıra yakınsayarak yuvarlar. -ROUNDUP = YUKARIYUVARLA ## Bir sayıyı daha büyük sayıya, sıfırdan ıraksayarak yuvarlar. -SERIESSUM = SERİTOPLA ## Bir üs serisinin toplamını, formüle bağlı olarak verir. -SIGN = İŞARET ## Bir sayının işaretini verir. -SIN = SİN ## Verilen bir aƧının sinüsünü verir. -SINH = SİNH ## Bir sayının hiperbolik sinüsünü verir. -SQRT = KAREKƖK ## Pozitif bir karekƶk verir. -SQRTPI = KAREKƖKPİ ## (* Pi sayısının) kare kƶkünü verir. -SUBTOTAL = ALTTOPLAM ## Bir listedeki ya da veritabanındaki bir alt toplamı verir. -SUM = TOPLA ## Bağımsız değişkenlerini toplar. -SUMIF = ETOPLA ## Verilen ƶlçütle belirlenen hücreleri toplar. -SUMIFS = SUMIFS ## Bir aralıktaki, birden fazla ƶlçüte uyan hücreleri ekler. -SUMPRODUCT = TOPLA.ƇARPIM ## İlişkili dizi bileşenlerinin Ƨarpımlarının toplamını verir. -SUMSQ = TOPKARE ## Bağımsız değişkenlerin karelerinin toplamını verir. -SUMX2MY2 = TOPX2EY2 ## İki dizideki ilişkili değerlerin farkının toplamını verir. -SUMX2PY2 = TOPX2AY2 ## İki dizideki ilişkili değerlerin karelerinin toplamının toplamını verir. -SUMXMY2 = TOPXEY2 ## İki dizideki ilişkili değerlerin farklarının karelerinin toplamını verir. -TAN = TAN ## Bir sayının tanjantını verir. -TANH = TANH ## Bir sayının hiperbolik tanjantını verir. -TRUNC = NSAT ## Bir sayının, tamsayı durumuna gelecek şekilde, fazlalıklarını atar. - - -## -## Statistical functions İstatistiksel fonksiyonlar -## -AVEDEV = ORTSAP ## Veri noktalarının ortalamalarından mutlak sapmalarının ortalamasını verir. -AVERAGE = ORTALAMA ## Bağımsız değişkenlerinin ortalamasını verir. -AVERAGEA = ORTALAMAA ## Bağımsız değişkenlerinin, sayılar, metin ve mantıksal değerleri iƧermek üzere ortalamasını verir. -AVERAGEIF = EĞERORTALAMA ## Verili ƶlçütü karşılayan bir aralıktaki bütün hücrelerin ortalamasını (aritmetik ortalama) hesaplar. -AVERAGEIFS = EĞERLERORTALAMA ## Birden Ƨok ƶlçüte uyan tüm hücrelerin ortalamasını (aritmetik ortalama) hesaplar. -BETADIST = BETADAĞ ## Beta birikimli dağılım fonksiyonunu verir. -BETAINV = BETATERS ## Belirli bir beta dağılımı iƧin birikimli dağılım fonksiyonunun tersini verir. -BINOMDIST = BİNOMDAĞ ## Tek terimli binom dağılımı olasılığını verir. -CHIDIST = KİKAREDAĞ ## Kikare dağılımın tek kuyruklu olasılığını verir. -CHIINV = KİKARETERS ## Kikare dağılımın kuyruklu olasılığının tersini verir. -CHITEST = KİKARETEST ## Bağımsızlık sınamalarını verir. -CONFIDENCE = GÜVENİRLİK ## Bir popülasyon ortalaması iƧin güvenirlik aralığını verir. -CORREL = KORELASYON ## İki veri kümesi arasındaki bağlantı katsayısını verir. -COUNT = BAĞ_DEĞ_SAY ## Bağımsız değişkenler listesinde kaƧ tane sayı bulunduğunu sayar. -COUNTA = BAĞ_DEĞ_DOLU_SAY ## Bağımsız değişkenler listesinde kaƧ tane değer bulunduğunu sayar. -COUNTBLANK = BOŞLUKSAY ## Aralıktaki boş hücre sayısını hesaplar. -COUNTIF = EĞERSAY ## Verilen ƶlçütlere uyan bir aralık iƧindeki hücreleri sayar. -COUNTIFS = ƇOKEĞERSAY ## Birden Ƨok ƶlçüte uyan bir aralık iƧindeki hücreleri sayar. -COVAR = KOVARYANS ## Eşleştirilmiş sapmaların ortalaması olan kovaryansı verir. -CRITBINOM = KRİTİKBİNOM ## Birikimli binom dağılımının bir ƶlçüt değerinden küçük veya ƶlçüt değerine eşit olduğu en küçük değeri verir. -DEVSQ = SAPKARE ## Sapmaların karelerinin toplamını verir. -EXPONDIST = ÜSTELDAĞ ## Üstel dağılımı verir. -FDIST = FDAĞ ## F olasılık dağılımını verir. -FINV = FTERS ## F olasılık dağılımının tersini verir. -FISHER = FISHER ## Fisher dƶnüşümünü verir. -FISHERINV = FISHERTERS ## Fisher dƶnüşümünün tersini verir. -FORECAST = TAHMİN ## Bir doğrusal eğilim boyunca bir değer verir. -FREQUENCY = SIKLIK ## Bir sıklık dağılımını, dikey bir dizi olarak verir. -FTEST = FTEST ## Bir F-test'in sonucunu verir. -GAMMADIST = GAMADAĞ ## Gama dağılımını verir. -GAMMAINV = GAMATERS ## Gama kümülatif dağılımının tersini verir. -GAMMALN = GAMALN ## Gama fonksiyonunun (?(x)) doğal logaritmasını verir. -GEOMEAN = GEOORT ## Geometrik ortayı verir. -GROWTH = BÜYÜME ## Üstel bir eğilim boyunca değerler verir. -HARMEAN = HARORT ## Harmonik ortayı verir. -HYPGEOMDIST = HİPERGEOMDAĞ ## Hipergeometrik dağılımı verir. -INTERCEPT = KESMENOKTASI ## Doğrusal Ƨakıştırma Ƨizgisinin kesişme noktasını verir. -KURT = BASIKLIK ## Bir veri kümesinin basıklığını verir. -LARGE = BÜYÜK ## Bir veri kümesinde k. en büyük değeri verir. -LINEST = DOT ## Doğrusal bir eğilimin parametrelerini verir. -LOGEST = LOT ## Üstel bir eğilimin parametrelerini verir. -LOGINV = LOGTERS ## Bir lognormal dağılımının tersini verir. -LOGNORMDIST = LOGNORMDAĞ ## Birikimli lognormal dağılımını verir. -MAX = MAK ## Bir bağımsız değişkenler listesindeki en büyük değeri verir. -MAXA = MAKA ## Bir bağımsız değişkenler listesindeki, sayılar, metin ve mantıksal değerleri iƧermek üzere, en büyük değeri verir. -MEDIAN = ORTANCA ## Belirtilen sayıların orta değerini verir. -MIN = MİN ## Bir bağımsız değişkenler listesindeki en küçük değeri verir. -MINA = MİNA ## Bir bağımsız değişkenler listesindeki, sayılar, metin ve mantıksal değerleri de iƧermek üzere, en küçük değeri verir. -MODE = ENƇOK_OLAN ## Bir veri kümesindeki en sık rastlanan değeri verir. -NEGBINOMDIST = NEGBİNOMDAĞ ## Negatif binom dağılımını verir. -NORMDIST = NORMDAĞ ## Normal birikimli dağılımı verir. -NORMINV = NORMTERS ## Normal kümülatif dağılımın tersini verir. -NORMSDIST = NORMSDAĞ ## Standart normal birikimli dağılımı verir. -NORMSINV = NORMSTERS ## Standart normal birikimli dağılımın tersini verir. -PEARSON = PEARSON ## Pearson Ƨarpım moment korelasyon katsayısını verir. -PERCENTILE = YÜZDEBİRLİK ## Bir aralık iƧerisinde bulunan değerlerin k. frekans toplamını verir. -PERCENTRANK = YÜZDERANK ## Bir veri kümesindeki bir değerin yüzde mertebesini verir. -PERMUT = PERMÜTASYON ## Verilen sayıda nesne iƧin permütasyon sayısını verir. -POISSON = POISSON ## Poisson dağılımını verir. -PROB = OLASILIK ## Bir aralıktaki değerlerin iki sınır arasında olması olasılığını verir. -QUARTILE = DƖRTTEBİRLİK ## Bir veri kümesinin dƶrtte birliğini verir. -RANK = RANK ## Bir sayılar listesinde bir sayının mertebesini verir. -RSQ = RKARE ## Pearson Ƨarpım moment korelasyon katsayısının karesini verir. -SKEW = ƇARPIKLIK ## Bir dağılımın Ƨarpıklığını verir. -SLOPE = EĞİM ## Doğrusal Ƨakışma Ƨizgisinin eğimini verir. -SMALL = KƜƇƜK ## Bir veri kümesinde k. en küçük değeri verir. -STANDARDIZE = STANDARTLAŞTIRMA ## Normalleştirilmiş bir değer verir. -STDEV = STDSAPMA ## Bir ƶrneğe dayanarak standart sapmayı tahmin eder. -STDEVA = STDSAPMAA ## Standart sapmayı, sayılar, metin ve mantıksal değerleri iƧermek üzere, bir ƶrneğe bağlı olarak tahmin eder. -STDEVP = STDSAPMAS ## Standart sapmayı, tüm popülasyona bağlı olarak hesaplar. -STDEVPA = STDSAPMASA ## Standart sapmayı, sayılar, metin ve mantıksal değerleri iƧermek üzere, tüm popülasyona bağlı olarak hesaplar. -STEYX = STHYX ## Regresyondaki her x iƧin tahmini y değerinin standart hatasını verir. -TDIST = TDAĞ ## T-dağılımını verir. -TINV = TTERS ## T-dağılımının tersini verir. -TREND = EĞİLİM ## Doğrusal bir eğilim boyunca değerler verir. -TRIMMEAN = KIRPORTALAMA ## Bir veri kümesinin iƧinin ortalamasını verir. -TTEST = TTEST ## T-test'le ilişkilendirilmiş olasılığı verir. -VAR = VAR ## Varyansı, bir ƶrneğe bağlı olarak tahmin eder. -VARA = VARA ## Varyansı, sayılar, metin ve mantıksal değerleri iƧermek üzere, bir ƶrneğe bağlı olarak tahmin eder. -VARP = VARS ## Varyansı, tüm popülasyona dayanarak hesaplar. -VARPA = VARSA ## Varyansı, sayılar, metin ve mantıksal değerleri iƧermek üzere, tüm popülasyona bağlı olarak hesaplar. -WEIBULL = WEIBULL ## Weibull dağılımını hesaplar. -ZTEST = ZTEST ## Z-testinin tek kuyruklu olasılık değerini hesaplar. - - -## -## Text functions Metin fonksiyonları -## -ASC = ASC ## Bir karakter dizesindeki Ƨift enli (iki bayt) İngilizce harfleri veya katakanayı yarım enli (tek bayt) karakterlerle değiştirir. -BAHTTEXT = BAHTTEXT ## Sayıyı, ß (baht) para birimi biƧimini kullanarak metne dƶnüştürür. -CHAR = DAMGA ## Kod sayısıyla belirtilen karakteri verir. -CLEAN = TEMİZ ## Metindeki bütün yazdırılamaz karakterleri kaldırır. -CODE = KOD ## Bir metin dizesindeki ilk karakter iƧin sayısal bir kod verir. -CONCATENATE = BİRLEŞTİR ## Pek Ƨok metin öğesini bir metin öğesi olarak birleştirir. -DOLLAR = LİRA ## Bir sayıyı YTL (yeni Türk lirası) para birimi biƧimini kullanarak metne dƶnüştürür. -EXACT = ƖZDEŞ ## İki metin değerinin ƶzdeş olup olmadığını anlamak iƧin, değerleri denetler. -FIND = BUL ## Bir metin değerini, bir başkasının iƧinde bulur (büyük küçük harf duyarlıdır). -FINDB = BULB ## Bir metin değerini, bir başkasının iƧinde bulur (büyük küçük harf duyarlıdır). -FIXED = SAYIDÜZENLE ## Bir sayıyı, sabit sayıda ondalıkla, metin olarak biƧimlendirir. -JIS = JIS ## Bir karakter dizesindeki tek enli (tek bayt) İngilizce harfleri veya katakanayı Ƨift enli (iki bayt) karakterlerle değiştirir. -LEFT = SOL ## Bir metin değerinden en soldaki karakterleri verir. -LEFTB = SOLB ## Bir metin değerinden en soldaki karakterleri verir. -LEN = UZUNLUK ## Bir metin dizesindeki karakter sayısını verir. -LENB = UZUNLUKB ## Bir metin dizesindeki karakter sayısını verir. -LOWER = KƜƇƜKHARF ## Metni küçük harfe Ƨevirir. -MID = ORTA ## Bir metin dizesinden belirli sayıda karakteri, belirttiğiniz konumdan başlamak üzere verir. -MIDB = ORTAB ## Bir metin dizesinden belirli sayıda karakteri, belirttiğiniz konumdan başlamak üzere verir. -PHONETIC = SES ## Metin dizesinden ses (furigana) karakterlerini ayıklar. -PROPER = YAZIM.DÜZENİ ## Bir metin değerinin her bir sƶzcüğünün ilk harfini büyük harfe Ƨevirir. -REPLACE = DEĞİŞTİR ## Metnin iƧindeki karakterleri değiştirir. -REPLACEB = DEĞİŞTİRB ## Metnin iƧindeki karakterleri değiştirir. -REPT = YİNELE ## Metni belirtilen sayıda yineler. -RIGHT = SAĞ ## Bir metin değerinden en sağdaki karakterleri verir. -RIGHTB = SAĞB ## Bir metin değerinden en sağdaki karakterleri verir. -SEARCH = BUL ## Bir metin değerini, bir başkasının iƧinde bulur (büyük küçük harf duyarlı değildir). -SEARCHB = BULB ## Bir metin değerini, bir başkasının iƧinde bulur (büyük küçük harf duyarlı değildir). -SUBSTITUTE = YERİNEKOY ## Bir metin dizesinde, eski metnin yerine yeni metin koyar. -T = M ## Bağımsız değerlerini metne dƶnüştürür. -TEXT = METNEƇEVİR ## Bir sayıyı biƧimlendirir ve metne dƶnüştürür. -TRIM = KIRP ## Metindeki boşlukları kaldırır. -UPPER = BÜYÜKHARF ## Metni büyük harfe Ƨevirir. -VALUE = SAYIYAƇEVİR ## Bir metin bağımsız değişkenini sayıya dƶnüştürür. diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AddressHelper.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AddressHelper.php deleted file mode 100644 index 04fa3b8..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AddressHelper.php +++ /dev/null @@ -1,134 +0,0 @@ -setValueExplicit(true, DataType::TYPE_BOOL); - - return true; - } elseif ($value == Calculation::getFALSE()) { - $cell->setValueExplicit(false, DataType::TYPE_BOOL); - - return true; - } - - // Check for number in scientific format - if (preg_match('/^' . Calculation::CALCULATION_REGEXP_NUMBER . '$/', $value)) { - $cell->setValueExplicit((float) $value, DataType::TYPE_NUMERIC); - - return true; - } - - // Check for fraction - if (preg_match('/^([+-]?)\s*(\d+)\s?\/\s*(\d+)$/', $value, $matches)) { - // Convert value to number - $value = $matches[2] / $matches[3]; - if ($matches[1] == '-') { - $value = 0 - $value; - } - $cell->setValueExplicit((float) $value, DataType::TYPE_NUMERIC); - // Set style - $cell->getWorksheet()->getStyle($cell->getCoordinate()) - ->getNumberFormat()->setFormatCode('??/??'); - - return true; - } elseif (preg_match('/^([+-]?)(\d*) +(\d*)\s?\/\s*(\d*)$/', $value, $matches)) { - // Convert value to number - $value = $matches[2] + ($matches[3] / $matches[4]); - if ($matches[1] == '-') { - $value = 0 - $value; - } - $cell->setValueExplicit((float) $value, DataType::TYPE_NUMERIC); - // Set style - $cell->getWorksheet()->getStyle($cell->getCoordinate()) - ->getNumberFormat()->setFormatCode('# ??/??'); - - return true; - } - - // Check for percentage - if (preg_match('/^\-?\d*\.?\d*\s?\%$/', $value)) { - // Convert value to number - $value = (float) str_replace('%', '', $value) / 100; - $cell->setValueExplicit($value, DataType::TYPE_NUMERIC); - // Set style - $cell->getWorksheet()->getStyle($cell->getCoordinate()) - ->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_PERCENTAGE_00); - - return true; - } - - // Check for currency - $currencyCode = StringHelper::getCurrencyCode(); - $decimalSeparator = StringHelper::getDecimalSeparator(); - $thousandsSeparator = StringHelper::getThousandsSeparator(); - if (preg_match('/^' . preg_quote($currencyCode, '/') . ' *(\d{1,3}(' . preg_quote($thousandsSeparator, '/') . '\d{3})*|(\d+))(' . preg_quote($decimalSeparator, '/') . '\d{2})?$/', $value)) { - // Convert value to number - $value = (float) trim(str_replace([$currencyCode, $thousandsSeparator, $decimalSeparator], ['', '', '.'], $value)); - $cell->setValueExplicit($value, DataType::TYPE_NUMERIC); - // Set style - $cell->getWorksheet()->getStyle($cell->getCoordinate()) - ->getNumberFormat()->setFormatCode( - str_replace('$', $currencyCode, NumberFormat::FORMAT_CURRENCY_USD_SIMPLE) - ); - - return true; - } elseif (preg_match('/^\$ *(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$/', $value)) { - // Convert value to number - $value = (float) trim(str_replace(['$', ','], '', $value)); - $cell->setValueExplicit($value, DataType::TYPE_NUMERIC); - // Set style - $cell->getWorksheet()->getStyle($cell->getCoordinate()) - ->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_CURRENCY_USD_SIMPLE); - - return true; - } - - // Check for time without seconds e.g. '9:45', '09:45' - if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d$/', $value)) { - // Convert value to number - [$h, $m] = explode(':', $value); - $days = $h / 24 + $m / 1440; - $cell->setValueExplicit($days, DataType::TYPE_NUMERIC); - // Set style - $cell->getWorksheet()->getStyle($cell->getCoordinate()) - ->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATE_TIME3); - - return true; - } - - // Check for time with seconds '9:45:59', '09:45:59' - if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$/', $value)) { - // Convert value to number - [$h, $m, $s] = explode(':', $value); - $days = $h / 24 + $m / 1440 + $s / 86400; - // Convert value to number - $cell->setValueExplicit($days, DataType::TYPE_NUMERIC); - // Set style - $cell->getWorksheet()->getStyle($cell->getCoordinate()) - ->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_DATE_TIME4); - - return true; - } - - // Check for datetime, e.g. '2008-12-31', '2008-12-31 15:59', '2008-12-31 15:59:10' - if (($d = Date::stringToExcel($value)) !== false) { - // Convert value to number - $cell->setValueExplicit($d, DataType::TYPE_NUMERIC); - // Determine style. Either there is a time part or not. Look for ':' - if (strpos($value, ':') !== false) { - $formatCode = 'yyyy-mm-dd h:mm'; - } else { - $formatCode = 'yyyy-mm-dd'; - } - $cell->getWorksheet()->getStyle($cell->getCoordinate()) - ->getNumberFormat()->setFormatCode($formatCode); - - return true; - } - - // Check for newline character "\n" - if (strpos($value, "\n") !== false) { - $value = StringHelper::sanitizeUTF8($value); - $cell->setValueExplicit($value, DataType::TYPE_STRING); - // Set style - $cell->getWorksheet()->getStyle($cell->getCoordinate()) - ->getAlignment()->setWrapText(true); - - return true; - } - } - - // Not bound yet? Use parent... - return parent::bindValue($cell, $value); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php deleted file mode 100644 index 5dee411..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php +++ /dev/null @@ -1,680 +0,0 @@ -parent->update($this); - - return $this; - } - - public function detach(): void - { - $this->parent = null; - } - - public function attach(Cells $parent): void - { - $this->parent = $parent; - } - - /** - * Create a new Cell. - * - * @param mixed $pValue - * @param string $pDataType - */ - public function __construct($pValue, $pDataType, Worksheet $pSheet) - { - // Initialise cell value - $this->value = $pValue; - - // Set worksheet cache - $this->parent = $pSheet->getCellCollection(); - - // Set datatype? - if ($pDataType !== null) { - if ($pDataType == DataType::TYPE_STRING2) { - $pDataType = DataType::TYPE_STRING; - } - $this->dataType = $pDataType; - } elseif (!self::getValueBinder()->bindValue($this, $pValue)) { - throw new Exception('Value could not be bound to cell.'); - } - } - - /** - * Get cell coordinate column. - * - * @return string - */ - public function getColumn() - { - return $this->parent->getCurrentColumn(); - } - - /** - * Get cell coordinate row. - * - * @return int - */ - public function getRow() - { - return $this->parent->getCurrentRow(); - } - - /** - * Get cell coordinate. - * - * @return string - */ - public function getCoordinate() - { - return $this->parent->getCurrentCoordinate(); - } - - /** - * Get cell value. - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } - - /** - * Get cell value with formatting. - * - * @return string - */ - public function getFormattedValue() - { - return (string) NumberFormat::toFormattedString( - $this->getCalculatedValue(), - $this->getStyle() - ->getNumberFormat()->getFormatCode() - ); - } - - /** - * Set cell value. - * - * Sets the value for a cell, automatically determining the datatype using the value binder - * - * @param mixed $pValue Value - * - * @return $this - */ - public function setValue($pValue) - { - if (!self::getValueBinder()->bindValue($this, $pValue)) { - throw new Exception('Value could not be bound to cell.'); - } - - return $this; - } - - /** - * Set the value for a cell, with the explicit data type passed to the method (bypassing any use of the value binder). - * - * @param mixed $pValue Value - * @param string $pDataType Explicit data type, see DataType::TYPE_* - * - * @return Cell - */ - public function setValueExplicit($pValue, $pDataType) - { - // set the value according to data type - switch ($pDataType) { - case DataType::TYPE_NULL: - $this->value = $pValue; - - break; - case DataType::TYPE_STRING2: - $pDataType = DataType::TYPE_STRING; - // no break - case DataType::TYPE_STRING: - // Synonym for string - case DataType::TYPE_INLINE: - // Rich text - $this->value = DataType::checkString($pValue); - - break; - case DataType::TYPE_NUMERIC: - if (is_string($pValue) && !is_numeric($pValue)) { - throw new Exception('Invalid numeric value for datatype Numeric'); - } - $this->value = 0 + $pValue; - - break; - case DataType::TYPE_FORMULA: - $this->value = (string) $pValue; - - break; - case DataType::TYPE_BOOL: - $this->value = (bool) $pValue; - - break; - case DataType::TYPE_ERROR: - $this->value = DataType::checkErrorCode($pValue); - - break; - default: - throw new Exception('Invalid datatype: ' . $pDataType); - - break; - } - - // set the datatype - $this->dataType = $pDataType; - - return $this->updateInCollection(); - } - - /** - * Get calculated cell value. - * - * @param bool $resetLog Whether the calculation engine logger should be reset or not - * - * @return mixed - */ - public function getCalculatedValue($resetLog = true) - { - if ($this->dataType == DataType::TYPE_FORMULA) { - try { - $index = $this->getWorksheet()->getParent()->getActiveSheetIndex(); - $result = Calculation::getInstance( - $this->getWorksheet()->getParent() - )->calculateCellValue($this, $resetLog); - $this->getWorksheet()->getParent()->setActiveSheetIndex($index); - // We don't yet handle array returns - if (is_array($result)) { - while (is_array($result)) { - $result = array_shift($result); - } - } - } catch (Exception $ex) { - if (($ex->getMessage() === 'Unable to access External Workbook') && ($this->calculatedValue !== null)) { - return $this->calculatedValue; // Fallback for calculations referencing external files. - } elseif (strpos($ex->getMessage(), 'undefined name') !== false) { - return \PhpOffice\PhpSpreadsheet\Calculation\Functions::NAME(); - } - - throw new \PhpOffice\PhpSpreadsheet\Calculation\Exception( - $this->getWorksheet()->getTitle() . '!' . $this->getCoordinate() . ' -> ' . $ex->getMessage() - ); - } - - if ($result === '#Not Yet Implemented') { - return $this->calculatedValue; // Fallback if calculation engine does not support the formula. - } - - return $result; - } elseif ($this->value instanceof RichText) { - return $this->value->getPlainText(); - } - - return $this->value; - } - - /** - * Set old calculated value (cached). - * - * @param mixed $pValue Value - * - * @return Cell - */ - public function setCalculatedValue($pValue) - { - if ($pValue !== null) { - $this->calculatedValue = (is_numeric($pValue)) ? (float) $pValue : $pValue; - } - - return $this->updateInCollection(); - } - - /** - * Get old calculated value (cached) - * This returns the value last calculated by MS Excel or whichever spreadsheet program was used to - * create the original spreadsheet file. - * Note that this value is not guaranteed to reflect the actual calculated value because it is - * possible that auto-calculation was disabled in the original spreadsheet, and underlying data - * values used by the formula have changed since it was last calculated. - * - * @return mixed - */ - public function getOldCalculatedValue() - { - return $this->calculatedValue; - } - - /** - * Get cell data type. - * - * @return string - */ - public function getDataType() - { - return $this->dataType; - } - - /** - * Set cell data type. - * - * @param string $pDataType see DataType::TYPE_* - * - * @return Cell - */ - public function setDataType($pDataType) - { - if ($pDataType == DataType::TYPE_STRING2) { - $pDataType = DataType::TYPE_STRING; - } - $this->dataType = $pDataType; - - return $this->updateInCollection(); - } - - /** - * Identify if the cell contains a formula. - * - * @return bool - */ - public function isFormula() - { - return $this->dataType == DataType::TYPE_FORMULA; - } - - /** - * Does this cell contain Data validation rules? - * - * @return bool - */ - public function hasDataValidation() - { - if (!isset($this->parent)) { - throw new Exception('Cannot check for data validation when cell is not bound to a worksheet'); - } - - return $this->getWorksheet()->dataValidationExists($this->getCoordinate()); - } - - /** - * Get Data validation rules. - * - * @return DataValidation - */ - public function getDataValidation() - { - if (!isset($this->parent)) { - throw new Exception('Cannot get data validation for cell that is not bound to a worksheet'); - } - - return $this->getWorksheet()->getDataValidation($this->getCoordinate()); - } - - /** - * Set Data validation rules. - * - * @param DataValidation $pDataValidation - * - * @return Cell - */ - public function setDataValidation(?DataValidation $pDataValidation = null) - { - if (!isset($this->parent)) { - throw new Exception('Cannot set data validation for cell that is not bound to a worksheet'); - } - - $this->getWorksheet()->setDataValidation($this->getCoordinate(), $pDataValidation); - - return $this->updateInCollection(); - } - - /** - * Does this cell contain valid value? - * - * @return bool - */ - public function hasValidValue() - { - $validator = new DataValidator(); - - return $validator->isValid($this); - } - - /** - * Does this cell contain a Hyperlink? - * - * @return bool - */ - public function hasHyperlink() - { - if (!isset($this->parent)) { - throw new Exception('Cannot check for hyperlink when cell is not bound to a worksheet'); - } - - return $this->getWorksheet()->hyperlinkExists($this->getCoordinate()); - } - - /** - * Get Hyperlink. - * - * @return Hyperlink - */ - public function getHyperlink() - { - if (!isset($this->parent)) { - throw new Exception('Cannot get hyperlink for cell that is not bound to a worksheet'); - } - - return $this->getWorksheet()->getHyperlink($this->getCoordinate()); - } - - /** - * Set Hyperlink. - * - * @param Hyperlink $pHyperlink - * - * @return Cell - */ - public function setHyperlink(?Hyperlink $pHyperlink = null) - { - if (!isset($this->parent)) { - throw new Exception('Cannot set hyperlink for cell that is not bound to a worksheet'); - } - - $this->getWorksheet()->setHyperlink($this->getCoordinate(), $pHyperlink); - - return $this->updateInCollection(); - } - - /** - * Get cell collection. - * - * @return Cells - */ - public function getParent() - { - return $this->parent; - } - - /** - * Get parent worksheet. - * - * @return Worksheet - */ - public function getWorksheet() - { - return $this->parent->getParent(); - } - - /** - * Is this cell in a merge range. - * - * @return bool - */ - public function isInMergeRange() - { - return (bool) $this->getMergeRange(); - } - - /** - * Is this cell the master (top left cell) in a merge range (that holds the actual data value). - * - * @return bool - */ - public function isMergeRangeValueCell() - { - if ($mergeRange = $this->getMergeRange()) { - $mergeRange = Coordinate::splitRange($mergeRange); - [$startCell] = $mergeRange[0]; - if ($this->getCoordinate() === $startCell) { - return true; - } - } - - return false; - } - - /** - * If this cell is in a merge range, then return the range. - * - * @return false|string - */ - public function getMergeRange() - { - foreach ($this->getWorksheet()->getMergeCells() as $mergeRange) { - if ($this->isInRange($mergeRange)) { - return $mergeRange; - } - } - - return false; - } - - /** - * Get cell style. - * - * @return Style - */ - public function getStyle() - { - return $this->getWorksheet()->getStyle($this->getCoordinate()); - } - - /** - * Re-bind parent. - * - * @return Cell - */ - public function rebindParent(Worksheet $parent) - { - $this->parent = $parent->getCellCollection(); - - return $this->updateInCollection(); - } - - /** - * Is cell in a specific range? - * - * @param string $pRange Cell range (e.g. A1:A1) - * - * @return bool - */ - public function isInRange($pRange) - { - [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($pRange); - - // Translate properties - $myColumn = Coordinate::columnIndexFromString($this->getColumn()); - $myRow = $this->getRow(); - - // Verify if cell is in range - return ($rangeStart[0] <= $myColumn) && ($rangeEnd[0] >= $myColumn) && - ($rangeStart[1] <= $myRow) && ($rangeEnd[1] >= $myRow); - } - - /** - * Compare 2 cells. - * - * @param Cell $a Cell a - * @param Cell $b Cell b - * - * @return int Result of comparison (always -1 or 1, never zero!) - */ - public static function compareCells(self $a, self $b) - { - if ($a->getRow() < $b->getRow()) { - return -1; - } elseif ($a->getRow() > $b->getRow()) { - return 1; - } elseif (Coordinate::columnIndexFromString($a->getColumn()) < Coordinate::columnIndexFromString($b->getColumn())) { - return -1; - } - - return 1; - } - - /** - * Get value binder to use. - * - * @return IValueBinder - */ - public static function getValueBinder() - { - if (self::$valueBinder === null) { - self::$valueBinder = new DefaultValueBinder(); - } - - return self::$valueBinder; - } - - /** - * Set value binder to use. - */ - public static function setValueBinder(IValueBinder $binder): void - { - self::$valueBinder = $binder; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if ((is_object($value)) && ($key != 'parent')) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } - - /** - * Get index to cellXf. - * - * @return int - */ - public function getXfIndex() - { - return $this->xfIndex; - } - - /** - * Set index to cellXf. - * - * @param int $pValue - * - * @return Cell - */ - public function setXfIndex($pValue) - { - $this->xfIndex = $pValue; - - return $this->updateInCollection(); - } - - /** - * Set the formula attributes. - * - * @param mixed $pAttributes - * - * @return $this - */ - public function setFormulaAttributes($pAttributes) - { - $this->formulaAttributes = $pAttributes; - - return $this; - } - - /** - * Get the formula attributes. - */ - public function getFormulaAttributes() - { - return $this->formulaAttributes; - } - - /** - * Convert to string. - * - * @return string - */ - public function __toString() - { - return (string) $this->getValue(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php deleted file mode 100644 index 2afeebe..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php +++ /dev/null @@ -1,549 +0,0 @@ - '') { - $worksheet .= '!'; - } - - // Create absolute coordinate - if (ctype_digit($pCoordinateString)) { - return $worksheet . '$' . $pCoordinateString; - } elseif (ctype_alpha($pCoordinateString)) { - return $worksheet . '$' . strtoupper($pCoordinateString); - } - - return $worksheet . self::absoluteCoordinate($pCoordinateString); - } - - /** - * Make string coordinate absolute. - * - * @param string $pCoordinateString e.g. 'A1' - * - * @return string Absolute coordinate e.g. '$A$1' - */ - public static function absoluteCoordinate($pCoordinateString) - { - if (self::coordinateIsRange($pCoordinateString)) { - throw new Exception('Cell coordinate string can not be a range of cells'); - } - - // Split out any worksheet name from the coordinate - [$worksheet, $pCoordinateString] = Worksheet::extractSheetTitle($pCoordinateString, true); - if ($worksheet > '') { - $worksheet .= '!'; - } - - // Create absolute coordinate - [$column, $row] = self::coordinateFromString($pCoordinateString); - $column = ltrim($column, '$'); - $row = ltrim($row, '$'); - - return $worksheet . '$' . $column . '$' . $row; - } - - /** - * Split range into coordinate strings. - * - * @param string $pRange e.g. 'B4:D9' or 'B4:D9,H2:O11' or 'B4' - * - * @return array Array containing one or more arrays containing one or two coordinate strings - * e.g. ['B4','D9'] or [['B4','D9'], ['H2','O11']] - * or ['B4'] - */ - public static function splitRange($pRange) - { - // Ensure $pRange is a valid range - if (empty($pRange)) { - $pRange = self::DEFAULT_RANGE; - } - - $exploded = explode(',', $pRange); - $counter = count($exploded); - for ($i = 0; $i < $counter; ++$i) { - $exploded[$i] = explode(':', $exploded[$i]); - } - - return $exploded; - } - - /** - * Build range from coordinate strings. - * - * @param array $pRange Array containg one or more arrays containing one or two coordinate strings - * - * @return string String representation of $pRange - */ - public static function buildRange(array $pRange) - { - // Verify range - if (empty($pRange) || !is_array($pRange[0])) { - throw new Exception('Range does not contain any information'); - } - - // Build range - $counter = count($pRange); - for ($i = 0; $i < $counter; ++$i) { - $pRange[$i] = implode(':', $pRange[$i]); - } - - return implode(',', $pRange); - } - - /** - * Calculate range boundaries. - * - * @param string $pRange Cell range (e.g. A1:A1) - * - * @return array Range coordinates [Start Cell, End Cell] - * where Start Cell and End Cell are arrays (Column Number, Row Number) - */ - public static function rangeBoundaries($pRange) - { - // Ensure $pRange is a valid range - if (empty($pRange)) { - $pRange = self::DEFAULT_RANGE; - } - - // Uppercase coordinate - $pRange = strtoupper($pRange); - - // Extract range - if (strpos($pRange, ':') === false) { - $rangeA = $rangeB = $pRange; - } else { - [$rangeA, $rangeB] = explode(':', $pRange); - } - - // Calculate range outer borders - $rangeStart = self::coordinateFromString($rangeA); - $rangeEnd = self::coordinateFromString($rangeB); - - // Translate column into index - $rangeStart[0] = self::columnIndexFromString($rangeStart[0]); - $rangeEnd[0] = self::columnIndexFromString($rangeEnd[0]); - - return [$rangeStart, $rangeEnd]; - } - - /** - * Calculate range dimension. - * - * @param string $pRange Cell range (e.g. A1:A1) - * - * @return array Range dimension (width, height) - */ - public static function rangeDimension($pRange) - { - // Calculate range outer borders - [$rangeStart, $rangeEnd] = self::rangeBoundaries($pRange); - - return [($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1)]; - } - - /** - * Calculate range boundaries. - * - * @param string $pRange Cell range (e.g. A1:A1) - * - * @return array Range coordinates [Start Cell, End Cell] - * where Start Cell and End Cell are arrays [Column ID, Row Number] - */ - public static function getRangeBoundaries($pRange) - { - // Ensure $pRange is a valid range - if (empty($pRange)) { - $pRange = self::DEFAULT_RANGE; - } - - // Uppercase coordinate - $pRange = strtoupper($pRange); - - // Extract range - if (strpos($pRange, ':') === false) { - $rangeA = $rangeB = $pRange; - } else { - [$rangeA, $rangeB] = explode(':', $pRange); - } - - return [self::coordinateFromString($rangeA), self::coordinateFromString($rangeB)]; - } - - /** - * Column index from string. - * - * @param string $pString eg 'A' - * - * @return int Column index (A = 1) - */ - public static function columnIndexFromString($pString) - { - // Using a lookup cache adds a slight memory overhead, but boosts speed - // caching using a static within the method is faster than a class static, - // though it's additional memory overhead - static $indexCache = []; - - if (isset($indexCache[$pString])) { - return $indexCache[$pString]; - } - // It's surprising how costly the strtoupper() and ord() calls actually are, so we use a lookup array rather than use ord() - // and make it case insensitive to get rid of the strtoupper() as well. Because it's a static, there's no significant - // memory overhead either - static $columnLookup = [ - 'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5, 'F' => 6, 'G' => 7, 'H' => 8, 'I' => 9, 'J' => 10, 'K' => 11, 'L' => 12, 'M' => 13, - 'N' => 14, 'O' => 15, 'P' => 16, 'Q' => 17, 'R' => 18, 'S' => 19, 'T' => 20, 'U' => 21, 'V' => 22, 'W' => 23, 'X' => 24, 'Y' => 25, 'Z' => 26, - 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6, 'g' => 7, 'h' => 8, 'i' => 9, 'j' => 10, 'k' => 11, 'l' => 12, 'm' => 13, - 'n' => 14, 'o' => 15, 'p' => 16, 'q' => 17, 'r' => 18, 's' => 19, 't' => 20, 'u' => 21, 'v' => 22, 'w' => 23, 'x' => 24, 'y' => 25, 'z' => 26, - ]; - - // We also use the language construct isset() rather than the more costly strlen() function to match the length of $pString - // for improved performance - if (isset($pString[0])) { - if (!isset($pString[1])) { - $indexCache[$pString] = $columnLookup[$pString]; - - return $indexCache[$pString]; - } elseif (!isset($pString[2])) { - $indexCache[$pString] = $columnLookup[$pString[0]] * 26 + $columnLookup[$pString[1]]; - - return $indexCache[$pString]; - } elseif (!isset($pString[3])) { - $indexCache[$pString] = $columnLookup[$pString[0]] * 676 + $columnLookup[$pString[1]] * 26 + $columnLookup[$pString[2]]; - - return $indexCache[$pString]; - } - } - - throw new Exception('Column string index can not be ' . ((isset($pString[0])) ? 'longer than 3 characters' : 'empty')); - } - - /** - * String from column index. - * - * @param int $columnIndex Column index (A = 1) - * - * @return string - */ - public static function stringFromColumnIndex($columnIndex) - { - static $indexCache = []; - - if (!isset($indexCache[$columnIndex])) { - $indexValue = $columnIndex; - $base26 = null; - do { - $characterValue = ($indexValue % 26) ?: 26; - $indexValue = ($indexValue - $characterValue) / 26; - $base26 = chr($characterValue + 64) . ($base26 ?: ''); - } while ($indexValue > 0); - $indexCache[$columnIndex] = $base26; - } - - return $indexCache[$columnIndex]; - } - - /** - * Extract all cell references in range, which may be comprised of multiple cell ranges. - * - * @param string $cellRange Range: e.g. 'A1' or 'A1:C10' or 'A1:E10,A20:E25' or 'A1:E5 C3:G7' or 'A1:C1,A3:C3 B1:C3' - * - * @return array Array containing single cell references - */ - public static function extractAllCellReferencesInRange($cellRange): array - { - [$ranges, $operators] = self::getCellBlocksFromRangeString($cellRange); - - $cells = []; - foreach ($ranges as $range) { - $cells[] = self::getReferencesForCellBlock($range); - } - - $cells = self::processRangeSetOperators($operators, $cells); - - if (empty($cells)) { - return []; - } - - $cellList = array_merge(...$cells); - $cellList = self::sortCellReferenceArray($cellList); - - return $cellList; - } - - private static function processRangeSetOperators(array $operators, array $cells): array - { - for ($offset = 0; $offset < count($operators); ++$offset) { - $operator = $operators[$offset]; - if ($operator !== ' ') { - continue; - } - - $cells[$offset] = array_intersect($cells[$offset], $cells[$offset + 1]); - unset($operators[$offset], $cells[$offset + 1]); - $operators = array_values($operators); - $cells = array_values($cells); - --$offset; - } - - return $cells; - } - - private static function sortCellReferenceArray(array $cellList): array - { - // Sort the result by column and row - $sortKeys = []; - foreach ($cellList as $coord) { - [$column, $row] = sscanf($coord, '%[A-Z]%d'); - $sortKeys[sprintf('%3s%09d', $column, $row)] = $coord; - } - ksort($sortKeys); - - return array_values($sortKeys); - } - - /** - * Get all cell references for an individual cell block. - * - * @param string $cellBlock A cell range e.g. A4:B5 - * - * @return array All individual cells in that range - */ - private static function getReferencesForCellBlock($cellBlock) - { - $returnValue = []; - - // Single cell? - if (!self::coordinateIsRange($cellBlock)) { - return (array) $cellBlock; - } - - // Range... - $ranges = self::splitRange($cellBlock); - foreach ($ranges as $range) { - // Single cell? - if (!isset($range[1])) { - $returnValue[] = $range[0]; - - continue; - } - - // Range... - [$rangeStart, $rangeEnd] = $range; - [$startColumn, $startRow] = self::coordinateFromString($rangeStart); - [$endColumn, $endRow] = self::coordinateFromString($rangeEnd); - $startColumnIndex = self::columnIndexFromString($startColumn); - $endColumnIndex = self::columnIndexFromString($endColumn); - ++$endColumnIndex; - - // Current data - $currentColumnIndex = $startColumnIndex; - $currentRow = $startRow; - - self::validateRange($cellBlock, $startColumnIndex, $endColumnIndex, $currentRow, $endRow); - - // Loop cells - while ($currentColumnIndex < $endColumnIndex) { - while ($currentRow <= $endRow) { - $returnValue[] = self::stringFromColumnIndex($currentColumnIndex) . $currentRow; - ++$currentRow; - } - ++$currentColumnIndex; - $currentRow = $startRow; - } - } - - return $returnValue; - } - - /** - * Convert an associative array of single cell coordinates to values to an associative array - * of cell ranges to values. Only adjacent cell coordinates with the same - * value will be merged. If the value is an object, it must implement the method getHashCode(). - * - * For example, this function converts: - * - * [ 'A1' => 'x', 'A2' => 'x', 'A3' => 'x', 'A4' => 'y' ] - * - * to: - * - * [ 'A1:A3' => 'x', 'A4' => 'y' ] - * - * @param array $pCoordCollection associative array mapping coordinates to values - * - * @return array associative array mapping coordinate ranges to valuea - */ - public static function mergeRangesInCollection(array $pCoordCollection) - { - $hashedValues = []; - $mergedCoordCollection = []; - - foreach ($pCoordCollection as $coord => $value) { - if (self::coordinateIsRange($coord)) { - $mergedCoordCollection[$coord] = $value; - - continue; - } - - [$column, $row] = self::coordinateFromString($coord); - $row = (int) (ltrim($row, '$')); - $hashCode = $column . '-' . (is_object($value) ? $value->getHashCode() : $value); - - if (!isset($hashedValues[$hashCode])) { - $hashedValues[$hashCode] = (object) [ - 'value' => $value, - 'col' => $column, - 'rows' => [$row], - ]; - } else { - $hashedValues[$hashCode]->rows[] = $row; - } - } - - ksort($hashedValues); - - foreach ($hashedValues as $hashedValue) { - sort($hashedValue->rows); - $rowStart = null; - $rowEnd = null; - $ranges = []; - - foreach ($hashedValue->rows as $row) { - if ($rowStart === null) { - $rowStart = $row; - $rowEnd = $row; - } elseif ($rowEnd === $row - 1) { - $rowEnd = $row; - } else { - if ($rowStart == $rowEnd) { - $ranges[] = $hashedValue->col . $rowStart; - } else { - $ranges[] = $hashedValue->col . $rowStart . ':' . $hashedValue->col . $rowEnd; - } - - $rowStart = $row; - $rowEnd = $row; - } - } - - if ($rowStart !== null) { - if ($rowStart == $rowEnd) { - $ranges[] = $hashedValue->col . $rowStart; - } else { - $ranges[] = $hashedValue->col . $rowStart . ':' . $hashedValue->col . $rowEnd; - } - } - - foreach ($ranges as $range) { - $mergedCoordCollection[$range] = $hashedValue->value; - } - } - - return $mergedCoordCollection; - } - - /** - * Get the individual cell blocks from a range string, removing any $ characters. - * then splitting by operators and returning an array with ranges and operators. - * - * @param string $rangeString - * - * @return array[] - */ - private static function getCellBlocksFromRangeString($rangeString) - { - $rangeString = str_replace('$', '', strtoupper($rangeString)); - - // split range sets on intersection (space) or union (,) operators - $tokens = preg_split('/([ ,])/', $rangeString, -1, PREG_SPLIT_DELIM_CAPTURE); - // separate the range sets and the operators into arrays - $split = array_chunk($tokens, 2); - $ranges = array_column($split, 0); - $operators = array_column($split, 1); - - return [$ranges, $operators]; - } - - /** - * Check that the given range is valid, i.e. that the start column and row are not greater than the end column and - * row. - * - * @param string $cellBlock The original range, for displaying a meaningful error message - * @param int $startColumnIndex - * @param int $endColumnIndex - * @param int $currentRow - * @param int $endRow - */ - private static function validateRange($cellBlock, $startColumnIndex, $endColumnIndex, $currentRow, $endRow): void - { - if ($startColumnIndex >= $endColumnIndex || $currentRow > $endRow) { - throw new Exception('Invalid range: "' . $cellBlock . '"'); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php deleted file mode 100644 index ba03579..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php +++ /dev/null @@ -1,85 +0,0 @@ - 0, - '#DIV/0!' => 1, - '#VALUE!' => 2, - '#REF!' => 3, - '#NAME?' => 4, - '#NUM!' => 5, - '#N/A' => 6, - ]; - - /** - * Get list of error codes. - * - * @return array - */ - public static function getErrorCodes() - { - return self::$errorCodes; - } - - /** - * Check a string that it satisfies Excel requirements. - * - * @param null|RichText|string $pValue Value to sanitize to an Excel string - * - * @return null|RichText|string Sanitized value - */ - public static function checkString($pValue) - { - if ($pValue instanceof RichText) { - // TODO: Sanitize Rich-Text string (max. character count is 32,767) - return $pValue; - } - - // string must never be longer than 32,767 characters, truncate if necessary - $pValue = StringHelper::substring($pValue, 0, 32767); - - // we require that newline is represented as "\n" in core, not as "\r\n" or "\r" - $pValue = str_replace(["\r\n", "\r"], "\n", $pValue); - - return $pValue; - } - - /** - * Check a value that it is a valid error code. - * - * @param mixed $pValue Value to sanitize to an Excel error code - * - * @return string Sanitized value - */ - public static function checkErrorCode($pValue) - { - $pValue = (string) $pValue; - - if (!isset(self::$errorCodes[$pValue])) { - $pValue = '#NULL!'; - } - - return $pValue; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidation.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidation.php deleted file mode 100644 index dfeb024..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidation.php +++ /dev/null @@ -1,481 +0,0 @@ -formula1; - } - - /** - * Set Formula 1. - * - * @param string $value - * - * @return $this - */ - public function setFormula1($value) - { - $this->formula1 = $value; - - return $this; - } - - /** - * Get Formula 2. - * - * @return string - */ - public function getFormula2() - { - return $this->formula2; - } - - /** - * Set Formula 2. - * - * @param string $value - * - * @return $this - */ - public function setFormula2($value) - { - $this->formula2 = $value; - - return $this; - } - - /** - * Get Type. - * - * @return string - */ - public function getType() - { - return $this->type; - } - - /** - * Set Type. - * - * @param string $value - * - * @return $this - */ - public function setType($value) - { - $this->type = $value; - - return $this; - } - - /** - * Get Error style. - * - * @return string - */ - public function getErrorStyle() - { - return $this->errorStyle; - } - - /** - * Set Error style. - * - * @param string $value see self::STYLE_* - * - * @return $this - */ - public function setErrorStyle($value) - { - $this->errorStyle = $value; - - return $this; - } - - /** - * Get Operator. - * - * @return string - */ - public function getOperator() - { - return $this->operator; - } - - /** - * Set Operator. - * - * @param string $value - * - * @return $this - */ - public function setOperator($value) - { - $this->operator = $value; - - return $this; - } - - /** - * Get Allow Blank. - * - * @return bool - */ - public function getAllowBlank() - { - return $this->allowBlank; - } - - /** - * Set Allow Blank. - * - * @param bool $value - * - * @return $this - */ - public function setAllowBlank($value) - { - $this->allowBlank = $value; - - return $this; - } - - /** - * Get Show DropDown. - * - * @return bool - */ - public function getShowDropDown() - { - return $this->showDropDown; - } - - /** - * Set Show DropDown. - * - * @param bool $value - * - * @return $this - */ - public function setShowDropDown($value) - { - $this->showDropDown = $value; - - return $this; - } - - /** - * Get Show InputMessage. - * - * @return bool - */ - public function getShowInputMessage() - { - return $this->showInputMessage; - } - - /** - * Set Show InputMessage. - * - * @param bool $value - * - * @return $this - */ - public function setShowInputMessage($value) - { - $this->showInputMessage = $value; - - return $this; - } - - /** - * Get Show ErrorMessage. - * - * @return bool - */ - public function getShowErrorMessage() - { - return $this->showErrorMessage; - } - - /** - * Set Show ErrorMessage. - * - * @param bool $value - * - * @return $this - */ - public function setShowErrorMessage($value) - { - $this->showErrorMessage = $value; - - return $this; - } - - /** - * Get Error title. - * - * @return string - */ - public function getErrorTitle() - { - return $this->errorTitle; - } - - /** - * Set Error title. - * - * @param string $value - * - * @return $this - */ - public function setErrorTitle($value) - { - $this->errorTitle = $value; - - return $this; - } - - /** - * Get Error. - * - * @return string - */ - public function getError() - { - return $this->error; - } - - /** - * Set Error. - * - * @param string $value - * - * @return $this - */ - public function setError($value) - { - $this->error = $value; - - return $this; - } - - /** - * Get Prompt title. - * - * @return string - */ - public function getPromptTitle() - { - return $this->promptTitle; - } - - /** - * Set Prompt title. - * - * @param string $value - * - * @return $this - */ - public function setPromptTitle($value) - { - $this->promptTitle = $value; - - return $this; - } - - /** - * Get Prompt. - * - * @return string - */ - public function getPrompt() - { - return $this->prompt; - } - - /** - * Set Prompt. - * - * @param string $value - * - * @return $this - */ - public function setPrompt($value) - { - $this->prompt = $value; - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - return md5( - $this->formula1 . - $this->formula2 . - $this->type . - $this->errorStyle . - $this->operator . - ($this->allowBlank ? 't' : 'f') . - ($this->showDropDown ? 't' : 'f') . - ($this->showInputMessage ? 't' : 'f') . - ($this->showErrorMessage ? 't' : 'f') . - $this->errorTitle . - $this->error . - $this->promptTitle . - $this->prompt . - __CLASS__ - ); - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidator.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidator.php deleted file mode 100644 index 430d81b..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidator.php +++ /dev/null @@ -1,77 +0,0 @@ -hasDataValidation()) { - return true; - } - - $cellValue = $cell->getValue(); - $dataValidation = $cell->getDataValidation(); - - if (!$dataValidation->getAllowBlank() && ($cellValue === null || $cellValue === '')) { - return false; - } - - // TODO: write check on all cases - switch ($dataValidation->getType()) { - case DataValidation::TYPE_LIST: - return $this->isValueInList($cell); - } - - return false; - } - - /** - * Does this cell contain valid value, based on list? - * - * @param Cell $cell Cell to check the value - * - * @return bool - */ - private function isValueInList(Cell $cell) - { - $cellValue = $cell->getValue(); - $dataValidation = $cell->getDataValidation(); - - $formula1 = $dataValidation->getFormula1(); - if (!empty($formula1)) { - // inline values list - if ($formula1[0] === '"') { - return in_array(strtolower($cellValue), explode(',', strtolower(trim($formula1, '"'))), true); - } elseif (strpos($formula1, ':') > 0) { - // values list cells - $matchFormula = '=MATCH(' . $cell->getCoordinate() . ', ' . $formula1 . ', 0)'; - $calculation = Calculation::getInstance($cell->getWorksheet()->getParent()); - - try { - $result = $calculation->calculateFormula($matchFormula, $cell->getCoordinate(), $cell); - - return $result !== Functions::NA(); - } catch (Exception $ex) { - return false; - } - } - } - - return true; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DefaultValueBinder.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DefaultValueBinder.php deleted file mode 100644 index 693446e..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DefaultValueBinder.php +++ /dev/null @@ -1,82 +0,0 @@ -format('Y-m-d H:i:s'); - } elseif (!($value instanceof RichText)) { - $value = (string) $value; - } - } - - // Set value explicit - $cell->setValueExplicit($value, static::dataTypeForValue($value)); - - // Done! - return true; - } - - /** - * DataType for value. - * - * @param mixed $pValue - * - * @return string - */ - public static function dataTypeForValue($pValue) - { - // Match the value against a few data types - if ($pValue === null) { - return DataType::TYPE_NULL; - } elseif (is_float($pValue) || is_int($pValue)) { - return DataType::TYPE_NUMERIC; - } elseif (is_bool($pValue)) { - return DataType::TYPE_BOOL; - } elseif ($pValue === '') { - return DataType::TYPE_STRING; - } elseif ($pValue instanceof RichText) { - return DataType::TYPE_INLINE; - } elseif (is_string($pValue) && $pValue[0] === '=' && strlen($pValue) > 1) { - return DataType::TYPE_FORMULA; - } elseif (preg_match('/^[\+\-]?(\d+\\.?\d*|\d*\\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?$/', $pValue)) { - $tValue = ltrim($pValue, '+-'); - if (is_string($pValue) && $tValue[0] === '0' && strlen($tValue) > 1 && $tValue[1] !== '.') { - return DataType::TYPE_STRING; - } elseif ((strpos($pValue, '.') === false) && ($pValue > PHP_INT_MAX)) { - return DataType::TYPE_STRING; - } elseif (!is_numeric($pValue)) { - return DataType::TYPE_STRING; - } - - return DataType::TYPE_NUMERIC; - } elseif (is_string($pValue)) { - $errorCodes = DataType::getErrorCodes(); - if (isset($errorCodes[$pValue])) { - return DataType::TYPE_ERROR; - } - } - - return DataType::TYPE_STRING; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Hyperlink.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Hyperlink.php deleted file mode 100644 index 003d510..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Hyperlink.php +++ /dev/null @@ -1,113 +0,0 @@ -url = $pUrl; - $this->tooltip = $pTooltip; - } - - /** - * Get URL. - * - * @return string - */ - public function getUrl() - { - return $this->url; - } - - /** - * Set URL. - * - * @param string $value - * - * @return $this - */ - public function setUrl($value) - { - $this->url = $value; - - return $this; - } - - /** - * Get tooltip. - * - * @return string - */ - public function getTooltip() - { - return $this->tooltip; - } - - /** - * Set tooltip. - * - * @param string $value - * - * @return $this - */ - public function setTooltip($value) - { - $this->tooltip = $value; - - return $this; - } - - /** - * Is this hyperlink internal? (to another worksheet). - * - * @return bool - */ - public function isInternal() - { - return strpos($this->url, 'sheet://') !== false; - } - - /** - * @return string - */ - public function getTypeHyperlink() - { - return $this->isInternal() ? '' : 'External'; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - return md5( - $this->url . - $this->tooltip . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/IValueBinder.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/IValueBinder.php deleted file mode 100644 index 5af9f5f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/IValueBinder.php +++ /dev/null @@ -1,16 +0,0 @@ -setValueExplicit((string) $value, DataType::TYPE_STRING); - - // Done! - return true; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php deleted file mode 100644 index 7995c3b..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php +++ /dev/null @@ -1,556 +0,0 @@ - self::FORMAT_CODE_GENERAL, - 'source_linked' => 1, - ]; - - /** - * Axis Options. - * - * @var array of mixed - */ - private $axisOptions = [ - 'minimum' => null, - 'maximum' => null, - 'major_unit' => null, - 'minor_unit' => null, - 'orientation' => self::ORIENTATION_NORMAL, - 'minor_tick_mark' => self::TICK_MARK_NONE, - 'major_tick_mark' => self::TICK_MARK_NONE, - 'axis_labels' => self::AXIS_LABELS_NEXT_TO, - 'horizontal_crosses' => self::HORIZONTAL_CROSSES_AUTOZERO, - 'horizontal_crosses_value' => null, - ]; - - /** - * Fill Properties. - * - * @var array of mixed - */ - private $fillProperties = [ - 'type' => self::EXCEL_COLOR_TYPE_ARGB, - 'value' => null, - 'alpha' => 0, - ]; - - /** - * Line Properties. - * - * @var array of mixed - */ - private $lineProperties = [ - 'type' => self::EXCEL_COLOR_TYPE_ARGB, - 'value' => null, - 'alpha' => 0, - ]; - - /** - * Line Style Properties. - * - * @var array of mixed - */ - private $lineStyleProperties = [ - 'width' => '9525', - 'compound' => self::LINE_STYLE_COMPOUND_SIMPLE, - 'dash' => self::LINE_STYLE_DASH_SOLID, - 'cap' => self::LINE_STYLE_CAP_FLAT, - 'join' => self::LINE_STYLE_JOIN_BEVEL, - 'arrow' => [ - 'head' => [ - 'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW, - 'size' => self::LINE_STYLE_ARROW_SIZE_5, - ], - 'end' => [ - 'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW, - 'size' => self::LINE_STYLE_ARROW_SIZE_8, - ], - ], - ]; - - /** - * Shadow Properties. - * - * @var array of mixed - */ - private $shadowProperties = [ - 'presets' => self::SHADOW_PRESETS_NOSHADOW, - 'effect' => null, - 'color' => [ - 'type' => self::EXCEL_COLOR_TYPE_STANDARD, - 'value' => 'black', - 'alpha' => 40, - ], - 'size' => [ - 'sx' => null, - 'sy' => null, - 'kx' => null, - ], - 'blur' => null, - 'direction' => null, - 'distance' => null, - 'algn' => null, - 'rotWithShape' => null, - ]; - - /** - * Glow Properties. - * - * @var array of mixed - */ - private $glowProperties = [ - 'size' => null, - 'color' => [ - 'type' => self::EXCEL_COLOR_TYPE_STANDARD, - 'value' => 'black', - 'alpha' => 40, - ], - ]; - - /** - * Soft Edge Properties. - * - * @var array of mixed - */ - private $softEdges = [ - 'size' => null, - ]; - - /** - * Get Series Data Type. - * - * @param mixed $format_code - * - * @return string - */ - public function setAxisNumberProperties($format_code) - { - $this->axisNumber['format'] = (string) $format_code; - $this->axisNumber['source_linked'] = 0; - } - - /** - * Get Axis Number Format Data Type. - * - * @return string - */ - public function getAxisNumberFormat() - { - return $this->axisNumber['format']; - } - - /** - * Get Axis Number Source Linked. - * - * @return string - */ - public function getAxisNumberSourceLinked() - { - return (string) $this->axisNumber['source_linked']; - } - - /** - * Set Axis Options Properties. - * - * @param string $axis_labels - * @param string $horizontal_crosses_value - * @param string $horizontal_crosses - * @param string $axis_orientation - * @param string $major_tmt - * @param string $minor_tmt - * @param string $minimum - * @param string $maximum - * @param string $major_unit - * @param string $minor_unit - */ - public function setAxisOptionsProperties($axis_labels, $horizontal_crosses_value = null, $horizontal_crosses = null, $axis_orientation = null, $major_tmt = null, $minor_tmt = null, $minimum = null, $maximum = null, $major_unit = null, $minor_unit = null): void - { - $this->axisOptions['axis_labels'] = (string) $axis_labels; - ($horizontal_crosses_value !== null) ? $this->axisOptions['horizontal_crosses_value'] = (string) $horizontal_crosses_value : null; - ($horizontal_crosses !== null) ? $this->axisOptions['horizontal_crosses'] = (string) $horizontal_crosses : null; - ($axis_orientation !== null) ? $this->axisOptions['orientation'] = (string) $axis_orientation : null; - ($major_tmt !== null) ? $this->axisOptions['major_tick_mark'] = (string) $major_tmt : null; - ($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null; - ($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null; - ($minimum !== null) ? $this->axisOptions['minimum'] = (string) $minimum : null; - ($maximum !== null) ? $this->axisOptions['maximum'] = (string) $maximum : null; - ($major_unit !== null) ? $this->axisOptions['major_unit'] = (string) $major_unit : null; - ($minor_unit !== null) ? $this->axisOptions['minor_unit'] = (string) $minor_unit : null; - } - - /** - * Get Axis Options Property. - * - * @param string $property - * - * @return string - */ - public function getAxisOptionsProperty($property) - { - return $this->axisOptions[$property]; - } - - /** - * Set Axis Orientation Property. - * - * @param string $orientation - */ - public function setAxisOrientation($orientation): void - { - $this->axisOptions['orientation'] = (string) $orientation; - } - - /** - * Set Fill Property. - * - * @param string $color - * @param int $alpha - * @param string $type - */ - public function setFillParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB): void - { - $this->fillProperties = $this->setColorProperties($color, $alpha, $type); - } - - /** - * Set Line Property. - * - * @param string $color - * @param int $alpha - * @param string $type - */ - public function setLineParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB): void - { - $this->lineProperties = $this->setColorProperties($color, $alpha, $type); - } - - /** - * Get Fill Property. - * - * @param string $property - * - * @return string - */ - public function getFillProperty($property) - { - return $this->fillProperties[$property]; - } - - /** - * Get Line Property. - * - * @param string $property - * - * @return string - */ - public function getLineProperty($property) - { - return $this->lineProperties[$property]; - } - - /** - * Set Line Style Properties. - * - * @param float $line_width - * @param string $compound_type - * @param string $dash_type - * @param string $cap_type - * @param string $join_type - * @param string $head_arrow_type - * @param string $head_arrow_size - * @param string $end_arrow_type - * @param string $end_arrow_size - */ - public function setLineStyleProperties($line_width = null, $compound_type = null, $dash_type = null, $cap_type = null, $join_type = null, $head_arrow_type = null, $head_arrow_size = null, $end_arrow_type = null, $end_arrow_size = null): void - { - ($line_width !== null) ? $this->lineStyleProperties['width'] = $this->getExcelPointsWidth((float) $line_width) : null; - ($compound_type !== null) ? $this->lineStyleProperties['compound'] = (string) $compound_type : null; - ($dash_type !== null) ? $this->lineStyleProperties['dash'] = (string) $dash_type : null; - ($cap_type !== null) ? $this->lineStyleProperties['cap'] = (string) $cap_type : null; - ($join_type !== null) ? $this->lineStyleProperties['join'] = (string) $join_type : null; - ($head_arrow_type !== null) ? $this->lineStyleProperties['arrow']['head']['type'] = (string) $head_arrow_type : null; - ($head_arrow_size !== null) ? $this->lineStyleProperties['arrow']['head']['size'] = (string) $head_arrow_size : null; - ($end_arrow_type !== null) ? $this->lineStyleProperties['arrow']['end']['type'] = (string) $end_arrow_type : null; - ($end_arrow_size !== null) ? $this->lineStyleProperties['arrow']['end']['size'] = (string) $end_arrow_size : null; - } - - /** - * Get Line Style Property. - * - * @param array|string $elements - * - * @return string - */ - public function getLineStyleProperty($elements) - { - return $this->getArrayElementsValue($this->lineStyleProperties, $elements); - } - - /** - * Get Line Style Arrow Excel Width. - * - * @param string $arrow - * - * @return string - */ - public function getLineStyleArrowWidth($arrow) - { - return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'w'); - } - - /** - * Get Line Style Arrow Excel Length. - * - * @param string $arrow - * - * @return string - */ - public function getLineStyleArrowLength($arrow) - { - return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'len'); - } - - /** - * Set Shadow Properties. - * - * @param int $sh_presets - * @param string $sh_color_value - * @param string $sh_color_type - * @param string $sh_color_alpha - * @param float $sh_blur - * @param int $sh_angle - * @param float $sh_distance - */ - public function setShadowProperties($sh_presets, $sh_color_value = null, $sh_color_type = null, $sh_color_alpha = null, $sh_blur = null, $sh_angle = null, $sh_distance = null): void - { - $this->setShadowPresetsProperties((int) $sh_presets) - ->setShadowColor( - $sh_color_value === null ? $this->shadowProperties['color']['value'] : $sh_color_value, - $sh_color_alpha === null ? (int) $this->shadowProperties['color']['alpha'] : $sh_color_alpha, - $sh_color_type === null ? $this->shadowProperties['color']['type'] : $sh_color_type - ) - ->setShadowBlur($sh_blur) - ->setShadowAngle($sh_angle) - ->setShadowDistance($sh_distance); - } - - /** - * Set Shadow Color. - * - * @param int $shadow_presets - * - * @return $this - */ - private function setShadowPresetsProperties($shadow_presets) - { - $this->shadowProperties['presets'] = $shadow_presets; - $this->setShadowProperiesMapValues($this->getShadowPresetsMap($shadow_presets)); - - return $this; - } - - /** - * Set Shadow Properties from Mapped Values. - * - * @param mixed &$reference - * - * @return $this - */ - private function setShadowProperiesMapValues(array $properties_map, &$reference = null) - { - $base_reference = $reference; - foreach ($properties_map as $property_key => $property_val) { - if (is_array($property_val)) { - if ($reference === null) { - $reference = &$this->shadowProperties[$property_key]; - } else { - $reference = &$reference[$property_key]; - } - $this->setShadowProperiesMapValues($property_val, $reference); - } else { - if ($base_reference === null) { - $this->shadowProperties[$property_key] = $property_val; - } else { - $reference[$property_key] = $property_val; - } - } - } - - return $this; - } - - /** - * Set Shadow Color. - * - * @param string $color - * @param int $alpha - * @param string $type - * - * @return $this - */ - private function setShadowColor($color, $alpha, $type) - { - $this->shadowProperties['color'] = $this->setColorProperties($color, $alpha, $type); - - return $this; - } - - /** - * Set Shadow Blur. - * - * @param float $blur - * - * @return $this - */ - private function setShadowBlur($blur) - { - if ($blur !== null) { - $this->shadowProperties['blur'] = (string) $this->getExcelPointsWidth($blur); - } - - return $this; - } - - /** - * Set Shadow Angle. - * - * @param int $angle - * - * @return $this - */ - private function setShadowAngle($angle) - { - if ($angle !== null) { - $this->shadowProperties['direction'] = (string) $this->getExcelPointsAngle($angle); - } - - return $this; - } - - /** - * Set Shadow Distance. - * - * @param float $distance - * - * @return $this - */ - private function setShadowDistance($distance) - { - if ($distance !== null) { - $this->shadowProperties['distance'] = (string) $this->getExcelPointsWidth($distance); - } - - return $this; - } - - /** - * Get Shadow Property. - * - * @param string|string[] $elements - * - * @return null|array|int|string - */ - public function getShadowProperty($elements) - { - return $this->getArrayElementsValue($this->shadowProperties, $elements); - } - - /** - * Set Glow Properties. - * - * @param float $size - * @param string $color_value - * @param int $color_alpha - * @param string $color_type - */ - public function setGlowProperties($size, $color_value = null, $color_alpha = null, $color_type = null): void - { - $this->setGlowSize($size) - ->setGlowColor( - $color_value === null ? $this->glowProperties['color']['value'] : $color_value, - $color_alpha === null ? (int) $this->glowProperties['color']['alpha'] : $color_alpha, - $color_type === null ? $this->glowProperties['color']['type'] : $color_type - ); - } - - /** - * Get Glow Property. - * - * @param array|string $property - * - * @return string - */ - public function getGlowProperty($property) - { - return $this->getArrayElementsValue($this->glowProperties, $property); - } - - /** - * Set Glow Color. - * - * @param float $size - * - * @return $this - */ - private function setGlowSize($size) - { - if ($size !== null) { - $this->glowProperties['size'] = $this->getExcelPointsWidth($size); - } - - return $this; - } - - /** - * Set Glow Color. - * - * @param string $color - * @param int $alpha - * @param string $type - * - * @return $this - */ - private function setGlowColor($color, $alpha, $type) - { - $this->glowProperties['color'] = $this->setColorProperties($color, $alpha, $type); - - return $this; - } - - /** - * Set Soft Edges Size. - * - * @param float $size - */ - public function setSoftEdges($size): void - { - if ($size !== null) { - $softEdges['size'] = (string) $this->getExcelPointsWidth($size); - } - } - - /** - * Get Soft Edges Size. - * - * @return string - */ - public function getSoftEdgesSize() - { - return $this->softEdges['size']; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php deleted file mode 100644 index 20eb2ae..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php +++ /dev/null @@ -1,663 +0,0 @@ -name = $name; - $this->title = $title; - $this->legend = $legend; - $this->xAxisLabel = $xAxisLabel; - $this->yAxisLabel = $yAxisLabel; - $this->plotArea = $plotArea; - $this->plotVisibleOnly = $plotVisibleOnly; - $this->displayBlanksAs = $displayBlanksAs; - $this->xAxis = $xAxis; - $this->yAxis = $yAxis; - $this->majorGridlines = $majorGridlines; - $this->minorGridlines = $minorGridlines; - } - - /** - * Get Name. - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Get Worksheet. - * - * @return Worksheet - */ - public function getWorksheet() - { - return $this->worksheet; - } - - /** - * Set Worksheet. - * - * @param Worksheet $pValue - * - * @return $this - */ - public function setWorksheet(?Worksheet $pValue = null) - { - $this->worksheet = $pValue; - - return $this; - } - - /** - * Get Title. - * - * @return Title - */ - public function getTitle() - { - return $this->title; - } - - /** - * Set Title. - * - * @return $this - */ - public function setTitle(Title $title) - { - $this->title = $title; - - return $this; - } - - /** - * Get Legend. - * - * @return Legend - */ - public function getLegend() - { - return $this->legend; - } - - /** - * Set Legend. - * - * @return $this - */ - public function setLegend(Legend $legend) - { - $this->legend = $legend; - - return $this; - } - - /** - * Get X-Axis Label. - * - * @return Title - */ - public function getXAxisLabel() - { - return $this->xAxisLabel; - } - - /** - * Set X-Axis Label. - * - * @return $this - */ - public function setXAxisLabel(Title $label) - { - $this->xAxisLabel = $label; - - return $this; - } - - /** - * Get Y-Axis Label. - * - * @return Title - */ - public function getYAxisLabel() - { - return $this->yAxisLabel; - } - - /** - * Set Y-Axis Label. - * - * @return $this - */ - public function setYAxisLabel(Title $label) - { - $this->yAxisLabel = $label; - - return $this; - } - - /** - * Get Plot Area. - * - * @return PlotArea - */ - public function getPlotArea() - { - return $this->plotArea; - } - - /** - * Get Plot Visible Only. - * - * @return bool - */ - public function getPlotVisibleOnly() - { - return $this->plotVisibleOnly; - } - - /** - * Set Plot Visible Only. - * - * @param bool $plotVisibleOnly - * - * @return $this - */ - public function setPlotVisibleOnly($plotVisibleOnly) - { - $this->plotVisibleOnly = $plotVisibleOnly; - - return $this; - } - - /** - * Get Display Blanks as. - * - * @return string - */ - public function getDisplayBlanksAs() - { - return $this->displayBlanksAs; - } - - /** - * Set Display Blanks as. - * - * @param string $displayBlanksAs - * - * @return $this - */ - public function setDisplayBlanksAs($displayBlanksAs) - { - $this->displayBlanksAs = $displayBlanksAs; - - return $this; - } - - /** - * Get yAxis. - * - * @return Axis - */ - public function getChartAxisY() - { - if ($this->yAxis !== null) { - return $this->yAxis; - } - - return new Axis(); - } - - /** - * Get xAxis. - * - * @return Axis - */ - public function getChartAxisX() - { - if ($this->xAxis !== null) { - return $this->xAxis; - } - - return new Axis(); - } - - /** - * Get Major Gridlines. - * - * @return GridLines - */ - public function getMajorGridlines() - { - if ($this->majorGridlines !== null) { - return $this->majorGridlines; - } - - return new GridLines(); - } - - /** - * Get Minor Gridlines. - * - * @return GridLines - */ - public function getMinorGridlines() - { - if ($this->minorGridlines !== null) { - return $this->minorGridlines; - } - - return new GridLines(); - } - - /** - * Set the Top Left position for the chart. - * - * @param string $cell - * @param int $xOffset - * @param int $yOffset - * - * @return $this - */ - public function setTopLeftPosition($cell, $xOffset = null, $yOffset = null) - { - $this->topLeftCellRef = $cell; - if ($xOffset !== null) { - $this->setTopLeftXOffset($xOffset); - } - if ($yOffset !== null) { - $this->setTopLeftYOffset($yOffset); - } - - return $this; - } - - /** - * Get the top left position of the chart. - * - * @return array an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell - */ - public function getTopLeftPosition() - { - return [ - 'cell' => $this->topLeftCellRef, - 'xOffset' => $this->topLeftXOffset, - 'yOffset' => $this->topLeftYOffset, - ]; - } - - /** - * Get the cell address where the top left of the chart is fixed. - * - * @return string - */ - public function getTopLeftCell() - { - return $this->topLeftCellRef; - } - - /** - * Set the Top Left cell position for the chart. - * - * @param string $cell - * - * @return $this - */ - public function setTopLeftCell($cell) - { - $this->topLeftCellRef = $cell; - - return $this; - } - - /** - * Set the offset position within the Top Left cell for the chart. - * - * @param int $xOffset - * @param int $yOffset - * - * @return $this - */ - public function setTopLeftOffset($xOffset, $yOffset) - { - if ($xOffset !== null) { - $this->setTopLeftXOffset($xOffset); - } - - if ($yOffset !== null) { - $this->setTopLeftYOffset($yOffset); - } - - return $this; - } - - /** - * Get the offset position within the Top Left cell for the chart. - * - * @return int[] - */ - public function getTopLeftOffset() - { - return [ - 'X' => $this->topLeftXOffset, - 'Y' => $this->topLeftYOffset, - ]; - } - - public function setTopLeftXOffset($xOffset) - { - $this->topLeftXOffset = $xOffset; - - return $this; - } - - public function getTopLeftXOffset() - { - return $this->topLeftXOffset; - } - - public function setTopLeftYOffset($yOffset) - { - $this->topLeftYOffset = $yOffset; - - return $this; - } - - public function getTopLeftYOffset() - { - return $this->topLeftYOffset; - } - - /** - * Set the Bottom Right position of the chart. - * - * @param string $cell - * @param int $xOffset - * @param int $yOffset - * - * @return $this - */ - public function setBottomRightPosition($cell, $xOffset = null, $yOffset = null) - { - $this->bottomRightCellRef = $cell; - if ($xOffset !== null) { - $this->setBottomRightXOffset($xOffset); - } - if ($yOffset !== null) { - $this->setBottomRightYOffset($yOffset); - } - - return $this; - } - - /** - * Get the bottom right position of the chart. - * - * @return array an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell - */ - public function getBottomRightPosition() - { - return [ - 'cell' => $this->bottomRightCellRef, - 'xOffset' => $this->bottomRightXOffset, - 'yOffset' => $this->bottomRightYOffset, - ]; - } - - public function setBottomRightCell($cell) - { - $this->bottomRightCellRef = $cell; - - return $this; - } - - /** - * Get the cell address where the bottom right of the chart is fixed. - * - * @return string - */ - public function getBottomRightCell() - { - return $this->bottomRightCellRef; - } - - /** - * Set the offset position within the Bottom Right cell for the chart. - * - * @param int $xOffset - * @param int $yOffset - * - * @return $this - */ - public function setBottomRightOffset($xOffset, $yOffset) - { - if ($xOffset !== null) { - $this->setBottomRightXOffset($xOffset); - } - - if ($yOffset !== null) { - $this->setBottomRightYOffset($yOffset); - } - - return $this; - } - - /** - * Get the offset position within the Bottom Right cell for the chart. - * - * @return int[] - */ - public function getBottomRightOffset() - { - return [ - 'X' => $this->bottomRightXOffset, - 'Y' => $this->bottomRightYOffset, - ]; - } - - public function setBottomRightXOffset($xOffset) - { - $this->bottomRightXOffset = $xOffset; - - return $this; - } - - public function getBottomRightXOffset() - { - return $this->bottomRightXOffset; - } - - public function setBottomRightYOffset($yOffset) - { - $this->bottomRightYOffset = $yOffset; - - return $this; - } - - public function getBottomRightYOffset() - { - return $this->bottomRightYOffset; - } - - public function refresh(): void - { - if ($this->worksheet !== null) { - $this->plotArea->refresh($this->worksheet); - } - } - - /** - * Render the chart to given file (or stream). - * - * @param string $outputDestination Name of the file render to - * - * @return bool true on success - */ - public function render($outputDestination = null) - { - if ($outputDestination == 'php://output') { - $outputDestination = null; - } - - $libraryName = Settings::getChartRenderer(); - if ($libraryName === null) { - return false; - } - - // Ensure that data series values are up-to-date before we render - $this->refresh(); - - $renderer = new $libraryName($this); - - return $renderer->render($outputDestination); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php deleted file mode 100644 index 3a44b33..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php +++ /dev/null @@ -1,394 +0,0 @@ -plotType = $plotType; - $this->plotGrouping = $plotGrouping; - $this->plotOrder = $plotOrder; - $keys = array_keys($plotValues); - $this->plotValues = $plotValues; - if ((count($plotLabel) == 0) || ($plotLabel[$keys[0]] === null)) { - $plotLabel[$keys[0]] = new DataSeriesValues(); - } - $this->plotLabel = $plotLabel; - - if ((count($plotCategory) == 0) || ($plotCategory[$keys[0]] === null)) { - $plotCategory[$keys[0]] = new DataSeriesValues(); - } - $this->plotCategory = $plotCategory; - - $this->smoothLine = $smoothLine; - $this->plotStyle = $plotStyle; - - if ($plotDirection === null) { - $plotDirection = self::DIRECTION_COL; - } - $this->plotDirection = $plotDirection; - } - - /** - * Get Plot Type. - * - * @return string - */ - public function getPlotType() - { - return $this->plotType; - } - - /** - * Set Plot Type. - * - * @param string $plotType - * - * @return $this - */ - public function setPlotType($plotType) - { - $this->plotType = $plotType; - - return $this; - } - - /** - * Get Plot Grouping Type. - * - * @return string - */ - public function getPlotGrouping() - { - return $this->plotGrouping; - } - - /** - * Set Plot Grouping Type. - * - * @param string $groupingType - * - * @return $this - */ - public function setPlotGrouping($groupingType) - { - $this->plotGrouping = $groupingType; - - return $this; - } - - /** - * Get Plot Direction. - * - * @return string - */ - public function getPlotDirection() - { - return $this->plotDirection; - } - - /** - * Set Plot Direction. - * - * @param string $plotDirection - * - * @return $this - */ - public function setPlotDirection($plotDirection) - { - $this->plotDirection = $plotDirection; - - return $this; - } - - /** - * Get Plot Order. - * - * @return int[] - */ - public function getPlotOrder() - { - return $this->plotOrder; - } - - /** - * Get Plot Labels. - * - * @return array of DataSeriesValues - */ - public function getPlotLabels() - { - return $this->plotLabel; - } - - /** - * Get Plot Label by Index. - * - * @param mixed $index - * - * @return DataSeriesValues - */ - public function getPlotLabelByIndex($index) - { - $keys = array_keys($this->plotLabel); - if (in_array($index, $keys)) { - return $this->plotLabel[$index]; - } elseif (isset($keys[$index])) { - return $this->plotLabel[$keys[$index]]; - } - - return false; - } - - /** - * Get Plot Categories. - * - * @return array of DataSeriesValues - */ - public function getPlotCategories() - { - return $this->plotCategory; - } - - /** - * Get Plot Category by Index. - * - * @param mixed $index - * - * @return DataSeriesValues - */ - public function getPlotCategoryByIndex($index) - { - $keys = array_keys($this->plotCategory); - if (in_array($index, $keys)) { - return $this->plotCategory[$index]; - } elseif (isset($keys[$index])) { - return $this->plotCategory[$keys[$index]]; - } - - return false; - } - - /** - * Get Plot Style. - * - * @return null|string - */ - public function getPlotStyle() - { - return $this->plotStyle; - } - - /** - * Set Plot Style. - * - * @param null|string $plotStyle - * - * @return $this - */ - public function setPlotStyle($plotStyle) - { - $this->plotStyle = $plotStyle; - - return $this; - } - - /** - * Get Plot Values. - * - * @return array of DataSeriesValues - */ - public function getPlotValues() - { - return $this->plotValues; - } - - /** - * Get Plot Values by Index. - * - * @param mixed $index - * - * @return DataSeriesValues - */ - public function getPlotValuesByIndex($index) - { - $keys = array_keys($this->plotValues); - if (in_array($index, $keys)) { - return $this->plotValues[$index]; - } elseif (isset($keys[$index])) { - return $this->plotValues[$keys[$index]]; - } - - return false; - } - - /** - * Get Number of Plot Series. - * - * @return int - */ - public function getPlotSeriesCount() - { - return count($this->plotValues); - } - - /** - * Get Smooth Line. - * - * @return bool - */ - public function getSmoothLine() - { - return $this->smoothLine; - } - - /** - * Set Smooth Line. - * - * @param bool $smoothLine - * - * @return $this - */ - public function setSmoothLine($smoothLine) - { - $this->smoothLine = $smoothLine; - - return $this; - } - - public function refresh(Worksheet $worksheet): void - { - foreach ($this->plotValues as $plotValues) { - if ($plotValues !== null) { - $plotValues->refresh($worksheet, true); - } - } - foreach ($this->plotLabel as $plotValues) { - if ($plotValues !== null) { - $plotValues->refresh($worksheet, true); - } - } - foreach ($this->plotCategory as $plotValues) { - if ($plotValues !== null) { - $plotValues->refresh($worksheet, false); - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php deleted file mode 100644 index c1bd973..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php +++ /dev/null @@ -1,397 +0,0 @@ -setDataType($dataType); - $this->dataSource = $dataSource; - $this->formatCode = $formatCode; - $this->pointCount = $pointCount; - $this->dataValues = $dataValues; - $this->pointMarker = $marker; - $this->fillColor = $fillColor; - } - - /** - * Get Series Data Type. - * - * @return string - */ - public function getDataType() - { - return $this->dataType; - } - - /** - * Set Series Data Type. - * - * @param string $dataType Datatype of this data series - * Typical values are: - * DataSeriesValues::DATASERIES_TYPE_STRING - * Normally used for axis point values - * DataSeriesValues::DATASERIES_TYPE_NUMBER - * Normally used for chart data values - * - * @return $this - */ - public function setDataType($dataType) - { - if (!in_array($dataType, self::$dataTypeValues)) { - throw new Exception('Invalid datatype for chart data series values'); - } - $this->dataType = $dataType; - - return $this; - } - - /** - * Get Series Data Source (formula). - * - * @return string - */ - public function getDataSource() - { - return $this->dataSource; - } - - /** - * Set Series Data Source (formula). - * - * @param string $dataSource - * - * @return $this - */ - public function setDataSource($dataSource) - { - $this->dataSource = $dataSource; - - return $this; - } - - /** - * Get Point Marker. - * - * @return string - */ - public function getPointMarker() - { - return $this->pointMarker; - } - - /** - * Set Point Marker. - * - * @param string $marker - * - * @return $this - */ - public function setPointMarker($marker) - { - $this->pointMarker = $marker; - - return $this; - } - - /** - * Get Series Format Code. - * - * @return string - */ - public function getFormatCode() - { - return $this->formatCode; - } - - /** - * Set Series Format Code. - * - * @param string $formatCode - * - * @return $this - */ - public function setFormatCode($formatCode) - { - $this->formatCode = $formatCode; - - return $this; - } - - /** - * Get Series Point Count. - * - * @return int - */ - public function getPointCount() - { - return $this->pointCount; - } - - /** - * Get fill color. - * - * @return string|string[] HEX color or array with HEX colors - */ - public function getFillColor() - { - return $this->fillColor; - } - - /** - * Set fill color for series. - * - * @param string|string[] $color HEX color or array with HEX colors - * - * @return DataSeriesValues - */ - public function setFillColor($color) - { - if (is_array($color)) { - foreach ($color as $colorValue) { - $this->validateColor($colorValue); - } - } else { - $this->validateColor($color); - } - $this->fillColor = $color; - - return $this; - } - - /** - * Method for validating hex color. - * - * @param string $color value for color - * - * @return bool true if validation was successful - */ - private function validateColor($color) - { - if (!preg_match('/^[a-f0-9]{6}$/i', $color)) { - throw new Exception(sprintf('Invalid hex color for chart series (color: "%s")', $color)); - } - - return true; - } - - /** - * Get line width for series. - * - * @return int - */ - public function getLineWidth() - { - return $this->lineWidth; - } - - /** - * Set line width for the series. - * - * @param int $width - * - * @return $this - */ - public function setLineWidth($width) - { - $minWidth = 12700; - $this->lineWidth = max($minWidth, $width); - - return $this; - } - - /** - * Identify if the Data Series is a multi-level or a simple series. - * - * @return null|bool - */ - public function isMultiLevelSeries() - { - if (count($this->dataValues) > 0) { - return is_array(array_values($this->dataValues)[0]); - } - - return null; - } - - /** - * Return the level count of a multi-level Data Series. - * - * @return int - */ - public function multiLevelCount() - { - $levelCount = 0; - foreach ($this->dataValues as $dataValueSet) { - $levelCount = max($levelCount, count($dataValueSet)); - } - - return $levelCount; - } - - /** - * Get Series Data Values. - * - * @return array of mixed - */ - public function getDataValues() - { - return $this->dataValues; - } - - /** - * Get the first Series Data value. - * - * @return mixed - */ - public function getDataValue() - { - $count = count($this->dataValues); - if ($count == 0) { - return null; - } elseif ($count == 1) { - return $this->dataValues[0]; - } - - return $this->dataValues; - } - - /** - * Set Series Data Values. - * - * @param array $dataValues - * - * @return $this - */ - public function setDataValues($dataValues) - { - $this->dataValues = Functions::flattenArray($dataValues); - $this->pointCount = count($dataValues); - - return $this; - } - - public function refresh(Worksheet $worksheet, $flatten = true): void - { - if ($this->dataSource !== null) { - $calcEngine = Calculation::getInstance($worksheet->getParent()); - $newDataValues = Calculation::unwrapResult( - $calcEngine->_calculateFormulaValue( - '=' . $this->dataSource, - null, - $worksheet->getCell('A1') - ) - ); - if ($flatten) { - $this->dataValues = Functions::flattenArray($newDataValues); - foreach ($this->dataValues as &$dataValue) { - if (is_string($dataValue) && !empty($dataValue) && $dataValue[0] == '#') { - $dataValue = 0.0; - } - } - unset($dataValue); - } else { - [$worksheet, $cellRange] = Worksheet::extractSheetTitle($this->dataSource, true); - $dimensions = Coordinate::rangeDimension(str_replace('$', '', $cellRange)); - if (($dimensions[0] == 1) || ($dimensions[1] == 1)) { - $this->dataValues = Functions::flattenArray($newDataValues); - } else { - $newArray = array_values(array_shift($newDataValues)); - foreach ($newArray as $i => $newDataSet) { - $newArray[$i] = [$newDataSet]; - } - - foreach ($newDataValues as $newDataSet) { - $i = 0; - foreach ($newDataSet as $newDataVal) { - array_unshift($newArray[$i++], $newDataVal); - } - } - $this->dataValues = $newArray; - } - } - $this->pointCount = count($this->dataValues); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Exception.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Exception.php deleted file mode 100644 index 3f95b59..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Exception.php +++ /dev/null @@ -1,9 +0,0 @@ - [ - 'type' => self::EXCEL_COLOR_TYPE_STANDARD, - 'value' => null, - 'alpha' => 0, - ], - 'style' => [ - 'width' => '9525', - 'compound' => self::LINE_STYLE_COMPOUND_SIMPLE, - 'dash' => self::LINE_STYLE_DASH_SOLID, - 'cap' => self::LINE_STYLE_CAP_FLAT, - 'join' => self::LINE_STYLE_JOIN_BEVEL, - 'arrow' => [ - 'head' => [ - 'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW, - 'size' => self::LINE_STYLE_ARROW_SIZE_5, - ], - 'end' => [ - 'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW, - 'size' => self::LINE_STYLE_ARROW_SIZE_8, - ], - ], - ], - ]; - - private $shadowProperties = [ - 'presets' => self::SHADOW_PRESETS_NOSHADOW, - 'effect' => null, - 'color' => [ - 'type' => self::EXCEL_COLOR_TYPE_STANDARD, - 'value' => 'black', - 'alpha' => 85, - ], - 'size' => [ - 'sx' => null, - 'sy' => null, - 'kx' => null, - ], - 'blur' => null, - 'direction' => null, - 'distance' => null, - 'algn' => null, - 'rotWithShape' => null, - ]; - - private $glowProperties = [ - 'size' => null, - 'color' => [ - 'type' => self::EXCEL_COLOR_TYPE_STANDARD, - 'value' => 'black', - 'alpha' => 40, - ], - ]; - - private $softEdges = [ - 'size' => null, - ]; - - /** - * Get Object State. - * - * @return bool - */ - public function getObjectState() - { - return $this->objectState; - } - - /** - * Change Object State to True. - * - * @return $this - */ - private function activateObject() - { - $this->objectState = true; - - return $this; - } - - /** - * Set Line Color Properties. - * - * @param string $value - * @param int $alpha - * @param string $type - */ - public function setLineColorProperties($value, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_STANDARD): void - { - $this->activateObject() - ->lineProperties['color'] = $this->setColorProperties( - $value, - $alpha, - $type - ); - } - - /** - * Set Line Color Properties. - * - * @param float $line_width - * @param string $compound_type - * @param string $dash_type - * @param string $cap_type - * @param string $join_type - * @param string $head_arrow_type - * @param string $head_arrow_size - * @param string $end_arrow_type - * @param string $end_arrow_size - */ - public function setLineStyleProperties($line_width = null, $compound_type = null, $dash_type = null, $cap_type = null, $join_type = null, $head_arrow_type = null, $head_arrow_size = null, $end_arrow_type = null, $end_arrow_size = null): void - { - $this->activateObject(); - ($line_width !== null) - ? $this->lineProperties['style']['width'] = $this->getExcelPointsWidth((float) $line_width) - : null; - ($compound_type !== null) - ? $this->lineProperties['style']['compound'] = (string) $compound_type - : null; - ($dash_type !== null) - ? $this->lineProperties['style']['dash'] = (string) $dash_type - : null; - ($cap_type !== null) - ? $this->lineProperties['style']['cap'] = (string) $cap_type - : null; - ($join_type !== null) - ? $this->lineProperties['style']['join'] = (string) $join_type - : null; - ($head_arrow_type !== null) - ? $this->lineProperties['style']['arrow']['head']['type'] = (string) $head_arrow_type - : null; - ($head_arrow_size !== null) - ? $this->lineProperties['style']['arrow']['head']['size'] = (string) $head_arrow_size - : null; - ($end_arrow_type !== null) - ? $this->lineProperties['style']['arrow']['end']['type'] = (string) $end_arrow_type - : null; - ($end_arrow_size !== null) - ? $this->lineProperties['style']['arrow']['end']['size'] = (string) $end_arrow_size - : null; - } - - /** - * Get Line Color Property. - * - * @param string $parameter - * - * @return string - */ - public function getLineColorProperty($parameter) - { - return $this->lineProperties['color'][$parameter]; - } - - /** - * Get Line Style Property. - * - * @param array|string $elements - * - * @return string - */ - public function getLineStyleProperty($elements) - { - return $this->getArrayElementsValue($this->lineProperties['style'], $elements); - } - - /** - * Set Glow Properties. - * - * @param float $size - * @param string $color_value - * @param int $color_alpha - * @param string $color_type - */ - public function setGlowProperties($size, $color_value = null, $color_alpha = null, $color_type = null): void - { - $this - ->activateObject() - ->setGlowSize($size) - ->setGlowColor($color_value, $color_alpha, $color_type); - } - - /** - * Get Glow Color Property. - * - * @param string $property - * - * @return string - */ - public function getGlowColor($property) - { - return $this->glowProperties['color'][$property]; - } - - /** - * Get Glow Size. - * - * @return string - */ - public function getGlowSize() - { - return $this->glowProperties['size']; - } - - /** - * Set Glow Size. - * - * @param float $size - * - * @return $this - */ - private function setGlowSize($size) - { - $this->glowProperties['size'] = $this->getExcelPointsWidth((float) $size); - - return $this; - } - - /** - * Set Glow Color. - * - * @param string $color - * @param int $alpha - * @param string $type - * - * @return $this - */ - private function setGlowColor($color, $alpha, $type) - { - if ($color !== null) { - $this->glowProperties['color']['value'] = (string) $color; - } - if ($alpha !== null) { - $this->glowProperties['color']['alpha'] = $this->getTrueAlpha((int) $alpha); - } - if ($type !== null) { - $this->glowProperties['color']['type'] = (string) $type; - } - - return $this; - } - - /** - * Get Line Style Arrow Parameters. - * - * @param string $arrow_selector - * @param string $property_selector - * - * @return string - */ - public function getLineStyleArrowParameters($arrow_selector, $property_selector) - { - return $this->getLineStyleArrowSize($this->lineProperties['style']['arrow'][$arrow_selector]['size'], $property_selector); - } - - /** - * Set Shadow Properties. - * - * @param int $sh_presets - * @param string $sh_color_value - * @param string $sh_color_type - * @param int $sh_color_alpha - * @param string $sh_blur - * @param int $sh_angle - * @param float $sh_distance - */ - public function setShadowProperties($sh_presets, $sh_color_value = null, $sh_color_type = null, $sh_color_alpha = null, $sh_blur = null, $sh_angle = null, $sh_distance = null): void - { - $this->activateObject() - ->setShadowPresetsProperties((int) $sh_presets) - ->setShadowColor( - $sh_color_value === null ? $this->shadowProperties['color']['value'] : $sh_color_value, - $sh_color_alpha === null ? (int) $this->shadowProperties['color']['alpha'] : $this->getTrueAlpha($sh_color_alpha), - $sh_color_type === null ? $this->shadowProperties['color']['type'] : $sh_color_type - ) - ->setShadowBlur($sh_blur) - ->setShadowAngle($sh_angle) - ->setShadowDistance($sh_distance); - } - - /** - * Set Shadow Presets Properties. - * - * @param int $shadow_presets - * - * @return $this - */ - private function setShadowPresetsProperties($shadow_presets) - { - $this->shadowProperties['presets'] = $shadow_presets; - $this->setShadowProperiesMapValues($this->getShadowPresetsMap($shadow_presets)); - - return $this; - } - - /** - * Set Shadow Properties Values. - * - * @param mixed &$reference - * - * @return $this - */ - private function setShadowProperiesMapValues(array $properties_map, &$reference = null) - { - $base_reference = $reference; - foreach ($properties_map as $property_key => $property_val) { - if (is_array($property_val)) { - if ($reference === null) { - $reference = &$this->shadowProperties[$property_key]; - } else { - $reference = &$reference[$property_key]; - } - $this->setShadowProperiesMapValues($property_val, $reference); - } else { - if ($base_reference === null) { - $this->shadowProperties[$property_key] = $property_val; - } else { - $reference[$property_key] = $property_val; - } - } - } - - return $this; - } - - /** - * Set Shadow Color. - * - * @param string $color - * @param int $alpha - * @param string $type - * - * @return $this - */ - private function setShadowColor($color, $alpha, $type) - { - if ($color !== null) { - $this->shadowProperties['color']['value'] = (string) $color; - } - if ($alpha !== null) { - $this->shadowProperties['color']['alpha'] = $this->getTrueAlpha((int) $alpha); - } - if ($type !== null) { - $this->shadowProperties['color']['type'] = (string) $type; - } - - return $this; - } - - /** - * Set Shadow Blur. - * - * @param float $blur - * - * @return $this - */ - private function setShadowBlur($blur) - { - if ($blur !== null) { - $this->shadowProperties['blur'] = (string) $this->getExcelPointsWidth($blur); - } - - return $this; - } - - /** - * Set Shadow Angle. - * - * @param int $angle - * - * @return $this - */ - private function setShadowAngle($angle) - { - if ($angle !== null) { - $this->shadowProperties['direction'] = (string) $this->getExcelPointsAngle($angle); - } - - return $this; - } - - /** - * Set Shadow Distance. - * - * @param float $distance - * - * @return $this - */ - private function setShadowDistance($distance) - { - if ($distance !== null) { - $this->shadowProperties['distance'] = (string) $this->getExcelPointsWidth($distance); - } - - return $this; - } - - /** - * Get Shadow Property. - * - * @param string|string[] $elements - * - * @return string - */ - public function getShadowProperty($elements) - { - return $this->getArrayElementsValue($this->shadowProperties, $elements); - } - - /** - * Set Soft Edges Size. - * - * @param float $size - */ - public function setSoftEdgesSize($size): void - { - if ($size !== null) { - $this->activateObject(); - $this->softEdges['size'] = (string) $this->getExcelPointsWidth($size); - } - } - - /** - * Get Soft Edges Size. - * - * @return string - */ - public function getSoftEdgesSize() - { - return $this->softEdges['size']; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php deleted file mode 100644 index 51c8995..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php +++ /dev/null @@ -1,481 +0,0 @@ -layoutTarget = $layout['layoutTarget']; - } - if (isset($layout['xMode'])) { - $this->xMode = $layout['xMode']; - } - if (isset($layout['yMode'])) { - $this->yMode = $layout['yMode']; - } - if (isset($layout['x'])) { - $this->xPos = (float) $layout['x']; - } - if (isset($layout['y'])) { - $this->yPos = (float) $layout['y']; - } - if (isset($layout['w'])) { - $this->width = (float) $layout['w']; - } - if (isset($layout['h'])) { - $this->height = (float) $layout['h']; - } - } - - /** - * Get Layout Target. - * - * @return string - */ - public function getLayoutTarget() - { - return $this->layoutTarget; - } - - /** - * Set Layout Target. - * - * @param string $value - * - * @return $this - */ - public function setLayoutTarget($value) - { - $this->layoutTarget = $value; - - return $this; - } - - /** - * Get X-Mode. - * - * @return string - */ - public function getXMode() - { - return $this->xMode; - } - - /** - * Set X-Mode. - * - * @param string $value - * - * @return $this - */ - public function setXMode($value) - { - $this->xMode = (string) $value; - - return $this; - } - - /** - * Get Y-Mode. - * - * @return string - */ - public function getYMode() - { - return $this->yMode; - } - - /** - * Set Y-Mode. - * - * @param string $value - * - * @return $this - */ - public function setYMode($value) - { - $this->yMode = (string) $value; - - return $this; - } - - /** - * Get X-Position. - * - * @return number - */ - public function getXPosition() - { - return $this->xPos; - } - - /** - * Set X-Position. - * - * @param float $value - * - * @return $this - */ - public function setXPosition($value) - { - $this->xPos = (float) $value; - - return $this; - } - - /** - * Get Y-Position. - * - * @return number - */ - public function getYPosition() - { - return $this->yPos; - } - - /** - * Set Y-Position. - * - * @param float $value - * - * @return $this - */ - public function setYPosition($value) - { - $this->yPos = (float) $value; - - return $this; - } - - /** - * Get Width. - * - * @return number - */ - public function getWidth() - { - return $this->width; - } - - /** - * Set Width. - * - * @param float $value - * - * @return $this - */ - public function setWidth($value) - { - $this->width = $value; - - return $this; - } - - /** - * Get Height. - * - * @return number - */ - public function getHeight() - { - return $this->height; - } - - /** - * Set Height. - * - * @param float $value - * - * @return $this - */ - public function setHeight($value) - { - $this->height = $value; - - return $this; - } - - /** - * Get show legend key. - * - * @return bool - */ - public function getShowLegendKey() - { - return $this->showLegendKey; - } - - /** - * Set show legend key - * Specifies that legend keys should be shown in data labels. - * - * @param bool $value Show legend key - * - * @return $this - */ - public function setShowLegendKey($value) - { - $this->showLegendKey = $value; - - return $this; - } - - /** - * Get show value. - * - * @return bool - */ - public function getShowVal() - { - return $this->showVal; - } - - /** - * Set show val - * Specifies that the value should be shown in data labels. - * - * @param bool $value Show val - * - * @return $this - */ - public function setShowVal($value) - { - $this->showVal = $value; - - return $this; - } - - /** - * Get show category name. - * - * @return bool - */ - public function getShowCatName() - { - return $this->showCatName; - } - - /** - * Set show cat name - * Specifies that the category name should be shown in data labels. - * - * @param bool $value Show cat name - * - * @return $this - */ - public function setShowCatName($value) - { - $this->showCatName = $value; - - return $this; - } - - /** - * Get show data series name. - * - * @return bool - */ - public function getShowSerName() - { - return $this->showSerName; - } - - /** - * Set show ser name - * Specifies that the series name should be shown in data labels. - * - * @param bool $value Show series name - * - * @return $this - */ - public function setShowSerName($value) - { - $this->showSerName = $value; - - return $this; - } - - /** - * Get show percentage. - * - * @return bool - */ - public function getShowPercent() - { - return $this->showPercent; - } - - /** - * Set show percentage - * Specifies that the percentage should be shown in data labels. - * - * @param bool $value Show percentage - * - * @return $this - */ - public function setShowPercent($value) - { - $this->showPercent = $value; - - return $this; - } - - /** - * Get show bubble size. - * - * @return bool - */ - public function getShowBubbleSize() - { - return $this->showBubbleSize; - } - - /** - * Set show bubble size - * Specifies that the bubble size should be shown in data labels. - * - * @param bool $value Show bubble size - * - * @return $this - */ - public function setShowBubbleSize($value) - { - $this->showBubbleSize = $value; - - return $this; - } - - /** - * Get show leader lines. - * - * @return bool - */ - public function getShowLeaderLines() - { - return $this->showLeaderLines; - } - - /** - * Set show leader lines - * Specifies that leader lines should be shown in data labels. - * - * @param bool $value Show leader lines - * - * @return $this - */ - public function setShowLeaderLines($value) - { - $this->showLeaderLines = $value; - - return $this; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Legend.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Legend.php deleted file mode 100644 index fc0ed14..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Legend.php +++ /dev/null @@ -1,157 +0,0 @@ - self::POSITION_BOTTOM, - self::XL_LEGEND_POSITION_CORNER => self::POSITION_TOPRIGHT, - self::XL_LEGEND_POSITION_CUSTOM => '??', - self::XL_LEGEND_POSITION_LEFT => self::POSITION_LEFT, - self::XL_LEGEND_POSITION_RIGHT => self::POSITION_RIGHT, - self::XL_LEGEND_POSITION_TOP => self::POSITION_TOP, - ]; - - /** - * Legend position. - * - * @var string - */ - private $position = self::POSITION_RIGHT; - - /** - * Allow overlay of other elements? - * - * @var bool - */ - private $overlay = true; - - /** - * Legend Layout. - * - * @var Layout - */ - private $layout; - - /** - * Create a new Legend. - * - * @param string $position - * @param bool $overlay - */ - public function __construct($position = self::POSITION_RIGHT, ?Layout $layout = null, $overlay = false) - { - $this->setPosition($position); - $this->layout = $layout; - $this->setOverlay($overlay); - } - - /** - * Get legend position as an excel string value. - * - * @return string - */ - public function getPosition() - { - return $this->position; - } - - /** - * Get legend position using an excel string value. - * - * @param string $position see self::POSITION_* - * - * @return bool - */ - public function setPosition($position) - { - if (!in_array($position, self::$positionXLref)) { - return false; - } - - $this->position = $position; - - return true; - } - - /** - * Get legend position as an Excel internal numeric value. - * - * @return int - */ - public function getPositionXL() - { - return array_search($this->position, self::$positionXLref); - } - - /** - * Set legend position using an Excel internal numeric value. - * - * @param int $positionXL see self::XL_LEGEND_POSITION_* - * - * @return bool - */ - public function setPositionXL($positionXL) - { - if (!isset(self::$positionXLref[$positionXL])) { - return false; - } - - $this->position = self::$positionXLref[$positionXL]; - - return true; - } - - /** - * Get allow overlay of other elements? - * - * @return bool - */ - public function getOverlay() - { - return $this->overlay; - } - - /** - * Set allow overlay of other elements? - * - * @param bool $overlay - * - * @return bool - */ - public function setOverlay($overlay) - { - if (!is_bool($overlay)) { - return false; - } - - $this->overlay = $overlay; - - return true; - } - - /** - * Get Layout. - * - * @return Layout - */ - public function getLayout() - { - return $this->layout; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php deleted file mode 100644 index 954777c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php +++ /dev/null @@ -1,111 +0,0 @@ -layout = $layout; - $this->plotSeries = $plotSeries; - } - - /** - * Get Layout. - * - * @return Layout - */ - public function getLayout() - { - return $this->layout; - } - - /** - * Get Number of Plot Groups. - * - * @return array of DataSeries - */ - public function getPlotGroupCount() - { - return count($this->plotSeries); - } - - /** - * Get Number of Plot Series. - * - * @return int - */ - public function getPlotSeriesCount() - { - $seriesCount = 0; - foreach ($this->plotSeries as $plot) { - $seriesCount += $plot->getPlotSeriesCount(); - } - - return $seriesCount; - } - - /** - * Get Plot Series. - * - * @return array of DataSeries - */ - public function getPlotGroup() - { - return $this->plotSeries; - } - - /** - * Get Plot Series by Index. - * - * @param mixed $index - * - * @return DataSeries - */ - public function getPlotGroupByIndex($index) - { - return $this->plotSeries[$index]; - } - - /** - * Set Plot Series. - * - * @param DataSeries[] $plotSeries - * - * @return $this - */ - public function setPlotSeries(array $plotSeries) - { - $this->plotSeries = $plotSeries; - - return $this; - } - - public function refresh(Worksheet $worksheet): void - { - foreach ($this->plotSeries as $plotSeries) { - $plotSeries->refresh($worksheet); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Properties.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Properties.php deleted file mode 100644 index 98095f0..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Properties.php +++ /dev/null @@ -1,369 +0,0 @@ - (string) $type, - 'value' => (string) $color, - 'alpha' => (string) $this->getTrueAlpha($alpha), - ]; - } - - protected function getLineStyleArrowSize($array_selector, $array_kay_selector) - { - $sizes = [ - 1 => ['w' => 'sm', 'len' => 'sm'], - 2 => ['w' => 'sm', 'len' => 'med'], - 3 => ['w' => 'sm', 'len' => 'lg'], - 4 => ['w' => 'med', 'len' => 'sm'], - 5 => ['w' => 'med', 'len' => 'med'], - 6 => ['w' => 'med', 'len' => 'lg'], - 7 => ['w' => 'lg', 'len' => 'sm'], - 8 => ['w' => 'lg', 'len' => 'med'], - 9 => ['w' => 'lg', 'len' => 'lg'], - ]; - - return $sizes[$array_selector][$array_kay_selector]; - } - - protected function getShadowPresetsMap($shadow_presets_option) - { - $presets_options = [ - //OUTER - 1 => [ - 'effect' => 'outerShdw', - 'blur' => '50800', - 'distance' => '38100', - 'direction' => '2700000', - 'algn' => 'tl', - 'rotWithShape' => '0', - ], - 2 => [ - 'effect' => 'outerShdw', - 'blur' => '50800', - 'distance' => '38100', - 'direction' => '5400000', - 'algn' => 't', - 'rotWithShape' => '0', - ], - 3 => [ - 'effect' => 'outerShdw', - 'blur' => '50800', - 'distance' => '38100', - 'direction' => '8100000', - 'algn' => 'tr', - 'rotWithShape' => '0', - ], - 4 => [ - 'effect' => 'outerShdw', - 'blur' => '50800', - 'distance' => '38100', - 'algn' => 'l', - 'rotWithShape' => '0', - ], - 5 => [ - 'effect' => 'outerShdw', - 'size' => [ - 'sx' => '102000', - 'sy' => '102000', - ], - 'blur' => '63500', - 'distance' => '38100', - 'algn' => 'ctr', - 'rotWithShape' => '0', - ], - 6 => [ - 'effect' => 'outerShdw', - 'blur' => '50800', - 'distance' => '38100', - 'direction' => '10800000', - 'algn' => 'r', - 'rotWithShape' => '0', - ], - 7 => [ - 'effect' => 'outerShdw', - 'blur' => '50800', - 'distance' => '38100', - 'direction' => '18900000', - 'algn' => 'bl', - 'rotWithShape' => '0', - ], - 8 => [ - 'effect' => 'outerShdw', - 'blur' => '50800', - 'distance' => '38100', - 'direction' => '16200000', - 'rotWithShape' => '0', - ], - 9 => [ - 'effect' => 'outerShdw', - 'blur' => '50800', - 'distance' => '38100', - 'direction' => '13500000', - 'algn' => 'br', - 'rotWithShape' => '0', - ], - //INNER - 10 => [ - 'effect' => 'innerShdw', - 'blur' => '63500', - 'distance' => '50800', - 'direction' => '2700000', - ], - 11 => [ - 'effect' => 'innerShdw', - 'blur' => '63500', - 'distance' => '50800', - 'direction' => '5400000', - ], - 12 => [ - 'effect' => 'innerShdw', - 'blur' => '63500', - 'distance' => '50800', - 'direction' => '8100000', - ], - 13 => [ - 'effect' => 'innerShdw', - 'blur' => '63500', - 'distance' => '50800', - ], - 14 => [ - 'effect' => 'innerShdw', - 'blur' => '114300', - ], - 15 => [ - 'effect' => 'innerShdw', - 'blur' => '63500', - 'distance' => '50800', - 'direction' => '10800000', - ], - 16 => [ - 'effect' => 'innerShdw', - 'blur' => '63500', - 'distance' => '50800', - 'direction' => '18900000', - ], - 17 => [ - 'effect' => 'innerShdw', - 'blur' => '63500', - 'distance' => '50800', - 'direction' => '16200000', - ], - 18 => [ - 'effect' => 'innerShdw', - 'blur' => '63500', - 'distance' => '50800', - 'direction' => '13500000', - ], - //perspective - 19 => [ - 'effect' => 'outerShdw', - 'blur' => '152400', - 'distance' => '317500', - 'size' => [ - 'sx' => '90000', - 'sy' => '-19000', - ], - 'direction' => '5400000', - 'rotWithShape' => '0', - ], - 20 => [ - 'effect' => 'outerShdw', - 'blur' => '76200', - 'direction' => '18900000', - 'size' => [ - 'sy' => '23000', - 'kx' => '-1200000', - ], - 'algn' => 'bl', - 'rotWithShape' => '0', - ], - 21 => [ - 'effect' => 'outerShdw', - 'blur' => '76200', - 'direction' => '13500000', - 'size' => [ - 'sy' => '23000', - 'kx' => '1200000', - ], - 'algn' => 'br', - 'rotWithShape' => '0', - ], - 22 => [ - 'effect' => 'outerShdw', - 'blur' => '76200', - 'distance' => '12700', - 'direction' => '2700000', - 'size' => [ - 'sy' => '-23000', - 'kx' => '-800400', - ], - 'algn' => 'bl', - 'rotWithShape' => '0', - ], - 23 => [ - 'effect' => 'outerShdw', - 'blur' => '76200', - 'distance' => '12700', - 'direction' => '8100000', - 'size' => [ - 'sy' => '-23000', - 'kx' => '800400', - ], - 'algn' => 'br', - 'rotWithShape' => '0', - ], - ]; - - return $presets_options[$shadow_presets_option]; - } - - protected function getArrayElementsValue($properties, $elements) - { - $reference = &$properties; - if (!is_array($elements)) { - return $reference[$elements]; - } - - foreach ($elements as $keys) { - $reference = &$reference[$keys]; - } - - return $reference; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/IRenderer.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/IRenderer.php deleted file mode 100644 index 3032f6b..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/IRenderer.php +++ /dev/null @@ -1,22 +0,0 @@ -graph = null; - $this->chart = $chart; - } - - private static function init(): void - { - static $loaded = false; - if ($loaded) { - return; - } - - \JpGraph\JpGraph::load(); - \JpGraph\JpGraph::module('bar'); - \JpGraph\JpGraph::module('contour'); - \JpGraph\JpGraph::module('line'); - \JpGraph\JpGraph::module('pie'); - \JpGraph\JpGraph::module('pie3d'); - \JpGraph\JpGraph::module('radar'); - \JpGraph\JpGraph::module('regstat'); - \JpGraph\JpGraph::module('scatter'); - \JpGraph\JpGraph::module('stock'); - - self::$markSet = [ - 'diamond' => MARK_DIAMOND, - 'square' => MARK_SQUARE, - 'triangle' => MARK_UTRIANGLE, - 'x' => MARK_X, - 'star' => MARK_STAR, - 'dot' => MARK_FILLEDCIRCLE, - 'dash' => MARK_DTRIANGLE, - 'circle' => MARK_CIRCLE, - 'plus' => MARK_CROSS, - ]; - - $loaded = true; - } - - private function formatPointMarker($seriesPlot, $markerID) - { - $plotMarkKeys = array_keys(self::$markSet); - if ($markerID === null) { - // Use default plot marker (next marker in the series) - self::$plotMark %= count(self::$markSet); - $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]); - } elseif ($markerID !== 'none') { - // Use specified plot marker (if it exists) - if (isset(self::$markSet[$markerID])) { - $seriesPlot->mark->SetType(self::$markSet[$markerID]); - } else { - // If the specified plot marker doesn't exist, use default plot marker (next marker in the series) - self::$plotMark %= count(self::$markSet); - $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]); - } - } else { - // Hide plot marker - $seriesPlot->mark->Hide(); - } - $seriesPlot->mark->SetColor(self::$colourSet[self::$plotColour]); - $seriesPlot->mark->SetFillColor(self::$colourSet[self::$plotColour]); - $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]); - - return $seriesPlot; - } - - private function formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation = '') - { - $datasetLabelFormatCode = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getFormatCode(); - if ($datasetLabelFormatCode !== null) { - // Retrieve any label formatting code - $datasetLabelFormatCode = stripslashes($datasetLabelFormatCode); - } - - $testCurrentIndex = 0; - foreach ($datasetLabels as $i => $datasetLabel) { - if (is_array($datasetLabel)) { - if ($rotation == 'bar') { - $datasetLabels[$i] = implode(' ', $datasetLabel); - } else { - $datasetLabel = array_reverse($datasetLabel); - $datasetLabels[$i] = implode("\n", $datasetLabel); - } - } else { - // Format labels according to any formatting code - if ($datasetLabelFormatCode !== null) { - $datasetLabels[$i] = NumberFormat::toFormattedString($datasetLabel, $datasetLabelFormatCode); - } - } - ++$testCurrentIndex; - } - - return $datasetLabels; - } - - private function percentageSumCalculation($groupID, $seriesCount) - { - $sumValues = []; - // Adjust our values to a percentage value across all series in the group - for ($i = 0; $i < $seriesCount; ++$i) { - if ($i == 0) { - $sumValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); - } else { - $nextValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); - foreach ($nextValues as $k => $value) { - if (isset($sumValues[$k])) { - $sumValues[$k] += $value; - } else { - $sumValues[$k] = $value; - } - } - } - } - - return $sumValues; - } - - private function percentageAdjustValues($dataValues, $sumValues) - { - foreach ($dataValues as $k => $dataValue) { - $dataValues[$k] = $dataValue / $sumValues[$k] * 100; - } - - return $dataValues; - } - - private function getCaption($captionElement) - { - // Read any caption - $caption = ($captionElement !== null) ? $captionElement->getCaption() : null; - // Test if we have a title caption to display - if ($caption !== null) { - // If we do, it could be a plain string or an array - if (is_array($caption)) { - // Implode an array to a plain string - $caption = implode('', $caption); - } - } - - return $caption; - } - - private function renderTitle(): void - { - $title = $this->getCaption($this->chart->getTitle()); - if ($title !== null) { - $this->graph->title->Set($title); - } - } - - private function renderLegend(): void - { - $legend = $this->chart->getLegend(); - if ($legend !== null) { - $legendPosition = $legend->getPosition(); - switch ($legendPosition) { - case 'r': - $this->graph->legend->SetPos(0.01, 0.5, 'right', 'center'); // right - $this->graph->legend->SetColumns(1); - - break; - case 'l': - $this->graph->legend->SetPos(0.01, 0.5, 'left', 'center'); // left - $this->graph->legend->SetColumns(1); - - break; - case 't': - $this->graph->legend->SetPos(0.5, 0.01, 'center', 'top'); // top - - break; - case 'b': - $this->graph->legend->SetPos(0.5, 0.99, 'center', 'bottom'); // bottom - - break; - default: - $this->graph->legend->SetPos(0.01, 0.01, 'right', 'top'); // top-right - $this->graph->legend->SetColumns(1); - - break; - } - } else { - $this->graph->legend->Hide(); - } - } - - private function renderCartesianPlotArea($type = 'textlin'): void - { - $this->graph = new Graph(self::$width, self::$height); - $this->graph->SetScale($type); - - $this->renderTitle(); - - // Rotate for bar rather than column chart - $rotation = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotDirection(); - $reverse = $rotation == 'bar'; - - $xAxisLabel = $this->chart->getXAxisLabel(); - if ($xAxisLabel !== null) { - $title = $this->getCaption($xAxisLabel); - if ($title !== null) { - $this->graph->xaxis->SetTitle($title, 'center'); - $this->graph->xaxis->title->SetMargin(35); - if ($reverse) { - $this->graph->xaxis->title->SetAngle(90); - $this->graph->xaxis->title->SetMargin(90); - } - } - } - - $yAxisLabel = $this->chart->getYAxisLabel(); - if ($yAxisLabel !== null) { - $title = $this->getCaption($yAxisLabel); - if ($title !== null) { - $this->graph->yaxis->SetTitle($title, 'center'); - if ($reverse) { - $this->graph->yaxis->title->SetAngle(0); - $this->graph->yaxis->title->SetMargin(-55); - } - } - } - } - - private function renderPiePlotArea(): void - { - $this->graph = new PieGraph(self::$width, self::$height); - - $this->renderTitle(); - } - - private function renderRadarPlotArea(): void - { - $this->graph = new RadarGraph(self::$width, self::$height); - $this->graph->SetScale('lin'); - - $this->renderTitle(); - } - - private function renderPlotLine($groupID, $filled = false, $combination = false, $dimensions = '2d'): void - { - $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); - - $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount(); - if ($labelCount > 0) { - $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); - $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount); - $this->graph->xaxis->SetTickLabels($datasetLabels); - } - - $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); - $seriesPlots = []; - if ($grouping == 'percentStacked') { - $sumValues = $this->percentageSumCalculation($groupID, $seriesCount); - } - - // Loop through each data series in turn - for ($i = 0; $i < $seriesCount; ++$i) { - $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); - $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker(); - - if ($grouping == 'percentStacked') { - $dataValues = $this->percentageAdjustValues($dataValues, $sumValues); - } - - // Fill in any missing values in the $dataValues array - $testCurrentIndex = 0; - foreach ($dataValues as $k => $dataValue) { - while ($k != $testCurrentIndex) { - $dataValues[$testCurrentIndex] = null; - ++$testCurrentIndex; - } - ++$testCurrentIndex; - } - - $seriesPlot = new LinePlot($dataValues); - if ($combination) { - $seriesPlot->SetBarCenter(); - } - - if ($filled) { - $seriesPlot->SetFilled(true); - $seriesPlot->SetColor('black'); - $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]); - } else { - // Set the appropriate plot marker - $this->formatPointMarker($seriesPlot, $marker); - } - $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); - $seriesPlot->SetLegend($dataLabel); - - $seriesPlots[] = $seriesPlot; - } - - if ($grouping == 'standard') { - $groupPlot = $seriesPlots; - } else { - $groupPlot = new AccLinePlot($seriesPlots); - } - $this->graph->Add($groupPlot); - } - - private function renderPlotBar($groupID, $dimensions = '2d'): void - { - $rotation = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotDirection(); - // Rotate for bar rather than column chart - if (($groupID == 0) && ($rotation == 'bar')) { - $this->graph->Set90AndMargin(); - } - $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); - - $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount(); - if ($labelCount > 0) { - $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); - $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation); - // Rotate for bar rather than column chart - if ($rotation == 'bar') { - $datasetLabels = array_reverse($datasetLabels); - $this->graph->yaxis->SetPos('max'); - $this->graph->yaxis->SetLabelAlign('center', 'top'); - $this->graph->yaxis->SetLabelSide(SIDE_RIGHT); - } - $this->graph->xaxis->SetTickLabels($datasetLabels); - } - - $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); - $seriesPlots = []; - if ($grouping == 'percentStacked') { - $sumValues = $this->percentageSumCalculation($groupID, $seriesCount); - } - - // Loop through each data series in turn - for ($j = 0; $j < $seriesCount; ++$j) { - $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues(); - if ($grouping == 'percentStacked') { - $dataValues = $this->percentageAdjustValues($dataValues, $sumValues); - } - - // Fill in any missing values in the $dataValues array - $testCurrentIndex = 0; - foreach ($dataValues as $k => $dataValue) { - while ($k != $testCurrentIndex) { - $dataValues[$testCurrentIndex] = null; - ++$testCurrentIndex; - } - ++$testCurrentIndex; - } - - // Reverse the $dataValues order for bar rather than column chart - if ($rotation == 'bar') { - $dataValues = array_reverse($dataValues); - } - $seriesPlot = new BarPlot($dataValues); - $seriesPlot->SetColor('black'); - $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]); - if ($dimensions == '3d') { - $seriesPlot->SetShadow(); - } - if (!$this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)) { - $dataLabel = ''; - } else { - $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)->getDataValue(); - } - $seriesPlot->SetLegend($dataLabel); - - $seriesPlots[] = $seriesPlot; - } - // Reverse the plot order for bar rather than column chart - if (($rotation == 'bar') && ($grouping != 'percentStacked')) { - $seriesPlots = array_reverse($seriesPlots); - } - - if ($grouping == 'clustered') { - $groupPlot = new GroupBarPlot($seriesPlots); - } elseif ($grouping == 'standard') { - $groupPlot = new GroupBarPlot($seriesPlots); - } else { - $groupPlot = new AccBarPlot($seriesPlots); - if ($dimensions == '3d') { - $groupPlot->SetShadow(); - } - } - - $this->graph->Add($groupPlot); - } - - private function renderPlotScatter($groupID, $bubble): void - { - $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); - $scatterStyle = $bubbleSize = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); - - $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); - $seriesPlots = []; - - // Loop through each data series in turn - for ($i = 0; $i < $seriesCount; ++$i) { - $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues(); - $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); - - foreach ($dataValuesY as $k => $dataValueY) { - $dataValuesY[$k] = $k; - } - - $seriesPlot = new ScatterPlot($dataValuesX, $dataValuesY); - if ($scatterStyle == 'lineMarker') { - $seriesPlot->SetLinkPoints(); - $seriesPlot->link->SetColor(self::$colourSet[self::$plotColour]); - } elseif ($scatterStyle == 'smoothMarker') { - $spline = new Spline($dataValuesY, $dataValuesX); - [$splineDataY, $splineDataX] = $spline->Get(count($dataValuesX) * self::$width / 20); - $lplot = new LinePlot($splineDataX, $splineDataY); - $lplot->SetColor(self::$colourSet[self::$plotColour]); - - $this->graph->Add($lplot); - } - - if ($bubble) { - $this->formatPointMarker($seriesPlot, 'dot'); - $seriesPlot->mark->SetColor('black'); - $seriesPlot->mark->SetSize($bubbleSize); - } else { - $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker(); - $this->formatPointMarker($seriesPlot, $marker); - } - $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); - $seriesPlot->SetLegend($dataLabel); - - $this->graph->Add($seriesPlot); - } - } - - private function renderPlotRadar($groupID): void - { - $radarStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); - - $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); - $seriesPlots = []; - - // Loop through each data series in turn - for ($i = 0; $i < $seriesCount; ++$i) { - $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues(); - $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); - $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker(); - - $dataValues = []; - foreach ($dataValuesY as $k => $dataValueY) { - $dataValues[$k] = implode(' ', array_reverse($dataValueY)); - } - $tmp = array_shift($dataValues); - $dataValues[] = $tmp; - $tmp = array_shift($dataValuesX); - $dataValuesX[] = $tmp; - - $this->graph->SetTitles(array_reverse($dataValues)); - - $seriesPlot = new RadarPlot(array_reverse($dataValuesX)); - - $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); - $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]); - if ($radarStyle == 'filled') { - $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour]); - } - $this->formatPointMarker($seriesPlot, $marker); - $seriesPlot->SetLegend($dataLabel); - - $this->graph->Add($seriesPlot); - } - } - - private function renderPlotContour($groupID): void - { - $contourStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); - - $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); - $seriesPlots = []; - - $dataValues = []; - // Loop through each data series in turn - for ($i = 0; $i < $seriesCount; ++$i) { - $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues(); - $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); - - $dataValues[$i] = $dataValuesX; - } - $seriesPlot = new ContourPlot($dataValues); - - $this->graph->Add($seriesPlot); - } - - private function renderPlotStock($groupID): void - { - $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); - $plotOrder = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder(); - - $dataValues = []; - // Loop through each data series in turn and build the plot arrays - foreach ($plotOrder as $i => $v) { - $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($v)->getDataValues(); - foreach ($dataValuesX as $j => $dataValueX) { - $dataValues[$plotOrder[$i]][$j] = $dataValueX; - } - } - if (empty($dataValues)) { - return; - } - - $dataValuesPlot = []; - // Flatten the plot arrays to a single dimensional array to work with jpgraph - $jMax = count($dataValues[0]); - for ($j = 0; $j < $jMax; ++$j) { - for ($i = 0; $i < $seriesCount; ++$i) { - $dataValuesPlot[] = $dataValues[$i][$j]; - } - } - - // Set the x-axis labels - $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount(); - if ($labelCount > 0) { - $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); - $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount); - $this->graph->xaxis->SetTickLabels($datasetLabels); - } - - $seriesPlot = new StockPlot($dataValuesPlot); - $seriesPlot->SetWidth(20); - - $this->graph->Add($seriesPlot); - } - - private function renderAreaChart($groupCount, $dimensions = '2d'): void - { - $this->renderCartesianPlotArea(); - - for ($i = 0; $i < $groupCount; ++$i) { - $this->renderPlotLine($i, true, false, $dimensions); - } - } - - private function renderLineChart($groupCount, $dimensions = '2d'): void - { - $this->renderCartesianPlotArea(); - - for ($i = 0; $i < $groupCount; ++$i) { - $this->renderPlotLine($i, false, false, $dimensions); - } - } - - private function renderBarChart($groupCount, $dimensions = '2d'): void - { - $this->renderCartesianPlotArea(); - - for ($i = 0; $i < $groupCount; ++$i) { - $this->renderPlotBar($i, $dimensions); - } - } - - private function renderScatterChart($groupCount): void - { - $this->renderCartesianPlotArea('linlin'); - - for ($i = 0; $i < $groupCount; ++$i) { - $this->renderPlotScatter($i, false); - } - } - - private function renderBubbleChart($groupCount): void - { - $this->renderCartesianPlotArea('linlin'); - - for ($i = 0; $i < $groupCount; ++$i) { - $this->renderPlotScatter($i, true); - } - } - - private function renderPieChart($groupCount, $dimensions = '2d', $doughnut = false, $multiplePlots = false): void - { - $this->renderPiePlotArea(); - - $iLimit = ($multiplePlots) ? $groupCount : 1; - for ($groupID = 0; $groupID < $iLimit; ++$groupID) { - $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); - $exploded = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); - $datasetLabels = []; - if ($groupID == 0) { - $labelCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount(); - if ($labelCount > 0) { - $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); - $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount); - } - } - - $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); - $seriesPlots = []; - // For pie charts, we only display the first series: doughnut charts generally display all series - $jLimit = ($multiplePlots) ? $seriesCount : 1; - // Loop through each data series in turn - for ($j = 0; $j < $jLimit; ++$j) { - $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues(); - - // Fill in any missing values in the $dataValues array - $testCurrentIndex = 0; - foreach ($dataValues as $k => $dataValue) { - while ($k != $testCurrentIndex) { - $dataValues[$testCurrentIndex] = null; - ++$testCurrentIndex; - } - ++$testCurrentIndex; - } - - if ($dimensions == '3d') { - $seriesPlot = new PiePlot3D($dataValues); - } else { - if ($doughnut) { - $seriesPlot = new PiePlotC($dataValues); - } else { - $seriesPlot = new PiePlot($dataValues); - } - } - - if ($multiplePlots) { - $seriesPlot->SetSize(($jLimit - $j) / ($jLimit * 4)); - } - - if ($doughnut) { - $seriesPlot->SetMidColor('white'); - } - - $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]); - if (count($datasetLabels) > 0) { - $seriesPlot->SetLabels(array_fill(0, count($datasetLabels), '')); - } - if ($dimensions != '3d') { - $seriesPlot->SetGuideLines(false); - } - if ($j == 0) { - if ($exploded) { - $seriesPlot->ExplodeAll(); - } - $seriesPlot->SetLegends($datasetLabels); - } - - $this->graph->Add($seriesPlot); - } - } - } - - private function renderRadarChart($groupCount): void - { - $this->renderRadarPlotArea(); - - for ($groupID = 0; $groupID < $groupCount; ++$groupID) { - $this->renderPlotRadar($groupID); - } - } - - private function renderStockChart($groupCount): void - { - $this->renderCartesianPlotArea('intint'); - - for ($groupID = 0; $groupID < $groupCount; ++$groupID) { - $this->renderPlotStock($groupID); - } - } - - private function renderContourChart($groupCount, $dimensions): void - { - $this->renderCartesianPlotArea('intint'); - - for ($i = 0; $i < $groupCount; ++$i) { - $this->renderPlotContour($i); - } - } - - private function renderCombinationChart($groupCount, $dimensions, $outputDestination) - { - $this->renderCartesianPlotArea(); - - for ($i = 0; $i < $groupCount; ++$i) { - $dimensions = null; - $chartType = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); - switch ($chartType) { - case 'area3DChart': - $dimensions = '3d'; - // no break - case 'areaChart': - $this->renderPlotLine($i, true, true, $dimensions); - - break; - case 'bar3DChart': - $dimensions = '3d'; - // no break - case 'barChart': - $this->renderPlotBar($i, $dimensions); - - break; - case 'line3DChart': - $dimensions = '3d'; - // no break - case 'lineChart': - $this->renderPlotLine($i, false, true, $dimensions); - - break; - case 'scatterChart': - $this->renderPlotScatter($i, false); - - break; - case 'bubbleChart': - $this->renderPlotScatter($i, true); - - break; - default: - $this->graph = null; - - return false; - } - } - - $this->renderLegend(); - - $this->graph->Stroke($outputDestination); - - return true; - } - - public function render($outputDestination) - { - self::$plotColour = 0; - - $groupCount = $this->chart->getPlotArea()->getPlotGroupCount(); - - $dimensions = null; - if ($groupCount == 1) { - $chartType = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType(); - } else { - $chartTypes = []; - for ($i = 0; $i < $groupCount; ++$i) { - $chartTypes[] = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); - } - $chartTypes = array_unique($chartTypes); - if (count($chartTypes) == 1) { - $chartType = array_pop($chartTypes); - } elseif (count($chartTypes) == 0) { - echo 'Chart is not yet implemented
'; - - return false; - } else { - return $this->renderCombinationChart($groupCount, $dimensions, $outputDestination); - } - } - - switch ($chartType) { - case 'area3DChart': - $dimensions = '3d'; - // no break - case 'areaChart': - $this->renderAreaChart($groupCount, $dimensions); - - break; - case 'bar3DChart': - $dimensions = '3d'; - // no break - case 'barChart': - $this->renderBarChart($groupCount, $dimensions); - - break; - case 'line3DChart': - $dimensions = '3d'; - // no break - case 'lineChart': - $this->renderLineChart($groupCount, $dimensions); - - break; - case 'pie3DChart': - $dimensions = '3d'; - // no break - case 'pieChart': - $this->renderPieChart($groupCount, $dimensions, false, false); - - break; - case 'doughnut3DChart': - $dimensions = '3d'; - // no break - case 'doughnutChart': - $this->renderPieChart($groupCount, $dimensions, true, true); - - break; - case 'scatterChart': - $this->renderScatterChart($groupCount); - - break; - case 'bubbleChart': - $this->renderBubbleChart($groupCount); - - break; - case 'radarChart': - $this->renderRadarChart($groupCount); - - break; - case 'surface3DChart': - $dimensions = '3d'; - // no break - case 'surfaceChart': - $this->renderContourChart($groupCount, $dimensions); - - break; - case 'stockChart': - $this->renderStockChart($groupCount); - - break; - default: - echo $chartType . ' is not yet implemented
'; - - return false; - } - $this->renderLegend(); - - $this->graph->Stroke($outputDestination); - - return true; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/PHP Charting Libraries.txt b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/PHP Charting Libraries.txt deleted file mode 100644 index 4abab7a..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/PHP Charting Libraries.txt +++ /dev/null @@ -1,20 +0,0 @@ -ChartDirector - https://www.advsofteng.com/cdphp.html - -GraPHPite - http://graphpite.sourceforge.net/ - -JpGraph - http://www.aditus.nu/jpgraph/ - -LibChart - https://naku.dohcrew.com/libchart/pages/introduction/ - -pChart - http://pchart.sourceforge.net/ - -TeeChart - https://www.steema.com/ - -PHPGraphLib - http://www.ebrueggeman.com/phpgraphlib \ No newline at end of file diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Title.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Title.php deleted file mode 100644 index af9fa08..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Title.php +++ /dev/null @@ -1,65 +0,0 @@ -caption = $caption; - $this->layout = $layout; - } - - /** - * Get caption. - * - * @return string - */ - public function getCaption() - { - return $this->caption; - } - - /** - * Set caption. - * - * @param string $caption - * - * @return $this - */ - public function setCaption($caption) - { - $this->caption = $caption; - - return $this; - } - - /** - * Get Layout. - * - * @return Layout - */ - public function getLayout() - { - return $this->layout; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php deleted file mode 100644 index 48f34f4..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php +++ /dev/null @@ -1,498 +0,0 @@ -parent = $parent; - $this->cache = $cache; - $this->cachePrefix = $this->getUniqueID(); - } - - /** - * Return the parent worksheet for this cell collection. - * - * @return Worksheet - */ - public function getParent() - { - return $this->parent; - } - - /** - * Whether the collection holds a cell for the given coordinate. - * - * @param string $pCoord Coordinate of the cell to check - * - * @return bool - */ - public function has($pCoord) - { - if ($pCoord === $this->currentCoordinate) { - return true; - } - - // Check if the requested entry exists in the index - return isset($this->index[$pCoord]); - } - - /** - * Add or update a cell in the collection. - * - * @param Cell $cell Cell to update - * - * @return Cell - */ - public function update(Cell $cell) - { - return $this->add($cell->getCoordinate(), $cell); - } - - /** - * Delete a cell in cache identified by coordinate. - * - * @param string $pCoord Coordinate of the cell to delete - */ - public function delete($pCoord): void - { - if ($pCoord === $this->currentCoordinate && $this->currentCell !== null) { - $this->currentCell->detach(); - $this->currentCoordinate = null; - $this->currentCell = null; - $this->currentCellIsDirty = false; - } - - unset($this->index[$pCoord]); - - // Delete the entry from cache - $this->cache->delete($this->cachePrefix . $pCoord); - } - - /** - * Get a list of all cell coordinates currently held in the collection. - * - * @return string[] - */ - public function getCoordinates() - { - return array_keys($this->index); - } - - /** - * Get a sorted list of all cell coordinates currently held in the collection by row and column. - * - * @return string[] - */ - public function getSortedCoordinates() - { - $sortKeys = []; - foreach ($this->getCoordinates() as $coord) { - $column = ''; - $row = 0; - sscanf($coord, '%[A-Z]%d', $column, $row); - $sortKeys[sprintf('%09d%3s', $row, $column)] = $coord; - } - ksort($sortKeys); - - return array_values($sortKeys); - } - - /** - * Get highest worksheet column and highest row that have cell records. - * - * @return array Highest column name and highest row number - */ - public function getHighestRowAndColumn() - { - // Lookup highest column and highest row - $col = ['A' => '1A']; - $row = [1]; - foreach ($this->getCoordinates() as $coord) { - $c = ''; - $r = 0; - sscanf($coord, '%[A-Z]%d', $c, $r); - $row[$r] = $r; - $col[$c] = strlen($c) . $c; - } - - // Determine highest column and row - $highestRow = max($row); - $highestColumn = substr(max($col), 1); - - return [ - 'row' => $highestRow, - 'column' => $highestColumn, - ]; - } - - /** - * Return the cell coordinate of the currently active cell object. - * - * @return string - */ - public function getCurrentCoordinate() - { - return $this->currentCoordinate; - } - - /** - * Return the column coordinate of the currently active cell object. - * - * @return string - */ - public function getCurrentColumn() - { - $column = ''; - $row = 0; - - sscanf($this->currentCoordinate, '%[A-Z]%d', $column, $row); - - return $column; - } - - /** - * Return the row coordinate of the currently active cell object. - * - * @return int - */ - public function getCurrentRow() - { - $column = ''; - $row = 0; - - sscanf($this->currentCoordinate, '%[A-Z]%d', $column, $row); - - return (int) $row; - } - - /** - * Get highest worksheet column. - * - * @param string $row Return the highest column for the specified row, - * or the highest column of any row if no row number is passed - * - * @return string Highest column name - */ - public function getHighestColumn($row = null) - { - if ($row === null) { - $colRow = $this->getHighestRowAndColumn(); - - return $colRow['column']; - } - - $columnList = [1]; - foreach ($this->getCoordinates() as $coord) { - $c = ''; - $r = 0; - - sscanf($coord, '%[A-Z]%d', $c, $r); - if ($r != $row) { - continue; - } - $columnList[] = Coordinate::columnIndexFromString($c); - } - - return Coordinate::stringFromColumnIndex(max($columnList)); - } - - /** - * Get highest worksheet row. - * - * @param string $column Return the highest row for the specified column, - * or the highest row of any column if no column letter is passed - * - * @return int Highest row number - */ - public function getHighestRow($column = null) - { - if ($column === null) { - $colRow = $this->getHighestRowAndColumn(); - - return $colRow['row']; - } - - $rowList = [0]; - foreach ($this->getCoordinates() as $coord) { - $c = ''; - $r = 0; - - sscanf($coord, '%[A-Z]%d', $c, $r); - if ($c != $column) { - continue; - } - $rowList[] = $r; - } - - return max($rowList); - } - - /** - * Generate a unique ID for cache referencing. - * - * @return string Unique Reference - */ - private function getUniqueID() - { - return uniqid('phpspreadsheet.', true) . '.'; - } - - /** - * Clone the cell collection. - * - * @param Worksheet $parent The new worksheet that we're copying to - * - * @return self - */ - public function cloneCellCollection(Worksheet $parent) - { - $this->storeCurrentCell(); - $newCollection = clone $this; - - $newCollection->parent = $parent; - if (($newCollection->currentCell !== null) && (is_object($newCollection->currentCell))) { - $newCollection->currentCell->attach($this); - } - - // Get old values - $oldKeys = $newCollection->getAllCacheKeys(); - $oldValues = $newCollection->cache->getMultiple($oldKeys); - $newValues = []; - $oldCachePrefix = $newCollection->cachePrefix; - - // Change prefix - $newCollection->cachePrefix = $newCollection->getUniqueID(); - foreach ($oldValues as $oldKey => $value) { - $newValues[str_replace($oldCachePrefix, $newCollection->cachePrefix, $oldKey)] = clone $value; - } - - // Store new values - $stored = $newCollection->cache->setMultiple($newValues); - if (!$stored) { - $newCollection->__destruct(); - - throw new PhpSpreadsheetException('Failed to copy cells in cache'); - } - - return $newCollection; - } - - /** - * Remove a row, deleting all cells in that row. - * - * @param string $row Row number to remove - */ - public function removeRow($row): void - { - foreach ($this->getCoordinates() as $coord) { - $c = ''; - $r = 0; - - sscanf($coord, '%[A-Z]%d', $c, $r); - if ($r == $row) { - $this->delete($coord); - } - } - } - - /** - * Remove a column, deleting all cells in that column. - * - * @param string $column Column ID to remove - */ - public function removeColumn($column): void - { - foreach ($this->getCoordinates() as $coord) { - $c = ''; - $r = 0; - - sscanf($coord, '%[A-Z]%d', $c, $r); - if ($c == $column) { - $this->delete($coord); - } - } - } - - /** - * Store cell data in cache for the current cell object if it's "dirty", - * and the 'nullify' the current cell object. - */ - private function storeCurrentCell(): void - { - if ($this->currentCellIsDirty && !empty($this->currentCoordinate)) { - $this->currentCell->detach(); - - $stored = $this->cache->set($this->cachePrefix . $this->currentCoordinate, $this->currentCell); - if (!$stored) { - $this->__destruct(); - - throw new PhpSpreadsheetException("Failed to store cell {$this->currentCoordinate} in cache"); - } - $this->currentCellIsDirty = false; - } - - $this->currentCoordinate = null; - $this->currentCell = null; - } - - /** - * Add or update a cell identified by its coordinate into the collection. - * - * @param string $pCoord Coordinate of the cell to update - * @param Cell $cell Cell to update - * - * @return \PhpOffice\PhpSpreadsheet\Cell\Cell - */ - public function add($pCoord, Cell $cell) - { - if ($pCoord !== $this->currentCoordinate) { - $this->storeCurrentCell(); - } - $this->index[$pCoord] = true; - - $this->currentCoordinate = $pCoord; - $this->currentCell = $cell; - $this->currentCellIsDirty = true; - - return $cell; - } - - /** - * Get cell at a specific coordinate. - * - * @param string $pCoord Coordinate of the cell - * - * @return null|\PhpOffice\PhpSpreadsheet\Cell\Cell Cell that was found, or null if not found - */ - public function get($pCoord) - { - if ($pCoord === $this->currentCoordinate) { - return $this->currentCell; - } - $this->storeCurrentCell(); - - // Return null if requested entry doesn't exist in collection - if (!$this->has($pCoord)) { - return null; - } - - // Check if the entry that has been requested actually exists - $cell = $this->cache->get($this->cachePrefix . $pCoord); - if ($cell === null) { - throw new PhpSpreadsheetException("Cell entry {$pCoord} no longer exists in cache. This probably means that the cache was cleared by someone else."); - } - - // Set current entry to the requested entry - $this->currentCoordinate = $pCoord; - $this->currentCell = $cell; - // Re-attach this as the cell's parent - $this->currentCell->attach($this); - - // Return requested entry - return $this->currentCell; - } - - /** - * Clear the cell collection and disconnect from our parent. - */ - public function unsetWorksheetCells(): void - { - if ($this->currentCell !== null) { - $this->currentCell->detach(); - $this->currentCell = null; - $this->currentCoordinate = null; - } - - // Flush the cache - $this->__destruct(); - - $this->index = []; - - // detach ourself from the worksheet, so that it can then delete this object successfully - $this->parent = null; - } - - /** - * Destroy this cell collection. - */ - public function __destruct() - { - $this->cache->deleteMultiple($this->getAllCacheKeys()); - } - - /** - * Returns all known cache keys. - * - * @return Generator|string[] - */ - private function getAllCacheKeys() - { - foreach ($this->getCoordinates() as $coordinate) { - yield $this->cachePrefix . $coordinate; - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php deleted file mode 100644 index 7f34c23..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php +++ /dev/null @@ -1,21 +0,0 @@ -cache = []; - - return true; - } - - public function delete($key) - { - unset($this->cache[$key]); - - return true; - } - - public function deleteMultiple($keys) - { - foreach ($keys as $key) { - $this->delete($key); - } - - return true; - } - - public function get($key, $default = null) - { - if ($this->has($key)) { - return $this->cache[$key]; - } - - return $default; - } - - public function getMultiple($keys, $default = null) - { - $results = []; - foreach ($keys as $key) { - $results[$key] = $this->get($key, $default); - } - - return $results; - } - - public function has($key) - { - return array_key_exists($key, $this->cache); - } - - public function set($key, $value, $ttl = null) - { - $this->cache[$key] = $value; - - return true; - } - - public function setMultiple($values, $ttl = null) - { - foreach ($values as $key => $value) { - $this->set($key, $value); - } - - return true; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Comment.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Comment.php deleted file mode 100644 index 31f7664..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Comment.php +++ /dev/null @@ -1,329 +0,0 @@ -author = 'Author'; - $this->text = new RichText(); - $this->fillColor = new Style\Color('FFFFFFE1'); - $this->alignment = Style\Alignment::HORIZONTAL_GENERAL; - } - - /** - * Get Author. - * - * @return string - */ - public function getAuthor() - { - return $this->author; - } - - /** - * Set Author. - * - * @param string $author - * - * @return $this - */ - public function setAuthor($author) - { - $this->author = $author; - - return $this; - } - - /** - * Get Rich text comment. - * - * @return RichText - */ - public function getText() - { - return $this->text; - } - - /** - * Set Rich text comment. - * - * @return $this - */ - public function setText(RichText $pValue) - { - $this->text = $pValue; - - return $this; - } - - /** - * Get comment width (CSS style, i.e. XXpx or YYpt). - * - * @return string - */ - public function getWidth() - { - return $this->width; - } - - /** - * Set comment width (CSS style, i.e. XXpx or YYpt). - * - * @param string $width - * - * @return $this - */ - public function setWidth($width) - { - $this->width = $width; - - return $this; - } - - /** - * Get comment height (CSS style, i.e. XXpx or YYpt). - * - * @return string - */ - public function getHeight() - { - return $this->height; - } - - /** - * Set comment height (CSS style, i.e. XXpx or YYpt). - * - * @param string $value - * - * @return $this - */ - public function setHeight($value) - { - $this->height = $value; - - return $this; - } - - /** - * Get left margin (CSS style, i.e. XXpx or YYpt). - * - * @return string - */ - public function getMarginLeft() - { - return $this->marginLeft; - } - - /** - * Set left margin (CSS style, i.e. XXpx or YYpt). - * - * @param string $value - * - * @return $this - */ - public function setMarginLeft($value) - { - $this->marginLeft = $value; - - return $this; - } - - /** - * Get top margin (CSS style, i.e. XXpx or YYpt). - * - * @return string - */ - public function getMarginTop() - { - return $this->marginTop; - } - - /** - * Set top margin (CSS style, i.e. XXpx or YYpt). - * - * @param string $value - * - * @return $this - */ - public function setMarginTop($value) - { - $this->marginTop = $value; - - return $this; - } - - /** - * Is the comment visible by default? - * - * @return bool - */ - public function getVisible() - { - return $this->visible; - } - - /** - * Set comment default visibility. - * - * @param bool $value - * - * @return $this - */ - public function setVisible($value) - { - $this->visible = $value; - - return $this; - } - - /** - * Get fill color. - * - * @return Style\Color - */ - public function getFillColor() - { - return $this->fillColor; - } - - /** - * Set Alignment. - * - * @param string $alignment see Style\Alignment::HORIZONTAL_* - * - * @return $this - */ - public function setAlignment($alignment) - { - $this->alignment = $alignment; - - return $this; - } - - /** - * Get Alignment. - * - * @return string - */ - public function getAlignment() - { - return $this->alignment; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - return md5( - $this->author . - $this->text->getHashCode() . - $this->width . - $this->height . - $this->marginLeft . - $this->marginTop . - ($this->visible ? 1 : 0) . - $this->fillColor->getHashCode() . - $this->alignment . - __CLASS__ - ); - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } - - /** - * Convert to string. - * - * @return string - */ - public function __toString() - { - return $this->text->getPlainText(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DefinedName.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DefinedName.php deleted file mode 100644 index dbadd4c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DefinedName.php +++ /dev/null @@ -1,263 +0,0 @@ -worksheet). - * - * @var bool - */ - protected $localOnly; - - /** - * Scope. - * - * @var Worksheet - */ - protected $scope; - - /** - * Whether this is a named range or a named formula. - * - * @var bool - */ - protected $isFormula; - - /** - * Create a new Defined Name. - */ - public function __construct( - string $name, - ?Worksheet $worksheet = null, - ?string $value = null, - bool $localOnly = false, - ?Worksheet $scope = null - ) { - if ($worksheet === null) { - $worksheet = $scope; - } - - // Set local members - $this->name = $name; - $this->worksheet = $worksheet; - $this->value = (string) $value; - $this->localOnly = $localOnly; - // If local only, then the scope will be set to worksheet unless a scope is explicitly set - $this->scope = ($localOnly === true) ? (($scope === null) ? $worksheet : $scope) : null; - // If the range string contains characters that aren't associated with the range definition (A-Z,1-9 - // for cell references, and $, or the range operators (colon comma or space), quotes and ! for - // worksheet names - // then this is treated as a named formula, and not a named range - $this->isFormula = self::testIfFormula($this->value); - } - - /** - * Create a new defined name, either a range or a formula. - */ - public static function createInstance( - string $name, - ?Worksheet $worksheet = null, - ?string $value = null, - bool $localOnly = false, - ?Worksheet $scope = null - ): self { - $value = (string) $value; - $isFormula = self::testIfFormula($value); - if ($isFormula) { - return new NamedFormula($name, $worksheet, $value, $localOnly, $scope); - } - - return new NamedRange($name, $worksheet, $value, $localOnly, $scope); - } - - public static function testIfFormula(string $value): bool - { - if (substr($value, 0, 1) === '=') { - $value = substr($value, 1); - } - - if (is_numeric($value)) { - return true; - } - - $segMatcher = false; - foreach (explode("'", $value) as $subVal) { - // Only test in alternate array entries (the non-quoted blocks) - if ( - ($segMatcher = !$segMatcher) && - (preg_match('/' . self::REGEXP_IDENTIFY_FORMULA . '/miu', $subVal)) - ) { - return true; - } - } - - return false; - } - - /** - * Get name. - */ - public function getName(): string - { - return $this->name; - } - - /** - * Set name. - */ - public function setName(string $name): self - { - if (!empty($name)) { - // Old title - $oldTitle = $this->name; - - // Re-attach - if ($this->worksheet !== null) { - $this->worksheet->getParent()->removeNamedRange($this->name, $this->worksheet); - } - $this->name = $name; - - if ($this->worksheet !== null) { - $this->worksheet->getParent()->addNamedRange($this); - } - - // New title - $newTitle = $this->name; - ReferenceHelper::getInstance()->updateNamedFormulas($this->worksheet->getParent(), $oldTitle, $newTitle); - } - - return $this; - } - - /** - * Get worksheet. - */ - public function getWorksheet(): ?Worksheet - { - return $this->worksheet; - } - - /** - * Set worksheet. - */ - public function setWorksheet(?Worksheet $value): self - { - $this->worksheet = $value; - - return $this; - } - - /** - * Get range or formula value. - */ - public function getValue(): string - { - return $this->value; - } - - /** - * Set range or formula value. - */ - public function setValue(string $value): self - { - $this->value = $value; - - return $this; - } - - /** - * Get localOnly. - */ - public function getLocalOnly(): bool - { - return $this->localOnly; - } - - /** - * Set localOnly. - */ - public function setLocalOnly(bool $value): self - { - $this->localOnly = $value; - $this->scope = $value ? $this->worksheet : null; - - return $this; - } - - /** - * Get scope. - */ - public function getScope(): ?Worksheet - { - return $this->scope; - } - - /** - * Set scope. - */ - public function setScope(?Worksheet $value): self - { - $this->scope = $value; - $this->localOnly = $value !== null; - - return $this; - } - - /** - * Identify whether this is a named range or a named formula. - */ - public function isFormula(): bool - { - return $this->isFormula; - } - - /** - * Resolve a named range to a regular cell range or formula. - */ - public static function resolveName(string $pDefinedName, Worksheet $pSheet): ?self - { - return $pSheet->getParent()->getDefinedName($pDefinedName, $pSheet); - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Properties.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Properties.php deleted file mode 100644 index 0876a9e..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Properties.php +++ /dev/null @@ -1,632 +0,0 @@ -lastModifiedBy = $this->creator; - $this->created = time(); - $this->modified = time(); - } - - /** - * Get Creator. - * - * @return string - */ - public function getCreator() - { - return $this->creator; - } - - /** - * Set Creator. - * - * @param string $creator - * - * @return $this - */ - public function setCreator($creator) - { - $this->creator = $creator; - - return $this; - } - - /** - * Get Last Modified By. - * - * @return string - */ - public function getLastModifiedBy() - { - return $this->lastModifiedBy; - } - - /** - * Set Last Modified By. - * - * @param string $pValue - * - * @return $this - */ - public function setLastModifiedBy($pValue) - { - $this->lastModifiedBy = $pValue; - - return $this; - } - - /** - * Get Created. - * - * @return int - */ - public function getCreated() - { - return $this->created; - } - - /** - * Set Created. - * - * @param int|string $time - * - * @return $this - */ - public function setCreated($time) - { - if ($time === null) { - $time = time(); - } elseif (is_string($time)) { - if (is_numeric($time)) { - $time = (int) $time; - } else { - $time = strtotime($time); - } - } - - $this->created = $time; - - return $this; - } - - /** - * Get Modified. - * - * @return int - */ - public function getModified() - { - return $this->modified; - } - - /** - * Set Modified. - * - * @param int|string $time - * - * @return $this - */ - public function setModified($time) - { - if ($time === null) { - $time = time(); - } elseif (is_string($time)) { - if (is_numeric($time)) { - $time = (int) $time; - } else { - $time = strtotime($time); - } - } - - $this->modified = $time; - - return $this; - } - - /** - * Get Title. - * - * @return string - */ - public function getTitle() - { - return $this->title; - } - - /** - * Set Title. - * - * @param string $title - * - * @return $this - */ - public function setTitle($title) - { - $this->title = $title; - - return $this; - } - - /** - * Get Description. - * - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * Set Description. - * - * @param string $description - * - * @return $this - */ - public function setDescription($description) - { - $this->description = $description; - - return $this; - } - - /** - * Get Subject. - * - * @return string - */ - public function getSubject() - { - return $this->subject; - } - - /** - * Set Subject. - * - * @param string $subject - * - * @return $this - */ - public function setSubject($subject) - { - $this->subject = $subject; - - return $this; - } - - /** - * Get Keywords. - * - * @return string - */ - public function getKeywords() - { - return $this->keywords; - } - - /** - * Set Keywords. - * - * @param string $keywords - * - * @return $this - */ - public function setKeywords($keywords) - { - $this->keywords = $keywords; - - return $this; - } - - /** - * Get Category. - * - * @return string - */ - public function getCategory() - { - return $this->category; - } - - /** - * Set Category. - * - * @param string $category - * - * @return $this - */ - public function setCategory($category) - { - $this->category = $category; - - return $this; - } - - /** - * Get Company. - * - * @return string - */ - public function getCompany() - { - return $this->company; - } - - /** - * Set Company. - * - * @param string $company - * - * @return $this - */ - public function setCompany($company) - { - $this->company = $company; - - return $this; - } - - /** - * Get Manager. - * - * @return string - */ - public function getManager() - { - return $this->manager; - } - - /** - * Set Manager. - * - * @param string $manager - * - * @return $this - */ - public function setManager($manager) - { - $this->manager = $manager; - - return $this; - } - - /** - * Get a List of Custom Property Names. - * - * @return array of string - */ - public function getCustomProperties() - { - return array_keys($this->customProperties); - } - - /** - * Check if a Custom Property is defined. - * - * @param string $propertyName - * - * @return bool - */ - public function isCustomPropertySet($propertyName) - { - return isset($this->customProperties[$propertyName]); - } - - /** - * Get a Custom Property Value. - * - * @param string $propertyName - * - * @return mixed - */ - public function getCustomPropertyValue($propertyName) - { - if (isset($this->customProperties[$propertyName])) { - return $this->customProperties[$propertyName]['value']; - } - } - - /** - * Get a Custom Property Type. - * - * @param string $propertyName - * - * @return string - */ - public function getCustomPropertyType($propertyName) - { - if (isset($this->customProperties[$propertyName])) { - return $this->customProperties[$propertyName]['type']; - } - } - - /** - * Set a Custom Property. - * - * @param string $propertyName - * @param mixed $propertyValue - * @param string $propertyType - * 'i' : Integer - * 'f' : Floating Point - * 's' : String - * 'd' : Date/Time - * 'b' : Boolean - * - * @return $this - */ - public function setCustomProperty($propertyName, $propertyValue = '', $propertyType = null) - { - if ( - ($propertyType === null) || (!in_array($propertyType, [self::PROPERTY_TYPE_INTEGER, - self::PROPERTY_TYPE_FLOAT, - self::PROPERTY_TYPE_STRING, - self::PROPERTY_TYPE_DATE, - self::PROPERTY_TYPE_BOOLEAN, - ])) - ) { - if ($propertyValue === null) { - $propertyType = self::PROPERTY_TYPE_STRING; - } elseif (is_float($propertyValue)) { - $propertyType = self::PROPERTY_TYPE_FLOAT; - } elseif (is_int($propertyValue)) { - $propertyType = self::PROPERTY_TYPE_INTEGER; - } elseif (is_bool($propertyValue)) { - $propertyType = self::PROPERTY_TYPE_BOOLEAN; - } else { - $propertyType = self::PROPERTY_TYPE_STRING; - } - } - - $this->customProperties[$propertyName] = [ - 'value' => $propertyValue, - 'type' => $propertyType, - ]; - - return $this; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } - - public static function convertProperty($propertyValue, $propertyType) - { - switch ($propertyType) { - case 'empty': // Empty - return ''; - - break; - case 'null': // Null - return null; - - break; - case 'i1': // 1-Byte Signed Integer - case 'i2': // 2-Byte Signed Integer - case 'i4': // 4-Byte Signed Integer - case 'i8': // 8-Byte Signed Integer - case 'int': // Integer - return (int) $propertyValue; - - break; - case 'ui1': // 1-Byte Unsigned Integer - case 'ui2': // 2-Byte Unsigned Integer - case 'ui4': // 4-Byte Unsigned Integer - case 'ui8': // 8-Byte Unsigned Integer - case 'uint': // Unsigned Integer - return abs((int) $propertyValue); - - break; - case 'r4': // 4-Byte Real Number - case 'r8': // 8-Byte Real Number - case 'decimal': // Decimal - return (float) $propertyValue; - - break; - case 'lpstr': // LPSTR - case 'lpwstr': // LPWSTR - case 'bstr': // Basic String - return $propertyValue; - - break; - case 'date': // Date and Time - case 'filetime': // File Time - return strtotime($propertyValue); - - break; - case 'bool': // Boolean - return $propertyValue == 'true'; - - break; - case 'cy': // Currency - case 'error': // Error Status Code - case 'vector': // Vector - case 'array': // Array - case 'blob': // Binary Blob - case 'oblob': // Binary Blob Object - case 'stream': // Binary Stream - case 'ostream': // Binary Stream Object - case 'storage': // Binary Storage - case 'ostorage': // Binary Storage Object - case 'vstream': // Binary Versioned Stream - case 'clsid': // Class ID - case 'cf': // Clipboard Data - return $propertyValue; - - break; - } - - return $propertyValue; - } - - public static function convertPropertyType($propertyType) - { - switch ($propertyType) { - case 'i1': // 1-Byte Signed Integer - case 'i2': // 2-Byte Signed Integer - case 'i4': // 4-Byte Signed Integer - case 'i8': // 8-Byte Signed Integer - case 'int': // Integer - case 'ui1': // 1-Byte Unsigned Integer - case 'ui2': // 2-Byte Unsigned Integer - case 'ui4': // 4-Byte Unsigned Integer - case 'ui8': // 8-Byte Unsigned Integer - case 'uint': // Unsigned Integer - return self::PROPERTY_TYPE_INTEGER; - - break; - case 'r4': // 4-Byte Real Number - case 'r8': // 8-Byte Real Number - case 'decimal': // Decimal - return self::PROPERTY_TYPE_FLOAT; - - break; - case 'empty': // Empty - case 'null': // Null - case 'lpstr': // LPSTR - case 'lpwstr': // LPWSTR - case 'bstr': // Basic String - return self::PROPERTY_TYPE_STRING; - - break; - case 'date': // Date and Time - case 'filetime': // File Time - return self::PROPERTY_TYPE_DATE; - - break; - case 'bool': // Boolean - return self::PROPERTY_TYPE_BOOLEAN; - - break; - case 'cy': // Currency - case 'error': // Error Status Code - case 'vector': // Vector - case 'array': // Array - case 'blob': // Binary Blob - case 'oblob': // Binary Blob Object - case 'stream': // Binary Stream - case 'ostream': // Binary Stream Object - case 'storage': // Binary Storage - case 'ostorage': // Binary Storage Object - case 'vstream': // Binary Versioned Stream - case 'clsid': // Class ID - case 'cf': // Clipboard Data - return self::PROPERTY_TYPE_UNKNOWN; - - break; - } - - return self::PROPERTY_TYPE_UNKNOWN; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Security.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Security.php deleted file mode 100644 index cef3db8..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Security.php +++ /dev/null @@ -1,205 +0,0 @@ -lockRevision || - $this->lockStructure || - $this->lockWindows; - } - - /** - * Get LockRevision. - * - * @return bool - */ - public function getLockRevision() - { - return $this->lockRevision; - } - - /** - * Set LockRevision. - * - * @param bool $pValue - * - * @return $this - */ - public function setLockRevision($pValue) - { - $this->lockRevision = $pValue; - - return $this; - } - - /** - * Get LockStructure. - * - * @return bool - */ - public function getLockStructure() - { - return $this->lockStructure; - } - - /** - * Set LockStructure. - * - * @param bool $pValue - * - * @return $this - */ - public function setLockStructure($pValue) - { - $this->lockStructure = $pValue; - - return $this; - } - - /** - * Get LockWindows. - * - * @return bool - */ - public function getLockWindows() - { - return $this->lockWindows; - } - - /** - * Set LockWindows. - * - * @param bool $pValue - * - * @return $this - */ - public function setLockWindows($pValue) - { - $this->lockWindows = $pValue; - - return $this; - } - - /** - * Get RevisionsPassword (hashed). - * - * @return string - */ - public function getRevisionsPassword() - { - return $this->revisionsPassword; - } - - /** - * Set RevisionsPassword. - * - * @param string $pValue - * @param bool $pAlreadyHashed If the password has already been hashed, set this to true - * - * @return $this - */ - public function setRevisionsPassword($pValue, $pAlreadyHashed = false) - { - if (!$pAlreadyHashed) { - $pValue = PasswordHasher::hashPassword($pValue); - } - $this->revisionsPassword = $pValue; - - return $this; - } - - /** - * Get WorkbookPassword (hashed). - * - * @return string - */ - public function getWorkbookPassword() - { - return $this->workbookPassword; - } - - /** - * Set WorkbookPassword. - * - * @param string $pValue - * @param bool $pAlreadyHashed If the password has already been hashed, set this to true - * - * @return $this - */ - public function setWorkbookPassword($pValue, $pAlreadyHashed = false) - { - if (!$pAlreadyHashed) { - $pValue = PasswordHasher::hashPassword($pValue); - } - $this->workbookPassword = $pValue; - - return $this; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DocumentGenerator.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DocumentGenerator.php deleted file mode 100644 index 5e06af9..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DocumentGenerator.php +++ /dev/null @@ -1,97 +0,0 @@ - $category) { - $result .= "\n"; - $result .= "## {$categoryConstant}\n"; - $result .= "\n"; - $lengths = [20, 42]; - $result .= self::tableRow($lengths, ['Excel Function', 'PhpSpreadsheet Function']) . "\n"; - $result .= self::tableRow($lengths, null) . "\n"; - foreach ($phpSpreadsheetFunctions as $excelFunction => $functionInfo) { - if ($category === $functionInfo['category']) { - $phpFunction = self::getPhpSpreadsheetFunctionText($functionInfo['functionCall']); - $result .= self::tableRow($lengths, [$excelFunction, $phpFunction]) . "\n"; - } - } - } - - return $result; - } - - private static function getCategories(): array - { - return (new ReflectionClass(Category::class))->getConstants(); - } - - private static function tableRow(array $lengths, ?array $values = null): string - { - $result = ''; - foreach (array_map(null, $lengths, $values ?? []) as $i => [$length, $value]) { - $pad = $value === null ? '-' : ' '; - if ($i > 0) { - $result .= '|' . $pad; - } - $result .= str_pad($value ?? '', $length, $pad); - } - - return rtrim($result, ' '); - } - - private static function getPhpSpreadsheetFunctionText($functionCall): string - { - if (is_string($functionCall)) { - return $functionCall; - } - if ($functionCall === [Functions::class, 'DUMMY']) { - return '**Not yet Implemented**'; - } - if (is_array($functionCall)) { - return "\\{$functionCall[0]}::{$functionCall[1]}"; - } - - throw new UnexpectedValueException( - '$functionCall is of type ' . gettype($functionCall) . '. string or array expected' - ); - } - - /** - * @param array[] $phpSpreadsheetFunctions - */ - public static function generateFunctionListByName(array $phpSpreadsheetFunctions): string - { - $categoryConstants = array_flip(self::getCategories()); - $result = "# Function list by name\n"; - $lastAlphabet = null; - foreach ($phpSpreadsheetFunctions as $excelFunction => $functionInfo) { - $lengths = [20, 31, 42]; - if ($lastAlphabet !== $excelFunction[0]) { - $lastAlphabet = $excelFunction[0]; - $result .= "\n"; - $result .= "## {$lastAlphabet}\n"; - $result .= "\n"; - $result .= self::tableRow($lengths, ['Excel Function', 'Category', 'PhpSpreadsheet Function']) . "\n"; - $result .= self::tableRow($lengths, null) . "\n"; - } - $category = $categoryConstants[$functionInfo['category']]; - $phpFunction = self::getPhpSpreadsheetFunctionText($functionInfo['functionCall']); - $result .= self::tableRow($lengths, [$excelFunction, $category, $phpFunction]) . "\n"; - } - - return $result; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Exception.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Exception.php deleted file mode 100644 index 9c5ab30..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Exception.php +++ /dev/null @@ -1,7 +0,0 @@ -addFromSource($pSource); - } - } - - /** - * Add HashTable items from source. - * - * @param IComparable[] $pSource Source array to create HashTable from - */ - public function addFromSource(?array $pSource = null): void - { - // Check if an array was passed - if ($pSource == null) { - return; - } - - foreach ($pSource as $item) { - $this->add($item); - } - } - - /** - * Add HashTable item. - * - * @param IComparable $pSource Item to add - */ - public function add(IComparable $pSource): void - { - $hash = $pSource->getHashCode(); - if (!isset($this->items[$hash])) { - $this->items[$hash] = $pSource; - $this->keyMap[count($this->items) - 1] = $hash; - } - } - - /** - * Remove HashTable item. - * - * @param IComparable $pSource Item to remove - */ - public function remove(IComparable $pSource): void - { - $hash = $pSource->getHashCode(); - if (isset($this->items[$hash])) { - unset($this->items[$hash]); - - $deleteKey = -1; - foreach ($this->keyMap as $key => $value) { - if ($deleteKey >= 0) { - $this->keyMap[$key - 1] = $value; - } - - if ($value == $hash) { - $deleteKey = $key; - } - } - unset($this->keyMap[count($this->keyMap) - 1]); - } - } - - /** - * Clear HashTable. - */ - public function clear(): void - { - $this->items = []; - $this->keyMap = []; - } - - /** - * Count. - * - * @return int - */ - public function count() - { - return count($this->items); - } - - /** - * Get index for hash code. - * - * @param string $pHashCode - * - * @return int Index - */ - public function getIndexForHashCode($pHashCode) - { - return array_search($pHashCode, $this->keyMap); - } - - /** - * Get by index. - * - * @param int $pIndex - * - * @return IComparable - */ - public function getByIndex($pIndex) - { - if (isset($this->keyMap[$pIndex])) { - return $this->getByHashCode($this->keyMap[$pIndex]); - } - - return null; - } - - /** - * Get by hashcode. - * - * @param string $pHashCode - * - * @return IComparable - */ - public function getByHashCode($pHashCode) - { - if (isset($this->items[$pHashCode])) { - return $this->items[$pHashCode]; - } - - return null; - } - - /** - * HashTable to array. - * - * @return IComparable[] - */ - public function toArray() - { - return $this->items; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Html.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Html.php deleted file mode 100644 index 6c4cbf9..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Html.php +++ /dev/null @@ -1,839 +0,0 @@ - 'f0f8ff', - 'antiquewhite' => 'faebd7', - 'antiquewhite1' => 'ffefdb', - 'antiquewhite2' => 'eedfcc', - 'antiquewhite3' => 'cdc0b0', - 'antiquewhite4' => '8b8378', - 'aqua' => '00ffff', - 'aquamarine1' => '7fffd4', - 'aquamarine2' => '76eec6', - 'aquamarine4' => '458b74', - 'azure1' => 'f0ffff', - 'azure2' => 'e0eeee', - 'azure3' => 'c1cdcd', - 'azure4' => '838b8b', - 'beige' => 'f5f5dc', - 'bisque1' => 'ffe4c4', - 'bisque2' => 'eed5b7', - 'bisque3' => 'cdb79e', - 'bisque4' => '8b7d6b', - 'black' => '000000', - 'blanchedalmond' => 'ffebcd', - 'blue' => '0000ff', - 'blue1' => '0000ff', - 'blue2' => '0000ee', - 'blue4' => '00008b', - 'blueviolet' => '8a2be2', - 'brown' => 'a52a2a', - 'brown1' => 'ff4040', - 'brown2' => 'ee3b3b', - 'brown3' => 'cd3333', - 'brown4' => '8b2323', - 'burlywood' => 'deb887', - 'burlywood1' => 'ffd39b', - 'burlywood2' => 'eec591', - 'burlywood3' => 'cdaa7d', - 'burlywood4' => '8b7355', - 'cadetblue' => '5f9ea0', - 'cadetblue1' => '98f5ff', - 'cadetblue2' => '8ee5ee', - 'cadetblue3' => '7ac5cd', - 'cadetblue4' => '53868b', - 'chartreuse1' => '7fff00', - 'chartreuse2' => '76ee00', - 'chartreuse3' => '66cd00', - 'chartreuse4' => '458b00', - 'chocolate' => 'd2691e', - 'chocolate1' => 'ff7f24', - 'chocolate2' => 'ee7621', - 'chocolate3' => 'cd661d', - 'coral' => 'ff7f50', - 'coral1' => 'ff7256', - 'coral2' => 'ee6a50', - 'coral3' => 'cd5b45', - 'coral4' => '8b3e2f', - 'cornflowerblue' => '6495ed', - 'cornsilk1' => 'fff8dc', - 'cornsilk2' => 'eee8cd', - 'cornsilk3' => 'cdc8b1', - 'cornsilk4' => '8b8878', - 'cyan1' => '00ffff', - 'cyan2' => '00eeee', - 'cyan3' => '00cdcd', - 'cyan4' => '008b8b', - 'darkgoldenrod' => 'b8860b', - 'darkgoldenrod1' => 'ffb90f', - 'darkgoldenrod2' => 'eead0e', - 'darkgoldenrod3' => 'cd950c', - 'darkgoldenrod4' => '8b6508', - 'darkgreen' => '006400', - 'darkkhaki' => 'bdb76b', - 'darkolivegreen' => '556b2f', - 'darkolivegreen1' => 'caff70', - 'darkolivegreen2' => 'bcee68', - 'darkolivegreen3' => 'a2cd5a', - 'darkolivegreen4' => '6e8b3d', - 'darkorange' => 'ff8c00', - 'darkorange1' => 'ff7f00', - 'darkorange2' => 'ee7600', - 'darkorange3' => 'cd6600', - 'darkorange4' => '8b4500', - 'darkorchid' => '9932cc', - 'darkorchid1' => 'bf3eff', - 'darkorchid2' => 'b23aee', - 'darkorchid3' => '9a32cd', - 'darkorchid4' => '68228b', - 'darksalmon' => 'e9967a', - 'darkseagreen' => '8fbc8f', - 'darkseagreen1' => 'c1ffc1', - 'darkseagreen2' => 'b4eeb4', - 'darkseagreen3' => '9bcd9b', - 'darkseagreen4' => '698b69', - 'darkslateblue' => '483d8b', - 'darkslategray' => '2f4f4f', - 'darkslategray1' => '97ffff', - 'darkslategray2' => '8deeee', - 'darkslategray3' => '79cdcd', - 'darkslategray4' => '528b8b', - 'darkturquoise' => '00ced1', - 'darkviolet' => '9400d3', - 'deeppink1' => 'ff1493', - 'deeppink2' => 'ee1289', - 'deeppink3' => 'cd1076', - 'deeppink4' => '8b0a50', - 'deepskyblue1' => '00bfff', - 'deepskyblue2' => '00b2ee', - 'deepskyblue3' => '009acd', - 'deepskyblue4' => '00688b', - 'dimgray' => '696969', - 'dodgerblue1' => '1e90ff', - 'dodgerblue2' => '1c86ee', - 'dodgerblue3' => '1874cd', - 'dodgerblue4' => '104e8b', - 'firebrick' => 'b22222', - 'firebrick1' => 'ff3030', - 'firebrick2' => 'ee2c2c', - 'firebrick3' => 'cd2626', - 'firebrick4' => '8b1a1a', - 'floralwhite' => 'fffaf0', - 'forestgreen' => '228b22', - 'fuchsia' => 'ff00ff', - 'gainsboro' => 'dcdcdc', - 'ghostwhite' => 'f8f8ff', - 'gold1' => 'ffd700', - 'gold2' => 'eec900', - 'gold3' => 'cdad00', - 'gold4' => '8b7500', - 'goldenrod' => 'daa520', - 'goldenrod1' => 'ffc125', - 'goldenrod2' => 'eeb422', - 'goldenrod3' => 'cd9b1d', - 'goldenrod4' => '8b6914', - 'gray' => 'bebebe', - 'gray1' => '030303', - 'gray10' => '1a1a1a', - 'gray11' => '1c1c1c', - 'gray12' => '1f1f1f', - 'gray13' => '212121', - 'gray14' => '242424', - 'gray15' => '262626', - 'gray16' => '292929', - 'gray17' => '2b2b2b', - 'gray18' => '2e2e2e', - 'gray19' => '303030', - 'gray2' => '050505', - 'gray20' => '333333', - 'gray21' => '363636', - 'gray22' => '383838', - 'gray23' => '3b3b3b', - 'gray24' => '3d3d3d', - 'gray25' => '404040', - 'gray26' => '424242', - 'gray27' => '454545', - 'gray28' => '474747', - 'gray29' => '4a4a4a', - 'gray3' => '080808', - 'gray30' => '4d4d4d', - 'gray31' => '4f4f4f', - 'gray32' => '525252', - 'gray33' => '545454', - 'gray34' => '575757', - 'gray35' => '595959', - 'gray36' => '5c5c5c', - 'gray37' => '5e5e5e', - 'gray38' => '616161', - 'gray39' => '636363', - 'gray4' => '0a0a0a', - 'gray40' => '666666', - 'gray41' => '696969', - 'gray42' => '6b6b6b', - 'gray43' => '6e6e6e', - 'gray44' => '707070', - 'gray45' => '737373', - 'gray46' => '757575', - 'gray47' => '787878', - 'gray48' => '7a7a7a', - 'gray49' => '7d7d7d', - 'gray5' => '0d0d0d', - 'gray50' => '7f7f7f', - 'gray51' => '828282', - 'gray52' => '858585', - 'gray53' => '878787', - 'gray54' => '8a8a8a', - 'gray55' => '8c8c8c', - 'gray56' => '8f8f8f', - 'gray57' => '919191', - 'gray58' => '949494', - 'gray59' => '969696', - 'gray6' => '0f0f0f', - 'gray60' => '999999', - 'gray61' => '9c9c9c', - 'gray62' => '9e9e9e', - 'gray63' => 'a1a1a1', - 'gray64' => 'a3a3a3', - 'gray65' => 'a6a6a6', - 'gray66' => 'a8a8a8', - 'gray67' => 'ababab', - 'gray68' => 'adadad', - 'gray69' => 'b0b0b0', - 'gray7' => '121212', - 'gray70' => 'b3b3b3', - 'gray71' => 'b5b5b5', - 'gray72' => 'b8b8b8', - 'gray73' => 'bababa', - 'gray74' => 'bdbdbd', - 'gray75' => 'bfbfbf', - 'gray76' => 'c2c2c2', - 'gray77' => 'c4c4c4', - 'gray78' => 'c7c7c7', - 'gray79' => 'c9c9c9', - 'gray8' => '141414', - 'gray80' => 'cccccc', - 'gray81' => 'cfcfcf', - 'gray82' => 'd1d1d1', - 'gray83' => 'd4d4d4', - 'gray84' => 'd6d6d6', - 'gray85' => 'd9d9d9', - 'gray86' => 'dbdbdb', - 'gray87' => 'dedede', - 'gray88' => 'e0e0e0', - 'gray89' => 'e3e3e3', - 'gray9' => '171717', - 'gray90' => 'e5e5e5', - 'gray91' => 'e8e8e8', - 'gray92' => 'ebebeb', - 'gray93' => 'ededed', - 'gray94' => 'f0f0f0', - 'gray95' => 'f2f2f2', - 'gray97' => 'f7f7f7', - 'gray98' => 'fafafa', - 'gray99' => 'fcfcfc', - 'green' => '00ff00', - 'green1' => '00ff00', - 'green2' => '00ee00', - 'green3' => '00cd00', - 'green4' => '008b00', - 'greenyellow' => 'adff2f', - 'honeydew1' => 'f0fff0', - 'honeydew2' => 'e0eee0', - 'honeydew3' => 'c1cdc1', - 'honeydew4' => '838b83', - 'hotpink' => 'ff69b4', - 'hotpink1' => 'ff6eb4', - 'hotpink2' => 'ee6aa7', - 'hotpink3' => 'cd6090', - 'hotpink4' => '8b3a62', - 'indianred' => 'cd5c5c', - 'indianred1' => 'ff6a6a', - 'indianred2' => 'ee6363', - 'indianred3' => 'cd5555', - 'indianred4' => '8b3a3a', - 'ivory1' => 'fffff0', - 'ivory2' => 'eeeee0', - 'ivory3' => 'cdcdc1', - 'ivory4' => '8b8b83', - 'khaki' => 'f0e68c', - 'khaki1' => 'fff68f', - 'khaki2' => 'eee685', - 'khaki3' => 'cdc673', - 'khaki4' => '8b864e', - 'lavender' => 'e6e6fa', - 'lavenderblush1' => 'fff0f5', - 'lavenderblush2' => 'eee0e5', - 'lavenderblush3' => 'cdc1c5', - 'lavenderblush4' => '8b8386', - 'lawngreen' => '7cfc00', - 'lemonchiffon1' => 'fffacd', - 'lemonchiffon2' => 'eee9bf', - 'lemonchiffon3' => 'cdc9a5', - 'lemonchiffon4' => '8b8970', - 'light' => 'eedd82', - 'lightblue' => 'add8e6', - 'lightblue1' => 'bfefff', - 'lightblue2' => 'b2dfee', - 'lightblue3' => '9ac0cd', - 'lightblue4' => '68838b', - 'lightcoral' => 'f08080', - 'lightcyan1' => 'e0ffff', - 'lightcyan2' => 'd1eeee', - 'lightcyan3' => 'b4cdcd', - 'lightcyan4' => '7a8b8b', - 'lightgoldenrod1' => 'ffec8b', - 'lightgoldenrod2' => 'eedc82', - 'lightgoldenrod3' => 'cdbe70', - 'lightgoldenrod4' => '8b814c', - 'lightgoldenrodyellow' => 'fafad2', - 'lightgray' => 'd3d3d3', - 'lightpink' => 'ffb6c1', - 'lightpink1' => 'ffaeb9', - 'lightpink2' => 'eea2ad', - 'lightpink3' => 'cd8c95', - 'lightpink4' => '8b5f65', - 'lightsalmon1' => 'ffa07a', - 'lightsalmon2' => 'ee9572', - 'lightsalmon3' => 'cd8162', - 'lightsalmon4' => '8b5742', - 'lightseagreen' => '20b2aa', - 'lightskyblue' => '87cefa', - 'lightskyblue1' => 'b0e2ff', - 'lightskyblue2' => 'a4d3ee', - 'lightskyblue3' => '8db6cd', - 'lightskyblue4' => '607b8b', - 'lightslateblue' => '8470ff', - 'lightslategray' => '778899', - 'lightsteelblue' => 'b0c4de', - 'lightsteelblue1' => 'cae1ff', - 'lightsteelblue2' => 'bcd2ee', - 'lightsteelblue3' => 'a2b5cd', - 'lightsteelblue4' => '6e7b8b', - 'lightyellow1' => 'ffffe0', - 'lightyellow2' => 'eeeed1', - 'lightyellow3' => 'cdcdb4', - 'lightyellow4' => '8b8b7a', - 'lime' => '00ff00', - 'limegreen' => '32cd32', - 'linen' => 'faf0e6', - 'magenta' => 'ff00ff', - 'magenta2' => 'ee00ee', - 'magenta3' => 'cd00cd', - 'magenta4' => '8b008b', - 'maroon' => 'b03060', - 'maroon1' => 'ff34b3', - 'maroon2' => 'ee30a7', - 'maroon3' => 'cd2990', - 'maroon4' => '8b1c62', - 'medium' => '66cdaa', - 'mediumaquamarine' => '66cdaa', - 'mediumblue' => '0000cd', - 'mediumorchid' => 'ba55d3', - 'mediumorchid1' => 'e066ff', - 'mediumorchid2' => 'd15fee', - 'mediumorchid3' => 'b452cd', - 'mediumorchid4' => '7a378b', - 'mediumpurple' => '9370db', - 'mediumpurple1' => 'ab82ff', - 'mediumpurple2' => '9f79ee', - 'mediumpurple3' => '8968cd', - 'mediumpurple4' => '5d478b', - 'mediumseagreen' => '3cb371', - 'mediumslateblue' => '7b68ee', - 'mediumspringgreen' => '00fa9a', - 'mediumturquoise' => '48d1cc', - 'mediumvioletred' => 'c71585', - 'midnightblue' => '191970', - 'mintcream' => 'f5fffa', - 'mistyrose1' => 'ffe4e1', - 'mistyrose2' => 'eed5d2', - 'mistyrose3' => 'cdb7b5', - 'mistyrose4' => '8b7d7b', - 'moccasin' => 'ffe4b5', - 'navajowhite1' => 'ffdead', - 'navajowhite2' => 'eecfa1', - 'navajowhite3' => 'cdb38b', - 'navajowhite4' => '8b795e', - 'navy' => '000080', - 'navyblue' => '000080', - 'oldlace' => 'fdf5e6', - 'olive' => '808000', - 'olivedrab' => '6b8e23', - 'olivedrab1' => 'c0ff3e', - 'olivedrab2' => 'b3ee3a', - 'olivedrab4' => '698b22', - 'orange' => 'ffa500', - 'orange1' => 'ffa500', - 'orange2' => 'ee9a00', - 'orange3' => 'cd8500', - 'orange4' => '8b5a00', - 'orangered1' => 'ff4500', - 'orangered2' => 'ee4000', - 'orangered3' => 'cd3700', - 'orangered4' => '8b2500', - 'orchid' => 'da70d6', - 'orchid1' => 'ff83fa', - 'orchid2' => 'ee7ae9', - 'orchid3' => 'cd69c9', - 'orchid4' => '8b4789', - 'pale' => 'db7093', - 'palegoldenrod' => 'eee8aa', - 'palegreen' => '98fb98', - 'palegreen1' => '9aff9a', - 'palegreen2' => '90ee90', - 'palegreen3' => '7ccd7c', - 'palegreen4' => '548b54', - 'paleturquoise' => 'afeeee', - 'paleturquoise1' => 'bbffff', - 'paleturquoise2' => 'aeeeee', - 'paleturquoise3' => '96cdcd', - 'paleturquoise4' => '668b8b', - 'palevioletred' => 'db7093', - 'palevioletred1' => 'ff82ab', - 'palevioletred2' => 'ee799f', - 'palevioletred3' => 'cd6889', - 'palevioletred4' => '8b475d', - 'papayawhip' => 'ffefd5', - 'peachpuff1' => 'ffdab9', - 'peachpuff2' => 'eecbad', - 'peachpuff3' => 'cdaf95', - 'peachpuff4' => '8b7765', - 'pink' => 'ffc0cb', - 'pink1' => 'ffb5c5', - 'pink2' => 'eea9b8', - 'pink3' => 'cd919e', - 'pink4' => '8b636c', - 'plum' => 'dda0dd', - 'plum1' => 'ffbbff', - 'plum2' => 'eeaeee', - 'plum3' => 'cd96cd', - 'plum4' => '8b668b', - 'powderblue' => 'b0e0e6', - 'purple' => 'a020f0', - 'rebeccapurple' => '663399', - 'purple1' => '9b30ff', - 'purple2' => '912cee', - 'purple3' => '7d26cd', - 'purple4' => '551a8b', - 'red' => 'ff0000', - 'red1' => 'ff0000', - 'red2' => 'ee0000', - 'red3' => 'cd0000', - 'red4' => '8b0000', - 'rosybrown' => 'bc8f8f', - 'rosybrown1' => 'ffc1c1', - 'rosybrown2' => 'eeb4b4', - 'rosybrown3' => 'cd9b9b', - 'rosybrown4' => '8b6969', - 'royalblue' => '4169e1', - 'royalblue1' => '4876ff', - 'royalblue2' => '436eee', - 'royalblue3' => '3a5fcd', - 'royalblue4' => '27408b', - 'saddlebrown' => '8b4513', - 'salmon' => 'fa8072', - 'salmon1' => 'ff8c69', - 'salmon2' => 'ee8262', - 'salmon3' => 'cd7054', - 'salmon4' => '8b4c39', - 'sandybrown' => 'f4a460', - 'seagreen1' => '54ff9f', - 'seagreen2' => '4eee94', - 'seagreen3' => '43cd80', - 'seagreen4' => '2e8b57', - 'seashell1' => 'fff5ee', - 'seashell2' => 'eee5de', - 'seashell3' => 'cdc5bf', - 'seashell4' => '8b8682', - 'sienna' => 'a0522d', - 'sienna1' => 'ff8247', - 'sienna2' => 'ee7942', - 'sienna3' => 'cd6839', - 'sienna4' => '8b4726', - 'silver' => 'c0c0c0', - 'skyblue' => '87ceeb', - 'skyblue1' => '87ceff', - 'skyblue2' => '7ec0ee', - 'skyblue3' => '6ca6cd', - 'skyblue4' => '4a708b', - 'slateblue' => '6a5acd', - 'slateblue1' => '836fff', - 'slateblue2' => '7a67ee', - 'slateblue3' => '6959cd', - 'slateblue4' => '473c8b', - 'slategray' => '708090', - 'slategray1' => 'c6e2ff', - 'slategray2' => 'b9d3ee', - 'slategray3' => '9fb6cd', - 'slategray4' => '6c7b8b', - 'snow1' => 'fffafa', - 'snow2' => 'eee9e9', - 'snow3' => 'cdc9c9', - 'snow4' => '8b8989', - 'springgreen1' => '00ff7f', - 'springgreen2' => '00ee76', - 'springgreen3' => '00cd66', - 'springgreen4' => '008b45', - 'steelblue' => '4682b4', - 'steelblue1' => '63b8ff', - 'steelblue2' => '5cacee', - 'steelblue3' => '4f94cd', - 'steelblue4' => '36648b', - 'tan' => 'd2b48c', - 'tan1' => 'ffa54f', - 'tan2' => 'ee9a49', - 'tan3' => 'cd853f', - 'tan4' => '8b5a2b', - 'teal' => '008080', - 'thistle' => 'd8bfd8', - 'thistle1' => 'ffe1ff', - 'thistle2' => 'eed2ee', - 'thistle3' => 'cdb5cd', - 'thistle4' => '8b7b8b', - 'tomato1' => 'ff6347', - 'tomato2' => 'ee5c42', - 'tomato3' => 'cd4f39', - 'tomato4' => '8b3626', - 'turquoise' => '40e0d0', - 'turquoise1' => '00f5ff', - 'turquoise2' => '00e5ee', - 'turquoise3' => '00c5cd', - 'turquoise4' => '00868b', - 'violet' => 'ee82ee', - 'violetred' => 'd02090', - 'violetred1' => 'ff3e96', - 'violetred2' => 'ee3a8c', - 'violetred3' => 'cd3278', - 'violetred4' => '8b2252', - 'wheat' => 'f5deb3', - 'wheat1' => 'ffe7ba', - 'wheat2' => 'eed8ae', - 'wheat3' => 'cdba96', - 'wheat4' => '8b7e66', - 'white' => 'ffffff', - 'whitesmoke' => 'f5f5f5', - 'yellow' => 'ffff00', - 'yellow1' => 'ffff00', - 'yellow2' => 'eeee00', - 'yellow3' => 'cdcd00', - 'yellow4' => '8b8b00', - 'yellowgreen' => '9acd32', - ]; - - protected $face; - - protected $size; - - protected $color; - - protected $bold = false; - - protected $italic = false; - - protected $underline = false; - - protected $superscript = false; - - protected $subscript = false; - - protected $strikethrough = false; - - protected $startTagCallbacks = [ - 'font' => 'startFontTag', - 'b' => 'startBoldTag', - 'strong' => 'startBoldTag', - 'i' => 'startItalicTag', - 'em' => 'startItalicTag', - 'u' => 'startUnderlineTag', - 'ins' => 'startUnderlineTag', - 'del' => 'startStrikethruTag', - 'sup' => 'startSuperscriptTag', - 'sub' => 'startSubscriptTag', - ]; - - protected $endTagCallbacks = [ - 'font' => 'endFontTag', - 'b' => 'endBoldTag', - 'strong' => 'endBoldTag', - 'i' => 'endItalicTag', - 'em' => 'endItalicTag', - 'u' => 'endUnderlineTag', - 'ins' => 'endUnderlineTag', - 'del' => 'endStrikethruTag', - 'sup' => 'endSuperscriptTag', - 'sub' => 'endSubscriptTag', - 'br' => 'breakTag', - 'p' => 'breakTag', - 'h1' => 'breakTag', - 'h2' => 'breakTag', - 'h3' => 'breakTag', - 'h4' => 'breakTag', - 'h5' => 'breakTag', - 'h6' => 'breakTag', - ]; - - protected $stack = []; - - protected $stringData = ''; - - /** - * @var RichText - */ - protected $richTextObject; - - protected function initialise(): void - { - $this->face = $this->size = $this->color = null; - $this->bold = $this->italic = $this->underline = $this->superscript = $this->subscript = $this->strikethrough = false; - - $this->stack = []; - - $this->stringData = ''; - } - - /** - * Parse HTML formatting and return the resulting RichText. - * - * @param string $html - * - * @return RichText - */ - public function toRichTextObject($html) - { - $this->initialise(); - - // Create a new DOM object - $dom = new DOMDocument(); - // Load the HTML file into the DOM object - // Note the use of error suppression, because typically this will be an html fragment, so not fully valid markup - $prefix = ''; - @$dom->loadHTML($prefix . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); - // Discard excess white space - $dom->preserveWhiteSpace = false; - - $this->richTextObject = new RichText(); - $this->parseElements($dom); - - // Clean any further spurious whitespace - $this->cleanWhitespace(); - - return $this->richTextObject; - } - - protected function cleanWhitespace(): void - { - foreach ($this->richTextObject->getRichTextElements() as $key => $element) { - $text = $element->getText(); - // Trim any leading spaces on the first run - if ($key == 0) { - $text = ltrim($text); - } - // Trim any spaces immediately after a line break - $text = preg_replace('/\n */mu', "\n", $text); - $element->setText($text); - } - } - - protected function buildTextRun(): void - { - $text = $this->stringData; - if (trim($text) === '') { - return; - } - - $richtextRun = $this->richTextObject->createTextRun($this->stringData); - if ($this->face) { - $richtextRun->getFont()->setName($this->face); - } - if ($this->size) { - $richtextRun->getFont()->setSize($this->size); - } - if ($this->color) { - $richtextRun->getFont()->setColor(new Color('ff' . $this->color)); - } - if ($this->bold) { - $richtextRun->getFont()->setBold(true); - } - if ($this->italic) { - $richtextRun->getFont()->setItalic(true); - } - if ($this->underline) { - $richtextRun->getFont()->setUnderline(Font::UNDERLINE_SINGLE); - } - if ($this->superscript) { - $richtextRun->getFont()->setSuperscript(true); - } - if ($this->subscript) { - $richtextRun->getFont()->setSubscript(true); - } - if ($this->strikethrough) { - $richtextRun->getFont()->setStrikethrough(true); - } - $this->stringData = ''; - } - - protected function rgbToColour($rgb) - { - preg_match_all('/\d+/', $rgb, $values); - foreach ($values[0] as &$value) { - $value = str_pad(dechex($value), 2, '0', STR_PAD_LEFT); - } - - return implode('', $values[0]); - } - - public static function colourNameLookup(string $rgb): string - { - return self::$colourMap[$rgb] ?? ''; - } - - protected function startFontTag($tag): void - { - foreach ($tag->attributes as $attribute) { - $attributeName = strtolower($attribute->name); - $attributeValue = $attribute->value; - - if ($attributeName == 'color') { - if (preg_match('/rgb\s*\(/', $attributeValue)) { - $this->$attributeName = $this->rgbToColour($attributeValue); - } elseif (strpos(trim($attributeValue), '#') === 0) { - $this->$attributeName = ltrim($attributeValue, '#'); - } else { - $this->$attributeName = $this->colourNameLookup($attributeValue); - } - } else { - $this->$attributeName = $attributeValue; - } - } - } - - protected function endFontTag(): void - { - $this->face = $this->size = $this->color = null; - } - - protected function startBoldTag(): void - { - $this->bold = true; - } - - protected function endBoldTag(): void - { - $this->bold = false; - } - - protected function startItalicTag(): void - { - $this->italic = true; - } - - protected function endItalicTag(): void - { - $this->italic = false; - } - - protected function startUnderlineTag(): void - { - $this->underline = true; - } - - protected function endUnderlineTag(): void - { - $this->underline = false; - } - - protected function startSubscriptTag(): void - { - $this->subscript = true; - } - - protected function endSubscriptTag(): void - { - $this->subscript = false; - } - - protected function startSuperscriptTag(): void - { - $this->superscript = true; - } - - protected function endSuperscriptTag(): void - { - $this->superscript = false; - } - - protected function startStrikethruTag(): void - { - $this->strikethrough = true; - } - - protected function endStrikethruTag(): void - { - $this->strikethrough = false; - } - - protected function breakTag(): void - { - $this->stringData .= "\n"; - } - - protected function parseTextNode(DOMText $textNode): void - { - $domText = preg_replace( - '/\s+/u', - ' ', - str_replace(["\r", "\n"], ' ', $textNode->nodeValue) - ); - $this->stringData .= $domText; - $this->buildTextRun(); - } - - /** - * @param string $callbackTag - */ - protected function handleCallback(DOMElement $element, $callbackTag, array $callbacks): void - { - if (isset($callbacks[$callbackTag])) { - $elementHandler = $callbacks[$callbackTag]; - if (method_exists($this, $elementHandler)) { - call_user_func([$this, $elementHandler], $element); - } - } - } - - protected function parseElementNode(DOMElement $element): void - { - $callbackTag = strtolower($element->nodeName); - $this->stack[] = $callbackTag; - - $this->handleCallback($element, $callbackTag, $this->startTagCallbacks); - - $this->parseElements($element); - array_pop($this->stack); - - $this->handleCallback($element, $callbackTag, $this->endTagCallbacks); - } - - protected function parseElements(DOMNode $element): void - { - foreach ($element->childNodes as $child) { - if ($child instanceof DOMText) { - $this->parseTextNode($child); - } elseif ($child instanceof DOMElement) { - $this->parseElementNode($child); - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php deleted file mode 100644 index a91b195..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php +++ /dev/null @@ -1,229 +0,0 @@ -getScriptFilename() === 'index'; - } - - /** - * Return the page title. - * - * @return string - */ - public function getPageTitle() - { - return $this->isIndex() ? 'PHPSpreadsheet' : $this->getScriptFilename(); - } - - /** - * Return the page heading. - * - * @return string - */ - public function getPageHeading() - { - return $this->isIndex() ? '' : '

' . str_replace('_', ' ', $this->getScriptFilename()) . '

'; - } - - /** - * Returns an array of all known samples. - * - * @return string[] [$name => $path] - */ - public function getSamples() - { - // Populate samples - $baseDir = realpath(__DIR__ . '/../../../samples'); - $directory = new RecursiveDirectoryIterator($baseDir); - $iterator = new RecursiveIteratorIterator($directory); - $regex = new RegexIterator($iterator, '/^.+\.php$/', RecursiveRegexIterator::GET_MATCH); - - $files = []; - foreach ($regex as $file) { - $file = str_replace(str_replace('\\', '/', $baseDir) . '/', '', str_replace('\\', '/', $file[0])); - $info = pathinfo($file); - $category = str_replace('_', ' ', $info['dirname']); - $name = str_replace('_', ' ', preg_replace('/(|\.php)/', '', $info['filename'])); - if (!in_array($category, ['.', 'boostrap', 'templates'])) { - if (!isset($files[$category])) { - $files[$category] = []; - } - $files[$category][$name] = $file; - } - } - - // Sort everything - ksort($files); - foreach ($files as &$f) { - asort($f); - } - - return $files; - } - - /** - * Write documents. - * - * @param string $filename - * @param string[] $writers - */ - public function write(Spreadsheet $spreadsheet, $filename, array $writers = ['Xlsx', 'Xls']): void - { - // Set active sheet index to the first sheet, so Excel opens this as the first sheet - $spreadsheet->setActiveSheetIndex(0); - - // Write documents - foreach ($writers as $writerType) { - $path = $this->getFilename($filename, mb_strtolower($writerType)); - $writer = IOFactory::createWriter($spreadsheet, $writerType); - if ($writer instanceof Pdf) { - // PDF writer needs temporary directory - $tempDir = $this->getTemporaryFolder(); - $writer->setTempDir($tempDir); - } - $callStartTime = microtime(true); - $writer->save($path); - $this->logWrite($writer, $path, $callStartTime); - } - - $this->logEndingNotes(); - } - - /** - * Returns the temporary directory and make sure it exists. - * - * @return string - */ - private function getTemporaryFolder() - { - $tempFolder = sys_get_temp_dir() . '/phpspreadsheet'; - if (!is_dir($tempFolder)) { - if (!mkdir($tempFolder) && !is_dir($tempFolder)) { - throw new RuntimeException(sprintf('Directory "%s" was not created', $tempFolder)); - } - } - - return $tempFolder; - } - - /** - * Returns the filename that should be used for sample output. - * - * @param string $filename - * @param string $extension - * - * @return string - */ - public function getFilename($filename, $extension = 'xlsx') - { - $originalExtension = pathinfo($filename, PATHINFO_EXTENSION); - - return $this->getTemporaryFolder() . '/' . str_replace('.' . $originalExtension, '.' . $extension, basename($filename)); - } - - /** - * Return a random temporary file name. - * - * @param string $extension - * - * @return string - */ - public function getTemporaryFilename($extension = 'xlsx') - { - $temporaryFilename = tempnam($this->getTemporaryFolder(), 'phpspreadsheet-'); - unlink($temporaryFilename); - - return $temporaryFilename . '.' . $extension; - } - - public function log($message): void - { - $eol = $this->isCli() ? PHP_EOL : '
'; - echo date('H:i:s ') . $message . $eol; - } - - /** - * Log ending notes. - */ - public function logEndingNotes(): void - { - // Do not show execution time for index - $this->log('Peak memory usage: ' . (memory_get_peak_usage(true) / 1024 / 1024) . 'MB'); - } - - /** - * Log a line about the write operation. - * - * @param string $path - * @param float $callStartTime - */ - public function logWrite(IWriter $writer, $path, $callStartTime): void - { - $callEndTime = microtime(true); - $callTime = $callEndTime - $callStartTime; - $reflection = new ReflectionClass($writer); - $format = $reflection->getShortName(); - $message = "Write {$format} format to {$path} in " . sprintf('%.4f', $callTime) . ' seconds'; - - $this->log($message); - } - - /** - * Log a line about the read operation. - * - * @param string $format - * @param string $path - * @param float $callStartTime - */ - public function logRead($format, $path, $callStartTime): void - { - $callEndTime = microtime(true); - $callTime = $callEndTime - $callStartTime; - $message = "Read {$format} format from {$path} in " . sprintf('%.4f', $callTime) . ' seconds'; - - $this->log($message); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IComparable.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IComparable.php deleted file mode 100644 index c215847..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IComparable.php +++ /dev/null @@ -1,13 +0,0 @@ - Reader\Xlsx::class, - 'Xls' => Reader\Xls::class, - 'Xml' => Reader\Xml::class, - 'Ods' => Reader\Ods::class, - 'Slk' => Reader\Slk::class, - 'Gnumeric' => Reader\Gnumeric::class, - 'Html' => Reader\Html::class, - 'Csv' => Reader\Csv::class, - ]; - - private static $writers = [ - 'Xls' => Writer\Xls::class, - 'Xlsx' => Writer\Xlsx::class, - 'Ods' => Writer\Ods::class, - 'Csv' => Writer\Csv::class, - 'Html' => Writer\Html::class, - 'Tcpdf' => Writer\Pdf\Tcpdf::class, - 'Dompdf' => Writer\Pdf\Dompdf::class, - 'Mpdf' => Writer\Pdf\Mpdf::class, - ]; - - /** - * Create Writer\IWriter. - * - * @param string $writerType Example: Xlsx - * - * @return Writer\IWriter - */ - public static function createWriter(Spreadsheet $spreadsheet, $writerType) - { - if (!isset(self::$writers[$writerType])) { - throw new Writer\Exception("No writer found for type $writerType"); - } - - // Instantiate writer - $className = self::$writers[$writerType]; - - return new $className($spreadsheet); - } - - /** - * Create Reader\IReader. - * - * @param string $readerType Example: Xlsx - * - * @return Reader\IReader - */ - public static function createReader($readerType) - { - if (!isset(self::$readers[$readerType])) { - throw new Reader\Exception("No reader found for type $readerType"); - } - - // Instantiate reader - $className = self::$readers[$readerType]; - - return new $className(); - } - - /** - * Loads Spreadsheet from file using automatic Reader\IReader resolution. - * - * @param string $pFilename The name of the spreadsheet file - * - * @return Spreadsheet - */ - public static function load($pFilename) - { - $reader = self::createReaderForFile($pFilename); - - return $reader->load($pFilename); - } - - /** - * Identify file type using automatic Reader\IReader resolution. - * - * @param string $pFilename The name of the spreadsheet file to identify - * - * @return string - */ - public static function identify($pFilename) - { - $reader = self::createReaderForFile($pFilename); - $className = get_class($reader); - $classType = explode('\\', $className); - unset($reader); - - return array_pop($classType); - } - - /** - * Create Reader\IReader for file using automatic Reader\IReader resolution. - * - * @param string $filename The name of the spreadsheet file - * - * @return Reader\IReader - */ - public static function createReaderForFile($filename) - { - File::assertFile($filename); - - // First, lucky guess by inspecting file extension - $guessedReader = self::getReaderTypeFromExtension($filename); - if ($guessedReader !== null) { - $reader = self::createReader($guessedReader); - - // Let's see if we are lucky - if (isset($reader) && $reader->canRead($filename)) { - return $reader; - } - } - - // If we reach here then "lucky guess" didn't give any result - // Try walking through all the options in self::$autoResolveClasses - foreach (self::$readers as $type => $class) { - // Ignore our original guess, we know that won't work - if ($type !== $guessedReader) { - $reader = self::createReader($type); - if ($reader->canRead($filename)) { - return $reader; - } - } - } - - throw new Reader\Exception('Unable to identify a reader for this file'); - } - - /** - * Guess a reader type from the file extension, if any. - * - * @param string $filename - * - * @return null|string - */ - private static function getReaderTypeFromExtension($filename) - { - $pathinfo = pathinfo($filename); - if (!isset($pathinfo['extension'])) { - return null; - } - - switch (strtolower($pathinfo['extension'])) { - case 'xlsx': // Excel (OfficeOpenXML) Spreadsheet - case 'xlsm': // Excel (OfficeOpenXML) Macro Spreadsheet (macros will be discarded) - case 'xltx': // Excel (OfficeOpenXML) Template - case 'xltm': // Excel (OfficeOpenXML) Macro Template (macros will be discarded) - return 'Xlsx'; - case 'xls': // Excel (BIFF) Spreadsheet - case 'xlt': // Excel (BIFF) Template - return 'Xls'; - case 'ods': // Open/Libre Offic Calc - case 'ots': // Open/Libre Offic Calc Template - return 'Ods'; - case 'slk': - return 'Slk'; - case 'xml': // Excel 2003 SpreadSheetML - return 'Xml'; - case 'gnumeric': - return 'Gnumeric'; - case 'htm': - case 'html': - return 'Html'; - case 'csv': - // Do nothing - // We must not try to use CSV reader since it loads - // all files including Excel files etc. - return null; - default: - return null; - } - } - - /** - * Register a writer with its type and class name. - * - * @param string $writerType - * @param string $writerClass - */ - public static function registerWriter($writerType, $writerClass): void - { - if (!is_a($writerClass, Writer\IWriter::class, true)) { - throw new Writer\Exception('Registered writers must implement ' . Writer\IWriter::class); - } - - self::$writers[$writerType] = $writerClass; - } - - /** - * Register a reader with its type and class name. - * - * @param string $readerType - * @param string $readerClass - */ - public static function registerReader($readerType, $readerClass): void - { - if (!is_a($readerClass, Reader\IReader::class, true)) { - throw new Reader\Exception('Registered readers must implement ' . Reader\IReader::class); - } - - self::$readers[$readerType] = $readerClass; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedFormula.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedFormula.php deleted file mode 100644 index ffb1c9b..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedFormula.php +++ /dev/null @@ -1,45 +0,0 @@ -value; - } - - /** - * Set the formula value. - */ - public function setFormula(string $formula): self - { - if (!empty($formula)) { - $this->value = $formula; - } - - return $this; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedRange.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedRange.php deleted file mode 100644 index db9c5f1..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedRange.php +++ /dev/null @@ -1,55 +0,0 @@ -value; - } - - /** - * Set the range value. - */ - public function setRange(string $range): self - { - if (!empty($range)) { - $this->value = $range; - } - - return $this; - } - - public function getCellsInRange(): array - { - $range = $this->value; - if (substr($range, 0, 1) === '=') { - $range = substr($range, 1); - } - - return Coordinate::extractAllCellReferencesInRange($range); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/BaseReader.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/BaseReader.php deleted file mode 100644 index eb0e3ba..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/BaseReader.php +++ /dev/null @@ -1,161 +0,0 @@ -readFilter = new DefaultReadFilter(); - } - - public function getReadDataOnly() - { - return $this->readDataOnly; - } - - public function setReadDataOnly($pValue) - { - $this->readDataOnly = (bool) $pValue; - - return $this; - } - - public function getReadEmptyCells() - { - return $this->readEmptyCells; - } - - public function setReadEmptyCells($pValue) - { - $this->readEmptyCells = (bool) $pValue; - - return $this; - } - - public function getIncludeCharts() - { - return $this->includeCharts; - } - - public function setIncludeCharts($pValue) - { - $this->includeCharts = (bool) $pValue; - - return $this; - } - - public function getLoadSheetsOnly() - { - return $this->loadSheetsOnly; - } - - public function setLoadSheetsOnly($value) - { - if ($value === null) { - return $this->setLoadAllSheets(); - } - - $this->loadSheetsOnly = is_array($value) ? $value : [$value]; - - return $this; - } - - public function setLoadAllSheets() - { - $this->loadSheetsOnly = null; - - return $this; - } - - public function getReadFilter() - { - return $this->readFilter; - } - - public function setReadFilter(IReadFilter $pValue) - { - $this->readFilter = $pValue; - - return $this; - } - - public function getSecurityScanner() - { - return $this->securityScanner; - } - - /** - * Open file for reading. - * - * @param string $pFilename - */ - protected function openFile($pFilename): void - { - if ($pFilename) { - File::assertFile($pFilename); - - // Open file - $fileHandle = fopen($pFilename, 'rb'); - } else { - $fileHandle = false; - } - if ($fileHandle !== false) { - $this->fileHandle = $fileHandle; - } else { - throw new ReaderException('Could not open file ' . $pFilename . ' for reading.'); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php deleted file mode 100644 index d6eb16b..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php +++ /dev/null @@ -1,534 +0,0 @@ -inputEncoding = $pValue; - - return $this; - } - - /** - * Get input encoding. - * - * @return string - */ - public function getInputEncoding() - { - return $this->inputEncoding; - } - - /** - * Move filepointer past any BOM marker. - */ - protected function skipBOM(): void - { - rewind($this->fileHandle); - - switch ($this->inputEncoding) { - case 'UTF-8': - fgets($this->fileHandle, 4) == "\xEF\xBB\xBF" ? - fseek($this->fileHandle, 3) : fseek($this->fileHandle, 0); - - break; - } - } - - /** - * Identify any separator that is explicitly set in the file. - */ - protected function checkSeparator(): void - { - $line = fgets($this->fileHandle); - if ($line === false) { - return; - } - - if ((strlen(trim($line, "\r\n")) == 5) && (stripos($line, 'sep=') === 0)) { - $this->delimiter = substr($line, 4, 1); - - return; - } - - $this->skipBOM(); - } - - /** - * Infer the separator if it isn't explicitly set in the file or specified by the user. - */ - protected function inferSeparator(): void - { - if ($this->delimiter !== null) { - return; - } - - $potentialDelimiters = [',', ';', "\t", '|', ':', ' ', '~']; - $counts = []; - foreach ($potentialDelimiters as $delimiter) { - $counts[$delimiter] = []; - } - - // Count how many times each of the potential delimiters appears in each line - $numberLines = 0; - while (($line = $this->getNextLine()) !== false && (++$numberLines < 1000)) { - $countLine = []; - for ($i = strlen($line) - 1; $i >= 0; --$i) { - $char = $line[$i]; - if (isset($counts[$char])) { - if (!isset($countLine[$char])) { - $countLine[$char] = 0; - } - ++$countLine[$char]; - } - } - foreach ($potentialDelimiters as $delimiter) { - $counts[$delimiter][] = $countLine[$delimiter] - ?? 0; - } - } - - // If number of lines is 0, nothing to infer : fall back to the default - if ($numberLines === 0) { - $this->delimiter = reset($potentialDelimiters); - $this->skipBOM(); - - return; - } - - // Calculate the mean square deviations for each delimiter (ignoring delimiters that haven't been found consistently) - $meanSquareDeviations = []; - $middleIdx = floor(($numberLines - 1) / 2); - - foreach ($potentialDelimiters as $delimiter) { - $series = $counts[$delimiter]; - sort($series); - - $median = ($numberLines % 2) - ? $series[$middleIdx] - : ($series[$middleIdx] + $series[$middleIdx + 1]) / 2; - - if ($median === 0) { - continue; - } - - $meanSquareDeviations[$delimiter] = array_reduce( - $series, - function ($sum, $value) use ($median) { - return $sum + ($value - $median) ** 2; - } - ) / count($series); - } - - // ... and pick the delimiter with the smallest mean square deviation (in case of ties, the order in potentialDelimiters is respected) - $min = INF; - foreach ($potentialDelimiters as $delimiter) { - if (!isset($meanSquareDeviations[$delimiter])) { - continue; - } - - if ($meanSquareDeviations[$delimiter] < $min) { - $min = $meanSquareDeviations[$delimiter]; - $this->delimiter = $delimiter; - } - } - - // If no delimiter could be detected, fall back to the default - if ($this->delimiter === null) { - $this->delimiter = reset($potentialDelimiters); - } - - $this->skipBOM(); - } - - /** - * Get the next full line from the file. - * - * @return false|string - */ - private function getNextLine() - { - $line = ''; - $enclosure = '(?escapeCharacter, '/') . ')' . preg_quote($this->enclosure, '/'); - - do { - // Get the next line in the file - $newLine = fgets($this->fileHandle); - - // Return false if there is no next line - if ($newLine === false) { - return false; - } - - // Add the new line to the line passed in - $line = $line . $newLine; - - // Drop everything that is enclosed to avoid counting false positives in enclosures - $line = preg_replace('/(' . $enclosure . '.*' . $enclosure . ')/Us', '', $line); - - // See if we have any enclosures left in the line - // if we still have an enclosure then we need to read the next line as well - } while (preg_match('/(' . $enclosure . ')/', $line) > 0); - - return $line; - } - - /** - * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns). - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetInfo($pFilename) - { - // Open file - $this->openFileOrMemory($pFilename); - $fileHandle = $this->fileHandle; - - // Skip BOM, if any - $this->skipBOM(); - $this->checkSeparator(); - $this->inferSeparator(); - - $worksheetInfo = []; - $worksheetInfo[0]['worksheetName'] = 'Worksheet'; - $worksheetInfo[0]['lastColumnLetter'] = 'A'; - $worksheetInfo[0]['lastColumnIndex'] = 0; - $worksheetInfo[0]['totalRows'] = 0; - $worksheetInfo[0]['totalColumns'] = 0; - - // Loop through each line of the file in turn - while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure, $this->escapeCharacter)) !== false) { - ++$worksheetInfo[0]['totalRows']; - $worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], count($rowData) - 1); - } - - $worksheetInfo[0]['lastColumnLetter'] = Coordinate::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex'] + 1); - $worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1; - - // Close file - fclose($fileHandle); - - return $worksheetInfo; - } - - /** - * Loads Spreadsheet from file. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function load($pFilename) - { - // Create new Spreadsheet - $spreadsheet = new Spreadsheet(); - - // Load into this instance - return $this->loadIntoExisting($pFilename, $spreadsheet); - } - - private function openFileOrMemory($pFilename): void - { - // Open file - $fhandle = $this->canRead($pFilename); - if (!$fhandle) { - throw new Exception($pFilename . ' is an Invalid Spreadsheet file.'); - } - $this->openFile($pFilename); - if ($this->inputEncoding !== 'UTF-8') { - fclose($this->fileHandle); - $entireFile = file_get_contents($pFilename); - $this->fileHandle = fopen('php://memory', 'r+b'); - $data = StringHelper::convertEncoding($entireFile, 'UTF-8', $this->inputEncoding); - fwrite($this->fileHandle, $data); - rewind($this->fileHandle); - } - } - - /** - * Loads PhpSpreadsheet from file into PhpSpreadsheet instance. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function loadIntoExisting($pFilename, Spreadsheet $spreadsheet) - { - $lineEnding = ini_get('auto_detect_line_endings'); - ini_set('auto_detect_line_endings', true); - - // Open file - $this->openFileOrMemory($pFilename); - $fileHandle = $this->fileHandle; - - // Skip BOM, if any - $this->skipBOM(); - $this->checkSeparator(); - $this->inferSeparator(); - - // Create new PhpSpreadsheet object - while ($spreadsheet->getSheetCount() <= $this->sheetIndex) { - $spreadsheet->createSheet(); - } - $sheet = $spreadsheet->setActiveSheetIndex($this->sheetIndex); - - // Set our starting row based on whether we're in contiguous mode or not - $currentRow = 1; - $outRow = 0; - - // Loop through each line of the file in turn - while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure, $this->escapeCharacter)) !== false) { - $noOutputYet = true; - $columnLetter = 'A'; - foreach ($rowData as $rowDatum) { - if ($rowDatum != '' && $this->readFilter->readCell($columnLetter, $currentRow)) { - if ($this->contiguous) { - if ($noOutputYet) { - $noOutputYet = false; - ++$outRow; - } - } else { - $outRow = $currentRow; - } - // Set cell value - $sheet->getCell($columnLetter . $outRow)->setValue($rowDatum); - } - ++$columnLetter; - } - ++$currentRow; - } - - // Close file - fclose($fileHandle); - - ini_set('auto_detect_line_endings', $lineEnding); - - // Return - return $spreadsheet; - } - - /** - * Get delimiter. - * - * @return string - */ - public function getDelimiter() - { - return $this->delimiter; - } - - /** - * Set delimiter. - * - * @param string $delimiter Delimiter, eg: ',' - * - * @return $this - */ - public function setDelimiter($delimiter) - { - $this->delimiter = $delimiter; - - return $this; - } - - /** - * Get enclosure. - * - * @return string - */ - public function getEnclosure() - { - return $this->enclosure; - } - - /** - * Set enclosure. - * - * @param string $enclosure Enclosure, defaults to " - * - * @return $this - */ - public function setEnclosure($enclosure) - { - if ($enclosure == '') { - $enclosure = '"'; - } - $this->enclosure = $enclosure; - - return $this; - } - - /** - * Get sheet index. - * - * @return int - */ - public function getSheetIndex() - { - return $this->sheetIndex; - } - - /** - * Set sheet index. - * - * @param int $pValue Sheet index - * - * @return $this - */ - public function setSheetIndex($pValue) - { - $this->sheetIndex = $pValue; - - return $this; - } - - /** - * Set Contiguous. - * - * @param bool $contiguous - * - * @return $this - */ - public function setContiguous($contiguous) - { - $this->contiguous = (bool) $contiguous; - - return $this; - } - - /** - * Get Contiguous. - * - * @return bool - */ - public function getContiguous() - { - return $this->contiguous; - } - - /** - * Set escape backslashes. - * - * @param string $escapeCharacter - * - * @return $this - */ - public function setEscapeCharacter($escapeCharacter) - { - $this->escapeCharacter = $escapeCharacter; - - return $this; - } - - /** - * Get escape backslashes. - * - * @return string - */ - public function getEscapeCharacter() - { - return $this->escapeCharacter; - } - - /** - * Can the current IReader read the file? - * - * @param string $pFilename - * - * @return bool - */ - public function canRead($pFilename) - { - // Check if file exists - try { - $this->openFile($pFilename); - } catch (InvalidArgumentException $e) { - return false; - } - - fclose($this->fileHandle); - - // Trust file extension if any - $extension = strtolower(pathinfo($pFilename, PATHINFO_EXTENSION)); - if (in_array($extension, ['csv', 'tsv'])) { - return true; - } - - // Attempt to guess mimetype - $type = mime_content_type($pFilename); - $supportedTypes = [ - 'application/csv', - 'text/csv', - 'text/plain', - 'inode/x-empty', - ]; - - return in_array($type, $supportedTypes, true); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/DefaultReadFilter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/DefaultReadFilter.php deleted file mode 100644 index e104186..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/DefaultReadFilter.php +++ /dev/null @@ -1,20 +0,0 @@ -referenceHelper = ReferenceHelper::getInstance(); - $this->securityScanner = XmlScanner::getInstance($this); - } - - /** - * Can the current IReader read the file? - * - * @param string $pFilename - * - * @return bool - */ - public function canRead($pFilename) - { - File::assertFile($pFilename); - - // Check if gzlib functions are available - $data = ''; - if (function_exists('gzread')) { - // Read signature data (first 3 bytes) - $fh = fopen($pFilename, 'rb'); - $data = fread($fh, 2); - fclose($fh); - } - - return $data == chr(0x1F) . chr(0x8B); - } - - private static function matchXml(string $name, string $field): bool - { - return 1 === preg_match("/^(gnm|gmr):$field$/", $name); - } - - /** - * Reads names of the worksheets from a file, without parsing the whole file to a Spreadsheet object. - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetNames($pFilename) - { - File::assertFile($pFilename); - - $xml = new XMLReader(); - $xml->xml($this->securityScanner->scanFile('compress.zlib://' . realpath($pFilename)), null, Settings::getLibXmlLoaderOptions()); - $xml->setParserProperty(2, true); - - $worksheetNames = []; - while ($xml->read()) { - if (self::matchXml($xml->name, 'SheetName') && $xml->nodeType == XMLReader::ELEMENT) { - $xml->read(); // Move onto the value node - $worksheetNames[] = (string) $xml->value; - } elseif (self::matchXml($xml->name, 'Sheets')) { - // break out of the loop once we've got our sheet names rather than parse the entire file - break; - } - } - - return $worksheetNames; - } - - /** - * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns). - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetInfo($pFilename) - { - File::assertFile($pFilename); - - $xml = new XMLReader(); - $xml->xml($this->securityScanner->scanFile('compress.zlib://' . realpath($pFilename)), null, Settings::getLibXmlLoaderOptions()); - $xml->setParserProperty(2, true); - - $worksheetInfo = []; - while ($xml->read()) { - if (self::matchXml($xml->name, 'Sheet') && $xml->nodeType == XMLReader::ELEMENT) { - $tmpInfo = [ - 'worksheetName' => '', - 'lastColumnLetter' => 'A', - 'lastColumnIndex' => 0, - 'totalRows' => 0, - 'totalColumns' => 0, - ]; - - while ($xml->read()) { - if ($xml->nodeType == XMLReader::ELEMENT) { - if (self::matchXml($xml->name, 'Name')) { - $xml->read(); // Move onto the value node - $tmpInfo['worksheetName'] = (string) $xml->value; - } elseif (self::matchXml($xml->name, 'MaxCol')) { - $xml->read(); // Move onto the value node - $tmpInfo['lastColumnIndex'] = (int) $xml->value; - $tmpInfo['totalColumns'] = (int) $xml->value + 1; - } elseif (self::matchXml($xml->name, 'MaxRow')) { - $xml->read(); // Move onto the value node - $tmpInfo['totalRows'] = (int) $xml->value + 1; - - break; - } - } - } - $tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1); - $worksheetInfo[] = $tmpInfo; - } - } - - return $worksheetInfo; - } - - /** - * @param string $filename - * - * @return string - */ - private function gzfileGetContents($filename) - { - $file = @gzopen($filename, 'rb'); - $data = ''; - if ($file !== false) { - while (!gzeof($file)) { - $data .= gzread($file, 1024); - } - gzclose($file); - } - - return $data; - } - - private static $mappings = [ - 'borderStyle' => [ - '0' => Border::BORDER_NONE, - '1' => Border::BORDER_THIN, - '2' => Border::BORDER_MEDIUM, - '3' => Border::BORDER_SLANTDASHDOT, - '4' => Border::BORDER_DASHED, - '5' => Border::BORDER_THICK, - '6' => Border::BORDER_DOUBLE, - '7' => Border::BORDER_DOTTED, - '8' => Border::BORDER_MEDIUMDASHED, - '9' => Border::BORDER_DASHDOT, - '10' => Border::BORDER_MEDIUMDASHDOT, - '11' => Border::BORDER_DASHDOTDOT, - '12' => Border::BORDER_MEDIUMDASHDOTDOT, - '13' => Border::BORDER_MEDIUMDASHDOTDOT, - ], - 'dataType' => [ - '10' => DataType::TYPE_NULL, - '20' => DataType::TYPE_BOOL, - '30' => DataType::TYPE_NUMERIC, // Integer doesn't exist in Excel - '40' => DataType::TYPE_NUMERIC, // Float - '50' => DataType::TYPE_ERROR, - '60' => DataType::TYPE_STRING, - //'70': // Cell Range - //'80': // Array - ], - 'fillType' => [ - '1' => Fill::FILL_SOLID, - '2' => Fill::FILL_PATTERN_DARKGRAY, - '3' => Fill::FILL_PATTERN_MEDIUMGRAY, - '4' => Fill::FILL_PATTERN_LIGHTGRAY, - '5' => Fill::FILL_PATTERN_GRAY125, - '6' => Fill::FILL_PATTERN_GRAY0625, - '7' => Fill::FILL_PATTERN_DARKHORIZONTAL, // horizontal stripe - '8' => Fill::FILL_PATTERN_DARKVERTICAL, // vertical stripe - '9' => Fill::FILL_PATTERN_DARKDOWN, // diagonal stripe - '10' => Fill::FILL_PATTERN_DARKUP, // reverse diagonal stripe - '11' => Fill::FILL_PATTERN_DARKGRID, // diagoanl crosshatch - '12' => Fill::FILL_PATTERN_DARKTRELLIS, // thick diagonal crosshatch - '13' => Fill::FILL_PATTERN_LIGHTHORIZONTAL, - '14' => Fill::FILL_PATTERN_LIGHTVERTICAL, - '15' => Fill::FILL_PATTERN_LIGHTUP, - '16' => Fill::FILL_PATTERN_LIGHTDOWN, - '17' => Fill::FILL_PATTERN_LIGHTGRID, // thin horizontal crosshatch - '18' => Fill::FILL_PATTERN_LIGHTTRELLIS, // thin diagonal crosshatch - ], - 'horizontal' => [ - '1' => Alignment::HORIZONTAL_GENERAL, - '2' => Alignment::HORIZONTAL_LEFT, - '4' => Alignment::HORIZONTAL_RIGHT, - '8' => Alignment::HORIZONTAL_CENTER, - '16' => Alignment::HORIZONTAL_CENTER_CONTINUOUS, - '32' => Alignment::HORIZONTAL_JUSTIFY, - '64' => Alignment::HORIZONTAL_CENTER_CONTINUOUS, - ], - 'underline' => [ - '1' => Font::UNDERLINE_SINGLE, - '2' => Font::UNDERLINE_DOUBLE, - '3' => Font::UNDERLINE_SINGLEACCOUNTING, - '4' => Font::UNDERLINE_DOUBLEACCOUNTING, - ], - 'vertical' => [ - '1' => Alignment::VERTICAL_TOP, - '2' => Alignment::VERTICAL_BOTTOM, - '4' => Alignment::VERTICAL_CENTER, - '8' => Alignment::VERTICAL_JUSTIFY, - ], - ]; - - public static function gnumericMappings(): array - { - return self::$mappings; - } - - private function docPropertiesOld(SimpleXMLElement $gnmXML): void - { - $docProps = $this->spreadsheet->getProperties(); - foreach ($gnmXML->Summary->Item as $summaryItem) { - $propertyName = $summaryItem->name; - $propertyValue = $summaryItem->{'val-string'}; - switch ($propertyName) { - case 'title': - $docProps->setTitle(trim($propertyValue)); - - break; - case 'comments': - $docProps->setDescription(trim($propertyValue)); - - break; - case 'keywords': - $docProps->setKeywords(trim($propertyValue)); - - break; - case 'category': - $docProps->setCategory(trim($propertyValue)); - - break; - case 'manager': - $docProps->setManager(trim($propertyValue)); - - break; - case 'author': - $docProps->setCreator(trim($propertyValue)); - $docProps->setLastModifiedBy(trim($propertyValue)); - - break; - case 'company': - $docProps->setCompany(trim($propertyValue)); - - break; - } - } - } - - private function docPropertiesDC(SimpleXMLElement $officePropertyDC): void - { - $docProps = $this->spreadsheet->getProperties(); - foreach ($officePropertyDC as $propertyName => $propertyValue) { - $propertyValue = trim((string) $propertyValue); - switch ($propertyName) { - case 'title': - $docProps->setTitle($propertyValue); - - break; - case 'subject': - $docProps->setSubject($propertyValue); - - break; - case 'creator': - $docProps->setCreator($propertyValue); - $docProps->setLastModifiedBy($propertyValue); - - break; - case 'date': - $creationDate = strtotime($propertyValue); - $docProps->setCreated($creationDate); - $docProps->setModified($creationDate); - - break; - case 'description': - $docProps->setDescription($propertyValue); - - break; - } - } - } - - private function docPropertiesMeta(SimpleXMLElement $officePropertyMeta, array $namespacesMeta): void - { - $docProps = $this->spreadsheet->getProperties(); - foreach ($officePropertyMeta as $propertyName => $propertyValue) { - $attributes = $propertyValue->attributes($namespacesMeta['meta']); - $propertyValue = trim((string) $propertyValue); - switch ($propertyName) { - case 'keyword': - $docProps->setKeywords($propertyValue); - - break; - case 'initial-creator': - $docProps->setCreator($propertyValue); - $docProps->setLastModifiedBy($propertyValue); - - break; - case 'creation-date': - $creationDate = strtotime($propertyValue); - $docProps->setCreated($creationDate); - $docProps->setModified($creationDate); - - break; - case 'user-defined': - [, $attrName] = explode(':', $attributes['name']); - switch ($attrName) { - case 'publisher': - $docProps->setCompany($propertyValue); - - break; - case 'category': - $docProps->setCategory($propertyValue); - - break; - case 'manager': - $docProps->setManager($propertyValue); - - break; - } - - break; - } - } - } - - private function docProperties(SimpleXMLElement $xml, SimpleXMLElement $gnmXML, array $namespacesMeta): void - { - if (isset($namespacesMeta['office'])) { - $officeXML = $xml->children($namespacesMeta['office']); - $officeDocXML = $officeXML->{'document-meta'}; - $officeDocMetaXML = $officeDocXML->meta; - - foreach ($officeDocMetaXML as $officePropertyData) { - $officePropertyDC = []; - if (isset($namespacesMeta['dc'])) { - $officePropertyDC = $officePropertyData->children($namespacesMeta['dc']); - } - $this->docPropertiesDC($officePropertyDC); - - $officePropertyMeta = []; - if (isset($namespacesMeta['meta'])) { - $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']); - } - $this->docPropertiesMeta($officePropertyMeta, $namespacesMeta); - } - } elseif (isset($gnmXML->Summary)) { - $this->docPropertiesOld($gnmXML); - } - } - - private function processComments(SimpleXMLElement $sheet): void - { - if ((!$this->readDataOnly) && (isset($sheet->Objects))) { - foreach ($sheet->Objects->children($this->gnm, true) as $key => $comment) { - $commentAttributes = $comment->attributes(); - // Only comment objects are handled at the moment - if ($commentAttributes->Text) { - $this->spreadsheet->getActiveSheet()->getComment((string) $commentAttributes->ObjectBound)->setAuthor((string) $commentAttributes->Author)->setText($this->parseRichText((string) $commentAttributes->Text)); - } - } - } - } - - /** - * Loads Spreadsheet from file. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function load($pFilename) - { - // Create new Spreadsheet - $spreadsheet = new Spreadsheet(); - $spreadsheet->removeSheetByIndex(0); - - // Load into this instance - return $this->loadIntoExisting($pFilename, $spreadsheet); - } - - /** - * Loads from file into Spreadsheet instance. - */ - public function loadIntoExisting(string $pFilename, Spreadsheet $spreadsheet): Spreadsheet - { - $this->spreadsheet = $spreadsheet; - File::assertFile($pFilename); - - $gFileData = $this->gzfileGetContents($pFilename); - - $xml2 = simplexml_load_string($this->securityScanner->scan($gFileData), 'SimpleXMLElement', Settings::getLibXmlLoaderOptions()); - $xml = ($xml2 !== false) ? $xml2 : new SimpleXMLElement(''); - $namespacesMeta = $xml->getNamespaces(true); - $this->gnm = array_key_exists('gmr', $namespacesMeta) ? 'gmr' : 'gnm'; - - $gnmXML = $xml->children($namespacesMeta[$this->gnm]); - $this->docProperties($xml, $gnmXML, $namespacesMeta); - - $worksheetID = 0; - foreach ($gnmXML->Sheets->Sheet as $sheet) { - $worksheetName = (string) $sheet->Name; - if ((isset($this->loadSheetsOnly)) && (!in_array($worksheetName, $this->loadSheetsOnly))) { - continue; - } - - $maxRow = $maxCol = 0; - - // Create new Worksheet - $this->spreadsheet->createSheet(); - $this->spreadsheet->setActiveSheetIndex($worksheetID); - // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in formula - // cells... during the load, all formulae should be correct, and we're simply bringing the worksheet - // name in line with the formula, not the reverse - $this->spreadsheet->getActiveSheet()->setTitle($worksheetName, false, false); - - if (!$this->readDataOnly) { - (new PageSetup($this->spreadsheet, $this->gnm)) - ->printInformation($sheet) - ->sheetMargins($sheet); - } - - foreach ($sheet->Cells->Cell as $cell) { - $cellAttributes = $cell->attributes(); - $row = (int) $cellAttributes->Row + 1; - $column = (int) $cellAttributes->Col; - - if ($row > $maxRow) { - $maxRow = $row; - } - if ($column > $maxCol) { - $maxCol = $column; - } - - $column = Coordinate::stringFromColumnIndex($column + 1); - - // Read cell? - if ($this->getReadFilter() !== null) { - if (!$this->getReadFilter()->readCell($column, $row, $worksheetName)) { - continue; - } - } - - $ValueType = $cellAttributes->ValueType; - $ExprID = (string) $cellAttributes->ExprID; - $type = DataType::TYPE_FORMULA; - if ($ExprID > '') { - if (((string) $cell) > '') { - $this->expressions[$ExprID] = [ - 'column' => $cellAttributes->Col, - 'row' => $cellAttributes->Row, - 'formula' => (string) $cell, - ]; - } else { - $expression = $this->expressions[$ExprID]; - - $cell = $this->referenceHelper->updateFormulaReferences( - $expression['formula'], - 'A1', - $cellAttributes->Col - $expression['column'], - $cellAttributes->Row - $expression['row'], - $worksheetName - ); - } - $type = DataType::TYPE_FORMULA; - } else { - $vtype = (string) $ValueType; - if (array_key_exists($vtype, self::$mappings['dataType'])) { - $type = self::$mappings['dataType'][$vtype]; - } - if ($vtype == '20') { // Boolean - $cell = $cell == 'TRUE'; - } - } - $this->spreadsheet->getActiveSheet()->getCell($column . $row)->setValueExplicit((string) $cell, $type); - } - - $this->processComments($sheet); - - foreach ($sheet->Styles->StyleRegion as $styleRegion) { - $styleAttributes = $styleRegion->attributes(); - if ( - ($styleAttributes['startRow'] <= $maxRow) && - ($styleAttributes['startCol'] <= $maxCol) - ) { - $startColumn = Coordinate::stringFromColumnIndex((int) $styleAttributes['startCol'] + 1); - $startRow = $styleAttributes['startRow'] + 1; - - $endColumn = ($styleAttributes['endCol'] > $maxCol) ? $maxCol : (int) $styleAttributes['endCol']; - $endColumn = Coordinate::stringFromColumnIndex($endColumn + 1); - - $endRow = 1 + (($styleAttributes['endRow'] > $maxRow) ? $maxRow : (int) $styleAttributes['endRow']); - $cellRange = $startColumn . $startRow . ':' . $endColumn . $endRow; - - $styleAttributes = $styleRegion->Style->attributes(); - - $styleArray = []; - // We still set the number format mask for date/time values, even if readDataOnly is true - $formatCode = (string) $styleAttributes['Format']; - if (Date::isDateTimeFormatCode($formatCode)) { - $styleArray['numberFormat']['formatCode'] = $formatCode; - } - if (!$this->readDataOnly) { - // If readDataOnly is false, we set all formatting information - $styleArray['numberFormat']['formatCode'] = $formatCode; - - self::addStyle2($styleArray, 'alignment', 'horizontal', $styleAttributes['HAlign']); - self::addStyle2($styleArray, 'alignment', 'vertical', $styleAttributes['VAlign']); - $styleArray['alignment']['wrapText'] = $styleAttributes['WrapText'] == '1'; - $styleArray['alignment']['textRotation'] = $this->calcRotation($styleAttributes); - $styleArray['alignment']['shrinkToFit'] = $styleAttributes['ShrinkToFit'] == '1'; - $styleArray['alignment']['indent'] = ((int) ($styleAttributes['Indent']) > 0) ? $styleAttributes['indent'] : 0; - - $this->addColors($styleArray, $styleAttributes); - - $fontAttributes = $styleRegion->Style->Font->attributes(); - $styleArray['font']['name'] = (string) $styleRegion->Style->Font; - $styleArray['font']['size'] = (int) ($fontAttributes['Unit']); - $styleArray['font']['bold'] = $fontAttributes['Bold'] == '1'; - $styleArray['font']['italic'] = $fontAttributes['Italic'] == '1'; - $styleArray['font']['strikethrough'] = $fontAttributes['StrikeThrough'] == '1'; - self::addStyle2($styleArray, 'font', 'underline', $fontAttributes['Underline']); - - switch ($fontAttributes['Script']) { - case '1': - $styleArray['font']['superscript'] = true; - - break; - case '-1': - $styleArray['font']['subscript'] = true; - - break; - } - - if (isset($styleRegion->Style->StyleBorder)) { - $srssb = $styleRegion->Style->StyleBorder; - $this->addBorderStyle($srssb, $styleArray, 'top'); - $this->addBorderStyle($srssb, $styleArray, 'bottom'); - $this->addBorderStyle($srssb, $styleArray, 'left'); - $this->addBorderStyle($srssb, $styleArray, 'right'); - $this->addBorderDiagonal($srssb, $styleArray); - } - if (isset($styleRegion->Style->HyperLink)) { - // TO DO - $hyperlink = $styleRegion->Style->HyperLink->attributes(); - } - } - $this->spreadsheet->getActiveSheet()->getStyle($cellRange)->applyFromArray($styleArray); - } - } - - $this->processColumnWidths($sheet, $maxCol); - $this->processRowHeights($sheet, $maxRow); - $this->processMergedCells($sheet); - - ++$worksheetID; - } - - $this->processDefinedNames($gnmXML); - - // Return - return $this->spreadsheet; - } - - private function addBorderDiagonal(SimpleXMLElement $srssb, array &$styleArray): void - { - if (isset($srssb->Diagonal, $srssb->{'Rev-Diagonal'})) { - $styleArray['borders']['diagonal'] = self::parseBorderAttributes($srssb->Diagonal->attributes()); - $styleArray['borders']['diagonalDirection'] = Borders::DIAGONAL_BOTH; - } elseif (isset($srssb->Diagonal)) { - $styleArray['borders']['diagonal'] = self::parseBorderAttributes($srssb->Diagonal->attributes()); - $styleArray['borders']['diagonalDirection'] = Borders::DIAGONAL_UP; - } elseif (isset($srssb->{'Rev-Diagonal'})) { - $styleArray['borders']['diagonal'] = self::parseBorderAttributes($srssb->{'Rev-Diagonal'}->attributes()); - $styleArray['borders']['diagonalDirection'] = Borders::DIAGONAL_DOWN; - } - } - - private function addBorderStyle(SimpleXMLElement $srssb, array &$styleArray, string $direction): void - { - $ucDirection = ucfirst($direction); - if (isset($srssb->$ucDirection)) { - $styleArray['borders'][$direction] = self::parseBorderAttributes($srssb->$ucDirection->attributes()); - } - } - - private function processMergedCells(SimpleXMLElement $sheet): void - { - // Handle Merged Cells in this worksheet - if (isset($sheet->MergedRegions)) { - foreach ($sheet->MergedRegions->Merge as $mergeCells) { - if (strpos($mergeCells, ':') !== false) { - $this->spreadsheet->getActiveSheet()->mergeCells($mergeCells); - } - } - } - } - - private function processColumnLoop(int $c, int $maxCol, SimpleXMLElement $columnOverride, float $defaultWidth): int - { - $columnAttributes = $columnOverride->attributes(); - $column = $columnAttributes['No']; - $columnWidth = ((float) $columnAttributes['Unit']) / 5.4; - $hidden = (isset($columnAttributes['Hidden'])) && ((string) $columnAttributes['Hidden'] == '1'); - $columnCount = (isset($columnAttributes['Count'])) ? $columnAttributes['Count'] : 1; - while ($c < $column) { - $this->spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c + 1))->setWidth($defaultWidth); - ++$c; - } - while (($c < ($column + $columnCount)) && ($c <= $maxCol)) { - $this->spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c + 1))->setWidth($columnWidth); - if ($hidden) { - $this->spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c + 1))->setVisible(false); - } - ++$c; - } - - return $c; - } - - private function processColumnWidths(SimpleXMLElement $sheet, int $maxCol): void - { - if ((!$this->readDataOnly) && (isset($sheet->Cols))) { - // Column Widths - $columnAttributes = $sheet->Cols->attributes(); - $defaultWidth = $columnAttributes['DefaultSizePts'] / 5.4; - $c = 0; - foreach ($sheet->Cols->ColInfo as $columnOverride) { - $c = $this->processColumnLoop($c, $maxCol, $columnOverride, $defaultWidth); - } - while ($c <= $maxCol) { - $this->spreadsheet->getActiveSheet()->getColumnDimension(Coordinate::stringFromColumnIndex($c + 1))->setWidth($defaultWidth); - ++$c; - } - } - } - - private function processRowLoop(int $r, int $maxRow, SimpleXMLElement $rowOverride, float $defaultHeight): int - { - $rowAttributes = $rowOverride->attributes(); - $row = $rowAttributes['No']; - $rowHeight = (float) $rowAttributes['Unit']; - $hidden = (isset($rowAttributes['Hidden'])) && ((string) $rowAttributes['Hidden'] == '1'); - $rowCount = (isset($rowAttributes['Count'])) ? $rowAttributes['Count'] : 1; - while ($r < $row) { - ++$r; - $this->spreadsheet->getActiveSheet()->getRowDimension($r)->setRowHeight($defaultHeight); - } - while (($r < ($row + $rowCount)) && ($r < $maxRow)) { - ++$r; - $this->spreadsheet->getActiveSheet()->getRowDimension($r)->setRowHeight($rowHeight); - if ($hidden) { - $this->spreadsheet->getActiveSheet()->getRowDimension($r)->setVisible(false); - } - } - - return $r; - } - - private function processRowHeights(SimpleXMLElement $sheet, int $maxRow): void - { - if ((!$this->readDataOnly) && (isset($sheet->Rows))) { - // Row Heights - $rowAttributes = $sheet->Rows->attributes(); - $defaultHeight = (float) $rowAttributes['DefaultSizePts']; - $r = 0; - - foreach ($sheet->Rows->RowInfo as $rowOverride) { - $r = $this->processRowLoop($r, $maxRow, $rowOverride, $defaultHeight); - } - // never executed, I can't figure out any circumstances - // under which it would be executed, and, even if - // such exist, I'm not convinced this is needed. - //while ($r < $maxRow) { - // ++$r; - // $this->spreadsheet->getActiveSheet()->getRowDimension($r)->setRowHeight($defaultHeight); - //} - } - } - - private function processDefinedNames(SimpleXMLElement $gnmXML): void - { - // Loop through definedNames (global named ranges) - if (isset($gnmXML->Names)) { - foreach ($gnmXML->Names->Name as $definedName) { - $name = (string) $definedName->name; - $value = (string) $definedName->value; - if (stripos($value, '#REF!') !== false) { - continue; - } - - [$worksheetName] = Worksheet::extractSheetTitle($value, true); - $worksheetName = trim($worksheetName, "'"); - $worksheet = $this->spreadsheet->getSheetByName($worksheetName); - // Worksheet might still be null if we're only loading selected sheets rather than the full spreadsheet - if ($worksheet !== null) { - $this->spreadsheet->addDefinedName(DefinedName::createInstance($name, $worksheet, $value)); - } - } - } - } - - private function calcRotation(SimpleXMLElement $styleAttributes): int - { - $rotation = (int) $styleAttributes->Rotation; - if ($rotation >= 270 && $rotation <= 360) { - $rotation -= 360; - } - $rotation = (abs($rotation) > 90) ? 0 : $rotation; - - return $rotation; - } - - private static function addStyle(array &$styleArray, string $key, string $value): void - { - if (array_key_exists($value, self::$mappings[$key])) { - $styleArray[$key] = self::$mappings[$key][$value]; - } - } - - private static function addStyle2(array &$styleArray, string $key1, string $key, string $value): void - { - if (array_key_exists($value, self::$mappings[$key])) { - $styleArray[$key1][$key] = self::$mappings[$key][$value]; - } - } - - private static function parseBorderAttributes($borderAttributes) - { - $styleArray = []; - if (isset($borderAttributes['Color'])) { - $styleArray['color']['rgb'] = self::parseGnumericColour($borderAttributes['Color']); - } - - self::addStyle($styleArray, 'borderStyle', $borderAttributes['Style']); - - return $styleArray; - } - - private function parseRichText($is) - { - $value = new RichText(); - $value->createText($is); - - return $value; - } - - private static function parseGnumericColour($gnmColour) - { - [$gnmR, $gnmG, $gnmB] = explode(':', $gnmColour); - $gnmR = substr(str_pad($gnmR, 4, '0', STR_PAD_RIGHT), 0, 2); - $gnmG = substr(str_pad($gnmG, 4, '0', STR_PAD_RIGHT), 0, 2); - $gnmB = substr(str_pad($gnmB, 4, '0', STR_PAD_RIGHT), 0, 2); - - return $gnmR . $gnmG . $gnmB; - } - - private function addColors(array &$styleArray, SimpleXMLElement $styleAttributes): void - { - $RGB = self::parseGnumericColour($styleAttributes['Fore']); - $styleArray['font']['color']['rgb'] = $RGB; - $RGB = self::parseGnumericColour($styleAttributes['Back']); - $shade = (string) $styleAttributes['Shade']; - if (($RGB != '000000') || ($shade != '0')) { - $RGB2 = self::parseGnumericColour($styleAttributes['PatternColor']); - if ($shade == '1') { - $styleArray['fill']['startColor']['rgb'] = $RGB; - $styleArray['fill']['endColor']['rgb'] = $RGB2; - } else { - $styleArray['fill']['endColor']['rgb'] = $RGB; - $styleArray['fill']['startColor']['rgb'] = $RGB2; - } - self::addStyle2($styleArray, 'fill', 'fillType', $shade); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php deleted file mode 100644 index 0fe7300..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php +++ /dev/null @@ -1,143 +0,0 @@ -spreadsheet = $spreadsheet; - $this->gnm = $gnm; - } - - public function printInformation(SimpleXMLElement $sheet): self - { - if (isset($sheet->PrintInformation)) { - $printInformation = $sheet->PrintInformation[0]; - $scale = (string) $printInformation->Scale->attributes()['percentage']; - $pageOrder = (string) $printInformation->order; - $orientation = (string) $printInformation->orientation; - $horizontalCentered = (string) $printInformation->hcenter->attributes()['value']; - $verticalCentered = (string) $printInformation->vcenter->attributes()['value']; - - $this->spreadsheet->getActiveSheet()->getPageSetup() - ->setPageOrder($pageOrder === 'r_then_d' ? WorksheetPageSetup::PAGEORDER_OVER_THEN_DOWN : WorksheetPageSetup::PAGEORDER_DOWN_THEN_OVER) - ->setScale((int) $scale) - ->setOrientation($orientation ?? WorksheetPageSetup::ORIENTATION_DEFAULT) - ->setHorizontalCentered((bool) $horizontalCentered) - ->setVerticalCentered((bool) $verticalCentered); - } - - return $this; - } - - public function sheetMargins(SimpleXMLElement $sheet): self - { - if (isset($sheet->PrintInformation, $sheet->PrintInformation->Margins)) { - $marginSet = [ - // Default Settings - 'top' => 0.75, - 'header' => 0.3, - 'left' => 0.7, - 'right' => 0.7, - 'bottom' => 0.75, - 'footer' => 0.3, - ]; - - $marginSet = $this->buildMarginSet($sheet, $marginSet); - $this->adjustMargins($marginSet); - } - - return $this; - } - - private function buildMarginSet(SimpleXMLElement $sheet, array $marginSet): array - { - foreach ($sheet->PrintInformation->Margins->children($this->gnm, true) as $key => $margin) { - $marginAttributes = $margin->attributes(); - $marginSize = ($marginAttributes['Points']) ?? 72; // Default is 72pt - // Convert value in points to inches - $marginSize = PageMargins::fromPoints((float) $marginSize); - $marginSet[$key] = $marginSize; - } - - return $marginSet; - } - - private function adjustMargins(array $marginSet): void - { - foreach ($marginSet as $key => $marginSize) { - // Gnumeric is quirky in the way it displays the header/footer values: - // header is actually the sum of top and header; footer is actually the sum of bottom and footer - // then top is actually the header value, and bottom is actually the footer value - switch ($key) { - case 'left': - case 'right': - $this->sheetMargin($key, $marginSize); - - break; - case 'top': - $this->sheetMargin($key, $marginSet['header'] ?? 0); - - break; - case 'bottom': - $this->sheetMargin($key, $marginSet['footer'] ?? 0); - - break; - case 'header': - $this->sheetMargin($key, ($marginSet['top'] ?? 0) - $marginSize); - - break; - case 'footer': - $this->sheetMargin($key, ($marginSet['bottom'] ?? 0) - $marginSize); - - break; - } - } - } - - private function sheetMargin(string $key, float $marginSize): void - { - switch ($key) { - case 'top': - $this->spreadsheet->getActiveSheet()->getPageMargins()->setTop($marginSize); - - break; - case 'bottom': - $this->spreadsheet->getActiveSheet()->getPageMargins()->setBottom($marginSize); - - break; - case 'left': - $this->spreadsheet->getActiveSheet()->getPageMargins()->setLeft($marginSize); - - break; - case 'right': - $this->spreadsheet->getActiveSheet()->getPageMargins()->setRight($marginSize); - - break; - case 'header': - $this->spreadsheet->getActiveSheet()->getPageMargins()->setHeader($marginSize); - - break; - case 'footer': - $this->spreadsheet->getActiveSheet()->getPageMargins()->setFooter($marginSize); - - break; - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php deleted file mode 100644 index 73f4591..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php +++ /dev/null @@ -1,1026 +0,0 @@ - [ - 'font' => [ - 'bold' => true, - 'size' => 24, - ], - ], // Bold, 24pt - 'h2' => [ - 'font' => [ - 'bold' => true, - 'size' => 18, - ], - ], // Bold, 18pt - 'h3' => [ - 'font' => [ - 'bold' => true, - 'size' => 13.5, - ], - ], // Bold, 13.5pt - 'h4' => [ - 'font' => [ - 'bold' => true, - 'size' => 12, - ], - ], // Bold, 12pt - 'h5' => [ - 'font' => [ - 'bold' => true, - 'size' => 10, - ], - ], // Bold, 10pt - 'h6' => [ - 'font' => [ - 'bold' => true, - 'size' => 7.5, - ], - ], // Bold, 7.5pt - 'a' => [ - 'font' => [ - 'underline' => true, - 'color' => [ - 'argb' => Color::COLOR_BLUE, - ], - ], - ], // Blue underlined - 'hr' => [ - 'borders' => [ - 'bottom' => [ - 'borderStyle' => Border::BORDER_THIN, - 'color' => [ - Color::COLOR_BLACK, - ], - ], - ], - ], // Bottom border - 'strong' => [ - 'font' => [ - 'bold' => true, - ], - ], // Bold - 'b' => [ - 'font' => [ - 'bold' => true, - ], - ], // Bold - 'i' => [ - 'font' => [ - 'italic' => true, - ], - ], // Italic - 'em' => [ - 'font' => [ - 'italic' => true, - ], - ], // Italic - ]; - - protected $rowspan = []; - - /** - * Create a new HTML Reader instance. - */ - public function __construct() - { - parent::__construct(); - $this->securityScanner = XmlScanner::getInstance($this); - } - - /** - * Validate that the current file is an HTML file. - * - * @param string $pFilename - * - * @return bool - */ - public function canRead($pFilename) - { - // Check if file exists - try { - $this->openFile($pFilename); - } catch (Exception $e) { - return false; - } - - $beginning = $this->readBeginning(); - $startWithTag = self::startsWithTag($beginning); - $containsTags = self::containsTags($beginning); - $endsWithTag = self::endsWithTag($this->readEnding()); - - fclose($this->fileHandle); - - return $startWithTag && $containsTags && $endsWithTag; - } - - private function readBeginning() - { - fseek($this->fileHandle, 0); - - return fread($this->fileHandle, self::TEST_SAMPLE_SIZE); - } - - private function readEnding() - { - $meta = stream_get_meta_data($this->fileHandle); - $filename = $meta['uri']; - - $size = filesize($filename); - if ($size === 0) { - return ''; - } - - $blockSize = self::TEST_SAMPLE_SIZE; - if ($size < $blockSize) { - $blockSize = $size; - } - - fseek($this->fileHandle, $size - $blockSize); - - return fread($this->fileHandle, $blockSize); - } - - private static function startsWithTag($data) - { - return '<' === substr(trim($data), 0, 1); - } - - private static function endsWithTag($data) - { - return '>' === substr(trim($data), -1, 1); - } - - private static function containsTags($data) - { - return strlen($data) !== strlen(strip_tags($data)); - } - - /** - * Loads Spreadsheet from file. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function load($pFilename) - { - // Create new Spreadsheet - $spreadsheet = new Spreadsheet(); - - // Load into this instance - return $this->loadIntoExisting($pFilename, $spreadsheet); - } - - /** - * Set input encoding. - * - * @deprecated no use is made of this property - * - * @param string $pValue Input encoding, eg: 'ANSI' - * - * @return $this - * - * @codeCoverageIgnore - */ - public function setInputEncoding($pValue) - { - $this->inputEncoding = $pValue; - - return $this; - } - - /** - * Get input encoding. - * - * @deprecated no use is made of this property - * - * @return string - * - * @codeCoverageIgnore - */ - public function getInputEncoding() - { - return $this->inputEncoding; - } - - // Data Array used for testing only, should write to Spreadsheet object on completion of tests - protected $dataArray = []; - - protected $tableLevel = 0; - - protected $nestedColumn = ['A']; - - protected function setTableStartColumn($column) - { - if ($this->tableLevel == 0) { - $column = 'A'; - } - ++$this->tableLevel; - $this->nestedColumn[$this->tableLevel] = $column; - - return $this->nestedColumn[$this->tableLevel]; - } - - protected function getTableStartColumn() - { - return $this->nestedColumn[$this->tableLevel]; - } - - protected function releaseTableStartColumn() - { - --$this->tableLevel; - - return array_pop($this->nestedColumn); - } - - protected function flushCell(Worksheet $sheet, $column, $row, &$cellContent): void - { - if (is_string($cellContent)) { - // Simple String content - if (trim($cellContent) > '') { - // Only actually write it if there's content in the string - // Write to worksheet to be done here... - // ... we return the cell so we can mess about with styles more easily - $sheet->setCellValue($column . $row, $cellContent); - $this->dataArray[$row][$column] = $cellContent; - } - } else { - // We have a Rich Text run - // TODO - $this->dataArray[$row][$column] = 'RICH TEXT: ' . $cellContent; - } - $cellContent = (string) ''; - } - - private function processDomElementBody(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child): void - { - $attributeArray = []; - foreach ($child->attributes as $attribute) { - $attributeArray[$attribute->name] = $attribute->value; - } - - if ($child->nodeName === 'body') { - $row = 1; - $column = 'A'; - $cellContent = ''; - $this->tableLevel = 0; - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - } else { - $this->processDomElementTitle($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private function processDomElementTitle(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if ($child->nodeName === 'title') { - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - $sheet->setTitle($cellContent, true, false); - $cellContent = ''; - } else { - $this->processDomElementSpanEtc($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private static $spanEtc = ['span', 'div', 'font', 'i', 'em', 'strong', 'b']; - - private function processDomElementSpanEtc(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if (in_array($child->nodeName, self::$spanEtc)) { - if (isset($attributeArray['class']) && $attributeArray['class'] === 'comment') { - $sheet->getComment($column . $row) - ->getText() - ->createTextRun($child->textContent); - } - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - - if (isset($this->formats[$child->nodeName])) { - $sheet->getStyle($column . $row)->applyFromArray($this->formats[$child->nodeName]); - } - } else { - $this->processDomElementHr($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private function processDomElementHr(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if ($child->nodeName === 'hr') { - $this->flushCell($sheet, $column, $row, $cellContent); - ++$row; - if (isset($this->formats[$child->nodeName])) { - $sheet->getStyle($column . $row)->applyFromArray($this->formats[$child->nodeName]); - } - ++$row; - } - // fall through to br - $this->processDomElementBr($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - - private function processDomElementBr(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if ($child->nodeName === 'br' || $child->nodeName === 'hr') { - if ($this->tableLevel > 0) { - // If we're inside a table, replace with a \n and set the cell to wrap - $cellContent .= "\n"; - $sheet->getStyle($column . $row)->getAlignment()->setWrapText(true); - } else { - // Otherwise flush our existing content and move the row cursor on - $this->flushCell($sheet, $column, $row, $cellContent); - ++$row; - } - } else { - $this->processDomElementA($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private function processDomElementA(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if ($child->nodeName === 'a') { - foreach ($attributeArray as $attributeName => $attributeValue) { - switch ($attributeName) { - case 'href': - $sheet->getCell($column . $row)->getHyperlink()->setUrl($attributeValue); - if (isset($this->formats[$child->nodeName])) { - $sheet->getStyle($column . $row)->applyFromArray($this->formats[$child->nodeName]); - } - - break; - case 'class': - if ($attributeValue === 'comment-indicator') { - break; // Ignore - it's just a red square. - } - } - } - // no idea why this should be needed - //$cellContent .= ' '; - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - } else { - $this->processDomElementH1Etc($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private static $h1Etc = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'ul', 'p']; - - private function processDomElementH1Etc(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if (in_array($child->nodeName, self::$h1Etc)) { - if ($this->tableLevel > 0) { - // If we're inside a table, replace with a \n - $cellContent .= $cellContent ? "\n" : ''; - $sheet->getStyle($column . $row)->getAlignment()->setWrapText(true); - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - } else { - if ($cellContent > '') { - $this->flushCell($sheet, $column, $row, $cellContent); - ++$row; - } - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - $this->flushCell($sheet, $column, $row, $cellContent); - - if (isset($this->formats[$child->nodeName])) { - $sheet->getStyle($column . $row)->applyFromArray($this->formats[$child->nodeName]); - } - - ++$row; - $column = 'A'; - } - } else { - $this->processDomElementLi($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private function processDomElementLi(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if ($child->nodeName === 'li') { - if ($this->tableLevel > 0) { - // If we're inside a table, replace with a \n - $cellContent .= $cellContent ? "\n" : ''; - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - } else { - if ($cellContent > '') { - $this->flushCell($sheet, $column, $row, $cellContent); - } - ++$row; - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - $this->flushCell($sheet, $column, $row, $cellContent); - $column = 'A'; - } - } else { - $this->processDomElementImg($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private function processDomElementImg(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if ($child->nodeName === 'img') { - $this->insertImage($sheet, $column, $row, $attributeArray); - } else { - $this->processDomElementTable($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private function processDomElementTable(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if ($child->nodeName === 'table') { - $this->flushCell($sheet, $column, $row, $cellContent); - $column = $this->setTableStartColumn($column); - if ($this->tableLevel > 1) { - --$row; - } - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - $column = $this->releaseTableStartColumn(); - if ($this->tableLevel > 1) { - ++$column; - } else { - ++$row; - } - } else { - $this->processDomElementTr($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private function processDomElementTr(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if ($child->nodeName === 'tr') { - $column = $this->getTableStartColumn(); - $cellContent = ''; - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - - if (isset($attributeArray['height'])) { - $sheet->getRowDimension($row)->setRowHeight($attributeArray['height']); - } - - ++$row; - } else { - $this->processDomElementThTdOther($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private function processDomElementThTdOther(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - if ($child->nodeName !== 'td' && $child->nodeName !== 'th') { - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - } else { - $this->processDomElementThTd($sheet, $row, $column, $cellContent, $child, $attributeArray); - } - } - - private function processDomElementBgcolor(Worksheet $sheet, int $row, string $column, array $attributeArray): void - { - if (isset($attributeArray['bgcolor'])) { - $sheet->getStyle("$column$row")->applyFromArray( - [ - 'fill' => [ - 'fillType' => Fill::FILL_SOLID, - 'color' => ['rgb' => $this->getStyleColor($attributeArray['bgcolor'])], - ], - ] - ); - } - } - - private function processDomElementWidth(Worksheet $sheet, string $column, array $attributeArray): void - { - if (isset($attributeArray['width'])) { - $sheet->getColumnDimension($column)->setWidth($attributeArray['width']); - } - } - - private function processDomElementHeight(Worksheet $sheet, int $row, array $attributeArray): void - { - if (isset($attributeArray['height'])) { - $sheet->getRowDimension($row)->setRowHeight($attributeArray['height']); - } - } - - private function processDomElementAlign(Worksheet $sheet, int $row, string $column, array $attributeArray): void - { - if (isset($attributeArray['align'])) { - $sheet->getStyle($column . $row)->getAlignment()->setHorizontal($attributeArray['align']); - } - } - - private function processDomElementVAlign(Worksheet $sheet, int $row, string $column, array $attributeArray): void - { - if (isset($attributeArray['valign'])) { - $sheet->getStyle($column . $row)->getAlignment()->setVertical($attributeArray['valign']); - } - } - - private function processDomElementDataFormat(Worksheet $sheet, int $row, string $column, array $attributeArray): void - { - if (isset($attributeArray['data-format'])) { - $sheet->getStyle($column . $row)->getNumberFormat()->setFormatCode($attributeArray['data-format']); - } - } - - private function processDomElementThTd(Worksheet $sheet, int &$row, string &$column, string &$cellContent, DOMElement $child, array &$attributeArray): void - { - while (isset($this->rowspan[$column . $row])) { - ++$column; - } - $this->processDomElement($child, $sheet, $row, $column, $cellContent); - - // apply inline style - $this->applyInlineStyle($sheet, $row, $column, $attributeArray); - - $this->flushCell($sheet, $column, $row, $cellContent); - - $this->processDomElementBgcolor($sheet, $row, $column, $attributeArray); - $this->processDomElementWidth($sheet, $column, $attributeArray); - $this->processDomElementHeight($sheet, $row, $attributeArray); - $this->processDomElementAlign($sheet, $row, $column, $attributeArray); - $this->processDomElementVAlign($sheet, $row, $column, $attributeArray); - $this->processDomElementDataFormat($sheet, $row, $column, $attributeArray); - - if (isset($attributeArray['rowspan'], $attributeArray['colspan'])) { - //create merging rowspan and colspan - $columnTo = $column; - for ($i = 0; $i < (int) $attributeArray['colspan'] - 1; ++$i) { - ++$columnTo; - } - $range = $column . $row . ':' . $columnTo . ($row + (int) $attributeArray['rowspan'] - 1); - foreach (Coordinate::extractAllCellReferencesInRange($range) as $value) { - $this->rowspan[$value] = true; - } - $sheet->mergeCells($range); - $column = $columnTo; - } elseif (isset($attributeArray['rowspan'])) { - //create merging rowspan - $range = $column . $row . ':' . $column . ($row + (int) $attributeArray['rowspan'] - 1); - foreach (Coordinate::extractAllCellReferencesInRange($range) as $value) { - $this->rowspan[$value] = true; - } - $sheet->mergeCells($range); - } elseif (isset($attributeArray['colspan'])) { - //create merging colspan - $columnTo = $column; - for ($i = 0; $i < (int) $attributeArray['colspan'] - 1; ++$i) { - ++$columnTo; - } - $sheet->mergeCells($column . $row . ':' . $columnTo . $row); - $column = $columnTo; - } - - ++$column; - } - - protected function processDomElement(DOMNode $element, Worksheet $sheet, int &$row, string &$column, string &$cellContent): void - { - foreach ($element->childNodes as $child) { - if ($child instanceof DOMText) { - $domText = preg_replace('/\s+/u', ' ', trim($child->nodeValue)); - if (is_string($cellContent)) { - // simply append the text if the cell content is a plain text string - $cellContent .= $domText; - } - // but if we have a rich text run instead, we need to append it correctly - // TODO - } elseif ($child instanceof DOMElement) { - $this->processDomElementBody($sheet, $row, $column, $cellContent, $child); - } - } - } - - /** - * Loads PhpSpreadsheet from file into PhpSpreadsheet instance. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function loadIntoExisting($pFilename, Spreadsheet $spreadsheet) - { - // Validate - if (!$this->canRead($pFilename)) { - throw new Exception($pFilename . ' is an Invalid HTML file.'); - } - - // Create a new DOM object - $dom = new DOMDocument(); - // Reload the HTML file into the DOM object - try { - $loaded = $dom->loadHTML(mb_convert_encoding($this->securityScanner->scanFile($pFilename), 'HTML-ENTITIES', 'UTF-8')); - } catch (Throwable $e) { - $loaded = false; - } - if ($loaded === false) { - throw new Exception('Failed to load ' . $pFilename . ' as a DOM Document'); - } - - return $this->loadDocument($dom, $spreadsheet); - } - - /** - * Spreadsheet from content. - * - * @param string $content - */ - public function loadFromString($content, ?Spreadsheet $spreadsheet = null): Spreadsheet - { - // Create a new DOM object - $dom = new DOMDocument(); - // Reload the HTML file into the DOM object - try { - $loaded = $dom->loadHTML(mb_convert_encoding($this->securityScanner->scan($content), 'HTML-ENTITIES', 'UTF-8')); - } catch (Throwable $e) { - $loaded = false; - } - if ($loaded === false) { - throw new Exception('Failed to load content as a DOM Document'); - } - - return $this->loadDocument($dom, $spreadsheet ?? new Spreadsheet()); - } - - /** - * Loads PhpSpreadsheet from DOMDocument into PhpSpreadsheet instance. - */ - private function loadDocument(DOMDocument $document, Spreadsheet $spreadsheet): Spreadsheet - { - while ($spreadsheet->getSheetCount() <= $this->sheetIndex) { - $spreadsheet->createSheet(); - } - $spreadsheet->setActiveSheetIndex($this->sheetIndex); - - // Discard white space - $document->preserveWhiteSpace = false; - - $row = 0; - $column = 'A'; - $content = ''; - $this->rowspan = []; - $this->processDomElement($document, $spreadsheet->getActiveSheet(), $row, $column, $content); - - // Return - return $spreadsheet; - } - - /** - * Get sheet index. - * - * @return int - */ - public function getSheetIndex() - { - return $this->sheetIndex; - } - - /** - * Set sheet index. - * - * @param int $pValue Sheet index - * - * @return $this - */ - public function setSheetIndex($pValue) - { - $this->sheetIndex = $pValue; - - return $this; - } - - /** - * Apply inline css inline style. - * - * NOTES : - * Currently only intended for td & th element, - * and only takes 'background-color' and 'color'; property with HEX color - * - * TODO : - * - Implement to other propertie, such as border - * - * @param Worksheet $sheet - * @param int $row - * @param string $column - * @param array $attributeArray - */ - private function applyInlineStyle(&$sheet, $row, $column, $attributeArray): void - { - if (!isset($attributeArray['style'])) { - return; - } - - if (isset($attributeArray['rowspan'], $attributeArray['colspan'])) { - $columnTo = $column; - for ($i = 0; $i < (int) $attributeArray['colspan'] - 1; ++$i) { - ++$columnTo; - } - $range = $column . $row . ':' . $columnTo . ($row + (int) $attributeArray['rowspan'] - 1); - $cellStyle = $sheet->getStyle($range); - } elseif (isset($attributeArray['rowspan'])) { - $range = $column . $row . ':' . $column . ($row + (int) $attributeArray['rowspan'] - 1); - $cellStyle = $sheet->getStyle($range); - } elseif (isset($attributeArray['colspan'])) { - $columnTo = $column; - for ($i = 0; $i < (int) $attributeArray['colspan'] - 1; ++$i) { - ++$columnTo; - } - $range = $column . $row . ':' . $columnTo . $row; - $cellStyle = $sheet->getStyle($range); - } else { - $cellStyle = $sheet->getStyle($column . $row); - } - - // add color styles (background & text) from dom element,currently support : td & th, using ONLY inline css style with RGB color - $styles = explode(';', $attributeArray['style']); - foreach ($styles as $st) { - $value = explode(':', $st); - $styleName = isset($value[0]) ? trim($value[0]) : null; - $styleValue = isset($value[1]) ? trim($value[1]) : null; - - if (!$styleName) { - continue; - } - - switch ($styleName) { - case 'background': - case 'background-color': - $styleColor = $this->getStyleColor($styleValue); - - if (!$styleColor) { - continue 2; - } - - $cellStyle->applyFromArray(['fill' => ['fillType' => Fill::FILL_SOLID, 'color' => ['rgb' => $styleColor]]]); - - break; - case 'color': - $styleColor = $this->getStyleColor($styleValue); - - if (!$styleColor) { - continue 2; - } - - $cellStyle->applyFromArray(['font' => ['color' => ['rgb' => $styleColor]]]); - - break; - - case 'border': - $this->setBorderStyle($cellStyle, $styleValue, 'allBorders'); - - break; - - case 'border-top': - $this->setBorderStyle($cellStyle, $styleValue, 'top'); - - break; - - case 'border-bottom': - $this->setBorderStyle($cellStyle, $styleValue, 'bottom'); - - break; - - case 'border-left': - $this->setBorderStyle($cellStyle, $styleValue, 'left'); - - break; - - case 'border-right': - $this->setBorderStyle($cellStyle, $styleValue, 'right'); - - break; - - case 'font-size': - $cellStyle->getFont()->setSize( - (float) $styleValue - ); - - break; - - case 'font-weight': - if ($styleValue === 'bold' || $styleValue >= 500) { - $cellStyle->getFont()->setBold(true); - } - - break; - - case 'font-style': - if ($styleValue === 'italic') { - $cellStyle->getFont()->setItalic(true); - } - - break; - - case 'font-family': - $cellStyle->getFont()->setName(str_replace('\'', '', $styleValue)); - - break; - - case 'text-decoration': - switch ($styleValue) { - case 'underline': - $cellStyle->getFont()->setUnderline(Font::UNDERLINE_SINGLE); - - break; - case 'line-through': - $cellStyle->getFont()->setStrikethrough(true); - - break; - } - - break; - - case 'text-align': - $cellStyle->getAlignment()->setHorizontal($styleValue); - - break; - - case 'vertical-align': - $cellStyle->getAlignment()->setVertical($styleValue); - - break; - - case 'width': - $sheet->getColumnDimension($column)->setWidth( - str_replace('px', '', $styleValue) - ); - - break; - - case 'height': - $sheet->getRowDimension($row)->setRowHeight( - str_replace('px', '', $styleValue) - ); - - break; - - case 'word-wrap': - $cellStyle->getAlignment()->setWrapText( - $styleValue === 'break-word' - ); - - break; - - case 'text-indent': - $cellStyle->getAlignment()->setIndent( - (int) str_replace(['px'], '', $styleValue) - ); - - break; - } - } - } - - /** - * Check if has #, so we can get clean hex. - * - * @param $value - * - * @return null|string - */ - public function getStyleColor($value) - { - if (strpos($value, '#') === 0) { - return substr($value, 1); - } - - return \PhpOffice\PhpSpreadsheet\Helper\Html::colourNameLookup((string) $value); - } - - /** - * @param string $column - * @param int $row - */ - private function insertImage(Worksheet $sheet, $column, $row, array $attributes): void - { - if (!isset($attributes['src'])) { - return; - } - - $src = urldecode($attributes['src']); - $width = isset($attributes['width']) ? (float) $attributes['width'] : null; - $height = isset($attributes['height']) ? (float) $attributes['height'] : null; - $name = $attributes['alt'] ?? null; - - $drawing = new Drawing(); - $drawing->setPath($src); - $drawing->setWorksheet($sheet); - $drawing->setCoordinates($column . $row); - $drawing->setOffsetX(0); - $drawing->setOffsetY(10); - $drawing->setResizeProportional(true); - - if ($name) { - $drawing->setName($name); - } - - if ($width) { - $drawing->setWidth((int) $width); - } - - if ($height) { - $drawing->setHeight((int) $height); - } - - $sheet->getColumnDimension($column)->setWidth( - $drawing->getWidth() / 6 - ); - - $sheet->getRowDimension($row)->setRowHeight( - $drawing->getHeight() * 0.9 - ); - } - - private static $borderMappings = [ - 'dash-dot' => Border::BORDER_DASHDOT, - 'dash-dot-dot' => Border::BORDER_DASHDOTDOT, - 'dashed' => Border::BORDER_DASHED, - 'dotted' => Border::BORDER_DOTTED, - 'double' => Border::BORDER_DOUBLE, - 'hair' => Border::BORDER_HAIR, - 'medium' => Border::BORDER_MEDIUM, - 'medium-dashed' => Border::BORDER_MEDIUMDASHED, - 'medium-dash-dot' => Border::BORDER_MEDIUMDASHDOT, - 'medium-dash-dot-dot' => Border::BORDER_MEDIUMDASHDOTDOT, - 'none' => Border::BORDER_NONE, - 'slant-dash-dot' => Border::BORDER_SLANTDASHDOT, - 'solid' => Border::BORDER_THIN, - 'thick' => Border::BORDER_THICK, - ]; - - public static function getBorderMappings(): array - { - return self::$borderMappings; - } - - /** - * Map html border style to PhpSpreadsheet border style. - * - * @param string $style - * - * @return null|string - */ - public function getBorderStyle($style) - { - return (array_key_exists($style, self::$borderMappings)) ? self::$borderMappings[$style] : null; - } - - /** - * @param string $styleValue - * @param string $type - */ - private function setBorderStyle(Style $cellStyle, $styleValue, $type): void - { - if (trim($styleValue) === Border::BORDER_NONE) { - $borderStyle = Border::BORDER_NONE; - $color = null; - } else { - [, $borderStyle, $color] = explode(' ', $styleValue); - } - - $cellStyle->applyFromArray([ - 'borders' => [ - $type => [ - 'borderStyle' => $this->getBorderStyle($borderStyle), - 'color' => ['rgb' => $this->getStyleColor($color)], - ], - ], - ]); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReadFilter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReadFilter.php deleted file mode 100644 index ccfe05a..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReadFilter.php +++ /dev/null @@ -1,17 +0,0 @@ -securityScanner = XmlScanner::getInstance($this); - } - - /** - * Can the current IReader read the file? - * - * @param string $pFilename - * - * @return bool - */ - public function canRead($pFilename) - { - File::assertFile($pFilename); - - $mimeType = 'UNKNOWN'; - - // Load file - - $zip = new ZipArchive(); - if ($zip->open($pFilename) === true) { - // check if it is an OOXML archive - $stat = $zip->statName('mimetype'); - if ($stat && ($stat['size'] <= 255)) { - $mimeType = $zip->getFromName($stat['name']); - } elseif ($zip->statName('META-INF/manifest.xml')) { - $xml = simplexml_load_string( - $this->securityScanner->scan($zip->getFromName('META-INF/manifest.xml')), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $namespacesContent = $xml->getNamespaces(true); - if (isset($namespacesContent['manifest'])) { - $manifest = $xml->children($namespacesContent['manifest']); - foreach ($manifest as $manifestDataSet) { - $manifestAttributes = $manifestDataSet->attributes($namespacesContent['manifest']); - if ($manifestAttributes->{'full-path'} == '/') { - $mimeType = (string) $manifestAttributes->{'media-type'}; - - break; - } - } - } - } - - $zip->close(); - } - - return $mimeType === 'application/vnd.oasis.opendocument.spreadsheet'; - } - - /** - * Reads names of the worksheets from a file, without parsing the whole file to a PhpSpreadsheet object. - * - * @param string $pFilename - * - * @return string[] - */ - public function listWorksheetNames($pFilename) - { - File::assertFile($pFilename); - - $zip = new ZipArchive(); - if ($zip->open($pFilename) !== true) { - throw new ReaderException('Could not open ' . $pFilename . ' for reading! Error opening file.'); - } - - $worksheetNames = []; - - $xml = new XMLReader(); - $xml->xml( - $this->securityScanner->scanFile('zip://' . realpath($pFilename) . '#content.xml'), - null, - Settings::getLibXmlLoaderOptions() - ); - $xml->setParserProperty(2, true); - - // Step into the first level of content of the XML - $xml->read(); - while ($xml->read()) { - // Quickly jump through to the office:body node - while ($xml->name !== 'office:body') { - if ($xml->isEmptyElement) { - $xml->read(); - } else { - $xml->next(); - } - } - // Now read each node until we find our first table:table node - while ($xml->read()) { - if ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) { - // Loop through each table:table node reading the table:name attribute for each worksheet name - do { - $worksheetNames[] = $xml->getAttribute('table:name'); - $xml->next(); - } while ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT); - } - } - } - - return $worksheetNames; - } - - /** - * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns). - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetInfo($pFilename) - { - File::assertFile($pFilename); - - $worksheetInfo = []; - - $zip = new ZipArchive(); - if ($zip->open($pFilename) !== true) { - throw new ReaderException('Could not open ' . $pFilename . ' for reading! Error opening file.'); - } - - $xml = new XMLReader(); - $xml->xml( - $this->securityScanner->scanFile('zip://' . realpath($pFilename) . '#content.xml'), - null, - Settings::getLibXmlLoaderOptions() - ); - $xml->setParserProperty(2, true); - - // Step into the first level of content of the XML - $xml->read(); - while ($xml->read()) { - // Quickly jump through to the office:body node - while ($xml->name !== 'office:body') { - if ($xml->isEmptyElement) { - $xml->read(); - } else { - $xml->next(); - } - } - // Now read each node until we find our first table:table node - while ($xml->read()) { - if ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) { - $worksheetNames[] = $xml->getAttribute('table:name'); - - $tmpInfo = [ - 'worksheetName' => $xml->getAttribute('table:name'), - 'lastColumnLetter' => 'A', - 'lastColumnIndex' => 0, - 'totalRows' => 0, - 'totalColumns' => 0, - ]; - - // Loop through each child node of the table:table element reading - $currCells = 0; - do { - $xml->read(); - if ($xml->name == 'table:table-row' && $xml->nodeType == XMLReader::ELEMENT) { - $rowspan = $xml->getAttribute('table:number-rows-repeated'); - $rowspan = empty($rowspan) ? 1 : $rowspan; - $tmpInfo['totalRows'] += $rowspan; - $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); - $currCells = 0; - // Step into the row - $xml->read(); - do { - $doread = true; - if ($xml->name == 'table:table-cell' && $xml->nodeType == XMLReader::ELEMENT) { - if (!$xml->isEmptyElement) { - ++$currCells; - $xml->next(); - $doread = false; - } - } elseif ($xml->name == 'table:covered-table-cell' && $xml->nodeType == XMLReader::ELEMENT) { - $mergeSize = $xml->getAttribute('table:number-columns-repeated'); - $currCells += (int) $mergeSize; - } - if ($doread) { - $xml->read(); - } - } while ($xml->name != 'table:table-row'); - } - } while ($xml->name != 'table:table'); - - $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); - $tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1; - $tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1); - $worksheetInfo[] = $tmpInfo; - } - } - } - - return $worksheetInfo; - } - - /** - * Loads PhpSpreadsheet from file. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function load($pFilename) - { - // Create new Spreadsheet - $spreadsheet = new Spreadsheet(); - - // Load into this instance - return $this->loadIntoExisting($pFilename, $spreadsheet); - } - - /** - * Loads PhpSpreadsheet from file into PhpSpreadsheet instance. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function loadIntoExisting($pFilename, Spreadsheet $spreadsheet) - { - File::assertFile($pFilename); - - $timezoneObj = new DateTimeZone('Europe/London'); - $GMT = new DateTimeZone('UTC'); - - $zip = new ZipArchive(); - if ($zip->open($pFilename) !== true) { - throw new Exception("Could not open {$pFilename} for reading! Error opening file."); - } - - // Meta - - $xml = @simplexml_load_string( - $this->securityScanner->scan($zip->getFromName('meta.xml')), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - if ($xml === false) { - throw new Exception('Unable to read data from {$pFilename}'); - } - - $namespacesMeta = $xml->getNamespaces(true); - - (new DocumentProperties($spreadsheet))->load($xml, $namespacesMeta); - - // Styles - - $dom = new DOMDocument('1.01', 'UTF-8'); - $dom->loadXML( - $this->securityScanner->scan($zip->getFromName('styles.xml')), - Settings::getLibXmlLoaderOptions() - ); - - $pageSettings = new PageSettings($dom); - - // Main Content - - $dom = new DOMDocument('1.01', 'UTF-8'); - $dom->loadXML( - $this->securityScanner->scan($zip->getFromName('content.xml')), - Settings::getLibXmlLoaderOptions() - ); - - $officeNs = $dom->lookupNamespaceUri('office'); - $tableNs = $dom->lookupNamespaceUri('table'); - $textNs = $dom->lookupNamespaceUri('text'); - $xlinkNs = $dom->lookupNamespaceUri('xlink'); - - $pageSettings->readStyleCrossReferences($dom); - - // Content - - $spreadsheets = $dom->getElementsByTagNameNS($officeNs, 'body') - ->item(0) - ->getElementsByTagNameNS($officeNs, 'spreadsheet'); - - foreach ($spreadsheets as $workbookData) { - /** @var DOMElement $workbookData */ - $tables = $workbookData->getElementsByTagNameNS($tableNs, 'table'); - - $worksheetID = 0; - foreach ($tables as $worksheetDataSet) { - /** @var DOMElement $worksheetDataSet */ - $worksheetName = $worksheetDataSet->getAttributeNS($tableNs, 'name'); - - // Check loadSheetsOnly - if ( - isset($this->loadSheetsOnly) - && $worksheetName - && !in_array($worksheetName, $this->loadSheetsOnly) - ) { - continue; - } - - $worksheetStyleName = $worksheetDataSet->getAttributeNS($tableNs, 'style-name'); - - // Create sheet - if ($worksheetID > 0) { - $spreadsheet->createSheet(); // First sheet is added by default - } - $spreadsheet->setActiveSheetIndex($worksheetID); - - if ($worksheetName) { - // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in - // formula cells... during the load, all formulae should be correct, and we're simply - // bringing the worksheet name in line with the formula, not the reverse - $spreadsheet->getActiveSheet()->setTitle((string) $worksheetName, false, false); - } - - // Go through every child of table element - $rowID = 1; - foreach ($worksheetDataSet->childNodes as $childNode) { - /** @var DOMElement $childNode */ - - // Filter elements which are not under the "table" ns - if ($childNode->namespaceURI != $tableNs) { - continue; - } - - $key = $childNode->nodeName; - - // Remove ns from node name - if (strpos($key, ':') !== false) { - $keyChunks = explode(':', $key); - $key = array_pop($keyChunks); - } - - switch ($key) { - case 'table-header-rows': - /// TODO :: Figure this out. This is only a partial implementation I guess. - // ($rowData it's not used at all and I'm not sure that PHPExcel - // has an API for this) - -// foreach ($rowData as $keyRowData => $cellData) { -// $rowData = $cellData; -// break; -// } - break; - case 'table-row': - if ($childNode->hasAttributeNS($tableNs, 'number-rows-repeated')) { - $rowRepeats = $childNode->getAttributeNS($tableNs, 'number-rows-repeated'); - } else { - $rowRepeats = 1; - } - - $columnID = 'A'; - foreach ($childNode->childNodes as $key => $cellData) { - // @var \DOMElement $cellData - - if ($this->getReadFilter() !== null) { - if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) { - ++$columnID; - - continue; - } - } - - // Initialize variables - $formatting = $hyperlink = null; - $hasCalculatedValue = false; - $cellDataFormula = ''; - - if ($cellData->hasAttributeNS($tableNs, 'formula')) { - $cellDataFormula = $cellData->getAttributeNS($tableNs, 'formula'); - $hasCalculatedValue = true; - } - - // Annotations - $annotation = $cellData->getElementsByTagNameNS($officeNs, 'annotation'); - - if ($annotation->length > 0) { - $textNode = $annotation->item(0)->getElementsByTagNameNS($textNs, 'p'); - - if ($textNode->length > 0) { - $text = $this->scanElementForText($textNode->item(0)); - - $spreadsheet->getActiveSheet() - ->getComment($columnID . $rowID) - ->setText($this->parseRichText($text)); -// ->setAuthor( $author ) - } - } - - // Content - - /** @var DOMElement[] $paragraphs */ - $paragraphs = []; - - foreach ($cellData->childNodes as $item) { - /** @var DOMElement $item */ - - // Filter text:p elements - if ($item->nodeName == 'text:p') { - $paragraphs[] = $item; - } - } - - if (count($paragraphs) > 0) { - // Consolidate if there are multiple p records (maybe with spans as well) - $dataArray = []; - - // Text can have multiple text:p and within those, multiple text:span. - // text:p newlines, but text:span does not. - // Also, here we assume there is no text data is span fields are specified, since - // we have no way of knowing proper positioning anyway. - - foreach ($paragraphs as $pData) { - $dataArray[] = $this->scanElementForText($pData); - } - $allCellDataText = implode("\n", $dataArray); - - $type = $cellData->getAttributeNS($officeNs, 'value-type'); - - switch ($type) { - case 'string': - $type = DataType::TYPE_STRING; - $dataValue = $allCellDataText; - - foreach ($paragraphs as $paragraph) { - $link = $paragraph->getElementsByTagNameNS($textNs, 'a'); - if ($link->length > 0) { - $hyperlink = $link->item(0)->getAttributeNS($xlinkNs, 'href'); - } - } - - break; - case 'boolean': - $type = DataType::TYPE_BOOL; - $dataValue = ($allCellDataText == 'TRUE') ? true : false; - - break; - case 'percentage': - $type = DataType::TYPE_NUMERIC; - $dataValue = (float) $cellData->getAttributeNS($officeNs, 'value'); - - // percentage should always be float - //if (floor($dataValue) == $dataValue) { - // $dataValue = (int) $dataValue; - //} - $formatting = NumberFormat::FORMAT_PERCENTAGE_00; - - break; - case 'currency': - $type = DataType::TYPE_NUMERIC; - $dataValue = (float) $cellData->getAttributeNS($officeNs, 'value'); - - if (floor($dataValue) == $dataValue) { - $dataValue = (int) $dataValue; - } - $formatting = NumberFormat::FORMAT_CURRENCY_USD_SIMPLE; - - break; - case 'float': - $type = DataType::TYPE_NUMERIC; - $dataValue = (float) $cellData->getAttributeNS($officeNs, 'value'); - - if (floor($dataValue) == $dataValue) { - if ($dataValue == (int) $dataValue) { - $dataValue = (int) $dataValue; - } - } - - break; - case 'date': - $type = DataType::TYPE_NUMERIC; - $value = $cellData->getAttributeNS($officeNs, 'date-value'); - - $dateObj = new DateTime($value, $GMT); - $dateObj->setTimeZone($timezoneObj); - [$year, $month, $day, $hour, $minute, $second] = explode( - ' ', - $dateObj->format('Y m d H i s') - ); - - $dataValue = Date::formattedPHPToExcel( - (int) $year, - (int) $month, - (int) $day, - (int) $hour, - (int) $minute, - (int) $second - ); - - if ($dataValue != floor($dataValue)) { - $formatting = NumberFormat::FORMAT_DATE_XLSX15 - . ' ' - . NumberFormat::FORMAT_DATE_TIME4; - } else { - $formatting = NumberFormat::FORMAT_DATE_XLSX15; - } - - break; - case 'time': - $type = DataType::TYPE_NUMERIC; - - $timeValue = $cellData->getAttributeNS($officeNs, 'time-value'); - - $dataValue = Date::PHPToExcel( - strtotime( - '01-01-1970 ' . implode(':', sscanf($timeValue, 'PT%dH%dM%dS')) - ) - ); - $formatting = NumberFormat::FORMAT_DATE_TIME4; - - break; - default: - $dataValue = null; - } - } else { - $type = DataType::TYPE_NULL; - $dataValue = null; - } - - if ($hasCalculatedValue) { - $type = DataType::TYPE_FORMULA; - $cellDataFormula = substr($cellDataFormula, strpos($cellDataFormula, ':=') + 1); - $cellDataFormula = $this->convertToExcelFormulaValue($cellDataFormula); - } - - if ($cellData->hasAttributeNS($tableNs, 'number-columns-repeated')) { - $colRepeats = (int) $cellData->getAttributeNS($tableNs, 'number-columns-repeated'); - } else { - $colRepeats = 1; - } - - if ($type !== null) { - for ($i = 0; $i < $colRepeats; ++$i) { - if ($i > 0) { - ++$columnID; - } - - if ($type !== DataType::TYPE_NULL) { - for ($rowAdjust = 0; $rowAdjust < $rowRepeats; ++$rowAdjust) { - $rID = $rowID + $rowAdjust; - - $cell = $spreadsheet->getActiveSheet() - ->getCell($columnID . $rID); - - // Set value - if ($hasCalculatedValue) { - $cell->setValueExplicit($cellDataFormula, $type); - } else { - $cell->setValueExplicit($dataValue, $type); - } - - if ($hasCalculatedValue) { - $cell->setCalculatedValue($dataValue); - } - - // Set other properties - if ($formatting !== null) { - $spreadsheet->getActiveSheet() - ->getStyle($columnID . $rID) - ->getNumberFormat() - ->setFormatCode($formatting); - } else { - $spreadsheet->getActiveSheet() - ->getStyle($columnID . $rID) - ->getNumberFormat() - ->setFormatCode(NumberFormat::FORMAT_GENERAL); - } - - if ($hyperlink !== null) { - $cell->getHyperlink() - ->setUrl($hyperlink); - } - } - } - } - } - - // Merged cells - if ( - $cellData->hasAttributeNS($tableNs, 'number-columns-spanned') - || $cellData->hasAttributeNS($tableNs, 'number-rows-spanned') - ) { - if (($type !== DataType::TYPE_NULL) || (!$this->readDataOnly)) { - $columnTo = $columnID; - - if ($cellData->hasAttributeNS($tableNs, 'number-columns-spanned')) { - $columnIndex = Coordinate::columnIndexFromString($columnID); - $columnIndex += (int) $cellData->getAttributeNS($tableNs, 'number-columns-spanned'); - $columnIndex -= 2; - - $columnTo = Coordinate::stringFromColumnIndex($columnIndex + 1); - } - - $rowTo = $rowID; - - if ($cellData->hasAttributeNS($tableNs, 'number-rows-spanned')) { - $rowTo = $rowTo + (int) $cellData->getAttributeNS($tableNs, 'number-rows-spanned') - 1; - } - - $cellRange = $columnID . $rowID . ':' . $columnTo . $rowTo; - $spreadsheet->getActiveSheet()->mergeCells($cellRange); - } - } - - ++$columnID; - } - $rowID += $rowRepeats; - - break; - } - } - $pageSettings->setPrintSettingsForWorksheet($spreadsheet->getActiveSheet(), $worksheetStyleName); - ++$worksheetID; - } - - $this->readDefinedRanges($spreadsheet, $workbookData, $tableNs); - $this->readDefinedExpressions($spreadsheet, $workbookData, $tableNs); - } - $spreadsheet->setActiveSheetIndex(0); - // Return - return $spreadsheet; - } - - /** - * Recursively scan element. - * - * @return string - */ - protected function scanElementForText(DOMNode $element) - { - $str = ''; - foreach ($element->childNodes as $child) { - /** @var DOMNode $child */ - if ($child->nodeType == XML_TEXT_NODE) { - $str .= $child->nodeValue; - } elseif ($child->nodeType == XML_ELEMENT_NODE && $child->nodeName == 'text:s') { - // It's a space - - // Multiple spaces? - /** @var DOMAttr $cAttr */ - $cAttr = $child->attributes->getNamedItem('c'); - if ($cAttr) { - $multiplier = (int) $cAttr->nodeValue; - } else { - $multiplier = 1; - } - - $str .= str_repeat(' ', $multiplier); - } - - if ($child->hasChildNodes()) { - $str .= $this->scanElementForText($child); - } - } - - return $str; - } - - /** - * @param string $is - * - * @return RichText - */ - private function parseRichText($is) - { - $value = new RichText(); - $value->createText($is); - - return $value; - } - - private function convertToExcelAddressValue(string $openOfficeAddress): string - { - $excelAddress = $openOfficeAddress; - - // Cell range 3-d reference - // As we don't support 3-d ranges, we're just going to take a quick and dirty approach - // and assume that the second worksheet reference is the same as the first - $excelAddress = preg_replace('/\$?([^\.]+)\.([^\.]+):\$?([^\.]+)\.([^\.]+)/miu', '$1!$2:$4', $excelAddress); - // Cell range reference in another sheet - $excelAddress = preg_replace('/\$?([^\.]+)\.([^\.]+):\.([^\.]+)/miu', '$1!$2:$3', $excelAddress); - // Cell reference in another sheet - $excelAddress = preg_replace('/\$?([^\.]+)\.([^\.]+)/miu', '$1!$2', $excelAddress); - // Cell range reference - $excelAddress = preg_replace('/\.([^\.]+):\.([^\.]+)/miu', '$1:$2', $excelAddress); - // Simple cell reference - $excelAddress = preg_replace('/\.([^\.]+)/miu', '$1', $excelAddress); - - return $excelAddress; - } - - private function convertToExcelFormulaValue(string $openOfficeFormula): string - { - $temp = explode('"', $openOfficeFormula); - $tKey = false; - foreach ($temp as &$value) { - // Only replace in alternate array entries (i.e. non-quoted blocks) - if ($tKey = !$tKey) { - // Cell range reference in another sheet - $value = preg_replace('/\[\$?([^\.]+)\.([^\.]+):\.([^\.]+)\]/miu', '$1!$2:$3', $value); - // Cell reference in another sheet - $value = preg_replace('/\[\$?([^\.]+)\.([^\.]+)\]/miu', '$1!$2', $value); - // Cell range reference - $value = preg_replace('/\[\.([^\.]+):\.([^\.]+)\]/miu', '$1:$2', $value); - // Simple cell reference - $value = preg_replace('/\[\.([^\.]+)\]/miu', '$1', $value); - - $value = Calculation::translateSeparator(';', ',', $value, $inBraces); - } - } - - // Then rebuild the formula string - $excelFormula = implode('"', $temp); - - return $excelFormula; - } - - /** - * Read any Named Ranges that are defined in this spreadsheet. - */ - private function readDefinedRanges(Spreadsheet $spreadsheet, DOMElement $workbookData, string $tableNs): void - { - $namedRanges = $workbookData->getElementsByTagNameNS($tableNs, 'named-range'); - foreach ($namedRanges as $definedNameElement) { - $definedName = $definedNameElement->getAttributeNS($tableNs, 'name'); - $baseAddress = $definedNameElement->getAttributeNS($tableNs, 'base-cell-address'); - $range = $definedNameElement->getAttributeNS($tableNs, 'cell-range-address'); - - $baseAddress = $this->convertToExcelAddressValue($baseAddress); - $range = $this->convertToExcelAddressValue($range); - - $this->addDefinedName($spreadsheet, $baseAddress, $definedName, $range); - } - } - - /** - * Read any Named Formulae that are defined in this spreadsheet. - */ - private function readDefinedExpressions(Spreadsheet $spreadsheet, DOMElement $workbookData, string $tableNs): void - { - $namedExpressions = $workbookData->getElementsByTagNameNS($tableNs, 'named-expression'); - foreach ($namedExpressions as $definedNameElement) { - $definedName = $definedNameElement->getAttributeNS($tableNs, 'name'); - $baseAddress = $definedNameElement->getAttributeNS($tableNs, 'base-cell-address'); - $expression = $definedNameElement->getAttributeNS($tableNs, 'expression'); - - $baseAddress = $this->convertToExcelAddressValue($baseAddress); - $expression = $this->convertToExcelFormulaValue($expression); - - $this->addDefinedName($spreadsheet, $baseAddress, $definedName, $expression); - } - } - - /** - * Assess scope and store the Defined Name. - */ - private function addDefinedName(Spreadsheet $spreadsheet, string $baseAddress, string $definedName, string $value): void - { - [$sheetReference] = Worksheet::extractSheetTitle($baseAddress, true); - $worksheet = $spreadsheet->getSheetByName($sheetReference); - // Worksheet might still be null if we're only loading selected sheets rather than the full spreadsheet - if ($worksheet !== null) { - $spreadsheet->addDefinedName(DefinedName::createInstance((string) $definedName, $worksheet, $value)); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/PageSettings.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/PageSettings.php deleted file mode 100644 index 77341aa..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/PageSettings.php +++ /dev/null @@ -1,139 +0,0 @@ -setDomNameSpaces($styleDom); - $this->readPageSettingStyles($styleDom); - $this->readStyleMasterLookup($styleDom); - } - - private function setDomNameSpaces(DOMDocument $styleDom): void - { - $this->officeNs = $styleDom->lookupNamespaceUri('office'); - $this->stylesNs = $styleDom->lookupNamespaceUri('style'); - $this->stylesFo = $styleDom->lookupNamespaceUri('fo'); - } - - private function readPageSettingStyles(DOMDocument $styleDom): void - { - $styles = $styleDom->getElementsByTagNameNS($this->officeNs, 'automatic-styles') - ->item(0) - ->getElementsByTagNameNS($this->stylesNs, 'page-layout'); - - foreach ($styles as $styleSet) { - $styleName = $styleSet->getAttributeNS($this->stylesNs, 'name'); - $pageLayoutProperties = $styleSet->getElementsByTagNameNS($this->stylesNs, 'page-layout-properties')[0]; - $styleOrientation = $pageLayoutProperties->getAttributeNS($this->stylesNs, 'print-orientation'); - $styleScale = $pageLayoutProperties->getAttributeNS($this->stylesNs, 'scale-to'); - $stylePrintOrder = $pageLayoutProperties->getAttributeNS($this->stylesNs, 'print-page-order'); - $centered = $pageLayoutProperties->getAttributeNS($this->stylesNs, 'table-centering'); - - $marginLeft = $pageLayoutProperties->getAttributeNS($this->stylesFo, 'margin-left'); - $marginRight = $pageLayoutProperties->getAttributeNS($this->stylesFo, 'margin-right'); - $marginTop = $pageLayoutProperties->getAttributeNS($this->stylesFo, 'margin-top'); - $marginBottom = $pageLayoutProperties->getAttributeNS($this->stylesFo, 'margin-bottom'); - $header = $styleSet->getElementsByTagNameNS($this->stylesNs, 'header-style')[0]; - $headerProperties = $header->getElementsByTagNameNS($this->stylesNs, 'header-footer-properties')[0]; - $marginHeader = $headerProperties->getAttributeNS($this->stylesFo, 'min-height'); - $footer = $styleSet->getElementsByTagNameNS($this->stylesNs, 'footer-style')[0]; - $footerProperties = $footer->getElementsByTagNameNS($this->stylesNs, 'header-footer-properties')[0]; - $marginFooter = $footerProperties->getAttributeNS($this->stylesFo, 'min-height'); - - $this->pageLayoutStyles[$styleName] = (object) [ - 'orientation' => $styleOrientation ?: PageSetup::ORIENTATION_DEFAULT, - 'scale' => $styleScale ?: 100, - 'printOrder' => $stylePrintOrder, - 'horizontalCentered' => $centered === 'horizontal' || $centered === 'both', - 'verticalCentered' => $centered === 'vertical' || $centered === 'both', - // margin size is already stored in inches, so no UOM conversion is required - 'marginLeft' => (float) $marginLeft ?? 0.7, - 'marginRight' => (float) $marginRight ?? 0.7, - 'marginTop' => (float) $marginTop ?? 0.3, - 'marginBottom' => (float) $marginBottom ?? 0.3, - 'marginHeader' => (float) $marginHeader ?? 0.45, - 'marginFooter' => (float) $marginFooter ?? 0.45, - ]; - } - } - - private function readStyleMasterLookup(DOMDocument $styleDom): void - { - $styleMasterLookup = $styleDom->getElementsByTagNameNS($this->officeNs, 'master-styles') - ->item(0) - ->getElementsByTagNameNS($this->stylesNs, 'master-page'); - - foreach ($styleMasterLookup as $styleMasterSet) { - $styleMasterName = $styleMasterSet->getAttributeNS($this->stylesNs, 'name'); - $pageLayoutName = $styleMasterSet->getAttributeNS($this->stylesNs, 'page-layout-name'); - $this->masterPrintStylesCrossReference[$styleMasterName] = $pageLayoutName; - } - } - - public function readStyleCrossReferences(DOMDocument $contentDom): void - { - $styleXReferences = $contentDom->getElementsByTagNameNS($this->officeNs, 'automatic-styles') - ->item(0) - ->getElementsByTagNameNS($this->stylesNs, 'style'); - - foreach ($styleXReferences as $styleXreferenceSet) { - $styleXRefName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'name'); - $stylePageLayoutName = $styleXreferenceSet->getAttributeNS($this->stylesNs, 'master-page-name'); - if (!empty($stylePageLayoutName)) { - $this->masterStylesCrossReference[$styleXRefName] = $stylePageLayoutName; - } - } - } - - public function setPrintSettingsForWorksheet(Worksheet $worksheet, string $styleName): void - { - if (!array_key_exists($styleName, $this->masterStylesCrossReference)) { - return; - } - $masterStyleName = $this->masterStylesCrossReference[$styleName]; - - if (!array_key_exists($masterStyleName, $this->masterPrintStylesCrossReference)) { - return; - } - $printSettingsIndex = $this->masterPrintStylesCrossReference[$masterStyleName]; - - if (!array_key_exists($printSettingsIndex, $this->pageLayoutStyles)) { - return; - } - $printSettings = $this->pageLayoutStyles[$printSettingsIndex]; - - $worksheet->getPageSetup() - ->setOrientation($printSettings->orientation ?? PageSetup::ORIENTATION_DEFAULT) - ->setPageOrder($printSettings->printOrder === 'ltr' ? PageSetup::PAGEORDER_OVER_THEN_DOWN : PageSetup::PAGEORDER_DOWN_THEN_OVER) - ->setScale((int) trim($printSettings->scale, '%')) - ->setHorizontalCentered($printSettings->horizontalCentered) - ->setVerticalCentered($printSettings->verticalCentered); - - $worksheet->getPageMargins() - ->setLeft($printSettings->marginLeft) - ->setRight($printSettings->marginRight) - ->setTop($printSettings->marginTop) - ->setBottom($printSettings->marginBottom) - ->setHeader($printSettings->marginHeader) - ->setFooter($printSettings->marginFooter); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/Properties.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/Properties.php deleted file mode 100644 index d0a45e6..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/Properties.php +++ /dev/null @@ -1,132 +0,0 @@ -spreadsheet = $spreadsheet; - } - - public function load(SimpleXMLElement $xml, $namespacesMeta): void - { - $docProps = $this->spreadsheet->getProperties(); - $officeProperty = $xml->children($namespacesMeta['office']); - foreach ($officeProperty as $officePropertyData) { - // @var \SimpleXMLElement $officePropertyData - if (isset($namespacesMeta['dc'])) { - $officePropertiesDC = $officePropertyData->children($namespacesMeta['dc']); - $this->setCoreProperties($docProps, $officePropertiesDC); - } - - $officePropertyMeta = (object) []; - if (isset($namespacesMeta['dc'])) { - $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']); - } - foreach ($officePropertyMeta as $propertyName => $propertyValue) { - $this->setMetaProperties($namespacesMeta, $propertyValue, $propertyName, $docProps); - } - } - } - - private function setCoreProperties(DocumentProperties $docProps, SimpleXMLElement $officePropertyDC): void - { - foreach ($officePropertyDC as $propertyName => $propertyValue) { - $propertyValue = (string) $propertyValue; - switch ($propertyName) { - case 'title': - $docProps->setTitle($propertyValue); - - break; - case 'subject': - $docProps->setSubject($propertyValue); - - break; - case 'creator': - $docProps->setCreator($propertyValue); - $docProps->setLastModifiedBy($propertyValue); - - break; - case 'date': - $creationDate = strtotime($propertyValue); - $docProps->setCreated($creationDate); - $docProps->setModified($creationDate); - - break; - case 'description': - $docProps->setDescription($propertyValue); - - break; - } - } - } - - private function setMetaProperties( - $namespacesMeta, - SimpleXMLElement $propertyValue, - $propertyName, - DocumentProperties $docProps - ): void { - $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta']); - $propertyValue = (string) $propertyValue; - switch ($propertyName) { - case 'initial-creator': - $docProps->setCreator($propertyValue); - - break; - case 'keyword': - $docProps->setKeywords($propertyValue); - - break; - case 'creation-date': - $creationDate = strtotime($propertyValue); - $docProps->setCreated($creationDate); - - break; - case 'user-defined': - $this->setUserDefinedProperty($propertyValueAttributes, $propertyValue, $docProps); - - break; - } - } - - private function setUserDefinedProperty($propertyValueAttributes, $propertyValue, DocumentProperties $docProps): void - { - $propertyValueName = ''; - $propertyValueType = DocumentProperties::PROPERTY_TYPE_STRING; - foreach ($propertyValueAttributes as $key => $value) { - if ($key == 'name') { - $propertyValueName = (string) $value; - } elseif ($key == 'value-type') { - switch ($value) { - case 'date': - $propertyValue = DocumentProperties::convertProperty($propertyValue, 'date'); - $propertyValueType = DocumentProperties::PROPERTY_TYPE_DATE; - - break; - case 'boolean': - $propertyValue = DocumentProperties::convertProperty($propertyValue, 'bool'); - $propertyValueType = DocumentProperties::PROPERTY_TYPE_BOOLEAN; - - break; - case 'float': - $propertyValue = DocumentProperties::convertProperty($propertyValue, 'r4'); - $propertyValueType = DocumentProperties::PROPERTY_TYPE_FLOAT; - - break; - default: - $propertyValueType = DocumentProperties::PROPERTY_TYPE_STRING; - } - } - } - - $docProps->setCustomProperty($propertyValueName, $propertyValue, $propertyValueType); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php deleted file mode 100644 index a65797c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php +++ /dev/null @@ -1,150 +0,0 @@ -pattern = $pattern; - - $this->disableEntityLoaderCheck(); - - // A fatal error will bypass the destructor, so we register a shutdown here - register_shutdown_function([__CLASS__, 'shutdown']); - } - - public static function getInstance(Reader\IReader $reader) - { - switch (true) { - case $reader instanceof Reader\Html: - return new self('= 1; - case 1: - return PHP_RELEASE_VERSION >= 13; - case 0: - return PHP_RELEASE_VERSION >= 27; - } - - return true; - } - - return false; - } - - private function disableEntityLoaderCheck(): void - { - if (Settings::getLibXmlDisableEntityLoader() && \PHP_VERSION_ID < 80000) { - $libxmlDisableEntityLoaderValue = libxml_disable_entity_loader(true); - - if (self::$libxmlDisableEntityLoaderValue === null) { - self::$libxmlDisableEntityLoaderValue = $libxmlDisableEntityLoaderValue; - } - } - } - - public static function shutdown(): void - { - if (self::$libxmlDisableEntityLoaderValue !== null && \PHP_VERSION_ID < 80000) { - libxml_disable_entity_loader(self::$libxmlDisableEntityLoaderValue); - self::$libxmlDisableEntityLoaderValue = null; - } - } - - public function __destruct() - { - self::shutdown(); - } - - public function setAdditionalCallback(callable $callback): void - { - $this->callback = $callback; - } - - private function toUtf8($xml) - { - $pattern = '/encoding="(.*?)"/'; - $result = preg_match($pattern, $xml, $matches); - $charset = strtoupper($result ? $matches[1] : 'UTF-8'); - - if ($charset !== 'UTF-8') { - $xml = mb_convert_encoding($xml, 'UTF-8', $charset); - - $result = preg_match($pattern, $xml, $matches); - $charset = strtoupper($result ? $matches[1] : 'UTF-8'); - if ($charset !== 'UTF-8') { - throw new Reader\Exception('Suspicious Double-encoded XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); - } - } - - return $xml; - } - - /** - * Scan the XML for use of disableEntityLoaderCheck(); - - $xml = $this->toUtf8($xml); - - // Don't rely purely on libxml_disable_entity_loader() - $pattern = '/\\0?' . implode('\\0?', str_split($this->pattern)) . '\\0?/'; - - if (preg_match($pattern, $xml)) { - throw new Reader\Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); - } - - if ($this->callback !== null && is_callable($this->callback)) { - $xml = call_user_func($this->callback, $xml); - } - - return $xml; - } - - /** - * Scan theXML for use of scan(file_get_contents($filestream)); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Slk.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Slk.php deleted file mode 100644 index 0e14737..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Slk.php +++ /dev/null @@ -1,590 +0,0 @@ -openFile($pFilename); - } catch (InvalidArgumentException $e) { - return false; - } - - // Read sample data (first 2 KB will do) - $data = fread($this->fileHandle, 2048); - - // Count delimiters in file - $delimiterCount = substr_count($data, ';'); - $hasDelimiter = $delimiterCount > 0; - - // Analyze first line looking for ID; signature - $lines = explode("\n", $data); - $hasId = substr($lines[0], 0, 4) === 'ID;P'; - - fclose($this->fileHandle); - - return $hasDelimiter && $hasId; - } - - private function canReadOrBust(string $pFilename): void - { - if (!$this->canRead($pFilename)) { - throw new ReaderException($pFilename . ' is an Invalid SYLK file.'); - } - $this->openFile($pFilename); - } - - /** - * Set input encoding. - * - * @deprecated no use is made of this property - * - * @param string $pValue Input encoding, eg: 'ANSI' - * - * @return $this - * - * @codeCoverageIgnore - */ - public function setInputEncoding($pValue) - { - $this->inputEncoding = $pValue; - - return $this; - } - - /** - * Get input encoding. - * - * @deprecated no use is made of this property - * - * @return string - * - * @codeCoverageIgnore - */ - public function getInputEncoding() - { - return $this->inputEncoding; - } - - /** - * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns). - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetInfo($pFilename) - { - // Open file - $this->canReadOrBust($pFilename); - $fileHandle = $this->fileHandle; - rewind($fileHandle); - - $worksheetInfo = []; - $worksheetInfo[0]['worksheetName'] = basename($pFilename, '.slk'); - - // loop through one row (line) at a time in the file - $rowIndex = 0; - $columnIndex = 0; - while (($rowData = fgets($fileHandle)) !== false) { - $columnIndex = 0; - - // convert SYLK encoded $rowData to UTF-8 - $rowData = StringHelper::SYLKtoUTF8($rowData); - - // explode each row at semicolons while taking into account that literal semicolon (;) - // is escaped like this (;;) - $rowData = explode("\t", str_replace('¤', ';', str_replace(';', "\t", str_replace(';;', '¤', rtrim($rowData))))); - - $dataType = array_shift($rowData); - if ($dataType == 'B') { - foreach ($rowData as $rowDatum) { - switch ($rowDatum[0]) { - case 'X': - $columnIndex = substr($rowDatum, 1) - 1; - - break; - case 'Y': - $rowIndex = substr($rowDatum, 1); - - break; - } - } - - break; - } - } - - $worksheetInfo[0]['lastColumnIndex'] = $columnIndex; - $worksheetInfo[0]['totalRows'] = $rowIndex; - $worksheetInfo[0]['lastColumnLetter'] = Coordinate::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex'] + 1); - $worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1; - - // Close file - fclose($fileHandle); - - return $worksheetInfo; - } - - /** - * Loads PhpSpreadsheet from file. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function load($pFilename) - { - // Create new Spreadsheet - $spreadsheet = new Spreadsheet(); - - // Load into this instance - return $this->loadIntoExisting($pFilename, $spreadsheet); - } - - private $colorArray = [ - 'FF00FFFF', // 0 - cyan - 'FF000000', // 1 - black - 'FFFFFFFF', // 2 - white - 'FFFF0000', // 3 - red - 'FF00FF00', // 4 - green - 'FF0000FF', // 5 - blue - 'FFFFFF00', // 6 - yellow - 'FFFF00FF', // 7 - magenta - ]; - - private $fontStyleMappings = [ - 'B' => 'bold', - 'I' => 'italic', - 'U' => 'underline', - ]; - - private function processFormula(string $rowDatum, bool &$hasCalculatedValue, string &$cellDataFormula, string $row, string $column): void - { - $cellDataFormula = '=' . substr($rowDatum, 1); - // Convert R1C1 style references to A1 style references (but only when not quoted) - $temp = explode('"', $cellDataFormula); - $key = false; - foreach ($temp as &$value) { - // Only count/replace in alternate array entries - if ($key = !$key) { - preg_match_all('/(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))/', $value, $cellReferences, PREG_SET_ORDER + PREG_OFFSET_CAPTURE); - // Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way - // through the formula from left to right. Reversing means that we work right to left.through - // the formula - $cellReferences = array_reverse($cellReferences); - // Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent, - // then modify the formula to use that new reference - foreach ($cellReferences as $cellReference) { - $rowReference = $cellReference[2][0]; - // Empty R reference is the current row - if ($rowReference == '') { - $rowReference = $row; - } - // Bracketed R references are relative to the current row - if ($rowReference[0] == '[') { - $rowReference = $row + trim($rowReference, '[]'); - } - $columnReference = $cellReference[4][0]; - // Empty C reference is the current column - if ($columnReference == '') { - $columnReference = $column; - } - // Bracketed C references are relative to the current column - if ($columnReference[0] == '[') { - $columnReference = $column + trim($columnReference, '[]'); - } - $A1CellReference = Coordinate::stringFromColumnIndex($columnReference) . $rowReference; - - $value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0])); - } - } - } - unset($value); - // Then rebuild the formula string - $cellDataFormula = implode('"', $temp); - $hasCalculatedValue = true; - } - - private function processCRecord(array $rowData, Spreadsheet &$spreadsheet, string &$row, string &$column): void - { - // Read cell value data - $hasCalculatedValue = false; - $cellDataFormula = $cellData = ''; - foreach ($rowData as $rowDatum) { - switch ($rowDatum[0]) { - case 'C': - case 'X': - $column = substr($rowDatum, 1); - - break; - case 'R': - case 'Y': - $row = substr($rowDatum, 1); - - break; - case 'K': - $cellData = substr($rowDatum, 1); - - break; - case 'E': - $this->processFormula($rowDatum, $hasCalculatedValue, $cellDataFormula, $row, $column); - - break; - } - } - $columnLetter = Coordinate::stringFromColumnIndex((int) $column); - $cellData = Calculation::unwrapResult($cellData); - - // Set cell value - $this->processCFinal($spreadsheet, $hasCalculatedValue, $cellDataFormula, $cellData, "$columnLetter$row"); - } - - private function processCFinal(Spreadsheet &$spreadsheet, bool $hasCalculatedValue, string $cellDataFormula, string $cellData, string $coordinate): void - { - // Set cell value - $spreadsheet->getActiveSheet()->getCell($coordinate)->setValue(($hasCalculatedValue) ? $cellDataFormula : $cellData); - if ($hasCalculatedValue) { - $cellData = Calculation::unwrapResult($cellData); - $spreadsheet->getActiveSheet()->getCell($coordinate)->setCalculatedValue($cellData); - } - } - - private function processFRecord(array $rowData, Spreadsheet &$spreadsheet, string &$row, string &$column): void - { - // Read cell formatting - $formatStyle = $columnWidth = ''; - $startCol = $endCol = ''; - $fontStyle = ''; - $styleData = []; - foreach ($rowData as $rowDatum) { - switch ($rowDatum[0]) { - case 'C': - case 'X': - $column = substr($rowDatum, 1); - - break; - case 'R': - case 'Y': - $row = substr($rowDatum, 1); - - break; - case 'P': - $formatStyle = $rowDatum; - - break; - case 'W': - [$startCol, $endCol, $columnWidth] = explode(' ', substr($rowDatum, 1)); - - break; - case 'S': - $this->styleSettings($rowDatum, $styleData, $fontStyle); - - break; - } - } - $this->addFormats($spreadsheet, $formatStyle, $row, $column); - $this->addFonts($spreadsheet, $fontStyle, $row, $column); - $this->addStyle($spreadsheet, $styleData, $row, $column); - $this->addWidth($spreadsheet, $columnWidth, $startCol, $endCol); - } - - private $styleSettingsFont = ['D' => 'bold', 'I' => 'italic']; - - private $styleSettingsBorder = [ - 'B' => 'bottom', - 'L' => 'left', - 'R' => 'right', - 'T' => 'top', - ]; - - private function styleSettings(string $rowDatum, array &$styleData, string &$fontStyle): void - { - $styleSettings = substr($rowDatum, 1); - $iMax = strlen($styleSettings); - for ($i = 0; $i < $iMax; ++$i) { - $char = $styleSettings[$i]; - if (array_key_exists($char, $this->styleSettingsFont)) { - $styleData['font'][$this->styleSettingsFont[$char]] = true; - } elseif (array_key_exists($char, $this->styleSettingsBorder)) { - $styleData['borders'][$this->styleSettingsBorder[$char]]['borderStyle'] = Border::BORDER_THIN; - } elseif ($char == 'S') { - $styleData['fill']['fillType'] = \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_PATTERN_GRAY125; - } elseif ($char == 'M') { - if (preg_match('/M([1-9]\\d*)/', $styleSettings, $matches)) { - $fontStyle = $matches[1]; - } - } - } - } - - private function addFormats(Spreadsheet &$spreadsheet, string $formatStyle, string $row, string $column): void - { - if ($formatStyle && $column > '' && $row > '') { - $columnLetter = Coordinate::stringFromColumnIndex((int) $column); - if (isset($this->formats[$formatStyle])) { - $spreadsheet->getActiveSheet()->getStyle($columnLetter . $row)->applyFromArray($this->formats[$formatStyle]); - } - } - } - - private function addFonts(Spreadsheet &$spreadsheet, string $fontStyle, string $row, string $column): void - { - if ($fontStyle && $column > '' && $row > '') { - $columnLetter = Coordinate::stringFromColumnIndex((int) $column); - if (isset($this->fonts[$fontStyle])) { - $spreadsheet->getActiveSheet()->getStyle($columnLetter . $row)->applyFromArray($this->fonts[$fontStyle]); - } - } - } - - private function addStyle(Spreadsheet &$spreadsheet, array $styleData, string $row, string $column): void - { - if ((!empty($styleData)) && $column > '' && $row > '') { - $columnLetter = Coordinate::stringFromColumnIndex($column); - $spreadsheet->getActiveSheet()->getStyle($columnLetter . $row)->applyFromArray($styleData); - } - } - - private function addWidth(Spreadsheet $spreadsheet, string $columnWidth, string $startCol, string $endCol): void - { - if ($columnWidth > '') { - if ($startCol == $endCol) { - $startCol = Coordinate::stringFromColumnIndex((int) $startCol); - $spreadsheet->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth); - } else { - $startCol = Coordinate::stringFromColumnIndex($startCol); - $endCol = Coordinate::stringFromColumnIndex($endCol); - $spreadsheet->getActiveSheet()->getColumnDimension($startCol)->setWidth((float) $columnWidth); - do { - $spreadsheet->getActiveSheet()->getColumnDimension(++$startCol)->setWidth($columnWidth); - } while ($startCol != $endCol); - } - } - } - - private function processPRecord(array $rowData, Spreadsheet &$spreadsheet): void - { - // Read shared styles - $formatArray = []; - $fromFormats = ['\-', '\ ']; - $toFormats = ['-', ' ']; - foreach ($rowData as $rowDatum) { - switch ($rowDatum[0]) { - case 'P': - $formatArray['numberFormat']['formatCode'] = str_replace($fromFormats, $toFormats, substr($rowDatum, 1)); - - break; - case 'E': - case 'F': - $formatArray['font']['name'] = substr($rowDatum, 1); - - break; - case 'M': - $formatArray['font']['size'] = substr($rowDatum, 1) / 20; - - break; - case 'L': - $this->processPColors($rowDatum, $formatArray); - - break; - case 'S': - $this->processPFontStyles($rowDatum, $formatArray); - - break; - } - } - $this->processPFinal($spreadsheet, $formatArray); - } - - private function processPColors(string $rowDatum, array &$formatArray): void - { - if (preg_match('/L([1-9]\\d*)/', $rowDatum, $matches)) { - $fontColor = $matches[1] % 8; - $formatArray['font']['color']['argb'] = $this->colorArray[$fontColor]; - } - } - - private function processPFontStyles(string $rowDatum, array &$formatArray): void - { - $styleSettings = substr($rowDatum, 1); - $iMax = strlen($styleSettings); - for ($i = 0; $i < $iMax; ++$i) { - if (array_key_exists($styleSettings[$i], $this->fontStyleMappings)) { - $formatArray['font'][$this->fontStyleMappings[$styleSettings[$i]]] = true; - } - } - } - - private function processPFinal(Spreadsheet &$spreadsheet, array $formatArray): void - { - if (array_key_exists('numberFormat', $formatArray)) { - $this->formats['P' . $this->format] = $formatArray; - ++$this->format; - } elseif (array_key_exists('font', $formatArray)) { - ++$this->fontcount; - $this->fonts[$this->fontcount] = $formatArray; - if ($this->fontcount === 1) { - $spreadsheet->getDefaultStyle()->applyFromArray($formatArray); - } - } - } - - /** - * Loads PhpSpreadsheet from file into PhpSpreadsheet instance. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function loadIntoExisting($pFilename, Spreadsheet $spreadsheet) - { - // Open file - $this->canReadOrBust($pFilename); - $fileHandle = $this->fileHandle; - rewind($fileHandle); - - // Create new Worksheets - while ($spreadsheet->getSheetCount() <= $this->sheetIndex) { - $spreadsheet->createSheet(); - } - $spreadsheet->setActiveSheetIndex($this->sheetIndex); - $spreadsheet->getActiveSheet()->setTitle(basename($pFilename, '.slk')); - - // Loop through file - $column = $row = ''; - - // loop through one row (line) at a time in the file - while (($rowDataTxt = fgets($fileHandle)) !== false) { - // convert SYLK encoded $rowData to UTF-8 - $rowDataTxt = StringHelper::SYLKtoUTF8($rowDataTxt); - - // explode each row at semicolons while taking into account that literal semicolon (;) - // is escaped like this (;;) - $rowData = explode("\t", str_replace('¤', ';', str_replace(';', "\t", str_replace(';;', '¤', rtrim($rowDataTxt))))); - - $dataType = array_shift($rowData); - if ($dataType == 'P') { - // Read shared styles - $this->processPRecord($rowData, $spreadsheet); - } elseif ($dataType == 'C') { - // Read cell value data - $this->processCRecord($rowData, $spreadsheet, $row, $column); - } elseif ($dataType == 'F') { - // Read cell formatting - $this->processFRecord($rowData, $spreadsheet, $row, $column); - } else { - $this->columnRowFromRowData($rowData, $column, $row); - } - } - - // Close file - fclose($fileHandle); - - // Return - return $spreadsheet; - } - - private function columnRowFromRowData(array $rowData, string &$column, string &$row): void - { - foreach ($rowData as $rowDatum) { - $char0 = $rowDatum[0]; - if ($char0 === 'X' || $char0 == 'C') { - $column = substr($rowDatum, 1); - } elseif ($char0 === 'Y' || $char0 == 'R') { - $row = substr($rowDatum, 1); - } - } - } - - /** - * Get sheet index. - * - * @return int - */ - public function getSheetIndex() - { - return $this->sheetIndex; - } - - /** - * Set sheet index. - * - * @param int $pValue Sheet index - * - * @return $this - */ - public function setSheetIndex($pValue) - { - $this->sheetIndex = $pValue; - - return $this; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php deleted file mode 100644 index 81cc5b2..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php +++ /dev/null @@ -1,7954 +0,0 @@ -data. - * - * @var int - */ - private $dataSize; - - /** - * Current position in stream. - * - * @var int - */ - private $pos; - - /** - * Workbook to be returned by the reader. - * - * @var Spreadsheet - */ - private $spreadsheet; - - /** - * Worksheet that is currently being built by the reader. - * - * @var Worksheet - */ - private $phpSheet; - - /** - * BIFF version. - * - * @var int - */ - private $version; - - /** - * Codepage set in the Excel file being read. Only important for BIFF5 (Excel 5.0 - Excel 95) - * For BIFF8 (Excel 97 - Excel 2003) this will always have the value 'UTF-16LE'. - * - * @var string - */ - private $codepage; - - /** - * Shared formats. - * - * @var array - */ - private $formats; - - /** - * Shared fonts. - * - * @var array - */ - private $objFonts; - - /** - * Color palette. - * - * @var array - */ - private $palette; - - /** - * Worksheets. - * - * @var array - */ - private $sheets; - - /** - * External books. - * - * @var array - */ - private $externalBooks; - - /** - * REF structures. Only applies to BIFF8. - * - * @var array - */ - private $ref; - - /** - * External names. - * - * @var array - */ - private $externalNames; - - /** - * Defined names. - * - * @var array - */ - private $definedname; - - /** - * Shared strings. Only applies to BIFF8. - * - * @var array - */ - private $sst; - - /** - * Panes are frozen? (in sheet currently being read). See WINDOW2 record. - * - * @var bool - */ - private $frozen; - - /** - * Fit printout to number of pages? (in sheet currently being read). See SHEETPR record. - * - * @var bool - */ - private $isFitToPages; - - /** - * Objects. One OBJ record contributes with one entry. - * - * @var array - */ - private $objs; - - /** - * Text Objects. One TXO record corresponds with one entry. - * - * @var array - */ - private $textObjects; - - /** - * Cell Annotations (BIFF8). - * - * @var array - */ - private $cellNotes; - - /** - * The combined MSODRAWINGGROUP data. - * - * @var string - */ - private $drawingGroupData; - - /** - * The combined MSODRAWING data (per sheet). - * - * @var string - */ - private $drawingData; - - /** - * Keep track of XF index. - * - * @var int - */ - private $xfIndex; - - /** - * Mapping of XF index (that is a cell XF) to final index in cellXf collection. - * - * @var array - */ - private $mapCellXfIndex; - - /** - * Mapping of XF index (that is a style XF) to final index in cellStyleXf collection. - * - * @var array - */ - private $mapCellStyleXfIndex; - - /** - * The shared formulas in a sheet. One SHAREDFMLA record contributes with one value. - * - * @var array - */ - private $sharedFormulas; - - /** - * The shared formula parts in a sheet. One FORMULA record contributes with one value if it - * refers to a shared formula. - * - * @var array - */ - private $sharedFormulaParts; - - /** - * The type of encryption in use. - * - * @var int - */ - private $encryption = 0; - - /** - * The position in the stream after which contents are encrypted. - * - * @var int - */ - private $encryptionStartPos = false; - - /** - * The current RC4 decryption object. - * - * @var Xls\RC4 - */ - private $rc4Key; - - /** - * The position in the stream that the RC4 decryption object was left at. - * - * @var int - */ - private $rc4Pos = 0; - - /** - * The current MD5 context state. - * - * @var string - */ - private $md5Ctxt; - - /** - * @var int - */ - private $textObjRef; - - /** - * @var string - */ - private $baseCell; - - /** - * Create a new Xls Reader instance. - */ - public function __construct() - { - parent::__construct(); - } - - /** - * Can the current IReader read the file? - * - * @param string $pFilename - * - * @return bool - */ - public function canRead($pFilename) - { - File::assertFile($pFilename); - - try { - // Use ParseXL for the hard work. - $ole = new OLERead(); - - // get excel data - $ole->read($pFilename); - - return true; - } catch (PhpSpreadsheetException $e) { - return false; - } - } - - public function setCodepage(string $codepage): void - { - if (!CodePage::validate($codepage)) { - throw new PhpSpreadsheetException('Unknown codepage: ' . $codepage); - } - - $this->codepage = $codepage; - } - - /** - * Reads names of the worksheets from a file, without parsing the whole file to a PhpSpreadsheet object. - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetNames($pFilename) - { - File::assertFile($pFilename); - - $worksheetNames = []; - - // Read the OLE file - $this->loadOLE($pFilename); - - // total byte size of Excel data (workbook global substream + sheet substreams) - $this->dataSize = strlen($this->data); - - $this->pos = 0; - $this->sheets = []; - - // Parse Workbook Global Substream - while ($this->pos < $this->dataSize) { - $code = self::getUInt2d($this->data, $this->pos); - - switch ($code) { - case self::XLS_TYPE_BOF: - $this->readBof(); - - break; - case self::XLS_TYPE_SHEET: - $this->readSheet(); - - break; - case self::XLS_TYPE_EOF: - $this->readDefault(); - - break 2; - default: - $this->readDefault(); - - break; - } - } - - foreach ($this->sheets as $sheet) { - if ($sheet['sheetType'] != 0x00) { - // 0x00: Worksheet, 0x02: Chart, 0x06: Visual Basic module - continue; - } - - $worksheetNames[] = $sheet['name']; - } - - return $worksheetNames; - } - - /** - * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns). - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetInfo($pFilename) - { - File::assertFile($pFilename); - - $worksheetInfo = []; - - // Read the OLE file - $this->loadOLE($pFilename); - - // total byte size of Excel data (workbook global substream + sheet substreams) - $this->dataSize = strlen($this->data); - - // initialize - $this->pos = 0; - $this->sheets = []; - - // Parse Workbook Global Substream - while ($this->pos < $this->dataSize) { - $code = self::getUInt2d($this->data, $this->pos); - - switch ($code) { - case self::XLS_TYPE_BOF: - $this->readBof(); - - break; - case self::XLS_TYPE_SHEET: - $this->readSheet(); - - break; - case self::XLS_TYPE_EOF: - $this->readDefault(); - - break 2; - default: - $this->readDefault(); - - break; - } - } - - // Parse the individual sheets - foreach ($this->sheets as $sheet) { - if ($sheet['sheetType'] != 0x00) { - // 0x00: Worksheet - // 0x02: Chart - // 0x06: Visual Basic module - continue; - } - - $tmpInfo = []; - $tmpInfo['worksheetName'] = $sheet['name']; - $tmpInfo['lastColumnLetter'] = 'A'; - $tmpInfo['lastColumnIndex'] = 0; - $tmpInfo['totalRows'] = 0; - $tmpInfo['totalColumns'] = 0; - - $this->pos = $sheet['offset']; - - while ($this->pos <= $this->dataSize - 4) { - $code = self::getUInt2d($this->data, $this->pos); - - switch ($code) { - case self::XLS_TYPE_RK: - case self::XLS_TYPE_LABELSST: - case self::XLS_TYPE_NUMBER: - case self::XLS_TYPE_FORMULA: - case self::XLS_TYPE_BOOLERR: - case self::XLS_TYPE_LABEL: - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - $rowIndex = self::getUInt2d($recordData, 0) + 1; - $columnIndex = self::getUInt2d($recordData, 2); - - $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex); - $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex); - - break; - case self::XLS_TYPE_BOF: - $this->readBof(); - - break; - case self::XLS_TYPE_EOF: - $this->readDefault(); - - break 2; - default: - $this->readDefault(); - - break; - } - } - - $tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1); - $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1; - - $worksheetInfo[] = $tmpInfo; - } - - return $worksheetInfo; - } - - /** - * Loads PhpSpreadsheet from file. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function load($pFilename) - { - // Read the OLE file - $this->loadOLE($pFilename); - - // Initialisations - $this->spreadsheet = new Spreadsheet(); - $this->spreadsheet->removeSheetByIndex(0); // remove 1st sheet - if (!$this->readDataOnly) { - $this->spreadsheet->removeCellStyleXfByIndex(0); // remove the default style - $this->spreadsheet->removeCellXfByIndex(0); // remove the default style - } - - // Read the summary information stream (containing meta data) - $this->readSummaryInformation(); - - // Read the Additional document summary information stream (containing application-specific meta data) - $this->readDocumentSummaryInformation(); - - // total byte size of Excel data (workbook global substream + sheet substreams) - $this->dataSize = strlen($this->data); - - // initialize - $this->pos = 0; - $this->codepage = $this->codepage ?: CodePage::DEFAULT_CODE_PAGE; - $this->formats = []; - $this->objFonts = []; - $this->palette = []; - $this->sheets = []; - $this->externalBooks = []; - $this->ref = []; - $this->definedname = []; - $this->sst = []; - $this->drawingGroupData = ''; - $this->xfIndex = ''; - $this->mapCellXfIndex = []; - $this->mapCellStyleXfIndex = []; - - // Parse Workbook Global Substream - while ($this->pos < $this->dataSize) { - $code = self::getUInt2d($this->data, $this->pos); - - switch ($code) { - case self::XLS_TYPE_BOF: - $this->readBof(); - - break; - case self::XLS_TYPE_FILEPASS: - $this->readFilepass(); - - break; - case self::XLS_TYPE_CODEPAGE: - $this->readCodepage(); - - break; - case self::XLS_TYPE_DATEMODE: - $this->readDateMode(); - - break; - case self::XLS_TYPE_FONT: - $this->readFont(); - - break; - case self::XLS_TYPE_FORMAT: - $this->readFormat(); - - break; - case self::XLS_TYPE_XF: - $this->readXf(); - - break; - case self::XLS_TYPE_XFEXT: - $this->readXfExt(); - - break; - case self::XLS_TYPE_STYLE: - $this->readStyle(); - - break; - case self::XLS_TYPE_PALETTE: - $this->readPalette(); - - break; - case self::XLS_TYPE_SHEET: - $this->readSheet(); - - break; - case self::XLS_TYPE_EXTERNALBOOK: - $this->readExternalBook(); - - break; - case self::XLS_TYPE_EXTERNNAME: - $this->readExternName(); - - break; - case self::XLS_TYPE_EXTERNSHEET: - $this->readExternSheet(); - - break; - case self::XLS_TYPE_DEFINEDNAME: - $this->readDefinedName(); - - break; - case self::XLS_TYPE_MSODRAWINGGROUP: - $this->readMsoDrawingGroup(); - - break; - case self::XLS_TYPE_SST: - $this->readSst(); - - break; - case self::XLS_TYPE_EOF: - $this->readDefault(); - - break 2; - default: - $this->readDefault(); - - break; - } - } - - // Resolve indexed colors for font, fill, and border colors - // Cannot be resolved already in XF record, because PALETTE record comes afterwards - if (!$this->readDataOnly) { - foreach ($this->objFonts as $objFont) { - if (isset($objFont->colorIndex)) { - $color = Xls\Color::map($objFont->colorIndex, $this->palette, $this->version); - $objFont->getColor()->setRGB($color['rgb']); - } - } - - foreach ($this->spreadsheet->getCellXfCollection() as $objStyle) { - // fill start and end color - $fill = $objStyle->getFill(); - - if (isset($fill->startcolorIndex)) { - $startColor = Xls\Color::map($fill->startcolorIndex, $this->palette, $this->version); - $fill->getStartColor()->setRGB($startColor['rgb']); - } - if (isset($fill->endcolorIndex)) { - $endColor = Xls\Color::map($fill->endcolorIndex, $this->palette, $this->version); - $fill->getEndColor()->setRGB($endColor['rgb']); - } - - // border colors - $top = $objStyle->getBorders()->getTop(); - $right = $objStyle->getBorders()->getRight(); - $bottom = $objStyle->getBorders()->getBottom(); - $left = $objStyle->getBorders()->getLeft(); - $diagonal = $objStyle->getBorders()->getDiagonal(); - - if (isset($top->colorIndex)) { - $borderTopColor = Xls\Color::map($top->colorIndex, $this->palette, $this->version); - $top->getColor()->setRGB($borderTopColor['rgb']); - } - if (isset($right->colorIndex)) { - $borderRightColor = Xls\Color::map($right->colorIndex, $this->palette, $this->version); - $right->getColor()->setRGB($borderRightColor['rgb']); - } - if (isset($bottom->colorIndex)) { - $borderBottomColor = Xls\Color::map($bottom->colorIndex, $this->palette, $this->version); - $bottom->getColor()->setRGB($borderBottomColor['rgb']); - } - if (isset($left->colorIndex)) { - $borderLeftColor = Xls\Color::map($left->colorIndex, $this->palette, $this->version); - $left->getColor()->setRGB($borderLeftColor['rgb']); - } - if (isset($diagonal->colorIndex)) { - $borderDiagonalColor = Xls\Color::map($diagonal->colorIndex, $this->palette, $this->version); - $diagonal->getColor()->setRGB($borderDiagonalColor['rgb']); - } - } - } - - // treat MSODRAWINGGROUP records, workbook-level Escher - if (!$this->readDataOnly && $this->drawingGroupData) { - $escherWorkbook = new Escher(); - $reader = new Xls\Escher($escherWorkbook); - $escherWorkbook = $reader->load($this->drawingGroupData); - } - - // Parse the individual sheets - foreach ($this->sheets as $sheet) { - if ($sheet['sheetType'] != 0x00) { - // 0x00: Worksheet, 0x02: Chart, 0x06: Visual Basic module - continue; - } - - // check if sheet should be skipped - if (isset($this->loadSheetsOnly) && !in_array($sheet['name'], $this->loadSheetsOnly)) { - continue; - } - - // add sheet to PhpSpreadsheet object - $this->phpSheet = $this->spreadsheet->createSheet(); - // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in formula - // cells... during the load, all formulae should be correct, and we're simply bringing the worksheet - // name in line with the formula, not the reverse - $this->phpSheet->setTitle($sheet['name'], false, false); - $this->phpSheet->setSheetState($sheet['sheetState']); - - $this->pos = $sheet['offset']; - - // Initialize isFitToPages. May change after reading SHEETPR record. - $this->isFitToPages = false; - - // Initialize drawingData - $this->drawingData = ''; - - // Initialize objs - $this->objs = []; - - // Initialize shared formula parts - $this->sharedFormulaParts = []; - - // Initialize shared formulas - $this->sharedFormulas = []; - - // Initialize text objs - $this->textObjects = []; - - // Initialize cell annotations - $this->cellNotes = []; - $this->textObjRef = -1; - - while ($this->pos <= $this->dataSize - 4) { - $code = self::getUInt2d($this->data, $this->pos); - - switch ($code) { - case self::XLS_TYPE_BOF: - $this->readBof(); - - break; - case self::XLS_TYPE_PRINTGRIDLINES: - $this->readPrintGridlines(); - - break; - case self::XLS_TYPE_DEFAULTROWHEIGHT: - $this->readDefaultRowHeight(); - - break; - case self::XLS_TYPE_SHEETPR: - $this->readSheetPr(); - - break; - case self::XLS_TYPE_HORIZONTALPAGEBREAKS: - $this->readHorizontalPageBreaks(); - - break; - case self::XLS_TYPE_VERTICALPAGEBREAKS: - $this->readVerticalPageBreaks(); - - break; - case self::XLS_TYPE_HEADER: - $this->readHeader(); - - break; - case self::XLS_TYPE_FOOTER: - $this->readFooter(); - - break; - case self::XLS_TYPE_HCENTER: - $this->readHcenter(); - - break; - case self::XLS_TYPE_VCENTER: - $this->readVcenter(); - - break; - case self::XLS_TYPE_LEFTMARGIN: - $this->readLeftMargin(); - - break; - case self::XLS_TYPE_RIGHTMARGIN: - $this->readRightMargin(); - - break; - case self::XLS_TYPE_TOPMARGIN: - $this->readTopMargin(); - - break; - case self::XLS_TYPE_BOTTOMMARGIN: - $this->readBottomMargin(); - - break; - case self::XLS_TYPE_PAGESETUP: - $this->readPageSetup(); - - break; - case self::XLS_TYPE_PROTECT: - $this->readProtect(); - - break; - case self::XLS_TYPE_SCENPROTECT: - $this->readScenProtect(); - - break; - case self::XLS_TYPE_OBJECTPROTECT: - $this->readObjectProtect(); - - break; - case self::XLS_TYPE_PASSWORD: - $this->readPassword(); - - break; - case self::XLS_TYPE_DEFCOLWIDTH: - $this->readDefColWidth(); - - break; - case self::XLS_TYPE_COLINFO: - $this->readColInfo(); - - break; - case self::XLS_TYPE_DIMENSION: - $this->readDefault(); - - break; - case self::XLS_TYPE_ROW: - $this->readRow(); - - break; - case self::XLS_TYPE_DBCELL: - $this->readDefault(); - - break; - case self::XLS_TYPE_RK: - $this->readRk(); - - break; - case self::XLS_TYPE_LABELSST: - $this->readLabelSst(); - - break; - case self::XLS_TYPE_MULRK: - $this->readMulRk(); - - break; - case self::XLS_TYPE_NUMBER: - $this->readNumber(); - - break; - case self::XLS_TYPE_FORMULA: - $this->readFormula(); - - break; - case self::XLS_TYPE_SHAREDFMLA: - $this->readSharedFmla(); - - break; - case self::XLS_TYPE_BOOLERR: - $this->readBoolErr(); - - break; - case self::XLS_TYPE_MULBLANK: - $this->readMulBlank(); - - break; - case self::XLS_TYPE_LABEL: - $this->readLabel(); - - break; - case self::XLS_TYPE_BLANK: - $this->readBlank(); - - break; - case self::XLS_TYPE_MSODRAWING: - $this->readMsoDrawing(); - - break; - case self::XLS_TYPE_OBJ: - $this->readObj(); - - break; - case self::XLS_TYPE_WINDOW2: - $this->readWindow2(); - - break; - case self::XLS_TYPE_PAGELAYOUTVIEW: - $this->readPageLayoutView(); - - break; - case self::XLS_TYPE_SCL: - $this->readScl(); - - break; - case self::XLS_TYPE_PANE: - $this->readPane(); - - break; - case self::XLS_TYPE_SELECTION: - $this->readSelection(); - - break; - case self::XLS_TYPE_MERGEDCELLS: - $this->readMergedCells(); - - break; - case self::XLS_TYPE_HYPERLINK: - $this->readHyperLink(); - - break; - case self::XLS_TYPE_DATAVALIDATIONS: - $this->readDataValidations(); - - break; - case self::XLS_TYPE_DATAVALIDATION: - $this->readDataValidation(); - - break; - case self::XLS_TYPE_SHEETLAYOUT: - $this->readSheetLayout(); - - break; - case self::XLS_TYPE_SHEETPROTECTION: - $this->readSheetProtection(); - - break; - case self::XLS_TYPE_RANGEPROTECTION: - $this->readRangeProtection(); - - break; - case self::XLS_TYPE_NOTE: - $this->readNote(); - - break; - case self::XLS_TYPE_TXO: - $this->readTextObject(); - - break; - case self::XLS_TYPE_CONTINUE: - $this->readContinue(); - - break; - case self::XLS_TYPE_EOF: - $this->readDefault(); - - break 2; - default: - $this->readDefault(); - - break; - } - } - - // treat MSODRAWING records, sheet-level Escher - if (!$this->readDataOnly && $this->drawingData) { - $escherWorksheet = new Escher(); - $reader = new Xls\Escher($escherWorksheet); - $escherWorksheet = $reader->load($this->drawingData); - - // get all spContainers in one long array, so they can be mapped to OBJ records - $allSpContainers = $escherWorksheet->getDgContainer()->getSpgrContainer()->getAllSpContainers(); - } - - // treat OBJ records - foreach ($this->objs as $n => $obj) { - // the first shape container never has a corresponding OBJ record, hence $n + 1 - if (isset($allSpContainers[$n + 1]) && is_object($allSpContainers[$n + 1])) { - $spContainer = $allSpContainers[$n + 1]; - - // we skip all spContainers that are a part of a group shape since we cannot yet handle those - if ($spContainer->getNestingLevel() > 1) { - continue; - } - - // calculate the width and height of the shape - [$startColumn, $startRow] = Coordinate::coordinateFromString($spContainer->getStartCoordinates()); - [$endColumn, $endRow] = Coordinate::coordinateFromString($spContainer->getEndCoordinates()); - - $startOffsetX = $spContainer->getStartOffsetX(); - $startOffsetY = $spContainer->getStartOffsetY(); - $endOffsetX = $spContainer->getEndOffsetX(); - $endOffsetY = $spContainer->getEndOffsetY(); - - $width = \PhpOffice\PhpSpreadsheet\Shared\Xls::getDistanceX($this->phpSheet, $startColumn, $startOffsetX, $endColumn, $endOffsetX); - $height = \PhpOffice\PhpSpreadsheet\Shared\Xls::getDistanceY($this->phpSheet, $startRow, $startOffsetY, $endRow, $endOffsetY); - - // calculate offsetX and offsetY of the shape - $offsetX = $startOffsetX * \PhpOffice\PhpSpreadsheet\Shared\Xls::sizeCol($this->phpSheet, $startColumn) / 1024; - $offsetY = $startOffsetY * \PhpOffice\PhpSpreadsheet\Shared\Xls::sizeRow($this->phpSheet, $startRow) / 256; - - switch ($obj['otObjType']) { - case 0x19: - // Note - if (isset($this->cellNotes[$obj['idObjID']])) { - $cellNote = $this->cellNotes[$obj['idObjID']]; - - if (isset($this->textObjects[$obj['idObjID']])) { - $textObject = $this->textObjects[$obj['idObjID']]; - $this->cellNotes[$obj['idObjID']]['objTextData'] = $textObject; - } - } - - break; - case 0x08: - // picture - // get index to BSE entry (1-based) - $BSEindex = $spContainer->getOPT(0x0104); - - // If there is no BSE Index, we will fail here and other fields are not read. - // Fix by checking here. - // TODO: Why is there no BSE Index? Is this a new Office Version? Password protected field? - // More likely : a uncompatible picture - if (!$BSEindex) { - continue 2; - } - - $BSECollection = $escherWorkbook->getDggContainer()->getBstoreContainer()->getBSECollection(); - $BSE = $BSECollection[$BSEindex - 1]; - $blipType = $BSE->getBlipType(); - - // need check because some blip types are not supported by Escher reader such as EMF - if ($blip = $BSE->getBlip()) { - $ih = imagecreatefromstring($blip->getData()); - $drawing = new MemoryDrawing(); - $drawing->setImageResource($ih); - - // width, height, offsetX, offsetY - $drawing->setResizeProportional(false); - $drawing->setWidth($width); - $drawing->setHeight($height); - $drawing->setOffsetX($offsetX); - $drawing->setOffsetY($offsetY); - - switch ($blipType) { - case BSE::BLIPTYPE_JPEG: - $drawing->setRenderingFunction(MemoryDrawing::RENDERING_JPEG); - $drawing->setMimeType(MemoryDrawing::MIMETYPE_JPEG); - - break; - case BSE::BLIPTYPE_PNG: - $drawing->setRenderingFunction(MemoryDrawing::RENDERING_PNG); - $drawing->setMimeType(MemoryDrawing::MIMETYPE_PNG); - - break; - } - - $drawing->setWorksheet($this->phpSheet); - $drawing->setCoordinates($spContainer->getStartCoordinates()); - } - - break; - default: - // other object type - break; - } - } - } - - // treat SHAREDFMLA records - if ($this->version == self::XLS_BIFF8) { - foreach ($this->sharedFormulaParts as $cell => $baseCell) { - [$column, $row] = Coordinate::coordinateFromString($cell); - if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($column, $row, $this->phpSheet->getTitle())) { - $formula = $this->getFormulaFromStructure($this->sharedFormulas[$baseCell], $cell); - $this->phpSheet->getCell($cell)->setValueExplicit('=' . $formula, DataType::TYPE_FORMULA); - } - } - } - - if (!empty($this->cellNotes)) { - foreach ($this->cellNotes as $note => $noteDetails) { - if (!isset($noteDetails['objTextData'])) { - if (isset($this->textObjects[$note])) { - $textObject = $this->textObjects[$note]; - $noteDetails['objTextData'] = $textObject; - } else { - $noteDetails['objTextData']['text'] = ''; - } - } - $cellAddress = str_replace('$', '', $noteDetails['cellRef']); - $this->phpSheet->getComment($cellAddress)->setAuthor($noteDetails['author'])->setText($this->parseRichText($noteDetails['objTextData']['text'])); - } - } - } - - // add the named ranges (defined names) - foreach ($this->definedname as $definedName) { - if ($definedName['isBuiltInName']) { - switch ($definedName['name']) { - case pack('C', 0x06): - // print area - // in general, formula looks like this: Foo!$C$7:$J$66,Bar!$A$1:$IV$2 - $ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma? - - $extractedRanges = []; - foreach ($ranges as $range) { - // $range should look like one of these - // Foo!$C$7:$J$66 - // Bar!$A$1:$IV$2 - $explodes = Worksheet::extractSheetTitle($range, true); - $sheetName = trim($explodes[0], "'"); - if (count($explodes) == 2) { - if (strpos($explodes[1], ':') === false) { - $explodes[1] = $explodes[1] . ':' . $explodes[1]; - } - $extractedRanges[] = str_replace('$', '', $explodes[1]); // C7:J66 - } - } - if ($docSheet = $this->spreadsheet->getSheetByName($sheetName)) { - $docSheet->getPageSetup()->setPrintArea(implode(',', $extractedRanges)); // C7:J66,A1:IV2 - } - - break; - case pack('C', 0x07): - // print titles (repeating rows) - // Assuming BIFF8, there are 3 cases - // 1. repeating rows - // formula looks like this: Sheet!$A$1:$IV$2 - // rows 1-2 repeat - // 2. repeating columns - // formula looks like this: Sheet!$A$1:$B$65536 - // columns A-B repeat - // 3. both repeating rows and repeating columns - // formula looks like this: Sheet!$A$1:$B$65536,Sheet!$A$1:$IV$2 - $ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma? - foreach ($ranges as $range) { - // $range should look like this one of these - // Sheet!$A$1:$B$65536 - // Sheet!$A$1:$IV$2 - if (strpos($range, '!') !== false) { - $explodes = Worksheet::extractSheetTitle($range, true); - if ($docSheet = $this->spreadsheet->getSheetByName($explodes[0])) { - $extractedRange = $explodes[1]; - $extractedRange = str_replace('$', '', $extractedRange); - - $coordinateStrings = explode(':', $extractedRange); - if (count($coordinateStrings) == 2) { - [$firstColumn, $firstRow] = Coordinate::coordinateFromString($coordinateStrings[0]); - [$lastColumn, $lastRow] = Coordinate::coordinateFromString($coordinateStrings[1]); - - if ($firstColumn == 'A' && $lastColumn == 'IV') { - // then we have repeating rows - $docSheet->getPageSetup()->setRowsToRepeatAtTop([$firstRow, $lastRow]); - } elseif ($firstRow == 1 && $lastRow == 65536) { - // then we have repeating columns - $docSheet->getPageSetup()->setColumnsToRepeatAtLeft([$firstColumn, $lastColumn]); - } - } - } - } - } - - break; - } - } else { - // Extract range - if (strpos($definedName['formula'], '!') !== false) { - $explodes = Worksheet::extractSheetTitle($definedName['formula'], true); - if ( - ($docSheet = $this->spreadsheet->getSheetByName($explodes[0])) || - ($docSheet = $this->spreadsheet->getSheetByName(trim($explodes[0], "'"))) - ) { - $extractedRange = $explodes[1]; - $extractedRange = str_replace('$', '', $extractedRange); - - $localOnly = ($definedName['scope'] == 0) ? false : true; - - $scope = ($definedName['scope'] == 0) ? null : $this->spreadsheet->getSheetByName($this->sheets[$definedName['scope'] - 1]['name']); - - $this->spreadsheet->addNamedRange(new NamedRange((string) $definedName['name'], $docSheet, $extractedRange, $localOnly, $scope)); - } - } - // Named Value - // TODO Provide support for named values - } - } - $this->data = null; - - return $this->spreadsheet; - } - - /** - * Read record data from stream, decrypting as required. - * - * @param string $data Data stream to read from - * @param int $pos Position to start reading from - * @param int $len Record data length - * - * @return string Record data - */ - private function readRecordData($data, $pos, $len) - { - $data = substr($data, $pos, $len); - - // File not encrypted, or record before encryption start point - if ($this->encryption == self::MS_BIFF_CRYPTO_NONE || $pos < $this->encryptionStartPos) { - return $data; - } - - $recordData = ''; - if ($this->encryption == self::MS_BIFF_CRYPTO_RC4) { - $oldBlock = floor($this->rc4Pos / self::REKEY_BLOCK); - $block = floor($pos / self::REKEY_BLOCK); - $endBlock = floor(($pos + $len) / self::REKEY_BLOCK); - - // Spin an RC4 decryptor to the right spot. If we have a decryptor sitting - // at a point earlier in the current block, re-use it as we can save some time. - if ($block != $oldBlock || $pos < $this->rc4Pos || !$this->rc4Key) { - $this->rc4Key = $this->makeKey($block, $this->md5Ctxt); - $step = $pos % self::REKEY_BLOCK; - } else { - $step = $pos - $this->rc4Pos; - } - $this->rc4Key->RC4(str_repeat("\0", $step)); - - // Decrypt record data (re-keying at the end of every block) - while ($block != $endBlock) { - $step = self::REKEY_BLOCK - ($pos % self::REKEY_BLOCK); - $recordData .= $this->rc4Key->RC4(substr($data, 0, $step)); - $data = substr($data, $step); - $pos += $step; - $len -= $step; - ++$block; - $this->rc4Key = $this->makeKey($block, $this->md5Ctxt); - } - $recordData .= $this->rc4Key->RC4(substr($data, 0, $len)); - - // Keep track of the position of this decryptor. - // We'll try and re-use it later if we can to speed things up - $this->rc4Pos = $pos + $len; - } elseif ($this->encryption == self::MS_BIFF_CRYPTO_XOR) { - throw new Exception('XOr encryption not supported'); - } - - return $recordData; - } - - /** - * Use OLE reader to extract the relevant data streams from the OLE file. - * - * @param string $pFilename - */ - private function loadOLE($pFilename): void - { - // OLE reader - $ole = new OLERead(); - // get excel data, - $ole->read($pFilename); - // Get workbook data: workbook stream + sheet streams - $this->data = $ole->getStream($ole->wrkbook); - // Get summary information data - $this->summaryInformation = $ole->getStream($ole->summaryInformation); - // Get additional document summary information data - $this->documentSummaryInformation = $ole->getStream($ole->documentSummaryInformation); - } - - /** - * Read summary information. - */ - private function readSummaryInformation(): void - { - if (!isset($this->summaryInformation)) { - return; - } - - // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) - // offset: 2; size: 2; - // offset: 4; size: 2; OS version - // offset: 6; size: 2; OS indicator - // offset: 8; size: 16 - // offset: 24; size: 4; section count - $secCount = self::getInt4d($this->summaryInformation, 24); - - // offset: 28; size: 16; first section's class id: e0 85 9f f2 f9 4f 68 10 ab 91 08 00 2b 27 b3 d9 - // offset: 44; size: 4 - $secOffset = self::getInt4d($this->summaryInformation, 44); - - // section header - // offset: $secOffset; size: 4; section length - $secLength = self::getInt4d($this->summaryInformation, $secOffset); - - // offset: $secOffset+4; size: 4; property count - $countProperties = self::getInt4d($this->summaryInformation, $secOffset + 4); - - // initialize code page (used to resolve string values) - $codePage = 'CP1252'; - - // offset: ($secOffset+8); size: var - // loop through property decarations and properties - for ($i = 0; $i < $countProperties; ++$i) { - // offset: ($secOffset+8) + (8 * $i); size: 4; property ID - $id = self::getInt4d($this->summaryInformation, ($secOffset + 8) + (8 * $i)); - - // Use value of property id as appropriate - // offset: ($secOffset+12) + (8 * $i); size: 4; offset from beginning of section (48) - $offset = self::getInt4d($this->summaryInformation, ($secOffset + 12) + (8 * $i)); - - $type = self::getInt4d($this->summaryInformation, $secOffset + $offset); - - // initialize property value - $value = null; - - // extract property value based on property type - switch ($type) { - case 0x02: // 2 byte signed integer - $value = self::getUInt2d($this->summaryInformation, $secOffset + 4 + $offset); - - break; - case 0x03: // 4 byte signed integer - $value = self::getInt4d($this->summaryInformation, $secOffset + 4 + $offset); - - break; - case 0x13: // 4 byte unsigned integer - // not needed yet, fix later if necessary - break; - case 0x1E: // null-terminated string prepended by dword string length - $byteLength = self::getInt4d($this->summaryInformation, $secOffset + 4 + $offset); - $value = substr($this->summaryInformation, $secOffset + 8 + $offset, $byteLength); - $value = StringHelper::convertEncoding($value, 'UTF-8', $codePage); - $value = rtrim($value); - - break; - case 0x40: // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) - // PHP-time - $value = OLE::OLE2LocalDate(substr($this->summaryInformation, $secOffset + 4 + $offset, 8)); - - break; - case 0x47: // Clipboard format - // not needed yet, fix later if necessary - break; - } - - switch ($id) { - case 0x01: // Code Page - $codePage = CodePage::numberToName($value); - - break; - case 0x02: // Title - $this->spreadsheet->getProperties()->setTitle($value); - - break; - case 0x03: // Subject - $this->spreadsheet->getProperties()->setSubject($value); - - break; - case 0x04: // Author (Creator) - $this->spreadsheet->getProperties()->setCreator($value); - - break; - case 0x05: // Keywords - $this->spreadsheet->getProperties()->setKeywords($value); - - break; - case 0x06: // Comments (Description) - $this->spreadsheet->getProperties()->setDescription($value); - - break; - case 0x07: // Template - // Not supported by PhpSpreadsheet - break; - case 0x08: // Last Saved By (LastModifiedBy) - $this->spreadsheet->getProperties()->setLastModifiedBy($value); - - break; - case 0x09: // Revision - // Not supported by PhpSpreadsheet - break; - case 0x0A: // Total Editing Time - // Not supported by PhpSpreadsheet - break; - case 0x0B: // Last Printed - // Not supported by PhpSpreadsheet - break; - case 0x0C: // Created Date/Time - $this->spreadsheet->getProperties()->setCreated($value); - - break; - case 0x0D: // Modified Date/Time - $this->spreadsheet->getProperties()->setModified($value); - - break; - case 0x0E: // Number of Pages - // Not supported by PhpSpreadsheet - break; - case 0x0F: // Number of Words - // Not supported by PhpSpreadsheet - break; - case 0x10: // Number of Characters - // Not supported by PhpSpreadsheet - break; - case 0x11: // Thumbnail - // Not supported by PhpSpreadsheet - break; - case 0x12: // Name of creating application - // Not supported by PhpSpreadsheet - break; - case 0x13: // Security - // Not supported by PhpSpreadsheet - break; - } - } - } - - /** - * Read additional document summary information. - */ - private function readDocumentSummaryInformation(): void - { - if (!isset($this->documentSummaryInformation)) { - return; - } - - // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) - // offset: 2; size: 2; - // offset: 4; size: 2; OS version - // offset: 6; size: 2; OS indicator - // offset: 8; size: 16 - // offset: 24; size: 4; section count - $secCount = self::getInt4d($this->documentSummaryInformation, 24); - - // offset: 28; size: 16; first section's class id: 02 d5 cd d5 9c 2e 1b 10 93 97 08 00 2b 2c f9 ae - // offset: 44; size: 4; first section offset - $secOffset = self::getInt4d($this->documentSummaryInformation, 44); - - // section header - // offset: $secOffset; size: 4; section length - $secLength = self::getInt4d($this->documentSummaryInformation, $secOffset); - - // offset: $secOffset+4; size: 4; property count - $countProperties = self::getInt4d($this->documentSummaryInformation, $secOffset + 4); - - // initialize code page (used to resolve string values) - $codePage = 'CP1252'; - - // offset: ($secOffset+8); size: var - // loop through property decarations and properties - for ($i = 0; $i < $countProperties; ++$i) { - // offset: ($secOffset+8) + (8 * $i); size: 4; property ID - $id = self::getInt4d($this->documentSummaryInformation, ($secOffset + 8) + (8 * $i)); - - // Use value of property id as appropriate - // offset: 60 + 8 * $i; size: 4; offset from beginning of section (48) - $offset = self::getInt4d($this->documentSummaryInformation, ($secOffset + 12) + (8 * $i)); - - $type = self::getInt4d($this->documentSummaryInformation, $secOffset + $offset); - - // initialize property value - $value = null; - - // extract property value based on property type - switch ($type) { - case 0x02: // 2 byte signed integer - $value = self::getUInt2d($this->documentSummaryInformation, $secOffset + 4 + $offset); - - break; - case 0x03: // 4 byte signed integer - $value = self::getInt4d($this->documentSummaryInformation, $secOffset + 4 + $offset); - - break; - case 0x0B: // Boolean - $value = self::getUInt2d($this->documentSummaryInformation, $secOffset + 4 + $offset); - $value = ($value == 0 ? false : true); - - break; - case 0x13: // 4 byte unsigned integer - // not needed yet, fix later if necessary - break; - case 0x1E: // null-terminated string prepended by dword string length - $byteLength = self::getInt4d($this->documentSummaryInformation, $secOffset + 4 + $offset); - $value = substr($this->documentSummaryInformation, $secOffset + 8 + $offset, $byteLength); - $value = StringHelper::convertEncoding($value, 'UTF-8', $codePage); - $value = rtrim($value); - - break; - case 0x40: // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) - // PHP-Time - $value = OLE::OLE2LocalDate(substr($this->documentSummaryInformation, $secOffset + 4 + $offset, 8)); - - break; - case 0x47: // Clipboard format - // not needed yet, fix later if necessary - break; - } - - switch ($id) { - case 0x01: // Code Page - $codePage = CodePage::numberToName($value); - - break; - case 0x02: // Category - $this->spreadsheet->getProperties()->setCategory($value); - - break; - case 0x03: // Presentation Target - // Not supported by PhpSpreadsheet - break; - case 0x04: // Bytes - // Not supported by PhpSpreadsheet - break; - case 0x05: // Lines - // Not supported by PhpSpreadsheet - break; - case 0x06: // Paragraphs - // Not supported by PhpSpreadsheet - break; - case 0x07: // Slides - // Not supported by PhpSpreadsheet - break; - case 0x08: // Notes - // Not supported by PhpSpreadsheet - break; - case 0x09: // Hidden Slides - // Not supported by PhpSpreadsheet - break; - case 0x0A: // MM Clips - // Not supported by PhpSpreadsheet - break; - case 0x0B: // Scale Crop - // Not supported by PhpSpreadsheet - break; - case 0x0C: // Heading Pairs - // Not supported by PhpSpreadsheet - break; - case 0x0D: // Titles of Parts - // Not supported by PhpSpreadsheet - break; - case 0x0E: // Manager - $this->spreadsheet->getProperties()->setManager($value); - - break; - case 0x0F: // Company - $this->spreadsheet->getProperties()->setCompany($value); - - break; - case 0x10: // Links up-to-date - // Not supported by PhpSpreadsheet - break; - } - } - } - - /** - * Reads a general type of BIFF record. Does nothing except for moving stream pointer forward to next record. - */ - private function readDefault(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - - // move stream pointer to next record - $this->pos += 4 + $length; - } - - /** - * The NOTE record specifies a comment associated with a particular cell. In Excel 95 (BIFF7) and earlier versions, - * this record stores a note (cell note). This feature was significantly enhanced in Excel 97. - */ - private function readNote(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->readDataOnly) { - return; - } - - $cellAddress = $this->readBIFF8CellAddress(substr($recordData, 0, 4)); - if ($this->version == self::XLS_BIFF8) { - $noteObjID = self::getUInt2d($recordData, 6); - $noteAuthor = self::readUnicodeStringLong(substr($recordData, 8)); - $noteAuthor = $noteAuthor['value']; - $this->cellNotes[$noteObjID] = [ - 'cellRef' => $cellAddress, - 'objectID' => $noteObjID, - 'author' => $noteAuthor, - ]; - } else { - $extension = false; - if ($cellAddress == '$B$65536') { - // If the address row is -1 and the column is 0, (which translates as $B$65536) then this is a continuation - // note from the previous cell annotation. We're not yet handling this, so annotations longer than the - // max 2048 bytes will probably throw a wobbly. - $row = self::getUInt2d($recordData, 0); - $extension = true; - $cellAddress = array_pop(array_keys($this->phpSheet->getComments())); - } - - $cellAddress = str_replace('$', '', $cellAddress); - $noteLength = self::getUInt2d($recordData, 4); - $noteText = trim(substr($recordData, 6)); - - if ($extension) { - // Concatenate this extension with the currently set comment for the cell - $comment = $this->phpSheet->getComment($cellAddress); - $commentText = $comment->getText()->getPlainText(); - $comment->setText($this->parseRichText($commentText . $noteText)); - } else { - // Set comment for the cell - $this->phpSheet->getComment($cellAddress)->setText($this->parseRichText($noteText)); -// ->setAuthor($author) - } - } - } - - /** - * The TEXT Object record contains the text associated with a cell annotation. - */ - private function readTextObject(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->readDataOnly) { - return; - } - - // recordData consists of an array of subrecords looking like this: - // grbit: 2 bytes; Option Flags - // rot: 2 bytes; rotation - // cchText: 2 bytes; length of the text (in the first continue record) - // cbRuns: 2 bytes; length of the formatting (in the second continue record) - // followed by the continuation records containing the actual text and formatting - $grbitOpts = self::getUInt2d($recordData, 0); - $rot = self::getUInt2d($recordData, 2); - $cchText = self::getUInt2d($recordData, 10); - $cbRuns = self::getUInt2d($recordData, 12); - $text = $this->getSplicedRecordData(); - - $textByte = $text['spliceOffsets'][1] - $text['spliceOffsets'][0] - 1; - $textStr = substr($text['recordData'], $text['spliceOffsets'][0] + 1, $textByte); - // get 1 byte - $is16Bit = ord($text['recordData'][0]); - // it is possible to use a compressed format, - // which omits the high bytes of all characters, if they are all zero - if (($is16Bit & 0x01) === 0) { - $textStr = StringHelper::ConvertEncoding($textStr, 'UTF-8', 'ISO-8859-1'); - } else { - $textStr = $this->decodeCodepage($textStr); - } - - $this->textObjects[$this->textObjRef] = [ - 'text' => $textStr, - 'format' => substr($text['recordData'], $text['spliceOffsets'][1], $cbRuns), - 'alignment' => $grbitOpts, - 'rotation' => $rot, - ]; - } - - /** - * Read BOF. - */ - private function readBof(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = substr($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 2; size: 2; type of the following data - $substreamType = self::getUInt2d($recordData, 2); - - switch ($substreamType) { - case self::XLS_WORKBOOKGLOBALS: - $version = self::getUInt2d($recordData, 0); - if (($version != self::XLS_BIFF8) && ($version != self::XLS_BIFF7)) { - throw new Exception('Cannot read this Excel file. Version is too old.'); - } - $this->version = $version; - - break; - case self::XLS_WORKSHEET: - // do not use this version information for anything - // it is unreliable (OpenOffice doc, 5.8), use only version information from the global stream - break; - default: - // substream, e.g. chart - // just skip the entire substream - do { - $code = self::getUInt2d($this->data, $this->pos); - $this->readDefault(); - } while ($code != self::XLS_TYPE_EOF && $this->pos < $this->dataSize); - - break; - } - } - - /** - * FILEPASS. - * - * This record is part of the File Protection Block. It - * contains information about the read/write password of the - * file. All record contents following this record will be - * encrypted. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - * - * The decryption functions and objects used from here on in - * are based on the source of Spreadsheet-ParseExcel: - * https://metacpan.org/release/Spreadsheet-ParseExcel - */ - private function readFilepass(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - - if ($length != 54) { - throw new Exception('Unexpected file pass record length'); - } - - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->verifyPassword('VelvetSweatshop', substr($recordData, 6, 16), substr($recordData, 22, 16), substr($recordData, 38, 16), $this->md5Ctxt)) { - throw new Exception('Decryption password incorrect'); - } - - $this->encryption = self::MS_BIFF_CRYPTO_RC4; - - // Decryption required from the record after next onwards - $this->encryptionStartPos = $this->pos + self::getUInt2d($this->data, $this->pos + 2); - } - - /** - * Make an RC4 decryptor for the given block. - * - * @param int $block Block for which to create decrypto - * @param string $valContext MD5 context state - * - * @return Xls\RC4 - */ - private function makeKey($block, $valContext) - { - $pwarray = str_repeat("\0", 64); - - for ($i = 0; $i < 5; ++$i) { - $pwarray[$i] = $valContext[$i]; - } - - $pwarray[5] = chr($block & 0xff); - $pwarray[6] = chr(($block >> 8) & 0xff); - $pwarray[7] = chr(($block >> 16) & 0xff); - $pwarray[8] = chr(($block >> 24) & 0xff); - - $pwarray[9] = "\x80"; - $pwarray[56] = "\x48"; - - $md5 = new Xls\MD5(); - $md5->add($pwarray); - - $s = $md5->getContext(); - - return new Xls\RC4($s); - } - - /** - * Verify RC4 file password. - * - * @param string $password Password to check - * @param string $docid Document id - * @param string $salt_data Salt data - * @param string $hashedsalt_data Hashed salt data - * @param string $valContext Set to the MD5 context of the value - * - * @return bool Success - */ - private function verifyPassword($password, $docid, $salt_data, $hashedsalt_data, &$valContext) - { - $pwarray = str_repeat("\0", 64); - - $iMax = strlen($password); - for ($i = 0; $i < $iMax; ++$i) { - $o = ord(substr($password, $i, 1)); - $pwarray[2 * $i] = chr($o & 0xff); - $pwarray[2 * $i + 1] = chr(($o >> 8) & 0xff); - } - $pwarray[2 * $i] = chr(0x80); - $pwarray[56] = chr(($i << 4) & 0xff); - - $md5 = new Xls\MD5(); - $md5->add($pwarray); - - $mdContext1 = $md5->getContext(); - - $offset = 0; - $keyoffset = 0; - $tocopy = 5; - - $md5->reset(); - - while ($offset != 16) { - if ((64 - $offset) < 5) { - $tocopy = 64 - $offset; - } - for ($i = 0; $i <= $tocopy; ++$i) { - $pwarray[$offset + $i] = $mdContext1[$keyoffset + $i]; - } - $offset += $tocopy; - - if ($offset == 64) { - $md5->add($pwarray); - $keyoffset = $tocopy; - $tocopy = 5 - $tocopy; - $offset = 0; - - continue; - } - - $keyoffset = 0; - $tocopy = 5; - for ($i = 0; $i < 16; ++$i) { - $pwarray[$offset + $i] = $docid[$i]; - } - $offset += 16; - } - - $pwarray[16] = "\x80"; - for ($i = 0; $i < 47; ++$i) { - $pwarray[17 + $i] = "\0"; - } - $pwarray[56] = "\x80"; - $pwarray[57] = "\x0a"; - - $md5->add($pwarray); - $valContext = $md5->getContext(); - - $key = $this->makeKey(0, $valContext); - - $salt = $key->RC4($salt_data); - $hashedsalt = $key->RC4($hashedsalt_data); - - $salt .= "\x80" . str_repeat("\0", 47); - $salt[56] = "\x80"; - - $md5->reset(); - $md5->add($salt); - $mdContext2 = $md5->getContext(); - - return $mdContext2 == $hashedsalt; - } - - /** - * CODEPAGE. - * - * This record stores the text encoding used to write byte - * strings, stored as MS Windows code page identifier. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readCodepage(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; code page identifier - $codepage = self::getUInt2d($recordData, 0); - - $this->codepage = CodePage::numberToName($codepage); - } - - /** - * DATEMODE. - * - * This record specifies the base date for displaying date - * values. All dates are stored as count of days past this - * base date. In BIFF2-BIFF4 this record is part of the - * Calculation Settings Block. In BIFF5-BIFF8 it is - * stored in the Workbook Globals Substream. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readDateMode(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; 0 = base 1900, 1 = base 1904 - Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900); - if (ord($recordData[0]) == 1) { - Date::setExcelCalendar(Date::CALENDAR_MAC_1904); - } - } - - /** - * Read a FONT record. - */ - private function readFont(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - $objFont = new Font(); - - // offset: 0; size: 2; height of the font (in twips = 1/20 of a point) - $size = self::getUInt2d($recordData, 0); - $objFont->setSize($size / 20); - - // offset: 2; size: 2; option flags - // bit: 0; mask 0x0001; bold (redundant in BIFF5-BIFF8) - // bit: 1; mask 0x0002; italic - $isItalic = (0x0002 & self::getUInt2d($recordData, 2)) >> 1; - if ($isItalic) { - $objFont->setItalic(true); - } - - // bit: 2; mask 0x0004; underlined (redundant in BIFF5-BIFF8) - // bit: 3; mask 0x0008; strikethrough - $isStrike = (0x0008 & self::getUInt2d($recordData, 2)) >> 3; - if ($isStrike) { - $objFont->setStrikethrough(true); - } - - // offset: 4; size: 2; colour index - $colorIndex = self::getUInt2d($recordData, 4); - $objFont->colorIndex = $colorIndex; - - // offset: 6; size: 2; font weight - $weight = self::getUInt2d($recordData, 6); - switch ($weight) { - case 0x02BC: - $objFont->setBold(true); - - break; - } - - // offset: 8; size: 2; escapement type - $escapement = self::getUInt2d($recordData, 8); - switch ($escapement) { - case 0x0001: - $objFont->setSuperscript(true); - - break; - case 0x0002: - $objFont->setSubscript(true); - - break; - } - - // offset: 10; size: 1; underline type - $underlineType = ord($recordData[10]); - switch ($underlineType) { - case 0x00: - break; // no underline - case 0x01: - $objFont->setUnderline(Font::UNDERLINE_SINGLE); - - break; - case 0x02: - $objFont->setUnderline(Font::UNDERLINE_DOUBLE); - - break; - case 0x21: - $objFont->setUnderline(Font::UNDERLINE_SINGLEACCOUNTING); - - break; - case 0x22: - $objFont->setUnderline(Font::UNDERLINE_DOUBLEACCOUNTING); - - break; - } - - // offset: 11; size: 1; font family - // offset: 12; size: 1; character set - // offset: 13; size: 1; not used - // offset: 14; size: var; font name - if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringShort(substr($recordData, 14)); - } else { - $string = $this->readByteStringShort(substr($recordData, 14)); - } - $objFont->setName($string['value']); - - $this->objFonts[] = $objFont; - } - } - - /** - * FORMAT. - * - * This record contains information about a number format. - * All FORMAT records occur together in a sequential list. - * - * In BIFF2-BIFF4 other records referencing a FORMAT record - * contain a zero-based index into this list. From BIFF5 on - * the FORMAT record contains the index itself that will be - * used by other records. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readFormat(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - $indexCode = self::getUInt2d($recordData, 0); - - if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringLong(substr($recordData, 2)); - } else { - // BIFF7 - $string = $this->readByteStringShort(substr($recordData, 2)); - } - - $formatString = $string['value']; - $this->formats[$indexCode] = $formatString; - } - } - - /** - * XF - Extended Format. - * - * This record contains formatting information for cells, rows, columns or styles. - * According to https://support.microsoft.com/en-us/help/147732 there are always at least 15 cell style XF - * and 1 cell XF. - * Inspection of Excel files generated by MS Office Excel shows that XF records 0-14 are cell style XF - * and XF record 15 is a cell XF - * We only read the first cell style XF and skip the remaining cell style XF records - * We read all cell XF records. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readXf(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - $objStyle = new Style(); - - if (!$this->readDataOnly) { - // offset: 0; size: 2; Index to FONT record - if (self::getUInt2d($recordData, 0) < 4) { - $fontIndex = self::getUInt2d($recordData, 0); - } else { - // this has to do with that index 4 is omitted in all BIFF versions for some strange reason - // check the OpenOffice documentation of the FONT record - $fontIndex = self::getUInt2d($recordData, 0) - 1; - } - $objStyle->setFont($this->objFonts[$fontIndex]); - - // offset: 2; size: 2; Index to FORMAT record - $numberFormatIndex = self::getUInt2d($recordData, 2); - if (isset($this->formats[$numberFormatIndex])) { - // then we have user-defined format code - $numberFormat = ['formatCode' => $this->formats[$numberFormatIndex]]; - } elseif (($code = NumberFormat::builtInFormatCode($numberFormatIndex)) !== '') { - // then we have built-in format code - $numberFormat = ['formatCode' => $code]; - } else { - // we set the general format code - $numberFormat = ['formatCode' => 'General']; - } - $objStyle->getNumberFormat()->setFormatCode($numberFormat['formatCode']); - - // offset: 4; size: 2; XF type, cell protection, and parent style XF - // bit 2-0; mask 0x0007; XF_TYPE_PROT - $xfTypeProt = self::getUInt2d($recordData, 4); - // bit 0; mask 0x01; 1 = cell is locked - $isLocked = (0x01 & $xfTypeProt) >> 0; - $objStyle->getProtection()->setLocked($isLocked ? Protection::PROTECTION_INHERIT : Protection::PROTECTION_UNPROTECTED); - - // bit 1; mask 0x02; 1 = Formula is hidden - $isHidden = (0x02 & $xfTypeProt) >> 1; - $objStyle->getProtection()->setHidden($isHidden ? Protection::PROTECTION_PROTECTED : Protection::PROTECTION_UNPROTECTED); - - // bit 2; mask 0x04; 0 = Cell XF, 1 = Cell Style XF - $isCellStyleXf = (0x04 & $xfTypeProt) >> 2; - - // offset: 6; size: 1; Alignment and text break - // bit 2-0, mask 0x07; horizontal alignment - $horAlign = (0x07 & ord($recordData[6])) >> 0; - switch ($horAlign) { - case 0: - $objStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_GENERAL); - - break; - case 1: - $objStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_LEFT); - - break; - case 2: - $objStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); - - break; - case 3: - $objStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_RIGHT); - - break; - case 4: - $objStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_FILL); - - break; - case 5: - $objStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_JUSTIFY); - - break; - case 6: - $objStyle->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER_CONTINUOUS); - - break; - } - // bit 3, mask 0x08; wrap text - $wrapText = (0x08 & ord($recordData[6])) >> 3; - switch ($wrapText) { - case 0: - $objStyle->getAlignment()->setWrapText(false); - - break; - case 1: - $objStyle->getAlignment()->setWrapText(true); - - break; - } - // bit 6-4, mask 0x70; vertical alignment - $vertAlign = (0x70 & ord($recordData[6])) >> 4; - switch ($vertAlign) { - case 0: - $objStyle->getAlignment()->setVertical(Alignment::VERTICAL_TOP); - - break; - case 1: - $objStyle->getAlignment()->setVertical(Alignment::VERTICAL_CENTER); - - break; - case 2: - $objStyle->getAlignment()->setVertical(Alignment::VERTICAL_BOTTOM); - - break; - case 3: - $objStyle->getAlignment()->setVertical(Alignment::VERTICAL_JUSTIFY); - - break; - } - - if ($this->version == self::XLS_BIFF8) { - // offset: 7; size: 1; XF_ROTATION: Text rotation angle - $angle = ord($recordData[7]); - $rotation = 0; - if ($angle <= 90) { - $rotation = $angle; - } elseif ($angle <= 180) { - $rotation = 90 - $angle; - } elseif ($angle == 255) { - $rotation = -165; - } - $objStyle->getAlignment()->setTextRotation($rotation); - - // offset: 8; size: 1; Indentation, shrink to cell size, and text direction - // bit: 3-0; mask: 0x0F; indent level - $indent = (0x0F & ord($recordData[8])) >> 0; - $objStyle->getAlignment()->setIndent($indent); - - // bit: 4; mask: 0x10; 1 = shrink content to fit into cell - $shrinkToFit = (0x10 & ord($recordData[8])) >> 4; - switch ($shrinkToFit) { - case 0: - $objStyle->getAlignment()->setShrinkToFit(false); - - break; - case 1: - $objStyle->getAlignment()->setShrinkToFit(true); - - break; - } - - // offset: 9; size: 1; Flags used for attribute groups - - // offset: 10; size: 4; Cell border lines and background area - // bit: 3-0; mask: 0x0000000F; left style - if ($bordersLeftStyle = Xls\Style\Border::lookup((0x0000000F & self::getInt4d($recordData, 10)) >> 0)) { - $objStyle->getBorders()->getLeft()->setBorderStyle($bordersLeftStyle); - } - // bit: 7-4; mask: 0x000000F0; right style - if ($bordersRightStyle = Xls\Style\Border::lookup((0x000000F0 & self::getInt4d($recordData, 10)) >> 4)) { - $objStyle->getBorders()->getRight()->setBorderStyle($bordersRightStyle); - } - // bit: 11-8; mask: 0x00000F00; top style - if ($bordersTopStyle = Xls\Style\Border::lookup((0x00000F00 & self::getInt4d($recordData, 10)) >> 8)) { - $objStyle->getBorders()->getTop()->setBorderStyle($bordersTopStyle); - } - // bit: 15-12; mask: 0x0000F000; bottom style - if ($bordersBottomStyle = Xls\Style\Border::lookup((0x0000F000 & self::getInt4d($recordData, 10)) >> 12)) { - $objStyle->getBorders()->getBottom()->setBorderStyle($bordersBottomStyle); - } - // bit: 22-16; mask: 0x007F0000; left color - $objStyle->getBorders()->getLeft()->colorIndex = (0x007F0000 & self::getInt4d($recordData, 10)) >> 16; - - // bit: 29-23; mask: 0x3F800000; right color - $objStyle->getBorders()->getRight()->colorIndex = (0x3F800000 & self::getInt4d($recordData, 10)) >> 23; - - // bit: 30; mask: 0x40000000; 1 = diagonal line from top left to right bottom - $diagonalDown = (0x40000000 & self::getInt4d($recordData, 10)) >> 30 ? true : false; - - // bit: 31; mask: 0x80000000; 1 = diagonal line from bottom left to top right - $diagonalUp = (0x80000000 & self::getInt4d($recordData, 10)) >> 31 ? true : false; - - if ($diagonalUp == false && $diagonalDown == false) { - $objStyle->getBorders()->setDiagonalDirection(Borders::DIAGONAL_NONE); - } elseif ($diagonalUp == true && $diagonalDown == false) { - $objStyle->getBorders()->setDiagonalDirection(Borders::DIAGONAL_UP); - } elseif ($diagonalUp == false && $diagonalDown == true) { - $objStyle->getBorders()->setDiagonalDirection(Borders::DIAGONAL_DOWN); - } elseif ($diagonalUp == true && $diagonalDown == true) { - $objStyle->getBorders()->setDiagonalDirection(Borders::DIAGONAL_BOTH); - } - - // offset: 14; size: 4; - // bit: 6-0; mask: 0x0000007F; top color - $objStyle->getBorders()->getTop()->colorIndex = (0x0000007F & self::getInt4d($recordData, 14)) >> 0; - - // bit: 13-7; mask: 0x00003F80; bottom color - $objStyle->getBorders()->getBottom()->colorIndex = (0x00003F80 & self::getInt4d($recordData, 14)) >> 7; - - // bit: 20-14; mask: 0x001FC000; diagonal color - $objStyle->getBorders()->getDiagonal()->colorIndex = (0x001FC000 & self::getInt4d($recordData, 14)) >> 14; - - // bit: 24-21; mask: 0x01E00000; diagonal style - if ($bordersDiagonalStyle = Xls\Style\Border::lookup((0x01E00000 & self::getInt4d($recordData, 14)) >> 21)) { - $objStyle->getBorders()->getDiagonal()->setBorderStyle($bordersDiagonalStyle); - } - - // bit: 31-26; mask: 0xFC000000 fill pattern - if ($fillType = Xls\Style\FillPattern::lookup((0xFC000000 & self::getInt4d($recordData, 14)) >> 26)) { - $objStyle->getFill()->setFillType($fillType); - } - // offset: 18; size: 2; pattern and background colour - // bit: 6-0; mask: 0x007F; color index for pattern color - $objStyle->getFill()->startcolorIndex = (0x007F & self::getUInt2d($recordData, 18)) >> 0; - - // bit: 13-7; mask: 0x3F80; color index for pattern background - $objStyle->getFill()->endcolorIndex = (0x3F80 & self::getUInt2d($recordData, 18)) >> 7; - } else { - // BIFF5 - - // offset: 7; size: 1; Text orientation and flags - $orientationAndFlags = ord($recordData[7]); - - // bit: 1-0; mask: 0x03; XF_ORIENTATION: Text orientation - $xfOrientation = (0x03 & $orientationAndFlags) >> 0; - switch ($xfOrientation) { - case 0: - $objStyle->getAlignment()->setTextRotation(0); - - break; - case 1: - $objStyle->getAlignment()->setTextRotation(-165); - - break; - case 2: - $objStyle->getAlignment()->setTextRotation(90); - - break; - case 3: - $objStyle->getAlignment()->setTextRotation(-90); - - break; - } - - // offset: 8; size: 4; cell border lines and background area - $borderAndBackground = self::getInt4d($recordData, 8); - - // bit: 6-0; mask: 0x0000007F; color index for pattern color - $objStyle->getFill()->startcolorIndex = (0x0000007F & $borderAndBackground) >> 0; - - // bit: 13-7; mask: 0x00003F80; color index for pattern background - $objStyle->getFill()->endcolorIndex = (0x00003F80 & $borderAndBackground) >> 7; - - // bit: 21-16; mask: 0x003F0000; fill pattern - $objStyle->getFill()->setFillType(Xls\Style\FillPattern::lookup((0x003F0000 & $borderAndBackground) >> 16)); - - // bit: 24-22; mask: 0x01C00000; bottom line style - $objStyle->getBorders()->getBottom()->setBorderStyle(Xls\Style\Border::lookup((0x01C00000 & $borderAndBackground) >> 22)); - - // bit: 31-25; mask: 0xFE000000; bottom line color - $objStyle->getBorders()->getBottom()->colorIndex = (0xFE000000 & $borderAndBackground) >> 25; - - // offset: 12; size: 4; cell border lines - $borderLines = self::getInt4d($recordData, 12); - - // bit: 2-0; mask: 0x00000007; top line style - $objStyle->getBorders()->getTop()->setBorderStyle(Xls\Style\Border::lookup((0x00000007 & $borderLines) >> 0)); - - // bit: 5-3; mask: 0x00000038; left line style - $objStyle->getBorders()->getLeft()->setBorderStyle(Xls\Style\Border::lookup((0x00000038 & $borderLines) >> 3)); - - // bit: 8-6; mask: 0x000001C0; right line style - $objStyle->getBorders()->getRight()->setBorderStyle(Xls\Style\Border::lookup((0x000001C0 & $borderLines) >> 6)); - - // bit: 15-9; mask: 0x0000FE00; top line color index - $objStyle->getBorders()->getTop()->colorIndex = (0x0000FE00 & $borderLines) >> 9; - - // bit: 22-16; mask: 0x007F0000; left line color index - $objStyle->getBorders()->getLeft()->colorIndex = (0x007F0000 & $borderLines) >> 16; - - // bit: 29-23; mask: 0x3F800000; right line color index - $objStyle->getBorders()->getRight()->colorIndex = (0x3F800000 & $borderLines) >> 23; - } - - // add cellStyleXf or cellXf and update mapping - if ($isCellStyleXf) { - // we only read one style XF record which is always the first - if ($this->xfIndex == 0) { - $this->spreadsheet->addCellStyleXf($objStyle); - $this->mapCellStyleXfIndex[$this->xfIndex] = 0; - } - } else { - // we read all cell XF records - $this->spreadsheet->addCellXf($objStyle); - $this->mapCellXfIndex[$this->xfIndex] = count($this->spreadsheet->getCellXfCollection()) - 1; - } - - // update XF index for when we read next record - ++$this->xfIndex; - } - } - - private function readXfExt(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; 0x087D = repeated header - - // offset: 2; size: 2 - - // offset: 4; size: 8; not used - - // offset: 12; size: 2; record version - - // offset: 14; size: 2; index to XF record which this record modifies - $ixfe = self::getUInt2d($recordData, 14); - - // offset: 16; size: 2; not used - - // offset: 18; size: 2; number of extension properties that follow - $cexts = self::getUInt2d($recordData, 18); - - // start reading the actual extension data - $offset = 20; - while ($offset < $length) { - // extension type - $extType = self::getUInt2d($recordData, $offset); - - // extension length - $cb = self::getUInt2d($recordData, $offset + 2); - - // extension data - $extData = substr($recordData, $offset + 4, $cb); - - switch ($extType) { - case 4: // fill start color - $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) - - if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); - - // modify the relevant style property - if (isset($this->mapCellXfIndex[$ixfe])) { - $fill = $this->spreadsheet->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getFill(); - $fill->getStartColor()->setRGB($rgb); - $fill->startcolorIndex = null; // normal color index does not apply, discard - } - } - - break; - case 5: // fill end color - $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) - - if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); - - // modify the relevant style property - if (isset($this->mapCellXfIndex[$ixfe])) { - $fill = $this->spreadsheet->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getFill(); - $fill->getEndColor()->setRGB($rgb); - $fill->endcolorIndex = null; // normal color index does not apply, discard - } - } - - break; - case 7: // border color top - $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) - - if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); - - // modify the relevant style property - if (isset($this->mapCellXfIndex[$ixfe])) { - $top = $this->spreadsheet->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getTop(); - $top->getColor()->setRGB($rgb); - $top->colorIndex = null; // normal color index does not apply, discard - } - } - - break; - case 8: // border color bottom - $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) - - if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); - - // modify the relevant style property - if (isset($this->mapCellXfIndex[$ixfe])) { - $bottom = $this->spreadsheet->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getBottom(); - $bottom->getColor()->setRGB($rgb); - $bottom->colorIndex = null; // normal color index does not apply, discard - } - } - - break; - case 9: // border color left - $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) - - if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); - - // modify the relevant style property - if (isset($this->mapCellXfIndex[$ixfe])) { - $left = $this->spreadsheet->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getLeft(); - $left->getColor()->setRGB($rgb); - $left->colorIndex = null; // normal color index does not apply, discard - } - } - - break; - case 10: // border color right - $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) - - if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); - - // modify the relevant style property - if (isset($this->mapCellXfIndex[$ixfe])) { - $right = $this->spreadsheet->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getRight(); - $right->getColor()->setRGB($rgb); - $right->colorIndex = null; // normal color index does not apply, discard - } - } - - break; - case 11: // border color diagonal - $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) - - if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); - - // modify the relevant style property - if (isset($this->mapCellXfIndex[$ixfe])) { - $diagonal = $this->spreadsheet->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getDiagonal(); - $diagonal->getColor()->setRGB($rgb); - $diagonal->colorIndex = null; // normal color index does not apply, discard - } - } - - break; - case 13: // font color - $xclfType = self::getUInt2d($extData, 0); // color type - $xclrValue = substr($extData, 4, 4); // color value (value based on color type) - - if ($xclfType == 2) { - $rgb = sprintf('%02X%02X%02X', ord($xclrValue[0]), ord($xclrValue[1]), ord($xclrValue[2])); - - // modify the relevant style property - if (isset($this->mapCellXfIndex[$ixfe])) { - $font = $this->spreadsheet->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getFont(); - $font->getColor()->setRGB($rgb); - $font->colorIndex = null; // normal color index does not apply, discard - } - } - - break; - } - - $offset += $cb; - } - } - } - - /** - * Read STYLE record. - */ - private function readStyle(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; index to XF record and flag for built-in style - $ixfe = self::getUInt2d($recordData, 0); - - // bit: 11-0; mask 0x0FFF; index to XF record - $xfIndex = (0x0FFF & $ixfe) >> 0; - - // bit: 15; mask 0x8000; 0 = user-defined style, 1 = built-in style - $isBuiltIn = (bool) ((0x8000 & $ixfe) >> 15); - - if ($isBuiltIn) { - // offset: 2; size: 1; identifier for built-in style - $builtInId = ord($recordData[2]); - - switch ($builtInId) { - case 0x00: - // currently, we are not using this for anything - break; - default: - break; - } - } - // user-defined; not supported by PhpSpreadsheet - } - } - - /** - * Read PALETTE record. - */ - private function readPalette(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; number of following colors - $nm = self::getUInt2d($recordData, 0); - - // list of RGB colors - for ($i = 0; $i < $nm; ++$i) { - $rgb = substr($recordData, 2 + 4 * $i, 4); - $this->palette[] = self::readRGB($rgb); - } - } - } - - /** - * SHEET. - * - * This record is located in the Workbook Globals - * Substream and represents a sheet inside the workbook. - * One SHEET record is written for each sheet. It stores the - * sheet name and a stream offset to the BOF record of the - * respective Sheet Substream within the Workbook Stream. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readSheet(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // offset: 0; size: 4; absolute stream position of the BOF record of the sheet - // NOTE: not encrypted - $rec_offset = self::getInt4d($this->data, $this->pos + 4); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 4; size: 1; sheet state - switch (ord($recordData[4])) { - case 0x00: - $sheetState = Worksheet::SHEETSTATE_VISIBLE; - - break; - case 0x01: - $sheetState = Worksheet::SHEETSTATE_HIDDEN; - - break; - case 0x02: - $sheetState = Worksheet::SHEETSTATE_VERYHIDDEN; - - break; - default: - $sheetState = Worksheet::SHEETSTATE_VISIBLE; - - break; - } - - // offset: 5; size: 1; sheet type - $sheetType = ord($recordData[5]); - - // offset: 6; size: var; sheet name - if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringShort(substr($recordData, 6)); - $rec_name = $string['value']; - } elseif ($this->version == self::XLS_BIFF7) { - $string = $this->readByteStringShort(substr($recordData, 6)); - $rec_name = $string['value']; - } - - $this->sheets[] = [ - 'name' => $rec_name, - 'offset' => $rec_offset, - 'sheetState' => $sheetState, - 'sheetType' => $sheetType, - ]; - } - - /** - * Read EXTERNALBOOK record. - */ - private function readExternalBook(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset within record data - $offset = 0; - - // there are 4 types of records - if (strlen($recordData) > 4) { - // external reference - // offset: 0; size: 2; number of sheet names ($nm) - $nm = self::getUInt2d($recordData, 0); - $offset += 2; - - // offset: 2; size: var; encoded URL without sheet name (Unicode string, 16-bit length) - $encodedUrlString = self::readUnicodeStringLong(substr($recordData, 2)); - $offset += $encodedUrlString['size']; - - // offset: var; size: var; list of $nm sheet names (Unicode strings, 16-bit length) - $externalSheetNames = []; - for ($i = 0; $i < $nm; ++$i) { - $externalSheetNameString = self::readUnicodeStringLong(substr($recordData, $offset)); - $externalSheetNames[] = $externalSheetNameString['value']; - $offset += $externalSheetNameString['size']; - } - - // store the record data - $this->externalBooks[] = [ - 'type' => 'external', - 'encodedUrl' => $encodedUrlString['value'], - 'externalSheetNames' => $externalSheetNames, - ]; - } elseif (substr($recordData, 2, 2) == pack('CC', 0x01, 0x04)) { - // internal reference - // offset: 0; size: 2; number of sheet in this document - // offset: 2; size: 2; 0x01 0x04 - $this->externalBooks[] = [ - 'type' => 'internal', - ]; - } elseif (substr($recordData, 0, 4) == pack('vCC', 0x0001, 0x01, 0x3A)) { - // add-in function - // offset: 0; size: 2; 0x0001 - $this->externalBooks[] = [ - 'type' => 'addInFunction', - ]; - } elseif (substr($recordData, 0, 2) == pack('v', 0x0000)) { - // DDE links, OLE links - // offset: 0; size: 2; 0x0000 - // offset: 2; size: var; encoded source document name - $this->externalBooks[] = [ - 'type' => 'DDEorOLE', - ]; - } - } - - /** - * Read EXTERNNAME record. - */ - private function readExternName(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // external sheet references provided for named cells - if ($this->version == self::XLS_BIFF8) { - // offset: 0; size: 2; options - $options = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; - - // offset: 4; size: 2; not used - - // offset: 6; size: var - $nameString = self::readUnicodeStringShort(substr($recordData, 6)); - - // offset: var; size: var; formula data - $offset = 6 + $nameString['size']; - $formula = $this->getFormulaFromStructure(substr($recordData, $offset)); - - $this->externalNames[] = [ - 'name' => $nameString['value'], - 'formula' => $formula, - ]; - } - } - - /** - * Read EXTERNSHEET record. - */ - private function readExternSheet(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // external sheet references provided for named cells - if ($this->version == self::XLS_BIFF8) { - // offset: 0; size: 2; number of following ref structures - $nm = self::getUInt2d($recordData, 0); - for ($i = 0; $i < $nm; ++$i) { - $this->ref[] = [ - // offset: 2 + 6 * $i; index to EXTERNALBOOK record - 'externalBookIndex' => self::getUInt2d($recordData, 2 + 6 * $i), - // offset: 4 + 6 * $i; index to first sheet in EXTERNALBOOK record - 'firstSheetIndex' => self::getUInt2d($recordData, 4 + 6 * $i), - // offset: 6 + 6 * $i; index to last sheet in EXTERNALBOOK record - 'lastSheetIndex' => self::getUInt2d($recordData, 6 + 6 * $i), - ]; - } - } - } - - /** - * DEFINEDNAME. - * - * This record is part of a Link Table. It contains the name - * and the token array of an internal defined name. Token - * arrays of defined names contain tokens with aberrant - * token classes. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readDefinedName(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->version == self::XLS_BIFF8) { - // retrieves named cells - - // offset: 0; size: 2; option flags - $opts = self::getUInt2d($recordData, 0); - - // bit: 5; mask: 0x0020; 0 = user-defined name, 1 = built-in-name - $isBuiltInName = (0x0020 & $opts) >> 5; - - // offset: 2; size: 1; keyboard shortcut - - // offset: 3; size: 1; length of the name (character count) - $nlen = ord($recordData[3]); - - // offset: 4; size: 2; size of the formula data (it can happen that this is zero) - // note: there can also be additional data, this is not included in $flen - $flen = self::getUInt2d($recordData, 4); - - // offset: 8; size: 2; 0=Global name, otherwise index to sheet (1-based) - $scope = self::getUInt2d($recordData, 8); - - // offset: 14; size: var; Name (Unicode string without length field) - $string = self::readUnicodeString(substr($recordData, 14), $nlen); - - // offset: var; size: $flen; formula data - $offset = 14 + $string['size']; - $formulaStructure = pack('v', $flen) . substr($recordData, $offset); - - try { - $formula = $this->getFormulaFromStructure($formulaStructure); - } catch (PhpSpreadsheetException $e) { - $formula = ''; - } - - $this->definedname[] = [ - 'isBuiltInName' => $isBuiltInName, - 'name' => $string['value'], - 'formula' => $formula, - 'scope' => $scope, - ]; - } - } - - /** - * Read MSODRAWINGGROUP record. - */ - private function readMsoDrawingGroup(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - - // get spliced record data - $splicedRecordData = $this->getSplicedRecordData(); - $recordData = $splicedRecordData['recordData']; - - $this->drawingGroupData .= $recordData; - } - - /** - * SST - Shared String Table. - * - * This record contains a list of all strings used anywhere - * in the workbook. Each string occurs only once. The - * workbook uses indexes into the list to reference the - * strings. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readSst(): void - { - // offset within (spliced) record data - $pos = 0; - - // get spliced record data - $splicedRecordData = $this->getSplicedRecordData(); - - $recordData = $splicedRecordData['recordData']; - $spliceOffsets = $splicedRecordData['spliceOffsets']; - - // offset: 0; size: 4; total number of strings in the workbook - $pos += 4; - - // offset: 4; size: 4; number of following strings ($nm) - $nm = self::getInt4d($recordData, 4); - $pos += 4; - - // loop through the Unicode strings (16-bit length) - for ($i = 0; $i < $nm; ++$i) { - // number of characters in the Unicode string - $numChars = self::getUInt2d($recordData, $pos); - $pos += 2; - - // option flags - $optionFlags = ord($recordData[$pos]); - ++$pos; - - // bit: 0; mask: 0x01; 0 = compressed; 1 = uncompressed - $isCompressed = (($optionFlags & 0x01) == 0); - - // bit: 2; mask: 0x02; 0 = ordinary; 1 = Asian phonetic - $hasAsian = (($optionFlags & 0x04) != 0); - - // bit: 3; mask: 0x03; 0 = ordinary; 1 = Rich-Text - $hasRichText = (($optionFlags & 0x08) != 0); - - if ($hasRichText) { - // number of Rich-Text formatting runs - $formattingRuns = self::getUInt2d($recordData, $pos); - $pos += 2; - } - - if ($hasAsian) { - // size of Asian phonetic setting - $extendedRunLength = self::getInt4d($recordData, $pos); - $pos += 4; - } - - // expected byte length of character array if not split - $len = ($isCompressed) ? $numChars : $numChars * 2; - - // look up limit position - foreach ($spliceOffsets as $spliceOffset) { - // it can happen that the string is empty, therefore we need - // <= and not just < - if ($pos <= $spliceOffset) { - $limitpos = $spliceOffset; - - break; - } - } - - if ($pos + $len <= $limitpos) { - // character array is not split between records - - $retstr = substr($recordData, $pos, $len); - $pos += $len; - } else { - // character array is split between records - - // first part of character array - $retstr = substr($recordData, $pos, $limitpos - $pos); - - $bytesRead = $limitpos - $pos; - - // remaining characters in Unicode string - $charsLeft = $numChars - (($isCompressed) ? $bytesRead : ($bytesRead / 2)); - - $pos = $limitpos; - - // keep reading the characters - while ($charsLeft > 0) { - // look up next limit position, in case the string span more than one continue record - foreach ($spliceOffsets as $spliceOffset) { - if ($pos < $spliceOffset) { - $limitpos = $spliceOffset; - - break; - } - } - - // repeated option flags - // OpenOffice.org documentation 5.21 - $option = ord($recordData[$pos]); - ++$pos; - - if ($isCompressed && ($option == 0)) { - // 1st fragment compressed - // this fragment compressed - $len = min($charsLeft, $limitpos - $pos); - $retstr .= substr($recordData, $pos, $len); - $charsLeft -= $len; - $isCompressed = true; - } elseif (!$isCompressed && ($option != 0)) { - // 1st fragment uncompressed - // this fragment uncompressed - $len = min($charsLeft * 2, $limitpos - $pos); - $retstr .= substr($recordData, $pos, $len); - $charsLeft -= $len / 2; - $isCompressed = false; - } elseif (!$isCompressed && ($option == 0)) { - // 1st fragment uncompressed - // this fragment compressed - $len = min($charsLeft, $limitpos - $pos); - for ($j = 0; $j < $len; ++$j) { - $retstr .= $recordData[$pos + $j] - . chr(0); - } - $charsLeft -= $len; - $isCompressed = false; - } else { - // 1st fragment compressed - // this fragment uncompressed - $newstr = ''; - $jMax = strlen($retstr); - for ($j = 0; $j < $jMax; ++$j) { - $newstr .= $retstr[$j] . chr(0); - } - $retstr = $newstr; - $len = min($charsLeft * 2, $limitpos - $pos); - $retstr .= substr($recordData, $pos, $len); - $charsLeft -= $len / 2; - $isCompressed = false; - } - - $pos += $len; - } - } - - // convert to UTF-8 - $retstr = self::encodeUTF16($retstr, $isCompressed); - - // read additional Rich-Text information, if any - $fmtRuns = []; - if ($hasRichText) { - // list of formatting runs - for ($j = 0; $j < $formattingRuns; ++$j) { - // first formatted character; zero-based - $charPos = self::getUInt2d($recordData, $pos + $j * 4); - - // index to font record - $fontIndex = self::getUInt2d($recordData, $pos + 2 + $j * 4); - - $fmtRuns[] = [ - 'charPos' => $charPos, - 'fontIndex' => $fontIndex, - ]; - } - $pos += 4 * $formattingRuns; - } - - // read additional Asian phonetics information, if any - if ($hasAsian) { - // For Asian phonetic settings, we skip the extended string data - $pos += $extendedRunLength; - } - - // store the shared sting - $this->sst[] = [ - 'value' => $retstr, - 'fmtRuns' => $fmtRuns, - ]; - } - - // getSplicedRecordData() takes care of moving current position in data stream - } - - /** - * Read PRINTGRIDLINES record. - */ - private function readPrintGridlines(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) { - // offset: 0; size: 2; 0 = do not print sheet grid lines; 1 = print sheet gridlines - $printGridlines = (bool) self::getUInt2d($recordData, 0); - $this->phpSheet->setPrintGridlines($printGridlines); - } - } - - /** - * Read DEFAULTROWHEIGHT record. - */ - private function readDefaultRowHeight(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; option flags - // offset: 2; size: 2; default height for unused rows, (twips 1/20 point) - $height = self::getUInt2d($recordData, 2); - $this->phpSheet->getDefaultRowDimension()->setRowHeight($height / 20); - } - - /** - * Read SHEETPR record. - */ - private function readSheetPr(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2 - - // bit: 6; mask: 0x0040; 0 = outline buttons above outline group - $isSummaryBelow = (0x0040 & self::getUInt2d($recordData, 0)) >> 6; - $this->phpSheet->setShowSummaryBelow($isSummaryBelow); - - // bit: 7; mask: 0x0080; 0 = outline buttons left of outline group - $isSummaryRight = (0x0080 & self::getUInt2d($recordData, 0)) >> 7; - $this->phpSheet->setShowSummaryRight($isSummaryRight); - - // bit: 8; mask: 0x100; 0 = scale printout in percent, 1 = fit printout to number of pages - // this corresponds to radio button setting in page setup dialog in Excel - $this->isFitToPages = (bool) ((0x0100 & self::getUInt2d($recordData, 0)) >> 8); - } - - /** - * Read HORIZONTALPAGEBREAKS record. - */ - private function readHorizontalPageBreaks(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) { - // offset: 0; size: 2; number of the following row index structures - $nm = self::getUInt2d($recordData, 0); - - // offset: 2; size: 6 * $nm; list of $nm row index structures - for ($i = 0; $i < $nm; ++$i) { - $r = self::getUInt2d($recordData, 2 + 6 * $i); - $cf = self::getUInt2d($recordData, 2 + 6 * $i + 2); - $cl = self::getUInt2d($recordData, 2 + 6 * $i + 4); - - // not sure why two column indexes are necessary? - $this->phpSheet->setBreakByColumnAndRow($cf + 1, $r, Worksheet::BREAK_ROW); - } - } - } - - /** - * Read VERTICALPAGEBREAKS record. - */ - private function readVerticalPageBreaks(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) { - // offset: 0; size: 2; number of the following column index structures - $nm = self::getUInt2d($recordData, 0); - - // offset: 2; size: 6 * $nm; list of $nm row index structures - for ($i = 0; $i < $nm; ++$i) { - $c = self::getUInt2d($recordData, 2 + 6 * $i); - $rf = self::getUInt2d($recordData, 2 + 6 * $i + 2); - $rl = self::getUInt2d($recordData, 2 + 6 * $i + 4); - - // not sure why two row indexes are necessary? - $this->phpSheet->setBreakByColumnAndRow($c + 1, $rf, Worksheet::BREAK_COLUMN); - } - } - } - - /** - * Read HEADER record. - */ - private function readHeader(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: var - // realized that $recordData can be empty even when record exists - if ($recordData) { - if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringLong($recordData); - } else { - $string = $this->readByteStringShort($recordData); - } - - $this->phpSheet->getHeaderFooter()->setOddHeader($string['value']); - $this->phpSheet->getHeaderFooter()->setEvenHeader($string['value']); - } - } - } - - /** - * Read FOOTER record. - */ - private function readFooter(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: var - // realized that $recordData can be empty even when record exists - if ($recordData) { - if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringLong($recordData); - } else { - $string = $this->readByteStringShort($recordData); - } - $this->phpSheet->getHeaderFooter()->setOddFooter($string['value']); - $this->phpSheet->getHeaderFooter()->setEvenFooter($string['value']); - } - } - } - - /** - * Read HCENTER record. - */ - private function readHcenter(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; 0 = print sheet left aligned, 1 = print sheet centered horizontally - $isHorizontalCentered = (bool) self::getUInt2d($recordData, 0); - - $this->phpSheet->getPageSetup()->setHorizontalCentered($isHorizontalCentered); - } - } - - /** - * Read VCENTER record. - */ - private function readVcenter(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; 0 = print sheet aligned at top page border, 1 = print sheet vertically centered - $isVerticalCentered = (bool) self::getUInt2d($recordData, 0); - - $this->phpSheet->getPageSetup()->setVerticalCentered($isVerticalCentered); - } - } - - /** - * Read LEFTMARGIN record. - */ - private function readLeftMargin(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 8 - $this->phpSheet->getPageMargins()->setLeft(self::extractNumber($recordData)); - } - } - - /** - * Read RIGHTMARGIN record. - */ - private function readRightMargin(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 8 - $this->phpSheet->getPageMargins()->setRight(self::extractNumber($recordData)); - } - } - - /** - * Read TOPMARGIN record. - */ - private function readTopMargin(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 8 - $this->phpSheet->getPageMargins()->setTop(self::extractNumber($recordData)); - } - } - - /** - * Read BOTTOMMARGIN record. - */ - private function readBottomMargin(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 8 - $this->phpSheet->getPageMargins()->setBottom(self::extractNumber($recordData)); - } - } - - /** - * Read PAGESETUP record. - */ - private function readPageSetup(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; paper size - $paperSize = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; scaling factor - $scale = self::getUInt2d($recordData, 2); - - // offset: 6; size: 2; fit worksheet width to this number of pages, 0 = use as many as needed - $fitToWidth = self::getUInt2d($recordData, 6); - - // offset: 8; size: 2; fit worksheet height to this number of pages, 0 = use as many as needed - $fitToHeight = self::getUInt2d($recordData, 8); - - // offset: 10; size: 2; option flags - - // bit: 0; mask: 0x0001; 0=down then over, 1=over then down - $isOverThenDown = (0x0001 & self::getUInt2d($recordData, 10)); - - // bit: 1; mask: 0x0002; 0=landscape, 1=portrait - $isPortrait = (0x0002 & self::getUInt2d($recordData, 10)) >> 1; - - // bit: 2; mask: 0x0004; 1= paper size, scaling factor, paper orient. not init - // when this bit is set, do not use flags for those properties - $isNotInit = (0x0004 & self::getUInt2d($recordData, 10)) >> 2; - - if (!$isNotInit) { - $this->phpSheet->getPageSetup()->setPaperSize($paperSize); - $this->phpSheet->getPageSetup()->setPageOrder(((bool) $isOverThenDown) ? PageSetup::PAGEORDER_OVER_THEN_DOWN : PageSetup::PAGEORDER_DOWN_THEN_OVER); - $this->phpSheet->getPageSetup()->setOrientation(((bool) $isPortrait) ? PageSetup::ORIENTATION_PORTRAIT : PageSetup::ORIENTATION_LANDSCAPE); - - $this->phpSheet->getPageSetup()->setScale($scale, false); - $this->phpSheet->getPageSetup()->setFitToPage((bool) $this->isFitToPages); - $this->phpSheet->getPageSetup()->setFitToWidth($fitToWidth, false); - $this->phpSheet->getPageSetup()->setFitToHeight($fitToHeight, false); - } - - // offset: 16; size: 8; header margin (IEEE 754 floating-point value) - $marginHeader = self::extractNumber(substr($recordData, 16, 8)); - $this->phpSheet->getPageMargins()->setHeader($marginHeader); - - // offset: 24; size: 8; footer margin (IEEE 754 floating-point value) - $marginFooter = self::extractNumber(substr($recordData, 24, 8)); - $this->phpSheet->getPageMargins()->setFooter($marginFooter); - } - } - - /** - * PROTECT - Sheet protection (BIFF2 through BIFF8) - * if this record is omitted, then it also means no sheet protection. - */ - private function readProtect(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->readDataOnly) { - return; - } - - // offset: 0; size: 2; - - // bit 0, mask 0x01; 1 = sheet is protected - $bool = (0x01 & self::getUInt2d($recordData, 0)) >> 0; - $this->phpSheet->getProtection()->setSheet((bool) $bool); - } - - /** - * SCENPROTECT. - */ - private function readScenProtect(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->readDataOnly) { - return; - } - - // offset: 0; size: 2; - - // bit: 0, mask 0x01; 1 = scenarios are protected - $bool = (0x01 & self::getUInt2d($recordData, 0)) >> 0; - - $this->phpSheet->getProtection()->setScenarios((bool) $bool); - } - - /** - * OBJECTPROTECT. - */ - private function readObjectProtect(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->readDataOnly) { - return; - } - - // offset: 0; size: 2; - - // bit: 0, mask 0x01; 1 = objects are protected - $bool = (0x01 & self::getUInt2d($recordData, 0)) >> 0; - - $this->phpSheet->getProtection()->setObjects((bool) $bool); - } - - /** - * PASSWORD - Sheet protection (hashed) password (BIFF2 through BIFF8). - */ - private function readPassword(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; 16-bit hash value of password - $password = strtoupper(dechex(self::getUInt2d($recordData, 0))); // the hashed password - $this->phpSheet->getProtection()->setPassword($password, true); - } - } - - /** - * Read DEFCOLWIDTH record. - */ - private function readDefColWidth(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; default column width - $width = self::getUInt2d($recordData, 0); - if ($width != 8) { - $this->phpSheet->getDefaultColumnDimension()->setWidth($width); - } - } - - /** - * Read COLINFO record. - */ - private function readColInfo(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; index to first column in range - $firstColumnIndex = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; index to last column in range - $lastColumnIndex = self::getUInt2d($recordData, 2); - - // offset: 4; size: 2; width of the column in 1/256 of the width of the zero character - $width = self::getUInt2d($recordData, 4); - - // offset: 6; size: 2; index to XF record for default column formatting - $xfIndex = self::getUInt2d($recordData, 6); - - // offset: 8; size: 2; option flags - // bit: 0; mask: 0x0001; 1= columns are hidden - $isHidden = (0x0001 & self::getUInt2d($recordData, 8)) >> 0; - - // bit: 10-8; mask: 0x0700; outline level of the columns (0 = no outline) - $level = (0x0700 & self::getUInt2d($recordData, 8)) >> 8; - - // bit: 12; mask: 0x1000; 1 = collapsed - $isCollapsed = (0x1000 & self::getUInt2d($recordData, 8)) >> 12; - - // offset: 10; size: 2; not used - - for ($i = $firstColumnIndex + 1; $i <= $lastColumnIndex + 1; ++$i) { - if ($lastColumnIndex == 255 || $lastColumnIndex == 256) { - $this->phpSheet->getDefaultColumnDimension()->setWidth($width / 256); - - break; - } - $this->phpSheet->getColumnDimensionByColumn($i)->setWidth($width / 256); - $this->phpSheet->getColumnDimensionByColumn($i)->setVisible(!$isHidden); - $this->phpSheet->getColumnDimensionByColumn($i)->setOutlineLevel($level); - $this->phpSheet->getColumnDimensionByColumn($i)->setCollapsed($isCollapsed); - if (isset($this->mapCellXfIndex[$xfIndex])) { - $this->phpSheet->getColumnDimensionByColumn($i)->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - } - } - } - - /** - * ROW. - * - * This record contains the properties of a single row in a - * sheet. Rows and cells in a sheet are divided into blocks - * of 32 rows. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readRow(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; index of this row - $r = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; index to column of the first cell which is described by a cell record - - // offset: 4; size: 2; index to column of the last cell which is described by a cell record, increased by 1 - - // offset: 6; size: 2; - - // bit: 14-0; mask: 0x7FFF; height of the row, in twips = 1/20 of a point - $height = (0x7FFF & self::getUInt2d($recordData, 6)) >> 0; - - // bit: 15: mask: 0x8000; 0 = row has custom height; 1= row has default height - $useDefaultHeight = (0x8000 & self::getUInt2d($recordData, 6)) >> 15; - - if (!$useDefaultHeight) { - $this->phpSheet->getRowDimension($r + 1)->setRowHeight($height / 20); - } - - // offset: 8; size: 2; not used - - // offset: 10; size: 2; not used in BIFF5-BIFF8 - - // offset: 12; size: 4; option flags and default row formatting - - // bit: 2-0: mask: 0x00000007; outline level of the row - $level = (0x00000007 & self::getInt4d($recordData, 12)) >> 0; - $this->phpSheet->getRowDimension($r + 1)->setOutlineLevel($level); - - // bit: 4; mask: 0x00000010; 1 = outline group start or ends here... and is collapsed - $isCollapsed = (0x00000010 & self::getInt4d($recordData, 12)) >> 4; - $this->phpSheet->getRowDimension($r + 1)->setCollapsed($isCollapsed); - - // bit: 5; mask: 0x00000020; 1 = row is hidden - $isHidden = (0x00000020 & self::getInt4d($recordData, 12)) >> 5; - $this->phpSheet->getRowDimension($r + 1)->setVisible(!$isHidden); - - // bit: 7; mask: 0x00000080; 1 = row has explicit format - $hasExplicitFormat = (0x00000080 & self::getInt4d($recordData, 12)) >> 7; - - // bit: 27-16; mask: 0x0FFF0000; only applies when hasExplicitFormat = 1; index to XF record - $xfIndex = (0x0FFF0000 & self::getInt4d($recordData, 12)) >> 16; - - if ($hasExplicitFormat && isset($this->mapCellXfIndex[$xfIndex])) { - $this->phpSheet->getRowDimension($r + 1)->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - } - } - - /** - * Read RK record - * This record represents a cell that contains an RK value - * (encoded integer or floating-point value). If a - * floating-point value cannot be encoded to an RK value, - * a NUMBER record will be written. This record replaces the - * record INTEGER written in BIFF2. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readRk(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; index to row - $row = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; index to column - $column = self::getUInt2d($recordData, 2); - $columnString = Coordinate::stringFromColumnIndex($column + 1); - - // Read cell? - if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { - // offset: 4; size: 2; index to XF record - $xfIndex = self::getUInt2d($recordData, 4); - - // offset: 6; size: 4; RK value - $rknum = self::getInt4d($recordData, 6); - $numValue = self::getIEEE754($rknum); - - $cell = $this->phpSheet->getCell($columnString . ($row + 1)); - if (!$this->readDataOnly && isset($this->mapCellXfIndex[$xfIndex])) { - // add style information - $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - - // add cell - $cell->setValueExplicit($numValue, DataType::TYPE_NUMERIC); - } - } - - /** - * Read LABELSST record - * This record represents a cell that contains a string. It - * replaces the LABEL record and RSTRING record used in - * BIFF2-BIFF5. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readLabelSst(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; index to row - $row = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; index to column - $column = self::getUInt2d($recordData, 2); - $columnString = Coordinate::stringFromColumnIndex($column + 1); - - $emptyCell = true; - // Read cell? - if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { - // offset: 4; size: 2; index to XF record - $xfIndex = self::getUInt2d($recordData, 4); - - // offset: 6; size: 4; index to SST record - $index = self::getInt4d($recordData, 6); - - // add cell - if (($fmtRuns = $this->sst[$index]['fmtRuns']) && !$this->readDataOnly) { - // then we should treat as rich text - $richText = new RichText(); - $charPos = 0; - $sstCount = count($this->sst[$index]['fmtRuns']); - for ($i = 0; $i <= $sstCount; ++$i) { - if (isset($fmtRuns[$i])) { - $text = StringHelper::substring($this->sst[$index]['value'], $charPos, $fmtRuns[$i]['charPos'] - $charPos); - $charPos = $fmtRuns[$i]['charPos']; - } else { - $text = StringHelper::substring($this->sst[$index]['value'], $charPos, StringHelper::countCharacters($this->sst[$index]['value'])); - } - - if (StringHelper::countCharacters($text) > 0) { - if ($i == 0) { // first text run, no style - $richText->createText($text); - } else { - $textRun = $richText->createTextRun($text); - if (isset($fmtRuns[$i - 1])) { - if ($fmtRuns[$i - 1]['fontIndex'] < 4) { - $fontIndex = $fmtRuns[$i - 1]['fontIndex']; - } else { - // this has to do with that index 4 is omitted in all BIFF versions for some strange reason - // check the OpenOffice documentation of the FONT record - $fontIndex = $fmtRuns[$i - 1]['fontIndex'] - 1; - } - $textRun->setFont(clone $this->objFonts[$fontIndex]); - } - } - } - } - if ($this->readEmptyCells || trim($richText->getPlainText()) !== '') { - $cell = $this->phpSheet->getCell($columnString . ($row + 1)); - $cell->setValueExplicit($richText, DataType::TYPE_STRING); - $emptyCell = false; - } - } else { - if ($this->readEmptyCells || trim($this->sst[$index]['value']) !== '') { - $cell = $this->phpSheet->getCell($columnString . ($row + 1)); - $cell->setValueExplicit($this->sst[$index]['value'], DataType::TYPE_STRING); - $emptyCell = false; - } - } - - if (!$this->readDataOnly && !$emptyCell && isset($this->mapCellXfIndex[$xfIndex])) { - // add style information - $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - } - } - - /** - * Read MULRK record - * This record represents a cell range containing RK value - * cells. All cells are located in the same row. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readMulRk(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; index to row - $row = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; index to first column - $colFirst = self::getUInt2d($recordData, 2); - - // offset: var; size: 2; index to last column - $colLast = self::getUInt2d($recordData, $length - 2); - $columns = $colLast - $colFirst + 1; - - // offset within record data - $offset = 4; - - for ($i = 1; $i <= $columns; ++$i) { - $columnString = Coordinate::stringFromColumnIndex($colFirst + $i); - - // Read cell? - if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { - // offset: var; size: 2; index to XF record - $xfIndex = self::getUInt2d($recordData, $offset); - - // offset: var; size: 4; RK value - $numValue = self::getIEEE754(self::getInt4d($recordData, $offset + 2)); - $cell = $this->phpSheet->getCell($columnString . ($row + 1)); - if (!$this->readDataOnly && isset($this->mapCellXfIndex[$xfIndex])) { - // add style - $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - - // add cell value - $cell->setValueExplicit($numValue, DataType::TYPE_NUMERIC); - } - - $offset += 6; - } - } - - /** - * Read NUMBER record - * This record represents a cell that contains a - * floating-point value. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readNumber(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; index to row - $row = self::getUInt2d($recordData, 0); - - // offset: 2; size 2; index to column - $column = self::getUInt2d($recordData, 2); - $columnString = Coordinate::stringFromColumnIndex($column + 1); - - // Read cell? - if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { - // offset 4; size: 2; index to XF record - $xfIndex = self::getUInt2d($recordData, 4); - - $numValue = self::extractNumber(substr($recordData, 6, 8)); - - $cell = $this->phpSheet->getCell($columnString . ($row + 1)); - if (!$this->readDataOnly && isset($this->mapCellXfIndex[$xfIndex])) { - // add cell style - $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - - // add cell value - $cell->setValueExplicit($numValue, DataType::TYPE_NUMERIC); - } - } - - /** - * Read FORMULA record + perhaps a following STRING record if formula result is a string - * This record contains the token array and the result of a - * formula cell. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readFormula(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; row index - $row = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; col index - $column = self::getUInt2d($recordData, 2); - $columnString = Coordinate::stringFromColumnIndex($column + 1); - - // offset: 20: size: variable; formula structure - $formulaStructure = substr($recordData, 20); - - // offset: 14: size: 2; option flags, recalculate always, recalculate on open etc. - $options = self::getUInt2d($recordData, 14); - - // bit: 0; mask: 0x0001; 1 = recalculate always - // bit: 1; mask: 0x0002; 1 = calculate on open - // bit: 2; mask: 0x0008; 1 = part of a shared formula - $isPartOfSharedFormula = (bool) (0x0008 & $options); - - // WARNING: - // We can apparently not rely on $isPartOfSharedFormula. Even when $isPartOfSharedFormula = true - // the formula data may be ordinary formula data, therefore we need to check - // explicitly for the tExp token (0x01) - $isPartOfSharedFormula = $isPartOfSharedFormula && ord($formulaStructure[2]) == 0x01; - - if ($isPartOfSharedFormula) { - // part of shared formula which means there will be a formula with a tExp token and nothing else - // get the base cell, grab tExp token - $baseRow = self::getUInt2d($formulaStructure, 3); - $baseCol = self::getUInt2d($formulaStructure, 5); - $this->baseCell = Coordinate::stringFromColumnIndex($baseCol + 1) . ($baseRow + 1); - } - - // Read cell? - if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { - if ($isPartOfSharedFormula) { - // formula is added to this cell after the sheet has been read - $this->sharedFormulaParts[$columnString . ($row + 1)] = $this->baseCell; - } - - // offset: 16: size: 4; not used - - // offset: 4; size: 2; XF index - $xfIndex = self::getUInt2d($recordData, 4); - - // offset: 6; size: 8; result of the formula - if ((ord($recordData[6]) == 0) && (ord($recordData[12]) == 255) && (ord($recordData[13]) == 255)) { - // String formula. Result follows in appended STRING record - $dataType = DataType::TYPE_STRING; - - // read possible SHAREDFMLA record - $code = self::getUInt2d($this->data, $this->pos); - if ($code == self::XLS_TYPE_SHAREDFMLA) { - $this->readSharedFmla(); - } - - // read STRING record - $value = $this->readString(); - } elseif ( - (ord($recordData[6]) == 1) - && (ord($recordData[12]) == 255) - && (ord($recordData[13]) == 255) - ) { - // Boolean formula. Result is in +2; 0=false, 1=true - $dataType = DataType::TYPE_BOOL; - $value = (bool) ord($recordData[8]); - } elseif ( - (ord($recordData[6]) == 2) - && (ord($recordData[12]) == 255) - && (ord($recordData[13]) == 255) - ) { - // Error formula. Error code is in +2 - $dataType = DataType::TYPE_ERROR; - $value = Xls\ErrorCode::lookup(ord($recordData[8])); - } elseif ( - (ord($recordData[6]) == 3) - && (ord($recordData[12]) == 255) - && (ord($recordData[13]) == 255) - ) { - // Formula result is a null string - $dataType = DataType::TYPE_NULL; - $value = ''; - } else { - // forumla result is a number, first 14 bytes like _NUMBER record - $dataType = DataType::TYPE_NUMERIC; - $value = self::extractNumber(substr($recordData, 6, 8)); - } - - $cell = $this->phpSheet->getCell($columnString . ($row + 1)); - if (!$this->readDataOnly && isset($this->mapCellXfIndex[$xfIndex])) { - // add cell style - $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - - // store the formula - if (!$isPartOfSharedFormula) { - // not part of shared formula - // add cell value. If we can read formula, populate with formula, otherwise just used cached value - try { - if ($this->version != self::XLS_BIFF8) { - throw new Exception('Not BIFF8. Can only read BIFF8 formulas'); - } - $formula = $this->getFormulaFromStructure($formulaStructure); // get formula in human language - $cell->setValueExplicit('=' . $formula, DataType::TYPE_FORMULA); - } catch (PhpSpreadsheetException $e) { - $cell->setValueExplicit($value, $dataType); - } - } else { - if ($this->version == self::XLS_BIFF8) { - // do nothing at this point, formula id added later in the code - } else { - $cell->setValueExplicit($value, $dataType); - } - } - - // store the cached calculated value - $cell->setCalculatedValue($value); - } - } - - /** - * Read a SHAREDFMLA record. This function just stores the binary shared formula in the reader, - * which usually contains relative references. - * These will be used to construct the formula in each shared formula part after the sheet is read. - */ - private function readSharedFmla(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0, size: 6; cell range address of the area used by the shared formula, not used for anything - $cellRange = substr($recordData, 0, 6); - $cellRange = $this->readBIFF5CellRangeAddressFixed($cellRange); // note: even BIFF8 uses BIFF5 syntax - - // offset: 6, size: 1; not used - - // offset: 7, size: 1; number of existing FORMULA records for this shared formula - $no = ord($recordData[7]); - - // offset: 8, size: var; Binary token array of the shared formula - $formula = substr($recordData, 8); - - // at this point we only store the shared formula for later use - $this->sharedFormulas[$this->baseCell] = $formula; - } - - /** - * Read a STRING record from current stream position and advance the stream pointer to next record - * This record is used for storing result from FORMULA record when it is a string, and - * it occurs directly after the FORMULA record. - * - * @return string The string contents as UTF-8 - */ - private function readString() - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringLong($recordData); - $value = $string['value']; - } else { - $string = $this->readByteStringLong($recordData); - $value = $string['value']; - } - - return $value; - } - - /** - * Read BOOLERR record - * This record represents a Boolean value or error value - * cell. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readBoolErr(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; row index - $row = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; column index - $column = self::getUInt2d($recordData, 2); - $columnString = Coordinate::stringFromColumnIndex($column + 1); - - // Read cell? - if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { - // offset: 4; size: 2; index to XF record - $xfIndex = self::getUInt2d($recordData, 4); - - // offset: 6; size: 1; the boolean value or error value - $boolErr = ord($recordData[6]); - - // offset: 7; size: 1; 0=boolean; 1=error - $isError = ord($recordData[7]); - - $cell = $this->phpSheet->getCell($columnString . ($row + 1)); - switch ($isError) { - case 0: // boolean - $value = (bool) $boolErr; - - // add cell value - $cell->setValueExplicit($value, DataType::TYPE_BOOL); - - break; - case 1: // error type - $value = Xls\ErrorCode::lookup($boolErr); - - // add cell value - $cell->setValueExplicit($value, DataType::TYPE_ERROR); - - break; - } - - if (!$this->readDataOnly && isset($this->mapCellXfIndex[$xfIndex])) { - // add cell style - $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - } - } - - /** - * Read MULBLANK record - * This record represents a cell range of empty cells. All - * cells are located in the same row. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readMulBlank(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; index to row - $row = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; index to first column - $fc = self::getUInt2d($recordData, 2); - - // offset: 4; size: 2 x nc; list of indexes to XF records - // add style information - if (!$this->readDataOnly && $this->readEmptyCells) { - for ($i = 0; $i < $length / 2 - 3; ++$i) { - $columnString = Coordinate::stringFromColumnIndex($fc + $i + 1); - - // Read cell? - if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { - $xfIndex = self::getUInt2d($recordData, 4 + 2 * $i); - if (isset($this->mapCellXfIndex[$xfIndex])) { - $this->phpSheet->getCell($columnString . ($row + 1))->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - } - } - } - - // offset: 6; size 2; index to last column (not needed) - } - - /** - * Read LABEL record - * This record represents a cell that contains a string. In - * BIFF8 it is usually replaced by the LABELSST record. - * Excel still uses this record, if it copies unformatted - * text cells to the clipboard. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readLabel(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; index to row - $row = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; index to column - $column = self::getUInt2d($recordData, 2); - $columnString = Coordinate::stringFromColumnIndex($column + 1); - - // Read cell? - if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { - // offset: 4; size: 2; XF index - $xfIndex = self::getUInt2d($recordData, 4); - - // add cell value - // todo: what if string is very long? continue record - if ($this->version == self::XLS_BIFF8) { - $string = self::readUnicodeStringLong(substr($recordData, 6)); - $value = $string['value']; - } else { - $string = $this->readByteStringLong(substr($recordData, 6)); - $value = $string['value']; - } - if ($this->readEmptyCells || trim($value) !== '') { - $cell = $this->phpSheet->getCell($columnString . ($row + 1)); - $cell->setValueExplicit($value, DataType::TYPE_STRING); - - if (!$this->readDataOnly && isset($this->mapCellXfIndex[$xfIndex])) { - // add cell style - $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - } - } - } - - /** - * Read BLANK record. - */ - private function readBlank(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; row index - $row = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; col index - $col = self::getUInt2d($recordData, 2); - $columnString = Coordinate::stringFromColumnIndex($col + 1); - - // Read cell? - if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { - // offset: 4; size: 2; XF index - $xfIndex = self::getUInt2d($recordData, 4); - - // add style information - if (!$this->readDataOnly && $this->readEmptyCells && isset($this->mapCellXfIndex[$xfIndex])) { - $this->phpSheet->getCell($columnString . ($row + 1))->setXfIndex($this->mapCellXfIndex[$xfIndex]); - } - } - } - - /** - * Read MSODRAWING record. - */ - private function readMsoDrawing(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - - // get spliced record data - $splicedRecordData = $this->getSplicedRecordData(); - $recordData = $splicedRecordData['recordData']; - - $this->drawingData .= $recordData; - } - - /** - * Read OBJ record. - */ - private function readObj(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->readDataOnly || $this->version != self::XLS_BIFF8) { - return; - } - - // recordData consists of an array of subrecords looking like this: - // ft: 2 bytes; ftCmo type (0x15) - // cb: 2 bytes; size in bytes of ftCmo data - // ot: 2 bytes; Object Type - // id: 2 bytes; Object id number - // grbit: 2 bytes; Option Flags - // data: var; subrecord data - - // for now, we are just interested in the second subrecord containing the object type - $ftCmoType = self::getUInt2d($recordData, 0); - $cbCmoSize = self::getUInt2d($recordData, 2); - $otObjType = self::getUInt2d($recordData, 4); - $idObjID = self::getUInt2d($recordData, 6); - $grbitOpts = self::getUInt2d($recordData, 6); - - $this->objs[] = [ - 'ftCmoType' => $ftCmoType, - 'cbCmoSize' => $cbCmoSize, - 'otObjType' => $otObjType, - 'idObjID' => $idObjID, - 'grbitOpts' => $grbitOpts, - ]; - $this->textObjRef = $idObjID; - } - - /** - * Read WINDOW2 record. - */ - private function readWindow2(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; option flags - $options = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; index to first visible row - $firstVisibleRow = self::getUInt2d($recordData, 2); - - // offset: 4; size: 2; index to first visible colum - $firstVisibleColumn = self::getUInt2d($recordData, 4); - if ($this->version === self::XLS_BIFF8) { - // offset: 8; size: 2; not used - // offset: 10; size: 2; cached magnification factor in page break preview (in percent); 0 = Default (60%) - // offset: 12; size: 2; cached magnification factor in normal view (in percent); 0 = Default (100%) - // offset: 14; size: 4; not used - $zoomscaleInPageBreakPreview = self::getUInt2d($recordData, 10); - if ($zoomscaleInPageBreakPreview === 0) { - $zoomscaleInPageBreakPreview = 60; - } - $zoomscaleInNormalView = self::getUInt2d($recordData, 12); - if ($zoomscaleInNormalView === 0) { - $zoomscaleInNormalView = 100; - } - } - - // bit: 1; mask: 0x0002; 0 = do not show gridlines, 1 = show gridlines - $showGridlines = (bool) ((0x0002 & $options) >> 1); - $this->phpSheet->setShowGridlines($showGridlines); - - // bit: 2; mask: 0x0004; 0 = do not show headers, 1 = show headers - $showRowColHeaders = (bool) ((0x0004 & $options) >> 2); - $this->phpSheet->setShowRowColHeaders($showRowColHeaders); - - // bit: 3; mask: 0x0008; 0 = panes are not frozen, 1 = panes are frozen - $this->frozen = (bool) ((0x0008 & $options) >> 3); - - // bit: 6; mask: 0x0040; 0 = columns from left to right, 1 = columns from right to left - $this->phpSheet->setRightToLeft((bool) ((0x0040 & $options) >> 6)); - - // bit: 10; mask: 0x0400; 0 = sheet not active, 1 = sheet active - $isActive = (bool) ((0x0400 & $options) >> 10); - if ($isActive) { - $this->spreadsheet->setActiveSheetIndex($this->spreadsheet->getIndex($this->phpSheet)); - } - - // bit: 11; mask: 0x0800; 0 = normal view, 1 = page break view - $isPageBreakPreview = (bool) ((0x0800 & $options) >> 11); - - //FIXME: set $firstVisibleRow and $firstVisibleColumn - - if ($this->phpSheet->getSheetView()->getView() !== SheetView::SHEETVIEW_PAGE_LAYOUT) { - //NOTE: this setting is inferior to page layout view(Excel2007-) - $view = $isPageBreakPreview ? SheetView::SHEETVIEW_PAGE_BREAK_PREVIEW : SheetView::SHEETVIEW_NORMAL; - $this->phpSheet->getSheetView()->setView($view); - if ($this->version === self::XLS_BIFF8) { - $zoomScale = $isPageBreakPreview ? $zoomscaleInPageBreakPreview : $zoomscaleInNormalView; - $this->phpSheet->getSheetView()->setZoomScale($zoomScale); - $this->phpSheet->getSheetView()->setZoomScaleNormal($zoomscaleInNormalView); - } - } - } - - /** - * Read PLV Record(Created by Excel2007 or upper). - */ - private function readPageLayoutView(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; rt - //->ignore - $rt = self::getUInt2d($recordData, 0); - // offset: 2; size: 2; grbitfr - //->ignore - $grbitFrt = self::getUInt2d($recordData, 2); - // offset: 4; size: 8; reserved - //->ignore - - // offset: 12; size 2; zoom scale - $wScalePLV = self::getUInt2d($recordData, 12); - // offset: 14; size 2; grbit - $grbit = self::getUInt2d($recordData, 14); - - // decomprise grbit - $fPageLayoutView = $grbit & 0x01; - $fRulerVisible = ($grbit >> 1) & 0x01; //no support - $fWhitespaceHidden = ($grbit >> 3) & 0x01; //no support - - if ($fPageLayoutView === 1) { - $this->phpSheet->getSheetView()->setView(SheetView::SHEETVIEW_PAGE_LAYOUT); - $this->phpSheet->getSheetView()->setZoomScale($wScalePLV); //set by Excel2007 only if SHEETVIEW_PAGE_LAYOUT - } - //otherwise, we cannot know whether SHEETVIEW_PAGE_LAYOUT or SHEETVIEW_PAGE_BREAK_PREVIEW. - } - - /** - * Read SCL record. - */ - private function readScl(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // offset: 0; size: 2; numerator of the view magnification - $numerator = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; numerator of the view magnification - $denumerator = self::getUInt2d($recordData, 2); - - // set the zoom scale (in percent) - $this->phpSheet->getSheetView()->setZoomScale($numerator * 100 / $denumerator); - } - - /** - * Read PANE record. - */ - private function readPane(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; position of vertical split - $px = self::getUInt2d($recordData, 0); - - // offset: 2; size: 2; position of horizontal split - $py = self::getUInt2d($recordData, 2); - - // offset: 4; size: 2; top most visible row in the bottom pane - $rwTop = self::getUInt2d($recordData, 4); - - // offset: 6; size: 2; first visible left column in the right pane - $colLeft = self::getUInt2d($recordData, 6); - - if ($this->frozen) { - // frozen panes - $cell = Coordinate::stringFromColumnIndex($px + 1) . ($py + 1); - $topLeftCell = Coordinate::stringFromColumnIndex($colLeft + 1) . ($rwTop + 1); - $this->phpSheet->freezePane($cell, $topLeftCell); - } - // unfrozen panes; split windows; not supported by PhpSpreadsheet core - } - } - - /** - * Read SELECTION record. There is one such record for each pane in the sheet. - */ - private function readSelection(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 1; pane identifier - $paneId = ord($recordData[0]); - - // offset: 1; size: 2; index to row of the active cell - $r = self::getUInt2d($recordData, 1); - - // offset: 3; size: 2; index to column of the active cell - $c = self::getUInt2d($recordData, 3); - - // offset: 5; size: 2; index into the following cell range list to the - // entry that contains the active cell - $index = self::getUInt2d($recordData, 5); - - // offset: 7; size: var; cell range address list containing all selected cell ranges - $data = substr($recordData, 7); - $cellRangeAddressList = $this->readBIFF5CellRangeAddressList($data); // note: also BIFF8 uses BIFF5 syntax - - $selectedCells = $cellRangeAddressList['cellRangeAddresses'][0]; - - // first row '1' + last row '16384' indicates that full column is selected (apparently also in BIFF8!) - if (preg_match('/^([A-Z]+1\:[A-Z]+)16384$/', $selectedCells)) { - $selectedCells = preg_replace('/^([A-Z]+1\:[A-Z]+)16384$/', '${1}1048576', $selectedCells); - } - - // first row '1' + last row '65536' indicates that full column is selected - if (preg_match('/^([A-Z]+1\:[A-Z]+)65536$/', $selectedCells)) { - $selectedCells = preg_replace('/^([A-Z]+1\:[A-Z]+)65536$/', '${1}1048576', $selectedCells); - } - - // first column 'A' + last column 'IV' indicates that full row is selected - if (preg_match('/^(A\d+\:)IV(\d+)$/', $selectedCells)) { - $selectedCells = preg_replace('/^(A\d+\:)IV(\d+)$/', '${1}XFD${2}', $selectedCells); - } - - $this->phpSheet->setSelectedCells($selectedCells); - } - } - - private function includeCellRangeFiltered($cellRangeAddress) - { - $includeCellRange = true; - if ($this->getReadFilter() !== null) { - $includeCellRange = false; - $rangeBoundaries = Coordinate::getRangeBoundaries($cellRangeAddress); - ++$rangeBoundaries[1][0]; - for ($row = $rangeBoundaries[0][1]; $row <= $rangeBoundaries[1][1]; ++$row) { - for ($column = $rangeBoundaries[0][0]; $column != $rangeBoundaries[1][0]; ++$column) { - if ($this->getReadFilter()->readCell($column, $row, $this->phpSheet->getTitle())) { - $includeCellRange = true; - - break 2; - } - } - } - } - - return $includeCellRange; - } - - /** - * MERGEDCELLS. - * - * This record contains the addresses of merged cell ranges - * in the current sheet. - * - * -- "OpenOffice.org's Documentation of the Microsoft - * Excel File Format" - */ - private function readMergedCells(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) { - $cellRangeAddressList = $this->readBIFF8CellRangeAddressList($recordData); - foreach ($cellRangeAddressList['cellRangeAddresses'] as $cellRangeAddress) { - if ( - (strpos($cellRangeAddress, ':') !== false) && - ($this->includeCellRangeFiltered($cellRangeAddress)) - ) { - $this->phpSheet->mergeCells($cellRangeAddress); - } - } - } - } - - /** - * Read HYPERLINK record. - */ - private function readHyperLink(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer forward to next record - $this->pos += 4 + $length; - - if (!$this->readDataOnly) { - // offset: 0; size: 8; cell range address of all cells containing this hyperlink - try { - $cellRange = $this->readBIFF8CellRangeAddressFixed($recordData); - } catch (PhpSpreadsheetException $e) { - return; - } - - // offset: 8, size: 16; GUID of StdLink - - // offset: 24, size: 4; unknown value - - // offset: 28, size: 4; option flags - // bit: 0; mask: 0x00000001; 0 = no link or extant, 1 = file link or URL - $isFileLinkOrUrl = (0x00000001 & self::getUInt2d($recordData, 28)) >> 0; - - // bit: 1; mask: 0x00000002; 0 = relative path, 1 = absolute path or URL - $isAbsPathOrUrl = (0x00000001 & self::getUInt2d($recordData, 28)) >> 1; - - // bit: 2 (and 4); mask: 0x00000014; 0 = no description - $hasDesc = (0x00000014 & self::getUInt2d($recordData, 28)) >> 2; - - // bit: 3; mask: 0x00000008; 0 = no text, 1 = has text - $hasText = (0x00000008 & self::getUInt2d($recordData, 28)) >> 3; - - // bit: 7; mask: 0x00000080; 0 = no target frame, 1 = has target frame - $hasFrame = (0x00000080 & self::getUInt2d($recordData, 28)) >> 7; - - // bit: 8; mask: 0x00000100; 0 = file link or URL, 1 = UNC path (inc. server name) - $isUNC = (0x00000100 & self::getUInt2d($recordData, 28)) >> 8; - - // offset within record data - $offset = 32; - - if ($hasDesc) { - // offset: 32; size: var; character count of description text - $dl = self::getInt4d($recordData, 32); - // offset: 36; size: var; character array of description text, no Unicode string header, always 16-bit characters, zero terminated - $desc = self::encodeUTF16(substr($recordData, 36, 2 * ($dl - 1)), false); - $offset += 4 + 2 * $dl; - } - if ($hasFrame) { - $fl = self::getInt4d($recordData, $offset); - $offset += 4 + 2 * $fl; - } - - // detect type of hyperlink (there are 4 types) - $hyperlinkType = null; - - if ($isUNC) { - $hyperlinkType = 'UNC'; - } elseif (!$isFileLinkOrUrl) { - $hyperlinkType = 'workbook'; - } elseif (ord($recordData[$offset]) == 0x03) { - $hyperlinkType = 'local'; - } elseif (ord($recordData[$offset]) == 0xE0) { - $hyperlinkType = 'URL'; - } - - switch ($hyperlinkType) { - case 'URL': - // section 5.58.2: Hyperlink containing a URL - // e.g. http://example.org/index.php - - // offset: var; size: 16; GUID of URL Moniker - $offset += 16; - // offset: var; size: 4; size (in bytes) of character array of the URL including trailing zero word - $us = self::getInt4d($recordData, $offset); - $offset += 4; - // offset: var; size: $us; character array of the URL, no Unicode string header, always 16-bit characters, zero-terminated - $url = self::encodeUTF16(substr($recordData, $offset, $us - 2), false); - $nullOffset = strpos($url, chr(0x00)); - if ($nullOffset) { - $url = substr($url, 0, $nullOffset); - } - $url .= $hasText ? '#' : ''; - $offset += $us; - - break; - case 'local': - // section 5.58.3: Hyperlink to local file - // examples: - // mydoc.txt - // ../../somedoc.xls#Sheet!A1 - - // offset: var; size: 16; GUI of File Moniker - $offset += 16; - - // offset: var; size: 2; directory up-level count. - $upLevelCount = self::getUInt2d($recordData, $offset); - $offset += 2; - - // offset: var; size: 4; character count of the shortened file path and name, including trailing zero word - $sl = self::getInt4d($recordData, $offset); - $offset += 4; - - // offset: var; size: sl; character array of the shortened file path and name in 8.3-DOS-format (compressed Unicode string) - $shortenedFilePath = substr($recordData, $offset, $sl); - $shortenedFilePath = self::encodeUTF16($shortenedFilePath, true); - $shortenedFilePath = substr($shortenedFilePath, 0, -1); // remove trailing zero - - $offset += $sl; - - // offset: var; size: 24; unknown sequence - $offset += 24; - - // extended file path - // offset: var; size: 4; size of the following file link field including string lenth mark - $sz = self::getInt4d($recordData, $offset); - $offset += 4; - - // only present if $sz > 0 - if ($sz > 0) { - // offset: var; size: 4; size of the character array of the extended file path and name - $xl = self::getInt4d($recordData, $offset); - $offset += 4; - - // offset: var; size 2; unknown - $offset += 2; - - // offset: var; size $xl; character array of the extended file path and name. - $extendedFilePath = substr($recordData, $offset, $xl); - $extendedFilePath = self::encodeUTF16($extendedFilePath, false); - $offset += $xl; - } - - // construct the path - $url = str_repeat('..\\', $upLevelCount); - $url .= ($sz > 0) ? $extendedFilePath : $shortenedFilePath; // use extended path if available - $url .= $hasText ? '#' : ''; - - break; - case 'UNC': - // section 5.58.4: Hyperlink to a File with UNC (Universal Naming Convention) Path - // todo: implement - return; - case 'workbook': - // section 5.58.5: Hyperlink to the Current Workbook - // e.g. Sheet2!B1:C2, stored in text mark field - $url = 'sheet://'; - - break; - default: - return; - } - - if ($hasText) { - // offset: var; size: 4; character count of text mark including trailing zero word - $tl = self::getInt4d($recordData, $offset); - $offset += 4; - // offset: var; size: var; character array of the text mark without the # sign, no Unicode header, always 16-bit characters, zero-terminated - $text = self::encodeUTF16(substr($recordData, $offset, 2 * ($tl - 1)), false); - $url .= $text; - } - - // apply the hyperlink to all the relevant cells - foreach (Coordinate::extractAllCellReferencesInRange($cellRange) as $coordinate) { - $this->phpSheet->getCell($coordinate)->getHyperLink()->setUrl($url); - } - } - } - - /** - * Read DATAVALIDATIONS record. - */ - private function readDataValidations(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer forward to next record - $this->pos += 4 + $length; - } - - /** - * Read DATAVALIDATION record. - */ - private function readDataValidation(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer forward to next record - $this->pos += 4 + $length; - - if ($this->readDataOnly) { - return; - } - - // offset: 0; size: 4; Options - $options = self::getInt4d($recordData, 0); - - // bit: 0-3; mask: 0x0000000F; type - $type = (0x0000000F & $options) >> 0; - switch ($type) { - case 0x00: - $type = DataValidation::TYPE_NONE; - - break; - case 0x01: - $type = DataValidation::TYPE_WHOLE; - - break; - case 0x02: - $type = DataValidation::TYPE_DECIMAL; - - break; - case 0x03: - $type = DataValidation::TYPE_LIST; - - break; - case 0x04: - $type = DataValidation::TYPE_DATE; - - break; - case 0x05: - $type = DataValidation::TYPE_TIME; - - break; - case 0x06: - $type = DataValidation::TYPE_TEXTLENGTH; - - break; - case 0x07: - $type = DataValidation::TYPE_CUSTOM; - - break; - } - - // bit: 4-6; mask: 0x00000070; error type - $errorStyle = (0x00000070 & $options) >> 4; - switch ($errorStyle) { - case 0x00: - $errorStyle = DataValidation::STYLE_STOP; - - break; - case 0x01: - $errorStyle = DataValidation::STYLE_WARNING; - - break; - case 0x02: - $errorStyle = DataValidation::STYLE_INFORMATION; - - break; - } - - // bit: 7; mask: 0x00000080; 1= formula is explicit (only applies to list) - // I have only seen cases where this is 1 - $explicitFormula = (0x00000080 & $options) >> 7; - - // bit: 8; mask: 0x00000100; 1= empty cells allowed - $allowBlank = (0x00000100 & $options) >> 8; - - // bit: 9; mask: 0x00000200; 1= suppress drop down arrow in list type validity - $suppressDropDown = (0x00000200 & $options) >> 9; - - // bit: 18; mask: 0x00040000; 1= show prompt box if cell selected - $showInputMessage = (0x00040000 & $options) >> 18; - - // bit: 19; mask: 0x00080000; 1= show error box if invalid values entered - $showErrorMessage = (0x00080000 & $options) >> 19; - - // bit: 20-23; mask: 0x00F00000; condition operator - $operator = (0x00F00000 & $options) >> 20; - switch ($operator) { - case 0x00: - $operator = DataValidation::OPERATOR_BETWEEN; - - break; - case 0x01: - $operator = DataValidation::OPERATOR_NOTBETWEEN; - - break; - case 0x02: - $operator = DataValidation::OPERATOR_EQUAL; - - break; - case 0x03: - $operator = DataValidation::OPERATOR_NOTEQUAL; - - break; - case 0x04: - $operator = DataValidation::OPERATOR_GREATERTHAN; - - break; - case 0x05: - $operator = DataValidation::OPERATOR_LESSTHAN; - - break; - case 0x06: - $operator = DataValidation::OPERATOR_GREATERTHANOREQUAL; - - break; - case 0x07: - $operator = DataValidation::OPERATOR_LESSTHANOREQUAL; - - break; - } - - // offset: 4; size: var; title of the prompt box - $offset = 4; - $string = self::readUnicodeStringLong(substr($recordData, $offset)); - $promptTitle = $string['value'] !== chr(0) ? $string['value'] : ''; - $offset += $string['size']; - - // offset: var; size: var; title of the error box - $string = self::readUnicodeStringLong(substr($recordData, $offset)); - $errorTitle = $string['value'] !== chr(0) ? $string['value'] : ''; - $offset += $string['size']; - - // offset: var; size: var; text of the prompt box - $string = self::readUnicodeStringLong(substr($recordData, $offset)); - $prompt = $string['value'] !== chr(0) ? $string['value'] : ''; - $offset += $string['size']; - - // offset: var; size: var; text of the error box - $string = self::readUnicodeStringLong(substr($recordData, $offset)); - $error = $string['value'] !== chr(0) ? $string['value'] : ''; - $offset += $string['size']; - - // offset: var; size: 2; size of the formula data for the first condition - $sz1 = self::getUInt2d($recordData, $offset); - $offset += 2; - - // offset: var; size: 2; not used - $offset += 2; - - // offset: var; size: $sz1; formula data for first condition (without size field) - $formula1 = substr($recordData, $offset, $sz1); - $formula1 = pack('v', $sz1) . $formula1; // prepend the length - - try { - $formula1 = $this->getFormulaFromStructure($formula1); - - // in list type validity, null characters are used as item separators - if ($type == DataValidation::TYPE_LIST) { - $formula1 = str_replace(chr(0), ',', $formula1); - } - } catch (PhpSpreadsheetException $e) { - return; - } - $offset += $sz1; - - // offset: var; size: 2; size of the formula data for the first condition - $sz2 = self::getUInt2d($recordData, $offset); - $offset += 2; - - // offset: var; size: 2; not used - $offset += 2; - - // offset: var; size: $sz2; formula data for second condition (without size field) - $formula2 = substr($recordData, $offset, $sz2); - $formula2 = pack('v', $sz2) . $formula2; // prepend the length - - try { - $formula2 = $this->getFormulaFromStructure($formula2); - } catch (PhpSpreadsheetException $e) { - return; - } - $offset += $sz2; - - // offset: var; size: var; cell range address list with - $cellRangeAddressList = $this->readBIFF8CellRangeAddressList(substr($recordData, $offset)); - $cellRangeAddresses = $cellRangeAddressList['cellRangeAddresses']; - - foreach ($cellRangeAddresses as $cellRange) { - $stRange = $this->phpSheet->shrinkRangeToFit($cellRange); - foreach (Coordinate::extractAllCellReferencesInRange($stRange) as $coordinate) { - $objValidation = $this->phpSheet->getCell($coordinate)->getDataValidation(); - $objValidation->setType($type); - $objValidation->setErrorStyle($errorStyle); - $objValidation->setAllowBlank((bool) $allowBlank); - $objValidation->setShowInputMessage((bool) $showInputMessage); - $objValidation->setShowErrorMessage((bool) $showErrorMessage); - $objValidation->setShowDropDown(!$suppressDropDown); - $objValidation->setOperator($operator); - $objValidation->setErrorTitle($errorTitle); - $objValidation->setError($error); - $objValidation->setPromptTitle($promptTitle); - $objValidation->setPrompt($prompt); - $objValidation->setFormula1($formula1); - $objValidation->setFormula2($formula2); - } - } - } - - /** - * Read SHEETLAYOUT record. Stores sheet tab color information. - */ - private function readSheetLayout(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // local pointer in record data - $offset = 0; - - if (!$this->readDataOnly) { - // offset: 0; size: 2; repeated record identifier 0x0862 - - // offset: 2; size: 10; not used - - // offset: 12; size: 4; size of record data - // Excel 2003 uses size of 0x14 (documented), Excel 2007 uses size of 0x28 (not documented?) - $sz = self::getInt4d($recordData, 12); - - switch ($sz) { - case 0x14: - // offset: 16; size: 2; color index for sheet tab - $colorIndex = self::getUInt2d($recordData, 16); - $color = Xls\Color::map($colorIndex, $this->palette, $this->version); - $this->phpSheet->getTabColor()->setRGB($color['rgb']); - - break; - case 0x28: - // TODO: Investigate structure for .xls SHEETLAYOUT record as saved by MS Office Excel 2007 - return; - - break; - } - } - } - - /** - * Read SHEETPROTECTION record (FEATHEADR). - */ - private function readSheetProtection(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - if ($this->readDataOnly) { - return; - } - - // offset: 0; size: 2; repeated record header - - // offset: 2; size: 2; FRT cell reference flag (=0 currently) - - // offset: 4; size: 8; Currently not used and set to 0 - - // offset: 12; size: 2; Shared feature type index (2=Enhanced Protetion, 4=SmartTag) - $isf = self::getUInt2d($recordData, 12); - if ($isf != 2) { - return; - } - - // offset: 14; size: 1; =1 since this is a feat header - - // offset: 15; size: 4; size of rgbHdrSData - - // rgbHdrSData, assume "Enhanced Protection" - // offset: 19; size: 2; option flags - $options = self::getUInt2d($recordData, 19); - - // bit: 0; mask 0x0001; 1 = user may edit objects, 0 = users must not edit objects - $bool = (0x0001 & $options) >> 0; - $this->phpSheet->getProtection()->setObjects(!$bool); - - // bit: 1; mask 0x0002; edit scenarios - $bool = (0x0002 & $options) >> 1; - $this->phpSheet->getProtection()->setScenarios(!$bool); - - // bit: 2; mask 0x0004; format cells - $bool = (0x0004 & $options) >> 2; - $this->phpSheet->getProtection()->setFormatCells(!$bool); - - // bit: 3; mask 0x0008; format columns - $bool = (0x0008 & $options) >> 3; - $this->phpSheet->getProtection()->setFormatColumns(!$bool); - - // bit: 4; mask 0x0010; format rows - $bool = (0x0010 & $options) >> 4; - $this->phpSheet->getProtection()->setFormatRows(!$bool); - - // bit: 5; mask 0x0020; insert columns - $bool = (0x0020 & $options) >> 5; - $this->phpSheet->getProtection()->setInsertColumns(!$bool); - - // bit: 6; mask 0x0040; insert rows - $bool = (0x0040 & $options) >> 6; - $this->phpSheet->getProtection()->setInsertRows(!$bool); - - // bit: 7; mask 0x0080; insert hyperlinks - $bool = (0x0080 & $options) >> 7; - $this->phpSheet->getProtection()->setInsertHyperlinks(!$bool); - - // bit: 8; mask 0x0100; delete columns - $bool = (0x0100 & $options) >> 8; - $this->phpSheet->getProtection()->setDeleteColumns(!$bool); - - // bit: 9; mask 0x0200; delete rows - $bool = (0x0200 & $options) >> 9; - $this->phpSheet->getProtection()->setDeleteRows(!$bool); - - // bit: 10; mask 0x0400; select locked cells - $bool = (0x0400 & $options) >> 10; - $this->phpSheet->getProtection()->setSelectLockedCells(!$bool); - - // bit: 11; mask 0x0800; sort cell range - $bool = (0x0800 & $options) >> 11; - $this->phpSheet->getProtection()->setSort(!$bool); - - // bit: 12; mask 0x1000; auto filter - $bool = (0x1000 & $options) >> 12; - $this->phpSheet->getProtection()->setAutoFilter(!$bool); - - // bit: 13; mask 0x2000; pivot tables - $bool = (0x2000 & $options) >> 13; - $this->phpSheet->getProtection()->setPivotTables(!$bool); - - // bit: 14; mask 0x4000; select unlocked cells - $bool = (0x4000 & $options) >> 14; - $this->phpSheet->getProtection()->setSelectUnlockedCells(!$bool); - - // offset: 21; size: 2; not used - } - - /** - * Read RANGEPROTECTION record - * Reading of this record is based on Microsoft Office Excel 97-2000 Binary File Format Specification, - * where it is referred to as FEAT record. - */ - private function readRangeProtection(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // move stream pointer to next record - $this->pos += 4 + $length; - - // local pointer in record data - $offset = 0; - - if (!$this->readDataOnly) { - $offset += 12; - - // offset: 12; size: 2; shared feature type, 2 = enhanced protection, 4 = smart tag - $isf = self::getUInt2d($recordData, 12); - if ($isf != 2) { - // we only read FEAT records of type 2 - return; - } - $offset += 2; - - $offset += 5; - - // offset: 19; size: 2; count of ref ranges this feature is on - $cref = self::getUInt2d($recordData, 19); - $offset += 2; - - $offset += 6; - - // offset: 27; size: 8 * $cref; list of cell ranges (like in hyperlink record) - $cellRanges = []; - for ($i = 0; $i < $cref; ++$i) { - try { - $cellRange = $this->readBIFF8CellRangeAddressFixed(substr($recordData, 27 + 8 * $i, 8)); - } catch (PhpSpreadsheetException $e) { - return; - } - $cellRanges[] = $cellRange; - $offset += 8; - } - - // offset: var; size: var; variable length of feature specific data - $rgbFeat = substr($recordData, $offset); - $offset += 4; - - // offset: var; size: 4; the encrypted password (only 16-bit although field is 32-bit) - $wPassword = self::getInt4d($recordData, $offset); - $offset += 4; - - // Apply range protection to sheet - if ($cellRanges) { - $this->phpSheet->protectCells(implode(' ', $cellRanges), strtoupper(dechex($wPassword)), true); - } - } - } - - /** - * Read a free CONTINUE record. Free CONTINUE record may be a camouflaged MSODRAWING record - * When MSODRAWING data on a sheet exceeds 8224 bytes, CONTINUE records are used instead. Undocumented. - * In this case, we must treat the CONTINUE record as a MSODRAWING record. - */ - private function readContinue(): void - { - $length = self::getUInt2d($this->data, $this->pos + 2); - $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); - - // check if we are reading drawing data - // this is in case a free CONTINUE record occurs in other circumstances we are unaware of - if ($this->drawingData == '') { - // move stream pointer to next record - $this->pos += 4 + $length; - - return; - } - - // check if record data is at least 4 bytes long, otherwise there is no chance this is MSODRAWING data - if ($length < 4) { - // move stream pointer to next record - $this->pos += 4 + $length; - - return; - } - - // dirty check to see if CONTINUE record could be a camouflaged MSODRAWING record - // look inside CONTINUE record to see if it looks like a part of an Escher stream - // we know that Escher stream may be split at least at - // 0xF003 MsofbtSpgrContainer - // 0xF004 MsofbtSpContainer - // 0xF00D MsofbtClientTextbox - $validSplitPoints = [0xF003, 0xF004, 0xF00D]; // add identifiers if we find more - - $splitPoint = self::getUInt2d($recordData, 2); - if (in_array($splitPoint, $validSplitPoints)) { - // get spliced record data (and move pointer to next record) - $splicedRecordData = $this->getSplicedRecordData(); - $this->drawingData .= $splicedRecordData['recordData']; - - return; - } - - // move stream pointer to next record - $this->pos += 4 + $length; - } - - /** - * Reads a record from current position in data stream and continues reading data as long as CONTINUE - * records are found. Splices the record data pieces and returns the combined string as if record data - * is in one piece. - * Moves to next current position in data stream to start of next record different from a CONtINUE record. - * - * @return array - */ - private function getSplicedRecordData() - { - $data = ''; - $spliceOffsets = []; - - $i = 0; - $spliceOffsets[0] = 0; - - do { - ++$i; - - // offset: 0; size: 2; identifier - $identifier = self::getUInt2d($this->data, $this->pos); - // offset: 2; size: 2; length - $length = self::getUInt2d($this->data, $this->pos + 2); - $data .= $this->readRecordData($this->data, $this->pos + 4, $length); - - $spliceOffsets[$i] = $spliceOffsets[$i - 1] + $length; - - $this->pos += 4 + $length; - $nextIdentifier = self::getUInt2d($this->data, $this->pos); - } while ($nextIdentifier == self::XLS_TYPE_CONTINUE); - - return [ - 'recordData' => $data, - 'spliceOffsets' => $spliceOffsets, - ]; - } - - /** - * Convert formula structure into human readable Excel formula like 'A3+A5*5'. - * - * @param string $formulaStructure The complete binary data for the formula - * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas - * - * @return string Human readable formula - */ - private function getFormulaFromStructure($formulaStructure, $baseCell = 'A1') - { - // offset: 0; size: 2; size of the following formula data - $sz = self::getUInt2d($formulaStructure, 0); - - // offset: 2; size: sz - $formulaData = substr($formulaStructure, 2, $sz); - - // offset: 2 + sz; size: variable (optional) - if (strlen($formulaStructure) > 2 + $sz) { - $additionalData = substr($formulaStructure, 2 + $sz); - } else { - $additionalData = ''; - } - - return $this->getFormulaFromData($formulaData, $additionalData, $baseCell); - } - - /** - * Take formula data and additional data for formula and return human readable formula. - * - * @param string $formulaData The binary data for the formula itself - * @param string $additionalData Additional binary data going with the formula - * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas - * - * @return string Human readable formula - */ - private function getFormulaFromData($formulaData, $additionalData = '', $baseCell = 'A1') - { - // start parsing the formula data - $tokens = []; - - while (strlen($formulaData) > 0 && $token = $this->getNextToken($formulaData, $baseCell)) { - $tokens[] = $token; - $formulaData = substr($formulaData, $token['size']); - } - - $formulaString = $this->createFormulaFromTokens($tokens, $additionalData); - - return $formulaString; - } - - /** - * Take array of tokens together with additional data for formula and return human readable formula. - * - * @param array $tokens - * @param string $additionalData Additional binary data going with the formula - * - * @return string Human readable formula - */ - private function createFormulaFromTokens($tokens, $additionalData) - { - // empty formula? - if (empty($tokens)) { - return ''; - } - - $formulaStrings = []; - foreach ($tokens as $token) { - // initialize spaces - $space0 = $space0 ?? ''; // spaces before next token, not tParen - $space1 = $space1 ?? ''; // carriage returns before next token, not tParen - $space2 = $space2 ?? ''; // spaces before opening parenthesis - $space3 = $space3 ?? ''; // carriage returns before opening parenthesis - $space4 = $space4 ?? ''; // spaces before closing parenthesis - $space5 = $space5 ?? ''; // carriage returns before closing parenthesis - - switch ($token['name']) { - case 'tAdd': // addition - case 'tConcat': // addition - case 'tDiv': // division - case 'tEQ': // equality - case 'tGE': // greater than or equal - case 'tGT': // greater than - case 'tIsect': // intersection - case 'tLE': // less than or equal - case 'tList': // less than or equal - case 'tLT': // less than - case 'tMul': // multiplication - case 'tNE': // multiplication - case 'tPower': // power - case 'tRange': // range - case 'tSub': // subtraction - $op2 = array_pop($formulaStrings); - $op1 = array_pop($formulaStrings); - $formulaStrings[] = "$op1$space1$space0{$token['data']}$op2"; - unset($space0, $space1); - - break; - case 'tUplus': // unary plus - case 'tUminus': // unary minus - $op = array_pop($formulaStrings); - $formulaStrings[] = "$space1$space0{$token['data']}$op"; - unset($space0, $space1); - - break; - case 'tPercent': // percent sign - $op = array_pop($formulaStrings); - $formulaStrings[] = "$op$space1$space0{$token['data']}"; - unset($space0, $space1); - - break; - case 'tAttrVolatile': // indicates volatile function - case 'tAttrIf': - case 'tAttrSkip': - case 'tAttrChoose': - // token is only important for Excel formula evaluator - // do nothing - break; - case 'tAttrSpace': // space / carriage return - // space will be used when next token arrives, do not alter formulaString stack - switch ($token['data']['spacetype']) { - case 'type0': - $space0 = str_repeat(' ', $token['data']['spacecount']); - - break; - case 'type1': - $space1 = str_repeat("\n", $token['data']['spacecount']); - - break; - case 'type2': - $space2 = str_repeat(' ', $token['data']['spacecount']); - - break; - case 'type3': - $space3 = str_repeat("\n", $token['data']['spacecount']); - - break; - case 'type4': - $space4 = str_repeat(' ', $token['data']['spacecount']); - - break; - case 'type5': - $space5 = str_repeat("\n", $token['data']['spacecount']); - - break; - } - - break; - case 'tAttrSum': // SUM function with one parameter - $op = array_pop($formulaStrings); - $formulaStrings[] = "{$space1}{$space0}SUM($op)"; - unset($space0, $space1); - - break; - case 'tFunc': // function with fixed number of arguments - case 'tFuncV': // function with variable number of arguments - if ($token['data']['function'] != '') { - // normal function - $ops = []; // array of operators - for ($i = 0; $i < $token['data']['args']; ++$i) { - $ops[] = array_pop($formulaStrings); - } - $ops = array_reverse($ops); - $formulaStrings[] = "$space1$space0{$token['data']['function']}(" . implode(',', $ops) . ')'; - unset($space0, $space1); - } else { - // add-in function - $ops = []; // array of operators - for ($i = 0; $i < $token['data']['args'] - 1; ++$i) { - $ops[] = array_pop($formulaStrings); - } - $ops = array_reverse($ops); - $function = array_pop($formulaStrings); - $formulaStrings[] = "$space1$space0$function(" . implode(',', $ops) . ')'; - unset($space0, $space1); - } - - break; - case 'tParen': // parenthesis - $expression = array_pop($formulaStrings); - $formulaStrings[] = "$space3$space2($expression$space5$space4)"; - unset($space2, $space3, $space4, $space5); - - break; - case 'tArray': // array constant - $constantArray = self::readBIFF8ConstantArray($additionalData); - $formulaStrings[] = $space1 . $space0 . $constantArray['value']; - $additionalData = substr($additionalData, $constantArray['size']); // bite of chunk of additional data - unset($space0, $space1); - - break; - case 'tMemArea': - // bite off chunk of additional data - $cellRangeAddressList = $this->readBIFF8CellRangeAddressList($additionalData); - $additionalData = substr($additionalData, $cellRangeAddressList['size']); - $formulaStrings[] = "$space1$space0{$token['data']}"; - unset($space0, $space1); - - break; - case 'tArea': // cell range address - case 'tBool': // boolean - case 'tErr': // error code - case 'tInt': // integer - case 'tMemErr': - case 'tMemFunc': - case 'tMissArg': - case 'tName': - case 'tNameX': - case 'tNum': // number - case 'tRef': // single cell reference - case 'tRef3d': // 3d cell reference - case 'tArea3d': // 3d cell range reference - case 'tRefN': - case 'tAreaN': - case 'tStr': // string - $formulaStrings[] = "$space1$space0{$token['data']}"; - unset($space0, $space1); - - break; - } - } - $formulaString = $formulaStrings[0]; - - return $formulaString; - } - - /** - * Fetch next token from binary formula data. - * - * @param string $formulaData Formula data - * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas - * - * @return array - */ - private function getNextToken($formulaData, $baseCell = 'A1') - { - // offset: 0; size: 1; token id - $id = ord($formulaData[0]); // token id - $name = false; // initialize token name - - switch ($id) { - case 0x03: - $name = 'tAdd'; - $size = 1; - $data = '+'; - - break; - case 0x04: - $name = 'tSub'; - $size = 1; - $data = '-'; - - break; - case 0x05: - $name = 'tMul'; - $size = 1; - $data = '*'; - - break; - case 0x06: - $name = 'tDiv'; - $size = 1; - $data = '/'; - - break; - case 0x07: - $name = 'tPower'; - $size = 1; - $data = '^'; - - break; - case 0x08: - $name = 'tConcat'; - $size = 1; - $data = '&'; - - break; - case 0x09: - $name = 'tLT'; - $size = 1; - $data = '<'; - - break; - case 0x0A: - $name = 'tLE'; - $size = 1; - $data = '<='; - - break; - case 0x0B: - $name = 'tEQ'; - $size = 1; - $data = '='; - - break; - case 0x0C: - $name = 'tGE'; - $size = 1; - $data = '>='; - - break; - case 0x0D: - $name = 'tGT'; - $size = 1; - $data = '>'; - - break; - case 0x0E: - $name = 'tNE'; - $size = 1; - $data = '<>'; - - break; - case 0x0F: - $name = 'tIsect'; - $size = 1; - $data = ' '; - - break; - case 0x10: - $name = 'tList'; - $size = 1; - $data = ','; - - break; - case 0x11: - $name = 'tRange'; - $size = 1; - $data = ':'; - - break; - case 0x12: - $name = 'tUplus'; - $size = 1; - $data = '+'; - - break; - case 0x13: - $name = 'tUminus'; - $size = 1; - $data = '-'; - - break; - case 0x14: - $name = 'tPercent'; - $size = 1; - $data = '%'; - - break; - case 0x15: // parenthesis - $name = 'tParen'; - $size = 1; - $data = null; - - break; - case 0x16: // missing argument - $name = 'tMissArg'; - $size = 1; - $data = ''; - - break; - case 0x17: // string - $name = 'tStr'; - // offset: 1; size: var; Unicode string, 8-bit string length - $string = self::readUnicodeStringShort(substr($formulaData, 1)); - $size = 1 + $string['size']; - $data = self::UTF8toExcelDoubleQuoted($string['value']); - - break; - case 0x19: // Special attribute - // offset: 1; size: 1; attribute type flags: - switch (ord($formulaData[1])) { - case 0x01: - $name = 'tAttrVolatile'; - $size = 4; - $data = null; - - break; - case 0x02: - $name = 'tAttrIf'; - $size = 4; - $data = null; - - break; - case 0x04: - $name = 'tAttrChoose'; - // offset: 2; size: 2; number of choices in the CHOOSE function ($nc, number of parameters decreased by 1) - $nc = self::getUInt2d($formulaData, 2); - // offset: 4; size: 2 * $nc - // offset: 4 + 2 * $nc; size: 2 - $size = 2 * $nc + 6; - $data = null; - - break; - case 0x08: - $name = 'tAttrSkip'; - $size = 4; - $data = null; - - break; - case 0x10: - $name = 'tAttrSum'; - $size = 4; - $data = null; - - break; - case 0x40: - case 0x41: - $name = 'tAttrSpace'; - $size = 4; - // offset: 2; size: 2; space type and position - switch (ord($formulaData[2])) { - case 0x00: - $spacetype = 'type0'; - - break; - case 0x01: - $spacetype = 'type1'; - - break; - case 0x02: - $spacetype = 'type2'; - - break; - case 0x03: - $spacetype = 'type3'; - - break; - case 0x04: - $spacetype = 'type4'; - - break; - case 0x05: - $spacetype = 'type5'; - - break; - default: - throw new Exception('Unrecognized space type in tAttrSpace token'); - - break; - } - // offset: 3; size: 1; number of inserted spaces/carriage returns - $spacecount = ord($formulaData[3]); - - $data = ['spacetype' => $spacetype, 'spacecount' => $spacecount]; - - break; - default: - throw new Exception('Unrecognized attribute flag in tAttr token'); - - break; - } - - break; - case 0x1C: // error code - // offset: 1; size: 1; error code - $name = 'tErr'; - $size = 2; - $data = Xls\ErrorCode::lookup(ord($formulaData[1])); - - break; - case 0x1D: // boolean - // offset: 1; size: 1; 0 = false, 1 = true; - $name = 'tBool'; - $size = 2; - $data = ord($formulaData[1]) ? 'TRUE' : 'FALSE'; - - break; - case 0x1E: // integer - // offset: 1; size: 2; unsigned 16-bit integer - $name = 'tInt'; - $size = 3; - $data = self::getUInt2d($formulaData, 1); - - break; - case 0x1F: // number - // offset: 1; size: 8; - $name = 'tNum'; - $size = 9; - $data = self::extractNumber(substr($formulaData, 1)); - $data = str_replace(',', '.', (string) $data); // in case non-English locale - - break; - case 0x20: // array constant - case 0x40: - case 0x60: - // offset: 1; size: 7; not used - $name = 'tArray'; - $size = 8; - $data = null; - - break; - case 0x21: // function with fixed number of arguments - case 0x41: - case 0x61: - $name = 'tFunc'; - $size = 3; - // offset: 1; size: 2; index to built-in sheet function - switch (self::getUInt2d($formulaData, 1)) { - case 2: - $function = 'ISNA'; - $args = 1; - - break; - case 3: - $function = 'ISERROR'; - $args = 1; - - break; - case 10: - $function = 'NA'; - $args = 0; - - break; - case 15: - $function = 'SIN'; - $args = 1; - - break; - case 16: - $function = 'COS'; - $args = 1; - - break; - case 17: - $function = 'TAN'; - $args = 1; - - break; - case 18: - $function = 'ATAN'; - $args = 1; - - break; - case 19: - $function = 'PI'; - $args = 0; - - break; - case 20: - $function = 'SQRT'; - $args = 1; - - break; - case 21: - $function = 'EXP'; - $args = 1; - - break; - case 22: - $function = 'LN'; - $args = 1; - - break; - case 23: - $function = 'LOG10'; - $args = 1; - - break; - case 24: - $function = 'ABS'; - $args = 1; - - break; - case 25: - $function = 'INT'; - $args = 1; - - break; - case 26: - $function = 'SIGN'; - $args = 1; - - break; - case 27: - $function = 'ROUND'; - $args = 2; - - break; - case 30: - $function = 'REPT'; - $args = 2; - - break; - case 31: - $function = 'MID'; - $args = 3; - - break; - case 32: - $function = 'LEN'; - $args = 1; - - break; - case 33: - $function = 'VALUE'; - $args = 1; - - break; - case 34: - $function = 'TRUE'; - $args = 0; - - break; - case 35: - $function = 'FALSE'; - $args = 0; - - break; - case 38: - $function = 'NOT'; - $args = 1; - - break; - case 39: - $function = 'MOD'; - $args = 2; - - break; - case 40: - $function = 'DCOUNT'; - $args = 3; - - break; - case 41: - $function = 'DSUM'; - $args = 3; - - break; - case 42: - $function = 'DAVERAGE'; - $args = 3; - - break; - case 43: - $function = 'DMIN'; - $args = 3; - - break; - case 44: - $function = 'DMAX'; - $args = 3; - - break; - case 45: - $function = 'DSTDEV'; - $args = 3; - - break; - case 48: - $function = 'TEXT'; - $args = 2; - - break; - case 61: - $function = 'MIRR'; - $args = 3; - - break; - case 63: - $function = 'RAND'; - $args = 0; - - break; - case 65: - $function = 'DATE'; - $args = 3; - - break; - case 66: - $function = 'TIME'; - $args = 3; - - break; - case 67: - $function = 'DAY'; - $args = 1; - - break; - case 68: - $function = 'MONTH'; - $args = 1; - - break; - case 69: - $function = 'YEAR'; - $args = 1; - - break; - case 71: - $function = 'HOUR'; - $args = 1; - - break; - case 72: - $function = 'MINUTE'; - $args = 1; - - break; - case 73: - $function = 'SECOND'; - $args = 1; - - break; - case 74: - $function = 'NOW'; - $args = 0; - - break; - case 75: - $function = 'AREAS'; - $args = 1; - - break; - case 76: - $function = 'ROWS'; - $args = 1; - - break; - case 77: - $function = 'COLUMNS'; - $args = 1; - - break; - case 83: - $function = 'TRANSPOSE'; - $args = 1; - - break; - case 86: - $function = 'TYPE'; - $args = 1; - - break; - case 97: - $function = 'ATAN2'; - $args = 2; - - break; - case 98: - $function = 'ASIN'; - $args = 1; - - break; - case 99: - $function = 'ACOS'; - $args = 1; - - break; - case 105: - $function = 'ISREF'; - $args = 1; - - break; - case 111: - $function = 'CHAR'; - $args = 1; - - break; - case 112: - $function = 'LOWER'; - $args = 1; - - break; - case 113: - $function = 'UPPER'; - $args = 1; - - break; - case 114: - $function = 'PROPER'; - $args = 1; - - break; - case 117: - $function = 'EXACT'; - $args = 2; - - break; - case 118: - $function = 'TRIM'; - $args = 1; - - break; - case 119: - $function = 'REPLACE'; - $args = 4; - - break; - case 121: - $function = 'CODE'; - $args = 1; - - break; - case 126: - $function = 'ISERR'; - $args = 1; - - break; - case 127: - $function = 'ISTEXT'; - $args = 1; - - break; - case 128: - $function = 'ISNUMBER'; - $args = 1; - - break; - case 129: - $function = 'ISBLANK'; - $args = 1; - - break; - case 130: - $function = 'T'; - $args = 1; - - break; - case 131: - $function = 'N'; - $args = 1; - - break; - case 140: - $function = 'DATEVALUE'; - $args = 1; - - break; - case 141: - $function = 'TIMEVALUE'; - $args = 1; - - break; - case 142: - $function = 'SLN'; - $args = 3; - - break; - case 143: - $function = 'SYD'; - $args = 4; - - break; - case 162: - $function = 'CLEAN'; - $args = 1; - - break; - case 163: - $function = 'MDETERM'; - $args = 1; - - break; - case 164: - $function = 'MINVERSE'; - $args = 1; - - break; - case 165: - $function = 'MMULT'; - $args = 2; - - break; - case 184: - $function = 'FACT'; - $args = 1; - - break; - case 189: - $function = 'DPRODUCT'; - $args = 3; - - break; - case 190: - $function = 'ISNONTEXT'; - $args = 1; - - break; - case 195: - $function = 'DSTDEVP'; - $args = 3; - - break; - case 196: - $function = 'DVARP'; - $args = 3; - - break; - case 198: - $function = 'ISLOGICAL'; - $args = 1; - - break; - case 199: - $function = 'DCOUNTA'; - $args = 3; - - break; - case 207: - $function = 'REPLACEB'; - $args = 4; - - break; - case 210: - $function = 'MIDB'; - $args = 3; - - break; - case 211: - $function = 'LENB'; - $args = 1; - - break; - case 212: - $function = 'ROUNDUP'; - $args = 2; - - break; - case 213: - $function = 'ROUNDDOWN'; - $args = 2; - - break; - case 214: - $function = 'ASC'; - $args = 1; - - break; - case 215: - $function = 'DBCS'; - $args = 1; - - break; - case 221: - $function = 'TODAY'; - $args = 0; - - break; - case 229: - $function = 'SINH'; - $args = 1; - - break; - case 230: - $function = 'COSH'; - $args = 1; - - break; - case 231: - $function = 'TANH'; - $args = 1; - - break; - case 232: - $function = 'ASINH'; - $args = 1; - - break; - case 233: - $function = 'ACOSH'; - $args = 1; - - break; - case 234: - $function = 'ATANH'; - $args = 1; - - break; - case 235: - $function = 'DGET'; - $args = 3; - - break; - case 244: - $function = 'INFO'; - $args = 1; - - break; - case 252: - $function = 'FREQUENCY'; - $args = 2; - - break; - case 261: - $function = 'ERROR.TYPE'; - $args = 1; - - break; - case 271: - $function = 'GAMMALN'; - $args = 1; - - break; - case 273: - $function = 'BINOMDIST'; - $args = 4; - - break; - case 274: - $function = 'CHIDIST'; - $args = 2; - - break; - case 275: - $function = 'CHIINV'; - $args = 2; - - break; - case 276: - $function = 'COMBIN'; - $args = 2; - - break; - case 277: - $function = 'CONFIDENCE'; - $args = 3; - - break; - case 278: - $function = 'CRITBINOM'; - $args = 3; - - break; - case 279: - $function = 'EVEN'; - $args = 1; - - break; - case 280: - $function = 'EXPONDIST'; - $args = 3; - - break; - case 281: - $function = 'FDIST'; - $args = 3; - - break; - case 282: - $function = 'FINV'; - $args = 3; - - break; - case 283: - $function = 'FISHER'; - $args = 1; - - break; - case 284: - $function = 'FISHERINV'; - $args = 1; - - break; - case 285: - $function = 'FLOOR'; - $args = 2; - - break; - case 286: - $function = 'GAMMADIST'; - $args = 4; - - break; - case 287: - $function = 'GAMMAINV'; - $args = 3; - - break; - case 288: - $function = 'CEILING'; - $args = 2; - - break; - case 289: - $function = 'HYPGEOMDIST'; - $args = 4; - - break; - case 290: - $function = 'LOGNORMDIST'; - $args = 3; - - break; - case 291: - $function = 'LOGINV'; - $args = 3; - - break; - case 292: - $function = 'NEGBINOMDIST'; - $args = 3; - - break; - case 293: - $function = 'NORMDIST'; - $args = 4; - - break; - case 294: - $function = 'NORMSDIST'; - $args = 1; - - break; - case 295: - $function = 'NORMINV'; - $args = 3; - - break; - case 296: - $function = 'NORMSINV'; - $args = 1; - - break; - case 297: - $function = 'STANDARDIZE'; - $args = 3; - - break; - case 298: - $function = 'ODD'; - $args = 1; - - break; - case 299: - $function = 'PERMUT'; - $args = 2; - - break; - case 300: - $function = 'POISSON'; - $args = 3; - - break; - case 301: - $function = 'TDIST'; - $args = 3; - - break; - case 302: - $function = 'WEIBULL'; - $args = 4; - - break; - case 303: - $function = 'SUMXMY2'; - $args = 2; - - break; - case 304: - $function = 'SUMX2MY2'; - $args = 2; - - break; - case 305: - $function = 'SUMX2PY2'; - $args = 2; - - break; - case 306: - $function = 'CHITEST'; - $args = 2; - - break; - case 307: - $function = 'CORREL'; - $args = 2; - - break; - case 308: - $function = 'COVAR'; - $args = 2; - - break; - case 309: - $function = 'FORECAST'; - $args = 3; - - break; - case 310: - $function = 'FTEST'; - $args = 2; - - break; - case 311: - $function = 'INTERCEPT'; - $args = 2; - - break; - case 312: - $function = 'PEARSON'; - $args = 2; - - break; - case 313: - $function = 'RSQ'; - $args = 2; - - break; - case 314: - $function = 'STEYX'; - $args = 2; - - break; - case 315: - $function = 'SLOPE'; - $args = 2; - - break; - case 316: - $function = 'TTEST'; - $args = 4; - - break; - case 325: - $function = 'LARGE'; - $args = 2; - - break; - case 326: - $function = 'SMALL'; - $args = 2; - - break; - case 327: - $function = 'QUARTILE'; - $args = 2; - - break; - case 328: - $function = 'PERCENTILE'; - $args = 2; - - break; - case 331: - $function = 'TRIMMEAN'; - $args = 2; - - break; - case 332: - $function = 'TINV'; - $args = 2; - - break; - case 337: - $function = 'POWER'; - $args = 2; - - break; - case 342: - $function = 'RADIANS'; - $args = 1; - - break; - case 343: - $function = 'DEGREES'; - $args = 1; - - break; - case 346: - $function = 'COUNTIF'; - $args = 2; - - break; - case 347: - $function = 'COUNTBLANK'; - $args = 1; - - break; - case 350: - $function = 'ISPMT'; - $args = 4; - - break; - case 351: - $function = 'DATEDIF'; - $args = 3; - - break; - case 352: - $function = 'DATESTRING'; - $args = 1; - - break; - case 353: - $function = 'NUMBERSTRING'; - $args = 2; - - break; - case 360: - $function = 'PHONETIC'; - $args = 1; - - break; - case 368: - $function = 'BAHTTEXT'; - $args = 1; - - break; - default: - throw new Exception('Unrecognized function in formula'); - - break; - } - $data = ['function' => $function, 'args' => $args]; - - break; - case 0x22: // function with variable number of arguments - case 0x42: - case 0x62: - $name = 'tFuncV'; - $size = 4; - // offset: 1; size: 1; number of arguments - $args = ord($formulaData[1]); - // offset: 2: size: 2; index to built-in sheet function - $index = self::getUInt2d($formulaData, 2); - switch ($index) { - case 0: - $function = 'COUNT'; - - break; - case 1: - $function = 'IF'; - - break; - case 4: - $function = 'SUM'; - - break; - case 5: - $function = 'AVERAGE'; - - break; - case 6: - $function = 'MIN'; - - break; - case 7: - $function = 'MAX'; - - break; - case 8: - $function = 'ROW'; - - break; - case 9: - $function = 'COLUMN'; - - break; - case 11: - $function = 'NPV'; - - break; - case 12: - $function = 'STDEV'; - - break; - case 13: - $function = 'DOLLAR'; - - break; - case 14: - $function = 'FIXED'; - - break; - case 28: - $function = 'LOOKUP'; - - break; - case 29: - $function = 'INDEX'; - - break; - case 36: - $function = 'AND'; - - break; - case 37: - $function = 'OR'; - - break; - case 46: - $function = 'VAR'; - - break; - case 49: - $function = 'LINEST'; - - break; - case 50: - $function = 'TREND'; - - break; - case 51: - $function = 'LOGEST'; - - break; - case 52: - $function = 'GROWTH'; - - break; - case 56: - $function = 'PV'; - - break; - case 57: - $function = 'FV'; - - break; - case 58: - $function = 'NPER'; - - break; - case 59: - $function = 'PMT'; - - break; - case 60: - $function = 'RATE'; - - break; - case 62: - $function = 'IRR'; - - break; - case 64: - $function = 'MATCH'; - - break; - case 70: - $function = 'WEEKDAY'; - - break; - case 78: - $function = 'OFFSET'; - - break; - case 82: - $function = 'SEARCH'; - - break; - case 100: - $function = 'CHOOSE'; - - break; - case 101: - $function = 'HLOOKUP'; - - break; - case 102: - $function = 'VLOOKUP'; - - break; - case 109: - $function = 'LOG'; - - break; - case 115: - $function = 'LEFT'; - - break; - case 116: - $function = 'RIGHT'; - - break; - case 120: - $function = 'SUBSTITUTE'; - - break; - case 124: - $function = 'FIND'; - - break; - case 125: - $function = 'CELL'; - - break; - case 144: - $function = 'DDB'; - - break; - case 148: - $function = 'INDIRECT'; - - break; - case 167: - $function = 'IPMT'; - - break; - case 168: - $function = 'PPMT'; - - break; - case 169: - $function = 'COUNTA'; - - break; - case 183: - $function = 'PRODUCT'; - - break; - case 193: - $function = 'STDEVP'; - - break; - case 194: - $function = 'VARP'; - - break; - case 197: - $function = 'TRUNC'; - - break; - case 204: - $function = 'USDOLLAR'; - - break; - case 205: - $function = 'FINDB'; - - break; - case 206: - $function = 'SEARCHB'; - - break; - case 208: - $function = 'LEFTB'; - - break; - case 209: - $function = 'RIGHTB'; - - break; - case 216: - $function = 'RANK'; - - break; - case 219: - $function = 'ADDRESS'; - - break; - case 220: - $function = 'DAYS360'; - - break; - case 222: - $function = 'VDB'; - - break; - case 227: - $function = 'MEDIAN'; - - break; - case 228: - $function = 'SUMPRODUCT'; - - break; - case 247: - $function = 'DB'; - - break; - case 255: - $function = ''; - - break; - case 269: - $function = 'AVEDEV'; - - break; - case 270: - $function = 'BETADIST'; - - break; - case 272: - $function = 'BETAINV'; - - break; - case 317: - $function = 'PROB'; - - break; - case 318: - $function = 'DEVSQ'; - - break; - case 319: - $function = 'GEOMEAN'; - - break; - case 320: - $function = 'HARMEAN'; - - break; - case 321: - $function = 'SUMSQ'; - - break; - case 322: - $function = 'KURT'; - - break; - case 323: - $function = 'SKEW'; - - break; - case 324: - $function = 'ZTEST'; - - break; - case 329: - $function = 'PERCENTRANK'; - - break; - case 330: - $function = 'MODE'; - - break; - case 336: - $function = 'CONCATENATE'; - - break; - case 344: - $function = 'SUBTOTAL'; - - break; - case 345: - $function = 'SUMIF'; - - break; - case 354: - $function = 'ROMAN'; - - break; - case 358: - $function = 'GETPIVOTDATA'; - - break; - case 359: - $function = 'HYPERLINK'; - - break; - case 361: - $function = 'AVERAGEA'; - - break; - case 362: - $function = 'MAXA'; - - break; - case 363: - $function = 'MINA'; - - break; - case 364: - $function = 'STDEVPA'; - - break; - case 365: - $function = 'VARPA'; - - break; - case 366: - $function = 'STDEVA'; - - break; - case 367: - $function = 'VARA'; - - break; - default: - throw new Exception('Unrecognized function in formula'); - - break; - } - $data = ['function' => $function, 'args' => $args]; - - break; - case 0x23: // index to defined name - case 0x43: - case 0x63: - $name = 'tName'; - $size = 5; - // offset: 1; size: 2; one-based index to definedname record - $definedNameIndex = self::getUInt2d($formulaData, 1) - 1; - // offset: 2; size: 2; not used - $data = $this->definedname[$definedNameIndex]['name']; - - break; - case 0x24: // single cell reference e.g. A5 - case 0x44: - case 0x64: - $name = 'tRef'; - $size = 5; - $data = $this->readBIFF8CellAddress(substr($formulaData, 1, 4)); - - break; - case 0x25: // cell range reference to cells in the same sheet (2d) - case 0x45: - case 0x65: - $name = 'tArea'; - $size = 9; - $data = $this->readBIFF8CellRangeAddress(substr($formulaData, 1, 8)); - - break; - case 0x26: // Constant reference sub-expression - case 0x46: - case 0x66: - $name = 'tMemArea'; - // offset: 1; size: 4; not used - // offset: 5; size: 2; size of the following subexpression - $subSize = self::getUInt2d($formulaData, 5); - $size = 7 + $subSize; - $data = $this->getFormulaFromData(substr($formulaData, 7, $subSize)); - - break; - case 0x27: // Deleted constant reference sub-expression - case 0x47: - case 0x67: - $name = 'tMemErr'; - // offset: 1; size: 4; not used - // offset: 5; size: 2; size of the following subexpression - $subSize = self::getUInt2d($formulaData, 5); - $size = 7 + $subSize; - $data = $this->getFormulaFromData(substr($formulaData, 7, $subSize)); - - break; - case 0x29: // Variable reference sub-expression - case 0x49: - case 0x69: - $name = 'tMemFunc'; - // offset: 1; size: 2; size of the following sub-expression - $subSize = self::getUInt2d($formulaData, 1); - $size = 3 + $subSize; - $data = $this->getFormulaFromData(substr($formulaData, 3, $subSize)); - - break; - case 0x2C: // Relative 2d cell reference reference, used in shared formulas and some other places - case 0x4C: - case 0x6C: - $name = 'tRefN'; - $size = 5; - $data = $this->readBIFF8CellAddressB(substr($formulaData, 1, 4), $baseCell); - - break; - case 0x2D: // Relative 2d range reference - case 0x4D: - case 0x6D: - $name = 'tAreaN'; - $size = 9; - $data = $this->readBIFF8CellRangeAddressB(substr($formulaData, 1, 8), $baseCell); - - break; - case 0x39: // External name - case 0x59: - case 0x79: - $name = 'tNameX'; - $size = 7; - // offset: 1; size: 2; index to REF entry in EXTERNSHEET record - // offset: 3; size: 2; one-based index to DEFINEDNAME or EXTERNNAME record - $index = self::getUInt2d($formulaData, 3); - // assume index is to EXTERNNAME record - $data = $this->externalNames[$index - 1]['name']; - // offset: 5; size: 2; not used - break; - case 0x3A: // 3d reference to cell - case 0x5A: - case 0x7A: - $name = 'tRef3d'; - $size = 7; - - try { - // offset: 1; size: 2; index to REF entry - $sheetRange = $this->readSheetRangeByRefIndex(self::getUInt2d($formulaData, 1)); - // offset: 3; size: 4; cell address - $cellAddress = $this->readBIFF8CellAddress(substr($formulaData, 3, 4)); - - $data = "$sheetRange!$cellAddress"; - } catch (PhpSpreadsheetException $e) { - // deleted sheet reference - $data = '#REF!'; - } - - break; - case 0x3B: // 3d reference to cell range - case 0x5B: - case 0x7B: - $name = 'tArea3d'; - $size = 11; - - try { - // offset: 1; size: 2; index to REF entry - $sheetRange = $this->readSheetRangeByRefIndex(self::getUInt2d($formulaData, 1)); - // offset: 3; size: 8; cell address - $cellRangeAddress = $this->readBIFF8CellRangeAddress(substr($formulaData, 3, 8)); - - $data = "$sheetRange!$cellRangeAddress"; - } catch (PhpSpreadsheetException $e) { - // deleted sheet reference - $data = '#REF!'; - } - - break; - // Unknown cases // don't know how to deal with - default: - throw new Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula'); - - break; - } - - return [ - 'id' => $id, - 'name' => $name, - 'size' => $size, - 'data' => $data, - ]; - } - - /** - * Reads a cell address in BIFF8 e.g. 'A2' or '$A$2' - * section 3.3.4. - * - * @param string $cellAddressStructure - * - * @return string - */ - private function readBIFF8CellAddress($cellAddressStructure) - { - // offset: 0; size: 2; index to row (0... 65535) (or offset (-32768... 32767)) - $row = self::getUInt2d($cellAddressStructure, 0) + 1; - - // offset: 2; size: 2; index to column or column offset + relative flags - // bit: 7-0; mask 0x00FF; column index - $column = Coordinate::stringFromColumnIndex((0x00FF & self::getUInt2d($cellAddressStructure, 2)) + 1); - - // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) - if (!(0x4000 & self::getUInt2d($cellAddressStructure, 2))) { - $column = '$' . $column; - } - // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) - if (!(0x8000 & self::getUInt2d($cellAddressStructure, 2))) { - $row = '$' . $row; - } - - return $column . $row; - } - - /** - * Reads a cell address in BIFF8 for shared formulas. Uses positive and negative values for row and column - * to indicate offsets from a base cell - * section 3.3.4. - * - * @param string $cellAddressStructure - * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas - * - * @return string - */ - private function readBIFF8CellAddressB($cellAddressStructure, $baseCell = 'A1') - { - [$baseCol, $baseRow] = Coordinate::coordinateFromString($baseCell); - $baseCol = Coordinate::columnIndexFromString($baseCol) - 1; - - // offset: 0; size: 2; index to row (0... 65535) (or offset (-32768... 32767)) - $rowIndex = self::getUInt2d($cellAddressStructure, 0); - $row = self::getUInt2d($cellAddressStructure, 0) + 1; - - // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) - if (!(0x4000 & self::getUInt2d($cellAddressStructure, 2))) { - // offset: 2; size: 2; index to column or column offset + relative flags - // bit: 7-0; mask 0x00FF; column index - $colIndex = 0x00FF & self::getUInt2d($cellAddressStructure, 2); - - $column = Coordinate::stringFromColumnIndex($colIndex + 1); - $column = '$' . $column; - } else { - // offset: 2; size: 2; index to column or column offset + relative flags - // bit: 7-0; mask 0x00FF; column index - $relativeColIndex = 0x00FF & self::getInt2d($cellAddressStructure, 2); - $colIndex = $baseCol + $relativeColIndex; - $colIndex = ($colIndex < 256) ? $colIndex : $colIndex - 256; - $colIndex = ($colIndex >= 0) ? $colIndex : $colIndex + 256; - $column = Coordinate::stringFromColumnIndex($colIndex + 1); - } - - // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) - if (!(0x8000 & self::getUInt2d($cellAddressStructure, 2))) { - $row = '$' . $row; - } else { - $rowIndex = ($rowIndex <= 32767) ? $rowIndex : $rowIndex - 65536; - $row = $baseRow + $rowIndex; - } - - return $column . $row; - } - - /** - * Reads a cell range address in BIFF5 e.g. 'A2:B6' or 'A1' - * always fixed range - * section 2.5.14. - * - * @param string $subData - * - * @return string - */ - private function readBIFF5CellRangeAddressFixed($subData) - { - // offset: 0; size: 2; index to first row - $fr = self::getUInt2d($subData, 0) + 1; - - // offset: 2; size: 2; index to last row - $lr = self::getUInt2d($subData, 2) + 1; - - // offset: 4; size: 1; index to first column - $fc = ord($subData[4]); - - // offset: 5; size: 1; index to last column - $lc = ord($subData[5]); - - // check values - if ($fr > $lr || $fc > $lc) { - throw new Exception('Not a cell range address'); - } - - // column index to letter - $fc = Coordinate::stringFromColumnIndex($fc + 1); - $lc = Coordinate::stringFromColumnIndex($lc + 1); - - if ($fr == $lr && $fc == $lc) { - return "$fc$fr"; - } - - return "$fc$fr:$lc$lr"; - } - - /** - * Reads a cell range address in BIFF8 e.g. 'A2:B6' or 'A1' - * always fixed range - * section 2.5.14. - * - * @param string $subData - * - * @return string - */ - private function readBIFF8CellRangeAddressFixed($subData) - { - // offset: 0; size: 2; index to first row - $fr = self::getUInt2d($subData, 0) + 1; - - // offset: 2; size: 2; index to last row - $lr = self::getUInt2d($subData, 2) + 1; - - // offset: 4; size: 2; index to first column - $fc = self::getUInt2d($subData, 4); - - // offset: 6; size: 2; index to last column - $lc = self::getUInt2d($subData, 6); - - // check values - if ($fr > $lr || $fc > $lc) { - throw new Exception('Not a cell range address'); - } - - // column index to letter - $fc = Coordinate::stringFromColumnIndex($fc + 1); - $lc = Coordinate::stringFromColumnIndex($lc + 1); - - if ($fr == $lr && $fc == $lc) { - return "$fc$fr"; - } - - return "$fc$fr:$lc$lr"; - } - - /** - * Reads a cell range address in BIFF8 e.g. 'A2:B6' or '$A$2:$B$6' - * there are flags indicating whether column/row index is relative - * section 3.3.4. - * - * @param string $subData - * - * @return string - */ - private function readBIFF8CellRangeAddress($subData) - { - // todo: if cell range is just a single cell, should this funciton - // not just return e.g. 'A1' and not 'A1:A1' ? - - // offset: 0; size: 2; index to first row (0... 65535) (or offset (-32768... 32767)) - $fr = self::getUInt2d($subData, 0) + 1; - - // offset: 2; size: 2; index to last row (0... 65535) (or offset (-32768... 32767)) - $lr = self::getUInt2d($subData, 2) + 1; - - // offset: 4; size: 2; index to first column or column offset + relative flags - - // bit: 7-0; mask 0x00FF; column index - $fc = Coordinate::stringFromColumnIndex((0x00FF & self::getUInt2d($subData, 4)) + 1); - - // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) - if (!(0x4000 & self::getUInt2d($subData, 4))) { - $fc = '$' . $fc; - } - - // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) - if (!(0x8000 & self::getUInt2d($subData, 4))) { - $fr = '$' . $fr; - } - - // offset: 6; size: 2; index to last column or column offset + relative flags - - // bit: 7-0; mask 0x00FF; column index - $lc = Coordinate::stringFromColumnIndex((0x00FF & self::getUInt2d($subData, 6)) + 1); - - // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) - if (!(0x4000 & self::getUInt2d($subData, 6))) { - $lc = '$' . $lc; - } - - // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) - if (!(0x8000 & self::getUInt2d($subData, 6))) { - $lr = '$' . $lr; - } - - return "$fc$fr:$lc$lr"; - } - - /** - * Reads a cell range address in BIFF8 for shared formulas. Uses positive and negative values for row and column - * to indicate offsets from a base cell - * section 3.3.4. - * - * @param string $subData - * @param string $baseCell Base cell - * - * @return string Cell range address - */ - private function readBIFF8CellRangeAddressB($subData, $baseCell = 'A1') - { - [$baseCol, $baseRow] = Coordinate::coordinateFromString($baseCell); - $baseCol = Coordinate::columnIndexFromString($baseCol) - 1; - - // TODO: if cell range is just a single cell, should this funciton - // not just return e.g. 'A1' and not 'A1:A1' ? - - // offset: 0; size: 2; first row - $frIndex = self::getUInt2d($subData, 0); // adjust below - - // offset: 2; size: 2; relative index to first row (0... 65535) should be treated as offset (-32768... 32767) - $lrIndex = self::getUInt2d($subData, 2); // adjust below - - // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) - if (!(0x4000 & self::getUInt2d($subData, 4))) { - // absolute column index - // offset: 4; size: 2; first column with relative/absolute flags - // bit: 7-0; mask 0x00FF; column index - $fcIndex = 0x00FF & self::getUInt2d($subData, 4); - $fc = Coordinate::stringFromColumnIndex($fcIndex + 1); - $fc = '$' . $fc; - } else { - // column offset - // offset: 4; size: 2; first column with relative/absolute flags - // bit: 7-0; mask 0x00FF; column index - $relativeFcIndex = 0x00FF & self::getInt2d($subData, 4); - $fcIndex = $baseCol + $relativeFcIndex; - $fcIndex = ($fcIndex < 256) ? $fcIndex : $fcIndex - 256; - $fcIndex = ($fcIndex >= 0) ? $fcIndex : $fcIndex + 256; - $fc = Coordinate::stringFromColumnIndex($fcIndex + 1); - } - - // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) - if (!(0x8000 & self::getUInt2d($subData, 4))) { - // absolute row index - $fr = $frIndex + 1; - $fr = '$' . $fr; - } else { - // row offset - $frIndex = ($frIndex <= 32767) ? $frIndex : $frIndex - 65536; - $fr = $baseRow + $frIndex; - } - - // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) - if (!(0x4000 & self::getUInt2d($subData, 6))) { - // absolute column index - // offset: 6; size: 2; last column with relative/absolute flags - // bit: 7-0; mask 0x00FF; column index - $lcIndex = 0x00FF & self::getUInt2d($subData, 6); - $lc = Coordinate::stringFromColumnIndex($lcIndex + 1); - $lc = '$' . $lc; - } else { - // column offset - // offset: 4; size: 2; first column with relative/absolute flags - // bit: 7-0; mask 0x00FF; column index - $relativeLcIndex = 0x00FF & self::getInt2d($subData, 4); - $lcIndex = $baseCol + $relativeLcIndex; - $lcIndex = ($lcIndex < 256) ? $lcIndex : $lcIndex - 256; - $lcIndex = ($lcIndex >= 0) ? $lcIndex : $lcIndex + 256; - $lc = Coordinate::stringFromColumnIndex($lcIndex + 1); - } - - // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) - if (!(0x8000 & self::getUInt2d($subData, 6))) { - // absolute row index - $lr = $lrIndex + 1; - $lr = '$' . $lr; - } else { - // row offset - $lrIndex = ($lrIndex <= 32767) ? $lrIndex : $lrIndex - 65536; - $lr = $baseRow + $lrIndex; - } - - return "$fc$fr:$lc$lr"; - } - - /** - * Read BIFF8 cell range address list - * section 2.5.15. - * - * @param string $subData - * - * @return array - */ - private function readBIFF8CellRangeAddressList($subData) - { - $cellRangeAddresses = []; - - // offset: 0; size: 2; number of the following cell range addresses - $nm = self::getUInt2d($subData, 0); - - $offset = 2; - // offset: 2; size: 8 * $nm; list of $nm (fixed) cell range addresses - for ($i = 0; $i < $nm; ++$i) { - $cellRangeAddresses[] = $this->readBIFF8CellRangeAddressFixed(substr($subData, $offset, 8)); - $offset += 8; - } - - return [ - 'size' => 2 + 8 * $nm, - 'cellRangeAddresses' => $cellRangeAddresses, - ]; - } - - /** - * Read BIFF5 cell range address list - * section 2.5.15. - * - * @param string $subData - * - * @return array - */ - private function readBIFF5CellRangeAddressList($subData) - { - $cellRangeAddresses = []; - - // offset: 0; size: 2; number of the following cell range addresses - $nm = self::getUInt2d($subData, 0); - - $offset = 2; - // offset: 2; size: 6 * $nm; list of $nm (fixed) cell range addresses - for ($i = 0; $i < $nm; ++$i) { - $cellRangeAddresses[] = $this->readBIFF5CellRangeAddressFixed(substr($subData, $offset, 6)); - $offset += 6; - } - - return [ - 'size' => 2 + 6 * $nm, - 'cellRangeAddresses' => $cellRangeAddresses, - ]; - } - - /** - * Get a sheet range like Sheet1:Sheet3 from REF index - * Note: If there is only one sheet in the range, one gets e.g Sheet1 - * It can also happen that the REF structure uses the -1 (FFFF) code to indicate deleted sheets, - * in which case an Exception is thrown. - * - * @param int $index - * - * @return false|string - */ - private function readSheetRangeByRefIndex($index) - { - if (isset($this->ref[$index])) { - $type = $this->externalBooks[$this->ref[$index]['externalBookIndex']]['type']; - - switch ($type) { - case 'internal': - // check if we have a deleted 3d reference - if ($this->ref[$index]['firstSheetIndex'] == 0xFFFF || $this->ref[$index]['lastSheetIndex'] == 0xFFFF) { - throw new Exception('Deleted sheet reference'); - } - - // we have normal sheet range (collapsed or uncollapsed) - $firstSheetName = $this->sheets[$this->ref[$index]['firstSheetIndex']]['name']; - $lastSheetName = $this->sheets[$this->ref[$index]['lastSheetIndex']]['name']; - - if ($firstSheetName == $lastSheetName) { - // collapsed sheet range - $sheetRange = $firstSheetName; - } else { - $sheetRange = "$firstSheetName:$lastSheetName"; - } - - // escape the single-quotes - $sheetRange = str_replace("'", "''", $sheetRange); - - // if there are special characters, we need to enclose the range in single-quotes - // todo: check if we have identified the whole set of special characters - // it seems that the following characters are not accepted for sheet names - // and we may assume that they are not present: []*/:\? - if (preg_match("/[ !\"@#£$%&{()}<>=+'|^,;-]/u", $sheetRange)) { - $sheetRange = "'$sheetRange'"; - } - - return $sheetRange; - - break; - default: - // TODO: external sheet support - throw new Exception('Xls reader only supports internal sheets in formulas'); - - break; - } - } - - return false; - } - - /** - * read BIFF8 constant value array from array data - * returns e.g. ['value' => '{1,2;3,4}', 'size' => 40] - * section 2.5.8. - * - * @param string $arrayData - * - * @return array - */ - private static function readBIFF8ConstantArray($arrayData) - { - // offset: 0; size: 1; number of columns decreased by 1 - $nc = ord($arrayData[0]); - - // offset: 1; size: 2; number of rows decreased by 1 - $nr = self::getUInt2d($arrayData, 1); - $size = 3; // initialize - $arrayData = substr($arrayData, 3); - - // offset: 3; size: var; list of ($nc + 1) * ($nr + 1) constant values - $matrixChunks = []; - for ($r = 1; $r <= $nr + 1; ++$r) { - $items = []; - for ($c = 1; $c <= $nc + 1; ++$c) { - $constant = self::readBIFF8Constant($arrayData); - $items[] = $constant['value']; - $arrayData = substr($arrayData, $constant['size']); - $size += $constant['size']; - } - $matrixChunks[] = implode(',', $items); // looks like e.g. '1,"hello"' - } - $matrix = '{' . implode(';', $matrixChunks) . '}'; - - return [ - 'value' => $matrix, - 'size' => $size, - ]; - } - - /** - * read BIFF8 constant value which may be 'Empty Value', 'Number', 'String Value', 'Boolean Value', 'Error Value' - * section 2.5.7 - * returns e.g. ['value' => '5', 'size' => 9]. - * - * @param string $valueData - * - * @return array - */ - private static function readBIFF8Constant($valueData) - { - // offset: 0; size: 1; identifier for type of constant - $identifier = ord($valueData[0]); - - switch ($identifier) { - case 0x00: // empty constant (what is this?) - $value = ''; - $size = 9; - - break; - case 0x01: // number - // offset: 1; size: 8; IEEE 754 floating-point value - $value = self::extractNumber(substr($valueData, 1, 8)); - $size = 9; - - break; - case 0x02: // string value - // offset: 1; size: var; Unicode string, 16-bit string length - $string = self::readUnicodeStringLong(substr($valueData, 1)); - $value = '"' . $string['value'] . '"'; - $size = 1 + $string['size']; - - break; - case 0x04: // boolean - // offset: 1; size: 1; 0 = FALSE, 1 = TRUE - if (ord($valueData[1])) { - $value = 'TRUE'; - } else { - $value = 'FALSE'; - } - $size = 9; - - break; - case 0x10: // error code - // offset: 1; size: 1; error code - $value = Xls\ErrorCode::lookup(ord($valueData[1])); - $size = 9; - - break; - } - - return [ - 'value' => $value, - 'size' => $size, - ]; - } - - /** - * Extract RGB color - * OpenOffice.org's Documentation of the Microsoft Excel File Format, section 2.5.4. - * - * @param string $rgb Encoded RGB value (4 bytes) - * - * @return array - */ - private static function readRGB($rgb) - { - // offset: 0; size 1; Red component - $r = ord($rgb[0]); - - // offset: 1; size: 1; Green component - $g = ord($rgb[1]); - - // offset: 2; size: 1; Blue component - $b = ord($rgb[2]); - - // HEX notation, e.g. 'FF00FC' - $rgb = sprintf('%02X%02X%02X', $r, $g, $b); - - return ['rgb' => $rgb]; - } - - /** - * Read byte string (8-bit string length) - * OpenOffice documentation: 2.5.2. - * - * @param string $subData - * - * @return array - */ - private function readByteStringShort($subData) - { - // offset: 0; size: 1; length of the string (character count) - $ln = ord($subData[0]); - - // offset: 1: size: var; character array (8-bit characters) - $value = $this->decodeCodepage(substr($subData, 1, $ln)); - - return [ - 'value' => $value, - 'size' => 1 + $ln, // size in bytes of data structure - ]; - } - - /** - * Read byte string (16-bit string length) - * OpenOffice documentation: 2.5.2. - * - * @param string $subData - * - * @return array - */ - private function readByteStringLong($subData) - { - // offset: 0; size: 2; length of the string (character count) - $ln = self::getUInt2d($subData, 0); - - // offset: 2: size: var; character array (8-bit characters) - $value = $this->decodeCodepage(substr($subData, 2)); - - //return $string; - return [ - 'value' => $value, - 'size' => 2 + $ln, // size in bytes of data structure - ]; - } - - /** - * Extracts an Excel Unicode short string (8-bit string length) - * OpenOffice documentation: 2.5.3 - * function will automatically find out where the Unicode string ends. - * - * @param string $subData - * - * @return array - */ - private static function readUnicodeStringShort($subData) - { - $value = ''; - - // offset: 0: size: 1; length of the string (character count) - $characterCount = ord($subData[0]); - - $string = self::readUnicodeString(substr($subData, 1), $characterCount); - - // add 1 for the string length - ++$string['size']; - - return $string; - } - - /** - * Extracts an Excel Unicode long string (16-bit string length) - * OpenOffice documentation: 2.5.3 - * this function is under construction, needs to support rich text, and Asian phonetic settings. - * - * @param string $subData - * - * @return array - */ - private static function readUnicodeStringLong($subData) - { - $value = ''; - - // offset: 0: size: 2; length of the string (character count) - $characterCount = self::getUInt2d($subData, 0); - - $string = self::readUnicodeString(substr($subData, 2), $characterCount); - - // add 2 for the string length - $string['size'] += 2; - - return $string; - } - - /** - * Read Unicode string with no string length field, but with known character count - * this function is under construction, needs to support rich text, and Asian phonetic settings - * OpenOffice.org's Documentation of the Microsoft Excel File Format, section 2.5.3. - * - * @param string $subData - * @param int $characterCount - * - * @return array - */ - private static function readUnicodeString($subData, $characterCount) - { - $value = ''; - - // offset: 0: size: 1; option flags - // bit: 0; mask: 0x01; character compression (0 = compressed 8-bit, 1 = uncompressed 16-bit) - $isCompressed = !((0x01 & ord($subData[0])) >> 0); - - // bit: 2; mask: 0x04; Asian phonetic settings - $hasAsian = (0x04) & ord($subData[0]) >> 2; - - // bit: 3; mask: 0x08; Rich-Text settings - $hasRichText = (0x08) & ord($subData[0]) >> 3; - - // offset: 1: size: var; character array - // this offset assumes richtext and Asian phonetic settings are off which is generally wrong - // needs to be fixed - $value = self::encodeUTF16(substr($subData, 1, $isCompressed ? $characterCount : 2 * $characterCount), $isCompressed); - - return [ - 'value' => $value, - 'size' => $isCompressed ? 1 + $characterCount : 1 + 2 * $characterCount, // the size in bytes including the option flags - ]; - } - - /** - * Convert UTF-8 string to string surounded by double quotes. Used for explicit string tokens in formulas. - * Example: hello"world --> "hello""world". - * - * @param string $value UTF-8 encoded string - * - * @return string - */ - private static function UTF8toExcelDoubleQuoted($value) - { - return '"' . str_replace('"', '""', $value) . '"'; - } - - /** - * Reads first 8 bytes of a string and return IEEE 754 float. - * - * @param string $data Binary string that is at least 8 bytes long - * - * @return float - */ - private static function extractNumber($data) - { - $rknumhigh = self::getInt4d($data, 4); - $rknumlow = self::getInt4d($data, 0); - $sign = ($rknumhigh & 0x80000000) >> 31; - $exp = (($rknumhigh & 0x7ff00000) >> 20) - 1023; - $mantissa = (0x100000 | ($rknumhigh & 0x000fffff)); - $mantissalow1 = ($rknumlow & 0x80000000) >> 31; - $mantissalow2 = ($rknumlow & 0x7fffffff); - $value = $mantissa / 2 ** (20 - $exp); - - if ($mantissalow1 != 0) { - $value += 1 / 2 ** (21 - $exp); - } - - $value += $mantissalow2 / 2 ** (52 - $exp); - if ($sign) { - $value *= -1; - } - - return $value; - } - - /** - * @param int $rknum - * - * @return float - */ - private static function getIEEE754($rknum) - { - if (($rknum & 0x02) != 0) { - $value = $rknum >> 2; - } else { - // changes by mmp, info on IEEE754 encoding from - // research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html - // The RK format calls for using only the most significant 30 bits - // of the 64 bit floating point value. The other 34 bits are assumed - // to be 0 so we use the upper 30 bits of $rknum as follows... - $sign = ($rknum & 0x80000000) >> 31; - $exp = ($rknum & 0x7ff00000) >> 20; - $mantissa = (0x100000 | ($rknum & 0x000ffffc)); - $value = $mantissa / 2 ** (20 - ($exp - 1023)); - if ($sign) { - $value = -1 * $value; - } - //end of changes by mmp - } - if (($rknum & 0x01) != 0) { - $value /= 100; - } - - return $value; - } - - /** - * Get UTF-8 string from (compressed or uncompressed) UTF-16 string. - * - * @param string $string - * @param bool $compressed - * - * @return string - */ - private static function encodeUTF16($string, $compressed = false) - { - if ($compressed) { - $string = self::uncompressByteString($string); - } - - return StringHelper::convertEncoding($string, 'UTF-8', 'UTF-16LE'); - } - - /** - * Convert UTF-16 string in compressed notation to uncompressed form. Only used for BIFF8. - * - * @param string $string - * - * @return string - */ - private static function uncompressByteString($string) - { - $uncompressedString = ''; - $strLen = strlen($string); - for ($i = 0; $i < $strLen; ++$i) { - $uncompressedString .= $string[$i] . "\0"; - } - - return $uncompressedString; - } - - /** - * Convert string to UTF-8. Only used for BIFF5. - * - * @param string $string - * - * @return string - */ - private function decodeCodepage($string) - { - return StringHelper::convertEncoding($string, 'UTF-8', $this->codepage); - } - - /** - * Read 16-bit unsigned integer. - * - * @param string $data - * @param int $pos - * - * @return int - */ - public static function getUInt2d($data, $pos) - { - return ord($data[$pos]) | (ord($data[$pos + 1]) << 8); - } - - /** - * Read 16-bit signed integer. - * - * @param string $data - * @param int $pos - * - * @return int - */ - public static function getInt2d($data, $pos) - { - return unpack('s', $data[$pos] . $data[$pos + 1])[1]; - } - - /** - * Read 32-bit signed integer. - * - * @param string $data - * @param int $pos - * - * @return int - */ - public static function getInt4d($data, $pos) - { - // FIX: represent numbers correctly on 64-bit system - // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 - // Changed by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems - $_or_24 = ord($data[$pos + 3]); - if ($_or_24 >= 128) { - // negative number - $_ord_24 = -abs((256 - $_or_24) << 24); - } else { - $_ord_24 = ($_or_24 & 127) << 24; - } - - return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $_ord_24; - } - - private function parseRichText($is) - { - $value = new RichText(); - $value->createText($is); - - return $value; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color.php deleted file mode 100644 index c45f88c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color.php +++ /dev/null @@ -1,36 +0,0 @@ - 'FF0000'] - */ - public static function map($color, $palette, $version) - { - if ($color <= 0x07 || $color >= 0x40) { - // special built-in color - return Color\BuiltIn::lookup($color); - } elseif (isset($palette, $palette[$color - 8])) { - // palette color, color index 0x08 maps to pallete index 0 - return $palette[$color - 8]; - } - - // default color table - if ($version == Xls::XLS_BIFF8) { - return Color\BIFF8::lookup($color); - } - - // BIFF5 - return Color\BIFF5::lookup($color); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF5.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF5.php deleted file mode 100644 index 743d938..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF5.php +++ /dev/null @@ -1,81 +0,0 @@ - '000000', - 0x09 => 'FFFFFF', - 0x0A => 'FF0000', - 0x0B => '00FF00', - 0x0C => '0000FF', - 0x0D => 'FFFF00', - 0x0E => 'FF00FF', - 0x0F => '00FFFF', - 0x10 => '800000', - 0x11 => '008000', - 0x12 => '000080', - 0x13 => '808000', - 0x14 => '800080', - 0x15 => '008080', - 0x16 => 'C0C0C0', - 0x17 => '808080', - 0x18 => '8080FF', - 0x19 => '802060', - 0x1A => 'FFFFC0', - 0x1B => 'A0E0F0', - 0x1C => '600080', - 0x1D => 'FF8080', - 0x1E => '0080C0', - 0x1F => 'C0C0FF', - 0x20 => '000080', - 0x21 => 'FF00FF', - 0x22 => 'FFFF00', - 0x23 => '00FFFF', - 0x24 => '800080', - 0x25 => '800000', - 0x26 => '008080', - 0x27 => '0000FF', - 0x28 => '00CFFF', - 0x29 => '69FFFF', - 0x2A => 'E0FFE0', - 0x2B => 'FFFF80', - 0x2C => 'A6CAF0', - 0x2D => 'DD9CB3', - 0x2E => 'B38FEE', - 0x2F => 'E3E3E3', - 0x30 => '2A6FF9', - 0x31 => '3FB8CD', - 0x32 => '488436', - 0x33 => '958C41', - 0x34 => '8E5E42', - 0x35 => 'A0627A', - 0x36 => '624FAC', - 0x37 => '969696', - 0x38 => '1D2FBE', - 0x39 => '286676', - 0x3A => '004500', - 0x3B => '453E01', - 0x3C => '6A2813', - 0x3D => '85396A', - 0x3E => '4A3285', - 0x3F => '424242', - ]; - - /** - * Map color array from BIFF5 built-in color index. - * - * @param int $color - * - * @return array - */ - public static function lookup($color) - { - if (isset(self::$map[$color])) { - return ['rgb' => self::$map[$color]]; - } - - return ['rgb' => '000000']; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF8.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF8.php deleted file mode 100644 index 5c109fb..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF8.php +++ /dev/null @@ -1,81 +0,0 @@ - '000000', - 0x09 => 'FFFFFF', - 0x0A => 'FF0000', - 0x0B => '00FF00', - 0x0C => '0000FF', - 0x0D => 'FFFF00', - 0x0E => 'FF00FF', - 0x0F => '00FFFF', - 0x10 => '800000', - 0x11 => '008000', - 0x12 => '000080', - 0x13 => '808000', - 0x14 => '800080', - 0x15 => '008080', - 0x16 => 'C0C0C0', - 0x17 => '808080', - 0x18 => '9999FF', - 0x19 => '993366', - 0x1A => 'FFFFCC', - 0x1B => 'CCFFFF', - 0x1C => '660066', - 0x1D => 'FF8080', - 0x1E => '0066CC', - 0x1F => 'CCCCFF', - 0x20 => '000080', - 0x21 => 'FF00FF', - 0x22 => 'FFFF00', - 0x23 => '00FFFF', - 0x24 => '800080', - 0x25 => '800000', - 0x26 => '008080', - 0x27 => '0000FF', - 0x28 => '00CCFF', - 0x29 => 'CCFFFF', - 0x2A => 'CCFFCC', - 0x2B => 'FFFF99', - 0x2C => '99CCFF', - 0x2D => 'FF99CC', - 0x2E => 'CC99FF', - 0x2F => 'FFCC99', - 0x30 => '3366FF', - 0x31 => '33CCCC', - 0x32 => '99CC00', - 0x33 => 'FFCC00', - 0x34 => 'FF9900', - 0x35 => 'FF6600', - 0x36 => '666699', - 0x37 => '969696', - 0x38 => '003366', - 0x39 => '339966', - 0x3A => '003300', - 0x3B => '333300', - 0x3C => '993300', - 0x3D => '993366', - 0x3E => '333399', - 0x3F => '333333', - ]; - - /** - * Map color array from BIFF8 built-in color index. - * - * @param int $color - * - * @return array - */ - public static function lookup($color) - { - if (isset(self::$map[$color])) { - return ['rgb' => self::$map[$color]]; - } - - return ['rgb' => '000000']; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BuiltIn.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BuiltIn.php deleted file mode 100644 index 90d50e3..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BuiltIn.php +++ /dev/null @@ -1,35 +0,0 @@ - '000000', - 0x01 => 'FFFFFF', - 0x02 => 'FF0000', - 0x03 => '00FF00', - 0x04 => '0000FF', - 0x05 => 'FFFF00', - 0x06 => 'FF00FF', - 0x07 => '00FFFF', - 0x40 => '000000', // system window text color - 0x41 => 'FFFFFF', // system window background color - ]; - - /** - * Map built-in color to RGB value. - * - * @param int $color Indexed color - * - * @return array - */ - public static function lookup($color) - { - if (isset(self::$map[$color])) { - return ['rgb' => self::$map[$color]]; - } - - return ['rgb' => '000000']; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/ErrorCode.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/ErrorCode.php deleted file mode 100644 index 7daf723..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/ErrorCode.php +++ /dev/null @@ -1,32 +0,0 @@ - '#NULL!', - 0x07 => '#DIV/0!', - 0x0F => '#VALUE!', - 0x17 => '#REF!', - 0x1D => '#NAME?', - 0x24 => '#NUM!', - 0x2A => '#N/A', - ]; - - /** - * Map error code, e.g. '#N/A'. - * - * @param int $code - * - * @return bool|string - */ - public static function lookup($code) - { - if (isset(self::$map[$code])) { - return self::$map[$code]; - } - - return false; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Escher.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Escher.php deleted file mode 100644 index 306fc8f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Escher.php +++ /dev/null @@ -1,677 +0,0 @@ -object = $object; - } - - /** - * Load Escher stream data. May be a partial Escher stream. - * - * @param string $data - * - * @return BSE|BstoreContainer|DgContainer|DggContainer|\PhpOffice\PhpSpreadsheet\Shared\Escher|SpContainer|SpgrContainer - */ - public function load($data) - { - $this->data = $data; - - // total byte size of Excel data (workbook global substream + sheet substreams) - $this->dataSize = strlen($this->data); - - $this->pos = 0; - - // Parse Escher stream - while ($this->pos < $this->dataSize) { - // offset: 2; size: 2: Record Type - $fbt = Xls::getUInt2d($this->data, $this->pos + 2); - - switch ($fbt) { - case self::DGGCONTAINER: - $this->readDggContainer(); - - break; - case self::DGG: - $this->readDgg(); - - break; - case self::BSTORECONTAINER: - $this->readBstoreContainer(); - - break; - case self::BSE: - $this->readBSE(); - - break; - case self::BLIPJPEG: - $this->readBlipJPEG(); - - break; - case self::BLIPPNG: - $this->readBlipPNG(); - - break; - case self::OPT: - $this->readOPT(); - - break; - case self::TERTIARYOPT: - $this->readTertiaryOPT(); - - break; - case self::SPLITMENUCOLORS: - $this->readSplitMenuColors(); - - break; - case self::DGCONTAINER: - $this->readDgContainer(); - - break; - case self::DG: - $this->readDg(); - - break; - case self::SPGRCONTAINER: - $this->readSpgrContainer(); - - break; - case self::SPCONTAINER: - $this->readSpContainer(); - - break; - case self::SPGR: - $this->readSpgr(); - - break; - case self::SP: - $this->readSp(); - - break; - case self::CLIENTTEXTBOX: - $this->readClientTextbox(); - - break; - case self::CLIENTANCHOR: - $this->readClientAnchor(); - - break; - case self::CLIENTDATA: - $this->readClientData(); - - break; - default: - $this->readDefault(); - - break; - } - } - - return $this->object; - } - - /** - * Read a generic record. - */ - private function readDefault(): void - { - // offset 0; size: 2; recVer and recInstance - $verInstance = Xls::getUInt2d($this->data, $this->pos); - - // offset: 2; size: 2: Record Type - $fbt = Xls::getUInt2d($this->data, $this->pos + 2); - - // bit: 0-3; mask: 0x000F; recVer - $recVer = (0x000F & $verInstance) >> 0; - - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - } - - /** - * Read DggContainer record (Drawing Group Container). - */ - private function readDggContainer(): void - { - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - - // record is a container, read contents - $dggContainer = new DggContainer(); - $this->object->setDggContainer($dggContainer); - $reader = new self($dggContainer); - $reader->load($recordData); - } - - /** - * Read Dgg record (Drawing Group). - */ - private function readDgg(): void - { - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - } - - /** - * Read BstoreContainer record (Blip Store Container). - */ - private function readBstoreContainer(): void - { - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - - // record is a container, read contents - $bstoreContainer = new BstoreContainer(); - $this->object->setBstoreContainer($bstoreContainer); - $reader = new self($bstoreContainer); - $reader->load($recordData); - } - - /** - * Read BSE record. - */ - private function readBSE(): void - { - // offset: 0; size: 2; recVer and recInstance - - // bit: 4-15; mask: 0xFFF0; recInstance - $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; - - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - - // add BSE to BstoreContainer - $BSE = new BSE(); - $this->object->addBSE($BSE); - - $BSE->setBLIPType($recInstance); - - // offset: 0; size: 1; btWin32 (MSOBLIPTYPE) - $btWin32 = ord($recordData[0]); - - // offset: 1; size: 1; btWin32 (MSOBLIPTYPE) - $btMacOS = ord($recordData[1]); - - // offset: 2; size: 16; MD4 digest - $rgbUid = substr($recordData, 2, 16); - - // offset: 18; size: 2; tag - $tag = Xls::getUInt2d($recordData, 18); - - // offset: 20; size: 4; size of BLIP in bytes - $size = Xls::getInt4d($recordData, 20); - - // offset: 24; size: 4; number of references to this BLIP - $cRef = Xls::getInt4d($recordData, 24); - - // offset: 28; size: 4; MSOFO file offset - $foDelay = Xls::getInt4d($recordData, 28); - - // offset: 32; size: 1; unused1 - $unused1 = ord($recordData[32]); - - // offset: 33; size: 1; size of nameData in bytes (including null terminator) - $cbName = ord($recordData[33]); - - // offset: 34; size: 1; unused2 - $unused2 = ord($recordData[34]); - - // offset: 35; size: 1; unused3 - $unused3 = ord($recordData[35]); - - // offset: 36; size: $cbName; nameData - $nameData = substr($recordData, 36, $cbName); - - // offset: 36 + $cbName, size: var; the BLIP data - $blipData = substr($recordData, 36 + $cbName); - - // record is a container, read contents - $reader = new self($BSE); - $reader->load($blipData); - } - - /** - * Read BlipJPEG record. Holds raw JPEG image data. - */ - private function readBlipJPEG(): void - { - // offset: 0; size: 2; recVer and recInstance - - // bit: 4-15; mask: 0xFFF0; recInstance - $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; - - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - - $pos = 0; - - // offset: 0; size: 16; rgbUid1 (MD4 digest of) - $rgbUid1 = substr($recordData, 0, 16); - $pos += 16; - - // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3 - if (in_array($recInstance, [0x046B, 0x06E3])) { - $rgbUid2 = substr($recordData, 16, 16); - $pos += 16; - } - - // offset: var; size: 1; tag - $tag = ord($recordData[$pos]); - ++$pos; - - // offset: var; size: var; the raw image data - $data = substr($recordData, $pos); - - $blip = new Blip(); - $blip->setData($data); - - $this->object->setBlip($blip); - } - - /** - * Read BlipPNG record. Holds raw PNG image data. - */ - private function readBlipPNG(): void - { - // offset: 0; size: 2; recVer and recInstance - - // bit: 4-15; mask: 0xFFF0; recInstance - $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; - - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - - $pos = 0; - - // offset: 0; size: 16; rgbUid1 (MD4 digest of) - $rgbUid1 = substr($recordData, 0, 16); - $pos += 16; - - // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3 - if ($recInstance == 0x06E1) { - $rgbUid2 = substr($recordData, 16, 16); - $pos += 16; - } - - // offset: var; size: 1; tag - $tag = ord($recordData[$pos]); - ++$pos; - - // offset: var; size: var; the raw image data - $data = substr($recordData, $pos); - - $blip = new Blip(); - $blip->setData($data); - - $this->object->setBlip($blip); - } - - /** - * Read OPT record. This record may occur within DggContainer record or SpContainer. - */ - private function readOPT(): void - { - // offset: 0; size: 2; recVer and recInstance - - // bit: 4-15; mask: 0xFFF0; recInstance - $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; - - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - - $this->readOfficeArtRGFOPTE($recordData, $recInstance); - } - - /** - * Read TertiaryOPT record. - */ - private function readTertiaryOPT(): void - { - // offset: 0; size: 2; recVer and recInstance - - // bit: 4-15; mask: 0xFFF0; recInstance - $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; - - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - } - - /** - * Read SplitMenuColors record. - */ - private function readSplitMenuColors(): void - { - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - } - - /** - * Read DgContainer record (Drawing Container). - */ - private function readDgContainer(): void - { - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - - // record is a container, read contents - $dgContainer = new DgContainer(); - $this->object->setDgContainer($dgContainer); - $reader = new self($dgContainer); - $escher = $reader->load($recordData); - } - - /** - * Read Dg record (Drawing). - */ - private function readDg(): void - { - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - } - - /** - * Read SpgrContainer record (Shape Group Container). - */ - private function readSpgrContainer(): void - { - // context is either context DgContainer or SpgrContainer - - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - - // record is a container, read contents - $spgrContainer = new SpgrContainer(); - - if ($this->object instanceof DgContainer) { - // DgContainer - $this->object->setSpgrContainer($spgrContainer); - } else { - // SpgrContainer - $this->object->addChild($spgrContainer); - } - - $reader = new self($spgrContainer); - $escher = $reader->load($recordData); - } - - /** - * Read SpContainer record (Shape Container). - */ - private function readSpContainer(): void - { - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // add spContainer to spgrContainer - $spContainer = new SpContainer(); - $this->object->addChild($spContainer); - - // move stream pointer to next record - $this->pos += 8 + $length; - - // record is a container, read contents - $reader = new self($spContainer); - $escher = $reader->load($recordData); - } - - /** - * Read Spgr record (Shape Group). - */ - private function readSpgr(): void - { - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - } - - /** - * Read Sp record (Shape). - */ - private function readSp(): void - { - // offset: 0; size: 2; recVer and recInstance - - // bit: 4-15; mask: 0xFFF0; recInstance - $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; - - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - } - - /** - * Read ClientTextbox record. - */ - private function readClientTextbox(): void - { - // offset: 0; size: 2; recVer and recInstance - - // bit: 4-15; mask: 0xFFF0; recInstance - $recInstance = (0xFFF0 & Xls::getUInt2d($this->data, $this->pos)) >> 4; - - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - } - - /** - * Read ClientAnchor record. This record holds information about where the shape is anchored in worksheet. - */ - private function readClientAnchor(): void - { - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - - // offset: 2; size: 2; upper-left corner column index (0-based) - $c1 = Xls::getUInt2d($recordData, 2); - - // offset: 4; size: 2; upper-left corner horizontal offset in 1/1024 of column width - $startOffsetX = Xls::getUInt2d($recordData, 4); - - // offset: 6; size: 2; upper-left corner row index (0-based) - $r1 = Xls::getUInt2d($recordData, 6); - - // offset: 8; size: 2; upper-left corner vertical offset in 1/256 of row height - $startOffsetY = Xls::getUInt2d($recordData, 8); - - // offset: 10; size: 2; bottom-right corner column index (0-based) - $c2 = Xls::getUInt2d($recordData, 10); - - // offset: 12; size: 2; bottom-right corner horizontal offset in 1/1024 of column width - $endOffsetX = Xls::getUInt2d($recordData, 12); - - // offset: 14; size: 2; bottom-right corner row index (0-based) - $r2 = Xls::getUInt2d($recordData, 14); - - // offset: 16; size: 2; bottom-right corner vertical offset in 1/256 of row height - $endOffsetY = Xls::getUInt2d($recordData, 16); - - // set the start coordinates - $this->object->setStartCoordinates(Coordinate::stringFromColumnIndex($c1 + 1) . ($r1 + 1)); - - // set the start offsetX - $this->object->setStartOffsetX($startOffsetX); - - // set the start offsetY - $this->object->setStartOffsetY($startOffsetY); - - // set the end coordinates - $this->object->setEndCoordinates(Coordinate::stringFromColumnIndex($c2 + 1) . ($r2 + 1)); - - // set the end offsetX - $this->object->setEndOffsetX($endOffsetX); - - // set the end offsetY - $this->object->setEndOffsetY($endOffsetY); - } - - /** - * Read ClientData record. - */ - private function readClientData(): void - { - $length = Xls::getInt4d($this->data, $this->pos + 4); - $recordData = substr($this->data, $this->pos + 8, $length); - - // move stream pointer to next record - $this->pos += 8 + $length; - } - - /** - * Read OfficeArtRGFOPTE table of property-value pairs. - * - * @param string $data Binary data - * @param int $n Number of properties - */ - private function readOfficeArtRGFOPTE($data, $n): void - { - $splicedComplexData = substr($data, 6 * $n); - - // loop through property-value pairs - for ($i = 0; $i < $n; ++$i) { - // read 6 bytes at a time - $fopte = substr($data, 6 * $i, 6); - - // offset: 0; size: 2; opid - $opid = Xls::getUInt2d($fopte, 0); - - // bit: 0-13; mask: 0x3FFF; opid.opid - $opidOpid = (0x3FFF & $opid) >> 0; - - // bit: 14; mask 0x4000; 1 = value in op field is BLIP identifier - $opidFBid = (0x4000 & $opid) >> 14; - - // bit: 15; mask 0x8000; 1 = this is a complex property, op field specifies size of complex data - $opidFComplex = (0x8000 & $opid) >> 15; - - // offset: 2; size: 4; the value for this property - $op = Xls::getInt4d($fopte, 2); - - if ($opidFComplex) { - $complexData = substr($splicedComplexData, 0, $op); - $splicedComplexData = substr($splicedComplexData, $op); - - // we store string value with complex data - $value = $complexData; - } else { - // we store integer value - $value = $op; - } - - $this->object->setOPT($opidOpid, $value); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/MD5.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/MD5.php deleted file mode 100644 index c0417ba..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/MD5.php +++ /dev/null @@ -1,184 +0,0 @@ -reset(); - } - - /** - * Reset the MD5 stream context. - */ - public function reset(): void - { - $this->a = 0x67452301; - $this->b = 0xEFCDAB89; - $this->c = 0x98BADCFE; - $this->d = 0x10325476; - } - - /** - * Get MD5 stream context. - * - * @return string - */ - public function getContext() - { - $s = ''; - foreach (['a', 'b', 'c', 'd'] as $i) { - $v = $this->{$i}; - $s .= chr($v & 0xff); - $s .= chr(($v >> 8) & 0xff); - $s .= chr(($v >> 16) & 0xff); - $s .= chr(($v >> 24) & 0xff); - } - - return $s; - } - - /** - * Add data to context. - * - * @param string $data Data to add - */ - public function add($data): void - { - $words = array_values(unpack('V16', $data)); - - $A = $this->a; - $B = $this->b; - $C = $this->c; - $D = $this->d; - - $F = ['self', 'f']; - $G = ['self', 'g']; - $H = ['self', 'h']; - $I = ['self', 'i']; - - // ROUND 1 - self::step($F, $A, $B, $C, $D, $words[0], 7, 0xd76aa478); - self::step($F, $D, $A, $B, $C, $words[1], 12, 0xe8c7b756); - self::step($F, $C, $D, $A, $B, $words[2], 17, 0x242070db); - self::step($F, $B, $C, $D, $A, $words[3], 22, 0xc1bdceee); - self::step($F, $A, $B, $C, $D, $words[4], 7, 0xf57c0faf); - self::step($F, $D, $A, $B, $C, $words[5], 12, 0x4787c62a); - self::step($F, $C, $D, $A, $B, $words[6], 17, 0xa8304613); - self::step($F, $B, $C, $D, $A, $words[7], 22, 0xfd469501); - self::step($F, $A, $B, $C, $D, $words[8], 7, 0x698098d8); - self::step($F, $D, $A, $B, $C, $words[9], 12, 0x8b44f7af); - self::step($F, $C, $D, $A, $B, $words[10], 17, 0xffff5bb1); - self::step($F, $B, $C, $D, $A, $words[11], 22, 0x895cd7be); - self::step($F, $A, $B, $C, $D, $words[12], 7, 0x6b901122); - self::step($F, $D, $A, $B, $C, $words[13], 12, 0xfd987193); - self::step($F, $C, $D, $A, $B, $words[14], 17, 0xa679438e); - self::step($F, $B, $C, $D, $A, $words[15], 22, 0x49b40821); - - // ROUND 2 - self::step($G, $A, $B, $C, $D, $words[1], 5, 0xf61e2562); - self::step($G, $D, $A, $B, $C, $words[6], 9, 0xc040b340); - self::step($G, $C, $D, $A, $B, $words[11], 14, 0x265e5a51); - self::step($G, $B, $C, $D, $A, $words[0], 20, 0xe9b6c7aa); - self::step($G, $A, $B, $C, $D, $words[5], 5, 0xd62f105d); - self::step($G, $D, $A, $B, $C, $words[10], 9, 0x02441453); - self::step($G, $C, $D, $A, $B, $words[15], 14, 0xd8a1e681); - self::step($G, $B, $C, $D, $A, $words[4], 20, 0xe7d3fbc8); - self::step($G, $A, $B, $C, $D, $words[9], 5, 0x21e1cde6); - self::step($G, $D, $A, $B, $C, $words[14], 9, 0xc33707d6); - self::step($G, $C, $D, $A, $B, $words[3], 14, 0xf4d50d87); - self::step($G, $B, $C, $D, $A, $words[8], 20, 0x455a14ed); - self::step($G, $A, $B, $C, $D, $words[13], 5, 0xa9e3e905); - self::step($G, $D, $A, $B, $C, $words[2], 9, 0xfcefa3f8); - self::step($G, $C, $D, $A, $B, $words[7], 14, 0x676f02d9); - self::step($G, $B, $C, $D, $A, $words[12], 20, 0x8d2a4c8a); - - // ROUND 3 - self::step($H, $A, $B, $C, $D, $words[5], 4, 0xfffa3942); - self::step($H, $D, $A, $B, $C, $words[8], 11, 0x8771f681); - self::step($H, $C, $D, $A, $B, $words[11], 16, 0x6d9d6122); - self::step($H, $B, $C, $D, $A, $words[14], 23, 0xfde5380c); - self::step($H, $A, $B, $C, $D, $words[1], 4, 0xa4beea44); - self::step($H, $D, $A, $B, $C, $words[4], 11, 0x4bdecfa9); - self::step($H, $C, $D, $A, $B, $words[7], 16, 0xf6bb4b60); - self::step($H, $B, $C, $D, $A, $words[10], 23, 0xbebfbc70); - self::step($H, $A, $B, $C, $D, $words[13], 4, 0x289b7ec6); - self::step($H, $D, $A, $B, $C, $words[0], 11, 0xeaa127fa); - self::step($H, $C, $D, $A, $B, $words[3], 16, 0xd4ef3085); - self::step($H, $B, $C, $D, $A, $words[6], 23, 0x04881d05); - self::step($H, $A, $B, $C, $D, $words[9], 4, 0xd9d4d039); - self::step($H, $D, $A, $B, $C, $words[12], 11, 0xe6db99e5); - self::step($H, $C, $D, $A, $B, $words[15], 16, 0x1fa27cf8); - self::step($H, $B, $C, $D, $A, $words[2], 23, 0xc4ac5665); - - // ROUND 4 - self::step($I, $A, $B, $C, $D, $words[0], 6, 0xf4292244); - self::step($I, $D, $A, $B, $C, $words[7], 10, 0x432aff97); - self::step($I, $C, $D, $A, $B, $words[14], 15, 0xab9423a7); - self::step($I, $B, $C, $D, $A, $words[5], 21, 0xfc93a039); - self::step($I, $A, $B, $C, $D, $words[12], 6, 0x655b59c3); - self::step($I, $D, $A, $B, $C, $words[3], 10, 0x8f0ccc92); - self::step($I, $C, $D, $A, $B, $words[10], 15, 0xffeff47d); - self::step($I, $B, $C, $D, $A, $words[1], 21, 0x85845dd1); - self::step($I, $A, $B, $C, $D, $words[8], 6, 0x6fa87e4f); - self::step($I, $D, $A, $B, $C, $words[15], 10, 0xfe2ce6e0); - self::step($I, $C, $D, $A, $B, $words[6], 15, 0xa3014314); - self::step($I, $B, $C, $D, $A, $words[13], 21, 0x4e0811a1); - self::step($I, $A, $B, $C, $D, $words[4], 6, 0xf7537e82); - self::step($I, $D, $A, $B, $C, $words[11], 10, 0xbd3af235); - self::step($I, $C, $D, $A, $B, $words[2], 15, 0x2ad7d2bb); - self::step($I, $B, $C, $D, $A, $words[9], 21, 0xeb86d391); - - $this->a = ($this->a + $A) & 0xffffffff; - $this->b = ($this->b + $B) & 0xffffffff; - $this->c = ($this->c + $C) & 0xffffffff; - $this->d = ($this->d + $D) & 0xffffffff; - } - - private static function f($X, $Y, $Z) - { - return ($X & $Y) | ((~$X) & $Z); // X AND Y OR NOT X AND Z - } - - private static function g($X, $Y, $Z) - { - return ($X & $Z) | ($Y & (~$Z)); // X AND Z OR Y AND NOT Z - } - - private static function h($X, $Y, $Z) - { - return $X ^ $Y ^ $Z; // X XOR Y XOR Z - } - - private static function i($X, $Y, $Z) - { - return $Y ^ ($X | (~$Z)); // Y XOR (X OR NOT Z) - } - - private static function step($func, &$A, $B, $C, $D, $M, $s, $t): void - { - $A = ($A + call_user_func($func, $B, $C, $D) + $M + $t) & 0xffffffff; - $A = self::rotate($A, $s); - $A = ($B + $A) & 0xffffffff; - } - - private static function rotate($decimal, $bits) - { - $binary = str_pad(decbin($decimal), 32, '0', STR_PAD_LEFT); - - return bindec(substr($binary, $bits) . substr($binary, 0, $bits)); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/RC4.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/RC4.php deleted file mode 100644 index 691aca7..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/RC4.php +++ /dev/null @@ -1,61 +0,0 @@ -i = 0; $this->i < 256; ++$this->i) { - $this->s[$this->i] = $this->i; - } - - $this->j = 0; - for ($this->i = 0; $this->i < 256; ++$this->i) { - $this->j = ($this->j + $this->s[$this->i] + ord($key[$this->i % $len])) % 256; - $t = $this->s[$this->i]; - $this->s[$this->i] = $this->s[$this->j]; - $this->s[$this->j] = $t; - } - $this->i = $this->j = 0; - } - - /** - * Symmetric decryption/encryption function. - * - * @param string $data Data to encrypt/decrypt - * - * @return string - */ - public function RC4($data) - { - $len = strlen($data); - for ($c = 0; $c < $len; ++$c) { - $this->i = ($this->i + 1) % 256; - $this->j = ($this->j + $this->s[$this->i]) % 256; - $t = $this->s[$this->i]; - $this->s[$this->i] = $this->s[$this->j]; - $this->s[$this->j] = $t; - - $t = ($this->s[$this->i] + $this->s[$this->j]) % 256; - - $data[$c] = chr(ord($data[$c]) ^ $this->s[$t]); - } - - return $data; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/Border.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/Border.php deleted file mode 100644 index 91cbe36..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/Border.php +++ /dev/null @@ -1,42 +0,0 @@ - StyleBorder::BORDER_NONE, - 0x01 => StyleBorder::BORDER_THIN, - 0x02 => StyleBorder::BORDER_MEDIUM, - 0x03 => StyleBorder::BORDER_DASHED, - 0x04 => StyleBorder::BORDER_DOTTED, - 0x05 => StyleBorder::BORDER_THICK, - 0x06 => StyleBorder::BORDER_DOUBLE, - 0x07 => StyleBorder::BORDER_HAIR, - 0x08 => StyleBorder::BORDER_MEDIUMDASHED, - 0x09 => StyleBorder::BORDER_DASHDOT, - 0x0A => StyleBorder::BORDER_MEDIUMDASHDOT, - 0x0B => StyleBorder::BORDER_DASHDOTDOT, - 0x0C => StyleBorder::BORDER_MEDIUMDASHDOTDOT, - 0x0D => StyleBorder::BORDER_SLANTDASHDOT, - ]; - - /** - * Map border style - * OpenOffice documentation: 2.5.11. - * - * @param int $index - * - * @return string - */ - public static function lookup($index) - { - if (isset(self::$map[$index])) { - return self::$map[$index]; - } - - return StyleBorder::BORDER_NONE; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/FillPattern.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/FillPattern.php deleted file mode 100644 index 7b85c08..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/FillPattern.php +++ /dev/null @@ -1,47 +0,0 @@ - Fill::FILL_NONE, - 0x01 => Fill::FILL_SOLID, - 0x02 => Fill::FILL_PATTERN_MEDIUMGRAY, - 0x03 => Fill::FILL_PATTERN_DARKGRAY, - 0x04 => Fill::FILL_PATTERN_LIGHTGRAY, - 0x05 => Fill::FILL_PATTERN_DARKHORIZONTAL, - 0x06 => Fill::FILL_PATTERN_DARKVERTICAL, - 0x07 => Fill::FILL_PATTERN_DARKDOWN, - 0x08 => Fill::FILL_PATTERN_DARKUP, - 0x09 => Fill::FILL_PATTERN_DARKGRID, - 0x0A => Fill::FILL_PATTERN_DARKTRELLIS, - 0x0B => Fill::FILL_PATTERN_LIGHTHORIZONTAL, - 0x0C => Fill::FILL_PATTERN_LIGHTVERTICAL, - 0x0D => Fill::FILL_PATTERN_LIGHTDOWN, - 0x0E => Fill::FILL_PATTERN_LIGHTUP, - 0x0F => Fill::FILL_PATTERN_LIGHTGRID, - 0x10 => Fill::FILL_PATTERN_LIGHTTRELLIS, - 0x11 => Fill::FILL_PATTERN_GRAY125, - 0x12 => Fill::FILL_PATTERN_GRAY0625, - ]; - - /** - * Get fill pattern from index - * OpenOffice documentation: 2.5.12. - * - * @param int $index - * - * @return string - */ - public static function lookup($index) - { - if (isset(self::$map[$index])) { - return self::$map[$index]; - } - - return Fill::FILL_NONE; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php deleted file mode 100644 index 73f9185..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php +++ /dev/null @@ -1,2058 +0,0 @@ -referenceHelper = ReferenceHelper::getInstance(); - $this->securityScanner = XmlScanner::getInstance($this); - } - - /** - * Can the current IReader read the file? - * - * @param string $pFilename - * - * @return bool - */ - public function canRead($pFilename) - { - File::assertFile($pFilename); - - $result = false; - $zip = new ZipArchive(); - - if ($zip->open($pFilename) === true) { - $workbookBasename = $this->getWorkbookBaseName($zip); - $result = !empty($workbookBasename); - - $zip->close(); - } - - return $result; - } - - /** - * Reads names of the worksheets from a file, without parsing the whole file to a Spreadsheet object. - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetNames($pFilename) - { - File::assertFile($pFilename); - - $worksheetNames = []; - - $zip = new ZipArchive(); - $zip->open($pFilename); - - // The files we're looking at here are small enough that simpleXML is more efficient than XMLReader - //~ http://schemas.openxmlformats.org/package/2006/relationships"); - $rels = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, '_rels/.rels')) - ); - foreach ($rels->Relationship as $rel) { - switch ($rel['Type']) { - case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument': - //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main" - $xmlWorkbook = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, "{$rel['Target']}")) - ); - - if ($xmlWorkbook->sheets) { - foreach ($xmlWorkbook->sheets->sheet as $eleSheet) { - // Check if sheet should be skipped - $worksheetNames[] = (string) $eleSheet['name']; - } - } - } - } - - $zip->close(); - - return $worksheetNames; - } - - /** - * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns). - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetInfo($pFilename) - { - File::assertFile($pFilename); - - $worksheetInfo = []; - - $zip = new ZipArchive(); - $zip->open($pFilename); - - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $rels = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, '_rels/.rels')), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - foreach ($rels->Relationship as $rel) { - if ($rel['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument') { - $dir = dirname($rel['Target']); - - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $relsWorkbook = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, "$dir/_rels/" . basename($rel['Target']) . '.rels') - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $relsWorkbook->registerXPathNamespace('rel', 'http://schemas.openxmlformats.org/package/2006/relationships'); - - $worksheets = []; - foreach ($relsWorkbook->Relationship as $ele) { - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet') { - $worksheets[(string) $ele['Id']] = $ele['Target']; - } - } - - //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main" - $xmlWorkbook = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, "{$rel['Target']}") - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - if ($xmlWorkbook->sheets) { - $dir = dirname($rel['Target']); - /** @var SimpleXMLElement $eleSheet */ - foreach ($xmlWorkbook->sheets->sheet as $eleSheet) { - $tmpInfo = [ - 'worksheetName' => (string) $eleSheet['name'], - 'lastColumnLetter' => 'A', - 'lastColumnIndex' => 0, - 'totalRows' => 0, - 'totalColumns' => 0, - ]; - - $fileWorksheet = $worksheets[(string) self::getArrayItem($eleSheet->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships'), 'id')]; - - $xml = new XMLReader(); - $xml->xml( - $this->securityScanner->scanFile( - 'zip://' . File::realpath($pFilename) . '#' . "$dir/$fileWorksheet" - ), - null, - Settings::getLibXmlLoaderOptions() - ); - $xml->setParserProperty(2, true); - - $currCells = 0; - while ($xml->read()) { - if ($xml->name == 'row' && $xml->nodeType == XMLReader::ELEMENT) { - $row = $xml->getAttribute('r'); - $tmpInfo['totalRows'] = $row; - $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); - $currCells = 0; - } elseif ($xml->name == 'c' && $xml->nodeType == XMLReader::ELEMENT) { - ++$currCells; - } - } - $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); - $xml->close(); - - $tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1; - $tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1); - - $worksheetInfo[] = $tmpInfo; - } - } - } - } - - $zip->close(); - - return $worksheetInfo; - } - - private static function castToBoolean($c) - { - $value = isset($c->v) ? (string) $c->v : null; - if ($value == '0') { - return false; - } elseif ($value == '1') { - return true; - } - - return (bool) $c->v; - } - - private static function castToError($c) - { - return isset($c->v) ? (string) $c->v : null; - } - - private static function castToString($c) - { - return isset($c->v) ? (string) $c->v : null; - } - - private function castToFormula($c, $r, &$cellDataType, &$value, &$calculatedValue, &$sharedFormulas, $castBaseType): void - { - $cellDataType = 'f'; - $value = "={$c->f}"; - $calculatedValue = self::$castBaseType($c); - - // Shared formula? - if (isset($c->f['t']) && strtolower((string) $c->f['t']) == 'shared') { - $instance = (string) $c->f['si']; - - if (!isset($sharedFormulas[(string) $c->f['si']])) { - $sharedFormulas[$instance] = ['master' => $r, 'formula' => $value]; - } else { - $master = Coordinate::coordinateFromString($sharedFormulas[$instance]['master']); - $current = Coordinate::coordinateFromString($r); - - $difference = [0, 0]; - $difference[0] = Coordinate::columnIndexFromString($current[0]) - Coordinate::columnIndexFromString($master[0]); - $difference[1] = $current[1] - $master[1]; - - $value = $this->referenceHelper->updateFormulaReferences($sharedFormulas[$instance]['formula'], 'A1', $difference[0], $difference[1]); - } - } - } - - /** - * @param string $fileName - * - * @return string - */ - private function getFromZipArchive(ZipArchive $archive, $fileName = '') - { - // Root-relative paths - if (strpos($fileName, '//') !== false) { - $fileName = substr($fileName, strpos($fileName, '//') + 1); - } - $fileName = File::realpath($fileName); - - // Sadly, some 3rd party xlsx generators don't use consistent case for filenaming - // so we need to load case-insensitively from the zip file - - // Apache POI fixes - $contents = $archive->getFromName($fileName, 0, ZipArchive::FL_NOCASE); - if ($contents === false) { - $contents = $archive->getFromName(substr($fileName, 1), 0, ZipArchive::FL_NOCASE); - } - - return $contents; - } - - /** - * Loads Spreadsheet from file. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function load($pFilename) - { - File::assertFile($pFilename); - - // Initialisations - $excel = new Spreadsheet(); - $excel->removeSheetByIndex(0); - if (!$this->readDataOnly) { - $excel->removeCellStyleXfByIndex(0); // remove the default style - $excel->removeCellXfByIndex(0); // remove the default style - } - $unparsedLoadedData = []; - - $zip = new ZipArchive(); - $zip->open($pFilename); - - // Read the theme first, because we need the colour scheme when reading the styles - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $workbookBasename = $this->getWorkbookBaseName($zip); - $wbRels = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, "xl/_rels/${workbookBasename}.rels")), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - foreach ($wbRels->Relationship as $rel) { - switch ($rel['Type']) { - case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme': - $themeOrderArray = ['lt1', 'dk1', 'lt2', 'dk2']; - $themeOrderAdditional = count($themeOrderArray); - - $xmlTheme = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, "xl/{$rel['Target']}")), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - if (is_object($xmlTheme)) { - $xmlThemeName = $xmlTheme->attributes(); - $xmlTheme = $xmlTheme->children('http://schemas.openxmlformats.org/drawingml/2006/main'); - $themeName = (string) $xmlThemeName['name']; - - $colourScheme = $xmlTheme->themeElements->clrScheme->attributes(); - $colourSchemeName = (string) $colourScheme['name']; - $colourScheme = $xmlTheme->themeElements->clrScheme->children('http://schemas.openxmlformats.org/drawingml/2006/main'); - - $themeColours = []; - foreach ($colourScheme as $k => $xmlColour) { - $themePos = array_search($k, $themeOrderArray); - if ($themePos === false) { - $themePos = $themeOrderAdditional++; - } - if (isset($xmlColour->sysClr)) { - $xmlColourData = $xmlColour->sysClr->attributes(); - $themeColours[$themePos] = $xmlColourData['lastClr']; - } elseif (isset($xmlColour->srgbClr)) { - $xmlColourData = $xmlColour->srgbClr->attributes(); - $themeColours[$themePos] = $xmlColourData['val']; - } - } - self::$theme = new Xlsx\Theme($themeName, $colourSchemeName, $themeColours); - } - - break; - } - } - - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $rels = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, '_rels/.rels')), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - - $propertyReader = new PropertyReader($this->securityScanner, $excel->getProperties()); - foreach ($rels->Relationship as $rel) { - switch ($rel['Type']) { - case 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties': - $propertyReader->readCoreProperties($this->getFromZipArchive($zip, "{$rel['Target']}")); - - break; - case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties': - $propertyReader->readExtendedProperties($this->getFromZipArchive($zip, "{$rel['Target']}")); - - break; - case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties': - $propertyReader->readCustomProperties($this->getFromZipArchive($zip, "{$rel['Target']}")); - - break; - //Ribbon - case 'http://schemas.microsoft.com/office/2006/relationships/ui/extensibility': - $customUI = $rel['Target']; - if ($customUI !== null) { - $this->readRibbon($excel, $customUI, $zip); - } - - break; - case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument': - $dir = dirname($rel['Target']); - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $relsWorkbook = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, "$dir/_rels/" . basename($rel['Target']) . '.rels')), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $relsWorkbook->registerXPathNamespace('rel', 'http://schemas.openxmlformats.org/package/2006/relationships'); - - $sharedStrings = []; - $xpath = self::getArrayItem($relsWorkbook->xpath("rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings']")); - if ($xpath) { - //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main" - $xmlStrings = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, "$dir/$xpath[Target]")), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - if (isset($xmlStrings, $xmlStrings->si)) { - foreach ($xmlStrings->si as $val) { - if (isset($val->t)) { - $sharedStrings[] = StringHelper::controlCharacterOOXML2PHP((string) $val->t); - } elseif (isset($val->r)) { - $sharedStrings[] = $this->parseRichText($val); - } - } - } - } - - $worksheets = []; - $macros = $customUI = null; - foreach ($relsWorkbook->Relationship as $ele) { - switch ($ele['Type']) { - case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet': - $worksheets[(string) $ele['Id']] = $ele['Target']; - - break; - // a vbaProject ? (: some macros) - case 'http://schemas.microsoft.com/office/2006/relationships/vbaProject': - $macros = $ele['Target']; - - break; - } - } - - if ($macros !== null) { - $macrosCode = $this->getFromZipArchive($zip, 'xl/vbaProject.bin'); //vbaProject.bin always in 'xl' dir and always named vbaProject.bin - if ($macrosCode !== false) { - $excel->setMacrosCode($macrosCode); - $excel->setHasMacros(true); - //short-circuit : not reading vbaProject.bin.rel to get Signature =>allways vbaProjectSignature.bin in 'xl' dir - $Certificate = $this->getFromZipArchive($zip, 'xl/vbaProjectSignature.bin'); - if ($Certificate !== false) { - $excel->setMacrosCertificate($Certificate); - } - } - } - - $xpath = self::getArrayItem($relsWorkbook->xpath("rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles']")); - //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main" - $xmlStyles = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, "$dir/$xpath[Target]")), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - - $styles = []; - $cellStyles = []; - $numFmts = null; - if ($xmlStyles && $xmlStyles->numFmts[0]) { - $numFmts = $xmlStyles->numFmts[0]; - } - if (isset($numFmts) && ($numFmts !== null)) { - $numFmts->registerXPathNamespace('sml', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); - } - if (!$this->readDataOnly && $xmlStyles) { - foreach ($xmlStyles->cellXfs->xf as $xf) { - $numFmt = NumberFormat::FORMAT_GENERAL; - - if ($xf['numFmtId']) { - if (isset($numFmts)) { - $tmpNumFmt = self::getArrayItem($numFmts->xpath("sml:numFmt[@numFmtId=$xf[numFmtId]]")); - - if (isset($tmpNumFmt['formatCode'])) { - $numFmt = (string) $tmpNumFmt['formatCode']; - } - } - - // We shouldn't override any of the built-in MS Excel values (values below id 164) - // But there's a lot of naughty homebrew xlsx writers that do use "reserved" id values that aren't actually used - // So we make allowance for them rather than lose formatting masks - if ( - (int) $xf['numFmtId'] < 164 && - NumberFormat::builtInFormatCode((int) $xf['numFmtId']) !== '' - ) { - $numFmt = NumberFormat::builtInFormatCode((int) $xf['numFmtId']); - } - } - $quotePrefix = false; - if (isset($xf['quotePrefix'])) { - $quotePrefix = (bool) $xf['quotePrefix']; - } - - $style = (object) [ - 'numFmt' => $numFmt, - 'font' => $xmlStyles->fonts->font[(int) ($xf['fontId'])], - 'fill' => $xmlStyles->fills->fill[(int) ($xf['fillId'])], - 'border' => $xmlStyles->borders->border[(int) ($xf['borderId'])], - 'alignment' => $xf->alignment, - 'protection' => $xf->protection, - 'quotePrefix' => $quotePrefix, - ]; - $styles[] = $style; - - // add style to cellXf collection - $objStyle = new Style(); - self::readStyle($objStyle, $style); - $excel->addCellXf($objStyle); - } - - foreach (isset($xmlStyles->cellStyleXfs->xf) ? $xmlStyles->cellStyleXfs->xf : [] as $xf) { - $numFmt = NumberFormat::FORMAT_GENERAL; - if ($numFmts && $xf['numFmtId']) { - $tmpNumFmt = self::getArrayItem($numFmts->xpath("sml:numFmt[@numFmtId=$xf[numFmtId]]")); - if (isset($tmpNumFmt['formatCode'])) { - $numFmt = (string) $tmpNumFmt['formatCode']; - } elseif ((int) $xf['numFmtId'] < 165) { - $numFmt = NumberFormat::builtInFormatCode((int) $xf['numFmtId']); - } - } - - $cellStyle = (object) [ - 'numFmt' => $numFmt, - 'font' => $xmlStyles->fonts->font[(int) ($xf['fontId'])], - 'fill' => $xmlStyles->fills->fill[(int) ($xf['fillId'])], - 'border' => $xmlStyles->borders->border[(int) ($xf['borderId'])], - 'alignment' => $xf->alignment, - 'protection' => $xf->protection, - 'quotePrefix' => $quotePrefix, - ]; - $cellStyles[] = $cellStyle; - - // add style to cellStyleXf collection - $objStyle = new Style(); - self::readStyle($objStyle, $cellStyle); - $excel->addCellStyleXf($objStyle); - } - } - - $styleReader = new Styles($xmlStyles); - $styleReader->setStyleBaseData(self::$theme, $styles, $cellStyles); - $dxfs = $styleReader->dxfs($this->readDataOnly); - $styles = $styleReader->styles(); - - //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main" - $xmlWorkbook = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, "{$rel['Target']}")), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - - // Set base date - if ($xmlWorkbook->workbookPr) { - Date::setExcelCalendar(Date::CALENDAR_WINDOWS_1900); - if (isset($xmlWorkbook->workbookPr['date1904'])) { - if (self::boolean((string) $xmlWorkbook->workbookPr['date1904'])) { - Date::setExcelCalendar(Date::CALENDAR_MAC_1904); - } - } - } - - // Set protection - $this->readProtection($excel, $xmlWorkbook); - - $sheetId = 0; // keep track of new sheet id in final workbook - $oldSheetId = -1; // keep track of old sheet id in final workbook - $countSkippedSheets = 0; // keep track of number of skipped sheets - $mapSheetId = []; // mapping of sheet ids from old to new - - $charts = $chartDetails = []; - - if ($xmlWorkbook->sheets) { - /** @var SimpleXMLElement $eleSheet */ - foreach ($xmlWorkbook->sheets->sheet as $eleSheet) { - ++$oldSheetId; - - // Check if sheet should be skipped - if (isset($this->loadSheetsOnly) && !in_array((string) $eleSheet['name'], $this->loadSheetsOnly)) { - ++$countSkippedSheets; - $mapSheetId[$oldSheetId] = null; - - continue; - } - - // Map old sheet id in original workbook to new sheet id. - // They will differ if loadSheetsOnly() is being used - $mapSheetId[$oldSheetId] = $oldSheetId - $countSkippedSheets; - - // Load sheet - $docSheet = $excel->createSheet(); - // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet - // references in formula cells... during the load, all formulae should be correct, - // and we're simply bringing the worksheet name in line with the formula, not the - // reverse - $docSheet->setTitle((string) $eleSheet['name'], false, false); - $fileWorksheet = $worksheets[(string) self::getArrayItem($eleSheet->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships'), 'id')]; - //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main" - $xmlSheet = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, "$dir/$fileWorksheet")), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - - $sharedFormulas = []; - - if (isset($eleSheet['state']) && (string) $eleSheet['state'] != '') { - $docSheet->setSheetState((string) $eleSheet['state']); - } - - if ($xmlSheet) { - if (isset($xmlSheet->sheetViews, $xmlSheet->sheetViews->sheetView)) { - $sheetViews = new SheetViews($xmlSheet->sheetViews->sheetView, $docSheet); - $sheetViews->load(); - } - - $sheetViewOptions = new SheetViewOptions($docSheet, $xmlSheet); - $sheetViewOptions->load($this->getReadDataOnly()); - - (new ColumnAndRowAttributes($docSheet, $xmlSheet)) - ->load($this->getReadFilter(), $this->getReadDataOnly()); - } - - if ($xmlSheet && $xmlSheet->sheetData && $xmlSheet->sheetData->row) { - $cIndex = 1; // Cell Start from 1 - foreach ($xmlSheet->sheetData->row as $row) { - $rowIndex = 1; - foreach ($row->c as $c) { - $r = (string) $c['r']; - if ($r == '') { - $r = Coordinate::stringFromColumnIndex($rowIndex) . $cIndex; - } - $cellDataType = (string) $c['t']; - $value = null; - $calculatedValue = null; - - // Read cell? - if ($this->getReadFilter() !== null) { - $coordinates = Coordinate::coordinateFromString($r); - - if (!$this->getReadFilter()->readCell($coordinates[0], (int) $coordinates[1], $docSheet->getTitle())) { - ++$rowIndex; - - continue; - } - } - - // Read cell! - switch ($cellDataType) { - case 's': - if ((string) $c->v != '') { - $value = $sharedStrings[(int) ($c->v)]; - - if ($value instanceof RichText) { - $value = clone $value; - } - } else { - $value = ''; - } - - break; - case 'b': - if (!isset($c->f)) { - $value = self::castToBoolean($c); - } else { - // Formula - $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToBoolean'); - if (isset($c->f['t'])) { - $att = $c->f; - $docSheet->getCell($r)->setFormulaAttributes($att); - } - } - - break; - case 'inlineStr': - if (isset($c->f)) { - $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToError'); - } else { - $value = $this->parseRichText($c->is); - } - - break; - case 'e': - if (!isset($c->f)) { - $value = self::castToError($c); - } else { - // Formula - $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToError'); - } - - break; - default: - if (!isset($c->f)) { - $value = self::castToString($c); - } else { - // Formula - $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToString'); - } - - break; - } - - // read empty cells or the cells are not empty - if ($this->readEmptyCells || ($value !== null && $value !== '')) { - // Rich text? - if ($value instanceof RichText && $this->readDataOnly) { - $value = $value->getPlainText(); - } - - $cell = $docSheet->getCell($r); - // Assign value - if ($cellDataType != '') { - $cell->setValueExplicit($value, $cellDataType); - } else { - $cell->setValue($value); - } - if ($calculatedValue !== null) { - $cell->setCalculatedValue($calculatedValue); - } - - // Style information? - if ($c['s'] && !$this->readDataOnly) { - // no style index means 0, it seems - $cell->setXfIndex(isset($styles[(int) ($c['s'])]) ? - (int) ($c['s']) : 0); - } - } - ++$rowIndex; - } - ++$cIndex; - } - } - - if (!$this->readDataOnly && $xmlSheet && $xmlSheet->conditionalFormatting) { - (new ConditionalStyles($docSheet, $xmlSheet, $dxfs))->load(); - } - - $aKeys = ['sheet', 'objects', 'scenarios', 'formatCells', 'formatColumns', 'formatRows', 'insertColumns', 'insertRows', 'insertHyperlinks', 'deleteColumns', 'deleteRows', 'selectLockedCells', 'sort', 'autoFilter', 'pivotTables', 'selectUnlockedCells']; - if (!$this->readDataOnly && $xmlSheet && $xmlSheet->sheetProtection) { - foreach ($aKeys as $key) { - $method = 'set' . ucfirst($key); - $docSheet->getProtection()->$method(self::boolean((string) $xmlSheet->sheetProtection[$key])); - } - } - - if ($xmlSheet) { - $this->readSheetProtection($docSheet, $xmlSheet); - } - - if ($xmlSheet && $xmlSheet->autoFilter && !$this->readDataOnly) { - (new AutoFilter($docSheet, $xmlSheet))->load(); - } - - if ($xmlSheet && $xmlSheet->mergeCells && $xmlSheet->mergeCells->mergeCell && !$this->readDataOnly) { - foreach ($xmlSheet->mergeCells->mergeCell as $mergeCell) { - $mergeRef = (string) $mergeCell['ref']; - if (strpos($mergeRef, ':') !== false) { - $docSheet->mergeCells((string) $mergeCell['ref']); - } - } - } - - if ($xmlSheet && !$this->readDataOnly) { - $unparsedLoadedData = (new PageSetup($docSheet, $xmlSheet))->load($unparsedLoadedData); - } - - if ($xmlSheet && $xmlSheet->dataValidations && !$this->readDataOnly) { - (new DataValidations($docSheet, $xmlSheet))->load(); - } - - // unparsed sheet AlternateContent - if ($xmlSheet && !$this->readDataOnly) { - $mc = $xmlSheet->children('http://schemas.openxmlformats.org/markup-compatibility/2006'); - if ($mc->AlternateContent) { - foreach ($mc->AlternateContent as $alternateContent) { - $unparsedLoadedData['sheets'][$docSheet->getCodeName()]['AlternateContents'][] = $alternateContent->asXML(); - } - } - } - - // Add hyperlinks - if (!$this->readDataOnly) { - $hyperlinkReader = new Hyperlinks($docSheet); - // Locate hyperlink relations - $relationsFileName = dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels'; - if ($zip->locateName($relationsFileName)) { - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $relsWorksheet = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, $relationsFileName) - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $hyperlinkReader->readHyperlinks($relsWorksheet); - } - - // Loop through hyperlinks - if ($xmlSheet && $xmlSheet->hyperlinks) { - $hyperlinkReader->setHyperlinks($xmlSheet->hyperlinks); - } - } - - // Add comments - $comments = []; - $vmlComments = []; - if (!$this->readDataOnly) { - // Locate comment relations - if ($zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) { - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $relsWorksheet = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels') - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - foreach ($relsWorksheet->Relationship as $ele) { - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments') { - $comments[(string) $ele['Id']] = (string) $ele['Target']; - } - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing') { - $vmlComments[(string) $ele['Id']] = (string) $ele['Target']; - } - } - } - - // Loop through comments - foreach ($comments as $relName => $relPath) { - // Load comments file - $relPath = File::realpath(dirname("$dir/$fileWorksheet") . '/' . $relPath); - $commentsFile = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, $relPath)), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - - // Utility variables - $authors = []; - - // Loop through authors - foreach ($commentsFile->authors->author as $author) { - $authors[] = (string) $author; - } - - // Loop through contents - foreach ($commentsFile->commentList->comment as $comment) { - if (!empty($comment['authorId'])) { - $docSheet->getComment((string) $comment['ref'])->setAuthor($authors[(string) $comment['authorId']]); - } - $docSheet->getComment((string) $comment['ref'])->setText($this->parseRichText($comment->text)); - } - } - - // later we will remove from it real vmlComments - $unparsedVmlDrawings = $vmlComments; - - // Loop through VML comments - foreach ($vmlComments as $relName => $relPath) { - // Load VML comments file - $relPath = File::realpath(dirname("$dir/$fileWorksheet") . '/' . $relPath); - - try { - $vmlCommentsFile = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, $relPath)), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $vmlCommentsFile->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); - } catch (Throwable $ex) { - //Ignore unparsable vmlDrawings. Later they will be moved from $unparsedVmlDrawings to $unparsedLoadedData - continue; - } - - $shapes = $vmlCommentsFile->xpath('//v:shape'); - foreach ($shapes as $shape) { - $shape->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); - - if (isset($shape['style'])) { - $style = (string) $shape['style']; - $fillColor = strtoupper(substr((string) $shape['fillcolor'], 1)); - $column = null; - $row = null; - - $clientData = $shape->xpath('.//x:ClientData'); - if (is_array($clientData) && !empty($clientData)) { - $clientData = $clientData[0]; - - if (isset($clientData['ObjectType']) && (string) $clientData['ObjectType'] == 'Note') { - $temp = $clientData->xpath('.//x:Row'); - if (is_array($temp)) { - $row = $temp[0]; - } - - $temp = $clientData->xpath('.//x:Column'); - if (is_array($temp)) { - $column = $temp[0]; - } - } - } - - if (($column !== null) && ($row !== null)) { - // Set comment properties - $comment = $docSheet->getCommentByColumnAndRow($column + 1, $row + 1); - $comment->getFillColor()->setRGB($fillColor); - - // Parse style - $styleArray = explode(';', str_replace(' ', '', $style)); - foreach ($styleArray as $stylePair) { - $stylePair = explode(':', $stylePair); - - if ($stylePair[0] == 'margin-left') { - $comment->setMarginLeft($stylePair[1]); - } - if ($stylePair[0] == 'margin-top') { - $comment->setMarginTop($stylePair[1]); - } - if ($stylePair[0] == 'width') { - $comment->setWidth($stylePair[1]); - } - if ($stylePair[0] == 'height') { - $comment->setHeight($stylePair[1]); - } - if ($stylePair[0] == 'visibility') { - $comment->setVisible($stylePair[1] == 'visible'); - } - } - - unset($unparsedVmlDrawings[$relName]); - } - } - } - } - - // unparsed vmlDrawing - if ($unparsedVmlDrawings) { - foreach ($unparsedVmlDrawings as $rId => $relPath) { - $rId = substr($rId, 3); // rIdXXX - $unparsedVmlDrawing = &$unparsedLoadedData['sheets'][$docSheet->getCodeName()]['vmlDrawings']; - $unparsedVmlDrawing[$rId] = []; - $unparsedVmlDrawing[$rId]['filePath'] = self::dirAdd("$dir/$fileWorksheet", $relPath); - $unparsedVmlDrawing[$rId]['relFilePath'] = $relPath; - $unparsedVmlDrawing[$rId]['content'] = $this->securityScanner->scan($this->getFromZipArchive($zip, $unparsedVmlDrawing[$rId]['filePath'])); - unset($unparsedVmlDrawing); - } - } - - // Header/footer images - if ($xmlSheet && $xmlSheet->legacyDrawingHF && !$this->readDataOnly) { - if ($zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) { - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $relsWorksheet = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels') - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $vmlRelationship = ''; - - foreach ($relsWorksheet->Relationship as $ele) { - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing') { - $vmlRelationship = self::dirAdd("$dir/$fileWorksheet", $ele['Target']); - } - } - - if ($vmlRelationship != '') { - // Fetch linked images - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $relsVML = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, dirname($vmlRelationship) . '/_rels/' . basename($vmlRelationship) . '.rels') - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $drawings = []; - if (isset($relsVML->Relationship)) { - foreach ($relsVML->Relationship as $ele) { - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image') { - $drawings[(string) $ele['Id']] = self::dirAdd($vmlRelationship, $ele['Target']); - } - } - } - // Fetch VML document - $vmlDrawing = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, $vmlRelationship)), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $vmlDrawing->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); - - $hfImages = []; - - $shapes = $vmlDrawing->xpath('//v:shape'); - foreach ($shapes as $idx => $shape) { - $shape->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); - $imageData = $shape->xpath('//v:imagedata'); - - if (!$imageData) { - continue; - } - - $imageData = $imageData[$idx]; - - $imageData = $imageData->attributes('urn:schemas-microsoft-com:office:office'); - $style = self::toCSSArray((string) $shape['style']); - - $hfImages[(string) $shape['id']] = new HeaderFooterDrawing(); - if (isset($imageData['title'])) { - $hfImages[(string) $shape['id']]->setName((string) $imageData['title']); - } - - $hfImages[(string) $shape['id']]->setPath('zip://' . File::realpath($pFilename) . '#' . $drawings[(string) $imageData['relid']], false); - $hfImages[(string) $shape['id']]->setResizeProportional(false); - $hfImages[(string) $shape['id']]->setWidth($style['width']); - $hfImages[(string) $shape['id']]->setHeight($style['height']); - if (isset($style['margin-left'])) { - $hfImages[(string) $shape['id']]->setOffsetX($style['margin-left']); - } - $hfImages[(string) $shape['id']]->setOffsetY($style['margin-top']); - $hfImages[(string) $shape['id']]->setResizeProportional(true); - } - - $docSheet->getHeaderFooter()->setImages($hfImages); - } - } - } - } - - // TODO: Autoshapes from twoCellAnchors! - if ($zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) { - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $relsWorksheet = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels') - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $drawings = []; - foreach ($relsWorksheet->Relationship as $ele) { - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing') { - $drawings[(string) $ele['Id']] = self::dirAdd("$dir/$fileWorksheet", $ele['Target']); - } - } - if ($xmlSheet->drawing && !$this->readDataOnly) { - $unparsedDrawings = []; - foreach ($xmlSheet->drawing as $drawing) { - $drawingRelId = (string) self::getArrayItem($drawing->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships'), 'id'); - $fileDrawing = $drawings[$drawingRelId]; - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $relsDrawing = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, dirname($fileDrawing) . '/_rels/' . basename($fileDrawing) . '.rels') - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $images = []; - $hyperlinks = []; - if ($relsDrawing && $relsDrawing->Relationship) { - foreach ($relsDrawing->Relationship as $ele) { - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink') { - $hyperlinks[(string) $ele['Id']] = (string) $ele['Target']; - } - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image') { - $images[(string) $ele['Id']] = self::dirAdd($fileDrawing, $ele['Target']); - } elseif ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart') { - if ($this->includeCharts) { - $charts[self::dirAdd($fileDrawing, $ele['Target'])] = [ - 'id' => (string) $ele['Id'], - 'sheet' => $docSheet->getTitle(), - ]; - } - } - } - } - $xmlDrawing = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, $fileDrawing)), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $xmlDrawingChildren = $xmlDrawing->children('http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing'); - - if ($xmlDrawingChildren->oneCellAnchor) { - foreach ($xmlDrawingChildren->oneCellAnchor as $oneCellAnchor) { - if ($oneCellAnchor->pic->blipFill) { - /** @var SimpleXMLElement $blip */ - $blip = $oneCellAnchor->pic->blipFill->children('http://schemas.openxmlformats.org/drawingml/2006/main')->blip; - /** @var SimpleXMLElement $xfrm */ - $xfrm = $oneCellAnchor->pic->spPr->children('http://schemas.openxmlformats.org/drawingml/2006/main')->xfrm; - /** @var SimpleXMLElement $outerShdw */ - $outerShdw = $oneCellAnchor->pic->spPr->children('http://schemas.openxmlformats.org/drawingml/2006/main')->effectLst->outerShdw; - /** @var SimpleXMLElement $hlinkClick */ - $hlinkClick = $oneCellAnchor->pic->nvPicPr->cNvPr->children('http://schemas.openxmlformats.org/drawingml/2006/main')->hlinkClick; - - $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); - $objDrawing->setName((string) self::getArrayItem($oneCellAnchor->pic->nvPicPr->cNvPr->attributes(), 'name')); - $objDrawing->setDescription((string) self::getArrayItem($oneCellAnchor->pic->nvPicPr->cNvPr->attributes(), 'descr')); - $objDrawing->setPath( - 'zip://' . File::realpath($pFilename) . '#' . - $images[(string) self::getArrayItem( - $blip->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships'), - 'embed' - )], - false - ); - $objDrawing->setCoordinates(Coordinate::stringFromColumnIndex(((string) $oneCellAnchor->from->col) + 1) . ($oneCellAnchor->from->row + 1)); - $objDrawing->setOffsetX(Drawing::EMUToPixels($oneCellAnchor->from->colOff)); - $objDrawing->setOffsetY(Drawing::EMUToPixels($oneCellAnchor->from->rowOff)); - $objDrawing->setResizeProportional(false); - $objDrawing->setWidth(Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), 'cx'))); - $objDrawing->setHeight(Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), 'cy'))); - if ($xfrm) { - $objDrawing->setRotation(Drawing::angleToDegrees(self::getArrayItem($xfrm->attributes(), 'rot'))); - } - if ($outerShdw) { - $shadow = $objDrawing->getShadow(); - $shadow->setVisible(true); - $shadow->setBlurRadius(Drawing::EMUToPixels(self::getArrayItem($outerShdw->attributes(), 'blurRad'))); - $shadow->setDistance(Drawing::EMUToPixels(self::getArrayItem($outerShdw->attributes(), 'dist'))); - $shadow->setDirection(Drawing::angleToDegrees(self::getArrayItem($outerShdw->attributes(), 'dir'))); - $shadow->setAlignment((string) self::getArrayItem($outerShdw->attributes(), 'algn')); - $clr = isset($outerShdw->srgbClr) ? $outerShdw->srgbClr : $outerShdw->prstClr; - $shadow->getColor()->setRGB(self::getArrayItem($clr->attributes(), 'val')); - $shadow->setAlpha(self::getArrayItem($clr->alpha->attributes(), 'val') / 1000); - } - - $this->readHyperLinkDrawing($objDrawing, $oneCellAnchor, $hyperlinks); - - $objDrawing->setWorksheet($docSheet); - } else { - // ? Can charts be positioned with a oneCellAnchor ? - $coordinates = Coordinate::stringFromColumnIndex(((string) $oneCellAnchor->from->col) + 1) . ($oneCellAnchor->from->row + 1); - $offsetX = Drawing::EMUToPixels($oneCellAnchor->from->colOff); - $offsetY = Drawing::EMUToPixels($oneCellAnchor->from->rowOff); - $width = Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), 'cx')); - $height = Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), 'cy')); - } - } - } - if ($xmlDrawingChildren->twoCellAnchor) { - foreach ($xmlDrawingChildren->twoCellAnchor as $twoCellAnchor) { - if ($twoCellAnchor->pic->blipFill) { - $blip = $twoCellAnchor->pic->blipFill->children('http://schemas.openxmlformats.org/drawingml/2006/main')->blip; - $xfrm = $twoCellAnchor->pic->spPr->children('http://schemas.openxmlformats.org/drawingml/2006/main')->xfrm; - $outerShdw = $twoCellAnchor->pic->spPr->children('http://schemas.openxmlformats.org/drawingml/2006/main')->effectLst->outerShdw; - $hlinkClick = $twoCellAnchor->pic->nvPicPr->cNvPr->children('http://schemas.openxmlformats.org/drawingml/2006/main')->hlinkClick; - $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); - $objDrawing->setName((string) self::getArrayItem($twoCellAnchor->pic->nvPicPr->cNvPr->attributes(), 'name')); - $objDrawing->setDescription((string) self::getArrayItem($twoCellAnchor->pic->nvPicPr->cNvPr->attributes(), 'descr')); - $objDrawing->setPath( - 'zip://' . File::realpath($pFilename) . '#' . - $images[(string) self::getArrayItem( - $blip->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships'), - 'embed' - )], - false - ); - $objDrawing->setCoordinates(Coordinate::stringFromColumnIndex(((string) $twoCellAnchor->from->col) + 1) . ($twoCellAnchor->from->row + 1)); - $objDrawing->setOffsetX(Drawing::EMUToPixels($twoCellAnchor->from->colOff)); - $objDrawing->setOffsetY(Drawing::EMUToPixels($twoCellAnchor->from->rowOff)); - $objDrawing->setResizeProportional(false); - - if ($xfrm) { - $objDrawing->setWidth(Drawing::EMUToPixels(self::getArrayItem($xfrm->ext->attributes(), 'cx'))); - $objDrawing->setHeight(Drawing::EMUToPixels(self::getArrayItem($xfrm->ext->attributes(), 'cy'))); - $objDrawing->setRotation(Drawing::angleToDegrees(self::getArrayItem($xfrm->attributes(), 'rot'))); - } - if ($outerShdw) { - $shadow = $objDrawing->getShadow(); - $shadow->setVisible(true); - $shadow->setBlurRadius(Drawing::EMUToPixels(self::getArrayItem($outerShdw->attributes(), 'blurRad'))); - $shadow->setDistance(Drawing::EMUToPixels(self::getArrayItem($outerShdw->attributes(), 'dist'))); - $shadow->setDirection(Drawing::angleToDegrees(self::getArrayItem($outerShdw->attributes(), 'dir'))); - $shadow->setAlignment((string) self::getArrayItem($outerShdw->attributes(), 'algn')); - $clr = isset($outerShdw->srgbClr) ? $outerShdw->srgbClr : $outerShdw->prstClr; - $shadow->getColor()->setRGB(self::getArrayItem($clr->attributes(), 'val')); - $shadow->setAlpha(self::getArrayItem($clr->alpha->attributes(), 'val') / 1000); - } - - $this->readHyperLinkDrawing($objDrawing, $twoCellAnchor, $hyperlinks); - - $objDrawing->setWorksheet($docSheet); - } elseif (($this->includeCharts) && ($twoCellAnchor->graphicFrame)) { - $fromCoordinate = Coordinate::stringFromColumnIndex(((string) $twoCellAnchor->from->col) + 1) . ($twoCellAnchor->from->row + 1); - $fromOffsetX = Drawing::EMUToPixels($twoCellAnchor->from->colOff); - $fromOffsetY = Drawing::EMUToPixels($twoCellAnchor->from->rowOff); - $toCoordinate = Coordinate::stringFromColumnIndex(((string) $twoCellAnchor->to->col) + 1) . ($twoCellAnchor->to->row + 1); - $toOffsetX = Drawing::EMUToPixels($twoCellAnchor->to->colOff); - $toOffsetY = Drawing::EMUToPixels($twoCellAnchor->to->rowOff); - $graphic = $twoCellAnchor->graphicFrame->children('http://schemas.openxmlformats.org/drawingml/2006/main')->graphic; - /** @var SimpleXMLElement $chartRef */ - $chartRef = $graphic->graphicData->children('http://schemas.openxmlformats.org/drawingml/2006/chart')->chart; - $thisChart = (string) $chartRef->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships'); - - $chartDetails[$docSheet->getTitle() . '!' . $thisChart] = [ - 'fromCoordinate' => $fromCoordinate, - 'fromOffsetX' => $fromOffsetX, - 'fromOffsetY' => $fromOffsetY, - 'toCoordinate' => $toCoordinate, - 'toOffsetX' => $toOffsetX, - 'toOffsetY' => $toOffsetY, - 'worksheetTitle' => $docSheet->getTitle(), - ]; - } - } - } - if ($relsDrawing === false && $xmlDrawing->count() == 0) { - // Save Drawing without rels and children as unparsed - $unparsedDrawings[$drawingRelId] = $xmlDrawing->asXML(); - } - } - - // store original rId of drawing files - $unparsedLoadedData['sheets'][$docSheet->getCodeName()]['drawingOriginalIds'] = []; - foreach ($relsWorksheet->Relationship as $ele) { - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing') { - $drawingRelId = (string) $ele['Id']; - $unparsedLoadedData['sheets'][$docSheet->getCodeName()]['drawingOriginalIds'][(string) $ele['Target']] = $drawingRelId; - if (isset($unparsedDrawings[$drawingRelId])) { - $unparsedLoadedData['sheets'][$docSheet->getCodeName()]['Drawings'][$drawingRelId] = $unparsedDrawings[$drawingRelId]; - } - } - } - - // unparsed drawing AlternateContent - $xmlAltDrawing = simplexml_load_string( - $this->securityScanner->scan($this->getFromZipArchive($zip, $fileDrawing)), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - )->children('http://schemas.openxmlformats.org/markup-compatibility/2006'); - - if ($xmlAltDrawing->AlternateContent) { - foreach ($xmlAltDrawing->AlternateContent as $alternateContent) { - $unparsedLoadedData['sheets'][$docSheet->getCodeName()]['drawingAlternateContents'][] = $alternateContent->asXML(); - } - } - } - } - - $this->readFormControlProperties($excel, $zip, $dir, $fileWorksheet, $docSheet, $unparsedLoadedData); - $this->readPrinterSettings($excel, $zip, $dir, $fileWorksheet, $docSheet, $unparsedLoadedData); - - // Loop through definedNames - if ($xmlWorkbook->definedNames) { - foreach ($xmlWorkbook->definedNames->definedName as $definedName) { - // Extract range - $extractedRange = (string) $definedName; - if (($spos = strpos($extractedRange, '!')) !== false) { - $extractedRange = substr($extractedRange, 0, $spos) . str_replace('$', '', substr($extractedRange, $spos)); - } else { - $extractedRange = str_replace('$', '', $extractedRange); - } - - // Valid range? - if (stripos((string) $definedName, '#REF!') !== false || $extractedRange == '') { - continue; - } - - // Some definedNames are only applicable if we are on the same sheet... - if ((string) $definedName['localSheetId'] != '' && (string) $definedName['localSheetId'] == $oldSheetId) { - // Switch on type - switch ((string) $definedName['name']) { - case '_xlnm._FilterDatabase': - if ((string) $definedName['hidden'] !== '1') { - $extractedRange = explode(',', $extractedRange); - foreach ($extractedRange as $range) { - $autoFilterRange = $range; - if (strpos($autoFilterRange, ':') !== false) { - $docSheet->getAutoFilter()->setRange($autoFilterRange); - } - } - } - - break; - case '_xlnm.Print_Titles': - // Split $extractedRange - $extractedRange = explode(',', $extractedRange); - - // Set print titles - foreach ($extractedRange as $range) { - $matches = []; - $range = str_replace('$', '', $range); - - // check for repeating columns, e g. 'A:A' or 'A:D' - if (preg_match('/!?([A-Z]+)\:([A-Z]+)$/', $range, $matches)) { - $docSheet->getPageSetup()->setColumnsToRepeatAtLeft([$matches[1], $matches[2]]); - } elseif (preg_match('/!?(\d+)\:(\d+)$/', $range, $matches)) { - // check for repeating rows, e.g. '1:1' or '1:5' - $docSheet->getPageSetup()->setRowsToRepeatAtTop([$matches[1], $matches[2]]); - } - } - - break; - case '_xlnm.Print_Area': - $rangeSets = preg_split("/('?(?:.*?)'?(?:![A-Z0-9]+:[A-Z0-9]+)),?/", $extractedRange, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); - $newRangeSets = []; - foreach ($rangeSets as $rangeSet) { - [$sheetName, $rangeSet] = Worksheet::extractSheetTitle($rangeSet, true); - if (strpos($rangeSet, ':') === false) { - $rangeSet = $rangeSet . ':' . $rangeSet; - } - $newRangeSets[] = str_replace('$', '', $rangeSet); - } - $docSheet->getPageSetup()->setPrintArea(implode(',', $newRangeSets)); - - break; - default: - break; - } - } - } - } - - // Next sheet id - ++$sheetId; - } - - // Loop through definedNames - if ($xmlWorkbook->definedNames) { - foreach ($xmlWorkbook->definedNames->definedName as $definedName) { - // Extract range - $extractedRange = (string) $definedName; - - // Valid range? - if (stripos((string) $definedName, '#REF!') !== false || $extractedRange == '') { - continue; - } - - // Some definedNames are only applicable if we are on the same sheet... - if ((string) $definedName['localSheetId'] != '') { - // Local defined name - // Switch on type - switch ((string) $definedName['name']) { - case '_xlnm._FilterDatabase': - case '_xlnm.Print_Titles': - case '_xlnm.Print_Area': - break; - default: - if ($mapSheetId[(int) $definedName['localSheetId']] !== null) { - $range = Worksheet::extractSheetTitle((string) $definedName, true); - $scope = $excel->getSheet($mapSheetId[(int) $definedName['localSheetId']]); - if (strpos((string) $definedName, '!') !== false) { - $range[0] = str_replace("''", "'", $range[0]); - $range[0] = str_replace("'", '', $range[0]); - if ($worksheet = $excel->getSheetByName($range[0])) { - $excel->addDefinedName(DefinedName::createInstance((string) $definedName['name'], $worksheet, $extractedRange, true, $scope)); - } else { - $excel->addDefinedName(DefinedName::createInstance((string) $definedName['name'], $scope, $extractedRange, true, $scope)); - } - } else { - $excel->addDefinedName(DefinedName::createInstance((string) $definedName['name'], $scope, $extractedRange, true)); - } - } - - break; - } - } elseif (!isset($definedName['localSheetId'])) { - $definedRange = (string) $definedName; - // "Global" definedNames - $locatedSheet = null; - if (strpos((string) $definedName, '!') !== false) { - // Modify range, and extract the first worksheet reference - // Need to split on a comma or a space if not in quotes, and extract the first part. - $definedNameValueParts = preg_split("/[ ,](?=([^']*'[^']*')*[^']*$)/miuU", $definedRange); - // Extract sheet name - [$extractedSheetName] = Worksheet::extractSheetTitle((string) $definedNameValueParts[0], true); - $extractedSheetName = trim($extractedSheetName, "'"); - - // Locate sheet - $locatedSheet = $excel->getSheetByName($extractedSheetName); - } - - $excel->addDefinedName(DefinedName::createInstance((string) $definedName['name'], $locatedSheet, $definedRange, false)); - } - } - } - } - - if ((!$this->readDataOnly || !empty($this->loadSheetsOnly)) && isset($xmlWorkbook->bookViews->workbookView)) { - $workbookView = $xmlWorkbook->bookViews->workbookView; - - // active sheet index - $activeTab = (int) ($workbookView['activeTab']); // refers to old sheet index - - // keep active sheet index if sheet is still loaded, else first sheet is set as the active - if (isset($mapSheetId[$activeTab]) && $mapSheetId[$activeTab] !== null) { - $excel->setActiveSheetIndex($mapSheetId[$activeTab]); - } else { - if ($excel->getSheetCount() == 0) { - $excel->createSheet(); - } - $excel->setActiveSheetIndex(0); - } - - if (isset($workbookView['showHorizontalScroll'])) { - $showHorizontalScroll = (string) $workbookView['showHorizontalScroll']; - $excel->setShowHorizontalScroll($this->castXsdBooleanToBool($showHorizontalScroll)); - } - - if (isset($workbookView['showVerticalScroll'])) { - $showVerticalScroll = (string) $workbookView['showVerticalScroll']; - $excel->setShowVerticalScroll($this->castXsdBooleanToBool($showVerticalScroll)); - } - - if (isset($workbookView['showSheetTabs'])) { - $showSheetTabs = (string) $workbookView['showSheetTabs']; - $excel->setShowSheetTabs($this->castXsdBooleanToBool($showSheetTabs)); - } - - if (isset($workbookView['minimized'])) { - $minimized = (string) $workbookView['minimized']; - $excel->setMinimized($this->castXsdBooleanToBool($minimized)); - } - - if (isset($workbookView['autoFilterDateGrouping'])) { - $autoFilterDateGrouping = (string) $workbookView['autoFilterDateGrouping']; - $excel->setAutoFilterDateGrouping($this->castXsdBooleanToBool($autoFilterDateGrouping)); - } - - if (isset($workbookView['firstSheet'])) { - $firstSheet = (string) $workbookView['firstSheet']; - $excel->setFirstSheetIndex((int) $firstSheet); - } - - if (isset($workbookView['visibility'])) { - $visibility = (string) $workbookView['visibility']; - $excel->setVisibility($visibility); - } - - if (isset($workbookView['tabRatio'])) { - $tabRatio = (string) $workbookView['tabRatio']; - $excel->setTabRatio((int) $tabRatio); - } - } - - break; - } - } - - if (!$this->readDataOnly) { - $contentTypes = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, '[Content_Types].xml') - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - - // Default content types - foreach ($contentTypes->Default as $contentType) { - switch ($contentType['ContentType']) { - case 'application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings': - $unparsedLoadedData['default_content_types'][(string) $contentType['Extension']] = (string) $contentType['ContentType']; - - break; - } - } - - // Override content types - foreach ($contentTypes->Override as $contentType) { - switch ($contentType['ContentType']) { - case 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml': - if ($this->includeCharts) { - $chartEntryRef = ltrim($contentType['PartName'], '/'); - $chartElements = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, $chartEntryRef) - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $objChart = Chart::readChart($chartElements, basename($chartEntryRef, '.xml')); - - if (isset($charts[$chartEntryRef])) { - $chartPositionRef = $charts[$chartEntryRef]['sheet'] . '!' . $charts[$chartEntryRef]['id']; - if (isset($chartDetails[$chartPositionRef])) { - $excel->getSheetByName($charts[$chartEntryRef]['sheet'])->addChart($objChart); - $objChart->setWorksheet($excel->getSheetByName($charts[$chartEntryRef]['sheet'])); - $objChart->setTopLeftPosition($chartDetails[$chartPositionRef]['fromCoordinate'], $chartDetails[$chartPositionRef]['fromOffsetX'], $chartDetails[$chartPositionRef]['fromOffsetY']); - $objChart->setBottomRightPosition($chartDetails[$chartPositionRef]['toCoordinate'], $chartDetails[$chartPositionRef]['toOffsetX'], $chartDetails[$chartPositionRef]['toOffsetY']); - } - } - } - - break; - - // unparsed - case 'application/vnd.ms-excel.controlproperties+xml': - $unparsedLoadedData['override_content_types'][(string) $contentType['PartName']] = (string) $contentType['ContentType']; - - break; - } - } - } - - $excel->setUnparsedLoadedData($unparsedLoadedData); - - $zip->close(); - - return $excel; - } - - private static function readColor($color, $background = false) - { - if (isset($color['rgb'])) { - return (string) $color['rgb']; - } elseif (isset($color['indexed'])) { - return Color::indexedColor($color['indexed'] - 7, $background)->getARGB(); - } elseif (isset($color['theme'])) { - if (self::$theme !== null) { - $returnColour = self::$theme->getColourByIndex((int) $color['theme']); - if (isset($color['tint'])) { - $tintAdjust = (float) $color['tint']; - $returnColour = Color::changeBrightness($returnColour, $tintAdjust); - } - - return 'FF' . $returnColour; - } - } - - if ($background) { - return 'FFFFFFFF'; - } - - return 'FF000000'; - } - - /** - * @param SimpleXMLElement|stdClass $style - */ - private static function readStyle(Style $docStyle, $style): void - { - $docStyle->getNumberFormat()->setFormatCode($style->numFmt); - - // font - if (isset($style->font)) { - $docStyle->getFont()->setName((string) $style->font->name['val']); - $docStyle->getFont()->setSize((string) $style->font->sz['val']); - if (isset($style->font->b)) { - $docStyle->getFont()->setBold(!isset($style->font->b['val']) || self::boolean((string) $style->font->b['val'])); - } - if (isset($style->font->i)) { - $docStyle->getFont()->setItalic(!isset($style->font->i['val']) || self::boolean((string) $style->font->i['val'])); - } - if (isset($style->font->strike)) { - $docStyle->getFont()->setStrikethrough(!isset($style->font->strike['val']) || self::boolean((string) $style->font->strike['val'])); - } - $docStyle->getFont()->getColor()->setARGB(self::readColor($style->font->color)); - - if (isset($style->font->u) && !isset($style->font->u['val'])) { - $docStyle->getFont()->setUnderline(\PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLE); - } elseif (isset($style->font->u, $style->font->u['val'])) { - $docStyle->getFont()->setUnderline((string) $style->font->u['val']); - } - - if (isset($style->font->vertAlign, $style->font->vertAlign['val'])) { - $vertAlign = strtolower((string) $style->font->vertAlign['val']); - if ($vertAlign == 'superscript') { - $docStyle->getFont()->setSuperscript(true); - } - if ($vertAlign == 'subscript') { - $docStyle->getFont()->setSubscript(true); - } - } - } - - // fill - if (isset($style->fill)) { - if ($style->fill->gradientFill) { - /** @var SimpleXMLElement $gradientFill */ - $gradientFill = $style->fill->gradientFill[0]; - if (!empty($gradientFill['type'])) { - $docStyle->getFill()->setFillType((string) $gradientFill['type']); - } - $docStyle->getFill()->setRotation((float) ($gradientFill['degree'])); - $gradientFill->registerXPathNamespace('sml', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); - $docStyle->getFill()->getStartColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath('sml:stop[@position=0]'))->color)); - $docStyle->getFill()->getEndColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath('sml:stop[@position=1]'))->color)); - } elseif ($style->fill->patternFill) { - $patternType = (string) $style->fill->patternFill['patternType'] != '' ? (string) $style->fill->patternFill['patternType'] : 'solid'; - $docStyle->getFill()->setFillType($patternType); - if ($style->fill->patternFill->fgColor) { - $docStyle->getFill()->getStartColor()->setARGB(self::readColor($style->fill->patternFill->fgColor, true)); - } - if ($style->fill->patternFill->bgColor) { - $docStyle->getFill()->getEndColor()->setARGB(self::readColor($style->fill->patternFill->bgColor, true)); - } - } - } - - // border - if (isset($style->border)) { - $diagonalUp = self::boolean((string) $style->border['diagonalUp']); - $diagonalDown = self::boolean((string) $style->border['diagonalDown']); - if (!$diagonalUp && !$diagonalDown) { - $docStyle->getBorders()->setDiagonalDirection(Borders::DIAGONAL_NONE); - } elseif ($diagonalUp && !$diagonalDown) { - $docStyle->getBorders()->setDiagonalDirection(Borders::DIAGONAL_UP); - } elseif (!$diagonalUp && $diagonalDown) { - $docStyle->getBorders()->setDiagonalDirection(Borders::DIAGONAL_DOWN); - } else { - $docStyle->getBorders()->setDiagonalDirection(Borders::DIAGONAL_BOTH); - } - self::readBorder($docStyle->getBorders()->getLeft(), $style->border->left); - self::readBorder($docStyle->getBorders()->getRight(), $style->border->right); - self::readBorder($docStyle->getBorders()->getTop(), $style->border->top); - self::readBorder($docStyle->getBorders()->getBottom(), $style->border->bottom); - self::readBorder($docStyle->getBorders()->getDiagonal(), $style->border->diagonal); - } - - // alignment - if (isset($style->alignment)) { - $docStyle->getAlignment()->setHorizontal((string) $style->alignment['horizontal']); - $docStyle->getAlignment()->setVertical((string) $style->alignment['vertical']); - - $textRotation = 0; - if ((int) $style->alignment['textRotation'] <= 90) { - $textRotation = (int) $style->alignment['textRotation']; - } elseif ((int) $style->alignment['textRotation'] > 90) { - $textRotation = 90 - (int) $style->alignment['textRotation']; - } - - $docStyle->getAlignment()->setTextRotation((int) $textRotation); - $docStyle->getAlignment()->setWrapText(self::boolean((string) $style->alignment['wrapText'])); - $docStyle->getAlignment()->setShrinkToFit(self::boolean((string) $style->alignment['shrinkToFit'])); - $docStyle->getAlignment()->setIndent((int) ((string) $style->alignment['indent']) > 0 ? (int) ((string) $style->alignment['indent']) : 0); - $docStyle->getAlignment()->setReadOrder((int) ((string) $style->alignment['readingOrder']) > 0 ? (int) ((string) $style->alignment['readingOrder']) : 0); - } - - // protection - if (isset($style->protection)) { - if (isset($style->protection['locked'])) { - if (self::boolean((string) $style->protection['locked'])) { - $docStyle->getProtection()->setLocked(Protection::PROTECTION_PROTECTED); - } else { - $docStyle->getProtection()->setLocked(Protection::PROTECTION_UNPROTECTED); - } - } - - if (isset($style->protection['hidden'])) { - if (self::boolean((string) $style->protection['hidden'])) { - $docStyle->getProtection()->setHidden(Protection::PROTECTION_PROTECTED); - } else { - $docStyle->getProtection()->setHidden(Protection::PROTECTION_UNPROTECTED); - } - } - } - - // top-level style settings - if (isset($style->quotePrefix)) { - $docStyle->setQuotePrefix($style->quotePrefix); - } - } - - /** - * @param SimpleXMLElement $eleBorder - */ - private static function readBorder(Border $docBorder, $eleBorder): void - { - if (isset($eleBorder['style'])) { - $docBorder->setBorderStyle((string) $eleBorder['style']); - } - if (isset($eleBorder->color)) { - $docBorder->getColor()->setARGB(self::readColor($eleBorder->color)); - } - } - - /** - * @param SimpleXMLElement | null $is - * - * @return RichText - */ - private function parseRichText($is) - { - $value = new RichText(); - - if (isset($is->t)) { - $value->createText(StringHelper::controlCharacterOOXML2PHP((string) $is->t)); - } else { - if (is_object($is->r)) { - foreach ($is->r as $run) { - if (!isset($run->rPr)) { - $value->createText(StringHelper::controlCharacterOOXML2PHP((string) $run->t)); - } else { - $objText = $value->createTextRun(StringHelper::controlCharacterOOXML2PHP((string) $run->t)); - - if (isset($run->rPr->rFont['val'])) { - $objText->getFont()->setName((string) $run->rPr->rFont['val']); - } - if (isset($run->rPr->sz['val'])) { - $objText->getFont()->setSize((float) $run->rPr->sz['val']); - } - if (isset($run->rPr->color)) { - $objText->getFont()->setColor(new Color(self::readColor($run->rPr->color))); - } - if ( - (isset($run->rPr->b['val']) && self::boolean((string) $run->rPr->b['val'])) || - (isset($run->rPr->b) && !isset($run->rPr->b['val'])) - ) { - $objText->getFont()->setBold(true); - } - if ( - (isset($run->rPr->i['val']) && self::boolean((string) $run->rPr->i['val'])) || - (isset($run->rPr->i) && !isset($run->rPr->i['val'])) - ) { - $objText->getFont()->setItalic(true); - } - if (isset($run->rPr->vertAlign, $run->rPr->vertAlign['val'])) { - $vertAlign = strtolower((string) $run->rPr->vertAlign['val']); - if ($vertAlign == 'superscript') { - $objText->getFont()->setSuperscript(true); - } - if ($vertAlign == 'subscript') { - $objText->getFont()->setSubscript(true); - } - } - if (isset($run->rPr->u) && !isset($run->rPr->u['val'])) { - $objText->getFont()->setUnderline(\PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLE); - } elseif (isset($run->rPr->u, $run->rPr->u['val'])) { - $objText->getFont()->setUnderline((string) $run->rPr->u['val']); - } - if ( - (isset($run->rPr->strike['val']) && self::boolean((string) $run->rPr->strike['val'])) || - (isset($run->rPr->strike) && !isset($run->rPr->strike['val'])) - ) { - $objText->getFont()->setStrikethrough(true); - } - } - } - } - } - - return $value; - } - - /** - * @param mixed $customUITarget - * @param mixed $zip - */ - private function readRibbon(Spreadsheet $excel, $customUITarget, $zip): void - { - $baseDir = dirname($customUITarget); - $nameCustomUI = basename($customUITarget); - // get the xml file (ribbon) - $localRibbon = $this->getFromZipArchive($zip, $customUITarget); - $customUIImagesNames = []; - $customUIImagesBinaries = []; - // something like customUI/_rels/customUI.xml.rels - $pathRels = $baseDir . '/_rels/' . $nameCustomUI . '.rels'; - $dataRels = $this->getFromZipArchive($zip, $pathRels); - if ($dataRels) { - // exists and not empty if the ribbon have some pictures (other than internal MSO) - $UIRels = simplexml_load_string( - $this->securityScanner->scan($dataRels), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - if (false !== $UIRels) { - // we need to save id and target to avoid parsing customUI.xml and "guess" if it's a pseudo callback who load the image - foreach ($UIRels->Relationship as $ele) { - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image') { - // an image ? - $customUIImagesNames[(string) $ele['Id']] = (string) $ele['Target']; - $customUIImagesBinaries[(string) $ele['Target']] = $this->getFromZipArchive($zip, $baseDir . '/' . (string) $ele['Target']); - } - } - } - } - if ($localRibbon) { - $excel->setRibbonXMLData($customUITarget, $localRibbon); - if (count($customUIImagesNames) > 0 && count($customUIImagesBinaries) > 0) { - $excel->setRibbonBinObjects($customUIImagesNames, $customUIImagesBinaries); - } else { - $excel->setRibbonBinObjects(null, null); - } - } else { - $excel->setRibbonXMLData(null, null); - $excel->setRibbonBinObjects(null, null); - } - } - - private static function getArrayItem($array, $key = 0) - { - return $array[$key] ?? null; - } - - private static function dirAdd($base, $add) - { - return preg_replace('~[^/]+/\.\./~', '', dirname($base) . "/$add"); - } - - private static function toCSSArray($style) - { - $style = self::stripWhiteSpaceFromStyleString($style); - - $temp = explode(';', $style); - $style = []; - foreach ($temp as $item) { - $item = explode(':', $item); - - if (strpos($item[1], 'px') !== false) { - $item[1] = str_replace('px', '', $item[1]); - } - if (strpos($item[1], 'pt') !== false) { - $item[1] = str_replace('pt', '', $item[1]); - $item[1] = Font::fontSizeToPixels($item[1]); - } - if (strpos($item[1], 'in') !== false) { - $item[1] = str_replace('in', '', $item[1]); - $item[1] = Font::inchSizeToPixels($item[1]); - } - if (strpos($item[1], 'cm') !== false) { - $item[1] = str_replace('cm', '', $item[1]); - $item[1] = Font::centimeterSizeToPixels($item[1]); - } - - $style[$item[0]] = $item[1]; - } - - return $style; - } - - public static function stripWhiteSpaceFromStyleString($string) - { - return trim(str_replace(["\r", "\n", ' '], '', $string), ';'); - } - - private static function boolean($value) - { - if (is_object($value)) { - $value = (string) $value; - } - if (is_numeric($value)) { - return (bool) $value; - } - - return $value === 'true' || $value === 'TRUE'; - } - - /** - * @param \PhpOffice\PhpSpreadsheet\Worksheet\Drawing $objDrawing - * @param SimpleXMLElement $cellAnchor - * @param array $hyperlinks - */ - private function readHyperLinkDrawing($objDrawing, $cellAnchor, $hyperlinks): void - { - $hlinkClick = $cellAnchor->pic->nvPicPr->cNvPr->children('http://schemas.openxmlformats.org/drawingml/2006/main')->hlinkClick; - - if ($hlinkClick->count() === 0) { - return; - } - - $hlinkId = (string) $hlinkClick->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships')['id']; - $hyperlink = new Hyperlink( - $hyperlinks[$hlinkId], - (string) self::getArrayItem($cellAnchor->pic->nvPicPr->cNvPr->attributes(), 'name') - ); - $objDrawing->setHyperlink($hyperlink); - } - - private function readProtection(Spreadsheet $excel, SimpleXMLElement $xmlWorkbook): void - { - if (!$xmlWorkbook->workbookProtection) { - return; - } - - if ($xmlWorkbook->workbookProtection['lockRevision']) { - $excel->getSecurity()->setLockRevision((bool) $xmlWorkbook->workbookProtection['lockRevision']); - } - - if ($xmlWorkbook->workbookProtection['lockStructure']) { - $excel->getSecurity()->setLockStructure((bool) $xmlWorkbook->workbookProtection['lockStructure']); - } - - if ($xmlWorkbook->workbookProtection['lockWindows']) { - $excel->getSecurity()->setLockWindows((bool) $xmlWorkbook->workbookProtection['lockWindows']); - } - - if ($xmlWorkbook->workbookProtection['revisionsPassword']) { - $excel->getSecurity()->setRevisionsPassword((string) $xmlWorkbook->workbookProtection['revisionsPassword'], true); - } - - if ($xmlWorkbook->workbookProtection['workbookPassword']) { - $excel->getSecurity()->setWorkbookPassword((string) $xmlWorkbook->workbookProtection['workbookPassword'], true); - } - } - - private function readFormControlProperties(Spreadsheet $excel, ZipArchive $zip, $dir, $fileWorksheet, $docSheet, array &$unparsedLoadedData): void - { - if (!$zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) { - return; - } - - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $relsWorksheet = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels') - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $ctrlProps = []; - foreach ($relsWorksheet->Relationship as $ele) { - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/ctrlProp') { - $ctrlProps[(string) $ele['Id']] = $ele; - } - } - - $unparsedCtrlProps = &$unparsedLoadedData['sheets'][$docSheet->getCodeName()]['ctrlProps']; - foreach ($ctrlProps as $rId => $ctrlProp) { - $rId = substr($rId, 3); // rIdXXX - $unparsedCtrlProps[$rId] = []; - $unparsedCtrlProps[$rId]['filePath'] = self::dirAdd("$dir/$fileWorksheet", $ctrlProp['Target']); - $unparsedCtrlProps[$rId]['relFilePath'] = (string) $ctrlProp['Target']; - $unparsedCtrlProps[$rId]['content'] = $this->securityScanner->scan($this->getFromZipArchive($zip, $unparsedCtrlProps[$rId]['filePath'])); - } - unset($unparsedCtrlProps); - } - - private function readPrinterSettings(Spreadsheet $excel, ZipArchive $zip, $dir, $fileWorksheet, $docSheet, array &$unparsedLoadedData): void - { - if (!$zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels')) { - return; - } - - //~ http://schemas.openxmlformats.org/package/2006/relationships" - $relsWorksheet = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels') - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - $sheetPrinterSettings = []; - foreach ($relsWorksheet->Relationship as $ele) { - if ($ele['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings') { - $sheetPrinterSettings[(string) $ele['Id']] = $ele; - } - } - - $unparsedPrinterSettings = &$unparsedLoadedData['sheets'][$docSheet->getCodeName()]['printerSettings']; - foreach ($sheetPrinterSettings as $rId => $printerSettings) { - $rId = substr($rId, 3); // rIdXXX - $unparsedPrinterSettings[$rId] = []; - $unparsedPrinterSettings[$rId]['filePath'] = self::dirAdd("$dir/$fileWorksheet", $printerSettings['Target']); - $unparsedPrinterSettings[$rId]['relFilePath'] = (string) $printerSettings['Target']; - $unparsedPrinterSettings[$rId]['content'] = $this->securityScanner->scan($this->getFromZipArchive($zip, $unparsedPrinterSettings[$rId]['filePath'])); - } - unset($unparsedPrinterSettings); - } - - /** - * Convert an 'xsd:boolean' XML value to a PHP boolean value. - * A valid 'xsd:boolean' XML value can be one of the following - * four values: 'true', 'false', '1', '0'. It is case sensitive. - * - * Note that just doing '(bool) $xsdBoolean' is not safe, - * since '(bool) "false"' returns true. - * - * @see https://www.w3.org/TR/xmlschema11-2/#boolean - * - * @param string $xsdBoolean An XML string value of type 'xsd:boolean' - * - * @return bool Boolean value - */ - private function castXsdBooleanToBool($xsdBoolean) - { - if ($xsdBoolean === 'false') { - return false; - } - - return (bool) $xsdBoolean; - } - - /** - * @param ZipArchive $zip Opened zip archive - * - * @return string basename of the used excel workbook - */ - private function getWorkbookBaseName(ZipArchive $zip) - { - $workbookBasename = ''; - - // check if it is an OOXML archive - $rels = simplexml_load_string( - $this->securityScanner->scan( - $this->getFromZipArchive($zip, '_rels/.rels') - ), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - if ($rels !== false) { - foreach ($rels->Relationship as $rel) { - switch ($rel['Type']) { - case 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument': - $basename = basename($rel['Target']); - if (preg_match('/workbook.*\.xml/', $basename)) { - $workbookBasename = $basename; - } - - break; - } - } - } - - return $workbookBasename; - } - - private function readSheetProtection(Worksheet $docSheet, SimpleXMLElement $xmlSheet): void - { - if ($this->readDataOnly || !$xmlSheet->sheetProtection) { - return; - } - - $algorithmName = (string) $xmlSheet->sheetProtection['algorithmName']; - $protection = $docSheet->getProtection(); - $protection->setAlgorithm($algorithmName); - - if ($algorithmName) { - $protection->setPassword((string) $xmlSheet->sheetProtection['hashValue'], true); - $protection->setSalt((string) $xmlSheet->sheetProtection['saltValue']); - $protection->setSpinCount((int) $xmlSheet->sheetProtection['spinCount']); - } else { - $protection->setPassword((string) $xmlSheet->sheetProtection['password'], true); - } - - if ($xmlSheet->protectedRanges->protectedRange) { - foreach ($xmlSheet->protectedRanges->protectedRange as $protectedRange) { - $docSheet->protectCells((string) $protectedRange['sqref'], (string) $protectedRange['password'], true); - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php deleted file mode 100644 index f52bfd4..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php +++ /dev/null @@ -1,146 +0,0 @@ -worksheet = $workSheet; - $this->worksheetXml = $worksheetXml; - } - - public function load(): void - { - // Remove all "$" in the auto filter range - $autoFilterRange = preg_replace('/\$/', '', $this->worksheetXml->autoFilter['ref']); - if (strpos($autoFilterRange, ':') !== false) { - $this->readAutoFilter($autoFilterRange, $this->worksheetXml); - } - } - - private function readAutoFilter($autoFilterRange, $xmlSheet): void - { - $autoFilter = $this->worksheet->getAutoFilter(); - $autoFilter->setRange($autoFilterRange); - - foreach ($xmlSheet->autoFilter->filterColumn as $filterColumn) { - $column = $autoFilter->getColumnByOffset((int) $filterColumn['colId']); - // Check for standard filters - if ($filterColumn->filters) { - $column->setFilterType(Column::AUTOFILTER_FILTERTYPE_FILTER); - $filters = $filterColumn->filters; - if ((isset($filters['blank'])) && ($filters['blank'] == 1)) { - // Operator is undefined, but always treated as EQUAL - $column->createRule()->setRule(null, '')->setRuleType(Rule::AUTOFILTER_RULETYPE_FILTER); - } - // Standard filters are always an OR join, so no join rule needs to be set - // Entries can be either filter elements - foreach ($filters->filter as $filterRule) { - // Operator is undefined, but always treated as EQUAL - $column->createRule()->setRule(null, (string) $filterRule['val'])->setRuleType(Rule::AUTOFILTER_RULETYPE_FILTER); - } - - // Or Date Group elements - $this->readDateRangeAutoFilter($filters, $column); - } - - // Check for custom filters - $this->readCustomAutoFilter($filterColumn, $column); - // Check for dynamic filters - $this->readDynamicAutoFilter($filterColumn, $column); - // Check for dynamic filters - $this->readTopTenAutoFilter($filterColumn, $column); - } - } - - private function readDateRangeAutoFilter(SimpleXMLElement $filters, Column $column): void - { - foreach ($filters->dateGroupItem as $dateGroupItem) { - // Operator is undefined, but always treated as EQUAL - $column->createRule()->setRule( - null, - [ - 'year' => (string) $dateGroupItem['year'], - 'month' => (string) $dateGroupItem['month'], - 'day' => (string) $dateGroupItem['day'], - 'hour' => (string) $dateGroupItem['hour'], - 'minute' => (string) $dateGroupItem['minute'], - 'second' => (string) $dateGroupItem['second'], - ], - (string) $dateGroupItem['dateTimeGrouping'] - )->setRuleType(Rule::AUTOFILTER_RULETYPE_DATEGROUP); - } - } - - private function readCustomAutoFilter(SimpleXMLElement $filterColumn, Column $column): void - { - if ($filterColumn->customFilters) { - $column->setFilterType(Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER); - $customFilters = $filterColumn->customFilters; - // Custom filters can an AND or an OR join; - // and there should only ever be one or two entries - if ((isset($customFilters['and'])) && ($customFilters['and'] == 1)) { - $column->setJoin(Column::AUTOFILTER_COLUMN_JOIN_AND); - } - foreach ($customFilters->customFilter as $filterRule) { - $column->createRule()->setRule( - (string) $filterRule['operator'], - (string) $filterRule['val'] - )->setRuleType(Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER); - } - } - } - - private function readDynamicAutoFilter(SimpleXMLElement $filterColumn, Column $column): void - { - if ($filterColumn->dynamicFilter) { - $column->setFilterType(Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER); - // We should only ever have one dynamic filter - foreach ($filterColumn->dynamicFilter as $filterRule) { - // Operator is undefined, but always treated as EQUAL - $column->createRule()->setRule( - null, - (string) $filterRule['val'], - (string) $filterRule['type'] - )->setRuleType(Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER); - if (isset($filterRule['val'])) { - $column->setAttribute('val', (string) $filterRule['val']); - } - if (isset($filterRule['maxVal'])) { - $column->setAttribute('maxVal', (string) $filterRule['maxVal']); - } - } - } - } - - private function readTopTenAutoFilter(SimpleXMLElement $filterColumn, Column $column): void - { - if ($filterColumn->top10) { - $column->setFilterType(Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER); - // We should only ever have one top10 filter - foreach ($filterColumn->top10 as $filterRule) { - $column->createRule()->setRule( - (((isset($filterRule['percent'])) && ($filterRule['percent'] == 1)) - ? Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT - : Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE - ), - (string) $filterRule['val'], - (((isset($filterRule['top'])) && ($filterRule['top'] == 1)) - ? Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP - : Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM - ) - )->setRuleType(Rule::AUTOFILTER_RULETYPE_TOPTENFILTER); - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php deleted file mode 100644 index 1679f01..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php +++ /dev/null @@ -1,19 +0,0 @@ -attributes(); - if (isset($attributes[$name])) { - if ($format == 'string') { - return (string) $attributes[$name]; - } elseif ($format == 'integer') { - return (int) $attributes[$name]; - } elseif ($format == 'boolean') { - return (bool) ($attributes[$name] === '0' || $attributes[$name] !== 'true') ? false : true; - } - - return (float) $attributes[$name]; - } - - return null; - } - - private static function readColor($color, $background = false) - { - if (isset($color['rgb'])) { - return (string) $color['rgb']; - } elseif (isset($color['indexed'])) { - return Color::indexedColor($color['indexed'] - 7, $background)->getARGB(); - } - } - - /** - * @param string $chartName - * - * @return \PhpOffice\PhpSpreadsheet\Chart\Chart - */ - public static function readChart(SimpleXMLElement $chartElements, $chartName) - { - $namespacesChartMeta = $chartElements->getNamespaces(true); - $chartElementsC = $chartElements->children($namespacesChartMeta['c']); - - $XaxisLabel = $YaxisLabel = $legend = $title = null; - $dispBlanksAs = $plotVisOnly = null; - - foreach ($chartElementsC as $chartElementKey => $chartElement) { - switch ($chartElementKey) { - case 'chart': - foreach ($chartElement as $chartDetailsKey => $chartDetails) { - $chartDetailsC = $chartDetails->children($namespacesChartMeta['c']); - switch ($chartDetailsKey) { - case 'plotArea': - $plotAreaLayout = $XaxisLable = $YaxisLable = null; - $plotSeries = $plotAttributes = []; - foreach ($chartDetails as $chartDetailKey => $chartDetail) { - switch ($chartDetailKey) { - case 'layout': - $plotAreaLayout = self::chartLayoutDetails($chartDetail, $namespacesChartMeta); - - break; - case 'catAx': - if (isset($chartDetail->title)) { - $XaxisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta); - } - - break; - case 'dateAx': - if (isset($chartDetail->title)) { - $XaxisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta); - } - - break; - case 'valAx': - if (isset($chartDetail->title)) { - $YaxisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta); - } - - break; - case 'barChart': - case 'bar3DChart': - $barDirection = self::getAttribute($chartDetail->barDir, 'val', 'string'); - $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); - $plotSer->setPlotDirection($barDirection); - $plotSeries[] = $plotSer; - $plotAttributes = self::readChartAttributes($chartDetail); - - break; - case 'lineChart': - case 'line3DChart': - $plotSeries[] = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); - $plotAttributes = self::readChartAttributes($chartDetail); - - break; - case 'areaChart': - case 'area3DChart': - $plotSeries[] = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); - $plotAttributes = self::readChartAttributes($chartDetail); - - break; - case 'doughnutChart': - case 'pieChart': - case 'pie3DChart': - $explosion = isset($chartDetail->ser->explosion); - $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); - $plotSer->setPlotStyle($explosion); - $plotSeries[] = $plotSer; - $plotAttributes = self::readChartAttributes($chartDetail); - - break; - case 'scatterChart': - $scatterStyle = self::getAttribute($chartDetail->scatterStyle, 'val', 'string'); - $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); - $plotSer->setPlotStyle($scatterStyle); - $plotSeries[] = $plotSer; - $plotAttributes = self::readChartAttributes($chartDetail); - - break; - case 'bubbleChart': - $bubbleScale = self::getAttribute($chartDetail->bubbleScale, 'val', 'integer'); - $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); - $plotSer->setPlotStyle($bubbleScale); - $plotSeries[] = $plotSer; - $plotAttributes = self::readChartAttributes($chartDetail); - - break; - case 'radarChart': - $radarStyle = self::getAttribute($chartDetail->radarStyle, 'val', 'string'); - $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); - $plotSer->setPlotStyle($radarStyle); - $plotSeries[] = $plotSer; - $plotAttributes = self::readChartAttributes($chartDetail); - - break; - case 'surfaceChart': - case 'surface3DChart': - $wireFrame = self::getAttribute($chartDetail->wireframe, 'val', 'boolean'); - $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); - $plotSer->setPlotStyle($wireFrame); - $plotSeries[] = $plotSer; - $plotAttributes = self::readChartAttributes($chartDetail); - - break; - case 'stockChart': - $plotSeries[] = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); - $plotAttributes = self::readChartAttributes($plotAreaLayout); - - break; - } - } - if ($plotAreaLayout == null) { - $plotAreaLayout = new Layout(); - } - $plotArea = new PlotArea($plotAreaLayout, $plotSeries); - self::setChartAttributes($plotAreaLayout, $plotAttributes); - - break; - case 'plotVisOnly': - $plotVisOnly = self::getAttribute($chartDetails, 'val', 'string'); - - break; - case 'dispBlanksAs': - $dispBlanksAs = self::getAttribute($chartDetails, 'val', 'string'); - - break; - case 'title': - $title = self::chartTitle($chartDetails, $namespacesChartMeta); - - break; - case 'legend': - $legendPos = 'r'; - $legendLayout = null; - $legendOverlay = false; - foreach ($chartDetails as $chartDetailKey => $chartDetail) { - switch ($chartDetailKey) { - case 'legendPos': - $legendPos = self::getAttribute($chartDetail, 'val', 'string'); - - break; - case 'overlay': - $legendOverlay = self::getAttribute($chartDetail, 'val', 'boolean'); - - break; - case 'layout': - $legendLayout = self::chartLayoutDetails($chartDetail, $namespacesChartMeta); - - break; - } - } - $legend = new Legend($legendPos, $legendLayout, $legendOverlay); - - break; - } - } - } - } - $chart = new \PhpOffice\PhpSpreadsheet\Chart\Chart($chartName, $title, $legend, $plotArea, $plotVisOnly, $dispBlanksAs, $XaxisLabel, $YaxisLabel); - - return $chart; - } - - private static function chartTitle(SimpleXMLElement $titleDetails, array $namespacesChartMeta) - { - $caption = []; - $titleLayout = null; - foreach ($titleDetails as $titleDetailKey => $chartDetail) { - switch ($titleDetailKey) { - case 'tx': - $titleDetails = $chartDetail->rich->children($namespacesChartMeta['a']); - foreach ($titleDetails as $titleKey => $titleDetail) { - switch ($titleKey) { - case 'p': - $titleDetailPart = $titleDetail->children($namespacesChartMeta['a']); - $caption[] = self::parseRichText($titleDetailPart); - } - } - - break; - case 'layout': - $titleLayout = self::chartLayoutDetails($chartDetail, $namespacesChartMeta); - - break; - } - } - - return new Title($caption, $titleLayout); - } - - private static function chartLayoutDetails($chartDetail, $namespacesChartMeta) - { - if (!isset($chartDetail->manualLayout)) { - return null; - } - $details = $chartDetail->manualLayout->children($namespacesChartMeta['c']); - if ($details === null) { - return null; - } - $layout = []; - foreach ($details as $detailKey => $detail) { - $layout[$detailKey] = self::getAttribute($detail, 'val', 'string'); - } - - return new Layout($layout); - } - - private static function chartDataSeries($chartDetail, $namespacesChartMeta, $plotType) - { - $multiSeriesType = null; - $smoothLine = false; - $seriesLabel = $seriesCategory = $seriesValues = $plotOrder = []; - - $seriesDetailSet = $chartDetail->children($namespacesChartMeta['c']); - foreach ($seriesDetailSet as $seriesDetailKey => $seriesDetails) { - switch ($seriesDetailKey) { - case 'grouping': - $multiSeriesType = self::getAttribute($chartDetail->grouping, 'val', 'string'); - - break; - case 'ser': - $marker = null; - $seriesIndex = ''; - foreach ($seriesDetails as $seriesKey => $seriesDetail) { - switch ($seriesKey) { - case 'idx': - $seriesIndex = self::getAttribute($seriesDetail, 'val', 'integer'); - - break; - case 'order': - $seriesOrder = self::getAttribute($seriesDetail, 'val', 'integer'); - $plotOrder[$seriesIndex] = $seriesOrder; - - break; - case 'tx': - $seriesLabel[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta); - - break; - case 'marker': - $marker = self::getAttribute($seriesDetail->symbol, 'val', 'string'); - - break; - case 'smooth': - $smoothLine = self::getAttribute($seriesDetail, 'val', 'boolean'); - - break; - case 'cat': - $seriesCategory[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta); - - break; - case 'val': - $seriesValues[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker); - - break; - case 'xVal': - $seriesCategory[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker); - - break; - case 'yVal': - $seriesValues[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker); - - break; - } - } - } - } - - return new DataSeries($plotType, $multiSeriesType, $plotOrder, $seriesLabel, $seriesCategory, $seriesValues, $smoothLine); - } - - private static function chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker = null) - { - if (isset($seriesDetail->strRef)) { - $seriesSource = (string) $seriesDetail->strRef->f; - $seriesData = self::chartDataSeriesValues($seriesDetail->strRef->strCache->children($namespacesChartMeta['c']), 's'); - - return new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker); - } elseif (isset($seriesDetail->numRef)) { - $seriesSource = (string) $seriesDetail->numRef->f; - $seriesData = self::chartDataSeriesValues($seriesDetail->numRef->numCache->children($namespacesChartMeta['c'])); - - return new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_NUMBER, $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker); - } elseif (isset($seriesDetail->multiLvlStrRef)) { - $seriesSource = (string) $seriesDetail->multiLvlStrRef->f; - $seriesData = self::chartDataSeriesValuesMultiLevel($seriesDetail->multiLvlStrRef->multiLvlStrCache->children($namespacesChartMeta['c']), 's'); - $seriesData['pointCount'] = count($seriesData['dataValues']); - - return new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker); - } elseif (isset($seriesDetail->multiLvlNumRef)) { - $seriesSource = (string) $seriesDetail->multiLvlNumRef->f; - $seriesData = self::chartDataSeriesValuesMultiLevel($seriesDetail->multiLvlNumRef->multiLvlNumCache->children($namespacesChartMeta['c']), 's'); - $seriesData['pointCount'] = count($seriesData['dataValues']); - - return new DataSeriesValues(DataSeriesValues::DATASERIES_TYPE_STRING, $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker); - } - - return null; - } - - private static function chartDataSeriesValues($seriesValueSet, $dataType = 'n') - { - $seriesVal = []; - $formatCode = ''; - $pointCount = 0; - - foreach ($seriesValueSet as $seriesValueIdx => $seriesValue) { - switch ($seriesValueIdx) { - case 'ptCount': - $pointCount = self::getAttribute($seriesValue, 'val', 'integer'); - - break; - case 'formatCode': - $formatCode = (string) $seriesValue; - - break; - case 'pt': - $pointVal = self::getAttribute($seriesValue, 'idx', 'integer'); - if ($dataType == 's') { - $seriesVal[$pointVal] = (string) $seriesValue->v; - } elseif ($seriesValue->v === Functions::NA()) { - $seriesVal[$pointVal] = null; - } else { - $seriesVal[$pointVal] = (float) $seriesValue->v; - } - - break; - } - } - - return [ - 'formatCode' => $formatCode, - 'pointCount' => $pointCount, - 'dataValues' => $seriesVal, - ]; - } - - private static function chartDataSeriesValuesMultiLevel($seriesValueSet, $dataType = 'n') - { - $seriesVal = []; - $formatCode = ''; - $pointCount = 0; - - foreach ($seriesValueSet->lvl as $seriesLevelIdx => $seriesLevel) { - foreach ($seriesLevel as $seriesValueIdx => $seriesValue) { - switch ($seriesValueIdx) { - case 'ptCount': - $pointCount = self::getAttribute($seriesValue, 'val', 'integer'); - - break; - case 'formatCode': - $formatCode = (string) $seriesValue; - - break; - case 'pt': - $pointVal = self::getAttribute($seriesValue, 'idx', 'integer'); - if ($dataType == 's') { - $seriesVal[$pointVal][] = (string) $seriesValue->v; - } elseif ($seriesValue->v === Functions::NA()) { - $seriesVal[$pointVal] = null; - } else { - $seriesVal[$pointVal][] = (float) $seriesValue->v; - } - - break; - } - } - } - - return [ - 'formatCode' => $formatCode, - 'pointCount' => $pointCount, - 'dataValues' => $seriesVal, - ]; - } - - private static function parseRichText(SimpleXMLElement $titleDetailPart) - { - $value = new RichText(); - $objText = null; - foreach ($titleDetailPart as $titleDetailElementKey => $titleDetailElement) { - if (isset($titleDetailElement->t)) { - $objText = $value->createTextRun((string) $titleDetailElement->t); - } - if (isset($titleDetailElement->rPr)) { - if (isset($titleDetailElement->rPr->rFont['val'])) { - $objText->getFont()->setName((string) $titleDetailElement->rPr->rFont['val']); - } - - $fontSize = (self::getAttribute($titleDetailElement->rPr, 'sz', 'integer')); - if ($fontSize !== null) { - $objText->getFont()->setSize(floor($fontSize / 100)); - } - - $fontColor = (self::getAttribute($titleDetailElement->rPr, 'color', 'string')); - if ($fontColor !== null) { - $objText->getFont()->setColor(new Color(self::readColor($fontColor))); - } - - $bold = self::getAttribute($titleDetailElement->rPr, 'b', 'boolean'); - if ($bold !== null) { - $objText->getFont()->setBold($bold); - } - - $italic = self::getAttribute($titleDetailElement->rPr, 'i', 'boolean'); - if ($italic !== null) { - $objText->getFont()->setItalic($italic); - } - - $baseline = self::getAttribute($titleDetailElement->rPr, 'baseline', 'integer'); - if ($baseline !== null) { - if ($baseline > 0) { - $objText->getFont()->setSuperscript(true); - } elseif ($baseline < 0) { - $objText->getFont()->setSubscript(true); - } - } - - $underscore = (self::getAttribute($titleDetailElement->rPr, 'u', 'string')); - if ($underscore !== null) { - if ($underscore == 'sng') { - $objText->getFont()->setUnderline(Font::UNDERLINE_SINGLE); - } elseif ($underscore == 'dbl') { - $objText->getFont()->setUnderline(Font::UNDERLINE_DOUBLE); - } else { - $objText->getFont()->setUnderline(Font::UNDERLINE_NONE); - } - } - - $strikethrough = (self::getAttribute($titleDetailElement->rPr, 's', 'string')); - if ($strikethrough !== null) { - if ($strikethrough == 'noStrike') { - $objText->getFont()->setStrikethrough(false); - } else { - $objText->getFont()->setStrikethrough(true); - } - } - } - } - - return $value; - } - - private static function readChartAttributes($chartDetail) - { - $plotAttributes = []; - if (isset($chartDetail->dLbls)) { - if (isset($chartDetail->dLbls->howLegendKey)) { - $plotAttributes['showLegendKey'] = self::getAttribute($chartDetail->dLbls->showLegendKey, 'val', 'string'); - } - if (isset($chartDetail->dLbls->showVal)) { - $plotAttributes['showVal'] = self::getAttribute($chartDetail->dLbls->showVal, 'val', 'string'); - } - if (isset($chartDetail->dLbls->showCatName)) { - $plotAttributes['showCatName'] = self::getAttribute($chartDetail->dLbls->showCatName, 'val', 'string'); - } - if (isset($chartDetail->dLbls->showSerName)) { - $plotAttributes['showSerName'] = self::getAttribute($chartDetail->dLbls->showSerName, 'val', 'string'); - } - if (isset($chartDetail->dLbls->showPercent)) { - $plotAttributes['showPercent'] = self::getAttribute($chartDetail->dLbls->showPercent, 'val', 'string'); - } - if (isset($chartDetail->dLbls->showBubbleSize)) { - $plotAttributes['showBubbleSize'] = self::getAttribute($chartDetail->dLbls->showBubbleSize, 'val', 'string'); - } - if (isset($chartDetail->dLbls->showLeaderLines)) { - $plotAttributes['showLeaderLines'] = self::getAttribute($chartDetail->dLbls->showLeaderLines, 'val', 'string'); - } - } - - return $plotAttributes; - } - - /** - * @param mixed $plotAttributes - */ - private static function setChartAttributes(Layout $plotArea, $plotAttributes): void - { - foreach ($plotAttributes as $plotAttributeKey => $plotAttributeValue) { - switch ($plotAttributeKey) { - case 'showLegendKey': - $plotArea->setShowLegendKey($plotAttributeValue); - - break; - case 'showVal': - $plotArea->setShowVal($plotAttributeValue); - - break; - case 'showCatName': - $plotArea->setShowCatName($plotAttributeValue); - - break; - case 'showSerName': - $plotArea->setShowSerName($plotAttributeValue); - - break; - case 'showPercent': - $plotArea->setShowPercent($plotAttributeValue); - - break; - case 'showBubbleSize': - $plotArea->setShowBubbleSize($plotAttributeValue); - - break; - case 'showLeaderLines': - $plotArea->setShowLeaderLines($plotAttributeValue); - - break; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php deleted file mode 100644 index 4134b2f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php +++ /dev/null @@ -1,209 +0,0 @@ -worksheet = $workSheet; - $this->worksheetXml = $worksheetXml; - } - - /** - * Set Worksheet column attributes by attributes array passed. - * - * @param string $columnAddress A, B, ... DX, ... - * @param array $columnAttributes array of attributes (indexes are attribute name, values are value) - * 'xfIndex', 'visible', 'collapsed', 'outlineLevel', 'width', ... ? - */ - private function setColumnAttributes($columnAddress, array $columnAttributes): void - { - if (isset($columnAttributes['xfIndex'])) { - $this->worksheet->getColumnDimension($columnAddress)->setXfIndex($columnAttributes['xfIndex']); - } - if (isset($columnAttributes['visible'])) { - $this->worksheet->getColumnDimension($columnAddress)->setVisible($columnAttributes['visible']); - } - if (isset($columnAttributes['collapsed'])) { - $this->worksheet->getColumnDimension($columnAddress)->setCollapsed($columnAttributes['collapsed']); - } - if (isset($columnAttributes['outlineLevel'])) { - $this->worksheet->getColumnDimension($columnAddress)->setOutlineLevel($columnAttributes['outlineLevel']); - } - if (isset($columnAttributes['width'])) { - $this->worksheet->getColumnDimension($columnAddress)->setWidth($columnAttributes['width']); - } - } - - /** - * Set Worksheet row attributes by attributes array passed. - * - * @param int $rowNumber 1, 2, 3, ... 99, ... - * @param array $rowAttributes array of attributes (indexes are attribute name, values are value) - * 'xfIndex', 'visible', 'collapsed', 'outlineLevel', 'rowHeight', ... ? - */ - private function setRowAttributes($rowNumber, array $rowAttributes): void - { - if (isset($rowAttributes['xfIndex'])) { - $this->worksheet->getRowDimension($rowNumber)->setXfIndex($rowAttributes['xfIndex']); - } - if (isset($rowAttributes['visible'])) { - $this->worksheet->getRowDimension($rowNumber)->setVisible($rowAttributes['visible']); - } - if (isset($rowAttributes['collapsed'])) { - $this->worksheet->getRowDimension($rowNumber)->setCollapsed($rowAttributes['collapsed']); - } - if (isset($rowAttributes['outlineLevel'])) { - $this->worksheet->getRowDimension($rowNumber)->setOutlineLevel($rowAttributes['outlineLevel']); - } - if (isset($rowAttributes['rowHeight'])) { - $this->worksheet->getRowDimension($rowNumber)->setRowHeight($rowAttributes['rowHeight']); - } - } - - /** - * @param IReadFilter $readFilter - * @param bool $readDataOnly - */ - public function load(?IReadFilter $readFilter = null, $readDataOnly = false): void - { - if ($this->worksheetXml === null) { - return; - } - - $columnsAttributes = []; - $rowsAttributes = []; - if (isset($this->worksheetXml->cols)) { - $columnsAttributes = $this->readColumnAttributes($this->worksheetXml->cols, $readDataOnly); - } - - if ($this->worksheetXml->sheetData && $this->worksheetXml->sheetData->row) { - $rowsAttributes = $this->readRowAttributes($this->worksheetXml->sheetData->row, $readDataOnly); - } - - // set columns/rows attributes - $columnsAttributesAreSet = []; - foreach ($columnsAttributes as $columnCoordinate => $columnAttributes) { - if ( - $readFilter === null || - !$this->isFilteredColumn($readFilter, $columnCoordinate, $rowsAttributes) - ) { - if (!isset($columnsAttributesAreSet[$columnCoordinate])) { - $this->setColumnAttributes($columnCoordinate, $columnAttributes); - $columnsAttributesAreSet[$columnCoordinate] = true; - } - } - } - - $rowsAttributesAreSet = []; - foreach ($rowsAttributes as $rowCoordinate => $rowAttributes) { - if ( - $readFilter === null || - !$this->isFilteredRow($readFilter, $rowCoordinate, $columnsAttributes) - ) { - if (!isset($rowsAttributesAreSet[$rowCoordinate])) { - $this->setRowAttributes($rowCoordinate, $rowAttributes); - $rowsAttributesAreSet[$rowCoordinate] = true; - } - } - } - } - - private function isFilteredColumn(IReadFilter $readFilter, $columnCoordinate, array $rowsAttributes) - { - foreach ($rowsAttributes as $rowCoordinate => $rowAttributes) { - if (!$readFilter->readCell($columnCoordinate, $rowCoordinate, $this->worksheet->getTitle())) { - return true; - } - } - - return false; - } - - private function readColumnAttributes(SimpleXMLElement $worksheetCols, $readDataOnly) - { - $columnAttributes = []; - - foreach ($worksheetCols->col as $column) { - $startColumn = Coordinate::stringFromColumnIndex((int) $column['min']); - $endColumn = Coordinate::stringFromColumnIndex((int) $column['max']); - ++$endColumn; - for ($columnAddress = $startColumn; $columnAddress !== $endColumn; ++$columnAddress) { - $columnAttributes[$columnAddress] = $this->readColumnRangeAttributes($column, $readDataOnly); - - if ((int) ($column['max']) == 16384) { - break; - } - } - } - - return $columnAttributes; - } - - private function readColumnRangeAttributes(SimpleXMLElement $column, $readDataOnly) - { - $columnAttributes = []; - - if ($column['style'] && !$readDataOnly) { - $columnAttributes['xfIndex'] = (int) $column['style']; - } - if (self::boolean($column['hidden'])) { - $columnAttributes['visible'] = false; - } - if (self::boolean($column['collapsed'])) { - $columnAttributes['collapsed'] = true; - } - if (((int) $column['outlineLevel']) > 0) { - $columnAttributes['outlineLevel'] = (int) $column['outlineLevel']; - } - $columnAttributes['width'] = (float) $column['width']; - - return $columnAttributes; - } - - private function isFilteredRow(IReadFilter $readFilter, $rowCoordinate, array $columnsAttributes) - { - foreach ($columnsAttributes as $columnCoordinate => $columnAttributes) { - if (!$readFilter->readCell($columnCoordinate, $rowCoordinate, $this->worksheet->getTitle())) { - return true; - } - } - - return false; - } - - private function readRowAttributes(SimpleXMLElement $worksheetRow, $readDataOnly) - { - $rowAttributes = []; - - foreach ($worksheetRow as $row) { - if ($row['ht'] && !$readDataOnly) { - $rowAttributes[(int) $row['r']]['rowHeight'] = (float) $row['ht']; - } - if (self::boolean($row['hidden'])) { - $rowAttributes[(int) $row['r']]['visible'] = false; - } - if (self::boolean($row['collapsed'])) { - $rowAttributes[(int) $row['r']]['collapsed'] = true; - } - if ((int) $row['outlineLevel'] > 0) { - $rowAttributes[(int) $row['r']]['outlineLevel'] = (int) $row['outlineLevel']; - } - if ($row['s'] && !$readDataOnly) { - $rowAttributes[(int) $row['r']]['xfIndex'] = (int) $row['s']; - } - } - - return $rowAttributes; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php deleted file mode 100644 index 4aa48e1..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php +++ /dev/null @@ -1,97 +0,0 @@ -worksheet = $workSheet; - $this->worksheetXml = $worksheetXml; - $this->dxfs = $dxfs; - } - - public function load(): void - { - $this->setConditionalStyles( - $this->worksheet, - $this->readConditionalStyles($this->worksheetXml) - ); - } - - private function readConditionalStyles($xmlSheet) - { - $conditionals = []; - foreach ($xmlSheet->conditionalFormatting as $conditional) { - foreach ($conditional->cfRule as $cfRule) { - if ( - ((string) $cfRule['type'] == Conditional::CONDITION_NONE - || (string) $cfRule['type'] == Conditional::CONDITION_CELLIS - || (string) $cfRule['type'] == Conditional::CONDITION_CONTAINSTEXT - || (string) $cfRule['type'] == Conditional::CONDITION_CONTAINSBLANKS - || (string) $cfRule['type'] == Conditional::CONDITION_NOTCONTAINSBLANKS - || (string) $cfRule['type'] == Conditional::CONDITION_EXPRESSION) - && isset($this->dxfs[(int) ($cfRule['dxfId'])]) - ) { - $conditionals[(string) $conditional['sqref']][(int) ($cfRule['priority'])] = $cfRule; - } - } - } - - return $conditionals; - } - - private function setConditionalStyles(Worksheet $worksheet, array $conditionals): void - { - foreach ($conditionals as $ref => $cfRules) { - ksort($cfRules); - $conditionalStyles = $this->readStyleRules($cfRules); - - // Extract all cell references in $ref - $cellBlocks = explode(' ', str_replace('$', '', strtoupper($ref))); - foreach ($cellBlocks as $cellBlock) { - $worksheet->getStyle($cellBlock)->setConditionalStyles($conditionalStyles); - } - } - } - - private function readStyleRules($cfRules) - { - $conditionalStyles = []; - foreach ($cfRules as $cfRule) { - $objConditional = new Conditional(); - $objConditional->setConditionType((string) $cfRule['type']); - $objConditional->setOperatorType((string) $cfRule['operator']); - - if ((string) $cfRule['text'] != '') { - $objConditional->setText((string) $cfRule['text']); - } - - if (isset($cfRule['stopIfTrue']) && (int) $cfRule['stopIfTrue'] === 1) { - $objConditional->setStopIfTrue(true); - } - - if (count($cfRule->formula) > 1) { - foreach ($cfRule->formula as $formula) { - $objConditional->addCondition((string) $formula); - } - } else { - $objConditional->addCondition((string) $cfRule->formula); - } - $objConditional->setStyle(clone $this->dxfs[(int) ($cfRule['dxfId'])]); - $conditionalStyles[] = $objConditional; - } - - return $conditionalStyles; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php deleted file mode 100644 index 41a8c9f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php +++ /dev/null @@ -1,51 +0,0 @@ -worksheet = $workSheet; - $this->worksheetXml = $worksheetXml; - } - - public function load(): void - { - foreach ($this->worksheetXml->dataValidations->dataValidation as $dataValidation) { - // Uppercase coordinate - $range = strtoupper($dataValidation['sqref']); - $rangeSet = explode(' ', $range); - foreach ($rangeSet as $range) { - $stRange = $this->worksheet->shrinkRangeToFit($range); - - // Extract all cell references in $range - foreach (Coordinate::extractAllCellReferencesInRange($stRange) as $reference) { - // Create validation - $docValidation = $this->worksheet->getCell($reference)->getDataValidation(); - $docValidation->setType((string) $dataValidation['type']); - $docValidation->setErrorStyle((string) $dataValidation['errorStyle']); - $docValidation->setOperator((string) $dataValidation['operator']); - $docValidation->setAllowBlank($dataValidation['allowBlank'] != 0); - $docValidation->setShowDropDown($dataValidation['showDropDown'] == 0); - $docValidation->setShowInputMessage($dataValidation['showInputMessage'] != 0); - $docValidation->setShowErrorMessage($dataValidation['showErrorMessage'] != 0); - $docValidation->setErrorTitle((string) $dataValidation['errorTitle']); - $docValidation->setError((string) $dataValidation['error']); - $docValidation->setPromptTitle((string) $dataValidation['promptTitle']); - $docValidation->setPrompt((string) $dataValidation['prompt']); - $docValidation->setFormula1((string) $dataValidation->formula1); - $docValidation->setFormula2((string) $dataValidation->formula2); - } - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php deleted file mode 100644 index 9e6aeaf..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php +++ /dev/null @@ -1,59 +0,0 @@ -worksheet = $workSheet; - } - - public function readHyperlinks(SimpleXMLElement $relsWorksheet): void - { - foreach ($relsWorksheet->Relationship as $element) { - if ($element['Type'] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink') { - $this->hyperlinks[(string) $element['Id']] = (string) $element['Target']; - } - } - } - - public function setHyperlinks(SimpleXMLElement $worksheetXml): void - { - foreach ($worksheetXml->hyperlink as $hyperlink) { - $this->setHyperlink($hyperlink, $this->worksheet); - } - } - - private function setHyperlink(SimpleXMLElement $hyperlink, Worksheet $worksheet): void - { - // Link url - $linkRel = $hyperlink->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships'); - - foreach (Coordinate::extractAllCellReferencesInRange($hyperlink['ref']) as $cellReference) { - $cell = $worksheet->getCell($cellReference); - if (isset($linkRel['id'])) { - $hyperlinkUrl = $this->hyperlinks[(string) $linkRel['id']]; - if (isset($hyperlink['location'])) { - $hyperlinkUrl .= '#' . (string) $hyperlink['location']; - } - $cell->getHyperlink()->setUrl($hyperlinkUrl); - } elseif (isset($hyperlink['location'])) { - $cell->getHyperlink()->setUrl('sheet://' . (string) $hyperlink['location']); - } - - // Tooltip - if (isset($hyperlink['tooltip'])) { - $cell->getHyperlink()->setTooltip((string) $hyperlink['tooltip']); - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php deleted file mode 100644 index 536c894..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php +++ /dev/null @@ -1,164 +0,0 @@ -worksheet = $workSheet; - $this->worksheetXml = $worksheetXml; - } - - public function load(array $unparsedLoadedData) - { - if (!$this->worksheetXml) { - return $unparsedLoadedData; - } - - $this->margins($this->worksheetXml, $this->worksheet); - $unparsedLoadedData = $this->pageSetup($this->worksheetXml, $this->worksheet, $unparsedLoadedData); - $this->headerFooter($this->worksheetXml, $this->worksheet); - $this->pageBreaks($this->worksheetXml, $this->worksheet); - - return $unparsedLoadedData; - } - - private function margins(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void - { - if ($xmlSheet->pageMargins) { - $docPageMargins = $worksheet->getPageMargins(); - $docPageMargins->setLeft((float) ($xmlSheet->pageMargins['left'])); - $docPageMargins->setRight((float) ($xmlSheet->pageMargins['right'])); - $docPageMargins->setTop((float) ($xmlSheet->pageMargins['top'])); - $docPageMargins->setBottom((float) ($xmlSheet->pageMargins['bottom'])); - $docPageMargins->setHeader((float) ($xmlSheet->pageMargins['header'])); - $docPageMargins->setFooter((float) ($xmlSheet->pageMargins['footer'])); - } - } - - private function pageSetup(SimpleXMLElement $xmlSheet, Worksheet $worksheet, array $unparsedLoadedData) - { - if ($xmlSheet->pageSetup) { - $docPageSetup = $worksheet->getPageSetup(); - - if (isset($xmlSheet->pageSetup['orientation'])) { - $docPageSetup->setOrientation((string) $xmlSheet->pageSetup['orientation']); - } - if (isset($xmlSheet->pageSetup['paperSize'])) { - $docPageSetup->setPaperSize((int) ($xmlSheet->pageSetup['paperSize'])); - } - if (isset($xmlSheet->pageSetup['scale'])) { - $docPageSetup->setScale((int) ($xmlSheet->pageSetup['scale']), false); - } - if (isset($xmlSheet->pageSetup['fitToHeight']) && (int) ($xmlSheet->pageSetup['fitToHeight']) >= 0) { - $docPageSetup->setFitToHeight((int) ($xmlSheet->pageSetup['fitToHeight']), false); - } - if (isset($xmlSheet->pageSetup['fitToWidth']) && (int) ($xmlSheet->pageSetup['fitToWidth']) >= 0) { - $docPageSetup->setFitToWidth((int) ($xmlSheet->pageSetup['fitToWidth']), false); - } - if ( - isset($xmlSheet->pageSetup['firstPageNumber'], $xmlSheet->pageSetup['useFirstPageNumber']) && - self::boolean((string) $xmlSheet->pageSetup['useFirstPageNumber']) - ) { - $docPageSetup->setFirstPageNumber((int) ($xmlSheet->pageSetup['firstPageNumber'])); - } - if (isset($xmlSheet->pageSetup['pageOrder'])) { - $docPageSetup->setPageOrder((string) $xmlSheet->pageSetup['pageOrder']); - } - - $relAttributes = $xmlSheet->pageSetup->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships'); - if (isset($relAttributes['id'])) { - $unparsedLoadedData['sheets'][$worksheet->getCodeName()]['pageSetupRelId'] = (string) $relAttributes['id']; - } - } - - return $unparsedLoadedData; - } - - private function headerFooter(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void - { - if ($xmlSheet->headerFooter) { - $docHeaderFooter = $worksheet->getHeaderFooter(); - - if ( - isset($xmlSheet->headerFooter['differentOddEven']) && - self::boolean((string) $xmlSheet->headerFooter['differentOddEven']) - ) { - $docHeaderFooter->setDifferentOddEven(true); - } else { - $docHeaderFooter->setDifferentOddEven(false); - } - if ( - isset($xmlSheet->headerFooter['differentFirst']) && - self::boolean((string) $xmlSheet->headerFooter['differentFirst']) - ) { - $docHeaderFooter->setDifferentFirst(true); - } else { - $docHeaderFooter->setDifferentFirst(false); - } - if ( - isset($xmlSheet->headerFooter['scaleWithDoc']) && - !self::boolean((string) $xmlSheet->headerFooter['scaleWithDoc']) - ) { - $docHeaderFooter->setScaleWithDocument(false); - } else { - $docHeaderFooter->setScaleWithDocument(true); - } - if ( - isset($xmlSheet->headerFooter['alignWithMargins']) && - !self::boolean((string) $xmlSheet->headerFooter['alignWithMargins']) - ) { - $docHeaderFooter->setAlignWithMargins(false); - } else { - $docHeaderFooter->setAlignWithMargins(true); - } - - $docHeaderFooter->setOddHeader((string) $xmlSheet->headerFooter->oddHeader); - $docHeaderFooter->setOddFooter((string) $xmlSheet->headerFooter->oddFooter); - $docHeaderFooter->setEvenHeader((string) $xmlSheet->headerFooter->evenHeader); - $docHeaderFooter->setEvenFooter((string) $xmlSheet->headerFooter->evenFooter); - $docHeaderFooter->setFirstHeader((string) $xmlSheet->headerFooter->firstHeader); - $docHeaderFooter->setFirstFooter((string) $xmlSheet->headerFooter->firstFooter); - } - } - - private function pageBreaks(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void - { - if ($xmlSheet->rowBreaks && $xmlSheet->rowBreaks->brk) { - $this->rowBreaks($xmlSheet, $worksheet); - } - if ($xmlSheet->colBreaks && $xmlSheet->colBreaks->brk) { - $this->columnBreaks($xmlSheet, $worksheet); - } - } - - private function rowBreaks(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void - { - foreach ($xmlSheet->rowBreaks->brk as $brk) { - if ($brk['man']) { - $worksheet->setBreak("A{$brk['id']}", Worksheet::BREAK_ROW); - } - } - } - - private function columnBreaks(SimpleXMLElement $xmlSheet, Worksheet $worksheet): void - { - foreach ($xmlSheet->colBreaks->brk as $brk) { - if ($brk['man']) { - $worksheet->setBreak( - Coordinate::stringFromColumnIndex(((int) $brk['id']) + 1) . '1', - Worksheet::BREAK_COLUMN - ); - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Properties.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Properties.php deleted file mode 100644 index b6f3c61..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Properties.php +++ /dev/null @@ -1,92 +0,0 @@ -securityScanner = $securityScanner; - $this->docProps = $docProps; - } - - private function extractPropertyData($propertyData) - { - return simplexml_load_string( - $this->securityScanner->scan($propertyData), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - } - - public function readCoreProperties($propertyData): void - { - $xmlCore = $this->extractPropertyData($propertyData); - - if (is_object($xmlCore)) { - $xmlCore->registerXPathNamespace('dc', 'http://purl.org/dc/elements/1.1/'); - $xmlCore->registerXPathNamespace('dcterms', 'http://purl.org/dc/terms/'); - $xmlCore->registerXPathNamespace('cp', 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties'); - - $this->docProps->setCreator((string) self::getArrayItem($xmlCore->xpath('dc:creator'))); - $this->docProps->setLastModifiedBy((string) self::getArrayItem($xmlCore->xpath('cp:lastModifiedBy'))); - $this->docProps->setCreated(strtotime(self::getArrayItem($xmlCore->xpath('dcterms:created')))); //! respect xsi:type - $this->docProps->setModified(strtotime(self::getArrayItem($xmlCore->xpath('dcterms:modified')))); //! respect xsi:type - $this->docProps->setTitle((string) self::getArrayItem($xmlCore->xpath('dc:title'))); - $this->docProps->setDescription((string) self::getArrayItem($xmlCore->xpath('dc:description'))); - $this->docProps->setSubject((string) self::getArrayItem($xmlCore->xpath('dc:subject'))); - $this->docProps->setKeywords((string) self::getArrayItem($xmlCore->xpath('cp:keywords'))); - $this->docProps->setCategory((string) self::getArrayItem($xmlCore->xpath('cp:category'))); - } - } - - public function readExtendedProperties($propertyData): void - { - $xmlCore = $this->extractPropertyData($propertyData); - - if (is_object($xmlCore)) { - if (isset($xmlCore->Company)) { - $this->docProps->setCompany((string) $xmlCore->Company); - } - if (isset($xmlCore->Manager)) { - $this->docProps->setManager((string) $xmlCore->Manager); - } - } - } - - public function readCustomProperties($propertyData): void - { - $xmlCore = $this->extractPropertyData($propertyData); - - if (is_object($xmlCore)) { - foreach ($xmlCore as $xmlProperty) { - /** @var SimpleXMLElement $xmlProperty */ - $cellDataOfficeAttributes = $xmlProperty->attributes(); - if (isset($cellDataOfficeAttributes['name'])) { - $propertyName = (string) $cellDataOfficeAttributes['name']; - $cellDataOfficeChildren = $xmlProperty->children('http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); - - $attributeType = $cellDataOfficeChildren->getName(); - $attributeValue = (string) $cellDataOfficeChildren->{$attributeType}; - $attributeValue = DocumentProperties::convertProperty($attributeValue, $attributeType); - $attributeType = DocumentProperties::convertPropertyType($attributeType); - $this->docProps->setCustomProperty($propertyName, $attributeValue, $attributeType); - } - } - } - } - - private static function getArrayItem(array $array, $key = 0) - { - return $array[$key] ?? null; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php deleted file mode 100644 index 1235881..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php +++ /dev/null @@ -1,135 +0,0 @@ -worksheet = $workSheet; - $this->worksheetXml = $worksheetXml; - } - - /** - * @param bool $readDataOnly - */ - public function load($readDataOnly = false): void - { - if ($this->worksheetXml === null) { - return; - } - - if (isset($this->worksheetXml->sheetPr)) { - $this->tabColor($this->worksheetXml->sheetPr); - $this->codeName($this->worksheetXml->sheetPr); - $this->outlines($this->worksheetXml->sheetPr); - $this->pageSetup($this->worksheetXml->sheetPr); - } - - if (isset($this->worksheetXml->sheetFormatPr)) { - $this->sheetFormat($this->worksheetXml->sheetFormatPr); - } - - if (!$readDataOnly && isset($this->worksheetXml->printOptions)) { - $this->printOptions($this->worksheetXml->printOptions); - } - } - - private function tabColor(SimpleXMLElement $sheetPr): void - { - if (isset($sheetPr->tabColor, $sheetPr->tabColor['rgb'])) { - $this->worksheet->getTabColor()->setARGB((string) $sheetPr->tabColor['rgb']); - } - } - - private function codeName(SimpleXMLElement $sheetPr): void - { - if (isset($sheetPr['codeName'])) { - $this->worksheet->setCodeName((string) $sheetPr['codeName'], false); - } - } - - private function outlines(SimpleXMLElement $sheetPr): void - { - if (isset($sheetPr->outlinePr)) { - if ( - isset($sheetPr->outlinePr['summaryRight']) && - !self::boolean((string) $sheetPr->outlinePr['summaryRight']) - ) { - $this->worksheet->setShowSummaryRight(false); - } else { - $this->worksheet->setShowSummaryRight(true); - } - - if ( - isset($sheetPr->outlinePr['summaryBelow']) && - !self::boolean((string) $sheetPr->outlinePr['summaryBelow']) - ) { - $this->worksheet->setShowSummaryBelow(false); - } else { - $this->worksheet->setShowSummaryBelow(true); - } - } - } - - private function pageSetup(SimpleXMLElement $sheetPr): void - { - if (isset($sheetPr->pageSetUpPr)) { - if ( - isset($sheetPr->pageSetUpPr['fitToPage']) && - !self::boolean((string) $sheetPr->pageSetUpPr['fitToPage']) - ) { - $this->worksheet->getPageSetup()->setFitToPage(false); - } else { - $this->worksheet->getPageSetup()->setFitToPage(true); - } - } - } - - private function sheetFormat(SimpleXMLElement $sheetFormatPr): void - { - if ( - isset($sheetFormatPr['customHeight']) && - self::boolean((string) $sheetFormatPr['customHeight']) && - isset($sheetFormatPr['defaultRowHeight']) - ) { - $this->worksheet->getDefaultRowDimension() - ->setRowHeight((float) $sheetFormatPr['defaultRowHeight']); - } - - if (isset($sheetFormatPr['defaultColWidth'])) { - $this->worksheet->getDefaultColumnDimension() - ->setWidth((float) $sheetFormatPr['defaultColWidth']); - } - - if ( - isset($sheetFormatPr['zeroHeight']) && - ((string) $sheetFormatPr['zeroHeight'] === '1') - ) { - $this->worksheet->getDefaultRowDimension()->setZeroHeight(true); - } - } - - private function printOptions(SimpleXMLElement $printOptions): void - { - if (self::boolean((string) $printOptions['gridLinesSet'])) { - $this->worksheet->setShowGridlines(true); - } - if (self::boolean((string) $printOptions['gridLines'])) { - $this->worksheet->setPrintGridlines(true); - } - if (self::boolean((string) $printOptions['horizontalCentered'])) { - $this->worksheet->getPageSetup()->setHorizontalCentered(true); - } - if (self::boolean((string) $printOptions['verticalCentered'])) { - $this->worksheet->getPageSetup()->setVerticalCentered(true); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViews.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViews.php deleted file mode 100644 index f6c4792..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViews.php +++ /dev/null @@ -1,138 +0,0 @@ -sheetViewXml = $sheetViewXml; - $this->worksheet = $workSheet; - } - - public function load(): void - { - $this->zoomScale(); - $this->view(); - $this->gridLines(); - $this->headers(); - $this->direction(); - $this->showZeros(); - - if (isset($this->sheetViewXml->pane)) { - $this->pane(); - } - if (isset($this->sheetViewXml->selection, $this->sheetViewXml->selection['sqref'])) { - $this->selection(); - } - } - - private function zoomScale(): void - { - if (isset($this->sheetViewXml['zoomScale'])) { - $zoomScale = (int) ($this->sheetViewXml['zoomScale']); - if ($zoomScale <= 0) { - // setZoomScale will throw an Exception if the scale is less than or equals 0 - // that is OK when manually creating documents, but we should be able to read all documents - $zoomScale = 100; - } - - $this->worksheet->getSheetView()->setZoomScale($zoomScale); - } - - if (isset($this->sheetViewXml['zoomScaleNormal'])) { - $zoomScaleNormal = (int) ($this->sheetViewXml['zoomScaleNormal']); - if ($zoomScaleNormal <= 0) { - // setZoomScaleNormal will throw an Exception if the scale is less than or equals 0 - // that is OK when manually creating documents, but we should be able to read all documents - $zoomScaleNormal = 100; - } - - $this->worksheet->getSheetView()->setZoomScaleNormal($zoomScaleNormal); - } - } - - private function view(): void - { - if (isset($this->sheetViewXml['view'])) { - $this->worksheet->getSheetView()->setView((string) $this->sheetViewXml['view']); - } - } - - private function gridLines(): void - { - if (isset($this->sheetViewXml['showGridLines'])) { - $this->worksheet->setShowGridLines( - self::boolean((string) $this->sheetViewXml['showGridLines']) - ); - } - } - - private function headers(): void - { - if (isset($this->sheetViewXml['showRowColHeaders'])) { - $this->worksheet->setShowRowColHeaders( - self::boolean((string) $this->sheetViewXml['showRowColHeaders']) - ); - } - } - - private function direction(): void - { - if (isset($this->sheetViewXml['rightToLeft'])) { - $this->worksheet->setRightToLeft( - self::boolean((string) $this->sheetViewXml['rightToLeft']) - ); - } - } - - private function showZeros(): void - { - if (isset($this->sheetViewXml['showZeros'])) { - $this->worksheet->getSheetView()->setShowZeros( - self::boolean((string) $this->sheetViewXml['showZeros']) - ); - } - } - - private function pane(): void - { - $xSplit = 0; - $ySplit = 0; - $topLeftCell = null; - - if (isset($this->sheetViewXml->pane['xSplit'])) { - $xSplit = (int) ($this->sheetViewXml->pane['xSplit']); - } - - if (isset($this->sheetViewXml->pane['ySplit'])) { - $ySplit = (int) ($this->sheetViewXml->pane['ySplit']); - } - - if (isset($this->sheetViewXml->pane['topLeftCell'])) { - $topLeftCell = (string) $this->sheetViewXml->pane['topLeftCell']; - } - - $this->worksheet->freezePane( - Coordinate::stringFromColumnIndex($xSplit + 1) . ($ySplit + 1), - $topLeftCell - ); - } - - private function selection(): void - { - $sqref = (string) $this->sheetViewXml->selection['sqref']; - $sqref = explode(' ', $sqref); - $sqref = $sqref[0]; - - $this->worksheet->setSelectedCells($sqref); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php deleted file mode 100644 index 43de878..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php +++ /dev/null @@ -1,282 +0,0 @@ -styleXml = $styleXml; - } - - public function setStyleBaseData(?Theme $theme = null, $styles = [], $cellStyles = []): void - { - self::$theme = $theme; - $this->styles = $styles; - $this->cellStyles = $cellStyles; - } - - private static function readFontStyle(Font $fontStyle, SimpleXMLElement $fontStyleXml): void - { - $fontStyle->setName((string) $fontStyleXml->name['val']); - $fontStyle->setSize((float) $fontStyleXml->sz['val']); - - if (isset($fontStyleXml->b)) { - $fontStyle->setBold(!isset($fontStyleXml->b['val']) || self::boolean((string) $fontStyleXml->b['val'])); - } - if (isset($fontStyleXml->i)) { - $fontStyle->setItalic(!isset($fontStyleXml->i['val']) || self::boolean((string) $fontStyleXml->i['val'])); - } - if (isset($fontStyleXml->strike)) { - $fontStyle->setStrikethrough(!isset($fontStyleXml->strike['val']) || self::boolean((string) $fontStyleXml->strike['val'])); - } - $fontStyle->getColor()->setARGB(self::readColor($fontStyleXml->color)); - - if (isset($fontStyleXml->u) && !isset($fontStyleXml->u['val'])) { - $fontStyle->setUnderline(Font::UNDERLINE_SINGLE); - } elseif (isset($fontStyleXml->u, $fontStyleXml->u['val'])) { - $fontStyle->setUnderline((string) $fontStyleXml->u['val']); - } - - if (isset($fontStyleXml->vertAlign, $fontStyleXml->vertAlign['val'])) { - $verticalAlign = strtolower((string) $fontStyleXml->vertAlign['val']); - if ($verticalAlign === 'superscript') { - $fontStyle->setSuperscript(true); - } - if ($verticalAlign === 'subscript') { - $fontStyle->setSubscript(true); - } - } - } - - private static function readNumberFormat(NumberFormat $numfmtStyle, SimpleXMLElement $numfmtStyleXml): void - { - if ($numfmtStyleXml->count() === 0) { - return; - } - $numfmt = $numfmtStyleXml->attributes(); - if ($numfmt->count() > 0 && isset($numfmt['formatCode'])) { - $numfmtStyle->setFormatCode((string) $numfmt['formatCode']); - } - } - - private static function readFillStyle(Fill $fillStyle, SimpleXMLElement $fillStyleXml): void - { - if ($fillStyleXml->gradientFill) { - /** @var SimpleXMLElement $gradientFill */ - $gradientFill = $fillStyleXml->gradientFill[0]; - if (!empty($gradientFill['type'])) { - $fillStyle->setFillType((string) $gradientFill['type']); - } - $fillStyle->setRotation((float) ($gradientFill['degree'])); - $gradientFill->registerXPathNamespace('sml', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); - $fillStyle->getStartColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath('sml:stop[@position=0]'))->color)); - $fillStyle->getEndColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath('sml:stop[@position=1]'))->color)); - } elseif ($fillStyleXml->patternFill) { - $patternType = (string) $fillStyleXml->patternFill['patternType'] != '' ? (string) $fillStyleXml->patternFill['patternType'] : 'solid'; - $fillStyle->setFillType($patternType); - if ($fillStyleXml->patternFill->fgColor) { - $fillStyle->getStartColor()->setARGB(self::readColor($fillStyleXml->patternFill->fgColor, true)); - } else { - $fillStyle->getStartColor()->setARGB('FF000000'); - } - if ($fillStyleXml->patternFill->bgColor) { - $fillStyle->getEndColor()->setARGB(self::readColor($fillStyleXml->patternFill->bgColor, true)); - } - } - } - - private static function readBorderStyle(Borders $borderStyle, SimpleXMLElement $borderStyleXml): void - { - $diagonalUp = self::boolean((string) $borderStyleXml['diagonalUp']); - $diagonalDown = self::boolean((string) $borderStyleXml['diagonalDown']); - if (!$diagonalUp && !$diagonalDown) { - $borderStyle->setDiagonalDirection(Borders::DIAGONAL_NONE); - } elseif ($diagonalUp && !$diagonalDown) { - $borderStyle->setDiagonalDirection(Borders::DIAGONAL_UP); - } elseif (!$diagonalUp && $diagonalDown) { - $borderStyle->setDiagonalDirection(Borders::DIAGONAL_DOWN); - } else { - $borderStyle->setDiagonalDirection(Borders::DIAGONAL_BOTH); - } - - self::readBorder($borderStyle->getLeft(), $borderStyleXml->left); - self::readBorder($borderStyle->getRight(), $borderStyleXml->right); - self::readBorder($borderStyle->getTop(), $borderStyleXml->top); - self::readBorder($borderStyle->getBottom(), $borderStyleXml->bottom); - self::readBorder($borderStyle->getDiagonal(), $borderStyleXml->diagonal); - } - - private static function readBorder(Border $border, SimpleXMLElement $borderXml): void - { - if (isset($borderXml['style'])) { - $border->setBorderStyle((string) $borderXml['style']); - } - if (isset($borderXml->color)) { - $border->getColor()->setARGB(self::readColor($borderXml->color)); - } - } - - private static function readAlignmentStyle(Alignment $alignment, SimpleXMLElement $alignmentXml): void - { - $alignment->setHorizontal((string) $alignmentXml->alignment['horizontal']); - $alignment->setVertical((string) $alignmentXml->alignment['vertical']); - - $textRotation = 0; - if ((int) $alignmentXml->alignment['textRotation'] <= 90) { - $textRotation = (int) $alignmentXml->alignment['textRotation']; - } elseif ((int) $alignmentXml->alignment['textRotation'] > 90) { - $textRotation = 90 - (int) $alignmentXml->alignment['textRotation']; - } - - $alignment->setTextRotation((int) $textRotation); - $alignment->setWrapText(self::boolean((string) $alignmentXml->alignment['wrapText'])); - $alignment->setShrinkToFit(self::boolean((string) $alignmentXml->alignment['shrinkToFit'])); - $alignment->setIndent((int) ((string) $alignmentXml->alignment['indent']) > 0 ? (int) ((string) $alignmentXml->alignment['indent']) : 0); - $alignment->setReadOrder((int) ((string) $alignmentXml->alignment['readingOrder']) > 0 ? (int) ((string) $alignmentXml->alignment['readingOrder']) : 0); - } - - private function readStyle(Style $docStyle, $style): void - { - if ($style->numFmt instanceof SimpleXMLElement) { - self::readNumberFormat($docStyle->getNumberFormat(), $style->numFmt); - } else { - $docStyle->getNumberFormat()->setFormatCode($style->numFmt); - } - - if (isset($style->font)) { - self::readFontStyle($docStyle->getFont(), $style->font); - } - - if (isset($style->fill)) { - self::readFillStyle($docStyle->getFill(), $style->fill); - } - - if (isset($style->border)) { - self::readBorderStyle($docStyle->getBorders(), $style->border); - } - - if (isset($style->alignment->alignment)) { - self::readAlignmentStyle($docStyle->getAlignment(), $style->alignment); - } - - // protection - if (isset($style->protection)) { - $this->readProtectionLocked($docStyle, $style); - $this->readProtectionHidden($docStyle, $style); - } - - // top-level style settings - if (isset($style->quotePrefix)) { - $docStyle->setQuotePrefix(true); - } - } - - private function readProtectionLocked(Style $docStyle, $style): void - { - if (isset($style->protection['locked'])) { - if (self::boolean((string) $style->protection['locked'])) { - $docStyle->getProtection()->setLocked(Protection::PROTECTION_PROTECTED); - } else { - $docStyle->getProtection()->setLocked(Protection::PROTECTION_UNPROTECTED); - } - } - } - - private function readProtectionHidden(Style $docStyle, $style): void - { - if (isset($style->protection['hidden'])) { - if (self::boolean((string) $style->protection['hidden'])) { - $docStyle->getProtection()->setHidden(Protection::PROTECTION_PROTECTED); - } else { - $docStyle->getProtection()->setHidden(Protection::PROTECTION_UNPROTECTED); - } - } - } - - private static function readColor($color, $background = false) - { - if (isset($color['rgb'])) { - return (string) $color['rgb']; - } elseif (isset($color['indexed'])) { - return Color::indexedColor($color['indexed'] - 7, $background)->getARGB(); - } elseif (isset($color['theme'])) { - if (self::$theme !== null) { - $returnColour = self::$theme->getColourByIndex((int) $color['theme']); - if (isset($color['tint'])) { - $tintAdjust = (float) $color['tint']; - $returnColour = Color::changeBrightness($returnColour, $tintAdjust); - } - - return 'FF' . $returnColour; - } - } - - return ($background) ? 'FFFFFFFF' : 'FF000000'; - } - - public function dxfs($readDataOnly = false) - { - $dxfs = []; - if (!$readDataOnly && $this->styleXml) { - // Conditional Styles - if ($this->styleXml->dxfs) { - foreach ($this->styleXml->dxfs->dxf as $dxf) { - $style = new Style(false, true); - $this->readStyle($style, $dxf); - $dxfs[] = $style; - } - } - // Cell Styles - if ($this->styleXml->cellStyles) { - foreach ($this->styleXml->cellStyles->cellStyle as $cellStyle) { - if ((int) ($cellStyle['builtinId']) == 0) { - if (isset($this->cellStyles[(int) ($cellStyle['xfId'])])) { - // Set default style - $style = new Style(); - $this->readStyle($style, $this->cellStyles[(int) ($cellStyle['xfId'])]); - - // normal style, currently not using it for anything - } - } - } - } - } - - return $dxfs; - } - - public function styles() - { - return $this->styles; - } - - private static function getArrayItem($array, $key = 0) - { - return $array[$key] ?? null; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Theme.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Theme.php deleted file mode 100644 index c105f3c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Theme.php +++ /dev/null @@ -1,93 +0,0 @@ -themeName = $themeName; - $this->colourSchemeName = $colourSchemeName; - $this->colourMap = $colourMap; - } - - /** - * Get Theme Name. - * - * @return string - */ - public function getThemeName() - { - return $this->themeName; - } - - /** - * Get colour Scheme Name. - * - * @return string - */ - public function getColourSchemeName() - { - return $this->colourSchemeName; - } - - /** - * Get colour Map Value by Position. - * - * @param mixed $index - * - * @return string - */ - public function getColourByIndex($index) - { - if (isset($this->colourMap[$index])) { - return $this->colourMap[$index]; - } - - return null; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if ((is_object($value)) && ($key != '_parent')) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php deleted file mode 100644 index e4d251e..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php +++ /dev/null @@ -1,897 +0,0 @@ -securityScanner = XmlScanner::getInstance($this); - } - - private $fileContents = ''; - - private static $mappings = [ - 'borderStyle' => [ - '1continuous' => Border::BORDER_THIN, - '1dash' => Border::BORDER_DASHED, - '1dashdot' => Border::BORDER_DASHDOT, - '1dashdotdot' => Border::BORDER_DASHDOTDOT, - '1dot' => Border::BORDER_DOTTED, - '1double' => Border::BORDER_DOUBLE, - '2continuous' => Border::BORDER_MEDIUM, - '2dash' => Border::BORDER_MEDIUMDASHED, - '2dashdot' => Border::BORDER_MEDIUMDASHDOT, - '2dashdotdot' => Border::BORDER_MEDIUMDASHDOTDOT, - '2dot' => Border::BORDER_DOTTED, - '2double' => Border::BORDER_DOUBLE, - '3continuous' => Border::BORDER_THICK, - '3dash' => Border::BORDER_MEDIUMDASHED, - '3dashdot' => Border::BORDER_MEDIUMDASHDOT, - '3dashdotdot' => Border::BORDER_MEDIUMDASHDOTDOT, - '3dot' => Border::BORDER_DOTTED, - '3double' => Border::BORDER_DOUBLE, - ], - 'fillType' => [ - 'solid' => Fill::FILL_SOLID, - 'gray75' => Fill::FILL_PATTERN_DARKGRAY, - 'gray50' => Fill::FILL_PATTERN_MEDIUMGRAY, - 'gray25' => Fill::FILL_PATTERN_LIGHTGRAY, - 'gray125' => Fill::FILL_PATTERN_GRAY125, - 'gray0625' => Fill::FILL_PATTERN_GRAY0625, - 'horzstripe' => Fill::FILL_PATTERN_DARKHORIZONTAL, // horizontal stripe - 'vertstripe' => Fill::FILL_PATTERN_DARKVERTICAL, // vertical stripe - 'reversediagstripe' => Fill::FILL_PATTERN_DARKUP, // reverse diagonal stripe - 'diagstripe' => Fill::FILL_PATTERN_DARKDOWN, // diagonal stripe - 'diagcross' => Fill::FILL_PATTERN_DARKGRID, // diagoanl crosshatch - 'thickdiagcross' => Fill::FILL_PATTERN_DARKTRELLIS, // thick diagonal crosshatch - 'thinhorzstripe' => Fill::FILL_PATTERN_LIGHTHORIZONTAL, - 'thinvertstripe' => Fill::FILL_PATTERN_LIGHTVERTICAL, - 'thinreversediagstripe' => Fill::FILL_PATTERN_LIGHTUP, - 'thindiagstripe' => Fill::FILL_PATTERN_LIGHTDOWN, - 'thinhorzcross' => Fill::FILL_PATTERN_LIGHTGRID, // thin horizontal crosshatch - 'thindiagcross' => Fill::FILL_PATTERN_LIGHTTRELLIS, // thin diagonal crosshatch - ], - ]; - - public static function xmlMappings(): array - { - return self::$mappings; - } - - /** - * Can the current IReader read the file? - * - * @param string $pFilename - * - * @return bool - */ - public function canRead($pFilename) - { - // Office xmlns:o="urn:schemas-microsoft-com:office:office" - // Excel xmlns:x="urn:schemas-microsoft-com:office:excel" - // XML Spreadsheet xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" - // Spreadsheet component xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" - // XML schema xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" - // XML data type xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" - // MS-persist recordset xmlns:rs="urn:schemas-microsoft-com:rowset" - // Rowset xmlns:z="#RowsetSchema" - // - - $signature = [ - '', - ]; - - // Open file - $data = file_get_contents($pFilename); - - // Why? - //$data = str_replace("'", '"', $data); // fix headers with single quote - - $valid = true; - foreach ($signature as $match) { - // every part of the signature must be present - if (strpos($data, $match) === false) { - $valid = false; - - break; - } - } - - // Retrieve charset encoding - if (preg_match('//m', $data, $matches)) { - $charSet = strtoupper($matches[1]); - if (1 == preg_match('/^ISO-8859-\d[\dL]?$/i', $charSet)) { - $data = StringHelper::convertEncoding($data, 'UTF-8', $charSet); - $data = preg_replace('/()/um', '$1' . 'UTF-8' . '$2', $data, 1); - } - } - $this->fileContents = $data; - - return $valid; - } - - /** - * Check if the file is a valid SimpleXML. - * - * @param string $pFilename - * - * @return false|SimpleXMLElement - */ - public function trySimpleXMLLoadString($pFilename) - { - try { - $xml = simplexml_load_string( - $this->securityScanner->scan($this->fileContents ?: file_get_contents($pFilename)), - 'SimpleXMLElement', - Settings::getLibXmlLoaderOptions() - ); - } catch (\Exception $e) { - throw new Exception('Cannot load invalid XML file: ' . $pFilename, 0, $e); - } - $this->fileContents = ''; - - return $xml; - } - - /** - * Reads names of the worksheets from a file, without parsing the whole file to a Spreadsheet object. - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetNames($pFilename) - { - File::assertFile($pFilename); - if (!$this->canRead($pFilename)) { - throw new Exception($pFilename . ' is an Invalid Spreadsheet file.'); - } - - $worksheetNames = []; - - $xml = $this->trySimpleXMLLoadString($pFilename); - - $namespaces = $xml->getNamespaces(true); - - $xml_ss = $xml->children($namespaces['ss']); - foreach ($xml_ss->Worksheet as $worksheet) { - $worksheet_ss = $worksheet->attributes($namespaces['ss']); - $worksheetNames[] = (string) $worksheet_ss['Name']; - } - - return $worksheetNames; - } - - /** - * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns). - * - * @param string $pFilename - * - * @return array - */ - public function listWorksheetInfo($pFilename) - { - File::assertFile($pFilename); - if (!$this->canRead($pFilename)) { - throw new Exception($pFilename . ' is an Invalid Spreadsheet file.'); - } - - $worksheetInfo = []; - - $xml = $this->trySimpleXMLLoadString($pFilename); - - $namespaces = $xml->getNamespaces(true); - - $worksheetID = 1; - $xml_ss = $xml->children($namespaces['ss']); - foreach ($xml_ss->Worksheet as $worksheet) { - $worksheet_ss = $worksheet->attributes($namespaces['ss']); - - $tmpInfo = []; - $tmpInfo['worksheetName'] = ''; - $tmpInfo['lastColumnLetter'] = 'A'; - $tmpInfo['lastColumnIndex'] = 0; - $tmpInfo['totalRows'] = 0; - $tmpInfo['totalColumns'] = 0; - - $tmpInfo['worksheetName'] = "Worksheet_{$worksheetID}"; - if (isset($worksheet_ss['Name'])) { - $tmpInfo['worksheetName'] = (string) $worksheet_ss['Name']; - } - - if (isset($worksheet->Table->Row)) { - $rowIndex = 0; - - foreach ($worksheet->Table->Row as $rowData) { - $columnIndex = 0; - $rowHasData = false; - - foreach ($rowData->Cell as $cell) { - if (isset($cell->Data)) { - $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex); - $rowHasData = true; - } - - ++$columnIndex; - } - - ++$rowIndex; - - if ($rowHasData) { - $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex); - } - } - } - - $tmpInfo['lastColumnLetter'] = Coordinate::stringFromColumnIndex($tmpInfo['lastColumnIndex'] + 1); - $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1; - - $worksheetInfo[] = $tmpInfo; - ++$worksheetID; - } - - return $worksheetInfo; - } - - /** - * Loads Spreadsheet from file. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function load($pFilename) - { - // Create new Spreadsheet - $spreadsheet = new Spreadsheet(); - $spreadsheet->removeSheetByIndex(0); - - // Load into this instance - return $this->loadIntoExisting($pFilename, $spreadsheet); - } - - private static function identifyFixedStyleValue($styleList, &$styleAttributeValue) - { - $returnValue = false; - $styleAttributeValue = strtolower($styleAttributeValue); - foreach ($styleList as $style) { - if ($styleAttributeValue == strtolower($style)) { - $styleAttributeValue = $style; - $returnValue = true; - - break; - } - } - - return $returnValue; - } - - protected static function hex2str($hex) - { - return mb_chr((int) hexdec($hex[1]), 'UTF-8'); - } - - /** - * Loads from file into Spreadsheet instance. - * - * @param string $pFilename - * - * @return Spreadsheet - */ - public function loadIntoExisting($pFilename, Spreadsheet $spreadsheet) - { - File::assertFile($pFilename); - if (!$this->canRead($pFilename)) { - throw new Exception($pFilename . ' is an Invalid Spreadsheet file.'); - } - - $xml = $this->trySimpleXMLLoadString($pFilename); - - $namespaces = $xml->getNamespaces(true); - - $docProps = $spreadsheet->getProperties(); - if (isset($xml->DocumentProperties[0])) { - foreach ($xml->DocumentProperties[0] as $propertyName => $propertyValue) { - $stringValue = (string) $propertyValue; - switch ($propertyName) { - case 'Title': - $docProps->setTitle($stringValue); - - break; - case 'Subject': - $docProps->setSubject($stringValue); - - break; - case 'Author': - $docProps->setCreator($stringValue); - - break; - case 'Created': - $creationDate = strtotime($stringValue); - $docProps->setCreated($creationDate); - - break; - case 'LastAuthor': - $docProps->setLastModifiedBy($stringValue); - - break; - case 'LastSaved': - $lastSaveDate = strtotime($stringValue); - $docProps->setModified($lastSaveDate); - - break; - case 'Company': - $docProps->setCompany($stringValue); - - break; - case 'Category': - $docProps->setCategory($stringValue); - - break; - case 'Manager': - $docProps->setManager($stringValue); - - break; - case 'Keywords': - $docProps->setKeywords($stringValue); - - break; - case 'Description': - $docProps->setDescription($stringValue); - - break; - } - } - } - if (isset($xml->CustomDocumentProperties)) { - foreach ($xml->CustomDocumentProperties[0] as $propertyName => $propertyValue) { - $propertyAttributes = $propertyValue->attributes($namespaces['dt']); - $propertyName = preg_replace_callback('/_x([0-9a-f]{4})_/i', ['self', 'hex2str'], $propertyName); - $propertyType = Properties::PROPERTY_TYPE_UNKNOWN; - switch ((string) $propertyAttributes) { - case 'string': - $propertyType = Properties::PROPERTY_TYPE_STRING; - $propertyValue = trim($propertyValue); - - break; - case 'boolean': - $propertyType = Properties::PROPERTY_TYPE_BOOLEAN; - $propertyValue = (bool) $propertyValue; - - break; - case 'integer': - $propertyType = Properties::PROPERTY_TYPE_INTEGER; - $propertyValue = (int) $propertyValue; - - break; - case 'float': - $propertyType = Properties::PROPERTY_TYPE_FLOAT; - $propertyValue = (float) $propertyValue; - - break; - case 'dateTime.tz': - $propertyType = Properties::PROPERTY_TYPE_DATE; - $propertyValue = strtotime(trim($propertyValue)); - - break; - } - $docProps->setCustomProperty($propertyName, $propertyValue, $propertyType); - } - } - - $this->parseStyles($xml, $namespaces); - - $worksheetID = 0; - $xml_ss = $xml->children($namespaces['ss']); - - foreach ($xml_ss->Worksheet as $worksheet) { - $worksheet_ss = $worksheet->attributes($namespaces['ss']); - - if ( - (isset($this->loadSheetsOnly)) && (isset($worksheet_ss['Name'])) && - (!in_array($worksheet_ss['Name'], $this->loadSheetsOnly)) - ) { - continue; - } - - // Create new Worksheet - $spreadsheet->createSheet(); - $spreadsheet->setActiveSheetIndex($worksheetID); - if (isset($worksheet_ss['Name'])) { - $worksheetName = (string) $worksheet_ss['Name']; - // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in - // formula cells... during the load, all formulae should be correct, and we're simply bringing - // the worksheet name in line with the formula, not the reverse - $spreadsheet->getActiveSheet()->setTitle($worksheetName, false, false); - } - - // locally scoped defined names - if (isset($worksheet->Names[0])) { - foreach ($worksheet->Names[0] as $definedName) { - $definedName_ss = $definedName->attributes($namespaces['ss']); - $name = (string) $definedName_ss['Name']; - $definedValue = (string) $definedName_ss['RefersTo']; - $convertedValue = AddressHelper::convertFormulaToA1($definedValue); - if ($convertedValue[0] === '=') { - $convertedValue = substr($convertedValue, 1); - } - $spreadsheet->addDefinedName(DefinedName::createInstance($name, $spreadsheet->getActiveSheet(), $convertedValue, true)); - } - } - - $columnID = 'A'; - if (isset($worksheet->Table->Column)) { - foreach ($worksheet->Table->Column as $columnData) { - $columnData_ss = $columnData->attributes($namespaces['ss']); - if (isset($columnData_ss['Index'])) { - $columnID = Coordinate::stringFromColumnIndex((int) $columnData_ss['Index']); - } - if (isset($columnData_ss['Width'])) { - $columnWidth = $columnData_ss['Width']; - $spreadsheet->getActiveSheet()->getColumnDimension($columnID)->setWidth($columnWidth / 5.4); - } - ++$columnID; - } - } - - $rowID = 1; - if (isset($worksheet->Table->Row)) { - $additionalMergedCells = 0; - foreach ($worksheet->Table->Row as $rowData) { - $rowHasData = false; - $row_ss = $rowData->attributes($namespaces['ss']); - if (isset($row_ss['Index'])) { - $rowID = (int) $row_ss['Index']; - } - - $columnID = 'A'; - foreach ($rowData->Cell as $cell) { - $cell_ss = $cell->attributes($namespaces['ss']); - if (isset($cell_ss['Index'])) { - $columnID = Coordinate::stringFromColumnIndex((int) $cell_ss['Index']); - } - $cellRange = $columnID . $rowID; - - if ($this->getReadFilter() !== null) { - if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) { - ++$columnID; - - continue; - } - } - - if (isset($cell_ss['HRef'])) { - $spreadsheet->getActiveSheet()->getCell($cellRange)->getHyperlink()->setUrl((string) $cell_ss['HRef']); - } - - if ((isset($cell_ss['MergeAcross'])) || (isset($cell_ss['MergeDown']))) { - $columnTo = $columnID; - if (isset($cell_ss['MergeAcross'])) { - $additionalMergedCells += (int) $cell_ss['MergeAcross']; - $columnTo = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($columnID) + $cell_ss['MergeAcross']); - } - $rowTo = $rowID; - if (isset($cell_ss['MergeDown'])) { - $rowTo = $rowTo + $cell_ss['MergeDown']; - } - $cellRange .= ':' . $columnTo . $rowTo; - $spreadsheet->getActiveSheet()->mergeCells($cellRange); - } - - $hasCalculatedValue = false; - $cellDataFormula = ''; - if (isset($cell_ss['Formula'])) { - $cellDataFormula = $cell_ss['Formula']; - $hasCalculatedValue = true; - } - if (isset($cell->Data)) { - $cellData = $cell->Data; - $cellValue = (string) $cellData; - $type = DataType::TYPE_NULL; - $cellData_ss = $cellData->attributes($namespaces['ss']); - if (isset($cellData_ss['Type'])) { - $cellDataType = $cellData_ss['Type']; - switch ($cellDataType) { - /* - const TYPE_STRING = 's'; - const TYPE_FORMULA = 'f'; - const TYPE_NUMERIC = 'n'; - const TYPE_BOOL = 'b'; - const TYPE_NULL = 'null'; - const TYPE_INLINE = 'inlineStr'; - const TYPE_ERROR = 'e'; - */ - case 'String': - $type = DataType::TYPE_STRING; - - break; - case 'Number': - $type = DataType::TYPE_NUMERIC; - $cellValue = (float) $cellValue; - if (floor($cellValue) == $cellValue) { - $cellValue = (int) $cellValue; - } - - break; - case 'Boolean': - $type = DataType::TYPE_BOOL; - $cellValue = ($cellValue != 0); - - break; - case 'DateTime': - $type = DataType::TYPE_NUMERIC; - $cellValue = Date::PHPToExcel(strtotime($cellValue . ' UTC')); - - break; - case 'Error': - $type = DataType::TYPE_ERROR; - $hasCalculatedValue = false; - - break; - } - } - - if ($hasCalculatedValue) { - $type = DataType::TYPE_FORMULA; - $columnNumber = Coordinate::columnIndexFromString($columnID); - $cellDataFormula = AddressHelper::convertFormulaToA1($cellDataFormula, $rowID, $columnNumber); - } - - $spreadsheet->getActiveSheet()->getCell($columnID . $rowID)->setValueExplicit((($hasCalculatedValue) ? $cellDataFormula : $cellValue), $type); - if ($hasCalculatedValue) { - $spreadsheet->getActiveSheet()->getCell($columnID . $rowID)->setCalculatedValue($cellValue); - } - $rowHasData = true; - } - - if (isset($cell->Comment)) { - $commentAttributes = $cell->Comment->attributes($namespaces['ss']); - $author = 'unknown'; - if (isset($commentAttributes->Author)) { - $author = (string) $commentAttributes->Author; - } - $node = $cell->Comment->Data->asXML(); - $annotation = strip_tags($node); - $spreadsheet->getActiveSheet()->getComment($columnID . $rowID)->setAuthor($author)->setText($this->parseRichText($annotation)); - } - - if (isset($cell_ss['StyleID'])) { - $style = (string) $cell_ss['StyleID']; - if ((isset($this->styles[$style])) && (!empty($this->styles[$style]))) { - //if (!$spreadsheet->getActiveSheet()->cellExists($columnID . $rowID)) { - // $spreadsheet->getActiveSheet()->getCell($columnID . $rowID)->setValue(null); - //} - $spreadsheet->getActiveSheet()->getStyle($cellRange)->applyFromArray($this->styles[$style]); - } - } - ++$columnID; - while ($additionalMergedCells > 0) { - ++$columnID; - --$additionalMergedCells; - } - } - - if ($rowHasData) { - if (isset($row_ss['Height'])) { - $rowHeight = $row_ss['Height']; - $spreadsheet->getActiveSheet()->getRowDimension($rowID)->setRowHeight($rowHeight); - } - } - - ++$rowID; - } - - $xmlX = $worksheet->children($namespaces['x']); - if (isset($xmlX->WorksheetOptions)) { - (new PageSettings($xmlX, $namespaces))->loadPageSettings($spreadsheet); - } - } - ++$worksheetID; - } - - // Globally scoped defined names - $activeWorksheet = $spreadsheet->setActiveSheetIndex(0); - if (isset($xml->Names[0])) { - foreach ($xml->Names[0] as $definedName) { - $definedName_ss = $definedName->attributes($namespaces['ss']); - $name = (string) $definedName_ss['Name']; - $definedValue = (string) $definedName_ss['RefersTo']; - $convertedValue = AddressHelper::convertFormulaToA1($definedValue); - if ($convertedValue[0] === '=') { - $convertedValue = substr($convertedValue, 1); - } - $spreadsheet->addDefinedName(DefinedName::createInstance($name, $activeWorksheet, $convertedValue)); - } - } - - // Return - return $spreadsheet; - } - - protected function parseRichText($is) - { - $value = new RichText(); - - $value->createText($is); - - return $value; - } - - private function parseStyles(SimpleXMLElement $xml, array $namespaces): void - { - if (!isset($xml->Styles)) { - return; - } - - foreach ($xml->Styles[0] as $style) { - $style_ss = $style->attributes($namespaces['ss']); - $styleID = (string) $style_ss['ID']; - $this->styles[$styleID] = (isset($this->styles['Default'])) ? $this->styles['Default'] : []; - foreach ($style as $styleType => $styleData) { - $styleAttributes = $styleData->attributes($namespaces['ss']); - switch ($styleType) { - case 'Alignment': - $this->parseStyleAlignment($styleID, $styleAttributes); - - break; - case 'Borders': - $this->parseStyleBorders($styleID, $styleData, $namespaces); - - break; - case 'Font': - $this->parseStyleFont($styleID, $styleAttributes); - - break; - case 'Interior': - $this->parseStyleInterior($styleID, $styleAttributes); - - break; - case 'NumberFormat': - $this->parseStyleNumberFormat($styleID, $styleAttributes); - - break; - } - } - } - } - - /** - * @param string $styleID - */ - private function parseStyleAlignment($styleID, SimpleXMLElement $styleAttributes): void - { - $verticalAlignmentStyles = [ - Alignment::VERTICAL_BOTTOM, - Alignment::VERTICAL_TOP, - Alignment::VERTICAL_CENTER, - Alignment::VERTICAL_JUSTIFY, - ]; - $horizontalAlignmentStyles = [ - Alignment::HORIZONTAL_GENERAL, - Alignment::HORIZONTAL_LEFT, - Alignment::HORIZONTAL_RIGHT, - Alignment::HORIZONTAL_CENTER, - Alignment::HORIZONTAL_CENTER_CONTINUOUS, - Alignment::HORIZONTAL_JUSTIFY, - ]; - - foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) { - $styleAttributeValue = (string) $styleAttributeValue; - switch ($styleAttributeKey) { - case 'Vertical': - if (self::identifyFixedStyleValue($verticalAlignmentStyles, $styleAttributeValue)) { - $this->styles[$styleID]['alignment']['vertical'] = $styleAttributeValue; - } - - break; - case 'Horizontal': - if (self::identifyFixedStyleValue($horizontalAlignmentStyles, $styleAttributeValue)) { - $this->styles[$styleID]['alignment']['horizontal'] = $styleAttributeValue; - } - - break; - case 'WrapText': - $this->styles[$styleID]['alignment']['wrapText'] = true; - - break; - case 'Rotate': - $this->styles[$styleID]['alignment']['textRotation'] = $styleAttributeValue; - - break; - } - } - } - - private static $borderPositions = ['top', 'left', 'bottom', 'right']; - - /** - * @param $styleID - */ - private function parseStyleBorders($styleID, SimpleXMLElement $styleData, array $namespaces): void - { - $diagonalDirection = ''; - $borderPosition = ''; - foreach ($styleData->Border as $borderStyle) { - $borderAttributes = $borderStyle->attributes($namespaces['ss']); - $thisBorder = []; - $style = (string) $borderAttributes->Weight; - $style .= strtolower((string) $borderAttributes->LineStyle); - $thisBorder['borderStyle'] = self::$mappings['borderStyle'][$style] ?? Border::BORDER_NONE; - foreach ($borderAttributes as $borderStyleKey => $borderStyleValue) { - switch ($borderStyleKey) { - case 'Position': - $borderStyleValue = strtolower((string) $borderStyleValue); - if (in_array($borderStyleValue, self::$borderPositions)) { - $borderPosition = $borderStyleValue; - } elseif ($borderStyleValue == 'diagonalleft') { - $diagonalDirection = $diagonalDirection ? Borders::DIAGONAL_BOTH : Borders::DIAGONAL_DOWN; - } elseif ($borderStyleValue == 'diagonalright') { - $diagonalDirection = $diagonalDirection ? Borders::DIAGONAL_BOTH : Borders::DIAGONAL_UP; - } - - break; - case 'Color': - $borderColour = substr($borderStyleValue, 1); - $thisBorder['color']['rgb'] = $borderColour; - - break; - } - } - if ($borderPosition) { - $this->styles[$styleID]['borders'][$borderPosition] = $thisBorder; - } elseif ($diagonalDirection) { - $this->styles[$styleID]['borders']['diagonalDirection'] = $diagonalDirection; - $this->styles[$styleID]['borders']['diagonal'] = $thisBorder; - } - } - } - - private static $underlineStyles = [ - Font::UNDERLINE_NONE, - Font::UNDERLINE_DOUBLE, - Font::UNDERLINE_DOUBLEACCOUNTING, - Font::UNDERLINE_SINGLE, - Font::UNDERLINE_SINGLEACCOUNTING, - ]; - - private function parseStyleFontUnderline(string $styleID, string $styleAttributeValue): void - { - if (self::identifyFixedStyleValue(self::$underlineStyles, $styleAttributeValue)) { - $this->styles[$styleID]['font']['underline'] = $styleAttributeValue; - } - } - - private function parseStyleFontVerticalAlign(string $styleID, string $styleAttributeValue): void - { - if ($styleAttributeValue == 'Superscript') { - $this->styles[$styleID]['font']['superscript'] = true; - } - if ($styleAttributeValue == 'Subscript') { - $this->styles[$styleID]['font']['subscript'] = true; - } - } - - /** - * @param $styleID - */ - private function parseStyleFont(string $styleID, SimpleXMLElement $styleAttributes): void - { - foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) { - $styleAttributeValue = (string) $styleAttributeValue; - switch ($styleAttributeKey) { - case 'FontName': - $this->styles[$styleID]['font']['name'] = $styleAttributeValue; - - break; - case 'Size': - $this->styles[$styleID]['font']['size'] = $styleAttributeValue; - - break; - case 'Color': - $this->styles[$styleID]['font']['color']['rgb'] = substr($styleAttributeValue, 1); - - break; - case 'Bold': - $this->styles[$styleID]['font']['bold'] = true; - - break; - case 'Italic': - $this->styles[$styleID]['font']['italic'] = true; - - break; - case 'Underline': - $this->parseStyleFontUnderline($styleID, $styleAttributeValue); - - break; - case 'VerticalAlign': - $this->parseStyleFontVerticalAlign($styleID, $styleAttributeValue); - - break; - } - } - } - - /** - * @param $styleID - */ - private function parseStyleInterior($styleID, SimpleXMLElement $styleAttributes): void - { - foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) { - switch ($styleAttributeKey) { - case 'Color': - $this->styles[$styleID]['fill']['endColor']['rgb'] = substr($styleAttributeValue, 1); - $this->styles[$styleID]['fill']['startColor']['rgb'] = substr($styleAttributeValue, 1); - - break; - case 'PatternColor': - $this->styles[$styleID]['fill']['startColor']['rgb'] = substr($styleAttributeValue, 1); - - break; - case 'Pattern': - $lcStyleAttributeValue = strtolower((string) $styleAttributeValue); - $this->styles[$styleID]['fill']['fillType'] = self::$mappings['fillType'][$lcStyleAttributeValue] ?? Fill::FILL_NONE; - - break; - } - } - } - - /** - * @param $styleID - */ - private function parseStyleNumberFormat($styleID, SimpleXMLElement $styleAttributes): void - { - $fromFormats = ['\-', '\ ']; - $toFormats = ['-', ' ']; - - foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) { - $styleAttributeValue = str_replace($fromFormats, $toFormats, $styleAttributeValue); - switch ($styleAttributeValue) { - case 'Short Date': - $styleAttributeValue = 'dd/mm/yyyy'; - - break; - } - - if ($styleAttributeValue > '') { - $this->styles[$styleID]['numberFormat']['formatCode'] = $styleAttributeValue; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/PageSettings.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/PageSettings.php deleted file mode 100644 index e56ac33..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/PageSettings.php +++ /dev/null @@ -1,130 +0,0 @@ -pageSetup($xmlX, $namespaces, $this->getPrintDefaults()); - $this->printSettings = $this->printSetup($xmlX, $printSettings); - } - - public function loadPageSettings(Spreadsheet $spreadsheet): void - { - $spreadsheet->getActiveSheet()->getPageSetup() - ->setPaperSize($this->printSettings->paperSize) - ->setOrientation($this->printSettings->orientation) - ->setScale($this->printSettings->scale) - ->setVerticalCentered($this->printSettings->verticalCentered) - ->setHorizontalCentered($this->printSettings->horizontalCentered) - ->setPageOrder($this->printSettings->printOrder); - $spreadsheet->getActiveSheet()->getPageMargins() - ->setTop($this->printSettings->topMargin) - ->setHeader($this->printSettings->headerMargin) - ->setLeft($this->printSettings->leftMargin) - ->setRight($this->printSettings->rightMargin) - ->setBottom($this->printSettings->bottomMargin) - ->setFooter($this->printSettings->footerMargin); - } - - private function getPrintDefaults(): stdClass - { - return (object) [ - 'paperSize' => 9, - 'orientation' => PageSetup::ORIENTATION_DEFAULT, - 'scale' => 100, - 'horizontalCentered' => false, - 'verticalCentered' => false, - 'printOrder' => PageSetup::PAGEORDER_DOWN_THEN_OVER, - 'topMargin' => 0.75, - 'headerMargin' => 0.3, - 'leftMargin' => 0.7, - 'rightMargin' => 0.7, - 'bottomMargin' => 0.75, - 'footerMargin' => 0.3, - ]; - } - - private function pageSetup(SimpleXMLElement $xmlX, array $namespaces, stdClass $printDefaults): stdClass - { - if (isset($xmlX->WorksheetOptions->PageSetup)) { - foreach ($xmlX->WorksheetOptions->PageSetup as $pageSetupData) { - foreach ($pageSetupData as $pageSetupKey => $pageSetupValue) { - $pageSetupAttributes = $pageSetupValue->attributes($namespaces['x']); - switch ($pageSetupKey) { - case 'Layout': - $this->setLayout($printDefaults, $pageSetupAttributes); - - break; - case 'Header': - $printDefaults->headerMargin = (float) $pageSetupAttributes->Margin ?: 1.0; - - break; - case 'Footer': - $printDefaults->footerMargin = (float) $pageSetupAttributes->Margin ?: 1.0; - - break; - case 'PageMargins': - $this->setMargins($printDefaults, $pageSetupAttributes); - - break; - } - } - } - } - - return $printDefaults; - } - - private function printSetup(SimpleXMLElement $xmlX, stdClass $printDefaults): stdClass - { - if (isset($xmlX->WorksheetOptions->Print)) { - foreach ($xmlX->WorksheetOptions->Print as $printData) { - foreach ($printData as $printKey => $printValue) { - switch ($printKey) { - case 'LeftToRight': - $printDefaults->printOrder = PageSetup::PAGEORDER_OVER_THEN_DOWN; - - break; - case 'PaperSizeIndex': - $printDefaults->paperSize = (int) $printValue ?: 9; - - break; - case 'Scale': - $printDefaults->scale = (int) $printValue ?: 100; - - break; - } - } - } - } - - return $printDefaults; - } - - private function setLayout(stdClass $printDefaults, SimpleXMLElement $pageSetupAttributes): void - { - $printDefaults->orientation = (string) strtolower($pageSetupAttributes->Orientation) ?: PageSetup::ORIENTATION_PORTRAIT; - $printDefaults->horizontalCentered = (bool) $pageSetupAttributes->CenterHorizontal ?: false; - $printDefaults->verticalCentered = (bool) $pageSetupAttributes->CenterVertical ?: false; - } - - private function setMargins(stdClass $printDefaults, SimpleXMLElement $pageSetupAttributes): void - { - $printDefaults->leftMargin = (float) $pageSetupAttributes->Left ?: 1.0; - $printDefaults->rightMargin = (float) $pageSetupAttributes->Right ?: 1.0; - $printDefaults->topMargin = (float) $pageSetupAttributes->Top ?: 1.0; - $printDefaults->bottomMargin = (float) $pageSetupAttributes->Bottom ?: 1.0; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php deleted file mode 100644 index 13f7cf7..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php +++ /dev/null @@ -1,1038 +0,0 @@ -= ($beforeRow + $pNumRows)) && - ($cellRow < $beforeRow) - ) { - return true; - } elseif ( - $pNumCols < 0 && - ($cellColumnIndex >= ($beforeColumnIndex + $pNumCols)) && - ($cellColumnIndex < $beforeColumnIndex) - ) { - return true; - } - - return false; - } - - /** - * Update page breaks when inserting/deleting rows/columns. - * - * @param Worksheet $pSheet The worksheet that we're editing - * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') - * @param int $beforeColumnIndex Index number of the column we're inserting/deleting before - * @param int $pNumCols Number of columns to insert/delete (negative values indicate deletion) - * @param int $beforeRow Number of the row we're inserting/deleting before - * @param int $pNumRows Number of rows to insert/delete (negative values indicate deletion) - */ - protected function adjustPageBreaks(Worksheet $pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows): void - { - $aBreaks = $pSheet->getBreaks(); - ($pNumCols > 0 || $pNumRows > 0) ? - uksort($aBreaks, ['self', 'cellReverseSort']) : uksort($aBreaks, ['self', 'cellSort']); - - foreach ($aBreaks as $key => $value) { - if (self::cellAddressInDeleteRange($key, $beforeRow, $pNumRows, $beforeColumnIndex, $pNumCols)) { - // If we're deleting, then clear any defined breaks that are within the range - // of rows/columns that we're deleting - $pSheet->setBreak($key, Worksheet::BREAK_NONE); - } else { - // Otherwise update any affected breaks by inserting a new break at the appropriate point - // and removing the old affected break - $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); - if ($key != $newReference) { - $pSheet->setBreak($newReference, $value) - ->setBreak($key, Worksheet::BREAK_NONE); - } - } - } - } - - /** - * Update cell comments when inserting/deleting rows/columns. - * - * @param Worksheet $pSheet The worksheet that we're editing - * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') - * @param int $beforeColumnIndex Index number of the column we're inserting/deleting before - * @param int $pNumCols Number of columns to insert/delete (negative values indicate deletion) - * @param int $beforeRow Number of the row we're inserting/deleting before - * @param int $pNumRows Number of rows to insert/delete (negative values indicate deletion) - */ - protected function adjustComments($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows): void - { - $aComments = $pSheet->getComments(); - $aNewComments = []; // the new array of all comments - - foreach ($aComments as $key => &$value) { - // Any comments inside a deleted range will be ignored - if (!self::cellAddressInDeleteRange($key, $beforeRow, $pNumRows, $beforeColumnIndex, $pNumCols)) { - // Otherwise build a new array of comments indexed by the adjusted cell reference - $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); - $aNewComments[$newReference] = $value; - } - } - // Replace the comments array with the new set of comments - $pSheet->setComments($aNewComments); - } - - /** - * Update hyperlinks when inserting/deleting rows/columns. - * - * @param Worksheet $pSheet The worksheet that we're editing - * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') - * @param int $beforeColumnIndex Index number of the column we're inserting/deleting before - * @param int $pNumCols Number of columns to insert/delete (negative values indicate deletion) - * @param int $beforeRow Number of the row we're inserting/deleting before - * @param int $pNumRows Number of rows to insert/delete (negative values indicate deletion) - */ - protected function adjustHyperlinks($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows): void - { - $aHyperlinkCollection = $pSheet->getHyperlinkCollection(); - ($pNumCols > 0 || $pNumRows > 0) ? - uksort($aHyperlinkCollection, ['self', 'cellReverseSort']) : uksort($aHyperlinkCollection, ['self', 'cellSort']); - - foreach ($aHyperlinkCollection as $key => $value) { - $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); - if ($key != $newReference) { - $pSheet->setHyperlink($newReference, $value); - $pSheet->setHyperlink($key, null); - } - } - } - - /** - * Update data validations when inserting/deleting rows/columns. - * - * @param Worksheet $pSheet The worksheet that we're editing - * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') - * @param int $beforeColumnIndex Index number of the column we're inserting/deleting before - * @param int $pNumCols Number of columns to insert/delete (negative values indicate deletion) - * @param int $beforeRow Number of the row we're inserting/deleting before - * @param int $pNumRows Number of rows to insert/delete (negative values indicate deletion) - */ - protected function adjustDataValidations($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows): void - { - $aDataValidationCollection = $pSheet->getDataValidationCollection(); - ($pNumCols > 0 || $pNumRows > 0) ? - uksort($aDataValidationCollection, ['self', 'cellReverseSort']) : uksort($aDataValidationCollection, ['self', 'cellSort']); - - foreach ($aDataValidationCollection as $key => $value) { - $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); - if ($key != $newReference) { - $pSheet->setDataValidation($newReference, $value); - $pSheet->setDataValidation($key, null); - } - } - } - - /** - * Update merged cells when inserting/deleting rows/columns. - * - * @param Worksheet $pSheet The worksheet that we're editing - * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') - * @param int $beforeColumnIndex Index number of the column we're inserting/deleting before - * @param int $pNumCols Number of columns to insert/delete (negative values indicate deletion) - * @param int $beforeRow Number of the row we're inserting/deleting before - * @param int $pNumRows Number of rows to insert/delete (negative values indicate deletion) - */ - protected function adjustMergeCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows): void - { - $aMergeCells = $pSheet->getMergeCells(); - $aNewMergeCells = []; // the new array of all merge cells - foreach ($aMergeCells as $key => &$value) { - $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); - $aNewMergeCells[$newReference] = $newReference; - } - $pSheet->setMergeCells($aNewMergeCells); // replace the merge cells array - } - - /** - * Update protected cells when inserting/deleting rows/columns. - * - * @param Worksheet $pSheet The worksheet that we're editing - * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') - * @param int $beforeColumnIndex Index number of the column we're inserting/deleting before - * @param int $pNumCols Number of columns to insert/delete (negative values indicate deletion) - * @param int $beforeRow Number of the row we're inserting/deleting before - * @param int $pNumRows Number of rows to insert/delete (negative values indicate deletion) - */ - protected function adjustProtectedCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows): void - { - $aProtectedCells = $pSheet->getProtectedCells(); - ($pNumCols > 0 || $pNumRows > 0) ? - uksort($aProtectedCells, ['self', 'cellReverseSort']) : uksort($aProtectedCells, ['self', 'cellSort']); - foreach ($aProtectedCells as $key => $value) { - $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); - if ($key != $newReference) { - $pSheet->protectCells($newReference, $value, true); - $pSheet->unprotectCells($key); - } - } - } - - /** - * Update column dimensions when inserting/deleting rows/columns. - * - * @param Worksheet $pSheet The worksheet that we're editing - * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') - * @param int $beforeColumnIndex Index number of the column we're inserting/deleting before - * @param int $pNumCols Number of columns to insert/delete (negative values indicate deletion) - * @param int $beforeRow Number of the row we're inserting/deleting before - * @param int $pNumRows Number of rows to insert/delete (negative values indicate deletion) - */ - protected function adjustColumnDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows): void - { - $aColumnDimensions = array_reverse($pSheet->getColumnDimensions(), true); - if (!empty($aColumnDimensions)) { - foreach ($aColumnDimensions as $objColumnDimension) { - $newReference = $this->updateCellReference($objColumnDimension->getColumnIndex() . '1', $pBefore, $pNumCols, $pNumRows); - [$newReference] = Coordinate::coordinateFromString($newReference); - if ($objColumnDimension->getColumnIndex() != $newReference) { - $objColumnDimension->setColumnIndex($newReference); - } - } - $pSheet->refreshColumnDimensions(); - } - } - - /** - * Update row dimensions when inserting/deleting rows/columns. - * - * @param Worksheet $pSheet The worksheet that we're editing - * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') - * @param int $beforeColumnIndex Index number of the column we're inserting/deleting before - * @param int $pNumCols Number of columns to insert/delete (negative values indicate deletion) - * @param int $beforeRow Number of the row we're inserting/deleting before - * @param int $pNumRows Number of rows to insert/delete (negative values indicate deletion) - */ - protected function adjustRowDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows): void - { - $aRowDimensions = array_reverse($pSheet->getRowDimensions(), true); - if (!empty($aRowDimensions)) { - foreach ($aRowDimensions as $objRowDimension) { - $newReference = $this->updateCellReference('A' . $objRowDimension->getRowIndex(), $pBefore, $pNumCols, $pNumRows); - [, $newReference] = Coordinate::coordinateFromString($newReference); - if ($objRowDimension->getRowIndex() != $newReference) { - $objRowDimension->setRowIndex($newReference); - } - } - $pSheet->refreshRowDimensions(); - - $copyDimension = $pSheet->getRowDimension($beforeRow - 1); - for ($i = $beforeRow; $i <= $beforeRow - 1 + $pNumRows; ++$i) { - $newDimension = $pSheet->getRowDimension($i); - $newDimension->setRowHeight($copyDimension->getRowHeight()); - $newDimension->setVisible($copyDimension->getVisible()); - $newDimension->setOutlineLevel($copyDimension->getOutlineLevel()); - $newDimension->setCollapsed($copyDimension->getCollapsed()); - } - } - } - - /** - * Insert a new column or row, updating all possible related data. - * - * @param string $pBefore Insert before this cell address (e.g. 'A1') - * @param int $pNumCols Number of columns to insert/delete (negative values indicate deletion) - * @param int $pNumRows Number of rows to insert/delete (negative values indicate deletion) - * @param Worksheet $pSheet The worksheet that we're editing - */ - public function insertNewBefore($pBefore, $pNumCols, $pNumRows, Worksheet $pSheet): void - { - $remove = ($pNumCols < 0 || $pNumRows < 0); - $allCoordinates = $pSheet->getCoordinates(); - - // Get coordinate of $pBefore - [$beforeColumn, $beforeRow] = Coordinate::coordinateFromString($pBefore); - $beforeColumnIndex = Coordinate::columnIndexFromString($beforeColumn); - - // Clear cells if we are removing columns or rows - $highestColumn = $pSheet->getHighestColumn(); - $highestRow = $pSheet->getHighestRow(); - - // 1. Clear column strips if we are removing columns - if ($pNumCols < 0 && $beforeColumnIndex - 2 + $pNumCols > 0) { - for ($i = 1; $i <= $highestRow - 1; ++$i) { - for ($j = $beforeColumnIndex - 1 + $pNumCols; $j <= $beforeColumnIndex - 2; ++$j) { - $coordinate = Coordinate::stringFromColumnIndex($j + 1) . $i; - $pSheet->removeConditionalStyles($coordinate); - if ($pSheet->cellExists($coordinate)) { - $pSheet->getCell($coordinate)->setValueExplicit('', DataType::TYPE_NULL); - $pSheet->getCell($coordinate)->setXfIndex(0); - } - } - } - } - - // 2. Clear row strips if we are removing rows - if ($pNumRows < 0 && $beforeRow - 1 + $pNumRows > 0) { - for ($i = $beforeColumnIndex - 1; $i <= Coordinate::columnIndexFromString($highestColumn) - 1; ++$i) { - for ($j = $beforeRow + $pNumRows; $j <= $beforeRow - 1; ++$j) { - $coordinate = Coordinate::stringFromColumnIndex($i + 1) . $j; - $pSheet->removeConditionalStyles($coordinate); - if ($pSheet->cellExists($coordinate)) { - $pSheet->getCell($coordinate)->setValueExplicit('', DataType::TYPE_NULL); - $pSheet->getCell($coordinate)->setXfIndex(0); - } - } - } - } - - // Loop through cells, bottom-up, and change cell coordinate - if ($remove) { - // It's faster to reverse and pop than to use unshift, especially with large cell collections - $allCoordinates = array_reverse($allCoordinates); - } - while ($coordinate = array_pop($allCoordinates)) { - $cell = $pSheet->getCell($coordinate); - $cellIndex = Coordinate::columnIndexFromString($cell->getColumn()); - - if ($cellIndex - 1 + $pNumCols < 0) { - continue; - } - - // New coordinate - $newCoordinate = Coordinate::stringFromColumnIndex($cellIndex + $pNumCols) . ($cell->getRow() + $pNumRows); - - // Should the cell be updated? Move value and cellXf index from one cell to another. - if (($cellIndex >= $beforeColumnIndex) && ($cell->getRow() >= $beforeRow)) { - // Update cell styles - $pSheet->getCell($newCoordinate)->setXfIndex($cell->getXfIndex()); - - // Insert this cell at its new location - if ($cell->getDataType() == DataType::TYPE_FORMULA) { - // Formula should be adjusted - $pSheet->getCell($newCoordinate) - ->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle())); - } else { - // Formula should not be adjusted - $pSheet->getCell($newCoordinate)->setValue($cell->getValue()); - } - - // Clear the original cell - $pSheet->getCellCollection()->delete($coordinate); - } else { - /* We don't need to update styles for rows/columns before our insertion position, - but we do still need to adjust any formulae in those cells */ - if ($cell->getDataType() == DataType::TYPE_FORMULA) { - // Formula should be adjusted - $cell->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle())); - } - } - } - - // Duplicate styles for the newly inserted cells - $highestColumn = $pSheet->getHighestColumn(); - $highestRow = $pSheet->getHighestRow(); - - if ($pNumCols > 0 && $beforeColumnIndex - 2 > 0) { - for ($i = $beforeRow; $i <= $highestRow - 1; ++$i) { - // Style - $coordinate = Coordinate::stringFromColumnIndex($beforeColumnIndex - 1) . $i; - if ($pSheet->cellExists($coordinate)) { - $xfIndex = $pSheet->getCell($coordinate)->getXfIndex(); - $conditionalStyles = $pSheet->conditionalStylesExists($coordinate) ? - $pSheet->getConditionalStyles($coordinate) : false; - for ($j = $beforeColumnIndex; $j <= $beforeColumnIndex - 1 + $pNumCols; ++$j) { - $pSheet->getCellByColumnAndRow($j, $i)->setXfIndex($xfIndex); - if ($conditionalStyles) { - $cloned = []; - foreach ($conditionalStyles as $conditionalStyle) { - $cloned[] = clone $conditionalStyle; - } - $pSheet->setConditionalStyles(Coordinate::stringFromColumnIndex($j) . $i, $cloned); - } - } - } - } - } - - if ($pNumRows > 0 && $beforeRow - 1 > 0) { - for ($i = $beforeColumnIndex; $i <= Coordinate::columnIndexFromString($highestColumn); ++$i) { - // Style - $coordinate = Coordinate::stringFromColumnIndex($i) . ($beforeRow - 1); - if ($pSheet->cellExists($coordinate)) { - $xfIndex = $pSheet->getCell($coordinate)->getXfIndex(); - $conditionalStyles = $pSheet->conditionalStylesExists($coordinate) ? - $pSheet->getConditionalStyles($coordinate) : false; - for ($j = $beforeRow; $j <= $beforeRow - 1 + $pNumRows; ++$j) { - $pSheet->getCell(Coordinate::stringFromColumnIndex($i) . $j)->setXfIndex($xfIndex); - if ($conditionalStyles) { - $cloned = []; - foreach ($conditionalStyles as $conditionalStyle) { - $cloned[] = clone $conditionalStyle; - } - $pSheet->setConditionalStyles(Coordinate::stringFromColumnIndex($i) . $j, $cloned); - } - } - } - } - } - - // Update worksheet: column dimensions - $this->adjustColumnDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); - - // Update worksheet: row dimensions - $this->adjustRowDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); - - // Update worksheet: page breaks - $this->adjustPageBreaks($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); - - // Update worksheet: comments - $this->adjustComments($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); - - // Update worksheet: hyperlinks - $this->adjustHyperlinks($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); - - // Update worksheet: data validations - $this->adjustDataValidations($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); - - // Update worksheet: merge cells - $this->adjustMergeCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); - - // Update worksheet: protected cells - $this->adjustProtectedCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); - - // Update worksheet: autofilter - $autoFilter = $pSheet->getAutoFilter(); - $autoFilterRange = $autoFilter->getRange(); - if (!empty($autoFilterRange)) { - if ($pNumCols != 0) { - $autoFilterColumns = $autoFilter->getColumns(); - if (count($autoFilterColumns) > 0) { - $column = ''; - $row = 0; - sscanf($pBefore, '%[A-Z]%d', $column, $row); - $columnIndex = Coordinate::columnIndexFromString($column); - [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($autoFilterRange); - if ($columnIndex <= $rangeEnd[0]) { - if ($pNumCols < 0) { - // If we're actually deleting any columns that fall within the autofilter range, - // then we delete any rules for those columns - $deleteColumn = $columnIndex + $pNumCols - 1; - $deleteCount = abs($pNumCols); - for ($i = 1; $i <= $deleteCount; ++$i) { - if (isset($autoFilterColumns[Coordinate::stringFromColumnIndex($deleteColumn + 1)])) { - $autoFilter->clearColumn(Coordinate::stringFromColumnIndex($deleteColumn + 1)); - } - ++$deleteColumn; - } - } - $startCol = ($columnIndex > $rangeStart[0]) ? $columnIndex : $rangeStart[0]; - - // Shuffle columns in autofilter range - if ($pNumCols > 0) { - $startColRef = $startCol; - $endColRef = $rangeEnd[0]; - $toColRef = $rangeEnd[0] + $pNumCols; - - do { - $autoFilter->shiftColumn(Coordinate::stringFromColumnIndex($endColRef), Coordinate::stringFromColumnIndex($toColRef)); - --$endColRef; - --$toColRef; - } while ($startColRef <= $endColRef); - } else { - // For delete, we shuffle from beginning to end to avoid overwriting - $startColID = Coordinate::stringFromColumnIndex($startCol); - $toColID = Coordinate::stringFromColumnIndex($startCol + $pNumCols); - $endColID = Coordinate::stringFromColumnIndex($rangeEnd[0] + 1); - do { - $autoFilter->shiftColumn($startColID, $toColID); - ++$startColID; - ++$toColID; - } while ($startColID != $endColID); - } - } - } - } - $pSheet->setAutoFilter($this->updateCellReference($autoFilterRange, $pBefore, $pNumCols, $pNumRows)); - } - - // Update worksheet: freeze pane - if ($pSheet->getFreezePane()) { - $splitCell = $pSheet->getFreezePane(); - $topLeftCell = $pSheet->getTopLeftCell(); - - $splitCell = $this->updateCellReference($splitCell, $pBefore, $pNumCols, $pNumRows); - $topLeftCell = $this->updateCellReference($topLeftCell, $pBefore, $pNumCols, $pNumRows); - - $pSheet->freezePane($splitCell, $topLeftCell); - } - - // Page setup - if ($pSheet->getPageSetup()->isPrintAreaSet()) { - $pSheet->getPageSetup()->setPrintArea($this->updateCellReference($pSheet->getPageSetup()->getPrintArea(), $pBefore, $pNumCols, $pNumRows)); - } - - // Update worksheet: drawings - $aDrawings = $pSheet->getDrawingCollection(); - foreach ($aDrawings as $objDrawing) { - $newReference = $this->updateCellReference($objDrawing->getCoordinates(), $pBefore, $pNumCols, $pNumRows); - if ($objDrawing->getCoordinates() != $newReference) { - $objDrawing->setCoordinates($newReference); - } - } - - // Update workbook: define names - if (count($pSheet->getParent()->getDefinedNames()) > 0) { - foreach ($pSheet->getParent()->getDefinedNames() as $definedName) { - if ($definedName->getWorksheet()->getHashCode() === $pSheet->getHashCode()) { - $definedName->setValue($this->updateCellReference($definedName->getValue(), $pBefore, $pNumCols, $pNumRows)); - } - } - } - - // Garbage collect - $pSheet->garbageCollect(); - } - - /** - * Update references within formulas. - * - * @param string $pFormula Formula to update - * @param string $pBefore Insert before this one - * @param int $pNumCols Number of columns to insert - * @param int $pNumRows Number of rows to insert - * @param string $sheetName Worksheet name/title - * - * @return string Updated formula - */ - public function updateFormulaReferences($pFormula = '', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0, $sheetName = '') - { - // Update cell references in the formula - $formulaBlocks = explode('"', $pFormula); - $i = false; - foreach ($formulaBlocks as &$formulaBlock) { - // Ignore blocks that were enclosed in quotes (alternating entries in the $formulaBlocks array after the explode) - if ($i = !$i) { - $adjustCount = 0; - $newCellTokens = $cellTokens = []; - // Search for row ranges (e.g. 'Sheet1'!3:5 or 3:5) with or without $ absolutes (e.g. $3:5) - $matchCount = preg_match_all('/' . self::REFHELPER_REGEXP_ROWRANGE . '/i', ' ' . $formulaBlock . ' ', $matches, PREG_SET_ORDER); - if ($matchCount > 0) { - foreach ($matches as $match) { - $fromString = ($match[2] > '') ? $match[2] . '!' : ''; - $fromString .= $match[3] . ':' . $match[4]; - $modified3 = substr($this->updateCellReference('$A' . $match[3], $pBefore, $pNumCols, $pNumRows), 2); - $modified4 = substr($this->updateCellReference('$A' . $match[4], $pBefore, $pNumCols, $pNumRows), 2); - - if ($match[3] . ':' . $match[4] !== $modified3 . ':' . $modified4) { - if (($match[2] == '') || (trim($match[2], "'") == $sheetName)) { - $toString = ($match[2] > '') ? $match[2] . '!' : ''; - $toString .= $modified3 . ':' . $modified4; - // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more - $column = 100000; - $row = 10000000 + trim($match[3], '$'); - $cellIndex = $column . $row; - - $newCellTokens[$cellIndex] = preg_quote($toString, '/'); - $cellTokens[$cellIndex] = '/(? 0) { - foreach ($matches as $match) { - $fromString = ($match[2] > '') ? $match[2] . '!' : ''; - $fromString .= $match[3] . ':' . $match[4]; - $modified3 = substr($this->updateCellReference($match[3] . '$1', $pBefore, $pNumCols, $pNumRows), 0, -2); - $modified4 = substr($this->updateCellReference($match[4] . '$1', $pBefore, $pNumCols, $pNumRows), 0, -2); - - if ($match[3] . ':' . $match[4] !== $modified3 . ':' . $modified4) { - if (($match[2] == '') || (trim($match[2], "'") == $sheetName)) { - $toString = ($match[2] > '') ? $match[2] . '!' : ''; - $toString .= $modified3 . ':' . $modified4; - // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more - $column = Coordinate::columnIndexFromString(trim($match[3], '$')) + 100000; - $row = 10000000; - $cellIndex = $column . $row; - - $newCellTokens[$cellIndex] = preg_quote($toString, '/'); - $cellTokens[$cellIndex] = '/(? 0) { - foreach ($matches as $match) { - $fromString = ($match[2] > '') ? $match[2] . '!' : ''; - $fromString .= $match[3] . ':' . $match[4]; - $modified3 = $this->updateCellReference($match[3], $pBefore, $pNumCols, $pNumRows); - $modified4 = $this->updateCellReference($match[4], $pBefore, $pNumCols, $pNumRows); - - if ($match[3] . $match[4] !== $modified3 . $modified4) { - if (($match[2] == '') || (trim($match[2], "'") == $sheetName)) { - $toString = ($match[2] > '') ? $match[2] . '!' : ''; - $toString .= $modified3 . ':' . $modified4; - [$column, $row] = Coordinate::coordinateFromString($match[3]); - // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more - $column = Coordinate::columnIndexFromString(trim($column, '$')) + 100000; - $row = trim($row, '$') + 10000000; - $cellIndex = $column . $row; - - $newCellTokens[$cellIndex] = preg_quote($toString, '/'); - $cellTokens[$cellIndex] = '/(? 0) { - foreach ($matches as $match) { - $fromString = ($match[2] > '') ? $match[2] . '!' : ''; - $fromString .= $match[3]; - - $modified3 = $this->updateCellReference($match[3], $pBefore, $pNumCols, $pNumRows); - if ($match[3] !== $modified3) { - if (($match[2] == '') || (trim($match[2], "'") == $sheetName)) { - $toString = ($match[2] > '') ? $match[2] . '!' : ''; - $toString .= $modified3; - [$column, $row] = Coordinate::coordinateFromString($match[3]); - // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more - $column = Coordinate::columnIndexFromString(trim($column, '$')) + 100000; - $row = trim($row, '$') + 10000000; - $cellIndex = $row . $column; - - $newCellTokens[$cellIndex] = preg_quote($toString, '/'); - $cellTokens[$cellIndex] = '/(? 0) { - if ($pNumCols > 0 || $pNumRows > 0) { - krsort($cellTokens); - krsort($newCellTokens); - } else { - ksort($cellTokens); - ksort($newCellTokens); - } // Update cell references in the formula - $formulaBlock = str_replace('\\', '', preg_replace($cellTokens, $newCellTokens, $formulaBlock)); - } - } - } - unset($formulaBlock); - - // Then rebuild the formula string - return implode('"', $formulaBlocks); - } - - /** - * Update all cell references within a formula, irrespective of worksheet. - */ - public function updateFormulaReferencesAnyWorksheet(string $formula = '', int $insertColumns = 0, int $insertRows = 0): string - { - $formula = $this->updateCellReferencesAllWorksheets($formula, $insertColumns, $insertRows); - - if ($insertColumns !== 0) { - $formula = $this->updateColumnRangesAllWorksheets($formula, $insertColumns); - } - - if ($insertRows !== 0) { - $formula = $this->updateRowRangesAllWorksheets($formula, $insertRows); - } - - return $formula; - } - - private function updateCellReferencesAllWorksheets(string $formula, int $insertColumns, int $insertRows): string - { - $splitCount = preg_match_all( - '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/mui', - $formula, - $splitRanges, - PREG_OFFSET_CAPTURE - ); - - $columnLengths = array_map('strlen', array_column($splitRanges[6], 0)); - $rowLengths = array_map('strlen', array_column($splitRanges[7], 0)); - $columnOffsets = array_column($splitRanges[6], 1); - $rowOffsets = array_column($splitRanges[7], 1); - - $columns = $splitRanges[6]; - $rows = $splitRanges[7]; - - while ($splitCount > 0) { - --$splitCount; - $columnLength = $columnLengths[$splitCount]; - $rowLength = $rowLengths[$splitCount]; - $columnOffset = $columnOffsets[$splitCount]; - $rowOffset = $rowOffsets[$splitCount]; - $column = $columns[$splitCount][0]; - $row = $rows[$splitCount][0]; - - if (!empty($column) && $column[0] !== '$') { - $column = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($column) + $insertColumns); - $formula = substr($formula, 0, $columnOffset) . $column . substr($formula, $columnOffset + $columnLength); - } - if (!empty($row) && $row[0] !== '$') { - $row += $insertRows; - $formula = substr($formula, 0, $rowOffset) . $row . substr($formula, $rowOffset + $rowLength); - } - } - - return $formula; - } - - private function updateColumnRangesAllWorksheets(string $formula, int $insertColumns): string - { - $splitCount = preg_match_all( - '/' . Calculation::CALCULATION_REGEXP_COLUMNRANGE_RELATIVE . '/mui', - $formula, - $splitRanges, - PREG_OFFSET_CAPTURE - ); - - $fromColumnLengths = array_map('strlen', array_column($splitRanges[1], 0)); - $fromColumnOffsets = array_column($splitRanges[1], 1); - $toColumnLengths = array_map('strlen', array_column($splitRanges[2], 0)); - $toColumnOffsets = array_column($splitRanges[2], 1); - - $fromColumns = $splitRanges[1]; - $toColumns = $splitRanges[2]; - - while ($splitCount > 0) { - --$splitCount; - $fromColumnLength = $fromColumnLengths[$splitCount]; - $toColumnLength = $toColumnLengths[$splitCount]; - $fromColumnOffset = $fromColumnOffsets[$splitCount]; - $toColumnOffset = $toColumnOffsets[$splitCount]; - $fromColumn = $fromColumns[$splitCount][0]; - $toColumn = $toColumns[$splitCount][0]; - - if (!empty($fromColumn) && $fromColumn[0] !== '$') { - $fromColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($fromColumn) + $insertColumns); - $formula = substr($formula, 0, $fromColumnOffset) . $fromColumn . substr($formula, $fromColumnOffset + $fromColumnLength); - } - if (!empty($toColumn) && $toColumn[0] !== '$') { - $toColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($toColumn) + $insertColumns); - $formula = substr($formula, 0, $toColumnOffset) . $toColumn . substr($formula, $toColumnOffset + $toColumnLength); - } - } - - return $formula; - } - - private function updateRowRangesAllWorksheets(string $formula, int $insertRows): string - { - $splitCount = preg_match_all( - '/' . Calculation::CALCULATION_REGEXP_ROWRANGE_RELATIVE . '/mui', - $formula, - $splitRanges, - PREG_OFFSET_CAPTURE - ); - - $fromRowLengths = array_map('strlen', array_column($splitRanges[1], 0)); - $fromRowOffsets = array_column($splitRanges[1], 1); - $toRowLengths = array_map('strlen', array_column($splitRanges[2], 0)); - $toRowOffsets = array_column($splitRanges[2], 1); - - $fromRows = $splitRanges[1]; - $toRows = $splitRanges[2]; - - while ($splitCount > 0) { - --$splitCount; - $fromRowLength = $fromRowLengths[$splitCount]; - $toRowLength = $toRowLengths[$splitCount]; - $fromRowOffset = $fromRowOffsets[$splitCount]; - $toRowOffset = $toRowOffsets[$splitCount]; - $fromRow = $fromRows[$splitCount][0]; - $toRow = $toRows[$splitCount][0]; - - if (!empty($fromRow) && $fromRow[0] !== '$') { - $fromRow += $insertRows; - $formula = substr($formula, 0, $fromRowOffset) . $fromRow . substr($formula, $fromRowOffset + $fromRowLength); - } - if (!empty($toRow) && $toRow[0] !== '$') { - $toRow += $insertRows; - $formula = substr($formula, 0, $toRowOffset) . $toRow . substr($formula, $toRowOffset + $toRowLength); - } - } - - return $formula; - } - - /** - * Update cell reference. - * - * @param string $pCellRange Cell range - * @param string $pBefore Insert before this one - * @param int $pNumCols Number of columns to increment - * @param int $pNumRows Number of rows to increment - * - * @return string Updated cell range - */ - public function updateCellReference($pCellRange = 'A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) - { - // Is it in another worksheet? Will not have to update anything. - if (strpos($pCellRange, '!') !== false) { - return $pCellRange; - // Is it a range or a single cell? - } elseif (!Coordinate::coordinateIsRange($pCellRange)) { - // Single cell - return $this->updateSingleCellReference($pCellRange, $pBefore, $pNumCols, $pNumRows); - } elseif (Coordinate::coordinateIsRange($pCellRange)) { - // Range - return $this->updateCellRange($pCellRange, $pBefore, $pNumCols, $pNumRows); - } - - // Return original - return $pCellRange; - } - - /** - * Update named formulas (i.e. containing worksheet references / named ranges). - * - * @param Spreadsheet $spreadsheet Object to update - * @param string $oldName Old name (name to replace) - * @param string $newName New name - */ - public function updateNamedFormulas(Spreadsheet $spreadsheet, $oldName = '', $newName = ''): void - { - if ($oldName == '') { - return; - } - - foreach ($spreadsheet->getWorksheetIterator() as $sheet) { - foreach ($sheet->getCoordinates(false) as $coordinate) { - $cell = $sheet->getCell($coordinate); - if (($cell !== null) && ($cell->getDataType() == DataType::TYPE_FORMULA)) { - $formula = $cell->getValue(); - if (strpos($formula, $oldName) !== false) { - $formula = str_replace("'" . $oldName . "'!", "'" . $newName . "'!", $formula); - $formula = str_replace($oldName . '!', $newName . '!', $formula); - $cell->setValueExplicit($formula, DataType::TYPE_FORMULA); - } - } - } - } - } - - /** - * Update cell range. - * - * @param string $pCellRange Cell range (e.g. 'B2:D4', 'B:C' or '2:3') - * @param string $pBefore Insert before this one - * @param int $pNumCols Number of columns to increment - * @param int $pNumRows Number of rows to increment - * - * @return string Updated cell range - */ - private function updateCellRange($pCellRange = 'A1:A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) - { - if (!Coordinate::coordinateIsRange($pCellRange)) { - throw new Exception('Only cell ranges may be passed to this method.'); - } - - // Update range - $range = Coordinate::splitRange($pCellRange); - $ic = count($range); - for ($i = 0; $i < $ic; ++$i) { - $jc = count($range[$i]); - for ($j = 0; $j < $jc; ++$j) { - if (ctype_alpha($range[$i][$j])) { - $r = Coordinate::coordinateFromString($this->updateSingleCellReference($range[$i][$j] . '1', $pBefore, $pNumCols, $pNumRows)); - $range[$i][$j] = $r[0]; - } elseif (ctype_digit($range[$i][$j])) { - $r = Coordinate::coordinateFromString($this->updateSingleCellReference('A' . $range[$i][$j], $pBefore, $pNumCols, $pNumRows)); - $range[$i][$j] = $r[1]; - } else { - $range[$i][$j] = $this->updateSingleCellReference($range[$i][$j], $pBefore, $pNumCols, $pNumRows); - } - } - } - - // Recreate range string - return Coordinate::buildRange($range); - } - - /** - * Update single cell reference. - * - * @param string $pCellReference Single cell reference - * @param string $pBefore Insert before this one - * @param int $pNumCols Number of columns to increment - * @param int $pNumRows Number of rows to increment - * - * @return string Updated cell reference - */ - private function updateSingleCellReference($pCellReference = 'A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) - { - if (Coordinate::coordinateIsRange($pCellReference)) { - throw new Exception('Only single cell references may be passed to this method.'); - } - - // Get coordinate of $pBefore - [$beforeColumn, $beforeRow] = Coordinate::coordinateFromString($pBefore); - - // Get coordinate of $pCellReference - [$newColumn, $newRow] = Coordinate::coordinateFromString($pCellReference); - - // Verify which parts should be updated - $updateColumn = (($newColumn[0] != '$') && ($beforeColumn[0] != '$') && (Coordinate::columnIndexFromString($newColumn) >= Coordinate::columnIndexFromString($beforeColumn))); - $updateRow = (($newRow[0] != '$') && ($beforeRow[0] != '$') && $newRow >= $beforeRow); - - // Create new column reference - if ($updateColumn) { - $newColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($newColumn) + $pNumCols); - } - - // Create new row reference - if ($updateRow) { - $newRow = $newRow + $pNumRows; - } - - // Return new reference - return $newColumn . $newRow; - } - - /** - * __clone implementation. Cloning should not be allowed in a Singleton! - */ - final public function __clone() - { - throw new Exception('Cloning a Singleton is not allowed!'); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/ITextElement.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/ITextElement.php deleted file mode 100644 index 6995467..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/ITextElement.php +++ /dev/null @@ -1,36 +0,0 @@ -richTextElements = []; - - // Rich-Text string attached to cell? - if ($pCell !== null) { - // Add cell text and style - if ($pCell->getValue() != '') { - $objRun = new Run($pCell->getValue()); - $objRun->setFont(clone $pCell->getWorksheet()->getStyle($pCell->getCoordinate())->getFont()); - $this->addText($objRun); - } - - // Set parent value - $pCell->setValueExplicit($this, DataType::TYPE_STRING); - } - } - - /** - * Add text. - * - * @param ITextElement $pText Rich text element - * - * @return $this - */ - public function addText(ITextElement $pText) - { - $this->richTextElements[] = $pText; - - return $this; - } - - /** - * Create text. - * - * @param string $pText Text - * - * @return TextElement - */ - public function createText($pText) - { - $objText = new TextElement($pText); - $this->addText($objText); - - return $objText; - } - - /** - * Create text run. - * - * @param string $pText Text - * - * @return Run - */ - public function createTextRun($pText) - { - $objText = new Run($pText); - $this->addText($objText); - - return $objText; - } - - /** - * Get plain text. - * - * @return string - */ - public function getPlainText() - { - // Return value - $returnValue = ''; - - // Loop through all ITextElements - foreach ($this->richTextElements as $text) { - $returnValue .= $text->getText(); - } - - return $returnValue; - } - - /** - * Convert to string. - * - * @return string - */ - public function __toString() - { - return $this->getPlainText(); - } - - /** - * Get Rich Text elements. - * - * @return ITextElement[] - */ - public function getRichTextElements() - { - return $this->richTextElements; - } - - /** - * Set Rich Text elements. - * - * @param ITextElement[] $textElements Array of elements - * - * @return $this - */ - public function setRichTextElements(array $textElements) - { - $this->richTextElements = $textElements; - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - $hashElements = ''; - foreach ($this->richTextElements as $element) { - $hashElements .= $element->getHashCode(); - } - - return md5( - $hashElements . - __CLASS__ - ); - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/Run.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/Run.php deleted file mode 100644 index 592d0e3..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/Run.php +++ /dev/null @@ -1,65 +0,0 @@ -font = new Font(); - } - - /** - * Get font. - * - * @return null|\PhpOffice\PhpSpreadsheet\Style\Font - */ - public function getFont() - { - return $this->font; - } - - /** - * Set font. - * - * @param Font $pFont Font - * - * @return $this - */ - public function setFont(?Font $pFont = null) - { - $this->font = $pFont; - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - return md5( - $this->getText() . - $this->font->getHashCode() . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/TextElement.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/TextElement.php deleted file mode 100644 index f8be5d5..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/TextElement.php +++ /dev/null @@ -1,86 +0,0 @@ -text = $pText; - } - - /** - * Get text. - * - * @return string Text - */ - public function getText() - { - return $this->text; - } - - /** - * Set text. - * - * @param $text string Text - * - * @return $this - */ - public function setText($text) - { - $this->text = $text; - - return $this; - } - - /** - * Get font. - * - * @return null|\PhpOffice\PhpSpreadsheet\Style\Font - */ - public function getFont() - { - return null; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - return md5( - $this->text . - __CLASS__ - ); - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php deleted file mode 100644 index cfa5057..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php +++ /dev/null @@ -1,218 +0,0 @@ -setLocale($locale); - } - - /** - * Identify to PhpSpreadsheet the external library to use for rendering charts. - * - * @param string $rendererClass Class name of the chart renderer - * eg: PhpOffice\PhpSpreadsheet\Chart\Renderer\JpGraph - */ - public static function setChartRenderer($rendererClass): void - { - if (!is_a($rendererClass, IRenderer::class, true)) { - throw new Exception('Chart renderer must implement ' . IRenderer::class); - } - - self::$chartRenderer = $rendererClass; - } - - /** - * Return the Chart Rendering Library that PhpSpreadsheet is currently configured to use. - * - * @return null|string Class name of the chart renderer - * eg: PhpOffice\PhpSpreadsheet\Chart\Renderer\JpGraph - */ - public static function getChartRenderer() - { - return self::$chartRenderer; - } - - /** - * Set default options for libxml loader. - * - * @param int $options Default options for libxml loader - */ - public static function setLibXmlLoaderOptions($options): void - { - if ($options === null && defined('LIBXML_DTDLOAD')) { - $options = LIBXML_DTDLOAD | LIBXML_DTDATTR; - } - self::$libXmlLoaderOptions = $options; - } - - /** - * Get default options for libxml loader. - * Defaults to LIBXML_DTDLOAD | LIBXML_DTDATTR when not set explicitly. - * - * @return int Default options for libxml loader - */ - public static function getLibXmlLoaderOptions() - { - if (self::$libXmlLoaderOptions === null && defined('LIBXML_DTDLOAD')) { - self::setLibXmlLoaderOptions(LIBXML_DTDLOAD | LIBXML_DTDATTR); - } elseif (self::$libXmlLoaderOptions === null) { - self::$libXmlLoaderOptions = true; - } - - return self::$libXmlLoaderOptions; - } - - /** - * Enable/Disable the entity loader for libxml loader. - * Allow/disallow libxml_disable_entity_loader() call when not thread safe. - * Default behaviour is to do the check, but if you're running PHP versions - * 7.2 < 7.2.1 - * then you may need to disable this check to prevent unwanted behaviour in other threads - * SECURITY WARNING: Changing this flag to false is not recommended. - * - * @param bool $state - */ - public static function setLibXmlDisableEntityLoader($state): void - { - self::$libXmlDisableEntityLoader = (bool) $state; - } - - /** - * Return the state of the entity loader (disabled/enabled) for libxml loader. - * - * @return bool $state - */ - public static function getLibXmlDisableEntityLoader() - { - return self::$libXmlDisableEntityLoader; - } - - /** - * Sets the implementation of cache that should be used for cell collection. - */ - public static function setCache(CacheInterface $cache): void - { - self::$cache = $cache; - } - - /** - * Gets the implementation of cache that should be used for cell collection. - * - * @return CacheInterface - */ - public static function getCache() - { - if (!self::$cache) { - self::$cache = new Memory(); - } - - return self::$cache; - } - - /** - * Set the HTTP client implementation to be used for network request. - */ - public static function setHttpClient(ClientInterface $httpClient, RequestFactoryInterface $requestFactory): void - { - self::$httpClient = $httpClient; - self::$requestFactory = $requestFactory; - } - - /** - * Unset the HTTP client configuration. - */ - public static function unsetHttpClient(): void - { - self::$httpClient = null; - self::$requestFactory = null; - } - - /** - * Get the HTTP client implementation to be used for network request. - */ - public static function getHttpClient(): ClientInterface - { - self::assertHttpClient(); - - return self::$httpClient; - } - - /** - * Get the HTTP request factory. - */ - public static function getRequestFactory(): RequestFactoryInterface - { - self::assertHttpClient(); - - return self::$requestFactory; - } - - private static function assertHttpClient(): void - { - if (!self::$httpClient || !self::$requestFactory) { - throw new Exception('HTTP client must be configured via Settings::setHttpClient() to be able to use WEBSERVICE function.'); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/CodePage.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/CodePage.php deleted file mode 100644 index 1d5d893..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/CodePage.php +++ /dev/null @@ -1,99 +0,0 @@ - 'CP1252', // CodePage is not always correctly set when the xls file was saved by Apple's Numbers program - 367 => 'ASCII', // ASCII - 437 => 'CP437', // OEM US - //720 => 'notsupported', // OEM Arabic - 737 => 'CP737', // OEM Greek - 775 => 'CP775', // OEM Baltic - 850 => 'CP850', // OEM Latin I - 852 => 'CP852', // OEM Latin II (Central European) - 855 => 'CP855', // OEM Cyrillic - 857 => 'CP857', // OEM Turkish - 858 => 'CP858', // OEM Multilingual Latin I with Euro - 860 => 'CP860', // OEM Portugese - 861 => 'CP861', // OEM Icelandic - 862 => 'CP862', // OEM Hebrew - 863 => 'CP863', // OEM Canadian (French) - 864 => 'CP864', // OEM Arabic - 865 => 'CP865', // OEM Nordic - 866 => 'CP866', // OEM Cyrillic (Russian) - 869 => 'CP869', // OEM Greek (Modern) - 874 => 'CP874', // ANSI Thai - 932 => 'CP932', // ANSI Japanese Shift-JIS - 936 => 'CP936', // ANSI Chinese Simplified GBK - 949 => 'CP949', // ANSI Korean (Wansung) - 950 => 'CP950', // ANSI Chinese Traditional BIG5 - 1200 => 'UTF-16LE', // UTF-16 (BIFF8) - 1250 => 'CP1250', // ANSI Latin II (Central European) - 1251 => 'CP1251', // ANSI Cyrillic - 1252 => 'CP1252', // ANSI Latin I (BIFF4-BIFF7) - 1253 => 'CP1253', // ANSI Greek - 1254 => 'CP1254', // ANSI Turkish - 1255 => 'CP1255', // ANSI Hebrew - 1256 => 'CP1256', // ANSI Arabic - 1257 => 'CP1257', // ANSI Baltic - 1258 => 'CP1258', // ANSI Vietnamese - 1361 => 'CP1361', // ANSI Korean (Johab) - 10000 => 'MAC', // Apple Roman - 10001 => 'CP932', // Macintosh Japanese - 10002 => 'CP950', // Macintosh Chinese Traditional - 10003 => 'CP1361', // Macintosh Korean - 10004 => 'MACARABIC', // Apple Arabic - 10005 => 'MACHEBREW', // Apple Hebrew - 10006 => 'MACGREEK', // Macintosh Greek - 10007 => 'MACCYRILLIC', // Macintosh Cyrillic - 10008 => 'CP936', // Macintosh - Simplified Chinese (GB 2312) - 10010 => 'MACROMANIA', // Macintosh Romania - 10017 => 'MACUKRAINE', // Macintosh Ukraine - 10021 => 'MACTHAI', // Macintosh Thai - 10029 => 'MACCENTRALEUROPE', // Macintosh Central Europe - 10079 => 'MACICELAND', // Macintosh Icelandic - 10081 => 'MACTURKISH', // Macintosh Turkish - 10082 => 'MACCROATIAN', // Macintosh Croatian - 21010 => 'UTF-16LE', // UTF-16 (BIFF8) This isn't correct, but some Excel writer libraries erroneously use Codepage 21010 for UTF-16LE - 32768 => 'MAC', // Apple Roman - //32769 => 'unsupported', // ANSI Latin I (BIFF2-BIFF3) - 65000 => 'UTF-7', // Unicode (UTF-7) - 65001 => 'UTF-8', // Unicode (UTF-8) - ]; - - public static function validate(string $codePage): bool - { - return in_array($codePage, self::$pageArray, true); - } - - /** - * Convert Microsoft Code Page Identifier to Code Page Name which iconv - * and mbstring understands. - * - * @param int $codePage Microsoft Code Page Indentifier - * - * @return string Code Page Name - */ - public static function numberToName(int $codePage): string - { - if (array_key_exists($codePage, self::$pageArray)) { - return self::$pageArray[$codePage]; - } - if ($codePage == 720 || $codePage == 32769) { - throw new PhpSpreadsheetException("Code page $codePage not supported."); // OEM Arabic - } - - throw new PhpSpreadsheetException('Unknown codepage: ' . $codePage); - } - - public static function getEncodings(): array - { - return self::$pageArray; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php deleted file mode 100644 index 180a715..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php +++ /dev/null @@ -1,492 +0,0 @@ - 'January', - 'Feb' => 'February', - 'Mar' => 'March', - 'Apr' => 'April', - 'May' => 'May', - 'Jun' => 'June', - 'Jul' => 'July', - 'Aug' => 'August', - 'Sep' => 'September', - 'Oct' => 'October', - 'Nov' => 'November', - 'Dec' => 'December', - ]; - - /** - * @var string[] - */ - public static $numberSuffixes = [ - 'st', - 'nd', - 'rd', - 'th', - ]; - - /** - * Base calendar year to use for calculations - * Value is either CALENDAR_WINDOWS_1900 (1900) or CALENDAR_MAC_1904 (1904). - * - * @var int - */ - protected static $excelCalendar = self::CALENDAR_WINDOWS_1900; - - /** - * Default timezone to use for DateTime objects. - * - * @var null|DateTimeZone - */ - protected static $defaultTimeZone; - - /** - * Set the Excel calendar (Windows 1900 or Mac 1904). - * - * @param int $baseDate Excel base date (1900 or 1904) - * - * @return bool Success or failure - */ - public static function setExcelCalendar($baseDate) - { - if ( - ($baseDate == self::CALENDAR_WINDOWS_1900) || - ($baseDate == self::CALENDAR_MAC_1904) - ) { - self::$excelCalendar = $baseDate; - - return true; - } - - return false; - } - - /** - * Return the Excel calendar (Windows 1900 or Mac 1904). - * - * @return int Excel base date (1900 or 1904) - */ - public static function getExcelCalendar() - { - return self::$excelCalendar; - } - - /** - * Set the Default timezone to use for dates. - * - * @param DateTimeZone|string $timeZone The timezone to set for all Excel datetimestamp to PHP DateTime Object conversions - * - * @return bool Success or failure - */ - public static function setDefaultTimezone($timeZone) - { - try { - $timeZone = self::validateTimeZone($timeZone); - self::$defaultTimeZone = $timeZone; - $retval = true; - } catch (PhpSpreadsheetException $e) { - $retval = false; - } - - return $retval; - } - - /** - * Return the Default timezone being used for dates. - * - * @return DateTimeZone The timezone being used as default for Excel timestamp to PHP DateTime object - */ - public static function getDefaultTimezone() - { - if (self::$defaultTimeZone === null) { - self::$defaultTimeZone = new DateTimeZone('UTC'); - } - - return self::$defaultTimeZone; - } - - /** - * Validate a timezone. - * - * @param DateTimeZone|string $timeZone The timezone to validate, either as a timezone string or object - * - * @return DateTimeZone The timezone as a timezone object - */ - private static function validateTimeZone($timeZone) - { - if ($timeZone instanceof DateTimeZone) { - return $timeZone; - } - if (in_array($timeZone, DateTimeZone::listIdentifiers(DateTimeZone::ALL_WITH_BC))) { - return new DateTimeZone($timeZone); - } - - throw new PhpSpreadsheetException('Invalid timezone'); - } - - /** - * Convert a MS serialized datetime value from Excel to a PHP Date/Time object. - * - * @param float|int $excelTimestamp MS Excel serialized date/time value - * @param null|DateTimeZone|string $timeZone The timezone to assume for the Excel timestamp, - * if you don't want to treat it as a UTC value - * Use the default (UST) unless you absolutely need a conversion - * - * @return \DateTime PHP date/time object - */ - public static function excelToDateTimeObject($excelTimestamp, $timeZone = null) - { - $timeZone = ($timeZone === null) ? self::getDefaultTimezone() : self::validateTimeZone($timeZone); - if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_EXCEL) { - if ($excelTimestamp < 1.0) { - // Unix timestamp base date - $baseDate = new \DateTime('1970-01-01', $timeZone); - } else { - // MS Excel calendar base dates - if (self::$excelCalendar == self::CALENDAR_WINDOWS_1900) { - // Allow adjustment for 1900 Leap Year in MS Excel - $baseDate = ($excelTimestamp < 60) ? new \DateTime('1899-12-31', $timeZone) : new \DateTime('1899-12-30', $timeZone); - } else { - $baseDate = new \DateTime('1904-01-01', $timeZone); - } - } - } else { - $baseDate = new \DateTime('1899-12-30', $timeZone); - } - - $days = floor($excelTimestamp); - $partDay = $excelTimestamp - $days; - $hours = floor($partDay * 24); - $partDay = $partDay * 24 - $hours; - $minutes = floor($partDay * 60); - $partDay = $partDay * 60 - $minutes; - $seconds = round($partDay * 60); - - if ($days >= 0) { - $days = '+' . $days; - } - $interval = $days . ' days'; - - return $baseDate->modify($interval) - ->setTime((int) $hours, (int) $minutes, (int) $seconds); - } - - /** - * Convert a MS serialized datetime value from Excel to a unix timestamp. - * - * @param float|int $excelTimestamp MS Excel serialized date/time value - * @param null|DateTimeZone|string $timeZone The timezone to assume for the Excel timestamp, - * if you don't want to treat it as a UTC value - * Use the default (UST) unless you absolutely need a conversion - * - * @return int Unix timetamp for this date/time - */ - public static function excelToTimestamp($excelTimestamp, $timeZone = null) - { - return (int) self::excelToDateTimeObject($excelTimestamp, $timeZone) - ->format('U'); - } - - /** - * Convert a date from PHP to an MS Excel serialized date/time value. - * - * @param mixed $dateValue Unix Timestamp or PHP DateTime object or a string - * - * @return bool|float Excel date/time value - * or boolean FALSE on failure - */ - public static function PHPToExcel($dateValue) - { - if ((is_object($dateValue)) && ($dateValue instanceof DateTimeInterface)) { - return self::dateTimeToExcel($dateValue); - } elseif (is_numeric($dateValue)) { - return self::timestampToExcel($dateValue); - } elseif (is_string($dateValue)) { - return self::stringToExcel($dateValue); - } - - return false; - } - - /** - * Convert a PHP DateTime object to an MS Excel serialized date/time value. - * - * @param DateTimeInterface $dateValue PHP DateTime object - * - * @return float MS Excel serialized date/time value - */ - public static function dateTimeToExcel(DateTimeInterface $dateValue) - { - return self::formattedPHPToExcel( - (int) $dateValue->format('Y'), - (int) $dateValue->format('m'), - (int) $dateValue->format('d'), - (int) $dateValue->format('H'), - (int) $dateValue->format('i'), - (int) $dateValue->format('s') - ); - } - - /** - * Convert a Unix timestamp to an MS Excel serialized date/time value. - * - * @param int $dateValue Unix Timestamp - * - * @return float MS Excel serialized date/time value - */ - public static function timestampToExcel($dateValue) - { - if (!is_numeric($dateValue)) { - return false; - } - - return self::dateTimeToExcel(new \DateTime('@' . $dateValue)); - } - - /** - * formattedPHPToExcel. - * - * @param int $year - * @param int $month - * @param int $day - * @param int $hours - * @param int $minutes - * @param int $seconds - * - * @return float Excel date/time value - */ - public static function formattedPHPToExcel($year, $month, $day, $hours = 0, $minutes = 0, $seconds = 0) - { - if (self::$excelCalendar == self::CALENDAR_WINDOWS_1900) { - // - // Fudge factor for the erroneous fact that the year 1900 is treated as a Leap Year in MS Excel - // This affects every date following 28th February 1900 - // - $excel1900isLeapYear = true; - if (($year == 1900) && ($month <= 2)) { - $excel1900isLeapYear = false; - } - $myexcelBaseDate = 2415020; - } else { - $myexcelBaseDate = 2416481; - $excel1900isLeapYear = false; - } - - // Julian base date Adjustment - if ($month > 2) { - $month -= 3; - } else { - $month += 9; - --$year; - } - - // Calculate the Julian Date, then subtract the Excel base date (JD 2415020 = 31-Dec-1899 Giving Excel Date of 0) - $century = substr($year, 0, 2); - $decade = substr($year, 2, 2); - $excelDate = floor((146097 * $century) / 4) + floor((1461 * $decade) / 4) + floor((153 * $month + 2) / 5) + $day + 1721119 - $myexcelBaseDate + $excel1900isLeapYear; - - $excelTime = (($hours * 3600) + ($minutes * 60) + $seconds) / 86400; - - return (float) $excelDate + $excelTime; - } - - /** - * Is a given cell a date/time? - * - * @return bool - */ - public static function isDateTime(Cell $pCell) - { - return is_numeric($pCell->getCalculatedValue()) && - self::isDateTimeFormat( - $pCell->getWorksheet()->getStyle( - $pCell->getCoordinate() - )->getNumberFormat() - ); - } - - /** - * Is a given number format a date/time? - * - * @return bool - */ - public static function isDateTimeFormat(NumberFormat $pFormat) - { - return self::isDateTimeFormatCode($pFormat->getFormatCode()); - } - - private static $possibleDateFormatCharacters = 'eymdHs'; - - /** - * Is a given number format code a date/time? - * - * @param string $pFormatCode - * - * @return bool - */ - public static function isDateTimeFormatCode($pFormatCode) - { - if (strtolower($pFormatCode) === strtolower(NumberFormat::FORMAT_GENERAL)) { - // "General" contains an epoch letter 'e', so we trap for it explicitly here (case-insensitive check) - return false; - } - if (preg_match('/[0#]E[+-]0/i', $pFormatCode)) { - // Scientific format - return false; - } - - // Switch on formatcode - switch ($pFormatCode) { - // Explicitly defined date formats - case NumberFormat::FORMAT_DATE_YYYYMMDD: - case NumberFormat::FORMAT_DATE_YYYYMMDD2: - case NumberFormat::FORMAT_DATE_DDMMYYYY: - case NumberFormat::FORMAT_DATE_DMYSLASH: - case NumberFormat::FORMAT_DATE_DMYMINUS: - case NumberFormat::FORMAT_DATE_DMMINUS: - case NumberFormat::FORMAT_DATE_MYMINUS: - case NumberFormat::FORMAT_DATE_DATETIME: - case NumberFormat::FORMAT_DATE_TIME1: - case NumberFormat::FORMAT_DATE_TIME2: - case NumberFormat::FORMAT_DATE_TIME3: - case NumberFormat::FORMAT_DATE_TIME4: - case NumberFormat::FORMAT_DATE_TIME5: - case NumberFormat::FORMAT_DATE_TIME6: - case NumberFormat::FORMAT_DATE_TIME7: - case NumberFormat::FORMAT_DATE_TIME8: - case NumberFormat::FORMAT_DATE_YYYYMMDDSLASH: - case NumberFormat::FORMAT_DATE_XLSX14: - case NumberFormat::FORMAT_DATE_XLSX15: - case NumberFormat::FORMAT_DATE_XLSX16: - case NumberFormat::FORMAT_DATE_XLSX17: - case NumberFormat::FORMAT_DATE_XLSX22: - return true; - } - - // Typically number, currency or accounting (or occasionally fraction) formats - if ((substr($pFormatCode, 0, 1) == '_') || (substr($pFormatCode, 0, 2) == '0 ')) { - return false; - } - // Some "special formats" provided in German Excel versions were detected as date time value, - // so filter them out here - "\C\H\-00000" (Switzerland) and "\D-00000" (Germany). - if (\strpos($pFormatCode, '-00000') !== false) { - return false; - } - // Try checking for any of the date formatting characters that don't appear within square braces - if (preg_match('/(^|\])[^\[]*[' . self::$possibleDateFormatCharacters . ']/i', $pFormatCode)) { - // We might also have a format mask containing quoted strings... - // we don't want to test for any of our characters within the quoted blocks - if (strpos($pFormatCode, '"') !== false) { - $segMatcher = false; - foreach (explode('"', $pFormatCode) as $subVal) { - // Only test in alternate array entries (the non-quoted blocks) - if ( - ($segMatcher = !$segMatcher) && - (preg_match('/(^|\])[^\[]*[' . self::$possibleDateFormatCharacters . ']/i', $subVal)) - ) { - return true; - } - } - - return false; - } - - return true; - } - - // No date... - return false; - } - - /** - * Convert a date/time string to Excel time. - * - * @param string $dateValue Examples: '2009-12-31', '2009-12-31 15:59', '2009-12-31 15:59:10' - * - * @return false|float Excel date/time serial value - */ - public static function stringToExcel($dateValue) - { - if (strlen($dateValue) < 2) { - return false; - } - if (!preg_match('/^(\d{1,4}[ \.\/\-][A-Z]{3,9}([ \.\/\-]\d{1,4})?|[A-Z]{3,9}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?|\d{1,4}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?)( \d{1,2}:\d{1,2}(:\d{1,2})?)?$/iu', $dateValue)) { - return false; - } - - $dateValueNew = DateTime::DATEVALUE($dateValue); - - if ($dateValueNew === Functions::VALUE()) { - return false; - } - - if (strpos($dateValue, ':') !== false) { - $timeValue = DateTime::TIMEVALUE($dateValue); - if ($timeValue === Functions::VALUE()) { - return false; - } - $dateValueNew += $timeValue; - } - - return $dateValueNew; - } - - /** - * Converts a month name (either a long or a short name) to a month number. - * - * @param string $month Month name or abbreviation - * - * @return int|string Month number (1 - 12), or the original string argument if it isn't a valid month name - */ - public static function monthStringToNumber($month) - { - $monthIndex = 1; - foreach (self::$monthNames as $shortMonthName => $longMonthName) { - if (($month === $longMonthName) || ($month === $shortMonthName)) { - return $monthIndex; - } - ++$monthIndex; - } - - return $month; - } - - /** - * Strips an ordinal from a numeric value. - * - * @param string $day Day number with an ordinal - * - * @return int|string The integer value with any ordinal stripped, or the original string argument if it isn't a valid numeric - */ - public static function dayStringToNumber($day) - { - $strippedDayValue = (str_replace(self::$numberSuffixes, '', $day)); - if (is_numeric($strippedDayValue)) { - return (int) $strippedDayValue; - } - - return $day; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Drawing.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Drawing.php deleted file mode 100644 index 25d6910..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Drawing.php +++ /dev/null @@ -1,249 +0,0 @@ -getName(); - $size = $pDefaultFont->getSize(); - - if (isset(Font::$defaultColumnWidths[$name][$size])) { - // Exact width can be determined - $colWidth = $pValue * Font::$defaultColumnWidths[$name][$size]['width'] / Font::$defaultColumnWidths[$name][$size]['px']; - } else { - // We don't have data for this particular font and size, use approximation by - // extrapolating from Calibri 11 - $colWidth = $pValue * 11 * Font::$defaultColumnWidths['Calibri'][11]['width'] / Font::$defaultColumnWidths['Calibri'][11]['px'] / $size; - } - - return $colWidth; - } - - /** - * Convert column width from (intrinsic) Excel units to pixels. - * - * @param float $pValue Value in cell dimension - * @param \PhpOffice\PhpSpreadsheet\Style\Font $pDefaultFont Default font of the workbook - * - * @return int Value in pixels - */ - public static function cellDimensionToPixels($pValue, \PhpOffice\PhpSpreadsheet\Style\Font $pDefaultFont) - { - // Font name and size - $name = $pDefaultFont->getName(); - $size = $pDefaultFont->getSize(); - - if (isset(Font::$defaultColumnWidths[$name][$size])) { - // Exact width can be determined - $colWidth = $pValue * Font::$defaultColumnWidths[$name][$size]['px'] / Font::$defaultColumnWidths[$name][$size]['width']; - } else { - // We don't have data for this particular font and size, use approximation by - // extrapolating from Calibri 11 - $colWidth = $pValue * $size * Font::$defaultColumnWidths['Calibri'][11]['px'] / Font::$defaultColumnWidths['Calibri'][11]['width'] / 11; - } - - // Round pixels to closest integer - $colWidth = (int) round($colWidth); - - return $colWidth; - } - - /** - * Convert pixels to points. - * - * @param int $pValue Value in pixels - * - * @return float Value in points - */ - public static function pixelsToPoints($pValue) - { - return $pValue * 0.67777777; - } - - /** - * Convert points to pixels. - * - * @param int $pValue Value in points - * - * @return int Value in pixels - */ - public static function pointsToPixels($pValue) - { - if ($pValue != 0) { - return (int) ceil($pValue * 1.333333333); - } - - return 0; - } - - /** - * Convert degrees to angle. - * - * @param int $pValue Degrees - * - * @return int Angle - */ - public static function degreesToAngle($pValue) - { - return (int) round($pValue * 60000); - } - - /** - * Convert angle to degrees. - * - * @param int $pValue Angle - * - * @return int Degrees - */ - public static function angleToDegrees($pValue) - { - if ($pValue != 0) { - return round($pValue / 60000); - } - - return 0; - } - - /** - * Create a new image from file. By alexander at alexauto dot nl. - * - * @see http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214 - * - * @param string $p_sFile Path to Windows DIB (BMP) image - * - * @return resource - */ - public static function imagecreatefrombmp($p_sFile) - { - // Load the image into a string - $file = fopen($p_sFile, 'rb'); - $read = fread($file, 10); - while (!feof($file) && ($read != '')) { - $read .= fread($file, 1024); - } - - $temp = unpack('H*', $read); - $hex = $temp[1]; - $header = substr($hex, 0, 108); - - // Process the header - // Structure: http://www.fastgraph.com/help/bmp_header_format.html - if (substr($header, 0, 4) == '424d') { - // Cut it in parts of 2 bytes - $header_parts = str_split($header, 2); - - // Get the width 4 bytes - $width = hexdec($header_parts[19] . $header_parts[18]); - - // Get the height 4 bytes - $height = hexdec($header_parts[23] . $header_parts[22]); - - // Unset the header params - unset($header_parts); - } - - // Define starting X and Y - $x = 0; - $y = 1; - - // Create newimage - $image = imagecreatetruecolor($width, $height); - - // Grab the body from the image - $body = substr($hex, 108); - - // Calculate if padding at the end-line is needed - // Divided by two to keep overview. - // 1 byte = 2 HEX-chars - $body_size = (strlen($body) / 2); - $header_size = ($width * $height); - - // Use end-line padding? Only when needed - $usePadding = ($body_size > ($header_size * 3) + 4); - - // Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption - // Calculate the next DWORD-position in the body - for ($i = 0; $i < $body_size; $i += 3) { - // Calculate line-ending and padding - if ($x >= $width) { - // If padding needed, ignore image-padding - // Shift i to the ending of the current 32-bit-block - if ($usePadding) { - $i += $width % 4; - } - - // Reset horizontal position - $x = 0; - - // Raise the height-position (bottom-up) - ++$y; - - // Reached the image-height? Break the for-loop - if ($y > $height) { - break; - } - } - - // Calculation of the RGB-pixel (defined as BGR in image-data) - // Define $i_pos as absolute position in the body - $i_pos = $i * 2; - $r = hexdec($body[$i_pos + 4] . $body[$i_pos + 5]); - $g = hexdec($body[$i_pos + 2] . $body[$i_pos + 3]); - $b = hexdec($body[$i_pos] . $body[$i_pos + 1]); - - // Calculate and draw the pixel - $color = imagecolorallocate($image, $r, $g, $b); - imagesetpixel($image, $x, $height - $y, $color); - - // Raise the horizontal position - ++$x; - } - - // Unset the body / free the memory - unset($body); - - // Return image-object - return $image; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher.php deleted file mode 100644 index c6d0a6f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher.php +++ /dev/null @@ -1,64 +0,0 @@ -dggContainer; - } - - /** - * Set Drawing Group Container. - * - * @param Escher\DggContainer $dggContainer - * - * @return Escher\DggContainer - */ - public function setDggContainer($dggContainer) - { - return $this->dggContainer = $dggContainer; - } - - /** - * Get Drawing Container. - * - * @return Escher\DgContainer - */ - public function getDgContainer() - { - return $this->dgContainer; - } - - /** - * Set Drawing Container. - * - * @param Escher\DgContainer $dgContainer - * - * @return Escher\DgContainer - */ - public function setDgContainer($dgContainer) - { - return $this->dgContainer = $dgContainer; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer.php deleted file mode 100644 index b0d75d7..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer.php +++ /dev/null @@ -1,52 +0,0 @@ -dgId; - } - - public function setDgId($value): void - { - $this->dgId = $value; - } - - public function getLastSpId() - { - return $this->lastSpId; - } - - public function setLastSpId($value): void - { - $this->lastSpId = $value; - } - - public function getSpgrContainer() - { - return $this->spgrContainer; - } - - public function setSpgrContainer($spgrContainer) - { - return $this->spgrContainer = $spgrContainer; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php deleted file mode 100644 index 1da8772..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php +++ /dev/null @@ -1,79 +0,0 @@ -parent = $parent; - } - - /** - * Get the parent Shape Group Container if any. - * - * @return null|\PhpOffice\PhpSpreadsheet\Shared\Escher\DgContainer\SpgrContainer - */ - public function getParent() - { - return $this->parent; - } - - /** - * Add a child. This will be either spgrContainer or spContainer. - * - * @param mixed $child - */ - public function addChild($child): void - { - $this->children[] = $child; - $child->setParent($this); - } - - /** - * Get collection of Shape Containers. - */ - public function getChildren() - { - return $this->children; - } - - /** - * Recursively get all spContainers within this spgrContainer. - * - * @return SpgrContainer\SpContainer[] - */ - public function getAllSpContainers() - { - $allSpContainers = []; - - foreach ($this->children as $child) { - if ($child instanceof self) { - $allSpContainers = array_merge($allSpContainers, $child->getAllSpContainers()); - } else { - $allSpContainers[] = $child; - } - } - - return $allSpContainers; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php deleted file mode 100644 index 8a81ff5..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php +++ /dev/null @@ -1,369 +0,0 @@ -parent = $parent; - } - - /** - * Get the parent Shape Group Container. - * - * @return SpgrContainer - */ - public function getParent() - { - return $this->parent; - } - - /** - * Set whether this is a group shape. - * - * @param bool $value - */ - public function setSpgr($value): void - { - $this->spgr = $value; - } - - /** - * Get whether this is a group shape. - * - * @return bool - */ - public function getSpgr() - { - return $this->spgr; - } - - /** - * Set the shape type. - * - * @param int $value - */ - public function setSpType($value): void - { - $this->spType = $value; - } - - /** - * Get the shape type. - * - * @return int - */ - public function getSpType() - { - return $this->spType; - } - - /** - * Set the shape flag. - * - * @param int $value - */ - public function setSpFlag($value): void - { - $this->spFlag = $value; - } - - /** - * Get the shape flag. - * - * @return int - */ - public function getSpFlag() - { - return $this->spFlag; - } - - /** - * Set the shape index. - * - * @param int $value - */ - public function setSpId($value): void - { - $this->spId = $value; - } - - /** - * Get the shape index. - * - * @return int - */ - public function getSpId() - { - return $this->spId; - } - - /** - * Set an option for the Shape Group Container. - * - * @param int $property The number specifies the option - * @param mixed $value - */ - public function setOPT($property, $value): void - { - $this->OPT[$property] = $value; - } - - /** - * Get an option for the Shape Group Container. - * - * @param int $property The number specifies the option - * - * @return mixed - */ - public function getOPT($property) - { - if (isset($this->OPT[$property])) { - return $this->OPT[$property]; - } - - return null; - } - - /** - * Get the collection of options. - * - * @return array - */ - public function getOPTCollection() - { - return $this->OPT; - } - - /** - * Set cell coordinates of upper-left corner of shape. - * - * @param string $value eg: 'A1' - */ - public function setStartCoordinates($value): void - { - $this->startCoordinates = $value; - } - - /** - * Get cell coordinates of upper-left corner of shape. - * - * @return string - */ - public function getStartCoordinates() - { - return $this->startCoordinates; - } - - /** - * Set offset in x-direction of upper-left corner of shape measured in 1/1024 of column width. - * - * @param int $startOffsetX - */ - public function setStartOffsetX($startOffsetX): void - { - $this->startOffsetX = $startOffsetX; - } - - /** - * Get offset in x-direction of upper-left corner of shape measured in 1/1024 of column width. - * - * @return int - */ - public function getStartOffsetX() - { - return $this->startOffsetX; - } - - /** - * Set offset in y-direction of upper-left corner of shape measured in 1/256 of row height. - * - * @param int $startOffsetY - */ - public function setStartOffsetY($startOffsetY): void - { - $this->startOffsetY = $startOffsetY; - } - - /** - * Get offset in y-direction of upper-left corner of shape measured in 1/256 of row height. - * - * @return int - */ - public function getStartOffsetY() - { - return $this->startOffsetY; - } - - /** - * Set cell coordinates of bottom-right corner of shape. - * - * @param string $value eg: 'A1' - */ - public function setEndCoordinates($value): void - { - $this->endCoordinates = $value; - } - - /** - * Get cell coordinates of bottom-right corner of shape. - * - * @return string - */ - public function getEndCoordinates() - { - return $this->endCoordinates; - } - - /** - * Set offset in x-direction of bottom-right corner of shape measured in 1/1024 of column width. - * - * @param int $endOffsetX - */ - public function setEndOffsetX($endOffsetX): void - { - $this->endOffsetX = $endOffsetX; - } - - /** - * Get offset in x-direction of bottom-right corner of shape measured in 1/1024 of column width. - * - * @return int - */ - public function getEndOffsetX() - { - return $this->endOffsetX; - } - - /** - * Set offset in y-direction of bottom-right corner of shape measured in 1/256 of row height. - * - * @param int $endOffsetY - */ - public function setEndOffsetY($endOffsetY): void - { - $this->endOffsetY = $endOffsetY; - } - - /** - * Get offset in y-direction of bottom-right corner of shape measured in 1/256 of row height. - * - * @return int - */ - public function getEndOffsetY() - { - return $this->endOffsetY; - } - - /** - * Get the nesting level of this spContainer. This is the number of spgrContainers between this spContainer and - * the dgContainer. A value of 1 = immediately within first spgrContainer - * Higher nesting level occurs if and only if spContainer is part of a shape group. - * - * @return int Nesting level - */ - public function getNestingLevel() - { - $nestingLevel = 0; - - $parent = $this->getParent(); - while ($parent instanceof SpgrContainer) { - ++$nestingLevel; - $parent = $parent->getParent(); - } - - return $nestingLevel; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer.php deleted file mode 100644 index 1bd15b9..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer.php +++ /dev/null @@ -1,175 +0,0 @@ -spIdMax; - } - - /** - * Set maximum shape index of all shapes in all drawings (plus one). - * - * @param int $value - */ - public function setSpIdMax($value): void - { - $this->spIdMax = $value; - } - - /** - * Get total number of drawings saved. - * - * @return int - */ - public function getCDgSaved() - { - return $this->cDgSaved; - } - - /** - * Set total number of drawings saved. - * - * @param int $value - */ - public function setCDgSaved($value): void - { - $this->cDgSaved = $value; - } - - /** - * Get total number of shapes saved (including group shapes). - * - * @return int - */ - public function getCSpSaved() - { - return $this->cSpSaved; - } - - /** - * Set total number of shapes saved (including group shapes). - * - * @param int $value - */ - public function setCSpSaved($value): void - { - $this->cSpSaved = $value; - } - - /** - * Get BLIP Store Container. - * - * @return DggContainer\BstoreContainer - */ - public function getBstoreContainer() - { - return $this->bstoreContainer; - } - - /** - * Set BLIP Store Container. - * - * @param DggContainer\BstoreContainer $bstoreContainer - */ - public function setBstoreContainer($bstoreContainer): void - { - $this->bstoreContainer = $bstoreContainer; - } - - /** - * Set an option for the drawing group. - * - * @param int $property The number specifies the option - * @param mixed $value - */ - public function setOPT($property, $value): void - { - $this->OPT[$property] = $value; - } - - /** - * Get an option for the drawing group. - * - * @param int $property The number specifies the option - * - * @return mixed - */ - public function getOPT($property) - { - if (isset($this->OPT[$property])) { - return $this->OPT[$property]; - } - - return null; - } - - /** - * Get identifier clusters. - * - * @return array - */ - public function getIDCLs() - { - return $this->IDCLs; - } - - /** - * Set identifier clusters. [ => , ...]. - * - * @param array $pValue - */ - public function setIDCLs($pValue): void - { - $this->IDCLs = $pValue; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer.php deleted file mode 100644 index b07786f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer.php +++ /dev/null @@ -1,34 +0,0 @@ -BSECollection[] = $BSE; - $BSE->setParent($this); - } - - /** - * Get the collection of BLIP Store Entries. - * - * @return BstoreContainer\BSE[] - */ - public function getBSECollection() - { - return $this->BSECollection; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE.php deleted file mode 100644 index e885146..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE.php +++ /dev/null @@ -1,89 +0,0 @@ -parent = $parent; - } - - /** - * Get the BLIP. - * - * @return BSE\Blip - */ - public function getBlip() - { - return $this->blip; - } - - /** - * Set the BLIP. - * - * @param BSE\Blip $blip - */ - public function setBlip($blip): void - { - $this->blip = $blip; - $blip->setParent($this); - } - - /** - * Get the BLIP type. - * - * @return int - */ - public function getBlipType() - { - return $this->blipType; - } - - /** - * Set the BLIP type. - * - * @param int $blipType - */ - public function setBlipType($blipType): void - { - $this->blipType = $blipType; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php deleted file mode 100644 index 500d7ea..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php +++ /dev/null @@ -1,60 +0,0 @@ -data; - } - - /** - * Set the raw image data. - * - * @param string $data - */ - public function setData($data): void - { - $this->data = $data; - } - - /** - * Set parent BSE. - * - * @param \PhpOffice\PhpSpreadsheet\Shared\Escher\DggContainer\BstoreContainer\BSE $parent - */ - public function setParent($parent): void - { - $this->parent = $parent; - } - - /** - * Get parent BSE. - * - * @return \PhpOffice\PhpSpreadsheet\Shared\Escher\DggContainer\BstoreContainer\BSE $parent - */ - public function getParent() - { - return $this->parent; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php deleted file mode 100644 index 7525df8..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php +++ /dev/null @@ -1,142 +0,0 @@ -open($zipFile) === true) { - $returnValue = ($zip->getFromName($archiveFile) !== false); - $zip->close(); - - return $returnValue; - } - - return false; - } - - return file_exists($pFilename); - } - - /** - * Returns canonicalized absolute pathname, also for ZIP archives. - * - * @param string $pFilename - * - * @return string - */ - public static function realpath($pFilename) - { - // Returnvalue - $returnValue = ''; - - // Try using realpath() - if (file_exists($pFilename)) { - $returnValue = realpath($pFilename); - } - - // Found something? - if ($returnValue == '' || ($returnValue === null)) { - $pathArray = explode('/', $pFilename); - while (in_array('..', $pathArray) && $pathArray[0] != '..') { - $iMax = count($pathArray); - for ($i = 0; $i < $iMax; ++$i) { - if ($pathArray[$i] == '..' && $i > 0) { - unset($pathArray[$i], $pathArray[$i - 1]); - - break; - } - } - } - $returnValue = implode('/', $pathArray); - } - - // Return - return $returnValue; - } - - /** - * Get the systems temporary directory. - * - * @return string - */ - public static function sysGetTempDir() - { - if (self::$useUploadTempDirectory) { - // use upload-directory when defined to allow running on environments having very restricted - // open_basedir configs - if (ini_get('upload_tmp_dir') !== false) { - if ($temp = ini_get('upload_tmp_dir')) { - if (file_exists($temp)) { - return realpath($temp); - } - } - } - } - - return realpath(sys_get_temp_dir()); - } - - /** - * Assert that given path is an existing file and is readable, otherwise throw exception. - * - * @param string $filename - */ - public static function assertFile($filename): void - { - if (!is_file($filename)) { - throw new InvalidArgumentException('File "' . $filename . '" does not exist.'); - } - - if (!is_readable($filename)) { - throw new InvalidArgumentException('Could not open "' . $filename . '" for reading.'); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php deleted file mode 100644 index ee1f8ab..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php +++ /dev/null @@ -1,763 +0,0 @@ - [ - 1 => ['px' => 24, 'width' => 12.00000000], - 2 => ['px' => 24, 'width' => 12.00000000], - 3 => ['px' => 32, 'width' => 10.66406250], - 4 => ['px' => 32, 'width' => 10.66406250], - 5 => ['px' => 40, 'width' => 10.00000000], - 6 => ['px' => 48, 'width' => 9.59765625], - 7 => ['px' => 48, 'width' => 9.59765625], - 8 => ['px' => 56, 'width' => 9.33203125], - 9 => ['px' => 64, 'width' => 9.14062500], - 10 => ['px' => 64, 'width' => 9.14062500], - ], - 'Calibri' => [ - 1 => ['px' => 24, 'width' => 12.00000000], - 2 => ['px' => 24, 'width' => 12.00000000], - 3 => ['px' => 32, 'width' => 10.66406250], - 4 => ['px' => 32, 'width' => 10.66406250], - 5 => ['px' => 40, 'width' => 10.00000000], - 6 => ['px' => 48, 'width' => 9.59765625], - 7 => ['px' => 48, 'width' => 9.59765625], - 8 => ['px' => 56, 'width' => 9.33203125], - 9 => ['px' => 56, 'width' => 9.33203125], - 10 => ['px' => 64, 'width' => 9.14062500], - 11 => ['px' => 64, 'width' => 9.14062500], - ], - 'Verdana' => [ - 1 => ['px' => 24, 'width' => 12.00000000], - 2 => ['px' => 24, 'width' => 12.00000000], - 3 => ['px' => 32, 'width' => 10.66406250], - 4 => ['px' => 32, 'width' => 10.66406250], - 5 => ['px' => 40, 'width' => 10.00000000], - 6 => ['px' => 48, 'width' => 9.59765625], - 7 => ['px' => 48, 'width' => 9.59765625], - 8 => ['px' => 64, 'width' => 9.14062500], - 9 => ['px' => 72, 'width' => 9.00000000], - 10 => ['px' => 72, 'width' => 9.00000000], - ], - ]; - - /** - * Set autoSize method. - * - * @param string $pValue see self::AUTOSIZE_METHOD_* - * - * @return bool Success or failure - */ - public static function setAutoSizeMethod($pValue) - { - if (!in_array($pValue, self::$autoSizeMethods)) { - return false; - } - self::$autoSizeMethod = $pValue; - - return true; - } - - /** - * Get autoSize method. - * - * @return string - */ - public static function getAutoSizeMethod() - { - return self::$autoSizeMethod; - } - - /** - * Set the path to the folder containing .ttf files. There should be a trailing slash. - * Typical locations on variout some platforms: - *
    - *
  • C:/Windows/Fonts/
  • - *
  • /usr/share/fonts/truetype/
  • - *
  • ~/.fonts/
  • - *
. - * - * @param string $pValue - */ - public static function setTrueTypeFontPath($pValue): void - { - self::$trueTypeFontPath = $pValue; - } - - /** - * Get the path to the folder containing .ttf files. - * - * @return string - */ - public static function getTrueTypeFontPath() - { - return self::$trueTypeFontPath; - } - - /** - * Calculate an (approximate) OpenXML column width, based on font size and text contained. - * - * @param \PhpOffice\PhpSpreadsheet\Style\Font $font Font object - * @param RichText|string $cellText Text to calculate width - * @param int $rotation Rotation angle - * @param null|\PhpOffice\PhpSpreadsheet\Style\Font $defaultFont Font object - * - * @return int Column width - */ - public static function calculateColumnWidth(\PhpOffice\PhpSpreadsheet\Style\Font $font, $cellText = '', $rotation = 0, ?\PhpOffice\PhpSpreadsheet\Style\Font $defaultFont = null) - { - // If it is rich text, use plain text - if ($cellText instanceof RichText) { - $cellText = $cellText->getPlainText(); - } - - // Special case if there are one or more newline characters ("\n") - if (strpos($cellText, "\n") !== false) { - $lineTexts = explode("\n", $cellText); - $lineWidths = []; - foreach ($lineTexts as $lineText) { - $lineWidths[] = self::calculateColumnWidth($font, $lineText, $rotation = 0, $defaultFont); - } - - return max($lineWidths); // width of longest line in cell - } - - // Try to get the exact text width in pixels - $approximate = self::$autoSizeMethod == self::AUTOSIZE_METHOD_APPROX; - if (!$approximate) { - $columnWidthAdjust = ceil(self::getTextWidthPixelsExact('n', $font, 0) * 1.07); - - try { - // Width of text in pixels excl. padding - // and addition because Excel adds some padding, just use approx width of 'n' glyph - $columnWidth = self::getTextWidthPixelsExact($cellText, $font, $rotation) + $columnWidthAdjust; - } catch (PhpSpreadsheetException $e) { - $approximate = true; - } - } - - if ($approximate) { - $columnWidthAdjust = self::getTextWidthPixelsApprox('n', $font, 0); - // Width of text in pixels excl. padding, approximation - // and addition because Excel adds some padding, just use approx width of 'n' glyph - $columnWidth = self::getTextWidthPixelsApprox($cellText, $font, $rotation) + $columnWidthAdjust; - } - - // Convert from pixel width to column width - $columnWidth = Drawing::pixelsToCellDimension($columnWidth, $defaultFont); - - // Return - return round($columnWidth, 6); - } - - /** - * Get GD text width in pixels for a string of text in a certain font at a certain rotation angle. - * - * @param string $text - * @param \PhpOffice\PhpSpreadsheet\Style\Font - * @param int $rotation - * - * @return int - */ - public static function getTextWidthPixelsExact($text, \PhpOffice\PhpSpreadsheet\Style\Font $font, $rotation = 0) - { - if (!function_exists('imagettfbbox')) { - throw new PhpSpreadsheetException('GD library needs to be enabled'); - } - - // font size should really be supplied in pixels in GD2, - // but since GD2 seems to assume 72dpi, pixels and points are the same - $fontFile = self::getTrueTypeFontFileFromFont($font); - $textBox = imagettfbbox($font->getSize(), $rotation, $fontFile, $text); - - // Get corners positions - $lowerLeftCornerX = $textBox[0]; - $lowerRightCornerX = $textBox[2]; - $upperRightCornerX = $textBox[4]; - $upperLeftCornerX = $textBox[6]; - - // Consider the rotation when calculating the width - return max($lowerRightCornerX - $upperLeftCornerX, $upperRightCornerX - $lowerLeftCornerX); - } - - /** - * Get approximate width in pixels for a string of text in a certain font at a certain rotation angle. - * - * @param string $columnText - * @param int $rotation - * - * @return int Text width in pixels (no padding added) - */ - public static function getTextWidthPixelsApprox($columnText, \PhpOffice\PhpSpreadsheet\Style\Font $font, $rotation = 0) - { - $fontName = $font->getName(); - $fontSize = $font->getSize(); - - // Calculate column width in pixels. We assume fixed glyph width. Result varies with font name and size. - switch ($fontName) { - case 'Calibri': - // value 8.26 was found via interpolation by inspecting real Excel files with Calibri 11 font. - $columnWidth = (int) (8.26 * StringHelper::countCharacters($columnText)); - $columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size - - break; - case 'Arial': - // value 8 was set because of experience in different exports at Arial 10 font. - $columnWidth = (int) (8 * StringHelper::countCharacters($columnText)); - $columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size - - break; - case 'Verdana': - // value 8 was found via interpolation by inspecting real Excel files with Verdana 10 font. - $columnWidth = (int) (8 * StringHelper::countCharacters($columnText)); - $columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size - - break; - default: - // just assume Calibri - $columnWidth = (int) (8.26 * StringHelper::countCharacters($columnText)); - $columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size - - break; - } - - // Calculate approximate rotated column width - if ($rotation !== 0) { - if ($rotation == -165) { - // stacked text - $columnWidth = 4; // approximation - } else { - // rotated text - $columnWidth = $columnWidth * cos(deg2rad($rotation)) - + $fontSize * abs(sin(deg2rad($rotation))) / 5; // approximation - } - } - - // pixel width is an integer - return (int) $columnWidth; - } - - /** - * Calculate an (approximate) pixel size, based on a font points size. - * - * @param int $fontSizeInPoints Font size (in points) - * - * @return int Font size (in pixels) - */ - public static function fontSizeToPixels($fontSizeInPoints) - { - return (int) ((4 / 3) * $fontSizeInPoints); - } - - /** - * Calculate an (approximate) pixel size, based on inch size. - * - * @param int $sizeInInch Font size (in inch) - * - * @return int Size (in pixels) - */ - public static function inchSizeToPixels($sizeInInch) - { - return $sizeInInch * 96; - } - - /** - * Calculate an (approximate) pixel size, based on centimeter size. - * - * @param int $sizeInCm Font size (in centimeters) - * - * @return float Size (in pixels) - */ - public static function centimeterSizeToPixels($sizeInCm) - { - return $sizeInCm * 37.795275591; - } - - /** - * Returns the font path given the font. - * - * @param \PhpOffice\PhpSpreadsheet\Style\Font $font - * - * @return string Path to TrueType font file - */ - public static function getTrueTypeFontFileFromFont($font) - { - if (!file_exists(self::$trueTypeFontPath) || !is_dir(self::$trueTypeFontPath)) { - throw new PhpSpreadsheetException('Valid directory to TrueType Font files not specified'); - } - - $name = $font->getName(); - $bold = $font->getBold(); - $italic = $font->getItalic(); - - // Check if we can map font to true type font file - switch ($name) { - case 'Arial': - $fontFile = ( - $bold ? ($italic ? self::ARIAL_BOLD_ITALIC : self::ARIAL_BOLD) - : ($italic ? self::ARIAL_ITALIC : self::ARIAL) - ); - - break; - case 'Calibri': - $fontFile = ( - $bold ? ($italic ? self::CALIBRI_BOLD_ITALIC : self::CALIBRI_BOLD) - : ($italic ? self::CALIBRI_ITALIC : self::CALIBRI) - ); - - break; - case 'Courier New': - $fontFile = ( - $bold ? ($italic ? self::COURIER_NEW_BOLD_ITALIC : self::COURIER_NEW_BOLD) - : ($italic ? self::COURIER_NEW_ITALIC : self::COURIER_NEW) - ); - - break; - case 'Comic Sans MS': - $fontFile = ( - $bold ? self::COMIC_SANS_MS_BOLD : self::COMIC_SANS_MS - ); - - break; - case 'Georgia': - $fontFile = ( - $bold ? ($italic ? self::GEORGIA_BOLD_ITALIC : self::GEORGIA_BOLD) - : ($italic ? self::GEORGIA_ITALIC : self::GEORGIA) - ); - - break; - case 'Impact': - $fontFile = self::IMPACT; - - break; - case 'Liberation Sans': - $fontFile = ( - $bold ? ($italic ? self::LIBERATION_SANS_BOLD_ITALIC : self::LIBERATION_SANS_BOLD) - : ($italic ? self::LIBERATION_SANS_ITALIC : self::LIBERATION_SANS) - ); - - break; - case 'Lucida Console': - $fontFile = self::LUCIDA_CONSOLE; - - break; - case 'Lucida Sans Unicode': - $fontFile = self::LUCIDA_SANS_UNICODE; - - break; - case 'Microsoft Sans Serif': - $fontFile = self::MICROSOFT_SANS_SERIF; - - break; - case 'Palatino Linotype': - $fontFile = ( - $bold ? ($italic ? self::PALATINO_LINOTYPE_BOLD_ITALIC : self::PALATINO_LINOTYPE_BOLD) - : ($italic ? self::PALATINO_LINOTYPE_ITALIC : self::PALATINO_LINOTYPE) - ); - - break; - case 'Symbol': - $fontFile = self::SYMBOL; - - break; - case 'Tahoma': - $fontFile = ( - $bold ? self::TAHOMA_BOLD : self::TAHOMA - ); - - break; - case 'Times New Roman': - $fontFile = ( - $bold ? ($italic ? self::TIMES_NEW_ROMAN_BOLD_ITALIC : self::TIMES_NEW_ROMAN_BOLD) - : ($italic ? self::TIMES_NEW_ROMAN_ITALIC : self::TIMES_NEW_ROMAN) - ); - - break; - case 'Trebuchet MS': - $fontFile = ( - $bold ? ($italic ? self::TREBUCHET_MS_BOLD_ITALIC : self::TREBUCHET_MS_BOLD) - : ($italic ? self::TREBUCHET_MS_ITALIC : self::TREBUCHET_MS) - ); - - break; - case 'Verdana': - $fontFile = ( - $bold ? ($italic ? self::VERDANA_BOLD_ITALIC : self::VERDANA_BOLD) - : ($italic ? self::VERDANA_ITALIC : self::VERDANA) - ); - - break; - default: - throw new PhpSpreadsheetException('Unknown font name "' . $name . '". Cannot map to TrueType font file'); - - break; - } - - $fontFile = self::$trueTypeFontPath . $fontFile; - - // Check if file actually exists - if (!file_exists($fontFile)) { - throw new PhpSpreadsheetException('TrueType Font file not found'); - } - - return $fontFile; - } - - /** - * Returns the associated charset for the font name. - * - * @param string $name Font name - * - * @return int Character set code - */ - public static function getCharsetFromFontName($name) - { - switch ($name) { - // Add more cases. Check FONT records in real Excel files. - case 'EucrosiaUPC': - return self::CHARSET_ANSI_THAI; - case 'Wingdings': - return self::CHARSET_SYMBOL; - case 'Wingdings 2': - return self::CHARSET_SYMBOL; - case 'Wingdings 3': - return self::CHARSET_SYMBOL; - default: - return self::CHARSET_ANSI_LATIN; - } - } - - /** - * Get the effective column width for columns without a column dimension or column with width -1 - * For example, for Calibri 11 this is 9.140625 (64 px). - * - * @param \PhpOffice\PhpSpreadsheet\Style\Font $font The workbooks default font - * @param bool $pPixels true = return column width in pixels, false = return in OOXML units - * - * @return mixed Column width - */ - public static function getDefaultColumnWidthByFont(\PhpOffice\PhpSpreadsheet\Style\Font $font, $pPixels = false) - { - if (isset(self::$defaultColumnWidths[$font->getName()][$font->getSize()])) { - // Exact width can be determined - $columnWidth = $pPixels ? - self::$defaultColumnWidths[$font->getName()][$font->getSize()]['px'] - : self::$defaultColumnWidths[$font->getName()][$font->getSize()]['width']; - } else { - // We don't have data for this particular font and size, use approximation by - // extrapolating from Calibri 11 - $columnWidth = $pPixels ? - self::$defaultColumnWidths['Calibri'][11]['px'] - : self::$defaultColumnWidths['Calibri'][11]['width']; - $columnWidth = $columnWidth * $font->getSize() / 11; - - // Round pixels to closest integer - if ($pPixels) { - $columnWidth = (int) round($columnWidth); - } - } - - return $columnWidth; - } - - /** - * Get the effective row height for rows without a row dimension or rows with height -1 - * For example, for Calibri 11 this is 15 points. - * - * @param \PhpOffice\PhpSpreadsheet\Style\Font $font The workbooks default font - * - * @return float Row height in points - */ - public static function getDefaultRowHeightByFont(\PhpOffice\PhpSpreadsheet\Style\Font $font) - { - switch ($font->getName()) { - case 'Arial': - switch ($font->getSize()) { - case 10: - // inspection of Arial 10 workbook says 12.75pt ~17px - $rowHeight = 12.75; - - break; - case 9: - // inspection of Arial 9 workbook says 12.00pt ~16px - $rowHeight = 12; - - break; - case 8: - // inspection of Arial 8 workbook says 11.25pt ~15px - $rowHeight = 11.25; - - break; - case 7: - // inspection of Arial 7 workbook says 9.00pt ~12px - $rowHeight = 9; - - break; - case 6: - case 5: - // inspection of Arial 5,6 workbook says 8.25pt ~11px - $rowHeight = 8.25; - - break; - case 4: - // inspection of Arial 4 workbook says 6.75pt ~9px - $rowHeight = 6.75; - - break; - case 3: - // inspection of Arial 3 workbook says 6.00pt ~8px - $rowHeight = 6; - - break; - case 2: - case 1: - // inspection of Arial 1,2 workbook says 5.25pt ~7px - $rowHeight = 5.25; - - break; - default: - // use Arial 10 workbook as an approximation, extrapolation - $rowHeight = 12.75 * $font->getSize() / 10; - - break; - } - - break; - case 'Calibri': - switch ($font->getSize()) { - case 11: - // inspection of Calibri 11 workbook says 15.00pt ~20px - $rowHeight = 15; - - break; - case 10: - // inspection of Calibri 10 workbook says 12.75pt ~17px - $rowHeight = 12.75; - - break; - case 9: - // inspection of Calibri 9 workbook says 12.00pt ~16px - $rowHeight = 12; - - break; - case 8: - // inspection of Calibri 8 workbook says 11.25pt ~15px - $rowHeight = 11.25; - - break; - case 7: - // inspection of Calibri 7 workbook says 9.00pt ~12px - $rowHeight = 9; - - break; - case 6: - case 5: - // inspection of Calibri 5,6 workbook says 8.25pt ~11px - $rowHeight = 8.25; - - break; - case 4: - // inspection of Calibri 4 workbook says 6.75pt ~9px - $rowHeight = 6.75; - - break; - case 3: - // inspection of Calibri 3 workbook says 6.00pt ~8px - $rowHeight = 6.00; - - break; - case 2: - case 1: - // inspection of Calibri 1,2 workbook says 5.25pt ~7px - $rowHeight = 5.25; - - break; - default: - // use Calibri 11 workbook as an approximation, extrapolation - $rowHeight = 15 * $font->getSize() / 11; - - break; - } - - break; - case 'Verdana': - switch ($font->getSize()) { - case 10: - // inspection of Verdana 10 workbook says 12.75pt ~17px - $rowHeight = 12.75; - - break; - case 9: - // inspection of Verdana 9 workbook says 11.25pt ~15px - $rowHeight = 11.25; - - break; - case 8: - // inspection of Verdana 8 workbook says 10.50pt ~14px - $rowHeight = 10.50; - - break; - case 7: - // inspection of Verdana 7 workbook says 9.00pt ~12px - $rowHeight = 9.00; - - break; - case 6: - case 5: - // inspection of Verdana 5,6 workbook says 8.25pt ~11px - $rowHeight = 8.25; - - break; - case 4: - // inspection of Verdana 4 workbook says 6.75pt ~9px - $rowHeight = 6.75; - - break; - case 3: - // inspection of Verdana 3 workbook says 6.00pt ~8px - $rowHeight = 6; - - break; - case 2: - case 1: - // inspection of Verdana 1,2 workbook says 5.25pt ~7px - $rowHeight = 5.25; - - break; - default: - // use Verdana 10 workbook as an approximation, extrapolation - $rowHeight = 12.75 * $font->getSize() / 10; - - break; - } - - break; - default: - // just use Calibri as an approximation - $rowHeight = 15 * $font->getSize() / 11; - - break; - } - - return $rowHeight; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/CHANGELOG.TXT b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/CHANGELOG.TXT deleted file mode 100644 index 1c18a5d..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/CHANGELOG.TXT +++ /dev/null @@ -1,16 +0,0 @@ -Mar 1, 2005 11:15 AST by PM - -+ For consistency, renamed Math.php to Maths.java, utils to util, - tests to test, docs to doc - - -+ Removed conditional logic from top of Matrix class. - -+ Switched to using hypo function in Maths.php for all php-hypot calls. - NOTE TO SELF: Need to make sure that all decompositions have been - switched over to using the bundled hypo. - -Feb 25, 2005 at 10:00 AST by PM - -+ Recommend using simpler Error.php instead of JAMA_Error.php but - can be persuaded otherwise. - diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/CholeskyDecomposition.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/CholeskyDecomposition.php deleted file mode 100644 index 2b241d5..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/CholeskyDecomposition.php +++ /dev/null @@ -1,147 +0,0 @@ -L = $A->getArray(); - $this->m = $A->getRowDimension(); - - for ($i = 0; $i < $this->m; ++$i) { - for ($j = $i; $j < $this->m; ++$j) { - for ($sum = $this->L[$i][$j], $k = $i - 1; $k >= 0; --$k) { - $sum -= $this->L[$i][$k] * $this->L[$j][$k]; - } - if ($i == $j) { - if ($sum >= 0) { - $this->L[$i][$i] = sqrt($sum); - } else { - $this->isspd = false; - } - } else { - if ($this->L[$i][$i] != 0) { - $this->L[$j][$i] = $sum / $this->L[$i][$i]; - } - } - } - - for ($k = $i + 1; $k < $this->m; ++$k) { - $this->L[$i][$k] = 0.0; - } - } - } - - /** - * Is the matrix symmetric and positive definite? - * - * @return bool - */ - public function isSPD() - { - return $this->isspd; - } - - /** - * getL. - * - * Return triangular factor. - * - * @return Matrix Lower triangular matrix - */ - public function getL() - { - return new Matrix($this->L); - } - - /** - * Solve A*X = B. - * - * @param $B Row-equal matrix - * - * @return Matrix L * L' * X = B - */ - public function solve(Matrix $B) - { - if ($B->getRowDimension() == $this->m) { - if ($this->isspd) { - $X = $B->getArrayCopy(); - $nx = $B->getColumnDimension(); - - for ($k = 0; $k < $this->m; ++$k) { - for ($i = $k + 1; $i < $this->m; ++$i) { - for ($j = 0; $j < $nx; ++$j) { - $X[$i][$j] -= $X[$k][$j] * $this->L[$i][$k]; - } - } - for ($j = 0; $j < $nx; ++$j) { - $X[$k][$j] /= $this->L[$k][$k]; - } - } - - for ($k = $this->m - 1; $k >= 0; --$k) { - for ($j = 0; $j < $nx; ++$j) { - $X[$k][$j] /= $this->L[$k][$k]; - } - for ($i = 0; $i < $k; ++$i) { - for ($j = 0; $j < $nx; ++$j) { - $X[$i][$j] -= $X[$k][$j] * $this->L[$k][$i]; - } - } - } - - return new Matrix($X, $this->m, $nx); - } - - throw new CalculationException(Matrix::MATRIX_SPD_EXCEPTION); - } - - throw new CalculationException(Matrix::MATRIX_DIMENSION_EXCEPTION); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php deleted file mode 100644 index 4c67c3a..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/EigenvalueDecomposition.php +++ /dev/null @@ -1,863 +0,0 @@ -d = $this->V[$this->n - 1]; - // Householder reduction to tridiagonal form. - for ($i = $this->n - 1; $i > 0; --$i) { - $i_ = $i - 1; - // Scale to avoid under/overflow. - $h = $scale = 0.0; - $scale += array_sum(array_map('abs', $this->d)); - if ($scale == 0.0) { - $this->e[$i] = $this->d[$i_]; - $this->d = array_slice($this->V[$i_], 0, $i_); - for ($j = 0; $j < $i; ++$j) { - $this->V[$j][$i] = $this->V[$i][$j] = 0.0; - } - } else { - // Generate Householder vector. - for ($k = 0; $k < $i; ++$k) { - $this->d[$k] /= $scale; - $h += $this->d[$k] ** 2; - } - $f = $this->d[$i_]; - $g = sqrt($h); - if ($f > 0) { - $g = -$g; - } - $this->e[$i] = $scale * $g; - $h = $h - $f * $g; - $this->d[$i_] = $f - $g; - for ($j = 0; $j < $i; ++$j) { - $this->e[$j] = 0.0; - } - // Apply similarity transformation to remaining columns. - for ($j = 0; $j < $i; ++$j) { - $f = $this->d[$j]; - $this->V[$j][$i] = $f; - $g = $this->e[$j] + $this->V[$j][$j] * $f; - for ($k = $j + 1; $k <= $i_; ++$k) { - $g += $this->V[$k][$j] * $this->d[$k]; - $this->e[$k] += $this->V[$k][$j] * $f; - } - $this->e[$j] = $g; - } - $f = 0.0; - for ($j = 0; $j < $i; ++$j) { - $this->e[$j] /= $h; - $f += $this->e[$j] * $this->d[$j]; - } - $hh = $f / (2 * $h); - for ($j = 0; $j < $i; ++$j) { - $this->e[$j] -= $hh * $this->d[$j]; - } - for ($j = 0; $j < $i; ++$j) { - $f = $this->d[$j]; - $g = $this->e[$j]; - for ($k = $j; $k <= $i_; ++$k) { - $this->V[$k][$j] -= ($f * $this->e[$k] + $g * $this->d[$k]); - } - $this->d[$j] = $this->V[$i - 1][$j]; - $this->V[$i][$j] = 0.0; - } - } - $this->d[$i] = $h; - } - - // Accumulate transformations. - for ($i = 0; $i < $this->n - 1; ++$i) { - $this->V[$this->n - 1][$i] = $this->V[$i][$i]; - $this->V[$i][$i] = 1.0; - $h = $this->d[$i + 1]; - if ($h != 0.0) { - for ($k = 0; $k <= $i; ++$k) { - $this->d[$k] = $this->V[$k][$i + 1] / $h; - } - for ($j = 0; $j <= $i; ++$j) { - $g = 0.0; - for ($k = 0; $k <= $i; ++$k) { - $g += $this->V[$k][$i + 1] * $this->V[$k][$j]; - } - for ($k = 0; $k <= $i; ++$k) { - $this->V[$k][$j] -= $g * $this->d[$k]; - } - } - } - for ($k = 0; $k <= $i; ++$k) { - $this->V[$k][$i + 1] = 0.0; - } - } - - $this->d = $this->V[$this->n - 1]; - $this->V[$this->n - 1] = array_fill(0, $j, 0.0); - $this->V[$this->n - 1][$this->n - 1] = 1.0; - $this->e[0] = 0.0; - } - - /** - * Symmetric tridiagonal QL algorithm. - * - * This is derived from the Algol procedures tql2, by - * Bowdler, Martin, Reinsch, and Wilkinson, Handbook for - * Auto. Comp., Vol.ii-Linear Algebra, and the corresponding - * Fortran subroutine in EISPACK. - */ - private function tql2(): void - { - for ($i = 1; $i < $this->n; ++$i) { - $this->e[$i - 1] = $this->e[$i]; - } - $this->e[$this->n - 1] = 0.0; - $f = 0.0; - $tst1 = 0.0; - $eps = 2.0 ** (-52.0); - - for ($l = 0; $l < $this->n; ++$l) { - // Find small subdiagonal element - $tst1 = max($tst1, abs($this->d[$l]) + abs($this->e[$l])); - $m = $l; - while ($m < $this->n) { - if (abs($this->e[$m]) <= $eps * $tst1) { - break; - } - ++$m; - } - // If m == l, $this->d[l] is an eigenvalue, - // otherwise, iterate. - if ($m > $l) { - $iter = 0; - do { - // Could check iteration count here. - ++$iter; - // Compute implicit shift - $g = $this->d[$l]; - $p = ($this->d[$l + 1] - $g) / (2.0 * $this->e[$l]); - $r = hypo($p, 1.0); - if ($p < 0) { - $r *= -1; - } - $this->d[$l] = $this->e[$l] / ($p + $r); - $this->d[$l + 1] = $this->e[$l] * ($p + $r); - $dl1 = $this->d[$l + 1]; - $h = $g - $this->d[$l]; - for ($i = $l + 2; $i < $this->n; ++$i) { - $this->d[$i] -= $h; - } - $f += $h; - // Implicit QL transformation. - $p = $this->d[$m]; - $c = 1.0; - $c2 = $c3 = $c; - $el1 = $this->e[$l + 1]; - $s = $s2 = 0.0; - for ($i = $m - 1; $i >= $l; --$i) { - $c3 = $c2; - $c2 = $c; - $s2 = $s; - $g = $c * $this->e[$i]; - $h = $c * $p; - $r = hypo($p, $this->e[$i]); - $this->e[$i + 1] = $s * $r; - $s = $this->e[$i] / $r; - $c = $p / $r; - $p = $c * $this->d[$i] - $s * $g; - $this->d[$i + 1] = $h + $s * ($c * $g + $s * $this->d[$i]); - // Accumulate transformation. - for ($k = 0; $k < $this->n; ++$k) { - $h = $this->V[$k][$i + 1]; - $this->V[$k][$i + 1] = $s * $this->V[$k][$i] + $c * $h; - $this->V[$k][$i] = $c * $this->V[$k][$i] - $s * $h; - } - } - $p = -$s * $s2 * $c3 * $el1 * $this->e[$l] / $dl1; - $this->e[$l] = $s * $p; - $this->d[$l] = $c * $p; - // Check for convergence. - } while (abs($this->e[$l]) > $eps * $tst1); - } - $this->d[$l] = $this->d[$l] + $f; - $this->e[$l] = 0.0; - } - - // Sort eigenvalues and corresponding vectors. - for ($i = 0; $i < $this->n - 1; ++$i) { - $k = $i; - $p = $this->d[$i]; - for ($j = $i + 1; $j < $this->n; ++$j) { - if ($this->d[$j] < $p) { - $k = $j; - $p = $this->d[$j]; - } - } - if ($k != $i) { - $this->d[$k] = $this->d[$i]; - $this->d[$i] = $p; - for ($j = 0; $j < $this->n; ++$j) { - $p = $this->V[$j][$i]; - $this->V[$j][$i] = $this->V[$j][$k]; - $this->V[$j][$k] = $p; - } - } - } - } - - /** - * Nonsymmetric reduction to Hessenberg form. - * - * This is derived from the Algol procedures orthes and ortran, - * by Martin and Wilkinson, Handbook for Auto. Comp., - * Vol.ii-Linear Algebra, and the corresponding - * Fortran subroutines in EISPACK. - */ - private function orthes(): void - { - $low = 0; - $high = $this->n - 1; - - for ($m = $low + 1; $m <= $high - 1; ++$m) { - // Scale column. - $scale = 0.0; - for ($i = $m; $i <= $high; ++$i) { - $scale = $scale + abs($this->H[$i][$m - 1]); - } - if ($scale != 0.0) { - // Compute Householder transformation. - $h = 0.0; - for ($i = $high; $i >= $m; --$i) { - $this->ort[$i] = $this->H[$i][$m - 1] / $scale; - $h += $this->ort[$i] * $this->ort[$i]; - } - $g = sqrt($h); - if ($this->ort[$m] > 0) { - $g *= -1; - } - $h -= $this->ort[$m] * $g; - $this->ort[$m] -= $g; - // Apply Householder similarity transformation - // H = (I -u * u' / h) * H * (I -u * u') / h) - for ($j = $m; $j < $this->n; ++$j) { - $f = 0.0; - for ($i = $high; $i >= $m; --$i) { - $f += $this->ort[$i] * $this->H[$i][$j]; - } - $f /= $h; - for ($i = $m; $i <= $high; ++$i) { - $this->H[$i][$j] -= $f * $this->ort[$i]; - } - } - for ($i = 0; $i <= $high; ++$i) { - $f = 0.0; - for ($j = $high; $j >= $m; --$j) { - $f += $this->ort[$j] * $this->H[$i][$j]; - } - $f = $f / $h; - for ($j = $m; $j <= $high; ++$j) { - $this->H[$i][$j] -= $f * $this->ort[$j]; - } - } - $this->ort[$m] = $scale * $this->ort[$m]; - $this->H[$m][$m - 1] = $scale * $g; - } - } - - // Accumulate transformations (Algol's ortran). - for ($i = 0; $i < $this->n; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $this->V[$i][$j] = ($i == $j ? 1.0 : 0.0); - } - } - for ($m = $high - 1; $m >= $low + 1; --$m) { - if ($this->H[$m][$m - 1] != 0.0) { - for ($i = $m + 1; $i <= $high; ++$i) { - $this->ort[$i] = $this->H[$i][$m - 1]; - } - for ($j = $m; $j <= $high; ++$j) { - $g = 0.0; - for ($i = $m; $i <= $high; ++$i) { - $g += $this->ort[$i] * $this->V[$i][$j]; - } - // Double division avoids possible underflow - $g = ($g / $this->ort[$m]) / $this->H[$m][$m - 1]; - for ($i = $m; $i <= $high; ++$i) { - $this->V[$i][$j] += $g * $this->ort[$i]; - } - } - } - } - } - - /** - * Performs complex division. - * - * @param mixed $xr - * @param mixed $xi - * @param mixed $yr - * @param mixed $yi - */ - private function cdiv($xr, $xi, $yr, $yi): void - { - if (abs($yr) > abs($yi)) { - $r = $yi / $yr; - $d = $yr + $r * $yi; - $this->cdivr = ($xr + $r * $xi) / $d; - $this->cdivi = ($xi - $r * $xr) / $d; - } else { - $r = $yr / $yi; - $d = $yi + $r * $yr; - $this->cdivr = ($r * $xr + $xi) / $d; - $this->cdivi = ($r * $xi - $xr) / $d; - } - } - - /** - * Nonsymmetric reduction from Hessenberg to real Schur form. - * - * Code is derived from the Algol procedure hqr2, - * by Martin and Wilkinson, Handbook for Auto. Comp., - * Vol.ii-Linear Algebra, and the corresponding - * Fortran subroutine in EISPACK. - */ - private function hqr2(): void - { - // Initialize - $nn = $this->n; - $n = $nn - 1; - $low = 0; - $high = $nn - 1; - $eps = 2.0 ** (-52.0); - $exshift = 0.0; - $p = $q = $r = $s = $z = 0; - // Store roots isolated by balanc and compute matrix norm - $norm = 0.0; - - for ($i = 0; $i < $nn; ++$i) { - if (($i < $low) || ($i > $high)) { - $this->d[$i] = $this->H[$i][$i]; - $this->e[$i] = 0.0; - } - for ($j = max($i - 1, 0); $j < $nn; ++$j) { - $norm = $norm + abs($this->H[$i][$j]); - } - } - - // Outer loop over eigenvalue index - $iter = 0; - while ($n >= $low) { - // Look for single small sub-diagonal element - $l = $n; - while ($l > $low) { - $s = abs($this->H[$l - 1][$l - 1]) + abs($this->H[$l][$l]); - if ($s == 0.0) { - $s = $norm; - } - if (abs($this->H[$l][$l - 1]) < $eps * $s) { - break; - } - --$l; - } - // Check for convergence - // One root found - if ($l == $n) { - $this->H[$n][$n] = $this->H[$n][$n] + $exshift; - $this->d[$n] = $this->H[$n][$n]; - $this->e[$n] = 0.0; - --$n; - $iter = 0; - // Two roots found - } elseif ($l == $n - 1) { - $w = $this->H[$n][$n - 1] * $this->H[$n - 1][$n]; - $p = ($this->H[$n - 1][$n - 1] - $this->H[$n][$n]) / 2.0; - $q = $p * $p + $w; - $z = sqrt(abs($q)); - $this->H[$n][$n] = $this->H[$n][$n] + $exshift; - $this->H[$n - 1][$n - 1] = $this->H[$n - 1][$n - 1] + $exshift; - $x = $this->H[$n][$n]; - // Real pair - if ($q >= 0) { - if ($p >= 0) { - $z = $p + $z; - } else { - $z = $p - $z; - } - $this->d[$n - 1] = $x + $z; - $this->d[$n] = $this->d[$n - 1]; - if ($z != 0.0) { - $this->d[$n] = $x - $w / $z; - } - $this->e[$n - 1] = 0.0; - $this->e[$n] = 0.0; - $x = $this->H[$n][$n - 1]; - $s = abs($x) + abs($z); - $p = $x / $s; - $q = $z / $s; - $r = sqrt($p * $p + $q * $q); - $p = $p / $r; - $q = $q / $r; - // Row modification - for ($j = $n - 1; $j < $nn; ++$j) { - $z = $this->H[$n - 1][$j]; - $this->H[$n - 1][$j] = $q * $z + $p * $this->H[$n][$j]; - $this->H[$n][$j] = $q * $this->H[$n][$j] - $p * $z; - } - // Column modification - for ($i = 0; $i <= $n; ++$i) { - $z = $this->H[$i][$n - 1]; - $this->H[$i][$n - 1] = $q * $z + $p * $this->H[$i][$n]; - $this->H[$i][$n] = $q * $this->H[$i][$n] - $p * $z; - } - // Accumulate transformations - for ($i = $low; $i <= $high; ++$i) { - $z = $this->V[$i][$n - 1]; - $this->V[$i][$n - 1] = $q * $z + $p * $this->V[$i][$n]; - $this->V[$i][$n] = $q * $this->V[$i][$n] - $p * $z; - } - // Complex pair - } else { - $this->d[$n - 1] = $x + $p; - $this->d[$n] = $x + $p; - $this->e[$n - 1] = $z; - $this->e[$n] = -$z; - } - $n = $n - 2; - $iter = 0; - // No convergence yet - } else { - // Form shift - $x = $this->H[$n][$n]; - $y = 0.0; - $w = 0.0; - if ($l < $n) { - $y = $this->H[$n - 1][$n - 1]; - $w = $this->H[$n][$n - 1] * $this->H[$n - 1][$n]; - } - // Wilkinson's original ad hoc shift - if ($iter == 10) { - $exshift += $x; - for ($i = $low; $i <= $n; ++$i) { - $this->H[$i][$i] -= $x; - } - $s = abs($this->H[$n][$n - 1]) + abs($this->H[$n - 1][$n - 2]); - $x = $y = 0.75 * $s; - $w = -0.4375 * $s * $s; - } - // MATLAB's new ad hoc shift - if ($iter == 30) { - $s = ($y - $x) / 2.0; - $s = $s * $s + $w; - if ($s > 0) { - $s = sqrt($s); - if ($y < $x) { - $s = -$s; - } - $s = $x - $w / (($y - $x) / 2.0 + $s); - for ($i = $low; $i <= $n; ++$i) { - $this->H[$i][$i] -= $s; - } - $exshift += $s; - $x = $y = $w = 0.964; - } - } - // Could check iteration count here. - $iter = $iter + 1; - // Look for two consecutive small sub-diagonal elements - $m = $n - 2; - while ($m >= $l) { - $z = $this->H[$m][$m]; - $r = $x - $z; - $s = $y - $z; - $p = ($r * $s - $w) / $this->H[$m + 1][$m] + $this->H[$m][$m + 1]; - $q = $this->H[$m + 1][$m + 1] - $z - $r - $s; - $r = $this->H[$m + 2][$m + 1]; - $s = abs($p) + abs($q) + abs($r); - $p = $p / $s; - $q = $q / $s; - $r = $r / $s; - if ($m == $l) { - break; - } - if ( - abs($this->H[$m][$m - 1]) * (abs($q) + abs($r)) < - $eps * (abs($p) * (abs($this->H[$m - 1][$m - 1]) + abs($z) + abs($this->H[$m + 1][$m + 1]))) - ) { - break; - } - --$m; - } - for ($i = $m + 2; $i <= $n; ++$i) { - $this->H[$i][$i - 2] = 0.0; - if ($i > $m + 2) { - $this->H[$i][$i - 3] = 0.0; - } - } - // Double QR step involving rows l:n and columns m:n - for ($k = $m; $k <= $n - 1; ++$k) { - $notlast = ($k != $n - 1); - if ($k != $m) { - $p = $this->H[$k][$k - 1]; - $q = $this->H[$k + 1][$k - 1]; - $r = ($notlast ? $this->H[$k + 2][$k - 1] : 0.0); - $x = abs($p) + abs($q) + abs($r); - if ($x != 0.0) { - $p = $p / $x; - $q = $q / $x; - $r = $r / $x; - } - } - if ($x == 0.0) { - break; - } - $s = sqrt($p * $p + $q * $q + $r * $r); - if ($p < 0) { - $s = -$s; - } - if ($s != 0) { - if ($k != $m) { - $this->H[$k][$k - 1] = -$s * $x; - } elseif ($l != $m) { - $this->H[$k][$k - 1] = -$this->H[$k][$k - 1]; - } - $p = $p + $s; - $x = $p / $s; - $y = $q / $s; - $z = $r / $s; - $q = $q / $p; - $r = $r / $p; - // Row modification - for ($j = $k; $j < $nn; ++$j) { - $p = $this->H[$k][$j] + $q * $this->H[$k + 1][$j]; - if ($notlast) { - $p = $p + $r * $this->H[$k + 2][$j]; - $this->H[$k + 2][$j] = $this->H[$k + 2][$j] - $p * $z; - } - $this->H[$k][$j] = $this->H[$k][$j] - $p * $x; - $this->H[$k + 1][$j] = $this->H[$k + 1][$j] - $p * $y; - } - // Column modification - $iMax = min($n, $k + 3); - for ($i = 0; $i <= $iMax; ++$i) { - $p = $x * $this->H[$i][$k] + $y * $this->H[$i][$k + 1]; - if ($notlast) { - $p = $p + $z * $this->H[$i][$k + 2]; - $this->H[$i][$k + 2] = $this->H[$i][$k + 2] - $p * $r; - } - $this->H[$i][$k] = $this->H[$i][$k] - $p; - $this->H[$i][$k + 1] = $this->H[$i][$k + 1] - $p * $q; - } - // Accumulate transformations - for ($i = $low; $i <= $high; ++$i) { - $p = $x * $this->V[$i][$k] + $y * $this->V[$i][$k + 1]; - if ($notlast) { - $p = $p + $z * $this->V[$i][$k + 2]; - $this->V[$i][$k + 2] = $this->V[$i][$k + 2] - $p * $r; - } - $this->V[$i][$k] = $this->V[$i][$k] - $p; - $this->V[$i][$k + 1] = $this->V[$i][$k + 1] - $p * $q; - } - } // ($s != 0) - } // k loop - } // check convergence - } // while ($n >= $low) - - // Backsubstitute to find vectors of upper triangular form - if ($norm == 0.0) { - return; - } - - for ($n = $nn - 1; $n >= 0; --$n) { - $p = $this->d[$n]; - $q = $this->e[$n]; - // Real vector - if ($q == 0) { - $l = $n; - $this->H[$n][$n] = 1.0; - for ($i = $n - 1; $i >= 0; --$i) { - $w = $this->H[$i][$i] - $p; - $r = 0.0; - for ($j = $l; $j <= $n; ++$j) { - $r = $r + $this->H[$i][$j] * $this->H[$j][$n]; - } - if ($this->e[$i] < 0.0) { - $z = $w; - $s = $r; - } else { - $l = $i; - if ($this->e[$i] == 0.0) { - if ($w != 0.0) { - $this->H[$i][$n] = -$r / $w; - } else { - $this->H[$i][$n] = -$r / ($eps * $norm); - } - // Solve real equations - } else { - $x = $this->H[$i][$i + 1]; - $y = $this->H[$i + 1][$i]; - $q = ($this->d[$i] - $p) * ($this->d[$i] - $p) + $this->e[$i] * $this->e[$i]; - $t = ($x * $s - $z * $r) / $q; - $this->H[$i][$n] = $t; - if (abs($x) > abs($z)) { - $this->H[$i + 1][$n] = (-$r - $w * $t) / $x; - } else { - $this->H[$i + 1][$n] = (-$s - $y * $t) / $z; - } - } - // Overflow control - $t = abs($this->H[$i][$n]); - if (($eps * $t) * $t > 1) { - for ($j = $i; $j <= $n; ++$j) { - $this->H[$j][$n] = $this->H[$j][$n] / $t; - } - } - } - } - // Complex vector - } elseif ($q < 0) { - $l = $n - 1; - // Last vector component imaginary so matrix is triangular - if (abs($this->H[$n][$n - 1]) > abs($this->H[$n - 1][$n])) { - $this->H[$n - 1][$n - 1] = $q / $this->H[$n][$n - 1]; - $this->H[$n - 1][$n] = -($this->H[$n][$n] - $p) / $this->H[$n][$n - 1]; - } else { - $this->cdiv(0.0, -$this->H[$n - 1][$n], $this->H[$n - 1][$n - 1] - $p, $q); - $this->H[$n - 1][$n - 1] = $this->cdivr; - $this->H[$n - 1][$n] = $this->cdivi; - } - $this->H[$n][$n - 1] = 0.0; - $this->H[$n][$n] = 1.0; - for ($i = $n - 2; $i >= 0; --$i) { - // double ra,sa,vr,vi; - $ra = 0.0; - $sa = 0.0; - for ($j = $l; $j <= $n; ++$j) { - $ra = $ra + $this->H[$i][$j] * $this->H[$j][$n - 1]; - $sa = $sa + $this->H[$i][$j] * $this->H[$j][$n]; - } - $w = $this->H[$i][$i] - $p; - if ($this->e[$i] < 0.0) { - $z = $w; - $r = $ra; - $s = $sa; - } else { - $l = $i; - if ($this->e[$i] == 0) { - $this->cdiv(-$ra, -$sa, $w, $q); - $this->H[$i][$n - 1] = $this->cdivr; - $this->H[$i][$n] = $this->cdivi; - } else { - // Solve complex equations - $x = $this->H[$i][$i + 1]; - $y = $this->H[$i + 1][$i]; - $vr = ($this->d[$i] - $p) * ($this->d[$i] - $p) + $this->e[$i] * $this->e[$i] - $q * $q; - $vi = ($this->d[$i] - $p) * 2.0 * $q; - if ($vr == 0.0 & $vi == 0.0) { - $vr = $eps * $norm * (abs($w) + abs($q) + abs($x) + abs($y) + abs($z)); - } - $this->cdiv($x * $r - $z * $ra + $q * $sa, $x * $s - $z * $sa - $q * $ra, $vr, $vi); - $this->H[$i][$n - 1] = $this->cdivr; - $this->H[$i][$n] = $this->cdivi; - if (abs($x) > (abs($z) + abs($q))) { - $this->H[$i + 1][$n - 1] = (-$ra - $w * $this->H[$i][$n - 1] + $q * $this->H[$i][$n]) / $x; - $this->H[$i + 1][$n] = (-$sa - $w * $this->H[$i][$n] - $q * $this->H[$i][$n - 1]) / $x; - } else { - $this->cdiv(-$r - $y * $this->H[$i][$n - 1], -$s - $y * $this->H[$i][$n], $z, $q); - $this->H[$i + 1][$n - 1] = $this->cdivr; - $this->H[$i + 1][$n] = $this->cdivi; - } - } - // Overflow control - $t = max(abs($this->H[$i][$n - 1]), abs($this->H[$i][$n])); - if (($eps * $t) * $t > 1) { - for ($j = $i; $j <= $n; ++$j) { - $this->H[$j][$n - 1] = $this->H[$j][$n - 1] / $t; - $this->H[$j][$n] = $this->H[$j][$n] / $t; - } - } - } // end else - } // end for - } // end else for complex case - } // end for - - // Vectors of isolated roots - for ($i = 0; $i < $nn; ++$i) { - if ($i < $low | $i > $high) { - for ($j = $i; $j < $nn; ++$j) { - $this->V[$i][$j] = $this->H[$i][$j]; - } - } - } - - // Back transformation to get eigenvectors of original matrix - for ($j = $nn - 1; $j >= $low; --$j) { - for ($i = $low; $i <= $high; ++$i) { - $z = 0.0; - $kMax = min($j, $high); - for ($k = $low; $k <= $kMax; ++$k) { - $z = $z + $this->V[$i][$k] * $this->H[$k][$j]; - } - $this->V[$i][$j] = $z; - } - } - } - - // end hqr2 - - /** - * Constructor: Check for symmetry, then construct the eigenvalue decomposition. - * - * @param mixed $Arg A Square matrix - */ - public function __construct($Arg) - { - $this->A = $Arg->getArray(); - $this->n = $Arg->getColumnDimension(); - - $issymmetric = true; - for ($j = 0; ($j < $this->n) & $issymmetric; ++$j) { - for ($i = 0; ($i < $this->n) & $issymmetric; ++$i) { - $issymmetric = ($this->A[$i][$j] == $this->A[$j][$i]); - } - } - - if ($issymmetric) { - $this->V = $this->A; - // Tridiagonalize. - $this->tred2(); - // Diagonalize. - $this->tql2(); - } else { - $this->H = $this->A; - $this->ort = []; - // Reduce to Hessenberg form. - $this->orthes(); - // Reduce Hessenberg to real Schur form. - $this->hqr2(); - } - } - - /** - * Return the eigenvector matrix. - * - * @return Matrix V - */ - public function getV() - { - return new Matrix($this->V, $this->n, $this->n); - } - - /** - * Return the real parts of the eigenvalues. - * - * @return array real(diag(D)) - */ - public function getRealEigenvalues() - { - return $this->d; - } - - /** - * Return the imaginary parts of the eigenvalues. - * - * @return array imag(diag(D)) - */ - public function getImagEigenvalues() - { - return $this->e; - } - - /** - * Return the block diagonal eigenvalue matrix. - * - * @return Matrix D - */ - public function getD() - { - for ($i = 0; $i < $this->n; ++$i) { - $D[$i] = array_fill(0, $this->n, 0.0); - $D[$i][$i] = $this->d[$i]; - if ($this->e[$i] == 0) { - continue; - } - $o = ($this->e[$i] > 0) ? $i + 1 : $i - 1; - $D[$i][$o] = $this->e[$i]; - } - - return new Matrix($D); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/LUDecomposition.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/LUDecomposition.php deleted file mode 100644 index 4aecff7..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/LUDecomposition.php +++ /dev/null @@ -1,282 +0,0 @@ -= n, the LU decomposition is an m-by-n - * unit lower triangular matrix L, an n-by-n upper triangular matrix U, - * and a permutation vector piv of length m so that A(piv,:) = L*U. - * If m < n, then L is m-by-m and U is m-by-n. - * - * The LU decompostion with pivoting always exists, even if the matrix is - * singular, so the constructor will never fail. The primary use of the - * LU decomposition is in the solution of square systems of simultaneous - * linear equations. This will fail if isNonsingular() returns false. - * - * @author Paul Meagher - * @author Bartosz Matosiuk - * @author Michael Bommarito - * - * @version 1.1 - */ -class LUDecomposition -{ - const MATRIX_SINGULAR_EXCEPTION = 'Can only perform operation on singular matrix.'; - const MATRIX_SQUARE_EXCEPTION = 'Mismatched Row dimension'; - - /** - * Decomposition storage. - * - * @var array - */ - private $LU = []; - - /** - * Row dimension. - * - * @var int - */ - private $m; - - /** - * Column dimension. - * - * @var int - */ - private $n; - - /** - * Pivot sign. - * - * @var int - */ - private $pivsign; - - /** - * Internal storage of pivot vector. - * - * @var array - */ - private $piv = []; - - /** - * LU Decomposition constructor. - * - * @param Matrix $A Rectangular matrix - */ - public function __construct($A) - { - if ($A instanceof Matrix) { - // Use a "left-looking", dot-product, Crout/Doolittle algorithm. - $this->LU = $A->getArray(); - $this->m = $A->getRowDimension(); - $this->n = $A->getColumnDimension(); - for ($i = 0; $i < $this->m; ++$i) { - $this->piv[$i] = $i; - } - $this->pivsign = 1; - $LUrowi = $LUcolj = []; - - // Outer loop. - for ($j = 0; $j < $this->n; ++$j) { - // Make a copy of the j-th column to localize references. - for ($i = 0; $i < $this->m; ++$i) { - $LUcolj[$i] = &$this->LU[$i][$j]; - } - // Apply previous transformations. - for ($i = 0; $i < $this->m; ++$i) { - $LUrowi = $this->LU[$i]; - // Most of the time is spent in the following dot product. - $kmax = min($i, $j); - $s = 0.0; - for ($k = 0; $k < $kmax; ++$k) { - $s += $LUrowi[$k] * $LUcolj[$k]; - } - $LUrowi[$j] = $LUcolj[$i] -= $s; - } - // Find pivot and exchange if necessary. - $p = $j; - for ($i = $j + 1; $i < $this->m; ++$i) { - if (abs($LUcolj[$i]) > abs($LUcolj[$p])) { - $p = $i; - } - } - if ($p != $j) { - for ($k = 0; $k < $this->n; ++$k) { - $t = $this->LU[$p][$k]; - $this->LU[$p][$k] = $this->LU[$j][$k]; - $this->LU[$j][$k] = $t; - } - $k = $this->piv[$p]; - $this->piv[$p] = $this->piv[$j]; - $this->piv[$j] = $k; - $this->pivsign = $this->pivsign * -1; - } - // Compute multipliers. - if (($j < $this->m) && ($this->LU[$j][$j] != 0.0)) { - for ($i = $j + 1; $i < $this->m; ++$i) { - $this->LU[$i][$j] /= $this->LU[$j][$j]; - } - } - } - } else { - throw new CalculationException(Matrix::ARGUMENT_TYPE_EXCEPTION); - } - } - - // function __construct() - - /** - * Get lower triangular factor. - * - * @return Matrix Lower triangular factor - */ - public function getL() - { - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - if ($i > $j) { - $L[$i][$j] = $this->LU[$i][$j]; - } elseif ($i == $j) { - $L[$i][$j] = 1.0; - } else { - $L[$i][$j] = 0.0; - } - } - } - - return new Matrix($L); - } - - // function getL() - - /** - * Get upper triangular factor. - * - * @return Matrix Upper triangular factor - */ - public function getU() - { - for ($i = 0; $i < $this->n; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - if ($i <= $j) { - $U[$i][$j] = $this->LU[$i][$j]; - } else { - $U[$i][$j] = 0.0; - } - } - } - - return new Matrix($U); - } - - // function getU() - - /** - * Return pivot permutation vector. - * - * @return array Pivot vector - */ - public function getPivot() - { - return $this->piv; - } - - // function getPivot() - - /** - * Alias for getPivot. - * - * @see getPivot - */ - public function getDoublePivot() - { - return $this->getPivot(); - } - - // function getDoublePivot() - - /** - * Is the matrix nonsingular? - * - * @return bool true if U, and hence A, is nonsingular - */ - public function isNonsingular() - { - for ($j = 0; $j < $this->n; ++$j) { - if ($this->LU[$j][$j] == 0) { - return false; - } - } - - return true; - } - - // function isNonsingular() - - /** - * Count determinants. - * - * @return array d matrix deterninat - */ - public function det() - { - if ($this->m == $this->n) { - $d = $this->pivsign; - for ($j = 0; $j < $this->n; ++$j) { - $d *= $this->LU[$j][$j]; - } - - return $d; - } - - throw new CalculationException(Matrix::MATRIX_DIMENSION_EXCEPTION); - } - - // function det() - - /** - * Solve A*X = B. - * - * @param mixed $B a Matrix with as many rows as A and any number of columns - * - * @return Matrix X so that L*U*X = B(piv,:) - */ - public function solve($B) - { - if ($B->getRowDimension() == $this->m) { - if ($this->isNonsingular()) { - // Copy right hand side with pivoting - $nx = $B->getColumnDimension(); - $X = $B->getMatrix($this->piv, 0, $nx - 1); - // Solve L*Y = B(piv,:) - for ($k = 0; $k < $this->n; ++$k) { - for ($i = $k + 1; $i < $this->n; ++$i) { - for ($j = 0; $j < $nx; ++$j) { - $X->A[$i][$j] -= $X->A[$k][$j] * $this->LU[$i][$k]; - } - } - } - // Solve U*X = Y; - for ($k = $this->n - 1; $k >= 0; --$k) { - for ($j = 0; $j < $nx; ++$j) { - $X->A[$k][$j] /= $this->LU[$k][$k]; - } - for ($i = 0; $i < $k; ++$i) { - for ($j = 0; $j < $nx; ++$j) { - $X->A[$i][$j] -= $X->A[$k][$j] * $this->LU[$i][$k]; - } - } - } - - return $X; - } - - throw new CalculationException(self::MATRIX_SINGULAR_EXCEPTION); - } - - throw new CalculationException(self::MATRIX_SQUARE_EXCEPTION); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/Matrix.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/Matrix.php deleted file mode 100644 index a5cb6de..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/Matrix.php +++ /dev/null @@ -1,1202 +0,0 @@ - 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - //Rectangular matrix - m x n initialized from 2D array - case 'array': - $this->m = count($args[0]); - $this->n = count($args[0][0]); - $this->A = $args[0]; - - break; - //Square matrix - n x n - case 'integer': - $this->m = $args[0]; - $this->n = $args[0]; - $this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0)); - - break; - //Rectangular matrix - m x n - case 'integer,integer': - $this->m = $args[0]; - $this->n = $args[1]; - $this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0)); - - break; - //Rectangular matrix - m x n initialized from packed array - case 'array,integer': - $this->m = $args[1]; - if ($this->m != 0) { - $this->n = count($args[0]) / $this->m; - } else { - $this->n = 0; - } - if (($this->m * $this->n) == count($args[0])) { - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $this->A[$i][$j] = $args[0][$i + $j * $this->m]; - } - } - } else { - throw new CalculationException(self::ARRAY_LENGTH_EXCEPTION); - } - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - } else { - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - } - - /** - * getArray. - * - * @return array Matrix array - */ - public function getArray() - { - return $this->A; - } - - /** - * getRowDimension. - * - * @return int Row dimension - */ - public function getRowDimension() - { - return $this->m; - } - - /** - * getColumnDimension. - * - * @return int Column dimension - */ - public function getColumnDimension() - { - return $this->n; - } - - /** - * get. - * - * Get the i,j-th element of the matrix. - * - * @param int $i Row position - * @param int $j Column position - * - * @return mixed Element (int/float/double) - */ - public function get($i = null, $j = null) - { - return $this->A[$i][$j]; - } - - /** - * getMatrix. - * - * Get a submatrix - * - * @return Matrix Submatrix - */ - public function getMatrix(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - //A($i0...; $j0...) - case 'integer,integer': - [$i0, $j0] = $args; - if ($i0 >= 0) { - $m = $this->m - $i0; - } else { - throw new CalculationException(self::ARGUMENT_BOUNDS_EXCEPTION); - } - if ($j0 >= 0) { - $n = $this->n - $j0; - } else { - throw new CalculationException(self::ARGUMENT_BOUNDS_EXCEPTION); - } - $R = new self($m, $n); - for ($i = $i0; $i < $this->m; ++$i) { - for ($j = $j0; $j < $this->n; ++$j) { - $R->set($i, $j, $this->A[$i][$j]); - } - } - - return $R; - - break; - //A($i0...$iF; $j0...$jF) - case 'integer,integer,integer,integer': - [$i0, $iF, $j0, $jF] = $args; - if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) { - $m = $iF - $i0; - } else { - throw new CalculationException(self::ARGUMENT_BOUNDS_EXCEPTION); - } - if (($jF > $j0) && ($this->n >= $jF) && ($j0 >= 0)) { - $n = $jF - $j0; - } else { - throw new CalculationException(self::ARGUMENT_BOUNDS_EXCEPTION); - } - $R = new self($m + 1, $n + 1); - for ($i = $i0; $i <= $iF; ++$i) { - for ($j = $j0; $j <= $jF; ++$j) { - $R->set($i - $i0, $j - $j0, $this->A[$i][$j]); - } - } - - return $R; - - break; - //$R = array of row indices; $C = array of column indices - case 'array,array': - [$RL, $CL] = $args; - if (count($RL) > 0) { - $m = count($RL); - } else { - throw new CalculationException(self::ARGUMENT_BOUNDS_EXCEPTION); - } - if (count($CL) > 0) { - $n = count($CL); - } else { - throw new CalculationException(self::ARGUMENT_BOUNDS_EXCEPTION); - } - $R = new self($m, $n); - for ($i = 0; $i < $m; ++$i) { - for ($j = 0; $j < $n; ++$j) { - $R->set($i, $j, $this->A[$RL[$i]][$CL[$j]]); - } - } - - return $R; - - break; - //A($i0...$iF); $CL = array of column indices - case 'integer,integer,array': - [$i0, $iF, $CL] = $args; - if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) { - $m = $iF - $i0; - } else { - throw new CalculationException(self::ARGUMENT_BOUNDS_EXCEPTION); - } - if (count($CL) > 0) { - $n = count($CL); - } else { - throw new CalculationException(self::ARGUMENT_BOUNDS_EXCEPTION); - } - $R = new self($m, $n); - for ($i = $i0; $i < $iF; ++$i) { - for ($j = 0; $j < $n; ++$j) { - $R->set($i - $i0, $j, $this->A[$i][$CL[$j]]); - } - } - - return $R; - - break; - //$RL = array of row indices - case 'array,integer,integer': - [$RL, $j0, $jF] = $args; - if (count($RL) > 0) { - $m = count($RL); - } else { - throw new CalculationException(self::ARGUMENT_BOUNDS_EXCEPTION); - } - if (($jF >= $j0) && ($this->n >= $jF) && ($j0 >= 0)) { - $n = $jF - $j0; - } else { - throw new CalculationException(self::ARGUMENT_BOUNDS_EXCEPTION); - } - $R = new self($m, $n + 1); - for ($i = 0; $i < $m; ++$i) { - for ($j = $j0; $j <= $jF; ++$j) { - $R->set($i, $j - $j0, $this->A[$RL[$i]][$j]); - } - } - - return $R; - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - } else { - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - } - - /** - * checkMatrixDimensions. - * - * Is matrix B the same size? - * - * @param Matrix $B Matrix B - * - * @return bool - */ - public function checkMatrixDimensions($B = null) - { - if ($B instanceof self) { - if (($this->m == $B->getRowDimension()) && ($this->n == $B->getColumnDimension())) { - return true; - } - - throw new CalculationException(self::MATRIX_DIMENSION_EXCEPTION); - } - - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - // function checkMatrixDimensions() - - /** - * set. - * - * Set the i,j-th element of the matrix. - * - * @param int $i Row position - * @param int $j Column position - * @param mixed $c Int/float/double value - * - * @return mixed Element (int/float/double) - */ - public function set($i = null, $j = null, $c = null) - { - // Optimized set version just has this - $this->A[$i][$j] = $c; - } - - // function set() - - /** - * identity. - * - * Generate an identity matrix. - * - * @param int $m Row dimension - * @param int $n Column dimension - * - * @return Matrix Identity matrix - */ - public function identity($m = null, $n = null) - { - return $this->diagonal($m, $n, 1); - } - - /** - * diagonal. - * - * Generate a diagonal matrix - * - * @param int $m Row dimension - * @param int $n Column dimension - * @param mixed $c Diagonal value - * - * @return Matrix Diagonal matrix - */ - public function diagonal($m = null, $n = null, $c = 1) - { - $R = new self($m, $n); - for ($i = 0; $i < $m; ++$i) { - $R->set($i, $i, $c); - } - - return $R; - } - - /** - * getMatrixByRow. - * - * Get a submatrix by row index/range - * - * @param int $i0 Initial row index - * @param int $iF Final row index - * - * @return Matrix Submatrix - */ - public function getMatrixByRow($i0 = null, $iF = null) - { - if (is_int($i0)) { - if (is_int($iF)) { - return $this->getMatrix($i0, 0, $iF + 1, $this->n); - } - - return $this->getMatrix($i0, 0, $i0 + 1, $this->n); - } - - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - /** - * getMatrixByCol. - * - * Get a submatrix by column index/range - * - * @param int $j0 Initial column index - * @param int $jF Final column index - * - * @return Matrix Submatrix - */ - public function getMatrixByCol($j0 = null, $jF = null) - { - if (is_int($j0)) { - if (is_int($jF)) { - return $this->getMatrix(0, $j0, $this->m, $jF + 1); - } - - return $this->getMatrix(0, $j0, $this->m, $j0 + 1); - } - - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - /** - * transpose. - * - * Tranpose matrix - * - * @return Matrix Transposed matrix - */ - public function transpose() - { - $R = new self($this->n, $this->m); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $R->set($j, $i, $this->A[$i][$j]); - } - } - - return $R; - } - - // function transpose() - - /** - * trace. - * - * Sum of diagonal elements - * - * @return float Sum of diagonal elements - */ - public function trace() - { - $s = 0; - $n = min($this->m, $this->n); - for ($i = 0; $i < $n; ++$i) { - $s += $this->A[$i][$i]; - } - - return $s; - } - - /** - * uminus. - * - * Unary minus matrix -A - * - * @return Matrix Unary minus matrix - */ - public function uminus() - { - } - - /** - * plus. - * - * A + B - * - * @return Matrix Sum - */ - public function plus(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $M->set($i, $j, $M->get($i, $j) + $this->A[$i][$j]); - } - } - - return $M; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * plusEquals. - * - * A = A + B - * - * @return $this - */ - public function plusEquals(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $validValues = true; - $value = $M->get($i, $j); - if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { - $this->A[$i][$j] = trim($this->A[$i][$j], '"'); - $validValues &= StringHelper::convertToNumberIfFraction($this->A[$i][$j]); - } - if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { - $value = trim($value, '"'); - $validValues &= StringHelper::convertToNumberIfFraction($value); - } - if ($validValues) { - $this->A[$i][$j] += $value; - } else { - $this->A[$i][$j] = Functions::NAN(); - } - } - } - - return $this; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * minus. - * - * A - B - * - * @return Matrix Sum - */ - public function minus(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $M->set($i, $j, $M->get($i, $j) - $this->A[$i][$j]); - } - } - - return $M; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * minusEquals. - * - * A = A - B - * - * @return $this - */ - public function minusEquals(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $validValues = true; - $value = $M->get($i, $j); - if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { - $this->A[$i][$j] = trim($this->A[$i][$j], '"'); - $validValues &= StringHelper::convertToNumberIfFraction($this->A[$i][$j]); - } - if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { - $value = trim($value, '"'); - $validValues &= StringHelper::convertToNumberIfFraction($value); - } - if ($validValues) { - $this->A[$i][$j] -= $value; - } else { - $this->A[$i][$j] = Functions::NAN(); - } - } - } - - return $this; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * arrayTimes. - * - * Element-by-element multiplication - * Cij = Aij * Bij - * - * @return Matrix Matrix Cij - */ - public function arrayTimes(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $M->set($i, $j, $M->get($i, $j) * $this->A[$i][$j]); - } - } - - return $M; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * arrayTimesEquals. - * - * Element-by-element multiplication - * Aij = Aij * Bij - * - * @return $this - */ - public function arrayTimesEquals(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $validValues = true; - $value = $M->get($i, $j); - if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { - $this->A[$i][$j] = trim($this->A[$i][$j], '"'); - $validValues &= StringHelper::convertToNumberIfFraction($this->A[$i][$j]); - } - if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { - $value = trim($value, '"'); - $validValues &= StringHelper::convertToNumberIfFraction($value); - } - if ($validValues) { - $this->A[$i][$j] *= $value; - } else { - $this->A[$i][$j] = Functions::NAN(); - } - } - } - - return $this; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * arrayRightDivide. - * - * Element-by-element right division - * A / B - * - * @return Matrix Division result - */ - public function arrayRightDivide(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $validValues = true; - $value = $M->get($i, $j); - if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { - $this->A[$i][$j] = trim($this->A[$i][$j], '"'); - $validValues &= StringHelper::convertToNumberIfFraction($this->A[$i][$j]); - } - if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { - $value = trim($value, '"'); - $validValues &= StringHelper::convertToNumberIfFraction($value); - } - if ($validValues) { - if ($value == 0) { - // Trap for Divide by Zero error - $M->set($i, $j, '#DIV/0!'); - } else { - $M->set($i, $j, $this->A[$i][$j] / $value); - } - } else { - $M->set($i, $j, Functions::NAN()); - } - } - } - - return $M; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * arrayRightDivideEquals. - * - * Element-by-element right division - * Aij = Aij / Bij - * - * @return Matrix Matrix Aij - */ - public function arrayRightDivideEquals(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $this->A[$i][$j] = $this->A[$i][$j] / $M->get($i, $j); - } - } - - return $M; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * arrayLeftDivide. - * - * Element-by-element Left division - * A / B - * - * @return Matrix Division result - */ - public function arrayLeftDivide(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $M->set($i, $j, $M->get($i, $j) / $this->A[$i][$j]); - } - } - - return $M; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * arrayLeftDivideEquals. - * - * Element-by-element Left division - * Aij = Aij / Bij - * - * @return Matrix Matrix Aij - */ - public function arrayLeftDivideEquals(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $this->A[$i][$j] = $M->get($i, $j) / $this->A[$i][$j]; - } - } - - return $M; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * times. - * - * Matrix multiplication - * - * @return Matrix Product - */ - public function times(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $B = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - if ($this->n == $B->m) { - $C = new self($this->m, $B->n); - for ($j = 0; $j < $B->n; ++$j) { - $Bcolj = []; - for ($k = 0; $k < $this->n; ++$k) { - $Bcolj[$k] = $B->A[$k][$j]; - } - for ($i = 0; $i < $this->m; ++$i) { - $Arowi = $this->A[$i]; - $s = 0; - for ($k = 0; $k < $this->n; ++$k) { - $s += $Arowi[$k] * $Bcolj[$k]; - } - $C->A[$i][$j] = $s; - } - } - - return $C; - } - - throw new CalculationException(self::MATRIX_DIMENSION_EXCEPTION); - case 'array': - $B = new self($args[0]); - if ($this->n == $B->m) { - $C = new self($this->m, $B->n); - for ($i = 0; $i < $C->m; ++$i) { - for ($j = 0; $j < $C->n; ++$j) { - $s = '0'; - for ($k = 0; $k < $C->n; ++$k) { - $s += $this->A[$i][$k] * $B->A[$k][$j]; - } - $C->A[$i][$j] = $s; - } - } - - return $C; - } - - throw new CalculationException(self::MATRIX_DIMENSION_EXCEPTION); - case 'integer': - $C = new self($this->A); - for ($i = 0; $i < $C->m; ++$i) { - for ($j = 0; $j < $C->n; ++$j) { - $C->A[$i][$j] *= $args[0]; - } - } - - return $C; - case 'double': - $C = new self($this->m, $this->n); - for ($i = 0; $i < $C->m; ++$i) { - for ($j = 0; $j < $C->n; ++$j) { - $C->A[$i][$j] = $args[0] * $this->A[$i][$j]; - } - } - - return $C; - case 'float': - $C = new self($this->A); - for ($i = 0; $i < $C->m; ++$i) { - for ($j = 0; $j < $C->n; ++$j) { - $C->A[$i][$j] *= $args[0]; - } - } - - return $C; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - } else { - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - } - - /** - * power. - * - * A = A ^ B - * - * @return $this - */ - public function power(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $validValues = true; - $value = $M->get($i, $j); - if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { - $this->A[$i][$j] = trim($this->A[$i][$j], '"'); - $validValues &= StringHelper::convertToNumberIfFraction($this->A[$i][$j]); - } - if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { - $value = trim($value, '"'); - $validValues &= StringHelper::convertToNumberIfFraction($value); - } - if ($validValues) { - $this->A[$i][$j] = $this->A[$i][$j] ** $value; - } else { - $this->A[$i][$j] = Functions::NAN(); - } - } - } - - return $this; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * concat. - * - * A = A & B - * - * @return $this - */ - public function concat(...$args) - { - if (count($args) > 0) { - $match = implode(',', array_map('gettype', $args)); - - switch ($match) { - case 'object': - if ($args[0] instanceof self) { - $M = $args[0]; - } else { - throw new CalculationException(self::ARGUMENT_TYPE_EXCEPTION); - } - - break; - case 'array': - $M = new self($args[0]); - - break; - default: - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - - break; - } - $this->checkMatrixDimensions($M); - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $this->A[$i][$j] = trim($this->A[$i][$j], '"') . trim($M->get($i, $j), '"'); - } - } - - return $this; - } - - throw new CalculationException(self::POLYMORPHIC_ARGUMENT_EXCEPTION); - } - - /** - * Solve A*X = B. - * - * @param Matrix $B Right hand side - * - * @return Matrix ... Solution if A is square, least squares solution otherwise - */ - public function solve($B) - { - if ($this->m == $this->n) { - $LU = new LUDecomposition($this); - - return $LU->solve($B); - } - $QR = new QRDecomposition($this); - - return $QR->solve($B); - } - - /** - * Matrix inverse or pseudoinverse. - * - * @return Matrix ... Inverse(A) if A is square, pseudoinverse otherwise. - */ - public function inverse() - { - return $this->solve($this->identity($this->m, $this->m)); - } - - /** - * det. - * - * Calculate determinant - * - * @return float Determinant - */ - public function det() - { - $L = new LUDecomposition($this); - - return $L->det(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/QRDecomposition.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/QRDecomposition.php deleted file mode 100644 index 3bb8a10..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/QRDecomposition.php +++ /dev/null @@ -1,249 +0,0 @@ -= n, the QR decomposition is an m-by-n - * orthogonal matrix Q and an n-by-n upper triangular matrix R so that - * A = Q*R. - * - * The QR decompostion always exists, even if the matrix does not have - * full rank, so the constructor will never fail. The primary use of the - * QR decomposition is in the least squares solution of nonsquare systems - * of simultaneous linear equations. This will fail if isFullRank() - * returns false. - * - * @author Paul Meagher - * - * @version 1.1 - */ -class QRDecomposition -{ - const MATRIX_RANK_EXCEPTION = 'Can only perform operation on full-rank matrix.'; - - /** - * Array for internal storage of decomposition. - * - * @var array - */ - private $QR = []; - - /** - * Row dimension. - * - * @var int - */ - private $m; - - /** - * Column dimension. - * - * @var int - */ - private $n; - - /** - * Array for internal storage of diagonal of R. - * - * @var array - */ - private $Rdiag = []; - - /** - * QR Decomposition computed by Householder reflections. - * - * @param matrix $A Rectangular matrix - */ - public function __construct($A) - { - if ($A instanceof Matrix) { - // Initialize. - $this->QR = $A->getArray(); - $this->m = $A->getRowDimension(); - $this->n = $A->getColumnDimension(); - // Main loop. - for ($k = 0; $k < $this->n; ++$k) { - // Compute 2-norm of k-th column without under/overflow. - $nrm = 0.0; - for ($i = $k; $i < $this->m; ++$i) { - $nrm = hypo($nrm, $this->QR[$i][$k]); - } - if ($nrm != 0.0) { - // Form k-th Householder vector. - if ($this->QR[$k][$k] < 0) { - $nrm = -$nrm; - } - for ($i = $k; $i < $this->m; ++$i) { - $this->QR[$i][$k] /= $nrm; - } - $this->QR[$k][$k] += 1.0; - // Apply transformation to remaining columns. - for ($j = $k + 1; $j < $this->n; ++$j) { - $s = 0.0; - for ($i = $k; $i < $this->m; ++$i) { - $s += $this->QR[$i][$k] * $this->QR[$i][$j]; - } - $s = -$s / $this->QR[$k][$k]; - for ($i = $k; $i < $this->m; ++$i) { - $this->QR[$i][$j] += $s * $this->QR[$i][$k]; - } - } - } - $this->Rdiag[$k] = -$nrm; - } - } else { - throw new CalculationException(Matrix::ARGUMENT_TYPE_EXCEPTION); - } - } - - // function __construct() - - /** - * Is the matrix full rank? - * - * @return bool true if R, and hence A, has full rank, else false - */ - public function isFullRank() - { - for ($j = 0; $j < $this->n; ++$j) { - if ($this->Rdiag[$j] == 0) { - return false; - } - } - - return true; - } - - // function isFullRank() - - /** - * Return the Householder vectors. - * - * @return Matrix Lower trapezoidal matrix whose columns define the reflections - */ - public function getH() - { - $H = []; - for ($i = 0; $i < $this->m; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - if ($i >= $j) { - $H[$i][$j] = $this->QR[$i][$j]; - } else { - $H[$i][$j] = 0.0; - } - } - } - - return new Matrix($H); - } - - // function getH() - - /** - * Return the upper triangular factor. - * - * @return Matrix upper triangular factor - */ - public function getR() - { - $R = []; - for ($i = 0; $i < $this->n; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - if ($i < $j) { - $R[$i][$j] = $this->QR[$i][$j]; - } elseif ($i == $j) { - $R[$i][$j] = $this->Rdiag[$i]; - } else { - $R[$i][$j] = 0.0; - } - } - } - - return new Matrix($R); - } - - // function getR() - - /** - * Generate and return the (economy-sized) orthogonal factor. - * - * @return Matrix orthogonal factor - */ - public function getQ() - { - $Q = []; - for ($k = $this->n - 1; $k >= 0; --$k) { - for ($i = 0; $i < $this->m; ++$i) { - $Q[$i][$k] = 0.0; - } - $Q[$k][$k] = 1.0; - for ($j = $k; $j < $this->n; ++$j) { - if ($this->QR[$k][$k] != 0) { - $s = 0.0; - for ($i = $k; $i < $this->m; ++$i) { - $s += $this->QR[$i][$k] * $Q[$i][$j]; - } - $s = -$s / $this->QR[$k][$k]; - for ($i = $k; $i < $this->m; ++$i) { - $Q[$i][$j] += $s * $this->QR[$i][$k]; - } - } - } - } - - return new Matrix($Q); - } - - // function getQ() - - /** - * Least squares solution of A*X = B. - * - * @param Matrix $B a Matrix with as many rows as A and any number of columns - * - * @return Matrix matrix that minimizes the two norm of Q*R*X-B - */ - public function solve($B) - { - if ($B->getRowDimension() == $this->m) { - if ($this->isFullRank()) { - // Copy right hand side - $nx = $B->getColumnDimension(); - $X = $B->getArrayCopy(); - // Compute Y = transpose(Q)*B - for ($k = 0; $k < $this->n; ++$k) { - for ($j = 0; $j < $nx; ++$j) { - $s = 0.0; - for ($i = $k; $i < $this->m; ++$i) { - $s += $this->QR[$i][$k] * $X[$i][$j]; - } - $s = -$s / $this->QR[$k][$k]; - for ($i = $k; $i < $this->m; ++$i) { - $X[$i][$j] += $s * $this->QR[$i][$k]; - } - } - } - // Solve R*X = Y; - for ($k = $this->n - 1; $k >= 0; --$k) { - for ($j = 0; $j < $nx; ++$j) { - $X[$k][$j] /= $this->Rdiag[$k]; - } - for ($i = 0; $i < $k; ++$i) { - for ($j = 0; $j < $nx; ++$j) { - $X[$i][$j] -= $X[$k][$j] * $this->QR[$i][$k]; - } - } - } - $X = new Matrix($X); - - return $X->getMatrix(0, $this->n - 1, 0, $nx); - } - - throw new CalculationException(self::MATRIX_RANK_EXCEPTION); - } - - throw new CalculationException(Matrix::MATRIX_DIMENSION_EXCEPTION); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php deleted file mode 100644 index b997fb7..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/SingularValueDecomposition.php +++ /dev/null @@ -1,528 +0,0 @@ -= n, the singular value decomposition is - * an m-by-n orthogonal matrix U, an n-by-n diagonal matrix S, and - * an n-by-n orthogonal matrix V so that A = U*S*V'. - * - * The singular values, sigma[$k] = S[$k][$k], are ordered so that - * sigma[0] >= sigma[1] >= ... >= sigma[n-1]. - * - * The singular value decompostion always exists, so the constructor will - * never fail. The matrix condition number and the effective numerical - * rank can be computed from this decomposition. - * - * @author Paul Meagher - * - * @version 1.1 - */ -class SingularValueDecomposition -{ - /** - * Internal storage of U. - * - * @var array - */ - private $U = []; - - /** - * Internal storage of V. - * - * @var array - */ - private $V = []; - - /** - * Internal storage of singular values. - * - * @var array - */ - private $s = []; - - /** - * Row dimension. - * - * @var int - */ - private $m; - - /** - * Column dimension. - * - * @var int - */ - private $n; - - /** - * Construct the singular value decomposition. - * - * Derived from LINPACK code. - * - * @param mixed $Arg Rectangular matrix - */ - public function __construct($Arg) - { - // Initialize. - $A = $Arg->getArrayCopy(); - $this->m = $Arg->getRowDimension(); - $this->n = $Arg->getColumnDimension(); - $nu = min($this->m, $this->n); - $e = []; - $work = []; - $wantu = true; - $wantv = true; - $nct = min($this->m - 1, $this->n); - $nrt = max(0, min($this->n - 2, $this->m)); - - // Reduce A to bidiagonal form, storing the diagonal elements - // in s and the super-diagonal elements in e. - $kMax = max($nct, $nrt); - for ($k = 0; $k < $kMax; ++$k) { - if ($k < $nct) { - // Compute the transformation for the k-th column and - // place the k-th diagonal in s[$k]. - // Compute 2-norm of k-th column without under/overflow. - $this->s[$k] = 0; - for ($i = $k; $i < $this->m; ++$i) { - $this->s[$k] = hypo($this->s[$k], $A[$i][$k]); - } - if ($this->s[$k] != 0.0) { - if ($A[$k][$k] < 0.0) { - $this->s[$k] = -$this->s[$k]; - } - for ($i = $k; $i < $this->m; ++$i) { - $A[$i][$k] /= $this->s[$k]; - } - $A[$k][$k] += 1.0; - } - $this->s[$k] = -$this->s[$k]; - } - - for ($j = $k + 1; $j < $this->n; ++$j) { - if (($k < $nct) & ($this->s[$k] != 0.0)) { - // Apply the transformation. - $t = 0; - for ($i = $k; $i < $this->m; ++$i) { - $t += $A[$i][$k] * $A[$i][$j]; - } - $t = -$t / $A[$k][$k]; - for ($i = $k; $i < $this->m; ++$i) { - $A[$i][$j] += $t * $A[$i][$k]; - } - // Place the k-th row of A into e for the - // subsequent calculation of the row transformation. - $e[$j] = $A[$k][$j]; - } - } - - if ($wantu && ($k < $nct)) { - // Place the transformation in U for subsequent back - // multiplication. - for ($i = $k; $i < $this->m; ++$i) { - $this->U[$i][$k] = $A[$i][$k]; - } - } - - if ($k < $nrt) { - // Compute the k-th row transformation and place the - // k-th super-diagonal in e[$k]. - // Compute 2-norm without under/overflow. - $e[$k] = 0; - for ($i = $k + 1; $i < $this->n; ++$i) { - $e[$k] = hypo($e[$k], $e[$i]); - } - if ($e[$k] != 0.0) { - if ($e[$k + 1] < 0.0) { - $e[$k] = -$e[$k]; - } - for ($i = $k + 1; $i < $this->n; ++$i) { - $e[$i] /= $e[$k]; - } - $e[$k + 1] += 1.0; - } - $e[$k] = -$e[$k]; - if (($k + 1 < $this->m) && ($e[$k] != 0.0)) { - // Apply the transformation. - for ($i = $k + 1; $i < $this->m; ++$i) { - $work[$i] = 0.0; - } - for ($j = $k + 1; $j < $this->n; ++$j) { - for ($i = $k + 1; $i < $this->m; ++$i) { - $work[$i] += $e[$j] * $A[$i][$j]; - } - } - for ($j = $k + 1; $j < $this->n; ++$j) { - $t = -$e[$j] / $e[$k + 1]; - for ($i = $k + 1; $i < $this->m; ++$i) { - $A[$i][$j] += $t * $work[$i]; - } - } - } - if ($wantv) { - // Place the transformation in V for subsequent - // back multiplication. - for ($i = $k + 1; $i < $this->n; ++$i) { - $this->V[$i][$k] = $e[$i]; - } - } - } - } - - // Set up the final bidiagonal matrix or order p. - $p = min($this->n, $this->m + 1); - if ($nct < $this->n) { - $this->s[$nct] = $A[$nct][$nct]; - } - if ($this->m < $p) { - $this->s[$p - 1] = 0.0; - } - if ($nrt + 1 < $p) { - $e[$nrt] = $A[$nrt][$p - 1]; - } - $e[$p - 1] = 0.0; - // If required, generate U. - if ($wantu) { - for ($j = $nct; $j < $nu; ++$j) { - for ($i = 0; $i < $this->m; ++$i) { - $this->U[$i][$j] = 0.0; - } - $this->U[$j][$j] = 1.0; - } - for ($k = $nct - 1; $k >= 0; --$k) { - if ($this->s[$k] != 0.0) { - for ($j = $k + 1; $j < $nu; ++$j) { - $t = 0; - for ($i = $k; $i < $this->m; ++$i) { - $t += $this->U[$i][$k] * $this->U[$i][$j]; - } - $t = -$t / $this->U[$k][$k]; - for ($i = $k; $i < $this->m; ++$i) { - $this->U[$i][$j] += $t * $this->U[$i][$k]; - } - } - for ($i = $k; $i < $this->m; ++$i) { - $this->U[$i][$k] = -$this->U[$i][$k]; - } - $this->U[$k][$k] = 1.0 + $this->U[$k][$k]; - for ($i = 0; $i < $k - 1; ++$i) { - $this->U[$i][$k] = 0.0; - } - } else { - for ($i = 0; $i < $this->m; ++$i) { - $this->U[$i][$k] = 0.0; - } - $this->U[$k][$k] = 1.0; - } - } - } - - // If required, generate V. - if ($wantv) { - for ($k = $this->n - 1; $k >= 0; --$k) { - if (($k < $nrt) && ($e[$k] != 0.0)) { - for ($j = $k + 1; $j < $nu; ++$j) { - $t = 0; - for ($i = $k + 1; $i < $this->n; ++$i) { - $t += $this->V[$i][$k] * $this->V[$i][$j]; - } - $t = -$t / $this->V[$k + 1][$k]; - for ($i = $k + 1; $i < $this->n; ++$i) { - $this->V[$i][$j] += $t * $this->V[$i][$k]; - } - } - } - for ($i = 0; $i < $this->n; ++$i) { - $this->V[$i][$k] = 0.0; - } - $this->V[$k][$k] = 1.0; - } - } - - // Main iteration loop for the singular values. - $pp = $p - 1; - $iter = 0; - $eps = 2.0 ** (-52.0); - - while ($p > 0) { - // Here is where a test for too many iterations would go. - // This section of the program inspects for negligible - // elements in the s and e arrays. On completion the - // variables kase and k are set as follows: - // kase = 1 if s(p) and e[k-1] are negligible and k

= -1; --$k) { - if ($k == -1) { - break; - } - if (abs($e[$k]) <= $eps * (abs($this->s[$k]) + abs($this->s[$k + 1]))) { - $e[$k] = 0.0; - - break; - } - } - if ($k == $p - 2) { - $kase = 4; - } else { - for ($ks = $p - 1; $ks >= $k; --$ks) { - if ($ks == $k) { - break; - } - $t = ($ks != $p ? abs($e[$ks]) : 0.) + ($ks != $k + 1 ? abs($e[$ks - 1]) : 0.); - if (abs($this->s[$ks]) <= $eps * $t) { - $this->s[$ks] = 0.0; - - break; - } - } - if ($ks == $k) { - $kase = 3; - } elseif ($ks == $p - 1) { - $kase = 1; - } else { - $kase = 2; - $k = $ks; - } - } - ++$k; - - // Perform the task indicated by kase. - switch ($kase) { - // Deflate negligible s(p). - case 1: - $f = $e[$p - 2]; - $e[$p - 2] = 0.0; - for ($j = $p - 2; $j >= $k; --$j) { - $t = hypo($this->s[$j], $f); - $cs = $this->s[$j] / $t; - $sn = $f / $t; - $this->s[$j] = $t; - if ($j != $k) { - $f = -$sn * $e[$j - 1]; - $e[$j - 1] = $cs * $e[$j - 1]; - } - if ($wantv) { - for ($i = 0; $i < $this->n; ++$i) { - $t = $cs * $this->V[$i][$j] + $sn * $this->V[$i][$p - 1]; - $this->V[$i][$p - 1] = -$sn * $this->V[$i][$j] + $cs * $this->V[$i][$p - 1]; - $this->V[$i][$j] = $t; - } - } - } - - break; - // Split at negligible s(k). - case 2: - $f = $e[$k - 1]; - $e[$k - 1] = 0.0; - for ($j = $k; $j < $p; ++$j) { - $t = hypo($this->s[$j], $f); - $cs = $this->s[$j] / $t; - $sn = $f / $t; - $this->s[$j] = $t; - $f = -$sn * $e[$j]; - $e[$j] = $cs * $e[$j]; - if ($wantu) { - for ($i = 0; $i < $this->m; ++$i) { - $t = $cs * $this->U[$i][$j] + $sn * $this->U[$i][$k - 1]; - $this->U[$i][$k - 1] = -$sn * $this->U[$i][$j] + $cs * $this->U[$i][$k - 1]; - $this->U[$i][$j] = $t; - } - } - } - - break; - // Perform one qr step. - case 3: - // Calculate the shift. - $scale = max(max(max(max(abs($this->s[$p - 1]), abs($this->s[$p - 2])), abs($e[$p - 2])), abs($this->s[$k])), abs($e[$k])); - $sp = $this->s[$p - 1] / $scale; - $spm1 = $this->s[$p - 2] / $scale; - $epm1 = $e[$p - 2] / $scale; - $sk = $this->s[$k] / $scale; - $ek = $e[$k] / $scale; - $b = (($spm1 + $sp) * ($spm1 - $sp) + $epm1 * $epm1) / 2.0; - $c = ($sp * $epm1) * ($sp * $epm1); - $shift = 0.0; - if (($b != 0.0) || ($c != 0.0)) { - $shift = sqrt($b * $b + $c); - if ($b < 0.0) { - $shift = -$shift; - } - $shift = $c / ($b + $shift); - } - $f = ($sk + $sp) * ($sk - $sp) + $shift; - $g = $sk * $ek; - // Chase zeros. - for ($j = $k; $j < $p - 1; ++$j) { - $t = hypo($f, $g); - $cs = $f / $t; - $sn = $g / $t; - if ($j != $k) { - $e[$j - 1] = $t; - } - $f = $cs * $this->s[$j] + $sn * $e[$j]; - $e[$j] = $cs * $e[$j] - $sn * $this->s[$j]; - $g = $sn * $this->s[$j + 1]; - $this->s[$j + 1] = $cs * $this->s[$j + 1]; - if ($wantv) { - for ($i = 0; $i < $this->n; ++$i) { - $t = $cs * $this->V[$i][$j] + $sn * $this->V[$i][$j + 1]; - $this->V[$i][$j + 1] = -$sn * $this->V[$i][$j] + $cs * $this->V[$i][$j + 1]; - $this->V[$i][$j] = $t; - } - } - $t = hypo($f, $g); - $cs = $f / $t; - $sn = $g / $t; - $this->s[$j] = $t; - $f = $cs * $e[$j] + $sn * $this->s[$j + 1]; - $this->s[$j + 1] = -$sn * $e[$j] + $cs * $this->s[$j + 1]; - $g = $sn * $e[$j + 1]; - $e[$j + 1] = $cs * $e[$j + 1]; - if ($wantu && ($j < $this->m - 1)) { - for ($i = 0; $i < $this->m; ++$i) { - $t = $cs * $this->U[$i][$j] + $sn * $this->U[$i][$j + 1]; - $this->U[$i][$j + 1] = -$sn * $this->U[$i][$j] + $cs * $this->U[$i][$j + 1]; - $this->U[$i][$j] = $t; - } - } - } - $e[$p - 2] = $f; - $iter = $iter + 1; - - break; - // Convergence. - case 4: - // Make the singular values positive. - if ($this->s[$k] <= 0.0) { - $this->s[$k] = ($this->s[$k] < 0.0 ? -$this->s[$k] : 0.0); - if ($wantv) { - for ($i = 0; $i <= $pp; ++$i) { - $this->V[$i][$k] = -$this->V[$i][$k]; - } - } - } - // Order the singular values. - while ($k < $pp) { - if ($this->s[$k] >= $this->s[$k + 1]) { - break; - } - $t = $this->s[$k]; - $this->s[$k] = $this->s[$k + 1]; - $this->s[$k + 1] = $t; - if ($wantv && ($k < $this->n - 1)) { - for ($i = 0; $i < $this->n; ++$i) { - $t = $this->V[$i][$k + 1]; - $this->V[$i][$k + 1] = $this->V[$i][$k]; - $this->V[$i][$k] = $t; - } - } - if ($wantu && ($k < $this->m - 1)) { - for ($i = 0; $i < $this->m; ++$i) { - $t = $this->U[$i][$k + 1]; - $this->U[$i][$k + 1] = $this->U[$i][$k]; - $this->U[$i][$k] = $t; - } - } - ++$k; - } - $iter = 0; - --$p; - - break; - } // end switch - } // end while - } - - /** - * Return the left singular vectors. - * - * @return Matrix U - */ - public function getU() - { - return new Matrix($this->U, $this->m, min($this->m + 1, $this->n)); - } - - /** - * Return the right singular vectors. - * - * @return Matrix V - */ - public function getV() - { - return new Matrix($this->V); - } - - /** - * Return the one-dimensional array of singular values. - * - * @return array diagonal of S - */ - public function getSingularValues() - { - return $this->s; - } - - /** - * Return the diagonal matrix of singular values. - * - * @return Matrix S - */ - public function getS() - { - for ($i = 0; $i < $this->n; ++$i) { - for ($j = 0; $j < $this->n; ++$j) { - $S[$i][$j] = 0.0; - } - $S[$i][$i] = $this->s[$i]; - } - - return new Matrix($S); - } - - /** - * Two norm. - * - * @return float max(S) - */ - public function norm2() - { - return $this->s[0]; - } - - /** - * Two norm condition number. - * - * @return float max(S)/min(S) - */ - public function cond() - { - return $this->s[0] / $this->s[min($this->m, $this->n) - 1]; - } - - /** - * Effective numerical matrix rank. - * - * @return int Number of nonnegligible singular values - */ - public function rank() - { - $eps = 2.0 ** (-52.0); - $tol = max($this->m, $this->n) * $this->s[0] * $eps; - $r = 0; - $iMax = count($this->s); - for ($i = 0; $i < $iMax; ++$i) { - if ($this->s[$i] > $tol) { - ++$r; - } - } - - return $r; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/utils/Maths.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/utils/Maths.php deleted file mode 100644 index 49877b2..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/JAMA/utils/Maths.php +++ /dev/null @@ -1,31 +0,0 @@ - abs($b)) { - $r = $b / $a; - $r = abs($a) * sqrt(1 + $r * $r); - } elseif ($b != 0) { - $r = $a / $b; - $r = abs($b) * sqrt(1 + $r * $r); - } else { - $r = 0.0; - } - - return $r; -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php deleted file mode 100644 index d380995..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php +++ /dev/null @@ -1,566 +0,0 @@ - | -// | Based on OLE::Storage_Lite by Kawai, Takanori | -// +----------------------------------------------------------------------+ -// - -use PhpOffice\PhpSpreadsheet\Reader\Exception as ReaderException; -use PhpOffice\PhpSpreadsheet\Shared\OLE\ChainedBlockStream; -use PhpOffice\PhpSpreadsheet\Shared\OLE\PPS\Root; - -/* - * Array for storing OLE instances that are accessed from - * OLE_ChainedBlockStream::stream_open(). - * - * @var array - */ -$GLOBALS['_OLE_INSTANCES'] = []; - -/** - * OLE package base class. - * - * @author Xavier Noguer - * @author Christian Schmidt - */ -class OLE -{ - const OLE_PPS_TYPE_ROOT = 5; - const OLE_PPS_TYPE_DIR = 1; - const OLE_PPS_TYPE_FILE = 2; - const OLE_DATA_SIZE_SMALL = 0x1000; - const OLE_LONG_INT_SIZE = 4; - const OLE_PPS_SIZE = 0x80; - - /** - * The file handle for reading an OLE container. - * - * @var resource - */ - public $_file_handle; - - /** - * Array of PPS's found on the OLE container. - * - * @var array - */ - public $_list = []; - - /** - * Root directory of OLE container. - * - * @var Root - */ - public $root; - - /** - * Big Block Allocation Table. - * - * @var array (blockId => nextBlockId) - */ - public $bbat; - - /** - * Short Block Allocation Table. - * - * @var array (blockId => nextBlockId) - */ - public $sbat; - - /** - * Size of big blocks. This is usually 512. - * - * @var int number of octets per block - */ - public $bigBlockSize; - - /** - * Size of small blocks. This is usually 64. - * - * @var int number of octets per block - */ - public $smallBlockSize; - - /** - * Threshold for big blocks. - * - * @var int - */ - public $bigBlockThreshold; - - /** - * Reads an OLE container from the contents of the file given. - * - * @acces public - * - * @param string $file - * - * @return bool true on success, PEAR_Error on failure - */ - public function read($file) - { - $fh = fopen($file, 'rb'); - if (!$fh) { - throw new ReaderException("Can't open file $file"); - } - $this->_file_handle = $fh; - - $signature = fread($fh, 8); - if ("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" != $signature) { - throw new ReaderException("File doesn't seem to be an OLE container."); - } - fseek($fh, 28); - if (fread($fh, 2) != "\xFE\xFF") { - // This shouldn't be a problem in practice - throw new ReaderException('Only Little-Endian encoding is supported.'); - } - // Size of blocks and short blocks in bytes - $this->bigBlockSize = 2 ** self::readInt2($fh); - $this->smallBlockSize = 2 ** self::readInt2($fh); - - // Skip UID, revision number and version number - fseek($fh, 44); - // Number of blocks in Big Block Allocation Table - $bbatBlockCount = self::readInt4($fh); - - // Root chain 1st block - $directoryFirstBlockId = self::readInt4($fh); - - // Skip unused bytes - fseek($fh, 56); - // Streams shorter than this are stored using small blocks - $this->bigBlockThreshold = self::readInt4($fh); - // Block id of first sector in Short Block Allocation Table - $sbatFirstBlockId = self::readInt4($fh); - // Number of blocks in Short Block Allocation Table - $sbbatBlockCount = self::readInt4($fh); - // Block id of first sector in Master Block Allocation Table - $mbatFirstBlockId = self::readInt4($fh); - // Number of blocks in Master Block Allocation Table - $mbbatBlockCount = self::readInt4($fh); - $this->bbat = []; - - // Remaining 4 * 109 bytes of current block is beginning of Master - // Block Allocation Table - $mbatBlocks = []; - for ($i = 0; $i < 109; ++$i) { - $mbatBlocks[] = self::readInt4($fh); - } - - // Read rest of Master Block Allocation Table (if any is left) - $pos = $this->getBlockOffset($mbatFirstBlockId); - for ($i = 0; $i < $mbbatBlockCount; ++$i) { - fseek($fh, $pos); - for ($j = 0; $j < $this->bigBlockSize / 4 - 1; ++$j) { - $mbatBlocks[] = self::readInt4($fh); - } - // Last block id in each block points to next block - $pos = $this->getBlockOffset(self::readInt4($fh)); - } - - // Read Big Block Allocation Table according to chain specified by $mbatBlocks - for ($i = 0; $i < $bbatBlockCount; ++$i) { - $pos = $this->getBlockOffset($mbatBlocks[$i]); - fseek($fh, $pos); - for ($j = 0; $j < $this->bigBlockSize / 4; ++$j) { - $this->bbat[] = self::readInt4($fh); - } - } - - // Read short block allocation table (SBAT) - $this->sbat = []; - $shortBlockCount = $sbbatBlockCount * $this->bigBlockSize / 4; - $sbatFh = $this->getStream($sbatFirstBlockId); - for ($blockId = 0; $blockId < $shortBlockCount; ++$blockId) { - $this->sbat[$blockId] = self::readInt4($sbatFh); - } - fclose($sbatFh); - - $this->readPpsWks($directoryFirstBlockId); - - return true; - } - - /** - * @param int $blockId byte offset from beginning of file - * - * @return int - */ - public function getBlockOffset($blockId) - { - return 512 + $blockId * $this->bigBlockSize; - } - - /** - * Returns a stream for use with fread() etc. External callers should - * use \PhpOffice\PhpSpreadsheet\Shared\OLE\PPS\File::getStream(). - * - * @param int|OLE\PPS $blockIdOrPps block id or PPS - * - * @return resource read-only stream - */ - public function getStream($blockIdOrPps) - { - static $isRegistered = false; - if (!$isRegistered) { - stream_wrapper_register('ole-chainedblockstream', ChainedBlockStream::class); - $isRegistered = true; - } - - // Store current instance in global array, so that it can be accessed - // in OLE_ChainedBlockStream::stream_open(). - // Object is removed from self::$instances in OLE_Stream::close(). - $GLOBALS['_OLE_INSTANCES'][] = $this; - $instanceId = end(array_keys($GLOBALS['_OLE_INSTANCES'])); - - $path = 'ole-chainedblockstream://oleInstanceId=' . $instanceId; - if ($blockIdOrPps instanceof OLE\PPS) { - $path .= '&blockId=' . $blockIdOrPps->startBlock; - $path .= '&size=' . $blockIdOrPps->Size; - } else { - $path .= '&blockId=' . $blockIdOrPps; - } - - return fopen($path, 'rb'); - } - - /** - * Reads a signed char. - * - * @param resource $fh file handle - * - * @return int - */ - private static function readInt1($fh) - { - [, $tmp] = unpack('c', fread($fh, 1)); - - return $tmp; - } - - /** - * Reads an unsigned short (2 octets). - * - * @param resource $fh file handle - * - * @return int - */ - private static function readInt2($fh) - { - [, $tmp] = unpack('v', fread($fh, 2)); - - return $tmp; - } - - /** - * Reads an unsigned long (4 octets). - * - * @param resource $fh file handle - * - * @return int - */ - private static function readInt4($fh) - { - [, $tmp] = unpack('V', fread($fh, 4)); - - return $tmp; - } - - /** - * Gets information about all PPS's on the OLE container from the PPS WK's - * creates an OLE_PPS object for each one. - * - * @param int $blockId the block id of the first block - * - * @return bool true on success, PEAR_Error on failure - */ - public function readPpsWks($blockId) - { - $fh = $this->getStream($blockId); - for ($pos = 0; true; $pos += 128) { - fseek($fh, $pos, SEEK_SET); - $nameUtf16 = fread($fh, 64); - $nameLength = self::readInt2($fh); - $nameUtf16 = substr($nameUtf16, 0, $nameLength - 2); - // Simple conversion from UTF-16LE to ISO-8859-1 - $name = str_replace("\x00", '', $nameUtf16); - $type = self::readInt1($fh); - switch ($type) { - case self::OLE_PPS_TYPE_ROOT: - $pps = new OLE\PPS\Root(null, null, []); - $this->root = $pps; - - break; - case self::OLE_PPS_TYPE_DIR: - $pps = new OLE\PPS(null, null, null, null, null, null, null, null, null, []); - - break; - case self::OLE_PPS_TYPE_FILE: - $pps = new OLE\PPS\File($name); - - break; - default: - break; - } - fseek($fh, 1, SEEK_CUR); - $pps->Type = $type; - $pps->Name = $name; - $pps->PrevPps = self::readInt4($fh); - $pps->NextPps = self::readInt4($fh); - $pps->DirPps = self::readInt4($fh); - fseek($fh, 20, SEEK_CUR); - $pps->Time1st = self::OLE2LocalDate(fread($fh, 8)); - $pps->Time2nd = self::OLE2LocalDate(fread($fh, 8)); - $pps->startBlock = self::readInt4($fh); - $pps->Size = self::readInt4($fh); - $pps->No = count($this->_list); - $this->_list[] = $pps; - - // check if the PPS tree (starting from root) is complete - if (isset($this->root) && $this->ppsTreeComplete($this->root->No)) { - break; - } - } - fclose($fh); - - // Initialize $pps->children on directories - foreach ($this->_list as $pps) { - if ($pps->Type == self::OLE_PPS_TYPE_DIR || $pps->Type == self::OLE_PPS_TYPE_ROOT) { - $nos = [$pps->DirPps]; - $pps->children = []; - while ($nos) { - $no = array_pop($nos); - if ($no != -1) { - $childPps = $this->_list[$no]; - $nos[] = $childPps->PrevPps; - $nos[] = $childPps->NextPps; - $pps->children[] = $childPps; - } - } - } - } - - return true; - } - - /** - * It checks whether the PPS tree is complete (all PPS's read) - * starting with the given PPS (not necessarily root). - * - * @param int $index The index of the PPS from which we are checking - * - * @return bool Whether the PPS tree for the given PPS is complete - */ - private function ppsTreeComplete($index) - { - return isset($this->_list[$index]) && - ($pps = $this->_list[$index]) && - ($pps->PrevPps == -1 || - $this->ppsTreeComplete($pps->PrevPps)) && - ($pps->NextPps == -1 || - $this->ppsTreeComplete($pps->NextPps)) && - ($pps->DirPps == -1 || - $this->ppsTreeComplete($pps->DirPps)); - } - - /** - * Checks whether a PPS is a File PPS or not. - * If there is no PPS for the index given, it will return false. - * - * @param int $index The index for the PPS - * - * @return bool true if it's a File PPS, false otherwise - */ - public function isFile($index) - { - if (isset($this->_list[$index])) { - return $this->_list[$index]->Type == self::OLE_PPS_TYPE_FILE; - } - - return false; - } - - /** - * Checks whether a PPS is a Root PPS or not. - * If there is no PPS for the index given, it will return false. - * - * @param int $index the index for the PPS - * - * @return bool true if it's a Root PPS, false otherwise - */ - public function isRoot($index) - { - if (isset($this->_list[$index])) { - return $this->_list[$index]->Type == self::OLE_PPS_TYPE_ROOT; - } - - return false; - } - - /** - * Gives the total number of PPS's found in the OLE container. - * - * @return int The total number of PPS's found in the OLE container - */ - public function ppsTotal() - { - return count($this->_list); - } - - /** - * Gets data from a PPS - * If there is no PPS for the index given, it will return an empty string. - * - * @param int $index The index for the PPS - * @param int $position The position from which to start reading - * (relative to the PPS) - * @param int $length The amount of bytes to read (at most) - * - * @return string The binary string containing the data requested - * - * @see OLE_PPS_File::getStream() - */ - public function getData($index, $position, $length) - { - // if position is not valid return empty string - if (!isset($this->_list[$index]) || ($position >= $this->_list[$index]->Size) || ($position < 0)) { - return ''; - } - $fh = $this->getStream($this->_list[$index]); - $data = stream_get_contents($fh, $length, $position); - fclose($fh); - - return $data; - } - - /** - * Gets the data length from a PPS - * If there is no PPS for the index given, it will return 0. - * - * @param int $index The index for the PPS - * - * @return int The amount of bytes in data the PPS has - */ - public function getDataLength($index) - { - if (isset($this->_list[$index])) { - return $this->_list[$index]->Size; - } - - return 0; - } - - /** - * Utility function to transform ASCII text to Unicode. - * - * @param string $ascii The ASCII string to transform - * - * @return string The string in Unicode - */ - public static function ascToUcs($ascii) - { - $rawname = ''; - $iMax = strlen($ascii); - for ($i = 0; $i < $iMax; ++$i) { - $rawname .= $ascii[$i] - . "\x00"; - } - - return $rawname; - } - - /** - * Utility function - * Returns a string for the OLE container with the date given. - * - * @param int $date A timestamp - * - * @return string The string for the OLE container - */ - public static function localDateToOLE($date) - { - if (!isset($date)) { - return "\x00\x00\x00\x00\x00\x00\x00\x00"; - } - - // factor used for separating numbers into 4 bytes parts - $factor = 2 ** 32; - - // days from 1-1-1601 until the beggining of UNIX era - $days = 134774; - // calculate seconds - $big_date = $days * 24 * 3600 + mktime((int) date('H', $date), (int) date('i', $date), (int) date('s', $date), (int) date('m', $date), (int) date('d', $date), (int) date('Y', $date)); - // multiply just to make MS happy - $big_date *= 10000000; - - $high_part = floor($big_date / $factor); - // lower 4 bytes - $low_part = floor((($big_date / $factor) - $high_part) * $factor); - - // Make HEX string - $res = ''; - - for ($i = 0; $i < 4; ++$i) { - $hex = $low_part % 0x100; - $res .= pack('c', $hex); - $low_part /= 0x100; - } - for ($i = 0; $i < 4; ++$i) { - $hex = $high_part % 0x100; - $res .= pack('c', $hex); - $high_part /= 0x100; - } - - return $res; - } - - /** - * Returns a timestamp from an OLE container's date. - * - * @param string $oleTimestamp A binary string with the encoded date - * - * @return int The Unix timestamp corresponding to the string - */ - public static function OLE2LocalDate($oleTimestamp) - { - if (strlen($oleTimestamp) != 8) { - throw new ReaderException('Expecting 8 byte string'); - } - - // convert to units of 100 ns since 1601: - $unpackedTimestamp = unpack('v4', $oleTimestamp); - $timestampHigh = (float) $unpackedTimestamp[4] * 65536 + (float) $unpackedTimestamp[3]; - $timestampLow = (float) $unpackedTimestamp[2] * 65536 + (float) $unpackedTimestamp[1]; - - // translate to seconds since 1601: - $timestampHigh /= 10000000; - $timestampLow /= 10000000; - - // days from 1601 to 1970: - $days = 134774; - - // translate to seconds since 1970: - $unixTimestamp = floor(65536.0 * 65536.0 * $timestampHigh + $timestampLow - $days * 24 * 3600 + 0.5); - - $iTimestamp = (int) $unixTimestamp; - - // Overflow conditions can't happen on 64-bit system - return ($iTimestamp == $unixTimestamp) ? $iTimestamp : ($unixTimestamp >= 0.0 ? PHP_INT_MAX : PHP_INT_MIN); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php deleted file mode 100644 index cee5cd9..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php +++ /dev/null @@ -1,196 +0,0 @@ -params); - if (!isset($this->params['oleInstanceId'], $this->params['blockId'], $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']])) { - if ($options & STREAM_REPORT_ERRORS) { - trigger_error('OLE stream not found', E_USER_WARNING); - } - - return false; - } - $this->ole = $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']]; - - $blockId = $this->params['blockId']; - $this->data = ''; - if (isset($this->params['size']) && $this->params['size'] < $this->ole->bigBlockThreshold && $blockId != $this->ole->root->startBlock) { - // Block id refers to small blocks - $rootPos = $this->ole->getBlockOffset($this->ole->root->startBlock); - while ($blockId != -2) { - $pos = $rootPos + $blockId * $this->ole->bigBlockSize; - $blockId = $this->ole->sbat[$blockId]; - fseek($this->ole->_file_handle, $pos); - $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize); - } - } else { - // Block id refers to big blocks - while ($blockId != -2) { - $pos = $this->ole->getBlockOffset($blockId); - fseek($this->ole->_file_handle, $pos); - $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize); - $blockId = $this->ole->bbat[$blockId]; - } - } - if (isset($this->params['size'])) { - $this->data = substr($this->data, 0, $this->params['size']); - } - - if ($options & STREAM_USE_PATH) { - $openedPath = $path; - } - - return true; - } - - /** - * Implements support for fclose(). - */ - public function stream_close(): void // @codingStandardsIgnoreLine - { - $this->ole = null; - unset($GLOBALS['_OLE_INSTANCES']); - } - - /** - * Implements support for fread(), fgets() etc. - * - * @param int $count maximum number of bytes to read - * - * @return string - */ - public function stream_read($count) // @codingStandardsIgnoreLine - { - if ($this->stream_eof()) { - return false; - } - $s = substr($this->data, $this->pos, $count); - $this->pos += $count; - - return $s; - } - - /** - * Implements support for feof(). - * - * @return bool TRUE if the file pointer is at EOF; otherwise FALSE - */ - public function stream_eof() // @codingStandardsIgnoreLine - { - return $this->pos >= strlen($this->data); - } - - /** - * Returns the position of the file pointer, i.e. its offset into the file - * stream. Implements support for ftell(). - * - * @return int - */ - public function stream_tell() // @codingStandardsIgnoreLine - { - return $this->pos; - } - - /** - * Implements support for fseek(). - * - * @param int $offset byte offset - * @param int $whence SEEK_SET, SEEK_CUR or SEEK_END - * - * @return bool - */ - public function stream_seek($offset, $whence) // @codingStandardsIgnoreLine - { - if ($whence == SEEK_SET && $offset >= 0) { - $this->pos = $offset; - } elseif ($whence == SEEK_CUR && -$offset <= $this->pos) { - $this->pos += $offset; - } elseif ($whence == SEEK_END && -$offset <= count($this->data)) { - $this->pos = strlen($this->data) + $offset; - } else { - return false; - } - - return true; - } - - /** - * Implements support for fstat(). Currently the only supported field is - * "size". - * - * @return array - */ - public function stream_stat() // @codingStandardsIgnoreLine - { - return [ - 'size' => strlen($this->data), - ]; - } - - // Methods used by stream_wrapper_register() that are not implemented: - // bool stream_flush ( void ) - // int stream_write ( string data ) - // bool rename ( string path_from, string path_to ) - // bool mkdir ( string path, int mode, int options ) - // bool rmdir ( string path, int options ) - // bool dir_opendir ( string path, int options ) - // array url_stat ( string path, int flags ) - // string dir_readdir ( void ) - // bool dir_rewinddir ( void ) - // bool dir_closedir ( void ) -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS.php deleted file mode 100644 index cf764d0..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS.php +++ /dev/null @@ -1,237 +0,0 @@ - | -// | Based on OLE::Storage_Lite by Kawai, Takanori | -// +----------------------------------------------------------------------+ -// -use PhpOffice\PhpSpreadsheet\Shared\OLE; - -/** - * Class for creating PPS's for OLE containers. - * - * @author Xavier Noguer - */ -class PPS -{ - /** - * The PPS index. - * - * @var int - */ - public $No; - - /** - * The PPS name (in Unicode). - * - * @var string - */ - public $Name; - - /** - * The PPS type. Dir, Root or File. - * - * @var int - */ - public $Type; - - /** - * The index of the previous PPS. - * - * @var int - */ - public $PrevPps; - - /** - * The index of the next PPS. - * - * @var int - */ - public $NextPps; - - /** - * The index of it's first child if this is a Dir or Root PPS. - * - * @var int - */ - public $DirPps; - - /** - * A timestamp. - * - * @var int - */ - public $Time1st; - - /** - * A timestamp. - * - * @var int - */ - public $Time2nd; - - /** - * Starting block (small or big) for this PPS's data inside the container. - * - * @var int - */ - public $startBlock; - - /** - * The size of the PPS's data (in bytes). - * - * @var int - */ - public $Size; - - /** - * The PPS's data (only used if it's not using a temporary file). - * - * @var string - */ - public $_data; - - /** - * Array of child PPS's (only used by Root and Dir PPS's). - * - * @var array - */ - public $children = []; - - /** - * Pointer to OLE container. - * - * @var OLE - */ - public $ole; - - /** - * The constructor. - * - * @param int $No The PPS index - * @param string $name The PPS name - * @param int $type The PPS type. Dir, Root or File - * @param int $prev The index of the previous PPS - * @param int $next The index of the next PPS - * @param int $dir The index of it's first child if this is a Dir or Root PPS - * @param int $time_1st A timestamp - * @param int $time_2nd A timestamp - * @param string $data The (usually binary) source data of the PPS - * @param array $children Array containing children PPS for this PPS - */ - public function __construct($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children) - { - $this->No = $No; - $this->Name = $name; - $this->Type = $type; - $this->PrevPps = $prev; - $this->NextPps = $next; - $this->DirPps = $dir; - $this->Time1st = $time_1st; - $this->Time2nd = $time_2nd; - $this->_data = $data; - $this->children = $children; - if ($data != '') { - $this->Size = strlen($data); - } else { - $this->Size = 0; - } - } - - /** - * Returns the amount of data saved for this PPS. - * - * @return int The amount of data (in bytes) - */ - public function getDataLen() - { - if (!isset($this->_data)) { - return 0; - } - - return strlen($this->_data); - } - - /** - * Returns a string with the PPS's WK (What is a WK?). - * - * @return string The binary string - */ - public function getPpsWk() - { - $ret = str_pad($this->Name, 64, "\x00"); - - $ret .= pack('v', strlen($this->Name) + 2) // 66 - . pack('c', $this->Type) // 67 - . pack('c', 0x00) //UK // 68 - . pack('V', $this->PrevPps) //Prev // 72 - . pack('V', $this->NextPps) //Next // 76 - . pack('V', $this->DirPps) //Dir // 80 - . "\x00\x09\x02\x00" // 84 - . "\x00\x00\x00\x00" // 88 - . "\xc0\x00\x00\x00" // 92 - . "\x00\x00\x00\x46" // 96 // Seems to be ok only for Root - . "\x00\x00\x00\x00" // 100 - . OLE::localDateToOLE($this->Time1st) // 108 - . OLE::localDateToOLE($this->Time2nd) // 116 - . pack('V', isset($this->startBlock) ? $this->startBlock : 0) // 120 - . pack('V', $this->Size) // 124 - . pack('V', 0); // 128 - - return $ret; - } - - /** - * Updates index and pointers to previous, next and children PPS's for this - * PPS. I don't think it'll work with Dir PPS's. - * - * @param array &$raList Reference to the array of PPS's for the whole OLE - * container - * @param mixed $to_save - * @param mixed $depth - * - * @return int The index for this PPS - */ - public static function savePpsSetPnt(&$raList, $to_save, $depth = 0) - { - if (!is_array($to_save) || (empty($to_save))) { - return 0xFFFFFFFF; - } elseif (count($to_save) == 1) { - $cnt = count($raList); - // If the first entry, it's the root... Don't clone it! - $raList[$cnt] = ($depth == 0) ? $to_save[0] : clone $to_save[0]; - $raList[$cnt]->No = $cnt; - $raList[$cnt]->PrevPps = 0xFFFFFFFF; - $raList[$cnt]->NextPps = 0xFFFFFFFF; - $raList[$cnt]->DirPps = self::savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++); - } else { - $iPos = floor(count($to_save) / 2); - $aPrev = array_slice($to_save, 0, $iPos); - $aNext = array_slice($to_save, $iPos + 1); - $cnt = count($raList); - // If the first entry, it's the root... Don't clone it! - $raList[$cnt] = ($depth == 0) ? $to_save[$iPos] : clone $to_save[$iPos]; - $raList[$cnt]->No = $cnt; - $raList[$cnt]->PrevPps = self::savePpsSetPnt($raList, $aPrev, $depth++); - $raList[$cnt]->NextPps = self::savePpsSetPnt($raList, $aNext, $depth++); - $raList[$cnt]->DirPps = self::savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++); - } - - return $cnt; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/File.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/File.php deleted file mode 100644 index dd1cda2..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/File.php +++ /dev/null @@ -1,64 +0,0 @@ - | -// | Based on OLE::Storage_Lite by Kawai, Takanori | -// +----------------------------------------------------------------------+ -// -use PhpOffice\PhpSpreadsheet\Shared\OLE; -use PhpOffice\PhpSpreadsheet\Shared\OLE\PPS; - -/** - * Class for creating File PPS's for OLE containers. - * - * @author Xavier Noguer - */ -class File extends PPS -{ - /** - * The constructor. - * - * @param string $name The name of the file (in Unicode) - * - * @see OLE::ascToUcs() - */ - public function __construct($name) - { - parent::__construct(null, $name, OLE::OLE_PPS_TYPE_FILE, null, null, null, null, null, '', []); - } - - /** - * Initialization method. Has to be called right after OLE_PPS_File(). - * - * @return mixed true on success - */ - public function init() - { - return true; - } - - /** - * Append data to PPS. - * - * @param string $data The data to append - */ - public function append($data): void - { - $this->_data .= $data; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php deleted file mode 100644 index 5466d2b..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php +++ /dev/null @@ -1,426 +0,0 @@ - | -// | Based on OLE::Storage_Lite by Kawai, Takanori | -// +----------------------------------------------------------------------+ -// -use PhpOffice\PhpSpreadsheet\Shared\OLE; -use PhpOffice\PhpSpreadsheet\Shared\OLE\PPS; - -/** - * Class for creating Root PPS's for OLE containers. - * - * @author Xavier Noguer - */ -class Root extends PPS -{ - /** - * @var resource - */ - private $fileHandle; - - /** - * @var int - */ - private $smallBlockSize; - - /** - * @var int - */ - private $bigBlockSize; - - /** - * @param int $time_1st A timestamp - * @param int $time_2nd A timestamp - * @param File[] $raChild - */ - public function __construct($time_1st, $time_2nd, $raChild) - { - parent::__construct(null, OLE::ascToUcs('Root Entry'), OLE::OLE_PPS_TYPE_ROOT, null, null, null, $time_1st, $time_2nd, null, $raChild); - } - - /** - * Method for saving the whole OLE container (including files). - * In fact, if called with an empty argument (or '-'), it saves to a - * temporary file and then outputs it's contents to stdout. - * If a resource pointer to a stream created by fopen() is passed - * it will be used, but you have to close such stream by yourself. - * - * @param resource $fileHandle the name of the file or stream where to save the OLE container - * - * @return bool true on success - */ - public function save($fileHandle) - { - $this->fileHandle = $fileHandle; - - // Initial Setting for saving - $this->bigBlockSize = 2 ** ( - (isset($this->bigBlockSize)) ? self::adjust2($this->bigBlockSize) : 9 - ); - $this->smallBlockSize = 2 ** ( - (isset($this->smallBlockSize)) ? self::adjust2($this->smallBlockSize) : 6 - ); - - // Make an array of PPS's (for Save) - $aList = []; - PPS::savePpsSetPnt($aList, [$this]); - // calculate values for header - [$iSBDcnt, $iBBcnt, $iPPScnt] = $this->calcSize($aList); //, $rhInfo); - // Save Header - $this->saveHeader($iSBDcnt, $iBBcnt, $iPPScnt); - - // Make Small Data string (write SBD) - $this->_data = $this->makeSmallData($aList); - - // Write BB - $this->saveBigData($iSBDcnt, $aList); - // Write PPS - $this->savePps($aList); - // Write Big Block Depot and BDList and Adding Header informations - $this->saveBbd($iSBDcnt, $iBBcnt, $iPPScnt); - - return true; - } - - /** - * Calculate some numbers. - * - * @param array $raList Reference to an array of PPS's - * - * @return float[] The array of numbers - */ - private function calcSize(&$raList) - { - // Calculate Basic Setting - [$iSBDcnt, $iBBcnt, $iPPScnt] = [0, 0, 0]; - $iSmallLen = 0; - $iSBcnt = 0; - $iCount = count($raList); - for ($i = 0; $i < $iCount; ++$i) { - if ($raList[$i]->Type == OLE::OLE_PPS_TYPE_FILE) { - $raList[$i]->Size = $raList[$i]->getDataLen(); - if ($raList[$i]->Size < OLE::OLE_DATA_SIZE_SMALL) { - $iSBcnt += floor($raList[$i]->Size / $this->smallBlockSize) - + (($raList[$i]->Size % $this->smallBlockSize) ? 1 : 0); - } else { - $iBBcnt += (floor($raList[$i]->Size / $this->bigBlockSize) + - (($raList[$i]->Size % $this->bigBlockSize) ? 1 : 0)); - } - } - } - $iSmallLen = $iSBcnt * $this->smallBlockSize; - $iSlCnt = floor($this->bigBlockSize / OLE::OLE_LONG_INT_SIZE); - $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt) ? 1 : 0); - $iBBcnt += (floor($iSmallLen / $this->bigBlockSize) + - (($iSmallLen % $this->bigBlockSize) ? 1 : 0)); - $iCnt = count($raList); - $iBdCnt = $this->bigBlockSize / OLE::OLE_PPS_SIZE; - $iPPScnt = (floor($iCnt / $iBdCnt) + (($iCnt % $iBdCnt) ? 1 : 0)); - - return [$iSBDcnt, $iBBcnt, $iPPScnt]; - } - - /** - * Helper function for caculating a magic value for block sizes. - * - * @param int $i2 The argument - * - * @return float - * - * @see save() - */ - private static function adjust2($i2) - { - $iWk = log($i2) / log(2); - - return ($iWk > floor($iWk)) ? floor($iWk) + 1 : $iWk; - } - - /** - * Save OLE header. - * - * @param int $iSBDcnt - * @param int $iBBcnt - * @param int $iPPScnt - */ - private function saveHeader($iSBDcnt, $iBBcnt, $iPPScnt): void - { - $FILE = $this->fileHandle; - - // Calculate Basic Setting - $iBlCnt = $this->bigBlockSize / OLE::OLE_LONG_INT_SIZE; - $i1stBdL = ($this->bigBlockSize - 0x4C) / OLE::OLE_LONG_INT_SIZE; - - $iBdExL = 0; - $iAll = $iBBcnt + $iPPScnt + $iSBDcnt; - $iAllW = $iAll; - $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt) ? 1 : 0); - $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW + $iBdCntW) % $iBlCnt) ? 1 : 0); - - // Calculate BD count - if ($iBdCnt > $i1stBdL) { - while (1) { - ++$iBdExL; - ++$iAllW; - $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt) ? 1 : 0); - $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW + $iBdCntW) % $iBlCnt) ? 1 : 0); - if ($iBdCnt <= ($iBdExL * $iBlCnt + $i1stBdL)) { - break; - } - } - } - - // Save Header - fwrite( - $FILE, - "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" - . "\x00\x00\x00\x00" - . "\x00\x00\x00\x00" - . "\x00\x00\x00\x00" - . "\x00\x00\x00\x00" - . pack('v', 0x3b) - . pack('v', 0x03) - . pack('v', -2) - . pack('v', 9) - . pack('v', 6) - . pack('v', 0) - . "\x00\x00\x00\x00" - . "\x00\x00\x00\x00" - . pack('V', $iBdCnt) - . pack('V', $iBBcnt + $iSBDcnt) //ROOT START - . pack('V', 0) - . pack('V', 0x1000) - . pack('V', $iSBDcnt ? 0 : -2) //Small Block Depot - . pack('V', $iSBDcnt) - ); - // Extra BDList Start, Count - if ($iBdCnt < $i1stBdL) { - fwrite( - $FILE, - pack('V', -2) // Extra BDList Start - . pack('V', 0)// Extra BDList Count - ); - } else { - fwrite($FILE, pack('V', $iAll + $iBdCnt) . pack('V', $iBdExL)); - } - - // BDList - for ($i = 0; $i < $i1stBdL && $i < $iBdCnt; ++$i) { - fwrite($FILE, pack('V', $iAll + $i)); - } - if ($i < $i1stBdL) { - $jB = $i1stBdL - $i; - for ($j = 0; $j < $jB; ++$j) { - fwrite($FILE, (pack('V', -1))); - } - } - } - - /** - * Saving big data (PPS's with data bigger than \PhpOffice\PhpSpreadsheet\Shared\OLE::OLE_DATA_SIZE_SMALL). - * - * @param int $iStBlk - * @param array &$raList Reference to array of PPS's - */ - private function saveBigData($iStBlk, &$raList): void - { - $FILE = $this->fileHandle; - - // cycle through PPS's - $iCount = count($raList); - for ($i = 0; $i < $iCount; ++$i) { - if ($raList[$i]->Type != OLE::OLE_PPS_TYPE_DIR) { - $raList[$i]->Size = $raList[$i]->getDataLen(); - if (($raList[$i]->Size >= OLE::OLE_DATA_SIZE_SMALL) || (($raList[$i]->Type == OLE::OLE_PPS_TYPE_ROOT) && isset($raList[$i]->_data))) { - fwrite($FILE, $raList[$i]->_data); - - if ($raList[$i]->Size % $this->bigBlockSize) { - fwrite($FILE, str_repeat("\x00", $this->bigBlockSize - ($raList[$i]->Size % $this->bigBlockSize))); - } - // Set For PPS - $raList[$i]->startBlock = $iStBlk; - $iStBlk += - (floor($raList[$i]->Size / $this->bigBlockSize) + - (($raList[$i]->Size % $this->bigBlockSize) ? 1 : 0)); - } - } - } - } - - /** - * get small data (PPS's with data smaller than \PhpOffice\PhpSpreadsheet\Shared\OLE::OLE_DATA_SIZE_SMALL). - * - * @param array &$raList Reference to array of PPS's - * - * @return string - */ - private function makeSmallData(&$raList) - { - $sRes = ''; - $FILE = $this->fileHandle; - $iSmBlk = 0; - - $iCount = count($raList); - for ($i = 0; $i < $iCount; ++$i) { - // Make SBD, small data string - if ($raList[$i]->Type == OLE::OLE_PPS_TYPE_FILE) { - if ($raList[$i]->Size <= 0) { - continue; - } - if ($raList[$i]->Size < OLE::OLE_DATA_SIZE_SMALL) { - $iSmbCnt = floor($raList[$i]->Size / $this->smallBlockSize) - + (($raList[$i]->Size % $this->smallBlockSize) ? 1 : 0); - // Add to SBD - $jB = $iSmbCnt - 1; - for ($j = 0; $j < $jB; ++$j) { - fwrite($FILE, pack('V', $j + $iSmBlk + 1)); - } - fwrite($FILE, pack('V', -2)); - - // Add to Data String(this will be written for RootEntry) - $sRes .= $raList[$i]->_data; - if ($raList[$i]->Size % $this->smallBlockSize) { - $sRes .= str_repeat("\x00", $this->smallBlockSize - ($raList[$i]->Size % $this->smallBlockSize)); - } - // Set for PPS - $raList[$i]->startBlock = $iSmBlk; - $iSmBlk += $iSmbCnt; - } - } - } - $iSbCnt = floor($this->bigBlockSize / OLE::OLE_LONG_INT_SIZE); - if ($iSmBlk % $iSbCnt) { - $iB = $iSbCnt - ($iSmBlk % $iSbCnt); - for ($i = 0; $i < $iB; ++$i) { - fwrite($FILE, pack('V', -1)); - } - } - - return $sRes; - } - - /** - * Saves all the PPS's WKs. - * - * @param array $raList Reference to an array with all PPS's - */ - private function savePps(&$raList): void - { - // Save each PPS WK - $iC = count($raList); - for ($i = 0; $i < $iC; ++$i) { - fwrite($this->fileHandle, $raList[$i]->getPpsWk()); - } - // Adjust for Block - $iCnt = count($raList); - $iBCnt = $this->bigBlockSize / OLE::OLE_PPS_SIZE; - if ($iCnt % $iBCnt) { - fwrite($this->fileHandle, str_repeat("\x00", ($iBCnt - ($iCnt % $iBCnt)) * OLE::OLE_PPS_SIZE)); - } - } - - /** - * Saving Big Block Depot. - * - * @param int $iSbdSize - * @param int $iBsize - * @param int $iPpsCnt - */ - private function saveBbd($iSbdSize, $iBsize, $iPpsCnt): void - { - $FILE = $this->fileHandle; - // Calculate Basic Setting - $iBbCnt = $this->bigBlockSize / OLE::OLE_LONG_INT_SIZE; - $i1stBdL = ($this->bigBlockSize - 0x4C) / OLE::OLE_LONG_INT_SIZE; - - $iBdExL = 0; - $iAll = $iBsize + $iPpsCnt + $iSbdSize; - $iAllW = $iAll; - $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt) ? 1 : 0); - $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW + $iBdCntW) % $iBbCnt) ? 1 : 0); - // Calculate BD count - if ($iBdCnt > $i1stBdL) { - while (1) { - ++$iBdExL; - ++$iAllW; - $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt) ? 1 : 0); - $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW + $iBdCntW) % $iBbCnt) ? 1 : 0); - if ($iBdCnt <= ($iBdExL * $iBbCnt + $i1stBdL)) { - break; - } - } - } - - // Making BD - // Set for SBD - if ($iSbdSize > 0) { - for ($i = 0; $i < ($iSbdSize - 1); ++$i) { - fwrite($FILE, pack('V', $i + 1)); - } - fwrite($FILE, pack('V', -2)); - } - // Set for B - for ($i = 0; $i < ($iBsize - 1); ++$i) { - fwrite($FILE, pack('V', $i + $iSbdSize + 1)); - } - fwrite($FILE, pack('V', -2)); - - // Set for PPS - for ($i = 0; $i < ($iPpsCnt - 1); ++$i) { - fwrite($FILE, pack('V', $i + $iSbdSize + $iBsize + 1)); - } - fwrite($FILE, pack('V', -2)); - // Set for BBD itself ( 0xFFFFFFFD : BBD) - for ($i = 0; $i < $iBdCnt; ++$i) { - fwrite($FILE, pack('V', 0xFFFFFFFD)); - } - // Set for ExtraBDList - for ($i = 0; $i < $iBdExL; ++$i) { - fwrite($FILE, pack('V', 0xFFFFFFFC)); - } - // Adjust for Block - if (($iAllW + $iBdCnt) % $iBbCnt) { - $iBlock = ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt)); - for ($i = 0; $i < $iBlock; ++$i) { - fwrite($FILE, pack('V', -1)); - } - } - // Extra BDList - if ($iBdCnt > $i1stBdL) { - $iN = 0; - $iNb = 0; - for ($i = $i1stBdL; $i < $iBdCnt; $i++, ++$iN) { - if ($iN >= ($iBbCnt - 1)) { - $iN = 0; - ++$iNb; - fwrite($FILE, pack('V', $iAll + $iBdCnt + $iNb)); - } - fwrite($FILE, pack('V', $iBsize + $iSbdSize + $iPpsCnt + $i)); - } - if (($iBdCnt - $i1stBdL) % ($iBbCnt - 1)) { - $iB = ($iBbCnt - 1) - (($iBdCnt - $i1stBdL) % ($iBbCnt - 1)); - for ($i = 0; $i < $iB; ++$i) { - fwrite($FILE, pack('V', -1)); - } - } - fwrite($FILE, pack('V', -2)); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLERead.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLERead.php deleted file mode 100644 index 7112b09..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLERead.php +++ /dev/null @@ -1,350 +0,0 @@ -data = file_get_contents($pFilename, false, null, 0, 8); - - // Check OLE identifier - $identifierOle = pack('CCCCCCCC', 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1); - if ($this->data != $identifierOle) { - throw new ReaderException('The filename ' . $pFilename . ' is not recognised as an OLE file'); - } - - // Get the file data - $this->data = file_get_contents($pFilename); - - // Total number of sectors used for the SAT - $this->numBigBlockDepotBlocks = self::getInt4d($this->data, self::NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); - - // SecID of the first sector of the directory stream - $this->rootStartBlock = self::getInt4d($this->data, self::ROOT_START_BLOCK_POS); - - // SecID of the first sector of the SSAT (or -2 if not extant) - $this->sbdStartBlock = self::getInt4d($this->data, self::SMALL_BLOCK_DEPOT_BLOCK_POS); - - // SecID of the first sector of the MSAT (or -2 if no additional sectors are used) - $this->extensionBlock = self::getInt4d($this->data, self::EXTENSION_BLOCK_POS); - - // Total number of sectors used by MSAT - $this->numExtensionBlocks = self::getInt4d($this->data, self::NUM_EXTENSION_BLOCK_POS); - - $bigBlockDepotBlocks = []; - $pos = self::BIG_BLOCK_DEPOT_BLOCKS_POS; - - $bbdBlocks = $this->numBigBlockDepotBlocks; - - if ($this->numExtensionBlocks != 0) { - $bbdBlocks = (self::BIG_BLOCK_SIZE - self::BIG_BLOCK_DEPOT_BLOCKS_POS) / 4; - } - - for ($i = 0; $i < $bbdBlocks; ++$i) { - $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos); - $pos += 4; - } - - for ($j = 0; $j < $this->numExtensionBlocks; ++$j) { - $pos = ($this->extensionBlock + 1) * self::BIG_BLOCK_SIZE; - $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1); - - for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; ++$i) { - $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos); - $pos += 4; - } - - $bbdBlocks += $blocksToRead; - if ($bbdBlocks < $this->numBigBlockDepotBlocks) { - $this->extensionBlock = self::getInt4d($this->data, $pos); - } - } - - $pos = 0; - $this->bigBlockChain = ''; - $bbs = self::BIG_BLOCK_SIZE / 4; - for ($i = 0; $i < $this->numBigBlockDepotBlocks; ++$i) { - $pos = ($bigBlockDepotBlocks[$i] + 1) * self::BIG_BLOCK_SIZE; - - $this->bigBlockChain .= substr($this->data, $pos, 4 * $bbs); - $pos += 4 * $bbs; - } - - $pos = 0; - $sbdBlock = $this->sbdStartBlock; - $this->smallBlockChain = ''; - while ($sbdBlock != -2) { - $pos = ($sbdBlock + 1) * self::BIG_BLOCK_SIZE; - - $this->smallBlockChain .= substr($this->data, $pos, 4 * $bbs); - $pos += 4 * $bbs; - - $sbdBlock = self::getInt4d($this->bigBlockChain, $sbdBlock * 4); - } - - // read the directory stream - $block = $this->rootStartBlock; - $this->entry = $this->readData($block); - - $this->readPropertySets(); - } - - /** - * Extract binary stream data. - * - * @param int $stream - * - * @return string - */ - public function getStream($stream) - { - if ($stream === null) { - return null; - } - - $streamData = ''; - - if ($this->props[$stream]['size'] < self::SMALL_BLOCK_THRESHOLD) { - $rootdata = $this->readData($this->props[$this->rootentry]['startBlock']); - - $block = $this->props[$stream]['startBlock']; - - while ($block != -2) { - $pos = $block * self::SMALL_BLOCK_SIZE; - $streamData .= substr($rootdata, $pos, self::SMALL_BLOCK_SIZE); - - $block = self::getInt4d($this->smallBlockChain, $block * 4); - } - - return $streamData; - } - $numBlocks = $this->props[$stream]['size'] / self::BIG_BLOCK_SIZE; - if ($this->props[$stream]['size'] % self::BIG_BLOCK_SIZE != 0) { - ++$numBlocks; - } - - if ($numBlocks == 0) { - return ''; - } - - $block = $this->props[$stream]['startBlock']; - - while ($block != -2) { - $pos = ($block + 1) * self::BIG_BLOCK_SIZE; - $streamData .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); - $block = self::getInt4d($this->bigBlockChain, $block * 4); - } - - return $streamData; - } - - /** - * Read a standard stream (by joining sectors using information from SAT). - * - * @param int $bl Sector ID where the stream starts - * - * @return string Data for standard stream - */ - private function readData($bl) - { - $block = $bl; - $data = ''; - - while ($block != -2) { - $pos = ($block + 1) * self::BIG_BLOCK_SIZE; - $data .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); - $block = self::getInt4d($this->bigBlockChain, $block * 4); - } - - return $data; - } - - /** - * Read entries in the directory stream. - */ - private function readPropertySets(): void - { - $offset = 0; - - // loop through entires, each entry is 128 bytes - $entryLen = strlen($this->entry); - while ($offset < $entryLen) { - // entry data (128 bytes) - $d = substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); - - // size in bytes of name - $nameSize = ord($d[self::SIZE_OF_NAME_POS]) | (ord($d[self::SIZE_OF_NAME_POS + 1]) << 8); - - // type of entry - $type = ord($d[self::TYPE_POS]); - - // sectorID of first sector or short sector, if this entry refers to a stream (the case with workbook) - // sectorID of first sector of the short-stream container stream, if this entry is root entry - $startBlock = self::getInt4d($d, self::START_BLOCK_POS); - - $size = self::getInt4d($d, self::SIZE_POS); - - $name = str_replace("\x00", '', substr($d, 0, $nameSize)); - - $this->props[] = [ - 'name' => $name, - 'type' => $type, - 'startBlock' => $startBlock, - 'size' => $size, - ]; - - // tmp helper to simplify checks - $upName = strtoupper($name); - - // Workbook directory entry (BIFF5 uses Book, BIFF8 uses Workbook) - if (($upName === 'WORKBOOK') || ($upName === 'BOOK')) { - $this->wrkbook = count($this->props) - 1; - } elseif ($upName === 'ROOT ENTRY' || $upName === 'R') { - // Root entry - $this->rootentry = count($this->props) - 1; - } - - // Summary information - if ($name == chr(5) . 'SummaryInformation') { - $this->summaryInformation = count($this->props) - 1; - } - - // Additional Document Summary information - if ($name == chr(5) . 'DocumentSummaryInformation') { - $this->documentSummaryInformation = count($this->props) - 1; - } - - $offset += self::PROPERTY_STORAGE_BLOCK_SIZE; - } - } - - /** - * Read 4 bytes of data at specified position. - * - * @param string $data - * @param int $pos - * - * @return int - */ - private static function getInt4d($data, $pos) - { - if ($pos < 0) { - // Invalid position - throw new ReaderException('Parameter pos=' . $pos . ' is invalid.'); - } - - $len = strlen($data); - if ($len < $pos + 4) { - $data .= str_repeat("\0", $pos + 4 - $len); - } - - // FIX: represent numbers correctly on 64-bit system - // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 - // Changed by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems - $_or_24 = ord($data[$pos + 3]); - if ($_or_24 >= 128) { - // negative number - $_ord_24 = -abs((256 - $_or_24) << 24); - } else { - $_ord_24 = ($_or_24 & 127) << 24; - } - - return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $_ord_24; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/PasswordHasher.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/PasswordHasher.php deleted file mode 100644 index 9fefe88..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/PasswordHasher.php +++ /dev/null @@ -1,100 +0,0 @@ - 'md2', - Protection::ALGORITHM_MD4 => 'md4', - Protection::ALGORITHM_MD5 => 'md5', - Protection::ALGORITHM_SHA_1 => 'sha1', - Protection::ALGORITHM_SHA_256 => 'sha256', - Protection::ALGORITHM_SHA_384 => 'sha384', - Protection::ALGORITHM_SHA_512 => 'sha512', - Protection::ALGORITHM_RIPEMD_128 => 'ripemd128', - Protection::ALGORITHM_RIPEMD_160 => 'ripemd160', - Protection::ALGORITHM_WHIRLPOOL => 'whirlpool', - ]; - - if (array_key_exists($algorithmName, $mapping)) { - return $mapping[$algorithmName]; - } - - throw new Exception('Unsupported password algorithm: ' . $algorithmName); - } - - /** - * Create a password hash from a given string. - * - * This method is based on the algorithm provided by - * Daniel Rentz of OpenOffice and the PEAR package - * Spreadsheet_Excel_Writer by Xavier Noguer . - * - * @param string $pPassword Password to hash - */ - private static function defaultHashPassword(string $pPassword): string - { - $password = 0x0000; - $charPos = 1; // char position - - // split the plain text password in its component characters - $chars = preg_split('//', $pPassword, -1, PREG_SPLIT_NO_EMPTY); - foreach ($chars as $char) { - $value = ord($char) << $charPos++; // shifted ASCII value - $rotated_bits = $value >> 15; // rotated bits beyond bit 15 - $value &= 0x7fff; // first 15 bits - $password ^= ($value | $rotated_bits); - } - - $password ^= strlen($pPassword); - $password ^= 0xCE4B; - - return strtoupper(dechex($password)); - } - - /** - * Create a password hash from a given string by a specific algorithm. - * - * 2.4.2.4 ISO Write Protection Method - * - * @see https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-offcrypto/1357ea58-646e-4483-92ef-95d718079d6f - * - * @param string $password Password to hash - * @param string $algorithm Hash algorithm used to compute the password hash value - * @param string $salt Pseudorandom string - * @param int $spinCount Number of times to iterate on a hash of a password - * - * @return string Hashed password - */ - public static function hashPassword(string $password, string $algorithm = '', string $salt = '', int $spinCount = 10000): string - { - $phpAlgorithm = self::getAlgorithm($algorithm); - if (!$phpAlgorithm) { - return self::defaultHashPassword($password); - } - - $saltValue = base64_decode($salt); - $encodedPassword = mb_convert_encoding($password, 'UCS-2LE', 'UTF-8'); - - $hashValue = hash($phpAlgorithm, $saltValue . $encodedPassword, true); - for ($i = 0; $i < $spinCount; ++$i) { - $hashValue = hash($phpAlgorithm, $hashValue . pack('L', $i), true); - } - - return base64_encode($hashValue); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php deleted file mode 100644 index 9ae3241..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php +++ /dev/null @@ -1,722 +0,0 @@ - chr(0), - "\x1B 1" => chr(1), - "\x1B 2" => chr(2), - "\x1B 3" => chr(3), - "\x1B 4" => chr(4), - "\x1B 5" => chr(5), - "\x1B 6" => chr(6), - "\x1B 7" => chr(7), - "\x1B 8" => chr(8), - "\x1B 9" => chr(9), - "\x1B :" => chr(10), - "\x1B ;" => chr(11), - "\x1B <" => chr(12), - "\x1B =" => chr(13), - "\x1B >" => chr(14), - "\x1B ?" => chr(15), - "\x1B!0" => chr(16), - "\x1B!1" => chr(17), - "\x1B!2" => chr(18), - "\x1B!3" => chr(19), - "\x1B!4" => chr(20), - "\x1B!5" => chr(21), - "\x1B!6" => chr(22), - "\x1B!7" => chr(23), - "\x1B!8" => chr(24), - "\x1B!9" => chr(25), - "\x1B!:" => chr(26), - "\x1B!;" => chr(27), - "\x1B!<" => chr(28), - "\x1B!=" => chr(29), - "\x1B!>" => chr(30), - "\x1B!?" => chr(31), - "\x1B'?" => chr(127), - "\x1B(0" => '€', // 128 in CP1252 - "\x1B(2" => 'ā€š', // 130 in CP1252 - "\x1B(3" => 'ʒ', // 131 in CP1252 - "\x1B(4" => 'ā€ž', // 132 in CP1252 - "\x1B(5" => '…', // 133 in CP1252 - "\x1B(6" => '†', // 134 in CP1252 - "\x1B(7" => '—', // 135 in CP1252 - "\x1B(8" => 'ˆ', // 136 in CP1252 - "\x1B(9" => '‰', // 137 in CP1252 - "\x1B(:" => 'Å ', // 138 in CP1252 - "\x1B(;" => '‹', // 139 in CP1252 - "\x1BNj" => 'Œ', // 140 in CP1252 - "\x1B(>" => 'Ž', // 142 in CP1252 - "\x1B)1" => 'ā€˜', // 145 in CP1252 - "\x1B)2" => '’', // 146 in CP1252 - "\x1B)3" => 'ā€œ', // 147 in CP1252 - "\x1B)4" => 'ā€', // 148 in CP1252 - "\x1B)5" => '•', // 149 in CP1252 - "\x1B)6" => '–', // 150 in CP1252 - "\x1B)7" => '—', // 151 in CP1252 - "\x1B)8" => '˜', // 152 in CP1252 - "\x1B)9" => 'ā„¢', // 153 in CP1252 - "\x1B):" => 'Å”', // 154 in CP1252 - "\x1B);" => '›', // 155 in CP1252 - "\x1BNz" => 'œ', // 156 in CP1252 - "\x1B)>" => 'ž', // 158 in CP1252 - "\x1B)?" => 'Åø', // 159 in CP1252 - "\x1B*0" => ' ', // 160 in CP1252 - "\x1BN!" => 'Ā”', // 161 in CP1252 - "\x1BN\"" => 'Ā¢', // 162 in CP1252 - "\x1BN#" => 'Ā£', // 163 in CP1252 - "\x1BN(" => '¤', // 164 in CP1252 - "\x1BN%" => 'Ā„', // 165 in CP1252 - "\x1B*6" => '¦', // 166 in CP1252 - "\x1BN'" => '§', // 167 in CP1252 - "\x1BNH " => 'ĀØ', // 168 in CP1252 - "\x1BNS" => 'Ā©', // 169 in CP1252 - "\x1BNc" => 'ĀŖ', // 170 in CP1252 - "\x1BN+" => 'Ā«', // 171 in CP1252 - "\x1B*<" => '¬', // 172 in CP1252 - "\x1B*=" => 'Ā­', // 173 in CP1252 - "\x1BNR" => 'Ā®', // 174 in CP1252 - "\x1B*?" => 'ĀÆ', // 175 in CP1252 - "\x1BN0" => '°', // 176 in CP1252 - "\x1BN1" => '±', // 177 in CP1252 - "\x1BN2" => '²', // 178 in CP1252 - "\x1BN3" => '³', // 179 in CP1252 - "\x1BNB " => 'Ā“', // 180 in CP1252 - "\x1BN5" => 'µ', // 181 in CP1252 - "\x1BN6" => '¶', // 182 in CP1252 - "\x1BN7" => 'Ā·', // 183 in CP1252 - "\x1B+8" => 'Āø', // 184 in CP1252 - "\x1BNQ" => '¹', // 185 in CP1252 - "\x1BNk" => 'Āŗ', // 186 in CP1252 - "\x1BN;" => 'Ā»', // 187 in CP1252 - "\x1BN<" => '¼', // 188 in CP1252 - "\x1BN=" => '½', // 189 in CP1252 - "\x1BN>" => '¾', // 190 in CP1252 - "\x1BN?" => 'Āæ', // 191 in CP1252 - "\x1BNAA" => 'ƀ', // 192 in CP1252 - "\x1BNBA" => 'Ɓ', // 193 in CP1252 - "\x1BNCA" => 'Ƃ', // 194 in CP1252 - "\x1BNDA" => 'ƃ', // 195 in CP1252 - "\x1BNHA" => 'Ƅ', // 196 in CP1252 - "\x1BNJA" => 'ƅ', // 197 in CP1252 - "\x1BNa" => 'Ɔ', // 198 in CP1252 - "\x1BNKC" => 'Ƈ', // 199 in CP1252 - "\x1BNAE" => 'ƈ', // 200 in CP1252 - "\x1BNBE" => 'Ɖ', // 201 in CP1252 - "\x1BNCE" => 'Ê', // 202 in CP1252 - "\x1BNHE" => 'Ƌ', // 203 in CP1252 - "\x1BNAI" => 'Ì', // 204 in CP1252 - "\x1BNBI" => 'ƍ', // 205 in CP1252 - "\x1BNCI" => 'Ǝ', // 206 in CP1252 - "\x1BNHI" => 'Ə', // 207 in CP1252 - "\x1BNb" => 'Ɛ', // 208 in CP1252 - "\x1BNDN" => 'Ƒ', // 209 in CP1252 - "\x1BNAO" => 'ƒ', // 210 in CP1252 - "\x1BNBO" => 'Ɠ', // 211 in CP1252 - "\x1BNCO" => 'Ɣ', // 212 in CP1252 - "\x1BNDO" => 'ƕ', // 213 in CP1252 - "\x1BNHO" => 'Ɩ', // 214 in CP1252 - "\x1B-7" => 'Ɨ', // 215 in CP1252 - "\x1BNi" => 'Ƙ', // 216 in CP1252 - "\x1BNAU" => 'ƙ', // 217 in CP1252 - "\x1BNBU" => 'Ú', // 218 in CP1252 - "\x1BNCU" => 'ƛ', // 219 in CP1252 - "\x1BNHU" => 'Ü', // 220 in CP1252 - "\x1B-=" => 'Ɲ', // 221 in CP1252 - "\x1BNl" => 'ƞ', // 222 in CP1252 - "\x1BN{" => 'ß', // 223 in CP1252 - "\x1BNAa" => 'Ć ', // 224 in CP1252 - "\x1BNBa" => 'Ć”', // 225 in CP1252 - "\x1BNCa" => 'Ć¢', // 226 in CP1252 - "\x1BNDa" => 'Ć£', // 227 in CP1252 - "\x1BNHa" => 'Ƥ', // 228 in CP1252 - "\x1BNJa" => 'Ć„', // 229 in CP1252 - "\x1BNq" => 'Ʀ', // 230 in CP1252 - "\x1BNKc" => 'Ƨ', // 231 in CP1252 - "\x1BNAe" => 'ĆØ', // 232 in CP1252 - "\x1BNBe" => 'Ć©', // 233 in CP1252 - "\x1BNCe" => 'ĆŖ', // 234 in CP1252 - "\x1BNHe" => 'Ć«', // 235 in CP1252 - "\x1BNAi" => 'Ƭ', // 236 in CP1252 - "\x1BNBi" => 'Ć­', // 237 in CP1252 - "\x1BNCi" => 'Ć®', // 238 in CP1252 - "\x1BNHi" => 'ĆÆ', // 239 in CP1252 - "\x1BNs" => 'ư', // 240 in CP1252 - "\x1BNDn" => 'Ʊ', // 241 in CP1252 - "\x1BNAo" => 'ò', // 242 in CP1252 - "\x1BNBo" => 'ó', // 243 in CP1252 - "\x1BNCo" => 'Ć“', // 244 in CP1252 - "\x1BNDo" => 'Ƶ', // 245 in CP1252 - "\x1BNHo" => 'ƶ', // 246 in CP1252 - "\x1B/7" => 'Ć·', // 247 in CP1252 - "\x1BNy" => 'Ćø', // 248 in CP1252 - "\x1BNAu" => 'ù', // 249 in CP1252 - "\x1BNBu" => 'Ćŗ', // 250 in CP1252 - "\x1BNCu" => 'Ć»', // 251 in CP1252 - "\x1BNHu" => 'ü', // 252 in CP1252 - "\x1B/=" => 'ý', // 253 in CP1252 - "\x1BN|" => 'þ', // 254 in CP1252 - "\x1BNHy" => 'Ćæ', // 255 in CP1252 - ]; - } - - /** - * Get whether iconv extension is available. - * - * @return bool - */ - public static function getIsIconvEnabled() - { - if (isset(self::$isIconvEnabled)) { - return self::$isIconvEnabled; - } - - // Assume no problems with iconv - self::$isIconvEnabled = true; - - // Fail if iconv doesn't exist - if (!function_exists('iconv')) { - self::$isIconvEnabled = false; - } elseif (!@iconv('UTF-8', 'UTF-16LE', 'x')) { - // Sometimes iconv is not working, and e.g. iconv('UTF-8', 'UTF-16LE', 'x') just returns false, - self::$isIconvEnabled = false; - } elseif (defined('PHP_OS') && @stristr(PHP_OS, 'AIX') && defined('ICONV_IMPL') && (@strcasecmp(ICONV_IMPL, 'unknown') == 0) && defined('ICONV_VERSION') && (@strcasecmp(ICONV_VERSION, 'unknown') == 0)) { - // CUSTOM: IBM AIX iconv() does not work - self::$isIconvEnabled = false; - } - - // Deactivate iconv default options if they fail (as seen on IMB i) - if (self::$isIconvEnabled && !@iconv('UTF-8', 'UTF-16LE' . self::$iconvOptions, 'x')) { - self::$iconvOptions = ''; - } - - return self::$isIconvEnabled; - } - - private static function buildCharacterSets(): void - { - if (empty(self::$controlCharacters)) { - self::buildControlCharacters(); - } - - if (empty(self::$SYLKCharacters)) { - self::buildSYLKCharacters(); - } - } - - /** - * Convert from OpenXML escaped control character to PHP control character. - * - * Excel 2007 team: - * ---------------- - * That's correct, control characters are stored directly in the shared-strings table. - * We do encode characters that cannot be represented in XML using the following escape sequence: - * _xHHHH_ where H represents a hexadecimal character in the character's value... - * So you could end up with something like _x0008_ in a string (either in a cell value () - * element or in the shared string element. - * - * @param string $value Value to unescape - * - * @return string - */ - public static function controlCharacterOOXML2PHP($value) - { - self::buildCharacterSets(); - - return str_replace(array_keys(self::$controlCharacters), array_values(self::$controlCharacters), $value); - } - - /** - * Convert from PHP control character to OpenXML escaped control character. - * - * Excel 2007 team: - * ---------------- - * That's correct, control characters are stored directly in the shared-strings table. - * We do encode characters that cannot be represented in XML using the following escape sequence: - * _xHHHH_ where H represents a hexadecimal character in the character's value... - * So you could end up with something like _x0008_ in a string (either in a cell value () - * element or in the shared string element. - * - * @param string $value Value to escape - * - * @return string - */ - public static function controlCharacterPHP2OOXML($value) - { - self::buildCharacterSets(); - - return str_replace(array_values(self::$controlCharacters), array_keys(self::$controlCharacters), $value); - } - - /** - * Try to sanitize UTF8, stripping invalid byte sequences. Not perfect. Does not surrogate characters. - * - * @param string $value - * - * @return string - */ - public static function sanitizeUTF8($value) - { - if (self::getIsIconvEnabled()) { - $value = @iconv('UTF-8', 'UTF-8', $value); - - return $value; - } - - $value = mb_convert_encoding($value, 'UTF-8', 'UTF-8'); - - return $value; - } - - /** - * Check if a string contains UTF8 data. - * - * @param string $value - * - * @return bool - */ - public static function isUTF8($value) - { - return $value === '' || preg_match('/^./su', $value) === 1; - } - - /** - * Formats a numeric value as a string for output in various output writers forcing - * point as decimal separator in case locale is other than English. - * - * @param mixed $value - * - * @return string - */ - public static function formatNumber($value) - { - if (is_float($value)) { - return str_replace(',', '.', $value); - } - - return (string) $value; - } - - /** - * Converts a UTF-8 string into BIFF8 Unicode string data (8-bit string length) - * Writes the string using uncompressed notation, no rich text, no Asian phonetics - * If mbstring extension is not available, ASCII is assumed, and compressed notation is used - * although this will give wrong results for non-ASCII strings - * see OpenOffice.org's Documentation of the Microsoft Excel File Format, sect. 2.5.3. - * - * @param string $value UTF-8 encoded string - * @param mixed[] $arrcRuns Details of rich text runs in $value - * - * @return string - */ - public static function UTF8toBIFF8UnicodeShort($value, $arrcRuns = []) - { - // character count - $ln = self::countCharacters($value, 'UTF-8'); - // option flags - if (empty($arrcRuns)) { - $data = pack('CC', $ln, 0x0001); - // characters - $data .= self::convertEncoding($value, 'UTF-16LE', 'UTF-8'); - } else { - $data = pack('vC', $ln, 0x09); - $data .= pack('v', count($arrcRuns)); - // characters - $data .= self::convertEncoding($value, 'UTF-16LE', 'UTF-8'); - foreach ($arrcRuns as $cRun) { - $data .= pack('v', $cRun['strlen']); - $data .= pack('v', $cRun['fontidx']); - } - } - - return $data; - } - - /** - * Converts a UTF-8 string into BIFF8 Unicode string data (16-bit string length) - * Writes the string using uncompressed notation, no rich text, no Asian phonetics - * If mbstring extension is not available, ASCII is assumed, and compressed notation is used - * although this will give wrong results for non-ASCII strings - * see OpenOffice.org's Documentation of the Microsoft Excel File Format, sect. 2.5.3. - * - * @param string $value UTF-8 encoded string - * - * @return string - */ - public static function UTF8toBIFF8UnicodeLong($value) - { - // character count - $ln = self::countCharacters($value, 'UTF-8'); - - // characters - $chars = self::convertEncoding($value, 'UTF-16LE', 'UTF-8'); - - return pack('vC', $ln, 0x0001) . $chars; - } - - /** - * Convert string from one encoding to another. - * - * @param string $value - * @param string $to Encoding to convert to, e.g. 'UTF-8' - * @param string $from Encoding to convert from, e.g. 'UTF-16LE' - * - * @return string - */ - public static function convertEncoding($value, $to, $from) - { - if (self::getIsIconvEnabled()) { - $result = iconv($from, $to . self::$iconvOptions, $value); - if (false !== $result) { - return $result; - } - } - - return mb_convert_encoding($value, $to, $from); - } - - /** - * Get character count. - * - * @param string $value - * @param string $enc Encoding - * - * @return int Character count - */ - public static function countCharacters($value, $enc = 'UTF-8') - { - return mb_strlen($value, $enc); - } - - /** - * Get a substring of a UTF-8 encoded string. - * - * @param string $pValue UTF-8 encoded string - * @param int $pStart Start offset - * @param int $pLength Maximum number of characters in substring - * - * @return string - */ - public static function substring($pValue, $pStart, $pLength = 0) - { - return mb_substr($pValue, $pStart, $pLength, 'UTF-8'); - } - - /** - * Convert a UTF-8 encoded string to upper case. - * - * @param string $pValue UTF-8 encoded string - * - * @return string - */ - public static function strToUpper($pValue) - { - return mb_convert_case($pValue, MB_CASE_UPPER, 'UTF-8'); - } - - /** - * Convert a UTF-8 encoded string to lower case. - * - * @param string $pValue UTF-8 encoded string - * - * @return string - */ - public static function strToLower($pValue) - { - return mb_convert_case($pValue, MB_CASE_LOWER, 'UTF-8'); - } - - /** - * Convert a UTF-8 encoded string to title/proper case - * (uppercase every first character in each word, lower case all other characters). - * - * @param string $pValue UTF-8 encoded string - * - * @return string - */ - public static function strToTitle($pValue) - { - return mb_convert_case($pValue, MB_CASE_TITLE, 'UTF-8'); - } - - public static function mbIsUpper($char) - { - return mb_strtolower($char, 'UTF-8') != $char; - } - - public static function mbStrSplit($string) - { - // Split at all position not after the start: ^ - // and not before the end: $ - return preg_split('/(?_calculateFormulaValue($fractionFormula); - - return true; - } - - return false; - } - - // function convertToNumberIfFraction() - - /** - * Get the decimal separator. If it has not yet been set explicitly, try to obtain number - * formatting information from locale. - * - * @return string - */ - public static function getDecimalSeparator() - { - if (!isset(self::$decimalSeparator)) { - $localeconv = localeconv(); - self::$decimalSeparator = ($localeconv['decimal_point'] != '') - ? $localeconv['decimal_point'] : $localeconv['mon_decimal_point']; - - if (self::$decimalSeparator == '') { - // Default to . - self::$decimalSeparator = '.'; - } - } - - return self::$decimalSeparator; - } - - /** - * Set the decimal separator. Only used by NumberFormat::toFormattedString() - * to format output by \PhpOffice\PhpSpreadsheet\Writer\Html and \PhpOffice\PhpSpreadsheet\Writer\Pdf. - * - * @param string $pValue Character for decimal separator - */ - public static function setDecimalSeparator($pValue): void - { - self::$decimalSeparator = $pValue; - } - - /** - * Get the thousands separator. If it has not yet been set explicitly, try to obtain number - * formatting information from locale. - * - * @return string - */ - public static function getThousandsSeparator() - { - if (!isset(self::$thousandsSeparator)) { - $localeconv = localeconv(); - self::$thousandsSeparator = ($localeconv['thousands_sep'] != '') - ? $localeconv['thousands_sep'] : $localeconv['mon_thousands_sep']; - - if (self::$thousandsSeparator == '') { - // Default to . - self::$thousandsSeparator = ','; - } - } - - return self::$thousandsSeparator; - } - - /** - * Set the thousands separator. Only used by NumberFormat::toFormattedString() - * to format output by \PhpOffice\PhpSpreadsheet\Writer\Html and \PhpOffice\PhpSpreadsheet\Writer\Pdf. - * - * @param string $pValue Character for thousands separator - */ - public static function setThousandsSeparator($pValue): void - { - self::$thousandsSeparator = $pValue; - } - - /** - * Get the currency code. If it has not yet been set explicitly, try to obtain the - * symbol information from locale. - * - * @return string - */ - public static function getCurrencyCode() - { - if (!empty(self::$currencyCode)) { - return self::$currencyCode; - } - self::$currencyCode = '$'; - $localeconv = localeconv(); - if (!empty($localeconv['currency_symbol'])) { - self::$currencyCode = $localeconv['currency_symbol']; - - return self::$currencyCode; - } - if (!empty($localeconv['int_curr_symbol'])) { - self::$currencyCode = $localeconv['int_curr_symbol']; - - return self::$currencyCode; - } - - return self::$currencyCode; - } - - /** - * Set the currency code. Only used by NumberFormat::toFormattedString() - * to format output by \PhpOffice\PhpSpreadsheet\Writer\Html and \PhpOffice\PhpSpreadsheet\Writer\Pdf. - * - * @param string $pValue Character for currency code - */ - public static function setCurrencyCode($pValue): void - { - self::$currencyCode = $pValue; - } - - /** - * Convert SYLK encoded string to UTF-8. - * - * @param string $pValue - * - * @return string UTF-8 encoded string - */ - public static function SYLKtoUTF8($pValue) - { - self::buildCharacterSets(); - - // If there is no escape character in the string there is nothing to do - if (strpos($pValue, '') === false) { - return $pValue; - } - - foreach (self::$SYLKCharacters as $k => $v) { - $pValue = str_replace($k, $v, $pValue); - } - - return $pValue; - } - - /** - * Retrieve any leading numeric part of a string, or return the full string if no leading numeric - * (handles basic integer or float, but not exponent or non decimal). - * - * @param string $value - * - * @return mixed string or only the leading numeric part of the string - */ - public static function testStringAsNumeric($value) - { - if (is_numeric($value)) { - return $value; - } - $v = (float) $value; - - return (is_numeric(substr($value, 0, strlen($v)))) ? $v : $value; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/TimeZone.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/TimeZone.php deleted file mode 100644 index 43fd365..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/TimeZone.php +++ /dev/null @@ -1,81 +0,0 @@ -getTransitions($timestamp, $timestamp); - - return (count($transitions) > 0) ? $transitions[0]['offset'] : 0; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/BestFit.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/BestFit.php deleted file mode 100644 index c949972..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/BestFit.php +++ /dev/null @@ -1,463 +0,0 @@ -error; - } - - public function getBestFitType() - { - return $this->bestFitType; - } - - /** - * Return the Y-Value for a specified value of X. - * - * @param float $xValue X-Value - * - * @return bool Y-Value - */ - public function getValueOfYForX($xValue) - { - return false; - } - - /** - * Return the X-Value for a specified value of Y. - * - * @param float $yValue Y-Value - * - * @return bool X-Value - */ - public function getValueOfXForY($yValue) - { - return false; - } - - /** - * Return the original set of X-Values. - * - * @return float[] X-Values - */ - public function getXValues() - { - return $this->xValues; - } - - /** - * Return the Equation of the best-fit line. - * - * @param int $dp Number of places of decimal precision to display - * - * @return bool - */ - public function getEquation($dp = 0) - { - return false; - } - - /** - * Return the Slope of the line. - * - * @param int $dp Number of places of decimal precision to display - * - * @return float - */ - public function getSlope($dp = 0) - { - if ($dp != 0) { - return round($this->slope, $dp); - } - - return $this->slope; - } - - /** - * Return the standard error of the Slope. - * - * @param int $dp Number of places of decimal precision to display - * - * @return float - */ - public function getSlopeSE($dp = 0) - { - if ($dp != 0) { - return round($this->slopeSE, $dp); - } - - return $this->slopeSE; - } - - /** - * Return the Value of X where it intersects Y = 0. - * - * @param int $dp Number of places of decimal precision to display - * - * @return float - */ - public function getIntersect($dp = 0) - { - if ($dp != 0) { - return round($this->intersect, $dp); - } - - return $this->intersect; - } - - /** - * Return the standard error of the Intersect. - * - * @param int $dp Number of places of decimal precision to display - * - * @return float - */ - public function getIntersectSE($dp = 0) - { - if ($dp != 0) { - return round($this->intersectSE, $dp); - } - - return $this->intersectSE; - } - - /** - * Return the goodness of fit for this regression. - * - * @param int $dp Number of places of decimal precision to return - * - * @return float - */ - public function getGoodnessOfFit($dp = 0) - { - if ($dp != 0) { - return round($this->goodnessOfFit, $dp); - } - - return $this->goodnessOfFit; - } - - /** - * Return the goodness of fit for this regression. - * - * @param int $dp Number of places of decimal precision to return - * - * @return float - */ - public function getGoodnessOfFitPercent($dp = 0) - { - if ($dp != 0) { - return round($this->goodnessOfFit * 100, $dp); - } - - return $this->goodnessOfFit * 100; - } - - /** - * Return the standard deviation of the residuals for this regression. - * - * @param int $dp Number of places of decimal precision to return - * - * @return float - */ - public function getStdevOfResiduals($dp = 0) - { - if ($dp != 0) { - return round($this->stdevOfResiduals, $dp); - } - - return $this->stdevOfResiduals; - } - - /** - * @param int $dp Number of places of decimal precision to return - * - * @return float - */ - public function getSSRegression($dp = 0) - { - if ($dp != 0) { - return round($this->SSRegression, $dp); - } - - return $this->SSRegression; - } - - /** - * @param int $dp Number of places of decimal precision to return - * - * @return float - */ - public function getSSResiduals($dp = 0) - { - if ($dp != 0) { - return round($this->SSResiduals, $dp); - } - - return $this->SSResiduals; - } - - /** - * @param int $dp Number of places of decimal precision to return - * - * @return float - */ - public function getDFResiduals($dp = 0) - { - if ($dp != 0) { - return round($this->DFResiduals, $dp); - } - - return $this->DFResiduals; - } - - /** - * @param int $dp Number of places of decimal precision to return - * - * @return float - */ - public function getF($dp = 0) - { - if ($dp != 0) { - return round($this->f, $dp); - } - - return $this->f; - } - - /** - * @param int $dp Number of places of decimal precision to return - * - * @return float - */ - public function getCovariance($dp = 0) - { - if ($dp != 0) { - return round($this->covariance, $dp); - } - - return $this->covariance; - } - - /** - * @param int $dp Number of places of decimal precision to return - * - * @return float - */ - public function getCorrelation($dp = 0) - { - if ($dp != 0) { - return round($this->correlation, $dp); - } - - return $this->correlation; - } - - /** - * @return float[] - */ - public function getYBestFitValues() - { - return $this->yBestFitValues; - } - - protected function calculateGoodnessOfFit($sumX, $sumY, $sumX2, $sumY2, $sumXY, $meanX, $meanY, $const): void - { - $SSres = $SScov = $SScor = $SStot = $SSsex = 0.0; - foreach ($this->xValues as $xKey => $xValue) { - $bestFitY = $this->yBestFitValues[$xKey] = $this->getValueOfYForX($xValue); - - $SSres += ($this->yValues[$xKey] - $bestFitY) * ($this->yValues[$xKey] - $bestFitY); - if ($const) { - $SStot += ($this->yValues[$xKey] - $meanY) * ($this->yValues[$xKey] - $meanY); - } else { - $SStot += $this->yValues[$xKey] * $this->yValues[$xKey]; - } - $SScov += ($this->xValues[$xKey] - $meanX) * ($this->yValues[$xKey] - $meanY); - if ($const) { - $SSsex += ($this->xValues[$xKey] - $meanX) * ($this->xValues[$xKey] - $meanX); - } else { - $SSsex += $this->xValues[$xKey] * $this->xValues[$xKey]; - } - } - - $this->SSResiduals = $SSres; - $this->DFResiduals = $this->valueCount - 1 - $const; - - if ($this->DFResiduals == 0.0) { - $this->stdevOfResiduals = 0.0; - } else { - $this->stdevOfResiduals = sqrt($SSres / $this->DFResiduals); - } - if (($SStot == 0.0) || ($SSres == $SStot)) { - $this->goodnessOfFit = 1; - } else { - $this->goodnessOfFit = 1 - ($SSres / $SStot); - } - - $this->SSRegression = $this->goodnessOfFit * $SStot; - $this->covariance = $SScov / $this->valueCount; - $this->correlation = ($this->valueCount * $sumXY - $sumX * $sumY) / sqrt(($this->valueCount * $sumX2 - $sumX ** 2) * ($this->valueCount * $sumY2 - $sumY ** 2)); - $this->slopeSE = $this->stdevOfResiduals / sqrt($SSsex); - $this->intersectSE = $this->stdevOfResiduals * sqrt(1 / ($this->valueCount - ($sumX * $sumX) / $sumX2)); - if ($this->SSResiduals != 0.0) { - if ($this->DFResiduals == 0.0) { - $this->f = 0.0; - } else { - $this->f = $this->SSRegression / ($this->SSResiduals / $this->DFResiduals); - } - } else { - if ($this->DFResiduals == 0.0) { - $this->f = 0.0; - } else { - $this->f = $this->SSRegression / $this->DFResiduals; - } - } - } - - /** - * @param float[] $yValues - * @param float[] $xValues - * @param bool $const - */ - protected function leastSquareFit(array $yValues, array $xValues, $const): void - { - // calculate sums - $x_sum = array_sum($xValues); - $y_sum = array_sum($yValues); - $meanX = $x_sum / $this->valueCount; - $meanY = $y_sum / $this->valueCount; - $mBase = $mDivisor = $xx_sum = $xy_sum = $yy_sum = 0.0; - for ($i = 0; $i < $this->valueCount; ++$i) { - $xy_sum += $xValues[$i] * $yValues[$i]; - $xx_sum += $xValues[$i] * $xValues[$i]; - $yy_sum += $yValues[$i] * $yValues[$i]; - - if ($const) { - $mBase += ($xValues[$i] - $meanX) * ($yValues[$i] - $meanY); - $mDivisor += ($xValues[$i] - $meanX) * ($xValues[$i] - $meanX); - } else { - $mBase += $xValues[$i] * $yValues[$i]; - $mDivisor += $xValues[$i] * $xValues[$i]; - } - } - - // calculate slope - $this->slope = $mBase / $mDivisor; - - // calculate intersect - if ($const) { - $this->intersect = $meanY - ($this->slope * $meanX); - } else { - $this->intersect = 0; - } - - $this->calculateGoodnessOfFit($x_sum, $y_sum, $xx_sum, $yy_sum, $xy_sum, $meanX, $meanY, $const); - } - - /** - * Define the regression. - * - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - * @param bool $const - */ - public function __construct($yValues, $xValues = [], $const = true) - { - // Calculate number of points - $nY = count($yValues); - $nX = count($xValues); - - // Define X Values if necessary - if ($nX == 0) { - $xValues = range(1, $nY); - } elseif ($nY != $nX) { - // Ensure both arrays of points are the same size - $this->error = true; - } - - $this->valueCount = $nY; - $this->xValues = $xValues; - $this->yValues = $yValues; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php deleted file mode 100644 index 82866de..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php +++ /dev/null @@ -1,122 +0,0 @@ -getIntersect() * $this->getSlope() ** ($xValue - $this->xOffset); - } - - /** - * Return the X-Value for a specified value of Y. - * - * @param float $yValue Y-Value - * - * @return float X-Value - */ - public function getValueOfXForY($yValue) - { - return log(($yValue + $this->yOffset) / $this->getIntersect()) / log($this->getSlope()); - } - - /** - * Return the Equation of the best-fit line. - * - * @param int $dp Number of places of decimal precision to display - * - * @return string - */ - public function getEquation($dp = 0) - { - $slope = $this->getSlope($dp); - $intersect = $this->getIntersect($dp); - - return 'Y = ' . $intersect . ' * ' . $slope . '^X'; - } - - /** - * Return the Slope of the line. - * - * @param int $dp Number of places of decimal precision to display - * - * @return float - */ - public function getSlope($dp = 0) - { - if ($dp != 0) { - return round(exp($this->slope), $dp); - } - - return exp($this->slope); - } - - /** - * Return the Value of X where it intersects Y = 0. - * - * @param int $dp Number of places of decimal precision to display - * - * @return float - */ - public function getIntersect($dp = 0) - { - if ($dp != 0) { - return round(exp($this->intersect), $dp); - } - - return exp($this->intersect); - } - - /** - * Execute the regression and calculate the goodness of fit for a set of X and Y data values. - * - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - * @param bool $const - */ - private function exponentialRegression($yValues, $xValues, $const): void - { - foreach ($yValues as &$value) { - if ($value < 0.0) { - $value = 0 - log(abs($value)); - } elseif ($value > 0.0) { - $value = log($value); - } - } - unset($value); - - $this->leastSquareFit($yValues, $xValues, $const); - } - - /** - * Define the regression and calculate the goodness of fit for a set of X and Y data values. - * - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - * @param bool $const - */ - public function __construct($yValues, $xValues = [], $const = true) - { - parent::__construct($yValues, $xValues); - - if (!$this->error) { - $this->exponentialRegression($yValues, $xValues, $const); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LinearBestFit.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LinearBestFit.php deleted file mode 100644 index 26a562c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LinearBestFit.php +++ /dev/null @@ -1,81 +0,0 @@ -getIntersect() + $this->getSlope() * $xValue; - } - - /** - * Return the X-Value for a specified value of Y. - * - * @param float $yValue Y-Value - * - * @return float X-Value - */ - public function getValueOfXForY($yValue) - { - return ($yValue - $this->getIntersect()) / $this->getSlope(); - } - - /** - * Return the Equation of the best-fit line. - * - * @param int $dp Number of places of decimal precision to display - * - * @return string - */ - public function getEquation($dp = 0) - { - $slope = $this->getSlope($dp); - $intersect = $this->getIntersect($dp); - - return 'Y = ' . $intersect . ' + ' . $slope . ' * X'; - } - - /** - * Execute the regression and calculate the goodness of fit for a set of X and Y data values. - * - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - * @param bool $const - */ - private function linearRegression($yValues, $xValues, $const): void - { - $this->leastSquareFit($yValues, $xValues, $const); - } - - /** - * Define the regression and calculate the goodness of fit for a set of X and Y data values. - * - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - * @param bool $const - */ - public function __construct($yValues, $xValues = [], $const = true) - { - parent::__construct($yValues, $xValues); - - if (!$this->error) { - $this->linearRegression($yValues, $xValues, $const); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php deleted file mode 100644 index c469067..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php +++ /dev/null @@ -1,90 +0,0 @@ -getIntersect() + $this->getSlope() * log($xValue - $this->xOffset); - } - - /** - * Return the X-Value for a specified value of Y. - * - * @param float $yValue Y-Value - * - * @return float X-Value - */ - public function getValueOfXForY($yValue) - { - return exp(($yValue - $this->getIntersect()) / $this->getSlope()); - } - - /** - * Return the Equation of the best-fit line. - * - * @param int $dp Number of places of decimal precision to display - * - * @return string - */ - public function getEquation($dp = 0) - { - $slope = $this->getSlope($dp); - $intersect = $this->getIntersect($dp); - - return 'Y = ' . $intersect . ' + ' . $slope . ' * log(X)'; - } - - /** - * Execute the regression and calculate the goodness of fit for a set of X and Y data values. - * - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - * @param bool $const - */ - private function logarithmicRegression($yValues, $xValues, $const): void - { - foreach ($xValues as &$value) { - if ($value < 0.0) { - $value = 0 - log(abs($value)); - } elseif ($value > 0.0) { - $value = log($value); - } - } - unset($value); - - $this->leastSquareFit($yValues, $xValues, $const); - } - - /** - * Define the regression and calculate the goodness of fit for a set of X and Y data values. - * - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - * @param bool $const - */ - public function __construct($yValues, $xValues = [], $const = true) - { - parent::__construct($yValues, $xValues); - - if (!$this->error) { - $this->logarithmicRegression($yValues, $xValues, $const); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php deleted file mode 100644 index d959edd..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php +++ /dev/null @@ -1,200 +0,0 @@ -order; - } - - /** - * Return the Y-Value for a specified value of X. - * - * @param float $xValue X-Value - * - * @return float Y-Value - */ - public function getValueOfYForX($xValue) - { - $retVal = $this->getIntersect(); - $slope = $this->getSlope(); - foreach ($slope as $key => $value) { - if ($value != 0.0) { - $retVal += $value * $xValue ** ($key + 1); - } - } - - return $retVal; - } - - /** - * Return the X-Value for a specified value of Y. - * - * @param float $yValue Y-Value - * - * @return float X-Value - */ - public function getValueOfXForY($yValue) - { - return ($yValue - $this->getIntersect()) / $this->getSlope(); - } - - /** - * Return the Equation of the best-fit line. - * - * @param int $dp Number of places of decimal precision to display - * - * @return string - */ - public function getEquation($dp = 0) - { - $slope = $this->getSlope($dp); - $intersect = $this->getIntersect($dp); - - $equation = 'Y = ' . $intersect; - foreach ($slope as $key => $value) { - if ($value != 0.0) { - $equation .= ' + ' . $value . ' * X'; - if ($key > 0) { - $equation .= '^' . ($key + 1); - } - } - } - - return $equation; - } - - /** - * Return the Slope of the line. - * - * @param int $dp Number of places of decimal precision to display - * - * @return string - */ - public function getSlope($dp = 0) - { - if ($dp != 0) { - $coefficients = []; - foreach ($this->slope as $coefficient) { - $coefficients[] = round($coefficient, $dp); - } - - return $coefficients; - } - - return $this->slope; - } - - public function getCoefficients($dp = 0) - { - return array_merge([$this->getIntersect($dp)], $this->getSlope($dp)); - } - - /** - * Execute the regression and calculate the goodness of fit for a set of X and Y data values. - * - * @param int $order Order of Polynomial for this regression - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - */ - private function polynomialRegression($order, $yValues, $xValues): void - { - // calculate sums - $x_sum = array_sum($xValues); - $y_sum = array_sum($yValues); - $xx_sum = $xy_sum = $yy_sum = 0; - for ($i = 0; $i < $this->valueCount; ++$i) { - $xy_sum += $xValues[$i] * $yValues[$i]; - $xx_sum += $xValues[$i] * $xValues[$i]; - $yy_sum += $yValues[$i] * $yValues[$i]; - } - /* - * This routine uses logic from the PHP port of polyfit version 0.1 - * written by Michael Bommarito and Paul Meagher - * - * The function fits a polynomial function of order $order through - * a series of x-y data points using least squares. - * - */ - $A = []; - $B = []; - for ($i = 0; $i < $this->valueCount; ++$i) { - for ($j = 0; $j <= $order; ++$j) { - $A[$i][$j] = $xValues[$i] ** $j; - } - } - for ($i = 0; $i < $this->valueCount; ++$i) { - $B[$i] = [$yValues[$i]]; - } - $matrixA = new Matrix($A); - $matrixB = new Matrix($B); - $C = $matrixA->solve($matrixB); - - $coefficients = []; - for ($i = 0; $i < $C->getRowDimension(); ++$i) { - $r = $C->get($i, 0); - if (abs($r) <= 10 ** (-9)) { - $r = 0; - } - $coefficients[] = $r; - } - - $this->intersect = array_shift($coefficients); - $this->slope = $coefficients; - - $this->calculateGoodnessOfFit($x_sum, $y_sum, $xx_sum, $yy_sum, $xy_sum, 0, 0, 0); - foreach ($this->xValues as $xKey => $xValue) { - $this->yBestFitValues[$xKey] = $this->getValueOfYForX($xValue); - } - } - - /** - * Define the regression and calculate the goodness of fit for a set of X and Y data values. - * - * @param int $order Order of Polynomial for this regression - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - * @param bool $const - */ - public function __construct($order, $yValues, $xValues = [], $const = true) - { - parent::__construct($yValues, $xValues); - - if (!$this->error) { - if ($order < $this->valueCount) { - $this->bestFitType .= '_' . $order; - $this->order = $order; - $this->polynomialRegression($order, $yValues, $xValues); - if (($this->getGoodnessOfFit() < 0.0) || ($this->getGoodnessOfFit() > 1.0)) { - $this->error = true; - } - } else { - $this->error = true; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PowerBestFit.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PowerBestFit.php deleted file mode 100644 index c53eab6..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PowerBestFit.php +++ /dev/null @@ -1,114 +0,0 @@ -getIntersect() * ($xValue - $this->xOffset) ** $this->getSlope(); - } - - /** - * Return the X-Value for a specified value of Y. - * - * @param float $yValue Y-Value - * - * @return float X-Value - */ - public function getValueOfXForY($yValue) - { - return (($yValue + $this->yOffset) / $this->getIntersect()) ** (1 / $this->getSlope()); - } - - /** - * Return the Equation of the best-fit line. - * - * @param int $dp Number of places of decimal precision to display - * - * @return string - */ - public function getEquation($dp = 0) - { - $slope = $this->getSlope($dp); - $intersect = $this->getIntersect($dp); - - return 'Y = ' . $intersect . ' * X^' . $slope; - } - - /** - * Return the Value of X where it intersects Y = 0. - * - * @param int $dp Number of places of decimal precision to display - * - * @return float - */ - public function getIntersect($dp = 0) - { - if ($dp != 0) { - return round(exp($this->intersect), $dp); - } - - return exp($this->intersect); - } - - /** - * Execute the regression and calculate the goodness of fit for a set of X and Y data values. - * - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - * @param bool $const - */ - private function powerRegression($yValues, $xValues, $const): void - { - foreach ($xValues as &$value) { - if ($value < 0.0) { - $value = 0 - log(abs($value)); - } elseif ($value > 0.0) { - $value = log($value); - } - } - unset($value); - foreach ($yValues as &$value) { - if ($value < 0.0) { - $value = 0 - log(abs($value)); - } elseif ($value > 0.0) { - $value = log($value); - } - } - unset($value); - - $this->leastSquareFit($yValues, $xValues, $const); - } - - /** - * Define the regression and calculate the goodness of fit for a set of X and Y data values. - * - * @param float[] $yValues The set of Y-values for this regression - * @param float[] $xValues The set of X-values for this regression - * @param bool $const - */ - public function __construct($yValues, $xValues = [], $const = true) - { - parent::__construct($yValues, $xValues); - - if (!$this->error) { - $this->powerRegression($yValues, $xValues, $const); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php deleted file mode 100644 index 1b7b390..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php +++ /dev/null @@ -1,120 +0,0 @@ -getGoodnessOfFit(); - } - if ($trendType != self::TREND_BEST_FIT_NO_POLY) { - foreach (self::$trendTypePolynomialOrders as $trendMethod) { - $order = substr($trendMethod, -1); - $bestFit[$trendMethod] = new PolynomialBestFit($order, $yValues, $xValues, $const); - if ($bestFit[$trendMethod]->getError()) { - unset($bestFit[$trendMethod]); - } else { - $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit(); - } - } - } - // Determine which of our Trend lines is the best fit, and then we return the instance of that Trend class - arsort($bestFitValue); - $bestFitType = key($bestFitValue); - - return $bestFit[$bestFitType]; - default: - return false; - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/XMLWriter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/XMLWriter.php deleted file mode 100644 index 4f7a6a0..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/XMLWriter.php +++ /dev/null @@ -1,92 +0,0 @@ -openMemory(); - } else { - // Create temporary filename - if ($pTemporaryStorageFolder === null) { - $pTemporaryStorageFolder = File::sysGetTempDir(); - } - $this->tempFileName = @tempnam($pTemporaryStorageFolder, 'xml'); - - // Open storage - if ($this->openUri($this->tempFileName) === false) { - // Fallback to memory... - $this->openMemory(); - } - } - - // Set default values - if (self::$debugEnabled) { - $this->setIndent(true); - } - } - - /** - * Destructor. - */ - public function __destruct() - { - // Unlink temporary files - if ($this->tempFileName != '') { - @unlink($this->tempFileName); - } - } - - /** - * Get written data. - * - * @return string - */ - public function getData() - { - if ($this->tempFileName == '') { - return $this->outputMemory(true); - } - $this->flush(); - - return file_get_contents($this->tempFileName); - } - - /** - * Wrapper method for writeRaw. - * - * @param string|string[] $text - * - * @return bool - */ - public function writeRawData($text) - { - if (is_array($text)) { - $text = implode("\n", $text); - } - - return $this->writeRaw(htmlspecialchars($text)); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Xls.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Xls.php deleted file mode 100644 index c9eaf37..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Xls.php +++ /dev/null @@ -1,279 +0,0 @@ -getParent()->getDefaultStyle()->getFont(); - - $columnDimensions = $sheet->getColumnDimensions(); - - // first find the true column width in pixels (uncollapsed and unhidden) - if (isset($columnDimensions[$col]) && $columnDimensions[$col]->getWidth() != -1) { - // then we have column dimension with explicit width - $columnDimension = $columnDimensions[$col]; - $width = $columnDimension->getWidth(); - $pixelWidth = Drawing::cellDimensionToPixels($width, $font); - } elseif ($sheet->getDefaultColumnDimension()->getWidth() != -1) { - // then we have default column dimension with explicit width - $defaultColumnDimension = $sheet->getDefaultColumnDimension(); - $width = $defaultColumnDimension->getWidth(); - $pixelWidth = Drawing::cellDimensionToPixels($width, $font); - } else { - // we don't even have any default column dimension. Width depends on default font - $pixelWidth = Font::getDefaultColumnWidthByFont($font, true); - } - - // now find the effective column width in pixels - if (isset($columnDimensions[$col]) && !$columnDimensions[$col]->getVisible()) { - $effectivePixelWidth = 0; - } else { - $effectivePixelWidth = $pixelWidth; - } - - return $effectivePixelWidth; - } - - /** - * Convert the height of a cell from user's units to pixels. By interpolation - * the relationship is: y = 4/3x. If the height hasn't been set by the user we - * use the default value. If the row is hidden we use a value of zero. - * - * @param Worksheet $sheet The sheet - * @param int $row The row index (1-based) - * - * @return int The width in pixels - */ - public static function sizeRow($sheet, $row = 1) - { - // default font of the workbook - $font = $sheet->getParent()->getDefaultStyle()->getFont(); - - $rowDimensions = $sheet->getRowDimensions(); - - // first find the true row height in pixels (uncollapsed and unhidden) - if (isset($rowDimensions[$row]) && $rowDimensions[$row]->getRowHeight() != -1) { - // then we have a row dimension - $rowDimension = $rowDimensions[$row]; - $rowHeight = $rowDimension->getRowHeight(); - $pixelRowHeight = (int) ceil(4 * $rowHeight / 3); // here we assume Arial 10 - } elseif ($sheet->getDefaultRowDimension()->getRowHeight() != -1) { - // then we have a default row dimension with explicit height - $defaultRowDimension = $sheet->getDefaultRowDimension(); - $rowHeight = $defaultRowDimension->getRowHeight(); - $pixelRowHeight = Drawing::pointsToPixels($rowHeight); - } else { - // we don't even have any default row dimension. Height depends on default font - $pointRowHeight = Font::getDefaultRowHeightByFont($font); - $pixelRowHeight = Font::fontSizeToPixels($pointRowHeight); - } - - // now find the effective row height in pixels - if (isset($rowDimensions[$row]) && !$rowDimensions[$row]->getVisible()) { - $effectivePixelRowHeight = 0; - } else { - $effectivePixelRowHeight = $pixelRowHeight; - } - - return $effectivePixelRowHeight; - } - - /** - * Get the horizontal distance in pixels between two anchors - * The distanceX is found as sum of all the spanning columns widths minus correction for the two offsets. - * - * @param string $startColumn - * @param int $startOffsetX Offset within start cell measured in 1/1024 of the cell width - * @param string $endColumn - * @param int $endOffsetX Offset within end cell measured in 1/1024 of the cell width - * - * @return int Horizontal measured in pixels - */ - public static function getDistanceX(Worksheet $sheet, $startColumn = 'A', $startOffsetX = 0, $endColumn = 'A', $endOffsetX = 0) - { - $distanceX = 0; - - // add the widths of the spanning columns - $startColumnIndex = Coordinate::columnIndexFromString($startColumn); - $endColumnIndex = Coordinate::columnIndexFromString($endColumn); - for ($i = $startColumnIndex; $i <= $endColumnIndex; ++$i) { - $distanceX += self::sizeCol($sheet, Coordinate::stringFromColumnIndex($i)); - } - - // correct for offsetX in startcell - $distanceX -= (int) floor(self::sizeCol($sheet, $startColumn) * $startOffsetX / 1024); - - // correct for offsetX in endcell - $distanceX -= (int) floor(self::sizeCol($sheet, $endColumn) * (1 - $endOffsetX / 1024)); - - return $distanceX; - } - - /** - * Get the vertical distance in pixels between two anchors - * The distanceY is found as sum of all the spanning rows minus two offsets. - * - * @param int $startRow (1-based) - * @param int $startOffsetY Offset within start cell measured in 1/256 of the cell height - * @param int $endRow (1-based) - * @param int $endOffsetY Offset within end cell measured in 1/256 of the cell height - * - * @return int Vertical distance measured in pixels - */ - public static function getDistanceY(Worksheet $sheet, $startRow = 1, $startOffsetY = 0, $endRow = 1, $endOffsetY = 0) - { - $distanceY = 0; - - // add the widths of the spanning rows - for ($row = $startRow; $row <= $endRow; ++$row) { - $distanceY += self::sizeRow($sheet, $row); - } - - // correct for offsetX in startcell - $distanceY -= (int) floor(self::sizeRow($sheet, $startRow) * $startOffsetY / 256); - - // correct for offsetX in endcell - $distanceY -= (int) floor(self::sizeRow($sheet, $endRow) * (1 - $endOffsetY / 256)); - - return $distanceY; - } - - /** - * Convert 1-cell anchor coordinates to 2-cell anchor coordinates - * This function is ported from PEAR Spreadsheet_Writer_Excel with small modifications. - * - * Calculate the vertices that define the position of the image as required by - * the OBJ record. - * - * +------------+------------+ - * | A | B | - * +-----+------------+------------+ - * | |(x1,y1) | | - * | 1 |(A1)._______|______ | - * | | | | | - * | | | | | - * +-----+----| BITMAP |-----+ - * | | | | | - * | 2 | |______________. | - * | | | (B2)| - * | | | (x2,y2)| - * +---- +------------+------------+ - * - * Example of a bitmap that covers some of the area from cell A1 to cell B2. - * - * Based on the width and height of the bitmap we need to calculate 8 vars: - * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. - * The width and height of the cells are also variable and have to be taken into - * account. - * The values of $col_start and $row_start are passed in from the calling - * function. The values of $col_end and $row_end are calculated by subtracting - * the width and height of the bitmap from the width and height of the - * underlying cells. - * The vertices are expressed as a percentage of the underlying cell width as - * follows (rhs values are in pixels): - * - * x1 = X / W *1024 - * y1 = Y / H *256 - * x2 = (X-1) / W *1024 - * y2 = (Y-1) / H *256 - * - * Where: X is distance from the left side of the underlying cell - * Y is distance from the top of the underlying cell - * W is the width of the cell - * H is the height of the cell - * - * @param Worksheet $sheet - * @param string $coordinates E.g. 'A1' - * @param int $offsetX Horizontal offset in pixels - * @param int $offsetY Vertical offset in pixels - * @param int $width Width in pixels - * @param int $height Height in pixels - * - * @return array - */ - public static function oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height) - { - [$column, $row] = Coordinate::coordinateFromString($coordinates); - $col_start = Coordinate::columnIndexFromString($column); - $row_start = $row - 1; - - $x1 = $offsetX; - $y1 = $offsetY; - - // Initialise end cell to the same as the start cell - $col_end = $col_start; // Col containing lower right corner of object - $row_end = $row_start; // Row containing bottom right corner of object - - // Zero the specified offset if greater than the cell dimensions - if ($x1 >= self::sizeCol($sheet, Coordinate::stringFromColumnIndex($col_start))) { - $x1 = 0; - } - if ($y1 >= self::sizeRow($sheet, $row_start + 1)) { - $y1 = 0; - } - - $width = $width + $x1 - 1; - $height = $height + $y1 - 1; - - // Subtract the underlying cell widths to find the end cell of the image - while ($width >= self::sizeCol($sheet, Coordinate::stringFromColumnIndex($col_end))) { - $width -= self::sizeCol($sheet, Coordinate::stringFromColumnIndex($col_end)); - ++$col_end; - } - - // Subtract the underlying cell heights to find the end cell of the image - while ($height >= self::sizeRow($sheet, $row_end + 1)) { - $height -= self::sizeRow($sheet, $row_end + 1); - ++$row_end; - } - - // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell - // with zero height or width. - if (self::sizeCol($sheet, Coordinate::stringFromColumnIndex($col_start)) == 0) { - return; - } - if (self::sizeCol($sheet, Coordinate::stringFromColumnIndex($col_end)) == 0) { - return; - } - if (self::sizeRow($sheet, $row_start + 1) == 0) { - return; - } - if (self::sizeRow($sheet, $row_end + 1) == 0) { - return; - } - - // Convert the pixel values to the percentage value expected by Excel - $x1 = $x1 / self::sizeCol($sheet, Coordinate::stringFromColumnIndex($col_start)) * 1024; - $y1 = $y1 / self::sizeRow($sheet, $row_start + 1) * 256; - $x2 = ($width + 1) / self::sizeCol($sheet, Coordinate::stringFromColumnIndex($col_end)) * 1024; // Distance to right side of object - $y2 = ($height + 1) / self::sizeRow($sheet, $row_end + 1) * 256; // Distance to bottom of object - - $startCoordinates = Coordinate::stringFromColumnIndex($col_start) . ($row_start + 1); - $endCoordinates = Coordinate::stringFromColumnIndex($col_end) . ($row_end + 1); - - return [ - 'startCoordinates' => $startCoordinates, - 'startOffsetX' => $x1, - 'startOffsetY' => $y1, - 'endCoordinates' => $endCoordinates, - 'endOffsetX' => $x2, - 'endOffsetY' => $y2, - ]; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php deleted file mode 100644 index 19c1152..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php +++ /dev/null @@ -1,1591 +0,0 @@ -hasMacros; - } - - /** - * Define if a workbook has macros. - * - * @param bool $hasMacros true|false - */ - public function setHasMacros($hasMacros): void - { - $this->hasMacros = (bool) $hasMacros; - } - - /** - * Set the macros code. - * - * @param string $macroCode string|null - */ - public function setMacrosCode($macroCode): void - { - $this->macrosCode = $macroCode; - $this->setHasMacros($macroCode !== null); - } - - /** - * Return the macros code. - * - * @return null|string - */ - public function getMacrosCode() - { - return $this->macrosCode; - } - - /** - * Set the macros certificate. - * - * @param null|string $certificate - */ - public function setMacrosCertificate($certificate): void - { - $this->macrosCertificate = $certificate; - } - - /** - * Is the project signed ? - * - * @return bool true|false - */ - public function hasMacrosCertificate() - { - return $this->macrosCertificate !== null; - } - - /** - * Return the macros certificate. - * - * @return null|string - */ - public function getMacrosCertificate() - { - return $this->macrosCertificate; - } - - /** - * Remove all macros, certificate from spreadsheet. - */ - public function discardMacros(): void - { - $this->hasMacros = false; - $this->macrosCode = null; - $this->macrosCertificate = null; - } - - /** - * set ribbon XML data. - * - * @param null|mixed $target - * @param null|mixed $xmlData - */ - public function setRibbonXMLData($target, $xmlData): void - { - if ($target !== null && $xmlData !== null) { - $this->ribbonXMLData = ['target' => $target, 'data' => $xmlData]; - } else { - $this->ribbonXMLData = null; - } - } - - /** - * retrieve ribbon XML Data. - * - * return string|null|array - * - * @param string $what - * - * @return string - */ - public function getRibbonXMLData($what = 'all') //we need some constants here... - { - $returnData = null; - $what = strtolower($what); - switch ($what) { - case 'all': - $returnData = $this->ribbonXMLData; - - break; - case 'target': - case 'data': - if (is_array($this->ribbonXMLData) && isset($this->ribbonXMLData[$what])) { - $returnData = $this->ribbonXMLData[$what]; - } - - break; - } - - return $returnData; - } - - /** - * store binaries ribbon objects (pictures). - * - * @param null|mixed $BinObjectsNames - * @param null|mixed $BinObjectsData - */ - public function setRibbonBinObjects($BinObjectsNames, $BinObjectsData): void - { - if ($BinObjectsNames !== null && $BinObjectsData !== null) { - $this->ribbonBinObjects = ['names' => $BinObjectsNames, 'data' => $BinObjectsData]; - } else { - $this->ribbonBinObjects = null; - } - } - - /** - * List of unparsed loaded data for export to same format with better compatibility. - * It has to be minimized when the library start to support currently unparsed data. - * - * @internal - * - * @return array - */ - public function getUnparsedLoadedData() - { - return $this->unparsedLoadedData; - } - - /** - * List of unparsed loaded data for export to same format with better compatibility. - * It has to be minimized when the library start to support currently unparsed data. - * - * @internal - */ - public function setUnparsedLoadedData(array $unparsedLoadedData): void - { - $this->unparsedLoadedData = $unparsedLoadedData; - } - - /** - * return the extension of a filename. Internal use for a array_map callback (php<5.3 don't like lambda function). - * - * @param mixed $path - * - * @return string - */ - private function getExtensionOnly($path) - { - return pathinfo($path, PATHINFO_EXTENSION); - } - - /** - * retrieve Binaries Ribbon Objects. - * - * @param string $what - * - * @return null|array - */ - public function getRibbonBinObjects($what = 'all') - { - $ReturnData = null; - $what = strtolower($what); - switch ($what) { - case 'all': - return $this->ribbonBinObjects; - - break; - case 'names': - case 'data': - if (is_array($this->ribbonBinObjects) && isset($this->ribbonBinObjects[$what])) { - $ReturnData = $this->ribbonBinObjects[$what]; - } - - break; - case 'types': - if ( - is_array($this->ribbonBinObjects) && - isset($this->ribbonBinObjects['data']) && is_array($this->ribbonBinObjects['data']) - ) { - $tmpTypes = array_keys($this->ribbonBinObjects['data']); - $ReturnData = array_unique(array_map([$this, 'getExtensionOnly'], $tmpTypes)); - } else { - $ReturnData = []; // the caller want an array... not null if empty - } - - break; - } - - return $ReturnData; - } - - /** - * This workbook have a custom UI ? - * - * @return bool - */ - public function hasRibbon() - { - return $this->ribbonXMLData !== null; - } - - /** - * This workbook have additionnal object for the ribbon ? - * - * @return bool - */ - public function hasRibbonBinObjects() - { - return $this->ribbonBinObjects !== null; - } - - /** - * Check if a sheet with a specified code name already exists. - * - * @param string $pSheetCodeName Name of the worksheet to check - * - * @return bool - */ - public function sheetCodeNameExists($pSheetCodeName) - { - return $this->getSheetByCodeName($pSheetCodeName) !== null; - } - - /** - * Get sheet by code name. Warning : sheet don't have always a code name ! - * - * @param string $pName Sheet name - * - * @return Worksheet - */ - public function getSheetByCodeName($pName) - { - $worksheetCount = count($this->workSheetCollection); - for ($i = 0; $i < $worksheetCount; ++$i) { - if ($this->workSheetCollection[$i]->getCodeName() == $pName) { - return $this->workSheetCollection[$i]; - } - } - - return null; - } - - /** - * Create a new PhpSpreadsheet with one Worksheet. - */ - public function __construct() - { - $this->uniqueID = uniqid('', true); - $this->calculationEngine = new Calculation($this); - - // Initialise worksheet collection and add one worksheet - $this->workSheetCollection = []; - $this->workSheetCollection[] = new Worksheet($this); - $this->activeSheetIndex = 0; - - // Create document properties - $this->properties = new Document\Properties(); - - // Create document security - $this->security = new Document\Security(); - - // Set defined names - $this->definedNames = []; - - // Create the cellXf supervisor - $this->cellXfSupervisor = new Style(true); - $this->cellXfSupervisor->bindParent($this); - - // Create the default style - $this->addCellXf(new Style()); - $this->addCellStyleXf(new Style()); - } - - /** - * Code to execute when this worksheet is unset(). - */ - public function __destruct() - { - $this->calculationEngine = null; - $this->disconnectWorksheets(); - } - - /** - * Disconnect all worksheets from this PhpSpreadsheet workbook object, - * typically so that the PhpSpreadsheet object can be unset. - */ - public function disconnectWorksheets(): void - { - $worksheet = null; - foreach ($this->workSheetCollection as $k => &$worksheet) { - $worksheet->disconnectCells(); - $this->workSheetCollection[$k] = null; - } - unset($worksheet); - $this->workSheetCollection = []; - } - - /** - * Return the calculation engine for this worksheet. - * - * @return Calculation - */ - public function getCalculationEngine() - { - return $this->calculationEngine; - } - - /** - * Get properties. - * - * @return Document\Properties - */ - public function getProperties() - { - return $this->properties; - } - - /** - * Set properties. - */ - public function setProperties(Document\Properties $pValue): void - { - $this->properties = $pValue; - } - - /** - * Get security. - * - * @return Document\Security - */ - public function getSecurity() - { - return $this->security; - } - - /** - * Set security. - */ - public function setSecurity(Document\Security $pValue): void - { - $this->security = $pValue; - } - - /** - * Get active sheet. - * - * @return Worksheet - */ - public function getActiveSheet() - { - return $this->getSheet($this->activeSheetIndex); - } - - /** - * Create sheet and add it to this workbook. - * - * @param null|int $sheetIndex Index where sheet should go (0,1,..., or null for last) - * - * @return Worksheet - */ - public function createSheet($sheetIndex = null) - { - $newSheet = new Worksheet($this); - $this->addSheet($newSheet, $sheetIndex); - - return $newSheet; - } - - /** - * Check if a sheet with a specified name already exists. - * - * @param string $pSheetName Name of the worksheet to check - * - * @return bool - */ - public function sheetNameExists($pSheetName) - { - return $this->getSheetByName($pSheetName) !== null; - } - - /** - * Add sheet. - * - * @param null|int $iSheetIndex Index where sheet should go (0,1,..., or null for last) - * - * @return Worksheet - */ - public function addSheet(Worksheet $pSheet, $iSheetIndex = null) - { - if ($this->sheetNameExists($pSheet->getTitle())) { - throw new Exception( - "Workbook already contains a worksheet named '{$pSheet->getTitle()}'. Rename this worksheet first." - ); - } - - if ($iSheetIndex === null) { - if ($this->activeSheetIndex < 0) { - $this->activeSheetIndex = 0; - } - $this->workSheetCollection[] = $pSheet; - } else { - // Insert the sheet at the requested index - array_splice( - $this->workSheetCollection, - $iSheetIndex, - 0, - [$pSheet] - ); - - // Adjust active sheet index if necessary - if ($this->activeSheetIndex >= $iSheetIndex) { - ++$this->activeSheetIndex; - } - } - - if ($pSheet->getParent() === null) { - $pSheet->rebindParent($this); - } - - return $pSheet; - } - - /** - * Remove sheet by index. - * - * @param int $pIndex Active sheet index - */ - public function removeSheetByIndex($pIndex): void - { - $numSheets = count($this->workSheetCollection); - if ($pIndex > $numSheets - 1) { - throw new Exception( - "You tried to remove a sheet by the out of bounds index: {$pIndex}. The actual number of sheets is {$numSheets}." - ); - } - array_splice($this->workSheetCollection, $pIndex, 1); - - // Adjust active sheet index if necessary - if ( - ($this->activeSheetIndex >= $pIndex) && - ($pIndex > count($this->workSheetCollection) - 1) - ) { - --$this->activeSheetIndex; - } - } - - /** - * Get sheet by index. - * - * @param int $pIndex Sheet index - * - * @return Worksheet - */ - public function getSheet($pIndex) - { - if (!isset($this->workSheetCollection[$pIndex])) { - $numSheets = $this->getSheetCount(); - - throw new Exception( - "Your requested sheet index: {$pIndex} is out of bounds. The actual number of sheets is {$numSheets}." - ); - } - - return $this->workSheetCollection[$pIndex]; - } - - /** - * Get all sheets. - * - * @return Worksheet[] - */ - public function getAllSheets() - { - return $this->workSheetCollection; - } - - /** - * Get sheet by name. - * - * @param string $pName Sheet name - * - * @return null|Worksheet - */ - public function getSheetByName($pName) - { - $worksheetCount = count($this->workSheetCollection); - for ($i = 0; $i < $worksheetCount; ++$i) { - if ($this->workSheetCollection[$i]->getTitle() === trim($pName, "'")) { - return $this->workSheetCollection[$i]; - } - } - - return null; - } - - /** - * Get index for sheet. - * - * @return int index - */ - public function getIndex(Worksheet $pSheet) - { - foreach ($this->workSheetCollection as $key => $value) { - if ($value->getHashCode() === $pSheet->getHashCode()) { - return $key; - } - } - - throw new Exception('Sheet does not exist.'); - } - - /** - * Set index for sheet by sheet name. - * - * @param string $sheetName Sheet name to modify index for - * @param int $newIndex New index for the sheet - * - * @return int New sheet index - */ - public function setIndexByName($sheetName, $newIndex) - { - $oldIndex = $this->getIndex($this->getSheetByName($sheetName)); - $pSheet = array_splice( - $this->workSheetCollection, - $oldIndex, - 1 - ); - array_splice( - $this->workSheetCollection, - $newIndex, - 0, - $pSheet - ); - - return $newIndex; - } - - /** - * Get sheet count. - * - * @return int - */ - public function getSheetCount() - { - return count($this->workSheetCollection); - } - - /** - * Get active sheet index. - * - * @return int Active sheet index - */ - public function getActiveSheetIndex() - { - return $this->activeSheetIndex; - } - - /** - * Set active sheet index. - * - * @param int $pIndex Active sheet index - * - * @return Worksheet - */ - public function setActiveSheetIndex($pIndex) - { - $numSheets = count($this->workSheetCollection); - - if ($pIndex > $numSheets - 1) { - throw new Exception( - "You tried to set a sheet active by the out of bounds index: {$pIndex}. The actual number of sheets is {$numSheets}." - ); - } - $this->activeSheetIndex = $pIndex; - - return $this->getActiveSheet(); - } - - /** - * Set active sheet index by name. - * - * @param string $pValue Sheet title - * - * @return Worksheet - */ - public function setActiveSheetIndexByName($pValue) - { - if (($worksheet = $this->getSheetByName($pValue)) instanceof Worksheet) { - $this->setActiveSheetIndex($this->getIndex($worksheet)); - - return $worksheet; - } - - throw new Exception('Workbook does not contain sheet:' . $pValue); - } - - /** - * Get sheet names. - * - * @return string[] - */ - public function getSheetNames() - { - $returnValue = []; - $worksheetCount = $this->getSheetCount(); - for ($i = 0; $i < $worksheetCount; ++$i) { - $returnValue[] = $this->getSheet($i)->getTitle(); - } - - return $returnValue; - } - - /** - * Add external sheet. - * - * @param Worksheet $pSheet External sheet to add - * @param null|int $iSheetIndex Index where sheet should go (0,1,..., or null for last) - * - * @return Worksheet - */ - public function addExternalSheet(Worksheet $pSheet, $iSheetIndex = null) - { - if ($this->sheetNameExists($pSheet->getTitle())) { - throw new Exception("Workbook already contains a worksheet named '{$pSheet->getTitle()}'. Rename the external sheet first."); - } - - // count how many cellXfs there are in this workbook currently, we will need this below - $countCellXfs = count($this->cellXfCollection); - - // copy all the shared cellXfs from the external workbook and append them to the current - foreach ($pSheet->getParent()->getCellXfCollection() as $cellXf) { - $this->addCellXf(clone $cellXf); - } - - // move sheet to this workbook - $pSheet->rebindParent($this); - - // update the cellXfs - foreach ($pSheet->getCoordinates(false) as $coordinate) { - $cell = $pSheet->getCell($coordinate); - $cell->setXfIndex($cell->getXfIndex() + $countCellXfs); - } - - return $this->addSheet($pSheet, $iSheetIndex); - } - - /** - * Get an array of all Named Ranges. - * - * @return NamedRange[] - */ - public function getNamedRanges(): array - { - return array_filter( - $this->definedNames, - function (DefinedName $definedName) { - return $definedName->isFormula() === self::DEFINED_NAME_IS_RANGE; - } - ); - } - - /** - * Get an array of all Named Formulae. - * - * @return NamedFormula[] - */ - public function getNamedFormulae(): array - { - return array_filter( - $this->definedNames, - function (DefinedName $definedName) { - return $definedName->isFormula() === self::DEFINED_NAME_IS_FORMULA; - } - ); - } - - /** - * Get an array of all Defined Names (both named ranges and named formulae). - * - * @return DefinedName[] - */ - public function getDefinedNames(): array - { - return $this->definedNames; - } - - /** - * Add a named range. - * If a named range with this name already exists, then this will replace the existing value. - */ - public function addNamedRange(NamedRange $namedRange): void - { - $this->addDefinedName($namedRange); - } - - /** - * Add a named formula. - * If a named formula with this name already exists, then this will replace the existing value. - */ - public function addNamedFormula(NamedFormula $namedFormula): void - { - $this->addDefinedName($namedFormula); - } - - /** - * Add a defined name (either a named range or a named formula). - * If a defined named with this name already exists, then this will replace the existing value. - */ - public function addDefinedName(DefinedName $definedName): void - { - $upperCaseName = StringHelper::strToUpper($definedName->getName()); - if ($definedName->getScope() == null) { - // global scope - $this->definedNames[$upperCaseName] = $definedName; - } else { - // local scope - $this->definedNames[$definedName->getScope()->getTitle() . '!' . $upperCaseName] = $definedName; - } - } - - /** - * Get named range. - * - * @param null|Worksheet $pSheet Scope. Use null for global scope - */ - public function getNamedRange(string $namedRange, ?Worksheet $pSheet = null): ?NamedRange - { - $returnValue = null; - - if ($namedRange !== '') { - $namedRange = StringHelper::strToUpper($namedRange); - // first look for global named range - $returnValue = $this->getGlobalDefinedNameByType($namedRange, self::DEFINED_NAME_IS_RANGE); - // then look for local named range (has priority over global named range if both names exist) - $returnValue = $this->getLocalDefinedNameByType($namedRange, self::DEFINED_NAME_IS_RANGE, $pSheet) ?: $returnValue; - } - - return $returnValue instanceof NamedRange ? $returnValue : null; - } - - /** - * Get named formula. - * - * @param null|Worksheet $pSheet Scope. Use null for global scope - */ - public function getNamedFormula(string $namedFormula, ?Worksheet $pSheet = null): ?NamedFormula - { - $returnValue = null; - - if ($namedFormula !== '') { - $namedFormula = StringHelper::strToUpper($namedFormula); - // first look for global named formula - $returnValue = $this->getGlobalDefinedNameByType($namedFormula, self::DEFINED_NAME_IS_FORMULA); - // then look for local named formula (has priority over global named formula if both names exist) - $returnValue = $this->getLocalDefinedNameByType($namedFormula, self::DEFINED_NAME_IS_FORMULA, $pSheet) ?: $returnValue; - } - - return $returnValue instanceof NamedFormula ? $returnValue : null; - } - - private function getGlobalDefinedNameByType(string $name, bool $type): ?DefinedName - { - if (isset($this->definedNames[$name]) && $this->definedNames[$name]->isFormula() === $type) { - return $this->definedNames[$name]; - } - - return null; - } - - private function getLocalDefinedNameByType(string $name, bool $type, ?Worksheet $pSheet = null): ?DefinedName - { - if ( - ($pSheet !== null) && isset($this->definedNames[$pSheet->getTitle() . '!' . $name]) - && $this->definedNames[$pSheet->getTitle() . '!' . $name]->isFormula() === $type - ) { - return $this->definedNames[$pSheet->getTitle() . '!' . $name]; - } - - return null; - } - - /** - * Get named range. - * - * @param null|Worksheet $pSheet Scope. Use null for global scope - */ - public function getDefinedName(string $definedName, ?Worksheet $pSheet = null): ?DefinedName - { - $returnValue = null; - - if ($definedName !== '') { - $definedName = StringHelper::strToUpper($definedName); - // first look for global defined name - if (isset($this->definedNames[$definedName])) { - $returnValue = $this->definedNames[$definedName]; - } - - // then look for local defined name (has priority over global defined name if both names exist) - if (($pSheet !== null) && isset($this->definedNames[$pSheet->getTitle() . '!' . $definedName])) { - $returnValue = $this->definedNames[$pSheet->getTitle() . '!' . $definedName]; - } - } - - return $returnValue; - } - - /** - * Remove named range. - * - * @param null|Worksheet $pSheet scope: use null for global scope - * - * @return $this - */ - public function removeNamedRange(string $namedRange, ?Worksheet $pSheet = null): self - { - if ($this->getNamedRange($namedRange, $pSheet) === null) { - return $this; - } - - return $this->removeDefinedName($namedRange, $pSheet); - } - - /** - * Remove named formula. - * - * @param null|Worksheet $pSheet scope: use null for global scope - * - * @return $this - */ - public function removeNamedFormula(string $namedFormula, ?Worksheet $pSheet = null): self - { - if ($this->getNamedFormula($namedFormula, $pSheet) === null) { - return $this; - } - - return $this->removeDefinedName($namedFormula, $pSheet); - } - - /** - * Remove defined name. - * - * @param null|Worksheet $pSheet scope: use null for global scope - * - * @return $this - */ - public function removeDefinedName(string $definedName, ?Worksheet $pSheet = null): self - { - $definedName = StringHelper::strToUpper($definedName); - - if ($pSheet === null) { - if (isset($this->definedNames[$definedName])) { - unset($this->definedNames[$definedName]); - } - } else { - if (isset($this->definedNames[$pSheet->getTitle() . '!' . $definedName])) { - unset($this->definedNames[$pSheet->getTitle() . '!' . $definedName]); - } elseif (isset($this->definedNames[$definedName])) { - unset($this->definedNames[$definedName]); - } - } - - return $this; - } - - /** - * Get worksheet iterator. - * - * @return Iterator - */ - public function getWorksheetIterator() - { - return new Iterator($this); - } - - /** - * Copy workbook (!= clone!). - * - * @return Spreadsheet - */ - public function copy() - { - $copied = clone $this; - - $worksheetCount = count($this->workSheetCollection); - for ($i = 0; $i < $worksheetCount; ++$i) { - $this->workSheetCollection[$i] = $this->workSheetCollection[$i]->copy(); - $this->workSheetCollection[$i]->rebindParent($this); - } - - return $copied; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - foreach ($this as $key => $val) { - if (is_object($val) || (is_array($val))) { - $this->{$key} = unserialize(serialize($val)); - } - } - } - - /** - * Get the workbook collection of cellXfs. - * - * @return Style[] - */ - public function getCellXfCollection() - { - return $this->cellXfCollection; - } - - /** - * Get cellXf by index. - * - * @param int $pIndex - * - * @return Style - */ - public function getCellXfByIndex($pIndex) - { - return $this->cellXfCollection[$pIndex]; - } - - /** - * Get cellXf by hash code. - * - * @param string $pValue - * - * @return false|Style - */ - public function getCellXfByHashCode($pValue) - { - foreach ($this->cellXfCollection as $cellXf) { - if ($cellXf->getHashCode() === $pValue) { - return $cellXf; - } - } - - return false; - } - - /** - * Check if style exists in style collection. - * - * @param Style $pCellStyle - * - * @return bool - */ - public function cellXfExists($pCellStyle) - { - return in_array($pCellStyle, $this->cellXfCollection, true); - } - - /** - * Get default style. - * - * @return Style - */ - public function getDefaultStyle() - { - if (isset($this->cellXfCollection[0])) { - return $this->cellXfCollection[0]; - } - - throw new Exception('No default style found for this workbook'); - } - - /** - * Add a cellXf to the workbook. - */ - public function addCellXf(Style $style): void - { - $this->cellXfCollection[] = $style; - $style->setIndex(count($this->cellXfCollection) - 1); - } - - /** - * Remove cellXf by index. It is ensured that all cells get their xf index updated. - * - * @param int $pIndex Index to cellXf - */ - public function removeCellXfByIndex($pIndex): void - { - if ($pIndex > count($this->cellXfCollection) - 1) { - throw new Exception('CellXf index is out of bounds.'); - } - - // first remove the cellXf - array_splice($this->cellXfCollection, $pIndex, 1); - - // then update cellXf indexes for cells - foreach ($this->workSheetCollection as $worksheet) { - foreach ($worksheet->getCoordinates(false) as $coordinate) { - $cell = $worksheet->getCell($coordinate); - $xfIndex = $cell->getXfIndex(); - if ($xfIndex > $pIndex) { - // decrease xf index by 1 - $cell->setXfIndex($xfIndex - 1); - } elseif ($xfIndex == $pIndex) { - // set to default xf index 0 - $cell->setXfIndex(0); - } - } - } - } - - /** - * Get the cellXf supervisor. - * - * @return Style - */ - public function getCellXfSupervisor() - { - return $this->cellXfSupervisor; - } - - /** - * Get the workbook collection of cellStyleXfs. - * - * @return Style[] - */ - public function getCellStyleXfCollection() - { - return $this->cellStyleXfCollection; - } - - /** - * Get cellStyleXf by index. - * - * @param int $pIndex Index to cellXf - * - * @return Style - */ - public function getCellStyleXfByIndex($pIndex) - { - return $this->cellStyleXfCollection[$pIndex]; - } - - /** - * Get cellStyleXf by hash code. - * - * @param string $pValue - * - * @return false|Style - */ - public function getCellStyleXfByHashCode($pValue) - { - foreach ($this->cellStyleXfCollection as $cellStyleXf) { - if ($cellStyleXf->getHashCode() === $pValue) { - return $cellStyleXf; - } - } - - return false; - } - - /** - * Add a cellStyleXf to the workbook. - */ - public function addCellStyleXf(Style $pStyle): void - { - $this->cellStyleXfCollection[] = $pStyle; - $pStyle->setIndex(count($this->cellStyleXfCollection) - 1); - } - - /** - * Remove cellStyleXf by index. - * - * @param int $pIndex Index to cellXf - */ - public function removeCellStyleXfByIndex($pIndex): void - { - if ($pIndex > count($this->cellStyleXfCollection) - 1) { - throw new Exception('CellStyleXf index is out of bounds.'); - } - array_splice($this->cellStyleXfCollection, $pIndex, 1); - } - - /** - * Eliminate all unneeded cellXf and afterwards update the xfIndex for all cells - * and columns in the workbook. - */ - public function garbageCollect(): void - { - // how many references are there to each cellXf ? - $countReferencesCellXf = []; - foreach ($this->cellXfCollection as $index => $cellXf) { - $countReferencesCellXf[$index] = 0; - } - - foreach ($this->getWorksheetIterator() as $sheet) { - // from cells - foreach ($sheet->getCoordinates(false) as $coordinate) { - $cell = $sheet->getCell($coordinate); - ++$countReferencesCellXf[$cell->getXfIndex()]; - } - - // from row dimensions - foreach ($sheet->getRowDimensions() as $rowDimension) { - if ($rowDimension->getXfIndex() !== null) { - ++$countReferencesCellXf[$rowDimension->getXfIndex()]; - } - } - - // from column dimensions - foreach ($sheet->getColumnDimensions() as $columnDimension) { - ++$countReferencesCellXf[$columnDimension->getXfIndex()]; - } - } - - // remove cellXfs without references and create mapping so we can update xfIndex - // for all cells and columns - $countNeededCellXfs = 0; - foreach ($this->cellXfCollection as $index => $cellXf) { - if ($countReferencesCellXf[$index] > 0 || $index == 0) { // we must never remove the first cellXf - ++$countNeededCellXfs; - } else { - unset($this->cellXfCollection[$index]); - } - $map[$index] = $countNeededCellXfs - 1; - } - $this->cellXfCollection = array_values($this->cellXfCollection); - - // update the index for all cellXfs - foreach ($this->cellXfCollection as $i => $cellXf) { - $cellXf->setIndex($i); - } - - // make sure there is always at least one cellXf (there should be) - if (empty($this->cellXfCollection)) { - $this->cellXfCollection[] = new Style(); - } - - // update the xfIndex for all cells, row dimensions, column dimensions - foreach ($this->getWorksheetIterator() as $sheet) { - // for all cells - foreach ($sheet->getCoordinates(false) as $coordinate) { - $cell = $sheet->getCell($coordinate); - $cell->setXfIndex($map[$cell->getXfIndex()]); - } - - // for all row dimensions - foreach ($sheet->getRowDimensions() as $rowDimension) { - if ($rowDimension->getXfIndex() !== null) { - $rowDimension->setXfIndex($map[$rowDimension->getXfIndex()]); - } - } - - // for all column dimensions - foreach ($sheet->getColumnDimensions() as $columnDimension) { - $columnDimension->setXfIndex($map[$columnDimension->getXfIndex()]); - } - - // also do garbage collection for all the sheets - $sheet->garbageCollect(); - } - } - - /** - * Return the unique ID value assigned to this spreadsheet workbook. - * - * @return string - */ - public function getID() - { - return $this->uniqueID; - } - - /** - * Get the visibility of the horizonal scroll bar in the application. - * - * @return bool True if horizonal scroll bar is visible - */ - public function getShowHorizontalScroll() - { - return $this->showHorizontalScroll; - } - - /** - * Set the visibility of the horizonal scroll bar in the application. - * - * @param bool $showHorizontalScroll True if horizonal scroll bar is visible - */ - public function setShowHorizontalScroll($showHorizontalScroll): void - { - $this->showHorizontalScroll = (bool) $showHorizontalScroll; - } - - /** - * Get the visibility of the vertical scroll bar in the application. - * - * @return bool True if vertical scroll bar is visible - */ - public function getShowVerticalScroll() - { - return $this->showVerticalScroll; - } - - /** - * Set the visibility of the vertical scroll bar in the application. - * - * @param bool $showVerticalScroll True if vertical scroll bar is visible - */ - public function setShowVerticalScroll($showVerticalScroll): void - { - $this->showVerticalScroll = (bool) $showVerticalScroll; - } - - /** - * Get the visibility of the sheet tabs in the application. - * - * @return bool True if the sheet tabs are visible - */ - public function getShowSheetTabs() - { - return $this->showSheetTabs; - } - - /** - * Set the visibility of the sheet tabs in the application. - * - * @param bool $showSheetTabs True if sheet tabs are visible - */ - public function setShowSheetTabs($showSheetTabs): void - { - $this->showSheetTabs = (bool) $showSheetTabs; - } - - /** - * Return whether the workbook window is minimized. - * - * @return bool true if workbook window is minimized - */ - public function getMinimized() - { - return $this->minimized; - } - - /** - * Set whether the workbook window is minimized. - * - * @param bool $minimized true if workbook window is minimized - */ - public function setMinimized($minimized): void - { - $this->minimized = (bool) $minimized; - } - - /** - * Return whether to group dates when presenting the user with - * filtering optiomd in the user interface. - * - * @return bool true if workbook window is minimized - */ - public function getAutoFilterDateGrouping() - { - return $this->autoFilterDateGrouping; - } - - /** - * Set whether to group dates when presenting the user with - * filtering optiomd in the user interface. - * - * @param bool $autoFilterDateGrouping true if workbook window is minimized - */ - public function setAutoFilterDateGrouping($autoFilterDateGrouping): void - { - $this->autoFilterDateGrouping = (bool) $autoFilterDateGrouping; - } - - /** - * Return the first sheet in the book view. - * - * @return int First sheet in book view - */ - public function getFirstSheetIndex() - { - return $this->firstSheetIndex; - } - - /** - * Set the first sheet in the book view. - * - * @param int $firstSheetIndex First sheet in book view - */ - public function setFirstSheetIndex($firstSheetIndex): void - { - if ($firstSheetIndex >= 0) { - $this->firstSheetIndex = (int) $firstSheetIndex; - } else { - throw new Exception('First sheet index must be a positive integer.'); - } - } - - /** - * Return the visibility status of the workbook. - * - * This may be one of the following three values: - * - visibile - * - * @return string Visible status - */ - public function getVisibility() - { - return $this->visibility; - } - - /** - * Set the visibility status of the workbook. - * - * Valid values are: - * - 'visible' (self::VISIBILITY_VISIBLE): - * Workbook window is visible - * - 'hidden' (self::VISIBILITY_HIDDEN): - * Workbook window is hidden, but can be shown by the user - * via the user interface - * - 'veryHidden' (self::VISIBILITY_VERY_HIDDEN): - * Workbook window is hidden and cannot be shown in the - * user interface. - * - * @param string $visibility visibility status of the workbook - */ - public function setVisibility($visibility): void - { - if ($visibility === null) { - $visibility = self::VISIBILITY_VISIBLE; - } - - if (in_array($visibility, self::$workbookViewVisibilityValues)) { - $this->visibility = $visibility; - } else { - throw new Exception('Invalid visibility value.'); - } - } - - /** - * Get the ratio between the workbook tabs bar and the horizontal scroll bar. - * TabRatio is assumed to be out of 1000 of the horizontal window width. - * - * @return int Ratio between the workbook tabs bar and the horizontal scroll bar - */ - public function getTabRatio() - { - return $this->tabRatio; - } - - /** - * Set the ratio between the workbook tabs bar and the horizontal scroll bar - * TabRatio is assumed to be out of 1000 of the horizontal window width. - * - * @param int $tabRatio Ratio between the tabs bar and the horizontal scroll bar - */ - public function setTabRatio($tabRatio): void - { - if ($tabRatio >= 0 || $tabRatio <= 1000) { - $this->tabRatio = (int) $tabRatio; - } else { - throw new Exception('Tab ratio must be between 0 and 1000.'); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php deleted file mode 100644 index 4d97dd2..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php +++ /dev/null @@ -1,464 +0,0 @@ -horizontal = null; - $this->vertical = null; - $this->textRotation = null; - } - } - - /** - * Get the shared style component for the currently active cell in currently active sheet. - * Only used for style supervisor. - * - * @return Alignment - */ - public function getSharedComponent() - { - return $this->parent->getSharedComponent()->getAlignment(); - } - - /** - * Build style array from subcomponents. - * - * @param array $array - * - * @return array - */ - public function getStyleArray($array) - { - return ['alignment' => $array]; - } - - /** - * Apply styles from array. - * - * - * $spreadsheet->getActiveSheet()->getStyle('B2')->getAlignment()->applyFromArray( - * [ - * 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER, - * 'vertical' => \PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER, - * 'textRotation' => 0, - * 'wrapText' => TRUE - * ] - * ); - * - * - * @param array $pStyles Array containing style information - * - * @return $this - */ - public function applyFromArray(array $pStyles) - { - if ($this->isSupervisor) { - $this->getActiveSheet()->getStyle($this->getSelectedCells()) - ->applyFromArray($this->getStyleArray($pStyles)); - } else { - if (isset($pStyles['horizontal'])) { - $this->setHorizontal($pStyles['horizontal']); - } - if (isset($pStyles['vertical'])) { - $this->setVertical($pStyles['vertical']); - } - if (isset($pStyles['textRotation'])) { - $this->setTextRotation($pStyles['textRotation']); - } - if (isset($pStyles['wrapText'])) { - $this->setWrapText($pStyles['wrapText']); - } - if (isset($pStyles['shrinkToFit'])) { - $this->setShrinkToFit($pStyles['shrinkToFit']); - } - if (isset($pStyles['indent'])) { - $this->setIndent($pStyles['indent']); - } - if (isset($pStyles['readOrder'])) { - $this->setReadOrder($pStyles['readOrder']); - } - } - - return $this; - } - - /** - * Get Horizontal. - * - * @return string - */ - public function getHorizontal() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getHorizontal(); - } - - return $this->horizontal; - } - - /** - * Set Horizontal. - * - * @param string $pValue see self::HORIZONTAL_* - * - * @return $this - */ - public function setHorizontal($pValue) - { - if ($pValue == '') { - $pValue = self::HORIZONTAL_GENERAL; - } - - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['horizontal' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->horizontal = $pValue; - } - - return $this; - } - - /** - * Get Vertical. - * - * @return string - */ - public function getVertical() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getVertical(); - } - - return $this->vertical; - } - - /** - * Set Vertical. - * - * @param string $pValue see self::VERTICAL_* - * - * @return $this - */ - public function setVertical($pValue) - { - if ($pValue == '') { - $pValue = self::VERTICAL_BOTTOM; - } - - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['vertical' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->vertical = $pValue; - } - - return $this; - } - - /** - * Get TextRotation. - * - * @return int - */ - public function getTextRotation() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getTextRotation(); - } - - return $this->textRotation; - } - - /** - * Set TextRotation. - * - * @param int $pValue - * - * @return $this - */ - public function setTextRotation($pValue) - { - // Excel2007 value 255 => PhpSpreadsheet value -165 - if ($pValue == 255) { - $pValue = -165; - } - - // Set rotation - if (($pValue >= -90 && $pValue <= 90) || $pValue == -165) { - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['textRotation' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->textRotation = $pValue; - } - } else { - throw new PhpSpreadsheetException('Text rotation should be a value between -90 and 90.'); - } - - return $this; - } - - /** - * Get Wrap Text. - * - * @return bool - */ - public function getWrapText() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getWrapText(); - } - - return $this->wrapText; - } - - /** - * Set Wrap Text. - * - * @param bool $pValue - * - * @return $this - */ - public function setWrapText($pValue) - { - if ($pValue == '') { - $pValue = false; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['wrapText' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->wrapText = $pValue; - } - - return $this; - } - - /** - * Get Shrink to fit. - * - * @return bool - */ - public function getShrinkToFit() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getShrinkToFit(); - } - - return $this->shrinkToFit; - } - - /** - * Set Shrink to fit. - * - * @param bool $pValue - * - * @return $this - */ - public function setShrinkToFit($pValue) - { - if ($pValue == '') { - $pValue = false; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['shrinkToFit' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->shrinkToFit = $pValue; - } - - return $this; - } - - /** - * Get indent. - * - * @return int - */ - public function getIndent() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getIndent(); - } - - return $this->indent; - } - - /** - * Set indent. - * - * @param int $pValue - * - * @return $this - */ - public function setIndent($pValue) - { - if ($pValue > 0) { - if ( - $this->getHorizontal() != self::HORIZONTAL_GENERAL && - $this->getHorizontal() != self::HORIZONTAL_LEFT && - $this->getHorizontal() != self::HORIZONTAL_RIGHT - ) { - $pValue = 0; // indent not supported - } - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['indent' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->indent = $pValue; - } - - return $this; - } - - /** - * Get read order. - * - * @return int - */ - public function getReadOrder() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getReadOrder(); - } - - return $this->readOrder; - } - - /** - * Set read order. - * - * @param int $pValue - * - * @return $this - */ - public function setReadOrder($pValue) - { - if ($pValue < 0 || $pValue > 2) { - $pValue = 0; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['readOrder' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->readOrder = $pValue; - } - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getHashCode(); - } - - return md5( - $this->horizontal . - $this->vertical . - $this->textRotation . - ($this->wrapText ? 't' : 'f') . - ($this->shrinkToFit ? 't' : 'f') . - $this->indent . - $this->readOrder . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Border.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Border.php deleted file mode 100644 index 78ad8b2..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Border.php +++ /dev/null @@ -1,231 +0,0 @@ -color = new Color(Color::COLOR_BLACK, $isSupervisor); - - // bind parent if we are a supervisor - if ($isSupervisor) { - $this->color->bindParent($this, 'color'); - } - } - - /** - * Get the shared style component for the currently active cell in currently active sheet. - * Only used for style supervisor. - * - * @return Border - */ - public function getSharedComponent() - { - switch ($this->parentPropertyName) { - case 'allBorders': - case 'horizontal': - case 'inside': - case 'outline': - case 'vertical': - throw new PhpSpreadsheetException('Cannot get shared component for a pseudo-border.'); - - break; - case 'bottom': - return $this->parent->getSharedComponent()->getBottom(); - case 'diagonal': - return $this->parent->getSharedComponent()->getDiagonal(); - case 'left': - return $this->parent->getSharedComponent()->getLeft(); - case 'right': - return $this->parent->getSharedComponent()->getRight(); - case 'top': - return $this->parent->getSharedComponent()->getTop(); - } - } - - /** - * Build style array from subcomponents. - * - * @param array $array - * - * @return array - */ - public function getStyleArray($array) - { - return $this->parent->getStyleArray([$this->parentPropertyName => $array]); - } - - /** - * Apply styles from array. - * - * - * $spreadsheet->getActiveSheet()->getStyle('B2')->getBorders()->getTop()->applyFromArray( - * [ - * 'borderStyle' => Border::BORDER_DASHDOT, - * 'color' => [ - * 'rgb' => '808080' - * ] - * ] - * ); - * - * - * @param array $pStyles Array containing style information - * - * @return $this - */ - public function applyFromArray(array $pStyles) - { - if ($this->isSupervisor) { - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); - } else { - if (isset($pStyles['borderStyle'])) { - $this->setBorderStyle($pStyles['borderStyle']); - } - if (isset($pStyles['color'])) { - $this->getColor()->applyFromArray($pStyles['color']); - } - } - - return $this; - } - - /** - * Get Border style. - * - * @return string - */ - public function getBorderStyle() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getBorderStyle(); - } - - return $this->borderStyle; - } - - /** - * Set Border style. - * - * @param bool|string $pValue - * When passing a boolean, FALSE equates Border::BORDER_NONE - * and TRUE to Border::BORDER_MEDIUM - * - * @return $this - */ - public function setBorderStyle($pValue) - { - if (empty($pValue)) { - $pValue = self::BORDER_NONE; - } elseif (is_bool($pValue) && $pValue) { - $pValue = self::BORDER_MEDIUM; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['borderStyle' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->borderStyle = $pValue; - } - - return $this; - } - - /** - * Get Border Color. - * - * @return Color - */ - public function getColor() - { - return $this->color; - } - - /** - * Set Border Color. - * - * @return $this - */ - public function setColor(Color $pValue) - { - // make sure parameter is a real color and not a supervisor - $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; - - if ($this->isSupervisor) { - $styleArray = $this->getColor()->getStyleArray(['argb' => $color->getARGB()]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->color = $color; - } - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getHashCode(); - } - - return md5( - $this->borderStyle . - $this->color->getHashCode() . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Borders.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Borders.php deleted file mode 100644 index e75d7ee..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Borders.php +++ /dev/null @@ -1,411 +0,0 @@ -left = new Border($isSupervisor, $isConditional); - $this->right = new Border($isSupervisor, $isConditional); - $this->top = new Border($isSupervisor, $isConditional); - $this->bottom = new Border($isSupervisor, $isConditional); - $this->diagonal = new Border($isSupervisor, $isConditional); - $this->diagonalDirection = self::DIAGONAL_NONE; - - // Specially for supervisor - if ($isSupervisor) { - // Initialize pseudo-borders - $this->allBorders = new Border(true); - $this->outline = new Border(true); - $this->inside = new Border(true); - $this->vertical = new Border(true); - $this->horizontal = new Border(true); - - // bind parent if we are a supervisor - $this->left->bindParent($this, 'left'); - $this->right->bindParent($this, 'right'); - $this->top->bindParent($this, 'top'); - $this->bottom->bindParent($this, 'bottom'); - $this->diagonal->bindParent($this, 'diagonal'); - $this->allBorders->bindParent($this, 'allBorders'); - $this->outline->bindParent($this, 'outline'); - $this->inside->bindParent($this, 'inside'); - $this->vertical->bindParent($this, 'vertical'); - $this->horizontal->bindParent($this, 'horizontal'); - } - } - - /** - * Get the shared style component for the currently active cell in currently active sheet. - * Only used for style supervisor. - * - * @return Borders - */ - public function getSharedComponent() - { - return $this->parent->getSharedComponent()->getBorders(); - } - - /** - * Build style array from subcomponents. - * - * @param array $array - * - * @return array - */ - public function getStyleArray($array) - { - return ['borders' => $array]; - } - - /** - * Apply styles from array. - * - * - * $spreadsheet->getActiveSheet()->getStyle('B2')->getBorders()->applyFromArray( - * [ - * 'bottom' => [ - * 'borderStyle' => Border::BORDER_DASHDOT, - * 'color' => [ - * 'rgb' => '808080' - * ] - * ], - * 'top' => [ - * 'borderStyle' => Border::BORDER_DASHDOT, - * 'color' => [ - * 'rgb' => '808080' - * ] - * ] - * ] - * ); - * - * - * - * $spreadsheet->getActiveSheet()->getStyle('B2')->getBorders()->applyFromArray( - * [ - * 'allBorders' => [ - * 'borderStyle' => Border::BORDER_DASHDOT, - * 'color' => [ - * 'rgb' => '808080' - * ] - * ] - * ] - * ); - * - * - * @param array $pStyles Array containing style information - * - * @return $this - */ - public function applyFromArray(array $pStyles) - { - if ($this->isSupervisor) { - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); - } else { - if (isset($pStyles['left'])) { - $this->getLeft()->applyFromArray($pStyles['left']); - } - if (isset($pStyles['right'])) { - $this->getRight()->applyFromArray($pStyles['right']); - } - if (isset($pStyles['top'])) { - $this->getTop()->applyFromArray($pStyles['top']); - } - if (isset($pStyles['bottom'])) { - $this->getBottom()->applyFromArray($pStyles['bottom']); - } - if (isset($pStyles['diagonal'])) { - $this->getDiagonal()->applyFromArray($pStyles['diagonal']); - } - if (isset($pStyles['diagonalDirection'])) { - $this->setDiagonalDirection($pStyles['diagonalDirection']); - } - if (isset($pStyles['allBorders'])) { - $this->getLeft()->applyFromArray($pStyles['allBorders']); - $this->getRight()->applyFromArray($pStyles['allBorders']); - $this->getTop()->applyFromArray($pStyles['allBorders']); - $this->getBottom()->applyFromArray($pStyles['allBorders']); - } - } - - return $this; - } - - /** - * Get Left. - * - * @return Border - */ - public function getLeft() - { - return $this->left; - } - - /** - * Get Right. - * - * @return Border - */ - public function getRight() - { - return $this->right; - } - - /** - * Get Top. - * - * @return Border - */ - public function getTop() - { - return $this->top; - } - - /** - * Get Bottom. - * - * @return Border - */ - public function getBottom() - { - return $this->bottom; - } - - /** - * Get Diagonal. - * - * @return Border - */ - public function getDiagonal() - { - return $this->diagonal; - } - - /** - * Get AllBorders (pseudo-border). Only applies to supervisor. - * - * @return Border - */ - public function getAllBorders() - { - if (!$this->isSupervisor) { - throw new PhpSpreadsheetException('Can only get pseudo-border for supervisor.'); - } - - return $this->allBorders; - } - - /** - * Get Outline (pseudo-border). Only applies to supervisor. - * - * @return Border - */ - public function getOutline() - { - if (!$this->isSupervisor) { - throw new PhpSpreadsheetException('Can only get pseudo-border for supervisor.'); - } - - return $this->outline; - } - - /** - * Get Inside (pseudo-border). Only applies to supervisor. - * - * @return Border - */ - public function getInside() - { - if (!$this->isSupervisor) { - throw new PhpSpreadsheetException('Can only get pseudo-border for supervisor.'); - } - - return $this->inside; - } - - /** - * Get Vertical (pseudo-border). Only applies to supervisor. - * - * @return Border - */ - public function getVertical() - { - if (!$this->isSupervisor) { - throw new PhpSpreadsheetException('Can only get pseudo-border for supervisor.'); - } - - return $this->vertical; - } - - /** - * Get Horizontal (pseudo-border). Only applies to supervisor. - * - * @return Border - */ - public function getHorizontal() - { - if (!$this->isSupervisor) { - throw new PhpSpreadsheetException('Can only get pseudo-border for supervisor.'); - } - - return $this->horizontal; - } - - /** - * Get DiagonalDirection. - * - * @return int - */ - public function getDiagonalDirection() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getDiagonalDirection(); - } - - return $this->diagonalDirection; - } - - /** - * Set DiagonalDirection. - * - * @param int $pValue see self::DIAGONAL_* - * - * @return $this - */ - public function setDiagonalDirection($pValue) - { - if ($pValue == '') { - $pValue = self::DIAGONAL_NONE; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['diagonalDirection' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->diagonalDirection = $pValue; - } - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getHashcode(); - } - - return md5( - $this->getLeft()->getHashCode() . - $this->getRight()->getHashCode() . - $this->getTop()->getHashCode() . - $this->getBottom()->getHashCode() . - $this->getDiagonal()->getHashCode() . - $this->getDiagonalDirection() . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php deleted file mode 100644 index d8ba08b..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php +++ /dev/null @@ -1,407 +0,0 @@ -argb = $pARGB; - } - } - - /** - * Get the shared style component for the currently active cell in currently active sheet. - * Only used for style supervisor. - * - * @return Color - */ - public function getSharedComponent() - { - switch ($this->parentPropertyName) { - case 'endColor': - return $this->parent->getSharedComponent()->getEndColor(); - case 'color': - return $this->parent->getSharedComponent()->getColor(); - case 'startColor': - return $this->parent->getSharedComponent()->getStartColor(); - } - } - - /** - * Build style array from subcomponents. - * - * @param array $array - * - * @return array - */ - public function getStyleArray($array) - { - return $this->parent->getStyleArray([$this->parentPropertyName => $array]); - } - - /** - * Apply styles from array. - * - * - * $spreadsheet->getActiveSheet()->getStyle('B2')->getFont()->getColor()->applyFromArray(['rgb' => '808080']); - * - * - * @param array $pStyles Array containing style information - * - * @return $this - */ - public function applyFromArray(array $pStyles) - { - if ($this->isSupervisor) { - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); - } else { - if (isset($pStyles['rgb'])) { - $this->setRGB($pStyles['rgb']); - } - if (isset($pStyles['argb'])) { - $this->setARGB($pStyles['argb']); - } - } - - return $this; - } - - /** - * Get ARGB. - * - * @return string - */ - public function getARGB() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getARGB(); - } - - return $this->argb; - } - - /** - * Set ARGB. - * - * @param string $pValue see self::COLOR_* - * - * @return $this - */ - public function setARGB($pValue) - { - if ($pValue == '') { - $pValue = self::COLOR_BLACK; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['argb' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->argb = $pValue; - } - - return $this; - } - - /** - * Get RGB. - * - * @return string - */ - public function getRGB() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getRGB(); - } - - return substr($this->argb, 2); - } - - /** - * Set RGB. - * - * @param string $pValue RGB value - * - * @return $this - */ - public function setRGB($pValue) - { - if ($pValue == '') { - $pValue = '000000'; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['argb' => 'FF' . $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->argb = 'FF' . $pValue; - } - - return $this; - } - - /** - * Get a specified colour component of an RGB value. - * - * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE - * @param int $offset Position within the RGB value to extract - * @param bool $hex Flag indicating whether the component should be returned as a hex or a - * decimal value - * - * @return string The extracted colour component - */ - private static function getColourComponent($RGB, $offset, $hex = true) - { - $colour = substr($RGB, $offset, 2); - - return ($hex) ? $colour : hexdec($colour); - } - - /** - * Get the red colour component of an RGB value. - * - * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE - * @param bool $hex Flag indicating whether the component should be returned as a hex or a - * decimal value - * - * @return string The red colour component - */ - public static function getRed($RGB, $hex = true) - { - return self::getColourComponent($RGB, strlen($RGB) - 6, $hex); - } - - /** - * Get the green colour component of an RGB value. - * - * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE - * @param bool $hex Flag indicating whether the component should be returned as a hex or a - * decimal value - * - * @return string The green colour component - */ - public static function getGreen($RGB, $hex = true) - { - return self::getColourComponent($RGB, strlen($RGB) - 4, $hex); - } - - /** - * Get the blue colour component of an RGB value. - * - * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE - * @param bool $hex Flag indicating whether the component should be returned as a hex or a - * decimal value - * - * @return string The blue colour component - */ - public static function getBlue($RGB, $hex = true) - { - return self::getColourComponent($RGB, strlen($RGB) - 2, $hex); - } - - /** - * Adjust the brightness of a color. - * - * @param string $hex The colour as an RGBA or RGB value (e.g. FF00CCCC or CCDDEE) - * @param float $adjustPercentage The percentage by which to adjust the colour as a float from -1 to 1 - * - * @return string The adjusted colour as an RGBA or RGB value (e.g. FF00CCCC or CCDDEE) - */ - public static function changeBrightness($hex, $adjustPercentage) - { - $rgba = (strlen($hex) === 8); - - $red = self::getRed($hex, false); - $green = self::getGreen($hex, false); - $blue = self::getBlue($hex, false); - if ($adjustPercentage > 0) { - $red += (255 - $red) * $adjustPercentage; - $green += (255 - $green) * $adjustPercentage; - $blue += (255 - $blue) * $adjustPercentage; - } else { - $red += $red * $adjustPercentage; - $green += $green * $adjustPercentage; - $blue += $blue * $adjustPercentage; - } - - if ($red < 0) { - $red = 0; - } elseif ($red > 255) { - $red = 255; - } - if ($green < 0) { - $green = 0; - } elseif ($green > 255) { - $green = 255; - } - if ($blue < 0) { - $blue = 0; - } elseif ($blue > 255) { - $blue = 255; - } - - $rgb = strtoupper( - str_pad(dechex((int) $red), 2, '0', 0) . - str_pad(dechex((int) $green), 2, '0', 0) . - str_pad(dechex((int) $blue), 2, '0', 0) - ); - - return (($rgba) ? 'FF' : '') . $rgb; - } - - /** - * Get indexed color. - * - * @param int $pIndex Index entry point into the colour array - * @param bool $background Flag to indicate whether default background or foreground colour - * should be returned if the indexed colour doesn't exist - * - * @return self - */ - public static function indexedColor($pIndex, $background = false) - { - // Clean parameter - $pIndex = (int) $pIndex; - - // Indexed colors - if (self::$indexedColors === null) { - self::$indexedColors = [ - 1 => 'FF000000', // System Colour #1 - Black - 2 => 'FFFFFFFF', // System Colour #2 - White - 3 => 'FFFF0000', // System Colour #3 - Red - 4 => 'FF00FF00', // System Colour #4 - Green - 5 => 'FF0000FF', // System Colour #5 - Blue - 6 => 'FFFFFF00', // System Colour #6 - Yellow - 7 => 'FFFF00FF', // System Colour #7- Magenta - 8 => 'FF00FFFF', // System Colour #8- Cyan - 9 => 'FF800000', // Standard Colour #9 - 10 => 'FF008000', // Standard Colour #10 - 11 => 'FF000080', // Standard Colour #11 - 12 => 'FF808000', // Standard Colour #12 - 13 => 'FF800080', // Standard Colour #13 - 14 => 'FF008080', // Standard Colour #14 - 15 => 'FFC0C0C0', // Standard Colour #15 - 16 => 'FF808080', // Standard Colour #16 - 17 => 'FF9999FF', // Chart Fill Colour #17 - 18 => 'FF993366', // Chart Fill Colour #18 - 19 => 'FFFFFFCC', // Chart Fill Colour #19 - 20 => 'FFCCFFFF', // Chart Fill Colour #20 - 21 => 'FF660066', // Chart Fill Colour #21 - 22 => 'FFFF8080', // Chart Fill Colour #22 - 23 => 'FF0066CC', // Chart Fill Colour #23 - 24 => 'FFCCCCFF', // Chart Fill Colour #24 - 25 => 'FF000080', // Chart Line Colour #25 - 26 => 'FFFF00FF', // Chart Line Colour #26 - 27 => 'FFFFFF00', // Chart Line Colour #27 - 28 => 'FF00FFFF', // Chart Line Colour #28 - 29 => 'FF800080', // Chart Line Colour #29 - 30 => 'FF800000', // Chart Line Colour #30 - 31 => 'FF008080', // Chart Line Colour #31 - 32 => 'FF0000FF', // Chart Line Colour #32 - 33 => 'FF00CCFF', // Standard Colour #33 - 34 => 'FFCCFFFF', // Standard Colour #34 - 35 => 'FFCCFFCC', // Standard Colour #35 - 36 => 'FFFFFF99', // Standard Colour #36 - 37 => 'FF99CCFF', // Standard Colour #37 - 38 => 'FFFF99CC', // Standard Colour #38 - 39 => 'FFCC99FF', // Standard Colour #39 - 40 => 'FFFFCC99', // Standard Colour #40 - 41 => 'FF3366FF', // Standard Colour #41 - 42 => 'FF33CCCC', // Standard Colour #42 - 43 => 'FF99CC00', // Standard Colour #43 - 44 => 'FFFFCC00', // Standard Colour #44 - 45 => 'FFFF9900', // Standard Colour #45 - 46 => 'FFFF6600', // Standard Colour #46 - 47 => 'FF666699', // Standard Colour #47 - 48 => 'FF969696', // Standard Colour #48 - 49 => 'FF003366', // Standard Colour #49 - 50 => 'FF339966', // Standard Colour #50 - 51 => 'FF003300', // Standard Colour #51 - 52 => 'FF333300', // Standard Colour #52 - 53 => 'FF993300', // Standard Colour #53 - 54 => 'FF993366', // Standard Colour #54 - 55 => 'FF333399', // Standard Colour #55 - 56 => 'FF333333', // Standard Colour #56 - ]; - } - - if (isset(self::$indexedColors[$pIndex])) { - return new self(self::$indexedColors[$pIndex]); - } - - if ($background) { - return new self(self::COLOR_WHITE); - } - - return new self(self::COLOR_BLACK); - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getHashCode(); - } - - return md5( - $this->argb . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php deleted file mode 100644 index 35ec479..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php +++ /dev/null @@ -1,274 +0,0 @@ -style = new Style(false, true); - } - - /** - * Get Condition type. - * - * @return string - */ - public function getConditionType() - { - return $this->conditionType; - } - - /** - * Set Condition type. - * - * @param string $pValue Condition type, see self::CONDITION_* - * - * @return $this - */ - public function setConditionType($pValue) - { - $this->conditionType = $pValue; - - return $this; - } - - /** - * Get Operator type. - * - * @return string - */ - public function getOperatorType() - { - return $this->operatorType; - } - - /** - * Set Operator type. - * - * @param string $pValue Conditional operator type, see self::OPERATOR_* - * - * @return $this - */ - public function setOperatorType($pValue) - { - $this->operatorType = $pValue; - - return $this; - } - - /** - * Get text. - * - * @return string - */ - public function getText() - { - return $this->text; - } - - /** - * Set text. - * - * @param string $value - * - * @return $this - */ - public function setText($value) - { - $this->text = $value; - - return $this; - } - - /** - * Get StopIfTrue. - * - * @return bool - */ - public function getStopIfTrue() - { - return $this->stopIfTrue; - } - - /** - * Set StopIfTrue. - * - * @param bool $value - * - * @return $this - */ - public function setStopIfTrue($value) - { - $this->stopIfTrue = $value; - - return $this; - } - - /** - * Get Conditions. - * - * @return string[] - */ - public function getConditions() - { - return $this->condition; - } - - /** - * Set Conditions. - * - * @param string[] $pValue Condition - * - * @return $this - */ - public function setConditions($pValue) - { - if (!is_array($pValue)) { - $pValue = [$pValue]; - } - $this->condition = $pValue; - - return $this; - } - - /** - * Add Condition. - * - * @param string $pValue Condition - * - * @return $this - */ - public function addCondition($pValue) - { - $this->condition[] = $pValue; - - return $this; - } - - /** - * Get Style. - * - * @return Style - */ - public function getStyle() - { - return $this->style; - } - - /** - * Set Style. - * - * @param Style $pValue - * - * @return $this - */ - public function setStyle(?Style $pValue = null) - { - $this->style = $pValue; - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - return md5( - $this->conditionType . - $this->operatorType . - implode(';', $this->condition) . - $this->style->getHashCode() . - __CLASS__ - ); - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Fill.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Fill.php deleted file mode 100644 index c6baeed..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Fill.php +++ /dev/null @@ -1,314 +0,0 @@ -fillType = null; - } - $this->startColor = new Color(Color::COLOR_WHITE, $isSupervisor, $isConditional); - $this->endColor = new Color(Color::COLOR_BLACK, $isSupervisor, $isConditional); - - // bind parent if we are a supervisor - if ($isSupervisor) { - $this->startColor->bindParent($this, 'startColor'); - $this->endColor->bindParent($this, 'endColor'); - } - } - - /** - * Get the shared style component for the currently active cell in currently active sheet. - * Only used for style supervisor. - * - * @return Fill - */ - public function getSharedComponent() - { - return $this->parent->getSharedComponent()->getFill(); - } - - /** - * Build style array from subcomponents. - * - * @param array $array - * - * @return array - */ - public function getStyleArray($array) - { - return ['fill' => $array]; - } - - /** - * Apply styles from array. - * - * - * $spreadsheet->getActiveSheet()->getStyle('B2')->getFill()->applyFromArray( - * [ - * 'fillType' => Fill::FILL_GRADIENT_LINEAR, - * 'rotation' => 0, - * 'startColor' => [ - * 'rgb' => '000000' - * ], - * 'endColor' => [ - * 'argb' => 'FFFFFFFF' - * ] - * ] - * ); - * - * - * @param array $pStyles Array containing style information - * - * @return $this - */ - public function applyFromArray(array $pStyles) - { - if ($this->isSupervisor) { - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); - } else { - if (isset($pStyles['fillType'])) { - $this->setFillType($pStyles['fillType']); - } - if (isset($pStyles['rotation'])) { - $this->setRotation($pStyles['rotation']); - } - if (isset($pStyles['startColor'])) { - $this->getStartColor()->applyFromArray($pStyles['startColor']); - } - if (isset($pStyles['endColor'])) { - $this->getEndColor()->applyFromArray($pStyles['endColor']); - } - if (isset($pStyles['color'])) { - $this->getStartColor()->applyFromArray($pStyles['color']); - $this->getEndColor()->applyFromArray($pStyles['color']); - } - } - - return $this; - } - - /** - * Get Fill Type. - * - * @return string - */ - public function getFillType() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getFillType(); - } - - return $this->fillType; - } - - /** - * Set Fill Type. - * - * @param string $pValue Fill type, see self::FILL_* - * - * @return $this - */ - public function setFillType($pValue) - { - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['fillType' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->fillType = $pValue; - } - - return $this; - } - - /** - * Get Rotation. - * - * @return float - */ - public function getRotation() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getRotation(); - } - - return $this->rotation; - } - - /** - * Set Rotation. - * - * @param float $pValue - * - * @return $this - */ - public function setRotation($pValue) - { - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['rotation' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->rotation = $pValue; - } - - return $this; - } - - /** - * Get Start Color. - * - * @return Color - */ - public function getStartColor() - { - return $this->startColor; - } - - /** - * Set Start Color. - * - * @return $this - */ - public function setStartColor(Color $pValue) - { - // make sure parameter is a real color and not a supervisor - $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; - - if ($this->isSupervisor) { - $styleArray = $this->getStartColor()->getStyleArray(['argb' => $color->getARGB()]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->startColor = $color; - } - - return $this; - } - - /** - * Get End Color. - * - * @return Color - */ - public function getEndColor() - { - return $this->endColor; - } - - /** - * Set End Color. - * - * @return $this - */ - public function setEndColor(Color $pValue) - { - // make sure parameter is a real color and not a supervisor - $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; - - if ($this->isSupervisor) { - $styleArray = $this->getEndColor()->getStyleArray(['argb' => $color->getARGB()]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->endColor = $color; - } - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getHashCode(); - } - // Note that we don't care about colours for fill type NONE, but could have duplicate NONEs with - // different hashes if we don't explicitly prevent this - return md5( - $this->getFillType() . - $this->getRotation() . - ($this->getFillType() !== self::FILL_NONE ? $this->getStartColor()->getHashCode() : '') . - ($this->getFillType() !== self::FILL_NONE ? $this->getEndColor()->getHashCode() : '') . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php deleted file mode 100644 index a062a38..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php +++ /dev/null @@ -1,542 +0,0 @@ -name = null; - $this->size = null; - $this->bold = null; - $this->italic = null; - $this->superscript = null; - $this->subscript = null; - $this->underline = null; - $this->strikethrough = null; - $this->color = new Color(Color::COLOR_BLACK, $isSupervisor, $isConditional); - } else { - $this->color = new Color(Color::COLOR_BLACK, $isSupervisor); - } - // bind parent if we are a supervisor - if ($isSupervisor) { - $this->color->bindParent($this, 'color'); - } - } - - /** - * Get the shared style component for the currently active cell in currently active sheet. - * Only used for style supervisor. - * - * @return Font - */ - public function getSharedComponent() - { - return $this->parent->getSharedComponent()->getFont(); - } - - /** - * Build style array from subcomponents. - * - * @param array $array - * - * @return array - */ - public function getStyleArray($array) - { - return ['font' => $array]; - } - - /** - * Apply styles from array. - * - * - * $spreadsheet->getActiveSheet()->getStyle('B2')->getFont()->applyFromArray( - * [ - * 'name' => 'Arial', - * 'bold' => TRUE, - * 'italic' => FALSE, - * 'underline' => \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_DOUBLE, - * 'strikethrough' => FALSE, - * 'color' => [ - * 'rgb' => '808080' - * ] - * ] - * ); - * - * - * @param array $pStyles Array containing style information - * - * @return $this - */ - public function applyFromArray(array $pStyles) - { - if ($this->isSupervisor) { - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); - } else { - if (isset($pStyles['name'])) { - $this->setName($pStyles['name']); - } - if (isset($pStyles['bold'])) { - $this->setBold($pStyles['bold']); - } - if (isset($pStyles['italic'])) { - $this->setItalic($pStyles['italic']); - } - if (isset($pStyles['superscript'])) { - $this->setSuperscript($pStyles['superscript']); - } - if (isset($pStyles['subscript'])) { - $this->setSubscript($pStyles['subscript']); - } - if (isset($pStyles['underline'])) { - $this->setUnderline($pStyles['underline']); - } - if (isset($pStyles['strikethrough'])) { - $this->setStrikethrough($pStyles['strikethrough']); - } - if (isset($pStyles['color'])) { - $this->getColor()->applyFromArray($pStyles['color']); - } - if (isset($pStyles['size'])) { - $this->setSize($pStyles['size']); - } - } - - return $this; - } - - /** - * Get Name. - * - * @return string - */ - public function getName() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getName(); - } - - return $this->name; - } - - /** - * Set Name. - * - * @param string $pValue - * - * @return $this - */ - public function setName($pValue) - { - if ($pValue == '') { - $pValue = 'Calibri'; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['name' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->name = $pValue; - } - - return $this; - } - - /** - * Get Size. - * - * @return float - */ - public function getSize() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getSize(); - } - - return $this->size; - } - - /** - * Set Size. - * - * @param float $pValue - * - * @return $this - */ - public function setSize($pValue) - { - if ($pValue == '') { - $pValue = 10; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['size' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->size = $pValue; - } - - return $this; - } - - /** - * Get Bold. - * - * @return bool - */ - public function getBold() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getBold(); - } - - return $this->bold; - } - - /** - * Set Bold. - * - * @param bool $pValue - * - * @return $this - */ - public function setBold($pValue) - { - if ($pValue == '') { - $pValue = false; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['bold' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->bold = $pValue; - } - - return $this; - } - - /** - * Get Italic. - * - * @return bool - */ - public function getItalic() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getItalic(); - } - - return $this->italic; - } - - /** - * Set Italic. - * - * @param bool $pValue - * - * @return $this - */ - public function setItalic($pValue) - { - if ($pValue == '') { - $pValue = false; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['italic' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->italic = $pValue; - } - - return $this; - } - - /** - * Get Superscript. - * - * @return bool - */ - public function getSuperscript() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getSuperscript(); - } - - return $this->superscript; - } - - /** - * Set Superscript. - * - * @return $this - */ - public function setSuperscript(bool $pValue) - { - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['superscript' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->superscript = $pValue; - if ($this->superscript) { - $this->subscript = false; - } - } - - return $this; - } - - /** - * Get Subscript. - * - * @return bool - */ - public function getSubscript() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getSubscript(); - } - - return $this->subscript; - } - - /** - * Set Subscript. - * - * @return $this - */ - public function setSubscript(bool $pValue) - { - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['subscript' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->subscript = $pValue; - if ($this->subscript) { - $this->superscript = false; - } - } - - return $this; - } - - /** - * Get Underline. - * - * @return string - */ - public function getUnderline() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getUnderline(); - } - - return $this->underline; - } - - /** - * Set Underline. - * - * @param bool|string $pValue \PhpOffice\PhpSpreadsheet\Style\Font underline type - * If a boolean is passed, then TRUE equates to UNDERLINE_SINGLE, - * false equates to UNDERLINE_NONE - * - * @return $this - */ - public function setUnderline($pValue) - { - if (is_bool($pValue)) { - $pValue = ($pValue) ? self::UNDERLINE_SINGLE : self::UNDERLINE_NONE; - } elseif ($pValue == '') { - $pValue = self::UNDERLINE_NONE; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['underline' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->underline = $pValue; - } - - return $this; - } - - /** - * Get Strikethrough. - * - * @return bool - */ - public function getStrikethrough() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getStrikethrough(); - } - - return $this->strikethrough; - } - - /** - * Set Strikethrough. - * - * @param bool $pValue - * - * @return $this - */ - public function setStrikethrough($pValue) - { - if ($pValue == '') { - $pValue = false; - } - - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['strikethrough' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->strikethrough = $pValue; - } - - return $this; - } - - /** - * Get Color. - * - * @return Color - */ - public function getColor() - { - return $this->color; - } - - /** - * Set Color. - * - * @return $this - */ - public function setColor(Color $pValue) - { - // make sure parameter is a real color and not a supervisor - $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; - - if ($this->isSupervisor) { - $styleArray = $this->getColor()->getStyleArray(['argb' => $color->getARGB()]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->color = $color; - } - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getHashCode(); - } - - return md5( - $this->name . - $this->size . - ($this->bold ? 't' : 'f') . - ($this->italic ? 't' : 'f') . - ($this->superscript ? 't' : 'f') . - ($this->subscript ? 't' : 'f') . - $this->underline . - ($this->strikethrough ? 't' : 'f') . - $this->color->getHashCode() . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php deleted file mode 100644 index 259acab..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php +++ /dev/null @@ -1,873 +0,0 @@ -formatCode = null; - $this->builtInFormatCode = false; - } - } - - /** - * Get the shared style component for the currently active cell in currently active sheet. - * Only used for style supervisor. - * - * @return NumberFormat - */ - public function getSharedComponent() - { - return $this->parent->getSharedComponent()->getNumberFormat(); - } - - /** - * Build style array from subcomponents. - * - * @param array $array - * - * @return array - */ - public function getStyleArray($array) - { - return ['numberFormat' => $array]; - } - - /** - * Apply styles from array. - * - * - * $spreadsheet->getActiveSheet()->getStyle('B2')->getNumberFormat()->applyFromArray( - * [ - * 'formatCode' => NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE - * ] - * ); - * - * - * @param array $pStyles Array containing style information - * - * @return $this - */ - public function applyFromArray(array $pStyles) - { - if ($this->isSupervisor) { - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); - } else { - if (isset($pStyles['formatCode'])) { - $this->setFormatCode($pStyles['formatCode']); - } - } - - return $this; - } - - /** - * Get Format Code. - * - * @return string - */ - public function getFormatCode() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getFormatCode(); - } - if ($this->builtInFormatCode !== false) { - return self::builtInFormatCode($this->builtInFormatCode); - } - - return $this->formatCode; - } - - /** - * Set Format Code. - * - * @param string $pValue see self::FORMAT_* - * - * @return $this - */ - public function setFormatCode($pValue) - { - if ($pValue == '') { - $pValue = self::FORMAT_GENERAL; - } - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['formatCode' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->formatCode = $pValue; - $this->builtInFormatCode = self::builtInFormatCodeIndex($pValue); - } - - return $this; - } - - /** - * Get Built-In Format Code. - * - * @return int - */ - public function getBuiltInFormatCode() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getBuiltInFormatCode(); - } - - return $this->builtInFormatCode; - } - - /** - * Set Built-In Format Code. - * - * @param int $pValue - * - * @return $this - */ - public function setBuiltInFormatCode($pValue) - { - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['formatCode' => self::builtInFormatCode($pValue)]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->builtInFormatCode = $pValue; - $this->formatCode = self::builtInFormatCode($pValue); - } - - return $this; - } - - /** - * Fill built-in format codes. - */ - private static function fillBuiltInFormatCodes(): void - { - // [MS-OI29500: Microsoft Office Implementation Information for ISO/IEC-29500 Standard Compliance] - // 18.8.30. numFmt (Number Format) - // - // The ECMA standard defines built-in format IDs - // 14: "mm-dd-yy" - // 22: "m/d/yy h:mm" - // 37: "#,##0 ;(#,##0)" - // 38: "#,##0 ;[Red](#,##0)" - // 39: "#,##0.00;(#,##0.00)" - // 40: "#,##0.00;[Red](#,##0.00)" - // 47: "mmss.0" - // KOR fmt 55: "yyyy-mm-dd" - // Excel defines built-in format IDs - // 14: "m/d/yyyy" - // 22: "m/d/yyyy h:mm" - // 37: "#,##0_);(#,##0)" - // 38: "#,##0_);[Red](#,##0)" - // 39: "#,##0.00_);(#,##0.00)" - // 40: "#,##0.00_);[Red](#,##0.00)" - // 47: "mm:ss.0" - // KOR fmt 55: "yyyy/mm/dd" - - // Built-in format codes - if (self::$builtInFormats === null) { - self::$builtInFormats = []; - - // General - self::$builtInFormats[0] = self::FORMAT_GENERAL; - self::$builtInFormats[1] = '0'; - self::$builtInFormats[2] = '0.00'; - self::$builtInFormats[3] = '#,##0'; - self::$builtInFormats[4] = '#,##0.00'; - - self::$builtInFormats[9] = '0%'; - self::$builtInFormats[10] = '0.00%'; - self::$builtInFormats[11] = '0.00E+00'; - self::$builtInFormats[12] = '# ?/?'; - self::$builtInFormats[13] = '# ??/??'; - self::$builtInFormats[14] = 'm/d/yyyy'; // Despite ECMA 'mm-dd-yy'; - self::$builtInFormats[15] = 'd-mmm-yy'; - self::$builtInFormats[16] = 'd-mmm'; - self::$builtInFormats[17] = 'mmm-yy'; - self::$builtInFormats[18] = 'h:mm AM/PM'; - self::$builtInFormats[19] = 'h:mm:ss AM/PM'; - self::$builtInFormats[20] = 'h:mm'; - self::$builtInFormats[21] = 'h:mm:ss'; - self::$builtInFormats[22] = 'm/d/yyyy h:mm'; // Despite ECMA 'm/d/yy h:mm'; - - self::$builtInFormats[37] = '#,##0_);(#,##0)'; // Despite ECMA '#,##0 ;(#,##0)'; - self::$builtInFormats[38] = '#,##0_);[Red](#,##0)'; // Despite ECMA '#,##0 ;[Red](#,##0)'; - self::$builtInFormats[39] = '#,##0.00_);(#,##0.00)'; // Despite ECMA '#,##0.00;(#,##0.00)'; - self::$builtInFormats[40] = '#,##0.00_);[Red](#,##0.00)'; // Despite ECMA '#,##0.00;[Red](#,##0.00)'; - - self::$builtInFormats[44] = '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)'; - self::$builtInFormats[45] = 'mm:ss'; - self::$builtInFormats[46] = '[h]:mm:ss'; - self::$builtInFormats[47] = 'mm:ss.0'; // Despite ECMA 'mmss.0'; - self::$builtInFormats[48] = '##0.0E+0'; - self::$builtInFormats[49] = '@'; - - // CHT - self::$builtInFormats[27] = '[$-404]e/m/d'; - self::$builtInFormats[30] = 'm/d/yy'; - self::$builtInFormats[36] = '[$-404]e/m/d'; - self::$builtInFormats[50] = '[$-404]e/m/d'; - self::$builtInFormats[57] = '[$-404]e/m/d'; - - // THA - self::$builtInFormats[59] = 't0'; - self::$builtInFormats[60] = 't0.00'; - self::$builtInFormats[61] = 't#,##0'; - self::$builtInFormats[62] = 't#,##0.00'; - self::$builtInFormats[67] = 't0%'; - self::$builtInFormats[68] = 't0.00%'; - self::$builtInFormats[69] = 't# ?/?'; - self::$builtInFormats[70] = 't# ??/??'; - - // JPN - self::$builtInFormats[28] = '[$-411]ggge"幓"m"月"d"ę—„"'; - self::$builtInFormats[29] = '[$-411]ggge"幓"m"月"d"ę—„"'; - self::$builtInFormats[31] = 'yyyy"幓"m"月"d"ę—„"'; - self::$builtInFormats[32] = 'h"Ꙃ"mm"分"'; - self::$builtInFormats[33] = 'h"Ꙃ"mm"分"ss"ē§’"'; - self::$builtInFormats[34] = 'yyyy"幓"m"月"'; - self::$builtInFormats[35] = 'm"月"d"ę—„"'; - self::$builtInFormats[51] = '[$-411]ggge"幓"m"月"d"ę—„"'; - self::$builtInFormats[52] = 'yyyy"幓"m"月"'; - self::$builtInFormats[53] = 'm"月"d"ę—„"'; - self::$builtInFormats[54] = '[$-411]ggge"幓"m"月"d"ę—„"'; - self::$builtInFormats[55] = 'yyyy"幓"m"月"'; - self::$builtInFormats[56] = 'm"月"d"ę—„"'; - self::$builtInFormats[58] = '[$-411]ggge"幓"m"月"d"ę—„"'; - - // Flip array (for faster lookups) - self::$flippedBuiltInFormats = array_flip(self::$builtInFormats); - } - } - - /** - * Get built-in format code. - * - * @param int $pIndex - * - * @return string - */ - public static function builtInFormatCode($pIndex) - { - // Clean parameter - $pIndex = (int) $pIndex; - - // Ensure built-in format codes are available - self::fillBuiltInFormatCodes(); - - // Lookup format code - if (isset(self::$builtInFormats[$pIndex])) { - return self::$builtInFormats[$pIndex]; - } - - return ''; - } - - /** - * Get built-in format code index. - * - * @param string $formatCode - * - * @return bool|int - */ - public static function builtInFormatCodeIndex($formatCode) - { - // Ensure built-in format codes are available - self::fillBuiltInFormatCodes(); - - // Lookup format code - if (array_key_exists($formatCode, self::$flippedBuiltInFormats)) { - return self::$flippedBuiltInFormats[$formatCode]; - } - - return false; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getHashCode(); - } - - return md5( - $this->formatCode . - $this->builtInFormatCode . - __CLASS__ - ); - } - - /** - * Search/replace values to convert Excel date/time format masks to PHP format masks. - * - * @var array - */ - private static $dateFormatReplacements = [ - // first remove escapes related to non-format characters - '\\' => '', - // 12-hour suffix - 'am/pm' => 'A', - // 4-digit year - 'e' => 'Y', - 'yyyy' => 'Y', - // 2-digit year - 'yy' => 'y', - // first letter of month - no php equivalent - 'mmmmm' => 'M', - // full month name - 'mmmm' => 'F', - // short month name - 'mmm' => 'M', - // mm is minutes if time, but can also be month w/leading zero - // so we try to identify times be the inclusion of a : separator in the mask - // It isn't perfect, but the best way I know how - ':mm' => ':i', - 'mm:' => 'i:', - // month leading zero - 'mm' => 'm', - // month no leading zero - 'm' => 'n', - // full day of week name - 'dddd' => 'l', - // short day of week name - 'ddd' => 'D', - // days leading zero - 'dd' => 'd', - // days no leading zero - 'd' => 'j', - // seconds - 'ss' => 's', - // fractional seconds - no php equivalent - '.s' => '', - ]; - - /** - * Search/replace values to convert Excel date/time format masks hours to PHP format masks (24 hr clock). - * - * @var array - */ - private static $dateFormatReplacements24 = [ - 'hh' => 'H', - 'h' => 'G', - ]; - - /** - * Search/replace values to convert Excel date/time format masks hours to PHP format masks (12 hr clock). - * - * @var array - */ - private static $dateFormatReplacements12 = [ - 'hh' => 'h', - 'h' => 'g', - ]; - - private static function setLowercaseCallback($matches) - { - return mb_strtolower($matches[0]); - } - - private static function escapeQuotesCallback($matches) - { - return '\\' . implode('\\', str_split($matches[1])); - } - - private static function formatAsDate(&$value, &$format): void - { - // strip off first part containing e.g. [$-F800] or [$USD-409] - // general syntax: [$-] - // language info is in hexadecimal - // strip off chinese part like [DBNum1][$-804] - $format = preg_replace('/^(\[[0-9A-Za-z]*\])*(\[\$[A-Z]*-[0-9A-F]*\])/i', '', $format); - - // OpenOffice.org uses upper-case number formats, e.g. 'YYYY', convert to lower-case; - // but we don't want to change any quoted strings - $format = preg_replace_callback('/(?:^|")([^"]*)(?:$|")/', ['self', 'setLowercaseCallback'], $format); - - // Only process the non-quoted blocks for date format characters - $blocks = explode('"', $format); - foreach ($blocks as $key => &$block) { - if ($key % 2 == 0) { - $block = strtr($block, self::$dateFormatReplacements); - if (!strpos($block, 'A')) { - // 24-hour time format - // when [h]:mm format, the [h] should replace to the hours of the value * 24 - if (false !== strpos($block, '[h]')) { - $hours = (int) ($value * 24); - $block = str_replace('[h]', $hours, $block); - - continue; - } - $block = strtr($block, self::$dateFormatReplacements24); - } else { - // 12-hour time format - $block = strtr($block, self::$dateFormatReplacements12); - } - } - } - $format = implode('"', $blocks); - - // escape any quoted characters so that DateTime format() will render them correctly - $format = preg_replace_callback('/"(.*)"/U', ['self', 'escapeQuotesCallback'], $format); - - $dateObj = Date::excelToDateTimeObject($value); - $value = $dateObj->format($format); - } - - private static function formatAsPercentage(&$value, &$format): void - { - if ($format === self::FORMAT_PERCENTAGE) { - $value = round((100 * $value), 0) . '%'; - } else { - if (preg_match('/\.[#0]+/', $format, $m)) { - $s = substr($m[0], 0, 1) . (strlen($m[0]) - 1); - $format = str_replace($m[0], $s, $format); - } - if (preg_match('/^[#0]+/', $format, $m)) { - $format = str_replace($m[0], strlen($m[0]), $format); - } - $format = '%' . str_replace('%', 'f%%', $format); - - $value = sprintf($format, 100 * $value); - } - } - - private static function formatAsFraction(&$value, &$format): void - { - $sign = ($value < 0) ? '-' : ''; - - $integerPart = floor(abs($value)); - $decimalPart = trim(fmod(abs($value), 1), '0.'); - $decimalLength = strlen($decimalPart); - $decimalDivisor = 10 ** $decimalLength; - - $GCD = MathTrig::GCD($decimalPart, $decimalDivisor); - - $adjustedDecimalPart = $decimalPart / $GCD; - $adjustedDecimalDivisor = $decimalDivisor / $GCD; - - if ((strpos($format, '0') !== false)) { - $value = "$sign$integerPart $adjustedDecimalPart/$adjustedDecimalDivisor"; - } elseif ((strpos($format, '#') !== false)) { - if ($integerPart == 0) { - $value = "$sign$adjustedDecimalPart/$adjustedDecimalDivisor"; - } else { - $value = "$sign$integerPart $adjustedDecimalPart/$adjustedDecimalDivisor"; - } - } elseif ((substr($format, 0, 3) == '? ?')) { - if ($integerPart == 0) { - $integerPart = ''; - } - $value = "$sign$integerPart $adjustedDecimalPart/$adjustedDecimalDivisor"; - } else { - $adjustedDecimalPart += $integerPart * $adjustedDecimalDivisor; - $value = "$sign$adjustedDecimalPart/$adjustedDecimalDivisor"; - } - } - - private static function mergeComplexNumberFormatMasks($numbers, $masks) - { - $decimalCount = strlen($numbers[1]); - $postDecimalMasks = []; - - do { - $tempMask = array_pop($masks); - $postDecimalMasks[] = $tempMask; - $decimalCount -= strlen($tempMask); - } while ($decimalCount > 0); - - return [ - implode('.', $masks), - implode('.', array_reverse($postDecimalMasks)), - ]; - } - - private static function processComplexNumberFormatMask($number, $mask) - { - $result = $number; - $maskingBlockCount = preg_match_all('/0+/', $mask, $maskingBlocks, PREG_OFFSET_CAPTURE); - - if ($maskingBlockCount > 1) { - $maskingBlocks = array_reverse($maskingBlocks[0]); - - foreach ($maskingBlocks as $block) { - $divisor = 1 . $block[0]; - $size = strlen($block[0]); - $offset = $block[1]; - - $blockValue = sprintf( - '%0' . $size . 'd', - fmod($number, $divisor) - ); - $number = floor($number / $divisor); - $mask = substr_replace($mask, $blockValue, $offset, $size); - } - if ($number > 0) { - $mask = substr_replace($mask, $number, $offset, 0); - } - $result = $mask; - } - - return $result; - } - - private static function complexNumberFormatMask($number, $mask, $splitOnPoint = true) - { - $sign = ($number < 0.0); - $number = abs($number); - - if ($splitOnPoint && strpos($mask, '.') !== false && strpos($number, '.') !== false) { - $numbers = explode('.', $number); - $masks = explode('.', $mask); - if (count($masks) > 2) { - $masks = self::mergeComplexNumberFormatMasks($numbers, $masks); - } - $result1 = self::complexNumberFormatMask($numbers[0], $masks[0], false); - $result2 = strrev(self::complexNumberFormatMask(strrev($numbers[1]), strrev($masks[1]), false)); - - return (($sign) ? '-' : '') . $result1 . '.' . $result2; - } - - $result = self::processComplexNumberFormatMask($number, $mask); - - return (($sign) ? '-' : '') . $result; - } - - private static function formatStraightNumericValue($value, $format, array $matches, $useThousands, $number_regex) - { - $left = $matches[1]; - $dec = $matches[2]; - $right = $matches[3]; - - // minimun width of formatted number (including dot) - $minWidth = strlen($left) + strlen($dec) + strlen($right); - if ($useThousands) { - $value = number_format( - $value, - strlen($right), - StringHelper::getDecimalSeparator(), - StringHelper::getThousandsSeparator() - ); - $value = preg_replace($number_regex, $value, $format); - } else { - if (preg_match('/[0#]E[+-]0/i', $format)) { - // Scientific format - $value = sprintf('%5.2E', $value); - } elseif (preg_match('/0([^\d\.]+)0/', $format) || substr_count($format, '.') > 1) { - if ($value == (int) $value && substr_count($format, '.') === 1) { - $value *= 10 ** strlen(explode('.', $format)[1]); - } - $value = self::complexNumberFormatMask($value, $format); - } else { - $sprintf_pattern = "%0$minWidth." . strlen($right) . 'f'; - $value = sprintf($sprintf_pattern, $value); - $value = preg_replace($number_regex, $value, $format); - } - } - - return $value; - } - - private static function formatAsNumber($value, $format) - { - // The "_" in this string has already been stripped out, - // so this test is never true. Furthermore, testing - // on Excel shows this format uses Euro symbol, not "EUR". - //if ($format === self::FORMAT_CURRENCY_EUR_SIMPLE) { - // return 'EUR ' . sprintf('%1.2f', $value); - //} - - // Some non-number strings are quoted, so we'll get rid of the quotes, likewise any positional * symbols - $format = str_replace(['"', '*'], '', $format); - - // Find out if we need thousands separator - // This is indicated by a comma enclosed by a digit placeholder: - // #,# or 0,0 - $useThousands = preg_match('/(#,#|0,0)/', $format); - if ($useThousands) { - $format = preg_replace('/0,0/', '00', $format); - $format = preg_replace('/#,#/', '##', $format); - } - - // Scale thousands, millions,... - // This is indicated by a number of commas after a digit placeholder: - // #, or 0.0,, - $scale = 1; // same as no scale - $matches = []; - if (preg_match('/(#|0)(,+)/', $format, $matches)) { - $scale = 1000 ** strlen($matches[2]); - - // strip the commas - $format = preg_replace('/0,+/', '0', $format); - $format = preg_replace('/#,+/', '#', $format); - } - - if (preg_match('/#?.*\?\/\?/', $format, $m)) { - if ($value != (int) $value) { - self::formatAsFraction($value, $format); - } - } else { - // Handle the number itself - - // scale number - $value = $value / $scale; - // Strip # - $format = preg_replace('/\\#/', '0', $format); - // Remove locale code [$-###] - $format = preg_replace('/\[\$\-.*\]/', '', $format); - - $n = '/\\[[^\\]]+\\]/'; - $m = preg_replace($n, '', $format); - $number_regex = '/(0+)(\\.?)(0*)/'; - if (preg_match($number_regex, $m, $matches)) { - $value = self::formatStraightNumericValue($value, $format, $matches, $useThousands, $number_regex); - } - } - - if (preg_match('/\[\$(.*)\]/u', $format, $m)) { - // Currency or Accounting - $currencyCode = $m[1]; - [$currencyCode] = explode('-', $currencyCode); - if ($currencyCode == '') { - $currencyCode = StringHelper::getCurrencyCode(); - } - $value = preg_replace('/\[\$([^\]]*)\]/u', $currencyCode, $value); - } - - return $value; - } - - private static function splitFormatCompare($value, $cond, $val, $dfcond, $dfval) - { - if (!$cond) { - $cond = $dfcond; - $val = $dfval; - } - switch ($cond) { - case '>': - return $value > $val; - - case '<': - return $value < $val; - - case '<=': - return $value <= $val; - - case '<>': - return $value != $val; - - case '=': - return $value == $val; - } - - return $value >= $val; - } - - private static function splitFormat($sections, $value) - { - // Extract the relevant section depending on whether number is positive, negative, or zero? - // Text not supported yet. - // Here is how the sections apply to various values in Excel: - // 1 section: [POSITIVE/NEGATIVE/ZERO/TEXT] - // 2 sections: [POSITIVE/ZERO/TEXT] [NEGATIVE] - // 3 sections: [POSITIVE/TEXT] [NEGATIVE] [ZERO] - // 4 sections: [POSITIVE] [NEGATIVE] [ZERO] [TEXT] - $cnt = count($sections); - $color_regex = '/\\[(' . implode('|', Color::NAMED_COLORS) . ')\\]/'; - $cond_regex = '/\\[(>|>=|<|<=|=|<>)([+-]?\\d+([.]\\d+)?)\\]/'; - $colors = ['', '', '', '', '']; - $condops = ['', '', '', '', '']; - $condvals = [0, 0, 0, 0, 0]; - for ($idx = 0; $idx < $cnt; ++$idx) { - if (preg_match($color_regex, $sections[$idx], $matches)) { - $colors[$idx] = $matches[0]; - $sections[$idx] = preg_replace($color_regex, '', $sections[$idx]); - } - if (preg_match($cond_regex, $sections[$idx], $matches)) { - $condops[$idx] = $matches[1]; - $condvals[$idx] = $matches[2]; - $sections[$idx] = preg_replace($cond_regex, '', $sections[$idx]); - } - } - $color = $colors[0]; - $format = $sections[0]; - $absval = $value; - switch ($cnt) { - case 2: - $absval = abs($value); - if (!self::splitFormatCompare($value, $condops[0], $condvals[0], '>=', 0)) { - $color = $colors[1]; - $format = $sections[1]; - } - - break; - case 3: - case 4: - $absval = abs($value); - if (!self::splitFormatCompare($value, $condops[0], $condvals[0], '>', 0)) { - if (self::splitFormatCompare($value, $condops[1], $condvals[1], '<', 0)) { - $color = $colors[1]; - $format = $sections[1]; - } else { - $color = $colors[2]; - $format = $sections[2]; - } - } - - break; - } - - return [$color, $format, $absval]; - } - - /** - * Convert a value in a pre-defined format to a PHP string. - * - * @param mixed $value Value to format - * @param string $format Format code, see = self::FORMAT_* - * @param array $callBack Callback function for additional formatting of string - * - * @return string Formatted string - */ - public static function toFormattedString($value, $format, $callBack = null) - { - // For now we do not treat strings although section 4 of a format code affects strings - if (!is_numeric($value)) { - return $value; - } - - // For 'General' format code, we just pass the value although this is not entirely the way Excel does it, - // it seems to round numbers to a total of 10 digits. - if (($format === self::FORMAT_GENERAL) || ($format === self::FORMAT_TEXT)) { - return $value; - } - - // Convert any other escaped characters to quoted strings, e.g. (\T to "T") - $format = preg_replace('/(\\\(((.)(?!((AM\/PM)|(A\/P))))|([^ ])))(?=(?:[^"]|"[^"]*")*$)/u', '"${2}"', $format); - - // Get the sections, there can be up to four sections, separated with a semi-colon (but only if not a quoted literal) - $sections = preg_split('/(;)(?=(?:[^"]|"[^"]*")*$)/u', $format); - - [$colors, $format, $value] = self::splitFormat($sections, $value); - - // In Excel formats, "_" is used to add spacing, - // The following character indicates the size of the spacing, which we can't do in HTML, so we just use a standard space - $format = preg_replace('/_./', ' ', $format); - - // Let's begin inspecting the format and converting the value to a formatted string - - // Check for date/time characters (not inside quotes) - if (preg_match('/(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy](?=(?:[^"]|"[^"]*")*$)/miu', $format, $matches)) { - // datetime format - self::formatAsDate($value, $format); - } else { - if (substr($format, 0, 1) === '"' && substr($format, -1, 1) === '"') { - $value = substr($format, 1, -1); - } elseif (preg_match('/%$/', $format)) { - // % number format - self::formatAsPercentage($value, $format); - } else { - $value = self::formatAsNumber($value, $format); - } - } - - // Additional formatting provided by callback function - if ($callBack !== null) { - [$writerInstance, $function] = $callBack; - $value = $writerInstance->$function($value, $colors); - } - - return $value; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Protection.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Protection.php deleted file mode 100644 index f695837..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Protection.php +++ /dev/null @@ -1,186 +0,0 @@ -locked = self::PROTECTION_INHERIT; - $this->hidden = self::PROTECTION_INHERIT; - } - } - - /** - * Get the shared style component for the currently active cell in currently active sheet. - * Only used for style supervisor. - * - * @return Protection - */ - public function getSharedComponent() - { - return $this->parent->getSharedComponent()->getProtection(); - } - - /** - * Build style array from subcomponents. - * - * @param array $array - * - * @return array - */ - public function getStyleArray($array) - { - return ['protection' => $array]; - } - - /** - * Apply styles from array. - * - * - * $spreadsheet->getActiveSheet()->getStyle('B2')->getLocked()->applyFromArray( - * [ - * 'locked' => TRUE, - * 'hidden' => FALSE - * ] - * ); - * - * - * @param array $pStyles Array containing style information - * - * @return $this - */ - public function applyFromArray(array $pStyles) - { - if ($this->isSupervisor) { - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); - } else { - if (isset($pStyles['locked'])) { - $this->setLocked($pStyles['locked']); - } - if (isset($pStyles['hidden'])) { - $this->setHidden($pStyles['hidden']); - } - } - - return $this; - } - - /** - * Get locked. - * - * @return string - */ - public function getLocked() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getLocked(); - } - - return $this->locked; - } - - /** - * Set locked. - * - * @param string $pValue see self::PROTECTION_* - * - * @return $this - */ - public function setLocked($pValue) - { - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['locked' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->locked = $pValue; - } - - return $this; - } - - /** - * Get hidden. - * - * @return string - */ - public function getHidden() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getHidden(); - } - - return $this->hidden; - } - - /** - * Set hidden. - * - * @param string $pValue see self::PROTECTION_* - * - * @return $this - */ - public function setHidden($pValue) - { - if ($this->isSupervisor) { - $styleArray = $this->getStyleArray(['hidden' => $pValue]); - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->hidden = $pValue; - } - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getHashCode(); - } - - return md5( - $this->locked . - $this->hidden . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php deleted file mode 100644 index 533a7c3..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php +++ /dev/null @@ -1,639 +0,0 @@ -conditionalStyles = []; - $this->font = new Font($isSupervisor, $isConditional); - $this->fill = new Fill($isSupervisor, $isConditional); - $this->borders = new Borders($isSupervisor, $isConditional); - $this->alignment = new Alignment($isSupervisor, $isConditional); - $this->numberFormat = new NumberFormat($isSupervisor, $isConditional); - $this->protection = new Protection($isSupervisor, $isConditional); - - // bind parent if we are a supervisor - if ($isSupervisor) { - $this->font->bindParent($this); - $this->fill->bindParent($this); - $this->borders->bindParent($this); - $this->alignment->bindParent($this); - $this->numberFormat->bindParent($this); - $this->protection->bindParent($this); - } - } - - /** - * Get the shared style component for the currently active cell in currently active sheet. - * Only used for style supervisor. - * - * @return Style - */ - public function getSharedComponent() - { - $activeSheet = $this->getActiveSheet(); - $selectedCell = $this->getActiveCell(); // e.g. 'A1' - - if ($activeSheet->cellExists($selectedCell)) { - $xfIndex = $activeSheet->getCell($selectedCell)->getXfIndex(); - } else { - $xfIndex = 0; - } - - return $this->parent->getCellXfByIndex($xfIndex); - } - - /** - * Get parent. Only used for style supervisor. - * - * @return Spreadsheet - */ - public function getParent() - { - return $this->parent; - } - - /** - * Build style array from subcomponents. - * - * @param array $array - * - * @return array - */ - public function getStyleArray($array) - { - return ['quotePrefix' => $array]; - } - - /** - * Apply styles from array. - * - * - * $spreadsheet->getActiveSheet()->getStyle('B2')->applyFromArray( - * [ - * 'font' => [ - * 'name' => 'Arial', - * 'bold' => true, - * 'italic' => false, - * 'underline' => Font::UNDERLINE_DOUBLE, - * 'strikethrough' => false, - * 'color' => [ - * 'rgb' => '808080' - * ] - * ], - * 'borders' => [ - * 'bottom' => [ - * 'borderStyle' => Border::BORDER_DASHDOT, - * 'color' => [ - * 'rgb' => '808080' - * ] - * ], - * 'top' => [ - * 'borderStyle' => Border::BORDER_DASHDOT, - * 'color' => [ - * 'rgb' => '808080' - * ] - * ] - * ], - * 'alignment' => [ - * 'horizontal' => Alignment::HORIZONTAL_CENTER, - * 'vertical' => Alignment::VERTICAL_CENTER, - * 'wrapText' => true, - * ], - * 'quotePrefix' => true - * ] - * ); - * - * - * @param array $pStyles Array containing style information - * @param bool $pAdvanced advanced mode for setting borders - * - * @return $this - */ - public function applyFromArray(array $pStyles, $pAdvanced = true) - { - if ($this->isSupervisor) { - $pRange = $this->getSelectedCells(); - - // Uppercase coordinate - $pRange = strtoupper($pRange); - - // Is it a cell range or a single cell? - if (strpos($pRange, ':') === false) { - $rangeA = $pRange; - $rangeB = $pRange; - } else { - [$rangeA, $rangeB] = explode(':', $pRange); - } - - // Calculate range outer borders - $rangeStart = Coordinate::coordinateFromString($rangeA); - $rangeEnd = Coordinate::coordinateFromString($rangeB); - - // Translate column into index - $rangeStart[0] = Coordinate::columnIndexFromString($rangeStart[0]); - $rangeEnd[0] = Coordinate::columnIndexFromString($rangeEnd[0]); - - // Make sure we can loop upwards on rows and columns - if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) { - $tmp = $rangeStart; - $rangeStart = $rangeEnd; - $rangeEnd = $tmp; - } - - // ADVANCED MODE: - if ($pAdvanced && isset($pStyles['borders'])) { - // 'allBorders' is a shorthand property for 'outline' and 'inside' and - // it applies to components that have not been set explicitly - if (isset($pStyles['borders']['allBorders'])) { - foreach (['outline', 'inside'] as $component) { - if (!isset($pStyles['borders'][$component])) { - $pStyles['borders'][$component] = $pStyles['borders']['allBorders']; - } - } - unset($pStyles['borders']['allBorders']); // not needed any more - } - // 'outline' is a shorthand property for 'top', 'right', 'bottom', 'left' - // it applies to components that have not been set explicitly - if (isset($pStyles['borders']['outline'])) { - foreach (['top', 'right', 'bottom', 'left'] as $component) { - if (!isset($pStyles['borders'][$component])) { - $pStyles['borders'][$component] = $pStyles['borders']['outline']; - } - } - unset($pStyles['borders']['outline']); // not needed any more - } - // 'inside' is a shorthand property for 'vertical' and 'horizontal' - // it applies to components that have not been set explicitly - if (isset($pStyles['borders']['inside'])) { - foreach (['vertical', 'horizontal'] as $component) { - if (!isset($pStyles['borders'][$component])) { - $pStyles['borders'][$component] = $pStyles['borders']['inside']; - } - } - unset($pStyles['borders']['inside']); // not needed any more - } - // width and height characteristics of selection, 1, 2, or 3 (for 3 or more) - $xMax = min($rangeEnd[0] - $rangeStart[0] + 1, 3); - $yMax = min($rangeEnd[1] - $rangeStart[1] + 1, 3); - - // loop through up to 3 x 3 = 9 regions - for ($x = 1; $x <= $xMax; ++$x) { - // start column index for region - $colStart = ($x == 3) ? - Coordinate::stringFromColumnIndex($rangeEnd[0]) - : Coordinate::stringFromColumnIndex($rangeStart[0] + $x - 1); - // end column index for region - $colEnd = ($x == 1) ? - Coordinate::stringFromColumnIndex($rangeStart[0]) - : Coordinate::stringFromColumnIndex($rangeEnd[0] - $xMax + $x); - - for ($y = 1; $y <= $yMax; ++$y) { - // which edges are touching the region - $edges = []; - if ($x == 1) { - // are we at left edge - $edges[] = 'left'; - } - if ($x == $xMax) { - // are we at right edge - $edges[] = 'right'; - } - if ($y == 1) { - // are we at top edge? - $edges[] = 'top'; - } - if ($y == $yMax) { - // are we at bottom edge? - $edges[] = 'bottom'; - } - - // start row index for region - $rowStart = ($y == 3) ? - $rangeEnd[1] : $rangeStart[1] + $y - 1; - - // end row index for region - $rowEnd = ($y == 1) ? - $rangeStart[1] : $rangeEnd[1] - $yMax + $y; - - // build range for region - $range = $colStart . $rowStart . ':' . $colEnd . $rowEnd; - - // retrieve relevant style array for region - $regionStyles = $pStyles; - unset($regionStyles['borders']['inside']); - - // what are the inner edges of the region when looking at the selection - $innerEdges = array_diff(['top', 'right', 'bottom', 'left'], $edges); - - // inner edges that are not touching the region should take the 'inside' border properties if they have been set - foreach ($innerEdges as $innerEdge) { - switch ($innerEdge) { - case 'top': - case 'bottom': - // should pick up 'horizontal' border property if set - if (isset($pStyles['borders']['horizontal'])) { - $regionStyles['borders'][$innerEdge] = $pStyles['borders']['horizontal']; - } else { - unset($regionStyles['borders'][$innerEdge]); - } - - break; - case 'left': - case 'right': - // should pick up 'vertical' border property if set - if (isset($pStyles['borders']['vertical'])) { - $regionStyles['borders'][$innerEdge] = $pStyles['borders']['vertical']; - } else { - unset($regionStyles['borders'][$innerEdge]); - } - - break; - } - } - - // apply region style to region by calling applyFromArray() in simple mode - $this->getActiveSheet()->getStyle($range)->applyFromArray($regionStyles, false); - } - } - - // restore initial cell selection range - $this->getActiveSheet()->getStyle($pRange); - - return $this; - } - - // SIMPLE MODE: - // Selection type, inspect - if (preg_match('/^[A-Z]+1:[A-Z]+1048576$/', $pRange)) { - $selectionType = 'COLUMN'; - } elseif (preg_match('/^A\d+:XFD\d+$/', $pRange)) { - $selectionType = 'ROW'; - } else { - $selectionType = 'CELL'; - } - - // First loop through columns, rows, or cells to find out which styles are affected by this operation - switch ($selectionType) { - case 'COLUMN': - $oldXfIndexes = []; - for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { - $oldXfIndexes[$this->getActiveSheet()->getColumnDimensionByColumn($col)->getXfIndex()] = true; - } - - break; - case 'ROW': - $oldXfIndexes = []; - for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { - if ($this->getActiveSheet()->getRowDimension($row)->getXfIndex() == null) { - $oldXfIndexes[0] = true; // row without explicit style should be formatted based on default style - } else { - $oldXfIndexes[$this->getActiveSheet()->getRowDimension($row)->getXfIndex()] = true; - } - } - - break; - case 'CELL': - $oldXfIndexes = []; - for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { - for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { - $oldXfIndexes[$this->getActiveSheet()->getCellByColumnAndRow($col, $row)->getXfIndex()] = true; - } - } - - break; - } - - // clone each of the affected styles, apply the style array, and add the new styles to the workbook - $workbook = $this->getActiveSheet()->getParent(); - foreach ($oldXfIndexes as $oldXfIndex => $dummy) { - $style = $workbook->getCellXfByIndex($oldXfIndex); - $newStyle = clone $style; - $newStyle->applyFromArray($pStyles); - - if ($existingStyle = $workbook->getCellXfByHashCode($newStyle->getHashCode())) { - // there is already such cell Xf in our collection - $newXfIndexes[$oldXfIndex] = $existingStyle->getIndex(); - } else { - // we don't have such a cell Xf, need to add - $workbook->addCellXf($newStyle); - $newXfIndexes[$oldXfIndex] = $newStyle->getIndex(); - } - } - - // Loop through columns, rows, or cells again and update the XF index - switch ($selectionType) { - case 'COLUMN': - for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { - $columnDimension = $this->getActiveSheet()->getColumnDimensionByColumn($col); - $oldXfIndex = $columnDimension->getXfIndex(); - $columnDimension->setXfIndex($newXfIndexes[$oldXfIndex]); - } - - break; - case 'ROW': - for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { - $rowDimension = $this->getActiveSheet()->getRowDimension($row); - $oldXfIndex = $rowDimension->getXfIndex() === null ? - 0 : $rowDimension->getXfIndex(); // row without explicit style should be formatted based on default style - $rowDimension->setXfIndex($newXfIndexes[$oldXfIndex]); - } - - break; - case 'CELL': - for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { - for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { - $cell = $this->getActiveSheet()->getCellByColumnAndRow($col, $row); - $oldXfIndex = $cell->getXfIndex(); - $cell->setXfIndex($newXfIndexes[$oldXfIndex]); - } - } - - break; - } - } else { - // not a supervisor, just apply the style array directly on style object - if (isset($pStyles['fill'])) { - $this->getFill()->applyFromArray($pStyles['fill']); - } - if (isset($pStyles['font'])) { - $this->getFont()->applyFromArray($pStyles['font']); - } - if (isset($pStyles['borders'])) { - $this->getBorders()->applyFromArray($pStyles['borders']); - } - if (isset($pStyles['alignment'])) { - $this->getAlignment()->applyFromArray($pStyles['alignment']); - } - if (isset($pStyles['numberFormat'])) { - $this->getNumberFormat()->applyFromArray($pStyles['numberFormat']); - } - if (isset($pStyles['protection'])) { - $this->getProtection()->applyFromArray($pStyles['protection']); - } - if (isset($pStyles['quotePrefix'])) { - $this->quotePrefix = $pStyles['quotePrefix']; - } - } - - return $this; - } - - /** - * Get Fill. - * - * @return Fill - */ - public function getFill() - { - return $this->fill; - } - - /** - * Get Font. - * - * @return Font - */ - public function getFont() - { - return $this->font; - } - - /** - * Set font. - * - * @return $this - */ - public function setFont(Font $font) - { - $this->font = $font; - - return $this; - } - - /** - * Get Borders. - * - * @return Borders - */ - public function getBorders() - { - return $this->borders; - } - - /** - * Get Alignment. - * - * @return Alignment - */ - public function getAlignment() - { - return $this->alignment; - } - - /** - * Get Number Format. - * - * @return NumberFormat - */ - public function getNumberFormat() - { - return $this->numberFormat; - } - - /** - * Get Conditional Styles. Only used on supervisor. - * - * @return Conditional[] - */ - public function getConditionalStyles() - { - return $this->getActiveSheet()->getConditionalStyles($this->getActiveCell()); - } - - /** - * Set Conditional Styles. Only used on supervisor. - * - * @param Conditional[] $pValue Array of conditional styles - * - * @return $this - */ - public function setConditionalStyles(array $pValue) - { - $this->getActiveSheet()->setConditionalStyles($this->getSelectedCells(), $pValue); - - return $this; - } - - /** - * Get Protection. - * - * @return Protection - */ - public function getProtection() - { - return $this->protection; - } - - /** - * Get quote prefix. - * - * @return bool - */ - public function getQuotePrefix() - { - if ($this->isSupervisor) { - return $this->getSharedComponent()->getQuotePrefix(); - } - - return $this->quotePrefix; - } - - /** - * Set quote prefix. - * - * @param bool $pValue - * - * @return $this - */ - public function setQuotePrefix($pValue) - { - if ($pValue == '') { - $pValue = false; - } - if ($this->isSupervisor) { - $styleArray = ['quotePrefix' => $pValue]; - $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); - } else { - $this->quotePrefix = (bool) $pValue; - } - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - $hashConditionals = ''; - foreach ($this->conditionalStyles as $conditional) { - $hashConditionals .= $conditional->getHashCode(); - } - - return md5( - $this->fill->getHashCode() . - $this->font->getHashCode() . - $this->borders->getHashCode() . - $this->alignment->getHashCode() . - $this->numberFormat->getHashCode() . - $hashConditionals . - $this->protection->getHashCode() . - ($this->quotePrefix ? 't' : 'f') . - __CLASS__ - ); - } - - /** - * Get own index in style collection. - * - * @return int - */ - public function getIndex() - { - return $this->index; - } - - /** - * Set own index in style collection. - * - * @param int $pValue - */ - public function setIndex($pValue): void - { - $this->index = $pValue; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Supervisor.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Supervisor.php deleted file mode 100644 index 1a70097..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Supervisor.php +++ /dev/null @@ -1,117 +0,0 @@ -isSupervisor = $isSupervisor; - } - - /** - * Bind parent. Only used for supervisor. - * - * @param Spreadsheet|Style $parent - * @param null|string $parentPropertyName - * - * @return $this - */ - public function bindParent($parent, $parentPropertyName = null) - { - $this->parent = $parent; - $this->parentPropertyName = $parentPropertyName; - - return $this; - } - - /** - * Is this a supervisor or a cell style component? - * - * @return bool - */ - public function getIsSupervisor() - { - return $this->isSupervisor; - } - - /** - * Get the currently active sheet. Only used for supervisor. - * - * @return Worksheet - */ - public function getActiveSheet() - { - return $this->parent->getActiveSheet(); - } - - /** - * Get the currently active cell coordinate in currently active sheet. - * Only used for supervisor. - * - * @return string E.g. 'A1' - */ - public function getSelectedCells() - { - return $this->getActiveSheet()->getSelectedCells(); - } - - /** - * Get the currently active cell coordinate in currently active sheet. - * Only used for supervisor. - * - * @return string E.g. 'A1' - */ - public function getActiveCell() - { - return $this->getActiveSheet()->getActiveCell(); - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if ((is_object($value)) && ($key != 'parent')) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter.php deleted file mode 100644 index c2ded19..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter.php +++ /dev/null @@ -1,871 +0,0 @@ -range = $pRange; - $this->workSheet = $pSheet; - } - - /** - * Get AutoFilter Parent Worksheet. - * - * @return Worksheet - */ - public function getParent() - { - return $this->workSheet; - } - - /** - * Set AutoFilter Parent Worksheet. - * - * @param Worksheet $pSheet - * - * @return $this - */ - public function setParent(?Worksheet $pSheet = null) - { - $this->workSheet = $pSheet; - - return $this; - } - - /** - * Get AutoFilter Range. - * - * @return string - */ - public function getRange() - { - return $this->range; - } - - /** - * Set AutoFilter Range. - * - * @param string $pRange Cell range (i.e. A1:E10) - * - * @return $this - */ - public function setRange($pRange) - { - // extract coordinate - [$worksheet, $pRange] = Worksheet::extractSheetTitle($pRange, true); - - if (strpos($pRange, ':') !== false) { - $this->range = $pRange; - } elseif (empty($pRange)) { - $this->range = ''; - } else { - throw new PhpSpreadsheetException('Autofilter must be set on a range of cells.'); - } - - if (empty($pRange)) { - // Discard all column rules - $this->columns = []; - } else { - // Discard any column rules that are no longer valid within this range - [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($this->range); - foreach ($this->columns as $key => $value) { - $colIndex = Coordinate::columnIndexFromString($key); - if (($rangeStart[0] > $colIndex) || ($rangeEnd[0] < $colIndex)) { - unset($this->columns[$key]); - } - } - } - - return $this; - } - - /** - * Get all AutoFilter Columns. - * - * @return AutoFilter\Column[] - */ - public function getColumns() - { - return $this->columns; - } - - /** - * Validate that the specified column is in the AutoFilter range. - * - * @param string $column Column name (e.g. A) - * - * @return int The column offset within the autofilter range - */ - public function testColumnInRange($column) - { - if (empty($this->range)) { - throw new PhpSpreadsheetException('No autofilter range is defined.'); - } - - $columnIndex = Coordinate::columnIndexFromString($column); - [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($this->range); - if (($rangeStart[0] > $columnIndex) || ($rangeEnd[0] < $columnIndex)) { - throw new PhpSpreadsheetException('Column is outside of current autofilter range.'); - } - - return $columnIndex - $rangeStart[0]; - } - - /** - * Get a specified AutoFilter Column Offset within the defined AutoFilter range. - * - * @param string $pColumn Column name (e.g. A) - * - * @return int The offset of the specified column within the autofilter range - */ - public function getColumnOffset($pColumn) - { - return $this->testColumnInRange($pColumn); - } - - /** - * Get a specified AutoFilter Column. - * - * @param string $pColumn Column name (e.g. A) - * - * @return AutoFilter\Column - */ - public function getColumn($pColumn) - { - $this->testColumnInRange($pColumn); - - if (!isset($this->columns[$pColumn])) { - $this->columns[$pColumn] = new AutoFilter\Column($pColumn, $this); - } - - return $this->columns[$pColumn]; - } - - /** - * Get a specified AutoFilter Column by it's offset. - * - * @param int $pColumnOffset Column offset within range (starting from 0) - * - * @return AutoFilter\Column - */ - public function getColumnByOffset($pColumnOffset) - { - [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($this->range); - $pColumn = Coordinate::stringFromColumnIndex($rangeStart[0] + $pColumnOffset); - - return $this->getColumn($pColumn); - } - - /** - * Set AutoFilter. - * - * @param AutoFilter\Column|string $pColumn - * A simple string containing a Column ID like 'A' is permitted - * - * @return $this - */ - public function setColumn($pColumn) - { - if ((is_string($pColumn)) && (!empty($pColumn))) { - $column = $pColumn; - } elseif (is_object($pColumn) && ($pColumn instanceof AutoFilter\Column)) { - $column = $pColumn->getColumnIndex(); - } else { - throw new PhpSpreadsheetException('Column is not within the autofilter range.'); - } - $this->testColumnInRange($column); - - if (is_string($pColumn)) { - $this->columns[$pColumn] = new AutoFilter\Column($pColumn, $this); - } elseif (is_object($pColumn) && ($pColumn instanceof AutoFilter\Column)) { - $pColumn->setParent($this); - $this->columns[$column] = $pColumn; - } - ksort($this->columns); - - return $this; - } - - /** - * Clear a specified AutoFilter Column. - * - * @param string $pColumn Column name (e.g. A) - * - * @return $this - */ - public function clearColumn($pColumn) - { - $this->testColumnInRange($pColumn); - - if (isset($this->columns[$pColumn])) { - unset($this->columns[$pColumn]); - } - - return $this; - } - - /** - * Shift an AutoFilter Column Rule to a different column. - * - * Note: This method bypasses validation of the destination column to ensure it is within this AutoFilter range. - * Nor does it verify whether any column rule already exists at $toColumn, but will simply override any existing value. - * Use with caution. - * - * @param string $fromColumn Column name (e.g. A) - * @param string $toColumn Column name (e.g. B) - * - * @return $this - */ - public function shiftColumn($fromColumn, $toColumn) - { - $fromColumn = strtoupper($fromColumn); - $toColumn = strtoupper($toColumn); - - if (($fromColumn !== null) && (isset($this->columns[$fromColumn])) && ($toColumn !== null)) { - $this->columns[$fromColumn]->setParent(); - $this->columns[$fromColumn]->setColumnIndex($toColumn); - $this->columns[$toColumn] = $this->columns[$fromColumn]; - $this->columns[$toColumn]->setParent($this); - unset($this->columns[$fromColumn]); - - ksort($this->columns); - } - - return $this; - } - - /** - * Test if cell value is in the defined set of values. - * - * @param mixed $cellValue - * @param mixed[] $dataSet - * - * @return bool - */ - private static function filterTestInSimpleDataSet($cellValue, $dataSet) - { - $dataSetValues = $dataSet['filterValues']; - $blanks = $dataSet['blanks']; - if (($cellValue == '') || ($cellValue === null)) { - return $blanks; - } - - return in_array($cellValue, $dataSetValues); - } - - /** - * Test if cell value is in the defined set of Excel date values. - * - * @param mixed $cellValue - * @param mixed[] $dataSet - * - * @return bool - */ - private static function filterTestInDateGroupSet($cellValue, $dataSet) - { - $dateSet = $dataSet['filterValues']; - $blanks = $dataSet['blanks']; - if (($cellValue == '') || ($cellValue === null)) { - return $blanks; - } - - if (is_numeric($cellValue)) { - $dateValue = Date::excelToTimestamp($cellValue); - if ($cellValue < 1) { - // Just the time part - $dtVal = date('His', $dateValue); - $dateSet = $dateSet['time']; - } elseif ($cellValue == floor($cellValue)) { - // Just the date part - $dtVal = date('Ymd', $dateValue); - $dateSet = $dateSet['date']; - } else { - // date and time parts - $dtVal = date('YmdHis', $dateValue); - $dateSet = $dateSet['dateTime']; - } - foreach ($dateSet as $dateValue) { - // Use of substr to extract value at the appropriate group level - if (substr($dtVal, 0, strlen($dateValue)) == $dateValue) { - return true; - } - } - } - - return false; - } - - /** - * Test if cell value is within a set of values defined by a ruleset. - * - * @param mixed $cellValue - * @param mixed[] $ruleSet - * - * @return bool - */ - private static function filterTestInCustomDataSet($cellValue, $ruleSet) - { - $dataSet = $ruleSet['filterRules']; - $join = $ruleSet['join']; - $customRuleForBlanks = $ruleSet['customRuleForBlanks'] ?? false; - - if (!$customRuleForBlanks) { - // Blank cells are always ignored, so return a FALSE - if (($cellValue == '') || ($cellValue === null)) { - return false; - } - } - $returnVal = ($join == AutoFilter\Column::AUTOFILTER_COLUMN_JOIN_AND); - foreach ($dataSet as $rule) { - $retVal = false; - - if (is_numeric($rule['value'])) { - // Numeric values are tested using the appropriate operator - switch ($rule['operator']) { - case AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL: - $retVal = ($cellValue == $rule['value']); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_NOTEQUAL: - $retVal = ($cellValue != $rule['value']); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN: - $retVal = ($cellValue > $rule['value']); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL: - $retVal = ($cellValue >= $rule['value']); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN: - $retVal = ($cellValue < $rule['value']); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL: - $retVal = ($cellValue <= $rule['value']); - - break; - } - } elseif ($rule['value'] == '') { - switch ($rule['operator']) { - case AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL: - $retVal = (($cellValue == '') || ($cellValue === null)); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_NOTEQUAL: - $retVal = (($cellValue != '') && ($cellValue !== null)); - - break; - default: - $retVal = true; - - break; - } - } else { - // String values are always tested for equality, factoring in for wildcards (hence a regexp test) - $retVal = preg_match('/^' . $rule['value'] . '$/i', $cellValue); - } - // If there are multiple conditions, then we need to test both using the appropriate join operator - switch ($join) { - case AutoFilter\Column::AUTOFILTER_COLUMN_JOIN_OR: - $returnVal = $returnVal || $retVal; - // Break as soon as we have a TRUE match for OR joins, - // to avoid unnecessary additional code execution - if ($returnVal) { - return $returnVal; - } - - break; - case AutoFilter\Column::AUTOFILTER_COLUMN_JOIN_AND: - $returnVal = $returnVal && $retVal; - - break; - } - } - - return $returnVal; - } - - /** - * Test if cell date value is matches a set of values defined by a set of months. - * - * @param mixed $cellValue - * @param mixed[] $monthSet - * - * @return bool - */ - private static function filterTestInPeriodDateSet($cellValue, $monthSet) - { - // Blank cells are always ignored, so return a FALSE - if (($cellValue == '') || ($cellValue === null)) { - return false; - } - - if (is_numeric($cellValue)) { - $dateValue = date('m', Date::excelToTimestamp($cellValue)); - if (in_array($dateValue, $monthSet)) { - return true; - } - } - - return false; - } - - /** - * Search/Replace arrays to convert Excel wildcard syntax to a regexp syntax for preg_matching. - * - * @var array - */ - private static $fromReplace = ['\*', '\?', '~~', '~.*', '~.?']; - - private static $toReplace = ['.*', '.', '~', '\*', '\?']; - - /** - * Convert a dynamic rule daterange to a custom filter range expression for ease of calculation. - * - * @param string $dynamicRuleType - * @param AutoFilter\Column $filterColumn - * - * @return mixed[] - */ - private function dynamicFilterDateRange($dynamicRuleType, &$filterColumn) - { - $rDateType = Functions::getReturnDateType(); - Functions::setReturnDateType(Functions::RETURNDATE_PHP_NUMERIC); - $val = $maxVal = null; - - $ruleValues = []; - $baseDate = DateTime::DATENOW(); - // Calculate start/end dates for the required date range based on current date - switch ($dynamicRuleType) { - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK: - $baseDate = strtotime('-7 days', $baseDate); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK: - $baseDate = strtotime('-7 days', $baseDate); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH: - $baseDate = strtotime('-1 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH: - $baseDate = strtotime('+1 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER: - $baseDate = strtotime('-3 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER: - $baseDate = strtotime('+3 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR: - $baseDate = strtotime('-1 year', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR: - $baseDate = strtotime('+1 year', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); - - break; - } - - switch ($dynamicRuleType) { - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_TODAY: - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY: - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW: - $maxVal = (int) Date::PHPtoExcel(strtotime('+1 day', $baseDate)); - $val = (int) Date::PHPToExcel($baseDate); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE: - $maxVal = (int) Date::PHPtoExcel(strtotime('+1 day', $baseDate)); - $val = (int) Date::PHPToExcel(gmmktime(0, 0, 0, 1, 1, date('Y', $baseDate))); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR: - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR: - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR: - $maxVal = (int) Date::PHPToExcel(gmmktime(0, 0, 0, 31, 12, date('Y', $baseDate))); - ++$maxVal; - $val = (int) Date::PHPToExcel(gmmktime(0, 0, 0, 1, 1, date('Y', $baseDate))); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER: - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER: - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER: - $thisMonth = date('m', $baseDate); - $thisQuarter = floor(--$thisMonth / 3); - $maxVal = (int) Date::PHPtoExcel(gmmktime(0, 0, 0, date('t', $baseDate), (1 + $thisQuarter) * 3, date('Y', $baseDate))); - ++$maxVal; - $val = (int) Date::PHPToExcel(gmmktime(0, 0, 0, 1, 1 + $thisQuarter * 3, date('Y', $baseDate))); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH: - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH: - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH: - $maxVal = (int) Date::PHPtoExcel(gmmktime(0, 0, 0, date('t', $baseDate), date('m', $baseDate), date('Y', $baseDate))); - ++$maxVal; - $val = (int) Date::PHPToExcel(gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK: - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK: - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK: - $dayOfWeek = date('w', $baseDate); - $val = (int) Date::PHPToExcel($baseDate) - $dayOfWeek; - $maxVal = $val + 7; - - break; - } - - switch ($dynamicRuleType) { - // Adjust Today dates for Yesterday and Tomorrow - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY: - --$maxVal; - --$val; - - break; - case AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW: - ++$maxVal; - ++$val; - - break; - } - - // Set the filter column rule attributes ready for writing - $filterColumn->setAttributes(['val' => $val, 'maxVal' => $maxVal]); - - // Set the rules for identifying rows for hide/show - $ruleValues[] = ['operator' => AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL, 'value' => $val]; - $ruleValues[] = ['operator' => AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN, 'value' => $maxVal]; - Functions::setReturnDateType($rDateType); - - return ['method' => 'filterTestInCustomDataSet', 'arguments' => ['filterRules' => $ruleValues, 'join' => AutoFilter\Column::AUTOFILTER_COLUMN_JOIN_AND]]; - } - - private function calculateTopTenValue($columnID, $startRow, $endRow, $ruleType, $ruleValue) - { - $range = $columnID . $startRow . ':' . $columnID . $endRow; - $dataValues = Functions::flattenArray($this->workSheet->rangeToArray($range, null, true, false)); - - $dataValues = array_filter($dataValues); - if ($ruleType == AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) { - rsort($dataValues); - } else { - sort($dataValues); - } - - return array_pop(array_slice($dataValues, 0, $ruleValue)); - } - - /** - * Apply the AutoFilter rules to the AutoFilter Range. - * - * @return $this - */ - public function showHideRows() - { - [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($this->range); - - // The heading row should always be visible - $this->workSheet->getRowDimension($rangeStart[1])->setVisible(true); - - $columnFilterTests = []; - foreach ($this->columns as $columnID => $filterColumn) { - $rules = $filterColumn->getRules(); - switch ($filterColumn->getFilterType()) { - case AutoFilter\Column::AUTOFILTER_FILTERTYPE_FILTER: - $ruleType = null; - $ruleValues = []; - // Build a list of the filter value selections - foreach ($rules as $rule) { - $ruleType = $rule->getRuleType(); - $ruleValues[] = $rule->getValue(); - } - // Test if we want to include blanks in our filter criteria - $blanks = false; - $ruleDataSet = array_filter($ruleValues); - if (count($ruleValues) != count($ruleDataSet)) { - $blanks = true; - } - if ($ruleType == AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_FILTER) { - // Filter on absolute values - $columnFilterTests[$columnID] = [ - 'method' => 'filterTestInSimpleDataSet', - 'arguments' => ['filterValues' => $ruleDataSet, 'blanks' => $blanks], - ]; - } else { - // Filter on date group values - $arguments = [ - 'date' => [], - 'time' => [], - 'dateTime' => [], - ]; - foreach ($ruleDataSet as $ruleValue) { - $date = $time = ''; - if ( - (isset($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR])) && - ($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR] !== '') - ) { - $date .= sprintf('%04d', $ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR]); - } - if ( - (isset($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH])) && - ($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH] != '') - ) { - $date .= sprintf('%02d', $ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH]); - } - if ( - (isset($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY])) && - ($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY] !== '') - ) { - $date .= sprintf('%02d', $ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY]); - } - if ( - (isset($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR])) && - ($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR] !== '') - ) { - $time .= sprintf('%02d', $ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR]); - } - if ( - (isset($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE])) && - ($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE] !== '') - ) { - $time .= sprintf('%02d', $ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE]); - } - if ( - (isset($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND])) && - ($ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND] !== '') - ) { - $time .= sprintf('%02d', $ruleValue[AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND]); - } - $dateTime = $date . $time; - $arguments['date'][] = $date; - $arguments['time'][] = $time; - $arguments['dateTime'][] = $dateTime; - } - // Remove empty elements - $arguments['date'] = array_filter($arguments['date']); - $arguments['time'] = array_filter($arguments['time']); - $arguments['dateTime'] = array_filter($arguments['dateTime']); - $columnFilterTests[$columnID] = [ - 'method' => 'filterTestInDateGroupSet', - 'arguments' => ['filterValues' => $arguments, 'blanks' => $blanks], - ]; - } - - break; - case AutoFilter\Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER: - $customRuleForBlanks = false; - $ruleValues = []; - // Build a list of the filter value selections - foreach ($rules as $rule) { - $ruleValue = $rule->getValue(); - if (!is_numeric($ruleValue)) { - // Convert to a regexp allowing for regexp reserved characters, wildcards and escaped wildcards - $ruleValue = preg_quote($ruleValue); - $ruleValue = str_replace(self::$fromReplace, self::$toReplace, $ruleValue); - if (trim($ruleValue) == '') { - $customRuleForBlanks = true; - $ruleValue = trim($ruleValue); - } - } - $ruleValues[] = ['operator' => $rule->getOperator(), 'value' => $ruleValue]; - } - $join = $filterColumn->getJoin(); - $columnFilterTests[$columnID] = [ - 'method' => 'filterTestInCustomDataSet', - 'arguments' => ['filterRules' => $ruleValues, 'join' => $join, 'customRuleForBlanks' => $customRuleForBlanks], - ]; - - break; - case AutoFilter\Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER: - $ruleValues = []; - foreach ($rules as $rule) { - // We should only ever have one Dynamic Filter Rule anyway - $dynamicRuleType = $rule->getGrouping(); - if ( - ($dynamicRuleType == AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE) || - ($dynamicRuleType == AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE) - ) { - // Number (Average) based - // Calculate the average - $averageFormula = '=AVERAGE(' . $columnID . ($rangeStart[1] + 1) . ':' . $columnID . $rangeEnd[1] . ')'; - $average = Calculation::getInstance()->calculateFormula($averageFormula, null, $this->workSheet->getCell('A1')); - // Set above/below rule based on greaterThan or LessTan - $operator = ($dynamicRuleType === AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE) - ? AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN - : AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN; - $ruleValues[] = [ - 'operator' => $operator, - 'value' => $average, - ]; - $columnFilterTests[$columnID] = [ - 'method' => 'filterTestInCustomDataSet', - 'arguments' => ['filterRules' => $ruleValues, 'join' => AutoFilter\Column::AUTOFILTER_COLUMN_JOIN_OR], - ]; - } else { - // Date based - if ($dynamicRuleType[0] == 'M' || $dynamicRuleType[0] == 'Q') { - $periodType = ''; - $period = 0; - // Month or Quarter - sscanf($dynamicRuleType, '%[A-Z]%d', $periodType, $period); - if ($periodType == 'M') { - $ruleValues = [$period]; - } else { - --$period; - $periodEnd = (1 + $period) * 3; - $periodStart = 1 + $period * 3; - $ruleValues = range($periodStart, $periodEnd); - } - $columnFilterTests[$columnID] = [ - 'method' => 'filterTestInPeriodDateSet', - 'arguments' => $ruleValues, - ]; - $filterColumn->setAttributes([]); - } else { - // Date Range - $columnFilterTests[$columnID] = $this->dynamicFilterDateRange($dynamicRuleType, $filterColumn); - - break; - } - } - } - - break; - case AutoFilter\Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER: - $ruleValues = []; - $dataRowCount = $rangeEnd[1] - $rangeStart[1]; - foreach ($rules as $rule) { - // We should only ever have one Dynamic Filter Rule anyway - $toptenRuleType = $rule->getGrouping(); - $ruleValue = $rule->getValue(); - $ruleOperator = $rule->getOperator(); - } - if ($ruleOperator === AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) { - $ruleValue = floor($ruleValue * ($dataRowCount / 100)); - } - if ($ruleValue < 1) { - $ruleValue = 1; - } - if ($ruleValue > 500) { - $ruleValue = 500; - } - - $maxVal = $this->calculateTopTenValue($columnID, $rangeStart[1] + 1, $rangeEnd[1], $toptenRuleType, $ruleValue); - - $operator = ($toptenRuleType == AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) - ? AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL - : AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL; - $ruleValues[] = ['operator' => $operator, 'value' => $maxVal]; - $columnFilterTests[$columnID] = [ - 'method' => 'filterTestInCustomDataSet', - 'arguments' => ['filterRules' => $ruleValues, 'join' => AutoFilter\Column::AUTOFILTER_COLUMN_JOIN_OR], - ]; - $filterColumn->setAttributes(['maxVal' => $maxVal]); - - break; - } - } - - // Execute the column tests for each row in the autoFilter range to determine show/hide, - for ($row = $rangeStart[1] + 1; $row <= $rangeEnd[1]; ++$row) { - $result = true; - foreach ($columnFilterTests as $columnID => $columnFilterTest) { - $cellValue = $this->workSheet->getCell($columnID . $row)->getCalculatedValue(); - // Execute the filter test - $result = $result && - call_user_func_array( - [self::class, $columnFilterTest['method']], - [$cellValue, $columnFilterTest['arguments']] - ); - // If filter test has resulted in FALSE, exit the loop straightaway rather than running any more tests - if (!$result) { - break; - } - } - // Set show/hide for the row based on the result of the autoFilter result - $this->workSheet->getRowDimension($row)->setVisible($result); - } - - return $this; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - if ($key === 'workSheet') { - // Detach from worksheet - $this->{$key} = null; - } else { - $this->{$key} = clone $value; - } - } elseif ((is_array($value)) && ($key == 'columns')) { - // The columns array of \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet\AutoFilter objects - $this->{$key} = []; - foreach ($value as $k => $v) { - $this->{$key}[$k] = clone $v; - // attach the new cloned Column to this new cloned Autofilter object - $this->{$key}[$k]->setParent($this); - } - } else { - $this->{$key} = $value; - } - } - } - - /** - * toString method replicates previous behavior by returning the range if object is - * referenced as a property of its parent. - */ - public function __toString() - { - return (string) $this->range; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php deleted file mode 100644 index 09584a7..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php +++ /dev/null @@ -1,380 +0,0 @@ -columnIndex = $pColumn; - $this->parent = $pParent; - } - - /** - * Get AutoFilter column index as string eg: 'A'. - * - * @return string - */ - public function getColumnIndex() - { - return $this->columnIndex; - } - - /** - * Set AutoFilter column index as string eg: 'A'. - * - * @param string $pColumn Column (e.g. A) - * - * @return $this - */ - public function setColumnIndex($pColumn) - { - // Uppercase coordinate - $pColumn = strtoupper($pColumn); - if ($this->parent !== null) { - $this->parent->testColumnInRange($pColumn); - } - - $this->columnIndex = $pColumn; - - return $this; - } - - /** - * Get this Column's AutoFilter Parent. - * - * @return AutoFilter - */ - public function getParent() - { - return $this->parent; - } - - /** - * Set this Column's AutoFilter Parent. - * - * @param AutoFilter $pParent - * - * @return $this - */ - public function setParent(?AutoFilter $pParent = null) - { - $this->parent = $pParent; - - return $this; - } - - /** - * Get AutoFilter Type. - * - * @return string - */ - public function getFilterType() - { - return $this->filterType; - } - - /** - * Set AutoFilter Type. - * - * @param string $pFilterType - * - * @return $this - */ - public function setFilterType($pFilterType) - { - if (!in_array($pFilterType, self::$filterTypes)) { - throw new PhpSpreadsheetException('Invalid filter type for column AutoFilter.'); - } - - $this->filterType = $pFilterType; - - return $this; - } - - /** - * Get AutoFilter Multiple Rules And/Or Join. - * - * @return string - */ - public function getJoin() - { - return $this->join; - } - - /** - * Set AutoFilter Multiple Rules And/Or. - * - * @param string $pJoin And/Or - * - * @return $this - */ - public function setJoin($pJoin) - { - // Lowercase And/Or - $pJoin = strtolower($pJoin); - if (!in_array($pJoin, self::$ruleJoins)) { - throw new PhpSpreadsheetException('Invalid rule connection for column AutoFilter.'); - } - - $this->join = $pJoin; - - return $this; - } - - /** - * Set AutoFilter Attributes. - * - * @param string[] $attributes - * - * @return $this - */ - public function setAttributes(array $attributes) - { - $this->attributes = $attributes; - - return $this; - } - - /** - * Set An AutoFilter Attribute. - * - * @param string $pName Attribute Name - * @param string $pValue Attribute Value - * - * @return $this - */ - public function setAttribute($pName, $pValue) - { - $this->attributes[$pName] = $pValue; - - return $this; - } - - /** - * Get AutoFilter Column Attributes. - * - * @return string[] - */ - public function getAttributes() - { - return $this->attributes; - } - - /** - * Get specific AutoFilter Column Attribute. - * - * @param string $pName Attribute Name - * - * @return string - */ - public function getAttribute($pName) - { - if (isset($this->attributes[$pName])) { - return $this->attributes[$pName]; - } - - return null; - } - - /** - * Get all AutoFilter Column Rules. - * - * @return Column\Rule[] - */ - public function getRules() - { - return $this->ruleset; - } - - /** - * Get a specified AutoFilter Column Rule. - * - * @param int $pIndex Rule index in the ruleset array - * - * @return Column\Rule - */ - public function getRule($pIndex) - { - if (!isset($this->ruleset[$pIndex])) { - $this->ruleset[$pIndex] = new Column\Rule($this); - } - - return $this->ruleset[$pIndex]; - } - - /** - * Create a new AutoFilter Column Rule in the ruleset. - * - * @return Column\Rule - */ - public function createRule() - { - $this->ruleset[] = new Column\Rule($this); - - return end($this->ruleset); - } - - /** - * Add a new AutoFilter Column Rule to the ruleset. - * - * @return $this - */ - public function addRule(Column\Rule $pRule) - { - $pRule->setParent($this); - $this->ruleset[] = $pRule; - - return $this; - } - - /** - * Delete a specified AutoFilter Column Rule - * If the number of rules is reduced to 1, then we reset And/Or logic to Or. - * - * @param int $pIndex Rule index in the ruleset array - * - * @return $this - */ - public function deleteRule($pIndex) - { - if (isset($this->ruleset[$pIndex])) { - unset($this->ruleset[$pIndex]); - // If we've just deleted down to a single rule, then reset And/Or joining to Or - if (count($this->ruleset) <= 1) { - $this->setJoin(self::AUTOFILTER_COLUMN_JOIN_OR); - } - } - - return $this; - } - - /** - * Delete all AutoFilter Column Rules. - * - * @return $this - */ - public function clearRules() - { - $this->ruleset = []; - $this->setJoin(self::AUTOFILTER_COLUMN_JOIN_OR); - - return $this; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if ($key === 'parent') { - // Detach from autofilter parent - $this->parent = null; - } elseif ($key === 'ruleset') { - // The columns array of \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet\AutoFilter objects - $this->ruleset = []; - foreach ($value as $k => $v) { - $cloned = clone $v; - $cloned->setParent($this); // attach the new cloned Rule to this new cloned Autofilter Cloned object - $this->ruleset[$k] = $cloned; - } - } elseif (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php deleted file mode 100644 index 1aacb0c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php +++ /dev/null @@ -1,449 +0,0 @@ - - * - * - * - * - * - */ - const AUTOFILTER_COLUMN_RULE_EQUAL = 'equal'; - const AUTOFILTER_COLUMN_RULE_NOTEQUAL = 'notEqual'; - const AUTOFILTER_COLUMN_RULE_GREATERTHAN = 'greaterThan'; - const AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL = 'greaterThanOrEqual'; - const AUTOFILTER_COLUMN_RULE_LESSTHAN = 'lessThan'; - const AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL = 'lessThanOrEqual'; - - private static $operators = [ - self::AUTOFILTER_COLUMN_RULE_EQUAL, - self::AUTOFILTER_COLUMN_RULE_NOTEQUAL, - self::AUTOFILTER_COLUMN_RULE_GREATERTHAN, - self::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL, - self::AUTOFILTER_COLUMN_RULE_LESSTHAN, - self::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL, - ]; - - const AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE = 'byValue'; - const AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT = 'byPercent'; - - private static $topTenValue = [ - self::AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE, - self::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT, - ]; - - const AUTOFILTER_COLUMN_RULE_TOPTEN_TOP = 'top'; - const AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM = 'bottom'; - - private static $topTenType = [ - self::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP, - self::AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM, - ]; - - // Rule Operators (Numeric, Boolean etc) -// const AUTOFILTER_COLUMN_RULE_BETWEEN = 'between'; // greaterThanOrEqual 1 && lessThanOrEqual 2 - // Rule Operators (Numeric Special) which are translated to standard numeric operators with calculated values -// const AUTOFILTER_COLUMN_RULE_TOPTEN = 'topTen'; // greaterThan calculated value -// const AUTOFILTER_COLUMN_RULE_TOPTENPERCENT = 'topTenPercent'; // greaterThan calculated value -// const AUTOFILTER_COLUMN_RULE_ABOVEAVERAGE = 'aboveAverage'; // Value is calculated as the average -// const AUTOFILTER_COLUMN_RULE_BELOWAVERAGE = 'belowAverage'; // Value is calculated as the average - // Rule Operators (String) which are set as wild-carded values -// const AUTOFILTER_COLUMN_RULE_BEGINSWITH = 'beginsWith'; // A* -// const AUTOFILTER_COLUMN_RULE_ENDSWITH = 'endsWith'; // *Z -// const AUTOFILTER_COLUMN_RULE_CONTAINS = 'contains'; // *B* -// const AUTOFILTER_COLUMN_RULE_DOESNTCONTAIN = 'notEqual'; // notEqual *B* - // Rule Operators (Date Special) which are translated to standard numeric operators with calculated values -// const AUTOFILTER_COLUMN_RULE_BEFORE = 'lessThan'; -// const AUTOFILTER_COLUMN_RULE_AFTER = 'greaterThan'; -// const AUTOFILTER_COLUMN_RULE_YESTERDAY = 'yesterday'; -// const AUTOFILTER_COLUMN_RULE_TODAY = 'today'; -// const AUTOFILTER_COLUMN_RULE_TOMORROW = 'tomorrow'; -// const AUTOFILTER_COLUMN_RULE_LASTWEEK = 'lastWeek'; -// const AUTOFILTER_COLUMN_RULE_THISWEEK = 'thisWeek'; -// const AUTOFILTER_COLUMN_RULE_NEXTWEEK = 'nextWeek'; -// const AUTOFILTER_COLUMN_RULE_LASTMONTH = 'lastMonth'; -// const AUTOFILTER_COLUMN_RULE_THISMONTH = 'thisMonth'; -// const AUTOFILTER_COLUMN_RULE_NEXTMONTH = 'nextMonth'; -// const AUTOFILTER_COLUMN_RULE_LASTQUARTER = 'lastQuarter'; -// const AUTOFILTER_COLUMN_RULE_THISQUARTER = 'thisQuarter'; -// const AUTOFILTER_COLUMN_RULE_NEXTQUARTER = 'nextQuarter'; -// const AUTOFILTER_COLUMN_RULE_LASTYEAR = 'lastYear'; -// const AUTOFILTER_COLUMN_RULE_THISYEAR = 'thisYear'; -// const AUTOFILTER_COLUMN_RULE_NEXTYEAR = 'nextYear'; -// const AUTOFILTER_COLUMN_RULE_YEARTODATE = 'yearToDate'; // -// const AUTOFILTER_COLUMN_RULE_ALLDATESINMONTH = 'allDatesInMonth'; // for Month/February -// const AUTOFILTER_COLUMN_RULE_ALLDATESINQUARTER = 'allDatesInQuarter'; // for Quarter 2 - - /** - * Autofilter Column. - * - * @var Column - */ - private $parent; - - /** - * Autofilter Rule Type. - * - * @var string - */ - private $ruleType = self::AUTOFILTER_RULETYPE_FILTER; - - /** - * Autofilter Rule Value. - * - * @var string - */ - private $value = ''; - - /** - * Autofilter Rule Operator. - * - * @var string - */ - private $operator = self::AUTOFILTER_COLUMN_RULE_EQUAL; - - /** - * DateTimeGrouping Group Value. - * - * @var string - */ - private $grouping = ''; - - /** - * Create a new Rule. - * - * @param Column $pParent - */ - public function __construct(?Column $pParent = null) - { - $this->parent = $pParent; - } - - /** - * Get AutoFilter Rule Type. - * - * @return string - */ - public function getRuleType() - { - return $this->ruleType; - } - - /** - * Set AutoFilter Rule Type. - * - * @param string $pRuleType see self::AUTOFILTER_RULETYPE_* - * - * @return $this - */ - public function setRuleType($pRuleType) - { - if (!in_array($pRuleType, self::$ruleTypes)) { - throw new PhpSpreadsheetException('Invalid rule type for column AutoFilter Rule.'); - } - - $this->ruleType = $pRuleType; - - return $this; - } - - /** - * Get AutoFilter Rule Value. - * - * @return string - */ - public function getValue() - { - return $this->value; - } - - /** - * Set AutoFilter Rule Value. - * - * @param string|string[] $pValue - * - * @return $this - */ - public function setValue($pValue) - { - if (is_array($pValue)) { - $grouping = -1; - foreach ($pValue as $key => $value) { - // Validate array entries - if (!in_array($key, self::$dateTimeGroups)) { - // Remove any invalid entries from the value array - unset($pValue[$key]); - } else { - // Work out what the dateTime grouping will be - $grouping = max($grouping, array_search($key, self::$dateTimeGroups)); - } - } - if (count($pValue) == 0) { - throw new PhpSpreadsheetException('Invalid rule value for column AutoFilter Rule.'); - } - // Set the dateTime grouping that we've anticipated - $this->setGrouping(self::$dateTimeGroups[$grouping]); - } - $this->value = $pValue; - - return $this; - } - - /** - * Get AutoFilter Rule Operator. - * - * @return string - */ - public function getOperator() - { - return $this->operator; - } - - /** - * Set AutoFilter Rule Operator. - * - * @param string $pOperator see self::AUTOFILTER_COLUMN_RULE_* - * - * @return $this - */ - public function setOperator($pOperator) - { - if (empty($pOperator)) { - $pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL; - } - if ( - (!in_array($pOperator, self::$operators)) && - (!in_array($pOperator, self::$topTenValue)) - ) { - throw new PhpSpreadsheetException('Invalid operator for column AutoFilter Rule.'); - } - $this->operator = $pOperator; - - return $this; - } - - /** - * Get AutoFilter Rule Grouping. - * - * @return string - */ - public function getGrouping() - { - return $this->grouping; - } - - /** - * Set AutoFilter Rule Grouping. - * - * @param string $pGrouping - * - * @return $this - */ - public function setGrouping($pGrouping) - { - if ( - ($pGrouping !== null) && - (!in_array($pGrouping, self::$dateTimeGroups)) && - (!in_array($pGrouping, self::$dynamicTypes)) && - (!in_array($pGrouping, self::$topTenType)) - ) { - throw new PhpSpreadsheetException('Invalid rule type for column AutoFilter Rule.'); - } - $this->grouping = $pGrouping; - - return $this; - } - - /** - * Set AutoFilter Rule. - * - * @param string $pOperator see self::AUTOFILTER_COLUMN_RULE_* - * @param string|string[] $pValue - * @param string $pGrouping - * - * @return $this - */ - public function setRule($pOperator, $pValue, $pGrouping = null) - { - $this->setOperator($pOperator); - $this->setValue($pValue); - // Only set grouping if it's been passed in as a user-supplied argument, - // otherwise we're calculating it when we setValue() and don't want to overwrite that - // If the user supplies an argumnet for grouping, then on their own head be it - if ($pGrouping !== null) { - $this->setGrouping($pGrouping); - } - - return $this; - } - - /** - * Get this Rule's AutoFilter Column Parent. - * - * @return Column - */ - public function getParent() - { - return $this->parent; - } - - /** - * Set this Rule's AutoFilter Column Parent. - * - * @param Column $pParent - * - * @return $this - */ - public function setParent(?Column $pParent = null) - { - $this->parent = $pParent; - - return $this; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - if ($key == 'parent') { - // Detach from autofilter column parent - $this->$key = null; - } else { - $this->$key = clone $value; - } - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/BaseDrawing.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/BaseDrawing.php deleted file mode 100644 index be2f23d..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/BaseDrawing.php +++ /dev/null @@ -1,532 +0,0 @@ -name = ''; - $this->description = ''; - $this->worksheet = null; - $this->coordinates = 'A1'; - $this->offsetX = 0; - $this->offsetY = 0; - $this->width = 0; - $this->height = 0; - $this->resizeProportional = true; - $this->rotation = 0; - $this->shadow = new Drawing\Shadow(); - - // Set image index - ++self::$imageCounter; - $this->imageIndex = self::$imageCounter; - } - - /** - * Get image index. - * - * @return int - */ - public function getImageIndex() - { - return $this->imageIndex; - } - - /** - * Get Name. - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Set Name. - * - * @param string $pValue - * - * @return $this - */ - public function setName($pValue) - { - $this->name = $pValue; - - return $this; - } - - /** - * Get Description. - * - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * Set Description. - * - * @param string $description - * - * @return $this - */ - public function setDescription($description) - { - $this->description = $description; - - return $this; - } - - /** - * Get Worksheet. - * - * @return Worksheet - */ - public function getWorksheet() - { - return $this->worksheet; - } - - /** - * Set Worksheet. - * - * @param Worksheet $pValue - * @param bool $pOverrideOld If a Worksheet has already been assigned, overwrite it and remove image from old Worksheet? - * - * @return $this - */ - public function setWorksheet(?Worksheet $pValue = null, $pOverrideOld = false) - { - if ($this->worksheet === null) { - // Add drawing to \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet - $this->worksheet = $pValue; - $this->worksheet->getCell($this->coordinates); - $this->worksheet->getDrawingCollection()->append($this); - } else { - if ($pOverrideOld) { - // Remove drawing from old \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet - $iterator = $this->worksheet->getDrawingCollection()->getIterator(); - - while ($iterator->valid()) { - if ($iterator->current()->getHashCode() === $this->getHashCode()) { - $this->worksheet->getDrawingCollection()->offsetUnset($iterator->key()); - $this->worksheet = null; - - break; - } - } - - // Set new \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet - $this->setWorksheet($pValue); - } else { - throw new PhpSpreadsheetException('A Worksheet has already been assigned. Drawings can only exist on one \\PhpOffice\\PhpSpreadsheet\\Worksheet.'); - } - } - - return $this; - } - - /** - * Get Coordinates. - * - * @return string - */ - public function getCoordinates() - { - return $this->coordinates; - } - - /** - * Set Coordinates. - * - * @param string $pValue eg: 'A1' - * - * @return $this - */ - public function setCoordinates($pValue) - { - $this->coordinates = $pValue; - - return $this; - } - - /** - * Get OffsetX. - * - * @return int - */ - public function getOffsetX() - { - return $this->offsetX; - } - - /** - * Set OffsetX. - * - * @param int $pValue - * - * @return $this - */ - public function setOffsetX($pValue) - { - $this->offsetX = $pValue; - - return $this; - } - - /** - * Get OffsetY. - * - * @return int - */ - public function getOffsetY() - { - return $this->offsetY; - } - - /** - * Set OffsetY. - * - * @param int $pValue - * - * @return $this - */ - public function setOffsetY($pValue) - { - $this->offsetY = $pValue; - - return $this; - } - - /** - * Get Width. - * - * @return int - */ - public function getWidth() - { - return $this->width; - } - - /** - * Set Width. - * - * @param int $pValue - * - * @return $this - */ - public function setWidth($pValue) - { - // Resize proportional? - if ($this->resizeProportional && $pValue != 0) { - $ratio = $this->height / ($this->width != 0 ? $this->width : 1); - $this->height = round($ratio * $pValue); - } - - // Set width - $this->width = $pValue; - - return $this; - } - - /** - * Get Height. - * - * @return int - */ - public function getHeight() - { - return $this->height; - } - - /** - * Set Height. - * - * @param int $pValue - * - * @return $this - */ - public function setHeight($pValue) - { - // Resize proportional? - if ($this->resizeProportional && $pValue != 0) { - $ratio = $this->width / ($this->height != 0 ? $this->height : 1); - $this->width = round($ratio * $pValue); - } - - // Set height - $this->height = $pValue; - - return $this; - } - - /** - * Set width and height with proportional resize. - * - * Example: - * - * $objDrawing->setResizeProportional(true); - * $objDrawing->setWidthAndHeight(160,120); - * - * - * @author Vincent@luo MSN:kele_100@hotmail.com - * - * @param int $width - * @param int $height - * - * @return $this - */ - public function setWidthAndHeight($width, $height) - { - $xratio = $width / ($this->width != 0 ? $this->width : 1); - $yratio = $height / ($this->height != 0 ? $this->height : 1); - if ($this->resizeProportional && !($width == 0 || $height == 0)) { - if (($xratio * $this->height) < $height) { - $this->height = ceil($xratio * $this->height); - $this->width = $width; - } else { - $this->width = ceil($yratio * $this->width); - $this->height = $height; - } - } else { - $this->width = $width; - $this->height = $height; - } - - return $this; - } - - /** - * Get ResizeProportional. - * - * @return bool - */ - public function getResizeProportional() - { - return $this->resizeProportional; - } - - /** - * Set ResizeProportional. - * - * @param bool $pValue - * - * @return $this - */ - public function setResizeProportional($pValue) - { - $this->resizeProportional = $pValue; - - return $this; - } - - /** - * Get Rotation. - * - * @return int - */ - public function getRotation() - { - return $this->rotation; - } - - /** - * Set Rotation. - * - * @param int $pValue - * - * @return $this - */ - public function setRotation($pValue) - { - $this->rotation = $pValue; - - return $this; - } - - /** - * Get Shadow. - * - * @return Drawing\Shadow - */ - public function getShadow() - { - return $this->shadow; - } - - /** - * Set Shadow. - * - * @param Drawing\Shadow $pValue - * - * @return $this - */ - public function setShadow(?Drawing\Shadow $pValue = null) - { - $this->shadow = $pValue; - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - return md5( - $this->name . - $this->description . - $this->worksheet->getHashCode() . - $this->coordinates . - $this->offsetX . - $this->offsetY . - $this->width . - $this->height . - $this->rotation . - $this->shadow->getHashCode() . - __CLASS__ - ); - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if ($key == 'worksheet') { - $this->worksheet = null; - } elseif (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } - - public function setHyperlink(?Hyperlink $pHyperlink = null): void - { - $this->hyperlink = $pHyperlink; - } - - /** - * @return null|Hyperlink - */ - public function getHyperlink() - { - return $this->hyperlink; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php deleted file mode 100644 index 45f76ca..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php +++ /dev/null @@ -1,57 +0,0 @@ -worksheet = null; - } - - /** - * Get loop only existing cells. - * - * @return bool - */ - public function getIterateOnlyExistingCells() - { - return $this->onlyExistingCells; - } - - /** - * Validate start/end values for "IterateOnlyExistingCells" mode, and adjust if necessary. - */ - abstract protected function adjustForExistingOnlyRange(); - - /** - * Set the iterator to loop only existing cells. - * - * @param bool $value - */ - public function setIterateOnlyExistingCells($value): void - { - $this->onlyExistingCells = (bool) $value; - - $this->adjustForExistingOnlyRange(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Column.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Column.php deleted file mode 100644 index 410e807..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Column.php +++ /dev/null @@ -1,64 +0,0 @@ -parent = $parent; - $this->columnIndex = $columnIndex; - } - - /** - * Destructor. - */ - public function __destruct() - { - $this->parent = null; - } - - /** - * Get column index as string eg: 'A'. - * - * @return string - */ - public function getColumnIndex() - { - return $this->columnIndex; - } - - /** - * Get cell iterator. - * - * @param int $startRow The row number at which to start iterating - * @param int $endRow Optionally, the row number at which to stop iterating - * - * @return ColumnCellIterator - */ - public function getCellIterator($startRow = 1, $endRow = null) - { - return new ColumnCellIterator($this->parent, $this->columnIndex, $startRow, $endRow); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php deleted file mode 100644 index 12420d7..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php +++ /dev/null @@ -1,197 +0,0 @@ -worksheet = $subject; - $this->columnIndex = Coordinate::columnIndexFromString($columnIndex); - $this->resetEnd($endRow); - $this->resetStart($startRow); - } - - /** - * (Re)Set the start row and the current row pointer. - * - * @param int $startRow The row number at which to start iterating - * - * @return $this - */ - public function resetStart($startRow = 1) - { - $this->startRow = $startRow; - $this->adjustForExistingOnlyRange(); - $this->seek($startRow); - - return $this; - } - - /** - * (Re)Set the end row. - * - * @param int $endRow The row number at which to stop iterating - * - * @return $this - */ - public function resetEnd($endRow = null) - { - $this->endRow = ($endRow) ? $endRow : $this->worksheet->getHighestRow(); - $this->adjustForExistingOnlyRange(); - - return $this; - } - - /** - * Set the row pointer to the selected row. - * - * @param int $row The row number to set the current pointer at - * - * @return $this - */ - public function seek($row = 1) - { - if (($row < $this->startRow) || ($row > $this->endRow)) { - throw new PhpSpreadsheetException("Row $row is out of range ({$this->startRow} - {$this->endRow})"); - } elseif ($this->onlyExistingCells && !($this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $row))) { - throw new PhpSpreadsheetException('In "IterateOnlyExistingCells" mode and Cell does not exist'); - } - $this->currentRow = $row; - - return $this; - } - - /** - * Rewind the iterator to the starting row. - */ - public function rewind(): void - { - $this->currentRow = $this->startRow; - } - - /** - * Return the current cell in this worksheet column. - * - * @return null|\PhpOffice\PhpSpreadsheet\Cell\Cell - */ - public function current() - { - return $this->worksheet->getCellByColumnAndRow($this->columnIndex, $this->currentRow); - } - - /** - * Return the current iterator key. - * - * @return int - */ - public function key() - { - return $this->currentRow; - } - - /** - * Set the iterator to its next value. - */ - public function next(): void - { - do { - ++$this->currentRow; - } while ( - ($this->onlyExistingCells) && - (!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->currentRow)) && - ($this->currentRow <= $this->endRow) - ); - } - - /** - * Set the iterator to its previous value. - */ - public function prev(): void - { - do { - --$this->currentRow; - } while ( - ($this->onlyExistingCells) && - (!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->currentRow)) && - ($this->currentRow >= $this->startRow) - ); - } - - /** - * Indicate if more rows exist in the worksheet range of rows that we're iterating. - * - * @return bool - */ - public function valid() - { - return $this->currentRow <= $this->endRow && $this->currentRow >= $this->startRow; - } - - /** - * Validate start/end values for "IterateOnlyExistingCells" mode, and adjust if necessary. - */ - protected function adjustForExistingOnlyRange(): void - { - if ($this->onlyExistingCells) { - while ( - (!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->startRow)) && - ($this->startRow <= $this->endRow) - ) { - ++$this->startRow; - } - if ($this->startRow > $this->endRow) { - throw new PhpSpreadsheetException('No cells exist within the specified range'); - } - while ( - (!$this->worksheet->cellExistsByColumnAndRow($this->columnIndex, $this->endRow)) && - ($this->endRow >= $this->startRow) - ) { - --$this->endRow; - } - if ($this->endRow < $this->startRow) { - throw new PhpSpreadsheetException('No cells exist within the specified range'); - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php deleted file mode 100644 index 4e87a34..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php +++ /dev/null @@ -1,115 +0,0 @@ -columnIndex = $pIndex; - - // set dimension as unformatted by default - parent::__construct(0); - } - - /** - * Get column index as string eg: 'A'. - * - * @return string - */ - public function getColumnIndex() - { - return $this->columnIndex; - } - - /** - * Set column index as string eg: 'A'. - * - * @param string $pValue - * - * @return $this - */ - public function setColumnIndex($pValue) - { - $this->columnIndex = $pValue; - - return $this; - } - - /** - * Get Width. - * - * @return float - */ - public function getWidth() - { - return $this->width; - } - - /** - * Set Width. - * - * @param float $pValue - * - * @return $this - */ - public function setWidth($pValue) - { - $this->width = $pValue; - - return $this; - } - - /** - * Get Auto Size. - * - * @return bool - */ - public function getAutoSize() - { - return $this->autoSize; - } - - /** - * Set Auto Size. - * - * @param bool $pValue - * - * @return $this - */ - public function setAutoSize($pValue) - { - $this->autoSize = $pValue; - - return $this; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php deleted file mode 100644 index d0bb20c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php +++ /dev/null @@ -1,172 +0,0 @@ -worksheet = $worksheet; - $this->resetEnd($endColumn); - $this->resetStart($startColumn); - } - - /** - * Destructor. - */ - public function __destruct() - { - $this->worksheet = null; - } - - /** - * (Re)Set the start column and the current column pointer. - * - * @param string $startColumn The column address at which to start iterating - * - * @return $this - */ - public function resetStart($startColumn = 'A') - { - $startColumnIndex = Coordinate::columnIndexFromString($startColumn); - if ($startColumnIndex > Coordinate::columnIndexFromString($this->worksheet->getHighestColumn())) { - throw new Exception("Start column ({$startColumn}) is beyond highest column ({$this->worksheet->getHighestColumn()})"); - } - - $this->startColumnIndex = $startColumnIndex; - if ($this->endColumnIndex < $this->startColumnIndex) { - $this->endColumnIndex = $this->startColumnIndex; - } - $this->seek($startColumn); - - return $this; - } - - /** - * (Re)Set the end column. - * - * @param string $endColumn The column address at which to stop iterating - * - * @return $this - */ - public function resetEnd($endColumn = null) - { - $endColumn = $endColumn ? $endColumn : $this->worksheet->getHighestColumn(); - $this->endColumnIndex = Coordinate::columnIndexFromString($endColumn); - - return $this; - } - - /** - * Set the column pointer to the selected column. - * - * @param string $column The column address to set the current pointer at - * - * @return $this - */ - public function seek($column = 'A') - { - $column = Coordinate::columnIndexFromString($column); - if (($column < $this->startColumnIndex) || ($column > $this->endColumnIndex)) { - throw new PhpSpreadsheetException("Column $column is out of range ({$this->startColumnIndex} - {$this->endColumnIndex})"); - } - $this->currentColumnIndex = $column; - - return $this; - } - - /** - * Rewind the iterator to the starting column. - */ - public function rewind(): void - { - $this->currentColumnIndex = $this->startColumnIndex; - } - - /** - * Return the current column in this worksheet. - * - * @return Column - */ - public function current() - { - return new Column($this->worksheet, Coordinate::stringFromColumnIndex($this->currentColumnIndex)); - } - - /** - * Return the current iterator key. - * - * @return string - */ - public function key() - { - return Coordinate::stringFromColumnIndex($this->currentColumnIndex); - } - - /** - * Set the iterator to its next value. - */ - public function next(): void - { - ++$this->currentColumnIndex; - } - - /** - * Set the iterator to its previous value. - */ - public function prev(): void - { - --$this->currentColumnIndex; - } - - /** - * Indicate if more columns exist in the worksheet range of columns that we're iterating. - * - * @return bool - */ - public function valid() - { - return $this->currentColumnIndex <= $this->endColumnIndex && $this->currentColumnIndex >= $this->startColumnIndex; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php deleted file mode 100644 index a27daf0..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php +++ /dev/null @@ -1,163 +0,0 @@ -xfIndex = $initialValue; - } - - /** - * Get Visible. - * - * @return bool - */ - public function getVisible() - { - return $this->visible; - } - - /** - * Set Visible. - * - * @param bool $pValue - * - * @return $this - */ - public function setVisible($pValue) - { - $this->visible = (bool) $pValue; - - return $this; - } - - /** - * Get Outline Level. - * - * @return int - */ - public function getOutlineLevel() - { - return $this->outlineLevel; - } - - /** - * Set Outline Level. - * Value must be between 0 and 7. - * - * @param int $pValue - * - * @return $this - */ - public function setOutlineLevel($pValue) - { - if ($pValue < 0 || $pValue > 7) { - throw new PhpSpreadsheetException('Outline level must range between 0 and 7.'); - } - - $this->outlineLevel = $pValue; - - return $this; - } - - /** - * Get Collapsed. - * - * @return bool - */ - public function getCollapsed() - { - return $this->collapsed; - } - - /** - * Set Collapsed. - * - * @param bool $pValue - * - * @return $this - */ - public function setCollapsed($pValue) - { - $this->collapsed = (bool) $pValue; - - return $this; - } - - /** - * Get index to cellXf. - * - * @return int - */ - public function getXfIndex() - { - return $this->xfIndex; - } - - /** - * Set index to cellXf. - * - * @param int $pValue - * - * @return $this - */ - public function setXfIndex($pValue) - { - $this->xfIndex = $pValue; - - return $this; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php deleted file mode 100644 index 1f1dae9..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php +++ /dev/null @@ -1,114 +0,0 @@ -path = ''; - - // Initialize parent - parent::__construct(); - } - - /** - * Get Filename. - * - * @return string - */ - public function getFilename() - { - return basename($this->path); - } - - /** - * Get indexed filename (using image index). - * - * @return string - */ - public function getIndexedFilename() - { - $fileName = $this->getFilename(); - $fileName = str_replace(' ', '_', $fileName); - - return str_replace('.' . $this->getExtension(), '', $fileName) . $this->getImageIndex() . '.' . $this->getExtension(); - } - - /** - * Get Extension. - * - * @return string - */ - public function getExtension() - { - $exploded = explode('.', basename($this->path)); - - return $exploded[count($exploded) - 1]; - } - - /** - * Get Path. - * - * @return string - */ - public function getPath() - { - return $this->path; - } - - /** - * Set Path. - * - * @param string $pValue File path - * @param bool $pVerifyFile Verify file - * - * @return $this - */ - public function setPath($pValue, $pVerifyFile = true) - { - if ($pVerifyFile) { - if (file_exists($pValue)) { - $this->path = $pValue; - - if ($this->width == 0 && $this->height == 0) { - // Get width/height - [$this->width, $this->height] = getimagesize($pValue); - } - } else { - throw new PhpSpreadsheetException("File $pValue not found!"); - } - } else { - $this->path = $pValue; - } - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - return md5( - $this->path . - parent::getHashCode() . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing/Shadow.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing/Shadow.php deleted file mode 100644 index 01ffed9..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing/Shadow.php +++ /dev/null @@ -1,289 +0,0 @@ -visible = false; - $this->blurRadius = 6; - $this->distance = 2; - $this->direction = 0; - $this->alignment = self::SHADOW_BOTTOM_RIGHT; - $this->color = new Color(Color::COLOR_BLACK); - $this->alpha = 50; - } - - /** - * Get Visible. - * - * @return bool - */ - public function getVisible() - { - return $this->visible; - } - - /** - * Set Visible. - * - * @param bool $pValue - * - * @return $this - */ - public function setVisible($pValue) - { - $this->visible = $pValue; - - return $this; - } - - /** - * Get Blur radius. - * - * @return int - */ - public function getBlurRadius() - { - return $this->blurRadius; - } - - /** - * Set Blur radius. - * - * @param int $pValue - * - * @return $this - */ - public function setBlurRadius($pValue) - { - $this->blurRadius = $pValue; - - return $this; - } - - /** - * Get Shadow distance. - * - * @return int - */ - public function getDistance() - { - return $this->distance; - } - - /** - * Set Shadow distance. - * - * @param int $pValue - * - * @return $this - */ - public function setDistance($pValue) - { - $this->distance = $pValue; - - return $this; - } - - /** - * Get Shadow direction (in degrees). - * - * @return int - */ - public function getDirection() - { - return $this->direction; - } - - /** - * Set Shadow direction (in degrees). - * - * @param int $pValue - * - * @return $this - */ - public function setDirection($pValue) - { - $this->direction = $pValue; - - return $this; - } - - /** - * Get Shadow alignment. - * - * @return int - */ - public function getAlignment() - { - return $this->alignment; - } - - /** - * Set Shadow alignment. - * - * @param int $pValue - * - * @return $this - */ - public function setAlignment($pValue) - { - $this->alignment = $pValue; - - return $this; - } - - /** - * Get Color. - * - * @return Color - */ - public function getColor() - { - return $this->color; - } - - /** - * Set Color. - * - * @param Color $pValue - * - * @return $this - */ - public function setColor(?Color $pValue = null) - { - $this->color = $pValue; - - return $this; - } - - /** - * Get Alpha. - * - * @return int - */ - public function getAlpha() - { - return $this->alpha; - } - - /** - * Set Alpha. - * - * @param int $pValue - * - * @return $this - */ - public function setAlpha($pValue) - { - $this->alpha = $pValue; - - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - return md5( - ($this->visible ? 't' : 'f') . - $this->blurRadius . - $this->distance . - $this->direction . - $this->alignment . - $this->color->getHashCode() . - $this->alpha . - __CLASS__ - ); - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooter.php deleted file mode 100644 index cc37e7f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooter.php +++ /dev/null @@ -1,490 +0,0 @@ - - * Header/Footer Formatting Syntax taken from Office Open XML Part 4 - Markup Language Reference, page 1970:. - * - * There are a number of formatting codes that can be written inline with the actual header / footer text, which - * affect the formatting in the header or footer. - * - * Example: This example shows the text "Center Bold Header" on the first line (center section), and the date on - * the second line (center section). - * &CCenter &"-,Bold"Bold&"-,Regular"Header_x000A_&D - * - * General Rules: - * There is no required order in which these codes must appear. - * - * The first occurrence of the following codes turns the formatting ON, the second occurrence turns it OFF again: - * - strikethrough - * - superscript - * - subscript - * Superscript and subscript cannot both be ON at same time. Whichever comes first wins and the other is ignored, - * while the first is ON. - * &L - code for "left section" (there are three header / footer locations, "left", "center", and "right"). When - * two or more occurrences of this section marker exist, the contents from all markers are concatenated, in the - * order of appearance, and placed into the left section. - * &P - code for "current page #" - * &N - code for "total pages" - * &font size - code for "text font size", where font size is a font size in points. - * &K - code for "text font color" - * RGB Color is specified as RRGGBB - * Theme Color is specifed as TTSNN where TT is the theme color Id, S is either "+" or "-" of the tint/shade - * value, NN is the tint/shade value. - * &S - code for "text strikethrough" on / off - * &X - code for "text super script" on / off - * &Y - code for "text subscript" on / off - * &C - code for "center section". When two or more occurrences of this section marker exist, the contents - * from all markers are concatenated, in the order of appearance, and placed into the center section. - * - * &D - code for "date" - * &T - code for "time" - * &G - code for "picture as background" - * &U - code for "text single underline" - * &E - code for "double underline" - * &R - code for "right section". When two or more occurrences of this section marker exist, the contents - * from all markers are concatenated, in the order of appearance, and placed into the right section. - * &Z - code for "this workbook's file path" - * &F - code for "this workbook's file name" - * &A - code for "sheet tab name" - * &+ - code for add to page #. - * &- - code for subtract from page #. - * &"font name,font type" - code for "text font name" and "text font type", where font name and font type - * are strings specifying the name and type of the font, separated by a comma. When a hyphen appears in font - * name, it means "none specified". Both of font name and font type can be localized values. - * &"-,Bold" - code for "bold font style" - * &B - also means "bold font style". - * &"-,Regular" - code for "regular font style" - * &"-,Italic" - code for "italic font style" - * &I - also means "italic font style" - * &"-,Bold Italic" code for "bold italic font style" - * &O - code for "outline style" - * &H - code for "shadow style" - * - */ -class HeaderFooter -{ - // Header/footer image location - const IMAGE_HEADER_LEFT = 'LH'; - const IMAGE_HEADER_CENTER = 'CH'; - const IMAGE_HEADER_RIGHT = 'RH'; - const IMAGE_FOOTER_LEFT = 'LF'; - const IMAGE_FOOTER_CENTER = 'CF'; - const IMAGE_FOOTER_RIGHT = 'RF'; - - /** - * OddHeader. - * - * @var string - */ - private $oddHeader = ''; - - /** - * OddFooter. - * - * @var string - */ - private $oddFooter = ''; - - /** - * EvenHeader. - * - * @var string - */ - private $evenHeader = ''; - - /** - * EvenFooter. - * - * @var string - */ - private $evenFooter = ''; - - /** - * FirstHeader. - * - * @var string - */ - private $firstHeader = ''; - - /** - * FirstFooter. - * - * @var string - */ - private $firstFooter = ''; - - /** - * Different header for Odd/Even, defaults to false. - * - * @var bool - */ - private $differentOddEven = false; - - /** - * Different header for first page, defaults to false. - * - * @var bool - */ - private $differentFirst = false; - - /** - * Scale with document, defaults to true. - * - * @var bool - */ - private $scaleWithDocument = true; - - /** - * Align with margins, defaults to true. - * - * @var bool - */ - private $alignWithMargins = true; - - /** - * Header/footer images. - * - * @var HeaderFooterDrawing[] - */ - private $headerFooterImages = []; - - /** - * Create a new HeaderFooter. - */ - public function __construct() - { - } - - /** - * Get OddHeader. - * - * @return string - */ - public function getOddHeader() - { - return $this->oddHeader; - } - - /** - * Set OddHeader. - * - * @param string $pValue - * - * @return $this - */ - public function setOddHeader($pValue) - { - $this->oddHeader = $pValue; - - return $this; - } - - /** - * Get OddFooter. - * - * @return string - */ - public function getOddFooter() - { - return $this->oddFooter; - } - - /** - * Set OddFooter. - * - * @param string $pValue - * - * @return $this - */ - public function setOddFooter($pValue) - { - $this->oddFooter = $pValue; - - return $this; - } - - /** - * Get EvenHeader. - * - * @return string - */ - public function getEvenHeader() - { - return $this->evenHeader; - } - - /** - * Set EvenHeader. - * - * @param string $pValue - * - * @return $this - */ - public function setEvenHeader($pValue) - { - $this->evenHeader = $pValue; - - return $this; - } - - /** - * Get EvenFooter. - * - * @return string - */ - public function getEvenFooter() - { - return $this->evenFooter; - } - - /** - * Set EvenFooter. - * - * @param string $pValue - * - * @return $this - */ - public function setEvenFooter($pValue) - { - $this->evenFooter = $pValue; - - return $this; - } - - /** - * Get FirstHeader. - * - * @return string - */ - public function getFirstHeader() - { - return $this->firstHeader; - } - - /** - * Set FirstHeader. - * - * @param string $pValue - * - * @return $this - */ - public function setFirstHeader($pValue) - { - $this->firstHeader = $pValue; - - return $this; - } - - /** - * Get FirstFooter. - * - * @return string - */ - public function getFirstFooter() - { - return $this->firstFooter; - } - - /** - * Set FirstFooter. - * - * @param string $pValue - * - * @return $this - */ - public function setFirstFooter($pValue) - { - $this->firstFooter = $pValue; - - return $this; - } - - /** - * Get DifferentOddEven. - * - * @return bool - */ - public function getDifferentOddEven() - { - return $this->differentOddEven; - } - - /** - * Set DifferentOddEven. - * - * @param bool $pValue - * - * @return $this - */ - public function setDifferentOddEven($pValue) - { - $this->differentOddEven = $pValue; - - return $this; - } - - /** - * Get DifferentFirst. - * - * @return bool - */ - public function getDifferentFirst() - { - return $this->differentFirst; - } - - /** - * Set DifferentFirst. - * - * @param bool $pValue - * - * @return $this - */ - public function setDifferentFirst($pValue) - { - $this->differentFirst = $pValue; - - return $this; - } - - /** - * Get ScaleWithDocument. - * - * @return bool - */ - public function getScaleWithDocument() - { - return $this->scaleWithDocument; - } - - /** - * Set ScaleWithDocument. - * - * @param bool $pValue - * - * @return $this - */ - public function setScaleWithDocument($pValue) - { - $this->scaleWithDocument = $pValue; - - return $this; - } - - /** - * Get AlignWithMargins. - * - * @return bool - */ - public function getAlignWithMargins() - { - return $this->alignWithMargins; - } - - /** - * Set AlignWithMargins. - * - * @param bool $pValue - * - * @return $this - */ - public function setAlignWithMargins($pValue) - { - $this->alignWithMargins = $pValue; - - return $this; - } - - /** - * Add header/footer image. - * - * @param string $location - * - * @return $this - */ - public function addImage(HeaderFooterDrawing $image, $location = self::IMAGE_HEADER_LEFT) - { - $this->headerFooterImages[$location] = $image; - - return $this; - } - - /** - * Remove header/footer image. - * - * @param string $location - * - * @return $this - */ - public function removeImage($location = self::IMAGE_HEADER_LEFT) - { - if (isset($this->headerFooterImages[$location])) { - unset($this->headerFooterImages[$location]); - } - - return $this; - } - - /** - * Set header/footer images. - * - * @param HeaderFooterDrawing[] $images - * - * @return $this - */ - public function setImages(array $images) - { - $this->headerFooterImages = $images; - - return $this; - } - - /** - * Get header/footer images. - * - * @return HeaderFooterDrawing[] - */ - public function getImages() - { - // Sort array - $images = []; - if (isset($this->headerFooterImages[self::IMAGE_HEADER_LEFT])) { - $images[self::IMAGE_HEADER_LEFT] = $this->headerFooterImages[self::IMAGE_HEADER_LEFT]; - } - if (isset($this->headerFooterImages[self::IMAGE_HEADER_CENTER])) { - $images[self::IMAGE_HEADER_CENTER] = $this->headerFooterImages[self::IMAGE_HEADER_CENTER]; - } - if (isset($this->headerFooterImages[self::IMAGE_HEADER_RIGHT])) { - $images[self::IMAGE_HEADER_RIGHT] = $this->headerFooterImages[self::IMAGE_HEADER_RIGHT]; - } - if (isset($this->headerFooterImages[self::IMAGE_FOOTER_LEFT])) { - $images[self::IMAGE_FOOTER_LEFT] = $this->headerFooterImages[self::IMAGE_FOOTER_LEFT]; - } - if (isset($this->headerFooterImages[self::IMAGE_FOOTER_CENTER])) { - $images[self::IMAGE_FOOTER_CENTER] = $this->headerFooterImages[self::IMAGE_FOOTER_CENTER]; - } - if (isset($this->headerFooterImages[self::IMAGE_FOOTER_RIGHT])) { - $images[self::IMAGE_FOOTER_RIGHT] = $this->headerFooterImages[self::IMAGE_FOOTER_RIGHT]; - } - $this->headerFooterImages = $images; - - return $this->headerFooterImages; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php deleted file mode 100644 index b42c732..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php +++ /dev/null @@ -1,24 +0,0 @@ -getPath() . - $this->name . - $this->offsetX . - $this->offsetY . - $this->width . - $this->height . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php deleted file mode 100644 index 6cfed37..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php +++ /dev/null @@ -1,85 +0,0 @@ -subject = $subject; - } - - /** - * Destructor. - */ - public function __destruct() - { - $this->subject = null; - } - - /** - * Rewind iterator. - */ - public function rewind(): void - { - $this->position = 0; - } - - /** - * Current Worksheet. - * - * @return Worksheet - */ - public function current() - { - return $this->subject->getSheet($this->position); - } - - /** - * Current key. - * - * @return int - */ - public function key() - { - return $this->position; - } - - /** - * Next value. - */ - public function next(): void - { - ++$this->position; - } - - /** - * Are there more Worksheet instances available? - * - * @return bool - */ - public function valid() - { - return $this->position < $this->subject->getSheetCount() && $this->position >= 0; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/MemoryDrawing.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/MemoryDrawing.php deleted file mode 100644 index 22e0909..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/MemoryDrawing.php +++ /dev/null @@ -1,169 +0,0 @@ -imageResource = null; - $this->renderingFunction = self::RENDERING_DEFAULT; - $this->mimeType = self::MIMETYPE_DEFAULT; - $this->uniqueName = md5(mt_rand(0, 9999) . time() . mt_rand(0, 9999)); - - // Initialize parent - parent::__construct(); - } - - /** - * Get image resource. - * - * @return resource - */ - public function getImageResource() - { - return $this->imageResource; - } - - /** - * Set image resource. - * - * @param resource $value - * - * @return $this - */ - public function setImageResource($value) - { - $this->imageResource = $value; - - if ($this->imageResource !== null) { - // Get width/height - $this->width = imagesx($this->imageResource); - $this->height = imagesy($this->imageResource); - } - - return $this; - } - - /** - * Get rendering function. - * - * @return string - */ - public function getRenderingFunction() - { - return $this->renderingFunction; - } - - /** - * Set rendering function. - * - * @param string $value see self::RENDERING_* - * - * @return $this - */ - public function setRenderingFunction($value) - { - $this->renderingFunction = $value; - - return $this; - } - - /** - * Get mime type. - * - * @return string - */ - public function getMimeType() - { - return $this->mimeType; - } - - /** - * Set mime type. - * - * @param string $value see self::MIMETYPE_* - * - * @return $this - */ - public function setMimeType($value) - { - $this->mimeType = $value; - - return $this; - } - - /** - * Get indexed filename (using image index). - * - * @return string - */ - public function getIndexedFilename() - { - $extension = strtolower($this->getMimeType()); - $extension = explode('/', $extension); - $extension = $extension[1]; - - return $this->uniqueName . $this->getImageIndex() . '.' . $extension; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - return md5( - $this->renderingFunction . - $this->mimeType . - $this->uniqueName . - parent::getHashCode() . - __CLASS__ - ); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageMargins.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageMargins.php deleted file mode 100644 index a829793..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageMargins.php +++ /dev/null @@ -1,244 +0,0 @@ -left; - } - - /** - * Set Left. - * - * @param float $pValue - * - * @return $this - */ - public function setLeft($pValue) - { - $this->left = $pValue; - - return $this; - } - - /** - * Get Right. - * - * @return float - */ - public function getRight() - { - return $this->right; - } - - /** - * Set Right. - * - * @param float $pValue - * - * @return $this - */ - public function setRight($pValue) - { - $this->right = $pValue; - - return $this; - } - - /** - * Get Top. - * - * @return float - */ - public function getTop() - { - return $this->top; - } - - /** - * Set Top. - * - * @param float $pValue - * - * @return $this - */ - public function setTop($pValue) - { - $this->top = $pValue; - - return $this; - } - - /** - * Get Bottom. - * - * @return float - */ - public function getBottom() - { - return $this->bottom; - } - - /** - * Set Bottom. - * - * @param float $pValue - * - * @return $this - */ - public function setBottom($pValue) - { - $this->bottom = $pValue; - - return $this; - } - - /** - * Get Header. - * - * @return float - */ - public function getHeader() - { - return $this->header; - } - - /** - * Set Header. - * - * @param float $pValue - * - * @return $this - */ - public function setHeader($pValue) - { - $this->header = $pValue; - - return $this; - } - - /** - * Get Footer. - * - * @return float - */ - public function getFooter() - { - return $this->footer; - } - - /** - * Set Footer. - * - * @param float $pValue - * - * @return $this - */ - public function setFooter($pValue) - { - $this->footer = $pValue; - - return $this; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } - - public static function fromCentimeters(float $value): float - { - return $value / 2.54; - } - - public static function toCentimeters(float $value): float - { - return $value * 2.54; - } - - public static function fromMillimeters(float $value): float - { - return $value / 25.4; - } - - public static function toMillimeters(float $value): float - { - return $value * 25.4; - } - - public static function fromPoints(float $value): float - { - return $value / 72; - } - - public static function toPoints(float $value): float - { - return $value * 72; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php deleted file mode 100644 index d1a22a7..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php +++ /dev/null @@ -1,857 +0,0 @@ - - * Paper size taken from Office Open XML Part 4 - Markup Language Reference, page 1988:. - * - * 1 = Letter paper (8.5 in. by 11 in.) - * 2 = Letter small paper (8.5 in. by 11 in.) - * 3 = Tabloid paper (11 in. by 17 in.) - * 4 = Ledger paper (17 in. by 11 in.) - * 5 = Legal paper (8.5 in. by 14 in.) - * 6 = Statement paper (5.5 in. by 8.5 in.) - * 7 = Executive paper (7.25 in. by 10.5 in.) - * 8 = A3 paper (297 mm by 420 mm) - * 9 = A4 paper (210 mm by 297 mm) - * 10 = A4 small paper (210 mm by 297 mm) - * 11 = A5 paper (148 mm by 210 mm) - * 12 = B4 paper (250 mm by 353 mm) - * 13 = B5 paper (176 mm by 250 mm) - * 14 = Folio paper (8.5 in. by 13 in.) - * 15 = Quarto paper (215 mm by 275 mm) - * 16 = Standard paper (10 in. by 14 in.) - * 17 = Standard paper (11 in. by 17 in.) - * 18 = Note paper (8.5 in. by 11 in.) - * 19 = #9 envelope (3.875 in. by 8.875 in.) - * 20 = #10 envelope (4.125 in. by 9.5 in.) - * 21 = #11 envelope (4.5 in. by 10.375 in.) - * 22 = #12 envelope (4.75 in. by 11 in.) - * 23 = #14 envelope (5 in. by 11.5 in.) - * 24 = C paper (17 in. by 22 in.) - * 25 = D paper (22 in. by 34 in.) - * 26 = E paper (34 in. by 44 in.) - * 27 = DL envelope (110 mm by 220 mm) - * 28 = C5 envelope (162 mm by 229 mm) - * 29 = C3 envelope (324 mm by 458 mm) - * 30 = C4 envelope (229 mm by 324 mm) - * 31 = C6 envelope (114 mm by 162 mm) - * 32 = C65 envelope (114 mm by 229 mm) - * 33 = B4 envelope (250 mm by 353 mm) - * 34 = B5 envelope (176 mm by 250 mm) - * 35 = B6 envelope (176 mm by 125 mm) - * 36 = Italy envelope (110 mm by 230 mm) - * 37 = Monarch envelope (3.875 in. by 7.5 in.). - * 38 = 6 3/4 envelope (3.625 in. by 6.5 in.) - * 39 = US standard fanfold (14.875 in. by 11 in.) - * 40 = German standard fanfold (8.5 in. by 12 in.) - * 41 = German legal fanfold (8.5 in. by 13 in.) - * 42 = ISO B4 (250 mm by 353 mm) - * 43 = Japanese double postcard (200 mm by 148 mm) - * 44 = Standard paper (9 in. by 11 in.) - * 45 = Standard paper (10 in. by 11 in.) - * 46 = Standard paper (15 in. by 11 in.) - * 47 = Invite envelope (220 mm by 220 mm) - * 50 = Letter extra paper (9.275 in. by 12 in.) - * 51 = Legal extra paper (9.275 in. by 15 in.) - * 52 = Tabloid extra paper (11.69 in. by 18 in.) - * 53 = A4 extra paper (236 mm by 322 mm) - * 54 = Letter transverse paper (8.275 in. by 11 in.) - * 55 = A4 transverse paper (210 mm by 297 mm) - * 56 = Letter extra transverse paper (9.275 in. by 12 in.) - * 57 = SuperA/SuperA/A4 paper (227 mm by 356 mm) - * 58 = SuperB/SuperB/A3 paper (305 mm by 487 mm) - * 59 = Letter plus paper (8.5 in. by 12.69 in.) - * 60 = A4 plus paper (210 mm by 330 mm) - * 61 = A5 transverse paper (148 mm by 210 mm) - * 62 = JIS B5 transverse paper (182 mm by 257 mm) - * 63 = A3 extra paper (322 mm by 445 mm) - * 64 = A5 extra paper (174 mm by 235 mm) - * 65 = ISO B5 extra paper (201 mm by 276 mm) - * 66 = A2 paper (420 mm by 594 mm) - * 67 = A3 transverse paper (297 mm by 420 mm) - * 68 = A3 extra transverse paper (322 mm by 445 mm) - * - */ -class PageSetup -{ - // Paper size - const PAPERSIZE_LETTER = 1; - const PAPERSIZE_LETTER_SMALL = 2; - const PAPERSIZE_TABLOID = 3; - const PAPERSIZE_LEDGER = 4; - const PAPERSIZE_LEGAL = 5; - const PAPERSIZE_STATEMENT = 6; - const PAPERSIZE_EXECUTIVE = 7; - const PAPERSIZE_A3 = 8; - const PAPERSIZE_A4 = 9; - const PAPERSIZE_A4_SMALL = 10; - const PAPERSIZE_A5 = 11; - const PAPERSIZE_B4 = 12; - const PAPERSIZE_B5 = 13; - const PAPERSIZE_FOLIO = 14; - const PAPERSIZE_QUARTO = 15; - const PAPERSIZE_STANDARD_1 = 16; - const PAPERSIZE_STANDARD_2 = 17; - const PAPERSIZE_NOTE = 18; - const PAPERSIZE_NO9_ENVELOPE = 19; - const PAPERSIZE_NO10_ENVELOPE = 20; - const PAPERSIZE_NO11_ENVELOPE = 21; - const PAPERSIZE_NO12_ENVELOPE = 22; - const PAPERSIZE_NO14_ENVELOPE = 23; - const PAPERSIZE_C = 24; - const PAPERSIZE_D = 25; - const PAPERSIZE_E = 26; - const PAPERSIZE_DL_ENVELOPE = 27; - const PAPERSIZE_C5_ENVELOPE = 28; - const PAPERSIZE_C3_ENVELOPE = 29; - const PAPERSIZE_C4_ENVELOPE = 30; - const PAPERSIZE_C6_ENVELOPE = 31; - const PAPERSIZE_C65_ENVELOPE = 32; - const PAPERSIZE_B4_ENVELOPE = 33; - const PAPERSIZE_B5_ENVELOPE = 34; - const PAPERSIZE_B6_ENVELOPE = 35; - const PAPERSIZE_ITALY_ENVELOPE = 36; - const PAPERSIZE_MONARCH_ENVELOPE = 37; - const PAPERSIZE_6_3_4_ENVELOPE = 38; - const PAPERSIZE_US_STANDARD_FANFOLD = 39; - const PAPERSIZE_GERMAN_STANDARD_FANFOLD = 40; - const PAPERSIZE_GERMAN_LEGAL_FANFOLD = 41; - const PAPERSIZE_ISO_B4 = 42; - const PAPERSIZE_JAPANESE_DOUBLE_POSTCARD = 43; - const PAPERSIZE_STANDARD_PAPER_1 = 44; - const PAPERSIZE_STANDARD_PAPER_2 = 45; - const PAPERSIZE_STANDARD_PAPER_3 = 46; - const PAPERSIZE_INVITE_ENVELOPE = 47; - const PAPERSIZE_LETTER_EXTRA_PAPER = 48; - const PAPERSIZE_LEGAL_EXTRA_PAPER = 49; - const PAPERSIZE_TABLOID_EXTRA_PAPER = 50; - const PAPERSIZE_A4_EXTRA_PAPER = 51; - const PAPERSIZE_LETTER_TRANSVERSE_PAPER = 52; - const PAPERSIZE_A4_TRANSVERSE_PAPER = 53; - const PAPERSIZE_LETTER_EXTRA_TRANSVERSE_PAPER = 54; - const PAPERSIZE_SUPERA_SUPERA_A4_PAPER = 55; - const PAPERSIZE_SUPERB_SUPERB_A3_PAPER = 56; - const PAPERSIZE_LETTER_PLUS_PAPER = 57; - const PAPERSIZE_A4_PLUS_PAPER = 58; - const PAPERSIZE_A5_TRANSVERSE_PAPER = 59; - const PAPERSIZE_JIS_B5_TRANSVERSE_PAPER = 60; - const PAPERSIZE_A3_EXTRA_PAPER = 61; - const PAPERSIZE_A5_EXTRA_PAPER = 62; - const PAPERSIZE_ISO_B5_EXTRA_PAPER = 63; - const PAPERSIZE_A2_PAPER = 64; - const PAPERSIZE_A3_TRANSVERSE_PAPER = 65; - const PAPERSIZE_A3_EXTRA_TRANSVERSE_PAPER = 66; - - // Page orientation - const ORIENTATION_DEFAULT = 'default'; - const ORIENTATION_LANDSCAPE = 'landscape'; - const ORIENTATION_PORTRAIT = 'portrait'; - - // Print Range Set Method - const SETPRINTRANGE_OVERWRITE = 'O'; - const SETPRINTRANGE_INSERT = 'I'; - - const PAGEORDER_OVER_THEN_DOWN = 'overThenDown'; - const PAGEORDER_DOWN_THEN_OVER = 'downThenOver'; - - /** - * Paper size. - * - * @var int - */ - private $paperSize = self::PAPERSIZE_LETTER; - - /** - * Orientation. - * - * @var string - */ - private $orientation = self::ORIENTATION_DEFAULT; - - /** - * Scale (Print Scale). - * - * Print scaling. Valid values range from 10 to 400 - * This setting is overridden when fitToWidth and/or fitToHeight are in use - * - * @var null|int - */ - private $scale = 100; - - /** - * Fit To Page - * Whether scale or fitToWith / fitToHeight applies. - * - * @var bool - */ - private $fitToPage = false; - - /** - * Fit To Height - * Number of vertical pages to fit on. - * - * @var null|int - */ - private $fitToHeight = 1; - - /** - * Fit To Width - * Number of horizontal pages to fit on. - * - * @var null|int - */ - private $fitToWidth = 1; - - /** - * Columns to repeat at left. - * - * @var array Containing start column and end column, empty array if option unset - */ - private $columnsToRepeatAtLeft = ['', '']; - - /** - * Rows to repeat at top. - * - * @var array Containing start row number and end row number, empty array if option unset - */ - private $rowsToRepeatAtTop = [0, 0]; - - /** - * Center page horizontally. - * - * @var bool - */ - private $horizontalCentered = false; - - /** - * Center page vertically. - * - * @var bool - */ - private $verticalCentered = false; - - /** - * Print area. - * - * @var string - */ - private $printArea; - - /** - * First page number. - * - * @var int - */ - private $firstPageNumber; - - private $pageOrder = self::PAGEORDER_DOWN_THEN_OVER; - - /** - * Create a new PageSetup. - */ - public function __construct() - { - } - - /** - * Get Paper Size. - * - * @return int - */ - public function getPaperSize() - { - return $this->paperSize; - } - - /** - * Set Paper Size. - * - * @param int $pValue see self::PAPERSIZE_* - * - * @return $this - */ - public function setPaperSize($pValue) - { - $this->paperSize = $pValue; - - return $this; - } - - /** - * Get Orientation. - * - * @return string - */ - public function getOrientation() - { - return $this->orientation; - } - - /** - * Set Orientation. - * - * @param string $pValue see self::ORIENTATION_* - * - * @return $this - */ - public function setOrientation($pValue) - { - $this->orientation = $pValue; - - return $this; - } - - /** - * Get Scale. - * - * @return null|int - */ - public function getScale() - { - return $this->scale; - } - - /** - * Set Scale. - * Print scaling. Valid values range from 10 to 400 - * This setting is overridden when fitToWidth and/or fitToHeight are in use. - * - * @param null|int $pValue - * @param bool $pUpdate Update fitToPage so scaling applies rather than fitToHeight / fitToWidth - * - * @return $this - */ - public function setScale($pValue, $pUpdate = true) - { - // Microsoft Office Excel 2007 only allows setting a scale between 10 and 400 via the user interface, - // but it is apparently still able to handle any scale >= 0, where 0 results in 100 - if (($pValue >= 0) || $pValue === null) { - $this->scale = $pValue; - if ($pUpdate) { - $this->fitToPage = false; - } - } else { - throw new PhpSpreadsheetException('Scale must not be negative'); - } - - return $this; - } - - /** - * Get Fit To Page. - * - * @return bool - */ - public function getFitToPage() - { - return $this->fitToPage; - } - - /** - * Set Fit To Page. - * - * @param bool $pValue - * - * @return $this - */ - public function setFitToPage($pValue) - { - $this->fitToPage = $pValue; - - return $this; - } - - /** - * Get Fit To Height. - * - * @return null|int - */ - public function getFitToHeight() - { - return $this->fitToHeight; - } - - /** - * Set Fit To Height. - * - * @param null|int $pValue - * @param bool $pUpdate Update fitToPage so it applies rather than scaling - * - * @return $this - */ - public function setFitToHeight($pValue, $pUpdate = true) - { - $this->fitToHeight = $pValue; - if ($pUpdate) { - $this->fitToPage = true; - } - - return $this; - } - - /** - * Get Fit To Width. - * - * @return null|int - */ - public function getFitToWidth() - { - return $this->fitToWidth; - } - - /** - * Set Fit To Width. - * - * @param null|int $pValue - * @param bool $pUpdate Update fitToPage so it applies rather than scaling - * - * @return $this - */ - public function setFitToWidth($pValue, $pUpdate = true) - { - $this->fitToWidth = $pValue; - if ($pUpdate) { - $this->fitToPage = true; - } - - return $this; - } - - /** - * Is Columns to repeat at left set? - * - * @return bool - */ - public function isColumnsToRepeatAtLeftSet() - { - if (is_array($this->columnsToRepeatAtLeft)) { - if ($this->columnsToRepeatAtLeft[0] != '' && $this->columnsToRepeatAtLeft[1] != '') { - return true; - } - } - - return false; - } - - /** - * Get Columns to repeat at left. - * - * @return array Containing start column and end column, empty array if option unset - */ - public function getColumnsToRepeatAtLeft() - { - return $this->columnsToRepeatAtLeft; - } - - /** - * Set Columns to repeat at left. - * - * @param array $pValue Containing start column and end column, empty array if option unset - * - * @return $this - */ - public function setColumnsToRepeatAtLeft(array $pValue) - { - $this->columnsToRepeatAtLeft = $pValue; - - return $this; - } - - /** - * Set Columns to repeat at left by start and end. - * - * @param string $pStart eg: 'A' - * @param string $pEnd eg: 'B' - * - * @return $this - */ - public function setColumnsToRepeatAtLeftByStartAndEnd($pStart, $pEnd) - { - $this->columnsToRepeatAtLeft = [$pStart, $pEnd]; - - return $this; - } - - /** - * Is Rows to repeat at top set? - * - * @return bool - */ - public function isRowsToRepeatAtTopSet() - { - if (is_array($this->rowsToRepeatAtTop)) { - if ($this->rowsToRepeatAtTop[0] != 0 && $this->rowsToRepeatAtTop[1] != 0) { - return true; - } - } - - return false; - } - - /** - * Get Rows to repeat at top. - * - * @return array Containing start column and end column, empty array if option unset - */ - public function getRowsToRepeatAtTop() - { - return $this->rowsToRepeatAtTop; - } - - /** - * Set Rows to repeat at top. - * - * @param array $pValue Containing start column and end column, empty array if option unset - * - * @return $this - */ - public function setRowsToRepeatAtTop(array $pValue) - { - $this->rowsToRepeatAtTop = $pValue; - - return $this; - } - - /** - * Set Rows to repeat at top by start and end. - * - * @param int $pStart eg: 1 - * @param int $pEnd eg: 1 - * - * @return $this - */ - public function setRowsToRepeatAtTopByStartAndEnd($pStart, $pEnd) - { - $this->rowsToRepeatAtTop = [$pStart, $pEnd]; - - return $this; - } - - /** - * Get center page horizontally. - * - * @return bool - */ - public function getHorizontalCentered() - { - return $this->horizontalCentered; - } - - /** - * Set center page horizontally. - * - * @param bool $value - * - * @return $this - */ - public function setHorizontalCentered($value) - { - $this->horizontalCentered = $value; - - return $this; - } - - /** - * Get center page vertically. - * - * @return bool - */ - public function getVerticalCentered() - { - return $this->verticalCentered; - } - - /** - * Set center page vertically. - * - * @param bool $value - * - * @return $this - */ - public function setVerticalCentered($value) - { - $this->verticalCentered = $value; - - return $this; - } - - /** - * Get print area. - * - * @param int $index Identifier for a specific print area range if several ranges have been set - * Default behaviour, or a index value of 0, will return all ranges as a comma-separated string - * Otherwise, the specific range identified by the value of $index will be returned - * Print areas are numbered from 1 - * - * @return string - */ - public function getPrintArea($index = 0) - { - if ($index == 0) { - return $this->printArea; - } - $printAreas = explode(',', $this->printArea); - if (isset($printAreas[$index - 1])) { - return $printAreas[$index - 1]; - } - - throw new PhpSpreadsheetException('Requested Print Area does not exist'); - } - - /** - * Is print area set? - * - * @param int $index Identifier for a specific print area range if several ranges have been set - * Default behaviour, or an index value of 0, will identify whether any print range is set - * Otherwise, existence of the range identified by the value of $index will be returned - * Print areas are numbered from 1 - * - * @return bool - */ - public function isPrintAreaSet($index = 0) - { - if ($index == 0) { - return $this->printArea !== null; - } - $printAreas = explode(',', $this->printArea); - - return isset($printAreas[$index - 1]); - } - - /** - * Clear a print area. - * - * @param int $index Identifier for a specific print area range if several ranges have been set - * Default behaviour, or an index value of 0, will clear all print ranges that are set - * Otherwise, the range identified by the value of $index will be removed from the series - * Print areas are numbered from 1 - * - * @return $this - */ - public function clearPrintArea($index = 0) - { - if ($index == 0) { - $this->printArea = null; - } else { - $printAreas = explode(',', $this->printArea); - if (isset($printAreas[$index - 1])) { - unset($printAreas[$index - 1]); - $this->printArea = implode(',', $printAreas); - } - } - - return $this; - } - - /** - * Set print area. e.g. 'A1:D10' or 'A1:D10,G5:M20'. - * - * @param string $value - * @param int $index Identifier for a specific print area range allowing several ranges to be set - * When the method is "O"verwrite, then a positive integer index will overwrite that indexed - * entry in the print areas list; a negative index value will identify which entry to - * overwrite working bacward through the print area to the list, with the last entry as -1. - * Specifying an index value of 0, will overwrite all existing print ranges. - * When the method is "I"nsert, then a positive index will insert after that indexed entry in - * the print areas list, while a negative index will insert before the indexed entry. - * Specifying an index value of 0, will always append the new print range at the end of the - * list. - * Print areas are numbered from 1 - * @param string $method Determines the method used when setting multiple print areas - * Default behaviour, or the "O" method, overwrites existing print area - * The "I" method, inserts the new print area before any specified index, or at the end of the list - * - * @return $this - */ - public function setPrintArea($value, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) - { - if (strpos($value, '!') !== false) { - throw new PhpSpreadsheetException('Cell coordinate must not specify a worksheet.'); - } elseif (strpos($value, ':') === false) { - throw new PhpSpreadsheetException('Cell coordinate must be a range of cells.'); - } elseif (strpos($value, '$') !== false) { - throw new PhpSpreadsheetException('Cell coordinate must not be absolute.'); - } - $value = strtoupper($value); - if (!$this->printArea) { - $index = 0; - } - - if ($method == self::SETPRINTRANGE_OVERWRITE) { - if ($index == 0) { - $this->printArea = $value; - } else { - $printAreas = explode(',', $this->printArea); - if ($index < 0) { - $index = count($printAreas) - abs($index) + 1; - } - if (($index <= 0) || ($index > count($printAreas))) { - throw new PhpSpreadsheetException('Invalid index for setting print range.'); - } - $printAreas[$index - 1] = $value; - $this->printArea = implode(',', $printAreas); - } - } elseif ($method == self::SETPRINTRANGE_INSERT) { - if ($index == 0) { - $this->printArea = $this->printArea ? ($this->printArea . ',' . $value) : $value; - } else { - $printAreas = explode(',', $this->printArea); - if ($index < 0) { - $index = abs($index) - 1; - } - if ($index > count($printAreas)) { - throw new PhpSpreadsheetException('Invalid index for setting print range.'); - } - $printAreas = array_merge(array_slice($printAreas, 0, $index), [$value], array_slice($printAreas, $index)); - $this->printArea = implode(',', $printAreas); - } - } else { - throw new PhpSpreadsheetException('Invalid method for setting print range.'); - } - - return $this; - } - - /** - * Add a new print area (e.g. 'A1:D10' or 'A1:D10,G5:M20') to the list of print areas. - * - * @param string $value - * @param int $index Identifier for a specific print area range allowing several ranges to be set - * A positive index will insert after that indexed entry in the print areas list, while a - * negative index will insert before the indexed entry. - * Specifying an index value of 0, will always append the new print range at the end of the - * list. - * Print areas are numbered from 1 - * - * @return $this - */ - public function addPrintArea($value, $index = -1) - { - return $this->setPrintArea($value, $index, self::SETPRINTRANGE_INSERT); - } - - /** - * Set print area. - * - * @param int $column1 Column 1 - * @param int $row1 Row 1 - * @param int $column2 Column 2 - * @param int $row2 Row 2 - * @param int $index Identifier for a specific print area range allowing several ranges to be set - * When the method is "O"verwrite, then a positive integer index will overwrite that indexed - * entry in the print areas list; a negative index value will identify which entry to - * overwrite working backward through the print area to the list, with the last entry as -1. - * Specifying an index value of 0, will overwrite all existing print ranges. - * When the method is "I"nsert, then a positive index will insert after that indexed entry in - * the print areas list, while a negative index will insert before the indexed entry. - * Specifying an index value of 0, will always append the new print range at the end of the - * list. - * Print areas are numbered from 1 - * @param string $method Determines the method used when setting multiple print areas - * Default behaviour, or the "O" method, overwrites existing print area - * The "I" method, inserts the new print area before any specified index, or at the end of the list - * - * @return $this - */ - public function setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) - { - return $this->setPrintArea( - Coordinate::stringFromColumnIndex($column1) . $row1 . ':' . Coordinate::stringFromColumnIndex($column2) . $row2, - $index, - $method - ); - } - - /** - * Add a new print area to the list of print areas. - * - * @param int $column1 Start Column for the print area - * @param int $row1 Start Row for the print area - * @param int $column2 End Column for the print area - * @param int $row2 End Row for the print area - * @param int $index Identifier for a specific print area range allowing several ranges to be set - * A positive index will insert after that indexed entry in the print areas list, while a - * negative index will insert before the indexed entry. - * Specifying an index value of 0, will always append the new print range at the end of the - * list. - * Print areas are numbered from 1 - * - * @return $this - */ - public function addPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = -1) - { - return $this->setPrintArea( - Coordinate::stringFromColumnIndex($column1) . $row1 . ':' . Coordinate::stringFromColumnIndex($column2) . $row2, - $index, - self::SETPRINTRANGE_INSERT - ); - } - - /** - * Get first page number. - * - * @return int - */ - public function getFirstPageNumber() - { - return $this->firstPageNumber; - } - - /** - * Set first page number. - * - * @param int $value - * - * @return $this - */ - public function setFirstPageNumber($value) - { - $this->firstPageNumber = $value; - - return $this; - } - - /** - * Reset first page number. - * - * @return $this - */ - public function resetFirstPageNumber() - { - return $this->setFirstPageNumber(null); - } - - public function getPageOrder(): string - { - return $this->pageOrder; - } - - public function setPageOrder(?string $pageOrder): self - { - if ($pageOrder === null || $pageOrder === self::PAGEORDER_DOWN_THEN_OVER || $pageOrder === self::PAGEORDER_OVER_THEN_DOWN) { - $this->pageOrder = $pageOrder ?? self::PAGEORDER_DOWN_THEN_OVER; - } - - return $this; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Protection.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Protection.php deleted file mode 100644 index ba3af0a..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Protection.php +++ /dev/null @@ -1,691 +0,0 @@ -sheet || - $this->objects || - $this->scenarios || - $this->formatCells || - $this->formatColumns || - $this->formatRows || - $this->insertColumns || - $this->insertRows || - $this->insertHyperlinks || - $this->deleteColumns || - $this->deleteRows || - $this->selectLockedCells || - $this->sort || - $this->autoFilter || - $this->pivotTables || - $this->selectUnlockedCells; - } - - /** - * Get Sheet. - * - * @return bool - */ - public function getSheet() - { - return $this->sheet; - } - - /** - * Set Sheet. - * - * @param bool $pValue - * - * @return $this - */ - public function setSheet($pValue) - { - $this->sheet = $pValue; - - return $this; - } - - /** - * Get Objects. - * - * @return bool - */ - public function getObjects() - { - return $this->objects; - } - - /** - * Set Objects. - * - * @param bool $pValue - * - * @return $this - */ - public function setObjects($pValue) - { - $this->objects = $pValue; - - return $this; - } - - /** - * Get Scenarios. - * - * @return bool - */ - public function getScenarios() - { - return $this->scenarios; - } - - /** - * Set Scenarios. - * - * @param bool $pValue - * - * @return $this - */ - public function setScenarios($pValue) - { - $this->scenarios = $pValue; - - return $this; - } - - /** - * Get FormatCells. - * - * @return bool - */ - public function getFormatCells() - { - return $this->formatCells; - } - - /** - * Set FormatCells. - * - * @param bool $pValue - * - * @return $this - */ - public function setFormatCells($pValue) - { - $this->formatCells = $pValue; - - return $this; - } - - /** - * Get FormatColumns. - * - * @return bool - */ - public function getFormatColumns() - { - return $this->formatColumns; - } - - /** - * Set FormatColumns. - * - * @param bool $pValue - * - * @return $this - */ - public function setFormatColumns($pValue) - { - $this->formatColumns = $pValue; - - return $this; - } - - /** - * Get FormatRows. - * - * @return bool - */ - public function getFormatRows() - { - return $this->formatRows; - } - - /** - * Set FormatRows. - * - * @param bool $pValue - * - * @return $this - */ - public function setFormatRows($pValue) - { - $this->formatRows = $pValue; - - return $this; - } - - /** - * Get InsertColumns. - * - * @return bool - */ - public function getInsertColumns() - { - return $this->insertColumns; - } - - /** - * Set InsertColumns. - * - * @param bool $pValue - * - * @return $this - */ - public function setInsertColumns($pValue) - { - $this->insertColumns = $pValue; - - return $this; - } - - /** - * Get InsertRows. - * - * @return bool - */ - public function getInsertRows() - { - return $this->insertRows; - } - - /** - * Set InsertRows. - * - * @param bool $pValue - * - * @return $this - */ - public function setInsertRows($pValue) - { - $this->insertRows = $pValue; - - return $this; - } - - /** - * Get InsertHyperlinks. - * - * @return bool - */ - public function getInsertHyperlinks() - { - return $this->insertHyperlinks; - } - - /** - * Set InsertHyperlinks. - * - * @param bool $pValue - * - * @return $this - */ - public function setInsertHyperlinks($pValue) - { - $this->insertHyperlinks = $pValue; - - return $this; - } - - /** - * Get DeleteColumns. - * - * @return bool - */ - public function getDeleteColumns() - { - return $this->deleteColumns; - } - - /** - * Set DeleteColumns. - * - * @param bool $pValue - * - * @return $this - */ - public function setDeleteColumns($pValue) - { - $this->deleteColumns = $pValue; - - return $this; - } - - /** - * Get DeleteRows. - * - * @return bool - */ - public function getDeleteRows() - { - return $this->deleteRows; - } - - /** - * Set DeleteRows. - * - * @param bool $pValue - * - * @return $this - */ - public function setDeleteRows($pValue) - { - $this->deleteRows = $pValue; - - return $this; - } - - /** - * Get SelectLockedCells. - * - * @return bool - */ - public function getSelectLockedCells() - { - return $this->selectLockedCells; - } - - /** - * Set SelectLockedCells. - * - * @param bool $pValue - * - * @return $this - */ - public function setSelectLockedCells($pValue) - { - $this->selectLockedCells = $pValue; - - return $this; - } - - /** - * Get Sort. - * - * @return bool - */ - public function getSort() - { - return $this->sort; - } - - /** - * Set Sort. - * - * @param bool $pValue - * - * @return $this - */ - public function setSort($pValue) - { - $this->sort = $pValue; - - return $this; - } - - /** - * Get AutoFilter. - * - * @return bool - */ - public function getAutoFilter() - { - return $this->autoFilter; - } - - /** - * Set AutoFilter. - * - * @param bool $pValue - * - * @return $this - */ - public function setAutoFilter($pValue) - { - $this->autoFilter = $pValue; - - return $this; - } - - /** - * Get PivotTables. - * - * @return bool - */ - public function getPivotTables() - { - return $this->pivotTables; - } - - /** - * Set PivotTables. - * - * @param bool $pValue - * - * @return $this - */ - public function setPivotTables($pValue) - { - $this->pivotTables = $pValue; - - return $this; - } - - /** - * Get SelectUnlockedCells. - * - * @return bool - */ - public function getSelectUnlockedCells() - { - return $this->selectUnlockedCells; - } - - /** - * Set SelectUnlockedCells. - * - * @param bool $pValue - * - * @return $this - */ - public function setSelectUnlockedCells($pValue) - { - $this->selectUnlockedCells = $pValue; - - return $this; - } - - /** - * Get hashed password. - * - * @return string - */ - public function getPassword() - { - return $this->password; - } - - /** - * Set Password. - * - * @param string $pValue - * @param bool $pAlreadyHashed If the password has already been hashed, set this to true - * - * @return $this - */ - public function setPassword($pValue, $pAlreadyHashed = false) - { - if (!$pAlreadyHashed) { - $salt = $this->generateSalt(); - $this->setSalt($salt); - $pValue = PasswordHasher::hashPassword($pValue, $this->getAlgorithm(), $this->getSalt(), $this->getSpinCount()); - } - - $this->password = $pValue; - - return $this; - } - - /** - * Create a pseudorandom string. - */ - private function generateSalt(): string - { - return base64_encode(random_bytes(16)); - } - - /** - * Get algorithm name. - */ - public function getAlgorithm(): string - { - return $this->algorithm; - } - - /** - * Set algorithm name. - */ - public function setAlgorithm(string $algorithm): void - { - $this->algorithm = $algorithm; - } - - /** - * Get salt value. - */ - public function getSalt(): string - { - return $this->salt; - } - - /** - * Set salt value. - */ - public function setSalt(string $salt): void - { - $this->salt = $salt; - } - - /** - * Get spin count. - */ - public function getSpinCount(): int - { - return $this->spinCount; - } - - /** - * Set spin count. - */ - public function setSpinCount(int $spinCount): void - { - $this->spinCount = $spinCount; - } - - /** - * Verify that the given non-hashed password can "unlock" the protection. - */ - public function verify(string $password): bool - { - if (!$this->isProtectionEnabled()) { - return true; - } - - $hash = PasswordHasher::hashPassword($password, $this->getAlgorithm(), $this->getSalt(), $this->getSpinCount()); - - return $this->getPassword() === $hash; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Row.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Row.php deleted file mode 100644 index 4f48a34..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Row.php +++ /dev/null @@ -1,74 +0,0 @@ -worksheet = $worksheet; - $this->rowIndex = $rowIndex; - } - - /** - * Destructor. - */ - public function __destruct() - { - $this->worksheet = null; - } - - /** - * Get row index. - * - * @return int - */ - public function getRowIndex() - { - return $this->rowIndex; - } - - /** - * Get cell iterator. - * - * @param string $startColumn The column address at which to start iterating - * @param string $endColumn Optionally, the column address at which to stop iterating - * - * @return RowCellIterator - */ - public function getCellIterator($startColumn = 'A', $endColumn = null) - { - return new RowCellIterator($this->worksheet, $this->rowIndex, $startColumn, $endColumn); - } - - /** - * Returns bound worksheet. - * - * @return Worksheet - */ - public function getWorksheet() - { - return $this->worksheet; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php deleted file mode 100644 index f5576dc..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php +++ /dev/null @@ -1,195 +0,0 @@ -worksheet = $worksheet; - $this->rowIndex = $rowIndex; - $this->resetEnd($endColumn); - $this->resetStart($startColumn); - } - - /** - * (Re)Set the start column and the current column pointer. - * - * @param string $startColumn The column address at which to start iterating - * - * @return $this - */ - public function resetStart($startColumn = 'A') - { - $this->startColumnIndex = Coordinate::columnIndexFromString($startColumn); - $this->adjustForExistingOnlyRange(); - $this->seek(Coordinate::stringFromColumnIndex($this->startColumnIndex)); - - return $this; - } - - /** - * (Re)Set the end column. - * - * @param string $endColumn The column address at which to stop iterating - * - * @return $this - */ - public function resetEnd($endColumn = null) - { - $endColumn = $endColumn ? $endColumn : $this->worksheet->getHighestColumn(); - $this->endColumnIndex = Coordinate::columnIndexFromString($endColumn); - $this->adjustForExistingOnlyRange(); - - return $this; - } - - /** - * Set the column pointer to the selected column. - * - * @param string $column The column address to set the current pointer at - * - * @return $this - */ - public function seek($column = 'A') - { - $column = Coordinate::columnIndexFromString($column); - if (($column < $this->startColumnIndex) || ($column > $this->endColumnIndex)) { - throw new PhpSpreadsheetException("Column $column is out of range ({$this->startColumnIndex} - {$this->endColumnIndex})"); - } elseif ($this->onlyExistingCells && !($this->worksheet->cellExistsByColumnAndRow($column, $this->rowIndex))) { - throw new PhpSpreadsheetException('In "IterateOnlyExistingCells" mode and Cell does not exist'); - } - $this->currentColumnIndex = $column; - - return $this; - } - - /** - * Rewind the iterator to the starting column. - */ - public function rewind(): void - { - $this->currentColumnIndex = $this->startColumnIndex; - } - - /** - * Return the current cell in this worksheet row. - * - * @return \PhpOffice\PhpSpreadsheet\Cell\Cell - */ - public function current() - { - return $this->worksheet->getCellByColumnAndRow($this->currentColumnIndex, $this->rowIndex); - } - - /** - * Return the current iterator key. - * - * @return string - */ - public function key() - { - return Coordinate::stringFromColumnIndex($this->currentColumnIndex); - } - - /** - * Set the iterator to its next value. - */ - public function next(): void - { - do { - ++$this->currentColumnIndex; - } while (($this->onlyExistingCells) && (!$this->worksheet->cellExistsByColumnAndRow($this->currentColumnIndex, $this->rowIndex)) && ($this->currentColumnIndex <= $this->endColumnIndex)); - } - - /** - * Set the iterator to its previous value. - */ - public function prev(): void - { - do { - --$this->currentColumnIndex; - } while (($this->onlyExistingCells) && (!$this->worksheet->cellExistsByColumnAndRow($this->currentColumnIndex, $this->rowIndex)) && ($this->currentColumnIndex >= $this->startColumnIndex)); - } - - /** - * Indicate if more columns exist in the worksheet range of columns that we're iterating. - * - * @return bool - */ - public function valid() - { - return $this->currentColumnIndex <= $this->endColumnIndex && $this->currentColumnIndex >= $this->startColumnIndex; - } - - /** - * Return the current iterator position. - * - * @return int - */ - public function getCurrentColumnIndex() - { - return $this->currentColumnIndex; - } - - /** - * Validate start/end values for "IterateOnlyExistingCells" mode, and adjust if necessary. - */ - protected function adjustForExistingOnlyRange(): void - { - if ($this->onlyExistingCells) { - while ((!$this->worksheet->cellExistsByColumnAndRow($this->startColumnIndex, $this->rowIndex)) && ($this->startColumnIndex <= $this->endColumnIndex)) { - ++$this->startColumnIndex; - } - if ($this->startColumnIndex > $this->endColumnIndex) { - throw new PhpSpreadsheetException('No cells exist within the specified range'); - } - while ((!$this->worksheet->cellExistsByColumnAndRow($this->endColumnIndex, $this->rowIndex)) && ($this->endColumnIndex >= $this->startColumnIndex)) { - --$this->endColumnIndex; - } - if ($this->endColumnIndex < $this->startColumnIndex) { - throw new PhpSpreadsheetException('No cells exist within the specified range'); - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowDimension.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowDimension.php deleted file mode 100644 index c4a87bd..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowDimension.php +++ /dev/null @@ -1,115 +0,0 @@ -rowIndex = $pIndex; - - // set dimension as unformatted by default - parent::__construct(null); - } - - /** - * Get Row Index. - * - * @return int - */ - public function getRowIndex() - { - return $this->rowIndex; - } - - /** - * Set Row Index. - * - * @param int $pValue - * - * @return $this - */ - public function setRowIndex($pValue) - { - $this->rowIndex = $pValue; - - return $this; - } - - /** - * Get Row Height. - * - * @return float - */ - public function getRowHeight() - { - return $this->height; - } - - /** - * Set Row Height. - * - * @param float $pValue - * - * @return $this - */ - public function setRowHeight($pValue) - { - $this->height = $pValue; - - return $this; - } - - /** - * Get ZeroHeight. - * - * @return bool - */ - public function getZeroHeight() - { - return $this->zeroHeight; - } - - /** - * Set ZeroHeight. - * - * @param bool $pValue - * - * @return $this - */ - public function setZeroHeight($pValue) - { - $this->zeroHeight = $pValue; - - return $this; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php deleted file mode 100644 index 4254253..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php +++ /dev/null @@ -1,167 +0,0 @@ -subject = $subject; - $this->resetEnd($endRow); - $this->resetStart($startRow); - } - - /** - * Destructor. - */ - public function __destruct() - { - $this->subject = null; - } - - /** - * (Re)Set the start row and the current row pointer. - * - * @param int $startRow The row number at which to start iterating - * - * @return $this - */ - public function resetStart($startRow = 1) - { - if ($startRow > $this->subject->getHighestRow()) { - throw new PhpSpreadsheetException("Start row ({$startRow}) is beyond highest row ({$this->subject->getHighestRow()})"); - } - - $this->startRow = $startRow; - if ($this->endRow < $this->startRow) { - $this->endRow = $this->startRow; - } - $this->seek($startRow); - - return $this; - } - - /** - * (Re)Set the end row. - * - * @param int $endRow The row number at which to stop iterating - * - * @return $this - */ - public function resetEnd($endRow = null) - { - $this->endRow = ($endRow) ? $endRow : $this->subject->getHighestRow(); - - return $this; - } - - /** - * Set the row pointer to the selected row. - * - * @param int $row The row number to set the current pointer at - * - * @return $this - */ - public function seek($row = 1) - { - if (($row < $this->startRow) || ($row > $this->endRow)) { - throw new PhpSpreadsheetException("Row $row is out of range ({$this->startRow} - {$this->endRow})"); - } - $this->position = $row; - - return $this; - } - - /** - * Rewind the iterator to the starting row. - */ - public function rewind(): void - { - $this->position = $this->startRow; - } - - /** - * Return the current row in this worksheet. - * - * @return Row - */ - public function current() - { - return new Row($this->subject, $this->position); - } - - /** - * Return the current iterator key. - * - * @return int - */ - public function key() - { - return $this->position; - } - - /** - * Set the iterator to its next value. - */ - public function next(): void - { - ++$this->position; - } - - /** - * Set the iterator to its previous value. - */ - public function prev(): void - { - --$this->position; - } - - /** - * Indicate if more rows exist in the worksheet range of rows that we're iterating. - * - * @return bool - */ - public function valid() - { - return $this->position <= $this->endRow && $this->position >= $this->startRow; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/SheetView.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/SheetView.php deleted file mode 100644 index 2f7d381..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/SheetView.php +++ /dev/null @@ -1,193 +0,0 @@ -zoomScale; - } - - /** - * Set ZoomScale. - * Valid values range from 10 to 400. - * - * @param int $pValue - * - * @return $this - */ - public function setZoomScale($pValue) - { - // Microsoft Office Excel 2007 only allows setting a scale between 10 and 400 via the user interface, - // but it is apparently still able to handle any scale >= 1 - if (($pValue >= 1) || $pValue === null) { - $this->zoomScale = $pValue; - } else { - throw new PhpSpreadsheetException('Scale must be greater than or equal to 1.'); - } - - return $this; - } - - /** - * Get ZoomScaleNormal. - * - * @return int - */ - public function getZoomScaleNormal() - { - return $this->zoomScaleNormal; - } - - /** - * Set ZoomScale. - * Valid values range from 10 to 400. - * - * @param int $pValue - * - * @return $this - */ - public function setZoomScaleNormal($pValue) - { - if (($pValue >= 1) || $pValue === null) { - $this->zoomScaleNormal = $pValue; - } else { - throw new PhpSpreadsheetException('Scale must be greater than or equal to 1.'); - } - - return $this; - } - - /** - * Set ShowZeroes setting. - * - * @param bool $pValue - */ - public function setShowZeros($pValue): void - { - $this->showZeros = $pValue; - } - - /** - * @return bool - */ - public function getShowZeros() - { - return $this->showZeros; - } - - /** - * Get View. - * - * @return string - */ - public function getView() - { - return $this->sheetviewType; - } - - /** - * Set View. - * - * Valid values are - * 'normal' self::SHEETVIEW_NORMAL - * 'pageLayout' self::SHEETVIEW_PAGE_LAYOUT - * 'pageBreakPreview' self::SHEETVIEW_PAGE_BREAK_PREVIEW - * - * @param string $pValue - * - * @return $this - */ - public function setView($pValue) - { - // MS Excel 2007 allows setting the view to 'normal', 'pageLayout' or 'pageBreakPreview' via the user interface - if ($pValue === null) { - $pValue = self::SHEETVIEW_NORMAL; - } - if (in_array($pValue, self::$sheetViewTypes)) { - $this->sheetviewType = $pValue; - } else { - throw new PhpSpreadsheetException('Invalid sheetview layout type.'); - } - - return $this; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - $vars = get_object_vars($this); - foreach ($vars as $key => $value) { - if (is_object($value)) { - $this->$key = clone $value; - } else { - $this->$key = $value; - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php deleted file mode 100644 index 19833b7..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php +++ /dev/null @@ -1,3019 +0,0 @@ -parent = $parent; - $this->setTitle($pTitle, false); - // setTitle can change $pTitle - $this->setCodeName($this->getTitle()); - $this->setSheetState(self::SHEETSTATE_VISIBLE); - - $this->cellCollection = CellsFactory::getInstance($this); - // Set page setup - $this->pageSetup = new PageSetup(); - // Set page margins - $this->pageMargins = new PageMargins(); - // Set page header/footer - $this->headerFooter = new HeaderFooter(); - // Set sheet view - $this->sheetView = new SheetView(); - // Drawing collection - $this->drawingCollection = new ArrayObject(); - // Chart collection - $this->chartCollection = new ArrayObject(); - // Protection - $this->protection = new Protection(); - // Default row dimension - $this->defaultRowDimension = new RowDimension(null); - // Default column dimension - $this->defaultColumnDimension = new ColumnDimension(null); - $this->autoFilter = new AutoFilter(null, $this); - } - - /** - * Disconnect all cells from this Worksheet object, - * typically so that the worksheet object can be unset. - */ - public function disconnectCells(): void - { - if ($this->cellCollection !== null) { - $this->cellCollection->unsetWorksheetCells(); - $this->cellCollection = null; - } - // detach ourself from the workbook, so that it can then delete this worksheet successfully - $this->parent = null; - } - - /** - * Code to execute when this worksheet is unset(). - */ - public function __destruct() - { - Calculation::getInstance($this->parent)->clearCalculationCacheForWorksheet($this->title); - - $this->disconnectCells(); - } - - /** - * Return the cell collection. - * - * @return Cells - */ - public function getCellCollection() - { - return $this->cellCollection; - } - - /** - * Get array of invalid characters for sheet title. - * - * @return array - */ - public static function getInvalidCharacters() - { - return self::$invalidCharacters; - } - - /** - * Check sheet code name for valid Excel syntax. - * - * @param string $pValue The string to check - * - * @return string The valid string - */ - private static function checkSheetCodeName($pValue) - { - $CharCount = Shared\StringHelper::countCharacters($pValue); - if ($CharCount == 0) { - throw new Exception('Sheet code name cannot be empty.'); - } - // Some of the printable ASCII characters are invalid: * : / \ ? [ ] and first and last characters cannot be a "'" - if ( - (str_replace(self::$invalidCharacters, '', $pValue) !== $pValue) || - (Shared\StringHelper::substring($pValue, -1, 1) == '\'') || - (Shared\StringHelper::substring($pValue, 0, 1) == '\'') - ) { - throw new Exception('Invalid character found in sheet code name'); - } - - // Enforce maximum characters allowed for sheet title - if ($CharCount > self::SHEET_TITLE_MAXIMUM_LENGTH) { - throw new Exception('Maximum ' . self::SHEET_TITLE_MAXIMUM_LENGTH . ' characters allowed in sheet code name.'); - } - - return $pValue; - } - - /** - * Check sheet title for valid Excel syntax. - * - * @param string $pValue The string to check - * - * @return string The valid string - */ - private static function checkSheetTitle($pValue) - { - // Some of the printable ASCII characters are invalid: * : / \ ? [ ] - if (str_replace(self::$invalidCharacters, '', $pValue) !== $pValue) { - throw new Exception('Invalid character found in sheet title'); - } - - // Enforce maximum characters allowed for sheet title - if (Shared\StringHelper::countCharacters($pValue) > self::SHEET_TITLE_MAXIMUM_LENGTH) { - throw new Exception('Maximum ' . self::SHEET_TITLE_MAXIMUM_LENGTH . ' characters allowed in sheet title.'); - } - - return $pValue; - } - - /** - * Get a sorted list of all cell coordinates currently held in the collection by row and column. - * - * @param bool $sorted Also sort the cell collection? - * - * @return string[] - */ - public function getCoordinates($sorted = true) - { - if ($this->cellCollection == null) { - return []; - } - - if ($sorted) { - return $this->cellCollection->getSortedCoordinates(); - } - - return $this->cellCollection->getCoordinates(); - } - - /** - * Get collection of row dimensions. - * - * @return RowDimension[] - */ - public function getRowDimensions() - { - return $this->rowDimensions; - } - - /** - * Get default row dimension. - * - * @return RowDimension - */ - public function getDefaultRowDimension() - { - return $this->defaultRowDimension; - } - - /** - * Get collection of column dimensions. - * - * @return ColumnDimension[] - */ - public function getColumnDimensions() - { - return $this->columnDimensions; - } - - /** - * Get default column dimension. - * - * @return ColumnDimension - */ - public function getDefaultColumnDimension() - { - return $this->defaultColumnDimension; - } - - /** - * Get collection of drawings. - * - * @return BaseDrawing[] - */ - public function getDrawingCollection() - { - return $this->drawingCollection; - } - - /** - * Get collection of charts. - * - * @return Chart[] - */ - public function getChartCollection() - { - return $this->chartCollection; - } - - /** - * Add chart. - * - * @param null|int $iChartIndex Index where chart should go (0,1,..., or null for last) - * - * @return Chart - */ - public function addChart(Chart $pChart, $iChartIndex = null) - { - $pChart->setWorksheet($this); - if ($iChartIndex === null) { - $this->chartCollection[] = $pChart; - } else { - // Insert the chart at the requested index - array_splice($this->chartCollection, $iChartIndex, 0, [$pChart]); - } - - return $pChart; - } - - /** - * Return the count of charts on this worksheet. - * - * @return int The number of charts - */ - public function getChartCount() - { - return count($this->chartCollection); - } - - /** - * Get a chart by its index position. - * - * @param string $index Chart index position - * - * @return Chart|false - */ - public function getChartByIndex($index) - { - $chartCount = count($this->chartCollection); - if ($chartCount == 0) { - return false; - } - if ($index === null) { - $index = --$chartCount; - } - if (!isset($this->chartCollection[$index])) { - return false; - } - - return $this->chartCollection[$index]; - } - - /** - * Return an array of the names of charts on this worksheet. - * - * @return string[] The names of charts - */ - public function getChartNames() - { - $chartNames = []; - foreach ($this->chartCollection as $chart) { - $chartNames[] = $chart->getName(); - } - - return $chartNames; - } - - /** - * Get a chart by name. - * - * @param string $chartName Chart name - * - * @return Chart|false - */ - public function getChartByName($chartName) - { - $chartCount = count($this->chartCollection); - if ($chartCount == 0) { - return false; - } - foreach ($this->chartCollection as $index => $chart) { - if ($chart->getName() == $chartName) { - return $this->chartCollection[$index]; - } - } - - return false; - } - - /** - * Refresh column dimensions. - * - * @return $this - */ - public function refreshColumnDimensions() - { - $currentColumnDimensions = $this->getColumnDimensions(); - $newColumnDimensions = []; - - foreach ($currentColumnDimensions as $objColumnDimension) { - $newColumnDimensions[$objColumnDimension->getColumnIndex()] = $objColumnDimension; - } - - $this->columnDimensions = $newColumnDimensions; - - return $this; - } - - /** - * Refresh row dimensions. - * - * @return $this - */ - public function refreshRowDimensions() - { - $currentRowDimensions = $this->getRowDimensions(); - $newRowDimensions = []; - - foreach ($currentRowDimensions as $objRowDimension) { - $newRowDimensions[$objRowDimension->getRowIndex()] = $objRowDimension; - } - - $this->rowDimensions = $newRowDimensions; - - return $this; - } - - /** - * Calculate worksheet dimension. - * - * @return string String containing the dimension of this worksheet - */ - public function calculateWorksheetDimension() - { - // Return - return 'A1:' . $this->getHighestColumn() . $this->getHighestRow(); - } - - /** - * Calculate worksheet data dimension. - * - * @return string String containing the dimension of this worksheet that actually contain data - */ - public function calculateWorksheetDataDimension() - { - // Return - return 'A1:' . $this->getHighestDataColumn() . $this->getHighestDataRow(); - } - - /** - * Calculate widths for auto-size columns. - * - * @return $this - */ - public function calculateColumnWidths() - { - // initialize $autoSizes array - $autoSizes = []; - foreach ($this->getColumnDimensions() as $colDimension) { - if ($colDimension->getAutoSize()) { - $autoSizes[$colDimension->getColumnIndex()] = -1; - } - } - - // There is only something to do if there are some auto-size columns - if (!empty($autoSizes)) { - // build list of cells references that participate in a merge - $isMergeCell = []; - foreach ($this->getMergeCells() as $cells) { - foreach (Coordinate::extractAllCellReferencesInRange($cells) as $cellReference) { - $isMergeCell[$cellReference] = true; - } - } - - // loop through all cells in the worksheet - foreach ($this->getCoordinates(false) as $coordinate) { - $cell = $this->getCell($coordinate, false); - if ($cell !== null && isset($autoSizes[$this->cellCollection->getCurrentColumn()])) { - //Determine if cell is in merge range - $isMerged = isset($isMergeCell[$this->cellCollection->getCurrentCoordinate()]); - - //By default merged cells should be ignored - $isMergedButProceed = false; - - //The only exception is if it's a merge range value cell of a 'vertical' randge (1 column wide) - if ($isMerged && $cell->isMergeRangeValueCell()) { - $range = $cell->getMergeRange(); - $rangeBoundaries = Coordinate::rangeDimension($range); - if ($rangeBoundaries[0] == 1) { - $isMergedButProceed = true; - } - } - - // Determine width if cell does not participate in a merge or does and is a value cell of 1-column wide range - if (!$isMerged || $isMergedButProceed) { - // Calculated value - // To formatted string - $cellValue = NumberFormat::toFormattedString( - $cell->getCalculatedValue(), - $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode() - ); - - $autoSizes[$this->cellCollection->getCurrentColumn()] = max( - (float) $autoSizes[$this->cellCollection->getCurrentColumn()], - (float) Shared\Font::calculateColumnWidth( - $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont(), - $cellValue, - $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getAlignment()->getTextRotation(), - $this->getParent()->getDefaultStyle()->getFont() - ) - ); - } - } - } - - // adjust column widths - foreach ($autoSizes as $columnIndex => $width) { - if ($width == -1) { - $width = $this->getDefaultColumnDimension()->getWidth(); - } - $this->getColumnDimension($columnIndex)->setWidth($width); - } - } - - return $this; - } - - /** - * Get parent. - * - * @return Spreadsheet - */ - public function getParent() - { - return $this->parent; - } - - /** - * Re-bind parent. - * - * @return $this - */ - public function rebindParent(Spreadsheet $parent) - { - if ($this->parent !== null) { - $definedNames = $this->parent->getDefinedNames(); - foreach ($definedNames as $definedName) { - $parent->addDefinedName($definedName); - } - - $this->parent->removeSheetByIndex( - $this->parent->getIndex($this) - ); - } - $this->parent = $parent; - - return $this; - } - - /** - * Get title. - * - * @return string - */ - public function getTitle() - { - return $this->title; - } - - /** - * Set title. - * - * @param string $pValue String containing the dimension of this worksheet - * @param bool $updateFormulaCellReferences Flag indicating whether cell references in formulae should - * be updated to reflect the new sheet name. - * This should be left as the default true, unless you are - * certain that no formula cells on any worksheet contain - * references to this worksheet - * @param bool $validate False to skip validation of new title. WARNING: This should only be set - * at parse time (by Readers), where titles can be assumed to be valid. - * - * @return $this - */ - public function setTitle($pValue, $updateFormulaCellReferences = true, $validate = true) - { - // Is this a 'rename' or not? - if ($this->getTitle() == $pValue) { - return $this; - } - - // Old title - $oldTitle = $this->getTitle(); - - if ($validate) { - // Syntax check - self::checkSheetTitle($pValue); - - if ($this->parent) { - // Is there already such sheet name? - if ($this->parent->sheetNameExists($pValue)) { - // Use name, but append with lowest possible integer - - if (Shared\StringHelper::countCharacters($pValue) > 29) { - $pValue = Shared\StringHelper::substring($pValue, 0, 29); - } - $i = 1; - while ($this->parent->sheetNameExists($pValue . ' ' . $i)) { - ++$i; - if ($i == 10) { - if (Shared\StringHelper::countCharacters($pValue) > 28) { - $pValue = Shared\StringHelper::substring($pValue, 0, 28); - } - } elseif ($i == 100) { - if (Shared\StringHelper::countCharacters($pValue) > 27) { - $pValue = Shared\StringHelper::substring($pValue, 0, 27); - } - } - } - - $pValue .= " $i"; - } - } - } - - // Set title - $this->title = $pValue; - $this->dirty = true; - - if ($this->parent && $this->parent->getCalculationEngine()) { - // New title - $newTitle = $this->getTitle(); - $this->parent->getCalculationEngine() - ->renameCalculationCacheForWorksheet($oldTitle, $newTitle); - if ($updateFormulaCellReferences) { - ReferenceHelper::getInstance()->updateNamedFormulas($this->parent, $oldTitle, $newTitle); - } - } - - return $this; - } - - /** - * Get sheet state. - * - * @return string Sheet state (visible, hidden, veryHidden) - */ - public function getSheetState() - { - return $this->sheetState; - } - - /** - * Set sheet state. - * - * @param string $value Sheet state (visible, hidden, veryHidden) - * - * @return $this - */ - public function setSheetState($value) - { - $this->sheetState = $value; - - return $this; - } - - /** - * Get page setup. - * - * @return PageSetup - */ - public function getPageSetup() - { - return $this->pageSetup; - } - - /** - * Set page setup. - * - * @return $this - */ - public function setPageSetup(PageSetup $pValue) - { - $this->pageSetup = $pValue; - - return $this; - } - - /** - * Get page margins. - * - * @return PageMargins - */ - public function getPageMargins() - { - return $this->pageMargins; - } - - /** - * Set page margins. - * - * @return $this - */ - public function setPageMargins(PageMargins $pValue) - { - $this->pageMargins = $pValue; - - return $this; - } - - /** - * Get page header/footer. - * - * @return HeaderFooter - */ - public function getHeaderFooter() - { - return $this->headerFooter; - } - - /** - * Set page header/footer. - * - * @return $this - */ - public function setHeaderFooter(HeaderFooter $pValue) - { - $this->headerFooter = $pValue; - - return $this; - } - - /** - * Get sheet view. - * - * @return SheetView - */ - public function getSheetView() - { - return $this->sheetView; - } - - /** - * Set sheet view. - * - * @return $this - */ - public function setSheetView(SheetView $pValue) - { - $this->sheetView = $pValue; - - return $this; - } - - /** - * Get Protection. - * - * @return Protection - */ - public function getProtection() - { - return $this->protection; - } - - /** - * Set Protection. - * - * @return $this - */ - public function setProtection(Protection $pValue) - { - $this->protection = $pValue; - $this->dirty = true; - - return $this; - } - - /** - * Get highest worksheet column. - * - * @param string $row Return the data highest column for the specified row, - * or the highest column of any row if no row number is passed - * - * @return string Highest column name - */ - public function getHighestColumn($row = null) - { - if ($row == null) { - return $this->cachedHighestColumn; - } - - return $this->getHighestDataColumn($row); - } - - /** - * Get highest worksheet column that contains data. - * - * @param string $row Return the highest data column for the specified row, - * or the highest data column of any row if no row number is passed - * - * @return string Highest column name that contains data - */ - public function getHighestDataColumn($row = null) - { - return $this->cellCollection->getHighestColumn($row); - } - - /** - * Get highest worksheet row. - * - * @param string $column Return the highest data row for the specified column, - * or the highest row of any column if no column letter is passed - * - * @return int Highest row number - */ - public function getHighestRow($column = null) - { - if ($column == null) { - return $this->cachedHighestRow; - } - - return $this->getHighestDataRow($column); - } - - /** - * Get highest worksheet row that contains data. - * - * @param string $column Return the highest data row for the specified column, - * or the highest data row of any column if no column letter is passed - * - * @return int Highest row number that contains data - */ - public function getHighestDataRow($column = null) - { - return $this->cellCollection->getHighestRow($column); - } - - /** - * Get highest worksheet column and highest row that have cell records. - * - * @return array Highest column name and highest row number - */ - public function getHighestRowAndColumn() - { - return $this->cellCollection->getHighestRowAndColumn(); - } - - /** - * Set a cell value. - * - * @param string $pCoordinate Coordinate of the cell, eg: 'A1' - * @param mixed $pValue Value of the cell - * - * @return $this - */ - public function setCellValue($pCoordinate, $pValue) - { - $this->getCell($pCoordinate)->setValue($pValue); - - return $this; - } - - /** - * Set a cell value by using numeric cell coordinates. - * - * @param int $columnIndex Numeric column coordinate of the cell - * @param int $row Numeric row coordinate of the cell - * @param mixed $value Value of the cell - * - * @return $this - */ - public function setCellValueByColumnAndRow($columnIndex, $row, $value) - { - $this->getCellByColumnAndRow($columnIndex, $row)->setValue($value); - - return $this; - } - - /** - * Set a cell value. - * - * @param string $pCoordinate Coordinate of the cell, eg: 'A1' - * @param mixed $pValue Value of the cell - * @param string $pDataType Explicit data type, see DataType::TYPE_* - * - * @return $this - */ - public function setCellValueExplicit($pCoordinate, $pValue, $pDataType) - { - // Set value - $this->getCell($pCoordinate)->setValueExplicit($pValue, $pDataType); - - return $this; - } - - /** - * Set a cell value by using numeric cell coordinates. - * - * @param int $columnIndex Numeric column coordinate of the cell - * @param int $row Numeric row coordinate of the cell - * @param mixed $value Value of the cell - * @param string $dataType Explicit data type, see DataType::TYPE_* - * - * @return $this - */ - public function setCellValueExplicitByColumnAndRow($columnIndex, $row, $value, $dataType) - { - $this->getCellByColumnAndRow($columnIndex, $row)->setValueExplicit($value, $dataType); - - return $this; - } - - /** - * Get cell at a specific coordinate. - * - * @param string $pCoordinate Coordinate of the cell, eg: 'A1' - * @param bool $createIfNotExists Flag indicating whether a new cell should be created if it doesn't - * already exist, or a null should be returned instead - * - * @return null|Cell Cell that was found/created or null - */ - public function getCell($pCoordinate, $createIfNotExists = true) - { - // Uppercase coordinate - $pCoordinateUpper = strtoupper($pCoordinate); - - // Check cell collection - if ($this->cellCollection->has($pCoordinateUpper)) { - return $this->cellCollection->get($pCoordinateUpper); - } - - // Worksheet reference? - if (strpos($pCoordinate, '!') !== false) { - $worksheetReference = self::extractSheetTitle($pCoordinate, true); - - return $this->parent->getSheetByName($worksheetReference[0])->getCell(strtoupper($worksheetReference[1]), $createIfNotExists); - } - - // Named range? - if ( - (!preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $pCoordinate, $matches)) && - (preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/i', $pCoordinate, $matches)) - ) { - $namedRange = DefinedName::resolveName($pCoordinate, $this); - if ($namedRange !== null) { - $pCoordinate = $namedRange->getValue(); - - return $namedRange->getWorksheet()->getCell($pCoordinate, $createIfNotExists); - } - } - - if (Coordinate::coordinateIsRange($pCoordinate)) { - throw new Exception('Cell coordinate can not be a range of cells.'); - } elseif (strpos($pCoordinate, '$') !== false) { - throw new Exception('Cell coordinate must not be absolute.'); - } - - // Create new cell object, if required - return $createIfNotExists ? $this->createNewCell($pCoordinateUpper) : null; - } - - /** - * Get cell at a specific coordinate by using numeric cell coordinates. - * - * @param int $columnIndex Numeric column coordinate of the cell - * @param int $row Numeric row coordinate of the cell - * @param bool $createIfNotExists Flag indicating whether a new cell should be created if it doesn't - * already exist, or a null should be returned instead - * - * @return null|Cell Cell that was found/created or null - */ - public function getCellByColumnAndRow($columnIndex, $row, $createIfNotExists = true) - { - $columnLetter = Coordinate::stringFromColumnIndex($columnIndex); - $coordinate = $columnLetter . $row; - - if ($this->cellCollection->has($coordinate)) { - return $this->cellCollection->get($coordinate); - } - - // Create new cell object, if required - return $createIfNotExists ? $this->createNewCell($coordinate) : null; - } - - /** - * Create a new cell at the specified coordinate. - * - * @param string $pCoordinate Coordinate of the cell - * - * @return Cell Cell that was created - */ - private function createNewCell($pCoordinate) - { - $cell = new Cell(null, DataType::TYPE_NULL, $this); - $this->cellCollection->add($pCoordinate, $cell); - $this->cellCollectionIsSorted = false; - - // Coordinates - $aCoordinates = Coordinate::coordinateFromString($pCoordinate); - if (Coordinate::columnIndexFromString($this->cachedHighestColumn) < Coordinate::columnIndexFromString($aCoordinates[0])) { - $this->cachedHighestColumn = $aCoordinates[0]; - } - if ($aCoordinates[1] > $this->cachedHighestRow) { - $this->cachedHighestRow = $aCoordinates[1]; - } - - // Cell needs appropriate xfIndex from dimensions records - // but don't create dimension records if they don't already exist - $rowDimension = $this->getRowDimension($aCoordinates[1], false); - $columnDimension = $this->getColumnDimension($aCoordinates[0], false); - - if ($rowDimension !== null && $rowDimension->getXfIndex() > 0) { - // then there is a row dimension with explicit style, assign it to the cell - $cell->setXfIndex($rowDimension->getXfIndex()); - } elseif ($columnDimension !== null && $columnDimension->getXfIndex() > 0) { - // then there is a column dimension, assign it to the cell - $cell->setXfIndex($columnDimension->getXfIndex()); - } - - return $cell; - } - - /** - * Does the cell at a specific coordinate exist? - * - * @param string $pCoordinate Coordinate of the cell eg: 'A1' - * - * @return bool - */ - public function cellExists($pCoordinate) - { - // Worksheet reference? - if (strpos($pCoordinate, '!') !== false) { - $worksheetReference = self::extractSheetTitle($pCoordinate, true); - - return $this->parent->getSheetByName($worksheetReference[0])->cellExists(strtoupper($worksheetReference[1])); - } - - // Named range? - if ( - (!preg_match('/^' . Calculation::CALCULATION_REGEXP_CELLREF . '$/i', $pCoordinate, $matches)) && - (preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/i', $pCoordinate, $matches)) - ) { - $namedRange = DefinedName::resolveName($pCoordinate, $this); - if ($namedRange !== null) { - $pCoordinate = $namedRange->getValue(); - if ($this->getHashCode() != $namedRange->getWorksheet()->getHashCode()) { - if (!$namedRange->getLocalOnly()) { - return $namedRange->getWorksheet()->cellExists($pCoordinate); - } - - throw new Exception('Named range ' . $namedRange->getName() . ' is not accessible from within sheet ' . $this->getTitle()); - } - } else { - return false; - } - } - - // Uppercase coordinate - $pCoordinate = strtoupper($pCoordinate); - - if (Coordinate::coordinateIsRange($pCoordinate)) { - throw new Exception('Cell coordinate can not be a range of cells.'); - } elseif (strpos($pCoordinate, '$') !== false) { - throw new Exception('Cell coordinate must not be absolute.'); - } - - // Cell exists? - return $this->cellCollection->has($pCoordinate); - } - - /** - * Cell at a specific coordinate by using numeric cell coordinates exists? - * - * @param int $columnIndex Numeric column coordinate of the cell - * @param int $row Numeric row coordinate of the cell - * - * @return bool - */ - public function cellExistsByColumnAndRow($columnIndex, $row) - { - return $this->cellExists(Coordinate::stringFromColumnIndex($columnIndex) . $row); - } - - /** - * Get row dimension at a specific row. - * - * @param int $pRow Numeric index of the row - * @param bool $create - * - * @return RowDimension - */ - public function getRowDimension($pRow, $create = true) - { - // Found - $found = null; - - // Get row dimension - if (!isset($this->rowDimensions[$pRow])) { - if (!$create) { - return null; - } - $this->rowDimensions[$pRow] = new RowDimension($pRow); - - $this->cachedHighestRow = max($this->cachedHighestRow, $pRow); - } - - return $this->rowDimensions[$pRow]; - } - - /** - * Get column dimension at a specific column. - * - * @param string $pColumn String index of the column eg: 'A' - * @param bool $create - * - * @return ColumnDimension - */ - public function getColumnDimension($pColumn, $create = true) - { - // Uppercase coordinate - $pColumn = strtoupper($pColumn); - - // Fetch dimensions - if (!isset($this->columnDimensions[$pColumn])) { - if (!$create) { - return null; - } - $this->columnDimensions[$pColumn] = new ColumnDimension($pColumn); - - if (Coordinate::columnIndexFromString($this->cachedHighestColumn) < Coordinate::columnIndexFromString($pColumn)) { - $this->cachedHighestColumn = $pColumn; - } - } - - return $this->columnDimensions[$pColumn]; - } - - /** - * Get column dimension at a specific column by using numeric cell coordinates. - * - * @param int $columnIndex Numeric column coordinate of the cell - * - * @return ColumnDimension - */ - public function getColumnDimensionByColumn($columnIndex) - { - return $this->getColumnDimension(Coordinate::stringFromColumnIndex($columnIndex)); - } - - /** - * Get styles. - * - * @return Style[] - */ - public function getStyles() - { - return $this->styles; - } - - /** - * Get style for cell. - * - * @param string $pCellCoordinate Cell coordinate (or range) to get style for, eg: 'A1' - * - * @return Style - */ - public function getStyle($pCellCoordinate) - { - // set this sheet as active - $this->parent->setActiveSheetIndex($this->parent->getIndex($this)); - - // set cell coordinate as active - $this->setSelectedCells($pCellCoordinate); - - return $this->parent->getCellXfSupervisor(); - } - - /** - * Get conditional styles for a cell. - * - * @param string $pCoordinate eg: 'A1' - * - * @return Conditional[] - */ - public function getConditionalStyles($pCoordinate) - { - $pCoordinate = strtoupper($pCoordinate); - if (!isset($this->conditionalStylesCollection[$pCoordinate])) { - $this->conditionalStylesCollection[$pCoordinate] = []; - } - - return $this->conditionalStylesCollection[$pCoordinate]; - } - - /** - * Do conditional styles exist for this cell? - * - * @param string $pCoordinate eg: 'A1' - * - * @return bool - */ - public function conditionalStylesExists($pCoordinate) - { - return isset($this->conditionalStylesCollection[strtoupper($pCoordinate)]); - } - - /** - * Removes conditional styles for a cell. - * - * @param string $pCoordinate eg: 'A1' - * - * @return $this - */ - public function removeConditionalStyles($pCoordinate) - { - unset($this->conditionalStylesCollection[strtoupper($pCoordinate)]); - - return $this; - } - - /** - * Get collection of conditional styles. - * - * @return array - */ - public function getConditionalStylesCollection() - { - return $this->conditionalStylesCollection; - } - - /** - * Set conditional styles. - * - * @param string $pCoordinate eg: 'A1' - * @param $pValue Conditional[] - * - * @return $this - */ - public function setConditionalStyles($pCoordinate, $pValue) - { - $this->conditionalStylesCollection[strtoupper($pCoordinate)] = $pValue; - - return $this; - } - - /** - * Get style for cell by using numeric cell coordinates. - * - * @param int $columnIndex1 Numeric column coordinate of the cell - * @param int $row1 Numeric row coordinate of the cell - * @param null|int $columnIndex2 Numeric column coordinate of the range cell - * @param null|int $row2 Numeric row coordinate of the range cell - * - * @return Style - */ - public function getStyleByColumnAndRow($columnIndex1, $row1, $columnIndex2 = null, $row2 = null) - { - if ($columnIndex2 !== null && $row2 !== null) { - $cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2; - - return $this->getStyle($cellRange); - } - - return $this->getStyle(Coordinate::stringFromColumnIndex($columnIndex1) . $row1); - } - - /** - * Duplicate cell style to a range of cells. - * - * Please note that this will overwrite existing cell styles for cells in range! - * - * @param Style $pCellStyle Cell style to duplicate - * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") - * - * @return $this - */ - public function duplicateStyle(Style $pCellStyle, $pRange) - { - // Add the style to the workbook if necessary - $workbook = $this->parent; - if ($existingStyle = $this->parent->getCellXfByHashCode($pCellStyle->getHashCode())) { - // there is already such cell Xf in our collection - $xfIndex = $existingStyle->getIndex(); - } else { - // we don't have such a cell Xf, need to add - $workbook->addCellXf($pCellStyle); - $xfIndex = $pCellStyle->getIndex(); - } - - // Calculate range outer borders - [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($pRange . ':' . $pRange); - - // Make sure we can loop upwards on rows and columns - if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) { - $tmp = $rangeStart; - $rangeStart = $rangeEnd; - $rangeEnd = $tmp; - } - - // Loop through cells and apply styles - for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { - for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { - $this->getCell(Coordinate::stringFromColumnIndex($col) . $row)->setXfIndex($xfIndex); - } - } - - return $this; - } - - /** - * Duplicate conditional style to a range of cells. - * - * Please note that this will overwrite existing cell styles for cells in range! - * - * @param Conditional[] $pCellStyle Cell style to duplicate - * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") - * - * @return $this - */ - public function duplicateConditionalStyle(array $pCellStyle, $pRange = '') - { - foreach ($pCellStyle as $cellStyle) { - if (!($cellStyle instanceof Conditional)) { - throw new Exception('Style is not a conditional style'); - } - } - - // Calculate range outer borders - [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($pRange . ':' . $pRange); - - // Make sure we can loop upwards on rows and columns - if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) { - $tmp = $rangeStart; - $rangeStart = $rangeEnd; - $rangeEnd = $tmp; - } - - // Loop through cells and apply styles - for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { - for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { - $this->setConditionalStyles(Coordinate::stringFromColumnIndex($col) . $row, $pCellStyle); - } - } - - return $this; - } - - /** - * Set break on a cell. - * - * @param string $pCoordinate Cell coordinate (e.g. A1) - * @param int $pBreak Break type (type of Worksheet::BREAK_*) - * - * @return $this - */ - public function setBreak($pCoordinate, $pBreak) - { - // Uppercase coordinate - $pCoordinate = strtoupper($pCoordinate); - - if ($pCoordinate != '') { - if ($pBreak == self::BREAK_NONE) { - if (isset($this->breaks[$pCoordinate])) { - unset($this->breaks[$pCoordinate]); - } - } else { - $this->breaks[$pCoordinate] = $pBreak; - } - } else { - throw new Exception('No cell coordinate specified.'); - } - - return $this; - } - - /** - * Set break on a cell by using numeric cell coordinates. - * - * @param int $columnIndex Numeric column coordinate of the cell - * @param int $row Numeric row coordinate of the cell - * @param int $break Break type (type of Worksheet::BREAK_*) - * - * @return $this - */ - public function setBreakByColumnAndRow($columnIndex, $row, $break) - { - return $this->setBreak(Coordinate::stringFromColumnIndex($columnIndex) . $row, $break); - } - - /** - * Get breaks. - * - * @return array[] - */ - public function getBreaks() - { - return $this->breaks; - } - - /** - * Set merge on a cell range. - * - * @param string $pRange Cell range (e.g. A1:E1) - * - * @return $this - */ - public function mergeCells($pRange) - { - // Uppercase coordinate - $pRange = strtoupper($pRange); - - if (strpos($pRange, ':') !== false) { - $this->mergeCells[$pRange] = $pRange; - - // make sure cells are created - - // get the cells in the range - $aReferences = Coordinate::extractAllCellReferencesInRange($pRange); - - // create upper left cell if it does not already exist - $upperLeft = $aReferences[0]; - if (!$this->cellExists($upperLeft)) { - $this->getCell($upperLeft)->setValueExplicit(null, DataType::TYPE_NULL); - } - - // Blank out the rest of the cells in the range (if they exist) - $count = count($aReferences); - for ($i = 1; $i < $count; ++$i) { - if ($this->cellExists($aReferences[$i])) { - $this->getCell($aReferences[$i])->setValueExplicit(null, DataType::TYPE_NULL); - } - } - } else { - throw new Exception('Merge must be set on a range of cells.'); - } - - return $this; - } - - /** - * Set merge on a cell range by using numeric cell coordinates. - * - * @param int $columnIndex1 Numeric column coordinate of the first cell - * @param int $row1 Numeric row coordinate of the first cell - * @param int $columnIndex2 Numeric column coordinate of the last cell - * @param int $row2 Numeric row coordinate of the last cell - * - * @return $this - */ - public function mergeCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2) - { - $cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2; - - return $this->mergeCells($cellRange); - } - - /** - * Remove merge on a cell range. - * - * @param string $pRange Cell range (e.g. A1:E1) - * - * @return $this - */ - public function unmergeCells($pRange) - { - // Uppercase coordinate - $pRange = strtoupper($pRange); - - if (strpos($pRange, ':') !== false) { - if (isset($this->mergeCells[$pRange])) { - unset($this->mergeCells[$pRange]); - } else { - throw new Exception('Cell range ' . $pRange . ' not known as merged.'); - } - } else { - throw new Exception('Merge can only be removed from a range of cells.'); - } - - return $this; - } - - /** - * Remove merge on a cell range by using numeric cell coordinates. - * - * @param int $columnIndex1 Numeric column coordinate of the first cell - * @param int $row1 Numeric row coordinate of the first cell - * @param int $columnIndex2 Numeric column coordinate of the last cell - * @param int $row2 Numeric row coordinate of the last cell - * - * @return $this - */ - public function unmergeCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2) - { - $cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2; - - return $this->unmergeCells($cellRange); - } - - /** - * Get merge cells array. - * - * @return string[] - */ - public function getMergeCells() - { - return $this->mergeCells; - } - - /** - * Set merge cells array for the entire sheet. Use instead mergeCells() to merge - * a single cell range. - * - * @param string[] $pValue - * - * @return $this - */ - public function setMergeCells(array $pValue) - { - $this->mergeCells = $pValue; - - return $this; - } - - /** - * Set protection on a cell range. - * - * @param string $pRange Cell (e.g. A1) or cell range (e.g. A1:E1) - * @param string $pPassword Password to unlock the protection - * @param bool $pAlreadyHashed If the password has already been hashed, set this to true - * - * @return $this - */ - public function protectCells($pRange, $pPassword, $pAlreadyHashed = false) - { - // Uppercase coordinate - $pRange = strtoupper($pRange); - - if (!$pAlreadyHashed) { - $pPassword = Shared\PasswordHasher::hashPassword($pPassword); - } - $this->protectedCells[$pRange] = $pPassword; - - return $this; - } - - /** - * Set protection on a cell range by using numeric cell coordinates. - * - * @param int $columnIndex1 Numeric column coordinate of the first cell - * @param int $row1 Numeric row coordinate of the first cell - * @param int $columnIndex2 Numeric column coordinate of the last cell - * @param int $row2 Numeric row coordinate of the last cell - * @param string $password Password to unlock the protection - * @param bool $alreadyHashed If the password has already been hashed, set this to true - * - * @return $this - */ - public function protectCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2, $password, $alreadyHashed = false) - { - $cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2; - - return $this->protectCells($cellRange, $password, $alreadyHashed); - } - - /** - * Remove protection on a cell range. - * - * @param string $pRange Cell (e.g. A1) or cell range (e.g. A1:E1) - * - * @return $this - */ - public function unprotectCells($pRange) - { - // Uppercase coordinate - $pRange = strtoupper($pRange); - - if (isset($this->protectedCells[$pRange])) { - unset($this->protectedCells[$pRange]); - } else { - throw new Exception('Cell range ' . $pRange . ' not known as protected.'); - } - - return $this; - } - - /** - * Remove protection on a cell range by using numeric cell coordinates. - * - * @param int $columnIndex1 Numeric column coordinate of the first cell - * @param int $row1 Numeric row coordinate of the first cell - * @param int $columnIndex2 Numeric column coordinate of the last cell - * @param int $row2 Numeric row coordinate of the last cell - * - * @return $this - */ - public function unprotectCellsByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2) - { - $cellRange = Coordinate::stringFromColumnIndex($columnIndex1) . $row1 . ':' . Coordinate::stringFromColumnIndex($columnIndex2) . $row2; - - return $this->unprotectCells($cellRange); - } - - /** - * Get protected cells. - * - * @return array[] - */ - public function getProtectedCells() - { - return $this->protectedCells; - } - - /** - * Get Autofilter. - * - * @return AutoFilter - */ - public function getAutoFilter() - { - return $this->autoFilter; - } - - /** - * Set AutoFilter. - * - * @param AutoFilter|string $pValue - * A simple string containing a Cell range like 'A1:E10' is permitted for backward compatibility - * - * @return $this - */ - public function setAutoFilter($pValue) - { - if (is_string($pValue)) { - $this->autoFilter->setRange($pValue); - } elseif (is_object($pValue) && ($pValue instanceof AutoFilter)) { - $this->autoFilter = $pValue; - } - - return $this; - } - - /** - * Set Autofilter Range by using numeric cell coordinates. - * - * @param int $columnIndex1 Numeric column coordinate of the first cell - * @param int $row1 Numeric row coordinate of the first cell - * @param int $columnIndex2 Numeric column coordinate of the second cell - * @param int $row2 Numeric row coordinate of the second cell - * - * @return $this - */ - public function setAutoFilterByColumnAndRow($columnIndex1, $row1, $columnIndex2, $row2) - { - return $this->setAutoFilter( - Coordinate::stringFromColumnIndex($columnIndex1) . $row1 - . ':' . - Coordinate::stringFromColumnIndex($columnIndex2) . $row2 - ); - } - - /** - * Remove autofilter. - * - * @return $this - */ - public function removeAutoFilter() - { - $this->autoFilter->setRange(null); - - return $this; - } - - /** - * Get Freeze Pane. - * - * @return string - */ - public function getFreezePane() - { - return $this->freezePane; - } - - /** - * Freeze Pane. - * - * Examples: - * - * - A2 will freeze the rows above cell A2 (i.e row 1) - * - B1 will freeze the columns to the left of cell B1 (i.e column A) - * - B2 will freeze the rows above and to the left of cell B2 (i.e row 1 and column A) - * - * @param null|string $cell Position of the split - * @param null|string $topLeftCell default position of the right bottom pane - * - * @return $this - */ - public function freezePane($cell, $topLeftCell = null) - { - if (is_string($cell) && Coordinate::coordinateIsRange($cell)) { - throw new Exception('Freeze pane can not be set on a range of cells.'); - } - - if ($cell !== null && $topLeftCell === null) { - $coordinate = Coordinate::coordinateFromString($cell); - $topLeftCell = $coordinate[0] . $coordinate[1]; - } - - $this->freezePane = $cell; - $this->topLeftCell = $topLeftCell; - - return $this; - } - - /** - * Freeze Pane by using numeric cell coordinates. - * - * @param int $columnIndex Numeric column coordinate of the cell - * @param int $row Numeric row coordinate of the cell - * - * @return $this - */ - public function freezePaneByColumnAndRow($columnIndex, $row) - { - return $this->freezePane(Coordinate::stringFromColumnIndex($columnIndex) . $row); - } - - /** - * Unfreeze Pane. - * - * @return $this - */ - public function unfreezePane() - { - return $this->freezePane(null); - } - - /** - * Get the default position of the right bottom pane. - * - * @return int - */ - public function getTopLeftCell() - { - return $this->topLeftCell; - } - - /** - * Insert a new row, updating all possible related data. - * - * @param int $pBefore Insert before this one - * @param int $pNumRows Number of rows to insert - * - * @return $this - */ - public function insertNewRowBefore($pBefore, $pNumRows = 1) - { - if ($pBefore >= 1) { - $objReferenceHelper = ReferenceHelper::getInstance(); - $objReferenceHelper->insertNewBefore('A' . $pBefore, 0, $pNumRows, $this); - } else { - throw new Exception('Rows can only be inserted before at least row 1.'); - } - - return $this; - } - - /** - * Insert a new column, updating all possible related data. - * - * @param string $pBefore Insert before this one, eg: 'A' - * @param int $pNumCols Number of columns to insert - * - * @return $this - */ - public function insertNewColumnBefore($pBefore, $pNumCols = 1) - { - if (!is_numeric($pBefore)) { - $objReferenceHelper = ReferenceHelper::getInstance(); - $objReferenceHelper->insertNewBefore($pBefore . '1', $pNumCols, 0, $this); - } else { - throw new Exception('Column references should not be numeric.'); - } - - return $this; - } - - /** - * Insert a new column, updating all possible related data. - * - * @param int $beforeColumnIndex Insert before this one (numeric column coordinate of the cell) - * @param int $pNumCols Number of columns to insert - * - * @return $this - */ - public function insertNewColumnBeforeByIndex($beforeColumnIndex, $pNumCols = 1) - { - if ($beforeColumnIndex >= 1) { - return $this->insertNewColumnBefore(Coordinate::stringFromColumnIndex($beforeColumnIndex), $pNumCols); - } - - throw new Exception('Columns can only be inserted before at least column A (1).'); - } - - /** - * Delete a row, updating all possible related data. - * - * @param int $pRow Remove starting with this one - * @param int $pNumRows Number of rows to remove - * - * @return $this - */ - public function removeRow($pRow, $pNumRows = 1) - { - if ($pRow < 1) { - throw new Exception('Rows to be deleted should at least start from row 1.'); - } - - $highestRow = $this->getHighestDataRow(); - $removedRowsCounter = 0; - - for ($r = 0; $r < $pNumRows; ++$r) { - if ($pRow + $r <= $highestRow) { - $this->getCellCollection()->removeRow($pRow + $r); - ++$removedRowsCounter; - } - } - - $objReferenceHelper = ReferenceHelper::getInstance(); - $objReferenceHelper->insertNewBefore('A' . ($pRow + $pNumRows), 0, -$pNumRows, $this); - for ($r = 0; $r < $removedRowsCounter; ++$r) { - $this->getCellCollection()->removeRow($highestRow); - --$highestRow; - } - - return $this; - } - - /** - * Remove a column, updating all possible related data. - * - * @param string $pColumn Remove starting with this one, eg: 'A' - * @param int $pNumCols Number of columns to remove - * - * @return $this - */ - public function removeColumn($pColumn, $pNumCols = 1) - { - if (is_numeric($pColumn)) { - throw new Exception('Column references should not be numeric.'); - } - - $highestColumn = $this->getHighestDataColumn(); - $highestColumnIndex = Coordinate::columnIndexFromString($highestColumn); - $pColumnIndex = Coordinate::columnIndexFromString($pColumn); - - if ($pColumnIndex > $highestColumnIndex) { - return $this; - } - - $pColumn = Coordinate::stringFromColumnIndex($pColumnIndex + $pNumCols); - $objReferenceHelper = ReferenceHelper::getInstance(); - $objReferenceHelper->insertNewBefore($pColumn . '1', -$pNumCols, 0, $this); - - $maxPossibleColumnsToBeRemoved = $highestColumnIndex - $pColumnIndex + 1; - - for ($c = 0, $n = min($maxPossibleColumnsToBeRemoved, $pNumCols); $c < $n; ++$c) { - $this->getCellCollection()->removeColumn($highestColumn); - $highestColumn = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($highestColumn) - 1); - } - - $this->garbageCollect(); - - return $this; - } - - /** - * Remove a column, updating all possible related data. - * - * @param int $columnIndex Remove starting with this one (numeric column coordinate of the cell) - * @param int $numColumns Number of columns to remove - * - * @return $this - */ - public function removeColumnByIndex($columnIndex, $numColumns = 1) - { - if ($columnIndex >= 1) { - return $this->removeColumn(Coordinate::stringFromColumnIndex($columnIndex), $numColumns); - } - - throw new Exception('Columns to be deleted should at least start from column A (1)'); - } - - /** - * Show gridlines? - * - * @return bool - */ - public function getShowGridlines() - { - return $this->showGridlines; - } - - /** - * Set show gridlines. - * - * @param bool $pValue Show gridlines (true/false) - * - * @return $this - */ - public function setShowGridlines($pValue) - { - $this->showGridlines = $pValue; - - return $this; - } - - /** - * Print gridlines? - * - * @return bool - */ - public function getPrintGridlines() - { - return $this->printGridlines; - } - - /** - * Set print gridlines. - * - * @param bool $pValue Print gridlines (true/false) - * - * @return $this - */ - public function setPrintGridlines($pValue) - { - $this->printGridlines = $pValue; - - return $this; - } - - /** - * Show row and column headers? - * - * @return bool - */ - public function getShowRowColHeaders() - { - return $this->showRowColHeaders; - } - - /** - * Set show row and column headers. - * - * @param bool $pValue Show row and column headers (true/false) - * - * @return $this - */ - public function setShowRowColHeaders($pValue) - { - $this->showRowColHeaders = $pValue; - - return $this; - } - - /** - * Show summary below? (Row/Column outlining). - * - * @return bool - */ - public function getShowSummaryBelow() - { - return $this->showSummaryBelow; - } - - /** - * Set show summary below. - * - * @param bool $pValue Show summary below (true/false) - * - * @return $this - */ - public function setShowSummaryBelow($pValue) - { - $this->showSummaryBelow = $pValue; - - return $this; - } - - /** - * Show summary right? (Row/Column outlining). - * - * @return bool - */ - public function getShowSummaryRight() - { - return $this->showSummaryRight; - } - - /** - * Set show summary right. - * - * @param bool $pValue Show summary right (true/false) - * - * @return $this - */ - public function setShowSummaryRight($pValue) - { - $this->showSummaryRight = $pValue; - - return $this; - } - - /** - * Get comments. - * - * @return Comment[] - */ - public function getComments() - { - return $this->comments; - } - - /** - * Set comments array for the entire sheet. - * - * @param Comment[] $pValue - * - * @return $this - */ - public function setComments(array $pValue) - { - $this->comments = $pValue; - - return $this; - } - - /** - * Get comment for cell. - * - * @param string $pCellCoordinate Cell coordinate to get comment for, eg: 'A1' - * - * @return Comment - */ - public function getComment($pCellCoordinate) - { - // Uppercase coordinate - $pCellCoordinate = strtoupper($pCellCoordinate); - - if (Coordinate::coordinateIsRange($pCellCoordinate)) { - throw new Exception('Cell coordinate string can not be a range of cells.'); - } elseif (strpos($pCellCoordinate, '$') !== false) { - throw new Exception('Cell coordinate string must not be absolute.'); - } elseif ($pCellCoordinate == '') { - throw new Exception('Cell coordinate can not be zero-length string.'); - } - - // Check if we already have a comment for this cell. - if (isset($this->comments[$pCellCoordinate])) { - return $this->comments[$pCellCoordinate]; - } - - // If not, create a new comment. - $newComment = new Comment(); - $this->comments[$pCellCoordinate] = $newComment; - - return $newComment; - } - - /** - * Get comment for cell by using numeric cell coordinates. - * - * @param int $columnIndex Numeric column coordinate of the cell - * @param int $row Numeric row coordinate of the cell - * - * @return Comment - */ - public function getCommentByColumnAndRow($columnIndex, $row) - { - return $this->getComment(Coordinate::stringFromColumnIndex($columnIndex) . $row); - } - - /** - * Get active cell. - * - * @return string Example: 'A1' - */ - public function getActiveCell() - { - return $this->activeCell; - } - - /** - * Get selected cells. - * - * @return string - */ - public function getSelectedCells() - { - return $this->selectedCells; - } - - /** - * Selected cell. - * - * @param string $pCoordinate Cell (i.e. A1) - * - * @return $this - */ - public function setSelectedCell($pCoordinate) - { - return $this->setSelectedCells($pCoordinate); - } - - /** - * Select a range of cells. - * - * @param string $pCoordinate Cell range, examples: 'A1', 'B2:G5', 'A:C', '3:6' - * - * @return $this - */ - public function setSelectedCells($pCoordinate) - { - // Uppercase coordinate - $pCoordinate = strtoupper($pCoordinate); - - // Convert 'A' to 'A:A' - $pCoordinate = preg_replace('/^([A-Z]+)$/', '${1}:${1}', $pCoordinate); - - // Convert '1' to '1:1' - $pCoordinate = preg_replace('/^(\d+)$/', '${1}:${1}', $pCoordinate); - - // Convert 'A:C' to 'A1:C1048576' - $pCoordinate = preg_replace('/^([A-Z]+):([A-Z]+)$/', '${1}1:${2}1048576', $pCoordinate); - - // Convert '1:3' to 'A1:XFD3' - $pCoordinate = preg_replace('/^(\d+):(\d+)$/', 'A${1}:XFD${2}', $pCoordinate); - - if (Coordinate::coordinateIsRange($pCoordinate)) { - [$first] = Coordinate::splitRange($pCoordinate); - $this->activeCell = $first[0]; - } else { - $this->activeCell = $pCoordinate; - } - $this->selectedCells = $pCoordinate; - - return $this; - } - - /** - * Selected cell by using numeric cell coordinates. - * - * @param int $columnIndex Numeric column coordinate of the cell - * @param int $row Numeric row coordinate of the cell - * - * @return $this - */ - public function setSelectedCellByColumnAndRow($columnIndex, $row) - { - return $this->setSelectedCells(Coordinate::stringFromColumnIndex($columnIndex) . $row); - } - - /** - * Get right-to-left. - * - * @return bool - */ - public function getRightToLeft() - { - return $this->rightToLeft; - } - - /** - * Set right-to-left. - * - * @param bool $value Right-to-left true/false - * - * @return $this - */ - public function setRightToLeft($value) - { - $this->rightToLeft = $value; - - return $this; - } - - /** - * Fill worksheet from values in array. - * - * @param array $source Source array - * @param mixed $nullValue Value in source array that stands for blank cell - * @param string $startCell Insert array starting from this cell address as the top left coordinate - * @param bool $strictNullComparison Apply strict comparison when testing for null values in the array - * - * @return $this - */ - public function fromArray(array $source, $nullValue = null, $startCell = 'A1', $strictNullComparison = false) - { - // Convert a 1-D array to 2-D (for ease of looping) - if (!is_array(end($source))) { - $source = [$source]; - } - - // start coordinate - [$startColumn, $startRow] = Coordinate::coordinateFromString($startCell); - - // Loop through $source - foreach ($source as $rowData) { - $currentColumn = $startColumn; - foreach ($rowData as $cellValue) { - if ($strictNullComparison) { - if ($cellValue !== $nullValue) { - // Set cell value - $this->getCell($currentColumn . $startRow)->setValue($cellValue); - } - } else { - if ($cellValue != $nullValue) { - // Set cell value - $this->getCell($currentColumn . $startRow)->setValue($cellValue); - } - } - ++$currentColumn; - } - ++$startRow; - } - - return $this; - } - - /** - * Create array from a range of cells. - * - * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") - * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist - * @param bool $calculateFormulas Should formulas be calculated? - * @param bool $formatData Should formatting be applied to cell values? - * @param bool $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero - * True - Return rows and columns indexed by their actual row and column IDs - * - * @return array - */ - public function rangeToArray($pRange, $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) - { - // Returnvalue - $returnValue = []; - // Identify the range that we need to extract from the worksheet - [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($pRange); - $minCol = Coordinate::stringFromColumnIndex($rangeStart[0]); - $minRow = $rangeStart[1]; - $maxCol = Coordinate::stringFromColumnIndex($rangeEnd[0]); - $maxRow = $rangeEnd[1]; - - ++$maxCol; - // Loop through rows - $r = -1; - for ($row = $minRow; $row <= $maxRow; ++$row) { - $rRef = $returnCellRef ? $row : ++$r; - $c = -1; - // Loop through columns in the current row - for ($col = $minCol; $col != $maxCol; ++$col) { - $cRef = $returnCellRef ? $col : ++$c; - // Using getCell() will create a new cell if it doesn't already exist. We don't want that to happen - // so we test and retrieve directly against cellCollection - if ($this->cellCollection->has($col . $row)) { - // Cell exists - $cell = $this->cellCollection->get($col . $row); - if ($cell->getValue() !== null) { - if ($cell->getValue() instanceof RichText) { - $returnValue[$rRef][$cRef] = $cell->getValue()->getPlainText(); - } else { - if ($calculateFormulas) { - $returnValue[$rRef][$cRef] = $cell->getCalculatedValue(); - } else { - $returnValue[$rRef][$cRef] = $cell->getValue(); - } - } - - if ($formatData) { - $style = $this->parent->getCellXfByIndex($cell->getXfIndex()); - $returnValue[$rRef][$cRef] = NumberFormat::toFormattedString( - $returnValue[$rRef][$cRef], - ($style && $style->getNumberFormat()) ? $style->getNumberFormat()->getFormatCode() : NumberFormat::FORMAT_GENERAL - ); - } - } else { - // Cell holds a NULL - $returnValue[$rRef][$cRef] = $nullValue; - } - } else { - // Cell doesn't exist - $returnValue[$rRef][$cRef] = $nullValue; - } - } - } - - // Return - return $returnValue; - } - - /** - * Create array from a range of cells. - * - * @param string $pNamedRange Name of the Named Range - * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist - * @param bool $calculateFormulas Should formulas be calculated? - * @param bool $formatData Should formatting be applied to cell values? - * @param bool $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero - * True - Return rows and columns indexed by their actual row and column IDs - * - * @return array - */ - public function namedRangeToArray($pNamedRange, $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) - { - $namedRange = DefinedName::resolveName($pNamedRange, $this); - if ($namedRange !== null) { - $pWorkSheet = $namedRange->getWorksheet(); - $pCellRange = $namedRange->getValue(); - - return $pWorkSheet->rangeToArray($pCellRange, $nullValue, $calculateFormulas, $formatData, $returnCellRef); - } - - throw new Exception('Named Range ' . $pNamedRange . ' does not exist.'); - } - - /** - * Create array from worksheet. - * - * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist - * @param bool $calculateFormulas Should formulas be calculated? - * @param bool $formatData Should formatting be applied to cell values? - * @param bool $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero - * True - Return rows and columns indexed by their actual row and column IDs - * - * @return array - */ - public function toArray($nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) - { - // Garbage collect... - $this->garbageCollect(); - - // Identify the range that we need to extract from the worksheet - $maxCol = $this->getHighestColumn(); - $maxRow = $this->getHighestRow(); - - // Return - return $this->rangeToArray('A1:' . $maxCol . $maxRow, $nullValue, $calculateFormulas, $formatData, $returnCellRef); - } - - /** - * Get row iterator. - * - * @param int $startRow The row number at which to start iterating - * @param int $endRow The row number at which to stop iterating - * - * @return RowIterator - */ - public function getRowIterator($startRow = 1, $endRow = null) - { - return new RowIterator($this, $startRow, $endRow); - } - - /** - * Get column iterator. - * - * @param string $startColumn The column address at which to start iterating - * @param string $endColumn The column address at which to stop iterating - * - * @return ColumnIterator - */ - public function getColumnIterator($startColumn = 'A', $endColumn = null) - { - return new ColumnIterator($this, $startColumn, $endColumn); - } - - /** - * Run PhpSpreadsheet garbage collector. - * - * @return $this - */ - public function garbageCollect() - { - // Flush cache - $this->cellCollection->get('A1'); - - // Lookup highest column and highest row if cells are cleaned - $colRow = $this->cellCollection->getHighestRowAndColumn(); - $highestRow = $colRow['row']; - $highestColumn = Coordinate::columnIndexFromString($colRow['column']); - - // Loop through column dimensions - foreach ($this->columnDimensions as $dimension) { - $highestColumn = max($highestColumn, Coordinate::columnIndexFromString($dimension->getColumnIndex())); - } - - // Loop through row dimensions - foreach ($this->rowDimensions as $dimension) { - $highestRow = max($highestRow, $dimension->getRowIndex()); - } - - // Cache values - if ($highestColumn < 1) { - $this->cachedHighestColumn = 'A'; - } else { - $this->cachedHighestColumn = Coordinate::stringFromColumnIndex($highestColumn); - } - $this->cachedHighestRow = $highestRow; - - // Return - return $this; - } - - /** - * Get hash code. - * - * @return string Hash code - */ - public function getHashCode() - { - if ($this->dirty) { - $this->hash = md5($this->title . $this->autoFilter . ($this->protection->isProtectionEnabled() ? 't' : 'f') . __CLASS__); - $this->dirty = false; - } - - return $this->hash; - } - - /** - * Extract worksheet title from range. - * - * Example: extractSheetTitle("testSheet!A1") ==> 'A1' - * Example: extractSheetTitle("'testSheet 1'!A1", true) ==> ['testSheet 1', 'A1']; - * - * @param string $pRange Range to extract title from - * @param bool $returnRange Return range? (see example) - * - * @return mixed - */ - public static function extractSheetTitle($pRange, $returnRange = false) - { - // Sheet title included? - if (($sep = strrpos($pRange, '!')) === false) { - return $returnRange ? ['', $pRange] : ''; - } - - if ($returnRange) { - return [substr($pRange, 0, $sep), substr($pRange, $sep + 1)]; - } - - return substr($pRange, $sep + 1); - } - - /** - * Get hyperlink. - * - * @param string $pCellCoordinate Cell coordinate to get hyperlink for, eg: 'A1' - * - * @return Hyperlink - */ - public function getHyperlink($pCellCoordinate) - { - // return hyperlink if we already have one - if (isset($this->hyperlinkCollection[$pCellCoordinate])) { - return $this->hyperlinkCollection[$pCellCoordinate]; - } - - // else create hyperlink - $this->hyperlinkCollection[$pCellCoordinate] = new Hyperlink(); - - return $this->hyperlinkCollection[$pCellCoordinate]; - } - - /** - * Set hyperlink. - * - * @param string $pCellCoordinate Cell coordinate to insert hyperlink, eg: 'A1' - * - * @return $this - */ - public function setHyperlink($pCellCoordinate, ?Hyperlink $pHyperlink = null) - { - if ($pHyperlink === null) { - unset($this->hyperlinkCollection[$pCellCoordinate]); - } else { - $this->hyperlinkCollection[$pCellCoordinate] = $pHyperlink; - } - - return $this; - } - - /** - * Hyperlink at a specific coordinate exists? - * - * @param string $pCoordinate eg: 'A1' - * - * @return bool - */ - public function hyperlinkExists($pCoordinate) - { - return isset($this->hyperlinkCollection[$pCoordinate]); - } - - /** - * Get collection of hyperlinks. - * - * @return Hyperlink[] - */ - public function getHyperlinkCollection() - { - return $this->hyperlinkCollection; - } - - /** - * Get data validation. - * - * @param string $pCellCoordinate Cell coordinate to get data validation for, eg: 'A1' - * - * @return DataValidation - */ - public function getDataValidation($pCellCoordinate) - { - // return data validation if we already have one - if (isset($this->dataValidationCollection[$pCellCoordinate])) { - return $this->dataValidationCollection[$pCellCoordinate]; - } - - // else create data validation - $this->dataValidationCollection[$pCellCoordinate] = new DataValidation(); - - return $this->dataValidationCollection[$pCellCoordinate]; - } - - /** - * Set data validation. - * - * @param string $pCellCoordinate Cell coordinate to insert data validation, eg: 'A1' - * - * @return $this - */ - public function setDataValidation($pCellCoordinate, ?DataValidation $pDataValidation = null) - { - if ($pDataValidation === null) { - unset($this->dataValidationCollection[$pCellCoordinate]); - } else { - $this->dataValidationCollection[$pCellCoordinate] = $pDataValidation; - } - - return $this; - } - - /** - * Data validation at a specific coordinate exists? - * - * @param string $pCoordinate eg: 'A1' - * - * @return bool - */ - public function dataValidationExists($pCoordinate) - { - return isset($this->dataValidationCollection[$pCoordinate]); - } - - /** - * Get collection of data validations. - * - * @return DataValidation[] - */ - public function getDataValidationCollection() - { - return $this->dataValidationCollection; - } - - /** - * Accepts a range, returning it as a range that falls within the current highest row and column of the worksheet. - * - * @param string $range - * - * @return string Adjusted range value - */ - public function shrinkRangeToFit($range) - { - $maxCol = $this->getHighestColumn(); - $maxRow = $this->getHighestRow(); - $maxCol = Coordinate::columnIndexFromString($maxCol); - - $rangeBlocks = explode(' ', $range); - foreach ($rangeBlocks as &$rangeSet) { - $rangeBoundaries = Coordinate::getRangeBoundaries($rangeSet); - - if (Coordinate::columnIndexFromString($rangeBoundaries[0][0]) > $maxCol) { - $rangeBoundaries[0][0] = Coordinate::stringFromColumnIndex($maxCol); - } - if ($rangeBoundaries[0][1] > $maxRow) { - $rangeBoundaries[0][1] = $maxRow; - } - if (Coordinate::columnIndexFromString($rangeBoundaries[1][0]) > $maxCol) { - $rangeBoundaries[1][0] = Coordinate::stringFromColumnIndex($maxCol); - } - if ($rangeBoundaries[1][1] > $maxRow) { - $rangeBoundaries[1][1] = $maxRow; - } - $rangeSet = $rangeBoundaries[0][0] . $rangeBoundaries[0][1] . ':' . $rangeBoundaries[1][0] . $rangeBoundaries[1][1]; - } - unset($rangeSet); - - return implode(' ', $rangeBlocks); - } - - /** - * Get tab color. - * - * @return Color - */ - public function getTabColor() - { - if ($this->tabColor === null) { - $this->tabColor = new Color(); - } - - return $this->tabColor; - } - - /** - * Reset tab color. - * - * @return $this - */ - public function resetTabColor() - { - $this->tabColor = null; - $this->tabColor = null; - - return $this; - } - - /** - * Tab color set? - * - * @return bool - */ - public function isTabColorSet() - { - return $this->tabColor !== null; - } - - /** - * Copy worksheet (!= clone!). - * - * @return static - */ - public function copy() - { - return clone $this; - } - - /** - * Implement PHP __clone to create a deep clone, not just a shallow copy. - */ - public function __clone() - { - foreach ($this as $key => $val) { - if ($key == 'parent') { - continue; - } - - if (is_object($val) || (is_array($val))) { - if ($key == 'cellCollection') { - $newCollection = $this->cellCollection->cloneCellCollection($this); - $this->cellCollection = $newCollection; - } elseif ($key == 'drawingCollection') { - $currentCollection = $this->drawingCollection; - $this->drawingCollection = new ArrayObject(); - foreach ($currentCollection as $item) { - if (is_object($item)) { - $newDrawing = clone $item; - $newDrawing->setWorksheet($this); - } - } - } elseif (($key == 'autoFilter') && ($this->autoFilter instanceof AutoFilter)) { - $newAutoFilter = clone $this->autoFilter; - $this->autoFilter = $newAutoFilter; - $this->autoFilter->setParent($this); - } else { - $this->{$key} = unserialize(serialize($val)); - } - } - } - } - - /** - * Define the code name of the sheet. - * - * @param string $pValue Same rule as Title minus space not allowed (but, like Excel, change - * silently space to underscore) - * @param bool $validate False to skip validation of new title. WARNING: This should only be set - * at parse time (by Readers), where titles can be assumed to be valid. - * - * @return $this - */ - public function setCodeName($pValue, $validate = true) - { - // Is this a 'rename' or not? - if ($this->getCodeName() == $pValue) { - return $this; - } - - if ($validate) { - $pValue = str_replace(' ', '_', $pValue); //Excel does this automatically without flinching, we are doing the same - - // Syntax check - // throw an exception if not valid - self::checkSheetCodeName($pValue); - - // We use the same code that setTitle to find a valid codeName else not using a space (Excel don't like) but a '_' - - if ($this->getParent()) { - // Is there already such sheet name? - if ($this->getParent()->sheetCodeNameExists($pValue)) { - // Use name, but append with lowest possible integer - - if (Shared\StringHelper::countCharacters($pValue) > 29) { - $pValue = Shared\StringHelper::substring($pValue, 0, 29); - } - $i = 1; - while ($this->getParent()->sheetCodeNameExists($pValue . '_' . $i)) { - ++$i; - if ($i == 10) { - if (Shared\StringHelper::countCharacters($pValue) > 28) { - $pValue = Shared\StringHelper::substring($pValue, 0, 28); - } - } elseif ($i == 100) { - if (Shared\StringHelper::countCharacters($pValue) > 27) { - $pValue = Shared\StringHelper::substring($pValue, 0, 27); - } - } - } - - $pValue .= '_' . $i; // ok, we have a valid name - } - } - } - - $this->codeName = $pValue; - - return $this; - } - - /** - * Return the code name of the sheet. - * - * @return null|string - */ - public function getCodeName() - { - return $this->codeName; - } - - /** - * Sheet has a code name ? - * - * @return bool - */ - public function hasCodeName() - { - return $this->codeName !== null; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/BaseWriter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/BaseWriter.php deleted file mode 100644 index afda5c4..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/BaseWriter.php +++ /dev/null @@ -1,131 +0,0 @@ -includeCharts; - } - - public function setIncludeCharts($pValue) - { - $this->includeCharts = (bool) $pValue; - - return $this; - } - - public function getPreCalculateFormulas() - { - return $this->preCalculateFormulas; - } - - public function setPreCalculateFormulas($pValue) - { - $this->preCalculateFormulas = (bool) $pValue; - - return $this; - } - - public function getUseDiskCaching() - { - return $this->useDiskCaching; - } - - public function setUseDiskCaching($pValue, $pDirectory = null) - { - $this->useDiskCaching = $pValue; - - if ($pDirectory !== null) { - if (is_dir($pDirectory)) { - $this->diskCachingDirectory = $pDirectory; - } else { - throw new Exception("Directory does not exist: $pDirectory"); - } - } - - return $this; - } - - public function getDiskCachingDirectory() - { - return $this->diskCachingDirectory; - } - - /** - * Open file handle. - * - * @param resource|string $filename - */ - public function openFileHandle($filename): void - { - if (is_resource($filename)) { - $this->fileHandle = $filename; - $this->shouldCloseFile = false; - - return; - } - - $fileHandle = $filename ? fopen($filename, 'wb+') : false; - if ($fileHandle === false) { - throw new Exception('Could not open file "' . $filename . '" for writing.'); - } - - $this->fileHandle = $fileHandle; - $this->shouldCloseFile = true; - } - - /** - * Close file handle only if we opened it ourselves. - */ - protected function maybeCloseFileHandle(): void - { - if ($this->shouldCloseFile) { - if (!fclose($this->fileHandle)) { - throw new Exception('Could not close file after writing.'); - } - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php deleted file mode 100644 index 74f2863..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php +++ /dev/null @@ -1,352 +0,0 @@ -spreadsheet = $spreadsheet; - } - - /** - * Save PhpSpreadsheet to file. - * - * @param resource|string $pFilename - */ - public function save($pFilename): void - { - // Fetch sheet - $sheet = $this->spreadsheet->getSheet($this->sheetIndex); - - $saveDebugLog = Calculation::getInstance($this->spreadsheet)->getDebugLog()->getWriteDebugLog(); - Calculation::getInstance($this->spreadsheet)->getDebugLog()->setWriteDebugLog(false); - $saveArrayReturnType = Calculation::getArrayReturnType(); - Calculation::setArrayReturnType(Calculation::RETURN_ARRAY_AS_VALUE); - - // Open file - $this->openFileHandle($pFilename); - - if ($this->excelCompatibility) { - $this->setUseBOM(true); // Enforce UTF-8 BOM Header - $this->setIncludeSeparatorLine(true); // Set separator line - $this->setEnclosure('"'); // Set enclosure to " - $this->setDelimiter(';'); // Set delimiter to a semi-colon - $this->setLineEnding("\r\n"); - } - - if ($this->useBOM) { - // Write the UTF-8 BOM code if required - fwrite($this->fileHandle, "\xEF\xBB\xBF"); - } - - if ($this->includeSeparatorLine) { - // Write the separator line if required - fwrite($this->fileHandle, 'sep=' . $this->getDelimiter() . $this->lineEnding); - } - - // Identify the range that we need to extract from the worksheet - $maxCol = $sheet->getHighestDataColumn(); - $maxRow = $sheet->getHighestDataRow(); - - // Write rows to file - for ($row = 1; $row <= $maxRow; ++$row) { - // Convert the row to an array... - $cellsArray = $sheet->rangeToArray('A' . $row . ':' . $maxCol . $row, '', $this->preCalculateFormulas); - // ... and write to the file - $this->writeLine($this->fileHandle, $cellsArray[0]); - } - - $this->maybeCloseFileHandle(); - Calculation::setArrayReturnType($saveArrayReturnType); - Calculation::getInstance($this->spreadsheet)->getDebugLog()->setWriteDebugLog($saveDebugLog); - } - - /** - * Get delimiter. - * - * @return string - */ - public function getDelimiter() - { - return $this->delimiter; - } - - /** - * Set delimiter. - * - * @param string $pValue Delimiter, defaults to ',' - * - * @return $this - */ - public function setDelimiter($pValue) - { - $this->delimiter = $pValue; - - return $this; - } - - /** - * Get enclosure. - * - * @return string - */ - public function getEnclosure() - { - return $this->enclosure; - } - - /** - * Set enclosure. - * - * @param string $pValue Enclosure, defaults to " - * - * @return $this - */ - public function setEnclosure($pValue = '"') - { - $this->enclosure = $pValue; - - return $this; - } - - /** - * Get line ending. - * - * @return string - */ - public function getLineEnding() - { - return $this->lineEnding; - } - - /** - * Set line ending. - * - * @param string $pValue Line ending, defaults to OS line ending (PHP_EOL) - * - * @return $this - */ - public function setLineEnding($pValue) - { - $this->lineEnding = $pValue; - - return $this; - } - - /** - * Get whether BOM should be used. - * - * @return bool - */ - public function getUseBOM() - { - return $this->useBOM; - } - - /** - * Set whether BOM should be used. - * - * @param bool $pValue Use UTF-8 byte-order mark? Defaults to false - * - * @return $this - */ - public function setUseBOM($pValue) - { - $this->useBOM = $pValue; - - return $this; - } - - /** - * Get whether a separator line should be included. - * - * @return bool - */ - public function getIncludeSeparatorLine() - { - return $this->includeSeparatorLine; - } - - /** - * Set whether a separator line should be included as the first line of the file. - * - * @param bool $pValue Use separator line? Defaults to false - * - * @return $this - */ - public function setIncludeSeparatorLine($pValue) - { - $this->includeSeparatorLine = $pValue; - - return $this; - } - - /** - * Get whether the file should be saved with full Excel Compatibility. - * - * @return bool - */ - public function getExcelCompatibility() - { - return $this->excelCompatibility; - } - - /** - * Set whether the file should be saved with full Excel Compatibility. - * - * @param bool $pValue Set the file to be written as a fully Excel compatible csv file - * Note that this overrides other settings such as useBOM, enclosure and delimiter - * - * @return $this - */ - public function setExcelCompatibility($pValue) - { - $this->excelCompatibility = $pValue; - - return $this; - } - - /** - * Get sheet index. - * - * @return int - */ - public function getSheetIndex() - { - return $this->sheetIndex; - } - - /** - * Set sheet index. - * - * @param int $pValue Sheet index - * - * @return $this - */ - public function setSheetIndex($pValue) - { - $this->sheetIndex = $pValue; - - return $this; - } - - private $enclosureRequired = true; - - public function setEnclosureRequired(bool $value): self - { - $this->enclosureRequired = $value; - - return $this; - } - - public function getEnclosureRequired(): bool - { - return $this->enclosureRequired; - } - - /** - * Write line to CSV file. - * - * @param resource $pFileHandle PHP filehandle - * @param array $pValues Array containing values in a row - */ - private function writeLine($pFileHandle, array $pValues): void - { - // No leading delimiter - $delimiter = ''; - - // Build the line - $line = ''; - - foreach ($pValues as $element) { - // Add delimiter - $line .= $delimiter; - $delimiter = $this->delimiter; - // Escape enclosures - $enclosure = $this->enclosure; - if ($enclosure) { - // If enclosure is not required, use enclosure only if - // element contains newline, delimiter, or enclosure. - if (!$this->enclosureRequired && strpbrk($element, "$delimiter$enclosure\n") === false) { - $enclosure = ''; - } else { - $element = str_replace($enclosure, $enclosure . $enclosure, $element); - } - } - // Add enclosed string - $line .= $enclosure . $element . $enclosure; - } - - // Add line ending - $line .= $this->lineEnding; - - // Write to file - fwrite($pFileHandle, $line); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Exception.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Exception.php deleted file mode 100644 index 92e6f5f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Exception.php +++ /dev/null @@ -1,9 +0,0 @@ -spreadsheet = $spreadsheet; - $this->defaultFont = $this->spreadsheet->getDefaultStyle()->getFont(); - } - - /** - * Save Spreadsheet to file. - * - * @param resource|string $pFilename - */ - public function save($pFilename): void - { - // Open file - $this->openFileHandle($pFilename); - - // Write html - fwrite($this->fileHandle, $this->generateHTMLAll()); - - // Close file - $this->maybeCloseFileHandle(); - } - - /** - * Save Spreadsheet as html to variable. - * - * @return string - */ - public function generateHtmlAll() - { - // garbage collect - $this->spreadsheet->garbageCollect(); - - $saveDebugLog = Calculation::getInstance($this->spreadsheet)->getDebugLog()->getWriteDebugLog(); - Calculation::getInstance($this->spreadsheet)->getDebugLog()->setWriteDebugLog(false); - $saveArrayReturnType = Calculation::getArrayReturnType(); - Calculation::setArrayReturnType(Calculation::RETURN_ARRAY_AS_VALUE); - - // Build CSS - $this->buildCSS(!$this->useInlineCss); - - $html = ''; - - // Write headers - $html .= $this->generateHTMLHeader(!$this->useInlineCss); - - // Write navigation (tabs) - if ((!$this->isPdf) && ($this->generateSheetNavigationBlock)) { - $html .= $this->generateNavigation(); - } - - // Write data - $html .= $this->generateSheetData(); - - // Write footer - $html .= $this->generateHTMLFooter(); - $callback = $this->editHtmlCallback; - if ($callback) { - $html = $callback($html); - } - - Calculation::setArrayReturnType($saveArrayReturnType); - Calculation::getInstance($this->spreadsheet)->getDebugLog()->setWriteDebugLog($saveDebugLog); - - return $html; - } - - /** - * Set a callback to edit the entire HTML. - * - * The callback must accept the HTML as string as first parameter, - * and it must return the edited HTML as string. - */ - public function setEditHtmlCallback(?callable $callback): void - { - $this->editHtmlCallback = $callback; - } - - const VALIGN_ARR = [ - Alignment::VERTICAL_BOTTOM => 'bottom', - Alignment::VERTICAL_TOP => 'top', - Alignment::VERTICAL_CENTER => 'middle', - Alignment::VERTICAL_JUSTIFY => 'middle', - ]; - - /** - * Map VAlign. - * - * @param string $vAlign Vertical alignment - * - * @return string - */ - private function mapVAlign($vAlign) - { - return array_key_exists($vAlign, self::VALIGN_ARR) ? self::VALIGN_ARR[$vAlign] : 'baseline'; - } - - const HALIGN_ARR = [ - Alignment::HORIZONTAL_LEFT => 'left', - Alignment::HORIZONTAL_RIGHT => 'right', - Alignment::HORIZONTAL_CENTER => 'center', - Alignment::HORIZONTAL_CENTER_CONTINUOUS => 'center', - Alignment::HORIZONTAL_JUSTIFY => 'justify', - ]; - - /** - * Map HAlign. - * - * @param string $hAlign Horizontal alignment - * - * @return string - */ - private function mapHAlign($hAlign) - { - return array_key_exists($hAlign, self::HALIGN_ARR) ? self::HALIGN_ARR[$hAlign] : ''; - } - - const BORDER_ARR = [ - Border::BORDER_NONE => 'none', - Border::BORDER_DASHDOT => '1px dashed', - Border::BORDER_DASHDOTDOT => '1px dotted', - Border::BORDER_DASHED => '1px dashed', - Border::BORDER_DOTTED => '1px dotted', - Border::BORDER_DOUBLE => '3px double', - Border::BORDER_HAIR => '1px solid', - Border::BORDER_MEDIUM => '2px solid', - Border::BORDER_MEDIUMDASHDOT => '2px dashed', - Border::BORDER_MEDIUMDASHDOTDOT => '2px dotted', - Border::BORDER_SLANTDASHDOT => '2px dashed', - Border::BORDER_THICK => '3px solid', - ]; - - /** - * Map border style. - * - * @param int $borderStyle Sheet index - * - * @return string - */ - private function mapBorderStyle($borderStyle) - { - return array_key_exists($borderStyle, self::BORDER_ARR) ? self::BORDER_ARR[$borderStyle] : '1px solid'; - } - - /** - * Get sheet index. - * - * @return int - */ - public function getSheetIndex() - { - return $this->sheetIndex; - } - - /** - * Set sheet index. - * - * @param int $pValue Sheet index - * - * @return $this - */ - public function setSheetIndex($pValue) - { - $this->sheetIndex = $pValue; - - return $this; - } - - /** - * Get sheet index. - * - * @return bool - */ - public function getGenerateSheetNavigationBlock() - { - return $this->generateSheetNavigationBlock; - } - - /** - * Set sheet index. - * - * @param bool $pValue Flag indicating whether the sheet navigation block should be generated or not - * - * @return $this - */ - public function setGenerateSheetNavigationBlock($pValue) - { - $this->generateSheetNavigationBlock = (bool) $pValue; - - return $this; - } - - /** - * Write all sheets (resets sheetIndex to NULL). - * - * @return $this - */ - public function writeAllSheets() - { - $this->sheetIndex = null; - - return $this; - } - - private static function generateMeta($val, $desc) - { - return $val ? (' ' . PHP_EOL) : ''; - } - - /** - * Generate HTML header. - * - * @param bool $pIncludeStyles Include styles? - * - * @return string - */ - public function generateHTMLHeader($pIncludeStyles = false) - { - // Construct HTML - $properties = $this->spreadsheet->getProperties(); - $html = '' . PHP_EOL; - $html .= '' . PHP_EOL; - $html .= ' ' . PHP_EOL; - $html .= ' ' . PHP_EOL; - $html .= ' ' . PHP_EOL; - $html .= ' ' . htmlspecialchars($properties->getTitle()) . '' . PHP_EOL; - $html .= self::generateMeta($properties->getCreator(), 'author'); - $html .= self::generateMeta($properties->getTitle(), 'title'); - $html .= self::generateMeta($properties->getDescription(), 'description'); - $html .= self::generateMeta($properties->getSubject(), 'subject'); - $html .= self::generateMeta($properties->getKeywords(), 'keywords'); - $html .= self::generateMeta($properties->getCategory(), 'category'); - $html .= self::generateMeta($properties->getCompany(), 'company'); - $html .= self::generateMeta($properties->getManager(), 'manager'); - - $html .= $pIncludeStyles ? $this->generateStyles(true) : $this->generatePageDeclarations(true); - - $html .= ' ' . PHP_EOL; - $html .= '' . PHP_EOL; - $html .= ' ' . PHP_EOL; - - return $html; - } - - private function generateSheetPrep() - { - // Ensure that Spans have been calculated? - $this->calculateSpans(); - - // Fetch sheets - if ($this->sheetIndex === null) { - $sheets = $this->spreadsheet->getAllSheets(); - } else { - $sheets = [$this->spreadsheet->getSheet($this->sheetIndex)]; - } - - return $sheets; - } - - private function generateSheetStarts($sheet, $rowMin) - { - // calculate start of , - $tbodyStart = $rowMin; - $theadStart = $theadEnd = 0; // default: no no - if ($sheet->getPageSetup()->isRowsToRepeatAtTopSet()) { - $rowsToRepeatAtTop = $sheet->getPageSetup()->getRowsToRepeatAtTop(); - - // we can only support repeating rows that start at top row - if ($rowsToRepeatAtTop[0] == 1) { - $theadStart = $rowsToRepeatAtTop[0]; - $theadEnd = $rowsToRepeatAtTop[1]; - $tbodyStart = $rowsToRepeatAtTop[1] + 1; - } - } - - return [$theadStart, $theadEnd, $tbodyStart]; - } - - private function generateSheetTags($row, $theadStart, $theadEnd, $tbodyStart) - { - // ? - $startTag = ($row == $theadStart) ? (' ' . PHP_EOL) : ''; - if (!$startTag) { - $startTag = ($row == $tbodyStart) ? (' ' . PHP_EOL) : ''; - } - $endTag = ($row == $theadEnd) ? (' ' . PHP_EOL) : ''; - $cellType = ($row >= $tbodyStart) ? 'td' : 'th'; - - return [$cellType, $startTag, $endTag]; - } - - /** - * Generate sheet data. - * - * @return string - */ - public function generateSheetData() - { - $sheets = $this->generateSheetPrep(); - - // Construct HTML - $html = ''; - - // Loop all sheets - $sheetId = 0; - foreach ($sheets as $sheet) { - // Write table header - $html .= $this->generateTableHeader($sheet); - - // Get worksheet dimension - [$min, $max] = explode(':', $sheet->calculateWorksheetDataDimension()); - [$minCol, $minRow] = Coordinate::coordinateFromString($min); - $minCol = Coordinate::columnIndexFromString($minCol); - [$maxCol, $maxRow] = Coordinate::coordinateFromString($max); - $maxCol = Coordinate::columnIndexFromString($maxCol); - - [$theadStart, $theadEnd, $tbodyStart] = $this->generateSheetStarts($sheet, $minRow); - - // Loop through cells - $row = $minRow - 1; - while ($row++ < $maxRow) { - [$cellType, $startTag, $endTag] = $this->generateSheetTags($row, $theadStart, $theadEnd, $tbodyStart); - $html .= $startTag; - - // Write row if there are HTML table cells in it - if (!isset($this->isSpannedRow[$sheet->getParent()->getIndex($sheet)][$row])) { - // Start a new rowData - $rowData = []; - // Loop through columns - $column = $minCol; - while ($column <= $maxCol) { - // Cell exists? - if ($sheet->cellExistsByColumnAndRow($column, $row)) { - $rowData[$column] = Coordinate::stringFromColumnIndex($column) . $row; - } else { - $rowData[$column] = ''; - } - ++$column; - } - $html .= $this->generateRow($sheet, $rowData, $row - 1, $cellType); - } - - $html .= $endTag; - } - $html .= $this->extendRowsForChartsAndImages($sheet, $row); - - // Write table footer - $html .= $this->generateTableFooter(); - // Writing PDF? - if ($this->isPdf && $this->useInlineCss) { - if ($this->sheetIndex === null && $sheetId + 1 < $this->spreadsheet->getSheetCount()) { - $html .= '

'; - } - } - - // Next sheet - ++$sheetId; - } - - return $html; - } - - /** - * Generate sheet tabs. - * - * @return string - */ - public function generateNavigation() - { - // Fetch sheets - $sheets = []; - if ($this->sheetIndex === null) { - $sheets = $this->spreadsheet->getAllSheets(); - } else { - $sheets[] = $this->spreadsheet->getSheet($this->sheetIndex); - } - - // Construct HTML - $html = ''; - - // Only if there are more than 1 sheets - if (count($sheets) > 1) { - // Loop all sheets - $sheetId = 0; - - $html .= '' . PHP_EOL; - } - - return $html; - } - - /** - * Extend Row if chart is placed after nominal end of row. - * This code should be exercised by sample: - * Chart/32_Chart_read_write_PDF.php. - * However, that test is suppressed due to out-of-date - * Jpgraph code issuing warnings. So, don't measure - * code coverage for this function till that is fixed. - * - * @param Worksheet $pSheet \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet - * @param int $row Row to check for charts - * - * @return array - * - * @codeCoverageIgnore - */ - private function extendRowsForCharts(Worksheet $pSheet, int $row) - { - $rowMax = $row; - $colMax = 'A'; - $anyfound = false; - if ($this->includeCharts) { - foreach ($pSheet->getChartCollection() as $chart) { - if ($chart instanceof Chart) { - $anyfound = true; - $chartCoordinates = $chart->getTopLeftPosition(); - $chartTL = Coordinate::coordinateFromString($chartCoordinates['cell']); - $chartCol = Coordinate::columnIndexFromString($chartTL[0]); - if ($chartTL[1] > $rowMax) { - $rowMax = $chartTL[1]; - if ($chartCol > Coordinate::columnIndexFromString($colMax)) { - $colMax = $chartTL[0]; - } - } - } - } - } - - return [$rowMax, $colMax, $anyfound]; - } - - private function extendRowsForChartsAndImages(Worksheet $pSheet, int $row): string - { - [$rowMax, $colMax, $anyfound] = $this->extendRowsForCharts($pSheet, $row); - - foreach ($pSheet->getDrawingCollection() as $drawing) { - $anyfound = true; - $imageTL = Coordinate::coordinateFromString($drawing->getCoordinates()); - $imageCol = Coordinate::columnIndexFromString($imageTL[0]); - if ($imageTL[1] > $rowMax) { - $rowMax = $imageTL[1]; - if ($imageCol > Coordinate::columnIndexFromString($colMax)) { - $colMax = $imageTL[0]; - } - } - } - - // Don't extend rows if not needed - if ($row === $rowMax || !$anyfound) { - return ''; - } - - $html = ''; - ++$colMax; - ++$row; - while ($row <= $rowMax) { - $html .= ''; - for ($col = 'A'; $col != $colMax; ++$col) { - $htmlx = $this->writeImageInCell($pSheet, $col . $row); - $htmlx .= $this->includeCharts ? $this->writeChartInCell($pSheet, $col . $row) : ''; - if ($htmlx) { - $html .= "$htmlx"; - } else { - $html .= ""; - } - } - ++$row; - $html .= '' . PHP_EOL; - } - - return $html; - } - - /** - * Convert Windows file name to file protocol URL. - * - * @param string $filename file name on local system - * - * @return string - */ - public static function winFileToUrl($filename) - { - // Windows filename - if (substr($filename, 1, 2) === ':\\') { - $filename = 'file:///' . str_replace('\\', '/', $filename); - } - - return $filename; - } - - /** - * Generate image tag in cell. - * - * @param Worksheet $pSheet \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet - * @param string $coordinates Cell coordinates - * - * @return string - */ - private function writeImageInCell(Worksheet $pSheet, $coordinates) - { - // Construct HTML - $html = ''; - - // Write images - foreach ($pSheet->getDrawingCollection() as $drawing) { - if ($drawing->getCoordinates() != $coordinates) { - continue; - } - $filedesc = $drawing->getDescription(); - $filedesc = $filedesc ? htmlspecialchars($filedesc, ENT_QUOTES) : 'Embedded image'; - if ($drawing instanceof Drawing) { - $filename = $drawing->getPath(); - - // Strip off eventual '.' - $filename = preg_replace('/^[.]/', '', $filename); - - // Prepend images root - $filename = $this->getImagesRoot() . $filename; - - // Strip off eventual '.' if followed by non-/ - $filename = preg_replace('@^[.]([^/])@', '$1', $filename); - - // Convert UTF8 data to PCDATA - $filename = htmlspecialchars($filename); - - $html .= PHP_EOL; - $imageData = self::winFileToUrl($filename); - - if ($this->embedImages && !$this->isPdf) { - $picture = @file_get_contents($filename); - if ($picture !== false) { - $imageDetails = getimagesize($filename); - // base64 encode the binary data - $base64 = base64_encode($picture); - $imageData = 'data:' . $imageDetails['mime'] . ';base64,' . $base64; - } - } - - $html .= '' . $filedesc . ''; - } elseif ($drawing instanceof MemoryDrawing) { - ob_start(); // Let's start output buffering. - imagepng($drawing->getImageResource()); // This will normally output the image, but because of ob_start(), it won't. - $contents = ob_get_contents(); // Instead, output above is saved to $contents - ob_end_clean(); // End the output buffer. - - $dataUri = 'data:image/jpeg;base64,' . base64_encode($contents); - - // Because of the nature of tables, width is more important than height. - // max-width: 100% ensures that image doesnt overflow containing cell - // width: X sets width of supplied image. - // As a result, images bigger than cell will be contained and images smaller will not get stretched - $html .= '' . $filedesc . ''; - } - } - - return $html; - } - - /** - * Generate chart tag in cell. - * This code should be exercised by sample: - * Chart/32_Chart_read_write_PDF.php. - * However, that test is suppressed due to out-of-date - * Jpgraph code issuing warnings. So, don't measure - * code coverage for this function till that is fixed. - * - * @param Worksheet $pSheet \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet - * @param string $coordinates Cell coordinates - * - * @return string - * - * @codeCoverageIgnore - */ - private function writeChartInCell(Worksheet $pSheet, $coordinates) - { - // Construct HTML - $html = ''; - - // Write charts - foreach ($pSheet->getChartCollection() as $chart) { - if ($chart instanceof Chart) { - $chartCoordinates = $chart->getTopLeftPosition(); - if ($chartCoordinates['cell'] == $coordinates) { - $chartFileName = File::sysGetTempDir() . '/' . uniqid('', true) . '.png'; - if (!$chart->render($chartFileName)) { - return; - } - - $html .= PHP_EOL; - $imageDetails = getimagesize($chartFileName); - $filedesc = $chart->getTitle(); - $filedesc = $filedesc ? self::getChartCaption($filedesc->getCaption()) : ''; - $filedesc = $filedesc ? htmlspecialchars($filedesc, ENT_QUOTES) : 'Embedded chart'; - if ($fp = fopen($chartFileName, 'rb', 0)) { - $picture = fread($fp, filesize($chartFileName)); - fclose($fp); - // base64 encode the binary data - $base64 = base64_encode($picture); - $imageData = 'data:' . $imageDetails['mime'] . ';base64,' . $base64; - - $html .= '' . $filedesc . '' . PHP_EOL; - - unlink($chartFileName); - } - } - } - } - - // Return - return $html; - } - - /** - * Extend Row if chart is placed after nominal end of row. - * This code should be exercised by sample: - * Chart/32_Chart_read_write_PDF.php. - * However, that test is suppressed due to out-of-date - * Jpgraph code issuing warnings. So, don't measure - * code coverage for this function till that is fixed. - * Caption is described in documentation as fixed, - * but in 32_Chart it is somehow an array of RichText. - * - * @param mixed $cap - * - * @return string - * - * @codeCoverageIgnore - */ - private static function getChartCaption($cap) - { - return is_array($cap) ? implode(' ', $cap) : $cap; - } - - /** - * Generate CSS styles. - * - * @param bool $generateSurroundingHTML Generate surrounding HTML tags? (<style> and </style>) - * - * @return string - */ - public function generateStyles($generateSurroundingHTML = true) - { - // Build CSS - $css = $this->buildCSS($generateSurroundingHTML); - - // Construct HTML - $html = ''; - - // Start styles - if ($generateSurroundingHTML) { - $html .= ' ' . PHP_EOL; - } - - // Return - return $html; - } - - private function buildCssRowHeights(Worksheet $sheet, array &$css, int $sheetIndex): void - { - // Calculate row heights - foreach ($sheet->getRowDimensions() as $rowDimension) { - $row = $rowDimension->getRowIndex() - 1; - - // table.sheetN tr.rowYYYYYY { } - $css['table.sheet' . $sheetIndex . ' tr.row' . $row] = []; - - if ($rowDimension->getRowHeight() != -1) { - $pt_height = $rowDimension->getRowHeight(); - $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['height'] = $pt_height . 'pt'; - } - if ($rowDimension->getVisible() === false) { - $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['display'] = 'none'; - $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['visibility'] = 'hidden'; - } - } - } - - private function buildCssPerSheet(Worksheet $sheet, array &$css): void - { - // Calculate hash code - $sheetIndex = $sheet->getParent()->getIndex($sheet); - - // Build styles - // Calculate column widths - $sheet->calculateColumnWidths(); - - // col elements, initialize - $highestColumnIndex = Coordinate::columnIndexFromString($sheet->getHighestColumn()) - 1; - $column = -1; - while ($column++ < $highestColumnIndex) { - $this->columnWidths[$sheetIndex][$column] = 42; // approximation - $css['table.sheet' . $sheetIndex . ' col.col' . $column]['width'] = '42pt'; - } - - // col elements, loop through columnDimensions and set width - foreach ($sheet->getColumnDimensions() as $columnDimension) { - $column = Coordinate::columnIndexFromString($columnDimension->getColumnIndex()) - 1; - $width = SharedDrawing::cellDimensionToPixels($columnDimension->getWidth(), $this->defaultFont); - $width = SharedDrawing::pixelsToPoints($width); - if ($columnDimension->getVisible() === false) { - $css['table.sheet' . $sheetIndex . ' .column' . $column]['display'] = 'none'; - } - if ($width >= 0) { - $this->columnWidths[$sheetIndex][$column] = $width; - $css['table.sheet' . $sheetIndex . ' col.col' . $column]['width'] = $width . 'pt'; - } - } - - // Default row height - $rowDimension = $sheet->getDefaultRowDimension(); - - // table.sheetN tr { } - $css['table.sheet' . $sheetIndex . ' tr'] = []; - - if ($rowDimension->getRowHeight() == -1) { - $pt_height = SharedFont::getDefaultRowHeightByFont($this->spreadsheet->getDefaultStyle()->getFont()); - } else { - $pt_height = $rowDimension->getRowHeight(); - } - $css['table.sheet' . $sheetIndex . ' tr']['height'] = $pt_height . 'pt'; - if ($rowDimension->getVisible() === false) { - $css['table.sheet' . $sheetIndex . ' tr']['display'] = 'none'; - $css['table.sheet' . $sheetIndex . ' tr']['visibility'] = 'hidden'; - } - - $this->buildCssRowHeights($sheet, $css, $sheetIndex); - } - - /** - * Build CSS styles. - * - * @param bool $generateSurroundingHTML Generate surrounding HTML style? (html { }) - * - * @return array - */ - public function buildCSS($generateSurroundingHTML = true) - { - // Cached? - if ($this->cssStyles !== null) { - return $this->cssStyles; - } - - // Ensure that spans have been calculated - $this->calculateSpans(); - - // Construct CSS - $css = []; - - // Start styles - if ($generateSurroundingHTML) { - // html { } - $css['html']['font-family'] = 'Calibri, Arial, Helvetica, sans-serif'; - $css['html']['font-size'] = '11pt'; - $css['html']['background-color'] = 'white'; - } - - // CSS for comments as found in LibreOffice - $css['a.comment-indicator:hover + div.comment'] = [ - 'background' => '#ffd', - 'position' => 'absolute', - 'display' => 'block', - 'border' => '1px solid black', - 'padding' => '0.5em', - ]; - - $css['a.comment-indicator'] = [ - 'background' => 'red', - 'display' => 'inline-block', - 'border' => '1px solid black', - 'width' => '0.5em', - 'height' => '0.5em', - ]; - - $css['div.comment']['display'] = 'none'; - - // table { } - $css['table']['border-collapse'] = 'collapse'; - - // .b {} - $css['.b']['text-align'] = 'center'; // BOOL - - // .e {} - $css['.e']['text-align'] = 'center'; // ERROR - - // .f {} - $css['.f']['text-align'] = 'right'; // FORMULA - - // .inlineStr {} - $css['.inlineStr']['text-align'] = 'left'; // INLINE - - // .n {} - $css['.n']['text-align'] = 'right'; // NUMERIC - - // .s {} - $css['.s']['text-align'] = 'left'; // STRING - - // Calculate cell style hashes - foreach ($this->spreadsheet->getCellXfCollection() as $index => $style) { - $css['td.style' . $index] = $this->createCSSStyle($style); - $css['th.style' . $index] = $this->createCSSStyle($style); - } - - // Fetch sheets - $sheets = []; - if ($this->sheetIndex === null) { - $sheets = $this->spreadsheet->getAllSheets(); - } else { - $sheets[] = $this->spreadsheet->getSheet($this->sheetIndex); - } - - // Build styles per sheet - foreach ($sheets as $sheet) { - $this->buildCssPerSheet($sheet, $css); - } - - // Cache - if ($this->cssStyles === null) { - $this->cssStyles = $css; - } - - // Return - return $css; - } - - /** - * Create CSS style. - * - * @return array - */ - private function createCSSStyle(Style $pStyle) - { - // Create CSS - return array_merge( - $this->createCSSStyleAlignment($pStyle->getAlignment()), - $this->createCSSStyleBorders($pStyle->getBorders()), - $this->createCSSStyleFont($pStyle->getFont()), - $this->createCSSStyleFill($pStyle->getFill()) - ); - } - - /** - * Create CSS style (\PhpOffice\PhpSpreadsheet\Style\Alignment). - * - * @param Alignment $pStyle \PhpOffice\PhpSpreadsheet\Style\Alignment - * - * @return array - */ - private function createCSSStyleAlignment(Alignment $pStyle) - { - // Construct CSS - $css = []; - - // Create CSS - $css['vertical-align'] = $this->mapVAlign($pStyle->getVertical()); - $textAlign = $this->mapHAlign($pStyle->getHorizontal()); - if ($textAlign) { - $css['text-align'] = $textAlign; - if (in_array($textAlign, ['left', 'right'])) { - $css['padding-' . $textAlign] = (string) ((int) $pStyle->getIndent() * 9) . 'px'; - } - } - - return $css; - } - - /** - * Create CSS style (\PhpOffice\PhpSpreadsheet\Style\Font). - * - * @return array - */ - private function createCSSStyleFont(Font $pStyle) - { - // Construct CSS - $css = []; - - // Create CSS - if ($pStyle->getBold()) { - $css['font-weight'] = 'bold'; - } - if ($pStyle->getUnderline() != Font::UNDERLINE_NONE && $pStyle->getStrikethrough()) { - $css['text-decoration'] = 'underline line-through'; - } elseif ($pStyle->getUnderline() != Font::UNDERLINE_NONE) { - $css['text-decoration'] = 'underline'; - } elseif ($pStyle->getStrikethrough()) { - $css['text-decoration'] = 'line-through'; - } - if ($pStyle->getItalic()) { - $css['font-style'] = 'italic'; - } - - $css['color'] = '#' . $pStyle->getColor()->getRGB(); - $css['font-family'] = '\'' . $pStyle->getName() . '\''; - $css['font-size'] = $pStyle->getSize() . 'pt'; - - return $css; - } - - /** - * Create CSS style (Borders). - * - * @param Borders $pStyle Borders - * - * @return array - */ - private function createCSSStyleBorders(Borders $pStyle) - { - // Construct CSS - $css = []; - - // Create CSS - $css['border-bottom'] = $this->createCSSStyleBorder($pStyle->getBottom()); - $css['border-top'] = $this->createCSSStyleBorder($pStyle->getTop()); - $css['border-left'] = $this->createCSSStyleBorder($pStyle->getLeft()); - $css['border-right'] = $this->createCSSStyleBorder($pStyle->getRight()); - - return $css; - } - - /** - * Create CSS style (Border). - * - * @param Border $pStyle Border - * - * @return string - */ - private function createCSSStyleBorder(Border $pStyle) - { - // Create CSS - add !important to non-none border styles for merged cells - $borderStyle = $this->mapBorderStyle($pStyle->getBorderStyle()); - - return $borderStyle . ' #' . $pStyle->getColor()->getRGB() . (($borderStyle == 'none') ? '' : ' !important'); - } - - /** - * Create CSS style (Fill). - * - * @param Fill $pStyle Fill - * - * @return array - */ - private function createCSSStyleFill(Fill $pStyle) - { - // Construct HTML - $css = []; - - // Create CSS - $value = $pStyle->getFillType() == Fill::FILL_NONE ? - 'white' : '#' . $pStyle->getStartColor()->getRGB(); - $css['background-color'] = $value; - - return $css; - } - - /** - * Generate HTML footer. - */ - public function generateHTMLFooter() - { - // Construct HTML - $html = ''; - $html .= ' ' . PHP_EOL; - $html .= '' . PHP_EOL; - - return $html; - } - - private function generateTableTagInline($pSheet, $id) - { - $style = isset($this->cssStyles['table']) ? - $this->assembleCSS($this->cssStyles['table']) : ''; - - $prntgrid = $pSheet->getPrintGridlines(); - $viewgrid = $this->isPdf ? $prntgrid : $pSheet->getShowGridlines(); - if ($viewgrid && $prntgrid) { - $html = " " . PHP_EOL; - } elseif ($viewgrid) { - $html = "
" . PHP_EOL; - } elseif ($prntgrid) { - $html = "
" . PHP_EOL; - } else { - $html = "
" . PHP_EOL; - } - - return $html; - } - - private function generateTableTag($pSheet, $id, &$html, $sheetIndex): void - { - if (!$this->useInlineCss) { - $gridlines = $pSheet->getShowGridlines() ? ' gridlines' : ''; - $gridlinesp = $pSheet->getPrintGridlines() ? ' gridlinesp' : ''; - $html .= "
" . PHP_EOL; - } else { - $html .= $this->generateTableTagInline($pSheet, $id); - } - } - - /** - * Generate table header. - * - * @param Worksheet $pSheet The worksheet for the table we are writing - * @param bool $showid whether or not to add id to table tag - * - * @return string - */ - private function generateTableHeader($pSheet, $showid = true) - { - $sheetIndex = $pSheet->getParent()->getIndex($pSheet); - - // Construct HTML - $html = ''; - $id = $showid ? "id='sheet$sheetIndex'" : ''; - if ($showid) { - $html .= "
\n"; - } else { - $html .= "
\n"; - } - - $this->generateTableTag($pSheet, $id, $html, $sheetIndex); - - // Write
elements - $highestColumnIndex = Coordinate::columnIndexFromString($pSheet->getHighestColumn()) - 1; - $i = -1; - while ($i++ < $highestColumnIndex) { - if (!$this->useInlineCss) { - $html .= ' ' . PHP_EOL; - } else { - $style = isset($this->cssStyles['table.sheet' . $sheetIndex . ' col.col' . $i]) ? - $this->assembleCSS($this->cssStyles['table.sheet' . $sheetIndex . ' col.col' . $i]) : ''; - $html .= ' ' . PHP_EOL; - } - } - - return $html; - } - - /** - * Generate table footer. - */ - private function generateTableFooter() - { - return '
' . PHP_EOL . '' . PHP_EOL; - } - - /** - * Generate row start. - * - * @param Worksheet $pSheet \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet - * @param int $sheetIndex Sheet index (0-based) - * @param int $pRow row number - * - * @return string - */ - private function generateRowStart(Worksheet $pSheet, $sheetIndex, $pRow) - { - $html = ''; - if (count($pSheet->getBreaks()) > 0) { - $breaks = $pSheet->getBreaks(); - - // check if a break is needed before this row - if (isset($breaks['A' . $pRow])) { - // close table: - $html .= $this->generateTableFooter(); - if ($this->isPdf && $this->useInlineCss) { - $html .= '
'; - } - - // open table again: + etc. - $html .= $this->generateTableHeader($pSheet, false); - $html .= '' . PHP_EOL; - } - } - - // Write row start - if (!$this->useInlineCss) { - $html .= ' ' . PHP_EOL; - } else { - $style = isset($this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]) - ? $this->assembleCSS($this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]) : ''; - - $html .= ' ' . PHP_EOL; - } - - return $html; - } - - private function generateRowCellCss($pSheet, $cellAddress, $pRow, $colNum) - { - $cell = ($cellAddress > '') ? $pSheet->getCell($cellAddress) : ''; - $coordinate = Coordinate::stringFromColumnIndex($colNum + 1) . ($pRow + 1); - if (!$this->useInlineCss) { - $cssClass = 'column' . $colNum; - } else { - $cssClass = []; - // The statements below do nothing. - // Commenting out the code rather than deleting it - // in case someone can figure out what their intent was. - //if ($cellType == 'th') { - // if (isset($this->cssStyles['table.sheet' . $sheetIndex . ' th.column' . $colNum])) { - // $this->cssStyles['table.sheet' . $sheetIndex . ' th.column' . $colNum]; - // } - //} else { - // if (isset($this->cssStyles['table.sheet' . $sheetIndex . ' td.column' . $colNum])) { - // $this->cssStyles['table.sheet' . $sheetIndex . ' td.column' . $colNum]; - // } - //} - // End of mystery statements. - } - - return [$cell, $cssClass, $coordinate]; - } - - private function generateRowCellDataValueRich($cell, &$cellData): void - { - // Loop through rich text elements - $elements = $cell->getValue()->getRichTextElements(); - foreach ($elements as $element) { - // Rich text start? - if ($element instanceof Run) { - $cellData .= ''; - - $cellEnd = ''; - if ($element->getFont()->getSuperscript()) { - $cellData .= ''; - $cellEnd = ''; - } elseif ($element->getFont()->getSubscript()) { - $cellData .= ''; - $cellEnd = ''; - } - - // Convert UTF8 data to PCDATA - $cellText = $element->getText(); - $cellData .= htmlspecialchars($cellText); - - $cellData .= $cellEnd; - - $cellData .= ''; - } else { - // Convert UTF8 data to PCDATA - $cellText = $element->getText(); - $cellData .= htmlspecialchars($cellText); - } - } - } - - private function generateRowCellDataValue($pSheet, $cell, &$cellData): void - { - if ($cell->getValue() instanceof RichText) { - $this->generateRowCellDataValueRich($cell, $cellData); - } else { - $origData = $this->preCalculateFormulas ? $cell->getCalculatedValue() : $cell->getValue(); - $cellData = NumberFormat::toFormattedString( - $origData, - $pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode(), - [$this, 'formatColor'] - ); - if ($cellData === $origData) { - $cellData = htmlspecialchars($cellData); - } - if ($pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont()->getSuperscript()) { - $cellData = '' . $cellData . ''; - } elseif ($pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont()->getSubscript()) { - $cellData = '' . $cellData . ''; - } - } - } - - private function generateRowCellData($pSheet, $cell, &$cssClass, $cellType) - { - $cellData = ' '; - if ($cell instanceof Cell) { - $cellData = ''; - // Don't know what this does, and no test cases. - //if ($cell->getParent() === null) { - // $cell->attach($pSheet); - //} - // Value - $this->generateRowCellDataValue($pSheet, $cell, $cellData); - - // Converts the cell content so that spaces occuring at beginning of each new line are replaced by   - // Example: " Hello\n to the world" is converted to "  Hello\n to the world" - $cellData = preg_replace('/(?m)(?:^|\\G) /', ' ', $cellData); - - // convert newline "\n" to '
' - $cellData = nl2br($cellData); - - // Extend CSS class? - if (!$this->useInlineCss) { - $cssClass .= ' style' . $cell->getXfIndex(); - $cssClass .= ' ' . $cell->getDataType(); - } else { - if ($cellType == 'th') { - if (isset($this->cssStyles['th.style' . $cell->getXfIndex()])) { - $cssClass = array_merge($cssClass, $this->cssStyles['th.style' . $cell->getXfIndex()]); - } - } else { - if (isset($this->cssStyles['td.style' . $cell->getXfIndex()])) { - $cssClass = array_merge($cssClass, $this->cssStyles['td.style' . $cell->getXfIndex()]); - } - } - - // General horizontal alignment: Actual horizontal alignment depends on dataType - $sharedStyle = $pSheet->getParent()->getCellXfByIndex($cell->getXfIndex()); - if ( - $sharedStyle->getAlignment()->getHorizontal() == Alignment::HORIZONTAL_GENERAL - && isset($this->cssStyles['.' . $cell->getDataType()]['text-align']) - ) { - $cssClass['text-align'] = $this->cssStyles['.' . $cell->getDataType()]['text-align']; - } - } - } else { - // Use default borders for empty cell - if (is_string($cssClass)) { - $cssClass .= ' style0'; - } - } - - return $cellData; - } - - private function generateRowIncludeCharts($pSheet, $coordinate) - { - return $this->includeCharts ? $this->writeChartInCell($pSheet, $coordinate) : ''; - } - - private function generateRowSpans($html, $rowSpan, $colSpan) - { - $html .= ($colSpan > 1) ? (' colspan="' . $colSpan . '"') : ''; - $html .= ($rowSpan > 1) ? (' rowspan="' . $rowSpan . '"') : ''; - - return $html; - } - - private function generateRowWriteCell(&$html, $pSheet, $coordinate, $cellType, $cellData, $colSpan, $rowSpan, $cssClass, $colNum, $sheetIndex, $pRow): void - { - // Image? - $htmlx = $this->writeImageInCell($pSheet, $coordinate); - // Chart? - $htmlx .= $this->generateRowIncludeCharts($pSheet, $coordinate); - // Column start - $html .= ' <' . $cellType; - if (!$this->useInlineCss && !$this->isPdf) { - $html .= ' class="' . $cssClass . '"'; - if ($htmlx) { - $html .= " style='position: relative;'"; - } - } else { - //** Necessary redundant code for the sake of \PhpOffice\PhpSpreadsheet\Writer\Pdf ** - // We must explicitly write the width of the - if ($this->useInlineCss) { - $xcssClass = $cssClass; - } else { - $html .= ' class="' . $cssClass . '"'; - $xcssClass = []; - } - $width = 0; - $i = $colNum - 1; - $e = $colNum + $colSpan - 1; - while ($i++ < $e) { - if (isset($this->columnWidths[$sheetIndex][$i])) { - $width += $this->columnWidths[$sheetIndex][$i]; - } - } - $xcssClass['width'] = $width . 'pt'; - - // We must also explicitly write the height of the - if (isset($this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]['height'])) { - $height = $this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]['height']; - $xcssClass['height'] = $height; - } - //** end of redundant code ** - - if ($htmlx) { - $xcssClass['position'] = 'relative'; - } - $html .= ' style="' . $this->assembleCSS($xcssClass) . '"'; - } - $html = $this->generateRowSpans($html, $rowSpan, $colSpan); - - $html .= '>'; - $html .= $htmlx; - - $html .= $this->writeComment($pSheet, $coordinate); - - // Cell data - $html .= $cellData; - - // Column end - $html .= '' . PHP_EOL; - } - - /** - * Generate row. - * - * @param Worksheet $pSheet \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet - * @param array $pValues Array containing cells in a row - * @param int $pRow Row number (0-based) - * @param string $cellType eg: 'td' - * - * @return string - */ - private function generateRow(Worksheet $pSheet, array $pValues, $pRow, $cellType) - { - // Sheet index - $sheetIndex = $pSheet->getParent()->getIndex($pSheet); - $html = $this->generateRowStart($pSheet, $sheetIndex, $pRow); - - // Write cells - $colNum = 0; - foreach ($pValues as $cellAddress) { - [$cell, $cssClass, $coordinate] = $this->generateRowCellCss($pSheet, $cellAddress, $pRow, $colNum); - - $colSpan = 1; - $rowSpan = 1; - - // Cell Data - $cellData = $this->generateRowCellData($pSheet, $cell, $cssClass, $cellType); - - // Hyperlink? - if ($pSheet->hyperlinkExists($coordinate) && !$pSheet->getHyperlink($coordinate)->isInternal()) { - $cellData = '' . $cellData . ''; - } - - // Should the cell be written or is it swallowed by a rowspan or colspan? - $writeCell = !(isset($this->isSpannedCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum]) - && $this->isSpannedCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum]); - - // Colspan and Rowspan - $colspan = 1; - $rowspan = 1; - if (isset($this->isBaseCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum])) { - $spans = $this->isBaseCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum]; - $rowSpan = $spans['rowspan']; - $colSpan = $spans['colspan']; - - // Also apply style from last cell in merge to fix borders - - // relies on !important for non-none border declarations in createCSSStyleBorder - $endCellCoord = Coordinate::stringFromColumnIndex($colNum + $colSpan) . ($pRow + $rowSpan); - if (!$this->useInlineCss) { - $cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex(); - } - } - - // Write - if ($writeCell) { - $this->generateRowWriteCell($html, $pSheet, $coordinate, $cellType, $cellData, $colSpan, $rowSpan, $cssClass, $colNum, $sheetIndex, $pRow); - } - - // Next column - ++$colNum; - } - - // Write row end - $html .= ' ' . PHP_EOL; - - // Return - return $html; - } - - /** - * Takes array where of CSS properties / values and converts to CSS string. - * - * @return string - */ - private function assembleCSS(array $pValue = []) - { - $pairs = []; - foreach ($pValue as $property => $value) { - $pairs[] = $property . ':' . $value; - } - $string = implode('; ', $pairs); - - return $string; - } - - /** - * Get images root. - * - * @return string - */ - public function getImagesRoot() - { - return $this->imagesRoot; - } - - /** - * Set images root. - * - * @param string $pValue - * - * @return $this - */ - public function setImagesRoot($pValue) - { - $this->imagesRoot = $pValue; - - return $this; - } - - /** - * Get embed images. - * - * @return bool - */ - public function getEmbedImages() - { - return $this->embedImages; - } - - /** - * Set embed images. - * - * @param bool $pValue - * - * @return $this - */ - public function setEmbedImages($pValue) - { - $this->embedImages = $pValue; - - return $this; - } - - /** - * Get use inline CSS? - * - * @return bool - */ - public function getUseInlineCss() - { - return $this->useInlineCss; - } - - /** - * Set use inline CSS? - * - * @param bool $pValue - * - * @return $this - */ - public function setUseInlineCss($pValue) - { - $this->useInlineCss = $pValue; - - return $this; - } - - /** - * Get use embedded CSS? - * - * @return bool - * - * @codeCoverageIgnore - * - * @deprecated no longer used - */ - public function getUseEmbeddedCSS() - { - return $this->useEmbeddedCSS; - } - - /** - * Set use embedded CSS? - * - * @param bool $pValue - * - * @return $this - * - * @codeCoverageIgnore - * - * @deprecated no longer used - */ - public function setUseEmbeddedCSS($pValue) - { - $this->useEmbeddedCSS = $pValue; - - return $this; - } - - /** - * Add color to formatted string as inline style. - * - * @param string $pValue Plain formatted value without color - * @param string $pFormat Format code - * - * @return string - */ - public function formatColor($pValue, $pFormat) - { - // Color information, e.g. [Red] is always at the beginning - $color = null; // initialize - $matches = []; - - $color_regex = '/^\\[[a-zA-Z]+\\]/'; - if (preg_match($color_regex, $pFormat, $matches)) { - $color = str_replace(['[', ']'], '', $matches[0]); - $color = strtolower($color); - } - - // convert to PCDATA - $value = htmlspecialchars($pValue); - - // color span tag - if ($color !== null) { - $value = '' . $value . ''; - } - - return $value; - } - - /** - * Calculate information about HTML colspan and rowspan which is not always the same as Excel's. - */ - private function calculateSpans(): void - { - if ($this->spansAreCalculated) { - return; - } - // Identify all cells that should be omitted in HTML due to cell merge. - // In HTML only the upper-left cell should be written and it should have - // appropriate rowspan / colspan attribute - $sheetIndexes = $this->sheetIndex !== null ? - [$this->sheetIndex] : range(0, $this->spreadsheet->getSheetCount() - 1); - - foreach ($sheetIndexes as $sheetIndex) { - $sheet = $this->spreadsheet->getSheet($sheetIndex); - - $candidateSpannedRow = []; - - // loop through all Excel merged cells - foreach ($sheet->getMergeCells() as $cells) { - [$cells] = Coordinate::splitRange($cells); - $first = $cells[0]; - $last = $cells[1]; - - [$fc, $fr] = Coordinate::coordinateFromString($first); - $fc = Coordinate::columnIndexFromString($fc) - 1; - - [$lc, $lr] = Coordinate::coordinateFromString($last); - $lc = Coordinate::columnIndexFromString($lc) - 1; - - // loop through the individual cells in the individual merge - $r = $fr - 1; - while ($r++ < $lr) { - // also, flag this row as a HTML row that is candidate to be omitted - $candidateSpannedRow[$r] = $r; - - $c = $fc - 1; - while ($c++ < $lc) { - if (!($c == $fc && $r == $fr)) { - // not the upper-left cell (should not be written in HTML) - $this->isSpannedCell[$sheetIndex][$r][$c] = [ - 'baseCell' => [$fr, $fc], - ]; - } else { - // upper-left is the base cell that should hold the colspan/rowspan attribute - $this->isBaseCell[$sheetIndex][$r][$c] = [ - 'xlrowspan' => $lr - $fr + 1, // Excel rowspan - 'rowspan' => $lr - $fr + 1, // HTML rowspan, value may change - 'xlcolspan' => $lc - $fc + 1, // Excel colspan - 'colspan' => $lc - $fc + 1, // HTML colspan, value may change - ]; - } - } - } - } - - $this->calculateSpansOmitRows($sheet, $sheetIndex, $candidateSpannedRow); - - // TODO: Same for columns - } - - // We have calculated the spans - $this->spansAreCalculated = true; - } - - private function calculateSpansOmitRows($sheet, $sheetIndex, $candidateSpannedRow): void - { - // Identify which rows should be omitted in HTML. These are the rows where all the cells - // participate in a merge and the where base cells are somewhere above. - $countColumns = Coordinate::columnIndexFromString($sheet->getHighestColumn()); - foreach ($candidateSpannedRow as $rowIndex) { - if (isset($this->isSpannedCell[$sheetIndex][$rowIndex])) { - if (count($this->isSpannedCell[$sheetIndex][$rowIndex]) == $countColumns) { - $this->isSpannedRow[$sheetIndex][$rowIndex] = $rowIndex; - } - } - } - - // For each of the omitted rows we found above, the affected rowspans should be subtracted by 1 - if (isset($this->isSpannedRow[$sheetIndex])) { - foreach ($this->isSpannedRow[$sheetIndex] as $rowIndex) { - $adjustedBaseCells = []; - $c = -1; - $e = $countColumns - 1; - while ($c++ < $e) { - $baseCell = $this->isSpannedCell[$sheetIndex][$rowIndex][$c]['baseCell']; - - if (!in_array($baseCell, $adjustedBaseCells)) { - // subtract rowspan by 1 - --$this->isBaseCell[$sheetIndex][$baseCell[0]][$baseCell[1]]['rowspan']; - $adjustedBaseCells[] = $baseCell; - } - } - } - } - } - - /** - * Write a comment in the same format as LibreOffice. - * - * @see https://github.com/LibreOffice/core/blob/9fc9bf3240f8c62ad7859947ab8a033ac1fe93fa/sc/source/filter/html/htmlexp.cxx#L1073-L1092 - * - * @param string $coordinate - * - * @return string - */ - private function writeComment(Worksheet $pSheet, $coordinate) - { - $result = ''; - if (!$this->isPdf && isset($pSheet->getComments()[$coordinate])) { - $result .= ''; - $result .= '
' . nl2br($pSheet->getComment($coordinate)->getText()->getPlainText()) . '
'; - $result .= PHP_EOL; - } - - return $result; - } - - /** - * Generate @page declarations. - * - * @param bool $generateSurroundingHTML - * - * @return string - */ - private function generatePageDeclarations($generateSurroundingHTML) - { - // Ensure that Spans have been calculated? - $this->calculateSpans(); - - // Fetch sheets - $sheets = []; - if ($this->sheetIndex === null) { - $sheets = $this->spreadsheet->getAllSheets(); - } else { - $sheets[] = $this->spreadsheet->getSheet($this->sheetIndex); - } - - // Construct HTML - $htmlPage = $generateSurroundingHTML ? ('' . PHP_EOL) : ''; - - return $htmlPage; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php deleted file mode 100644 index 5129d65..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php +++ /dev/null @@ -1,87 +0,0 @@ -setSpreadsheet($spreadsheet); - - $writerPartsArray = [ - 'content' => Content::class, - 'meta' => Meta::class, - 'meta_inf' => MetaInf::class, - 'mimetype' => Mimetype::class, - 'settings' => Settings::class, - 'styles' => Styles::class, - 'thumbnails' => Thumbnails::class, - ]; - - foreach ($writerPartsArray as $writer => $class) { - $this->writerParts[$writer] = new $class($this); - } - } - - /** - * Get writer part. - * - * @param string $pPartName Writer part name - * - * @return null|Ods\WriterPart - */ - public function getWriterPart($pPartName) - { - if ($pPartName != '' && isset($this->writerParts[strtolower($pPartName)])) { - return $this->writerParts[strtolower($pPartName)]; - } - - return null; - } - - /** - * Save PhpSpreadsheet to file. - * - * @param resource|string $pFilename - */ - public function save($pFilename): void - { - if (!$this->spreadSheet) { - throw new WriterException('PhpSpreadsheet object unassigned.'); - } - - // garbage collect - $this->spreadSheet->garbageCollect(); - - $this->openFileHandle($pFilename); - - $zip = $this->createZip(); - - $zip->addFile('META-INF/manifest.xml', $this->getWriterPart('meta_inf')->writeManifest()); - $zip->addFile('Thumbnails/thumbnail.png', $this->getWriterPart('thumbnails')->writeThumbnail()); - $zip->addFile('content.xml', $this->getWriterPart('content')->write()); - $zip->addFile('meta.xml', $this->getWriterPart('meta')->write()); - $zip->addFile('mimetype', $this->getWriterPart('mimetype')->write()); - $zip->addFile('settings.xml', $this->getWriterPart('settings')->write()); - $zip->addFile('styles.xml', $this->getWriterPart('styles')->write()); - - // Close file - try { - $zip->finish(); - } catch (OverflowException $e) { - throw new WriterException('Could not close resource.'); - } - - $this->maybeCloseFileHandle(); - } - - /** - * Create zip object. - * - * @return ZipStream - */ - private function createZip() - { - // Try opening the ZIP file - if (!is_resource($this->fileHandle)) { - throw new WriterException('Could not open resource for writing.'); - } - - // Create new ZIP stream - $options = new Archive(); - $options->setEnableZip64(false); - $options->setOutputStream($this->fileHandle); - - return new ZipStream(null, $options); - } - - /** - * Get Spreadsheet object. - * - * @return Spreadsheet - */ - public function getSpreadsheet() - { - if ($this->spreadSheet !== null) { - return $this->spreadSheet; - } - - throw new WriterException('No PhpSpreadsheet assigned.'); - } - - /** - * Set Spreadsheet object. - * - * @param Spreadsheet $spreadsheet PhpSpreadsheet object - * - * @return $this - */ - public function setSpreadsheet(Spreadsheet $spreadsheet) - { - $this->spreadSheet = $spreadsheet; - - return $this; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Cell/Comment.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Cell/Comment.php deleted file mode 100644 index b0829bf..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Cell/Comment.php +++ /dev/null @@ -1,30 +0,0 @@ - - */ -class Comment -{ - public static function write(XMLWriter $objWriter, Cell $cell): void - { - $comments = $cell->getWorksheet()->getComments(); - if (!isset($comments[$cell->getCoordinate()])) { - return; - } - $comment = $comments[$cell->getCoordinate()]; - - $objWriter->startElement('office:annotation'); - $objWriter->writeAttribute('svg:width', $comment->getWidth()); - $objWriter->writeAttribute('svg:height', $comment->getHeight()); - $objWriter->writeAttribute('svg:x', $comment->getMarginLeft()); - $objWriter->writeAttribute('svg:y', $comment->getMarginTop()); - $objWriter->writeElement('dc:creator', $comment->getAuthor()); - $objWriter->writeElement('text:p', $comment->getText()->getPlainText()); - $objWriter->endElement(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Content.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Content.php deleted file mode 100644 index 96e6685..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Content.php +++ /dev/null @@ -1,382 +0,0 @@ - - */ -class Content extends WriterPart -{ - const NUMBER_COLS_REPEATED_MAX = 1024; - const NUMBER_ROWS_REPEATED_MAX = 1048576; - const CELL_STYLE_PREFIX = 'ce'; - - private $formulaConvertor; - - /** - * Set parent Ods writer. - */ - public function __construct(Ods $writer) - { - parent::__construct($writer); - - $this->formulaConvertor = new Formula($this->getParentWriter()->getSpreadsheet()->getDefinedNames()); - } - - /** - * Write content.xml to XML format. - * - * @return string XML Output - */ - public function write() - { - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8'); - - // Content - $objWriter->startElement('office:document-content'); - $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); - $objWriter->writeAttribute('xmlns:style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0'); - $objWriter->writeAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0'); - $objWriter->writeAttribute('xmlns:table', 'urn:oasis:names:tc:opendocument:xmlns:table:1.0'); - $objWriter->writeAttribute('xmlns:draw', 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0'); - $objWriter->writeAttribute('xmlns:fo', 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0'); - $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); - $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); - $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0'); - $objWriter->writeAttribute('xmlns:number', 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0'); - $objWriter->writeAttribute('xmlns:presentation', 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0'); - $objWriter->writeAttribute('xmlns:svg', 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0'); - $objWriter->writeAttribute('xmlns:chart', 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0'); - $objWriter->writeAttribute('xmlns:dr3d', 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0'); - $objWriter->writeAttribute('xmlns:math', 'http://www.w3.org/1998/Math/MathML'); - $objWriter->writeAttribute('xmlns:form', 'urn:oasis:names:tc:opendocument:xmlns:form:1.0'); - $objWriter->writeAttribute('xmlns:script', 'urn:oasis:names:tc:opendocument:xmlns:script:1.0'); - $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); - $objWriter->writeAttribute('xmlns:ooow', 'http://openoffice.org/2004/writer'); - $objWriter->writeAttribute('xmlns:oooc', 'http://openoffice.org/2004/calc'); - $objWriter->writeAttribute('xmlns:dom', 'http://www.w3.org/2001/xml-events'); - $objWriter->writeAttribute('xmlns:xforms', 'http://www.w3.org/2002/xforms'); - $objWriter->writeAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema'); - $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); - $objWriter->writeAttribute('xmlns:rpt', 'http://openoffice.org/2005/report'); - $objWriter->writeAttribute('xmlns:of', 'urn:oasis:names:tc:opendocument:xmlns:of:1.2'); - $objWriter->writeAttribute('xmlns:xhtml', 'http://www.w3.org/1999/xhtml'); - $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#'); - $objWriter->writeAttribute('xmlns:tableooo', 'http://openoffice.org/2009/table'); - $objWriter->writeAttribute('xmlns:field', 'urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0'); - $objWriter->writeAttribute('xmlns:formx', 'urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0'); - $objWriter->writeAttribute('xmlns:css3t', 'http://www.w3.org/TR/css3-text/'); - $objWriter->writeAttribute('office:version', '1.2'); - - $objWriter->writeElement('office:scripts'); - $objWriter->writeElement('office:font-face-decls'); - - // Styles XF - $objWriter->startElement('office:automatic-styles'); - $this->writeXfStyles($objWriter, $this->getParentWriter()->getSpreadsheet()); - $objWriter->endElement(); - - $objWriter->startElement('office:body'); - $objWriter->startElement('office:spreadsheet'); - $objWriter->writeElement('table:calculation-settings'); - - $this->writeSheets($objWriter); - - // Defined names (ranges and formulae) - (new NamedExpressions($objWriter, $this->getParentWriter()->getSpreadsheet(), $this->formulaConvertor))->write(); - - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - - return $objWriter->getData(); - } - - /** - * Write sheets. - */ - private function writeSheets(XMLWriter $objWriter): void - { - $spreadsheet = $this->getParentWriter()->getSpreadsheet(); /** @var Spreadsheet $spreadsheet */ - $sheetCount = $spreadsheet->getSheetCount(); - for ($i = 0; $i < $sheetCount; ++$i) { - $objWriter->startElement('table:table'); - $objWriter->writeAttribute('table:name', $spreadsheet->getSheet($i)->getTitle()); - $objWriter->writeElement('office:forms'); - $objWriter->startElement('table:table-column'); - $objWriter->writeAttribute('table:number-columns-repeated', self::NUMBER_COLS_REPEATED_MAX); - $objWriter->endElement(); - $this->writeRows($objWriter, $spreadsheet->getSheet($i)); - $objWriter->endElement(); - } - } - - /** - * Write rows of the specified sheet. - */ - private function writeRows(XMLWriter $objWriter, Worksheet $sheet): void - { - $numberRowsRepeated = self::NUMBER_ROWS_REPEATED_MAX; - $span_row = 0; - $rows = $sheet->getRowIterator(); - while ($rows->valid()) { - --$numberRowsRepeated; - $row = $rows->current(); - if ($row->getCellIterator()->valid()) { - if ($span_row) { - $objWriter->startElement('table:table-row'); - if ($span_row > 1) { - $objWriter->writeAttribute('table:number-rows-repeated', $span_row); - } - $objWriter->startElement('table:table-cell'); - $objWriter->writeAttribute('table:number-columns-repeated', self::NUMBER_COLS_REPEATED_MAX); - $objWriter->endElement(); - $objWriter->endElement(); - $span_row = 0; - } - $objWriter->startElement('table:table-row'); - $this->writeCells($objWriter, $row); - $objWriter->endElement(); - } else { - ++$span_row; - } - $rows->next(); - } - } - - /** - * Write cells of the specified row. - */ - private function writeCells(XMLWriter $objWriter, Row $row): void - { - $numberColsRepeated = self::NUMBER_COLS_REPEATED_MAX; - $prevColumn = -1; - $cells = $row->getCellIterator(); - while ($cells->valid()) { - /** @var \PhpOffice\PhpSpreadsheet\Cell\Cell $cell */ - $cell = $cells->current(); - $column = Coordinate::columnIndexFromString($cell->getColumn()) - 1; - - $this->writeCellSpan($objWriter, $column, $prevColumn); - $objWriter->startElement('table:table-cell'); - $this->writeCellMerge($objWriter, $cell); - - // Style XF - $style = $cell->getXfIndex(); - if ($style !== null) { - $objWriter->writeAttribute('table:style-name', self::CELL_STYLE_PREFIX . $style); - } - - switch ($cell->getDataType()) { - case DataType::TYPE_BOOL: - $objWriter->writeAttribute('office:value-type', 'boolean'); - $objWriter->writeAttribute('office:value', $cell->getValue()); - $objWriter->writeElement('text:p', $cell->getValue()); - - break; - case DataType::TYPE_ERROR: - throw new Exception('Writing of error not implemented yet.'); - - break; - case DataType::TYPE_FORMULA: - $formulaValue = $cell->getValue(); - if ($this->getParentWriter()->getPreCalculateFormulas()) { - try { - $formulaValue = $cell->getCalculatedValue(); - } catch (Exception $e) { - // don't do anything - } - } - $objWriter->writeAttribute('table:formula', $this->formulaConvertor->convertFormula($cell->getValue())); - if (is_numeric($formulaValue)) { - $objWriter->writeAttribute('office:value-type', 'float'); - } else { - $objWriter->writeAttribute('office:value-type', 'string'); - } - $objWriter->writeAttribute('office:value', $formulaValue); - $objWriter->writeElement('text:p', $formulaValue); - - break; - case DataType::TYPE_INLINE: - throw new Exception('Writing of inline not implemented yet.'); - - break; - case DataType::TYPE_NUMERIC: - $objWriter->writeAttribute('office:value-type', 'float'); - $objWriter->writeAttribute('office:value', $cell->getValue()); - $objWriter->writeElement('text:p', $cell->getValue()); - - break; - case DataType::TYPE_STRING: - $objWriter->writeAttribute('office:value-type', 'string'); - $objWriter->writeElement('text:p', $cell->getValue()); - - break; - } - Comment::write($objWriter, $cell); - $objWriter->endElement(); - $prevColumn = $column; - $cells->next(); - } - $numberColsRepeated = $numberColsRepeated - $prevColumn - 1; - if ($numberColsRepeated > 0) { - if ($numberColsRepeated > 1) { - $objWriter->startElement('table:table-cell'); - $objWriter->writeAttribute('table:number-columns-repeated', $numberColsRepeated); - $objWriter->endElement(); - } else { - $objWriter->writeElement('table:table-cell'); - } - } - } - - /** - * Write span. - * - * @param int $curColumn - * @param int $prevColumn - */ - private function writeCellSpan(XMLWriter $objWriter, $curColumn, $prevColumn): void - { - $diff = $curColumn - $prevColumn - 1; - if (1 === $diff) { - $objWriter->writeElement('table:table-cell'); - } elseif ($diff > 1) { - $objWriter->startElement('table:table-cell'); - $objWriter->writeAttribute('table:number-columns-repeated', $diff); - $objWriter->endElement(); - } - } - - /** - * Write XF cell styles. - */ - private function writeXfStyles(XMLWriter $writer, Spreadsheet $spreadsheet): void - { - foreach ($spreadsheet->getCellXfCollection() as $style) { - $writer->startElement('style:style'); - $writer->writeAttribute('style:name', self::CELL_STYLE_PREFIX . $style->getIndex()); - $writer->writeAttribute('style:family', 'table-cell'); - $writer->writeAttribute('style:parent-style-name', 'Default'); - - // style:text-properties - - // Font - $writer->startElement('style:text-properties'); - - $font = $style->getFont(); - - if ($font->getBold()) { - $writer->writeAttribute('fo:font-weight', 'bold'); - $writer->writeAttribute('style:font-weight-complex', 'bold'); - $writer->writeAttribute('style:font-weight-asian', 'bold'); - } - - if ($font->getItalic()) { - $writer->writeAttribute('fo:font-style', 'italic'); - } - - if ($color = $font->getColor()) { - $writer->writeAttribute('fo:color', sprintf('#%s', $color->getRGB())); - } - - if ($family = $font->getName()) { - $writer->writeAttribute('fo:font-family', $family); - } - - if ($size = $font->getSize()) { - $writer->writeAttribute('fo:font-size', sprintf('%.1Fpt', $size)); - } - - if ($font->getUnderline() && $font->getUnderline() != Font::UNDERLINE_NONE) { - $writer->writeAttribute('style:text-underline-style', 'solid'); - $writer->writeAttribute('style:text-underline-width', 'auto'); - $writer->writeAttribute('style:text-underline-color', 'font-color'); - - switch ($font->getUnderline()) { - case Font::UNDERLINE_DOUBLE: - $writer->writeAttribute('style:text-underline-type', 'double'); - - break; - case Font::UNDERLINE_SINGLE: - $writer->writeAttribute('style:text-underline-type', 'single'); - - break; - } - } - - $writer->endElement(); // Close style:text-properties - - // style:table-cell-properties - - $writer->startElement('style:table-cell-properties'); - $writer->writeAttribute('style:rotation-align', 'none'); - - // Fill - if ($fill = $style->getFill()) { - switch ($fill->getFillType()) { - case Fill::FILL_SOLID: - $writer->writeAttribute('fo:background-color', sprintf( - '#%s', - strtolower($fill->getStartColor()->getRGB()) - )); - - break; - case Fill::FILL_GRADIENT_LINEAR: - case Fill::FILL_GRADIENT_PATH: - /// TODO :: To be implemented - break; - case Fill::FILL_NONE: - default: - } - } - - $writer->endElement(); // Close style:table-cell-properties - - // End - - $writer->endElement(); // Close style:style - } - } - - /** - * Write attributes for merged cell. - */ - private function writeCellMerge(XMLWriter $objWriter, Cell $cell): void - { - if (!$cell->isMergeRangeValueCell()) { - return; - } - - $mergeRange = Coordinate::splitRange($cell->getMergeRange()); - [$startCell, $endCell] = $mergeRange[0]; - $start = Coordinate::coordinateFromString($startCell); - $end = Coordinate::coordinateFromString($endCell); - $columnSpan = Coordinate::columnIndexFromString($end[0]) - Coordinate::columnIndexFromString($start[0]) + 1; - $rowSpan = $end[1] - $start[1] + 1; - - $objWriter->writeAttribute('table:number-columns-spanned', $columnSpan); - $objWriter->writeAttribute('table:number-rows-spanned', $rowSpan); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Formula.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Formula.php deleted file mode 100644 index db766fb..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Formula.php +++ /dev/null @@ -1,119 +0,0 @@ -definedNames[] = $definedName->getName(); - } - } - - public function convertFormula(string $formula, string $worksheetName = ''): string - { - $formula = $this->convertCellReferences($formula, $worksheetName); - $formula = $this->convertDefinedNames($formula); - - if (substr($formula, 0, 1) !== '=') { - $formula = '=' . $formula; - } - - return 'of:' . $formula; - } - - private function convertDefinedNames(string $formula): string - { - $splitCount = preg_match_all( - '/' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '/mui', - $formula, - $splitRanges, - PREG_OFFSET_CAPTURE - ); - - $lengths = array_map('strlen', array_column($splitRanges[0], 0)); - $offsets = array_column($splitRanges[0], 1); - $values = array_column($splitRanges[0], 0); - - while ($splitCount > 0) { - --$splitCount; - $length = $lengths[$splitCount]; - $offset = $offsets[$splitCount]; - $value = $values[$splitCount]; - - if (in_array($value, $this->definedNames, true)) { - $formula = substr($formula, 0, $offset) . '$$' . $value . substr($formula, $offset + $length); - } - } - - return $formula; - } - - private function convertCellReferences(string $formula, string $worksheetName): string - { - $splitCount = preg_match_all( - '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/mui', - $formula, - $splitRanges, - PREG_OFFSET_CAPTURE - ); - - $lengths = array_map('strlen', array_column($splitRanges[0], 0)); - $offsets = array_column($splitRanges[0], 1); - - $worksheets = $splitRanges[2]; - $columns = $splitRanges[6]; - $rows = $splitRanges[7]; - - // Replace any commas in the formula with semi-colons for Ods - // If by chance there are commas in worksheet names, then they will be "fixed" again in the loop - // because we've already extracted worksheet names with our preg_match_all() - $formula = str_replace(',', ';', $formula); - while ($splitCount > 0) { - --$splitCount; - $length = $lengths[$splitCount]; - $offset = $offsets[$splitCount]; - $worksheet = $worksheets[$splitCount][0]; - $column = $columns[$splitCount][0]; - $row = $rows[$splitCount][0]; - - $newRange = ''; - if (empty($worksheet)) { - if (($offset === 0) || ($formula[$offset - 1] !== ':')) { - // We need a worksheet - $worksheet = $worksheetName; - } - } else { - $worksheet = str_replace("''", "'", trim($worksheet, "'")); - } - if (!empty($worksheet)) { - $newRange = "['" . str_replace("'", "''", $worksheet) . "'"; - } elseif (substr($formula, $offset - 1, 1) !== ':') { - $newRange = '['; - } - $newRange .= '.'; - - if (!empty($column)) { - $newRange .= $column; - } - if (!empty($row)) { - $newRange .= $row; - } - // close the wrapping [] unless this is the first part of a range - $newRange .= substr($formula, $offset + $length, 1) !== ':' ? ']' : ''; - - $formula = substr($formula, 0, $offset) . $newRange . substr($formula, $offset + $length); - } - - return $formula; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Meta.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Meta.php deleted file mode 100644 index 365221f..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Meta.php +++ /dev/null @@ -1,75 +0,0 @@ -getParentWriter()->getSpreadsheet(); - } - - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8'); - - // Meta - $objWriter->startElement('office:document-meta'); - - $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); - $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); - $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); - $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0'); - $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); - $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#'); - $objWriter->writeAttribute('office:version', '1.2'); - - $objWriter->startElement('office:meta'); - - $objWriter->writeElement('meta:initial-creator', $spreadsheet->getProperties()->getCreator()); - $objWriter->writeElement('dc:creator', $spreadsheet->getProperties()->getCreator()); - $objWriter->writeElement('meta:creation-date', date(DATE_W3C, $spreadsheet->getProperties()->getCreated())); - $objWriter->writeElement('dc:date', date(DATE_W3C, $spreadsheet->getProperties()->getCreated())); - $objWriter->writeElement('dc:title', $spreadsheet->getProperties()->getTitle()); - $objWriter->writeElement('dc:description', $spreadsheet->getProperties()->getDescription()); - $objWriter->writeElement('dc:subject', $spreadsheet->getProperties()->getSubject()); - $keywords = explode(' ', $spreadsheet->getProperties()->getKeywords()); - foreach ($keywords as $keyword) { - $objWriter->writeElement('meta:keyword', $keyword); - } - - // - $objWriter->startElement('meta:user-defined'); - $objWriter->writeAttribute('meta:name', 'Company'); - $objWriter->writeRaw($spreadsheet->getProperties()->getCompany()); - $objWriter->endElement(); - - $objWriter->startElement('meta:user-defined'); - $objWriter->writeAttribute('meta:name', 'category'); - $objWriter->writeRaw($spreadsheet->getProperties()->getCategory()); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - return $objWriter->getData(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/MetaInf.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/MetaInf.php deleted file mode 100644 index c9085cf..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/MetaInf.php +++ /dev/null @@ -1,60 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8'); - - // Manifest - $objWriter->startElement('manifest:manifest'); - $objWriter->writeAttribute('xmlns:manifest', 'urn:oasis:names:tc:opendocument:xmlns:manifest:1.0'); - $objWriter->writeAttribute('manifest:version', '1.2'); - - $objWriter->startElement('manifest:file-entry'); - $objWriter->writeAttribute('manifest:full-path', '/'); - $objWriter->writeAttribute('manifest:version', '1.2'); - $objWriter->writeAttribute('manifest:media-type', 'application/vnd.oasis.opendocument.spreadsheet'); - $objWriter->endElement(); - $objWriter->startElement('manifest:file-entry'); - $objWriter->writeAttribute('manifest:full-path', 'meta.xml'); - $objWriter->writeAttribute('manifest:media-type', 'text/xml'); - $objWriter->endElement(); - $objWriter->startElement('manifest:file-entry'); - $objWriter->writeAttribute('manifest:full-path', 'settings.xml'); - $objWriter->writeAttribute('manifest:media-type', 'text/xml'); - $objWriter->endElement(); - $objWriter->startElement('manifest:file-entry'); - $objWriter->writeAttribute('manifest:full-path', 'content.xml'); - $objWriter->writeAttribute('manifest:media-type', 'text/xml'); - $objWriter->endElement(); - $objWriter->startElement('manifest:file-entry'); - $objWriter->writeAttribute('manifest:full-path', 'Thumbnails/thumbnail.png'); - $objWriter->writeAttribute('manifest:media-type', 'image/png'); - $objWriter->endElement(); - $objWriter->startElement('manifest:file-entry'); - $objWriter->writeAttribute('manifest:full-path', 'styles.xml'); - $objWriter->writeAttribute('manifest:media-type', 'text/xml'); - $objWriter->endElement(); - $objWriter->endElement(); - - return $objWriter->getData(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Mimetype.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Mimetype.php deleted file mode 100644 index 4aac368..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Mimetype.php +++ /dev/null @@ -1,20 +0,0 @@ -objWriter = $objWriter; - $this->spreadsheet = $spreadsheet; - $this->formulaConvertor = $formulaConvertor; - } - - public function write(): void - { - $this->objWriter->startElement('table:named-expressions'); - $this->writeExpressions(); - $this->objWriter->endElement(); - } - - private function writeExpressions(): void - { - $definedNames = $this->spreadsheet->getDefinedNames(); - - foreach ($definedNames as $definedName) { - if ($definedName->isFormula()) { - $this->objWriter->startElement('table:named-expression'); - $this->writeNamedFormula($definedName, $this->spreadsheet->getActiveSheet()); - } else { - $this->objWriter->startElement('table:named-range'); - $this->writeNamedRange($definedName); - } - - $this->objWriter->endElement(); - } - } - - private function writeNamedFormula(DefinedName $definedName, Worksheet $defaultWorksheet): void - { - $this->objWriter->writeAttribute('table:name', $definedName->getName()); - $this->objWriter->writeAttribute( - 'table:expression', - $this->formulaConvertor->convertFormula($definedName->getValue(), $definedName->getWorksheet()->getTitle()) - ); - $this->objWriter->writeAttribute('table:base-cell-address', $this->convertAddress( - $definedName, - "'" . (($definedName->getWorksheet() !== null) ? $definedName->getWorksheet()->getTitle() : $defaultWorksheet->getTitle()) . "'!\$A\$1" - )); - } - - private function writeNamedRange(DefinedName $definedName): void - { - $this->objWriter->writeAttribute('table:name', $definedName->getName()); - $this->objWriter->writeAttribute('table:base-cell-address', $this->convertAddress( - $definedName, - "'" . $definedName->getWorksheet()->getTitle() . "'!\$A\$1" - )); - $this->objWriter->writeAttribute('table:cell-range-address', $this->convertAddress($definedName, $definedName->getValue())); - } - - private function convertAddress(DefinedName $definedName, string $address): string - { - $splitCount = preg_match_all( - '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/mui', - $address, - $splitRanges, - PREG_OFFSET_CAPTURE - ); - - $lengths = array_map('strlen', array_column($splitRanges[0], 0)); - $offsets = array_column($splitRanges[0], 1); - - $worksheets = $splitRanges[2]; - $columns = $splitRanges[6]; - $rows = $splitRanges[7]; - - while ($splitCount > 0) { - --$splitCount; - $length = $lengths[$splitCount]; - $offset = $offsets[$splitCount]; - $worksheet = $worksheets[$splitCount][0]; - $column = $columns[$splitCount][0]; - $row = $rows[$splitCount][0]; - - $newRange = ''; - if (empty($worksheet)) { - if (($offset === 0) || ($address[$offset - 1] !== ':')) { - // We need a worksheet - $worksheet = $definedName->getWorksheet()->getTitle(); - } - } else { - $worksheet = str_replace("''", "'", trim($worksheet, "'")); - } - if (!empty($worksheet)) { - $newRange = "'" . str_replace("'", "''", $worksheet) . "'."; - } - - if (!empty($column)) { - $newRange .= $column; - } - if (!empty($row)) { - $newRange .= $row; - } - - $address = substr($address, 0, $offset) . $newRange . substr($address, $offset + $length); - } - - if (substr($address, 0, 1) === '=') { - $address = substr($address, 1); - } - - return $address; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Settings.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Settings.php deleted file mode 100644 index d458e8c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Settings.php +++ /dev/null @@ -1,52 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8'); - - // Settings - $objWriter->startElement('office:document-settings'); - $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); - $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); - $objWriter->writeAttribute('xmlns:config', 'urn:oasis:names:tc:opendocument:xmlns:config:1.0'); - $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); - $objWriter->writeAttribute('office:version', '1.2'); - - $objWriter->startElement('office:settings'); - $objWriter->startElement('config:config-item-set'); - $objWriter->writeAttribute('config:name', 'ooo:view-settings'); - $objWriter->startElement('config:config-item-map-indexed'); - $objWriter->writeAttribute('config:name', 'Views'); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->startElement('config:config-item-set'); - $objWriter->writeAttribute('config:name', 'ooo:configuration-settings'); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - - return $objWriter->getData(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Styles.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Styles.php deleted file mode 100644 index 7ba7eba..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Styles.php +++ /dev/null @@ -1,68 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8'); - - // Content - $objWriter->startElement('office:document-styles'); - $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); - $objWriter->writeAttribute('xmlns:style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0'); - $objWriter->writeAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0'); - $objWriter->writeAttribute('xmlns:table', 'urn:oasis:names:tc:opendocument:xmlns:table:1.0'); - $objWriter->writeAttribute('xmlns:draw', 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0'); - $objWriter->writeAttribute('xmlns:fo', 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0'); - $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); - $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); - $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0'); - $objWriter->writeAttribute('xmlns:number', 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0'); - $objWriter->writeAttribute('xmlns:presentation', 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0'); - $objWriter->writeAttribute('xmlns:svg', 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0'); - $objWriter->writeAttribute('xmlns:chart', 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0'); - $objWriter->writeAttribute('xmlns:dr3d', 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0'); - $objWriter->writeAttribute('xmlns:math', 'http://www.w3.org/1998/Math/MathML'); - $objWriter->writeAttribute('xmlns:form', 'urn:oasis:names:tc:opendocument:xmlns:form:1.0'); - $objWriter->writeAttribute('xmlns:script', 'urn:oasis:names:tc:opendocument:xmlns:script:1.0'); - $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); - $objWriter->writeAttribute('xmlns:ooow', 'http://openoffice.org/2004/writer'); - $objWriter->writeAttribute('xmlns:oooc', 'http://openoffice.org/2004/calc'); - $objWriter->writeAttribute('xmlns:dom', 'http://www.w3.org/2001/xml-events'); - $objWriter->writeAttribute('xmlns:rpt', 'http://openoffice.org/2005/report'); - $objWriter->writeAttribute('xmlns:of', 'urn:oasis:names:tc:opendocument:xmlns:of:1.2'); - $objWriter->writeAttribute('xmlns:xhtml', 'http://www.w3.org/1999/xhtml'); - $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#'); - $objWriter->writeAttribute('xmlns:tableooo', 'http://openoffice.org/2009/table'); - $objWriter->writeAttribute('xmlns:css3t', 'http://www.w3.org/TR/css3-text/'); - $objWriter->writeAttribute('office:version', '1.2'); - - $objWriter->writeElement('office:font-face-decls'); - $objWriter->writeElement('office:styles'); - $objWriter->writeElement('office:automatic-styles'); - $objWriter->writeElement('office:master-styles'); - $objWriter->endElement(); - - return $objWriter->getData(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Thumbnails.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Thumbnails.php deleted file mode 100644 index dfab065..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Thumbnails.php +++ /dev/null @@ -1,20 +0,0 @@ -parentWriter; - } - - /** - * Set parent Ods writer. - */ - public function __construct(Ods $writer) - { - $this->parentWriter = $writer; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf.php deleted file mode 100644 index 8722045..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf.php +++ /dev/null @@ -1,253 +0,0 @@ - 'LETTER', // (8.5 in. by 11 in.) - PageSetup::PAPERSIZE_LETTER_SMALL => 'LETTER', // (8.5 in. by 11 in.) - PageSetup::PAPERSIZE_TABLOID => [792.00, 1224.00], // (11 in. by 17 in.) - PageSetup::PAPERSIZE_LEDGER => [1224.00, 792.00], // (17 in. by 11 in.) - PageSetup::PAPERSIZE_LEGAL => 'LEGAL', // (8.5 in. by 14 in.) - PageSetup::PAPERSIZE_STATEMENT => [396.00, 612.00], // (5.5 in. by 8.5 in.) - PageSetup::PAPERSIZE_EXECUTIVE => 'EXECUTIVE', // (7.25 in. by 10.5 in.) - PageSetup::PAPERSIZE_A3 => 'A3', // (297 mm by 420 mm) - PageSetup::PAPERSIZE_A4 => 'A4', // (210 mm by 297 mm) - PageSetup::PAPERSIZE_A4_SMALL => 'A4', // (210 mm by 297 mm) - PageSetup::PAPERSIZE_A5 => 'A5', // (148 mm by 210 mm) - PageSetup::PAPERSIZE_B4 => 'B4', // (250 mm by 353 mm) - PageSetup::PAPERSIZE_B5 => 'B5', // (176 mm by 250 mm) - PageSetup::PAPERSIZE_FOLIO => 'FOLIO', // (8.5 in. by 13 in.) - PageSetup::PAPERSIZE_QUARTO => [609.45, 779.53], // (215 mm by 275 mm) - PageSetup::PAPERSIZE_STANDARD_1 => [720.00, 1008.00], // (10 in. by 14 in.) - PageSetup::PAPERSIZE_STANDARD_2 => [792.00, 1224.00], // (11 in. by 17 in.) - PageSetup::PAPERSIZE_NOTE => 'LETTER', // (8.5 in. by 11 in.) - PageSetup::PAPERSIZE_NO9_ENVELOPE => [279.00, 639.00], // (3.875 in. by 8.875 in.) - PageSetup::PAPERSIZE_NO10_ENVELOPE => [297.00, 684.00], // (4.125 in. by 9.5 in.) - PageSetup::PAPERSIZE_NO11_ENVELOPE => [324.00, 747.00], // (4.5 in. by 10.375 in.) - PageSetup::PAPERSIZE_NO12_ENVELOPE => [342.00, 792.00], // (4.75 in. by 11 in.) - PageSetup::PAPERSIZE_NO14_ENVELOPE => [360.00, 828.00], // (5 in. by 11.5 in.) - PageSetup::PAPERSIZE_C => [1224.00, 1584.00], // (17 in. by 22 in.) - PageSetup::PAPERSIZE_D => [1584.00, 2448.00], // (22 in. by 34 in.) - PageSetup::PAPERSIZE_E => [2448.00, 3168.00], // (34 in. by 44 in.) - PageSetup::PAPERSIZE_DL_ENVELOPE => [311.81, 623.62], // (110 mm by 220 mm) - PageSetup::PAPERSIZE_C5_ENVELOPE => 'C5', // (162 mm by 229 mm) - PageSetup::PAPERSIZE_C3_ENVELOPE => 'C3', // (324 mm by 458 mm) - PageSetup::PAPERSIZE_C4_ENVELOPE => 'C4', // (229 mm by 324 mm) - PageSetup::PAPERSIZE_C6_ENVELOPE => 'C6', // (114 mm by 162 mm) - PageSetup::PAPERSIZE_C65_ENVELOPE => [323.15, 649.13], // (114 mm by 229 mm) - PageSetup::PAPERSIZE_B4_ENVELOPE => 'B4', // (250 mm by 353 mm) - PageSetup::PAPERSIZE_B5_ENVELOPE => 'B5', // (176 mm by 250 mm) - PageSetup::PAPERSIZE_B6_ENVELOPE => [498.90, 354.33], // (176 mm by 125 mm) - PageSetup::PAPERSIZE_ITALY_ENVELOPE => [311.81, 651.97], // (110 mm by 230 mm) - PageSetup::PAPERSIZE_MONARCH_ENVELOPE => [279.00, 540.00], // (3.875 in. by 7.5 in.) - PageSetup::PAPERSIZE_6_3_4_ENVELOPE => [261.00, 468.00], // (3.625 in. by 6.5 in.) - PageSetup::PAPERSIZE_US_STANDARD_FANFOLD => [1071.00, 792.00], // (14.875 in. by 11 in.) - PageSetup::PAPERSIZE_GERMAN_STANDARD_FANFOLD => [612.00, 864.00], // (8.5 in. by 12 in.) - PageSetup::PAPERSIZE_GERMAN_LEGAL_FANFOLD => 'FOLIO', // (8.5 in. by 13 in.) - PageSetup::PAPERSIZE_ISO_B4 => 'B4', // (250 mm by 353 mm) - PageSetup::PAPERSIZE_JAPANESE_DOUBLE_POSTCARD => [566.93, 419.53], // (200 mm by 148 mm) - PageSetup::PAPERSIZE_STANDARD_PAPER_1 => [648.00, 792.00], // (9 in. by 11 in.) - PageSetup::PAPERSIZE_STANDARD_PAPER_2 => [720.00, 792.00], // (10 in. by 11 in.) - PageSetup::PAPERSIZE_STANDARD_PAPER_3 => [1080.00, 792.00], // (15 in. by 11 in.) - PageSetup::PAPERSIZE_INVITE_ENVELOPE => [623.62, 623.62], // (220 mm by 220 mm) - PageSetup::PAPERSIZE_LETTER_EXTRA_PAPER => [667.80, 864.00], // (9.275 in. by 12 in.) - PageSetup::PAPERSIZE_LEGAL_EXTRA_PAPER => [667.80, 1080.00], // (9.275 in. by 15 in.) - PageSetup::PAPERSIZE_TABLOID_EXTRA_PAPER => [841.68, 1296.00], // (11.69 in. by 18 in.) - PageSetup::PAPERSIZE_A4_EXTRA_PAPER => [668.98, 912.76], // (236 mm by 322 mm) - PageSetup::PAPERSIZE_LETTER_TRANSVERSE_PAPER => [595.80, 792.00], // (8.275 in. by 11 in.) - PageSetup::PAPERSIZE_A4_TRANSVERSE_PAPER => 'A4', // (210 mm by 297 mm) - PageSetup::PAPERSIZE_LETTER_EXTRA_TRANSVERSE_PAPER => [667.80, 864.00], // (9.275 in. by 12 in.) - PageSetup::PAPERSIZE_SUPERA_SUPERA_A4_PAPER => [643.46, 1009.13], // (227 mm by 356 mm) - PageSetup::PAPERSIZE_SUPERB_SUPERB_A3_PAPER => [864.57, 1380.47], // (305 mm by 487 mm) - PageSetup::PAPERSIZE_LETTER_PLUS_PAPER => [612.00, 913.68], // (8.5 in. by 12.69 in.) - PageSetup::PAPERSIZE_A4_PLUS_PAPER => [595.28, 935.43], // (210 mm by 330 mm) - PageSetup::PAPERSIZE_A5_TRANSVERSE_PAPER => 'A5', // (148 mm by 210 mm) - PageSetup::PAPERSIZE_JIS_B5_TRANSVERSE_PAPER => [515.91, 728.50], // (182 mm by 257 mm) - PageSetup::PAPERSIZE_A3_EXTRA_PAPER => [912.76, 1261.42], // (322 mm by 445 mm) - PageSetup::PAPERSIZE_A5_EXTRA_PAPER => [493.23, 666.14], // (174 mm by 235 mm) - PageSetup::PAPERSIZE_ISO_B5_EXTRA_PAPER => [569.76, 782.36], // (201 mm by 276 mm) - PageSetup::PAPERSIZE_A2_PAPER => 'A2', // (420 mm by 594 mm) - PageSetup::PAPERSIZE_A3_TRANSVERSE_PAPER => 'A3', // (297 mm by 420 mm) - PageSetup::PAPERSIZE_A3_EXTRA_TRANSVERSE_PAPER => [912.76, 1261.42], // (322 mm by 445 mm) - ]; - - /** - * Create a new PDF Writer instance. - * - * @param Spreadsheet $spreadsheet Spreadsheet object - */ - public function __construct(Spreadsheet $spreadsheet) - { - parent::__construct($spreadsheet); - //$this->setUseInlineCss(true); - $this->tempDir = File::sysGetTempDir() . '/phpsppdf'; - $this->isPdf = true; - } - - /** - * Get Font. - * - * @return string - */ - public function getFont() - { - return $this->font; - } - - /** - * Set font. Examples: - * 'arialunicid0-chinese-simplified' - * 'arialunicid0-chinese-traditional' - * 'arialunicid0-korean' - * 'arialunicid0-japanese'. - * - * @param string $fontName - * - * @return $this - */ - public function setFont($fontName) - { - $this->font = $fontName; - - return $this; - } - - /** - * Get Paper Size. - * - * @return int - */ - public function getPaperSize() - { - return $this->paperSize; - } - - /** - * Set Paper Size. - * - * @param string $pValue Paper size see PageSetup::PAPERSIZE_* - * - * @return self - */ - public function setPaperSize($pValue) - { - $this->paperSize = $pValue; - - return $this; - } - - /** - * Get Orientation. - * - * @return string - */ - public function getOrientation() - { - return $this->orientation; - } - - /** - * Set Orientation. - * - * @param string $pValue Page orientation see PageSetup::ORIENTATION_* - * - * @return self - */ - public function setOrientation($pValue) - { - $this->orientation = $pValue; - - return $this; - } - - /** - * Get temporary storage directory. - * - * @return string - */ - public function getTempDir() - { - return $this->tempDir; - } - - /** - * Set temporary storage directory. - * - * @param string $pValue Temporary storage directory - * - * @return self - */ - public function setTempDir($pValue) - { - if (is_dir($pValue)) { - $this->tempDir = $pValue; - } else { - throw new WriterException("Directory does not exist: $pValue"); - } - - return $this; - } - - /** - * Save Spreadsheet to PDF file, pre-save. - * - * @param string $pFilename Name of the file to save as - * - * @return resource - */ - protected function prepareForSave($pFilename) - { - // Open file - $this->openFileHandle($pFilename); - - return $this->fileHandle; - } - - /** - * Save PhpSpreadsheet to PDF file, post-save. - */ - protected function restoreStateAfterSave(): void - { - $this->maybeCloseFileHandle(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php deleted file mode 100644 index 9ae2cce..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php +++ /dev/null @@ -1,72 +0,0 @@ -getSheetIndex() === null) { - $orientation = ($this->spreadsheet->getSheet(0)->getPageSetup()->getOrientation() - == PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; - $printPaperSize = $this->spreadsheet->getSheet(0)->getPageSetup()->getPaperSize(); - } else { - $orientation = ($this->spreadsheet->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation() - == PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; - $printPaperSize = $this->spreadsheet->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize(); - } - - $orientation = ($orientation == 'L') ? 'landscape' : 'portrait'; - - // Override Page Orientation - if ($this->getOrientation() !== null) { - $orientation = ($this->getOrientation() == PageSetup::ORIENTATION_DEFAULT) - ? PageSetup::ORIENTATION_PORTRAIT - : $this->getOrientation(); - } - // Override Paper Size - if ($this->getPaperSize() !== null) { - $printPaperSize = $this->getPaperSize(); - } - - if (isset(self::$paperSizes[$printPaperSize])) { - $paperSize = self::$paperSizes[$printPaperSize]; - } - - // Create PDF - $pdf = $this->createExternalWriterInstance(); - $pdf->setPaper(strtolower($paperSize), $orientation); - - $pdf->loadHtml($this->generateHTMLAll()); - $pdf->render(); - - // Write to file - fwrite($fileHandle, $pdf->output()); - - parent::restoreStateAfterSave(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php deleted file mode 100644 index 75e0010..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php +++ /dev/null @@ -1,106 +0,0 @@ -getSheetIndex()) { - $orientation = ($this->spreadsheet->getSheet(0)->getPageSetup()->getOrientation() - == PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; - $printPaperSize = $this->spreadsheet->getSheet(0)->getPageSetup()->getPaperSize(); - } else { - $orientation = ($this->spreadsheet->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation() - == PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; - $printPaperSize = $this->spreadsheet->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize(); - } - $this->setOrientation($orientation); - - // Override Page Orientation - if (null !== $this->getOrientation()) { - $orientation = ($this->getOrientation() == PageSetup::ORIENTATION_DEFAULT) - ? PageSetup::ORIENTATION_PORTRAIT - : $this->getOrientation(); - } - $orientation = strtoupper($orientation); - - // Override Paper Size - if (null !== $this->getPaperSize()) { - $printPaperSize = $this->getPaperSize(); - } - - if (isset(self::$paperSizes[$printPaperSize])) { - $paperSize = self::$paperSizes[$printPaperSize]; - } - - // Create PDF - $config = ['tempDir' => $this->tempDir . '/mpdf']; - $pdf = $this->createExternalWriterInstance($config); - $ortmp = $orientation; - $pdf->_setPageSize(strtoupper($paperSize), $ortmp); - $pdf->DefOrientation = $orientation; - $pdf->AddPageByArray([ - 'orientation' => $orientation, - 'margin-left' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getLeft()), - 'margin-right' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getRight()), - 'margin-top' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getTop()), - 'margin-bottom' => $this->inchesToMm($this->spreadsheet->getActiveSheet()->getPageMargins()->getBottom()), - ]); - - // Document info - $pdf->SetTitle($this->spreadsheet->getProperties()->getTitle()); - $pdf->SetAuthor($this->spreadsheet->getProperties()->getCreator()); - $pdf->SetSubject($this->spreadsheet->getProperties()->getSubject()); - $pdf->SetKeywords($this->spreadsheet->getProperties()->getKeywords()); - $pdf->SetCreator($this->spreadsheet->getProperties()->getCreator()); - - $html = $this->generateHTMLAll(); - foreach (\array_chunk(\explode(PHP_EOL, $html), 1000) as $lines) { - $pdf->WriteHTML(\implode(PHP_EOL, $lines)); - } - - // Write to file - fwrite($fileHandle, $pdf->Output('', 'S')); - - parent::restoreStateAfterSave(); - } - - /** - * Convert inches to mm. - * - * @param float $inches - * - * @return float - */ - private function inchesToMm($inches) - { - return $inches * 25.4; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php deleted file mode 100644 index 7530b1e..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php +++ /dev/null @@ -1,104 +0,0 @@ -setUseInlineCss(true); - } - - /** - * Gets the implementation of external PDF library that should be used. - * - * @param string $orientation Page orientation - * @param string $unit Unit measure - * @param string $paperSize Paper size - * - * @return \TCPDF implementation - */ - protected function createExternalWriterInstance($orientation, $unit, $paperSize) - { - return new \TCPDF($orientation, $unit, $paperSize); - } - - /** - * Save Spreadsheet to file. - * - * @param string $pFilename Name of the file to save as - */ - public function save($pFilename): void - { - $fileHandle = parent::prepareForSave($pFilename); - - // Default PDF paper size - $paperSize = 'LETTER'; // Letter (8.5 in. by 11 in.) - - // Check for paper size and page orientation - if ($this->getSheetIndex() === null) { - $orientation = ($this->spreadsheet->getSheet(0)->getPageSetup()->getOrientation() - == PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; - $printPaperSize = $this->spreadsheet->getSheet(0)->getPageSetup()->getPaperSize(); - $printMargins = $this->spreadsheet->getSheet(0)->getPageMargins(); - } else { - $orientation = ($this->spreadsheet->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation() - == PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; - $printPaperSize = $this->spreadsheet->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize(); - $printMargins = $this->spreadsheet->getSheet($this->getSheetIndex())->getPageMargins(); - } - - // Override Page Orientation - if ($this->getOrientation() !== null) { - $orientation = ($this->getOrientation() == PageSetup::ORIENTATION_LANDSCAPE) - ? 'L' - : 'P'; - } - // Override Paper Size - if ($this->getPaperSize() !== null) { - $printPaperSize = $this->getPaperSize(); - } - - if (isset(self::$paperSizes[$printPaperSize])) { - $paperSize = self::$paperSizes[$printPaperSize]; - } - - // Create PDF - $pdf = $this->createExternalWriterInstance($orientation, 'pt', $paperSize); - $pdf->setFontSubsetting(false); - // Set margins, converting inches to points (using 72 dpi) - $pdf->SetMargins($printMargins->getLeft() * 72, $printMargins->getTop() * 72, $printMargins->getRight() * 72); - $pdf->SetAutoPageBreak(true, $printMargins->getBottom() * 72); - - $pdf->setPrintHeader(false); - $pdf->setPrintFooter(false); - - $pdf->AddPage(); - - // Set the appropriate font - $pdf->SetFont($this->getFont()); - $pdf->writeHTML($this->generateHTMLAll()); - - // Document info - $pdf->SetTitle($this->spreadsheet->getProperties()->getTitle()); - $pdf->SetAuthor($this->spreadsheet->getProperties()->getCreator()); - $pdf->SetSubject($this->spreadsheet->getProperties()->getSubject()); - $pdf->SetKeywords($this->spreadsheet->getProperties()->getKeywords()); - $pdf->SetCreator($this->spreadsheet->getProperties()->getCreator()); - - // Write to file - fwrite($fileHandle, $pdf->output($pFilename, 'S')); - - parent::restoreStateAfterSave(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php deleted file mode 100644 index c7c2e7d..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php +++ /dev/null @@ -1,901 +0,0 @@ -spreadsheet = $spreadsheet; - - $this->parser = new Xls\Parser($spreadsheet); - } - - /** - * Save Spreadsheet to file. - * - * @param resource|string $pFilename - */ - public function save($pFilename): void - { - // garbage collect - $this->spreadsheet->garbageCollect(); - - $saveDebugLog = Calculation::getInstance($this->spreadsheet)->getDebugLog()->getWriteDebugLog(); - Calculation::getInstance($this->spreadsheet)->getDebugLog()->setWriteDebugLog(false); - $saveDateReturnType = Functions::getReturnDateType(); - Functions::setReturnDateType(Functions::RETURNDATE_EXCEL); - - // initialize colors array - $this->colors = []; - - // Initialise workbook writer - $this->writerWorkbook = new Xls\Workbook($this->spreadsheet, $this->strTotal, $this->strUnique, $this->strTable, $this->colors, $this->parser); - - // Initialise worksheet writers - $countSheets = $this->spreadsheet->getSheetCount(); - for ($i = 0; $i < $countSheets; ++$i) { - $this->writerWorksheets[$i] = new Xls\Worksheet($this->strTotal, $this->strUnique, $this->strTable, $this->colors, $this->parser, $this->preCalculateFormulas, $this->spreadsheet->getSheet($i)); - } - - // build Escher objects. Escher objects for workbooks needs to be build before Escher object for workbook. - $this->buildWorksheetEschers(); - $this->buildWorkbookEscher(); - - // add 15 identical cell style Xfs - // for now, we use the first cellXf instead of cellStyleXf - $cellXfCollection = $this->spreadsheet->getCellXfCollection(); - for ($i = 0; $i < 15; ++$i) { - $this->writerWorkbook->addXfWriter($cellXfCollection[0], true); - } - - // add all the cell Xfs - foreach ($this->spreadsheet->getCellXfCollection() as $style) { - $this->writerWorkbook->addXfWriter($style, false); - } - - // add fonts from rich text eleemnts - for ($i = 0; $i < $countSheets; ++$i) { - foreach ($this->writerWorksheets[$i]->phpSheet->getCoordinates() as $coordinate) { - $cell = $this->writerWorksheets[$i]->phpSheet->getCell($coordinate); - $cVal = $cell->getValue(); - if ($cVal instanceof RichText) { - $elements = $cVal->getRichTextElements(); - foreach ($elements as $element) { - if ($element instanceof Run) { - $font = $element->getFont(); - $this->writerWorksheets[$i]->fontHashIndex[$font->getHashCode()] = $this->writerWorkbook->addFont($font); - } - } - } - } - } - - // initialize OLE file - $workbookStreamName = 'Workbook'; - $OLE = new File(OLE::ascToUcs($workbookStreamName)); - - // Write the worksheet streams before the global workbook stream, - // because the byte sizes of these are needed in the global workbook stream - $worksheetSizes = []; - for ($i = 0; $i < $countSheets; ++$i) { - $this->writerWorksheets[$i]->close(); - $worksheetSizes[] = $this->writerWorksheets[$i]->_datasize; - } - - // add binary data for global workbook stream - $OLE->append($this->writerWorkbook->writeWorkbook($worksheetSizes)); - - // add binary data for sheet streams - for ($i = 0; $i < $countSheets; ++$i) { - $OLE->append($this->writerWorksheets[$i]->getData()); - } - - $this->documentSummaryInformation = $this->writeDocumentSummaryInformation(); - // initialize OLE Document Summary Information - if (isset($this->documentSummaryInformation) && !empty($this->documentSummaryInformation)) { - $OLE_DocumentSummaryInformation = new File(OLE::ascToUcs(chr(5) . 'DocumentSummaryInformation')); - $OLE_DocumentSummaryInformation->append($this->documentSummaryInformation); - } - - $this->summaryInformation = $this->writeSummaryInformation(); - // initialize OLE Summary Information - if (isset($this->summaryInformation) && !empty($this->summaryInformation)) { - $OLE_SummaryInformation = new File(OLE::ascToUcs(chr(5) . 'SummaryInformation')); - $OLE_SummaryInformation->append($this->summaryInformation); - } - - // define OLE Parts - $arrRootData = [$OLE]; - // initialize OLE Properties file - if (isset($OLE_SummaryInformation)) { - $arrRootData[] = $OLE_SummaryInformation; - } - // initialize OLE Extended Properties file - if (isset($OLE_DocumentSummaryInformation)) { - $arrRootData[] = $OLE_DocumentSummaryInformation; - } - - $root = new Root(time(), time(), $arrRootData); - // save the OLE file - $this->openFileHandle($pFilename); - $root->save($this->fileHandle); - $this->maybeCloseFileHandle(); - - Functions::setReturnDateType($saveDateReturnType); - Calculation::getInstance($this->spreadsheet)->getDebugLog()->setWriteDebugLog($saveDebugLog); - } - - /** - * Build the Worksheet Escher objects. - */ - private function buildWorksheetEschers(): void - { - // 1-based index to BstoreContainer - $blipIndex = 0; - $lastReducedSpId = 0; - $lastSpId = 0; - - foreach ($this->spreadsheet->getAllsheets() as $sheet) { - // sheet index - $sheetIndex = $sheet->getParent()->getIndex($sheet); - - $escher = null; - - // check if there are any shapes for this sheet - $filterRange = $sheet->getAutoFilter()->getRange(); - if (count($sheet->getDrawingCollection()) == 0 && empty($filterRange)) { - continue; - } - - // create intermediate Escher object - $escher = new Escher(); - - // dgContainer - $dgContainer = new DgContainer(); - - // set the drawing index (we use sheet index + 1) - $dgId = $sheet->getParent()->getIndex($sheet) + 1; - $dgContainer->setDgId($dgId); - $escher->setDgContainer($dgContainer); - - // spgrContainer - $spgrContainer = new SpgrContainer(); - $dgContainer->setSpgrContainer($spgrContainer); - - // add one shape which is the group shape - $spContainer = new SpContainer(); - $spContainer->setSpgr(true); - $spContainer->setSpType(0); - $spContainer->setSpId(($sheet->getParent()->getIndex($sheet) + 1) << 10); - $spgrContainer->addChild($spContainer); - - // add the shapes - - $countShapes[$sheetIndex] = 0; // count number of shapes (minus group shape), in sheet - - foreach ($sheet->getDrawingCollection() as $drawing) { - ++$blipIndex; - - ++$countShapes[$sheetIndex]; - - // add the shape - $spContainer = new SpContainer(); - - // set the shape type - $spContainer->setSpType(0x004B); - // set the shape flag - $spContainer->setSpFlag(0x02); - - // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) - $reducedSpId = $countShapes[$sheetIndex]; - $spId = $reducedSpId | ($sheet->getParent()->getIndex($sheet) + 1) << 10; - $spContainer->setSpId($spId); - - // keep track of last reducedSpId - $lastReducedSpId = $reducedSpId; - - // keep track of last spId - $lastSpId = $spId; - - // set the BLIP index - $spContainer->setOPT(0x4104, $blipIndex); - - // set coordinates and offsets, client anchor - $coordinates = $drawing->getCoordinates(); - $offsetX = $drawing->getOffsetX(); - $offsetY = $drawing->getOffsetY(); - $width = $drawing->getWidth(); - $height = $drawing->getHeight(); - - $twoAnchor = \PhpOffice\PhpSpreadsheet\Shared\Xls::oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height); - - $spContainer->setStartCoordinates($twoAnchor['startCoordinates']); - $spContainer->setStartOffsetX($twoAnchor['startOffsetX']); - $spContainer->setStartOffsetY($twoAnchor['startOffsetY']); - $spContainer->setEndCoordinates($twoAnchor['endCoordinates']); - $spContainer->setEndOffsetX($twoAnchor['endOffsetX']); - $spContainer->setEndOffsetY($twoAnchor['endOffsetY']); - - $spgrContainer->addChild($spContainer); - } - - // AutoFilters - if (!empty($filterRange)) { - $rangeBounds = Coordinate::rangeBoundaries($filterRange); - $iNumColStart = $rangeBounds[0][0]; - $iNumColEnd = $rangeBounds[1][0]; - - $iInc = $iNumColStart; - while ($iInc <= $iNumColEnd) { - ++$countShapes[$sheetIndex]; - - // create an Drawing Object for the dropdown - $oDrawing = new BaseDrawing(); - // get the coordinates of drawing - $cDrawing = Coordinate::stringFromColumnIndex($iInc) . $rangeBounds[0][1]; - $oDrawing->setCoordinates($cDrawing); - $oDrawing->setWorksheet($sheet); - - // add the shape - $spContainer = new SpContainer(); - // set the shape type - $spContainer->setSpType(0x00C9); - // set the shape flag - $spContainer->setSpFlag(0x01); - - // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) - $reducedSpId = $countShapes[$sheetIndex]; - $spId = $reducedSpId | ($sheet->getParent()->getIndex($sheet) + 1) << 10; - $spContainer->setSpId($spId); - - // keep track of last reducedSpId - $lastReducedSpId = $reducedSpId; - - // keep track of last spId - $lastSpId = $spId; - - $spContainer->setOPT(0x007F, 0x01040104); // Protection -> fLockAgainstGrouping - $spContainer->setOPT(0x00BF, 0x00080008); // Text -> fFitTextToShape - $spContainer->setOPT(0x01BF, 0x00010000); // Fill Style -> fNoFillHitTest - $spContainer->setOPT(0x01FF, 0x00080000); // Line Style -> fNoLineDrawDash - $spContainer->setOPT(0x03BF, 0x000A0000); // Group Shape -> fPrint - - // set coordinates and offsets, client anchor - $endCoordinates = Coordinate::stringFromColumnIndex($iInc); - $endCoordinates .= $rangeBounds[0][1] + 1; - - $spContainer->setStartCoordinates($cDrawing); - $spContainer->setStartOffsetX(0); - $spContainer->setStartOffsetY(0); - $spContainer->setEndCoordinates($endCoordinates); - $spContainer->setEndOffsetX(0); - $spContainer->setEndOffsetY(0); - - $spgrContainer->addChild($spContainer); - ++$iInc; - } - } - - // identifier clusters, used for workbook Escher object - $this->IDCLs[$dgId] = $lastReducedSpId; - - // set last shape index - $dgContainer->setLastSpId($lastSpId); - - // set the Escher object - $this->writerWorksheets[$sheetIndex]->setEscher($escher); - } - } - - private function processMemoryDrawing(BstoreContainer &$bstoreContainer, BaseDrawing $drawing, string $renderingFunctionx): void - { - switch ($renderingFunctionx) { - case MemoryDrawing::RENDERING_JPEG: - $blipType = BSE::BLIPTYPE_JPEG; - $renderingFunction = 'imagejpeg'; - - break; - default: - $blipType = BSE::BLIPTYPE_PNG; - $renderingFunction = 'imagepng'; - - break; - } - - ob_start(); - call_user_func($renderingFunction, $drawing->getImageResource()); - $blipData = ob_get_contents(); - ob_end_clean(); - - $blip = new Blip(); - $blip->setData($blipData); - - $BSE = new BSE(); - $BSE->setBlipType($blipType); - $BSE->setBlip($blip); - - $bstoreContainer->addBSE($BSE); - } - - private function processDrawing(BstoreContainer &$bstoreContainer, BaseDrawing $drawing): void - { - $blipData = ''; - $filename = $drawing->getPath(); - - [$imagesx, $imagesy, $imageFormat] = getimagesize($filename); - - switch ($imageFormat) { - case 1: // GIF, not supported by BIFF8, we convert to PNG - $blipType = BSE::BLIPTYPE_PNG; - ob_start(); - imagepng(imagecreatefromgif($filename)); - $blipData = ob_get_contents(); - ob_end_clean(); - - break; - case 2: // JPEG - $blipType = BSE::BLIPTYPE_JPEG; - $blipData = file_get_contents($filename); - - break; - case 3: // PNG - $blipType = BSE::BLIPTYPE_PNG; - $blipData = file_get_contents($filename); - - break; - case 6: // Windows DIB (BMP), we convert to PNG - $blipType = BSE::BLIPTYPE_PNG; - ob_start(); - imagepng(SharedDrawing::imagecreatefrombmp($filename)); - $blipData = ob_get_contents(); - ob_end_clean(); - - break; - } - if ($blipData) { - $blip = new Blip(); - $blip->setData($blipData); - - $BSE = new BSE(); - $BSE->setBlipType($blipType); - $BSE->setBlip($blip); - - $bstoreContainer->addBSE($BSE); - } - } - - private function processBaseDrawing(BstoreContainer &$bstoreContainer, BaseDrawing $drawing): void - { - if ($drawing instanceof Drawing) { - $this->processDrawing($bstoreContainer, $drawing); - } elseif ($drawing instanceof MemoryDrawing) { - $this->processMemoryDrawing($bstoreContainer, $drawing, $drawing->getRenderingFunction()); - } - } - - private function checkForDrawings(): bool - { - // any drawings in this workbook? - $found = false; - foreach ($this->spreadsheet->getAllSheets() as $sheet) { - if (count($sheet->getDrawingCollection()) > 0) { - $found = true; - - break; - } - } - - return $found; - } - - /** - * Build the Escher object corresponding to the MSODRAWINGGROUP record. - */ - private function buildWorkbookEscher(): void - { - // nothing to do if there are no drawings - if (!$this->checkForDrawings()) { - return; - } - - // if we reach here, then there are drawings in the workbook - $escher = new Escher(); - - // dggContainer - $dggContainer = new DggContainer(); - $escher->setDggContainer($dggContainer); - - // set IDCLs (identifier clusters) - $dggContainer->setIDCLs($this->IDCLs); - - // this loop is for determining maximum shape identifier of all drawing - $spIdMax = 0; - $totalCountShapes = 0; - $countDrawings = 0; - - foreach ($this->spreadsheet->getAllsheets() as $sheet) { - $sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet - - $addCount = 0; - foreach ($sheet->getDrawingCollection() as $drawing) { - $addCount = 1; - ++$sheetCountShapes; - ++$totalCountShapes; - - $spId = $sheetCountShapes | ($this->spreadsheet->getIndex($sheet) + 1) << 10; - $spIdMax = max($spId, $spIdMax); - } - $countDrawings += $addCount; - } - - $dggContainer->setSpIdMax($spIdMax + 1); - $dggContainer->setCDgSaved($countDrawings); - $dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing - - // bstoreContainer - $bstoreContainer = new BstoreContainer(); - $dggContainer->setBstoreContainer($bstoreContainer); - - // the BSE's (all the images) - foreach ($this->spreadsheet->getAllsheets() as $sheet) { - foreach ($sheet->getDrawingCollection() as $drawing) { - $this->processBaseDrawing($bstoreContainer, $drawing); - } - } - - // Set the Escher object - $this->writerWorkbook->setEscher($escher); - } - - /** - * Build the OLE Part for DocumentSummary Information. - * - * @return string - */ - private function writeDocumentSummaryInformation() - { - // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) - $data = pack('v', 0xFFFE); - // offset: 2; size: 2; - $data .= pack('v', 0x0000); - // offset: 4; size: 2; OS version - $data .= pack('v', 0x0106); - // offset: 6; size: 2; OS indicator - $data .= pack('v', 0x0002); - // offset: 8; size: 16 - $data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00); - // offset: 24; size: 4; section count - $data .= pack('V', 0x0001); - - // offset: 28; size: 16; first section's class id: 02 d5 cd d5 9c 2e 1b 10 93 97 08 00 2b 2c f9 ae - $data .= pack('vvvvvvvv', 0xD502, 0xD5CD, 0x2E9C, 0x101B, 0x9793, 0x0008, 0x2C2B, 0xAEF9); - // offset: 44; size: 4; offset of the start - $data .= pack('V', 0x30); - - // SECTION - $dataSection = []; - $dataSection_NumProps = 0; - $dataSection_Summary = ''; - $dataSection_Content = ''; - - // GKPIDDSI_CODEPAGE: CodePage - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x01], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x02], // 2 byte signed integer - 'data' => ['data' => 1252], - ]; - ++$dataSection_NumProps; - - // GKPIDDSI_CATEGORY : Category - $dataProp = $this->spreadsheet->getProperties()->getCategory(); - if ($dataProp) { - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x02], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x1E], - 'data' => ['data' => $dataProp, 'length' => strlen($dataProp)], - ]; - ++$dataSection_NumProps; - } - // GKPIDDSI_VERSION :Version of the application that wrote the property storage - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x17], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x03], - 'data' => ['pack' => 'V', 'data' => 0x000C0000], - ]; - ++$dataSection_NumProps; - // GKPIDDSI_SCALE : FALSE - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x0B], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x0B], - 'data' => ['data' => false], - ]; - ++$dataSection_NumProps; - // GKPIDDSI_LINKSDIRTY : True if any of the values for the linked properties have changed outside of the application - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x10], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x0B], - 'data' => ['data' => false], - ]; - ++$dataSection_NumProps; - // GKPIDDSI_SHAREDOC : FALSE - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x13], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x0B], - 'data' => ['data' => false], - ]; - ++$dataSection_NumProps; - // GKPIDDSI_HYPERLINKSCHANGED : True if any of the values for the _PID_LINKS (hyperlink text) have changed outside of the application - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x16], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x0B], - 'data' => ['data' => false], - ]; - ++$dataSection_NumProps; - - // GKPIDDSI_DOCSPARTS - // MS-OSHARED p75 (2.3.3.2.2.1) - // Structure is VtVecUnalignedLpstrValue (2.3.3.1.9) - // cElements - $dataProp = pack('v', 0x0001); - $dataProp .= pack('v', 0x0000); - // array of UnalignedLpstr - // cch - $dataProp .= pack('v', 0x000A); - $dataProp .= pack('v', 0x0000); - // value - $dataProp .= 'Worksheet' . chr(0); - - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x0D], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x101E], - 'data' => ['data' => $dataProp, 'length' => strlen($dataProp)], - ]; - ++$dataSection_NumProps; - - // GKPIDDSI_HEADINGPAIR - // VtVecHeadingPairValue - // cElements - $dataProp = pack('v', 0x0002); - $dataProp .= pack('v', 0x0000); - // Array of vtHeadingPair - // vtUnalignedString - headingString - // stringType - $dataProp .= pack('v', 0x001E); - // padding - $dataProp .= pack('v', 0x0000); - // UnalignedLpstr - // cch - $dataProp .= pack('v', 0x0013); - $dataProp .= pack('v', 0x0000); - // value - $dataProp .= 'Feuilles de calcul'; - // vtUnalignedString - headingParts - // wType : 0x0003 = 32 bit signed integer - $dataProp .= pack('v', 0x0300); - // padding - $dataProp .= pack('v', 0x0000); - // value - $dataProp .= pack('v', 0x0100); - $dataProp .= pack('v', 0x0000); - $dataProp .= pack('v', 0x0000); - $dataProp .= pack('v', 0x0000); - - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x0C], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x100C], - 'data' => ['data' => $dataProp, 'length' => strlen($dataProp)], - ]; - ++$dataSection_NumProps; - - // 4 Section Length - // 4 Property count - // 8 * $dataSection_NumProps (8 = ID (4) + OffSet(4)) - $dataSection_Content_Offset = 8 + $dataSection_NumProps * 8; - foreach ($dataSection as $dataProp) { - // Summary - $dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']); - // Offset - $dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset); - // DataType - $dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']); - // Data - if ($dataProp['type']['data'] == 0x02) { // 2 byte signed integer - $dataSection_Content .= pack('V', $dataProp['data']['data']); - - $dataSection_Content_Offset += 4 + 4; - } elseif ($dataProp['type']['data'] == 0x03) { // 4 byte signed integer - $dataSection_Content .= pack('V', $dataProp['data']['data']); - - $dataSection_Content_Offset += 4 + 4; - } elseif ($dataProp['type']['data'] == 0x0B) { // Boolean - $dataSection_Content .= pack('V', (int) $dataProp['data']['data']); - $dataSection_Content_Offset += 4 + 4; - } elseif ($dataProp['type']['data'] == 0x1E) { // null-terminated string prepended by dword string length - // Null-terminated string - $dataProp['data']['data'] .= chr(0); - ++$dataProp['data']['length']; - // Complete the string with null string for being a %4 - $dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4) == 4 ? 0 : (4 - $dataProp['data']['length'] % 4)); - $dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT); - - $dataSection_Content .= pack('V', $dataProp['data']['length']); - $dataSection_Content .= $dataProp['data']['data']; - - $dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']); - // Condition below can never be true - //} elseif ($dataProp['type']['data'] == 0x40) { // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) - // $dataSection_Content .= $dataProp['data']['data']; - - // $dataSection_Content_Offset += 4 + 8; - } else { - $dataSection_Content .= $dataProp['data']['data']; - - $dataSection_Content_Offset += 4 + $dataProp['data']['length']; - } - } - // Now $dataSection_Content_Offset contains the size of the content - - // section header - // offset: $secOffset; size: 4; section length - // + x Size of the content (summary + content) - $data .= pack('V', $dataSection_Content_Offset); - // offset: $secOffset+4; size: 4; property count - $data .= pack('V', $dataSection_NumProps); - // Section Summary - $data .= $dataSection_Summary; - // Section Content - $data .= $dataSection_Content; - - return $data; - } - - private function writeSummaryPropOle(int $dataProp, int &$dataSection_NumProps, array &$dataSection, int $sumdata, int $typdata): void - { - if ($dataProp) { - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => $sumdata], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => $typdata], // null-terminated string prepended by dword string length - 'data' => ['data' => OLE::localDateToOLE($dataProp)], - ]; - ++$dataSection_NumProps; - } - } - - private function writeSummaryProp(string $dataProp, int &$dataSection_NumProps, array &$dataSection, int $sumdata, int $typdata): void - { - if ($dataProp) { - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => $sumdata], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => $typdata], // null-terminated string prepended by dword string length - 'data' => ['data' => $dataProp, 'length' => strlen($dataProp)], - ]; - ++$dataSection_NumProps; - } - } - - /** - * Build the OLE Part for Summary Information. - * - * @return string - */ - private function writeSummaryInformation() - { - // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) - $data = pack('v', 0xFFFE); - // offset: 2; size: 2; - $data .= pack('v', 0x0000); - // offset: 4; size: 2; OS version - $data .= pack('v', 0x0106); - // offset: 6; size: 2; OS indicator - $data .= pack('v', 0x0002); - // offset: 8; size: 16 - $data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00); - // offset: 24; size: 4; section count - $data .= pack('V', 0x0001); - - // offset: 28; size: 16; first section's class id: e0 85 9f f2 f9 4f 68 10 ab 91 08 00 2b 27 b3 d9 - $data .= pack('vvvvvvvv', 0x85E0, 0xF29F, 0x4FF9, 0x1068, 0x91AB, 0x0008, 0x272B, 0xD9B3); - // offset: 44; size: 4; offset of the start - $data .= pack('V', 0x30); - - // SECTION - $dataSection = []; - $dataSection_NumProps = 0; - $dataSection_Summary = ''; - $dataSection_Content = ''; - - // CodePage : CP-1252 - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x01], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x02], // 2 byte signed integer - 'data' => ['data' => 1252], - ]; - ++$dataSection_NumProps; - - $props = $this->spreadsheet->getProperties(); - $this->writeSummaryProp($props->getTitle(), $dataSection_NumProps, $dataSection, 0x02, 0x1e); - $this->writeSummaryProp($props->getSubject(), $dataSection_NumProps, $dataSection, 0x03, 0x1e); - $this->writeSummaryProp($props->getCreator(), $dataSection_NumProps, $dataSection, 0x04, 0x1e); - $this->writeSummaryProp($props->getKeywords(), $dataSection_NumProps, $dataSection, 0x05, 0x1e); - $this->writeSummaryProp($props->getDescription(), $dataSection_NumProps, $dataSection, 0x06, 0x1e); - $this->writeSummaryProp($props->getLastModifiedBy(), $dataSection_NumProps, $dataSection, 0x08, 0x1e); - $this->writeSummaryPropOle($props->getCreated(), $dataSection_NumProps, $dataSection, 0x0c, 0x40); - $this->writeSummaryPropOle($props->getModified(), $dataSection_NumProps, $dataSection, 0x0d, 0x40); - - // Security - $dataSection[] = [ - 'summary' => ['pack' => 'V', 'data' => 0x13], - 'offset' => ['pack' => 'V'], - 'type' => ['pack' => 'V', 'data' => 0x03], // 4 byte signed integer - 'data' => ['data' => 0x00], - ]; - ++$dataSection_NumProps; - - // 4 Section Length - // 4 Property count - // 8 * $dataSection_NumProps (8 = ID (4) + OffSet(4)) - $dataSection_Content_Offset = 8 + $dataSection_NumProps * 8; - foreach ($dataSection as $dataProp) { - // Summary - $dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']); - // Offset - $dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset); - // DataType - $dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']); - // Data - if ($dataProp['type']['data'] == 0x02) { // 2 byte signed integer - $dataSection_Content .= pack('V', $dataProp['data']['data']); - - $dataSection_Content_Offset += 4 + 4; - } elseif ($dataProp['type']['data'] == 0x03) { // 4 byte signed integer - $dataSection_Content .= pack('V', $dataProp['data']['data']); - - $dataSection_Content_Offset += 4 + 4; - } elseif ($dataProp['type']['data'] == 0x1E) { // null-terminated string prepended by dword string length - // Null-terminated string - $dataProp['data']['data'] .= chr(0); - ++$dataProp['data']['length']; - // Complete the string with null string for being a %4 - $dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4) == 4 ? 0 : (4 - $dataProp['data']['length'] % 4)); - $dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT); - - $dataSection_Content .= pack('V', $dataProp['data']['length']); - $dataSection_Content .= $dataProp['data']['data']; - - $dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']); - } elseif ($dataProp['type']['data'] == 0x40) { // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) - $dataSection_Content .= $dataProp['data']['data']; - - $dataSection_Content_Offset += 4 + 8; - } - // Data Type Not Used at the moment - } - // Now $dataSection_Content_Offset contains the size of the content - - // section header - // offset: $secOffset; size: 4; section length - // + x Size of the content (summary + content) - $data .= pack('V', $dataSection_Content_Offset); - // offset: $secOffset+4; size: 4; property count - $data .= pack('V', $dataSection_NumProps); - // Section Summary - $data .= $dataSection_Summary; - // Section Content - $data .= $dataSection_Content; - - return $data; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/BIFFwriter.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/BIFFwriter.php deleted file mode 100644 index 84e27d0..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/BIFFwriter.php +++ /dev/null @@ -1,224 +0,0 @@ - -// * -// * The majority of this is _NOT_ my code. I simply ported it from the -// * PERL Spreadsheet::WriteExcel module. -// * -// * The author of the Spreadsheet::WriteExcel module is John McNamara -// * -// * -// * I _DO_ maintain this code, and John McNamara has nothing to do with the -// * porting of this code to PHP. Any questions directly related to this -// * class library should be directed to me. -// * -// * License Information: -// * -// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets -// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com -// * -// * This library is free software; you can redistribute it and/or -// * modify it under the terms of the GNU Lesser General Public -// * License as published by the Free Software Foundation; either -// * version 2.1 of the License, or (at your option) any later version. -// * -// * This library is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// * Lesser General Public License for more details. -// * -// * You should have received a copy of the GNU Lesser General Public -// * License along with this library; if not, write to the Free Software -// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// */ -class BIFFwriter -{ - /** - * The byte order of this architecture. 0 => little endian, 1 => big endian. - * - * @var int - */ - private static $byteOrder; - - /** - * The string containing the data of the BIFF stream. - * - * @var string - */ - public $_data; - - /** - * The size of the data in bytes. Should be the same as strlen($this->_data). - * - * @var int - */ - public $_datasize; - - /** - * The maximum length for a BIFF record (excluding record header and length field). See addContinue(). - * - * @var int - * - * @see addContinue() - */ - private $limit = 8224; - - /** - * Constructor. - */ - public function __construct() - { - $this->_data = ''; - $this->_datasize = 0; - } - - /** - * Determine the byte order and store it as class data to avoid - * recalculating it for each call to new(). - * - * @return int - */ - public static function getByteOrder() - { - if (!isset(self::$byteOrder)) { - // Check if "pack" gives the required IEEE 64bit float - $teststr = pack('d', 1.2345); - $number = pack('C8', 0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F); - if ($number == $teststr) { - $byte_order = 0; // Little Endian - } elseif ($number == strrev($teststr)) { - $byte_order = 1; // Big Endian - } else { - // Give up. I'll fix this in a later version. - throw new WriterException('Required floating point format not supported on this platform.'); - } - self::$byteOrder = $byte_order; - } - - return self::$byteOrder; - } - - /** - * General storage function. - * - * @param string $data binary data to append - */ - protected function append($data): void - { - if (strlen($data) - 4 > $this->limit) { - $data = $this->addContinue($data); - } - $this->_data .= $data; - $this->_datasize += strlen($data); - } - - /** - * General storage function like append, but returns string instead of modifying $this->_data. - * - * @param string $data binary data to write - * - * @return string - */ - public function writeData($data) - { - if (strlen($data) - 4 > $this->limit) { - $data = $this->addContinue($data); - } - $this->_datasize += strlen($data); - - return $data; - } - - /** - * Writes Excel BOF record to indicate the beginning of a stream or - * sub-stream in the BIFF file. - * - * @param int $type type of BIFF file to write: 0x0005 Workbook, - * 0x0010 Worksheet - */ - protected function storeBof($type): void - { - $record = 0x0809; // Record identifier (BIFF5-BIFF8) - $length = 0x0010; - - // by inspection of real files, MS Office Excel 2007 writes the following - $unknown = pack('VV', 0x000100D1, 0x00000406); - - $build = 0x0DBB; // Excel 97 - $year = 0x07CC; // Excel 97 - - $version = 0x0600; // BIFF8 - - $header = pack('vv', $record, $length); - $data = pack('vvvv', $version, $type, $build, $year); - $this->append($header . $data . $unknown); - } - - /** - * Writes Excel EOF record to indicate the end of a BIFF stream. - */ - protected function storeEof(): void - { - $record = 0x000A; // Record identifier - $length = 0x0000; // Number of bytes to follow - - $header = pack('vv', $record, $length); - $this->append($header); - } - - /** - * Writes Excel EOF record to indicate the end of a BIFF stream. - */ - public function writeEof() - { - $record = 0x000A; // Record identifier - $length = 0x0000; // Number of bytes to follow - $header = pack('vv', $record, $length); - - return $this->writeData($header); - } - - /** - * Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In - * Excel 97 the limit is 8228 bytes. Records that are longer than these limits - * must be split up into CONTINUE blocks. - * - * This function takes a long BIFF record and inserts CONTINUE records as - * necessary. - * - * @param string $data The original binary data to be written - * - * @return string A very convenient string of continue blocks - */ - private function addContinue($data) - { - $limit = $this->limit; - $record = 0x003C; // Record identifier - - // The first 2080/8224 bytes remain intact. However, we have to change - // the length field of the record. - $tmp = substr($data, 0, 2) . pack('v', $limit) . substr($data, 4, $limit); - - $header = pack('vv', $record, $limit); // Headers for continue records - - // Retrieve chunks of 2080/8224 bytes +4 for the header. - $data_length = strlen($data); - for ($i = $limit + 4; $i < ($data_length - $limit); $i += $limit) { - $tmp .= $header; - $tmp .= substr($data, $i, $limit); - } - - // Retrieve the last chunk of data - $header = pack('vv', $record, strlen($data) - $i); - $tmp .= $header; - $tmp .= substr($data, $i); - - return $tmp; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Escher.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Escher.php deleted file mode 100644 index 1ee2e90..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Escher.php +++ /dev/null @@ -1,510 +0,0 @@ -object = $object; - } - - /** - * Process the object to be written. - * - * @return string - */ - public function close() - { - // initialize - $this->data = ''; - - switch (get_class($this->object)) { - case \PhpOffice\PhpSpreadsheet\Shared\Escher::class: - if ($dggContainer = $this->object->getDggContainer()) { - $writer = new self($dggContainer); - $this->data = $writer->close(); - } elseif ($dgContainer = $this->object->getDgContainer()) { - $writer = new self($dgContainer); - $this->data = $writer->close(); - $this->spOffsets = $writer->getSpOffsets(); - $this->spTypes = $writer->getSpTypes(); - } - - break; - case DggContainer::class: - // this is a container record - - // initialize - $innerData = ''; - - // write the dgg - $recVer = 0x0; - $recInstance = 0x0000; - $recType = 0xF006; - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - // dgg data - $dggData = - pack( - 'VVVV', - $this->object->getSpIdMax(), // maximum shape identifier increased by one - $this->object->getCDgSaved() + 1, // number of file identifier clusters increased by one - $this->object->getCSpSaved(), - $this->object->getCDgSaved() // count total number of drawings saved - ); - - // add file identifier clusters (one per drawing) - $IDCLs = $this->object->getIDCLs(); - - foreach ($IDCLs as $dgId => $maxReducedSpId) { - $dggData .= pack('VV', $dgId, $maxReducedSpId + 1); - } - - $header = pack('vvV', $recVerInstance, $recType, strlen($dggData)); - $innerData .= $header . $dggData; - - // write the bstoreContainer - if ($bstoreContainer = $this->object->getBstoreContainer()) { - $writer = new self($bstoreContainer); - $innerData .= $writer->close(); - } - - // write the record - $recVer = 0xF; - $recInstance = 0x0000; - $recType = 0xF000; - $length = strlen($innerData); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - $this->data = $header . $innerData; - - break; - case BstoreContainer::class: - // this is a container record - - // initialize - $innerData = ''; - - // treat the inner data - if ($BSECollection = $this->object->getBSECollection()) { - foreach ($BSECollection as $BSE) { - $writer = new self($BSE); - $innerData .= $writer->close(); - } - } - - // write the record - $recVer = 0xF; - $recInstance = count($this->object->getBSECollection()); - $recType = 0xF001; - $length = strlen($innerData); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - $this->data = $header . $innerData; - - break; - case BSE::class: - // this is a semi-container record - - // initialize - $innerData = ''; - - // here we treat the inner data - if ($blip = $this->object->getBlip()) { - $writer = new self($blip); - $innerData .= $writer->close(); - } - - // initialize - $data = ''; - - $btWin32 = $this->object->getBlipType(); - $btMacOS = $this->object->getBlipType(); - $data .= pack('CC', $btWin32, $btMacOS); - - $rgbUid = pack('VVVV', 0, 0, 0, 0); // todo - $data .= $rgbUid; - - $tag = 0; - $size = strlen($innerData); - $cRef = 1; - $foDelay = 0; //todo - $unused1 = 0x0; - $cbName = 0x0; - $unused2 = 0x0; - $unused3 = 0x0; - $data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3); - - $data .= $innerData; - - // write the record - $recVer = 0x2; - $recInstance = $this->object->getBlipType(); - $recType = 0xF007; - $length = strlen($data); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - $this->data = $header; - - $this->data .= $data; - - break; - case Blip::class: - // this is an atom record - - // write the record - switch ($this->object->getParent()->getBlipType()) { - case BSE::BLIPTYPE_JPEG: - // initialize - $innerData = ''; - - $rgbUid1 = pack('VVVV', 0, 0, 0, 0); // todo - $innerData .= $rgbUid1; - - $tag = 0xFF; // todo - $innerData .= pack('C', $tag); - - $innerData .= $this->object->getData(); - - $recVer = 0x0; - $recInstance = 0x46A; - $recType = 0xF01D; - $length = strlen($innerData); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - $this->data = $header; - - $this->data .= $innerData; - - break; - case BSE::BLIPTYPE_PNG: - // initialize - $innerData = ''; - - $rgbUid1 = pack('VVVV', 0, 0, 0, 0); // todo - $innerData .= $rgbUid1; - - $tag = 0xFF; // todo - $innerData .= pack('C', $tag); - - $innerData .= $this->object->getData(); - - $recVer = 0x0; - $recInstance = 0x6E0; - $recType = 0xF01E; - $length = strlen($innerData); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - $this->data = $header; - - $this->data .= $innerData; - - break; - } - - break; - case DgContainer::class: - // this is a container record - - // initialize - $innerData = ''; - - // write the dg - $recVer = 0x0; - $recInstance = $this->object->getDgId(); - $recType = 0xF008; - $length = 8; - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - // number of shapes in this drawing (including group shape) - $countShapes = count($this->object->getSpgrContainer()->getChildren()); - $innerData .= $header . pack('VV', $countShapes, $this->object->getLastSpId()); - - // write the spgrContainer - if ($spgrContainer = $this->object->getSpgrContainer()) { - $writer = new self($spgrContainer); - $innerData .= $writer->close(); - - // get the shape offsets relative to the spgrContainer record - $spOffsets = $writer->getSpOffsets(); - $spTypes = $writer->getSpTypes(); - - // save the shape offsets relative to dgContainer - foreach ($spOffsets as &$spOffset) { - $spOffset += 24; // add length of dgContainer header data (8 bytes) plus dg data (16 bytes) - } - - $this->spOffsets = $spOffsets; - $this->spTypes = $spTypes; - } - - // write the record - $recVer = 0xF; - $recInstance = 0x0000; - $recType = 0xF002; - $length = strlen($innerData); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - $this->data = $header . $innerData; - - break; - case SpgrContainer::class: - // this is a container record - - // initialize - $innerData = ''; - - // initialize spape offsets - $totalSize = 8; - $spOffsets = []; - $spTypes = []; - - // treat the inner data - foreach ($this->object->getChildren() as $spContainer) { - $writer = new self($spContainer); - $spData = $writer->close(); - $innerData .= $spData; - - // save the shape offsets (where new shape records begin) - $totalSize += strlen($spData); - $spOffsets[] = $totalSize; - - $spTypes = array_merge($spTypes, $writer->getSpTypes()); - } - - // write the record - $recVer = 0xF; - $recInstance = 0x0000; - $recType = 0xF003; - $length = strlen($innerData); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - $this->data = $header . $innerData; - $this->spOffsets = $spOffsets; - $this->spTypes = $spTypes; - - break; - case SpContainer::class: - // initialize - $data = ''; - - // build the data - - // write group shape record, if necessary? - if ($this->object->getSpgr()) { - $recVer = 0x1; - $recInstance = 0x0000; - $recType = 0xF009; - $length = 0x00000010; - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - $data .= $header . pack('VVVV', 0, 0, 0, 0); - } - $this->spTypes[] = ($this->object->getSpType()); - - // write the shape record - $recVer = 0x2; - $recInstance = $this->object->getSpType(); // shape type - $recType = 0xF00A; - $length = 0x00000008; - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - $data .= $header . pack('VV', $this->object->getSpId(), $this->object->getSpgr() ? 0x0005 : 0x0A00); - - // the options - if ($this->object->getOPTCollection()) { - $optData = ''; - - $recVer = 0x3; - $recInstance = count($this->object->getOPTCollection()); - $recType = 0xF00B; - foreach ($this->object->getOPTCollection() as $property => $value) { - $optData .= pack('vV', $property, $value); - } - $length = strlen($optData); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - $data .= $header . $optData; - } - - // the client anchor - if ($this->object->getStartCoordinates()) { - $clientAnchorData = ''; - - $recVer = 0x0; - $recInstance = 0x0; - $recType = 0xF010; - - // start coordinates - [$column, $row] = Coordinate::coordinateFromString($this->object->getStartCoordinates()); - $c1 = Coordinate::columnIndexFromString($column) - 1; - $r1 = $row - 1; - - // start offsetX - $startOffsetX = $this->object->getStartOffsetX(); - - // start offsetY - $startOffsetY = $this->object->getStartOffsetY(); - - // end coordinates - [$column, $row] = Coordinate::coordinateFromString($this->object->getEndCoordinates()); - $c2 = Coordinate::columnIndexFromString($column) - 1; - $r2 = $row - 1; - - // end offsetX - $endOffsetX = $this->object->getEndOffsetX(); - - // end offsetY - $endOffsetY = $this->object->getEndOffsetY(); - - $clientAnchorData = pack('vvvvvvvvv', $this->object->getSpFlag(), $c1, $startOffsetX, $r1, $startOffsetY, $c2, $endOffsetX, $r2, $endOffsetY); - - $length = strlen($clientAnchorData); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - $data .= $header . $clientAnchorData; - } - - // the client data, just empty for now - if (!$this->object->getSpgr()) { - $clientDataData = ''; - - $recVer = 0x0; - $recInstance = 0x0; - $recType = 0xF011; - - $length = strlen($clientDataData); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - $data .= $header . $clientDataData; - } - - // write the record - $recVer = 0xF; - $recInstance = 0x0000; - $recType = 0xF004; - $length = strlen($data); - - $recVerInstance = $recVer; - $recVerInstance |= $recInstance << 4; - - $header = pack('vvV', $recVerInstance, $recType, $length); - - $this->data = $header . $data; - - break; - } - - return $this->data; - } - - /** - * Gets the shape offsets. - * - * @return array - */ - public function getSpOffsets() - { - return $this->spOffsets; - } - - /** - * Gets the shape types. - * - * @return array - */ - public function getSpTypes() - { - return $this->spTypes; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Font.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Font.php deleted file mode 100644 index 9cb31ea..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Font.php +++ /dev/null @@ -1,147 +0,0 @@ -colorIndex = 0x7FFF; - $this->font = $font; - } - - /** - * Set the color index. - * - * @param int $colorIndex - */ - public function setColorIndex($colorIndex): void - { - $this->colorIndex = $colorIndex; - } - - /** - * Get font record data. - * - * @return string - */ - public function writeFont() - { - $font_outline = 0; - $font_shadow = 0; - - $icv = $this->colorIndex; // Index to color palette - if ($this->font->getSuperscript()) { - $sss = 1; - } elseif ($this->font->getSubscript()) { - $sss = 2; - } else { - $sss = 0; - } - $bFamily = 0; // Font family - $bCharSet = \PhpOffice\PhpSpreadsheet\Shared\Font::getCharsetFromFontName($this->font->getName()); // Character set - - $record = 0x31; // Record identifier - $reserved = 0x00; // Reserved - $grbit = 0x00; // Font attributes - if ($this->font->getItalic()) { - $grbit |= 0x02; - } - if ($this->font->getStrikethrough()) { - $grbit |= 0x08; - } - if ($font_outline) { - $grbit |= 0x10; - } - if ($font_shadow) { - $grbit |= 0x20; - } - - $data = pack( - 'vvvvvCCCC', - // Fontsize (in twips) - $this->font->getSize() * 20, - $grbit, - // Colour - $icv, - // Font weight - self::mapBold($this->font->getBold()), - // Superscript/Subscript - $sss, - self::mapUnderline($this->font->getUnderline()), - $bFamily, - $bCharSet, - $reserved - ); - $data .= StringHelper::UTF8toBIFF8UnicodeShort($this->font->getName()); - - $length = strlen($data); - $header = pack('vv', $record, $length); - - return $header . $data; - } - - /** - * Map to BIFF5-BIFF8 codes for bold. - * - * @param bool $bold - * - * @return int - */ - private static function mapBold($bold) - { - if ($bold) { - return 0x2BC; // 700 = Bold font weight - } - - return 0x190; // 400 = Normal font weight - } - - /** - * Map of BIFF2-BIFF8 codes for underline styles. - * - * @var array of int - */ - private static $mapUnderline = [ - \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_NONE => 0x00, - \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLE => 0x01, - \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_DOUBLE => 0x02, - \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLEACCOUNTING => 0x21, - \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_DOUBLEACCOUNTING => 0x22, - ]; - - /** - * Map underline. - * - * @param string $underline - * - * @return int - */ - private static function mapUnderline($underline) - { - if (isset(self::$mapUnderline[$underline])) { - return self::$mapUnderline[$underline]; - } - - return 0x00; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php deleted file mode 100644 index f89957a..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php +++ /dev/null @@ -1,1483 +0,0 @@ -=,;#()"{} - const REGEX_SHEET_TITLE_UNQUOTED = '[^\*\:\/\\\\\?\[\]\+\-\% \\\'\^\&\<\>\=\,\;\#\(\)\"\{\}]+'; - - // Sheet title in quoted form (without surrounding quotes) - // Invalid sheet title characters cannot occur in the sheet title: - // *:/\?[] (usual invalid sheet title characters) - // Single quote is represented as a pair '' - const REGEX_SHEET_TITLE_QUOTED = '(([^\*\:\/\\\\\?\[\]\\\'])+|(\\\'\\\')+)+'; - - /** - * The index of the character we are currently looking at. - * - * @var int - */ - public $currentCharacter; - - /** - * The token we are working on. - * - * @var string - */ - public $currentToken; - - /** - * The formula to parse. - * - * @var string - */ - private $formula; - - /** - * The character ahead of the current char. - * - * @var string - */ - public $lookAhead; - - /** - * The parse tree to be generated. - * - * @var string - */ - public $parseTree; - - /** - * Array of external sheets. - * - * @var array - */ - private $externalSheets; - - /** - * Array of sheet references in the form of REF structures. - * - * @var array - */ - public $references; - - /** - * The Excel ptg indices. - * - * @var array - */ - private $ptg = [ - 'ptgExp' => 0x01, - 'ptgTbl' => 0x02, - 'ptgAdd' => 0x03, - 'ptgSub' => 0x04, - 'ptgMul' => 0x05, - 'ptgDiv' => 0x06, - 'ptgPower' => 0x07, - 'ptgConcat' => 0x08, - 'ptgLT' => 0x09, - 'ptgLE' => 0x0A, - 'ptgEQ' => 0x0B, - 'ptgGE' => 0x0C, - 'ptgGT' => 0x0D, - 'ptgNE' => 0x0E, - 'ptgIsect' => 0x0F, - 'ptgUnion' => 0x10, - 'ptgRange' => 0x11, - 'ptgUplus' => 0x12, - 'ptgUminus' => 0x13, - 'ptgPercent' => 0x14, - 'ptgParen' => 0x15, - 'ptgMissArg' => 0x16, - 'ptgStr' => 0x17, - 'ptgAttr' => 0x19, - 'ptgSheet' => 0x1A, - 'ptgEndSheet' => 0x1B, - 'ptgErr' => 0x1C, - 'ptgBool' => 0x1D, - 'ptgInt' => 0x1E, - 'ptgNum' => 0x1F, - 'ptgArray' => 0x20, - 'ptgFunc' => 0x21, - 'ptgFuncVar' => 0x22, - 'ptgName' => 0x23, - 'ptgRef' => 0x24, - 'ptgArea' => 0x25, - 'ptgMemArea' => 0x26, - 'ptgMemErr' => 0x27, - 'ptgMemNoMem' => 0x28, - 'ptgMemFunc' => 0x29, - 'ptgRefErr' => 0x2A, - 'ptgAreaErr' => 0x2B, - 'ptgRefN' => 0x2C, - 'ptgAreaN' => 0x2D, - 'ptgMemAreaN' => 0x2E, - 'ptgMemNoMemN' => 0x2F, - 'ptgNameX' => 0x39, - 'ptgRef3d' => 0x3A, - 'ptgArea3d' => 0x3B, - 'ptgRefErr3d' => 0x3C, - 'ptgAreaErr3d' => 0x3D, - 'ptgArrayV' => 0x40, - 'ptgFuncV' => 0x41, - 'ptgFuncVarV' => 0x42, - 'ptgNameV' => 0x43, - 'ptgRefV' => 0x44, - 'ptgAreaV' => 0x45, - 'ptgMemAreaV' => 0x46, - 'ptgMemErrV' => 0x47, - 'ptgMemNoMemV' => 0x48, - 'ptgMemFuncV' => 0x49, - 'ptgRefErrV' => 0x4A, - 'ptgAreaErrV' => 0x4B, - 'ptgRefNV' => 0x4C, - 'ptgAreaNV' => 0x4D, - 'ptgMemAreaNV' => 0x4E, - 'ptgMemNoMemNV' => 0x4F, - 'ptgFuncCEV' => 0x58, - 'ptgNameXV' => 0x59, - 'ptgRef3dV' => 0x5A, - 'ptgArea3dV' => 0x5B, - 'ptgRefErr3dV' => 0x5C, - 'ptgAreaErr3dV' => 0x5D, - 'ptgArrayA' => 0x60, - 'ptgFuncA' => 0x61, - 'ptgFuncVarA' => 0x62, - 'ptgNameA' => 0x63, - 'ptgRefA' => 0x64, - 'ptgAreaA' => 0x65, - 'ptgMemAreaA' => 0x66, - 'ptgMemErrA' => 0x67, - 'ptgMemNoMemA' => 0x68, - 'ptgMemFuncA' => 0x69, - 'ptgRefErrA' => 0x6A, - 'ptgAreaErrA' => 0x6B, - 'ptgRefNA' => 0x6C, - 'ptgAreaNA' => 0x6D, - 'ptgMemAreaNA' => 0x6E, - 'ptgMemNoMemNA' => 0x6F, - 'ptgFuncCEA' => 0x78, - 'ptgNameXA' => 0x79, - 'ptgRef3dA' => 0x7A, - 'ptgArea3dA' => 0x7B, - 'ptgRefErr3dA' => 0x7C, - 'ptgAreaErr3dA' => 0x7D, - ]; - - /** - * Thanks to Michael Meeks and Gnumeric for the initial arg values. - * - * The following hash was generated by "function_locale.pl" in the distro. - * Refer to function_locale.pl for non-English function names. - * - * The array elements are as follow: - * ptg: The Excel function ptg code. - * args: The number of arguments that the function takes: - * >=0 is a fixed number of arguments. - * -1 is a variable number of arguments. - * class: The reference, value or array class of the function args. - * vol: The function is volatile. - * - * @var array - */ - private $functions = [ - // function ptg args class vol - 'COUNT' => [0, -1, 0, 0], - 'IF' => [1, -1, 1, 0], - 'ISNA' => [2, 1, 1, 0], - 'ISERROR' => [3, 1, 1, 0], - 'SUM' => [4, -1, 0, 0], - 'AVERAGE' => [5, -1, 0, 0], - 'MIN' => [6, -1, 0, 0], - 'MAX' => [7, -1, 0, 0], - 'ROW' => [8, -1, 0, 0], - 'COLUMN' => [9, -1, 0, 0], - 'NA' => [10, 0, 0, 0], - 'NPV' => [11, -1, 1, 0], - 'STDEV' => [12, -1, 0, 0], - 'DOLLAR' => [13, -1, 1, 0], - 'FIXED' => [14, -1, 1, 0], - 'SIN' => [15, 1, 1, 0], - 'COS' => [16, 1, 1, 0], - 'TAN' => [17, 1, 1, 0], - 'ATAN' => [18, 1, 1, 0], - 'PI' => [19, 0, 1, 0], - 'SQRT' => [20, 1, 1, 0], - 'EXP' => [21, 1, 1, 0], - 'LN' => [22, 1, 1, 0], - 'LOG10' => [23, 1, 1, 0], - 'ABS' => [24, 1, 1, 0], - 'INT' => [25, 1, 1, 0], - 'SIGN' => [26, 1, 1, 0], - 'ROUND' => [27, 2, 1, 0], - 'LOOKUP' => [28, -1, 0, 0], - 'INDEX' => [29, -1, 0, 1], - 'REPT' => [30, 2, 1, 0], - 'MID' => [31, 3, 1, 0], - 'LEN' => [32, 1, 1, 0], - 'VALUE' => [33, 1, 1, 0], - 'TRUE' => [34, 0, 1, 0], - 'FALSE' => [35, 0, 1, 0], - 'AND' => [36, -1, 0, 0], - 'OR' => [37, -1, 0, 0], - 'NOT' => [38, 1, 1, 0], - 'MOD' => [39, 2, 1, 0], - 'DCOUNT' => [40, 3, 0, 0], - 'DSUM' => [41, 3, 0, 0], - 'DAVERAGE' => [42, 3, 0, 0], - 'DMIN' => [43, 3, 0, 0], - 'DMAX' => [44, 3, 0, 0], - 'DSTDEV' => [45, 3, 0, 0], - 'VAR' => [46, -1, 0, 0], - 'DVAR' => [47, 3, 0, 0], - 'TEXT' => [48, 2, 1, 0], - 'LINEST' => [49, -1, 0, 0], - 'TREND' => [50, -1, 0, 0], - 'LOGEST' => [51, -1, 0, 0], - 'GROWTH' => [52, -1, 0, 0], - 'PV' => [56, -1, 1, 0], - 'FV' => [57, -1, 1, 0], - 'NPER' => [58, -1, 1, 0], - 'PMT' => [59, -1, 1, 0], - 'RATE' => [60, -1, 1, 0], - 'MIRR' => [61, 3, 0, 0], - 'IRR' => [62, -1, 0, 0], - 'RAND' => [63, 0, 1, 1], - 'MATCH' => [64, -1, 0, 0], - 'DATE' => [65, 3, 1, 0], - 'TIME' => [66, 3, 1, 0], - 'DAY' => [67, 1, 1, 0], - 'MONTH' => [68, 1, 1, 0], - 'YEAR' => [69, 1, 1, 0], - 'WEEKDAY' => [70, -1, 1, 0], - 'HOUR' => [71, 1, 1, 0], - 'MINUTE' => [72, 1, 1, 0], - 'SECOND' => [73, 1, 1, 0], - 'NOW' => [74, 0, 1, 1], - 'AREAS' => [75, 1, 0, 1], - 'ROWS' => [76, 1, 0, 1], - 'COLUMNS' => [77, 1, 0, 1], - 'OFFSET' => [78, -1, 0, 1], - 'SEARCH' => [82, -1, 1, 0], - 'TRANSPOSE' => [83, 1, 1, 0], - 'TYPE' => [86, 1, 1, 0], - 'ATAN2' => [97, 2, 1, 0], - 'ASIN' => [98, 1, 1, 0], - 'ACOS' => [99, 1, 1, 0], - 'CHOOSE' => [100, -1, 1, 0], - 'HLOOKUP' => [101, -1, 0, 0], - 'VLOOKUP' => [102, -1, 0, 0], - 'ISREF' => [105, 1, 0, 0], - 'LOG' => [109, -1, 1, 0], - 'CHAR' => [111, 1, 1, 0], - 'LOWER' => [112, 1, 1, 0], - 'UPPER' => [113, 1, 1, 0], - 'PROPER' => [114, 1, 1, 0], - 'LEFT' => [115, -1, 1, 0], - 'RIGHT' => [116, -1, 1, 0], - 'EXACT' => [117, 2, 1, 0], - 'TRIM' => [118, 1, 1, 0], - 'REPLACE' => [119, 4, 1, 0], - 'SUBSTITUTE' => [120, -1, 1, 0], - 'CODE' => [121, 1, 1, 0], - 'FIND' => [124, -1, 1, 0], - 'CELL' => [125, -1, 0, 1], - 'ISERR' => [126, 1, 1, 0], - 'ISTEXT' => [127, 1, 1, 0], - 'ISNUMBER' => [128, 1, 1, 0], - 'ISBLANK' => [129, 1, 1, 0], - 'T' => [130, 1, 0, 0], - 'N' => [131, 1, 0, 0], - 'DATEVALUE' => [140, 1, 1, 0], - 'TIMEVALUE' => [141, 1, 1, 0], - 'SLN' => [142, 3, 1, 0], - 'SYD' => [143, 4, 1, 0], - 'DDB' => [144, -1, 1, 0], - 'INDIRECT' => [148, -1, 1, 1], - 'CALL' => [150, -1, 1, 0], - 'CLEAN' => [162, 1, 1, 0], - 'MDETERM' => [163, 1, 2, 0], - 'MINVERSE' => [164, 1, 2, 0], - 'MMULT' => [165, 2, 2, 0], - 'IPMT' => [167, -1, 1, 0], - 'PPMT' => [168, -1, 1, 0], - 'COUNTA' => [169, -1, 0, 0], - 'PRODUCT' => [183, -1, 0, 0], - 'FACT' => [184, 1, 1, 0], - 'DPRODUCT' => [189, 3, 0, 0], - 'ISNONTEXT' => [190, 1, 1, 0], - 'STDEVP' => [193, -1, 0, 0], - 'VARP' => [194, -1, 0, 0], - 'DSTDEVP' => [195, 3, 0, 0], - 'DVARP' => [196, 3, 0, 0], - 'TRUNC' => [197, -1, 1, 0], - 'ISLOGICAL' => [198, 1, 1, 0], - 'DCOUNTA' => [199, 3, 0, 0], - 'USDOLLAR' => [204, -1, 1, 0], - 'FINDB' => [205, -1, 1, 0], - 'SEARCHB' => [206, -1, 1, 0], - 'REPLACEB' => [207, 4, 1, 0], - 'LEFTB' => [208, -1, 1, 0], - 'RIGHTB' => [209, -1, 1, 0], - 'MIDB' => [210, 3, 1, 0], - 'LENB' => [211, 1, 1, 0], - 'ROUNDUP' => [212, 2, 1, 0], - 'ROUNDDOWN' => [213, 2, 1, 0], - 'ASC' => [214, 1, 1, 0], - 'DBCS' => [215, 1, 1, 0], - 'RANK' => [216, -1, 0, 0], - 'ADDRESS' => [219, -1, 1, 0], - 'DAYS360' => [220, -1, 1, 0], - 'TODAY' => [221, 0, 1, 1], - 'VDB' => [222, -1, 1, 0], - 'MEDIAN' => [227, -1, 0, 0], - 'SUMPRODUCT' => [228, -1, 2, 0], - 'SINH' => [229, 1, 1, 0], - 'COSH' => [230, 1, 1, 0], - 'TANH' => [231, 1, 1, 0], - 'ASINH' => [232, 1, 1, 0], - 'ACOSH' => [233, 1, 1, 0], - 'ATANH' => [234, 1, 1, 0], - 'DGET' => [235, 3, 0, 0], - 'INFO' => [244, 1, 1, 1], - 'DB' => [247, -1, 1, 0], - 'FREQUENCY' => [252, 2, 0, 0], - 'ERROR.TYPE' => [261, 1, 1, 0], - 'REGISTER.ID' => [267, -1, 1, 0], - 'AVEDEV' => [269, -1, 0, 0], - 'BETADIST' => [270, -1, 1, 0], - 'GAMMALN' => [271, 1, 1, 0], - 'BETAINV' => [272, -1, 1, 0], - 'BINOMDIST' => [273, 4, 1, 0], - 'CHIDIST' => [274, 2, 1, 0], - 'CHIINV' => [275, 2, 1, 0], - 'COMBIN' => [276, 2, 1, 0], - 'CONFIDENCE' => [277, 3, 1, 0], - 'CRITBINOM' => [278, 3, 1, 0], - 'EVEN' => [279, 1, 1, 0], - 'EXPONDIST' => [280, 3, 1, 0], - 'FDIST' => [281, 3, 1, 0], - 'FINV' => [282, 3, 1, 0], - 'FISHER' => [283, 1, 1, 0], - 'FISHERINV' => [284, 1, 1, 0], - 'FLOOR' => [285, 2, 1, 0], - 'GAMMADIST' => [286, 4, 1, 0], - 'GAMMAINV' => [287, 3, 1, 0], - 'CEILING' => [288, 2, 1, 0], - 'HYPGEOMDIST' => [289, 4, 1, 0], - 'LOGNORMDIST' => [290, 3, 1, 0], - 'LOGINV' => [291, 3, 1, 0], - 'NEGBINOMDIST' => [292, 3, 1, 0], - 'NORMDIST' => [293, 4, 1, 0], - 'NORMSDIST' => [294, 1, 1, 0], - 'NORMINV' => [295, 3, 1, 0], - 'NORMSINV' => [296, 1, 1, 0], - 'STANDARDIZE' => [297, 3, 1, 0], - 'ODD' => [298, 1, 1, 0], - 'PERMUT' => [299, 2, 1, 0], - 'POISSON' => [300, 3, 1, 0], - 'TDIST' => [301, 3, 1, 0], - 'WEIBULL' => [302, 4, 1, 0], - 'SUMXMY2' => [303, 2, 2, 0], - 'SUMX2MY2' => [304, 2, 2, 0], - 'SUMX2PY2' => [305, 2, 2, 0], - 'CHITEST' => [306, 2, 2, 0], - 'CORREL' => [307, 2, 2, 0], - 'COVAR' => [308, 2, 2, 0], - 'FORECAST' => [309, 3, 2, 0], - 'FTEST' => [310, 2, 2, 0], - 'INTERCEPT' => [311, 2, 2, 0], - 'PEARSON' => [312, 2, 2, 0], - 'RSQ' => [313, 2, 2, 0], - 'STEYX' => [314, 2, 2, 0], - 'SLOPE' => [315, 2, 2, 0], - 'TTEST' => [316, 4, 2, 0], - 'PROB' => [317, -1, 2, 0], - 'DEVSQ' => [318, -1, 0, 0], - 'GEOMEAN' => [319, -1, 0, 0], - 'HARMEAN' => [320, -1, 0, 0], - 'SUMSQ' => [321, -1, 0, 0], - 'KURT' => [322, -1, 0, 0], - 'SKEW' => [323, -1, 0, 0], - 'ZTEST' => [324, -1, 0, 0], - 'LARGE' => [325, 2, 0, 0], - 'SMALL' => [326, 2, 0, 0], - 'QUARTILE' => [327, 2, 0, 0], - 'PERCENTILE' => [328, 2, 0, 0], - 'PERCENTRANK' => [329, -1, 0, 0], - 'MODE' => [330, -1, 2, 0], - 'TRIMMEAN' => [331, 2, 0, 0], - 'TINV' => [332, 2, 1, 0], - 'CONCATENATE' => [336, -1, 1, 0], - 'POWER' => [337, 2, 1, 0], - 'RADIANS' => [342, 1, 1, 0], - 'DEGREES' => [343, 1, 1, 0], - 'SUBTOTAL' => [344, -1, 0, 0], - 'SUMIF' => [345, -1, 0, 0], - 'COUNTIF' => [346, 2, 0, 0], - 'COUNTBLANK' => [347, 1, 0, 0], - 'ISPMT' => [350, 4, 1, 0], - 'DATEDIF' => [351, 3, 1, 0], - 'DATESTRING' => [352, 1, 1, 0], - 'NUMBERSTRING' => [353, 2, 1, 0], - 'ROMAN' => [354, -1, 1, 0], - 'GETPIVOTDATA' => [358, -1, 0, 0], - 'HYPERLINK' => [359, -1, 1, 0], - 'PHONETIC' => [360, 1, 0, 0], - 'AVERAGEA' => [361, -1, 0, 0], - 'MAXA' => [362, -1, 0, 0], - 'MINA' => [363, -1, 0, 0], - 'STDEVPA' => [364, -1, 0, 0], - 'VARPA' => [365, -1, 0, 0], - 'STDEVA' => [366, -1, 0, 0], - 'VARA' => [367, -1, 0, 0], - 'BAHTTEXT' => [368, 1, 0, 0], - ]; - - private $spreadsheet; - - /** - * The class constructor. - */ - public function __construct(Spreadsheet $spreadsheet) - { - $this->spreadsheet = $spreadsheet; - - $this->currentCharacter = 0; - $this->currentToken = ''; // The token we are working on. - $this->formula = ''; // The formula to parse. - $this->lookAhead = ''; // The character ahead of the current char. - $this->parseTree = ''; // The parse tree to be generated. - $this->externalSheets = []; - $this->references = []; - } - - /** - * Convert a token to the proper ptg value. - * - * @param mixed $token the token to convert - * - * @return mixed the converted token on success - */ - private function convert($token) - { - if (preg_match('/"([^"]|""){0,255}"/', $token)) { - return $this->convertString($token); - } elseif (is_numeric($token)) { - return $this->convertNumber($token); - // match references like A1 or $A$1 - } elseif (preg_match('/^\$?([A-Ia-i]?[A-Za-z])\$?(\d+)$/', $token)) { - return $this->convertRef2d($token); - // match external references like Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1 - } elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\\!\$?[A-Ia-i]?[A-Za-z]\$?(\\d+)$/u', $token)) { - return $this->convertRef3d($token); - // match external references like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1 - } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . '(\\:' . self::REGEX_SHEET_TITLE_QUOTED . ")?'\\!\\$?[A-Ia-i]?[A-Za-z]\\$?(\\d+)$/u", $token)) { - return $this->convertRef3d($token); - // match ranges like A1:B2 or $A$1:$B$2 - } elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\:(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/', $token)) { - return $this->convertRange2d($token); - // match external ranges like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2 - } elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\\!\$?([A-Ia-i]?[A-Za-z])?\$?(\\d+)\\:\$?([A-Ia-i]?[A-Za-z])?\$?(\\d+)$/u', $token)) { - return $this->convertRange3d($token); - // match external ranges like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2 - } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . '(\\:' . self::REGEX_SHEET_TITLE_QUOTED . ")?'\\!\\$?([A-Ia-i]?[A-Za-z])?\\$?(\\d+)\\:\\$?([A-Ia-i]?[A-Za-z])?\\$?(\\d+)$/u", $token)) { - return $this->convertRange3d($token); - // operators (including parentheses) - } elseif (isset($this->ptg[$token])) { - return pack('C', $this->ptg[$token]); - // match error codes - } elseif (preg_match('/^#[A-Z0\\/]{3,5}[!?]{1}$/', $token) || $token == '#N/A') { - return $this->convertError($token); - } elseif (preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/mui', $token) && $this->spreadsheet->getDefinedName($token) !== null) { - return $this->convertDefinedName($token); - // commented so argument number can be processed correctly. See toReversePolish(). - /*elseif (preg_match("/[A-Z0-9\xc0-\xdc\.]+/", $token)) - { - return($this->convertFunction($token, $this->_func_args)); - }*/ - // if it's an argument, ignore the token (the argument remains) - } elseif ($token == 'arg') { - return ''; - } - - // TODO: use real error codes - throw new WriterException("Unknown token $token"); - } - - /** - * Convert a number token to ptgInt or ptgNum. - * - * @param mixed $num an integer or double for conversion to its ptg value - * - * @return string - */ - private function convertNumber($num) - { - // Integer in the range 0..2**16-1 - if ((preg_match('/^\\d+$/', $num)) && ($num <= 65535)) { - return pack('Cv', $this->ptg['ptgInt'], $num); - } - - // A float - if (BIFFwriter::getByteOrder()) { // if it's Big Endian - $num = strrev($num); - } - - return pack('Cd', $this->ptg['ptgNum'], $num); - } - - /** - * Convert a string token to ptgStr. - * - * @param string $string a string for conversion to its ptg value - * - * @return mixed the converted token on success - */ - private function convertString($string) - { - // chop away beggining and ending quotes - $string = substr($string, 1, -1); - if (strlen($string) > 255) { - throw new WriterException('String is too long'); - } - - return pack('C', $this->ptg['ptgStr']) . StringHelper::UTF8toBIFF8UnicodeShort($string); - } - - /** - * Convert a function to a ptgFunc or ptgFuncVarV depending on the number of - * args that it takes. - * - * @param string $token the name of the function for convertion to ptg value - * @param int $num_args the number of arguments the function receives - * - * @return string The packed ptg for the function - */ - private function convertFunction($token, $num_args) - { - $args = $this->functions[$token][1]; - - // Fixed number of args eg. TIME($i, $j, $k). - if ($args >= 0) { - return pack('Cv', $this->ptg['ptgFuncV'], $this->functions[$token][0]); - } - // Variable number of args eg. SUM($i, $j, $k, ..). - if ($args == -1) { - return pack('CCv', $this->ptg['ptgFuncVarV'], $num_args, $this->functions[$token][0]); - } - } - - /** - * Convert an Excel range such as A1:D4 to a ptgRefV. - * - * @param string $range An Excel range in the A1:A2 - * @param int $class - * - * @return string - */ - private function convertRange2d($range, $class = 0) - { - // TODO: possible class value 0,1,2 check Formula.pm - // Split the range into 2 cell refs - if (preg_match('/^(\$)?([A-Ia-i]?[A-Za-z])(\$)?(\d+)\:(\$)?([A-Ia-i]?[A-Za-z])(\$)?(\d+)$/', $range)) { - [$cell1, $cell2] = explode(':', $range); - } else { - // TODO: use real error codes - throw new WriterException('Unknown range separator'); - } - - // Convert the cell references - [$row1, $col1] = $this->cellToPackedRowcol($cell1); - [$row2, $col2] = $this->cellToPackedRowcol($cell2); - - // The ptg value depends on the class of the ptg. - if ($class == 0) { - $ptgArea = pack('C', $this->ptg['ptgArea']); - } elseif ($class == 1) { - $ptgArea = pack('C', $this->ptg['ptgAreaV']); - } elseif ($class == 2) { - $ptgArea = pack('C', $this->ptg['ptgAreaA']); - } else { - // TODO: use real error codes - throw new WriterException("Unknown class $class"); - } - - return $ptgArea . $row1 . $row2 . $col1 . $col2; - } - - /** - * Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to - * a ptgArea3d. - * - * @param string $token an Excel range in the Sheet1!A1:A2 format - * - * @return mixed the packed ptgArea3d token on success - */ - private function convertRange3d($token) - { - // Split the ref at the ! symbol - [$ext_ref, $range] = PhpspreadsheetWorksheet::extractSheetTitle($token, true); - - // Convert the external reference part (different for BIFF8) - $ext_ref = $this->getRefIndex($ext_ref); - - // Split the range into 2 cell refs - [$cell1, $cell2] = explode(':', $range); - - // Convert the cell references - if (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\\d+)$/', $cell1)) { - [$row1, $col1] = $this->cellToPackedRowcol($cell1); - [$row2, $col2] = $this->cellToPackedRowcol($cell2); - } else { // It's a rows range (like 26:27) - [$row1, $col1, $row2, $col2] = $this->rangeToPackedRange($cell1 . ':' . $cell2); - } - - // The ptg value depends on the class of the ptg. - $ptgArea = pack('C', $this->ptg['ptgArea3d']); - - return $ptgArea . $ext_ref . $row1 . $row2 . $col1 . $col2; - } - - /** - * Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV. - * - * @param string $cell An Excel cell reference - * - * @return string The cell in packed() format with the corresponding ptg - */ - private function convertRef2d($cell) - { - // Convert the cell reference - $cell_array = $this->cellToPackedRowcol($cell); - [$row, $col] = $cell_array; - - // The ptg value depends on the class of the ptg. - $ptgRef = pack('C', $this->ptg['ptgRefA']); - - return $ptgRef . $row . $col; - } - - /** - * Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a - * ptgRef3d. - * - * @param string $cell An Excel cell reference - * - * @return mixed the packed ptgRef3d token on success - */ - private function convertRef3d($cell) - { - // Split the ref at the ! symbol - [$ext_ref, $cell] = PhpspreadsheetWorksheet::extractSheetTitle($cell, true); - - // Convert the external reference part (different for BIFF8) - $ext_ref = $this->getRefIndex($ext_ref); - - // Convert the cell reference part - [$row, $col] = $this->cellToPackedRowcol($cell); - - // The ptg value depends on the class of the ptg. - $ptgRef = pack('C', $this->ptg['ptgRef3dA']); - - return $ptgRef . $ext_ref . $row . $col; - } - - /** - * Convert an error code to a ptgErr. - * - * @param string $errorCode The error code for conversion to its ptg value - * - * @return string The error code ptgErr - */ - private function convertError($errorCode) - { - switch ($errorCode) { - case '#NULL!': - return pack('C', 0x00); - case '#DIV/0!': - return pack('C', 0x07); - case '#VALUE!': - return pack('C', 0x0F); - case '#REF!': - return pack('C', 0x17); - case '#NAME?': - return pack('C', 0x1D); - case '#NUM!': - return pack('C', 0x24); - case '#N/A': - return pack('C', 0x2A); - } - - return pack('C', 0xFF); - } - - private function convertDefinedName(string $name): void - { - if (strlen($name) > 255) { - throw new WriterException('Defined Name is too long'); - } - - $nameReference = 1; - foreach ($this->spreadsheet->getDefinedNames() as $definedName) { - if ($name === $definedName->getName()) { - break; - } - ++$nameReference; - } - - $ptgRef = pack('Cvxx', $this->ptg['ptgName'], $nameReference); - - throw new WriterException('Cannot yet write formulae with defined names to Xls'); -// return $ptgRef; - } - - /** - * Look up the REF index that corresponds to an external sheet name - * (or range). If it doesn't exist yet add it to the workbook's references - * array. It assumes all sheet names given must exist. - * - * @param string $ext_ref The name of the external reference - * - * @return mixed The reference index in packed() format on success - */ - private function getRefIndex($ext_ref) - { - $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. - $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. - $ext_ref = str_replace('\'\'', '\'', $ext_ref); // Replace escaped '' with ' - - // Check if there is a sheet range eg., Sheet1:Sheet2. - if (preg_match('/:/', $ext_ref)) { - [$sheet_name1, $sheet_name2] = explode(':', $ext_ref); - - $sheet1 = $this->getSheetIndex($sheet_name1); - if ($sheet1 == -1) { - throw new WriterException("Unknown sheet name $sheet_name1 in formula"); - } - $sheet2 = $this->getSheetIndex($sheet_name2); - if ($sheet2 == -1) { - throw new WriterException("Unknown sheet name $sheet_name2 in formula"); - } - - // Reverse max and min sheet numbers if necessary - if ($sheet1 > $sheet2) { - [$sheet1, $sheet2] = [$sheet2, $sheet1]; - } - } else { // Single sheet name only. - $sheet1 = $this->getSheetIndex($ext_ref); - if ($sheet1 == -1) { - throw new WriterException("Unknown sheet name $ext_ref in formula"); - } - $sheet2 = $sheet1; - } - - // assume all references belong to this document - $supbook_index = 0x00; - $ref = pack('vvv', $supbook_index, $sheet1, $sheet2); - $totalreferences = count($this->references); - $index = -1; - for ($i = 0; $i < $totalreferences; ++$i) { - if ($ref == $this->references[$i]) { - $index = $i; - - break; - } - } - // if REF was not found add it to references array - if ($index == -1) { - $this->references[$totalreferences] = $ref; - $index = $totalreferences; - } - - return pack('v', $index); - } - - /** - * Look up the index that corresponds to an external sheet name. The hash of - * sheet names is updated by the addworksheet() method of the - * \PhpOffice\PhpSpreadsheet\Writer\Xls\Workbook class. - * - * @param string $sheet_name Sheet name - * - * @return int The sheet index, -1 if the sheet was not found - */ - private function getSheetIndex($sheet_name) - { - if (!isset($this->externalSheets[$sheet_name])) { - return -1; - } - - return $this->externalSheets[$sheet_name]; - } - - /** - * This method is used to update the array of sheet names. It is - * called by the addWorksheet() method of the - * \PhpOffice\PhpSpreadsheet\Writer\Xls\Workbook class. - * - * @see \PhpOffice\PhpSpreadsheet\Writer\Xls\Workbook::addWorksheet() - * - * @param string $name The name of the worksheet being added - * @param int $index The index of the worksheet being added - */ - public function setExtSheet($name, $index): void - { - $this->externalSheets[$name] = $index; - } - - /** - * pack() row and column into the required 3 or 4 byte format. - * - * @param string $cell The Excel cell reference to be packed - * - * @return array Array containing the row and column in packed() format - */ - private function cellToPackedRowcol($cell) - { - $cell = strtoupper($cell); - [$row, $col, $row_rel, $col_rel] = $this->cellToRowcol($cell); - if ($col >= 256) { - throw new WriterException("Column in: $cell greater than 255"); - } - if ($row >= 65536) { - throw new WriterException("Row in: $cell greater than 65536 "); - } - - // Set the high bits to indicate if row or col are relative. - $col |= $col_rel << 14; - $col |= $row_rel << 15; - $col = pack('v', $col); - - $row = pack('v', $row); - - return [$row, $col]; - } - - /** - * pack() row range into the required 3 or 4 byte format. - * Just using maximum col/rows, which is probably not the correct solution. - * - * @param string $range The Excel range to be packed - * - * @return array Array containing (row1,col1,row2,col2) in packed() format - */ - private function rangeToPackedRange($range) - { - preg_match('/(\$)?(\d+)\:(\$)?(\d+)/', $range, $match); - // return absolute rows if there is a $ in the ref - $row1_rel = empty($match[1]) ? 1 : 0; - $row1 = $match[2]; - $row2_rel = empty($match[3]) ? 1 : 0; - $row2 = $match[4]; - // Convert 1-index to zero-index - --$row1; - --$row2; - // Trick poor inocent Excel - $col1 = 0; - $col2 = 65535; // FIXME: maximum possible value for Excel 5 (change this!!!) - - // FIXME: this changes for BIFF8 - if (($row1 >= 65536) || ($row2 >= 65536)) { - throw new WriterException("Row in: $range greater than 65536 "); - } - - // Set the high bits to indicate if rows are relative. - $col1 |= $row1_rel << 15; - $col2 |= $row2_rel << 15; - $col1 = pack('v', $col1); - $col2 = pack('v', $col2); - - $row1 = pack('v', $row1); - $row2 = pack('v', $row2); - - return [$row1, $col1, $row2, $col2]; - } - - /** - * Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero - * indexed row and column number. Also returns two (0,1) values to indicate - * whether the row or column are relative references. - * - * @param string $cell the Excel cell reference in A1 format - * - * @return array - */ - private function cellToRowcol($cell) - { - preg_match('/(\$)?([A-I]?[A-Z])(\$)?(\d+)/', $cell, $match); - // return absolute column if there is a $ in the ref - $col_rel = empty($match[1]) ? 1 : 0; - $col_ref = $match[2]; - $row_rel = empty($match[3]) ? 1 : 0; - $row = $match[4]; - - // Convert base26 column string to a number. - $expn = strlen($col_ref) - 1; - $col = 0; - $col_ref_length = strlen($col_ref); - for ($i = 0; $i < $col_ref_length; ++$i) { - $col += (ord($col_ref[$i]) - 64) * 26 ** $expn; - --$expn; - } - - // Convert 1-index to zero-index - --$row; - --$col; - - return [$row, $col, $row_rel, $col_rel]; - } - - /** - * Advance to the next valid token. - */ - private function advance() - { - $i = $this->currentCharacter; - $formula_length = strlen($this->formula); - // eat up white spaces - if ($i < $formula_length) { - while ($this->formula[$i] == ' ') { - ++$i; - } - - if ($i < ($formula_length - 1)) { - $this->lookAhead = $this->formula[$i + 1]; - } - $token = ''; - } - - while ($i < $formula_length) { - $token .= $this->formula[$i]; - - if ($i < ($formula_length - 1)) { - $this->lookAhead = $this->formula[$i + 1]; - } else { - $this->lookAhead = ''; - } - - if ($this->match($token) != '') { - $this->currentCharacter = $i + 1; - $this->currentToken = $token; - - return 1; - } - - if ($i < ($formula_length - 2)) { - $this->lookAhead = $this->formula[$i + 2]; - } else { // if we run out of characters lookAhead becomes empty - $this->lookAhead = ''; - } - ++$i; - } - //die("Lexical error ".$this->currentCharacter); - } - - /** - * Checks if it's a valid token. - * - * @param mixed $token the token to check - * - * @return mixed The checked token or false on failure - */ - private function match($token) - { - switch ($token) { - case '+': - case '-': - case '*': - case '/': - case '(': - case ')': - case ',': - case ';': - case '>=': - case '<=': - case '=': - case '<>': - case '^': - case '&': - case '%': - return $token; - - break; - case '>': - if ($this->lookAhead === '=') { // it's a GE token - break; - } - - return $token; - - break; - case '<': - // it's a LE or a NE token - if (($this->lookAhead === '=') || ($this->lookAhead === '>')) { - break; - } - - return $token; - - break; - default: - // if it's a reference A1 or $A$1 or $A1 or A$1 - if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?\d+$/', $token) && !preg_match('/\d/', $this->lookAhead) && ($this->lookAhead !== ':') && ($this->lookAhead !== '.') && ($this->lookAhead !== '!')) { - return $token; - } elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\\!\$?[A-Ia-i]?[A-Za-z]\$?\\d+$/u', $token) && !preg_match('/\d/', $this->lookAhead) && ($this->lookAhead !== ':') && ($this->lookAhead !== '.')) { - // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1) - return $token; - } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . '(\\:' . self::REGEX_SHEET_TITLE_QUOTED . ")?'\\!\\$?[A-Ia-i]?[A-Za-z]\\$?\\d+$/u", $token) && !preg_match('/\d/', $this->lookAhead) && ($this->lookAhead !== ':') && ($this->lookAhead !== '.')) { - // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1) - return $token; - } elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+:(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+$/', $token) && !preg_match('/\d/', $this->lookAhead)) { - // if it's a range A1:A2 or $A$1:$A$2 - return $token; - } elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\\!\$?([A-Ia-i]?[A-Za-z])?\$?\\d+:\$?([A-Ia-i]?[A-Za-z])?\$?\\d+$/u', $token) && !preg_match('/\d/', $this->lookAhead)) { - // If it's an external range like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2 - return $token; - } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . '(\\:' . self::REGEX_SHEET_TITLE_QUOTED . ")?'\\!\\$?([A-Ia-i]?[A-Za-z])?\\$?\\d+:\\$?([A-Ia-i]?[A-Za-z])?\\$?\\d+$/u", $token) && !preg_match('/\d/', $this->lookAhead)) { - // If it's an external range like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2 - return $token; - } elseif (is_numeric($token) && (!is_numeric($token . $this->lookAhead) || ($this->lookAhead == '')) && ($this->lookAhead !== '!') && ($this->lookAhead !== ':')) { - // If it's a number (check that it's not a sheet name or range) - return $token; - } elseif (preg_match('/"([^"]|""){0,255}"/', $token) && $this->lookAhead !== '"' && (substr_count($token, '"') % 2 == 0)) { - // If it's a string (of maximum 255 characters) - return $token; - } elseif (preg_match('/^#[A-Z0\\/]{3,5}[!?]{1}$/', $token) || $token === '#N/A') { - // If it's an error code - return $token; - } elseif (preg_match("/^[A-Z0-9\xc0-\xdc\\.]+$/i", $token) && ($this->lookAhead === '(')) { - // if it's a function call - return $token; - } elseif (preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/miu', $token) && $this->spreadsheet->getDefinedName($token) !== null) { - return $token; - } elseif (substr($token, -1) === ')') { - // It's an argument of some description (e.g. a named range), - // precise nature yet to be determined - return $token; - } - - return ''; - } - } - - /** - * The parsing method. It parses a formula. - * - * @param string $formula the formula to parse, without the initial equal - * sign (=) - * - * @return mixed true on success - */ - public function parse($formula) - { - $this->currentCharacter = 0; - $this->formula = (string) $formula; - $this->lookAhead = $formula[1] ?? ''; - $this->advance(); - $this->parseTree = $this->condition(); - - return true; - } - - /** - * It parses a condition. It assumes the following rule: - * Cond -> Expr [(">" | "<") Expr]. - * - * @return mixed The parsed ptg'd tree on success - */ - private function condition() - { - $result = $this->expression(); - if ($this->currentToken == '<') { - $this->advance(); - $result2 = $this->expression(); - $result = $this->createTree('ptgLT', $result, $result2); - } elseif ($this->currentToken == '>') { - $this->advance(); - $result2 = $this->expression(); - $result = $this->createTree('ptgGT', $result, $result2); - } elseif ($this->currentToken == '<=') { - $this->advance(); - $result2 = $this->expression(); - $result = $this->createTree('ptgLE', $result, $result2); - } elseif ($this->currentToken == '>=') { - $this->advance(); - $result2 = $this->expression(); - $result = $this->createTree('ptgGE', $result, $result2); - } elseif ($this->currentToken == '=') { - $this->advance(); - $result2 = $this->expression(); - $result = $this->createTree('ptgEQ', $result, $result2); - } elseif ($this->currentToken == '<>') { - $this->advance(); - $result2 = $this->expression(); - $result = $this->createTree('ptgNE', $result, $result2); - } elseif ($this->currentToken == '&') { - $this->advance(); - $result2 = $this->expression(); - $result = $this->createTree('ptgConcat', $result, $result2); - } - - return $result; - } - - /** - * It parses a expression. It assumes the following rule: - * Expr -> Term [("+" | "-") Term] - * -> "string" - * -> "-" Term : Negative value - * -> "+" Term : Positive value - * -> Error code. - * - * @return mixed The parsed ptg'd tree on success - */ - private function expression() - { - // If it's a string return a string node - if (preg_match('/"([^"]|""){0,255}"/', $this->currentToken)) { - $tmp = str_replace('""', '"', $this->currentToken); - if (($tmp == '"') || ($tmp == '')) { - // Trap for "" that has been used for an empty string - $tmp = '""'; - } - $result = $this->createTree($tmp, '', ''); - $this->advance(); - - return $result; - // If it's an error code - } elseif (preg_match('/^#[A-Z0\\/]{3,5}[!?]{1}$/', $this->currentToken) || $this->currentToken == '#N/A') { - $result = $this->createTree($this->currentToken, 'ptgErr', ''); - $this->advance(); - - return $result; - // If it's a negative value - } elseif ($this->currentToken == '-') { - // catch "-" Term - $this->advance(); - $result2 = $this->expression(); - - return $this->createTree('ptgUminus', $result2, ''); - // If it's a positive value - } elseif ($this->currentToken == '+') { - // catch "+" Term - $this->advance(); - $result2 = $this->expression(); - - return $this->createTree('ptgUplus', $result2, ''); - } - $result = $this->term(); - while ( - ($this->currentToken == '+') || - ($this->currentToken == '-') || - ($this->currentToken == '^') - ) { - if ($this->currentToken == '+') { - $this->advance(); - $result2 = $this->term(); - $result = $this->createTree('ptgAdd', $result, $result2); - } elseif ($this->currentToken == '-') { - $this->advance(); - $result2 = $this->term(); - $result = $this->createTree('ptgSub', $result, $result2); - } else { - $this->advance(); - $result2 = $this->term(); - $result = $this->createTree('ptgPower', $result, $result2); - } - } - - return $result; - } - - /** - * This function just introduces a ptgParen element in the tree, so that Excel - * doesn't get confused when working with a parenthesized formula afterwards. - * - * @see fact() - * - * @return array The parsed ptg'd tree - */ - private function parenthesizedExpression() - { - return $this->createTree('ptgParen', $this->expression(), ''); - } - - /** - * It parses a term. It assumes the following rule: - * Term -> Fact [("*" | "/") Fact]. - * - * @return mixed The parsed ptg'd tree on success - */ - private function term() - { - $result = $this->fact(); - while ( - ($this->currentToken == '*') || - ($this->currentToken == '/') - ) { - if ($this->currentToken == '*') { - $this->advance(); - $result2 = $this->fact(); - $result = $this->createTree('ptgMul', $result, $result2); - } else { - $this->advance(); - $result2 = $this->fact(); - $result = $this->createTree('ptgDiv', $result, $result2); - } - } - - return $result; - } - - /** - * It parses a factor. It assumes the following rule: - * Fact -> ( Expr ) - * | CellRef - * | CellRange - * | Number - * | Function. - * - * @return mixed The parsed ptg'd tree on success - */ - private function fact() - { - if ($this->currentToken === '(') { - $this->advance(); // eat the "(" - $result = $this->parenthesizedExpression(); - if ($this->currentToken !== ')') { - throw new WriterException("')' token expected."); - } - $this->advance(); // eat the ")" - - return $result; - } - // if it's a reference - if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?\d+$/', $this->currentToken)) { - $result = $this->createTree($this->currentToken, '', ''); - $this->advance(); - - return $result; - } elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\\!\$?[A-Ia-i]?[A-Za-z]\$?\\d+$/u', $this->currentToken)) { - // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1) - $result = $this->createTree($this->currentToken, '', ''); - $this->advance(); - - return $result; - } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . '(\\:' . self::REGEX_SHEET_TITLE_QUOTED . ")?'\\!\\$?[A-Ia-i]?[A-Za-z]\\$?\\d+$/u", $this->currentToken)) { - // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1) - $result = $this->createTree($this->currentToken, '', ''); - $this->advance(); - - return $result; - } elseif ( - preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+:(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+$/', $this->currentToken) || - preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+$/', $this->currentToken) - ) { - // if it's a range A1:B2 or $A$1:$B$2 - // must be an error? - $result = $this->createTree($this->currentToken, '', ''); - $this->advance(); - - return $result; - } elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\\!\$?([A-Ia-i]?[A-Za-z])?\$?\\d+:\$?([A-Ia-i]?[A-Za-z])?\$?\\d+$/u', $this->currentToken)) { - // If it's an external range (Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2) - // must be an error? - $result = $this->createTree($this->currentToken, '', ''); - $this->advance(); - - return $result; - } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . '(\\:' . self::REGEX_SHEET_TITLE_QUOTED . ")?'\\!\\$?([A-Ia-i]?[A-Za-z])?\\$?\\d+:\\$?([A-Ia-i]?[A-Za-z])?\\$?\\d+$/u", $this->currentToken)) { - // If it's an external range ('Sheet1'!A1:B2 or 'Sheet1'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1'!$A$1:$B$2) - // must be an error? - $result = $this->createTree($this->currentToken, '', ''); - $this->advance(); - - return $result; - } elseif (is_numeric($this->currentToken)) { - // If it's a number or a percent - if ($this->lookAhead === '%') { - $result = $this->createTree('ptgPercent', $this->currentToken, ''); - $this->advance(); // Skip the percentage operator once we've pre-built that tree - } else { - $result = $this->createTree($this->currentToken, '', ''); - } - $this->advance(); - - return $result; - } elseif (preg_match("/^[A-Z0-9\xc0-\xdc\\.]+$/i", $this->currentToken) && ($this->lookAhead === '(')) { - // if it's a function call - return $this->func(); - } elseif (preg_match('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/miu', $this->currentToken) && $this->spreadsheet->getDefinedName($this->currentToken) !== null) { - $result = $this->createTree('ptgName', $this->currentToken, ''); - $this->advance(); - - return $result; - } - - throw new WriterException('Syntax error: ' . $this->currentToken . ', lookahead: ' . $this->lookAhead . ', current char: ' . $this->currentCharacter); - } - - /** - * It parses a function call. It assumes the following rule: - * Func -> ( Expr [,Expr]* ). - * - * @return mixed The parsed ptg'd tree on success - */ - private function func() - { - $num_args = 0; // number of arguments received - $function = strtoupper($this->currentToken); - $result = ''; // initialize result - $this->advance(); - $this->advance(); // eat the "(" - while ($this->currentToken !== ')') { - if ($num_args > 0) { - if ($this->currentToken === ',' || $this->currentToken === ';') { - $this->advance(); // eat the "," or ";" - } else { - throw new WriterException("Syntax error: comma expected in function $function, arg #{$num_args}"); - } - $result2 = $this->condition(); - $result = $this->createTree('arg', $result, $result2); - } else { // first argument - $result2 = $this->condition(); - $result = $this->createTree('arg', '', $result2); - } - ++$num_args; - } - if (!isset($this->functions[$function])) { - throw new WriterException("Function $function() doesn't exist"); - } - $args = $this->functions[$function][1]; - // If fixed number of args eg. TIME($i, $j, $k). Check that the number of args is valid. - if (($args >= 0) && ($args != $num_args)) { - throw new WriterException("Incorrect number of arguments in function $function() "); - } - - $result = $this->createTree($function, $result, $num_args); - $this->advance(); // eat the ")" - - return $result; - } - - /** - * Creates a tree. In fact an array which may have one or two arrays (sub-trees) - * as elements. - * - * @param mixed $value the value of this node - * @param mixed $left the left array (sub-tree) or a final node - * @param mixed $right the right array (sub-tree) or a final node - * - * @return array A tree - */ - private function createTree($value, $left, $right) - { - return ['value' => $value, 'left' => $left, 'right' => $right]; - } - - /** - * Builds a string containing the tree in reverse polish notation (What you - * would use in a HP calculator stack). - * The following tree:. - * - * + - * / \ - * 2 3 - * - * produces: "23+" - * - * The following tree: - * - * + - * / \ - * 3 * - * / \ - * 6 A1 - * - * produces: "36A1*+" - * - * In fact all operands, functions, references, etc... are written as ptg's - * - * @param array $tree the optional tree to convert - * - * @return string The tree in reverse polish notation - */ - public function toReversePolish($tree = []) - { - $polish = ''; // the string we are going to return - if (empty($tree)) { // If it's the first call use parseTree - $tree = $this->parseTree; - } - - if (is_array($tree['left'])) { - $converted_tree = $this->toReversePolish($tree['left']); - $polish .= $converted_tree; - } elseif ($tree['left'] != '') { // It's a final node - $converted_tree = $this->convert($tree['left']); - $polish .= $converted_tree; - } - if (is_array($tree['right'])) { - $converted_tree = $this->toReversePolish($tree['right']); - $polish .= $converted_tree; - } elseif ($tree['right'] != '') { // It's a final node - $converted_tree = $this->convert($tree['right']); - $polish .= $converted_tree; - } - // if it's a function convert it here (so we can set it's arguments) - if ( - preg_match("/^[A-Z0-9\xc0-\xdc\\.]+$/", $tree['value']) && - !preg_match('/^([A-Ia-i]?[A-Za-z])(\d+)$/', $tree['value']) && - !preg_match('/^[A-Ia-i]?[A-Za-z](\\d+)\\.\\.[A-Ia-i]?[A-Za-z](\\d+)$/', $tree['value']) && - !is_numeric($tree['value']) && - !isset($this->ptg[$tree['value']]) - ) { - // left subtree for a function is always an array. - if ($tree['left'] != '') { - $left_tree = $this->toReversePolish($tree['left']); - } else { - $left_tree = ''; - } - // add it's left subtree and return. - return $left_tree . $this->convertFunction($tree['value'], $tree['right']); - } - $converted_tree = $this->convert($tree['value']); - - return $polish . $converted_tree; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Workbook.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Workbook.php deleted file mode 100644 index f752bce..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Workbook.php +++ /dev/null @@ -1,1191 +0,0 @@ - -// * -// * The majority of this is _NOT_ my code. I simply ported it from the -// * PERL Spreadsheet::WriteExcel module. -// * -// * The author of the Spreadsheet::WriteExcel module is John McNamara -// * -// * -// * I _DO_ maintain this code, and John McNamara has nothing to do with the -// * porting of this code to PHP. Any questions directly related to this -// * class library should be directed to me. -// * -// * License Information: -// * -// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets -// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com -// * -// * This library is free software; you can redistribute it and/or -// * modify it under the terms of the GNU Lesser General Public -// * License as published by the Free Software Foundation; either -// * version 2.1 of the License, or (at your option) any later version. -// * -// * This library is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// * Lesser General Public License for more details. -// * -// * You should have received a copy of the GNU Lesser General Public -// * License along with this library; if not, write to the Free Software -// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// */ -class Workbook extends BIFFwriter -{ - /** - * Formula parser. - * - * @var \PhpOffice\PhpSpreadsheet\Writer\Xls\Parser - */ - private $parser; - - /** - * The BIFF file size for the workbook. - * - * @var int - * - * @see calcSheetOffsets() - */ - private $biffSize; - - /** - * XF Writers. - * - * @var \PhpOffice\PhpSpreadsheet\Writer\Xls\Xf[] - */ - private $xfWriters = []; - - /** - * Array containing the colour palette. - * - * @var array - */ - private $palette; - - /** - * The codepage indicates the text encoding used for strings. - * - * @var int - */ - private $codepage; - - /** - * The country code used for localization. - * - * @var int - */ - private $countryCode; - - /** - * Workbook. - * - * @var Spreadsheet - */ - private $spreadsheet; - - /** - * Fonts writers. - * - * @var Font[] - */ - private $fontWriters = []; - - /** - * Added fonts. Maps from font's hash => index in workbook. - * - * @var array - */ - private $addedFonts = []; - - /** - * Shared number formats. - * - * @var array - */ - private $numberFormats = []; - - /** - * Added number formats. Maps from numberFormat's hash => index in workbook. - * - * @var array - */ - private $addedNumberFormats = []; - - /** - * Sizes of the binary worksheet streams. - * - * @var array - */ - private $worksheetSizes = []; - - /** - * Offsets of the binary worksheet streams relative to the start of the global workbook stream. - * - * @var array - */ - private $worksheetOffsets = []; - - /** - * Total number of shared strings in workbook. - * - * @var int - */ - private $stringTotal; - - /** - * Number of unique shared strings in workbook. - * - * @var int - */ - private $stringUnique; - - /** - * Array of unique shared strings in workbook. - * - * @var array - */ - private $stringTable; - - /** - * Color cache. - */ - private $colors; - - /** - * Escher object corresponding to MSODRAWINGGROUP. - * - * @var \PhpOffice\PhpSpreadsheet\Shared\Escher - */ - private $escher; - - /** - * Class constructor. - * - * @param Spreadsheet $spreadsheet The Workbook - * @param int $str_total Total number of strings - * @param int $str_unique Total number of unique strings - * @param array $str_table String Table - * @param array $colors Colour Table - * @param Parser $parser The formula parser created for the Workbook - */ - public function __construct(Spreadsheet $spreadsheet, &$str_total, &$str_unique, &$str_table, &$colors, Parser $parser) - { - // It needs to call its parent's constructor explicitly - parent::__construct(); - - $this->parser = $parser; - $this->biffSize = 0; - $this->palette = []; - $this->countryCode = -1; - - $this->stringTotal = &$str_total; - $this->stringUnique = &$str_unique; - $this->stringTable = &$str_table; - $this->colors = &$colors; - $this->setPaletteXl97(); - - $this->spreadsheet = $spreadsheet; - - $this->codepage = 0x04B0; - - // Add empty sheets and Build color cache - $countSheets = $spreadsheet->getSheetCount(); - for ($i = 0; $i < $countSheets; ++$i) { - $phpSheet = $spreadsheet->getSheet($i); - - $this->parser->setExtSheet($phpSheet->getTitle(), $i); // Register worksheet name with parser - - $supbook_index = 0x00; - $ref = pack('vvv', $supbook_index, $i, $i); - $this->parser->references[] = $ref; // Register reference with parser - - // Sheet tab colors? - if ($phpSheet->isTabColorSet()) { - $this->addColor($phpSheet->getTabColor()->getRGB()); - } - } - } - - /** - * Add a new XF writer. - * - * @param bool $isStyleXf Is it a style XF? - * - * @return int Index to XF record - */ - public function addXfWriter(Style $style, $isStyleXf = false) - { - $xfWriter = new Xf($style); - $xfWriter->setIsStyleXf($isStyleXf); - - // Add the font if not already added - $fontIndex = $this->addFont($style->getFont()); - - // Assign the font index to the xf record - $xfWriter->setFontIndex($fontIndex); - - // Background colors, best to treat these after the font so black will come after white in custom palette - $xfWriter->setFgColor($this->addColor($style->getFill()->getStartColor()->getRGB())); - $xfWriter->setBgColor($this->addColor($style->getFill()->getEndColor()->getRGB())); - $xfWriter->setBottomColor($this->addColor($style->getBorders()->getBottom()->getColor()->getRGB())); - $xfWriter->setTopColor($this->addColor($style->getBorders()->getTop()->getColor()->getRGB())); - $xfWriter->setRightColor($this->addColor($style->getBorders()->getRight()->getColor()->getRGB())); - $xfWriter->setLeftColor($this->addColor($style->getBorders()->getLeft()->getColor()->getRGB())); - $xfWriter->setDiagColor($this->addColor($style->getBorders()->getDiagonal()->getColor()->getRGB())); - - // Add the number format if it is not a built-in one and not already added - if ($style->getNumberFormat()->getBuiltInFormatCode() === false) { - $numberFormatHashCode = $style->getNumberFormat()->getHashCode(); - - if (isset($this->addedNumberFormats[$numberFormatHashCode])) { - $numberFormatIndex = $this->addedNumberFormats[$numberFormatHashCode]; - } else { - $numberFormatIndex = 164 + count($this->numberFormats); - $this->numberFormats[$numberFormatIndex] = $style->getNumberFormat(); - $this->addedNumberFormats[$numberFormatHashCode] = $numberFormatIndex; - } - } else { - $numberFormatIndex = (int) $style->getNumberFormat()->getBuiltInFormatCode(); - } - - // Assign the number format index to xf record - $xfWriter->setNumberFormatIndex($numberFormatIndex); - - $this->xfWriters[] = $xfWriter; - - return count($this->xfWriters) - 1; - } - - /** - * Add a font to added fonts. - * - * @return int Index to FONT record - */ - public function addFont(\PhpOffice\PhpSpreadsheet\Style\Font $font) - { - $fontHashCode = $font->getHashCode(); - if (isset($this->addedFonts[$fontHashCode])) { - $fontIndex = $this->addedFonts[$fontHashCode]; - } else { - $countFonts = count($this->fontWriters); - $fontIndex = ($countFonts < 4) ? $countFonts : $countFonts + 1; - - $fontWriter = new Font($font); - $fontWriter->setColorIndex($this->addColor($font->getColor()->getRGB())); - $this->fontWriters[] = $fontWriter; - - $this->addedFonts[$fontHashCode] = $fontIndex; - } - - return $fontIndex; - } - - /** - * Alter color palette adding a custom color. - * - * @param string $rgb E.g. 'FF00AA' - * - * @return int Color index - */ - private function addColor($rgb) - { - if (!isset($this->colors[$rgb])) { - $color = - [ - hexdec(substr($rgb, 0, 2)), - hexdec(substr($rgb, 2, 2)), - hexdec(substr($rgb, 4)), - 0, - ]; - $colorIndex = array_search($color, $this->palette); - if ($colorIndex) { - $this->colors[$rgb] = $colorIndex; - } else { - if (count($this->colors) === 0) { - $lastColor = 7; - } else { - $lastColor = end($this->colors); - } - if ($lastColor < 57) { - // then we add a custom color altering the palette - $colorIndex = $lastColor + 1; - $this->palette[$colorIndex] = $color; - $this->colors[$rgb] = $colorIndex; - } else { - // no room for more custom colors, just map to black - $colorIndex = 0; - } - } - } else { - // fetch already added custom color - $colorIndex = $this->colors[$rgb]; - } - - return $colorIndex; - } - - /** - * Sets the colour palette to the Excel 97+ default. - */ - private function setPaletteXl97(): void - { - $this->palette = [ - 0x08 => [0x00, 0x00, 0x00, 0x00], - 0x09 => [0xff, 0xff, 0xff, 0x00], - 0x0A => [0xff, 0x00, 0x00, 0x00], - 0x0B => [0x00, 0xff, 0x00, 0x00], - 0x0C => [0x00, 0x00, 0xff, 0x00], - 0x0D => [0xff, 0xff, 0x00, 0x00], - 0x0E => [0xff, 0x00, 0xff, 0x00], - 0x0F => [0x00, 0xff, 0xff, 0x00], - 0x10 => [0x80, 0x00, 0x00, 0x00], - 0x11 => [0x00, 0x80, 0x00, 0x00], - 0x12 => [0x00, 0x00, 0x80, 0x00], - 0x13 => [0x80, 0x80, 0x00, 0x00], - 0x14 => [0x80, 0x00, 0x80, 0x00], - 0x15 => [0x00, 0x80, 0x80, 0x00], - 0x16 => [0xc0, 0xc0, 0xc0, 0x00], - 0x17 => [0x80, 0x80, 0x80, 0x00], - 0x18 => [0x99, 0x99, 0xff, 0x00], - 0x19 => [0x99, 0x33, 0x66, 0x00], - 0x1A => [0xff, 0xff, 0xcc, 0x00], - 0x1B => [0xcc, 0xff, 0xff, 0x00], - 0x1C => [0x66, 0x00, 0x66, 0x00], - 0x1D => [0xff, 0x80, 0x80, 0x00], - 0x1E => [0x00, 0x66, 0xcc, 0x00], - 0x1F => [0xcc, 0xcc, 0xff, 0x00], - 0x20 => [0x00, 0x00, 0x80, 0x00], - 0x21 => [0xff, 0x00, 0xff, 0x00], - 0x22 => [0xff, 0xff, 0x00, 0x00], - 0x23 => [0x00, 0xff, 0xff, 0x00], - 0x24 => [0x80, 0x00, 0x80, 0x00], - 0x25 => [0x80, 0x00, 0x00, 0x00], - 0x26 => [0x00, 0x80, 0x80, 0x00], - 0x27 => [0x00, 0x00, 0xff, 0x00], - 0x28 => [0x00, 0xcc, 0xff, 0x00], - 0x29 => [0xcc, 0xff, 0xff, 0x00], - 0x2A => [0xcc, 0xff, 0xcc, 0x00], - 0x2B => [0xff, 0xff, 0x99, 0x00], - 0x2C => [0x99, 0xcc, 0xff, 0x00], - 0x2D => [0xff, 0x99, 0xcc, 0x00], - 0x2E => [0xcc, 0x99, 0xff, 0x00], - 0x2F => [0xff, 0xcc, 0x99, 0x00], - 0x30 => [0x33, 0x66, 0xff, 0x00], - 0x31 => [0x33, 0xcc, 0xcc, 0x00], - 0x32 => [0x99, 0xcc, 0x00, 0x00], - 0x33 => [0xff, 0xcc, 0x00, 0x00], - 0x34 => [0xff, 0x99, 0x00, 0x00], - 0x35 => [0xff, 0x66, 0x00, 0x00], - 0x36 => [0x66, 0x66, 0x99, 0x00], - 0x37 => [0x96, 0x96, 0x96, 0x00], - 0x38 => [0x00, 0x33, 0x66, 0x00], - 0x39 => [0x33, 0x99, 0x66, 0x00], - 0x3A => [0x00, 0x33, 0x00, 0x00], - 0x3B => [0x33, 0x33, 0x00, 0x00], - 0x3C => [0x99, 0x33, 0x00, 0x00], - 0x3D => [0x99, 0x33, 0x66, 0x00], - 0x3E => [0x33, 0x33, 0x99, 0x00], - 0x3F => [0x33, 0x33, 0x33, 0x00], - ]; - } - - /** - * Assemble worksheets into a workbook and send the BIFF data to an OLE - * storage. - * - * @param array $pWorksheetSizes The sizes in bytes of the binary worksheet streams - * - * @return string Binary data for workbook stream - */ - public function writeWorkbook(array $pWorksheetSizes) - { - $this->worksheetSizes = $pWorksheetSizes; - - // Calculate the number of selected worksheet tabs and call the finalization - // methods for each worksheet - $total_worksheets = $this->spreadsheet->getSheetCount(); - - // Add part 1 of the Workbook globals, what goes before the SHEET records - $this->storeBof(0x0005); - $this->writeCodepage(); - $this->writeWindow1(); - - $this->writeDateMode(); - $this->writeAllFonts(); - $this->writeAllNumberFormats(); - $this->writeAllXfs(); - $this->writeAllStyles(); - $this->writePalette(); - - // Prepare part 3 of the workbook global stream, what goes after the SHEET records - $part3 = ''; - if ($this->countryCode !== -1) { - $part3 .= $this->writeCountry(); - } - $part3 .= $this->writeRecalcId(); - - $part3 .= $this->writeSupbookInternal(); - /* TODO: store external SUPBOOK records and XCT and CRN records - in case of external references for BIFF8 */ - $part3 .= $this->writeExternalsheetBiff8(); - $part3 .= $this->writeAllDefinedNamesBiff8(); - $part3 .= $this->writeMsoDrawingGroup(); - $part3 .= $this->writeSharedStringsTable(); - - $part3 .= $this->writeEof(); - - // Add part 2 of the Workbook globals, the SHEET records - $this->calcSheetOffsets(); - for ($i = 0; $i < $total_worksheets; ++$i) { - $this->writeBoundSheet($this->spreadsheet->getSheet($i), $this->worksheetOffsets[$i]); - } - - // Add part 3 of the Workbook globals - $this->_data .= $part3; - - return $this->_data; - } - - /** - * Calculate offsets for Worksheet BOF records. - */ - private function calcSheetOffsets(): void - { - $boundsheet_length = 10; // fixed length for a BOUNDSHEET record - - // size of Workbook globals part 1 + 3 - $offset = $this->_datasize; - - // add size of Workbook globals part 2, the length of the SHEET records - $total_worksheets = count($this->spreadsheet->getAllSheets()); - foreach ($this->spreadsheet->getWorksheetIterator() as $sheet) { - $offset += $boundsheet_length + strlen(StringHelper::UTF8toBIFF8UnicodeShort($sheet->getTitle())); - } - - // add the sizes of each of the Sheet substreams, respectively - for ($i = 0; $i < $total_worksheets; ++$i) { - $this->worksheetOffsets[$i] = $offset; - $offset += $this->worksheetSizes[$i]; - } - $this->biffSize = $offset; - } - - /** - * Store the Excel FONT records. - */ - private function writeAllFonts(): void - { - foreach ($this->fontWriters as $fontWriter) { - $this->append($fontWriter->writeFont()); - } - } - - /** - * Store user defined numerical formats i.e. FORMAT records. - */ - private function writeAllNumberFormats(): void - { - foreach ($this->numberFormats as $numberFormatIndex => $numberFormat) { - $this->writeNumberFormat($numberFormat->getFormatCode(), $numberFormatIndex); - } - } - - /** - * Write all XF records. - */ - private function writeAllXfs(): void - { - foreach ($this->xfWriters as $xfWriter) { - $this->append($xfWriter->writeXf()); - } - } - - /** - * Write all STYLE records. - */ - private function writeAllStyles(): void - { - $this->writeStyle(); - } - - private function parseDefinedNameValue(DefinedName $pDefinedName): string - { - $definedRange = $pDefinedName->getValue(); - $splitCount = preg_match_all( - '/' . Calculation::CALCULATION_REGEXP_CELLREF . '/mui', - $definedRange, - $splitRanges, - PREG_OFFSET_CAPTURE - ); - - $lengths = array_map('strlen', array_column($splitRanges[0], 0)); - $offsets = array_column($splitRanges[0], 1); - - $worksheets = $splitRanges[2]; - $columns = $splitRanges[6]; - $rows = $splitRanges[7]; - - while ($splitCount > 0) { - --$splitCount; - $length = $lengths[$splitCount]; - $offset = $offsets[$splitCount]; - $worksheet = $worksheets[$splitCount][0]; - $column = $columns[$splitCount][0]; - $row = $rows[$splitCount][0]; - - $newRange = ''; - if (empty($worksheet)) { - if (($offset === 0) || ($definedRange[$offset - 1] !== ':')) { - // We need a worksheet - $worksheet = $pDefinedName->getWorksheet()->getTitle(); - } - } else { - $worksheet = str_replace("''", "'", trim($worksheet, "'")); - } - if (!empty($worksheet)) { - $newRange = "'" . str_replace("'", "''", $worksheet) . "'!"; - } - - if (!empty($column)) { - $newRange .= "\${$column}"; - } - if (!empty($row)) { - $newRange .= "\${$row}"; - } - - $definedRange = substr($definedRange, 0, $offset) . $newRange . substr($definedRange, $offset + $length); - } - - return $definedRange; - } - - /** - * Writes all the DEFINEDNAME records (BIFF8). - * So far this is only used for repeating rows/columns (print titles) and print areas. - */ - private function writeAllDefinedNamesBiff8() - { - $chunk = ''; - - // Named ranges - $definedNames = $this->spreadsheet->getDefinedNames(); - if (count($definedNames) > 0) { - // Loop named ranges - foreach ($definedNames as $definedName) { - $range = $this->parseDefinedNameValue($definedName); - - // parse formula - try { - $error = $this->parser->parse($range); - $formulaData = $this->parser->toReversePolish(); - - // make sure tRef3d is of type tRef3dR (0x3A) - if (isset($formulaData[0]) && ($formulaData[0] == "\x7A" || $formulaData[0] == "\x5A")) { - $formulaData = "\x3A" . substr($formulaData, 1); - } - - if ($definedName->getLocalOnly()) { - // local scope - $scope = $this->spreadsheet->getIndex($definedName->getScope()) + 1; - } else { - // global scope - $scope = 0; - } - $chunk .= $this->writeData($this->writeDefinedNameBiff8($definedName->getName(), $formulaData, $scope, false)); - } catch (PhpSpreadsheetException $e) { - // do nothing - } - } - } - - // total number of sheets - $total_worksheets = $this->spreadsheet->getSheetCount(); - - // write the print titles (repeating rows, columns), if any - for ($i = 0; $i < $total_worksheets; ++$i) { - $sheetSetup = $this->spreadsheet->getSheet($i)->getPageSetup(); - // simultaneous repeatColumns repeatRows - if ($sheetSetup->isColumnsToRepeatAtLeftSet() && $sheetSetup->isRowsToRepeatAtTopSet()) { - $repeat = $sheetSetup->getColumnsToRepeatAtLeft(); - $colmin = Coordinate::columnIndexFromString($repeat[0]) - 1; - $colmax = Coordinate::columnIndexFromString($repeat[1]) - 1; - - $repeat = $sheetSetup->getRowsToRepeatAtTop(); - $rowmin = $repeat[0] - 1; - $rowmax = $repeat[1] - 1; - - // construct formula data manually - $formulaData = pack('Cv', 0x29, 0x17); // tMemFunc - $formulaData .= pack('Cvvvvv', 0x3B, $i, 0, 65535, $colmin, $colmax); // tArea3d - $formulaData .= pack('Cvvvvv', 0x3B, $i, $rowmin, $rowmax, 0, 255); // tArea3d - $formulaData .= pack('C', 0x10); // tList - - // store the DEFINEDNAME record - $chunk .= $this->writeData($this->writeDefinedNameBiff8(pack('C', 0x07), $formulaData, $i + 1, true)); - - // (exclusive) either repeatColumns or repeatRows - } elseif ($sheetSetup->isColumnsToRepeatAtLeftSet() || $sheetSetup->isRowsToRepeatAtTopSet()) { - // Columns to repeat - if ($sheetSetup->isColumnsToRepeatAtLeftSet()) { - $repeat = $sheetSetup->getColumnsToRepeatAtLeft(); - $colmin = Coordinate::columnIndexFromString($repeat[0]) - 1; - $colmax = Coordinate::columnIndexFromString($repeat[1]) - 1; - } else { - $colmin = 0; - $colmax = 255; - } - // Rows to repeat - if ($sheetSetup->isRowsToRepeatAtTopSet()) { - $repeat = $sheetSetup->getRowsToRepeatAtTop(); - $rowmin = $repeat[0] - 1; - $rowmax = $repeat[1] - 1; - } else { - $rowmin = 0; - $rowmax = 65535; - } - - // construct formula data manually because parser does not recognize absolute 3d cell references - $formulaData = pack('Cvvvvv', 0x3B, $i, $rowmin, $rowmax, $colmin, $colmax); - - // store the DEFINEDNAME record - $chunk .= $this->writeData($this->writeDefinedNameBiff8(pack('C', 0x07), $formulaData, $i + 1, true)); - } - } - - // write the print areas, if any - for ($i = 0; $i < $total_worksheets; ++$i) { - $sheetSetup = $this->spreadsheet->getSheet($i)->getPageSetup(); - if ($sheetSetup->isPrintAreaSet()) { - // Print area, e.g. A3:J6,H1:X20 - $printArea = Coordinate::splitRange($sheetSetup->getPrintArea()); - $countPrintArea = count($printArea); - - $formulaData = ''; - for ($j = 0; $j < $countPrintArea; ++$j) { - $printAreaRect = $printArea[$j]; // e.g. A3:J6 - $printAreaRect[0] = Coordinate::coordinateFromString($printAreaRect[0]); - $printAreaRect[1] = Coordinate::coordinateFromString($printAreaRect[1]); - - $print_rowmin = $printAreaRect[0][1] - 1; - $print_rowmax = $printAreaRect[1][1] - 1; - $print_colmin = Coordinate::columnIndexFromString($printAreaRect[0][0]) - 1; - $print_colmax = Coordinate::columnIndexFromString($printAreaRect[1][0]) - 1; - - // construct formula data manually because parser does not recognize absolute 3d cell references - $formulaData .= pack('Cvvvvv', 0x3B, $i, $print_rowmin, $print_rowmax, $print_colmin, $print_colmax); - - if ($j > 0) { - $formulaData .= pack('C', 0x10); // list operator token ',' - } - } - - // store the DEFINEDNAME record - $chunk .= $this->writeData($this->writeDefinedNameBiff8(pack('C', 0x06), $formulaData, $i + 1, true)); - } - } - - // write autofilters, if any - for ($i = 0; $i < $total_worksheets; ++$i) { - $sheetAutoFilter = $this->spreadsheet->getSheet($i)->getAutoFilter(); - $autoFilterRange = $sheetAutoFilter->getRange(); - if (!empty($autoFilterRange)) { - $rangeBounds = Coordinate::rangeBoundaries($autoFilterRange); - - //Autofilter built in name - $name = pack('C', 0x0D); - - $chunk .= $this->writeData($this->writeShortNameBiff8($name, $i + 1, $rangeBounds, true)); - } - } - - return $chunk; - } - - /** - * Write a DEFINEDNAME record for BIFF8 using explicit binary formula data. - * - * @param string $name The name in UTF-8 - * @param string $formulaData The binary formula data - * @param int $sheetIndex 1-based sheet index the defined name applies to. 0 = global - * @param bool $isBuiltIn Built-in name? - * - * @return string Complete binary record data - */ - private function writeDefinedNameBiff8($name, $formulaData, $sheetIndex = 0, $isBuiltIn = false) - { - $record = 0x0018; - - // option flags - $options = $isBuiltIn ? 0x20 : 0x00; - - // length of the name, character count - $nlen = StringHelper::countCharacters($name); - - // name with stripped length field - $name = substr(StringHelper::UTF8toBIFF8UnicodeLong($name), 2); - - // size of the formula (in bytes) - $sz = strlen($formulaData); - - // combine the parts - $data = pack('vCCvvvCCCC', $options, 0, $nlen, $sz, 0, $sheetIndex, 0, 0, 0, 0) - . $name . $formulaData; - $length = strlen($data); - - $header = pack('vv', $record, $length); - - return $header . $data; - } - - /** - * Write a short NAME record. - * - * @param string $name - * @param string $sheetIndex 1-based sheet index the defined name applies to. 0 = global - * @param integer[][] $rangeBounds range boundaries - * @param bool $isHidden - * - * @return string Complete binary record data - * */ - private function writeShortNameBiff8($name, $sheetIndex, $rangeBounds, $isHidden = false) - { - $record = 0x0018; - - // option flags - $options = ($isHidden ? 0x21 : 0x00); - - $extra = pack( - 'Cvvvvv', - 0x3B, - $sheetIndex - 1, - $rangeBounds[0][1] - 1, - $rangeBounds[1][1] - 1, - $rangeBounds[0][0] - 1, - $rangeBounds[1][0] - 1 - ); - - // size of the formula (in bytes) - $sz = strlen($extra); - - // combine the parts - $data = pack('vCCvvvCCCCC', $options, 0, 1, $sz, 0, $sheetIndex, 0, 0, 0, 0, 0) - . $name . $extra; - $length = strlen($data); - - $header = pack('vv', $record, $length); - - return $header . $data; - } - - /** - * Stores the CODEPAGE biff record. - */ - private function writeCodepage(): void - { - $record = 0x0042; // Record identifier - $length = 0x0002; // Number of bytes to follow - $cv = $this->codepage; // The code page - - $header = pack('vv', $record, $length); - $data = pack('v', $cv); - - $this->append($header . $data); - } - - /** - * Write Excel BIFF WINDOW1 record. - */ - private function writeWindow1(): void - { - $record = 0x003D; // Record identifier - $length = 0x0012; // Number of bytes to follow - - $xWn = 0x0000; // Horizontal position of window - $yWn = 0x0000; // Vertical position of window - $dxWn = 0x25BC; // Width of window - $dyWn = 0x1572; // Height of window - - $grbit = 0x0038; // Option flags - - // not supported by PhpSpreadsheet, so there is only one selected sheet, the active - $ctabsel = 1; // Number of workbook tabs selected - - $wTabRatio = 0x0258; // Tab to scrollbar ratio - - // not supported by PhpSpreadsheet, set to 0 - $itabFirst = 0; // 1st displayed worksheet - $itabCur = $this->spreadsheet->getActiveSheetIndex(); // Active worksheet - - $header = pack('vv', $record, $length); - $data = pack('vvvvvvvvv', $xWn, $yWn, $dxWn, $dyWn, $grbit, $itabCur, $itabFirst, $ctabsel, $wTabRatio); - $this->append($header . $data); - } - - /** - * Writes Excel BIFF BOUNDSHEET record. - * - * @param Worksheet $sheet Worksheet name - * @param int $offset Location of worksheet BOF - */ - private function writeBoundSheet($sheet, $offset): void - { - $sheetname = $sheet->getTitle(); - $record = 0x0085; // Record identifier - - // sheet state - switch ($sheet->getSheetState()) { - case \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SHEETSTATE_VISIBLE: - $ss = 0x00; - - break; - case \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SHEETSTATE_HIDDEN: - $ss = 0x01; - - break; - case \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SHEETSTATE_VERYHIDDEN: - $ss = 0x02; - - break; - default: - $ss = 0x00; - - break; - } - - // sheet type - $st = 0x00; - - $grbit = 0x0000; // Visibility and sheet type - - $data = pack('VCC', $offset, $ss, $st); - $data .= StringHelper::UTF8toBIFF8UnicodeShort($sheetname); - - $length = strlen($data); - $header = pack('vv', $record, $length); - $this->append($header . $data); - } - - /** - * Write Internal SUPBOOK record. - */ - private function writeSupbookInternal() - { - $record = 0x01AE; // Record identifier - $length = 0x0004; // Bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('vv', $this->spreadsheet->getSheetCount(), 0x0401); - - return $this->writeData($header . $data); - } - - /** - * Writes the Excel BIFF EXTERNSHEET record. These references are used by - * formulas. - */ - private function writeExternalsheetBiff8() - { - $totalReferences = count($this->parser->references); - $record = 0x0017; // Record identifier - $length = 2 + 6 * $totalReferences; // Number of bytes to follow - - $supbook_index = 0; // FIXME: only using internal SUPBOOK record - $header = pack('vv', $record, $length); - $data = pack('v', $totalReferences); - for ($i = 0; $i < $totalReferences; ++$i) { - $data .= $this->parser->references[$i]; - } - - return $this->writeData($header . $data); - } - - /** - * Write Excel BIFF STYLE records. - */ - private function writeStyle(): void - { - $record = 0x0293; // Record identifier - $length = 0x0004; // Bytes to follow - - $ixfe = 0x8000; // Index to cell style XF - $BuiltIn = 0x00; // Built-in style - $iLevel = 0xff; // Outline style level - - $header = pack('vv', $record, $length); - $data = pack('vCC', $ixfe, $BuiltIn, $iLevel); - $this->append($header . $data); - } - - /** - * Writes Excel FORMAT record for non "built-in" numerical formats. - * - * @param string $format Custom format string - * @param int $ifmt Format index code - */ - private function writeNumberFormat($format, $ifmt): void - { - $record = 0x041E; // Record identifier - - $numberFormatString = StringHelper::UTF8toBIFF8UnicodeLong($format); - $length = 2 + strlen($numberFormatString); // Number of bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('v', $ifmt) . $numberFormatString; - $this->append($header . $data); - } - - /** - * Write DATEMODE record to indicate the date system in use (1904 or 1900). - */ - private function writeDateMode(): void - { - $record = 0x0022; // Record identifier - $length = 0x0002; // Bytes to follow - - $f1904 = (Date::getExcelCalendar() === Date::CALENDAR_MAC_1904) - ? 1 - : 0; // Flag for 1904 date system - - $header = pack('vv', $record, $length); - $data = pack('v', $f1904); - $this->append($header . $data); - } - - /** - * Stores the COUNTRY record for localization. - * - * @return string - */ - private function writeCountry() - { - $record = 0x008C; // Record identifier - $length = 4; // Number of bytes to follow - - $header = pack('vv', $record, $length); - // using the same country code always for simplicity - $data = pack('vv', $this->countryCode, $this->countryCode); - - return $this->writeData($header . $data); - } - - /** - * Write the RECALCID record. - * - * @return string - */ - private function writeRecalcId() - { - $record = 0x01C1; // Record identifier - $length = 8; // Number of bytes to follow - - $header = pack('vv', $record, $length); - - // by inspection of real Excel files, MS Office Excel 2007 writes this - $data = pack('VV', 0x000001C1, 0x00001E667); - - return $this->writeData($header . $data); - } - - /** - * Stores the PALETTE biff record. - */ - private function writePalette(): void - { - $aref = $this->palette; - - $record = 0x0092; // Record identifier - $length = 2 + 4 * count($aref); // Number of bytes to follow - $ccv = count($aref); // Number of RGB values to follow - $data = ''; // The RGB data - - // Pack the RGB data - foreach ($aref as $color) { - foreach ($color as $byte) { - $data .= pack('C', $byte); - } - } - - $header = pack('vvv', $record, $length, $ccv); - $this->append($header . $data); - } - - /** - * Handling of the SST continue blocks is complicated by the need to include an - * additional continuation byte depending on whether the string is split between - * blocks or whether it starts at the beginning of the block. (There are also - * additional complications that will arise later when/if Rich Strings are - * supported). - * - * The Excel documentation says that the SST record should be followed by an - * EXTSST record. The EXTSST record is a hash table that is used to optimise - * access to SST. However, despite the documentation it doesn't seem to be - * required so we will ignore it. - * - * @return string Binary data - */ - private function writeSharedStringsTable() - { - // maximum size of record data (excluding record header) - $continue_limit = 8224; - - // initialize array of record data blocks - $recordDatas = []; - - // start SST record data block with total number of strings, total number of unique strings - $recordData = pack('VV', $this->stringTotal, $this->stringUnique); - - // loop through all (unique) strings in shared strings table - foreach (array_keys($this->stringTable) as $string) { - // here $string is a BIFF8 encoded string - - // length = character count - $headerinfo = unpack('vlength/Cencoding', $string); - - // currently, this is always 1 = uncompressed - $encoding = $headerinfo['encoding']; - - // initialize finished writing current $string - $finished = false; - - while ($finished === false) { - // normally, there will be only one cycle, but if string cannot immediately be written as is - // there will be need for more than one cylcle, if string longer than one record data block, there - // may be need for even more cycles - - if (strlen($recordData) + strlen($string) <= $continue_limit) { - // then we can write the string (or remainder of string) without any problems - $recordData .= $string; - - if (strlen($recordData) + strlen($string) == $continue_limit) { - // we close the record data block, and initialize a new one - $recordDatas[] = $recordData; - $recordData = ''; - } - - // we are finished writing this string - $finished = true; - } else { - // special treatment writing the string (or remainder of the string) - // If the string is very long it may need to be written in more than one CONTINUE record. - - // check how many bytes more there is room for in the current record - $space_remaining = $continue_limit - strlen($recordData); - - // minimum space needed - // uncompressed: 2 byte string length length field + 1 byte option flags + 2 byte character - // compressed: 2 byte string length length field + 1 byte option flags + 1 byte character - $min_space_needed = ($encoding == 1) ? 5 : 4; - - // We have two cases - // 1. space remaining is less than minimum space needed - // here we must waste the space remaining and move to next record data block - // 2. space remaining is greater than or equal to minimum space needed - // here we write as much as we can in the current block, then move to next record data block - - // 1. space remaining is less than minimum space needed - if ($space_remaining < $min_space_needed) { - // we close the block, store the block data - $recordDatas[] = $recordData; - - // and start new record data block where we start writing the string - $recordData = ''; - - // 2. space remaining is greater than or equal to minimum space needed - } else { - // initialize effective remaining space, for Unicode strings this may need to be reduced by 1, see below - $effective_space_remaining = $space_remaining; - - // for uncompressed strings, sometimes effective space remaining is reduced by 1 - if ($encoding == 1 && (strlen($string) - $space_remaining) % 2 == 1) { - --$effective_space_remaining; - } - - // one block fininshed, store the block data - $recordData .= substr($string, 0, $effective_space_remaining); - - $string = substr($string, $effective_space_remaining); // for next cycle in while loop - $recordDatas[] = $recordData; - - // start new record data block with the repeated option flags - $recordData = pack('C', $encoding); - } - } - } - } - - // Store the last record data block unless it is empty - // if there was no need for any continue records, this will be the for SST record data block itself - if (strlen($recordData) > 0) { - $recordDatas[] = $recordData; - } - - // combine into one chunk with all the blocks SST, CONTINUE,... - $chunk = ''; - foreach ($recordDatas as $i => $recordData) { - // first block should have the SST record header, remaing should have CONTINUE header - $record = ($i == 0) ? 0x00FC : 0x003C; - - $header = pack('vv', $record, strlen($recordData)); - $data = $header . $recordData; - - $chunk .= $this->writeData($data); - } - - return $chunk; - } - - /** - * Writes the MSODRAWINGGROUP record if needed. Possibly split using CONTINUE records. - */ - private function writeMsoDrawingGroup() - { - // write the Escher stream if necessary - if (isset($this->escher)) { - $writer = new Escher($this->escher); - $data = $writer->close(); - - $record = 0x00EB; - $length = strlen($data); - $header = pack('vv', $record, $length); - - return $this->writeData($header . $data); - } - - return ''; - } - - /** - * Get Escher object. - * - * @return \PhpOffice\PhpSpreadsheet\Shared\Escher - */ - public function getEscher() - { - return $this->escher; - } - - /** - * Set Escher object. - * - * @param \PhpOffice\PhpSpreadsheet\Shared\Escher $pValue - */ - public function setEscher(?\PhpOffice\PhpSpreadsheet\Shared\Escher $pValue = null): void - { - $this->escher = $pValue; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php deleted file mode 100644 index a1c258c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php +++ /dev/null @@ -1,4490 +0,0 @@ - -// * -// * The majority of this is _NOT_ my code. I simply ported it from the -// * PERL Spreadsheet::WriteExcel module. -// * -// * The author of the Spreadsheet::WriteExcel module is John McNamara -// * -// * -// * I _DO_ maintain this code, and John McNamara has nothing to do with the -// * porting of this code to PHP. Any questions directly related to this -// * class library should be directed to me. -// * -// * License Information: -// * -// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets -// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com -// * -// * This library is free software; you can redistribute it and/or -// * modify it under the terms of the GNU Lesser General Public -// * License as published by the Free Software Foundation; either -// * version 2.1 of the License, or (at your option) any later version. -// * -// * This library is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// * Lesser General Public License for more details. -// * -// * You should have received a copy of the GNU Lesser General Public -// * License along with this library; if not, write to the Free Software -// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// */ -class Worksheet extends BIFFwriter -{ - /** - * Formula parser. - * - * @var \PhpOffice\PhpSpreadsheet\Writer\Xls\Parser - */ - private $parser; - - /** - * Maximum number of characters for a string (LABEL record in BIFF5). - * - * @var int - */ - private $xlsStringMaxLength; - - /** - * Array containing format information for columns. - * - * @var array - */ - private $columnInfo; - - /** - * Array containing the selected area for the worksheet. - * - * @var array - */ - private $selection; - - /** - * The active pane for the worksheet. - * - * @var int - */ - private $activePane; - - /** - * Whether to use outline. - * - * @var int - */ - private $outlineOn; - - /** - * Auto outline styles. - * - * @var bool - */ - private $outlineStyle; - - /** - * Whether to have outline summary below. - * - * @var bool - */ - private $outlineBelow; - - /** - * Whether to have outline summary at the right. - * - * @var bool - */ - private $outlineRight; - - /** - * Reference to the total number of strings in the workbook. - * - * @var int - */ - private $stringTotal; - - /** - * Reference to the number of unique strings in the workbook. - * - * @var int - */ - private $stringUnique; - - /** - * Reference to the array containing all the unique strings in the workbook. - * - * @var array - */ - private $stringTable; - - /** - * Color cache. - */ - private $colors; - - /** - * Index of first used row (at least 0). - * - * @var int - */ - private $firstRowIndex; - - /** - * Index of last used row. (no used rows means -1). - * - * @var int - */ - private $lastRowIndex; - - /** - * Index of first used column (at least 0). - * - * @var int - */ - private $firstColumnIndex; - - /** - * Index of last used column (no used columns means -1). - * - * @var int - */ - private $lastColumnIndex; - - /** - * Sheet object. - * - * @var \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet - */ - public $phpSheet; - - /** - * Count cell style Xfs. - * - * @var int - */ - private $countCellStyleXfs; - - /** - * Escher object corresponding to MSODRAWING. - * - * @var \PhpOffice\PhpSpreadsheet\Shared\Escher - */ - private $escher; - - /** - * Array of font hashes associated to FONT records index. - * - * @var array - */ - public $fontHashIndex; - - /** - * @var bool - */ - private $preCalculateFormulas; - - /** - * @var int - */ - private $printHeaders; - - /** - * Constructor. - * - * @param int $str_total Total number of strings - * @param int $str_unique Total number of unique strings - * @param array &$str_table String Table - * @param array &$colors Colour Table - * @param Parser $parser The formula parser created for the Workbook - * @param bool $preCalculateFormulas Flag indicating whether formulas should be calculated or just written - * @param \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $phpSheet The worksheet to write - */ - public function __construct(&$str_total, &$str_unique, &$str_table, &$colors, Parser $parser, $preCalculateFormulas, \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $phpSheet) - { - // It needs to call its parent's constructor explicitly - parent::__construct(); - - $this->preCalculateFormulas = $preCalculateFormulas; - $this->stringTotal = &$str_total; - $this->stringUnique = &$str_unique; - $this->stringTable = &$str_table; - $this->colors = &$colors; - $this->parser = $parser; - - $this->phpSheet = $phpSheet; - - $this->xlsStringMaxLength = 255; - $this->columnInfo = []; - $this->selection = [0, 0, 0, 0]; - $this->activePane = 3; - - $this->printHeaders = 0; - - $this->outlineStyle = 0; - $this->outlineBelow = 1; - $this->outlineRight = 1; - $this->outlineOn = 1; - - $this->fontHashIndex = []; - - // calculate values for DIMENSIONS record - $minR = 1; - $minC = 'A'; - - $maxR = $this->phpSheet->getHighestRow(); - $maxC = $this->phpSheet->getHighestColumn(); - - // Determine lowest and highest column and row - $this->lastRowIndex = ($maxR > 65535) ? 65535 : $maxR; - - $this->firstColumnIndex = Coordinate::columnIndexFromString($minC); - $this->lastColumnIndex = Coordinate::columnIndexFromString($maxC); - -// if ($this->firstColumnIndex > 255) $this->firstColumnIndex = 255; - if ($this->lastColumnIndex > 255) { - $this->lastColumnIndex = 255; - } - - $this->countCellStyleXfs = count($phpSheet->getParent()->getCellStyleXfCollection()); - } - - /** - * Add data to the beginning of the workbook (note the reverse order) - * and to the end of the workbook. - * - * @see \PhpOffice\PhpSpreadsheet\Writer\Xls\Workbook::storeWorkbook() - */ - public function close(): void - { - $phpSheet = $this->phpSheet; - - // Storing selected cells and active sheet because it changes while parsing cells with formulas. - $selectedCells = $this->phpSheet->getSelectedCells(); - $activeSheetIndex = $this->phpSheet->getParent()->getActiveSheetIndex(); - - // Write BOF record - $this->storeBof(0x0010); - - // Write PRINTHEADERS - $this->writePrintHeaders(); - - // Write PRINTGRIDLINES - $this->writePrintGridlines(); - - // Write GRIDSET - $this->writeGridset(); - - // Calculate column widths - $phpSheet->calculateColumnWidths(); - - // Column dimensions - if (($defaultWidth = $phpSheet->getDefaultColumnDimension()->getWidth()) < 0) { - $defaultWidth = \PhpOffice\PhpSpreadsheet\Shared\Font::getDefaultColumnWidthByFont($phpSheet->getParent()->getDefaultStyle()->getFont()); - } - - $columnDimensions = $phpSheet->getColumnDimensions(); - $maxCol = $this->lastColumnIndex - 1; - for ($i = 0; $i <= $maxCol; ++$i) { - $hidden = 0; - $level = 0; - $xfIndex = 15; // there are 15 cell style Xfs - - $width = $defaultWidth; - - $columnLetter = Coordinate::stringFromColumnIndex($i + 1); - if (isset($columnDimensions[$columnLetter])) { - $columnDimension = $columnDimensions[$columnLetter]; - if ($columnDimension->getWidth() >= 0) { - $width = $columnDimension->getWidth(); - } - $hidden = $columnDimension->getVisible() ? 0 : 1; - $level = $columnDimension->getOutlineLevel(); - $xfIndex = $columnDimension->getXfIndex() + 15; // there are 15 cell style Xfs - } - - // Components of columnInfo: - // $firstcol first column on the range - // $lastcol last column on the range - // $width width to set - // $xfIndex The optional cell style Xf index to apply to the columns - // $hidden The optional hidden atribute - // $level The optional outline level - $this->columnInfo[] = [$i, $i, $width, $xfIndex, $hidden, $level]; - } - - // Write GUTS - $this->writeGuts(); - - // Write DEFAULTROWHEIGHT - $this->writeDefaultRowHeight(); - // Write WSBOOL - $this->writeWsbool(); - // Write horizontal and vertical page breaks - $this->writeBreaks(); - // Write page header - $this->writeHeader(); - // Write page footer - $this->writeFooter(); - // Write page horizontal centering - $this->writeHcenter(); - // Write page vertical centering - $this->writeVcenter(); - // Write left margin - $this->writeMarginLeft(); - // Write right margin - $this->writeMarginRight(); - // Write top margin - $this->writeMarginTop(); - // Write bottom margin - $this->writeMarginBottom(); - // Write page setup - $this->writeSetup(); - // Write sheet protection - $this->writeProtect(); - // Write SCENPROTECT - $this->writeScenProtect(); - // Write OBJECTPROTECT - $this->writeObjectProtect(); - // Write sheet password - $this->writePassword(); - // Write DEFCOLWIDTH record - $this->writeDefcol(); - - // Write the COLINFO records if they exist - if (!empty($this->columnInfo)) { - $colcount = count($this->columnInfo); - for ($i = 0; $i < $colcount; ++$i) { - $this->writeColinfo($this->columnInfo[$i]); - } - } - $autoFilterRange = $phpSheet->getAutoFilter()->getRange(); - if (!empty($autoFilterRange)) { - // Write AUTOFILTERINFO - $this->writeAutoFilterInfo(); - } - - // Write sheet dimensions - $this->writeDimensions(); - - // Row dimensions - foreach ($phpSheet->getRowDimensions() as $rowDimension) { - $xfIndex = $rowDimension->getXfIndex() + 15; // there are 15 cellXfs - $this->writeRow($rowDimension->getRowIndex() - 1, $rowDimension->getRowHeight(), $xfIndex, ($rowDimension->getVisible() ? '0' : '1'), $rowDimension->getOutlineLevel()); - } - - // Write Cells - foreach ($phpSheet->getCoordinates() as $coordinate) { - $cell = $phpSheet->getCell($coordinate); - $row = $cell->getRow() - 1; - $column = Coordinate::columnIndexFromString($cell->getColumn()) - 1; - - // Don't break Excel break the code! - if ($row > 65535 || $column > 255) { - throw new WriterException('Rows or columns overflow! Excel5 has limit to 65535 rows and 255 columns. Use XLSX instead.'); - } - - // Write cell value - $xfIndex = $cell->getXfIndex() + 15; // there are 15 cell style Xfs - - $cVal = $cell->getValue(); - if ($cVal instanceof RichText) { - $arrcRun = []; - $str_len = StringHelper::countCharacters($cVal->getPlainText(), 'UTF-8'); - $str_pos = 0; - $elements = $cVal->getRichTextElements(); - foreach ($elements as $element) { - // FONT Index - if ($element instanceof Run) { - $str_fontidx = $this->fontHashIndex[$element->getFont()->getHashCode()]; - } else { - $str_fontidx = 0; - } - $arrcRun[] = ['strlen' => $str_pos, 'fontidx' => $str_fontidx]; - // Position FROM - $str_pos += StringHelper::countCharacters($element->getText(), 'UTF-8'); - } - $this->writeRichTextString($row, $column, $cVal->getPlainText(), $xfIndex, $arrcRun); - } else { - switch ($cell->getDatatype()) { - case DataType::TYPE_STRING: - case DataType::TYPE_NULL: - if ($cVal === '' || $cVal === null) { - $this->writeBlank($row, $column, $xfIndex); - } else { - $this->writeString($row, $column, $cVal, $xfIndex); - } - - break; - case DataType::TYPE_NUMERIC: - $this->writeNumber($row, $column, $cVal, $xfIndex); - - break; - case DataType::TYPE_FORMULA: - $calculatedValue = $this->preCalculateFormulas ? - $cell->getCalculatedValue() : null; - if (self::WRITE_FORMULA_EXCEPTION == $this->writeFormula($row, $column, $cVal, $xfIndex, $calculatedValue)) { - if ($calculatedValue === null) { - $calculatedValue = $cell->getCalculatedValue(); - } - $calctype = gettype($calculatedValue); - switch ($calctype) { - case 'integer': - case 'double': - $this->writeNumber($row, $column, $calculatedValue, $xfIndex); - - break; - case 'string': - $this->writeString($row, $column, $calculatedValue, $xfIndex); - - break; - case 'boolean': - $this->writeBoolErr($row, $column, $calculatedValue, 0, $xfIndex); - - break; - default: - $this->writeString($row, $column, $cVal, $xfIndex); - } - } - - break; - case DataType::TYPE_BOOL: - $this->writeBoolErr($row, $column, $cVal, 0, $xfIndex); - - break; - case DataType::TYPE_ERROR: - $this->writeBoolErr($row, $column, self::mapErrorCode($cVal), 1, $xfIndex); - - break; - } - } - } - - // Append - $this->writeMsoDrawing(); - - // Restoring active sheet. - $this->phpSheet->getParent()->setActiveSheetIndex($activeSheetIndex); - - // Write WINDOW2 record - $this->writeWindow2(); - - // Write PLV record - $this->writePageLayoutView(); - - // Write ZOOM record - $this->writeZoom(); - if ($phpSheet->getFreezePane()) { - $this->writePanes(); - } - - // Restoring selected cells. - $this->phpSheet->setSelectedCells($selectedCells); - - // Write SELECTION record - $this->writeSelection(); - - // Write MergedCellsTable Record - $this->writeMergedCells(); - - // Hyperlinks - foreach ($phpSheet->getHyperLinkCollection() as $coordinate => $hyperlink) { - [$column, $row] = Coordinate::coordinateFromString($coordinate); - - $url = $hyperlink->getUrl(); - - if (strpos($url, 'sheet://') !== false) { - // internal to current workbook - $url = str_replace('sheet://', 'internal:', $url); - } elseif (preg_match('/^(http:|https:|ftp:|mailto:)/', $url)) { - // URL - } else { - // external (local file) - $url = 'external:' . $url; - } - - $this->writeUrl($row - 1, Coordinate::columnIndexFromString($column) - 1, $url); - } - - $this->writeDataValidity(); - $this->writeSheetLayout(); - - // Write SHEETPROTECTION record - $this->writeSheetProtection(); - $this->writeRangeProtection(); - - $arrConditionalStyles = $phpSheet->getConditionalStylesCollection(); - if (!empty($arrConditionalStyles)) { - $arrConditional = []; - // @TODO CFRule & CFHeader - // Write CFHEADER record - $this->writeCFHeader(); - // Write ConditionalFormattingTable records - foreach ($arrConditionalStyles as $cellCoordinate => $conditionalStyles) { - foreach ($conditionalStyles as $conditional) { - if ( - $conditional->getConditionType() == Conditional::CONDITION_EXPRESSION - || $conditional->getConditionType() == Conditional::CONDITION_CELLIS - ) { - if (!isset($arrConditional[$conditional->getHashCode()])) { - // This hash code has been handled - $arrConditional[$conditional->getHashCode()] = true; - - // Write CFRULE record - $this->writeCFRule($conditional); - } - } - } - } - } - - $this->storeEof(); - } - - /** - * Write a cell range address in BIFF8 - * always fixed range - * See section 2.5.14 in OpenOffice.org's Documentation of the Microsoft Excel File Format. - * - * @param string $range E.g. 'A1' or 'A1:B6' - * - * @return string Binary data - */ - private function writeBIFF8CellRangeAddressFixed($range) - { - $explodes = explode(':', $range); - - // extract first cell, e.g. 'A1' - $firstCell = $explodes[0]; - - // extract last cell, e.g. 'B6' - if (count($explodes) == 1) { - $lastCell = $firstCell; - } else { - $lastCell = $explodes[1]; - } - - $firstCellCoordinates = Coordinate::coordinateFromString($firstCell); // e.g. [0, 1] - $lastCellCoordinates = Coordinate::coordinateFromString($lastCell); // e.g. [1, 6] - - return pack('vvvv', $firstCellCoordinates[1] - 1, $lastCellCoordinates[1] - 1, Coordinate::columnIndexFromString($firstCellCoordinates[0]) - 1, Coordinate::columnIndexFromString($lastCellCoordinates[0]) - 1); - } - - /** - * Retrieves data from memory in one chunk, or from disk in $buffer - * sized chunks. - * - * @return string The data - */ - public function getData() - { - $buffer = 4096; - - // Return data stored in memory - if (isset($this->_data)) { - $tmp = $this->_data; - $this->_data = null; - - return $tmp; - } - - // No data to return - return false; - } - - /** - * Set the option to print the row and column headers on the printed page. - * - * @param int $print Whether to print the headers or not. Defaults to 1 (print). - */ - public function printRowColHeaders($print = 1): void - { - $this->printHeaders = $print; - } - - /** - * This method sets the properties for outlining and grouping. The defaults - * correspond to Excel's defaults. - * - * @param bool $visible - * @param bool $symbols_below - * @param bool $symbols_right - * @param bool $auto_style - */ - public function setOutline($visible = true, $symbols_below = true, $symbols_right = true, $auto_style = false): void - { - $this->outlineOn = $visible; - $this->outlineBelow = $symbols_below; - $this->outlineRight = $symbols_right; - $this->outlineStyle = $auto_style; - - // Ensure this is a boolean vale for Window2 - if ($this->outlineOn) { - $this->outlineOn = 1; - } - } - - /** - * Write a double to the specified row and column (zero indexed). - * An integer can be written as a double. Excel will display an - * integer. $format is optional. - * - * Returns 0 : normal termination - * -2 : row or column out of range - * - * @param int $row Zero indexed row - * @param int $col Zero indexed column - * @param float $num The number to write - * @param mixed $xfIndex The optional XF format - * - * @return int - */ - private function writeNumber($row, $col, $num, $xfIndex) - { - $record = 0x0203; // Record identifier - $length = 0x000E; // Number of bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('vvv', $row, $col, $xfIndex); - $xl_double = pack('d', $num); - if (self::getByteOrder()) { // if it's Big Endian - $xl_double = strrev($xl_double); - } - - $this->append($header . $data . $xl_double); - - return 0; - } - - /** - * Write a LABELSST record or a LABEL record. Which one depends on BIFF version. - * - * @param int $row Row index (0-based) - * @param int $col Column index (0-based) - * @param string $str The string - * @param int $xfIndex Index to XF record - */ - private function writeString($row, $col, $str, $xfIndex): void - { - $this->writeLabelSst($row, $col, $str, $xfIndex); - } - - /** - * Write a LABELSST record or a LABEL record. Which one depends on BIFF version - * It differs from writeString by the writing of rich text strings. - * - * @param int $row Row index (0-based) - * @param int $col Column index (0-based) - * @param string $str The string - * @param int $xfIndex The XF format index for the cell - * @param array $arrcRun Index to Font record and characters beginning - */ - private function writeRichTextString($row, $col, $str, $xfIndex, $arrcRun): void - { - $record = 0x00FD; // Record identifier - $length = 0x000A; // Bytes to follow - $str = StringHelper::UTF8toBIFF8UnicodeShort($str, $arrcRun); - - // check if string is already present - if (!isset($this->stringTable[$str])) { - $this->stringTable[$str] = $this->stringUnique++; - } - ++$this->stringTotal; - - $header = pack('vv', $record, $length); - $data = pack('vvvV', $row, $col, $xfIndex, $this->stringTable[$str]); - $this->append($header . $data); - } - - /** - * Write a string to the specified row and column (zero indexed). - * This is the BIFF8 version (no 255 chars limit). - * $format is optional. - * - * @param int $row Zero indexed row - * @param int $col Zero indexed column - * @param string $str The string to write - * @param mixed $xfIndex The XF format index for the cell - */ - private function writeLabelSst($row, $col, $str, $xfIndex): void - { - $record = 0x00FD; // Record identifier - $length = 0x000A; // Bytes to follow - - $str = StringHelper::UTF8toBIFF8UnicodeLong($str); - - // check if string is already present - if (!isset($this->stringTable[$str])) { - $this->stringTable[$str] = $this->stringUnique++; - } - ++$this->stringTotal; - - $header = pack('vv', $record, $length); - $data = pack('vvvV', $row, $col, $xfIndex, $this->stringTable[$str]); - $this->append($header . $data); - } - - /** - * Write a blank cell to the specified row and column (zero indexed). - * A blank cell is used to specify formatting without adding a string - * or a number. - * - * A blank cell without a format serves no purpose. Therefore, we don't write - * a BLANK record unless a format is specified. - * - * Returns 0 : normal termination (including no format) - * -1 : insufficient number of arguments - * -2 : row or column out of range - * - * @param int $row Zero indexed row - * @param int $col Zero indexed column - * @param mixed $xfIndex The XF format index - * - * @return int - */ - public function writeBlank($row, $col, $xfIndex) - { - $record = 0x0201; // Record identifier - $length = 0x0006; // Number of bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('vvv', $row, $col, $xfIndex); - $this->append($header . $data); - - return 0; - } - - /** - * Write a boolean or an error type to the specified row and column (zero indexed). - * - * @param int $row Row index (0-based) - * @param int $col Column index (0-based) - * @param int $value - * @param bool $isError Error or Boolean? - * @param int $xfIndex - * - * @return int - */ - private function writeBoolErr($row, $col, $value, $isError, $xfIndex) - { - $record = 0x0205; - $length = 8; - - $header = pack('vv', $record, $length); - $data = pack('vvvCC', $row, $col, $xfIndex, $value, $isError); - $this->append($header . $data); - - return 0; - } - - const WRITE_FORMULA_NORMAL = 0; - const WRITE_FORMULA_ERRORS = -1; - const WRITE_FORMULA_RANGE = -2; - const WRITE_FORMULA_EXCEPTION = -3; - - /** - * Write a formula to the specified row and column (zero indexed). - * The textual representation of the formula is passed to the parser in - * Parser.php which returns a packed binary string. - * - * Returns 0 : WRITE_FORMULA_NORMAL normal termination - * -1 : WRITE_FORMULA_ERRORS formula errors (bad formula) - * -2 : WRITE_FORMULA_RANGE row or column out of range - * -3 : WRITE_FORMULA_EXCEPTION parse raised exception, probably due to definedname - * - * @param int $row Zero indexed row - * @param int $col Zero indexed column - * @param string $formula The formula text string - * @param mixed $xfIndex The XF format index - * @param mixed $calculatedValue Calculated value - * - * @return int - */ - private function writeFormula($row, $col, $formula, $xfIndex, $calculatedValue) - { - $record = 0x0006; // Record identifier - // Initialize possible additional value for STRING record that should be written after the FORMULA record? - $stringValue = null; - - // calculated value - if (isset($calculatedValue)) { - // Since we can't yet get the data type of the calculated value, - // we use best effort to determine data type - if (is_bool($calculatedValue)) { - // Boolean value - $num = pack('CCCvCv', 0x01, 0x00, (int) $calculatedValue, 0x00, 0x00, 0xFFFF); - } elseif (is_int($calculatedValue) || is_float($calculatedValue)) { - // Numeric value - $num = pack('d', $calculatedValue); - } elseif (is_string($calculatedValue)) { - $errorCodes = DataType::getErrorCodes(); - if (isset($errorCodes[$calculatedValue])) { - // Error value - $num = pack('CCCvCv', 0x02, 0x00, self::mapErrorCode($calculatedValue), 0x00, 0x00, 0xFFFF); - } elseif ($calculatedValue === '') { - // Empty string (and BIFF8) - $num = pack('CCCvCv', 0x03, 0x00, 0x00, 0x00, 0x00, 0xFFFF); - } else { - // Non-empty string value (or empty string BIFF5) - $stringValue = $calculatedValue; - $num = pack('CCCvCv', 0x00, 0x00, 0x00, 0x00, 0x00, 0xFFFF); - } - } else { - // We are really not supposed to reach here - $num = pack('d', 0x00); - } - } else { - $num = pack('d', 0x00); - } - - $grbit = 0x03; // Option flags - $unknown = 0x0000; // Must be zero - - // Strip the '=' or '@' sign at the beginning of the formula string - if ($formula[0] == '=') { - $formula = substr($formula, 1); - } else { - // Error handling - $this->writeString($row, $col, 'Unrecognised character for formula', 0); - - return self::WRITE_FORMULA_ERRORS; - } - - // Parse the formula using the parser in Parser.php - try { - $error = $this->parser->parse($formula); - $formula = $this->parser->toReversePolish(); - - $formlen = strlen($formula); // Length of the binary string - $length = 0x16 + $formlen; // Length of the record data - - $header = pack('vv', $record, $length); - - $data = pack('vvv', $row, $col, $xfIndex) - . $num - . pack('vVv', $grbit, $unknown, $formlen); - $this->append($header . $data . $formula); - - // Append also a STRING record if necessary - if ($stringValue !== null) { - $this->writeStringRecord($stringValue); - } - - return self::WRITE_FORMULA_NORMAL; - } catch (PhpSpreadsheetException $e) { - return self::WRITE_FORMULA_EXCEPTION; - } - } - - /** - * Write a STRING record. This. - * - * @param string $stringValue - */ - private function writeStringRecord($stringValue): void - { - $record = 0x0207; // Record identifier - $data = StringHelper::UTF8toBIFF8UnicodeLong($stringValue); - - $length = strlen($data); - $header = pack('vv', $record, $length); - - $this->append($header . $data); - } - - /** - * Write a hyperlink. - * This is comprised of two elements: the visible label and - * the invisible link. The visible label is the same as the link unless an - * alternative string is specified. The label is written using the - * writeString() method. Therefore the 255 characters string limit applies. - * $string and $format are optional. - * - * The hyperlink can be to a http, ftp, mail, internal sheet (not yet), or external - * directory url. - * - * Returns 0 : normal termination - * -2 : row or column out of range - * -3 : long string truncated to 255 chars - * - * @param int $row Row - * @param int $col Column - * @param string $url URL string - * - * @return int - */ - private function writeUrl($row, $col, $url) - { - // Add start row and col to arg list - return $this->writeUrlRange($row, $col, $row, $col, $url); - } - - /** - * This is the more general form of writeUrl(). It allows a hyperlink to be - * written to a range of cells. This function also decides the type of hyperlink - * to be written. These are either, Web (http, ftp, mailto), Internal - * (Sheet1!A1) or external ('c:\temp\foo.xls#Sheet1!A1'). - * - * @param int $row1 Start row - * @param int $col1 Start column - * @param int $row2 End row - * @param int $col2 End column - * @param string $url URL string - * - * @return int - * - * @see writeUrl() - */ - public function writeUrlRange($row1, $col1, $row2, $col2, $url) - { - // Check for internal/external sheet links or default to web link - if (preg_match('[^internal:]', $url)) { - return $this->writeUrlInternal($row1, $col1, $row2, $col2, $url); - } - if (preg_match('[^external:]', $url)) { - return $this->writeUrlExternal($row1, $col1, $row2, $col2, $url); - } - - return $this->writeUrlWeb($row1, $col1, $row2, $col2, $url); - } - - /** - * Used to write http, ftp and mailto hyperlinks. - * The link type ($options) is 0x03 is the same as absolute dir ref without - * sheet. However it is differentiated by the $unknown2 data stream. - * - * @param int $row1 Start row - * @param int $col1 Start column - * @param int $row2 End row - * @param int $col2 End column - * @param string $url URL string - * - * @return int - * - * @see writeUrl() - */ - public function writeUrlWeb($row1, $col1, $row2, $col2, $url) - { - $record = 0x01B8; // Record identifier - $length = 0x00000; // Bytes to follow - - // Pack the undocumented parts of the hyperlink stream - $unknown1 = pack('H*', 'D0C9EA79F9BACE118C8200AA004BA90B02000000'); - $unknown2 = pack('H*', 'E0C9EA79F9BACE118C8200AA004BA90B'); - - // Pack the option flags - $options = pack('V', 0x03); - - // Convert URL to a null terminated wchar string - $url = implode("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); - $url = $url . "\0\0\0"; - - // Pack the length of the URL - $url_len = pack('V', strlen($url)); - - // Calculate the data length - $length = 0x34 + strlen($url); - - // Pack the header data - $header = pack('vv', $record, $length); - $data = pack('vvvv', $row1, $row2, $col1, $col2); - - // Write the packed data - $this->append($header . $data . $unknown1 . $options . $unknown2 . $url_len . $url); - - return 0; - } - - /** - * Used to write internal reference hyperlinks such as "Sheet1!A1". - * - * @param int $row1 Start row - * @param int $col1 Start column - * @param int $row2 End row - * @param int $col2 End column - * @param string $url URL string - * - * @return int - * - * @see writeUrl() - */ - public function writeUrlInternal($row1, $col1, $row2, $col2, $url) - { - $record = 0x01B8; // Record identifier - $length = 0x00000; // Bytes to follow - - // Strip URL type - $url = preg_replace('/^internal:/', '', $url); - - // Pack the undocumented parts of the hyperlink stream - $unknown1 = pack('H*', 'D0C9EA79F9BACE118C8200AA004BA90B02000000'); - - // Pack the option flags - $options = pack('V', 0x08); - - // Convert the URL type and to a null terminated wchar string - $url .= "\0"; - - // character count - $url_len = StringHelper::countCharacters($url); - $url_len = pack('V', $url_len); - - $url = StringHelper::convertEncoding($url, 'UTF-16LE', 'UTF-8'); - - // Calculate the data length - $length = 0x24 + strlen($url); - - // Pack the header data - $header = pack('vv', $record, $length); - $data = pack('vvvv', $row1, $row2, $col1, $col2); - - // Write the packed data - $this->append($header . $data . $unknown1 . $options . $url_len . $url); - - return 0; - } - - /** - * Write links to external directory names such as 'c:\foo.xls', - * c:\foo.xls#Sheet1!A1', '../../foo.xls'. and '../../foo.xls#Sheet1!A1'. - * - * Note: Excel writes some relative links with the $dir_long string. We ignore - * these cases for the sake of simpler code. - * - * @param int $row1 Start row - * @param int $col1 Start column - * @param int $row2 End row - * @param int $col2 End column - * @param string $url URL string - * - * @return int - * - * @see writeUrl() - */ - public function writeUrlExternal($row1, $col1, $row2, $col2, $url) - { - // Network drives are different. We will handle them separately - // MS/Novell network drives and shares start with \\ - if (preg_match('[^external:\\\\]', $url)) { - return; //($this->writeUrlExternal_net($row1, $col1, $row2, $col2, $url, $str, $format)); - } - - $record = 0x01B8; // Record identifier - $length = 0x00000; // Bytes to follow - - // Strip URL type and change Unix dir separator to Dos style (if needed) - // - $url = preg_replace('/^external:/', '', $url); - $url = preg_replace('/\//', '\\', $url); - - // Determine if the link is relative or absolute: - // relative if link contains no dir separator, "somefile.xls" - // relative if link starts with up-dir, "..\..\somefile.xls" - // otherwise, absolute - - $absolute = 0x00; // relative path - if (preg_match('/^[A-Z]:/', $url)) { - $absolute = 0x02; // absolute path on Windows, e.g. C:\... - } - $link_type = 0x01 | $absolute; - - // Determine if the link contains a sheet reference and change some of the - // parameters accordingly. - // Split the dir name and sheet name (if it exists) - $dir_long = $url; - if (preg_match('/\\#/', $url)) { - $link_type |= 0x08; - } - - // Pack the link type - $link_type = pack('V', $link_type); - - // Calculate the up-level dir count e.g.. (..\..\..\ == 3) - $up_count = preg_match_all('/\\.\\.\\\\/', $dir_long, $useless); - $up_count = pack('v', $up_count); - - // Store the short dos dir name (null terminated) - $dir_short = preg_replace('/\\.\\.\\\\/', '', $dir_long) . "\0"; - - // Store the long dir name as a wchar string (non-null terminated) - $dir_long = $dir_long . "\0"; - - // Pack the lengths of the dir strings - $dir_short_len = pack('V', strlen($dir_short)); - $dir_long_len = pack('V', strlen($dir_long)); - $stream_len = pack('V', 0); //strlen($dir_long) + 0x06); - - // Pack the undocumented parts of the hyperlink stream - $unknown1 = pack('H*', 'D0C9EA79F9BACE118C8200AA004BA90B02000000'); - $unknown2 = pack('H*', '0303000000000000C000000000000046'); - $unknown3 = pack('H*', 'FFFFADDE000000000000000000000000000000000000000'); - $unknown4 = pack('v', 0x03); - - // Pack the main data stream - $data = pack('vvvv', $row1, $row2, $col1, $col2) . - $unknown1 . - $link_type . - $unknown2 . - $up_count . - $dir_short_len . - $dir_short . - $unknown3 . - $stream_len; /*. - $dir_long_len . - $unknown4 . - $dir_long . - $sheet_len . - $sheet ;*/ - - // Pack the header data - $length = strlen($data); - $header = pack('vv', $record, $length); - - // Write the packed data - $this->append($header . $data); - - return 0; - } - - /** - * This method is used to set the height and format for a row. - * - * @param int $row The row to set - * @param int $height Height we are giving to the row. - * Use null to set XF without setting height - * @param int $xfIndex The optional cell style Xf index to apply to the columns - * @param bool $hidden The optional hidden attribute - * @param int $level The optional outline level for row, in range [0,7] - */ - private function writeRow($row, $height, $xfIndex, $hidden = false, $level = 0): void - { - $record = 0x0208; // Record identifier - $length = 0x0010; // Number of bytes to follow - - $colMic = 0x0000; // First defined column - $colMac = 0x0000; // Last defined column - $irwMac = 0x0000; // Used by Excel to optimise loading - $reserved = 0x0000; // Reserved - $grbit = 0x0000; // Option flags - $ixfe = $xfIndex; - - if ($height < 0) { - $height = null; - } - - // Use writeRow($row, null, $XF) to set XF format without setting height - if ($height != null) { - $miyRw = $height * 20; // row height - } else { - $miyRw = 0xff; // default row height is 256 - } - - // Set the options flags. fUnsynced is used to show that the font and row - // heights are not compatible. This is usually the case for WriteExcel. - // The collapsed flag 0x10 doesn't seem to be used to indicate that a row - // is collapsed. Instead it is used to indicate that the previous row is - // collapsed. The zero height flag, 0x20, is used to collapse a row. - - $grbit |= $level; - if ($hidden) { - $grbit |= 0x0030; - } - if ($height !== null) { - $grbit |= 0x0040; // fUnsynced - } - if ($xfIndex !== 0xF) { - $grbit |= 0x0080; - } - $grbit |= 0x0100; - - $header = pack('vv', $record, $length); - $data = pack('vvvvvvvv', $row, $colMic, $colMac, $miyRw, $irwMac, $reserved, $grbit, $ixfe); - $this->append($header . $data); - } - - /** - * Writes Excel DIMENSIONS to define the area in which there is data. - */ - private function writeDimensions(): void - { - $record = 0x0200; // Record identifier - - $length = 0x000E; - $data = pack('VVvvv', $this->firstRowIndex, $this->lastRowIndex + 1, $this->firstColumnIndex, $this->lastColumnIndex + 1, 0x0000); // reserved - - $header = pack('vv', $record, $length); - $this->append($header . $data); - } - - /** - * Write BIFF record Window2. - */ - private function writeWindow2(): void - { - $record = 0x023E; // Record identifier - $length = 0x0012; - - $grbit = 0x00B6; // Option flags - $rwTop = 0x0000; // Top row visible in window - $colLeft = 0x0000; // Leftmost column visible in window - - // The options flags that comprise $grbit - $fDspFmla = 0; // 0 - bit - $fDspGrid = $this->phpSheet->getShowGridlines() ? 1 : 0; // 1 - $fDspRwCol = $this->phpSheet->getShowRowColHeaders() ? 1 : 0; // 2 - $fFrozen = $this->phpSheet->getFreezePane() ? 1 : 0; // 3 - $fDspZeros = 1; // 4 - $fDefaultHdr = 1; // 5 - $fArabic = $this->phpSheet->getRightToLeft() ? 1 : 0; // 6 - $fDspGuts = $this->outlineOn; // 7 - $fFrozenNoSplit = 0; // 0 - bit - // no support in PhpSpreadsheet for selected sheet, therefore sheet is only selected if it is the active sheet - $fSelected = ($this->phpSheet === $this->phpSheet->getParent()->getActiveSheet()) ? 1 : 0; - $fPageBreakPreview = $this->phpSheet->getSheetView()->getView() === SheetView::SHEETVIEW_PAGE_BREAK_PREVIEW; - - $grbit = $fDspFmla; - $grbit |= $fDspGrid << 1; - $grbit |= $fDspRwCol << 2; - $grbit |= $fFrozen << 3; - $grbit |= $fDspZeros << 4; - $grbit |= $fDefaultHdr << 5; - $grbit |= $fArabic << 6; - $grbit |= $fDspGuts << 7; - $grbit |= $fFrozenNoSplit << 8; - $grbit |= $fSelected << 9; // Selected sheets. - $grbit |= $fSelected << 10; // Active sheet. - $grbit |= $fPageBreakPreview << 11; - - $header = pack('vv', $record, $length); - $data = pack('vvv', $grbit, $rwTop, $colLeft); - - // FIXME !!! - $rgbHdr = 0x0040; // Row/column heading and gridline color index - $zoom_factor_page_break = ($fPageBreakPreview ? $this->phpSheet->getSheetView()->getZoomScale() : 0x0000); - $zoom_factor_normal = $this->phpSheet->getSheetView()->getZoomScaleNormal(); - - $data .= pack('vvvvV', $rgbHdr, 0x0000, $zoom_factor_page_break, $zoom_factor_normal, 0x00000000); - - $this->append($header . $data); - } - - /** - * Write BIFF record DEFAULTROWHEIGHT. - */ - private function writeDefaultRowHeight(): void - { - $defaultRowHeight = $this->phpSheet->getDefaultRowDimension()->getRowHeight(); - - if ($defaultRowHeight < 0) { - return; - } - - // convert to twips - $defaultRowHeight = (int) 20 * $defaultRowHeight; - - $record = 0x0225; // Record identifier - $length = 0x0004; // Number of bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('vv', 1, $defaultRowHeight); - $this->append($header . $data); - } - - /** - * Write BIFF record DEFCOLWIDTH if COLINFO records are in use. - */ - private function writeDefcol(): void - { - $defaultColWidth = 8; - - $record = 0x0055; // Record identifier - $length = 0x0002; // Number of bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('v', $defaultColWidth); - $this->append($header . $data); - } - - /** - * Write BIFF record COLINFO to define column widths. - * - * Note: The SDK says the record length is 0x0B but Excel writes a 0x0C - * length record. - * - * @param array $col_array This is the only parameter received and is composed of the following: - * 0 => First formatted column, - * 1 => Last formatted column, - * 2 => Col width (8.43 is Excel default), - * 3 => The optional XF format of the column, - * 4 => Option flags. - * 5 => Optional outline level - */ - private function writeColinfo($col_array): void - { - if (isset($col_array[0])) { - $colFirst = $col_array[0]; - } - if (isset($col_array[1])) { - $colLast = $col_array[1]; - } - if (isset($col_array[2])) { - $coldx = $col_array[2]; - } else { - $coldx = 8.43; - } - if (isset($col_array[3])) { - $xfIndex = $col_array[3]; - } else { - $xfIndex = 15; - } - if (isset($col_array[4])) { - $grbit = $col_array[4]; - } else { - $grbit = 0; - } - if (isset($col_array[5])) { - $level = $col_array[5]; - } else { - $level = 0; - } - $record = 0x007D; // Record identifier - $length = 0x000C; // Number of bytes to follow - - $coldx *= 256; // Convert to units of 1/256 of a char - - $ixfe = $xfIndex; - $reserved = 0x0000; // Reserved - - $level = max(0, min($level, 7)); - $grbit |= $level << 8; - - $header = pack('vv', $record, $length); - $data = pack('vvvvvv', $colFirst, $colLast, $coldx, $ixfe, $grbit, $reserved); - $this->append($header . $data); - } - - /** - * Write BIFF record SELECTION. - */ - private function writeSelection(): void - { - // look up the selected cell range - $selectedCells = Coordinate::splitRange($this->phpSheet->getSelectedCells()); - $selectedCells = $selectedCells[0]; - if (count($selectedCells) == 2) { - [$first, $last] = $selectedCells; - } else { - $first = $selectedCells[0]; - $last = $selectedCells[0]; - } - - [$colFirst, $rwFirst] = Coordinate::coordinateFromString($first); - $colFirst = Coordinate::columnIndexFromString($colFirst) - 1; // base 0 column index - --$rwFirst; // base 0 row index - - [$colLast, $rwLast] = Coordinate::coordinateFromString($last); - $colLast = Coordinate::columnIndexFromString($colLast) - 1; // base 0 column index - --$rwLast; // base 0 row index - - // make sure we are not out of bounds - $colFirst = min($colFirst, 255); - $colLast = min($colLast, 255); - - $rwFirst = min($rwFirst, 65535); - $rwLast = min($rwLast, 65535); - - $record = 0x001D; // Record identifier - $length = 0x000F; // Number of bytes to follow - - $pnn = $this->activePane; // Pane position - $rwAct = $rwFirst; // Active row - $colAct = $colFirst; // Active column - $irefAct = 0; // Active cell ref - $cref = 1; // Number of refs - - if (!isset($rwLast)) { - $rwLast = $rwFirst; // Last row in reference - } - if (!isset($colLast)) { - $colLast = $colFirst; // Last col in reference - } - - // Swap last row/col for first row/col as necessary - if ($rwFirst > $rwLast) { - [$rwFirst, $rwLast] = [$rwLast, $rwFirst]; - } - - if ($colFirst > $colLast) { - [$colFirst, $colLast] = [$colLast, $colFirst]; - } - - $header = pack('vv', $record, $length); - $data = pack('CvvvvvvCC', $pnn, $rwAct, $colAct, $irefAct, $cref, $rwFirst, $rwLast, $colFirst, $colLast); - $this->append($header . $data); - } - - /** - * Store the MERGEDCELLS records for all ranges of merged cells. - */ - private function writeMergedCells(): void - { - $mergeCells = $this->phpSheet->getMergeCells(); - $countMergeCells = count($mergeCells); - - if ($countMergeCells == 0) { - return; - } - - // maximum allowed number of merged cells per record - $maxCountMergeCellsPerRecord = 1027; - - // record identifier - $record = 0x00E5; - - // counter for total number of merged cells treated so far by the writer - $i = 0; - - // counter for number of merged cells written in record currently being written - $j = 0; - - // initialize record data - $recordData = ''; - - // loop through the merged cells - foreach ($mergeCells as $mergeCell) { - ++$i; - ++$j; - - // extract the row and column indexes - $range = Coordinate::splitRange($mergeCell); - [$first, $last] = $range[0]; - [$firstColumn, $firstRow] = Coordinate::coordinateFromString($first); - [$lastColumn, $lastRow] = Coordinate::coordinateFromString($last); - - $recordData .= pack('vvvv', $firstRow - 1, $lastRow - 1, Coordinate::columnIndexFromString($firstColumn) - 1, Coordinate::columnIndexFromString($lastColumn) - 1); - - // flush record if we have reached limit for number of merged cells, or reached final merged cell - if ($j == $maxCountMergeCellsPerRecord || $i == $countMergeCells) { - $recordData = pack('v', $j) . $recordData; - $length = strlen($recordData); - $header = pack('vv', $record, $length); - $this->append($header . $recordData); - - // initialize for next record, if any - $recordData = ''; - $j = 0; - } - } - } - - /** - * Write SHEETLAYOUT record. - */ - private function writeSheetLayout(): void - { - if (!$this->phpSheet->isTabColorSet()) { - return; - } - - $recordData = pack( - 'vvVVVvv', - 0x0862, - 0x0000, // unused - 0x00000000, // unused - 0x00000000, // unused - 0x00000014, // size of record data - $this->colors[$this->phpSheet->getTabColor()->getRGB()], // color index - 0x0000 // unused - ); - - $length = strlen($recordData); - - $record = 0x0862; // Record identifier - $header = pack('vv', $record, $length); - $this->append($header . $recordData); - } - - /** - * Write SHEETPROTECTION. - */ - private function writeSheetProtection(): void - { - // record identifier - $record = 0x0867; - - // prepare options - $options = (int) !$this->phpSheet->getProtection()->getObjects() - | (int) !$this->phpSheet->getProtection()->getScenarios() << 1 - | (int) !$this->phpSheet->getProtection()->getFormatCells() << 2 - | (int) !$this->phpSheet->getProtection()->getFormatColumns() << 3 - | (int) !$this->phpSheet->getProtection()->getFormatRows() << 4 - | (int) !$this->phpSheet->getProtection()->getInsertColumns() << 5 - | (int) !$this->phpSheet->getProtection()->getInsertRows() << 6 - | (int) !$this->phpSheet->getProtection()->getInsertHyperlinks() << 7 - | (int) !$this->phpSheet->getProtection()->getDeleteColumns() << 8 - | (int) !$this->phpSheet->getProtection()->getDeleteRows() << 9 - | (int) !$this->phpSheet->getProtection()->getSelectLockedCells() << 10 - | (int) !$this->phpSheet->getProtection()->getSort() << 11 - | (int) !$this->phpSheet->getProtection()->getAutoFilter() << 12 - | (int) !$this->phpSheet->getProtection()->getPivotTables() << 13 - | (int) !$this->phpSheet->getProtection()->getSelectUnlockedCells() << 14; - - // record data - $recordData = pack( - 'vVVCVVvv', - 0x0867, // repeated record identifier - 0x0000, // not used - 0x0000, // not used - 0x00, // not used - 0x01000200, // unknown data - 0xFFFFFFFF, // unknown data - $options, // options - 0x0000 // not used - ); - - $length = strlen($recordData); - $header = pack('vv', $record, $length); - - $this->append($header . $recordData); - } - - /** - * Write BIFF record RANGEPROTECTION. - * - * Openoffice.org's Documentaion of the Microsoft Excel File Format uses term RANGEPROTECTION for these records - * Microsoft Office Excel 97-2007 Binary File Format Specification uses term FEAT for these records - */ - private function writeRangeProtection(): void - { - foreach ($this->phpSheet->getProtectedCells() as $range => $password) { - // number of ranges, e.g. 'A1:B3 C20:D25' - $cellRanges = explode(' ', $range); - $cref = count($cellRanges); - - $recordData = pack( - 'vvVVvCVvVv', - 0x0868, - 0x00, - 0x0000, - 0x0000, - 0x02, - 0x0, - 0x0000, - $cref, - 0x0000, - 0x00 - ); - - foreach ($cellRanges as $cellRange) { - $recordData .= $this->writeBIFF8CellRangeAddressFixed($cellRange); - } - - // the rgbFeat structure - $recordData .= pack( - 'VV', - 0x0000, - hexdec($password) - ); - - $recordData .= StringHelper::UTF8toBIFF8UnicodeLong('p' . md5($recordData)); - - $length = strlen($recordData); - - $record = 0x0868; // Record identifier - $header = pack('vv', $record, $length); - $this->append($header . $recordData); - } - } - - /** - * Writes the Excel BIFF PANE record. - * The panes can either be frozen or thawed (unfrozen). - * Frozen panes are specified in terms of an integer number of rows and columns. - * Thawed panes are specified in terms of Excel's units for rows and columns. - */ - private function writePanes(): void - { - $panes = []; - if ($this->phpSheet->getFreezePane()) { - [$column, $row] = Coordinate::coordinateFromString($this->phpSheet->getFreezePane()); - $panes[0] = Coordinate::columnIndexFromString($column) - 1; - $panes[1] = $row - 1; - - [$leftMostColumn, $topRow] = Coordinate::coordinateFromString($this->phpSheet->getTopLeftCell()); - //Coordinates are zero-based in xls files - $panes[2] = $topRow - 1; - $panes[3] = Coordinate::columnIndexFromString($leftMostColumn) - 1; - } else { - // thaw panes - return; - } - - $x = $panes[0] ?? null; - $y = $panes[1] ?? null; - $rwTop = $panes[2] ?? null; - $colLeft = $panes[3] ?? null; - if (count($panes) > 4) { // if Active pane was received - $pnnAct = $panes[4]; - } else { - $pnnAct = null; - } - $record = 0x0041; // Record identifier - $length = 0x000A; // Number of bytes to follow - - // Code specific to frozen or thawed panes. - if ($this->phpSheet->getFreezePane()) { - // Set default values for $rwTop and $colLeft - if (!isset($rwTop)) { - $rwTop = $y; - } - if (!isset($colLeft)) { - $colLeft = $x; - } - } else { - // Set default values for $rwTop and $colLeft - if (!isset($rwTop)) { - $rwTop = 0; - } - if (!isset($colLeft)) { - $colLeft = 0; - } - - // Convert Excel's row and column units to the internal units. - // The default row height is 12.75 - // The default column width is 8.43 - // The following slope and intersection values were interpolated. - // - $y = 20 * $y + 255; - $x = 113.879 * $x + 390; - } - - // Determine which pane should be active. There is also the undocumented - // option to override this should it be necessary: may be removed later. - // - if (!isset($pnnAct)) { - if ($x != 0 && $y != 0) { - $pnnAct = 0; // Bottom right - } - if ($x != 0 && $y == 0) { - $pnnAct = 1; // Top right - } - if ($x == 0 && $y != 0) { - $pnnAct = 2; // Bottom left - } - if ($x == 0 && $y == 0) { - $pnnAct = 3; // Top left - } - } - - $this->activePane = $pnnAct; // Used in writeSelection - - $header = pack('vv', $record, $length); - $data = pack('vvvvv', $x, $y, $rwTop, $colLeft, $pnnAct); - $this->append($header . $data); - } - - /** - * Store the page setup SETUP BIFF record. - */ - private function writeSetup(): void - { - $record = 0x00A1; // Record identifier - $length = 0x0022; // Number of bytes to follow - - $iPaperSize = $this->phpSheet->getPageSetup()->getPaperSize(); // Paper size - - $iScale = $this->phpSheet->getPageSetup()->getScale() ? - $this->phpSheet->getPageSetup()->getScale() : 100; // Print scaling factor - - $iPageStart = 0x01; // Starting page number - $iFitWidth = (int) $this->phpSheet->getPageSetup()->getFitToWidth(); // Fit to number of pages wide - $iFitHeight = (int) $this->phpSheet->getPageSetup()->getFitToHeight(); // Fit to number of pages high - $grbit = 0x00; // Option flags - $iRes = 0x0258; // Print resolution - $iVRes = 0x0258; // Vertical print resolution - - $numHdr = $this->phpSheet->getPageMargins()->getHeader(); // Header Margin - - $numFtr = $this->phpSheet->getPageMargins()->getFooter(); // Footer Margin - $iCopies = 0x01; // Number of copies - - // Order of printing pages - $fLeftToRight = $this->phpSheet->getPageSetup()->getPageOrder() === PageSetup::PAGEORDER_DOWN_THEN_OVER - ? 0x1 : 0x0; - // Page orientation - $fLandscape = ($this->phpSheet->getPageSetup()->getOrientation() == PageSetup::ORIENTATION_LANDSCAPE) - ? 0x0 : 0x1; - - $fNoPls = 0x0; // Setup not read from printer - $fNoColor = 0x0; // Print black and white - $fDraft = 0x0; // Print draft quality - $fNotes = 0x0; // Print notes - $fNoOrient = 0x0; // Orientation not set - $fUsePage = 0x0; // Use custom starting page - - $grbit = $fLeftToRight; - $grbit |= $fLandscape << 1; - $grbit |= $fNoPls << 2; - $grbit |= $fNoColor << 3; - $grbit |= $fDraft << 4; - $grbit |= $fNotes << 5; - $grbit |= $fNoOrient << 6; - $grbit |= $fUsePage << 7; - - $numHdr = pack('d', $numHdr); - $numFtr = pack('d', $numFtr); - if (self::getByteOrder()) { // if it's Big Endian - $numHdr = strrev($numHdr); - $numFtr = strrev($numFtr); - } - - $header = pack('vv', $record, $length); - $data1 = pack('vvvvvvvv', $iPaperSize, $iScale, $iPageStart, $iFitWidth, $iFitHeight, $grbit, $iRes, $iVRes); - $data2 = $numHdr . $numFtr; - $data3 = pack('v', $iCopies); - $this->append($header . $data1 . $data2 . $data3); - } - - /** - * Store the header caption BIFF record. - */ - private function writeHeader(): void - { - $record = 0x0014; // Record identifier - - /* removing for now - // need to fix character count (multibyte!) - if (strlen($this->phpSheet->getHeaderFooter()->getOddHeader()) <= 255) { - $str = $this->phpSheet->getHeaderFooter()->getOddHeader(); // header string - } else { - $str = ''; - } - */ - - $recordData = StringHelper::UTF8toBIFF8UnicodeLong($this->phpSheet->getHeaderFooter()->getOddHeader()); - $length = strlen($recordData); - - $header = pack('vv', $record, $length); - - $this->append($header . $recordData); - } - - /** - * Store the footer caption BIFF record. - */ - private function writeFooter(): void - { - $record = 0x0015; // Record identifier - - /* removing for now - // need to fix character count (multibyte!) - if (strlen($this->phpSheet->getHeaderFooter()->getOddFooter()) <= 255) { - $str = $this->phpSheet->getHeaderFooter()->getOddFooter(); - } else { - $str = ''; - } - */ - - $recordData = StringHelper::UTF8toBIFF8UnicodeLong($this->phpSheet->getHeaderFooter()->getOddFooter()); - $length = strlen($recordData); - - $header = pack('vv', $record, $length); - - $this->append($header . $recordData); - } - - /** - * Store the horizontal centering HCENTER BIFF record. - */ - private function writeHcenter(): void - { - $record = 0x0083; // Record identifier - $length = 0x0002; // Bytes to follow - - $fHCenter = $this->phpSheet->getPageSetup()->getHorizontalCentered() ? 1 : 0; // Horizontal centering - - $header = pack('vv', $record, $length); - $data = pack('v', $fHCenter); - - $this->append($header . $data); - } - - /** - * Store the vertical centering VCENTER BIFF record. - */ - private function writeVcenter(): void - { - $record = 0x0084; // Record identifier - $length = 0x0002; // Bytes to follow - - $fVCenter = $this->phpSheet->getPageSetup()->getVerticalCentered() ? 1 : 0; // Horizontal centering - - $header = pack('vv', $record, $length); - $data = pack('v', $fVCenter); - $this->append($header . $data); - } - - /** - * Store the LEFTMARGIN BIFF record. - */ - private function writeMarginLeft(): void - { - $record = 0x0026; // Record identifier - $length = 0x0008; // Bytes to follow - - $margin = $this->phpSheet->getPageMargins()->getLeft(); // Margin in inches - - $header = pack('vv', $record, $length); - $data = pack('d', $margin); - if (self::getByteOrder()) { // if it's Big Endian - $data = strrev($data); - } - - $this->append($header . $data); - } - - /** - * Store the RIGHTMARGIN BIFF record. - */ - private function writeMarginRight(): void - { - $record = 0x0027; // Record identifier - $length = 0x0008; // Bytes to follow - - $margin = $this->phpSheet->getPageMargins()->getRight(); // Margin in inches - - $header = pack('vv', $record, $length); - $data = pack('d', $margin); - if (self::getByteOrder()) { // if it's Big Endian - $data = strrev($data); - } - - $this->append($header . $data); - } - - /** - * Store the TOPMARGIN BIFF record. - */ - private function writeMarginTop(): void - { - $record = 0x0028; // Record identifier - $length = 0x0008; // Bytes to follow - - $margin = $this->phpSheet->getPageMargins()->getTop(); // Margin in inches - - $header = pack('vv', $record, $length); - $data = pack('d', $margin); - if (self::getByteOrder()) { // if it's Big Endian - $data = strrev($data); - } - - $this->append($header . $data); - } - - /** - * Store the BOTTOMMARGIN BIFF record. - */ - private function writeMarginBottom(): void - { - $record = 0x0029; // Record identifier - $length = 0x0008; // Bytes to follow - - $margin = $this->phpSheet->getPageMargins()->getBottom(); // Margin in inches - - $header = pack('vv', $record, $length); - $data = pack('d', $margin); - if (self::getByteOrder()) { // if it's Big Endian - $data = strrev($data); - } - - $this->append($header . $data); - } - - /** - * Write the PRINTHEADERS BIFF record. - */ - private function writePrintHeaders(): void - { - $record = 0x002a; // Record identifier - $length = 0x0002; // Bytes to follow - - $fPrintRwCol = $this->printHeaders; // Boolean flag - - $header = pack('vv', $record, $length); - $data = pack('v', $fPrintRwCol); - $this->append($header . $data); - } - - /** - * Write the PRINTGRIDLINES BIFF record. Must be used in conjunction with the - * GRIDSET record. - */ - private function writePrintGridlines(): void - { - $record = 0x002b; // Record identifier - $length = 0x0002; // Bytes to follow - - $fPrintGrid = $this->phpSheet->getPrintGridlines() ? 1 : 0; // Boolean flag - - $header = pack('vv', $record, $length); - $data = pack('v', $fPrintGrid); - $this->append($header . $data); - } - - /** - * Write the GRIDSET BIFF record. Must be used in conjunction with the - * PRINTGRIDLINES record. - */ - private function writeGridset(): void - { - $record = 0x0082; // Record identifier - $length = 0x0002; // Bytes to follow - - $fGridSet = !$this->phpSheet->getPrintGridlines(); // Boolean flag - - $header = pack('vv', $record, $length); - $data = pack('v', $fGridSet); - $this->append($header . $data); - } - - /** - * Write the AUTOFILTERINFO BIFF record. This is used to configure the number of autofilter select used in the sheet. - */ - private function writeAutoFilterInfo(): void - { - $record = 0x009D; // Record identifier - $length = 0x0002; // Bytes to follow - - $rangeBounds = Coordinate::rangeBoundaries($this->phpSheet->getAutoFilter()->getRange()); - $iNumFilters = 1 + $rangeBounds[1][0] - $rangeBounds[0][0]; - - $header = pack('vv', $record, $length); - $data = pack('v', $iNumFilters); - $this->append($header . $data); - } - - /** - * Write the GUTS BIFF record. This is used to configure the gutter margins - * where Excel outline symbols are displayed. The visibility of the gutters is - * controlled by a flag in WSBOOL. - * - * @see writeWsbool() - */ - private function writeGuts(): void - { - $record = 0x0080; // Record identifier - $length = 0x0008; // Bytes to follow - - $dxRwGut = 0x0000; // Size of row gutter - $dxColGut = 0x0000; // Size of col gutter - - // determine maximum row outline level - $maxRowOutlineLevel = 0; - foreach ($this->phpSheet->getRowDimensions() as $rowDimension) { - $maxRowOutlineLevel = max($maxRowOutlineLevel, $rowDimension->getOutlineLevel()); - } - - $col_level = 0; - - // Calculate the maximum column outline level. The equivalent calculation - // for the row outline level is carried out in writeRow(). - $colcount = count($this->columnInfo); - for ($i = 0; $i < $colcount; ++$i) { - $col_level = max($this->columnInfo[$i][5], $col_level); - } - - // Set the limits for the outline levels (0 <= x <= 7). - $col_level = max(0, min($col_level, 7)); - - // The displayed level is one greater than the max outline levels - if ($maxRowOutlineLevel) { - ++$maxRowOutlineLevel; - } - if ($col_level) { - ++$col_level; - } - - $header = pack('vv', $record, $length); - $data = pack('vvvv', $dxRwGut, $dxColGut, $maxRowOutlineLevel, $col_level); - - $this->append($header . $data); - } - - /** - * Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction - * with the SETUP record. - */ - private function writeWsbool(): void - { - $record = 0x0081; // Record identifier - $length = 0x0002; // Bytes to follow - $grbit = 0x0000; - - // The only option that is of interest is the flag for fit to page. So we - // set all the options in one go. - // - // Set the option flags - $grbit |= 0x0001; // Auto page breaks visible - if ($this->outlineStyle) { - $grbit |= 0x0020; // Auto outline styles - } - if ($this->phpSheet->getShowSummaryBelow()) { - $grbit |= 0x0040; // Outline summary below - } - if ($this->phpSheet->getShowSummaryRight()) { - $grbit |= 0x0080; // Outline summary right - } - if ($this->phpSheet->getPageSetup()->getFitToPage()) { - $grbit |= 0x0100; // Page setup fit to page - } - if ($this->outlineOn) { - $grbit |= 0x0400; // Outline symbols displayed - } - - $header = pack('vv', $record, $length); - $data = pack('v', $grbit); - $this->append($header . $data); - } - - /** - * Write the HORIZONTALPAGEBREAKS and VERTICALPAGEBREAKS BIFF records. - */ - private function writeBreaks(): void - { - // initialize - $vbreaks = []; - $hbreaks = []; - - foreach ($this->phpSheet->getBreaks() as $cell => $breakType) { - // Fetch coordinates - $coordinates = Coordinate::coordinateFromString($cell); - - // Decide what to do by the type of break - switch ($breakType) { - case \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::BREAK_COLUMN: - // Add to list of vertical breaks - $vbreaks[] = Coordinate::columnIndexFromString($coordinates[0]) - 1; - - break; - case \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::BREAK_ROW: - // Add to list of horizontal breaks - $hbreaks[] = $coordinates[1]; - - break; - case \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::BREAK_NONE: - default: - // Nothing to do - break; - } - } - - //horizontal page breaks - if (!empty($hbreaks)) { - // Sort and filter array of page breaks - sort($hbreaks, SORT_NUMERIC); - if ($hbreaks[0] == 0) { // don't use first break if it's 0 - array_shift($hbreaks); - } - - $record = 0x001b; // Record identifier - $cbrk = count($hbreaks); // Number of page breaks - $length = 2 + 6 * $cbrk; // Bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('v', $cbrk); - - // Append each page break - foreach ($hbreaks as $hbreak) { - $data .= pack('vvv', $hbreak, 0x0000, 0x00ff); - } - - $this->append($header . $data); - } - - // vertical page breaks - if (!empty($vbreaks)) { - // 1000 vertical pagebreaks appears to be an internal Excel 5 limit. - // It is slightly higher in Excel 97/200, approx. 1026 - $vbreaks = array_slice($vbreaks, 0, 1000); - - // Sort and filter array of page breaks - sort($vbreaks, SORT_NUMERIC); - if ($vbreaks[0] == 0) { // don't use first break if it's 0 - array_shift($vbreaks); - } - - $record = 0x001a; // Record identifier - $cbrk = count($vbreaks); // Number of page breaks - $length = 2 + 6 * $cbrk; // Bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('v', $cbrk); - - // Append each page break - foreach ($vbreaks as $vbreak) { - $data .= pack('vvv', $vbreak, 0x0000, 0xffff); - } - - $this->append($header . $data); - } - } - - /** - * Set the Biff PROTECT record to indicate that the worksheet is protected. - */ - private function writeProtect(): void - { - // Exit unless sheet protection has been specified - if (!$this->phpSheet->getProtection()->getSheet()) { - return; - } - - $record = 0x0012; // Record identifier - $length = 0x0002; // Bytes to follow - - $fLock = 1; // Worksheet is protected - - $header = pack('vv', $record, $length); - $data = pack('v', $fLock); - - $this->append($header . $data); - } - - /** - * Write SCENPROTECT. - */ - private function writeScenProtect(): void - { - // Exit if sheet protection is not active - if (!$this->phpSheet->getProtection()->getSheet()) { - return; - } - - // Exit if scenarios are not protected - if (!$this->phpSheet->getProtection()->getScenarios()) { - return; - } - - $record = 0x00DD; // Record identifier - $length = 0x0002; // Bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('v', 1); - - $this->append($header . $data); - } - - /** - * Write OBJECTPROTECT. - */ - private function writeObjectProtect(): void - { - // Exit if sheet protection is not active - if (!$this->phpSheet->getProtection()->getSheet()) { - return; - } - - // Exit if objects are not protected - if (!$this->phpSheet->getProtection()->getObjects()) { - return; - } - - $record = 0x0063; // Record identifier - $length = 0x0002; // Bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('v', 1); - - $this->append($header . $data); - } - - /** - * Write the worksheet PASSWORD record. - */ - private function writePassword(): void - { - // Exit unless sheet protection and password have been specified - if (!$this->phpSheet->getProtection()->getSheet() || !$this->phpSheet->getProtection()->getPassword()) { - return; - } - - $record = 0x0013; // Record identifier - $length = 0x0002; // Bytes to follow - - $wPassword = hexdec($this->phpSheet->getProtection()->getPassword()); // Encoded password - - $header = pack('vv', $record, $length); - $data = pack('v', $wPassword); - - $this->append($header . $data); - } - - /** - * Insert a 24bit bitmap image in a worksheet. - * - * @param int $row The row we are going to insert the bitmap into - * @param int $col The column we are going to insert the bitmap into - * @param mixed $bitmap The bitmap filename or GD-image resource - * @param int $x the horizontal position (offset) of the image inside the cell - * @param int $y the vertical position (offset) of the image inside the cell - * @param float $scale_x The horizontal scale - * @param float $scale_y The vertical scale - */ - public function insertBitmap($row, $col, $bitmap, $x = 0, $y = 0, $scale_x = 1, $scale_y = 1): void - { - $bitmap_array = (is_resource($bitmap) ? $this->processBitmapGd($bitmap) : $this->processBitmap($bitmap)); - [$width, $height, $size, $data] = $bitmap_array; - - // Scale the frame of the image. - $width *= $scale_x; - $height *= $scale_y; - - // Calculate the vertices of the image and write the OBJ record - $this->positionImage($col, $row, $x, $y, $width, $height); - - // Write the IMDATA record to store the bitmap data - $record = 0x007f; - $length = 8 + $size; - $cf = 0x09; - $env = 0x01; - $lcb = $size; - - $header = pack('vvvvV', $record, $length, $cf, $env, $lcb); - $this->append($header . $data); - } - - /** - * Calculate the vertices that define the position of the image as required by - * the OBJ record. - * - * +------------+------------+ - * | A | B | - * +-----+------------+------------+ - * | |(x1,y1) | | - * | 1 |(A1)._______|______ | - * | | | | | - * | | | | | - * +-----+----| BITMAP |-----+ - * | | | | | - * | 2 | |______________. | - * | | | (B2)| - * | | | (x2,y2)| - * +---- +------------+------------+ - * - * Example of a bitmap that covers some of the area from cell A1 to cell B2. - * - * Based on the width and height of the bitmap we need to calculate 8 vars: - * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. - * The width and height of the cells are also variable and have to be taken into - * account. - * The values of $col_start and $row_start are passed in from the calling - * function. The values of $col_end and $row_end are calculated by subtracting - * the width and height of the bitmap from the width and height of the - * underlying cells. - * The vertices are expressed as a percentage of the underlying cell width as - * follows (rhs values are in pixels): - * - * x1 = X / W *1024 - * y1 = Y / H *256 - * x2 = (X-1) / W *1024 - * y2 = (Y-1) / H *256 - * - * Where: X is distance from the left side of the underlying cell - * Y is distance from the top of the underlying cell - * W is the width of the cell - * H is the height of the cell - * The SDK incorrectly states that the height should be expressed as a - * percentage of 1024. - * - * @param int $col_start Col containing upper left corner of object - * @param int $row_start Row containing top left corner of object - * @param int $x1 Distance to left side of object - * @param int $y1 Distance to top of object - * @param int $width Width of image frame - * @param int $height Height of image frame - */ - public function positionImage($col_start, $row_start, $x1, $y1, $width, $height): void - { - // Initialise end cell to the same as the start cell - $col_end = $col_start; // Col containing lower right corner of object - $row_end = $row_start; // Row containing bottom right corner of object - - // Zero the specified offset if greater than the cell dimensions - if ($x1 >= Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_start + 1))) { - $x1 = 0; - } - if ($y1 >= Xls::sizeRow($this->phpSheet, $row_start + 1)) { - $y1 = 0; - } - - $width = $width + $x1 - 1; - $height = $height + $y1 - 1; - - // Subtract the underlying cell widths to find the end cell of the image - while ($width >= Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end + 1))) { - $width -= Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end + 1)); - ++$col_end; - } - - // Subtract the underlying cell heights to find the end cell of the image - while ($height >= Xls::sizeRow($this->phpSheet, $row_end + 1)) { - $height -= Xls::sizeRow($this->phpSheet, $row_end + 1); - ++$row_end; - } - - // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell - // with zero eight or width. - // - if (Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_start + 1)) == 0) { - return; - } - if (Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end + 1)) == 0) { - return; - } - if (Xls::sizeRow($this->phpSheet, $row_start + 1) == 0) { - return; - } - if (Xls::sizeRow($this->phpSheet, $row_end + 1) == 0) { - return; - } - - // Convert the pixel values to the percentage value expected by Excel - $x1 = $x1 / Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_start + 1)) * 1024; - $y1 = $y1 / Xls::sizeRow($this->phpSheet, $row_start + 1) * 256; - $x2 = $width / Xls::sizeCol($this->phpSheet, Coordinate::stringFromColumnIndex($col_end + 1)) * 1024; // Distance to right side of object - $y2 = $height / Xls::sizeRow($this->phpSheet, $row_end + 1) * 256; // Distance to bottom of object - - $this->writeObjPicture($col_start, $x1, $row_start, $y1, $col_end, $x2, $row_end, $y2); - } - - /** - * Store the OBJ record that precedes an IMDATA record. This could be generalise - * to support other Excel objects. - * - * @param int $colL Column containing upper left corner of object - * @param int $dxL Distance from left side of cell - * @param int $rwT Row containing top left corner of object - * @param int $dyT Distance from top of cell - * @param int $colR Column containing lower right corner of object - * @param int $dxR Distance from right of cell - * @param int $rwB Row containing bottom right corner of object - * @param int $dyB Distance from bottom of cell - */ - private function writeObjPicture($colL, $dxL, $rwT, $dyT, $colR, $dxR, $rwB, $dyB): void - { - $record = 0x005d; // Record identifier - $length = 0x003c; // Bytes to follow - - $cObj = 0x0001; // Count of objects in file (set to 1) - $OT = 0x0008; // Object type. 8 = Picture - $id = 0x0001; // Object ID - $grbit = 0x0614; // Option flags - - $cbMacro = 0x0000; // Length of FMLA structure - $Reserved1 = 0x0000; // Reserved - $Reserved2 = 0x0000; // Reserved - - $icvBack = 0x09; // Background colour - $icvFore = 0x09; // Foreground colour - $fls = 0x00; // Fill pattern - $fAuto = 0x00; // Automatic fill - $icv = 0x08; // Line colour - $lns = 0xff; // Line style - $lnw = 0x01; // Line weight - $fAutoB = 0x00; // Automatic border - $frs = 0x0000; // Frame style - $cf = 0x0009; // Image format, 9 = bitmap - $Reserved3 = 0x0000; // Reserved - $cbPictFmla = 0x0000; // Length of FMLA structure - $Reserved4 = 0x0000; // Reserved - $grbit2 = 0x0001; // Option flags - $Reserved5 = 0x0000; // Reserved - - $header = pack('vv', $record, $length); - $data = pack('V', $cObj); - $data .= pack('v', $OT); - $data .= pack('v', $id); - $data .= pack('v', $grbit); - $data .= pack('v', $colL); - $data .= pack('v', $dxL); - $data .= pack('v', $rwT); - $data .= pack('v', $dyT); - $data .= pack('v', $colR); - $data .= pack('v', $dxR); - $data .= pack('v', $rwB); - $data .= pack('v', $dyB); - $data .= pack('v', $cbMacro); - $data .= pack('V', $Reserved1); - $data .= pack('v', $Reserved2); - $data .= pack('C', $icvBack); - $data .= pack('C', $icvFore); - $data .= pack('C', $fls); - $data .= pack('C', $fAuto); - $data .= pack('C', $icv); - $data .= pack('C', $lns); - $data .= pack('C', $lnw); - $data .= pack('C', $fAutoB); - $data .= pack('v', $frs); - $data .= pack('V', $cf); - $data .= pack('v', $Reserved3); - $data .= pack('v', $cbPictFmla); - $data .= pack('v', $Reserved4); - $data .= pack('v', $grbit2); - $data .= pack('V', $Reserved5); - - $this->append($header . $data); - } - - /** - * Convert a GD-image into the internal format. - * - * @param resource $image The image to process - * - * @return array Array with data and properties of the bitmap - */ - public function processBitmapGd($image) - { - $width = imagesx($image); - $height = imagesy($image); - - $data = pack('Vvvvv', 0x000c, $width, $height, 0x01, 0x18); - for ($j = $height; --$j;) { - for ($i = 0; $i < $width; ++$i) { - $color = imagecolorsforindex($image, imagecolorat($image, $i, $j)); - foreach (['red', 'green', 'blue'] as $key) { - $color[$key] = $color[$key] + round((255 - $color[$key]) * $color['alpha'] / 127); - } - $data .= chr($color['blue']) . chr($color['green']) . chr($color['red']); - } - if (3 * $width % 4) { - $data .= str_repeat("\x00", 4 - 3 * $width % 4); - } - } - - return [$width, $height, strlen($data), $data]; - } - - /** - * Convert a 24 bit bitmap into the modified internal format used by Windows. - * This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the - * MSDN library. - * - * @param string $bitmap The bitmap to process - * - * @return array Array with data and properties of the bitmap - */ - public function processBitmap($bitmap) - { - // Open file. - $bmp_fd = @fopen($bitmap, 'rb'); - if (!$bmp_fd) { - throw new WriterException("Couldn't import $bitmap"); - } - - // Slurp the file into a string. - $data = fread($bmp_fd, filesize($bitmap)); - - // Check that the file is big enough to be a bitmap. - if (strlen($data) <= 0x36) { - throw new WriterException("$bitmap doesn't contain enough data.\n"); - } - - // The first 2 bytes are used to identify the bitmap. - $identity = unpack('A2ident', $data); - if ($identity['ident'] != 'BM') { - throw new WriterException("$bitmap doesn't appear to be a valid bitmap image.\n"); - } - - // Remove bitmap data: ID. - $data = substr($data, 2); - - // Read and remove the bitmap size. This is more reliable than reading - // the data size at offset 0x22. - // - $size_array = unpack('Vsa', substr($data, 0, 4)); - $size = $size_array['sa']; - $data = substr($data, 4); - $size -= 0x36; // Subtract size of bitmap header. - $size += 0x0C; // Add size of BIFF header. - - // Remove bitmap data: reserved, offset, header length. - $data = substr($data, 12); - - // Read and remove the bitmap width and height. Verify the sizes. - $width_and_height = unpack('V2', substr($data, 0, 8)); - $width = $width_and_height[1]; - $height = $width_and_height[2]; - $data = substr($data, 8); - if ($width > 0xFFFF) { - throw new WriterException("$bitmap: largest image width supported is 65k.\n"); - } - if ($height > 0xFFFF) { - throw new WriterException("$bitmap: largest image height supported is 65k.\n"); - } - - // Read and remove the bitmap planes and bpp data. Verify them. - $planes_and_bitcount = unpack('v2', substr($data, 0, 4)); - $data = substr($data, 4); - if ($planes_and_bitcount[2] != 24) { // Bitcount - throw new WriterException("$bitmap isn't a 24bit true color bitmap.\n"); - } - if ($planes_and_bitcount[1] != 1) { - throw new WriterException("$bitmap: only 1 plane supported in bitmap image.\n"); - } - - // Read and remove the bitmap compression. Verify compression. - $compression = unpack('Vcomp', substr($data, 0, 4)); - $data = substr($data, 4); - - if ($compression['comp'] != 0) { - throw new WriterException("$bitmap: compression not supported in bitmap image.\n"); - } - - // Remove bitmap data: data size, hres, vres, colours, imp. colours. - $data = substr($data, 20); - - // Add the BITMAPCOREHEADER data - $header = pack('Vvvvv', 0x000c, $width, $height, 0x01, 0x18); - $data = $header . $data; - - return [$width, $height, $size, $data]; - } - - /** - * Store the window zoom factor. This should be a reduced fraction but for - * simplicity we will store all fractions with a numerator of 100. - */ - private function writeZoom(): void - { - // If scale is 100 we don't need to write a record - if ($this->phpSheet->getSheetView()->getZoomScale() == 100) { - return; - } - - $record = 0x00A0; // Record identifier - $length = 0x0004; // Bytes to follow - - $header = pack('vv', $record, $length); - $data = pack('vv', $this->phpSheet->getSheetView()->getZoomScale(), 100); - $this->append($header . $data); - } - - /** - * Get Escher object. - * - * @return \PhpOffice\PhpSpreadsheet\Shared\Escher - */ - public function getEscher() - { - return $this->escher; - } - - /** - * Set Escher object. - * - * @param \PhpOffice\PhpSpreadsheet\Shared\Escher $pValue - */ - public function setEscher(?\PhpOffice\PhpSpreadsheet\Shared\Escher $pValue = null): void - { - $this->escher = $pValue; - } - - /** - * Write MSODRAWING record. - */ - private function writeMsoDrawing(): void - { - // write the Escher stream if necessary - if (isset($this->escher)) { - $writer = new Escher($this->escher); - $data = $writer->close(); - $spOffsets = $writer->getSpOffsets(); - $spTypes = $writer->getSpTypes(); - // write the neccesary MSODRAWING, OBJ records - - // split the Escher stream - $spOffsets[0] = 0; - $nm = count($spOffsets) - 1; // number of shapes excluding first shape - for ($i = 1; $i <= $nm; ++$i) { - // MSODRAWING record - $record = 0x00EC; // Record identifier - - // chunk of Escher stream for one shape - $dataChunk = substr($data, $spOffsets[$i - 1], $spOffsets[$i] - $spOffsets[$i - 1]); - - $length = strlen($dataChunk); - $header = pack('vv', $record, $length); - - $this->append($header . $dataChunk); - - // OBJ record - $record = 0x005D; // record identifier - $objData = ''; - - // ftCmo - if ($spTypes[$i] == 0x00C9) { - // Add ftCmo (common object data) subobject - $objData .= - pack( - 'vvvvvVVV', - 0x0015, // 0x0015 = ftCmo - 0x0012, // length of ftCmo data - 0x0014, // object type, 0x0014 = filter - $i, // object id number, Excel seems to use 1-based index, local for the sheet - 0x2101, // option flags, 0x2001 is what OpenOffice.org uses - 0, // reserved - 0, // reserved - 0 // reserved - ); - - // Add ftSbs Scroll bar subobject - $objData .= pack('vv', 0x00C, 0x0014); - $objData .= pack('H*', '0000000000000000640001000A00000010000100'); - // Add ftLbsData (List box data) subobject - $objData .= pack('vv', 0x0013, 0x1FEE); - $objData .= pack('H*', '00000000010001030000020008005700'); - } else { - // Add ftCmo (common object data) subobject - $objData .= - pack( - 'vvvvvVVV', - 0x0015, // 0x0015 = ftCmo - 0x0012, // length of ftCmo data - 0x0008, // object type, 0x0008 = picture - $i, // object id number, Excel seems to use 1-based index, local for the sheet - 0x6011, // option flags, 0x6011 is what OpenOffice.org uses - 0, // reserved - 0, // reserved - 0 // reserved - ); - } - - // ftEnd - $objData .= - pack( - 'vv', - 0x0000, // 0x0000 = ftEnd - 0x0000 // length of ftEnd data - ); - - $length = strlen($objData); - $header = pack('vv', $record, $length); - $this->append($header . $objData); - } - } - } - - /** - * Store the DATAVALIDATIONS and DATAVALIDATION records. - */ - private function writeDataValidity(): void - { - // Datavalidation collection - $dataValidationCollection = $this->phpSheet->getDataValidationCollection(); - - // Write data validations? - if (!empty($dataValidationCollection)) { - // DATAVALIDATIONS record - $record = 0x01B2; // Record identifier - $length = 0x0012; // Bytes to follow - - $grbit = 0x0000; // Prompt box at cell, no cached validity data at DV records - $horPos = 0x00000000; // Horizontal position of prompt box, if fixed position - $verPos = 0x00000000; // Vertical position of prompt box, if fixed position - $objId = 0xFFFFFFFF; // Object identifier of drop down arrow object, or -1 if not visible - - $header = pack('vv', $record, $length); - $data = pack('vVVVV', $grbit, $horPos, $verPos, $objId, count($dataValidationCollection)); - $this->append($header . $data); - - // DATAVALIDATION records - $record = 0x01BE; // Record identifier - - foreach ($dataValidationCollection as $cellCoordinate => $dataValidation) { - // initialize record data - $data = ''; - - // options - $options = 0x00000000; - - // data type - $type = 0x00; - switch ($dataValidation->getType()) { - case DataValidation::TYPE_NONE: - $type = 0x00; - - break; - case DataValidation::TYPE_WHOLE: - $type = 0x01; - - break; - case DataValidation::TYPE_DECIMAL: - $type = 0x02; - - break; - case DataValidation::TYPE_LIST: - $type = 0x03; - - break; - case DataValidation::TYPE_DATE: - $type = 0x04; - - break; - case DataValidation::TYPE_TIME: - $type = 0x05; - - break; - case DataValidation::TYPE_TEXTLENGTH: - $type = 0x06; - - break; - case DataValidation::TYPE_CUSTOM: - $type = 0x07; - - break; - } - - $options |= $type << 0; - - // error style - $errorStyle = 0x00; - switch ($dataValidation->getErrorStyle()) { - case DataValidation::STYLE_STOP: - $errorStyle = 0x00; - - break; - case DataValidation::STYLE_WARNING: - $errorStyle = 0x01; - - break; - case DataValidation::STYLE_INFORMATION: - $errorStyle = 0x02; - - break; - } - - $options |= $errorStyle << 4; - - // explicit formula? - if ($type == 0x03 && preg_match('/^\".*\"$/', $dataValidation->getFormula1())) { - $options |= 0x01 << 7; - } - - // empty cells allowed - $options |= $dataValidation->getAllowBlank() << 8; - - // show drop down - $options |= (!$dataValidation->getShowDropDown()) << 9; - - // show input message - $options |= $dataValidation->getShowInputMessage() << 18; - - // show error message - $options |= $dataValidation->getShowErrorMessage() << 19; - - // condition operator - $operator = 0x00; - switch ($dataValidation->getOperator()) { - case DataValidation::OPERATOR_BETWEEN: - $operator = 0x00; - - break; - case DataValidation::OPERATOR_NOTBETWEEN: - $operator = 0x01; - - break; - case DataValidation::OPERATOR_EQUAL: - $operator = 0x02; - - break; - case DataValidation::OPERATOR_NOTEQUAL: - $operator = 0x03; - - break; - case DataValidation::OPERATOR_GREATERTHAN: - $operator = 0x04; - - break; - case DataValidation::OPERATOR_LESSTHAN: - $operator = 0x05; - - break; - case DataValidation::OPERATOR_GREATERTHANOREQUAL: - $operator = 0x06; - - break; - case DataValidation::OPERATOR_LESSTHANOREQUAL: - $operator = 0x07; - - break; - } - - $options |= $operator << 20; - - $data = pack('V', $options); - - // prompt title - $promptTitle = $dataValidation->getPromptTitle() !== '' ? - $dataValidation->getPromptTitle() : chr(0); - $data .= StringHelper::UTF8toBIFF8UnicodeLong($promptTitle); - - // error title - $errorTitle = $dataValidation->getErrorTitle() !== '' ? - $dataValidation->getErrorTitle() : chr(0); - $data .= StringHelper::UTF8toBIFF8UnicodeLong($errorTitle); - - // prompt text - $prompt = $dataValidation->getPrompt() !== '' ? - $dataValidation->getPrompt() : chr(0); - $data .= StringHelper::UTF8toBIFF8UnicodeLong($prompt); - - // error text - $error = $dataValidation->getError() !== '' ? - $dataValidation->getError() : chr(0); - $data .= StringHelper::UTF8toBIFF8UnicodeLong($error); - - // formula 1 - try { - $formula1 = $dataValidation->getFormula1(); - if ($type == 0x03) { // list type - $formula1 = str_replace(',', chr(0), $formula1); - } - $this->parser->parse($formula1); - $formula1 = $this->parser->toReversePolish(); - $sz1 = strlen($formula1); - } catch (PhpSpreadsheetException $e) { - $sz1 = 0; - $formula1 = ''; - } - $data .= pack('vv', $sz1, 0x0000); - $data .= $formula1; - - // formula 2 - try { - $formula2 = $dataValidation->getFormula2(); - if ($formula2 === '') { - throw new WriterException('No formula2'); - } - $this->parser->parse($formula2); - $formula2 = $this->parser->toReversePolish(); - $sz2 = strlen($formula2); - } catch (PhpSpreadsheetException $e) { - $sz2 = 0; - $formula2 = ''; - } - $data .= pack('vv', $sz2, 0x0000); - $data .= $formula2; - - // cell range address list - $data .= pack('v', 0x0001); - $data .= $this->writeBIFF8CellRangeAddressFixed($cellCoordinate); - - $length = strlen($data); - $header = pack('vv', $record, $length); - - $this->append($header . $data); - } - } - } - - /** - * Map Error code. - * - * @param string $errorCode - * - * @return int - */ - private static function mapErrorCode($errorCode) - { - switch ($errorCode) { - case '#NULL!': - return 0x00; - case '#DIV/0!': - return 0x07; - case '#VALUE!': - return 0x0F; - case '#REF!': - return 0x17; - case '#NAME?': - return 0x1D; - case '#NUM!': - return 0x24; - case '#N/A': - return 0x2A; - } - - return 0; - } - - /** - * Write PLV Record. - */ - private function writePageLayoutView(): void - { - $record = 0x088B; // Record identifier - $length = 0x0010; // Bytes to follow - - $rt = 0x088B; // 2 - $grbitFrt = 0x0000; // 2 - $reserved = 0x0000000000000000; // 8 - $wScalvePLV = $this->phpSheet->getSheetView()->getZoomScale(); // 2 - - // The options flags that comprise $grbit - if ($this->phpSheet->getSheetView()->getView() == SheetView::SHEETVIEW_PAGE_LAYOUT) { - $fPageLayoutView = 1; - } else { - $fPageLayoutView = 0; - } - $fRulerVisible = 0; - $fWhitespaceHidden = 0; - - $grbit = $fPageLayoutView; // 2 - $grbit |= $fRulerVisible << 1; - $grbit |= $fWhitespaceHidden << 3; - - $header = pack('vv', $record, $length); - $data = pack('vvVVvv', $rt, $grbitFrt, 0x00000000, 0x00000000, $wScalvePLV, $grbit); - $this->append($header . $data); - } - - /** - * Write CFRule Record. - */ - private function writeCFRule(Conditional $conditional): void - { - $record = 0x01B1; // Record identifier - - // $type : Type of the CF - // $operatorType : Comparison operator - if ($conditional->getConditionType() == Conditional::CONDITION_EXPRESSION) { - $type = 0x02; - $operatorType = 0x00; - } elseif ($conditional->getConditionType() == Conditional::CONDITION_CELLIS) { - $type = 0x01; - - switch ($conditional->getOperatorType()) { - case Conditional::OPERATOR_NONE: - $operatorType = 0x00; - - break; - case Conditional::OPERATOR_EQUAL: - $operatorType = 0x03; - - break; - case Conditional::OPERATOR_GREATERTHAN: - $operatorType = 0x05; - - break; - case Conditional::OPERATOR_GREATERTHANOREQUAL: - $operatorType = 0x07; - - break; - case Conditional::OPERATOR_LESSTHAN: - $operatorType = 0x06; - - break; - case Conditional::OPERATOR_LESSTHANOREQUAL: - $operatorType = 0x08; - - break; - case Conditional::OPERATOR_NOTEQUAL: - $operatorType = 0x04; - - break; - case Conditional::OPERATOR_BETWEEN: - $operatorType = 0x01; - - break; - // not OPERATOR_NOTBETWEEN 0x02 - } - } - - // $szValue1 : size of the formula data for first value or formula - // $szValue2 : size of the formula data for second value or formula - $arrConditions = $conditional->getConditions(); - $numConditions = count($arrConditions); - if ($numConditions == 1) { - $szValue1 = ($arrConditions[0] <= 65535 ? 3 : 0x0000); - $szValue2 = 0x0000; - $operand1 = pack('Cv', 0x1E, $arrConditions[0]); - $operand2 = null; - } elseif ($numConditions == 2 && ($conditional->getOperatorType() == Conditional::OPERATOR_BETWEEN)) { - $szValue1 = ($arrConditions[0] <= 65535 ? 3 : 0x0000); - $szValue2 = ($arrConditions[1] <= 65535 ? 3 : 0x0000); - $operand1 = pack('Cv', 0x1E, $arrConditions[0]); - $operand2 = pack('Cv', 0x1E, $arrConditions[1]); - } else { - $szValue1 = 0x0000; - $szValue2 = 0x0000; - $operand1 = null; - $operand2 = null; - } - - // $flags : Option flags - // Alignment - $bAlignHz = ($conditional->getStyle()->getAlignment()->getHorizontal() == null ? 1 : 0); - $bAlignVt = ($conditional->getStyle()->getAlignment()->getVertical() == null ? 1 : 0); - $bAlignWrapTx = ($conditional->getStyle()->getAlignment()->getWrapText() == false ? 1 : 0); - $bTxRotation = ($conditional->getStyle()->getAlignment()->getTextRotation() == null ? 1 : 0); - $bIndent = ($conditional->getStyle()->getAlignment()->getIndent() == 0 ? 1 : 0); - $bShrinkToFit = ($conditional->getStyle()->getAlignment()->getShrinkToFit() == false ? 1 : 0); - if ($bAlignHz == 0 || $bAlignVt == 0 || $bAlignWrapTx == 0 || $bTxRotation == 0 || $bIndent == 0 || $bShrinkToFit == 0) { - $bFormatAlign = 1; - } else { - $bFormatAlign = 0; - } - // Protection - $bProtLocked = ($conditional->getStyle()->getProtection()->getLocked() == null ? 1 : 0); - $bProtHidden = ($conditional->getStyle()->getProtection()->getHidden() == null ? 1 : 0); - if ($bProtLocked == 0 || $bProtHidden == 0) { - $bFormatProt = 1; - } else { - $bFormatProt = 0; - } - // Border - $bBorderLeft = ($conditional->getStyle()->getBorders()->getLeft()->getColor()->getARGB() == Color::COLOR_BLACK - && $conditional->getStyle()->getBorders()->getLeft()->getBorderStyle() == Border::BORDER_NONE ? 1 : 0); - $bBorderRight = ($conditional->getStyle()->getBorders()->getRight()->getColor()->getARGB() == Color::COLOR_BLACK - && $conditional->getStyle()->getBorders()->getRight()->getBorderStyle() == Border::BORDER_NONE ? 1 : 0); - $bBorderTop = ($conditional->getStyle()->getBorders()->getTop()->getColor()->getARGB() == Color::COLOR_BLACK - && $conditional->getStyle()->getBorders()->getTop()->getBorderStyle() == Border::BORDER_NONE ? 1 : 0); - $bBorderBottom = ($conditional->getStyle()->getBorders()->getBottom()->getColor()->getARGB() == Color::COLOR_BLACK - && $conditional->getStyle()->getBorders()->getBottom()->getBorderStyle() == Border::BORDER_NONE ? 1 : 0); - if ($bBorderLeft == 0 || $bBorderRight == 0 || $bBorderTop == 0 || $bBorderBottom == 0) { - $bFormatBorder = 1; - } else { - $bFormatBorder = 0; - } - // Pattern - $bFillStyle = ($conditional->getStyle()->getFill()->getFillType() == null ? 0 : 1); - $bFillColor = ($conditional->getStyle()->getFill()->getStartColor()->getARGB() == null ? 0 : 1); - $bFillColorBg = ($conditional->getStyle()->getFill()->getEndColor()->getARGB() == null ? 0 : 1); - if ($bFillStyle == 0 || $bFillColor == 0 || $bFillColorBg == 0) { - $bFormatFill = 1; - } else { - $bFormatFill = 0; - } - // Font - if ( - $conditional->getStyle()->getFont()->getName() != null - || $conditional->getStyle()->getFont()->getSize() != null - || $conditional->getStyle()->getFont()->getBold() != null - || $conditional->getStyle()->getFont()->getItalic() != null - || $conditional->getStyle()->getFont()->getSuperscript() != null - || $conditional->getStyle()->getFont()->getSubscript() != null - || $conditional->getStyle()->getFont()->getUnderline() != null - || $conditional->getStyle()->getFont()->getStrikethrough() != null - || $conditional->getStyle()->getFont()->getColor()->getARGB() != null - ) { - $bFormatFont = 1; - } else { - $bFormatFont = 0; - } - // Alignment - $flags = 0; - $flags |= (1 == $bAlignHz ? 0x00000001 : 0); - $flags |= (1 == $bAlignVt ? 0x00000002 : 0); - $flags |= (1 == $bAlignWrapTx ? 0x00000004 : 0); - $flags |= (1 == $bTxRotation ? 0x00000008 : 0); - // Justify last line flag - $flags |= (1 == 1 ? 0x00000010 : 0); - $flags |= (1 == $bIndent ? 0x00000020 : 0); - $flags |= (1 == $bShrinkToFit ? 0x00000040 : 0); - // Default - $flags |= (1 == 1 ? 0x00000080 : 0); - // Protection - $flags |= (1 == $bProtLocked ? 0x00000100 : 0); - $flags |= (1 == $bProtHidden ? 0x00000200 : 0); - // Border - $flags |= (1 == $bBorderLeft ? 0x00000400 : 0); - $flags |= (1 == $bBorderRight ? 0x00000800 : 0); - $flags |= (1 == $bBorderTop ? 0x00001000 : 0); - $flags |= (1 == $bBorderBottom ? 0x00002000 : 0); - $flags |= (1 == 1 ? 0x00004000 : 0); // Top left to Bottom right border - $flags |= (1 == 1 ? 0x00008000 : 0); // Bottom left to Top right border - // Pattern - $flags |= (1 == $bFillStyle ? 0x00010000 : 0); - $flags |= (1 == $bFillColor ? 0x00020000 : 0); - $flags |= (1 == $bFillColorBg ? 0x00040000 : 0); - $flags |= (1 == 1 ? 0x00380000 : 0); - // Font - $flags |= (1 == $bFormatFont ? 0x04000000 : 0); - // Alignment: - $flags |= (1 == $bFormatAlign ? 0x08000000 : 0); - // Border - $flags |= (1 == $bFormatBorder ? 0x10000000 : 0); - // Pattern - $flags |= (1 == $bFormatFill ? 0x20000000 : 0); - // Protection - $flags |= (1 == $bFormatProt ? 0x40000000 : 0); - // Text direction - $flags |= (1 == 0 ? 0x80000000 : 0); - - // Data Blocks - if ($bFormatFont == 1) { - // Font Name - if ($conditional->getStyle()->getFont()->getName() == null) { - $dataBlockFont = pack('VVVVVVVV', 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000); - $dataBlockFont .= pack('VVVVVVVV', 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000); - } else { - $dataBlockFont = StringHelper::UTF8toBIFF8UnicodeLong($conditional->getStyle()->getFont()->getName()); - } - // Font Size - if ($conditional->getStyle()->getFont()->getSize() == null) { - $dataBlockFont .= pack('V', 20 * 11); - } else { - $dataBlockFont .= pack('V', 20 * $conditional->getStyle()->getFont()->getSize()); - } - // Font Options - $dataBlockFont .= pack('V', 0); - // Font weight - if ($conditional->getStyle()->getFont()->getBold() == true) { - $dataBlockFont .= pack('v', 0x02BC); - } else { - $dataBlockFont .= pack('v', 0x0190); - } - // Escapement type - if ($conditional->getStyle()->getFont()->getSubscript() == true) { - $dataBlockFont .= pack('v', 0x02); - $fontEscapement = 0; - } elseif ($conditional->getStyle()->getFont()->getSuperscript() == true) { - $dataBlockFont .= pack('v', 0x01); - $fontEscapement = 0; - } else { - $dataBlockFont .= pack('v', 0x00); - $fontEscapement = 1; - } - // Underline type - switch ($conditional->getStyle()->getFont()->getUnderline()) { - case \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_NONE: - $dataBlockFont .= pack('C', 0x00); - $fontUnderline = 0; - - break; - case \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_DOUBLE: - $dataBlockFont .= pack('C', 0x02); - $fontUnderline = 0; - - break; - case \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_DOUBLEACCOUNTING: - $dataBlockFont .= pack('C', 0x22); - $fontUnderline = 0; - - break; - case \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLE: - $dataBlockFont .= pack('C', 0x01); - $fontUnderline = 0; - - break; - case \PhpOffice\PhpSpreadsheet\Style\Font::UNDERLINE_SINGLEACCOUNTING: - $dataBlockFont .= pack('C', 0x21); - $fontUnderline = 0; - - break; - default: - $dataBlockFont .= pack('C', 0x00); - $fontUnderline = 1; - - break; - } - // Not used (3) - $dataBlockFont .= pack('vC', 0x0000, 0x00); - // Font color index - switch ($conditional->getStyle()->getFont()->getColor()->getRGB()) { - case '000000': - $colorIdx = 0x08; - - break; - case 'FFFFFF': - $colorIdx = 0x09; - - break; - case 'FF0000': - $colorIdx = 0x0A; - - break; - case '00FF00': - $colorIdx = 0x0B; - - break; - case '0000FF': - $colorIdx = 0x0C; - - break; - case 'FFFF00': - $colorIdx = 0x0D; - - break; - case 'FF00FF': - $colorIdx = 0x0E; - - break; - case '00FFFF': - $colorIdx = 0x0F; - - break; - case '800000': - $colorIdx = 0x10; - - break; - case '008000': - $colorIdx = 0x11; - - break; - case '000080': - $colorIdx = 0x12; - - break; - case '808000': - $colorIdx = 0x13; - - break; - case '800080': - $colorIdx = 0x14; - - break; - case '008080': - $colorIdx = 0x15; - - break; - case 'C0C0C0': - $colorIdx = 0x16; - - break; - case '808080': - $colorIdx = 0x17; - - break; - case '9999FF': - $colorIdx = 0x18; - - break; - case '993366': - $colorIdx = 0x19; - - break; - case 'FFFFCC': - $colorIdx = 0x1A; - - break; - case 'CCFFFF': - $colorIdx = 0x1B; - - break; - case '660066': - $colorIdx = 0x1C; - - break; - case 'FF8080': - $colorIdx = 0x1D; - - break; - case '0066CC': - $colorIdx = 0x1E; - - break; - case 'CCCCFF': - $colorIdx = 0x1F; - - break; - case '000080': - $colorIdx = 0x20; - - break; - case 'FF00FF': - $colorIdx = 0x21; - - break; - case 'FFFF00': - $colorIdx = 0x22; - - break; - case '00FFFF': - $colorIdx = 0x23; - - break; - case '800080': - $colorIdx = 0x24; - - break; - case '800000': - $colorIdx = 0x25; - - break; - case '008080': - $colorIdx = 0x26; - - break; - case '0000FF': - $colorIdx = 0x27; - - break; - case '00CCFF': - $colorIdx = 0x28; - - break; - case 'CCFFFF': - $colorIdx = 0x29; - - break; - case 'CCFFCC': - $colorIdx = 0x2A; - - break; - case 'FFFF99': - $colorIdx = 0x2B; - - break; - case '99CCFF': - $colorIdx = 0x2C; - - break; - case 'FF99CC': - $colorIdx = 0x2D; - - break; - case 'CC99FF': - $colorIdx = 0x2E; - - break; - case 'FFCC99': - $colorIdx = 0x2F; - - break; - case '3366FF': - $colorIdx = 0x30; - - break; - case '33CCCC': - $colorIdx = 0x31; - - break; - case '99CC00': - $colorIdx = 0x32; - - break; - case 'FFCC00': - $colorIdx = 0x33; - - break; - case 'FF9900': - $colorIdx = 0x34; - - break; - case 'FF6600': - $colorIdx = 0x35; - - break; - case '666699': - $colorIdx = 0x36; - - break; - case '969696': - $colorIdx = 0x37; - - break; - case '003366': - $colorIdx = 0x38; - - break; - case '339966': - $colorIdx = 0x39; - - break; - case '003300': - $colorIdx = 0x3A; - - break; - case '333300': - $colorIdx = 0x3B; - - break; - case '993300': - $colorIdx = 0x3C; - - break; - case '993366': - $colorIdx = 0x3D; - - break; - case '333399': - $colorIdx = 0x3E; - - break; - case '333333': - $colorIdx = 0x3F; - - break; - default: - $colorIdx = 0x00; - - break; - } - $dataBlockFont .= pack('V', $colorIdx); - // Not used (4) - $dataBlockFont .= pack('V', 0x00000000); - // Options flags for modified font attributes - $optionsFlags = 0; - $optionsFlagsBold = ($conditional->getStyle()->getFont()->getBold() == null ? 1 : 0); - $optionsFlags |= (1 == $optionsFlagsBold ? 0x00000002 : 0); - $optionsFlags |= (1 == 1 ? 0x00000008 : 0); - $optionsFlags |= (1 == 1 ? 0x00000010 : 0); - $optionsFlags |= (1 == 0 ? 0x00000020 : 0); - $optionsFlags |= (1 == 1 ? 0x00000080 : 0); - $dataBlockFont .= pack('V', $optionsFlags); - // Escapement type - $dataBlockFont .= pack('V', $fontEscapement); - // Underline type - $dataBlockFont .= pack('V', $fontUnderline); - // Always - $dataBlockFont .= pack('V', 0x00000000); - // Always - $dataBlockFont .= pack('V', 0x00000000); - // Not used (8) - $dataBlockFont .= pack('VV', 0x00000000, 0x00000000); - // Always - $dataBlockFont .= pack('v', 0x0001); - } - if ($bFormatAlign == 1) { - $blockAlign = 0; - // Alignment and text break - switch ($conditional->getStyle()->getAlignment()->getHorizontal()) { - case Alignment::HORIZONTAL_GENERAL: - $blockAlign = 0; - - break; - case Alignment::HORIZONTAL_LEFT: - $blockAlign = 1; - - break; - case Alignment::HORIZONTAL_RIGHT: - $blockAlign = 3; - - break; - case Alignment::HORIZONTAL_CENTER: - $blockAlign = 2; - - break; - case Alignment::HORIZONTAL_CENTER_CONTINUOUS: - $blockAlign = 6; - - break; - case Alignment::HORIZONTAL_JUSTIFY: - $blockAlign = 5; - - break; - } - if ($conditional->getStyle()->getAlignment()->getWrapText() == true) { - $blockAlign |= 1 << 3; - } else { - $blockAlign |= 0 << 3; - } - switch ($conditional->getStyle()->getAlignment()->getVertical()) { - case Alignment::VERTICAL_BOTTOM: - $blockAlign = 2 << 4; - - break; - case Alignment::VERTICAL_TOP: - $blockAlign = 0 << 4; - - break; - case Alignment::VERTICAL_CENTER: - $blockAlign = 1 << 4; - - break; - case Alignment::VERTICAL_JUSTIFY: - $blockAlign = 3 << 4; - - break; - } - $blockAlign |= 0 << 7; - - // Text rotation angle - $blockRotation = $conditional->getStyle()->getAlignment()->getTextRotation(); - - // Indentation - $blockIndent = $conditional->getStyle()->getAlignment()->getIndent(); - if ($conditional->getStyle()->getAlignment()->getShrinkToFit() == true) { - $blockIndent |= 1 << 4; - } else { - $blockIndent |= 0 << 4; - } - $blockIndent |= 0 << 6; - - // Relative indentation - $blockIndentRelative = 255; - - $dataBlockAlign = pack('CCvvv', $blockAlign, $blockRotation, $blockIndent, $blockIndentRelative, 0x0000); - } - if ($bFormatBorder == 1) { - $blockLineStyle = 0; - switch ($conditional->getStyle()->getBorders()->getLeft()->getBorderStyle()) { - case Border::BORDER_NONE: - $blockLineStyle |= 0x00; - - break; - case Border::BORDER_THIN: - $blockLineStyle |= 0x01; - - break; - case Border::BORDER_MEDIUM: - $blockLineStyle |= 0x02; - - break; - case Border::BORDER_DASHED: - $blockLineStyle |= 0x03; - - break; - case Border::BORDER_DOTTED: - $blockLineStyle |= 0x04; - - break; - case Border::BORDER_THICK: - $blockLineStyle |= 0x05; - - break; - case Border::BORDER_DOUBLE: - $blockLineStyle |= 0x06; - - break; - case Border::BORDER_HAIR: - $blockLineStyle |= 0x07; - - break; - case Border::BORDER_MEDIUMDASHED: - $blockLineStyle |= 0x08; - - break; - case Border::BORDER_DASHDOT: - $blockLineStyle |= 0x09; - - break; - case Border::BORDER_MEDIUMDASHDOT: - $blockLineStyle |= 0x0A; - - break; - case Border::BORDER_DASHDOTDOT: - $blockLineStyle |= 0x0B; - - break; - case Border::BORDER_MEDIUMDASHDOTDOT: - $blockLineStyle |= 0x0C; - - break; - case Border::BORDER_SLANTDASHDOT: - $blockLineStyle |= 0x0D; - - break; - } - switch ($conditional->getStyle()->getBorders()->getRight()->getBorderStyle()) { - case Border::BORDER_NONE: - $blockLineStyle |= 0x00 << 4; - - break; - case Border::BORDER_THIN: - $blockLineStyle |= 0x01 << 4; - - break; - case Border::BORDER_MEDIUM: - $blockLineStyle |= 0x02 << 4; - - break; - case Border::BORDER_DASHED: - $blockLineStyle |= 0x03 << 4; - - break; - case Border::BORDER_DOTTED: - $blockLineStyle |= 0x04 << 4; - - break; - case Border::BORDER_THICK: - $blockLineStyle |= 0x05 << 4; - - break; - case Border::BORDER_DOUBLE: - $blockLineStyle |= 0x06 << 4; - - break; - case Border::BORDER_HAIR: - $blockLineStyle |= 0x07 << 4; - - break; - case Border::BORDER_MEDIUMDASHED: - $blockLineStyle |= 0x08 << 4; - - break; - case Border::BORDER_DASHDOT: - $blockLineStyle |= 0x09 << 4; - - break; - case Border::BORDER_MEDIUMDASHDOT: - $blockLineStyle |= 0x0A << 4; - - break; - case Border::BORDER_DASHDOTDOT: - $blockLineStyle |= 0x0B << 4; - - break; - case Border::BORDER_MEDIUMDASHDOTDOT: - $blockLineStyle |= 0x0C << 4; - - break; - case Border::BORDER_SLANTDASHDOT: - $blockLineStyle |= 0x0D << 4; - - break; - } - switch ($conditional->getStyle()->getBorders()->getTop()->getBorderStyle()) { - case Border::BORDER_NONE: - $blockLineStyle |= 0x00 << 8; - - break; - case Border::BORDER_THIN: - $blockLineStyle |= 0x01 << 8; - - break; - case Border::BORDER_MEDIUM: - $blockLineStyle |= 0x02 << 8; - - break; - case Border::BORDER_DASHED: - $blockLineStyle |= 0x03 << 8; - - break; - case Border::BORDER_DOTTED: - $blockLineStyle |= 0x04 << 8; - - break; - case Border::BORDER_THICK: - $blockLineStyle |= 0x05 << 8; - - break; - case Border::BORDER_DOUBLE: - $blockLineStyle |= 0x06 << 8; - - break; - case Border::BORDER_HAIR: - $blockLineStyle |= 0x07 << 8; - - break; - case Border::BORDER_MEDIUMDASHED: - $blockLineStyle |= 0x08 << 8; - - break; - case Border::BORDER_DASHDOT: - $blockLineStyle |= 0x09 << 8; - - break; - case Border::BORDER_MEDIUMDASHDOT: - $blockLineStyle |= 0x0A << 8; - - break; - case Border::BORDER_DASHDOTDOT: - $blockLineStyle |= 0x0B << 8; - - break; - case Border::BORDER_MEDIUMDASHDOTDOT: - $blockLineStyle |= 0x0C << 8; - - break; - case Border::BORDER_SLANTDASHDOT: - $blockLineStyle |= 0x0D << 8; - - break; - } - switch ($conditional->getStyle()->getBorders()->getBottom()->getBorderStyle()) { - case Border::BORDER_NONE: - $blockLineStyle |= 0x00 << 12; - - break; - case Border::BORDER_THIN: - $blockLineStyle |= 0x01 << 12; - - break; - case Border::BORDER_MEDIUM: - $blockLineStyle |= 0x02 << 12; - - break; - case Border::BORDER_DASHED: - $blockLineStyle |= 0x03 << 12; - - break; - case Border::BORDER_DOTTED: - $blockLineStyle |= 0x04 << 12; - - break; - case Border::BORDER_THICK: - $blockLineStyle |= 0x05 << 12; - - break; - case Border::BORDER_DOUBLE: - $blockLineStyle |= 0x06 << 12; - - break; - case Border::BORDER_HAIR: - $blockLineStyle |= 0x07 << 12; - - break; - case Border::BORDER_MEDIUMDASHED: - $blockLineStyle |= 0x08 << 12; - - break; - case Border::BORDER_DASHDOT: - $blockLineStyle |= 0x09 << 12; - - break; - case Border::BORDER_MEDIUMDASHDOT: - $blockLineStyle |= 0x0A << 12; - - break; - case Border::BORDER_DASHDOTDOT: - $blockLineStyle |= 0x0B << 12; - - break; - case Border::BORDER_MEDIUMDASHDOTDOT: - $blockLineStyle |= 0x0C << 12; - - break; - case Border::BORDER_SLANTDASHDOT: - $blockLineStyle |= 0x0D << 12; - - break; - } - - // TODO writeCFRule() => $blockLineStyle => Index Color for left line - // TODO writeCFRule() => $blockLineStyle => Index Color for right line - // TODO writeCFRule() => $blockLineStyle => Top-left to bottom-right on/off - // TODO writeCFRule() => $blockLineStyle => Bottom-left to top-right on/off - $blockColor = 0; - // TODO writeCFRule() => $blockColor => Index Color for top line - // TODO writeCFRule() => $blockColor => Index Color for bottom line - // TODO writeCFRule() => $blockColor => Index Color for diagonal line - switch ($conditional->getStyle()->getBorders()->getDiagonal()->getBorderStyle()) { - case Border::BORDER_NONE: - $blockColor |= 0x00 << 21; - - break; - case Border::BORDER_THIN: - $blockColor |= 0x01 << 21; - - break; - case Border::BORDER_MEDIUM: - $blockColor |= 0x02 << 21; - - break; - case Border::BORDER_DASHED: - $blockColor |= 0x03 << 21; - - break; - case Border::BORDER_DOTTED: - $blockColor |= 0x04 << 21; - - break; - case Border::BORDER_THICK: - $blockColor |= 0x05 << 21; - - break; - case Border::BORDER_DOUBLE: - $blockColor |= 0x06 << 21; - - break; - case Border::BORDER_HAIR: - $blockColor |= 0x07 << 21; - - break; - case Border::BORDER_MEDIUMDASHED: - $blockColor |= 0x08 << 21; - - break; - case Border::BORDER_DASHDOT: - $blockColor |= 0x09 << 21; - - break; - case Border::BORDER_MEDIUMDASHDOT: - $blockColor |= 0x0A << 21; - - break; - case Border::BORDER_DASHDOTDOT: - $blockColor |= 0x0B << 21; - - break; - case Border::BORDER_MEDIUMDASHDOTDOT: - $blockColor |= 0x0C << 21; - - break; - case Border::BORDER_SLANTDASHDOT: - $blockColor |= 0x0D << 21; - - break; - } - $dataBlockBorder = pack('vv', $blockLineStyle, $blockColor); - } - if ($bFormatFill == 1) { - // Fill Patern Style - $blockFillPatternStyle = 0; - switch ($conditional->getStyle()->getFill()->getFillType()) { - case Fill::FILL_NONE: - $blockFillPatternStyle = 0x00; - - break; - case Fill::FILL_SOLID: - $blockFillPatternStyle = 0x01; - - break; - case Fill::FILL_PATTERN_MEDIUMGRAY: - $blockFillPatternStyle = 0x02; - - break; - case Fill::FILL_PATTERN_DARKGRAY: - $blockFillPatternStyle = 0x03; - - break; - case Fill::FILL_PATTERN_LIGHTGRAY: - $blockFillPatternStyle = 0x04; - - break; - case Fill::FILL_PATTERN_DARKHORIZONTAL: - $blockFillPatternStyle = 0x05; - - break; - case Fill::FILL_PATTERN_DARKVERTICAL: - $blockFillPatternStyle = 0x06; - - break; - case Fill::FILL_PATTERN_DARKDOWN: - $blockFillPatternStyle = 0x07; - - break; - case Fill::FILL_PATTERN_DARKUP: - $blockFillPatternStyle = 0x08; - - break; - case Fill::FILL_PATTERN_DARKGRID: - $blockFillPatternStyle = 0x09; - - break; - case Fill::FILL_PATTERN_DARKTRELLIS: - $blockFillPatternStyle = 0x0A; - - break; - case Fill::FILL_PATTERN_LIGHTHORIZONTAL: - $blockFillPatternStyle = 0x0B; - - break; - case Fill::FILL_PATTERN_LIGHTVERTICAL: - $blockFillPatternStyle = 0x0C; - - break; - case Fill::FILL_PATTERN_LIGHTDOWN: - $blockFillPatternStyle = 0x0D; - - break; - case Fill::FILL_PATTERN_LIGHTUP: - $blockFillPatternStyle = 0x0E; - - break; - case Fill::FILL_PATTERN_LIGHTGRID: - $blockFillPatternStyle = 0x0F; - - break; - case Fill::FILL_PATTERN_LIGHTTRELLIS: - $blockFillPatternStyle = 0x10; - - break; - case Fill::FILL_PATTERN_GRAY125: - $blockFillPatternStyle = 0x11; - - break; - case Fill::FILL_PATTERN_GRAY0625: - $blockFillPatternStyle = 0x12; - - break; - case Fill::FILL_GRADIENT_LINEAR: - $blockFillPatternStyle = 0x00; - - break; // does not exist in BIFF8 - case Fill::FILL_GRADIENT_PATH: - $blockFillPatternStyle = 0x00; - - break; // does not exist in BIFF8 - default: - $blockFillPatternStyle = 0x00; - - break; - } - // Color - switch ($conditional->getStyle()->getFill()->getStartColor()->getRGB()) { - case '000000': - $colorIdxBg = 0x08; - - break; - case 'FFFFFF': - $colorIdxBg = 0x09; - - break; - case 'FF0000': - $colorIdxBg = 0x0A; - - break; - case '00FF00': - $colorIdxBg = 0x0B; - - break; - case '0000FF': - $colorIdxBg = 0x0C; - - break; - case 'FFFF00': - $colorIdxBg = 0x0D; - - break; - case 'FF00FF': - $colorIdxBg = 0x0E; - - break; - case '00FFFF': - $colorIdxBg = 0x0F; - - break; - case '800000': - $colorIdxBg = 0x10; - - break; - case '008000': - $colorIdxBg = 0x11; - - break; - case '000080': - $colorIdxBg = 0x12; - - break; - case '808000': - $colorIdxBg = 0x13; - - break; - case '800080': - $colorIdxBg = 0x14; - - break; - case '008080': - $colorIdxBg = 0x15; - - break; - case 'C0C0C0': - $colorIdxBg = 0x16; - - break; - case '808080': - $colorIdxBg = 0x17; - - break; - case '9999FF': - $colorIdxBg = 0x18; - - break; - case '993366': - $colorIdxBg = 0x19; - - break; - case 'FFFFCC': - $colorIdxBg = 0x1A; - - break; - case 'CCFFFF': - $colorIdxBg = 0x1B; - - break; - case '660066': - $colorIdxBg = 0x1C; - - break; - case 'FF8080': - $colorIdxBg = 0x1D; - - break; - case '0066CC': - $colorIdxBg = 0x1E; - - break; - case 'CCCCFF': - $colorIdxBg = 0x1F; - - break; - case '000080': - $colorIdxBg = 0x20; - - break; - case 'FF00FF': - $colorIdxBg = 0x21; - - break; - case 'FFFF00': - $colorIdxBg = 0x22; - - break; - case '00FFFF': - $colorIdxBg = 0x23; - - break; - case '800080': - $colorIdxBg = 0x24; - - break; - case '800000': - $colorIdxBg = 0x25; - - break; - case '008080': - $colorIdxBg = 0x26; - - break; - case '0000FF': - $colorIdxBg = 0x27; - - break; - case '00CCFF': - $colorIdxBg = 0x28; - - break; - case 'CCFFFF': - $colorIdxBg = 0x29; - - break; - case 'CCFFCC': - $colorIdxBg = 0x2A; - - break; - case 'FFFF99': - $colorIdxBg = 0x2B; - - break; - case '99CCFF': - $colorIdxBg = 0x2C; - - break; - case 'FF99CC': - $colorIdxBg = 0x2D; - - break; - case 'CC99FF': - $colorIdxBg = 0x2E; - - break; - case 'FFCC99': - $colorIdxBg = 0x2F; - - break; - case '3366FF': - $colorIdxBg = 0x30; - - break; - case '33CCCC': - $colorIdxBg = 0x31; - - break; - case '99CC00': - $colorIdxBg = 0x32; - - break; - case 'FFCC00': - $colorIdxBg = 0x33; - - break; - case 'FF9900': - $colorIdxBg = 0x34; - - break; - case 'FF6600': - $colorIdxBg = 0x35; - - break; - case '666699': - $colorIdxBg = 0x36; - - break; - case '969696': - $colorIdxBg = 0x37; - - break; - case '003366': - $colorIdxBg = 0x38; - - break; - case '339966': - $colorIdxBg = 0x39; - - break; - case '003300': - $colorIdxBg = 0x3A; - - break; - case '333300': - $colorIdxBg = 0x3B; - - break; - case '993300': - $colorIdxBg = 0x3C; - - break; - case '993366': - $colorIdxBg = 0x3D; - - break; - case '333399': - $colorIdxBg = 0x3E; - - break; - case '333333': - $colorIdxBg = 0x3F; - - break; - default: - $colorIdxBg = 0x41; - - break; - } - // Fg Color - switch ($conditional->getStyle()->getFill()->getEndColor()->getRGB()) { - case '000000': - $colorIdxFg = 0x08; - - break; - case 'FFFFFF': - $colorIdxFg = 0x09; - - break; - case 'FF0000': - $colorIdxFg = 0x0A; - - break; - case '00FF00': - $colorIdxFg = 0x0B; - - break; - case '0000FF': - $colorIdxFg = 0x0C; - - break; - case 'FFFF00': - $colorIdxFg = 0x0D; - - break; - case 'FF00FF': - $colorIdxFg = 0x0E; - - break; - case '00FFFF': - $colorIdxFg = 0x0F; - - break; - case '800000': - $colorIdxFg = 0x10; - - break; - case '008000': - $colorIdxFg = 0x11; - - break; - case '000080': - $colorIdxFg = 0x12; - - break; - case '808000': - $colorIdxFg = 0x13; - - break; - case '800080': - $colorIdxFg = 0x14; - - break; - case '008080': - $colorIdxFg = 0x15; - - break; - case 'C0C0C0': - $colorIdxFg = 0x16; - - break; - case '808080': - $colorIdxFg = 0x17; - - break; - case '9999FF': - $colorIdxFg = 0x18; - - break; - case '993366': - $colorIdxFg = 0x19; - - break; - case 'FFFFCC': - $colorIdxFg = 0x1A; - - break; - case 'CCFFFF': - $colorIdxFg = 0x1B; - - break; - case '660066': - $colorIdxFg = 0x1C; - - break; - case 'FF8080': - $colorIdxFg = 0x1D; - - break; - case '0066CC': - $colorIdxFg = 0x1E; - - break; - case 'CCCCFF': - $colorIdxFg = 0x1F; - - break; - case '000080': - $colorIdxFg = 0x20; - - break; - case 'FF00FF': - $colorIdxFg = 0x21; - - break; - case 'FFFF00': - $colorIdxFg = 0x22; - - break; - case '00FFFF': - $colorIdxFg = 0x23; - - break; - case '800080': - $colorIdxFg = 0x24; - - break; - case '800000': - $colorIdxFg = 0x25; - - break; - case '008080': - $colorIdxFg = 0x26; - - break; - case '0000FF': - $colorIdxFg = 0x27; - - break; - case '00CCFF': - $colorIdxFg = 0x28; - - break; - case 'CCFFFF': - $colorIdxFg = 0x29; - - break; - case 'CCFFCC': - $colorIdxFg = 0x2A; - - break; - case 'FFFF99': - $colorIdxFg = 0x2B; - - break; - case '99CCFF': - $colorIdxFg = 0x2C; - - break; - case 'FF99CC': - $colorIdxFg = 0x2D; - - break; - case 'CC99FF': - $colorIdxFg = 0x2E; - - break; - case 'FFCC99': - $colorIdxFg = 0x2F; - - break; - case '3366FF': - $colorIdxFg = 0x30; - - break; - case '33CCCC': - $colorIdxFg = 0x31; - - break; - case '99CC00': - $colorIdxFg = 0x32; - - break; - case 'FFCC00': - $colorIdxFg = 0x33; - - break; - case 'FF9900': - $colorIdxFg = 0x34; - - break; - case 'FF6600': - $colorIdxFg = 0x35; - - break; - case '666699': - $colorIdxFg = 0x36; - - break; - case '969696': - $colorIdxFg = 0x37; - - break; - case '003366': - $colorIdxFg = 0x38; - - break; - case '339966': - $colorIdxFg = 0x39; - - break; - case '003300': - $colorIdxFg = 0x3A; - - break; - case '333300': - $colorIdxFg = 0x3B; - - break; - case '993300': - $colorIdxFg = 0x3C; - - break; - case '993366': - $colorIdxFg = 0x3D; - - break; - case '333399': - $colorIdxFg = 0x3E; - - break; - case '333333': - $colorIdxFg = 0x3F; - - break; - default: - $colorIdxFg = 0x40; - - break; - } - $dataBlockFill = pack('v', $blockFillPatternStyle); - $dataBlockFill .= pack('v', $colorIdxFg | ($colorIdxBg << 7)); - } - if ($bFormatProt == 1) { - $dataBlockProtection = 0; - if ($conditional->getStyle()->getProtection()->getLocked() == Protection::PROTECTION_PROTECTED) { - $dataBlockProtection = 1; - } - if ($conditional->getStyle()->getProtection()->getHidden() == Protection::PROTECTION_PROTECTED) { - $dataBlockProtection = 1 << 1; - } - } - - $data = pack('CCvvVv', $type, $operatorType, $szValue1, $szValue2, $flags, 0x0000); - if ($bFormatFont == 1) { // Block Formatting : OK - $data .= $dataBlockFont; - } - if ($bFormatAlign == 1) { - $data .= $dataBlockAlign; - } - if ($bFormatBorder == 1) { - $data .= $dataBlockBorder; - } - if ($bFormatFill == 1) { // Block Formatting : OK - $data .= $dataBlockFill; - } - if ($bFormatProt == 1) { - $data .= $dataBlockProtection; - } - if ($operand1 !== null) { - $data .= $operand1; - } - if ($operand2 !== null) { - $data .= $operand2; - } - $header = pack('vv', $record, strlen($data)); - $this->append($header . $data); - } - - /** - * Write CFHeader record. - */ - private function writeCFHeader(): void - { - $record = 0x01B0; // Record identifier - $length = 0x0016; // Bytes to follow - - $numColumnMin = null; - $numColumnMax = null; - $numRowMin = null; - $numRowMax = null; - $arrConditional = []; - foreach ($this->phpSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) { - foreach ($conditionalStyles as $conditional) { - if ( - $conditional->getConditionType() == Conditional::CONDITION_EXPRESSION - || $conditional->getConditionType() == Conditional::CONDITION_CELLIS - ) { - if (!in_array($conditional->getHashCode(), $arrConditional)) { - $arrConditional[] = $conditional->getHashCode(); - } - // Cells - $arrCoord = Coordinate::coordinateFromString($cellCoordinate); - if (!is_numeric($arrCoord[0])) { - $arrCoord[0] = Coordinate::columnIndexFromString($arrCoord[0]); - } - if ($numColumnMin === null || ($numColumnMin > $arrCoord[0])) { - $numColumnMin = $arrCoord[0]; - } - if ($numColumnMax === null || ($numColumnMax < $arrCoord[0])) { - $numColumnMax = $arrCoord[0]; - } - if ($numRowMin === null || ($numRowMin > $arrCoord[1])) { - $numRowMin = $arrCoord[1]; - } - if ($numRowMax === null || ($numRowMax < $arrCoord[1])) { - $numRowMax = $arrCoord[1]; - } - } - } - } - $needRedraw = 1; - $cellRange = pack('vvvv', $numRowMin - 1, $numRowMax - 1, $numColumnMin - 1, $numColumnMax - 1); - - $header = pack('vv', $record, $length); - $data = pack('vv', count($arrConditional), $needRedraw); - $data .= $cellRange; - $data .= pack('v', 0x0001); - $data .= $cellRange; - $this->append($header . $data); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Xf.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Xf.php deleted file mode 100644 index 3e8169b..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Xf.php +++ /dev/null @@ -1,548 +0,0 @@ - -// * -// * The majority of this is _NOT_ my code. I simply ported it from the -// * PERL Spreadsheet::WriteExcel module. -// * -// * The author of the Spreadsheet::WriteExcel module is John McNamara -// * -// * -// * I _DO_ maintain this code, and John McNamara has nothing to do with the -// * porting of this code to PHP. Any questions directly related to this -// * class library should be directed to me. -// * -// * License Information: -// * -// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets -// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com -// * -// * This library is free software; you can redistribute it and/or -// * modify it under the terms of the GNU Lesser General Public -// * License as published by the Free Software Foundation; either -// * version 2.1 of the License, or (at your option) any later version. -// * -// * This library is distributed in the hope that it will be useful, -// * but WITHOUT ANY WARRANTY; without even the implied warranty of -// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// * Lesser General Public License for more details. -// * -// * You should have received a copy of the GNU Lesser General Public -// * License along with this library; if not, write to the Free Software -// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// */ -class Xf -{ - /** - * Style XF or a cell XF ? - * - * @var bool - */ - private $isStyleXf; - - /** - * Index to the FONT record. Index 4 does not exist. - * - * @var int - */ - private $fontIndex; - - /** - * An index (2 bytes) to a FORMAT record (number format). - * - * @var int - */ - private $numberFormatIndex; - - /** - * 1 bit, apparently not used. - * - * @var int - */ - private $textJustLast; - - /** - * The cell's foreground color. - * - * @var int - */ - private $foregroundColor; - - /** - * The cell's background color. - * - * @var int - */ - private $backgroundColor; - - /** - * Color of the bottom border of the cell. - * - * @var int - */ - private $bottomBorderColor; - - /** - * Color of the top border of the cell. - * - * @var int - */ - private $topBorderColor; - - /** - * Color of the left border of the cell. - * - * @var int - */ - private $leftBorderColor; - - /** - * Color of the right border of the cell. - * - * @var int - */ - private $rightBorderColor; - - /** - * Constructor. - * - * @param Style $style The XF format - */ - public function __construct(Style $style) - { - $this->isStyleXf = false; - $this->fontIndex = 0; - - $this->numberFormatIndex = 0; - - $this->textJustLast = 0; - - $this->foregroundColor = 0x40; - $this->backgroundColor = 0x41; - - $this->_diag = 0; - - $this->bottomBorderColor = 0x40; - $this->topBorderColor = 0x40; - $this->leftBorderColor = 0x40; - $this->rightBorderColor = 0x40; - $this->_diag_color = 0x40; - $this->_style = $style; - } - - /** - * Generate an Excel BIFF XF record (style or cell). - * - * @return string The XF record - */ - public function writeXf() - { - // Set the type of the XF record and some of the attributes. - if ($this->isStyleXf) { - $style = 0xFFF5; - } else { - $style = self::mapLocked($this->_style->getProtection()->getLocked()); - $style |= self::mapHidden($this->_style->getProtection()->getHidden()) << 1; - } - - // Flags to indicate if attributes have been set. - $atr_num = ($this->numberFormatIndex != 0) ? 1 : 0; - $atr_fnt = ($this->fontIndex != 0) ? 1 : 0; - $atr_alc = ((int) $this->_style->getAlignment()->getWrapText()) ? 1 : 0; - $atr_bdr = (self::mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle()) || - self::mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle()) || - self::mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle()) || - self::mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle())) ? 1 : 0; - $atr_pat = (($this->foregroundColor != 0x40) || - ($this->backgroundColor != 0x41) || - self::mapFillType($this->_style->getFill()->getFillType())) ? 1 : 0; - $atr_prot = self::mapLocked($this->_style->getProtection()->getLocked()) - | self::mapHidden($this->_style->getProtection()->getHidden()); - - // Zero the default border colour if the border has not been set. - if (self::mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle()) == 0) { - $this->bottomBorderColor = 0; - } - if (self::mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle()) == 0) { - $this->topBorderColor = 0; - } - if (self::mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle()) == 0) { - $this->rightBorderColor = 0; - } - if (self::mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle()) == 0) { - $this->leftBorderColor = 0; - } - if (self::mapBorderStyle($this->_style->getBorders()->getDiagonal()->getBorderStyle()) == 0) { - $this->_diag_color = 0; - } - - $record = 0x00E0; // Record identifier - $length = 0x0014; // Number of bytes to follow - - $ifnt = $this->fontIndex; // Index to FONT record - $ifmt = $this->numberFormatIndex; // Index to FORMAT record - - $align = $this->mapHAlign($this->_style->getAlignment()->getHorizontal()); // Alignment - $align |= (int) $this->_style->getAlignment()->getWrapText() << 3; - $align |= self::mapVAlign($this->_style->getAlignment()->getVertical()) << 4; - $align |= $this->textJustLast << 7; - - $used_attrib = $atr_num << 2; - $used_attrib |= $atr_fnt << 3; - $used_attrib |= $atr_alc << 4; - $used_attrib |= $atr_bdr << 5; - $used_attrib |= $atr_pat << 6; - $used_attrib |= $atr_prot << 7; - - $icv = $this->foregroundColor; // fg and bg pattern colors - $icv |= $this->backgroundColor << 7; - - $border1 = self::mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle()); // Border line style and color - $border1 |= self::mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle()) << 4; - $border1 |= self::mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle()) << 8; - $border1 |= self::mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle()) << 12; - $border1 |= $this->leftBorderColor << 16; - $border1 |= $this->rightBorderColor << 23; - - $diagonalDirection = $this->_style->getBorders()->getDiagonalDirection(); - $diag_tl_to_rb = $diagonalDirection == Borders::DIAGONAL_BOTH - || $diagonalDirection == Borders::DIAGONAL_DOWN; - $diag_tr_to_lb = $diagonalDirection == Borders::DIAGONAL_BOTH - || $diagonalDirection == Borders::DIAGONAL_UP; - $border1 |= $diag_tl_to_rb << 30; - $border1 |= $diag_tr_to_lb << 31; - - $border2 = $this->topBorderColor; // Border color - $border2 |= $this->bottomBorderColor << 7; - $border2 |= $this->_diag_color << 14; - $border2 |= self::mapBorderStyle($this->_style->getBorders()->getDiagonal()->getBorderStyle()) << 21; - $border2 |= self::mapFillType($this->_style->getFill()->getFillType()) << 26; - - $header = pack('vv', $record, $length); - - //BIFF8 options: identation, shrinkToFit and text direction - $biff8_options = $this->_style->getAlignment()->getIndent(); - $biff8_options |= (int) $this->_style->getAlignment()->getShrinkToFit() << 4; - - $data = pack('vvvC', $ifnt, $ifmt, $style, $align); - $data .= pack('CCC', self::mapTextRotation($this->_style->getAlignment()->getTextRotation()), $biff8_options, $used_attrib); - $data .= pack('VVv', $border1, $border2, $icv); - - return $header . $data; - } - - /** - * Is this a style XF ? - * - * @param bool $value - */ - public function setIsStyleXf($value): void - { - $this->isStyleXf = $value; - } - - /** - * Sets the cell's bottom border color. - * - * @param int $colorIndex Color index - */ - public function setBottomColor($colorIndex): void - { - $this->bottomBorderColor = $colorIndex; - } - - /** - * Sets the cell's top border color. - * - * @param int $colorIndex Color index - */ - public function setTopColor($colorIndex): void - { - $this->topBorderColor = $colorIndex; - } - - /** - * Sets the cell's left border color. - * - * @param int $colorIndex Color index - */ - public function setLeftColor($colorIndex): void - { - $this->leftBorderColor = $colorIndex; - } - - /** - * Sets the cell's right border color. - * - * @param int $colorIndex Color index - */ - public function setRightColor($colorIndex): void - { - $this->rightBorderColor = $colorIndex; - } - - /** - * Sets the cell's diagonal border color. - * - * @param int $colorIndex Color index - */ - public function setDiagColor($colorIndex): void - { - $this->_diag_color = $colorIndex; - } - - /** - * Sets the cell's foreground color. - * - * @param int $colorIndex Color index - */ - public function setFgColor($colorIndex): void - { - $this->foregroundColor = $colorIndex; - } - - /** - * Sets the cell's background color. - * - * @param int $colorIndex Color index - */ - public function setBgColor($colorIndex): void - { - $this->backgroundColor = $colorIndex; - } - - /** - * Sets the index to the number format record - * It can be date, time, currency, etc... - * - * @param int $numberFormatIndex Index to format record - */ - public function setNumberFormatIndex($numberFormatIndex): void - { - $this->numberFormatIndex = $numberFormatIndex; - } - - /** - * Set the font index. - * - * @param int $value Font index, note that value 4 does not exist - */ - public function setFontIndex($value): void - { - $this->fontIndex = $value; - } - - /** - * Map of BIFF2-BIFF8 codes for border styles. - * - * @var array of int - */ - private static $mapBorderStyles = [ - Border::BORDER_NONE => 0x00, - Border::BORDER_THIN => 0x01, - Border::BORDER_MEDIUM => 0x02, - Border::BORDER_DASHED => 0x03, - Border::BORDER_DOTTED => 0x04, - Border::BORDER_THICK => 0x05, - Border::BORDER_DOUBLE => 0x06, - Border::BORDER_HAIR => 0x07, - Border::BORDER_MEDIUMDASHED => 0x08, - Border::BORDER_DASHDOT => 0x09, - Border::BORDER_MEDIUMDASHDOT => 0x0A, - Border::BORDER_DASHDOTDOT => 0x0B, - Border::BORDER_MEDIUMDASHDOTDOT => 0x0C, - Border::BORDER_SLANTDASHDOT => 0x0D, - ]; - - /** - * Map border style. - * - * @param string $borderStyle - * - * @return int - */ - private static function mapBorderStyle($borderStyle) - { - if (isset(self::$mapBorderStyles[$borderStyle])) { - return self::$mapBorderStyles[$borderStyle]; - } - - return 0x00; - } - - /** - * Map of BIFF2-BIFF8 codes for fill types. - * - * @var array of int - */ - private static $mapFillTypes = [ - Fill::FILL_NONE => 0x00, - Fill::FILL_SOLID => 0x01, - Fill::FILL_PATTERN_MEDIUMGRAY => 0x02, - Fill::FILL_PATTERN_DARKGRAY => 0x03, - Fill::FILL_PATTERN_LIGHTGRAY => 0x04, - Fill::FILL_PATTERN_DARKHORIZONTAL => 0x05, - Fill::FILL_PATTERN_DARKVERTICAL => 0x06, - Fill::FILL_PATTERN_DARKDOWN => 0x07, - Fill::FILL_PATTERN_DARKUP => 0x08, - Fill::FILL_PATTERN_DARKGRID => 0x09, - Fill::FILL_PATTERN_DARKTRELLIS => 0x0A, - Fill::FILL_PATTERN_LIGHTHORIZONTAL => 0x0B, - Fill::FILL_PATTERN_LIGHTVERTICAL => 0x0C, - Fill::FILL_PATTERN_LIGHTDOWN => 0x0D, - Fill::FILL_PATTERN_LIGHTUP => 0x0E, - Fill::FILL_PATTERN_LIGHTGRID => 0x0F, - Fill::FILL_PATTERN_LIGHTTRELLIS => 0x10, - Fill::FILL_PATTERN_GRAY125 => 0x11, - Fill::FILL_PATTERN_GRAY0625 => 0x12, - Fill::FILL_GRADIENT_LINEAR => 0x00, // does not exist in BIFF8 - Fill::FILL_GRADIENT_PATH => 0x00, // does not exist in BIFF8 - ]; - - /** - * Map fill type. - * - * @param string $fillType - * - * @return int - */ - private static function mapFillType($fillType) - { - if (isset(self::$mapFillTypes[$fillType])) { - return self::$mapFillTypes[$fillType]; - } - - return 0x00; - } - - /** - * Map of BIFF2-BIFF8 codes for horizontal alignment. - * - * @var array of int - */ - private static $mapHAlignments = [ - Alignment::HORIZONTAL_GENERAL => 0, - Alignment::HORIZONTAL_LEFT => 1, - Alignment::HORIZONTAL_CENTER => 2, - Alignment::HORIZONTAL_RIGHT => 3, - Alignment::HORIZONTAL_FILL => 4, - Alignment::HORIZONTAL_JUSTIFY => 5, - Alignment::HORIZONTAL_CENTER_CONTINUOUS => 6, - ]; - - /** - * Map to BIFF2-BIFF8 codes for horizontal alignment. - * - * @param string $hAlign - * - * @return int - */ - private function mapHAlign($hAlign) - { - if (isset(self::$mapHAlignments[$hAlign])) { - return self::$mapHAlignments[$hAlign]; - } - - return 0; - } - - /** - * Map of BIFF2-BIFF8 codes for vertical alignment. - * - * @var array of int - */ - private static $mapVAlignments = [ - Alignment::VERTICAL_TOP => 0, - Alignment::VERTICAL_CENTER => 1, - Alignment::VERTICAL_BOTTOM => 2, - Alignment::VERTICAL_JUSTIFY => 3, - ]; - - /** - * Map to BIFF2-BIFF8 codes for vertical alignment. - * - * @param string $vAlign - * - * @return int - */ - private static function mapVAlign($vAlign) - { - if (isset(self::$mapVAlignments[$vAlign])) { - return self::$mapVAlignments[$vAlign]; - } - - return 2; - } - - /** - * Map to BIFF8 codes for text rotation angle. - * - * @param int $textRotation - * - * @return int - */ - private static function mapTextRotation($textRotation) - { - if ($textRotation >= 0) { - return $textRotation; - } elseif ($textRotation == -165) { - return 255; - } elseif ($textRotation < 0) { - return 90 - $textRotation; - } - } - - /** - * Map locked. - * - * @param string $locked - * - * @return int - */ - private static function mapLocked($locked) - { - switch ($locked) { - case Protection::PROTECTION_INHERIT: - return 1; - case Protection::PROTECTION_PROTECTED: - return 1; - case Protection::PROTECTION_UNPROTECTED: - return 0; - default: - return 1; - } - } - - /** - * Map hidden. - * - * @param string $hidden - * - * @return int - */ - private static function mapHidden($hidden) - { - switch ($hidden) { - case Protection::PROTECTION_INHERIT: - return 0; - case Protection::PROTECTION_PROTECTED: - return 1; - case Protection::PROTECTION_UNPROTECTED: - return 0; - default: - return 0; - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php deleted file mode 100644 index d71541c..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php +++ /dev/null @@ -1,548 +0,0 @@ -setSpreadsheet($spreadsheet); - - $writerPartsArray = [ - 'stringtable' => StringTable::class, - 'contenttypes' => ContentTypes::class, - 'docprops' => DocProps::class, - 'rels' => Rels::class, - 'theme' => Theme::class, - 'style' => Style::class, - 'workbook' => Workbook::class, - 'worksheet' => Worksheet::class, - 'drawing' => Drawing::class, - 'comments' => Comments::class, - 'chart' => Chart::class, - 'relsvba' => RelsVBA::class, - 'relsribbonobjects' => RelsRibbon::class, - ]; - - // Initialise writer parts - // and Assign their parent IWriters - foreach ($writerPartsArray as $writer => $class) { - $this->writerParts[$writer] = new $class($this); - } - - $hashTablesArray = ['stylesConditionalHashTable', 'fillHashTable', 'fontHashTable', - 'bordersHashTable', 'numFmtHashTable', 'drawingHashTable', - 'styleHashTable', - ]; - - // Set HashTable variables - foreach ($hashTablesArray as $tableName) { - $this->$tableName = new HashTable(); - } - } - - /** - * Get writer part. - * - * @param string $pPartName Writer part name - * - * @return \PhpOffice\PhpSpreadsheet\Writer\Xlsx\WriterPart - */ - public function getWriterPart($pPartName) - { - if ($pPartName != '' && isset($this->writerParts[strtolower($pPartName)])) { - return $this->writerParts[strtolower($pPartName)]; - } - - return null; - } - - /** - * Save PhpSpreadsheet to file. - * - * @param resource|string $pFilename - */ - public function save($pFilename): void - { - // garbage collect - $this->pathNames = []; - $this->spreadSheet->garbageCollect(); - - $this->openFileHandle($pFilename); - - $saveDebugLog = Calculation::getInstance($this->spreadSheet)->getDebugLog()->getWriteDebugLog(); - Calculation::getInstance($this->spreadSheet)->getDebugLog()->setWriteDebugLog(false); - $saveDateReturnType = Functions::getReturnDateType(); - Functions::setReturnDateType(Functions::RETURNDATE_EXCEL); - - // Create string lookup table - $this->stringTable = []; - for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) { - $this->stringTable = $this->getWriterPart('StringTable')->createStringTable($this->spreadSheet->getSheet($i), $this->stringTable); - } - - // Create styles dictionaries - $this->styleHashTable->addFromSource($this->getWriterPart('Style')->allStyles($this->spreadSheet)); - $this->stylesConditionalHashTable->addFromSource($this->getWriterPart('Style')->allConditionalStyles($this->spreadSheet)); - $this->fillHashTable->addFromSource($this->getWriterPart('Style')->allFills($this->spreadSheet)); - $this->fontHashTable->addFromSource($this->getWriterPart('Style')->allFonts($this->spreadSheet)); - $this->bordersHashTable->addFromSource($this->getWriterPart('Style')->allBorders($this->spreadSheet)); - $this->numFmtHashTable->addFromSource($this->getWriterPart('Style')->allNumberFormats($this->spreadSheet)); - - // Create drawing dictionary - $this->drawingHashTable->addFromSource($this->getWriterPart('Drawing')->allDrawings($this->spreadSheet)); - - $options = new Archive(); - $options->setEnableZip64(false); - $options->setOutputStream($this->fileHandle); - - $this->zip = new ZipStream(null, $options); - - // Add [Content_Types].xml to ZIP file - $this->addZipFile('[Content_Types].xml', $this->getWriterPart('ContentTypes')->writeContentTypes($this->spreadSheet, $this->includeCharts)); - - //if hasMacros, add the vbaProject.bin file, Certificate file(if exists) - if ($this->spreadSheet->hasMacros()) { - $macrosCode = $this->spreadSheet->getMacrosCode(); - if ($macrosCode !== null) { - // we have the code ? - $this->addZipFile('xl/vbaProject.bin', $macrosCode); //allways in 'xl', allways named vbaProject.bin - if ($this->spreadSheet->hasMacrosCertificate()) { - //signed macros ? - // Yes : add the certificate file and the related rels file - $this->addZipFile('xl/vbaProjectSignature.bin', $this->spreadSheet->getMacrosCertificate()); - $this->addZipFile('xl/_rels/vbaProject.bin.rels', $this->getWriterPart('RelsVBA')->writeVBARelationships($this->spreadSheet)); - } - } - } - //a custom UI in this workbook ? add it ("base" xml and additional objects (pictures) and rels) - if ($this->spreadSheet->hasRibbon()) { - $tmpRibbonTarget = $this->spreadSheet->getRibbonXMLData('target'); - $this->addZipFile($tmpRibbonTarget, $this->spreadSheet->getRibbonXMLData('data')); - if ($this->spreadSheet->hasRibbonBinObjects()) { - $tmpRootPath = dirname($tmpRibbonTarget) . '/'; - $ribbonBinObjects = $this->spreadSheet->getRibbonBinObjects('data'); //the files to write - foreach ($ribbonBinObjects as $aPath => $aContent) { - $this->addZipFile($tmpRootPath . $aPath, $aContent); - } - //the rels for files - $this->addZipFile($tmpRootPath . '_rels/' . basename($tmpRibbonTarget) . '.rels', $this->getWriterPart('RelsRibbonObjects')->writeRibbonRelationships($this->spreadSheet)); - } - } - - // Add relationships to ZIP file - $this->addZipFile('_rels/.rels', $this->getWriterPart('Rels')->writeRelationships($this->spreadSheet)); - $this->addZipFile('xl/_rels/workbook.xml.rels', $this->getWriterPart('Rels')->writeWorkbookRelationships($this->spreadSheet)); - - // Add document properties to ZIP file - $this->addZipFile('docProps/app.xml', $this->getWriterPart('DocProps')->writeDocPropsApp($this->spreadSheet)); - $this->addZipFile('docProps/core.xml', $this->getWriterPart('DocProps')->writeDocPropsCore($this->spreadSheet)); - $customPropertiesPart = $this->getWriterPart('DocProps')->writeDocPropsCustom($this->spreadSheet); - if ($customPropertiesPart !== null) { - $this->addZipFile('docProps/custom.xml', $customPropertiesPart); - } - - // Add theme to ZIP file - $this->addZipFile('xl/theme/theme1.xml', $this->getWriterPart('Theme')->writeTheme($this->spreadSheet)); - - // Add string table to ZIP file - $this->addZipFile('xl/sharedStrings.xml', $this->getWriterPart('StringTable')->writeStringTable($this->stringTable)); - - // Add styles to ZIP file - $this->addZipFile('xl/styles.xml', $this->getWriterPart('Style')->writeStyles($this->spreadSheet)); - - // Add workbook to ZIP file - $this->addZipFile('xl/workbook.xml', $this->getWriterPart('Workbook')->writeWorkbook($this->spreadSheet, $this->preCalculateFormulas)); - - $chartCount = 0; - // Add worksheets - for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) { - $this->addZipFile('xl/worksheets/sheet' . ($i + 1) . '.xml', $this->getWriterPart('Worksheet')->writeWorksheet($this->spreadSheet->getSheet($i), $this->stringTable, $this->includeCharts)); - if ($this->includeCharts) { - $charts = $this->spreadSheet->getSheet($i)->getChartCollection(); - if (count($charts) > 0) { - foreach ($charts as $chart) { - $this->addZipFile('xl/charts/chart' . ($chartCount + 1) . '.xml', $this->getWriterPart('Chart')->writeChart($chart, $this->preCalculateFormulas)); - ++$chartCount; - } - } - } - } - - $chartRef1 = 0; - // Add worksheet relationships (drawings, ...) - for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) { - // Add relationships - $this->addZipFile('xl/worksheets/_rels/sheet' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeWorksheetRelationships($this->spreadSheet->getSheet($i), ($i + 1), $this->includeCharts)); - - // Add unparsedLoadedData - $sheetCodeName = $this->spreadSheet->getSheet($i)->getCodeName(); - $unparsedLoadedData = $this->spreadSheet->getUnparsedLoadedData(); - if (isset($unparsedLoadedData['sheets'][$sheetCodeName]['ctrlProps'])) { - foreach ($unparsedLoadedData['sheets'][$sheetCodeName]['ctrlProps'] as $ctrlProp) { - $this->addZipFile($ctrlProp['filePath'], $ctrlProp['content']); - } - } - if (isset($unparsedLoadedData['sheets'][$sheetCodeName]['printerSettings'])) { - foreach ($unparsedLoadedData['sheets'][$sheetCodeName]['printerSettings'] as $ctrlProp) { - $this->addZipFile($ctrlProp['filePath'], $ctrlProp['content']); - } - } - - $drawings = $this->spreadSheet->getSheet($i)->getDrawingCollection(); - $drawingCount = count($drawings); - if ($this->includeCharts) { - $chartCount = $this->spreadSheet->getSheet($i)->getChartCount(); - } - - // Add drawing and image relationship parts - if (($drawingCount > 0) || ($chartCount > 0)) { - // Drawing relationships - $this->addZipFile('xl/drawings/_rels/drawing' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeDrawingRelationships($this->spreadSheet->getSheet($i), $chartRef1, $this->includeCharts)); - - // Drawings - $this->addZipFile('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->writeDrawings($this->spreadSheet->getSheet($i), $this->includeCharts)); - } elseif (isset($unparsedLoadedData['sheets'][$sheetCodeName]['drawingAlternateContents'])) { - // Drawings - $this->addZipFile('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->writeDrawings($this->spreadSheet->getSheet($i), $this->includeCharts)); - } - - // Add unparsed drawings - if (isset($unparsedLoadedData['sheets'][$sheetCodeName]['Drawings'])) { - foreach ($unparsedLoadedData['sheets'][$sheetCodeName]['Drawings'] as $relId => $drawingXml) { - $drawingFile = array_search($relId, $unparsedLoadedData['sheets'][$sheetCodeName]['drawingOriginalIds']); - if ($drawingFile !== false) { - $drawingFile = ltrim($drawingFile, '.'); - $this->addZipFile('xl' . $drawingFile, $drawingXml); - } - } - } - - // Add comment relationship parts - if (count($this->spreadSheet->getSheet($i)->getComments()) > 0) { - // VML Comments - $this->addZipFile('xl/drawings/vmlDrawing' . ($i + 1) . '.vml', $this->getWriterPart('Comments')->writeVMLComments($this->spreadSheet->getSheet($i))); - - // Comments - $this->addZipFile('xl/comments' . ($i + 1) . '.xml', $this->getWriterPart('Comments')->writeComments($this->spreadSheet->getSheet($i))); - } - - // Add unparsed relationship parts - if (isset($unparsedLoadedData['sheets'][$sheetCodeName]['vmlDrawings'])) { - foreach ($unparsedLoadedData['sheets'][$sheetCodeName]['vmlDrawings'] as $vmlDrawing) { - $this->addZipFile($vmlDrawing['filePath'], $vmlDrawing['content']); - } - } - - // Add header/footer relationship parts - if (count($this->spreadSheet->getSheet($i)->getHeaderFooter()->getImages()) > 0) { - // VML Drawings - $this->addZipFile('xl/drawings/vmlDrawingHF' . ($i + 1) . '.vml', $this->getWriterPart('Drawing')->writeVMLHeaderFooterImages($this->spreadSheet->getSheet($i))); - - // VML Drawing relationships - $this->addZipFile('xl/drawings/_rels/vmlDrawingHF' . ($i + 1) . '.vml.rels', $this->getWriterPart('Rels')->writeHeaderFooterDrawingRelationships($this->spreadSheet->getSheet($i))); - - // Media - foreach ($this->spreadSheet->getSheet($i)->getHeaderFooter()->getImages() as $image) { - $this->addZipFile('xl/media/' . $image->getIndexedFilename(), file_get_contents($image->getPath())); - } - } - } - - // Add media - for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) { - if ($this->getDrawingHashTable()->getByIndex($i) instanceof WorksheetDrawing) { - $imageContents = null; - $imagePath = $this->getDrawingHashTable()->getByIndex($i)->getPath(); - if (strpos($imagePath, 'zip://') !== false) { - $imagePath = substr($imagePath, 6); - $imagePathSplitted = explode('#', $imagePath); - - $imageZip = new ZipArchive(); - $imageZip->open($imagePathSplitted[0]); - $imageContents = $imageZip->getFromName($imagePathSplitted[1]); - $imageZip->close(); - unset($imageZip); - } else { - $imageContents = file_get_contents($imagePath); - } - - $this->addZipFile('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents); - } elseif ($this->getDrawingHashTable()->getByIndex($i) instanceof MemoryDrawing) { - ob_start(); - call_user_func( - $this->getDrawingHashTable()->getByIndex($i)->getRenderingFunction(), - $this->getDrawingHashTable()->getByIndex($i)->getImageResource() - ); - $imageContents = ob_get_contents(); - ob_end_clean(); - - $this->addZipFile('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents); - } - } - - Functions::setReturnDateType($saveDateReturnType); - Calculation::getInstance($this->spreadSheet)->getDebugLog()->setWriteDebugLog($saveDebugLog); - - // Close file - try { - $this->zip->finish(); - } catch (OverflowException $e) { - throw new WriterException('Could not close resource.'); - } - - $this->maybeCloseFileHandle(); - } - - /** - * Get Spreadsheet object. - * - * @return Spreadsheet - */ - public function getSpreadsheet() - { - return $this->spreadSheet; - } - - /** - * Set Spreadsheet object. - * - * @param Spreadsheet $spreadsheet PhpSpreadsheet object - * - * @return $this - */ - public function setSpreadsheet(Spreadsheet $spreadsheet) - { - $this->spreadSheet = $spreadsheet; - - return $this; - } - - /** - * Get string table. - * - * @return string[] - */ - public function getStringTable() - { - return $this->stringTable; - } - - /** - * Get Style HashTable. - * - * @return HashTable - */ - public function getStyleHashTable() - { - return $this->styleHashTable; - } - - /** - * Get Conditional HashTable. - * - * @return HashTable - */ - public function getStylesConditionalHashTable() - { - return $this->stylesConditionalHashTable; - } - - /** - * Get Fill HashTable. - * - * @return HashTable - */ - public function getFillHashTable() - { - return $this->fillHashTable; - } - - /** - * Get \PhpOffice\PhpSpreadsheet\Style\Font HashTable. - * - * @return HashTable - */ - public function getFontHashTable() - { - return $this->fontHashTable; - } - - /** - * Get Borders HashTable. - * - * @return HashTable - */ - public function getBordersHashTable() - { - return $this->bordersHashTable; - } - - /** - * Get NumberFormat HashTable. - * - * @return HashTable - */ - public function getNumFmtHashTable() - { - return $this->numFmtHashTable; - } - - /** - * Get \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet\BaseDrawing HashTable. - * - * @return HashTable - */ - public function getDrawingHashTable() - { - return $this->drawingHashTable; - } - - /** - * Get Office2003 compatibility. - * - * @return bool - */ - public function getOffice2003Compatibility() - { - return $this->office2003compatibility; - } - - /** - * Set Office2003 compatibility. - * - * @param bool $pValue Office2003 compatibility? - * - * @return $this - */ - public function setOffice2003Compatibility($pValue) - { - $this->office2003compatibility = $pValue; - - return $this; - } - - private $pathNames = []; - - private function addZipFile(string $path, string $content): void - { - if (!in_array($path, $this->pathNames)) { - $this->pathNames[] = $path; - $this->zip->addFile($path, $content); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php deleted file mode 100644 index 583b262..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php +++ /dev/null @@ -1,1516 +0,0 @@ -calculateCellValues = $calculateCellValues; - - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - // Ensure that data series values are up-to-date before we save - if ($this->calculateCellValues) { - $pChart->refresh(); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // c:chartSpace - $objWriter->startElement('c:chartSpace'); - $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); - $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); - $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); - - $objWriter->startElement('c:date1904'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - $objWriter->startElement('c:lang'); - $objWriter->writeAttribute('val', 'en-GB'); - $objWriter->endElement(); - $objWriter->startElement('c:roundedCorners'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - - $this->writeAlternateContent($objWriter); - - $objWriter->startElement('c:chart'); - - $this->writeTitle($objWriter, $pChart->getTitle()); - - $objWriter->startElement('c:autoTitleDeleted'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - - $this->writePlotArea($objWriter, $pChart->getWorksheet(), $pChart->getPlotArea(), $pChart->getXAxisLabel(), $pChart->getYAxisLabel(), $pChart->getChartAxisX(), $pChart->getChartAxisY(), $pChart->getMajorGridlines(), $pChart->getMinorGridlines()); - - $this->writeLegend($objWriter, $pChart->getLegend()); - - $objWriter->startElement('c:plotVisOnly'); - $objWriter->writeAttribute('val', (int) $pChart->getPlotVisibleOnly()); - $objWriter->endElement(); - - $objWriter->startElement('c:dispBlanksAs'); - $objWriter->writeAttribute('val', $pChart->getDisplayBlanksAs()); - $objWriter->endElement(); - - $objWriter->startElement('c:showDLblsOverMax'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - - $objWriter->endElement(); - - $this->writePrintSettings($objWriter); - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write Chart Title. - * - * @param XMLWriter $objWriter XML Writer - * @param Title $title - */ - private function writeTitle(XMLWriter $objWriter, ?Title $title = null): void - { - if ($title === null) { - return; - } - - $objWriter->startElement('c:title'); - $objWriter->startElement('c:tx'); - $objWriter->startElement('c:rich'); - - $objWriter->startElement('a:bodyPr'); - $objWriter->endElement(); - - $objWriter->startElement('a:lstStyle'); - $objWriter->endElement(); - - $objWriter->startElement('a:p'); - - $caption = $title->getCaption(); - if ((is_array($caption)) && (count($caption) > 0)) { - $caption = $caption[0]; - } - $this->getParentWriter()->getWriterPart('stringtable')->writeRichTextForCharts($objWriter, $caption, 'a'); - - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - - $this->writeLayout($objWriter, $title->getLayout()); - - $objWriter->startElement('c:overlay'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Write Chart Legend. - * - * @param XMLWriter $objWriter XML Writer - * @param Legend $legend - */ - private function writeLegend(XMLWriter $objWriter, ?Legend $legend = null): void - { - if ($legend === null) { - return; - } - - $objWriter->startElement('c:legend'); - - $objWriter->startElement('c:legendPos'); - $objWriter->writeAttribute('val', $legend->getPosition()); - $objWriter->endElement(); - - $this->writeLayout($objWriter, $legend->getLayout()); - - $objWriter->startElement('c:overlay'); - $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0'); - $objWriter->endElement(); - - $objWriter->startElement('c:txPr'); - $objWriter->startElement('a:bodyPr'); - $objWriter->endElement(); - - $objWriter->startElement('a:lstStyle'); - $objWriter->endElement(); - - $objWriter->startElement('a:p'); - $objWriter->startElement('a:pPr'); - $objWriter->writeAttribute('rtl', 0); - - $objWriter->startElement('a:defRPr'); - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->startElement('a:endParaRPr'); - $objWriter->writeAttribute('lang', 'en-US'); - $objWriter->endElement(); - - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Write Chart Plot Area. - * - * @param XMLWriter $objWriter XML Writer - * @param Title $xAxisLabel - * @param Title $yAxisLabel - * @param Axis $xAxis - * @param Axis $yAxis - */ - private function writePlotArea(XMLWriter $objWriter, \PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pSheet, PlotArea $plotArea, ?Title $xAxisLabel = null, ?Title $yAxisLabel = null, ?Axis $xAxis = null, ?Axis $yAxis = null, ?GridLines $majorGridlines = null, ?GridLines $minorGridlines = null): void - { - if ($plotArea === null) { - return; - } - - $id1 = $id2 = 0; - $this->seriesIndex = 0; - $objWriter->startElement('c:plotArea'); - - $layout = $plotArea->getLayout(); - - $this->writeLayout($objWriter, $layout); - - $chartTypes = self::getChartType($plotArea); - $catIsMultiLevelSeries = $valIsMultiLevelSeries = false; - $plotGroupingType = ''; - foreach ($chartTypes as $chartType) { - $objWriter->startElement('c:' . $chartType); - - $groupCount = $plotArea->getPlotGroupCount(); - for ($i = 0; $i < $groupCount; ++$i) { - $plotGroup = $plotArea->getPlotGroupByIndex($i); - $groupType = $plotGroup->getPlotType(); - if ($groupType == $chartType) { - $plotStyle = $plotGroup->getPlotStyle(); - if ($groupType === DataSeries::TYPE_RADARCHART) { - $objWriter->startElement('c:radarStyle'); - $objWriter->writeAttribute('val', $plotStyle); - $objWriter->endElement(); - } elseif ($groupType === DataSeries::TYPE_SCATTERCHART) { - $objWriter->startElement('c:scatterStyle'); - $objWriter->writeAttribute('val', $plotStyle); - $objWriter->endElement(); - } - - $this->writePlotGroup($plotGroup, $chartType, $objWriter, $catIsMultiLevelSeries, $valIsMultiLevelSeries, $plotGroupingType); - } - } - - $this->writeDataLabels($objWriter, $layout); - - if ($chartType === DataSeries::TYPE_LINECHART) { - // Line only, Line3D can't be smoothed - $objWriter->startElement('c:smooth'); - $objWriter->writeAttribute('val', (int) $plotGroup->getSmoothLine()); - $objWriter->endElement(); - } elseif (($chartType === DataSeries::TYPE_BARCHART) || ($chartType === DataSeries::TYPE_BARCHART_3D)) { - $objWriter->startElement('c:gapWidth'); - $objWriter->writeAttribute('val', 150); - $objWriter->endElement(); - - if ($plotGroupingType == 'percentStacked' || $plotGroupingType == 'stacked') { - $objWriter->startElement('c:overlap'); - $objWriter->writeAttribute('val', 100); - $objWriter->endElement(); - } - } elseif ($chartType === DataSeries::TYPE_BUBBLECHART) { - $objWriter->startElement('c:bubbleScale'); - $objWriter->writeAttribute('val', 25); - $objWriter->endElement(); - - $objWriter->startElement('c:showNegBubbles'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - } elseif ($chartType === DataSeries::TYPE_STOCKCHART) { - $objWriter->startElement('c:hiLowLines'); - $objWriter->endElement(); - - $objWriter->startElement('c:upDownBars'); - - $objWriter->startElement('c:gapWidth'); - $objWriter->writeAttribute('val', 300); - $objWriter->endElement(); - - $objWriter->startElement('c:upBars'); - $objWriter->endElement(); - - $objWriter->startElement('c:downBars'); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - // Generate 2 unique numbers to use for axId values - $id1 = '75091328'; - $id2 = '75089408'; - - if (($chartType !== DataSeries::TYPE_PIECHART) && ($chartType !== DataSeries::TYPE_PIECHART_3D) && ($chartType !== DataSeries::TYPE_DONUTCHART)) { - $objWriter->startElement('c:axId'); - $objWriter->writeAttribute('val', $id1); - $objWriter->endElement(); - $objWriter->startElement('c:axId'); - $objWriter->writeAttribute('val', $id2); - $objWriter->endElement(); - } else { - $objWriter->startElement('c:firstSliceAng'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - - if ($chartType === DataSeries::TYPE_DONUTCHART) { - $objWriter->startElement('c:holeSize'); - $objWriter->writeAttribute('val', 50); - $objWriter->endElement(); - } - } - - $objWriter->endElement(); - } - - if (($chartType !== DataSeries::TYPE_PIECHART) && ($chartType !== DataSeries::TYPE_PIECHART_3D) && ($chartType !== DataSeries::TYPE_DONUTCHART)) { - if ($chartType === DataSeries::TYPE_BUBBLECHART) { - $this->writeValueAxis($objWriter, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $majorGridlines, $minorGridlines); - } else { - $this->writeCategoryAxis($objWriter, $xAxisLabel, $id1, $id2, $catIsMultiLevelSeries, $yAxis); - } - - $this->writeValueAxis($objWriter, $yAxisLabel, $chartType, $id1, $id2, $valIsMultiLevelSeries, $xAxis, $majorGridlines, $minorGridlines); - } - - $objWriter->endElement(); - } - - /** - * Write Data Labels. - * - * @param XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpSpreadsheet\Chart\Layout $chartLayout Chart layout - */ - private function writeDataLabels(XMLWriter $objWriter, ?Layout $chartLayout = null): void - { - $objWriter->startElement('c:dLbls'); - - $objWriter->startElement('c:showLegendKey'); - $showLegendKey = (empty($chartLayout)) ? 0 : $chartLayout->getShowLegendKey(); - $objWriter->writeAttribute('val', ((empty($showLegendKey)) ? 0 : 1)); - $objWriter->endElement(); - - $objWriter->startElement('c:showVal'); - $showVal = (empty($chartLayout)) ? 0 : $chartLayout->getShowVal(); - $objWriter->writeAttribute('val', ((empty($showVal)) ? 0 : 1)); - $objWriter->endElement(); - - $objWriter->startElement('c:showCatName'); - $showCatName = (empty($chartLayout)) ? 0 : $chartLayout->getShowCatName(); - $objWriter->writeAttribute('val', ((empty($showCatName)) ? 0 : 1)); - $objWriter->endElement(); - - $objWriter->startElement('c:showSerName'); - $showSerName = (empty($chartLayout)) ? 0 : $chartLayout->getShowSerName(); - $objWriter->writeAttribute('val', ((empty($showSerName)) ? 0 : 1)); - $objWriter->endElement(); - - $objWriter->startElement('c:showPercent'); - $showPercent = (empty($chartLayout)) ? 0 : $chartLayout->getShowPercent(); - $objWriter->writeAttribute('val', ((empty($showPercent)) ? 0 : 1)); - $objWriter->endElement(); - - $objWriter->startElement('c:showBubbleSize'); - $showBubbleSize = (empty($chartLayout)) ? 0 : $chartLayout->getShowBubbleSize(); - $objWriter->writeAttribute('val', ((empty($showBubbleSize)) ? 0 : 1)); - $objWriter->endElement(); - - $objWriter->startElement('c:showLeaderLines'); - $showLeaderLines = (empty($chartLayout)) ? 1 : $chartLayout->getShowLeaderLines(); - $objWriter->writeAttribute('val', ((empty($showLeaderLines)) ? 0 : 1)); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Write Category Axis. - * - * @param XMLWriter $objWriter XML Writer - * @param Title $xAxisLabel - * @param string $id1 - * @param string $id2 - * @param bool $isMultiLevelSeries - */ - private function writeCategoryAxis($objWriter, $xAxisLabel, $id1, $id2, $isMultiLevelSeries, Axis $yAxis): void - { - $objWriter->startElement('c:catAx'); - - if ($id1 > 0) { - $objWriter->startElement('c:axId'); - $objWriter->writeAttribute('val', $id1); - $objWriter->endElement(); - } - - $objWriter->startElement('c:scaling'); - $objWriter->startElement('c:orientation'); - $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('orientation')); - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->startElement('c:delete'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - - $objWriter->startElement('c:axPos'); - $objWriter->writeAttribute('val', 'b'); - $objWriter->endElement(); - - if ($xAxisLabel !== null) { - $objWriter->startElement('c:title'); - $objWriter->startElement('c:tx'); - $objWriter->startElement('c:rich'); - - $objWriter->startElement('a:bodyPr'); - $objWriter->endElement(); - - $objWriter->startElement('a:lstStyle'); - $objWriter->endElement(); - - $objWriter->startElement('a:p'); - $objWriter->startElement('a:r'); - - $caption = $xAxisLabel->getCaption(); - if (is_array($caption)) { - $caption = $caption[0]; - } - $objWriter->startElement('a:t'); - $objWriter->writeRawData(StringHelper::controlCharacterPHP2OOXML($caption)); - $objWriter->endElement(); - - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - - $layout = $xAxisLabel->getLayout(); - $this->writeLayout($objWriter, $layout); - - $objWriter->startElement('c:overlay'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - $objWriter->startElement('c:numFmt'); - $objWriter->writeAttribute('formatCode', $yAxis->getAxisNumberFormat()); - $objWriter->writeAttribute('sourceLinked', $yAxis->getAxisNumberSourceLinked()); - $objWriter->endElement(); - - $objWriter->startElement('c:majorTickMark'); - $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('major_tick_mark')); - $objWriter->endElement(); - - $objWriter->startElement('c:minorTickMark'); - $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('minor_tick_mark')); - $objWriter->endElement(); - - $objWriter->startElement('c:tickLblPos'); - $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('axis_labels')); - $objWriter->endElement(); - - if ($id2 > 0) { - $objWriter->startElement('c:crossAx'); - $objWriter->writeAttribute('val', $id2); - $objWriter->endElement(); - - $objWriter->startElement('c:crosses'); - $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('horizontal_crosses')); - $objWriter->endElement(); - } - - $objWriter->startElement('c:auto'); - $objWriter->writeAttribute('val', 1); - $objWriter->endElement(); - - $objWriter->startElement('c:lblAlgn'); - $objWriter->writeAttribute('val', 'ctr'); - $objWriter->endElement(); - - $objWriter->startElement('c:lblOffset'); - $objWriter->writeAttribute('val', 100); - $objWriter->endElement(); - - if ($isMultiLevelSeries) { - $objWriter->startElement('c:noMultiLvlLbl'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - } - $objWriter->endElement(); - } - - /** - * Write Value Axis. - * - * @param XMLWriter $objWriter XML Writer - * @param Title $yAxisLabel - * @param string $groupType Chart type - * @param string $id1 - * @param string $id2 - * @param bool $isMultiLevelSeries - */ - private function writeValueAxis($objWriter, $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, Axis $xAxis, GridLines $majorGridlines, GridLines $minorGridlines): void - { - $objWriter->startElement('c:valAx'); - - if ($id2 > 0) { - $objWriter->startElement('c:axId'); - $objWriter->writeAttribute('val', $id2); - $objWriter->endElement(); - } - - $objWriter->startElement('c:scaling'); - - if ($xAxis->getAxisOptionsProperty('maximum') !== null) { - $objWriter->startElement('c:max'); - $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('maximum')); - $objWriter->endElement(); - } - - if ($xAxis->getAxisOptionsProperty('minimum') !== null) { - $objWriter->startElement('c:min'); - $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minimum')); - $objWriter->endElement(); - } - - $objWriter->startElement('c:orientation'); - $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('orientation')); - - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->startElement('c:delete'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - - $objWriter->startElement('c:axPos'); - $objWriter->writeAttribute('val', 'l'); - $objWriter->endElement(); - - $objWriter->startElement('c:majorGridlines'); - $objWriter->startElement('c:spPr'); - - if ($majorGridlines->getLineColorProperty('value') !== null) { - $objWriter->startElement('a:ln'); - $objWriter->writeAttribute('w', $majorGridlines->getLineStyleProperty('width')); - $objWriter->startElement('a:solidFill'); - $objWriter->startElement("a:{$majorGridlines->getLineColorProperty('type')}"); - $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('value')); - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('alpha')); - $objWriter->endElement(); //end alpha - $objWriter->endElement(); //end srgbClr - $objWriter->endElement(); //end solidFill - - $objWriter->startElement('a:prstDash'); - $objWriter->writeAttribute('val', $majorGridlines->getLineStyleProperty('dash')); - $objWriter->endElement(); - - if ($majorGridlines->getLineStyleProperty('join') == 'miter') { - $objWriter->startElement('a:miter'); - $objWriter->writeAttribute('lim', '800000'); - $objWriter->endElement(); - } else { - $objWriter->startElement('a:bevel'); - $objWriter->endElement(); - } - - if ($majorGridlines->getLineStyleProperty(['arrow', 'head', 'type']) !== null) { - $objWriter->startElement('a:headEnd'); - $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(['arrow', 'head', 'type'])); - $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('head', 'w')); - $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('head', 'len')); - $objWriter->endElement(); - } - - if ($majorGridlines->getLineStyleProperty(['arrow', 'end', 'type']) !== null) { - $objWriter->startElement('a:tailEnd'); - $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(['arrow', 'end', 'type'])); - $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('end', 'w')); - $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('end', 'len')); - $objWriter->endElement(); - } - $objWriter->endElement(); //end ln - } - $objWriter->startElement('a:effectLst'); - - if ($majorGridlines->getGlowSize() !== null) { - $objWriter->startElement('a:glow'); - $objWriter->writeAttribute('rad', $majorGridlines->getGlowSize()); - $objWriter->startElement("a:{$majorGridlines->getGlowColor('type')}"); - $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('value')); - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('alpha')); - $objWriter->endElement(); //end alpha - $objWriter->endElement(); //end schemeClr - $objWriter->endElement(); //end glow - } - - if ($majorGridlines->getShadowProperty('presets') !== null) { - $objWriter->startElement("a:{$majorGridlines->getShadowProperty('effect')}"); - if ($majorGridlines->getShadowProperty('blur') !== null) { - $objWriter->writeAttribute('blurRad', $majorGridlines->getShadowProperty('blur')); - } - if ($majorGridlines->getShadowProperty('distance') !== null) { - $objWriter->writeAttribute('dist', $majorGridlines->getShadowProperty('distance')); - } - if ($majorGridlines->getShadowProperty('direction') !== null) { - $objWriter->writeAttribute('dir', $majorGridlines->getShadowProperty('direction')); - } - if ($majorGridlines->getShadowProperty('algn') !== null) { - $objWriter->writeAttribute('algn', $majorGridlines->getShadowProperty('algn')); - } - if ($majorGridlines->getShadowProperty(['size', 'sx']) !== null) { - $objWriter->writeAttribute('sx', $majorGridlines->getShadowProperty(['size', 'sx'])); - } - if ($majorGridlines->getShadowProperty(['size', 'sy']) !== null) { - $objWriter->writeAttribute('sy', $majorGridlines->getShadowProperty(['size', 'sy'])); - } - if ($majorGridlines->getShadowProperty(['size', 'kx']) !== null) { - $objWriter->writeAttribute('kx', $majorGridlines->getShadowProperty(['size', 'kx'])); - } - if ($majorGridlines->getShadowProperty('rotWithShape') !== null) { - $objWriter->writeAttribute('rotWithShape', $majorGridlines->getShadowProperty('rotWithShape')); - } - $objWriter->startElement("a:{$majorGridlines->getShadowProperty(['color', 'type'])}"); - $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(['color', 'value'])); - - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(['color', 'alpha'])); - $objWriter->endElement(); //end alpha - - $objWriter->endElement(); //end color:type - $objWriter->endElement(); //end shadow - } - - if ($majorGridlines->getSoftEdgesSize() !== null) { - $objWriter->startElement('a:softEdge'); - $objWriter->writeAttribute('rad', $majorGridlines->getSoftEdgesSize()); - $objWriter->endElement(); //end softEdge - } - - $objWriter->endElement(); //end effectLst - $objWriter->endElement(); //end spPr - $objWriter->endElement(); //end majorGridLines - - if ($minorGridlines->getObjectState()) { - $objWriter->startElement('c:minorGridlines'); - $objWriter->startElement('c:spPr'); - - if ($minorGridlines->getLineColorProperty('value') !== null) { - $objWriter->startElement('a:ln'); - $objWriter->writeAttribute('w', $minorGridlines->getLineStyleProperty('width')); - $objWriter->startElement('a:solidFill'); - $objWriter->startElement("a:{$minorGridlines->getLineColorProperty('type')}"); - $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('value')); - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('alpha')); - $objWriter->endElement(); //end alpha - $objWriter->endElement(); //end srgbClr - $objWriter->endElement(); //end solidFill - - $objWriter->startElement('a:prstDash'); - $objWriter->writeAttribute('val', $minorGridlines->getLineStyleProperty('dash')); - $objWriter->endElement(); - - if ($minorGridlines->getLineStyleProperty('join') == 'miter') { - $objWriter->startElement('a:miter'); - $objWriter->writeAttribute('lim', '800000'); - $objWriter->endElement(); - } else { - $objWriter->startElement('a:bevel'); - $objWriter->endElement(); - } - - if ($minorGridlines->getLineStyleProperty(['arrow', 'head', 'type']) !== null) { - $objWriter->startElement('a:headEnd'); - $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(['arrow', 'head', 'type'])); - $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('head', 'w')); - $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('head', 'len')); - $objWriter->endElement(); - } - - if ($minorGridlines->getLineStyleProperty(['arrow', 'end', 'type']) !== null) { - $objWriter->startElement('a:tailEnd'); - $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(['arrow', 'end', 'type'])); - $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('end', 'w')); - $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('end', 'len')); - $objWriter->endElement(); - } - $objWriter->endElement(); //end ln - } - - $objWriter->startElement('a:effectLst'); - - if ($minorGridlines->getGlowSize() !== null) { - $objWriter->startElement('a:glow'); - $objWriter->writeAttribute('rad', $minorGridlines->getGlowSize()); - $objWriter->startElement("a:{$minorGridlines->getGlowColor('type')}"); - $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('value')); - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('alpha')); - $objWriter->endElement(); //end alpha - $objWriter->endElement(); //end schemeClr - $objWriter->endElement(); //end glow - } - - if ($minorGridlines->getShadowProperty('presets') !== null) { - $objWriter->startElement("a:{$minorGridlines->getShadowProperty('effect')}"); - if ($minorGridlines->getShadowProperty('blur') !== null) { - $objWriter->writeAttribute('blurRad', $minorGridlines->getShadowProperty('blur')); - } - if ($minorGridlines->getShadowProperty('distance') !== null) { - $objWriter->writeAttribute('dist', $minorGridlines->getShadowProperty('distance')); - } - if ($minorGridlines->getShadowProperty('direction') !== null) { - $objWriter->writeAttribute('dir', $minorGridlines->getShadowProperty('direction')); - } - if ($minorGridlines->getShadowProperty('algn') !== null) { - $objWriter->writeAttribute('algn', $minorGridlines->getShadowProperty('algn')); - } - if ($minorGridlines->getShadowProperty(['size', 'sx']) !== null) { - $objWriter->writeAttribute('sx', $minorGridlines->getShadowProperty(['size', 'sx'])); - } - if ($minorGridlines->getShadowProperty(['size', 'sy']) !== null) { - $objWriter->writeAttribute('sy', $minorGridlines->getShadowProperty(['size', 'sy'])); - } - if ($minorGridlines->getShadowProperty(['size', 'kx']) !== null) { - $objWriter->writeAttribute('kx', $minorGridlines->getShadowProperty(['size', 'kx'])); - } - if ($minorGridlines->getShadowProperty('rotWithShape') !== null) { - $objWriter->writeAttribute('rotWithShape', $minorGridlines->getShadowProperty('rotWithShape')); - } - $objWriter->startElement("a:{$minorGridlines->getShadowProperty(['color', 'type'])}"); - $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(['color', 'value'])); - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(['color', 'alpha'])); - $objWriter->endElement(); //end alpha - $objWriter->endElement(); //end color:type - $objWriter->endElement(); //end shadow - } - - if ($minorGridlines->getSoftEdgesSize() !== null) { - $objWriter->startElement('a:softEdge'); - $objWriter->writeAttribute('rad', $minorGridlines->getSoftEdgesSize()); - $objWriter->endElement(); //end softEdge - } - - $objWriter->endElement(); //end effectLst - $objWriter->endElement(); //end spPr - $objWriter->endElement(); //end minorGridLines - } - - if ($yAxisLabel !== null) { - $objWriter->startElement('c:title'); - $objWriter->startElement('c:tx'); - $objWriter->startElement('c:rich'); - - $objWriter->startElement('a:bodyPr'); - $objWriter->endElement(); - - $objWriter->startElement('a:lstStyle'); - $objWriter->endElement(); - - $objWriter->startElement('a:p'); - $objWriter->startElement('a:r'); - - $caption = $yAxisLabel->getCaption(); - if (is_array($caption)) { - $caption = $caption[0]; - } - - $objWriter->startElement('a:t'); - $objWriter->writeRawData(StringHelper::controlCharacterPHP2OOXML($caption)); - $objWriter->endElement(); - - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - - if ($groupType !== DataSeries::TYPE_BUBBLECHART) { - $layout = $yAxisLabel->getLayout(); - $this->writeLayout($objWriter, $layout); - } - - $objWriter->startElement('c:overlay'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - $objWriter->startElement('c:numFmt'); - $objWriter->writeAttribute('formatCode', $xAxis->getAxisNumberFormat()); - $objWriter->writeAttribute('sourceLinked', $xAxis->getAxisNumberSourceLinked()); - $objWriter->endElement(); - - $objWriter->startElement('c:majorTickMark'); - $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_tick_mark')); - $objWriter->endElement(); - - $objWriter->startElement('c:minorTickMark'); - $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_tick_mark')); - $objWriter->endElement(); - - $objWriter->startElement('c:tickLblPos'); - $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('axis_labels')); - $objWriter->endElement(); - - $objWriter->startElement('c:spPr'); - - if ($xAxis->getFillProperty('value') !== null) { - $objWriter->startElement('a:solidFill'); - $objWriter->startElement('a:' . $xAxis->getFillProperty('type')); - $objWriter->writeAttribute('val', $xAxis->getFillProperty('value')); - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $xAxis->getFillProperty('alpha')); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - } - - $objWriter->startElement('a:ln'); - - $objWriter->writeAttribute('w', $xAxis->getLineStyleProperty('width')); - $objWriter->writeAttribute('cap', $xAxis->getLineStyleProperty('cap')); - $objWriter->writeAttribute('cmpd', $xAxis->getLineStyleProperty('compound')); - - if ($xAxis->getLineProperty('value') !== null) { - $objWriter->startElement('a:solidFill'); - $objWriter->startElement('a:' . $xAxis->getLineProperty('type')); - $objWriter->writeAttribute('val', $xAxis->getLineProperty('value')); - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $xAxis->getLineProperty('alpha')); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - } - - $objWriter->startElement('a:prstDash'); - $objWriter->writeAttribute('val', $xAxis->getLineStyleProperty('dash')); - $objWriter->endElement(); - - if ($xAxis->getLineStyleProperty('join') == 'miter') { - $objWriter->startElement('a:miter'); - $objWriter->writeAttribute('lim', '800000'); - $objWriter->endElement(); - } else { - $objWriter->startElement('a:bevel'); - $objWriter->endElement(); - } - - if ($xAxis->getLineStyleProperty(['arrow', 'head', 'type']) !== null) { - $objWriter->startElement('a:headEnd'); - $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(['arrow', 'head', 'type'])); - $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('head')); - $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('head')); - $objWriter->endElement(); - } - - if ($xAxis->getLineStyleProperty(['arrow', 'end', 'type']) !== null) { - $objWriter->startElement('a:tailEnd'); - $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(['arrow', 'end', 'type'])); - $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('end')); - $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('end')); - $objWriter->endElement(); - } - - $objWriter->endElement(); - - $objWriter->startElement('a:effectLst'); - - if ($xAxis->getGlowProperty('size') !== null) { - $objWriter->startElement('a:glow'); - $objWriter->writeAttribute('rad', $xAxis->getGlowProperty('size')); - $objWriter->startElement("a:{$xAxis->getGlowProperty(['color', 'type'])}"); - $objWriter->writeAttribute('val', $xAxis->getGlowProperty(['color', 'value'])); - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $xAxis->getGlowProperty(['color', 'alpha'])); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - } - - if ($xAxis->getShadowProperty('presets') !== null) { - $objWriter->startElement("a:{$xAxis->getShadowProperty('effect')}"); - - if ($xAxis->getShadowProperty('blur') !== null) { - $objWriter->writeAttribute('blurRad', $xAxis->getShadowProperty('blur')); - } - if ($xAxis->getShadowProperty('distance') !== null) { - $objWriter->writeAttribute('dist', $xAxis->getShadowProperty('distance')); - } - if ($xAxis->getShadowProperty('direction') !== null) { - $objWriter->writeAttribute('dir', $xAxis->getShadowProperty('direction')); - } - if ($xAxis->getShadowProperty('algn') !== null) { - $objWriter->writeAttribute('algn', $xAxis->getShadowProperty('algn')); - } - if ($xAxis->getShadowProperty(['size', 'sx']) !== null) { - $objWriter->writeAttribute('sx', $xAxis->getShadowProperty(['size', 'sx'])); - } - if ($xAxis->getShadowProperty(['size', 'sy']) !== null) { - $objWriter->writeAttribute('sy', $xAxis->getShadowProperty(['size', 'sy'])); - } - if ($xAxis->getShadowProperty(['size', 'kx']) !== null) { - $objWriter->writeAttribute('kx', $xAxis->getShadowProperty(['size', 'kx'])); - } - if ($xAxis->getShadowProperty('rotWithShape') !== null) { - $objWriter->writeAttribute('rotWithShape', $xAxis->getShadowProperty('rotWithShape')); - } - - $objWriter->startElement("a:{$xAxis->getShadowProperty(['color', 'type'])}"); - $objWriter->writeAttribute('val', $xAxis->getShadowProperty(['color', 'value'])); - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $xAxis->getShadowProperty(['color', 'alpha'])); - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - if ($xAxis->getSoftEdgesSize() !== null) { - $objWriter->startElement('a:softEdge'); - $objWriter->writeAttribute('rad', $xAxis->getSoftEdgesSize()); - $objWriter->endElement(); - } - - $objWriter->endElement(); //effectList - $objWriter->endElement(); //end spPr - - if ($id1 > 0) { - $objWriter->startElement('c:crossAx'); - $objWriter->writeAttribute('val', $id2); - $objWriter->endElement(); - - if ($xAxis->getAxisOptionsProperty('horizontal_crosses_value') !== null) { - $objWriter->startElement('c:crossesAt'); - $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses_value')); - $objWriter->endElement(); - } else { - $objWriter->startElement('c:crosses'); - $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses')); - $objWriter->endElement(); - } - - $objWriter->startElement('c:crossBetween'); - $objWriter->writeAttribute('val', 'midCat'); - $objWriter->endElement(); - - if ($xAxis->getAxisOptionsProperty('major_unit') !== null) { - $objWriter->startElement('c:majorUnit'); - $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_unit')); - $objWriter->endElement(); - } - - if ($xAxis->getAxisOptionsProperty('minor_unit') !== null) { - $objWriter->startElement('c:minorUnit'); - $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_unit')); - $objWriter->endElement(); - } - } - - if ($isMultiLevelSeries) { - if ($groupType !== DataSeries::TYPE_BUBBLECHART) { - $objWriter->startElement('c:noMultiLvlLbl'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - } - } - - $objWriter->endElement(); - } - - /** - * Get the data series type(s) for a chart plot series. - * - * @param PlotArea $plotArea - * - * @return array|string - */ - private static function getChartType($plotArea) - { - $groupCount = $plotArea->getPlotGroupCount(); - - if ($groupCount == 1) { - $chartType = [$plotArea->getPlotGroupByIndex(0)->getPlotType()]; - } else { - $chartTypes = []; - for ($i = 0; $i < $groupCount; ++$i) { - $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType(); - } - $chartType = array_unique($chartTypes); - if (count($chartTypes) == 0) { - throw new WriterException('Chart is not yet implemented'); - } - } - - return $chartType; - } - - /** - * Method writing plot series values. - * - * @param XMLWriter $objWriter XML Writer - * @param int $val value for idx (default: 3) - * @param string $fillColor hex color (default: FF9900) - * - * @return XMLWriter XML Writer - */ - private function writePlotSeriesValuesElement($objWriter, $val = 3, $fillColor = 'FF9900') - { - $objWriter->startElement('c:dPt'); - $objWriter->startElement('c:idx'); - $objWriter->writeAttribute('val', $val); - $objWriter->endElement(); - - $objWriter->startElement('c:bubble3D'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - - $objWriter->startElement('c:spPr'); - $objWriter->startElement('a:solidFill'); - $objWriter->startElement('a:srgbClr'); - $objWriter->writeAttribute('val', $fillColor); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - - return $objWriter; - } - - /** - * Write Plot Group (series of related plots). - * - * @param DataSeries $plotGroup - * @param string $groupType Type of plot for dataseries - * @param XMLWriter $objWriter XML Writer - * @param bool &$catIsMultiLevelSeries Is category a multi-series category - * @param bool &$valIsMultiLevelSeries Is value set a multi-series set - * @param string &$plotGroupingType Type of grouping for multi-series values - */ - private function writePlotGroup($plotGroup, $groupType, $objWriter, &$catIsMultiLevelSeries, &$valIsMultiLevelSeries, &$plotGroupingType): void - { - if ($plotGroup === null) { - return; - } - - if (($groupType == DataSeries::TYPE_BARCHART) || ($groupType == DataSeries::TYPE_BARCHART_3D)) { - $objWriter->startElement('c:barDir'); - $objWriter->writeAttribute('val', $plotGroup->getPlotDirection()); - $objWriter->endElement(); - } - - if ($plotGroup->getPlotGrouping() !== null) { - $plotGroupingType = $plotGroup->getPlotGrouping(); - $objWriter->startElement('c:grouping'); - $objWriter->writeAttribute('val', $plotGroupingType); - $objWriter->endElement(); - } - - // Get these details before the loop, because we can use the count to check for varyColors - $plotSeriesOrder = $plotGroup->getPlotOrder(); - $plotSeriesCount = count($plotSeriesOrder); - - if (($groupType !== DataSeries::TYPE_RADARCHART) && ($groupType !== DataSeries::TYPE_STOCKCHART)) { - if ($groupType !== DataSeries::TYPE_LINECHART) { - if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART) || ($plotSeriesCount > 1)) { - $objWriter->startElement('c:varyColors'); - $objWriter->writeAttribute('val', 1); - $objWriter->endElement(); - } else { - $objWriter->startElement('c:varyColors'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - } - } - } - - foreach ($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) { - $objWriter->startElement('c:ser'); - - $plotLabel = $plotGroup->getPlotLabelByIndex($plotSeriesIdx); - if ($plotLabel) { - $fillColor = $plotLabel->getFillColor(); - if ($fillColor !== null && !is_array($fillColor)) { - $objWriter->startElement('c:spPr'); - $objWriter->startElement('a:solidFill'); - $objWriter->startElement('a:srgbClr'); - $objWriter->writeAttribute('val', $fillColor); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - } - } - - $objWriter->startElement('c:idx'); - $objWriter->writeAttribute('val', $this->seriesIndex + $plotSeriesIdx); - $objWriter->endElement(); - - $objWriter->startElement('c:order'); - $objWriter->writeAttribute('val', $this->seriesIndex + $plotSeriesRef); - $objWriter->endElement(); - - // Values - $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef); - - if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) { - $fillColorValues = $plotSeriesValues->getFillColor(); - if ($fillColorValues !== null && is_array($fillColorValues)) { - foreach ($plotSeriesValues->getDataValues() as $dataKey => $dataValue) { - $this->writePlotSeriesValuesElement($objWriter, $dataKey, ($fillColorValues[$dataKey] ?? 'FF9900')); - } - } else { - $this->writePlotSeriesValuesElement($objWriter); - } - } - - // Labels - $plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef); - if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) { - $objWriter->startElement('c:tx'); - $objWriter->startElement('c:strRef'); - $this->writePlotSeriesLabel($plotSeriesLabel, $objWriter); - $objWriter->endElement(); - $objWriter->endElement(); - } - - // Formatting for the points - if (($groupType == DataSeries::TYPE_LINECHART) || ($groupType == DataSeries::TYPE_STOCKCHART)) { - $plotLineWidth = 12700; - if ($plotSeriesValues) { - $plotLineWidth = $plotSeriesValues->getLineWidth(); - } - - $objWriter->startElement('c:spPr'); - $objWriter->startElement('a:ln'); - $objWriter->writeAttribute('w', $plotLineWidth); - if ($groupType == DataSeries::TYPE_STOCKCHART) { - $objWriter->startElement('a:noFill'); - $objWriter->endElement(); - } - $objWriter->endElement(); - $objWriter->endElement(); - } - - if ($plotSeriesValues) { - $plotSeriesMarker = $plotSeriesValues->getPointMarker(); - if ($plotSeriesMarker) { - $objWriter->startElement('c:marker'); - $objWriter->startElement('c:symbol'); - $objWriter->writeAttribute('val', $plotSeriesMarker); - $objWriter->endElement(); - - if ($plotSeriesMarker !== 'none') { - $objWriter->startElement('c:size'); - $objWriter->writeAttribute('val', 3); - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - } - - if (($groupType === DataSeries::TYPE_BARCHART) || ($groupType === DataSeries::TYPE_BARCHART_3D) || ($groupType === DataSeries::TYPE_BUBBLECHART)) { - $objWriter->startElement('c:invertIfNegative'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - } - - // Category Labels - $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef); - if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) { - $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries(); - - if (($groupType == DataSeries::TYPE_PIECHART) || ($groupType == DataSeries::TYPE_PIECHART_3D) || ($groupType == DataSeries::TYPE_DONUTCHART)) { - if ($plotGroup->getPlotStyle() !== null) { - $plotStyle = $plotGroup->getPlotStyle(); - if ($plotStyle) { - $objWriter->startElement('c:explosion'); - $objWriter->writeAttribute('val', 25); - $objWriter->endElement(); - } - } - } - - if (($groupType === DataSeries::TYPE_BUBBLECHART) || ($groupType === DataSeries::TYPE_SCATTERCHART)) { - $objWriter->startElement('c:xVal'); - } else { - $objWriter->startElement('c:cat'); - } - - $this->writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str'); - $objWriter->endElement(); - } - - // Values - if ($plotSeriesValues) { - $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries(); - - if (($groupType === DataSeries::TYPE_BUBBLECHART) || ($groupType === DataSeries::TYPE_SCATTERCHART)) { - $objWriter->startElement('c:yVal'); - } else { - $objWriter->startElement('c:val'); - } - - $this->writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num'); - $objWriter->endElement(); - } - - if ($groupType === DataSeries::TYPE_BUBBLECHART) { - $this->writeBubbles($plotSeriesValues, $objWriter); - } - - $objWriter->endElement(); - } - - $this->seriesIndex += $plotSeriesIdx + 1; - } - - /** - * Write Plot Series Label. - * - * @param DataSeriesValues $plotSeriesLabel - * @param XMLWriter $objWriter XML Writer - */ - private function writePlotSeriesLabel($plotSeriesLabel, $objWriter): void - { - if ($plotSeriesLabel === null) { - return; - } - - $objWriter->startElement('c:f'); - $objWriter->writeRawData($plotSeriesLabel->getDataSource()); - $objWriter->endElement(); - - $objWriter->startElement('c:strCache'); - $objWriter->startElement('c:ptCount'); - $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount()); - $objWriter->endElement(); - - foreach ($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) { - $objWriter->startElement('c:pt'); - $objWriter->writeAttribute('idx', $plotLabelKey); - - $objWriter->startElement('c:v'); - $objWriter->writeRawData($plotLabelValue); - $objWriter->endElement(); - $objWriter->endElement(); - } - $objWriter->endElement(); - } - - /** - * Write Plot Series Values. - * - * @param DataSeriesValues $plotSeriesValues - * @param XMLWriter $objWriter XML Writer - * @param string $groupType Type of plot for dataseries - * @param string $dataType Datatype of series values - */ - private function writePlotSeriesValues($plotSeriesValues, XMLWriter $objWriter, $groupType, $dataType = 'str'): void - { - if ($plotSeriesValues === null) { - return; - } - - if ($plotSeriesValues->isMultiLevelSeries()) { - $levelCount = $plotSeriesValues->multiLevelCount(); - - $objWriter->startElement('c:multiLvlStrRef'); - - $objWriter->startElement('c:f'); - $objWriter->writeRawData($plotSeriesValues->getDataSource()); - $objWriter->endElement(); - - $objWriter->startElement('c:multiLvlStrCache'); - - $objWriter->startElement('c:ptCount'); - $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount()); - $objWriter->endElement(); - - for ($level = 0; $level < $levelCount; ++$level) { - $objWriter->startElement('c:lvl'); - - foreach ($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) { - if (isset($plotSeriesValue[$level])) { - $objWriter->startElement('c:pt'); - $objWriter->writeAttribute('idx', $plotSeriesKey); - - $objWriter->startElement('c:v'); - $objWriter->writeRawData($plotSeriesValue[$level]); - $objWriter->endElement(); - $objWriter->endElement(); - } - } - - $objWriter->endElement(); - } - - $objWriter->endElement(); - - $objWriter->endElement(); - } else { - $objWriter->startElement('c:' . $dataType . 'Ref'); - - $objWriter->startElement('c:f'); - $objWriter->writeRawData($plotSeriesValues->getDataSource()); - $objWriter->endElement(); - - $objWriter->startElement('c:' . $dataType . 'Cache'); - - if (($groupType != DataSeries::TYPE_PIECHART) && ($groupType != DataSeries::TYPE_PIECHART_3D) && ($groupType != DataSeries::TYPE_DONUTCHART)) { - if (($plotSeriesValues->getFormatCode() !== null) && ($plotSeriesValues->getFormatCode() !== '')) { - $objWriter->startElement('c:formatCode'); - $objWriter->writeRawData($plotSeriesValues->getFormatCode()); - $objWriter->endElement(); - } - } - - $objWriter->startElement('c:ptCount'); - $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount()); - $objWriter->endElement(); - - $dataValues = $plotSeriesValues->getDataValues(); - if (!empty($dataValues)) { - if (is_array($dataValues)) { - foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) { - $objWriter->startElement('c:pt'); - $objWriter->writeAttribute('idx', $plotSeriesKey); - - $objWriter->startElement('c:v'); - $objWriter->writeRawData($plotSeriesValue); - $objWriter->endElement(); - $objWriter->endElement(); - } - } - } - - $objWriter->endElement(); - - $objWriter->endElement(); - } - } - - /** - * Write Bubble Chart Details. - * - * @param DataSeriesValues $plotSeriesValues - * @param XMLWriter $objWriter XML Writer - */ - private function writeBubbles($plotSeriesValues, $objWriter): void - { - if ($plotSeriesValues === null) { - return; - } - - $objWriter->startElement('c:bubbleSize'); - $objWriter->startElement('c:numLit'); - - $objWriter->startElement('c:formatCode'); - $objWriter->writeRawData('General'); - $objWriter->endElement(); - - $objWriter->startElement('c:ptCount'); - $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount()); - $objWriter->endElement(); - - $dataValues = $plotSeriesValues->getDataValues(); - if (!empty($dataValues)) { - if (is_array($dataValues)) { - foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) { - $objWriter->startElement('c:pt'); - $objWriter->writeAttribute('idx', $plotSeriesKey); - $objWriter->startElement('c:v'); - $objWriter->writeRawData(1); - $objWriter->endElement(); - $objWriter->endElement(); - } - } - } - - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->startElement('c:bubble3D'); - $objWriter->writeAttribute('val', 0); - $objWriter->endElement(); - } - - /** - * Write Layout. - * - * @param XMLWriter $objWriter XML Writer - * @param Layout $layout - */ - private function writeLayout(XMLWriter $objWriter, ?Layout $layout = null): void - { - $objWriter->startElement('c:layout'); - - if ($layout !== null) { - $objWriter->startElement('c:manualLayout'); - - $layoutTarget = $layout->getLayoutTarget(); - if ($layoutTarget !== null) { - $objWriter->startElement('c:layoutTarget'); - $objWriter->writeAttribute('val', $layoutTarget); - $objWriter->endElement(); - } - - $xMode = $layout->getXMode(); - if ($xMode !== null) { - $objWriter->startElement('c:xMode'); - $objWriter->writeAttribute('val', $xMode); - $objWriter->endElement(); - } - - $yMode = $layout->getYMode(); - if ($yMode !== null) { - $objWriter->startElement('c:yMode'); - $objWriter->writeAttribute('val', $yMode); - $objWriter->endElement(); - } - - $x = $layout->getXPosition(); - if ($x !== null) { - $objWriter->startElement('c:x'); - $objWriter->writeAttribute('val', $x); - $objWriter->endElement(); - } - - $y = $layout->getYPosition(); - if ($y !== null) { - $objWriter->startElement('c:y'); - $objWriter->writeAttribute('val', $y); - $objWriter->endElement(); - } - - $w = $layout->getWidth(); - if ($w !== null) { - $objWriter->startElement('c:w'); - $objWriter->writeAttribute('val', $w); - $objWriter->endElement(); - } - - $h = $layout->getHeight(); - if ($h !== null) { - $objWriter->startElement('c:h'); - $objWriter->writeAttribute('val', $h); - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - - /** - * Write Alternate Content block. - * - * @param XMLWriter $objWriter XML Writer - */ - private function writeAlternateContent($objWriter): void - { - $objWriter->startElement('mc:AlternateContent'); - $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006'); - - $objWriter->startElement('mc:Choice'); - $objWriter->writeAttribute('xmlns:c14', 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart'); - $objWriter->writeAttribute('Requires', 'c14'); - - $objWriter->startElement('c14:style'); - $objWriter->writeAttribute('val', '102'); - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->startElement('mc:Fallback'); - $objWriter->startElement('c:style'); - $objWriter->writeAttribute('val', '2'); - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Write Printer Settings. - * - * @param XMLWriter $objWriter XML Writer - */ - private function writePrintSettings($objWriter): void - { - $objWriter->startElement('c:printSettings'); - - $objWriter->startElement('c:headerFooter'); - $objWriter->endElement(); - - $objWriter->startElement('c:pageMargins'); - $objWriter->writeAttribute('footer', 0.3); - $objWriter->writeAttribute('header', 0.3); - $objWriter->writeAttribute('r', 0.7); - $objWriter->writeAttribute('l', 0.7); - $objWriter->writeAttribute('t', 0.75); - $objWriter->writeAttribute('b', 0.75); - $objWriter->endElement(); - - $objWriter->startElement('c:pageSetup'); - $objWriter->writeAttribute('orientation', 'portrait'); - $objWriter->endElement(); - - $objWriter->endElement(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php deleted file mode 100644 index 73c4308..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php +++ /dev/null @@ -1,232 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Comments cache - $comments = $pWorksheet->getComments(); - - // Authors cache - $authors = []; - $authorId = 0; - foreach ($comments as $comment) { - if (!isset($authors[$comment->getAuthor()])) { - $authors[$comment->getAuthor()] = $authorId++; - } - } - - // comments - $objWriter->startElement('comments'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); - - // Loop through authors - $objWriter->startElement('authors'); - foreach ($authors as $author => $index) { - $objWriter->writeElement('author', $author); - } - $objWriter->endElement(); - - // Loop through comments - $objWriter->startElement('commentList'); - foreach ($comments as $key => $value) { - $this->writeComment($objWriter, $key, $value, $authors); - } - $objWriter->endElement(); - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write comment to XML format. - * - * @param XMLWriter $objWriter XML Writer - * @param string $pCellReference Cell reference - * @param Comment $pComment Comment - * @param array $pAuthors Array of authors - */ - private function writeComment(XMLWriter $objWriter, $pCellReference, Comment $pComment, array $pAuthors): void - { - // comment - $objWriter->startElement('comment'); - $objWriter->writeAttribute('ref', $pCellReference); - $objWriter->writeAttribute('authorId', $pAuthors[$pComment->getAuthor()]); - - // text - $objWriter->startElement('text'); - $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $pComment->getText()); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Write VML comments to XML format. - * - * @return string XML Output - */ - public function writeVMLComments(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet) - { - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Comments cache - $comments = $pWorksheet->getComments(); - - // xml - $objWriter->startElement('xml'); - $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml'); - $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office'); - $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel'); - - // o:shapelayout - $objWriter->startElement('o:shapelayout'); - $objWriter->writeAttribute('v:ext', 'edit'); - - // o:idmap - $objWriter->startElement('o:idmap'); - $objWriter->writeAttribute('v:ext', 'edit'); - $objWriter->writeAttribute('data', '1'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // v:shapetype - $objWriter->startElement('v:shapetype'); - $objWriter->writeAttribute('id', '_x0000_t202'); - $objWriter->writeAttribute('coordsize', '21600,21600'); - $objWriter->writeAttribute('o:spt', '202'); - $objWriter->writeAttribute('path', 'm,l,21600r21600,l21600,xe'); - - // v:stroke - $objWriter->startElement('v:stroke'); - $objWriter->writeAttribute('joinstyle', 'miter'); - $objWriter->endElement(); - - // v:path - $objWriter->startElement('v:path'); - $objWriter->writeAttribute('gradientshapeok', 't'); - $objWriter->writeAttribute('o:connecttype', 'rect'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // Loop through comments - foreach ($comments as $key => $value) { - $this->writeVMLComment($objWriter, $key, $value); - } - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write VML comment to XML format. - * - * @param XMLWriter $objWriter XML Writer - * @param string $pCellReference Cell reference, eg: 'A1' - * @param Comment $pComment Comment - */ - private function writeVMLComment(XMLWriter $objWriter, $pCellReference, Comment $pComment): void - { - // Metadata - [$column, $row] = Coordinate::coordinateFromString($pCellReference); - $column = Coordinate::columnIndexFromString($column); - $id = 1024 + $column + $row; - $id = substr($id, 0, 4); - - // v:shape - $objWriter->startElement('v:shape'); - $objWriter->writeAttribute('id', '_x0000_s' . $id); - $objWriter->writeAttribute('type', '#_x0000_t202'); - $objWriter->writeAttribute('style', 'position:absolute;margin-left:' . $pComment->getMarginLeft() . ';margin-top:' . $pComment->getMarginTop() . ';width:' . $pComment->getWidth() . ';height:' . $pComment->getHeight() . ';z-index:1;visibility:' . ($pComment->getVisible() ? 'visible' : 'hidden')); - $objWriter->writeAttribute('fillcolor', '#' . $pComment->getFillColor()->getRGB()); - $objWriter->writeAttribute('o:insetmode', 'auto'); - - // v:fill - $objWriter->startElement('v:fill'); - $objWriter->writeAttribute('color2', '#' . $pComment->getFillColor()->getRGB()); - $objWriter->endElement(); - - // v:shadow - $objWriter->startElement('v:shadow'); - $objWriter->writeAttribute('on', 't'); - $objWriter->writeAttribute('color', 'black'); - $objWriter->writeAttribute('obscured', 't'); - $objWriter->endElement(); - - // v:path - $objWriter->startElement('v:path'); - $objWriter->writeAttribute('o:connecttype', 'none'); - $objWriter->endElement(); - - // v:textbox - $objWriter->startElement('v:textbox'); - $objWriter->writeAttribute('style', 'mso-direction-alt:auto'); - - // div - $objWriter->startElement('div'); - $objWriter->writeAttribute('style', 'text-align:left'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // x:ClientData - $objWriter->startElement('x:ClientData'); - $objWriter->writeAttribute('ObjectType', 'Note'); - - // x:MoveWithCells - $objWriter->writeElement('x:MoveWithCells', ''); - - // x:SizeWithCells - $objWriter->writeElement('x:SizeWithCells', ''); - - // x:AutoFill - $objWriter->writeElement('x:AutoFill', 'False'); - - // x:Row - $objWriter->writeElement('x:Row', ($row - 1)); - - // x:Column - $objWriter->writeElement('x:Column', ($column - 1)); - - $objWriter->endElement(); - - $objWriter->endElement(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/ContentTypes.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/ContentTypes.php deleted file mode 100644 index 2cff1a8..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/ContentTypes.php +++ /dev/null @@ -1,240 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Types - $objWriter->startElement('Types'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/content-types'); - - // Theme - $this->writeOverrideContentType($objWriter, '/xl/theme/theme1.xml', 'application/vnd.openxmlformats-officedocument.theme+xml'); - - // Styles - $this->writeOverrideContentType($objWriter, '/xl/styles.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml'); - - // Rels - $this->writeDefaultContentType($objWriter, 'rels', 'application/vnd.openxmlformats-package.relationships+xml'); - - // XML - $this->writeDefaultContentType($objWriter, 'xml', 'application/xml'); - - // VML - $this->writeDefaultContentType($objWriter, 'vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'); - - // Workbook - if ($spreadsheet->hasMacros()) { //Macros in workbook ? - // Yes : not standard content but "macroEnabled" - $this->writeOverrideContentType($objWriter, '/xl/workbook.xml', 'application/vnd.ms-excel.sheet.macroEnabled.main+xml'); - //... and define a new type for the VBA project - // Better use Override, because we can use 'bin' also for xl\printerSettings\printerSettings1.bin - $this->writeOverrideContentType($objWriter, '/xl/vbaProject.bin', 'application/vnd.ms-office.vbaProject'); - if ($spreadsheet->hasMacrosCertificate()) { - // signed macros ? - // Yes : add needed information - $this->writeOverrideContentType($objWriter, '/xl/vbaProjectSignature.bin', 'application/vnd.ms-office.vbaProjectSignature'); - } - } else { - // no macros in workbook, so standard type - $this->writeOverrideContentType($objWriter, '/xl/workbook.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml'); - } - - // DocProps - $this->writeOverrideContentType($objWriter, '/docProps/app.xml', 'application/vnd.openxmlformats-officedocument.extended-properties+xml'); - - $this->writeOverrideContentType($objWriter, '/docProps/core.xml', 'application/vnd.openxmlformats-package.core-properties+xml'); - - $customPropertyList = $spreadsheet->getProperties()->getCustomProperties(); - if (!empty($customPropertyList)) { - $this->writeOverrideContentType($objWriter, '/docProps/custom.xml', 'application/vnd.openxmlformats-officedocument.custom-properties+xml'); - } - - // Worksheets - $sheetCount = $spreadsheet->getSheetCount(); - for ($i = 0; $i < $sheetCount; ++$i) { - $this->writeOverrideContentType($objWriter, '/xl/worksheets/sheet' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'); - } - - // Shared strings - $this->writeOverrideContentType($objWriter, '/xl/sharedStrings.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml'); - - // Add worksheet relationship content types - $unparsedLoadedData = $spreadsheet->getUnparsedLoadedData(); - $chart = 1; - for ($i = 0; $i < $sheetCount; ++$i) { - $drawings = $spreadsheet->getSheet($i)->getDrawingCollection(); - $drawingCount = count($drawings); - $chartCount = ($includeCharts) ? $spreadsheet->getSheet($i)->getChartCount() : 0; - $hasUnparsedDrawing = isset($unparsedLoadedData['sheets'][$spreadsheet->getSheet($i)->getCodeName()]['drawingOriginalIds']); - - // We need a drawing relationship for the worksheet if we have either drawings or charts - if (($drawingCount > 0) || ($chartCount > 0) || $hasUnparsedDrawing) { - $this->writeOverrideContentType($objWriter, '/xl/drawings/drawing' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.drawing+xml'); - } - - // If we have charts, then we need a chart relationship for every individual chart - if ($chartCount > 0) { - for ($c = 0; $c < $chartCount; ++$c) { - $this->writeOverrideContentType($objWriter, '/xl/charts/chart' . $chart++ . '.xml', 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'); - } - } - } - - // Comments - for ($i = 0; $i < $sheetCount; ++$i) { - if (count($spreadsheet->getSheet($i)->getComments()) > 0) { - $this->writeOverrideContentType($objWriter, '/xl/comments' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml'); - } - } - - // Add media content-types - $aMediaContentTypes = []; - $mediaCount = $this->getParentWriter()->getDrawingHashTable()->count(); - for ($i = 0; $i < $mediaCount; ++$i) { - $extension = ''; - $mimeType = ''; - - if ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof \PhpOffice\PhpSpreadsheet\Worksheet\Drawing) { - $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getExtension()); - $mimeType = $this->getImageMimeType($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getPath()); - } elseif ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof MemoryDrawing) { - $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType()); - $extension = explode('/', $extension); - $extension = $extension[1]; - - $mimeType = $this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType(); - } - - if (!isset($aMediaContentTypes[$extension])) { - $aMediaContentTypes[$extension] = $mimeType; - - $this->writeDefaultContentType($objWriter, $extension, $mimeType); - } - } - if ($spreadsheet->hasRibbonBinObjects()) { - // Some additional objects in the ribbon ? - // we need to write "Extension" but not already write for media content - $tabRibbonTypes = array_diff($spreadsheet->getRibbonBinObjects('types'), array_keys($aMediaContentTypes)); - foreach ($tabRibbonTypes as $aRibbonType) { - $mimeType = 'image/.' . $aRibbonType; //we wrote $mimeType like customUI Editor - $this->writeDefaultContentType($objWriter, $aRibbonType, $mimeType); - } - } - $sheetCount = $spreadsheet->getSheetCount(); - for ($i = 0; $i < $sheetCount; ++$i) { - if (count($spreadsheet->getSheet($i)->getHeaderFooter()->getImages()) > 0) { - foreach ($spreadsheet->getSheet($i)->getHeaderFooter()->getImages() as $image) { - if (!isset($aMediaContentTypes[strtolower($image->getExtension())])) { - $aMediaContentTypes[strtolower($image->getExtension())] = $this->getImageMimeType($image->getPath()); - - $this->writeDefaultContentType($objWriter, strtolower($image->getExtension()), $aMediaContentTypes[strtolower($image->getExtension())]); - } - } - } - } - - // unparsed defaults - if (isset($unparsedLoadedData['default_content_types'])) { - foreach ($unparsedLoadedData['default_content_types'] as $extName => $contentType) { - $this->writeDefaultContentType($objWriter, $extName, $contentType); - } - } - - // unparsed overrides - if (isset($unparsedLoadedData['override_content_types'])) { - foreach ($unparsedLoadedData['override_content_types'] as $partName => $overrideType) { - $this->writeOverrideContentType($objWriter, $partName, $overrideType); - } - } - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Get image mime type. - * - * @param string $pFile Filename - * - * @return string Mime Type - */ - private function getImageMimeType($pFile) - { - if (File::fileExists($pFile)) { - $image = getimagesize($pFile); - - return image_type_to_mime_type($image[2]); - } - - throw new WriterException("File $pFile does not exist"); - } - - /** - * Write Default content type. - * - * @param XMLWriter $objWriter XML Writer - * @param string $pPartname Part name - * @param string $pContentType Content type - */ - private function writeDefaultContentType(XMLWriter $objWriter, $pPartname, $pContentType): void - { - if ($pPartname != '' && $pContentType != '') { - // Write content type - $objWriter->startElement('Default'); - $objWriter->writeAttribute('Extension', $pPartname); - $objWriter->writeAttribute('ContentType', $pContentType); - $objWriter->endElement(); - } else { - throw new WriterException('Invalid parameters passed.'); - } - } - - /** - * Write Override content type. - * - * @param XMLWriter $objWriter XML Writer - * @param string $pPartname Part name - * @param string $pContentType Content type - */ - private function writeOverrideContentType(XMLWriter $objWriter, $pPartname, $pContentType): void - { - if ($pPartname != '' && $pContentType != '') { - // Write content type - $objWriter->startElement('Override'); - $objWriter->writeAttribute('PartName', $pPartname); - $objWriter->writeAttribute('ContentType', $pContentType); - $objWriter->endElement(); - } else { - throw new WriterException('Invalid parameters passed.'); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php deleted file mode 100644 index 8c3da82..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php +++ /dev/null @@ -1,223 +0,0 @@ -objWriter = $objWriter; - $this->spreadsheet = $spreadsheet; - } - - public function write(): void - { - // Write defined names - $this->objWriter->startElement('definedNames'); - - // Named ranges - if (count($this->spreadsheet->getDefinedNames()) > 0) { - // Named ranges - $this->writeNamedRangesAndFormulae(); - } - - // Other defined names - $sheetCount = $this->spreadsheet->getSheetCount(); - for ($i = 0; $i < $sheetCount; ++$i) { - // NamedRange for autoFilter - $this->writeNamedRangeForAutofilter($this->spreadsheet->getSheet($i), $i); - - // NamedRange for Print_Titles - $this->writeNamedRangeForPrintTitles($this->spreadsheet->getSheet($i), $i); - - // NamedRange for Print_Area - $this->writeNamedRangeForPrintArea($this->spreadsheet->getSheet($i), $i); - } - - $this->objWriter->endElement(); - } - - /** - * Write defined names. - */ - private function writeNamedRangesAndFormulae(): void - { - // Loop named ranges - $definedNames = $this->spreadsheet->getDefinedNames(); - foreach ($definedNames as $definedName) { - $this->writeDefinedName($definedName); - } - } - - /** - * Write Defined Name for named range. - */ - private function writeDefinedName(DefinedName $pDefinedName): void - { - // definedName for named range - $this->objWriter->startElement('definedName'); - $this->objWriter->writeAttribute('name', $pDefinedName->getName()); - if ($pDefinedName->getLocalOnly() && $pDefinedName->getScope() !== null) { - $this->objWriter->writeAttribute('localSheetId', $pDefinedName->getScope()->getParent()->getIndex($pDefinedName->getScope())); - } - - $definedRange = $pDefinedName->getValue(); - $splitCount = preg_match_all( - '/' . Calculation::CALCULATION_REGEXP_CELLREF_RELATIVE . '/mui', - $definedRange, - $splitRanges, - PREG_OFFSET_CAPTURE - ); - - $lengths = array_map('strlen', array_column($splitRanges[0], 0)); - $offsets = array_column($splitRanges[0], 1); - - $worksheets = $splitRanges[2]; - $columns = $splitRanges[6]; - $rows = $splitRanges[7]; - - while ($splitCount > 0) { - --$splitCount; - $length = $lengths[$splitCount]; - $offset = $offsets[$splitCount]; - $worksheet = $worksheets[$splitCount][0]; - $column = $columns[$splitCount][0]; - $row = $rows[$splitCount][0]; - - $newRange = ''; - if (empty($worksheet)) { - if (($offset === 0) || ($definedRange[$offset - 1] !== ':')) { - // We should have a worksheet - $worksheet = $pDefinedName->getWorksheet()->getTitle(); - } - } else { - $worksheet = str_replace("''", "'", trim($worksheet, "'")); - } - if (!empty($worksheet)) { - $newRange = "'" . str_replace("'", "''", $worksheet) . "'!"; - } - - if (!empty($column)) { - $newRange .= $column; - } - if (!empty($row)) { - $newRange .= $row; - } - - $definedRange = substr($definedRange, 0, $offset) . $newRange . substr($definedRange, $offset + $length); - } - - if (substr($definedRange, 0, 1) === '=') { - $definedRange = substr($definedRange, 1); - } - - $this->objWriter->writeRawData($definedRange); - - $this->objWriter->endElement(); - } - - /** - * Write Defined Name for autoFilter. - */ - private function writeNamedRangeForAutofilter(Worksheet $pSheet, int $pSheetId = 0): void - { - // NamedRange for autoFilter - $autoFilterRange = $pSheet->getAutoFilter()->getRange(); - if (!empty($autoFilterRange)) { - $this->objWriter->startElement('definedName'); - $this->objWriter->writeAttribute('name', '_xlnm._FilterDatabase'); - $this->objWriter->writeAttribute('localSheetId', $pSheetId); - $this->objWriter->writeAttribute('hidden', '1'); - - // Create absolute coordinate and write as raw text - $range = Coordinate::splitRange($autoFilterRange); - $range = $range[0]; - // Strip any worksheet ref so we can make the cell ref absolute - [$ws, $range[0]] = Worksheet::extractSheetTitle($range[0], true); - - $range[0] = Coordinate::absoluteCoordinate($range[0]); - $range[1] = Coordinate::absoluteCoordinate($range[1]); - $range = implode(':', $range); - - $this->objWriter->writeRawData('\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!' . $range); - - $this->objWriter->endElement(); - } - } - - /** - * Write Defined Name for PrintTitles. - */ - private function writeNamedRangeForPrintTitles(Worksheet $pSheet, int $pSheetId = 0): void - { - // NamedRange for PrintTitles - if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet() || $pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) { - $this->objWriter->startElement('definedName'); - $this->objWriter->writeAttribute('name', '_xlnm.Print_Titles'); - $this->objWriter->writeAttribute('localSheetId', $pSheetId); - - // Setting string - $settingString = ''; - - // Columns to repeat - if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) { - $repeat = $pSheet->getPageSetup()->getColumnsToRepeatAtLeft(); - - $settingString .= '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!$' . $repeat[0] . ':$' . $repeat[1]; - } - - // Rows to repeat - if ($pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) { - if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) { - $settingString .= ','; - } - - $repeat = $pSheet->getPageSetup()->getRowsToRepeatAtTop(); - - $settingString .= '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!$' . $repeat[0] . ':$' . $repeat[1]; - } - - $this->objWriter->writeRawData($settingString); - - $this->objWriter->endElement(); - } - } - - /** - * Write Defined Name for PrintTitles. - */ - private function writeNamedRangeForPrintArea(Worksheet $pSheet, int $pSheetId = 0): void - { - // NamedRange for PrintArea - if ($pSheet->getPageSetup()->isPrintAreaSet()) { - $this->objWriter->startElement('definedName'); - $this->objWriter->writeAttribute('name', '_xlnm.Print_Area'); - $this->objWriter->writeAttribute('localSheetId', $pSheetId); - - // Print area - $printArea = Coordinate::splitRange($pSheet->getPageSetup()->getPrintArea()); - - $chunks = []; - foreach ($printArea as $printAreaRect) { - $printAreaRect[0] = Coordinate::absoluteReference($printAreaRect[0]); - $printAreaRect[1] = Coordinate::absoluteReference($printAreaRect[1]); - $chunks[] = '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!' . implode(':', $printAreaRect); - } - - $this->objWriter->writeRawData(implode(',', $chunks)); - - $this->objWriter->endElement(); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php deleted file mode 100644 index bcbc237..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php +++ /dev/null @@ -1,239 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Properties - $objWriter->startElement('Properties'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'); - $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); - - // Application - $objWriter->writeElement('Application', 'Microsoft Excel'); - - // DocSecurity - $objWriter->writeElement('DocSecurity', '0'); - - // ScaleCrop - $objWriter->writeElement('ScaleCrop', 'false'); - - // HeadingPairs - $objWriter->startElement('HeadingPairs'); - - // Vector - $objWriter->startElement('vt:vector'); - $objWriter->writeAttribute('size', '2'); - $objWriter->writeAttribute('baseType', 'variant'); - - // Variant - $objWriter->startElement('vt:variant'); - $objWriter->writeElement('vt:lpstr', 'Worksheets'); - $objWriter->endElement(); - - // Variant - $objWriter->startElement('vt:variant'); - $objWriter->writeElement('vt:i4', $spreadsheet->getSheetCount()); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // TitlesOfParts - $objWriter->startElement('TitlesOfParts'); - - // Vector - $objWriter->startElement('vt:vector'); - $objWriter->writeAttribute('size', $spreadsheet->getSheetCount()); - $objWriter->writeAttribute('baseType', 'lpstr'); - - $sheetCount = $spreadsheet->getSheetCount(); - for ($i = 0; $i < $sheetCount; ++$i) { - $objWriter->writeElement('vt:lpstr', $spreadsheet->getSheet($i)->getTitle()); - } - - $objWriter->endElement(); - - $objWriter->endElement(); - - // Company - $objWriter->writeElement('Company', $spreadsheet->getProperties()->getCompany()); - - // Company - $objWriter->writeElement('Manager', $spreadsheet->getProperties()->getManager()); - - // LinksUpToDate - $objWriter->writeElement('LinksUpToDate', 'false'); - - // SharedDoc - $objWriter->writeElement('SharedDoc', 'false'); - - // HyperlinksChanged - $objWriter->writeElement('HyperlinksChanged', 'false'); - - // AppVersion - $objWriter->writeElement('AppVersion', '12.0000'); - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write docProps/core.xml to XML format. - * - * @return string XML Output - */ - public function writeDocPropsCore(Spreadsheet $spreadsheet) - { - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // cp:coreProperties - $objWriter->startElement('cp:coreProperties'); - $objWriter->writeAttribute('xmlns:cp', 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties'); - $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); - $objWriter->writeAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/'); - $objWriter->writeAttribute('xmlns:dcmitype', 'http://purl.org/dc/dcmitype/'); - $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); - - // dc:creator - $objWriter->writeElement('dc:creator', $spreadsheet->getProperties()->getCreator()); - - // cp:lastModifiedBy - $objWriter->writeElement('cp:lastModifiedBy', $spreadsheet->getProperties()->getLastModifiedBy()); - - // dcterms:created - $objWriter->startElement('dcterms:created'); - $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); - $objWriter->writeRawData(date(DATE_W3C, $spreadsheet->getProperties()->getCreated())); - $objWriter->endElement(); - - // dcterms:modified - $objWriter->startElement('dcterms:modified'); - $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); - $objWriter->writeRawData(date(DATE_W3C, $spreadsheet->getProperties()->getModified())); - $objWriter->endElement(); - - // dc:title - $objWriter->writeElement('dc:title', $spreadsheet->getProperties()->getTitle()); - - // dc:description - $objWriter->writeElement('dc:description', $spreadsheet->getProperties()->getDescription()); - - // dc:subject - $objWriter->writeElement('dc:subject', $spreadsheet->getProperties()->getSubject()); - - // cp:keywords - $objWriter->writeElement('cp:keywords', $spreadsheet->getProperties()->getKeywords()); - - // cp:category - $objWriter->writeElement('cp:category', $spreadsheet->getProperties()->getCategory()); - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write docProps/custom.xml to XML format. - * - * @return string XML Output - */ - public function writeDocPropsCustom(Spreadsheet $spreadsheet) - { - $customPropertyList = $spreadsheet->getProperties()->getCustomProperties(); - if (empty($customPropertyList)) { - return; - } - - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // cp:coreProperties - $objWriter->startElement('Properties'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/custom-properties'); - $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); - - foreach ($customPropertyList as $key => $customProperty) { - $propertyValue = $spreadsheet->getProperties()->getCustomPropertyValue($customProperty); - $propertyType = $spreadsheet->getProperties()->getCustomPropertyType($customProperty); - - $objWriter->startElement('property'); - $objWriter->writeAttribute('fmtid', '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}'); - $objWriter->writeAttribute('pid', $key + 2); - $objWriter->writeAttribute('name', $customProperty); - - switch ($propertyType) { - case 'i': - $objWriter->writeElement('vt:i4', $propertyValue); - - break; - case 'f': - $objWriter->writeElement('vt:r8', $propertyValue); - - break; - case 'b': - $objWriter->writeElement('vt:bool', ($propertyValue) ? 'true' : 'false'); - - break; - case 'd': - $objWriter->startElement('vt:filetime'); - $objWriter->writeRawData(date(DATE_W3C, $propertyValue)); - $objWriter->endElement(); - - break; - default: - $objWriter->writeElement('vt:lpwstr', $propertyValue); - - break; - } - - $objWriter->endElement(); - } - - $objWriter->endElement(); - - return $objWriter->getData(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php deleted file mode 100644 index 1713b98..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php +++ /dev/null @@ -1,505 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // xdr:wsDr - $objWriter->startElement('xdr:wsDr'); - $objWriter->writeAttribute('xmlns:xdr', 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing'); - $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); - - // Loop through images and write drawings - $i = 1; - $iterator = $pWorksheet->getDrawingCollection()->getIterator(); - while ($iterator->valid()) { - /** @var BaseDrawing $pDrawing */ - $pDrawing = $iterator->current(); - $pRelationId = $i; - $hlinkClickId = $pDrawing->getHyperlink() === null ? null : ++$i; - - $this->writeDrawing($objWriter, $pDrawing, $pRelationId, $hlinkClickId); - - $iterator->next(); - ++$i; - } - - if ($includeCharts) { - $chartCount = $pWorksheet->getChartCount(); - // Loop through charts and write the chart position - if ($chartCount > 0) { - for ($c = 0; $c < $chartCount; ++$c) { - $this->writeChart($objWriter, $pWorksheet->getChartByIndex($c), $c + $i); - } - } - } - - // unparsed AlternateContent - $unparsedLoadedData = $pWorksheet->getParent()->getUnparsedLoadedData(); - if (isset($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()]['drawingAlternateContents'])) { - foreach ($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()]['drawingAlternateContents'] as $drawingAlternateContent) { - $objWriter->writeRaw($drawingAlternateContent); - } - } - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write drawings to XML format. - * - * @param XMLWriter $objWriter XML Writer - * @param int $pRelationId - */ - public function writeChart(XMLWriter $objWriter, \PhpOffice\PhpSpreadsheet\Chart\Chart $pChart, $pRelationId = -1): void - { - $tl = $pChart->getTopLeftPosition(); - $tl['colRow'] = Coordinate::coordinateFromString($tl['cell']); - $br = $pChart->getBottomRightPosition(); - $br['colRow'] = Coordinate::coordinateFromString($br['cell']); - - $objWriter->startElement('xdr:twoCellAnchor'); - - $objWriter->startElement('xdr:from'); - $objWriter->writeElement('xdr:col', Coordinate::columnIndexFromString($tl['colRow'][0]) - 1); - $objWriter->writeElement('xdr:colOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($tl['xOffset'])); - $objWriter->writeElement('xdr:row', $tl['colRow'][1] - 1); - $objWriter->writeElement('xdr:rowOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($tl['yOffset'])); - $objWriter->endElement(); - $objWriter->startElement('xdr:to'); - $objWriter->writeElement('xdr:col', Coordinate::columnIndexFromString($br['colRow'][0]) - 1); - $objWriter->writeElement('xdr:colOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($br['xOffset'])); - $objWriter->writeElement('xdr:row', $br['colRow'][1] - 1); - $objWriter->writeElement('xdr:rowOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($br['yOffset'])); - $objWriter->endElement(); - - $objWriter->startElement('xdr:graphicFrame'); - $objWriter->writeAttribute('macro', ''); - $objWriter->startElement('xdr:nvGraphicFramePr'); - $objWriter->startElement('xdr:cNvPr'); - $objWriter->writeAttribute('name', 'Chart ' . $pRelationId); - $objWriter->writeAttribute('id', 1025 * $pRelationId); - $objWriter->endElement(); - $objWriter->startElement('xdr:cNvGraphicFramePr'); - $objWriter->startElement('a:graphicFrameLocks'); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->startElement('xdr:xfrm'); - $objWriter->startElement('a:off'); - $objWriter->writeAttribute('x', '0'); - $objWriter->writeAttribute('y', '0'); - $objWriter->endElement(); - $objWriter->startElement('a:ext'); - $objWriter->writeAttribute('cx', '0'); - $objWriter->writeAttribute('cy', '0'); - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->startElement('a:graphic'); - $objWriter->startElement('a:graphicData'); - $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); - $objWriter->startElement('c:chart'); - $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); - $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); - $objWriter->writeAttribute('r:id', 'rId' . $pRelationId); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - $objWriter->endElement(); - - $objWriter->startElement('xdr:clientData'); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Write drawings to XML format. - * - * @param XMLWriter $objWriter XML Writer - * @param int $pRelationId - * @param null|int $hlinkClickId - */ - public function writeDrawing(XMLWriter $objWriter, BaseDrawing $pDrawing, $pRelationId = -1, $hlinkClickId = null): void - { - if ($pRelationId >= 0) { - // xdr:oneCellAnchor - $objWriter->startElement('xdr:oneCellAnchor'); - // Image location - $aCoordinates = Coordinate::coordinateFromString($pDrawing->getCoordinates()); - $aCoordinates[0] = Coordinate::columnIndexFromString($aCoordinates[0]); - - // xdr:from - $objWriter->startElement('xdr:from'); - $objWriter->writeElement('xdr:col', $aCoordinates[0] - 1); - $objWriter->writeElement('xdr:colOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getOffsetX())); - $objWriter->writeElement('xdr:row', $aCoordinates[1] - 1); - $objWriter->writeElement('xdr:rowOff', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getOffsetY())); - $objWriter->endElement(); - - // xdr:ext - $objWriter->startElement('xdr:ext'); - $objWriter->writeAttribute('cx', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getWidth())); - $objWriter->writeAttribute('cy', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getHeight())); - $objWriter->endElement(); - - // xdr:pic - $objWriter->startElement('xdr:pic'); - - // xdr:nvPicPr - $objWriter->startElement('xdr:nvPicPr'); - - // xdr:cNvPr - $objWriter->startElement('xdr:cNvPr'); - $objWriter->writeAttribute('id', $pRelationId); - $objWriter->writeAttribute('name', $pDrawing->getName()); - $objWriter->writeAttribute('descr', $pDrawing->getDescription()); - - //a:hlinkClick - $this->writeHyperLinkDrawing($objWriter, $hlinkClickId); - - $objWriter->endElement(); - - // xdr:cNvPicPr - $objWriter->startElement('xdr:cNvPicPr'); - - // a:picLocks - $objWriter->startElement('a:picLocks'); - $objWriter->writeAttribute('noChangeAspect', '1'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // xdr:blipFill - $objWriter->startElement('xdr:blipFill'); - - // a:blip - $objWriter->startElement('a:blip'); - $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); - $objWriter->writeAttribute('r:embed', 'rId' . $pRelationId); - $objWriter->endElement(); - - // a:stretch - $objWriter->startElement('a:stretch'); - $objWriter->writeElement('a:fillRect', null); - $objWriter->endElement(); - - $objWriter->endElement(); - - // xdr:spPr - $objWriter->startElement('xdr:spPr'); - - // a:xfrm - $objWriter->startElement('a:xfrm'); - $objWriter->writeAttribute('rot', \PhpOffice\PhpSpreadsheet\Shared\Drawing::degreesToAngle($pDrawing->getRotation())); - $objWriter->endElement(); - - // a:prstGeom - $objWriter->startElement('a:prstGeom'); - $objWriter->writeAttribute('prst', 'rect'); - - // a:avLst - $objWriter->writeElement('a:avLst', null); - - $objWriter->endElement(); - - if ($pDrawing->getShadow()->getVisible()) { - // a:effectLst - $objWriter->startElement('a:effectLst'); - - // a:outerShdw - $objWriter->startElement('a:outerShdw'); - $objWriter->writeAttribute('blurRad', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getShadow()->getBlurRadius())); - $objWriter->writeAttribute('dist', \PhpOffice\PhpSpreadsheet\Shared\Drawing::pixelsToEMU($pDrawing->getShadow()->getDistance())); - $objWriter->writeAttribute('dir', \PhpOffice\PhpSpreadsheet\Shared\Drawing::degreesToAngle($pDrawing->getShadow()->getDirection())); - $objWriter->writeAttribute('algn', $pDrawing->getShadow()->getAlignment()); - $objWriter->writeAttribute('rotWithShape', '0'); - - // a:srgbClr - $objWriter->startElement('a:srgbClr'); - $objWriter->writeAttribute('val', $pDrawing->getShadow()->getColor()->getRGB()); - - // a:alpha - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', $pDrawing->getShadow()->getAlpha() * 1000); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - } - $objWriter->endElement(); - - $objWriter->endElement(); - - // xdr:clientData - $objWriter->writeElement('xdr:clientData', null); - - $objWriter->endElement(); - } else { - throw new WriterException('Invalid parameters passed.'); - } - } - - /** - * Write VML header/footer images to XML format. - * - * @return string XML Output - */ - public function writeVMLHeaderFooterImages(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet) - { - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Header/footer images - $images = $pWorksheet->getHeaderFooter()->getImages(); - - // xml - $objWriter->startElement('xml'); - $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml'); - $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office'); - $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel'); - - // o:shapelayout - $objWriter->startElement('o:shapelayout'); - $objWriter->writeAttribute('v:ext', 'edit'); - - // o:idmap - $objWriter->startElement('o:idmap'); - $objWriter->writeAttribute('v:ext', 'edit'); - $objWriter->writeAttribute('data', '1'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // v:shapetype - $objWriter->startElement('v:shapetype'); - $objWriter->writeAttribute('id', '_x0000_t75'); - $objWriter->writeAttribute('coordsize', '21600,21600'); - $objWriter->writeAttribute('o:spt', '75'); - $objWriter->writeAttribute('o:preferrelative', 't'); - $objWriter->writeAttribute('path', 'm@4@5l@4@11@9@11@9@5xe'); - $objWriter->writeAttribute('filled', 'f'); - $objWriter->writeAttribute('stroked', 'f'); - - // v:stroke - $objWriter->startElement('v:stroke'); - $objWriter->writeAttribute('joinstyle', 'miter'); - $objWriter->endElement(); - - // v:formulas - $objWriter->startElement('v:formulas'); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'if lineDrawn pixelLineWidth 0'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'sum @0 1 0'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'sum 0 0 @1'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'prod @2 1 2'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelWidth'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelHeight'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'sum @0 0 1'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'prod @6 1 2'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelWidth'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'sum @8 21600 0'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelHeight'); - $objWriter->endElement(); - - // v:f - $objWriter->startElement('v:f'); - $objWriter->writeAttribute('eqn', 'sum @10 21600 0'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // v:path - $objWriter->startElement('v:path'); - $objWriter->writeAttribute('o:extrusionok', 'f'); - $objWriter->writeAttribute('gradientshapeok', 't'); - $objWriter->writeAttribute('o:connecttype', 'rect'); - $objWriter->endElement(); - - // o:lock - $objWriter->startElement('o:lock'); - $objWriter->writeAttribute('v:ext', 'edit'); - $objWriter->writeAttribute('aspectratio', 't'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // Loop through images - foreach ($images as $key => $value) { - $this->writeVMLHeaderFooterImage($objWriter, $key, $value); - } - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write VML comment to XML format. - * - * @param XMLWriter $objWriter XML Writer - * @param string $pReference Reference - * @param HeaderFooterDrawing $pImage Image - */ - private function writeVMLHeaderFooterImage(XMLWriter $objWriter, $pReference, HeaderFooterDrawing $pImage): void - { - // Calculate object id - preg_match('{(\d+)}', md5($pReference), $m); - $id = 1500 + (substr($m[1], 0, 2) * 1); - - // Calculate offset - $width = $pImage->getWidth(); - $height = $pImage->getHeight(); - $marginLeft = $pImage->getOffsetX(); - $marginTop = $pImage->getOffsetY(); - - // v:shape - $objWriter->startElement('v:shape'); - $objWriter->writeAttribute('id', $pReference); - $objWriter->writeAttribute('o:spid', '_x0000_s' . $id); - $objWriter->writeAttribute('type', '#_x0000_t75'); - $objWriter->writeAttribute('style', "position:absolute;margin-left:{$marginLeft}px;margin-top:{$marginTop}px;width:{$width}px;height:{$height}px;z-index:1"); - - // v:imagedata - $objWriter->startElement('v:imagedata'); - $objWriter->writeAttribute('o:relid', 'rId' . $pReference); - $objWriter->writeAttribute('o:title', $pImage->getName()); - $objWriter->endElement(); - - // o:lock - $objWriter->startElement('o:lock'); - $objWriter->writeAttribute('v:ext', 'edit'); - $objWriter->writeAttribute('textRotation', 't'); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Get an array of all drawings. - * - * @return \PhpOffice\PhpSpreadsheet\Worksheet\Drawing[] All drawings in PhpSpreadsheet - */ - public function allDrawings(Spreadsheet $spreadsheet) - { - // Get an array of all drawings - $aDrawings = []; - - // Loop through PhpSpreadsheet - $sheetCount = $spreadsheet->getSheetCount(); - for ($i = 0; $i < $sheetCount; ++$i) { - // Loop through images and add to array - $iterator = $spreadsheet->getSheet($i)->getDrawingCollection()->getIterator(); - while ($iterator->valid()) { - $aDrawings[] = $iterator->current(); - - $iterator->next(); - } - } - - return $aDrawings; - } - - /** - * @param null|int $hlinkClickId - */ - private function writeHyperLinkDrawing(XMLWriter $objWriter, $hlinkClickId): void - { - if ($hlinkClickId === null) { - return; - } - - $objWriter->startElement('a:hlinkClick'); - $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); - $objWriter->writeAttribute('r:id', 'rId' . $hlinkClickId); - $objWriter->endElement(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php deleted file mode 100644 index 7984140..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php +++ /dev/null @@ -1,451 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Relationships - $objWriter->startElement('Relationships'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); - - $customPropertyList = $spreadsheet->getProperties()->getCustomProperties(); - if (!empty($customPropertyList)) { - // Relationship docProps/app.xml - $this->writeRelationship( - $objWriter, - 4, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties', - 'docProps/custom.xml' - ); - } - - // Relationship docProps/app.xml - $this->writeRelationship( - $objWriter, - 3, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', - 'docProps/app.xml' - ); - - // Relationship docProps/core.xml - $this->writeRelationship( - $objWriter, - 2, - 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', - 'docProps/core.xml' - ); - - // Relationship xl/workbook.xml - $this->writeRelationship( - $objWriter, - 1, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', - 'xl/workbook.xml' - ); - // a custom UI in workbook ? - if ($spreadsheet->hasRibbon()) { - $this->writeRelationShip( - $objWriter, - 5, - 'http://schemas.microsoft.com/office/2006/relationships/ui/extensibility', - $spreadsheet->getRibbonXMLData('target') - ); - } - - $objWriter->endElement(); - - return $objWriter->getData(); - } - - /** - * Write workbook relationships to XML format. - * - * @return string XML Output - */ - public function writeWorkbookRelationships(Spreadsheet $spreadsheet) - { - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Relationships - $objWriter->startElement('Relationships'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); - - // Relationship styles.xml - $this->writeRelationship( - $objWriter, - 1, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', - 'styles.xml' - ); - - // Relationship theme/theme1.xml - $this->writeRelationship( - $objWriter, - 2, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', - 'theme/theme1.xml' - ); - - // Relationship sharedStrings.xml - $this->writeRelationship( - $objWriter, - 3, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', - 'sharedStrings.xml' - ); - - // Relationships with sheets - $sheetCount = $spreadsheet->getSheetCount(); - for ($i = 0; $i < $sheetCount; ++$i) { - $this->writeRelationship( - $objWriter, - ($i + 1 + 3), - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', - 'worksheets/sheet' . ($i + 1) . '.xml' - ); - } - // Relationships for vbaProject if needed - // id : just after the last sheet - if ($spreadsheet->hasMacros()) { - $this->writeRelationShip( - $objWriter, - ($i + 1 + 3), - 'http://schemas.microsoft.com/office/2006/relationships/vbaProject', - 'vbaProject.bin' - ); - ++$i; //increment i if needed for an another relation - } - - $objWriter->endElement(); - - return $objWriter->getData(); - } - - /** - * Write worksheet relationships to XML format. - * - * Numbering is as follows: - * rId1 - Drawings - * rId_hyperlink_x - Hyperlinks - * - * @param int $pWorksheetId - * @param bool $includeCharts Flag indicating if we should write charts - * - * @return string XML Output - */ - public function writeWorksheetRelationships(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet, $pWorksheetId = 1, $includeCharts = false) - { - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Relationships - $objWriter->startElement('Relationships'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); - - // Write drawing relationships? - $drawingOriginalIds = []; - $unparsedLoadedData = $pWorksheet->getParent()->getUnparsedLoadedData(); - if (isset($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()]['drawingOriginalIds'])) { - $drawingOriginalIds = $unparsedLoadedData['sheets'][$pWorksheet->getCodeName()]['drawingOriginalIds']; - } - - if ($includeCharts) { - $charts = $pWorksheet->getChartCollection(); - } else { - $charts = []; - } - - if (($pWorksheet->getDrawingCollection()->count() > 0) || (count($charts) > 0) || $drawingOriginalIds) { - $rId = 1; - - // Use original $relPath to get original $rId. - // Take first. In future can be overwritten. - // (! synchronize with \PhpOffice\PhpSpreadsheet\Writer\Xlsx\Worksheet::writeDrawings) - reset($drawingOriginalIds); - $relPath = key($drawingOriginalIds); - if (isset($drawingOriginalIds[$relPath])) { - $rId = (int) (substr($drawingOriginalIds[$relPath], 3)); - } - - // Generate new $relPath to write drawing relationship - $relPath = '../drawings/drawing' . $pWorksheetId . '.xml'; - $this->writeRelationship( - $objWriter, - $rId, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', - $relPath - ); - } - - // Write hyperlink relationships? - $i = 1; - foreach ($pWorksheet->getHyperlinkCollection() as $hyperlink) { - if (!$hyperlink->isInternal()) { - $this->writeRelationship( - $objWriter, - '_hyperlink_' . $i, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', - $hyperlink->getUrl(), - 'External' - ); - - ++$i; - } - } - - // Write comments relationship? - $i = 1; - if (count($pWorksheet->getComments()) > 0) { - $this->writeRelationship( - $objWriter, - '_comments_vml' . $i, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing', - '../drawings/vmlDrawing' . $pWorksheetId . '.vml' - ); - - $this->writeRelationship( - $objWriter, - '_comments' . $i, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments', - '../comments' . $pWorksheetId . '.xml' - ); - } - - // Write header/footer relationship? - $i = 1; - if (count($pWorksheet->getHeaderFooter()->getImages()) > 0) { - $this->writeRelationship( - $objWriter, - '_headerfooter_vml' . $i, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing', - '../drawings/vmlDrawingHF' . $pWorksheetId . '.vml' - ); - } - - $this->writeUnparsedRelationship($pWorksheet, $objWriter, 'ctrlProps', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/ctrlProp'); - $this->writeUnparsedRelationship($pWorksheet, $objWriter, 'vmlDrawings', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing'); - $this->writeUnparsedRelationship($pWorksheet, $objWriter, 'printerSettings', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings'); - - $objWriter->endElement(); - - return $objWriter->getData(); - } - - private function writeUnparsedRelationship(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet, XMLWriter $objWriter, $relationship, $type): void - { - $unparsedLoadedData = $pWorksheet->getParent()->getUnparsedLoadedData(); - if (!isset($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()][$relationship])) { - return; - } - - foreach ($unparsedLoadedData['sheets'][$pWorksheet->getCodeName()][$relationship] as $rId => $value) { - $this->writeRelationship( - $objWriter, - $rId, - $type, - $value['relFilePath'] - ); - } - } - - /** - * Write drawing relationships to XML format. - * - * @param int &$chartRef Chart ID - * @param bool $includeCharts Flag indicating if we should write charts - * - * @return string XML Output - */ - public function writeDrawingRelationships(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet, &$chartRef, $includeCharts = false) - { - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Relationships - $objWriter->startElement('Relationships'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); - - // Loop through images and write relationships - $i = 1; - $iterator = $pWorksheet->getDrawingCollection()->getIterator(); - while ($iterator->valid()) { - if ( - $iterator->current() instanceof \PhpOffice\PhpSpreadsheet\Worksheet\Drawing - || $iterator->current() instanceof MemoryDrawing - ) { - // Write relationship for image drawing - /** @var \PhpOffice\PhpSpreadsheet\Worksheet\Drawing $drawing */ - $drawing = $iterator->current(); - $this->writeRelationship( - $objWriter, - $i, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', - '../media/' . str_replace(' ', '', $drawing->getIndexedFilename()) - ); - - $i = $this->writeDrawingHyperLink($objWriter, $drawing, $i); - } - - $iterator->next(); - ++$i; - } - - if ($includeCharts) { - // Loop through charts and write relationships - $chartCount = $pWorksheet->getChartCount(); - if ($chartCount > 0) { - for ($c = 0; $c < $chartCount; ++$c) { - $this->writeRelationship( - $objWriter, - $i++, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', - '../charts/chart' . ++$chartRef . '.xml' - ); - } - } - } - - $objWriter->endElement(); - - return $objWriter->getData(); - } - - /** - * Write header/footer drawing relationships to XML format. - * - * @return string XML Output - */ - public function writeHeaderFooterDrawingRelationships(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $pWorksheet) - { - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Relationships - $objWriter->startElement('Relationships'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); - - // Loop through images and write relationships - foreach ($pWorksheet->getHeaderFooter()->getImages() as $key => $value) { - // Write relationship for image drawing - $this->writeRelationship( - $objWriter, - $key, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', - '../media/' . $value->getIndexedFilename() - ); - } - - $objWriter->endElement(); - - return $objWriter->getData(); - } - - /** - * Write Override content type. - * - * @param XMLWriter $objWriter XML Writer - * @param int $pId Relationship ID. rId will be prepended! - * @param string $pType Relationship type - * @param string $pTarget Relationship target - * @param string $pTargetMode Relationship target mode - */ - private function writeRelationship(XMLWriter $objWriter, $pId, $pType, $pTarget, $pTargetMode = ''): void - { - if ($pType != '' && $pTarget != '') { - // Write relationship - $objWriter->startElement('Relationship'); - $objWriter->writeAttribute('Id', 'rId' . $pId); - $objWriter->writeAttribute('Type', $pType); - $objWriter->writeAttribute('Target', $pTarget); - - if ($pTargetMode != '') { - $objWriter->writeAttribute('TargetMode', $pTargetMode); - } - - $objWriter->endElement(); - } else { - throw new WriterException('Invalid parameters passed.'); - } - } - - /** - * @param $objWriter - * @param \PhpOffice\PhpSpreadsheet\Worksheet\Drawing $drawing - * @param $i - * - * @return int - */ - private function writeDrawingHyperLink($objWriter, $drawing, $i) - { - if ($drawing->getHyperlink() === null) { - return $i; - } - - ++$i; - $this->writeRelationship( - $objWriter, - $i, - 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', - $drawing->getHyperlink()->getUrl(), - $drawing->getHyperlink()->getTypeHyperlink() - ); - - return $i; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsRibbon.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsRibbon.php deleted file mode 100644 index 8005207..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsRibbon.php +++ /dev/null @@ -1,45 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Relationships - $objWriter->startElement('Relationships'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); - $localRels = $spreadsheet->getRibbonBinObjects('names'); - if (is_array($localRels)) { - foreach ($localRels as $aId => $aTarget) { - $objWriter->startElement('Relationship'); - $objWriter->writeAttribute('Id', $aId); - $objWriter->writeAttribute('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'); - $objWriter->writeAttribute('Target', $aTarget); - $objWriter->endElement(); - } - } - $objWriter->endElement(); - - return $objWriter->getData(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsVBA.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsVBA.php deleted file mode 100644 index 55bcd36..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsVBA.php +++ /dev/null @@ -1,40 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Relationships - $objWriter->startElement('Relationships'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); - $objWriter->startElement('Relationship'); - $objWriter->writeAttribute('Id', 'rId1'); - $objWriter->writeAttribute('Type', 'http://schemas.microsoft.com/office/2006/relationships/vbaProjectSignature'); - $objWriter->writeAttribute('Target', 'vbaProjectSignature.bin'); - $objWriter->endElement(); - $objWriter->endElement(); - - return $objWriter->getData(); - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php deleted file mode 100644 index b0f7d6d..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php +++ /dev/null @@ -1,282 +0,0 @@ -flipStringTable($aStringTable); - - // Loop through cells - foreach ($pSheet->getCoordinates() as $coordinate) { - $cell = $pSheet->getCell($coordinate); - $cellValue = $cell->getValue(); - if ( - !is_object($cellValue) && - ($cellValue !== null) && - $cellValue !== '' && - !isset($aFlippedStringTable[$cellValue]) && - ($cell->getDataType() == DataType::TYPE_STRING || $cell->getDataType() == DataType::TYPE_STRING2 || $cell->getDataType() == DataType::TYPE_NULL) - ) { - $aStringTable[] = $cellValue; - $aFlippedStringTable[$cellValue] = true; - } elseif ( - $cellValue instanceof RichText && - ($cellValue !== null) && - !isset($aFlippedStringTable[$cellValue->getHashCode()]) - ) { - $aStringTable[] = $cellValue; - $aFlippedStringTable[$cellValue->getHashCode()] = true; - } - } - - return $aStringTable; - } - - /** - * Write string table to XML format. - * - * @param string[] $pStringTable - * - * @return string XML Output - */ - public function writeStringTable(array $pStringTable) - { - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // String table - $objWriter->startElement('sst'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); - $objWriter->writeAttribute('uniqueCount', count($pStringTable)); - - // Loop through string table - foreach ($pStringTable as $textElement) { - $objWriter->startElement('si'); - - if (!$textElement instanceof RichText) { - $textToWrite = StringHelper::controlCharacterPHP2OOXML($textElement); - $objWriter->startElement('t'); - if ($textToWrite !== trim($textToWrite)) { - $objWriter->writeAttribute('xml:space', 'preserve'); - } - $objWriter->writeRawData($textToWrite); - $objWriter->endElement(); - } elseif ($textElement instanceof RichText) { - $this->writeRichText($objWriter, $textElement); - } - - $objWriter->endElement(); - } - - $objWriter->endElement(); - - return $objWriter->getData(); - } - - /** - * Write Rich Text. - * - * @param XMLWriter $objWriter XML Writer - * @param RichText $pRichText Rich text - * @param string $prefix Optional Namespace prefix - */ - public function writeRichText(XMLWriter $objWriter, RichText $pRichText, $prefix = null): void - { - if ($prefix !== null) { - $prefix .= ':'; - } - - // Loop through rich text elements - $elements = $pRichText->getRichTextElements(); - foreach ($elements as $element) { - // r - $objWriter->startElement($prefix . 'r'); - - // rPr - if ($element instanceof Run) { - // rPr - $objWriter->startElement($prefix . 'rPr'); - - // rFont - $objWriter->startElement($prefix . 'rFont'); - $objWriter->writeAttribute('val', $element->getFont()->getName()); - $objWriter->endElement(); - - // Bold - $objWriter->startElement($prefix . 'b'); - $objWriter->writeAttribute('val', ($element->getFont()->getBold() ? 'true' : 'false')); - $objWriter->endElement(); - - // Italic - $objWriter->startElement($prefix . 'i'); - $objWriter->writeAttribute('val', ($element->getFont()->getItalic() ? 'true' : 'false')); - $objWriter->endElement(); - - // Superscript / subscript - if ($element->getFont()->getSuperscript() || $element->getFont()->getSubscript()) { - $objWriter->startElement($prefix . 'vertAlign'); - if ($element->getFont()->getSuperscript()) { - $objWriter->writeAttribute('val', 'superscript'); - } elseif ($element->getFont()->getSubscript()) { - $objWriter->writeAttribute('val', 'subscript'); - } - $objWriter->endElement(); - } - - // Strikethrough - $objWriter->startElement($prefix . 'strike'); - $objWriter->writeAttribute('val', ($element->getFont()->getStrikethrough() ? 'true' : 'false')); - $objWriter->endElement(); - - // Color - $objWriter->startElement($prefix . 'color'); - $objWriter->writeAttribute('rgb', $element->getFont()->getColor()->getARGB()); - $objWriter->endElement(); - - // Size - $objWriter->startElement($prefix . 'sz'); - $objWriter->writeAttribute('val', $element->getFont()->getSize()); - $objWriter->endElement(); - - // Underline - $objWriter->startElement($prefix . 'u'); - $objWriter->writeAttribute('val', $element->getFont()->getUnderline()); - $objWriter->endElement(); - - $objWriter->endElement(); - } - - // t - $objWriter->startElement($prefix . 't'); - $objWriter->writeAttribute('xml:space', 'preserve'); - $objWriter->writeRawData(StringHelper::controlCharacterPHP2OOXML($element->getText())); - $objWriter->endElement(); - - $objWriter->endElement(); - } - } - - /** - * Write Rich Text. - * - * @param XMLWriter $objWriter XML Writer - * @param RichText|string $pRichText text string or Rich text - * @param string $prefix Optional Namespace prefix - */ - public function writeRichTextForCharts(XMLWriter $objWriter, $pRichText = null, $prefix = null): void - { - if (!$pRichText instanceof RichText) { - $textRun = $pRichText; - $pRichText = new RichText(); - $pRichText->createTextRun($textRun); - } - - if ($prefix !== null) { - $prefix .= ':'; - } - - // Loop through rich text elements - $elements = $pRichText->getRichTextElements(); - foreach ($elements as $element) { - // r - $objWriter->startElement($prefix . 'r'); - - // rPr - $objWriter->startElement($prefix . 'rPr'); - - // Bold - $objWriter->writeAttribute('b', ($element->getFont()->getBold() ? 1 : 0)); - // Italic - $objWriter->writeAttribute('i', ($element->getFont()->getItalic() ? 1 : 0)); - // Underline - $underlineType = $element->getFont()->getUnderline(); - switch ($underlineType) { - case 'single': - $underlineType = 'sng'; - - break; - case 'double': - $underlineType = 'dbl'; - - break; - } - $objWriter->writeAttribute('u', $underlineType); - // Strikethrough - $objWriter->writeAttribute('strike', ($element->getFont()->getStrikethrough() ? 'sngStrike' : 'noStrike')); - - // rFont - $objWriter->startElement($prefix . 'latin'); - $objWriter->writeAttribute('typeface', $element->getFont()->getName()); - $objWriter->endElement(); - - $objWriter->endElement(); - - // t - $objWriter->startElement($prefix . 't'); - $objWriter->writeRawData(StringHelper::controlCharacterPHP2OOXML($element->getText())); - $objWriter->endElement(); - - $objWriter->endElement(); - } - } - - /** - * Flip string table (for index searching). - * - * @param array $stringTable Stringtable - * - * @return array - */ - public function flipStringTable(array $stringTable) - { - // Return value - $returnValue = []; - - // Loop through stringtable and add flipped items to $returnValue - foreach ($stringTable as $key => $value) { - if (!$value instanceof RichText) { - $returnValue[$value] = $key; - } elseif ($value instanceof RichText) { - $returnValue[$value->getHashCode()] = $key; - } - } - - return $returnValue; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php deleted file mode 100644 index 0c43fbf..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php +++ /dev/null @@ -1,676 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // styleSheet - $objWriter->startElement('styleSheet'); - $objWriter->writeAttribute('xml:space', 'preserve'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); - - // numFmts - $objWriter->startElement('numFmts'); - $objWriter->writeAttribute('count', $this->getParentWriter()->getNumFmtHashTable()->count()); - - // numFmt - for ($i = 0; $i < $this->getParentWriter()->getNumFmtHashTable()->count(); ++$i) { - $this->writeNumFmt($objWriter, $this->getParentWriter()->getNumFmtHashTable()->getByIndex($i), $i); - } - - $objWriter->endElement(); - - // fonts - $objWriter->startElement('fonts'); - $objWriter->writeAttribute('count', $this->getParentWriter()->getFontHashTable()->count()); - - // font - for ($i = 0; $i < $this->getParentWriter()->getFontHashTable()->count(); ++$i) { - $this->writeFont($objWriter, $this->getParentWriter()->getFontHashTable()->getByIndex($i)); - } - - $objWriter->endElement(); - - // fills - $objWriter->startElement('fills'); - $objWriter->writeAttribute('count', $this->getParentWriter()->getFillHashTable()->count()); - - // fill - for ($i = 0; $i < $this->getParentWriter()->getFillHashTable()->count(); ++$i) { - $this->writeFill($objWriter, $this->getParentWriter()->getFillHashTable()->getByIndex($i)); - } - - $objWriter->endElement(); - - // borders - $objWriter->startElement('borders'); - $objWriter->writeAttribute('count', $this->getParentWriter()->getBordersHashTable()->count()); - - // border - for ($i = 0; $i < $this->getParentWriter()->getBordersHashTable()->count(); ++$i) { - $this->writeBorder($objWriter, $this->getParentWriter()->getBordersHashTable()->getByIndex($i)); - } - - $objWriter->endElement(); - - // cellStyleXfs - $objWriter->startElement('cellStyleXfs'); - $objWriter->writeAttribute('count', 1); - - // xf - $objWriter->startElement('xf'); - $objWriter->writeAttribute('numFmtId', 0); - $objWriter->writeAttribute('fontId', 0); - $objWriter->writeAttribute('fillId', 0); - $objWriter->writeAttribute('borderId', 0); - $objWriter->endElement(); - - $objWriter->endElement(); - - // cellXfs - $objWriter->startElement('cellXfs'); - $objWriter->writeAttribute('count', count($spreadsheet->getCellXfCollection())); - - // xf - foreach ($spreadsheet->getCellXfCollection() as $cellXf) { - $this->writeCellStyleXf($objWriter, $cellXf, $spreadsheet); - } - - $objWriter->endElement(); - - // cellStyles - $objWriter->startElement('cellStyles'); - $objWriter->writeAttribute('count', 1); - - // cellStyle - $objWriter->startElement('cellStyle'); - $objWriter->writeAttribute('name', 'Normal'); - $objWriter->writeAttribute('xfId', 0); - $objWriter->writeAttribute('builtinId', 0); - $objWriter->endElement(); - - $objWriter->endElement(); - - // dxfs - $objWriter->startElement('dxfs'); - $objWriter->writeAttribute('count', $this->getParentWriter()->getStylesConditionalHashTable()->count()); - - // dxf - for ($i = 0; $i < $this->getParentWriter()->getStylesConditionalHashTable()->count(); ++$i) { - $this->writeCellStyleDxf($objWriter, $this->getParentWriter()->getStylesConditionalHashTable()->getByIndex($i)->getStyle()); - } - - $objWriter->endElement(); - - // tableStyles - $objWriter->startElement('tableStyles'); - $objWriter->writeAttribute('defaultTableStyle', 'TableStyleMedium9'); - $objWriter->writeAttribute('defaultPivotStyle', 'PivotTableStyle1'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write Fill. - * - * @param XMLWriter $objWriter XML Writer - * @param Fill $pFill Fill style - */ - private function writeFill(XMLWriter $objWriter, Fill $pFill): void - { - // Check if this is a pattern type or gradient type - if ( - $pFill->getFillType() === Fill::FILL_GRADIENT_LINEAR || - $pFill->getFillType() === Fill::FILL_GRADIENT_PATH - ) { - // Gradient fill - $this->writeGradientFill($objWriter, $pFill); - } elseif ($pFill->getFillType() !== null) { - // Pattern fill - $this->writePatternFill($objWriter, $pFill); - } - } - - /** - * Write Gradient Fill. - * - * @param XMLWriter $objWriter XML Writer - * @param Fill $pFill Fill style - */ - private function writeGradientFill(XMLWriter $objWriter, Fill $pFill): void - { - // fill - $objWriter->startElement('fill'); - - // gradientFill - $objWriter->startElement('gradientFill'); - $objWriter->writeAttribute('type', $pFill->getFillType()); - $objWriter->writeAttribute('degree', $pFill->getRotation()); - - // stop - $objWriter->startElement('stop'); - $objWriter->writeAttribute('position', '0'); - - // color - $objWriter->startElement('color'); - $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB()); - $objWriter->endElement(); - - $objWriter->endElement(); - - // stop - $objWriter->startElement('stop'); - $objWriter->writeAttribute('position', '1'); - - // color - $objWriter->startElement('color'); - $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB()); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Write Pattern Fill. - * - * @param XMLWriter $objWriter XML Writer - * @param Fill $pFill Fill style - */ - private function writePatternFill(XMLWriter $objWriter, Fill $pFill): void - { - // fill - $objWriter->startElement('fill'); - - // patternFill - $objWriter->startElement('patternFill'); - $objWriter->writeAttribute('patternType', $pFill->getFillType()); - - if ($pFill->getFillType() !== Fill::FILL_NONE) { - // fgColor - if ($pFill->getStartColor()->getARGB()) { - $objWriter->startElement('fgColor'); - $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB()); - $objWriter->endElement(); - } - } - if ($pFill->getFillType() !== Fill::FILL_NONE) { - // bgColor - if ($pFill->getEndColor()->getARGB()) { - $objWriter->startElement('bgColor'); - $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB()); - $objWriter->endElement(); - } - } - - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Write Font. - * - * @param XMLWriter $objWriter XML Writer - * @param Font $pFont Font style - */ - private function writeFont(XMLWriter $objWriter, Font $pFont): void - { - // font - $objWriter->startElement('font'); - // Weird! The order of these elements actually makes a difference when opening Xlsx - // files in Excel2003 with the compatibility pack. It's not documented behaviour, - // and makes for a real WTF! - - // Bold. We explicitly write this element also when false (like MS Office Excel 2007 does - // for conditional formatting). Otherwise it will apparently not be picked up in conditional - // formatting style dialog - if ($pFont->getBold() !== null) { - $objWriter->startElement('b'); - $objWriter->writeAttribute('val', $pFont->getBold() ? '1' : '0'); - $objWriter->endElement(); - } - - // Italic - if ($pFont->getItalic() !== null) { - $objWriter->startElement('i'); - $objWriter->writeAttribute('val', $pFont->getItalic() ? '1' : '0'); - $objWriter->endElement(); - } - - // Strikethrough - if ($pFont->getStrikethrough() !== null) { - $objWriter->startElement('strike'); - $objWriter->writeAttribute('val', $pFont->getStrikethrough() ? '1' : '0'); - $objWriter->endElement(); - } - - // Underline - if ($pFont->getUnderline() !== null) { - $objWriter->startElement('u'); - $objWriter->writeAttribute('val', $pFont->getUnderline()); - $objWriter->endElement(); - } - - // Superscript / subscript - if ($pFont->getSuperscript() === true || $pFont->getSubscript() === true) { - $objWriter->startElement('vertAlign'); - if ($pFont->getSuperscript() === true) { - $objWriter->writeAttribute('val', 'superscript'); - } elseif ($pFont->getSubscript() === true) { - $objWriter->writeAttribute('val', 'subscript'); - } - $objWriter->endElement(); - } - - // Size - if ($pFont->getSize() !== null) { - $objWriter->startElement('sz'); - $objWriter->writeAttribute('val', StringHelper::formatNumber($pFont->getSize())); - $objWriter->endElement(); - } - - // Foreground color - if ($pFont->getColor()->getARGB() !== null) { - $objWriter->startElement('color'); - $objWriter->writeAttribute('rgb', $pFont->getColor()->getARGB()); - $objWriter->endElement(); - } - - // Name - if ($pFont->getName() !== null) { - $objWriter->startElement('name'); - $objWriter->writeAttribute('val', $pFont->getName()); - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - - /** - * Write Border. - * - * @param XMLWriter $objWriter XML Writer - * @param Borders $pBorders Borders style - */ - private function writeBorder(XMLWriter $objWriter, Borders $pBorders): void - { - // Write border - $objWriter->startElement('border'); - // Diagonal? - switch ($pBorders->getDiagonalDirection()) { - case Borders::DIAGONAL_UP: - $objWriter->writeAttribute('diagonalUp', 'true'); - $objWriter->writeAttribute('diagonalDown', 'false'); - - break; - case Borders::DIAGONAL_DOWN: - $objWriter->writeAttribute('diagonalUp', 'false'); - $objWriter->writeAttribute('diagonalDown', 'true'); - - break; - case Borders::DIAGONAL_BOTH: - $objWriter->writeAttribute('diagonalUp', 'true'); - $objWriter->writeAttribute('diagonalDown', 'true'); - - break; - } - - // BorderPr - $this->writeBorderPr($objWriter, 'left', $pBorders->getLeft()); - $this->writeBorderPr($objWriter, 'right', $pBorders->getRight()); - $this->writeBorderPr($objWriter, 'top', $pBorders->getTop()); - $this->writeBorderPr($objWriter, 'bottom', $pBorders->getBottom()); - $this->writeBorderPr($objWriter, 'diagonal', $pBorders->getDiagonal()); - $objWriter->endElement(); - } - - /** - * Write Cell Style Xf. - * - * @param XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpSpreadsheet\Style\Style $pStyle Style - * @param Spreadsheet $spreadsheet Workbook - */ - private function writeCellStyleXf(XMLWriter $objWriter, \PhpOffice\PhpSpreadsheet\Style\Style $pStyle, Spreadsheet $spreadsheet): void - { - // xf - $objWriter->startElement('xf'); - $objWriter->writeAttribute('xfId', 0); - $objWriter->writeAttribute('fontId', (int) $this->getParentWriter()->getFontHashTable()->getIndexForHashCode($pStyle->getFont()->getHashCode())); - if ($pStyle->getQuotePrefix()) { - $objWriter->writeAttribute('quotePrefix', 1); - } - - if ($pStyle->getNumberFormat()->getBuiltInFormatCode() === false) { - $objWriter->writeAttribute('numFmtId', (int) ($this->getParentWriter()->getNumFmtHashTable()->getIndexForHashCode($pStyle->getNumberFormat()->getHashCode()) + 164)); - } else { - $objWriter->writeAttribute('numFmtId', (int) $pStyle->getNumberFormat()->getBuiltInFormatCode()); - } - - $objWriter->writeAttribute('fillId', (int) $this->getParentWriter()->getFillHashTable()->getIndexForHashCode($pStyle->getFill()->getHashCode())); - $objWriter->writeAttribute('borderId', (int) $this->getParentWriter()->getBordersHashTable()->getIndexForHashCode($pStyle->getBorders()->getHashCode())); - - // Apply styles? - $objWriter->writeAttribute('applyFont', ($spreadsheet->getDefaultStyle()->getFont()->getHashCode() != $pStyle->getFont()->getHashCode()) ? '1' : '0'); - $objWriter->writeAttribute('applyNumberFormat', ($spreadsheet->getDefaultStyle()->getNumberFormat()->getHashCode() != $pStyle->getNumberFormat()->getHashCode()) ? '1' : '0'); - $objWriter->writeAttribute('applyFill', ($spreadsheet->getDefaultStyle()->getFill()->getHashCode() != $pStyle->getFill()->getHashCode()) ? '1' : '0'); - $objWriter->writeAttribute('applyBorder', ($spreadsheet->getDefaultStyle()->getBorders()->getHashCode() != $pStyle->getBorders()->getHashCode()) ? '1' : '0'); - $objWriter->writeAttribute('applyAlignment', ($spreadsheet->getDefaultStyle()->getAlignment()->getHashCode() != $pStyle->getAlignment()->getHashCode()) ? '1' : '0'); - if ($pStyle->getProtection()->getLocked() != Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != Protection::PROTECTION_INHERIT) { - $objWriter->writeAttribute('applyProtection', 'true'); - } - - // alignment - $objWriter->startElement('alignment'); - $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal()); - $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical()); - - $textRotation = 0; - if ($pStyle->getAlignment()->getTextRotation() >= 0) { - $textRotation = $pStyle->getAlignment()->getTextRotation(); - } elseif ($pStyle->getAlignment()->getTextRotation() < 0) { - $textRotation = 90 - $pStyle->getAlignment()->getTextRotation(); - } - $objWriter->writeAttribute('textRotation', $textRotation); - - $objWriter->writeAttribute('wrapText', ($pStyle->getAlignment()->getWrapText() ? 'true' : 'false')); - $objWriter->writeAttribute('shrinkToFit', ($pStyle->getAlignment()->getShrinkToFit() ? 'true' : 'false')); - - if ($pStyle->getAlignment()->getIndent() > 0) { - $objWriter->writeAttribute('indent', $pStyle->getAlignment()->getIndent()); - } - if ($pStyle->getAlignment()->getReadOrder() > 0) { - $objWriter->writeAttribute('readingOrder', $pStyle->getAlignment()->getReadOrder()); - } - $objWriter->endElement(); - - // protection - if ($pStyle->getProtection()->getLocked() != Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != Protection::PROTECTION_INHERIT) { - $objWriter->startElement('protection'); - if ($pStyle->getProtection()->getLocked() != Protection::PROTECTION_INHERIT) { - $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == Protection::PROTECTION_PROTECTED ? 'true' : 'false')); - } - if ($pStyle->getProtection()->getHidden() != Protection::PROTECTION_INHERIT) { - $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == Protection::PROTECTION_PROTECTED ? 'true' : 'false')); - } - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - - /** - * Write Cell Style Dxf. - * - * @param XMLWriter $objWriter XML Writer - * @param \PhpOffice\PhpSpreadsheet\Style\Style $pStyle Style - */ - private function writeCellStyleDxf(XMLWriter $objWriter, \PhpOffice\PhpSpreadsheet\Style\Style $pStyle): void - { - // dxf - $objWriter->startElement('dxf'); - - // font - $this->writeFont($objWriter, $pStyle->getFont()); - - // numFmt - $this->writeNumFmt($objWriter, $pStyle->getNumberFormat()); - - // fill - $this->writeFill($objWriter, $pStyle->getFill()); - - // alignment - $objWriter->startElement('alignment'); - if ($pStyle->getAlignment()->getHorizontal() !== null) { - $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal()); - } - if ($pStyle->getAlignment()->getVertical() !== null) { - $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical()); - } - - if ($pStyle->getAlignment()->getTextRotation() !== null) { - $textRotation = 0; - if ($pStyle->getAlignment()->getTextRotation() >= 0) { - $textRotation = $pStyle->getAlignment()->getTextRotation(); - } elseif ($pStyle->getAlignment()->getTextRotation() < 0) { - $textRotation = 90 - $pStyle->getAlignment()->getTextRotation(); - } - $objWriter->writeAttribute('textRotation', $textRotation); - } - $objWriter->endElement(); - - // border - $this->writeBorder($objWriter, $pStyle->getBorders()); - - // protection - if (($pStyle->getProtection()->getLocked() !== null) || ($pStyle->getProtection()->getHidden() !== null)) { - if ( - $pStyle->getProtection()->getLocked() !== Protection::PROTECTION_INHERIT || - $pStyle->getProtection()->getHidden() !== Protection::PROTECTION_INHERIT - ) { - $objWriter->startElement('protection'); - if ( - ($pStyle->getProtection()->getLocked() !== null) && - ($pStyle->getProtection()->getLocked() !== Protection::PROTECTION_INHERIT) - ) { - $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == Protection::PROTECTION_PROTECTED ? 'true' : 'false')); - } - if ( - ($pStyle->getProtection()->getHidden() !== null) && - ($pStyle->getProtection()->getHidden() !== Protection::PROTECTION_INHERIT) - ) { - $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == Protection::PROTECTION_PROTECTED ? 'true' : 'false')); - } - $objWriter->endElement(); - } - } - - $objWriter->endElement(); - } - - /** - * Write BorderPr. - * - * @param XMLWriter $objWriter XML Writer - * @param string $pName Element name - * @param Border $pBorder Border style - */ - private function writeBorderPr(XMLWriter $objWriter, $pName, Border $pBorder): void - { - // Write BorderPr - if ($pBorder->getBorderStyle() != Border::BORDER_NONE) { - $objWriter->startElement($pName); - $objWriter->writeAttribute('style', $pBorder->getBorderStyle()); - - // color - $objWriter->startElement('color'); - $objWriter->writeAttribute('rgb', $pBorder->getColor()->getARGB()); - $objWriter->endElement(); - - $objWriter->endElement(); - } - } - - /** - * Write NumberFormat. - * - * @param XMLWriter $objWriter XML Writer - * @param NumberFormat $pNumberFormat Number Format - * @param int $pId Number Format identifier - */ - private function writeNumFmt(XMLWriter $objWriter, NumberFormat $pNumberFormat, $pId = 0): void - { - // Translate formatcode - $formatCode = $pNumberFormat->getFormatCode(); - - // numFmt - if ($formatCode !== null) { - $objWriter->startElement('numFmt'); - $objWriter->writeAttribute('numFmtId', ($pId + 164)); - $objWriter->writeAttribute('formatCode', $formatCode); - $objWriter->endElement(); - } - } - - /** - * Get an array of all styles. - * - * @return \PhpOffice\PhpSpreadsheet\Style\Style[] All styles in PhpSpreadsheet - */ - public function allStyles(Spreadsheet $spreadsheet) - { - return $spreadsheet->getCellXfCollection(); - } - - /** - * Get an array of all conditional styles. - * - * @return Conditional[] All conditional styles in PhpSpreadsheet - */ - public function allConditionalStyles(Spreadsheet $spreadsheet) - { - // Get an array of all styles - $aStyles = []; - - $sheetCount = $spreadsheet->getSheetCount(); - for ($i = 0; $i < $sheetCount; ++$i) { - foreach ($spreadsheet->getSheet($i)->getConditionalStylesCollection() as $conditionalStyles) { - foreach ($conditionalStyles as $conditionalStyle) { - $aStyles[] = $conditionalStyle; - } - } - } - - return $aStyles; - } - - /** - * Get an array of all fills. - * - * @return Fill[] All fills in PhpSpreadsheet - */ - public function allFills(Spreadsheet $spreadsheet) - { - // Get an array of unique fills - $aFills = []; - - // Two first fills are predefined - $fill0 = new Fill(); - $fill0->setFillType(Fill::FILL_NONE); - $aFills[] = $fill0; - - $fill1 = new Fill(); - $fill1->setFillType(Fill::FILL_PATTERN_GRAY125); - $aFills[] = $fill1; - // The remaining fills - $aStyles = $this->allStyles($spreadsheet); - /** @var \PhpOffice\PhpSpreadsheet\Style\Style $style */ - foreach ($aStyles as $style) { - if (!isset($aFills[$style->getFill()->getHashCode()])) { - $aFills[$style->getFill()->getHashCode()] = $style->getFill(); - } - } - - return $aFills; - } - - /** - * Get an array of all fonts. - * - * @return Font[] All fonts in PhpSpreadsheet - */ - public function allFonts(Spreadsheet $spreadsheet) - { - // Get an array of unique fonts - $aFonts = []; - $aStyles = $this->allStyles($spreadsheet); - - /** @var \PhpOffice\PhpSpreadsheet\Style\Style $style */ - foreach ($aStyles as $style) { - if (!isset($aFonts[$style->getFont()->getHashCode()])) { - $aFonts[$style->getFont()->getHashCode()] = $style->getFont(); - } - } - - return $aFonts; - } - - /** - * Get an array of all borders. - * - * @return Borders[] All borders in PhpSpreadsheet - */ - public function allBorders(Spreadsheet $spreadsheet) - { - // Get an array of unique borders - $aBorders = []; - $aStyles = $this->allStyles($spreadsheet); - - /** @var \PhpOffice\PhpSpreadsheet\Style\Style $style */ - foreach ($aStyles as $style) { - if (!isset($aBorders[$style->getBorders()->getHashCode()])) { - $aBorders[$style->getBorders()->getHashCode()] = $style->getBorders(); - } - } - - return $aBorders; - } - - /** - * Get an array of all number formats. - * - * @return NumberFormat[] All number formats in PhpSpreadsheet - */ - public function allNumberFormats(Spreadsheet $spreadsheet) - { - // Get an array of unique number formats - $aNumFmts = []; - $aStyles = $this->allStyles($spreadsheet); - - /** @var \PhpOffice\PhpSpreadsheet\Style\Style $style */ - foreach ($aStyles as $style) { - if ($style->getNumberFormat()->getBuiltInFormatCode() === false && !isset($aNumFmts[$style->getNumberFormat()->getHashCode()])) { - $aNumFmts[$style->getNumberFormat()->getHashCode()] = $style->getNumberFormat(); - } - } - - return $aNumFmts; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Theme.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Theme.php deleted file mode 100644 index 3a47be7..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Theme.php +++ /dev/null @@ -1,837 +0,0 @@ - 'ļ¼­ļ¼³ ļ¼°ć‚“ć‚·ćƒƒć‚Æ', - 'Hang' => 'ė§‘ģ€ 고딕', - 'Hans' => '宋体', - 'Hant' => 'ę–°ē“°ę˜Žé«”', - 'Arab' => 'Times New Roman', - 'Hebr' => 'Times New Roman', - 'Thai' => 'Tahoma', - 'Ethi' => 'Nyala', - 'Beng' => 'Vrinda', - 'Gujr' => 'Shruti', - 'Khmr' => 'MoolBoran', - 'Knda' => 'Tunga', - 'Guru' => 'Raavi', - 'Cans' => 'Euphemia', - 'Cher' => 'Plantagenet Cherokee', - 'Yiii' => 'Microsoft Yi Baiti', - 'Tibt' => 'Microsoft Himalaya', - 'Thaa' => 'MV Boli', - 'Deva' => 'Mangal', - 'Telu' => 'Gautami', - 'Taml' => 'Latha', - 'Syrc' => 'Estrangelo Edessa', - 'Orya' => 'Kalinga', - 'Mlym' => 'Kartika', - 'Laoo' => 'DokChampa', - 'Sinh' => 'Iskoola Pota', - 'Mong' => 'Mongolian Baiti', - 'Viet' => 'Times New Roman', - 'Uigh' => 'Microsoft Uighur', - 'Geor' => 'Sylfaen', - ]; - - /** - * Map of Minor fonts to write. - * - * @var array of string - */ - private static $minorFonts = [ - 'Jpan' => 'ļ¼­ļ¼³ ļ¼°ć‚“ć‚·ćƒƒć‚Æ', - 'Hang' => 'ė§‘ģ€ 고딕', - 'Hans' => '宋体', - 'Hant' => 'ę–°ē“°ę˜Žé«”', - 'Arab' => 'Arial', - 'Hebr' => 'Arial', - 'Thai' => 'Tahoma', - 'Ethi' => 'Nyala', - 'Beng' => 'Vrinda', - 'Gujr' => 'Shruti', - 'Khmr' => 'DaunPenh', - 'Knda' => 'Tunga', - 'Guru' => 'Raavi', - 'Cans' => 'Euphemia', - 'Cher' => 'Plantagenet Cherokee', - 'Yiii' => 'Microsoft Yi Baiti', - 'Tibt' => 'Microsoft Himalaya', - 'Thaa' => 'MV Boli', - 'Deva' => 'Mangal', - 'Telu' => 'Gautami', - 'Taml' => 'Latha', - 'Syrc' => 'Estrangelo Edessa', - 'Orya' => 'Kalinga', - 'Mlym' => 'Kartika', - 'Laoo' => 'DokChampa', - 'Sinh' => 'Iskoola Pota', - 'Mong' => 'Mongolian Baiti', - 'Viet' => 'Arial', - 'Uigh' => 'Microsoft Uighur', - 'Geor' => 'Sylfaen', - ]; - - /** - * Map of core colours. - * - * @var array of string - */ - private static $colourScheme = [ - 'dk2' => '1F497D', - 'lt2' => 'EEECE1', - 'accent1' => '4F81BD', - 'accent2' => 'C0504D', - 'accent3' => '9BBB59', - 'accent4' => '8064A2', - 'accent5' => '4BACC6', - 'accent6' => 'F79646', - 'hlink' => '0000FF', - 'folHlink' => '800080', - ]; - - /** - * Write theme to XML format. - * - * @return string XML Output - */ - public function writeTheme(Spreadsheet $spreadsheet) - { - // Create XML writer - $objWriter = null; - if ($this->getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // a:theme - $objWriter->startElement('a:theme'); - $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); - $objWriter->writeAttribute('name', 'Office Theme'); - - // a:themeElements - $objWriter->startElement('a:themeElements'); - - // a:clrScheme - $objWriter->startElement('a:clrScheme'); - $objWriter->writeAttribute('name', 'Office'); - - // a:dk1 - $objWriter->startElement('a:dk1'); - - // a:sysClr - $objWriter->startElement('a:sysClr'); - $objWriter->writeAttribute('val', 'windowText'); - $objWriter->writeAttribute('lastClr', '000000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:lt1 - $objWriter->startElement('a:lt1'); - - // a:sysClr - $objWriter->startElement('a:sysClr'); - $objWriter->writeAttribute('val', 'window'); - $objWriter->writeAttribute('lastClr', 'FFFFFF'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:dk2 - $this->writeColourScheme($objWriter); - - $objWriter->endElement(); - - // a:fontScheme - $objWriter->startElement('a:fontScheme'); - $objWriter->writeAttribute('name', 'Office'); - - // a:majorFont - $objWriter->startElement('a:majorFont'); - $this->writeFonts($objWriter, 'Cambria', self::$majorFonts); - $objWriter->endElement(); - - // a:minorFont - $objWriter->startElement('a:minorFont'); - $this->writeFonts($objWriter, 'Calibri', self::$minorFonts); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:fmtScheme - $objWriter->startElement('a:fmtScheme'); - $objWriter->writeAttribute('name', 'Office'); - - // a:fillStyleLst - $objWriter->startElement('a:fillStyleLst'); - - // a:solidFill - $objWriter->startElement('a:solidFill'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gradFill - $objWriter->startElement('a:gradFill'); - $objWriter->writeAttribute('rotWithShape', '1'); - - // a:gsLst - $objWriter->startElement('a:gsLst'); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '0'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:tint - $objWriter->startElement('a:tint'); - $objWriter->writeAttribute('val', '50000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '300000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '35000'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:tint - $objWriter->startElement('a:tint'); - $objWriter->writeAttribute('val', '37000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '300000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '100000'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:tint - $objWriter->startElement('a:tint'); - $objWriter->writeAttribute('val', '15000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '350000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:lin - $objWriter->startElement('a:lin'); - $objWriter->writeAttribute('ang', '16200000'); - $objWriter->writeAttribute('scaled', '1'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gradFill - $objWriter->startElement('a:gradFill'); - $objWriter->writeAttribute('rotWithShape', '1'); - - // a:gsLst - $objWriter->startElement('a:gsLst'); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '0'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:shade - $objWriter->startElement('a:shade'); - $objWriter->writeAttribute('val', '51000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '130000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '80000'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:shade - $objWriter->startElement('a:shade'); - $objWriter->writeAttribute('val', '93000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '130000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '100000'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:shade - $objWriter->startElement('a:shade'); - $objWriter->writeAttribute('val', '94000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '135000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:lin - $objWriter->startElement('a:lin'); - $objWriter->writeAttribute('ang', '16200000'); - $objWriter->writeAttribute('scaled', '0'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:lnStyleLst - $objWriter->startElement('a:lnStyleLst'); - - // a:ln - $objWriter->startElement('a:ln'); - $objWriter->writeAttribute('w', '9525'); - $objWriter->writeAttribute('cap', 'flat'); - $objWriter->writeAttribute('cmpd', 'sng'); - $objWriter->writeAttribute('algn', 'ctr'); - - // a:solidFill - $objWriter->startElement('a:solidFill'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:shade - $objWriter->startElement('a:shade'); - $objWriter->writeAttribute('val', '95000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '105000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:prstDash - $objWriter->startElement('a:prstDash'); - $objWriter->writeAttribute('val', 'solid'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:ln - $objWriter->startElement('a:ln'); - $objWriter->writeAttribute('w', '25400'); - $objWriter->writeAttribute('cap', 'flat'); - $objWriter->writeAttribute('cmpd', 'sng'); - $objWriter->writeAttribute('algn', 'ctr'); - - // a:solidFill - $objWriter->startElement('a:solidFill'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:prstDash - $objWriter->startElement('a:prstDash'); - $objWriter->writeAttribute('val', 'solid'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:ln - $objWriter->startElement('a:ln'); - $objWriter->writeAttribute('w', '38100'); - $objWriter->writeAttribute('cap', 'flat'); - $objWriter->writeAttribute('cmpd', 'sng'); - $objWriter->writeAttribute('algn', 'ctr'); - - // a:solidFill - $objWriter->startElement('a:solidFill'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:prstDash - $objWriter->startElement('a:prstDash'); - $objWriter->writeAttribute('val', 'solid'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:effectStyleLst - $objWriter->startElement('a:effectStyleLst'); - - // a:effectStyle - $objWriter->startElement('a:effectStyle'); - - // a:effectLst - $objWriter->startElement('a:effectLst'); - - // a:outerShdw - $objWriter->startElement('a:outerShdw'); - $objWriter->writeAttribute('blurRad', '40000'); - $objWriter->writeAttribute('dist', '20000'); - $objWriter->writeAttribute('dir', '5400000'); - $objWriter->writeAttribute('rotWithShape', '0'); - - // a:srgbClr - $objWriter->startElement('a:srgbClr'); - $objWriter->writeAttribute('val', '000000'); - - // a:alpha - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', '38000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:effectStyle - $objWriter->startElement('a:effectStyle'); - - // a:effectLst - $objWriter->startElement('a:effectLst'); - - // a:outerShdw - $objWriter->startElement('a:outerShdw'); - $objWriter->writeAttribute('blurRad', '40000'); - $objWriter->writeAttribute('dist', '23000'); - $objWriter->writeAttribute('dir', '5400000'); - $objWriter->writeAttribute('rotWithShape', '0'); - - // a:srgbClr - $objWriter->startElement('a:srgbClr'); - $objWriter->writeAttribute('val', '000000'); - - // a:alpha - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', '35000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:effectStyle - $objWriter->startElement('a:effectStyle'); - - // a:effectLst - $objWriter->startElement('a:effectLst'); - - // a:outerShdw - $objWriter->startElement('a:outerShdw'); - $objWriter->writeAttribute('blurRad', '40000'); - $objWriter->writeAttribute('dist', '23000'); - $objWriter->writeAttribute('dir', '5400000'); - $objWriter->writeAttribute('rotWithShape', '0'); - - // a:srgbClr - $objWriter->startElement('a:srgbClr'); - $objWriter->writeAttribute('val', '000000'); - - // a:alpha - $objWriter->startElement('a:alpha'); - $objWriter->writeAttribute('val', '35000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:scene3d - $objWriter->startElement('a:scene3d'); - - // a:camera - $objWriter->startElement('a:camera'); - $objWriter->writeAttribute('prst', 'orthographicFront'); - - // a:rot - $objWriter->startElement('a:rot'); - $objWriter->writeAttribute('lat', '0'); - $objWriter->writeAttribute('lon', '0'); - $objWriter->writeAttribute('rev', '0'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:lightRig - $objWriter->startElement('a:lightRig'); - $objWriter->writeAttribute('rig', 'threePt'); - $objWriter->writeAttribute('dir', 't'); - - // a:rot - $objWriter->startElement('a:rot'); - $objWriter->writeAttribute('lat', '0'); - $objWriter->writeAttribute('lon', '0'); - $objWriter->writeAttribute('rev', '1200000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:sp3d - $objWriter->startElement('a:sp3d'); - - // a:bevelT - $objWriter->startElement('a:bevelT'); - $objWriter->writeAttribute('w', '63500'); - $objWriter->writeAttribute('h', '25400'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:bgFillStyleLst - $objWriter->startElement('a:bgFillStyleLst'); - - // a:solidFill - $objWriter->startElement('a:solidFill'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gradFill - $objWriter->startElement('a:gradFill'); - $objWriter->writeAttribute('rotWithShape', '1'); - - // a:gsLst - $objWriter->startElement('a:gsLst'); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '0'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:tint - $objWriter->startElement('a:tint'); - $objWriter->writeAttribute('val', '40000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '350000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '40000'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:tint - $objWriter->startElement('a:tint'); - $objWriter->writeAttribute('val', '45000'); - $objWriter->endElement(); - - // a:shade - $objWriter->startElement('a:shade'); - $objWriter->writeAttribute('val', '99000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '350000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '100000'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:shade - $objWriter->startElement('a:shade'); - $objWriter->writeAttribute('val', '20000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '255000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:path - $objWriter->startElement('a:path'); - $objWriter->writeAttribute('path', 'circle'); - - // a:fillToRect - $objWriter->startElement('a:fillToRect'); - $objWriter->writeAttribute('l', '50000'); - $objWriter->writeAttribute('t', '-80000'); - $objWriter->writeAttribute('r', '50000'); - $objWriter->writeAttribute('b', '180000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gradFill - $objWriter->startElement('a:gradFill'); - $objWriter->writeAttribute('rotWithShape', '1'); - - // a:gsLst - $objWriter->startElement('a:gsLst'); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '0'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:tint - $objWriter->startElement('a:tint'); - $objWriter->writeAttribute('val', '80000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '300000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:gs - $objWriter->startElement('a:gs'); - $objWriter->writeAttribute('pos', '100000'); - - // a:schemeClr - $objWriter->startElement('a:schemeClr'); - $objWriter->writeAttribute('val', 'phClr'); - - // a:shade - $objWriter->startElement('a:shade'); - $objWriter->writeAttribute('val', '30000'); - $objWriter->endElement(); - - // a:satMod - $objWriter->startElement('a:satMod'); - $objWriter->writeAttribute('val', '200000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:path - $objWriter->startElement('a:path'); - $objWriter->writeAttribute('path', 'circle'); - - // a:fillToRect - $objWriter->startElement('a:fillToRect'); - $objWriter->writeAttribute('l', '50000'); - $objWriter->writeAttribute('t', '50000'); - $objWriter->writeAttribute('r', '50000'); - $objWriter->writeAttribute('b', '50000'); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - - // a:objectDefaults - $objWriter->writeElement('a:objectDefaults', null); - - // a:extraClrSchemeLst - $objWriter->writeElement('a:extraClrSchemeLst', null); - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write fonts to XML format. - * - * @param XMLWriter $objWriter - * @param string $latinFont - * @param array of string $fontSet - * - * @return string XML Output - */ - private function writeFonts($objWriter, $latinFont, $fontSet) - { - // a:latin - $objWriter->startElement('a:latin'); - $objWriter->writeAttribute('typeface', $latinFont); - $objWriter->endElement(); - - // a:ea - $objWriter->startElement('a:ea'); - $objWriter->writeAttribute('typeface', ''); - $objWriter->endElement(); - - // a:cs - $objWriter->startElement('a:cs'); - $objWriter->writeAttribute('typeface', ''); - $objWriter->endElement(); - - foreach ($fontSet as $fontScript => $typeface) { - $objWriter->startElement('a:font'); - $objWriter->writeAttribute('script', $fontScript); - $objWriter->writeAttribute('typeface', $typeface); - $objWriter->endElement(); - } - } - - /** - * Write colour scheme to XML format. - * - * @param XMLWriter $objWriter - * - * @return string XML Output - */ - private function writeColourScheme($objWriter) - { - foreach (self::$colourScheme as $colourName => $colourValue) { - $objWriter->startElement('a:' . $colourName); - - $objWriter->startElement('a:srgbClr'); - $objWriter->writeAttribute('val', $colourValue); - $objWriter->endElement(); - - $objWriter->endElement(); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php deleted file mode 100644 index 0a20ea9..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php +++ /dev/null @@ -1,225 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // workbook - $objWriter->startElement('workbook'); - $objWriter->writeAttribute('xml:space', 'preserve'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); - $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); - - // fileVersion - $this->writeFileVersion($objWriter); - - // workbookPr - $this->writeWorkbookPr($objWriter); - - // workbookProtection - $this->writeWorkbookProtection($objWriter, $spreadsheet); - - // bookViews - if ($this->getParentWriter()->getOffice2003Compatibility() === false) { - $this->writeBookViews($objWriter, $spreadsheet); - } - - // sheets - $this->writeSheets($objWriter, $spreadsheet); - - // definedNames - (new DefinedNamesWriter($objWriter, $spreadsheet))->write(); - - // calcPr - $this->writeCalcPr($objWriter, $recalcRequired); - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write file version. - * - * @param XMLWriter $objWriter XML Writer - */ - private function writeFileVersion(XMLWriter $objWriter): void - { - $objWriter->startElement('fileVersion'); - $objWriter->writeAttribute('appName', 'xl'); - $objWriter->writeAttribute('lastEdited', '4'); - $objWriter->writeAttribute('lowestEdited', '4'); - $objWriter->writeAttribute('rupBuild', '4505'); - $objWriter->endElement(); - } - - /** - * Write WorkbookPr. - * - * @param XMLWriter $objWriter XML Writer - */ - private function writeWorkbookPr(XMLWriter $objWriter): void - { - $objWriter->startElement('workbookPr'); - - if (Date::getExcelCalendar() === Date::CALENDAR_MAC_1904) { - $objWriter->writeAttribute('date1904', '1'); - } - - $objWriter->writeAttribute('codeName', 'ThisWorkbook'); - - $objWriter->endElement(); - } - - /** - * Write BookViews. - * - * @param XMLWriter $objWriter XML Writer - */ - private function writeBookViews(XMLWriter $objWriter, Spreadsheet $spreadsheet): void - { - // bookViews - $objWriter->startElement('bookViews'); - - // workbookView - $objWriter->startElement('workbookView'); - - $objWriter->writeAttribute('activeTab', $spreadsheet->getActiveSheetIndex()); - $objWriter->writeAttribute('autoFilterDateGrouping', ($spreadsheet->getAutoFilterDateGrouping() ? 'true' : 'false')); - $objWriter->writeAttribute('firstSheet', $spreadsheet->getFirstSheetIndex()); - $objWriter->writeAttribute('minimized', ($spreadsheet->getMinimized() ? 'true' : 'false')); - $objWriter->writeAttribute('showHorizontalScroll', ($spreadsheet->getShowHorizontalScroll() ? 'true' : 'false')); - $objWriter->writeAttribute('showSheetTabs', ($spreadsheet->getShowSheetTabs() ? 'true' : 'false')); - $objWriter->writeAttribute('showVerticalScroll', ($spreadsheet->getShowVerticalScroll() ? 'true' : 'false')); - $objWriter->writeAttribute('tabRatio', $spreadsheet->getTabRatio()); - $objWriter->writeAttribute('visibility', $spreadsheet->getVisibility()); - - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Write WorkbookProtection. - * - * @param XMLWriter $objWriter XML Writer - */ - private function writeWorkbookProtection(XMLWriter $objWriter, Spreadsheet $spreadsheet): void - { - if ($spreadsheet->getSecurity()->isSecurityEnabled()) { - $objWriter->startElement('workbookProtection'); - $objWriter->writeAttribute('lockRevision', ($spreadsheet->getSecurity()->getLockRevision() ? 'true' : 'false')); - $objWriter->writeAttribute('lockStructure', ($spreadsheet->getSecurity()->getLockStructure() ? 'true' : 'false')); - $objWriter->writeAttribute('lockWindows', ($spreadsheet->getSecurity()->getLockWindows() ? 'true' : 'false')); - - if ($spreadsheet->getSecurity()->getRevisionsPassword() != '') { - $objWriter->writeAttribute('revisionsPassword', $spreadsheet->getSecurity()->getRevisionsPassword()); - } - - if ($spreadsheet->getSecurity()->getWorkbookPassword() != '') { - $objWriter->writeAttribute('workbookPassword', $spreadsheet->getSecurity()->getWorkbookPassword()); - } - - $objWriter->endElement(); - } - } - - /** - * Write calcPr. - * - * @param XMLWriter $objWriter XML Writer - * @param bool $recalcRequired Indicate whether formulas should be recalculated before writing - */ - private function writeCalcPr(XMLWriter $objWriter, $recalcRequired = true): void - { - $objWriter->startElement('calcPr'); - - // Set the calcid to a higher value than Excel itself will use, otherwise Excel will always recalc - // If MS Excel does do a recalc, then users opening a file in MS Excel will be prompted to save on exit - // because the file has changed - $objWriter->writeAttribute('calcId', '999999'); - $objWriter->writeAttribute('calcMode', 'auto'); - // fullCalcOnLoad isn't needed if we've recalculating for the save - $objWriter->writeAttribute('calcCompleted', ($recalcRequired) ? 1 : 0); - $objWriter->writeAttribute('fullCalcOnLoad', ($recalcRequired) ? 0 : 1); - $objWriter->writeAttribute('forceFullCalc', ($recalcRequired) ? 0 : 1); - - $objWriter->endElement(); - } - - /** - * Write sheets. - * - * @param XMLWriter $objWriter XML Writer - */ - private function writeSheets(XMLWriter $objWriter, Spreadsheet $spreadsheet): void - { - // Write sheets - $objWriter->startElement('sheets'); - $sheetCount = $spreadsheet->getSheetCount(); - for ($i = 0; $i < $sheetCount; ++$i) { - // sheet - $this->writeSheet( - $objWriter, - $spreadsheet->getSheet($i)->getTitle(), - ($i + 1), - ($i + 1 + 3), - $spreadsheet->getSheet($i)->getSheetState() - ); - } - - $objWriter->endElement(); - } - - /** - * Write sheet. - * - * @param XMLWriter $objWriter XML Writer - * @param string $pSheetname Sheet name - * @param int $pSheetId Sheet id - * @param int $pRelId Relationship ID - * @param string $sheetState Sheet state (visible, hidden, veryHidden) - */ - private function writeSheet(XMLWriter $objWriter, $pSheetname, $pSheetId = 1, $pRelId = 1, $sheetState = 'visible'): void - { - if ($pSheetname != '') { - // Write sheet - $objWriter->startElement('sheet'); - $objWriter->writeAttribute('name', $pSheetname); - $objWriter->writeAttribute('sheetId', $pSheetId); - if ($sheetState !== 'visible' && $sheetState != '') { - $objWriter->writeAttribute('state', $sheetState); - } - $objWriter->writeAttribute('r:id', 'rId' . $pRelId); - $objWriter->endElement(); - } else { - throw new WriterException('Invalid parameters passed.'); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php deleted file mode 100644 index b6a6fc3..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php +++ /dev/null @@ -1,1282 +0,0 @@ -getParentWriter()->getUseDiskCaching()) { - $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); - } else { - $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); - } - - // XML header - $objWriter->startDocument('1.0', 'UTF-8', 'yes'); - - // Worksheet - $objWriter->startElement('worksheet'); - $objWriter->writeAttribute('xml:space', 'preserve'); - $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); - $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); - - $objWriter->writeAttribute('xmlns:xdr', 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing'); - $objWriter->writeAttribute('xmlns:x14', 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/main'); - $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006'); - $objWriter->writeAttribute('mc:Ignorable', 'x14ac'); - $objWriter->writeAttribute('xmlns:x14ac', 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac'); - - // sheetPr - $this->writeSheetPr($objWriter, $pSheet); - - // Dimension - $this->writeDimension($objWriter, $pSheet); - - // sheetViews - $this->writeSheetViews($objWriter, $pSheet); - - // sheetFormatPr - $this->writeSheetFormatPr($objWriter, $pSheet); - - // cols - $this->writeCols($objWriter, $pSheet); - - // sheetData - $this->writeSheetData($objWriter, $pSheet, $pStringTable); - - // sheetProtection - $this->writeSheetProtection($objWriter, $pSheet); - - // protectedRanges - $this->writeProtectedRanges($objWriter, $pSheet); - - // autoFilter - $this->writeAutoFilter($objWriter, $pSheet); - - // mergeCells - $this->writeMergeCells($objWriter, $pSheet); - - // conditionalFormatting - $this->writeConditionalFormatting($objWriter, $pSheet); - - // dataValidations - $this->writeDataValidations($objWriter, $pSheet); - - // hyperlinks - $this->writeHyperlinks($objWriter, $pSheet); - - // Print options - $this->writePrintOptions($objWriter, $pSheet); - - // Page margins - $this->writePageMargins($objWriter, $pSheet); - - // Page setup - $this->writePageSetup($objWriter, $pSheet); - - // Header / footer - $this->writeHeaderFooter($objWriter, $pSheet); - - // Breaks - $this->writeBreaks($objWriter, $pSheet); - - // Drawings and/or Charts - $this->writeDrawings($objWriter, $pSheet, $includeCharts); - - // LegacyDrawing - $this->writeLegacyDrawing($objWriter, $pSheet); - - // LegacyDrawingHF - $this->writeLegacyDrawingHF($objWriter, $pSheet); - - // AlternateContent - $this->writeAlternateContent($objWriter, $pSheet); - - $objWriter->endElement(); - - // Return - return $objWriter->getData(); - } - - /** - * Write SheetPr. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeSheetPr(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // sheetPr - $objWriter->startElement('sheetPr'); - if ($pSheet->getParent()->hasMacros()) { - //if the workbook have macros, we need to have codeName for the sheet - if (!$pSheet->hasCodeName()) { - $pSheet->setCodeName($pSheet->getTitle()); - } - $objWriter->writeAttribute('codeName', $pSheet->getCodeName()); - } - $autoFilterRange = $pSheet->getAutoFilter()->getRange(); - if (!empty($autoFilterRange)) { - $objWriter->writeAttribute('filterMode', 1); - $pSheet->getAutoFilter()->showHideRows(); - } - - // tabColor - if ($pSheet->isTabColorSet()) { - $objWriter->startElement('tabColor'); - $objWriter->writeAttribute('rgb', $pSheet->getTabColor()->getARGB()); - $objWriter->endElement(); - } - - // outlinePr - $objWriter->startElement('outlinePr'); - $objWriter->writeAttribute('summaryBelow', ($pSheet->getShowSummaryBelow() ? '1' : '0')); - $objWriter->writeAttribute('summaryRight', ($pSheet->getShowSummaryRight() ? '1' : '0')); - $objWriter->endElement(); - - // pageSetUpPr - if ($pSheet->getPageSetup()->getFitToPage()) { - $objWriter->startElement('pageSetUpPr'); - $objWriter->writeAttribute('fitToPage', '1'); - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - - /** - * Write Dimension. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeDimension(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // dimension - $objWriter->startElement('dimension'); - $objWriter->writeAttribute('ref', $pSheet->calculateWorksheetDimension()); - $objWriter->endElement(); - } - - /** - * Write SheetViews. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeSheetViews(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // sheetViews - $objWriter->startElement('sheetViews'); - - // Sheet selected? - $sheetSelected = false; - if ($this->getParentWriter()->getSpreadsheet()->getIndex($pSheet) == $this->getParentWriter()->getSpreadsheet()->getActiveSheetIndex()) { - $sheetSelected = true; - } - - // sheetView - $objWriter->startElement('sheetView'); - $objWriter->writeAttribute('tabSelected', $sheetSelected ? '1' : '0'); - $objWriter->writeAttribute('workbookViewId', '0'); - - // Zoom scales - if ($pSheet->getSheetView()->getZoomScale() != 100) { - $objWriter->writeAttribute('zoomScale', $pSheet->getSheetView()->getZoomScale()); - } - if ($pSheet->getSheetView()->getZoomScaleNormal() != 100) { - $objWriter->writeAttribute('zoomScaleNormal', $pSheet->getSheetView()->getZoomScaleNormal()); - } - - // Show zeros (Excel also writes this attribute only if set to false) - if ($pSheet->getSheetView()->getShowZeros() === false) { - $objWriter->writeAttribute('showZeros', 0); - } - - // View Layout Type - if ($pSheet->getSheetView()->getView() !== SheetView::SHEETVIEW_NORMAL) { - $objWriter->writeAttribute('view', $pSheet->getSheetView()->getView()); - } - - // Gridlines - if ($pSheet->getShowGridlines()) { - $objWriter->writeAttribute('showGridLines', 'true'); - } else { - $objWriter->writeAttribute('showGridLines', 'false'); - } - - // Row and column headers - if ($pSheet->getShowRowColHeaders()) { - $objWriter->writeAttribute('showRowColHeaders', '1'); - } else { - $objWriter->writeAttribute('showRowColHeaders', '0'); - } - - // Right-to-left - if ($pSheet->getRightToLeft()) { - $objWriter->writeAttribute('rightToLeft', 'true'); - } - - $activeCell = $pSheet->getActiveCell(); - $sqref = $pSheet->getSelectedCells(); - - // Pane - $pane = ''; - if ($pSheet->getFreezePane()) { - [$xSplit, $ySplit] = Coordinate::coordinateFromString($pSheet->getFreezePane()); - $xSplit = Coordinate::columnIndexFromString($xSplit); - --$xSplit; - --$ySplit; - - $topLeftCell = $pSheet->getTopLeftCell(); - - // pane - $pane = 'topRight'; - $objWriter->startElement('pane'); - if ($xSplit > 0) { - $objWriter->writeAttribute('xSplit', $xSplit); - } - if ($ySplit > 0) { - $objWriter->writeAttribute('ySplit', $ySplit); - $pane = ($xSplit > 0) ? 'bottomRight' : 'bottomLeft'; - } - $objWriter->writeAttribute('topLeftCell', $topLeftCell); - $objWriter->writeAttribute('activePane', $pane); - $objWriter->writeAttribute('state', 'frozen'); - $objWriter->endElement(); - - if (($xSplit > 0) && ($ySplit > 0)) { - // Write additional selections if more than two panes (ie both an X and a Y split) - $objWriter->startElement('selection'); - $objWriter->writeAttribute('pane', 'topRight'); - $objWriter->endElement(); - $objWriter->startElement('selection'); - $objWriter->writeAttribute('pane', 'bottomLeft'); - $objWriter->endElement(); - } - } - - // Selection - // Only need to write selection element if we have a split pane - // We cheat a little by over-riding the active cell selection, setting it to the split cell - $objWriter->startElement('selection'); - if ($pane != '') { - $objWriter->writeAttribute('pane', $pane); - } - $objWriter->writeAttribute('activeCell', $activeCell); - $objWriter->writeAttribute('sqref', $sqref); - $objWriter->endElement(); - - $objWriter->endElement(); - - $objWriter->endElement(); - } - - /** - * Write SheetFormatPr. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeSheetFormatPr(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // sheetFormatPr - $objWriter->startElement('sheetFormatPr'); - - // Default row height - if ($pSheet->getDefaultRowDimension()->getRowHeight() >= 0) { - $objWriter->writeAttribute('customHeight', 'true'); - $objWriter->writeAttribute('defaultRowHeight', StringHelper::formatNumber($pSheet->getDefaultRowDimension()->getRowHeight())); - } else { - $objWriter->writeAttribute('defaultRowHeight', '14.4'); - } - - // Set Zero Height row - if ( - (string) $pSheet->getDefaultRowDimension()->getZeroHeight() === '1' || - strtolower((string) $pSheet->getDefaultRowDimension()->getZeroHeight()) == 'true' - ) { - $objWriter->writeAttribute('zeroHeight', '1'); - } - - // Default column width - if ($pSheet->getDefaultColumnDimension()->getWidth() >= 0) { - $objWriter->writeAttribute('defaultColWidth', StringHelper::formatNumber($pSheet->getDefaultColumnDimension()->getWidth())); - } - - // Outline level - row - $outlineLevelRow = 0; - foreach ($pSheet->getRowDimensions() as $dimension) { - if ($dimension->getOutlineLevel() > $outlineLevelRow) { - $outlineLevelRow = $dimension->getOutlineLevel(); - } - } - $objWriter->writeAttribute('outlineLevelRow', (int) $outlineLevelRow); - - // Outline level - column - $outlineLevelCol = 0; - foreach ($pSheet->getColumnDimensions() as $dimension) { - if ($dimension->getOutlineLevel() > $outlineLevelCol) { - $outlineLevelCol = $dimension->getOutlineLevel(); - } - } - $objWriter->writeAttribute('outlineLevelCol', (int) $outlineLevelCol); - - $objWriter->endElement(); - } - - /** - * Write Cols. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeCols(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // cols - if (count($pSheet->getColumnDimensions()) > 0) { - $objWriter->startElement('cols'); - - $pSheet->calculateColumnWidths(); - - // Loop through column dimensions - foreach ($pSheet->getColumnDimensions() as $colDimension) { - // col - $objWriter->startElement('col'); - $objWriter->writeAttribute('min', Coordinate::columnIndexFromString($colDimension->getColumnIndex())); - $objWriter->writeAttribute('max', Coordinate::columnIndexFromString($colDimension->getColumnIndex())); - - if ($colDimension->getWidth() < 0) { - // No width set, apply default of 10 - $objWriter->writeAttribute('width', '9.10'); - } else { - // Width set - $objWriter->writeAttribute('width', StringHelper::formatNumber($colDimension->getWidth())); - } - - // Column visibility - if ($colDimension->getVisible() === false) { - $objWriter->writeAttribute('hidden', 'true'); - } - - // Auto size? - if ($colDimension->getAutoSize()) { - $objWriter->writeAttribute('bestFit', 'true'); - } - - // Custom width? - if ($colDimension->getWidth() != $pSheet->getDefaultColumnDimension()->getWidth()) { - $objWriter->writeAttribute('customWidth', 'true'); - } - - // Collapsed - if ($colDimension->getCollapsed() === true) { - $objWriter->writeAttribute('collapsed', 'true'); - } - - // Outline level - if ($colDimension->getOutlineLevel() > 0) { - $objWriter->writeAttribute('outlineLevel', $colDimension->getOutlineLevel()); - } - - // Style - $objWriter->writeAttribute('style', $colDimension->getXfIndex()); - - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - } - - /** - * Write SheetProtection. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeSheetProtection(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // sheetProtection - $objWriter->startElement('sheetProtection'); - - $protection = $pSheet->getProtection(); - - if ($protection->getAlgorithm()) { - $objWriter->writeAttribute('algorithmName', $protection->getAlgorithm()); - $objWriter->writeAttribute('hashValue', $protection->getPassword()); - $objWriter->writeAttribute('saltValue', $protection->getSalt()); - $objWriter->writeAttribute('spinCount', $protection->getSpinCount()); - } elseif ($protection->getPassword() !== '') { - $objWriter->writeAttribute('password', $protection->getPassword()); - } - - $objWriter->writeAttribute('sheet', ($protection->getSheet() ? 'true' : 'false')); - $objWriter->writeAttribute('objects', ($protection->getObjects() ? 'true' : 'false')); - $objWriter->writeAttribute('scenarios', ($protection->getScenarios() ? 'true' : 'false')); - $objWriter->writeAttribute('formatCells', ($protection->getFormatCells() ? 'true' : 'false')); - $objWriter->writeAttribute('formatColumns', ($protection->getFormatColumns() ? 'true' : 'false')); - $objWriter->writeAttribute('formatRows', ($protection->getFormatRows() ? 'true' : 'false')); - $objWriter->writeAttribute('insertColumns', ($protection->getInsertColumns() ? 'true' : 'false')); - $objWriter->writeAttribute('insertRows', ($protection->getInsertRows() ? 'true' : 'false')); - $objWriter->writeAttribute('insertHyperlinks', ($protection->getInsertHyperlinks() ? 'true' : 'false')); - $objWriter->writeAttribute('deleteColumns', ($protection->getDeleteColumns() ? 'true' : 'false')); - $objWriter->writeAttribute('deleteRows', ($protection->getDeleteRows() ? 'true' : 'false')); - $objWriter->writeAttribute('selectLockedCells', ($protection->getSelectLockedCells() ? 'true' : 'false')); - $objWriter->writeAttribute('sort', ($protection->getSort() ? 'true' : 'false')); - $objWriter->writeAttribute('autoFilter', ($protection->getAutoFilter() ? 'true' : 'false')); - $objWriter->writeAttribute('pivotTables', ($protection->getPivotTables() ? 'true' : 'false')); - $objWriter->writeAttribute('selectUnlockedCells', ($protection->getSelectUnlockedCells() ? 'true' : 'false')); - $objWriter->endElement(); - } - - private static function writeAttributeIf(XMLWriter $objWriter, $condition, string $attr, string $val): void - { - if ($condition) { - $objWriter->writeAttribute($attr, $val); - } - } - - private static function writeElementIf(XMLWriter $objWriter, $condition, string $attr, string $val): void - { - if ($condition) { - $objWriter->writeElement($attr, $val); - } - } - - private static function writeOtherCondElements(XMLWriter $objWriter, Conditional $conditional, string $cellCoordinate): void - { - if ( - $conditional->getConditionType() == Conditional::CONDITION_CELLIS - || $conditional->getConditionType() == Conditional::CONDITION_CONTAINSTEXT - || $conditional->getConditionType() == Conditional::CONDITION_EXPRESSION - ) { - foreach ($conditional->getConditions() as $formula) { - // Formula - $objWriter->writeElement('formula', Xlfn::addXlfn($formula)); - } - } elseif ($conditional->getConditionType() == Conditional::CONDITION_CONTAINSBLANKS) { - // formula copied from ms xlsx xml source file - $objWriter->writeElement('formula', 'LEN(TRIM(' . $cellCoordinate . '))=0'); - } elseif ($conditional->getConditionType() == Conditional::CONDITION_NOTCONTAINSBLANKS) { - // formula copied from ms xlsx xml source file - $objWriter->writeElement('formula', 'LEN(TRIM(' . $cellCoordinate . '))>0'); - } - } - - private static function writeTextCondElements(XMLWriter $objWriter, Conditional $conditional, string $cellCoordinate): void - { - $txt = $conditional->getText(); - if ($txt !== null) { - $objWriter->writeAttribute('text', $txt); - if ($conditional->getOperatorType() == Conditional::OPERATOR_CONTAINSTEXT) { - $objWriter->writeElement('formula', 'NOT(ISERROR(SEARCH("' . $txt . '",' . $cellCoordinate . ')))'); - } elseif ($conditional->getOperatorType() == Conditional::OPERATOR_BEGINSWITH) { - $objWriter->writeElement('formula', 'LEFT(' . $cellCoordinate . ',' . strlen($txt) . ')="' . $txt . '"'); - } elseif ($conditional->getOperatorType() == Conditional::OPERATOR_ENDSWITH) { - $objWriter->writeElement('formula', 'RIGHT(' . $cellCoordinate . ',' . strlen($txt) . ')="' . $txt . '"'); - } elseif ($conditional->getOperatorType() == Conditional::OPERATOR_NOTCONTAINS) { - $objWriter->writeElement('formula', 'ISERROR(SEARCH("' . $txt . '",' . $cellCoordinate . '))'); - } - } - } - - /** - * Write ConditionalFormatting. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeConditionalFormatting(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // Conditional id - $id = 1; - - // Loop through styles in the current worksheet - foreach ($pSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) { - foreach ($conditionalStyles as $conditional) { - // WHY was this again? - // if ($this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode($conditional->getHashCode()) == '') { - // continue; - // } - if ($conditional->getConditionType() != Conditional::CONDITION_NONE) { - // conditionalFormatting - $objWriter->startElement('conditionalFormatting'); - $objWriter->writeAttribute('sqref', $cellCoordinate); - - // cfRule - $objWriter->startElement('cfRule'); - $objWriter->writeAttribute('type', $conditional->getConditionType()); - $objWriter->writeAttribute('dxfId', $this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode($conditional->getHashCode())); - $objWriter->writeAttribute('priority', $id++); - - self::writeAttributeif( - $objWriter, - ($conditional->getConditionType() == Conditional::CONDITION_CELLIS || $conditional->getConditionType() == Conditional::CONDITION_CONTAINSTEXT) - && $conditional->getOperatorType() != Conditional::OPERATOR_NONE, - 'operator', - $conditional->getOperatorType() - ); - - self::writeAttributeIf($objWriter, $conditional->getStopIfTrue(), 'stopIfTrue', '1'); - - if ($conditional->getConditionType() == Conditional::CONDITION_CONTAINSTEXT) { - self::writeTextCondElements($objWriter, $conditional, $cellCoordinate); - } else { - self::writeOtherCondElements($objWriter, $conditional, $cellCoordinate); - } - - $objWriter->endElement(); - - $objWriter->endElement(); - } - } - } - } - - /** - * Write DataValidations. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeDataValidations(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // Datavalidation collection - $dataValidationCollection = $pSheet->getDataValidationCollection(); - - // Write data validations? - if (!empty($dataValidationCollection)) { - $dataValidationCollection = Coordinate::mergeRangesInCollection($dataValidationCollection); - $objWriter->startElement('dataValidations'); - $objWriter->writeAttribute('count', count($dataValidationCollection)); - - foreach ($dataValidationCollection as $coordinate => $dv) { - $objWriter->startElement('dataValidation'); - - if ($dv->getType() != '') { - $objWriter->writeAttribute('type', $dv->getType()); - } - - if ($dv->getErrorStyle() != '') { - $objWriter->writeAttribute('errorStyle', $dv->getErrorStyle()); - } - - if ($dv->getOperator() != '') { - $objWriter->writeAttribute('operator', $dv->getOperator()); - } - - $objWriter->writeAttribute('allowBlank', ($dv->getAllowBlank() ? '1' : '0')); - $objWriter->writeAttribute('showDropDown', (!$dv->getShowDropDown() ? '1' : '0')); - $objWriter->writeAttribute('showInputMessage', ($dv->getShowInputMessage() ? '1' : '0')); - $objWriter->writeAttribute('showErrorMessage', ($dv->getShowErrorMessage() ? '1' : '0')); - - if ($dv->getErrorTitle() !== '') { - $objWriter->writeAttribute('errorTitle', $dv->getErrorTitle()); - } - if ($dv->getError() !== '') { - $objWriter->writeAttribute('error', $dv->getError()); - } - if ($dv->getPromptTitle() !== '') { - $objWriter->writeAttribute('promptTitle', $dv->getPromptTitle()); - } - if ($dv->getPrompt() !== '') { - $objWriter->writeAttribute('prompt', $dv->getPrompt()); - } - - $objWriter->writeAttribute('sqref', $coordinate); - - if ($dv->getFormula1() !== '') { - $objWriter->writeElement('formula1', $dv->getFormula1()); - } - if ($dv->getFormula2() !== '') { - $objWriter->writeElement('formula2', $dv->getFormula2()); - } - - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - } - - /** - * Write Hyperlinks. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeHyperlinks(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // Hyperlink collection - $hyperlinkCollection = $pSheet->getHyperlinkCollection(); - - // Relation ID - $relationId = 1; - - // Write hyperlinks? - if (!empty($hyperlinkCollection)) { - $objWriter->startElement('hyperlinks'); - - foreach ($hyperlinkCollection as $coordinate => $hyperlink) { - $objWriter->startElement('hyperlink'); - - $objWriter->writeAttribute('ref', $coordinate); - if (!$hyperlink->isInternal()) { - $objWriter->writeAttribute('r:id', 'rId_hyperlink_' . $relationId); - ++$relationId; - } else { - $objWriter->writeAttribute('location', str_replace('sheet://', '', $hyperlink->getUrl())); - } - - if ($hyperlink->getTooltip() !== '') { - $objWriter->writeAttribute('tooltip', $hyperlink->getTooltip()); - $objWriter->writeAttribute('display', $hyperlink->getTooltip()); - } - - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - } - - /** - * Write ProtectedRanges. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeProtectedRanges(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - if (count($pSheet->getProtectedCells()) > 0) { - // protectedRanges - $objWriter->startElement('protectedRanges'); - - // Loop protectedRanges - foreach ($pSheet->getProtectedCells() as $protectedCell => $passwordHash) { - // protectedRange - $objWriter->startElement('protectedRange'); - $objWriter->writeAttribute('name', 'p' . md5($protectedCell)); - $objWriter->writeAttribute('sqref', $protectedCell); - if (!empty($passwordHash)) { - $objWriter->writeAttribute('password', $passwordHash); - } - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - } - - /** - * Write MergeCells. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeMergeCells(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - if (count($pSheet->getMergeCells()) > 0) { - // mergeCells - $objWriter->startElement('mergeCells'); - - // Loop mergeCells - foreach ($pSheet->getMergeCells() as $mergeCell) { - // mergeCell - $objWriter->startElement('mergeCell'); - $objWriter->writeAttribute('ref', $mergeCell); - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - } - - /** - * Write PrintOptions. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writePrintOptions(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // printOptions - $objWriter->startElement('printOptions'); - - $objWriter->writeAttribute('gridLines', ($pSheet->getPrintGridlines() ? 'true' : 'false')); - $objWriter->writeAttribute('gridLinesSet', 'true'); - - if ($pSheet->getPageSetup()->getHorizontalCentered()) { - $objWriter->writeAttribute('horizontalCentered', 'true'); - } - - if ($pSheet->getPageSetup()->getVerticalCentered()) { - $objWriter->writeAttribute('verticalCentered', 'true'); - } - - $objWriter->endElement(); - } - - /** - * Write PageMargins. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writePageMargins(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // pageMargins - $objWriter->startElement('pageMargins'); - $objWriter->writeAttribute('left', StringHelper::formatNumber($pSheet->getPageMargins()->getLeft())); - $objWriter->writeAttribute('right', StringHelper::formatNumber($pSheet->getPageMargins()->getRight())); - $objWriter->writeAttribute('top', StringHelper::formatNumber($pSheet->getPageMargins()->getTop())); - $objWriter->writeAttribute('bottom', StringHelper::formatNumber($pSheet->getPageMargins()->getBottom())); - $objWriter->writeAttribute('header', StringHelper::formatNumber($pSheet->getPageMargins()->getHeader())); - $objWriter->writeAttribute('footer', StringHelper::formatNumber($pSheet->getPageMargins()->getFooter())); - $objWriter->endElement(); - } - - /** - * Write AutoFilter. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeAutoFilter(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - $autoFilterRange = $pSheet->getAutoFilter()->getRange(); - if (!empty($autoFilterRange)) { - // autoFilter - $objWriter->startElement('autoFilter'); - - // Strip any worksheet reference from the filter coordinates - $range = Coordinate::splitRange($autoFilterRange); - $range = $range[0]; - // Strip any worksheet ref - [$ws, $range[0]] = PhpspreadsheetWorksheet::extractSheetTitle($range[0], true); - $range = implode(':', $range); - - $objWriter->writeAttribute('ref', str_replace('$', '', $range)); - - $columns = $pSheet->getAutoFilter()->getColumns(); - if (count($columns) > 0) { - foreach ($columns as $columnID => $column) { - $rules = $column->getRules(); - if (count($rules) > 0) { - $objWriter->startElement('filterColumn'); - $objWriter->writeAttribute('colId', $pSheet->getAutoFilter()->getColumnOffset($columnID)); - - $objWriter->startElement($column->getFilterType()); - if ($column->getJoin() == Column::AUTOFILTER_COLUMN_JOIN_AND) { - $objWriter->writeAttribute('and', 1); - } - - foreach ($rules as $rule) { - if ( - ($column->getFilterType() === Column::AUTOFILTER_FILTERTYPE_FILTER) && - ($rule->getOperator() === Rule::AUTOFILTER_COLUMN_RULE_EQUAL) && - ($rule->getValue() === '') - ) { - // Filter rule for Blanks - $objWriter->writeAttribute('blank', 1); - } elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) { - // Dynamic Filter Rule - $objWriter->writeAttribute('type', $rule->getGrouping()); - $val = $column->getAttribute('val'); - if ($val !== null) { - $objWriter->writeAttribute('val', $val); - } - $maxVal = $column->getAttribute('maxVal'); - if ($maxVal !== null) { - $objWriter->writeAttribute('maxVal', $maxVal); - } - } elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) { - // Top 10 Filter Rule - $objWriter->writeAttribute('val', $rule->getValue()); - $objWriter->writeAttribute('percent', (($rule->getOperator() === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) ? '1' : '0')); - $objWriter->writeAttribute('top', (($rule->getGrouping() === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) ? '1' : '0')); - } else { - // Filter, DateGroupItem or CustomFilter - $objWriter->startElement($rule->getRuleType()); - - if ($rule->getOperator() !== Rule::AUTOFILTER_COLUMN_RULE_EQUAL) { - $objWriter->writeAttribute('operator', $rule->getOperator()); - } - if ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DATEGROUP) { - // Date Group filters - foreach ($rule->getValue() as $key => $value) { - if ($value > '') { - $objWriter->writeAttribute($key, $value); - } - } - $objWriter->writeAttribute('dateTimeGrouping', $rule->getGrouping()); - } else { - $objWriter->writeAttribute('val', $rule->getValue()); - } - - $objWriter->endElement(); - } - } - - $objWriter->endElement(); - - $objWriter->endElement(); - } - } - } - $objWriter->endElement(); - } - } - - /** - * Write PageSetup. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writePageSetup(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // pageSetup - $objWriter->startElement('pageSetup'); - $objWriter->writeAttribute('paperSize', $pSheet->getPageSetup()->getPaperSize()); - $objWriter->writeAttribute('orientation', $pSheet->getPageSetup()->getOrientation()); - - if ($pSheet->getPageSetup()->getScale() !== null) { - $objWriter->writeAttribute('scale', $pSheet->getPageSetup()->getScale()); - } - if ($pSheet->getPageSetup()->getFitToHeight() !== null) { - $objWriter->writeAttribute('fitToHeight', $pSheet->getPageSetup()->getFitToHeight()); - } else { - $objWriter->writeAttribute('fitToHeight', '0'); - } - if ($pSheet->getPageSetup()->getFitToWidth() !== null) { - $objWriter->writeAttribute('fitToWidth', $pSheet->getPageSetup()->getFitToWidth()); - } else { - $objWriter->writeAttribute('fitToWidth', '0'); - } - if ($pSheet->getPageSetup()->getFirstPageNumber() !== null) { - $objWriter->writeAttribute('firstPageNumber', $pSheet->getPageSetup()->getFirstPageNumber()); - $objWriter->writeAttribute('useFirstPageNumber', '1'); - } - $objWriter->writeAttribute('pageOrder', $pSheet->getPageSetup()->getPageOrder()); - - $getUnparsedLoadedData = $pSheet->getParent()->getUnparsedLoadedData(); - if (isset($getUnparsedLoadedData['sheets'][$pSheet->getCodeName()]['pageSetupRelId'])) { - $objWriter->writeAttribute('r:id', $getUnparsedLoadedData['sheets'][$pSheet->getCodeName()]['pageSetupRelId']); - } - - $objWriter->endElement(); - } - - /** - * Write Header / Footer. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeHeaderFooter(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // headerFooter - $objWriter->startElement('headerFooter'); - $objWriter->writeAttribute('differentOddEven', ($pSheet->getHeaderFooter()->getDifferentOddEven() ? 'true' : 'false')); - $objWriter->writeAttribute('differentFirst', ($pSheet->getHeaderFooter()->getDifferentFirst() ? 'true' : 'false')); - $objWriter->writeAttribute('scaleWithDoc', ($pSheet->getHeaderFooter()->getScaleWithDocument() ? 'true' : 'false')); - $objWriter->writeAttribute('alignWithMargins', ($pSheet->getHeaderFooter()->getAlignWithMargins() ? 'true' : 'false')); - - $objWriter->writeElement('oddHeader', $pSheet->getHeaderFooter()->getOddHeader()); - $objWriter->writeElement('oddFooter', $pSheet->getHeaderFooter()->getOddFooter()); - $objWriter->writeElement('evenHeader', $pSheet->getHeaderFooter()->getEvenHeader()); - $objWriter->writeElement('evenFooter', $pSheet->getHeaderFooter()->getEvenFooter()); - $objWriter->writeElement('firstHeader', $pSheet->getHeaderFooter()->getFirstHeader()); - $objWriter->writeElement('firstFooter', $pSheet->getHeaderFooter()->getFirstFooter()); - $objWriter->endElement(); - } - - /** - * Write Breaks. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeBreaks(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // Get row and column breaks - $aRowBreaks = []; - $aColumnBreaks = []; - foreach ($pSheet->getBreaks() as $cell => $breakType) { - if ($breakType == PhpspreadsheetWorksheet::BREAK_ROW) { - $aRowBreaks[] = $cell; - } elseif ($breakType == PhpspreadsheetWorksheet::BREAK_COLUMN) { - $aColumnBreaks[] = $cell; - } - } - - // rowBreaks - if (!empty($aRowBreaks)) { - $objWriter->startElement('rowBreaks'); - $objWriter->writeAttribute('count', count($aRowBreaks)); - $objWriter->writeAttribute('manualBreakCount', count($aRowBreaks)); - - foreach ($aRowBreaks as $cell) { - $coords = Coordinate::coordinateFromString($cell); - - $objWriter->startElement('brk'); - $objWriter->writeAttribute('id', $coords[1]); - $objWriter->writeAttribute('man', '1'); - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - - // Second, write column breaks - if (!empty($aColumnBreaks)) { - $objWriter->startElement('colBreaks'); - $objWriter->writeAttribute('count', count($aColumnBreaks)); - $objWriter->writeAttribute('manualBreakCount', count($aColumnBreaks)); - - foreach ($aColumnBreaks as $cell) { - $coords = Coordinate::coordinateFromString($cell); - - $objWriter->startElement('brk'); - $objWriter->writeAttribute('id', Coordinate::columnIndexFromString($coords[0]) - 1); - $objWriter->writeAttribute('man', '1'); - $objWriter->endElement(); - } - - $objWriter->endElement(); - } - } - - /** - * Write SheetData. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - * @param string[] $pStringTable String table - */ - private function writeSheetData(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet, array $pStringTable): void - { - // Flipped stringtable, for faster index searching - $aFlippedStringTable = $this->getParentWriter()->getWriterPart('stringtable')->flipStringTable($pStringTable); - - // sheetData - $objWriter->startElement('sheetData'); - - // Get column count - $colCount = Coordinate::columnIndexFromString($pSheet->getHighestColumn()); - - // Highest row number - $highestRow = $pSheet->getHighestRow(); - - // Loop through cells - $cellsByRow = []; - foreach ($pSheet->getCoordinates() as $coordinate) { - $cellAddress = Coordinate::coordinateFromString($coordinate); - $cellsByRow[$cellAddress[1]][] = $coordinate; - } - - $currentRow = 0; - while ($currentRow++ < $highestRow) { - // Get row dimension - $rowDimension = $pSheet->getRowDimension($currentRow); - - // Write current row? - $writeCurrentRow = isset($cellsByRow[$currentRow]) || $rowDimension->getRowHeight() >= 0 || $rowDimension->getVisible() == false || $rowDimension->getCollapsed() == true || $rowDimension->getOutlineLevel() > 0 || $rowDimension->getXfIndex() !== null; - - if ($writeCurrentRow) { - // Start a new row - $objWriter->startElement('row'); - $objWriter->writeAttribute('r', $currentRow); - $objWriter->writeAttribute('spans', '1:' . $colCount); - - // Row dimensions - if ($rowDimension->getRowHeight() >= 0) { - $objWriter->writeAttribute('customHeight', '1'); - $objWriter->writeAttribute('ht', StringHelper::formatNumber($rowDimension->getRowHeight())); - } - - // Row visibility - if (!$rowDimension->getVisible() === true) { - $objWriter->writeAttribute('hidden', 'true'); - } - - // Collapsed - if ($rowDimension->getCollapsed() === true) { - $objWriter->writeAttribute('collapsed', 'true'); - } - - // Outline level - if ($rowDimension->getOutlineLevel() > 0) { - $objWriter->writeAttribute('outlineLevel', $rowDimension->getOutlineLevel()); - } - - // Style - if ($rowDimension->getXfIndex() !== null) { - $objWriter->writeAttribute('s', $rowDimension->getXfIndex()); - $objWriter->writeAttribute('customFormat', '1'); - } - - // Write cells - if (isset($cellsByRow[$currentRow])) { - foreach ($cellsByRow[$currentRow] as $cellAddress) { - // Write cell - $this->writeCell($objWriter, $pSheet, $cellAddress, $aFlippedStringTable); - } - } - - // End row - $objWriter->endElement(); - } - } - - $objWriter->endElement(); - } - - /** - * @param RichText|string $cellValue - */ - private function writeCellInlineStr(XMLWriter $objWriter, string $mappedType, $cellValue): void - { - $objWriter->writeAttribute('t', $mappedType); - if (!$cellValue instanceof RichText) { - $objWriter->writeElement('t', StringHelper::controlCharacterPHP2OOXML(htmlspecialchars($cellValue))); - } elseif ($cellValue instanceof RichText) { - $objWriter->startElement('is'); - $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $cellValue); - $objWriter->endElement(); - } - } - - /** - * @param RichText|string $cellValue - * @param string[] $pFlippedStringTable - */ - private function writeCellString(XMLWriter $objWriter, string $mappedType, $cellValue, array $pFlippedStringTable): void - { - $objWriter->writeAttribute('t', $mappedType); - if (!$cellValue instanceof RichText) { - self::writeElementIf($objWriter, isset($pFlippedStringTable[$cellValue]), 'v', $pFlippedStringTable[$cellValue]); - } else { - $objWriter->writeElement('v', $pFlippedStringTable[$cellValue->getHashCode()]); - } - } - - /** - * @param float|int $cellValue - */ - private function writeCellNumeric(XMLWriter $objWriter, $cellValue): void - { - //force a decimal to be written if the type is float - if (is_float($cellValue)) { - // force point as decimal separator in case current locale uses comma - $cellValue = str_replace(',', '.', (string) $cellValue); - if (strpos($cellValue, '.') === false) { - $cellValue = $cellValue . '.0'; - } - } - $objWriter->writeElement('v', $cellValue); - } - - private function writeCellBoolean(XMLWriter $objWriter, string $mappedType, bool $cellValue): void - { - $objWriter->writeAttribute('t', $mappedType); - $objWriter->writeElement('v', $cellValue ? '1' : '0'); - } - - private function writeCellError(XMLWriter $objWriter, string $mappedType, string $cellValue, string $formulaerr = '#NULL!'): void - { - $objWriter->writeAttribute('t', $mappedType); - $cellIsFormula = substr($cellValue, 0, 1) === '='; - self::writeElementIf($objWriter, $cellIsFormula, 'f', Xlfn::addXlfnStripEquals($cellValue)); - $objWriter->writeElement('v', $cellIsFormula ? $formulaerr : $cellValue); - } - - private function writeCellFormula(XMLWriter $objWriter, string $cellValue, Cell $pCell): void - { - $calculatedValue = $this->getParentWriter()->getPreCalculateFormulas() ? $pCell->getCalculatedValue() : $cellValue; - if (is_string($calculatedValue)) { - if (\PhpOffice\PhpSpreadsheet\Calculation\Functions::isError($calculatedValue)) { - $this->writeCellError($objWriter, 'e', $cellValue, $calculatedValue); - - return; - } - $objWriter->writeAttribute('t', 'str'); - } elseif (is_bool($calculatedValue)) { - $objWriter->writeAttribute('t', 'b'); - } - // array values are not yet supported - //$attributes = $pCell->getFormulaAttributes(); - //if (($attributes['t'] ?? null) === 'array') { - // $objWriter->startElement('f'); - // $objWriter->writeAttribute('t', 'array'); - // $objWriter->writeAttribute('ref', $pCellAddress); - // $objWriter->writeAttribute('aca', '1'); - // $objWriter->writeAttribute('ca', '1'); - // $objWriter->text(substr($cellValue, 1)); - // $objWriter->endElement(); - //} else { - // $objWriter->writeElement('f', Xlfn::addXlfnStripEquals($cellValue)); - //} - $objWriter->writeElement('f', Xlfn::addXlfnStripEquals($cellValue)); - self::writeElementIf( - $objWriter, - $this->getParentWriter()->getOffice2003Compatibility() === false, - 'v', - ($this->getParentWriter()->getPreCalculateFormulas() && !is_array($calculatedValue) && substr($calculatedValue, 0, 1) !== '#') - ? StringHelper::formatNumber($calculatedValue) : '0' - ); - } - - /** - * Write Cell. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - * @param string $pCellAddress Cell Address - * @param string[] $pFlippedStringTable String table (flipped), for faster index searching - */ - private function writeCell(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet, string $pCellAddress, array $pFlippedStringTable): void - { - // Cell - $pCell = $pSheet->getCell($pCellAddress); - $objWriter->startElement('c'); - $objWriter->writeAttribute('r', $pCellAddress); - - // Sheet styles - $xfi = $pCell->getXfIndex(); - self::writeAttributeIf($objWriter, $xfi, 's', $xfi); - - // If cell value is supplied, write cell value - $cellValue = $pCell->getValue(); - if (is_object($cellValue) || $cellValue !== '') { - // Map type - $mappedType = $pCell->getDataType(); - - // Write data depending on its type - switch (strtolower($mappedType)) { - case 'inlinestr': // Inline string - $this->writeCellInlineStr($objWriter, $mappedType, $cellValue); - - break; - case 's': // String - $this->writeCellString($objWriter, $mappedType, $cellValue, $pFlippedStringTable); - - break; - case 'f': // Formula - $this->writeCellFormula($objWriter, $cellValue, $pCell); - - break; - case 'n': // Numeric - $this->writeCellNumeric($objWriter, $cellValue); - - break; - case 'b': // Boolean - $this->writeCellBoolean($objWriter, $mappedType, $cellValue); - - break; - case 'e': // Error - $this->writeCellError($objWriter, $mappedType, $cellValue); - } - } - - $objWriter->endElement(); - } - - /** - * Write Drawings. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - * @param bool $includeCharts Flag indicating if we should include drawing details for charts - */ - private function writeDrawings(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet, $includeCharts = false): void - { - $unparsedLoadedData = $pSheet->getParent()->getUnparsedLoadedData(); - $hasUnparsedDrawing = isset($unparsedLoadedData['sheets'][$pSheet->getCodeName()]['drawingOriginalIds']); - $chartCount = ($includeCharts) ? $pSheet->getChartCollection()->count() : 0; - if ($chartCount == 0 && $pSheet->getDrawingCollection()->count() == 0 && !$hasUnparsedDrawing) { - return; - } - - // If sheet contains drawings, add the relationships - $objWriter->startElement('drawing'); - - $rId = 'rId1'; - if (isset($unparsedLoadedData['sheets'][$pSheet->getCodeName()]['drawingOriginalIds'])) { - $drawingOriginalIds = $unparsedLoadedData['sheets'][$pSheet->getCodeName()]['drawingOriginalIds']; - // take first. In future can be overriten - // (! synchronize with \PhpOffice\PhpSpreadsheet\Writer\Xlsx\Rels::writeWorksheetRelationships) - $rId = reset($drawingOriginalIds); - } - - $objWriter->writeAttribute('r:id', $rId); - $objWriter->endElement(); - } - - /** - * Write LegacyDrawing. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeLegacyDrawing(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // If sheet contains comments, add the relationships - if (count($pSheet->getComments()) > 0) { - $objWriter->startElement('legacyDrawing'); - $objWriter->writeAttribute('r:id', 'rId_comments_vml1'); - $objWriter->endElement(); - } - } - - /** - * Write LegacyDrawingHF. - * - * @param XMLWriter $objWriter XML Writer - * @param PhpspreadsheetWorksheet $pSheet Worksheet - */ - private function writeLegacyDrawingHF(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - // If sheet contains images, add the relationships - if (count($pSheet->getHeaderFooter()->getImages()) > 0) { - $objWriter->startElement('legacyDrawingHF'); - $objWriter->writeAttribute('r:id', 'rId_headerfooter_vml1'); - $objWriter->endElement(); - } - } - - private function writeAlternateContent(XMLWriter $objWriter, PhpspreadsheetWorksheet $pSheet): void - { - if (empty($pSheet->getParent()->getUnparsedLoadedData()['sheets'][$pSheet->getCodeName()]['AlternateContents'])) { - return; - } - - foreach ($pSheet->getParent()->getUnparsedLoadedData()['sheets'][$pSheet->getCodeName()]['AlternateContents'] as $alternateContent) { - $objWriter->writeRaw($alternateContent); - } - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/WriterPart.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/WriterPart.php deleted file mode 100644 index a9137df..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/WriterPart.php +++ /dev/null @@ -1,33 +0,0 @@ -parentWriter; - } - - /** - * Set parent Xlsx object. - */ - public function __construct(Xlsx $pWriter) - { - $this->parentWriter = $pWriter; - } -} diff --git a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php b/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php deleted file mode 100644 index 8f7c07e..0000000 --- a/vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Xlfn.php +++ /dev/null @@ -1,159 +0,0 @@ - - Marcello Duarte - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/phpspec/prophecy/README.md b/vendor/phpspec/prophecy/README.md deleted file mode 100644 index 6033594..0000000 --- a/vendor/phpspec/prophecy/README.md +++ /dev/null @@ -1,404 +0,0 @@ -# Prophecy - -[![Stable release](https://poser.pugx.org/phpspec/prophecy/version.svg)](https://packagist.org/packages/phpspec/prophecy) -[![Build Status](https://travis-ci.org/phpspec/prophecy.svg?branch=master)](https://travis-ci.org/phpspec/prophecy) - -Prophecy is a highly opinionated yet very powerful and flexible PHP object mocking -framework. Though initially it was created to fulfil phpspec2 needs, it is flexible -enough to be used inside any testing framework out there with minimal effort. - -## A simple example - -```php -prophet->prophesize('App\Security\Hasher'); - $user = new App\Entity\User($hasher->reveal()); - - $hasher->generateHash($user, 'qwerty')->willReturn('hashed_pass'); - - $user->setPassword('qwerty'); - - $this->assertEquals('hashed_pass', $user->getPassword()); - } - - protected function setUp() - { - $this->prophet = new \Prophecy\Prophet; - } - - protected function tearDown() - { - $this->prophet->checkPredictions(); - } -} -``` - -## Installation - -### Prerequisites - -Prophecy requires PHP 7.2.0 or greater. - -### Setup through composer - -First, add Prophecy to the list of dependencies inside your `composer.json`: - -```json -{ - "require-dev": { - "phpspec/prophecy": "~1.0" - } -} -``` - -Then simply install it with composer: - -```bash -$> composer install --prefer-dist -``` - -You can read more about Composer on its [official webpage](http://getcomposer.org). - -## How to use it - -First of all, in Prophecy every word has a logical meaning, even the name of the library -itself (Prophecy). When you start feeling that, you'll become very fluid with this -tool. - -For example, Prophecy has been named that way because it concentrates on describing the future -behavior of objects with very limited knowledge about them. But as with any other prophecy, -those object prophecies can't create themselves - there should be a Prophet: - -```php -$prophet = new Prophecy\Prophet; -``` - -The Prophet creates prophecies by *prophesizing* them: - -```php -$prophecy = $prophet->prophesize(); -``` - -The result of the `prophesize()` method call is a new object of class `ObjectProphecy`. Yes, -that's your specific object prophecy, which describes how your object would behave -in the near future. But first, you need to specify which object you're talking about, -right? - -```php -$prophecy->willExtend('stdClass'); -$prophecy->willImplement('SessionHandlerInterface'); -``` - -There are 2 interesting calls - `willExtend` and `willImplement`. The first one tells -object prophecy that our object should extend specific class, the second one says that -it should implement some interface. Obviously, objects in PHP can implement multiple -interfaces, but extend only one parent class. - -### Dummies - -Ok, now we have our object prophecy. What can we do with it? First of all, we can get -our object *dummy* by revealing its prophecy: - -```php -$dummy = $prophecy->reveal(); -``` - -The `$dummy` variable now holds a special dummy object. Dummy objects are objects that extend -and/or implement preset classes/interfaces by overriding all their public methods. The key -point about dummies is that they do not hold any logic - they just do nothing. Any method -of the dummy will always return `null` and the dummy will never throw any exceptions. -Dummy is your friend if you don't care about the actual behavior of this double and just need -a token object to satisfy a method typehint. - -You need to understand one thing - a dummy is not a prophecy. Your object prophecy is still -assigned to `$prophecy` variable and in order to manipulate with your expectations, you -should work with it. `$dummy` is a dummy - a simple php object that tries to fulfil your -prophecy. - -### Stubs - -Ok, now we know how to create basic prophecies and reveal dummies from them. That's -awesome if we don't care about our _doubles_ (objects that reflect originals) -interactions. If we do, we need to use *stubs* or *mocks*. - -A stub is an object double, which doesn't have any expectations about the object behavior, -but when put in specific environment, behaves in specific way. Ok, I know, it's cryptic, -but bear with me for a minute. Simply put, a stub is a dummy, which depending on the called -method signature does different things (has logic). To create stubs in Prophecy: - -```php -$prophecy->read('123')->willReturn('value'); -``` - -Oh wow. We've just made an arbitrary call on the object prophecy? Yes, we did. And this -call returned us a new object instance of class `MethodProphecy`. Yep, that's a specific -method with arguments prophecy. Method prophecies give you the ability to create method -promises or predictions. We'll talk about method predictions later in the _Mocks_ section. - -#### Promises - -Promises are logical blocks, that represent your fictional methods in prophecy terms -and they are handled by the `MethodProphecy::will(PromiseInterface $promise)` method. -As a matter of fact, the call that we made earlier (`willReturn('value')`) is a simple -shortcut to: - -```php -$prophecy->read('123')->will(new Prophecy\Promise\ReturnPromise(array('value'))); -``` - -This promise will cause any call to our double's `read()` method with exactly one -argument - `'123'` to always return `'value'`. But that's only for this -promise, there's plenty others you can use: - -- `ReturnPromise` or `->willReturn(1)` - returns a value from a method call -- `ReturnArgumentPromise` or `->willReturnArgument($index)` - returns the nth method argument from call -- `ThrowPromise` or `->willThrow($exception)` - causes the method to throw specific exception -- `CallbackPromise` or `->will($callback)` - gives you a quick way to define your own custom logic - -Keep in mind, that you can always add even more promises by implementing -`Prophecy\Promise\PromiseInterface`. - -#### Method prophecies idempotency - -Prophecy enforces same method prophecies and, as a consequence, same promises and -predictions for the same method calls with the same arguments. This means: - -```php -$methodProphecy1 = $prophecy->read('123'); -$methodProphecy2 = $prophecy->read('123'); -$methodProphecy3 = $prophecy->read('321'); - -$methodProphecy1 === $methodProphecy2; -$methodProphecy1 !== $methodProphecy3; -``` - -That's interesting, right? Now you might ask me how would you define more complex -behaviors where some method call changes behavior of others. In PHPUnit or Mockery -you do that by predicting how many times your method will be called. In Prophecy, -you'll use promises for that: - -```php -$user->getName()->willReturn(null); - -// For PHP 5.4 -$user->setName('everzet')->will(function () { - $this->getName()->willReturn('everzet'); -}); - -// For PHP 5.3 -$user->setName('everzet')->will(function ($args, $user) { - $user->getName()->willReturn('everzet'); -}); - -// Or -$user->setName('everzet')->will(function ($args) use ($user) { - $user->getName()->willReturn('everzet'); -}); -``` - -And now it doesn't matter how many times or in which order your methods are called. -What matters is their behaviors and how well you faked it. - -Note: If the method is called several times, you can use the following syntax to return different -values for each call: - -```php -$prophecy->read('123')->willReturn(1, 2, 3); -``` - -This feature is actually not recommended for most cases. Relying on the order of -calls for the same arguments tends to make test fragile, as adding one more call -can break everything. - -#### Arguments wildcarding - -The previous example is awesome (at least I hope it is for you), but that's not -optimal enough. We hardcoded `'everzet'` in our expectation. Isn't there a better -way? In fact there is, but it involves understanding what this `'everzet'` -actually is. - -You see, even if method arguments used during method prophecy creation look -like simple method arguments, in reality they are not. They are argument token -wildcards. As a matter of fact, `->setName('everzet')` looks like a simple call just -because Prophecy automatically transforms it under the hood into: - -```php -$user->setName(new Prophecy\Argument\Token\ExactValueToken('everzet')); -``` - -Those argument tokens are simple PHP classes, that implement -`Prophecy\Argument\Token\TokenInterface` and tell Prophecy how to compare real arguments -with your expectations. And yes, those classnames are damn big. That's why there's a -shortcut class `Prophecy\Argument`, which you can use to create tokens like that: - -```php -use Prophecy\Argument; - -$user->setName(Argument::exact('everzet')); -``` - -`ExactValueToken` is not very useful in our case as it forced us to hardcode the username. -That's why Prophecy comes bundled with a bunch of other tokens: - -- `IdenticalValueToken` or `Argument::is($value)` - checks that the argument is identical to a specific value -- `ExactValueToken` or `Argument::exact($value)` - checks that the argument matches a specific value -- `TypeToken` or `Argument::type($typeOrClass)` - checks that the argument matches a specific type or - classname -- `ObjectStateToken` or `Argument::which($method, $value)` - checks that the argument method returns - a specific value -- `CallbackToken` or `Argument::that(callback)` - checks that the argument matches a custom callback -- `AnyValueToken` or `Argument::any()` - matches any argument -- `AnyValuesToken` or `Argument::cetera()` - matches any arguments to the rest of the signature -- `StringContainsToken` or `Argument::containingString($value)` - checks that the argument contains a specific string value -- `InArrayToken` or `Argument::in($array)` - checks if value is in array -- `NotInArrayToken` or `Argument::notIn($array)` - checks if value is not in array - -And you can add even more by implementing `TokenInterface` with your own custom classes. - -So, let's refactor our initial `{set,get}Name()` logic with argument tokens: - -```php -use Prophecy\Argument; - -$user->getName()->willReturn(null); - -// For PHP 5.4 -$user->setName(Argument::type('string'))->will(function ($args) { - $this->getName()->willReturn($args[0]); -}); - -// For PHP 5.3 -$user->setName(Argument::type('string'))->will(function ($args, $user) { - $user->getName()->willReturn($args[0]); -}); - -// Or -$user->setName(Argument::type('string'))->will(function ($args) use ($user) { - $user->getName()->willReturn($args[0]); -}); -``` - -That's it. Now our `{set,get}Name()` prophecy will work with any string argument provided to it. -We've just described how our stub object should behave, even though the original object could have -no behavior whatsoever. - -One last bit about arguments now. You might ask, what happens in case of: - -```php -use Prophecy\Argument; - -$user->getName()->willReturn(null); - -// For PHP 5.4 -$user->setName(Argument::type('string'))->will(function ($args) { - $this->getName()->willReturn($args[0]); -}); - -// For PHP 5.3 -$user->setName(Argument::type('string'))->will(function ($args, $user) { - $user->getName()->willReturn($args[0]); -}); - -// Or -$user->setName(Argument::type('string'))->will(function ($args) use ($user) { - $user->getName()->willReturn($args[0]); -}); - -$user->setName(Argument::any())->will(function () { -}); -``` - -Nothing. Your stub will continue behaving the way it did before. That's because of how -arguments wildcarding works. Every argument token type has a different score level, which -wildcard then uses to calculate the final arguments match score and use the method prophecy -promise that has the highest score. In this case, `Argument::type()` in case of success -scores `5` and `Argument::any()` scores `3`. So the type token wins, as does the first -`setName()` method prophecy and its promise. The simple rule of thumb - more precise token -always wins. - -#### Getting stub objects - -Ok, now we know how to define our prophecy method promises, let's get our stub from -it: - -```php -$stub = $prophecy->reveal(); -``` - -As you might see, the only difference between how we get dummies and stubs is that with -stubs we describe every object conversation instead of just agreeing with `null` returns -(object being *dummy*). As a matter of fact, after you define your first promise -(method call), Prophecy will force you to define all the communications - it throws -the `UnexpectedCallException` for any call you didn't describe with object prophecy before -calling it on a stub. - -### Mocks - -Now we know how to define doubles without behavior (dummies) and doubles with behavior, but -no expectations (stubs). What's left is doubles for which we have some expectations. These -are called mocks and in Prophecy they look almost exactly the same as stubs, except that -they define *predictions* instead of *promises* on method prophecies: - -```php -$entityManager->flush()->shouldBeCalled(); -``` - -#### Predictions - -The `shouldBeCalled()` method here assigns `CallPrediction` to our method prophecy. -Predictions are a delayed behavior check for your prophecies. You see, during the entire lifetime -of your doubles, Prophecy records every single call you're making against it inside your -code. After that, Prophecy can use this collected information to check if it matches defined -predictions. You can assign predictions to method prophecies using the -`MethodProphecy::should(PredictionInterface $prediction)` method. As a matter of fact, -the `shouldBeCalled()` method we used earlier is just a shortcut to: - -```php -$entityManager->flush()->should(new Prophecy\Prediction\CallPrediction()); -``` - -It checks if your method of interest (that matches both the method name and the arguments wildcard) -was called 1 or more times. If the prediction failed then it throws an exception. When does this -check happen? Whenever you call `checkPredictions()` on the main Prophet object: - -```php -$prophet->checkPredictions(); -``` - -In PHPUnit, you would want to put this call into the `tearDown()` method. If no predictions -are defined, it would do nothing. So it won't harm to call it after every test. - -There are plenty more predictions you can play with: - -- `CallPrediction` or `shouldBeCalled()` - checks that the method has been called 1 or more times -- `NoCallsPrediction` or `shouldNotBeCalled()` - checks that the method has not been called -- `CallTimesPrediction` or `shouldBeCalledTimes($count)` - checks that the method has been called - `$count` times -- `CallbackPrediction` or `should($callback)` - checks the method against your own custom callback - -Of course, you can always create your own custom prediction any time by implementing -`PredictionInterface`. - -### Spies - -The last bit of awesomeness in Prophecy is out-of-the-box spies support. As I said in the previous -section, Prophecy records every call made during the double's entire lifetime. This means -you don't need to record predictions in order to check them. You can also do it -manually by using the `MethodProphecy::shouldHave(PredictionInterface $prediction)` method: - -```php -$em = $prophet->prophesize('Doctrine\ORM\EntityManager'); - -$controller->createUser($em->reveal()); - -$em->flush()->shouldHaveBeenCalled(); -``` - -Such manipulation with doubles is called spying. And with Prophecy it just works. diff --git a/vendor/phpspec/prophecy/composer.json b/vendor/phpspec/prophecy/composer.json deleted file mode 100644 index 3bde881..0000000 --- a/vendor/phpspec/prophecy/composer.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "phpspec/prophecy", - "description": "Highly opinionated mocking framework for PHP 5.3+", - "keywords": ["Mock", "Stub", "Dummy", "Double", "Fake", "Spy"], - "homepage": "https://github.com/phpspec/prophecy", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - - "require": { - "php": "^7.2 || ~8.0, <8.1", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "doctrine/instantiator": "^1.2", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - - "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0 <9.3" - }, - - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - - "autoload-dev": { - "psr-4": { - "Fixtures\\Prophecy\\": "fixtures" - } - }, - - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument.php b/vendor/phpspec/prophecy/src/Prophecy/Argument.php deleted file mode 100644 index 72c9fab..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument.php +++ /dev/null @@ -1,239 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy; - -use Prophecy\Argument\Token; - -/** - * Argument tokens shortcuts. - * - * @author Konstantin Kudryashov - */ -class Argument -{ - /** - * Checks that argument is exact value or object. - * - * @param mixed $value - * - * @return Token\ExactValueToken - */ - public static function exact($value) - { - return new Token\ExactValueToken($value); - } - - /** - * Checks that argument is of specific type or instance of specific class. - * - * @param string $type Type name (`integer`, `string`) or full class name - * - * @return Token\TypeToken - */ - public static function type($type) - { - return new Token\TypeToken($type); - } - - /** - * Checks that argument object has specific state. - * - * @param string $methodName - * @param mixed $value - * - * @return Token\ObjectStateToken - */ - public static function which($methodName, $value) - { - return new Token\ObjectStateToken($methodName, $value); - } - - /** - * Checks that argument matches provided callback. - * - * @param callable $callback - * - * @return Token\CallbackToken - */ - public static function that($callback) - { - return new Token\CallbackToken($callback); - } - - /** - * Matches any single value. - * - * @return Token\AnyValueToken - */ - public static function any() - { - return new Token\AnyValueToken; - } - - /** - * Matches all values to the rest of the signature. - * - * @return Token\AnyValuesToken - */ - public static function cetera() - { - return new Token\AnyValuesToken; - } - - /** - * Checks that argument matches all tokens - * - * @param mixed ... a list of tokens - * - * @return Token\LogicalAndToken - */ - public static function allOf() - { - return new Token\LogicalAndToken(func_get_args()); - } - - /** - * Checks that argument array or countable object has exact number of elements. - * - * @param integer $value array elements count - * - * @return Token\ArrayCountToken - */ - public static function size($value) - { - return new Token\ArrayCountToken($value); - } - - /** - * Checks that argument array contains (key, value) pair - * - * @param mixed $key exact value or token - * @param mixed $value exact value or token - * - * @return Token\ArrayEntryToken - */ - public static function withEntry($key, $value) - { - return new Token\ArrayEntryToken($key, $value); - } - - /** - * Checks that arguments array entries all match value - * - * @param mixed $value - * - * @return Token\ArrayEveryEntryToken - */ - public static function withEveryEntry($value) - { - return new Token\ArrayEveryEntryToken($value); - } - - /** - * Checks that argument array contains value - * - * @param mixed $value - * - * @return Token\ArrayEntryToken - */ - public static function containing($value) - { - return new Token\ArrayEntryToken(self::any(), $value); - } - - /** - * Checks that argument array has key - * - * @param mixed $key exact value or token - * - * @return Token\ArrayEntryToken - */ - public static function withKey($key) - { - return new Token\ArrayEntryToken($key, self::any()); - } - - /** - * Checks that argument does not match the value|token. - * - * @param mixed $value either exact value or argument token - * - * @return Token\LogicalNotToken - */ - public static function not($value) - { - return new Token\LogicalNotToken($value); - } - - /** - * @param string $value - * - * @return Token\StringContainsToken - */ - public static function containingString($value) - { - return new Token\StringContainsToken($value); - } - - /** - * Checks that argument is identical value. - * - * @param mixed $value - * - * @return Token\IdenticalValueToken - */ - public static function is($value) - { - return new Token\IdenticalValueToken($value); - } - - /** - * Check that argument is same value when rounding to the - * given precision. - * - * @param float $value - * @param float $precision - * - * @return Token\ApproximateValueToken - */ - public static function approximate($value, $precision = 0) - { - return new Token\ApproximateValueToken($value, $precision); - } - - /** - * Checks that argument is in array. - * - * @param array $value - * - * @return Token\InArrayToken - */ - - public function in($value) - { - return new Token\InArrayToken($value); - } - - /** - * Checks that argument is in array. - * - * @param array $value - * - * @return Token\InArrayToken - */ - - public function notIn($value) - { - return new Token\NotInArrayToken($value); - } - -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php deleted file mode 100644 index a088f21..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php +++ /dev/null @@ -1,101 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument; - -/** - * Arguments wildcarding. - * - * @author Konstantin Kudryashov - */ -class ArgumentsWildcard -{ - /** - * @var Token\TokenInterface[] - */ - private $tokens = array(); - private $string; - - /** - * Initializes wildcard. - * - * @param array $arguments Array of argument tokens or values - */ - public function __construct(array $arguments) - { - foreach ($arguments as $argument) { - if (!$argument instanceof Token\TokenInterface) { - $argument = new Token\ExactValueToken($argument); - } - - $this->tokens[] = $argument; - } - } - - /** - * Calculates wildcard match score for provided arguments. - * - * @param array $arguments - * - * @return false|int False OR integer score (higher - better) - */ - public function scoreArguments(array $arguments) - { - if (0 == count($arguments) && 0 == count($this->tokens)) { - return 1; - } - - $arguments = array_values($arguments); - $totalScore = 0; - foreach ($this->tokens as $i => $token) { - $argument = isset($arguments[$i]) ? $arguments[$i] : null; - if (1 >= $score = $token->scoreArgument($argument)) { - return false; - } - - $totalScore += $score; - - if (true === $token->isLast()) { - return $totalScore; - } - } - - if (count($arguments) > count($this->tokens)) { - return false; - } - - return $totalScore; - } - - /** - * Returns string representation for wildcard. - * - * @return string - */ - public function __toString() - { - if (null === $this->string) { - $this->string = implode(', ', array_map(function ($token) { - return (string) $token; - }, $this->tokens)); - } - - return $this->string; - } - - /** - * @return array - */ - public function getTokens() - { - return $this->tokens; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php deleted file mode 100644 index 5098811..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php +++ /dev/null @@ -1,52 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Any single value token. - * - * @author Konstantin Kudryashov - */ -class AnyValueToken implements TokenInterface -{ - /** - * Always scores 3 for any argument. - * - * @param $argument - * - * @return int - */ - public function scoreArgument($argument) - { - return 3; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return '*'; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php deleted file mode 100644 index f76b17b..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php +++ /dev/null @@ -1,52 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Any values token. - * - * @author Konstantin Kudryashov - */ -class AnyValuesToken implements TokenInterface -{ - /** - * Always scores 2 for any argument. - * - * @param $argument - * - * @return int - */ - public function scoreArgument($argument) - { - return 2; - } - - /** - * Returns true to stop wildcard from processing other tokens. - * - * @return bool - */ - public function isLast() - { - return true; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return '* [, ...]'; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php deleted file mode 100644 index 901744a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php +++ /dev/null @@ -1,55 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Approximate value token - * - * @author Daniel Leech - */ -class ApproximateValueToken implements TokenInterface -{ - private $value; - private $precision; - - public function __construct($value, $precision = 0) - { - $this->value = $value; - $this->precision = $precision; - } - - /** - * {@inheritdoc} - */ - public function scoreArgument($argument) - { - return round((float)$argument, $this->precision) === round($this->value, $this->precision) ? 10 : false; - } - - /** - * {@inheritdoc} - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('≅%s', round($this->value, $this->precision)); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php deleted file mode 100644 index 96b4bef..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php +++ /dev/null @@ -1,86 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Array elements count token. - * - * @author Boris Mikhaylov - */ - -class ArrayCountToken implements TokenInterface -{ - private $count; - - /** - * @param integer $value - */ - public function __construct($value) - { - $this->count = $value; - } - - /** - * Scores 6 when argument has preset number of elements. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - return $this->isCountable($argument) && $this->hasProperCount($argument) ? 6 : false; - } - - /** - * Returns false. - * - * @return boolean - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('count(%s)', $this->count); - } - - /** - * Returns true if object is either array or instance of \Countable - * - * @param $argument - * @return bool - */ - private function isCountable($argument) - { - return (is_array($argument) || $argument instanceof \Countable); - } - - /** - * Returns true if $argument has expected number of elements - * - * @param array|\Countable $argument - * - * @return bool - */ - private function hasProperCount($argument) - { - return $this->count === count($argument); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php deleted file mode 100644 index 0305fc7..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php +++ /dev/null @@ -1,143 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use Prophecy\Exception\InvalidArgumentException; - -/** - * Array entry token. - * - * @author Boris Mikhaylov - */ -class ArrayEntryToken implements TokenInterface -{ - /** @var \Prophecy\Argument\Token\TokenInterface */ - private $key; - /** @var \Prophecy\Argument\Token\TokenInterface */ - private $value; - - /** - * @param mixed $key exact value or token - * @param mixed $value exact value or token - */ - public function __construct($key, $value) - { - $this->key = $this->wrapIntoExactValueToken($key); - $this->value = $this->wrapIntoExactValueToken($value); - } - - /** - * Scores half of combined scores from key and value tokens for same entry. Capped at 8. - * If argument implements \ArrayAccess without \Traversable, then key token is restricted to ExactValueToken. - * - * @param array|\ArrayAccess|\Traversable $argument - * - * @throws \Prophecy\Exception\InvalidArgumentException - * @return bool|int - */ - public function scoreArgument($argument) - { - if ($argument instanceof \Traversable) { - $argument = iterator_to_array($argument); - } - - if ($argument instanceof \ArrayAccess) { - $argument = $this->convertArrayAccessToEntry($argument); - } - - if (!is_array($argument) || empty($argument)) { - return false; - } - - $keyScores = array_map(array($this->key,'scoreArgument'), array_keys($argument)); - $valueScores = array_map(array($this->value,'scoreArgument'), $argument); - $scoreEntry = function ($value, $key) { - return $value && $key ? min(8, ($key + $value) / 2) : false; - }; - - return max(array_map($scoreEntry, $valueScores, $keyScores)); - } - - /** - * Returns false. - * - * @return boolean - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('[..., %s => %s, ...]', $this->key, $this->value); - } - - /** - * Returns key - * - * @return TokenInterface - */ - public function getKey() - { - return $this->key; - } - - /** - * Returns value - * - * @return TokenInterface - */ - public function getValue() - { - return $this->value; - } - - /** - * Wraps non token $value into ExactValueToken - * - * @param $value - * @return TokenInterface - */ - private function wrapIntoExactValueToken($value) - { - return $value instanceof TokenInterface ? $value : new ExactValueToken($value); - } - - /** - * Converts instance of \ArrayAccess to key => value array entry - * - * @param \ArrayAccess $object - * - * @return array|null - * @throws \Prophecy\Exception\InvalidArgumentException - */ - private function convertArrayAccessToEntry(\ArrayAccess $object) - { - if (!$this->key instanceof ExactValueToken) { - throw new InvalidArgumentException(sprintf( - 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL. - 'But you used `%s`.', - $this->key - )); - } - - $key = $this->key->getValue(); - - return $object->offsetExists($key) ? array($key => $object[$key]) : array(); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php deleted file mode 100644 index 5d41fa4..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php +++ /dev/null @@ -1,82 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Array every entry token. - * - * @author Adrien Brault - */ -class ArrayEveryEntryToken implements TokenInterface -{ - /** - * @var TokenInterface - */ - private $value; - - /** - * @param mixed $value exact value or token - */ - public function __construct($value) - { - if (!$value instanceof TokenInterface) { - $value = new ExactValueToken($value); - } - - $this->value = $value; - } - - /** - * {@inheritdoc} - */ - public function scoreArgument($argument) - { - if (!$argument instanceof \Traversable && !is_array($argument)) { - return false; - } - - $scores = array(); - foreach ($argument as $key => $argumentEntry) { - $scores[] = $this->value->scoreArgument($argumentEntry); - } - - if (empty($scores) || in_array(false, $scores, true)) { - return false; - } - - return array_sum($scores) / count($scores); - } - - /** - * {@inheritdoc} - */ - public function isLast() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - return sprintf('[%s, ..., %s]', $this->value, $this->value); - } - - /** - * @return TokenInterface - */ - public function getValue() - { - return $this->value; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php deleted file mode 100644 index f45ba20..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php +++ /dev/null @@ -1,75 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use Prophecy\Exception\InvalidArgumentException; - -/** - * Callback-verified token. - * - * @author Konstantin Kudryashov - */ -class CallbackToken implements TokenInterface -{ - private $callback; - - /** - * Initializes token. - * - * @param callable $callback - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function __construct($callback) - { - if (!is_callable($callback)) { - throw new InvalidArgumentException(sprintf( - 'Callable expected as an argument to CallbackToken, but got %s.', - gettype($callback) - )); - } - - $this->callback = $callback; - } - - /** - * Scores 7 if callback returns true, false otherwise. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - return call_user_func($this->callback, $argument) ? 7 : false; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return 'callback()'; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php deleted file mode 100644 index 045a1b9..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php +++ /dev/null @@ -1,118 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use SebastianBergmann\Comparator\ComparisonFailure; -use Prophecy\Comparator\Factory as ComparatorFactory; -use Prophecy\Util\StringUtil; - -/** - * Exact value token. - * - * @author Konstantin Kudryashov - */ -class ExactValueToken implements TokenInterface -{ - private $value; - private $string; - private $util; - private $comparatorFactory; - - /** - * Initializes token. - * - * @param mixed $value - * @param StringUtil $util - * @param ComparatorFactory $comparatorFactory - */ - public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null) - { - $this->value = $value; - $this->util = $util ?: new StringUtil(); - - $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); - } - - /** - * Scores 10 if argument matches preset value. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - if (is_object($argument) && is_object($this->value)) { - $comparator = $this->comparatorFactory->getComparatorFor( - $argument, $this->value - ); - - try { - $comparator->assertEquals($argument, $this->value); - return 10; - } catch (ComparisonFailure $failure) { - return false; - } - } - - // If either one is an object it should be castable to a string - if (is_object($argument) xor is_object($this->value)) { - if (is_object($argument) && !method_exists($argument, '__toString')) { - return false; - } - - if (is_object($this->value) && !method_exists($this->value, '__toString')) { - return false; - } - } elseif (is_numeric($argument) && is_numeric($this->value)) { - // noop - } elseif (gettype($argument) !== gettype($this->value)) { - return false; - } - - return $argument == $this->value ? 10 : false; - } - - /** - * Returns preset value against which token checks arguments. - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - if (null === $this->string) { - $this->string = sprintf('exact(%s)', $this->util->stringify($this->value)); - } - - return $this->string; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php deleted file mode 100644 index 0b6d23a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php +++ /dev/null @@ -1,74 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use Prophecy\Util\StringUtil; - -/** - * Identical value token. - * - * @author Florian Voutzinos - */ -class IdenticalValueToken implements TokenInterface -{ - private $value; - private $string; - private $util; - - /** - * Initializes token. - * - * @param mixed $value - * @param StringUtil $util - */ - public function __construct($value, StringUtil $util = null) - { - $this->value = $value; - $this->util = $util ?: new StringUtil(); - } - - /** - * Scores 11 if argument matches preset value. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - return $argument === $this->value ? 11 : false; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - if (null === $this->string) { - $this->string = sprintf('identical(%s)', $this->util->stringify($this->value)); - } - - return $this->string; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/InArrayToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/InArrayToken.php deleted file mode 100644 index f727aea..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/InArrayToken.php +++ /dev/null @@ -1,74 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Check if values is in array - * - * @author VinĆ­cius Alonso - */ -class InArrayToken implements TokenInterface -{ - private $token = array(); - private $strict; - - /** - * @param array $arguments tokens - * @param bool $strict - */ - public function __construct(array $arguments, $strict = true) - { - $this->token = $arguments; - $this->strict = $strict; - } - - /** - * Return scores 8 score if argument is in array. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - if (count($this->token) === 0) { - return false; - } - - if (\in_array($argument, $this->token, $this->strict)) { - return 8; - } - - return false; - } - - /** - * Returns false. - * - * @return boolean - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - $arrayAsString = implode(', ', $this->token); - return "[{$arrayAsString}]"; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php deleted file mode 100644 index 4ee1b25..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php +++ /dev/null @@ -1,80 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Logical AND token. - * - * @author Boris Mikhaylov - */ -class LogicalAndToken implements TokenInterface -{ - private $tokens = array(); - - /** - * @param array $arguments exact values or tokens - */ - public function __construct(array $arguments) - { - foreach ($arguments as $argument) { - if (!$argument instanceof TokenInterface) { - $argument = new ExactValueToken($argument); - } - $this->tokens[] = $argument; - } - } - - /** - * Scores maximum score from scores returned by tokens for this argument if all of them score. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - if (0 === count($this->tokens)) { - return false; - } - - $maxScore = 0; - foreach ($this->tokens as $token) { - $score = $token->scoreArgument($argument); - if (false === $score) { - return false; - } - $maxScore = max($score, $maxScore); - } - - return $maxScore; - } - - /** - * Returns false. - * - * @return boolean - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('bool(%s)', implode(' AND ', $this->tokens)); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php deleted file mode 100644 index 623efa5..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php +++ /dev/null @@ -1,73 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Logical NOT token. - * - * @author Boris Mikhaylov - */ -class LogicalNotToken implements TokenInterface -{ - /** @var \Prophecy\Argument\Token\TokenInterface */ - private $token; - - /** - * @param mixed $value exact value or token - */ - public function __construct($value) - { - $this->token = $value instanceof TokenInterface? $value : new ExactValueToken($value); - } - - /** - * Scores 4 when preset token does not match the argument. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - return false === $this->token->scoreArgument($argument) ? 4 : false; - } - - /** - * Returns true if preset token is last. - * - * @return bool|int - */ - public function isLast() - { - return $this->token->isLast(); - } - - /** - * Returns originating token. - * - * @return TokenInterface - */ - public function getOriginatingToken() - { - return $this->token; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('not(%s)', $this->token); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/NotInArrayToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/NotInArrayToken.php deleted file mode 100644 index 6aed8aa..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/NotInArrayToken.php +++ /dev/null @@ -1,75 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Check if values is not in array - * - * @author VinĆ­cius Alonso - */ -class NotInArrayToken implements TokenInterface -{ - private $token = array(); - private $strict; - - /** - * @param array $arguments tokens - * @param bool $strict - */ - public function __construct(array $arguments, $strict = true) - { - $this->token = $arguments; - $this->strict = $strict; - } - - /** - * Return scores 8 score if argument is in array. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - if (count($this->token) === 0) { - return false; - } - - if (!\in_array($argument, $this->token, $this->strict)) { - return 8; - } - - return false; - } - - /** - * Returns false. - * - * @return boolean - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - $arrayAsString = implode(', ', $this->token); - return "[{$arrayAsString}]"; - } -} - diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php deleted file mode 100644 index d771077..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php +++ /dev/null @@ -1,104 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use SebastianBergmann\Comparator\ComparisonFailure; -use Prophecy\Comparator\Factory as ComparatorFactory; -use Prophecy\Util\StringUtil; - -/** - * Object state-checker token. - * - * @author Konstantin Kudryashov - */ -class ObjectStateToken implements TokenInterface -{ - private $name; - private $value; - private $util; - private $comparatorFactory; - - /** - * Initializes token. - * - * @param string $methodName - * @param mixed $value Expected return value - * @param null|StringUtil $util - * @param ComparatorFactory $comparatorFactory - */ - public function __construct( - $methodName, - $value, - StringUtil $util = null, - ComparatorFactory $comparatorFactory = null - ) { - $this->name = $methodName; - $this->value = $value; - $this->util = $util ?: new StringUtil; - - $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); - } - - /** - * Scores 8 if argument is an object, which method returns expected value. - * - * @param mixed $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - if (is_object($argument) && method_exists($argument, $this->name)) { - $actual = call_user_func(array($argument, $this->name)); - - $comparator = $this->comparatorFactory->getComparatorFor( - $this->value, $actual - ); - - try { - $comparator->assertEquals($this->value, $actual); - return 8; - } catch (ComparisonFailure $failure) { - return false; - } - } - - if (is_object($argument) && property_exists($argument, $this->name)) { - return $argument->{$this->name} === $this->value ? 8 : false; - } - - return false; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('state(%s(), %s)', - $this->name, - $this->util->stringify($this->value) - ); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php deleted file mode 100644 index bd8d423..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * String contains token. - * - * @author Peter Mitchell - */ -class StringContainsToken implements TokenInterface -{ - private $value; - - /** - * Initializes token. - * - * @param string $value - */ - public function __construct($value) - { - $this->value = $value; - } - - public function scoreArgument($argument) - { - return is_string($argument) && strpos($argument, $this->value) !== false ? 6 : false; - } - - /** - * Returns preset value against which token checks arguments. - * - * @return mixed - */ - public function getValue() - { - return $this->value; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('contains("%s")', $this->value); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php deleted file mode 100644 index 625d3ba..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php +++ /dev/null @@ -1,43 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -/** - * Argument token interface. - * - * @author Konstantin Kudryashov - */ -interface TokenInterface -{ - /** - * Calculates token match score for provided argument. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument); - - /** - * Returns true if this token prevents check of other tokens (is last one). - * - * @return bool|int - */ - public function isLast(); - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString(); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php deleted file mode 100644 index cb65132..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php +++ /dev/null @@ -1,76 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Argument\Token; - -use Prophecy\Exception\InvalidArgumentException; - -/** - * Value type token. - * - * @author Konstantin Kudryashov - */ -class TypeToken implements TokenInterface -{ - private $type; - - /** - * @param string $type - */ - public function __construct($type) - { - $checker = "is_{$type}"; - if (!function_exists($checker) && !interface_exists($type) && !class_exists($type)) { - throw new InvalidArgumentException(sprintf( - 'Type or class name expected as an argument to TypeToken, but got %s.', $type - )); - } - - $this->type = $type; - } - - /** - * Scores 5 if argument has the same type this token was constructed with. - * - * @param $argument - * - * @return bool|int - */ - public function scoreArgument($argument) - { - $checker = "is_{$this->type}"; - if (function_exists($checker)) { - return call_user_func($checker, $argument) ? 5 : false; - } - - return $argument instanceof $this->type ? 5 : false; - } - - /** - * Returns false. - * - * @return bool - */ - public function isLast() - { - return false; - } - - /** - * Returns string representation for token. - * - * @return string - */ - public function __toString() - { - return sprintf('type(%s)', $this->type); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php b/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php deleted file mode 100644 index 2652235..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php +++ /dev/null @@ -1,162 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Call; - -use Exception; -use Prophecy\Argument\ArgumentsWildcard; - -/** - * Call object. - * - * @author Konstantin Kudryashov - */ -class Call -{ - private $methodName; - private $arguments; - private $returnValue; - private $exception; - private $file; - private $line; - private $scores; - - /** - * Initializes call. - * - * @param string $methodName - * @param array $arguments - * @param mixed $returnValue - * @param Exception $exception - * @param null|string $file - * @param null|int $line - */ - public function __construct($methodName, array $arguments, $returnValue, - Exception $exception = null, $file, $line) - { - $this->methodName = $methodName; - $this->arguments = $arguments; - $this->returnValue = $returnValue; - $this->exception = $exception; - $this->scores = new \SplObjectStorage(); - - if ($file) { - $this->file = $file; - $this->line = intval($line); - } - } - - /** - * Returns called method name. - * - * @return string - */ - public function getMethodName() - { - return $this->methodName; - } - - /** - * Returns called method arguments. - * - * @return array - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Returns called method return value. - * - * @return null|mixed - */ - public function getReturnValue() - { - return $this->returnValue; - } - - /** - * Returns exception that call thrown. - * - * @return null|Exception - */ - public function getException() - { - return $this->exception; - } - - /** - * Returns callee filename. - * - * @return string - */ - public function getFile() - { - return $this->file; - } - - /** - * Returns callee line number. - * - * @return int - */ - public function getLine() - { - return $this->line; - } - - /** - * Returns short notation for callee place. - * - * @return string - */ - public function getCallPlace() - { - if (null === $this->file) { - return 'unknown'; - } - - return sprintf('%s:%d', $this->file, $this->line); - } - - /** - * Adds the wildcard match score for the provided wildcard. - * - * @param ArgumentsWildcard $wildcard - * @param false|int $score - * - * @return $this - */ - public function addScore(ArgumentsWildcard $wildcard, $score) - { - $this->scores[$wildcard] = $score; - - return $this; - } - - /** - * Returns wildcard match score for the provided wildcard. The score is - * calculated if not already done. - * - * @param ArgumentsWildcard $wildcard - * - * @return false|int False OR integer score (higher - better) - */ - public function getScore(ArgumentsWildcard $wildcard) - { - if (isset($this->scores[$wildcard])) { - return $this->scores[$wildcard]; - } - - return $this->scores[$wildcard] = $wildcard->scoreArguments($this->getArguments()); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php b/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php deleted file mode 100644 index 00c526d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php +++ /dev/null @@ -1,240 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Call; - -use Prophecy\Exception\Prophecy\MethodProphecyException; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Argument\ArgumentsWildcard; -use Prophecy\Util\StringUtil; -use Prophecy\Exception\Call\UnexpectedCallException; -use SplObjectStorage; - -/** - * Calls receiver & manager. - * - * @author Konstantin Kudryashov - */ -class CallCenter -{ - private $util; - - /** - * @var Call[] - */ - private $recordedCalls = array(); - - /** - * @var SplObjectStorage - */ - private $unexpectedCalls; - - /** - * Initializes call center. - * - * @param StringUtil $util - */ - public function __construct(StringUtil $util = null) - { - $this->util = $util ?: new StringUtil; - $this->unexpectedCalls = new SplObjectStorage(); - } - - /** - * Makes and records specific method call for object prophecy. - * - * @param ObjectProphecy $prophecy - * @param string $methodName - * @param array $arguments - * - * @return mixed Returns null if no promise for prophecy found or promise return value. - * - * @throws \Prophecy\Exception\Call\UnexpectedCallException If no appropriate method prophecy found - */ - public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments) - { - // For efficiency exclude 'args' from the generated backtrace - // Limit backtrace to last 3 calls as we don't use the rest - $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3); - - $file = $line = null; - if (isset($backtrace[2]) && isset($backtrace[2]['file'])) { - $file = $backtrace[2]['file']; - $line = $backtrace[2]['line']; - } - - // If no method prophecies defined, then it's a dummy, so we'll just return null - if ('__destruct' === strtolower($methodName) || 0 == count($prophecy->getMethodProphecies())) { - $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line); - - return null; - } - - // There are method prophecies, so it's a fake/stub. Searching prophecy for this call - $matches = $this->findMethodProphecies($prophecy, $methodName, $arguments); - - // If fake/stub doesn't have method prophecy for this call - throw exception - if (!count($matches)) { - $this->unexpectedCalls->attach(new Call($methodName, $arguments, null, null, $file, $line), $prophecy); - $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line); - - return null; - } - - // Sort matches by their score value - @usort($matches, function ($match1, $match2) { return $match2[0] - $match1[0]; }); - - $score = $matches[0][0]; - // If Highest rated method prophecy has a promise - execute it or return null instead - $methodProphecy = $matches[0][1]; - $returnValue = null; - $exception = null; - if ($promise = $methodProphecy->getPromise()) { - try { - $returnValue = $promise->execute($arguments, $prophecy, $methodProphecy); - } catch (\Exception $e) { - $exception = $e; - } - } - - if ($methodProphecy->hasReturnVoid() && $returnValue !== null) { - throw new MethodProphecyException( - "The method \"$methodName\" has a void return type, but the promise returned a value", - $methodProphecy - ); - } - - $this->recordedCalls[] = $call = new Call( - $methodName, $arguments, $returnValue, $exception, $file, $line - ); - $call->addScore($methodProphecy->getArgumentsWildcard(), $score); - - if (null !== $exception) { - throw $exception; - } - - return $returnValue; - } - - /** - * Searches for calls by method name & arguments wildcard. - * - * @param string $methodName - * @param ArgumentsWildcard $wildcard - * - * @return Call[] - */ - public function findCalls($methodName, ArgumentsWildcard $wildcard) - { - $methodName = strtolower($methodName); - - return array_values( - array_filter($this->recordedCalls, function (Call $call) use ($methodName, $wildcard) { - return $methodName === strtolower($call->getMethodName()) - && 0 < $call->getScore($wildcard) - ; - }) - ); - } - - /** - * @throws UnexpectedCallException - */ - public function checkUnexpectedCalls() - { - /** @var Call $call */ - foreach ($this->unexpectedCalls as $call) { - $prophecy = $this->unexpectedCalls[$call]; - - // If fake/stub doesn't have method prophecy for this call - throw exception - if (!count($this->findMethodProphecies($prophecy, $call->getMethodName(), $call->getArguments()))) { - throw $this->createUnexpectedCallException($prophecy, $call->getMethodName(), $call->getArguments()); - } - } - } - - private function createUnexpectedCallException(ObjectProphecy $prophecy, $methodName, - array $arguments) - { - $classname = get_class($prophecy->reveal()); - $indentationLength = 8; // looks good - $argstring = implode( - ",\n", - $this->indentArguments( - array_map(array($this->util, 'stringify'), $arguments), - $indentationLength - ) - ); - - $expected = array(); - - foreach (array_merge(...array_values($prophecy->getMethodProphecies())) as $methodProphecy) { - $expected[] = sprintf( - " - %s(\n" . - "%s\n" . - " )", - $methodProphecy->getMethodName(), - implode( - ",\n", - $this->indentArguments( - array_map('strval', $methodProphecy->getArgumentsWildcard()->getTokens()), - $indentationLength - ) - ) - ); - } - - return new UnexpectedCallException( - sprintf( - "Unexpected method call on %s:\n". - " - %s(\n". - "%s\n". - " )\n". - "expected calls were:\n". - "%s", - - $classname, $methodName, $argstring, implode("\n", $expected) - ), - $prophecy, $methodName, $arguments - - ); - } - - private function indentArguments(array $arguments, $indentationLength) - { - return preg_replace_callback( - '/^/m', - function () use ($indentationLength) { - return str_repeat(' ', $indentationLength); - }, - $arguments - ); - } - - /** - * @param ObjectProphecy $prophecy - * @param string $methodName - * @param array $arguments - * - * @return array - */ - private function findMethodProphecies(ObjectProphecy $prophecy, $methodName, array $arguments) - { - $matches = array(); - foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) { - if (0 < $score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments)) { - $matches[] = array($score, $methodProphecy); - } - } - - return $matches; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php b/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php deleted file mode 100644 index fa4f578..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php +++ /dev/null @@ -1,44 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Comparator; - -use SebastianBergmann\Comparator\Comparator; -use SebastianBergmann\Comparator\ComparisonFailure; - -/** - * Closure comparator. - * - * @author Konstantin Kudryashov - */ -final class ClosureComparator extends Comparator -{ - public function accepts($expected, $actual) - { - return is_object($expected) && $expected instanceof \Closure - && is_object($actual) && $actual instanceof \Closure; - } - - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()) - { - if ($expected !== $actual) { - throw new ComparisonFailure( - $expected, - $actual, - // we don't need a diff - '', - '', - false, - 'all closures are different if not identical' - ); - } - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php b/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php deleted file mode 100644 index 2070db1..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php +++ /dev/null @@ -1,47 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Comparator; - -use SebastianBergmann\Comparator\Factory as BaseFactory; - -/** - * Prophecy comparator factory. - * - * @author Konstantin Kudryashov - */ -final class Factory extends BaseFactory -{ - /** - * @var Factory - */ - private static $instance; - - public function __construct() - { - parent::__construct(); - - $this->register(new ClosureComparator()); - $this->register(new ProphecyComparator()); - } - - /** - * @return Factory - */ - public static function getInstance() - { - if (self::$instance === null) { - self::$instance = new Factory; - } - - return self::$instance; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php b/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php deleted file mode 100644 index 298a8e3..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php +++ /dev/null @@ -1,28 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Comparator; - -use Prophecy\Prophecy\ProphecyInterface; -use SebastianBergmann\Comparator\ObjectComparator; - -class ProphecyComparator extends ObjectComparator -{ - public function accepts($expected, $actual) - { - return is_object($expected) && is_object($actual) && $actual instanceof ProphecyInterface; - } - - public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()) - { - parent::assertEquals($expected, $actual->reveal(), $delta, $canonicalize, $ignoreCase, $processed); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php deleted file mode 100644 index 2b87521..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php +++ /dev/null @@ -1,66 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler; - -use ReflectionClass; - -/** - * Cached class doubler. - * Prevents mirroring/creation of the same structure twice. - * - * @author Konstantin Kudryashov - */ -class CachedDoubler extends Doubler -{ - private static $classes = array(); - - /** - * {@inheritdoc} - */ - protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) - { - $classId = $this->generateClassId($class, $interfaces); - if (isset(self::$classes[$classId])) { - return self::$classes[$classId]; - } - - return self::$classes[$classId] = parent::createDoubleClass($class, $interfaces); - } - - /** - * @param ReflectionClass $class - * @param ReflectionClass[] $interfaces - * - * @return string - */ - private function generateClassId(ReflectionClass $class = null, array $interfaces) - { - $parts = array(); - if (null !== $class) { - $parts[] = $class->getName(); - } - foreach ($interfaces as $interface) { - $parts[] = $interface->getName(); - } - foreach ($this->getClassPatches() as $patch) { - $parts[] = get_class($patch); - } - sort($parts); - - return md5(implode('', $parts)); - } - - public function resetCache() - { - self::$classes = array(); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php deleted file mode 100644 index d6d1968..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php +++ /dev/null @@ -1,48 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; - -/** - * Class patch interface. - * Class patches extend doubles functionality or help - * Prophecy to avoid some internal PHP bugs. - * - * @author Konstantin Kudryashov - */ -interface ClassPatchInterface -{ - /** - * Checks if patch supports specific class node. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node); - - /** - * Applies patch to the specific class node. - * - * @param ClassNode $node - * @return void - */ - public function apply(ClassNode $node); - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority(); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php deleted file mode 100644 index 9d84309..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php +++ /dev/null @@ -1,76 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; -use Prophecy\Doubler\Generator\Node\MethodNode; - -/** - * Disable constructor. - * Makes all constructor arguments optional. - * - * @author Konstantin Kudryashov - */ -class DisableConstructorPatch implements ClassPatchInterface -{ - /** - * Checks if class has `__construct` method. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - return true; - } - - /** - * Makes all class constructor arguments optional. - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - if (!$node->isExtendable('__construct')) { - return; - } - - if (!$node->hasMethod('__construct')) { - $node->addMethod(new MethodNode('__construct', '')); - - return; - } - - $constructor = $node->getMethod('__construct'); - foreach ($constructor->getArguments() as $argument) { - $argument->setDefault(null); - } - - $constructor->setCode(<< - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; - -/** - * Exception patch for HHVM to remove the stubs from special methods - * - * @author Christophe Coevoet - */ -class HhvmExceptionPatch implements ClassPatchInterface -{ - /** - * Supports exceptions on HHVM. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - if (!defined('HHVM_VERSION')) { - return false; - } - - return 'Exception' === $node->getParentClass() || is_subclass_of($node->getParentClass(), 'Exception'); - } - - /** - * Removes special exception static methods from the doubled methods. - * - * @param ClassNode $node - * - * @return void - */ - public function apply(ClassNode $node) - { - if ($node->hasMethod('setTraceOptions')) { - $node->getMethod('setTraceOptions')->useParentCode(); - } - if ($node->hasMethod('getTraceOptions')) { - $node->getMethod('getTraceOptions')->useParentCode(); - } - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - return -50; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php deleted file mode 100644 index ab99f74..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php +++ /dev/null @@ -1,68 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; - -/** - * Remove method functionality from the double which will clash with php keywords. - * - * @author Milan Magudia - */ -class KeywordPatch implements ClassPatchInterface -{ - /** - * Support any class - * - * @param ClassNode $node - * - * @return boolean - */ - public function supports(ClassNode $node) - { - return true; - } - - /** - * Remove methods that clash with php keywords - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - $methodNames = array_keys($node->getMethods()); - $methodsToRemove = array_intersect($methodNames, $this->getKeywords()); - foreach ($methodsToRemove as $methodName) { - $node->removeMethod($methodName); - } - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority() - { - return 49; - } - - /** - * Returns array of php keywords. - * - * @return array - */ - private function getKeywords() - { - return ['__halt_compiler']; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php deleted file mode 100644 index 9ff49cd..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php +++ /dev/null @@ -1,94 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; -use Prophecy\Doubler\Generator\Node\MethodNode; -use Prophecy\PhpDocumentor\ClassAndInterfaceTagRetriever; -use Prophecy\PhpDocumentor\MethodTagRetrieverInterface; - -/** - * Discover Magical API using "@method" PHPDoc format. - * - * @author Thomas Tourlourat - * @author KĆ©vin Dunglas - * @author ThĆ©o FIDRY - */ -class MagicCallPatch implements ClassPatchInterface -{ - private $tagRetriever; - - public function __construct(MethodTagRetrieverInterface $tagRetriever = null) - { - $this->tagRetriever = null === $tagRetriever ? new ClassAndInterfaceTagRetriever() : $tagRetriever; - } - - /** - * Support any class - * - * @param ClassNode $node - * - * @return boolean - */ - public function supports(ClassNode $node) - { - return true; - } - - /** - * Discover Magical API - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - $types = array_filter($node->getInterfaces(), function ($interface) { - return 0 !== strpos($interface, 'Prophecy\\'); - }); - $types[] = $node->getParentClass(); - - foreach ($types as $type) { - $reflectionClass = new \ReflectionClass($type); - - while ($reflectionClass) { - $tagList = $this->tagRetriever->getTagList($reflectionClass); - - foreach ($tagList as $tag) { - $methodName = $tag->getMethodName(); - - if (empty($methodName)) { - continue; - } - - if (!$reflectionClass->hasMethod($methodName)) { - $methodNode = new MethodNode($methodName); - $methodNode->setStatic($tag->isStatic()); - $node->addMethod($methodNode); - } - } - - $reflectionClass = $reflectionClass->getParentClass(); - } - } - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return integer Priority number (higher - earlier) - */ - public function getPriority() - { - return 50; - } -} - diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php deleted file mode 100644 index b41ebaa..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php +++ /dev/null @@ -1,113 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ArgumentTypeNode; -use Prophecy\Doubler\Generator\Node\ClassNode; -use Prophecy\Doubler\Generator\Node\MethodNode; -use Prophecy\Doubler\Generator\Node\ArgumentNode; -use Prophecy\Doubler\Generator\Node\ReturnTypeNode; - -/** - * Add Prophecy functionality to the double. - * This is a core class patch for Prophecy. - * - * @author Konstantin Kudryashov - */ -class ProphecySubjectPatch implements ClassPatchInterface -{ - /** - * Always returns true. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - return true; - } - - /** - * Apply Prophecy functionality to class node. - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface'); - $node->addProperty('objectProphecyClosure', 'private'); - - foreach ($node->getMethods() as $name => $method) { - if ('__construct' === strtolower($name)) { - continue; - } - - if ($method->getReturnTypeNode()->isVoid()) { - $method->setCode( - '$this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());' - ); - } else { - $method->setCode( - 'return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());' - ); - } - } - - $prophecySetter = new MethodNode('setProphecy'); - $prophecyArgument = new ArgumentNode('prophecy'); - $prophecyArgument->setTypeNode(new ArgumentTypeNode('Prophecy\Prophecy\ProphecyInterface')); - $prophecySetter->addArgument($prophecyArgument); - $prophecySetter->setCode(<<objectProphecyClosure) { - \$this->objectProphecyClosure = static function () use (\$prophecy) { - return \$prophecy; - }; -} -PHP - ); - - $prophecyGetter = new MethodNode('getProphecy'); - $prophecyGetter->setCode('return \call_user_func($this->objectProphecyClosure);'); - - if ($node->hasMethod('__call')) { - $__call = $node->getMethod('__call'); - } else { - $__call = new MethodNode('__call'); - $__call->addArgument(new ArgumentNode('name')); - $__call->addArgument(new ArgumentNode('arguments')); - - $node->addMethod($__call, true); - } - - $__call->setCode(<<getProphecy(), func_get_arg(0) -); -PHP - ); - - $node->addMethod($prophecySetter, true); - $node->addMethod($prophecyGetter, true); - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority() - { - return 0; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php deleted file mode 100644 index 9166aee..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php +++ /dev/null @@ -1,57 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; - -/** - * ReflectionClass::newInstance patch. - * Makes first argument of newInstance optional, since it works but signature is misleading - * - * @author Florian Klein - */ -class ReflectionClassNewInstancePatch implements ClassPatchInterface -{ - /** - * Supports ReflectionClass - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - return 'ReflectionClass' === $node->getParentClass(); - } - - /** - * Updates newInstance's first argument to make it optional - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - foreach ($node->getMethod('newInstance')->getArguments() as $argument) { - $argument->setDefault(null); - } - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher = earlier) - */ - public function getPriority() - { - return 50; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php deleted file mode 100644 index ceee94a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php +++ /dev/null @@ -1,123 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; -use Prophecy\Doubler\Generator\Node\MethodNode; - -/** - * SplFileInfo patch. - * Makes SplFileInfo and derivative classes usable with Prophecy. - * - * @author Konstantin Kudryashov - */ -class SplFileInfoPatch implements ClassPatchInterface -{ - /** - * Supports everything that extends SplFileInfo. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - if (null === $node->getParentClass()) { - return false; - } - return 'SplFileInfo' === $node->getParentClass() - || is_subclass_of($node->getParentClass(), 'SplFileInfo') - ; - } - - /** - * Updated constructor code to call parent one with dummy file argument. - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - if ($node->hasMethod('__construct')) { - $constructor = $node->getMethod('__construct'); - } else { - $constructor = new MethodNode('__construct'); - $node->addMethod($constructor); - } - - if ($this->nodeIsDirectoryIterator($node)) { - $constructor->setCode('return parent::__construct("' . __DIR__ . '");'); - - return; - } - - if ($this->nodeIsSplFileObject($node)) { - $filePath = str_replace('\\','\\\\',__FILE__); - $constructor->setCode('return parent::__construct("' . $filePath .'");'); - - return; - } - - if ($this->nodeIsSymfonySplFileInfo($node)) { - $filePath = str_replace('\\','\\\\',__FILE__); - $constructor->setCode('return parent::__construct("' . $filePath .'", "", "");'); - - return; - } - - $constructor->useParentCode(); - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority() - { - return 50; - } - - /** - * @param ClassNode $node - * @return boolean - */ - private function nodeIsDirectoryIterator(ClassNode $node) - { - $parent = $node->getParentClass(); - - return 'DirectoryIterator' === $parent - || is_subclass_of($parent, 'DirectoryIterator'); - } - - /** - * @param ClassNode $node - * @return boolean - */ - private function nodeIsSplFileObject(ClassNode $node) - { - $parent = $node->getParentClass(); - - return 'SplFileObject' === $parent - || is_subclass_of($parent, 'SplFileObject'); - } - - /** - * @param ClassNode $node - * @return boolean - */ - private function nodeIsSymfonySplFileInfo(ClassNode $node) - { - $parent = $node->getParentClass(); - - return 'Symfony\\Component\\Finder\\SplFileInfo' === $parent; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php deleted file mode 100644 index b98e943..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php +++ /dev/null @@ -1,95 +0,0 @@ -implementsAThrowableInterface($node) && $this->doesNotExtendAThrowableClass($node); - } - - /** - * @param ClassNode $node - * @return bool - */ - private function implementsAThrowableInterface(ClassNode $node) - { - foreach ($node->getInterfaces() as $type) { - if (is_a($type, 'Throwable', true)) { - return true; - } - } - - return false; - } - - /** - * @param ClassNode $node - * @return bool - */ - private function doesNotExtendAThrowableClass(ClassNode $node) - { - return !is_a($node->getParentClass(), 'Throwable', true); - } - - /** - * Applies patch to the specific class node. - * - * @param ClassNode $node - * - * @return void - */ - public function apply(ClassNode $node) - { - $this->checkItCanBeDoubled($node); - $this->setParentClassToException($node); - } - - private function checkItCanBeDoubled(ClassNode $node) - { - $className = $node->getParentClass(); - if ($className !== 'stdClass') { - throw new ClassCreatorException( - sprintf( - 'Cannot double concrete class %s as well as implement Traversable', - $className - ), - $node - ); - } - } - - private function setParentClassToException(ClassNode $node) - { - $node->setParentClass('Exception'); - - $node->removeMethod('getMessage'); - $node->removeMethod('getCode'); - $node->removeMethod('getFile'); - $node->removeMethod('getLine'); - $node->removeMethod('getTrace'); - $node->removeMethod('getPrevious'); - $node->removeMethod('getNext'); - $node->removeMethod('getTraceAsString'); - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority() - { - return 100; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php deleted file mode 100644 index eea0202..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php +++ /dev/null @@ -1,83 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\ClassPatch; - -use Prophecy\Doubler\Generator\Node\ClassNode; -use Prophecy\Doubler\Generator\Node\MethodNode; - -/** - * Traversable interface patch. - * Forces classes that implement interfaces, that extend Traversable to also implement Iterator. - * - * @author Konstantin Kudryashov - */ -class TraversablePatch implements ClassPatchInterface -{ - /** - * Supports nodetree, that implement Traversable, but not Iterator or IteratorAggregate. - * - * @param ClassNode $node - * - * @return bool - */ - public function supports(ClassNode $node) - { - if (in_array('Iterator', $node->getInterfaces())) { - return false; - } - if (in_array('IteratorAggregate', $node->getInterfaces())) { - return false; - } - - foreach ($node->getInterfaces() as $interface) { - if ('Traversable' !== $interface && !is_subclass_of($interface, 'Traversable')) { - continue; - } - if ('Iterator' === $interface || is_subclass_of($interface, 'Iterator')) { - continue; - } - if ('IteratorAggregate' === $interface || is_subclass_of($interface, 'IteratorAggregate')) { - continue; - } - - return true; - } - - return false; - } - - /** - * Forces class to implement Iterator interface. - * - * @param ClassNode $node - */ - public function apply(ClassNode $node) - { - $node->addInterface('Iterator'); - - $node->addMethod(new MethodNode('current')); - $node->addMethod(new MethodNode('key')); - $node->addMethod(new MethodNode('next')); - $node->addMethod(new MethodNode('rewind')); - $node->addMethod(new MethodNode('valid')); - } - - /** - * Returns patch priority, which determines when patch will be applied. - * - * @return int Priority number (higher - earlier) - */ - public function getPriority() - { - return 100; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php deleted file mode 100644 index 699be3a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php +++ /dev/null @@ -1,22 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler; - -/** - * Core double interface. - * All doubled classes will implement this one. - * - * @author Konstantin Kudryashov - */ -interface DoubleInterface -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php deleted file mode 100644 index a378ae2..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php +++ /dev/null @@ -1,146 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler; - -use Doctrine\Instantiator\Instantiator; -use Prophecy\Doubler\ClassPatch\ClassPatchInterface; -use Prophecy\Doubler\Generator\ClassMirror; -use Prophecy\Doubler\Generator\ClassCreator; -use Prophecy\Exception\InvalidArgumentException; -use ReflectionClass; - -/** - * Cached class doubler. - * Prevents mirroring/creation of the same structure twice. - * - * @author Konstantin Kudryashov - */ -class Doubler -{ - private $mirror; - private $creator; - private $namer; - - /** - * @var ClassPatchInterface[] - */ - private $patches = array(); - - /** - * @var \Doctrine\Instantiator\Instantiator - */ - private $instantiator; - - /** - * Initializes doubler. - * - * @param ClassMirror $mirror - * @param ClassCreator $creator - * @param NameGenerator $namer - */ - public function __construct(ClassMirror $mirror = null, ClassCreator $creator = null, - NameGenerator $namer = null) - { - $this->mirror = $mirror ?: new ClassMirror; - $this->creator = $creator ?: new ClassCreator; - $this->namer = $namer ?: new NameGenerator; - } - - /** - * Returns list of registered class patches. - * - * @return ClassPatchInterface[] - */ - public function getClassPatches() - { - return $this->patches; - } - - /** - * Registers new class patch. - * - * @param ClassPatchInterface $patch - */ - public function registerClassPatch(ClassPatchInterface $patch) - { - $this->patches[] = $patch; - - @usort($this->patches, function (ClassPatchInterface $patch1, ClassPatchInterface $patch2) { - return $patch2->getPriority() - $patch1->getPriority(); - }); - } - - /** - * Creates double from specific class or/and list of interfaces. - * - * @param ReflectionClass $class - * @param ReflectionClass[] $interfaces Array of ReflectionClass instances - * @param array $args Constructor arguments - * - * @return DoubleInterface - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function double(ReflectionClass $class = null, array $interfaces, array $args = null) - { - foreach ($interfaces as $interface) { - if (!$interface instanceof ReflectionClass) { - throw new InvalidArgumentException(sprintf( - "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n". - "a second argument to `Doubler::double(...)`, but got %s.", - is_object($interface) ? get_class($interface).' class' : gettype($interface) - )); - } - } - - $classname = $this->createDoubleClass($class, $interfaces); - $reflection = new ReflectionClass($classname); - - if (null !== $args) { - return $reflection->newInstanceArgs($args); - } - if ((null === $constructor = $reflection->getConstructor()) - || ($constructor->isPublic() && !$constructor->isFinal())) { - return $reflection->newInstance(); - } - - if (!$this->instantiator) { - $this->instantiator = new Instantiator(); - } - - return $this->instantiator->instantiate($classname); - } - - /** - * Creates double class and returns its FQN. - * - * @param ReflectionClass $class - * @param ReflectionClass[] $interfaces - * - * @return string - */ - protected function createDoubleClass(ReflectionClass $class = null, array $interfaces) - { - $name = $this->namer->name($class, $interfaces); - $node = $this->mirror->reflect($class, $interfaces); - - foreach ($this->patches as $patch) { - if ($patch->supports($node)) { - $patch->apply($node); - } - } - - $this->creator->create($name, $node); - - return $name; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php deleted file mode 100644 index 52e5e04..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php +++ /dev/null @@ -1,110 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator; - -use Prophecy\Doubler\Generator\Node\ReturnTypeNode; -use Prophecy\Doubler\Generator\Node\TypeNodeAbstract; - -/** - * Class code creator. - * Generates PHP code for specific class node tree. - * - * @author Konstantin Kudryashov - */ -class ClassCodeGenerator -{ - public function __construct(TypeHintReference $typeHintReference = null) - { - } - - /** - * Generates PHP code for class node. - * - * @param string $classname - * @param Node\ClassNode $class - * - * @return string - */ - public function generate($classname, Node\ClassNode $class) - { - $parts = explode('\\', $classname); - $classname = array_pop($parts); - $namespace = implode('\\', $parts); - - $code = sprintf("class %s extends \%s implements %s {\n", - $classname, $class->getParentClass(), implode(', ', - array_map(function ($interface) {return '\\'.$interface;}, $class->getInterfaces()) - ) - ); - - foreach ($class->getProperties() as $name => $visibility) { - $code .= sprintf("%s \$%s;\n", $visibility, $name); - } - $code .= "\n"; - - foreach ($class->getMethods() as $method) { - $code .= $this->generateMethod($method)."\n"; - } - $code .= "\n}"; - - return sprintf("namespace %s {\n%s\n}", $namespace, $code); - } - - private function generateMethod(Node\MethodNode $method) - { - $php = sprintf("%s %s function %s%s(%s)%s {\n", - $method->getVisibility(), - $method->isStatic() ? 'static' : '', - $method->returnsReference() ? '&':'', - $method->getName(), - implode(', ', $this->generateArguments($method->getArguments())), - ($ret = $this->generateTypes($method->getReturnTypeNode())) ? ': '.$ret : '' - ); - $php .= $method->getCode()."\n"; - - return $php.'}'; - } - - private function generateTypes(TypeNodeAbstract $typeNode): string - { - if (!$typeNode->getTypes()) { - return ''; - } - - // When we require PHP 8 we can stop generating ?foo nullables and remove this first block - if ($typeNode->canUseNullShorthand()) { - return sprintf( '?%s', $typeNode->getNonNullTypes()[0]); - } else { - return join('|', $typeNode->getTypes()); - } - } - - private function generateArguments(array $arguments) - { - return array_map(function (Node\ArgumentNode $argument){ - - $php = $this->generateTypes($argument->getTypeNode()); - - $php .= ' '.($argument->isPassedByReference() ? '&' : ''); - - $php .= $argument->isVariadic() ? '...' : ''; - - $php .= '$'.$argument->getName(); - - if ($argument->isOptional() && !$argument->isVariadic()) { - $php .= ' = '.var_export($argument->getDefault(), true); - } - - return $php; - }, $arguments); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php deleted file mode 100644 index 882a4a4..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator; - -use Prophecy\Exception\Doubler\ClassCreatorException; - -/** - * Class creator. - * Creates specific class in current environment. - * - * @author Konstantin Kudryashov - */ -class ClassCreator -{ - private $generator; - - /** - * Initializes creator. - * - * @param ClassCodeGenerator $generator - */ - public function __construct(ClassCodeGenerator $generator = null) - { - $this->generator = $generator ?: new ClassCodeGenerator; - } - - /** - * Creates class. - * - * @param string $classname - * @param Node\ClassNode $class - * - * @return mixed - * - * @throws \Prophecy\Exception\Doubler\ClassCreatorException - */ - public function create($classname, Node\ClassNode $class) - { - $code = $this->generator->generate($classname, $class); - $return = eval($code); - - if (!class_exists($classname, false)) { - if (count($class->getInterfaces())) { - throw new ClassCreatorException(sprintf( - 'Could not double `%s` and implement interfaces: [%s].', - $class->getParentClass(), implode(', ', $class->getInterfaces()) - ), $class); - } - - throw new ClassCreatorException( - sprintf('Could not double `%s`.', $class->getParentClass()), - $class - ); - } - - return $return; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php deleted file mode 100644 index 6b21623..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php +++ /dev/null @@ -1,243 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator; - -use Prophecy\Doubler\Generator\Node\ArgumentTypeNode; -use Prophecy\Doubler\Generator\Node\ReturnTypeNode; -use Prophecy\Exception\InvalidArgumentException; -use Prophecy\Exception\Doubler\ClassMirrorException; -use ReflectionClass; -use ReflectionMethod; -use ReflectionNamedType; -use ReflectionParameter; -use ReflectionType; -use ReflectionUnionType; - -/** - * Class mirror. - * Core doubler class. Mirrors specific class and/or interfaces into class node tree. - * - * @author Konstantin Kudryashov - */ -class ClassMirror -{ - private static $reflectableMethods = array( - '__construct', - '__destruct', - '__sleep', - '__wakeup', - '__toString', - '__call', - '__invoke' - ); - - /** - * Reflects provided arguments into class node. - * - * @param ReflectionClass|null $class - * @param ReflectionClass[] $interfaces - * - * @return Node\ClassNode - * - */ - public function reflect(?ReflectionClass $class, array $interfaces) - { - $node = new Node\ClassNode; - - if (null !== $class) { - if (true === $class->isInterface()) { - throw new InvalidArgumentException(sprintf( - "Could not reflect %s as a class, because it\n". - "is interface - use the second argument instead.", - $class->getName() - )); - } - - $this->reflectClassToNode($class, $node); - } - - foreach ($interfaces as $interface) { - if (!$interface instanceof ReflectionClass) { - throw new InvalidArgumentException(sprintf( - "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n". - "a second argument to `ClassMirror::reflect(...)`, but got %s.", - is_object($interface) ? get_class($interface).' class' : gettype($interface) - )); - } - if (false === $interface->isInterface()) { - throw new InvalidArgumentException(sprintf( - "Could not reflect %s as an interface, because it\n". - "is class - use the first argument instead.", - $interface->getName() - )); - } - - $this->reflectInterfaceToNode($interface, $node); - } - - $node->addInterface('Prophecy\Doubler\Generator\ReflectionInterface'); - - return $node; - } - - private function reflectClassToNode(ReflectionClass $class, Node\ClassNode $node) - { - if (true === $class->isFinal()) { - throw new ClassMirrorException(sprintf( - 'Could not reflect class %s as it is marked final.', $class->getName() - ), $class); - } - - $node->setParentClass($class->getName()); - - foreach ($class->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) { - if (false === $method->isProtected()) { - continue; - } - - $this->reflectMethodToNode($method, $node); - } - - foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { - if (0 === strpos($method->getName(), '_') - && !in_array($method->getName(), self::$reflectableMethods)) { - continue; - } - - if (true === $method->isFinal()) { - $node->addUnextendableMethod($method->getName()); - continue; - } - - $this->reflectMethodToNode($method, $node); - } - } - - private function reflectInterfaceToNode(ReflectionClass $interface, Node\ClassNode $node) - { - $node->addInterface($interface->getName()); - - foreach ($interface->getMethods() as $method) { - $this->reflectMethodToNode($method, $node); - } - } - - private function reflectMethodToNode(ReflectionMethod $method, Node\ClassNode $classNode) - { - $node = new Node\MethodNode($method->getName()); - - if (true === $method->isProtected()) { - $node->setVisibility('protected'); - } - - if (true === $method->isStatic()) { - $node->setStatic(); - } - - if (true === $method->returnsReference()) { - $node->setReturnsReference(); - } - - if ($method->hasReturnType()) { - $returnTypes = $this->getTypeHints($method->getReturnType(), $method->getDeclaringClass(), $method->getReturnType()->allowsNull()); - $node->setReturnTypeNode(new ReturnTypeNode(...$returnTypes)); - } - - if (is_array($params = $method->getParameters()) && count($params)) { - foreach ($params as $param) { - $this->reflectArgumentToNode($param, $node); - } - } - - $classNode->addMethod($node); - } - - private function reflectArgumentToNode(ReflectionParameter $parameter, Node\MethodNode $methodNode) - { - $name = $parameter->getName() == '...' ? '__dot_dot_dot__' : $parameter->getName(); - $node = new Node\ArgumentNode($name); - - $typeHints = $this->getTypeHints($parameter->getType(), $parameter->getDeclaringClass(), $parameter->allowsNull()); - - $node->setTypeNode(new ArgumentTypeNode(...$typeHints)); - - if ($parameter->isVariadic()) { - $node->setAsVariadic(); - } - - if ($this->hasDefaultValue($parameter)) { - $node->setDefault($this->getDefaultValue($parameter)); - } - - if ($parameter->isPassedByReference()) { - $node->setAsPassedByReference(); - } - - - $methodNode->addArgument($node); - } - - private function hasDefaultValue(ReflectionParameter $parameter) - { - if ($parameter->isVariadic()) { - return false; - } - - if ($parameter->isDefaultValueAvailable()) { - return true; - } - - return $parameter->isOptional() || ($parameter->allowsNull() && $parameter->getType()); - } - - private function getDefaultValue(ReflectionParameter $parameter) - { - if (!$parameter->isDefaultValueAvailable()) { - return null; - } - - return $parameter->getDefaultValue(); - } - - private function getTypeHints(?ReflectionType $type, ?ReflectionClass $class, bool $allowsNull) : array - { - $types = []; - - if ($type instanceof ReflectionNamedType) { - $types = [$type->getName()]; - - } - elseif ($type instanceof ReflectionUnionType) { - $types = $type->getTypes(); - } - - $types = array_map( - function(string $type) use ($class) { - if ($type === 'self') { - return $class->getName(); - } - if ($type === 'parent') { - return $class->getParentClass()->getName(); - } - - return $type; - }, - $types - ); - - if ($types && $types != ['mixed'] && $allowsNull) { - $types[] = 'null'; - } - - return $types; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php deleted file mode 100644 index da7fed4..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php +++ /dev/null @@ -1,133 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator\Node; - -/** - * Argument node. - * - * @author Konstantin Kudryashov - */ -class ArgumentNode -{ - private $name; - private $default; - private $optional = false; - private $byReference = false; - private $isVariadic = false; - - /** @var ArgumentTypeNode */ - private $typeNode; - - /** - * @param string $name - */ - public function __construct($name) - { - $this->name = $name; - $this->typeNode = new ArgumentTypeNode(); - } - - public function getName() - { - return $this->name; - } - - public function setTypeNode(ArgumentTypeNode $typeNode) - { - $this->typeNode = $typeNode; - } - - public function getTypeNode() : ArgumentTypeNode - { - return $this->typeNode; - } - - public function hasDefault() - { - return $this->isOptional() && !$this->isVariadic(); - } - - public function getDefault() - { - return $this->default; - } - - public function setDefault($default = null) - { - $this->optional = true; - $this->default = $default; - } - - public function isOptional() - { - return $this->optional; - } - - public function setAsPassedByReference($byReference = true) - { - $this->byReference = $byReference; - } - - public function isPassedByReference() - { - return $this->byReference; - } - - public function setAsVariadic($isVariadic = true) - { - $this->isVariadic = $isVariadic; - } - - public function isVariadic() - { - return $this->isVariadic; - } - - /** - * @deprecated use getArgumentTypeNode instead - * @return string|null - */ - public function getTypeHint() - { - $type = $this->typeNode->getNonNullTypes() ? $this->typeNode->getNonNullTypes()[0] : null; - - return $type ? ltrim($type, '\\') : null; - } - - /** - * @deprecated use setArgumentTypeNode instead - * @param string|null $typeHint - */ - public function setTypeHint($typeHint = null) - { - $this->typeNode = ($typeHint === null) ? new ArgumentTypeNode() : new ArgumentTypeNode($typeHint); - } - - /** - * @deprecated use getArgumentTypeNode instead - * @return bool - */ - public function isNullable() - { - return $this->typeNode->canUseNullShorthand(); - } - - /** - * @deprecated use getArgumentTypeNode instead - * @param bool $isNullable - */ - public function setAsNullable($isNullable = true) - { - $nonNullTypes = $this->typeNode->getNonNullTypes(); - $this->typeNode = $isNullable ? new ArgumentTypeNode('null', ...$nonNullTypes) : new ArgumentTypeNode(...$nonNullTypes); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentTypeNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentTypeNode.php deleted file mode 100644 index 0a18b91..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentTypeNode.php +++ /dev/null @@ -1,10 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator\Node; - -use Prophecy\Exception\Doubler\MethodNotExtendableException; -use Prophecy\Exception\InvalidArgumentException; - -/** - * Class node. - * - * @author Konstantin Kudryashov - */ -class ClassNode -{ - private $parentClass = 'stdClass'; - private $interfaces = array(); - private $properties = array(); - private $unextendableMethods = array(); - - /** - * @var MethodNode[] - */ - private $methods = array(); - - public function getParentClass() - { - return $this->parentClass; - } - - /** - * @param string $class - */ - public function setParentClass($class) - { - $this->parentClass = $class ?: 'stdClass'; - } - - /** - * @return string[] - */ - public function getInterfaces() - { - return $this->interfaces; - } - - /** - * @param string $interface - */ - public function addInterface($interface) - { - if ($this->hasInterface($interface)) { - return; - } - - array_unshift($this->interfaces, $interface); - } - - /** - * @param string $interface - * - * @return bool - */ - public function hasInterface($interface) - { - return in_array($interface, $this->interfaces); - } - - public function getProperties() - { - return $this->properties; - } - - public function addProperty($name, $visibility = 'public') - { - $visibility = strtolower($visibility); - - if (!in_array($visibility, array('public', 'private', 'protected'))) { - throw new InvalidArgumentException(sprintf( - '`%s` property visibility is not supported.', $visibility - )); - } - - $this->properties[$name] = $visibility; - } - - /** - * @return MethodNode[] - */ - public function getMethods() - { - return $this->methods; - } - - public function addMethod(MethodNode $method, $force = false) - { - if (!$this->isExtendable($method->getName())){ - $message = sprintf( - 'Method `%s` is not extendable, so can not be added.', $method->getName() - ); - throw new MethodNotExtendableException($message, $this->getParentClass(), $method->getName()); - } - - if ($force || !isset($this->methods[$method->getName()])) { - $this->methods[$method->getName()] = $method; - } - } - - public function removeMethod($name) - { - unset($this->methods[$name]); - } - - /** - * @param string $name - * - * @return MethodNode|null - */ - public function getMethod($name) - { - return $this->hasMethod($name) ? $this->methods[$name] : null; - } - - /** - * @param string $name - * - * @return bool - */ - public function hasMethod($name) - { - return isset($this->methods[$name]); - } - - /** - * @return string[] - */ - public function getUnextendableMethods() - { - return $this->unextendableMethods; - } - - /** - * @param string $unextendableMethod - */ - public function addUnextendableMethod($unextendableMethod) - { - if (!$this->isExtendable($unextendableMethod)){ - return; - } - $this->unextendableMethods[] = $unextendableMethod; - } - - /** - * @param string $method - * @return bool - */ - public function isExtendable($method) - { - return !in_array($method, $this->unextendableMethods); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php deleted file mode 100644 index ece652f..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php +++ /dev/null @@ -1,210 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator\Node; - -use Prophecy\Doubler\Generator\TypeHintReference; -use Prophecy\Exception\InvalidArgumentException; - -/** - * Method node. - * - * @author Konstantin Kudryashov - */ -class MethodNode -{ - private $name; - private $code; - private $visibility = 'public'; - private $static = false; - private $returnsReference = false; - - /** @var ReturnTypeNode */ - private $returnTypeNode; - - /** - * @var ArgumentNode[] - */ - private $arguments = array(); - - /** - * @param string $name - * @param string $code - */ - public function __construct($name, $code = null, TypeHintReference $typeHintReference = null) - { - $this->name = $name; - $this->code = $code; - $this->returnTypeNode = new ReturnTypeNode(); - } - - public function getVisibility() - { - return $this->visibility; - } - - /** - * @param string $visibility - */ - public function setVisibility($visibility) - { - $visibility = strtolower($visibility); - - if (!in_array($visibility, array('public', 'private', 'protected'))) { - throw new InvalidArgumentException(sprintf( - '`%s` method visibility is not supported.', $visibility - )); - } - - $this->visibility = $visibility; - } - - public function isStatic() - { - return $this->static; - } - - public function setStatic($static = true) - { - $this->static = (bool) $static; - } - - public function returnsReference() - { - return $this->returnsReference; - } - - public function setReturnsReference() - { - $this->returnsReference = true; - } - - public function getName() - { - return $this->name; - } - - public function addArgument(ArgumentNode $argument) - { - $this->arguments[] = $argument; - } - - /** - * @return ArgumentNode[] - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * @deprecated use getReturnTypeNode instead - * @return bool - */ - public function hasReturnType() - { - return (bool) $this->returnTypeNode->getNonNullTypes(); - } - - public function setReturnTypeNode(ReturnTypeNode $returnTypeNode): void - { - $this->returnTypeNode = $returnTypeNode; - } - - /** - * @deprecated use setReturnTypeNode instead - * @param string $type - */ - public function setReturnType($type = null) - { - $this->returnTypeNode = ($type === '' || $type === null) ? new ReturnTypeNode() : new ReturnTypeNode($type); - } - - /** - * @deprecated use setReturnTypeNode instead - * @param bool $bool - */ - public function setNullableReturnType($bool = true) - { - if ($bool) { - $this->returnTypeNode = new ReturnTypeNode('null', ...$this->returnTypeNode->getTypes()); - } - else { - $this->returnTypeNode = new ReturnTypeNode(...$this->returnTypeNode->getNonNullTypes()); - } - } - - /** - * @deprecated use getReturnTypeNode instead - * @return string|null - */ - public function getReturnType() - { - if ($types = $this->returnTypeNode->getNonNullTypes()) - { - return $types[0]; - } - - return null; - } - - public function getReturnTypeNode() : ReturnTypeNode - { - return $this->returnTypeNode; - } - - /** - * @deprecated use getReturnTypeNode instead - * @return bool - */ - public function hasNullableReturnType() - { - return $this->returnTypeNode->canUseNullShorthand(); - } - - /** - * @param string $code - */ - public function setCode($code) - { - $this->code = $code; - } - - public function getCode() - { - if ($this->returnsReference) - { - return "throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), '{$this->name}');"; - } - - return (string) $this->code; - } - - public function useParentCode() - { - $this->code = sprintf( - 'return parent::%s(%s);', $this->getName(), implode(', ', - array_map(array($this, 'generateArgument'), $this->arguments) - ) - ); - } - - private function generateArgument(ArgumentNode $arg) - { - $argument = '$'.$arg->getName(); - - if ($arg->isVariadic()) { - $argument = '...'.$argument; - } - - return $argument; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ReturnTypeNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ReturnTypeNode.php deleted file mode 100644 index f688537..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ReturnTypeNode.php +++ /dev/null @@ -1,31 +0,0 @@ -types['void']) && count($this->types) !== 1) { - throw new DoubleException('void cannot be part of a union'); - } - - parent::guardIsValidType(); - } - - public function isVoid(): bool - { - return $this->types == ['void' => 'void']; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/TypeNodeAbstract.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/TypeNodeAbstract.php deleted file mode 100644 index 3b79cfb..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/TypeNodeAbstract.php +++ /dev/null @@ -1,87 +0,0 @@ -getRealType($type); - $this->types[$type] = $type; - } - - $this->guardIsValidType(); - } - - public function canUseNullShorthand(): bool - { - return isset($this->types['null']) && count($this->types) <= 2; - } - - public function getTypes(): array - { - return array_values($this->types); - } - - public function getNonNullTypes(): array - { - $nonNullTypes = $this->types; - unset($nonNullTypes['null']); - - return array_values($nonNullTypes); - } - - protected function prefixWithNsSeparator(string $type): string - { - return '\\' . ltrim($type, '\\'); - } - - protected function getRealType(string $type): string - { - switch ($type) { - // type aliases - case 'double': - case 'real': - return 'float'; - case 'boolean': - return 'bool'; - case 'integer': - return 'int'; - - // built in types - case 'self': - case 'array': - case 'callable': - case 'bool': - case 'float': - case 'int': - case 'string': - case 'iterable': - case 'object': - case 'null': - return $type; - case 'mixed': - return \PHP_VERSION_ID < 80000 ? $this->prefixWithNsSeparator($type) : $type; - - default: - return $this->prefixWithNsSeparator($type); - } - } - - protected function guardIsValidType() - { - if ($this->types == ['null' => 'null']) { - throw new DoubleException('Argument type cannot be standalone null'); - } - - if (\PHP_VERSION_ID >= 80000 && isset($this->types['mixed']) && count($this->types) !== 1) { - throw new DoubleException('mixed cannot be part of a union'); - } - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php deleted file mode 100644 index d720b15..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php +++ /dev/null @@ -1,22 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler\Generator; - -/** - * Reflection interface. - * All reflected classes implement this interface. - * - * @author Konstantin Kudryashov - */ -interface ReflectionInterface -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php deleted file mode 100644 index 5e8aa30..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php +++ /dev/null @@ -1,43 +0,0 @@ -= 80000; - - default: - return false; - } - } - - public function isBuiltInReturnTypeHint($type) - { - if ($type === 'void') { - return true; - } - - return $this->isBuiltInParamTypeHint($type); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php deleted file mode 100644 index 8a99c4c..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php +++ /dev/null @@ -1,127 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler; - -use Prophecy\Exception\Doubler\DoubleException; -use Prophecy\Exception\Doubler\ClassNotFoundException; -use Prophecy\Exception\Doubler\InterfaceNotFoundException; -use ReflectionClass; - -/** - * Lazy double. - * Gives simple interface to describe double before creating it. - * - * @author Konstantin Kudryashov - */ -class LazyDouble -{ - private $doubler; - private $class; - private $interfaces = array(); - private $arguments = null; - private $double; - - /** - * Initializes lazy double. - * - * @param Doubler $doubler - */ - public function __construct(Doubler $doubler) - { - $this->doubler = $doubler; - } - - /** - * Tells doubler to use specific class as parent one for double. - * - * @param string|ReflectionClass $class - * - * @throws \Prophecy\Exception\Doubler\ClassNotFoundException - * @throws \Prophecy\Exception\Doubler\DoubleException - */ - public function setParentClass($class) - { - if (null !== $this->double) { - throw new DoubleException('Can not extend class with already instantiated double.'); - } - - if (!$class instanceof ReflectionClass) { - if (!class_exists($class)) { - throw new ClassNotFoundException(sprintf('Class %s not found.', $class), $class); - } - - $class = new ReflectionClass($class); - } - - $this->class = $class; - } - - /** - * Tells doubler to implement specific interface with double. - * - * @param string|ReflectionClass $interface - * - * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException - * @throws \Prophecy\Exception\Doubler\DoubleException - */ - public function addInterface($interface) - { - if (null !== $this->double) { - throw new DoubleException( - 'Can not implement interface with already instantiated double.' - ); - } - - if (!$interface instanceof ReflectionClass) { - if (!interface_exists($interface)) { - throw new InterfaceNotFoundException( - sprintf('Interface %s not found.', $interface), - $interface - ); - } - - $interface = new ReflectionClass($interface); - } - - $this->interfaces[] = $interface; - } - - /** - * Sets constructor arguments. - * - * @param array $arguments - */ - public function setArguments(array $arguments = null) - { - $this->arguments = $arguments; - } - - /** - * Creates double instance or returns already created one. - * - * @return DoubleInterface - */ - public function getInstance() - { - if (null === $this->double) { - if (null !== $this->arguments) { - return $this->double = $this->doubler->double( - $this->class, $this->interfaces, $this->arguments - ); - } - - $this->double = $this->doubler->double($this->class, $this->interfaces); - } - - return $this->double; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php deleted file mode 100644 index d67ec6a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php +++ /dev/null @@ -1,52 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Doubler; - -use ReflectionClass; - -/** - * Name generator. - * Generates classname for double. - * - * @author Konstantin Kudryashov - */ -class NameGenerator -{ - private static $counter = 1; - - /** - * Generates name. - * - * @param ReflectionClass $class - * @param ReflectionClass[] $interfaces - * - * @return string - */ - public function name(ReflectionClass $class = null, array $interfaces) - { - $parts = array(); - - if (null !== $class) { - $parts[] = $class->getName(); - } else { - foreach ($interfaces as $interface) { - $parts[] = $interface->getShortName(); - } - } - - if (!count($parts)) { - $parts[] = 'stdClass'; - } - - return sprintf('Double\%s\P%d', implode('\\', $parts), self::$counter++); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php deleted file mode 100644 index 48ed225..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php +++ /dev/null @@ -1,40 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Call; - -use Prophecy\Exception\Prophecy\ObjectProphecyException; -use Prophecy\Prophecy\ObjectProphecy; - -class UnexpectedCallException extends ObjectProphecyException -{ - private $methodName; - private $arguments; - - public function __construct($message, ObjectProphecy $objectProphecy, - $methodName, array $arguments) - { - parent::__construct($message, $objectProphecy); - - $this->methodName = $methodName; - $this->arguments = $arguments; - } - - public function getMethodName() - { - return $this->methodName; - } - - public function getArguments() - { - return $this->arguments; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php deleted file mode 100644 index 822918a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -use Prophecy\Doubler\Generator\Node\ClassNode; - -class ClassCreatorException extends \RuntimeException implements DoublerException -{ - private $node; - - public function __construct($message, ClassNode $node) - { - parent::__construct($message); - - $this->node = $node; - } - - public function getClassNode() - { - return $this->node; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php deleted file mode 100644 index 8fc53b8..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -use ReflectionClass; - -class ClassMirrorException extends \RuntimeException implements DoublerException -{ - private $class; - - public function __construct($message, ReflectionClass $class) - { - parent::__construct($message); - - $this->class = $class; - } - - public function getReflectedClass() - { - return $this->class; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php deleted file mode 100644 index 5bc826d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php +++ /dev/null @@ -1,33 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -class ClassNotFoundException extends DoubleException -{ - private $classname; - - /** - * @param string $message - * @param string $classname - */ - public function __construct($message, $classname) - { - parent::__construct($message); - - $this->classname = $classname; - } - - public function getClassname() - { - return $this->classname; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php deleted file mode 100644 index 6642a58..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -use RuntimeException; - -class DoubleException extends RuntimeException implements DoublerException -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php deleted file mode 100644 index 9d6be17..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -use Prophecy\Exception\Exception; - -interface DoublerException extends Exception -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php deleted file mode 100644 index e344dea..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -class InterfaceNotFoundException extends ClassNotFoundException -{ - public function getInterfaceName() - { - return $this->getClassname(); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php deleted file mode 100644 index 56f47b1..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php +++ /dev/null @@ -1,41 +0,0 @@ -methodName = $methodName; - $this->className = $className; - } - - - /** - * @return string - */ - public function getMethodName() - { - return $this->methodName; - } - - /** - * @return string - */ - public function getClassName() - { - return $this->className; - } - - } diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php deleted file mode 100644 index a538349..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php +++ /dev/null @@ -1,60 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -class MethodNotFoundException extends DoubleException -{ - /** - * @var string|object - */ - private $classname; - - /** - * @var string - */ - private $methodName; - - /** - * @var array - */ - private $arguments; - - /** - * @param string $message - * @param string|object $classname - * @param string $methodName - * @param null|Argument\ArgumentsWildcard|array $arguments - */ - public function __construct($message, $classname, $methodName, $arguments = null) - { - parent::__construct($message); - - $this->classname = $classname; - $this->methodName = $methodName; - $this->arguments = $arguments; - } - - public function getClassname() - { - return $this->classname; - } - - public function getMethodName() - { - return $this->methodName; - } - - public function getArguments() - { - return $this->arguments; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php deleted file mode 100644 index 6303049..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php +++ /dev/null @@ -1,41 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Doubler; - -class ReturnByReferenceException extends DoubleException -{ - private $classname; - private $methodName; - - /** - * @param string $message - * @param string $classname - * @param string $methodName - */ - public function __construct($message, $classname, $methodName) - { - parent::__construct($message); - - $this->classname = $classname; - $this->methodName = $methodName; - } - - public function getClassname() - { - return $this->classname; - } - - public function getMethodName() - { - return $this->methodName; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php deleted file mode 100644 index ac9fe4d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php +++ /dev/null @@ -1,26 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception; - -/** - * Core Prophecy exception interface. - * All Prophecy exceptions implement it. - * - * @author Konstantin Kudryashov - */ -interface Exception -{ - /** - * @return string - */ - public function getMessage(); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php deleted file mode 100644 index bc91c69..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,16 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception; - -class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php deleted file mode 100644 index a00dfb0..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php +++ /dev/null @@ -1,51 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use Prophecy\Prophecy\ObjectProphecy; - -class AggregateException extends \RuntimeException implements PredictionException -{ - private $exceptions = array(); - private $objectProphecy; - - public function append(PredictionException $exception) - { - $message = $exception->getMessage(); - $message = strtr($message, array("\n" => "\n "))."\n"; - $message = empty($this->exceptions) ? $message : "\n" . $message; - - $this->message = rtrim($this->message.$message); - $this->exceptions[] = $exception; - } - - /** - * @return PredictionException[] - */ - public function getExceptions() - { - return $this->exceptions; - } - - public function setObjectProphecy(ObjectProphecy $objectProphecy) - { - $this->objectProphecy = $objectProphecy; - } - - /** - * @return ObjectProphecy - */ - public function getObjectProphecy() - { - return $this->objectProphecy; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php deleted file mode 100644 index bbbbc3d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php +++ /dev/null @@ -1,24 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use RuntimeException; - -/** - * Basic failed prediction exception. - * Use it for custom prediction failures. - * - * @author Konstantin Kudryashov - */ -class FailedPredictionException extends RuntimeException implements PredictionException -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php deleted file mode 100644 index 05ea4aa..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use Prophecy\Exception\Prophecy\MethodProphecyException; - -class NoCallsException extends MethodProphecyException implements PredictionException -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php deleted file mode 100644 index 2596b1e..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use Prophecy\Exception\Exception; - -interface PredictionException extends Exception -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php deleted file mode 100644 index 9d90543..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php +++ /dev/null @@ -1,31 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use Prophecy\Prophecy\MethodProphecy; - -class UnexpectedCallsCountException extends UnexpectedCallsException -{ - private $expectedCount; - - public function __construct($message, MethodProphecy $methodProphecy, $count, array $calls) - { - parent::__construct($message, $methodProphecy, $calls); - - $this->expectedCount = intval($count); - } - - public function getExpectedCount() - { - return $this->expectedCount; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php deleted file mode 100644 index 7a99c2d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php +++ /dev/null @@ -1,32 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prediction; - -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Exception\Prophecy\MethodProphecyException; - -class UnexpectedCallsException extends MethodProphecyException implements PredictionException -{ - private $calls = array(); - - public function __construct($message, MethodProphecy $methodProphecy, array $calls) - { - parent::__construct($message, $methodProphecy); - - $this->calls = $calls; - } - - public function getCalls() - { - return $this->calls; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php deleted file mode 100644 index 1b03eaf..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php +++ /dev/null @@ -1,34 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prophecy; - -use Prophecy\Prophecy\MethodProphecy; - -class MethodProphecyException extends ObjectProphecyException -{ - private $methodProphecy; - - public function __construct($message, MethodProphecy $methodProphecy) - { - parent::__construct($message, $methodProphecy->getObjectProphecy()); - - $this->methodProphecy = $methodProphecy; - } - - /** - * @return MethodProphecy - */ - public function getMethodProphecy() - { - return $this->methodProphecy; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php deleted file mode 100644 index e345402..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php +++ /dev/null @@ -1,34 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prophecy; - -use Prophecy\Prophecy\ObjectProphecy; - -class ObjectProphecyException extends \RuntimeException implements ProphecyException -{ - private $objectProphecy; - - public function __construct($message, ObjectProphecy $objectProphecy) - { - parent::__construct($message); - - $this->objectProphecy = $objectProphecy; - } - - /** - * @return ObjectProphecy - */ - public function getObjectProphecy() - { - return $this->objectProphecy; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php deleted file mode 100644 index 9157332..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php +++ /dev/null @@ -1,18 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Exception\Prophecy; - -use Prophecy\Exception\Exception; - -interface ProphecyException extends Exception -{ -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php deleted file mode 100644 index 209821c..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php +++ /dev/null @@ -1,69 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\PhpDocumentor; - -use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; -use phpDocumentor\Reflection\DocBlock\Tags\Method; - -/** - * @author ThĆ©o FIDRY - * - * @internal - */ -final class ClassAndInterfaceTagRetriever implements MethodTagRetrieverInterface -{ - private $classRetriever; - - public function __construct(MethodTagRetrieverInterface $classRetriever = null) - { - if (null !== $classRetriever) { - $this->classRetriever = $classRetriever; - - return; - } - - $this->classRetriever = class_exists('phpDocumentor\Reflection\DocBlockFactory') && class_exists('phpDocumentor\Reflection\Types\ContextFactory') - ? new ClassTagRetriever() - : new LegacyClassTagRetriever() - ; - } - - /** - * @param \ReflectionClass $reflectionClass - * - * @return LegacyMethodTag[]|Method[] - */ - public function getTagList(\ReflectionClass $reflectionClass) - { - return array_merge( - $this->classRetriever->getTagList($reflectionClass), - $this->getInterfacesTagList($reflectionClass) - ); - } - - /** - * @param \ReflectionClass $reflectionClass - * - * @return LegacyMethodTag[]|Method[] - */ - private function getInterfacesTagList(\ReflectionClass $reflectionClass) - { - $interfaces = $reflectionClass->getInterfaces(); - $tagList = array(); - - foreach($interfaces as $interface) { - $tagList = array_merge($tagList, $this->classRetriever->getTagList($interface)); - } - - return $tagList; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php deleted file mode 100644 index 9817a44..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php +++ /dev/null @@ -1,60 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\PhpDocumentor; - -use phpDocumentor\Reflection\DocBlock\Tags\Method; -use phpDocumentor\Reflection\DocBlockFactory; -use phpDocumentor\Reflection\Types\ContextFactory; - -/** - * @author ThĆ©o FIDRY - * - * @internal - */ -final class ClassTagRetriever implements MethodTagRetrieverInterface -{ - private $docBlockFactory; - private $contextFactory; - - public function __construct() - { - $this->docBlockFactory = DocBlockFactory::createInstance(); - $this->contextFactory = new ContextFactory(); - } - - /** - * @param \ReflectionClass $reflectionClass - * - * @return Method[] - */ - public function getTagList(\ReflectionClass $reflectionClass) - { - try { - $phpdoc = $this->docBlockFactory->create( - $reflectionClass, - $this->contextFactory->createFromReflector($reflectionClass) - ); - - $methods = array(); - - foreach ($phpdoc->getTagsByName('method') as $tag) { - if ($tag instanceof Method) { - $methods[] = $tag; - } - } - - return $methods; - } catch (\InvalidArgumentException $e) { - return array(); - } - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php deleted file mode 100644 index c0dec3d..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php +++ /dev/null @@ -1,35 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\PhpDocumentor; - -use phpDocumentor\Reflection\DocBlock; -use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; - -/** - * @author ThĆ©o FIDRY - * - * @internal - */ -final class LegacyClassTagRetriever implements MethodTagRetrieverInterface -{ - /** - * @param \ReflectionClass $reflectionClass - * - * @return LegacyMethodTag[] - */ - public function getTagList(\ReflectionClass $reflectionClass) - { - $phpdoc = new DocBlock($reflectionClass->getDocComment()); - - return $phpdoc->getTagsByName('method'); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php deleted file mode 100644 index d3989da..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php +++ /dev/null @@ -1,30 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\PhpDocumentor; - -use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; -use phpDocumentor\Reflection\DocBlock\Tags\Method; - -/** - * @author ThĆ©o FIDRY - * - * @internal - */ -interface MethodTagRetrieverInterface -{ - /** - * @param \ReflectionClass $reflectionClass - * - * @return LegacyMethodTag[]|Method[] - */ - public function getTagList(\ReflectionClass $reflectionClass); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php deleted file mode 100644 index b478736..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php +++ /dev/null @@ -1,86 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prediction; - -use Prophecy\Call\Call; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Argument\ArgumentsWildcard; -use Prophecy\Argument\Token\AnyValuesToken; -use Prophecy\Util\StringUtil; -use Prophecy\Exception\Prediction\NoCallsException; - -/** - * Call prediction. - * - * @author Konstantin Kudryashov - */ -class CallPrediction implements PredictionInterface -{ - private $util; - - /** - * Initializes prediction. - * - * @param StringUtil $util - */ - public function __construct(StringUtil $util = null) - { - $this->util = $util ?: new StringUtil; - } - - /** - * Tests that there was at least one call. - * - * @param Call[] $calls - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @throws \Prophecy\Exception\Prediction\NoCallsException - */ - public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) - { - if (count($calls)) { - return; - } - - $methodCalls = $object->findProphecyMethodCalls( - $method->getMethodName(), - new ArgumentsWildcard(array(new AnyValuesToken)) - ); - - if (count($methodCalls)) { - throw new NoCallsException(sprintf( - "No calls have been made that match:\n". - " %s->%s(%s)\n". - "but expected at least one.\n". - "Recorded `%s(...)` calls:\n%s", - - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard(), - $method->getMethodName(), - $this->util->stringifyCalls($methodCalls) - ), $method); - } - - throw new NoCallsException(sprintf( - "No calls have been made that match:\n". - " %s->%s(%s)\n". - "but expected at least one.", - - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard() - ), $method); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php deleted file mode 100644 index 31c6c57..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php +++ /dev/null @@ -1,107 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prediction; - -use Prophecy\Call\Call; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Argument\ArgumentsWildcard; -use Prophecy\Argument\Token\AnyValuesToken; -use Prophecy\Util\StringUtil; -use Prophecy\Exception\Prediction\UnexpectedCallsCountException; - -/** - * Prediction interface. - * Predictions are logical test blocks, tied to `should...` keyword. - * - * @author Konstantin Kudryashov - */ -class CallTimesPrediction implements PredictionInterface -{ - private $times; - private $util; - - /** - * Initializes prediction. - * - * @param int $times - * @param StringUtil $util - */ - public function __construct($times, StringUtil $util = null) - { - $this->times = intval($times); - $this->util = $util ?: new StringUtil; - } - - /** - * Tests that there was exact amount of calls made. - * - * @param Call[] $calls - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @throws \Prophecy\Exception\Prediction\UnexpectedCallsCountException - */ - public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) - { - if ($this->times == count($calls)) { - return; - } - - $methodCalls = $object->findProphecyMethodCalls( - $method->getMethodName(), - new ArgumentsWildcard(array(new AnyValuesToken)) - ); - - if (count($calls)) { - $message = sprintf( - "Expected exactly %d calls that match:\n". - " %s->%s(%s)\n". - "but %d were made:\n%s", - - $this->times, - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard(), - count($calls), - $this->util->stringifyCalls($calls) - ); - } elseif (count($methodCalls)) { - $message = sprintf( - "Expected exactly %d calls that match:\n". - " %s->%s(%s)\n". - "but none were made.\n". - "Recorded `%s(...)` calls:\n%s", - - $this->times, - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard(), - $method->getMethodName(), - $this->util->stringifyCalls($methodCalls) - ); - } else { - $message = sprintf( - "Expected exactly %d calls that match:\n". - " %s->%s(%s)\n". - "but none were made.", - - $this->times, - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard() - ); - } - - throw new UnexpectedCallsCountException($message, $method, $this->times, $calls); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php deleted file mode 100644 index 44bc782..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php +++ /dev/null @@ -1,65 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prediction; - -use Prophecy\Call\Call; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Exception\InvalidArgumentException; -use Closure; - -/** - * Callback prediction. - * - * @author Konstantin Kudryashov - */ -class CallbackPrediction implements PredictionInterface -{ - private $callback; - - /** - * Initializes callback prediction. - * - * @param callable $callback Custom callback - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function __construct($callback) - { - if (!is_callable($callback)) { - throw new InvalidArgumentException(sprintf( - 'Callable expected as an argument to CallbackPrediction, but got %s.', - gettype($callback) - )); - } - - $this->callback = $callback; - } - - /** - * Executes preset callback. - * - * @param Call[] $calls - * @param ObjectProphecy $object - * @param MethodProphecy $method - */ - public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) - { - $callback = $this->callback; - - if ($callback instanceof Closure && method_exists('Closure', 'bind')) { - $callback = Closure::bind($callback, $object); - } - - call_user_func($callback, $calls, $object, $method); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php deleted file mode 100644 index 46ac5bf..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php +++ /dev/null @@ -1,68 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prediction; - -use Prophecy\Call\Call; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Util\StringUtil; -use Prophecy\Exception\Prediction\UnexpectedCallsException; - -/** - * No calls prediction. - * - * @author Konstantin Kudryashov - */ -class NoCallsPrediction implements PredictionInterface -{ - private $util; - - /** - * Initializes prediction. - * - * @param null|StringUtil $util - */ - public function __construct(StringUtil $util = null) - { - $this->util = $util ?: new StringUtil; - } - - /** - * Tests that there were no calls made. - * - * @param Call[] $calls - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @throws \Prophecy\Exception\Prediction\UnexpectedCallsException - */ - public function check(array $calls, ObjectProphecy $object, MethodProphecy $method) - { - if (!count($calls)) { - return; - } - - $verb = count($calls) === 1 ? 'was' : 'were'; - - throw new UnexpectedCallsException(sprintf( - "No calls expected that match:\n". - " %s->%s(%s)\n". - "but %d %s made:\n%s", - get_class($object->reveal()), - $method->getMethodName(), - $method->getArgumentsWildcard(), - count($calls), - $verb, - $this->util->stringifyCalls($calls) - ), $method, $calls); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php deleted file mode 100644 index f7fb06a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php +++ /dev/null @@ -1,37 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prediction; - -use Prophecy\Call\Call; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; - -/** - * Prediction interface. - * Predictions are logical test blocks, tied to `should...` keyword. - * - * @author Konstantin Kudryashov - */ -interface PredictionInterface -{ - /** - * Tests that double fulfilled prediction. - * - * @param Call[] $calls - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @throws object - * @return void - */ - public function check(array $calls, ObjectProphecy $object, MethodProphecy $method); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php deleted file mode 100644 index 5f406bf..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php +++ /dev/null @@ -1,66 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Promise; - -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Exception\InvalidArgumentException; -use Closure; - -/** - * Callback promise. - * - * @author Konstantin Kudryashov - */ -class CallbackPromise implements PromiseInterface -{ - private $callback; - - /** - * Initializes callback promise. - * - * @param callable $callback Custom callback - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function __construct($callback) - { - if (!is_callable($callback)) { - throw new InvalidArgumentException(sprintf( - 'Callable expected as an argument to CallbackPromise, but got %s.', - gettype($callback) - )); - } - - $this->callback = $callback; - } - - /** - * Evaluates promise callback. - * - * @param array $args - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @return mixed - */ - public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) - { - $callback = $this->callback; - - if ($callback instanceof Closure && method_exists('Closure', 'bind')) { - $callback = Closure::bind($callback, $object); - } - - return call_user_func($callback, $args, $object, $method); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php deleted file mode 100644 index 382537b..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php +++ /dev/null @@ -1,35 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Promise; - -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; - -/** - * Promise interface. - * Promises are logical blocks, tied to `will...` keyword. - * - * @author Konstantin Kudryashov - */ -interface PromiseInterface -{ - /** - * Evaluates promise. - * - * @param array $args - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @return mixed - */ - public function execute(array $args, ObjectProphecy $object, MethodProphecy $method); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php deleted file mode 100644 index 39bfeea..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php +++ /dev/null @@ -1,61 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Promise; - -use Prophecy\Exception\InvalidArgumentException; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; - -/** - * Return argument promise. - * - * @author Konstantin Kudryashov - */ -class ReturnArgumentPromise implements PromiseInterface -{ - /** - * @var int - */ - private $index; - - /** - * Initializes callback promise. - * - * @param int $index The zero-indexed number of the argument to return - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function __construct($index = 0) - { - if (!is_int($index) || $index < 0) { - throw new InvalidArgumentException(sprintf( - 'Zero-based index expected as argument to ReturnArgumentPromise, but got %s.', - $index - )); - } - $this->index = $index; - } - - /** - * Returns nth argument if has one, null otherwise. - * - * @param array $args - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @return null|mixed - */ - public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) - { - return count($args) > $this->index ? $args[$this->index] : null; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php deleted file mode 100644 index c7d5ac5..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php +++ /dev/null @@ -1,55 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Promise; - -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; - -/** - * Return promise. - * - * @author Konstantin Kudryashov - */ -class ReturnPromise implements PromiseInterface -{ - private $returnValues = array(); - - /** - * Initializes promise. - * - * @param array $returnValues Array of values - */ - public function __construct(array $returnValues) - { - $this->returnValues = $returnValues; - } - - /** - * Returns saved values one by one until last one, then continuously returns last value. - * - * @param array $args - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @return mixed - */ - public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) - { - $value = array_shift($this->returnValues); - - if (!count($this->returnValues)) { - $this->returnValues[] = $value; - } - - return $value; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php deleted file mode 100644 index 26ec19e..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php +++ /dev/null @@ -1,100 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Promise; - -use Doctrine\Instantiator\Instantiator; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Exception\InvalidArgumentException; -use ReflectionClass; - -/** - * Throw promise. - * - * @author Konstantin Kudryashov - */ -class ThrowPromise implements PromiseInterface -{ - private $exception; - - /** - * @var \Doctrine\Instantiator\Instantiator - */ - private $instantiator; - - /** - * Initializes promise. - * - * @param string|\Exception|\Throwable $exception Exception class name or instance - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function __construct($exception) - { - if (is_string($exception)) { - if ((!class_exists($exception) && !interface_exists($exception)) || !$this->isAValidThrowable($exception)) { - throw new InvalidArgumentException(sprintf( - 'Exception / Throwable class or instance expected as argument to ThrowPromise, but got %s.', - $exception - )); - } - } elseif (!$exception instanceof \Exception && !$exception instanceof \Throwable) { - throw new InvalidArgumentException(sprintf( - 'Exception / Throwable class or instance expected as argument to ThrowPromise, but got %s.', - is_object($exception) ? get_class($exception) : gettype($exception) - )); - } - - $this->exception = $exception; - } - - /** - * Throws predefined exception. - * - * @param array $args - * @param ObjectProphecy $object - * @param MethodProphecy $method - * - * @throws object - */ - public function execute(array $args, ObjectProphecy $object, MethodProphecy $method) - { - if (is_string($this->exception)) { - $classname = $this->exception; - $reflection = new ReflectionClass($classname); - $constructor = $reflection->getConstructor(); - - if ($constructor->isPublic() && 0 == $constructor->getNumberOfRequiredParameters()) { - throw $reflection->newInstance(); - } - - if (!$this->instantiator) { - $this->instantiator = new Instantiator(); - } - - throw $this->instantiator->instantiate($classname); - } - - throw $this->exception; - } - - /** - * @param string $exception - * - * @return bool - */ - private function isAValidThrowable($exception) - { - return is_a($exception, 'Exception', true) - || is_a($exception, 'Throwable', true); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php deleted file mode 100644 index a2f5073..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php +++ /dev/null @@ -1,565 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -use Prophecy\Argument; -use Prophecy\Prophet; -use Prophecy\Promise; -use Prophecy\Prediction; -use Prophecy\Exception\Doubler\MethodNotFoundException; -use Prophecy\Exception\InvalidArgumentException; -use Prophecy\Exception\Prophecy\MethodProphecyException; -use ReflectionNamedType; -use ReflectionType; -use ReflectionUnionType; - -/** - * Method prophecy. - * - * @author Konstantin Kudryashov - */ -class MethodProphecy -{ - private $objectProphecy; - private $methodName; - private $argumentsWildcard; - private $promise; - private $prediction; - private $checkedPredictions = array(); - private $bound = false; - private $voidReturnType = false; - - /** - * Initializes method prophecy. - * - * @param ObjectProphecy $objectProphecy - * @param string $methodName - * @param null|Argument\ArgumentsWildcard|array $arguments - * - * @throws \Prophecy\Exception\Doubler\MethodNotFoundException If method not found - */ - public function __construct(ObjectProphecy $objectProphecy, $methodName, $arguments = null) - { - $double = $objectProphecy->reveal(); - if (!method_exists($double, $methodName)) { - throw new MethodNotFoundException(sprintf( - 'Method `%s::%s()` is not defined.', get_class($double), $methodName - ), get_class($double), $methodName, $arguments); - } - - $this->objectProphecy = $objectProphecy; - $this->methodName = $methodName; - - $reflectedMethod = new \ReflectionMethod($double, $methodName); - if ($reflectedMethod->isFinal()) { - throw new MethodProphecyException(sprintf( - "Can not add prophecy for a method `%s::%s()`\n". - "as it is a final method.", - get_class($double), - $methodName - ), $this); - } - - if (null !== $arguments) { - $this->withArguments($arguments); - } - - if (true === $reflectedMethod->hasReturnType()) { - - $reflectionType = $reflectedMethod->getReturnType(); - - if ($reflectionType instanceof ReflectionNamedType) { - $types = [$reflectionType]; - } - elseif ($reflectionType instanceof ReflectionUnionType) { - $types = $reflectionType->getTypes(); - } - - $types = array_map( - function(ReflectionType $type) { return $type->getName(); }, - $types - ); - - usort( - $types, - static function(string $type1, string $type2) { - - // null is lowest priority - if ($type2 == 'null') { - return -1; - } - elseif ($type1 == 'null') { - return 1; - } - - // objects are higher priority than scalars - $isObject = static function($type) { - return class_exists($type) || interface_exists($type); - }; - - if($isObject($type1) && !$isObject($type2)) { - return -1; - } - elseif(!$isObject($type1) && $isObject($type2)) - { - return 1; - } - - // don't sort both-scalars or both-objects - return 0; - } - ); - - $defaultType = $types[0]; - - if ('void' === $defaultType) { - $this->voidReturnType = true; - } - - $this->will(function () use ($defaultType) { - switch ($defaultType) { - case 'void': return; - case 'string': return ''; - case 'float': return 0.0; - case 'int': return 0; - case 'bool': return false; - case 'array': return array(); - - case 'callable': - case 'Closure': - return function () {}; - - case 'Traversable': - case 'Generator': - return (function () { yield; })(); - - default: - $prophet = new Prophet; - return $prophet->prophesize($defaultType)->reveal(); - } - }); - } - } - - /** - * Sets argument wildcard. - * - * @param array|Argument\ArgumentsWildcard $arguments - * - * @return $this - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function withArguments($arguments) - { - if (is_array($arguments)) { - $arguments = new Argument\ArgumentsWildcard($arguments); - } - - if (!$arguments instanceof Argument\ArgumentsWildcard) { - throw new InvalidArgumentException(sprintf( - "Either an array or an instance of ArgumentsWildcard expected as\n". - 'a `MethodProphecy::withArguments()` argument, but got %s.', - gettype($arguments) - )); - } - - $this->argumentsWildcard = $arguments; - - return $this; - } - - /** - * Sets custom promise to the prophecy. - * - * @param callable|Promise\PromiseInterface $promise - * - * @return $this - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function will($promise) - { - if (is_callable($promise)) { - $promise = new Promise\CallbackPromise($promise); - } - - if (!$promise instanceof Promise\PromiseInterface) { - throw new InvalidArgumentException(sprintf( - 'Expected callable or instance of PromiseInterface, but got %s.', - gettype($promise) - )); - } - - $this->bindToObjectProphecy(); - $this->promise = $promise; - - return $this; - } - - /** - * Sets return promise to the prophecy. - * - * @see \Prophecy\Promise\ReturnPromise - * - * @return $this - */ - public function willReturn() - { - if ($this->voidReturnType) { - throw new MethodProphecyException( - "The method \"$this->methodName\" has a void return type, and so cannot return anything", - $this - ); - } - - return $this->will(new Promise\ReturnPromise(func_get_args())); - } - - /** - * @param array $items - * - * @return $this - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function willYield($items) - { - if ($this->voidReturnType) { - throw new MethodProphecyException( - "The method \"$this->methodName\" has a void return type, and so cannot yield anything", - $this - ); - } - - if (!is_array($items)) { - throw new InvalidArgumentException(sprintf( - 'Expected array, but got %s.', - gettype($items) - )); - } - - $generator = function() use ($items) { - foreach ($items as $key => $value) { - yield $key => $value; - } - }; - - return $this->will($generator); - } - - /** - * Sets return argument promise to the prophecy. - * - * @param int $index The zero-indexed number of the argument to return - * - * @see \Prophecy\Promise\ReturnArgumentPromise - * - * @return $this - */ - public function willReturnArgument($index = 0) - { - if ($this->voidReturnType) { - throw new MethodProphecyException("The method \"$this->methodName\" has a void return type", $this); - } - - return $this->will(new Promise\ReturnArgumentPromise($index)); - } - - /** - * Sets throw promise to the prophecy. - * - * @see \Prophecy\Promise\ThrowPromise - * - * @param string|\Exception $exception Exception class or instance - * - * @return $this - */ - public function willThrow($exception) - { - return $this->will(new Promise\ThrowPromise($exception)); - } - - /** - * Sets custom prediction to the prophecy. - * - * @param callable|Prediction\PredictionInterface $prediction - * - * @return $this - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function should($prediction) - { - if (is_callable($prediction)) { - $prediction = new Prediction\CallbackPrediction($prediction); - } - - if (!$prediction instanceof Prediction\PredictionInterface) { - throw new InvalidArgumentException(sprintf( - 'Expected callable or instance of PredictionInterface, but got %s.', - gettype($prediction) - )); - } - - $this->bindToObjectProphecy(); - $this->prediction = $prediction; - - return $this; - } - - /** - * Sets call prediction to the prophecy. - * - * @see \Prophecy\Prediction\CallPrediction - * - * @return $this - */ - public function shouldBeCalled() - { - return $this->should(new Prediction\CallPrediction); - } - - /** - * Sets no calls prediction to the prophecy. - * - * @see \Prophecy\Prediction\NoCallsPrediction - * - * @return $this - */ - public function shouldNotBeCalled() - { - return $this->should(new Prediction\NoCallsPrediction); - } - - /** - * Sets call times prediction to the prophecy. - * - * @see \Prophecy\Prediction\CallTimesPrediction - * - * @param $count - * - * @return $this - */ - public function shouldBeCalledTimes($count) - { - return $this->should(new Prediction\CallTimesPrediction($count)); - } - - /** - * Sets call times prediction to the prophecy. - * - * @see \Prophecy\Prediction\CallTimesPrediction - * - * @return $this - */ - public function shouldBeCalledOnce() - { - return $this->shouldBeCalledTimes(1); - } - - /** - * Checks provided prediction immediately. - * - * @param callable|Prediction\PredictionInterface $prediction - * - * @return $this - * - * @throws \Prophecy\Exception\InvalidArgumentException - */ - public function shouldHave($prediction) - { - if (is_callable($prediction)) { - $prediction = new Prediction\CallbackPrediction($prediction); - } - - if (!$prediction instanceof Prediction\PredictionInterface) { - throw new InvalidArgumentException(sprintf( - 'Expected callable or instance of PredictionInterface, but got %s.', - gettype($prediction) - )); - } - - if (null === $this->promise && !$this->voidReturnType) { - $this->willReturn(); - } - - $calls = $this->getObjectProphecy()->findProphecyMethodCalls( - $this->getMethodName(), - $this->getArgumentsWildcard() - ); - - try { - $prediction->check($calls, $this->getObjectProphecy(), $this); - $this->checkedPredictions[] = $prediction; - } catch (\Exception $e) { - $this->checkedPredictions[] = $prediction; - - throw $e; - } - - return $this; - } - - /** - * Checks call prediction. - * - * @see \Prophecy\Prediction\CallPrediction - * - * @return $this - */ - public function shouldHaveBeenCalled() - { - return $this->shouldHave(new Prediction\CallPrediction); - } - - /** - * Checks no calls prediction. - * - * @see \Prophecy\Prediction\NoCallsPrediction - * - * @return $this - */ - public function shouldNotHaveBeenCalled() - { - return $this->shouldHave(new Prediction\NoCallsPrediction); - } - - /** - * Checks no calls prediction. - * - * @see \Prophecy\Prediction\NoCallsPrediction - * @deprecated - * - * @return $this - */ - public function shouldNotBeenCalled() - { - return $this->shouldNotHaveBeenCalled(); - } - - /** - * Checks call times prediction. - * - * @see \Prophecy\Prediction\CallTimesPrediction - * - * @param int $count - * - * @return $this - */ - public function shouldHaveBeenCalledTimes($count) - { - return $this->shouldHave(new Prediction\CallTimesPrediction($count)); - } - - /** - * Checks call times prediction. - * - * @see \Prophecy\Prediction\CallTimesPrediction - * - * @return $this - */ - public function shouldHaveBeenCalledOnce() - { - return $this->shouldHaveBeenCalledTimes(1); - } - - /** - * Checks currently registered [with should(...)] prediction. - */ - public function checkPrediction() - { - if (null === $this->prediction) { - return; - } - - $this->shouldHave($this->prediction); - } - - /** - * Returns currently registered promise. - * - * @return null|Promise\PromiseInterface - */ - public function getPromise() - { - return $this->promise; - } - - /** - * Returns currently registered prediction. - * - * @return null|Prediction\PredictionInterface - */ - public function getPrediction() - { - return $this->prediction; - } - - /** - * Returns predictions that were checked on this object. - * - * @return Prediction\PredictionInterface[] - */ - public function getCheckedPredictions() - { - return $this->checkedPredictions; - } - - /** - * Returns object prophecy this method prophecy is tied to. - * - * @return ObjectProphecy - */ - public function getObjectProphecy() - { - return $this->objectProphecy; - } - - /** - * Returns method name. - * - * @return string - */ - public function getMethodName() - { - return $this->methodName; - } - - /** - * Returns arguments wildcard. - * - * @return Argument\ArgumentsWildcard - */ - public function getArgumentsWildcard() - { - return $this->argumentsWildcard; - } - - /** - * @return bool - */ - public function hasReturnVoid() - { - return $this->voidReturnType; - } - - private function bindToObjectProphecy() - { - if ($this->bound) { - return; - } - - $this->getObjectProphecy()->addMethodProphecy($this); - $this->bound = true; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php deleted file mode 100644 index 11b87cf..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php +++ /dev/null @@ -1,286 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -use SebastianBergmann\Comparator\ComparisonFailure; -use Prophecy\Comparator\Factory as ComparatorFactory; -use Prophecy\Call\Call; -use Prophecy\Doubler\LazyDouble; -use Prophecy\Argument\ArgumentsWildcard; -use Prophecy\Call\CallCenter; -use Prophecy\Exception\Prophecy\ObjectProphecyException; -use Prophecy\Exception\Prophecy\MethodProphecyException; -use Prophecy\Exception\Prediction\AggregateException; -use Prophecy\Exception\Prediction\PredictionException; - -/** - * Object prophecy. - * - * @author Konstantin Kudryashov - */ -class ObjectProphecy implements ProphecyInterface -{ - private $lazyDouble; - private $callCenter; - private $revealer; - private $comparatorFactory; - - /** - * @var MethodProphecy[][] - */ - private $methodProphecies = array(); - - /** - * Initializes object prophecy. - * - * @param LazyDouble $lazyDouble - * @param CallCenter $callCenter - * @param RevealerInterface $revealer - * @param ComparatorFactory $comparatorFactory - */ - public function __construct( - LazyDouble $lazyDouble, - CallCenter $callCenter = null, - RevealerInterface $revealer = null, - ComparatorFactory $comparatorFactory = null - ) { - $this->lazyDouble = $lazyDouble; - $this->callCenter = $callCenter ?: new CallCenter; - $this->revealer = $revealer ?: new Revealer; - - $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance(); - } - - /** - * Forces double to extend specific class. - * - * @param string $class - * - * @return $this - */ - public function willExtend($class) - { - $this->lazyDouble->setParentClass($class); - - return $this; - } - - /** - * Forces double to implement specific interface. - * - * @param string $interface - * - * @return $this - */ - public function willImplement($interface) - { - $this->lazyDouble->addInterface($interface); - - return $this; - } - - /** - * Sets constructor arguments. - * - * @param array $arguments - * - * @return $this - */ - public function willBeConstructedWith(array $arguments = null) - { - $this->lazyDouble->setArguments($arguments); - - return $this; - } - - /** - * Reveals double. - * - * @return object - * - * @throws \Prophecy\Exception\Prophecy\ObjectProphecyException If double doesn't implement needed interface - */ - public function reveal() - { - $double = $this->lazyDouble->getInstance(); - - if (null === $double || !$double instanceof ProphecySubjectInterface) { - throw new ObjectProphecyException( - "Generated double must implement ProphecySubjectInterface, but it does not.\n". - 'It seems you have wrongly configured doubler without required ClassPatch.', - $this - ); - } - - $double->setProphecy($this); - - return $double; - } - - /** - * Adds method prophecy to object prophecy. - * - * @param MethodProphecy $methodProphecy - * - * @throws \Prophecy\Exception\Prophecy\MethodProphecyException If method prophecy doesn't - * have arguments wildcard - */ - public function addMethodProphecy(MethodProphecy $methodProphecy) - { - $argumentsWildcard = $methodProphecy->getArgumentsWildcard(); - if (null === $argumentsWildcard) { - throw new MethodProphecyException(sprintf( - "Can not add prophecy for a method `%s::%s()`\n". - "as you did not specify arguments wildcard for it.", - get_class($this->reveal()), - $methodProphecy->getMethodName() - ), $methodProphecy); - } - - $methodName = strtolower($methodProphecy->getMethodName()); - - if (!isset($this->methodProphecies[$methodName])) { - $this->methodProphecies[$methodName] = array(); - } - - $this->methodProphecies[$methodName][] = $methodProphecy; - } - - /** - * Returns either all or related to single method prophecies. - * - * @param null|string $methodName - * - * @return MethodProphecy[] - */ - public function getMethodProphecies($methodName = null) - { - if (null === $methodName) { - return $this->methodProphecies; - } - - $methodName = strtolower($methodName); - - if (!isset($this->methodProphecies[$methodName])) { - return array(); - } - - return $this->methodProphecies[$methodName]; - } - - /** - * Makes specific method call. - * - * @param string $methodName - * @param array $arguments - * - * @return mixed - */ - public function makeProphecyMethodCall($methodName, array $arguments) - { - $arguments = $this->revealer->reveal($arguments); - $return = $this->callCenter->makeCall($this, $methodName, $arguments); - - return $this->revealer->reveal($return); - } - - /** - * Finds calls by method name & arguments wildcard. - * - * @param string $methodName - * @param ArgumentsWildcard $wildcard - * - * @return Call[] - */ - public function findProphecyMethodCalls($methodName, ArgumentsWildcard $wildcard) - { - return $this->callCenter->findCalls($methodName, $wildcard); - } - - /** - * Checks that registered method predictions do not fail. - * - * @throws \Prophecy\Exception\Prediction\AggregateException If any of registered predictions fail - * @throws \Prophecy\Exception\Call\UnexpectedCallException - */ - public function checkProphecyMethodsPredictions() - { - $exception = new AggregateException(sprintf("%s:\n", get_class($this->reveal()))); - $exception->setObjectProphecy($this); - - $this->callCenter->checkUnexpectedCalls(); - - foreach ($this->methodProphecies as $prophecies) { - foreach ($prophecies as $prophecy) { - try { - $prophecy->checkPrediction(); - } catch (PredictionException $e) { - $exception->append($e); - } - } - } - - if (count($exception->getExceptions())) { - throw $exception; - } - } - - /** - * Creates new method prophecy using specified method name and arguments. - * - * @param string $methodName - * @param array $arguments - * - * @return MethodProphecy - */ - public function __call($methodName, array $arguments) - { - $arguments = new ArgumentsWildcard($this->revealer->reveal($arguments)); - - foreach ($this->getMethodProphecies($methodName) as $prophecy) { - $argumentsWildcard = $prophecy->getArgumentsWildcard(); - $comparator = $this->comparatorFactory->getComparatorFor( - $argumentsWildcard, $arguments - ); - - try { - $comparator->assertEquals($argumentsWildcard, $arguments); - return $prophecy; - } catch (ComparisonFailure $failure) {} - } - - return new MethodProphecy($this, $methodName, $arguments); - } - - /** - * Tries to get property value from double. - * - * @param string $name - * - * @return mixed - */ - public function __get($name) - { - return $this->reveal()->$name; - } - - /** - * Tries to set property value to double. - * - * @param string $name - * @param mixed $value - */ - public function __set($name, $value) - { - $this->reveal()->$name = $this->revealer->reveal($value); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php deleted file mode 100644 index 462f15a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -/** - * Core Prophecy interface. - * - * @author Konstantin Kudryashov - */ -interface ProphecyInterface -{ - /** - * Reveals prophecy object (double) . - * - * @return object - */ - public function reveal(); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php deleted file mode 100644 index 2d83958..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php +++ /dev/null @@ -1,34 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -/** - * Controllable doubles interface. - * - * @author Konstantin Kudryashov - */ -interface ProphecySubjectInterface -{ - /** - * Sets subject prophecy. - * - * @param ProphecyInterface $prophecy - */ - public function setProphecy(ProphecyInterface $prophecy); - - /** - * Returns subject prophecy. - * - * @return ProphecyInterface - */ - public function getProphecy(); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php deleted file mode 100644 index 60ecdac..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php +++ /dev/null @@ -1,44 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -/** - * Basic prophecies revealer. - * - * @author Konstantin Kudryashov - */ -class Revealer implements RevealerInterface -{ - /** - * Unwraps value(s). - * - * @param mixed $value - * - * @return mixed - */ - public function reveal($value) - { - if (is_array($value)) { - return array_map(array($this, __FUNCTION__), $value); - } - - if (!is_object($value)) { - return $value; - } - - if ($value instanceof ProphecyInterface) { - $value = $value->reveal(); - } - - return $value; - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php deleted file mode 100644 index ffc82bb..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Prophecy; - -/** - * Prophecies revealer interface. - * - * @author Konstantin Kudryashov - */ -interface RevealerInterface -{ - /** - * Unwraps value(s). - * - * @param mixed $value - * - * @return mixed - */ - public function reveal($value); -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophet.php b/vendor/phpspec/prophecy/src/Prophecy/Prophet.php deleted file mode 100644 index d37c92a..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophet.php +++ /dev/null @@ -1,138 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy; - -use Prophecy\Doubler\CachedDoubler; -use Prophecy\Doubler\Doubler; -use Prophecy\Doubler\LazyDouble; -use Prophecy\Doubler\ClassPatch; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophecy\RevealerInterface; -use Prophecy\Prophecy\Revealer; -use Prophecy\Call\CallCenter; -use Prophecy\Util\StringUtil; -use Prophecy\Exception\Prediction\PredictionException; -use Prophecy\Exception\Prediction\AggregateException; - -/** - * Prophet creates prophecies. - * - * @author Konstantin Kudryashov - */ -class Prophet -{ - private $doubler; - private $revealer; - private $util; - - /** - * @var ObjectProphecy[] - */ - private $prophecies = array(); - - /** - * Initializes Prophet. - * - * @param null|Doubler $doubler - * @param null|RevealerInterface $revealer - * @param null|StringUtil $util - */ - public function __construct( - Doubler $doubler = null, - RevealerInterface $revealer = null, - StringUtil $util = null - ) { - if (null === $doubler) { - $doubler = new CachedDoubler(); - $doubler->registerClassPatch(new ClassPatch\SplFileInfoPatch); - $doubler->registerClassPatch(new ClassPatch\TraversablePatch); - $doubler->registerClassPatch(new ClassPatch\ThrowablePatch); - $doubler->registerClassPatch(new ClassPatch\DisableConstructorPatch); - $doubler->registerClassPatch(new ClassPatch\ProphecySubjectPatch); - $doubler->registerClassPatch(new ClassPatch\ReflectionClassNewInstancePatch); - $doubler->registerClassPatch(new ClassPatch\HhvmExceptionPatch()); - $doubler->registerClassPatch(new ClassPatch\MagicCallPatch); - $doubler->registerClassPatch(new ClassPatch\KeywordPatch); - } - - $this->doubler = $doubler; - $this->revealer = $revealer ?: new Revealer; - $this->util = $util ?: new StringUtil; - } - - /** - * Creates new object prophecy. - * - * @param null|string $classOrInterface Class or interface name - * - * @return ObjectProphecy - */ - public function prophesize($classOrInterface = null) - { - $this->prophecies[] = $prophecy = new ObjectProphecy( - new LazyDouble($this->doubler), - new CallCenter($this->util), - $this->revealer - ); - - if ($classOrInterface && class_exists($classOrInterface)) { - return $prophecy->willExtend($classOrInterface); - } - - if ($classOrInterface && interface_exists($classOrInterface)) { - return $prophecy->willImplement($classOrInterface); - } - - return $prophecy; - } - - /** - * Returns all created object prophecies. - * - * @return ObjectProphecy[] - */ - public function getProphecies() - { - return $this->prophecies; - } - - /** - * Returns Doubler instance assigned to this Prophet. - * - * @return Doubler - */ - public function getDoubler() - { - return $this->doubler; - } - - /** - * Checks all predictions defined by prophecies of this Prophet. - * - * @throws Exception\Prediction\AggregateException If any prediction fails - */ - public function checkPredictions() - { - $exception = new AggregateException("Some predictions failed:\n"); - foreach ($this->prophecies as $prophecy) { - try { - $prophecy->checkProphecyMethodsPredictions(); - } catch (PredictionException $e) { - $exception->append($e); - } - } - - if (count($exception->getExceptions())) { - throw $exception; - } - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php b/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php deleted file mode 100644 index 1090a80..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php +++ /dev/null @@ -1,210 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * This class is a modification from sebastianbergmann/exporter - * @see https://github.com/sebastianbergmann/exporter - */ -class ExportUtil -{ - /** - * Exports a value as a string - * - * The output of this method is similar to the output of print_r(), but - * improved in various aspects: - * - * - NULL is rendered as "null" (instead of "") - * - TRUE is rendered as "true" (instead of "1") - * - FALSE is rendered as "false" (instead of "") - * - Strings are always quoted with single quotes - * - Carriage returns and newlines are normalized to \n - * - Recursion and repeated rendering is treated properly - * - * @param mixed $value - * @param int $indentation The indentation level of the 2nd+ line - * @return string - */ - public static function export($value, $indentation = 0) - { - return self::recursiveExport($value, $indentation); - } - - /** - * Converts an object to an array containing all of its private, protected - * and public properties. - * - * @param mixed $value - * @return array - */ - public static function toArray($value) - { - if (!is_object($value)) { - return (array) $value; - } - - $array = array(); - - foreach ((array) $value as $key => $val) { - // properties are transformed to keys in the following way: - // private $property => "\0Classname\0property" - // protected $property => "\0*\0property" - // public $property => "property" - if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) { - $key = $matches[1]; - } - - // See https://github.com/php/php-src/commit/5721132 - if ($key === "\0gcdata") { - continue; - } - - $array[$key] = $val; - } - - // Some internal classes like SplObjectStorage don't work with the - // above (fast) mechanism nor with reflection in Zend. - // Format the output similarly to print_r() in this case - if ($value instanceof \SplObjectStorage) { - // However, the fast method does work in HHVM, and exposes the - // internal implementation. Hide it again. - if (property_exists('\SplObjectStorage', '__storage')) { - unset($array['__storage']); - } elseif (property_exists('\SplObjectStorage', 'storage')) { - unset($array['storage']); - } - - if (property_exists('\SplObjectStorage', '__key')) { - unset($array['__key']); - } - - foreach ($value as $key => $val) { - $array[spl_object_hash($val)] = array( - 'obj' => $val, - 'inf' => $value->getInfo(), - ); - } - } - - return $array; - } - - /** - * Recursive implementation of export - * - * @param mixed $value The value to export - * @param int $indentation The indentation level of the 2nd+ line - * @param \SebastianBergmann\RecursionContext\Context $processed Previously processed objects - * @return string - * @see SebastianBergmann\Exporter\Exporter::export - */ - protected static function recursiveExport(&$value, $indentation, $processed = null) - { - if ($value === null) { - return 'null'; - } - - if ($value === true) { - return 'true'; - } - - if ($value === false) { - return 'false'; - } - - if (is_float($value) && floatval(intval($value)) === $value) { - return "$value.0"; - } - - if (is_resource($value)) { - return sprintf( - 'resource(%d) of type (%s)', - $value, - get_resource_type($value) - ); - } - - if (is_string($value)) { - // Match for most non printable chars somewhat taking multibyte chars into account - if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) { - return 'Binary String: 0x' . bin2hex($value); - } - - return "'" . - str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) . - "'"; - } - - $whitespace = str_repeat(' ', 4 * $indentation); - - if (!$processed) { - $processed = new Context; - } - - if (is_array($value)) { - if (($key = $processed->contains($value)) !== false) { - return 'Array &' . $key; - } - - $array = $value; - $key = $processed->add($value); - $values = ''; - - if (count($array) > 0) { - foreach ($array as $k => $v) { - $values .= sprintf( - '%s %s => %s' . "\n", - $whitespace, - self::recursiveExport($k, $indentation), - self::recursiveExport($value[$k], $indentation + 1, $processed) - ); - } - - $values = "\n" . $values . $whitespace; - } - - return sprintf('Array &%s (%s)', $key, $values); - } - - if (is_object($value)) { - $class = get_class($value); - - if ($hash = $processed->contains($value)) { - return sprintf('%s:%s Object', $class, $hash); - } - - $hash = $processed->add($value); - $values = ''; - $array = self::toArray($value); - - if (count($array) > 0) { - foreach ($array as $k => $v) { - $values .= sprintf( - '%s %s => %s' . "\n", - $whitespace, - self::recursiveExport($k, $indentation), - self::recursiveExport($v, $indentation + 1, $processed) - ); - } - - $values = "\n" . $values . $whitespace; - } - - return sprintf('%s:%s Object (%s)', $class, $hash, $values); - } - - return var_export($value, true); - } -} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php b/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php deleted file mode 100644 index ba4faff..0000000 --- a/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php +++ /dev/null @@ -1,99 +0,0 @@ - - * Marcello Duarte - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Prophecy\Util; - -use Prophecy\Call\Call; - -/** - * String utility. - * - * @author Konstantin Kudryashov - */ -class StringUtil -{ - private $verbose; - - /** - * @param bool $verbose - */ - public function __construct($verbose = true) - { - $this->verbose = $verbose; - } - - /** - * Stringifies any provided value. - * - * @param mixed $value - * @param boolean $exportObject - * - * @return string - */ - public function stringify($value, $exportObject = true) - { - if (is_array($value)) { - if (range(0, count($value) - 1) === array_keys($value)) { - return '['.implode(', ', array_map(array($this, __FUNCTION__), $value)).']'; - } - - $stringify = array($this, __FUNCTION__); - - return '['.implode(', ', array_map(function ($item, $key) use ($stringify) { - return (is_integer($key) ? $key : '"'.$key.'"'). - ' => '.call_user_func($stringify, $item); - }, $value, array_keys($value))).']'; - } - if (is_resource($value)) { - return get_resource_type($value).':'.$value; - } - if (is_object($value)) { - return $exportObject ? ExportUtil::export($value) : sprintf('%s:%s', get_class($value), spl_object_hash($value)); - } - if (true === $value || false === $value) { - return $value ? 'true' : 'false'; - } - if (is_string($value)) { - $str = sprintf('"%s"', str_replace("\n", '\\n', $value)); - - if (!$this->verbose && 50 <= strlen($str)) { - return substr($str, 0, 50).'"...'; - } - - return $str; - } - if (null === $value) { - return 'null'; - } - - return (string) $value; - } - - /** - * Stringifies provided array of calls. - * - * @param Call[] $calls Array of Call instances - * - * @return string - */ - public function stringifyCalls(array $calls) - { - $self = $this; - - return implode(PHP_EOL, array_map(function (Call $call) use ($self) { - return sprintf(' - %s(%s) @ %s', - $call->getMethodName(), - implode(', ', array_map(array($self, 'stringify'), $call->getArguments())), - str_replace(GETCWD().DIRECTORY_SEPARATOR, '', $call->getCallPlace()) - ); - }, $calls)); - } -} diff --git a/vendor/phpunit/php-code-coverage/.gitattributes b/vendor/phpunit/php-code-coverage/.gitattributes deleted file mode 100644 index 34d242b..0000000 --- a/vendor/phpunit/php-code-coverage/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -/tools export-ignore - -*.php diff=php diff --git a/vendor/phpunit/php-code-coverage/.github/CONTRIBUTING.md b/vendor/phpunit/php-code-coverage/.github/CONTRIBUTING.md deleted file mode 100644 index 3339250..0000000 --- a/vendor/phpunit/php-code-coverage/.github/CONTRIBUTING.md +++ /dev/null @@ -1 +0,0 @@ -Please refer to [https://github.com/sebastianbergmann/phpunit/blob/master/CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/master/.github/CONTRIBUTING.md) for details on how to contribute to this project. diff --git a/vendor/phpunit/php-code-coverage/.github/FUNDING.yml b/vendor/phpunit/php-code-coverage/.github/FUNDING.yml deleted file mode 100644 index c2fba0f..0000000 --- a/vendor/phpunit/php-code-coverage/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: sebastianbergmann diff --git a/vendor/phpunit/php-code-coverage/.github/ISSUE_TEMPLATE.md b/vendor/phpunit/php-code-coverage/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index dc8e3b0..0000000 --- a/vendor/phpunit/php-code-coverage/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,18 +0,0 @@ -| Q | A -| --------------------------| --------------- -| php-code-coverage version | x.y.z -| PHP version | x.y.z -| Driver | Xdebug / PHPDBG -| Xdebug version (if used) | x.y.z -| Installation Method | Composer / PHPUnit PHAR -| Usage Method | PHPUnit / other -| PHPUnit version (if used) | x.y.z - - - diff --git a/vendor/phpunit/php-code-coverage/.gitignore b/vendor/phpunit/php-code-coverage/.gitignore deleted file mode 100644 index 3c77ffd..0000000 --- a/vendor/phpunit/php-code-coverage/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/tests/_files/tmp -/vendor -/composer.lock -/.idea -/.php_cs -/.php_cs.cache -/.phpunit.result.cache diff --git a/vendor/phpunit/php-code-coverage/.php_cs.dist b/vendor/phpunit/php-code-coverage/.php_cs.dist deleted file mode 100644 index cc20644..0000000 --- a/vendor/phpunit/php-code-coverage/.php_cs.dist +++ /dev/null @@ -1,197 +0,0 @@ - - -For the full copyright and license information, please view the LICENSE -file that was distributed with this source code. -EOF; - -return PhpCsFixer\Config::create() - ->setRiskyAllowed(true) - ->setRules( - [ - 'align_multiline_comment' => true, - 'array_indentation' => true, - 'array_syntax' => ['syntax' => 'short'], - 'binary_operator_spaces' => [ - 'operators' => [ - '=' => 'align', - '=>' => 'align', - ], - ], - 'blank_line_after_namespace' => true, - 'blank_line_before_statement' => [ - 'statements' => [ - 'break', - 'continue', - 'declare', - 'do', - 'for', - 'foreach', - 'if', - 'include', - 'include_once', - 'require', - 'require_once', - 'return', - 'switch', - 'throw', - 'try', - 'while', - 'yield', - ], - ], - 'braces' => true, - 'cast_spaces' => true, - 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], - 'combine_consecutive_issets' => true, - 'combine_consecutive_unsets' => true, - 'compact_nullable_typehint' => true, - 'concat_space' => ['spacing' => 'one'], - 'declare_equal_normalize' => ['space' => 'none'], - 'declare_strict_types' => true, - 'dir_constant' => true, - 'elseif' => true, - 'encoding' => true, - 'full_opening_tag' => true, - 'function_declaration' => true, - 'header_comment' => ['header' => $header, 'separate' => 'none'], - 'indentation_type' => true, - 'is_null' => true, - 'line_ending' => true, - 'list_syntax' => ['syntax' => 'short'], - 'logical_operators' => true, - 'lowercase_cast' => true, - 'lowercase_constants' => true, - 'lowercase_keywords' => true, - 'lowercase_static_reference' => true, - 'magic_constant_casing' => true, - 'method_argument_space' => ['ensure_fully_multiline' => true], - 'modernize_types_casting' => true, - 'multiline_comment_opening_closing' => true, - 'multiline_whitespace_before_semicolons' => true, - 'native_constant_invocation' => true, - 'native_function_casing' => true, - 'native_function_invocation' => true, - 'new_with_braces' => false, - 'no_alias_functions' => true, - 'no_alternative_syntax' => true, - 'no_blank_lines_after_class_opening' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_blank_lines_before_namespace' => true, - 'no_closing_tag' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => true, - 'no_homoglyph_names' => true, - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_mixed_echo_print' => ['use' => 'print'], - 'no_multiline_whitespace_around_double_arrow' => true, - 'no_null_property_initialization' => true, - 'no_php4_constructor' => true, - 'no_short_bool_cast' => true, - 'no_short_echo_tag' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_after_function_name' => true, - 'no_spaces_inside_parenthesis' => true, - 'no_superfluous_elseif' => true, - 'no_superfluous_phpdoc_tags' => true, - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_trailing_whitespace' => true, - 'no_trailing_whitespace_in_comment' => true, - 'no_unneeded_control_parentheses' => true, - 'no_unneeded_curly_braces' => true, - 'no_unneeded_final_method' => true, - 'no_unreachable_default_argument_value' => true, - 'no_unset_on_property' => true, - 'no_unused_imports' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'no_whitespace_before_comma_in_array' => true, - 'no_whitespace_in_blank_line' => true, - 'non_printable_character' => true, - 'normalize_index_brace' => true, - 'object_operator_without_whitespace' => true, - 'ordered_class_elements' => [ - 'order' => [ - 'use_trait', - 'constant_public', - 'constant_protected', - 'constant_private', - 'property_public_static', - 'property_protected_static', - 'property_private_static', - 'property_public', - 'property_protected', - 'property_private', - 'method_public_static', - 'construct', - 'destruct', - 'magic', - 'phpunit', - 'method_public', - 'method_protected', - 'method_private', - 'method_protected_static', - 'method_private_static', - ], - ], - 'ordered_imports' => true, - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_align' => true, - 'phpdoc_annotation_without_dot' => true, - 'phpdoc_indent' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_order' => true, - 'phpdoc_return_self_reference' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => true, - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_to_comment' => true, - 'phpdoc_trim' => true, - 'phpdoc_trim_consecutive_blank_line_separation' => true, - 'phpdoc_types' => ['groups' => ['simple', 'meta']], - 'phpdoc_types_order' => true, - 'phpdoc_var_without_name' => true, - 'pow_to_exponentiation' => true, - 'protected_to_private' => true, - 'return_assignment' => true, - 'return_type_declaration' => ['space_before' => 'none'], - 'self_accessor' => true, - 'semicolon_after_instruction' => true, - 'set_type_to_cast' => true, - 'short_scalar_cast' => true, - 'simplified_null_return' => true, - 'single_blank_line_at_eof' => true, - 'single_import_per_statement' => true, - 'single_line_after_imports' => true, - 'single_quote' => true, - 'standardize_not_equals' => true, - 'ternary_to_null_coalescing' => true, - 'trailing_comma_in_multiline_array' => true, - 'trim_array_spaces' => true, - 'unary_operator_spaces' => true, - 'visibility_required' => [ - 'elements' => [ - 'const', - 'method', - 'property', - ], - ], - 'void_return' => true, - 'whitespace_after_comma_in_array' => true, - ] - ) - ->setFinder( - PhpCsFixer\Finder::create() - ->files() - ->in(__DIR__ . '/src') - ->in(__DIR__ . '/tests/tests') - ); diff --git a/vendor/phpunit/php-code-coverage/.travis.yml b/vendor/phpunit/php-code-coverage/.travis.yml deleted file mode 100644 index 1bf5648..0000000 --- a/vendor/phpunit/php-code-coverage/.travis.yml +++ /dev/null @@ -1,60 +0,0 @@ -language: php - -php: - - 7.2 - - 7.3 - - 7.4snapshot - -matrix: - fast_finish: true - -env: - matrix: - - DRIVER="xdebug" DEPENDENCIES="high" - - DRIVER="phpdbg" DEPENDENCIES="high" - - DRIVER="pcov" DEPENDENCIES="high" - - DRIVER="xdebug" DEPENDENCIES="low" - - DRIVER="phpdbg" DEPENDENCIES="low" - - DRIVER="pcov" DEPENDENCIES="low" - global: - - DEFAULT_COMPOSER_FLAGS="--no-interaction --no-ansi --no-progress --no-suggest" - -before_install: - - ./tools/composer clear-cache - -install: - - if [[ "$DEPENDENCIES" = 'high' ]]; then travis_retry ./tools/composer update $DEFAULT_COMPOSER_FLAGS; fi - - if [[ "$DEPENDENCIES" = 'low' ]]; then travis_retry ./tools/composer update $DEFAULT_COMPOSER_FLAGS --prefer-lowest; fi - -before_script: - - | - if [[ "$DRIVER" = 'pcov' ]]; then - echo > $HOME/.phpenv/versions/$TRAVIS_PHP_VERSION/etc/conf.d/xdebug.ini - git clone --single-branch --branch=v1.0.6 --depth=1 https://github.com/krakjoe/pcov - cd pcov - phpize - ./configure - make clean install - echo "extension=pcov.so" > $HOME/.phpenv/versions/$TRAVIS_PHP_VERSION/etc/conf.d/pcov.ini - cd $TRAVIS_BUILD_DIR - fi - -script: - - if [[ "$DRIVER" = 'phpdbg' ]]; then phpdbg -qrr vendor/bin/phpunit --coverage-clover=coverage.xml; fi - - if [[ "$DRIVER" != 'phpdbg' ]]; then vendor/bin/phpunit --coverage-clover=coverage.xml; fi - -after_success: - - bash <(curl -s https://codecov.io/bash) - -notifications: - email: false - -jobs: - include: - - stage: Static Code Analysis - php: 7.3 - env: php-cs-fixer - install: - - phpenv config-rm xdebug.ini - script: - - ./tools/php-cs-fixer fix --dry-run -v --show-progress=dots --diff-format=udiff diff --git a/vendor/phpunit/php-code-coverage/ChangeLog.md b/vendor/phpunit/php-code-coverage/ChangeLog.md deleted file mode 100644 index 94596db..0000000 --- a/vendor/phpunit/php-code-coverage/ChangeLog.md +++ /dev/null @@ -1,131 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [7.0.10] - 2019-11-20 - -### Fixed - -* Fixed [#710](https://github.com/sebastianbergmann/php-code-coverage/pull/710): Code Coverage does not work in PhpStorm - -## [7.0.9] - 2019-11-20 - -### Changed - -* Implemented [#709](https://github.com/sebastianbergmann/php-code-coverage/pull/709): Prioritize PCOV over Xdebug - -## [7.0.8] - 2019-09-17 - -### Changed - -* Update HTML report Bootstrap 4.3.1, jQuery 3.4.1, and popper.js 1.15.0 - -## [7.0.7] - 2019-07-25 - -### Changed - -* Bumped required version of php-token-stream - -## [7.0.6] - 2019-07-08 - -### Changed - -* Bumped required version of php-token-stream - -## [7.0.5] - 2019-06-06 - -### Fixed - -* Fixed [#681](https://github.com/sebastianbergmann/php-code-coverage/pull/681): `use function` statements are not ignored - -## [7.0.4] - 2019-05-29 - -### Fixed - -* Fixed [#682](https://github.com/sebastianbergmann/php-code-coverage/pull/682): Code that is not executed is reported as being executed when using PCOV - -## [7.0.3] - 2019-02-26 - -### Fixed - -* Fixed [#671](https://github.com/sebastianbergmann/php-code-coverage/issues/671): `TypeError` when directory name is a number - -## [7.0.2] - 2019-02-15 - -### Changed - -* Updated HTML report to Bootstrap 4.3.0 - -### Fixed - -* Fixed [#667](https://github.com/sebastianbergmann/php-code-coverage/pull/667): `TypeError` in PHP reporter - -## [7.0.1] - 2019-02-01 - -### Fixed - -* Fixed [#664](https://github.com/sebastianbergmann/php-code-coverage/issues/664): `TypeError` when whitelisted file does not exist - -## [7.0.0] - 2019-02-01 - -### Added - -* Implemented [#663](https://github.com/sebastianbergmann/php-code-coverage/pull/663): Support for PCOV - -### Fixed - -* Fixed [#654](https://github.com/sebastianbergmann/php-code-coverage/issues/654): HTML report fails to load assets -* Fixed [#655](https://github.com/sebastianbergmann/php-code-coverage/issues/655): Popin pops in outside of screen - -### Removed - -* This component is no longer supported on PHP 7.1 - -## [6.1.4] - 2018-10-31 - -### Fixed - -* Fixed [#650](https://github.com/sebastianbergmann/php-code-coverage/issues/650): Wasted screen space in HTML code coverage report - -## [6.1.3] - 2018-10-23 - -### Changed - -* Use `^3.1` of `sebastian/environment` again due to [regression](https://github.com/sebastianbergmann/environment/issues/31) - -## [6.1.2] - 2018-10-23 - -### Fixed - -* Fixed [#645](https://github.com/sebastianbergmann/php-code-coverage/pull/645): Crash that can occur when php-token-stream parses invalid files - -## [6.1.1] - 2018-10-18 - -### Changed - -* This component now allows `^4` of `sebastian/environment` - -## [6.1.0] - 2018-10-16 - -### Changed - -* Class names are now abbreviated (unqualified name shown, fully qualified name shown on hover) in the file view of the HTML report -* Update HTML report to Bootstrap 4 - -[7.0.10]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.9...7.0.10 -[7.0.9]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.8...7.0.9 -[7.0.8]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.7...7.0.8 -[7.0.7]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.6...7.0.7 -[7.0.6]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.5...7.0.6 -[7.0.5]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.4...7.0.5 -[7.0.4]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.3...7.0.4 -[7.0.3]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.2...7.0.3 -[7.0.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.1...7.0.2 -[7.0.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/7.0.0...7.0.1 -[7.0.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/6.1.4...7.0.0 -[6.1.4]: https://github.com/sebastianbergmann/php-code-coverage/compare/6.1.3...6.1.4 -[6.1.3]: https://github.com/sebastianbergmann/php-code-coverage/compare/6.1.2...6.1.3 -[6.1.2]: https://github.com/sebastianbergmann/php-code-coverage/compare/6.1.1...6.1.2 -[6.1.1]: https://github.com/sebastianbergmann/php-code-coverage/compare/6.1.0...6.1.1 -[6.1.0]: https://github.com/sebastianbergmann/php-code-coverage/compare/6.0...6.1.0 - diff --git a/vendor/phpunit/php-code-coverage/LICENSE b/vendor/phpunit/php-code-coverage/LICENSE deleted file mode 100644 index b1a0140..0000000 --- a/vendor/phpunit/php-code-coverage/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -php-code-coverage - -Copyright (c) 2009-2019, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-code-coverage/README.md b/vendor/phpunit/php-code-coverage/README.md deleted file mode 100644 index bd4a169..0000000 --- a/vendor/phpunit/php-code-coverage/README.md +++ /dev/null @@ -1,40 +0,0 @@ -[![Latest Stable Version](https://poser.pugx.org/phpunit/php-code-coverage/v/stable.png)](https://packagist.org/packages/phpunit/php-code-coverage) -[![Build Status](https://travis-ci.org/sebastianbergmann/php-code-coverage.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-code-coverage) - -# SebastianBergmann\CodeCoverage - -**SebastianBergmann\CodeCoverage** is a library that provides collection, processing, and rendering functionality for PHP code coverage information. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phpunit/php-code-coverage - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phpunit/php-code-coverage - -## Using the SebastianBergmann\CodeCoverage API - -```php -filter()->addDirectoryToWhitelist('/path/to/src'); - -$coverage->start(''); - -// ... - -$coverage->stop(); - -$writer = new \SebastianBergmann\CodeCoverage\Report\Clover; -$writer->process($coverage, '/tmp/clover.xml'); - -$writer = new \SebastianBergmann\CodeCoverage\Report\Html\Facade; -$writer->process($coverage, '/tmp/code-coverage-report'); -``` - diff --git a/vendor/phpunit/php-code-coverage/build.xml b/vendor/phpunit/php-code-coverage/build.xml deleted file mode 100644 index df8408e..0000000 --- a/vendor/phpunit/php-code-coverage/build.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/composer.json b/vendor/phpunit/php-code-coverage/composer.json deleted file mode 100644 index 19f8586..0000000 --- a/vendor/phpunit/php-code-coverage/composer.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "phpunit/php-code-coverage", - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "type": "library", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues" - }, - "config": { - "optimize-autoloader": true, - "sort-packages": true - }, - "prefer-stable": true, - "require": { - "php": "^7.2", - "ext-dom": "*", - "ext-xmlwriter": "*", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-token-stream": "^3.1.1", - "phpunit/php-text-template": "^1.2.1", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" - }, - "require-dev": { - "phpunit/phpunit": "^8.2.2" - }, - "suggest": { - "ext-xdebug": "^2.7.2" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "files": [ - "tests/TestCase.php", - "tests/_files/BankAccountTest.php" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "7.0-dev" - } - } -} diff --git a/vendor/phpunit/php-code-coverage/phive.xml b/vendor/phpunit/php-code-coverage/phive.xml deleted file mode 100644 index 3ec79ee..0000000 --- a/vendor/phpunit/php-code-coverage/phive.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/vendor/phpunit/php-code-coverage/phpunit.xml b/vendor/phpunit/php-code-coverage/phpunit.xml deleted file mode 100644 index 37e2219..0000000 --- a/vendor/phpunit/php-code-coverage/phpunit.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - tests/tests - - - - - src - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/src/CodeCoverage.php b/vendor/phpunit/php-code-coverage/src/CodeCoverage.php deleted file mode 100644 index ced3b75..0000000 --- a/vendor/phpunit/php-code-coverage/src/CodeCoverage.php +++ /dev/null @@ -1,1006 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use PHPUnit\Framework\TestCase; -use PHPUnit\Runner\PhptTestCase; -use PHPUnit\Util\Test; -use SebastianBergmann\CodeCoverage\Driver\Driver; -use SebastianBergmann\CodeCoverage\Driver\PCOV; -use SebastianBergmann\CodeCoverage\Driver\PHPDBG; -use SebastianBergmann\CodeCoverage\Driver\Xdebug; -use SebastianBergmann\CodeCoverage\Node\Builder; -use SebastianBergmann\CodeCoverage\Node\Directory; -use SebastianBergmann\CodeUnitReverseLookup\Wizard; -use SebastianBergmann\Environment\Runtime; - -/** - * Provides collection functionality for PHP code coverage information. - */ -final class CodeCoverage -{ - /** - * @var Driver - */ - private $driver; - - /** - * @var Filter - */ - private $filter; - - /** - * @var Wizard - */ - private $wizard; - - /** - * @var bool - */ - private $cacheTokens = false; - - /** - * @var bool - */ - private $checkForUnintentionallyCoveredCode = false; - - /** - * @var bool - */ - private $forceCoversAnnotation = false; - - /** - * @var bool - */ - private $checkForUnexecutedCoveredCode = false; - - /** - * @var bool - */ - private $checkForMissingCoversAnnotation = false; - - /** - * @var bool - */ - private $addUncoveredFilesFromWhitelist = true; - - /** - * @var bool - */ - private $processUncoveredFilesFromWhitelist = false; - - /** - * @var bool - */ - private $ignoreDeprecatedCode = false; - - /** - * @var PhptTestCase|string|TestCase - */ - private $currentId; - - /** - * Code coverage data. - * - * @var array - */ - private $data = []; - - /** - * @var array - */ - private $ignoredLines = []; - - /** - * @var bool - */ - private $disableIgnoredLines = false; - - /** - * Test data. - * - * @var array - */ - private $tests = []; - - /** - * @var string[] - */ - private $unintentionallyCoveredSubclassesWhitelist = []; - - /** - * Determine if the data has been initialized or not - * - * @var bool - */ - private $isInitialized = false; - - /** - * Determine whether we need to check for dead and unused code on each test - * - * @var bool - */ - private $shouldCheckForDeadAndUnused = true; - - /** - * @var Directory - */ - private $report; - - /** - * @throws RuntimeException - */ - public function __construct(Driver $driver = null, Filter $filter = null) - { - if ($filter === null) { - $filter = new Filter; - } - - if ($driver === null) { - $driver = $this->selectDriver($filter); - } - - $this->driver = $driver; - $this->filter = $filter; - - $this->wizard = new Wizard; - } - - /** - * Returns the code coverage information as a graph of node objects. - */ - public function getReport(): Directory - { - if ($this->report === null) { - $this->report = (new Builder)->build($this); - } - - return $this->report; - } - - /** - * Clears collected code coverage data. - */ - public function clear(): void - { - $this->isInitialized = false; - $this->currentId = null; - $this->data = []; - $this->tests = []; - $this->report = null; - } - - /** - * Returns the filter object used. - */ - public function filter(): Filter - { - return $this->filter; - } - - /** - * Returns the collected code coverage data. - */ - public function getData(bool $raw = false): array - { - if (!$raw && $this->addUncoveredFilesFromWhitelist) { - $this->addUncoveredFilesFromWhitelist(); - } - - return $this->data; - } - - /** - * Sets the coverage data. - */ - public function setData(array $data): void - { - $this->data = $data; - $this->report = null; - } - - /** - * Returns the test data. - */ - public function getTests(): array - { - return $this->tests; - } - - /** - * Sets the test data. - */ - public function setTests(array $tests): void - { - $this->tests = $tests; - } - - /** - * Start collection of code coverage information. - * - * @param PhptTestCase|string|TestCase $id - * - * @throws RuntimeException - */ - public function start($id, bool $clear = false): void - { - if ($clear) { - $this->clear(); - } - - if ($this->isInitialized === false) { - $this->initializeData(); - } - - $this->currentId = $id; - - $this->driver->start($this->shouldCheckForDeadAndUnused); - } - - /** - * Stop collection of code coverage information. - * - * @param array|false $linesToBeCovered - * - * @throws MissingCoversAnnotationException - * @throws CoveredCodeNotExecutedException - * @throws RuntimeException - * @throws InvalidArgumentException - * @throws \ReflectionException - */ - public function stop(bool $append = true, $linesToBeCovered = [], array $linesToBeUsed = [], bool $ignoreForceCoversAnnotation = false): array - { - if (!\is_array($linesToBeCovered) && $linesToBeCovered !== false) { - throw InvalidArgumentException::create( - 2, - 'array or false' - ); - } - - $data = $this->driver->stop(); - $this->append($data, null, $append, $linesToBeCovered, $linesToBeUsed, $ignoreForceCoversAnnotation); - - $this->currentId = null; - - return $data; - } - - /** - * Appends code coverage data. - * - * @param PhptTestCase|string|TestCase $id - * @param array|false $linesToBeCovered - * - * @throws \SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException - * @throws \SebastianBergmann\CodeCoverage\MissingCoversAnnotationException - * @throws \SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException - * @throws \ReflectionException - * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException - * @throws RuntimeException - */ - public function append(array $data, $id = null, bool $append = true, $linesToBeCovered = [], array $linesToBeUsed = [], bool $ignoreForceCoversAnnotation = false): void - { - if ($id === null) { - $id = $this->currentId; - } - - if ($id === null) { - throw new RuntimeException; - } - - $this->applyWhitelistFilter($data); - $this->applyIgnoredLinesFilter($data); - $this->initializeFilesThatAreSeenTheFirstTime($data); - - if (!$append) { - return; - } - - if ($id !== 'UNCOVERED_FILES_FROM_WHITELIST') { - $this->applyCoversAnnotationFilter( - $data, - $linesToBeCovered, - $linesToBeUsed, - $ignoreForceCoversAnnotation - ); - } - - if (empty($data)) { - return; - } - - $size = 'unknown'; - $status = -1; - - if ($id instanceof TestCase) { - $_size = $id->getSize(); - - if ($_size === Test::SMALL) { - $size = 'small'; - } elseif ($_size === Test::MEDIUM) { - $size = 'medium'; - } elseif ($_size === Test::LARGE) { - $size = 'large'; - } - - $status = $id->getStatus(); - $id = \get_class($id) . '::' . $id->getName(); - } elseif ($id instanceof PhptTestCase) { - $size = 'large'; - $id = $id->getName(); - } - - $this->tests[$id] = ['size' => $size, 'status' => $status]; - - foreach ($data as $file => $lines) { - if (!$this->filter->isFile($file)) { - continue; - } - - foreach ($lines as $k => $v) { - if ($v === Driver::LINE_EXECUTED) { - if (empty($this->data[$file][$k]) || !\in_array($id, $this->data[$file][$k])) { - $this->data[$file][$k][] = $id; - } - } - } - } - - $this->report = null; - } - - /** - * Merges the data from another instance. - * - * @param CodeCoverage $that - */ - public function merge(self $that): void - { - $this->filter->setWhitelistedFiles( - \array_merge($this->filter->getWhitelistedFiles(), $that->filter()->getWhitelistedFiles()) - ); - - foreach ($that->data as $file => $lines) { - if (!isset($this->data[$file])) { - if (!$this->filter->isFiltered($file)) { - $this->data[$file] = $lines; - } - - continue; - } - - // we should compare the lines if any of two contains data - $compareLineNumbers = \array_unique( - \array_merge( - \array_keys($this->data[$file]), - \array_keys($that->data[$file]) - ) - ); - - foreach ($compareLineNumbers as $line) { - $thatPriority = $this->getLinePriority($that->data[$file], $line); - $thisPriority = $this->getLinePriority($this->data[$file], $line); - - if ($thatPriority > $thisPriority) { - $this->data[$file][$line] = $that->data[$file][$line]; - } elseif ($thatPriority === $thisPriority && \is_array($this->data[$file][$line])) { - $this->data[$file][$line] = \array_unique( - \array_merge($this->data[$file][$line], $that->data[$file][$line]) - ); - } - } - } - - $this->tests = \array_merge($this->tests, $that->getTests()); - $this->report = null; - } - - public function setCacheTokens(bool $flag): void - { - $this->cacheTokens = $flag; - } - - public function getCacheTokens(): bool - { - return $this->cacheTokens; - } - - public function setCheckForUnintentionallyCoveredCode(bool $flag): void - { - $this->checkForUnintentionallyCoveredCode = $flag; - } - - public function setForceCoversAnnotation(bool $flag): void - { - $this->forceCoversAnnotation = $flag; - } - - public function setCheckForMissingCoversAnnotation(bool $flag): void - { - $this->checkForMissingCoversAnnotation = $flag; - } - - public function setCheckForUnexecutedCoveredCode(bool $flag): void - { - $this->checkForUnexecutedCoveredCode = $flag; - } - - public function setAddUncoveredFilesFromWhitelist(bool $flag): void - { - $this->addUncoveredFilesFromWhitelist = $flag; - } - - public function setProcessUncoveredFilesFromWhitelist(bool $flag): void - { - $this->processUncoveredFilesFromWhitelist = $flag; - } - - public function setDisableIgnoredLines(bool $flag): void - { - $this->disableIgnoredLines = $flag; - } - - public function setIgnoreDeprecatedCode(bool $flag): void - { - $this->ignoreDeprecatedCode = $flag; - } - - public function setUnintentionallyCoveredSubclassesWhitelist(array $whitelist): void - { - $this->unintentionallyCoveredSubclassesWhitelist = $whitelist; - } - - /** - * Determine the priority for a line - * - * 1 = the line is not set - * 2 = the line has not been tested - * 3 = the line is dead code - * 4 = the line has been tested - * - * During a merge, a higher number is better. - * - * @param array $data - * @param int $line - * - * @return int - */ - private function getLinePriority($data, $line) - { - if (!\array_key_exists($line, $data)) { - return 1; - } - - if (\is_array($data[$line]) && \count($data[$line]) === 0) { - return 2; - } - - if ($data[$line] === null) { - return 3; - } - - return 4; - } - - /** - * Applies the @covers annotation filtering. - * - * @param array|false $linesToBeCovered - * - * @throws \SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException - * @throws \ReflectionException - * @throws MissingCoversAnnotationException - * @throws UnintentionallyCoveredCodeException - */ - private function applyCoversAnnotationFilter(array &$data, $linesToBeCovered, array $linesToBeUsed, bool $ignoreForceCoversAnnotation): void - { - if ($linesToBeCovered === false || - ($this->forceCoversAnnotation && empty($linesToBeCovered) && !$ignoreForceCoversAnnotation)) { - if ($this->checkForMissingCoversAnnotation) { - throw new MissingCoversAnnotationException; - } - - $data = []; - - return; - } - - if (empty($linesToBeCovered)) { - return; - } - - if ($this->checkForUnintentionallyCoveredCode && - (!$this->currentId instanceof TestCase || - (!$this->currentId->isMedium() && !$this->currentId->isLarge()))) { - $this->performUnintentionallyCoveredCodeCheck($data, $linesToBeCovered, $linesToBeUsed); - } - - if ($this->checkForUnexecutedCoveredCode) { - $this->performUnexecutedCoveredCodeCheck($data, $linesToBeCovered, $linesToBeUsed); - } - - $data = \array_intersect_key($data, $linesToBeCovered); - - foreach (\array_keys($data) as $filename) { - $_linesToBeCovered = \array_flip($linesToBeCovered[$filename]); - $data[$filename] = \array_intersect_key($data[$filename], $_linesToBeCovered); - } - } - - private function applyWhitelistFilter(array &$data): void - { - foreach (\array_keys($data) as $filename) { - if ($this->filter->isFiltered($filename)) { - unset($data[$filename]); - } - } - } - - /** - * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException - */ - private function applyIgnoredLinesFilter(array &$data): void - { - foreach (\array_keys($data) as $filename) { - if (!$this->filter->isFile($filename)) { - continue; - } - - foreach ($this->getLinesToBeIgnored($filename) as $line) { - unset($data[$filename][$line]); - } - } - } - - private function initializeFilesThatAreSeenTheFirstTime(array $data): void - { - foreach ($data as $file => $lines) { - if (!isset($this->data[$file]) && $this->filter->isFile($file)) { - $this->data[$file] = []; - - foreach ($lines as $k => $v) { - $this->data[$file][$k] = $v === -2 ? null : []; - } - } - } - } - - /** - * @throws CoveredCodeNotExecutedException - * @throws InvalidArgumentException - * @throws MissingCoversAnnotationException - * @throws RuntimeException - * @throws UnintentionallyCoveredCodeException - * @throws \ReflectionException - */ - private function addUncoveredFilesFromWhitelist(): void - { - $data = []; - $uncoveredFiles = \array_diff( - $this->filter->getWhitelist(), - \array_keys($this->data) - ); - - foreach ($uncoveredFiles as $uncoveredFile) { - if (!\file_exists($uncoveredFile)) { - continue; - } - - $data[$uncoveredFile] = []; - - $lines = \count(\file($uncoveredFile)); - - for ($i = 1; $i <= $lines; $i++) { - $data[$uncoveredFile][$i] = Driver::LINE_NOT_EXECUTED; - } - } - - $this->append($data, 'UNCOVERED_FILES_FROM_WHITELIST'); - } - - private function getLinesToBeIgnored(string $fileName): array - { - if (isset($this->ignoredLines[$fileName])) { - return $this->ignoredLines[$fileName]; - } - - try { - return $this->getLinesToBeIgnoredInner($fileName); - } catch (\OutOfBoundsException $e) { - // This can happen with PHP_Token_Stream if the file is syntactically invalid, - // and probably affects a file that wasn't executed. - return []; - } - } - - private function getLinesToBeIgnoredInner(string $fileName): array - { - $this->ignoredLines[$fileName] = []; - - $lines = \file($fileName); - - foreach ($lines as $index => $line) { - if (!\trim($line)) { - $this->ignoredLines[$fileName][] = $index + 1; - } - } - - if ($this->cacheTokens) { - $tokens = \PHP_Token_Stream_CachingFactory::get($fileName); - } else { - $tokens = new \PHP_Token_Stream($fileName); - } - - foreach ($tokens->getInterfaces() as $interface) { - $interfaceStartLine = $interface['startLine']; - $interfaceEndLine = $interface['endLine']; - - foreach (\range($interfaceStartLine, $interfaceEndLine) as $line) { - $this->ignoredLines[$fileName][] = $line; - } - } - - foreach (\array_merge($tokens->getClasses(), $tokens->getTraits()) as $classOrTrait) { - $classOrTraitStartLine = $classOrTrait['startLine']; - $classOrTraitEndLine = $classOrTrait['endLine']; - - if (empty($classOrTrait['methods'])) { - foreach (\range($classOrTraitStartLine, $classOrTraitEndLine) as $line) { - $this->ignoredLines[$fileName][] = $line; - } - - continue; - } - - $firstMethod = \array_shift($classOrTrait['methods']); - $firstMethodStartLine = $firstMethod['startLine']; - $lastMethodEndLine = $firstMethod['endLine']; - - do { - $lastMethod = \array_pop($classOrTrait['methods']); - } while ($lastMethod !== null && 0 === \strpos($lastMethod['signature'], 'anonymousFunction')); - - if ($lastMethod !== null) { - $lastMethodEndLine = $lastMethod['endLine']; - } - - foreach (\range($classOrTraitStartLine, $firstMethodStartLine) as $line) { - $this->ignoredLines[$fileName][] = $line; - } - - foreach (\range($lastMethodEndLine + 1, $classOrTraitEndLine) as $line) { - $this->ignoredLines[$fileName][] = $line; - } - } - - if ($this->disableIgnoredLines) { - $this->ignoredLines[$fileName] = \array_unique($this->ignoredLines[$fileName]); - \sort($this->ignoredLines[$fileName]); - - return $this->ignoredLines[$fileName]; - } - - $ignore = false; - $stop = false; - - foreach ($tokens->tokens() as $token) { - switch (\get_class($token)) { - case \PHP_Token_COMMENT::class: - case \PHP_Token_DOC_COMMENT::class: - $_token = \trim((string) $token); - $_line = \trim($lines[$token->getLine() - 1]); - - if ($_token === '// @codeCoverageIgnore' || - $_token === '//@codeCoverageIgnore') { - $ignore = true; - $stop = true; - } elseif ($_token === '// @codeCoverageIgnoreStart' || - $_token === '//@codeCoverageIgnoreStart') { - $ignore = true; - } elseif ($_token === '// @codeCoverageIgnoreEnd' || - $_token === '//@codeCoverageIgnoreEnd') { - $stop = true; - } - - if (!$ignore) { - $start = $token->getLine(); - $end = $start + \substr_count((string) $token, "\n"); - - // Do not ignore the first line when there is a token - // before the comment - if (0 !== \strpos($_token, $_line)) { - $start++; - } - - for ($i = $start; $i < $end; $i++) { - $this->ignoredLines[$fileName][] = $i; - } - - // A DOC_COMMENT token or a COMMENT token starting with "/*" - // does not contain the final \n character in its text - if (isset($lines[$i - 1]) && 0 === \strpos($_token, '/*') && '*/' === \substr(\trim($lines[$i - 1]), -2)) { - $this->ignoredLines[$fileName][] = $i; - } - } - - break; - - case \PHP_Token_INTERFACE::class: - case \PHP_Token_TRAIT::class: - case \PHP_Token_CLASS::class: - case \PHP_Token_FUNCTION::class: - /* @var \PHP_Token_Interface $token */ - - $docblock = (string) $token->getDocblock(); - - $this->ignoredLines[$fileName][] = $token->getLine(); - - if (\strpos($docblock, '@codeCoverageIgnore') || ($this->ignoreDeprecatedCode && \strpos($docblock, '@deprecated'))) { - $endLine = $token->getEndLine(); - - for ($i = $token->getLine(); $i <= $endLine; $i++) { - $this->ignoredLines[$fileName][] = $i; - } - } - - break; - - /* @noinspection PhpMissingBreakStatementInspection */ - case \PHP_Token_NAMESPACE::class: - $this->ignoredLines[$fileName][] = $token->getEndLine(); - - // Intentional fallthrough - case \PHP_Token_DECLARE::class: - case \PHP_Token_OPEN_TAG::class: - case \PHP_Token_CLOSE_TAG::class: - case \PHP_Token_USE::class: - case \PHP_Token_USE_FUNCTION::class: - $this->ignoredLines[$fileName][] = $token->getLine(); - - break; - } - - if ($ignore) { - $this->ignoredLines[$fileName][] = $token->getLine(); - - if ($stop) { - $ignore = false; - $stop = false; - } - } - } - - $this->ignoredLines[$fileName][] = \count($lines) + 1; - - $this->ignoredLines[$fileName] = \array_unique( - $this->ignoredLines[$fileName] - ); - - $this->ignoredLines[$fileName] = \array_unique($this->ignoredLines[$fileName]); - \sort($this->ignoredLines[$fileName]); - - return $this->ignoredLines[$fileName]; - } - - /** - * @throws \ReflectionException - * @throws UnintentionallyCoveredCodeException - */ - private function performUnintentionallyCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed): void - { - $allowedLines = $this->getAllowedLines( - $linesToBeCovered, - $linesToBeUsed - ); - - $unintentionallyCoveredUnits = []; - - foreach ($data as $file => $_data) { - foreach ($_data as $line => $flag) { - if ($flag === 1 && !isset($allowedLines[$file][$line])) { - $unintentionallyCoveredUnits[] = $this->wizard->lookup($file, $line); - } - } - } - - $unintentionallyCoveredUnits = $this->processUnintentionallyCoveredUnits($unintentionallyCoveredUnits); - - if (!empty($unintentionallyCoveredUnits)) { - throw new UnintentionallyCoveredCodeException( - $unintentionallyCoveredUnits - ); - } - } - - /** - * @throws CoveredCodeNotExecutedException - */ - private function performUnexecutedCoveredCodeCheck(array &$data, array $linesToBeCovered, array $linesToBeUsed): void - { - $executedCodeUnits = $this->coverageToCodeUnits($data); - $message = ''; - - foreach ($this->linesToCodeUnits($linesToBeCovered) as $codeUnit) { - if (!\in_array($codeUnit, $executedCodeUnits)) { - $message .= \sprintf( - '- %s is expected to be executed (@covers) but was not executed' . "\n", - $codeUnit - ); - } - } - - foreach ($this->linesToCodeUnits($linesToBeUsed) as $codeUnit) { - if (!\in_array($codeUnit, $executedCodeUnits)) { - $message .= \sprintf( - '- %s is expected to be executed (@uses) but was not executed' . "\n", - $codeUnit - ); - } - } - - if (!empty($message)) { - throw new CoveredCodeNotExecutedException($message); - } - } - - private function getAllowedLines(array $linesToBeCovered, array $linesToBeUsed): array - { - $allowedLines = []; - - foreach (\array_keys($linesToBeCovered) as $file) { - if (!isset($allowedLines[$file])) { - $allowedLines[$file] = []; - } - - $allowedLines[$file] = \array_merge( - $allowedLines[$file], - $linesToBeCovered[$file] - ); - } - - foreach (\array_keys($linesToBeUsed) as $file) { - if (!isset($allowedLines[$file])) { - $allowedLines[$file] = []; - } - - $allowedLines[$file] = \array_merge( - $allowedLines[$file], - $linesToBeUsed[$file] - ); - } - - foreach (\array_keys($allowedLines) as $file) { - $allowedLines[$file] = \array_flip( - \array_unique($allowedLines[$file]) - ); - } - - return $allowedLines; - } - - /** - * @throws RuntimeException - */ - private function selectDriver(Filter $filter): Driver - { - $runtime = new Runtime; - - if ($runtime->hasPHPDBGCodeCoverage()) { - return new PHPDBG; - } - - if ($runtime->hasPCOV()) { - return new PCOV; - } - - if ($runtime->hasXdebug()) { - return new Xdebug($filter); - } - - throw new RuntimeException('No code coverage driver available'); - } - - private function processUnintentionallyCoveredUnits(array $unintentionallyCoveredUnits): array - { - $unintentionallyCoveredUnits = \array_unique($unintentionallyCoveredUnits); - \sort($unintentionallyCoveredUnits); - - foreach (\array_keys($unintentionallyCoveredUnits) as $k => $v) { - $unit = \explode('::', $unintentionallyCoveredUnits[$k]); - - if (\count($unit) !== 2) { - continue; - } - - $class = new \ReflectionClass($unit[0]); - - foreach ($this->unintentionallyCoveredSubclassesWhitelist as $whitelisted) { - if ($class->isSubclassOf($whitelisted)) { - unset($unintentionallyCoveredUnits[$k]); - - break; - } - } - } - - return \array_values($unintentionallyCoveredUnits); - } - - /** - * @throws CoveredCodeNotExecutedException - * @throws InvalidArgumentException - * @throws MissingCoversAnnotationException - * @throws RuntimeException - * @throws UnintentionallyCoveredCodeException - * @throws \ReflectionException - */ - private function initializeData(): void - { - $this->isInitialized = true; - - if ($this->processUncoveredFilesFromWhitelist) { - $this->shouldCheckForDeadAndUnused = false; - - $this->driver->start(); - - foreach ($this->filter->getWhitelist() as $file) { - if ($this->filter->isFile($file)) { - include_once $file; - } - } - - $data = []; - - foreach ($this->driver->stop() as $file => $fileCoverage) { - if ($this->filter->isFiltered($file)) { - continue; - } - - foreach (\array_keys($fileCoverage) as $key) { - if ($fileCoverage[$key] === Driver::LINE_EXECUTED) { - $fileCoverage[$key] = Driver::LINE_NOT_EXECUTED; - } - } - - $data[$file] = $fileCoverage; - } - - $this->append($data, 'UNCOVERED_FILES_FROM_WHITELIST'); - } - } - - private function coverageToCodeUnits(array $data): array - { - $codeUnits = []; - - foreach ($data as $filename => $lines) { - foreach ($lines as $line => $flag) { - if ($flag === 1) { - $codeUnits[] = $this->wizard->lookup($filename, $line); - } - } - } - - return \array_unique($codeUnits); - } - - private function linesToCodeUnits(array $data): array - { - $codeUnits = []; - - foreach ($data as $filename => $lines) { - foreach ($lines as $line) { - $codeUnits[] = $this->wizard->lookup($filename, $line); - } - } - - return \array_unique($codeUnits); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Driver/Driver.php b/vendor/phpunit/php-code-coverage/src/Driver/Driver.php deleted file mode 100644 index 17acbf6..0000000 --- a/vendor/phpunit/php-code-coverage/src/Driver/Driver.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -/** - * Interface for code coverage drivers. - */ -interface Driver -{ - /** - * @var int - * - * @see http://xdebug.org/docs/code_coverage - */ - public const LINE_EXECUTED = 1; - - /** - * @var int - * - * @see http://xdebug.org/docs/code_coverage - */ - public const LINE_NOT_EXECUTED = -1; - - /** - * @var int - * - * @see http://xdebug.org/docs/code_coverage - */ - public const LINE_NOT_EXECUTABLE = -2; - - /** - * Start collection of code coverage information. - */ - public function start(bool $determineUnusedAndDead = true): void; - - /** - * Stop collection of code coverage information. - */ - public function stop(): array; -} diff --git a/vendor/phpunit/php-code-coverage/src/Driver/PCOV.php b/vendor/phpunit/php-code-coverage/src/Driver/PCOV.php deleted file mode 100644 index 7a6a3b6..0000000 --- a/vendor/phpunit/php-code-coverage/src/Driver/PCOV.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -/** - * Driver for PCOV code coverage functionality. - * - * @codeCoverageIgnore - */ -final class PCOV implements Driver -{ - /** - * Start collection of code coverage information. - */ - public function start(bool $determineUnusedAndDead = true): void - { - \pcov\start(); - } - - /** - * Stop collection of code coverage information. - */ - public function stop(): array - { - \pcov\stop(); - - $waiting = \pcov\waiting(); - $collect = []; - - if ($waiting) { - $collect = \pcov\collect(\pcov\inclusive, $waiting); - - \pcov\clear(); - } - - return $collect; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Driver/PHPDBG.php b/vendor/phpunit/php-code-coverage/src/Driver/PHPDBG.php deleted file mode 100644 index e9f999a..0000000 --- a/vendor/phpunit/php-code-coverage/src/Driver/PHPDBG.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use SebastianBergmann\CodeCoverage\RuntimeException; - -/** - * Driver for PHPDBG's code coverage functionality. - * - * @codeCoverageIgnore - */ -final class PHPDBG implements Driver -{ - /** - * @throws RuntimeException - */ - public function __construct() - { - if (\PHP_SAPI !== 'phpdbg') { - throw new RuntimeException( - 'This driver requires the PHPDBG SAPI' - ); - } - - if (!\function_exists('phpdbg_start_oplog')) { - throw new RuntimeException( - 'This build of PHPDBG does not support code coverage' - ); - } - } - - /** - * Start collection of code coverage information. - */ - public function start(bool $determineUnusedAndDead = true): void - { - \phpdbg_start_oplog(); - } - - /** - * Stop collection of code coverage information. - */ - public function stop(): array - { - static $fetchedLines = []; - - $dbgData = \phpdbg_end_oplog(); - - if ($fetchedLines == []) { - $sourceLines = \phpdbg_get_executable(); - } else { - $newFiles = \array_diff(\get_included_files(), \array_keys($fetchedLines)); - - $sourceLines = []; - - if ($newFiles) { - $sourceLines = phpdbg_get_executable(['files' => $newFiles]); - } - } - - foreach ($sourceLines as $file => $lines) { - foreach ($lines as $lineNo => $numExecuted) { - $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED; - } - } - - $fetchedLines = \array_merge($fetchedLines, $sourceLines); - - return $this->detectExecutedLines($fetchedLines, $dbgData); - } - - /** - * Convert phpdbg based data into the format CodeCoverage expects - */ - private function detectExecutedLines(array $sourceLines, array $dbgData): array - { - foreach ($dbgData as $file => $coveredLines) { - foreach ($coveredLines as $lineNo => $numExecuted) { - // phpdbg also reports $lineNo=0 when e.g. exceptions get thrown. - // make sure we only mark lines executed which are actually executable. - if (isset($sourceLines[$file][$lineNo])) { - $sourceLines[$file][$lineNo] = self::LINE_EXECUTED; - } - } - } - - return $sourceLines; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Driver/Xdebug.php b/vendor/phpunit/php-code-coverage/src/Driver/Xdebug.php deleted file mode 100644 index 7379496..0000000 --- a/vendor/phpunit/php-code-coverage/src/Driver/Xdebug.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Driver; - -use SebastianBergmann\CodeCoverage\Filter; -use SebastianBergmann\CodeCoverage\RuntimeException; - -/** - * Driver for Xdebug's code coverage functionality. - * - * @codeCoverageIgnore - */ -final class Xdebug implements Driver -{ - /** - * @var array - */ - private $cacheNumLines = []; - - /** - * @var Filter - */ - private $filter; - - /** - * @throws RuntimeException - */ - public function __construct(Filter $filter = null) - { - if (!\extension_loaded('xdebug')) { - throw new RuntimeException('This driver requires Xdebug'); - } - - if (!\ini_get('xdebug.coverage_enable')) { - throw new RuntimeException('xdebug.coverage_enable=On has to be set in php.ini'); - } - - if ($filter === null) { - $filter = new Filter; - } - - $this->filter = $filter; - } - - /** - * Start collection of code coverage information. - */ - public function start(bool $determineUnusedAndDead = true): void - { - if ($determineUnusedAndDead) { - \xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); - } else { - \xdebug_start_code_coverage(); - } - } - - /** - * Stop collection of code coverage information. - */ - public function stop(): array - { - $data = \xdebug_get_code_coverage(); - - \xdebug_stop_code_coverage(); - - return $this->cleanup($data); - } - - private function cleanup(array $data): array - { - foreach (\array_keys($data) as $file) { - unset($data[$file][0]); - - if (!$this->filter->isFile($file)) { - continue; - } - - $numLines = $this->getNumberOfLinesInFile($file); - - foreach (\array_keys($data[$file]) as $line) { - if ($line > $numLines) { - unset($data[$file][$line]); - } - } - } - - return $data; - } - - private function getNumberOfLinesInFile(string $fileName): int - { - if (!isset($this->cacheNumLines[$fileName])) { - $buffer = \file_get_contents($fileName); - $lines = \substr_count($buffer, "\n"); - - if (\substr($buffer, -1) !== "\n") { - $lines++; - } - - $this->cacheNumLines[$fileName] = $lines; - } - - return $this->cacheNumLines[$fileName]; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php b/vendor/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php deleted file mode 100644 index a88ab34..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -/** - * Exception that is raised when covered code is not executed. - */ -final class CoveredCodeNotExecutedException extends RuntimeException -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/Exception.php b/vendor/phpunit/php-code-coverage/src/Exception/Exception.php deleted file mode 100644 index 32bf894..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/Exception.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -/** - * Exception interface for php-code-coverage component. - */ -interface Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php b/vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php deleted file mode 100644 index cf2fcfc..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -final class InvalidArgumentException extends \InvalidArgumentException implements Exception -{ - /** - * @param int $argument - * @param string $type - * @param null|mixed $value - * - * @return InvalidArgumentException - */ - public static function create($argument, $type, $value = null): self - { - $stack = \debug_backtrace(0); - - return new self( - \sprintf( - 'Argument #%d%sof %s::%s() must be a %s', - $argument, - $value !== null ? ' (' . \gettype($value) . '#' . $value . ')' : ' (No Value) ', - $stack[1]['class'], - $stack[1]['function'], - $type - ) - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php b/vendor/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php deleted file mode 100644 index 56c4736..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -/** - * Exception that is raised when @covers must be used but is not. - */ -final class MissingCoversAnnotationException extends RuntimeException -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/RuntimeException.php b/vendor/phpunit/php-code-coverage/src/Exception/RuntimeException.php deleted file mode 100644 index 608650d..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/RuntimeException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php b/vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php deleted file mode 100644 index ef219b5..0000000 --- a/vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -/** - * Exception that is raised when code is unintentionally covered. - */ -final class UnintentionallyCoveredCodeException extends RuntimeException -{ - /** - * @var array - */ - private $unintentionallyCoveredUnits = []; - - public function __construct(array $unintentionallyCoveredUnits) - { - $this->unintentionallyCoveredUnits = $unintentionallyCoveredUnits; - - parent::__construct($this->toString()); - } - - public function getUnintentionallyCoveredUnits(): array - { - return $this->unintentionallyCoveredUnits; - } - - private function toString(): string - { - $message = ''; - - foreach ($this->unintentionallyCoveredUnits as $unit) { - $message .= '- ' . $unit . "\n"; - } - - return $message; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Filter.php b/vendor/phpunit/php-code-coverage/src/Filter.php deleted file mode 100644 index b3c2d2d..0000000 --- a/vendor/phpunit/php-code-coverage/src/Filter.php +++ /dev/null @@ -1,174 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; - -/** - * Filter for whitelisting of code coverage information. - */ -final class Filter -{ - /** - * Source files that are whitelisted. - * - * @var array - */ - private $whitelistedFiles = []; - - /** - * Remembers the result of the `is_file()` calls. - * - * @var bool[] - */ - private $isFileCallsCache = []; - - /** - * Adds a directory to the whitelist (recursively). - */ - public function addDirectoryToWhitelist(string $directory, string $suffix = '.php', string $prefix = ''): void - { - $facade = new FileIteratorFacade; - $files = $facade->getFilesAsArray($directory, $suffix, $prefix); - - foreach ($files as $file) { - $this->addFileToWhitelist($file); - } - } - - /** - * Adds a file to the whitelist. - */ - public function addFileToWhitelist(string $filename): void - { - $filename = \realpath($filename); - - if (!$filename) { - return; - } - - $this->whitelistedFiles[$filename] = true; - } - - /** - * Adds files to the whitelist. - * - * @param string[] $files - */ - public function addFilesToWhitelist(array $files): void - { - foreach ($files as $file) { - $this->addFileToWhitelist($file); - } - } - - /** - * Removes a directory from the whitelist (recursively). - */ - public function removeDirectoryFromWhitelist(string $directory, string $suffix = '.php', string $prefix = ''): void - { - $facade = new FileIteratorFacade; - $files = $facade->getFilesAsArray($directory, $suffix, $prefix); - - foreach ($files as $file) { - $this->removeFileFromWhitelist($file); - } - } - - /** - * Removes a file from the whitelist. - */ - public function removeFileFromWhitelist(string $filename): void - { - $filename = \realpath($filename); - - if (!$filename || !isset($this->whitelistedFiles[$filename])) { - return; - } - - unset($this->whitelistedFiles[$filename]); - } - - /** - * Checks whether a filename is a real filename. - */ - public function isFile(string $filename): bool - { - if (isset($this->isFileCallsCache[$filename])) { - return $this->isFileCallsCache[$filename]; - } - - if ($filename === '-' || - \strpos($filename, 'vfs://') === 0 || - \strpos($filename, 'xdebug://debug-eval') !== false || - \strpos($filename, 'eval()\'d code') !== false || - \strpos($filename, 'runtime-created function') !== false || - \strpos($filename, 'runkit created function') !== false || - \strpos($filename, 'assert code') !== false || - \strpos($filename, 'regexp code') !== false || - \strpos($filename, 'Standard input code') !== false) { - $isFile = false; - } else { - $isFile = \file_exists($filename); - } - - $this->isFileCallsCache[$filename] = $isFile; - - return $isFile; - } - - /** - * Checks whether or not a file is filtered. - */ - public function isFiltered(string $filename): bool - { - if (!$this->isFile($filename)) { - return true; - } - - return !isset($this->whitelistedFiles[$filename]); - } - - /** - * Returns the list of whitelisted files. - * - * @return string[] - */ - public function getWhitelist(): array - { - return \array_keys($this->whitelistedFiles); - } - - /** - * Returns whether this filter has a whitelist. - */ - public function hasWhitelist(): bool - { - return !empty($this->whitelistedFiles); - } - - /** - * Returns the whitelisted files. - * - * @return string[] - */ - public function getWhitelistedFiles(): array - { - return $this->whitelistedFiles; - } - - /** - * Sets the whitelisted files. - */ - public function setWhitelistedFiles(array $whitelistedFiles): void - { - $this->whitelistedFiles = $whitelistedFiles; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php b/vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php deleted file mode 100644 index 116a09f..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php +++ /dev/null @@ -1,328 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -use SebastianBergmann\CodeCoverage\Util; - -/** - * Base class for nodes in the code coverage information tree. - */ -abstract class AbstractNode implements \Countable -{ - /** - * @var string - */ - private $name; - - /** - * @var string - */ - private $path; - - /** - * @var array - */ - private $pathArray; - - /** - * @var AbstractNode - */ - private $parent; - - /** - * @var string - */ - private $id; - - public function __construct(string $name, self $parent = null) - { - if (\substr($name, -1) == \DIRECTORY_SEPARATOR) { - $name = \substr($name, 0, -1); - } - - $this->name = $name; - $this->parent = $parent; - } - - public function getName(): string - { - return $this->name; - } - - public function getId(): string - { - if ($this->id === null) { - $parent = $this->getParent(); - - if ($parent === null) { - $this->id = 'index'; - } else { - $parentId = $parent->getId(); - - if ($parentId === 'index') { - $this->id = \str_replace(':', '_', $this->name); - } else { - $this->id = $parentId . '/' . $this->name; - } - } - } - - return $this->id; - } - - public function getPath(): string - { - if ($this->path === null) { - if ($this->parent === null || $this->parent->getPath() === null || $this->parent->getPath() === false) { - $this->path = $this->name; - } else { - $this->path = $this->parent->getPath() . \DIRECTORY_SEPARATOR . $this->name; - } - } - - return $this->path; - } - - public function getPathAsArray(): array - { - if ($this->pathArray === null) { - if ($this->parent === null) { - $this->pathArray = []; - } else { - $this->pathArray = $this->parent->getPathAsArray(); - } - - $this->pathArray[] = $this; - } - - return $this->pathArray; - } - - public function getParent(): ?self - { - return $this->parent; - } - - /** - * Returns the percentage of classes that has been tested. - * - * @return int|string - */ - public function getTestedClassesPercent(bool $asString = true) - { - return Util::percent( - $this->getNumTestedClasses(), - $this->getNumClasses(), - $asString - ); - } - - /** - * Returns the percentage of traits that has been tested. - * - * @return int|string - */ - public function getTestedTraitsPercent(bool $asString = true) - { - return Util::percent( - $this->getNumTestedTraits(), - $this->getNumTraits(), - $asString - ); - } - - /** - * Returns the percentage of classes and traits that has been tested. - * - * @return int|string - */ - public function getTestedClassesAndTraitsPercent(bool $asString = true) - { - return Util::percent( - $this->getNumTestedClassesAndTraits(), - $this->getNumClassesAndTraits(), - $asString - ); - } - - /** - * Returns the percentage of functions that has been tested. - * - * @return int|string - */ - public function getTestedFunctionsPercent(bool $asString = true) - { - return Util::percent( - $this->getNumTestedFunctions(), - $this->getNumFunctions(), - $asString - ); - } - - /** - * Returns the percentage of methods that has been tested. - * - * @return int|string - */ - public function getTestedMethodsPercent(bool $asString = true) - { - return Util::percent( - $this->getNumTestedMethods(), - $this->getNumMethods(), - $asString - ); - } - - /** - * Returns the percentage of functions and methods that has been tested. - * - * @return int|string - */ - public function getTestedFunctionsAndMethodsPercent(bool $asString = true) - { - return Util::percent( - $this->getNumTestedFunctionsAndMethods(), - $this->getNumFunctionsAndMethods(), - $asString - ); - } - - /** - * Returns the percentage of executed lines. - * - * @return int|string - */ - public function getLineExecutedPercent(bool $asString = true) - { - return Util::percent( - $this->getNumExecutedLines(), - $this->getNumExecutableLines(), - $asString - ); - } - - /** - * Returns the number of classes and traits. - */ - public function getNumClassesAndTraits(): int - { - return $this->getNumClasses() + $this->getNumTraits(); - } - - /** - * Returns the number of tested classes and traits. - */ - public function getNumTestedClassesAndTraits(): int - { - return $this->getNumTestedClasses() + $this->getNumTestedTraits(); - } - - /** - * Returns the classes and traits of this node. - */ - public function getClassesAndTraits(): array - { - return \array_merge($this->getClasses(), $this->getTraits()); - } - - /** - * Returns the number of functions and methods. - */ - public function getNumFunctionsAndMethods(): int - { - return $this->getNumFunctions() + $this->getNumMethods(); - } - - /** - * Returns the number of tested functions and methods. - */ - public function getNumTestedFunctionsAndMethods(): int - { - return $this->getNumTestedFunctions() + $this->getNumTestedMethods(); - } - - /** - * Returns the functions and methods of this node. - */ - public function getFunctionsAndMethods(): array - { - return \array_merge($this->getFunctions(), $this->getMethods()); - } - - /** - * Returns the classes of this node. - */ - abstract public function getClasses(): array; - - /** - * Returns the traits of this node. - */ - abstract public function getTraits(): array; - - /** - * Returns the functions of this node. - */ - abstract public function getFunctions(): array; - - /** - * Returns the LOC/CLOC/NCLOC of this node. - */ - abstract public function getLinesOfCode(): array; - - /** - * Returns the number of executable lines. - */ - abstract public function getNumExecutableLines(): int; - - /** - * Returns the number of executed lines. - */ - abstract public function getNumExecutedLines(): int; - - /** - * Returns the number of classes. - */ - abstract public function getNumClasses(): int; - - /** - * Returns the number of tested classes. - */ - abstract public function getNumTestedClasses(): int; - - /** - * Returns the number of traits. - */ - abstract public function getNumTraits(): int; - - /** - * Returns the number of tested traits. - */ - abstract public function getNumTestedTraits(): int; - - /** - * Returns the number of methods. - */ - abstract public function getNumMethods(): int; - - /** - * Returns the number of tested methods. - */ - abstract public function getNumTestedMethods(): int; - - /** - * Returns the number of functions. - */ - abstract public function getNumFunctions(): int; - - /** - * Returns the number of tested functions. - */ - abstract public function getNumTestedFunctions(): int; -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/Builder.php b/vendor/phpunit/php-code-coverage/src/Node/Builder.php deleted file mode 100644 index 5e34bcc..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/Builder.php +++ /dev/null @@ -1,227 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -use SebastianBergmann\CodeCoverage\CodeCoverage; - -final class Builder -{ - public function build(CodeCoverage $coverage): Directory - { - $files = $coverage->getData(); - $commonPath = $this->reducePaths($files); - $root = new Directory( - $commonPath, - null - ); - - $this->addItems( - $root, - $this->buildDirectoryStructure($files), - $coverage->getTests(), - $coverage->getCacheTokens() - ); - - return $root; - } - - private function addItems(Directory $root, array $items, array $tests, bool $cacheTokens): void - { - foreach ($items as $key => $value) { - $key = (string) $key; - - if (\substr($key, -2) === '/f') { - $key = \substr($key, 0, -2); - - if (\file_exists($root->getPath() . \DIRECTORY_SEPARATOR . $key)) { - $root->addFile($key, $value, $tests, $cacheTokens); - } - } else { - $child = $root->addDirectory($key); - $this->addItems($child, $value, $tests, $cacheTokens); - } - } - } - - /** - * Builds an array representation of the directory structure. - * - * For instance, - * - * - * Array - * ( - * [Money.php] => Array - * ( - * ... - * ) - * - * [MoneyBag.php] => Array - * ( - * ... - * ) - * ) - * - * - * is transformed into - * - * - * Array - * ( - * [.] => Array - * ( - * [Money.php] => Array - * ( - * ... - * ) - * - * [MoneyBag.php] => Array - * ( - * ... - * ) - * ) - * ) - * - */ - private function buildDirectoryStructure(array $files): array - { - $result = []; - - foreach ($files as $path => $file) { - $path = \explode(\DIRECTORY_SEPARATOR, $path); - $pointer = &$result; - $max = \count($path); - - for ($i = 0; $i < $max; $i++) { - $type = ''; - - if ($i === ($max - 1)) { - $type = '/f'; - } - - $pointer = &$pointer[$path[$i] . $type]; - } - - $pointer = $file; - } - - return $result; - } - - /** - * Reduces the paths by cutting the longest common start path. - * - * For instance, - * - * - * Array - * ( - * [/home/sb/Money/Money.php] => Array - * ( - * ... - * ) - * - * [/home/sb/Money/MoneyBag.php] => Array - * ( - * ... - * ) - * ) - * - * - * is reduced to - * - * - * Array - * ( - * [Money.php] => Array - * ( - * ... - * ) - * - * [MoneyBag.php] => Array - * ( - * ... - * ) - * ) - * - */ - private function reducePaths(array &$files): string - { - if (empty($files)) { - return '.'; - } - - $commonPath = ''; - $paths = \array_keys($files); - - if (\count($files) === 1) { - $commonPath = \dirname($paths[0]) . \DIRECTORY_SEPARATOR; - $files[\basename($paths[0])] = $files[$paths[0]]; - - unset($files[$paths[0]]); - - return $commonPath; - } - - $max = \count($paths); - - for ($i = 0; $i < $max; $i++) { - // strip phar:// prefixes - if (\strpos($paths[$i], 'phar://') === 0) { - $paths[$i] = \substr($paths[$i], 7); - $paths[$i] = \str_replace('/', \DIRECTORY_SEPARATOR, $paths[$i]); - } - $paths[$i] = \explode(\DIRECTORY_SEPARATOR, $paths[$i]); - - if (empty($paths[$i][0])) { - $paths[$i][0] = \DIRECTORY_SEPARATOR; - } - } - - $done = false; - $max = \count($paths); - - while (!$done) { - for ($i = 0; $i < $max - 1; $i++) { - if (!isset($paths[$i][0]) || - !isset($paths[$i + 1][0]) || - $paths[$i][0] !== $paths[$i + 1][0]) { - $done = true; - - break; - } - } - - if (!$done) { - $commonPath .= $paths[0][0]; - - if ($paths[0][0] !== \DIRECTORY_SEPARATOR) { - $commonPath .= \DIRECTORY_SEPARATOR; - } - - for ($i = 0; $i < $max; $i++) { - \array_shift($paths[$i]); - } - } - } - - $original = \array_keys($files); - $max = \count($original); - - for ($i = 0; $i < $max; $i++) { - $files[\implode(\DIRECTORY_SEPARATOR, $paths[$i])] = $files[$original[$i]]; - unset($files[$original[$i]]); - } - - \ksort($files); - - return \substr($commonPath, 0, -1); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/Directory.php b/vendor/phpunit/php-code-coverage/src/Node/Directory.php deleted file mode 100644 index 7f1b5b2..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/Directory.php +++ /dev/null @@ -1,427 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -use SebastianBergmann\CodeCoverage\InvalidArgumentException; - -/** - * Represents a directory in the code coverage information tree. - */ -final class Directory extends AbstractNode implements \IteratorAggregate -{ - /** - * @var AbstractNode[] - */ - private $children = []; - - /** - * @var Directory[] - */ - private $directories = []; - - /** - * @var File[] - */ - private $files = []; - - /** - * @var array - */ - private $classes; - - /** - * @var array - */ - private $traits; - - /** - * @var array - */ - private $functions; - - /** - * @var array - */ - private $linesOfCode; - - /** - * @var int - */ - private $numFiles = -1; - - /** - * @var int - */ - private $numExecutableLines = -1; - - /** - * @var int - */ - private $numExecutedLines = -1; - - /** - * @var int - */ - private $numClasses = -1; - - /** - * @var int - */ - private $numTestedClasses = -1; - - /** - * @var int - */ - private $numTraits = -1; - - /** - * @var int - */ - private $numTestedTraits = -1; - - /** - * @var int - */ - private $numMethods = -1; - - /** - * @var int - */ - private $numTestedMethods = -1; - - /** - * @var int - */ - private $numFunctions = -1; - - /** - * @var int - */ - private $numTestedFunctions = -1; - - /** - * Returns the number of files in/under this node. - */ - public function count(): int - { - if ($this->numFiles === -1) { - $this->numFiles = 0; - - foreach ($this->children as $child) { - $this->numFiles += \count($child); - } - } - - return $this->numFiles; - } - - /** - * Returns an iterator for this node. - */ - public function getIterator(): \RecursiveIteratorIterator - { - return new \RecursiveIteratorIterator( - new Iterator($this), - \RecursiveIteratorIterator::SELF_FIRST - ); - } - - /** - * Adds a new directory. - */ - public function addDirectory(string $name): self - { - $directory = new self($name, $this); - - $this->children[] = $directory; - $this->directories[] = &$this->children[\count($this->children) - 1]; - - return $directory; - } - - /** - * Adds a new file. - * - * @throws InvalidArgumentException - */ - public function addFile(string $name, array $coverageData, array $testData, bool $cacheTokens): File - { - $file = new File($name, $this, $coverageData, $testData, $cacheTokens); - - $this->children[] = $file; - $this->files[] = &$this->children[\count($this->children) - 1]; - - $this->numExecutableLines = -1; - $this->numExecutedLines = -1; - - return $file; - } - - /** - * Returns the directories in this directory. - */ - public function getDirectories(): array - { - return $this->directories; - } - - /** - * Returns the files in this directory. - */ - public function getFiles(): array - { - return $this->files; - } - - /** - * Returns the child nodes of this node. - */ - public function getChildNodes(): array - { - return $this->children; - } - - /** - * Returns the classes of this node. - */ - public function getClasses(): array - { - if ($this->classes === null) { - $this->classes = []; - - foreach ($this->children as $child) { - $this->classes = \array_merge( - $this->classes, - $child->getClasses() - ); - } - } - - return $this->classes; - } - - /** - * Returns the traits of this node. - */ - public function getTraits(): array - { - if ($this->traits === null) { - $this->traits = []; - - foreach ($this->children as $child) { - $this->traits = \array_merge( - $this->traits, - $child->getTraits() - ); - } - } - - return $this->traits; - } - - /** - * Returns the functions of this node. - */ - public function getFunctions(): array - { - if ($this->functions === null) { - $this->functions = []; - - foreach ($this->children as $child) { - $this->functions = \array_merge( - $this->functions, - $child->getFunctions() - ); - } - } - - return $this->functions; - } - - /** - * Returns the LOC/CLOC/NCLOC of this node. - */ - public function getLinesOfCode(): array - { - if ($this->linesOfCode === null) { - $this->linesOfCode = ['loc' => 0, 'cloc' => 0, 'ncloc' => 0]; - - foreach ($this->children as $child) { - $linesOfCode = $child->getLinesOfCode(); - - $this->linesOfCode['loc'] += $linesOfCode['loc']; - $this->linesOfCode['cloc'] += $linesOfCode['cloc']; - $this->linesOfCode['ncloc'] += $linesOfCode['ncloc']; - } - } - - return $this->linesOfCode; - } - - /** - * Returns the number of executable lines. - */ - public function getNumExecutableLines(): int - { - if ($this->numExecutableLines === -1) { - $this->numExecutableLines = 0; - - foreach ($this->children as $child) { - $this->numExecutableLines += $child->getNumExecutableLines(); - } - } - - return $this->numExecutableLines; - } - - /** - * Returns the number of executed lines. - */ - public function getNumExecutedLines(): int - { - if ($this->numExecutedLines === -1) { - $this->numExecutedLines = 0; - - foreach ($this->children as $child) { - $this->numExecutedLines += $child->getNumExecutedLines(); - } - } - - return $this->numExecutedLines; - } - - /** - * Returns the number of classes. - */ - public function getNumClasses(): int - { - if ($this->numClasses === -1) { - $this->numClasses = 0; - - foreach ($this->children as $child) { - $this->numClasses += $child->getNumClasses(); - } - } - - return $this->numClasses; - } - - /** - * Returns the number of tested classes. - */ - public function getNumTestedClasses(): int - { - if ($this->numTestedClasses === -1) { - $this->numTestedClasses = 0; - - foreach ($this->children as $child) { - $this->numTestedClasses += $child->getNumTestedClasses(); - } - } - - return $this->numTestedClasses; - } - - /** - * Returns the number of traits. - */ - public function getNumTraits(): int - { - if ($this->numTraits === -1) { - $this->numTraits = 0; - - foreach ($this->children as $child) { - $this->numTraits += $child->getNumTraits(); - } - } - - return $this->numTraits; - } - - /** - * Returns the number of tested traits. - */ - public function getNumTestedTraits(): int - { - if ($this->numTestedTraits === -1) { - $this->numTestedTraits = 0; - - foreach ($this->children as $child) { - $this->numTestedTraits += $child->getNumTestedTraits(); - } - } - - return $this->numTestedTraits; - } - - /** - * Returns the number of methods. - */ - public function getNumMethods(): int - { - if ($this->numMethods === -1) { - $this->numMethods = 0; - - foreach ($this->children as $child) { - $this->numMethods += $child->getNumMethods(); - } - } - - return $this->numMethods; - } - - /** - * Returns the number of tested methods. - */ - public function getNumTestedMethods(): int - { - if ($this->numTestedMethods === -1) { - $this->numTestedMethods = 0; - - foreach ($this->children as $child) { - $this->numTestedMethods += $child->getNumTestedMethods(); - } - } - - return $this->numTestedMethods; - } - - /** - * Returns the number of functions. - */ - public function getNumFunctions(): int - { - if ($this->numFunctions === -1) { - $this->numFunctions = 0; - - foreach ($this->children as $child) { - $this->numFunctions += $child->getNumFunctions(); - } - } - - return $this->numFunctions; - } - - /** - * Returns the number of tested functions. - */ - public function getNumTestedFunctions(): int - { - if ($this->numTestedFunctions === -1) { - $this->numTestedFunctions = 0; - - foreach ($this->children as $child) { - $this->numTestedFunctions += $child->getNumTestedFunctions(); - } - } - - return $this->numTestedFunctions; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/File.php b/vendor/phpunit/php-code-coverage/src/Node/File.php deleted file mode 100644 index 840d119..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/File.php +++ /dev/null @@ -1,611 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -/** - * Represents a file in the code coverage information tree. - */ -final class File extends AbstractNode -{ - /** - * @var array - */ - private $coverageData; - - /** - * @var array - */ - private $testData; - - /** - * @var int - */ - private $numExecutableLines = 0; - - /** - * @var int - */ - private $numExecutedLines = 0; - - /** - * @var array - */ - private $classes = []; - - /** - * @var array - */ - private $traits = []; - - /** - * @var array - */ - private $functions = []; - - /** - * @var array - */ - private $linesOfCode = []; - - /** - * @var int - */ - private $numClasses; - - /** - * @var int - */ - private $numTestedClasses = 0; - - /** - * @var int - */ - private $numTraits; - - /** - * @var int - */ - private $numTestedTraits = 0; - - /** - * @var int - */ - private $numMethods; - - /** - * @var int - */ - private $numTestedMethods; - - /** - * @var int - */ - private $numTestedFunctions; - - /** - * @var bool - */ - private $cacheTokens; - - /** - * @var array - */ - private $codeUnitsByLine = []; - - public function __construct(string $name, AbstractNode $parent, array $coverageData, array $testData, bool $cacheTokens) - { - parent::__construct($name, $parent); - - $this->coverageData = $coverageData; - $this->testData = $testData; - $this->cacheTokens = $cacheTokens; - - $this->calculateStatistics(); - } - - /** - * Returns the number of files in/under this node. - */ - public function count(): int - { - return 1; - } - - /** - * Returns the code coverage data of this node. - */ - public function getCoverageData(): array - { - return $this->coverageData; - } - - /** - * Returns the test data of this node. - */ - public function getTestData(): array - { - return $this->testData; - } - - /** - * Returns the classes of this node. - */ - public function getClasses(): array - { - return $this->classes; - } - - /** - * Returns the traits of this node. - */ - public function getTraits(): array - { - return $this->traits; - } - - /** - * Returns the functions of this node. - */ - public function getFunctions(): array - { - return $this->functions; - } - - /** - * Returns the LOC/CLOC/NCLOC of this node. - */ - public function getLinesOfCode(): array - { - return $this->linesOfCode; - } - - /** - * Returns the number of executable lines. - */ - public function getNumExecutableLines(): int - { - return $this->numExecutableLines; - } - - /** - * Returns the number of executed lines. - */ - public function getNumExecutedLines(): int - { - return $this->numExecutedLines; - } - - /** - * Returns the number of classes. - */ - public function getNumClasses(): int - { - if ($this->numClasses === null) { - $this->numClasses = 0; - - foreach ($this->classes as $class) { - foreach ($class['methods'] as $method) { - if ($method['executableLines'] > 0) { - $this->numClasses++; - - continue 2; - } - } - } - } - - return $this->numClasses; - } - - /** - * Returns the number of tested classes. - */ - public function getNumTestedClasses(): int - { - return $this->numTestedClasses; - } - - /** - * Returns the number of traits. - */ - public function getNumTraits(): int - { - if ($this->numTraits === null) { - $this->numTraits = 0; - - foreach ($this->traits as $trait) { - foreach ($trait['methods'] as $method) { - if ($method['executableLines'] > 0) { - $this->numTraits++; - - continue 2; - } - } - } - } - - return $this->numTraits; - } - - /** - * Returns the number of tested traits. - */ - public function getNumTestedTraits(): int - { - return $this->numTestedTraits; - } - - /** - * Returns the number of methods. - */ - public function getNumMethods(): int - { - if ($this->numMethods === null) { - $this->numMethods = 0; - - foreach ($this->classes as $class) { - foreach ($class['methods'] as $method) { - if ($method['executableLines'] > 0) { - $this->numMethods++; - } - } - } - - foreach ($this->traits as $trait) { - foreach ($trait['methods'] as $method) { - if ($method['executableLines'] > 0) { - $this->numMethods++; - } - } - } - } - - return $this->numMethods; - } - - /** - * Returns the number of tested methods. - */ - public function getNumTestedMethods(): int - { - if ($this->numTestedMethods === null) { - $this->numTestedMethods = 0; - - foreach ($this->classes as $class) { - foreach ($class['methods'] as $method) { - if ($method['executableLines'] > 0 && - $method['coverage'] === 100) { - $this->numTestedMethods++; - } - } - } - - foreach ($this->traits as $trait) { - foreach ($trait['methods'] as $method) { - if ($method['executableLines'] > 0 && - $method['coverage'] === 100) { - $this->numTestedMethods++; - } - } - } - } - - return $this->numTestedMethods; - } - - /** - * Returns the number of functions. - */ - public function getNumFunctions(): int - { - return \count($this->functions); - } - - /** - * Returns the number of tested functions. - */ - public function getNumTestedFunctions(): int - { - if ($this->numTestedFunctions === null) { - $this->numTestedFunctions = 0; - - foreach ($this->functions as $function) { - if ($function['executableLines'] > 0 && - $function['coverage'] === 100) { - $this->numTestedFunctions++; - } - } - } - - return $this->numTestedFunctions; - } - - private function calculateStatistics(): void - { - if ($this->cacheTokens) { - $tokens = \PHP_Token_Stream_CachingFactory::get($this->getPath()); - } else { - $tokens = new \PHP_Token_Stream($this->getPath()); - } - - $this->linesOfCode = $tokens->getLinesOfCode(); - - foreach (\range(1, $this->linesOfCode['loc']) as $lineNumber) { - $this->codeUnitsByLine[$lineNumber] = []; - } - - try { - $this->processClasses($tokens); - $this->processTraits($tokens); - $this->processFunctions($tokens); - } catch (\OutOfBoundsException $e) { - // This can happen with PHP_Token_Stream if the file is syntactically invalid, - // and probably affects a file that wasn't executed. - } - unset($tokens); - - foreach (\range(1, $this->linesOfCode['loc']) as $lineNumber) { - if (isset($this->coverageData[$lineNumber])) { - foreach ($this->codeUnitsByLine[$lineNumber] as &$codeUnit) { - $codeUnit['executableLines']++; - } - - unset($codeUnit); - - $this->numExecutableLines++; - - if (\count($this->coverageData[$lineNumber]) > 0) { - foreach ($this->codeUnitsByLine[$lineNumber] as &$codeUnit) { - $codeUnit['executedLines']++; - } - - unset($codeUnit); - - $this->numExecutedLines++; - } - } - } - - foreach ($this->traits as &$trait) { - foreach ($trait['methods'] as &$method) { - if ($method['executableLines'] > 0) { - $method['coverage'] = ($method['executedLines'] / - $method['executableLines']) * 100; - } else { - $method['coverage'] = 100; - } - - $method['crap'] = $this->crap( - $method['ccn'], - $method['coverage'] - ); - - $trait['ccn'] += $method['ccn']; - } - - unset($method); - - if ($trait['executableLines'] > 0) { - $trait['coverage'] = ($trait['executedLines'] / - $trait['executableLines']) * 100; - - if ($trait['coverage'] === 100) { - $this->numTestedClasses++; - } - } else { - $trait['coverage'] = 100; - } - - $trait['crap'] = $this->crap( - $trait['ccn'], - $trait['coverage'] - ); - } - - unset($trait); - - foreach ($this->classes as &$class) { - foreach ($class['methods'] as &$method) { - if ($method['executableLines'] > 0) { - $method['coverage'] = ($method['executedLines'] / - $method['executableLines']) * 100; - } else { - $method['coverage'] = 100; - } - - $method['crap'] = $this->crap( - $method['ccn'], - $method['coverage'] - ); - - $class['ccn'] += $method['ccn']; - } - - unset($method); - - if ($class['executableLines'] > 0) { - $class['coverage'] = ($class['executedLines'] / - $class['executableLines']) * 100; - - if ($class['coverage'] === 100) { - $this->numTestedClasses++; - } - } else { - $class['coverage'] = 100; - } - - $class['crap'] = $this->crap( - $class['ccn'], - $class['coverage'] - ); - } - - unset($class); - - foreach ($this->functions as &$function) { - if ($function['executableLines'] > 0) { - $function['coverage'] = ($function['executedLines'] / - $function['executableLines']) * 100; - } else { - $function['coverage'] = 100; - } - - if ($function['coverage'] === 100) { - $this->numTestedFunctions++; - } - - $function['crap'] = $this->crap( - $function['ccn'], - $function['coverage'] - ); - } - } - - private function processClasses(\PHP_Token_Stream $tokens): void - { - $classes = $tokens->getClasses(); - $link = $this->getId() . '.html#'; - - foreach ($classes as $className => $class) { - if (\strpos($className, 'anonymous') === 0) { - continue; - } - - if (!empty($class['package']['namespace'])) { - $className = $class['package']['namespace'] . '\\' . $className; - } - - $this->classes[$className] = [ - 'className' => $className, - 'methods' => [], - 'startLine' => $class['startLine'], - 'executableLines' => 0, - 'executedLines' => 0, - 'ccn' => 0, - 'coverage' => 0, - 'crap' => 0, - 'package' => $class['package'], - 'link' => $link . $class['startLine'], - ]; - - foreach ($class['methods'] as $methodName => $method) { - if (\strpos($methodName, 'anonymous') === 0) { - continue; - } - - $this->classes[$className]['methods'][$methodName] = $this->newMethod($methodName, $method, $link); - - foreach (\range($method['startLine'], $method['endLine']) as $lineNumber) { - $this->codeUnitsByLine[$lineNumber] = [ - &$this->classes[$className], - &$this->classes[$className]['methods'][$methodName], - ]; - } - } - } - } - - private function processTraits(\PHP_Token_Stream $tokens): void - { - $traits = $tokens->getTraits(); - $link = $this->getId() . '.html#'; - - foreach ($traits as $traitName => $trait) { - $this->traits[$traitName] = [ - 'traitName' => $traitName, - 'methods' => [], - 'startLine' => $trait['startLine'], - 'executableLines' => 0, - 'executedLines' => 0, - 'ccn' => 0, - 'coverage' => 0, - 'crap' => 0, - 'package' => $trait['package'], - 'link' => $link . $trait['startLine'], - ]; - - foreach ($trait['methods'] as $methodName => $method) { - if (\strpos($methodName, 'anonymous') === 0) { - continue; - } - - $this->traits[$traitName]['methods'][$methodName] = $this->newMethod($methodName, $method, $link); - - foreach (\range($method['startLine'], $method['endLine']) as $lineNumber) { - $this->codeUnitsByLine[$lineNumber] = [ - &$this->traits[$traitName], - &$this->traits[$traitName]['methods'][$methodName], - ]; - } - } - } - } - - private function processFunctions(\PHP_Token_Stream $tokens): void - { - $functions = $tokens->getFunctions(); - $link = $this->getId() . '.html#'; - - foreach ($functions as $functionName => $function) { - if (\strpos($functionName, 'anonymous') === 0) { - continue; - } - - $this->functions[$functionName] = [ - 'functionName' => $functionName, - 'signature' => $function['signature'], - 'startLine' => $function['startLine'], - 'executableLines' => 0, - 'executedLines' => 0, - 'ccn' => $function['ccn'], - 'coverage' => 0, - 'crap' => 0, - 'link' => $link . $function['startLine'], - ]; - - foreach (\range($function['startLine'], $function['endLine']) as $lineNumber) { - $this->codeUnitsByLine[$lineNumber] = [&$this->functions[$functionName]]; - } - } - } - - private function crap(int $ccn, float $coverage): string - { - if ($coverage === 0.0) { - return (string) ($ccn ** 2 + $ccn); - } - - if ($coverage >= 95) { - return (string) $ccn; - } - - return \sprintf( - '%01.2F', - $ccn ** 2 * (1 - $coverage / 100) ** 3 + $ccn - ); - } - - private function newMethod(string $methodName, array $method, string $link): array - { - return [ - 'methodName' => $methodName, - 'visibility' => $method['visibility'], - 'signature' => $method['signature'], - 'startLine' => $method['startLine'], - 'endLine' => $method['endLine'], - 'executableLines' => 0, - 'executedLines' => 0, - 'ccn' => $method['ccn'], - 'coverage' => 0, - 'crap' => 0, - 'link' => $link . $method['startLine'], - ]; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Node/Iterator.php b/vendor/phpunit/php-code-coverage/src/Node/Iterator.php deleted file mode 100644 index f2dd9a7..0000000 --- a/vendor/phpunit/php-code-coverage/src/Node/Iterator.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Node; - -/** - * Recursive iterator for node object graphs. - */ -final class Iterator implements \RecursiveIterator -{ - /** - * @var int - */ - private $position; - - /** - * @var AbstractNode[] - */ - private $nodes; - - public function __construct(Directory $node) - { - $this->nodes = $node->getChildNodes(); - } - - /** - * Rewinds the Iterator to the first element. - */ - public function rewind(): void - { - $this->position = 0; - } - - /** - * Checks if there is a current element after calls to rewind() or next(). - */ - public function valid(): bool - { - return $this->position < \count($this->nodes); - } - - /** - * Returns the key of the current element. - */ - public function key(): int - { - return $this->position; - } - - /** - * Returns the current element. - */ - public function current(): AbstractNode - { - return $this->valid() ? $this->nodes[$this->position] : null; - } - - /** - * Moves forward to next element. - */ - public function next(): void - { - $this->position++; - } - - /** - * Returns the sub iterator for the current element. - * - * @return Iterator - */ - public function getChildren(): self - { - return new self($this->nodes[$this->position]); - } - - /** - * Checks whether the current element has children. - */ - public function hasChildren(): bool - { - return $this->nodes[$this->position] instanceof Directory; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Clover.php b/vendor/phpunit/php-code-coverage/src/Report/Clover.php deleted file mode 100644 index e0f893c..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Clover.php +++ /dev/null @@ -1,258 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Node\File; -use SebastianBergmann\CodeCoverage\RuntimeException; - -/** - * Generates a Clover XML logfile from a code coverage object. - */ -final class Clover -{ - /** - * @throws \RuntimeException - */ - public function process(CodeCoverage $coverage, ?string $target = null, ?string $name = null): string - { - $xmlDocument = new \DOMDocument('1.0', 'UTF-8'); - $xmlDocument->formatOutput = true; - - $xmlCoverage = $xmlDocument->createElement('coverage'); - $xmlCoverage->setAttribute('generated', (string) $_SERVER['REQUEST_TIME']); - $xmlDocument->appendChild($xmlCoverage); - - $xmlProject = $xmlDocument->createElement('project'); - $xmlProject->setAttribute('timestamp', (string) $_SERVER['REQUEST_TIME']); - - if (\is_string($name)) { - $xmlProject->setAttribute('name', $name); - } - - $xmlCoverage->appendChild($xmlProject); - - $packages = []; - $report = $coverage->getReport(); - - foreach ($report as $item) { - if (!$item instanceof File) { - continue; - } - - /* @var File $item */ - - $xmlFile = $xmlDocument->createElement('file'); - $xmlFile->setAttribute('name', $item->getPath()); - - $classes = $item->getClassesAndTraits(); - $coverageData = $item->getCoverageData(); - $lines = []; - $namespace = 'global'; - - foreach ($classes as $className => $class) { - $classStatements = 0; - $coveredClassStatements = 0; - $coveredMethods = 0; - $classMethods = 0; - - foreach ($class['methods'] as $methodName => $method) { - if ($method['executableLines'] == 0) { - continue; - } - - $classMethods++; - $classStatements += $method['executableLines']; - $coveredClassStatements += $method['executedLines']; - - if ($method['coverage'] == 100) { - $coveredMethods++; - } - - $methodCount = 0; - - foreach (\range($method['startLine'], $method['endLine']) as $line) { - if (isset($coverageData[$line]) && ($coverageData[$line] !== null)) { - $methodCount = \max($methodCount, \count($coverageData[$line])); - } - } - - $lines[$method['startLine']] = [ - 'ccn' => $method['ccn'], - 'count' => $methodCount, - 'crap' => $method['crap'], - 'type' => 'method', - 'visibility' => $method['visibility'], - 'name' => $methodName, - ]; - } - - if (!empty($class['package']['namespace'])) { - $namespace = $class['package']['namespace']; - } - - $xmlClass = $xmlDocument->createElement('class'); - $xmlClass->setAttribute('name', $className); - $xmlClass->setAttribute('namespace', $namespace); - - if (!empty($class['package']['fullPackage'])) { - $xmlClass->setAttribute( - 'fullPackage', - $class['package']['fullPackage'] - ); - } - - if (!empty($class['package']['category'])) { - $xmlClass->setAttribute( - 'category', - $class['package']['category'] - ); - } - - if (!empty($class['package']['package'])) { - $xmlClass->setAttribute( - 'package', - $class['package']['package'] - ); - } - - if (!empty($class['package']['subpackage'])) { - $xmlClass->setAttribute( - 'subpackage', - $class['package']['subpackage'] - ); - } - - $xmlFile->appendChild($xmlClass); - - $xmlMetrics = $xmlDocument->createElement('metrics'); - $xmlMetrics->setAttribute('complexity', (string) $class['ccn']); - $xmlMetrics->setAttribute('methods', (string) $classMethods); - $xmlMetrics->setAttribute('coveredmethods', (string) $coveredMethods); - $xmlMetrics->setAttribute('conditionals', '0'); - $xmlMetrics->setAttribute('coveredconditionals', '0'); - $xmlMetrics->setAttribute('statements', (string) $classStatements); - $xmlMetrics->setAttribute('coveredstatements', (string) $coveredClassStatements); - $xmlMetrics->setAttribute('elements', (string) ($classMethods + $classStatements /* + conditionals */)); - $xmlMetrics->setAttribute('coveredelements', (string) ($coveredMethods + $coveredClassStatements /* + coveredconditionals */)); - $xmlClass->appendChild($xmlMetrics); - } - - foreach ($coverageData as $line => $data) { - if ($data === null || isset($lines[$line])) { - continue; - } - - $lines[$line] = [ - 'count' => \count($data), 'type' => 'stmt', - ]; - } - - \ksort($lines); - - foreach ($lines as $line => $data) { - $xmlLine = $xmlDocument->createElement('line'); - $xmlLine->setAttribute('num', (string) $line); - $xmlLine->setAttribute('type', $data['type']); - - if (isset($data['name'])) { - $xmlLine->setAttribute('name', $data['name']); - } - - if (isset($data['visibility'])) { - $xmlLine->setAttribute('visibility', $data['visibility']); - } - - if (isset($data['ccn'])) { - $xmlLine->setAttribute('complexity', (string) $data['ccn']); - } - - if (isset($data['crap'])) { - $xmlLine->setAttribute('crap', (string) $data['crap']); - } - - $xmlLine->setAttribute('count', (string) $data['count']); - $xmlFile->appendChild($xmlLine); - } - - $linesOfCode = $item->getLinesOfCode(); - - $xmlMetrics = $xmlDocument->createElement('metrics'); - $xmlMetrics->setAttribute('loc', (string) $linesOfCode['loc']); - $xmlMetrics->setAttribute('ncloc', (string) $linesOfCode['ncloc']); - $xmlMetrics->setAttribute('classes', (string) $item->getNumClassesAndTraits()); - $xmlMetrics->setAttribute('methods', (string) $item->getNumMethods()); - $xmlMetrics->setAttribute('coveredmethods', (string) $item->getNumTestedMethods()); - $xmlMetrics->setAttribute('conditionals', '0'); - $xmlMetrics->setAttribute('coveredconditionals', '0'); - $xmlMetrics->setAttribute('statements', (string) $item->getNumExecutableLines()); - $xmlMetrics->setAttribute('coveredstatements', (string) $item->getNumExecutedLines()); - $xmlMetrics->setAttribute('elements', (string) ($item->getNumMethods() + $item->getNumExecutableLines() /* + conditionals */)); - $xmlMetrics->setAttribute('coveredelements', (string) ($item->getNumTestedMethods() + $item->getNumExecutedLines() /* + coveredconditionals */)); - $xmlFile->appendChild($xmlMetrics); - - if ($namespace === 'global') { - $xmlProject->appendChild($xmlFile); - } else { - if (!isset($packages[$namespace])) { - $packages[$namespace] = $xmlDocument->createElement( - 'package' - ); - - $packages[$namespace]->setAttribute('name', $namespace); - $xmlProject->appendChild($packages[$namespace]); - } - - $packages[$namespace]->appendChild($xmlFile); - } - } - - $linesOfCode = $report->getLinesOfCode(); - - $xmlMetrics = $xmlDocument->createElement('metrics'); - $xmlMetrics->setAttribute('files', (string) \count($report)); - $xmlMetrics->setAttribute('loc', (string) $linesOfCode['loc']); - $xmlMetrics->setAttribute('ncloc', (string) $linesOfCode['ncloc']); - $xmlMetrics->setAttribute('classes', (string) $report->getNumClassesAndTraits()); - $xmlMetrics->setAttribute('methods', (string) $report->getNumMethods()); - $xmlMetrics->setAttribute('coveredmethods', (string) $report->getNumTestedMethods()); - $xmlMetrics->setAttribute('conditionals', '0'); - $xmlMetrics->setAttribute('coveredconditionals', '0'); - $xmlMetrics->setAttribute('statements', (string) $report->getNumExecutableLines()); - $xmlMetrics->setAttribute('coveredstatements', (string) $report->getNumExecutedLines()); - $xmlMetrics->setAttribute('elements', (string) ($report->getNumMethods() + $report->getNumExecutableLines() /* + conditionals */)); - $xmlMetrics->setAttribute('coveredelements', (string) ($report->getNumTestedMethods() + $report->getNumExecutedLines() /* + coveredconditionals */)); - $xmlProject->appendChild($xmlMetrics); - - $buffer = $xmlDocument->saveXML(); - - if ($target !== null) { - if (!$this->createDirectory(\dirname($target))) { - throw new \RuntimeException(\sprintf('Directory "%s" was not created', \dirname($target))); - } - - if (@\file_put_contents($target, $buffer) === false) { - throw new RuntimeException( - \sprintf( - 'Could not write to "%s', - $target - ) - ); - } - } - - return $buffer; - } - - private function createDirectory(string $directory): bool - { - return !(!\is_dir($directory) && !@\mkdir($directory, 0777, true) && !\is_dir($directory)); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php b/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php deleted file mode 100644 index 6713be0..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php +++ /dev/null @@ -1,165 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Node\File; -use SebastianBergmann\CodeCoverage\RuntimeException; - -final class Crap4j -{ - /** - * @var int - */ - private $threshold; - - public function __construct(int $threshold = 30) - { - $this->threshold = $threshold; - } - - /** - * @throws \RuntimeException - */ - public function process(CodeCoverage $coverage, ?string $target = null, ?string $name = null): string - { - $document = new \DOMDocument('1.0', 'UTF-8'); - $document->formatOutput = true; - - $root = $document->createElement('crap_result'); - $document->appendChild($root); - - $project = $document->createElement('project', \is_string($name) ? $name : ''); - $root->appendChild($project); - $root->appendChild($document->createElement('timestamp', \date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']))); - - $stats = $document->createElement('stats'); - $methodsNode = $document->createElement('methods'); - - $report = $coverage->getReport(); - unset($coverage); - - $fullMethodCount = 0; - $fullCrapMethodCount = 0; - $fullCrapLoad = 0; - $fullCrap = 0; - - foreach ($report as $item) { - $namespace = 'global'; - - if (!$item instanceof File) { - continue; - } - - $file = $document->createElement('file'); - $file->setAttribute('name', $item->getPath()); - - $classes = $item->getClassesAndTraits(); - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - $crapLoad = $this->getCrapLoad($method['crap'], $method['ccn'], $method['coverage']); - - $fullCrap += $method['crap']; - $fullCrapLoad += $crapLoad; - $fullMethodCount++; - - if ($method['crap'] >= $this->threshold) { - $fullCrapMethodCount++; - } - - $methodNode = $document->createElement('method'); - - if (!empty($class['package']['namespace'])) { - $namespace = $class['package']['namespace']; - } - - $methodNode->appendChild($document->createElement('package', $namespace)); - $methodNode->appendChild($document->createElement('className', $className)); - $methodNode->appendChild($document->createElement('methodName', $methodName)); - $methodNode->appendChild($document->createElement('methodSignature', \htmlspecialchars($method['signature']))); - $methodNode->appendChild($document->createElement('fullMethod', \htmlspecialchars($method['signature']))); - $methodNode->appendChild($document->createElement('crap', (string) $this->roundValue($method['crap']))); - $methodNode->appendChild($document->createElement('complexity', (string) $method['ccn'])); - $methodNode->appendChild($document->createElement('coverage', (string) $this->roundValue($method['coverage']))); - $methodNode->appendChild($document->createElement('crapLoad', (string) \round($crapLoad))); - - $methodsNode->appendChild($methodNode); - } - } - } - - $stats->appendChild($document->createElement('name', 'Method Crap Stats')); - $stats->appendChild($document->createElement('methodCount', (string) $fullMethodCount)); - $stats->appendChild($document->createElement('crapMethodCount', (string) $fullCrapMethodCount)); - $stats->appendChild($document->createElement('crapLoad', (string) \round($fullCrapLoad))); - $stats->appendChild($document->createElement('totalCrap', (string) $fullCrap)); - - $crapMethodPercent = 0; - - if ($fullMethodCount > 0) { - $crapMethodPercent = $this->roundValue((100 * $fullCrapMethodCount) / $fullMethodCount); - } - - $stats->appendChild($document->createElement('crapMethodPercent', (string) $crapMethodPercent)); - - $root->appendChild($stats); - $root->appendChild($methodsNode); - - $buffer = $document->saveXML(); - - if ($target !== null) { - if (!$this->createDirectory(\dirname($target))) { - throw new \RuntimeException(\sprintf('Directory "%s" was not created', \dirname($target))); - } - - if (@\file_put_contents($target, $buffer) === false) { - throw new RuntimeException( - \sprintf( - 'Could not write to "%s', - $target - ) - ); - } - } - - return $buffer; - } - - /** - * @param float $crapValue - * @param int $cyclomaticComplexity - * @param float $coveragePercent - */ - private function getCrapLoad($crapValue, $cyclomaticComplexity, $coveragePercent): float - { - $crapLoad = 0; - - if ($crapValue >= $this->threshold) { - $crapLoad += $cyclomaticComplexity * (1.0 - $coveragePercent / 100); - $crapLoad += $cyclomaticComplexity / $this->threshold; - } - - return $crapLoad; - } - - /** - * @param float $value - */ - private function roundValue($value): float - { - return \round($value, 2); - } - - private function createDirectory(string $directory): bool - { - return !(!\is_dir($directory) && !@\mkdir($directory, 0777, true) && !\is_dir($directory)); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php deleted file mode 100644 index 318b49a..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php +++ /dev/null @@ -1,167 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; -use SebastianBergmann\CodeCoverage\RuntimeException; - -/** - * Generates an HTML report from a code coverage object. - */ -final class Facade -{ - /** - * @var string - */ - private $templatePath; - - /** - * @var string - */ - private $generator; - - /** - * @var int - */ - private $lowUpperBound; - - /** - * @var int - */ - private $highLowerBound; - - public function __construct(int $lowUpperBound = 50, int $highLowerBound = 90, string $generator = '') - { - $this->generator = $generator; - $this->highLowerBound = $highLowerBound; - $this->lowUpperBound = $lowUpperBound; - $this->templatePath = __DIR__ . '/Renderer/Template/'; - } - - /** - * @throws RuntimeException - * @throws \InvalidArgumentException - * @throws \RuntimeException - */ - public function process(CodeCoverage $coverage, string $target): void - { - $target = $this->getDirectory($target); - $report = $coverage->getReport(); - - if (!isset($_SERVER['REQUEST_TIME'])) { - $_SERVER['REQUEST_TIME'] = \time(); - } - - $date = \date('D M j G:i:s T Y', $_SERVER['REQUEST_TIME']); - - $dashboard = new Dashboard( - $this->templatePath, - $this->generator, - $date, - $this->lowUpperBound, - $this->highLowerBound - ); - - $directory = new Directory( - $this->templatePath, - $this->generator, - $date, - $this->lowUpperBound, - $this->highLowerBound - ); - - $file = new File( - $this->templatePath, - $this->generator, - $date, - $this->lowUpperBound, - $this->highLowerBound - ); - - $directory->render($report, $target . 'index.html'); - $dashboard->render($report, $target . 'dashboard.html'); - - foreach ($report as $node) { - $id = $node->getId(); - - if ($node instanceof DirectoryNode) { - if (!$this->createDirectory($target . $id)) { - throw new \RuntimeException(\sprintf('Directory "%s" was not created', $target . $id)); - } - - $directory->render($node, $target . $id . '/index.html'); - $dashboard->render($node, $target . $id . '/dashboard.html'); - } else { - $dir = \dirname($target . $id); - - if (!$this->createDirectory($dir)) { - throw new \RuntimeException(\sprintf('Directory "%s" was not created', $dir)); - } - - $file->render($node, $target . $id . '.html'); - } - } - - $this->copyFiles($target); - } - - /** - * @throws RuntimeException - */ - private function copyFiles(string $target): void - { - $dir = $this->getDirectory($target . '_css'); - - \copy($this->templatePath . 'css/bootstrap.min.css', $dir . 'bootstrap.min.css'); - \copy($this->templatePath . 'css/nv.d3.min.css', $dir . 'nv.d3.min.css'); - \copy($this->templatePath . 'css/style.css', $dir . 'style.css'); - \copy($this->templatePath . 'css/custom.css', $dir . 'custom.css'); - \copy($this->templatePath . 'css/octicons.css', $dir . 'octicons.css'); - - $dir = $this->getDirectory($target . '_icons'); - \copy($this->templatePath . 'icons/file-code.svg', $dir . 'file-code.svg'); - \copy($this->templatePath . 'icons/file-directory.svg', $dir . 'file-directory.svg'); - - $dir = $this->getDirectory($target . '_js'); - \copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js'); - \copy($this->templatePath . 'js/popper.min.js', $dir . 'popper.min.js'); - \copy($this->templatePath . 'js/d3.min.js', $dir . 'd3.min.js'); - \copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js'); - \copy($this->templatePath . 'js/nv.d3.min.js', $dir . 'nv.d3.min.js'); - \copy($this->templatePath . 'js/file.js', $dir . 'file.js'); - } - - /** - * @throws RuntimeException - */ - private function getDirectory(string $directory): string - { - if (\substr($directory, -1, 1) != \DIRECTORY_SEPARATOR) { - $directory .= \DIRECTORY_SEPARATOR; - } - - if (!$this->createDirectory($directory)) { - throw new RuntimeException( - \sprintf( - 'Directory "%s" does not exist.', - $directory - ) - ); - } - - return $directory; - } - - private function createDirectory(string $directory): bool - { - return !(!\is_dir($directory) && !@\mkdir($directory, 0777, true) && !\is_dir($directory)); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php deleted file mode 100644 index 2a9024c..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php +++ /dev/null @@ -1,277 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use SebastianBergmann\CodeCoverage\Node\AbstractNode; -use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; -use SebastianBergmann\CodeCoverage\Node\File as FileNode; -use SebastianBergmann\CodeCoverage\Version; -use SebastianBergmann\Environment\Runtime; - -/** - * Base class for node renderers. - */ -abstract class Renderer -{ - /** - * @var string - */ - protected $templatePath; - - /** - * @var string - */ - protected $generator; - - /** - * @var string - */ - protected $date; - - /** - * @var int - */ - protected $lowUpperBound; - - /** - * @var int - */ - protected $highLowerBound; - - /** - * @var string - */ - protected $version; - - public function __construct(string $templatePath, string $generator, string $date, int $lowUpperBound, int $highLowerBound) - { - $this->templatePath = $templatePath; - $this->generator = $generator; - $this->date = $date; - $this->lowUpperBound = $lowUpperBound; - $this->highLowerBound = $highLowerBound; - $this->version = Version::id(); - } - - protected function renderItemTemplate(\Text_Template $template, array $data): string - { - $numSeparator = ' / '; - - if (isset($data['numClasses']) && $data['numClasses'] > 0) { - $classesLevel = $this->getColorLevel($data['testedClassesPercent']); - - $classesNumber = $data['numTestedClasses'] . $numSeparator . - $data['numClasses']; - - $classesBar = $this->getCoverageBar( - $data['testedClassesPercent'] - ); - } else { - $classesLevel = ''; - $classesNumber = '0' . $numSeparator . '0'; - $classesBar = ''; - $data['testedClassesPercentAsString'] = 'n/a'; - } - - if ($data['numMethods'] > 0) { - $methodsLevel = $this->getColorLevel($data['testedMethodsPercent']); - - $methodsNumber = $data['numTestedMethods'] . $numSeparator . - $data['numMethods']; - - $methodsBar = $this->getCoverageBar( - $data['testedMethodsPercent'] - ); - } else { - $methodsLevel = ''; - $methodsNumber = '0' . $numSeparator . '0'; - $methodsBar = ''; - $data['testedMethodsPercentAsString'] = 'n/a'; - } - - if ($data['numExecutableLines'] > 0) { - $linesLevel = $this->getColorLevel($data['linesExecutedPercent']); - - $linesNumber = $data['numExecutedLines'] . $numSeparator . - $data['numExecutableLines']; - - $linesBar = $this->getCoverageBar( - $data['linesExecutedPercent'] - ); - } else { - $linesLevel = ''; - $linesNumber = '0' . $numSeparator . '0'; - $linesBar = ''; - $data['linesExecutedPercentAsString'] = 'n/a'; - } - - $template->setVar( - [ - 'icon' => $data['icon'] ?? '', - 'crap' => $data['crap'] ?? '', - 'name' => $data['name'], - 'lines_bar' => $linesBar, - 'lines_executed_percent' => $data['linesExecutedPercentAsString'], - 'lines_level' => $linesLevel, - 'lines_number' => $linesNumber, - 'methods_bar' => $methodsBar, - 'methods_tested_percent' => $data['testedMethodsPercentAsString'], - 'methods_level' => $methodsLevel, - 'methods_number' => $methodsNumber, - 'classes_bar' => $classesBar, - 'classes_tested_percent' => $data['testedClassesPercentAsString'] ?? '', - 'classes_level' => $classesLevel, - 'classes_number' => $classesNumber, - ] - ); - - return $template->render(); - } - - protected function setCommonTemplateVariables(\Text_Template $template, AbstractNode $node): void - { - $template->setVar( - [ - 'id' => $node->getId(), - 'full_path' => $node->getPath(), - 'path_to_root' => $this->getPathToRoot($node), - 'breadcrumbs' => $this->getBreadcrumbs($node), - 'date' => $this->date, - 'version' => $this->version, - 'runtime' => $this->getRuntimeString(), - 'generator' => $this->generator, - 'low_upper_bound' => $this->lowUpperBound, - 'high_lower_bound' => $this->highLowerBound, - ] - ); - } - - protected function getBreadcrumbs(AbstractNode $node): string - { - $breadcrumbs = ''; - $path = $node->getPathAsArray(); - $pathToRoot = []; - $max = \count($path); - - if ($node instanceof FileNode) { - $max--; - } - - for ($i = 0; $i < $max; $i++) { - $pathToRoot[] = \str_repeat('../', $i); - } - - foreach ($path as $step) { - if ($step !== $node) { - $breadcrumbs .= $this->getInactiveBreadcrumb( - $step, - \array_pop($pathToRoot) - ); - } else { - $breadcrumbs .= $this->getActiveBreadcrumb($step); - } - } - - return $breadcrumbs; - } - - protected function getActiveBreadcrumb(AbstractNode $node): string - { - $buffer = \sprintf( - ' ' . "\n", - $node->getName() - ); - - if ($node instanceof DirectoryNode) { - $buffer .= ' ' . "\n"; - } - - return $buffer; - } - - protected function getInactiveBreadcrumb(AbstractNode $node, string $pathToRoot): string - { - return \sprintf( - ' ' . "\n", - $pathToRoot, - $node->getName() - ); - } - - protected function getPathToRoot(AbstractNode $node): string - { - $id = $node->getId(); - $depth = \substr_count($id, '/'); - - if ($id !== 'index' && - $node instanceof DirectoryNode) { - $depth++; - } - - return \str_repeat('../', $depth); - } - - protected function getCoverageBar(float $percent): string - { - $level = $this->getColorLevel($percent); - - $template = new \Text_Template( - $this->templatePath . 'coverage_bar.html', - '{{', - '}}' - ); - - $template->setVar(['level' => $level, 'percent' => \sprintf('%.2F', $percent)]); - - return $template->render(); - } - - protected function getColorLevel(float $percent): string - { - if ($percent <= $this->lowUpperBound) { - return 'danger'; - } - - if ($percent > $this->lowUpperBound && - $percent < $this->highLowerBound) { - return 'warning'; - } - - return 'success'; - } - - private function getRuntimeString(): string - { - $runtime = new Runtime; - - $buffer = \sprintf( - '%s %s', - $runtime->getVendorUrl(), - $runtime->getName(), - $runtime->getVersion() - ); - - if ($runtime->hasXdebug() && !$runtime->hasPHPDBGCodeCoverage()) { - $buffer .= \sprintf( - ' with Xdebug %s', - \phpversion('xdebug') - ); - } - - if ($runtime->hasPCOV() && !$runtime->hasPHPDBGCodeCoverage()) { - $buffer .= \sprintf( - ' with PCOV %s', - \phpversion('pcov') - ); - } - - return $buffer; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php deleted file mode 100644 index cc801b6..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php +++ /dev/null @@ -1,281 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use SebastianBergmann\CodeCoverage\Node\AbstractNode; -use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; - -/** - * Renders the dashboard for a directory node. - */ -final class Dashboard extends Renderer -{ - /** - * @throws \InvalidArgumentException - * @throws \RuntimeException - */ - public function render(DirectoryNode $node, string $file): void - { - $classes = $node->getClassesAndTraits(); - $template = new \Text_Template( - $this->templatePath . 'dashboard.html', - '{{', - '}}' - ); - - $this->setCommonTemplateVariables($template, $node); - - $baseLink = $node->getId() . '/'; - $complexity = $this->complexity($classes, $baseLink); - $coverageDistribution = $this->coverageDistribution($classes); - $insufficientCoverage = $this->insufficientCoverage($classes, $baseLink); - $projectRisks = $this->projectRisks($classes, $baseLink); - - $template->setVar( - [ - 'insufficient_coverage_classes' => $insufficientCoverage['class'], - 'insufficient_coverage_methods' => $insufficientCoverage['method'], - 'project_risks_classes' => $projectRisks['class'], - 'project_risks_methods' => $projectRisks['method'], - 'complexity_class' => $complexity['class'], - 'complexity_method' => $complexity['method'], - 'class_coverage_distribution' => $coverageDistribution['class'], - 'method_coverage_distribution' => $coverageDistribution['method'], - ] - ); - - $template->renderTo($file); - } - - /** - * Returns the data for the Class/Method Complexity charts. - */ - protected function complexity(array $classes, string $baseLink): array - { - $result = ['class' => [], 'method' => []]; - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($className !== '*') { - $methodName = $className . '::' . $methodName; - } - - $result['method'][] = [ - $method['coverage'], - $method['ccn'], - \sprintf( - '%s', - \str_replace($baseLink, '', $method['link']), - $methodName - ), - ]; - } - - $result['class'][] = [ - $class['coverage'], - $class['ccn'], - \sprintf( - '%s', - \str_replace($baseLink, '', $class['link']), - $className - ), - ]; - } - - return [ - 'class' => \json_encode($result['class']), - 'method' => \json_encode($result['method']), - ]; - } - - /** - * Returns the data for the Class / Method Coverage Distribution chart. - */ - protected function coverageDistribution(array $classes): array - { - $result = [ - 'class' => [ - '0%' => 0, - '0-10%' => 0, - '10-20%' => 0, - '20-30%' => 0, - '30-40%' => 0, - '40-50%' => 0, - '50-60%' => 0, - '60-70%' => 0, - '70-80%' => 0, - '80-90%' => 0, - '90-100%' => 0, - '100%' => 0, - ], - 'method' => [ - '0%' => 0, - '0-10%' => 0, - '10-20%' => 0, - '20-30%' => 0, - '30-40%' => 0, - '40-50%' => 0, - '50-60%' => 0, - '60-70%' => 0, - '70-80%' => 0, - '80-90%' => 0, - '90-100%' => 0, - '100%' => 0, - ], - ]; - - foreach ($classes as $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($method['coverage'] === 0) { - $result['method']['0%']++; - } elseif ($method['coverage'] === 100) { - $result['method']['100%']++; - } else { - $key = \floor($method['coverage'] / 10) * 10; - $key = $key . '-' . ($key + 10) . '%'; - $result['method'][$key]++; - } - } - - if ($class['coverage'] === 0) { - $result['class']['0%']++; - } elseif ($class['coverage'] === 100) { - $result['class']['100%']++; - } else { - $key = \floor($class['coverage'] / 10) * 10; - $key = $key . '-' . ($key + 10) . '%'; - $result['class'][$key]++; - } - } - - return [ - 'class' => \json_encode(\array_values($result['class'])), - 'method' => \json_encode(\array_values($result['method'])), - ]; - } - - /** - * Returns the classes / methods with insufficient coverage. - */ - protected function insufficientCoverage(array $classes, string $baseLink): array - { - $leastTestedClasses = []; - $leastTestedMethods = []; - $result = ['class' => '', 'method' => '']; - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($method['coverage'] < $this->highLowerBound) { - $key = $methodName; - - if ($className !== '*') { - $key = $className . '::' . $methodName; - } - - $leastTestedMethods[$key] = $method['coverage']; - } - } - - if ($class['coverage'] < $this->highLowerBound) { - $leastTestedClasses[$className] = $class['coverage']; - } - } - - \asort($leastTestedClasses); - \asort($leastTestedMethods); - - foreach ($leastTestedClasses as $className => $coverage) { - $result['class'] .= \sprintf( - ' ' . "\n", - \str_replace($baseLink, '', $classes[$className]['link']), - $className, - $coverage - ); - } - - foreach ($leastTestedMethods as $methodName => $coverage) { - [$class, $method] = \explode('::', $methodName); - - $result['method'] .= \sprintf( - ' ' . "\n", - \str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), - $methodName, - $method, - $coverage - ); - } - - return $result; - } - - /** - * Returns the project risks according to the CRAP index. - */ - protected function projectRisks(array $classes, string $baseLink): array - { - $classRisks = []; - $methodRisks = []; - $result = ['class' => '', 'method' => '']; - - foreach ($classes as $className => $class) { - foreach ($class['methods'] as $methodName => $method) { - if ($method['coverage'] < $this->highLowerBound && $method['ccn'] > 1) { - $key = $methodName; - - if ($className !== '*') { - $key = $className . '::' . $methodName; - } - - $methodRisks[$key] = $method['crap']; - } - } - - if ($class['coverage'] < $this->highLowerBound && - $class['ccn'] > \count($class['methods'])) { - $classRisks[$className] = $class['crap']; - } - } - - \arsort($classRisks); - \arsort($methodRisks); - - foreach ($classRisks as $className => $crap) { - $result['class'] .= \sprintf( - ' ' . "\n", - \str_replace($baseLink, '', $classes[$className]['link']), - $className, - $crap - ); - } - - foreach ($methodRisks as $methodName => $crap) { - [$class, $method] = \explode('::', $methodName); - - $result['method'] .= \sprintf( - ' ' . "\n", - \str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), - $methodName, - $method, - $crap - ); - } - - return $result; - } - - protected function getActiveBreadcrumb(AbstractNode $node): string - { - return \sprintf( - ' ' . "\n" . - ' ' . "\n", - $node->getName() - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php deleted file mode 100644 index c2f0860..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use SebastianBergmann\CodeCoverage\Node\AbstractNode as Node; -use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; - -/** - * Renders a directory node. - */ -final class Directory extends Renderer -{ - /** - * @throws \InvalidArgumentException - * @throws \RuntimeException - */ - public function render(DirectoryNode $node, string $file): void - { - $template = new \Text_Template($this->templatePath . 'directory.html', '{{', '}}'); - - $this->setCommonTemplateVariables($template, $node); - - $items = $this->renderItem($node, true); - - foreach ($node->getDirectories() as $item) { - $items .= $this->renderItem($item); - } - - foreach ($node->getFiles() as $item) { - $items .= $this->renderItem($item); - } - - $template->setVar( - [ - 'id' => $node->getId(), - 'items' => $items, - ] - ); - - $template->renderTo($file); - } - - protected function renderItem(Node $node, bool $total = false): string - { - $data = [ - 'numClasses' => $node->getNumClassesAndTraits(), - 'numTestedClasses' => $node->getNumTestedClassesAndTraits(), - 'numMethods' => $node->getNumFunctionsAndMethods(), - 'numTestedMethods' => $node->getNumTestedFunctionsAndMethods(), - 'linesExecutedPercent' => $node->getLineExecutedPercent(false), - 'linesExecutedPercentAsString' => $node->getLineExecutedPercent(), - 'numExecutedLines' => $node->getNumExecutedLines(), - 'numExecutableLines' => $node->getNumExecutableLines(), - 'testedMethodsPercent' => $node->getTestedFunctionsAndMethodsPercent(false), - 'testedMethodsPercentAsString' => $node->getTestedFunctionsAndMethodsPercent(), - 'testedClassesPercent' => $node->getTestedClassesAndTraitsPercent(false), - 'testedClassesPercentAsString' => $node->getTestedClassesAndTraitsPercent(), - ]; - - if ($total) { - $data['name'] = 'Total'; - } else { - if ($node instanceof DirectoryNode) { - $data['name'] = \sprintf( - '%s', - $node->getName(), - $node->getName() - ); - - $up = \str_repeat('../', \count($node->getPathAsArray()) - 2); - - $data['icon'] = \sprintf('', $up); - } else { - $data['name'] = \sprintf( - '%s', - $node->getName(), - $node->getName() - ); - - $up = \str_repeat('../', \count($node->getPathAsArray()) - 2); - - $data['icon'] = \sprintf('', $up); - } - } - - return $this->renderItemTemplate( - new \Text_Template($this->templatePath . 'directory_item.html', '{{', '}}'), - $data - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php deleted file mode 100644 index f0604bf..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php +++ /dev/null @@ -1,529 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use SebastianBergmann\CodeCoverage\Node\File as FileNode; -use SebastianBergmann\CodeCoverage\Util; - -/** - * Renders a file node. - */ -final class File extends Renderer -{ - /** - * @var int - */ - private $htmlSpecialCharsFlags = \ENT_COMPAT | \ENT_HTML401 | \ENT_SUBSTITUTE; - - /** - * @throws \RuntimeException - */ - public function render(FileNode $node, string $file): void - { - $template = new \Text_Template($this->templatePath . 'file.html', '{{', '}}'); - - $template->setVar( - [ - 'items' => $this->renderItems($node), - 'lines' => $this->renderSource($node), - ] - ); - - $this->setCommonTemplateVariables($template, $node); - - $template->renderTo($file); - } - - protected function renderItems(FileNode $node): string - { - $template = new \Text_Template($this->templatePath . 'file_item.html', '{{', '}}'); - - $methodItemTemplate = new \Text_Template( - $this->templatePath . 'method_item.html', - '{{', - '}}' - ); - - $items = $this->renderItemTemplate( - $template, - [ - 'name' => 'Total', - 'numClasses' => $node->getNumClassesAndTraits(), - 'numTestedClasses' => $node->getNumTestedClassesAndTraits(), - 'numMethods' => $node->getNumFunctionsAndMethods(), - 'numTestedMethods' => $node->getNumTestedFunctionsAndMethods(), - 'linesExecutedPercent' => $node->getLineExecutedPercent(false), - 'linesExecutedPercentAsString' => $node->getLineExecutedPercent(), - 'numExecutedLines' => $node->getNumExecutedLines(), - 'numExecutableLines' => $node->getNumExecutableLines(), - 'testedMethodsPercent' => $node->getTestedFunctionsAndMethodsPercent(false), - 'testedMethodsPercentAsString' => $node->getTestedFunctionsAndMethodsPercent(), - 'testedClassesPercent' => $node->getTestedClassesAndTraitsPercent(false), - 'testedClassesPercentAsString' => $node->getTestedClassesAndTraitsPercent(), - 'crap' => 'CRAP', - ] - ); - - $items .= $this->renderFunctionItems( - $node->getFunctions(), - $methodItemTemplate - ); - - $items .= $this->renderTraitOrClassItems( - $node->getTraits(), - $template, - $methodItemTemplate - ); - - $items .= $this->renderTraitOrClassItems( - $node->getClasses(), - $template, - $methodItemTemplate - ); - - return $items; - } - - protected function renderTraitOrClassItems(array $items, \Text_Template $template, \Text_Template $methodItemTemplate): string - { - $buffer = ''; - - if (empty($items)) { - return $buffer; - } - - foreach ($items as $name => $item) { - $numMethods = 0; - $numTestedMethods = 0; - - foreach ($item['methods'] as $method) { - if ($method['executableLines'] > 0) { - $numMethods++; - - if ($method['executedLines'] === $method['executableLines']) { - $numTestedMethods++; - } - } - } - - if ($item['executableLines'] > 0) { - $numClasses = 1; - $numTestedClasses = $numTestedMethods == $numMethods ? 1 : 0; - $linesExecutedPercentAsString = Util::percent( - $item['executedLines'], - $item['executableLines'], - true - ); - } else { - $numClasses = 'n/a'; - $numTestedClasses = 'n/a'; - $linesExecutedPercentAsString = 'n/a'; - } - - $buffer .= $this->renderItemTemplate( - $template, - [ - 'name' => $this->abbreviateClassName($name), - 'numClasses' => $numClasses, - 'numTestedClasses' => $numTestedClasses, - 'numMethods' => $numMethods, - 'numTestedMethods' => $numTestedMethods, - 'linesExecutedPercent' => Util::percent( - $item['executedLines'], - $item['executableLines'], - false - ), - 'linesExecutedPercentAsString' => $linesExecutedPercentAsString, - 'numExecutedLines' => $item['executedLines'], - 'numExecutableLines' => $item['executableLines'], - 'testedMethodsPercent' => Util::percent( - $numTestedMethods, - $numMethods - ), - 'testedMethodsPercentAsString' => Util::percent( - $numTestedMethods, - $numMethods, - true - ), - 'testedClassesPercent' => Util::percent( - $numTestedMethods == $numMethods ? 1 : 0, - 1 - ), - 'testedClassesPercentAsString' => Util::percent( - $numTestedMethods == $numMethods ? 1 : 0, - 1, - true - ), - 'crap' => $item['crap'], - ] - ); - - foreach ($item['methods'] as $method) { - $buffer .= $this->renderFunctionOrMethodItem( - $methodItemTemplate, - $method, - ' ' - ); - } - } - - return $buffer; - } - - protected function renderFunctionItems(array $functions, \Text_Template $template): string - { - if (empty($functions)) { - return ''; - } - - $buffer = ''; - - foreach ($functions as $function) { - $buffer .= $this->renderFunctionOrMethodItem( - $template, - $function - ); - } - - return $buffer; - } - - protected function renderFunctionOrMethodItem(\Text_Template $template, array $item, string $indent = ''): string - { - $numMethods = 0; - $numTestedMethods = 0; - - if ($item['executableLines'] > 0) { - $numMethods = 1; - - if ($item['executedLines'] === $item['executableLines']) { - $numTestedMethods = 1; - } - } - - return $this->renderItemTemplate( - $template, - [ - 'name' => \sprintf( - '%s%s', - $indent, - $item['startLine'], - \htmlspecialchars($item['signature'], $this->htmlSpecialCharsFlags), - $item['functionName'] ?? $item['methodName'] - ), - 'numMethods' => $numMethods, - 'numTestedMethods' => $numTestedMethods, - 'linesExecutedPercent' => Util::percent( - $item['executedLines'], - $item['executableLines'] - ), - 'linesExecutedPercentAsString' => Util::percent( - $item['executedLines'], - $item['executableLines'], - true - ), - 'numExecutedLines' => $item['executedLines'], - 'numExecutableLines' => $item['executableLines'], - 'testedMethodsPercent' => Util::percent( - $numTestedMethods, - 1 - ), - 'testedMethodsPercentAsString' => Util::percent( - $numTestedMethods, - 1, - true - ), - 'crap' => $item['crap'], - ] - ); - } - - protected function renderSource(FileNode $node): string - { - $coverageData = $node->getCoverageData(); - $testData = $node->getTestData(); - $codeLines = $this->loadFile($node->getPath()); - $lines = ''; - $i = 1; - - foreach ($codeLines as $line) { - $trClass = ''; - $popoverContent = ''; - $popoverTitle = ''; - - if (\array_key_exists($i, $coverageData)) { - $numTests = ($coverageData[$i] ? \count($coverageData[$i]) : 0); - - if ($coverageData[$i] === null) { - $trClass = ' class="warning"'; - } elseif ($numTests == 0) { - $trClass = ' class="danger"'; - } else { - $lineCss = 'covered-by-large-tests'; - $popoverContent = '
    '; - - if ($numTests > 1) { - $popoverTitle = $numTests . ' tests cover line ' . $i; - } else { - $popoverTitle = '1 test covers line ' . $i; - } - - foreach ($coverageData[$i] as $test) { - if ($lineCss == 'covered-by-large-tests' && $testData[$test]['size'] == 'medium') { - $lineCss = 'covered-by-medium-tests'; - } elseif ($testData[$test]['size'] == 'small') { - $lineCss = 'covered-by-small-tests'; - } - - switch ($testData[$test]['status']) { - case 0: - switch ($testData[$test]['size']) { - case 'small': - $testCSS = ' class="covered-by-small-tests"'; - - break; - - case 'medium': - $testCSS = ' class="covered-by-medium-tests"'; - - break; - - default: - $testCSS = ' class="covered-by-large-tests"'; - - break; - } - - break; - - case 1: - case 2: - $testCSS = ' class="warning"'; - - break; - - case 3: - $testCSS = ' class="danger"'; - - break; - - case 4: - $testCSS = ' class="danger"'; - - break; - - default: - $testCSS = ''; - } - - $popoverContent .= \sprintf( - '%s', - $testCSS, - \htmlspecialchars($test, $this->htmlSpecialCharsFlags) - ); - } - - $popoverContent .= '
'; - $trClass = ' class="' . $lineCss . ' popin"'; - } - } - - $popover = ''; - - if (!empty($popoverTitle)) { - $popover = \sprintf( - ' data-title="%s" data-content="%s" data-placement="top" data-html="true"', - $popoverTitle, - \htmlspecialchars($popoverContent, $this->htmlSpecialCharsFlags) - ); - } - - $lines .= \sprintf( - ' ' . "\n", - $trClass, - $popover, - $i, - $i, - $i, - $line - ); - - $i++; - } - - return $lines; - } - - /** - * @param string $file - */ - protected function loadFile($file): array - { - $buffer = \file_get_contents($file); - $tokens = \token_get_all($buffer); - $result = ['']; - $i = 0; - $stringFlag = false; - $fileEndsWithNewLine = \substr($buffer, -1) == "\n"; - - unset($buffer); - - foreach ($tokens as $j => $token) { - if (\is_string($token)) { - if ($token === '"' && $tokens[$j - 1] !== '\\') { - $result[$i] .= \sprintf( - '%s', - \htmlspecialchars($token, $this->htmlSpecialCharsFlags) - ); - - $stringFlag = !$stringFlag; - } else { - $result[$i] .= \sprintf( - '%s', - \htmlspecialchars($token, $this->htmlSpecialCharsFlags) - ); - } - - continue; - } - - [$token, $value] = $token; - - $value = \str_replace( - ["\t", ' '], - ['    ', ' '], - \htmlspecialchars($value, $this->htmlSpecialCharsFlags) - ); - - if ($value === "\n") { - $result[++$i] = ''; - } else { - $lines = \explode("\n", $value); - - foreach ($lines as $jj => $line) { - $line = \trim($line); - - if ($line !== '') { - if ($stringFlag) { - $colour = 'string'; - } else { - switch ($token) { - case \T_INLINE_HTML: - $colour = 'html'; - - break; - - case \T_COMMENT: - case \T_DOC_COMMENT: - $colour = 'comment'; - - break; - - case \T_ABSTRACT: - case \T_ARRAY: - case \T_AS: - case \T_BREAK: - case \T_CALLABLE: - case \T_CASE: - case \T_CATCH: - case \T_CLASS: - case \T_CLONE: - case \T_CONTINUE: - case \T_DEFAULT: - case \T_ECHO: - case \T_ELSE: - case \T_ELSEIF: - case \T_EMPTY: - case \T_ENDDECLARE: - case \T_ENDFOR: - case \T_ENDFOREACH: - case \T_ENDIF: - case \T_ENDSWITCH: - case \T_ENDWHILE: - case \T_EXIT: - case \T_EXTENDS: - case \T_FINAL: - case \T_FINALLY: - case \T_FOREACH: - case \T_FUNCTION: - case \T_GLOBAL: - case \T_IF: - case \T_IMPLEMENTS: - case \T_INCLUDE: - case \T_INCLUDE_ONCE: - case \T_INSTANCEOF: - case \T_INSTEADOF: - case \T_INTERFACE: - case \T_ISSET: - case \T_LOGICAL_AND: - case \T_LOGICAL_OR: - case \T_LOGICAL_XOR: - case \T_NAMESPACE: - case \T_NEW: - case \T_PRIVATE: - case \T_PROTECTED: - case \T_PUBLIC: - case \T_REQUIRE: - case \T_REQUIRE_ONCE: - case \T_RETURN: - case \T_STATIC: - case \T_THROW: - case \T_TRAIT: - case \T_TRY: - case \T_UNSET: - case \T_USE: - case \T_VAR: - case \T_WHILE: - case \T_YIELD: - $colour = 'keyword'; - - break; - - default: - $colour = 'default'; - } - } - - $result[$i] .= \sprintf( - '%s', - $colour, - $line - ); - } - - if (isset($lines[$jj + 1])) { - $result[++$i] = ''; - } - } - } - } - - if ($fileEndsWithNewLine) { - unset($result[\count($result) - 1]); - } - - return $result; - } - - private function abbreviateClassName(string $className): string - { - $tmp = \explode('\\', $className); - - if (\count($tmp) > 1) { - $className = \sprintf( - '%s', - $className, - \array_pop($tmp) - ); - } - - return $className; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist deleted file mode 100644 index 7fcf6f4..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist +++ /dev/null @@ -1,5 +0,0 @@ -
-
- {{percent}}% covered ({{level}}) -
-
diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css deleted file mode 100644 index 92e3fe8..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{border-color:#28a745}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");background-repeat:no-repeat;background-position:center right calc(.375em + .1875rem);background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc((1em + .75rem) * 3 / 4 + 1.75rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{border-color:#dc3545}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-transform .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;-webkit-transform:translateX(.75rem);transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:calc(1rem + .4rem);padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label::before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-horizontal{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}@media (min-width:576px){.list-group-horizontal-sm{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-sm .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:768px){.list-group-horizontal-md{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-md .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:992px){.list-group-horizontal-lg{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-lg .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}@media (min-width:1200px){.list-group-horizontal-xl{-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item{margin-right:-1px;margin-bottom:0}.list-group-horizontal-xl .list-group-item:first-child{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{margin-right:0;border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0}}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush .list-group-item:last-child{margin-bottom:-1px}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{margin-bottom:0;border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-50px);transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal-dialog-scrollable{display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #dee2e6;border-bottom-right-radius:.3rem;border-bottom-left-radius:.3rem}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top]>.arrow::before,.bs-popover-top>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow::after,.bs-popover-top>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow::before,.bs-popover-right>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow::after,.bs-popover-right>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom]>.arrow::before,.bs-popover-bottom>.arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow::after,.bs-popover-bottom>.arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow::before,.bs-popover-left>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow::after,.bs-popover-left>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:0s .6s opacity}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50%/100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/custom.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/custom.css deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css deleted file mode 100644 index 7a6f7fe..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css +++ /dev/null @@ -1 +0,0 @@ -.nvd3 .nv-axis{pointer-events:none;opacity:1}.nvd3 .nv-axis path{fill:none;stroke:#000;stroke-opacity:.75;shape-rendering:crispEdges}.nvd3 .nv-axis path.domain{stroke-opacity:.75}.nvd3 .nv-axis.nv-x path.domain{stroke-opacity:0}.nvd3 .nv-axis line{fill:none;stroke:#e5e5e5;shape-rendering:crispEdges}.nvd3 .nv-axis .zero line,.nvd3 .nv-axis line.zero{stroke-opacity:.75}.nvd3 .nv-axis .nv-axisMaxMin text{font-weight:700}.nvd3 .x .nv-axis .nv-axisMaxMin text,.nvd3 .x2 .nv-axis .nv-axisMaxMin text,.nvd3 .x3 .nv-axis .nv-axisMaxMin text{text-anchor:middle}.nvd3 .nv-axis.nv-disabled{opacity:0}.nvd3 .nv-bars rect{fill-opacity:.75;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-bars rect.hover{fill-opacity:1}.nvd3 .nv-bars .hover rect{fill:#add8e6}.nvd3 .nv-bars text{fill:rgba(0,0,0,0)}.nvd3 .nv-bars .hover text{fill:rgba(0,0,0,1)}.nvd3 .nv-multibar .nv-groups rect,.nvd3 .nv-multibarHorizontal .nv-groups rect,.nvd3 .nv-discretebar .nv-groups rect{stroke-opacity:0;transition:fill-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear}.nvd3 .nv-multibar .nv-groups rect:hover,.nvd3 .nv-multibarHorizontal .nv-groups rect:hover,.nvd3 .nv-candlestickBar .nv-ticks rect:hover,.nvd3 .nv-discretebar .nv-groups rect:hover{fill-opacity:1}.nvd3 .nv-discretebar .nv-groups text,.nvd3 .nv-multibarHorizontal .nv-groups text{font-weight:700;fill:rgba(0,0,0,1);stroke:rgba(0,0,0,0)}.nvd3 .nv-boxplot circle{fill-opacity:.5}.nvd3 .nv-boxplot circle:hover{fill-opacity:1}.nvd3 .nv-boxplot rect:hover{fill-opacity:1}.nvd3 line.nv-boxplot-median{stroke:#000}.nv-boxplot-tick:hover{stroke-width:2.5px}.nvd3.nv-bullet{font:10px sans-serif}.nvd3.nv-bullet .nv-measure{fill-opacity:.8}.nvd3.nv-bullet .nv-measure:hover{fill-opacity:1}.nvd3.nv-bullet .nv-marker{stroke:#000;stroke-width:2px}.nvd3.nv-bullet .nv-markerTriangle{stroke:#000;fill:#fff;stroke-width:1.5px}.nvd3.nv-bullet .nv-tick line{stroke:#666;stroke-width:.5px}.nvd3.nv-bullet .nv-range.nv-s0{fill:#eee}.nvd3.nv-bullet .nv-range.nv-s1{fill:#ddd}.nvd3.nv-bullet .nv-range.nv-s2{fill:#ccc}.nvd3.nv-bullet .nv-title{font-size:14px;font-weight:700}.nvd3.nv-bullet .nv-subtitle{fill:#999}.nvd3.nv-bullet .nv-range{fill:#bababa;fill-opacity:.4}.nvd3.nv-bullet .nv-range:hover{fill-opacity:.7}.nvd3.nv-candlestickBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.positive rect{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-candlestickBar .nv-ticks .nv-tick.negative rect{stroke:#d62728;fill:#d62728}.with-transitions .nv-candlestickBar .nv-ticks .nv-tick{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-candlestickBar .nv-ticks line{stroke:#333}.nvd3 .nv-legend .nv-disabled rect{}.nvd3 .nv-check-box .nv-box{fill-opacity:0;stroke-width:2}.nvd3 .nv-check-box .nv-check{fill-opacity:0;stroke-width:4}.nvd3 .nv-series.nv-disabled .nv-check-box .nv-check{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-controlsWrap .nv-legend .nv-check-box .nv-check{opacity:0}.nvd3.nv-linePlusBar .nv-bar rect{fill-opacity:.75}.nvd3.nv-linePlusBar .nv-bar rect:hover{fill-opacity:1}.nvd3 .nv-groups path.nv-line{fill:none}.nvd3 .nv-groups path.nv-area{stroke:none}.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point{fill-opacity:0;stroke-opacity:0}.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point{fill-opacity:.5!important;stroke-opacity:.5!important}.with-transitions .nvd3 .nv-groups .nv-point{transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-scatter .nv-groups .nv-point.hover,.nvd3 .nv-groups .nv-point.hover{stroke-width:7px;fill-opacity:.95!important;stroke-opacity:.95!important}.nvd3 .nv-point-paths path{stroke:#aaa;stroke-opacity:0;fill:#eee;fill-opacity:0}.nvd3 .nv-indexLine{cursor:ew-resize}svg.nvd3-svg{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none;display:block;width:100%;height:100%}.nvtooltip.with-3d-shadow,.with-3d-shadow .nvtooltip{-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nvd3 text{font:400 12px Arial}.nvd3 .title{font:700 14px Arial}.nvd3 .nv-background{fill:#fff;fill-opacity:0}.nvd3.nv-noData{font-size:18px;font-weight:700}.nv-brush .extent{fill-opacity:.125;shape-rendering:crispEdges}.nv-brush .resize path{fill:#eee;stroke:#666}.nvd3 .nv-legend .nv-series{cursor:pointer}.nvd3 .nv-legend .nv-disabled circle{fill-opacity:0}.nvd3 .nv-brush .extent{fill-opacity:0!important}.nvd3 .nv-brushBackground rect{stroke:#000;stroke-width:.4;fill:#fff;fill-opacity:.7}.nvd3.nv-ohlcBar .nv-ticks .nv-tick{stroke-width:1px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover{stroke-width:2px}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive{stroke:#2ca02c}.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative{stroke:#d62728}.nvd3 .background path{fill:none;stroke:#EEE;stroke-opacity:.4;shape-rendering:crispEdges}.nvd3 .foreground path{fill:none;stroke-opacity:.7}.nvd3 .nv-parallelCoordinates-brush .extent{fill:#fff;fill-opacity:.6;stroke:gray;shape-rendering:crispEdges}.nvd3 .nv-parallelCoordinates .hover{fill-opacity:1;stroke-width:3px}.nvd3 .missingValuesline line{fill:none;stroke:#000;stroke-width:1;stroke-opacity:1;stroke-dasharray:5,5}.nvd3.nv-pie path{stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-width 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-pie .nv-pie-title{font-size:24px;fill:rgba(19,196,249,.59)}.nvd3.nv-pie .nv-slice text{stroke:#000;stroke-width:0}.nvd3.nv-pie path{stroke:#fff;stroke-width:1px;stroke-opacity:1}.nvd3.nv-pie .hover path{fill-opacity:.7}.nvd3.nv-pie .nv-label{pointer-events:none}.nvd3.nv-pie .nv-label rect{fill-opacity:0;stroke-opacity:0}.nvd3 .nv-groups .nv-point.hover{stroke-width:20px;stroke-opacity:.5}.nvd3 .nv-scatter .nv-point.hover{fill-opacity:1}.nv-noninteractive{pointer-events:none}.nv-distx,.nv-disty{pointer-events:none}.nvd3.nv-sparkline path{fill:none}.nvd3.nv-sparklineplus g.nv-hoverValue{pointer-events:none}.nvd3.nv-sparklineplus .nv-hoverValue line{stroke:#333;stroke-width:1.5px}.nvd3.nv-sparklineplus,.nvd3.nv-sparklineplus g{pointer-events:all}.nvd3 .nv-hoverArea{fill-opacity:0;stroke-opacity:0}.nvd3.nv-sparklineplus .nv-xValue,.nvd3.nv-sparklineplus .nv-yValue{stroke-width:0;font-size:.9em;font-weight:400}.nvd3.nv-sparklineplus .nv-yValue{stroke:#f66}.nvd3.nv-sparklineplus .nv-maxValue{stroke:#2ca02c;fill:#2ca02c}.nvd3.nv-sparklineplus .nv-minValue{stroke:#d62728;fill:#d62728}.nvd3.nv-sparklineplus .nv-currentValue{font-weight:700;font-size:1.1em}.nvd3.nv-stackedarea path.nv-area{fill-opacity:.7;stroke-opacity:0;transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-moz-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear;-webkit-transition:fill-opacity 250ms linear,stroke-opacity 250ms linear}.nvd3.nv-stackedarea path.nv-area.hover{fill-opacity:.9}.nvd3.nv-stackedarea .nv-groups .nv-point{stroke-opacity:0;fill-opacity:0}.nvtooltip{position:absolute;background-color:rgba(255,255,255,1);color:rgba(0,0,0,1);padding:1px;border:1px solid rgba(0,0,0,.2);z-index:10000;display:block;font-family:Arial;font-size:13px;text-align:left;pointer-events:none;white-space:nowrap;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.nvtooltip{background:rgba(255,255,255,.8);border:1px solid rgba(0,0,0,.5);border-radius:4px}.nvtooltip.with-transitions,.with-transitions .nvtooltip{transition:opacity 50ms linear;-moz-transition:opacity 50ms linear;-webkit-transition:opacity 50ms linear;transition-delay:200ms;-moz-transition-delay:200ms;-webkit-transition-delay:200ms}.nvtooltip.x-nvtooltip,.nvtooltip.y-nvtooltip{padding:8px}.nvtooltip h3{margin:0;padding:4px 14px;line-height:18px;font-weight:400;background-color:rgba(247,247,247,.75);color:rgba(0,0,0,1);text-align:center;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.nvtooltip p{margin:0;padding:5px 14px;text-align:center}.nvtooltip span{display:inline-block;margin:2px 0}.nvtooltip table{margin:6px;border-spacing:0}.nvtooltip table td{padding:2px 9px 2px 0;vertical-align:middle}.nvtooltip table td.key{font-weight:400}.nvtooltip table td.value{text-align:right;font-weight:700}.nvtooltip table tr.highlight td{padding:1px 9px 1px 0;border-bottom-style:solid;border-bottom-width:1px;border-top-style:solid;border-top-width:1px}.nvtooltip table td.legend-color-guide div{width:8px;height:8px;vertical-align:middle}.nvtooltip table td.legend-color-guide div{width:12px;height:12px;border:1px solid #999}.nvtooltip .footer{padding:3px;text-align:center}.nvtooltip-pending-removal{pointer-events:none;display:none}.nvd3 .nv-interactiveGuideLine{pointer-events:none}.nvd3 line.nv-guideline{stroke:#ccc} \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css deleted file mode 100644 index 31d9786..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css +++ /dev/null @@ -1,5 +0,0 @@ -.octicon { - display: inline-block; - vertical-align: text-top; - fill: currentColor; -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css deleted file mode 100644 index 6d9c21e..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css +++ /dev/null @@ -1,122 +0,0 @@ -body { - padding-top: 10px; -} - -.popover { - max-width: none; -} - -.octicon { - margin-right:.25em; -} - -.table-bordered>thead>tr>td { - border-bottom-width: 1px; -} - -.table tbody>tr>td, .table thead>tr>td { - padding-top: 3px; - padding-bottom: 3px; -} - -.table-condensed tbody>tr>td { - padding-top: 0; - padding-bottom: 0; -} - -.table .progress { - margin-bottom: inherit; -} - -.table-borderless th, .table-borderless td { - border: 0 !important; -} - -.table tbody tr.covered-by-large-tests, li.covered-by-large-tests, tr.success, td.success, li.success, span.success { - background-color: #dff0d8; -} - -.table tbody tr.covered-by-medium-tests, li.covered-by-medium-tests { - background-color: #c3e3b5; -} - -.table tbody tr.covered-by-small-tests, li.covered-by-small-tests { - background-color: #99cb84; -} - -.table tbody tr.danger, .table tbody td.danger, li.danger, span.danger { - background-color: #f2dede; -} - -.table tbody td.warning, li.warning, span.warning { - background-color: #fcf8e3; -} - -.table tbody td.info { - background-color: #d9edf7; -} - -td.big { - width: 117px; -} - -td.small { -} - -td.codeLine { - font-family: "Source Code Pro", "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - white-space: pre; -} - -td span.comment { - color: #888a85; -} - -td span.default { - color: #2e3436; -} - -td span.html { - color: #888a85; -} - -td span.keyword { - color: #2e3436; - font-weight: bold; -} - -pre span.string { - color: #2e3436; -} - -span.success, span.warning, span.danger { - margin-right: 2px; - padding-left: 10px; - padding-right: 10px; - text-align: center; -} - -#classCoverageDistribution, #classComplexity { - height: 200px; - width: 475px; -} - -#toplink { - position: fixed; - left: 5px; - bottom: 5px; - outline: 0; -} - -svg text { - font-family: "Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif; - font-size: 11px; - color: #666; - fill: #666; -} - -.scrollbox { - height:245px; - overflow-x:hidden; - overflow-y:scroll; -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist deleted file mode 100644 index aa51bcb..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist +++ /dev/null @@ -1,281 +0,0 @@ - - - - - Dashboard for {{full_path}} - - - - - - - -
-
-
-
- -
-
-
-
-
-
-
-

Classes

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
-
element because TCPDF - // does not recognize e.g.
element because TCPDF - // does not recognize e.g.
%s%d%%
%s%d%%
%s%d
%s%d
%s
- - - - - - - -{{insufficient_coverage_classes}} - -
ClassCoverage
-
- -
-

Project Risks

-
- - - - - - - - -{{project_risks_classes}} - -
ClassCRAP
-
-
- -
-
-

Methods

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - -{{insufficient_coverage_methods}} - -
MethodCoverage
-
-
-
-

Project Risks

-
- - - - - - - - -{{project_risks_methods}} - -
MethodCRAP
-
-
-
- - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist deleted file mode 100644 index a263463..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist +++ /dev/null @@ -1,60 +0,0 @@ - - - - - Code Coverage for {{full_path}} - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - -{{items}} - -
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
-
-
-
-

Legend

-

- Low: 0% to {{low_upper_bound}}% - Medium: {{low_upper_bound}}% to {{high_lower_bound}}% - High: {{high_lower_bound}}% to 100% -

-

- Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}. -

-
-
- - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist deleted file mode 100644 index f6941a4..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist +++ /dev/null @@ -1,13 +0,0 @@ - - {{icon}}{{name}} - {{lines_bar}} -
{{lines_executed_percent}}
-
{{lines_number}}
- {{methods_bar}} -
{{methods_tested_percent}}
-
{{methods_number}}
- {{classes_bar}} -
{{classes_tested_percent}}
-
{{classes_number}}
- - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist deleted file mode 100644 index 0ca65ed..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist +++ /dev/null @@ -1,72 +0,0 @@ - - - - - Code Coverage for {{full_path}} - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - -{{items}} - -
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
-
- - -{{lines}} - -
- -
- - - - - - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist deleted file mode 100644 index dc754b3..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist +++ /dev/null @@ -1,14 +0,0 @@ - - {{name}} - {{classes_bar}} -
{{classes_tested_percent}}
-
{{classes_number}}
- {{methods_bar}} -
{{methods_tested_percent}}
-
{{methods_number}}
- {{crap}} - {{lines_bar}} -
{{lines_executed_percent}}
-
{{lines_number}}
- - diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg deleted file mode 100644 index 5b4b199..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg deleted file mode 100644 index 4bf1f1c..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js deleted file mode 100644 index c4c0d1f..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||tn?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===bo||n[0]===_o?_o+n:n}function s(n){return(n+="")[0]===_o?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=wo.length;r>e;++e){var i=wo[e]+t;if(i in n)return i}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,i=-1,u=r.length;++ie;e++)for(var i,u=n[e],o=0,a=u.length;a>o;o++)(i=u[o])&&t(i,o,e);return n}function Z(n){return ko(n,qo),n}function V(n){var t,e;return function(r,i,u){var o,a=n[u].update,l=a.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var c=To.get(n);return c&&(n=c,l=B),a?t?i:r:t?b:u}function $(n,t){return function(e){var r=ao.event;ao.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ao.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Do,i="click"+r,u=ao.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ro&&(Ro="onselectstart"in e?!1:x(e.style,"userSelect")),Ro){var o=n(e).style,a=o[Ro];o[Ro]="none"}return function(n){if(u.on(r,null),Ro&&(o[Ro]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(0>Po){var u=t(n);if(u.scrollX||u.scrollY){r=ao.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Po=!(o.f||o.e),r.remove()}}return Po?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ao.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?Fo:Math.acos(n)}function tn(n){return n>1?Io:-1>n?-Io:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(o-u)*n/60:180>n?o:240>n?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=ao.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Yo)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=vn(i)*na,r=vn(r)*ta,u=vn(u)*ea,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Zo,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):_n(""+n,mn,cn):new mn(n,t,e)}function Mn(n){return new mn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=ua.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o=o>>4|o,a=240&u,a=a>>4|a,l=15&u,l=l<<4|l):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=.5>l?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=NaN,i=l>0&&1>l?0:r),new ln(r,i,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/na),i=dn((.2126729*n+.7151522*t+.072175*e)/ta),u=dn((.0193339*n+.119192*t+.9503041*e)/ea);return hn(116*i-16,500*(r-i),200*(i-u))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(u,l)}catch(r){return void o.error.call(u,r)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=ao.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=ao.event;ao.event=n;try{o.progress.call(u,l)}finally{ao.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(co(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},ao.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={c:n,t:i,n:null};return aa?aa.n=u:oa=u,aa=u,la||(ca=clearTimeout(ca),la=1,fa(Tn)),u}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(ca),ca=setTimeout(Tn,t)),la=0):(la=1,fa(Tn))}function Rn(){for(var n=Date.now(),t=oa;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=oa,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function jn(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ha.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,v="",d="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,d="%",p="f";break;case"p":g=100,d="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(v=i[0],d=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pa.get(p)||Fn;var M=c&&s;return function(n){var e=d;if(y&&n%1)return"";var i=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>g){var l=ao.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=g;n=p(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=m?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&s&&(x=u(x,1/0));var S=v.length+x.length+b.length+(M?0:i.length),k=f>S?new Array(S=f-S+1).join(r):"";return M&&(x=u(k+x,k.length?f-b.length:1/0)),i+=v,n=x+b,("<"===o?i+n+k:">"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new va(e-1)),1),e}function u(n,e){return t(n=new va(+n),e),n}function o(n,r,u){var o=i(n),a=[];if(u>1)for(;r>o;)e(o)%u||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{va=Hn;var r=new Hn;return r._=n,o(r,t,e)}finally{va=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=o;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(i),l.offset=In(u),l.range=a,n}function In(n){return function(t,e){try{va=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{va=Date}}}function Yn(n){function t(n){function t(t){for(var e,i,u,o=[],a=-1,l=0;++aa;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(o=t.charAt(a++),u=C[o in ya?t.charAt(a++):o],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,v=n.days,d=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{va=Hn;var t=new va;return t._=n,r(t)}finally{va=Date}}var r=t(n);return e.parse=function(n){try{va=Hn;var t=r.parse(n);return t&&t._}finally{va=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ao.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ga.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ga.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ga.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Vn(n){return new RegExp("^(?:"+n.map(ao.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=xo(t)/60|0,i=xo(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){Ma.lastIndex=0;var r=Ma.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);ka.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;Na.point=function(o,a){Na.point=n,r=(t=o)*Yo,i=Math.cos(a=(e=a)*Yo/2+Fo/4),u=Math.sin(a)},Na.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return xo(n[0]-t[0])a;++a)i.point((e=n[a])[0],e[1]);return void i.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,u.push(l),o.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,u.push(l),o.push(c)}}),o.sort(t),qt(u),qt(o),u.length){for(var a=0,l=e,c=o.length;c>a;++a)o[a].e=l=!l;for(var f,s,h=u[0];;){for(var p=h,g=!0;p.v;)if((p=p.n)===h)return;f=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(g)for(var a=0,c=f.length;c>a;++a)i.point((s=f[a])[0],s[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(g){f=p.p.z;for(var a=f.length-1;a>=0;--a)i.point((s=f[a])[0],s[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,f=p.z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r0){for(b||(u.polygonStart(),b=!0),u.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,v,d=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=ao.merge(p);var n=Ot(y,g);p.length?(b||(u.polygonStart(),b=!0),Lt(p,Ut,n,e,u)):n&&(b||(u.polygonStart(),b=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),b&&(u.polygonEnd(),b=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},M=Pt(),x=t(M),b=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ut(n,t){return((n=n.x)[0]<0?n[1]-Io-Uo:Io-n[1])-((t=t.x)[0]<0?t[1]-Io-Uo:Io-t[1])}function jt(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Fo:-Fo,l=xo(u-e);xo(l-Fo)0?Io:-Io),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Fo&&(xo(e-i)Uo?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Io,r.point(-Fo,i),r.point(0,i),r.point(Fo,i),r.point(Fo,0),r.point(Fo,-i),r.point(0,-i),r.point(-Fo,-i),r.point(-Fo,0),r.point(-Fo,i);else if(xo(n[0]-t[0])>Uo){var u=n[0]a;++a){var c=t[a],f=c.length;if(f)for(var s=c[0],h=s[0],p=s[1]/2+Fo/4,g=Math.sin(p),v=Math.cos(p),d=1;;){d===f&&(d=0),n=c[d];var y=n[0],m=n[1]/2+Fo/4,M=Math.sin(m),x=Math.cos(m),b=y-h,_=b>=0?1:-1,w=_*b,S=w>Fo,k=g*M;if(ka.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),u+=S?b+_*Ho:b,S^h>=e^y>=e){var N=mt(dt(s),dt(n));bt(N);var E=mt(i,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=y,g=M,v=x,s=n}}return(-Uo>u||Uo>u&&-Uo>ka)^1&o}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>u}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],v=t(s,h),d=o?v?0:i(s,h):v?i(s+(0>s?Fo:-Fo),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Uo,g[1]+=Uo,v=t(g[0],g[1]))),v!==l)f=0,v?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^v){var y;d&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!v||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=v,u=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),i=dt(t),o=[1,0,0],a=mt(r,i),l=yt(a,a),c=a[0],f=l-c*c;if(!f)return!e&&n;var s=u*l/f,h=-u*c/f,p=mt(o,a),g=xt(o,s),v=xt(a,h);Mt(g,v);var d=p,y=yt(g,d),m=yt(d,d),M=y*y-m*(yt(g,g)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-y-x)/m);if(Mt(b,g),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=xo(E-Fo)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(xo(b[0]-w)Fo^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-y+x)/m);return Mt(z,g),[b,_t(z)]}}}function i(t,e){var r=o?n:Fo-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=xo(u)>Uo,l=ve(n,6*Yo);return Rt(t,e,l,o?[0,-n]:[-Fo,n-Fo])}function Yt(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=a.x,s=a.y,h=0,p=1,g=f-l,v=s-c;if(u=n-l,g||!(u>0)){if(u/=g,0>g){if(h>u)return;p>u&&(p=u)}else if(g>0){if(u>p)return;u>h&&(h=u)}if(u=e-l,g||!(0>u)){if(u/=g,0>g){if(u>p)return;u>h&&(h=u)}else if(g>0){if(h>u)return;p>u&&(p=u)}if(u=t-c,v||!(u>0)){if(u/=v,0>v){if(h>u)return;p>u&&(p=u)}else if(v>0){if(u>p)return;u>h&&(h=u)}if(u=r-c,v||!(0>u)){if(u/=v,0>v){if(u>p)return;u>h&&(h=u)}else if(v>0){if(h>u)return;p>u&&(p=u)}return h>0&&(i.a={x:l+h*g,y:c+h*v}),1>p&&(i.b={x:l+p*g,y:c+p*v}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return xo(r[0]-n)0?0:3:xo(r[0]-e)0?2:1:xo(r[1]-t)0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=d.length,r=n[1],i=0;e>i;++i)for(var u,o=1,a=d[i],l=a.length,c=a[0];l>o;++o)u=a[o],c[1]<=r?u[1]>r&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0){do c.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+l+4)%4)!==s)}else c.point(a[0],a[1])}function f(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,d&&d.push(y=[]),S=!0,w=!1,b=_=NaN}function p(){v&&(g(m,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){n=Math.max(-Ha,Math.min(Ha,n)),t=Math.max(-Ha,Math.min(Ha,t));var e=f(n,t);if(d&&y.push([n,t]),S)m=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,y,m,M,x,b,_,w,S,k,N=a,E=Pt(),A=Yt(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,v=[],d=[],k=!0},polygonEnd:function(){a=N,v=ao.merge(v);var t=l([n,r]),e=k&&t,i=v.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(v,u,t,c,a),a.polygonEnd()),v=d=y=null}};return C}}function Vt(n){var t=0,e=Fo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Fo/180,e=n[1]*Fo/180):[t/Fo*180,e/Fo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){Ia+=i*n-r*t,r=n,i=t}var t,e,r,i;$a.point=function(u,o){$a.point=n,t=r=u,e=i=o},$a.lineEnd=function(){n(t,e)}}function Bt(n,t){Ya>n&&(Ya=n),n>Va&&(Va=n),Za>t&&(Za=t),t>Xa&&(Xa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ca+=n,za+=t,++La}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);qa+=o*(t+n)/2,Ta+=o*(e+r)/2,Ra+=o,Gt(t=n,e=r)}var t,e;Wa.point=function(r,i){Wa.point=n,Gt(t=r,e=i)}}function Qt(){Wa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);qa+=o*(r+n)/2,Ta+=o*(i+t)/2,Ra+=o,o=i*n-r*t,Da+=o*(r+n),Pa+=o*(i+t),Ua+=3*o,Gt(r=n,i=t)}var t,e,r,i;Wa.point=function(u,o){Wa.point=n,Gt(t=r=u,e=i=o)},Wa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Ho)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=u,t.lineStart()}function u(e,r){var u=dt([e,r]),o=n(e,r);i(M,x,m,b,_,w,M=o[0],x=o[1],m=e,b=u[0],_=u[1],w=u[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function l(){ -r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=M,g=x,v=b,d=_,y=w,S.point=u}function f(){i(M,x,m,b,_,w,p,g,s,v,d,y,a,t),S.lineEnd=o,o()}var s,h,p,g,v,d,y,m,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,v,d,y){var m=f-t,M=s-e,x=m*m+M*M;if(x>4*u&&d--){var b=a+p,_=l+g,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=xo(xo(w)-1)u||xo((m*z+M*L)/x-.5)>.3||o>a*p+l*g+c*v)&&(i(t,e,r,a,l,c,A,C,N,b/=S,_/=S,w,d,y),y.point(A,C),i(A,C,N,b,_,w,f,s,h,p,g,v,d,y))}}var u=.5,o=Math.cos(30*Yo),a=16;return t.precision=function(n){return arguments.length?(a=(u=n*n)>0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Zo,e*Zo])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Yo,n[1]*Yo),[n[0]*h+l,c-n[1]*h]}function e(n){return n=a.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Zo,n[1]*Zo]}function r(){a=Ct(o=se(y,M,x),u);var n=u(v,d);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,v=0,d=0,y=0,M=0,x=0,b=Fa,_=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(b(o,s(_(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Fa):It((w=+n)*Yo),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(v=n[0]%360*Yo,d=n[1]%360*Yo,r()):[v*Zo,d*Zo]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Yo,M=n[1]%360*Yo,x=n.length>2?n[2]%360*Yo:0,r()):[y*Zo,M*Zo,x*Zo]},ao.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Yo,e*Yo)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Fo?n-Ho:-Fo>n?n+Ho:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Fo?t-Ho:-Fo>t?t+Ho:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=de(e,i),u=de(e,u),(o>0?u>i:i>u)&&(i+=o*Ho)):(i=n+o*Ho,u=n-.5*l);for(var c,f=i;o>0?f>u:u>f;f-=l)a.point((c=_t([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Uo)%(2*Math.PI)}function ye(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),o=Math.cos(r),a=Math.sin(r),l=i*Math.cos(n),c=i*Math.sin(n),f=o*Math.cos(e),s=o*Math.sin(e),h=2*Math.asin(Math.sqrt(on(r-t)+i*o*on(e-n))),p=1/Math.sin(h),g=h?function(n){var t=Math.sin(n*=h)*p,e=Math.sin(h-n)*p,r=e*l+t*f,i=e*c+t*s,o=e*u+t*a;return[Math.atan2(i,r)*Zo,Math.atan2(o,Math.sqrt(r*r+i*i))*Zo]}:function(){return[n*Zo,t*Zo]};return g.distance=h,g}function _e(){function n(n,i){var u=Math.sin(i*=Yo),o=Math.cos(i),a=xo((n*=Yo)-t),l=Math.cos(a);Ja+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*u-e*o*l)*a),e*u+r*o*l),t=n,e=u,r=o}var t,e,r;Ga.point=function(i,u){t=i*Yo,e=Math.sin(u*=Yo),r=Math.cos(u),Ga.point=n},Ga.lineEnd=function(){Ga.point=Ga.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),o=Math.cos(i);return[Math.atan2(n*u,r*o),Math.asin(r&&e*u/r)]},e}function Se(n,t){function e(n,t){o>0?-Io+Uo>t&&(t=-Io+Uo):t>Io-Uo&&(t=Io-Uo);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Fo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Io]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return xo(i)i;i++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function Ue(n){var t=cl.pop()||new Pe;return t.site=n,t}function je(n){Be(n),ol.remove(n),cl.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];je(n);for(var l=u;l.circle&&xo(e-l.circle.x)f;++f)c=a[f],l=a[f-1],nr(c.edge,l.site,c.site,i);l=a[0],c=a[s-1],c.edge=Ke(l.site,c.site,null,i),$e(l),$e(c)}function He(n){for(var t,e,r,i,u=n.x,o=n.y,a=ol._;a;)if(r=Oe(a,o)-u,r>Uo)a=a.L;else{if(i=u-Ie(a,o),!(i>Uo)){r>-Uo?(t=a.P,e=a):i>-Uo?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=Ue(n);if(ol.insert(t,l),t||e){if(t===e)return Be(t),e=Ue(t.site),ol.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,v=g.x-f,d=g.y-s,y=2*(h*d-p*v),m=h*h+p*p,M=v*v+d*d,x={x:(d*m-p*M)/y+f,y:(h*M-v*m)/y+s};nr(e.edge,c,g,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,g,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-(1/0);e=o.site;var a=e.x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],v=ul,d=v.length;d--;)if(u=v[d],u&&u.prepare())for(a=u.edges,l=a.length,o=0;l>o;)f=a[o].end(),r=f.x,i=f.y,c=a[++o%l].start(),t=c.x,e=c.y,(xo(r-t)>Uo||xo(i-e)>Uo)&&(a.splice(o,0,new tr(Qe(u.site,f,xo(r-s)Uo?{x:s,y:xo(t-s)Uo?{x:xo(e-g)Uo?{x:h,y:xo(t-h)Uo?{x:xo(e-p)=-jo)){var p=l*l+c*c,g=f*f+s*s,v=(s*p-c*g)/h,d=(l*g-f*p)/h,s=d+a,y=fl.pop()||new Xe;y.arc=n,y.site=i,y.x=v+o,y.y=s+Math.sqrt(v*v+d*d),y.cy=s,n.circle=y;for(var m=null,M=ll._;M;)if(y.yd||d>=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:d,y:l};e={x:d,y:c}}else{if(u){if(u.yr||r>1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.yp){if(u){if(u.x>=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.xu||s>o||r>h||i>p)){if(g=n.point){var g,v=t-n.x,d=e-n.y,y=v*v+d*d;if(l>y){var m=Math.sqrt(l=y);r=t-m,i=e-m,u=t+m,o=e+m,a=g}}for(var M=n.nodes,x=.5*(f+h),b=.5*(s+p),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,f,s,x,b);break;case 1:c(n,x,s,h,b);break;case 2:c(n,f,b,x,p);break;case 3:c(n,x,b,h,p)}}}(n,r,i,u,o),a}function vr(n,t){n=ao.rgb(n),t=ao.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,o=t.g-r,a=t.b-i;return function(n){return"#"+bn(Math.round(e+u*n))+bn(Math.round(r+o*n))+bn(Math.round(i+a*n))}}function dr(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function yr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,i,u=hl.lastIndex=pl.lastIndex=0,o=-1,a=[],l=[];for(n+="",t+="";(e=hl.exec(n))&&(r=pl.exec(t));)(i=r.index)>u&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:yr(e,r)})),u=pl.lastIndex;return ur;++r)a[(e=l[r]).i]=e.x(n);return a.join("")})}function Mr(n,t){for(var e,r=ao.interpolators.length;--r>=0&&!(e=ao.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Mr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;o>e;++e)i[e]=t[e];return function(n){for(e=0;a>e;++e)i[e]=r[e](n);return i}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Io)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ho*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ho/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=ao.hcl(n),t=ao.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=ao.hsl(n),t=ao.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){n=ao.lab(n),t=ao.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),i=Fr(t,e),u=Hr(Or(e,t,-i))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:yr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:yr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=ao.transform(n),t=ao.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i=0;)e.push(i[r])}function oi(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++oe;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function yi(n){return n.reduce(mi,0)}function mi(n,t){return n+t[1]}function Mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function bi(n){return[ao.min(n),ao.max(n)]}function _i(n,t){return n.value-t.value}function wi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Si(n,t){n._pack_next=t,t._pack_prev=n}function ki(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Ni(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-(1/0),h=1/0,p=-(1/0);if(e.forEach(Ei),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(u=e[2],zi(r,i,u),t(u),wi(r,u),r._pack_prev=u,wi(u,i),i=r._pack_next,o=3;c>o;o++){zi(r,i,u=e[o]);var g=0,v=1,d=1;for(a=i._pack_next;a!==i;a=a._pack_next,v++)if(ki(a,u)){g=1;break}if(1==g)for(l=r._pack_prev;l!==a._pack_prev&&!ki(l,u);l=l._pack_prev,d++);g?(d>v||v==d&&i.ro;o++)u=e[o],u.x-=y,u.y-=m,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Ai)}}function Ei(n){n._pack_next=n._pack_prev=n}function Ai(n){delete n._pack_next,delete n._pack_prev}function Ci(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,o=i.length;++u=0;)t=i[u],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pi(n,t,e){return n.a.parent===t.parent?n.a:e}function Ui(n){return 1+ao.max(n,function(n){return n.y})}function ji(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fi(n){var t=n.children;return t&&t.length?Fi(t[0]):n}function Hi(n){var t,e=n.children;return e&&(t=e.length)?Hi(e[t-1]):n}function Oi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ii(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Yi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zi(n){return n.rangeExtent?n.rangeExtent():Yi(n.range())}function Vi(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Xi(n,t){var e,r=0,i=n.length-1,u=n[r],o=n[i];return u>o&&(e=r,r=i,i=e,e=u,u=o,o=e),n[r]=t.floor(u),n[i]=t.ceil(o),n}function $i(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Sl}function Bi(n,t,e,r){var i=[],u=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?Bi:Vi,l=r?Wr:Br;return o=i(n,t,l,e),a=i(t,n,l,Mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return Qi(n,t)},u.tickFormat=function(t,e){return nu(n,t,e)},u.nice=function(t){return Gi(n,t),i()},u.copy=function(){return Wi(n,t,e,r)},i()}function Ji(n,t){return ao.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gi(n,t){return Xi(n,$i(Ki(n,t)[2])),Xi(n,$i(Ki(n,t)[2])),n}function Ki(n,t){null==t&&(t=10);var e=Yi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(n,t){return ao.range.apply(ao,Ki(n,t))}function nu(n,t,e){var r=Ki(n,t);if(e){var i=ha.exec(e);if(i.shift(),"s"===i[8]){var u=ao.formatPrefix(Math.max(xo(r[0]),xo(r[1])));return i[7]||(i[7]="."+tu(u.scale(r[2]))),i[8]="f",e=ao.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+eu(i[8],r)),e=i.join("")}else e=",."+tu(r[2])+"f";return ao.format(e)}function tu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function eu(n,t){var e=tu(t[2]);return n in kl?Math.abs(e-tu(Math.max(xo(t[0]),xo(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ru(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Xi(r.map(i),e?Math:El);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=Yi(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;f>c;c++)for(var h=1;s>h;h++)o.push(u(c)*h);o.push(u(c))}else for(o.push(u(c));c++0;h--)o.push(u(c)*h);for(c=0;o[c]l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return Nl;arguments.length<2?e=Nl:"function"!=typeof e&&(e=ao.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return t-.5>o*t&&(o*=t),r>=o?e(n):""}},o.copy=function(){return ru(n.copy(),t,e,r)},Ji(o,n)}function iu(n,t,e){function r(t){return n(i(t))}var i=uu(t),u=uu(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return Qi(e,n)},r.tickFormat=function(n,t){return nu(e,n,t)},r.nice=function(n){return r.domain(Gi(e,n))},r.exponent=function(o){return arguments.length?(i=uu(t=o),u=uu(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return iu(n.copy(),t,e)},Ji(r,n)}function uu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ou(n,t){function e(e){return u[((i.get(e)||("range"===t.t?i.set(e,n.push(e)):NaN))-1)%u.length]}function r(t,e){return ao.range(n.length).map(function(n){return t+e*n})}var i,u,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new c;for(var u,o=-1,a=r.length;++oe?[NaN,NaN]:[e>0?a[e-1]:n[0],et?NaN:t/u+n,[t,t+1/u]},r.copy=function(){return lu(n,t,e)},i()}function cu(n,t){function e(e){return e>=e?t[ao.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return cu(n,t)},e}function fu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qi(n,t)},t.tickFormat=function(t,e){return nu(n,t,e)},t.copy=function(){return fu(n)},t}function su(){return 0}function hu(n){return n.innerRadius}function pu(n){return n.outerRadius}function gu(n){return n.startAngle}function vu(n){return n.endAngle}function du(n){return n&&n.padAngle}function yu(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function mu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,v=(s+p)/2,d=h-f,y=p-s,m=d*d+y*y,M=e-r,x=f*p-h*s,b=(0>y?-1:1)*Math.sqrt(Math.max(0,M*M*m-x*x)),_=(x*y-d*b)/m,w=(-x*d-y*b)/m,S=(x*y+d*b)/m,k=(-x*d+y*b)/m,N=_-g,E=w-v,A=S-g,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s1?n.join("L"):n+"Z"}function bu(n){return n.join("L")+"Z"}function _u(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1&&i.push("H",r[0]),i.join("")}function wu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r));for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Fu(n){return n.length<3?xu(n):n[0]+Au(n,ju(n))}function Hu(n){for(var t,e,r,i=-1,u=n.length;++i=t?o(n-t):void(f.c=o)}function o(e){var i=g.active,u=g[i];u&&(u.timer.c=null,u.timer.t=NaN,--g.count,delete g[i],u.event&&u.event.interrupt.call(n,n.__data__,u.index));for(var o in g)if(r>+o){var c=g[o];c.timer.c=null,c.timer.t=NaN,--g.count,delete g[o]}f.c=a,qn(function(){return f.c&&a(e||1)&&(f.c=null,f.t=NaN),1},0,l),g.active=r,v.event&&v.event.start.call(n,n.__data__,t),p=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&p.push(r)}),h=v.ease,s=v.duration}function a(i){for(var u=i/s,o=h(u),a=p.length;a>0;)p[--a].call(n,o);return u>=1?(v.event&&v.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1):void 0}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),v=g[r];v||(l=i.time,f=qn(u,0,l),v=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function no(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function to(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function eo(n){return n.toISOString()}function ro(n,t,e){function r(t){return n(t)}function i(n,e){var r=n[1]-n[0],i=r/e,u=ao.bisect(Kl,i);return u==Kl.length?[t.year,Ki(n.map(function(n){return n/31536e6}),e)[2]]:u?t[i/Kl[u-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yi(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ro(n.copy(),t,e)},Ji(r,n)}function io(n){return new Date(n)}function uo(n){return JSON.parse(n.responseText)}function oo(n){var t=fo.createRange();return t.selectNode(fo.body),t.createContextualFragment(n.responseText)}var ao={version:"3.5.17"},lo=[].slice,co=function(n){return lo.call(n)},fo=this.document;if(fo)try{co(fo.documentElement.childNodes)[0].nodeType}catch(so){co=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),fo)try{fo.createElement("DIV").style.setProperty("opacity",0,"")}catch(ho){var po=this.Element.prototype,go=po.setAttribute,vo=po.setAttributeNS,yo=this.CSSStyleDeclaration.prototype,mo=yo.setProperty;po.setAttribute=function(n,t){go.call(this,n,t+"")},po.setAttributeNS=function(n,t,e){vo.call(this,n,t,e+"")},yo.setProperty=function(n,t,e){mo.call(this,n,t+"",e)}}ao.ascending=e,ao.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ao.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ir&&(e=r)}else{for(;++i=r){e=r;break}for(;++ir&&(e=r)}return e},ao.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ie&&(e=r)}else{for(;++i=r){e=r;break}for(;++ie&&(e=r)}return e},ao.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}else{for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}return[e,i]},ao.sum=function(n,t){var e,r=0,u=n.length,o=-1;if(1===arguments.length)for(;++o1?l/(f-1):void 0},ao.deviation=function(){var n=ao.variance.apply(this,arguments);return n?Math.sqrt(n):n};var Mo=u(e);ao.bisectLeft=Mo.left,ao.bisect=ao.bisectRight=Mo.right,ao.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},ao.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,2>u&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},ao.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ao.pairs=function(n){for(var t,e=0,r=n.length-1,i=n[0],u=new Array(0>r?0:r);r>e;)u[e]=[t=i,i=n[++e]];return u},ao.transpose=function(n){if(!(i=n.length))return[];for(var t=-1,e=ao.min(n,o),r=new Array(e);++t=0;)for(r=n[i],t=r.length;--t>=0;)e[--o]=r[t];return e};var xo=Math.abs;ao.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,i=[],u=a(xo(e)),o=-1;if(n*=u,t*=u,e*=u,0>e)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,v=u[a++],d=new c;++p=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(ao.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},ao.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(y,{has:h,add:function(n){return this._[f(n+="")]=!0,n},remove:p,values:g,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t))}}),ao.behavior={},ao.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ao.event=null,ao.requote=function(n){return n.replace(So,"\\$&")};var So=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ko={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},No=function(n,t){return t.querySelector(n)},Eo=function(n,t){return t.querySelectorAll(n)},Ao=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ao=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(No=function(n,t){return Sizzle(n,t)[0]||null},Eo=Sizzle,Ao=Sizzle.matchesSelector),ao.selection=function(){return ao.select(fo.documentElement)};var Co=ao.selection.prototype=[];Co.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Lo.hasOwnProperty(e)?{space:Lo[e],local:n}:n}},Co.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ao.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Co.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++ii){if("string"!=typeof n){2>i&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>i){var u=this.node();return t(u).getComputedStyle(u,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Co.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},Co.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Co.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Co.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Co.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Co.remove=function(){return this.each(F)},Co.data=function(n,t){function e(n,e){var r,i,u,o=n.length,s=e.length,h=Math.min(o,s),p=new Array(s),g=new Array(s),v=new Array(o);if(t){var d,y=new c,m=new Array(o);for(r=-1;++rr;++r)g[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}g.update=p,g.parentNode=p.parentNode=v.parentNode=n.parentNode,a.push(g),l.push(p),f.push(v)}var r,i,u=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++uu;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return E(i)},Co.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Co.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Co.size=function(){var n=0;return Y(this,function(){++n}),n};var qo=[];ao.selection.enter=Z,ao.selection.enter.prototype=qo,qo.append=Co.append,qo.empty=Co.empty,qo.node=Co.node,qo.call=Co.call,qo.size=Co.size,qo.select=function(n){for(var t,e,r,i,u,o=[],a=-1,l=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var To=ao.map({mouseenter:"mouseover",mouseleave:"mouseout"});fo&&To.forEach(function(n){"on"+n in fo&&To.remove(n)});var Ro,Do=0;ao.mouse=function(n){return J(n,k())};var Po=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ao.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,i=0,u=t.length;u>i;++i)if((r=t[i]).identifier===e)return J(n,r)},ao.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",o)}function e(n,t,e,u,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],g|=n|e,M=r,p({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(y.on(u+d,null).on(o+d,null),m(g),p({type:"dragend"}))}var c,f=this,s=ao.event.target.correspondingElement||ao.event.target,h=f.parentNode,p=r.of(f,arguments),g=0,v=n(),d=".drag"+(null==v?"":"-"+v),y=ao.select(e(s)).on(u+d,a).on(o+d,l),m=W(s),M=t(h,v);i?(c=i.apply(f,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],p({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),i=null,u=e(b,ao.mouse,t,"mousemove","mouseup"),o=e(G,ao.touch,m,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},ao.rebind(n,r,"on")},ao.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?co(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Uo=1e-6,jo=Uo*Uo,Fo=Math.PI,Ho=2*Fo,Oo=Ho-Uo,Io=Fo/2,Yo=Fo/180,Zo=180/Fo,Vo=Math.SQRT2,Xo=2,$o=4;ao.interpolateZoom=function(n,t){var e,r,i=n[0],u=n[1],o=n[2],a=t[0],l=t[1],c=t[2],f=a-i,s=l-u,h=f*f+s*s;if(jo>h)r=Math.log(c/o)/Vo,e=function(n){return[i+n*f,u+n*s,o*Math.exp(Vo*n*r)]};else{var p=Math.sqrt(h),g=(c*c-o*o+$o*h)/(2*o*Xo*p),v=(c*c-o*o-$o*h)/(2*c*Xo*p),d=Math.log(Math.sqrt(g*g+1)-g),y=Math.log(Math.sqrt(v*v+1)-v);r=(y-d)/Vo,e=function(n){var t=n*r,e=rn(d),a=o/(Xo*p)*(e*un(Vo*t+d)-en(d));return[i+a*f,u+a*s,o*e/rn(Vo*t+d)]}}return e.duration=1e3*r,e},ao.behavior.zoom=function(){function n(n){n.on(L,s).on(Wo+".zoom",p).on("dblclick.zoom",g).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function i(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},i(Math.pow(2,o)),u(d=e,r),t=ao.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),d=null)}function s(){function n(){a=1,u(ao.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=ao.select(t(i)).on(q,n).on(T,r),h=e(ao.mouse(i)),p=W(i);Il.call(i),l(o)}function h(){function n(){var n=ao.touches(g);return p=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ao.event.target;ao.select(t).on(x,r).on(b,a),_.push(t);for(var e=ao.event.changedTouches,i=0,u=e.length;u>i;++i)d[e[i].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var f=l[0];o(g,f,d[f.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=ao.touches(g);Il.call(g);for(var a=0,l=o.length;l>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var f=(f=e[0]-n[0])*f+(f=e[1]-n[1])*f,s=y&&Math.sqrt(f/y);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],i(s*p)}M=null,u(n,t),c(v)}function a(){if(ao.event.touches.length){for(var t=ao.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var i in d)return void n()}ao.selectAll(_).on(m,null),w.on(L,s).on(R,h),N(),f(v)}var p,g=this,v=D.of(g,arguments),d={},y=0,m=".zoom-"+ao.event.changedTouches[0].identifier,x="touchmove"+m,b="touchend"+m,_=[],w=ao.select(g),N=W(g);t(),l(v),w.on(L,null).on(R,t)}function p(){var n=D.of(this,arguments);m?clearTimeout(m):(Il.call(this),v=e(d=y||ao.mouse(this)),l(n)),m=setTimeout(function(){m=null,f(n)},50),S(),i(Math.pow(2,.002*Bo())*k.k),u(d,v),c(n)}function g(){var n=ao.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ao.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,y,m,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Jo,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return Wo||(Wo="onwheel"in fo?(Bo=function(){return-ao.event.deltaY*(ao.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fo?(Bo=function(){return ao.event.wheelDelta},"mousewheel"):(Bo=function(){return-ao.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Hl?ao.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],i=d?d[0]:e/2,u=d?d[1]:r/2,o=ao.interpolateZoom([(i-k.x)/k.k,(u-k.y)/k.k,e/k.k],[(i-t.x)/t.k,(u-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:i-r[0]*a,y:u-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){f(n)}).each("end.zoom",function(){f(n)}):(this.__chart__=k,l(n),c(n),f(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},i(+t),a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Jo:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(y=t&&[+t[0],+t[1]],n):y},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ao.rebind(n,D,"on")};var Bo,Wo,Jo=[0,1/0];ao.color=an,an.prototype.toString=function(){return this.rgb()+""},ao.hsl=ln;var Go=ln.prototype=new an;Go.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Go.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Go.rgb=function(){return cn(this.h,this.s,this.l)},ao.hcl=fn;var Ko=fn.prototype=new an;Ko.brighter=function(n){return new fn(this.h,this.c,Math.min(100,this.l+Qo*(arguments.length?n:1)))},Ko.darker=function(n){return new fn(this.h,this.c,Math.max(0,this.l-Qo*(arguments.length?n:1)))},Ko.rgb=function(){return sn(this.h,this.c,this.l).rgb()},ao.lab=hn;var Qo=18,na=.95047,ta=1,ea=1.08883,ra=hn.prototype=new an;ra.brighter=function(n){return new hn(Math.min(100,this.l+Qo*(arguments.length?n:1)),this.a,this.b)},ra.darker=function(n){return new hn(Math.max(0,this.l-Qo*(arguments.length?n:1)),this.a,this.b)},ra.rgb=function(){return pn(this.l,this.a,this.b)},ao.rgb=mn;var ia=mn.prototype=new an;ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),new mn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mn(i,i,i)},ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mn(n*this.r,n*this.g,n*this.b)},ia.hsl=function(){return wn(this.r,this.g,this.b)},ia.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ua=ao.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ua.forEach(function(n,t){ua.set(n,Mn(t))}),ao.functor=En,ao.xhr=An(m),ao.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var o=Cn(n,t,null==e?r:i(e),u);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:i(n)):e},o}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function u(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(f>=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++f;){var r=n.charCodeAt(f++),a=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(f)&&(++f,++a);else if(r!==l)continue;return n.slice(t,f-a)}return n.slice(t)}for(var r,i,u={},o={},a=[],c=n.length,f=0,s=0;(r=e())!==o;){for(var h=[];r!==u&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,s++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new y,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(u).join("\n")},e},ao.csv=ao.dsv(",","text/csv"),ao.tsv=ao.dsv(" ","text/tab-separated-values");var oa,aa,la,ca,fa=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ao.timer=function(){qn.apply(this,arguments)},ao.timer.flush=function(){Rn(),Dn()},ao.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var sa=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Un);ao.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=ao.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),sa[8+e/3]};var ha=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pa=ao.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ao.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ga=ao.time={},va=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){da.setUTCDate.apply(this._,arguments)},setDay:function(){da.setUTCDay.apply(this._,arguments)},setFullYear:function(){da.setUTCFullYear.apply(this._,arguments)},setHours:function(){da.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){da.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){da.setUTCMinutes.apply(this._,arguments)},setMonth:function(){da.setUTCMonth.apply(this._,arguments)},setSeconds:function(){da.setUTCSeconds.apply(this._,arguments)},setTime:function(){da.setTime.apply(this._,arguments)}};var da=Date.prototype;ga.year=On(function(n){return n=ga.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ga.years=ga.year.range,ga.years.utc=ga.year.utc.range,ga.day=On(function(n){var t=new va(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ga.days=ga.day.range,ga.days.utc=ga.day.utc.range,ga.dayOfYear=function(n){var t=ga.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ga[n]=On(function(n){return(n=ga.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ga[n+"s"]=e.range,ga[n+"s"].utc=e.utc.range,ga[n+"OfYear"]=function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)}}),ga.week=ga.sunday,ga.weeks=ga.sunday.range,ga.weeks.utc=ga.sunday.utc.range,ga.weekOfYear=ga.sundayOfYear;var ya={"-":"",_:" ",0:"0"},ma=/^\s*\d+/,Ma=/^%/;ao.locale=function(n){return{numberFormat:jn(n),timeFormat:Yn(n)}};var xa=ao.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], -shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ao.format=xa.numberFormat,ao.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,ba),st(ba.s,this.s,this),this.s?this.t+=ba.t:this.s=ba.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ba=new ft;ao.geo.stream=function(n,t){n&&_a.hasOwnProperty(n.type)?_a[n.type](n,t):ht(n,t)};var _a={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++rn?4*Fo+n:n,Na.lineStart=Na.lineEnd=Na.point=b}};ao.geo.bounds=function(){function n(n,t){M.push(x=[f=n,h=n]),s>t&&(s=t),t>p&&(p=t)}function t(t,e){var r=dt([t*Yo,e*Yo]);if(y){var i=mt(y,r),u=[i[1],-i[0],0],o=mt(u,i);bt(o),o=_t(o);var l=t-g,c=l>0?1:-1,v=o[0]*Zo*c,d=xo(l)>180;if(d^(v>c*g&&c*t>v)){var m=o[1]*Zo;m>p&&(p=m)}else if(v=(v+360)%360-180,d^(v>c*g&&c*t>v)){var m=-o[1]*Zo;s>m&&(s=m)}else s>e&&(s=e),e>p&&(p=e);d?g>t?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(f>t&&(f=t),t>h&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){b.point=t}function r(){x[0]=f,x[1]=h,b.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=xo(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Na.point(n,e),t(n,e)}function u(){Na.lineStart()}function o(){i(v,d),Na.lineEnd(),xo(m)>Uo&&(f=-(h=180)),x[0]=f,x[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nka?(f=-(h=180),s=-(p=90)):m>Uo?p=90:-Uo>m&&(s=-90),x[0]=f,x[1]=h}};return function(n){p=h=-(f=s=1/0),M=[],ao.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],c(e[0],i)||c(e[1],i)?(a(i[0],e[1])>a(i[0],i[1])&&(i[1]=e[1]),a(e[0],i[1])>a(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var o,e,g=-(1/0),t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(o=a(i[1],e[0]))>g&&(g=o,f=e[0],h=i[1])}return M=x=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),ao.geo.centroid=function(n){Ea=Aa=Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,ja);var t=Da,e=Pa,r=Ua,i=t*t+e*e+r*r;return jo>i&&(t=qa,e=Ta,r=Ra,Uo>Aa&&(t=Ca,e=za,r=La),i=t*t+e*e+r*r,jo>i)?[NaN,NaN]:[Math.atan2(e,t)*Zo,tn(r/Math.sqrt(i))*Zo]};var Ea,Aa,Ca,za,La,qa,Ta,Ra,Da,Pa,Ua,ja={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){ja.lineStart=At},polygonEnd:function(){ja.lineStart=Nt}},Fa=Rt(zt,jt,Ht,[-Fo,-Fo/2]),Ha=1e9;ao.geo.clipExtent=function(){var n,t,e,r,i,u,o={stream:function(n){return i&&(i.valid=!1),i=u(n),i.valid=!0,i},extent:function(a){return arguments.length?(u=Zt(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),i&&(i.valid=!1,i=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ao.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,ao.geo.albers=function(){return ao.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ao.geo.albersUsa=function(){function n(n){var u=n[0],o=n[1];return t=null,e(u,o),t||(r(u,o),t)||i(u,o),t}var t,e,r,i,u=ao.geo.albers(),o=ao.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ao.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?o:i>=.166&&.234>i&&r>=-.214&&-.115>r?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Uo,s+.12*c+Uo],[f-.214*c-Uo,s+.234*c-Uo]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Uo,s+.166*c+Uo],[f-.115*c-Uo,s+.234*c-Uo]]).stream(l).point,n},n.scale(1070)};var Oa,Ia,Ya,Za,Va,Xa,$a={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Ia=0,$a.lineStart=$t},polygonEnd:function(){$a.lineStart=$a.lineEnd=$a.point=b,Oa+=xo(Ia/2)}},Ba={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Wa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Wa.lineStart=ne},polygonEnd:function(){Wa.point=Gt,Wa.lineStart=Kt,Wa.lineEnd=Qt}};ao.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),ao.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return Oa=0,ao.geo.stream(n,i($a)),Oa},n.centroid=function(n){return Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,i(Wa)),Ua?[Da/Ua,Pa/Ua]:Ra?[qa/Ra,Ta/Ra]:La?[Ca/La,za/La]:[NaN,NaN]},n.bounds=function(n){return Va=Xa=-(Ya=Za=1/0),ao.geo.stream(n,i(Ba)),[[Ya,Za],[Va,Xa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(ao.geo.albersUsa()).context(null)},ao.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ao.geo.projection=oe,ao.geo.projectionMutator=ae,(ao.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,ao.geo.rotation=function(n){function t(t){return t=n(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t}return n=se(n[0]%360*Yo,n[1]*Yo,n.length>2?n[2]*Yo:0),t.invert=function(t){return t=n.invert(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t},t},fe.invert=ce,ao.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Yo,-n[1]*Yo,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Zo,n[1]*=Zo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Yo,i*Yo),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Yo,(i=+r)*Yo),n):i},n.angle(90)},ao.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Yo,i=n[1]*Yo,u=t[1]*Yo,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},ao.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ao.range(Math.ceil(u/d)*d,i,d).map(h).concat(ao.range(Math.ceil(c/y)*y,l,y).map(p)).concat(ao.range(Math.ceil(r/g)*g,e,g).filter(function(n){return xo(n%d)>Uo}).map(f)).concat(ao.range(Math.ceil(a/v)*v,o,v).filter(function(n){return xo(n%y)>Uo}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,v=g,d=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],y=+t[1],n):[d,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],v=+t[1],n):[g,v]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Uo],[180,90-Uo]]).minorExtent([[-180,-80-Uo],[180,80+Uo]])},ao.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=Me,i=xe;return n.distance=function(){return ao.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ao.geo.interpolate=function(n,t){return be(n[0]*Yo,n[1]*Yo,t[0]*Yo,t[1]*Yo)},ao.geo.length=function(n){return Ja=0,ao.geo.stream(n,Ga),Ja};var Ja,Ga={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Ka=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ao.geo.azimuthalEqualArea=function(){return oe(Ka)}).raw=Ka;var Qa=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(ao.geo.azimuthalEquidistant=function(){return oe(Qa)}).raw=Qa,(ao.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(ao.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var nl=we(function(n){return 1/n},Math.atan);(ao.geo.gnomonic=function(){return oe(nl)}).raw=nl,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Io]},(ao.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var tl=we(function(){return 1},Math.asin);(ao.geo.orthographic=function(){return oe(tl)}).raw=tl;var el=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ao.geo.stereographic=function(){return oe(el)}).raw=el,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Io]},(ao.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,ao.geom={},ao.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;o>t;t++)a.push([+i.call(this,n[t],t),+u.call(this,n[t],t),t]);for(a.sort(qe),t=0;o>t;t++)l.push([a[t][0],-a[t][1]]);var c=Le(a),f=Le(l),s=f[0]===c[0],h=f[f.length-1]===c[c.length-1],p=[];for(t=c.length-1;t>=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[];f.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Uo)*Uo,y:Math.round(o(n,t)/Uo)*Uo,i:t}})}var r=Ce,i=ze,u=r,o=i,a=sl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u,o=e.site,a=e.edges.sort(Ve),l=-1,c=a.length,f=a[c-1].edge,s=f.l===o?f.r:f.l;++l=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]=hr()),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,v,d,y,m,M=En(a),x=En(l);if(null!=t)v=t,d=e,y=r,m=i;else if(y=m=-(v=d=1/0),s=[],h=[],g=n.length,o)for(p=0;g>p;++p)f=n[p],f.xy&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;g>p;++p){var b=+M(f=n[p],p),_=+x(f,p);v>b&&(v=b),d>_&&(d=_),b>y&&(y=b),_>m&&(m=_),s.push(b),h.push(_)}var w=y-v,S=m-d;w>S?m=d+w:y=v+S;var k=hr();if(k.add=function(n){u(k,n,+M(n,++p),+x(n,p),v,d,y,m)},k.visit=function(n){pr(n,k,v,d,y,m)},k.find=function(n){return gr(k,n[0],n[1],v,d,y,m)},p=-1,null==t){for(;++p=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=vl.get(e)||gl,r=dl.get(r)||m,br(r(e.apply(null,lo.call(arguments,1))))},ao.interpolateHcl=Rr,ao.interpolateHsl=Dr,ao.interpolateLab=Pr,ao.interpolateRound=Ur,ao.transform=function(n){var t=fo.createElementNS(ao.ns.prefix.svg,"g");return(ao.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:yl)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var yl={a:1,b:0,c:0,d:1,e:0,f:0};ao.interpolateTransform=$r,ao.layout={},ao.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/y){if(v>l){var c=t.charge/l;n.px-=u*c,n.py-=o*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=u*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=ao.event.x,n.py=ao.event.y,l.resume()}var e,r,i,u,o,a,l={},c=ao.dispatch("start","tick","end"),f=[1,1],s=.9,h=ml,p=Ml,g=-30,v=xl,d=.1,y=.64,M=[],x=[];return l.tick=function(){if((i*=.99)<.005)return e=null,c.end({type:"end",alpha:i=0}),!0;var t,r,l,h,p,v,y,m,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,p=l.target,m=p.x-h.x,b=p.y-h.y,(v=m*m+b*b)&&(v=i*o[r]*((v=Math.sqrt(v))-u[r])/v,m*=v,b*=v,p.x-=m*(y=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=b*y,h.x+=m*(y=1-y),h.y+=b*y);if((y=i*d)&&(m=f[0]/2,b=f[1]/2,r=-1,y))for(;++r<_;)l=M[r],l.x+=(m-l.x)*y,l.y+=(b-l.y)*y;if(g)for(ri(t=ao.geom.quadtree(M),i,a),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*s,l.y-=(l.py-(l.py=l.y))*s);c.tick({type:"tick",alpha:i})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(f=n,l):f},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.friction=function(n){return arguments.length?(s=+n,l):s},l.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(y=n*n,l):Math.sqrt(y)},l.alpha=function(n){return arguments.length?(n=+n,i?n>0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;i>l;++l)e[l]=[];for(l=0;c>l;++l){var u=x[l];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var o,a=e[t],l=-1,f=a.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;i>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",s)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof h)for(t=0;c>t;++t)u[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)u[t]=h;if(o=[],"function"==typeof p)for(t=0;c>t;++t)o[t]=+p.call(this,x[t],t);else for(t=0;c>t;++t)o[t]=p;if(a=[],"function"==typeof g)for(t=0;i>t;++t)a[t]=+g.call(this,M[t],t);else for(t=0;i>t;++t)a[t]=g;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=ao.behavior.drag().origin(m).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?void this.on("mouseover.force",ti).on("mouseout.force",ei).call(r):r},ao.rebind(l,c,"on")};var ml=20,Ml=1,xl=1/0;ao.layout.hierarchy=function(){function n(i){var u,o=[i],a=[];for(i.depth=0;null!=(u=o.pop());)if(a.push(u),(c=e.call(n,u,u.depth))&&(l=c.length)){for(var l,c,f;--l>=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return oi(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=ci,e=ai,r=li;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ui(t,function(n){n.children&&(n.value=0)}),oi(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ao.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++cs?-1:1),g=ao.sum(c),v=g?(s-l*p)/g:0,d=ao.range(l),y=[];return null!=e&&d.sort(e===bl?function(n,t){return c[t]-c[n]}:function(n,t){return e(o[n],o[t])}),d.forEach(function(n){y[n]={data:o[n],value:a=c[n],startAngle:f,endAngle:f+=a*v+p,padAngle:h}}),y}var t=Number,e=bl,r=0,i=Ho,u=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n.padAngle=function(t){return arguments.length?(u=t,n):u},n};var bl={};ao.layout.stack=function(){function n(a,l){if(!(h=a.length))return a;var c=a.map(function(e,r){return t.call(n,e,r)}),f=c.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),o.call(n,t,e)]})}),s=e.call(n,f,l);c=ao.permute(c,s),f=ao.permute(f,s);var h,p,g,v,d=r.call(n,f,l),y=c[0].length;for(g=0;y>g;++g)for(i.call(n,c[0][g],v=d[g],f[0][g][1]),p=1;h>p;++p)i.call(n,c[p][g],v+=f[p-1][g][1],f[p][g][1]);return a}var t=m,e=gi,r=vi,i=pi,u=si,o=hi;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:_l.get(t)||gi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:wl.get(t)||vi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(i=t,n):i},n};var _l=ao.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(di),u=n.map(yi),o=ao.range(r).sort(function(n,t){return i[n]-i[t]}),a=0,l=0,c=[],f=[];for(t=0;r>t;++t)e=o[t],l>a?(a+=u[e],c.push(e)):(l+=u[e],f.push(e));return f.reverse().concat(c)},reverse:function(n){return ao.range(n.length).reverse()},"default":gi}),wl=ao.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,o=[],a=0,l=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;u>e;++e)l[e]=(a-o[e])/2;return l},wiggle:function(n){var t,e,r,i,u,o,a,l,c,f=n.length,s=n[0],h=s.length,p=[];for(p[0]=l=c=0,e=1;h>e;++e){for(t=0,i=0;f>t;++t)i+=n[t][e][1];for(t=0,u=0,a=s[e][0]-s[e-1][0];f>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;u+=o*n[t][e][1]}p[e]=l-=i?u/i*a:0,c>l&&(c=l)}for(e=0;h>e;++e)p[e]-=c;return p},expand:function(n){var t,e,r,i=n.length,u=n[0].length,o=1/i,a=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=o}for(e=0;u>e;++e)a[e]=0;return a},zero:vi});ao.layout.histogram=function(){function n(n,u){for(var o,a,l=[],c=n.map(e,this),f=r.call(this,c,u),s=i.call(this,f,c,u),u=-1,h=c.length,p=s.length-1,g=t?1:1/h;++u0)for(u=-1;++u=f[0]&&a<=f[1]&&(o=l[ao.bisect(s,a,1,p)-1],o.y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=bi,i=Mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ao.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,oi(a,function(n){n.r=+f(n.value)}),oi(a,Ni),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;oi(a,function(n){n.r+=s}),oi(a,Ni),oi(a,function(n){n.r-=s})}return Ci(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=ao.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ao.layout.tree=function(){function n(n,i){var f=o.call(this,n,i),s=f[0],h=t(s);if(oi(h,e),h.parent.m=-h.z,ui(h,r),c)ui(s,u);else{var p=s,g=s,v=s;ui(s,function(n){n.xg.x&&(g=n),n.depth>v.depth&&(v=n)});var d=a(p,g)/2-p.x,y=l[0]/(g.x+a(g,p)/2+d),m=l[1]/(v.depth||1);ui(s,function(n){n.x=(n.x+d)*y,n.y=n.depth*m})}return f}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var i,u=t.children,o=0,a=u.length;a>o;++o)r.push((u[o]=i={_:u[o],parent:t,children:(i=u[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Di(n);var u=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-u):n.z=u}else r&&(n.z=r.z+a(n._,r._));n.parent.A=i(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function i(n,t,e){if(t){for(var r,i=n,u=n,o=t,l=i.parent.children[0],c=i.m,f=u.m,s=o.m,h=l.m;o=Ti(o),i=qi(i),o&&i;)l=qi(l),u=Ti(u),u.a=n,r=o.z+s-i.z-c+a(o._,i._),r>0&&(Ri(Pi(o,n,e),n,r),c+=r,f+=r),s+=o.m,c+=i.m,h+=l.m,f+=u.m;o&&!Ti(u)&&(u.t=o,u.m+=s-f),i&&!qi(l)&&(l.t=i,l.m+=c-h,e=n)}return e}function u(n){n.x*=l[0],n.y=n.depth*l[1]}var o=ao.layout.hierarchy().sort(null).value(null),a=Li,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(c=null==(l=t)?u:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:u,n):c?l:null},ii(n,o)},ao.layout.cluster=function(){function n(n,u){var o,a=t.call(this,n,u),l=a[0],c=0;oi(l,function(n){var t=n.children;t&&t.length?(n.x=ji(t),n.y=Ui(t)):(n.x=o?c+=e(n,o):0,n.y=0,o=n)});var f=Fi(l),s=Hi(l),h=f.x-e(f,s)/2,p=s.x+e(s,f)/2;return oi(l,i?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(p-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),a}var t=ao.layout.hierarchy().sort(null).value(null),e=Li,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ao.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++it?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var o,a,l,c=s(e),f=[],h=u.slice(),g=1/0,v="slice"===p?c.dx:"dice"===p?c.dy:"slice-dice"===p?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),f.area=0;(l=h.length)>0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,v))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,v,c,!1),v=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,v,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++oe&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0; -if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++ue.dx)&&(f=e.dx);++ue&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ao.random.normal.apply(ao,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ao.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ao.scale={};var Sl={floor:m,ceil:m};ao.scale.linear=function(){return Wi([0,1],[0,1],Mr,!1)};var kl={s:1,g:1,p:1,r:1,e:1};ao.scale.log=function(){return ru(ao.scale.linear().domain([0,1]),10,!0,[1,10])};var Nl=ao.format(".0e"),El={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ao.scale.pow=function(){return iu(ao.scale.linear(),1,[0,1])},ao.scale.sqrt=function(){return ao.scale.pow().exponent(.5)},ao.scale.ordinal=function(){return ou([],{t:"range",a:[[]]})},ao.scale.category10=function(){return ao.scale.ordinal().range(Al)},ao.scale.category20=function(){return ao.scale.ordinal().range(Cl)},ao.scale.category20b=function(){return ao.scale.ordinal().range(zl)},ao.scale.category20c=function(){return ao.scale.ordinal().range(Ll)};var Al=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Cl=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),zl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),Ll=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);ao.scale.quantile=function(){return au([],[])},ao.scale.quantize=function(){return lu(0,1,[0,1])},ao.scale.threshold=function(){return cu([.5],[0,1])},ao.scale.identity=function(){return fu([0,1])},ao.svg={},ao.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),f=o.apply(this,arguments)-Io,s=a.apply(this,arguments)-Io,h=Math.abs(s-f),p=f>s?0:1;if(n>c&&(g=c,c=n,n=g),h>=Oo)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,v,d,y,m,M,x,b,_,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(d=u===ql?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(d/c*Math.sin(y))),n&&(N=tn(d/n*Math.sin(y)))),c){m=c*Math.cos(f+E),M=c*Math.sin(f+E),x=c*Math.cos(s-E),b=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Fo?0:1;if(E&&yu(m,M,x,b)===p^C){var z=(f+s)/2;m=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else m=M=0;if(n){_=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Fo?0:1;if(N&&yu(_,w,S,k)===1-p^L){var q=(f+s)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Uo&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){v=c>n^p?0:1;var T=g,R=g;if(Fo>h){var D=null==S?[_,w]:null==x?[m,M]:Re([m,M],[S,k],[x,b],[_,w]),P=m-D[0],U=M-D[1],j=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*j+U*F)/(Math.sqrt(P*P+U*U)*Math.sqrt(j*j+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(g,(n-O)/(H-1)),T=Math.min(g,(c-O)/(H+1))}if(null!=x){var I=mu(null==S?[_,w]:[S,k],[m,M],c,T,p),Y=mu([x,b],[_,w],c,T,p);g===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-p^yu(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",p," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",m,",",M);if(null!=S){var Z=mu([m,M],[S,k],n,-R,p),V=mu([_,w],null==x?[m,M]:[x,b],n,-R,p);g===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",p^yu(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-p," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",m,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",p," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-p," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hu,r=pu,i=su,u=ql,o=gu,a=vu,l=du;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(i=En(t),n):i},n.padRadius=function(t){return arguments.length?(u=t==ql?ql:En(t),n):u},n.startAngle=function(t){return arguments.length?(o=En(t),n):o},n.endAngle=function(t){return arguments.length?(a=En(t),n):a},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Io;return[Math.cos(t)*n,Math.sin(t)*n]},n};var ql="auto";ao.svg.line=function(){return Mu(m)};var Tl=ao.map({linear:xu,"linear-closed":bu,step:_u,"step-before":wu,"step-after":Su,basis:zu,"basis-open":Lu,"basis-closed":qu,bundle:Tu,cardinal:Eu,"cardinal-open":ku,"cardinal-closed":Nu,monotone:Fu});Tl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Rl=[0,2/3,1/3,0],Dl=[0,1/3,2/3,0],Pl=[0,1/6,2/3,1/6];ao.svg.line.radial=function(){var n=Mu(Hu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wu.reverse=Su,Su.reverse=wu,ao.svg.area=function(){return Ou(m)},ao.svg.area.radial=function(){var n=Ou(Hu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ao.svg.chord=function(){function n(n,a){var l=t(this,u,n,a),c=t(this,o,n,a);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?i(l.r,l.p1,l.r,l.p0):i(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+i(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=a.call(n,i,r),o=l.call(n,i,r)-Io,f=c.call(n,i,r)-Io;return{r:u,a0:o,a1:f,p0:[u*Math.cos(o),u*Math.sin(o)],p1:[u*Math.cos(f),u*Math.sin(f)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Fo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=Me,o=xe,a=Iu,l=gu,c=vu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},ao.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yu;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ao.svg.diagonal.radial=function(){var n=ao.svg.diagonal(),t=Yu,e=n.projection;return n.projection=function(n){return arguments.length?e(Zu(t=n)):t},n},ao.svg.symbol=function(){function n(n,r){return(Ul.get(t.call(this,n,r))||$u)(e.call(this,n,r))}var t=Xu,e=Vu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Ul=ao.map({circle:$u,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Fl)),e=t*Fl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ao.svg.symbolTypes=Ul.keys();var jl=Math.sqrt(3),Fl=Math.tan(30*Yo);Co.transition=function(n){for(var t,e,r=Hl||++Zl,i=Ku(n),u=[],o=Ol||{time:Date.now(),ease:Nr,delay:0,duration:250},a=-1,l=this.length;++au;u++){i.push(t=[]);for(var e=this[u],a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return Wu(i,this.namespace,this.id)},Yl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(i){i[r][e].tween.set(n,t)})},Yl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?$r:Mr,a=ao.ns.qualify(n);return Ju(this,"attr."+n,t,a.local?u:i)},Yl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ao.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yl.style=function(n,e,r){function i(){this.style.removeProperty(n)}function u(e){return null==e?i:(e+="",function(){var i,u=t(this).getComputedStyle(this,null).getPropertyValue(n);return u!==e&&(i=Mr(u,e),function(t){this.style.setProperty(n,i(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ju(this,"style."+n,e,u)},Yl.styleTween=function(n,e,r){function i(i,u){var o=e.call(this,i,u,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,i)},Yl.text=function(n){return Ju(this,"text",n,Gu)},Yl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Yl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ao.ease.apply(ao,arguments)),Y(this,function(r){r[e][t].ease=n}))},Yl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,i,u){r[e][t].delay=+n.call(r,r.__data__,i,u)}:(n=+n,function(r){r[e][t].delay=n}))},Yl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,i,u){r[e][t].duration=Math.max(1,n.call(r,r.__data__,i,u))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Yl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var i=Ol,u=Hl;try{Hl=e,Y(this,function(t,i,u){Ol=t[r][e],n.call(t,t.__data__,i,u)})}finally{Ol=i,Hl=u}}else Y(this,function(i){var u=i[r][e];(u.event||(u.event=ao.dispatch("start","end","interrupt"))).on(n,t)});return this},Yl.transition=function(){for(var n,t,e,r,i=this.id,u=++Zl,o=this.namespace,a=[],l=0,c=this.length;c>l;l++){a.push(n=[]);for(var t=this[l],f=0,s=t.length;s>f;f++)(e=t[f])&&(r=e[o][i],Qu(e,f,o,u,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wu(a,o,u)},ao.svg.axis=function(){function n(n){n.each(function(){var n,c=ao.select(this),f=this.__chart__||e,s=this.__chart__=e.copy(),h=null==l?s.ticks?s.ticks.apply(s,a):s.domain():l,p=null==t?s.tickFormat?s.tickFormat.apply(s,a):m:t,g=c.selectAll(".tick").data(h,s),v=g.enter().insert("g",".domain").attr("class","tick").style("opacity",Uo),d=ao.transition(g.exit()).style("opacity",Uo).remove(),y=ao.transition(g.order()).style("opacity",1),M=Math.max(i,0)+o,x=Zi(s),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ao.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=y.select("line"),C=g.select("text").text(p),z=v.select("text"),L=y.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=no,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*u+"V0H"+x[1]+"V"+q*u)):(n=to,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*u+","+x[0]+"H0V"+x[1]+"H"+q*u)),E.attr(N,q*i),z.attr(k,q*M),A.attr(S,0).attr(N,q*i),L.attr(w,0).attr(k,q*M),s.rangeBand){var T=s,R=T.rangeBand()/2;f=s=function(n){return T(n)+R}}else f.rangeBand?f=s:d.call(n,s,f);v.call(n,f,s),y.call(n,s,s)})}var t,e=ao.scale.linear(),r=Vl,i=6,u=6,o=3,a=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Xl?t+"":Vl,n):r},n.ticks=function(){return arguments.length?(a=co(arguments),n):a},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(i=+t,u=+arguments[e-1],n):i},n.innerTickSize=function(t){return arguments.length?(i=+t,n):i},n.outerTickSize=function(t){return arguments.length?(u=+t,n):u},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Vl="bottom",Xl={top:1,right:1,bottom:1,left:1};ao.svg.brush=function(){function n(t){t.each(function(){var t=ao.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,m);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return $l[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,s=ao.transition(t),h=ao.transition(o);c&&(l=Zi(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(s)),f&&(l=Zi(f),h.attr("y",l[0]).attr("height",l[1]-l[0]),i(s)),e(s)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==ao.event.keyCode&&(C||(M=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function v(){32==ao.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function d(){var n=ao.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ao.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]f?(i=r,r=f):i=f),v[0]!=r||v[1]!=i?(e?a=null:o=null,v[0]=r,v[1]=i,!0):void 0}function m(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ao.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ao.select(ao.event.target),w=l.of(b,arguments),k=ao.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&f,C=_.classed("extent"),z=W(b),L=ao.mouse(b),q=ao.select(t(b)).on("keydown.brush",u).on("keyup.brush",v);if(ao.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",m):q.on("mousemove.brush",d).on("mouseup.brush",m),k.interrupt().selectAll("*").interrupt(),C)L[0]=s[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[s[1-T]-L[0],h[1-R]-L[1]],L[0]=s[T],L[1]=h[R]}else ao.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ao.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,l=N(n,"brushstart","brush","brushend"),c=null,f=null,s=[0,0],h=[0,0],p=!0,g=!0,v=Bl[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:s,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Hl?ao.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,s=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(s,t.x),r=xr(h,t.y);return o=a=null,function(i){s=t.x=e(i),h=t.y=r(i),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=Bl[!c<<1|!f],n):c},n.y=function(t){return arguments.length?(f=t,v=Bl[!c<<1|!f],n):f},n.clamp=function(t){return arguments.length?(c&&f?(p=!!t[0],g=!!t[1]):c?p=!!t:f&&(g=!!t),n):c&&f?[p,g]:c?p:f?g:null},n.extent=function(t){var e,r,i,u,l;return arguments.length?(c&&(e=t[0],r=t[1],f&&(e=e[0],r=r[0]),o=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),e==s[0]&&r==s[1]||(s=[e,r])),f&&(i=t[0],u=t[1],c&&(i=i[1],u=u[1]),a=[i,u],f.invert&&(i=f(i),u=f(u)),i>u&&(l=i,i=u,u=l),i==h[0]&&u==h[1]||(h=[i,u])),n):(c&&(o?(e=o[0],r=o[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),f&&(a?(i=a[0],u=a[1]):(i=h[0],u=h[1],f.invert&&(i=f.invert(i),u=f.invert(u)),i>u&&(l=i,i=u,u=l))),c&&f?[[e,i],[r,u]]:c?[e,r]:f&&[i,u])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!f&&h[0]==h[1]},ao.rebind(n,l,"on")};var $l={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Bl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Wl=ga.format=xa.timeFormat,Jl=Wl.utc,Gl=Jl("%Y-%m-%dT%H:%M:%S.%LZ");Wl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?eo:Gl,eo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},eo.toString=Gl.toString,ga.second=On(function(n){return new va(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ga.seconds=ga.second.range,ga.seconds.utc=ga.second.utc.range,ga.minute=On(function(n){return new va(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ga.minutes=ga.minute.range,ga.minutes.utc=ga.minute.utc.range,ga.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new va(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ga.hours=ga.hour.range,ga.hours.utc=ga.hour.utc.range,ga.month=On(function(n){return n=ga.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ga.months=ga.month.range,ga.months.utc=ga.month.utc.range;var Kl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Ql=[[ga.second,1],[ga.second,5],[ga.second,15],[ga.second,30],[ga.minute,1],[ga.minute,5],[ga.minute,15],[ga.minute,30],[ga.hour,1],[ga.hour,3],[ga.hour,6],[ga.hour,12],[ga.day,1],[ga.day,2],[ga.week,1],[ga.month,1],[ga.month,3],[ga.year,1]],nc=Wl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),tc={range:function(n,t,e){return ao.range(Math.ceil(n/e)*e,+t,e).map(io)},floor:m,ceil:m};Ql.year=ga.year,ga.scale=function(){return ro(ao.scale.linear(),Ql,nc)};var ec=Ql.map(function(n){return[n[0].utc,n[1]]}),rc=Jl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);ec.year=ga.year.utc,ga.scale.utc=function(){return ro(ao.scale.linear(),ec,rc)},ao.text=An(function(n){return n.responseText}),ao.json=function(n,t){return Cn(n,"application/json",uo,t)},ao.html=function(n,t){return Cn(n,"text/html",oo,t)},ao.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=ao,define(ao)):"object"==typeof module&&module.exports?module.exports=ao:this.d3=ao}(); \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js deleted file mode 100644 index 29cacd4..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js +++ /dev/null @@ -1,62 +0,0 @@ - $(function() { - var $window = $(window) - , $top_link = $('#toplink') - , $body = $('body, html') - , offset = $('#code').offset().top - , hidePopover = function ($target) { - $target.data('popover-hover', false); - - setTimeout(function () { - if (!$target.data('popover-hover')) { - $target.popover('hide'); - } - }, 300); - }; - - $top_link.hide().click(function(event) { - event.preventDefault(); - $body.animate({scrollTop:0}, 800); - }); - - $window.scroll(function() { - if($window.scrollTop() > offset) { - $top_link.fadeIn(); - } else { - $top_link.fadeOut(); - } - }).scroll(); - - $('.popin') - .popover({trigger: 'manual'}) - .on({ - 'mouseenter.popover': function () { - var $target = $(this); - var $container = $target.children().first(); - - $target.data('popover-hover', true); - - // popover already displayed - if ($target.next('.popover').length) { - return; - } - - // show the popover - $container.popover('show'); - - // register mouse events on the popover - $target.next('.popover:not(.popover-initialized)') - .on({ - 'mouseenter': function () { - $target.data('popover-hover', true); - }, - 'mouseleave': function () { - hidePopover($container); - } - }) - .addClass('popover-initialized'); - }, - 'mouseleave.popover': function () { - hidePopover($(this).children().first()); - } - }); - }); diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js deleted file mode 100644 index a1c07fd..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0f&&(e=a.render.queue[f]);f++)d=e.generate(),typeof e.callback==typeof Function&&e.callback(d);a.render.queue.splice(0,f),a.render.queue.length?setTimeout(c):(a.dispatch.render_end(),a.render.active=!1)};setTimeout(c)},a.render.active=!1,a.render.queue=[],a.addGraph=function(b){typeof arguments[0]==typeof Function&&(b={generate:arguments[0],callback:arguments[1]}),a.render.queue.push(b),a.render.active||a.render()},"undefined"!=typeof module&&"undefined"!=typeof exports&&(module.exports=a),"undefined"!=typeof window&&(window.nv=a),a.dom.write=function(a){return void 0!==window.fastdom?fastdom.write(a):a()},a.dom.read=function(a){return void 0!==window.fastdom?fastdom.read(a):a()},a.interactiveGuideline=function(){"use strict";function b(l){l.each(function(l){function m(){var a=d3.mouse(this),d=a[0],e=a[1],i=!0,j=!1;if(k&&(d=d3.event.offsetX,e=d3.event.offsetY,"svg"!==d3.event.target.tagName&&(i=!1),d3.event.target.className.baseVal.match("nv-legend")&&(j=!0)),i&&(d-=f.left,e-=f.top),0>d||0>e||d>o||e>p||d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement||j){if(k&&d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement&&(void 0===d3.event.relatedTarget.className||d3.event.relatedTarget.className.match(c.nvPointerEventsClass)))return;return h.elementMouseout({mouseX:d,mouseY:e}),b.renderGuideLine(null),void c.hidden(!0)}c.hidden(!1);var l=g.invert(d);h.elementMousemove({mouseX:d,mouseY:e,pointXValue:l}),"dblclick"===d3.event.type&&h.elementDblclick({mouseX:d,mouseY:e,pointXValue:l}),"click"===d3.event.type&&h.elementClick({mouseX:d,mouseY:e,pointXValue:l})}var n=d3.select(this),o=d||960,p=e||400,q=n.selectAll("g.nv-wrap.nv-interactiveLineLayer").data([l]),r=q.enter().append("g").attr("class"," nv-wrap nv-interactiveLineLayer");r.append("g").attr("class","nv-interactiveGuideLine"),j&&(j.on("touchmove",m).on("mousemove",m,!0).on("mouseout",m,!0).on("dblclick",m).on("click",m),b.guideLine=null,b.renderGuideLine=function(c){i&&(b.guideLine&&b.guideLine.attr("x1")===c||a.dom.write(function(){var b=q.select(".nv-interactiveGuideLine").selectAll("line").data(null!=c?[a.utils.NaNtoZero(c)]:[],String);b.enter().append("line").attr("class","nv-guideline").attr("x1",function(a){return a}).attr("x2",function(a){return a}).attr("y1",p).attr("y2",0),b.exit().remove()}))})})}var c=a.models.tooltip();c.duration(0).hideDelay(0)._isInteractiveLayer(!0).hidden(!1);var d=null,e=null,f={left:0,top:0},g=d3.scale.linear(),h=d3.dispatch("elementMousemove","elementMouseout","elementClick","elementDblclick"),i=!0,j=null,k="ActiveXObject"in window;return b.dispatch=h,b.tooltip=c,b.margin=function(a){return arguments.length?(f.top="undefined"!=typeof a.top?a.top:f.top,f.left="undefined"!=typeof a.left?a.left:f.left,b):f},b.width=function(a){return arguments.length?(d=a,b):d},b.height=function(a){return arguments.length?(e=a,b):e},b.xScale=function(a){return arguments.length?(g=a,b):g},b.showGuideLine=function(a){return arguments.length?(i=a,b):i},b.svgContainer=function(a){return arguments.length?(j=a,b):j},b},a.interactiveBisect=function(a,b,c){"use strict";if(!(a instanceof Array))return null;var d;d="function"!=typeof c?function(a){return a.x}:c;var e=function(a,b){return d(a)-b},f=d3.bisector(e).left,g=d3.max([0,f(a,b)-1]),h=d(a[g]);if("undefined"==typeof h&&(h=g),h===b)return g;var i=d3.min([g+1,a.length-1]),j=d(a[i]);return"undefined"==typeof j&&(j=i),Math.abs(j-b)>=Math.abs(h-b)?g:i},a.nearestValueIndex=function(a,b,c){"use strict";var d=1/0,e=null;return a.forEach(function(a,f){var g=Math.abs(b-a);null!=a&&d>=g&&c>g&&(d=g,e=f)}),e},function(){"use strict";a.models.tooltip=function(){function b(){if(k){var a=d3.select(k);"svg"!==a.node().tagName&&(a=a.select("svg"));var b=a.node()?a.attr("viewBox"):null;if(b){b=b.split(" ");var c=parseInt(a.style("width"),10)/b[2];p.left=p.left*c,p.top=p.top*c}}}function c(){if(!n){var a;a=k?k:document.body,n=d3.select(a).append("div").attr("class","nvtooltip "+(j?j:"xy-tooltip")).attr("id",v),n.style("top",0).style("left",0),n.style("opacity",0),n.selectAll("div, table, td, tr").classed(w,!0),n.classed(w,!0),o=n.node()}}function d(){if(r&&B(e)){b();var f=p.left,g=null!==i?i:p.top;return a.dom.write(function(){c();var b=A(e);b&&(o.innerHTML=b),k&&u?a.dom.read(function(){var a=k.getElementsByTagName("svg")[0],b={left:0,top:0};if(a){var c=a.getBoundingClientRect(),d=k.getBoundingClientRect(),e=c.top;if(0>e){var i=k.getBoundingClientRect();e=Math.abs(e)>i.height?0:e}b.top=Math.abs(e-d.top),b.left=Math.abs(c.left-d.left)}f+=k.offsetLeft+b.left-2*k.scrollLeft,g+=k.offsetTop+b.top-2*k.scrollTop,h&&h>0&&(g=Math.floor(g/h)*h),C([f,g])}):C([f,g])}),d}}var e=null,f="w",g=25,h=0,i=null,j=null,k=null,l=!0,m=400,n=null,o=null,p={left:null,top:null},q={left:0,top:0},r=!0,s=100,t=!0,u=!1,v="nvtooltip-"+Math.floor(1e5*Math.random()),w="nv-pointer-events-none",x=function(a){return a},y=function(a){return a},z=function(a){return a},A=function(a){if(null===a)return"";var b=d3.select(document.createElement("table"));if(t){var c=b.selectAll("thead").data([a]).enter().append("thead");c.append("tr").append("td").attr("colspan",3).append("strong").classed("x-value",!0).html(y(a.value))}var d=b.selectAll("tbody").data([a]).enter().append("tbody"),e=d.selectAll("tr").data(function(a){return a.series}).enter().append("tr").classed("highlight",function(a){return a.highlight});e.append("td").classed("legend-color-guide",!0).append("div").style("background-color",function(a){return a.color}),e.append("td").classed("key",!0).html(function(a,b){return z(a.key,b)}),e.append("td").classed("value",!0).html(function(a,b){return x(a.value,b)}),e.selectAll("td").each(function(a){if(a.highlight){var b=d3.scale.linear().domain([0,1]).range(["#fff",a.color]),c=.6;d3.select(this).style("border-bottom-color",b(c)).style("border-top-color",b(c))}});var f=b.node().outerHTML;return void 0!==a.footer&&(f+=""),f},B=function(a){if(a&&a.series){if(a.series instanceof Array)return!!a.series.length;if(a.series instanceof Object)return a.series=[a.series],!0}return!1},C=function(b){o&&a.dom.read(function(){var c,d,e=parseInt(o.offsetHeight,10),h=parseInt(o.offsetWidth,10),i=a.utils.windowSize().width,j=a.utils.windowSize().height,k=window.pageYOffset,p=window.pageXOffset;j=window.innerWidth>=document.body.scrollWidth?j:j-16,i=window.innerHeight>=document.body.scrollHeight?i:i-16;var r,t,u=function(a){var b=d;do isNaN(a.offsetTop)||(b+=a.offsetTop),a=a.offsetParent;while(a);return b},v=function(a){var b=c;do isNaN(a.offsetLeft)||(b+=a.offsetLeft),a=a.offsetParent;while(a);return b};switch(f){case"e":c=b[0]-h-g,d=b[1]-e/2,r=v(o),t=u(o),p>r&&(c=b[0]+g>p?b[0]+g:p-r+c),k>t&&(d=k-t+d),t+e>k+j&&(d=k+j-t+d-e);break;case"w":c=b[0]+g,d=b[1]-e/2,r=v(o),t=u(o),r+h>i&&(c=b[0]-h-g),k>t&&(d=k+5),t+e>k+j&&(d=k+j-t+d-e);break;case"n":c=b[0]-h/2-5,d=b[1]+g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),t+e>k+j&&(d=k+j-t+d-e);break;case"s":c=b[0]-h/2,d=b[1]-e-g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),k>t&&(d=k);break;case"none":c=b[0],d=b[1]-g,r=v(o),t=u(o)}c-=q.left,d-=q.top;var w=o.getBoundingClientRect(),k=window.pageYOffset||document.documentElement.scrollTop,p=window.pageXOffset||document.documentElement.scrollLeft,x="translate("+(w.left+p)+"px, "+(w.top+k)+"px)",y="translate("+c+"px, "+d+"px)",z=d3.interpolateString(x,y),A=n.style("opacity")<.1;l?n.transition().delay(m).duration(0).style("opacity",0):n.interrupt().transition().duration(A?0:s).styleTween("transform",function(){return z},"important").style("-webkit-transform",y).style("opacity",1)})};return d.nvPointerEventsClass=w,d.options=a.utils.optionsFunc.bind(d),d._options=Object.create({},{duration:{get:function(){return s},set:function(a){s=a}},gravity:{get:function(){return f},set:function(a){f=a}},distance:{get:function(){return g},set:function(a){g=a}},snapDistance:{get:function(){return h},set:function(a){h=a}},classes:{get:function(){return j},set:function(a){j=a}},chartContainer:{get:function(){return k},set:function(a){k=a}},fixedTop:{get:function(){return i},set:function(a){i=a}},enabled:{get:function(){return r},set:function(a){r=a}},hideDelay:{get:function(){return m},set:function(a){m=a}},contentGenerator:{get:function(){return A},set:function(a){A=a}},valueFormatter:{get:function(){return x},set:function(a){x=a}},headerFormatter:{get:function(){return y},set:function(a){y=a}},keyFormatter:{get:function(){return z},set:function(a){z=a}},headerEnabled:{get:function(){return t},set:function(a){t=a}},_isInteractiveLayer:{get:function(){return u},set:function(a){u=!!a}},position:{get:function(){return p},set:function(a){p.left=void 0!==a.left?a.left:p.left,p.top=void 0!==a.top?a.top:p.top}},offset:{get:function(){return q},set:function(a){q.left=void 0!==a.left?a.left:q.left,q.top=void 0!==a.top?a.top:q.top}},hidden:{get:function(){return l},set:function(a){l!=a&&(l=!!a,d())}},data:{get:function(){return e},set:function(a){a.point&&(a.value=a.point.x,a.series=a.series||{},a.series.value=a.point.y,a.series.color=a.point.color||a.series.color),e=a}},tooltipElem:{get:function(){return o},set:function(){}},id:{get:function(){return v},set:function(){}}}),a.utils.initOptions(d),d}}(),a.utils.windowSize=function(){var a={width:640,height:480};return window.innerWidth&&window.innerHeight?(a.width=window.innerWidth,a.height=window.innerHeight,a):"CSS1Compat"==document.compatMode&&document.documentElement&&document.documentElement.offsetWidth?(a.width=document.documentElement.offsetWidth,a.height=document.documentElement.offsetHeight,a):document.body&&document.body.offsetWidth?(a.width=document.body.offsetWidth,a.height=document.body.offsetHeight,a):a},a.utils.windowResize=function(b){return window.addEventListener?window.addEventListener("resize",b):a.log("ERROR: Failed to bind to window.resize with: ",b),{callback:b,clear:function(){window.removeEventListener("resize",b)}}},a.utils.getColor=function(b){if(void 0===b)return a.utils.defaultColor();if(Array.isArray(b)){var c=d3.scale.ordinal().range(b);return function(a,b){var d=void 0===b?a:b;return a.color||c(d)}}return b},a.utils.defaultColor=function(){return a.utils.getColor(d3.scale.category20().range())},a.utils.customTheme=function(a,b,c){b=b||function(a){return a.key},c=c||d3.scale.category20().range();var d=c.length;return function(e){var f=b(e);return"function"==typeof a[f]?a[f]():void 0!==a[f]?a[f]:(d||(d=c.length),d-=1,c[d])}},a.utils.pjax=function(b,c){var d=function(d){d3.html(d,function(d){var e=d3.select(c).node();e.parentNode.replaceChild(d3.select(d).select(c).node(),e),a.utils.pjax(b,c)})};d3.selectAll(b).on("click",function(){history.pushState(this.href,this.textContent,this.href),d(this.href),d3.event.preventDefault()}),d3.select(window).on("popstate",function(){d3.event.state&&d(d3.event.state)})},a.utils.calcApproxTextWidth=function(a){if("function"==typeof a.style&&"function"==typeof a.text){var b=parseInt(a.style("font-size").replace("px",""),10),c=a.text().length;return c*b*.5}return 0},a.utils.NaNtoZero=function(a){return"number"!=typeof a||isNaN(a)||null===a||1/0===a||a===-1/0?0:a},d3.selection.prototype.watchTransition=function(a){var b=[this].concat([].slice.call(arguments,1));return a.transition.apply(a,b)},a.utils.renderWatch=function(b,c){if(!(this instanceof a.utils.renderWatch))return new a.utils.renderWatch(b,c);var d=void 0!==c?c:250,e=[],f=this;this.models=function(a){return a=[].slice.call(arguments,0),a.forEach(function(a){a.__rendered=!1,function(a){a.dispatch.on("renderEnd",function(){a.__rendered=!0,f.renderEnd("model")})}(a),e.indexOf(a)<0&&e.push(a)}),this},this.reset=function(a){void 0!==a&&(d=a),e=[]},this.transition=function(a,b,c){if(b=arguments.length>1?[].slice.call(arguments,1):[],c=b.length>1?b.pop():void 0!==d?d:250,a.__rendered=!1,e.indexOf(a)<0&&e.push(a),0===c)return a.__rendered=!0,a.delay=function(){return this},a.duration=function(){return this},a;a.__rendered=0===a.length?!0:a.every(function(a){return!a.length})?!0:!1;var g=0;return a.transition().duration(c).each(function(){++g}).each("end",function(){0===--g&&(a.__rendered=!0,f.renderEnd.apply(this,b))})},this.renderEnd=function(){e.every(function(a){return a.__rendered})&&(e.forEach(function(a){a.__rendered=!1}),b.renderEnd.apply(this,arguments))}},a.utils.deepExtend=function(b){var c=arguments.length>1?[].slice.call(arguments,1):[];c.forEach(function(c){for(var d in c){var e=b[d]instanceof Array,f="object"==typeof b[d],g="object"==typeof c[d];f&&!e&&g?a.utils.deepExtend(b[d],c[d]):b[d]=c[d]}})},a.utils.state=function(){if(!(this instanceof a.utils.state))return new a.utils.state;var b={},c=function(){},d=function(){return{}},e=null,f=null;this.dispatch=d3.dispatch("change","set"),this.dispatch.on("set",function(a){c(a,!0)}),this.getter=function(a){return d=a,this},this.setter=function(a,b){return b||(b=function(){}),c=function(c,d){a(c),d&&b()},this},this.init=function(b){e=e||{},a.utils.deepExtend(e,b)};var g=function(){var a=d();if(JSON.stringify(a)===JSON.stringify(b))return!1;for(var c in a)void 0===b[c]&&(b[c]={}),b[c]=a[c],f=!0;return!0};this.update=function(){e&&(c(e,!1),e=null),g.call(this)&&this.dispatch.change(b)}},a.utils.optionsFunc=function(a){return a&&d3.map(a).forEach(function(a,b){"function"==typeof this[a]&&this[a](b)}.bind(this)),this},a.utils.calcTicksX=function(b,c){var d=1,e=0;for(e;ed?f:d}return a.log("Requested number of ticks: ",b),a.log("Calculated max values to be: ",d),b=b>d?b=d-1:b,b=1>b?1:b,b=Math.floor(b),a.log("Calculating tick count as: ",b),b},a.utils.calcTicksY=function(b,c){return a.utils.calcTicksX(b,c)},a.utils.initOption=function(a,b){a._calls&&a._calls[b]?a[b]=a._calls[b]:(a[b]=function(c){return arguments.length?(a._overrides[b]=!0,a._options[b]=c,a):a._options[b]},a["_"+b]=function(c){return arguments.length?(a._overrides[b]||(a._options[b]=c),a):a._options[b]})},a.utils.initOptions=function(b){b._overrides=b._overrides||{};var c=Object.getOwnPropertyNames(b._options||{}),d=Object.getOwnPropertyNames(b._calls||{});c=c.concat(d);for(var e in c)a.utils.initOption(b,c[e])},a.utils.inheritOptionsD3=function(a,b,c){a._d3options=c.concat(a._d3options||[]),c.unshift(b),c.unshift(a),d3.rebind.apply(this,c)},a.utils.arrayUnique=function(a){return a.sort().filter(function(b,c){return!c||b!=a[c-1]})},a.utils.symbolMap=d3.map(),a.utils.symbol=function(){function b(b,e){var f=c.call(this,b,e),g=d.call(this,b,e);return-1!==d3.svg.symbolTypes.indexOf(f)?d3.svg.symbol().type(f).size(g)():a.utils.symbolMap.get(f)(g)}var c,d=64;return b.type=function(a){return arguments.length?(c=d3.functor(a),b):c},b.size=function(a){return arguments.length?(d=d3.functor(a),b):d},b},a.utils.inheritOptions=function(b,c){var d=Object.getOwnPropertyNames(c._options||{}),e=Object.getOwnPropertyNames(c._calls||{}),f=c._inherited||[],g=c._d3options||[],h=d.concat(e).concat(f).concat(g);h.unshift(c),h.unshift(b),d3.rebind.apply(this,h),b._inherited=a.utils.arrayUnique(d.concat(e).concat(f).concat(d).concat(b._inherited||[])),b._d3options=a.utils.arrayUnique(g.concat(b._d3options||[]))},a.utils.initSVG=function(a){a.classed({"nvd3-svg":!0})},a.utils.sanitizeHeight=function(a,b){return a||parseInt(b.style("height"),10)||400},a.utils.sanitizeWidth=function(a,b){return a||parseInt(b.style("width"),10)||960},a.utils.availableHeight=function(b,c,d){return a.utils.sanitizeHeight(b,c)-d.top-d.bottom},a.utils.availableWidth=function(b,c,d){return a.utils.sanitizeWidth(b,c)-d.left-d.right},a.utils.noData=function(b,c){var d=b.options(),e=d.margin(),f=d.noData(),g=null==f?["No Data Available."]:[f],h=a.utils.availableHeight(d.height(),c,e),i=a.utils.availableWidth(d.width(),c,e),j=e.left+i/2,k=e.top+h/2;c.selectAll("g").remove();var l=c.selectAll(".nv-noData").data(g);l.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),l.attr("x",j).attr("y",k).text(function(a){return a})},a.models.axis=function(){"use strict";function b(g){return s.reset(),g.each(function(b){var g=d3.select(this);a.utils.initSVG(g);var p=g.selectAll("g.nv-wrap.nv-axis").data([b]),q=p.enter().append("g").attr("class","nvd3 nv-wrap nv-axis"),t=(q.append("g"),p.select("g"));null!==n?c.ticks(n):("top"==c.orient()||"bottom"==c.orient())&&c.ticks(Math.abs(d.range()[1]-d.range()[0])/100),t.watchTransition(s,"axis").call(c),r=r||c.scale();var u=c.tickFormat();null==u&&(u=r.tickFormat());var v=t.selectAll("text.nv-axislabel").data([h||null]);v.exit().remove();var w,x,y;switch(c.orient()){case"top":v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",0).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b))+",0)"}).select("text").attr("dy","-0.5em").attr("y",-c.tickPadding()).attr("text-anchor","middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max top").attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(d.range()[c])+",0)"}));break;case"bottom":w=o+36;var z=30,A=0,B=t.selectAll("g").select("text"),C="";if(j%360){B.each(function(){var a=this.getBoundingClientRect(),b=a.width;A=a.height,b>z&&(z=b)}),C="rotate("+j+" 0,"+(A/2+c.tickPadding())+")";var D=Math.abs(Math.sin(j*Math.PI/180));w=(D?D*z:z)+30,B.attr("transform",C).style("text-anchor",j%360>0?"start":"end")}v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",w).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data([d.domain()[0],d.domain()[d.domain().length-1]]),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"}).select("text").attr("dy",".71em").attr("y",c.tickPadding()).attr("transform",C).style("text-anchor",j?j%360>0?"start":"end":"middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max bottom").attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"})),l&&B.attr("transform",function(a,b){return"translate(0,"+(b%2==0?"0":"12")+")"});break;case"right":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"begin").attr("transform",k?"rotate(90)":"").attr("y",k?-Math.max(e.right,f)+12:-10).attr("x",k?d3.max(d.range())/2:c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(d(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",c.tickPadding()).style("text-anchor","start").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1));break;case"left":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"end").attr("transform",k?"rotate(-90)":"").attr("y",k?-Math.max(e.left,f)+25-(o||0):-10).attr("x",k?-d3.max(d.range())/2:-c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(r(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",-c.tickPadding()).attr("text-anchor","end").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1))}if(v.text(function(a){return a}),!i||"left"!==c.orient()&&"right"!==c.orient()||(t.selectAll("g").each(function(a){d3.select(this).select("text").attr("opacity",1),(d(a)d.range()[0]-10)&&((a>1e-10||-1e-10>a)&&d3.select(this).attr("opacity",0),d3.select(this).select("text").attr("opacity",0))}),d.domain()[0]==d.domain()[1]&&0==d.domain()[0]&&p.selectAll("g.nv-axisMaxMin").style("opacity",function(a,b){return b?0:1})),i&&("top"===c.orient()||"bottom"===c.orient())){var E=[];p.selectAll("g.nv-axisMaxMin").each(function(a,b){try{E.push(b?d(a)-this.getBoundingClientRect().width-4:d(a)+this.getBoundingClientRect().width+4)}catch(c){E.push(b?d(a)-4:d(a)+4)}}),t.selectAll("g").each(function(a){(d(a)E[1])&&(a>1e-10||-1e-10>a?d3.select(this).remove():d3.select(this).select("text").remove())})}t.selectAll(".tick").filter(function(a){return!parseFloat(Math.round(1e5*a)/1e6)&&void 0!==a}).classed("zero",!0),r=d.copy()}),s.renderEnd("axis immediate"),b}var c=d3.svg.axis(),d=d3.scale.linear(),e={top:0,right:0,bottom:0,left:0},f=75,g=60,h=null,i=!0,j=0,k=!0,l=!1,m=!1,n=null,o=0,p=250,q=d3.dispatch("renderEnd");c.scale(d).orient("bottom").tickFormat(function(a){return a});var r,s=a.utils.renderWatch(q,p);return b.axis=c,b.dispatch=q,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{axisLabelDistance:{get:function(){return o},set:function(a){o=a}},staggerLabels:{get:function(){return l},set:function(a){l=a}},rotateLabels:{get:function(){return j},set:function(a){j=a}},rotateYLabel:{get:function(){return k},set:function(a){k=a}},showMaxMin:{get:function(){return i},set:function(a){i=a}},axisLabel:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return g},set:function(a){g=a}},ticks:{get:function(){return n},set:function(a){n=a}},width:{get:function(){return f},set:function(a){f=a}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},duration:{get:function(){return p},set:function(a){p=a,s.reset(p)}},scale:{get:function(){return d},set:function(e){d=e,c.scale(d),m="function"==typeof d.rangeBands,a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"])}}}),a.utils.initOptions(b),a.utils.inheritOptionsD3(b,c,["orient","tickValues","tickSubdivide","tickSize","tickPadding","tickFormat"]),a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"]),b},a.models.boxPlot=function(){"use strict";function b(l){return v.reset(),l.each(function(b){var l=j-i.left-i.right,p=k-i.top-i.bottom;r=d3.select(this),a.utils.initSVG(r),m.domain(c||b.map(function(a,b){return o(a,b)})).rangeBands(e||[0,l],.1);var w=[];if(!d){var x=d3.min(b.map(function(a){var b=[];return b.push(a.values.Q1),a.values.hasOwnProperty("whisker_low")&&null!==a.values.whisker_low&&b.push(a.values.whisker_low),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.min(b)})),y=d3.max(b.map(function(a){var b=[];return b.push(a.values.Q3),a.values.hasOwnProperty("whisker_high")&&null!==a.values.whisker_high&&b.push(a.values.whisker_high),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.max(b)}));w=[x,y]}n.domain(d||w),n.range(f||[p,0]),g=g||m,h=h||n.copy().range([n(0),n(0)]);{var z=r.selectAll("g.nv-wrap").data([b]);z.enter().append("g").attr("class","nvd3 nv-wrap")}z.attr("transform","translate("+i.left+","+i.top+")");var A=z.selectAll(".nv-boxplot").data(function(a){return a}),B=A.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);A.attr("class","nv-boxplot").attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}).classed("hover",function(a){return a.hover}),A.watchTransition(v,"nv-boxplot: boxplots").style("stroke-opacity",1).style("fill-opacity",.75).delay(function(a,c){return c*t/b.length}).attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}),A.exit().remove(),B.each(function(a,b){var c=d3.select(this);["low","high"].forEach(function(d){a.values.hasOwnProperty("whisker_"+d)&&null!==a.values["whisker_"+d]&&(c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-whisker nv-boxplot-"+d),c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-tick nv-boxplot-"+d))})});var C=A.selectAll(".nv-boxplot-outlier").data(function(a){return a.values.hasOwnProperty("outliers")&&null!==a.values.outliers?a.values.outliers:[]});C.enter().append("circle").style("fill",function(a,b,c){return q(a,c)}).style("stroke",function(a,b,c){return q(a,c)}).on("mouseover",function(a,b,c){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:a,color:q(a,c)},e:d3.event})}).on("mouseout",function(a,b,c){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:a,color:q(a,c)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),C.attr("class","nv-boxplot-outlier"),C.watchTransition(v,"nv-boxplot: nv-boxplot-outlier").attr("cx",.45*m.rangeBand()).attr("cy",function(a){return n(a)}).attr("r","3"),C.exit().remove();var D=function(){return null===u?.9*m.rangeBand():Math.min(75,.9*m.rangeBand())},E=function(){return.45*m.rangeBand()-D()/2},F=function(){return.45*m.rangeBand()+D()/2};["low","high"].forEach(function(a){var b="low"===a?"Q1":"Q3";A.select("line.nv-boxplot-whisker.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",.45*m.rangeBand()).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",.45*m.rangeBand()).attr("y2",function(a){return n(a.values[b])}),A.select("line.nv-boxplot-tick.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",E).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",F).attr("y2",function(b){return n(b.values["whisker_"+a])})}),["low","high"].forEach(function(a){B.selectAll(".nv-boxplot-"+a).on("mouseover",function(b,c,d){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mouseout",function(b,c,d){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})})}),B.append("rect").attr("class","nv-boxplot-box").on("mouseover",function(a,b){d3.select(this).classed("hover",!0),s.elementMouseover({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),s.elementMouseout({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),A.select("rect.nv-boxplot-box").watchTransition(v,"nv-boxplot: boxes").attr("y",function(a){return n(a.values.Q3)}).attr("width",D).attr("x",E).attr("height",function(a){return Math.abs(n(a.values.Q3)-n(a.values.Q1))||1}).style("fill",function(a,b){return a.color||q(a,b)}).style("stroke",function(a,b){return a.color||q(a,b)}),B.append("line").attr("class","nv-boxplot-median"),A.select("line.nv-boxplot-median").watchTransition(v,"nv-boxplot: boxplots line").attr("x1",E).attr("y1",function(a){return n(a.values.Q2)}).attr("x2",F).attr("y2",function(a){return n(a.values.Q2)}),g=m.copy(),h=n.copy()}),v.renderEnd("nv-boxplot immediate"),b}var c,d,e,f,g,h,i={top:0,right:0,bottom:0,left:0},j=960,k=500,l=Math.floor(1e4*Math.random()),m=d3.scale.ordinal(),n=d3.scale.linear(),o=function(a){return a.x},p=function(a){return a.y},q=a.utils.defaultColor(),r=null,s=d3.dispatch("elementMouseover","elementMouseout","elementMousemove","renderEnd"),t=250,u=null,v=a.utils.renderWatch(s,t);return b.dispatch=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},maxBoxWidth:{get:function(){return u},set:function(a){u=a}},x:{get:function(){return o},set:function(a){o=a}},y:{get:function(){return p},set:function(a){p=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return l},set:function(a){l=a}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}},duration:{get:function(){return t},set:function(a){t=a,v.reset(t)}}}),a.utils.initOptions(b),b},a.models.boxPlotChart=function(){"use strict";function b(k){return t.reset(),t.models(e),l&&t.models(f),m&&t.models(g),k.each(function(k){var p=d3.select(this);a.utils.initSVG(p);var t=(i||parseInt(p.style("width"))||960)-h.left-h.right,u=(j||parseInt(p.style("height"))||400)-h.top-h.bottom;if(b.update=function(){r.beforeUpdate(),p.transition().duration(s).call(b)},b.container=this,!(k&&k.length&&k.filter(function(a){return a.values.hasOwnProperty("Q1")&&a.values.hasOwnProperty("Q2")&&a.values.hasOwnProperty("Q3")}).length)){var v=p.selectAll(".nv-noData").data([q]);return v.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),v.attr("x",h.left+t/2).attr("y",h.top+u/2).text(function(a){return a}),b}p.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var w=p.selectAll("g.nv-wrap.nv-boxPlotWithAxes").data([k]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-boxPlotWithAxes").append("g"),y=x.append("defs"),z=w.select("g"); -x.append("g").attr("class","nv-x nv-axis"),x.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),x.append("g").attr("class","nv-barsWrap"),z.attr("transform","translate("+h.left+","+h.top+")"),n&&z.select(".nv-y.nv-axis").attr("transform","translate("+t+",0)"),e.width(t).height(u);var A=z.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));if(A.transition().call(e),y.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),z.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(o?2:1)).attr("height",16).attr("x",-c.rangeBand()/(o?1:2)),l){f.scale(c).ticks(a.utils.calcTicksX(t/100,k)).tickSize(-u,0),z.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),z.select(".nv-x.nv-axis").call(f);var B=z.select(".nv-x.nv-axis").selectAll("g");o&&B.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}m&&(g.scale(d).ticks(Math.floor(u/36)).tickSize(-t,0),z.select(".nv-y.nv-axis").call(g)),z.select(".nv-zeroLine line").attr("x1",0).attr("x2",t).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("nv-boxplot chart immediate"),b}var c,d,e=a.models.boxPlot(),f=a.models.axis(),g=a.models.axis(),h={top:15,right:10,bottom:50,left:60},i=null,j=null,k=a.utils.getColor(),l=!0,m=!0,n=!1,o=!1,p=a.models.tooltip(),q="No Data Available.",r=d3.dispatch("tooltipShow","tooltipHide","beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(n?"right":"left").tickFormat(d3.format(",.1f")),p.duration(0);var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){p.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){p.data(a).hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){p.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.boxplot=e,b.xAxis=f,b.yAxis=g,b.tooltip=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},staggerLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return l},set:function(a){l=a}},showYAxis:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return tooltips},set:function(a){tooltips=a}},tooltipContent:{get:function(){return p},set:function(a){p=a}},noData:{get:function(){return q},set:function(a){q=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!==a.top?a.top:h.top,h.right=void 0!==a.right?a.right:h.right,h.bottom=void 0!==a.bottom?a.bottom:h.bottom,h.left=void 0!==a.left?a.left:h.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}},rightAlignYAxis:{get:function(){return n},set:function(a){n=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.bullet=function(){"use strict";function b(d){return d.each(function(b,d){var p=m-c.left-c.right,s=n-c.top-c.bottom;o=d3.select(this),a.utils.initSVG(o);{var t=f.call(this,b,d).slice().sort(d3.descending),u=g.call(this,b,d).slice().sort(d3.descending),v=h.call(this,b,d).slice().sort(d3.descending),w=i.call(this,b,d).slice(),x=j.call(this,b,d).slice(),y=k.call(this,b,d).slice(),z=d3.scale.linear().domain(d3.extent(d3.merge([l,t]))).range(e?[p,0]:[0,p]);this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range())}this.__chart__=z;var A=d3.min(t),B=d3.max(t),C=t[1],D=o.selectAll("g.nv-wrap.nv-bullet").data([b]),E=D.enter().append("g").attr("class","nvd3 nv-wrap nv-bullet"),F=E.append("g"),G=D.select("g");F.append("rect").attr("class","nv-range nv-rangeMax"),F.append("rect").attr("class","nv-range nv-rangeAvg"),F.append("rect").attr("class","nv-range nv-rangeMin"),F.append("rect").attr("class","nv-measure"),D.attr("transform","translate("+c.left+","+c.top+")");var H=function(a){return Math.abs(z(a)-z(0))},I=function(a){return z(0>a?a:0)};G.select("rect.nv-rangeMax").attr("height",s).attr("width",H(B>0?B:A)).attr("x",I(B>0?B:A)).datum(B>0?B:A),G.select("rect.nv-rangeAvg").attr("height",s).attr("width",H(C)).attr("x",I(C)).datum(C),G.select("rect.nv-rangeMin").attr("height",s).attr("width",H(B)).attr("x",I(B)).attr("width",H(B>0?A:B)).attr("x",I(B>0?A:B)).datum(B>0?A:B),G.select("rect.nv-measure").style("fill",q).attr("height",s/3).attr("y",s/3).attr("width",0>v?z(0)-z(v[0]):z(v[0])-z(0)).attr("x",I(v)).on("mouseover",function(){r.elementMouseover({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mouseout",function(){r.elementMouseout({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})});var J=s/6,K=u.map(function(a,b){return{value:a,label:x[b]}});F.selectAll("path.nv-markerTriangle").data(K).enter().append("path").attr("class","nv-markerTriangle").attr("transform",function(a){return"translate("+z(a.value)+","+s/2+")"}).attr("d","M0,"+J+"L"+J+","+-J+" "+-J+","+-J+"Z").on("mouseover",function(a){r.elementMouseover({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill"),pos:[z(a.value),s/2]})}).on("mousemove",function(a){r.elementMousemove({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a){r.elementMouseout({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}),D.selectAll(".nv-range").on("mouseover",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseover({value:a,label:c,color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseout({value:a,label:c,color:d3.select(this).style("fill")})})}),b}var c={top:0,right:0,bottom:0,left:0},d="left",e=!1,f=function(a){return a.ranges},g=function(a){return a.markers?a.markers:[0]},h=function(a){return a.measures},i=function(a){return a.rangeLabels?a.rangeLabels:[]},j=function(a){return a.markerLabels?a.markerLabels:[]},k=function(a){return a.measureLabels?a.measureLabels:[]},l=[0],m=380,n=30,o=null,p=null,q=a.utils.getColor(["#1f77b4"]),r=d3.dispatch("elementMouseover","elementMouseout","elementMousemove");return b.dispatch=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return f},set:function(a){f=a}},markers:{get:function(){return g},set:function(a){g=a}},measures:{get:function(){return h},set:function(a){h=a}},forceX:{get:function(){return l},set:function(a){l=a}},width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},tickFormat:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},orient:{get:function(){return d},set:function(a){d=a,e="right"==d||"bottom"==d}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.bulletChart=function(){"use strict";function b(d){return d.each(function(e,o){var p=d3.select(this);a.utils.initSVG(p);var q=a.utils.availableWidth(k,p,g),r=l-g.top-g.bottom;if(b.update=function(){b(d)},b.container=this,!e||!h.call(this,e,o))return a.utils.noData(b,p),b;p.selectAll(".nv-noData").remove();var s=h.call(this,e,o).slice().sort(d3.descending),t=i.call(this,e,o).slice().sort(d3.descending),u=j.call(this,e,o).slice().sort(d3.descending),v=p.selectAll("g.nv-wrap.nv-bulletChart").data([e]),w=v.enter().append("g").attr("class","nvd3 nv-wrap nv-bulletChart"),x=w.append("g"),y=v.select("g");x.append("g").attr("class","nv-bulletWrap"),x.append("g").attr("class","nv-titles"),v.attr("transform","translate("+g.left+","+g.top+")");var z=d3.scale.linear().domain([0,Math.max(s[0],t[0],u[0])]).range(f?[q,0]:[0,q]),A=this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range());this.__chart__=z;var B=x.select(".nv-titles").append("g").attr("text-anchor","end").attr("transform","translate(-6,"+(l-g.top-g.bottom)/2+")");B.append("text").attr("class","nv-title").text(function(a){return a.title}),B.append("text").attr("class","nv-subtitle").attr("dy","1em").text(function(a){return a.subtitle}),c.width(q).height(r);var C=y.select(".nv-bulletWrap");d3.transition(C).call(c);var D=m||z.tickFormat(q/100),E=y.selectAll("g.nv-tick").data(z.ticks(n?n:q/50),function(a){return this.textContent||D(a)}),F=E.enter().append("g").attr("class","nv-tick").attr("transform",function(a){return"translate("+A(a)+",0)"}).style("opacity",1e-6);F.append("line").attr("y1",r).attr("y2",7*r/6),F.append("text").attr("text-anchor","middle").attr("dy","1em").attr("y",7*r/6).text(D);var G=d3.transition(E).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1);G.select("line").attr("y1",r).attr("y2",7*r/6),G.select("text").attr("y",7*r/6),d3.transition(E.exit()).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1e-6).remove()}),d3.timer.flush(),b}var c=a.models.bullet(),d=a.models.tooltip(),e="left",f=!1,g={top:5,right:40,bottom:20,left:120},h=function(a){return a.ranges},i=function(a){return a.markers?a.markers:[0]},j=function(a){return a.measures},k=null,l=55,m=null,n=null,o=null,p=d3.dispatch("tooltipShow","tooltipHide");return d.duration(0).headerEnabled(!1),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.label,value:a.value,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.bullet=c,b.dispatch=p,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return h},set:function(a){h=a}},markers:{get:function(){return i},set:function(a){i=a}},measures:{get:function(){return j},set:function(a){j=a}},width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},tickFormat:{get:function(){return m},set:function(a){m=a}},ticks:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return o},set:function(a){o=a}},tooltips:{get:function(){return d.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),d.enabled(!!b)}},tooltipContent:{get:function(){return d.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),d.contentGenerator(b)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},orient:{get:function(){return e},set:function(a){e=a,f="right"==e||"bottom"==e}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.candlestickBar=function(){"use strict";function b(x){return x.each(function(b){c=d3.select(this);var x=a.utils.availableWidth(i,c,h),y=a.utils.availableHeight(j,c,h);a.utils.initSVG(c);var A=x/b[0].values.length*.45;l.domain(d||d3.extent(b[0].values.map(n).concat(t))),l.range(v?f||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:f||[5+A/2,x-A/2-5]),m.domain(e||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(g||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var B=d3.select(this).selectAll("g.nv-wrap.nv-candlestickBar").data([b[0].values]),C=B.enter().append("g").attr("class","nvd3 nv-wrap nv-candlestickBar"),D=C.append("defs"),E=C.append("g"),F=B.select("g");E.append("g").attr("class","nv-ticks"),B.attr("transform","translate("+h.left+","+h.top+")"),c.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:k})}),D.append("clipPath").attr("id","nv-chart-clip-path-"+k).append("rect"),B.select("#nv-chart-clip-path-"+k+" rect").attr("width",x).attr("height",y),F.attr("clip-path",w?"url(#nv-chart-clip-path-"+k+")":"");var G=B.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});G.exit().remove();{var H=G.enter().append("g").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b});H.append("line").attr("class","nv-candlestick-lines").attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),H.append("rect").attr("class","nv-candlestick-rects nv-bars").attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}c.selectAll(".nv-candlestick-lines").transition().attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),c.selectAll(".nv-candlestick-rects").transition().attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}),b}var c,d,e,f,g,h={top:0,right:0,bottom:0,left:0},i=null,j=null,k=Math.floor(1e4*Math.random()),l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,d){b.clearHighlights(),c.select(".nv-candlestickBar .nv-tick-0-"+a).classed("hover",d)},b.clearHighlights=function(){c.select(".nv-candlestickBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return k},set:function(a){k=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!=a.top?a.top:h.top,h.right=void 0!=a.right?a.right:h.right,h.bottom=void 0!=a.bottom?a.bottom:h.bottom,h.left=void 0!=a.left?a.left:h.left}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.cumulativeLineChart=function(){"use strict";function b(l){return H.reset(),H.models(f),r&&H.models(g),s&&H.models(h),l.each(function(l){function A(){d3.select(b.container).style("cursor","ew-resize")}function E(){G.x=d3.event.x,G.i=Math.round(F.invert(G.x)),K()}function H(){d3.select(b.container).style("cursor","auto"),y.index=G.i,C.stateChange(y)}function K(){bb.data([G]);var a=b.duration();b.duration(0),b.update(),b.duration(a)}var L=d3.select(this);a.utils.initSVG(L),L.classed("nv-chart-"+x,!0);var M=this,N=a.utils.availableWidth(o,L,m),O=a.utils.availableHeight(p,L,m);if(b.update=function(){0===D?L.call(b):L.transition().duration(D).call(b)},b.container=this,y.setter(J(l),b.update).getter(I(l)).update(),y.disabled=l.map(function(a){return!!a.disabled}),!z){var P;z={};for(P in y)z[P]=y[P]instanceof Array?y[P].slice(0):y[P]}var Q=d3.behavior.drag().on("dragstart",A).on("drag",E).on("dragend",H);if(!(l&&l.length&&l.filter(function(a){return a.values.length}).length))return a.utils.noData(b,L),b;if(L.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale(),w)f.yDomain(null);else{var R=l.filter(function(a){return!a.disabled}).map(function(a){var b=d3.extent(a.values,f.y());return b[0]<-.95&&(b[0]=-.95),[(b[0]-b[1])/(1+b[1]),(b[1]-b[0])/(1+b[0])]}),S=[d3.min(R,function(a){return a[0]}),d3.max(R,function(a){return a[1]})];f.yDomain(S)}F.domain([0,l[0].values.length-1]).range([0,N]).clamp(!0);var l=c(G.i,l),T=v?"none":"all",U=L.selectAll("g.nv-wrap.nv-cumulativeLine").data([l]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-cumulativeLine").append("g"),W=U.select("g");if(V.append("g").attr("class","nv-interactive"),V.append("g").attr("class","nv-x nv-axis").style("pointer-events","none"),V.append("g").attr("class","nv-y nv-axis"),V.append("g").attr("class","nv-background"),V.append("g").attr("class","nv-linesWrap").style("pointer-events",T),V.append("g").attr("class","nv-avgLinesWrap").style("pointer-events","none"),V.append("g").attr("class","nv-legendWrap"),V.append("g").attr("class","nv-controlsWrap"),q&&(i.width(N),W.select(".nv-legendWrap").datum(l).call(i),m.top!=i.height()&&(m.top=i.height(),O=a.utils.availableHeight(p,L,m)),W.select(".nv-legendWrap").attr("transform","translate(0,"+-m.top+")")),u){var X=[{key:"Re-scale y-axis",disabled:!w}];j.width(140).color(["#444","#444","#444"]).rightAlign(!1).margin({top:5,right:0,bottom:5,left:20}),W.select(".nv-controlsWrap").datum(X).attr("transform","translate(0,"+-m.top+")").call(j)}U.attr("transform","translate("+m.left+","+m.top+")"),t&&W.select(".nv-y.nv-axis").attr("transform","translate("+N+",0)");var Y=l.filter(function(a){return a.tempDisabled});U.select(".tempDisabled").remove(),Y.length&&U.append("text").attr("class","tempDisabled").attr("x",N/2).attr("y","-.71em").style("text-anchor","end").text(Y.map(function(a){return a.key}).join(", ")+" values cannot be calculated for this time period."),v&&(k.width(N).height(O).margin({left:m.left,top:m.top}).svgContainer(L).xScale(d),U.select(".nv-interactive").call(k)),V.select(".nv-background").append("rect"),W.select(".nv-background rect").attr("width",N).attr("height",O),f.y(function(a){return a.display.y}).width(N).height(O).color(l.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!l[b].disabled&&!l[b].tempDisabled}));var Z=W.select(".nv-linesWrap").datum(l.filter(function(a){return!a.disabled&&!a.tempDisabled}));Z.call(f),l.forEach(function(a,b){a.seriesIndex=b});var $=l.filter(function(a){return!a.disabled&&!!B(a)}),_=W.select(".nv-avgLinesWrap").selectAll("line").data($,function(a){return a.key}),ab=function(a){var b=e(B(a));return 0>b?0:b>O?O:b};_.enter().append("line").style("stroke-width",2).style("stroke-dasharray","10,10").style("stroke",function(a){return f.color()(a,a.seriesIndex)}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.style("stroke-opacity",function(a){var b=e(B(a));return 0>b||b>O?0:1}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.exit().remove();var bb=Z.selectAll(".nv-indexLine").data([G]);bb.enter().append("rect").attr("class","nv-indexLine").attr("width",3).attr("x",-2).attr("fill","red").attr("fill-opacity",.5).style("pointer-events","all").call(Q),bb.attr("transform",function(a){return"translate("+F(a.i)+",0)"}).attr("height",O),r&&(g.scale(d)._ticks(a.utils.calcTicksX(N/70,l)).tickSize(-O,0),W.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),W.select(".nv-x.nv-axis").call(g)),s&&(h.scale(e)._ticks(a.utils.calcTicksY(O/36,l)).tickSize(-N,0),W.select(".nv-y.nv-axis").call(h)),W.select(".nv-background rect").on("click",function(){G.x=d3.mouse(this)[0],G.i=Math.round(F.invert(G.x)),y.index=G.i,C.stateChange(y),K()}),f.dispatch.on("elementClick",function(a){G.i=a.pointIndex,G.x=F(G.i),y.index=G.i,C.stateChange(y),K()}),j.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,w=!a.disabled,y.rescaleY=w,C.stateChange(y),b.update()}),i.dispatch.on("stateChange",function(a){for(var c in a)y[c]=a[c];C.stateChange(y),b.update()}),k.dispatch.on("elementMousemove",function(c){f.clearHighlights();var d,e,i,j=[];if(l.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g,h){e=a.interactiveBisect(g.values,c.pointXValue,b.x()),f.highlightPoint(h,e,!0);var k=g.values[e];"undefined"!=typeof k&&("undefined"==typeof d&&(d=k),"undefined"==typeof i&&(i=b.xScale()(b.x()(k,e))),j.push({key:g.key,value:b.y()(k,e),color:n(g,g.seriesIndex)}))}),j.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(j.map(function(a){return a.value}),o,q);null!==r&&(j[r].highlight=!0)}var s=g.tickFormat()(b.x()(d,e),e);k.tooltip.position({left:i+m.left,top:c.mouseY+m.top}).chartContainer(M.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:s,series:j})(),k.renderGuideLine(i)}),k.dispatch.on("elementMouseout",function(){f.clearHighlights()}),C.on("changeState",function(a){"undefined"!=typeof a.disabled&&(l.forEach(function(b,c){b.disabled=a.disabled[c]}),y.disabled=a.disabled),"undefined"!=typeof a.index&&(G.i=a.index,G.x=F(G.i),y.index=a.index,bb.data([G])),"undefined"!=typeof a.rescaleY&&(w=a.rescaleY),b.update()})}),H.renderEnd("cumulativeLineChart immediate"),b}function c(a,b){return K||(K=f.y()),b.map(function(b){if(!b.values)return b;var c=b.values[a];if(null==c)return b;var d=K(c,a);return-.95>d&&!E?(b.tempDisabled=!0,b):(b.tempDisabled=!1,b.values=b.values.map(function(a,b){return a.display={y:(K(a,b)-d)/(1+d)},a}),b)})}var d,e,f=a.models.line(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.models.legend(),k=a.interactiveGuideline(),l=a.models.tooltip(),m={top:30,right:30,bottom:50,left:60},n=a.utils.defaultColor(),o=null,p=null,q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=!0,x=f.id(),y=a.utils.state(),z=null,A=null,B=function(a){return a.average},C=d3.dispatch("stateChange","changeState","renderEnd"),D=250,E=!1;y.index=0,y.rescaleY=w,g.orient("bottom").tickPadding(7),h.orient(t?"right":"left"),l.valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)}),j.updateState(!1);var F=d3.scale.linear(),G={i:0,x:0},H=a.utils.renderWatch(C,D),I=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),index:G.i,rescaleY:w}}},J=function(a){return function(b){void 0!==b.index&&(G.i=b.index),void 0!==b.rescaleY&&(w=b.rescaleY),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};f.dispatch.on("elementMouseover.tooltip",function(a){var c={x:b.x()(a.point),y:b.y()(a.point),color:a.point.color};a.point=c,l.data(a).position(a.pos).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){l.hidden(!0)});var K=null;return b.dispatch=C,b.lines=f,b.legend=i,b.controls=j,b.xAxis=g,b.yAxis=h,b.interactiveLayer=k,b.state=y,b.tooltip=l,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},rescaleY:{get:function(){return w},set:function(a){w=a}},showControls:{get:function(){return u},set:function(a){u=a}},showLegend:{get:function(){return q},set:function(a){q=a}},average:{get:function(){return B},set:function(a){B=a}},defaultState:{get:function(){return z},set:function(a){z=a}},noData:{get:function(){return A},set:function(a){A=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},noErrorCheck:{get:function(){return E},set:function(a){E=a}},tooltips:{get:function(){return l.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),l.enabled(!!b)}},tooltipContent:{get:function(){return l.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),l.contentGenerator(b)}},margin:{get:function(){return m},set:function(a){m.top=void 0!==a.top?a.top:m.top,m.right=void 0!==a.right?a.right:m.right,m.bottom=void 0!==a.bottom?a.bottom:m.bottom,m.left=void 0!==a.left?a.left:m.left}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),i.color(n)}},useInteractiveGuideline:{get:function(){return v},set:function(a){v=a,a===!0&&(b.interactive(!1),b.useVoronoi(!1))}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,h.orient(a?"right":"left")}},duration:{get:function(){return D},set:function(a){D=a,f.duration(D),g.duration(D),h.duration(D),H.reset(D)}}}),a.utils.inheritOptions(b,f),a.utils.initOptions(b),b},a.models.discreteBar=function(){"use strict";function b(m){return y.reset(),m.each(function(b){var m=k-j.left-j.right,x=l-j.top-j.bottom;c=d3.select(this),a.utils.initSVG(c),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var z=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),y0:a.y0}})});n.domain(d||d3.merge(z).map(function(a){return a.x})).rangeBands(f||[0,m],.1),o.domain(e||d3.extent(d3.merge(z).map(function(a){return a.y}).concat(r))),o.range(t?g||[x-(o.domain()[0]<0?12:0),o.domain()[1]>0?12:0]:g||[x,0]),h=h||n,i=i||o.copy().range([o(0),o(0)]);{var A=c.selectAll("g.nv-wrap.nv-discretebar").data([b]),B=A.enter().append("g").attr("class","nvd3 nv-wrap nv-discretebar"),C=B.append("g");A.select("g")}C.append("g").attr("class","nv-groups"),A.attr("transform","translate("+j.left+","+j.top+")");var D=A.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});D.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),D.exit().watchTransition(y,"discreteBar: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),D.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),D.watchTransition(y,"discreteBar: groups").style("stroke-opacity",1).style("fill-opacity",.75);var E=D.selectAll("g.nv-bar").data(function(a){return a.values});E.exit().remove();var F=E.enter().append("g").attr("transform",function(a,b){return"translate("+(n(p(a,b))+.05*n.rangeBand())+", "+o(0)+")"}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),v.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),v.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){v.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){v.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()});F.append("rect").attr("height",0).attr("width",.9*n.rangeBand()/b.length),t?(F.append("text").attr("text-anchor","middle"),E.select("text").text(function(a,b){return u(q(a,b))}).watchTransition(y,"discreteBar: bars text").attr("x",.9*n.rangeBand()/2).attr("y",function(a,b){return q(a,b)<0?o(q(a,b))-o(0)+12:-4})):E.selectAll("text").remove(),E.attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}).style("fill",function(a,b){return a.color||s(a,b)}).style("stroke",function(a,b){return a.color||s(a,b)}).select("rect").attr("class",w).watchTransition(y,"discreteBar: bars rect").attr("width",.9*n.rangeBand()/b.length),E.watchTransition(y,"discreteBar: bars").attr("transform",function(a,b){var c=n(p(a,b))+.05*n.rangeBand(),d=q(a,b)<0?o(0):o(0)-o(q(a,b))<1?o(0)-1:o(q(a,b));return"translate("+c+", "+d+")"}).select("rect").attr("height",function(a,b){return Math.max(Math.abs(o(q(a,b))-o(e&&e[0]||0))||1)}),h=n.copy(),i=o.copy()}),y.renderEnd("discreteBar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=d3.scale.ordinal(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=[0],s=a.utils.defaultColor(),t=!1,u=d3.format(",.2f"),v=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),w="discreteBar",x=250,y=a.utils.renderWatch(v,x);return b.dispatch=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},forceY:{get:function(){return r},set:function(a){r=a}},showValues:{get:function(){return t},set:function(a){t=a}},x:{get:function(){return p},set:function(a){p=a}},y:{get:function(){return q},set:function(a){q=a}},xScale:{get:function(){return n},set:function(a){n=a}},yScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},valueFormat:{get:function(){return u},set:function(a){u=a}},id:{get:function(){return m},set:function(a){m=a}},rectClass:{get:function(){return w},set:function(a){w=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b)}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x)}}}),a.utils.initOptions(b),b},a.models.discreteBarChart=function(){"use strict";function b(h){return t.reset(),t.models(e),m&&t.models(f),n&&t.models(g),h.each(function(h){var l=d3.select(this);a.utils.initSVG(l);var q=a.utils.availableWidth(j,l,i),t=a.utils.availableHeight(k,l,i);if(b.update=function(){r.beforeUpdate(),l.transition().duration(s).call(b)},b.container=this,!(h&&h.length&&h.filter(function(a){return a.values.length}).length))return a.utils.noData(b,l),b;l.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var u=l.selectAll("g.nv-wrap.nv-discreteBarWithAxes").data([h]),v=u.enter().append("g").attr("class","nvd3 nv-wrap nv-discreteBarWithAxes").append("g"),w=v.append("defs"),x=u.select("g");v.append("g").attr("class","nv-x nv-axis"),v.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),v.append("g").attr("class","nv-barsWrap"),x.attr("transform","translate("+i.left+","+i.top+")"),o&&x.select(".nv-y.nv-axis").attr("transform","translate("+q+",0)"),e.width(q).height(t);var y=x.select(".nv-barsWrap").datum(h.filter(function(a){return!a.disabled}));if(y.transition().call(e),w.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),x.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(p?2:1)).attr("height",16).attr("x",-c.rangeBand()/(p?1:2)),m){f.scale(c)._ticks(a.utils.calcTicksX(q/100,h)).tickSize(-t,0),x.select(".nv-x.nv-axis").attr("transform","translate(0,"+(d.range()[0]+(e.showValues()&&d.domain()[0]<0?16:0))+")"),x.select(".nv-x.nv-axis").call(f); -var z=x.select(".nv-x.nv-axis").selectAll("g");p&&z.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}n&&(g.scale(d)._ticks(a.utils.calcTicksY(t/36,h)).tickSize(-q,0),x.select(".nv-y.nv-axis").call(g)),x.select(".nv-zeroLine line").attr("x1",0).attr("x2",q).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("discreteBar chart immediate"),b}var c,d,e=a.models.discreteBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.tooltip(),i={top:15,right:10,bottom:50,left:60},j=null,k=null,l=a.utils.getColor(),m=!0,n=!0,o=!1,p=!1,q=null,r=d3.dispatch("beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(o?"right":"left").tickFormat(d3.format(",.1f")),h.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).keyFormatter(function(a,b){return f.tickFormat()(a,b)});var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},h.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){h.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){h.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.discretebar=e,b.xAxis=f,b.yAxis=g,b.tooltip=h,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},staggerLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return m},set:function(a){m=a}},showYAxis:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return q},set:function(a){q=a}},tooltips:{get:function(){return h.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),h.enabled(!!b)}},tooltipContent:{get:function(){return h.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),h.contentGenerator(b)}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),e.color(l)}},rightAlignYAxis:{get:function(){return o},set:function(a){o=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.distribution=function(){"use strict";function b(k){return m.reset(),k.each(function(b){var k=(e-("x"===g?d.left+d.right:d.top+d.bottom),"x"==g?"y":"x"),l=d3.select(this);a.utils.initSVG(l),c=c||j;var n=l.selectAll("g.nv-distribution").data([b]),o=n.enter().append("g").attr("class","nvd3 nv-distribution"),p=(o.append("g"),n.select("g"));n.attr("transform","translate("+d.left+","+d.top+")");var q=p.selectAll("g.nv-dist").data(function(a){return a},function(a){return a.key});q.enter().append("g"),q.attr("class",function(a,b){return"nv-dist nv-series-"+b}).style("stroke",function(a,b){return i(a,b)});var r=q.selectAll("line.nv-dist"+g).data(function(a){return a.values});r.enter().append("line").attr(g+"1",function(a,b){return c(h(a,b))}).attr(g+"2",function(a,b){return c(h(a,b))}),m.transition(q.exit().selectAll("line.nv-dist"+g),"dist exit").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}).style("stroke-opacity",0).remove(),r.attr("class",function(a,b){return"nv-dist"+g+" nv-dist"+g+"-"+b}).attr(k+"1",0).attr(k+"2",f),m.transition(r,"dist").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}),c=j.copy()}),m.renderEnd("distribution immediate"),b}var c,d={top:0,right:0,bottom:0,left:0},e=400,f=8,g="x",h=function(a){return a[g]},i=a.utils.defaultColor(),j=d3.scale.linear(),k=250,l=d3.dispatch("renderEnd"),m=a.utils.renderWatch(l,k);return b.options=a.utils.optionsFunc.bind(b),b.dispatch=l,b.margin=function(a){return arguments.length?(d.top="undefined"!=typeof a.top?a.top:d.top,d.right="undefined"!=typeof a.right?a.right:d.right,d.bottom="undefined"!=typeof a.bottom?a.bottom:d.bottom,d.left="undefined"!=typeof a.left?a.left:d.left,b):d},b.width=function(a){return arguments.length?(e=a,b):e},b.axis=function(a){return arguments.length?(g=a,b):g},b.size=function(a){return arguments.length?(f=a,b):f},b.getData=function(a){return arguments.length?(h=d3.functor(a),b):h},b.scale=function(a){return arguments.length?(j=a,b):j},b.color=function(c){return arguments.length?(i=a.utils.getColor(c),b):i},b.duration=function(a){return arguments.length?(k=a,m.reset(k),b):k},b},a.models.furiousLegend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?g(a,b):"#fff":m?void 0:a.disabled?g(a,b):"#fff"}function r(a,b){return m&&"furious"==o?a.disengaged?"#fff":g(a,b):a.disabled?"#fff":g(a,b)}return p.each(function(b){var p=d-c.left-c.right,s=d3.select(this);a.utils.initSVG(s);var t=s.selectAll("g.nv-legend").data([b]),u=(t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),t.select("g"));t.attr("transform","translate("+c.left+","+c.top+")");var v,w=u.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),x=w.enter().append("g").attr("class","nv-series");if("classic"==o)x.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),v=w.select("circle");else if("furious"==o){x.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),v=w.select("rect"),x.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var y=w.select(".nv-check-box");y.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}x.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var z=w.select("text.nv-legend-text");w.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=w.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=w.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),w.classed("nv-disabled",function(a){return a.userDisabled}),w.exit().remove(),z.attr("fill",q).text(f);var A;switch(o){case"furious":A=23;break;case"classic":A=20}if(h){var B=[];w.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}B.push(b+i)});for(var C=0,D=0,E=[];p>D&&Cp&&C>1;){E=[],C--;for(var F=0;F(E[F%C]||0)&&(E[F%C]=B[F]);D=E.reduce(function(a,b){return a+b})}for(var G=[],H=0,I=0;C>H;H++)G[H]=I,I+=E[H];w.attr("transform",function(a,b){return"translate("+G[b%C]+","+(5+Math.floor(b/C)*A)+")"}),j?u.attr("transform","translate("+(d-c.right-D)+","+c.top+")"):u.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(B.length/C)*A}else{var J,K=5,L=5,M=0;w.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return J=L,dM&&(M=L),"translate("+J+","+K+")"}),u.attr("transform","translate("+(d-c.right-M)+","+c.top+")"),e=c.top+c.bottom+K+15}"furious"==o&&v.attr("width",function(a,b){return z[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),v.style("fill",r).style("stroke",function(a,b){return a.color||g(a,b)})}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=28,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBar=function(){"use strict";function b(x){return x.each(function(b){w.reset(),k=d3.select(this);var x=a.utils.availableWidth(h,k,g),y=a.utils.availableHeight(i,k,g);a.utils.initSVG(k),l.domain(c||d3.extent(b[0].values.map(n).concat(p))),l.range(r?e||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:e||[0,x]),m.domain(d||d3.extent(b[0].values.map(o).concat(q))).range(f||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var z=k.selectAll("g.nv-wrap.nv-historicalBar-"+j).data([b[0].values]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBar-"+j),B=A.append("defs"),C=A.append("g"),D=z.select("g");C.append("g").attr("class","nv-bars"),z.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){u.chartClick({data:a,index:b,pos:d3.event,id:j})}),B.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),z.select("#nv-chart-clip-path-"+j+" rect").attr("width",x).attr("height",y),D.attr("clip-path",s?"url(#nv-chart-clip-path-"+j+")":"");var E=z.select(".nv-bars").selectAll(".nv-bar").data(function(a){return a},function(a,b){return n(a,b)});E.exit().remove(),E.enter().append("rect").attr("x",0).attr("y",function(b,c){return a.utils.NaNtoZero(m(Math.max(0,o(b,c))))}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.abs(m(o(b,c))-m(0)))}).attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).on("mouseover",function(a,b){v&&(d3.select(this).classed("hover",!0),u.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mouseout",function(a,b){v&&(d3.select(this).classed("hover",!1),u.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mousemove",function(a,b){v&&u.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v&&(u.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}).on("dblclick",function(a,b){v&&(u.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}),E.attr("fill",function(a,b){return t(a,b)}).attr("class",function(a,b,c){return(o(a,b)<0?"nv-bar negative":"nv-bar positive")+" nv-bar-"+c+"-"+b}).watchTransition(w,"bars").attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).attr("width",x/b[0].values.length*.9),E.watchTransition(w,"bars").attr("y",function(b,c){var d=o(b,c)<0?m(0):m(0)-m(o(b,c))<1?m(0)-1:m(o(b,c));return a.utils.NaNtoZero(d)}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.max(Math.abs(m(o(b,c))-m(0)),1))})}),w.renderEnd("historicalBar immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=[],q=[0],r=!1,s=!0,t=a.utils.defaultColor(),u=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),v=!0,w=a.utils.renderWatch(u,0);return b.highlightPoint=function(a,b){k.select(".nv-bars .nv-bar-0-"+a).classed("hover",b)},b.clearHighlights=function(){k.select(".nv-bars .nv-bar.hover").classed("hover",!1)},b.dispatch=u,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},forceX:{get:function(){return p},set:function(a){p=a}},forceY:{get:function(){return q},set:function(a){q=a}},padData:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},clipEdge:{get:function(){return s},set:function(a){s=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return v},set:function(a){v=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return t},set:function(b){t=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBarChart=function(b){"use strict";function c(b){return b.each(function(k){z.reset(),z.models(f),q&&z.models(g),r&&z.models(h);var w=d3.select(this),A=this;a.utils.initSVG(w);var B=a.utils.availableWidth(n,w,l),C=a.utils.availableHeight(o,w,l);if(c.update=function(){w.transition().duration(y).call(c)},c.container=this,u.disabled=k.map(function(a){return!!a.disabled}),!v){var D;v={};for(D in u)v[D]=u[D]instanceof Array?u[D].slice(0):u[D]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(c,w),c;w.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale();var E=w.selectAll("g.nv-wrap.nv-historicalBarChart").data([k]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBarChart").append("g"),G=E.select("g");F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-barsWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),p&&(i.width(B),G.select(".nv-legendWrap").datum(k).call(i),l.top!=i.height()&&(l.top=i.height(),C=a.utils.availableHeight(o,w,l)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-l.top+")")),E.attr("transform","translate("+l.left+","+l.top+")"),s&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),t&&(j.width(B).height(C).margin({left:l.left,top:l.top}).svgContainer(w).xScale(d),E.select(".nv-interactive").call(j)),f.width(B).height(C).color(k.map(function(a,b){return a.color||m(a,b)}).filter(function(a,b){return!k[b].disabled}));var H=G.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));H.transition().call(f),q&&(g.scale(d)._ticks(a.utils.calcTicksX(B/100,k)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),G.select(".nv-x.nv-axis").transition().call(g)),r&&(h.scale(e)._ticks(a.utils.calcTicksY(C/36,k)).tickSize(-B,0),G.select(".nv-y.nv-axis").transition().call(h)),j.dispatch.on("elementMousemove",function(b){f.clearHighlights();var d,e,i,n=[];k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g){e=a.interactiveBisect(g.values,b.pointXValue,c.x()),f.highlightPoint(e,!0);var h=g.values[e];void 0!==h&&(void 0===d&&(d=h),void 0===i&&(i=c.xScale()(c.x()(h,e))),n.push({key:g.key,value:c.y()(h,e),color:m(g,g.seriesIndex),data:g.values[e]}))});var o=g.tickFormat()(c.x()(d,e));j.tooltip.position({left:i+l.left,top:b.mouseY+l.top}).chartContainer(A.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:o,index:e,series:n})(),j.renderGuideLine(i)}),j.dispatch.on("elementMouseout",function(){x.tooltipHide(),f.clearHighlights()}),i.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,k.filter(function(a){return!a.disabled}).length||k.map(function(a){return a.disabled=!1,E.selectAll(".nv-series").classed("disabled",!1),a}),u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),b.transition().call(c)}),i.dispatch.on("legendDblclick",function(a){k.forEach(function(a){a.disabled=!0}),a.disabled=!1,u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),c.update()}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),c.update()})}),z.renderEnd("historicalBarChart immediate"),c}var d,e,f=b||a.models.historicalBar(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:90,bottom:50,left:90},m=a.utils.defaultColor(),n=null,o=null,p=!1,q=!0,r=!0,s=!1,t=!1,u={},v=null,w=null,x=d3.dispatch("tooltipHide","stateChange","changeState","renderEnd"),y=250;g.orient("bottom").tickPadding(7),h.orient(s?"right":"left"),k.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)});var z=a.utils.renderWatch(x,0);return f.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:c.x()(a.data),value:c.y()(a.data),color:a.color},k.data(a).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),f.dispatch.on("elementMousemove.tooltip",function(){k.position({top:d3.event.pageY,left:d3.event.pageX})()}),c.dispatch=x,c.bars=f,c.legend=i,c.xAxis=g,c.yAxis=h,c.interactiveLayer=j,c.tooltip=k,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{width:{get:function(){return n},set:function(a){n=a}},height:{get:function(){return o},set:function(a){o=a}},showLegend:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b),i.color(m),f.color(m)}},duration:{get:function(){return y},set:function(a){y=a,z.reset(y),h.duration(y),g.duration(y)}},rightAlignYAxis:{get:function(){return s},set:function(a){s=a,h.orient(a?"right":"left")}},useInteractiveGuideline:{get:function(){return t},set:function(a){t=a,a===!0&&c.interactive(!1)}}}),a.utils.inheritOptions(c,f),a.utils.initOptions(c),c},a.models.ohlcBarChart=function(){var b=a.models.historicalBarChart(a.models.ohlcBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
open:"+b.yAxis.tickFormat()(c.open)+"
close:"+b.yAxis.tickFormat()(c.close)+"
high"+b.yAxis.tickFormat()(c.high)+"
low:"+b.yAxis.tickFormat()(c.low)+"
"}),b},a.models.candlestickBarChart=function(){var b=a.models.historicalBarChart(a.models.candlestickBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
open:"+b.yAxis.tickFormat()(c.open)+"
close:"+b.yAxis.tickFormat()(c.close)+"
high"+b.yAxis.tickFormat()(c.high)+"
low:"+b.yAxis.tickFormat()(c.low)+"
"}),b},a.models.legend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?"#000":"#fff":m?void 0:(a.color||(a.color=g(a,b)),a.disabled?a.color:"#fff")}function r(a,b){return m&&"furious"==o&&a.disengaged?"#eee":a.color||g(a,b)}function s(a){return m&&"furious"==o?1:a.disabled?0:1}return p.each(function(b){var g=d-c.left-c.right,p=d3.select(this);a.utils.initSVG(p);var t=p.selectAll("g.nv-legend").data([b]),u=t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),v=t.select("g");t.attr("transform","translate("+c.left+","+c.top+")");var w,x,y=v.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),z=y.enter().append("g").attr("class","nv-series");switch(o){case"furious":x=23;break;case"classic":x=20}if("classic"==o)z.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),w=y.select("circle");else if("furious"==o){z.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),w=y.select(".nv-legend-symbol"),z.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var A=y.select(".nv-check-box");A.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}z.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var B=y.select("text.nv-legend-text");y.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=y.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=y.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),y.classed("nv-disabled",function(a){return a.userDisabled}),y.exit().remove(),B.attr("fill",q).text(f);var C=0;if(h){var D=[];y.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}D.push(b+i)});var E=0,F=[];for(C=0;g>C&&Eg&&E>1;){F=[],E--;for(var G=0;G(F[G%E]||0)&&(F[G%E]=D[G]);C=F.reduce(function(a,b){return a+b})}for(var H=[],I=0,J=0;E>I;I++)H[I]=J,J+=F[I];y.attr("transform",function(a,b){return"translate("+H[b%E]+","+(5+Math.floor(b/E)*x)+")"}),j?v.attr("transform","translate("+(d-c.right-C)+","+c.top+")"):v.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(D.length/E)*x}else{var K,L=5,M=5,N=0;y.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return K=M,dN&&(N=M),K+N>C&&(C=K+N),"translate("+K+","+L+")"}),v.attr("transform","translate("+(d-c.right-N)+","+c.top+")"),e=c.top+c.bottom+L+15}if("furious"==o){w.attr("width",function(a,b){return B[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),u.insert("rect",":first-child").attr("class","nv-legend-bg").attr("fill","#eee").attr("opacity",0);var O=v.select(".nv-legend-bg");O.transition().duration(300).attr("x",-x).attr("width",C+x-12).attr("height",e+10).attr("y",-c.top-10).attr("opacity",m?1:0)}w.style("fill",r).style("fill-opacity",s).style("stroke",r)}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=32,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.line=function(){"use strict";function b(r){return v.reset(),v.models(e),r.each(function(b){i=d3.select(this);var r=a.utils.availableWidth(g,i,f),s=a.utils.availableHeight(h,i,f);a.utils.initSVG(i),c=e.xScale(),d=e.yScale(),t=t||c,u=u||d;var w=i.selectAll("g.nv-wrap.nv-line").data([b]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-line"),y=x.append("defs"),z=x.append("g"),A=w.select("g");z.append("g").attr("class","nv-groups"),z.append("g").attr("class","nv-scatterWrap"),w.attr("transform","translate("+f.left+","+f.top+")"),e.width(r).height(s);var B=w.select(".nv-scatterWrap");B.call(e),y.append("clipPath").attr("id","nv-edge-clip-"+e.id()).append("rect"),w.select("#nv-edge-clip-"+e.id()+" rect").attr("width",r).attr("height",s>0?s:0),A.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":""),B.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":"");var C=w.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});C.enter().append("g").style("stroke-opacity",1e-6).style("stroke-width",function(a){return a.strokeWidth||j}).style("fill-opacity",1e-6),C.exit().remove(),C.attr("class",function(a,b){return(a.classed||"")+" nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return k(a,b)}).style("stroke",function(a,b){return k(a,b)}),C.watchTransition(v,"line: groups").style("stroke-opacity",1).style("fill-opacity",function(a){return a.fillOpacity||.5});var D=C.selectAll("path.nv-area").data(function(a){return o(a)?[a]:[]});D.enter().append("path").attr("class","nv-area").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y0(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))}).y1(function(){return u(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])}),C.exit().selectAll("path.nv-area").remove(),D.watchTransition(v,"line: areaPaths").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y0(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))}).y1(function(){return d(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])});var E=C.selectAll("path.nv-line").data(function(a){return[a.values]});E.enter().append("path").attr("class","nv-line").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))})),E.watchTransition(v,"line: linePaths").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))})),t=c.copy(),u=d.copy()}),v.renderEnd("line immediate"),b}var c,d,e=a.models.scatter(),f={top:0,right:0,bottom:0,left:0},g=960,h=500,i=null,j=1.5,k=a.utils.defaultColor(),l=function(a){return a.x},m=function(a){return a.y},n=function(a,b){return!isNaN(m(a,b))&&null!==m(a,b)},o=function(a){return a.area},p=!1,q="linear",r=250,s=d3.dispatch("elementClick","elementMouseover","elementMouseout","renderEnd");e.pointSize(16).pointDomain([16,256]);var t,u,v=a.utils.renderWatch(s,r);return b.dispatch=s,b.scatter=e,e.dispatch.on("elementClick",function(){s.elementClick.apply(this,arguments)}),e.dispatch.on("elementMouseover",function(){s.elementMouseover.apply(this,arguments)}),e.dispatch.on("elementMouseout",function(){s.elementMouseout.apply(this,arguments)}),b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},defined:{get:function(){return n},set:function(a){n=a}},interpolate:{get:function(){return q},set:function(a){q=a}},clipEdge:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},duration:{get:function(){return r},set:function(a){r=a,v.reset(r),e.duration(r)}},isArea:{get:function(){return o},set:function(a){o=d3.functor(a)}},x:{get:function(){return l},set:function(a){l=a,e.x(a)}},y:{get:function(){return m},set:function(a){m=a,e.y(a)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.lineChart=function(){"use strict";function b(j){return y.reset(),y.models(e),p&&y.models(f),q&&y.models(g),j.each(function(j){var v=d3.select(this),y=this;a.utils.initSVG(v);var B=a.utils.availableWidth(m,v,k),C=a.utils.availableHeight(n,v,k);if(b.update=function(){0===x?v.call(b):v.transition().duration(x).call(b)},b.container=this,t.setter(A(j),b.update).getter(z(j)).update(),t.disabled=j.map(function(a){return!!a.disabled}),!u){var D;u={};for(D in t)u[D]=t[D]instanceof Array?t[D].slice(0):t[D] -}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,v),b;v.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var E=v.selectAll("g.nv-wrap.nv-lineChart").data([j]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-lineChart").append("g"),G=E.select("g");F.append("rect").style("opacity",0),F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-linesWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),G.select("rect").attr("width",B).attr("height",C>0?C:0),o&&(h.width(B),G.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),C=a.utils.availableHeight(n,v,k)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-k.top+")")),E.attr("transform","translate("+k.left+","+k.top+")"),r&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),s&&(i.width(B).height(C).margin({left:k.left,top:k.top}).svgContainer(v).xScale(c),E.select(".nv-interactive").call(i)),e.width(B).height(C).color(j.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!j[b].disabled}));var H=G.select(".nv-linesWrap").datum(j.filter(function(a){return!a.disabled}));H.call(e),p&&(f.scale(c)._ticks(a.utils.calcTicksX(B/100,j)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),G.select(".nv-x.nv-axis").call(f)),q&&(g.scale(d)._ticks(a.utils.calcTicksY(C/36,j)).tickSize(-B,0),G.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)t[c]=a[c];w.stateChange(t),b.update()}),i.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,h,m,n=[];if(j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,g){h=a.interactiveBisect(f.values,c.pointXValue,b.x());var i=f.values[h],j=b.y()(i,h);null!=j&&e.highlightPoint(g,h,!0),void 0!==i&&(void 0===d&&(d=i),void 0===m&&(m=b.xScale()(b.x()(i,h))),n.push({key:f.key,value:j,color:l(f,f.seriesIndex)}))}),n.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(n.map(function(a){return a.value}),o,q);null!==r&&(n[r].highlight=!0)}var s=f.tickFormat()(b.x()(d,h));i.tooltip.position({left:c.mouseX+k.left,top:c.mouseY+k.top}).chartContainer(y.parentNode).valueFormatter(function(a){return null==a?"N/A":g.tickFormat()(a)}).data({value:s,index:h,series:n})(),i.renderGuideLine(m)}),i.dispatch.on("elementClick",function(c){var d,f=[];j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(e){var g=a.interactiveBisect(e.values,c.pointXValue,b.x()),h=e.values[g];if("undefined"!=typeof h){"undefined"==typeof d&&(d=b.xScale()(b.x()(h,g)));var i=b.yScale()(b.y()(h,g));f.push({point:h,pointIndex:g,pos:[d,i],seriesIndex:e.seriesIndex,series:e})}}),e.dispatch.elementClick(f)}),i.dispatch.on("elementMouseout",function(){e.clearHighlights()}),w.on("changeState",function(a){"undefined"!=typeof a.disabled&&j.length===a.disabled.length&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),t.disabled=a.disabled),b.update()})}),y.renderEnd("lineChart immediate"),b}var c,d,e=a.models.line(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.interactiveGuideline(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=a.utils.defaultColor(),m=null,n=null,o=!0,p=!0,q=!0,r=!1,s=!1,t=a.utils.state(),u=null,v=null,w=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),x=250;f.orient("bottom").tickPadding(7),g.orient(r?"right":"left"),j.valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)});var y=a.utils.renderWatch(w,x),z=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},A=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){j.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),b.dispatch=w,b.lines=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.interactiveLayer=i,b.tooltip=j,b.dispatch=w,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return p},set:function(a){p=a}},showYAxis:{get:function(){return q},set:function(a){q=a}},defaultState:{get:function(){return u},set:function(a){u=a}},noData:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x),e.duration(x),f.duration(x),g.duration(x)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),h.color(l),e.color(l)}},rightAlignYAxis:{get:function(){return r},set:function(a){r=a,g.orient(r?"right":"left")}},useInteractiveGuideline:{get:function(){return s},set:function(a){s=a,s&&(e.interactive(!1),e.useVoronoi(!1))}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.linePlusBarChart=function(){"use strict";function b(v){return v.each(function(v){function J(a){var b=+("e"==a),c=b?1:-1,d=X/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function S(){u.empty()||u.extent(I),kb.data([u.empty()?e.domain():I]).each(function(a){var b=e(a[0])-e.range()[0],c=e.range()[1]-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>c?0:c)})}function T(){I=u.empty()?null:u.extent(),c=u.empty()?e.domain():u.extent(),K.brush({extent:c,brush:u}),S(),l.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),j.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var b=db.select(".nv-focus .nv-barsWrap").datum(Z.length?Z.map(function(a){return{key:a.key,values:a.values.filter(function(a,b){return l.x()(a,b)>=c[0]&&l.x()(a,b)<=c[1]})}}):[{values:[]}]),h=db.select(".nv-focus .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$.map(function(a){return{area:a.area,fillOpacity:a.fillOpacity,key:a.key,values:a.values.filter(function(a,b){return j.x()(a,b)>=c[0]&&j.x()(a,b)<=c[1]})}}));d=Z.length?l.xScale():j.xScale(),n.scale(d)._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-W,0),n.domain([Math.ceil(c[0]),Math.floor(c[1])]),db.select(".nv-x.nv-axis").transition().duration(L).call(n),b.transition().duration(L).call(l),h.transition().duration(L).call(j),db.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),p.scale(f)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(-V,0),q.scale(g)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(Z.length?0:-V,0),db.select(".nv-focus .nv-y1.nv-axis").style("opacity",Z.length?1:0),db.select(".nv-focus .nv-y2.nv-axis").style("opacity",$.length&&!$[0].disabled?1:0).attr("transform","translate("+d.range()[1]+",0)"),db.select(".nv-focus .nv-y1.nv-axis").transition().duration(L).call(p),db.select(".nv-focus .nv-y2.nv-axis").transition().duration(L).call(q)}var U=d3.select(this);a.utils.initSVG(U);var V=a.utils.availableWidth(y,U,w),W=a.utils.availableHeight(z,U,w)-(E?H:0),X=H-x.top-x.bottom;if(b.update=function(){U.transition().duration(L).call(b)},b.container=this,M.setter(R(v),b.update).getter(Q(v)).update(),M.disabled=v.map(function(a){return!!a.disabled}),!N){var Y;N={};for(Y in M)N[Y]=M[Y]instanceof Array?M[Y].slice(0):M[Y]}if(!(v&&v.length&&v.filter(function(a){return a.values.length}).length))return a.utils.noData(b,U),b;U.selectAll(".nv-noData").remove();var Z=v.filter(function(a){return!a.disabled&&a.bar}),$=v.filter(function(a){return!a.bar});d=l.xScale(),e=o.scale(),f=l.yScale(),g=j.yScale(),h=m.yScale(),i=k.yScale();var _=v.filter(function(a){return!a.disabled&&a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})}),ab=v.filter(function(a){return!a.disabled&&!a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})});d.range([0,V]),e.domain(d3.extent(d3.merge(_.concat(ab)),function(a){return a.x})).range([0,V]);var bb=U.selectAll("g.nv-wrap.nv-linePlusBar").data([v]),cb=bb.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),db=bb.select("g");cb.append("g").attr("class","nv-legendWrap");var eb=cb.append("g").attr("class","nv-focus");eb.append("g").attr("class","nv-x nv-axis"),eb.append("g").attr("class","nv-y1 nv-axis"),eb.append("g").attr("class","nv-y2 nv-axis"),eb.append("g").attr("class","nv-barsWrap"),eb.append("g").attr("class","nv-linesWrap");var fb=cb.append("g").attr("class","nv-context");if(fb.append("g").attr("class","nv-x nv-axis"),fb.append("g").attr("class","nv-y1 nv-axis"),fb.append("g").attr("class","nv-y2 nv-axis"),fb.append("g").attr("class","nv-barsWrap"),fb.append("g").attr("class","nv-linesWrap"),fb.append("g").attr("class","nv-brushBackground"),fb.append("g").attr("class","nv-x nv-brush"),D){var gb=t.align()?V/2:V,hb=t.align()?gb:0;t.width(gb),db.select(".nv-legendWrap").datum(v.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(a.bar?O:P),a})).call(t),w.top!=t.height()&&(w.top=t.height(),W=a.utils.availableHeight(z,U,w)-H),db.select(".nv-legendWrap").attr("transform","translate("+hb+","+-w.top+")")}bb.attr("transform","translate("+w.left+","+w.top+")"),db.select(".nv-context").style("display",E?"initial":"none"),m.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),k.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var ib=db.select(".nv-context .nv-barsWrap").datum(Z.length?Z:[{values:[]}]),jb=db.select(".nv-context .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$);db.select(".nv-context").attr("transform","translate(0,"+(W+w.bottom+x.top)+")"),ib.transition().call(m),jb.transition().call(k),G&&(o._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-X,0),db.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+h.range()[0]+")"),db.select(".nv-context .nv-x.nv-axis").transition().call(o)),F&&(r.scale(h)._ticks(X/36).tickSize(-V,0),s.scale(i)._ticks(X/36).tickSize(Z.length?0:-V,0),db.select(".nv-context .nv-y3.nv-axis").style("opacity",Z.length?1:0).attr("transform","translate(0,"+e.range()[0]+")"),db.select(".nv-context .nv-y2.nv-axis").style("opacity",$.length?1:0).attr("transform","translate("+e.range()[1]+",0)"),db.select(".nv-context .nv-y1.nv-axis").transition().call(r),db.select(".nv-context .nv-y2.nv-axis").transition().call(s)),u.x(e).on("brush",T),I&&u.extent(I);var kb=db.select(".nv-brushBackground").selectAll("g").data([I||u.extent()]),lb=kb.enter().append("g");lb.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",X),lb.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",X);var mb=db.select(".nv-x.nv-brush").call(u);mb.selectAll("rect").attr("height",X),mb.selectAll(".resize").append("path").attr("d",J),t.dispatch.on("stateChange",function(a){for(var c in a)M[c]=a[c];K.stateChange(M),b.update()}),K.on("changeState",function(a){"undefined"!=typeof a.disabled&&(v.forEach(function(b,c){b.disabled=a.disabled[c]}),M.disabled=a.disabled),b.update()}),T()}),b}var c,d,e,f,g,h,i,j=a.models.line(),k=a.models.line(),l=a.models.historicalBar(),m=a.models.historicalBar(),n=a.models.axis(),o=a.models.axis(),p=a.models.axis(),q=a.models.axis(),r=a.models.axis(),s=a.models.axis(),t=a.models.legend(),u=d3.svg.brush(),v=a.models.tooltip(),w={top:30,right:30,bottom:30,left:60},x={top:0,right:30,bottom:20,left:60},y=null,z=null,A=function(a){return a.x},B=function(a){return a.y},C=a.utils.defaultColor(),D=!0,E=!0,F=!1,G=!0,H=50,I=null,J=null,K=d3.dispatch("brush","stateChange","changeState"),L=0,M=a.utils.state(),N=null,O=" (left axis)",P=" (right axis)";j.clipEdge(!0),k.interactive(!1),n.orient("bottom").tickPadding(5),p.orient("left"),q.orient("right"),o.orient("bottom").tickPadding(5),r.orient("left"),s.orient("right"),v.headerEnabled(!0).headerFormatter(function(a,b){return n.tickFormat()(a,b)});var Q=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},R=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return j.dispatch.on("elementMouseover.tooltip",function(a){v.duration(100).valueFormatter(function(a,b){return q.tickFormat()(a,b)}).data(a).position(a.pos).hidden(!1)}),j.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={value:b.y()(a.data),color:a.color},v.duration(0).valueFormatter(function(a,b){return p.tickFormat()(a,b)}).data(a).hidden(!1)}),l.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMousemove.tooltip",function(){v.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=K,b.legend=t,b.lines=j,b.lines2=k,b.bars=l,b.bars2=m,b.xAxis=n,b.x2Axis=o,b.y1Axis=p,b.y2Axis=q,b.y3Axis=r,b.y4Axis=s,b.tooltip=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return y},set:function(a){y=a}},height:{get:function(){return z},set:function(a){z=a}},showLegend:{get:function(){return D},set:function(a){D=a}},brushExtent:{get:function(){return I},set:function(a){I=a}},noData:{get:function(){return J},set:function(a){J=a}},focusEnable:{get:function(){return E},set:function(a){E=a}},focusHeight:{get:function(){return H},set:function(a){H=a}},focusShowAxisX:{get:function(){return G},set:function(a){G=a}},focusShowAxisY:{get:function(){return F},set:function(a){F=a}},legendLeftAxisHint:{get:function(){return O},set:function(a){O=a}},legendRightAxisHint:{get:function(){return P},set:function(a){P=a}},tooltips:{get:function(){return v.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),v.enabled(!!b)}},tooltipContent:{get:function(){return v.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),v.contentGenerator(b)}},margin:{get:function(){return w},set:function(a){w.top=void 0!==a.top?a.top:w.top,w.right=void 0!==a.right?a.right:w.right,w.bottom=void 0!==a.bottom?a.bottom:w.bottom,w.left=void 0!==a.left?a.left:w.left}},duration:{get:function(){return L},set:function(a){L=a}},color:{get:function(){return C},set:function(b){C=a.utils.getColor(b),t.color(C)}},x:{get:function(){return A},set:function(a){A=a,j.x(a),k.x(a),l.x(a),m.x(a)}},y:{get:function(){return B},set:function(a){B=a,j.y(a),k.y(a),l.y(a),m.y(a)}}}),a.utils.inheritOptions(b,j),a.utils.initOptions(b),b},a.models.lineWithFocusChart=function(){"use strict";function b(o){return o.each(function(o){function z(a){var b=+("e"==a),c=b?1:-1,d=M/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function G(){n.empty()||n.extent(y),U.data([n.empty()?e.domain():y]).each(function(a){var b=e(a[0])-c.range()[0],d=K-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>d?0:d)})}function H(){y=n.empty()?null:n.extent();var a=n.empty()?e.domain():n.extent();if(!(Math.abs(a[0]-a[1])<=1)){A.brush({extent:a,brush:n}),G();var b=Q.select(".nv-focus .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}).map(function(b){return{key:b.key,area:b.area,values:b.values.filter(function(b,c){return g.x()(b,c)>=a[0]&&g.x()(b,c)<=a[1]})}}));b.transition().duration(B).call(g),Q.select(".nv-focus .nv-x.nv-axis").transition().duration(B).call(i),Q.select(".nv-focus .nv-y.nv-axis").transition().duration(B).call(j)}}var I=d3.select(this),J=this;a.utils.initSVG(I);var K=a.utils.availableWidth(t,I,q),L=a.utils.availableHeight(u,I,q)-v,M=v-r.top-r.bottom;if(b.update=function(){I.transition().duration(B).call(b)},b.container=this,C.setter(F(o),b.update).getter(E(o)).update(),C.disabled=o.map(function(a){return!!a.disabled}),!D){var N;D={};for(N in C)D[N]=C[N]instanceof Array?C[N].slice(0):C[N]}if(!(o&&o.length&&o.filter(function(a){return a.values.length}).length))return a.utils.noData(b,I),b;I.selectAll(".nv-noData").remove(),c=g.xScale(),d=g.yScale(),e=h.xScale(),f=h.yScale();var O=I.selectAll("g.nv-wrap.nv-lineWithFocusChart").data([o]),P=O.enter().append("g").attr("class","nvd3 nv-wrap nv-lineWithFocusChart").append("g"),Q=O.select("g");P.append("g").attr("class","nv-legendWrap");var R=P.append("g").attr("class","nv-focus");R.append("g").attr("class","nv-x nv-axis"),R.append("g").attr("class","nv-y nv-axis"),R.append("g").attr("class","nv-linesWrap"),R.append("g").attr("class","nv-interactive");var S=P.append("g").attr("class","nv-context");S.append("g").attr("class","nv-x nv-axis"),S.append("g").attr("class","nv-y nv-axis"),S.append("g").attr("class","nv-linesWrap"),S.append("g").attr("class","nv-brushBackground"),S.append("g").attr("class","nv-x nv-brush"),x&&(m.width(K),Q.select(".nv-legendWrap").datum(o).call(m),q.top!=m.height()&&(q.top=m.height(),L=a.utils.availableHeight(u,I,q)-v),Q.select(".nv-legendWrap").attr("transform","translate(0,"+-q.top+")")),O.attr("transform","translate("+q.left+","+q.top+")"),w&&(p.width(K).height(L).margin({left:q.left,top:q.top}).svgContainer(I).xScale(c),O.select(".nv-interactive").call(p)),g.width(K).height(L).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),h.defined(g.defined()).width(K).height(M).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),Q.select(".nv-context").attr("transform","translate(0,"+(L+q.bottom+r.top)+")");var T=Q.select(".nv-context .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}));d3.transition(T).call(h),i.scale(c)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-L,0),j.scale(d)._ticks(a.utils.calcTicksY(L/36,o)).tickSize(-K,0),Q.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+L+")"),n.x(e).on("brush",function(){H()}),y&&n.extent(y);var U=Q.select(".nv-brushBackground").selectAll("g").data([y||n.extent()]),V=U.enter().append("g");V.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",M),V.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",M);var W=Q.select(".nv-x.nv-brush").call(n);W.selectAll("rect").attr("height",M),W.selectAll(".resize").append("path").attr("d",z),H(),k.scale(e)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-M,0),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),d3.transition(Q.select(".nv-context .nv-x.nv-axis")).call(k),l.scale(f)._ticks(a.utils.calcTicksY(M/36,o)).tickSize(-K,0),d3.transition(Q.select(".nv-context .nv-y.nv-axis")).call(l),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),m.dispatch.on("stateChange",function(a){for(var c in a)C[c]=a[c];A.stateChange(C),b.update()}),p.dispatch.on("elementMousemove",function(c){g.clearHighlights();var d,f,h,k=[];if(o.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(i,j){var l=n.empty()?e.domain():n.extent(),m=i.values.filter(function(a,b){return g.x()(a,b)>=l[0]&&g.x()(a,b)<=l[1]});f=a.interactiveBisect(m,c.pointXValue,g.x());var o=m[f],p=b.y()(o,f);null!=p&&g.highlightPoint(j,f,!0),void 0!==o&&(void 0===d&&(d=o),void 0===h&&(h=b.xScale()(b.x()(o,f))),k.push({key:i.key,value:b.y()(o,f),color:s(i,i.seriesIndex)}))}),k.length>2){var l=b.yScale().invert(c.mouseY),m=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),r=.03*m,t=a.nearestValueIndex(k.map(function(a){return a.value}),l,r);null!==t&&(k[t].highlight=!0)}var u=i.tickFormat()(b.x()(d,f));p.tooltip.position({left:c.mouseX+q.left,top:c.mouseY+q.top}).chartContainer(J.parentNode).valueFormatter(function(a){return null==a?"N/A":j.tickFormat()(a)}).data({value:u,index:f,series:k})(),p.renderGuideLine(h)}),p.dispatch.on("elementMouseout",function(){g.clearHighlights()}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&o.forEach(function(b,c){b.disabled=a.disabled[c]}),b.update()})}),b}var c,d,e,f,g=a.models.line(),h=a.models.line(),i=a.models.axis(),j=a.models.axis(),k=a.models.axis(),l=a.models.axis(),m=a.models.legend(),n=d3.svg.brush(),o=a.models.tooltip(),p=a.interactiveGuideline(),q={top:30,right:30,bottom:30,left:60},r={top:0,right:30,bottom:20,left:60},s=a.utils.defaultColor(),t=null,u=null,v=50,w=!1,x=!0,y=null,z=null,A=d3.dispatch("brush","stateChange","changeState"),B=250,C=a.utils.state(),D=null;g.clipEdge(!0).duration(0),h.interactive(!1),i.orient("bottom").tickPadding(5),j.orient("left"),k.orient("bottom").tickPadding(5),l.orient("left"),o.valueFormatter(function(a,b){return j.tickFormat()(a,b)}).headerFormatter(function(a,b){return i.tickFormat()(a,b)});var E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return g.dispatch.on("elementMouseover.tooltip",function(a){o.data(a).position(a.pos).hidden(!1)}),g.dispatch.on("elementMouseout.tooltip",function(){o.hidden(!0)}),b.dispatch=A,b.legend=m,b.lines=g,b.lines2=h,b.xAxis=i,b.yAxis=j,b.x2Axis=k,b.y2Axis=l,b.interactiveLayer=p,b.tooltip=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return t},set:function(a){t=a}},height:{get:function(){return u},set:function(a){u=a}},focusHeight:{get:function(){return v},set:function(a){v=a}},showLegend:{get:function(){return x},set:function(a){x=a}},brushExtent:{get:function(){return y},set:function(a){y=a}},defaultState:{get:function(){return D},set:function(a){D=a}},noData:{get:function(){return z},set:function(a){z=a}},tooltips:{get:function(){return o.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),o.enabled(!!b)}},tooltipContent:{get:function(){return o.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),o.contentGenerator(b)}},margin:{get:function(){return q},set:function(a){q.top=void 0!==a.top?a.top:q.top,q.right=void 0!==a.right?a.right:q.right,q.bottom=void 0!==a.bottom?a.bottom:q.bottom,q.left=void 0!==a.left?a.left:q.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b),m.color(s)}},interpolate:{get:function(){return g.interpolate()},set:function(a){g.interpolate(a),h.interpolate(a)}},xTickFormat:{get:function(){return i.tickFormat()},set:function(a){i.tickFormat(a),k.tickFormat(a)}},yTickFormat:{get:function(){return j.tickFormat()},set:function(a){j.tickFormat(a),l.tickFormat(a)}},duration:{get:function(){return B},set:function(a){B=a,j.duration(B),l.duration(B),i.duration(B),k.duration(B)}},x:{get:function(){return g.x()},set:function(a){g.x(a),h.x(a)}},y:{get:function(){return g.y()},set:function(a){g.y(a),h.y(a)}},useInteractiveGuideline:{get:function(){return w},set:function(a){w=a,w&&(g.interactive(!1),g.useVoronoi(!1))}}}),a.utils.inheritOptions(b,g),a.utils.initOptions(b),b},a.models.multiBar=function(){"use strict";function b(E){return C.reset(),E.each(function(b){var E=k-j.left-j.right,F=l-j.top-j.bottom;p=d3.select(this),a.utils.initSVG(p);var G=0;if(x&&b.length&&(x=[{values:b[0].values.map(function(a){return{x:a.x,y:0,series:a.series,size:.01}})}]),u){var H=d3.layout.stack().offset(v).values(function(a){return a.values}).y(r)(!b.length&&x?x:b);H.forEach(function(a,c){a.nonStackable?(b[c].nonStackableSeries=G++,H[c]=b[c]):c>0&&H[c-1].nonStackable&&H[c].values.map(function(a,b){a.y0-=H[c-1].values[b].y,a.y1=a.y0+a.y})}),b=H}b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),u&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a,f){if(!b[f].nonStackable){var g=a.values[c];g.size=Math.abs(g.y),g.y<0?(g.y1=e,e-=g.size):(g.y1=g.size+d,d+=g.size)}})});var I=d&&e?[]:b.map(function(a,b){return a.values.map(function(a,c){return{x:q(a,c),y:r(a,c),y0:a.y0,y1:a.y1,idx:b}})});m.domain(d||d3.merge(I).map(function(a){return a.x})).rangeBands(f||[0,E],A),n.domain(e||d3.extent(d3.merge(I).map(function(a){var c=a.y;return u&&!b[a.idx].nonStackable&&(c=a.y>0?a.y1:a.y1+a.y),c}).concat(s))).range(g||[F,0]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]+.01*n.domain()[0],n.domain()[1]-.01*n.domain()[1]]:[-1,1]),h=h||m,i=i||n;var J=p.selectAll("g.nv-wrap.nv-multibar").data([b]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multibar"),L=K.append("defs"),M=K.append("g"),N=J.select("g");M.append("g").attr("class","nv-groups"),J.attr("transform","translate("+j.left+","+j.top+")"),L.append("clipPath").attr("id","nv-edge-clip-"+o).append("rect"),J.select("#nv-edge-clip-"+o+" rect").attr("width",E).attr("height",F),N.attr("clip-path",t?"url(#nv-edge-clip-"+o+")":"");var O=J.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});O.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);var P=C.transition(O.exit().selectAll("rect.nv-bar"),"multibarExit",Math.min(100,z)).attr("y",function(a){var c=i(0)||0;return u&&b[a.series]&&!b[a.series].nonStackable&&(c=i(a.y0)),c}).attr("height",0).remove();P.delay&&P.delay(function(a,b){var c=b*(z/(D+1))-b;return c}),O.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return w(a,b)}).style("stroke",function(a,b){return w(a,b)}),O.style("stroke-opacity",1).style("fill-opacity",.75);var Q=O.selectAll("rect.nv-bar").data(function(a){return x&&!b.length?x.values:a.values});Q.exit().remove();Q.enter().append("rect").attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("x",function(a,c,d){return u&&!b[d].nonStackable?0:d*m.rangeBand()/b.length}).attr("y",function(a,c,d){return i(u&&!b[d].nonStackable?a.y0:0)||0}).attr("height",0).attr("width",function(a,c,d){return m.rangeBand()/(u&&!b[d].nonStackable?1:b.length)}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"});Q.style("fill",function(a,b,c){return w(a,c,b)}).style("stroke",function(a,b,c){return w(a,c,b)}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),B.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),B.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){B.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){B.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){B.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),Q.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"}),y&&(c||(c=b.map(function(){return!0})),Q.style("fill",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}));var R=Q.watchTransition(C,"multibar",Math.min(250,z)).delay(function(a,c){return c*z/b[0].values.length});u?R.attr("y",function(a,c,d){var e=0;return e=b[d].nonStackable?r(a,c)<0?n(0):n(0)-n(r(a,c))<-1?n(0)-1:n(r(a,c))||0:n(a.y1)}).attr("height",function(a,c,d){return b[d].nonStackable?Math.max(Math.abs(n(r(a,c))-n(0)),1)||0:Math.max(Math.abs(n(a.y+a.y0)-n(a.y0)),1)}).attr("x",function(a,c,d){var e=0;return b[d].nonStackable&&(e=a.series*m.rangeBand()/b.length,b.length!==G&&(e=b[d].nonStackableSeries*m.rangeBand()/(2*G))),e}).attr("width",function(a,c,d){if(b[d].nonStackable){var e=m.rangeBand()/G;return b.length!==G&&(e=m.rangeBand()/(2*G)),e}return m.rangeBand()}):R.attr("x",function(a){return a.series*m.rangeBand()/b.length}).attr("width",m.rangeBand()/b.length).attr("y",function(a,b){return r(a,b)<0?n(0):n(0)-n(r(a,b))<1?n(0)-1:n(r(a,b))||0}).attr("height",function(a,b){return Math.max(Math.abs(n(r(a,b))-n(0)),1)||0}),h=m.copy(),i=n.copy(),b[0]&&b[0].values&&(D=b[0].values.length)}),C.renderEnd("multibar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=d3.scale.ordinal(),n=d3.scale.linear(),o=Math.floor(1e4*Math.random()),p=null,q=function(a){return a.x},r=function(a){return a.y},s=[0],t=!0,u=!1,v="zero",w=a.utils.defaultColor(),x=!1,y=null,z=500,A=.1,B=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),C=a.utils.renderWatch(B,z),D=0;return b.dispatch=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return s},set:function(a){s=a}},stacked:{get:function(){return u},set:function(a){u=a}},stackOffset:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return t},set:function(a){t=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return o},set:function(a){o=a}},hideable:{get:function(){return x},set:function(a){x=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z)}},color:{get:function(){return w},set:function(b){w=a.utils.getColor(b)}},barColor:{get:function(){return y},set:function(b){y=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarChart=function(){"use strict";function b(j){return D.reset(),D.models(e),r&&D.models(f),s&&D.models(g),j.each(function(j){var z=d3.select(this);a.utils.initSVG(z);var D=a.utils.availableWidth(l,z,k),H=a.utils.availableHeight(m,z,k);if(b.update=function(){0===C?z.call(b):z.transition().duration(C).call(b)},b.container=this,x.setter(G(j),b.update).getter(F(j)).update(),x.disabled=j.map(function(a){return!!a.disabled}),!y){var I;y={};for(I in x)y[I]=x[I]instanceof Array?x[I].slice(0):x[I]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,z),b;z.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale(); -var J=z.selectAll("g.nv-wrap.nv-multiBarWithLegend").data([j]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarWithLegend").append("g"),L=J.select("g");if(K.append("g").attr("class","nv-x nv-axis"),K.append("g").attr("class","nv-y nv-axis"),K.append("g").attr("class","nv-barsWrap"),K.append("g").attr("class","nv-legendWrap"),K.append("g").attr("class","nv-controlsWrap"),q&&(h.width(D-B()),L.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),H=a.utils.availableHeight(m,z,k)),L.select(".nv-legendWrap").attr("transform","translate("+B()+","+-k.top+")")),o){var M=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(B()).color(["#444","#444","#444"]),L.select(".nv-controlsWrap").datum(M).attr("transform","translate(0,"+-k.top+")").call(i)}J.attr("transform","translate("+k.left+","+k.top+")"),t&&L.select(".nv-y.nv-axis").attr("transform","translate("+D+",0)"),e.disabled(j.map(function(a){return a.disabled})).width(D).height(H).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var N=L.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(N.call(e),r){f.scale(c)._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-H,0),L.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),L.select(".nv-x.nv-axis").call(f);var O=L.select(".nv-x.nv-axis > g").selectAll("g");if(O.selectAll("line, text").style("opacity",1),v){var P=function(a,b){return"translate("+a+","+b+")"},Q=5,R=17;O.selectAll("text").attr("transform",function(a,b,c){return P(0,c%2==0?Q:R)});var S=d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length;L.selectAll(".nv-x.nv-axis .nv-axisMaxMin text").attr("transform",function(a,b){return P(0,0===b||S%2!==0?R:Q)})}u&&O.filter(function(a,b){return b%Math.ceil(j[0].values.length/(D/100))!==0}).selectAll("text, line").style("opacity",0),w&&O.selectAll(".tick text").attr("transform","rotate("+w+" 0,0)").style("text-anchor",w>0?"start":"end"),L.select(".nv-x.nv-axis").selectAll("g.nv-axisMaxMin text").style("opacity",1)}s&&(g.scale(d)._ticks(a.utils.calcTicksY(H/36,j)).tickSize(-D,0),L.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];A.stateChange(x),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(M=M.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":case p.grouped:e.stacked(!1);break;case"Stacked":case p.stacked:e.stacked(!0)}x.stacked=e.stacked(),A.stateChange(x),b.update()}}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),x.stacked=a.stacked,E=a.stacked),b.update()})}),D.renderEnd("multibarchart immediate"),b}var c,d,e=a.models.multiBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=0,x=a.utils.state(),y=null,z=null,A=d3.dispatch("stateChange","changeState","renderEnd"),B=function(){return o?180:0},C=250;x.stacked=!1,e.stacked(!1),f.orient("bottom").tickPadding(7).showMaxMin(!1).tickFormat(function(a){return a}),g.orient(t?"right":"left").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var D=a.utils.renderWatch(A),E=!1,F=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:E}}},G=function(a){return function(b){void 0!==b.stacked&&(E=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=A,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=x,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return z},set:function(a){z=a}},reduceXTicks:{get:function(){return u},set:function(a){u=a}},rotateLabels:{get:function(){return w},set:function(a){w=a}},staggerLabels:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return C},set:function(a){C=a,e.duration(C),f.duration(C),g.duration(C),D.reset(C)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiBarHorizontal=function(){"use strict";function b(m){return E.reset(),m.each(function(b){var m=k-j.left-j.right,C=l-j.top-j.bottom;n=d3.select(this),a.utils.initSVG(n),w&&(b=d3.layout.stack().offset("zero").values(function(a){return a.values}).y(r)(b)),b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),w&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a){var b=a.values[c];b.size=Math.abs(b.y),b.y<0?(b.y1=e-b.size,e-=b.size):(b.y1=d,d+=b.size)})});var F=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:q(a,b),y:r(a,b),y0:a.y0,y1:a.y1}})});o.domain(d||d3.merge(F).map(function(a){return a.x})).rangeBands(f||[0,C],A),p.domain(e||d3.extent(d3.merge(F).map(function(a){return w?a.y>0?a.y1+a.y:a.y1:a.y}).concat(t))),p.range(x&&!w?g||[p.domain()[0]<0?z:0,m-(p.domain()[1]>0?z:0)]:g||[0,m]),h=h||o,i=i||d3.scale.linear().domain(p.domain()).range([p(0),p(0)]);{var G=d3.select(this).selectAll("g.nv-wrap.nv-multibarHorizontal").data([b]),H=G.enter().append("g").attr("class","nvd3 nv-wrap nv-multibarHorizontal"),I=(H.append("defs"),H.append("g"));G.select("g")}I.append("g").attr("class","nv-groups"),G.attr("transform","translate("+j.left+","+j.top+")");var J=G.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});J.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),J.exit().watchTransition(E,"multibarhorizontal: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),J.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return u(a,b)}).style("stroke",function(a,b){return u(a,b)}),J.watchTransition(E,"multibarhorizontal: groups").style("stroke-opacity",1).style("fill-opacity",.75);var K=J.selectAll("g.nv-bar").data(function(a){return a.values});K.exit().remove();var L=K.enter().append("g").attr("transform",function(a,c,d){return"translate("+i(w?a.y0:0)+","+(w?0:d*o.rangeBand()/b.length+o(q(a,c)))+")"});L.append("rect").attr("width",0).attr("height",o.rangeBand()/(w?1:b.length)),K.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),D.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){D.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){D.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){D.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),s(b[0],0)&&(L.append("polyline"),K.select("polyline").attr("fill","none").attr("points",function(a,c){var d=s(a,c),e=.8*o.rangeBand()/(2*(w?1:b.length));d=d.length?d:[-Math.abs(d),Math.abs(d)],d=d.map(function(a){return p(a)-p(0)});var f=[[d[0],-e],[d[0],e],[d[0],0],[d[1],0],[d[1],-e],[d[1],e]];return f.map(function(a){return a.join(",")}).join(" ")}).attr("transform",function(a,c){var d=o.rangeBand()/(2*(w?1:b.length));return"translate("+(r(a,c)<0?0:p(r(a,c))-p(0))+", "+d+")"})),L.append("text"),x&&!w?(K.select("text").attr("text-anchor",function(a,b){return r(a,b)<0?"end":"start"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){var c=B(r(a,b)),d=s(a,b);return void 0===d?c:d.length?c+"+"+B(Math.abs(d[1]))+"-"+B(Math.abs(d[0])):c+"±"+B(Math.abs(d))}),K.watchTransition(E,"multibarhorizontal: bars").select("text").attr("x",function(a,b){return r(a,b)<0?-4:p(r(a,b))-p(0)+4})):K.selectAll("text").text(""),y&&!w?(L.append("text").classed("nv-bar-label",!0),K.select("text.nv-bar-label").attr("text-anchor",function(a,b){return r(a,b)<0?"start":"end"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){return q(a,b)}),K.watchTransition(E,"multibarhorizontal: bars").select("text.nv-bar-label").attr("x",function(a,b){return r(a,b)<0?p(0)-p(r(a,b))+4:-4})):K.selectAll("text.nv-bar-label").text(""),K.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}),v&&(c||(c=b.map(function(){return!0})),K.style("fill",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()})),w?K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,b){return"translate("+p(a.y1)+","+o(q(a,b))+")"}).select("rect").attr("width",function(a,b){return Math.abs(p(r(a,b)+a.y0)-p(a.y0))}).attr("height",o.rangeBand()):K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,c){return"translate("+p(r(a,c)<0?r(a,c):0)+","+(a.series*o.rangeBand()/b.length+o(q(a,c)))+")"}).select("rect").attr("height",o.rangeBand()/b.length).attr("width",function(a,b){return Math.max(Math.abs(p(r(a,b))-p(0)),1)}),h=o.copy(),i=p.copy()}),E.renderEnd("multibarHorizontal immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=null,o=d3.scale.ordinal(),p=d3.scale.linear(),q=function(a){return a.x},r=function(a){return a.y},s=function(a){return a.yErr},t=[0],u=a.utils.defaultColor(),v=null,w=!1,x=!1,y=!1,z=60,A=.1,B=d3.format(",.2f"),C=250,D=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),E=a.utils.renderWatch(D,C);return b.dispatch=D,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},yErr:{get:function(){return s},set:function(a){s=a}},xScale:{get:function(){return o},set:function(a){o=a}},yScale:{get:function(){return p},set:function(a){p=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return t},set:function(a){t=a}},stacked:{get:function(){return w},set:function(a){w=a}},showValues:{get:function(){return x},set:function(a){x=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return m},set:function(a){m=a}},valueFormat:{get:function(){return B},set:function(a){B=a}},valuePadding:{get:function(){return z},set:function(a){z=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return C},set:function(a){C=a,E.reset(C)}},color:{get:function(){return u},set:function(b){u=a.utils.getColor(b)}},barColor:{get:function(){return v},set:function(b){v=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarHorizontalChart=function(){"use strict";function b(j){return C.reset(),C.models(e),r&&C.models(f),s&&C.models(g),j.each(function(j){var w=d3.select(this);a.utils.initSVG(w);var C=a.utils.availableWidth(l,w,k),D=a.utils.availableHeight(m,w,k);if(b.update=function(){w.transition().duration(z).call(b)},b.container=this,t=e.stacked(),u.setter(B(j),b.update).getter(A(j)).update(),u.disabled=j.map(function(a){return!!a.disabled}),!v){var E;v={};for(E in u)v[E]=u[E]instanceof Array?u[E].slice(0):u[E]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,w),b;w.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var F=w.selectAll("g.nv-wrap.nv-multiBarHorizontalChart").data([j]),G=F.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarHorizontalChart").append("g"),H=F.select("g");if(G.append("g").attr("class","nv-x nv-axis"),G.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),G.append("g").attr("class","nv-barsWrap"),G.append("g").attr("class","nv-legendWrap"),G.append("g").attr("class","nv-controlsWrap"),q&&(h.width(C-y()),H.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),D=a.utils.availableHeight(m,w,k)),H.select(".nv-legendWrap").attr("transform","translate("+y()+","+-k.top+")")),o){var I=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(y()).color(["#444","#444","#444"]),H.select(".nv-controlsWrap").datum(I).attr("transform","translate(0,"+-k.top+")").call(i)}F.attr("transform","translate("+k.left+","+k.top+")"),e.disabled(j.map(function(a){return a.disabled})).width(C).height(D).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var J=H.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(J.transition().call(e),r){f.scale(c)._ticks(a.utils.calcTicksY(D/24,j)).tickSize(-C,0),H.select(".nv-x.nv-axis").call(f);var K=H.select(".nv-x.nv-axis").selectAll("g");K.selectAll("line, text")}s&&(g.scale(d)._ticks(a.utils.calcTicksX(C/100,j)).tickSize(-D,0),H.select(".nv-y.nv-axis").attr("transform","translate(0,"+D+")"),H.select(".nv-y.nv-axis").call(g)),H.select(".nv-zeroLine line").attr("x1",d(0)).attr("x2",d(0)).attr("y1",0).attr("y2",-D),h.dispatch.on("stateChange",function(a){for(var c in a)u[c]=a[c];x.stateChange(u),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(I=I.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":e.stacked(!1);break;case"Stacked":e.stacked(!0)}u.stacked=e.stacked(),x.stateChange(u),t=e.stacked(),b.update()}}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),u.stacked=a.stacked,t=a.stacked),b.update()})}),C.renderEnd("multibar horizontal chart immediate"),b}var c,d,e=a.models.multiBarHorizontal(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend().height(30),i=a.models.legend().height(30),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=a.utils.state(),v=null,w=null,x=d3.dispatch("stateChange","changeState","renderEnd"),y=function(){return o?180:0},z=250;u.stacked=!1,e.stacked(t),f.orient("left").tickPadding(5).showMaxMin(!1).tickFormat(function(a){return a}),g.orient("bottom").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var A=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:t}}},B=function(a){return function(b){void 0!==b.stacked&&(t=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},C=a.utils.renderWatch(x,z);return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=x,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=u,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z),e.duration(z),f.duration(z),g.duration(z)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiChart=function(){"use strict";function b(j){return j.each(function(j){function k(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.value=a.point.x,a.series={value:a.point.y,color:a.point.color},B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function l(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.point.x=v.x()(a.point),a.point.y=v.y()(a.point),B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function n(a){var b=2===j[a.data.series].yAxis?z:y;a.value=t.x()(a.data),a.series={value:t.y()(a.data),color:a.color},B.duration(0).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}var C=d3.select(this);a.utils.initSVG(C),b.update=function(){C.transition().call(b)},b.container=this;var D=a.utils.availableWidth(g,C,e),E=a.utils.availableHeight(h,C,e),F=j.filter(function(a){return"line"==a.type&&1==a.yAxis}),G=j.filter(function(a){return"line"==a.type&&2==a.yAxis}),H=j.filter(function(a){return"bar"==a.type&&1==a.yAxis}),I=j.filter(function(a){return"bar"==a.type&&2==a.yAxis}),J=j.filter(function(a){return"area"==a.type&&1==a.yAxis}),K=j.filter(function(a){return"area"==a.type&&2==a.yAxis});if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,C),b;C.selectAll(".nv-noData").remove();var L=j.filter(function(a){return!a.disabled&&1==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})}),M=j.filter(function(a){return!a.disabled&&2==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})});o.domain(d3.extent(d3.merge(L.concat(M)),function(a){return a.x})).range([0,D]);var N=C.selectAll("g.wrap.multiChart").data([j]),O=N.enter().append("g").attr("class","wrap nvd3 multiChart").append("g");O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y1 nv-axis"),O.append("g").attr("class","nv-y2 nv-axis"),O.append("g").attr("class","lines1Wrap"),O.append("g").attr("class","lines2Wrap"),O.append("g").attr("class","bars1Wrap"),O.append("g").attr("class","bars2Wrap"),O.append("g").attr("class","stack1Wrap"),O.append("g").attr("class","stack2Wrap"),O.append("g").attr("class","legendWrap");var P=N.select("g"),Q=j.map(function(a,b){return j[b].color||f(a,b)});if(i){var R=A.align()?D/2:D,S=A.align()?R:0;A.width(R),A.color(Q),P.select(".legendWrap").datum(j.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(1==a.yAxis?"":" (right axis)"),a})).call(A),e.top!=A.height()&&(e.top=A.height(),E=a.utils.availableHeight(h,C,e)),P.select(".legendWrap").attr("transform","translate("+S+","+-e.top+")")}r.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"line"==j[b].type})),s.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"line"==j[b].type})),t.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"bar"==j[b].type})),u.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"bar"==j[b].type})),v.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"area"==j[b].type})),w.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"area"==j[b].type})),P.attr("transform","translate("+e.left+","+e.top+")");var T=P.select(".lines1Wrap").datum(F.filter(function(a){return!a.disabled})),U=P.select(".bars1Wrap").datum(H.filter(function(a){return!a.disabled})),V=P.select(".stack1Wrap").datum(J.filter(function(a){return!a.disabled})),W=P.select(".lines2Wrap").datum(G.filter(function(a){return!a.disabled})),X=P.select(".bars2Wrap").datum(I.filter(function(a){return!a.disabled})),Y=P.select(".stack2Wrap").datum(K.filter(function(a){return!a.disabled})),Z=J.length?J.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[],$=K.length?K.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[];p.domain(c||d3.extent(d3.merge(L).concat(Z),function(a){return a.y})).range([0,E]),q.domain(d||d3.extent(d3.merge(M).concat($),function(a){return a.y})).range([0,E]),r.yDomain(p.domain()),t.yDomain(p.domain()),v.yDomain(p.domain()),s.yDomain(q.domain()),u.yDomain(q.domain()),w.yDomain(q.domain()),J.length&&d3.transition(V).call(v),K.length&&d3.transition(Y).call(w),H.length&&d3.transition(U).call(t),I.length&&d3.transition(X).call(u),F.length&&d3.transition(T).call(r),G.length&&d3.transition(W).call(s),x._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-E,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+E+")"),d3.transition(P.select(".nv-x.nv-axis")).call(x),y._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y1.nv-axis")).call(y),z._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y2.nv-axis")).call(z),P.select(".nv-y1.nv-axis").classed("nv-disabled",L.length?!1:!0).attr("transform","translate("+o.range()[0]+",0)"),P.select(".nv-y2.nv-axis").classed("nv-disabled",M.length?!1:!0).attr("transform","translate("+o.range()[1]+",0)"),A.dispatch.on("stateChange",function(){b.update()}),r.dispatch.on("elementMouseover.tooltip",k),s.dispatch.on("elementMouseover.tooltip",k),r.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),s.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),v.dispatch.on("elementMouseover.tooltip",l),w.dispatch.on("elementMouseover.tooltip",l),v.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),w.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMouseover.tooltip",n),u.dispatch.on("elementMouseover.tooltip",n),t.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),u.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()}),u.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()})}),b}var c,d,e={top:30,right:20,bottom:50,left:60},f=a.utils.defaultColor(),g=null,h=null,i=!0,j=null,k=function(a){return a.x},l=function(a){return a.y},m="monotone",n=!0,o=d3.scale.linear(),p=d3.scale.linear(),q=d3.scale.linear(),r=a.models.line().yScale(p),s=a.models.line().yScale(q),t=a.models.multiBar().stacked(!1).yScale(p),u=a.models.multiBar().stacked(!1).yScale(q),v=a.models.stackedArea().yScale(p),w=a.models.stackedArea().yScale(q),x=a.models.axis().scale(o).orient("bottom").tickPadding(5),y=a.models.axis().scale(p).orient("left"),z=a.models.axis().scale(q).orient("right"),A=a.models.legend().height(30),B=a.models.tooltip(),C=d3.dispatch();return b.dispatch=C,b.lines1=r,b.lines2=s,b.bars1=t,b.bars2=u,b.stack1=v,b.stack2=w,b.xAxis=x,b.yAxis1=y,b.yAxis2=z,b.tooltip=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},showLegend:{get:function(){return i},set:function(a){i=a}},yDomain1:{get:function(){return c},set:function(a){c=a}},yDomain2:{get:function(){return d},set:function(a){d=a}},noData:{get:function(){return j},set:function(a){j=a}},interpolate:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return B.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),B.enabled(!!b)}},tooltipContent:{get:function(){return B.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),B.contentGenerator(b)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return f},set:function(b){f=a.utils.getColor(b)}},x:{get:function(){return k},set:function(a){k=a,r.x(a),s.x(a),t.x(a),u.x(a),v.x(a),w.x(a)}},y:{get:function(){return l},set:function(a){l=a,r.y(a),s.y(a),v.y(a),w.y(a),t.y(a),u.y(a)}},useVoronoi:{get:function(){return n},set:function(a){n=a,r.useVoronoi(a),s.useVoronoi(a),v.useVoronoi(a),w.useVoronoi(a)}}}),a.utils.initOptions(b),b},a.models.ohlcBar=function(){"use strict";function b(y){return y.each(function(b){k=d3.select(this);var y=a.utils.availableWidth(h,k,g),A=a.utils.availableHeight(i,k,g);a.utils.initSVG(k);var B=y/b[0].values.length*.9;l.domain(c||d3.extent(b[0].values.map(n).concat(t))),l.range(v?e||[.5*y/b[0].values.length,y*(b[0].values.length-.5)/b[0].values.length]:e||[5+B/2,y-B/2-5]),m.domain(d||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(f||[A,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var C=d3.select(this).selectAll("g.nv-wrap.nv-ohlcBar").data([b[0].values]),D=C.enter().append("g").attr("class","nvd3 nv-wrap nv-ohlcBar"),E=D.append("defs"),F=D.append("g"),G=C.select("g");F.append("g").attr("class","nv-ticks"),C.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:j})}),E.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),C.select("#nv-chart-clip-path-"+j+" rect").attr("width",y).attr("height",A),G.attr("clip-path",w?"url(#nv-chart-clip-path-"+j+")":"");var H=C.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});H.exit().remove(),H.enter().append("path").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}).attr("d",function(a,b){return"m0,0l0,"+(m(p(a,b))-m(r(a,b)))+"l"+-B/2+",0l"+B/2+",0l0,"+(m(s(a,b))-m(p(a,b)))+"l0,"+(m(q(a,b))-m(s(a,b)))+"l"+B/2+",0l"+-B/2+",0z"}).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("fill",function(){return x[0]}).attr("stroke",function(){return x[0]}).attr("x",0).attr("y",function(a,b){return m(Math.max(0,o(a,b)))}).attr("height",function(a,b){return Math.abs(m(o(a,b))-m(0))}),H.attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}),d3.transition(H).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("d",function(a,c){var d=y/b[0].values.length*.9;return"m0,0l0,"+(m(p(a,c))-m(r(a,c)))+"l"+-d/2+",0l"+d/2+",0l0,"+(m(s(a,c))-m(p(a,c)))+"l0,"+(m(q(a,c))-m(s(a,c)))+"l"+d/2+",0l"+-d/2+",0z"})}),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,c){b.clearHighlights(),k.select(".nv-ohlcBar .nv-tick-0-"+a).classed("hover",c)},b.clearHighlights=function(){k.select(".nv-ohlcBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!=a.top?a.top:g.top,g.right=void 0!=a.right?a.right:g.right,g.bottom=void 0!=a.bottom?a.bottom:g.bottom,g.left=void 0!=a.left?a.left:g.left -}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.parallelCoordinates=function(){"use strict";function b(p){return p.each(function(b){function p(a){return F(h.map(function(b){if(isNaN(a[b])||isNaN(parseFloat(a[b]))){var c=g[b].domain(),d=g[b].range(),e=c[0]-(c[1]-c[0])/9;if(J.indexOf(b)<0){var h=d3.scale.linear().domain([e,c[1]]).range([x-12,d[1]]);g[b].brush.y(h),J.push(b)}return[f(b),g[b](e)]}return J.length>0?(D.style("display","inline"),E.style("display","inline")):(D.style("display","none"),E.style("display","none")),[f(b),g[b](a[b])]}))}function q(){var a=h.filter(function(a){return!g[a].brush.empty()}),b=a.map(function(a){return g[a].brush.extent()});k=[],a.forEach(function(a,c){k[c]={dimension:a,extent:b[c]}}),l=[],M.style("display",function(c){var d=a.every(function(a,d){return isNaN(c[a])&&b[d][0]==g[a].brush.y().domain()[0]?!0:b[d][0]<=c[a]&&c[a]<=b[d][1]});return d&&l.push(c),d?null:"none"}),o.brush({filters:k,active:l})}function r(a){m[a]=this.parentNode.__origin__=f(a),L.attr("visibility","hidden")}function s(a){m[a]=Math.min(w,Math.max(0,this.parentNode.__origin__+=d3.event.x)),M.attr("d",p),h.sort(function(a,b){return u(a)-u(b)}),f.domain(h),N.attr("transform",function(a){return"translate("+u(a)+")"})}function t(a){delete this.parentNode.__origin__,delete m[a],d3.select(this.parentNode).attr("transform","translate("+f(a)+")"),M.attr("d",p),L.attr("d",p).attr("visibility",null)}function u(a){var b=m[a];return null==b?f(a):b}var v=d3.select(this),w=a.utils.availableWidth(d,v,c),x=a.utils.availableHeight(e,v,c);a.utils.initSVG(v),l=b,f.rangePoints([0,w],1).domain(h);var y={};h.forEach(function(a){var c=d3.extent(b,function(b){return+b[a]});return y[a]=!1,void 0===c[0]&&(y[a]=!0,c[0]=0,c[1]=0),c[0]===c[1]&&(c[0]=c[0]-1,c[1]=c[1]+1),g[a]=d3.scale.linear().domain(c).range([.9*(x-12),0]),g[a].brush=d3.svg.brush().y(g[a]).on("brush",q),"name"!=a});var z=v.selectAll("g.nv-wrap.nv-parallelCoordinates").data([b]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-parallelCoordinates"),B=A.append("g"),C=z.select("g");B.append("g").attr("class","nv-parallelCoordinates background"),B.append("g").attr("class","nv-parallelCoordinates foreground"),B.append("g").attr("class","nv-parallelCoordinates missingValuesline"),z.attr("transform","translate("+c.left+","+c.top+")");var D,E,F=d3.svg.line().interpolate("cardinal").tension(n),G=d3.svg.axis().orient("left"),H=d3.behavior.drag().on("dragstart",r).on("drag",s).on("dragend",t),I=f.range()[1]-f.range()[0],J=[],K=[0+I/2,x-12,w-I/2,x-12];D=z.select(".missingValuesline").selectAll("line").data([K]),D.enter().append("line"),D.exit().remove(),D.attr("x1",function(a){return a[0]}).attr("y1",function(a){return a[1]}).attr("x2",function(a){return a[2]}).attr("y2",function(a){return a[3]}),E=z.select(".missingValuesline").selectAll("text").data(["undefined values"]),E.append("text").data(["undefined values"]),E.enter().append("text"),E.exit().remove(),E.attr("y",x).attr("x",w-92-I/2).text(function(a){return a});var L=z.select(".background").selectAll("path").data(b);L.enter().append("path"),L.exit().remove(),L.attr("d",p);var M=z.select(".foreground").selectAll("path").data(b);M.enter().append("path"),M.exit().remove(),M.attr("d",p).attr("stroke",j),M.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),o.elementMouseover({label:a.name,data:a.data,index:b,pos:[d3.mouse(this.parentNode)[0],d3.mouse(this.parentNode)[1]]})}),M.on("mouseout",function(a,b){d3.select(this).classed("hover",!1),o.elementMouseout({label:a.name,data:a.data,index:b})});var N=C.selectAll(".dimension").data(h),O=N.enter().append("g").attr("class","nv-parallelCoordinates dimension");O.append("g").attr("class","nv-parallelCoordinates nv-axis"),O.append("g").attr("class","nv-parallelCoordinates-brush"),O.append("text").attr("class","nv-parallelCoordinates nv-label"),N.attr("transform",function(a){return"translate("+f(a)+",0)"}),N.exit().remove(),N.select(".nv-label").style("cursor","move").attr("dy","-1em").attr("text-anchor","middle").text(String).on("mouseover",function(a){o.elementMouseover({dim:a,pos:[d3.mouse(this.parentNode.parentNode)[0],d3.mouse(this.parentNode.parentNode)[1]]})}).on("mouseout",function(a){o.elementMouseout({dim:a})}).call(H),N.select(".nv-axis").each(function(a,b){d3.select(this).call(G.scale(g[a]).tickFormat(d3.format(i[b])))}),N.select(".nv-parallelCoordinates-brush").each(function(a){d3.select(this).call(g[a].brush)}).selectAll("rect").attr("x",-8).attr("width",16)}),b}var c={top:30,right:0,bottom:10,left:0},d=null,e=null,f=d3.scale.ordinal(),g={},h=[],i=[],j=a.utils.defaultColor(),k=[],l=[],m=[],n=1,o=d3.dispatch("brush","elementMouseover","elementMouseout");return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},dimensionNames:{get:function(){return h},set:function(a){h=a}},dimensionFormats:{get:function(){return i},set:function(a){i=a}},lineTension:{get:function(){return n},set:function(a){n=a}},dimensions:{get:function(){return h},set:function(b){a.deprecated("dimensions","use dimensionNames instead"),h=b}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.pie=function(){"use strict";function b(E){return D.reset(),E.each(function(b){function E(a,b){a.endAngle=isNaN(a.endAngle)?0:a.endAngle,a.startAngle=isNaN(a.startAngle)?0:a.startAngle,p||(a.innerRadius=0);var c=d3.interpolate(this._current,a);return this._current=c(0),function(a){return B[b](c(a))}}var F=d-c.left-c.right,G=e-c.top-c.bottom,H=Math.min(F,G)/2,I=[],J=[];if(i=d3.select(this),0===z.length)for(var K=H-H/5,L=y*H,M=0;Mc)return"";if("function"==typeof n)d=n(a,b,{key:f(a.data),value:g(a.data),percent:k(c)});else switch(n){case"key":d=f(a.data);break;case"value":d=k(g(a.data));break;case"percent":d=d3.format("%")(c)}return d})}}),D.renderEnd("pie immediate"),b}var c={top:0,right:0,bottom:0,left:0},d=500,e=500,f=function(a){return a.x},g=function(a){return a.y},h=Math.floor(1e4*Math.random()),i=null,j=a.utils.defaultColor(),k=d3.format(",.2f"),l=!0,m=!1,n="key",o=.02,p=!1,q=!1,r=!0,s=0,t=!1,u=!1,v=!1,w=!1,x=0,y=.5,z=[],A=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),B=[],C=[],D=a.utils.renderWatch(A);return b.dispatch=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{arcsRadius:{get:function(){return z},set:function(a){z=a}},width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},showLabels:{get:function(){return l},set:function(a){l=a}},title:{get:function(){return q},set:function(a){q=a}},titleOffset:{get:function(){return s},set:function(a){s=a}},labelThreshold:{get:function(){return o},set:function(a){o=a}},valueFormat:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return h},set:function(a){h=a}},endAngle:{get:function(){return w},set:function(a){w=a}},startAngle:{get:function(){return u},set:function(a){u=a}},padAngle:{get:function(){return v},set:function(a){v=a}},cornerRadius:{get:function(){return x},set:function(a){x=a}},donutRatio:{get:function(){return y},set:function(a){y=a}},labelsOutside:{get:function(){return m},set:function(a){m=a}},labelSunbeamLayout:{get:function(){return t},set:function(a){t=a}},donut:{get:function(){return p},set:function(a){p=a}},growOnHover:{get:function(){return r},set:function(a){r=a}},pieLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("pieLabelsOutside","use labelsOutside instead")}},donutLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("donutLabelsOutside","use labelsOutside instead")}},labelFormat:{get:function(){return k},set:function(b){k=b,a.deprecated("labelFormat","use valueFormat instead")}},margin:{get:function(){return c},set:function(a){c.top="undefined"!=typeof a.top?a.top:c.top,c.right="undefined"!=typeof a.right?a.right:c.right,c.bottom="undefined"!=typeof a.bottom?a.bottom:c.bottom,c.left="undefined"!=typeof a.left?a.left:c.left}},y:{get:function(){return g},set:function(a){g=d3.functor(a)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},labelType:{get:function(){return n},set:function(a){n=a||"key"}}}),a.utils.initOptions(b),b},a.models.pieChart=function(){"use strict";function b(e){return q.reset(),q.models(c),e.each(function(e){var k=d3.select(this);a.utils.initSVG(k);var n=a.utils.availableWidth(g,k,f),o=a.utils.availableHeight(h,k,f);if(b.update=function(){k.transition().call(b)},b.container=this,l.setter(s(e),b.update).getter(r(e)).update(),l.disabled=e.map(function(a){return!!a.disabled}),!m){var q;m={};for(q in l)m[q]=l[q]instanceof Array?l[q].slice(0):l[q]}if(!e||!e.length)return a.utils.noData(b,k),b;k.selectAll(".nv-noData").remove();var t=k.selectAll("g.nv-wrap.nv-pieChart").data([e]),u=t.enter().append("g").attr("class","nvd3 nv-wrap nv-pieChart").append("g"),v=t.select("g");if(u.append("g").attr("class","nv-pieWrap"),u.append("g").attr("class","nv-legendWrap"),i)if("top"===j)d.width(n).key(c.x()),t.select(".nv-legendWrap").datum(e).call(d),f.top!=d.height()&&(f.top=d.height(),o=a.utils.availableHeight(h,k,f)),t.select(".nv-legendWrap").attr("transform","translate(0,"+-f.top+")");else if("right"===j){var w=a.models.legend().width();w>n/2&&(w=n/2),d.height(o).key(c.x()),d.width(w),n-=d.width(),t.select(".nv-legendWrap").datum(e).call(d).attr("transform","translate("+n+",0)")}t.attr("transform","translate("+f.left+","+f.top+")"),c.width(n).height(o);var x=v.select(".nv-pieWrap").datum([e]);d3.transition(x).call(c),d.dispatch.on("stateChange",function(a){for(var c in a)l[c]=a[c];p.stateChange(l),b.update()}),p.on("changeState",function(a){"undefined"!=typeof a.disabled&&(e.forEach(function(b,c){b.disabled=a.disabled[c]}),l.disabled=a.disabled),b.update()})}),q.renderEnd("pieChart immediate"),b}var c=a.models.pie(),d=a.models.legend(),e=a.models.tooltip(),f={top:30,right:20,bottom:20,left:20},g=null,h=null,i=!0,j="top",k=a.utils.defaultColor(),l=a.utils.state(),m=null,n=null,o=250,p=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd");e.headerEnabled(!1).duration(0).valueFormatter(function(a,b){return c.valueFormat()(a,b)});var q=a.utils.renderWatch(p),r=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},s=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},e.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){e.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){e.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.legend=d,b.dispatch=p,b.pie=c,b.tooltip=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return i},set:function(a){i=a}},legendPosition:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return e.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),e.enabled(!!b)}},tooltipContent:{get:function(){return e.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),e.contentGenerator(b)}},color:{get:function(){return k},set:function(a){k=a,d.color(k),c.color(k)}},duration:{get:function(){return o},set:function(a){o=a,q.reset(o)}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.scatter=function(){"use strict";function b(N){return P.reset(),N.each(function(b){function N(){if(O=!1,!w)return!1;if(M===!0){var a=d3.merge(b.map(function(a,b){return a.values.map(function(a,c){var d=p(a,c),e=q(a,c);return[m(d)+1e-4*Math.random(),n(e)+1e-4*Math.random(),b,c,a]}).filter(function(a,b){return x(a[4],b)})}));if(0==a.length)return!1;a.length<3&&(a.push([m.range()[0]-20,n.range()[0]-20,null,null]),a.push([m.range()[1]+20,n.range()[1]+20,null,null]),a.push([m.range()[0]-20,n.range()[0]+20,null,null]),a.push([m.range()[1]+20,n.range()[1]-20,null,null]));var c=d3.geom.polygon([[-10,-10],[-10,i+10],[h+10,i+10],[h+10,-10]]),d=d3.geom.voronoi(a).map(function(b,d){return{data:c.clip(b),series:a[d][2],point:a[d][3]}});U.select(".nv-point-paths").selectAll("path").remove();var e=U.select(".nv-point-paths").selectAll("path").data(d),f=e.enter().append("svg:path").attr("d",function(a){return a&&a.data&&0!==a.data.length?"M"+a.data.join(",")+"Z":"M 0 0"}).attr("id",function(a,b){return"nv-path-"+b}).attr("clip-path",function(a,b){return"url(#nv-clip-"+b+")"});C&&f.style("fill",d3.rgb(230,230,230)).style("fill-opacity",.4).style("stroke-opacity",1).style("stroke",d3.rgb(200,200,200)),B&&(U.select(".nv-point-clips").selectAll("clipPath").remove(),U.select(".nv-point-clips").selectAll("clipPath").data(a).enter().append("svg:clipPath").attr("id",function(a,b){return"nv-clip-"+b}).append("svg:circle").attr("cx",function(a){return a[0]}).attr("cy",function(a){return a[1]}).attr("r",D));var k=function(a,c){if(O)return 0;var d=b[a.series];if(void 0!==d){var e=d.values[a.point];e.color=j(d,a.series),e.x=p(e),e.y=q(e);var f=l.node().getBoundingClientRect(),h=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft,k={left:m(p(e,a.point))+f.left+i+g.left+10,top:n(q(e,a.point))+f.top+h+g.top+10};c({point:e,series:d,pos:k,seriesIndex:a.series,pointIndex:a.point})}};e.on("click",function(a){k(a,L.elementClick)}).on("dblclick",function(a){k(a,L.elementDblClick)}).on("mouseover",function(a){k(a,L.elementMouseover)}).on("mouseout",function(a){k(a,L.elementMouseout)})}else U.select(".nv-groups").selectAll(".nv-group").selectAll(".nv-point").on("click",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("dblclick",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementDblClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("mouseover",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseover({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c,color:j(a,c)})}).on("mouseout",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseout({point:e,series:d,seriesIndex:a.series,pointIndex:c,color:j(a,c)})})}l=d3.select(this);var R=a.utils.availableWidth(h,l,g),S=a.utils.availableHeight(i,l,g);a.utils.initSVG(l),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var T=E&&F&&I?[]:d3.merge(b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),size:r(a,b)}})}));m.domain(E||d3.extent(T.map(function(a){return a.x}).concat(t))),m.range(y&&b[0]?G||[(R*z+R)/(2*b[0].values.length),R-R*(1+z)/(2*b[0].values.length)]:G||[0,R]),n.domain(F||d3.extent(T.map(function(a){return a.y}).concat(u))).range(H||[S,0]),o.domain(I||d3.extent(T.map(function(a){return a.size}).concat(v))).range(J||Q),K=m.domain()[0]===m.domain()[1]||n.domain()[0]===n.domain()[1],m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]-.01*n.domain()[0],n.domain()[1]+.01*n.domain()[1]]:[-1,1]),isNaN(m.domain()[0])&&m.domain([-1,1]),isNaN(n.domain()[0])&&n.domain([-1,1]),c=c||m,d=d||n,e=e||o;var U=l.selectAll("g.nv-wrap.nv-scatter").data([b]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-scatter nv-chart-"+k),W=V.append("defs"),X=V.append("g"),Y=U.select("g");U.classed("nv-single-point",K),X.append("g").attr("class","nv-groups"),X.append("g").attr("class","nv-point-paths"),V.append("g").attr("class","nv-point-clips"),U.attr("transform","translate("+g.left+","+g.top+")"),W.append("clipPath").attr("id","nv-edge-clip-"+k).append("rect"),U.select("#nv-edge-clip-"+k+" rect").attr("width",R).attr("height",S>0?S:0),Y.attr("clip-path",A?"url(#nv-edge-clip-"+k+")":""),O=!0;var Z=U.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});Z.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),Z.exit().remove(),Z.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),Z.watchTransition(P,"scatter: groups").style("fill",function(a,b){return j(a,b)}).style("stroke",function(a,b){return j(a,b)}).style("stroke-opacity",1).style("fill-opacity",.5);var $=Z.selectAll("path.nv-point").data(function(a){return a.values.map(function(a,b){return[a,b]}).filter(function(a,b){return x(a[0],b)})});$.enter().append("path").style("fill",function(a){return a.color}).style("stroke",function(a){return a.color}).attr("transform",function(a){return"translate("+c(p(a[0],a[1]))+","+d(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),$.exit().remove(),Z.exit().selectAll("path.nv-point").watchTransition(P,"scatter exit").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).remove(),$.each(function(a){d3.select(this).classed("nv-point",!0).classed("nv-point-"+a[1],!0).classed("nv-noninteractive",!w).classed("hover",!1)}),$.watchTransition(P,"scatter points").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),clearTimeout(f),f=setTimeout(N,300),c=m.copy(),d=n.copy(),e=o.copy()}),P.renderEnd("scatter immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=a.utils.defaultColor(),k=Math.floor(1e5*Math.random()),l=null,m=d3.scale.linear(),n=d3.scale.linear(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=function(a){return a.size||1},s=function(a){return a.shape||"circle"},t=[],u=[],v=[],w=!0,x=function(a){return!a.notActive},y=!1,z=.1,A=!1,B=!0,C=!1,D=function(){return 25},E=null,F=null,G=null,H=null,I=null,J=null,K=!1,L=d3.dispatch("elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),M=!0,N=250,O=!1,P=a.utils.renderWatch(L,N),Q=[16,256];return b.dispatch=L,b.options=a.utils.optionsFunc.bind(b),b._calls=new function(){this.clearHighlights=function(){return a.dom.write(function(){l.selectAll(".nv-point.hover").classed("hover",!1)}),null},this.highlightPoint=function(b,c,d){a.dom.write(function(){l.select(" .nv-series-"+b+" .nv-point-"+c).classed("hover",d)})}},L.on("elementMouseover.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!0)}),L.on("elementMouseout.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!1)}),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},pointScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return E},set:function(a){E=a}},yDomain:{get:function(){return F},set:function(a){F=a}},pointDomain:{get:function(){return I},set:function(a){I=a}},xRange:{get:function(){return G},set:function(a){G=a}},yRange:{get:function(){return H},set:function(a){H=a}},pointRange:{get:function(){return J},set:function(a){J=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},forcePoint:{get:function(){return v},set:function(a){v=a}},interactive:{get:function(){return w},set:function(a){w=a}},pointActive:{get:function(){return x},set:function(a){x=a}},padDataOuter:{get:function(){return z},set:function(a){z=a}},padData:{get:function(){return y},set:function(a){y=a}},clipEdge:{get:function(){return A},set:function(a){A=a}},clipVoronoi:{get:function(){return B},set:function(a){B=a}},clipRadius:{get:function(){return D},set:function(a){D=a}},showVoronoi:{get:function(){return C},set:function(a){C=a}},id:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return p},set:function(a){p=d3.functor(a)}},y:{get:function(){return q},set:function(a){q=d3.functor(a)}},pointSize:{get:function(){return r},set:function(a){r=d3.functor(a)}},pointShape:{get:function(){return s},set:function(a){s=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},duration:{get:function(){return N},set:function(a){N=a,P.reset(N)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},useVoronoi:{get:function(){return M},set:function(a){M=a,M===!1&&(B=!1)}}}),a.utils.initOptions(b),b},a.models.scatterChart=function(){"use strict";function b(z){return D.reset(),D.models(c),t&&D.models(d),u&&D.models(e),q&&D.models(g),r&&D.models(h),z.each(function(z){m=d3.select(this),a.utils.initSVG(m);var G=a.utils.availableWidth(k,m,j),H=a.utils.availableHeight(l,m,j);if(b.update=function(){0===A?m.call(b):m.transition().duration(A).call(b)},b.container=this,w.setter(F(z),b.update).getter(E(z)).update(),w.disabled=z.map(function(a){return!!a.disabled}),!x){var I;x={};for(I in w)x[I]=w[I]instanceof Array?w[I].slice(0):w[I]}if(!(z&&z.length&&z.filter(function(a){return a.values.length}).length))return a.utils.noData(b,m),D.renderEnd("scatter immediate"),b;m.selectAll(".nv-noData").remove(),o=c.xScale(),p=c.yScale();var J=m.selectAll("g.nv-wrap.nv-scatterChart").data([z]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+c.id()),L=K.append("g"),M=J.select("g");if(L.append("rect").attr("class","nvd3 nv-background").style("pointer-events","none"),L.append("g").attr("class","nv-x nv-axis"),L.append("g").attr("class","nv-y nv-axis"),L.append("g").attr("class","nv-scatterWrap"),L.append("g").attr("class","nv-regressionLinesWrap"),L.append("g").attr("class","nv-distWrap"),L.append("g").attr("class","nv-legendWrap"),v&&M.select(".nv-y.nv-axis").attr("transform","translate("+G+",0)"),s){var N=G;f.width(N),J.select(".nv-legendWrap").datum(z).call(f),j.top!=f.height()&&(j.top=f.height(),H=a.utils.availableHeight(l,m,j)),J.select(".nv-legendWrap").attr("transform","translate(0,"+-j.top+")")}J.attr("transform","translate("+j.left+","+j.top+")"),c.width(G).height(H).color(z.map(function(a,b){return a.color=a.color||n(a,b),a.color}).filter(function(a,b){return!z[b].disabled})),J.select(".nv-scatterWrap").datum(z.filter(function(a){return!a.disabled})).call(c),J.select(".nv-regressionLinesWrap").attr("clip-path","url(#nv-edge-clip-"+c.id()+")");var O=J.select(".nv-regressionLinesWrap").selectAll(".nv-regLines").data(function(a){return a});O.enter().append("g").attr("class","nv-regLines");var P=O.selectAll(".nv-regLine").data(function(a){return[a]});P.enter().append("line").attr("class","nv-regLine").style("stroke-opacity",0),P.filter(function(a){return a.intercept&&a.slope}).watchTransition(D,"scatterPlusLineChart: regline").attr("x1",o.range()[0]).attr("x2",o.range()[1]).attr("y1",function(a){return p(o.domain()[0]*a.slope+a.intercept)}).attr("y2",function(a){return p(o.domain()[1]*a.slope+a.intercept)}).style("stroke",function(a,b,c){return n(a,c)}).style("stroke-opacity",function(a){return a.disabled||"undefined"==typeof a.slope||"undefined"==typeof a.intercept?0:1}),t&&(d.scale(o)._ticks(a.utils.calcTicksX(G/100,z)).tickSize(-H,0),M.select(".nv-x.nv-axis").attr("transform","translate(0,"+p.range()[0]+")").call(d)),u&&(e.scale(p)._ticks(a.utils.calcTicksY(H/36,z)).tickSize(-G,0),M.select(".nv-y.nv-axis").call(e)),q&&(g.getData(c.x()).scale(o).width(G).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),M.select(".nv-distributionX").attr("transform","translate(0,"+p.range()[0]+")").datum(z.filter(function(a){return!a.disabled})).call(g)),r&&(h.getData(c.y()).scale(p).width(H).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),M.select(".nv-distributionY").attr("transform","translate("+(v?G:-h.size())+",0)").datum(z.filter(function(a){return!a.disabled})).call(h)),f.dispatch.on("stateChange",function(a){for(var c in a)w[c]=a[c];y.stateChange(w),b.update()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&(z.forEach(function(b,c){b.disabled=a.disabled[c]}),w.disabled=a.disabled),b.update()}),c.dispatch.on("elementMouseout.tooltip",function(a){i.hidden(!0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",h.size())}),c.dispatch.on("elementMouseover.tooltip",function(a){m.select(".nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",a.pos.top-H-j.top),m.select(".nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",a.pos.left+g.size()-j.left),i.position(a.pos).data(a).hidden(!1)}),B=o.copy(),C=p.copy()}),D.renderEnd("scatter with line immediate"),b}var c=a.models.scatter(),d=a.models.axis(),e=a.models.axis(),f=a.models.legend(),g=a.models.distribution(),h=a.models.distribution(),i=a.models.tooltip(),j={top:30,right:20,bottom:50,left:75},k=null,l=null,m=null,n=a.utils.defaultColor(),o=c.xScale(),p=c.yScale(),q=!1,r=!1,s=!0,t=!0,u=!0,v=!1,w=a.utils.state(),x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=null,A=250;c.xScale(o).yScale(p),d.orient("bottom").tickPadding(10),e.orient(v?"right":"left").tickPadding(10),g.axis("x"),h.axis("y"),i.headerFormatter(function(a,b){return d.tickFormat()(a,b)}).valueFormatter(function(a,b){return e.tickFormat()(a,b)});var B,C,D=a.utils.renderWatch(y,A),E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return b.dispatch=y,b.scatter=c,b.legend=f,b.xAxis=d,b.yAxis=e,b.distX=g,b.distY=h,b.tooltip=i,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},container:{get:function(){return m},set:function(a){m=a}},showDistX:{get:function(){return q},set:function(a){q=a}},showDistY:{get:function(){return r},set:function(a){r=a}},showLegend:{get:function(){return s},set:function(a){s=a}},showXAxis:{get:function(){return t},set:function(a){t=a}},showYAxis:{get:function(){return u},set:function(a){u=a}},defaultState:{get:function(){return x},set:function(a){x=a}},noData:{get:function(){return z},set:function(a){z=a}},duration:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return i.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),i.enabled(!!b) -}},tooltipContent:{get:function(){return i.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),i.contentGenerator(b)}},tooltipXContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},tooltipYContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},rightAlignYAxis:{get:function(){return v},set:function(a){v=a,e.orient(a?"right":"left")}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),f.color(n),g.color(n),h.color(n)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.sparkline=function(){"use strict";function b(k){return k.each(function(b){var k=h-g.left-g.right,q=i-g.top-g.bottom;j=d3.select(this),a.utils.initSVG(j),l.domain(c||d3.extent(b,n)).range(e||[0,k]),m.domain(d||d3.extent(b,o)).range(f||[q,0]);{var r=j.selectAll("g.nv-wrap.nv-sparkline").data([b]),s=r.enter().append("g").attr("class","nvd3 nv-wrap nv-sparkline");s.append("g"),r.select("g")}r.attr("transform","translate("+g.left+","+g.top+")");var t=r.selectAll("path").data(function(a){return[a]});t.enter().append("path"),t.exit().remove(),t.style("stroke",function(a,b){return a.color||p(a,b)}).attr("d",d3.svg.line().x(function(a,b){return l(n(a,b))}).y(function(a,b){return m(o(a,b))}));var u=r.selectAll("circle.nv-point").data(function(a){function b(b){if(-1!=b){var c=a[b];return c.pointIndex=b,c}return null}var c=a.map(function(a,b){return o(a,b)}),d=b(c.lastIndexOf(m.domain()[1])),e=b(c.indexOf(m.domain()[0])),f=b(c.length-1);return[e,d,f].filter(function(a){return null!=a})});u.enter().append("circle"),u.exit().remove(),u.attr("cx",function(a){return l(n(a,a.pointIndex))}).attr("cy",function(a){return m(o(a,a.pointIndex))}).attr("r",2).attr("class",function(a){return n(a,a.pointIndex)==l.domain()[1]?"nv-point nv-currentValue":o(a,a.pointIndex)==m.domain()[0]?"nv-point nv-minValue":"nv-point nv-maxValue"})}),b}var c,d,e,f,g={top:2,right:0,bottom:2,left:0},h=400,i=32,j=null,k=!0,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=a.utils.getColor(["#000"]);return b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},animate:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return n},set:function(a){n=d3.functor(a)}},y:{get:function(){return o},set:function(a){o=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sparklinePlus=function(){"use strict";function b(p){return p.each(function(p){function q(){if(!j){var a=z.selectAll(".nv-hoverValue").data(i),b=a.enter().append("g").attr("class","nv-hoverValue").style("stroke-opacity",0).style("fill-opacity",0);a.exit().transition().duration(250).style("stroke-opacity",0).style("fill-opacity",0).remove(),a.attr("transform",function(a){return"translate("+c(e.x()(p[a],a))+",0)"}).transition().duration(250).style("stroke-opacity",1).style("fill-opacity",1),i.length&&(b.append("line").attr("x1",0).attr("y1",-f.top).attr("x2",0).attr("y2",u),b.append("text").attr("class","nv-xValue").attr("x",-6).attr("y",-f.top).attr("text-anchor","end").attr("dy",".9em"),z.select(".nv-hoverValue .nv-xValue").text(k(e.x()(p[i[0]],i[0]))),b.append("text").attr("class","nv-yValue").attr("x",6).attr("y",-f.top).attr("text-anchor","start").attr("dy",".9em"),z.select(".nv-hoverValue .nv-yValue").text(l(e.y()(p[i[0]],i[0]))))}}function r(){function a(a,b){for(var c=Math.abs(e.x()(a[0],0)-b),d=0,f=0;fc;++c){for(b=0,d=0;bb;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=0}for(c=0;f>c;++c)g[c]=0;return g}}),u.renderEnd("stackedArea immediate"),b}var c,d,e={top:0,right:0,bottom:0,left:0},f=960,g=500,h=a.utils.defaultColor(),i=Math.floor(1e5*Math.random()),j=null,k=function(a){return a.x},l=function(a){return a.y},m="stack",n="zero",o="default",p="linear",q=!1,r=a.models.scatter(),s=250,t=d3.dispatch("areaClick","areaMouseover","areaMouseout","renderEnd","elementClick","elementMouseover","elementMouseout");r.pointSize(2.2).pointDomain([2.2,2.2]);var u=a.utils.renderWatch(t,s);return b.dispatch=t,b.scatter=r,r.dispatch.on("elementClick",function(){t.elementClick.apply(this,arguments)}),r.dispatch.on("elementMouseover",function(){t.elementMouseover.apply(this,arguments)}),r.dispatch.on("elementMouseout",function(){t.elementMouseout.apply(this,arguments)}),b.interpolate=function(a){return arguments.length?(p=a,b):p},b.duration=function(a){return arguments.length?(s=a,u.reset(s),r.duration(s),b):s},b.dispatch=t,b.scatter=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return f},set:function(a){f=a}},height:{get:function(){return g},set:function(a){g=a}},clipEdge:{get:function(){return q},set:function(a){q=a}},offset:{get:function(){return n},set:function(a){n=a}},order:{get:function(){return o},set:function(a){o=a}},interpolate:{get:function(){return p},set:function(a){p=a}},x:{get:function(){return k},set:function(a){k=d3.functor(a)}},y:{get:function(){return l},set:function(a){l=d3.functor(a)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}},style:{get:function(){return m},set:function(a){switch(m=a){case"stack":b.offset("zero"),b.order("default");break;case"stream":b.offset("wiggle"),b.order("inside-out");break;case"stream-center":b.offset("silhouette"),b.order("inside-out");break;case"expand":b.offset("expand"),b.order("default");break;case"stack_percent":b.offset(b.d3_stackedOffset_stackPercent),b.order("default")}}},duration:{get:function(){return s},set:function(a){s=a,u.reset(s),r.duration(s)}}}),a.utils.inheritOptions(b,r),a.utils.initOptions(b),b},a.models.stackedAreaChart=function(){"use strict";function b(k){return F.reset(),F.models(e),r&&F.models(f),s&&F.models(g),k.each(function(k){var x=d3.select(this),F=this;a.utils.initSVG(x);var K=a.utils.availableWidth(m,x,l),L=a.utils.availableHeight(n,x,l);if(b.update=function(){x.transition().duration(C).call(b)},b.container=this,v.setter(I(k),b.update).getter(H(k)).update(),v.disabled=k.map(function(a){return!!a.disabled}),!w){var M;w={};for(M in v)w[M]=v[M]instanceof Array?v[M].slice(0):v[M]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(b,x),b;x.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var N=x.selectAll("g.nv-wrap.nv-stackedAreaChart").data([k]),O=N.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedAreaChart").append("g"),P=N.select("g");if(O.append("rect").style("opacity",0),O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y nv-axis"),O.append("g").attr("class","nv-stackedWrap"),O.append("g").attr("class","nv-legendWrap"),O.append("g").attr("class","nv-controlsWrap"),O.append("g").attr("class","nv-interactive"),P.select("rect").attr("width",K).attr("height",L),q){var Q=p?K-z:K;h.width(Q),P.select(".nv-legendWrap").datum(k).call(h),l.top!=h.height()&&(l.top=h.height(),L=a.utils.availableHeight(n,x,l)),P.select(".nv-legendWrap").attr("transform","translate("+(K-Q)+","+-l.top+")")}if(p){var R=[{key:B.stacked||"Stacked",metaKey:"Stacked",disabled:"stack"!=e.style(),style:"stack"},{key:B.stream||"Stream",metaKey:"Stream",disabled:"stream"!=e.style(),style:"stream"},{key:B.expanded||"Expanded",metaKey:"Expanded",disabled:"expand"!=e.style(),style:"expand"},{key:B.stack_percent||"Stack %",metaKey:"Stack_Percent",disabled:"stack_percent"!=e.style(),style:"stack_percent"}];z=A.length/3*260,R=R.filter(function(a){return-1!==A.indexOf(a.metaKey)}),i.width(z).color(["#444","#444","#444"]),P.select(".nv-controlsWrap").datum(R).call(i),l.top!=Math.max(i.height(),h.height())&&(l.top=Math.max(i.height(),h.height()),L=a.utils.availableHeight(n,x,l)),P.select(".nv-controlsWrap").attr("transform","translate(0,"+-l.top+")")}N.attr("transform","translate("+l.left+","+l.top+")"),t&&P.select(".nv-y.nv-axis").attr("transform","translate("+K+",0)"),u&&(j.width(K).height(L).margin({left:l.left,top:l.top}).svgContainer(x).xScale(c),N.select(".nv-interactive").call(j)),e.width(K).height(L);var S=P.select(".nv-stackedWrap").datum(k);if(S.transition().call(e),r&&(f.scale(c)._ticks(a.utils.calcTicksX(K/100,k)).tickSize(-L,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+L+")"),P.select(".nv-x.nv-axis").transition().duration(0).call(f)),s){var T;if(T="wiggle"===e.offset()?0:a.utils.calcTicksY(L/36,k),g.scale(d)._ticks(T).tickSize(-K,0),"expand"===e.style()||"stack_percent"===e.style()){var U=g.tickFormat();D&&U===J||(D=U),g.tickFormat(J)}else D&&(g.tickFormat(D),D=null);P.select(".nv-y.nv-axis").transition().duration(0).call(g)}e.dispatch.on("areaClick.toggle",function(a){k.forEach(1===k.filter(function(a){return!a.disabled}).length?function(a){a.disabled=!1}:function(b,c){b.disabled=c!=a.seriesIndex}),v.disabled=k.map(function(a){return!!a.disabled}),y.stateChange(v),b.update()}),h.dispatch.on("stateChange",function(a){for(var c in a)v[c]=a[c];y.stateChange(v),b.update()}),i.dispatch.on("legendClick",function(a){a.disabled&&(R=R.map(function(a){return a.disabled=!0,a}),a.disabled=!1,e.style(a.style),v.style=e.style(),y.stateChange(v),b.update())}),j.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,g,h,i=[];if(k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,j){g=a.interactiveBisect(f.values,c.pointXValue,b.x());var k=f.values[g],l=b.y()(k,g);if(null!=l&&e.highlightPoint(j,g,!0),"undefined"!=typeof k){"undefined"==typeof d&&(d=k),"undefined"==typeof h&&(h=b.xScale()(b.x()(k,g)));var m="expand"==e.style()?k.display.y:b.y()(k,g);i.push({key:f.key,value:m,color:o(f,f.seriesIndex),stackedValue:k.display})}}),i.reverse(),i.length>2){var m=b.yScale().invert(c.mouseY),n=null;i.forEach(function(a,b){m=Math.abs(m);var c=Math.abs(a.stackedValue.y0),d=Math.abs(a.stackedValue.y);return m>=c&&d+c>=m?void(n=b):void 0}),null!=n&&(i[n].highlight=!0)}var p=f.tickFormat()(b.x()(d,g)),q=j.tooltip.valueFormatter();"expand"===e.style()||"stack_percent"===e.style()?(E||(E=q),q=d3.format(".1%")):E&&(q=E,E=null),j.tooltip.position({left:h+l.left,top:c.mouseY+l.top}).chartContainer(F.parentNode).valueFormatter(q).data({value:p,series:i})(),j.renderGuideLine(h)}),j.dispatch.on("elementMouseout",function(){e.clearHighlights()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&k.length===a.disabled.length&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),v.disabled=a.disabled),"undefined"!=typeof a.style&&(e.style(a.style),G=a.style),b.update()})}),F.renderEnd("stacked Area chart immediate"),b}var c,d,e=a.models.stackedArea(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:25,bottom:50,left:60},m=null,n=null,o=a.utils.defaultColor(),p=!0,q=!0,r=!0,s=!0,t=!1,u=!1,v=a.utils.state(),w=null,x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=250,A=["Stacked","Stream","Expanded"],B={},C=250;v.style=e.style(),f.orient("bottom").tickPadding(7),g.orient(t?"right":"left"),k.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)}),j.tooltip.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)});var D=null,E=null;i.updateState(!1);var F=a.utils.renderWatch(y),G=e.style(),H=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),style:e.style()}}},I=function(a){return function(b){void 0!==b.style&&(G=b.style),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},J=d3.format("%");return e.dispatch.on("elementMouseover.tooltip",function(a){a.point.x=e.x()(a.point),a.point.y=e.y()(a.point),k.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),b.dispatch=y,b.stacked=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.interactiveLayer=j,b.tooltip=k,b.dispatch=y,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return w},set:function(a){w=a}},noData:{get:function(){return x},set:function(a){x=a}},showControls:{get:function(){return p},set:function(a){p=a}},controlLabels:{get:function(){return B},set:function(a){B=a}},controlOptions:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},duration:{get:function(){return C},set:function(a){C=a,F.reset(C),e.duration(C),f.duration(C),g.duration(C)}},color:{get:function(){return o},set:function(b){o=a.utils.getColor(b),h.color(o),e.color(o)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},useInteractiveGuideline:{get:function(){return u},set:function(a){u=!!a,b.interactive(!a),b.useVoronoi(!a),e.scatter.interactive(!a)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.sunburst=function(){"use strict";function b(u){return t.reset(),u.each(function(b){function t(a){a.x0=a.x,a.dx0=a.dx}function u(a){var b=d3.interpolate(p.domain(),[a.x,a.x+a.dx]),c=d3.interpolate(q.domain(),[a.y,1]),d=d3.interpolate(q.range(),[a.y?20:0,y]);return function(a,e){return e?function(){return s(a)}:function(e){return p.domain(b(e)),q.domain(c(e)).range(d(e)),s(a)}}}l=d3.select(this);var v,w=a.utils.availableWidth(g,l,f),x=a.utils.availableHeight(h,l,f),y=Math.min(w,x)/2;a.utils.initSVG(l);var z=l.selectAll(".nv-wrap.nv-sunburst").data(b),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburst nv-chart-"+k),B=A.selectAll("nv-sunburst");z.attr("transform","translate("+w/2+","+x/2+")"),l.on("click",function(a,b){o.chartClick({data:a,index:b,pos:d3.event,id:k})}),q.range([0,y]),c=c||b,e=b[0],r.value(j[i]||j.count),v=B.data(r.nodes).enter().append("path").attr("d",s).style("fill",function(a){return m((a.children?a:a.parent).name)}).style("stroke","#FFF").on("click",function(a){d!==c&&c!==a&&(d=c),c=a,v.transition().duration(n).attrTween("d",u(a))}).each(t).on("dblclick",function(a){d.parent==a&&v.transition().duration(n).attrTween("d",u(e))}).each(t).on("mouseover",function(a){d3.select(this).classed("hover",!0).style("opacity",.8),o.elementMouseover({data:a,color:d3.select(this).style("fill")})}).on("mouseout",function(a){d3.select(this).classed("hover",!1).style("opacity",1),o.elementMouseout({data:a})}).on("mousemove",function(a){o.elementMousemove({data:a})})}),t.renderEnd("sunburst immediate"),b}var c,d,e,f={top:0,right:0,bottom:0,left:0},g=null,h=null,i="count",j={count:function(){return 1},size:function(a){return a.size}},k=Math.floor(1e4*Math.random()),l=null,m=a.utils.defaultColor(),n=500,o=d3.dispatch("chartClick","elementClick","elementDblClick","elementMousemove","elementMouseover","elementMouseout","renderEnd"),p=d3.scale.linear().range([0,2*Math.PI]),q=d3.scale.sqrt(),r=d3.layout.partition().sort(null).value(function(){return 1}),s=d3.svg.arc().startAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x)))}).endAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x+a.dx)))}).innerRadius(function(a){return Math.max(0,q(a.y))}).outerRadius(function(a){return Math.max(0,q(a.y+a.dy))}),t=a.utils.renderWatch(o);return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},mode:{get:function(){return i},set:function(a){i=a}},id:{get:function(){return k},set:function(a){k=a}},duration:{get:function(){return n},set:function(a){n=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!=a.top?a.top:f.top,f.right=void 0!=a.right?a.right:f.right,f.bottom=void 0!=a.bottom?a.bottom:f.bottom,f.left=void 0!=a.left?a.left:f.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sunburstChart=function(){"use strict";function b(d){return m.reset(),m.models(c),d.each(function(d){var h=d3.select(this);a.utils.initSVG(h);var i=a.utils.availableWidth(f,h,e),j=a.utils.availableHeight(g,h,e);if(b.update=function(){0===k?h.call(b):h.transition().duration(k).call(b)},b.container=this,!d||!d.length)return a.utils.noData(b,h),b;h.selectAll(".nv-noData").remove();var l=h.selectAll("g.nv-wrap.nv-sunburstChart").data(d),m=l.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburstChart").append("g"),n=l.select("g");m.append("g").attr("class","nv-sunburstWrap"),l.attr("transform","translate("+e.left+","+e.top+")"),c.width(i).height(j);var o=n.select(".nv-sunburstWrap").datum(d);d3.transition(o).call(c)}),m.renderEnd("sunburstChart immediate"),b}var c=a.models.sunburst(),d=a.models.tooltip(),e={top:30,right:20,bottom:20,left:20},f=null,g=null,h=a.utils.defaultColor(),i=(Math.round(1e5*Math.random()),null),j=null,k=250,l=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),m=a.utils.renderWatch(l);return d.headerEnabled(!1).duration(0).valueFormatter(function(a){return a}),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.data.name,value:a.data.size,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=l,b.sunburst=c,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return i},set:function(a){i=a}},color:{get:function(){return h},set:function(a){h=a,c.color(h)}},duration:{get:function(){return k},set:function(a){k=a,m.reset(k),c.duration(k)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.version="1.8.1"}(); \ No newline at end of file diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js deleted file mode 100644 index 36c2aeb..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/* - Copyright (C) Federico Zivolo 2019 - Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). - */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); -//# sourceMappingURL=popper.min.js.map diff --git a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist b/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist deleted file mode 100644 index d8890ed..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist +++ /dev/null @@ -1,11 +0,0 @@ - - {{name}} - {{methods_bar}} -
{{methods_tested_percent}}
-
{{methods_number}}
- {{crap}} - {{lines_bar}} -
{{lines_executed_percent}}
-
{{lines_number}}
- - diff --git a/vendor/phpunit/php-code-coverage/src/Report/PHP.php b/vendor/phpunit/php-code-coverage/src/Report/PHP.php deleted file mode 100644 index 73e2f4d..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/PHP.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\RuntimeException; - -/** - * Uses var_export() to write a SebastianBergmann\CodeCoverage\CodeCoverage object to a file. - */ -final class PHP -{ - /** - * @throws \SebastianBergmann\CodeCoverage\RuntimeException - */ - public function process(CodeCoverage $coverage, ?string $target = null): string - { - $filter = $coverage->filter(); - - $buffer = \sprintf( - 'setData(%s); -$coverage->setTests(%s); - -$filter = $coverage->filter(); -$filter->setWhitelistedFiles(%s); - -return $coverage;', - \var_export($coverage->getData(true), true), - \var_export($coverage->getTests(), true), - \var_export($filter->getWhitelistedFiles(), true) - ); - - if ($target !== null) { - if (!$this->createDirectory(\dirname($target))) { - throw new \RuntimeException(\sprintf('Directory "%s" was not created', \dirname($target))); - } - - if (@\file_put_contents($target, $buffer) === false) { - throw new RuntimeException( - \sprintf( - 'Could not write to "%s', - $target - ) - ); - } - } - - return $buffer; - } - - private function createDirectory(string $directory): bool - { - return !(!\is_dir($directory) && !@\mkdir($directory, 0777, true) && !\is_dir($directory)); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Text.php b/vendor/phpunit/php-code-coverage/src/Report/Text.php deleted file mode 100644 index 9593a22..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Text.php +++ /dev/null @@ -1,283 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Node\File; -use SebastianBergmann\CodeCoverage\Util; - -/** - * Generates human readable output from a code coverage object. - * - * The output gets put into a text file our written to the CLI. - */ -final class Text -{ - /** - * @var string - */ - private const COLOR_GREEN = "\x1b[30;42m"; - - /** - * @var string - */ - private const COLOR_YELLOW = "\x1b[30;43m"; - - /** - * @var string - */ - private const COLOR_RED = "\x1b[37;41m"; - - /** - * @var string - */ - private const COLOR_HEADER = "\x1b[1;37;40m"; - - /** - * @var string - */ - private const COLOR_RESET = "\x1b[0m"; - - /** - * @var string - */ - private const COLOR_EOL = "\x1b[2K"; - - /** - * @var int - */ - private $lowUpperBound; - - /** - * @var int - */ - private $highLowerBound; - - /** - * @var bool - */ - private $showUncoveredFiles; - - /** - * @var bool - */ - private $showOnlySummary; - - public function __construct(int $lowUpperBound = 50, int $highLowerBound = 90, bool $showUncoveredFiles = false, bool $showOnlySummary = false) - { - $this->lowUpperBound = $lowUpperBound; - $this->highLowerBound = $highLowerBound; - $this->showUncoveredFiles = $showUncoveredFiles; - $this->showOnlySummary = $showOnlySummary; - } - - public function process(CodeCoverage $coverage, bool $showColors = false): string - { - $output = \PHP_EOL . \PHP_EOL; - $report = $coverage->getReport(); - - $colors = [ - 'header' => '', - 'classes' => '', - 'methods' => '', - 'lines' => '', - 'reset' => '', - 'eol' => '', - ]; - - if ($showColors) { - $colors['classes'] = $this->getCoverageColor( - $report->getNumTestedClassesAndTraits(), - $report->getNumClassesAndTraits() - ); - - $colors['methods'] = $this->getCoverageColor( - $report->getNumTestedMethods(), - $report->getNumMethods() - ); - - $colors['lines'] = $this->getCoverageColor( - $report->getNumExecutedLines(), - $report->getNumExecutableLines() - ); - - $colors['reset'] = self::COLOR_RESET; - $colors['header'] = self::COLOR_HEADER; - $colors['eol'] = self::COLOR_EOL; - } - - $classes = \sprintf( - ' Classes: %6s (%d/%d)', - Util::percent( - $report->getNumTestedClassesAndTraits(), - $report->getNumClassesAndTraits(), - true - ), - $report->getNumTestedClassesAndTraits(), - $report->getNumClassesAndTraits() - ); - - $methods = \sprintf( - ' Methods: %6s (%d/%d)', - Util::percent( - $report->getNumTestedMethods(), - $report->getNumMethods(), - true - ), - $report->getNumTestedMethods(), - $report->getNumMethods() - ); - - $lines = \sprintf( - ' Lines: %6s (%d/%d)', - Util::percent( - $report->getNumExecutedLines(), - $report->getNumExecutableLines(), - true - ), - $report->getNumExecutedLines(), - $report->getNumExecutableLines() - ); - - $padding = \max(\array_map('strlen', [$classes, $methods, $lines])); - - if ($this->showOnlySummary) { - $title = 'Code Coverage Report Summary:'; - $padding = \max($padding, \strlen($title)); - - $output .= $this->format($colors['header'], $padding, $title); - } else { - $date = \date(' Y-m-d H:i:s', $_SERVER['REQUEST_TIME']); - $title = 'Code Coverage Report:'; - - $output .= $this->format($colors['header'], $padding, $title); - $output .= $this->format($colors['header'], $padding, $date); - $output .= $this->format($colors['header'], $padding, ''); - $output .= $this->format($colors['header'], $padding, ' Summary:'); - } - - $output .= $this->format($colors['classes'], $padding, $classes); - $output .= $this->format($colors['methods'], $padding, $methods); - $output .= $this->format($colors['lines'], $padding, $lines); - - if ($this->showOnlySummary) { - return $output . \PHP_EOL; - } - - $classCoverage = []; - - foreach ($report as $item) { - if (!$item instanceof File) { - continue; - } - - $classes = $item->getClassesAndTraits(); - - foreach ($classes as $className => $class) { - $classStatements = 0; - $coveredClassStatements = 0; - $coveredMethods = 0; - $classMethods = 0; - - foreach ($class['methods'] as $method) { - if ($method['executableLines'] == 0) { - continue; - } - - $classMethods++; - $classStatements += $method['executableLines']; - $coveredClassStatements += $method['executedLines']; - - if ($method['coverage'] == 100) { - $coveredMethods++; - } - } - - $namespace = ''; - - if (!empty($class['package']['namespace'])) { - $namespace = '\\' . $class['package']['namespace'] . '::'; - } elseif (!empty($class['package']['fullPackage'])) { - $namespace = '@' . $class['package']['fullPackage'] . '::'; - } - - $classCoverage[$namespace . $className] = [ - 'namespace' => $namespace, - 'className ' => $className, - 'methodsCovered' => $coveredMethods, - 'methodCount' => $classMethods, - 'statementsCovered' => $coveredClassStatements, - 'statementCount' => $classStatements, - ]; - } - } - - \ksort($classCoverage); - - $methodColor = ''; - $linesColor = ''; - $resetColor = ''; - - foreach ($classCoverage as $fullQualifiedPath => $classInfo) { - if ($this->showUncoveredFiles || $classInfo['statementsCovered'] != 0) { - if ($showColors) { - $methodColor = $this->getCoverageColor($classInfo['methodsCovered'], $classInfo['methodCount']); - $linesColor = $this->getCoverageColor($classInfo['statementsCovered'], $classInfo['statementCount']); - $resetColor = $colors['reset']; - } - - $output .= \PHP_EOL . $fullQualifiedPath . \PHP_EOL - . ' ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' ' - . ' ' . $linesColor . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor; - } - } - - return $output . \PHP_EOL; - } - - private function getCoverageColor(int $numberOfCoveredElements, int $totalNumberOfElements): string - { - $coverage = Util::percent( - $numberOfCoveredElements, - $totalNumberOfElements - ); - - if ($coverage >= $this->highLowerBound) { - return self::COLOR_GREEN; - } - - if ($coverage > $this->lowUpperBound) { - return self::COLOR_YELLOW; - } - - return self::COLOR_RED; - } - - private function printCoverageCounts(int $numberOfCoveredElements, int $totalNumberOfElements, int $precision): string - { - $format = '%' . $precision . 's'; - - return Util::percent( - $numberOfCoveredElements, - $totalNumberOfElements, - true, - true - ) . - ' (' . \sprintf($format, $numberOfCoveredElements) . '/' . - \sprintf($format, $totalNumberOfElements) . ')'; - } - - private function format($color, $padding, $string): string - { - $reset = $color ? self::COLOR_RESET : ''; - - return $color . \str_pad($string, $padding) . $reset . \PHP_EOL; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php deleted file mode 100644 index c12a5d2..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use SebastianBergmann\Environment\Runtime; - -final class BuildInformation -{ - /** - * @var \DOMElement - */ - private $contextNode; - - public function __construct(\DOMElement $contextNode) - { - $this->contextNode = $contextNode; - } - - public function setRuntimeInformation(Runtime $runtime): void - { - $runtimeNode = $this->getNodeByName('runtime'); - - $runtimeNode->setAttribute('name', $runtime->getName()); - $runtimeNode->setAttribute('version', $runtime->getVersion()); - $runtimeNode->setAttribute('url', $runtime->getVendorUrl()); - - $driverNode = $this->getNodeByName('driver'); - - if ($runtime->hasPHPDBGCodeCoverage()) { - $driverNode->setAttribute('name', 'phpdbg'); - $driverNode->setAttribute('version', \constant('PHPDBG_VERSION')); - } - - if ($runtime->hasXdebug()) { - $driverNode->setAttribute('name', 'xdebug'); - $driverNode->setAttribute('version', \phpversion('xdebug')); - } - - if ($runtime->hasPCOV()) { - $driverNode->setAttribute('name', 'pcov'); - $driverNode->setAttribute('version', \phpversion('pcov')); - } - } - - public function setBuildTime(\DateTime $date): void - { - $this->contextNode->setAttribute('time', $date->format('D M j G:i:s T Y')); - } - - public function setGeneratorVersions(string $phpUnitVersion, string $coverageVersion): void - { - $this->contextNode->setAttribute('phpunit', $phpUnitVersion); - $this->contextNode->setAttribute('coverage', $coverageVersion); - } - - private function getNodeByName(string $name): \DOMElement - { - $node = $this->contextNode->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - $name - )->item(0); - - if (!$node) { - $node = $this->contextNode->appendChild( - $this->contextNode->ownerDocument->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - $name - ) - ); - } - - return $node; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php deleted file mode 100644 index 996a619..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use SebastianBergmann\CodeCoverage\RuntimeException; - -final class Coverage -{ - /** - * @var \XMLWriter - */ - private $writer; - - /** - * @var \DOMElement - */ - private $contextNode; - - /** - * @var bool - */ - private $finalized = false; - - public function __construct(\DOMElement $context, string $line) - { - $this->contextNode = $context; - - $this->writer = new \XMLWriter(); - $this->writer->openMemory(); - $this->writer->startElementNS(null, $context->nodeName, 'https://schema.phpunit.de/coverage/1.0'); - $this->writer->writeAttribute('nr', $line); - } - - /** - * @throws RuntimeException - */ - public function addTest(string $test): void - { - if ($this->finalized) { - throw new RuntimeException('Coverage Report already finalized'); - } - - $this->writer->startElement('covered'); - $this->writer->writeAttribute('by', $test); - $this->writer->endElement(); - } - - public function finalize(): void - { - $this->writer->endElement(); - - $fragment = $this->contextNode->ownerDocument->createDocumentFragment(); - $fragment->appendXML($this->writer->outputMemory()); - - $this->contextNode->parentNode->replaceChild( - $fragment, - $this->contextNode - ); - - $this->finalized = true; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php deleted file mode 100644 index b182321..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -final class Directory extends Node -{ -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php deleted file mode 100644 index c908a15..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php +++ /dev/null @@ -1,287 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Node\AbstractNode; -use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; -use SebastianBergmann\CodeCoverage\Node\File as FileNode; -use SebastianBergmann\CodeCoverage\RuntimeException; -use SebastianBergmann\CodeCoverage\Version; -use SebastianBergmann\Environment\Runtime; - -final class Facade -{ - /** - * @var string - */ - private $target; - - /** - * @var Project - */ - private $project; - - /** - * @var string - */ - private $phpUnitVersion; - - public function __construct(string $version) - { - $this->phpUnitVersion = $version; - } - - /** - * @throws RuntimeException - */ - public function process(CodeCoverage $coverage, string $target): void - { - if (\substr($target, -1, 1) !== \DIRECTORY_SEPARATOR) { - $target .= \DIRECTORY_SEPARATOR; - } - - $this->target = $target; - $this->initTargetDirectory($target); - - $report = $coverage->getReport(); - - $this->project = new Project( - $coverage->getReport()->getName() - ); - - $this->setBuildInformation(); - $this->processTests($coverage->getTests()); - $this->processDirectory($report, $this->project); - - $this->saveDocument($this->project->asDom(), 'index'); - } - - private function setBuildInformation(): void - { - $buildNode = $this->project->getBuildInformation(); - $buildNode->setRuntimeInformation(new Runtime()); - $buildNode->setBuildTime(\DateTime::createFromFormat('U', (string) $_SERVER['REQUEST_TIME'])); - $buildNode->setGeneratorVersions($this->phpUnitVersion, Version::id()); - } - - /** - * @throws RuntimeException - */ - private function initTargetDirectory(string $directory): void - { - if (\file_exists($directory)) { - if (!\is_dir($directory)) { - throw new RuntimeException( - "'$directory' exists but is not a directory." - ); - } - - if (!\is_writable($directory)) { - throw new RuntimeException( - "'$directory' exists but is not writable." - ); - } - } elseif (!$this->createDirectory($directory)) { - throw new RuntimeException( - "'$directory' could not be created." - ); - } - } - - private function processDirectory(DirectoryNode $directory, Node $context): void - { - $directoryName = $directory->getName(); - - if ($this->project->getProjectSourceDirectory() === $directoryName) { - $directoryName = '/'; - } - - $directoryObject = $context->addDirectory($directoryName); - - $this->setTotals($directory, $directoryObject->getTotals()); - - foreach ($directory->getDirectories() as $node) { - $this->processDirectory($node, $directoryObject); - } - - foreach ($directory->getFiles() as $node) { - $this->processFile($node, $directoryObject); - } - } - - /** - * @throws RuntimeException - */ - private function processFile(FileNode $file, Directory $context): void - { - $fileObject = $context->addFile( - $file->getName(), - $file->getId() . '.xml' - ); - - $this->setTotals($file, $fileObject->getTotals()); - - $path = \substr( - $file->getPath(), - \strlen($this->project->getProjectSourceDirectory()) - ); - - $fileReport = new Report($path); - - $this->setTotals($file, $fileReport->getTotals()); - - foreach ($file->getClassesAndTraits() as $unit) { - $this->processUnit($unit, $fileReport); - } - - foreach ($file->getFunctions() as $function) { - $this->processFunction($function, $fileReport); - } - - foreach ($file->getCoverageData() as $line => $tests) { - if (!\is_array($tests) || \count($tests) === 0) { - continue; - } - - $coverage = $fileReport->getLineCoverage((string) $line); - - foreach ($tests as $test) { - $coverage->addTest($test); - } - - $coverage->finalize(); - } - - $fileReport->getSource()->setSourceCode( - \file_get_contents($file->getPath()) - ); - - $this->saveDocument($fileReport->asDom(), $file->getId()); - } - - private function processUnit(array $unit, Report $report): void - { - if (isset($unit['className'])) { - $unitObject = $report->getClassObject($unit['className']); - } else { - $unitObject = $report->getTraitObject($unit['traitName']); - } - - $unitObject->setLines( - $unit['startLine'], - $unit['executableLines'], - $unit['executedLines'] - ); - - $unitObject->setCrap((float) $unit['crap']); - - $unitObject->setPackage( - $unit['package']['fullPackage'], - $unit['package']['package'], - $unit['package']['subpackage'], - $unit['package']['category'] - ); - - $unitObject->setNamespace($unit['package']['namespace']); - - foreach ($unit['methods'] as $method) { - $methodObject = $unitObject->addMethod($method['methodName']); - $methodObject->setSignature($method['signature']); - $methodObject->setLines((string) $method['startLine'], (string) $method['endLine']); - $methodObject->setCrap($method['crap']); - $methodObject->setTotals( - (string) $method['executableLines'], - (string) $method['executedLines'], - (string) $method['coverage'] - ); - } - } - - private function processFunction(array $function, Report $report): void - { - $functionObject = $report->getFunctionObject($function['functionName']); - - $functionObject->setSignature($function['signature']); - $functionObject->setLines((string) $function['startLine']); - $functionObject->setCrap($function['crap']); - $functionObject->setTotals((string) $function['executableLines'], (string) $function['executedLines'], (string) $function['coverage']); - } - - private function processTests(array $tests): void - { - $testsObject = $this->project->getTests(); - - foreach ($tests as $test => $result) { - if ($test === 'UNCOVERED_FILES_FROM_WHITELIST') { - continue; - } - - $testsObject->addTest($test, $result); - } - } - - private function setTotals(AbstractNode $node, Totals $totals): void - { - $loc = $node->getLinesOfCode(); - - $totals->setNumLines( - $loc['loc'], - $loc['cloc'], - $loc['ncloc'], - $node->getNumExecutableLines(), - $node->getNumExecutedLines() - ); - - $totals->setNumClasses( - $node->getNumClasses(), - $node->getNumTestedClasses() - ); - - $totals->setNumTraits( - $node->getNumTraits(), - $node->getNumTestedTraits() - ); - - $totals->setNumMethods( - $node->getNumMethods(), - $node->getNumTestedMethods() - ); - - $totals->setNumFunctions( - $node->getNumFunctions(), - $node->getNumTestedFunctions() - ); - } - - private function getTargetDirectory(): string - { - return $this->target; - } - - /** - * @throws RuntimeException - */ - private function saveDocument(\DOMDocument $document, string $name): void - { - $filename = \sprintf('%s/%s.xml', $this->getTargetDirectory(), $name); - - $document->formatOutput = true; - $document->preserveWhiteSpace = false; - $this->initTargetDirectory(\dirname($filename)); - - $document->save($filename); - } - - private function createDirectory(string $directory): bool - { - return !(!\is_dir($directory) && !@\mkdir($directory, 0777, true) && !\is_dir($directory)); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php deleted file mode 100644 index 02af644..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -class File -{ - /** - * @var \DOMDocument - */ - private $dom; - - /** - * @var \DOMElement - */ - private $contextNode; - - public function __construct(\DOMElement $context) - { - $this->dom = $context->ownerDocument; - $this->contextNode = $context; - } - - public function getTotals(): Totals - { - $totalsContainer = $this->contextNode->firstChild; - - if (!$totalsContainer) { - $totalsContainer = $this->contextNode->appendChild( - $this->dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'totals' - ) - ); - } - - return new Totals($totalsContainer); - } - - public function getLineCoverage(string $line): Coverage - { - $coverage = $this->contextNode->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'coverage' - )->item(0); - - if (!$coverage) { - $coverage = $this->contextNode->appendChild( - $this->dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'coverage' - ) - ); - } - - $lineNode = $coverage->appendChild( - $this->dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'line' - ) - ); - - return new Coverage($lineNode, $line); - } - - protected function getContextNode(): \DOMElement - { - return $this->contextNode; - } - - protected function getDomDocument(): \DOMDocument - { - return $this->dom; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php deleted file mode 100644 index b6a7f16..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -final class Method -{ - /** - * @var \DOMElement - */ - private $contextNode; - - public function __construct(\DOMElement $context, string $name) - { - $this->contextNode = $context; - - $this->setName($name); - } - - public function setSignature(string $signature): void - { - $this->contextNode->setAttribute('signature', $signature); - } - - public function setLines(string $start, ?string $end = null): void - { - $this->contextNode->setAttribute('start', $start); - - if ($end !== null) { - $this->contextNode->setAttribute('end', $end); - } - } - - public function setTotals(string $executable, string $executed, string $coverage): void - { - $this->contextNode->setAttribute('executable', $executable); - $this->contextNode->setAttribute('executed', $executed); - $this->contextNode->setAttribute('coverage', $coverage); - } - - public function setCrap(string $crap): void - { - $this->contextNode->setAttribute('crap', $crap); - } - - private function setName(string $name): void - { - $this->contextNode->setAttribute('name', $name); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php deleted file mode 100644 index d3ba223..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -abstract class Node -{ - /** - * @var \DOMDocument - */ - private $dom; - - /** - * @var \DOMElement - */ - private $contextNode; - - public function __construct(\DOMElement $context) - { - $this->setContextNode($context); - } - - public function getDom(): \DOMDocument - { - return $this->dom; - } - - public function getTotals(): Totals - { - $totalsContainer = $this->getContextNode()->firstChild; - - if (!$totalsContainer) { - $totalsContainer = $this->getContextNode()->appendChild( - $this->dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'totals' - ) - ); - } - - return new Totals($totalsContainer); - } - - public function addDirectory(string $name): Directory - { - $dirNode = $this->getDom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'directory' - ); - - $dirNode->setAttribute('name', $name); - $this->getContextNode()->appendChild($dirNode); - - return new Directory($dirNode); - } - - public function addFile(string $name, string $href): File - { - $fileNode = $this->getDom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'file' - ); - - $fileNode->setAttribute('name', $name); - $fileNode->setAttribute('href', $href); - $this->getContextNode()->appendChild($fileNode); - - return new File($fileNode); - } - - protected function setContextNode(\DOMElement $context): void - { - $this->dom = $context->ownerDocument; - $this->contextNode = $context; - } - - protected function getContextNode(): \DOMElement - { - return $this->contextNode; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php deleted file mode 100644 index 5f32852..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -final class Project extends Node -{ - public function __construct(string $directory) - { - $this->init(); - $this->setProjectSourceDirectory($directory); - } - - public function getProjectSourceDirectory(): string - { - return $this->getContextNode()->getAttribute('source'); - } - - public function getBuildInformation(): BuildInformation - { - $buildNode = $this->getDom()->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'build' - )->item(0); - - if (!$buildNode) { - $buildNode = $this->getDom()->documentElement->appendChild( - $this->getDom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'build' - ) - ); - } - - return new BuildInformation($buildNode); - } - - public function getTests(): Tests - { - $testsNode = $this->getContextNode()->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'tests' - )->item(0); - - if (!$testsNode) { - $testsNode = $this->getContextNode()->appendChild( - $this->getDom()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'tests' - ) - ); - } - - return new Tests($testsNode); - } - - public function asDom(): \DOMDocument - { - return $this->getDom(); - } - - private function init(): void - { - $dom = new \DOMDocument; - $dom->loadXML(''); - - $this->setContextNode( - $dom->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'project' - )->item(0) - ); - } - - private function setProjectSourceDirectory(string $name): void - { - $this->getContextNode()->setAttribute('source', $name); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php deleted file mode 100644 index 6ec94c1..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -final class Report extends File -{ - public function __construct(string $name) - { - $dom = new \DOMDocument(); - $dom->loadXML(''); - - $contextNode = $dom->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'file' - )->item(0); - - parent::__construct($contextNode); - - $this->setName($name); - } - - public function asDom(): \DOMDocument - { - return $this->getDomDocument(); - } - - public function getFunctionObject($name): Method - { - $node = $this->getContextNode()->appendChild( - $this->getDomDocument()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'function' - ) - ); - - return new Method($node, $name); - } - - public function getClassObject($name): Unit - { - return $this->getUnitObject('class', $name); - } - - public function getTraitObject($name): Unit - { - return $this->getUnitObject('trait', $name); - } - - public function getSource(): Source - { - $source = $this->getContextNode()->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'source' - )->item(0); - - if (!$source) { - $source = $this->getContextNode()->appendChild( - $this->getDomDocument()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'source' - ) - ); - } - - return new Source($source); - } - - private function setName($name): void - { - $this->getContextNode()->setAttribute('name', \basename($name)); - $this->getContextNode()->setAttribute('path', \dirname($name)); - } - - private function getUnitObject($tagName, $name): Unit - { - $node = $this->getContextNode()->appendChild( - $this->getDomDocument()->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - $tagName - ) - ); - - return new Unit($node, $name); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php deleted file mode 100644 index 67bf9cb..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use TheSeer\Tokenizer\NamespaceUri; -use TheSeer\Tokenizer\Tokenizer; -use TheSeer\Tokenizer\XMLSerializer; - -final class Source -{ - /** @var \DOMElement */ - private $context; - - public function __construct(\DOMElement $context) - { - $this->context = $context; - } - - public function setSourceCode(string $source): void - { - $context = $this->context; - - $tokens = (new Tokenizer())->parse($source); - $srcDom = (new XMLSerializer(new NamespaceUri($context->namespaceURI)))->toDom($tokens); - - $context->parentNode->replaceChild( - $context->ownerDocument->importNode($srcDom->documentElement, true), - $context - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php deleted file mode 100644 index c1bcd25..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -final class Tests -{ - private $contextNode; - - private $codeMap = [ - -1 => 'UNKNOWN', // PHPUnit_Runner_BaseTestRunner::STATUS_UNKNOWN - 0 => 'PASSED', // PHPUnit_Runner_BaseTestRunner::STATUS_PASSED - 1 => 'SKIPPED', // PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED - 2 => 'INCOMPLETE', // PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE - 3 => 'FAILURE', // PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE - 4 => 'ERROR', // PHPUnit_Runner_BaseTestRunner::STATUS_ERROR - 5 => 'RISKY', // PHPUnit_Runner_BaseTestRunner::STATUS_RISKY - 6 => 'WARNING', // PHPUnit_Runner_BaseTestRunner::STATUS_WARNING - ]; - - public function __construct(\DOMElement $context) - { - $this->contextNode = $context; - } - - public function addTest(string $test, array $result): void - { - $node = $this->contextNode->appendChild( - $this->contextNode->ownerDocument->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'test' - ) - ); - - $node->setAttribute('name', $test); - $node->setAttribute('size', $result['size']); - $node->setAttribute('result', (string) $result['status']); - $node->setAttribute('status', $this->codeMap[(int) $result['status']]); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php deleted file mode 100644 index 019f348..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php +++ /dev/null @@ -1,140 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use SebastianBergmann\CodeCoverage\Util; - -final class Totals -{ - /** - * @var \DOMNode - */ - private $container; - - /** - * @var \DOMElement - */ - private $linesNode; - - /** - * @var \DOMElement - */ - private $methodsNode; - - /** - * @var \DOMElement - */ - private $functionsNode; - - /** - * @var \DOMElement - */ - private $classesNode; - - /** - * @var \DOMElement - */ - private $traitsNode; - - public function __construct(\DOMElement $container) - { - $this->container = $container; - $dom = $container->ownerDocument; - - $this->linesNode = $dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'lines' - ); - - $this->methodsNode = $dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'methods' - ); - - $this->functionsNode = $dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'functions' - ); - - $this->classesNode = $dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'classes' - ); - - $this->traitsNode = $dom->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'traits' - ); - - $container->appendChild($this->linesNode); - $container->appendChild($this->methodsNode); - $container->appendChild($this->functionsNode); - $container->appendChild($this->classesNode); - $container->appendChild($this->traitsNode); - } - - public function getContainer(): \DOMNode - { - return $this->container; - } - - public function setNumLines(int $loc, int $cloc, int $ncloc, int $executable, int $executed): void - { - $this->linesNode->setAttribute('total', (string) $loc); - $this->linesNode->setAttribute('comments', (string) $cloc); - $this->linesNode->setAttribute('code', (string) $ncloc); - $this->linesNode->setAttribute('executable', (string) $executable); - $this->linesNode->setAttribute('executed', (string) $executed); - $this->linesNode->setAttribute( - 'percent', - $executable === 0 ? '0' : \sprintf('%01.2F', Util::percent($executed, $executable)) - ); - } - - public function setNumClasses(int $count, int $tested): void - { - $this->classesNode->setAttribute('count', (string) $count); - $this->classesNode->setAttribute('tested', (string) $tested); - $this->classesNode->setAttribute( - 'percent', - $count === 0 ? '0' : \sprintf('%01.2F', Util::percent($tested, $count)) - ); - } - - public function setNumTraits(int $count, int $tested): void - { - $this->traitsNode->setAttribute('count', (string) $count); - $this->traitsNode->setAttribute('tested', (string) $tested); - $this->traitsNode->setAttribute( - 'percent', - $count === 0 ? '0' : \sprintf('%01.2F', Util::percent($tested, $count)) - ); - } - - public function setNumMethods(int $count, int $tested): void - { - $this->methodsNode->setAttribute('count', (string) $count); - $this->methodsNode->setAttribute('tested', (string) $tested); - $this->methodsNode->setAttribute( - 'percent', - $count === 0 ? '0' : \sprintf('%01.2F', Util::percent($tested, $count)) - ); - } - - public function setNumFunctions(int $count, int $tested): void - { - $this->functionsNode->setAttribute('count', (string) $count); - $this->functionsNode->setAttribute('tested', (string) $tested); - $this->functionsNode->setAttribute( - 'percent', - $count === 0 ? '0' : \sprintf('%01.2F', Util::percent($tested, $count)) - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php b/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php deleted file mode 100644 index c235dfb..0000000 --- a/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -final class Unit -{ - /** - * @var \DOMElement - */ - private $contextNode; - - public function __construct(\DOMElement $context, string $name) - { - $this->contextNode = $context; - - $this->setName($name); - } - - public function setLines(int $start, int $executable, int $executed): void - { - $this->contextNode->setAttribute('start', (string) $start); - $this->contextNode->setAttribute('executable', (string) $executable); - $this->contextNode->setAttribute('executed', (string) $executed); - } - - public function setCrap(float $crap): void - { - $this->contextNode->setAttribute('crap', (string) $crap); - } - - public function setPackage(string $full, string $package, string $sub, string $category): void - { - $node = $this->contextNode->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'package' - )->item(0); - - if (!$node) { - $node = $this->contextNode->appendChild( - $this->contextNode->ownerDocument->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'package' - ) - ); - } - - $node->setAttribute('full', $full); - $node->setAttribute('name', $package); - $node->setAttribute('sub', $sub); - $node->setAttribute('category', $category); - } - - public function setNamespace(string $namespace): void - { - $node = $this->contextNode->getElementsByTagNameNS( - 'https://schema.phpunit.de/coverage/1.0', - 'namespace' - )->item(0); - - if (!$node) { - $node = $this->contextNode->appendChild( - $this->contextNode->ownerDocument->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'namespace' - ) - ); - } - - $node->setAttribute('name', $namespace); - } - - public function addMethod(string $name): Method - { - $node = $this->contextNode->appendChild( - $this->contextNode->ownerDocument->createElementNS( - 'https://schema.phpunit.de/coverage/1.0', - 'method' - ) - ); - - return new Method($node, $name); - } - - private function setName(string $name): void - { - $this->contextNode->setAttribute('name', $name); - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Util.php b/vendor/phpunit/php-code-coverage/src/Util.php deleted file mode 100644 index ee8894c..0000000 --- a/vendor/phpunit/php-code-coverage/src/Util.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -/** - * Utility methods. - */ -final class Util -{ - /** - * @return float|int|string - */ - public static function percent(float $a, float $b, bool $asString = false, bool $fixedWidth = false) - { - if ($asString && $b == 0) { - return ''; - } - - $percent = 100; - - if ($b > 0) { - $percent = ($a / $b) * 100; - } - - if ($asString) { - $format = $fixedWidth ? '%6.2F%%' : '%01.2F%%'; - - return \sprintf($format, $percent); - } - - return $percent; - } -} diff --git a/vendor/phpunit/php-code-coverage/src/Version.php b/vendor/phpunit/php-code-coverage/src/Version.php deleted file mode 100644 index bcf232d..0000000 --- a/vendor/phpunit/php-code-coverage/src/Version.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use SebastianBergmann\Version as VersionId; - -final class Version -{ - /** - * @var string - */ - private static $version; - - public static function id(): string - { - if (self::$version === null) { - $version = new VersionId('7.0.10', \dirname(__DIR__)); - self::$version = $version->getVersion(); - } - - return self::$version; - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/TestCase.php b/vendor/phpunit/php-code-coverage/tests/TestCase.php deleted file mode 100644 index 6a9824e..0000000 --- a/vendor/phpunit/php-code-coverage/tests/TestCase.php +++ /dev/null @@ -1,395 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace SebastianBergmann\CodeCoverage; - -use SebastianBergmann\CodeCoverage\Driver\Driver; -use SebastianBergmann\CodeCoverage\Report\Xml\Coverage; - -abstract class TestCase extends \PHPUnit\Framework\TestCase -{ - protected static $TEST_TMP_PATH; - - public static function setUpBeforeClass(): void - { - self::$TEST_TMP_PATH = TEST_FILES_PATH . 'tmp'; - } - - protected function getXdebugDataForBankAccount() - { - return [ - [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 8 => 1, - 9 => -2, - 13 => -1, - 14 => -1, - 15 => -1, - 16 => -1, - 18 => -1, - 22 => -1, - 24 => -1, - 25 => -2, - 29 => -1, - 31 => -1, - 32 => -2 - ] - ], - [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 8 => 1, - 13 => 1, - 16 => 1, - 29 => 1, - ] - ], - [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 8 => 1, - 13 => 1, - 16 => 1, - 22 => 1, - ] - ], - [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 8 => 1, - 13 => 1, - 14 => 1, - 15 => 1, - 18 => 1, - 22 => 1, - 24 => 1, - 29 => 1, - 31 => 1, - ] - ] - ]; - } - - protected function getCoverageForBankAccount(): CodeCoverage - { - $data = $this->getXdebugDataForBankAccount(); - - $stub = $this->createMock(Driver::class); - - $stub->expects($this->any()) - ->method('stop') - ->will($this->onConsecutiveCalls( - $data[0], - $data[1], - $data[2], - $data[3] - )); - - $filter = new Filter; - $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); - - $coverage = new CodeCoverage($stub, $filter); - - $coverage->start( - new \BankAccountTest('testBalanceIsInitiallyZero'), - true - ); - - $coverage->stop( - true, - [TEST_FILES_PATH . 'BankAccount.php' => range(6, 9)] - ); - - $coverage->start( - new \BankAccountTest('testBalanceCannotBecomeNegative') - ); - - $coverage->stop( - true, - [TEST_FILES_PATH . 'BankAccount.php' => range(27, 32)] - ); - - $coverage->start( - new \BankAccountTest('testBalanceCannotBecomeNegative2') - ); - - $coverage->stop( - true, - [TEST_FILES_PATH . 'BankAccount.php' => range(20, 25)] - ); - - $coverage->start( - new \BankAccountTest('testDepositWithdrawMoney') - ); - - $coverage->stop( - true, - [ - TEST_FILES_PATH . 'BankAccount.php' => array_merge( - range(6, 9), - range(20, 25), - range(27, 32) - ) - ] - ); - - return $coverage; - } - - protected function getCoverageForBankAccountForFirstTwoTests(): CodeCoverage - { - $data = $this->getXdebugDataForBankAccount(); - - $stub = $this->createMock(Driver::class); - - $stub->expects($this->any()) - ->method('stop') - ->will($this->onConsecutiveCalls( - $data[0], - $data[1] - )); - - $filter = new Filter; - $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); - - $coverage = new CodeCoverage($stub, $filter); - - $coverage->start( - new \BankAccountTest('testBalanceIsInitiallyZero'), - true - ); - - $coverage->stop( - true, - [TEST_FILES_PATH . 'BankAccount.php' => range(6, 9)] - ); - - $coverage->start( - new \BankAccountTest('testBalanceCannotBecomeNegative') - ); - - $coverage->stop( - true, - [TEST_FILES_PATH . 'BankAccount.php' => range(27, 32)] - ); - - return $coverage; - } - - protected function getCoverageForBankAccountForLastTwoTests() - { - $data = $this->getXdebugDataForBankAccount(); - - $stub = $this->createMock(Driver::class); - - $stub->expects($this->any()) - ->method('stop') - ->will($this->onConsecutiveCalls( - $data[2], - $data[3] - )); - - $filter = new Filter; - $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); - - $coverage = new CodeCoverage($stub, $filter); - - $coverage->start( - new \BankAccountTest('testBalanceCannotBecomeNegative2') - ); - - $coverage->stop( - true, - [TEST_FILES_PATH . 'BankAccount.php' => range(20, 25)] - ); - - $coverage->start( - new \BankAccountTest('testDepositWithdrawMoney') - ); - - $coverage->stop( - true, - [ - TEST_FILES_PATH . 'BankAccount.php' => array_merge( - range(6, 9), - range(20, 25), - range(27, 32) - ) - ] - ); - - return $coverage; - } - - protected function getExpectedDataArrayForBankAccount(): array - { - return [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 8 => [ - 0 => 'BankAccountTest::testBalanceIsInitiallyZero', - 1 => 'BankAccountTest::testDepositWithdrawMoney' - ], - 9 => null, - 13 => [], - 14 => [], - 15 => [], - 16 => [], - 18 => [], - 22 => [ - 0 => 'BankAccountTest::testBalanceCannotBecomeNegative2', - 1 => 'BankAccountTest::testDepositWithdrawMoney' - ], - 24 => [ - 0 => 'BankAccountTest::testDepositWithdrawMoney', - ], - 25 => null, - 29 => [ - 0 => 'BankAccountTest::testBalanceCannotBecomeNegative', - 1 => 'BankAccountTest::testDepositWithdrawMoney' - ], - 31 => [ - 0 => 'BankAccountTest::testDepositWithdrawMoney' - ], - 32 => null - ] - ]; - } - - protected function getExpectedDataArrayForBankAccountInReverseOrder(): array - { - return [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 8 => [ - 0 => 'BankAccountTest::testDepositWithdrawMoney', - 1 => 'BankAccountTest::testBalanceIsInitiallyZero' - ], - 9 => null, - 13 => [], - 14 => [], - 15 => [], - 16 => [], - 18 => [], - 22 => [ - 0 => 'BankAccountTest::testBalanceCannotBecomeNegative2', - 1 => 'BankAccountTest::testDepositWithdrawMoney' - ], - 24 => [ - 0 => 'BankAccountTest::testDepositWithdrawMoney', - ], - 25 => null, - 29 => [ - 0 => 'BankAccountTest::testDepositWithdrawMoney', - 1 => 'BankAccountTest::testBalanceCannotBecomeNegative' - ], - 31 => [ - 0 => 'BankAccountTest::testDepositWithdrawMoney' - ], - 32 => null - ] - ]; - } - - protected function getCoverageForFileWithIgnoredLines(): CodeCoverage - { - $filter = new Filter; - $filter->addFileToWhitelist(TEST_FILES_PATH . 'source_with_ignore.php'); - - $coverage = new CodeCoverage( - $this->setUpXdebugStubForFileWithIgnoredLines(), - $filter - ); - - $coverage->start('FileWithIgnoredLines', true); - $coverage->stop(); - - return $coverage; - } - - protected function setUpXdebugStubForFileWithIgnoredLines(): Driver - { - $stub = $this->createMock(Driver::class); - - $stub->expects($this->any()) - ->method('stop') - ->will($this->returnValue( - [ - TEST_FILES_PATH . 'source_with_ignore.php' => [ - 2 => 1, - 4 => -1, - 6 => -1, - 7 => 1 - ] - ] - )); - - return $stub; - } - - protected function getCoverageForClassWithAnonymousFunction(): CodeCoverage - { - $filter = new Filter; - $filter->addFileToWhitelist(TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php'); - - $coverage = new CodeCoverage( - $this->setUpXdebugStubForClassWithAnonymousFunction(), - $filter - ); - - $coverage->start('ClassWithAnonymousFunction', true); - $coverage->stop(); - - return $coverage; - } - - protected function setUpXdebugStubForClassWithAnonymousFunction(): Driver - { - $stub = $this->createMock(Driver::class); - - $stub->expects($this->any()) - ->method('stop') - ->will($this->returnValue( - [ - TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php' => [ - 7 => 1, - 9 => 1, - 10 => -1, - 11 => 1, - 12 => 1, - 13 => 1, - 14 => 1, - 17 => 1, - 18 => 1 - ] - ] - )); - - return $stub; - } - - protected function getCoverageForCrashParsing(): CodeCoverage - { - $filter = new Filter; - $filter->addFileToWhitelist(TEST_FILES_PATH . 'Crash.php'); - - // This is a file with invalid syntax, so it isn't executed. - return new CodeCoverage( - $this->setUpXdebugStubForCrashParsing(), - $filter - ); - } - - protected function setUpXdebugStubForCrashParsing(): Driver - { - $stub = $this->createMock(Driver::class); - - $stub->expects($this->any()) - ->method('stop') - ->will($this->returnValue([])); - return $stub; - } - -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-clover.xml b/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-clover.xml deleted file mode 100644 index 2f11d81..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-clover.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-crap4j.xml b/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-crap4j.xml deleted file mode 100644 index f2f56ea..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-crap4j.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - BankAccount - %s - - Method Crap Stats - 4 - 0 - 0 - 9 - 0 - - - - global - BankAccount - getBalance - getBalance() - getBalance() - 1 - 1 - 100 - 0 - - - global - BankAccount - setBalance - setBalance($balance) - setBalance($balance) - 6 - 2 - 0 - 0 - - - global - BankAccount - depositMoney - depositMoney($balance) - depositMoney($balance) - 1 - 1 - 100 - 0 - - - global - BankAccount - withdrawMoney - withdrawMoney($balance) - withdrawMoney($balance) - 1 - 1 - 100 - 0 - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-text.txt b/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-text.txt deleted file mode 100644 index 892d834..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-text.txt +++ /dev/null @@ -1,12 +0,0 @@ - - -Code Coverage Report: - %s - - Summary: - Classes: 0.00% (0/1) - Methods: 75.00% (3/4) - Lines: 50.00% (5/10) - -BankAccount - Methods: 75.00% ( 3/ 4) Lines: 50.00% ( 5/ 10) diff --git a/vendor/phpunit/php-code-coverage/tests/_files/BankAccount.php b/vendor/phpunit/php-code-coverage/tests/_files/BankAccount.php deleted file mode 100644 index 4238c15..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/BankAccount.php +++ /dev/null @@ -1,33 +0,0 @@ -balance; - } - - protected function setBalance($balance) - { - if ($balance >= 0) { - $this->balance = $balance; - } else { - throw new RuntimeException; - } - } - - public function depositMoney($balance) - { - $this->setBalance($this->getBalance() + $balance); - - return $this->getBalance(); - } - - public function withdrawMoney($balance) - { - $this->setBalance($this->getBalance() - $balance); - - return $this->getBalance(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/BankAccountTest.php b/vendor/phpunit/php-code-coverage/tests/_files/BankAccountTest.php deleted file mode 100644 index 803c892..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/BankAccountTest.php +++ /dev/null @@ -1,66 +0,0 @@ -ba = new BankAccount; - } - - /** - * @covers BankAccount::getBalance - */ - public function testBalanceIsInitiallyZero() - { - $this->assertEquals(0, $this->ba->getBalance()); - } - - /** - * @covers BankAccount::withdrawMoney - */ - public function testBalanceCannotBecomeNegative() - { - try { - $this->ba->withdrawMoney(1); - } catch (RuntimeException $e) { - $this->assertEquals(0, $this->ba->getBalance()); - - return; - } - - $this->fail(); - } - - /** - * @covers BankAccount::depositMoney - */ - public function testBalanceCannotBecomeNegative2() - { - try { - $this->ba->depositMoney(-1); - } catch (RuntimeException $e) { - $this->assertEquals(0, $this->ba->getBalance()); - - return; - } - - $this->fail(); - } - - /** - * @covers BankAccount::getBalance - * @covers BankAccount::depositMoney - * @covers BankAccount::withdrawMoney - */ - public function testDepositWithdrawMoney() - { - $this->assertEquals(0, $this->ba->getBalance()); - $this->ba->depositMoney(1); - $this->assertEquals(1, $this->ba->getBalance()); - $this->ba->withdrawMoney(1); - $this->assertEquals(0, $this->ba->getBalance()); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassExtendedTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassExtendedTest.php deleted file mode 100644 index e6d496e..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassExtendedTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassTest.php deleted file mode 100644 index baa04d8..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassTest.php +++ /dev/null @@ -1,14 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesTest.php deleted file mode 100644 index 560e381..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesTest.php +++ /dev/null @@ -1,13 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesTest.php deleted file mode 100644 index b624ed9..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesTest.php +++ /dev/null @@ -1,14 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesWhitespaceTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesWhitespaceTest.php deleted file mode 100644 index 20d2e75..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesWhitespaceTest.php +++ /dev/null @@ -1,14 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodTest.php deleted file mode 100644 index fb7a882..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodTest.php +++ /dev/null @@ -1,14 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageNoneTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageNoneTest.php deleted file mode 100644 index d8d9cae..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageNoneTest.php +++ /dev/null @@ -1,11 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPrivateTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPrivateTest.php deleted file mode 100644 index e98efd8..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPrivateTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotProtectedTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotProtectedTest.php deleted file mode 100644 index 7c9c488..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotProtectedTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPublicTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPublicTest.php deleted file mode 100644 index 202724a..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPublicTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageNothingTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageNothingTest.php deleted file mode 100644 index 4e1c0d0..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageNothingTest.php +++ /dev/null @@ -1,15 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoveragePrivateTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoveragePrivateTest.php deleted file mode 100644 index 849c348..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoveragePrivateTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageProtectedTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageProtectedTest.php deleted file mode 100644 index 6ae3544..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageProtectedTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoveragePublicTest.php b/vendor/phpunit/php-code-coverage/tests/_files/CoveragePublicTest.php deleted file mode 100644 index d977090..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoveragePublicTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoverageTwoDefaultClassAnnotations.php b/vendor/phpunit/php-code-coverage/tests/_files/CoverageTwoDefaultClassAnnotations.php deleted file mode 100644 index 06949cb..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoverageTwoDefaultClassAnnotations.php +++ /dev/null @@ -1,17 +0,0 @@ - - */ - public function testSomething() - { - $o = new Foo\CoveredClass; - $o->publicMethod(); - } - -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoveredClass.php b/vendor/phpunit/php-code-coverage/tests/_files/CoveredClass.php deleted file mode 100644 index f382ce9..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoveredClass.php +++ /dev/null @@ -1,36 +0,0 @@ -privateMethod(); - } - - public function publicMethod() - { - $this->protectedMethod(); - } -} - -class CoveredClass extends CoveredParentClass -{ - private function privateMethod() - { - } - - protected function protectedMethod() - { - parent::protectedMethod(); - $this->privateMethod(); - } - - public function publicMethod() - { - parent::publicMethod(); - $this->protectedMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/CoveredFunction.php b/vendor/phpunit/php-code-coverage/tests/_files/CoveredFunction.php deleted file mode 100644 index 9989eb0..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/CoveredFunction.php +++ /dev/null @@ -1,4 +0,0 @@ - - */ - public function testSomething() - { - $o = new Foo\CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassTest.php deleted file mode 100644 index 2b91f1f..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassTest.php +++ /dev/null @@ -1,14 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassPublicTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassPublicTest.php deleted file mode 100644 index d3bc1a9..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassPublicTest.php +++ /dev/null @@ -1,17 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassTest.php deleted file mode 100644 index 67752dd..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassTest.php +++ /dev/null @@ -1,22 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageMethodTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageMethodTest.php deleted file mode 100644 index f83ae5f..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageMethodTest.php +++ /dev/null @@ -1,14 +0,0 @@ -publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPrivateTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPrivateTest.php deleted file mode 100644 index b4983c7..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPrivateTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new Foo\CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotProtectedTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotProtectedTest.php deleted file mode 100644 index ceb7b35..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotProtectedTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new Foo\CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPublicTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPublicTest.php deleted file mode 100644 index 60aff7a..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPublicTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new Foo\CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePrivateTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePrivateTest.php deleted file mode 100644 index d5eb77e..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePrivateTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new Foo\CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageProtectedTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageProtectedTest.php deleted file mode 100644 index 6a6eaca..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageProtectedTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new Foo\CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePublicTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePublicTest.php deleted file mode 100644 index f32803e..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePublicTest.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ - public function testSomething() - { - $o = new Foo\CoveredClass; - $o->publicMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveredClass.php b/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveredClass.php deleted file mode 100644 index 5bd0ddf..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveredClass.php +++ /dev/null @@ -1,38 +0,0 @@ -privateMethod(); - } - - public function publicMethod() - { - $this->protectedMethod(); - } -} - -class CoveredClass extends CoveredParentClass -{ - private function privateMethod() - { - } - - protected function protectedMethod() - { - parent::protectedMethod(); - $this->privateMethod(); - } - - public function publicMethod() - { - parent::publicMethod(); - $this->protectedMethod(); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/NotExistingCoveredElementTest.php b/vendor/phpunit/php-code-coverage/tests/_files/NotExistingCoveredElementTest.php deleted file mode 100644 index 0836a8c..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/NotExistingCoveredElementTest.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ - public function testThree() - { - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html deleted file mode 100644 index 467602e..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - Code Coverage for %s%eBankAccount.php - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
-
- 75.00% covered (warning) -
-
-
75.00%
3 / 4
CRAP
-
- 50.00% covered (danger) -
-
-
50.00%
5 / 10
BankAccount
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
-
- 75.00% covered (warning) -
-
-
75.00%
3 / 4
8.12
-
- 50.00% covered (danger) -
-
-
50.00%
5 / 10
 getBalance
-
- 100.00% covered (success) -
-
-
100.00%
1 / 1
1
-
- 100.00% covered (success) -
-
-
100.00%
1 / 1
 setBalance
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
6
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 5
 depositMoney
-
- 100.00% covered (success) -
-
-
100.00%
1 / 1
1
-
- 100.00% covered (success) -
-
-
100.00%
2 / 2
 withdrawMoney
-
- 100.00% covered (success) -
-
-
100.00%
1 / 1
1
-
- 100.00% covered (success) -
-
-
100.00%
2 / 2
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<?php
class BankAccount
{
    protected $balance = 0;
    public function getBalance()
    {
        return $this->balance;
    }
    protected function setBalance($balance)
    {
        if ($balance >= 0) {
            $this->balance = $balance;
        } else {
            throw new RuntimeException;
        }
    }
    public function depositMoney($balance)
    {
        $this->setBalance($this->getBalance() + $balance);
        return $this->getBalance();
    }
    public function withdrawMoney($balance)
    {
        $this->setBalance($this->getBalance() - $balance);
        return $this->getBalance();
    }
}
- -
- - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html deleted file mode 100644 index e47929f..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - Dashboard for %s - - - - - - - -
-
-
-
- -
-
-
-
-
-
-
-

Classes

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - - - - -
ClassCoverage
BankAccount50%
-
-
-
-

Project Risks

-
- - - - - - - - - - - -
ClassCRAP
BankAccount8
-
-
-
-
-
-

Methods

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - - - - -
MethodCoverage
setBalance0%
-
-
-
-

Project Risks

-
- - - - - - - - - - - -
MethodCRAP
setBalance6
-
-
-
- -
- - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/index.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/index.html deleted file mode 100644 index e0c9ed9..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - Code Coverage for %s - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
-
- 50.00% covered (danger) -
-
-
50.00%
5 / 10
-
- 75.00% covered (warning) -
-
-
75.00%
3 / 4
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
BankAccount.php
-
- 50.00% covered (danger) -
-
-
50.00%
5 / 10
-
- 75.00% covered (warning) -
-
-
75.00%
3 / 4
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
-
-
-
-

Legend

-

- Low: 0% to 50% - Medium: 50% to 90% - High: 90% to 100% -

-

- Generated by php-code-coverage %s using %s at %s. -

-
-
- - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html deleted file mode 100644 index 8b27809..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - - Dashboard for %s - - - - - - - -
-
-
-
- -
-
-
-
-
-
-
-

Classes

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - - - - -
ClassCoverage
CoveredClassWithAnonymousFunctionInStaticMethod87%
-
-
-
-

Project Risks

-
- - - - - - - - - - -
ClassCRAP
-
-
-
-
-
-

Methods

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - - - - -
MethodCoverage
runAnonymous87%
-
-
-
-

Project Risks

-
- - - - - - - - - - -
MethodCRAP
-
-
-
- -
- - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html deleted file mode 100644 index 68318d0..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - Code Coverage for %s - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
-
- 87.50% covered (warning) -
-
-
87.50%
7 / 8
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
source_with_class_and_anonymous_function.php
-
- 87.50% covered (warning) -
-
-
87.50%
7 / 8
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
-
-
-
-

Legend

-

- Low: 0% to 50% - Medium: 50% to 90% - High: 90% to 100% -

-

- Generated by php-code-coverage %s using %s at %s. -

-
-
- - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html deleted file mode 100644 index c261c6e..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - Code Coverage for %s%esource_with_class_and_anonymous_function.php - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
CRAP
-
- 87.50% covered (warning) -
-
-
87.50%
7 / 8
CoveredClassWithAnonymousFunctionInStaticMethod
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
1.00
-
- 87.50% covered (warning) -
-
-
87.50%
7 / 8
 runAnonymous
-
- 0.00% covered (danger) -
-
-
0.00%
0 / 1
1.00
-
- 87.50% covered (warning) -
-
-
87.50%
7 / 8
-
- - - - - - - - - - - - - - - - - - - - - - - -
<?php
class CoveredClassWithAnonymousFunctionInStaticMethod
{
    public static function runAnonymous()
    {
        $filter = ['abc124', 'abc123', '123'];
        array_walk(
            $filter,
            function (&$val, $key) {
                $val = preg_replace('|[^0-9]|', '', $val);
            }
        );
        // Should be covered
        $extravar = true;
    }
}
- -
- - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html deleted file mode 100644 index 4cf93ad..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - Dashboard for %s - - - - - - - -
-
-
-
- -
-
-
-
-
-
-
-

Classes

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - - - -
ClassCoverage
-
-
-
-

Project Risks

-
- - - - - - - - - - -
ClassCRAP
-
-
-
-
-
-

Methods

-
-
-
-
-

Coverage Distribution

-
- -
-
-
-

Complexity

-
- -
-
-
-
-
-

Insufficient Coverage

-
- - - - - - - - - - -
MethodCoverage
-
-
-
-

Project Risks

-
- - - - - - - - - - -
MethodCRAP
-
-
-
- -
- - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html deleted file mode 100644 index 7d4cfff..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - Code Coverage for %s - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
-
- 50.00% covered (danger) -
-
-
50.00%
1 / 2
-
- 100.00% covered (success) -
-
-
100.00%
1 / 1
n/a
0 / 0
source_with_ignore.php
-
- 50.00% covered (danger) -
-
-
50.00%
1 / 2
-
- 100.00% covered (success) -
-
-
100.00%
1 / 1
n/a
0 / 0
-
-
-
-

Legend

-

- Low: 0% to 50% - Medium: 50% to 90% - High: 90% to 100% -

-

- Generated by php-code-coverage %s using %s at %s. -

-
-
- - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html b/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html deleted file mode 100644 index a18a5aa..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html +++ /dev/null @@ -1,196 +0,0 @@ - - - - - Code Coverage for %s%esource_with_ignore.php - - - - - - - -
-
-
-
- -
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
n/a
0 / 0
-
- 100.00% covered (success) -
-
-
100.00%
1 / 1
CRAP
-
- 50.00% covered (danger) -
-
-
50.00%
1 / 2
baz
n/a
0 / 0
1
n/a
0 / 0
Foo
n/a
0 / 0
n/a
0 / 0
1
n/a
0 / 0
 bar
n/a
0 / 0
1
n/a
0 / 0
Bar
n/a
0 / 0
n/a
0 / 0
1
n/a
0 / 0
 foo
n/a
0 / 0
1
n/a
0 / 0
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<?php
if ($neverHappens) {
    // @codeCoverageIgnoreStart
    print '*';
    // @codeCoverageIgnoreEnd
}
/**
 * @codeCoverageIgnore
 */
class Foo
{
    public function bar()
    {
    }
}
class Bar
{
    /**
     * @codeCoverageIgnore
     */
    public function foo()
    {
    }
}
function baz()
{
    print '*'; // @codeCoverageIgnore
}
interface Bor
{
    public function foo();
}
- -
- - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml deleted file mode 100644 index 238548b..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <?php - - - class - - BankAccount - - - { - - - - protected - - $balance - - = - - 0 - ; - - - - - public - - function - - getBalance - ( - ) - - - - { - - - - return - - $this - -> - balance - ; - - - - } - - - - - protected - - function - - setBalance - ( - $balance - ) - - - - { - - - - if - - ( - $balance - - >= - - 0 - ) - - { - - - - $this - -> - balance - - = - - $balance - ; - - - - } - - else - - { - - - - throw - - new - - RuntimeException - ; - - - - } - - - - } - - - - - public - - function - - depositMoney - ( - $balance - ) - - - - { - - - - $this - -> - setBalance - ( - $this - -> - getBalance - ( - ) - - + - - $balance - ) - ; - - - - - return - - $this - -> - getBalance - ( - ) - ; - - - - } - - - - - public - - function - - withdrawMoney - ( - $balance - ) - - - - { - - - - $this - -> - setBalance - ( - $this - -> - getBalance - ( - ) - - - - - $balance - ) - ; - - - - - return - - $this - -> - getBalance - ( - ) - ; - - - - } - - - } - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/index.xml b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/index.xml deleted file mode 100644 index df433b0..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/index.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml deleted file mode 100644 index c8d90ba..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml deleted file mode 100644 index a413174..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <?php - - - - class - - CoveredClassWithAnonymousFunctionInStaticMethod - - - { - - - - public - - static - - function - - runAnonymous - ( - ) - - - - { - - - - $filter - - = - - [ - 'abc124' - , - - 'abc123' - , - - '123' - ] - ; - - - - - array_walk - ( - - - - $filter - , - - - - function - - ( - & - $val - , - - $key - ) - - { - - - - $val - - = - - preg_replace - ( - '|[^0-9]|' - , - - '' - , - - $val - ) - ; - - - - } - - - - ) - ; - - - - - // Should be covered - - - - $extravar - - = - - true - ; - - - - } - - - } - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml deleted file mode 100644 index d44f970..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml b/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml deleted file mode 100644 index 5ff1d6b..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <?php - - - if - - ( - $neverHappens - ) - - { - - - - // @codeCoverageIgnoreStart - - - - print - - '*' - ; - - - - // @codeCoverageIgnoreEnd - - - } - - - - /** - - - * @codeCoverageIgnore - - - */ - - - class - - Foo - - - { - - - - public - - function - - bar - ( - ) - - - - { - - - - } - - - } - - - - class - - Bar - - - { - - - - /** - - - * @codeCoverageIgnore - - - */ - - - - public - - function - - foo - ( - ) - - - - { - - - - } - - - } - - - - function - - baz - ( - ) - - - { - - - - print - - '*' - ; - - // @codeCoverageIgnore - - - } - - - - interface - - Bor - - - { - - - - public - - function - - foo - ( - ) - ; - - - - } - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml b/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml deleted file mode 100644 index 008db55..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-crap4j.xml b/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-crap4j.xml deleted file mode 100644 index 5bd2535..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-crap4j.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - CoverageForClassWithAnonymousFunction - %s - - Method Crap Stats - 1 - 0 - 0 - 1 - 0 - - - - global - CoveredClassWithAnonymousFunctionInStaticMethod - runAnonymous - runAnonymous() - runAnonymous() - 1 - 1 - 87.5 - 0 - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-text.txt b/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-text.txt deleted file mode 100644 index e4204cc..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-text.txt +++ /dev/null @@ -1,12 +0,0 @@ - - -Code Coverage Report: - %s - - Summary: - Classes: 0.00% (0/1) - Methods: 0.00% (0/1) - Lines: 87.50% (7/8) - -CoveredClassWithAnonymousFunctionInStaticMethod - Methods: 0.00% ( 0/ 1) Lines: 87.50% ( 7/ 8) diff --git a/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml b/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml deleted file mode 100644 index efd3801..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-crap4j.xml b/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-crap4j.xml deleted file mode 100644 index 2607b59..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-crap4j.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - CoverageForFileWithIgnoredLines - %s - - Method Crap Stats - 2 - 0 - 0 - 2 - 0 - - - - global - Foo - bar - bar() - bar() - 1 - 1 - 100 - 0 - - - global - Bar - foo - foo() - foo() - 1 - 1 - 100 - 0 - - - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-text.txt b/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-text.txt deleted file mode 100644 index 6e8e149..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-text.txt +++ /dev/null @@ -1,10 +0,0 @@ - - -Code Coverage Report:%w - %s -%w - Summary:%w - Classes: (0/0) - Methods: (0/0) - Lines: 50.00% (1/2) - diff --git a/vendor/phpunit/php-code-coverage/tests/_files/source_with_class_and_anonymous_function.php b/vendor/phpunit/php-code-coverage/tests/_files/source_with_class_and_anonymous_function.php deleted file mode 100644 index 72aa938..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/source_with_class_and_anonymous_function.php +++ /dev/null @@ -1,19 +0,0 @@ - 1, 'b' => 2, 'c' => 3, 'd' => 4], - static function ($v, $k) - { - return $k === 'b' || $v === 4; - }, - ARRAY_FILTER_USE_BOTH - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/_files/source_without_ignore.php b/vendor/phpunit/php-code-coverage/tests/_files/source_without_ignore.php deleted file mode 100644 index be4e836..0000000 --- a/vendor/phpunit/php-code-coverage/tests/_files/source_without_ignore.php +++ /dev/null @@ -1,4 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use SebastianBergmann\CodeCoverage\Node\Builder; -use SebastianBergmann\CodeCoverage\TestCase; - -class BuilderTest extends TestCase -{ - protected $factory; - - protected function setUp(): void - { - $this->factory = new Builder; - } - - public function testSomething(): void - { - $root = $this->getCoverageForBankAccount()->getReport(); - - $expectedPath = \rtrim(TEST_FILES_PATH, \DIRECTORY_SEPARATOR); - $this->assertEquals($expectedPath, $root->getName()); - $this->assertEquals($expectedPath, $root->getPath()); - $this->assertEquals(10, $root->getNumExecutableLines()); - $this->assertEquals(5, $root->getNumExecutedLines()); - $this->assertEquals(1, $root->getNumClasses()); - $this->assertEquals(0, $root->getNumTestedClasses()); - $this->assertEquals(4, $root->getNumMethods()); - $this->assertEquals(3, $root->getNumTestedMethods()); - $this->assertEquals('0.00%', $root->getTestedClassesPercent()); - $this->assertEquals('75.00%', $root->getTestedMethodsPercent()); - $this->assertEquals('50.00%', $root->getLineExecutedPercent()); - $this->assertEquals(0, $root->getNumFunctions()); - $this->assertEquals(0, $root->getNumTestedFunctions()); - $this->assertNull($root->getParent()); - $this->assertEquals([], $root->getDirectories()); - #$this->assertEquals(array(), $root->getFiles()); - #$this->assertEquals(array(), $root->getChildNodes()); - - $this->assertEquals( - [ - 'BankAccount' => [ - 'methods' => [ - 'getBalance' => [ - 'signature' => 'getBalance()', - 'startLine' => 6, - 'endLine' => 9, - 'executableLines' => 1, - 'executedLines' => 1, - 'ccn' => 1, - 'coverage' => 100, - 'crap' => '1', - 'link' => 'BankAccount.php.html#6', - 'methodName' => 'getBalance', - 'visibility' => 'public', - ], - 'setBalance' => [ - 'signature' => 'setBalance($balance)', - 'startLine' => 11, - 'endLine' => 18, - 'executableLines' => 5, - 'executedLines' => 0, - 'ccn' => 2, - 'coverage' => 0, - 'crap' => 6, - 'link' => 'BankAccount.php.html#11', - 'methodName' => 'setBalance', - 'visibility' => 'protected', - ], - 'depositMoney' => [ - 'signature' => 'depositMoney($balance)', - 'startLine' => 20, - 'endLine' => 25, - 'executableLines' => 2, - 'executedLines' => 2, - 'ccn' => 1, - 'coverage' => 100, - 'crap' => '1', - 'link' => 'BankAccount.php.html#20', - 'methodName' => 'depositMoney', - 'visibility' => 'public', - ], - 'withdrawMoney' => [ - 'signature' => 'withdrawMoney($balance)', - 'startLine' => 27, - 'endLine' => 32, - 'executableLines' => 2, - 'executedLines' => 2, - 'ccn' => 1, - 'coverage' => 100, - 'crap' => '1', - 'link' => 'BankAccount.php.html#27', - 'methodName' => 'withdrawMoney', - 'visibility' => 'public', - ], - ], - 'startLine' => 2, - 'executableLines' => 10, - 'executedLines' => 5, - 'ccn' => 5, - 'coverage' => 50, - 'crap' => '8.12', - 'package' => [ - 'namespace' => '', - 'fullPackage' => '', - 'category' => '', - 'package' => '', - 'subpackage' => '', - ], - 'link' => 'BankAccount.php.html#2', - 'className' => 'BankAccount', - ], - ], - $root->getClasses() - ); - - $this->assertEquals([], $root->getFunctions()); - } - - public function testNotCrashParsing(): void - { - $coverage = $this->getCoverageForCrashParsing(); - $root = $coverage->getReport(); - - $expectedPath = \rtrim(TEST_FILES_PATH, \DIRECTORY_SEPARATOR); - $this->assertEquals($expectedPath, $root->getName()); - $this->assertEquals($expectedPath, $root->getPath()); - $this->assertEquals(2, $root->getNumExecutableLines()); - $this->assertEquals(0, $root->getNumExecutedLines()); - $data = $coverage->getData(); - $expectedFile = $expectedPath . \DIRECTORY_SEPARATOR . 'Crash.php'; - $this->assertSame([$expectedFile => [1 => [], 2 => []]], $data); - } - - public function testBuildDirectoryStructure(): void - { - $s = \DIRECTORY_SEPARATOR; - - $method = new \ReflectionMethod( - Builder::class, - 'buildDirectoryStructure' - ); - - $method->setAccessible(true); - - $this->assertEquals( - [ - 'src' => [ - 'Money.php/f' => [], - 'MoneyBag.php/f' => [], - 'Foo' => [ - 'Bar' => [ - 'Baz' => [ - 'Foo.php/f' => [], - ], - ], - ], - ], - ], - $method->invoke( - $this->factory, - [ - "src{$s}Money.php" => [], - "src{$s}MoneyBag.php" => [], - "src{$s}Foo{$s}Bar{$s}Baz{$s}Foo.php" => [], - ] - ) - ); - } - - /** - * @dataProvider reducePathsProvider - */ - public function testReducePaths($reducedPaths, $commonPath, $paths): void - { - $method = new \ReflectionMethod( - Builder::class, - 'reducePaths' - ); - - $method->setAccessible(true); - - $_commonPath = $method->invokeArgs($this->factory, [&$paths]); - - $this->assertEquals($reducedPaths, $paths); - $this->assertEquals($commonPath, $_commonPath); - } - - public function reducePathsProvider() - { - $s = \DIRECTORY_SEPARATOR; - - yield [ - [], - '.', - [], - ]; - - $prefixes = ["C:$s", "$s"]; - - foreach ($prefixes as $p) { - yield [ - [ - 'Money.php' => [], - ], - "{$p}home{$s}sb{$s}Money{$s}", - [ - "{$p}home{$s}sb{$s}Money{$s}Money.php" => [], - ], - ]; - - yield [ - [ - 'Money.php' => [], - 'MoneyBag.php' => [], - ], - "{$p}home{$s}sb{$s}Money", - [ - "{$p}home{$s}sb{$s}Money{$s}Money.php" => [], - "{$p}home{$s}sb{$s}Money{$s}MoneyBag.php" => [], - ], - ]; - - yield [ - [ - 'Money.php' => [], - 'MoneyBag.php' => [], - "Cash.phar{$s}Cash.php" => [], - ], - "{$p}home{$s}sb{$s}Money", - [ - "{$p}home{$s}sb{$s}Money{$s}Money.php" => [], - "{$p}home{$s}sb{$s}Money{$s}MoneyBag.php" => [], - "phar://{$p}home{$s}sb{$s}Money{$s}Cash.phar{$s}Cash.php" => [], - ], - ]; - } - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/tests/CloverTest.php b/vendor/phpunit/php-code-coverage/tests/tests/CloverTest.php deleted file mode 100644 index 7fdbf7d..0000000 --- a/vendor/phpunit/php-code-coverage/tests/tests/CloverTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use SebastianBergmann\CodeCoverage\TestCase; - -/** - * @covers SebastianBergmann\CodeCoverage\Report\Clover - */ -class CloverTest extends TestCase -{ - public function testCloverForBankAccountTest(): void - { - $clover = new Clover; - - $this->assertStringMatchesFormatFile( - TEST_FILES_PATH . 'BankAccount-clover.xml', - $clover->process($this->getCoverageForBankAccount(), null, 'BankAccount') - ); - } - - public function testCloverForFileWithIgnoredLines(): void - { - $clover = new Clover; - - $this->assertStringMatchesFormatFile( - TEST_FILES_PATH . 'ignored-lines-clover.xml', - $clover->process($this->getCoverageForFileWithIgnoredLines()) - ); - } - - public function testCloverForClassWithAnonymousFunction(): void - { - $clover = new Clover; - - $this->assertStringMatchesFormatFile( - TEST_FILES_PATH . 'class-with-anonymous-function-clover.xml', - $clover->process($this->getCoverageForClassWithAnonymousFunction()) - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/tests/CodeCoverageTest.php b/vendor/phpunit/php-code-coverage/tests/tests/CodeCoverageTest.php deleted file mode 100644 index ce2471a..0000000 --- a/vendor/phpunit/php-code-coverage/tests/tests/CodeCoverageTest.php +++ /dev/null @@ -1,359 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use SebastianBergmann\CodeCoverage\Driver\Driver; -use SebastianBergmann\Environment\Runtime; - -/** - * @covers SebastianBergmann\CodeCoverage\CodeCoverage - */ -class CodeCoverageTest extends TestCase -{ - /** - * @var CodeCoverage - */ - private $coverage; - - protected function setUp(): void - { - $runtime = new Runtime; - - if (!$runtime->canCollectCodeCoverage()) { - $this->markTestSkipped('No code coverage driver available'); - } - - $this->coverage = new CodeCoverage; - } - - public function testCannotStopWithInvalidSecondArgument(): void - { - $this->expectException(Exception::class); - - $this->coverage->stop(true, null); - } - - public function testCannotAppendWithInvalidArgument(): void - { - $this->expectException(Exception::class); - - $this->coverage->append([], null); - } - - public function testCollect(): void - { - $coverage = $this->getCoverageForBankAccount(); - - $this->assertEquals( - $this->getExpectedDataArrayForBankAccount(), - $coverage->getData() - ); - - $this->assertEquals( - [ - 'BankAccountTest::testBalanceIsInitiallyZero' => ['size' => 'unknown', 'status' => -1], - 'BankAccountTest::testBalanceCannotBecomeNegative' => ['size' => 'unknown', 'status' => -1], - 'BankAccountTest::testBalanceCannotBecomeNegative2' => ['size' => 'unknown', 'status' => -1], - 'BankAccountTest::testDepositWithdrawMoney' => ['size' => 'unknown', 'status' => -1], - ], - $coverage->getTests() - ); - } - - public function testMerge(): void - { - $coverage = $this->getCoverageForBankAccountForFirstTwoTests(); - $coverage->merge($this->getCoverageForBankAccountForLastTwoTests()); - - $this->assertEquals( - $this->getExpectedDataArrayForBankAccount(), - $coverage->getData() - ); - } - - public function testMergeReverseOrder(): void - { - $coverage = $this->getCoverageForBankAccountForLastTwoTests(); - $coverage->merge($this->getCoverageForBankAccountForFirstTwoTests()); - - $this->assertEquals( - $this->getExpectedDataArrayForBankAccountInReverseOrder(), - $coverage->getData() - ); - } - - public function testMerge2(): void - { - $coverage = new CodeCoverage( - $this->createMock(Driver::class), - new Filter - ); - - $coverage->merge($this->getCoverageForBankAccount()); - - $this->assertEquals( - $this->getExpectedDataArrayForBankAccount(), - $coverage->getData() - ); - } - - public function testGetLinesToBeIgnored(): void - { - $this->assertEquals( - [ - 1, - 3, - 4, - 5, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 27, - 28, - 30, - 32, - 33, - 34, - 35, - 36, - 37, - 38, - ], - $this->getLinesToBeIgnored()->invoke( - $this->coverage, - TEST_FILES_PATH . 'source_with_ignore.php' - ) - ); - } - - public function testGetLinesToBeIgnored2(): void - { - $this->assertEquals( - [1, 5], - $this->getLinesToBeIgnored()->invoke( - $this->coverage, - TEST_FILES_PATH . 'source_without_ignore.php' - ) - ); - } - - public function testGetLinesToBeIgnored3(): void - { - $this->assertEquals( - [ - 1, - 2, - 3, - 4, - 5, - 8, - 11, - 15, - 16, - 19, - 20, - ], - $this->getLinesToBeIgnored()->invoke( - $this->coverage, - TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php' - ) - ); - } - - public function testGetLinesToBeIgnoredOneLineAnnotations(): void - { - $this->assertEquals( - [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 14, - 15, - 16, - 18, - 20, - 21, - 23, - 24, - 25, - 27, - 28, - 29, - 30, - 31, - 32, - 33, - 34, - 37, - ], - $this->getLinesToBeIgnored()->invoke( - $this->coverage, - TEST_FILES_PATH . 'source_with_oneline_annotations.php' - ) - ); - } - - public function testGetLinesToBeIgnoredWhenIgnoreIsDisabled(): void - { - $this->coverage->setDisableIgnoredLines(true); - - $this->assertEquals( - [ - 7, - 11, - 12, - 13, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 26, - 27, - 32, - 33, - 34, - 35, - 36, - 37, - ], - $this->getLinesToBeIgnored()->invoke( - $this->coverage, - TEST_FILES_PATH . 'source_with_ignore.php' - ) - ); - } - - public function testUseStatementsAreIgnored(): void - { - $this->assertEquals( - [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 13, - 16, - 23, - 24, - ], - $this->getLinesToBeIgnored()->invoke( - $this->coverage, - TEST_FILES_PATH . 'source_with_use_statements.php' - ) - ); - } - - public function testAppendThrowsExceptionIfCoveredCodeWasNotExecuted(): void - { - $this->coverage->filter()->addDirectoryToWhitelist(TEST_FILES_PATH); - $this->coverage->setCheckForUnexecutedCoveredCode(true); - - $data = [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 29 => -1, - 31 => -1, - ], - ]; - - $linesToBeCovered = [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 22, - 24, - ], - ]; - - $linesToBeUsed = []; - - $this->expectException(CoveredCodeNotExecutedException::class); - - $this->coverage->append($data, 'File1.php', true, $linesToBeCovered, $linesToBeUsed); - } - - public function testAppendThrowsExceptionIfUsedCodeWasNotExecuted(): void - { - $this->coverage->filter()->addDirectoryToWhitelist(TEST_FILES_PATH); - $this->coverage->setCheckForUnexecutedCoveredCode(true); - - $data = [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 29 => -1, - 31 => -1, - ], - ]; - - $linesToBeCovered = [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 29, - 31, - ], - ]; - - $linesToBeUsed = [ - TEST_FILES_PATH . 'BankAccount.php' => [ - 22, - 24, - ], - ]; - - $this->expectException(CoveredCodeNotExecutedException::class); - - $this->coverage->append($data, 'File1.php', true, $linesToBeCovered, $linesToBeUsed); - } - - /** - * @return \ReflectionMethod - */ - private function getLinesToBeIgnored() - { - $getLinesToBeIgnored = new \ReflectionMethod( - 'SebastianBergmann\CodeCoverage\CodeCoverage', - 'getLinesToBeIgnored' - ); - - $getLinesToBeIgnored->setAccessible(true); - - return $getLinesToBeIgnored; - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/tests/Crap4jTest.php b/vendor/phpunit/php-code-coverage/tests/tests/Crap4jTest.php deleted file mode 100644 index 033fe4c..0000000 --- a/vendor/phpunit/php-code-coverage/tests/tests/Crap4jTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use SebastianBergmann\CodeCoverage\TestCase; - -/** - * @covers SebastianBergmann\CodeCoverage\Report\Crap4j - */ -class Crap4jTest extends TestCase -{ - public function testForBankAccountTest(): void - { - $crap4j = new Crap4j; - - $this->assertStringMatchesFormatFile( - TEST_FILES_PATH . 'BankAccount-crap4j.xml', - $crap4j->process($this->getCoverageForBankAccount(), null, 'BankAccount') - ); - } - - public function testForFileWithIgnoredLines(): void - { - $crap4j = new Crap4j; - - $this->assertStringMatchesFormatFile( - TEST_FILES_PATH . 'ignored-lines-crap4j.xml', - $crap4j->process($this->getCoverageForFileWithIgnoredLines(), null, 'CoverageForFileWithIgnoredLines') - ); - } - - public function testForClassWithAnonymousFunction(): void - { - $crap4j = new Crap4j; - - $this->assertStringMatchesFormatFile( - TEST_FILES_PATH . 'class-with-anonymous-function-crap4j.xml', - $crap4j->process($this->getCoverageForClassWithAnonymousFunction(), null, 'CoverageForClassWithAnonymousFunction') - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/tests/Exception/UnintentionallyCoveredCodeExceptionTest.php b/vendor/phpunit/php-code-coverage/tests/tests/Exception/UnintentionallyCoveredCodeExceptionTest.php deleted file mode 100644 index dffc227..0000000 --- a/vendor/phpunit/php-code-coverage/tests/tests/Exception/UnintentionallyCoveredCodeExceptionTest.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\tests\Exception; - -use PHPUnit\Framework\TestCase; -use SebastianBergmann\CodeCoverage\RuntimeException; -use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException; - -final class UnintentionallyCoveredCodeExceptionTest extends TestCase -{ - public function testCanConstructWithEmptyArray(): void - { - $unintentionallyCoveredUnits = []; - - $exception = new UnintentionallyCoveredCodeException($unintentionallyCoveredUnits); - - $this->assertInstanceOf(RuntimeException::class, $exception); - $this->assertSame($unintentionallyCoveredUnits, $exception->getUnintentionallyCoveredUnits()); - $this->assertSame('', $exception->getMessage()); - } - - public function testCanConstructWithNonEmptyArray(): void - { - $unintentionallyCoveredUnits = [ - 'foo', - 'bar', - 'baz', - ]; - - $exception = new UnintentionallyCoveredCodeException($unintentionallyCoveredUnits); - - $this->assertInstanceOf(RuntimeException::class, $exception); - $this->assertSame($unintentionallyCoveredUnits, $exception->getUnintentionallyCoveredUnits()); - - $expected = <<assertSame($expected, $exception->getMessage()); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php b/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php deleted file mode 100644 index 373b349..0000000 --- a/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php +++ /dev/null @@ -1,213 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use PHPUnit\Framework\TestCase; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; - -class FilterTest extends TestCase -{ - /** - * @var Filter - */ - private $filter; - - /** - * @var array - */ - private $files = []; - - protected function setUp(): void - { - $this->filter = \unserialize('O:37:"SebastianBergmann\CodeCoverage\Filter":0:{}'); - - $this->files = [ - TEST_FILES_PATH . 'BankAccount.php', - TEST_FILES_PATH . 'BankAccountTest.php', - TEST_FILES_PATH . 'CoverageClassExtendedTest.php', - TEST_FILES_PATH . 'CoverageClassTest.php', - TEST_FILES_PATH . 'CoverageFunctionParenthesesTest.php', - TEST_FILES_PATH . 'CoverageFunctionParenthesesWhitespaceTest.php', - TEST_FILES_PATH . 'CoverageFunctionTest.php', - TEST_FILES_PATH . 'CoverageMethodOneLineAnnotationTest.php', - TEST_FILES_PATH . 'CoverageMethodParenthesesTest.php', - TEST_FILES_PATH . 'CoverageMethodParenthesesWhitespaceTest.php', - TEST_FILES_PATH . 'CoverageMethodTest.php', - TEST_FILES_PATH . 'CoverageNoneTest.php', - TEST_FILES_PATH . 'CoverageNotPrivateTest.php', - TEST_FILES_PATH . 'CoverageNotProtectedTest.php', - TEST_FILES_PATH . 'CoverageNotPublicTest.php', - TEST_FILES_PATH . 'CoverageNothingTest.php', - TEST_FILES_PATH . 'CoveragePrivateTest.php', - TEST_FILES_PATH . 'CoverageProtectedTest.php', - TEST_FILES_PATH . 'CoveragePublicTest.php', - TEST_FILES_PATH . 'CoverageTwoDefaultClassAnnotations.php', - TEST_FILES_PATH . 'CoveredClass.php', - TEST_FILES_PATH . 'CoveredFunction.php', - TEST_FILES_PATH . 'Crash.php', - TEST_FILES_PATH . 'NamespaceCoverageClassExtendedTest.php', - TEST_FILES_PATH . 'NamespaceCoverageClassTest.php', - TEST_FILES_PATH . 'NamespaceCoverageCoversClassPublicTest.php', - TEST_FILES_PATH . 'NamespaceCoverageCoversClassTest.php', - TEST_FILES_PATH . 'NamespaceCoverageMethodTest.php', - TEST_FILES_PATH . 'NamespaceCoverageNotPrivateTest.php', - TEST_FILES_PATH . 'NamespaceCoverageNotProtectedTest.php', - TEST_FILES_PATH . 'NamespaceCoverageNotPublicTest.php', - TEST_FILES_PATH . 'NamespaceCoveragePrivateTest.php', - TEST_FILES_PATH . 'NamespaceCoverageProtectedTest.php', - TEST_FILES_PATH . 'NamespaceCoveragePublicTest.php', - TEST_FILES_PATH . 'NamespaceCoveredClass.php', - TEST_FILES_PATH . 'NotExistingCoveredElementTest.php', - TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php', - TEST_FILES_PATH . 'source_with_ignore.php', - TEST_FILES_PATH . 'source_with_namespace.php', - TEST_FILES_PATH . 'source_with_oneline_annotations.php', - TEST_FILES_PATH . 'source_with_use_statements.php', - TEST_FILES_PATH . 'source_without_ignore.php', - TEST_FILES_PATH . 'source_without_namespace.php', - ]; - } - - /** - * @covers SebastianBergmann\CodeCoverage\Filter::addFileToWhitelist - * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist - */ - public function testAddingAFileToTheWhitelistWorks(): void - { - $this->filter->addFileToWhitelist($this->files[0]); - - $this->assertEquals( - [$this->files[0]], - $this->filter->getWhitelist() - ); - } - - /** - * @covers SebastianBergmann\CodeCoverage\Filter::removeFileFromWhitelist - * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist - */ - public function testRemovingAFileFromTheWhitelistWorks(): void - { - $this->filter->addFileToWhitelist($this->files[0]); - $this->filter->removeFileFromWhitelist($this->files[0]); - - $this->assertEquals([], $this->filter->getWhitelist()); - } - - /** - * @covers SebastianBergmann\CodeCoverage\Filter::addDirectoryToWhitelist - * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist - * @depends testAddingAFileToTheWhitelistWorks - */ - public function testAddingADirectoryToTheWhitelistWorks(): void - { - $this->filter->addDirectoryToWhitelist(TEST_FILES_PATH); - - $whitelist = $this->filter->getWhitelist(); - \sort($whitelist); - - $this->assertEquals($this->files, $whitelist); - } - - /** - * @covers SebastianBergmann\CodeCoverage\Filter::addFilesToWhitelist - * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist - */ - public function testAddingFilesToTheWhitelistWorks(): void - { - $facade = new FileIteratorFacade; - - $files = $facade->getFilesAsArray( - TEST_FILES_PATH, - $suffixes = '.php' - ); - - $this->filter->addFilesToWhitelist($files); - - $whitelist = $this->filter->getWhitelist(); - \sort($whitelist); - - $this->assertEquals($this->files, $whitelist); - } - - /** - * @covers SebastianBergmann\CodeCoverage\Filter::removeDirectoryFromWhitelist - * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist - * @depends testAddingADirectoryToTheWhitelistWorks - */ - public function testRemovingADirectoryFromTheWhitelistWorks(): void - { - $this->filter->addDirectoryToWhitelist(TEST_FILES_PATH); - $this->filter->removeDirectoryFromWhitelist(TEST_FILES_PATH); - - $this->assertEquals([], $this->filter->getWhitelist()); - } - - /** - * @covers SebastianBergmann\CodeCoverage\Filter::isFile - */ - public function testIsFile(): void - { - $this->assertFalse($this->filter->isFile('vfs://root/a/path')); - $this->assertFalse($this->filter->isFile('xdebug://debug-eval')); - $this->assertFalse($this->filter->isFile('eval()\'d code')); - $this->assertFalse($this->filter->isFile('runtime-created function')); - $this->assertFalse($this->filter->isFile('assert code')); - $this->assertFalse($this->filter->isFile('regexp code')); - $this->assertTrue($this->filter->isFile(__FILE__)); - } - - /** - * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered - */ - public function testWhitelistedFileIsNotFiltered(): void - { - $this->filter->addFileToWhitelist($this->files[0]); - $this->assertFalse($this->filter->isFiltered($this->files[0])); - } - - /** - * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered - */ - public function testNotWhitelistedFileIsFiltered(): void - { - $this->filter->addFileToWhitelist($this->files[0]); - $this->assertTrue($this->filter->isFiltered($this->files[1])); - } - - /** - * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered - * @covers SebastianBergmann\CodeCoverage\Filter::isFile - */ - public function testNonFilesAreFiltered(): void - { - $this->assertTrue($this->filter->isFiltered('vfs://root/a/path')); - $this->assertTrue($this->filter->isFiltered('xdebug://debug-eval')); - $this->assertTrue($this->filter->isFiltered('eval()\'d code')); - $this->assertTrue($this->filter->isFiltered('runtime-created function')); - $this->assertTrue($this->filter->isFiltered('assert code')); - $this->assertTrue($this->filter->isFiltered('regexp code')); - } - - /** - * @covers SebastianBergmann\CodeCoverage\Filter::addFileToWhitelist - * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist - * - * @ticket https://github.com/sebastianbergmann/php-code-coverage/issues/664 - */ - public function testTryingToAddFileThatDoesNotExistDoesNotChangeFilter(): void - { - $filter = new Filter; - - $filter->addFileToWhitelist('does_not_exist'); - - $this->assertEmpty($filter->getWhitelistedFiles()); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/tests/HTMLTest.php b/vendor/phpunit/php-code-coverage/tests/tests/HTMLTest.php deleted file mode 100644 index 0ddd85d..0000000 --- a/vendor/phpunit/php-code-coverage/tests/tests/HTMLTest.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Html; - -use SebastianBergmann\CodeCoverage\TestCase; - -class HTMLTest extends TestCase -{ - private static $TEST_REPORT_PATH_SOURCE; - - public static function setUpBeforeClass(): void - { - parent::setUpBeforeClass(); - - self::$TEST_REPORT_PATH_SOURCE = TEST_FILES_PATH . 'Report' . \DIRECTORY_SEPARATOR . 'HTML'; - } - - protected function tearDown(): void - { - parent::tearDown(); - - $tmpFilesIterator = new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator(self::$TEST_TMP_PATH, \RecursiveDirectoryIterator::SKIP_DOTS), - \RecursiveIteratorIterator::CHILD_FIRST - ); - - foreach ($tmpFilesIterator as $path => $fileInfo) { - /* @var \SplFileInfo $fileInfo */ - $pathname = $fileInfo->getPathname(); - $fileInfo->isDir() ? \rmdir($pathname) : \unlink($pathname); - } - } - - public function testForBankAccountTest(): void - { - $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForBankAccount'; - - $report = new Facade; - $report->process($this->getCoverageForBankAccount(), self::$TEST_TMP_PATH); - - $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); - } - - public function testForFileWithIgnoredLines(): void - { - $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForFileWithIgnoredLines'; - - $report = new Facade; - $report->process($this->getCoverageForFileWithIgnoredLines(), self::$TEST_TMP_PATH); - - $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); - } - - public function testForClassWithAnonymousFunction(): void - { - $expectedFilesPath = - self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForClassWithAnonymousFunction'; - - $report = new Facade; - $report->process($this->getCoverageForClassWithAnonymousFunction(), self::$TEST_TMP_PATH); - - $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); - } - - /** - * @param string $expectedFilesPath - * @param string $actualFilesPath - */ - private function assertFilesEquals($expectedFilesPath, $actualFilesPath): void - { - $expectedFilesIterator = new \FilesystemIterator($expectedFilesPath); - $actualFilesIterator = new \RegexIterator(new \FilesystemIterator($actualFilesPath), '/.html/'); - - $this->assertEquals( - \iterator_count($expectedFilesIterator), - \iterator_count($actualFilesIterator), - 'Generated files and expected files not match' - ); - - foreach ($expectedFilesIterator as $path => $fileInfo) { - /* @var \SplFileInfo $fileInfo */ - $filename = $fileInfo->getFilename(); - - $actualFile = $actualFilesPath . \DIRECTORY_SEPARATOR . $filename; - - $this->assertFileExists($actualFile); - - $this->assertStringMatchesFormatFile( - $fileInfo->getPathname(), - \str_replace(\PHP_EOL, "\n", \file_get_contents($actualFile)), - "${filename} not match" - ); - } - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/tests/TextTest.php b/vendor/phpunit/php-code-coverage/tests/tests/TextTest.php deleted file mode 100644 index 501226f..0000000 --- a/vendor/phpunit/php-code-coverage/tests/tests/TextTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report; - -use SebastianBergmann\CodeCoverage\TestCase; - -/** - * @covers SebastianBergmann\CodeCoverage\Report\Text - */ -class TextTest extends TestCase -{ - public function testTextForBankAccountTest(): void - { - $text = new Text(50, 90, false, false); - - $this->assertStringMatchesFormatFile( - TEST_FILES_PATH . 'BankAccount-text.txt', - \str_replace(\PHP_EOL, "\n", $text->process($this->getCoverageForBankAccount())) - ); - } - - public function testTextForFileWithIgnoredLines(): void - { - $text = new Text(50, 90, false, false); - - $this->assertStringMatchesFormatFile( - TEST_FILES_PATH . 'ignored-lines-text.txt', - \str_replace(\PHP_EOL, "\n", $text->process($this->getCoverageForFileWithIgnoredLines())) - ); - } - - public function testTextForClassWithAnonymousFunction(): void - { - $text = new Text(50, 90, false, false); - - $this->assertStringMatchesFormatFile( - TEST_FILES_PATH . 'class-with-anonymous-function-text.txt', - \str_replace(\PHP_EOL, "\n", $text->process($this->getCoverageForClassWithAnonymousFunction())) - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/tests/UtilTest.php b/vendor/phpunit/php-code-coverage/tests/tests/UtilTest.php deleted file mode 100644 index 2ebfb61..0000000 --- a/vendor/phpunit/php-code-coverage/tests/tests/UtilTest.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage; - -use PHPUnit\Framework\TestCase; - -/** - * @covers SebastianBergmann\CodeCoverage\Util - */ -class UtilTest extends TestCase -{ - public function testPercent(): void - { - $this->assertEquals(100, Util::percent(100, 0)); - $this->assertEquals(100, Util::percent(100, 100)); - $this->assertEquals( - '100.00%', - Util::percent(100, 100, true) - ); - } -} diff --git a/vendor/phpunit/php-code-coverage/tests/tests/XmlTest.php b/vendor/phpunit/php-code-coverage/tests/tests/XmlTest.php deleted file mode 100644 index 13045a7..0000000 --- a/vendor/phpunit/php-code-coverage/tests/tests/XmlTest.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\CodeCoverage\Report\Xml; - -use SebastianBergmann\CodeCoverage\TestCase; - -class XmlTest extends TestCase -{ - private static $TEST_REPORT_PATH_SOURCE; - - public static function setUpBeforeClass(): void - { - parent::setUpBeforeClass(); - - self::$TEST_REPORT_PATH_SOURCE = TEST_FILES_PATH . 'Report' . \DIRECTORY_SEPARATOR . 'XML'; - } - - protected function tearDown(): void - { - parent::tearDown(); - - $tmpFilesIterator = new \FilesystemIterator(self::$TEST_TMP_PATH); - - foreach ($tmpFilesIterator as $path => $fileInfo) { - /* @var \SplFileInfo $fileInfo */ - \unlink($fileInfo->getPathname()); - } - } - - public function testForBankAccountTest(): void - { - $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForBankAccount'; - - $xml = new Facade('1.0.0'); - $xml->process($this->getCoverageForBankAccount(), self::$TEST_TMP_PATH); - - $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); - } - - public function testForFileWithIgnoredLines(): void - { - $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForFileWithIgnoredLines'; - - $xml = new Facade('1.0.0'); - $xml->process($this->getCoverageForFileWithIgnoredLines(), self::$TEST_TMP_PATH); - - $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); - } - - public function testForClassWithAnonymousFunction(): void - { - $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForClassWithAnonymousFunction'; - - $xml = new Facade('1.0.0'); - $xml->process($this->getCoverageForClassWithAnonymousFunction(), self::$TEST_TMP_PATH); - - $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); - } - - /** - * @param string $expectedFilesPath - * @param string $actualFilesPath - */ - private function assertFilesEquals($expectedFilesPath, $actualFilesPath): void - { - $expectedFilesIterator = new \FilesystemIterator($expectedFilesPath); - $actualFilesIterator = new \FilesystemIterator($actualFilesPath); - - $this->assertEquals( - \iterator_count($expectedFilesIterator), - \iterator_count($actualFilesIterator), - 'Generated files and expected files not match' - ); - - foreach ($expectedFilesIterator as $path => $fileInfo) { - /* @var \SplFileInfo $fileInfo */ - $filename = $fileInfo->getFilename(); - - $actualFile = $actualFilesPath . \DIRECTORY_SEPARATOR . $filename; - - $this->assertFileExists($actualFile); - - $this->assertStringMatchesFormatFile( - $fileInfo->getPathname(), - \file_get_contents($actualFile), - "${filename} not match" - ); - } - } -} diff --git a/vendor/phpunit/php-file-iterator/.gitattributes b/vendor/phpunit/php-file-iterator/.gitattributes deleted file mode 100644 index 461090b..0000000 --- a/vendor/phpunit/php-file-iterator/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.php diff=php diff --git a/vendor/phpunit/php-file-iterator/.github/stale.yml b/vendor/phpunit/php-file-iterator/.github/stale.yml deleted file mode 100644 index 4eadca3..0000000 --- a/vendor/phpunit/php-file-iterator/.github/stale.yml +++ /dev/null @@ -1,40 +0,0 @@ -# Configuration for probot-stale - https://github.com/probot/stale - -# Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 60 - -# Number of days of inactivity before a stale Issue or Pull Request is closed. -# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. -daysUntilClose: 7 - -# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable -exemptLabels: - - enhancement - -# Set to true to ignore issues in a project (defaults to false) -exemptProjects: false - -# Set to true to ignore issues in a milestone (defaults to false) -exemptMilestones: false - -# Label to use when marking as stale -staleLabel: stale - -# Comment to post when marking as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had activity within the last 60 days. It will be closed after 7 days if no further activity occurs. Thank you for your contributions. - -# Comment to post when removing the stale label. -# unmarkComment: > -# Your comment here. - -# Comment to post when closing a stale Issue or Pull Request. -closeComment: > - This issue has been automatically closed because it has not had activity since it was marked as stale. Thank you for your contributions. - -# Limit the number of actions per hour, from 1-30. Default is 30 -limitPerRun: 30 - -# Limit to only `issues` or `pulls` -only: issues - diff --git a/vendor/phpunit/php-file-iterator/.gitignore b/vendor/phpunit/php-file-iterator/.gitignore deleted file mode 100644 index 5ad7a64..0000000 --- a/vendor/phpunit/php-file-iterator/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/.idea -/vendor/ -/.php_cs -/.php_cs.cache -/composer.lock diff --git a/vendor/phpunit/php-file-iterator/.php_cs.dist b/vendor/phpunit/php-file-iterator/.php_cs.dist deleted file mode 100644 index efc649f..0000000 --- a/vendor/phpunit/php-file-iterator/.php_cs.dist +++ /dev/null @@ -1,168 +0,0 @@ - - -For the full copyright and license information, please view the LICENSE -file that was distributed with this source code. -EOF; - -return PhpCsFixer\Config::create() - ->setRiskyAllowed(true) - ->setRules( - [ - 'array_syntax' => ['syntax' => 'short'], - 'binary_operator_spaces' => [ - 'operators' => [ - '=' => 'align', - '=>' => 'align', - ], - ], - 'blank_line_after_namespace' => true, - 'blank_line_before_statement' => [ - 'statements' => [ - 'break', - 'continue', - 'declare', - 'do', - 'for', - 'foreach', - 'if', - 'include', - 'include_once', - 'require', - 'require_once', - 'return', - 'switch', - 'throw', - 'try', - 'while', - 'yield', - ], - ], - 'braces' => true, - 'cast_spaces' => true, - 'class_attributes_separation' => ['elements' => ['method']], - 'compact_nullable_typehint' => true, - 'concat_space' => ['spacing' => 'one'], - 'declare_equal_normalize' => ['space' => 'none'], - 'dir_constant' => true, - 'elseif' => true, - 'encoding' => true, - 'full_opening_tag' => true, - 'function_declaration' => true, - 'header_comment' => ['header' => $header, 'separate' => 'none'], - 'indentation_type' => true, - 'line_ending' => true, - 'list_syntax' => ['syntax' => 'short'], - 'lowercase_cast' => true, - 'lowercase_constants' => true, - 'lowercase_keywords' => true, - 'magic_constant_casing' => true, - 'method_argument_space' => ['ensure_fully_multiline' => true], - 'modernize_types_casting' => true, - 'native_function_casing' => true, - 'native_function_invocation' => true, - 'no_alias_functions' => true, - 'no_blank_lines_after_class_opening' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_closing_tag' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => true, - 'no_homoglyph_names' => true, - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_mixed_echo_print' => ['use' => 'print'], - 'no_null_property_initialization' => true, - 'no_short_bool_cast' => true, - 'no_short_echo_tag' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_after_function_name' => true, - 'no_spaces_inside_parenthesis' => true, - 'no_superfluous_elseif' => true, - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_trailing_whitespace' => true, - 'no_trailing_whitespace_in_comment' => true, - 'no_unneeded_control_parentheses' => true, - 'no_unneeded_curly_braces' => true, - 'no_unneeded_final_method' => true, - 'no_unreachable_default_argument_value' => true, - 'no_unused_imports' => true, - 'no_useless_else' => true, - 'no_whitespace_before_comma_in_array' => true, - 'no_whitespace_in_blank_line' => true, - 'non_printable_character' => true, - 'normalize_index_brace' => true, - 'object_operator_without_whitespace' => true, - 'ordered_class_elements' => [ - 'order' => [ - 'use_trait', - 'constant_public', - 'constant_protected', - 'constant_private', - 'property_public_static', - 'property_protected_static', - 'property_private_static', - 'property_public', - 'property_protected', - 'property_private', - 'method_public_static', - 'construct', - 'destruct', - 'magic', - 'phpunit', - 'method_public', - 'method_protected', - 'method_private', - 'method_protected_static', - 'method_private_static', - ], - ], - 'ordered_imports' => true, - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_align' => true, - 'phpdoc_annotation_without_dot' => true, - 'phpdoc_indent' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_order' => true, - 'phpdoc_return_self_reference' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => true, - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_to_comment' => true, - 'phpdoc_trim' => true, - 'phpdoc_types' => true, - 'phpdoc_types_order' => true, - 'phpdoc_var_without_name' => true, - 'pow_to_exponentiation' => true, - 'protected_to_private' => true, - 'return_type_declaration' => ['space_before' => 'none'], - 'self_accessor' => true, - 'short_scalar_cast' => true, - 'simplified_null_return' => true, - 'single_blank_line_at_eof' => true, - 'single_import_per_statement' => true, - 'single_line_after_imports' => true, - 'single_quote' => true, - 'standardize_not_equals' => true, - 'ternary_to_null_coalescing' => true, - 'trim_array_spaces' => true, - 'unary_operator_spaces' => true, - 'visibility_required' => true, - 'void_return' => true, - 'whitespace_after_comma_in_array' => true, - ] - ) - ->setFinder( - PhpCsFixer\Finder::create() - ->files() - ->in(__DIR__ . '/src') - ->in(__DIR__ . '/tests') - ->notName('*.phpt') - ); diff --git a/vendor/phpunit/php-file-iterator/.travis.yml b/vendor/phpunit/php-file-iterator/.travis.yml deleted file mode 100644 index 16b399c..0000000 --- a/vendor/phpunit/php-file-iterator/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -language: php - -sudo: false - -php: - - 7.1 - - 7.2 - - master - -env: - matrix: - - DEPENDENCIES="high" - - DEPENDENCIES="low" - global: - - DEFAULT_COMPOSER_FLAGS="--no-interaction --no-ansi --no-progress --no-suggest" - -before_install: - - composer self-update - - composer clear-cache - -install: - - if [[ "$DEPENDENCIES" = 'high' ]]; then travis_retry composer update $DEFAULT_COMPOSER_FLAGS; fi - - if [[ "$DEPENDENCIES" = 'low' ]]; then travis_retry composer update $DEFAULT_COMPOSER_FLAGS --prefer-lowest; fi - -script: - - ./vendor/bin/phpunit --coverage-clover=coverage.xml - -after_success: - - bash <(curl -s https://codecov.io/bash) - -notifications: - email: false diff --git a/vendor/phpunit/php-file-iterator/ChangeLog.md b/vendor/phpunit/php-file-iterator/ChangeLog.md deleted file mode 100644 index f4a0801..0000000 --- a/vendor/phpunit/php-file-iterator/ChangeLog.md +++ /dev/null @@ -1,70 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). - -## [2.0.2] - 2018-09-13 - -### Fixed - -* Fixed [#48](https://github.com/sebastianbergmann/php-file-iterator/issues/48): Excluding an array that contains false ends up excluding the current working directory - -## [2.0.1] - 2018-06-11 - -### Fixed - -* Fixed [#46](https://github.com/sebastianbergmann/php-file-iterator/issues/46): Regression with hidden parent directory - -## [2.0.0] - 2018-05-28 - -### Fixed - -* Fixed [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path - -### Changed - -* This component now uses namespaces - -### Removed - -* This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0 - -## [1.4.5] - 2017-11-27 - -### Fixed - -* Fixed [#37](https://github.com/sebastianbergmann/php-file-iterator/issues/37): Regression caused by fix for [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30) - -## [1.4.4] - 2017-11-27 - -### Fixed - -* Fixed [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path - -## [1.4.3] - 2017-11-25 - -### Fixed - -* Fixed [#34](https://github.com/sebastianbergmann/php-file-iterator/issues/34): Factory should use canonical directory names - -## [1.4.2] - 2016-11-26 - -No changes - -## [1.4.1] - 2015-07-26 - -No changes - -## 1.4.0 - 2015-04-02 - -### Added - -* [Added support for wildcards (glob) in exclude](https://github.com/sebastianbergmann/php-file-iterator/pull/23) - -[2.0.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4...master -[1.4.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.4...1.4.5 -[1.4.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.3...1.4.4 -[1.4.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.2...1.4.3 -[1.4.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.0...1.4.1 diff --git a/vendor/phpunit/php-file-iterator/LICENSE b/vendor/phpunit/php-file-iterator/LICENSE deleted file mode 100644 index 87c3b51..0000000 --- a/vendor/phpunit/php-file-iterator/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -php-file-iterator - -Copyright (c) 2009-2018, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-file-iterator/README.md b/vendor/phpunit/php-file-iterator/README.md deleted file mode 100644 index 3cbfdaa..0000000 --- a/vendor/phpunit/php-file-iterator/README.md +++ /dev/null @@ -1,14 +0,0 @@ -[![Build Status](https://travis-ci.org/sebastianbergmann/php-file-iterator.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-file-iterator) - -# php-file-iterator - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phpunit/php-file-iterator - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phpunit/php-file-iterator - diff --git a/vendor/phpunit/php-file-iterator/composer.json b/vendor/phpunit/php-file-iterator/composer.json deleted file mode 100644 index 002e511..0000000 --- a/vendor/phpunit/php-file-iterator/composer.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "phpunit/php-file-iterator", - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "type": "library", - "keywords": [ - "iterator", - "filesystem" - ], - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues" - }, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.1" - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - } -} diff --git a/vendor/phpunit/php-file-iterator/phpunit.xml b/vendor/phpunit/php-file-iterator/phpunit.xml deleted file mode 100644 index 3e12be4..0000000 --- a/vendor/phpunit/php-file-iterator/phpunit.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - tests - - - - - - src - - - diff --git a/vendor/phpunit/php-file-iterator/src/Facade.php b/vendor/phpunit/php-file-iterator/src/Facade.php deleted file mode 100644 index 2456e16..0000000 --- a/vendor/phpunit/php-file-iterator/src/Facade.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace SebastianBergmann\FileIterator; - -class Facade -{ - /** - * @param array|string $paths - * @param array|string $suffixes - * @param array|string $prefixes - * @param array $exclude - * @param bool $commonPath - * - * @return array - */ - public function getFilesAsArray($paths, $suffixes = '', $prefixes = '', array $exclude = [], bool $commonPath = false): array - { - if (\is_string($paths)) { - $paths = [$paths]; - } - - $factory = new Factory; - - $iterator = $factory->getFileIterator($paths, $suffixes, $prefixes, $exclude); - - $files = []; - - foreach ($iterator as $file) { - $file = $file->getRealPath(); - - if ($file) { - $files[] = $file; - } - } - - foreach ($paths as $path) { - if (\is_file($path)) { - $files[] = \realpath($path); - } - } - - $files = \array_unique($files); - \sort($files); - - if ($commonPath) { - return [ - 'commonPath' => $this->getCommonPath($files), - 'files' => $files - ]; - } - - return $files; - } - - protected function getCommonPath(array $files): string - { - $count = \count($files); - - if ($count === 0) { - return ''; - } - - if ($count === 1) { - return \dirname($files[0]) . DIRECTORY_SEPARATOR; - } - - $_files = []; - - foreach ($files as $file) { - $_files[] = $_fileParts = \explode(DIRECTORY_SEPARATOR, $file); - - if (empty($_fileParts[0])) { - $_fileParts[0] = DIRECTORY_SEPARATOR; - } - } - - $common = ''; - $done = false; - $j = 0; - $count--; - - while (!$done) { - for ($i = 0; $i < $count; $i++) { - if ($_files[$i][$j] != $_files[$i + 1][$j]) { - $done = true; - - break; - } - } - - if (!$done) { - $common .= $_files[0][$j]; - - if ($j > 0) { - $common .= DIRECTORY_SEPARATOR; - } - } - - $j++; - } - - return DIRECTORY_SEPARATOR . $common; - } -} diff --git a/vendor/phpunit/php-file-iterator/src/Factory.php b/vendor/phpunit/php-file-iterator/src/Factory.php deleted file mode 100644 index 02e2f38..0000000 --- a/vendor/phpunit/php-file-iterator/src/Factory.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace SebastianBergmann\FileIterator; - -class Factory -{ - /** - * @param array|string $paths - * @param array|string $suffixes - * @param array|string $prefixes - * @param array $exclude - * - * @return \AppendIterator - */ - public function getFileIterator($paths, $suffixes = '', $prefixes = '', array $exclude = []): \AppendIterator - { - if (\is_string($paths)) { - $paths = [$paths]; - } - - $paths = $this->getPathsAfterResolvingWildcards($paths); - $exclude = $this->getPathsAfterResolvingWildcards($exclude); - - if (\is_string($prefixes)) { - if ($prefixes !== '') { - $prefixes = [$prefixes]; - } else { - $prefixes = []; - } - } - - if (\is_string($suffixes)) { - if ($suffixes !== '') { - $suffixes = [$suffixes]; - } else { - $suffixes = []; - } - } - - $iterator = new \AppendIterator; - - foreach ($paths as $path) { - if (\is_dir($path)) { - $iterator->append( - new Iterator( - $path, - new \RecursiveIteratorIterator( - new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::FOLLOW_SYMLINKS | \RecursiveDirectoryIterator::SKIP_DOTS) - ), - $suffixes, - $prefixes, - $exclude - ) - ); - } - } - - return $iterator; - } - - protected function getPathsAfterResolvingWildcards(array $paths): array - { - $_paths = []; - - foreach ($paths as $path) { - if ($locals = \glob($path, GLOB_ONLYDIR)) { - $_paths = \array_merge($_paths, \array_map('\realpath', $locals)); - } else { - $_paths[] = \realpath($path); - } - } - - return \array_filter($_paths); - } -} diff --git a/vendor/phpunit/php-file-iterator/src/Iterator.php b/vendor/phpunit/php-file-iterator/src/Iterator.php deleted file mode 100644 index 84882d4..0000000 --- a/vendor/phpunit/php-file-iterator/src/Iterator.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace SebastianBergmann\FileIterator; - -class Iterator extends \FilterIterator -{ - const PREFIX = 0; - const SUFFIX = 1; - - /** - * @var string - */ - private $basePath; - - /** - * @var array - */ - private $suffixes = []; - - /** - * @var array - */ - private $prefixes = []; - - /** - * @var array - */ - private $exclude = []; - - /** - * @param string $basePath - * @param \Iterator $iterator - * @param array $suffixes - * @param array $prefixes - * @param array $exclude - */ - public function __construct(string $basePath, \Iterator $iterator, array $suffixes = [], array $prefixes = [], array $exclude = []) - { - $this->basePath = \realpath($basePath); - $this->prefixes = $prefixes; - $this->suffixes = $suffixes; - $this->exclude = \array_filter(\array_map('realpath', $exclude)); - - parent::__construct($iterator); - } - - public function accept() - { - $current = $this->getInnerIterator()->current(); - $filename = $current->getFilename(); - $realPath = $current->getRealPath(); - - return $this->acceptPath($realPath) && - $this->acceptPrefix($filename) && - $this->acceptSuffix($filename); - } - - private function acceptPath(string $path): bool - { - // Filter files in hidden directories by checking path that is relative to the base path. - if (\preg_match('=/\.[^/]*/=', \str_replace($this->basePath, '', $path))) { - return false; - } - - foreach ($this->exclude as $exclude) { - if (\strpos($path, $exclude) === 0) { - return false; - } - } - - return true; - } - - private function acceptPrefix(string $filename): bool - { - return $this->acceptSubString($filename, $this->prefixes, self::PREFIX); - } - - private function acceptSuffix(string $filename): bool - { - return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX); - } - - private function acceptSubString(string $filename, array $subStrings, int $type): bool - { - if (empty($subStrings)) { - return true; - } - - $matched = false; - - foreach ($subStrings as $string) { - if (($type === self::PREFIX && \strpos($filename, $string) === 0) || - ($type === self::SUFFIX && - \substr($filename, -1 * \strlen($string)) === $string)) { - $matched = true; - - break; - } - } - - return $matched; - } -} diff --git a/vendor/phpunit/php-file-iterator/tests/FactoryTest.php b/vendor/phpunit/php-file-iterator/tests/FactoryTest.php deleted file mode 100644 index ba4bdbf..0000000 --- a/vendor/phpunit/php-file-iterator/tests/FactoryTest.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\FileIterator; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \SebastianBergmann\FileIterator\Factory - */ -class FactoryTest extends TestCase -{ - /** - * @var string - */ - private $root; - - /** - * @var Factory - */ - private $factory; - - protected function setUp(): void - { - $this->root = __DIR__; - $this->factory = new Factory; - } - - public function testFindFilesInTestDirectory(): void - { - $iterator = $this->factory->getFileIterator($this->root, 'Test.php'); - $files = \iterator_to_array($iterator); - - $this->assertGreaterThanOrEqual(1, \count($files)); - } - - public function testFindFilesWithExcludedNonExistingSubdirectory(): void - { - $iterator = $this->factory->getFileIterator($this->root, 'Test.php', '', [$this->root . '/nonExistingDir']); - $files = \iterator_to_array($iterator); - - $this->assertGreaterThanOrEqual(1, \count($files)); - } -} diff --git a/vendor/phpunit/php-text-template/.gitattributes b/vendor/phpunit/php-text-template/.gitattributes deleted file mode 100644 index 461090b..0000000 --- a/vendor/phpunit/php-text-template/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.php diff=php diff --git a/vendor/phpunit/php-text-template/.gitignore b/vendor/phpunit/php-text-template/.gitignore deleted file mode 100644 index c599212..0000000 --- a/vendor/phpunit/php-text-template/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/composer.lock -/composer.phar -/.idea -/vendor - diff --git a/vendor/phpunit/php-text-template/LICENSE b/vendor/phpunit/php-text-template/LICENSE deleted file mode 100644 index 9f9a32d..0000000 --- a/vendor/phpunit/php-text-template/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -Text_Template - -Copyright (c) 2009-2015, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-text-template/README.md b/vendor/phpunit/php-text-template/README.md deleted file mode 100644 index ec8f593..0000000 --- a/vendor/phpunit/php-text-template/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Text_Template - -## Installation - -## Installation - -To add this package as a local, per-project dependency to your project, simply add a dependency on `phpunit/php-text-template` to your project's `composer.json` file. Here is a minimal example of a `composer.json` file that just defines a dependency on Text_Template: - - { - "require": { - "phpunit/php-text-template": "~1.2" - } - } - diff --git a/vendor/phpunit/php-text-template/composer.json b/vendor/phpunit/php-text-template/composer.json deleted file mode 100644 index a5779c8..0000000 --- a/vendor/phpunit/php-text-template/composer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "phpunit/php-text-template", - "description": "Simple template engine.", - "type": "library", - "keywords": [ - "template" - ], - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues" - }, - "require": { - "php": ">=5.3.3" - }, - "autoload": { - "classmap": [ - "src/" - ] - } -} - diff --git a/vendor/phpunit/php-text-template/src/Template.php b/vendor/phpunit/php-text-template/src/Template.php deleted file mode 100644 index 9eb39ad..0000000 --- a/vendor/phpunit/php-text-template/src/Template.php +++ /dev/null @@ -1,135 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * A simple template engine. - * - * @since Class available since Release 1.0.0 - */ -class Text_Template -{ - /** - * @var string - */ - protected $template = ''; - - /** - * @var string - */ - protected $openDelimiter = '{'; - - /** - * @var string - */ - protected $closeDelimiter = '}'; - - /** - * @var array - */ - protected $values = array(); - - /** - * Constructor. - * - * @param string $file - * @throws InvalidArgumentException - */ - public function __construct($file = '', $openDelimiter = '{', $closeDelimiter = '}') - { - $this->setFile($file); - $this->openDelimiter = $openDelimiter; - $this->closeDelimiter = $closeDelimiter; - } - - /** - * Sets the template file. - * - * @param string $file - * @throws InvalidArgumentException - */ - public function setFile($file) - { - $distFile = $file . '.dist'; - - if (file_exists($file)) { - $this->template = file_get_contents($file); - } - - else if (file_exists($distFile)) { - $this->template = file_get_contents($distFile); - } - - else { - throw new InvalidArgumentException( - 'Template file could not be loaded.' - ); - } - } - - /** - * Sets one or more template variables. - * - * @param array $values - * @param bool $merge - */ - public function setVar(array $values, $merge = TRUE) - { - if (!$merge || empty($this->values)) { - $this->values = $values; - } else { - $this->values = array_merge($this->values, $values); - } - } - - /** - * Renders the template and returns the result. - * - * @return string - */ - public function render() - { - $keys = array(); - - foreach ($this->values as $key => $value) { - $keys[] = $this->openDelimiter . $key . $this->closeDelimiter; - } - - return str_replace($keys, $this->values, $this->template); - } - - /** - * Renders the template and writes the result to a file. - * - * @param string $target - */ - public function renderTo($target) - { - $fp = @fopen($target, 'wt'); - - if ($fp) { - fwrite($fp, $this->render()); - fclose($fp); - } else { - $error = error_get_last(); - - throw new RuntimeException( - sprintf( - 'Could not write to %s: %s', - $target, - substr( - $error['message'], - strpos($error['message'], ':') + 2 - ) - ) - ); - } - } -} - diff --git a/vendor/phpunit/php-timer/.gitattributes b/vendor/phpunit/php-timer/.gitattributes deleted file mode 100644 index 461090b..0000000 --- a/vendor/phpunit/php-timer/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.php diff=php diff --git a/vendor/phpunit/php-timer/.github/FUNDING.yml b/vendor/phpunit/php-timer/.github/FUNDING.yml deleted file mode 100644 index b19ea81..0000000 --- a/vendor/phpunit/php-timer/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -patreon: s_bergmann diff --git a/vendor/phpunit/php-timer/.github/stale.yml b/vendor/phpunit/php-timer/.github/stale.yml deleted file mode 100644 index 4eadca3..0000000 --- a/vendor/phpunit/php-timer/.github/stale.yml +++ /dev/null @@ -1,40 +0,0 @@ -# Configuration for probot-stale - https://github.com/probot/stale - -# Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 60 - -# Number of days of inactivity before a stale Issue or Pull Request is closed. -# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. -daysUntilClose: 7 - -# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable -exemptLabels: - - enhancement - -# Set to true to ignore issues in a project (defaults to false) -exemptProjects: false - -# Set to true to ignore issues in a milestone (defaults to false) -exemptMilestones: false - -# Label to use when marking as stale -staleLabel: stale - -# Comment to post when marking as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had activity within the last 60 days. It will be closed after 7 days if no further activity occurs. Thank you for your contributions. - -# Comment to post when removing the stale label. -# unmarkComment: > -# Your comment here. - -# Comment to post when closing a stale Issue or Pull Request. -closeComment: > - This issue has been automatically closed because it has not had activity since it was marked as stale. Thank you for your contributions. - -# Limit the number of actions per hour, from 1-30. Default is 30 -limitPerRun: 30 - -# Limit to only `issues` or `pulls` -only: issues - diff --git a/vendor/phpunit/php-timer/.gitignore b/vendor/phpunit/php-timer/.gitignore deleted file mode 100644 index 953d2a2..0000000 --- a/vendor/phpunit/php-timer/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/.idea -/.php_cs.cache -/vendor -/composer.lock - diff --git a/vendor/phpunit/php-timer/.php_cs.dist b/vendor/phpunit/php-timer/.php_cs.dist deleted file mode 100644 index c442264..0000000 --- a/vendor/phpunit/php-timer/.php_cs.dist +++ /dev/null @@ -1,197 +0,0 @@ - - -For the full copyright and license information, please view the LICENSE -file that was distributed with this source code. -EOF; - -return PhpCsFixer\Config::create() - ->setRiskyAllowed(true) - ->setRules( - [ - 'align_multiline_comment' => true, - 'array_indentation' => true, - 'array_syntax' => ['syntax' => 'short'], - 'binary_operator_spaces' => [ - 'operators' => [ - '=' => 'align', - '=>' => 'align', - ], - ], - 'blank_line_after_namespace' => true, - 'blank_line_before_statement' => [ - 'statements' => [ - 'break', - 'continue', - 'declare', - 'do', - 'for', - 'foreach', - 'if', - 'include', - 'include_once', - 'require', - 'require_once', - 'return', - 'switch', - 'throw', - 'try', - 'while', - 'yield', - ], - ], - 'braces' => true, - 'cast_spaces' => true, - 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], - 'combine_consecutive_issets' => true, - 'combine_consecutive_unsets' => true, - 'compact_nullable_typehint' => true, - 'concat_space' => ['spacing' => 'one'], - 'declare_equal_normalize' => ['space' => 'none'], - 'declare_strict_types' => true, - 'dir_constant' => true, - 'elseif' => true, - 'encoding' => true, - 'full_opening_tag' => true, - 'function_declaration' => true, - 'header_comment' => ['header' => $header, 'separate' => 'none'], - 'indentation_type' => true, - 'is_null' => true, - 'line_ending' => true, - 'list_syntax' => ['syntax' => 'short'], - 'logical_operators' => true, - 'lowercase_cast' => true, - 'lowercase_constants' => true, - 'lowercase_keywords' => true, - 'lowercase_static_reference' => true, - 'magic_constant_casing' => true, - 'method_argument_space' => ['ensure_fully_multiline' => true], - 'modernize_types_casting' => true, - 'multiline_comment_opening_closing' => true, - 'multiline_whitespace_before_semicolons' => true, - 'native_constant_invocation' => true, - 'native_function_casing' => true, - 'native_function_invocation' => true, - 'new_with_braces' => false, - 'no_alias_functions' => true, - 'no_alternative_syntax' => true, - 'no_blank_lines_after_class_opening' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_blank_lines_before_namespace' => true, - 'no_closing_tag' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => true, - 'no_homoglyph_names' => true, - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_mixed_echo_print' => ['use' => 'print'], - 'no_multiline_whitespace_around_double_arrow' => true, - 'no_null_property_initialization' => true, - 'no_php4_constructor' => true, - 'no_short_bool_cast' => true, - 'no_short_echo_tag' => true, - 'no_singleline_whitespace_before_semicolons' => true, - 'no_spaces_after_function_name' => true, - 'no_spaces_inside_parenthesis' => true, - 'no_superfluous_elseif' => true, - 'no_superfluous_phpdoc_tags' => true, - 'no_trailing_comma_in_list_call' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_trailing_whitespace' => true, - 'no_trailing_whitespace_in_comment' => true, - 'no_unneeded_control_parentheses' => true, - 'no_unneeded_curly_braces' => true, - 'no_unneeded_final_method' => true, - 'no_unreachable_default_argument_value' => true, - 'no_unset_on_property' => true, - 'no_unused_imports' => true, - 'no_useless_else' => true, - 'no_useless_return' => true, - 'no_whitespace_before_comma_in_array' => true, - 'no_whitespace_in_blank_line' => true, - 'non_printable_character' => true, - 'normalize_index_brace' => true, - 'object_operator_without_whitespace' => true, - 'ordered_class_elements' => [ - 'order' => [ - 'use_trait', - 'constant_public', - 'constant_protected', - 'constant_private', - 'property_public_static', - 'property_protected_static', - 'property_private_static', - 'property_public', - 'property_protected', - 'property_private', - 'method_public_static', - 'construct', - 'destruct', - 'magic', - 'phpunit', - 'method_public', - 'method_protected', - 'method_private', - 'method_protected_static', - 'method_private_static', - ], - ], - 'ordered_imports' => true, - 'phpdoc_add_missing_param_annotation' => true, - 'phpdoc_align' => true, - 'phpdoc_annotation_without_dot' => true, - 'phpdoc_indent' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_empty_return' => true, - 'phpdoc_no_package' => true, - 'phpdoc_order' => true, - 'phpdoc_return_self_reference' => true, - 'phpdoc_scalar' => true, - 'phpdoc_separation' => true, - 'phpdoc_single_line_var_spacing' => true, - 'phpdoc_to_comment' => true, - 'phpdoc_trim' => true, - 'phpdoc_trim_consecutive_blank_line_separation' => true, - 'phpdoc_types' => ['groups' => ['simple', 'meta']], - 'phpdoc_types_order' => true, - 'phpdoc_var_without_name' => true, - 'pow_to_exponentiation' => true, - 'protected_to_private' => true, - 'return_assignment' => true, - 'return_type_declaration' => ['space_before' => 'none'], - 'self_accessor' => true, - 'semicolon_after_instruction' => true, - 'set_type_to_cast' => true, - 'short_scalar_cast' => true, - 'simplified_null_return' => true, - 'single_blank_line_at_eof' => true, - 'single_import_per_statement' => true, - 'single_line_after_imports' => true, - 'single_quote' => true, - 'standardize_not_equals' => true, - 'ternary_to_null_coalescing' => true, - 'trailing_comma_in_multiline_array' => true, - 'trim_array_spaces' => true, - 'unary_operator_spaces' => true, - 'visibility_required' => [ - 'elements' => [ - 'const', - 'method', - 'property', - ], - ], - 'void_return' => true, - 'whitespace_after_comma_in_array' => true, - ] - ) - ->setFinder( - PhpCsFixer\Finder::create() - ->files() - ->in(__DIR__ . '/src') - ->in(__DIR__ . '/tests') - ); diff --git a/vendor/phpunit/php-timer/.travis.yml b/vendor/phpunit/php-timer/.travis.yml deleted file mode 100644 index a217292..0000000 --- a/vendor/phpunit/php-timer/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: php - -php: - - 7.1 - - 7.2 - - 7.3 - - 7.4snapshot - -before_install: - - composer self-update - - composer clear-cache - -install: - - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest - -script: - - ./vendor/bin/phpunit --coverage-clover=coverage.xml - -after_success: - - bash <(curl -s https://codecov.io/bash) - -notifications: - email: false diff --git a/vendor/phpunit/php-timer/ChangeLog.md b/vendor/phpunit/php-timer/ChangeLog.md deleted file mode 100644 index 6ebc9fe..0000000 --- a/vendor/phpunit/php-timer/ChangeLog.md +++ /dev/null @@ -1,36 +0,0 @@ -# ChangeLog - -All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [2.1.2] - 2019-06-07 - -### Fixed - -* Fixed [#21](https://github.com/sebastianbergmann/php-timer/pull/3352): Formatting of memory consumption does not work on 32bit systems - -## [2.1.1] - 2019-02-20 - -### Changed - -* Improved formatting of memory consumption for `resourceUsage()` - -## [2.1.0] - 2019-02-20 - -### Changed - -* Improved formatting of memory consumption for `resourceUsage()` - -## [2.0.0] - 2018-02-01 - -### Changed - -* This component now uses namespaces - -### Removed - -* This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0 - -[2.1.2]: https://github.com/sebastianbergmann/diff/compare/2.1.1...2.1.2 -[2.1.1]: https://github.com/sebastianbergmann/diff/compare/2.1.0...2.1.1 -[2.1.0]: https://github.com/sebastianbergmann/diff/compare/2.0.0...2.1.0 -[2.0.0]: https://github.com/sebastianbergmann/diff/compare/1.0.9...2.0.0 diff --git a/vendor/phpunit/php-timer/LICENSE b/vendor/phpunit/php-timer/LICENSE deleted file mode 100644 index a4eb944..0000000 --- a/vendor/phpunit/php-timer/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -phpunit/php-timer - -Copyright (c) 2010-2019, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-timer/README.md b/vendor/phpunit/php-timer/README.md deleted file mode 100644 index 61725c2..0000000 --- a/vendor/phpunit/php-timer/README.md +++ /dev/null @@ -1,49 +0,0 @@ -[![Build Status](https://travis-ci.org/sebastianbergmann/php-timer.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-timer) - -# phpunit/php-timer - -Utility class for timing things, factored out of PHPUnit into a stand-alone component. - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phpunit/php-timer - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phpunit/php-timer - -## Usage - -### Basic Timing - -```php -use SebastianBergmann\Timer\Timer; - -Timer::start(); - -// ... - -$time = Timer::stop(); -var_dump($time); - -print Timer::secondsToTimeString($time); -``` - -The code above yields the output below: - - double(1.0967254638672E-5) - 0 ms - -### Resource Consumption Since PHP Startup - -```php -use SebastianBergmann\Timer\Timer; - -print Timer::resourceUsage(); -``` - -The code above yields the output below: - - Time: 0 ms, Memory: 0.50MB diff --git a/vendor/phpunit/php-timer/build.xml b/vendor/phpunit/php-timer/build.xml deleted file mode 100644 index b8d3256..0000000 --- a/vendor/phpunit/php-timer/build.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/php-timer/composer.json b/vendor/phpunit/php-timer/composer.json deleted file mode 100644 index d400ad7..0000000 --- a/vendor/phpunit/php-timer/composer.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "phpunit/php-timer", - "description": "Utility class for timing", - "type": "library", - "keywords": [ - "timer" - ], - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues" - }, - "prefer-stable": true, - "require": { - "php": "^7.1" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "config": { - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - } -} - diff --git a/vendor/phpunit/php-timer/phpunit.xml b/vendor/phpunit/php-timer/phpunit.xml deleted file mode 100644 index 28a95de..0000000 --- a/vendor/phpunit/php-timer/phpunit.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - tests - - - - - src - - - diff --git a/vendor/phpunit/php-timer/src/Exception.php b/vendor/phpunit/php-timer/src/Exception.php deleted file mode 100644 index 7f9a26b..0000000 --- a/vendor/phpunit/php-timer/src/Exception.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -interface Exception -{ -} diff --git a/vendor/phpunit/php-timer/src/RuntimeException.php b/vendor/phpunit/php-timer/src/RuntimeException.php deleted file mode 100644 index aff06fa..0000000 --- a/vendor/phpunit/php-timer/src/RuntimeException.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/php-timer/src/Timer.php b/vendor/phpunit/php-timer/src/Timer.php deleted file mode 100644 index 378ff72..0000000 --- a/vendor/phpunit/php-timer/src/Timer.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -final class Timer -{ - /** - * @var int[] - */ - private static $sizes = [ - 'GB' => 1073741824, - 'MB' => 1048576, - 'KB' => 1024, - ]; - - /** - * @var int[] - */ - private static $times = [ - 'hour' => 3600000, - 'minute' => 60000, - 'second' => 1000, - ]; - - /** - * @var float[] - */ - private static $startTimes = []; - - public static function start(): void - { - self::$startTimes[] = \microtime(true); - } - - public static function stop(): float - { - return \microtime(true) - \array_pop(self::$startTimes); - } - - public static function bytesToString(float $bytes): string - { - foreach (self::$sizes as $unit => $value) { - if ($bytes >= $value) { - return \sprintf('%.2f %s', $bytes >= 1024 ? $bytes / $value : $bytes, $unit); - } - } - - return $bytes . ' byte' . ((int) $bytes !== 1 ? 's' : ''); - } - - public static function secondsToTimeString(float $time): string - { - $ms = \round($time * 1000); - - foreach (self::$times as $unit => $value) { - if ($ms >= $value) { - $time = \floor($ms / $value * 100.0) / 100.0; - - return $time . ' ' . ($time == 1 ? $unit : $unit . 's'); - } - } - - return $ms . ' ms'; - } - - /** - * @throws RuntimeException - */ - public static function timeSinceStartOfRequest(): string - { - if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { - $startOfRequest = $_SERVER['REQUEST_TIME_FLOAT']; - } elseif (isset($_SERVER['REQUEST_TIME'])) { - $startOfRequest = $_SERVER['REQUEST_TIME']; - } else { - throw new RuntimeException('Cannot determine time at which the request started'); - } - - return self::secondsToTimeString(\microtime(true) - $startOfRequest); - } - - /** - * @throws RuntimeException - */ - public static function resourceUsage(): string - { - return \sprintf( - 'Time: %s, Memory: %s', - self::timeSinceStartOfRequest(), - self::bytesToString(\memory_get_peak_usage(true)) - ); - } -} diff --git a/vendor/phpunit/php-timer/tests/TimerTest.php b/vendor/phpunit/php-timer/tests/TimerTest.php deleted file mode 100644 index 93cc474..0000000 --- a/vendor/phpunit/php-timer/tests/TimerTest.php +++ /dev/null @@ -1,134 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace SebastianBergmann\Timer; - -use PHPUnit\Framework\TestCase; - -/** - * @covers \SebastianBergmann\Timer\Timer - */ -final class TimerTest extends TestCase -{ - public function testCanBeStartedAndStopped(): void - { - $this->assertIsFloat(Timer::stop()); - } - - public function testCanFormatTimeSinceStartOfRequest(): void - { - $this->assertStringMatchesFormat('%f %s', Timer::timeSinceStartOfRequest()); - } - - /** - * @backupGlobals enabled - */ - public function testCanFormatSinceStartOfRequestWhenRequestTimeIsNotAvailableAsFloat(): void - { - if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { - unset($_SERVER['REQUEST_TIME_FLOAT']); - } - - $this->assertStringMatchesFormat('%f %s', Timer::timeSinceStartOfRequest()); - } - - /** - * @backupGlobals enabled - */ - public function testCannotFormatTimeSinceStartOfRequestWhenRequestTimeIsNotAvailable(): void - { - if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { - unset($_SERVER['REQUEST_TIME_FLOAT']); - } - - if (isset($_SERVER['REQUEST_TIME'])) { - unset($_SERVER['REQUEST_TIME']); - } - - $this->expectException(RuntimeException::class); - - Timer::timeSinceStartOfRequest(); - } - - public function testCanFormatResourceUsage(): void - { - $this->assertStringMatchesFormat('Time: %s, Memory: %f %s', Timer::resourceUsage()); - } - - /** - * @dataProvider secondsProvider - */ - public function testCanFormatSecondsAsString(string $string, float $seconds): void - { - $this->assertEquals($string, Timer::secondsToTimeString($seconds)); - } - - public function secondsProvider(): array - { - return [ - ['0 ms', 0], - ['1 ms', .001], - ['10 ms', .01], - ['100 ms', .1], - ['999 ms', .999], - ['1 second', .9999], - ['1 second', 1], - ['2 seconds', 2], - ['59.9 seconds', 59.9], - ['59.99 seconds', 59.99], - ['59.99 seconds', 59.999], - ['1 minute', 59.9999], - ['59 seconds', 59.001], - ['59.01 seconds', 59.01], - ['1 minute', 60], - ['1.01 minutes', 61], - ['2 minutes', 120], - ['2.01 minutes', 121], - ['59.99 minutes', 3599.9], - ['59.99 minutes', 3599.99], - ['59.99 minutes', 3599.999], - ['1 hour', 3599.9999], - ['59.98 minutes', 3599.001], - ['59.98 minutes', 3599.01], - ['1 hour', 3600], - ['1 hour', 3601], - ['1 hour', 3601.9], - ['1 hour', 3601.99], - ['1 hour', 3601.999], - ['1 hour', 3601.9999], - ['1.01 hours', 3659.9999], - ['1.01 hours', 3659.001], - ['1.01 hours', 3659.01], - ['2 hours', 7199.9999], - ]; - } - - /** - * @dataProvider bytesProvider - */ - public function testCanFormatBytesAsString(string $string, float $bytes): void - { - $this->assertEquals($string, Timer::bytesToString($bytes)); - } - - public function bytesProvider(): array - { - return [ - ['0 bytes', 0], - ['1 byte', 1], - ['1023 bytes', 1023], - ['1.00 KB', 1024], - ['1.50 KB', 1.5 * 1024], - ['2.00 MB', 2 * 1048576], - ['2.50 MB', 2.5 * 1048576], - ['3.00 GB', 3 * 1073741824], - ['3.50 GB', 3.5 * 1073741824], - ]; - } -} diff --git a/vendor/phpunit/php-token-stream/.gitattributes b/vendor/phpunit/php-token-stream/.gitattributes deleted file mode 100644 index 461090b..0000000 --- a/vendor/phpunit/php-token-stream/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.php diff=php diff --git a/vendor/phpunit/php-token-stream/.github/FUNDING.yml b/vendor/phpunit/php-token-stream/.github/FUNDING.yml deleted file mode 100644 index b19ea81..0000000 --- a/vendor/phpunit/php-token-stream/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -patreon: s_bergmann diff --git a/vendor/phpunit/php-token-stream/.gitignore b/vendor/phpunit/php-token-stream/.gitignore deleted file mode 100644 index 77aae3d..0000000 --- a/vendor/phpunit/php-token-stream/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/.idea -/composer.lock -/vendor diff --git a/vendor/phpunit/php-token-stream/.travis.yml b/vendor/phpunit/php-token-stream/.travis.yml deleted file mode 100644 index 4e8056d..0000000 --- a/vendor/phpunit/php-token-stream/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: php - -php: - - 7.1 - - 7.2 - - 7.3 - - 7.4snapshot - -sudo: false - -before_install: - - composer self-update - - composer clear-cache - -install: - - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest - -script: - - ./vendor/bin/phpunit --coverage-clover=coverage.xml - -after_success: - - bash <(curl -s https://codecov.io/bash) - -notifications: - email: false - diff --git a/vendor/phpunit/php-token-stream/ChangeLog.md b/vendor/phpunit/php-token-stream/ChangeLog.md deleted file mode 100644 index 884fd1f..0000000 --- a/vendor/phpunit/php-token-stream/ChangeLog.md +++ /dev/null @@ -1,57 +0,0 @@ -# Change Log - -All notable changes to `sebastianbergmann/php-token-stream` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. - -## [3.1.1] - 2019-09-17 - -### Fixed - -* Fixed [#84](https://github.com/sebastianbergmann/php-token-stream/issues/84): Methods named `class` are not handled correctly - -## [3.1.0] - 2019-07-25 - -### Added - -* Added support for `FN` and `COALESCE_EQUAL` tokens introduced in PHP 7.4 - -## [3.0.2] - 2019-07-08 - -### Changed - -* Implemented [#82](https://github.com/sebastianbergmann/php-token-stream/issues/82): Make sure this component works when its classes are prefixed using php-scoper - -## [3.0.1] - 2018-10-30 - -### Fixed - -* Fixed [#78](https://github.com/sebastianbergmann/php-token-stream/pull/78): `getEndTokenId()` does not handle string-dollar (`"${var}"`) interpolation - -## [3.0.0] - 2018-02-01 - -### Removed - -* Implemented [#71](https://github.com/sebastianbergmann/php-token-stream/issues/71): Remove code specific to Hack language constructs -* Implemented [#72](https://github.com/sebastianbergmann/php-token-stream/issues/72): Drop support for PHP 7.0 - -## [2.0.2] - 2017-11-27 - -### Fixed - -* Fixed [#69](https://github.com/sebastianbergmann/php-token-stream/issues/69): `PHP_Token_USE_FUNCTION` does not serialize correctly - -## [2.0.1] - 2017-08-20 - -### Fixed - -* Fixed [#68](https://github.com/sebastianbergmann/php-token-stream/issues/68): Method with name `empty` wrongly recognized as anonymous function - -## [2.0.0] - 2017-08-03 - -[3.1.1]: https://github.com/sebastianbergmann/php-token-stream/compare/3.1.0...3.1.1 -[3.1.0]: https://github.com/sebastianbergmann/php-token-stream/compare/3.0.2...3.1.0 -[3.0.2]: https://github.com/sebastianbergmann/php-token-stream/compare/3.0.1...3.0.2 -[3.0.1]: https://github.com/sebastianbergmann/php-token-stream/compare/3.0.0...3.0.1 -[3.0.0]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0...3.0.0 -[2.0.2]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/sebastianbergmann/php-token-stream/compare/1.4.11...2.0.0 diff --git a/vendor/phpunit/php-token-stream/LICENSE b/vendor/phpunit/php-token-stream/LICENSE deleted file mode 100644 index 2cad5be..0000000 --- a/vendor/phpunit/php-token-stream/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -php-token-stream - -Copyright (c) 2009-2019, Sebastian Bergmann . -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/php-token-stream/README.md b/vendor/phpunit/php-token-stream/README.md deleted file mode 100644 index 149b7e2..0000000 --- a/vendor/phpunit/php-token-stream/README.md +++ /dev/null @@ -1,14 +0,0 @@ -[![Build Status](https://travis-ci.org/sebastianbergmann/php-token-stream.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-token-stream) - -# php-token-stream - -## Installation - -You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): - - composer require phpunit/php-token-stream - -If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: - - composer require --dev phpunit/php-token-stream - diff --git a/vendor/phpunit/php-token-stream/build.xml b/vendor/phpunit/php-token-stream/build.xml deleted file mode 100644 index 0da8056..0000000 --- a/vendor/phpunit/php-token-stream/build.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/php-token-stream/composer.json b/vendor/phpunit/php-token-stream/composer.json deleted file mode 100644 index f50e937..0000000 --- a/vendor/phpunit/php-token-stream/composer.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "phpunit/php-token-stream", - "description": "Wrapper around PHP's tokenizer extension.", - "type": "library", - "keywords": ["tokenizer"], - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues" - }, - "prefer-stable": true, - "require": { - "php": "^7.1", - "ext-tokenizer": "*" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "config": { - "optimize-autoloader": true, - "sort-packages": true - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - } -} diff --git a/vendor/phpunit/php-token-stream/phpunit.xml b/vendor/phpunit/php-token-stream/phpunit.xml deleted file mode 100644 index 8f159fb..0000000 --- a/vendor/phpunit/php-token-stream/phpunit.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - tests - - - - - - src - - - diff --git a/vendor/phpunit/php-token-stream/src/Token.php b/vendor/phpunit/php-token-stream/src/Token.php deleted file mode 100644 index 65fdb06..0000000 --- a/vendor/phpunit/php-token-stream/src/Token.php +++ /dev/null @@ -1,1361 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * A PHP token. - */ -abstract class PHP_Token -{ - /** - * @var string - */ - protected $text; - - /** - * @var int - */ - protected $line; - - /** - * @var PHP_Token_Stream - */ - protected $tokenStream; - - /** - * @var int - */ - protected $id; - - /** - * @param string $text - * @param int $line - * @param PHP_Token_Stream $tokenStream - * @param int $id - */ - public function __construct($text, $line, PHP_Token_Stream $tokenStream, $id) - { - $this->text = $text; - $this->line = $line; - $this->tokenStream = $tokenStream; - $this->id = $id; - } - - /** - * @return string - */ - public function __toString() - { - return $this->text; - } - - /** - * @return int - */ - public function getLine() - { - return $this->line; - } - - /** - * @return int - */ - public function getId() - { - return $this->id; - } -} - -abstract class PHP_TokenWithScope extends PHP_Token -{ - /** - * @var int - */ - protected $endTokenId; - - /** - * Get the docblock for this token - * - * This method will fetch the docblock belonging to the current token. The - * docblock must be placed on the line directly above the token to be - * recognized. - * - * @return string|null Returns the docblock as a string if found - */ - public function getDocblock() - { - $tokens = $this->tokenStream->tokens(); - $currentLineNumber = $tokens[$this->id]->getLine(); - $prevLineNumber = $currentLineNumber - 1; - - for ($i = $this->id - 1; $i; $i--) { - if (!isset($tokens[$i])) { - return; - } - - if ($tokens[$i] instanceof PHP_Token_FUNCTION || - $tokens[$i] instanceof PHP_Token_CLASS || - $tokens[$i] instanceof PHP_Token_TRAIT) { - // Some other trait, class or function, no docblock can be - // used for the current token - break; - } - - $line = $tokens[$i]->getLine(); - - if ($line == $currentLineNumber || - ($line == $prevLineNumber && - $tokens[$i] instanceof PHP_Token_WHITESPACE)) { - continue; - } - - if ($line < $currentLineNumber && - !$tokens[$i] instanceof PHP_Token_DOC_COMMENT) { - break; - } - - return (string) $tokens[$i]; - } - } - - /** - * @return int - */ - public function getEndTokenId() - { - $block = 0; - $i = $this->id; - $tokens = $this->tokenStream->tokens(); - - while ($this->endTokenId === null && isset($tokens[$i])) { - if ($tokens[$i] instanceof PHP_Token_OPEN_CURLY || - $tokens[$i] instanceof PHP_Token_DOLLAR_OPEN_CURLY_BRACES || - $tokens[$i] instanceof PHP_Token_CURLY_OPEN) { - $block++; - } elseif ($tokens[$i] instanceof PHP_Token_CLOSE_CURLY) { - $block--; - - if ($block === 0) { - $this->endTokenId = $i; - } - } elseif (($this instanceof PHP_Token_FUNCTION || - $this instanceof PHP_Token_NAMESPACE) && - $tokens[$i] instanceof PHP_Token_SEMICOLON) { - if ($block === 0) { - $this->endTokenId = $i; - } - } - - $i++; - } - - if ($this->endTokenId === null) { - $this->endTokenId = $this->id; - } - - return $this->endTokenId; - } - - /** - * @return int - */ - public function getEndLine() - { - return $this->tokenStream[$this->getEndTokenId()]->getLine(); - } -} - -abstract class PHP_TokenWithScopeAndVisibility extends PHP_TokenWithScope -{ - /** - * @return string - */ - public function getVisibility() - { - $tokens = $this->tokenStream->tokens(); - - for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) { - if (isset($tokens[$i]) && - ($tokens[$i] instanceof PHP_Token_PRIVATE || - $tokens[$i] instanceof PHP_Token_PROTECTED || - $tokens[$i] instanceof PHP_Token_PUBLIC)) { - return strtolower( - str_replace('PHP_Token_', '', PHP_Token_Util::getClass($tokens[$i])) - ); - } - if (isset($tokens[$i]) && - !($tokens[$i] instanceof PHP_Token_STATIC || - $tokens[$i] instanceof PHP_Token_FINAL || - $tokens[$i] instanceof PHP_Token_ABSTRACT)) { - // no keywords; stop visibility search - break; - } - } - } - - /** - * @return string - */ - public function getKeywords() - { - $keywords = []; - $tokens = $this->tokenStream->tokens(); - - for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) { - if (isset($tokens[$i]) && - ($tokens[$i] instanceof PHP_Token_PRIVATE || - $tokens[$i] instanceof PHP_Token_PROTECTED || - $tokens[$i] instanceof PHP_Token_PUBLIC)) { - continue; - } - - if (isset($tokens[$i]) && - ($tokens[$i] instanceof PHP_Token_STATIC || - $tokens[$i] instanceof PHP_Token_FINAL || - $tokens[$i] instanceof PHP_Token_ABSTRACT)) { - $keywords[] = strtolower( - str_replace('PHP_Token_', '', PHP_Token_Util::getClass($tokens[$i])) - ); - } - } - - return implode(',', $keywords); - } -} - -abstract class PHP_Token_Includes extends PHP_Token -{ - /** - * @var string - */ - protected $name; - - /** - * @var string - */ - protected $type; - - /** - * @return string - */ - public function getName() - { - if ($this->name === null) { - $this->process(); - } - - return $this->name; - } - - /** - * @return string - */ - public function getType() - { - if ($this->type === null) { - $this->process(); - } - - return $this->type; - } - - private function process() - { - $tokens = $this->tokenStream->tokens(); - - if ($tokens[$this->id + 2] instanceof PHP_Token_CONSTANT_ENCAPSED_STRING) { - $this->name = trim($tokens[$this->id + 2], "'\""); - $this->type = strtolower( - str_replace('PHP_Token_', '', PHP_Token_Util::getClass($tokens[$this->id])) - ); - } - } -} - -class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility -{ - /** - * @var array - */ - protected $arguments; - - /** - * @var int - */ - protected $ccn; - - /** - * @var string - */ - protected $name; - - /** - * @var string - */ - protected $signature; - - /** - * @var bool - */ - private $anonymous = false; - - /** - * @return array - */ - public function getArguments() - { - if ($this->arguments !== null) { - return $this->arguments; - } - - $this->arguments = []; - $tokens = $this->tokenStream->tokens(); - $typeDeclaration = null; - - // Search for first token inside brackets - $i = $this->id + 2; - - while (!$tokens[$i - 1] instanceof PHP_Token_OPEN_BRACKET) { - $i++; - } - - while (!$tokens[$i] instanceof PHP_Token_CLOSE_BRACKET) { - if ($tokens[$i] instanceof PHP_Token_STRING) { - $typeDeclaration = (string) $tokens[$i]; - } elseif ($tokens[$i] instanceof PHP_Token_VARIABLE) { - $this->arguments[(string) $tokens[$i]] = $typeDeclaration; - $typeDeclaration = null; - } - - $i++; - } - - return $this->arguments; - } - - /** - * @return string - */ - public function getName() - { - if ($this->name !== null) { - return $this->name; - } - - $tokens = $this->tokenStream->tokens(); - - $i = $this->id + 1; - - if ($tokens[$i] instanceof PHP_Token_WHITESPACE) { - $i++; - } - - if ($tokens[$i] instanceof PHP_Token_AMPERSAND) { - $i++; - } - - if ($tokens[$i + 1] instanceof PHP_Token_OPEN_BRACKET) { - $this->name = (string) $tokens[$i]; - } elseif ($tokens[$i + 1] instanceof PHP_Token_WHITESPACE && $tokens[$i + 2] instanceof PHP_Token_OPEN_BRACKET) { - $this->name = (string) $tokens[$i]; - } else { - $this->anonymous = true; - - $this->name = sprintf( - 'anonymousFunction:%s#%s', - $this->getLine(), - $this->getId() - ); - } - - if (!$this->isAnonymous()) { - for ($i = $this->id; $i; --$i) { - if ($tokens[$i] instanceof PHP_Token_NAMESPACE) { - $this->name = $tokens[$i]->getName() . '\\' . $this->name; - - break; - } - - if ($tokens[$i] instanceof PHP_Token_INTERFACE) { - break; - } - } - } - - return $this->name; - } - - /** - * @return int - */ - public function getCCN() - { - if ($this->ccn !== null) { - return $this->ccn; - } - - $this->ccn = 1; - $end = $this->getEndTokenId(); - $tokens = $this->tokenStream->tokens(); - - for ($i = $this->id; $i <= $end; $i++) { - switch (PHP_Token_Util::getClass($tokens[$i])) { - case 'PHP_Token_IF': - case 'PHP_Token_ELSEIF': - case 'PHP_Token_FOR': - case 'PHP_Token_FOREACH': - case 'PHP_Token_WHILE': - case 'PHP_Token_CASE': - case 'PHP_Token_CATCH': - case 'PHP_Token_BOOLEAN_AND': - case 'PHP_Token_LOGICAL_AND': - case 'PHP_Token_BOOLEAN_OR': - case 'PHP_Token_LOGICAL_OR': - case 'PHP_Token_QUESTION_MARK': - $this->ccn++; - break; - } - } - - return $this->ccn; - } - - /** - * @return string - */ - public function getSignature() - { - if ($this->signature !== null) { - return $this->signature; - } - - if ($this->isAnonymous()) { - $this->signature = 'anonymousFunction'; - $i = $this->id + 1; - } else { - $this->signature = ''; - $i = $this->id + 2; - } - - $tokens = $this->tokenStream->tokens(); - - while (isset($tokens[$i]) && - !$tokens[$i] instanceof PHP_Token_OPEN_CURLY && - !$tokens[$i] instanceof PHP_Token_SEMICOLON) { - $this->signature .= $tokens[$i++]; - } - - $this->signature = trim($this->signature); - - return $this->signature; - } - - /** - * @return bool - */ - public function isAnonymous() - { - return $this->anonymous; - } -} - -class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility -{ - /** - * @var array - */ - protected $interfaces; - - /** - * @return string - */ - public function getName() - { - return (string) $this->tokenStream[$this->id + 2]; - } - - /** - * @return bool - */ - public function hasParent() - { - return $this->tokenStream[$this->id + 4] instanceof PHP_Token_EXTENDS; - } - - /** - * @return array - */ - public function getPackage() - { - $className = $this->getName(); - $docComment = $this->getDocblock(); - - $result = [ - 'namespace' => '', - 'fullPackage' => '', - 'category' => '', - 'package' => '', - 'subpackage' => '' - ]; - - for ($i = $this->id; $i; --$i) { - if ($this->tokenStream[$i] instanceof PHP_Token_NAMESPACE) { - $result['namespace'] = $this->tokenStream[$i]->getName(); - break; - } - } - - if (preg_match('/@category[\s]+([\.\w]+)/', $docComment, $matches)) { - $result['category'] = $matches[1]; - } - - if (preg_match('/@package[\s]+([\.\w]+)/', $docComment, $matches)) { - $result['package'] = $matches[1]; - $result['fullPackage'] = $matches[1]; - } - - if (preg_match('/@subpackage[\s]+([\.\w]+)/', $docComment, $matches)) { - $result['subpackage'] = $matches[1]; - $result['fullPackage'] .= '.' . $matches[1]; - } - - if (empty($result['fullPackage'])) { - $result['fullPackage'] = $this->arrayToName( - explode('_', str_replace('\\', '_', $className)), - '.' - ); - } - - return $result; - } - - /** - * @param array $parts - * @param string $join - * - * @return string - */ - protected function arrayToName(array $parts, $join = '\\') - { - $result = ''; - - if (count($parts) > 1) { - array_pop($parts); - - $result = implode($join, $parts); - } - - return $result; - } - - /** - * @return bool|string - */ - public function getParent() - { - if (!$this->hasParent()) { - return false; - } - - $i = $this->id + 6; - $tokens = $this->tokenStream->tokens(); - $className = (string) $tokens[$i]; - - while (isset($tokens[$i + 1]) && - !$tokens[$i + 1] instanceof PHP_Token_WHITESPACE) { - $className .= (string) $tokens[++$i]; - } - - return $className; - } - - /** - * @return bool - */ - public function hasInterfaces() - { - return (isset($this->tokenStream[$this->id + 4]) && - $this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) || - (isset($this->tokenStream[$this->id + 8]) && - $this->tokenStream[$this->id + 8] instanceof PHP_Token_IMPLEMENTS); - } - - /** - * @return array|bool - */ - public function getInterfaces() - { - if ($this->interfaces !== null) { - return $this->interfaces; - } - - if (!$this->hasInterfaces()) { - return ($this->interfaces = false); - } - - if ($this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) { - $i = $this->id + 3; - } else { - $i = $this->id + 7; - } - - $tokens = $this->tokenStream->tokens(); - - while (!$tokens[$i + 1] instanceof PHP_Token_OPEN_CURLY) { - $i++; - - if ($tokens[$i] instanceof PHP_Token_STRING) { - $this->interfaces[] = (string) $tokens[$i]; - } - } - - return $this->interfaces; - } -} - -class PHP_Token_ABSTRACT extends PHP_Token -{ -} - -class PHP_Token_AMPERSAND extends PHP_Token -{ -} - -class PHP_Token_AND_EQUAL extends PHP_Token -{ -} - -class PHP_Token_ARRAY extends PHP_Token -{ -} - -class PHP_Token_ARRAY_CAST extends PHP_Token -{ -} - -class PHP_Token_AS extends PHP_Token -{ -} - -class PHP_Token_AT extends PHP_Token -{ -} - -class PHP_Token_BACKTICK extends PHP_Token -{ -} - -class PHP_Token_BAD_CHARACTER extends PHP_Token -{ -} - -class PHP_Token_BOOLEAN_AND extends PHP_Token -{ -} - -class PHP_Token_BOOLEAN_OR extends PHP_Token -{ -} - -class PHP_Token_BOOL_CAST extends PHP_Token -{ -} - -class PHP_Token_BREAK extends PHP_Token -{ -} - -class PHP_Token_CARET extends PHP_Token -{ -} - -class PHP_Token_CASE extends PHP_Token -{ -} - -class PHP_Token_CATCH extends PHP_Token -{ -} - -class PHP_Token_CHARACTER extends PHP_Token -{ -} - -class PHP_Token_CLASS extends PHP_Token_INTERFACE -{ - /** - * @var bool - */ - private $anonymous = false; - - /** - * @var string - */ - private $name; - - /** - * @return string - */ - public function getName() - { - if ($this->name !== null) { - return $this->name; - } - - $next = $this->tokenStream[$this->id + 1]; - - if ($next instanceof PHP_Token_WHITESPACE) { - $next = $this->tokenStream[$this->id + 2]; - } - - if ($next instanceof PHP_Token_STRING) { - $this->name =(string) $next; - - return $this->name; - } - - if ($next instanceof PHP_Token_OPEN_CURLY || - $next instanceof PHP_Token_EXTENDS || - $next instanceof PHP_Token_IMPLEMENTS) { - - $this->name = sprintf( - 'AnonymousClass:%s#%s', - $this->getLine(), - $this->getId() - ); - - $this->anonymous = true; - - return $this->name; - } - } - - public function isAnonymous() - { - return $this->anonymous; - } -} - -class PHP_Token_CLASS_C extends PHP_Token -{ -} - -class PHP_Token_CLASS_NAME_CONSTANT extends PHP_Token -{ -} - -class PHP_Token_CLONE extends PHP_Token -{ -} - -class PHP_Token_CLOSE_BRACKET extends PHP_Token -{ -} - -class PHP_Token_CLOSE_CURLY extends PHP_Token -{ -} - -class PHP_Token_CLOSE_SQUARE extends PHP_Token -{ -} - -class PHP_Token_CLOSE_TAG extends PHP_Token -{ -} - -class PHP_Token_COLON extends PHP_Token -{ -} - -class PHP_Token_COMMA extends PHP_Token -{ -} - -class PHP_Token_COMMENT extends PHP_Token -{ -} - -class PHP_Token_CONCAT_EQUAL extends PHP_Token -{ -} - -class PHP_Token_CONST extends PHP_Token -{ -} - -class PHP_Token_CONSTANT_ENCAPSED_STRING extends PHP_Token -{ -} - -class PHP_Token_CONTINUE extends PHP_Token -{ -} - -class PHP_Token_CURLY_OPEN extends PHP_Token -{ -} - -class PHP_Token_DEC extends PHP_Token -{ -} - -class PHP_Token_DECLARE extends PHP_Token -{ -} - -class PHP_Token_DEFAULT extends PHP_Token -{ -} - -class PHP_Token_DIV extends PHP_Token -{ -} - -class PHP_Token_DIV_EQUAL extends PHP_Token -{ -} - -class PHP_Token_DNUMBER extends PHP_Token -{ -} - -class PHP_Token_DO extends PHP_Token -{ -} - -class PHP_Token_DOC_COMMENT extends PHP_Token -{ -} - -class PHP_Token_DOLLAR extends PHP_Token -{ -} - -class PHP_Token_DOLLAR_OPEN_CURLY_BRACES extends PHP_Token -{ -} - -class PHP_Token_DOT extends PHP_Token -{ -} - -class PHP_Token_DOUBLE_ARROW extends PHP_Token -{ -} - -class PHP_Token_DOUBLE_CAST extends PHP_Token -{ -} - -class PHP_Token_DOUBLE_COLON extends PHP_Token -{ -} - -class PHP_Token_DOUBLE_QUOTES extends PHP_Token -{ -} - -class PHP_Token_ECHO extends PHP_Token -{ -} - -class PHP_Token_ELSE extends PHP_Token -{ -} - -class PHP_Token_ELSEIF extends PHP_Token -{ -} - -class PHP_Token_EMPTY extends PHP_Token -{ -} - -class PHP_Token_ENCAPSED_AND_WHITESPACE extends PHP_Token -{ -} - -class PHP_Token_ENDDECLARE extends PHP_Token -{ -} - -class PHP_Token_ENDFOR extends PHP_Token -{ -} - -class PHP_Token_ENDFOREACH extends PHP_Token -{ -} - -class PHP_Token_ENDIF extends PHP_Token -{ -} - -class PHP_Token_ENDSWITCH extends PHP_Token -{ -} - -class PHP_Token_ENDWHILE extends PHP_Token -{ -} - -class PHP_Token_END_HEREDOC extends PHP_Token -{ -} - -class PHP_Token_EQUAL extends PHP_Token -{ -} - -class PHP_Token_EVAL extends PHP_Token -{ -} - -class PHP_Token_EXCLAMATION_MARK extends PHP_Token -{ -} - -class PHP_Token_EXIT extends PHP_Token -{ -} - -class PHP_Token_EXTENDS extends PHP_Token -{ -} - -class PHP_Token_FILE extends PHP_Token -{ -} - -class PHP_Token_FINAL extends PHP_Token -{ -} - -class PHP_Token_FOR extends PHP_Token -{ -} - -class PHP_Token_FOREACH extends PHP_Token -{ -} - -class PHP_Token_FUNC_C extends PHP_Token -{ -} - -class PHP_Token_GLOBAL extends PHP_Token -{ -} - -class PHP_Token_GT extends PHP_Token -{ -} - -class PHP_Token_IF extends PHP_Token -{ -} - -class PHP_Token_IMPLEMENTS extends PHP_Token -{ -} - -class PHP_Token_INC extends PHP_Token -{ -} - -class PHP_Token_INCLUDE extends PHP_Token_Includes -{ -} - -class PHP_Token_INCLUDE_ONCE extends PHP_Token_Includes -{ -} - -class PHP_Token_INLINE_HTML extends PHP_Token -{ -} - -class PHP_Token_INSTANCEOF extends PHP_Token -{ -} - -class PHP_Token_INT_CAST extends PHP_Token -{ -} - -class PHP_Token_ISSET extends PHP_Token -{ -} - -class PHP_Token_IS_EQUAL extends PHP_Token -{ -} - -class PHP_Token_IS_GREATER_OR_EQUAL extends PHP_Token -{ -} - -class PHP_Token_IS_IDENTICAL extends PHP_Token -{ -} - -class PHP_Token_IS_NOT_EQUAL extends PHP_Token -{ -} - -class PHP_Token_IS_NOT_IDENTICAL extends PHP_Token -{ -} - -class PHP_Token_IS_SMALLER_OR_EQUAL extends PHP_Token -{ -} - -class PHP_Token_LINE extends PHP_Token -{ -} - -class PHP_Token_LIST extends PHP_Token -{ -} - -class PHP_Token_LNUMBER extends PHP_Token -{ -} - -class PHP_Token_LOGICAL_AND extends PHP_Token -{ -} - -class PHP_Token_LOGICAL_OR extends PHP_Token -{ -} - -class PHP_Token_LOGICAL_XOR extends PHP_Token -{ -} - -class PHP_Token_LT extends PHP_Token -{ -} - -class PHP_Token_METHOD_C extends PHP_Token -{ -} - -class PHP_Token_MINUS extends PHP_Token -{ -} - -class PHP_Token_MINUS_EQUAL extends PHP_Token -{ -} - -class PHP_Token_MOD_EQUAL extends PHP_Token -{ -} - -class PHP_Token_MULT extends PHP_Token -{ -} - -class PHP_Token_MUL_EQUAL extends PHP_Token -{ -} - -class PHP_Token_NEW extends PHP_Token -{ -} - -class PHP_Token_NUM_STRING extends PHP_Token -{ -} - -class PHP_Token_OBJECT_CAST extends PHP_Token -{ -} - -class PHP_Token_OBJECT_OPERATOR extends PHP_Token -{ -} - -class PHP_Token_OPEN_BRACKET extends PHP_Token -{ -} - -class PHP_Token_OPEN_CURLY extends PHP_Token -{ -} - -class PHP_Token_OPEN_SQUARE extends PHP_Token -{ -} - -class PHP_Token_OPEN_TAG extends PHP_Token -{ -} - -class PHP_Token_OPEN_TAG_WITH_ECHO extends PHP_Token -{ -} - -class PHP_Token_OR_EQUAL extends PHP_Token -{ -} - -class PHP_Token_PAAMAYIM_NEKUDOTAYIM extends PHP_Token -{ -} - -class PHP_Token_PERCENT extends PHP_Token -{ -} - -class PHP_Token_PIPE extends PHP_Token -{ -} - -class PHP_Token_PLUS extends PHP_Token -{ -} - -class PHP_Token_PLUS_EQUAL extends PHP_Token -{ -} - -class PHP_Token_PRINT extends PHP_Token -{ -} - -class PHP_Token_PRIVATE extends PHP_Token -{ -} - -class PHP_Token_PROTECTED extends PHP_Token -{ -} - -class PHP_Token_PUBLIC extends PHP_Token -{ -} - -class PHP_Token_QUESTION_MARK extends PHP_Token -{ -} - -class PHP_Token_REQUIRE extends PHP_Token_Includes -{ -} - -class PHP_Token_REQUIRE_ONCE extends PHP_Token_Includes -{ -} - -class PHP_Token_RETURN extends PHP_Token -{ -} - -class PHP_Token_SEMICOLON extends PHP_Token -{ -} - -class PHP_Token_SL extends PHP_Token -{ -} - -class PHP_Token_SL_EQUAL extends PHP_Token -{ -} - -class PHP_Token_SR extends PHP_Token -{ -} - -class PHP_Token_SR_EQUAL extends PHP_Token -{ -} - -class PHP_Token_START_HEREDOC extends PHP_Token -{ -} - -class PHP_Token_STATIC extends PHP_Token -{ -} - -class PHP_Token_STRING extends PHP_Token -{ -} - -class PHP_Token_STRING_CAST extends PHP_Token -{ -} - -class PHP_Token_STRING_VARNAME extends PHP_Token -{ -} - -class PHP_Token_SWITCH extends PHP_Token -{ -} - -class PHP_Token_THROW extends PHP_Token -{ -} - -class PHP_Token_TILDE extends PHP_Token -{ -} - -class PHP_Token_TRY extends PHP_Token -{ -} - -class PHP_Token_UNSET extends PHP_Token -{ -} - -class PHP_Token_UNSET_CAST extends PHP_Token -{ -} - -class PHP_Token_USE extends PHP_Token -{ -} - -class PHP_Token_USE_FUNCTION extends PHP_Token -{ -} - -class PHP_Token_VAR extends PHP_Token -{ -} - -class PHP_Token_VARIABLE extends PHP_Token -{ -} - -class PHP_Token_WHILE extends PHP_Token -{ -} - -class PHP_Token_WHITESPACE extends PHP_Token -{ -} - -class PHP_Token_XOR_EQUAL extends PHP_Token -{ -} - -// Tokens introduced in PHP 5.1 -class PHP_Token_HALT_COMPILER extends PHP_Token -{ -} - -// Tokens introduced in PHP 5.3 -class PHP_Token_DIR extends PHP_Token -{ -} - -class PHP_Token_GOTO extends PHP_Token -{ -} - -class PHP_Token_NAMESPACE extends PHP_TokenWithScope -{ - /** - * @return string - */ - public function getName() - { - $tokens = $this->tokenStream->tokens(); - $namespace = (string) $tokens[$this->id + 2]; - - for ($i = $this->id + 3;; $i += 2) { - if (isset($tokens[$i]) && - $tokens[$i] instanceof PHP_Token_NS_SEPARATOR) { - $namespace .= '\\' . $tokens[$i + 1]; - } else { - break; - } - } - - return $namespace; - } -} - -class PHP_Token_NS_C extends PHP_Token -{ -} - -class PHP_Token_NS_SEPARATOR extends PHP_Token -{ -} - -// Tokens introduced in PHP 5.4 -class PHP_Token_CALLABLE extends PHP_Token -{ -} - -class PHP_Token_INSTEADOF extends PHP_Token -{ -} - -class PHP_Token_TRAIT extends PHP_Token_INTERFACE -{ -} - -class PHP_Token_TRAIT_C extends PHP_Token -{ -} - -// Tokens introduced in PHP 5.5 -class PHP_Token_FINALLY extends PHP_Token -{ -} - -class PHP_Token_YIELD extends PHP_Token -{ -} - -// Tokens introduced in PHP 5.6 -class PHP_Token_ELLIPSIS extends PHP_Token -{ -} - -class PHP_Token_POW extends PHP_Token -{ -} - -class PHP_Token_POW_EQUAL extends PHP_Token -{ -} - -// Tokens introduced in PHP 7.0 -class PHP_Token_COALESCE extends PHP_Token -{ -} - -class PHP_Token_SPACESHIP extends PHP_Token -{ -} - -class PHP_Token_YIELD_FROM extends PHP_Token -{ -} - -// Tokens introduced in PHP 7.4 -class PHP_Token_COALESCE_EQUAL extends PHP_Token -{ -} - -class PHP_Token_FN extends PHP_Token -{ -} diff --git a/vendor/phpunit/php-token-stream/src/Token/Stream.php b/vendor/phpunit/php-token-stream/src/Token/Stream.php deleted file mode 100644 index 40549b9..0000000 --- a/vendor/phpunit/php-token-stream/src/Token/Stream.php +++ /dev/null @@ -1,609 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * A stream of PHP tokens. - */ -class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator -{ - /** - * @var array - */ - protected static $customTokens = [ - '(' => 'PHP_Token_OPEN_BRACKET', - ')' => 'PHP_Token_CLOSE_BRACKET', - '[' => 'PHP_Token_OPEN_SQUARE', - ']' => 'PHP_Token_CLOSE_SQUARE', - '{' => 'PHP_Token_OPEN_CURLY', - '}' => 'PHP_Token_CLOSE_CURLY', - ';' => 'PHP_Token_SEMICOLON', - '.' => 'PHP_Token_DOT', - ',' => 'PHP_Token_COMMA', - '=' => 'PHP_Token_EQUAL', - '<' => 'PHP_Token_LT', - '>' => 'PHP_Token_GT', - '+' => 'PHP_Token_PLUS', - '-' => 'PHP_Token_MINUS', - '*' => 'PHP_Token_MULT', - '/' => 'PHP_Token_DIV', - '?' => 'PHP_Token_QUESTION_MARK', - '!' => 'PHP_Token_EXCLAMATION_MARK', - ':' => 'PHP_Token_COLON', - '"' => 'PHP_Token_DOUBLE_QUOTES', - '@' => 'PHP_Token_AT', - '&' => 'PHP_Token_AMPERSAND', - '%' => 'PHP_Token_PERCENT', - '|' => 'PHP_Token_PIPE', - '$' => 'PHP_Token_DOLLAR', - '^' => 'PHP_Token_CARET', - '~' => 'PHP_Token_TILDE', - '`' => 'PHP_Token_BACKTICK' - ]; - - /** - * @var string - */ - protected $filename; - - /** - * @var array - */ - protected $tokens = []; - - /** - * @var int - */ - protected $position = 0; - - /** - * @var array - */ - protected $linesOfCode = ['loc' => 0, 'cloc' => 0, 'ncloc' => 0]; - - /** - * @var array - */ - protected $classes; - - /** - * @var array - */ - protected $functions; - - /** - * @var array - */ - protected $includes; - - /** - * @var array - */ - protected $interfaces; - - /** - * @var array - */ - protected $traits; - - /** - * @var array - */ - protected $lineToFunctionMap = []; - - /** - * Constructor. - * - * @param string $sourceCode - */ - public function __construct($sourceCode) - { - if (is_file($sourceCode)) { - $this->filename = $sourceCode; - $sourceCode = file_get_contents($sourceCode); - } - - $this->scan($sourceCode); - } - - /** - * Destructor. - */ - public function __destruct() - { - $this->tokens = []; - } - - /** - * @return string - */ - public function __toString() - { - $buffer = ''; - - foreach ($this as $token) { - $buffer .= $token; - } - - return $buffer; - } - - /** - * @return string - */ - public function getFilename() - { - return $this->filename; - } - - /** - * Scans the source for sequences of characters and converts them into a - * stream of tokens. - * - * @param string $sourceCode - */ - protected function scan($sourceCode) - { - $id = 0; - $line = 1; - $tokens = token_get_all($sourceCode); - $numTokens = count($tokens); - - $lastNonWhitespaceTokenWasDoubleColon = false; - - for ($i = 0; $i < $numTokens; ++$i) { - $token = $tokens[$i]; - $skip = 0; - - if (is_array($token)) { - $name = substr(token_name($token[0]), 2); - $text = $token[1]; - - if ($lastNonWhitespaceTokenWasDoubleColon && $name == 'CLASS') { - $name = 'CLASS_NAME_CONSTANT'; - } elseif ($name == 'USE' && isset($tokens[$i + 2][0]) && $tokens[$i + 2][0] == T_FUNCTION) { - $name = 'USE_FUNCTION'; - $text .= $tokens[$i + 1][1] . $tokens[$i + 2][1]; - $skip = 2; - } - - $tokenClass = 'PHP_Token_' . $name; - } else { - $text = $token; - $tokenClass = self::$customTokens[$token]; - } - - $this->tokens[] = new $tokenClass($text, $line, $this, $id++); - $lines = substr_count($text, "\n"); - $line += $lines; - - if ($tokenClass == 'PHP_Token_HALT_COMPILER') { - break; - } elseif ($tokenClass == 'PHP_Token_COMMENT' || - $tokenClass == 'PHP_Token_DOC_COMMENT') { - $this->linesOfCode['cloc'] += $lines + 1; - } - - if ($name == 'DOUBLE_COLON') { - $lastNonWhitespaceTokenWasDoubleColon = true; - } elseif ($name != 'WHITESPACE') { - $lastNonWhitespaceTokenWasDoubleColon = false; - } - - $i += $skip; - } - - $this->linesOfCode['loc'] = substr_count($sourceCode, "\n"); - $this->linesOfCode['ncloc'] = $this->linesOfCode['loc'] - - $this->linesOfCode['cloc']; - } - - /** - * @return int - */ - public function count() - { - return count($this->tokens); - } - - /** - * @return PHP_Token[] - */ - public function tokens() - { - return $this->tokens; - } - - /** - * @return array - */ - public function getClasses() - { - if ($this->classes !== null) { - return $this->classes; - } - - $this->parse(); - - return $this->classes; - } - - /** - * @return array - */ - public function getFunctions() - { - if ($this->functions !== null) { - return $this->functions; - } - - $this->parse(); - - return $this->functions; - } - - /** - * @return array - */ - public function getInterfaces() - { - if ($this->interfaces !== null) { - return $this->interfaces; - } - - $this->parse(); - - return $this->interfaces; - } - - /** - * @return array - */ - public function getTraits() - { - if ($this->traits !== null) { - return $this->traits; - } - - $this->parse(); - - return $this->traits; - } - - /** - * Gets the names of all files that have been included - * using include(), include_once(), require() or require_once(). - * - * Parameter $categorize set to TRUE causing this function to return a - * multi-dimensional array with categories in the keys of the first dimension - * and constants and their values in the second dimension. - * - * Parameter $category allow to filter following specific inclusion type - * - * @param bool $categorize OPTIONAL - * @param string $category OPTIONAL Either 'require_once', 'require', - * 'include_once', 'include'. - * - * @return array - */ - public function getIncludes($categorize = false, $category = null) - { - if ($this->includes === null) { - $this->includes = [ - 'require_once' => [], - 'require' => [], - 'include_once' => [], - 'include' => [] - ]; - - foreach ($this->tokens as $token) { - switch (PHP_Token_Util::getClass($token)) { - case 'PHP_Token_REQUIRE_ONCE': - case 'PHP_Token_REQUIRE': - case 'PHP_Token_INCLUDE_ONCE': - case 'PHP_Token_INCLUDE': - $this->includes[$token->getType()][] = $token->getName(); - break; - } - } - } - - if (isset($this->includes[$category])) { - $includes = $this->includes[$category]; - } elseif ($categorize === false) { - $includes = array_merge( - $this->includes['require_once'], - $this->includes['require'], - $this->includes['include_once'], - $this->includes['include'] - ); - } else { - $includes = $this->includes; - } - - return $includes; - } - - /** - * Returns the name of the function or method a line belongs to. - * - * @return string or null if the line is not in a function or method - */ - public function getFunctionForLine($line) - { - $this->parse(); - - if (isset($this->lineToFunctionMap[$line])) { - return $this->lineToFunctionMap[$line]; - } - } - - protected function parse() - { - $this->interfaces = []; - $this->classes = []; - $this->traits = []; - $this->functions = []; - $class = []; - $classEndLine = []; - $trait = false; - $traitEndLine = false; - $interface = false; - $interfaceEndLine = false; - - foreach ($this->tokens as $token) { - switch (PHP_Token_Util::getClass($token)) { - case 'PHP_Token_HALT_COMPILER': - return; - - case 'PHP_Token_INTERFACE': - $interface = $token->getName(); - $interfaceEndLine = $token->getEndLine(); - - $this->interfaces[$interface] = [ - 'methods' => [], - 'parent' => $token->getParent(), - 'keywords' => $token->getKeywords(), - 'docblock' => $token->getDocblock(), - 'startLine' => $token->getLine(), - 'endLine' => $interfaceEndLine, - 'package' => $token->getPackage(), - 'file' => $this->filename - ]; - break; - - case 'PHP_Token_CLASS': - case 'PHP_Token_TRAIT': - $tmp = [ - 'methods' => [], - 'parent' => $token->getParent(), - 'interfaces'=> $token->getInterfaces(), - 'keywords' => $token->getKeywords(), - 'docblock' => $token->getDocblock(), - 'startLine' => $token->getLine(), - 'endLine' => $token->getEndLine(), - 'package' => $token->getPackage(), - 'file' => $this->filename - ]; - - if ($token->getName() !== null) { - if ($token instanceof PHP_Token_CLASS) { - $class[] = $token->getName(); - $classEndLine[] = $token->getEndLine(); - - $this->classes[$class[count($class) - 1]] = $tmp; - } else { - $trait = $token->getName(); - $traitEndLine = $token->getEndLine(); - $this->traits[$trait] = $tmp; - } - } - break; - - case 'PHP_Token_FUNCTION': - $name = $token->getName(); - $tmp = [ - 'docblock' => $token->getDocblock(), - 'keywords' => $token->getKeywords(), - 'visibility'=> $token->getVisibility(), - 'signature' => $token->getSignature(), - 'startLine' => $token->getLine(), - 'endLine' => $token->getEndLine(), - 'ccn' => $token->getCCN(), - 'file' => $this->filename - ]; - - if (empty($class) && - $trait === false && - $interface === false) { - $this->functions[$name] = $tmp; - - $this->addFunctionToMap( - $name, - $tmp['startLine'], - $tmp['endLine'] - ); - } elseif (!empty($class)) { - $this->classes[$class[count($class) - 1]]['methods'][$name] = $tmp; - - $this->addFunctionToMap( - $class[count($class) - 1] . '::' . $name, - $tmp['startLine'], - $tmp['endLine'] - ); - } elseif ($trait !== false) { - $this->traits[$trait]['methods'][$name] = $tmp; - - $this->addFunctionToMap( - $trait . '::' . $name, - $tmp['startLine'], - $tmp['endLine'] - ); - } else { - $this->interfaces[$interface]['methods'][$name] = $tmp; - } - break; - - case 'PHP_Token_CLOSE_CURLY': - if (!empty($classEndLine) && - $classEndLine[count($classEndLine) - 1] == $token->getLine()) { - array_pop($classEndLine); - array_pop($class); - } elseif ($traitEndLine !== false && - $traitEndLine == $token->getLine()) { - $trait = false; - $traitEndLine = false; - } elseif ($interfaceEndLine !== false && - $interfaceEndLine == $token->getLine()) { - $interface = false; - $interfaceEndLine = false; - } - break; - } - } - } - - /** - * @return array - */ - public function getLinesOfCode() - { - return $this->linesOfCode; - } - - /** - */ - public function rewind() - { - $this->position = 0; - } - - /** - * @return bool - */ - public function valid() - { - return isset($this->tokens[$this->position]); - } - - /** - * @return int - */ - public function key() - { - return $this->position; - } - - /** - * @return PHP_Token - */ - public function current() - { - return $this->tokens[$this->position]; - } - - /** - */ - public function next() - { - $this->position++; - } - - /** - * @param int $offset - * - * @return bool - */ - public function offsetExists($offset) - { - return isset($this->tokens[$offset]); - } - - /** - * @param int $offset - * - * @return mixed - * - * @throws OutOfBoundsException - */ - public function offsetGet($offset) - { - if (!$this->offsetExists($offset)) { - throw new OutOfBoundsException( - sprintf( - 'No token at position "%s"', - $offset - ) - ); - } - - return $this->tokens[$offset]; - } - - /** - * @param int $offset - * @param mixed $value - */ - public function offsetSet($offset, $value) - { - $this->tokens[$offset] = $value; - } - - /** - * @param int $offset - * - * @throws OutOfBoundsException - */ - public function offsetUnset($offset) - { - if (!$this->offsetExists($offset)) { - throw new OutOfBoundsException( - sprintf( - 'No token at position "%s"', - $offset - ) - ); - } - - unset($this->tokens[$offset]); - } - - /** - * Seek to an absolute position. - * - * @param int $position - * - * @throws OutOfBoundsException - */ - public function seek($position) - { - $this->position = $position; - - if (!$this->valid()) { - throw new OutOfBoundsException( - sprintf( - 'No token at position "%s"', - $this->position - ) - ); - } - } - - /** - * @param string $name - * @param int $startLine - * @param int $endLine - */ - private function addFunctionToMap($name, $startLine, $endLine) - { - for ($line = $startLine; $line <= $endLine; $line++) { - $this->lineToFunctionMap[$line] = $name; - } - } -} diff --git a/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php b/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php deleted file mode 100644 index 9d69393..0000000 --- a/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * A caching factory for token stream objects. - */ -class PHP_Token_Stream_CachingFactory -{ - /** - * @var array - */ - protected static $cache = []; - - /** - * @param string $filename - * - * @return PHP_Token_Stream - */ - public static function get($filename) - { - if (!isset(self::$cache[$filename])) { - self::$cache[$filename] = new PHP_Token_Stream($filename); - } - - return self::$cache[$filename]; - } - - /** - * @param string $filename - */ - public static function clear($filename = null) - { - if (is_string($filename)) { - unset(self::$cache[$filename]); - } else { - self::$cache = []; - } - } -} diff --git a/vendor/phpunit/php-token-stream/src/Token/Util.php b/vendor/phpunit/php-token-stream/src/Token/Util.php deleted file mode 100644 index 4d82f1a..0000000 --- a/vendor/phpunit/php-token-stream/src/Token/Util.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -final class PHP_Token_Util -{ - public static function getClass($object): string - { - $parts = explode('\\', get_class($object)); - - return array_pop($parts); - } -} \ No newline at end of file diff --git a/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php b/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php deleted file mode 100644 index 05eca32..0000000 --- a/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use PHPUnit\Framework\TestCase; - -class PHP_Token_ClassTest extends TestCase -{ - /** - * @var PHP_Token_CLASS - */ - private $class; - - /** - * @var PHP_Token_FUNCTION - */ - private $function; - - protected function setUp() - { - foreach (new PHP_Token_Stream(TEST_FILES_PATH . 'source2.php') as $token) { - if ($token instanceof PHP_Token_CLASS) { - $this->class = $token; - } - - if ($token instanceof PHP_Token_FUNCTION) { - $this->function = $token; - break; - } - } - } - - public function testGetClassKeywords() - { - $this->assertEquals('abstract', $this->class->getKeywords()); - } - - public function testGetFunctionKeywords() - { - $this->assertEquals('abstract,static', $this->function->getKeywords()); - } - - public function testGetFunctionVisibility() - { - $this->assertEquals('public', $this->function->getVisibility()); - } - - public function testIssue19() - { - foreach (new PHP_Token_Stream(TEST_FILES_PATH . 'issue19.php') as $token) { - if ($token instanceof PHP_Token_CLASS) { - $this->assertFalse($token->hasInterfaces()); - } - } - } - - public function testIssue30() - { - $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'issue30.php'); - $this->assertCount(1, $ts->getClasses()); - } - - public function testAnonymousClassesAreHandledCorrectly() - { - $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'class_with_method_that_declares_anonymous_class.php'); - - $classes = $ts->getClasses(); - - $this->assertEquals( - [ - 'class_with_method_that_declares_anonymous_class', - 'AnonymousClass:9#31', - 'AnonymousClass:10#55', - 'AnonymousClass:11#75', - 'AnonymousClass:12#91', - 'AnonymousClass:13#107' - ], - array_keys($classes) - ); - } - - /** - * @ticket https://github.com/sebastianbergmann/php-token-stream/issues/52 - */ - public function testAnonymousClassesAreHandledCorrectly2() - { - $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'class_with_method_that_declares_anonymous_class2.php'); - - $classes = $ts->getClasses(); - - $this->assertEquals(['Test', 'AnonymousClass:4#23'], array_keys($classes)); - $this->assertEquals(['methodOne', 'methodTwo'], array_keys($classes['Test']['methods'])); - - $this->assertEmpty($ts->getFunctions()); - } - - public function testImportedFunctionsAreHandledCorrectly() - { - $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'classUsesNamespacedFunction.php'); - - $this->assertEmpty($ts->getFunctions()); - $this->assertCount(1, $ts->getClasses()); - } - - /** - * @ticket https://github.com/sebastianbergmann/php-code-coverage/issues/543 - */ - public function testClassWithMultipleAnonymousClassesAndFunctionsIsHandledCorrectly() - { - $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'class_with_multiple_anonymous_classes_and_functions.php'); - - $classes = $ts->getClasses(); - - $this->assertArrayHasKey('class_with_multiple_anonymous_classes_and_functions', $classes); - $this->assertArrayHasKey('AnonymousClass:6#23', $classes); - $this->assertArrayHasKey('AnonymousClass:12#53', $classes); - $this->assertArrayHasKey('m', $classes['class_with_multiple_anonymous_classes_and_functions']['methods']); - $this->assertArrayHasKey('anonymousFunction:18#81', $classes['class_with_multiple_anonymous_classes_and_functions']['methods']); - $this->assertArrayHasKey('anonymousFunction:22#108', $classes['class_with_multiple_anonymous_classes_and_functions']['methods']); - } - - /** - * @ticket https://github.com/sebastianbergmann/php-token-stream/issues/68 - */ - public function testClassWithMethodNamedEmptyIsHandledCorrectly() - { - $classes = (new PHP_Token_Stream(TEST_FILES_PATH . 'class_with_method_named_empty.php'))->getClasses(); - - $this->assertArrayHasKey('class_with_method_named_empty', $classes); - $this->assertArrayHasKey('empty', $classes['class_with_method_named_empty']['methods']); - } - - /** - * @ticket https://github.com/sebastianbergmann/php-code-coverage/issues/424 - */ - public function testAnonymousFunctionDoesNotAffectStartAndEndLineOfMethod() - { - $classes = (new PHP_Token_Stream(TEST_FILES_PATH . 'php-code-coverage-issue-424.php'))->getClasses(); - - $this->assertSame(5, $classes['Example']['methods']['even']['startLine']); - $this->assertSame(12, $classes['Example']['methods']['even']['endLine']); - - $this->assertSame(7, $classes['Example']['methods']['anonymousFunction:7#28']['startLine']); - $this->assertSame(9, $classes['Example']['methods']['anonymousFunction:7#28']['endLine']); - } -} diff --git a/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php b/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php deleted file mode 100644 index 4e893d8..0000000 --- a/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use PHPUnit\Framework\TestCase; - -class PHP_Token_ClosureTest extends TestCase -{ - /** - * @var PHP_Token_FUNCTION[] - */ - private $functions; - - protected function setUp() - { - foreach (new PHP_Token_Stream(TEST_FILES_PATH . 'closure.php') as $token) { - if ($token instanceof PHP_Token_FUNCTION) { - $this->functions[] = $token; - } - } - } - - public function testGetArguments() - { - $this->assertEquals(['$foo' => null, '$bar' => null], $this->functions[0]->getArguments()); - $this->assertEquals(['$foo' => 'Foo', '$bar' => null], $this->functions[1]->getArguments()); - $this->assertEquals(['$foo' => null, '$bar' => null, '$baz' => null], $this->functions[2]->getArguments()); - $this->assertEquals(['$foo' => 'Foo', '$bar' => null, '$baz' => null], $this->functions[3]->getArguments()); - $this->assertEquals([], $this->functions[4]->getArguments()); - $this->assertEquals([], $this->functions[5]->getArguments()); - } - - public function testGetName() - { - $this->assertEquals('anonymousFunction:2#5', $this->functions[0]->getName()); - $this->assertEquals('anonymousFunction:3#27', $this->functions[1]->getName()); - $this->assertEquals('anonymousFunction:4#51', $this->functions[2]->getName()); - $this->assertEquals('anonymousFunction:5#71', $this->functions[3]->getName()); - $this->assertEquals('anonymousFunction:6#93', $this->functions[4]->getName()); - $this->assertEquals('anonymousFunction:7#106', $this->functions[5]->getName()); - } - - public function testGetLine() - { - $this->assertEquals(2, $this->functions[0]->getLine()); - $this->assertEquals(3, $this->functions[1]->getLine()); - $this->assertEquals(4, $this->functions[2]->getLine()); - $this->assertEquals(5, $this->functions[3]->getLine()); - } - - public function testGetEndLine() - { - $this->assertEquals(2, $this->functions[0]->getLine()); - $this->assertEquals(3, $this->functions[1]->getLine()); - $this->assertEquals(4, $this->functions[2]->getLine()); - $this->assertEquals(5, $this->functions[3]->getLine()); - } -} diff --git a/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php b/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php deleted file mode 100644 index c88454b..0000000 --- a/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php +++ /dev/null @@ -1,124 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use PHPUnit\Framework\TestCase; - -class PHP_Token_FunctionTest extends TestCase -{ - /** - * @var PHP_Token_FUNCTION[] - */ - private $functions; - - protected function setUp() - { - foreach (new PHP_Token_Stream(TEST_FILES_PATH . 'source.php') as $token) { - if ($token instanceof PHP_Token_FUNCTION) { - $this->functions[] = $token; - } - } - } - - public function testGetArguments() - { - $this->assertEquals([], $this->functions[0]->getArguments()); - - $this->assertEquals( - ['$baz' => 'Baz'], $this->functions[1]->getArguments() - ); - - $this->assertEquals( - ['$foobar' => 'Foobar'], $this->functions[2]->getArguments() - ); - - $this->assertEquals( - ['$barfoo' => 'Barfoo'], $this->functions[3]->getArguments() - ); - - $this->assertEquals([], $this->functions[4]->getArguments()); - - $this->assertEquals(['$x' => null, '$y' => null], $this->functions[5]->getArguments()); - } - - public function testGetName() - { - $this->assertEquals('foo', $this->functions[0]->getName()); - $this->assertEquals('bar', $this->functions[1]->getName()); - $this->assertEquals('foobar', $this->functions[2]->getName()); - $this->assertEquals('barfoo', $this->functions[3]->getName()); - $this->assertEquals('baz', $this->functions[4]->getName()); - } - - public function testGetLine() - { - $this->assertEquals(5, $this->functions[0]->getLine()); - $this->assertEquals(10, $this->functions[1]->getLine()); - $this->assertEquals(17, $this->functions[2]->getLine()); - $this->assertEquals(21, $this->functions[3]->getLine()); - $this->assertEquals(29, $this->functions[4]->getLine()); - $this->assertEquals(37, $this->functions[6]->getLine()); - } - - public function testGetEndLine() - { - $this->assertEquals(5, $this->functions[0]->getEndLine()); - $this->assertEquals(12, $this->functions[1]->getEndLine()); - $this->assertEquals(19, $this->functions[2]->getEndLine()); - $this->assertEquals(23, $this->functions[3]->getEndLine()); - $this->assertEquals(31, $this->functions[4]->getEndLine()); - $this->assertEquals(41, $this->functions[6]->getEndLine()); - } - - public function testGetDocblock() - { - $this->assertNull($this->functions[0]->getDocblock()); - - $this->assertEquals( - "/**\n * @param Baz \$baz\n */", - $this->functions[1]->getDocblock() - ); - - $this->assertEquals( - "/**\n * @param Foobar \$foobar\n */", - $this->functions[2]->getDocblock() - ); - - $this->assertNull($this->functions[3]->getDocblock()); - $this->assertNull($this->functions[4]->getDocblock()); - } - - public function testSignature() - { - $tokens = new PHP_Token_Stream(TEST_FILES_PATH . 'source5.php'); - $functions = $tokens->getFunctions(); - $classes = $tokens->getClasses(); - $interfaces = $tokens->getInterfaces(); - - $this->assertEquals( - 'foo($a, array $b, array $c = array())', - $functions['foo']['signature'] - ); - - $this->assertEquals( - 'm($a, array $b, array $c = array())', - $classes['c']['methods']['m']['signature'] - ); - - $this->assertEquals( - 'm($a, array $b, array $c = array())', - $classes['a']['methods']['m']['signature'] - ); - - $this->assertEquals( - 'm($a, array $b, array $c = array())', - $interfaces['i']['methods']['m']['signature'] - ); - } -} diff --git a/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php b/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php deleted file mode 100644 index 7f83a73..0000000 --- a/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use PHPUnit\Framework\TestCase; - -class PHP_Token_IncludeTest extends TestCase -{ - /** - * @var PHP_Token_Stream - */ - private $ts; - - protected function setUp() - { - $this->ts = new PHP_Token_Stream(TEST_FILES_PATH . 'source3.php'); - } - - public function testGetIncludes() - { - $this->assertSame( - ['test4.php', 'test3.php', 'test2.php', 'test1.php'], - $this->ts->getIncludes() - ); - } - - public function testGetIncludesCategorized() - { - $this->assertSame( - [ - 'require_once' => ['test4.php'], - 'require' => ['test3.php'], - 'include_once' => ['test2.php'], - 'include' => ['test1.php'] - ], - $this->ts->getIncludes(true) - ); - } - - public function testGetIncludesCategory() - { - $this->assertSame( - ['test4.php'], - $this->ts->getIncludes(true, 'require_once') - ); - } -} diff --git a/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php b/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php deleted file mode 100644 index c61ec38..0000000 --- a/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php +++ /dev/null @@ -1,169 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use PHPUnit\Framework\TestCase; - -class PHP_Token_InterfaceTest extends TestCase -{ - /** - * @var PHP_Token_CLASS - */ - private $class; - - /** - * @var PHP_Token_INTERFACE[] - */ - private $interfaces; - - protected function setUp() - { - $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'source4.php'); - $i = 0; - - foreach ($ts as $token) { - if ($token instanceof PHP_Token_CLASS) { - $this->class = $token; - } elseif ($token instanceof PHP_Token_INTERFACE) { - $this->interfaces[$i] = $token; - $i++; - } - } - } - - public function testGetName() - { - $this->assertEquals( - 'iTemplate', $this->interfaces[0]->getName() - ); - } - - public function testGetParentNotExists() - { - $this->assertFalse( - $this->interfaces[0]->getParent() - ); - } - - public function testHasParentNotExists() - { - $this->assertFalse( - $this->interfaces[0]->hasParent() - ); - } - - public function testGetParentExists() - { - $this->assertEquals( - 'a', $this->interfaces[2]->getParent() - ); - } - - public function testHasParentExists() - { - $this->assertTrue( - $this->interfaces[2]->hasParent() - ); - } - - public function testGetInterfacesExists() - { - $this->assertEquals( - ['b'], - $this->class->getInterfaces() - ); - } - - public function testHasInterfacesExists() - { - $this->assertTrue( - $this->class->hasInterfaces() - ); - } - - public function testGetPackageNamespace() - { - foreach (new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php') as $token) { - if ($token instanceof PHP_Token_INTERFACE) { - $package = $token->getPackage(); - $this->assertSame('Foo\\Bar', $package['namespace']); - } - } - } - - public function provideFilesWithClassesWithinMultipleNamespaces() - { - return [ - [TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingBraces.php'], - [TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingNonBraceSyntax.php'], - ]; - } - - /** - * @dataProvider provideFilesWithClassesWithinMultipleNamespaces - */ - public function testGetPackageNamespaceForFileWithMultipleNamespaces($filepath) - { - $tokenStream = new PHP_Token_Stream($filepath); - $firstClassFound = false; - - foreach ($tokenStream as $token) { - if ($firstClassFound === false && $token instanceof PHP_Token_INTERFACE) { - $package = $token->getPackage(); - $this->assertSame('TestClassInBar', $token->getName()); - $this->assertSame('Foo\\Bar', $package['namespace']); - $firstClassFound = true; - continue; - } - // Secound class - if ($token instanceof PHP_Token_INTERFACE) { - $package = $token->getPackage(); - $this->assertSame('TestClassInBaz', $token->getName()); - $this->assertSame('Foo\\Baz', $package['namespace']); - - return; - } - } - $this->fail('Searching for 2 classes failed'); - } - - public function testGetPackageNamespaceIsEmptyForInterfacesThatAreNotWithinNamespaces() - { - foreach ($this->interfaces as $token) { - $package = $token->getPackage(); - $this->assertSame('', $package['namespace']); - } - } - - public function testGetPackageNamespaceWhenExtentingFromNamespaceClass() - { - $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classExtendsNamespacedClass.php'); - $firstClassFound = false; - - foreach ($tokenStream as $token) { - if ($firstClassFound === false && $token instanceof PHP_Token_INTERFACE) { - $package = $token->getPackage(); - $this->assertSame('Baz', $token->getName()); - $this->assertSame('Foo\\Bar', $package['namespace']); - $firstClassFound = true; - continue; - } - - if ($token instanceof PHP_Token_INTERFACE) { - $package = $token->getPackage(); - $this->assertSame('Extender', $token->getName()); - $this->assertSame('Other\\Space', $package['namespace']); - - return; - } - } - - $this->fail('Searching for 2 classes failed'); - } -} diff --git a/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php b/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php deleted file mode 100644 index 97a9224..0000000 --- a/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use PHPUnit\Framework\TestCase; - -class PHP_Token_NamespaceTest extends TestCase -{ - public function testGetName() - { - $tokenStream = new PHP_Token_Stream( - TEST_FILES_PATH . 'classInNamespace.php' - ); - - foreach ($tokenStream as $token) { - if ($token instanceof PHP_Token_NAMESPACE) { - $this->assertSame('Foo\\Bar', $token->getName()); - } - } - } - - public function testGetStartLineWithUnscopedNamespace() - { - foreach (new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php') as $token) { - if ($token instanceof PHP_Token_NAMESPACE) { - $this->assertSame(2, $token->getLine()); - } - } - } - - public function testGetEndLineWithUnscopedNamespace() - { - foreach (new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php') as $token) { - if ($token instanceof PHP_Token_NAMESPACE) { - $this->assertSame(2, $token->getEndLine()); - } - } - } - public function testGetStartLineWithScopedNamespace() - { - foreach (new PHP_Token_Stream(TEST_FILES_PATH . 'classInScopedNamespace.php') as $token) { - if ($token instanceof PHP_Token_NAMESPACE) { - $this->assertSame(2, $token->getLine()); - } - } - } - - public function testGetEndLineWithScopedNamespace() - { - foreach (new PHP_Token_Stream(TEST_FILES_PATH . 'classInScopedNamespace.php') as $token) { - if ($token instanceof PHP_Token_NAMESPACE) { - $this->assertSame(8, $token->getEndLine()); - } - } - } -} diff --git a/vendor/phpunit/php-token-stream/tests/_fixture/classExtendsNamespacedClass.php b/vendor/phpunit/php-token-stream/tests/_fixture/classExtendsNamespacedClass.php deleted file mode 100644 index 560eec9..0000000 --- a/vendor/phpunit/php-token-stream/tests/_fixture/classExtendsNamespacedClass.php +++ /dev/null @@ -1,10 +0,0 @@ -method_in_anonymous_class(); - } - - public function methodTwo() { - return false; - } -} diff --git a/vendor/phpunit/php-token-stream/tests/_fixture/class_with_multiple_anonymous_classes_and_functions.php b/vendor/phpunit/php-token-stream/tests/_fixture/class_with_multiple_anonymous_classes_and_functions.php deleted file mode 100644 index 3267ba5..0000000 --- a/vendor/phpunit/php-token-stream/tests/_fixture/class_with_multiple_anonymous_classes_and_functions.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -require __DIR__ . '/../vendor/autoload.php'; - -define( - 'TEST_FILES_PATH', - __DIR__ . DIRECTORY_SEPARATOR . '_fixture' . DIRECTORY_SEPARATOR -); diff --git a/vendor/phpunit/phpunit/.gitattributes b/vendor/phpunit/phpunit/.gitattributes deleted file mode 100644 index 4f4f5d4..0000000 --- a/vendor/phpunit/phpunit/.gitattributes +++ /dev/null @@ -1,14 +0,0 @@ -/.docker export-ignore -/.editorconfig export-ignore -/.github export-ignore -/.psalm export-ignore -/.php_cs.dist export-ignore -/build export-ignore -/build.xml export-ignore -/phive.xml export-ignore -/phpunit.xml export-ignore -/tests export-ignore -/tools export-ignore -/tools/* binary - -*.php diff=php diff --git a/vendor/phpunit/phpunit/.gitignore b/vendor/phpunit/phpunit/.gitignore deleted file mode 100644 index a16a652..0000000 --- a/vendor/phpunit/phpunit/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -# PhpStorm -/.idea - -# Composer -/vendor -/composer.lock - -# Apache Ant -/.ant_targets - -# Build artifacts and temporary files -/build/artifacts -/build/tmp - -# PHP-CS-Fixer -/.php_cs -/.php_cs.cache - -# Psalm -/.psalm/cache - -# PHPUnit -.phpunit.result.cache - -# Temporary files generated by PHPT test runner -/tests/end-to-end/*.diff -/tests/end-to-end/*.exp -/tests/end-to-end/*.log -/tests/end-to-end/*.out -/tests/end-to-end/*.php diff --git a/vendor/phpunit/phpunit/.phive/phars.xml b/vendor/phpunit/phpunit/.phive/phars.xml deleted file mode 100644 index f2036d0..0000000 --- a/vendor/phpunit/phpunit/.phive/phars.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/.phpstorm.meta.php b/vendor/phpunit/phpunit/.phpstorm.meta.php deleted file mode 100644 index 5e4c4c2..0000000 --- a/vendor/phpunit/phpunit/.phpstorm.meta.php +++ /dev/null @@ -1,45 +0,0 @@ -. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - * Neither the name of Sebastian Bergmann nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/phpunit/phpunit/README.md b/vendor/phpunit/phpunit/README.md deleted file mode 100644 index edf80e4..0000000 --- a/vendor/phpunit/phpunit/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# PHPUnit - -PHPUnit is a programmer-oriented testing framework for PHP. It is an instance of the xUnit architecture for unit testing frameworks. - -[![Latest Stable Version](https://img.shields.io/packagist/v/phpunit/phpunit.svg?style=flat-square)](https://packagist.org/packages/phpunit/phpunit) -[![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.2-8892BF.svg?style=flat-square)](https://php.net/) -[![CI Status](https://github.com/sebastianbergmann/phpunit/workflows/CI/badge.svg?branch=8.5&event=push)](https://phpunit.de/build-status.html) -[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/phpunit/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/phpunit) - -## Installation - -We distribute a [PHP Archive (PHAR)](https://php.net/phar) that has all required (as well as some optional) dependencies of PHPUnit 8.5 bundled in a single file: - -```bash -$ wget https://phar.phpunit.de/phpunit-8.5.phar - -$ php phpunit-8.5.phar --version -``` - -Alternatively, you may use [Composer](https://getcomposer.org/) to download and install PHPUnit as well as its dependencies. Please refer to the "[Getting Started](https://phpunit.de/getting-started-with-phpunit.html)" guide for details on how to install PHPUnit. - -## Contribute - -Please refer to [CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/master/.github/CONTRIBUTING.md) for information on how to contribute to PHPUnit and its related projects. - -## List of Contributors - -Thanks to everyone who has contributed to PHPUnit! You can find a detailed list of contributors on every PHPUnit related package on GitHub. This list shows only the major components: - -* [PHPUnit](https://github.com/sebastianbergmann/phpunit/graphs/contributors) -* [php-code-coverage](https://github.com/sebastianbergmann/php-code-coverage/graphs/contributors) - -A very special thanks to everyone who has contributed to the documentation and helps maintain the translations: - -* [English](https://github.com/sebastianbergmann/phpunit-documentation-english/graphs/contributors) -* [Spanish](https://github.com/sebastianbergmann/phpunit-documentation-spanish/graphs/contributors) -* [French](https://github.com/sebastianbergmann/phpunit-documentation-french/graphs/contributors) -* [Japanese](https://github.com/sebastianbergmann/phpunit-documentation-japanese/graphs/contributors) -* [Brazilian Portuguese](https://github.com/sebastianbergmann/phpunit-documentation-brazilian-portuguese/graphs/contributors) -* [Simplified Chinese](https://github.com/sebastianbergmann/phpunit-documentation-chinese/graphs/contributors) - diff --git a/vendor/phpunit/phpunit/composer.json b/vendor/phpunit/phpunit/composer.json deleted file mode 100644 index 305fe7a..0000000 --- a/vendor/phpunit/phpunit/composer.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "phpunit/phpunit", - "description": "The PHP Unit Testing framework.", - "type": "library", - "keywords": [ - "phpunit", - "xunit", - "testing" - ], - "homepage": "https://phpunit.de/", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues" - }, - "prefer-stable": true, - "require": { - "php": "^7.2", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "doctrine/instantiator": "^1.2.0", - "myclabs/deep-copy": "^1.9.1", - "phar-io/manifest": "^1.0.3", - "phar-io/version": "^2.0.1", - "phpspec/prophecy": "^1.8.1", - "phpunit/php-code-coverage": "^7.0.7", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.2", - "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.2", - "sebastian/exporter": "^3.1.1", - "sebastian/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" - }, - "require-dev": { - "ext-PDO": "*" - }, - "config": { - "platform": { - "php": "7.2.0" - }, - "optimize-autoloader": true, - "sort-packages": true - }, - "suggest": { - "phpunit/php-invoker": "^2.0.0", - "ext-soap": "*", - "ext-xdebug": "*" - }, - "bin": [ - "phpunit" - ], - "autoload": { - "classmap": [ - "src/" - ] - }, - "autoload-dev": { - "classmap": [ - "tests/" - ], - "files": [ - "src/Framework/Assert/Functions.php", - "tests/_files/CoverageNamespacedFunctionTest.php", - "tests/_files/CoveredFunction.php", - "tests/_files/NamespaceCoveredFunction.php" - ] - }, - "extra": { - "branch-alias": { - "dev-master": "8.5-dev" - } - } -} diff --git a/vendor/phpunit/phpunit/phpunit b/vendor/phpunit/phpunit/phpunit deleted file mode 100644 index d8393f8..0000000 --- a/vendor/phpunit/phpunit/phpunit +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env php - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (version_compare('7.2.0', PHP_VERSION, '>')) { - fwrite( - STDERR, - sprintf( - 'This version of PHPUnit is supported on PHP 7.2, PHP 7.3, and PHP 7.4.' . PHP_EOL . - 'You are using PHP %s (%s).' . PHP_EOL, - PHP_VERSION, - PHP_BINARY - ) - ); - - die(1); -} - -if (!ini_get('date.timezone')) { - ini_set('date.timezone', 'UTC'); -} - -foreach (array(__DIR__ . '/../../autoload.php', __DIR__ . '/../vendor/autoload.php', __DIR__ . '/vendor/autoload.php') as $file) { - if (file_exists($file)) { - define('PHPUNIT_COMPOSER_INSTALL', $file); - - break; - } -} - -unset($file); - -if (!defined('PHPUNIT_COMPOSER_INSTALL')) { - fwrite( - STDERR, - 'You need to set up the project dependencies using Composer:' . PHP_EOL . PHP_EOL . - ' composer install' . PHP_EOL . PHP_EOL . - 'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL - ); - - die(1); -} - -$options = getopt('', array('prepend:')); - -if (isset($options['prepend'])) { - require $options['prepend']; -} - -unset($options); - -require PHPUNIT_COMPOSER_INSTALL; - -PHPUnit\TextUI\Command::main(); diff --git a/vendor/phpunit/phpunit/phpunit.xsd b/vendor/phpunit/phpunit/phpunit.xsd deleted file mode 100644 index 29cfcf2..0000000 --- a/vendor/phpunit/phpunit/phpunit.xsd +++ /dev/null @@ -1,317 +0,0 @@ - - - - - This Schema file defines the rules by which the XML configuration file of PHPUnit 8.5 may be structured. - - - - - - Root Element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The main type specifying the document structure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/src/Exception.php b/vendor/phpunit/phpunit/src/Exception.php deleted file mode 100644 index 075a315..0000000 --- a/vendor/phpunit/phpunit/src/Exception.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface Exception extends \Throwable -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Assert.php b/vendor/phpunit/phpunit/src/Framework/Assert.php deleted file mode 100644 index fb776d5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Assert.php +++ /dev/null @@ -1,3556 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use ArrayAccess; -use Countable; -use DOMDocument; -use DOMElement; -use PHPUnit\Framework\Constraint\ArrayHasKey; -use PHPUnit\Framework\Constraint\ArraySubset; -use PHPUnit\Framework\Constraint\Attribute; -use PHPUnit\Framework\Constraint\Callback; -use PHPUnit\Framework\Constraint\ClassHasAttribute; -use PHPUnit\Framework\Constraint\ClassHasStaticAttribute; -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\Constraint\Count; -use PHPUnit\Framework\Constraint\DirectoryExists; -use PHPUnit\Framework\Constraint\FileExists; -use PHPUnit\Framework\Constraint\GreaterThan; -use PHPUnit\Framework\Constraint\IsAnything; -use PHPUnit\Framework\Constraint\IsEmpty; -use PHPUnit\Framework\Constraint\IsEqual; -use PHPUnit\Framework\Constraint\IsFalse; -use PHPUnit\Framework\Constraint\IsFinite; -use PHPUnit\Framework\Constraint\IsIdentical; -use PHPUnit\Framework\Constraint\IsInfinite; -use PHPUnit\Framework\Constraint\IsInstanceOf; -use PHPUnit\Framework\Constraint\IsJson; -use PHPUnit\Framework\Constraint\IsNan; -use PHPUnit\Framework\Constraint\IsNull; -use PHPUnit\Framework\Constraint\IsReadable; -use PHPUnit\Framework\Constraint\IsTrue; -use PHPUnit\Framework\Constraint\IsType; -use PHPUnit\Framework\Constraint\IsWritable; -use PHPUnit\Framework\Constraint\JsonMatches; -use PHPUnit\Framework\Constraint\LessThan; -use PHPUnit\Framework\Constraint\LogicalAnd; -use PHPUnit\Framework\Constraint\LogicalNot; -use PHPUnit\Framework\Constraint\LogicalOr; -use PHPUnit\Framework\Constraint\LogicalXor; -use PHPUnit\Framework\Constraint\ObjectHasAttribute; -use PHPUnit\Framework\Constraint\RegularExpression; -use PHPUnit\Framework\Constraint\SameSize; -use PHPUnit\Framework\Constraint\StringContains; -use PHPUnit\Framework\Constraint\StringEndsWith; -use PHPUnit\Framework\Constraint\StringMatchesFormatDescription; -use PHPUnit\Framework\Constraint\StringStartsWith; -use PHPUnit\Framework\Constraint\TraversableContains; -use PHPUnit\Framework\Constraint\TraversableContainsEqual; -use PHPUnit\Framework\Constraint\TraversableContainsIdentical; -use PHPUnit\Framework\Constraint\TraversableContainsOnly; -use PHPUnit\Util\Type; -use PHPUnit\Util\Xml; -use ReflectionObject; -use Traversable; - -/** - * A set of assertion methods. - */ -abstract class Assert -{ - /** - * @var int - */ - private static $count = 0; - - /** - * Asserts that an array has a specified key. - * - * @param int|string $key - * @param array|ArrayAccess $array - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertArrayHasKey($key, $array, string $message = ''): void - { - if (!(\is_int($key) || \is_string($key))) { - throw InvalidArgumentException::create( - 1, - 'integer or string' - ); - } - - if (!(\is_array($array) || $array instanceof ArrayAccess)) { - throw InvalidArgumentException::create( - 2, - 'array or ArrayAccess' - ); - } - - $constraint = new ArrayHasKey($key); - - static::assertThat($array, $constraint, $message); - } - - /** - * Asserts that an array has a specified subset. - * - * @param array|ArrayAccess $subset - * @param array|ArrayAccess $array - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @codeCoverageIgnore - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3494 - */ - public static function assertArraySubset($subset, $array, bool $checkForObjectIdentity = false, string $message = ''): void - { - self::createWarning('assertArraySubset() is deprecated and will be removed in PHPUnit 9.'); - - if (!(\is_array($subset) || $subset instanceof ArrayAccess)) { - throw InvalidArgumentException::create( - 1, - 'array or ArrayAccess' - ); - } - - if (!(\is_array($array) || $array instanceof ArrayAccess)) { - throw InvalidArgumentException::create( - 2, - 'array or ArrayAccess' - ); - } - - $constraint = new ArraySubset($subset, $checkForObjectIdentity); - - static::assertThat($array, $constraint, $message); - } - - /** - * Asserts that an array does not have a specified key. - * - * @param int|string $key - * @param array|ArrayAccess $array - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertArrayNotHasKey($key, $array, string $message = ''): void - { - if (!(\is_int($key) || \is_string($key))) { - throw InvalidArgumentException::create( - 1, - 'integer or string' - ); - } - - if (!(\is_array($array) || $array instanceof ArrayAccess)) { - throw InvalidArgumentException::create( - 2, - 'array or ArrayAccess' - ); - } - - $constraint = new LogicalNot( - new ArrayHasKey($key) - ); - - static::assertThat($array, $constraint, $message); - } - - /** - * Asserts that a haystack contains a needle. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertContains($needle, $haystack, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void - { - // @codeCoverageIgnoreStart - if (\is_string($haystack)) { - self::createWarning('Using assertContains() with string haystacks is deprecated and will not be supported in PHPUnit 9. Refactor your test to use assertStringContainsString() or assertStringContainsStringIgnoringCase() instead.'); - } - - if (!$checkForObjectIdentity) { - self::createWarning('The optional $checkForObjectIdentity parameter of assertContains() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertContainsEquals() instead.'); - } - - if ($checkForNonObjectIdentity) { - self::createWarning('The optional $checkForNonObjectIdentity parameter of assertContains() is deprecated and will be removed in PHPUnit 9.'); - } - - if ($ignoreCase) { - self::createWarning('The optional $ignoreCase parameter of assertContains() is deprecated and will be removed in PHPUnit 9.'); - } - // @codeCoverageIgnoreEnd - - if (\is_array($haystack) || - (\is_object($haystack) && $haystack instanceof Traversable)) { - $constraint = new TraversableContains( - $needle, - $checkForObjectIdentity, - $checkForNonObjectIdentity - ); - } elseif (\is_string($haystack)) { - if (!\is_string($needle)) { - throw InvalidArgumentException::create( - 1, - 'string' - ); - } - - $constraint = new StringContains( - $needle, - $ignoreCase - ); - } else { - throw InvalidArgumentException::create( - 2, - 'array, traversable or string' - ); - } - - static::assertThat($haystack, $constraint, $message); - } - - public static function assertContainsEquals($needle, iterable $haystack, string $message = ''): void - { - $constraint = new TraversableContainsEqual($needle); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object contains a needle. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void - { - self::createWarning('assertAttributeContains() is deprecated and will be removed in PHPUnit 9.'); - - static::assertContains( - $needle, - static::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message, - $ignoreCase, - $checkForObjectIdentity, - $checkForNonObjectIdentity - ); - } - - /** - * Asserts that a haystack does not contain a needle. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertNotContains($needle, $haystack, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void - { - // @codeCoverageIgnoreStart - if (\is_string($haystack)) { - self::createWarning('Using assertNotContains() with string haystacks is deprecated and will not be supported in PHPUnit 9. Refactor your test to use assertStringNotContainsString() or assertStringNotContainsStringIgnoringCase() instead.'); - } - - if (!$checkForObjectIdentity) { - self::createWarning('The optional $checkForObjectIdentity parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotContainsEquals() instead.'); - } - - if ($checkForNonObjectIdentity) { - self::createWarning('The optional $checkForNonObjectIdentity parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9.'); - } - - if ($ignoreCase) { - self::createWarning('The optional $ignoreCase parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9.'); - } - // @codeCoverageIgnoreEnd - - if (\is_array($haystack) || - (\is_object($haystack) && $haystack instanceof Traversable)) { - $constraint = new LogicalNot( - new TraversableContains( - $needle, - $checkForObjectIdentity, - $checkForNonObjectIdentity - ) - ); - } elseif (\is_string($haystack)) { - if (!\is_string($needle)) { - throw InvalidArgumentException::create( - 1, - 'string' - ); - } - - $constraint = new LogicalNot( - new StringContains( - $needle, - $ignoreCase - ) - ); - } else { - throw InvalidArgumentException::create( - 2, - 'array, traversable or string' - ); - } - - static::assertThat($haystack, $constraint, $message); - } - - public static function assertNotContainsEquals($needle, iterable $haystack, string $message = ''): void - { - $constraint = new LogicalNot(new TraversableContainsEqual($needle)); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object does not contain a needle. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeNotContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void - { - self::createWarning('assertAttributeNotContains() is deprecated and will be removed in PHPUnit 9.'); - - static::assertNotContains( - $needle, - static::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message, - $ignoreCase, - $checkForObjectIdentity, - $checkForNonObjectIdentity - ); - } - - /** - * Asserts that a haystack contains only values of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void - { - if ($isNativeType === null) { - $isNativeType = Type::isType($type); - } - - static::assertThat( - $haystack, - new TraversableContainsOnly( - $type, - $isNativeType - ), - $message - ); - } - - /** - * Asserts that a haystack contains only instances of a given class name. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertContainsOnlyInstancesOf(string $className, iterable $haystack, string $message = ''): void - { - static::assertThat( - $haystack, - new TraversableContainsOnly( - $className, - false - ), - $message - ); - } - - /** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object contains only values of a given type. - * - * @param object|string $haystackClassOrObject - * @param bool $isNativeType - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void - { - self::createWarning('assertAttributeContainsOnly() is deprecated and will be removed in PHPUnit 9.'); - - static::assertContainsOnly( - $type, - static::readAttribute($haystackClassOrObject, $haystackAttributeName), - $isNativeType, - $message - ); - } - - /** - * Asserts that a haystack does not contain only values of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertNotContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void - { - if ($isNativeType === null) { - $isNativeType = Type::isType($type); - } - - static::assertThat( - $haystack, - new LogicalNot( - new TraversableContainsOnly( - $type, - $isNativeType - ) - ), - $message - ); - } - - /** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object does not contain only values of a given - * type. - * - * @param object|string $haystackClassOrObject - * @param bool $isNativeType - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeNotContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void - { - self::createWarning('assertAttributeNotContainsOnly() is deprecated and will be removed in PHPUnit 9.'); - - static::assertNotContainsOnly( - $type, - static::readAttribute($haystackClassOrObject, $haystackAttributeName), - $isNativeType, - $message - ); - } - - /** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @param Countable|iterable $haystack - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertCount(int $expectedCount, $haystack, string $message = ''): void - { - if (!$haystack instanceof Countable && !\is_iterable($haystack)) { - throw InvalidArgumentException::create(2, 'countable or iterable'); - } - - static::assertThat( - $haystack, - new Count($expectedCount), - $message - ); - } - - /** - * Asserts the number of elements of an array, Countable or Traversable - * that is stored in an attribute. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void - { - self::createWarning('assertAttributeCount() is deprecated and will be removed in PHPUnit 9.'); - - static::assertCount( - $expectedCount, - static::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message - ); - } - - /** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @param Countable|iterable $haystack - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertNotCount(int $expectedCount, $haystack, string $message = ''): void - { - if (!$haystack instanceof Countable && !\is_iterable($haystack)) { - throw InvalidArgumentException::create(2, 'countable or iterable'); - } - - $constraint = new LogicalNot( - new Count($expectedCount) - ); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts the number of elements of an array, Countable or Traversable - * that is stored in an attribute. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeNotCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void - { - self::createWarning('assertAttributeNotCount() is deprecated and will be removed in PHPUnit 9.'); - - static::assertNotCount( - $expectedCount, - static::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message - ); - } - - /** - * Asserts that two variables are equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertEquals($expected, $actual, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void - { - // @codeCoverageIgnoreStart - if ($delta !== 0.0) { - self::createWarning('The optional $delta parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsWithDelta() instead.'); - } - - if ($maxDepth !== 10) { - self::createWarning('The optional $maxDepth parameter of assertEquals() is deprecated and will be removed in PHPUnit 9.'); - } - - if ($canonicalize) { - self::createWarning('The optional $canonicalize parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsCanonicalizing() instead.'); - } - - if ($ignoreCase) { - self::createWarning('The optional $ignoreCase parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsIgnoringCase() instead.'); - } - // @codeCoverageIgnoreEnd - - $constraint = new IsEqual( - $expected, - $delta, - $maxDepth, - $canonicalize, - $ignoreCase - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are equal (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertEqualsCanonicalizing($expected, $actual, string $message = ''): void - { - $constraint = new IsEqual( - $expected, - 0.0, - 10, - true, - false - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are equal (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertEqualsIgnoringCase($expected, $actual, string $message = ''): void - { - $constraint = new IsEqual( - $expected, - 0.0, - 10, - false, - true - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are equal (with delta). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void - { - $constraint = new IsEqual( - $expected, - $delta - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that a variable is equal to an attribute of an object. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void - { - self::createWarning('assertAttributeEquals() is deprecated and will be removed in PHPUnit 9.'); - - static::assertEquals( - $expected, - static::readAttribute($actualClassOrObject, $actualAttributeName), - $message, - $delta, - $maxDepth, - $canonicalize, - $ignoreCase - ); - } - - /** - * Asserts that two variables are not equal. - * - * @param float $delta - * @param int $maxDepth - * @param bool $canonicalize - * @param bool $ignoreCase - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertNotEquals($expected, $actual, string $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false): void - { - // @codeCoverageIgnoreStart - if ($delta !== 0.0) { - self::createWarning('The optional $delta parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotEqualsWithDelta() instead.'); - } - - if ($maxDepth !== 10) { - self::createWarning('The optional $maxDepth parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9.'); - } - - if ($canonicalize) { - self::createWarning('The optional $canonicalize parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotEqualsCanonicalizing() instead.'); - } - - if ($ignoreCase) { - self::createWarning('The optional $ignoreCase parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotEqualsIgnoringCase() instead.'); - } - // @codeCoverageIgnoreEnd - - $constraint = new LogicalNot( - new IsEqual( - $expected, - $delta, - $maxDepth, - $canonicalize, - $ignoreCase - ) - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are not equal (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertNotEqualsCanonicalizing($expected, $actual, string $message = ''): void - { - $constraint = new LogicalNot( - new IsEqual( - $expected, - 0.0, - 10, - true, - false - ) - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are not equal (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertNotEqualsIgnoringCase($expected, $actual, string $message = ''): void - { - $constraint = new LogicalNot( - new IsEqual( - $expected, - 0.0, - 10, - false, - true - ) - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that two variables are not equal (with delta). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertNotEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void - { - $constraint = new LogicalNot( - new IsEqual( - $expected, - $delta - ) - ); - - static::assertThat($actual, $constraint, $message); - } - - /** - * Asserts that a variable is not equal to an attribute of an object. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeNotEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void - { - self::createWarning('assertAttributeNotEquals() is deprecated and will be removed in PHPUnit 9.'); - - static::assertNotEquals( - $expected, - static::readAttribute($actualClassOrObject, $actualAttributeName), - $message, - $delta, - $maxDepth, - $canonicalize, - $ignoreCase - ); - } - - /** - * Asserts that a variable is empty. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert empty $actual - */ - public static function assertEmpty($actual, string $message = ''): void - { - static::assertThat($actual, static::isEmpty(), $message); - } - - /** - * Asserts that a static attribute of a class or an attribute of an object - * is empty. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void - { - self::createWarning('assertAttributeEmpty() is deprecated and will be removed in PHPUnit 9.'); - - static::assertEmpty( - static::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message - ); - } - - /** - * Asserts that a variable is not empty. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !empty $actual - */ - public static function assertNotEmpty($actual, string $message = ''): void - { - static::assertThat($actual, static::logicalNot(static::isEmpty()), $message); - } - - /** - * Asserts that a static attribute of a class or an attribute of an object - * is not empty. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeNotEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void - { - self::createWarning('assertAttributeNotEmpty() is deprecated and will be removed in PHPUnit 9.'); - - static::assertNotEmpty( - static::readAttribute($haystackClassOrObject, $haystackAttributeName), - $message - ); - } - - /** - * Asserts that a value is greater than another value. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertGreaterThan($expected, $actual, string $message = ''): void - { - static::assertThat($actual, static::greaterThan($expected), $message); - } - - /** - * Asserts that an attribute is greater than another value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeGreaterThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void - { - self::createWarning('assertAttributeGreaterThan() is deprecated and will be removed in PHPUnit 9.'); - - static::assertGreaterThan( - $expected, - static::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that a value is greater than or equal to another value. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertGreaterThanOrEqual($expected, $actual, string $message = ''): void - { - static::assertThat( - $actual, - static::greaterThanOrEqual($expected), - $message - ); - } - - /** - * Asserts that an attribute is greater than or equal to another value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeGreaterThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void - { - self::createWarning('assertAttributeGreaterThanOrEqual() is deprecated and will be removed in PHPUnit 9.'); - - static::assertGreaterThanOrEqual( - $expected, - static::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that a value is smaller than another value. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertLessThan($expected, $actual, string $message = ''): void - { - static::assertThat($actual, static::lessThan($expected), $message); - } - - /** - * Asserts that an attribute is smaller than another value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeLessThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void - { - self::createWarning('assertAttributeLessThan() is deprecated and will be removed in PHPUnit 9.'); - - static::assertLessThan( - $expected, - static::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that a value is smaller than or equal to another value. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertLessThanOrEqual($expected, $actual, string $message = ''): void - { - static::assertThat($actual, static::lessThanOrEqual($expected), $message); - } - - /** - * Asserts that an attribute is smaller than or equal to another value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeLessThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void - { - self::createWarning('assertAttributeLessThanOrEqual() is deprecated and will be removed in PHPUnit 9.'); - - static::assertLessThanOrEqual( - $expected, - static::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that the contents of one file is equal to the contents of another - * file. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileEquals(string $expected, string $actual, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void - { - // @codeCoverageIgnoreStart - if ($canonicalize) { - self::createWarning('The optional $canonicalize parameter of assertFileEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertFileEqualsCanonicalizing() instead.'); - } - - if ($ignoreCase) { - self::createWarning('The optional $ignoreCase parameter of assertFileEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertFileEqualsIgnoringCase() instead.'); - } - // @codeCoverageIgnoreEnd - - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new IsEqual( - \file_get_contents($expected), - 0.0, - 10, - $canonicalize, - $ignoreCase - ); - - static::assertThat(\file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of one file is equal to the contents of another - * file (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void - { - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new IsEqual( - \file_get_contents($expected), - 0.0, - 10, - true - ); - - static::assertThat(\file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of one file is equal to the contents of another - * file (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void - { - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new IsEqual( - \file_get_contents($expected), - 0.0, - 10, - false, - true - ); - - static::assertThat(\file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of one file is not equal to the contents of - * another file. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileNotEquals(string $expected, string $actual, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void - { - // @codeCoverageIgnoreStart - if ($canonicalize) { - self::createWarning('The optional $canonicalize parameter of assertFileNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertFileNotEqualsCanonicalizing() instead.'); - } - - if ($ignoreCase) { - self::createWarning('The optional $ignoreCase parameter of assertFileNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertFileNotEqualsIgnoringCase() instead.'); - } - // @codeCoverageIgnoreEnd - - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new LogicalNot( - new IsEqual( - \file_get_contents($expected), - 0.0, - 10, - $canonicalize, - $ignoreCase - ) - ); - - static::assertThat(\file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of one file is not equal to the contents of another - * file (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileNotEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void - { - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new LogicalNot( - new IsEqual( - \file_get_contents($expected), - 0.0, - 10, - true - ) - ); - - static::assertThat(\file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of one file is not equal to the contents of another - * file (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileNotEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void - { - static::assertFileExists($expected, $message); - static::assertFileExists($actual, $message); - - $constraint = new LogicalNot( - new IsEqual( - \file_get_contents($expected), - 0.0, - 10, - false, - true - ) - ); - - static::assertThat(\file_get_contents($actual), $constraint, $message); - } - - /** - * Asserts that the contents of a string is equal - * to the contents of a file. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringEqualsFile(string $expectedFile, string $actualString, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void - { - // @codeCoverageIgnoreStart - if ($canonicalize) { - self::createWarning('The optional $canonicalize parameter of assertStringEqualsFile() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertStringEqualsFileCanonicalizing() instead.'); - } - - if ($ignoreCase) { - self::createWarning('The optional $ignoreCase parameter of assertStringEqualsFile() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertStringEqualsFileIgnoringCase() instead.'); - } - // @codeCoverageIgnoreEnd - - static::assertFileExists($expectedFile, $message); - - $constraint = new IsEqual( - \file_get_contents($expectedFile), - 0.0, - 10, - $canonicalize, - $ignoreCase - ); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that the contents of a string is equal - * to the contents of a file (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - - $constraint = new IsEqual( - \file_get_contents($expectedFile), - 0.0, - 10, - true - ); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that the contents of a string is equal - * to the contents of a file (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - - $constraint = new IsEqual( - \file_get_contents($expectedFile), - 0.0, - 10, - false, - true - ); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that the contents of a string is not equal - * to the contents of a file. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringNotEqualsFile(string $expectedFile, string $actualString, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void - { - // @codeCoverageIgnoreStart - if ($canonicalize) { - self::createWarning('The optional $canonicalize parameter of assertStringNotEqualsFile() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertStringNotEqualsFileCanonicalizing() instead.'); - } - - if ($ignoreCase) { - self::createWarning('The optional $ignoreCase parameter of assertStringNotEqualsFile() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertStringNotEqualsFileIgnoringCase() instead.'); - } - // @codeCoverageIgnoreEnd - - static::assertFileExists($expectedFile, $message); - - $constraint = new LogicalNot( - new IsEqual( - \file_get_contents($expectedFile), - 0.0, - 10, - $canonicalize, - $ignoreCase - ) - ); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that the contents of a string is not equal - * to the contents of a file (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringNotEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - - $constraint = new LogicalNot( - new IsEqual( - \file_get_contents($expectedFile), - 0.0, - 10, - true - ) - ); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that the contents of a string is not equal - * to the contents of a file (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringNotEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - - $constraint = new LogicalNot( - new IsEqual( - \file_get_contents($expectedFile), - 0.0, - 10, - false, - true - ) - ); - - static::assertThat($actualString, $constraint, $message); - } - - /** - * Asserts that a file/dir is readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertIsReadable(string $filename, string $message = ''): void - { - static::assertThat($filename, new IsReadable, $message); - } - - /** - * Asserts that a file/dir exists and is not readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertNotIsReadable(string $filename, string $message = ''): void - { - static::assertThat($filename, new LogicalNot(new IsReadable), $message); - } - - /** - * Asserts that a file/dir exists and is writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertIsWritable(string $filename, string $message = ''): void - { - static::assertThat($filename, new IsWritable, $message); - } - - /** - * Asserts that a file/dir exists and is not writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertNotIsWritable(string $filename, string $message = ''): void - { - static::assertThat($filename, new LogicalNot(new IsWritable), $message); - } - - /** - * Asserts that a directory exists. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertDirectoryExists(string $directory, string $message = ''): void - { - static::assertThat($directory, new DirectoryExists, $message); - } - - /** - * Asserts that a directory does not exist. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertDirectoryNotExists(string $directory, string $message = ''): void - { - static::assertThat($directory, new LogicalNot(new DirectoryExists), $message); - } - - /** - * Asserts that a directory exists and is readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertDirectoryIsReadable(string $directory, string $message = ''): void - { - self::assertDirectoryExists($directory, $message); - self::assertIsReadable($directory, $message); - } - - /** - * Asserts that a directory exists and is not readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertDirectoryNotIsReadable(string $directory, string $message = ''): void - { - self::assertDirectoryExists($directory, $message); - self::assertNotIsReadable($directory, $message); - } - - /** - * Asserts that a directory exists and is writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertDirectoryIsWritable(string $directory, string $message = ''): void - { - self::assertDirectoryExists($directory, $message); - self::assertIsWritable($directory, $message); - } - - /** - * Asserts that a directory exists and is not writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertDirectoryNotIsWritable(string $directory, string $message = ''): void - { - self::assertDirectoryExists($directory, $message); - self::assertNotIsWritable($directory, $message); - } - - /** - * Asserts that a file exists. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileExists(string $filename, string $message = ''): void - { - static::assertThat($filename, new FileExists, $message); - } - - /** - * Asserts that a file does not exist. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileNotExists(string $filename, string $message = ''): void - { - static::assertThat($filename, new LogicalNot(new FileExists), $message); - } - - /** - * Asserts that a file exists and is readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileIsReadable(string $file, string $message = ''): void - { - self::assertFileExists($file, $message); - self::assertIsReadable($file, $message); - } - - /** - * Asserts that a file exists and is not readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileNotIsReadable(string $file, string $message = ''): void - { - self::assertFileExists($file, $message); - self::assertNotIsReadable($file, $message); - } - - /** - * Asserts that a file exists and is writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileIsWritable(string $file, string $message = ''): void - { - self::assertFileExists($file, $message); - self::assertIsWritable($file, $message); - } - - /** - * Asserts that a file exists and is not writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFileNotIsWritable(string $file, string $message = ''): void - { - self::assertFileExists($file, $message); - self::assertNotIsWritable($file, $message); - } - - /** - * Asserts that a condition is true. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert true $condition - */ - public static function assertTrue($condition, string $message = ''): void - { - static::assertThat($condition, static::isTrue(), $message); - } - - /** - * Asserts that a condition is not true. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !true $condition - */ - public static function assertNotTrue($condition, string $message = ''): void - { - static::assertThat($condition, static::logicalNot(static::isTrue()), $message); - } - - /** - * Asserts that a condition is false. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert false $condition - */ - public static function assertFalse($condition, string $message = ''): void - { - static::assertThat($condition, static::isFalse(), $message); - } - - /** - * Asserts that a condition is not false. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !false $condition - */ - public static function assertNotFalse($condition, string $message = ''): void - { - static::assertThat($condition, static::logicalNot(static::isFalse()), $message); - } - - /** - * Asserts that a variable is null. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert null $actual - */ - public static function assertNull($actual, string $message = ''): void - { - static::assertThat($actual, static::isNull(), $message); - } - - /** - * Asserts that a variable is not null. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !null $actual - */ - public static function assertNotNull($actual, string $message = ''): void - { - static::assertThat($actual, static::logicalNot(static::isNull()), $message); - } - - /** - * Asserts that a variable is finite. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertFinite($actual, string $message = ''): void - { - static::assertThat($actual, static::isFinite(), $message); - } - - /** - * Asserts that a variable is infinite. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertInfinite($actual, string $message = ''): void - { - static::assertThat($actual, static::isInfinite(), $message); - } - - /** - * Asserts that a variable is nan. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertNan($actual, string $message = ''): void - { - static::assertThat($actual, static::isNan(), $message); - } - - /** - * Asserts that a class has a specified attribute. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertClassHasAttribute(string $attributeName, string $className, string $message = ''): void - { - if (!self::isValidClassAttributeName($attributeName)) { - throw InvalidArgumentException::create(1, 'valid attribute name'); - } - - if (!\class_exists($className)) { - throw InvalidArgumentException::create(2, 'class name'); - } - - static::assertThat($className, new ClassHasAttribute($attributeName), $message); - } - - /** - * Asserts that a class does not have a specified attribute. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertClassNotHasAttribute(string $attributeName, string $className, string $message = ''): void - { - if (!self::isValidClassAttributeName($attributeName)) { - throw InvalidArgumentException::create(1, 'valid attribute name'); - } - - if (!\class_exists($className)) { - throw InvalidArgumentException::create(2, 'class name'); - } - - static::assertThat( - $className, - new LogicalNot( - new ClassHasAttribute($attributeName) - ), - $message - ); - } - - /** - * Asserts that a class has a specified static attribute. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertClassHasStaticAttribute(string $attributeName, string $className, string $message = ''): void - { - if (!self::isValidClassAttributeName($attributeName)) { - throw InvalidArgumentException::create(1, 'valid attribute name'); - } - - if (!\class_exists($className)) { - throw InvalidArgumentException::create(2, 'class name'); - } - - static::assertThat( - $className, - new ClassHasStaticAttribute($attributeName), - $message - ); - } - - /** - * Asserts that a class does not have a specified static attribute. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertClassNotHasStaticAttribute(string $attributeName, string $className, string $message = ''): void - { - if (!self::isValidClassAttributeName($attributeName)) { - throw InvalidArgumentException::create(1, 'valid attribute name'); - } - - if (!\class_exists($className)) { - throw InvalidArgumentException::create(2, 'class name'); - } - - static::assertThat( - $className, - new LogicalNot( - new ClassHasStaticAttribute($attributeName) - ), - $message - ); - } - - /** - * Asserts that an object has a specified attribute. - * - * @param object $object - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void - { - if (!self::isValidObjectAttributeName($attributeName)) { - throw InvalidArgumentException::create(1, 'valid attribute name'); - } - - if (!\is_object($object)) { - throw InvalidArgumentException::create(2, 'object'); - } - - static::assertThat( - $object, - new ObjectHasAttribute($attributeName), - $message - ); - } - - /** - * Asserts that an object does not have a specified attribute. - * - * @param object $object - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void - { - if (!self::isValidObjectAttributeName($attributeName)) { - throw InvalidArgumentException::create(1, 'valid attribute name'); - } - - if (!\is_object($object)) { - throw InvalidArgumentException::create(2, 'object'); - } - - static::assertThat( - $object, - new LogicalNot( - new ObjectHasAttribute($attributeName) - ), - $message - ); - } - - /** - * Asserts that two variables have the same type and value. - * Used on objects, it asserts that two variables reference - * the same object. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-template ExpectedType - * @psalm-param ExpectedType $expected - * @psalm-assert =ExpectedType $actual - */ - public static function assertSame($expected, $actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsIdentical($expected), - $message - ); - } - - /** - * Asserts that a variable and an attribute of an object have the same type - * and value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void - { - self::createWarning('assertAttributeSame() is deprecated and will be removed in PHPUnit 9.'); - - static::assertSame( - $expected, - static::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that two variables do not have the same type and value. - * Used on objects, it asserts that two variables do not reference - * the same object. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertNotSame($expected, $actual, string $message = ''): void - { - if (\is_bool($expected) && \is_bool($actual)) { - static::assertNotEquals($expected, $actual, $message); - } - - static::assertThat( - $actual, - new LogicalNot( - new IsIdentical($expected) - ), - $message - ); - } - - /** - * Asserts that a variable and an attribute of an object do not have the - * same type and value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeNotSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void - { - self::createWarning('assertAttributeNotSame() is deprecated and will be removed in PHPUnit 9.'); - - static::assertNotSame( - $expected, - static::readAttribute($actualClassOrObject, $actualAttributeName), - $message - ); - } - - /** - * Asserts that a variable is of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @psalm-template ExpectedType of object - * @psalm-param class-string $expected - * @psalm-assert ExpectedType $actual - */ - public static function assertInstanceOf(string $expected, $actual, string $message = ''): void - { - if (!\class_exists($expected) && !\interface_exists($expected)) { - throw InvalidArgumentException::create(1, 'class or interface name'); - } - - static::assertThat( - $actual, - new IsInstanceOf($expected), - $message - ); - } - - /** - * Asserts that an attribute is of a given type. - * - * @param object|string $classOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @psalm-param class-string $expected - */ - public static function assertAttributeInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void - { - self::createWarning('assertAttributeInstanceOf() is deprecated and will be removed in PHPUnit 9.'); - - static::assertInstanceOf( - $expected, - static::readAttribute($classOrObject, $attributeName), - $message - ); - } - - /** - * Asserts that a variable is not of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @psalm-template ExpectedType of object - * @psalm-param class-string $expected - * @psalm-assert !ExpectedType $actual - */ - public static function assertNotInstanceOf(string $expected, $actual, string $message = ''): void - { - if (!\class_exists($expected) && !\interface_exists($expected)) { - throw InvalidArgumentException::create(1, 'class or interface name'); - } - - static::assertThat( - $actual, - new LogicalNot( - new IsInstanceOf($expected) - ), - $message - ); - } - - /** - * Asserts that an attribute is of a given type. - * - * @param object|string $classOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @psalm-param class-string $expected - */ - public static function assertAttributeNotInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void - { - self::createWarning('assertAttributeNotInstanceOf() is deprecated and will be removed in PHPUnit 9.'); - - static::assertNotInstanceOf( - $expected, - static::readAttribute($classOrObject, $attributeName), - $message - ); - } - - /** - * Asserts that a variable is of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369 - * @codeCoverageIgnore - */ - public static function assertInternalType(string $expected, $actual, string $message = ''): void - { - self::createWarning('assertInternalType() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertIsArray(), assertIsBool(), assertIsFloat(), assertIsInt(), assertIsNumeric(), assertIsObject(), assertIsResource(), assertIsString(), assertIsScalar(), assertIsCallable(), or assertIsIterable() instead.'); - - static::assertThat( - $actual, - new IsType($expected), - $message - ); - } - - /** - * Asserts that an attribute is of a given type. - * - * @param object|string $classOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void - { - self::createWarning('assertAttributeInternalType() is deprecated and will be removed in PHPUnit 9.'); - - static::assertInternalType( - $expected, - static::readAttribute($classOrObject, $attributeName), - $message - ); - } - - /** - * Asserts that a variable is of type array. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert array $actual - */ - public static function assertIsArray($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_ARRAY), - $message - ); - } - - /** - * Asserts that a variable is of type bool. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert bool $actual - */ - public static function assertIsBool($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_BOOL), - $message - ); - } - - /** - * Asserts that a variable is of type float. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert float $actual - */ - public static function assertIsFloat($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_FLOAT), - $message - ); - } - - /** - * Asserts that a variable is of type int. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert int $actual - */ - public static function assertIsInt($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_INT), - $message - ); - } - - /** - * Asserts that a variable is of type numeric. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert numeric $actual - */ - public static function assertIsNumeric($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_NUMERIC), - $message - ); - } - - /** - * Asserts that a variable is of type object. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert object $actual - */ - public static function assertIsObject($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_OBJECT), - $message - ); - } - - /** - * Asserts that a variable is of type resource. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert resource $actual - */ - public static function assertIsResource($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_RESOURCE), - $message - ); - } - - /** - * Asserts that a variable is of type string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert string $actual - */ - public static function assertIsString($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_STRING), - $message - ); - } - - /** - * Asserts that a variable is of type scalar. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert scalar $actual - */ - public static function assertIsScalar($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_SCALAR), - $message - ); - } - - /** - * Asserts that a variable is of type callable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert callable $actual - */ - public static function assertIsCallable($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_CALLABLE), - $message - ); - } - - /** - * Asserts that a variable is of type iterable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert iterable $actual - */ - public static function assertIsIterable($actual, string $message = ''): void - { - static::assertThat( - $actual, - new IsType(IsType::TYPE_ITERABLE), - $message - ); - } - - /** - * Asserts that a variable is not of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369 - * @codeCoverageIgnore - */ - public static function assertNotInternalType(string $expected, $actual, string $message = ''): void - { - self::createWarning('assertNotInternalType() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertIsNotArray(), assertIsNotBool(), assertIsNotFloat(), assertIsNotInt(), assertIsNotNumeric(), assertIsNotObject(), assertIsNotResource(), assertIsNotString(), assertIsNotScalar(), assertIsNotCallable(), or assertIsNotIterable() instead.'); - - static::assertThat( - $actual, - new LogicalNot( - new IsType($expected) - ), - $message - ); - } - - /** - * Asserts that a variable is not of type array. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !array $actual - */ - public static function assertIsNotArray($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_ARRAY)), - $message - ); - } - - /** - * Asserts that a variable is not of type bool. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !bool $actual - */ - public static function assertIsNotBool($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_BOOL)), - $message - ); - } - - /** - * Asserts that a variable is not of type float. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !float $actual - */ - public static function assertIsNotFloat($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_FLOAT)), - $message - ); - } - - /** - * Asserts that a variable is not of type int. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !int $actual - */ - public static function assertIsNotInt($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_INT)), - $message - ); - } - - /** - * Asserts that a variable is not of type numeric. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !numeric $actual - */ - public static function assertIsNotNumeric($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_NUMERIC)), - $message - ); - } - - /** - * Asserts that a variable is not of type object. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !object $actual - */ - public static function assertIsNotObject($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_OBJECT)), - $message - ); - } - - /** - * Asserts that a variable is not of type resource. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !resource $actual - */ - public static function assertIsNotResource($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_RESOURCE)), - $message - ); - } - - /** - * Asserts that a variable is not of type string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !string $actual - */ - public static function assertIsNotString($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_STRING)), - $message - ); - } - - /** - * Asserts that a variable is not of type scalar. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !scalar $actual - */ - public static function assertIsNotScalar($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_SCALAR)), - $message - ); - } - - /** - * Asserts that a variable is not of type callable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !callable $actual - */ - public static function assertIsNotCallable($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_CALLABLE)), - $message - ); - } - - /** - * Asserts that a variable is not of type iterable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !iterable $actual - */ - public static function assertIsNotIterable($actual, string $message = ''): void - { - static::assertThat( - $actual, - new LogicalNot(new IsType(IsType::TYPE_ITERABLE)), - $message - ); - } - - /** - * Asserts that an attribute is of a given type. - * - * @param object|string $classOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function assertAttributeNotInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void - { - self::createWarning('assertAttributeNotInternalType() is deprecated and will be removed in PHPUnit 9.'); - - static::assertNotInternalType( - $expected, - static::readAttribute($classOrObject, $attributeName), - $message - ); - } - - /** - * Asserts that a string matches a given regular expression. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertRegExp(string $pattern, string $string, string $message = ''): void - { - static::assertThat($string, new RegularExpression($pattern), $message); - } - - /** - * Asserts that a string does not match a given regular expression. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertNotRegExp(string $pattern, string $string, string $message = ''): void - { - static::assertThat( - $string, - new LogicalNot( - new RegularExpression($pattern) - ), - $message - ); - } - - /** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is the same. - * - * @param Countable|iterable $expected - * @param Countable|iterable $actual - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertSameSize($expected, $actual, string $message = ''): void - { - if (!$expected instanceof Countable && !\is_iterable($expected)) { - throw InvalidArgumentException::create(1, 'countable or iterable'); - } - - if (!$actual instanceof Countable && !\is_iterable($actual)) { - throw InvalidArgumentException::create(2, 'countable or iterable'); - } - - static::assertThat( - $actual, - new SameSize($expected), - $message - ); - } - - /** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is not the same. - * - * @param Countable|iterable $expected - * @param Countable|iterable $actual - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertNotSameSize($expected, $actual, string $message = ''): void - { - if (!$expected instanceof Countable && !\is_iterable($expected)) { - throw InvalidArgumentException::create(1, 'countable or iterable'); - } - - if (!$actual instanceof Countable && !\is_iterable($actual)) { - throw InvalidArgumentException::create(2, 'countable or iterable'); - } - - static::assertThat( - $actual, - new LogicalNot( - new SameSize($expected) - ), - $message - ); - } - - /** - * Asserts that a string matches a given format string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringMatchesFormat(string $format, string $string, string $message = ''): void - { - static::assertThat($string, new StringMatchesFormatDescription($format), $message); - } - - /** - * Asserts that a string does not match a given format string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringNotMatchesFormat(string $format, string $string, string $message = ''): void - { - static::assertThat( - $string, - new LogicalNot( - new StringMatchesFormatDescription($format) - ), - $message - ); - } - - /** - * Asserts that a string matches a given format file. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringMatchesFormatFile(string $formatFile, string $string, string $message = ''): void - { - static::assertFileExists($formatFile, $message); - - static::assertThat( - $string, - new StringMatchesFormatDescription( - \file_get_contents($formatFile) - ), - $message - ); - } - - /** - * Asserts that a string does not match a given format string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = ''): void - { - static::assertFileExists($formatFile, $message); - - static::assertThat( - $string, - new LogicalNot( - new StringMatchesFormatDescription( - \file_get_contents($formatFile) - ) - ), - $message - ); - } - - /** - * Asserts that a string starts with a given prefix. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringStartsWith(string $prefix, string $string, string $message = ''): void - { - static::assertThat($string, new StringStartsWith($prefix), $message); - } - - /** - * Asserts that a string starts not with a given prefix. - * - * @param string $prefix - * @param string $string - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringStartsNotWith($prefix, $string, string $message = ''): void - { - static::assertThat( - $string, - new LogicalNot( - new StringStartsWith($prefix) - ), - $message - ); - } - - /** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringContainsString(string $needle, string $haystack, string $message = ''): void - { - $constraint = new StringContains($needle, false); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void - { - $constraint = new StringContains($needle, true); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringNotContainsString(string $needle, string $haystack, string $message = ''): void - { - $constraint = new LogicalNot(new StringContains($needle)); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void - { - $constraint = new LogicalNot(new StringContains($needle, true)); - - static::assertThat($haystack, $constraint, $message); - } - - /** - * Asserts that a string ends with a given suffix. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringEndsWith(string $suffix, string $string, string $message = ''): void - { - static::assertThat($string, new StringEndsWith($suffix), $message); - } - - /** - * Asserts that a string ends not with a given suffix. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertStringEndsNotWith(string $suffix, string $string, string $message = ''): void - { - static::assertThat( - $string, - new LogicalNot( - new StringEndsWith($suffix) - ), - $message - ); - } - - /** - * Asserts that two XML files are equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertXmlFileEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void - { - $expected = Xml::loadFile($expectedFile); - $actual = Xml::loadFile($actualFile); - - static::assertEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML files are not equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertXmlFileNotEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void - { - $expected = Xml::loadFile($expectedFile); - $actual = Xml::loadFile($actualFile); - - static::assertNotEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are equal. - * - * @param DOMDocument|string $actualXml - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertXmlStringEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void - { - $expected = Xml::loadFile($expectedFile); - $actual = Xml::load($actualXml); - - static::assertEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are not equal. - * - * @param DOMDocument|string $actualXml - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertXmlStringNotEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void - { - $expected = Xml::loadFile($expectedFile); - $actual = Xml::load($actualXml); - - static::assertNotEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are equal. - * - * @param DOMDocument|string $expectedXml - * @param DOMDocument|string $actualXml - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, string $message = ''): void - { - $expected = Xml::load($expectedXml); - $actual = Xml::load($actualXml); - - static::assertEquals($expected, $actual, $message); - } - - /** - * Asserts that two XML documents are not equal. - * - * @param DOMDocument|string $expectedXml - * @param DOMDocument|string $actualXml - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, string $message = ''): void - { - $expected = Xml::load($expectedXml); - $actual = Xml::load($actualXml); - - static::assertNotEquals($expected, $actual, $message); - } - - /** - * Asserts that a hierarchy of DOMElements matches. - * - * @throws AssertionFailedError - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, bool $checkAttributes = false, string $message = ''): void - { - $expectedElement = Xml::import($expectedElement); - $actualElement = Xml::import($actualElement); - - static::assertSame( - $expectedElement->tagName, - $actualElement->tagName, - $message - ); - - if ($checkAttributes) { - static::assertSame( - $expectedElement->attributes->length, - $actualElement->attributes->length, - \sprintf( - '%s%sNumber of attributes on node "%s" does not match', - $message, - !empty($message) ? "\n" : '', - $expectedElement->tagName - ) - ); - - for ($i = 0; $i < $expectedElement->attributes->length; $i++) { - $expectedAttribute = $expectedElement->attributes->item($i); - $actualAttribute = $actualElement->attributes->getNamedItem($expectedAttribute->name); - - \assert($expectedAttribute instanceof \DOMAttr); - - if (!$actualAttribute) { - static::fail( - \sprintf( - '%s%sCould not find attribute "%s" on node "%s"', - $message, - !empty($message) ? "\n" : '', - $expectedAttribute->name, - $expectedElement->tagName - ) - ); - } - } - } - - Xml::removeCharacterDataNodes($expectedElement); - Xml::removeCharacterDataNodes($actualElement); - - static::assertSame( - $expectedElement->childNodes->length, - $actualElement->childNodes->length, - \sprintf( - '%s%sNumber of child nodes of "%s" differs', - $message, - !empty($message) ? "\n" : '', - $expectedElement->tagName - ) - ); - - for ($i = 0; $i < $expectedElement->childNodes->length; $i++) { - static::assertEqualXMLStructure( - $expectedElement->childNodes->item($i), - $actualElement->childNodes->item($i), - $checkAttributes, - $message - ); - } - } - - /** - * Evaluates a PHPUnit\Framework\Constraint matcher object. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertThat($value, Constraint $constraint, string $message = ''): void - { - self::$count += \count($constraint); - - $constraint->evaluate($value, $message); - } - - /** - * Asserts that a string is a valid JSON string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertJson(string $actualJson, string $message = ''): void - { - static::assertThat($actualJson, static::isJson(), $message); - } - - /** - * Asserts that two given JSON encoded objects or arrays are equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void - { - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - static::assertThat($actualJson, new JsonMatches($expectedJson), $message); - } - - /** - * Asserts that two given JSON encoded objects or arrays are not equal. - * - * @param string $expectedJson - * @param string $actualJson - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, string $message = ''): void - { - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - static::assertThat( - $actualJson, - new LogicalNot( - new JsonMatches($expectedJson) - ), - $message - ); - } - - /** - * Asserts that the generated JSON encoded object and the content of the given file are equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertJsonStringEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - $expectedJson = \file_get_contents($expectedFile); - - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - static::assertThat($actualJson, new JsonMatches($expectedJson), $message); - } - - /** - * Asserts that the generated JSON encoded object and the content of the given file are not equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertJsonStringNotEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - $expectedJson = \file_get_contents($expectedFile); - - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - static::assertThat( - $actualJson, - new LogicalNot( - new JsonMatches($expectedJson) - ), - $message - ); - } - - /** - * Asserts that two JSON files are equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertJsonFileEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - static::assertFileExists($actualFile, $message); - - $actualJson = \file_get_contents($actualFile); - $expectedJson = \file_get_contents($expectedFile); - - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - $constraintExpected = new JsonMatches( - $expectedJson - ); - - $constraintActual = new JsonMatches($actualJson); - - static::assertThat($expectedJson, $constraintActual, $message); - static::assertThat($actualJson, $constraintExpected, $message); - } - - /** - * Asserts that two JSON files are not equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function assertJsonFileNotEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void - { - static::assertFileExists($expectedFile, $message); - static::assertFileExists($actualFile, $message); - - $actualJson = \file_get_contents($actualFile); - $expectedJson = \file_get_contents($expectedFile); - - static::assertJson($expectedJson, $message); - static::assertJson($actualJson, $message); - - $constraintExpected = new JsonMatches( - $expectedJson - ); - - $constraintActual = new JsonMatches($actualJson); - - static::assertThat($expectedJson, new LogicalNot($constraintActual), $message); - static::assertThat($actualJson, new LogicalNot($constraintExpected), $message); - } - - /** - * @throws Exception - */ - public static function logicalAnd(): LogicalAnd - { - $constraints = \func_get_args(); - - $constraint = new LogicalAnd; - $constraint->setConstraints($constraints); - - return $constraint; - } - - public static function logicalOr(): LogicalOr - { - $constraints = \func_get_args(); - - $constraint = new LogicalOr; - $constraint->setConstraints($constraints); - - return $constraint; - } - - public static function logicalNot(Constraint $constraint): LogicalNot - { - return new LogicalNot($constraint); - } - - public static function logicalXor(): LogicalXor - { - $constraints = \func_get_args(); - - $constraint = new LogicalXor; - $constraint->setConstraints($constraints); - - return $constraint; - } - - public static function anything(): IsAnything - { - return new IsAnything; - } - - public static function isTrue(): IsTrue - { - return new IsTrue; - } - - public static function callback(callable $callback): Callback - { - return new Callback($callback); - } - - public static function isFalse(): IsFalse - { - return new IsFalse; - } - - public static function isJson(): IsJson - { - return new IsJson; - } - - public static function isNull(): IsNull - { - return new IsNull; - } - - public static function isFinite(): IsFinite - { - return new IsFinite; - } - - public static function isInfinite(): IsInfinite - { - return new IsInfinite; - } - - public static function isNan(): IsNan - { - return new IsNan; - } - - /** - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function attribute(Constraint $constraint, string $attributeName): Attribute - { - self::createWarning('attribute() is deprecated and will be removed in PHPUnit 9.'); - - return new Attribute($constraint, $attributeName); - } - - /** - * @deprecated Use containsEqual() or containsIdentical() instead - */ - public static function contains($value, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): TraversableContains - { - return new TraversableContains($value, $checkForObjectIdentity, $checkForNonObjectIdentity); - } - - public static function containsEqual($value): TraversableContainsEqual - { - return new TraversableContainsEqual($value); - } - - public static function containsIdentical($value): TraversableContainsIdentical - { - return new TraversableContainsIdentical($value); - } - - public static function containsOnly(string $type): TraversableContainsOnly - { - return new TraversableContainsOnly($type); - } - - public static function containsOnlyInstancesOf(string $className): TraversableContainsOnly - { - return new TraversableContainsOnly($className, false); - } - - /** - * @param int|string $key - */ - public static function arrayHasKey($key): ArrayHasKey - { - return new ArrayHasKey($key); - } - - public static function equalTo($value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): IsEqual - { - return new IsEqual($value, $delta, $maxDepth, $canonicalize, $ignoreCase); - } - - /** - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function attributeEqualTo(string $attributeName, $value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): Attribute - { - self::createWarning('attributeEqualTo() is deprecated and will be removed in PHPUnit 9.'); - - return static::attribute( - static::equalTo( - $value, - $delta, - $maxDepth, - $canonicalize, - $ignoreCase - ), - $attributeName - ); - } - - public static function isEmpty(): IsEmpty - { - return new IsEmpty; - } - - public static function isWritable(): IsWritable - { - return new IsWritable; - } - - public static function isReadable(): IsReadable - { - return new IsReadable; - } - - public static function directoryExists(): DirectoryExists - { - return new DirectoryExists; - } - - public static function fileExists(): FileExists - { - return new FileExists; - } - - public static function greaterThan($value): GreaterThan - { - return new GreaterThan($value); - } - - public static function greaterThanOrEqual($value): LogicalOr - { - return static::logicalOr( - new IsEqual($value), - new GreaterThan($value) - ); - } - - public static function classHasAttribute(string $attributeName): ClassHasAttribute - { - return new ClassHasAttribute($attributeName); - } - - public static function classHasStaticAttribute(string $attributeName): ClassHasStaticAttribute - { - return new ClassHasStaticAttribute($attributeName); - } - - public static function objectHasAttribute($attributeName): ObjectHasAttribute - { - return new ObjectHasAttribute($attributeName); - } - - public static function identicalTo($value): IsIdentical - { - return new IsIdentical($value); - } - - public static function isInstanceOf(string $className): IsInstanceOf - { - return new IsInstanceOf($className); - } - - public static function isType(string $type): IsType - { - return new IsType($type); - } - - public static function lessThan($value): LessThan - { - return new LessThan($value); - } - - public static function lessThanOrEqual($value): LogicalOr - { - return static::logicalOr( - new IsEqual($value), - new LessThan($value) - ); - } - - public static function matchesRegularExpression(string $pattern): RegularExpression - { - return new RegularExpression($pattern); - } - - public static function matches(string $string): StringMatchesFormatDescription - { - return new StringMatchesFormatDescription($string); - } - - public static function stringStartsWith($prefix): StringStartsWith - { - return new StringStartsWith($prefix); - } - - public static function stringContains(string $string, bool $case = true): StringContains - { - return new StringContains($string, $case); - } - - public static function stringEndsWith(string $suffix): StringEndsWith - { - return new StringEndsWith($suffix); - } - - public static function countOf(int $count): Count - { - return new Count($count); - } - - /** - * Fails a test with the given message. - * - * @throws AssertionFailedError - * - * @psalm-return never-return - */ - public static function fail(string $message = ''): void - { - self::$count++; - - throw new AssertionFailedError($message); - } - - /** - * Returns the value of an attribute of a class or an object. - * This also works for attributes that are declared protected or private. - * - * @param object|string $classOrObject - * - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function readAttribute($classOrObject, string $attributeName) - { - self::createWarning('readAttribute() is deprecated and will be removed in PHPUnit 9.'); - - if (!self::isValidClassAttributeName($attributeName)) { - throw InvalidArgumentException::create(2, 'valid attribute name'); - } - - if (\is_string($classOrObject)) { - if (!\class_exists($classOrObject)) { - throw InvalidArgumentException::create( - 1, - 'class name' - ); - } - - return static::getStaticAttribute( - $classOrObject, - $attributeName - ); - } - - if (\is_object($classOrObject)) { - return static::getObjectAttribute( - $classOrObject, - $attributeName - ); - } - - throw InvalidArgumentException::create( - 1, - 'class name or object' - ); - } - - /** - * Returns the value of a static attribute. - * This also works for attributes that are declared protected or private. - * - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function getStaticAttribute(string $className, string $attributeName) - { - self::createWarning('getStaticAttribute() is deprecated and will be removed in PHPUnit 9.'); - - if (!\class_exists($className)) { - throw InvalidArgumentException::create(1, 'class name'); - } - - if (!self::isValidClassAttributeName($attributeName)) { - throw InvalidArgumentException::create(2, 'valid attribute name'); - } - - try { - $class = new \ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - while ($class) { - $attributes = $class->getStaticProperties(); - - if (\array_key_exists($attributeName, $attributes)) { - return $attributes[$attributeName]; - } - - $class = $class->getParentClass(); - } - - throw new Exception( - \sprintf( - 'Attribute "%s" not found in class.', - $attributeName - ) - ); - } - - /** - * Returns the value of an object's attribute. - * This also works for attributes that are declared protected or private. - * - * @param object $object - * - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ - public static function getObjectAttribute($object, string $attributeName) - { - self::createWarning('getObjectAttribute() is deprecated and will be removed in PHPUnit 9.'); - - if (!\is_object($object)) { - throw InvalidArgumentException::create(1, 'object'); - } - - if (!self::isValidClassAttributeName($attributeName)) { - throw InvalidArgumentException::create(2, 'valid attribute name'); - } - - $reflector = new ReflectionObject($object); - - do { - try { - $attribute = $reflector->getProperty($attributeName); - - if (!$attribute || $attribute->isPublic()) { - return $object->$attributeName; - } - - $attribute->setAccessible(true); - $value = $attribute->getValue($object); - $attribute->setAccessible(false); - - return $value; - } catch (\ReflectionException $e) { - } - } while ($reflector = $reflector->getParentClass()); - - throw new Exception( - \sprintf( - 'Attribute "%s" not found in object.', - $attributeName - ) - ); - } - - /** - * Mark the test as incomplete. - * - * @throws IncompleteTestError - * - * @psalm-return never-return - */ - public static function markTestIncomplete(string $message = ''): void - { - throw new IncompleteTestError($message); - } - - /** - * Mark the test as skipped. - * - * @throws SkippedTestError - * @throws SyntheticSkippedError - * - * @psalm-return never-return - */ - public static function markTestSkipped(string $message = ''): void - { - if ($hint = self::detectLocationHint($message)) { - $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS); - \array_unshift($trace, $hint); - - throw new SyntheticSkippedError($hint['message'], 0, $hint['file'], (int) $hint['line'], $trace); - } - - throw new SkippedTestError($message); - } - - /** - * Return the current assertion count. - */ - public static function getCount(): int - { - return self::$count; - } - - /** - * Reset the assertion counter. - */ - public static function resetCount(): void - { - self::$count = 0; - } - - private static function detectLocationHint(string $message): ?array - { - $hint = null; - $lines = \preg_split('/\r\n|\r|\n/', $message); - - while (\strpos($lines[0], '__OFFSET') !== false) { - $offset = \explode('=', \array_shift($lines)); - - if ($offset[0] === '__OFFSET_FILE') { - $hint['file'] = $offset[1]; - } - - if ($offset[0] === '__OFFSET_LINE') { - $hint['line'] = $offset[1]; - } - } - - if ($hint) { - $hint['message'] = \implode(\PHP_EOL, $lines); - } - - return $hint; - } - - private static function isValidObjectAttributeName(string $attributeName): bool - { - return (bool) \preg_match('/[^\x00-\x1f\x7f-\x9f]+/', $attributeName); - } - - private static function isValidClassAttributeName(string $attributeName): bool - { - return (bool) \preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName); - } - - /** - * @codeCoverageIgnore - */ - private static function createWarning(string $warning): void - { - foreach (\debug_backtrace() as $step) { - if (isset($step['object']) && $step['object'] instanceof TestCase) { - \assert($step['object'] instanceof TestCase); - - $step['object']->addWarning($warning); - - break; - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php b/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php deleted file mode 100644 index 0eb101a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php +++ /dev/null @@ -1,2597 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -use PHPUnit\Framework\Assert; -use PHPUnit\Framework\AssertionFailedError; -use PHPUnit\Framework\Constraint\ArrayHasKey; -use PHPUnit\Framework\Constraint\Attribute; -use PHPUnit\Framework\Constraint\Callback; -use PHPUnit\Framework\Constraint\ClassHasAttribute; -use PHPUnit\Framework\Constraint\ClassHasStaticAttribute; -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\Constraint\Count; -use PHPUnit\Framework\Constraint\DirectoryExists; -use PHPUnit\Framework\Constraint\FileExists; -use PHPUnit\Framework\Constraint\GreaterThan; -use PHPUnit\Framework\Constraint\IsAnything; -use PHPUnit\Framework\Constraint\IsEmpty; -use PHPUnit\Framework\Constraint\IsEqual; -use PHPUnit\Framework\Constraint\IsFalse; -use PHPUnit\Framework\Constraint\IsFinite; -use PHPUnit\Framework\Constraint\IsIdentical; -use PHPUnit\Framework\Constraint\IsInfinite; -use PHPUnit\Framework\Constraint\IsInstanceOf; -use PHPUnit\Framework\Constraint\IsJson; -use PHPUnit\Framework\Constraint\IsNan; -use PHPUnit\Framework\Constraint\IsNull; -use PHPUnit\Framework\Constraint\IsReadable; -use PHPUnit\Framework\Constraint\IsTrue; -use PHPUnit\Framework\Constraint\IsType; -use PHPUnit\Framework\Constraint\IsWritable; -use PHPUnit\Framework\Constraint\LessThan; -use PHPUnit\Framework\Constraint\LogicalAnd; -use PHPUnit\Framework\Constraint\LogicalNot; -use PHPUnit\Framework\Constraint\LogicalOr; -use PHPUnit\Framework\Constraint\LogicalXor; -use PHPUnit\Framework\Constraint\ObjectHasAttribute; -use PHPUnit\Framework\Constraint\RegularExpression; -use PHPUnit\Framework\Constraint\StringContains; -use PHPUnit\Framework\Constraint\StringEndsWith; -use PHPUnit\Framework\Constraint\StringMatchesFormatDescription; -use PHPUnit\Framework\Constraint\StringStartsWith; -use PHPUnit\Framework\Constraint\TraversableContains; -use PHPUnit\Framework\Constraint\TraversableContainsEqual; -use PHPUnit\Framework\Constraint\TraversableContainsIdentical; -use PHPUnit\Framework\Constraint\TraversableContainsOnly; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount as AnyInvokedCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtIndex as InvokedAtIndexMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastCount as InvokedAtLeastCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastOnce as InvokedAtLeastOnceMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount as InvokedAtMostCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedCount as InvokedCountMatcher; -use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls as ConsecutiveCallsStub; -use PHPUnit\Framework\MockObject\Stub\Exception as ExceptionStub; -use PHPUnit\Framework\MockObject\Stub\ReturnArgument as ReturnArgumentStub; -use PHPUnit\Framework\MockObject\Stub\ReturnCallback as ReturnCallbackStub; -use PHPUnit\Framework\MockObject\Stub\ReturnSelf as ReturnSelfStub; -use PHPUnit\Framework\MockObject\Stub\ReturnStub; -use PHPUnit\Framework\MockObject\Stub\ReturnValueMap as ReturnValueMapStub; - -/** - * Asserts that an array has a specified key. - * - * @param int|string $key - * @param array|ArrayAccess $array - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertArrayHasKey - */ -function assertArrayHasKey($key, $array, string $message = ''): void -{ - Assert::assertArrayHasKey(...\func_get_args()); -} - -/** - * Asserts that an array has a specified subset. - * - * @param array|ArrayAccess $subset - * @param array|ArrayAccess $array - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @codeCoverageIgnore - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3494 - * @see Assert::assertArraySubset - */ -function assertArraySubset($subset, $array, bool $checkForObjectIdentity = false, string $message = ''): void -{ - Assert::assertArraySubset(...\func_get_args()); -} - -/** - * Asserts that an array does not have a specified key. - * - * @param int|string $key - * @param array|ArrayAccess $array - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertArrayNotHasKey - */ -function assertArrayNotHasKey($key, $array, string $message = ''): void -{ - Assert::assertArrayNotHasKey(...\func_get_args()); -} - -/** - * Asserts that a haystack contains a needle. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertContains - */ -function assertContains($needle, $haystack, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void -{ - Assert::assertContains(...\func_get_args()); -} - -function assertContainsEquals($needle, iterable $haystack, string $message = ''): void -{ - Assert::assertContainsEquals(...\func_get_args()); -} - -/** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object contains a needle. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeContains - */ -function assertAttributeContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void -{ - Assert::assertAttributeContains(...\func_get_args()); -} - -/** - * Asserts that a haystack does not contain a needle. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertNotContains - */ -function assertNotContains($needle, $haystack, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void -{ - Assert::assertNotContains(...\func_get_args()); -} - -function assertNotContainsEquals($needle, iterable $haystack, string $message = ''): void -{ - Assert::assertNotContainsEquals(...\func_get_args()); -} - -/** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object does not contain a needle. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeNotContains - */ -function assertAttributeNotContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void -{ - Assert::assertAttributeNotContains(...\func_get_args()); -} - -/** - * Asserts that a haystack contains only values of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertContainsOnly - */ -function assertContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void -{ - Assert::assertContainsOnly(...\func_get_args()); -} - -/** - * Asserts that a haystack contains only instances of a given class name. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertContainsOnlyInstancesOf - */ -function assertContainsOnlyInstancesOf(string $className, iterable $haystack, string $message = ''): void -{ - Assert::assertContainsOnlyInstancesOf(...\func_get_args()); -} - -/** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object contains only values of a given type. - * - * @param object|string $haystackClassOrObject - * @param bool $isNativeType - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeContainsOnly - */ -function assertAttributeContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void -{ - Assert::assertAttributeContainsOnly(...\func_get_args()); -} - -/** - * Asserts that a haystack does not contain only values of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertNotContainsOnly - */ -function assertNotContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void -{ - Assert::assertNotContainsOnly(...\func_get_args()); -} - -/** - * Asserts that a haystack that is stored in a static attribute of a class - * or an attribute of an object does not contain only values of a given - * type. - * - * @param object|string $haystackClassOrObject - * @param bool $isNativeType - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeNotContainsOnly - */ -function assertAttributeNotContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void -{ - Assert::assertAttributeNotContainsOnly(...\func_get_args()); -} - -/** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @param Countable|iterable $haystack - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertCount - */ -function assertCount(int $expectedCount, $haystack, string $message = ''): void -{ - Assert::assertCount(...\func_get_args()); -} - -/** - * Asserts the number of elements of an array, Countable or Traversable - * that is stored in an attribute. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeCount - */ -function assertAttributeCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void -{ - Assert::assertAttributeCount(...\func_get_args()); -} - -/** - * Asserts the number of elements of an array, Countable or Traversable. - * - * @param Countable|iterable $haystack - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertNotCount - */ -function assertNotCount(int $expectedCount, $haystack, string $message = ''): void -{ - Assert::assertNotCount(...\func_get_args()); -} - -/** - * Asserts the number of elements of an array, Countable or Traversable - * that is stored in an attribute. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeNotCount - */ -function assertAttributeNotCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void -{ - Assert::assertAttributeNotCount(...\func_get_args()); -} - -/** - * Asserts that two variables are equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertEquals - */ -function assertEquals($expected, $actual, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void -{ - Assert::assertEquals(...\func_get_args()); -} - -/** - * Asserts that two variables are equal (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertEqualsCanonicalizing - */ -function assertEqualsCanonicalizing($expected, $actual, string $message = ''): void -{ - Assert::assertEqualsCanonicalizing(...\func_get_args()); -} - -/** - * Asserts that two variables are equal (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertEqualsIgnoringCase - */ -function assertEqualsIgnoringCase($expected, $actual, string $message = ''): void -{ - Assert::assertEqualsIgnoringCase(...\func_get_args()); -} - -/** - * Asserts that two variables are equal (with delta). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertEqualsWithDelta - */ -function assertEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void -{ - Assert::assertEqualsWithDelta(...\func_get_args()); -} - -/** - * Asserts that a variable is equal to an attribute of an object. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeEquals - */ -function assertAttributeEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void -{ - Assert::assertAttributeEquals(...\func_get_args()); -} - -/** - * Asserts that two variables are not equal. - * - * @param float $delta - * @param int $maxDepth - * @param bool $canonicalize - * @param bool $ignoreCase - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertNotEquals - */ -function assertNotEquals($expected, $actual, string $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false): void -{ - Assert::assertNotEquals(...\func_get_args()); -} - -/** - * Asserts that two variables are not equal (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertNotEqualsCanonicalizing - */ -function assertNotEqualsCanonicalizing($expected, $actual, string $message = ''): void -{ - Assert::assertNotEqualsCanonicalizing(...\func_get_args()); -} - -/** - * Asserts that two variables are not equal (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertNotEqualsIgnoringCase - */ -function assertNotEqualsIgnoringCase($expected, $actual, string $message = ''): void -{ - Assert::assertNotEqualsIgnoringCase(...\func_get_args()); -} - -/** - * Asserts that two variables are not equal (with delta). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertNotEqualsWithDelta - */ -function assertNotEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void -{ - Assert::assertNotEqualsWithDelta(...\func_get_args()); -} - -/** - * Asserts that a variable is not equal to an attribute of an object. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeNotEquals - */ -function assertAttributeNotEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void -{ - Assert::assertAttributeNotEquals(...\func_get_args()); -} - -/** - * Asserts that a variable is empty. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert empty $actual - * - * @see Assert::assertEmpty - */ -function assertEmpty($actual, string $message = ''): void -{ - Assert::assertEmpty(...\func_get_args()); -} - -/** - * Asserts that a static attribute of a class or an attribute of an object - * is empty. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeEmpty - */ -function assertAttributeEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void -{ - Assert::assertAttributeEmpty(...\func_get_args()); -} - -/** - * Asserts that a variable is not empty. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !empty $actual - * - * @see Assert::assertNotEmpty - */ -function assertNotEmpty($actual, string $message = ''): void -{ - Assert::assertNotEmpty(...\func_get_args()); -} - -/** - * Asserts that a static attribute of a class or an attribute of an object - * is not empty. - * - * @param object|string $haystackClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeNotEmpty - */ -function assertAttributeNotEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void -{ - Assert::assertAttributeNotEmpty(...\func_get_args()); -} - -/** - * Asserts that a value is greater than another value. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertGreaterThan - */ -function assertGreaterThan($expected, $actual, string $message = ''): void -{ - Assert::assertGreaterThan(...\func_get_args()); -} - -/** - * Asserts that an attribute is greater than another value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeGreaterThan - */ -function assertAttributeGreaterThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void -{ - Assert::assertAttributeGreaterThan(...\func_get_args()); -} - -/** - * Asserts that a value is greater than or equal to another value. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertGreaterThanOrEqual - */ -function assertGreaterThanOrEqual($expected, $actual, string $message = ''): void -{ - Assert::assertGreaterThanOrEqual(...\func_get_args()); -} - -/** - * Asserts that an attribute is greater than or equal to another value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeGreaterThanOrEqual - */ -function assertAttributeGreaterThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void -{ - Assert::assertAttributeGreaterThanOrEqual(...\func_get_args()); -} - -/** - * Asserts that a value is smaller than another value. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertLessThan - */ -function assertLessThan($expected, $actual, string $message = ''): void -{ - Assert::assertLessThan(...\func_get_args()); -} - -/** - * Asserts that an attribute is smaller than another value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeLessThan - */ -function assertAttributeLessThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void -{ - Assert::assertAttributeLessThan(...\func_get_args()); -} - -/** - * Asserts that a value is smaller than or equal to another value. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertLessThanOrEqual - */ -function assertLessThanOrEqual($expected, $actual, string $message = ''): void -{ - Assert::assertLessThanOrEqual(...\func_get_args()); -} - -/** - * Asserts that an attribute is smaller than or equal to another value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeLessThanOrEqual - */ -function assertAttributeLessThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void -{ - Assert::assertAttributeLessThanOrEqual(...\func_get_args()); -} - -/** - * Asserts that the contents of one file is equal to the contents of another - * file. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileEquals - */ -function assertFileEquals(string $expected, string $actual, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void -{ - Assert::assertFileEquals(...\func_get_args()); -} - -/** - * Asserts that the contents of one file is equal to the contents of another - * file (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileEqualsCanonicalizing - */ -function assertFileEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void -{ - Assert::assertFileEqualsCanonicalizing(...\func_get_args()); -} - -/** - * Asserts that the contents of one file is equal to the contents of another - * file (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileEqualsIgnoringCase - */ -function assertFileEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void -{ - Assert::assertFileEqualsIgnoringCase(...\func_get_args()); -} - -/** - * Asserts that the contents of one file is not equal to the contents of - * another file. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileNotEquals - */ -function assertFileNotEquals(string $expected, string $actual, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void -{ - Assert::assertFileNotEquals(...\func_get_args()); -} - -/** - * Asserts that the contents of one file is not equal to the contents of another - * file (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileNotEqualsCanonicalizing - */ -function assertFileNotEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void -{ - Assert::assertFileNotEqualsCanonicalizing(...\func_get_args()); -} - -/** - * Asserts that the contents of one file is not equal to the contents of another - * file (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileNotEqualsIgnoringCase - */ -function assertFileNotEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void -{ - Assert::assertFileNotEqualsIgnoringCase(...\func_get_args()); -} - -/** - * Asserts that the contents of a string is equal - * to the contents of a file. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringEqualsFile - */ -function assertStringEqualsFile(string $expectedFile, string $actualString, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void -{ - Assert::assertStringEqualsFile(...\func_get_args()); -} - -/** - * Asserts that the contents of a string is equal - * to the contents of a file (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringEqualsFileCanonicalizing - */ -function assertStringEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void -{ - Assert::assertStringEqualsFileCanonicalizing(...\func_get_args()); -} - -/** - * Asserts that the contents of a string is equal - * to the contents of a file (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringEqualsFileIgnoringCase - */ -function assertStringEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void -{ - Assert::assertStringEqualsFileIgnoringCase(...\func_get_args()); -} - -/** - * Asserts that the contents of a string is not equal - * to the contents of a file. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringNotEqualsFile - */ -function assertStringNotEqualsFile(string $expectedFile, string $actualString, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void -{ - Assert::assertStringNotEqualsFile(...\func_get_args()); -} - -/** - * Asserts that the contents of a string is not equal - * to the contents of a file (canonicalizing). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringNotEqualsFileCanonicalizing - */ -function assertStringNotEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void -{ - Assert::assertStringNotEqualsFileCanonicalizing(...\func_get_args()); -} - -/** - * Asserts that the contents of a string is not equal - * to the contents of a file (ignoring case). - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringNotEqualsFileIgnoringCase - */ -function assertStringNotEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void -{ - Assert::assertStringNotEqualsFileIgnoringCase(...\func_get_args()); -} - -/** - * Asserts that a file/dir is readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertIsReadable - */ -function assertIsReadable(string $filename, string $message = ''): void -{ - Assert::assertIsReadable(...\func_get_args()); -} - -/** - * Asserts that a file/dir exists and is not readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertNotIsReadable - */ -function assertNotIsReadable(string $filename, string $message = ''): void -{ - Assert::assertNotIsReadable(...\func_get_args()); -} - -/** - * Asserts that a file/dir exists and is writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertIsWritable - */ -function assertIsWritable(string $filename, string $message = ''): void -{ - Assert::assertIsWritable(...\func_get_args()); -} - -/** - * Asserts that a file/dir exists and is not writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertNotIsWritable - */ -function assertNotIsWritable(string $filename, string $message = ''): void -{ - Assert::assertNotIsWritable(...\func_get_args()); -} - -/** - * Asserts that a directory exists. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertDirectoryExists - */ -function assertDirectoryExists(string $directory, string $message = ''): void -{ - Assert::assertDirectoryExists(...\func_get_args()); -} - -/** - * Asserts that a directory does not exist. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertDirectoryNotExists - */ -function assertDirectoryNotExists(string $directory, string $message = ''): void -{ - Assert::assertDirectoryNotExists(...\func_get_args()); -} - -/** - * Asserts that a directory exists and is readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertDirectoryIsReadable - */ -function assertDirectoryIsReadable(string $directory, string $message = ''): void -{ - Assert::assertDirectoryIsReadable(...\func_get_args()); -} - -/** - * Asserts that a directory exists and is not readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertDirectoryNotIsReadable - */ -function assertDirectoryNotIsReadable(string $directory, string $message = ''): void -{ - Assert::assertDirectoryNotIsReadable(...\func_get_args()); -} - -/** - * Asserts that a directory exists and is writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertDirectoryIsWritable - */ -function assertDirectoryIsWritable(string $directory, string $message = ''): void -{ - Assert::assertDirectoryIsWritable(...\func_get_args()); -} - -/** - * Asserts that a directory exists and is not writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertDirectoryNotIsWritable - */ -function assertDirectoryNotIsWritable(string $directory, string $message = ''): void -{ - Assert::assertDirectoryNotIsWritable(...\func_get_args()); -} - -/** - * Asserts that a file exists. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileExists - */ -function assertFileExists(string $filename, string $message = ''): void -{ - Assert::assertFileExists(...\func_get_args()); -} - -/** - * Asserts that a file does not exist. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileNotExists - */ -function assertFileNotExists(string $filename, string $message = ''): void -{ - Assert::assertFileNotExists(...\func_get_args()); -} - -/** - * Asserts that a file exists and is readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileIsReadable - */ -function assertFileIsReadable(string $file, string $message = ''): void -{ - Assert::assertFileIsReadable(...\func_get_args()); -} - -/** - * Asserts that a file exists and is not readable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileNotIsReadable - */ -function assertFileNotIsReadable(string $file, string $message = ''): void -{ - Assert::assertFileNotIsReadable(...\func_get_args()); -} - -/** - * Asserts that a file exists and is writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileIsWritable - */ -function assertFileIsWritable(string $file, string $message = ''): void -{ - Assert::assertFileIsWritable(...\func_get_args()); -} - -/** - * Asserts that a file exists and is not writable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFileNotIsWritable - */ -function assertFileNotIsWritable(string $file, string $message = ''): void -{ - Assert::assertFileNotIsWritable(...\func_get_args()); -} - -/** - * Asserts that a condition is true. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert true $condition - * - * @see Assert::assertTrue - */ -function assertTrue($condition, string $message = ''): void -{ - Assert::assertTrue(...\func_get_args()); -} - -/** - * Asserts that a condition is not true. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !true $condition - * - * @see Assert::assertNotTrue - */ -function assertNotTrue($condition, string $message = ''): void -{ - Assert::assertNotTrue(...\func_get_args()); -} - -/** - * Asserts that a condition is false. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert false $condition - * - * @see Assert::assertFalse - */ -function assertFalse($condition, string $message = ''): void -{ - Assert::assertFalse(...\func_get_args()); -} - -/** - * Asserts that a condition is not false. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !false $condition - * - * @see Assert::assertNotFalse - */ -function assertNotFalse($condition, string $message = ''): void -{ - Assert::assertNotFalse(...\func_get_args()); -} - -/** - * Asserts that a variable is null. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert null $actual - * - * @see Assert::assertNull - */ -function assertNull($actual, string $message = ''): void -{ - Assert::assertNull(...\func_get_args()); -} - -/** - * Asserts that a variable is not null. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !null $actual - * - * @see Assert::assertNotNull - */ -function assertNotNull($actual, string $message = ''): void -{ - Assert::assertNotNull(...\func_get_args()); -} - -/** - * Asserts that a variable is finite. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertFinite - */ -function assertFinite($actual, string $message = ''): void -{ - Assert::assertFinite(...\func_get_args()); -} - -/** - * Asserts that a variable is infinite. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertInfinite - */ -function assertInfinite($actual, string $message = ''): void -{ - Assert::assertInfinite(...\func_get_args()); -} - -/** - * Asserts that a variable is nan. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertNan - */ -function assertNan($actual, string $message = ''): void -{ - Assert::assertNan(...\func_get_args()); -} - -/** - * Asserts that a class has a specified attribute. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertClassHasAttribute - */ -function assertClassHasAttribute(string $attributeName, string $className, string $message = ''): void -{ - Assert::assertClassHasAttribute(...\func_get_args()); -} - -/** - * Asserts that a class does not have a specified attribute. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertClassNotHasAttribute - */ -function assertClassNotHasAttribute(string $attributeName, string $className, string $message = ''): void -{ - Assert::assertClassNotHasAttribute(...\func_get_args()); -} - -/** - * Asserts that a class has a specified static attribute. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertClassHasStaticAttribute - */ -function assertClassHasStaticAttribute(string $attributeName, string $className, string $message = ''): void -{ - Assert::assertClassHasStaticAttribute(...\func_get_args()); -} - -/** - * Asserts that a class does not have a specified static attribute. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertClassNotHasStaticAttribute - */ -function assertClassNotHasStaticAttribute(string $attributeName, string $className, string $message = ''): void -{ - Assert::assertClassNotHasStaticAttribute(...\func_get_args()); -} - -/** - * Asserts that an object has a specified attribute. - * - * @param object $object - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertObjectHasAttribute - */ -function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void -{ - Assert::assertObjectHasAttribute(...\func_get_args()); -} - -/** - * Asserts that an object does not have a specified attribute. - * - * @param object $object - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertObjectNotHasAttribute - */ -function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void -{ - Assert::assertObjectNotHasAttribute(...\func_get_args()); -} - -/** - * Asserts that two variables have the same type and value. - * Used on objects, it asserts that two variables reference - * the same object. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-template ExpectedType - * @psalm-param ExpectedType $expected - * @psalm-assert =ExpectedType $actual - * - * @see Assert::assertSame - */ -function assertSame($expected, $actual, string $message = ''): void -{ - Assert::assertSame(...\func_get_args()); -} - -/** - * Asserts that a variable and an attribute of an object have the same type - * and value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeSame - */ -function assertAttributeSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void -{ - Assert::assertAttributeSame(...\func_get_args()); -} - -/** - * Asserts that two variables do not have the same type and value. - * Used on objects, it asserts that two variables do not reference - * the same object. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertNotSame - */ -function assertNotSame($expected, $actual, string $message = ''): void -{ - Assert::assertNotSame(...\func_get_args()); -} - -/** - * Asserts that a variable and an attribute of an object do not have the - * same type and value. - * - * @param object|string $actualClassOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeNotSame - */ -function assertAttributeNotSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void -{ - Assert::assertAttributeNotSame(...\func_get_args()); -} - -/** - * Asserts that a variable is of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @psalm-template ExpectedType of object - * @psalm-param class-string $expected - * @psalm-assert ExpectedType $actual - * - * @see Assert::assertInstanceOf - */ -function assertInstanceOf(string $expected, $actual, string $message = ''): void -{ - Assert::assertInstanceOf(...\func_get_args()); -} - -/** - * Asserts that an attribute is of a given type. - * - * @param object|string $classOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @psalm-param class-string $expected - * - * @see Assert::assertAttributeInstanceOf - */ -function assertAttributeInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void -{ - Assert::assertAttributeInstanceOf(...\func_get_args()); -} - -/** - * Asserts that a variable is not of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @psalm-template ExpectedType of object - * @psalm-param class-string $expected - * @psalm-assert !ExpectedType $actual - * - * @see Assert::assertNotInstanceOf - */ -function assertNotInstanceOf(string $expected, $actual, string $message = ''): void -{ - Assert::assertNotInstanceOf(...\func_get_args()); -} - -/** - * Asserts that an attribute is of a given type. - * - * @param object|string $classOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @psalm-param class-string $expected - * - * @see Assert::assertAttributeNotInstanceOf - */ -function assertAttributeNotInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void -{ - Assert::assertAttributeNotInstanceOf(...\func_get_args()); -} - -/** - * Asserts that a variable is of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369 - * @codeCoverageIgnore - * - * @see Assert::assertInternalType - */ -function assertInternalType(string $expected, $actual, string $message = ''): void -{ - Assert::assertInternalType(...\func_get_args()); -} - -/** - * Asserts that an attribute is of a given type. - * - * @param object|string $classOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeInternalType - */ -function assertAttributeInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void -{ - Assert::assertAttributeInternalType(...\func_get_args()); -} - -/** - * Asserts that a variable is of type array. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert array $actual - * - * @see Assert::assertIsArray - */ -function assertIsArray($actual, string $message = ''): void -{ - Assert::assertIsArray(...\func_get_args()); -} - -/** - * Asserts that a variable is of type bool. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert bool $actual - * - * @see Assert::assertIsBool - */ -function assertIsBool($actual, string $message = ''): void -{ - Assert::assertIsBool(...\func_get_args()); -} - -/** - * Asserts that a variable is of type float. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert float $actual - * - * @see Assert::assertIsFloat - */ -function assertIsFloat($actual, string $message = ''): void -{ - Assert::assertIsFloat(...\func_get_args()); -} - -/** - * Asserts that a variable is of type int. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert int $actual - * - * @see Assert::assertIsInt - */ -function assertIsInt($actual, string $message = ''): void -{ - Assert::assertIsInt(...\func_get_args()); -} - -/** - * Asserts that a variable is of type numeric. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert numeric $actual - * - * @see Assert::assertIsNumeric - */ -function assertIsNumeric($actual, string $message = ''): void -{ - Assert::assertIsNumeric(...\func_get_args()); -} - -/** - * Asserts that a variable is of type object. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert object $actual - * - * @see Assert::assertIsObject - */ -function assertIsObject($actual, string $message = ''): void -{ - Assert::assertIsObject(...\func_get_args()); -} - -/** - * Asserts that a variable is of type resource. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert resource $actual - * - * @see Assert::assertIsResource - */ -function assertIsResource($actual, string $message = ''): void -{ - Assert::assertIsResource(...\func_get_args()); -} - -/** - * Asserts that a variable is of type string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert string $actual - * - * @see Assert::assertIsString - */ -function assertIsString($actual, string $message = ''): void -{ - Assert::assertIsString(...\func_get_args()); -} - -/** - * Asserts that a variable is of type scalar. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert scalar $actual - * - * @see Assert::assertIsScalar - */ -function assertIsScalar($actual, string $message = ''): void -{ - Assert::assertIsScalar(...\func_get_args()); -} - -/** - * Asserts that a variable is of type callable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert callable $actual - * - * @see Assert::assertIsCallable - */ -function assertIsCallable($actual, string $message = ''): void -{ - Assert::assertIsCallable(...\func_get_args()); -} - -/** - * Asserts that a variable is of type iterable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert iterable $actual - * - * @see Assert::assertIsIterable - */ -function assertIsIterable($actual, string $message = ''): void -{ - Assert::assertIsIterable(...\func_get_args()); -} - -/** - * Asserts that a variable is not of a given type. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369 - * @codeCoverageIgnore - * - * @see Assert::assertNotInternalType - */ -function assertNotInternalType(string $expected, $actual, string $message = ''): void -{ - Assert::assertNotInternalType(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type array. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !array $actual - * - * @see Assert::assertIsNotArray - */ -function assertIsNotArray($actual, string $message = ''): void -{ - Assert::assertIsNotArray(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type bool. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !bool $actual - * - * @see Assert::assertIsNotBool - */ -function assertIsNotBool($actual, string $message = ''): void -{ - Assert::assertIsNotBool(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type float. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !float $actual - * - * @see Assert::assertIsNotFloat - */ -function assertIsNotFloat($actual, string $message = ''): void -{ - Assert::assertIsNotFloat(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type int. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !int $actual - * - * @see Assert::assertIsNotInt - */ -function assertIsNotInt($actual, string $message = ''): void -{ - Assert::assertIsNotInt(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type numeric. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !numeric $actual - * - * @see Assert::assertIsNotNumeric - */ -function assertIsNotNumeric($actual, string $message = ''): void -{ - Assert::assertIsNotNumeric(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type object. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !object $actual - * - * @see Assert::assertIsNotObject - */ -function assertIsNotObject($actual, string $message = ''): void -{ - Assert::assertIsNotObject(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type resource. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !resource $actual - * - * @see Assert::assertIsNotResource - */ -function assertIsNotResource($actual, string $message = ''): void -{ - Assert::assertIsNotResource(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !string $actual - * - * @see Assert::assertIsNotString - */ -function assertIsNotString($actual, string $message = ''): void -{ - Assert::assertIsNotString(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type scalar. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !scalar $actual - * - * @see Assert::assertIsNotScalar - */ -function assertIsNotScalar($actual, string $message = ''): void -{ - Assert::assertIsNotScalar(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type callable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !callable $actual - * - * @see Assert::assertIsNotCallable - */ -function assertIsNotCallable($actual, string $message = ''): void -{ - Assert::assertIsNotCallable(...\func_get_args()); -} - -/** - * Asserts that a variable is not of type iterable. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-assert !iterable $actual - * - * @see Assert::assertIsNotIterable - */ -function assertIsNotIterable($actual, string $message = ''): void -{ - Assert::assertIsNotIterable(...\func_get_args()); -} - -/** - * Asserts that an attribute is of a given type. - * - * @param object|string $classOrObject - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - * - * @see Assert::assertAttributeNotInternalType - */ -function assertAttributeNotInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void -{ - Assert::assertAttributeNotInternalType(...\func_get_args()); -} - -/** - * Asserts that a string matches a given regular expression. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertRegExp - */ -function assertRegExp(string $pattern, string $string, string $message = ''): void -{ - Assert::assertRegExp(...\func_get_args()); -} - -/** - * Asserts that a string does not match a given regular expression. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertNotRegExp - */ -function assertNotRegExp(string $pattern, string $string, string $message = ''): void -{ - Assert::assertNotRegExp(...\func_get_args()); -} - -/** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is the same. - * - * @param Countable|iterable $expected - * @param Countable|iterable $actual - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertSameSize - */ -function assertSameSize($expected, $actual, string $message = ''): void -{ - Assert::assertSameSize(...\func_get_args()); -} - -/** - * Assert that the size of two arrays (or `Countable` or `Traversable` objects) - * is not the same. - * - * @param Countable|iterable $expected - * @param Countable|iterable $actual - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertNotSameSize - */ -function assertNotSameSize($expected, $actual, string $message = ''): void -{ - Assert::assertNotSameSize(...\func_get_args()); -} - -/** - * Asserts that a string matches a given format string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringMatchesFormat - */ -function assertStringMatchesFormat(string $format, string $string, string $message = ''): void -{ - Assert::assertStringMatchesFormat(...\func_get_args()); -} - -/** - * Asserts that a string does not match a given format string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringNotMatchesFormat - */ -function assertStringNotMatchesFormat(string $format, string $string, string $message = ''): void -{ - Assert::assertStringNotMatchesFormat(...\func_get_args()); -} - -/** - * Asserts that a string matches a given format file. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringMatchesFormatFile - */ -function assertStringMatchesFormatFile(string $formatFile, string $string, string $message = ''): void -{ - Assert::assertStringMatchesFormatFile(...\func_get_args()); -} - -/** - * Asserts that a string does not match a given format string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringNotMatchesFormatFile - */ -function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = ''): void -{ - Assert::assertStringNotMatchesFormatFile(...\func_get_args()); -} - -/** - * Asserts that a string starts with a given prefix. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringStartsWith - */ -function assertStringStartsWith(string $prefix, string $string, string $message = ''): void -{ - Assert::assertStringStartsWith(...\func_get_args()); -} - -/** - * Asserts that a string starts not with a given prefix. - * - * @param string $prefix - * @param string $string - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringStartsNotWith - */ -function assertStringStartsNotWith($prefix, $string, string $message = ''): void -{ - Assert::assertStringStartsNotWith(...\func_get_args()); -} - -/** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringContainsString - */ -function assertStringContainsString(string $needle, string $haystack, string $message = ''): void -{ - Assert::assertStringContainsString(...\func_get_args()); -} - -/** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringContainsStringIgnoringCase - */ -function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void -{ - Assert::assertStringContainsStringIgnoringCase(...\func_get_args()); -} - -/** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringNotContainsString - */ -function assertStringNotContainsString(string $needle, string $haystack, string $message = ''): void -{ - Assert::assertStringNotContainsString(...\func_get_args()); -} - -/** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringNotContainsStringIgnoringCase - */ -function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void -{ - Assert::assertStringNotContainsStringIgnoringCase(...\func_get_args()); -} - -/** - * Asserts that a string ends with a given suffix. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringEndsWith - */ -function assertStringEndsWith(string $suffix, string $string, string $message = ''): void -{ - Assert::assertStringEndsWith(...\func_get_args()); -} - -/** - * Asserts that a string ends not with a given suffix. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertStringEndsNotWith - */ -function assertStringEndsNotWith(string $suffix, string $string, string $message = ''): void -{ - Assert::assertStringEndsNotWith(...\func_get_args()); -} - -/** - * Asserts that two XML files are equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertXmlFileEqualsXmlFile - */ -function assertXmlFileEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void -{ - Assert::assertXmlFileEqualsXmlFile(...\func_get_args()); -} - -/** - * Asserts that two XML files are not equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertXmlFileNotEqualsXmlFile - */ -function assertXmlFileNotEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void -{ - Assert::assertXmlFileNotEqualsXmlFile(...\func_get_args()); -} - -/** - * Asserts that two XML documents are equal. - * - * @param DOMDocument|string $actualXml - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertXmlStringEqualsXmlFile - */ -function assertXmlStringEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void -{ - Assert::assertXmlStringEqualsXmlFile(...\func_get_args()); -} - -/** - * Asserts that two XML documents are not equal. - * - * @param DOMDocument|string $actualXml - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertXmlStringNotEqualsXmlFile - */ -function assertXmlStringNotEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void -{ - Assert::assertXmlStringNotEqualsXmlFile(...\func_get_args()); -} - -/** - * Asserts that two XML documents are equal. - * - * @param DOMDocument|string $expectedXml - * @param DOMDocument|string $actualXml - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertXmlStringEqualsXmlString - */ -function assertXmlStringEqualsXmlString($expectedXml, $actualXml, string $message = ''): void -{ - Assert::assertXmlStringEqualsXmlString(...\func_get_args()); -} - -/** - * Asserts that two XML documents are not equal. - * - * @param DOMDocument|string $expectedXml - * @param DOMDocument|string $actualXml - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - * - * @see Assert::assertXmlStringNotEqualsXmlString - */ -function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, string $message = ''): void -{ - Assert::assertXmlStringNotEqualsXmlString(...\func_get_args()); -} - -/** - * Asserts that a hierarchy of DOMElements matches. - * - * @throws AssertionFailedError - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertEqualXMLStructure - */ -function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, bool $checkAttributes = false, string $message = ''): void -{ - Assert::assertEqualXMLStructure(...\func_get_args()); -} - -/** - * Evaluates a PHPUnit\Framework\Constraint matcher object. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertThat - */ -function assertThat($value, Constraint $constraint, string $message = ''): void -{ - Assert::assertThat(...\func_get_args()); -} - -/** - * Asserts that a string is a valid JSON string. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertJson - */ -function assertJson(string $actualJson, string $message = ''): void -{ - Assert::assertJson(...\func_get_args()); -} - -/** - * Asserts that two given JSON encoded objects or arrays are equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertJsonStringEqualsJsonString - */ -function assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void -{ - Assert::assertJsonStringEqualsJsonString(...\func_get_args()); -} - -/** - * Asserts that two given JSON encoded objects or arrays are not equal. - * - * @param string $expectedJson - * @param string $actualJson - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertJsonStringNotEqualsJsonString - */ -function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, string $message = ''): void -{ - Assert::assertJsonStringNotEqualsJsonString(...\func_get_args()); -} - -/** - * Asserts that the generated JSON encoded object and the content of the given file are equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertJsonStringEqualsJsonFile - */ -function assertJsonStringEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void -{ - Assert::assertJsonStringEqualsJsonFile(...\func_get_args()); -} - -/** - * Asserts that the generated JSON encoded object and the content of the given file are not equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertJsonStringNotEqualsJsonFile - */ -function assertJsonStringNotEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void -{ - Assert::assertJsonStringNotEqualsJsonFile(...\func_get_args()); -} - -/** - * Asserts that two JSON files are equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertJsonFileEqualsJsonFile - */ -function assertJsonFileEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void -{ - Assert::assertJsonFileEqualsJsonFile(...\func_get_args()); -} - -/** - * Asserts that two JSON files are not equal. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @see Assert::assertJsonFileNotEqualsJsonFile - */ -function assertJsonFileNotEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void -{ - Assert::assertJsonFileNotEqualsJsonFile(...\func_get_args()); -} - -function logicalAnd(): LogicalAnd -{ - return Assert::logicalAnd(...\func_get_args()); -} - -function logicalOr(): LogicalOr -{ - return Assert::logicalOr(...\func_get_args()); -} - -function logicalNot(Constraint $constraint): LogicalNot -{ - return Assert::logicalNot(...\func_get_args()); -} - -function logicalXor(): LogicalXor -{ - return Assert::logicalXor(...\func_get_args()); -} - -function anything(): IsAnything -{ - return Assert::anything(...\func_get_args()); -} - -function isTrue(): IsTrue -{ - return Assert::isTrue(...\func_get_args()); -} - -function callback(callable $callback): Callback -{ - return Assert::callback(...\func_get_args()); -} - -function isFalse(): IsFalse -{ - return Assert::isFalse(...\func_get_args()); -} - -function isJson(): IsJson -{ - return Assert::isJson(...\func_get_args()); -} - -function isNull(): IsNull -{ - return Assert::isNull(...\func_get_args()); -} - -function isFinite(): IsFinite -{ - return Assert::isFinite(...\func_get_args()); -} - -function isInfinite(): IsInfinite -{ - return Assert::isInfinite(...\func_get_args()); -} - -function isNan(): IsNan -{ - return Assert::isNan(...\func_get_args()); -} - -function attribute(Constraint $constraint, string $attributeName): Attribute -{ - return Assert::attribute(...\func_get_args()); -} - -function contains($value, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): TraversableContains -{ - return Assert::contains(...\func_get_args()); -} - -function containsEqual($value): TraversableContainsEqual -{ - return Assert::containsEqual(...\func_get_args()); -} - -function containsIdentical($value): TraversableContainsIdentical -{ - return Assert::containsIdentical(...\func_get_args()); -} - -function containsOnly(string $type): TraversableContainsOnly -{ - return Assert::containsOnly(...\func_get_args()); -} - -function containsOnlyInstancesOf(string $className): TraversableContainsOnly -{ - return Assert::containsOnlyInstancesOf(...\func_get_args()); -} - -function arrayHasKey($key): ArrayHasKey -{ - return Assert::arrayHasKey(...\func_get_args()); -} - -function equalTo($value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): IsEqual -{ - return Assert::equalTo(...\func_get_args()); -} - -function attributeEqualTo(string $attributeName, $value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): Attribute -{ - return Assert::attributeEqualTo(...\func_get_args()); -} - -function isEmpty(): IsEmpty -{ - return Assert::isEmpty(...\func_get_args()); -} - -function isWritable(): IsWritable -{ - return Assert::isWritable(...\func_get_args()); -} - -function isReadable(): IsReadable -{ - return Assert::isReadable(...\func_get_args()); -} - -function directoryExists(): DirectoryExists -{ - return Assert::directoryExists(...\func_get_args()); -} - -function fileExists(): FileExists -{ - return Assert::fileExists(...\func_get_args()); -} - -function greaterThan($value): GreaterThan -{ - return Assert::greaterThan(...\func_get_args()); -} - -function greaterThanOrEqual($value): LogicalOr -{ - return Assert::greaterThanOrEqual(...\func_get_args()); -} - -function classHasAttribute(string $attributeName): ClassHasAttribute -{ - return Assert::classHasAttribute(...\func_get_args()); -} - -function classHasStaticAttribute(string $attributeName): ClassHasStaticAttribute -{ - return Assert::classHasStaticAttribute(...\func_get_args()); -} - -function objectHasAttribute($attributeName): ObjectHasAttribute -{ - return Assert::objectHasAttribute(...\func_get_args()); -} - -function identicalTo($value): IsIdentical -{ - return Assert::identicalTo(...\func_get_args()); -} - -function isInstanceOf(string $className): IsInstanceOf -{ - return Assert::isInstanceOf(...\func_get_args()); -} - -function isType(string $type): IsType -{ - return Assert::isType(...\func_get_args()); -} - -function lessThan($value): LessThan -{ - return Assert::lessThan(...\func_get_args()); -} - -function lessThanOrEqual($value): LogicalOr -{ - return Assert::lessThanOrEqual(...\func_get_args()); -} - -function matchesRegularExpression(string $pattern): RegularExpression -{ - return Assert::matchesRegularExpression(...\func_get_args()); -} - -function matches(string $string): StringMatchesFormatDescription -{ - return Assert::matches(...\func_get_args()); -} - -function stringStartsWith($prefix): StringStartsWith -{ - return Assert::stringStartsWith(...\func_get_args()); -} - -function stringContains(string $string, bool $case = true): StringContains -{ - return Assert::stringContains(...\func_get_args()); -} - -function stringEndsWith(string $suffix): StringEndsWith -{ - return Assert::stringEndsWith(...\func_get_args()); -} - -function countOf(int $count): Count -{ - return Assert::countOf(...\func_get_args()); -} - -/** - * Returns a matcher that matches when the method is executed - * zero or more times. - */ -function any(): AnyInvokedCountMatcher -{ - return new AnyInvokedCountMatcher; -} - -/** - * Returns a matcher that matches when the method is never executed. - */ -function never(): InvokedCountMatcher -{ - return new InvokedCountMatcher(0); -} - -/** - * Returns a matcher that matches when the method is executed - * at least N times. - */ -function atLeast(int $requiredInvocations): InvokedAtLeastCountMatcher -{ - return new InvokedAtLeastCountMatcher( - $requiredInvocations - ); -} - -/** - * Returns a matcher that matches when the method is executed at least once. - */ -function atLeastOnce(): InvokedAtLeastOnceMatcher -{ - return new InvokedAtLeastOnceMatcher; -} - -/** - * Returns a matcher that matches when the method is executed exactly once. - */ -function once(): InvokedCountMatcher -{ - return new InvokedCountMatcher(1); -} - -/** - * Returns a matcher that matches when the method is executed - * exactly $count times. - */ -function exactly(int $count): InvokedCountMatcher -{ - return new InvokedCountMatcher($count); -} - -/** - * Returns a matcher that matches when the method is executed - * at most N times. - */ -function atMost(int $allowedInvocations): InvokedAtMostCountMatcher -{ - return new InvokedAtMostCountMatcher($allowedInvocations); -} - -/** - * Returns a matcher that matches when the method is executed - * at the given index. - */ -function at(int $index): InvokedAtIndexMatcher -{ - return new InvokedAtIndexMatcher($index); -} - -function returnValue($value): ReturnStub -{ - return new ReturnStub($value); -} - -function returnValueMap(array $valueMap): ReturnValueMapStub -{ - return new ReturnValueMapStub($valueMap); -} - -function returnArgument(int $argumentIndex): ReturnArgumentStub -{ - return new ReturnArgumentStub($argumentIndex); -} - -function returnCallback($callback): ReturnCallbackStub -{ - return new ReturnCallbackStub($callback); -} - -/** - * Returns the current object. - * - * This method is useful when mocking a fluent interface. - */ -function returnSelf(): ReturnSelfStub -{ - return new ReturnSelfStub; -} - -function throwException(Throwable $exception): ExceptionStub -{ - return new ExceptionStub($exception); -} - -function onConsecutiveCalls(): ConsecutiveCallsStub -{ - $args = \func_get_args(); - - return new ConsecutiveCallsStub($args); -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php b/vendor/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php deleted file mode 100644 index eab5a49..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use ArrayAccess; - -/** - * Constraint that asserts that the array it is evaluated for has a given key. - * - * Uses array_key_exists() to check if the key is found in the input array, if - * not found the evaluation fails. - * - * The array key is passed in the constructor. - */ -final class ArrayHasKey extends Constraint -{ - /** - * @var int|string - */ - private $key; - - /** - * @param int|string $key - */ - public function __construct($key) - { - $this->key = $key; - } - - /** - * Returns a string representation of the constraint. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - return 'has the key ' . $this->exporter()->export($this->key); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - if (\is_array($other)) { - return \array_key_exists($this->key, $other); - } - - if ($other instanceof ArrayAccess) { - return $other->offsetExists($this->key); - } - - return false; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - return 'an array ' . $this->toString(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php b/vendor/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php deleted file mode 100644 index a60c261..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; -use SebastianBergmann\Comparator\ComparisonFailure; - -/** - * Constraint that asserts that the array it is evaluated for has a specified subset. - * - * Uses array_replace_recursive() to check if a key value subset is part of the - * subject array. - * - * @codeCoverageIgnore - * - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3494 - */ -final class ArraySubset extends Constraint -{ - /** - * @var iterable - */ - private $subset; - - /** - * @var bool - */ - private $strict; - - public function __construct(iterable $subset, bool $strict = false) - { - $this->strict = $strict; - $this->subset = $subset; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - //type cast $other & $this->subset as an array to allow - //support in standard array functions. - $other = $this->toArray($other); - $this->subset = $this->toArray($this->subset); - - $patched = \array_replace_recursive($other, $this->subset); - - if ($this->strict) { - $result = $other === $patched; - } else { - $result = $other == $patched; - } - - if ($returnResult) { - return $result; - } - - if (!$result) { - $f = new ComparisonFailure( - $patched, - $other, - \var_export($patched, true), - \var_export($other, true) - ); - - $this->fail($other, $description, $f); - } - } - - /** - * Returns a string representation of the constraint. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - return 'has the subset ' . $this->exporter()->export($this->subset); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - return 'an array ' . $this->toString(); - } - - private function toArray(iterable $other): array - { - if (\is_array($other)) { - return $other; - } - - if ($other instanceof \ArrayObject) { - return $other->getArrayCopy(); - } - - if ($other instanceof \Traversable) { - return \iterator_to_array($other); - } - - // Keep BC even if we know that array would not be the expected one - return (array) $other; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Attribute.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Attribute.php deleted file mode 100644 index 36b0532..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Attribute.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\Assert; -use PHPUnit\Framework\ExpectationFailedException; - -/** - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ -final class Attribute extends Composite -{ - /** - * @var string - */ - private $attributeName; - - public function __construct(Constraint $constraint, string $attributeName) - { - parent::__construct($constraint); - - $this->attributeName = $attributeName; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - * @throws \PHPUnit\Framework\Exception - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - return parent::evaluate( - Assert::readAttribute( - $other, - $this->attributeName - ), - $description, - $returnResult - ); - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'attribute "' . $this->attributeName . '" ' . $this->innerConstraint()->toString(); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - return $this->toString(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php deleted file mode 100644 index f537d09..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that evaluates against a specified closure. - */ -final class Callback extends Constraint -{ - /** - * @var callable - */ - private $callback; - - public function __construct(callable $callback) - { - $this->callback = $callback; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is accepted by specified callback'; - } - - /** - * Evaluates the constraint for parameter $value. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \call_user_func($this->callback, $other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php b/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php deleted file mode 100644 index 2a3fd8c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\Exception; - -/** - * Constraint that asserts that the class it is evaluated for has a given - * attribute. - * - * The attribute name is passed in the constructor. - */ -class ClassHasAttribute extends Constraint -{ - /** - * @var string - */ - private $attributeName; - - public function __construct(string $attributeName) - { - $this->attributeName = $attributeName; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return \sprintf( - 'has attribute "%s"', - $this->attributeName - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - try { - return (new \ReflectionClass($other))->hasProperty($this->attributeName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - return \sprintf( - '%sclass "%s" %s', - \is_object($other) ? 'object of ' : '', - \is_object($other) ? \get_class($other) : $other, - $this->toString() - ); - } - - protected function attributeName(): string - { - return $this->attributeName; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php b/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php deleted file mode 100644 index 8afe692..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\Exception; - -/** - * Constraint that asserts that the class it is evaluated for has a given - * static attribute. - * - * The attribute name is passed in the constructor. - */ -final class ClassHasStaticAttribute extends ClassHasAttribute -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return \sprintf( - 'has static attribute "%s"', - $this->attributeName() - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - try { - $class = new \ReflectionClass($other); - - if ($class->hasProperty($this->attributeName())) { - return $class->getProperty($this->attributeName())->isStatic(); - } - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Composite.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Composite.php deleted file mode 100644 index ffb8ff9..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Composite.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; - -/** - * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 - * @codeCoverageIgnore - */ -abstract class Composite extends Constraint -{ - /** - * @var Constraint - */ - private $innerConstraint; - - public function __construct(Constraint $innerConstraint) - { - $this->innerConstraint = $innerConstraint; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - try { - return $this->innerConstraint->evaluate( - $other, - $description, - $returnResult - ); - } catch (ExpectationFailedException $e) { - $this->fail($other, $description, $e->getComparisonFailure()); - } - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - return \count($this->innerConstraint); - } - - protected function innerConstraint(): Constraint - { - return $this->innerConstraint; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php deleted file mode 100644 index de8de05..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php +++ /dev/null @@ -1,154 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use Countable; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\SelfDescribing; -use SebastianBergmann\Comparator\ComparisonFailure; -use SebastianBergmann\Exporter\Exporter; - -/** - * Abstract base class for constraints which can be applied to any value. - */ -abstract class Constraint implements Countable, SelfDescribing -{ - /** - * @var Exporter - */ - private $exporter; - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - $success = false; - - if ($this->matches($other)) { - $success = true; - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - return 1; - } - - protected function exporter(): Exporter - { - if ($this->exporter === null) { - $this->exporter = new Exporter; - } - - return $this->exporter; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * This method can be overridden to implement the evaluation algorithm. - * - * @param mixed $other value or object to evaluate - * @codeCoverageIgnore - */ - protected function matches($other): bool - { - return false; - } - - /** - * Throws an exception for the given compared value and test description - * - * @param mixed $other evaluated value or object - * @param string $description Additional information about the test - * @param ComparisonFailure $comparisonFailure - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-return never-return - */ - protected function fail($other, $description, ComparisonFailure $comparisonFailure = null): void - { - $failureDescription = \sprintf( - 'Failed asserting that %s.', - $this->failureDescription($other) - ); - - $additionalFailureDescription = $this->additionalFailureDescription($other); - - if ($additionalFailureDescription) { - $failureDescription .= "\n" . $additionalFailureDescription; - } - - if (!empty($description)) { - $failureDescription = $description . "\n" . $failureDescription; - } - - throw new ExpectationFailedException( - $failureDescription, - $comparisonFailure - ); - } - - /** - * Return additional failure description where needed - * - * The function can be overridden to provide additional failure - * information like a diff - * - * @param mixed $other evaluated value or object - */ - protected function additionalFailureDescription($other): string - { - return ''; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * To provide additional failure information additionalFailureDescription - * can be used. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - return $this->exporter()->export($other) . ' ' . $this->toString(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Count.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Count.php deleted file mode 100644 index dfb60eb..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Count.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use Countable; -use Generator; -use Iterator; -use IteratorAggregate; -use Traversable; - -class Count extends Constraint -{ - /** - * @var int - */ - private $expectedCount; - - public function __construct(int $expected) - { - $this->expectedCount = $expected; - } - - public function toString(): string - { - return \sprintf( - 'count matches %d', - $this->expectedCount - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - */ - protected function matches($other): bool - { - return $this->expectedCount === $this->getCountOf($other); - } - - /** - * @param iterable $other - */ - protected function getCountOf($other): ?int - { - if ($other instanceof Countable || \is_array($other)) { - return \count($other); - } - - if ($other instanceof \EmptyIterator) { - return 0; - } - - if ($other instanceof Traversable) { - while ($other instanceof IteratorAggregate) { - $other = $other->getIterator(); - } - - $iterator = $other; - - if ($iterator instanceof Generator) { - return $this->getCountOfGenerator($iterator); - } - - if (!$iterator instanceof Iterator) { - return \iterator_count($iterator); - } - - $key = $iterator->key(); - $count = \iterator_count($iterator); - - // Manually rewind $iterator to previous key, since iterator_count - // moves pointer. - if ($key !== null) { - $iterator->rewind(); - - while ($iterator->valid() && $key !== $iterator->key()) { - $iterator->next(); - } - } - - return $count; - } - - return null; - } - - /** - * Returns the total number of iterations from a generator. - * This will fully exhaust the generator. - */ - protected function getCountOfGenerator(Generator $generator): int - { - for ($count = 0; $generator->valid(); $generator->next()) { - ++$count; - } - - return $count; - } - - /** - * Returns the description of the failure. - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - return \sprintf( - 'actual size %d matches expected size %d', - $this->getCountOf($other), - $this->expectedCount - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php b/vendor/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php deleted file mode 100644 index fe7ead8..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that checks if the directory(name) that it is evaluated for exists. - * - * The file path to check is passed as $other in evaluate(). - */ -final class DirectoryExists extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'directory exists'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \is_dir($other); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - return \sprintf( - 'directory "%s" exists', - $other - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/Exception.php b/vendor/phpunit/phpunit/src/Framework/Constraint/Exception.php deleted file mode 100644 index 6a77c1d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/Exception.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Util\Filter; -use Throwable; - -final class Exception extends Constraint -{ - /** - * @var string - */ - private $className; - - public function __construct(string $className) - { - $this->className = $className; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return \sprintf( - 'exception of type "%s"', - $this->className - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return $other instanceof $this->className; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - if ($other !== null) { - $message = ''; - - if ($other instanceof Throwable) { - $message = '. Message was: "' . $other->getMessage() . '" at' - . "\n" . Filter::getFilteredStacktrace($other); - } - - return \sprintf( - 'exception of type "%s" matches expected exception "%s"%s', - \get_class($other), - $this->className, - $message - ); - } - - return \sprintf( - 'exception of type "%s" is thrown', - $this->className - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php b/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php deleted file mode 100644 index d664f5e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -final class ExceptionCode extends Constraint -{ - /** - * @var int|string - */ - private $expectedCode; - - /** - * @param int|string $expected - */ - public function __construct($expected) - { - $this->expectedCode = $expected; - } - - public function toString(): string - { - return 'exception code is '; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param \Throwable $other - */ - protected function matches($other): bool - { - return (string) $other->getCode() === (string) $this->expectedCode; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - return \sprintf( - '%s is equal to expected exception code %s', - $this->exporter()->export($other->getCode()), - $this->exporter()->export($this->expectedCode) - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php b/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php deleted file mode 100644 index 18b7a1d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -final class ExceptionMessage extends Constraint -{ - /** - * @var string - */ - private $expectedMessage; - - public function __construct(string $expected) - { - $this->expectedMessage = $expected; - } - - public function toString(): string - { - if ($this->expectedMessage === '') { - return 'exception message is empty'; - } - - return 'exception message contains '; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param \Throwable $other - */ - protected function matches($other): bool - { - if ($this->expectedMessage === '') { - return $other->getMessage() === ''; - } - - return \strpos((string) $other->getMessage(), $this->expectedMessage) !== false; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - if ($this->expectedMessage === '') { - return \sprintf( - "exception message is empty but is '%s'", - $other->getMessage() - ); - } - - return \sprintf( - "exception message '%s' contains '%s'", - $other->getMessage(), - $this->expectedMessage - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php b/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php deleted file mode 100644 index 747353d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Util\RegularExpression as RegularExpressionUtil; - -final class ExceptionMessageRegularExpression extends Constraint -{ - /** - * @var string - */ - private $expectedMessageRegExp; - - public function __construct(string $expected) - { - $this->expectedMessageRegExp = $expected; - } - - public function toString(): string - { - return 'exception message matches '; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param \PHPUnit\Framework\Exception $other - * - * @throws \Exception - * @throws \PHPUnit\Framework\Exception - */ - protected function matches($other): bool - { - $match = RegularExpressionUtil::safeMatch($this->expectedMessageRegExp, $other->getMessage()); - - if ($match === false) { - throw new \PHPUnit\Framework\Exception( - "Invalid expected exception message regex given: '{$this->expectedMessageRegExp}'" - ); - } - - return $match === 1; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - return \sprintf( - "exception message '%s' matches '%s'", - $other->getMessage(), - $this->expectedMessageRegExp - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/FileExists.php b/vendor/phpunit/phpunit/src/Framework/Constraint/FileExists.php deleted file mode 100644 index b62f9fa..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/FileExists.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that checks if the file(name) that it is evaluated for exists. - * - * The file path to check is passed as $other in evaluate(). - */ -final class FileExists extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'file exists'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \file_exists($other); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - return \sprintf( - 'file "%s" exists', - $other - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php b/vendor/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php deleted file mode 100644 index b007615..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that asserts that the value it is evaluated for is greater - * than a given value. - */ -final class GreaterThan extends Constraint -{ - /** - * @var float|int - */ - private $value; - - /** - * @param float|int $value - */ - public function __construct($value) - { - $this->value = $value; - } - - /** - * Returns a string representation of the constraint. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - return 'is greater than ' . $this->exporter()->export($this->value); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return $this->value < $other; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php deleted file mode 100644 index f1a9e7d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; - -/** - * Constraint that accepts any input value. - */ -final class IsAnything extends Constraint -{ - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - return $returnResult ? true : null; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is anything'; - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - return 0; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php deleted file mode 100644 index 26db5b4..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use Countable; - -/** - * Constraint that checks whether a variable is empty(). - */ -final class IsEmpty extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is empty'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - if ($other instanceof \EmptyIterator) { - return true; - } - - if ($other instanceof Countable) { - return \count($other) === 0; - } - - return empty($other); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - $type = \gettype($other); - - return \sprintf( - '%s %s %s', - \strpos($type, 'a') === 0 || \strpos($type, 'o') === 0 ? 'an' : 'a', - $type, - $this->toString() - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php deleted file mode 100644 index 3306de7..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php +++ /dev/null @@ -1,138 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; -use SebastianBergmann\Comparator\ComparisonFailure; -use SebastianBergmann\Comparator\Factory as ComparatorFactory; - -/** - * Constraint that checks if one value is equal to another. - * - * Equality is checked with PHP's == operator, the operator is explained in - * detail at {@url https://php.net/manual/en/types.comparisons.php}. - * Two values are equal if they have the same value disregarding type. - * - * The expected value is passed in the constructor. - */ -final class IsEqual extends Constraint -{ - /** - * @var mixed - */ - private $value; - - /** - * @var float - */ - private $delta; - - /** - * @var bool - */ - private $canonicalize; - - /** - * @var bool - */ - private $ignoreCase; - - public function __construct($value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false) - { - $this->value = $value; - $this->delta = $delta; - $this->canonicalize = $canonicalize; - $this->ignoreCase = $ignoreCase; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - // If $this->value and $other are identical, they are also equal. - // This is the most common path and will allow us to skip - // initialization of all the comparators. - if ($this->value === $other) { - return true; - } - - $comparatorFactory = ComparatorFactory::getInstance(); - - try { - $comparator = $comparatorFactory->getComparatorFor( - $this->value, - $other - ); - - $comparator->assertEquals( - $this->value, - $other, - $this->delta, - $this->canonicalize, - $this->ignoreCase - ); - } catch (ComparisonFailure $f) { - if ($returnResult) { - return false; - } - - throw new ExpectationFailedException( - \trim($description . "\n" . $f->getMessage()), - $f - ); - } - - return true; - } - - /** - * Returns a string representation of the constraint. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - $delta = ''; - - if (\is_string($this->value)) { - if (\strpos($this->value, "\n") !== false) { - return 'is equal to '; - } - - return \sprintf( - "is equal to '%s'", - $this->value - ); - } - - if ($this->delta != 0) { - $delta = \sprintf( - ' with delta <%F>', - $this->delta - ); - } - - return \sprintf( - 'is equal to %s%s', - $this->exporter()->export($this->value), - $delta - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsFalse.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsFalse.php deleted file mode 100644 index 8b11e0a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsFalse.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that accepts false. - */ -final class IsFalse extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is false'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return $other === false; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsFinite.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsFinite.php deleted file mode 100644 index b36f765..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsFinite.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that accepts finite. - */ -final class IsFinite extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is finite'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \is_finite($other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php deleted file mode 100644 index df3daba..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php +++ /dev/null @@ -1,138 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; -use SebastianBergmann\Comparator\ComparisonFailure; - -/** - * Constraint that asserts that one value is identical to another. - * - * Identical check is performed with PHP's === operator, the operator is - * explained in detail at - * {@url https://php.net/manual/en/types.comparisons.php}. - * Two values are identical if they have the same value and are of the same - * type. - * - * The expected value is passed in the constructor. - */ -final class IsIdentical extends Constraint -{ - /** - * @var float - */ - private const EPSILON = 0.0000000001; - - /** - * @var mixed - */ - private $value; - - public function __construct($value) - { - $this->value = $value; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - if (\is_float($this->value) && \is_float($other) && - !\is_infinite($this->value) && !\is_infinite($other) && - !\is_nan($this->value) && !\is_nan($other)) { - $success = \abs($this->value - $other) < self::EPSILON; - } else { - $success = $this->value === $other; - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $f = null; - - // if both values are strings, make sure a diff is generated - if (\is_string($this->value) && \is_string($other)) { - $f = new ComparisonFailure( - $this->value, - $other, - \sprintf("'%s'", $this->value), - \sprintf("'%s'", $other) - ); - } - - // if both values are array, make sure a diff is generated - if (\is_array($this->value) && \is_array($other)) { - $f = new ComparisonFailure( - $this->value, - $other, - $this->exporter()->export($this->value), - $this->exporter()->export($other) - ); - } - - $this->fail($other, $description, $f); - } - } - - /** - * Returns a string representation of the constraint. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - if (\is_object($this->value)) { - return 'is identical to an object of class "' . - \get_class($this->value) . '"'; - } - - return 'is identical to ' . $this->exporter()->export($this->value); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - if (\is_object($this->value) && \is_object($other)) { - return 'two variables reference the same object'; - } - - if (\is_string($this->value) && \is_string($other)) { - return 'two strings are identical'; - } - - if (\is_array($this->value) && \is_array($other)) { - return 'two arrays are identical'; - } - - return parent::failureDescription($other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php deleted file mode 100644 index 03b991c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that accepts infinite. - */ -final class IsInfinite extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is infinite'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \is_infinite($other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php deleted file mode 100644 index 1e86461..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that asserts that the object it is evaluated for is an instance - * of a given class. - * - * The expected class name is passed in the constructor. - */ -final class IsInstanceOf extends Constraint -{ - /** - * @var string - */ - private $className; - - public function __construct(string $className) - { - $this->className = $className; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return \sprintf( - 'is instance of %s "%s"', - $this->getType(), - $this->className - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return $other instanceof $this->className; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - return \sprintf( - '%s is an instance of %s "%s"', - $this->exporter()->shortenedExport($other), - $this->getType(), - $this->className - ); - } - - private function getType(): string - { - try { - $reflection = new \ReflectionClass($this->className); - - if ($reflection->isInterface()) { - return 'interface'; - } - } catch (\ReflectionException $e) { - } - - return 'class'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsJson.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsJson.php deleted file mode 100644 index 7231628..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsJson.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that asserts that a string is valid JSON. - */ -final class IsJson extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is valid JSON'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - if ($other === '') { - return false; - } - - \json_decode($other); - - if (\json_last_error()) { - return false; - } - - return true; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - if ($other === '') { - return 'an empty string is valid JSON'; - } - - \json_decode($other); - $error = JsonMatchesErrorMessageProvider::determineJsonError( - (string) \json_last_error() - ); - - return \sprintf( - '%s is valid JSON (%s)', - $this->exporter()->shortenedExport($other), - $error - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsNan.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsNan.php deleted file mode 100644 index cc45631..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsNan.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that accepts nan. - */ -final class IsNan extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is nan'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \is_nan($other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsNull.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsNull.php deleted file mode 100644 index 1538138..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsNull.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that accepts null. - */ -final class IsNull extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is null'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return $other === null; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsReadable.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsReadable.php deleted file mode 100644 index c9d56ef..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsReadable.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that checks if the file/dir(name) that it is evaluated for is readable. - * - * The file path to check is passed as $other in evaluate(). - */ -final class IsReadable extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is readable'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \is_readable($other); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - return \sprintf( - '"%s" is readable', - $other - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsTrue.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsTrue.php deleted file mode 100644 index 7948c8f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsTrue.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that accepts true. - */ -final class IsTrue extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is true'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return $other === true; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsType.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsType.php deleted file mode 100644 index 03654f4..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsType.php +++ /dev/null @@ -1,199 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that asserts that the value it is evaluated for is of a - * specified type. - * - * The expected value is passed in the constructor. - */ -final class IsType extends Constraint -{ - /** - * @var string - */ - public const TYPE_ARRAY = 'array'; - - /** - * @var string - */ - public const TYPE_BOOL = 'bool'; - - /** - * @var string - */ - public const TYPE_FLOAT = 'float'; - - /** - * @var string - */ - public const TYPE_INT = 'int'; - - /** - * @var string - */ - public const TYPE_NULL = 'null'; - - /** - * @var string - */ - public const TYPE_NUMERIC = 'numeric'; - - /** - * @var string - */ - public const TYPE_OBJECT = 'object'; - - /** - * @var string - */ - public const TYPE_RESOURCE = 'resource'; - - /** - * @var string - */ - public const TYPE_STRING = 'string'; - - /** - * @var string - */ - public const TYPE_SCALAR = 'scalar'; - - /** - * @var string - */ - public const TYPE_CALLABLE = 'callable'; - - /** - * @var string - */ - public const TYPE_ITERABLE = 'iterable'; - - /** - * @var array - */ - private const KNOWN_TYPES = [ - 'array' => true, - 'boolean' => true, - 'bool' => true, - 'double' => true, - 'float' => true, - 'integer' => true, - 'int' => true, - 'null' => true, - 'numeric' => true, - 'object' => true, - 'real' => true, - 'resource' => true, - 'string' => true, - 'scalar' => true, - 'callable' => true, - 'iterable' => true, - ]; - - /** - * @var string - */ - private $type; - - /** - * @throws \PHPUnit\Framework\Exception - */ - public function __construct(string $type) - { - if (!isset(self::KNOWN_TYPES[$type])) { - throw new \PHPUnit\Framework\Exception( - \sprintf( - 'Type specified for PHPUnit\Framework\Constraint\IsType <%s> ' . - 'is not a valid type.', - $type - ) - ); - } - - $this->type = $type; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return \sprintf( - 'is of type "%s"', - $this->type - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - switch ($this->type) { - case 'numeric': - return \is_numeric($other); - - case 'integer': - case 'int': - return \is_int($other); - - case 'double': - case 'float': - case 'real': - return \is_float($other); - - case 'string': - return \is_string($other); - - case 'boolean': - case 'bool': - return \is_bool($other); - - case 'null': - return null === $other; - - case 'array': - return \is_array($other); - - case 'object': - return \is_object($other); - - case 'resource': - if (\is_resource($other)) { - return true; - } - - try { - $resource = @\get_resource_type($other); - - if (\is_string($resource)) { - return true; - } - } catch (\TypeError $e) { - } - - return false; - - case 'scalar': - return \is_scalar($other); - - case 'callable': - return \is_callable($other); - - case 'iterable': - return \is_iterable($other); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/IsWritable.php b/vendor/phpunit/phpunit/src/Framework/Constraint/IsWritable.php deleted file mode 100644 index 95d3185..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/IsWritable.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that checks if the file/dir(name) that it is evaluated for is writable. - * - * The file path to check is passed as $other in evaluate(). - */ -final class IsWritable extends Constraint -{ - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'is writable'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \is_writable($other); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - */ - protected function failureDescription($other): string - { - return \sprintf( - '"%s" is writable', - $other - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php b/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php deleted file mode 100644 index 0a4f6c2..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Util\Json; -use SebastianBergmann\Comparator\ComparisonFailure; - -/** - * Asserts whether or not two JSON objects are equal. - */ -final class JsonMatches extends Constraint -{ - /** - * @var string - */ - private $value; - - public function __construct(string $value) - { - $this->value = $value; - } - - /** - * Returns a string representation of the object. - */ - public function toString(): string - { - return \sprintf( - 'matches JSON string "%s"', - $this->value - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * This method can be overridden to implement the evaluation algorithm. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - [$error, $recodedOther] = Json::canonicalize($other); - - if ($error) { - return false; - } - - [$error, $recodedValue] = Json::canonicalize($this->value); - - if ($error) { - return false; - } - - return $recodedOther == $recodedValue; - } - - /** - * Throws an exception for the given compared value and test description - * - * @param mixed $other evaluated value or object - * @param string $description Additional information about the test - * @param ComparisonFailure $comparisonFailure - * - * @throws ExpectationFailedException - * @throws \PHPUnit\Framework\Exception - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @psalm-return never-return - */ - protected function fail($other, $description, ComparisonFailure $comparisonFailure = null): void - { - if ($comparisonFailure === null) { - [$error, $recodedOther] = Json::canonicalize($other); - - if ($error) { - parent::fail($other, $description); - } - - [$error, $recodedValue] = Json::canonicalize($this->value); - - if ($error) { - parent::fail($other, $description); - } - - $comparisonFailure = new ComparisonFailure( - \json_decode($this->value), - \json_decode($other), - Json::prettify($recodedValue), - Json::prettify($recodedOther), - false, - 'Failed asserting that two json values are equal.' - ); - } - - parent::fail($other, $description, $comparisonFailure); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php b/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php deleted file mode 100644 index ac1b624..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Provides human readable messages for each JSON error. - */ -final class JsonMatchesErrorMessageProvider -{ - /** - * Translates JSON error to a human readable string. - */ - public static function determineJsonError(string $error, string $prefix = ''): ?string - { - switch ($error) { - case \JSON_ERROR_NONE: - return null; - case \JSON_ERROR_DEPTH: - return $prefix . 'Maximum stack depth exceeded'; - case \JSON_ERROR_STATE_MISMATCH: - return $prefix . 'Underflow or the modes mismatch'; - case \JSON_ERROR_CTRL_CHAR: - return $prefix . 'Unexpected control character found'; - case \JSON_ERROR_SYNTAX: - return $prefix . 'Syntax error, malformed JSON'; - case \JSON_ERROR_UTF8: - return $prefix . 'Malformed UTF-8 characters, possibly incorrectly encoded'; - default: - return $prefix . 'Unknown error'; - } - } - - /** - * Translates a given type to a human readable message prefix. - */ - public static function translateTypeToPrefix(string $type): string - { - switch (\strtolower($type)) { - case 'expected': - $prefix = 'Expected value JSON decode error - '; - - break; - case 'actual': - $prefix = 'Actual value JSON decode error - '; - - break; - default: - $prefix = ''; - - break; - } - - return $prefix; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/LessThan.php b/vendor/phpunit/phpunit/src/Framework/Constraint/LessThan.php deleted file mode 100644 index 781c817..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/LessThan.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that asserts that the value it is evaluated for is less than - * a given value. - */ -final class LessThan extends Constraint -{ - /** - * @var float|int - */ - private $value; - - /** - * @param float|int $value - */ - public function __construct($value) - { - $this->value = $value; - } - - /** - * Returns a string representation of the constraint. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - return 'is less than ' . $this->exporter()->export($this->value); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return $this->value > $other; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php b/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php deleted file mode 100644 index 0e9a94b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php +++ /dev/null @@ -1,119 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; - -/** - * Logical AND. - */ -final class LogicalAnd extends Constraint -{ - /** - * @var Constraint[] - */ - private $constraints = []; - - public static function fromConstraints(Constraint ...$constraints): self - { - $constraint = new self; - - $constraint->constraints = \array_values($constraints); - - return $constraint; - } - - /** - * @param Constraint[] $constraints - * - * @throws \PHPUnit\Framework\Exception - */ - public function setConstraints(array $constraints): void - { - $this->constraints = []; - - foreach ($constraints as $constraint) { - if (!($constraint instanceof Constraint)) { - throw new \PHPUnit\Framework\Exception( - 'All parameters to ' . __CLASS__ . - ' must be a constraint object.' - ); - } - - $this->constraints[] = $constraint; - } - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - $success = true; - - foreach ($this->constraints as $constraint) { - if (!$constraint->evaluate($other, $description, true)) { - $success = false; - - break; - } - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - $text = ''; - - foreach ($this->constraints as $key => $constraint) { - if ($key > 0) { - $text .= ' and '; - } - - $text .= $constraint->toString(); - } - - return $text; - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - $count = 0; - - foreach ($this->constraints as $constraint) { - $count += \count($constraint); - } - - return $count; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php b/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php deleted file mode 100644 index 0822863..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php +++ /dev/null @@ -1,165 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; - -/** - * Logical NOT. - */ -final class LogicalNot extends Constraint -{ - /** - * @var Constraint - */ - private $constraint; - - public static function negate(string $string): string - { - $positives = [ - 'contains ', - 'exists', - 'has ', - 'is ', - 'are ', - 'matches ', - 'starts with ', - 'ends with ', - 'reference ', - 'not not ', - ]; - - $negatives = [ - 'does not contain ', - 'does not exist', - 'does not have ', - 'is not ', - 'are not ', - 'does not match ', - 'starts not with ', - 'ends not with ', - 'don\'t reference ', - 'not ', - ]; - - \preg_match('/(\'[\w\W]*\')([\w\W]*)("[\w\W]*")/i', $string, $matches); - - if (\count($matches) > 0) { - $nonInput = $matches[2]; - - $negatedString = \str_replace( - $nonInput, - \str_replace( - $positives, - $negatives, - $nonInput - ), - $string - ); - } else { - $negatedString = \str_replace( - $positives, - $negatives, - $string - ); - } - - return $negatedString; - } - - /** - * @param Constraint|mixed $constraint - */ - public function __construct($constraint) - { - if (!($constraint instanceof Constraint)) { - $constraint = new IsEqual($constraint); - } - - $this->constraint = $constraint; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - $success = !$this->constraint->evaluate($other, $description, true); - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - switch (\get_class($this->constraint)) { - case LogicalAnd::class: - case self::class: - case LogicalOr::class: - return 'not( ' . $this->constraint->toString() . ' )'; - - default: - return self::negate( - $this->constraint->toString() - ); - } - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - return \count($this->constraint); - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - switch (\get_class($this->constraint)) { - case LogicalAnd::class: - case self::class: - case LogicalOr::class: - return 'not( ' . $this->constraint->failureDescription($other) . ' )'; - - default: - return self::negate( - $this->constraint->failureDescription($other) - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php b/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php deleted file mode 100644 index 0362d39..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; - -/** - * Logical OR. - */ -final class LogicalOr extends Constraint -{ - /** - * @var Constraint[] - */ - private $constraints = []; - - public static function fromConstraints(Constraint ...$constraints): self - { - $constraint = new self; - - $constraint->constraints = \array_values($constraints); - - return $constraint; - } - - /** - * @param Constraint[] $constraints - */ - public function setConstraints(array $constraints): void - { - $this->constraints = []; - - foreach ($constraints as $constraint) { - if (!($constraint instanceof Constraint)) { - $constraint = new IsEqual( - $constraint - ); - } - - $this->constraints[] = $constraint; - } - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - $success = false; - - foreach ($this->constraints as $constraint) { - if ($constraint->evaluate($other, $description, true)) { - $success = true; - - break; - } - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - $text = ''; - - foreach ($this->constraints as $key => $constraint) { - if ($key > 0) { - $text .= ' or '; - } - - $text .= $constraint->toString(); - } - - return $text; - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - $count = 0; - - foreach ($this->constraints as $constraint) { - $count += \count($constraint); - } - - return $count; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php b/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php deleted file mode 100644 index de7f871..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; - -/** - * Logical XOR. - */ -final class LogicalXor extends Constraint -{ - /** - * @var Constraint[] - */ - private $constraints = []; - - public static function fromConstraints(Constraint ...$constraints): self - { - $constraint = new self; - - $constraint->constraints = \array_values($constraints); - - return $constraint; - } - - /** - * @param Constraint[] $constraints - */ - public function setConstraints(array $constraints): void - { - $this->constraints = []; - - foreach ($constraints as $constraint) { - if (!($constraint instanceof Constraint)) { - $constraint = new IsEqual( - $constraint - ); - } - - $this->constraints[] = $constraint; - } - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - $success = true; - $lastResult = null; - - foreach ($this->constraints as $constraint) { - $result = $constraint->evaluate($other, $description, true); - - if ($result === $lastResult) { - $success = false; - - break; - } - - $lastResult = $result; - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - $text = ''; - - foreach ($this->constraints as $key => $constraint) { - if ($key > 0) { - $text .= ' xor '; - } - - $text .= $constraint->toString(); - } - - return $text; - } - - /** - * Counts the number of constraint elements. - */ - public function count(): int - { - $count = 0; - - foreach ($this->constraints as $constraint) { - $count += \count($constraint); - } - - return $count; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php b/vendor/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php deleted file mode 100644 index 8543c22..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use ReflectionObject; - -/** - * Constraint that asserts that the object it is evaluated for has a given - * attribute. - * - * The attribute name is passed in the constructor. - */ -final class ObjectHasAttribute extends ClassHasAttribute -{ - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return (new ReflectionObject($other))->hasProperty($this->attributeName()); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php b/vendor/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php deleted file mode 100644 index 178b637..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that asserts that the string it is evaluated for matches - * a regular expression. - * - * Checks a given value using the Perl Compatible Regular Expression extension - * in PHP. The pattern is matched by executing preg_match(). - * - * The pattern string passed in the constructor. - */ -class RegularExpression extends Constraint -{ - /** - * @var string - */ - private $pattern; - - public function __construct(string $pattern) - { - $this->pattern = $pattern; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return \sprintf( - 'matches PCRE pattern "%s"', - $this->pattern - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \preg_match($this->pattern, $other) > 0; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/SameSize.php b/vendor/phpunit/phpunit/src/Framework/Constraint/SameSize.php deleted file mode 100644 index c6b8703..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/SameSize.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -final class SameSize extends Count -{ - public function __construct(iterable $expected) - { - parent::__construct($this->getCountOf($expected)); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/StringContains.php b/vendor/phpunit/phpunit/src/Framework/Constraint/StringContains.php deleted file mode 100644 index 791fccc..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/StringContains.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that asserts that the string it is evaluated for contains - * a given string. - * - * Uses mb_strpos() to find the position of the string in the input, if not - * found the evaluation fails. - * - * The sub-string is passed in the constructor. - */ -final class StringContains extends Constraint -{ - /** - * @var string - */ - private $string; - - /** - * @var bool - */ - private $ignoreCase; - - public function __construct(string $string, bool $ignoreCase = false) - { - $this->string = $string; - $this->ignoreCase = $ignoreCase; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - if ($this->ignoreCase) { - $string = \mb_strtolower($this->string); - } else { - $string = $this->string; - } - - return \sprintf( - 'contains "%s"', - $string - ); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - if ('' === $this->string) { - return true; - } - - if ($this->ignoreCase) { - return \mb_stripos($other, $this->string) !== false; - } - - return \mb_strpos($other, $this->string) !== false; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php b/vendor/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php deleted file mode 100644 index c4c3c14..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -/** - * Constraint that asserts that the string it is evaluated for ends with a given - * suffix. - */ -final class StringEndsWith extends Constraint -{ - /** - * @var string - */ - private $suffix; - - public function __construct(string $suffix) - { - $this->suffix = $suffix; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'ends with "' . $this->suffix . '"'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \substr($other, 0 - \strlen($this->suffix)) === $this->suffix; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php b/vendor/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php deleted file mode 100644 index ab7e622..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use SebastianBergmann\Diff\Differ; - -/** - * ... - */ -final class StringMatchesFormatDescription extends RegularExpression -{ - /** - * @var string - */ - private $string; - - public function __construct(string $string) - { - parent::__construct( - $this->createPatternFromFormat( - $this->convertNewlines($string) - ) - ); - - $this->string = $string; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return parent::matches( - $this->convertNewlines($other) - ); - } - - protected function failureDescription($other): string - { - return 'string matches format description'; - } - - protected function additionalFailureDescription($other): string - { - $from = \explode("\n", $this->string); - $to = \explode("\n", $this->convertNewlines($other)); - - foreach ($from as $index => $line) { - if (isset($to[$index]) && $line !== $to[$index]) { - $line = $this->createPatternFromFormat($line); - - if (\preg_match($line, $to[$index]) > 0) { - $from[$index] = $to[$index]; - } - } - } - - $this->string = \implode("\n", $from); - $other = \implode("\n", $to); - - return (new Differ("--- Expected\n+++ Actual\n"))->diff($this->string, $other); - } - - private function createPatternFromFormat(string $string): string - { - $string = \strtr( - \preg_quote($string, '/'), - [ - '%%' => '%', - '%e' => '\\' . \DIRECTORY_SEPARATOR, - '%s' => '[^\r\n]+', - '%S' => '[^\r\n]*', - '%a' => '.+', - '%A' => '.*', - '%w' => '\s*', - '%i' => '[+-]?\d+', - '%d' => '\d+', - '%x' => '[0-9a-fA-F]+', - '%f' => '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?', - '%c' => '.', - ] - ); - - return '/^' . $string . '$/s'; - } - - private function convertNewlines($text): string - { - return \preg_replace('/\r\n/', "\n", $text); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php b/vendor/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php deleted file mode 100644 index 27c100a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\InvalidArgumentException; - -/** - * Constraint that asserts that the string it is evaluated for begins with a - * given prefix. - */ -final class StringStartsWith extends Constraint -{ - /** - * @var string - */ - private $prefix; - - public function __construct(string $prefix) - { - if (\strlen($prefix) === 0) { - throw InvalidArgumentException::create(1, 'non-empty string'); - } - - $this->prefix = $prefix; - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'starts with "' . $this->prefix . '"'; - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - return \strpos((string) $other, $this->prefix) === 0; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php b/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php deleted file mode 100644 index be66317..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use SplObjectStorage; - -/** - * Constraint that asserts that the Traversable it is applied to contains - * a given value. - * - * @deprecated Use TraversableContainsEqual or TraversableContainsIdentical instead - */ -final class TraversableContains extends Constraint -{ - /** - * @var bool - */ - private $checkForObjectIdentity; - - /** - * @var bool - */ - private $checkForNonObjectIdentity; - - /** - * @var mixed - */ - private $value; - - public function __construct($value, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false) - { - $this->checkForObjectIdentity = $checkForObjectIdentity; - $this->checkForNonObjectIdentity = $checkForNonObjectIdentity; - $this->value = $value; - } - - /** - * Returns a string representation of the constraint. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - if (\is_string($this->value) && \strpos($this->value, "\n") !== false) { - return 'contains "' . $this->value . '"'; - } - - return 'contains ' . $this->exporter()->export($this->value); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - if ($other instanceof SplObjectStorage) { - return $other->contains($this->value); - } - - if (\is_object($this->value)) { - foreach ($other as $element) { - if ($this->checkForObjectIdentity && $element === $this->value) { - return true; - } - - /* @noinspection TypeUnsafeComparisonInspection */ - if (!$this->checkForObjectIdentity && $element == $this->value) { - return true; - } - } - } else { - foreach ($other as $element) { - if ($this->checkForNonObjectIdentity && $element === $this->value) { - return true; - } - - /* @noinspection TypeUnsafeComparisonInspection */ - if (!$this->checkForNonObjectIdentity && $element == $this->value) { - return true; - } - } - } - - return false; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - return \sprintf( - '%s %s', - \is_array($other) ? 'an array' : 'a traversable', - $this->toString() - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php b/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php deleted file mode 100644 index 495795e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use SplObjectStorage; - -/** - * Constraint that asserts that the Traversable it is applied to contains - * a given value (using non-strict comparison). - */ -final class TraversableContainsEqual extends Constraint -{ - /** - * @var mixed - */ - private $value; - - public function __construct($value) - { - $this->value = $value; - } - - /** - * Returns a string representation of the constraint. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - if (\is_string($this->value) && \strpos($this->value, "\n") !== false) { - return 'contains "' . $this->value . '"'; - } - - return 'contains ' . $this->exporter()->export($this->value); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - if ($other instanceof SplObjectStorage) { - return $other->contains($this->value); - } - - foreach ($other as $element) { - /* @noinspection TypeUnsafeComparisonInspection */ - if ($this->value == $element) { - return true; - } - } - - return false; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - return \sprintf( - '%s %s', - \is_array($other) ? 'an array' : 'a traversable', - $this->toString() - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php b/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php deleted file mode 100644 index aead4b1..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use SplObjectStorage; - -/** - * Constraint that asserts that the Traversable it is applied to contains - * a given value (using strict comparison). - */ -final class TraversableContainsIdentical extends Constraint -{ - /** - * @var mixed - */ - private $value; - - public function __construct($value) - { - $this->value = $value; - } - - /** - * Returns a string representation of the constraint. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - if (\is_string($this->value) && \strpos($this->value, "\n") !== false) { - return 'contains "' . $this->value . '"'; - } - - return 'contains ' . $this->exporter()->export($this->value); - } - - /** - * Evaluates the constraint for parameter $other. Returns true if the - * constraint is met, false otherwise. - * - * @param mixed $other value or object to evaluate - */ - protected function matches($other): bool - { - if ($other instanceof SplObjectStorage) { - return $other->contains($this->value); - } - - foreach ($other as $element) { - if ($this->value === $element) { - return true; - } - } - - return false; - } - - /** - * Returns the description of the failure - * - * The beginning of failure messages is "Failed asserting that" in most - * cases. This method should return the second part of that sentence. - * - * @param mixed $other evaluated value or object - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function failureDescription($other): string - { - return \sprintf( - '%s %s', - \is_array($other) ? 'an array' : 'a traversable', - $this->toString() - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php b/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php deleted file mode 100644 index 2191ae6..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Constraint; - -use PHPUnit\Framework\ExpectationFailedException; - -/** - * Constraint that asserts that the Traversable it is applied to contains - * only values of a given type. - */ -final class TraversableContainsOnly extends Constraint -{ - /** - * @var Constraint - */ - private $constraint; - - /** - * @var string - */ - private $type; - - /** - * @throws \PHPUnit\Framework\Exception - */ - public function __construct(string $type, bool $isNativeType = true) - { - if ($isNativeType) { - $this->constraint = new IsType($type); - } else { - $this->constraint = new IsInstanceOf( - $type - ); - } - - $this->type = $type; - } - - /** - * Evaluates the constraint for parameter $other - * - * If $returnResult is set to false (the default), an exception is thrown - * in case of a failure. null is returned otherwise. - * - * If $returnResult is true, the result of the evaluation is returned as - * a boolean value instead: true in case of success, false in case of a - * failure. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function evaluate($other, string $description = '', bool $returnResult = false) - { - $success = true; - - foreach ($other as $item) { - if (!$this->constraint->evaluate($item, '', true)) { - $success = false; - - break; - } - } - - if ($returnResult) { - return $success; - } - - if (!$success) { - $this->fail($other, $description); - } - } - - /** - * Returns a string representation of the constraint. - */ - public function toString(): string - { - return 'contains only values of type "' . $this->type . '"'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php b/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php deleted file mode 100644 index a65dc34..0000000 --- a/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use PHPUnit\Util\Test as TestUtil; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DataProviderTestSuite extends TestSuite -{ - /** - * @var string[] - */ - private $dependencies = []; - - /** - * @param string[] $dependencies - */ - public function setDependencies(array $dependencies): void - { - $this->dependencies = $dependencies; - - foreach ($this->tests as $test) { - if (!$test instanceof TestCase) { - continue; - } - - $test->setDependencies($dependencies); - } - } - - public function getDependencies(): array - { - return $this->dependencies; - } - - public function hasDependencies(): bool - { - return \count($this->dependencies) > 0; - } - - /** - * Returns the size of the each test created using the data provider(s) - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function getSize(): int - { - [$className, $methodName] = \explode('::', $this->getName()); - - return TestUtil::getSize($className, $methodName); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php b/vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php deleted file mode 100644 index 607c965..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Error; - -final class Deprecated extends Error -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Error/Error.php b/vendor/phpunit/phpunit/src/Framework/Error/Error.php deleted file mode 100644 index 61e80f8..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Error/Error.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Error; - -use PHPUnit\Framework\Exception; - -class Error extends Exception -{ - public function __construct(string $message, int $code, string $file, int $line, \Exception $previous = null) - { - parent::__construct($message, $code, $previous); - - $this->file = $file; - $this->line = $line; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Error/Notice.php b/vendor/phpunit/phpunit/src/Framework/Error/Notice.php deleted file mode 100644 index 4a3d01d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Error/Notice.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Error; - -final class Notice extends Error -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Error/Warning.php b/vendor/phpunit/phpunit/src/Framework/Error/Warning.php deleted file mode 100644 index d49f991..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Error/Warning.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\Error; - -final class Warning extends Error -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php b/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php deleted file mode 100644 index 0ba2528..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class AssertionFailedError extends Exception implements SelfDescribing -{ - /** - * Wrapper for getMessage() which is declared as final. - */ - public function toString(): string - { - return $this->getMessage(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php b/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php deleted file mode 100644 index 36b0723..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class CodeCoverageException extends Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php b/vendor/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php deleted file mode 100644 index 78f89bc..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class CoveredCodeNotExecutedException extends RiskyTestError -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php b/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php deleted file mode 100644 index 838c736..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use PHPUnit\Util\Filter; - -/** - * Base class for all PHPUnit Framework exceptions. - * - * Ensures that exceptions thrown during a test run do not leave stray - * references behind. - * - * Every Exception contains a stack trace. Each stack frame contains the 'args' - * of the called function. The function arguments can contain references to - * instantiated objects. The references prevent the objects from being - * destructed (until test results are eventually printed), so memory cannot be - * freed up. - * - * With enabled process isolation, test results are serialized in the child - * process and unserialized in the parent process. The stack trace of Exceptions - * may contain objects that cannot be serialized or unserialized (e.g., PDO - * connections). Unserializing user-space objects from the child process into - * the parent would break the intended encapsulation of process isolation. - * - * @see http://fabien.potencier.org/article/9/php-serialization-stack-traces-and-exceptions - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class Exception extends \RuntimeException implements \PHPUnit\Exception -{ - /** - * @var array - */ - protected $serializableTrace; - - public function __construct($message = '', $code = 0, \Throwable $previous = null) - { - parent::__construct($message, $code, $previous); - - $this->serializableTrace = $this->getTrace(); - - foreach (\array_keys($this->serializableTrace) as $key) { - unset($this->serializableTrace[$key]['args']); - } - } - - public function __toString(): string - { - $string = TestFailure::exceptionToString($this); - - if ($trace = Filter::getFilteredStacktrace($this)) { - $string .= "\n" . $trace; - } - - return $string; - } - - public function __sleep(): array - { - return \array_keys(\get_object_vars($this)); - } - - /** - * Returns the serializable trace (without 'args'). - */ - public function getSerializableTrace(): array - { - return $this->serializableTrace; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php b/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php deleted file mode 100644 index f7d7a9c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use SebastianBergmann\Comparator\ComparisonFailure; - -/** - * Exception for expectations which failed their check. - * - * The exception contains the error message and optionally a - * SebastianBergmann\Comparator\ComparisonFailure which is used to - * generate diff output of the failed expectations. - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExpectationFailedException extends AssertionFailedError -{ - /** - * @var ComparisonFailure - */ - protected $comparisonFailure; - - public function __construct(string $message, ComparisonFailure $comparisonFailure = null, \Exception $previous = null) - { - $this->comparisonFailure = $comparisonFailure; - - parent::__construct($message, 0, $previous); - } - - public function getComparisonFailure(): ?ComparisonFailure - { - return $this->comparisonFailure; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php b/vendor/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php deleted file mode 100644 index 65f9c8b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class IncompleteTestError extends AssertionFailedError implements IncompleteTest -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php b/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php deleted file mode 100644 index 48249ad..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidArgumentException extends Exception -{ - public static function create(int $argument, string $type): self - { - $stack = \debug_backtrace(); - - return new self( - \sprintf( - 'Argument #%d of %s::%s() must be %s %s', - $argument, - $stack[1]['class'], - $stack[1]['function'], - \in_array(\lcfirst($type)[0], ['a', 'e', 'i', 'o', 'u']) ? 'an' : 'a', - $type - ) - ); - } - - private function __construct(string $message = '', int $code = 0, \Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php b/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php deleted file mode 100644 index ebf2994..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidCoversTargetException extends CodeCoverageException -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php b/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php deleted file mode 100644 index 7e2ef24..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidDataProviderException extends Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php b/vendor/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php deleted file mode 100644 index 567a6c4..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MissingCoversAnnotationException extends RiskyTestError -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php b/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php deleted file mode 100644 index 7ef4153..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NoChildTestSuiteException extends Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/OutputError.php b/vendor/phpunit/phpunit/src/Framework/Exception/OutputError.php deleted file mode 100644 index 1c8b37e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/OutputError.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class OutputError extends AssertionFailedError -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php b/vendor/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php deleted file mode 100644 index 1712613..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class PHPTAssertionFailedError extends SyntheticError -{ - /** - * @var string - */ - private $diff; - - public function __construct(string $message, int $code, string $file, int $line, array $trace, string $diff) - { - parent::__construct($message, $code, $file, $line, $trace); - $this->diff = $diff; - } - - public function getDiff(): string - { - return $this->diff; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php b/vendor/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php deleted file mode 100644 index a66552c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class RiskyTestError extends AssertionFailedError -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php b/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php deleted file mode 100644 index 7d553dc..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SkippedTestError extends AssertionFailedError implements SkippedTest -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php b/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php deleted file mode 100644 index 5448508..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SkippedTestSuiteError extends AssertionFailedError implements SkippedTest -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticError.php b/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticError.php deleted file mode 100644 index c3124ba..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticError.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class SyntheticError extends AssertionFailedError -{ - /** - * The synthetic file. - * - * @var string - */ - protected $syntheticFile = ''; - - /** - * The synthetic line number. - * - * @var int - */ - protected $syntheticLine = 0; - - /** - * The synthetic trace. - * - * @var array - */ - protected $syntheticTrace = []; - - public function __construct(string $message, int $code, string $file, int $line, array $trace) - { - parent::__construct($message, $code); - - $this->syntheticFile = $file; - $this->syntheticLine = $line; - $this->syntheticTrace = $trace; - } - - public function getSyntheticFile(): string - { - return $this->syntheticFile; - } - - public function getSyntheticLine(): int - { - return $this->syntheticLine; - } - - public function getSyntheticTrace(): array - { - return $this->syntheticTrace; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php b/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php deleted file mode 100644 index f6e155d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SyntheticSkippedError extends SyntheticError implements SkippedTest -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php b/vendor/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php deleted file mode 100644 index fcd1d82..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class UnintentionallyCoveredCodeError extends RiskyTestError -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/Exception/Warning.php b/vendor/phpunit/phpunit/src/Framework/Exception/Warning.php deleted file mode 100644 index 35e9449..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Exception/Warning.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Warning extends Exception implements SelfDescribing -{ - /** - * Wrapper for getMessage() which is declared as final. - */ - public function toString(): string - { - return $this->getMessage(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php b/vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php deleted file mode 100644 index 14d422f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use PHPUnit\Util\Filter; -use Throwable; - -/** - * Wraps Exceptions thrown by code under test. - * - * Re-instantiates Exceptions thrown by user-space code to retain their original - * class names, properties, and stack traces (but without arguments). - * - * Unlike PHPUnit\Framework_\Exception, the complete stack of previous Exceptions - * is processed. - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExceptionWrapper extends Exception -{ - /** - * @var string - */ - protected $className; - - /** - * @var null|ExceptionWrapper - */ - protected $previous; - - public function __construct(Throwable $t) - { - // PDOException::getCode() is a string. - // @see https://php.net/manual/en/class.pdoexception.php#95812 - parent::__construct($t->getMessage(), (int) $t->getCode()); - $this->setOriginalException($t); - } - - public function __toString(): string - { - $string = TestFailure::exceptionToString($this); - - if ($trace = Filter::getFilteredStacktrace($this)) { - $string .= "\n" . $trace; - } - - if ($this->previous) { - $string .= "\nCaused by\n" . $this->previous; - } - - return $string; - } - - public function getClassName(): string - { - return $this->className; - } - - public function getPreviousWrapped(): ?self - { - return $this->previous; - } - - public function setClassName(string $className): void - { - $this->className = $className; - } - - public function setOriginalException(\Throwable $t): void - { - $this->originalException($t); - - $this->className = \get_class($t); - $this->file = $t->getFile(); - $this->line = $t->getLine(); - - $this->serializableTrace = $t->getTrace(); - - foreach (\array_keys($this->serializableTrace) as $key) { - unset($this->serializableTrace[$key]['args']); - } - - if ($t->getPrevious()) { - $this->previous = new self($t->getPrevious()); - } - } - - public function getOriginalException(): ?Throwable - { - return $this->originalException(); - } - - /** - * Method to contain static originalException to exclude it from stacktrace to prevent the stacktrace contents, - * which can be quite big, from being garbage-collected, thus blocking memory until shutdown. - * Approach works both for var_dump() and var_export() and print_r() - */ - private function originalException(Throwable $exceptionToStore = null): ?Throwable - { - static $originalExceptions; - - $instanceId = \spl_object_hash($this); - - if ($exceptionToStore) { - $originalExceptions[$instanceId] = $exceptionToStore; - } - - return $originalExceptions[$instanceId] ?? null; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/IncompleteTest.php b/vendor/phpunit/phpunit/src/Framework/IncompleteTest.php deleted file mode 100644 index 268957c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/IncompleteTest.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface IncompleteTest -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php b/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php deleted file mode 100644 index e656248..0000000 --- a/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class IncompleteTestCase extends TestCase -{ - /** - * @var bool - */ - protected $backupGlobals = false; - - /** - * @var bool - */ - protected $backupStaticAttributes = false; - - /** - * @var bool - */ - protected $runTestInSeparateProcess = false; - - /** - * @var bool - */ - protected $useErrorHandler = false; - - /** - * @var string - */ - private $message; - - public function __construct(string $className, string $methodName, string $message = '') - { - parent::__construct($className . '::' . $methodName); - - $this->message = $message; - } - - public function getMessage(): string - { - return $this->message; - } - - /** - * Returns a string representation of the test case. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - return $this->getName(); - } - - /** - * @throws Exception - */ - protected function runTest(): void - { - $this->markTestIncomplete($this->message); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php b/vendor/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php deleted file mode 100644 index feb9cc9..0000000 --- a/vendor/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidParameterGroupException extends Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php deleted file mode 100644 index e2f0a28..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php +++ /dev/null @@ -1,97 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\MockObject\Builder\InvocationMocker as InvocationMockerBuilder; -use PHPUnit\Framework\MockObject\Rule\InvocationOrder; - -/** - * @internal This trait is not covered by the backward compatibility promise for PHPUnit - */ -trait Api -{ - /** - * @var ConfigurableMethod[] - */ - private static $__phpunit_configurableMethods; - - /** - * @var object - */ - private $__phpunit_originalObject; - - /** - * @var bool - */ - private $__phpunit_returnValueGeneration = true; - - /** - * @var InvocationHandler - */ - private $__phpunit_invocationMocker; - - /** @noinspection MagicMethodsValidityInspection */ - public static function __phpunit_initConfigurableMethods(ConfigurableMethod ...$configurableMethods): void - { - if (isset(static::$__phpunit_configurableMethods)) { - throw new ConfigurableMethodsAlreadyInitializedException( - 'Configurable methods is already initialized and can not be reinitialized' - ); - } - - static::$__phpunit_configurableMethods = $configurableMethods; - } - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_setOriginalObject($originalObject): void - { - $this->__phpunit_originalObject = $originalObject; - } - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_setReturnValueGeneration(bool $returnValueGeneration): void - { - $this->__phpunit_returnValueGeneration = $returnValueGeneration; - } - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_getInvocationHandler(): InvocationHandler - { - if ($this->__phpunit_invocationMocker === null) { - $this->__phpunit_invocationMocker = new InvocationHandler( - static::$__phpunit_configurableMethods, - $this->__phpunit_returnValueGeneration - ); - } - - return $this->__phpunit_invocationMocker; - } - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_hasMatchers(): bool - { - return $this->__phpunit_getInvocationHandler()->hasMatchers(); - } - - /** @noinspection MagicMethodsValidityInspection */ - public function __phpunit_verify(bool $unsetInvocationMocker = true): void - { - $this->__phpunit_getInvocationHandler()->verify(); - - if ($unsetInvocationMocker) { - $this->__phpunit_invocationMocker = null; - } - } - - public function expects(InvocationOrder $matcher): InvocationMockerBuilder - { - return $this->__phpunit_getInvocationHandler()->expects($matcher); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php deleted file mode 100644 index 77d1770..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount; - -/** - * @internal This trait is not covered by the backward compatibility promise for PHPUnit - */ -trait Method -{ - public function method() - { - $expects = $this->expects(new AnyInvokedCount); - - return \call_user_func_array( - [$expects, 'method'], - \func_get_args() - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php deleted file mode 100644 index 91e35f9..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This trait is not covered by the backward compatibility promise for PHPUnit - */ -trait MockedCloneMethod -{ - public function __clone() - { - $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationHandler(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php deleted file mode 100644 index 3f493d2..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This trait is not covered by the backward compatibility promise for PHPUnit - */ -trait UnmockedCloneMethod -{ - public function __clone() - { - $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationHandler(); - - parent::__clone(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php deleted file mode 100644 index a68bfad..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface Identity -{ - /** - * Sets the identification of the expectation to $id. - * - * @note The identifier is unique per mock object. - * - * @param string $id unique identification of expectation - */ - public function id($id); -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php deleted file mode 100644 index 76c08f0..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php +++ /dev/null @@ -1,293 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\MockObject\ConfigurableMethod; -use PHPUnit\Framework\MockObject\IncompatibleReturnValueException; -use PHPUnit\Framework\MockObject\InvocationHandler; -use PHPUnit\Framework\MockObject\Matcher; -use PHPUnit\Framework\MockObject\Rule; -use PHPUnit\Framework\MockObject\RuntimeException; -use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls; -use PHPUnit\Framework\MockObject\Stub\Exception; -use PHPUnit\Framework\MockObject\Stub\ReturnArgument; -use PHPUnit\Framework\MockObject\Stub\ReturnCallback; -use PHPUnit\Framework\MockObject\Stub\ReturnReference; -use PHPUnit\Framework\MockObject\Stub\ReturnSelf; -use PHPUnit\Framework\MockObject\Stub\ReturnStub; -use PHPUnit\Framework\MockObject\Stub\ReturnValueMap; -use PHPUnit\Framework\MockObject\Stub\Stub; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvocationMocker implements InvocationStubber, MethodNameMatch -{ - /** - * @var InvocationHandler - */ - private $invocationHandler; - - /** - * @var Matcher - */ - private $matcher; - - /** - * @var ConfigurableMethod[] - */ - private $configurableMethods; - - public function __construct(InvocationHandler $handler, Matcher $matcher, ConfigurableMethod ...$configurableMethods) - { - $this->invocationHandler = $handler; - $this->matcher = $matcher; - $this->configurableMethods = $configurableMethods; - } - - /** - * @return $this - */ - public function id($id): self - { - $this->invocationHandler->registerMatcher($id, $this->matcher); - - return $this; - } - - /** - * @return $this - */ - public function will(Stub $stub): Identity - { - $this->matcher->setStub($stub); - - return $this; - } - - public function willReturn($value, ...$nextValues): self - { - if (\count($nextValues) === 0) { - $this->ensureTypeOfReturnValues([$value]); - - $stub = $value instanceof Stub ? $value : new ReturnStub($value); - } else { - $values = \array_merge([$value], $nextValues); - - $this->ensureTypeOfReturnValues($values); - - $stub = new ConsecutiveCalls($values); - } - - return $this->will($stub); - } - - /** {@inheritDoc} */ - public function willReturnReference(&$reference): self - { - $stub = new ReturnReference($reference); - - return $this->will($stub); - } - - public function willReturnMap(array $valueMap): self - { - $stub = new ReturnValueMap($valueMap); - - return $this->will($stub); - } - - public function willReturnArgument($argumentIndex): self - { - $stub = new ReturnArgument($argumentIndex); - - return $this->will($stub); - } - - /** {@inheritDoc} */ - public function willReturnCallback($callback): self - { - $stub = new ReturnCallback($callback); - - return $this->will($stub); - } - - public function willReturnSelf(): self - { - $stub = new ReturnSelf; - - return $this->will($stub); - } - - public function willReturnOnConsecutiveCalls(...$values): self - { - $stub = new ConsecutiveCalls($values); - - return $this->will($stub); - } - - public function willThrowException(\Throwable $exception): self - { - $stub = new Exception($exception); - - return $this->will($stub); - } - - /** - * @return $this - */ - public function after($id): self - { - $this->matcher->setAfterMatchBuilderId($id); - - return $this; - } - - /** - * @throws RuntimeException - * - * @return $this - */ - public function with(...$arguments): self - { - $this->canDefineParameters(); - - $this->matcher->setParametersRule(new Rule\Parameters($arguments)); - - return $this; - } - - /** - * @param array ...$arguments - * - * @throws RuntimeException - * - * @return $this - */ - public function withConsecutive(...$arguments): self - { - $this->canDefineParameters(); - - $this->matcher->setParametersRule(new Rule\ConsecutiveParameters($arguments)); - - return $this; - } - - /** - * @throws RuntimeException - * - * @return $this - */ - public function withAnyParameters(): self - { - $this->canDefineParameters(); - - $this->matcher->setParametersRule(new Rule\AnyParameters); - - return $this; - } - - /** - * @param Constraint|string $constraint - * - * @throws RuntimeException - * - * @return $this - */ - public function method($constraint): self - { - if ($this->matcher->hasMethodNameRule()) { - throw new RuntimeException( - 'Rule for method name is already defined, cannot redefine' - ); - } - - $configurableMethodNames = \array_map( - static function (ConfigurableMethod $configurable) { - return \strtolower($configurable->getName()); - }, - $this->configurableMethods - ); - - if (\is_string($constraint) && !\in_array(\strtolower($constraint), $configurableMethodNames, true)) { - throw new RuntimeException( - \sprintf( - 'Trying to configure method "%s" which cannot be configured because it does not exist, has not been specified, is final, or is static', - $constraint - ) - ); - } - - $this->matcher->setMethodNameRule(new Rule\MethodName($constraint)); - - return $this; - } - - /** - * Validate that a parameters rule can be defined, throw exceptions otherwise. - * - * @throws RuntimeException - */ - private function canDefineParameters(): void - { - if (!$this->matcher->hasMethodNameRule()) { - throw new RuntimeException( - 'Rule for method name is not defined, cannot define rule for parameters ' . - 'without one' - ); - } - - if ($this->matcher->hasParametersRule()) { - throw new RuntimeException( - 'Rule for parameters is already defined, cannot redefine' - ); - } - } - - private function getConfiguredMethod(): ?ConfigurableMethod - { - $configuredMethod = null; - - foreach ($this->configurableMethods as $configurableMethod) { - if ($this->matcher->getMethodNameRule()->matchesName($configurableMethod->getName())) { - if ($configuredMethod !== null) { - return null; - } - - $configuredMethod = $configurableMethod; - } - } - - return $configuredMethod; - } - - private function ensureTypeOfReturnValues(array $values): void - { - $configuredMethod = $this->getConfiguredMethod(); - - if ($configuredMethod === null) { - return; - } - - foreach ($values as $value) { - if (!$configuredMethod->mayReturn($value)) { - throw new IncompatibleReturnValueException( - \sprintf( - 'Method %s may not return value of type %s, its return declaration is "%s"', - $configuredMethod->getName(), - \is_object($value) ? \get_class($value) : \gettype($value), - $configuredMethod->getReturnTypeDeclaration() - ) - ); - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php deleted file mode 100644 index cb2e0ac..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -use PHPUnit\Framework\MockObject\Stub\Stub; - -interface InvocationStubber -{ - public function will(Stub $stub): Identity; - - /** @return self */ - public function willReturn($value, ...$nextValues)/*: self */; - - /** - * @param mixed $reference - * - * @return self - */ - public function willReturnReference(&$reference)/*: self */; - - /** - * @param array> $valueMap - * - * @return self - */ - public function willReturnMap(array $valueMap)/*: self */; - - /** - * @param int $argumentIndex - * - * @return self - */ - public function willReturnArgument($argumentIndex)/*: self */; - - /** - * @param callable $callback - * - * @return self - */ - public function willReturnCallback($callback)/*: self */; - - /** @return self */ - public function willReturnSelf()/*: self */; - - /** - * @param mixed $values - * - * @return self - */ - public function willReturnOnConsecutiveCalls(...$values)/*: self */; - - /** @return self */ - public function willThrowException(\Throwable $exception)/*: self */; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php deleted file mode 100644 index d343eac..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Match.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface Match extends Stub -{ - /** - * Defines the expectation which must occur before the current is valid. - * - * @param string $id the identification of the expectation that should - * occur before this one - * - * @return Stub - */ - public function after($id); -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php deleted file mode 100644 index f4b1150..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface MethodNameMatch extends ParametersMatch -{ - /** - * Adds a new method name match and returns the parameter match object for - * further matching possibilities. - * - * @param \PHPUnit\Framework\Constraint\Constraint $name Constraint for matching method, if a string is passed it will use the PHPUnit_Framework_Constraint_IsEqual - * - * @return ParametersMatch - */ - public function method($name); -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php deleted file mode 100644 index ae16d79..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface ParametersMatch extends Match -{ - /** - * Sets the parameters to match for, each parameter to this function will - * be part of match. To perform specific matches or constraints create a - * new PHPUnit\Framework\Constraint\Constraint and use it for the parameter. - * If the parameter value is not a constraint it will use the - * PHPUnit\Framework\Constraint\IsEqual for the value. - * - * Some examples: - * - * // match first parameter with value 2 - * $b->with(2); - * // match first parameter with value 'smock' and second identical to 42 - * $b->with('smock', new PHPUnit\Framework\Constraint\IsEqual(42)); - * - * - * @return ParametersMatch - */ - public function with(...$arguments); - - /** - * Sets a rule which allows any kind of parameters. - * - * Some examples: - * - * // match any number of parameters - * $b->withAnyParameters(); - * - * - * @return ParametersMatch - */ - public function withAnyParameters(); -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php deleted file mode 100644 index d7cb78f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Builder; - -use PHPUnit\Framework\MockObject\Stub\Stub as BaseStub; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface Stub extends Identity -{ - /** - * Stubs the matching method with the stub object $stub. Any invocations of - * the matched method will now be handled by the stub instead. - */ - public function will(BaseStub $stub): Identity; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php b/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php deleted file mode 100644 index f65983d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use SebastianBergmann\Type\Type; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ConfigurableMethod -{ - /** - * @var string - */ - private $name; - - /** - * @var Type - */ - private $returnType; - - public function __construct(string $name, Type $returnType) - { - $this->name = $name; - $this->returnType = $returnType; - } - - public function getName(): string - { - return $this->name; - } - - public function mayReturn($value): bool - { - if ($value === null && $this->returnType->allowsNull()) { - return true; - } - - return $this->returnType->isAssignable(Type::fromValue($value, false)); - } - - public function getReturnTypeDeclaration(): string - { - return $this->returnType->getReturnTypeDeclaration(); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php deleted file mode 100644 index 7e655e2..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class BadMethodCallException extends \BadMethodCallException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php deleted file mode 100644 index d12ac99..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ConfigurableMethodsAlreadyInitializedException extends \PHPUnit\Framework\Exception implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php deleted file mode 100644 index 7307fba..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface Exception extends \Throwable -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php deleted file mode 100644 index f1ceb1d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class IncompatibleReturnValueException extends \PHPUnit\Framework\Exception implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php deleted file mode 100644 index 33b6a5b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RuntimeException extends \RuntimeException implements Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php deleted file mode 100644 index 01aae5d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php +++ /dev/null @@ -1,1050 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use Doctrine\Instantiator\Exception\ExceptionInterface as InstantiatorException; -use Doctrine\Instantiator\Instantiator; -use PHPUnit\Framework\InvalidArgumentException; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Generator -{ - /** - * @var array - */ - private const BLACKLISTED_METHOD_NAMES = [ - '__CLASS__' => true, - '__DIR__' => true, - '__FILE__' => true, - '__FUNCTION__' => true, - '__LINE__' => true, - '__METHOD__' => true, - '__NAMESPACE__' => true, - '__TRAIT__' => true, - '__clone' => true, - '__halt_compiler' => true, - ]; - - /** - * @var array - */ - private static $cache = []; - - /** - * @var \Text_Template[] - */ - private static $templates = []; - - /** - * Returns a mock object for the specified class. - * - * @param string|string[] $type - * @param null|array $methods - * - * @throws RuntimeException - */ - public function getMock($type, $methods = [], array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = true, bool $callOriginalMethods = false, object $proxyTarget = null, bool $allowMockingUnknownTypes = true, bool $returnValueGeneration = true): MockObject - { - if (!\is_array($type) && !\is_string($type)) { - throw InvalidArgumentException::create(1, 'array or string'); - } - - if (!\is_array($methods) && null !== $methods) { - throw InvalidArgumentException::create(2, 'array'); - } - - if ($type === 'Traversable' || $type === '\\Traversable') { - $type = 'Iterator'; - } - - if (\is_array($type)) { - $type = \array_unique( - \array_map( - static function ($type) { - if ($type === 'Traversable' || - $type === '\\Traversable' || - $type === '\\Iterator') { - return 'Iterator'; - } - - return $type; - }, - $type - ) - ); - } - - if (!$allowMockingUnknownTypes) { - if (\is_array($type)) { - foreach ($type as $_type) { - if (!\class_exists($_type, $callAutoload) && - !\interface_exists($_type, $callAutoload)) { - throw new RuntimeException( - \sprintf( - 'Cannot stub or mock class or interface "%s" which does not exist', - $_type - ) - ); - } - } - } elseif (!\class_exists($type, $callAutoload) && !\interface_exists($type, $callAutoload)) { - throw new RuntimeException( - \sprintf( - 'Cannot stub or mock class or interface "%s" which does not exist', - $type - ) - ); - } - } - - if (null !== $methods) { - foreach ($methods as $method) { - if (!\preg_match('~[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*~', (string) $method)) { - throw new RuntimeException( - \sprintf( - 'Cannot stub or mock method with invalid name "%s"', - $method - ) - ); - } - } - - if ($methods !== \array_unique($methods)) { - throw new RuntimeException( - \sprintf( - 'Cannot stub or mock using a method list that contains duplicates: "%s" (duplicate: "%s")', - \implode(', ', $methods), - \implode(', ', \array_unique(\array_diff_assoc($methods, \array_unique($methods)))) - ) - ); - } - } - - if ($mockClassName !== '' && \class_exists($mockClassName, false)) { - try { - $reflector = new \ReflectionClass($mockClassName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if (!$reflector->implementsInterface(MockObject::class)) { - throw new RuntimeException( - \sprintf( - 'Class "%s" already exists.', - $mockClassName - ) - ); - } - } - - if (!$callOriginalConstructor && $callOriginalMethods) { - throw new RuntimeException( - 'Proxying to original methods requires invoking the original constructor' - ); - } - - $mock = $this->generate( - $type, - $methods, - $mockClassName, - $callOriginalClone, - $callAutoload, - $cloneArguments, - $callOriginalMethods - ); - - return $this->getObject( - $mock, - $type, - $callOriginalConstructor, - $callAutoload, - $arguments, - $callOriginalMethods, - $proxyTarget, - $returnValueGeneration - ); - } - - /** - * Returns a mock object for the specified abstract class with all abstract - * methods of the class mocked. Concrete methods to mock can be specified with - * the $mockedMethods parameter - * - * @psalm-template RealInstanceType of object - * @psalm-param class-string $originalClassName - * @psalm-return MockObject&RealInstanceType - * - * @throws RuntimeException - */ - public function getMockForAbstractClass(string $originalClassName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = null, bool $cloneArguments = true): MockObject - { - if (\class_exists($originalClassName, $callAutoload) || - \interface_exists($originalClassName, $callAutoload)) { - try { - $reflector = new \ReflectionClass($originalClassName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $methods = $mockedMethods; - - foreach ($reflector->getMethods() as $method) { - if ($method->isAbstract() && !\in_array($method->getName(), $methods ?? [], true)) { - $methods[] = $method->getName(); - } - } - - if (empty($methods)) { - $methods = null; - } - - return $this->getMock( - $originalClassName, - $methods, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $cloneArguments - ); - } - - throw new RuntimeException( - \sprintf('Class "%s" does not exist.', $originalClassName) - ); - } - - /** - * Returns a mock object for the specified trait with all abstract methods - * of the trait mocked. Concrete methods to mock can be specified with the - * `$mockedMethods` parameter. - * - * @throws RuntimeException - */ - public function getMockForTrait(string $traitName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = null, bool $cloneArguments = true): MockObject - { - if (!\trait_exists($traitName, $callAutoload)) { - throw new RuntimeException( - \sprintf( - 'Trait "%s" does not exist.', - $traitName - ) - ); - } - - $className = $this->generateClassName( - $traitName, - '', - 'Trait_' - ); - - $classTemplate = $this->getTemplate('trait_class.tpl'); - - $classTemplate->setVar( - [ - 'prologue' => 'abstract ', - 'class_name' => $className['className'], - 'trait_name' => $traitName, - ] - ); - - $mockTrait = new MockTrait($classTemplate->render(), $className['className']); - $mockTrait->generate(); - - return $this->getMockForAbstractClass($className['className'], $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $mockedMethods, $cloneArguments); - } - - /** - * Returns an object for the specified trait. - * - * @throws RuntimeException - */ - public function getObjectForTrait(string $traitName, string $traitClassName = '', bool $callAutoload = true, bool $callOriginalConstructor = false, array $arguments = []): object - { - if (!\trait_exists($traitName, $callAutoload)) { - throw new RuntimeException( - \sprintf( - 'Trait "%s" does not exist.', - $traitName - ) - ); - } - - $className = $this->generateClassName( - $traitName, - $traitClassName, - 'Trait_' - ); - - $classTemplate = $this->getTemplate('trait_class.tpl'); - - $classTemplate->setVar( - [ - 'prologue' => '', - 'class_name' => $className['className'], - 'trait_name' => $traitName, - ] - ); - - return $this->getObject( - new MockTrait( - $classTemplate->render(), - $className['className'] - ), - '', - $callOriginalConstructor, - $callAutoload, - $arguments - ); - } - - public function generate($type, array $methods = null, string $mockClassName = '', bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = true, bool $callOriginalMethods = false): MockClass - { - if (\is_array($type)) { - \sort($type); - } - - if ($mockClassName !== '') { - return $this->generateMock( - $type, - $methods, - $mockClassName, - $callOriginalClone, - $callAutoload, - $cloneArguments, - $callOriginalMethods - ); - } - - $key = \md5( - \is_array($type) ? \implode('_', $type) : $type . - \serialize($methods) . - \serialize($callOriginalClone) . - \serialize($cloneArguments) . - \serialize($callOriginalMethods) - ); - - if (!isset(self::$cache[$key])) { - self::$cache[$key] = $this->generateMock( - $type, - $methods, - $mockClassName, - $callOriginalClone, - $callAutoload, - $cloneArguments, - $callOriginalMethods - ); - } - - return self::$cache[$key]; - } - - /** - * @throws RuntimeException - */ - public function generateClassFromWsdl(string $wsdlFile, string $className, array $methods = [], array $options = []): string - { - if (!\extension_loaded('soap')) { - throw new RuntimeException( - 'The SOAP extension is required to generate a mock object from WSDL.' - ); - } - - $options = \array_merge($options, ['cache_wsdl' => \WSDL_CACHE_NONE]); - - try { - $client = new \SoapClient($wsdlFile, $options); - $_methods = \array_unique($client->__getFunctions()); - unset($client); - } catch (\SoapFault $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - - \sort($_methods); - - $methodTemplate = $this->getTemplate('wsdl_method.tpl'); - $methodsBuffer = ''; - - foreach ($_methods as $method) { - \preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(/', $method, $matches, \PREG_OFFSET_CAPTURE); - $lastFunction = \array_pop($matches[0]); - $nameStart = $lastFunction[1]; - $nameEnd = $nameStart + \strlen($lastFunction[0]) - 1; - $name = \str_replace('(', '', $lastFunction[0]); - - if (empty($methods) || \in_array($name, $methods, true)) { - $args = \explode( - ',', - \str_replace(')', '', \substr($method, $nameEnd + 1)) - ); - - foreach (\range(0, \count($args) - 1) as $i) { - $args[$i] = \substr($args[$i], \strpos($args[$i], '$')); - } - - $methodTemplate->setVar( - [ - 'method_name' => $name, - 'arguments' => \implode(', ', $args), - ] - ); - - $methodsBuffer .= $methodTemplate->render(); - } - } - - $optionsBuffer = '['; - - foreach ($options as $key => $value) { - $optionsBuffer .= $key . ' => ' . $value; - } - - $optionsBuffer .= ']'; - - $classTemplate = $this->getTemplate('wsdl_class.tpl'); - $namespace = ''; - - if (\strpos($className, '\\') !== false) { - $parts = \explode('\\', $className); - $className = \array_pop($parts); - $namespace = 'namespace ' . \implode('\\', $parts) . ';' . "\n\n"; - } - - $classTemplate->setVar( - [ - 'namespace' => $namespace, - 'class_name' => $className, - 'wsdl' => $wsdlFile, - 'options' => $optionsBuffer, - 'methods' => $methodsBuffer, - ] - ); - - return $classTemplate->render(); - } - - /** - * @throws RuntimeException - * - * @return string[] - */ - public function getClassMethods(string $className): array - { - try { - $class = new \ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $methods = []; - - foreach ($class->getMethods() as $method) { - if ($method->isPublic() || $method->isAbstract()) { - $methods[] = $method->getName(); - } - } - - return $methods; - } - - /** - * @throws RuntimeException - * - * @return MockMethod[] - */ - public function mockClassMethods(string $className, bool $callOriginalMethods, bool $cloneArguments): array - { - try { - $class = new \ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $methods = []; - - foreach ($class->getMethods() as $method) { - if (($method->isPublic() || $method->isAbstract()) && $this->canMockMethod($method)) { - $methods[] = MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments); - } - } - - return $methods; - } - - /** - * @throws RuntimeException - * - * @return MockMethod[] - */ - public function mockInterfaceMethods(string $interfaceName, bool $cloneArguments): array - { - try { - $class = new \ReflectionClass($interfaceName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $methods = []; - - foreach ($class->getMethods() as $method) { - $methods[] = MockMethod::fromReflection($method, false, $cloneArguments); - } - - return $methods; - } - - /** - * @psalm-param class-string $interfaceName - * - * @return \ReflectionMethod[] - */ - private function userDefinedInterfaceMethods(string $interfaceName): array - { - try { - // @codeCoverageIgnoreStart - $interface = new \ReflectionClass($interfaceName); - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $methods = []; - - foreach ($interface->getMethods() as $method) { - if (!$method->isUserDefined()) { - continue; - } - - $methods[] = $method; - } - - return $methods; - } - - private function getObject(MockType $mockClass, $type = '', bool $callOriginalConstructor = false, bool $callAutoload = false, array $arguments = [], bool $callOriginalMethods = false, object $proxyTarget = null, bool $returnValueGeneration = true) - { - $className = $mockClass->generate(); - - if ($callOriginalConstructor) { - if (\count($arguments) === 0) { - $object = new $className; - } else { - try { - $class = new \ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $object = $class->newInstanceArgs($arguments); - } - } else { - try { - $object = (new Instantiator)->instantiate($className); - } catch (InstantiatorException $exception) { - throw new RuntimeException($exception->getMessage()); - } - } - - if ($callOriginalMethods) { - if (!\is_object($proxyTarget)) { - if (\count($arguments) === 0) { - $proxyTarget = new $type; - } else { - try { - $class = new \ReflectionClass($type); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $proxyTarget = $class->newInstanceArgs($arguments); - } - } - - $object->__phpunit_setOriginalObject($proxyTarget); - } - - if ($object instanceof MockObject) { - $object->__phpunit_setReturnValueGeneration($returnValueGeneration); - } - - return $object; - } - - /** - * @param array|string $type - * - * @throws RuntimeException - */ - private function generateMock($type, ?array $explicitMethods, string $mockClassName, bool $callOriginalClone, bool $callAutoload, bool $cloneArguments, bool $callOriginalMethods): MockClass - { - $classTemplate = $this->getTemplate('mocked_class.tpl'); - $additionalInterfaces = []; - $mockedCloneMethod = false; - $unmockedCloneMethod = false; - $isClass = false; - $isInterface = false; - $class = null; - $mockMethods = new MockMethodSet; - - if (\is_array($type)) { - $interfaceMethods = []; - - foreach ($type as $_type) { - if (!\interface_exists($_type, $callAutoload)) { - throw new RuntimeException( - \sprintf( - 'Interface "%s" does not exist.', - $_type - ) - ); - } - - $additionalInterfaces[] = $_type; - - try { - $typeClass = new \ReflectionClass($_type); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - foreach ($this->getClassMethods($_type) as $method) { - if (\in_array($method, $interfaceMethods, true)) { - throw new RuntimeException( - \sprintf( - 'Duplicate method "%s" not allowed.', - $method - ) - ); - } - - try { - $methodReflection = $typeClass->getMethod($method); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($this->canMockMethod($methodReflection)) { - $mockMethods->addMethods( - MockMethod::fromReflection($methodReflection, $callOriginalMethods, $cloneArguments) - ); - - $interfaceMethods[] = $method; - } - } - } - - unset($interfaceMethods); - } - - $mockClassName = $this->generateClassName( - $type, - $mockClassName, - 'Mock_' - ); - - if (\class_exists($mockClassName['fullClassName'], $callAutoload)) { - $isClass = true; - } elseif (\interface_exists($mockClassName['fullClassName'], $callAutoload)) { - $isInterface = true; - } - - if (!$isClass && !$isInterface) { - $prologue = 'class ' . $mockClassName['originalClassName'] . "\n{\n}\n\n"; - - if (!empty($mockClassName['namespaceName'])) { - $prologue = 'namespace ' . $mockClassName['namespaceName'] . - " {\n\n" . $prologue . "}\n\n" . - "namespace {\n\n"; - - $epilogue = "\n\n}"; - } - - $mockedCloneMethod = true; - } else { - try { - $class = new \ReflectionClass($mockClassName['fullClassName']); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($class->isFinal()) { - throw new RuntimeException( - \sprintf( - 'Class "%s" is declared "final" and cannot be mocked.', - $mockClassName['fullClassName'] - ) - ); - } - - // @see https://github.com/sebastianbergmann/phpunit/issues/2995 - if ($isInterface && $class->implementsInterface(\Throwable::class)) { - $actualClassName = \Exception::class; - $additionalInterfaces[] = $class->getName(); - $isInterface = false; - - try { - $class = new \ReflectionClass($actualClassName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - foreach ($this->userDefinedInterfaceMethods($mockClassName['fullClassName']) as $method) { - $methodName = $method->getName(); - - if ($class->hasMethod($methodName)) { - try { - $classMethod = $class->getMethod($methodName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if (!$this->canMockMethod($classMethod)) { - continue; - } - } - - $mockMethods->addMethods( - MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments) - ); - } - - $mockClassName = $this->generateClassName( - $actualClassName, - $mockClassName['className'], - 'Mock_' - ); - } - - // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/103 - if ($isInterface && $class->implementsInterface(\Traversable::class) && - !$class->implementsInterface(\Iterator::class) && - !$class->implementsInterface(\IteratorAggregate::class)) { - $additionalInterfaces[] = \Iterator::class; - - $mockMethods->addMethods( - ...$this->mockClassMethods(\Iterator::class, $callOriginalMethods, $cloneArguments) - ); - } - - if ($class->hasMethod('__clone')) { - try { - $cloneMethod = $class->getMethod('__clone'); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if (!$cloneMethod->isFinal()) { - if ($callOriginalClone && !$isInterface) { - $unmockedCloneMethod = true; - } else { - $mockedCloneMethod = true; - } - } - } else { - $mockedCloneMethod = true; - } - } - - if ($isClass && $explicitMethods === []) { - $mockMethods->addMethods( - ...$this->mockClassMethods($mockClassName['fullClassName'], $callOriginalMethods, $cloneArguments) - ); - } - - if ($isInterface && ($explicitMethods === [] || $explicitMethods === null)) { - $mockMethods->addMethods( - ...$this->mockInterfaceMethods($mockClassName['fullClassName'], $cloneArguments) - ); - } - - if (\is_array($explicitMethods)) { - foreach ($explicitMethods as $methodName) { - if ($class !== null && $class->hasMethod($methodName)) { - try { - $method = $class->getMethod($methodName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($this->canMockMethod($method)) { - $mockMethods->addMethods( - MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments) - ); - } - } else { - $mockMethods->addMethods( - MockMethod::fromName( - $mockClassName['fullClassName'], - $methodName, - $cloneArguments - ) - ); - } - } - } - - $mockedMethods = ''; - $configurable = []; - - foreach ($mockMethods->asArray() as $mockMethod) { - $mockedMethods .= $mockMethod->generateCode(); - $configurable[] = new ConfigurableMethod($mockMethod->getName(), $mockMethod->getReturnType()); - } - - $method = ''; - - if (!$mockMethods->hasMethod('method') && (!isset($class) || !$class->hasMethod('method'))) { - $method = \PHP_EOL . ' use \PHPUnit\Framework\MockObject\Method;'; - } - - $cloneTrait = ''; - - if ($mockedCloneMethod) { - $cloneTrait = \PHP_EOL . ' use \PHPUnit\Framework\MockObject\MockedCloneMethod;'; - } - - if ($unmockedCloneMethod) { - $cloneTrait = \PHP_EOL . ' use \PHPUnit\Framework\MockObject\UnmockedCloneMethod;'; - } - - $classTemplate->setVar( - [ - 'prologue' => $prologue ?? '', - 'epilogue' => $epilogue ?? '', - 'class_declaration' => $this->generateMockClassDeclaration( - $mockClassName, - $isInterface, - $additionalInterfaces - ), - 'clone' => $cloneTrait, - 'mock_class_name' => $mockClassName['className'], - 'mocked_methods' => $mockedMethods, - 'method' => $method, - ] - ); - - return new MockClass( - $classTemplate->render(), - $mockClassName['className'], - $configurable - ); - } - - /** - * @param array|string $type - */ - private function generateClassName($type, string $className, string $prefix): array - { - if (\is_array($type)) { - $type = \implode('_', $type); - } - - if ($type[0] === '\\') { - $type = \substr($type, 1); - } - - $classNameParts = \explode('\\', $type); - - if (\count($classNameParts) > 1) { - $type = \array_pop($classNameParts); - $namespaceName = \implode('\\', $classNameParts); - $fullClassName = $namespaceName . '\\' . $type; - } else { - $namespaceName = ''; - $fullClassName = $type; - } - - if ($className === '') { - do { - $className = $prefix . $type . '_' . - \substr(\md5((string) \mt_rand()), 0, 8); - } while (\class_exists($className, false)); - } - - return [ - 'className' => $className, - 'originalClassName' => $type, - 'fullClassName' => $fullClassName, - 'namespaceName' => $namespaceName, - ]; - } - - private function generateMockClassDeclaration(array $mockClassName, bool $isInterface, array $additionalInterfaces = []): string - { - $buffer = 'class '; - - $additionalInterfaces[] = MockObject::class; - $interfaces = \implode(', ', $additionalInterfaces); - - if ($isInterface) { - $buffer .= \sprintf( - '%s implements %s', - $mockClassName['className'], - $interfaces - ); - - if (!\in_array($mockClassName['originalClassName'], $additionalInterfaces, true)) { - $buffer .= ', '; - - if (!empty($mockClassName['namespaceName'])) { - $buffer .= $mockClassName['namespaceName'] . '\\'; - } - - $buffer .= $mockClassName['originalClassName']; - } - } else { - $buffer .= \sprintf( - '%s extends %s%s implements %s', - $mockClassName['className'], - !empty($mockClassName['namespaceName']) ? $mockClassName['namespaceName'] . '\\' : '', - $mockClassName['originalClassName'], - $interfaces - ); - } - - return $buffer; - } - - private function canMockMethod(\ReflectionMethod $method): bool - { - return !($this->isConstructor($method) || $method->isFinal() || $method->isPrivate() || $this->isMethodNameBlacklisted($method->getName())); - } - - private function isMethodNameBlacklisted(string $name): bool - { - return isset(self::BLACKLISTED_METHOD_NAMES[$name]); - } - - private function getTemplate(string $template): \Text_Template - { - $filename = __DIR__ . \DIRECTORY_SEPARATOR . 'Generator' . \DIRECTORY_SEPARATOR . $template; - - if (!isset(self::$templates[$filename])) { - self::$templates[$filename] = new \Text_Template($filename); - } - - return self::$templates[$filename]; - } - - /** - * @see https://github.com/sebastianbergmann/phpunit/issues/4139#issuecomment-605409765 - */ - private function isConstructor(\ReflectionMethod $method): bool - { - $methodName = \strtolower($method->getName()); - - if ($methodName === '__construct') { - return true; - } - - if (\PHP_MAJOR_VERSION >= 8) { - return false; - } - - $className = \strtolower($method->getDeclaringClass()->getName()); - - return $methodName === $className; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/deprecation.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/deprecation.tpl deleted file mode 100644 index 5bf06f5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/deprecation.tpl +++ /dev/null @@ -1,2 +0,0 @@ - - @trigger_error({deprecation}, E_USER_DEPRECATED); diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_class.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_class.tpl deleted file mode 100644 index 593119f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_class.tpl +++ /dev/null @@ -1,6 +0,0 @@ -declare(strict_types=1); - -{prologue}{class_declaration} -{ - use \PHPUnit\Framework\MockObject\Api;{method}{clone} -{mocked_methods}}{epilogue} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method.tpl deleted file mode 100644 index 32304f3..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method.tpl +++ /dev/null @@ -1,22 +0,0 @@ - - {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} - {{deprecation} - $__phpunit_arguments = [{arguments_call}]; - $__phpunit_count = func_num_args(); - - if ($__phpunit_count > {arguments_count}) { - $__phpunit_arguments_tmp = func_get_args(); - - for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { - $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; - } - } - - $__phpunit_result = $this->__phpunit_getInvocationHandler()->invoke( - new \PHPUnit\Framework\MockObject\Invocation( - '{class_name}', '{method_name}', $__phpunit_arguments, '{return_declaration}', $this, {clone_arguments} - ) - ); - - return $__phpunit_result; - } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method_void.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method_void.tpl deleted file mode 100644 index 6ea6f45..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method_void.tpl +++ /dev/null @@ -1,20 +0,0 @@ - - {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} - {{deprecation} - $__phpunit_arguments = [{arguments_call}]; - $__phpunit_count = func_num_args(); - - if ($__phpunit_count > {arguments_count}) { - $__phpunit_arguments_tmp = func_get_args(); - - for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { - $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; - } - } - - $this->__phpunit_getInvocationHandler()->invoke( - new \PHPUnit\Framework\MockObject\Invocation( - '{class_name}', '{method_name}', $__phpunit_arguments, '{return_declaration}', $this, {clone_arguments} - ) - ); - } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_static_method.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_static_method.tpl deleted file mode 100644 index 5e5cf23..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_static_method.tpl +++ /dev/null @@ -1,5 +0,0 @@ - - {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} - { - throw new \PHPUnit\Framework\MockObject\BadMethodCallException('Static method "{method_name}" cannot be invoked on mock object'); - } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method.tpl deleted file mode 100644 index 6f699be..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method.tpl +++ /dev/null @@ -1,22 +0,0 @@ - - {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} - { - $__phpunit_arguments = [{arguments_call}]; - $__phpunit_count = func_num_args(); - - if ($__phpunit_count > {arguments_count}) { - $__phpunit_arguments_tmp = func_get_args(); - - for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { - $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; - } - } - - $this->__phpunit_getInvocationHandler()->invoke( - new \PHPUnit\Framework\MockObject\Invocation( - '{class_name}', '{method_name}', $__phpunit_arguments, '{return_declaration}', $this, {clone_arguments}, true - ) - ); - - return call_user_func_array(array($this->__phpunit_originalObject, "{method_name}"), $__phpunit_arguments); - } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method_void.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method_void.tpl deleted file mode 100644 index b2f963d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method_void.tpl +++ /dev/null @@ -1,22 +0,0 @@ - - {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} - { - $__phpunit_arguments = [{arguments_call}]; - $__phpunit_count = func_num_args(); - - if ($__phpunit_count > {arguments_count}) { - $__phpunit_arguments_tmp = func_get_args(); - - for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { - $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; - } - } - - $this->__phpunit_getInvocationHandler()->invoke( - new \PHPUnit\Framework\MockObject\Invocation( - '{class_name}', '{method_name}', $__phpunit_arguments, '{return_declaration}', $this, {clone_arguments}, true - ) - ); - - call_user_func_array(array($this->__phpunit_originalObject, "{method_name}"), $__phpunit_arguments); - } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/trait_class.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/trait_class.tpl deleted file mode 100644 index a8fe470..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/trait_class.tpl +++ /dev/null @@ -1,6 +0,0 @@ -declare(strict_types=1); - -{prologue}class {class_name} -{ - use {trait_name}; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_class.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_class.tpl deleted file mode 100644 index b3100b4..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_class.tpl +++ /dev/null @@ -1,9 +0,0 @@ -declare(strict_types=1); - -{namespace}class {class_name} extends \SoapClient -{ - public function __construct($wsdl, array $options) - { - parent::__construct('{wsdl}', $options); - } -{methods}} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_method.tpl b/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_method.tpl deleted file mode 100644 index bb16e76..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_method.tpl +++ /dev/null @@ -1,4 +0,0 @@ - - public function {method_name}({arguments}) - { - } diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php deleted file mode 100644 index 228cf0d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php +++ /dev/null @@ -1,190 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\SelfDescribing; -use PHPUnit\Util\Type; -use SebastianBergmann\Exporter\Exporter; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Invocation implements SelfDescribing -{ - /** - * @var string - */ - private $className; - - /** - * @var string - */ - private $methodName; - - /** - * @var array - */ - private $parameters; - - /** - * @var string - */ - private $returnType; - - /** - * @var bool - */ - private $isReturnTypeNullable = false; - - /** - * @var bool - */ - private $proxiedCall; - - /** - * @var object - */ - private $object; - - public function __construct(string $className, string $methodName, array $parameters, string $returnType, object $object, bool $cloneObjects = false, bool $proxiedCall = false) - { - $this->className = $className; - $this->methodName = $methodName; - $this->parameters = $parameters; - $this->object = $object; - $this->proxiedCall = $proxiedCall; - - $returnType = \ltrim($returnType, ': '); - - if (\strtolower($methodName) === '__tostring') { - $returnType = 'string'; - } - - if (\strpos($returnType, '?') === 0) { - $returnType = \substr($returnType, 1); - $this->isReturnTypeNullable = true; - } - - $this->returnType = $returnType; - - if (!$cloneObjects) { - return; - } - - foreach ($this->parameters as $key => $value) { - if (\is_object($value)) { - $this->parameters[$key] = $this->cloneObject($value); - } - } - } - - public function getClassName(): string - { - return $this->className; - } - - public function getMethodName(): string - { - return $this->methodName; - } - - public function getParameters(): array - { - return $this->parameters; - } - - /** - * @throws RuntimeException - * - * @return mixed Mocked return value - */ - public function generateReturnValue() - { - if ($this->isReturnTypeNullable || $this->proxiedCall) { - return; - } - - switch (\strtolower($this->returnType)) { - case '': - case 'void': - return; - - case 'string': - return ''; - - case 'float': - return 0.0; - - case 'int': - return 0; - - case 'bool': - return false; - - case 'array': - return []; - - case 'object': - return new \stdClass; - - case 'callable': - case 'closure': - return function (): void { - }; - - case 'traversable': - case 'generator': - case 'iterable': - $generator = static function () { - yield; - }; - - return $generator(); - - default: - $generator = new Generator; - - return $generator->getMock($this->returnType, [], [], '', false); - } - } - - public function toString(): string - { - $exporter = new Exporter; - - return \sprintf( - '%s::%s(%s)%s', - $this->className, - $this->methodName, - \implode( - ', ', - \array_map( - [$exporter, 'shortenedExport'], - $this->parameters - ) - ), - $this->returnType ? \sprintf(': %s', $this->returnType) : '' - ); - } - - public function getObject(): object - { - return $this->object; - } - - private function cloneObject(object $original): object - { - if (Type::isCloneable($original)) { - return clone $original; - } - - return $original; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php b/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php deleted file mode 100644 index cd1ea0d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php +++ /dev/null @@ -1,194 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use Exception; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Builder\InvocationMocker; -use PHPUnit\Framework\MockObject\Rule\InvocationOrder; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvocationHandler -{ - /** - * @var Matcher[] - */ - private $matchers = []; - - /** - * @var Matcher[] - */ - private $matcherMap = []; - - /** - * @var ConfigurableMethod[] - */ - private $configurableMethods; - - /** - * @var bool - */ - private $returnValueGeneration; - - /** - * @var \Throwable - */ - private $deferredError; - - public function __construct(array $configurableMethods, bool $returnValueGeneration) - { - $this->configurableMethods = $configurableMethods; - $this->returnValueGeneration = $returnValueGeneration; - } - - public function hasMatchers(): bool - { - foreach ($this->matchers as $matcher) { - if ($matcher->hasMatchers()) { - return true; - } - } - - return false; - } - - /** - * Looks up the match builder with identification $id and returns it. - * - * @param string $id The identification of the match builder - */ - public function lookupMatcher(string $id): ?Matcher - { - if (isset($this->matcherMap[$id])) { - return $this->matcherMap[$id]; - } - - return null; - } - - /** - * Registers a matcher with the identification $id. The matcher can later be - * looked up using lookupMatcher() to figure out if it has been invoked. - * - * @param string $id The identification of the matcher - * @param Matcher $matcher The builder which is being registered - * - * @throws RuntimeException - */ - public function registerMatcher(string $id, Matcher $matcher): void - { - if (isset($this->matcherMap[$id])) { - throw new RuntimeException( - 'Matcher with id <' . $id . '> is already registered.' - ); - } - - $this->matcherMap[$id] = $matcher; - } - - public function expects(InvocationOrder $rule): InvocationMocker - { - $matcher = new Matcher($rule); - $this->addMatcher($matcher); - - return new InvocationMocker( - $this, - $matcher, - ...$this->configurableMethods - ); - } - - /** - * @throws Exception - * - * @return mixed|void - */ - public function invoke(Invocation $invocation) - { - $exception = null; - $hasReturnValue = false; - $returnValue = null; - - foreach ($this->matchers as $match) { - try { - if ($match->matches($invocation)) { - $value = $match->invoked($invocation); - - if (!$hasReturnValue) { - $returnValue = $value; - $hasReturnValue = true; - } - } - } catch (Exception $e) { - $exception = $e; - } - } - - if ($exception !== null) { - throw $exception; - } - - if ($hasReturnValue) { - return $returnValue; - } - - if (!$this->returnValueGeneration) { - $exception = new ExpectationFailedException( - \sprintf( - 'Return value inference disabled and no expectation set up for %s::%s()', - $invocation->getClassName(), - $invocation->getMethodName() - ) - ); - - if (\strtolower($invocation->getMethodName()) === '__tostring') { - $this->deferredError = $exception; - - return ''; - } - - throw $exception; - } - - return $invocation->generateReturnValue(); - } - - public function matches(Invocation $invocation): bool - { - foreach ($this->matchers as $matcher) { - if (!$matcher->matches($invocation)) { - return false; - } - } - - return true; - } - - /** - * @throws \PHPUnit\Framework\ExpectationFailedException - */ - public function verify(): void - { - foreach ($this->matchers as $matcher) { - $matcher->verify(); - } - - if ($this->deferredError) { - throw $this->deferredError; - } - } - - private function addMatcher(Matcher $matcher): void - { - $this->matchers[] = $matcher; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php deleted file mode 100644 index 6179eeb..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php +++ /dev/null @@ -1,274 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount; -use PHPUnit\Framework\MockObject\Rule\AnyParameters; -use PHPUnit\Framework\MockObject\Rule\InvocationOrder; -use PHPUnit\Framework\MockObject\Rule\InvokedCount; -use PHPUnit\Framework\MockObject\Rule\MethodName; -use PHPUnit\Framework\MockObject\Rule\ParametersRule; -use PHPUnit\Framework\MockObject\Stub\Stub; -use PHPUnit\Framework\TestFailure; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Matcher -{ - /** - * @var InvocationOrder - */ - private $invocationRule; - - /** - * @var mixed - */ - private $afterMatchBuilderId; - - /** - * @var bool - */ - private $afterMatchBuilderIsInvoked = false; - - /** - * @var MethodName - */ - private $methodNameRule; - - /** - * @var ParametersRule - */ - private $parametersRule; - - /** - * @var Stub - */ - private $stub; - - public function __construct(InvocationOrder $rule) - { - $this->invocationRule = $rule; - } - - public function hasMatchers(): bool - { - return !$this->invocationRule instanceof AnyInvokedCount; - } - - public function hasMethodNameRule(): bool - { - return $this->methodNameRule !== null; - } - - public function getMethodNameRule(): MethodName - { - return $this->methodNameRule; - } - - public function setMethodNameRule(MethodName $rule): void - { - $this->methodNameRule = $rule; - } - - public function hasParametersRule(): bool - { - return $this->parametersRule !== null; - } - - public function setParametersRule(ParametersRule $rule): void - { - $this->parametersRule = $rule; - } - - public function setStub(Stub $stub): void - { - $this->stub = $stub; - } - - public function setAfterMatchBuilderId(string $id): void - { - $this->afterMatchBuilderId = $id; - } - - /** - * @throws \Exception - * @throws RuntimeException - * @throws ExpectationFailedException - */ - public function invoked(Invocation $invocation) - { - if ($this->methodNameRule === null) { - throw new RuntimeException('No method rule is set'); - } - - if ($this->afterMatchBuilderId !== null) { - $matcher = $invocation->getObject() - ->__phpunit_getInvocationHandler() - ->lookupMatcher($this->afterMatchBuilderId); - - if (!$matcher) { - throw new RuntimeException( - \sprintf( - 'No builder found for match builder identification <%s>', - $this->afterMatchBuilderId - ) - ); - } - \assert($matcher instanceof self); - - if ($matcher->invocationRule->hasBeenInvoked()) { - $this->afterMatchBuilderIsInvoked = true; - } - } - - $this->invocationRule->invoked($invocation); - - try { - if ($this->parametersRule !== null) { - $this->parametersRule->apply($invocation); - } - } catch (ExpectationFailedException $e) { - throw new ExpectationFailedException( - \sprintf( - "Expectation failed for %s when %s\n%s", - $this->methodNameRule->toString(), - $this->invocationRule->toString(), - $e->getMessage() - ), - $e->getComparisonFailure() - ); - } - - if ($this->stub) { - return $this->stub->invoke($invocation); - } - - return $invocation->generateReturnValue(); - } - - /** - * @throws RuntimeException - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function matches(Invocation $invocation): bool - { - if ($this->afterMatchBuilderId !== null) { - $matcher = $invocation->getObject() - ->__phpunit_getInvocationHandler() - ->lookupMatcher($this->afterMatchBuilderId); - - if (!$matcher) { - throw new RuntimeException( - \sprintf( - 'No builder found for match builder identification <%s>', - $this->afterMatchBuilderId - ) - ); - } - \assert($matcher instanceof self); - - if (!$matcher->invocationRule->hasBeenInvoked()) { - return false; - } - } - - if ($this->methodNameRule === null) { - throw new RuntimeException('No method rule is set'); - } - - if (!$this->invocationRule->matches($invocation)) { - return false; - } - - try { - if (!$this->methodNameRule->matches($invocation)) { - return false; - } - } catch (ExpectationFailedException $e) { - throw new ExpectationFailedException( - \sprintf( - "Expectation failed for %s when %s\n%s", - $this->methodNameRule->toString(), - $this->invocationRule->toString(), - $e->getMessage() - ), - $e->getComparisonFailure() - ); - } - - return true; - } - - /** - * @throws RuntimeException - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function verify(): void - { - if ($this->methodNameRule === null) { - throw new RuntimeException('No method rule is set'); - } - - try { - $this->invocationRule->verify(); - - if ($this->parametersRule === null) { - $this->parametersRule = new AnyParameters; - } - - $invocationIsAny = $this->invocationRule instanceof AnyInvokedCount; - $invocationIsNever = $this->invocationRule instanceof InvokedCount && $this->invocationRule->isNever(); - - if (!$invocationIsAny && !$invocationIsNever) { - $this->parametersRule->verify(); - } - } catch (ExpectationFailedException $e) { - throw new ExpectationFailedException( - \sprintf( - "Expectation failed for %s when %s.\n%s", - $this->methodNameRule->toString(), - $this->invocationRule->toString(), - TestFailure::exceptionToString($e) - ) - ); - } - } - - public function toString(): string - { - $list = []; - - if ($this->invocationRule !== null) { - $list[] = $this->invocationRule->toString(); - } - - if ($this->methodNameRule !== null) { - $list[] = 'where ' . $this->methodNameRule->toString(); - } - - if ($this->parametersRule !== null) { - $list[] = 'and ' . $this->parametersRule->toString(); - } - - if ($this->afterMatchBuilderId !== null) { - $list[] = 'after ' . $this->afterMatchBuilderId; - } - - if ($this->stub !== null) { - $list[] = 'will ' . $this->stub->toString(); - } - - return \implode(' ', $list); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php b/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php deleted file mode 100644 index 18e5772..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\Constraint\Constraint; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MethodNameConstraint extends Constraint -{ - /** - * @var string - */ - private $methodName; - - public function __construct(string $methodName) - { - $this->methodName = $methodName; - } - - public function toString(): string - { - return \sprintf( - 'is "%s"', - $this->methodName - ); - } - - protected function matches($other): bool - { - if (!\is_string($other)) { - return false; - } - - return \strtolower($this->methodName) === \strtolower($other); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php b/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php deleted file mode 100644 index 3eeb36a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php +++ /dev/null @@ -1,506 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\TestCase; - -/** - * @psalm-template MockedType - */ -final class MockBuilder -{ - /** - * @var TestCase - */ - private $testCase; - - /** - * @var string - */ - private $type; - - /** - * @var null|string[] - */ - private $methods = []; - - /** - * @var bool - */ - private $emptyMethodsArray = false; - - /** - * @var string - */ - private $mockClassName = ''; - - /** - * @var array - */ - private $constructorArgs = []; - - /** - * @var bool - */ - private $originalConstructor = true; - - /** - * @var bool - */ - private $originalClone = true; - - /** - * @var bool - */ - private $autoload = true; - - /** - * @var bool - */ - private $cloneArguments = false; - - /** - * @var bool - */ - private $callOriginalMethods = false; - - /** - * @var ?object - */ - private $proxyTarget; - - /** - * @var bool - */ - private $allowMockingUnknownTypes = true; - - /** - * @var bool - */ - private $returnValueGeneration = true; - - /** - * @var Generator - */ - private $generator; - - /** - * @param string|string[] $type - * - * @psalm-param class-string|string|string[] $type - */ - public function __construct(TestCase $testCase, $type) - { - $this->testCase = $testCase; - $this->type = $type; - $this->generator = new Generator; - } - - /** - * Creates a mock object using a fluent interface. - * - * @throws RuntimeException - * - * @psalm-return MockObject&MockedType - */ - public function getMock(): MockObject - { - $object = $this->generator->getMock( - $this->type, - !$this->emptyMethodsArray ? $this->methods : null, - $this->constructorArgs, - $this->mockClassName, - $this->originalConstructor, - $this->originalClone, - $this->autoload, - $this->cloneArguments, - $this->callOriginalMethods, - $this->proxyTarget, - $this->allowMockingUnknownTypes, - $this->returnValueGeneration - ); - - $this->testCase->registerMockObject($object); - - return $object; - } - - /** - * Creates a mock object for an abstract class using a fluent interface. - * - * @throws \PHPUnit\Framework\Exception - * @throws RuntimeException - * - * @psalm-return MockObject&MockedType - */ - public function getMockForAbstractClass(): MockObject - { - $object = $this->generator->getMockForAbstractClass( - $this->type, - $this->constructorArgs, - $this->mockClassName, - $this->originalConstructor, - $this->originalClone, - $this->autoload, - $this->methods, - $this->cloneArguments - ); - - $this->testCase->registerMockObject($object); - - return $object; - } - - /** - * Creates a mock object for a trait using a fluent interface. - * - * @throws \PHPUnit\Framework\Exception - * @throws RuntimeException - * - * @psalm-return MockObject&MockedType - */ - public function getMockForTrait(): MockObject - { - $object = $this->generator->getMockForTrait( - $this->type, - $this->constructorArgs, - $this->mockClassName, - $this->originalConstructor, - $this->originalClone, - $this->autoload, - $this->methods, - $this->cloneArguments - ); - - $this->testCase->registerMockObject($object); - - return $object; - } - - /** - * Specifies the subset of methods to mock. Default is to mock none of them. - * - * @deprecated https://github.com/sebastianbergmann/phpunit/pull/3687 - * - * @return $this - */ - public function setMethods(?array $methods = null): self - { - if ($methods === null) { - $this->methods = $methods; - } else { - $this->methods = \array_merge($this->methods ?? [], $methods); - } - - return $this; - } - - /** - * Specifies the subset of methods to mock, requiring each to exist in the class - * - * @param string[] $methods - * - * @throws RuntimeException - * - * @return $this - */ - public function onlyMethods(array $methods): self - { - if (empty($methods)) { - $this->emptyMethodsArray = true; - - return $this; - } - - try { - $reflector = new \ReflectionClass($this->type); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - foreach ($methods as $method) { - if (!$reflector->hasMethod($method)) { - throw new RuntimeException( - \sprintf( - 'Trying to set mock method "%s" with onlyMethods, but it does not exist in class "%s". Use addMethods() for methods that don\'t exist in the class.', - $method, - $this->type - ) - ); - } - } - - $this->methods = \array_merge($this->methods ?? [], $methods); - - return $this; - } - - /** - * Specifies methods that don't exist in the class which you want to mock - * - * @param string[] $methods - * - * @throws RuntimeException - * - * @return $this - */ - public function addMethods(array $methods): self - { - if (empty($methods)) { - $this->emptyMethodsArray = true; - - return $this; - } - - try { - $reflector = new \ReflectionClass($this->type); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - foreach ($methods as $method) { - if ($reflector->hasMethod($method)) { - throw new RuntimeException( - \sprintf( - 'Trying to set mock method "%s" with addMethods(), but it exists in class "%s". Use onlyMethods() for methods that exist in the class.', - $method, - $this->type - ) - ); - } - } - - $this->methods = \array_merge($this->methods ?? [], $methods); - - return $this; - } - - /** - * Specifies the subset of methods to not mock. Default is to mock all of them. - */ - public function setMethodsExcept(array $methods = []): self - { - return $this->setMethods( - \array_diff( - $this->generator->getClassMethods($this->type), - $methods - ) - ); - } - - /** - * Specifies the arguments for the constructor. - * - * @return $this - */ - public function setConstructorArgs(array $args): self - { - $this->constructorArgs = $args; - - return $this; - } - - /** - * Specifies the name for the mock class. - * - * @return $this - */ - public function setMockClassName(string $name): self - { - $this->mockClassName = $name; - - return $this; - } - - /** - * Disables the invocation of the original constructor. - * - * @return $this - */ - public function disableOriginalConstructor(): self - { - $this->originalConstructor = false; - - return $this; - } - - /** - * Enables the invocation of the original constructor. - * - * @return $this - */ - public function enableOriginalConstructor(): self - { - $this->originalConstructor = true; - - return $this; - } - - /** - * Disables the invocation of the original clone constructor. - * - * @return $this - */ - public function disableOriginalClone(): self - { - $this->originalClone = false; - - return $this; - } - - /** - * Enables the invocation of the original clone constructor. - * - * @return $this - */ - public function enableOriginalClone(): self - { - $this->originalClone = true; - - return $this; - } - - /** - * Disables the use of class autoloading while creating the mock object. - * - * @return $this - */ - public function disableAutoload(): self - { - $this->autoload = false; - - return $this; - } - - /** - * Enables the use of class autoloading while creating the mock object. - * - * @return $this - */ - public function enableAutoload(): self - { - $this->autoload = true; - - return $this; - } - - /** - * Disables the cloning of arguments passed to mocked methods. - * - * @return $this - */ - public function disableArgumentCloning(): self - { - $this->cloneArguments = false; - - return $this; - } - - /** - * Enables the cloning of arguments passed to mocked methods. - * - * @return $this - */ - public function enableArgumentCloning(): self - { - $this->cloneArguments = true; - - return $this; - } - - /** - * Enables the invocation of the original methods. - * - * @return $this - */ - public function enableProxyingToOriginalMethods(): self - { - $this->callOriginalMethods = true; - - return $this; - } - - /** - * Disables the invocation of the original methods. - * - * @return $this - */ - public function disableProxyingToOriginalMethods(): self - { - $this->callOriginalMethods = false; - $this->proxyTarget = null; - - return $this; - } - - /** - * Sets the proxy target. - * - * @return $this - */ - public function setProxyTarget(object $object): self - { - $this->proxyTarget = $object; - - return $this; - } - - /** - * @return $this - */ - public function allowMockingUnknownTypes(): self - { - $this->allowMockingUnknownTypes = true; - - return $this; - } - - /** - * @return $this - */ - public function disallowMockingUnknownTypes(): self - { - $this->allowMockingUnknownTypes = false; - - return $this; - } - - /** - * @return $this - */ - public function enableAutoReturnValueGeneration(): self - { - $this->returnValueGeneration = true; - - return $this; - } - - /** - * @return $this - */ - public function disableAutoReturnValueGeneration(): self - { - $this->returnValueGeneration = false; - - return $this; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php b/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php deleted file mode 100644 index 938db87..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MockClass implements MockType -{ - /** - * @var string - */ - private $classCode; - - /** - * @var string - */ - private $mockName; - - /** - * @var ConfigurableMethod[] - */ - private $configurableMethods; - - public function __construct(string $classCode, string $mockName, array $configurableMethods) - { - $this->classCode = $classCode; - $this->mockName = $mockName; - $this->configurableMethods = $configurableMethods; - } - - public function generate(): string - { - if (!\class_exists($this->mockName, false)) { - eval($this->classCode); - - \call_user_func( - [ - $this->mockName, - '__phpunit_initConfigurableMethods', - ], - ...$this->configurableMethods - ); - } - - return $this->mockName; - } - - public function getClassCode(): string - { - return $this->classCode; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php b/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php deleted file mode 100644 index 85b7516..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php +++ /dev/null @@ -1,372 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use SebastianBergmann\Type\ObjectType; -use SebastianBergmann\Type\Type; -use SebastianBergmann\Type\UnknownType; -use SebastianBergmann\Type\VoidType; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MockMethod -{ - /** - * @var \Text_Template[] - */ - private static $templates = []; - - /** - * @var string - */ - private $className; - - /** - * @var string - */ - private $methodName; - - /** - * @var bool - */ - private $cloneArguments; - - /** - * @var string string - */ - private $modifier; - - /** - * @var string - */ - private $argumentsForDeclaration; - - /** - * @var string - */ - private $argumentsForCall; - - /** - * @var Type - */ - private $returnType; - - /** - * @var string - */ - private $reference; - - /** - * @var bool - */ - private $callOriginalMethod; - - /** - * @var bool - */ - private $static; - - /** - * @var ?string - */ - private $deprecation; - - /** - * @var bool - */ - private $allowsReturnNull; - - /** - * @throws RuntimeException - */ - public static function fromReflection(\ReflectionMethod $method, bool $callOriginalMethod, bool $cloneArguments): self - { - if ($method->isPrivate()) { - $modifier = 'private'; - } elseif ($method->isProtected()) { - $modifier = 'protected'; - } else { - $modifier = 'public'; - } - - if ($method->isStatic()) { - $modifier .= ' static'; - } - - if ($method->returnsReference()) { - $reference = '&'; - } else { - $reference = ''; - } - - $docComment = $method->getDocComment(); - - if (\is_string($docComment) && - \preg_match('#\*[ \t]*+@deprecated[ \t]*+(.*?)\r?+\n[ \t]*+\*(?:[ \t]*+@|/$)#s', $docComment, $deprecation)) { - $deprecation = \trim(\preg_replace('#[ \t]*\r?\n[ \t]*+\*[ \t]*+#', ' ', $deprecation[1])); - } else { - $deprecation = null; - } - - return new self( - $method->getDeclaringClass()->getName(), - $method->getName(), - $cloneArguments, - $modifier, - self::getMethodParameters($method), - self::getMethodParameters($method, true), - self::deriveReturnType($method), - $reference, - $callOriginalMethod, - $method->isStatic(), - $deprecation, - $method->hasReturnType() && $method->getReturnType()->allowsNull() - ); - } - - public static function fromName(string $fullClassName, string $methodName, bool $cloneArguments): self - { - return new self( - $fullClassName, - $methodName, - $cloneArguments, - 'public', - '', - '', - new UnknownType, - '', - false, - false, - null, - false - ); - } - - public function __construct(string $className, string $methodName, bool $cloneArguments, string $modifier, string $argumentsForDeclaration, string $argumentsForCall, Type $returnType, string $reference, bool $callOriginalMethod, bool $static, ?string $deprecation, bool $allowsReturnNull) - { - $this->className = $className; - $this->methodName = $methodName; - $this->cloneArguments = $cloneArguments; - $this->modifier = $modifier; - $this->argumentsForDeclaration = $argumentsForDeclaration; - $this->argumentsForCall = $argumentsForCall; - $this->returnType = $returnType; - $this->reference = $reference; - $this->callOriginalMethod = $callOriginalMethod; - $this->static = $static; - $this->deprecation = $deprecation; - $this->allowsReturnNull = $allowsReturnNull; - } - - public function getName(): string - { - return $this->methodName; - } - - /** - * @throws RuntimeException - */ - public function generateCode(): string - { - if ($this->static) { - $templateFile = 'mocked_static_method.tpl'; - } elseif ($this->returnType instanceof VoidType) { - $templateFile = \sprintf( - '%s_method_void.tpl', - $this->callOriginalMethod ? 'proxied' : 'mocked' - ); - } else { - $templateFile = \sprintf( - '%s_method.tpl', - $this->callOriginalMethod ? 'proxied' : 'mocked' - ); - } - - $deprecation = $this->deprecation; - - if (null !== $this->deprecation) { - $deprecation = "The $this->className::$this->methodName method is deprecated ($this->deprecation)."; - $deprecationTemplate = $this->getTemplate('deprecation.tpl'); - - $deprecationTemplate->setVar([ - 'deprecation' => \var_export($deprecation, true), - ]); - - $deprecation = $deprecationTemplate->render(); - } - - $template = $this->getTemplate($templateFile); - - $template->setVar( - [ - 'arguments_decl' => $this->argumentsForDeclaration, - 'arguments_call' => $this->argumentsForCall, - 'return_declaration' => $this->returnType->getReturnTypeDeclaration(), - 'arguments_count' => !empty($this->argumentsForCall) ? \substr_count($this->argumentsForCall, ',') + 1 : 0, - 'class_name' => $this->className, - 'method_name' => $this->methodName, - 'modifier' => $this->modifier, - 'reference' => $this->reference, - 'clone_arguments' => $this->cloneArguments ? 'true' : 'false', - 'deprecation' => $deprecation, - ] - ); - - return $template->render(); - } - - public function getReturnType(): Type - { - return $this->returnType; - } - - private function getTemplate(string $template): \Text_Template - { - $filename = __DIR__ . \DIRECTORY_SEPARATOR . 'Generator' . \DIRECTORY_SEPARATOR . $template; - - if (!isset(self::$templates[$filename])) { - self::$templates[$filename] = new \Text_Template($filename); - } - - return self::$templates[$filename]; - } - - /** - * Returns the parameters of a function or method. - * - * @throws RuntimeException - */ - private static function getMethodParameters(\ReflectionMethod $method, bool $forCall = false): string - { - $parameters = []; - - foreach ($method->getParameters() as $i => $parameter) { - $name = '$' . $parameter->getName(); - - /* Note: PHP extensions may use empty names for reference arguments - * or "..." for methods taking a variable number of arguments. - */ - if ($name === '$' || $name === '$...') { - $name = '$arg' . $i; - } - - if ($parameter->isVariadic()) { - if ($forCall) { - continue; - } - - $name = '...' . $name; - } - - $nullable = ''; - $default = ''; - $reference = ''; - $typeDeclaration = ''; - - if (!$forCall) { - if ($parameter->hasType() && $parameter->allowsNull()) { - $nullable = '?'; - } - - if ($parameter->hasType()) { - $type = $parameter->getType(); - - if ($type instanceof \ReflectionNamedType && $type->getName() !== 'self') { - $typeDeclaration = $type->getName() . ' '; - } else { - try { - $class = $parameter->getClass(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - \sprintf( - 'Cannot mock %s::%s() because a class or ' . - 'interface used in the signature is not loaded', - $method->getDeclaringClass()->getName(), - $method->getName() - ), - 0, - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($class !== null) { - $typeDeclaration = $class->getName() . ' '; - } - } - } - - if (!$parameter->isVariadic()) { - if ($parameter->isDefaultValueAvailable()) { - try { - $value = \var_export($parameter->getDefaultValue(), true); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new RuntimeException( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $default = ' = ' . $value; - } elseif ($parameter->isOptional()) { - $default = ' = null'; - } - } - } - - if ($parameter->isPassedByReference()) { - $reference = '&'; - } - - $parameters[] = $nullable . $typeDeclaration . $reference . $name . $default; - } - - return \implode(', ', $parameters); - } - - private static function deriveReturnType(\ReflectionMethod $method): Type - { - $returnType = $method->getReturnType(); - - if ($returnType === null) { - return new UnknownType(); - } - - // @see https://bugs.php.net/bug.php?id=70722 - if ($returnType->getName() === 'self') { - return ObjectType::fromName($method->getDeclaringClass()->getName(), $returnType->allowsNull()); - } - - // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/406 - if ($returnType->getName() === 'parent') { - $parentClass = $method->getDeclaringClass()->getParentClass(); - - if ($parentClass === false) { - throw new RuntimeException( - \sprintf( - 'Cannot mock %s::%s because "parent" return type declaration is used but %s does not have a parent class', - $method->getDeclaringClass()->getName(), - $method->getName(), - $method->getDeclaringClass()->getName() - ) - ); - } - - return ObjectType::fromName($parentClass->getName(), $returnType->allowsNull()); - } - - return Type::fromName($returnType->getName(), $returnType->allowsNull()); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php b/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php deleted file mode 100644 index 939437e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MockMethodSet -{ - /** - * @var MockMethod[] - */ - private $methods = []; - - public function addMethods(MockMethod ...$methods): void - { - foreach ($methods as $method) { - $this->methods[\strtolower($method->getName())] = $method; - } - } - - /** - * @return MockMethod[] - */ - public function asArray(): array - { - return \array_values($this->methods); - } - - public function hasMethod(string $methodName): bool - { - return \array_key_exists(\strtolower($methodName), $this->methods); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php b/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php deleted file mode 100644 index 4db11e1..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\MockObject\Builder\InvocationMocker as BuilderInvocationMocker; -use PHPUnit\Framework\MockObject\Rule\InvocationOrder; - -/** - * @method BuilderInvocationMocker method($constraint) - */ -interface MockObject extends Stub -{ - public function __phpunit_setOriginalObject($originalObject): void; - - public function __phpunit_verify(bool $unsetInvocationMocker = true): void; - - public function expects(InvocationOrder $invocationRule): BuilderInvocationMocker; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/MockTrait.php b/vendor/phpunit/phpunit/src/Framework/MockObject/MockTrait.php deleted file mode 100644 index 3ced889..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/MockTrait.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MockTrait implements MockType -{ - /** - * @var string - */ - private $classCode; - - /** - * @var string - */ - private $mockName; - - public function __construct(string $classCode, string $mockName) - { - $this->classCode = $classCode; - $this->mockName = $mockName; - } - - public function generate(): string - { - if (!\class_exists($this->mockName, false)) { - eval($this->classCode); - } - - return $this->mockName; - } - - public function getClassCode(): string - { - return $this->classCode; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/MockType.php b/vendor/phpunit/phpunit/src/Framework/MockObject/MockType.php deleted file mode 100644 index b35ac30..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/MockType.php +++ /dev/null @@ -1,18 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface MockType -{ - public function generate(): string; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php deleted file mode 100644 index f93e568..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class AnyInvokedCount extends InvocationOrder -{ - public function toString(): string - { - return 'invoked zero or more times'; - } - - public function verify(): void - { - } - - public function matches(BaseInvocation $invocation): bool - { - return true; - } - - protected function invokedDo(BaseInvocation $invocation): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php deleted file mode 100644 index 61de788..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class AnyParameters implements ParametersRule -{ - public function toString(): string - { - return 'with any parameters'; - } - - public function apply(BaseInvocation $invocation): void - { - } - - public function verify(): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php deleted file mode 100644 index 3a1f528..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\Constraint\IsEqual; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\InvalidParameterGroupException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ConsecutiveParameters implements ParametersRule -{ - /** - * @var array - */ - private $parameterGroups = []; - - /** - * @var array - */ - private $invocations = []; - - /** - * @throws \PHPUnit\Framework\Exception - */ - public function __construct(array $parameterGroups) - { - foreach ($parameterGroups as $index => $parameters) { - if (!\is_iterable($parameters)) { - throw new InvalidParameterGroupException( - \sprintf( - 'Parameter group #%d must be an array or Traversable, got %s', - $index, - \gettype($parameters) - ) - ); - } - - foreach ($parameters as $parameter) { - if (!$parameter instanceof Constraint) { - $parameter = new IsEqual($parameter); - } - - $this->parameterGroups[$index][] = $parameter; - } - } - } - - public function toString(): string - { - return 'with consecutive parameters'; - } - - /** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function apply(BaseInvocation $invocation): void - { - $this->invocations[] = $invocation; - $callIndex = \count($this->invocations) - 1; - - $this->verifyInvocation($invocation, $callIndex); - } - - /** - * @throws \PHPUnit\Framework\ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function verify(): void - { - foreach ($this->invocations as $callIndex => $invocation) { - $this->verifyInvocation($invocation, $callIndex); - } - } - - /** - * Verify a single invocation - * - * @param int $callIndex - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function verifyInvocation(BaseInvocation $invocation, $callIndex): void - { - if (!isset($this->parameterGroups[$callIndex])) { - // no parameter assertion for this call index - return; - } - - if ($invocation === null) { - throw new ExpectationFailedException( - 'Mocked method does not exist.' - ); - } - - $parameters = $this->parameterGroups[$callIndex]; - - if (\count($invocation->getParameters()) < \count($parameters)) { - throw new ExpectationFailedException( - \sprintf( - 'Parameter count for invocation %s is too low.', - $invocation->toString() - ) - ); - } - - foreach ($parameters as $i => $parameter) { - $parameter->evaluate( - $invocation->getParameters()[$i], - \sprintf( - 'Parameter %s for invocation #%d %s does not match expected ' . - 'value.', - $i, - $callIndex, - $invocation->toString() - ) - ); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php deleted file mode 100644 index 1df95e5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; -use PHPUnit\Framework\MockObject\Verifiable; -use PHPUnit\Framework\SelfDescribing; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class InvocationOrder implements SelfDescribing, Verifiable -{ - /** - * @var BaseInvocation[] - */ - private $invocations = []; - - public function getInvocationCount(): int - { - return \count($this->invocations); - } - - public function hasBeenInvoked(): bool - { - return \count($this->invocations) > 0; - } - - final public function invoked(BaseInvocation $invocation) - { - $this->invocations[] = $invocation; - - return $this->invokedDo($invocation); - } - - abstract public function matches(BaseInvocation $invocation): bool; - - abstract protected function invokedDo(BaseInvocation $invocation); -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php deleted file mode 100644 index 070ffee..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class InvokedAtIndex extends InvocationOrder -{ - /** - * @var int - */ - private $sequenceIndex; - - /** - * @var int - */ - private $currentIndex = -1; - - /** - * @param int $sequenceIndex - */ - public function __construct($sequenceIndex) - { - $this->sequenceIndex = $sequenceIndex; - } - - public function toString(): string - { - return 'invoked at sequence index ' . $this->sequenceIndex; - } - - public function matches(BaseInvocation $invocation): bool - { - $this->currentIndex++; - - return $this->currentIndex == $this->sequenceIndex; - } - - /** - * Verifies that the current expectation is valid. If everything is OK the - * code should just return, if not it must throw an exception. - * - * @throws ExpectationFailedException - */ - public function verify(): void - { - if ($this->currentIndex < $this->sequenceIndex) { - throw new ExpectationFailedException( - \sprintf( - 'The expected invocation at index %s was never reached.', - $this->sequenceIndex - ) - ); - } - } - - protected function invokedDo(BaseInvocation $invocation): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php deleted file mode 100644 index a84aa65..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvokedAtLeastCount extends InvocationOrder -{ - /** - * @var int - */ - private $requiredInvocations; - - /** - * @param int $requiredInvocations - */ - public function __construct($requiredInvocations) - { - $this->requiredInvocations = $requiredInvocations; - } - - public function toString(): string - { - return 'invoked at least ' . $this->requiredInvocations . ' times'; - } - - /** - * Verifies that the current expectation is valid. If everything is OK the - * code should just return, if not it must throw an exception. - * - * @throws ExpectationFailedException - */ - public function verify(): void - { - $count = $this->getInvocationCount(); - - if ($count < $this->requiredInvocations) { - throw new ExpectationFailedException( - 'Expected invocation at least ' . $this->requiredInvocations . - ' times but it occurred ' . $count . ' time(s).' - ); - } - } - - public function matches(BaseInvocation $invocation): bool - { - return true; - } - - protected function invokedDo(BaseInvocation $invocation): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php deleted file mode 100644 index d0ad1f8..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvokedAtLeastOnce extends InvocationOrder -{ - public function toString(): string - { - return 'invoked at least once'; - } - - /** - * Verifies that the current expectation is valid. If everything is OK the - * code should just return, if not it must throw an exception. - * - * @throws ExpectationFailedException - */ - public function verify(): void - { - $count = $this->getInvocationCount(); - - if ($count < 1) { - throw new ExpectationFailedException( - 'Expected invocation at least once but it never occurred.' - ); - } - } - - public function matches(BaseInvocation $invocation): bool - { - return true; - } - - protected function invokedDo(BaseInvocation $invocation): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php deleted file mode 100644 index c3b815a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvokedAtMostCount extends InvocationOrder -{ - /** - * @var int - */ - private $allowedInvocations; - - /** - * @param int $allowedInvocations - */ - public function __construct($allowedInvocations) - { - $this->allowedInvocations = $allowedInvocations; - } - - public function toString(): string - { - return 'invoked at most ' . $this->allowedInvocations . ' times'; - } - - /** - * Verifies that the current expectation is valid. If everything is OK the - * code should just return, if not it must throw an exception. - * - * @throws ExpectationFailedException - */ - public function verify(): void - { - $count = $this->getInvocationCount(); - - if ($count > $this->allowedInvocations) { - throw new ExpectationFailedException( - 'Expected invocation at most ' . $this->allowedInvocations . - ' times but it occurred ' . $count . ' time(s).' - ); - } - } - - public function matches(BaseInvocation $invocation): bool - { - return true; - } - - protected function invokedDo(BaseInvocation $invocation): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php deleted file mode 100644 index 37beffc..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvokedCount extends InvocationOrder -{ - /** - * @var int - */ - private $expectedCount; - - /** - * @param int $expectedCount - */ - public function __construct($expectedCount) - { - $this->expectedCount = $expectedCount; - } - - public function isNever(): bool - { - return $this->expectedCount === 0; - } - - public function toString(): string - { - return 'invoked ' . $this->expectedCount . ' time(s)'; - } - - public function matches(BaseInvocation $invocation): bool - { - return true; - } - - /** - * Verifies that the current expectation is valid. If everything is OK the - * code should just return, if not it must throw an exception. - * - * @throws ExpectationFailedException - */ - public function verify(): void - { - $count = $this->getInvocationCount(); - - if ($count !== $this->expectedCount) { - throw new ExpectationFailedException( - \sprintf( - 'Method was expected to be called %d times, ' . - 'actually called %d times.', - $this->expectedCount, - $count - ) - ); - } - } - - /** - * @throws ExpectationFailedException - */ - protected function invokedDo(BaseInvocation $invocation): void - { - $count = $this->getInvocationCount(); - - if ($count > $this->expectedCount) { - $message = $invocation->toString() . ' '; - - switch ($this->expectedCount) { - case 0: - $message .= 'was not expected to be called.'; - - break; - - case 1: - $message .= 'was not expected to be called more than once.'; - - break; - - default: - $message .= \sprintf( - 'was not expected to be called more than %d times.', - $this->expectedCount - ); - } - - throw new ExpectationFailedException($message); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php deleted file mode 100644 index efca2ba..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\InvalidArgumentException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; -use PHPUnit\Framework\MockObject\MethodNameConstraint; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class MethodName -{ - /** - * @var Constraint - */ - private $constraint; - - /** - * @param Constraint|string $constraint - * - * @throws InvalidArgumentException - */ - public function __construct($constraint) - { - if (\is_string($constraint)) { - $constraint = new MethodNameConstraint($constraint); - } - - if (!$constraint instanceof Constraint) { - throw InvalidArgumentException::create(1, 'PHPUnit\Framework\Constraint\Constraint object or string'); - } - - $this->constraint = $constraint; - } - - public function toString(): string - { - return 'method name ' . $this->constraint->toString(); - } - - /** - * @throws \PHPUnit\Framework\ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function matches(BaseInvocation $invocation): bool - { - return $this->matchesName($invocation->getMethodName()); - } - - public function matchesName(string $methodName): bool - { - return $this->constraint->evaluate($methodName, '', true); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php deleted file mode 100644 index 2fa58c6..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php +++ /dev/null @@ -1,156 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\Constraint\Constraint; -use PHPUnit\Framework\Constraint\IsAnything; -use PHPUnit\Framework\Constraint\IsEqual; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Parameters implements ParametersRule -{ - /** - * @var Constraint[] - */ - private $parameters = []; - - /** - * @var BaseInvocation - */ - private $invocation; - - /** - * @var bool|ExpectationFailedException - */ - private $parameterVerificationResult; - - /** - * @throws \PHPUnit\Framework\Exception - */ - public function __construct(array $parameters) - { - foreach ($parameters as $parameter) { - if (!($parameter instanceof Constraint)) { - $parameter = new IsEqual( - $parameter - ); - } - - $this->parameters[] = $parameter; - } - } - - public function toString(): string - { - $text = 'with parameter'; - - foreach ($this->parameters as $index => $parameter) { - if ($index > 0) { - $text .= ' and'; - } - - $text .= ' ' . $index . ' ' . $parameter->toString(); - } - - return $text; - } - - /** - * @throws \Exception - */ - public function apply(BaseInvocation $invocation): void - { - $this->invocation = $invocation; - $this->parameterVerificationResult = null; - - try { - $this->parameterVerificationResult = $this->doVerify(); - } catch (ExpectationFailedException $e) { - $this->parameterVerificationResult = $e; - - throw $this->parameterVerificationResult; - } - } - - /** - * Checks if the invocation $invocation matches the current rules. If it - * does the rule will get the invoked() method called which should check - * if an expectation is met. - * - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function verify(): void - { - $this->doVerify(); - } - - /** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function doVerify(): bool - { - if (isset($this->parameterVerificationResult)) { - return $this->guardAgainstDuplicateEvaluationOfParameterConstraints(); - } - - if ($this->invocation === null) { - throw new ExpectationFailedException('Mocked method does not exist.'); - } - - if (\count($this->invocation->getParameters()) < \count($this->parameters)) { - $message = 'Parameter count for invocation %s is too low.'; - - // The user called `->with($this->anything())`, but may have meant - // `->withAnyParameters()`. - // - // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/199 - if (\count($this->parameters) === 1 && - \get_class($this->parameters[0]) === IsAnything::class) { - $message .= "\nTo allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead."; - } - - throw new ExpectationFailedException( - \sprintf($message, $this->invocation->toString()) - ); - } - - foreach ($this->parameters as $i => $parameter) { - $parameter->evaluate( - $this->invocation->getParameters()[$i], - \sprintf( - 'Parameter %s for invocation %s does not match expected ' . - 'value.', - $i, - $this->invocation->toString() - ) - ); - } - - return true; - } - - /** - * @throws ExpectationFailedException - */ - private function guardAgainstDuplicateEvaluationOfParameterConstraints(): bool - { - if ($this->parameterVerificationResult instanceof ExpectationFailedException) { - throw $this->parameterVerificationResult; - } - - return (bool) $this->parameterVerificationResult; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php deleted file mode 100644 index 0c9f191..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Rule; - -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; -use PHPUnit\Framework\MockObject\Verifiable; -use PHPUnit\Framework\SelfDescribing; - -interface ParametersRule extends SelfDescribing, Verifiable -{ - /** - * @throws ExpectationFailedException if the invocation violates the rule - */ - public function apply(BaseInvocation $invocation): void; - - public function verify(): void; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Stub.php deleted file mode 100644 index f7358af..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\MockObject\Builder\InvocationStubber; - -/** - * @method InvocationStubber method($constraint) - */ -interface Stub -{ - public function __phpunit_getInvocationHandler(): InvocationHandler; - - public function __phpunit_hasMatchers(): bool; - - public function __phpunit_setReturnValueGeneration(bool $returnValueGeneration): void; -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php deleted file mode 100644 index d1d7bdb..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; -use SebastianBergmann\Exporter\Exporter; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ConsecutiveCalls implements Stub -{ - /** - * @var array - */ - private $stack; - - /** - * @var mixed - */ - private $value; - - public function __construct(array $stack) - { - $this->stack = $stack; - } - - public function invoke(Invocation $invocation) - { - $this->value = \array_shift($this->stack); - - if ($this->value instanceof Stub) { - $this->value = $this->value->invoke($invocation); - } - - return $this->value; - } - - public function toString(): string - { - $exporter = new Exporter; - - return \sprintf( - 'return user-specified value %s', - $exporter->export($this->value) - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php deleted file mode 100644 index 11913c6..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; -use SebastianBergmann\Exporter\Exporter; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Exception implements Stub -{ - private $exception; - - public function __construct(\Throwable $exception) - { - $this->exception = $exception; - } - - /** - * @throws \Throwable - */ - public function invoke(Invocation $invocation): void - { - throw $this->exception; - } - - public function toString(): string - { - $exporter = new Exporter; - - return \sprintf( - 'raise user-specified exception %s', - $exporter->export($this->exception) - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php deleted file mode 100644 index bf0af3f..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnArgument implements Stub -{ - /** - * @var int - */ - private $argumentIndex; - - public function __construct($argumentIndex) - { - $this->argumentIndex = $argumentIndex; - } - - public function invoke(Invocation $invocation) - { - if (isset($invocation->getParameters()[$this->argumentIndex])) { - return $invocation->getParameters()[$this->argumentIndex]; - } - } - - public function toString(): string - { - return \sprintf('return argument #%d', $this->argumentIndex); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php deleted file mode 100644 index aa6dffb..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnCallback implements Stub -{ - private $callback; - - public function __construct($callback) - { - $this->callback = $callback; - } - - public function invoke(Invocation $invocation) - { - return \call_user_func_array($this->callback, $invocation->getParameters()); - } - - public function toString(): string - { - if (\is_array($this->callback)) { - if (\is_object($this->callback[0])) { - $class = \get_class($this->callback[0]); - $type = '->'; - } else { - $class = $this->callback[0]; - $type = '::'; - } - - return \sprintf( - 'return result of user defined callback %s%s%s() with the ' . - 'passed arguments', - $class, - $type, - $this->callback[1] - ); - } - - return 'return result of user defined callback ' . $this->callback . - ' with the passed arguments'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php deleted file mode 100644 index 0dd9476..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; -use SebastianBergmann\Exporter\Exporter; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnReference implements Stub -{ - /** - * @var mixed - */ - private $reference; - - public function __construct(&$reference) - { - $this->reference = &$reference; - } - - public function invoke(Invocation $invocation) - { - return $this->reference; - } - - public function toString(): string - { - $exporter = new Exporter; - - return \sprintf( - 'return user-specified reference %s', - $exporter->export($this->reference) - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php deleted file mode 100644 index 6d2137b..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; -use PHPUnit\Framework\MockObject\RuntimeException; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnSelf implements Stub -{ - /** - * @throws RuntimeException - */ - public function invoke(Invocation $invocation) - { - return $invocation->getObject(); - } - - public function toString(): string - { - return 'return the current object'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php deleted file mode 100644 index caaf4bc..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; -use SebastianBergmann\Exporter\Exporter; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnStub implements Stub -{ - /** - * @var mixed - */ - private $value; - - public function __construct($value) - { - $this->value = $value; - } - - public function invoke(Invocation $invocation) - { - return $this->value; - } - - public function toString(): string - { - $exporter = new Exporter; - - return \sprintf( - 'return user-specified value %s', - $exporter->export($this->value) - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php deleted file mode 100644 index b44035a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ReturnValueMap implements Stub -{ - /** - * @var array - */ - private $valueMap; - - public function __construct(array $valueMap) - { - $this->valueMap = $valueMap; - } - - public function invoke(Invocation $invocation) - { - $parameterCount = \count($invocation->getParameters()); - - foreach ($this->valueMap as $map) { - if (!\is_array($map) || $parameterCount !== (\count($map) - 1)) { - continue; - } - - $return = \array_pop($map); - - if ($invocation->getParameters() === $map) { - return $return; - } - } - } - - public function toString(): string - { - return 'return value from a map'; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php deleted file mode 100644 index 15cfce5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject\Stub; - -use PHPUnit\Framework\MockObject\Invocation; -use PHPUnit\Framework\SelfDescribing; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface Stub extends SelfDescribing -{ - /** - * Fakes the processing of the invocation $invocation by returning a - * specific value. - * - * @param Invocation $invocation The invocation which was mocked and matched by the current method and argument matchers - */ - public function invoke(Invocation $invocation); -} diff --git a/vendor/phpunit/phpunit/src/Framework/MockObject/Verifiable.php b/vendor/phpunit/phpunit/src/Framework/MockObject/Verifiable.php deleted file mode 100644 index 8c9a82c..0000000 --- a/vendor/phpunit/phpunit/src/Framework/MockObject/Verifiable.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework\MockObject; - -use PHPUnit\Framework\ExpectationFailedException; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface Verifiable -{ - /** - * Verifies that the current expectation is valid. If everything is OK the - * code should just return, if not it must throw an exception. - * - * @throws ExpectationFailedException - */ - public function verify(): void; -} diff --git a/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php b/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php deleted file mode 100644 index 73034f6..0000000 --- a/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface SelfDescribing -{ - /** - * Returns a string representation of the object. - */ - public function toString(): string; -} diff --git a/vendor/phpunit/phpunit/src/Framework/SkippedTest.php b/vendor/phpunit/phpunit/src/Framework/SkippedTest.php deleted file mode 100644 index c5ac84e..0000000 --- a/vendor/phpunit/phpunit/src/Framework/SkippedTest.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface SkippedTest -{ -} diff --git a/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php b/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php deleted file mode 100644 index b88dca3..0000000 --- a/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class SkippedTestCase extends TestCase -{ - /** - * @var bool - */ - protected $backupGlobals = false; - - /** - * @var bool - */ - protected $backupStaticAttributes = false; - - /** - * @var bool - */ - protected $runTestInSeparateProcess = false; - - /** - * @var bool - */ - protected $useErrorHandler = false; - - /** - * @var string - */ - private $message; - - public function __construct(string $className, string $methodName, string $message = '') - { - parent::__construct($className . '::' . $methodName); - - $this->message = $message; - } - - public function getMessage(): string - { - return $this->message; - } - - /** - * Returns a string representation of the test case. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function toString(): string - { - return $this->getName(); - } - - /** - * @throws Exception - */ - protected function runTest(): void - { - $this->markTestSkipped($this->message); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/Test.php b/vendor/phpunit/phpunit/src/Framework/Test.php deleted file mode 100644 index 7740afc..0000000 --- a/vendor/phpunit/phpunit/src/Framework/Test.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use Countable; - -/** - * A Test can be run and collect its results. - */ -interface Test extends Countable -{ - /** - * Runs a test and collects its result in a TestResult instance. - */ - public function run(TestResult $result = null): TestResult; -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestBuilder.php b/vendor/phpunit/phpunit/src/Framework/TestBuilder.php deleted file mode 100644 index a4b9ab5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestBuilder.php +++ /dev/null @@ -1,232 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use PHPUnit\Util\Filter; -use PHPUnit\Util\InvalidDataSetException; -use PHPUnit\Util\Test as TestUtil; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestBuilder -{ - public function build(\ReflectionClass $theClass, string $methodName): Test - { - $className = $theClass->getName(); - - if (!$theClass->isInstantiable()) { - return new WarningTestCase( - \sprintf('Cannot instantiate class "%s".', $className) - ); - } - - $backupSettings = TestUtil::getBackupSettings( - $className, - $methodName - ); - - $preserveGlobalState = TestUtil::getPreserveGlobalStateSettings( - $className, - $methodName - ); - - $runTestInSeparateProcess = TestUtil::getProcessIsolationSettings( - $className, - $methodName - ); - - $runClassInSeparateProcess = TestUtil::getClassProcessIsolationSettings( - $className, - $methodName - ); - - $constructor = $theClass->getConstructor(); - - if ($constructor === null) { - throw new Exception('No valid test provided.'); - } - - $parameters = $constructor->getParameters(); - - // TestCase() or TestCase($name) - if (\count($parameters) < 2) { - $test = $this->buildTestWithoutData($className); - } // TestCase($name, $data) - else { - try { - $data = TestUtil::getProvidedData( - $className, - $methodName - ); - } catch (IncompleteTestError $e) { - $message = \sprintf( - "Test for %s::%s marked incomplete by data provider\n%s", - $className, - $methodName, - $this->throwableToString($e) - ); - - $data = new IncompleteTestCase($className, $methodName, $message); - } catch (SkippedTestError $e) { - $message = \sprintf( - "Test for %s::%s skipped by data provider\n%s", - $className, - $methodName, - $this->throwableToString($e) - ); - - $data = new SkippedTestCase($className, $methodName, $message); - } catch (\Throwable $t) { - $message = \sprintf( - "The data provider specified for %s::%s is invalid.\n%s", - $className, - $methodName, - $this->throwableToString($t) - ); - - $data = new WarningTestCase($message); - } - - // Test method with @dataProvider. - if (isset($data)) { - $test = $this->buildDataProviderTestSuite( - $methodName, - $className, - $data, - $runTestInSeparateProcess, - $preserveGlobalState, - $runClassInSeparateProcess, - $backupSettings - ); - } else { - $test = $this->buildTestWithoutData($className); - } - } - - if ($test instanceof TestCase) { - $test->setName($methodName); - $this->configureTestCase( - $test, - $runTestInSeparateProcess, - $preserveGlobalState, - $runClassInSeparateProcess, - $backupSettings - ); - } - - return $test; - } - - /** @psalm-param class-string $className */ - private function buildTestWithoutData(string $className) - { - return new $className; - } - - /** @psalm-param class-string $className */ - private function buildDataProviderTestSuite( - string $methodName, - string $className, - $data, - bool $runTestInSeparateProcess, - ?bool $preserveGlobalState, - bool $runClassInSeparateProcess, - array $backupSettings - ): DataProviderTestSuite { - $dataProviderTestSuite = new DataProviderTestSuite( - $className . '::' . $methodName - ); - - $groups = TestUtil::getGroups($className, $methodName); - - if ($data instanceof WarningTestCase || - $data instanceof SkippedTestCase || - $data instanceof IncompleteTestCase) { - $dataProviderTestSuite->addTest($data, $groups); - } else { - foreach ($data as $_dataName => $_data) { - $_test = new $className($methodName, $_data, $_dataName); - - \assert($_test instanceof TestCase); - - $this->configureTestCase( - $_test, - $runTestInSeparateProcess, - $preserveGlobalState, - $runClassInSeparateProcess, - $backupSettings - ); - - $dataProviderTestSuite->addTest($_test, $groups); - } - } - - return $dataProviderTestSuite; - } - - private function configureTestCase( - TestCase $test, - bool $runTestInSeparateProcess, - ?bool $preserveGlobalState, - bool $runClassInSeparateProcess, - array $backupSettings - ): void { - if ($runTestInSeparateProcess) { - $test->setRunTestInSeparateProcess(true); - - if ($preserveGlobalState !== null) { - $test->setPreserveGlobalState($preserveGlobalState); - } - } - - if ($runClassInSeparateProcess) { - $test->setRunClassInSeparateProcess(true); - - if ($preserveGlobalState !== null) { - $test->setPreserveGlobalState($preserveGlobalState); - } - } - - if ($backupSettings['backupGlobals'] !== null) { - $test->setBackupGlobals($backupSettings['backupGlobals']); - } - - if ($backupSettings['backupStaticAttributes'] !== null) { - $test->setBackupStaticAttributes( - $backupSettings['backupStaticAttributes'] - ); - } - } - - private function throwableToString(\Throwable $t): string - { - $message = $t->getMessage(); - - if (empty(\trim($message))) { - $message = ''; - } - - if ($t instanceof InvalidDataSetException) { - return \sprintf( - "%s\n%s", - $message, - Filter::getFilteredStacktrace($t) - ); - } - - return \sprintf( - "%s: %s\n%s", - \get_class($t), - $message, - Filter::getFilteredStacktrace($t) - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestCase.php b/vendor/phpunit/phpunit/src/Framework/TestCase.php deleted file mode 100644 index 2c8f17d..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestCase.php +++ /dev/null @@ -1,2526 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use DeepCopy\DeepCopy; -use PHPUnit\Framework\Constraint\Exception as ExceptionConstraint; -use PHPUnit\Framework\Constraint\ExceptionCode; -use PHPUnit\Framework\Constraint\ExceptionMessage; -use PHPUnit\Framework\Constraint\ExceptionMessageRegularExpression; -use PHPUnit\Framework\Error\Deprecated; -use PHPUnit\Framework\Error\Error; -use PHPUnit\Framework\Error\Notice; -use PHPUnit\Framework\Error\Warning as WarningError; -use PHPUnit\Framework\MockObject\Generator as MockGenerator; -use PHPUnit\Framework\MockObject\MockBuilder; -use PHPUnit\Framework\MockObject\MockObject; -use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount as AnyInvokedCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtIndex as InvokedAtIndexMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastCount as InvokedAtLeastCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastOnce as InvokedAtLeastOnceMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount as InvokedAtMostCountMatcher; -use PHPUnit\Framework\MockObject\Rule\InvokedCount as InvokedCountMatcher; -use PHPUnit\Framework\MockObject\Stub; -use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls as ConsecutiveCallsStub; -use PHPUnit\Framework\MockObject\Stub\Exception as ExceptionStub; -use PHPUnit\Framework\MockObject\Stub\ReturnArgument as ReturnArgumentStub; -use PHPUnit\Framework\MockObject\Stub\ReturnCallback as ReturnCallbackStub; -use PHPUnit\Framework\MockObject\Stub\ReturnSelf as ReturnSelfStub; -use PHPUnit\Framework\MockObject\Stub\ReturnStub; -use PHPUnit\Framework\MockObject\Stub\ReturnValueMap as ReturnValueMapStub; -use PHPUnit\Runner\BaseTestRunner; -use PHPUnit\Runner\PhptTestCase; -use PHPUnit\Util\Exception as UtilException; -use PHPUnit\Util\GlobalState; -use PHPUnit\Util\PHP\AbstractPhpProcess; -use PHPUnit\Util\Test as TestUtil; -use PHPUnit\Util\Type; -use Prophecy\Exception\Prediction\PredictionException; -use Prophecy\Prophecy\MethodProphecy; -use Prophecy\Prophecy\ObjectProphecy; -use Prophecy\Prophet; -use SebastianBergmann\Comparator\Comparator; -use SebastianBergmann\Comparator\Factory as ComparatorFactory; -use SebastianBergmann\Diff\Differ; -use SebastianBergmann\Exporter\Exporter; -use SebastianBergmann\GlobalState\Blacklist; -use SebastianBergmann\GlobalState\Restorer; -use SebastianBergmann\GlobalState\Snapshot; -use SebastianBergmann\ObjectEnumerator\Enumerator; - -abstract class TestCase extends Assert implements SelfDescribing, Test -{ - private const LOCALE_CATEGORIES = [\LC_ALL, \LC_COLLATE, \LC_CTYPE, \LC_MONETARY, \LC_NUMERIC, \LC_TIME]; - - /** - * @var ?bool - */ - protected $backupGlobals; - - /** - * @var string[] - */ - protected $backupGlobalsBlacklist = []; - - /** - * @var bool - */ - protected $backupStaticAttributes; - - /** - * @var array> - */ - protected $backupStaticAttributesBlacklist = []; - - /** - * @var bool - */ - protected $runTestInSeparateProcess; - - /** - * @var bool - */ - protected $preserveGlobalState = true; - - /** - * @var bool - */ - private $runClassInSeparateProcess; - - /** - * @var bool - */ - private $inIsolation = false; - - /** - * @var array - */ - private $data; - - /** - * @var string - */ - private $dataName; - - /** - * @var null|string - */ - private $expectedException; - - /** - * @var null|string - */ - private $expectedExceptionMessage; - - /** - * @var null|string - */ - private $expectedExceptionMessageRegExp; - - /** - * @var null|int|string - */ - private $expectedExceptionCode; - - /** - * @var string - */ - private $name = ''; - - /** - * @var string[] - */ - private $dependencies = []; - - /** - * @var array - */ - private $dependencyInput = []; - - /** - * @var array - */ - private $iniSettings = []; - - /** - * @var array - */ - private $locale = []; - - /** - * @var MockObject[] - */ - private $mockObjects = []; - - /** - * @var MockGenerator - */ - private $mockObjectGenerator; - - /** - * @var int - */ - private $status = BaseTestRunner::STATUS_UNKNOWN; - - /** - * @var string - */ - private $statusMessage = ''; - - /** - * @var int - */ - private $numAssertions = 0; - - /** - * @var TestResult - */ - private $result; - - /** - * @var mixed - */ - private $testResult; - - /** - * @var string - */ - private $output = ''; - - /** - * @var string - */ - private $outputExpectedRegex; - - /** - * @var string - */ - private $outputExpectedString; - - /** - * @var mixed - */ - private $outputCallback = false; - - /** - * @var bool - */ - private $outputBufferingActive = false; - - /** - * @var int - */ - private $outputBufferingLevel; - - /** - * @var bool - */ - private $outputRetrievedForAssertion = false; - - /** - * @var Snapshot - */ - private $snapshot; - - /** - * @var \Prophecy\Prophet - */ - private $prophet; - - /** - * @var bool - */ - private $beStrictAboutChangesToGlobalState = false; - - /** - * @var bool - */ - private $registerMockObjectsFromTestArgumentsRecursively = false; - - /** - * @var string[] - */ - private $warnings = []; - - /** - * @var string[] - */ - private $groups = []; - - /** - * @var bool - */ - private $doesNotPerformAssertions = false; - - /** - * @var Comparator[] - */ - private $customComparators = []; - - /** - * @var string[] - */ - private $doubledTypes = []; - - /** - * @var bool - */ - private $deprecatedExpectExceptionMessageRegExpUsed = false; - - /** - * Returns a matcher that matches when the method is executed - * zero or more times. - */ - public static function any(): AnyInvokedCountMatcher - { - return new AnyInvokedCountMatcher; - } - - /** - * Returns a matcher that matches when the method is never executed. - */ - public static function never(): InvokedCountMatcher - { - return new InvokedCountMatcher(0); - } - - /** - * Returns a matcher that matches when the method is executed - * at least N times. - */ - public static function atLeast(int $requiredInvocations): InvokedAtLeastCountMatcher - { - return new InvokedAtLeastCountMatcher( - $requiredInvocations - ); - } - - /** - * Returns a matcher that matches when the method is executed at least once. - */ - public static function atLeastOnce(): InvokedAtLeastOnceMatcher - { - return new InvokedAtLeastOnceMatcher; - } - - /** - * Returns a matcher that matches when the method is executed exactly once. - */ - public static function once(): InvokedCountMatcher - { - return new InvokedCountMatcher(1); - } - - /** - * Returns a matcher that matches when the method is executed - * exactly $count times. - */ - public static function exactly(int $count): InvokedCountMatcher - { - return new InvokedCountMatcher($count); - } - - /** - * Returns a matcher that matches when the method is executed - * at most N times. - */ - public static function atMost(int $allowedInvocations): InvokedAtMostCountMatcher - { - return new InvokedAtMostCountMatcher($allowedInvocations); - } - - /** - * Returns a matcher that matches when the method is executed - * at the given index. - */ - public static function at(int $index): InvokedAtIndexMatcher - { - return new InvokedAtIndexMatcher($index); - } - - public static function returnValue($value): ReturnStub - { - return new ReturnStub($value); - } - - public static function returnValueMap(array $valueMap): ReturnValueMapStub - { - return new ReturnValueMapStub($valueMap); - } - - public static function returnArgument(int $argumentIndex): ReturnArgumentStub - { - return new ReturnArgumentStub($argumentIndex); - } - - public static function returnCallback($callback): ReturnCallbackStub - { - return new ReturnCallbackStub($callback); - } - - /** - * Returns the current object. - * - * This method is useful when mocking a fluent interface. - */ - public static function returnSelf(): ReturnSelfStub - { - return new ReturnSelfStub; - } - - public static function throwException(\Throwable $exception): ExceptionStub - { - return new ExceptionStub($exception); - } - - public static function onConsecutiveCalls(...$args): ConsecutiveCallsStub - { - return new ConsecutiveCallsStub($args); - } - - /** - * @param string $name - * @param string $dataName - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function __construct($name = null, array $data = [], $dataName = '') - { - if ($name !== null) { - $this->setName($name); - } - - $this->data = $data; - $this->dataName = $dataName; - } - - /** - * This method is called before the first test of this test class is run. - */ - public static function setUpBeforeClass(): void - { - } - - /** - * This method is called after the last test of this test class is run. - */ - public static function tearDownAfterClass(): void - { - } - - /** - * This method is called before each test. - */ - protected function setUp(): void - { - } - - /** - * This method is called after each test. - */ - protected function tearDown(): void - { - } - - /** - * Returns a string representation of the test case. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - public function toString(): string - { - try { - $class = new \ReflectionClass($this); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $buffer = \sprintf( - '%s::%s', - $class->name, - $this->getName(false) - ); - - return $buffer . $this->getDataSetAsString(); - } - - public function count(): int - { - return 1; - } - - public function getActualOutputForAssertion(): string - { - $this->outputRetrievedForAssertion = true; - - return $this->getActualOutput(); - } - - public function expectOutputRegex(string $expectedRegex): void - { - $this->outputExpectedRegex = $expectedRegex; - } - - public function expectOutputString(string $expectedString): void - { - $this->outputExpectedString = $expectedString; - } - - /** - * @psalm-param class-string<\Throwable> $exception - */ - public function expectException(string $exception): void - { - $this->expectedException = $exception; - } - - /** - * @param int|string $code - */ - public function expectExceptionCode($code): void - { - $this->expectedExceptionCode = $code; - } - - public function expectExceptionMessage(string $message): void - { - $this->expectedExceptionMessage = $message; - } - - public function expectExceptionMessageMatches(string $regularExpression): void - { - $this->expectedExceptionMessageRegExp = $regularExpression; - } - - /** - * @deprecated Use expectExceptionMessageMatches() instead - */ - public function expectExceptionMessageRegExp(string $regularExpression): void - { - $this->deprecatedExpectExceptionMessageRegExpUsed = true; - - $this->expectExceptionMessageMatches($regularExpression); - } - - /** - * Sets up an expectation for an exception to be raised by the code under test. - * Information for expected exception class, expected exception message, and - * expected exception code are retrieved from a given Exception object. - */ - public function expectExceptionObject(\Exception $exception): void - { - $this->expectException(\get_class($exception)); - $this->expectExceptionMessage($exception->getMessage()); - $this->expectExceptionCode($exception->getCode()); - } - - public function expectNotToPerformAssertions(): void - { - $this->doesNotPerformAssertions = true; - } - - public function expectDeprecation(): void - { - $this->expectException(Deprecated::class); - } - - public function expectDeprecationMessage(string $message): void - { - $this->expectExceptionMessage($message); - } - - public function expectDeprecationMessageMatches(string $regularExpression): void - { - $this->expectExceptionMessageMatches($regularExpression); - } - - public function expectNotice(): void - { - $this->expectException(Notice::class); - } - - public function expectNoticeMessage(string $message): void - { - $this->expectExceptionMessage($message); - } - - public function expectNoticeMessageMatches(string $regularExpression): void - { - $this->expectExceptionMessageMatches($regularExpression); - } - - public function expectWarning(): void - { - $this->expectException(WarningError::class); - } - - public function expectWarningMessage(string $message): void - { - $this->expectExceptionMessage($message); - } - - public function expectWarningMessageMatches(string $regularExpression): void - { - $this->expectExceptionMessageMatches($regularExpression); - } - - public function expectError(): void - { - $this->expectException(Error::class); - } - - public function expectErrorMessage(string $message): void - { - $this->expectExceptionMessage($message); - } - - public function expectErrorMessageMatches(string $regularExpression): void - { - $this->expectExceptionMessageMatches($regularExpression); - } - - public function getStatus(): int - { - return $this->status; - } - - public function markAsRisky(): void - { - $this->status = BaseTestRunner::STATUS_RISKY; - } - - public function getStatusMessage(): string - { - return $this->statusMessage; - } - - public function hasFailed(): bool - { - $status = $this->getStatus(); - - return $status === BaseTestRunner::STATUS_FAILURE || $status === BaseTestRunner::STATUS_ERROR; - } - - /** - * Runs the test case and collects the results in a TestResult object. - * If no TestResult object is passed a new one will be created. - * - * @throws CodeCoverageException - * @throws UtilException - * @throws \SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException - * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException - * @throws \SebastianBergmann\CodeCoverage\MissingCoversAnnotationException - * @throws \SebastianBergmann\CodeCoverage\RuntimeException - * @throws \SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function run(TestResult $result = null): TestResult - { - if ($result === null) { - $result = $this->createResult(); - } - - if (!$this instanceof WarningTestCase) { - $this->setTestResultObject($result); - } - - if (!$this instanceof WarningTestCase && - !$this instanceof SkippedTestCase && - !$this->handleDependencies()) { - return $result; - } - - if ($this->runInSeparateProcess()) { - $runEntireClass = $this->runClassInSeparateProcess && !$this->runTestInSeparateProcess; - - try { - $class = new \ReflectionClass($this); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($runEntireClass) { - $template = new \Text_Template( - __DIR__ . '/../Util/PHP/Template/TestCaseClass.tpl' - ); - } else { - $template = new \Text_Template( - __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl' - ); - } - - if ($this->preserveGlobalState) { - $constants = GlobalState::getConstantsAsString(); - $globals = GlobalState::getGlobalsAsString(); - $includedFiles = GlobalState::getIncludedFilesAsString(); - $iniSettings = GlobalState::getIniSettingsAsString(); - } else { - $constants = ''; - - if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { - $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . \var_export($GLOBALS['__PHPUNIT_BOOTSTRAP'], true) . ";\n"; - } else { - $globals = ''; - } - - $includedFiles = ''; - $iniSettings = ''; - } - - $coverage = $result->getCollectCodeCoverageInformation() ? 'true' : 'false'; - $isStrictAboutTestsThatDoNotTestAnything = $result->isStrictAboutTestsThatDoNotTestAnything() ? 'true' : 'false'; - $isStrictAboutOutputDuringTests = $result->isStrictAboutOutputDuringTests() ? 'true' : 'false'; - $enforcesTimeLimit = $result->enforcesTimeLimit() ? 'true' : 'false'; - $isStrictAboutTodoAnnotatedTests = $result->isStrictAboutTodoAnnotatedTests() ? 'true' : 'false'; - $isStrictAboutResourceUsageDuringSmallTests = $result->isStrictAboutResourceUsageDuringSmallTests() ? 'true' : 'false'; - - if (\defined('PHPUNIT_COMPOSER_INSTALL')) { - $composerAutoload = \var_export(PHPUNIT_COMPOSER_INSTALL, true); - } else { - $composerAutoload = '\'\''; - } - - if (\defined('__PHPUNIT_PHAR__')) { - $phar = \var_export(__PHPUNIT_PHAR__, true); - } else { - $phar = '\'\''; - } - - if ($result->getCodeCoverage()) { - $codeCoverageFilter = $result->getCodeCoverage()->filter(); - } else { - $codeCoverageFilter = null; - } - - $data = \var_export(\serialize($this->data), true); - $dataName = \var_export($this->dataName, true); - $dependencyInput = \var_export(\serialize($this->dependencyInput), true); - $includePath = \var_export(\get_include_path(), true); - $codeCoverageFilter = \var_export(\serialize($codeCoverageFilter), true); - // must do these fixes because TestCaseMethod.tpl has unserialize('{data}') in it, and we can't break BC - // the lines above used to use addcslashes() rather than var_export(), which breaks null byte escape sequences - $data = "'." . $data . ".'"; - $dataName = "'.(" . $dataName . ").'"; - $dependencyInput = "'." . $dependencyInput . ".'"; - $includePath = "'." . $includePath . ".'"; - $codeCoverageFilter = "'." . $codeCoverageFilter . ".'"; - - $configurationFilePath = $GLOBALS['__PHPUNIT_CONFIGURATION_FILE'] ?? ''; - - $var = [ - 'composerAutoload' => $composerAutoload, - 'phar' => $phar, - 'filename' => $class->getFileName(), - 'className' => $class->getName(), - 'collectCodeCoverageInformation' => $coverage, - 'data' => $data, - 'dataName' => $dataName, - 'dependencyInput' => $dependencyInput, - 'constants' => $constants, - 'globals' => $globals, - 'include_path' => $includePath, - 'included_files' => $includedFiles, - 'iniSettings' => $iniSettings, - 'isStrictAboutTestsThatDoNotTestAnything' => $isStrictAboutTestsThatDoNotTestAnything, - 'isStrictAboutOutputDuringTests' => $isStrictAboutOutputDuringTests, - 'enforcesTimeLimit' => $enforcesTimeLimit, - 'isStrictAboutTodoAnnotatedTests' => $isStrictAboutTodoAnnotatedTests, - 'isStrictAboutResourceUsageDuringSmallTests' => $isStrictAboutResourceUsageDuringSmallTests, - 'codeCoverageFilter' => $codeCoverageFilter, - 'configurationFilePath' => $configurationFilePath, - 'name' => $this->getName(false), - ]; - - if (!$runEntireClass) { - $var['methodName'] = $this->name; - } - - $template->setVar($var); - - $php = AbstractPhpProcess::factory(); - $php->runTestJob($template->render(), $this, $result); - } else { - $result->run($this); - } - - $this->result = null; - - return $result; - } - - /** - * Returns a builder object to create mock objects using a fluent interface. - * - * @param string|string[] $className - * - * @psalm-template RealInstanceType of object - * @psalm-param class-string|string[] $className - * @psalm-return MockBuilder - */ - public function getMockBuilder($className): MockBuilder - { - if (!\is_string($className)) { - $this->addWarning('Passing an array of interface names to getMockBuilder() for creating a test double that implements multiple interfaces is deprecated and will no longer be supported in PHPUnit 9.'); - } - - $this->recordDoubledType($className); - - return new MockBuilder($this, $className); - } - - public function registerComparator(Comparator $comparator): void - { - ComparatorFactory::getInstance()->register($comparator); - - $this->customComparators[] = $comparator; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - * - * @deprecated Invoking this method has no effect; it will be removed in PHPUnit 9 - */ - public function setUseErrorHandler(bool $useErrorHandler): void - { - } - - /** - * @return string[] - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function doubledTypes(): array - { - return \array_unique($this->doubledTypes); - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getGroups(): array - { - return $this->groups; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setGroups(array $groups): void - { - $this->groups = $groups; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getAnnotations(): array - { - return TestUtil::parseTestMethodAnnotations( - \get_class($this), - $this->name - ); - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getName(bool $withDataSet = true): string - { - if ($withDataSet) { - return $this->name . $this->getDataSetAsString(false); - } - - return $this->name; - } - - /** - * Returns the size of the test. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getSize(): int - { - return TestUtil::getSize( - \get_class($this), - $this->getName(false) - ); - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function hasSize(): bool - { - return $this->getSize() !== TestUtil::UNKNOWN; - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function isSmall(): bool - { - return $this->getSize() === TestUtil::SMALL; - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function isMedium(): bool - { - return $this->getSize() === TestUtil::MEDIUM; - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function isLarge(): bool - { - return $this->getSize() === TestUtil::LARGE; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getActualOutput(): string - { - if (!$this->outputBufferingActive) { - return $this->output; - } - - return (string) \ob_get_contents(); - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function hasOutput(): bool - { - if ($this->output === '') { - return false; - } - - if ($this->hasExpectationOnOutput()) { - return false; - } - - return true; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function doesNotPerformAssertions(): bool - { - return $this->doesNotPerformAssertions; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function hasExpectationOnOutput(): bool - { - return \is_string($this->outputExpectedString) || \is_string($this->outputExpectedRegex) || $this->outputRetrievedForAssertion; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getExpectedException(): ?string - { - return $this->expectedException; - } - - /** - * @return null|int|string - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getExpectedExceptionCode() - { - return $this->expectedExceptionCode; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getExpectedExceptionMessage(): ?string - { - return $this->expectedExceptionMessage; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getExpectedExceptionMessageRegExp(): ?string - { - return $this->expectedExceptionMessageRegExp; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setRegisterMockObjectsFromTestArgumentsRecursively(bool $flag): void - { - $this->registerMockObjectsFromTestArgumentsRecursively = $flag; - } - - /** - * @throws \Throwable - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function runBare(): void - { - $this->numAssertions = 0; - - $this->snapshotGlobalState(); - $this->startOutputBuffering(); - \clearstatcache(); - $currentWorkingDirectory = \getcwd(); - - $hookMethods = TestUtil::getHookMethods(\get_class($this)); - - $hasMetRequirements = false; - - try { - $this->checkRequirements(); - $hasMetRequirements = true; - - if ($this->inIsolation) { - foreach ($hookMethods['beforeClass'] as $method) { - $this->$method(); - } - } - - $this->setExpectedExceptionFromAnnotation(); - $this->setDoesNotPerformAssertionsFromAnnotation(); - - foreach ($hookMethods['before'] as $method) { - $this->$method(); - } - - $this->assertPreConditions(); - $this->testResult = $this->runTest(); - $this->verifyMockObjects(); - $this->assertPostConditions(); - - if (!empty($this->warnings)) { - throw new Warning( - \implode( - "\n", - \array_unique($this->warnings) - ) - ); - } - - $this->status = BaseTestRunner::STATUS_PASSED; - } catch (IncompleteTest $e) { - $this->status = BaseTestRunner::STATUS_INCOMPLETE; - $this->statusMessage = $e->getMessage(); - } catch (SkippedTest $e) { - $this->status = BaseTestRunner::STATUS_SKIPPED; - $this->statusMessage = $e->getMessage(); - } catch (Warning $e) { - $this->status = BaseTestRunner::STATUS_WARNING; - $this->statusMessage = $e->getMessage(); - } catch (AssertionFailedError $e) { - $this->status = BaseTestRunner::STATUS_FAILURE; - $this->statusMessage = $e->getMessage(); - } catch (PredictionException $e) { - $this->status = BaseTestRunner::STATUS_FAILURE; - $this->statusMessage = $e->getMessage(); - } catch (\Throwable $_e) { - $e = $_e; - $this->status = BaseTestRunner::STATUS_ERROR; - $this->statusMessage = $_e->getMessage(); - } - - $this->mockObjects = []; - $this->prophet = null; - - // Tear down the fixture. An exception raised in tearDown() will be - // caught and passed on when no exception was raised before. - try { - if ($hasMetRequirements) { - foreach ($hookMethods['after'] as $method) { - $this->$method(); - } - - if ($this->inIsolation) { - foreach ($hookMethods['afterClass'] as $method) { - $this->$method(); - } - } - } - } catch (\Throwable $_e) { - $e = $e ?? $_e; - } - - try { - $this->stopOutputBuffering(); - } catch (RiskyTestError $_e) { - $e = $e ?? $_e; - } - - if (isset($_e)) { - $this->status = BaseTestRunner::STATUS_ERROR; - $this->statusMessage = $_e->getMessage(); - } - - \clearstatcache(); - - if ($currentWorkingDirectory !== \getcwd()) { - \chdir($currentWorkingDirectory); - } - - $this->restoreGlobalState(); - $this->unregisterCustomComparators(); - $this->cleanupIniSettings(); - $this->cleanupLocaleSettings(); - \libxml_clear_errors(); - - // Perform assertion on output. - if (!isset($e)) { - try { - if ($this->outputExpectedRegex !== null) { - $this->assertRegExp($this->outputExpectedRegex, $this->output); - } elseif ($this->outputExpectedString !== null) { - $this->assertEquals($this->outputExpectedString, $this->output); - } - } catch (\Throwable $_e) { - $e = $_e; - } - } - - // Workaround for missing "finally". - if (isset($e)) { - if ($e instanceof PredictionException) { - $e = new AssertionFailedError($e->getMessage()); - } - - $this->onNotSuccessfulTest($e); - } - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setName(string $name): void - { - $this->name = $name; - } - - /** - * @param string[] $dependencies - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setDependencies(array $dependencies): void - { - $this->dependencies = $dependencies; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getDependencies(): array - { - return $this->dependencies; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function hasDependencies(): bool - { - return \count($this->dependencies) > 0; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setDependencyInput(array $dependencyInput): void - { - $this->dependencyInput = $dependencyInput; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getDependencyInput(): array - { - return $this->dependencyInput; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setBeStrictAboutChangesToGlobalState(?bool $beStrictAboutChangesToGlobalState): void - { - $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setBackupGlobals(?bool $backupGlobals): void - { - if ($this->backupGlobals === null && $backupGlobals !== null) { - $this->backupGlobals = $backupGlobals; - } - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setBackupStaticAttributes(?bool $backupStaticAttributes): void - { - if ($this->backupStaticAttributes === null && $backupStaticAttributes !== null) { - $this->backupStaticAttributes = $backupStaticAttributes; - } - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setRunTestInSeparateProcess(bool $runTestInSeparateProcess): void - { - if ($this->runTestInSeparateProcess === null) { - $this->runTestInSeparateProcess = $runTestInSeparateProcess; - } - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setRunClassInSeparateProcess(bool $runClassInSeparateProcess): void - { - if ($this->runClassInSeparateProcess === null) { - $this->runClassInSeparateProcess = $runClassInSeparateProcess; - } - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setPreserveGlobalState(bool $preserveGlobalState): void - { - $this->preserveGlobalState = $preserveGlobalState; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setInIsolation(bool $inIsolation): void - { - $this->inIsolation = $inIsolation; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function isInIsolation(): bool - { - return $this->inIsolation; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getResult() - { - return $this->testResult; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setResult($result): void - { - $this->testResult = $result; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setOutputCallback(callable $callback): void - { - $this->outputCallback = $callback; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getTestResultObject(): ?TestResult - { - return $this->result; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function setTestResultObject(TestResult $result): void - { - $this->result = $result; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function registerMockObject(MockObject $mockObject): void - { - $this->mockObjects[] = $mockObject; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function addToAssertionCount(int $count): void - { - $this->numAssertions += $count; - } - - /** - * Returns the number of assertions performed by this test. - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getNumAssertions(): int - { - return $this->numAssertions; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function usesDataProvider(): bool - { - return !empty($this->data); - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function dataDescription(): string - { - return \is_string($this->dataName) ? $this->dataName : ''; - } - - /** - * @return int|string - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function dataName() - { - return $this->dataName; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getDataSetAsString(bool $includeData = true): string - { - $buffer = ''; - - if (!empty($this->data)) { - if (\is_int($this->dataName)) { - $buffer .= \sprintf(' with data set #%d', $this->dataName); - } else { - $buffer .= \sprintf(' with data set "%s"', $this->dataName); - } - - $exporter = new Exporter; - - if ($includeData) { - $buffer .= \sprintf(' (%s)', $exporter->shortenedRecursiveExport($this->data)); - } - } - - return $buffer; - } - - /** - * Gets the data set of a TestCase. - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function getProvidedData(): array - { - return $this->data; - } - - /** - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - public function addWarning(string $warning): void - { - $this->warnings[] = $warning; - } - - /** - * Override to run the test and assert its state. - * - * @throws AssertionFailedError - * @throws Exception - * @throws ExpectationFailedException - * @throws \SebastianBergmann\ObjectEnumerator\InvalidArgumentException - * @throws \Throwable - */ - protected function runTest() - { - if (\trim($this->name) === '') { - throw new Exception( - 'PHPUnit\Framework\TestCase::$name must be a non-blank string.' - ); - } - - $testArguments = \array_merge($this->data, $this->dependencyInput); - - $this->registerMockObjectsFromTestArguments($testArguments); - - try { - $testResult = $this->{$this->name}(...\array_values($testArguments)); - } catch (\Throwable $exception) { - if (!$this->checkExceptionExpectations($exception)) { - throw $exception; - } - - if ($this->expectedException !== null) { - $this->assertThat( - $exception, - new ExceptionConstraint( - $this->expectedException - ) - ); - } - - if ($this->expectedExceptionMessage !== null) { - $this->assertThat( - $exception, - new ExceptionMessage( - $this->expectedExceptionMessage - ) - ); - } - - if ($this->expectedExceptionMessageRegExp !== null) { - $this->assertThat( - $exception, - new ExceptionMessageRegularExpression( - $this->expectedExceptionMessageRegExp - ) - ); - } - - if ($this->expectedExceptionCode !== null) { - $this->assertThat( - $exception, - new ExceptionCode( - $this->expectedExceptionCode - ) - ); - } - - if ($this->deprecatedExpectExceptionMessageRegExpUsed) { - $this->addWarning('expectExceptionMessageRegExp() is deprecated in PHPUnit 8 and will be removed in PHPUnit 9.'); - } - - return; - } - - if ($this->expectedException !== null) { - $this->assertThat( - null, - new ExceptionConstraint( - $this->expectedException - ) - ); - } elseif ($this->expectedExceptionMessage !== null) { - $this->numAssertions++; - - throw new AssertionFailedError( - \sprintf( - 'Failed asserting that exception with message "%s" is thrown', - $this->expectedExceptionMessage - ) - ); - } elseif ($this->expectedExceptionMessageRegExp !== null) { - $this->numAssertions++; - - throw new AssertionFailedError( - \sprintf( - 'Failed asserting that exception with message matching "%s" is thrown', - $this->expectedExceptionMessageRegExp - ) - ); - } elseif ($this->expectedExceptionCode !== null) { - $this->numAssertions++; - - throw new AssertionFailedError( - \sprintf( - 'Failed asserting that exception with code "%s" is thrown', - $this->expectedExceptionCode - ) - ); - } - - return $testResult; - } - - /** - * This method is a wrapper for the ini_set() function that automatically - * resets the modified php.ini setting to its original value after the - * test is run. - * - * @throws Exception - */ - protected function iniSet(string $varName, string $newValue): void - { - $currentValue = \ini_set($varName, $newValue); - - if ($currentValue !== false) { - $this->iniSettings[$varName] = $currentValue; - } else { - throw new Exception( - \sprintf( - 'INI setting "%s" could not be set to "%s".', - $varName, - $newValue - ) - ); - } - } - - /** - * This method is a wrapper for the setlocale() function that automatically - * resets the locale to its original value after the test is run. - * - * @throws Exception - */ - protected function setLocale(...$args): void - { - if (\count($args) < 2) { - throw new Exception; - } - - [$category, $locale] = $args; - - if (\defined('LC_MESSAGES')) { - $categories[] = \LC_MESSAGES; - } - - if (!\in_array($category, self::LOCALE_CATEGORIES, true)) { - throw new Exception; - } - - if (!\is_array($locale) && !\is_string($locale)) { - throw new Exception; - } - - $this->locale[$category] = \setlocale($category, 0); - - $result = \setlocale(...$args); - - if ($result === false) { - throw new Exception( - 'The locale functionality is not implemented on your platform, ' . - 'the specified locale does not exist or the category name is ' . - 'invalid.' - ); - } - } - - /** - * Makes configurable stub for the specified class. - * - * @psalm-template RealInstanceType of object - * @psalm-param class-string $originalClassName - * @psalm-return Stub&RealInstanceType - */ - protected function createStub(string $originalClassName): Stub - { - return $this->createMock($originalClassName); - } - - /** - * Returns a mock object for the specified class. - * - * @param string|string[] $originalClassName - * - * @psalm-template RealInstanceType of object - * @psalm-param class-string|string[] $originalClassName - * @psalm-return MockObject&RealInstanceType - */ - protected function createMock($originalClassName): MockObject - { - if (!\is_string($originalClassName)) { - $this->addWarning('Passing an array of interface names to createMock() for creating a test double that implements multiple interfaces is deprecated and will no longer be supported in PHPUnit 9.'); - } - - return $this->getMockBuilder($originalClassName) - ->disableOriginalConstructor() - ->disableOriginalClone() - ->disableArgumentCloning() - ->disallowMockingUnknownTypes() - ->getMock(); - } - - /** - * Returns a configured mock object for the specified class. - * - * @param string|string[] $originalClassName - * - * @psalm-template RealInstanceType of object - * @psalm-param class-string|string[] $originalClassName - * @psalm-return MockObject&RealInstanceType - */ - protected function createConfiguredMock($originalClassName, array $configuration): MockObject - { - $o = $this->createMock($originalClassName); - - foreach ($configuration as $method => $return) { - $o->method($method)->willReturn($return); - } - - return $o; - } - - /** - * Returns a partial mock object for the specified class. - * - * @param string|string[] $originalClassName - * @param string[] $methods - * - * @psalm-template RealInstanceType of object - * @psalm-param class-string|string[] $originalClassName - * @psalm-return MockObject&RealInstanceType - */ - protected function createPartialMock($originalClassName, array $methods): MockObject - { - if (!\is_string($originalClassName)) { - $this->addWarning('Passing an array of interface names to createPartialMock() for creating a test double that implements multiple interfaces is deprecated and will no longer be supported in PHPUnit 9.'); - } - - $class_names = \is_array($originalClassName) ? $originalClassName : [$originalClassName]; - - foreach ($class_names as $class_name) { - $reflection = new \ReflectionClass($class_name); - - $mockedMethodsThatDontExist = \array_filter( - $methods, - static function (string $method) use ($reflection) { - return !$reflection->hasMethod($method); - } - ); - - if ($mockedMethodsThatDontExist) { - $this->addWarning( - \sprintf( - 'createPartialMock called with method(s) %s that do not exist in %s. This will not be allowed in future versions of PHPUnit.', - \implode(', ', $mockedMethodsThatDontExist), - $class_name - ) - ); - } - } - - return $this->getMockBuilder($originalClassName) - ->disableOriginalConstructor() - ->disableOriginalClone() - ->disableArgumentCloning() - ->disallowMockingUnknownTypes() - ->setMethods(empty($methods) ? null : $methods) - ->getMock(); - } - - /** - * Returns a test proxy for the specified class. - * - * @psalm-template RealInstanceType of object - * @psalm-param class-string $originalClassName - * @psalm-return MockObject&RealInstanceType - */ - protected function createTestProxy(string $originalClassName, array $constructorArguments = []): MockObject - { - return $this->getMockBuilder($originalClassName) - ->setConstructorArgs($constructorArguments) - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Mocks the specified class and returns the name of the mocked class. - * - * @param string $originalClassName - * @param array $methods - * @param string $mockClassName - * @param bool $callOriginalConstructor - * @param bool $callOriginalClone - * @param bool $callAutoload - * @param bool $cloneArguments - * - * @psalm-template RealInstanceType of object - * @psalm-param class-string|string $originalClassName - * @psalm-return class-string - */ - protected function getMockClass($originalClassName, $methods = [], array $arguments = [], $mockClassName = '', $callOriginalConstructor = false, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false): string - { - $this->recordDoubledType($originalClassName); - - $mock = $this->getMockObjectGenerator()->getMock( - $originalClassName, - $methods, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $cloneArguments - ); - - return \get_class($mock); - } - - /** - * Returns a mock object for the specified abstract class with all abstract - * methods of the class mocked. Concrete methods are not mocked by default. - * To mock concrete methods, use the 7th parameter ($mockedMethods). - * - * @param string $originalClassName - * @param string $mockClassName - * @param bool $callOriginalConstructor - * @param bool $callOriginalClone - * @param bool $callAutoload - * @param array $mockedMethods - * @param bool $cloneArguments - * - * @psalm-template RealInstanceType of object - * @psalm-param class-string $originalClassName - * @psalm-return MockObject&RealInstanceType - */ - protected function getMockForAbstractClass($originalClassName, array $arguments = [], $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = [], $cloneArguments = false): MockObject - { - $this->recordDoubledType($originalClassName); - - $mockObject = $this->getMockObjectGenerator()->getMockForAbstractClass( - $originalClassName, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $mockedMethods, - $cloneArguments - ); - - $this->registerMockObject($mockObject); - - return $mockObject; - } - - /** - * Returns a mock object based on the given WSDL file. - * - * @param string $wsdlFile - * @param string $originalClassName - * @param string $mockClassName - * @param bool $callOriginalConstructor - * @param array $options An array of options passed to SOAPClient::_construct - * - * @psalm-template RealInstanceType of object - * @psalm-param class-string|string $originalClassName - * @psalm-return MockObject&RealInstanceType - */ - protected function getMockFromWsdl($wsdlFile, $originalClassName = '', $mockClassName = '', array $methods = [], $callOriginalConstructor = true, array $options = []): MockObject - { - $this->recordDoubledType('SoapClient'); - - if ($originalClassName === '') { - $fileName = \pathinfo(\basename(\parse_url($wsdlFile, \PHP_URL_PATH)), \PATHINFO_FILENAME); - $originalClassName = \preg_replace('/\W/', '', $fileName); - } - - if (!\class_exists($originalClassName)) { - eval( - $this->getMockObjectGenerator()->generateClassFromWsdl( - $wsdlFile, - $originalClassName, - $methods, - $options - ) - ); - } - - $mockObject = $this->getMockObjectGenerator()->getMock( - $originalClassName, - $methods, - ['', $options], - $mockClassName, - $callOriginalConstructor, - false, - false - ); - - $this->registerMockObject($mockObject); - - return $mockObject; - } - - /** - * Returns a mock object for the specified trait with all abstract methods - * of the trait mocked. Concrete methods to mock can be specified with the - * `$mockedMethods` parameter. - * - * @param string $traitName - * @param string $mockClassName - * @param bool $callOriginalConstructor - * @param bool $callOriginalClone - * @param bool $callAutoload - * @param array $mockedMethods - * @param bool $cloneArguments - */ - protected function getMockForTrait($traitName, array $arguments = [], $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = [], $cloneArguments = false): MockObject - { - $this->recordDoubledType($traitName); - - $mockObject = $this->getMockObjectGenerator()->getMockForTrait( - $traitName, - $arguments, - $mockClassName, - $callOriginalConstructor, - $callOriginalClone, - $callAutoload, - $mockedMethods, - $cloneArguments - ); - - $this->registerMockObject($mockObject); - - return $mockObject; - } - - /** - * Returns an object for the specified trait. - * - * @param string $traitName - * @param string $traitClassName - * @param bool $callOriginalConstructor - * @param bool $callOriginalClone - * @param bool $callAutoload - * - * @return object - */ - protected function getObjectForTrait($traitName, array $arguments = [], $traitClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true)/*: object*/ - { - $this->recordDoubledType($traitName); - - return $this->getMockObjectGenerator()->getObjectForTrait( - $traitName, - $traitClassName, - $callAutoload, - $callOriginalConstructor, - $arguments - ); - } - - /** - * @param null|string $classOrInterface - * - * @throws \Prophecy\Exception\Doubler\ClassNotFoundException - * @throws \Prophecy\Exception\Doubler\DoubleException - * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException - * - * @psalm-param class-string|null $classOrInterface - */ - protected function prophesize($classOrInterface = null): ObjectProphecy - { - if (\is_string($classOrInterface)) { - $this->recordDoubledType($classOrInterface); - } - - return $this->getProphet()->prophesize($classOrInterface); - } - - /** - * Creates a default TestResult object. - * - * @internal This method is not covered by the backward compatibility promise for PHPUnit - */ - protected function createResult(): TestResult - { - return new TestResult; - } - - /** - * Performs assertions shared by all tests of a test case. - * - * This method is called between setUp() and test. - */ - protected function assertPreConditions(): void - { - } - - /** - * Performs assertions shared by all tests of a test case. - * - * This method is called between test and tearDown(). - */ - protected function assertPostConditions(): void - { - } - - /** - * This method is called when a test method did not execute successfully. - * - * @throws \Throwable - */ - protected function onNotSuccessfulTest(\Throwable $t): void - { - throw $t; - } - - private function setExpectedExceptionFromAnnotation(): void - { - if ($this->name === null) { - return; - } - - try { - $expectedException = TestUtil::getExpectedException( - \get_class($this), - $this->name - ); - - if ($expectedException !== false) { - $this->addWarning('The @expectedException, @expectedExceptionCode, @expectedExceptionMessage, and @expectedExceptionMessageRegExp annotations are deprecated. They will be removed in PHPUnit 9. Refactor your test to use expectException(), expectExceptionCode(), expectExceptionMessage(), or expectExceptionMessageMatches() instead.'); - - $this->expectException($expectedException['class']); - - if ($expectedException['code'] !== null) { - $this->expectExceptionCode($expectedException['code']); - } - - if ($expectedException['message'] !== '') { - $this->expectExceptionMessage($expectedException['message']); - } elseif ($expectedException['message_regex'] !== '') { - $this->expectExceptionMessageMatches($expectedException['message_regex']); - } - } - } catch (UtilException $e) { - } - } - - /** - * @throws Warning - * @throws SkippedTestError - * @throws SyntheticSkippedError - */ - private function checkRequirements(): void - { - if (!$this->name || !\method_exists($this, $this->name)) { - return; - } - - $missingRequirements = TestUtil::getMissingRequirements( - \get_class($this), - $this->name - ); - - if (!empty($missingRequirements)) { - $this->markTestSkipped(\implode(\PHP_EOL, $missingRequirements)); - } - } - - /** - * @throws \Throwable - */ - private function verifyMockObjects(): void - { - foreach ($this->mockObjects as $mockObject) { - if ($mockObject->__phpunit_hasMatchers()) { - $this->numAssertions++; - } - - $mockObject->__phpunit_verify( - $this->shouldInvocationMockerBeReset($mockObject) - ); - } - - if ($this->prophet !== null) { - try { - $this->prophet->checkPredictions(); - } finally { - foreach ($this->prophet->getProphecies() as $objectProphecy) { - foreach ($objectProphecy->getMethodProphecies() as $methodProphecies) { - foreach ($methodProphecies as $methodProphecy) { - \assert($methodProphecy instanceof MethodProphecy); - - $this->numAssertions += \count($methodProphecy->getCheckedPredictions()); - } - } - } - } - } - } - - private function handleDependencies(): bool - { - if (!empty($this->dependencies) && !$this->inIsolation) { - $className = \get_class($this); - $passed = $this->result->passed(); - $passedKeys = \array_keys($passed); - - foreach ($passedKeys as $key => $value) { - $pos = \strpos($value, ' with data set'); - - if ($pos !== false) { - $passedKeys[$key] = \substr($value, 0, $pos); - } - } - - $passedKeys = \array_flip(\array_unique($passedKeys)); - - foreach ($this->dependencies as $dependency) { - $deepClone = false; - $shallowClone = false; - - if (empty($dependency)) { - $this->markSkippedForNotSpecifyingDependency(); - - return false; - } - - if (\strpos($dependency, 'clone ') === 0) { - $deepClone = true; - $dependency = \substr($dependency, \strlen('clone ')); - } elseif (\strpos($dependency, '!clone ') === 0) { - $deepClone = false; - $dependency = \substr($dependency, \strlen('!clone ')); - } - - if (\strpos($dependency, 'shallowClone ') === 0) { - $shallowClone = true; - $dependency = \substr($dependency, \strlen('shallowClone ')); - } elseif (\strpos($dependency, '!shallowClone ') === 0) { - $shallowClone = false; - $dependency = \substr($dependency, \strlen('!shallowClone ')); - } - - if (\strpos($dependency, '::') === false) { - $dependency = $className . '::' . $dependency; - } - - if (!isset($passedKeys[$dependency])) { - if (!$this->isCallableTestMethod($dependency)) { - $this->warnAboutDependencyThatDoesNotExist($dependency); - } else { - $this->markSkippedForMissingDependency($dependency); - } - - return false; - } - - if (isset($passed[$dependency])) { - if ($passed[$dependency]['size'] !== TestUtil::UNKNOWN && - $this->getSize() !== TestUtil::UNKNOWN && - $passed[$dependency]['size'] > $this->getSize()) { - $this->result->addError( - $this, - new SkippedTestError( - 'This test depends on a test that is larger than itself.' - ), - 0 - ); - - return false; - } - - if ($deepClone) { - $deepCopy = new DeepCopy; - $deepCopy->skipUncloneable(false); - - $this->dependencyInput[$dependency] = $deepCopy->copy($passed[$dependency]['result']); - } elseif ($shallowClone) { - $this->dependencyInput[$dependency] = clone $passed[$dependency]['result']; - } else { - $this->dependencyInput[$dependency] = $passed[$dependency]['result']; - } - } else { - $this->dependencyInput[$dependency] = null; - } - } - } - - return true; - } - - private function markSkippedForNotSpecifyingDependency(): void - { - $this->status = BaseTestRunner::STATUS_SKIPPED; - - $this->result->startTest($this); - - $this->result->addError( - $this, - new SkippedTestError( - \sprintf('This method has an invalid @depends annotation.') - ), - 0 - ); - - $this->result->endTest($this, 0); - } - - private function markSkippedForMissingDependency(string $dependency): void - { - $this->status = BaseTestRunner::STATUS_SKIPPED; - - $this->result->startTest($this); - - $this->result->addError( - $this, - new SkippedTestError( - \sprintf( - 'This test depends on "%s" to pass.', - $dependency - ) - ), - 0 - ); - - $this->result->endTest($this, 0); - } - - private function warnAboutDependencyThatDoesNotExist(string $dependency): void - { - $this->status = BaseTestRunner::STATUS_WARNING; - - $this->result->startTest($this); - - $this->result->addWarning( - $this, - new Warning( - \sprintf( - 'This test depends on "%s" which does not exist.', - $dependency - ) - ), - 0 - ); - - $this->result->endTest($this, 0); - } - - /** - * Get the mock object generator, creating it if it doesn't exist. - */ - private function getMockObjectGenerator(): MockGenerator - { - if ($this->mockObjectGenerator === null) { - $this->mockObjectGenerator = new MockGenerator; - } - - return $this->mockObjectGenerator; - } - - private function startOutputBuffering(): void - { - \ob_start(); - - $this->outputBufferingActive = true; - $this->outputBufferingLevel = \ob_get_level(); - } - - /** - * @throws RiskyTestError - */ - private function stopOutputBuffering(): void - { - if (\ob_get_level() !== $this->outputBufferingLevel) { - while (\ob_get_level() >= $this->outputBufferingLevel) { - \ob_end_clean(); - } - - throw new RiskyTestError( - 'Test code or tested code did not (only) close its own output buffers' - ); - } - - $this->output = \ob_get_contents(); - - if ($this->outputCallback !== false) { - $this->output = (string) \call_user_func($this->outputCallback, $this->output); - } - - \ob_end_clean(); - - $this->outputBufferingActive = false; - $this->outputBufferingLevel = \ob_get_level(); - } - - private function snapshotGlobalState(): void - { - if ($this->runTestInSeparateProcess || $this->inIsolation || - (!$this->backupGlobals && !$this->backupStaticAttributes)) { - return; - } - - $this->snapshot = $this->createGlobalStateSnapshot($this->backupGlobals === true); - } - - /** - * @throws RiskyTestError - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function restoreGlobalState(): void - { - if (!$this->snapshot instanceof Snapshot) { - return; - } - - if ($this->beStrictAboutChangesToGlobalState) { - try { - $this->compareGlobalStateSnapshots( - $this->snapshot, - $this->createGlobalStateSnapshot($this->backupGlobals === true) - ); - } catch (RiskyTestError $rte) { - // Intentionally left empty - } - } - - $restorer = new Restorer; - - if ($this->backupGlobals) { - $restorer->restoreGlobalVariables($this->snapshot); - } - - if ($this->backupStaticAttributes) { - $restorer->restoreStaticAttributes($this->snapshot); - } - - $this->snapshot = null; - - if (isset($rte)) { - throw $rte; - } - } - - private function createGlobalStateSnapshot(bool $backupGlobals): Snapshot - { - $blacklist = new Blacklist; - - foreach ($this->backupGlobalsBlacklist as $globalVariable) { - $blacklist->addGlobalVariable($globalVariable); - } - - if (!\defined('PHPUNIT_TESTSUITE')) { - $blacklist->addClassNamePrefix('PHPUnit'); - $blacklist->addClassNamePrefix('SebastianBergmann\CodeCoverage'); - $blacklist->addClassNamePrefix('SebastianBergmann\FileIterator'); - $blacklist->addClassNamePrefix('SebastianBergmann\Invoker'); - $blacklist->addClassNamePrefix('SebastianBergmann\Timer'); - $blacklist->addClassNamePrefix('PHP_Token'); - $blacklist->addClassNamePrefix('Symfony'); - $blacklist->addClassNamePrefix('Text_Template'); - $blacklist->addClassNamePrefix('Doctrine\Instantiator'); - $blacklist->addClassNamePrefix('Prophecy'); - - foreach ($this->backupStaticAttributesBlacklist as $class => $attributes) { - foreach ($attributes as $attribute) { - $blacklist->addStaticAttribute($class, $attribute); - } - } - } - - return new Snapshot( - $blacklist, - $backupGlobals, - (bool) $this->backupStaticAttributes, - false, - false, - false, - false, - false, - false, - false - ); - } - - /** - * @throws RiskyTestError - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function compareGlobalStateSnapshots(Snapshot $before, Snapshot $after): void - { - $backupGlobals = $this->backupGlobals === null || $this->backupGlobals; - - if ($backupGlobals) { - $this->compareGlobalStateSnapshotPart( - $before->globalVariables(), - $after->globalVariables(), - "--- Global variables before the test\n+++ Global variables after the test\n" - ); - - $this->compareGlobalStateSnapshotPart( - $before->superGlobalVariables(), - $after->superGlobalVariables(), - "--- Super-global variables before the test\n+++ Super-global variables after the test\n" - ); - } - - if ($this->backupStaticAttributes) { - $this->compareGlobalStateSnapshotPart( - $before->staticAttributes(), - $after->staticAttributes(), - "--- Static attributes before the test\n+++ Static attributes after the test\n" - ); - } - } - - /** - * @throws RiskyTestError - */ - private function compareGlobalStateSnapshotPart(array $before, array $after, string $header): void - { - if ($before != $after) { - $differ = new Differ($header); - $exporter = new Exporter; - - $diff = $differ->diff( - $exporter->export($before), - $exporter->export($after) - ); - - throw new RiskyTestError( - $diff - ); - } - } - - private function getProphet(): Prophet - { - if ($this->prophet === null) { - $this->prophet = new Prophet; - } - - return $this->prophet; - } - - /** - * @throws \SebastianBergmann\ObjectEnumerator\InvalidArgumentException - */ - private function shouldInvocationMockerBeReset(MockObject $mock): bool - { - $enumerator = new Enumerator; - - foreach ($enumerator->enumerate($this->dependencyInput) as $object) { - if ($mock === $object) { - return false; - } - } - - if (!\is_array($this->testResult) && !\is_object($this->testResult)) { - return true; - } - - return !\in_array($mock, $enumerator->enumerate($this->testResult), true); - } - - /** - * @throws \SebastianBergmann\ObjectEnumerator\InvalidArgumentException - * @throws \SebastianBergmann\ObjectReflector\InvalidArgumentException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function registerMockObjectsFromTestArguments(array $testArguments, array &$visited = []): void - { - if ($this->registerMockObjectsFromTestArgumentsRecursively) { - foreach ((new Enumerator)->enumerate($testArguments) as $object) { - if ($object instanceof MockObject) { - $this->registerMockObject($object); - } - } - } else { - foreach ($testArguments as $testArgument) { - if ($testArgument instanceof MockObject) { - if (Type::isCloneable($testArgument)) { - $testArgument = clone $testArgument; - } - - $this->registerMockObject($testArgument); - } elseif (\is_array($testArgument) && !\in_array($testArgument, $visited, true)) { - $visited[] = $testArgument; - - $this->registerMockObjectsFromTestArguments( - $testArgument, - $visited - ); - } - } - } - } - - private function setDoesNotPerformAssertionsFromAnnotation(): void - { - $annotations = $this->getAnnotations(); - - if (isset($annotations['method']['doesNotPerformAssertions'])) { - $this->doesNotPerformAssertions = true; - } - } - - private function unregisterCustomComparators(): void - { - $factory = ComparatorFactory::getInstance(); - - foreach ($this->customComparators as $comparator) { - $factory->unregister($comparator); - } - - $this->customComparators = []; - } - - private function cleanupIniSettings(): void - { - foreach ($this->iniSettings as $varName => $oldValue) { - \ini_set($varName, $oldValue); - } - - $this->iniSettings = []; - } - - private function cleanupLocaleSettings(): void - { - foreach ($this->locale as $category => $locale) { - \setlocale($category, $locale); - } - - $this->locale = []; - } - - /** - * @throws Exception - */ - private function checkExceptionExpectations(\Throwable $throwable): bool - { - $result = false; - - if ($this->expectedException !== null || $this->expectedExceptionCode !== null || $this->expectedExceptionMessage !== null || $this->expectedExceptionMessageRegExp !== null) { - $result = true; - } - - if ($throwable instanceof Exception) { - $result = false; - } - - if (\is_string($this->expectedException)) { - try { - $reflector = new \ReflectionClass($this->expectedException); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($this->expectedException === 'PHPUnit\Framework\Exception' || - $this->expectedException === '\PHPUnit\Framework\Exception' || - $reflector->isSubclassOf(Exception::class)) { - $result = true; - } - } - - return $result; - } - - private function runInSeparateProcess(): bool - { - return ($this->runTestInSeparateProcess || $this->runClassInSeparateProcess) && - !$this->inIsolation && !$this instanceof PhptTestCase; - } - - /** - * @param string|string[] $originalClassName - */ - private function recordDoubledType($originalClassName): void - { - if (\is_string($originalClassName)) { - $this->doubledTypes[] = $originalClassName; - } - - if (\is_array($originalClassName)) { - foreach ($originalClassName as $_originalClassName) { - if (\is_string($_originalClassName)) { - $this->doubledTypes[] = $_originalClassName; - } - } - } - } - - private function isCallableTestMethod(string $dependency): bool - { - [$className, $methodName] = \explode('::', $dependency); - - if (!\class_exists($className)) { - return false; - } - - try { - $class = new \ReflectionClass($className); - } catch (\ReflectionException $e) { - return false; - } - - if (!$class->isSubclassOf(__CLASS__)) { - return false; - } - - if (!$class->hasMethod($methodName)) { - return false; - } - - try { - $method = $class->getMethod($methodName); - } catch (\ReflectionException $e) { - return false; - } - - return TestUtil::isTestMethod($method); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestFailure.php b/vendor/phpunit/phpunit/src/Framework/TestFailure.php deleted file mode 100644 index 6fe25f5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestFailure.php +++ /dev/null @@ -1,154 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use PHPUnit\Framework\Error\Error; -use Throwable; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestFailure -{ - /** - * @var null|Test - */ - private $failedTest; - - /** - * @var Throwable - */ - private $thrownException; - - /** - * @var string - */ - private $testName; - - /** - * Returns a description for an exception. - */ - public static function exceptionToString(Throwable $e): string - { - if ($e instanceof SelfDescribing) { - $buffer = $e->toString(); - - if ($e instanceof ExpectationFailedException && $e->getComparisonFailure()) { - $buffer .= $e->getComparisonFailure()->getDiff(); - } - - if ($e instanceof PHPTAssertionFailedError) { - $buffer .= $e->getDiff(); - } - - if (!empty($buffer)) { - $buffer = \trim($buffer) . "\n"; - } - - return $buffer; - } - - if ($e instanceof Error) { - return $e->getMessage() . "\n"; - } - - if ($e instanceof ExceptionWrapper) { - return $e->getClassName() . ': ' . $e->getMessage() . "\n"; - } - - return \get_class($e) . ': ' . $e->getMessage() . "\n"; - } - - /** - * Constructs a TestFailure with the given test and exception. - * - * @param Throwable $t - */ - public function __construct(Test $failedTest, $t) - { - if ($failedTest instanceof SelfDescribing) { - $this->testName = $failedTest->toString(); - } else { - $this->testName = \get_class($failedTest); - } - - if (!$failedTest instanceof TestCase || !$failedTest->isInIsolation()) { - $this->failedTest = $failedTest; - } - - $this->thrownException = $t; - } - - /** - * Returns a short description of the failure. - */ - public function toString(): string - { - return \sprintf( - '%s: %s', - $this->testName, - $this->thrownException->getMessage() - ); - } - - /** - * Returns a description for the thrown exception. - */ - public function getExceptionAsString(): string - { - return self::exceptionToString($this->thrownException); - } - - /** - * Returns the name of the failing test (including data set, if any). - */ - public function getTestName(): string - { - return $this->testName; - } - - /** - * Returns the failing test. - * - * Note: The test object is not set when the test is executed in process - * isolation. - * - * @see Exception - */ - public function failedTest(): ?Test - { - return $this->failedTest; - } - - /** - * Gets the thrown exception. - */ - public function thrownException(): Throwable - { - return $this->thrownException; - } - - /** - * Returns the exception's message. - */ - public function exceptionMessage(): string - { - return $this->thrownException()->getMessage(); - } - - /** - * Returns true if the thrown exception - * is of type AssertionFailedError. - */ - public function isFailure(): bool - { - return $this->thrownException() instanceof AssertionFailedError; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestListener.php b/vendor/phpunit/phpunit/src/Framework/TestListener.php deleted file mode 100644 index 0390151..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestListener.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @deprecated Use the `TestHook` interfaces instead - */ -interface TestListener -{ - /** - * An error occurred. - * - * @deprecated Use `AfterTestErrorHook::executeAfterTestError` instead - */ - public function addError(Test $test, \Throwable $t, float $time): void; - - /** - * A warning occurred. - * - * @deprecated Use `AfterTestWarningHook::executeAfterTestWarning` instead - */ - public function addWarning(Test $test, Warning $e, float $time): void; - - /** - * A failure occurred. - * - * @deprecated Use `AfterTestFailureHook::executeAfterTestFailure` instead - */ - public function addFailure(Test $test, AssertionFailedError $e, float $time): void; - - /** - * Incomplete test. - * - * @deprecated Use `AfterIncompleteTestHook::executeAfterIncompleteTest` instead - */ - public function addIncompleteTest(Test $test, \Throwable $t, float $time): void; - - /** - * Risky test. - * - * @deprecated Use `AfterRiskyTestHook::executeAfterRiskyTest` instead - */ - public function addRiskyTest(Test $test, \Throwable $t, float $time): void; - - /** - * Skipped test. - * - * @deprecated Use `AfterSkippedTestHook::executeAfterSkippedTest` instead - */ - public function addSkippedTest(Test $test, \Throwable $t, float $time): void; - - /** - * A test suite started. - */ - public function startTestSuite(TestSuite $suite): void; - - /** - * A test suite ended. - */ - public function endTestSuite(TestSuite $suite): void; - - /** - * A test started. - * - * @deprecated Use `BeforeTestHook::executeBeforeTest` instead - */ - public function startTest(Test $test): void; - - /** - * A test ended. - * - * @deprecated Use `AfterTestHook::executeAfterTest` instead - */ - public function endTest(Test $test, float $time): void; -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php b/vendor/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php deleted file mode 100644 index 9c080af..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @deprecated The `TestListener` interface is deprecated - */ -trait TestListenerDefaultImplementation -{ - public function addError(Test $test, \Throwable $t, float $time): void - { - } - - public function addWarning(Test $test, Warning $e, float $time): void - { - } - - public function addFailure(Test $test, AssertionFailedError $e, float $time): void - { - } - - public function addIncompleteTest(Test $test, \Throwable $t, float $time): void - { - } - - public function addRiskyTest(Test $test, \Throwable $t, float $time): void - { - } - - public function addSkippedTest(Test $test, \Throwable $t, float $time): void - { - } - - public function startTestSuite(TestSuite $suite): void - { - } - - public function endTestSuite(TestSuite $suite): void - { - } - - public function startTest(Test $test): void - { - } - - public function endTest(Test $test, float $time): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestResult.php b/vendor/phpunit/phpunit/src/Framework/TestResult.php deleted file mode 100644 index 2aea26a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestResult.php +++ /dev/null @@ -1,1220 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use AssertionError; -use Countable; -use Error; -use PHPUnit\Framework\MockObject\Exception as MockObjectException; -use PHPUnit\Util\Blacklist; -use PHPUnit\Util\ErrorHandler; -use PHPUnit\Util\Printer; -use PHPUnit\Util\Test as TestUtil; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException as OriginalCoveredCodeNotExecutedException; -use SebastianBergmann\CodeCoverage\Exception as OriginalCodeCoverageException; -use SebastianBergmann\CodeCoverage\MissingCoversAnnotationException as OriginalMissingCoversAnnotationException; -use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException; -use SebastianBergmann\Invoker\Invoker; -use SebastianBergmann\Invoker\TimeoutException; -use SebastianBergmann\ResourceOperations\ResourceOperations; -use SebastianBergmann\Timer\Timer; -use Throwable; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestResult implements Countable -{ - /** - * @var array - */ - private $passed = []; - - /** - * @var TestFailure[] - */ - private $errors = []; - - /** - * @var TestFailure[] - */ - private $failures = []; - - /** - * @var TestFailure[] - */ - private $warnings = []; - - /** - * @var TestFailure[] - */ - private $notImplemented = []; - - /** - * @var TestFailure[] - */ - private $risky = []; - - /** - * @var TestFailure[] - */ - private $skipped = []; - - /** - * @deprecated Use the `TestHook` interfaces instead - * - * @var TestListener[] - */ - private $listeners = []; - - /** - * @var int - */ - private $runTests = 0; - - /** - * @var float - */ - private $time = 0; - - /** - * @var TestSuite - */ - private $topTestSuite; - - /** - * Code Coverage information. - * - * @var CodeCoverage - */ - private $codeCoverage; - - /** - * @var bool - */ - private $convertDeprecationsToExceptions = true; - - /** - * @var bool - */ - private $convertErrorsToExceptions = true; - - /** - * @var bool - */ - private $convertNoticesToExceptions = true; - - /** - * @var bool - */ - private $convertWarningsToExceptions = true; - - /** - * @var bool - */ - private $stop = false; - - /** - * @var bool - */ - private $stopOnError = false; - - /** - * @var bool - */ - private $stopOnFailure = false; - - /** - * @var bool - */ - private $stopOnWarning = false; - - /** - * @var bool - */ - private $beStrictAboutTestsThatDoNotTestAnything = true; - - /** - * @var bool - */ - private $beStrictAboutOutputDuringTests = false; - - /** - * @var bool - */ - private $beStrictAboutTodoAnnotatedTests = false; - - /** - * @var bool - */ - private $beStrictAboutResourceUsageDuringSmallTests = false; - - /** - * @var bool - */ - private $enforceTimeLimit = false; - - /** - * @var int - */ - private $timeoutForSmallTests = 1; - - /** - * @var int - */ - private $timeoutForMediumTests = 10; - - /** - * @var int - */ - private $timeoutForLargeTests = 60; - - /** - * @var bool - */ - private $stopOnRisky = false; - - /** - * @var bool - */ - private $stopOnIncomplete = false; - - /** - * @var bool - */ - private $stopOnSkipped = false; - - /** - * @var bool - */ - private $lastTestFailed = false; - - /** - * @var int - */ - private $defaultTimeLimit = 0; - - /** - * @var bool - */ - private $stopOnDefect = false; - - /** - * @var bool - */ - private $registerMockObjectsFromTestArgumentsRecursively = false; - - /** - * @deprecated Use the `TestHook` interfaces instead - * - * @codeCoverageIgnore - * - * Registers a TestListener. - */ - public function addListener(TestListener $listener): void - { - $this->listeners[] = $listener; - } - - /** - * @deprecated Use the `TestHook` interfaces instead - * - * @codeCoverageIgnore - * - * Unregisters a TestListener. - */ - public function removeListener(TestListener $listener): void - { - foreach ($this->listeners as $key => $_listener) { - if ($listener === $_listener) { - unset($this->listeners[$key]); - } - } - } - - /** - * @deprecated Use the `TestHook` interfaces instead - * - * @codeCoverageIgnore - * - * Flushes all flushable TestListeners. - */ - public function flushListeners(): void - { - foreach ($this->listeners as $listener) { - if ($listener instanceof Printer) { - $listener->flush(); - } - } - } - - /** - * Adds an error to the list of errors. - */ - public function addError(Test $test, Throwable $t, float $time): void - { - if ($t instanceof RiskyTestError) { - $this->risky[] = new TestFailure($test, $t); - $notifyMethod = 'addRiskyTest'; - - if ($test instanceof TestCase) { - $test->markAsRisky(); - } - - if ($this->stopOnRisky || $this->stopOnDefect) { - $this->stop(); - } - } elseif ($t instanceof IncompleteTest) { - $this->notImplemented[] = new TestFailure($test, $t); - $notifyMethod = 'addIncompleteTest'; - - if ($this->stopOnIncomplete) { - $this->stop(); - } - } elseif ($t instanceof SkippedTest) { - $this->skipped[] = new TestFailure($test, $t); - $notifyMethod = 'addSkippedTest'; - - if ($this->stopOnSkipped) { - $this->stop(); - } - } else { - $this->errors[] = new TestFailure($test, $t); - $notifyMethod = 'addError'; - - if ($this->stopOnError || $this->stopOnFailure) { - $this->stop(); - } - } - - // @see https://github.com/sebastianbergmann/phpunit/issues/1953 - if ($t instanceof Error) { - $t = new ExceptionWrapper($t); - } - - foreach ($this->listeners as $listener) { - $listener->$notifyMethod($test, $t, $time); - } - - $this->lastTestFailed = true; - $this->time += $time; - } - - /** - * Adds a warning to the list of warnings. - * The passed in exception caused the warning. - */ - public function addWarning(Test $test, Warning $e, float $time): void - { - if ($this->stopOnWarning || $this->stopOnDefect) { - $this->stop(); - } - - $this->warnings[] = new TestFailure($test, $e); - - foreach ($this->listeners as $listener) { - $listener->addWarning($test, $e, $time); - } - - $this->time += $time; - } - - /** - * Adds a failure to the list of failures. - * The passed in exception caused the failure. - */ - public function addFailure(Test $test, AssertionFailedError $e, float $time): void - { - if ($e instanceof RiskyTestError || $e instanceof OutputError) { - $this->risky[] = new TestFailure($test, $e); - $notifyMethod = 'addRiskyTest'; - - if ($test instanceof TestCase) { - $test->markAsRisky(); - } - - if ($this->stopOnRisky || $this->stopOnDefect) { - $this->stop(); - } - } elseif ($e instanceof IncompleteTest) { - $this->notImplemented[] = new TestFailure($test, $e); - $notifyMethod = 'addIncompleteTest'; - - if ($this->stopOnIncomplete) { - $this->stop(); - } - } elseif ($e instanceof SkippedTest) { - $this->skipped[] = new TestFailure($test, $e); - $notifyMethod = 'addSkippedTest'; - - if ($this->stopOnSkipped) { - $this->stop(); - } - } else { - $this->failures[] = new TestFailure($test, $e); - $notifyMethod = 'addFailure'; - - if ($this->stopOnFailure || $this->stopOnDefect) { - $this->stop(); - } - } - - foreach ($this->listeners as $listener) { - $listener->$notifyMethod($test, $e, $time); - } - - $this->lastTestFailed = true; - $this->time += $time; - } - - /** - * Informs the result that a test suite will be started. - */ - public function startTestSuite(TestSuite $suite): void - { - if ($this->topTestSuite === null) { - $this->topTestSuite = $suite; - } - - foreach ($this->listeners as $listener) { - $listener->startTestSuite($suite); - } - } - - /** - * Informs the result that a test suite was completed. - */ - public function endTestSuite(TestSuite $suite): void - { - foreach ($this->listeners as $listener) { - $listener->endTestSuite($suite); - } - } - - /** - * Informs the result that a test will be started. - */ - public function startTest(Test $test): void - { - $this->lastTestFailed = false; - $this->runTests += \count($test); - - foreach ($this->listeners as $listener) { - $listener->startTest($test); - } - } - - /** - * Informs the result that a test was completed. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function endTest(Test $test, float $time): void - { - foreach ($this->listeners as $listener) { - $listener->endTest($test, $time); - } - - if (!$this->lastTestFailed && $test instanceof TestCase) { - $class = \get_class($test); - $key = $class . '::' . $test->getName(); - - $this->passed[$key] = [ - 'result' => $test->getResult(), - 'size' => \PHPUnit\Util\Test::getSize( - $class, - $test->getName(false) - ), - ]; - - $this->time += $time; - } - } - - /** - * Returns true if no risky test occurred. - */ - public function allHarmless(): bool - { - return $this->riskyCount() == 0; - } - - /** - * Gets the number of risky tests. - */ - public function riskyCount(): int - { - return \count($this->risky); - } - - /** - * Returns true if no incomplete test occurred. - */ - public function allCompletelyImplemented(): bool - { - return $this->notImplementedCount() == 0; - } - - /** - * Gets the number of incomplete tests. - */ - public function notImplementedCount(): int - { - return \count($this->notImplemented); - } - - /** - * Returns an array of TestFailure objects for the risky tests - * - * @return TestFailure[] - */ - public function risky(): array - { - return $this->risky; - } - - /** - * Returns an array of TestFailure objects for the incomplete tests - * - * @return TestFailure[] - */ - public function notImplemented(): array - { - return $this->notImplemented; - } - - /** - * Returns true if no test has been skipped. - */ - public function noneSkipped(): bool - { - return $this->skippedCount() == 0; - } - - /** - * Gets the number of skipped tests. - */ - public function skippedCount(): int - { - return \count($this->skipped); - } - - /** - * Returns an array of TestFailure objects for the skipped tests - * - * @return TestFailure[] - */ - public function skipped(): array - { - return $this->skipped; - } - - /** - * Gets the number of detected errors. - */ - public function errorCount(): int - { - return \count($this->errors); - } - - /** - * Returns an array of TestFailure objects for the errors - * - * @return TestFailure[] - */ - public function errors(): array - { - return $this->errors; - } - - /** - * Gets the number of detected failures. - */ - public function failureCount(): int - { - return \count($this->failures); - } - - /** - * Returns an array of TestFailure objects for the failures - * - * @return TestFailure[] - */ - public function failures(): array - { - return $this->failures; - } - - /** - * Gets the number of detected warnings. - */ - public function warningCount(): int - { - return \count($this->warnings); - } - - /** - * Returns an array of TestFailure objects for the warnings - * - * @return TestFailure[] - */ - public function warnings(): array - { - return $this->warnings; - } - - /** - * Returns the names of the tests that have passed. - */ - public function passed(): array - { - return $this->passed; - } - - /** - * Returns the (top) test suite. - */ - public function topTestSuite(): TestSuite - { - return $this->topTestSuite; - } - - /** - * Returns whether code coverage information should be collected. - */ - public function getCollectCodeCoverageInformation(): bool - { - return $this->codeCoverage !== null; - } - - /** - * Runs a TestCase. - * - * @throws CodeCoverageException - * @throws OriginalCoveredCodeNotExecutedException - * @throws OriginalMissingCoversAnnotationException - * @throws UnintentionallyCoveredCodeException - * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException - * @throws \SebastianBergmann\CodeCoverage\RuntimeException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function run(Test $test): void - { - Assert::resetCount(); - - if ($test instanceof TestCase) { - $test->setRegisterMockObjectsFromTestArgumentsRecursively( - $this->registerMockObjectsFromTestArgumentsRecursively - ); - - $isAnyCoverageRequired = TestUtil::requiresCodeCoverageDataCollection($test); - } - - $error = false; - $failure = false; - $warning = false; - $incomplete = false; - $risky = false; - $skipped = false; - - $this->startTest($test); - - if ($this->convertDeprecationsToExceptions || $this->convertErrorsToExceptions || $this->convertNoticesToExceptions || $this->convertWarningsToExceptions) { - $errorHandler = new ErrorHandler( - $this->convertDeprecationsToExceptions, - $this->convertErrorsToExceptions, - $this->convertNoticesToExceptions, - $this->convertWarningsToExceptions - ); - - $errorHandler->register(); - } - - $collectCodeCoverage = $this->codeCoverage !== null && - !$test instanceof WarningTestCase && - $isAnyCoverageRequired; - - if ($collectCodeCoverage) { - $this->codeCoverage->start($test); - } - - $monitorFunctions = $this->beStrictAboutResourceUsageDuringSmallTests && - !$test instanceof WarningTestCase && - $test->getSize() == \PHPUnit\Util\Test::SMALL && - \function_exists('xdebug_start_function_monitor'); - - if ($monitorFunctions) { - /* @noinspection ForgottenDebugOutputInspection */ - \xdebug_start_function_monitor(ResourceOperations::getFunctions()); - } - - Timer::start(); - - try { - if (!$test instanceof WarningTestCase && - $this->enforceTimeLimit && - ($this->defaultTimeLimit || $test->getSize() != \PHPUnit\Util\Test::UNKNOWN) && - \extension_loaded('pcntl') && \class_exists(Invoker::class)) { - switch ($test->getSize()) { - case \PHPUnit\Util\Test::SMALL: - $_timeout = $this->timeoutForSmallTests; - - break; - - case \PHPUnit\Util\Test::MEDIUM: - $_timeout = $this->timeoutForMediumTests; - - break; - - case \PHPUnit\Util\Test::LARGE: - $_timeout = $this->timeoutForLargeTests; - - break; - - case \PHPUnit\Util\Test::UNKNOWN: - $_timeout = $this->defaultTimeLimit; - - break; - } - - $invoker = new Invoker; - $invoker->invoke([$test, 'runBare'], [], $_timeout); - } else { - $test->runBare(); - } - } catch (TimeoutException $e) { - $this->addFailure( - $test, - new RiskyTestError( - $e->getMessage() - ), - $_timeout - ); - - $risky = true; - } catch (MockObjectException $e) { - $e = new Warning( - $e->getMessage() - ); - - $warning = true; - } catch (AssertionFailedError $e) { - $failure = true; - - if ($e instanceof RiskyTestError) { - $risky = true; - } elseif ($e instanceof IncompleteTestError) { - $incomplete = true; - } elseif ($e instanceof SkippedTestError) { - $skipped = true; - } - } catch (AssertionError $e) { - $test->addToAssertionCount(1); - - $failure = true; - $frame = $e->getTrace()[0]; - - $e = new AssertionFailedError( - \sprintf( - '%s in %s:%s', - $e->getMessage(), - $frame['file'], - $frame['line'] - ) - ); - } catch (Warning $e) { - $warning = true; - } catch (Exception $e) { - $error = true; - } catch (Throwable $e) { - $e = new ExceptionWrapper($e); - $error = true; - } - - $time = Timer::stop(); - $test->addToAssertionCount(Assert::getCount()); - - if ($monitorFunctions) { - $blacklist = new Blacklist; - - /** @noinspection ForgottenDebugOutputInspection */ - $functions = \xdebug_get_monitored_functions(); - - /* @noinspection ForgottenDebugOutputInspection */ - \xdebug_stop_function_monitor(); - - foreach ($functions as $function) { - if (!$blacklist->isBlacklisted($function['filename'])) { - $this->addFailure( - $test, - new RiskyTestError( - \sprintf( - '%s() used in %s:%s', - $function['function'], - $function['filename'], - $function['lineno'] - ) - ), - $time - ); - } - } - } - - if ($this->beStrictAboutTestsThatDoNotTestAnything && - $test->getNumAssertions() == 0) { - $risky = true; - } - - if ($collectCodeCoverage) { - $append = !$risky && !$incomplete && !$skipped; - $linesToBeCovered = []; - $linesToBeUsed = []; - - if ($append && $test instanceof TestCase) { - try { - $linesToBeCovered = \PHPUnit\Util\Test::getLinesToBeCovered( - \get_class($test), - $test->getName(false) - ); - - $linesToBeUsed = \PHPUnit\Util\Test::getLinesToBeUsed( - \get_class($test), - $test->getName(false) - ); - } catch (InvalidCoversTargetException $cce) { - $this->addWarning( - $test, - new Warning( - $cce->getMessage() - ), - $time - ); - } - } - - try { - $this->codeCoverage->stop( - $append, - $linesToBeCovered, - $linesToBeUsed - ); - } catch (UnintentionallyCoveredCodeException $cce) { - $this->addFailure( - $test, - new UnintentionallyCoveredCodeError( - 'This test executed code that is not listed as code to be covered or used:' . - \PHP_EOL . $cce->getMessage() - ), - $time - ); - } catch (OriginalCoveredCodeNotExecutedException $cce) { - $this->addFailure( - $test, - new CoveredCodeNotExecutedException( - 'This test did not execute all the code that is listed as code to be covered:' . - \PHP_EOL . $cce->getMessage() - ), - $time - ); - } catch (OriginalMissingCoversAnnotationException $cce) { - if ($linesToBeCovered !== false) { - $this->addFailure( - $test, - new MissingCoversAnnotationException( - 'This test does not have a @covers annotation but is expected to have one' - ), - $time - ); - } - } catch (OriginalCodeCoverageException $cce) { - $error = true; - - $e = $e ?? $cce; - } - } - - if (isset($errorHandler)) { - $errorHandler->unregister(); - - unset($errorHandler); - } - - if ($error) { - $this->addError($test, $e, $time); - } elseif ($failure) { - $this->addFailure($test, $e, $time); - } elseif ($warning) { - $this->addWarning($test, $e, $time); - } elseif ($this->beStrictAboutTestsThatDoNotTestAnything && - !$test->doesNotPerformAssertions() && - $test->getNumAssertions() == 0) { - try { - $reflected = new \ReflectionClass($test); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $name = $test->getName(false); - - if ($name && $reflected->hasMethod($name)) { - try { - $reflected = $reflected->getMethod($name); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - $this->addFailure( - $test, - new RiskyTestError( - \sprintf( - "This test did not perform any assertions\n\n%s:%d", - $reflected->getFileName(), - $reflected->getStartLine() - ) - ), - $time - ); - } elseif ($this->beStrictAboutTestsThatDoNotTestAnything && - $test->doesNotPerformAssertions() && - $test->getNumAssertions() > 0) { - $this->addFailure( - $test, - new RiskyTestError( - \sprintf( - 'This test is annotated with "@doesNotPerformAssertions" but performed %d assertions', - $test->getNumAssertions() - ) - ), - $time - ); - } elseif ($this->beStrictAboutOutputDuringTests && $test->hasOutput()) { - $this->addFailure( - $test, - new OutputError( - \sprintf( - 'This test printed output: %s', - $test->getActualOutput() - ) - ), - $time - ); - } elseif ($this->beStrictAboutTodoAnnotatedTests && $test instanceof TestCase) { - $annotations = $test->getAnnotations(); - - if (isset($annotations['method']['todo'])) { - $this->addFailure( - $test, - new RiskyTestError( - 'Test method is annotated with @todo' - ), - $time - ); - } - } - - $this->endTest($test, $time); - } - - /** - * Gets the number of run tests. - */ - public function count(): int - { - return $this->runTests; - } - - /** - * Checks whether the test run should stop. - */ - public function shouldStop(): bool - { - return $this->stop; - } - - /** - * Marks that the test run should stop. - */ - public function stop(): void - { - $this->stop = true; - } - - /** - * Returns the code coverage object. - */ - public function getCodeCoverage(): ?CodeCoverage - { - return $this->codeCoverage; - } - - /** - * Sets the code coverage object. - */ - public function setCodeCoverage(CodeCoverage $codeCoverage): void - { - $this->codeCoverage = $codeCoverage; - } - - /** - * Enables or disables the deprecation-to-exception conversion. - */ - public function convertDeprecationsToExceptions(bool $flag): void - { - $this->convertDeprecationsToExceptions = $flag; - } - - /** - * Returns the deprecation-to-exception conversion setting. - */ - public function getConvertDeprecationsToExceptions(): bool - { - return $this->convertDeprecationsToExceptions; - } - - /** - * Enables or disables the error-to-exception conversion. - */ - public function convertErrorsToExceptions(bool $flag): void - { - $this->convertErrorsToExceptions = $flag; - } - - /** - * Returns the error-to-exception conversion setting. - */ - public function getConvertErrorsToExceptions(): bool - { - return $this->convertErrorsToExceptions; - } - - /** - * Enables or disables the notice-to-exception conversion. - */ - public function convertNoticesToExceptions(bool $flag): void - { - $this->convertNoticesToExceptions = $flag; - } - - /** - * Returns the notice-to-exception conversion setting. - */ - public function getConvertNoticesToExceptions(): bool - { - return $this->convertNoticesToExceptions; - } - - /** - * Enables or disables the warning-to-exception conversion. - */ - public function convertWarningsToExceptions(bool $flag): void - { - $this->convertWarningsToExceptions = $flag; - } - - /** - * Returns the warning-to-exception conversion setting. - */ - public function getConvertWarningsToExceptions(): bool - { - return $this->convertWarningsToExceptions; - } - - /** - * Enables or disables the stopping when an error occurs. - */ - public function stopOnError(bool $flag): void - { - $this->stopOnError = $flag; - } - - /** - * Enables or disables the stopping when a failure occurs. - */ - public function stopOnFailure(bool $flag): void - { - $this->stopOnFailure = $flag; - } - - /** - * Enables or disables the stopping when a warning occurs. - */ - public function stopOnWarning(bool $flag): void - { - $this->stopOnWarning = $flag; - } - - public function beStrictAboutTestsThatDoNotTestAnything(bool $flag): void - { - $this->beStrictAboutTestsThatDoNotTestAnything = $flag; - } - - public function isStrictAboutTestsThatDoNotTestAnything(): bool - { - return $this->beStrictAboutTestsThatDoNotTestAnything; - } - - public function beStrictAboutOutputDuringTests(bool $flag): void - { - $this->beStrictAboutOutputDuringTests = $flag; - } - - public function isStrictAboutOutputDuringTests(): bool - { - return $this->beStrictAboutOutputDuringTests; - } - - public function beStrictAboutResourceUsageDuringSmallTests(bool $flag): void - { - $this->beStrictAboutResourceUsageDuringSmallTests = $flag; - } - - public function isStrictAboutResourceUsageDuringSmallTests(): bool - { - return $this->beStrictAboutResourceUsageDuringSmallTests; - } - - public function enforceTimeLimit(bool $flag): void - { - $this->enforceTimeLimit = $flag; - } - - public function enforcesTimeLimit(): bool - { - return $this->enforceTimeLimit; - } - - public function beStrictAboutTodoAnnotatedTests(bool $flag): void - { - $this->beStrictAboutTodoAnnotatedTests = $flag; - } - - public function isStrictAboutTodoAnnotatedTests(): bool - { - return $this->beStrictAboutTodoAnnotatedTests; - } - - /** - * Enables or disables the stopping for risky tests. - */ - public function stopOnRisky(bool $flag): void - { - $this->stopOnRisky = $flag; - } - - /** - * Enables or disables the stopping for incomplete tests. - */ - public function stopOnIncomplete(bool $flag): void - { - $this->stopOnIncomplete = $flag; - } - - /** - * Enables or disables the stopping for skipped tests. - */ - public function stopOnSkipped(bool $flag): void - { - $this->stopOnSkipped = $flag; - } - - /** - * Enables or disables the stopping for defects: error, failure, warning - */ - public function stopOnDefect(bool $flag): void - { - $this->stopOnDefect = $flag; - } - - /** - * Returns the time spent running the tests. - */ - public function time(): float - { - return $this->time; - } - - /** - * Returns whether the entire test was successful or not. - */ - public function wasSuccessful(): bool - { - return $this->wasSuccessfulIgnoringWarnings() && empty($this->warnings); - } - - public function wasSuccessfulIgnoringWarnings(): bool - { - return empty($this->errors) && empty($this->failures); - } - - public function wasSuccessfulAndNoTestIsRiskyOrSkippedOrIncomplete(): bool - { - return $this->wasSuccessful() && $this->allHarmless() && $this->allCompletelyImplemented() && $this->noneSkipped(); - } - - /** - * Sets the default timeout for tests - */ - public function setDefaultTimeLimit(int $timeout): void - { - $this->defaultTimeLimit = $timeout; - } - - /** - * Sets the timeout for small tests. - */ - public function setTimeoutForSmallTests(int $timeout): void - { - $this->timeoutForSmallTests = $timeout; - } - - /** - * Sets the timeout for medium tests. - */ - public function setTimeoutForMediumTests(int $timeout): void - { - $this->timeoutForMediumTests = $timeout; - } - - /** - * Sets the timeout for large tests. - */ - public function setTimeoutForLargeTests(int $timeout): void - { - $this->timeoutForLargeTests = $timeout; - } - - /** - * Returns the set timeout for large tests. - */ - public function getTimeoutForLargeTests(): int - { - return $this->timeoutForLargeTests; - } - - public function setRegisterMockObjectsFromTestArgumentsRecursively(bool $flag): void - { - $this->registerMockObjectsFromTestArgumentsRecursively = $flag; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestSuite.php b/vendor/phpunit/phpunit/src/Framework/TestSuite.php deleted file mode 100644 index fb0c4e5..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestSuite.php +++ /dev/null @@ -1,780 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -use PHPUnit\Runner\BaseTestRunner; -use PHPUnit\Runner\Filter\Factory; -use PHPUnit\Runner\PhptTestCase; -use PHPUnit\Util\FileLoader; -use PHPUnit\Util\Test as TestUtil; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class TestSuite implements \IteratorAggregate, SelfDescribing, Test -{ - /** - * Enable or disable the backup and restoration of the $GLOBALS array. - * - * @var bool - */ - protected $backupGlobals; - - /** - * Enable or disable the backup and restoration of static attributes. - * - * @var bool - */ - protected $backupStaticAttributes; - - /** - * @var bool - */ - protected $runTestInSeparateProcess = false; - - /** - * The name of the test suite. - * - * @var string - */ - protected $name = ''; - - /** - * The test groups of the test suite. - * - * @var array - */ - protected $groups = []; - - /** - * The tests in the test suite. - * - * @var Test[] - */ - protected $tests = []; - - /** - * The number of tests in the test suite. - * - * @var int - */ - protected $numTests = -1; - - /** - * @var bool - */ - protected $testCase = false; - - /** - * @var string[] - */ - protected $foundClasses = []; - - /** - * Last count of tests in this suite. - * - * @var null|int - */ - private $cachedNumTests; - - /** - * @var bool - */ - private $beStrictAboutChangesToGlobalState; - - /** - * @var Factory - */ - private $iteratorFilter; - - /** - * @var string[] - */ - private $declaredClasses; - - /** - * Constructs a new TestSuite: - * - * - PHPUnit\Framework\TestSuite() constructs an empty TestSuite. - * - * - PHPUnit\Framework\TestSuite(ReflectionClass) constructs a - * TestSuite from the given class. - * - * - PHPUnit\Framework\TestSuite(ReflectionClass, String) - * constructs a TestSuite from the given class with the given - * name. - * - * - PHPUnit\Framework\TestSuite(String) either constructs a - * TestSuite from the given class (if the passed string is the - * name of an existing class) or constructs an empty TestSuite - * with the given name. - * - * @param \ReflectionClass|string $theClass - * - * @throws Exception - */ - public function __construct($theClass = '', string $name = '') - { - if (!\is_string($theClass) && !$theClass instanceof \ReflectionClass) { - throw InvalidArgumentException::create( - 1, - 'ReflectionClass object or string' - ); - } - - $this->declaredClasses = \get_declared_classes(); - - if (!$theClass instanceof \ReflectionClass) { - if (\class_exists($theClass, true)) { - if ($name === '') { - $name = $theClass; - } - - try { - $theClass = new \ReflectionClass($theClass); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } else { - $this->setName($theClass); - - return; - } - } - - if (!$theClass->isSubclassOf(TestCase::class)) { - $this->setName((string) $theClass); - - return; - } - - if ($name !== '') { - $this->setName($name); - } else { - $this->setName($theClass->getName()); - } - - $constructor = $theClass->getConstructor(); - - if ($constructor !== null && - !$constructor->isPublic()) { - $this->addTest( - new WarningTestCase( - \sprintf( - 'Class "%s" has no public constructor.', - $theClass->getName() - ) - ) - ); - - return; - } - - foreach ($theClass->getMethods() as $method) { - if ($method->getDeclaringClass()->getName() === Assert::class) { - continue; - } - - if ($method->getDeclaringClass()->getName() === TestCase::class) { - continue; - } - - $this->addTestMethod($theClass, $method); - } - - if (empty($this->tests)) { - $this->addTest( - new WarningTestCase( - \sprintf( - 'No tests found in class "%s".', - $theClass->getName() - ) - ) - ); - } - - $this->testCase = true; - } - - /** - * Returns a string representation of the test suite. - */ - public function toString(): string - { - return $this->getName(); - } - - /** - * Adds a test to the suite. - * - * @param array $groups - */ - public function addTest(Test $test, $groups = []): void - { - try { - $class = new \ReflectionClass($test); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if (!$class->isAbstract()) { - $this->tests[] = $test; - $this->numTests = -1; - - if ($test instanceof self && empty($groups)) { - $groups = $test->getGroups(); - } - - if (empty($groups)) { - $groups = ['default']; - } - - foreach ($groups as $group) { - if (!isset($this->groups[$group])) { - $this->groups[$group] = [$test]; - } else { - $this->groups[$group][] = $test; - } - } - - if ($test instanceof TestCase) { - $test->setGroups($groups); - } - } - } - - /** - * Adds the tests from the given class to the suite. - * - * @param object|string $testClass - * - * @throws Exception - */ - public function addTestSuite($testClass): void - { - if (!(\is_object($testClass) || (\is_string($testClass) && \class_exists($testClass)))) { - throw InvalidArgumentException::create( - 1, - 'class name or object' - ); - } - - if (!\is_object($testClass)) { - try { - $testClass = new \ReflectionClass($testClass); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - if ($testClass instanceof self) { - $this->addTest($testClass); - } elseif ($testClass instanceof \ReflectionClass) { - $suiteMethod = false; - - if (!$testClass->isAbstract() && $testClass->hasMethod(BaseTestRunner::SUITE_METHODNAME)) { - try { - $method = $testClass->getMethod( - BaseTestRunner::SUITE_METHODNAME - ); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($method->isStatic()) { - $this->addTest( - $method->invoke(null, $testClass->getName()) - ); - - $suiteMethod = true; - } - } - - if (!$suiteMethod && !$testClass->isAbstract() && $testClass->isSubclassOf(TestCase::class)) { - $this->addTest(new self($testClass)); - } - } else { - throw new Exception; - } - } - - /** - * Wraps both addTest() and addTestSuite - * as well as the separate import statements for the user's convenience. - * - * If the named file cannot be read or there are no new tests that can be - * added, a PHPUnit\Framework\WarningTestCase will be created instead, - * leaving the current test run untouched. - * - * @throws Exception - */ - public function addTestFile(string $filename): void - { - if (\file_exists($filename) && \substr($filename, -5) === '.phpt') { - $this->addTest( - new PhptTestCase($filename) - ); - - return; - } - - // The given file may contain further stub classes in addition to the - // test class itself. Figure out the actual test class. - $filename = FileLoader::checkAndLoad($filename); - $newClasses = \array_diff(\get_declared_classes(), $this->declaredClasses); - - // The diff is empty in case a parent class (with test methods) is added - // AFTER a child class that inherited from it. To account for that case, - // accumulate all discovered classes, so the parent class may be found in - // a later invocation. - if (!empty($newClasses)) { - // On the assumption that test classes are defined first in files, - // process discovered classes in approximate LIFO order, so as to - // avoid unnecessary reflection. - $this->foundClasses = \array_merge($newClasses, $this->foundClasses); - $this->declaredClasses = \get_declared_classes(); - } - - // The test class's name must match the filename, either in full, or as - // a PEAR/PSR-0 prefixed short name ('NameSpace_ShortName'), or as a - // PSR-1 local short name ('NameSpace\ShortName'). The comparison must be - // anchored to prevent false-positive matches (e.g., 'OtherShortName'). - $shortName = \basename($filename, '.php'); - $shortNameRegEx = '/(?:^|_|\\\\)' . \preg_quote($shortName, '/') . '$/'; - - foreach ($this->foundClasses as $i => $className) { - if (\preg_match($shortNameRegEx, $className)) { - try { - $class = new \ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($class->getFileName() == $filename) { - $newClasses = [$className]; - unset($this->foundClasses[$i]); - - break; - } - } - } - - foreach ($newClasses as $className) { - try { - $class = new \ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if (\dirname($class->getFileName()) === __DIR__) { - continue; - } - - if (!$class->isAbstract()) { - if ($class->hasMethod(BaseTestRunner::SUITE_METHODNAME)) { - try { - $method = $class->getMethod( - BaseTestRunner::SUITE_METHODNAME - ); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($method->isStatic()) { - $this->addTest($method->invoke(null, $className)); - } - } elseif ($class->implementsInterface(Test::class)) { - $this->addTestSuite($class); - } - } - } - - $this->numTests = -1; - } - - /** - * Wrapper for addTestFile() that adds multiple test files. - * - * @throws Exception - */ - public function addTestFiles(iterable $fileNames): void - { - foreach ($fileNames as $filename) { - $this->addTestFile((string) $filename); - } - } - - /** - * Counts the number of test cases that will be run by this test. - */ - public function count(bool $preferCache = false): int - { - if ($preferCache && $this->cachedNumTests !== null) { - return $this->cachedNumTests; - } - - $numTests = 0; - - foreach ($this as $test) { - $numTests += \count($test); - } - - $this->cachedNumTests = $numTests; - - return $numTests; - } - - /** - * Returns the name of the suite. - */ - public function getName(): string - { - return $this->name; - } - - /** - * Returns the test groups of the suite. - */ - public function getGroups(): array - { - return \array_keys($this->groups); - } - - public function getGroupDetails(): array - { - return $this->groups; - } - - /** - * Set tests groups of the test case - */ - public function setGroupDetails(array $groups): void - { - $this->groups = $groups; - } - - /** - * Runs the tests and collects their result in a TestResult. - * - * @throws \PHPUnit\Framework\CodeCoverageException - * @throws \SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException - * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException - * @throws \SebastianBergmann\CodeCoverage\MissingCoversAnnotationException - * @throws \SebastianBergmann\CodeCoverage\RuntimeException - * @throws \SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Warning - */ - public function run(TestResult $result = null): TestResult - { - if ($result === null) { - $result = $this->createResult(); - } - - if (\count($this) === 0) { - return $result; - } - - /** @psalm-var class-string $className */ - $className = $this->name; - $hookMethods = TestUtil::getHookMethods($className); - - $result->startTestSuite($this); - - try { - foreach ($hookMethods['beforeClass'] as $beforeClassMethod) { - if ($this->testCase && - \class_exists($this->name, false) && - \method_exists($this->name, $beforeClassMethod)) { - if ($missingRequirements = TestUtil::getMissingRequirements($this->name, $beforeClassMethod)) { - $this->markTestSuiteSkipped(\implode(\PHP_EOL, $missingRequirements)); - } - - \call_user_func([$this->name, $beforeClassMethod]); - } - } - } catch (SkippedTestSuiteError $error) { - foreach ($this->tests() as $test) { - $result->startTest($test); - $result->addFailure($test, $error, 0); - $result->endTest($test, 0); - } - - $result->endTestSuite($this); - - return $result; - } catch (\Throwable $t) { - $errorAdded = false; - - foreach ($this->tests() as $test) { - if ($result->shouldStop()) { - break; - } - - $result->startTest($test); - - if (!$errorAdded) { - $result->addError($test, $t, 0); - - $errorAdded = true; - } else { - $result->addFailure( - $test, - new SkippedTestError('Test skipped because of an error in hook method'), - 0 - ); - } - - $result->endTest($test, 0); - } - - $result->endTestSuite($this); - - return $result; - } - - foreach ($this as $test) { - if ($result->shouldStop()) { - break; - } - - if ($test instanceof TestCase || $test instanceof self) { - $test->setBeStrictAboutChangesToGlobalState($this->beStrictAboutChangesToGlobalState); - $test->setBackupGlobals($this->backupGlobals); - $test->setBackupStaticAttributes($this->backupStaticAttributes); - $test->setRunTestInSeparateProcess($this->runTestInSeparateProcess); - } - - $test->run($result); - } - - try { - foreach ($hookMethods['afterClass'] as $afterClassMethod) { - if ($this->testCase && - \class_exists($this->name, false) && - \method_exists($this->name, $afterClassMethod)) { - \call_user_func([$this->name, $afterClassMethod]); - } - } - } catch (\Throwable $t) { - $message = "Exception in {$this->name}::$afterClassMethod" . \PHP_EOL . $t->getMessage(); - $error = new SyntheticError($message, 0, $t->getFile(), $t->getLine(), $t->getTrace()); - - $placeholderTest = clone $test; - $placeholderTest->setName($afterClassMethod); - - $result->startTest($placeholderTest); - $result->addFailure($placeholderTest, $error, 0); - $result->endTest($placeholderTest, 0); - } - - $result->endTestSuite($this); - - return $result; - } - - public function setRunTestInSeparateProcess(bool $runTestInSeparateProcess): void - { - $this->runTestInSeparateProcess = $runTestInSeparateProcess; - } - - public function setName(string $name): void - { - $this->name = $name; - } - - /** - * Returns the test at the given index. - * - * @return false|Test - */ - public function testAt(int $index) - { - return $this->tests[$index] ?? false; - } - - /** - * Returns the tests as an enumeration. - * - * @return Test[] - */ - public function tests(): array - { - return $this->tests; - } - - /** - * Set tests of the test suite - * - * @param Test[] $tests - */ - public function setTests(array $tests): void - { - $this->tests = $tests; - } - - /** - * Mark the test suite as skipped. - * - * @param string $message - * - * @throws SkippedTestSuiteError - * - * @psalm-return never-return - */ - public function markTestSuiteSkipped($message = ''): void - { - throw new SkippedTestSuiteError($message); - } - - /** - * @param bool $beStrictAboutChangesToGlobalState - */ - public function setBeStrictAboutChangesToGlobalState($beStrictAboutChangesToGlobalState): void - { - if (null === $this->beStrictAboutChangesToGlobalState && \is_bool($beStrictAboutChangesToGlobalState)) { - $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; - } - } - - /** - * @param bool $backupGlobals - */ - public function setBackupGlobals($backupGlobals): void - { - if (null === $this->backupGlobals && \is_bool($backupGlobals)) { - $this->backupGlobals = $backupGlobals; - } - } - - /** - * @param bool $backupStaticAttributes - */ - public function setBackupStaticAttributes($backupStaticAttributes): void - { - if (null === $this->backupStaticAttributes && \is_bool($backupStaticAttributes)) { - $this->backupStaticAttributes = $backupStaticAttributes; - } - } - - /** - * Returns an iterator for this test suite. - */ - public function getIterator(): \Iterator - { - $iterator = new TestSuiteIterator($this); - - if ($this->iteratorFilter !== null) { - $iterator = $this->iteratorFilter->factory($iterator, $this); - } - - return $iterator; - } - - public function injectFilter(Factory $filter): void - { - $this->iteratorFilter = $filter; - - foreach ($this as $test) { - if ($test instanceof self) { - $test->injectFilter($filter); - } - } - } - - /** - * Creates a default TestResult object. - */ - protected function createResult(): TestResult - { - return new TestResult; - } - - /** - * @throws Exception - */ - protected function addTestMethod(\ReflectionClass $class, \ReflectionMethod $method): void - { - if (!TestUtil::isTestMethod($method)) { - return; - } - - $methodName = $method->getName(); - - if (!$method->isPublic()) { - $this->addTest( - new WarningTestCase( - \sprintf( - 'Test method "%s" in test class "%s" is not public.', - $methodName, - $class->getName() - ) - ) - ); - - return; - } - - $test = (new TestBuilder)->build($class, $methodName); - - if ($test instanceof TestCase || $test instanceof DataProviderTestSuite) { - $test->setDependencies( - TestUtil::getDependencies($class->getName(), $methodName) - ); - } - - $this->addTest( - $test, - TestUtil::getGroups($class->getName(), $methodName) - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php b/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php deleted file mode 100644 index 804048a..0000000 --- a/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteIterator implements \RecursiveIterator -{ - /** - * @var int - */ - private $position = 0; - - /** - * @var Test[] - */ - private $tests; - - public function __construct(TestSuite $testSuite) - { - $this->tests = $testSuite->tests(); - } - - public function rewind(): void - { - $this->position = 0; - } - - public function valid(): bool - { - return $this->position < \count($this->tests); - } - - public function key(): int - { - return $this->position; - } - - public function current(): Test - { - return $this->tests[$this->position]; - } - - public function next(): void - { - $this->position++; - } - - /** - * @throws NoChildTestSuiteException - */ - public function getChildren(): self - { - if (!$this->hasChildren()) { - throw new NoChildTestSuiteException( - 'The current item is not a TestSuite instance and therefore does not have any children.' - ); - } - - $current = $this->current(); - - \assert($current instanceof TestSuite); - - return new self($current); - } - - public function hasChildren(): bool - { - return $this->valid() && $this->current() instanceof TestSuite; - } -} diff --git a/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php b/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php deleted file mode 100644 index 8070c01..0000000 --- a/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Framework; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class WarningTestCase extends TestCase -{ - /** - * @var bool - */ - protected $backupGlobals = false; - - /** - * @var bool - */ - protected $backupStaticAttributes = false; - - /** - * @var bool - */ - protected $runTestInSeparateProcess = false; - - /** - * @var bool - */ - protected $useErrorHandler = false; - - /** - * @var string - */ - private $message; - - /** - * @param string $message - */ - public function __construct($message = '') - { - $this->message = $message; - parent::__construct('Warning'); - } - - public function getMessage(): string - { - return $this->message; - } - - /** - * Returns a string representation of the test case. - */ - public function toString(): string - { - return 'Warning'; - } - - /** - * @throws Exception - * - * @psalm-return never-return - */ - protected function runTest(): void - { - throw new Warning($this->message); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php b/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php deleted file mode 100644 index c302dad..0000000 --- a/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php +++ /dev/null @@ -1,156 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestSuite; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class BaseTestRunner -{ - /** - * @var int - */ - public const STATUS_UNKNOWN = -1; - - /** - * @var int - */ - public const STATUS_PASSED = 0; - - /** - * @var int - */ - public const STATUS_SKIPPED = 1; - - /** - * @var int - */ - public const STATUS_INCOMPLETE = 2; - - /** - * @var int - */ - public const STATUS_FAILURE = 3; - - /** - * @var int - */ - public const STATUS_ERROR = 4; - - /** - * @var int - */ - public const STATUS_RISKY = 5; - - /** - * @var int - */ - public const STATUS_WARNING = 6; - - /** - * @var string - */ - public const SUITE_METHODNAME = 'suite'; - - /** - * Returns the loader to be used. - */ - public function getLoader(): TestSuiteLoader - { - return new StandardTestSuiteLoader; - } - - /** - * Returns the Test corresponding to the given suite. - * This is a template method, subclasses override - * the runFailed() and clearStatus() methods. - * - * @param string|string[] $suffixes - * - * @throws Exception - */ - public function getTest(string $suiteClassName, string $suiteClassFile = '', $suffixes = ''): ?Test - { - if (empty($suiteClassFile) && \is_dir($suiteClassName) && !\is_file($suiteClassName . '.php')) { - /** @var string[] $files */ - $files = (new FileIteratorFacade)->getFilesAsArray( - $suiteClassName, - $suffixes - ); - - $suite = new TestSuite($suiteClassName); - $suite->addTestFiles($files); - - return $suite; - } - - try { - $testClass = $this->loadSuiteClass( - $suiteClassName, - $suiteClassFile - ); - } catch (Exception $e) { - $this->runFailed($e->getMessage()); - - return null; - } - - try { - $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME); - - if (!$suiteMethod->isStatic()) { - $this->runFailed( - 'suite() method must be static.' - ); - - return null; - } - - $test = $suiteMethod->invoke(null, $testClass->getName()); - } catch (\ReflectionException $e) { - try { - $test = new TestSuite($testClass); - } catch (Exception $e) { - $test = new TestSuite; - $test->setName($suiteClassName); - } - } - - $this->clearStatus(); - - return $test; - } - - /** - * Returns the loaded ReflectionClass for a suite name. - */ - protected function loadSuiteClass(string $suiteClassName, string $suiteClassFile = ''): \ReflectionClass - { - return $this->getLoader()->load($suiteClassName, $suiteClassFile); - } - - /** - * Clears the status message. - */ - protected function clearStatus(): void - { - } - - /** - * Override to define how to handle a failed loading of - * a test suite. - */ - abstract protected function runFailed(string $message): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php b/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php deleted file mode 100644 index a56ceab..0000000 --- a/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php +++ /dev/null @@ -1,217 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use PHPUnit\Util\ErrorHandler; -use PHPUnit\Util\Filesystem; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DefaultTestResultCache implements \Serializable, TestResultCache -{ - /** - * @var string - */ - public const DEFAULT_RESULT_CACHE_FILENAME = '.phpunit.result.cache'; - - /** - * Provide extra protection against incomplete or corrupt caches - * - * @var int[] - */ - private const ALLOWED_CACHE_TEST_STATUSES = [ - BaseTestRunner::STATUS_SKIPPED, - BaseTestRunner::STATUS_INCOMPLETE, - BaseTestRunner::STATUS_FAILURE, - BaseTestRunner::STATUS_ERROR, - BaseTestRunner::STATUS_RISKY, - BaseTestRunner::STATUS_WARNING, - ]; - - /** - * Path and filename for result cache file - * - * @var string - */ - private $cacheFilename; - - /** - * The list of defective tests - * - * - * // Mark a test skipped - * $this->defects[$testName] = BaseTestRunner::TEST_SKIPPED; - * - * - * @var array - */ - private $defects = []; - - /** - * The list of execution duration of suites and tests (in seconds) - * - * - * // Record running time for test - * $this->times[$testName] = 1.234; - * - * - * @var array - */ - private $times = []; - - public function __construct(?string $filepath = null) - { - if ($filepath !== null && \is_dir($filepath)) { - // cache path provided, use default cache filename in that location - $filepath .= \DIRECTORY_SEPARATOR . self::DEFAULT_RESULT_CACHE_FILENAME; - } - - $this->cacheFilename = $filepath ?? $_ENV['PHPUNIT_RESULT_CACHE'] ?? self::DEFAULT_RESULT_CACHE_FILENAME; - } - - /** - * @throws Exception - */ - public function persist(): void - { - $this->saveToFile(); - } - - /** - * @throws Exception - */ - public function saveToFile(): void - { - if (\defined('PHPUNIT_TESTSUITE_RESULTCACHE')) { - return; - } - - if (!Filesystem::createDirectory(\dirname($this->cacheFilename))) { - throw new Exception( - \sprintf( - 'Cannot create directory "%s" for result cache file', - $this->cacheFilename - ) - ); - } - - \file_put_contents( - $this->cacheFilename, - \serialize($this) - ); - } - - public function setState(string $testName, int $state): void - { - if ($state !== BaseTestRunner::STATUS_PASSED) { - $this->defects[$testName] = $state; - } - } - - public function getState(string $testName): int - { - return $this->defects[$testName] ?? BaseTestRunner::STATUS_UNKNOWN; - } - - public function setTime(string $testName, float $time): void - { - $this->times[$testName] = $time; - } - - public function getTime(string $testName): float - { - return $this->times[$testName] ?? 0.0; - } - - public function load(): void - { - $this->clear(); - - if (!\is_file($this->cacheFilename)) { - return; - } - - $cacheData = @\file_get_contents($this->cacheFilename); - - // @codeCoverageIgnoreStart - if ($cacheData === false) { - return; - } - // @codeCoverageIgnoreEnd - - $cache = ErrorHandler::invokeIgnoringWarnings( - static function () use ($cacheData) { - return @\unserialize($cacheData, ['allowed_classes' => [self::class]]); - } - ); - - if ($cache === false) { - return; - } - - if ($cache instanceof self) { - /* @var DefaultTestResultCache $cache */ - $cache->copyStateToCache($this); - } - } - - public function copyStateToCache(self $targetCache): void - { - foreach ($this->defects as $name => $state) { - $targetCache->setState($name, $state); - } - - foreach ($this->times as $name => $time) { - $targetCache->setTime($name, $time); - } - } - - public function clear(): void - { - $this->defects = []; - $this->times = []; - } - - public function serialize(): string - { - return \serialize([ - 'defects' => $this->defects, - 'times' => $this->times, - ]); - } - - /** - * @param string $serialized - */ - public function unserialize($serialized): void - { - $data = \unserialize($serialized); - - if (isset($data['times'])) { - foreach ($data['times'] as $testName => $testTime) { - \assert(\is_string($testName)); - \assert(\is_float($testTime)); - $this->times[$testName] = $testTime; - } - } - - if (isset($data['defects'])) { - foreach ($data['defects'] as $testName => $testResult) { - \assert(\is_string($testName)); - \assert(\is_int($testResult)); - - if (\in_array($testResult, self::ALLOWED_CACHE_TEST_STATUSES, true)) { - $this->defects[$testName] = $testResult; - } - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Exception.php b/vendor/phpunit/phpunit/src/Runner/Exception.php deleted file mode 100644 index 44705f5..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Exception.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Exception extends \RuntimeException implements \PHPUnit\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php b/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php deleted file mode 100644 index d8a8643..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ExcludeGroupFilterIterator extends GroupFilterIterator -{ - protected function doAccept(string $hash): bool - { - return !\in_array($hash, $this->groupTests, true); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php b/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php deleted file mode 100644 index 4072ad2..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -use FilterIterator; -use InvalidArgumentException; -use Iterator; -use PHPUnit\Framework\TestSuite; -use ReflectionClass; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Factory -{ - /** - * @var array - */ - private $filters = []; - - /** - * @throws InvalidArgumentException - */ - public function addFilter(ReflectionClass $filter, $args): void - { - if (!$filter->isSubclassOf(\RecursiveFilterIterator::class)) { - throw new InvalidArgumentException( - \sprintf( - 'Class "%s" does not extend RecursiveFilterIterator', - $filter->name - ) - ); - } - - $this->filters[] = [$filter, $args]; - } - - public function factory(Iterator $iterator, TestSuite $suite): FilterIterator - { - foreach ($this->filters as $filter) { - [$class, $args] = $filter; - $iterator = $class->newInstance($iterator, $args, $suite); - } - - return $iterator; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php b/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php deleted file mode 100644 index 1d778a6..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -use PHPUnit\Framework\TestSuite; -use RecursiveFilterIterator; -use RecursiveIterator; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class GroupFilterIterator extends RecursiveFilterIterator -{ - /** - * @var string[] - */ - protected $groupTests = []; - - public function __construct(RecursiveIterator $iterator, array $groups, TestSuite $suite) - { - parent::__construct($iterator); - - foreach ($suite->getGroupDetails() as $group => $tests) { - if (\in_array((string) $group, $groups, true)) { - $testHashes = \array_map( - 'spl_object_hash', - $tests - ); - - $this->groupTests = \array_merge($this->groupTests, $testHashes); - } - } - } - - public function accept(): bool - { - $test = $this->getInnerIterator()->current(); - - if ($test instanceof TestSuite) { - return true; - } - - return $this->doAccept(\spl_object_hash($test)); - } - - abstract protected function doAccept(string $hash); -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php b/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php deleted file mode 100644 index 5f004f9..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class IncludeGroupFilterIterator extends GroupFilterIterator -{ - protected function doAccept(string $hash): bool - { - return \in_array($hash, $this->groupTests, true); - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php b/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php deleted file mode 100644 index a26665d..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner\Filter; - -use PHPUnit\Framework\TestSuite; -use PHPUnit\Framework\WarningTestCase; -use PHPUnit\Util\RegularExpression; -use RecursiveFilterIterator; -use RecursiveIterator; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NameFilterIterator extends RecursiveFilterIterator -{ - /** - * @var string - */ - private $filter; - - /** - * @var int - */ - private $filterMin; - - /** - * @var int - */ - private $filterMax; - - /** - * @throws \Exception - */ - public function __construct(RecursiveIterator $iterator, string $filter) - { - parent::__construct($iterator); - - $this->setFilter($filter); - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function accept(): bool - { - $test = $this->getInnerIterator()->current(); - - if ($test instanceof TestSuite) { - return true; - } - - $tmp = \PHPUnit\Util\Test::describe($test); - - if ($test instanceof WarningTestCase) { - $name = $test->getMessage(); - } elseif ($tmp[0] !== '') { - $name = \implode('::', $tmp); - } else { - $name = $tmp[1]; - } - - $accepted = @\preg_match($this->filter, $name, $matches); - - if ($accepted && isset($this->filterMax)) { - $set = \end($matches); - $accepted = $set >= $this->filterMin && $set <= $this->filterMax; - } - - return (bool) $accepted; - } - - /** - * @throws \Exception - */ - private function setFilter(string $filter): void - { - if (RegularExpression::safeMatch($filter, '') === false) { - // Handles: - // * testAssertEqualsSucceeds#4 - // * testAssertEqualsSucceeds#4-8 - if (\preg_match('/^(.*?)#(\d+)(?:-(\d+))?$/', $filter, $matches)) { - if (isset($matches[3]) && $matches[2] < $matches[3]) { - $filter = \sprintf( - '%s.*with data set #(\d+)$', - $matches[1] - ); - - $this->filterMin = (int) $matches[2]; - $this->filterMax = (int) $matches[3]; - } else { - $filter = \sprintf( - '%s.*with data set #%s$', - $matches[1], - $matches[2] - ); - } - } // Handles: - // * testDetermineJsonError@JSON_ERROR_NONE - // * testDetermineJsonError@JSON.* - elseif (\preg_match('/^(.*?)@(.+)$/', $filter, $matches)) { - $filter = \sprintf( - '%s.*with data set "%s"$', - $matches[1], - $matches[2] - ); - } - - // Escape delimiters in regular expression. Do NOT use preg_quote, - // to keep magic characters. - $filter = \sprintf('/%s/i', \str_replace( - '/', - '\\/', - $filter - )); - } - - $this->filter = $filter; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php deleted file mode 100644 index 35ded5d..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface AfterIncompleteTestHook extends TestHook -{ - public function executeAfterIncompleteTest(string $test, string $message, float $time): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php deleted file mode 100644 index 7dee9f9..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface AfterLastTestHook extends Hook -{ - public function executeAfterLastTest(): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php deleted file mode 100644 index 7fe9ee7..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface AfterRiskyTestHook extends TestHook -{ - public function executeAfterRiskyTest(string $test, string $message, float $time): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php deleted file mode 100644 index f9253b5..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface AfterSkippedTestHook extends TestHook -{ - public function executeAfterSkippedTest(string $test, string $message, float $time): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php deleted file mode 100644 index 6b55cc8..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface AfterSuccessfulTestHook extends TestHook -{ - public function executeAfterSuccessfulTest(string $test, float $time): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php deleted file mode 100644 index f5c23fb..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface AfterTestErrorHook extends TestHook -{ - public function executeAfterTestError(string $test, string $message, float $time): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php deleted file mode 100644 index 9ed2939..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface AfterTestFailureHook extends TestHook -{ - public function executeAfterTestFailure(string $test, string $message, float $time): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php deleted file mode 100644 index 7e0af80..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface AfterTestHook extends TestHook -{ - /** - * This hook will fire after any test, regardless of the result. - * - * For more fine grained control, have a look at the other hooks - * that extend PHPUnit\Runner\Hook. - */ - public function executeAfterTest(string $test, float $time): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php deleted file mode 100644 index 12de80f..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface AfterTestWarningHook extends TestHook -{ - public function executeAfterTestWarning(string $test, string $message, float $time): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php deleted file mode 100644 index 59b6666..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface BeforeFirstTestHook extends Hook -{ - public function executeBeforeFirstTest(): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php deleted file mode 100644 index 8bbf8a9..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface BeforeTestHook extends TestHook -{ - public function executeBeforeTest(string $test): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/Hook.php b/vendor/phpunit/phpunit/src/Runner/Hook/Hook.php deleted file mode 100644 index 546f1a3..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/Hook.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface Hook -{ -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/TestHook.php b/vendor/phpunit/phpunit/src/Runner/Hook/TestHook.php deleted file mode 100644 index 47c41f9..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/TestHook.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -interface TestHook extends Hook -{ -} diff --git a/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php b/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php deleted file mode 100644 index a4dfa4b..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php +++ /dev/null @@ -1,140 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use PHPUnit\Framework\AssertionFailedError; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestListener; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Framework\Warning; -use PHPUnit\Util\Test as TestUtil; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestListenerAdapter implements TestListener -{ - /** - * @var TestHook[] - */ - private $hooks = []; - - /** - * @var bool - */ - private $lastTestWasNotSuccessful; - - public function add(TestHook $hook): void - { - $this->hooks[] = $hook; - } - - public function startTest(Test $test): void - { - foreach ($this->hooks as $hook) { - if ($hook instanceof BeforeTestHook) { - $hook->executeBeforeTest(TestUtil::describeAsString($test)); - } - } - - $this->lastTestWasNotSuccessful = false; - } - - public function addError(Test $test, \Throwable $t, float $time): void - { - foreach ($this->hooks as $hook) { - if ($hook instanceof AfterTestErrorHook) { - $hook->executeAfterTestError(TestUtil::describeAsString($test), $t->getMessage(), $time); - } - } - - $this->lastTestWasNotSuccessful = true; - } - - public function addWarning(Test $test, Warning $e, float $time): void - { - foreach ($this->hooks as $hook) { - if ($hook instanceof AfterTestWarningHook) { - $hook->executeAfterTestWarning(TestUtil::describeAsString($test), $e->getMessage(), $time); - } - } - - $this->lastTestWasNotSuccessful = true; - } - - public function addFailure(Test $test, AssertionFailedError $e, float $time): void - { - foreach ($this->hooks as $hook) { - if ($hook instanceof AfterTestFailureHook) { - $hook->executeAfterTestFailure(TestUtil::describeAsString($test), $e->getMessage(), $time); - } - } - - $this->lastTestWasNotSuccessful = true; - } - - public function addIncompleteTest(Test $test, \Throwable $t, float $time): void - { - foreach ($this->hooks as $hook) { - if ($hook instanceof AfterIncompleteTestHook) { - $hook->executeAfterIncompleteTest(TestUtil::describeAsString($test), $t->getMessage(), $time); - } - } - - $this->lastTestWasNotSuccessful = true; - } - - public function addRiskyTest(Test $test, \Throwable $t, float $time): void - { - foreach ($this->hooks as $hook) { - if ($hook instanceof AfterRiskyTestHook) { - $hook->executeAfterRiskyTest(TestUtil::describeAsString($test), $t->getMessage(), $time); - } - } - - $this->lastTestWasNotSuccessful = true; - } - - public function addSkippedTest(Test $test, \Throwable $t, float $time): void - { - foreach ($this->hooks as $hook) { - if ($hook instanceof AfterSkippedTestHook) { - $hook->executeAfterSkippedTest(TestUtil::describeAsString($test), $t->getMessage(), $time); - } - } - - $this->lastTestWasNotSuccessful = true; - } - - public function endTest(Test $test, float $time): void - { - if (!$this->lastTestWasNotSuccessful) { - foreach ($this->hooks as $hook) { - if ($hook instanceof AfterSuccessfulTestHook) { - $hook->executeAfterSuccessfulTest(TestUtil::describeAsString($test), $time); - } - } - } - - foreach ($this->hooks as $hook) { - if ($hook instanceof AfterTestHook) { - $hook->executeAfterTest(TestUtil::describeAsString($test), $time); - } - } - } - - public function startTestSuite(TestSuite $suite): void - { - } - - public function endTestSuite(TestSuite $suite): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/NullTestResultCache.php b/vendor/phpunit/phpunit/src/Runner/NullTestResultCache.php deleted file mode 100644 index 2aa8653..0000000 --- a/vendor/phpunit/phpunit/src/Runner/NullTestResultCache.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class NullTestResultCache implements TestResultCache -{ - public function setState(string $testName, int $state): void - { - } - - public function getState(string $testName): int - { - return BaseTestRunner::STATUS_UNKNOWN; - } - - public function setTime(string $testName, float $time): void - { - } - - public function getTime(string $testName): float - { - return 0; - } - - public function load(): void - { - } - - public function persist(): void - { - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php b/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php deleted file mode 100644 index b94e17a..0000000 --- a/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php +++ /dev/null @@ -1,751 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use PHPUnit\Framework\Assert; -use PHPUnit\Framework\AssertionFailedError; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\IncompleteTestError; -use PHPUnit\Framework\PHPTAssertionFailedError; -use PHPUnit\Framework\SelfDescribing; -use PHPUnit\Framework\SkippedTestError; -use PHPUnit\Framework\SyntheticSkippedError; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestResult; -use PHPUnit\Util\PHP\AbstractPhpProcess; -use SebastianBergmann\Timer\Timer; -use Text_Template; -use Throwable; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class PhptTestCase implements SelfDescribing, Test -{ - /** - * @var string[] - */ - private const SETTINGS = [ - 'allow_url_fopen=1', - 'auto_append_file=', - 'auto_prepend_file=', - 'disable_functions=', - 'display_errors=1', - 'docref_ext=.html', - 'docref_root=', - 'error_append_string=', - 'error_prepend_string=', - 'error_reporting=-1', - 'html_errors=0', - 'log_errors=0', - 'magic_quotes_runtime=0', - 'open_basedir=', - 'output_buffering=Off', - 'output_handler=', - 'report_memleaks=0', - 'report_zend_debug=0', - 'safe_mode=0', - 'xdebug.default_enable=0', - ]; - - /** - * @var string - */ - private $filename; - - /** - * @var AbstractPhpProcess - */ - private $phpUtil; - - /** - * @var string - */ - private $output = ''; - - /** - * Constructs a test case with the given filename. - * - * @throws Exception - */ - public function __construct(string $filename, AbstractPhpProcess $phpUtil = null) - { - if (!\is_file($filename)) { - throw new Exception( - \sprintf( - 'File "%s" does not exist.', - $filename - ) - ); - } - - $this->filename = $filename; - $this->phpUtil = $phpUtil ?: AbstractPhpProcess::factory(); - } - - /** - * Counts the number of test cases executed by run(TestResult result). - */ - public function count(): int - { - return 1; - } - - /** - * Runs a test and collects its result in a TestResult instance. - * - * @throws Exception - * @throws \SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException - * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException - * @throws \SebastianBergmann\CodeCoverage\MissingCoversAnnotationException - * @throws \SebastianBergmann\CodeCoverage\RuntimeException - * @throws \SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function run(TestResult $result = null): TestResult - { - if ($result === null) { - $result = new TestResult; - } - - try { - $sections = $this->parse(); - } catch (Exception $e) { - $result->startTest($this); - $result->addFailure($this, new SkippedTestError($e->getMessage()), 0); - $result->endTest($this, 0); - - return $result; - } - - $code = $this->render($sections['FILE']); - $xfail = false; - $settings = $this->parseIniSection(self::SETTINGS); - - $result->startTest($this); - - if (isset($sections['INI'])) { - $settings = $this->parseIniSection($sections['INI'], $settings); - } - - if (isset($sections['ENV'])) { - $env = $this->parseEnvSection($sections['ENV']); - $this->phpUtil->setEnv($env); - } - - $this->phpUtil->setUseStderrRedirection(true); - - if ($result->enforcesTimeLimit()) { - $this->phpUtil->setTimeout($result->getTimeoutForLargeTests()); - } - - $skip = $this->runSkip($sections, $result, $settings); - - if ($skip) { - return $result; - } - - if (isset($sections['XFAIL'])) { - $xfail = \trim($sections['XFAIL']); - } - - if (isset($sections['STDIN'])) { - $this->phpUtil->setStdin($sections['STDIN']); - } - - if (isset($sections['ARGS'])) { - $this->phpUtil->setArgs($sections['ARGS']); - } - - if ($result->getCollectCodeCoverageInformation()) { - $this->renderForCoverage($code); - } - - Timer::start(); - - $jobResult = $this->phpUtil->runJob($code, $this->stringifyIni($settings)); - $time = Timer::stop(); - $this->output = $jobResult['stdout'] ?? ''; - - if ($result->getCollectCodeCoverageInformation() && ($coverage = $this->cleanupForCoverage())) { - $result->getCodeCoverage()->append($coverage, $this, true, [], [], true); - } - - try { - $this->assertPhptExpectation($sections, $this->output); - } catch (AssertionFailedError $e) { - $failure = $e; - - if ($xfail !== false) { - $failure = new IncompleteTestError($xfail, 0, $e); - } elseif ($e instanceof ExpectationFailedException) { - $comparisonFailure = $e->getComparisonFailure(); - - if ($comparisonFailure) { - $diff = $comparisonFailure->getDiff(); - } else { - $diff = $e->getMessage(); - } - - $hint = $this->getLocationHintFromDiff($diff, $sections); - $trace = \array_merge($hint, \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $failure = new PHPTAssertionFailedError( - $e->getMessage(), - 0, - $trace[0]['file'], - $trace[0]['line'], - $trace, - $comparisonFailure ? $diff : '' - ); - } - - $result->addFailure($this, $failure, $time); - } catch (Throwable $t) { - $result->addError($this, $t, $time); - } - - if ($xfail !== false && $result->allCompletelyImplemented()) { - $result->addFailure($this, new IncompleteTestError('XFAIL section but test passes'), $time); - } - - $this->runClean($sections); - - $result->endTest($this, $time); - - return $result; - } - - /** - * Returns the name of the test case. - */ - public function getName(): string - { - return $this->toString(); - } - - /** - * Returns a string representation of the test case. - */ - public function toString(): string - { - return $this->filename; - } - - public function usesDataProvider(): bool - { - return false; - } - - public function getNumAssertions(): int - { - return 1; - } - - public function getActualOutput(): string - { - return $this->output; - } - - public function hasOutput(): bool - { - return !empty($this->output); - } - - /** - * Parse --INI-- section key value pairs and return as array. - * - * @param array|string - */ - private function parseIniSection($content, $ini = []): array - { - if (\is_string($content)) { - $content = \explode("\n", \trim($content)); - } - - foreach ($content as $setting) { - if (\strpos($setting, '=') === false) { - continue; - } - - $setting = \explode('=', $setting, 2); - $name = \trim($setting[0]); - $value = \trim($setting[1]); - - if ($name === 'extension' || $name === 'zend_extension') { - if (!isset($ini[$name])) { - $ini[$name] = []; - } - - $ini[$name][] = $value; - - continue; - } - - $ini[$name] = $value; - } - - return $ini; - } - - private function parseEnvSection(string $content): array - { - $env = []; - - foreach (\explode("\n", \trim($content)) as $e) { - $e = \explode('=', \trim($e), 2); - - if (!empty($e[0]) && isset($e[1])) { - $env[$e[0]] = $e[1]; - } - } - - return $env; - } - - /** - * @throws ExpectationFailedException - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - * @throws Exception - */ - private function assertPhptExpectation(array $sections, string $output): void - { - $assertions = [ - 'EXPECT' => 'assertEquals', - 'EXPECTF' => 'assertStringMatchesFormat', - 'EXPECTREGEX' => 'assertRegExp', - ]; - - $actual = \preg_replace('/\r\n/', "\n", \trim($output)); - - foreach ($assertions as $sectionName => $sectionAssertion) { - if (isset($sections[$sectionName])) { - $sectionContent = \preg_replace('/\r\n/', "\n", \trim($sections[$sectionName])); - $expected = $sectionName === 'EXPECTREGEX' ? "/{$sectionContent}/" : $sectionContent; - - if ($expected === null) { - throw new Exception('No PHPT expectation found'); - } - - Assert::$sectionAssertion($expected, $actual); - - return; - } - } - - throw new Exception('No PHPT assertion found'); - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function runSkip(array &$sections, TestResult $result, array $settings): bool - { - if (!isset($sections['SKIPIF'])) { - return false; - } - - $skipif = $this->render($sections['SKIPIF']); - $jobResult = $this->phpUtil->runJob($skipif, $this->stringifyIni($settings)); - - if (!\strncasecmp('skip', \ltrim($jobResult['stdout']), 4)) { - $message = ''; - - if (\preg_match('/^\s*skip\s*(.+)\s*/i', $jobResult['stdout'], $skipMatch)) { - $message = \substr($skipMatch[1], 2); - } - - $hint = $this->getLocationHint($message, $sections, 'SKIPIF'); - $trace = \array_merge($hint, \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS)); - $result->addFailure( - $this, - new SyntheticSkippedError($message, 0, $trace[0]['file'], $trace[0]['line'], $trace), - 0 - ); - $result->endTest($this, 0); - - return true; - } - - return false; - } - - private function runClean(array &$sections): void - { - $this->phpUtil->setStdin(''); - $this->phpUtil->setArgs(''); - - if (isset($sections['CLEAN'])) { - $cleanCode = $this->render($sections['CLEAN']); - - $this->phpUtil->runJob($cleanCode, self::SETTINGS); - } - } - - /** - * @throws Exception - */ - private function parse(): array - { - $sections = []; - $section = ''; - - $unsupportedSections = [ - 'CGI', - 'COOKIE', - 'DEFLATE_POST', - 'EXPECTHEADERS', - 'EXTENSIONS', - 'GET', - 'GZIP_POST', - 'HEADERS', - 'PHPDBG', - 'POST', - 'POST_RAW', - 'PUT', - 'REDIRECTTEST', - 'REQUEST', - ]; - - $lineNr = 0; - - foreach (\file($this->filename) as $line) { - $lineNr++; - - if (\preg_match('/^--([_A-Z]+)--/', $line, $result)) { - $section = $result[1]; - $sections[$section] = ''; - $sections[$section . '_offset'] = $lineNr; - - continue; - } - - if (empty($section)) { - throw new Exception('Invalid PHPT file: empty section header'); - } - - $sections[$section] .= $line; - } - - if (isset($sections['FILEEOF'])) { - $sections['FILE'] = \rtrim($sections['FILEEOF'], "\r\n"); - unset($sections['FILEEOF']); - } - - $this->parseExternal($sections); - - if (!$this->validate($sections)) { - throw new Exception('Invalid PHPT file'); - } - - foreach ($unsupportedSections as $section) { - if (isset($sections[$section])) { - throw new Exception( - "PHPUnit does not support PHPT $section sections" - ); - } - } - - return $sections; - } - - /** - * @throws Exception - */ - private function parseExternal(array &$sections): void - { - $allowSections = [ - 'FILE', - 'EXPECT', - 'EXPECTF', - 'EXPECTREGEX', - ]; - $testDirectory = \dirname($this->filename) . \DIRECTORY_SEPARATOR; - - foreach ($allowSections as $section) { - if (isset($sections[$section . '_EXTERNAL'])) { - $externalFilename = \trim($sections[$section . '_EXTERNAL']); - - if (!\is_file($testDirectory . $externalFilename) || - !\is_readable($testDirectory . $externalFilename)) { - throw new Exception( - \sprintf( - 'Could not load --%s-- %s for PHPT file', - $section . '_EXTERNAL', - $testDirectory . $externalFilename - ) - ); - } - - $sections[$section] = \file_get_contents($testDirectory . $externalFilename); - } - } - } - - private function validate(array &$sections): bool - { - $requiredSections = [ - 'FILE', - [ - 'EXPECT', - 'EXPECTF', - 'EXPECTREGEX', - ], - ]; - - foreach ($requiredSections as $section) { - if (\is_array($section)) { - $foundSection = false; - - foreach ($section as $anySection) { - if (isset($sections[$anySection])) { - $foundSection = true; - - break; - } - } - - if (!$foundSection) { - return false; - } - - continue; - } - - if (!isset($sections[$section])) { - return false; - } - } - - return true; - } - - private function render(string $code): string - { - return \str_replace( - [ - '__DIR__', - '__FILE__', - ], - [ - "'" . \dirname($this->filename) . "'", - "'" . $this->filename . "'", - ], - $code - ); - } - - private function getCoverageFiles(): array - { - $baseDir = \dirname(\realpath($this->filename)) . \DIRECTORY_SEPARATOR; - $basename = \basename($this->filename, 'phpt'); - - return [ - 'coverage' => $baseDir . $basename . 'coverage', - 'job' => $baseDir . $basename . 'php', - ]; - } - - private function renderForCoverage(string &$job): void - { - $files = $this->getCoverageFiles(); - - $template = new Text_Template( - __DIR__ . '/../Util/PHP/Template/PhptTestCase.tpl' - ); - - $composerAutoload = '\'\''; - - if (\defined('PHPUNIT_COMPOSER_INSTALL') && !\defined('PHPUNIT_TESTSUITE')) { - $composerAutoload = \var_export(PHPUNIT_COMPOSER_INSTALL, true); - } - - $phar = '\'\''; - - if (\defined('__PHPUNIT_PHAR__')) { - $phar = \var_export(__PHPUNIT_PHAR__, true); - } - - $globals = ''; - - if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { - $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . \var_export( - $GLOBALS['__PHPUNIT_BOOTSTRAP'], - true - ) . ";\n"; - } - - $template->setVar( - [ - 'composerAutoload' => $composerAutoload, - 'phar' => $phar, - 'globals' => $globals, - 'job' => $files['job'], - 'coverageFile' => $files['coverage'], - ] - ); - - \file_put_contents($files['job'], $job); - $job = $template->render(); - } - - private function cleanupForCoverage(): array - { - $files = $this->getCoverageFiles(); - $coverage = @\unserialize(\file_get_contents($files['coverage'])); - - if ($coverage === false) { - $coverage = []; - } - - foreach ($files as $file) { - @\unlink($file); - } - - return $coverage; - } - - private function stringifyIni(array $ini): array - { - $settings = []; - - foreach ($ini as $key => $value) { - if (\is_array($value)) { - foreach ($value as $val) { - $settings[] = $key . '=' . $val; - } - - continue; - } - - $settings[] = $key . '=' . $value; - } - - return $settings; - } - - private function getLocationHintFromDiff(string $message, array $sections): array - { - $needle = ''; - $previousLine = ''; - $block = 'message'; - - foreach (\preg_split('/\r\n|\r|\n/', $message) as $line) { - $line = \trim($line); - - if ($block === 'message' && $line === '--- Expected') { - $block = 'expected'; - } - - if ($block === 'expected' && $line === '@@ @@') { - $block = 'diff'; - } - - if ($block === 'diff') { - if (\strpos($line, '+') === 0) { - $needle = $this->getCleanDiffLine($previousLine); - - break; - } - - if (\strpos($line, '-') === 0) { - $needle = $this->getCleanDiffLine($line); - - break; - } - } - - if (!empty($line)) { - $previousLine = $line; - } - } - - return $this->getLocationHint($needle, $sections); - } - - private function getCleanDiffLine(string $line): string - { - if (\preg_match('/^[\-+]([\'\"]?)(.*)\1$/', $line, $matches)) { - $line = $matches[2]; - } - - return $line; - } - - private function getLocationHint(string $needle, array $sections, ?string $sectionName = null): array - { - $needle = \trim($needle); - - if (empty($needle)) { - return [[ - 'file' => \realpath($this->filename), - 'line' => 1, - ]]; - } - - if ($sectionName) { - $search = [$sectionName]; - } else { - $search = [ - // 'FILE', - 'EXPECT', - 'EXPECTF', - 'EXPECTREGEX', - ]; - } - - foreach ($search as $section) { - if (!isset($sections[$section])) { - continue; - } - - if (isset($sections[$section . '_EXTERNAL'])) { - $externalFile = \trim($sections[$section . '_EXTERNAL']); - - return [ - [ - 'file' => \realpath(\dirname($this->filename) . \DIRECTORY_SEPARATOR . $externalFile), - 'line' => 1, - ], - [ - 'file' => \realpath($this->filename), - 'line' => ($sections[$section . '_EXTERNAL_offset'] ?? 0) + 1, - ], - ]; - } - - $sectionOffset = $sections[$section . '_offset'] ?? 0; - $offset = $sectionOffset + 1; - - foreach (\preg_split('/\r\n|\r|\n/', $sections[$section]) as $line) { - if (\strpos($line, $needle) !== false) { - return [[ - 'file' => \realpath($this->filename), - 'line' => $offset, - ]]; - } - $offset++; - } - } - - if ($sectionName) { - // String not found in specified section, show user the start of the named section - return [[ - 'file' => \realpath($this->filename), - 'line' => $sectionOffset, - ]]; - } - - // No section specified, show user start of code - return [[ - 'file' => \realpath($this->filename), - 'line' => 1, - ]]; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php b/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php deleted file mode 100644 index f9a9b13..0000000 --- a/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ResultCacheExtension implements AfterIncompleteTestHook, AfterLastTestHook, AfterRiskyTestHook, AfterSkippedTestHook, AfterSuccessfulTestHook, AfterTestErrorHook, AfterTestFailureHook, AfterTestWarningHook -{ - /** - * @var TestResultCache - */ - private $cache; - - public function __construct(TestResultCache $cache) - { - $this->cache = $cache; - } - - public function flush(): void - { - $this->cache->persist(); - } - - public function executeAfterSuccessfulTest(string $test, float $time): void - { - $testName = $this->getTestName($test); - - $this->cache->setTime($testName, \round($time, 3)); - } - - public function executeAfterIncompleteTest(string $test, string $message, float $time): void - { - $testName = $this->getTestName($test); - - $this->cache->setTime($testName, \round($time, 3)); - $this->cache->setState($testName, BaseTestRunner::STATUS_INCOMPLETE); - } - - public function executeAfterRiskyTest(string $test, string $message, float $time): void - { - $testName = $this->getTestName($test); - - $this->cache->setTime($testName, \round($time, 3)); - $this->cache->setState($testName, BaseTestRunner::STATUS_RISKY); - } - - public function executeAfterSkippedTest(string $test, string $message, float $time): void - { - $testName = $this->getTestName($test); - - $this->cache->setTime($testName, \round($time, 3)); - $this->cache->setState($testName, BaseTestRunner::STATUS_SKIPPED); - } - - public function executeAfterTestError(string $test, string $message, float $time): void - { - $testName = $this->getTestName($test); - - $this->cache->setTime($testName, \round($time, 3)); - $this->cache->setState($testName, BaseTestRunner::STATUS_ERROR); - } - - public function executeAfterTestFailure(string $test, string $message, float $time): void - { - $testName = $this->getTestName($test); - - $this->cache->setTime($testName, \round($time, 3)); - $this->cache->setState($testName, BaseTestRunner::STATUS_FAILURE); - } - - public function executeAfterTestWarning(string $test, string $message, float $time): void - { - $testName = $this->getTestName($test); - - $this->cache->setTime($testName, \round($time, 3)); - $this->cache->setState($testName, BaseTestRunner::STATUS_WARNING); - } - - public function executeAfterLastTest(): void - { - $this->flush(); - } - - /** - * @param string $test A long description format of the current test - * - * @return string The test name without TestSuiteClassName:: and @dataprovider details - */ - private function getTestName(string $test): string - { - $matches = []; - - if (\preg_match('/^(?\S+::\S+)(?:(? with data set (?:#\d+|"[^"]+"))\s\()?/', $test, $matches)) { - $test = $matches['name'] . ($matches['dataname'] ?? ''); - } - - return $test; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php b/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php deleted file mode 100644 index e7651a4..0000000 --- a/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php +++ /dev/null @@ -1,153 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use PHPUnit\Framework\TestCase; -use PHPUnit\Util\FileLoader; -use PHPUnit\Util\Filesystem; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class StandardTestSuiteLoader implements TestSuiteLoader -{ - /** - * @throws Exception - * @throws \PHPUnit\Framework\Exception - */ - public function load(string $suiteClassName, string $suiteClassFile = ''): \ReflectionClass - { - $suiteClassName = \str_replace('.php', '', $suiteClassName); - $filename = null; - - if (empty($suiteClassFile)) { - $suiteClassFile = Filesystem::classNameToFilename( - $suiteClassName - ); - } - - if (!\class_exists($suiteClassName, false)) { - $loadedClasses = \get_declared_classes(); - - $filename = FileLoader::checkAndLoad($suiteClassFile); - - $loadedClasses = \array_values( - \array_diff(\get_declared_classes(), $loadedClasses) - ); - } - - if (!empty($loadedClasses) && !\class_exists($suiteClassName, false)) { - $offset = 0 - \strlen($suiteClassName); - - foreach ($loadedClasses as $loadedClass) { - try { - $class = new \ReflectionClass($loadedClass); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if (\substr($loadedClass, $offset) === $suiteClassName && - $class->getFileName() == $filename) { - $suiteClassName = $loadedClass; - - break; - } - } - } - - if (!empty($loadedClasses) && !\class_exists($suiteClassName, false)) { - $testCaseClass = TestCase::class; - - foreach ($loadedClasses as $loadedClass) { - try { - $class = new \ReflectionClass($loadedClass); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $classFile = $class->getFileName(); - - if ($class->isSubclassOf($testCaseClass) && !$class->isAbstract()) { - $suiteClassName = $loadedClass; - $testCaseClass = $loadedClass; - - if ($classFile == \realpath($suiteClassFile)) { - break; - } - } - - if ($class->hasMethod('suite')) { - try { - $method = $class->getMethod('suite'); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if (!$method->isAbstract() && $method->isPublic() && $method->isStatic()) { - $suiteClassName = $loadedClass; - - if ($classFile == \realpath($suiteClassFile)) { - break; - } - } - } - } - } - - if (\class_exists($suiteClassName, false)) { - try { - $class = new \ReflectionClass($suiteClassName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($class->getFileName() == \realpath($suiteClassFile)) { - return $class; - } - } - - throw new Exception( - \sprintf( - "Class '%s' could not be found in '%s'.", - $suiteClassName, - $suiteClassFile - ) - ); - } - - public function reload(\ReflectionClass $aClass): \ReflectionClass - { - return $aClass; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestResultCache.php b/vendor/phpunit/phpunit/src/Runner/TestResultCache.php deleted file mode 100644 index 69e6282..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestResultCache.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -interface TestResultCache -{ - public function setState(string $testName, int $state): void; - - public function getState(string $testName): int; - - public function setTime(string $testName, float $time): void; - - public function getTime(string $testName): float; - - public function load(): void; - - public function persist(): void; -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php b/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php deleted file mode 100644 index f059688..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use ReflectionClass; - -/** - * An interface to define how a test suite should be loaded. - */ -interface TestSuiteLoader -{ - public function load(string $suiteClassName, string $suiteClassFile = ''): ReflectionClass; - - public function reload(ReflectionClass $aClass): ReflectionClass; -} diff --git a/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php b/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php deleted file mode 100644 index c75976d..0000000 --- a/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php +++ /dev/null @@ -1,434 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use PHPUnit\Framework\DataProviderTestSuite; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Util\Test as TestUtil; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestSuiteSorter -{ - /** - * @var int - */ - public const ORDER_DEFAULT = 0; - - /** - * @var int - */ - public const ORDER_RANDOMIZED = 1; - - /** - * @var int - */ - public const ORDER_REVERSED = 2; - - /** - * @var int - */ - public const ORDER_DEFECTS_FIRST = 3; - - /** - * @var int - */ - public const ORDER_DURATION = 4; - - /** - * Order tests by @size annotation 'small', 'medium', 'large' - * - * @var int - */ - public const ORDER_SIZE = 5; - - /** - * List of sorting weights for all test result codes. A higher number gives higher priority. - */ - private const DEFECT_SORT_WEIGHT = [ - BaseTestRunner::STATUS_ERROR => 6, - BaseTestRunner::STATUS_FAILURE => 5, - BaseTestRunner::STATUS_WARNING => 4, - BaseTestRunner::STATUS_INCOMPLETE => 3, - BaseTestRunner::STATUS_RISKY => 2, - BaseTestRunner::STATUS_SKIPPED => 1, - BaseTestRunner::STATUS_UNKNOWN => 0, - ]; - - private const SIZE_SORT_WEIGHT = [ - TestUtil::SMALL => 1, - TestUtil::MEDIUM => 2, - TestUtil::LARGE => 3, - TestUtil::UNKNOWN => 4, - ]; - - /** - * @var array Associative array of (string => DEFECT_SORT_WEIGHT) elements - */ - private $defectSortOrder = []; - - /** - * @var TestResultCache - */ - private $cache; - - /** - * @var string[] A list of normalized names of tests before reordering - */ - private $originalExecutionOrder = []; - - /** - * @var string[] A list of normalized names of tests affected by reordering - */ - private $executionOrder = []; - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function getTestSorterUID(Test $test): string - { - if ($test instanceof PhptTestCase) { - return $test->getName(); - } - - if ($test instanceof TestCase) { - $testName = $test->getName(true); - - if (\strpos($testName, '::') === false) { - $testName = \get_class($test) . '::' . $testName; - } - - return $testName; - } - - return $test->getName(); - } - - public function __construct(?TestResultCache $cache = null) - { - $this->cache = $cache ?? new NullTestResultCache; - } - - /** - * @throws Exception - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function reorderTestsInSuite(Test $suite, int $order, bool $resolveDependencies, int $orderDefects, bool $isRootTestSuite = true): void - { - $allowedOrders = [ - self::ORDER_DEFAULT, - self::ORDER_REVERSED, - self::ORDER_RANDOMIZED, - self::ORDER_DURATION, - self::ORDER_SIZE, - ]; - - if (!\in_array($order, $allowedOrders, true)) { - throw new Exception( - '$order must be one of TestSuiteSorter::ORDER_[DEFAULT|REVERSED|RANDOMIZED|DURATION|SIZE]' - ); - } - - $allowedOrderDefects = [ - self::ORDER_DEFAULT, - self::ORDER_DEFECTS_FIRST, - ]; - - if (!\in_array($orderDefects, $allowedOrderDefects, true)) { - throw new Exception( - '$orderDefects must be one of TestSuiteSorter::ORDER_DEFAULT, TestSuiteSorter::ORDER_DEFECTS_FIRST' - ); - } - - if ($isRootTestSuite) { - $this->originalExecutionOrder = $this->calculateTestExecutionOrder($suite); - } - - if ($suite instanceof TestSuite) { - foreach ($suite as $_suite) { - $this->reorderTestsInSuite($_suite, $order, $resolveDependencies, $orderDefects, false); - } - - if ($orderDefects === self::ORDER_DEFECTS_FIRST) { - $this->addSuiteToDefectSortOrder($suite); - } - - $this->sort($suite, $order, $resolveDependencies, $orderDefects); - } - - if ($isRootTestSuite) { - $this->executionOrder = $this->calculateTestExecutionOrder($suite); - } - } - - public function getOriginalExecutionOrder(): array - { - return $this->originalExecutionOrder; - } - - public function getExecutionOrder(): array - { - return $this->executionOrder; - } - - private function sort(TestSuite $suite, int $order, bool $resolveDependencies, int $orderDefects): void - { - if (empty($suite->tests())) { - return; - } - - if ($order === self::ORDER_REVERSED) { - $suite->setTests($this->reverse($suite->tests())); - } elseif ($order === self::ORDER_RANDOMIZED) { - $suite->setTests($this->randomize($suite->tests())); - } elseif ($order === self::ORDER_DURATION && $this->cache !== null) { - $suite->setTests($this->sortByDuration($suite->tests())); - } elseif ($order === self::ORDER_SIZE) { - $suite->setTests($this->sortBySize($suite->tests())); - } - - if ($orderDefects === self::ORDER_DEFECTS_FIRST && $this->cache !== null) { - $suite->setTests($this->sortDefectsFirst($suite->tests())); - } - - if ($resolveDependencies && !($suite instanceof DataProviderTestSuite) && $this->suiteOnlyContainsTests($suite)) { - /** @var TestCase[] $tests */ - $tests = $suite->tests(); - - $suite->setTests($this->resolveDependencies($tests)); - } - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function addSuiteToDefectSortOrder(TestSuite $suite): void - { - $max = 0; - - foreach ($suite->tests() as $test) { - $testname = self::getTestSorterUID($test); - - if (!isset($this->defectSortOrder[$testname])) { - $this->defectSortOrder[$testname] = self::DEFECT_SORT_WEIGHT[$this->cache->getState($testname)]; - $max = \max($max, $this->defectSortOrder[$testname]); - } - } - - $this->defectSortOrder[$suite->getName()] = $max; - } - - private function suiteOnlyContainsTests(TestSuite $suite): bool - { - return \array_reduce( - $suite->tests(), - static function ($carry, $test) { - return $carry && ($test instanceof TestCase || $test instanceof DataProviderTestSuite); - }, - true - ); - } - - private function reverse(array $tests): array - { - return \array_reverse($tests); - } - - private function randomize(array $tests): array - { - \shuffle($tests); - - return $tests; - } - - private function sortDefectsFirst(array $tests): array - { - \usort( - $tests, - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - function ($left, $right) { - return $this->cmpDefectPriorityAndTime($left, $right); - } - ); - - return $tests; - } - - private function sortByDuration(array $tests): array - { - \usort( - $tests, - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - function ($left, $right) { - return $this->cmpDuration($left, $right); - } - ); - - return $tests; - } - - private function sortBySize(array $tests): array - { - \usort( - $tests, - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - function ($left, $right) { - return $this->cmpSize($left, $right); - } - ); - - return $tests; - } - - /** - * Comparator callback function to sort tests for "reach failure as fast as possible": - * 1. sort tests by defect weight defined in self::DEFECT_SORT_WEIGHT - * 2. when tests are equally defective, sort the fastest to the front - * 3. do not reorder successful tests - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function cmpDefectPriorityAndTime(Test $a, Test $b): int - { - $priorityA = $this->defectSortOrder[self::getTestSorterUID($a)] ?? 0; - $priorityB = $this->defectSortOrder[self::getTestSorterUID($b)] ?? 0; - - if ($priorityB <=> $priorityA) { - // Sort defect weight descending - return $priorityB <=> $priorityA; - } - - if ($priorityA || $priorityB) { - return $this->cmpDuration($a, $b); - } - - // do not change execution order - return 0; - } - - /** - * Compares test duration for sorting tests by duration ascending. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function cmpDuration(Test $a, Test $b): int - { - return $this->cache->getTime(self::getTestSorterUID($a)) <=> $this->cache->getTime(self::getTestSorterUID($b)); - } - - /** - * Compares test size for sorting tests small->medium->large->unknown - */ - private function cmpSize(Test $a, Test $b): int - { - $sizeA = ($a instanceof TestCase || $a instanceof DataProviderTestSuite) - ? $a->getSize() - : TestUtil::UNKNOWN; - $sizeB = ($b instanceof TestCase || $b instanceof DataProviderTestSuite) - ? $b->getSize() - : TestUtil::UNKNOWN; - - return self::SIZE_SORT_WEIGHT[$sizeA] <=> self::SIZE_SORT_WEIGHT[$sizeB]; - } - - /** - * Reorder Tests within a TestCase in such a way as to resolve as many dependencies as possible. - * The algorithm will leave the tests in original running order when it can. - * For more details see the documentation for test dependencies. - * - * Short description of algorithm: - * 1. Pick the next Test from remaining tests to be checked for dependencies. - * 2. If the test has no dependencies: mark done, start again from the top - * 3. If the test has dependencies but none left to do: mark done, start again from the top - * 4. When we reach the end add any leftover tests to the end. These will be marked 'skipped' during execution. - * - * @param array $tests - * - * @return array - */ - private function resolveDependencies(array $tests): array - { - $newTestOrder = []; - $i = 0; - - do { - $todoNames = \array_map( - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - static function ($test) { - return self::getTestSorterUID($test); - }, - $tests - ); - - if (!$tests[$i]->hasDependencies() || empty(\array_intersect($this->getNormalizedDependencyNames($tests[$i]), $todoNames))) { - $newTestOrder = \array_merge($newTestOrder, \array_splice($tests, $i, 1)); - $i = 0; - } else { - $i++; - } - } while (!empty($tests) && ($i < \count($tests))); - - return \array_merge($newTestOrder, $tests); - } - - /** - * @param DataProviderTestSuite|TestCase $test - * - * @return array A list of full test names as "TestSuiteClassName::testMethodName" - */ - private function getNormalizedDependencyNames($test): array - { - if ($test instanceof DataProviderTestSuite) { - $testClass = \substr($test->getName(), 0, \strpos($test->getName(), '::')); - } else { - $testClass = \get_class($test); - } - - $names = \array_map( - static function ($name) use ($testClass) { - return \strpos($name, '::') === false ? $testClass . '::' . $name : $name; - }, - $test->getDependencies() - ); - - return $names; - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function calculateTestExecutionOrder(Test $suite): array - { - $tests = []; - - if ($suite instanceof TestSuite) { - foreach ($suite->tests() as $test) { - if (!($test instanceof TestSuite)) { - $tests[] = self::getTestSorterUID($test); - } else { - $tests = \array_merge($tests, $this->calculateTestExecutionOrder($test)); - } - } - } - - return $tests; - } -} diff --git a/vendor/phpunit/phpunit/src/Runner/Version.php b/vendor/phpunit/phpunit/src/Runner/Version.php deleted file mode 100644 index 763c411..0000000 --- a/vendor/phpunit/phpunit/src/Runner/Version.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Runner; - -use SebastianBergmann\Version as VersionId; - -final class Version -{ - /** - * @var string - */ - private static $pharVersion = ''; - - /** - * @var string - */ - private static $version = ''; - - /** - * Returns the current version of PHPUnit. - */ - public static function id(): string - { - if (self::$pharVersion !== '') { - return self::$pharVersion; - } - - if (self::$version === '') { - self::$version = (new VersionId('8.5.8', \dirname(__DIR__, 2)))->getVersion(); - } - - return self::$version; - } - - public static function series(): string - { - if (\strpos(self::id(), '-')) { - $version = \explode('-', self::id())[0]; - } else { - $version = self::id(); - } - - return \implode('.', \array_slice(\explode('.', $version), 0, 2)); - } - - public static function getVersionString(): string - { - return 'PHPUnit ' . self::id() . ' by Sebastian Bergmann and contributors.'; - } - - public static function getReleaseChannel(): string - { - if (\strpos(self::$pharVersion, '-') !== false) { - return '-nightly'; - } - - return ''; - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Command.php b/vendor/phpunit/phpunit/src/TextUI/Command.php deleted file mode 100644 index 02ef34a..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Command.php +++ /dev/null @@ -1,1332 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use PharIo\Manifest\ApplicationName; -use PharIo\Manifest\Exception as ManifestException; -use PharIo\Manifest\ManifestLoader; -use PharIo\Version\Version as PharIoVersion; -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestListener; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Runner\StandardTestSuiteLoader; -use PHPUnit\Runner\TestSuiteLoader; -use PHPUnit\Runner\TestSuiteSorter; -use PHPUnit\Runner\Version; -use PHPUnit\Util\Configuration; -use PHPUnit\Util\ConfigurationGenerator; -use PHPUnit\Util\FileLoader; -use PHPUnit\Util\Filesystem; -use PHPUnit\Util\Getopt; -use PHPUnit\Util\Log\TeamCity; -use PHPUnit\Util\Printer; -use PHPUnit\Util\TestDox\CliTestDoxPrinter; -use PHPUnit\Util\TextTestListRenderer; -use PHPUnit\Util\XmlTestListRenderer; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; - -use Throwable; - -/** - * A TestRunner for the Command Line Interface (CLI) - * PHP SAPI Module. - */ -class Command -{ - /** - * @var array - */ - protected $arguments = [ - 'listGroups' => false, - 'listSuites' => false, - 'listTests' => false, - 'listTestsXml' => false, - 'loader' => null, - 'useDefaultConfiguration' => true, - 'loadedExtensions' => [], - 'notLoadedExtensions' => [], - ]; - - /** - * @var array - */ - protected $options = []; - - /** - * @var array - */ - protected $longOptions = [ - 'atleast-version=' => null, - 'prepend=' => null, - 'bootstrap=' => null, - 'cache-result' => null, - 'do-not-cache-result' => null, - 'cache-result-file=' => null, - 'check-version' => null, - 'colors==' => null, - 'columns=' => null, - 'configuration=' => null, - 'coverage-clover=' => null, - 'coverage-crap4j=' => null, - 'coverage-html=' => null, - 'coverage-php=' => null, - 'coverage-text==' => null, - 'coverage-xml=' => null, - 'debug' => null, - 'disallow-test-output' => null, - 'disallow-resource-usage' => null, - 'disallow-todo-tests' => null, - 'default-time-limit=' => null, - 'enforce-time-limit' => null, - 'exclude-group=' => null, - 'filter=' => null, - 'generate-configuration' => null, - 'globals-backup' => null, - 'group=' => null, - 'help' => null, - 'resolve-dependencies' => null, - 'ignore-dependencies' => null, - 'include-path=' => null, - 'list-groups' => null, - 'list-suites' => null, - 'list-tests' => null, - 'list-tests-xml=' => null, - 'loader=' => null, - 'log-junit=' => null, - 'log-teamcity=' => null, - 'no-configuration' => null, - 'no-coverage' => null, - 'no-logging' => null, - 'no-interaction' => null, - 'no-extensions' => null, - 'order-by=' => null, - 'printer=' => null, - 'process-isolation' => null, - 'repeat=' => null, - 'dont-report-useless-tests' => null, - 'random-order' => null, - 'random-order-seed=' => null, - 'reverse-order' => null, - 'reverse-list' => null, - 'static-backup' => null, - 'stderr' => null, - 'stop-on-defect' => null, - 'stop-on-error' => null, - 'stop-on-failure' => null, - 'stop-on-warning' => null, - 'stop-on-incomplete' => null, - 'stop-on-risky' => null, - 'stop-on-skipped' => null, - 'fail-on-warning' => null, - 'fail-on-risky' => null, - 'strict-coverage' => null, - 'disable-coverage-ignore' => null, - 'strict-global-state' => null, - 'teamcity' => null, - 'testdox' => null, - 'testdox-group=' => null, - 'testdox-exclude-group=' => null, - 'testdox-html=' => null, - 'testdox-text=' => null, - 'testdox-xml=' => null, - 'test-suffix=' => null, - 'testsuite=' => null, - 'verbose' => null, - 'version' => null, - 'whitelist=' => null, - 'dump-xdebug-filter=' => null, - ]; - - /** - * @var @psalm-var list - */ - private $warnings = []; - - /** - * @var bool - */ - private $versionStringPrinted = false; - - /** - * @throws \PHPUnit\Framework\Exception - */ - public static function main(bool $exit = true): int - { - return (new static)->run($_SERVER['argv'], $exit); - } - - /** - * @throws Exception - */ - public function run(array $argv, bool $exit = true): int - { - $this->handleArguments($argv); - - $runner = $this->createRunner(); - - if ($this->arguments['test'] instanceof Test) { - $suite = $this->arguments['test']; - } else { - $suite = $runner->getTest( - $this->arguments['test'], - $this->arguments['testFile'], - $this->arguments['testSuffixes'] - ); - } - - if ($this->arguments['listGroups']) { - return $this->handleListGroups($suite, $exit); - } - - if ($this->arguments['listSuites']) { - return $this->handleListSuites($exit); - } - - if ($this->arguments['listTests']) { - return $this->handleListTests($suite, $exit); - } - - if ($this->arguments['listTestsXml']) { - return $this->handleListTestsXml($suite, $this->arguments['listTestsXml'], $exit); - } - - unset($this->arguments['test'], $this->arguments['testFile']); - - try { - $result = $runner->doRun($suite, $this->arguments, $this->warnings, $exit); - } catch (Exception $e) { - print $e->getMessage() . \PHP_EOL; - } - - $return = TestRunner::FAILURE_EXIT; - - if (isset($result) && $result->wasSuccessful()) { - $return = TestRunner::SUCCESS_EXIT; - } elseif (!isset($result) || $result->errorCount() > 0) { - $return = TestRunner::EXCEPTION_EXIT; - } - - if ($exit) { - exit($return); - } - - return $return; - } - - /** - * Create a TestRunner, override in subclasses. - */ - protected function createRunner(): TestRunner - { - return new TestRunner($this->arguments['loader']); - } - - /** - * Handles the command-line arguments. - * - * A child class of PHPUnit\TextUI\Command can hook into the argument - * parsing by adding the switch(es) to the $longOptions array and point to a - * callback method that handles the switch(es) in the child class like this - * - * - * longOptions['my-switch'] = 'myHandler'; - * // my-secondswitch will accept a value - note the equals sign - * $this->longOptions['my-secondswitch='] = 'myOtherHandler'; - * } - * - * // --my-switch -> myHandler() - * protected function myHandler() - * { - * } - * - * // --my-secondswitch foo -> myOtherHandler('foo') - * protected function myOtherHandler ($value) - * { - * } - * - * // You will also need this - the static keyword in the - * // PHPUnit\TextUI\Command will mean that it'll be - * // PHPUnit\TextUI\Command that gets instantiated, - * // not MyCommand - * public static function main($exit = true) - * { - * $command = new static; - * - * return $command->run($_SERVER['argv'], $exit); - * } - * - * } - * - * - * @throws Exception - */ - protected function handleArguments(array $argv): void - { - try { - $this->options = Getopt::getopt( - $argv, - 'd:c:hv', - \array_keys($this->longOptions) - ); - } catch (Exception $t) { - $this->exitWithErrorMessage($t->getMessage()); - } - - foreach ($this->options[0] as $option) { - switch ($option[0]) { - case '--colors': - $this->arguments['colors'] = $option[1] ?: ResultPrinter::COLOR_AUTO; - - break; - - case '--bootstrap': - $this->arguments['bootstrap'] = $option[1]; - - break; - - case '--cache-result': - $this->arguments['cacheResult'] = true; - - break; - - case '--do-not-cache-result': - $this->arguments['cacheResult'] = false; - - break; - - case '--cache-result-file': - $this->arguments['cacheResultFile'] = $option[1]; - - break; - - case '--columns': - if (\is_numeric($option[1])) { - $this->arguments['columns'] = (int) $option[1]; - } elseif ($option[1] === 'max') { - $this->arguments['columns'] = 'max'; - } - - break; - - case 'c': - case '--configuration': - $this->arguments['configuration'] = $option[1]; - - break; - - case '--coverage-clover': - $this->arguments['coverageClover'] = $option[1]; - - break; - - case '--coverage-crap4j': - $this->arguments['coverageCrap4J'] = $option[1]; - - break; - - case '--coverage-html': - $this->arguments['coverageHtml'] = $option[1]; - - break; - - case '--coverage-php': - $this->arguments['coveragePHP'] = $option[1]; - - break; - - case '--coverage-text': - if ($option[1] === null) { - $option[1] = 'php://stdout'; - } - - $this->arguments['coverageText'] = $option[1]; - $this->arguments['coverageTextShowUncoveredFiles'] = false; - $this->arguments['coverageTextShowOnlySummary'] = false; - - break; - - case '--coverage-xml': - $this->arguments['coverageXml'] = $option[1]; - - break; - - case 'd': - $ini = \explode('=', $option[1]); - - if (isset($ini[0])) { - if (isset($ini[1])) { - \ini_set($ini[0], $ini[1]); - } else { - \ini_set($ini[0], '1'); - } - } - - break; - - case '--debug': - $this->arguments['debug'] = true; - - break; - - case 'h': - case '--help': - $this->showHelp(); - exit(TestRunner::SUCCESS_EXIT); - - break; - - case '--filter': - $this->arguments['filter'] = $option[1]; - - break; - - case '--testsuite': - $this->arguments['testsuite'] = $option[1]; - - break; - - case '--generate-configuration': - $this->printVersionString(); - - print 'Generating phpunit.xml in ' . \getcwd() . \PHP_EOL . \PHP_EOL; - - print 'Bootstrap script (relative to path shown above; default: vendor/autoload.php): '; - $bootstrapScript = \trim(\fgets(\STDIN)); - - print 'Tests directory (relative to path shown above; default: tests): '; - $testsDirectory = \trim(\fgets(\STDIN)); - - print 'Source directory (relative to path shown above; default: src): '; - $src = \trim(\fgets(\STDIN)); - - if ($bootstrapScript === '') { - $bootstrapScript = 'vendor/autoload.php'; - } - - if ($testsDirectory === '') { - $testsDirectory = 'tests'; - } - - if ($src === '') { - $src = 'src'; - } - - $generator = new ConfigurationGenerator; - - \file_put_contents( - 'phpunit.xml', - $generator->generateDefaultConfiguration( - Version::series(), - $bootstrapScript, - $testsDirectory, - $src - ) - ); - - print \PHP_EOL . 'Generated phpunit.xml in ' . \getcwd() . \PHP_EOL; - - exit(TestRunner::SUCCESS_EXIT); - - break; - - case '--group': - $this->arguments['groups'] = \explode(',', $option[1]); - - break; - - case '--exclude-group': - $this->arguments['excludeGroups'] = \explode( - ',', - $option[1] - ); - - break; - - case '--test-suffix': - $this->arguments['testSuffixes'] = \explode( - ',', - $option[1] - ); - - break; - - case '--include-path': - $includePath = $option[1]; - - break; - - case '--list-groups': - $this->arguments['listGroups'] = true; - - break; - - case '--list-suites': - $this->arguments['listSuites'] = true; - - break; - - case '--list-tests': - $this->arguments['listTests'] = true; - - break; - - case '--list-tests-xml': - $this->arguments['listTestsXml'] = $option[1]; - - break; - - case '--printer': - $this->arguments['printer'] = $option[1]; - - break; - - case '--loader': - $this->arguments['loader'] = $option[1]; - - break; - - case '--log-junit': - $this->arguments['junitLogfile'] = $option[1]; - - break; - - case '--log-teamcity': - $this->arguments['teamcityLogfile'] = $option[1]; - - break; - - case '--order-by': - $this->handleOrderByOption($option[1]); - - break; - - case '--process-isolation': - $this->arguments['processIsolation'] = true; - - break; - - case '--repeat': - $this->arguments['repeat'] = (int) $option[1]; - - break; - - case '--stderr': - $this->arguments['stderr'] = true; - - break; - - case '--stop-on-defect': - $this->arguments['stopOnDefect'] = true; - - break; - - case '--stop-on-error': - $this->arguments['stopOnError'] = true; - - break; - - case '--stop-on-failure': - $this->arguments['stopOnFailure'] = true; - - break; - - case '--stop-on-warning': - $this->arguments['stopOnWarning'] = true; - - break; - - case '--stop-on-incomplete': - $this->arguments['stopOnIncomplete'] = true; - - break; - - case '--stop-on-risky': - $this->arguments['stopOnRisky'] = true; - - break; - - case '--stop-on-skipped': - $this->arguments['stopOnSkipped'] = true; - - break; - - case '--fail-on-warning': - $this->arguments['failOnWarning'] = true; - - break; - - case '--fail-on-risky': - $this->arguments['failOnRisky'] = true; - - break; - - case '--teamcity': - $this->arguments['printer'] = TeamCity::class; - - break; - - case '--testdox': - $this->arguments['printer'] = CliTestDoxPrinter::class; - - break; - - case '--testdox-group': - $this->arguments['testdoxGroups'] = \explode( - ',', - $option[1] - ); - - break; - - case '--testdox-exclude-group': - $this->arguments['testdoxExcludeGroups'] = \explode( - ',', - $option[1] - ); - - break; - - case '--testdox-html': - $this->arguments['testdoxHTMLFile'] = $option[1]; - - break; - - case '--testdox-text': - $this->arguments['testdoxTextFile'] = $option[1]; - - break; - - case '--testdox-xml': - $this->arguments['testdoxXMLFile'] = $option[1]; - - break; - - case '--no-configuration': - $this->arguments['useDefaultConfiguration'] = false; - - break; - - case '--no-extensions': - $this->arguments['noExtensions'] = true; - - break; - - case '--no-coverage': - $this->arguments['noCoverage'] = true; - - break; - - case '--no-logging': - $this->arguments['noLogging'] = true; - - break; - - case '--no-interaction': - $this->arguments['noInteraction'] = true; - - break; - - case '--globals-backup': - $this->arguments['backupGlobals'] = true; - - break; - - case '--static-backup': - $this->arguments['backupStaticAttributes'] = true; - - break; - - case 'v': - case '--verbose': - $this->arguments['verbose'] = true; - - break; - - case '--atleast-version': - if (\version_compare(Version::id(), $option[1], '>=')) { - exit(TestRunner::SUCCESS_EXIT); - } - - exit(TestRunner::FAILURE_EXIT); - - break; - - case '--version': - $this->printVersionString(); - exit(TestRunner::SUCCESS_EXIT); - - break; - - case '--dont-report-useless-tests': - $this->arguments['reportUselessTests'] = false; - - break; - - case '--strict-coverage': - $this->arguments['strictCoverage'] = true; - - break; - - case '--disable-coverage-ignore': - $this->arguments['disableCodeCoverageIgnore'] = true; - - break; - - case '--strict-global-state': - $this->arguments['beStrictAboutChangesToGlobalState'] = true; - - break; - - case '--disallow-test-output': - $this->arguments['disallowTestOutput'] = true; - - break; - - case '--disallow-resource-usage': - $this->arguments['beStrictAboutResourceUsageDuringSmallTests'] = true; - - break; - - case '--default-time-limit': - $this->arguments['defaultTimeLimit'] = (int) $option[1]; - - break; - - case '--enforce-time-limit': - $this->arguments['enforceTimeLimit'] = true; - - break; - - case '--disallow-todo-tests': - $this->arguments['disallowTodoAnnotatedTests'] = true; - - break; - - case '--reverse-list': - $this->arguments['reverseList'] = true; - - break; - - case '--check-version': - $this->handleVersionCheck(); - - break; - - case '--whitelist': - $this->arguments['whitelist'] = $option[1]; - - break; - - case '--random-order': - $this->handleOrderByOption('random'); - - break; - - case '--random-order-seed': - $this->arguments['randomOrderSeed'] = (int) $option[1]; - - break; - - case '--resolve-dependencies': - $this->handleOrderByOption('depends'); - - break; - - case '--ignore-dependencies': - $this->handleOrderByOption('no-depends'); - - break; - - case '--reverse-order': - $this->handleOrderByOption('reverse'); - - break; - - case '--dump-xdebug-filter': - $this->arguments['xdebugFilterFile'] = $option[1]; - - break; - - default: - $optionName = \str_replace('--', '', $option[0]); - - $handler = null; - - if (isset($this->longOptions[$optionName])) { - $handler = $this->longOptions[$optionName]; - } elseif (isset($this->longOptions[$optionName . '='])) { - $handler = $this->longOptions[$optionName . '=']; - } - - if (isset($handler) && \is_callable([$this, $handler])) { - $this->$handler($option[1]); - } - } - } - - $this->handleCustomTestSuite(); - - if (!isset($this->arguments['testSuffixes'])) { - $this->arguments['testSuffixes'] = ['Test.php', '.phpt']; - } - - if (isset($this->options[1][0]) && - \substr($this->options[1][0], -5, 5) !== '.phpt' && - \substr($this->options[1][0], -4, 4) !== '.php' && - \substr($this->options[1][0], -1, 1) !== '/' && - !\is_dir($this->options[1][0])) { - $this->warnings[] = 'Invocation with class name is deprecated'; - } - - if (!isset($this->arguments['test'])) { - if (isset($this->options[1][0])) { - $this->arguments['test'] = $this->options[1][0]; - } - - if (isset($this->options[1][1])) { - $testFile = \realpath($this->options[1][1]); - - if ($testFile === false) { - $this->exitWithErrorMessage( - \sprintf( - 'Cannot open file "%s".', - $this->options[1][1] - ) - ); - } - $this->arguments['testFile'] = $testFile; - } else { - $this->arguments['testFile'] = ''; - } - - if (isset($this->arguments['test']) && - \is_file($this->arguments['test']) && - \strrpos($this->arguments['test'], '.') !== false && - \substr($this->arguments['test'], -5, 5) !== '.phpt') { - $this->arguments['testFile'] = \realpath($this->arguments['test']); - $this->arguments['test'] = \substr($this->arguments['test'], 0, \strrpos($this->arguments['test'], '.')); - } - - if (isset($this->arguments['test']) && - \is_string($this->arguments['test']) && - \substr($this->arguments['test'], -5, 5) === '.phpt') { - $suite = new TestSuite; - $suite->addTestFile($this->arguments['test']); - $this->arguments['test'] = $suite; - } - } - - if (isset($includePath)) { - \ini_set( - 'include_path', - $includePath . \PATH_SEPARATOR . \ini_get('include_path') - ); - } - - if ($this->arguments['loader'] !== null) { - $this->arguments['loader'] = $this->handleLoader($this->arguments['loader']); - } - - if (isset($this->arguments['configuration']) && - \is_dir($this->arguments['configuration'])) { - $configurationFile = $this->arguments['configuration'] . '/phpunit.xml'; - - if (\file_exists($configurationFile)) { - $this->arguments['configuration'] = \realpath( - $configurationFile - ); - } elseif (\file_exists($configurationFile . '.dist')) { - $this->arguments['configuration'] = \realpath( - $configurationFile . '.dist' - ); - } - } elseif (!isset($this->arguments['configuration']) && - $this->arguments['useDefaultConfiguration']) { - if (\file_exists('phpunit.xml')) { - $this->arguments['configuration'] = \realpath('phpunit.xml'); - } elseif (\file_exists('phpunit.xml.dist')) { - $this->arguments['configuration'] = \realpath( - 'phpunit.xml.dist' - ); - } - } - - if (isset($this->arguments['configuration'])) { - try { - $configuration = Configuration::getInstance( - $this->arguments['configuration'] - ); - } catch (Throwable $t) { - print $t->getMessage() . \PHP_EOL; - exit(TestRunner::FAILURE_EXIT); - } - - $phpunitConfiguration = $configuration->getPHPUnitConfiguration(); - - $configuration->handlePHPConfiguration(); - - /* - * Issue #1216 - */ - if (isset($this->arguments['bootstrap'])) { - $this->handleBootstrap($this->arguments['bootstrap']); - } elseif (isset($phpunitConfiguration['bootstrap'])) { - $this->handleBootstrap($phpunitConfiguration['bootstrap']); - } - - /* - * Issue #657 - */ - if (isset($phpunitConfiguration['stderr']) && !isset($this->arguments['stderr'])) { - $this->arguments['stderr'] = $phpunitConfiguration['stderr']; - } - - if (isset($phpunitConfiguration['extensionsDirectory']) && !isset($this->arguments['noExtensions']) && \extension_loaded('phar')) { - $this->handleExtensions($phpunitConfiguration['extensionsDirectory']); - } - - if (isset($phpunitConfiguration['columns']) && !isset($this->arguments['columns'])) { - $this->arguments['columns'] = $phpunitConfiguration['columns']; - } - - if (!isset($this->arguments['printer']) && isset($phpunitConfiguration['printerClass'])) { - $file = $phpunitConfiguration['printerFile'] ?? ''; - - $this->arguments['printer'] = $this->handlePrinter( - $phpunitConfiguration['printerClass'], - $file - ); - } - - if (isset($phpunitConfiguration['testSuiteLoaderClass'])) { - $file = $phpunitConfiguration['testSuiteLoaderFile'] ?? ''; - - $this->arguments['loader'] = $this->handleLoader( - $phpunitConfiguration['testSuiteLoaderClass'], - $file - ); - } - - if (!isset($this->arguments['testsuite']) && isset($phpunitConfiguration['defaultTestSuite'])) { - $this->arguments['testsuite'] = $phpunitConfiguration['defaultTestSuite']; - } - - if (!isset($this->arguments['test'])) { - $testSuite = $configuration->getTestSuiteConfiguration($this->arguments['testsuite'] ?? ''); - - if ($testSuite !== null) { - $this->arguments['test'] = $testSuite; - } - } - } elseif (isset($this->arguments['bootstrap'])) { - $this->handleBootstrap($this->arguments['bootstrap']); - } - - if (isset($this->arguments['printer']) && - \is_string($this->arguments['printer'])) { - $this->arguments['printer'] = $this->handlePrinter($this->arguments['printer']); - } - - if (!isset($this->arguments['test'])) { - $this->showHelp(); - exit(TestRunner::EXCEPTION_EXIT); - } - } - - /** - * Handles the loading of the PHPUnit\Runner\TestSuiteLoader implementation. - */ - protected function handleLoader(string $loaderClass, string $loaderFile = ''): ?TestSuiteLoader - { - if (!\class_exists($loaderClass, false)) { - if ($loaderFile == '') { - $loaderFile = Filesystem::classNameToFilename( - $loaderClass - ); - } - - $loaderFile = \stream_resolve_include_path($loaderFile); - - if ($loaderFile) { - require $loaderFile; - } - } - - if (\class_exists($loaderClass, false)) { - try { - $class = new \ReflectionClass($loaderClass); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if ($class->implementsInterface(TestSuiteLoader::class) && $class->isInstantiable()) { - $object = $class->newInstance(); - - \assert($object instanceof TestSuiteLoader); - - return $object; - } - } - - if ($loaderClass == StandardTestSuiteLoader::class) { - return null; - } - - $this->exitWithErrorMessage( - \sprintf( - 'Could not use "%s" as loader.', - $loaderClass - ) - ); - - return null; - } - - /** - * Handles the loading of the PHPUnit\Util\Printer implementation. - * - * @return null|Printer|string - */ - protected function handlePrinter(string $printerClass, string $printerFile = '') - { - if (!\class_exists($printerClass, false)) { - if ($printerFile == '') { - $printerFile = Filesystem::classNameToFilename( - $printerClass - ); - } - - $printerFile = \stream_resolve_include_path($printerFile); - - if ($printerFile) { - require $printerFile; - } - } - - if (!\class_exists($printerClass)) { - $this->exitWithErrorMessage( - \sprintf( - 'Could not use "%s" as printer: class does not exist', - $printerClass - ) - ); - } - - try { - $class = new \ReflectionClass($printerClass); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - // @codeCoverageIgnoreEnd - } - - if (!$class->implementsInterface(TestListener::class)) { - $this->exitWithErrorMessage( - \sprintf( - 'Could not use "%s" as printer: class does not implement %s', - $printerClass, - TestListener::class - ) - ); - } - - if (!$class->isSubclassOf(Printer::class)) { - $this->exitWithErrorMessage( - \sprintf( - 'Could not use "%s" as printer: class does not extend %s', - $printerClass, - Printer::class - ) - ); - } - - if (!$class->isInstantiable()) { - $this->exitWithErrorMessage( - \sprintf( - 'Could not use "%s" as printer: class cannot be instantiated', - $printerClass - ) - ); - } - - if ($class->isSubclassOf(ResultPrinter::class)) { - return $printerClass; - } - - $outputStream = isset($this->arguments['stderr']) ? 'php://stderr' : null; - - return $class->newInstance($outputStream); - } - - /** - * Loads a bootstrap file. - */ - protected function handleBootstrap(string $filename): void - { - try { - FileLoader::checkAndLoad($filename); - } catch (Exception $e) { - $this->exitWithErrorMessage($e->getMessage()); - } - } - - protected function handleVersionCheck(): void - { - $this->printVersionString(); - - $latestVersion = \file_get_contents('https://phar.phpunit.de/latest-version-of/phpunit'); - $isOutdated = \version_compare($latestVersion, Version::id(), '>'); - - if ($isOutdated) { - \printf( - 'You are not using the latest version of PHPUnit.' . \PHP_EOL . - 'The latest version is PHPUnit %s.' . \PHP_EOL, - $latestVersion - ); - } else { - print 'You are using the latest version of PHPUnit.' . \PHP_EOL; - } - - exit(TestRunner::SUCCESS_EXIT); - } - - /** - * Show the help message. - */ - protected function showHelp(): void - { - $this->printVersionString(); - (new Help)->writeToConsole(); - } - - /** - * Custom callback for test suite discovery. - */ - protected function handleCustomTestSuite(): void - { - } - - private function printVersionString(): void - { - if ($this->versionStringPrinted) { - return; - } - - print Version::getVersionString() . \PHP_EOL . \PHP_EOL; - - $this->versionStringPrinted = true; - } - - private function exitWithErrorMessage(string $message): void - { - $this->printVersionString(); - - print $message . \PHP_EOL; - - exit(TestRunner::FAILURE_EXIT); - } - - private function handleExtensions(string $directory): void - { - foreach ((new FileIteratorFacade)->getFilesAsArray($directory, '.phar') as $file) { - if (!\file_exists('phar://' . $file . '/manifest.xml')) { - $this->arguments['notLoadedExtensions'][] = $file . ' is not an extension for PHPUnit'; - - continue; - } - - try { - $applicationName = new ApplicationName('phpunit/phpunit'); - $version = new PharIoVersion(Version::series()); - $manifest = ManifestLoader::fromFile('phar://' . $file . '/manifest.xml'); - - if (!$manifest->isExtensionFor($applicationName)) { - $this->arguments['notLoadedExtensions'][] = $file . ' is not an extension for PHPUnit'; - - continue; - } - - if (!$manifest->isExtensionFor($applicationName, $version)) { - $this->arguments['notLoadedExtensions'][] = $file . ' is not compatible with this version of PHPUnit'; - - continue; - } - } catch (ManifestException $e) { - $this->arguments['notLoadedExtensions'][] = $file . ': ' . $e->getMessage(); - - continue; - } - - require $file; - - $this->arguments['loadedExtensions'][] = $manifest->getName() . ' ' . $manifest->getVersion()->getVersionString(); - } - } - - private function handleListGroups(TestSuite $suite, bool $exit): int - { - $this->printVersionString(); - - print 'Available test group(s):' . \PHP_EOL; - - $groups = $suite->getGroups(); - \sort($groups); - - foreach ($groups as $group) { - \printf( - ' - %s' . \PHP_EOL, - $group - ); - } - - if ($exit) { - exit(TestRunner::SUCCESS_EXIT); - } - - return TestRunner::SUCCESS_EXIT; - } - - /** - * @throws \PHPUnit\Framework\Exception - */ - private function handleListSuites(bool $exit): int - { - $this->printVersionString(); - - print 'Available test suite(s):' . \PHP_EOL; - - $configuration = Configuration::getInstance( - $this->arguments['configuration'] - ); - - foreach ($configuration->getTestSuiteNames() as $suiteName) { - \printf( - ' - %s' . \PHP_EOL, - $suiteName - ); - } - - if ($exit) { - exit(TestRunner::SUCCESS_EXIT); - } - - return TestRunner::SUCCESS_EXIT; - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function handleListTests(TestSuite $suite, bool $exit): int - { - $this->printVersionString(); - - $renderer = new TextTestListRenderer; - - print $renderer->render($suite); - - if ($exit) { - exit(TestRunner::SUCCESS_EXIT); - } - - return TestRunner::SUCCESS_EXIT; - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function handleListTestsXml(TestSuite $suite, string $target, bool $exit): int - { - $this->printVersionString(); - - $renderer = new XmlTestListRenderer; - - \file_put_contents($target, $renderer->render($suite)); - - \printf( - 'Wrote list of tests that would have been run to %s' . \PHP_EOL, - $target - ); - - if ($exit) { - exit(TestRunner::SUCCESS_EXIT); - } - - return TestRunner::SUCCESS_EXIT; - } - - private function handleOrderByOption(string $value): void - { - foreach (\explode(',', $value) as $order) { - switch ($order) { - case 'default': - $this->arguments['executionOrder'] = TestSuiteSorter::ORDER_DEFAULT; - $this->arguments['executionOrderDefects'] = TestSuiteSorter::ORDER_DEFAULT; - $this->arguments['resolveDependencies'] = true; - - break; - - case 'defects': - $this->arguments['executionOrderDefects'] = TestSuiteSorter::ORDER_DEFECTS_FIRST; - - break; - - case 'depends': - $this->arguments['resolveDependencies'] = true; - - break; - - case 'duration': - $this->arguments['executionOrder'] = TestSuiteSorter::ORDER_DURATION; - - break; - - case 'no-depends': - $this->arguments['resolveDependencies'] = false; - - break; - - case 'random': - $this->arguments['executionOrder'] = TestSuiteSorter::ORDER_RANDOMIZED; - - break; - - case 'reverse': - $this->arguments['executionOrder'] = TestSuiteSorter::ORDER_REVERSED; - - break; - - case 'size': - $this->arguments['executionOrder'] = TestSuiteSorter::ORDER_SIZE; - - break; - - default: - $this->exitWithErrorMessage("unrecognized --order-by option: $order"); - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Exception.php b/vendor/phpunit/phpunit/src/TextUI/Exception.php deleted file mode 100644 index a660a87..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Exception.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Exception extends \RuntimeException implements \PHPUnit\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/TextUI/Help.php b/vendor/phpunit/phpunit/src/TextUI/Help.php deleted file mode 100644 index b2a5c6d..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/Help.php +++ /dev/null @@ -1,246 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use PHPUnit\Util\Color; -use SebastianBergmann\Environment\Console; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Help -{ - private const LEFT_MARGIN = ' '; - - private const HELP_TEXT = [ - 'Usage' => [ - ['text' => 'phpunit [options] UnitTest [UnitTest.php]'], - ['text' => 'phpunit [options] '], - ], - 'Code Coverage Options' => [ - ['arg' => '--coverage-clover ', 'desc' => 'Generate code coverage report in Clover XML format'], - ['arg' => '--coverage-crap4j ', 'desc' => 'Generate code coverage report in Crap4J XML format'], - ['arg' => '--coverage-html ', 'desc' => 'Generate code coverage report in HTML format'], - ['arg' => '--coverage-php ', 'desc' => 'Export PHP_CodeCoverage object to file'], - ['arg' => '--coverage-text=', 'desc' => 'Generate code coverage report in text format [default: standard output]'], - ['arg' => '--coverage-xml ', 'desc' => 'Generate code coverage report in PHPUnit XML format'], - ['arg' => '--whitelist ', 'desc' => 'Whitelist for code coverage analysis'], - ['arg' => '--disable-coverage-ignore', 'desc' => 'Disable annotations for ignoring code coverage'], - ['arg' => '--no-coverage', 'desc' => 'Ignore code coverage configuration'], - ['arg' => '--dump-xdebug-filter ', 'desc' => 'Generate script to set Xdebug code coverage filter'], - ], - - 'Logging Options' => [ - ['arg' => '--log-junit ', 'desc' => 'Log test execution in JUnit XML format to file'], - ['arg' => '--log-teamcity ', 'desc' => 'Log test execution in TeamCity format to file'], - ['arg' => '--testdox-html ', 'desc' => 'Write agile documentation in HTML format to file'], - ['arg' => '--testdox-text ', 'desc' => 'Write agile documentation in Text format to file'], - ['arg' => '--testdox-xml ', 'desc' => 'Write agile documentation in XML format to file'], - ['arg' => '--reverse-list', 'desc' => 'Print defects in reverse order'], - ], - - 'Test Selection Options' => [ - ['arg' => '--filter ', 'desc' => 'Filter which tests to run'], - ['arg' => '--testsuite ', 'desc' => 'Filter which testsuite to run'], - ['arg' => '--group ', 'desc' => 'Only runs tests from the specified group(s)'], - ['arg' => '--exclude-group ', 'desc' => 'Exclude tests from the specified group(s)'], - ['arg' => '--list-groups', 'desc' => 'List available test groups'], - ['arg' => '--list-suites', 'desc' => 'List available test suites'], - ['arg' => '--list-tests', 'desc' => 'List available tests'], - ['arg' => '--list-tests-xml ', 'desc' => 'List available tests in XML format'], - ['arg' => '--test-suffix ', 'desc' => 'Only search for test in files with specified suffix(es). Default: Test.php,.phpt'], - ], - - 'Test Execution Options' => [ - ['arg' => '--dont-report-useless-tests', 'desc' => 'Do not report tests that do not test anything'], - ['arg' => '--strict-coverage', 'desc' => 'Be strict about @covers annotation usage'], - ['arg' => '--strict-global-state', 'desc' => 'Be strict about changes to global state'], - ['arg' => '--disallow-test-output', 'desc' => 'Be strict about output during tests'], - ['arg' => '--disallow-resource-usage', 'desc' => 'Be strict about resource usage during small tests'], - ['arg' => '--enforce-time-limit', 'desc' => 'Enforce time limit based on test size'], - ['arg' => '--default-time-limit=', 'desc' => 'Timeout in seconds for tests without @small, @medium or @large'], - ['arg' => '--disallow-todo-tests', 'desc' => 'Disallow @todo-annotated tests'], - ['spacer' => ''], - - ['arg' => '--process-isolation', 'desc' => 'Run each test in a separate PHP process'], - ['arg' => '--globals-backup', 'desc' => 'Backup and restore $GLOBALS for each test'], - ['arg' => '--static-backup', 'desc' => 'Backup and restore static attributes for each test'], - ['spacer' => ''], - - ['arg' => '--colors=', 'desc' => 'Use colors in output ("never", "auto" or "always")'], - ['arg' => '--columns ', 'desc' => 'Number of columns to use for progress output'], - ['arg' => '--columns max', 'desc' => 'Use maximum number of columns for progress output'], - ['arg' => '--stderr', 'desc' => 'Write to STDERR instead of STDOUT'], - ['arg' => '--stop-on-defect', 'desc' => 'Stop execution upon first not-passed test'], - ['arg' => '--stop-on-error', 'desc' => 'Stop execution upon first error'], - ['arg' => '--stop-on-failure', 'desc' => 'Stop execution upon first error or failure'], - ['arg' => '--stop-on-warning', 'desc' => 'Stop execution upon first warning'], - ['arg' => '--stop-on-risky', 'desc' => 'Stop execution upon first risky test'], - ['arg' => '--stop-on-skipped', 'desc' => 'Stop execution upon first skipped test'], - ['arg' => '--stop-on-incomplete', 'desc' => 'Stop execution upon first incomplete test'], - ['arg' => '--fail-on-warning', 'desc' => 'Treat tests with warnings as failures'], - ['arg' => '--fail-on-risky', 'desc' => 'Treat risky tests as failures'], - ['arg' => '-v|--verbose', 'desc' => 'Output more verbose information'], - ['arg' => '--debug', 'desc' => 'Display debugging information'], - ['spacer' => ''], - - ['arg' => '--loader ', 'desc' => 'TestSuiteLoader implementation to use'], - ['arg' => '--repeat ', 'desc' => 'Runs the test(s) repeatedly'], - ['arg' => '--teamcity', 'desc' => 'Report test execution progress in TeamCity format'], - ['arg' => '--testdox', 'desc' => 'Report test execution progress in TestDox format'], - ['arg' => '--testdox-group', 'desc' => 'Only include tests from the specified group(s)'], - ['arg' => '--testdox-exclude-group', 'desc' => 'Exclude tests from the specified group(s)'], - ['arg' => '--no-interaction', 'desc' => 'Disable TestDox progress animation'], - ['arg' => '--printer ', 'desc' => 'TestListener implementation to use'], - ['spacer' => ''], - - ['arg' => '--order-by=', 'desc' => 'Run tests in order: default|defects|duration|no-depends|random|reverse|size'], - ['arg' => '--random-order-seed=', 'desc' => 'Use a specific random seed for random order'], - ['arg' => '--cache-result', 'desc' => 'Write test results to cache file'], - ['arg' => '--do-not-cache-result', 'desc' => 'Do not write test results to cache file'], - ], - - 'Configuration Options' => [ - ['arg' => '--prepend ', 'desc' => 'A PHP script that is included as early as possible'], - ['arg' => '--bootstrap ', 'desc' => 'A PHP script that is included before the tests run'], - ['arg' => '-c|--configuration ', 'desc' => 'Read configuration from XML file'], - ['arg' => '--no-configuration', 'desc' => 'Ignore default configuration file (phpunit.xml)'], - ['arg' => '--no-logging', 'desc' => 'Ignore logging configuration'], - ['arg' => '--no-extensions', 'desc' => 'Do not load PHPUnit extensions'], - ['arg' => '--include-path ', 'desc' => 'Prepend PHP\'s include_path with given path(s)'], - ['arg' => '-d ', 'desc' => 'Sets a php.ini value'], - ['arg' => '--generate-configuration', 'desc' => 'Generate configuration file with suggested settings'], - ['arg' => '--cache-result-file=', 'desc' => 'Specify result cache path and filename'], - ], - - 'Miscellaneous Options' => [ - ['arg' => '-h|--help', 'desc' => 'Prints this usage information'], - ['arg' => '--version', 'desc' => 'Prints the version and exits'], - ['arg' => '--atleast-version ', 'desc' => 'Checks that version is greater than min and exits'], - ['arg' => '--check-version', 'desc' => 'Check whether PHPUnit is the latest version'], - ], - - ]; - - /** - * @var int Number of columns required to write the longest option name to the console - */ - private $maxArgLength = 0; - - /** - * @var int Number of columns left for the description field after padding and option - */ - private $maxDescLength; - - /** - * @var bool Use color highlights for sections, options and parameters - */ - private $hasColor = false; - - public function __construct(?int $width = null, ?bool $withColor = null) - { - if ($width === null) { - $width = (new Console)->getNumberOfColumns(); - } - - if ($withColor === null) { - $this->hasColor = (new Console)->hasColorSupport(); - } else { - $this->hasColor = $withColor; - } - - foreach (self::HELP_TEXT as $options) { - foreach ($options as $option) { - if (isset($option['arg'])) { - $this->maxArgLength = \max($this->maxArgLength, isset($option['arg']) ? \strlen($option['arg']) : 0); - } - } - } - - $this->maxDescLength = $width - $this->maxArgLength - 4; - } - - /** - * Write the help file to the CLI, adapting width and colors to the console - */ - public function writeToConsole(): void - { - if ($this->hasColor) { - $this->writeWithColor(); - } else { - $this->writePlaintext(); - } - } - - private function writePlaintext(): void - { - foreach (self::HELP_TEXT as $section => $options) { - print "$section:" . \PHP_EOL; - - if ($section !== 'Usage') { - print \PHP_EOL; - } - - foreach ($options as $option) { - if (isset($option['spacer'])) { - print \PHP_EOL; - } - - if (isset($option['text'])) { - print self::LEFT_MARGIN . $option['text'] . \PHP_EOL; - } - - if (isset($option['arg'])) { - $arg = \str_pad($option['arg'], $this->maxArgLength); - print self::LEFT_MARGIN . $arg . ' ' . $option['desc'] . \PHP_EOL; - } - } - - print \PHP_EOL; - } - } - - private function writeWithColor(): void - { - foreach (self::HELP_TEXT as $section => $options) { - print Color::colorize('fg-yellow', "$section:") . \PHP_EOL; - - foreach ($options as $option) { - if (isset($option['spacer'])) { - print \PHP_EOL; - } - - if (isset($option['text'])) { - print self::LEFT_MARGIN . $option['text'] . \PHP_EOL; - } - - if (isset($option['arg'])) { - $arg = Color::colorize('fg-green', \str_pad($option['arg'], $this->maxArgLength)); - $arg = \preg_replace_callback( - '/(<[^>]+>)/', - static function ($matches) { - return Color::colorize('fg-cyan', $matches[0]); - }, - $arg - ); - $desc = \explode(\PHP_EOL, \wordwrap($option['desc'], $this->maxDescLength, \PHP_EOL)); - - print self::LEFT_MARGIN . $arg . ' ' . $desc[0] . \PHP_EOL; - - for ($i = 1; $i < \count($desc); $i++) { - print \str_repeat(' ', $this->maxArgLength + 3) . $desc[$i] . \PHP_EOL; - } - } - } - - print \PHP_EOL; - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php b/vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php deleted file mode 100644 index bbe7215..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php +++ /dev/null @@ -1,572 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use PHPUnit\Framework\AssertionFailedError; -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\InvalidArgumentException; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestFailure; -use PHPUnit\Framework\TestListener; -use PHPUnit\Framework\TestResult; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Framework\Warning; -use PHPUnit\Runner\PhptTestCase; -use PHPUnit\Util\Color; -use PHPUnit\Util\Printer; -use SebastianBergmann\Environment\Console; -use SebastianBergmann\Timer\Timer; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class ResultPrinter extends Printer implements TestListener -{ - public const EVENT_TEST_START = 0; - - public const EVENT_TEST_END = 1; - - public const EVENT_TESTSUITE_START = 2; - - public const EVENT_TESTSUITE_END = 3; - - public const COLOR_NEVER = 'never'; - - public const COLOR_AUTO = 'auto'; - - public const COLOR_ALWAYS = 'always'; - - public const COLOR_DEFAULT = self::COLOR_NEVER; - - private const AVAILABLE_COLORS = [self::COLOR_NEVER, self::COLOR_AUTO, self::COLOR_ALWAYS]; - - /** - * @var int - */ - protected $column = 0; - - /** - * @var int - */ - protected $maxColumn; - - /** - * @var bool - */ - protected $lastTestFailed = false; - - /** - * @var int - */ - protected $numAssertions = 0; - - /** - * @var int - */ - protected $numTests = -1; - - /** - * @var int - */ - protected $numTestsRun = 0; - - /** - * @var int - */ - protected $numTestsWidth; - - /** - * @var bool - */ - protected $colors = false; - - /** - * @var bool - */ - protected $debug = false; - - /** - * @var bool - */ - protected $verbose = false; - - /** - * @var int - */ - private $numberOfColumns; - - /** - * @var bool - */ - private $reverse; - - /** - * @var bool - */ - private $defectListPrinted = false; - - /** - * Constructor. - * - * @param null|resource|string $out - * @param int|string $numberOfColumns - * - * @throws Exception - */ - public function __construct($out = null, bool $verbose = false, string $colors = self::COLOR_DEFAULT, bool $debug = false, $numberOfColumns = 80, bool $reverse = false) - { - parent::__construct($out); - - if (!\in_array($colors, self::AVAILABLE_COLORS, true)) { - throw InvalidArgumentException::create( - 3, - \vsprintf('value from "%s", "%s" or "%s"', self::AVAILABLE_COLORS) - ); - } - - if (!\is_int($numberOfColumns) && $numberOfColumns !== 'max') { - throw InvalidArgumentException::create(5, 'integer or "max"'); - } - - $console = new Console; - $maxNumberOfColumns = $console->getNumberOfColumns(); - - if ($numberOfColumns === 'max' || ($numberOfColumns !== 80 && $numberOfColumns > $maxNumberOfColumns)) { - $numberOfColumns = $maxNumberOfColumns; - } - - $this->numberOfColumns = $numberOfColumns; - $this->verbose = $verbose; - $this->debug = $debug; - $this->reverse = $reverse; - - if ($colors === self::COLOR_AUTO && $console->hasColorSupport()) { - $this->colors = true; - } else { - $this->colors = (self::COLOR_ALWAYS === $colors); - } - } - - /** - * @throws \SebastianBergmann\Timer\RuntimeException - */ - public function printResult(TestResult $result): void - { - $this->printHeader($result); - $this->printErrors($result); - $this->printWarnings($result); - $this->printFailures($result); - $this->printRisky($result); - - if ($this->verbose) { - $this->printIncompletes($result); - $this->printSkipped($result); - } - - $this->printFooter($result); - } - - /** - * An error occurred. - */ - public function addError(Test $test, \Throwable $t, float $time): void - { - $this->writeProgressWithColor('fg-red, bold', 'E'); - $this->lastTestFailed = true; - } - - /** - * A failure occurred. - */ - public function addFailure(Test $test, AssertionFailedError $e, float $time): void - { - $this->writeProgressWithColor('bg-red, fg-white', 'F'); - $this->lastTestFailed = true; - } - - /** - * A warning occurred. - */ - public function addWarning(Test $test, Warning $e, float $time): void - { - $this->writeProgressWithColor('fg-yellow, bold', 'W'); - $this->lastTestFailed = true; - } - - /** - * Incomplete test. - */ - public function addIncompleteTest(Test $test, \Throwable $t, float $time): void - { - $this->writeProgressWithColor('fg-yellow, bold', 'I'); - $this->lastTestFailed = true; - } - - /** - * Risky test. - */ - public function addRiskyTest(Test $test, \Throwable $t, float $time): void - { - $this->writeProgressWithColor('fg-yellow, bold', 'R'); - $this->lastTestFailed = true; - } - - /** - * Skipped test. - */ - public function addSkippedTest(Test $test, \Throwable $t, float $time): void - { - $this->writeProgressWithColor('fg-cyan, bold', 'S'); - $this->lastTestFailed = true; - } - - /** - * A testsuite started. - */ - public function startTestSuite(TestSuite $suite): void - { - if ($this->numTests == -1) { - $this->numTests = \count($suite); - $this->numTestsWidth = \strlen((string) $this->numTests); - $this->maxColumn = $this->numberOfColumns - \strlen(' / (XXX%)') - (2 * $this->numTestsWidth); - } - } - - /** - * A testsuite ended. - */ - public function endTestSuite(TestSuite $suite): void - { - } - - /** - * A test started. - */ - public function startTest(Test $test): void - { - if ($this->debug) { - $this->write( - \sprintf( - "Test '%s' started\n", - \PHPUnit\Util\Test::describeAsString($test) - ) - ); - } - } - - /** - * A test ended. - */ - public function endTest(Test $test, float $time): void - { - if ($this->debug) { - $this->write( - \sprintf( - "Test '%s' ended\n", - \PHPUnit\Util\Test::describeAsString($test) - ) - ); - } - - if (!$this->lastTestFailed) { - $this->writeProgress('.'); - } - - if ($test instanceof TestCase) { - $this->numAssertions += $test->getNumAssertions(); - } elseif ($test instanceof PhptTestCase) { - $this->numAssertions++; - } - - $this->lastTestFailed = false; - - if ($test instanceof TestCase && !$test->hasExpectationOnOutput()) { - $this->write($test->getActualOutput()); - } - } - - protected function printDefects(array $defects, string $type): void - { - $count = \count($defects); - - if ($count == 0) { - return; - } - - if ($this->defectListPrinted) { - $this->write("\n--\n\n"); - } - - $this->write( - \sprintf( - "There %s %d %s%s:\n", - ($count == 1) ? 'was' : 'were', - $count, - $type, - ($count == 1) ? '' : 's' - ) - ); - - $i = 1; - - if ($this->reverse) { - $defects = \array_reverse($defects); - } - - foreach ($defects as $defect) { - $this->printDefect($defect, $i++); - } - - $this->defectListPrinted = true; - } - - protected function printDefect(TestFailure $defect, int $count): void - { - $this->printDefectHeader($defect, $count); - $this->printDefectTrace($defect); - } - - protected function printDefectHeader(TestFailure $defect, int $count): void - { - $this->write( - \sprintf( - "\n%d) %s\n", - $count, - $defect->getTestName() - ) - ); - } - - protected function printDefectTrace(TestFailure $defect): void - { - $e = $defect->thrownException(); - $this->write((string) $e); - - while ($e = $e->getPrevious()) { - $this->write("\nCaused by\n" . $e); - } - } - - protected function printErrors(TestResult $result): void - { - $this->printDefects($result->errors(), 'error'); - } - - protected function printFailures(TestResult $result): void - { - $this->printDefects($result->failures(), 'failure'); - } - - protected function printWarnings(TestResult $result): void - { - $this->printDefects($result->warnings(), 'warning'); - } - - protected function printIncompletes(TestResult $result): void - { - $this->printDefects($result->notImplemented(), 'incomplete test'); - } - - protected function printRisky(TestResult $result): void - { - $this->printDefects($result->risky(), 'risky test'); - } - - protected function printSkipped(TestResult $result): void - { - $this->printDefects($result->skipped(), 'skipped test'); - } - - /** - * @throws \SebastianBergmann\Timer\RuntimeException - */ - protected function printHeader(TestResult $result): void - { - if (\count($result) > 0) { - $this->write(\PHP_EOL . \PHP_EOL . Timer::resourceUsage() . \PHP_EOL . \PHP_EOL); - } - } - - protected function printFooter(TestResult $result): void - { - if (\count($result) === 0) { - $this->writeWithColor( - 'fg-black, bg-yellow', - 'No tests executed!' - ); - - return; - } - - if ($result->wasSuccessfulAndNoTestIsRiskyOrSkippedOrIncomplete()) { - $this->writeWithColor( - 'fg-black, bg-green', - \sprintf( - 'OK (%d test%s, %d assertion%s)', - \count($result), - (\count($result) == 1) ? '' : 's', - $this->numAssertions, - ($this->numAssertions == 1) ? '' : 's' - ) - ); - - return; - } - - $color = 'fg-black, bg-yellow'; - - if ($result->wasSuccessful()) { - if ($this->verbose || !$result->allHarmless()) { - $this->write("\n"); - } - - $this->writeWithColor( - $color, - 'OK, but incomplete, skipped, or risky tests!' - ); - } else { - $this->write("\n"); - - if ($result->errorCount()) { - $color = 'fg-white, bg-red'; - - $this->writeWithColor( - $color, - 'ERRORS!' - ); - } elseif ($result->failureCount()) { - $color = 'fg-white, bg-red'; - - $this->writeWithColor( - $color, - 'FAILURES!' - ); - } elseif ($result->warningCount()) { - $color = 'fg-black, bg-yellow'; - - $this->writeWithColor( - $color, - 'WARNINGS!' - ); - } - } - - $this->writeCountString(\count($result), 'Tests', $color, true); - $this->writeCountString($this->numAssertions, 'Assertions', $color, true); - $this->writeCountString($result->errorCount(), 'Errors', $color); - $this->writeCountString($result->failureCount(), 'Failures', $color); - $this->writeCountString($result->warningCount(), 'Warnings', $color); - $this->writeCountString($result->skippedCount(), 'Skipped', $color); - $this->writeCountString($result->notImplementedCount(), 'Incomplete', $color); - $this->writeCountString($result->riskyCount(), 'Risky', $color); - $this->writeWithColor($color, '.'); - } - - protected function writeProgress(string $progress): void - { - if ($this->debug) { - return; - } - - $this->write($progress); - $this->column++; - $this->numTestsRun++; - - if ($this->column == $this->maxColumn || $this->numTestsRun == $this->numTests) { - if ($this->numTestsRun == $this->numTests) { - $this->write(\str_repeat(' ', $this->maxColumn - $this->column)); - } - - $this->write( - \sprintf( - ' %' . $this->numTestsWidth . 'd / %' . - $this->numTestsWidth . 'd (%3s%%)', - $this->numTestsRun, - $this->numTests, - \floor(($this->numTestsRun / $this->numTests) * 100) - ) - ); - - if ($this->column == $this->maxColumn) { - $this->writeNewLine(); - } - } - } - - protected function writeNewLine(): void - { - $this->column = 0; - $this->write("\n"); - } - - /** - * Formats a buffer with a specified ANSI color sequence if colors are - * enabled. - */ - protected function colorizeTextBox(string $color, string $buffer): string - { - if (!$this->colors) { - return $buffer; - } - - $lines = \preg_split('/\r\n|\r|\n/', $buffer); - $padding = \max(\array_map('\strlen', $lines)); - - $styledLines = []; - - foreach ($lines as $line) { - $styledLines[] = Color::colorize($color, \str_pad($line, $padding)); - } - - return \implode(\PHP_EOL, $styledLines); - } - - /** - * Writes a buffer out with a color sequence if colors are enabled. - */ - protected function writeWithColor(string $color, string $buffer, bool $lf = true): void - { - $this->write($this->colorizeTextBox($color, $buffer)); - - if ($lf) { - $this->write(\PHP_EOL); - } - } - - /** - * Writes progress with a color sequence if colors are enabled. - */ - protected function writeProgressWithColor(string $color, string $buffer): void - { - $buffer = $this->colorizeTextBox($color, $buffer); - $this->writeProgress($buffer); - } - - private function writeCountString(int $count, string $name, string $color, bool $always = false): void - { - static $first = true; - - if ($always || $count > 0) { - $this->writeWithColor( - $color, - \sprintf( - '%s%s: %d', - !$first ? ', ' : '', - $name, - $count - ), - false - ); - - $first = false; - } - } -} diff --git a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php b/vendor/phpunit/phpunit/src/TextUI/TestRunner.php deleted file mode 100644 index ecbef74..0000000 --- a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php +++ /dev/null @@ -1,1363 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\TextUI; - -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestListener; -use PHPUnit\Framework\TestResult; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Runner\AfterLastTestHook; -use PHPUnit\Runner\BaseTestRunner; -use PHPUnit\Runner\BeforeFirstTestHook; -use PHPUnit\Runner\DefaultTestResultCache; -use PHPUnit\Runner\Filter\ExcludeGroupFilterIterator; -use PHPUnit\Runner\Filter\Factory; -use PHPUnit\Runner\Filter\IncludeGroupFilterIterator; -use PHPUnit\Runner\Filter\NameFilterIterator; -use PHPUnit\Runner\Hook; -use PHPUnit\Runner\NullTestResultCache; -use PHPUnit\Runner\ResultCacheExtension; -use PHPUnit\Runner\StandardTestSuiteLoader; -use PHPUnit\Runner\TestHook; -use PHPUnit\Runner\TestListenerAdapter; -use PHPUnit\Runner\TestSuiteLoader; -use PHPUnit\Runner\TestSuiteSorter; -use PHPUnit\Runner\Version; -use PHPUnit\Util\Configuration; -use PHPUnit\Util\Filesystem; -use PHPUnit\Util\Log\JUnit; -use PHPUnit\Util\Log\TeamCity; -use PHPUnit\Util\Printer; -use PHPUnit\Util\TestDox\CliTestDoxPrinter; -use PHPUnit\Util\TestDox\HtmlResultPrinter; -use PHPUnit\Util\TestDox\TextResultPrinter; -use PHPUnit\Util\TestDox\XmlResultPrinter; -use PHPUnit\Util\XdebugFilterScriptGenerator; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeCoverage\Exception as CodeCoverageException; -use SebastianBergmann\CodeCoverage\Filter as CodeCoverageFilter; -use SebastianBergmann\CodeCoverage\Report\Clover as CloverReport; -use SebastianBergmann\CodeCoverage\Report\Crap4j as Crap4jReport; -use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport; -use SebastianBergmann\CodeCoverage\Report\PHP as PhpReport; -use SebastianBergmann\CodeCoverage\Report\Text as TextReport; -use SebastianBergmann\CodeCoverage\Report\Xml\Facade as XmlReport; -use SebastianBergmann\Comparator\Comparator; -use SebastianBergmann\Environment\Runtime; -use SebastianBergmann\Invoker\Invoker; -use SebastianBergmann\Timer\Timer; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TestRunner extends BaseTestRunner -{ - public const SUCCESS_EXIT = 0; - - public const FAILURE_EXIT = 1; - - public const EXCEPTION_EXIT = 2; - - /** - * @var bool - */ - private static $versionStringPrinted = false; - - /** - * @var CodeCoverageFilter - */ - private $codeCoverageFilter; - - /** - * @var TestSuiteLoader - */ - private $loader; - - /** - * @psalm-var Printer&TestListener - */ - private $printer; - - /** - * @var Runtime - */ - private $runtime; - - /** - * @var bool - */ - private $messagePrinted = false; - - /** - * @var Hook[] - */ - private $extensions = []; - - public function __construct(TestSuiteLoader $loader = null, CodeCoverageFilter $filter = null) - { - if ($filter === null) { - $filter = new CodeCoverageFilter; - } - - $this->codeCoverageFilter = $filter; - $this->loader = $loader; - $this->runtime = new Runtime; - } - - /** - * @throws \PHPUnit\Runner\Exception - * @throws Exception - */ - public function doRun(Test $suite, array $arguments = [], array $warnings = [], bool $exit = true): TestResult - { - if (isset($arguments['configuration'])) { - $GLOBALS['__PHPUNIT_CONFIGURATION_FILE'] = $arguments['configuration']; - } - - $this->handleConfiguration($arguments); - - if (\is_int($arguments['columns']) && $arguments['columns'] < 16) { - $arguments['columns'] = 16; - $tooFewColumnsRequested = true; - } - - if (isset($arguments['bootstrap'])) { - $GLOBALS['__PHPUNIT_BOOTSTRAP'] = $arguments['bootstrap']; - } - - if ($suite instanceof TestCase || $suite instanceof TestSuite) { - if ($arguments['backupGlobals'] === true) { - $suite->setBackupGlobals(true); - } - - if ($arguments['backupStaticAttributes'] === true) { - $suite->setBackupStaticAttributes(true); - } - - if ($arguments['beStrictAboutChangesToGlobalState'] === true) { - $suite->setBeStrictAboutChangesToGlobalState(true); - } - } - - if ($arguments['executionOrder'] === TestSuiteSorter::ORDER_RANDOMIZED) { - \mt_srand($arguments['randomOrderSeed']); - } - - if ($arguments['cacheResult']) { - if (!isset($arguments['cacheResultFile'])) { - if (isset($arguments['configuration']) && $arguments['configuration'] instanceof Configuration) { - $cacheLocation = $arguments['configuration']->getFilename(); - } else { - $cacheLocation = $_SERVER['PHP_SELF']; - } - - $arguments['cacheResultFile'] = null; - - $cacheResultFile = \realpath($cacheLocation); - - if ($cacheResultFile !== false) { - $arguments['cacheResultFile'] = \dirname($cacheResultFile); - } - } - - $cache = new DefaultTestResultCache($arguments['cacheResultFile']); - - $this->addExtension(new ResultCacheExtension($cache)); - } - - if ($arguments['executionOrder'] !== TestSuiteSorter::ORDER_DEFAULT || $arguments['executionOrderDefects'] !== TestSuiteSorter::ORDER_DEFAULT || $arguments['resolveDependencies']) { - $cache = $cache ?? new NullTestResultCache; - - $cache->load(); - - $sorter = new TestSuiteSorter($cache); - - $sorter->reorderTestsInSuite($suite, $arguments['executionOrder'], $arguments['resolveDependencies'], $arguments['executionOrderDefects']); - $originalExecutionOrder = $sorter->getOriginalExecutionOrder(); - - unset($sorter); - } - - if (\is_int($arguments['repeat']) && $arguments['repeat'] > 0) { - $_suite = new TestSuite; - - /* @noinspection PhpUnusedLocalVariableInspection */ - foreach (\range(1, $arguments['repeat']) as $step) { - $_suite->addTest($suite); - } - - $suite = $_suite; - - unset($_suite); - } - - $result = $this->createTestResult(); - - $listener = new TestListenerAdapter; - $listenerNeeded = false; - - foreach ($this->extensions as $extension) { - if ($extension instanceof TestHook) { - $listener->add($extension); - - $listenerNeeded = true; - } - } - - if ($listenerNeeded) { - $result->addListener($listener); - } - - unset($listener, $listenerNeeded); - - if (!$arguments['convertDeprecationsToExceptions']) { - $result->convertDeprecationsToExceptions(false); - } - - if (!$arguments['convertErrorsToExceptions']) { - $result->convertErrorsToExceptions(false); - } - - if (!$arguments['convertNoticesToExceptions']) { - $result->convertNoticesToExceptions(false); - } - - if (!$arguments['convertWarningsToExceptions']) { - $result->convertWarningsToExceptions(false); - } - - if ($arguments['stopOnError']) { - $result->stopOnError(true); - } - - if ($arguments['stopOnFailure']) { - $result->stopOnFailure(true); - } - - if ($arguments['stopOnWarning']) { - $result->stopOnWarning(true); - } - - if ($arguments['stopOnIncomplete']) { - $result->stopOnIncomplete(true); - } - - if ($arguments['stopOnRisky']) { - $result->stopOnRisky(true); - } - - if ($arguments['stopOnSkipped']) { - $result->stopOnSkipped(true); - } - - if ($arguments['stopOnDefect']) { - $result->stopOnDefect(true); - } - - if ($arguments['registerMockObjectsFromTestArgumentsRecursively']) { - $result->setRegisterMockObjectsFromTestArgumentsRecursively(true); - } - - if ($this->printer === null) { - if (isset($arguments['printer'])) { - if ($arguments['printer'] instanceof Printer && $arguments['printer'] instanceof TestListener) { - $this->printer = $arguments['printer']; - } elseif (\is_string($arguments['printer']) && \class_exists($arguments['printer'], false)) { - try { - new \ReflectionClass($arguments['printer']); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if (\is_subclass_of($arguments['printer'], ResultPrinter::class)) { - $this->printer = $this->createPrinter($arguments['printer'], $arguments); - } - } - } else { - $this->printer = $this->createPrinter(ResultPrinter::class, $arguments); - } - } - - if (isset($originalExecutionOrder) && $this->printer instanceof CliTestDoxPrinter) { - \assert($this->printer instanceof CliTestDoxPrinter); - - $this->printer->setOriginalExecutionOrder($originalExecutionOrder); - $this->printer->setShowProgressAnimation(!$arguments['noInteraction']); - } - - $this->printer->write( - Version::getVersionString() . "\n" - ); - - self::$versionStringPrinted = true; - - if ($arguments['verbose']) { - $this->writeMessage('Runtime', $this->runtime->getNameWithVersionAndCodeCoverageDriver()); - - if (isset($arguments['configuration'])) { - $this->writeMessage( - 'Configuration', - $arguments['configuration']->getFilename() - ); - } - - foreach ($arguments['loadedExtensions'] as $extension) { - $this->writeMessage( - 'Extension', - $extension - ); - } - - foreach ($arguments['notLoadedExtensions'] as $extension) { - $this->writeMessage( - 'Extension', - $extension - ); - } - } - - foreach ($warnings as $warning) { - $this->writeMessage('Warning', $warning); - } - - if ($arguments['executionOrder'] === TestSuiteSorter::ORDER_RANDOMIZED) { - $this->writeMessage( - 'Random seed', - (string) $arguments['randomOrderSeed'] - ); - } - - if (isset($tooFewColumnsRequested)) { - $this->writeMessage('Error', 'Less than 16 columns requested, number of columns set to 16'); - } - - if ($this->runtime->discardsComments()) { - $this->writeMessage('Warning', 'opcache.save_comments=0 set; annotations will not work'); - } - - if (isset($arguments['configuration']) && $arguments['configuration']->hasValidationErrors()) { - $this->write( - "\n Warning - The configuration file did not pass validation!\n The following problems have been detected:\n" - ); - - foreach ($arguments['configuration']->getValidationErrors() as $line => $errors) { - $this->write(\sprintf("\n Line %d:\n", $line)); - - foreach ($errors as $msg) { - $this->write(\sprintf(" - %s\n", $msg)); - } - } - - $this->write("\n Test results may not be as expected.\n\n"); - } - - if (isset($arguments['conflictBetweenPrinterClassAndTestdox'])) { - $this->writeMessage('Warning', 'Directives printerClass and testdox are mutually exclusive'); - } - - foreach ($arguments['listeners'] as $listener) { - $result->addListener($listener); - } - - $result->addListener($this->printer); - - $codeCoverageReports = 0; - - if (!isset($arguments['noLogging'])) { - if (isset($arguments['testdoxHTMLFile'])) { - $result->addListener( - new HtmlResultPrinter( - $arguments['testdoxHTMLFile'], - $arguments['testdoxGroups'], - $arguments['testdoxExcludeGroups'] - ) - ); - } - - if (isset($arguments['testdoxTextFile'])) { - $result->addListener( - new TextResultPrinter( - $arguments['testdoxTextFile'], - $arguments['testdoxGroups'], - $arguments['testdoxExcludeGroups'] - ) - ); - } - - if (isset($arguments['testdoxXMLFile'])) { - $result->addListener( - new XmlResultPrinter( - $arguments['testdoxXMLFile'] - ) - ); - } - - if (isset($arguments['teamcityLogfile'])) { - $result->addListener( - new TeamCity($arguments['teamcityLogfile']) - ); - } - - if (isset($arguments['junitLogfile'])) { - $result->addListener( - new JUnit( - $arguments['junitLogfile'], - $arguments['reportUselessTests'] - ) - ); - } - - if (isset($arguments['coverageClover'])) { - $codeCoverageReports++; - } - - if (isset($arguments['coverageCrap4J'])) { - $codeCoverageReports++; - } - - if (isset($arguments['coverageHtml'])) { - $codeCoverageReports++; - } - - if (isset($arguments['coveragePHP'])) { - $codeCoverageReports++; - } - - if (isset($arguments['coverageText'])) { - $codeCoverageReports++; - } - - if (isset($arguments['coverageXml'])) { - $codeCoverageReports++; - } - } - - if (isset($arguments['noCoverage'])) { - $codeCoverageReports = 0; - } - - if ($codeCoverageReports > 0 && !$this->runtime->canCollectCodeCoverage()) { - $this->writeMessage('Error', 'No code coverage driver is available'); - - $codeCoverageReports = 0; - } - - if ($codeCoverageReports > 0 || isset($arguments['xdebugFilterFile'])) { - $whitelistFromConfigurationFile = false; - $whitelistFromOption = false; - - if (isset($arguments['whitelist'])) { - $this->codeCoverageFilter->addDirectoryToWhitelist($arguments['whitelist']); - - $whitelistFromOption = true; - } - - if (isset($arguments['configuration'])) { - $filterConfiguration = $arguments['configuration']->getFilterConfiguration(); - - if (!empty($filterConfiguration['whitelist'])) { - $whitelistFromConfigurationFile = true; - } - - if (!empty($filterConfiguration['whitelist'])) { - foreach ($filterConfiguration['whitelist']['include']['directory'] as $dir) { - $this->codeCoverageFilter->addDirectoryToWhitelist( - $dir['path'], - $dir['suffix'], - $dir['prefix'] - ); - } - - foreach ($filterConfiguration['whitelist']['include']['file'] as $file) { - $this->codeCoverageFilter->addFileToWhitelist($file); - } - - foreach ($filterConfiguration['whitelist']['exclude']['directory'] as $dir) { - $this->codeCoverageFilter->removeDirectoryFromWhitelist( - $dir['path'], - $dir['suffix'], - $dir['prefix'] - ); - } - - foreach ($filterConfiguration['whitelist']['exclude']['file'] as $file) { - $this->codeCoverageFilter->removeFileFromWhitelist($file); - } - } - } - } - - if ($codeCoverageReports > 0) { - try { - $codeCoverage = new CodeCoverage( - null, - $this->codeCoverageFilter - ); - - $codeCoverage->setUnintentionallyCoveredSubclassesWhitelist( - [Comparator::class] - ); - - $codeCoverage->setCheckForUnintentionallyCoveredCode( - $arguments['strictCoverage'] - ); - - $codeCoverage->setCheckForMissingCoversAnnotation( - $arguments['strictCoverage'] - ); - - if (isset($arguments['forceCoversAnnotation'])) { - $codeCoverage->setForceCoversAnnotation( - $arguments['forceCoversAnnotation'] - ); - } - - if (isset($arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'])) { - $codeCoverage->setIgnoreDeprecatedCode( - $arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'] - ); - } - - if (isset($arguments['disableCodeCoverageIgnore'])) { - $codeCoverage->setDisableIgnoredLines(true); - } - - if (!empty($filterConfiguration['whitelist'])) { - $codeCoverage->setAddUncoveredFilesFromWhitelist( - $filterConfiguration['whitelist']['addUncoveredFilesFromWhitelist'] - ); - - $codeCoverage->setProcessUncoveredFilesFromWhitelist( - $filterConfiguration['whitelist']['processUncoveredFilesFromWhitelist'] - ); - } - - if (!$this->codeCoverageFilter->hasWhitelist()) { - if (!$whitelistFromConfigurationFile && !$whitelistFromOption) { - $this->writeMessage('Error', 'No whitelist is configured, no code coverage will be generated.'); - } else { - $this->writeMessage('Error', 'Incorrect whitelist config, no code coverage will be generated.'); - } - - $codeCoverageReports = 0; - - unset($codeCoverage); - } - } catch (CodeCoverageException $e) { - $this->writeMessage('Error', $e->getMessage()); - - $codeCoverageReports = 0; - } - } - - if (isset($arguments['xdebugFilterFile'], $filterConfiguration)) { - $this->write("\n"); - - $script = (new XdebugFilterScriptGenerator)->generate($filterConfiguration['whitelist']); - - if ($arguments['xdebugFilterFile'] !== 'php://stdout' && $arguments['xdebugFilterFile'] !== 'php://stderr' && !Filesystem::createDirectory(\dirname($arguments['xdebugFilterFile']))) { - $this->write(\sprintf('Cannot write Xdebug filter script to %s ' . \PHP_EOL, $arguments['xdebugFilterFile'])); - - exit(self::EXCEPTION_EXIT); - } - - \file_put_contents($arguments['xdebugFilterFile'], $script); - - $this->write(\sprintf('Wrote Xdebug filter script to %s ' . \PHP_EOL, $arguments['xdebugFilterFile'])); - - exit(self::SUCCESS_EXIT); - } - - $this->printer->write("\n"); - - if (isset($codeCoverage)) { - $result->setCodeCoverage($codeCoverage); - - if ($codeCoverageReports > 1 && isset($arguments['cacheTokens'])) { - $codeCoverage->setCacheTokens($arguments['cacheTokens']); - } - } - - $result->beStrictAboutTestsThatDoNotTestAnything($arguments['reportUselessTests']); - $result->beStrictAboutOutputDuringTests($arguments['disallowTestOutput']); - $result->beStrictAboutTodoAnnotatedTests($arguments['disallowTodoAnnotatedTests']); - $result->beStrictAboutResourceUsageDuringSmallTests($arguments['beStrictAboutResourceUsageDuringSmallTests']); - - if ($arguments['enforceTimeLimit'] === true) { - if (!\class_exists(Invoker::class)) { - $this->writeMessage('Error', 'Package phpunit/php-invoker is required for enforcing time limits'); - } - - if (!\extension_loaded('pcntl') || \strpos(\ini_get('disable_functions'), 'pcntl') !== false) { - $this->writeMessage('Error', 'PHP extension pcntl is required for enforcing time limits'); - } - } - $result->enforceTimeLimit($arguments['enforceTimeLimit']); - $result->setDefaultTimeLimit($arguments['defaultTimeLimit']); - $result->setTimeoutForSmallTests($arguments['timeoutForSmallTests']); - $result->setTimeoutForMediumTests($arguments['timeoutForMediumTests']); - $result->setTimeoutForLargeTests($arguments['timeoutForLargeTests']); - - if ($suite instanceof TestSuite) { - $this->processSuiteFilters($suite, $arguments); - $suite->setRunTestInSeparateProcess($arguments['processIsolation']); - } - - foreach ($this->extensions as $extension) { - if ($extension instanceof BeforeFirstTestHook) { - $extension->executeBeforeFirstTest(); - } - } - - $suite->run($result); - - foreach ($this->extensions as $extension) { - if ($extension instanceof AfterLastTestHook) { - $extension->executeAfterLastTest(); - } - } - - $result->flushListeners(); - - if ($this->printer instanceof ResultPrinter) { - $this->printer->printResult($result); - } - - if (isset($codeCoverage)) { - if (isset($arguments['coverageClover'])) { - $this->codeCoverageGenerationStart('Clover XML'); - - try { - $writer = new CloverReport; - $writer->process($codeCoverage, $arguments['coverageClover']); - - $this->codeCoverageGenerationSucceeded(); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($e); - } - } - - if (isset($arguments['coverageCrap4J'])) { - $this->codeCoverageGenerationStart('Crap4J XML'); - - try { - $writer = new Crap4jReport($arguments['crap4jThreshold']); - $writer->process($codeCoverage, $arguments['coverageCrap4J']); - - $this->codeCoverageGenerationSucceeded(); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($e); - } - } - - if (isset($arguments['coverageHtml'])) { - $this->codeCoverageGenerationStart('HTML'); - - try { - $writer = new HtmlReport( - $arguments['reportLowUpperBound'], - $arguments['reportHighLowerBound'], - \sprintf( - ' and PHPUnit %s', - Version::id() - ) - ); - - $writer->process($codeCoverage, $arguments['coverageHtml']); - - $this->codeCoverageGenerationSucceeded(); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($e); - } - } - - if (isset($arguments['coveragePHP'])) { - $this->codeCoverageGenerationStart('PHP'); - - try { - $writer = new PhpReport; - $writer->process($codeCoverage, $arguments['coveragePHP']); - - $this->codeCoverageGenerationSucceeded(); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($e); - } - } - - if (isset($arguments['coverageText'])) { - if ($arguments['coverageText'] === 'php://stdout') { - $outputStream = $this->printer; - $colors = $arguments['colors'] && $arguments['colors'] !== ResultPrinter::COLOR_NEVER; - } else { - $outputStream = new Printer($arguments['coverageText']); - $colors = false; - } - - $processor = new TextReport( - $arguments['reportLowUpperBound'], - $arguments['reportHighLowerBound'], - $arguments['coverageTextShowUncoveredFiles'], - $arguments['coverageTextShowOnlySummary'] - ); - - $outputStream->write( - $processor->process($codeCoverage, $colors) - ); - } - - if (isset($arguments['coverageXml'])) { - $this->codeCoverageGenerationStart('PHPUnit XML'); - - try { - $writer = new XmlReport(Version::id()); - $writer->process($codeCoverage, $arguments['coverageXml']); - - $this->codeCoverageGenerationSucceeded(); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($e); - } - } - } - - if ($exit) { - if ($result->wasSuccessfulIgnoringWarnings()) { - if ($arguments['failOnRisky'] && !$result->allHarmless()) { - exit(self::FAILURE_EXIT); - } - - if ($arguments['failOnWarning'] && $result->warningCount() > 0) { - exit(self::FAILURE_EXIT); - } - - exit(self::SUCCESS_EXIT); - } - - if ($result->errorCount() > 0) { - exit(self::EXCEPTION_EXIT); - } - - if ($result->failureCount() > 0) { - exit(self::FAILURE_EXIT); - } - } - - return $result; - } - - public function setPrinter(ResultPrinter $resultPrinter): void - { - $this->printer = $resultPrinter; - } - - /** - * Returns the loader to be used. - */ - public function getLoader(): TestSuiteLoader - { - if ($this->loader === null) { - $this->loader = new StandardTestSuiteLoader; - } - - return $this->loader; - } - - public function addExtension(Hook $extension): void - { - $this->extensions[] = $extension; - } - - /** - * Override to define how to handle a failed loading of - * a test suite. - */ - protected function runFailed(string $message): void - { - $this->write($message . \PHP_EOL); - - exit(self::FAILURE_EXIT); - } - - private function createTestResult(): TestResult - { - return new TestResult; - } - - private function write(string $buffer): void - { - if (\PHP_SAPI !== 'cli' && \PHP_SAPI !== 'phpdbg') { - $buffer = \htmlspecialchars($buffer); - } - - if ($this->printer !== null) { - $this->printer->write($buffer); - } else { - print $buffer; - } - } - - /** - * @throws Exception - */ - private function handleConfiguration(array &$arguments): void - { - if (isset($arguments['configuration']) && - !$arguments['configuration'] instanceof Configuration) { - $arguments['configuration'] = Configuration::getInstance( - $arguments['configuration'] - ); - } - - $arguments['debug'] = $arguments['debug'] ?? false; - $arguments['filter'] = $arguments['filter'] ?? false; - $arguments['listeners'] = $arguments['listeners'] ?? []; - - if (isset($arguments['configuration'])) { - $arguments['configuration']->handlePHPConfiguration(); - - $phpunitConfiguration = $arguments['configuration']->getPHPUnitConfiguration(); - - if (isset($phpunitConfiguration['backupGlobals']) && !isset($arguments['backupGlobals'])) { - $arguments['backupGlobals'] = $phpunitConfiguration['backupGlobals']; - } - - if (isset($phpunitConfiguration['backupStaticAttributes']) && !isset($arguments['backupStaticAttributes'])) { - $arguments['backupStaticAttributes'] = $phpunitConfiguration['backupStaticAttributes']; - } - - if (isset($phpunitConfiguration['beStrictAboutChangesToGlobalState']) && !isset($arguments['beStrictAboutChangesToGlobalState'])) { - $arguments['beStrictAboutChangesToGlobalState'] = $phpunitConfiguration['beStrictAboutChangesToGlobalState']; - } - - if (isset($phpunitConfiguration['bootstrap']) && !isset($arguments['bootstrap'])) { - $arguments['bootstrap'] = $phpunitConfiguration['bootstrap']; - } - - if (isset($phpunitConfiguration['cacheResult']) && !isset($arguments['cacheResult'])) { - $arguments['cacheResult'] = $phpunitConfiguration['cacheResult']; - } - - if (isset($phpunitConfiguration['cacheResultFile']) && !isset($arguments['cacheResultFile'])) { - $arguments['cacheResultFile'] = $phpunitConfiguration['cacheResultFile']; - } - - if (isset($phpunitConfiguration['cacheTokens']) && !isset($arguments['cacheTokens'])) { - $arguments['cacheTokens'] = $phpunitConfiguration['cacheTokens']; - } - - if (isset($phpunitConfiguration['cacheTokens']) && !isset($arguments['cacheTokens'])) { - $arguments['cacheTokens'] = $phpunitConfiguration['cacheTokens']; - } - - if (isset($phpunitConfiguration['colors']) && !isset($arguments['colors'])) { - $arguments['colors'] = $phpunitConfiguration['colors']; - } - - if (isset($phpunitConfiguration['convertDeprecationsToExceptions']) && !isset($arguments['convertDeprecationsToExceptions'])) { - $arguments['convertDeprecationsToExceptions'] = $phpunitConfiguration['convertDeprecationsToExceptions']; - } - - if (isset($phpunitConfiguration['convertErrorsToExceptions']) && !isset($arguments['convertErrorsToExceptions'])) { - $arguments['convertErrorsToExceptions'] = $phpunitConfiguration['convertErrorsToExceptions']; - } - - if (isset($phpunitConfiguration['convertNoticesToExceptions']) && !isset($arguments['convertNoticesToExceptions'])) { - $arguments['convertNoticesToExceptions'] = $phpunitConfiguration['convertNoticesToExceptions']; - } - - if (isset($phpunitConfiguration['convertWarningsToExceptions']) && !isset($arguments['convertWarningsToExceptions'])) { - $arguments['convertWarningsToExceptions'] = $phpunitConfiguration['convertWarningsToExceptions']; - } - - if (isset($phpunitConfiguration['processIsolation']) && !isset($arguments['processIsolation'])) { - $arguments['processIsolation'] = $phpunitConfiguration['processIsolation']; - } - - if (isset($phpunitConfiguration['stopOnDefect']) && !isset($arguments['stopOnDefect'])) { - $arguments['stopOnDefect'] = $phpunitConfiguration['stopOnDefect']; - } - - if (isset($phpunitConfiguration['stopOnError']) && !isset($arguments['stopOnError'])) { - $arguments['stopOnError'] = $phpunitConfiguration['stopOnError']; - } - - if (isset($phpunitConfiguration['stopOnFailure']) && !isset($arguments['stopOnFailure'])) { - $arguments['stopOnFailure'] = $phpunitConfiguration['stopOnFailure']; - } - - if (isset($phpunitConfiguration['stopOnWarning']) && !isset($arguments['stopOnWarning'])) { - $arguments['stopOnWarning'] = $phpunitConfiguration['stopOnWarning']; - } - - if (isset($phpunitConfiguration['stopOnIncomplete']) && !isset($arguments['stopOnIncomplete'])) { - $arguments['stopOnIncomplete'] = $phpunitConfiguration['stopOnIncomplete']; - } - - if (isset($phpunitConfiguration['stopOnRisky']) && !isset($arguments['stopOnRisky'])) { - $arguments['stopOnRisky'] = $phpunitConfiguration['stopOnRisky']; - } - - if (isset($phpunitConfiguration['stopOnSkipped']) && !isset($arguments['stopOnSkipped'])) { - $arguments['stopOnSkipped'] = $phpunitConfiguration['stopOnSkipped']; - } - - if (isset($phpunitConfiguration['failOnWarning']) && !isset($arguments['failOnWarning'])) { - $arguments['failOnWarning'] = $phpunitConfiguration['failOnWarning']; - } - - if (isset($phpunitConfiguration['failOnRisky']) && !isset($arguments['failOnRisky'])) { - $arguments['failOnRisky'] = $phpunitConfiguration['failOnRisky']; - } - - if (isset($phpunitConfiguration['timeoutForSmallTests']) && !isset($arguments['timeoutForSmallTests'])) { - $arguments['timeoutForSmallTests'] = $phpunitConfiguration['timeoutForSmallTests']; - } - - if (isset($phpunitConfiguration['timeoutForMediumTests']) && !isset($arguments['timeoutForMediumTests'])) { - $arguments['timeoutForMediumTests'] = $phpunitConfiguration['timeoutForMediumTests']; - } - - if (isset($phpunitConfiguration['timeoutForLargeTests']) && !isset($arguments['timeoutForLargeTests'])) { - $arguments['timeoutForLargeTests'] = $phpunitConfiguration['timeoutForLargeTests']; - } - - if (isset($phpunitConfiguration['reportUselessTests']) && !isset($arguments['reportUselessTests'])) { - $arguments['reportUselessTests'] = $phpunitConfiguration['reportUselessTests']; - } - - if (isset($phpunitConfiguration['strictCoverage']) && !isset($arguments['strictCoverage'])) { - $arguments['strictCoverage'] = $phpunitConfiguration['strictCoverage']; - } - - if (isset($phpunitConfiguration['ignoreDeprecatedCodeUnitsFromCodeCoverage']) && !isset($arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'])) { - $arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'] = $phpunitConfiguration['ignoreDeprecatedCodeUnitsFromCodeCoverage']; - } - - if (isset($phpunitConfiguration['disallowTestOutput']) && !isset($arguments['disallowTestOutput'])) { - $arguments['disallowTestOutput'] = $phpunitConfiguration['disallowTestOutput']; - } - - if (isset($phpunitConfiguration['defaultTimeLimit']) && !isset($arguments['defaultTimeLimit'])) { - $arguments['defaultTimeLimit'] = $phpunitConfiguration['defaultTimeLimit']; - } - - if (isset($phpunitConfiguration['enforceTimeLimit']) && !isset($arguments['enforceTimeLimit'])) { - $arguments['enforceTimeLimit'] = $phpunitConfiguration['enforceTimeLimit']; - } - - if (isset($phpunitConfiguration['disallowTodoAnnotatedTests']) && !isset($arguments['disallowTodoAnnotatedTests'])) { - $arguments['disallowTodoAnnotatedTests'] = $phpunitConfiguration['disallowTodoAnnotatedTests']; - } - - if (isset($phpunitConfiguration['beStrictAboutResourceUsageDuringSmallTests']) && !isset($arguments['beStrictAboutResourceUsageDuringSmallTests'])) { - $arguments['beStrictAboutResourceUsageDuringSmallTests'] = $phpunitConfiguration['beStrictAboutResourceUsageDuringSmallTests']; - } - - if (isset($phpunitConfiguration['verbose']) && !isset($arguments['verbose'])) { - $arguments['verbose'] = $phpunitConfiguration['verbose']; - } - - if (isset($phpunitConfiguration['reverseDefectList']) && !isset($arguments['reverseList'])) { - $arguments['reverseList'] = $phpunitConfiguration['reverseDefectList']; - } - - if (isset($phpunitConfiguration['forceCoversAnnotation']) && !isset($arguments['forceCoversAnnotation'])) { - $arguments['forceCoversAnnotation'] = $phpunitConfiguration['forceCoversAnnotation']; - } - - if (isset($phpunitConfiguration['disableCodeCoverageIgnore']) && !isset($arguments['disableCodeCoverageIgnore'])) { - $arguments['disableCodeCoverageIgnore'] = $phpunitConfiguration['disableCodeCoverageIgnore']; - } - - if (isset($phpunitConfiguration['registerMockObjectsFromTestArgumentsRecursively']) && !isset($arguments['registerMockObjectsFromTestArgumentsRecursively'])) { - $arguments['registerMockObjectsFromTestArgumentsRecursively'] = $phpunitConfiguration['registerMockObjectsFromTestArgumentsRecursively']; - } - - if (isset($phpunitConfiguration['executionOrder']) && !isset($arguments['executionOrder'])) { - $arguments['executionOrder'] = $phpunitConfiguration['executionOrder']; - } - - if (isset($phpunitConfiguration['executionOrderDefects']) && !isset($arguments['executionOrderDefects'])) { - $arguments['executionOrderDefects'] = $phpunitConfiguration['executionOrderDefects']; - } - - if (isset($phpunitConfiguration['resolveDependencies']) && !isset($arguments['resolveDependencies'])) { - $arguments['resolveDependencies'] = $phpunitConfiguration['resolveDependencies']; - } - - if (isset($phpunitConfiguration['noInteraction']) && !isset($arguments['noInteraction'])) { - $arguments['noInteraction'] = $phpunitConfiguration['noInteraction']; - } - - if (isset($phpunitConfiguration['conflictBetweenPrinterClassAndTestdox'])) { - $arguments['conflictBetweenPrinterClassAndTestdox'] = true; - } - - $groupCliArgs = []; - - if (!empty($arguments['groups'])) { - $groupCliArgs = $arguments['groups']; - } - - $groupConfiguration = $arguments['configuration']->getGroupConfiguration(); - - if (!empty($groupConfiguration['include']) && !isset($arguments['groups'])) { - $arguments['groups'] = $groupConfiguration['include']; - } - - if (!empty($groupConfiguration['exclude']) && !isset($arguments['excludeGroups'])) { - $arguments['excludeGroups'] = \array_diff($groupConfiguration['exclude'], $groupCliArgs); - } - - foreach ($arguments['configuration']->getExtensionConfiguration() as $extension) { - if ($extension['file'] !== '' && !\class_exists($extension['class'], false)) { - require_once $extension['file']; - } - - if (!\class_exists($extension['class'])) { - throw new Exception( - \sprintf( - 'Class "%s" does not exist', - $extension['class'] - ) - ); - } - - try { - $extensionClass = new \ReflectionClass($extension['class']); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if (!$extensionClass->implementsInterface(Hook::class)) { - throw new Exception( - \sprintf( - 'Class "%s" does not implement a PHPUnit\Runner\Hook interface', - $extension['class'] - ) - ); - } - - if (\count($extension['arguments']) === 0) { - $extensionObject = $extensionClass->newInstance(); - } else { - $extensionObject = $extensionClass->newInstanceArgs( - $extension['arguments'] - ); - } - - \assert($extensionObject instanceof Hook); - - $this->addExtension($extensionObject); - } - - foreach ($arguments['configuration']->getListenerConfiguration() as $listener) { - if ($listener['file'] !== '' && !\class_exists($listener['class'], false)) { - require_once $listener['file']; - } - - if (!\class_exists($listener['class'])) { - throw new Exception( - \sprintf( - 'Class "%s" does not exist', - $listener['class'] - ) - ); - } - - try { - $listenerClass = new \ReflectionClass($listener['class']); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - if (!$listenerClass->implementsInterface(TestListener::class)) { - throw new Exception( - \sprintf( - 'Class "%s" does not implement the PHPUnit\Framework\TestListener interface', - $listener['class'] - ) - ); - } - - if (\count($listener['arguments']) === 0) { - $listener = new $listener['class']; - } else { - $listener = $listenerClass->newInstanceArgs( - $listener['arguments'] - ); - } - - $arguments['listeners'][] = $listener; - } - - $loggingConfiguration = $arguments['configuration']->getLoggingConfiguration(); - - if (isset($loggingConfiguration['coverage-clover']) && !isset($arguments['coverageClover'])) { - $arguments['coverageClover'] = $loggingConfiguration['coverage-clover']; - } - - if (isset($loggingConfiguration['coverage-crap4j']) && !isset($arguments['coverageCrap4J'])) { - $arguments['coverageCrap4J'] = $loggingConfiguration['coverage-crap4j']; - - if (isset($loggingConfiguration['crap4jThreshold']) && !isset($arguments['crap4jThreshold'])) { - $arguments['crap4jThreshold'] = $loggingConfiguration['crap4jThreshold']; - } - } - - if (isset($loggingConfiguration['coverage-html']) && !isset($arguments['coverageHtml'])) { - if (isset($loggingConfiguration['lowUpperBound']) && !isset($arguments['reportLowUpperBound'])) { - $arguments['reportLowUpperBound'] = $loggingConfiguration['lowUpperBound']; - } - - if (isset($loggingConfiguration['highLowerBound']) && !isset($arguments['reportHighLowerBound'])) { - $arguments['reportHighLowerBound'] = $loggingConfiguration['highLowerBound']; - } - - $arguments['coverageHtml'] = $loggingConfiguration['coverage-html']; - } - - if (isset($loggingConfiguration['coverage-php']) && !isset($arguments['coveragePHP'])) { - $arguments['coveragePHP'] = $loggingConfiguration['coverage-php']; - } - - if (isset($loggingConfiguration['coverage-text']) && !isset($arguments['coverageText'])) { - $arguments['coverageText'] = $loggingConfiguration['coverage-text']; - $arguments['coverageTextShowUncoveredFiles'] = $loggingConfiguration['coverageTextShowUncoveredFiles'] ?? false; - $arguments['coverageTextShowOnlySummary'] = $loggingConfiguration['coverageTextShowOnlySummary'] ?? false; - } - - if (isset($loggingConfiguration['coverage-xml']) && !isset($arguments['coverageXml'])) { - $arguments['coverageXml'] = $loggingConfiguration['coverage-xml']; - } - - if (isset($loggingConfiguration['plain'])) { - $arguments['listeners'][] = new ResultPrinter( - $loggingConfiguration['plain'], - true - ); - } - - if (isset($loggingConfiguration['teamcity']) && !isset($arguments['teamcityLogfile'])) { - $arguments['teamcityLogfile'] = $loggingConfiguration['teamcity']; - } - - if (isset($loggingConfiguration['junit']) && !isset($arguments['junitLogfile'])) { - $arguments['junitLogfile'] = $loggingConfiguration['junit']; - } - - if (isset($loggingConfiguration['testdox-html']) && !isset($arguments['testdoxHTMLFile'])) { - $arguments['testdoxHTMLFile'] = $loggingConfiguration['testdox-html']; - } - - if (isset($loggingConfiguration['testdox-text']) && !isset($arguments['testdoxTextFile'])) { - $arguments['testdoxTextFile'] = $loggingConfiguration['testdox-text']; - } - - if (isset($loggingConfiguration['testdox-xml']) && !isset($arguments['testdoxXMLFile'])) { - $arguments['testdoxXMLFile'] = $loggingConfiguration['testdox-xml']; - } - - $testdoxGroupConfiguration = $arguments['configuration']->getTestdoxGroupConfiguration(); - - if (isset($testdoxGroupConfiguration['include']) && - !isset($arguments['testdoxGroups'])) { - $arguments['testdoxGroups'] = $testdoxGroupConfiguration['include']; - } - - if (isset($testdoxGroupConfiguration['exclude']) && - !isset($arguments['testdoxExcludeGroups'])) { - $arguments['testdoxExcludeGroups'] = $testdoxGroupConfiguration['exclude']; - } - } - - $arguments['addUncoveredFilesFromWhitelist'] = $arguments['addUncoveredFilesFromWhitelist'] ?? true; - $arguments['backupGlobals'] = $arguments['backupGlobals'] ?? null; - $arguments['backupStaticAttributes'] = $arguments['backupStaticAttributes'] ?? null; - $arguments['beStrictAboutChangesToGlobalState'] = $arguments['beStrictAboutChangesToGlobalState'] ?? null; - $arguments['beStrictAboutResourceUsageDuringSmallTests'] = $arguments['beStrictAboutResourceUsageDuringSmallTests'] ?? false; - $arguments['cacheResult'] = $arguments['cacheResult'] ?? true; - $arguments['cacheTokens'] = $arguments['cacheTokens'] ?? false; - $arguments['colors'] = $arguments['colors'] ?? ResultPrinter::COLOR_DEFAULT; - $arguments['columns'] = $arguments['columns'] ?? 80; - $arguments['convertDeprecationsToExceptions'] = $arguments['convertDeprecationsToExceptions'] ?? true; - $arguments['convertErrorsToExceptions'] = $arguments['convertErrorsToExceptions'] ?? true; - $arguments['convertNoticesToExceptions'] = $arguments['convertNoticesToExceptions'] ?? true; - $arguments['convertWarningsToExceptions'] = $arguments['convertWarningsToExceptions'] ?? true; - $arguments['crap4jThreshold'] = $arguments['crap4jThreshold'] ?? 30; - $arguments['disallowTestOutput'] = $arguments['disallowTestOutput'] ?? false; - $arguments['disallowTodoAnnotatedTests'] = $arguments['disallowTodoAnnotatedTests'] ?? false; - $arguments['defaultTimeLimit'] = $arguments['defaultTimeLimit'] ?? 0; - $arguments['enforceTimeLimit'] = $arguments['enforceTimeLimit'] ?? false; - $arguments['excludeGroups'] = $arguments['excludeGroups'] ?? []; - $arguments['executionOrder'] = $arguments['executionOrder'] ?? TestSuiteSorter::ORDER_DEFAULT; - $arguments['executionOrderDefects'] = $arguments['executionOrderDefects'] ?? TestSuiteSorter::ORDER_DEFAULT; - $arguments['failOnRisky'] = $arguments['failOnRisky'] ?? false; - $arguments['failOnWarning'] = $arguments['failOnWarning'] ?? false; - $arguments['groups'] = $arguments['groups'] ?? []; - $arguments['noInteraction'] = $arguments['noInteraction'] ?? false; - $arguments['processIsolation'] = $arguments['processIsolation'] ?? false; - $arguments['processUncoveredFilesFromWhitelist'] = $arguments['processUncoveredFilesFromWhitelist'] ?? false; - $arguments['randomOrderSeed'] = $arguments['randomOrderSeed'] ?? \time(); - $arguments['registerMockObjectsFromTestArgumentsRecursively'] = $arguments['registerMockObjectsFromTestArgumentsRecursively'] ?? false; - $arguments['repeat'] = $arguments['repeat'] ?? false; - $arguments['reportHighLowerBound'] = $arguments['reportHighLowerBound'] ?? 90; - $arguments['reportLowUpperBound'] = $arguments['reportLowUpperBound'] ?? 50; - $arguments['reportUselessTests'] = $arguments['reportUselessTests'] ?? true; - $arguments['reverseList'] = $arguments['reverseList'] ?? false; - $arguments['resolveDependencies'] = $arguments['resolveDependencies'] ?? true; - $arguments['stopOnError'] = $arguments['stopOnError'] ?? false; - $arguments['stopOnFailure'] = $arguments['stopOnFailure'] ?? false; - $arguments['stopOnIncomplete'] = $arguments['stopOnIncomplete'] ?? false; - $arguments['stopOnRisky'] = $arguments['stopOnRisky'] ?? false; - $arguments['stopOnSkipped'] = $arguments['stopOnSkipped'] ?? false; - $arguments['stopOnWarning'] = $arguments['stopOnWarning'] ?? false; - $arguments['stopOnDefect'] = $arguments['stopOnDefect'] ?? false; - $arguments['strictCoverage'] = $arguments['strictCoverage'] ?? false; - $arguments['testdoxExcludeGroups'] = $arguments['testdoxExcludeGroups'] ?? []; - $arguments['testdoxGroups'] = $arguments['testdoxGroups'] ?? []; - $arguments['timeoutForLargeTests'] = $arguments['timeoutForLargeTests'] ?? 60; - $arguments['timeoutForMediumTests'] = $arguments['timeoutForMediumTests'] ?? 10; - $arguments['timeoutForSmallTests'] = $arguments['timeoutForSmallTests'] ?? 1; - $arguments['verbose'] = $arguments['verbose'] ?? false; - } - - private function processSuiteFilters(TestSuite $suite, array $arguments): void - { - if (!$arguments['filter'] && - empty($arguments['groups']) && - empty($arguments['excludeGroups'])) { - return; - } - - $filterFactory = new Factory; - - if (!empty($arguments['excludeGroups'])) { - $filterFactory->addFilter( - new \ReflectionClass(ExcludeGroupFilterIterator::class), - $arguments['excludeGroups'] - ); - } - - if (!empty($arguments['groups'])) { - $filterFactory->addFilter( - new \ReflectionClass(IncludeGroupFilterIterator::class), - $arguments['groups'] - ); - } - - if ($arguments['filter']) { - $filterFactory->addFilter( - new \ReflectionClass(NameFilterIterator::class), - $arguments['filter'] - ); - } - - $suite->injectFilter($filterFactory); - } - - private function writeMessage(string $type, string $message): void - { - if (!$this->messagePrinted) { - $this->write("\n"); - } - - $this->write( - \sprintf( - "%-15s%s\n", - $type . ':', - $message - ) - ); - - $this->messagePrinted = true; - } - - /** - * @template T as Printer - * - * @param class-string $class - * - * @return T - */ - private function createPrinter(string $class, array $arguments): Printer - { - return new $class( - (isset($arguments['stderr']) && $arguments['stderr'] === true) ? 'php://stderr' : null, - $arguments['verbose'], - $arguments['colors'], - $arguments['debug'], - $arguments['columns'], - $arguments['reverseList'] - ); - } - - private function codeCoverageGenerationStart(string $format): void - { - $this->printer->write( - \sprintf( - "\nGenerating code coverage report in %s format ... ", - $format - ) - ); - - Timer::start(); - } - - private function codeCoverageGenerationSucceeded(): void - { - $this->printer->write( - \sprintf( - "done [%s]\n", - Timer::secondsToTimeString(Timer::stop()) - ) - ); - } - - private function codeCoverageGenerationFailed(\Exception $e): void - { - $this->printer->write( - \sprintf( - "failed [%s]\n%s\n", - Timer::secondsToTimeString(Timer::stop()), - $e->getMessage() - ) - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php b/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php deleted file mode 100644 index e1cc484..0000000 --- a/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php +++ /dev/null @@ -1,578 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\Annotation; - -use PharIo\Version\VersionConstraintParser; -use PHPUnit\Framework\InvalidDataProviderException; -use PHPUnit\Framework\SkippedTestError; -use PHPUnit\Framework\Warning; -use PHPUnit\Util\Exception; -use PHPUnit\Util\InvalidDataSetException; - -/** - * This is an abstraction around a PHPUnit-specific docBlock, - * allowing us to ask meaningful questions about a specific - * reflection symbol. - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class DocBlock -{ - /** - * @todo This constant should be private (it's public because of TestTest::testGetProvidedDataRegEx) - */ - public const REGEX_DATA_PROVIDER = '/@dataProvider\s+([a-zA-Z0-9._:-\\\\x7f-\xff]+)/'; - - private const REGEX_REQUIRES_VERSION = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[<>=!]{0,2})\s*(?P[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m'; - - private const REGEX_REQUIRES_VERSION_CONSTRAINT = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[\d\t \-.|~^]+)[ \t]*\r?$/m'; - - private const REGEX_REQUIRES_OS = '/@requires\s+(?POS(?:FAMILY)?)\s+(?P.+?)[ \t]*\r?$/m'; - - private const REGEX_REQUIRES_SETTING = '/@requires\s+(?Psetting)\s+(?P([^ ]+?))\s*(?P[\w\.-]+[\w\.]?)?[ \t]*\r?$/m'; - - private const REGEX_REQUIRES = '/@requires\s+(?Pfunction|extension)\s+(?P([^\s<>=!]+))\s*(?P[<>=!]{0,2})\s*(?P[\d\.-]+[\d\.]?)?[ \t]*\r?$/m'; - - private const REGEX_TEST_WITH = '/@testWith\s+/'; - - private const REGEX_EXPECTED_EXCEPTION = '(@expectedException\s+([:.\w\\\\x7f-\xff]+)(?:[\t ]+(\S*))?(?:[\t ]+(\S*))?\s*$)m'; - - /** @var string */ - private $docComment; - - /** @var bool */ - private $isMethod; - - /** @var array> pre-parsed annotations indexed by name and occurrence index */ - private $symbolAnnotations; - - /** - * @var null|array - * - * @psalm-var null|(array{ - * __OFFSET: array&array{__FILE: string}, - * setting?: array, - * extension_versions?: array - * }&array< - * string, - * string|array{version: string, operator: string}|array{constraint: string}|array - * >) - */ - private $parsedRequirements; - - /** @var int */ - private $startLine; - - /** @var int */ - private $endLine; - - /** @var string */ - private $fileName; - - /** @var string */ - private $name; - - /** - * @var string - * - * @psalm-var class-string - */ - private $className; - - public static function ofClass(\ReflectionClass $class): self - { - $className = $class->getName(); - - return new self( - (string) $class->getDocComment(), - false, - self::extractAnnotationsFromReflector($class), - $class->getStartLine(), - $class->getEndLine(), - $class->getFileName(), - $className, - $className - ); - } - - /** - * @psalm-param class-string $classNameInHierarchy - */ - public static function ofMethod(\ReflectionMethod $method, string $classNameInHierarchy): self - { - return new self( - (string) $method->getDocComment(), - true, - self::extractAnnotationsFromReflector($method), - $method->getStartLine(), - $method->getEndLine(), - $method->getFileName(), - $method->getName(), - $classNameInHierarchy - ); - } - - /** - * Note: we do not preserve an instance of the reflection object, since it cannot be safely (de-)serialized. - * - * @param array> $symbolAnnotations - * - * @psalm-param class-string $className - */ - private function __construct(string $docComment, bool $isMethod, array $symbolAnnotations, int $startLine, int $endLine, string $fileName, string $name, string $className) - { - $this->docComment = $docComment; - $this->isMethod = $isMethod; - $this->symbolAnnotations = $symbolAnnotations; - $this->startLine = $startLine; - $this->endLine = $endLine; - $this->fileName = $fileName; - $this->name = $name; - $this->className = $className; - } - - /** - * @psalm-return array{ - * __OFFSET: array&array{__FILE: string}, - * setting?: array, - * extension_versions?: array - * }&array< - * string, - * string|array{version: string, operator: string}|array{constraint: string}|array - * > - * - * @throws Warning if the requirements version constraint is not well-formed - */ - public function requirements(): array - { - if ($this->parsedRequirements !== null) { - return $this->parsedRequirements; - } - - $offset = $this->startLine; - $requires = []; - $recordedSettings = []; - $extensionVersions = []; - $recordedOffsets = [ - '__FILE' => \realpath($this->fileName), - ]; - - // Split docblock into lines and rewind offset to start of docblock - $lines = \preg_split('/\r\n|\r|\n/', $this->docComment); - $offset -= \count($lines); - - foreach ($lines as $line) { - if (\preg_match(self::REGEX_REQUIRES_OS, $line, $matches)) { - $requires[$matches['name']] = $matches['value']; - $recordedOffsets[$matches['name']] = $offset; - } - - if (\preg_match(self::REGEX_REQUIRES_VERSION, $line, $matches)) { - $requires[$matches['name']] = [ - 'version' => $matches['version'], - 'operator' => $matches['operator'], - ]; - $recordedOffsets[$matches['name']] = $offset; - } - - if (\preg_match(self::REGEX_REQUIRES_VERSION_CONSTRAINT, $line, $matches)) { - if (!empty($requires[$matches['name']])) { - $offset++; - - continue; - } - - try { - $versionConstraintParser = new VersionConstraintParser; - - $requires[$matches['name'] . '_constraint'] = [ - 'constraint' => $versionConstraintParser->parse(\trim($matches['constraint'])), - ]; - $recordedOffsets[$matches['name'] . '_constraint'] = $offset; - } catch (\PharIo\Version\Exception $e) { - /* @TODO this catch is currently not valid, see https://github.com/phar-io/version/issues/16 */ - throw new Warning($e->getMessage(), $e->getCode(), $e); - } - } - - if (\preg_match(self::REGEX_REQUIRES_SETTING, $line, $matches)) { - $recordedSettings[$matches['setting']] = $matches['value']; - $recordedOffsets['__SETTING_' . $matches['setting']] = $offset; - } - - if (\preg_match(self::REGEX_REQUIRES, $line, $matches)) { - $name = $matches['name'] . 's'; - - if (!isset($requires[$name])) { - $requires[$name] = []; - } - - $requires[$name][] = $matches['value']; - $recordedOffsets[$matches['name'] . '_' . $matches['value']] = $offset; - - if ($name === 'extensions' && !empty($matches['version'])) { - $extensionVersions[$matches['value']] = [ - 'version' => $matches['version'], - 'operator' => $matches['operator'], - ]; - } - } - - $offset++; - } - - return $this->parsedRequirements = \array_merge( - $requires, - ['__OFFSET' => $recordedOffsets], - \array_filter([ - 'setting' => $recordedSettings, - 'extension_versions' => $extensionVersions, - ]) - ); - } - - /** - * @return array|bool - * - * @psalm-return false|array{ - * class: class-string, - * code: int|string|null, - * message: string, - * message_regex: string - * } - */ - public function expectedException() - { - $docComment = (string) \substr($this->docComment, 3, -2); - - if (1 !== \preg_match(self::REGEX_EXPECTED_EXCEPTION, $docComment, $matches)) { - return false; - } - - /** @psalm-var class-string $class */ - $class = $matches[1]; - $annotations = $this->symbolAnnotations(); - $code = null; - $message = ''; - $messageRegExp = ''; - - if (isset($matches[2])) { - $message = \trim($matches[2]); - } elseif (isset($annotations['expectedExceptionMessage'])) { - $message = $this->parseAnnotationContent($annotations['expectedExceptionMessage'][0]); - } - - if (isset($annotations['expectedExceptionMessageRegExp'])) { - $messageRegExp = $this->parseAnnotationContent($annotations['expectedExceptionMessageRegExp'][0]); - } - - if (isset($matches[3])) { - $code = $matches[3]; - } elseif (isset($annotations['expectedExceptionCode'])) { - $code = $this->parseAnnotationContent($annotations['expectedExceptionCode'][0]); - } - - if (\is_numeric($code)) { - $code = (int) $code; - } elseif (\is_string($code) && \defined($code)) { - $code = (int) \constant($code); - } - - return [ - 'class' => $class, - 'code' => $code, - 'message' => $message, - 'message_regex' => $messageRegExp, - ]; - } - - /** - * Returns the provided data for a method. - * - * @throws Exception - */ - public function getProvidedData(): ?array - { - /** @noinspection SuspiciousBinaryOperationInspection */ - $data = $this->getDataFromDataProviderAnnotation($this->docComment) ?? $this->getDataFromTestWithAnnotation($this->docComment); - - if ($data === null) { - return null; - } - - if ($data === []) { - throw new SkippedTestError; - } - - foreach ($data as $key => $value) { - if (!\is_array($value)) { - throw new InvalidDataSetException( - \sprintf( - 'Data set %s is invalid.', - \is_int($key) ? '#' . $key : '"' . $key . '"' - ) - ); - } - } - - return $data; - } - - /** - * @psalm-return array - */ - public function getInlineAnnotations(): array - { - $code = \file($this->fileName); - $lineNumber = $this->startLine; - $startLine = $this->startLine - 1; - $endLine = $this->endLine - 1; - $codeLines = \array_slice($code, $startLine, $endLine - $startLine + 1); - $annotations = []; - - foreach ($codeLines as $line) { - if (\preg_match('#/\*\*?\s*@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?\*/$#m', $line, $matches)) { - $annotations[\strtolower($matches['name'])] = [ - 'line' => $lineNumber, - 'value' => $matches['value'], - ]; - } - - $lineNumber++; - } - - return $annotations; - } - - public function symbolAnnotations(): array - { - return $this->symbolAnnotations; - } - - public function isHookToBeExecutedBeforeClass(): bool - { - return $this->isMethod - && false !== \strpos($this->docComment, '@beforeClass'); - } - - public function isHookToBeExecutedAfterClass(): bool - { - return $this->isMethod - && false !== \strpos($this->docComment, '@afterClass'); - } - - public function isToBeExecutedBeforeTest(): bool - { - return 1 === \preg_match('/@before\b/', $this->docComment); - } - - public function isToBeExecutedAfterTest(): bool - { - return 1 === \preg_match('/@after\b/', $this->docComment); - } - - /** - * Parse annotation content to use constant/class constant values - * - * Constants are specified using a starting '@'. For example: @ClassName::CONST_NAME - * - * If the constant is not found the string is used as is to ensure maximum BC. - */ - private function parseAnnotationContent(string $message): string - { - if (\defined($message) && - (\strpos($message, '::') !== false && \substr_count($message, '::') + 1 === 2)) { - return \constant($message); - } - - return $message; - } - - private function getDataFromDataProviderAnnotation(string $docComment): ?array - { - $methodName = null; - $className = $this->className; - - if ($this->isMethod) { - $methodName = $this->name; - } - - if (!\preg_match_all(self::REGEX_DATA_PROVIDER, $docComment, $matches)) { - return null; - } - - $result = []; - - foreach ($matches[1] as $match) { - $dataProviderMethodNameNamespace = \explode('\\', $match); - $leaf = \explode('::', \array_pop($dataProviderMethodNameNamespace)); - $dataProviderMethodName = \array_pop($leaf); - - if (empty($dataProviderMethodNameNamespace)) { - $dataProviderMethodNameNamespace = ''; - } else { - $dataProviderMethodNameNamespace = \implode('\\', $dataProviderMethodNameNamespace) . '\\'; - } - - if (empty($leaf)) { - $dataProviderClassName = $className; - } else { - /** @psalm-var class-string $dataProviderClassName */ - $dataProviderClassName = $dataProviderMethodNameNamespace . \array_pop($leaf); - } - - try { - $dataProviderClass = new \ReflectionClass($dataProviderClassName); - - $dataProviderMethod = $dataProviderClass->getMethod( - $dataProviderMethodName - ); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - // @codeCoverageIgnoreEnd - } - - if ($dataProviderMethod->isStatic()) { - $object = null; - } else { - $object = $dataProviderClass->newInstance(); - } - - if ($dataProviderMethod->getNumberOfParameters() === 0) { - $data = $dataProviderMethod->invoke($object); - } else { - $data = $dataProviderMethod->invoke($object, $methodName); - } - - if ($data instanceof \Traversable) { - $origData = $data; - $data = []; - - foreach ($origData as $key => $value) { - if (\is_int($key)) { - $data[] = $value; - } elseif (\array_key_exists($key, $data)) { - throw new InvalidDataProviderException( - \sprintf( - 'The key "%s" has already been defined in the data provider "%s".', - $key, - $match - ) - ); - } else { - $data[$key] = $value; - } - } - } - - if (\is_array($data)) { - $result = \array_merge($result, $data); - } - } - - return $result; - } - - /** - * @throws Exception - */ - private function getDataFromTestWithAnnotation(string $docComment): ?array - { - $docComment = $this->cleanUpMultiLineAnnotation($docComment); - - if (!\preg_match(self::REGEX_TEST_WITH, $docComment, $matches, \PREG_OFFSET_CAPTURE)) { - return null; - } - - $offset = \strlen($matches[0][0]) + $matches[0][1]; - $annotationContent = \substr($docComment, $offset); - $data = []; - - foreach (\explode("\n", $annotationContent) as $candidateRow) { - $candidateRow = \trim($candidateRow); - - if ($candidateRow[0] !== '[') { - break; - } - - $dataSet = \json_decode($candidateRow, true); - - if (\json_last_error() !== \JSON_ERROR_NONE) { - throw new Exception( - 'The data set for the @testWith annotation cannot be parsed: ' . \json_last_error_msg() - ); - } - - $data[] = $dataSet; - } - - if (!$data) { - throw new Exception('The data set for the @testWith annotation cannot be parsed.'); - } - - return $data; - } - - private function cleanUpMultiLineAnnotation(string $docComment): string - { - //removing initial ' * ' for docComment - $docComment = \str_replace("\r\n", "\n", $docComment); - $docComment = \preg_replace('/' . '\n' . '\s*' . '\*' . '\s?' . '/', "\n", $docComment); - $docComment = (string) \substr($docComment, 0, -1); - - return \rtrim($docComment, "\n"); - } - - /** @return array> */ - private static function parseDocBlock(string $docBlock): array - { - // Strip away the docblock header and footer to ease parsing of one line annotations - $docBlock = (string) \substr($docBlock, 3, -2); - $annotations = []; - - if (\preg_match_all('/@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?$/m', $docBlock, $matches)) { - $numMatches = \count($matches[0]); - - for ($i = 0; $i < $numMatches; ++$i) { - $annotations[$matches['name'][$i]][] = (string) $matches['value'][$i]; - } - } - - return $annotations; - } - - /** @param \ReflectionClass|\ReflectionFunctionAbstract $reflector */ - private static function extractAnnotationsFromReflector(\Reflector $reflector): array - { - $annotations = []; - - if ($reflector instanceof \ReflectionClass) { - $annotations = \array_merge( - $annotations, - ...\array_map( - function (\ReflectionClass $trait): array { - return self::parseDocBlock((string) $trait->getDocComment()); - }, - \array_values($reflector->getTraits()) - ) - ); - } - - return \array_merge( - $annotations, - self::parseDocBlock((string) $reflector->getDocComment()) - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php b/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php deleted file mode 100644 index 0706ba3..0000000 --- a/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\Annotation; - -use PHPUnit\Util\Exception; - -/** - * Reflection information, and therefore DocBlock information, is static within - * a single PHP process. It is therefore okay to use a Singleton registry here. - * - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Registry -{ - /** @var null|self */ - private static $instance; - - /** @var array indexed by class name */ - private $classDocBlocks = []; - - /** @var array> indexed by class name and method name */ - private $methodDocBlocks = []; - - public static function getInstance(): self - { - return self::$instance ?? self::$instance = new self; - } - - private function __construct() - { - } - - /** - * @throws Exception - * @psalm-param class-string $class - */ - public function forClassName(string $class): DocBlock - { - if (\array_key_exists($class, $this->classDocBlocks)) { - return $this->classDocBlocks[$class]; - } - - try { - $reflection = new \ReflectionClass($class); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - return $this->classDocBlocks[$class] = DocBlock::ofClass($reflection); - } - - /** - * @throws Exception - * @psalm-param class-string $classInHierarchy - */ - public function forMethod(string $classInHierarchy, string $method): DocBlock - { - if (isset($this->methodDocBlocks[$classInHierarchy][$method])) { - return $this->methodDocBlocks[$classInHierarchy][$method]; - } - - try { - $reflection = new \ReflectionMethod($classInHierarchy, $method); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - return $this->methodDocBlocks[$classInHierarchy][$method] = DocBlock::ofMethod($reflection, $classInHierarchy); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Blacklist.php b/vendor/phpunit/phpunit/src/Util/Blacklist.php deleted file mode 100644 index 3915cd6..0000000 --- a/vendor/phpunit/phpunit/src/Util/Blacklist.php +++ /dev/null @@ -1,216 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use Composer\Autoload\ClassLoader; -use DeepCopy\DeepCopy; -use Doctrine\Instantiator\Instantiator; -use PharIo\Manifest\Manifest; -use PharIo\Version\Version as PharIoVersion; -use PHP_Token; -use phpDocumentor\Reflection\DocBlock; -use phpDocumentor\Reflection\Project; -use phpDocumentor\Reflection\Type; -use PHPUnit\Framework\TestCase; -use Prophecy\Prophet; -use SebastianBergmann\CodeCoverage\CodeCoverage; -use SebastianBergmann\CodeUnitReverseLookup\Wizard; -use SebastianBergmann\Comparator\Comparator; -use SebastianBergmann\Diff\Diff; -use SebastianBergmann\Environment\Runtime; -use SebastianBergmann\Exporter\Exporter; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; -use SebastianBergmann\GlobalState\Snapshot; -use SebastianBergmann\Invoker\Invoker; -use SebastianBergmann\ObjectEnumerator\Enumerator; -use SebastianBergmann\RecursionContext\Context; -use SebastianBergmann\ResourceOperations\ResourceOperations; -use SebastianBergmann\Timer\Timer; -use SebastianBergmann\Type\TypeName; -use SebastianBergmann\Version; -use Text_Template; -use TheSeer\Tokenizer\Tokenizer; -use Webmozart\Assert\Assert; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Blacklist -{ - /** - * @var array - */ - public static $blacklistedClassNames = [ - // composer - ClassLoader::class => 1, - - // doctrine/instantiator - Instantiator::class => 1, - - // myclabs/deepcopy - DeepCopy::class => 1, - - // phar-io/manifest - Manifest::class => 1, - - // phar-io/version - PharIoVersion::class => 1, - - // phpdocumentor/reflection-common - Project::class => 1, - - // phpdocumentor/reflection-docblock - DocBlock::class => 1, - - // phpdocumentor/type-resolver - Type::class => 1, - - // phpspec/prophecy - Prophet::class => 1, - - // phpunit/phpunit - TestCase::class => 2, - - // phpunit/php-code-coverage - CodeCoverage::class => 1, - - // phpunit/php-file-iterator - FileIteratorFacade::class => 1, - - // phpunit/php-invoker - Invoker::class => 1, - - // phpunit/php-text-template - Text_Template::class => 1, - - // phpunit/php-timer - Timer::class => 1, - - // phpunit/php-token-stream - PHP_Token::class => 1, - - // sebastian/code-unit-reverse-lookup - Wizard::class => 1, - - // sebastian/comparator - Comparator::class => 1, - - // sebastian/diff - Diff::class => 1, - - // sebastian/environment - Runtime::class => 1, - - // sebastian/exporter - Exporter::class => 1, - - // sebastian/global-state - Snapshot::class => 1, - - // sebastian/object-enumerator - Enumerator::class => 1, - - // sebastian/recursion-context - Context::class => 1, - - // sebastian/resource-operations - ResourceOperations::class => 1, - - // sebastian/type - TypeName::class => 1, - - // sebastian/version - Version::class => 1, - - // theseer/tokenizer - Tokenizer::class => 1, - - // webmozart/assert - Assert::class => 1, - ]; - - /** - * @var string[] - */ - private static $directories; - - /** - * @throws Exception - * - * @return string[] - */ - public function getBlacklistedDirectories(): array - { - $this->initialize(); - - return self::$directories; - } - - /** - * @throws Exception - */ - public function isBlacklisted(string $file): bool - { - if (\defined('PHPUNIT_TESTSUITE')) { - return false; - } - - $this->initialize(); - - foreach (self::$directories as $directory) { - if (\strpos($file, $directory) === 0) { - return true; - } - } - - return false; - } - - /** - * @throws Exception - */ - private function initialize(): void - { - if (self::$directories === null) { - self::$directories = []; - - foreach (self::$blacklistedClassNames as $className => $parent) { - if (!\class_exists($className)) { - continue; - } - - try { - $directory = (new \ReflectionClass($className))->getFileName(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - for ($i = 0; $i < $parent; $i++) { - $directory = \dirname($directory); - } - - self::$directories[] = $directory; - } - - // Hide process isolation workaround on Windows. - if (\DIRECTORY_SEPARATOR === '\\') { - // tempnam() prefix is limited to first 3 chars. - // @see https://php.net/manual/en/function.tempnam.php - self::$directories[] = \sys_get_temp_dir() . '\\PHP'; - } - } - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Color.php b/vendor/phpunit/phpunit/src/Util/Color.php deleted file mode 100644 index c0611d1..0000000 --- a/vendor/phpunit/phpunit/src/Util/Color.php +++ /dev/null @@ -1,143 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Color -{ - /** - * @var array - */ - private const WHITESPACE_MAP = [ - ' ' => 'Ā·', - "\t" => '⇄', - ]; - - /** - * @var array - */ - private const WHITESPACE_EOL_MAP = [ - ' ' => 'Ā·', - "\t" => '⇄', - "\n" => '↵', - "\r" => '⟵', - ]; - - /** - * @var array - */ - private static $ansiCodes = [ - 'reset' => '0', - 'bold' => '1', - 'dim' => '2', - 'dim-reset' => '22', - 'underlined' => '4', - 'fg-default' => '39', - 'fg-black' => '30', - 'fg-red' => '31', - 'fg-green' => '32', - 'fg-yellow' => '33', - 'fg-blue' => '34', - 'fg-magenta' => '35', - 'fg-cyan' => '36', - 'fg-white' => '37', - 'bg-default' => '49', - 'bg-black' => '40', - 'bg-red' => '41', - 'bg-green' => '42', - 'bg-yellow' => '43', - 'bg-blue' => '44', - 'bg-magenta' => '45', - 'bg-cyan' => '46', - 'bg-white' => '47', - ]; - - public static function colorize(string $color, string $buffer): string - { - if (\trim($buffer) === '') { - return $buffer; - } - - $codes = \array_map('\trim', \explode(',', $color)); - $styles = []; - - foreach ($codes as $code) { - if (isset(self::$ansiCodes[$code])) { - $styles[] = self::$ansiCodes[$code] ?? ''; - } - } - - if (empty($styles)) { - return $buffer; - } - - return self::optimizeColor(\sprintf("\x1b[%sm", \implode(';', $styles)) . $buffer . "\x1b[0m"); - } - - public static function colorizePath(string $path, ?string $prevPath = null, bool $colorizeFilename = false): string - { - if ($prevPath === null) { - $prevPath = ''; - } - - $path = \explode(\DIRECTORY_SEPARATOR, $path); - $prevPath = \explode(\DIRECTORY_SEPARATOR, $prevPath); - - for ($i = 0; $i < \min(\count($path), \count($prevPath)); $i++) { - if ($path[$i] == $prevPath[$i]) { - $path[$i] = self::dim($path[$i]); - } - } - - if ($colorizeFilename) { - $last = \count($path) - 1; - $path[$last] = \preg_replace_callback( - '/([\-_\.]+|phpt$)/', - static function ($matches) { - return self::dim($matches[0]); - }, - $path[$last] - ); - } - - return self::optimizeColor(\implode(self::dim(\DIRECTORY_SEPARATOR), $path)); - } - - public static function dim(string $buffer): string - { - if (\trim($buffer) === '') { - return $buffer; - } - - return "\e[2m$buffer\e[22m"; - } - - public static function visualizeWhitespace(string $buffer, bool $visualizeEOL = false): string - { - $replaceMap = $visualizeEOL ? self::WHITESPACE_EOL_MAP : self::WHITESPACE_MAP; - - return \preg_replace_callback('/\s+/', static function ($matches) use ($replaceMap) { - return self::dim(\strtr($matches[0], $replaceMap)); - }, $buffer); - } - - private static function optimizeColor(string $buffer): string - { - $patterns = [ - "/\e\\[22m\e\\[2m/" => '', - "/\e\\[([^m]*)m\e\\[([1-9][0-9;]*)m/" => "\e[$1;$2m", - "/(\e\\[[^m]*m)+(\e\\[0m)/" => '$2', - ]; - - return \preg_replace(\array_keys($patterns), \array_values($patterns), $buffer); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Configuration.php b/vendor/phpunit/phpunit/src/Util/Configuration.php deleted file mode 100644 index d756af8..0000000 --- a/vendor/phpunit/phpunit/src/Util/Configuration.php +++ /dev/null @@ -1,1205 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use DOMElement; -use DOMXPath; -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Runner\TestSuiteSorter; -use PHPUnit\TextUI\ResultPrinter; -use PHPUnit\Util\TestDox\CliTestDoxPrinter; -use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Configuration -{ - /** - * @var self[] - */ - private static $instances = []; - - /** - * @var \DOMDocument - */ - private $document; - - /** - * @var DOMXPath - */ - private $xpath; - - /** - * @var string - */ - private $filename; - - /** - * @var \LibXMLError[] - */ - private $errors = []; - - /** - * Returns a PHPUnit configuration object. - * - * @throws Exception - */ - public static function getInstance(string $filename): self - { - $realPath = \realpath($filename); - - if ($realPath === false) { - throw new Exception( - \sprintf( - 'Could not read "%s".', - $filename - ) - ); - } - - if (!isset(self::$instances[$realPath])) { - self::$instances[$realPath] = new self($realPath); - } - - return self::$instances[$realPath]; - } - - /** - * Loads a PHPUnit configuration file. - * - * @throws Exception - */ - private function __construct(string $filename) - { - $this->filename = $filename; - $this->document = Xml::loadFile($filename, false, true, true); - $this->xpath = new DOMXPath($this->document); - - $this->validateConfigurationAgainstSchema(); - } - - /** - * @codeCoverageIgnore - */ - private function __clone() - { - } - - public function hasValidationErrors(): bool - { - return \count($this->errors) > 0; - } - - public function getValidationErrors(): array - { - $result = []; - - foreach ($this->errors as $error) { - if (!isset($result[$error->line])) { - $result[$error->line] = []; - } - $result[$error->line][] = \trim($error->message); - } - - return $result; - } - - /** - * Returns the real path to the configuration file. - */ - public function getFilename(): string - { - return $this->filename; - } - - public function getExtensionConfiguration(): array - { - $result = []; - - foreach ($this->xpath->query('extensions/extension') as $extension) { - $result[] = $this->getElementConfigurationParameters($extension); - } - - return $result; - } - - /** - * Returns the configuration for SUT filtering. - */ - public function getFilterConfiguration(): array - { - $addUncoveredFilesFromWhitelist = true; - $processUncoveredFilesFromWhitelist = false; - $includeDirectory = []; - $includeFile = []; - $excludeDirectory = []; - $excludeFile = []; - - $tmp = $this->xpath->query('filter/whitelist'); - - if ($tmp->length === 1) { - if ($tmp->item(0)->hasAttribute('addUncoveredFilesFromWhitelist')) { - $addUncoveredFilesFromWhitelist = $this->getBoolean( - (string) $tmp->item(0)->getAttribute( - 'addUncoveredFilesFromWhitelist' - ), - true - ); - } - - if ($tmp->item(0)->hasAttribute('processUncoveredFilesFromWhitelist')) { - $processUncoveredFilesFromWhitelist = $this->getBoolean( - (string) $tmp->item(0)->getAttribute( - 'processUncoveredFilesFromWhitelist' - ), - false - ); - } - - $includeDirectory = $this->readFilterDirectories( - 'filter/whitelist/directory' - ); - - $includeFile = $this->readFilterFiles( - 'filter/whitelist/file' - ); - - $excludeDirectory = $this->readFilterDirectories( - 'filter/whitelist/exclude/directory' - ); - - $excludeFile = $this->readFilterFiles( - 'filter/whitelist/exclude/file' - ); - } - - return [ - 'whitelist' => [ - 'addUncoveredFilesFromWhitelist' => $addUncoveredFilesFromWhitelist, - 'processUncoveredFilesFromWhitelist' => $processUncoveredFilesFromWhitelist, - 'include' => [ - 'directory' => $includeDirectory, - 'file' => $includeFile, - ], - 'exclude' => [ - 'directory' => $excludeDirectory, - 'file' => $excludeFile, - ], - ], - ]; - } - - /** - * Returns the configuration for groups. - */ - public function getGroupConfiguration(): array - { - return $this->parseGroupConfiguration('groups'); - } - - /** - * Returns the configuration for testdox groups. - */ - public function getTestdoxGroupConfiguration(): array - { - return $this->parseGroupConfiguration('testdoxGroups'); - } - - /** - * Returns the configuration for listeners. - */ - public function getListenerConfiguration(): array - { - $result = []; - - foreach ($this->xpath->query('listeners/listener') as $listener) { - $result[] = $this->getElementConfigurationParameters($listener); - } - - return $result; - } - - /** - * Returns the logging configuration. - */ - public function getLoggingConfiguration(): array - { - $result = []; - - foreach ($this->xpath->query('logging/log') as $log) { - \assert($log instanceof DOMElement); - - $type = (string) $log->getAttribute('type'); - $target = (string) $log->getAttribute('target'); - - if (!$target) { - continue; - } - - $target = $this->toAbsolutePath($target); - - if ($type === 'coverage-html') { - if ($log->hasAttribute('lowUpperBound')) { - $result['lowUpperBound'] = $this->getInteger( - (string) $log->getAttribute('lowUpperBound'), - 50 - ); - } - - if ($log->hasAttribute('highLowerBound')) { - $result['highLowerBound'] = $this->getInteger( - (string) $log->getAttribute('highLowerBound'), - 90 - ); - } - } elseif ($type === 'coverage-crap4j') { - if ($log->hasAttribute('threshold')) { - $result['crap4jThreshold'] = $this->getInteger( - (string) $log->getAttribute('threshold'), - 30 - ); - } - } elseif ($type === 'coverage-text') { - if ($log->hasAttribute('showUncoveredFiles')) { - $result['coverageTextShowUncoveredFiles'] = $this->getBoolean( - (string) $log->getAttribute('showUncoveredFiles'), - false - ); - } - - if ($log->hasAttribute('showOnlySummary')) { - $result['coverageTextShowOnlySummary'] = $this->getBoolean( - (string) $log->getAttribute('showOnlySummary'), - false - ); - } - } - - $result[$type] = $target; - } - - return $result; - } - - /** - * Returns the PHP configuration. - */ - public function getPHPConfiguration(): array - { - $result = [ - 'include_path' => [], - 'ini' => [], - 'const' => [], - 'var' => [], - 'env' => [], - 'post' => [], - 'get' => [], - 'cookie' => [], - 'server' => [], - 'files' => [], - 'request' => [], - ]; - - foreach ($this->xpath->query('php/includePath') as $includePath) { - $path = (string) $includePath->textContent; - - if ($path) { - $result['include_path'][] = $this->toAbsolutePath($path); - } - } - - foreach ($this->xpath->query('php/ini') as $ini) { - \assert($ini instanceof DOMElement); - - $name = (string) $ini->getAttribute('name'); - $value = (string) $ini->getAttribute('value'); - - $result['ini'][$name]['value'] = $value; - } - - foreach ($this->xpath->query('php/const') as $const) { - \assert($const instanceof DOMElement); - - $name = (string) $const->getAttribute('name'); - $value = (string) $const->getAttribute('value'); - - $result['const'][$name]['value'] = $this->getBoolean($value, $value); - } - - foreach (['var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request'] as $array) { - foreach ($this->xpath->query('php/' . $array) as $var) { - \assert($var instanceof DOMElement); - - $name = (string) $var->getAttribute('name'); - $value = (string) $var->getAttribute('value'); - $verbatim = false; - - if ($var->hasAttribute('verbatim')) { - $verbatim = $this->getBoolean($var->getAttribute('verbatim'), false); - $result[$array][$name]['verbatim'] = $verbatim; - } - - if ($var->hasAttribute('force')) { - $force = $this->getBoolean($var->getAttribute('force'), false); - $result[$array][$name]['force'] = $force; - } - - if (!$verbatim) { - $value = $this->getBoolean($value, $value); - } - - $result[$array][$name]['value'] = $value; - } - } - - return $result; - } - - /** - * Handles the PHP configuration. - */ - public function handlePHPConfiguration(): void - { - $configuration = $this->getPHPConfiguration(); - - if (!empty($configuration['include_path'])) { - \ini_set( - 'include_path', - \implode(\PATH_SEPARATOR, $configuration['include_path']) . - \PATH_SEPARATOR . - \ini_get('include_path') - ); - } - - foreach ($configuration['ini'] as $name => $data) { - $value = $data['value']; - - if (\defined($value)) { - $value = (string) \constant($value); - } - - \ini_set($name, $value); - } - - foreach ($configuration['const'] as $name => $data) { - $value = $data['value']; - - if (!\defined($name)) { - \define($name, $value); - } - } - - foreach (['var', 'post', 'get', 'cookie', 'server', 'files', 'request'] as $array) { - /* - * @see https://github.com/sebastianbergmann/phpunit/issues/277 - */ - switch ($array) { - case 'var': - $target = &$GLOBALS; - - break; - - case 'server': - $target = &$_SERVER; - - break; - - default: - $target = &$GLOBALS['_' . \strtoupper($array)]; - - break; - } - - foreach ($configuration[$array] as $name => $data) { - $target[$name] = $data['value']; - } - } - - foreach ($configuration['env'] as $name => $data) { - $value = $data['value']; - $force = $data['force'] ?? false; - - if ($force || \getenv($name) === false) { - \putenv("{$name}={$value}"); - } - - $value = \getenv($name); - - if (!isset($_ENV[$name])) { - $_ENV[$name] = $value; - } - - if ($force) { - $_ENV[$name] = $value; - } - } - } - - /** - * Returns the PHPUnit configuration. - */ - public function getPHPUnitConfiguration(): array - { - $result = []; - $root = $this->document->documentElement; - - if ($root->hasAttribute('cacheTokens')) { - $result['cacheTokens'] = $this->getBoolean( - (string) $root->getAttribute('cacheTokens'), - false - ); - } - - if ($root->hasAttribute('columns')) { - $columns = (string) $root->getAttribute('columns'); - - if ($columns === 'max') { - $result['columns'] = 'max'; - } else { - $result['columns'] = $this->getInteger($columns, 80); - } - } - - if ($root->hasAttribute('colors')) { - /* only allow boolean for compatibility with previous versions - 'always' only allowed from command line */ - if ($this->getBoolean($root->getAttribute('colors'), false)) { - $result['colors'] = ResultPrinter::COLOR_AUTO; - } else { - $result['colors'] = ResultPrinter::COLOR_NEVER; - } - } - - /* - * @see https://github.com/sebastianbergmann/phpunit/issues/657 - */ - if ($root->hasAttribute('stderr')) { - $result['stderr'] = $this->getBoolean( - (string) $root->getAttribute('stderr'), - false - ); - } - - if ($root->hasAttribute('backupGlobals')) { - $result['backupGlobals'] = $this->getBoolean( - (string) $root->getAttribute('backupGlobals'), - false - ); - } - - if ($root->hasAttribute('backupStaticAttributes')) { - $result['backupStaticAttributes'] = $this->getBoolean( - (string) $root->getAttribute('backupStaticAttributes'), - false - ); - } - - if ($root->getAttribute('bootstrap')) { - $result['bootstrap'] = $this->toAbsolutePath( - (string) $root->getAttribute('bootstrap') - ); - } - - if ($root->hasAttribute('convertDeprecationsToExceptions')) { - $result['convertDeprecationsToExceptions'] = $this->getBoolean( - (string) $root->getAttribute('convertDeprecationsToExceptions'), - true - ); - } - - if ($root->hasAttribute('convertErrorsToExceptions')) { - $result['convertErrorsToExceptions'] = $this->getBoolean( - (string) $root->getAttribute('convertErrorsToExceptions'), - true - ); - } - - if ($root->hasAttribute('convertNoticesToExceptions')) { - $result['convertNoticesToExceptions'] = $this->getBoolean( - (string) $root->getAttribute('convertNoticesToExceptions'), - true - ); - } - - if ($root->hasAttribute('convertWarningsToExceptions')) { - $result['convertWarningsToExceptions'] = $this->getBoolean( - (string) $root->getAttribute('convertWarningsToExceptions'), - true - ); - } - - if ($root->hasAttribute('forceCoversAnnotation')) { - $result['forceCoversAnnotation'] = $this->getBoolean( - (string) $root->getAttribute('forceCoversAnnotation'), - false - ); - } - - if ($root->hasAttribute('disableCodeCoverageIgnore')) { - $result['disableCodeCoverageIgnore'] = $this->getBoolean( - (string) $root->getAttribute('disableCodeCoverageIgnore'), - false - ); - } - - if ($root->hasAttribute('processIsolation')) { - $result['processIsolation'] = $this->getBoolean( - (string) $root->getAttribute('processIsolation'), - false - ); - } - - if ($root->hasAttribute('stopOnDefect')) { - $result['stopOnDefect'] = $this->getBoolean( - (string) $root->getAttribute('stopOnDefect'), - false - ); - } - - if ($root->hasAttribute('stopOnError')) { - $result['stopOnError'] = $this->getBoolean( - (string) $root->getAttribute('stopOnError'), - false - ); - } - - if ($root->hasAttribute('stopOnFailure')) { - $result['stopOnFailure'] = $this->getBoolean( - (string) $root->getAttribute('stopOnFailure'), - false - ); - } - - if ($root->hasAttribute('stopOnWarning')) { - $result['stopOnWarning'] = $this->getBoolean( - (string) $root->getAttribute('stopOnWarning'), - false - ); - } - - if ($root->hasAttribute('stopOnIncomplete')) { - $result['stopOnIncomplete'] = $this->getBoolean( - (string) $root->getAttribute('stopOnIncomplete'), - false - ); - } - - if ($root->hasAttribute('stopOnRisky')) { - $result['stopOnRisky'] = $this->getBoolean( - (string) $root->getAttribute('stopOnRisky'), - false - ); - } - - if ($root->hasAttribute('stopOnSkipped')) { - $result['stopOnSkipped'] = $this->getBoolean( - (string) $root->getAttribute('stopOnSkipped'), - false - ); - } - - if ($root->hasAttribute('failOnWarning')) { - $result['failOnWarning'] = $this->getBoolean( - (string) $root->getAttribute('failOnWarning'), - false - ); - } - - if ($root->hasAttribute('failOnRisky')) { - $result['failOnRisky'] = $this->getBoolean( - (string) $root->getAttribute('failOnRisky'), - false - ); - } - - if ($root->hasAttribute('testSuiteLoaderClass')) { - $result['testSuiteLoaderClass'] = (string) $root->getAttribute( - 'testSuiteLoaderClass' - ); - } - - if ($root->hasAttribute('defaultTestSuite')) { - $result['defaultTestSuite'] = (string) $root->getAttribute( - 'defaultTestSuite' - ); - } - - if ($root->getAttribute('testSuiteLoaderFile')) { - $result['testSuiteLoaderFile'] = $this->toAbsolutePath( - (string) $root->getAttribute('testSuiteLoaderFile') - ); - } - - if ($root->hasAttribute('printerClass')) { - $result['printerClass'] = (string) $root->getAttribute( - 'printerClass' - ); - } - - if ($root->getAttribute('printerFile')) { - $result['printerFile'] = $this->toAbsolutePath( - (string) $root->getAttribute('printerFile') - ); - } - - if ($root->hasAttribute('beStrictAboutChangesToGlobalState')) { - $result['beStrictAboutChangesToGlobalState'] = $this->getBoolean( - (string) $root->getAttribute('beStrictAboutChangesToGlobalState'), - false - ); - } - - if ($root->hasAttribute('beStrictAboutOutputDuringTests')) { - $result['disallowTestOutput'] = $this->getBoolean( - (string) $root->getAttribute('beStrictAboutOutputDuringTests'), - false - ); - } - - if ($root->hasAttribute('beStrictAboutResourceUsageDuringSmallTests')) { - $result['beStrictAboutResourceUsageDuringSmallTests'] = $this->getBoolean( - (string) $root->getAttribute('beStrictAboutResourceUsageDuringSmallTests'), - false - ); - } - - if ($root->hasAttribute('beStrictAboutTestsThatDoNotTestAnything')) { - $result['reportUselessTests'] = $this->getBoolean( - (string) $root->getAttribute('beStrictAboutTestsThatDoNotTestAnything'), - true - ); - } - - if ($root->hasAttribute('beStrictAboutTodoAnnotatedTests')) { - $result['disallowTodoAnnotatedTests'] = $this->getBoolean( - (string) $root->getAttribute('beStrictAboutTodoAnnotatedTests'), - false - ); - } - - if ($root->hasAttribute('beStrictAboutCoversAnnotation')) { - $result['strictCoverage'] = $this->getBoolean( - (string) $root->getAttribute('beStrictAboutCoversAnnotation'), - false - ); - } - - if ($root->hasAttribute('defaultTimeLimit')) { - $result['defaultTimeLimit'] = $this->getInteger( - (string) $root->getAttribute('defaultTimeLimit'), - 1 - ); - } - - if ($root->hasAttribute('enforceTimeLimit')) { - $result['enforceTimeLimit'] = $this->getBoolean( - (string) $root->getAttribute('enforceTimeLimit'), - false - ); - } - - if ($root->hasAttribute('ignoreDeprecatedCodeUnitsFromCodeCoverage')) { - $result['ignoreDeprecatedCodeUnitsFromCodeCoverage'] = $this->getBoolean( - (string) $root->getAttribute('ignoreDeprecatedCodeUnitsFromCodeCoverage'), - false - ); - } - - if ($root->hasAttribute('timeoutForSmallTests')) { - $result['timeoutForSmallTests'] = $this->getInteger( - (string) $root->getAttribute('timeoutForSmallTests'), - 1 - ); - } - - if ($root->hasAttribute('timeoutForMediumTests')) { - $result['timeoutForMediumTests'] = $this->getInteger( - (string) $root->getAttribute('timeoutForMediumTests'), - 10 - ); - } - - if ($root->hasAttribute('timeoutForLargeTests')) { - $result['timeoutForLargeTests'] = $this->getInteger( - (string) $root->getAttribute('timeoutForLargeTests'), - 60 - ); - } - - if ($root->hasAttribute('reverseDefectList')) { - $result['reverseDefectList'] = $this->getBoolean( - (string) $root->getAttribute('reverseDefectList'), - false - ); - } - - if ($root->hasAttribute('verbose')) { - $result['verbose'] = $this->getBoolean( - (string) $root->getAttribute('verbose'), - false - ); - } - - if ($root->hasAttribute('testdox')) { - $testdox = $this->getBoolean( - (string) $root->getAttribute('testdox'), - false - ); - - if ($testdox) { - if (isset($result['printerClass'])) { - $result['conflictBetweenPrinterClassAndTestdox'] = true; - } else { - $result['printerClass'] = CliTestDoxPrinter::class; - } - } - } - - if ($root->hasAttribute('registerMockObjectsFromTestArgumentsRecursively')) { - $result['registerMockObjectsFromTestArgumentsRecursively'] = $this->getBoolean( - (string) $root->getAttribute('registerMockObjectsFromTestArgumentsRecursively'), - false - ); - } - - if ($root->hasAttribute('extensionsDirectory')) { - $result['extensionsDirectory'] = $this->toAbsolutePath( - (string) $root->getAttribute( - 'extensionsDirectory' - ) - ); - } - - if ($root->hasAttribute('cacheResult')) { - $result['cacheResult'] = $this->getBoolean( - (string) $root->getAttribute('cacheResult'), - true - ); - } - - if ($root->hasAttribute('cacheResultFile')) { - $result['cacheResultFile'] = $this->toAbsolutePath( - (string) $root->getAttribute('cacheResultFile') - ); - } - - if ($root->hasAttribute('executionOrder')) { - foreach (\explode(',', $root->getAttribute('executionOrder')) as $order) { - switch ($order) { - case 'default': - $result['executionOrder'] = TestSuiteSorter::ORDER_DEFAULT; - $result['executionOrderDefects'] = TestSuiteSorter::ORDER_DEFAULT; - $result['resolveDependencies'] = false; - - break; - - case 'defects': - $result['executionOrderDefects'] = TestSuiteSorter::ORDER_DEFECTS_FIRST; - - break; - - case 'depends': - $result['resolveDependencies'] = true; - - break; - - case 'duration': - $result['executionOrder'] = TestSuiteSorter::ORDER_DURATION; - - break; - - case 'no-depends': - $result['resolveDependencies'] = false; - - break; - - case 'random': - $result['executionOrder'] = TestSuiteSorter::ORDER_RANDOMIZED; - - break; - - case 'reverse': - $result['executionOrder'] = TestSuiteSorter::ORDER_REVERSED; - - break; - - case 'size': - $result['executionOrder'] = TestSuiteSorter::ORDER_SIZE; - - break; - } - } - } - - if ($root->hasAttribute('resolveDependencies')) { - $result['resolveDependencies'] = $this->getBoolean( - (string) $root->getAttribute('resolveDependencies'), - false - ); - } - - if ($root->hasAttribute('noInteraction')) { - $result['noInteraction'] = $this->getBoolean( - (string) $root->getAttribute('noInteraction'), - false - ); - } - - return $result; - } - - /** - * Returns the test suite configuration. - * - * @throws Exception - */ - public function getTestSuiteConfiguration(string $testSuiteFilter = ''): TestSuite - { - $testSuiteNodes = $this->xpath->query('testsuites/testsuite'); - - if ($testSuiteNodes->length === 0) { - $testSuiteNodes = $this->xpath->query('testsuite'); - } - - if ($testSuiteNodes->length === 1) { - return $this->getTestSuite($testSuiteNodes->item(0), $testSuiteFilter); - } - - $suite = new TestSuite; - - foreach ($testSuiteNodes as $testSuiteNode) { - $suite->addTestSuite( - $this->getTestSuite($testSuiteNode, $testSuiteFilter) - ); - } - - return $suite; - } - - /** - * Returns the test suite names from the configuration. - */ - public function getTestSuiteNames(): array - { - $names = []; - - foreach ($this->xpath->query('*/testsuite') as $node) { - /* @var DOMElement $node */ - $names[] = $node->getAttribute('name'); - } - - return $names; - } - - private function validateConfigurationAgainstSchema(): void - { - $original = \libxml_use_internal_errors(true); - $xsdFilename = __DIR__ . '/../../phpunit.xsd'; - - if (\defined('__PHPUNIT_PHAR_ROOT__')) { - $xsdFilename = __PHPUNIT_PHAR_ROOT__ . '/phpunit.xsd'; - } - - $this->document->schemaValidate($xsdFilename); - $this->errors = \libxml_get_errors(); - \libxml_clear_errors(); - \libxml_use_internal_errors($original); - } - - /** - * Collects and returns the configuration arguments from the PHPUnit - * XML configuration - */ - private function getConfigurationArguments(\DOMNodeList $nodes): array - { - $arguments = []; - - if ($nodes->length === 0) { - return $arguments; - } - - foreach ($nodes as $node) { - if (!$node instanceof DOMElement) { - continue; - } - - if ($node->tagName !== 'arguments') { - continue; - } - - foreach ($node->childNodes as $argument) { - if (!$argument instanceof DOMElement) { - continue; - } - - if ($argument->tagName === 'file' || $argument->tagName === 'directory') { - $arguments[] = $this->toAbsolutePath((string) $argument->textContent); - } else { - $arguments[] = Xml::xmlToVariable($argument); - } - } - } - - return $arguments; - } - - /** - * @throws \PHPUnit\Framework\Exception - */ - private function getTestSuite(DOMElement $testSuiteNode, string $testSuiteFilter = ''): TestSuite - { - if ($testSuiteNode->hasAttribute('name')) { - $suite = new TestSuite( - (string) $testSuiteNode->getAttribute('name') - ); - } else { - $suite = new TestSuite; - } - - $exclude = []; - - foreach ($testSuiteNode->getElementsByTagName('exclude') as $excludeNode) { - $excludeFile = (string) $excludeNode->textContent; - - if ($excludeFile) { - $exclude[] = $this->toAbsolutePath($excludeFile); - } - } - - $fileIteratorFacade = new FileIteratorFacade; - $testSuiteFilter = $testSuiteFilter ? \explode(',', $testSuiteFilter) : []; - - foreach ($testSuiteNode->getElementsByTagName('directory') as $directoryNode) { - \assert($directoryNode instanceof DOMElement); - - if (!empty($testSuiteFilter) && !\in_array($directoryNode->parentNode->getAttribute('name'), $testSuiteFilter)) { - continue; - } - - $directory = (string) $directoryNode->textContent; - - if (empty($directory)) { - continue; - } - - if (!$this->satisfiesPhpVersion($directoryNode)) { - continue; - } - - $files = $fileIteratorFacade->getFilesAsArray( - $this->toAbsolutePath($directory), - $directoryNode->hasAttribute('suffix') ? (string) $directoryNode->getAttribute('suffix') : 'Test.php', - $directoryNode->hasAttribute('prefix') ? (string) $directoryNode->getAttribute('prefix') : '', - $exclude - ); - - $suite->addTestFiles($files); - } - - foreach ($testSuiteNode->getElementsByTagName('file') as $fileNode) { - \assert($fileNode instanceof DOMElement); - - if (!empty($testSuiteFilter) && !\in_array($fileNode->parentNode->getAttribute('name'), $testSuiteFilter)) { - continue; - } - - $file = (string) $fileNode->textContent; - - if (empty($file)) { - continue; - } - - $file = $fileIteratorFacade->getFilesAsArray( - $this->toAbsolutePath($file) - ); - - if (!isset($file[0])) { - continue; - } - - $file = $file[0]; - - if (!$this->satisfiesPhpVersion($fileNode)) { - continue; - } - - $suite->addTestFile($file); - } - - return $suite; - } - - private function satisfiesPhpVersion(DOMElement $node): bool - { - $phpVersion = \PHP_VERSION; - $phpVersionOperator = '>='; - - if ($node->hasAttribute('phpVersion')) { - $phpVersion = (string) $node->getAttribute('phpVersion'); - } - - if ($node->hasAttribute('phpVersionOperator')) { - $phpVersionOperator = (string) $node->getAttribute('phpVersionOperator'); - } - - return \version_compare(\PHP_VERSION, $phpVersion, (new VersionComparisonOperator($phpVersionOperator))->asString()); - } - - /** - * if $value is 'false' or 'true', this returns the value that $value represents. - * Otherwise, returns $default, which may be a string in rare cases. - * See PHPUnit\Util\ConfigurationTest::testPHPConfigurationIsReadCorrectly - * - * @param bool|string $default - * - * @return bool|string - */ - private function getBoolean(string $value, $default) - { - if (\strtolower($value) === 'false') { - return false; - } - - if (\strtolower($value) === 'true') { - return true; - } - - return $default; - } - - private function getInteger(string $value, int $default): int - { - if (\is_numeric($value)) { - return (int) $value; - } - - return $default; - } - - private function readFilterDirectories(string $query): array - { - $directories = []; - - foreach ($this->xpath->query($query) as $directoryNode) { - \assert($directoryNode instanceof DOMElement); - - $directoryPath = (string) $directoryNode->textContent; - - if (!$directoryPath) { - continue; - } - - $directories[] = [ - 'path' => $this->toAbsolutePath($directoryPath), - 'prefix' => $directoryNode->hasAttribute('prefix') ? (string) $directoryNode->getAttribute('prefix') : '', - 'suffix' => $directoryNode->hasAttribute('suffix') ? (string) $directoryNode->getAttribute('suffix') : '.php', - 'group' => $directoryNode->hasAttribute('group') ? (string) $directoryNode->getAttribute('group') : 'DEFAULT', - ]; - } - - return $directories; - } - - /** - * @return string[] - */ - private function readFilterFiles(string $query): array - { - $files = []; - - foreach ($this->xpath->query($query) as $file) { - $filePath = (string) $file->textContent; - - if ($filePath) { - $files[] = $this->toAbsolutePath($filePath); - } - } - - return $files; - } - - private function toAbsolutePath(string $path, bool $useIncludePath = false): string - { - $path = \trim($path); - - if (\strpos($path, '/') === 0) { - return $path; - } - - // Matches the following on Windows: - // - \\NetworkComputer\Path - // - \\.\D: - // - \\.\c: - // - C:\Windows - // - C:\windows - // - C:/windows - // - c:/windows - if (\defined('PHP_WINDOWS_VERSION_BUILD') && - ($path[0] === '\\' || (\strlen($path) >= 3 && \preg_match('#^[A-Z]\:[/\\\]#i', \substr($path, 0, 3))))) { - return $path; - } - - if (\strpos($path, '://') !== false) { - return $path; - } - - $file = \dirname($this->filename) . \DIRECTORY_SEPARATOR . $path; - - if ($useIncludePath && !\file_exists($file)) { - $includePathFile = \stream_resolve_include_path($path); - - if ($includePathFile) { - $file = $includePathFile; - } - } - - return $file; - } - - private function parseGroupConfiguration(string $root): array - { - $groups = [ - 'include' => [], - 'exclude' => [], - ]; - - foreach ($this->xpath->query($root . '/include/group') as $group) { - $groups['include'][] = (string) $group->textContent; - } - - foreach ($this->xpath->query($root . '/exclude/group') as $group) { - $groups['exclude'][] = (string) $group->textContent; - } - - return $groups; - } - - private function getElementConfigurationParameters(DOMElement $element): array - { - $class = (string) $element->getAttribute('class'); - $file = ''; - $arguments = $this->getConfigurationArguments($element->childNodes); - - if ($element->getAttribute('file')) { - $file = $this->toAbsolutePath( - (string) $element->getAttribute('file'), - true - ); - } - - return [ - 'class' => $class, - 'file' => $file, - 'arguments' => $arguments, - ]; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php b/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php deleted file mode 100644 index f2727fa..0000000 --- a/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ConfigurationGenerator -{ - /** - * @var string - */ - private const TEMPLATE = << - - - - {tests_directory} - - - - - - {src_directory} - - - - -EOT; - - public function generateDefaultConfiguration(string $phpunitVersion, string $bootstrapScript, string $testsDirectory, string $srcDirectory): string - { - return \str_replace( - [ - '{phpunit_version}', - '{bootstrap_script}', - '{tests_directory}', - '{src_directory}', - ], - [ - $phpunitVersion, - $bootstrapScript, - $testsDirectory, - $srcDirectory, - ], - self::TEMPLATE - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/ErrorHandler.php b/vendor/phpunit/phpunit/src/Util/ErrorHandler.php deleted file mode 100644 index 99e3ae2..0000000 --- a/vendor/phpunit/phpunit/src/Util/ErrorHandler.php +++ /dev/null @@ -1,145 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use PHPUnit\Framework\Error\Deprecated; -use PHPUnit\Framework\Error\Error; -use PHPUnit\Framework\Error\Notice; -use PHPUnit\Framework\Error\Warning; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class ErrorHandler -{ - /** - * @var bool - */ - private $convertDeprecationsToExceptions; - - /** - * @var bool - */ - private $convertErrorsToExceptions; - - /** - * @var bool - */ - private $convertNoticesToExceptions; - - /** - * @var bool - */ - private $convertWarningsToExceptions; - - /** - * @var bool - */ - private $registered = false; - - public static function invokeIgnoringWarnings(callable $callable) - { - \set_error_handler( - static function ($errorNumber, $errorString) { - if ($errorNumber === \E_WARNING) { - return; - } - - return false; - } - ); - - $result = $callable(); - - \restore_error_handler(); - - return $result; - } - - public function __construct(bool $convertDeprecationsToExceptions, bool $convertErrorsToExceptions, bool $convertNoticesToExceptions, bool $convertWarningsToExceptions) - { - $this->convertDeprecationsToExceptions = $convertDeprecationsToExceptions; - $this->convertErrorsToExceptions = $convertErrorsToExceptions; - $this->convertNoticesToExceptions = $convertNoticesToExceptions; - $this->convertWarningsToExceptions = $convertWarningsToExceptions; - } - - public function __invoke(int $errorNumber, string $errorString, string $errorFile, int $errorLine): bool - { - /* - * Do not raise an exception when the error suppression operator (@) was used. - * - * @see https://github.com/sebastianbergmann/phpunit/issues/3739 - */ - if (!($errorNumber & \error_reporting())) { - return false; - } - - switch ($errorNumber) { - case \E_NOTICE: - case \E_USER_NOTICE: - case \E_STRICT: - if (!$this->convertNoticesToExceptions) { - return false; - } - - throw new Notice($errorString, $errorNumber, $errorFile, $errorLine); - - case \E_WARNING: - case \E_USER_WARNING: - if (!$this->convertWarningsToExceptions) { - return false; - } - - throw new Warning($errorString, $errorNumber, $errorFile, $errorLine); - - case \E_DEPRECATED: - case \E_USER_DEPRECATED: - if (!$this->convertDeprecationsToExceptions) { - return false; - } - - throw new Deprecated($errorString, $errorNumber, $errorFile, $errorLine); - - default: - if (!$this->convertErrorsToExceptions) { - return false; - } - - throw new Error($errorString, $errorNumber, $errorFile, $errorLine); - } - } - - public function register(): void - { - if ($this->registered) { - return; - } - - $oldErrorHandler = \set_error_handler($this); - - if ($oldErrorHandler !== null) { - \restore_error_handler(); - - return; - } - - $this->registered = true; - } - - public function unregister(): void - { - if (!$this->registered) { - return; - } - - \restore_error_handler(); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Exception.php b/vendor/phpunit/phpunit/src/Util/Exception.php deleted file mode 100644 index da452f4..0000000 --- a/vendor/phpunit/phpunit/src/Util/Exception.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Exception extends \RuntimeException implements \PHPUnit\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Util/FileLoader.php b/vendor/phpunit/phpunit/src/Util/FileLoader.php deleted file mode 100644 index 2c5f7ca..0000000 --- a/vendor/phpunit/phpunit/src/Util/FileLoader.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use PHPUnit\Framework\Exception; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class FileLoader -{ - /** - * Checks if a PHP sourcecode file is readable. The sourcecode file is loaded through the load() method. - * - * As a fallback, PHP looks in the directory of the file executing the stream_resolve_include_path function. - * We do not want to load the Test.php file here, so skip it if it found that. - * PHP prioritizes the include_path setting, so if the current directory is in there, it will first look in the - * current working directory. - * - * @throws Exception - */ - public static function checkAndLoad(string $filename): string - { - $includePathFilename = \stream_resolve_include_path($filename); - - if (!$includePathFilename) { - throw new Exception( - \sprintf('Cannot open file "%s".' . "\n", $filename) - ); - } - - $localFile = __DIR__ . \DIRECTORY_SEPARATOR . $filename; - - if ($includePathFilename === $localFile || !self::isReadable($includePathFilename)) { - throw new Exception( - \sprintf('Cannot open file "%s".' . "\n", $filename) - ); - } - - self::load($includePathFilename); - - return $includePathFilename; - } - - /** - * Loads a PHP sourcefile. - */ - public static function load(string $filename): void - { - $oldVariableNames = \array_keys(\get_defined_vars()); - - include_once $filename; - - $newVariables = \get_defined_vars(); - - foreach (\array_diff(\array_keys($newVariables), $oldVariableNames) as $variableName) { - if ($variableName !== 'oldVariableNames') { - $GLOBALS[$variableName] = $newVariables[$variableName]; - } - } - } - - /** - * @see https://github.com/sebastianbergmann/phpunit/pull/2751 - */ - private static function isReadable(string $filename): bool - { - return @\fopen($filename, 'r') !== false; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Filesystem.php b/vendor/phpunit/phpunit/src/Util/Filesystem.php deleted file mode 100644 index 8207a4f..0000000 --- a/vendor/phpunit/phpunit/src/Util/Filesystem.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Filesystem -{ - /** - * Maps class names to source file names: - * - PEAR CS: Foo_Bar_Baz -> Foo/Bar/Baz.php - * - Namespace: Foo\Bar\Baz -> Foo/Bar/Baz.php - */ - public static function classNameToFilename(string $className): string - { - return \str_replace( - ['_', '\\'], - \DIRECTORY_SEPARATOR, - $className - ) . '.php'; - } - - public static function createDirectory(string $directory): bool - { - return !(!\is_dir($directory) && !@\mkdir($directory, 0777, true) && !\is_dir($directory)); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Filter.php b/vendor/phpunit/phpunit/src/Util/Filter.php deleted file mode 100644 index d1a8ec6..0000000 --- a/vendor/phpunit/phpunit/src/Util/Filter.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\SyntheticError; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Filter -{ - /** - * @throws Exception - */ - public static function getFilteredStacktrace(\Throwable $t): string - { - $filteredStacktrace = ''; - - if ($t instanceof SyntheticError) { - $eTrace = $t->getSyntheticTrace(); - $eFile = $t->getSyntheticFile(); - $eLine = $t->getSyntheticLine(); - } elseif ($t instanceof Exception) { - $eTrace = $t->getSerializableTrace(); - $eFile = $t->getFile(); - $eLine = $t->getLine(); - } else { - if ($t->getPrevious()) { - $t = $t->getPrevious(); - } - - $eTrace = $t->getTrace(); - $eFile = $t->getFile(); - $eLine = $t->getLine(); - } - - if (!self::frameExists($eTrace, $eFile, $eLine)) { - \array_unshift( - $eTrace, - ['file' => $eFile, 'line' => $eLine] - ); - } - - $prefix = \defined('__PHPUNIT_PHAR_ROOT__') ? __PHPUNIT_PHAR_ROOT__ : false; - $blacklist = new Blacklist; - - foreach ($eTrace as $frame) { - if (self::shouldPrintFrame($frame, $prefix, $blacklist)) { - $filteredStacktrace .= \sprintf( - "%s:%s\n", - $frame['file'], - $frame['line'] ?? '?' - ); - } - } - - return $filteredStacktrace; - } - - private static function shouldPrintFrame($frame, $prefix, Blacklist $blacklist): bool - { - if (!isset($frame['file'])) { - return false; - } - - $file = $frame['file']; - $fileIsNotPrefixed = $prefix === false || \strpos($file, $prefix) !== 0; - - // @see https://github.com/sebastianbergmann/phpunit/issues/4033 - if (isset($GLOBALS['_SERVER']['SCRIPT_NAME'])) { - $script = \realpath($GLOBALS['_SERVER']['SCRIPT_NAME']); - } else { - $script = ''; - } - - return \is_file($file) && - self::fileIsBlacklisted($file, $blacklist) && - $fileIsNotPrefixed && - $file !== $script; - } - - private static function fileIsBlacklisted($file, Blacklist $blacklist): bool - { - return (empty($GLOBALS['__PHPUNIT_ISOLATION_BLACKLIST']) || - !\in_array($file, $GLOBALS['__PHPUNIT_ISOLATION_BLACKLIST'], true)) && - !$blacklist->isBlacklisted($file); - } - - private static function frameExists(array $trace, string $file, int $line): bool - { - foreach ($trace as $frame) { - if (isset($frame['file'], $frame['line']) && $frame['file'] === $file && $frame['line'] === $line) { - return true; - } - } - - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Getopt.php b/vendor/phpunit/phpunit/src/Util/Getopt.php deleted file mode 100644 index e361383..0000000 --- a/vendor/phpunit/phpunit/src/Util/Getopt.php +++ /dev/null @@ -1,181 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use PHPUnit\Framework\Exception; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Getopt -{ - /** - * @throws Exception - */ - public static function getopt(array $args, string $short_options, array $long_options = null): array - { - if (empty($args)) { - return [[], []]; - } - - $opts = []; - $non_opts = []; - - if ($long_options) { - \sort($long_options); - } - - if (isset($args[0][0]) && $args[0][0] !== '-') { - \array_shift($args); - } - - \reset($args); - - $args = \array_map('trim', $args); - - /* @noinspection ComparisonOperandsOrderInspection */ - while (false !== $arg = \current($args)) { - $i = \key($args); - \next($args); - - if ($arg === '') { - continue; - } - - if ($arg === '--') { - $non_opts = \array_merge($non_opts, \array_slice($args, $i + 1)); - - break; - } - - if ($arg[0] !== '-' || (\strlen($arg) > 1 && $arg[1] === '-' && !$long_options)) { - $non_opts[] = $args[$i]; - - continue; - } - - if (\strlen($arg) > 1 && $arg[1] === '-') { - self::parseLongOption( - \substr($arg, 2), - $long_options, - $opts, - $args - ); - } else { - self::parseShortOption( - \substr($arg, 1), - $short_options, - $opts, - $args - ); - } - } - - return [$opts, $non_opts]; - } - - /** - * @throws Exception - */ - private static function parseShortOption(string $arg, string $short_options, array &$opts, array &$args): void - { - $argLen = \strlen($arg); - - for ($i = 0; $i < $argLen; $i++) { - $opt = $arg[$i]; - $opt_arg = null; - - if ($arg[$i] === ':' || ($spec = \strstr($short_options, $opt)) === false) { - throw new Exception( - "unrecognized option -- $opt" - ); - } - - if (\strlen($spec) > 1 && $spec[1] === ':') { - if ($i + 1 < $argLen) { - $opts[] = [$opt, \substr($arg, $i + 1)]; - - break; - } - - if (!(\strlen($spec) > 2 && $spec[2] === ':')) { - /* @noinspection ComparisonOperandsOrderInspection */ - if (false === $opt_arg = \current($args)) { - throw new Exception( - "option requires an argument -- $opt" - ); - } - - \next($args); - } - } - - $opts[] = [$opt, $opt_arg]; - } - } - - /** - * @throws Exception - */ - private static function parseLongOption(string $arg, array $long_options, array &$opts, array &$args): void - { - $count = \count($long_options); - $list = \explode('=', $arg); - $opt = $list[0]; - $opt_arg = null; - - if (\count($list) > 1) { - $opt_arg = $list[1]; - } - - $opt_len = \strlen($opt); - - foreach ($long_options as $i => $long_opt) { - $opt_start = \substr($long_opt, 0, $opt_len); - - if ($opt_start !== $opt) { - continue; - } - - $opt_rest = \substr($long_opt, $opt_len); - - if ($opt_rest !== '' && $i + 1 < $count && $opt[0] !== '=' && \strpos($long_options[$i + 1], $opt) === 0) { - throw new Exception( - "option --$opt is ambiguous" - ); - } - - if (\substr($long_opt, -1) === '=') { - /* @noinspection StrlenInEmptyStringCheckContextInspection */ - if (\substr($long_opt, -2) !== '==' && !\strlen((string) $opt_arg)) { - /* @noinspection ComparisonOperandsOrderInspection */ - if (false === $opt_arg = \current($args)) { - throw new Exception( - "option --$opt requires an argument" - ); - } - - \next($args); - } - } elseif ($opt_arg) { - throw new Exception( - "option --$opt doesn't allow an argument" - ); - } - - $full_option = '--' . \preg_replace('/={1,2}$/', '', $long_opt); - $opts[] = [$full_option, $opt_arg]; - - return; - } - - throw new Exception("unrecognized option --$opt"); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/GlobalState.php b/vendor/phpunit/phpunit/src/Util/GlobalState.php deleted file mode 100644 index 4a8dadb..0000000 --- a/vendor/phpunit/phpunit/src/Util/GlobalState.php +++ /dev/null @@ -1,179 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use Closure; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class GlobalState -{ - /** - * @var string[] - */ - private const SUPER_GLOBAL_ARRAYS = [ - '_ENV', - '_POST', - '_GET', - '_COOKIE', - '_SERVER', - '_FILES', - '_REQUEST', - ]; - - /** - * @throws Exception - */ - public static function getIncludedFilesAsString(): string - { - return static::processIncludedFilesAsString(\get_included_files()); - } - - /** - * @param string[] $files - * - * @throws Exception - */ - public static function processIncludedFilesAsString(array $files): string - { - $blacklist = new Blacklist; - $prefix = false; - $result = ''; - - if (\defined('__PHPUNIT_PHAR__')) { - $prefix = 'phar://' . __PHPUNIT_PHAR__ . '/'; - } - - for ($i = \count($files) - 1; $i > 0; $i--) { - $file = $files[$i]; - - if (!empty($GLOBALS['__PHPUNIT_ISOLATION_BLACKLIST']) && - \in_array($file, $GLOBALS['__PHPUNIT_ISOLATION_BLACKLIST'])) { - continue; - } - - if ($prefix !== false && \strpos($file, $prefix) === 0) { - continue; - } - - // Skip virtual file system protocols - if (\preg_match('/^(vfs|phpvfs[a-z0-9]+):/', $file)) { - continue; - } - - if (!$blacklist->isBlacklisted($file) && \is_file($file)) { - $result = 'require_once \'' . $file . "';\n" . $result; - } - } - - return $result; - } - - public static function getIniSettingsAsString(): string - { - $result = ''; - - foreach (\ini_get_all(null, false) as $key => $value) { - $result .= \sprintf( - '@ini_set(%s, %s);' . "\n", - self::exportVariable($key), - self::exportVariable((string) $value) - ); - } - - return $result; - } - - public static function getConstantsAsString(): string - { - $constants = \get_defined_constants(true); - $result = ''; - - if (isset($constants['user'])) { - foreach ($constants['user'] as $name => $value) { - $result .= \sprintf( - 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", - $name, - $name, - self::exportVariable($value) - ); - } - } - - return $result; - } - - public static function getGlobalsAsString(): string - { - $result = ''; - - foreach (self::SUPER_GLOBAL_ARRAYS as $superGlobalArray) { - if (isset($GLOBALS[$superGlobalArray]) && \is_array($GLOBALS[$superGlobalArray])) { - foreach (\array_keys($GLOBALS[$superGlobalArray]) as $key) { - if ($GLOBALS[$superGlobalArray][$key] instanceof Closure) { - continue; - } - - $result .= \sprintf( - '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n", - $superGlobalArray, - $key, - self::exportVariable($GLOBALS[$superGlobalArray][$key]) - ); - } - } - } - - $blacklist = self::SUPER_GLOBAL_ARRAYS; - $blacklist[] = 'GLOBALS'; - - foreach (\array_keys($GLOBALS) as $key) { - if (!$GLOBALS[$key] instanceof Closure && !\in_array($key, $blacklist, true)) { - $result .= \sprintf( - '$GLOBALS[\'%s\'] = %s;' . "\n", - $key, - self::exportVariable($GLOBALS[$key]) - ); - } - } - - return $result; - } - - private static function exportVariable($variable): string - { - if (\is_scalar($variable) || $variable === null || - (\is_array($variable) && self::arrayOnlyContainsScalars($variable))) { - return \var_export($variable, true); - } - - return 'unserialize(' . \var_export(\serialize($variable), true) . ')'; - } - - private static function arrayOnlyContainsScalars(array $array): bool - { - $result = true; - - foreach ($array as $element) { - if (\is_array($element)) { - $result = self::arrayOnlyContainsScalars($element); - } elseif (!\is_scalar($element) && $element !== null) { - $result = false; - } - - if (!$result) { - break; - } - } - - return $result; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/InvalidDataSetException.php b/vendor/phpunit/phpunit/src/Util/InvalidDataSetException.php deleted file mode 100644 index 228f066..0000000 --- a/vendor/phpunit/phpunit/src/Util/InvalidDataSetException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class InvalidDataSetException extends \RuntimeException implements \PHPUnit\Exception -{ -} diff --git a/vendor/phpunit/phpunit/src/Util/Json.php b/vendor/phpunit/phpunit/src/Util/Json.php deleted file mode 100644 index 8e7c82c..0000000 --- a/vendor/phpunit/phpunit/src/Util/Json.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use PHPUnit\Framework\Exception; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Json -{ - /** - * Prettify json string - * - * @throws \PHPUnit\Framework\Exception - */ - public static function prettify(string $json): string - { - $decodedJson = \json_decode($json, false); - - if (\json_last_error()) { - throw new Exception( - 'Cannot prettify invalid json' - ); - } - - return \json_encode($decodedJson, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE); - } - - /* - * To allow comparison of JSON strings, first process them into a consistent - * format so that they can be compared as strings. - * @return array ($error, $canonicalized_json) The $error parameter is used - * to indicate an error decoding the json. This is used to avoid ambiguity - * with JSON strings consisting entirely of 'null' or 'false'. - */ - public static function canonicalize(string $json): array - { - $decodedJson = \json_decode($json); - - if (\json_last_error()) { - return [true, null]; - } - - self::recursiveSort($decodedJson); - - $reencodedJson = \json_encode($decodedJson); - - return [false, $reencodedJson]; - } - - /* - * JSON object keys are unordered while PHP array keys are ordered. - * Sort all array keys to ensure both the expected and actual values have - * their keys in the same order. - */ - private static function recursiveSort(&$json): void - { - if (!\is_array($json)) { - // If the object is not empty, change it to an associative array - // so we can sort the keys (and we will still re-encode it - // correctly, since PHP encodes associative arrays as JSON objects.) - // But EMPTY objects MUST remain empty objects. (Otherwise we will - // re-encode it as a JSON array rather than a JSON object.) - // See #2919. - if (\is_object($json) && \count((array) $json) > 0) { - $json = (array) $json; - } else { - return; - } - } - - \ksort($json); - - foreach ($json as $key => &$value) { - self::recursiveSort($value); - } - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Log/JUnit.php b/vendor/phpunit/phpunit/src/Util/Log/JUnit.php deleted file mode 100644 index 4d152a3..0000000 --- a/vendor/phpunit/phpunit/src/Util/Log/JUnit.php +++ /dev/null @@ -1,422 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\Log; - -use PHPUnit\Framework\AssertionFailedError; -use PHPUnit\Framework\ExceptionWrapper; -use PHPUnit\Framework\SelfDescribing; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestFailure; -use PHPUnit\Framework\TestListener; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Framework\Warning; -use PHPUnit\Util\Exception; -use PHPUnit\Util\Filter; -use PHPUnit\Util\Printer; -use PHPUnit\Util\Xml; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class JUnit extends Printer implements TestListener -{ - /** - * @var \DOMDocument - */ - private $document; - - /** - * @var \DOMElement - */ - private $root; - - /** - * @var bool - */ - private $reportRiskyTests = false; - - /** - * @var \DOMElement[] - */ - private $testSuites = []; - - /** - * @var int[] - */ - private $testSuiteTests = [0]; - - /** - * @var int[] - */ - private $testSuiteAssertions = [0]; - - /** - * @var int[] - */ - private $testSuiteErrors = [0]; - - /** - * @var int[] - */ - private $testSuiteWarnings = [0]; - - /** - * @var int[] - */ - private $testSuiteFailures = [0]; - - /** - * @var int[] - */ - private $testSuiteSkipped = [0]; - - /** - * @var int[] - */ - private $testSuiteTimes = [0]; - - /** - * @var int - */ - private $testSuiteLevel = 0; - - /** - * @var \DOMElement - */ - private $currentTestCase; - - /** - * @param null|mixed $out - */ - public function __construct($out = null, bool $reportRiskyTests = false) - { - $this->document = new \DOMDocument('1.0', 'UTF-8'); - $this->document->formatOutput = true; - - $this->root = $this->document->createElement('testsuites'); - $this->document->appendChild($this->root); - - parent::__construct($out); - - $this->reportRiskyTests = $reportRiskyTests; - } - - /** - * Flush buffer and close output. - */ - public function flush(): void - { - $this->write($this->getXML()); - - parent::flush(); - } - - /** - * An error occurred. - */ - public function addError(Test $test, \Throwable $t, float $time): void - { - $this->doAddFault($test, $t, $time, 'error'); - $this->testSuiteErrors[$this->testSuiteLevel]++; - } - - /** - * A warning occurred. - */ - public function addWarning(Test $test, Warning $e, float $time): void - { - $this->doAddFault($test, $e, $time, 'warning'); - $this->testSuiteWarnings[$this->testSuiteLevel]++; - } - - /** - * A failure occurred. - */ - public function addFailure(Test $test, AssertionFailedError $e, float $time): void - { - $this->doAddFault($test, $e, $time, 'failure'); - $this->testSuiteFailures[$this->testSuiteLevel]++; - } - - /** - * Incomplete test. - */ - public function addIncompleteTest(Test $test, \Throwable $t, float $time): void - { - $this->doAddSkipped(); - } - - /** - * Risky test. - */ - public function addRiskyTest(Test $test, \Throwable $t, float $time): void - { - if (!$this->reportRiskyTests || $this->currentTestCase === null) { - return; - } - - $error = $this->document->createElement( - 'error', - Xml::prepareString( - "Risky Test\n" . - Filter::getFilteredStacktrace($t) - ) - ); - - $error->setAttribute('type', \get_class($t)); - - $this->currentTestCase->appendChild($error); - - $this->testSuiteErrors[$this->testSuiteLevel]++; - } - - /** - * Skipped test. - */ - public function addSkippedTest(Test $test, \Throwable $t, float $time): void - { - $this->doAddSkipped(); - } - - /** - * A testsuite started. - */ - public function startTestSuite(TestSuite $suite): void - { - $testSuite = $this->document->createElement('testsuite'); - $testSuite->setAttribute('name', $suite->getName()); - - if (\class_exists($suite->getName(), false)) { - try { - $class = new \ReflectionClass($suite->getName()); - - $testSuite->setAttribute('file', $class->getFileName()); - } catch (\ReflectionException $e) { - } - } - - if ($this->testSuiteLevel > 0) { - $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite); - } else { - $this->root->appendChild($testSuite); - } - - $this->testSuiteLevel++; - $this->testSuites[$this->testSuiteLevel] = $testSuite; - $this->testSuiteTests[$this->testSuiteLevel] = 0; - $this->testSuiteAssertions[$this->testSuiteLevel] = 0; - $this->testSuiteErrors[$this->testSuiteLevel] = 0; - $this->testSuiteWarnings[$this->testSuiteLevel] = 0; - $this->testSuiteFailures[$this->testSuiteLevel] = 0; - $this->testSuiteSkipped[$this->testSuiteLevel] = 0; - $this->testSuiteTimes[$this->testSuiteLevel] = 0; - } - - /** - * A testsuite ended. - */ - public function endTestSuite(TestSuite $suite): void - { - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'tests', - (string) $this->testSuiteTests[$this->testSuiteLevel] - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'assertions', - (string) $this->testSuiteAssertions[$this->testSuiteLevel] - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'errors', - (string) $this->testSuiteErrors[$this->testSuiteLevel] - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'warnings', - (string) $this->testSuiteWarnings[$this->testSuiteLevel] - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'failures', - (string) $this->testSuiteFailures[$this->testSuiteLevel] - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'skipped', - (string) $this->testSuiteSkipped[$this->testSuiteLevel] - ); - - $this->testSuites[$this->testSuiteLevel]->setAttribute( - 'time', - \sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel]) - ); - - if ($this->testSuiteLevel > 1) { - $this->testSuiteTests[$this->testSuiteLevel - 1] += $this->testSuiteTests[$this->testSuiteLevel]; - $this->testSuiteAssertions[$this->testSuiteLevel - 1] += $this->testSuiteAssertions[$this->testSuiteLevel]; - $this->testSuiteErrors[$this->testSuiteLevel - 1] += $this->testSuiteErrors[$this->testSuiteLevel]; - $this->testSuiteWarnings[$this->testSuiteLevel - 1] += $this->testSuiteWarnings[$this->testSuiteLevel]; - $this->testSuiteFailures[$this->testSuiteLevel - 1] += $this->testSuiteFailures[$this->testSuiteLevel]; - $this->testSuiteSkipped[$this->testSuiteLevel - 1] += $this->testSuiteSkipped[$this->testSuiteLevel]; - $this->testSuiteTimes[$this->testSuiteLevel - 1] += $this->testSuiteTimes[$this->testSuiteLevel]; - } - - $this->testSuiteLevel--; - } - - /** - * A test started. - */ - public function startTest(Test $test): void - { - $usesDataprovider = false; - - if (\method_exists($test, 'usesDataProvider')) { - $usesDataprovider = $test->usesDataProvider(); - } - - $testCase = $this->document->createElement('testcase'); - $testCase->setAttribute('name', $test->getName()); - - try { - $class = new \ReflectionClass($test); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $methodName = $test->getName(!$usesDataprovider); - - if ($class->hasMethod($methodName)) { - try { - $method = $class->getMethod($methodName); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $testCase->setAttribute('class', $class->getName()); - $testCase->setAttribute('classname', \str_replace('\\', '.', $class->getName())); - $testCase->setAttribute('file', $class->getFileName()); - $testCase->setAttribute('line', (string) $method->getStartLine()); - } - - $this->currentTestCase = $testCase; - } - - /** - * A test ended. - */ - public function endTest(Test $test, float $time): void - { - $numAssertions = 0; - - if (\method_exists($test, 'getNumAssertions')) { - $numAssertions = $test->getNumAssertions(); - } - - $this->testSuiteAssertions[$this->testSuiteLevel] += $numAssertions; - - $this->currentTestCase->setAttribute( - 'assertions', - (string) $numAssertions - ); - - $this->currentTestCase->setAttribute( - 'time', - \sprintf('%F', $time) - ); - - $this->testSuites[$this->testSuiteLevel]->appendChild( - $this->currentTestCase - ); - - $this->testSuiteTests[$this->testSuiteLevel]++; - $this->testSuiteTimes[$this->testSuiteLevel] += $time; - - $testOutput = ''; - - if (\method_exists($test, 'hasOutput') && \method_exists($test, 'getActualOutput')) { - $testOutput = $test->hasOutput() ? $test->getActualOutput() : ''; - } - - if (!empty($testOutput)) { - $systemOut = $this->document->createElement( - 'system-out', - Xml::prepareString($testOutput) - ); - - $this->currentTestCase->appendChild($systemOut); - } - - $this->currentTestCase = null; - } - - /** - * Returns the XML as a string. - */ - public function getXML(): string - { - return $this->document->saveXML(); - } - - private function doAddFault(Test $test, \Throwable $t, float $time, $type): void - { - if ($this->currentTestCase === null) { - return; - } - - if ($test instanceof SelfDescribing) { - $buffer = $test->toString() . "\n"; - } else { - $buffer = ''; - } - - $buffer .= TestFailure::exceptionToString($t) . "\n" . - Filter::getFilteredStacktrace($t); - - $fault = $this->document->createElement( - $type, - Xml::prepareString($buffer) - ); - - if ($t instanceof ExceptionWrapper) { - $fault->setAttribute('type', $t->getClassName()); - } else { - $fault->setAttribute('type', \get_class($t)); - } - - $this->currentTestCase->appendChild($fault); - } - - private function doAddSkipped(): void - { - if ($this->currentTestCase === null) { - return; - } - - $skipped = $this->document->createElement('skipped'); - - $this->currentTestCase->appendChild($skipped); - - $this->testSuiteSkipped[$this->testSuiteLevel]++; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php b/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php deleted file mode 100644 index ccfb81b..0000000 --- a/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php +++ /dev/null @@ -1,378 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\Log; - -use PHPUnit\Framework\AssertionFailedError; -use PHPUnit\Framework\ExceptionWrapper; -use PHPUnit\Framework\ExpectationFailedException; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestFailure; -use PHPUnit\Framework\TestResult; -use PHPUnit\Framework\TestSuite; -use PHPUnit\Framework\Warning; -use PHPUnit\TextUI\ResultPrinter; -use PHPUnit\Util\Exception; -use PHPUnit\Util\Filter; -use SebastianBergmann\Comparator\ComparisonFailure; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class TeamCity extends ResultPrinter -{ - /** - * @var bool - */ - private $isSummaryTestCountPrinted = false; - - /** - * @var string - */ - private $startedTestName; - - /** - * @var false|int - */ - private $flowId; - - /** - * @throws \SebastianBergmann\Timer\RuntimeException - */ - public function printResult(TestResult $result): void - { - $this->printHeader($result); - $this->printFooter($result); - } - - /** - * An error occurred. - */ - public function addError(Test $test, \Throwable $t, float $time): void - { - $this->printEvent( - 'testFailed', - [ - 'name' => $test->getName(), - 'message' => self::getMessage($t), - 'details' => self::getDetails($t), - 'duration' => self::toMilliseconds($time), - ] - ); - } - - /** - * A warning occurred. - */ - public function addWarning(Test $test, Warning $e, float $time): void - { - $this->printEvent( - 'testFailed', - [ - 'name' => $test->getName(), - 'message' => self::getMessage($e), - 'details' => self::getDetails($e), - 'duration' => self::toMilliseconds($time), - ] - ); - } - - /** - * A failure occurred. - */ - public function addFailure(Test $test, AssertionFailedError $e, float $time): void - { - $parameters = [ - 'name' => $test->getName(), - 'message' => self::getMessage($e), - 'details' => self::getDetails($e), - 'duration' => self::toMilliseconds($time), - ]; - - if ($e instanceof ExpectationFailedException) { - $comparisonFailure = $e->getComparisonFailure(); - - if ($comparisonFailure instanceof ComparisonFailure) { - $expectedString = $comparisonFailure->getExpectedAsString(); - - if ($expectedString === null || empty($expectedString)) { - $expectedString = self::getPrimitiveValueAsString($comparisonFailure->getExpected()); - } - - $actualString = $comparisonFailure->getActualAsString(); - - if ($actualString === null || empty($actualString)) { - $actualString = self::getPrimitiveValueAsString($comparisonFailure->getActual()); - } - - if ($actualString !== null && $expectedString !== null) { - $parameters['type'] = 'comparisonFailure'; - $parameters['actual'] = $actualString; - $parameters['expected'] = $expectedString; - } - } - } - - $this->printEvent('testFailed', $parameters); - } - - /** - * Incomplete test. - */ - public function addIncompleteTest(Test $test, \Throwable $t, float $time): void - { - $this->printIgnoredTest($test->getName(), $t, $time); - } - - /** - * Risky test. - */ - public function addRiskyTest(Test $test, \Throwable $t, float $time): void - { - $this->addError($test, $t, $time); - } - - /** - * Skipped test. - */ - public function addSkippedTest(Test $test, \Throwable $t, float $time): void - { - $testName = $test->getName(); - - if ($this->startedTestName !== $testName) { - $this->startTest($test); - $this->printIgnoredTest($testName, $t, $time); - $this->endTest($test, $time); - } else { - $this->printIgnoredTest($testName, $t, $time); - } - } - - public function printIgnoredTest($testName, \Throwable $t, float $time): void - { - $this->printEvent( - 'testIgnored', - [ - 'name' => $testName, - 'message' => self::getMessage($t), - 'details' => self::getDetails($t), - 'duration' => self::toMilliseconds($time), - ] - ); - } - - /** - * A testsuite started. - */ - public function startTestSuite(TestSuite $suite): void - { - if (\stripos(\ini_get('disable_functions'), 'getmypid') === false) { - $this->flowId = \getmypid(); - } else { - $this->flowId = false; - } - - if (!$this->isSummaryTestCountPrinted) { - $this->isSummaryTestCountPrinted = true; - - $this->printEvent( - 'testCount', - ['count' => \count($suite)] - ); - } - - $suiteName = $suite->getName(); - - if (empty($suiteName)) { - return; - } - - $parameters = ['name' => $suiteName]; - - if (\class_exists($suiteName, false)) { - $fileName = self::getFileName($suiteName); - $parameters['locationHint'] = "php_qn://$fileName::\\$suiteName"; - } else { - $split = \explode('::', $suiteName); - - if (\count($split) === 2 && \class_exists($split[0]) && \method_exists($split[0], $split[1])) { - $fileName = self::getFileName($split[0]); - $parameters['locationHint'] = "php_qn://$fileName::\\$suiteName"; - $parameters['name'] = $split[1]; - } - } - - $this->printEvent('testSuiteStarted', $parameters); - } - - /** - * A testsuite ended. - */ - public function endTestSuite(TestSuite $suite): void - { - $suiteName = $suite->getName(); - - if (empty($suiteName)) { - return; - } - - $parameters = ['name' => $suiteName]; - - if (!\class_exists($suiteName, false)) { - $split = \explode('::', $suiteName); - - if (\count($split) === 2 && \class_exists($split[0]) && \method_exists($split[0], $split[1])) { - $parameters['name'] = $split[1]; - } - } - - $this->printEvent('testSuiteFinished', $parameters); - } - - /** - * A test started. - */ - public function startTest(Test $test): void - { - $testName = $test->getName(); - $this->startedTestName = $testName; - $params = ['name' => $testName]; - - if ($test instanceof TestCase) { - $className = \get_class($test); - $fileName = self::getFileName($className); - $params['locationHint'] = "php_qn://$fileName::\\$className::$testName"; - } - - $this->printEvent('testStarted', $params); - } - - /** - * A test ended. - */ - public function endTest(Test $test, float $time): void - { - parent::endTest($test, $time); - - $this->printEvent( - 'testFinished', - [ - 'name' => $test->getName(), - 'duration' => self::toMilliseconds($time), - ] - ); - } - - protected function writeProgress(string $progress): void - { - } - - private function printEvent(string $eventName, array $params = []): void - { - $this->write("\n##teamcity[$eventName"); - - if ($this->flowId) { - $params['flowId'] = $this->flowId; - } - - foreach ($params as $key => $value) { - $escapedValue = self::escapeValue((string) $value); - $this->write(" $key='$escapedValue'"); - } - - $this->write("]\n"); - } - - private static function getMessage(\Throwable $t): string - { - $message = ''; - - if ($t instanceof ExceptionWrapper) { - if ($t->getClassName() !== '') { - $message .= $t->getClassName(); - } - - if ($message !== '' && $t->getMessage() !== '') { - $message .= ' : '; - } - } - - return $message . $t->getMessage(); - } - - private static function getDetails(\Throwable $t): string - { - $stackTrace = Filter::getFilteredStacktrace($t); - $previous = $t instanceof ExceptionWrapper ? $t->getPreviousWrapped() : $t->getPrevious(); - - while ($previous) { - $stackTrace .= "\nCaused by\n" . - TestFailure::exceptionToString($previous) . "\n" . - Filter::getFilteredStacktrace($previous); - - $previous = $previous instanceof ExceptionWrapper ? - $previous->getPreviousWrapped() : $previous->getPrevious(); - } - - return ' ' . \str_replace("\n", "\n ", $stackTrace); - } - - private static function getPrimitiveValueAsString($value): ?string - { - if ($value === null) { - return 'null'; - } - - if (\is_bool($value)) { - return $value ? 'true' : 'false'; - } - - if (\is_scalar($value)) { - return \print_r($value, true); - } - - return null; - } - - private static function escapeValue(string $text): string - { - return \str_replace( - ['|', "'", "\n", "\r", ']', '['], - ['||', "|'", '|n', '|r', '|]', '|['], - $text - ); - } - - /** - * @param string $className - */ - private static function getFileName($className): string - { - try { - return (new \ReflectionClass($className))->getFileName(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - - /** - * @param float $time microseconds - */ - private static function toMilliseconds(float $time): int - { - return (int) \round($time * 1000); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php b/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php deleted file mode 100644 index 90978a8..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php +++ /dev/null @@ -1,399 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\PHP; - -use __PHP_Incomplete_Class; -use ErrorException; -use PHPUnit\Framework\AssertionFailedError; -use PHPUnit\Framework\Exception; -use PHPUnit\Framework\SyntheticError; -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestFailure; -use PHPUnit\Framework\TestResult; -use SebastianBergmann\Environment\Runtime; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -abstract class AbstractPhpProcess -{ - /** - * @var Runtime - */ - protected $runtime; - - /** - * @var bool - */ - protected $stderrRedirection = false; - - /** - * @var string - */ - protected $stdin = ''; - - /** - * @var string - */ - protected $args = ''; - - /** - * @var array - */ - protected $env = []; - - /** - * @var int - */ - protected $timeout = 0; - - public static function factory(): self - { - if (\DIRECTORY_SEPARATOR === '\\') { - return new WindowsPhpProcess; - } - - return new DefaultPhpProcess; - } - - public function __construct() - { - $this->runtime = new Runtime; - } - - /** - * Defines if should use STDERR redirection or not. - * - * Then $stderrRedirection is TRUE, STDERR is redirected to STDOUT. - */ - public function setUseStderrRedirection(bool $stderrRedirection): void - { - $this->stderrRedirection = $stderrRedirection; - } - - /** - * Returns TRUE if uses STDERR redirection or FALSE if not. - */ - public function useStderrRedirection(): bool - { - return $this->stderrRedirection; - } - - /** - * Sets the input string to be sent via STDIN - */ - public function setStdin(string $stdin): void - { - $this->stdin = $stdin; - } - - /** - * Returns the input string to be sent via STDIN - */ - public function getStdin(): string - { - return $this->stdin; - } - - /** - * Sets the string of arguments to pass to the php job - */ - public function setArgs(string $args): void - { - $this->args = $args; - } - - /** - * Returns the string of arguments to pass to the php job - */ - public function getArgs(): string - { - return $this->args; - } - - /** - * Sets the array of environment variables to start the child process with - * - * @param array $env - */ - public function setEnv(array $env): void - { - $this->env = $env; - } - - /** - * Returns the array of environment variables to start the child process with - */ - public function getEnv(): array - { - return $this->env; - } - - /** - * Sets the amount of seconds to wait before timing out - */ - public function setTimeout(int $timeout): void - { - $this->timeout = $timeout; - } - - /** - * Returns the amount of seconds to wait before timing out - */ - public function getTimeout(): int - { - return $this->timeout; - } - - /** - * Runs a single test in a separate PHP process. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public function runTestJob(string $job, Test $test, TestResult $result): void - { - $result->startTest($test); - - $_result = $this->runJob($job); - - $this->processChildResult( - $test, - $result, - $_result['stdout'], - $_result['stderr'] - ); - } - - /** - * Returns the command based into the configurations. - */ - public function getCommand(array $settings, string $file = null): string - { - $command = $this->runtime->getBinary(); - - if ($this->runtime->hasPCOV()) { - $settings = \array_merge( - $settings, - $this->runtime->getCurrentSettings( - \array_keys(\ini_get_all('pcov')) - ) - ); - } elseif ($this->runtime->hasXdebug()) { - $settings = \array_merge( - $settings, - $this->runtime->getCurrentSettings( - \array_keys(\ini_get_all('xdebug')) - ) - ); - } - - $command .= $this->settingsToParameters($settings); - - if (\PHP_SAPI === 'phpdbg') { - $command .= ' -qrr'; - - if (!$file) { - $command .= 's='; - } - } - - if ($file) { - $command .= ' ' . \escapeshellarg($file); - } - - if ($this->args) { - if (!$file) { - $command .= ' --'; - } - $command .= ' ' . $this->args; - } - - if ($this->stderrRedirection) { - $command .= ' 2>&1'; - } - - return $command; - } - - /** - * Runs a single job (PHP code) using a separate PHP process. - */ - abstract public function runJob(string $job, array $settings = []): array; - - protected function settingsToParameters(array $settings): string - { - $buffer = ''; - - foreach ($settings as $setting) { - $buffer .= ' -d ' . \escapeshellarg($setting); - } - - return $buffer; - } - - /** - * Processes the TestResult object from an isolated process. - * - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - private function processChildResult(Test $test, TestResult $result, string $stdout, string $stderr): void - { - $time = 0; - - if (!empty($stderr)) { - $result->addError( - $test, - new Exception(\trim($stderr)), - $time - ); - } else { - \set_error_handler( - /** - * @throws ErrorException - */ - static function ($errno, $errstr, $errfile, $errline): void { - throw new ErrorException($errstr, $errno, $errno, $errfile, $errline); - } - ); - - try { - if (\strpos($stdout, "#!/usr/bin/env php\n") === 0) { - $stdout = \substr($stdout, 19); - } - - $childResult = \unserialize(\str_replace("#!/usr/bin/env php\n", '', $stdout)); - \restore_error_handler(); - - if ($childResult === false) { - $result->addFailure( - $test, - new AssertionFailedError('Test was run in child process and ended unexpectedly'), - $time - ); - } - } catch (ErrorException $e) { - \restore_error_handler(); - $childResult = false; - - $result->addError( - $test, - new Exception(\trim($stdout), 0, $e), - $time - ); - } - - if ($childResult !== false) { - if (!empty($childResult['output'])) { - $output = $childResult['output']; - } - - /* @var TestCase $test */ - - $test->setResult($childResult['testResult']); - $test->addToAssertionCount($childResult['numAssertions']); - - $childResult = $childResult['result']; - \assert($childResult instanceof TestResult); - - if ($result->getCollectCodeCoverageInformation()) { - $result->getCodeCoverage()->merge( - $childResult->getCodeCoverage() - ); - } - - $time = $childResult->time(); - $notImplemented = $childResult->notImplemented(); - $risky = $childResult->risky(); - $skipped = $childResult->skipped(); - $errors = $childResult->errors(); - $warnings = $childResult->warnings(); - $failures = $childResult->failures(); - - if (!empty($notImplemented)) { - $result->addError( - $test, - $this->getException($notImplemented[0]), - $time - ); - } elseif (!empty($risky)) { - $result->addError( - $test, - $this->getException($risky[0]), - $time - ); - } elseif (!empty($skipped)) { - $result->addError( - $test, - $this->getException($skipped[0]), - $time - ); - } elseif (!empty($errors)) { - $result->addError( - $test, - $this->getException($errors[0]), - $time - ); - } elseif (!empty($warnings)) { - $result->addWarning( - $test, - $this->getException($warnings[0]), - $time - ); - } elseif (!empty($failures)) { - $result->addFailure( - $test, - $this->getException($failures[0]), - $time - ); - } - } - } - - $result->endTest($test, $time); - - if (!empty($output)) { - print $output; - } - } - - /** - * Gets the thrown exception from a PHPUnit\Framework\TestFailure. - * - * @see https://github.com/sebastianbergmann/phpunit/issues/74 - */ - private function getException(TestFailure $error): Exception - { - $exception = $error->thrownException(); - - if ($exception instanceof __PHP_Incomplete_Class) { - $exceptionArray = []; - - foreach ((array) $exception as $key => $value) { - $key = \substr($key, \strrpos($key, "\0") + 1); - $exceptionArray[$key] = $value; - } - - $exception = new SyntheticError( - \sprintf( - '%s: %s', - $exceptionArray['_PHP_Incomplete_Class_Name'], - $exceptionArray['message'] - ), - $exceptionArray['code'], - $exceptionArray['file'], - $exceptionArray['line'], - $exceptionArray['trace'] - ); - } - - return $exception; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php b/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php deleted file mode 100644 index 1d47eaf..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php +++ /dev/null @@ -1,216 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\PHP; - -use PHPUnit\Framework\Exception; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class DefaultPhpProcess extends AbstractPhpProcess -{ - /** - * @var string - */ - protected $tempFile; - - /** - * Runs a single job (PHP code) using a separate PHP process. - * - * @throws Exception - */ - public function runJob(string $job, array $settings = []): array - { - if ($this->stdin || $this->useTemporaryFile()) { - if (!($this->tempFile = \tempnam(\sys_get_temp_dir(), 'PHPUnit')) || - \file_put_contents($this->tempFile, $job) === false) { - throw new Exception( - 'Unable to write temporary file' - ); - } - - $job = $this->stdin; - } - - return $this->runProcess($job, $settings); - } - - /** - * Returns an array of file handles to be used in place of pipes - */ - protected function getHandles(): array - { - return []; - } - - /** - * Handles creating the child process and returning the STDOUT and STDERR - * - * @throws Exception - */ - protected function runProcess(string $job, array $settings): array - { - $handles = $this->getHandles(); - - $env = null; - - if ($this->env) { - $env = $_SERVER ?? []; - unset($env['argv'], $env['argc']); - $env = \array_merge($env, $this->env); - - foreach ($env as $envKey => $envVar) { - if (\is_array($envVar)) { - unset($env[$envKey]); - } - } - } - - $pipeSpec = [ - 0 => $handles[0] ?? ['pipe', 'r'], - 1 => $handles[1] ?? ['pipe', 'w'], - 2 => $handles[2] ?? ['pipe', 'w'], - ]; - - $process = \proc_open( - $this->getCommand($settings, $this->tempFile), - $pipeSpec, - $pipes, - null, - $env - ); - - if (!\is_resource($process)) { - throw new Exception( - 'Unable to spawn worker process' - ); - } - - if ($job) { - $this->process($pipes[0], $job); - } - - \fclose($pipes[0]); - - $stderr = $stdout = ''; - - if ($this->timeout) { - unset($pipes[0]); - - while (true) { - $r = $pipes; - $w = null; - $e = null; - - $n = @\stream_select($r, $w, $e, $this->timeout); - - if ($n === false) { - break; - } - - if ($n === 0) { - \proc_terminate($process, 9); - - throw new Exception( - \sprintf( - 'Job execution aborted after %d seconds', - $this->timeout - ) - ); - } - - if ($n > 0) { - foreach ($r as $pipe) { - $pipeOffset = 0; - - foreach ($pipes as $i => $origPipe) { - if ($pipe === $origPipe) { - $pipeOffset = $i; - - break; - } - } - - if (!$pipeOffset) { - break; - } - - $line = \fread($pipe, 8192); - - if ($line === '' || $line === false) { - \fclose($pipes[$pipeOffset]); - - unset($pipes[$pipeOffset]); - } elseif ($pipeOffset === 1) { - $stdout .= $line; - } else { - $stderr .= $line; - } - } - - if (empty($pipes)) { - break; - } - } - } - } else { - if (isset($pipes[1])) { - $stdout = \stream_get_contents($pipes[1]); - - \fclose($pipes[1]); - } - - if (isset($pipes[2])) { - $stderr = \stream_get_contents($pipes[2]); - - \fclose($pipes[2]); - } - } - - if (isset($handles[1])) { - \rewind($handles[1]); - - $stdout = \stream_get_contents($handles[1]); - - \fclose($handles[1]); - } - - if (isset($handles[2])) { - \rewind($handles[2]); - - $stderr = \stream_get_contents($handles[2]); - - \fclose($handles[2]); - } - - \proc_close($process); - - $this->cleanup(); - - return ['stdout' => $stdout, 'stderr' => $stderr]; - } - - protected function process($pipe, string $job): void - { - \fwrite($pipe, $job); - } - - protected function cleanup(): void - { - if ($this->tempFile) { - \unlink($this->tempFile); - } - } - - protected function useTemporaryFile(): bool - { - return false; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl b/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl deleted file mode 100644 index 14c3e7e..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl +++ /dev/null @@ -1,40 +0,0 @@ -start(__FILE__); -} - -register_shutdown_function(function() use ($coverage) { - $output = null; - if ($coverage) { - $output = $coverage->stop(); - } - file_put_contents('{coverageFile}', serialize($output)); -}); - -ob_end_clean(); - -require '{job}'; diff --git a/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl b/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl deleted file mode 100644 index c25f63d..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl +++ /dev/null @@ -1,108 +0,0 @@ -setCodeCoverage( - new CodeCoverage( - null, - unserialize('{codeCoverageFilter}') - ) - ); - } - - $result->beStrictAboutTestsThatDoNotTestAnything({isStrictAboutTestsThatDoNotTestAnything}); - $result->beStrictAboutOutputDuringTests({isStrictAboutOutputDuringTests}); - $result->enforceTimeLimit({enforcesTimeLimit}); - $result->beStrictAboutTodoAnnotatedTests({isStrictAboutTodoAnnotatedTests}); - $result->beStrictAboutResourceUsageDuringSmallTests({isStrictAboutResourceUsageDuringSmallTests}); - - $test = new {className}('{name}', unserialize('{data}'), '{dataName}'); - $test->setDependencyInput(unserialize('{dependencyInput}')); - $test->setInIsolation(TRUE); - - ob_end_clean(); - $test->run($result); - $output = ''; - if (!$test->hasExpectationOnOutput()) { - $output = $test->getActualOutput(); - } - - ini_set('xdebug.scream', '0'); - @rewind(STDOUT); /* @ as not every STDOUT target stream is rewindable */ - if ($stdout = stream_get_contents(STDOUT)) { - $output = $stdout . $output; - $streamMetaData = stream_get_meta_data(STDOUT); - if (!empty($streamMetaData['stream_type']) && 'STDIO' === $streamMetaData['stream_type']) { - @ftruncate(STDOUT, 0); - @rewind(STDOUT); - } - } - - print serialize( - [ - 'testResult' => $test->getResult(), - 'numAssertions' => $test->getNumAssertions(), - 'result' => $result, - 'output' => $output - ] - ); -} - -$configurationFilePath = '{configurationFilePath}'; - -if ('' !== $configurationFilePath) { - $configuration = PHPUnit\Util\Configuration::getInstance($configurationFilePath); - $configuration->handlePHPConfiguration(); - unset($configuration); -} - -function __phpunit_error_handler($errno, $errstr, $errfile, $errline) -{ - return true; -} - -set_error_handler('__phpunit_error_handler'); - -{constants} -{included_files} -{globals} - -restore_error_handler(); - -if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { - require_once $GLOBALS['__PHPUNIT_BOOTSTRAP']; - unset($GLOBALS['__PHPUNIT_BOOTSTRAP']); -} - -__phpunit_run_isolated_test(); diff --git a/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl b/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl deleted file mode 100644 index 68357ee..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl +++ /dev/null @@ -1,111 +0,0 @@ -setCodeCoverage( - new CodeCoverage( - null, - unserialize('{codeCoverageFilter}') - ) - ); - } - - $result->beStrictAboutTestsThatDoNotTestAnything({isStrictAboutTestsThatDoNotTestAnything}); - $result->beStrictAboutOutputDuringTests({isStrictAboutOutputDuringTests}); - $result->enforceTimeLimit({enforcesTimeLimit}); - $result->beStrictAboutTodoAnnotatedTests({isStrictAboutTodoAnnotatedTests}); - $result->beStrictAboutResourceUsageDuringSmallTests({isStrictAboutResourceUsageDuringSmallTests}); - - $test = new {className}('{methodName}', unserialize('{data}'), '{dataName}'); - \assert($test instanceof TestCase); - - $test->setDependencyInput(unserialize('{dependencyInput}')); - $test->setInIsolation(true); - - ob_end_clean(); - $test->run($result); - $output = ''; - if (!$test->hasExpectationOnOutput()) { - $output = $test->getActualOutput(); - } - - ini_set('xdebug.scream', '0'); - @rewind(STDOUT); /* @ as not every STDOUT target stream is rewindable */ - if ($stdout = stream_get_contents(STDOUT)) { - $output = $stdout . $output; - $streamMetaData = stream_get_meta_data(STDOUT); - if (!empty($streamMetaData['stream_type']) && 'STDIO' === $streamMetaData['stream_type']) { - @ftruncate(STDOUT, 0); - @rewind(STDOUT); - } - } - - print serialize( - [ - 'testResult' => $test->getResult(), - 'numAssertions' => $test->getNumAssertions(), - 'result' => $result, - 'output' => $output - ] - ); -} - -$configurationFilePath = '{configurationFilePath}'; - -if ('' !== $configurationFilePath) { - $configuration = PHPUnit\Util\Configuration::getInstance($configurationFilePath); - $configuration->handlePHPConfiguration(); - unset($configuration); -} - -function __phpunit_error_handler($errno, $errstr, $errfile, $errline) -{ - return true; -} - -set_error_handler('__phpunit_error_handler'); - -{constants} -{included_files} -{globals} - -restore_error_handler(); - -if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { - require_once $GLOBALS['__PHPUNIT_BOOTSTRAP']; - unset($GLOBALS['__PHPUNIT_BOOTSTRAP']); -} - -__phpunit_run_isolated_test(); diff --git a/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php b/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php deleted file mode 100644 index 844a372..0000000 --- a/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\PHP; - -use PHPUnit\Framework\Exception; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - * - * @see https://bugs.php.net/bug.php?id=51800 - */ -final class WindowsPhpProcess extends DefaultPhpProcess -{ - public function getCommand(array $settings, string $file = null): string - { - return '"' . parent::getCommand($settings, $file) . '"'; - } - - /** - * @throws Exception - */ - protected function getHandles(): array - { - if (false === $stdout_handle = \tmpfile()) { - throw new Exception( - 'A temporary file could not be created; verify that your TEMP environment variable is writable' - ); - } - - return [ - 1 => $stdout_handle, - ]; - } - - protected function useTemporaryFile(): bool - { - return true; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Printer.php b/vendor/phpunit/phpunit/src/Util/Printer.php deleted file mode 100644 index 65abb4e..0000000 --- a/vendor/phpunit/phpunit/src/Util/Printer.php +++ /dev/null @@ -1,145 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use PHPUnit\Framework\Exception; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class Printer -{ - /** - * If true, flush output after every write. - * - * @var bool - */ - protected $autoFlush = false; - - /** - * @psalm-var resource|closed-resource - */ - protected $out; - - /** - * @var string - */ - protected $outTarget; - - /** - * Constructor. - * - * @param null|resource|string $out - * - * @throws Exception - */ - public function __construct($out = null) - { - if ($out === null) { - return; - } - - if (\is_string($out) === false) { - $this->out = $out; - - return; - } - - if (\strpos($out, 'socket://') === 0) { - $out = \explode(':', \str_replace('socket://', '', $out)); - - if (\count($out) !== 2) { - throw new Exception; - } - - $this->out = \fsockopen($out[0], $out[1]); - } else { - if (\strpos($out, 'php://') === false && !Filesystem::createDirectory(\dirname($out))) { - throw new Exception(\sprintf('Directory "%s" was not created', \dirname($out))); - } - - $this->out = \fopen($out, 'wt'); - } - - $this->outTarget = $out; - } - - /** - * Flush buffer and close output if it's not to a PHP stream - */ - public function flush(): void - { - if ($this->out && \strncmp($this->outTarget, 'php://', 6) !== 0) { - \assert(\is_resource($this->out)); - - \fclose($this->out); - } - } - - /** - * Performs a safe, incremental flush. - * - * Do not confuse this function with the flush() function of this class, - * since the flush() function may close the file being written to, rendering - * the current object no longer usable. - */ - public function incrementalFlush(): void - { - if ($this->out) { - \assert(\is_resource($this->out)); - - \fflush($this->out); - } else { - \flush(); - } - } - - public function write(string $buffer): void - { - if ($this->out) { - \assert(\is_resource($this->out)); - - \fwrite($this->out, $buffer); - - if ($this->autoFlush) { - $this->incrementalFlush(); - } - } else { - if (\PHP_SAPI !== 'cli' && \PHP_SAPI !== 'phpdbg') { - $buffer = \htmlspecialchars($buffer, \ENT_SUBSTITUTE); - } - - print $buffer; - - if ($this->autoFlush) { - $this->incrementalFlush(); - } - } - } - - /** - * Check auto-flush mode. - */ - public function getAutoFlush(): bool - { - return $this->autoFlush; - } - - /** - * Set auto-flushing mode. - * - * If set, *incremental* flushes will be done after each write. This should - * not be confused with the different effects of this class' flush() method. - */ - public function setAutoFlush(bool $autoFlush): void - { - $this->autoFlush = $autoFlush; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/RegularExpression.php b/vendor/phpunit/phpunit/src/Util/RegularExpression.php deleted file mode 100644 index 97e33c9..0000000 --- a/vendor/phpunit/phpunit/src/Util/RegularExpression.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class RegularExpression -{ - /** - * @return false|int - */ - public static function safeMatch(string $pattern, string $subject, ?array $matches = null, int $flags = 0, int $offset = 0) - { - return ErrorHandler::invokeIgnoringWarnings( - static function () use ($pattern, $subject, $matches, $flags, $offset) { - return \preg_match($pattern, $subject, $matches, $flags, $offset); - } - ); - } -} diff --git a/vendor/phpunit/phpunit/src/Util/Test.php b/vendor/phpunit/phpunit/src/Util/Test.php deleted file mode 100644 index 9b15e50..0000000 --- a/vendor/phpunit/phpunit/src/Util/Test.php +++ /dev/null @@ -1,894 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util; - -use PHPUnit\Framework\Assert; -use PHPUnit\Framework\CodeCoverageException; -use PHPUnit\Framework\InvalidCoversTargetException; -use PHPUnit\Framework\SelfDescribing; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\Warning; -use PHPUnit\Runner\Version; -use PHPUnit\Util\Annotation\Registry; -use SebastianBergmann\Environment\OperatingSystem; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class Test -{ - /** - * @var int - */ - public const UNKNOWN = -1; - - /** - * @var int - */ - public const SMALL = 0; - - /** - * @var int - */ - public const MEDIUM = 1; - - /** - * @var int - */ - public const LARGE = 2; - - /** - * @var array - */ - private static $hookMethods = []; - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - public static function describe(\PHPUnit\Framework\Test $test): array - { - if ($test instanceof TestCase) { - return [\get_class($test), $test->getName()]; - } - - if ($test instanceof SelfDescribing) { - return ['', $test->toString()]; - } - - return ['', \get_class($test)]; - } - - public static function describeAsString(\PHPUnit\Framework\Test $test): string - { - if ($test instanceof SelfDescribing) { - return $test->toString(); - } - - return \get_class($test); - } - - /** - * @throws CodeCoverageException - * - * @return array|bool - * @psalm-param class-string $className - */ - public static function getLinesToBeCovered(string $className, string $methodName) - { - $annotations = self::parseTestMethodAnnotations( - $className, - $methodName - ); - - if (!self::shouldCoversAnnotationBeUsed($annotations)) { - return false; - } - - return self::getLinesToBeCoveredOrUsed($className, $methodName, 'covers'); - } - - /** - * Returns lines of code specified with the @uses annotation. - * - * @throws CodeCoverageException - * @psalm-param class-string $className - */ - public static function getLinesToBeUsed(string $className, string $methodName): array - { - return self::getLinesToBeCoveredOrUsed($className, $methodName, 'uses'); - } - - public static function requiresCodeCoverageDataCollection(TestCase $test): bool - { - $annotations = $test->getAnnotations(); - - // If there is no @covers annotation but a @coversNothing annotation on - // the test method then code coverage data does not need to be collected - if (isset($annotations['method']['coversNothing'])) { - return false; - } - - // If there is at least one @covers annotation then - // code coverage data needs to be collected - if (isset($annotations['method']['covers'])) { - return true; - } - - // If there is no @covers annotation but a @coversNothing annotation - // then code coverage data does not need to be collected - if (isset($annotations['class']['coversNothing'])) { - return false; - } - - // If there is no @coversNothing annotation then - // code coverage data may be collected - return true; - } - - /** - * @throws Exception - * @psalm-param class-string $className - */ - public static function getRequirements(string $className, string $methodName): array - { - return self::mergeArraysRecursively( - Registry::getInstance()->forClassName($className)->requirements(), - Registry::getInstance()->forMethod($className, $methodName)->requirements() - ); - } - - /** - * Returns the missing requirements for a test. - * - * @throws Exception - * @throws Warning - * @psalm-param class-string $className - */ - public static function getMissingRequirements(string $className, string $methodName): array - { - $required = static::getRequirements($className, $methodName); - $missing = []; - $hint = null; - - if (!empty($required['PHP'])) { - $operator = new VersionComparisonOperator(empty($required['PHP']['operator']) ? '>=' : $required['PHP']['operator']); - - if (!\version_compare(\PHP_VERSION, $required['PHP']['version'], $operator->asString())) { - $missing[] = \sprintf('PHP %s %s is required.', $operator->asString(), $required['PHP']['version']); - $hint = 'PHP'; - } - } elseif (!empty($required['PHP_constraint'])) { - $version = new \PharIo\Version\Version(self::sanitizeVersionNumber(\PHP_VERSION)); - - if (!$required['PHP_constraint']['constraint']->complies($version)) { - $missing[] = \sprintf( - 'PHP version does not match the required constraint %s.', - $required['PHP_constraint']['constraint']->asString() - ); - - $hint = 'PHP_constraint'; - } - } - - if (!empty($required['PHPUnit'])) { - $phpunitVersion = Version::id(); - - $operator = new VersionComparisonOperator(empty($required['PHPUnit']['operator']) ? '>=' : $required['PHPUnit']['operator']); - - if (!\version_compare($phpunitVersion, $required['PHPUnit']['version'], $operator->asString())) { - $missing[] = \sprintf('PHPUnit %s %s is required.', $operator->asString(), $required['PHPUnit']['version']); - $hint = $hint ?? 'PHPUnit'; - } - } elseif (!empty($required['PHPUnit_constraint'])) { - $phpunitVersion = new \PharIo\Version\Version(self::sanitizeVersionNumber(Version::id())); - - if (!$required['PHPUnit_constraint']['constraint']->complies($phpunitVersion)) { - $missing[] = \sprintf( - 'PHPUnit version does not match the required constraint %s.', - $required['PHPUnit_constraint']['constraint']->asString() - ); - - $hint = $hint ?? 'PHPUnit_constraint'; - } - } - - if (!empty($required['OSFAMILY']) && $required['OSFAMILY'] !== (new OperatingSystem)->getFamily()) { - $missing[] = \sprintf('Operating system %s is required.', $required['OSFAMILY']); - $hint = $hint ?? 'OSFAMILY'; - } - - if (!empty($required['OS'])) { - $requiredOsPattern = \sprintf('/%s/i', \addcslashes($required['OS'], '/')); - - if (!\preg_match($requiredOsPattern, \PHP_OS)) { - $missing[] = \sprintf('Operating system matching %s is required.', $requiredOsPattern); - $hint = $hint ?? 'OS'; - } - } - - if (!empty($required['functions'])) { - foreach ($required['functions'] as $function) { - $pieces = \explode('::', $function); - - if (\count($pieces) === 2 && \class_exists($pieces[0]) && \method_exists($pieces[0], $pieces[1])) { - continue; - } - - if (\function_exists($function)) { - continue; - } - - $missing[] = \sprintf('Function %s is required.', $function); - $hint = $hint ?? 'function_' . $function; - } - } - - if (!empty($required['setting'])) { - foreach ($required['setting'] as $setting => $value) { - if (\ini_get($setting) !== $value) { - $missing[] = \sprintf('Setting "%s" must be "%s".', $setting, $value); - $hint = $hint ?? '__SETTING_' . $setting; - } - } - } - - if (!empty($required['extensions'])) { - foreach ($required['extensions'] as $extension) { - if (isset($required['extension_versions'][$extension])) { - continue; - } - - if (!\extension_loaded($extension)) { - $missing[] = \sprintf('Extension %s is required.', $extension); - $hint = $hint ?? 'extension_' . $extension; - } - } - } - - if (!empty($required['extension_versions'])) { - foreach ($required['extension_versions'] as $extension => $req) { - $actualVersion = \phpversion($extension); - - $operator = new VersionComparisonOperator(empty($req['operator']) ? '>=' : $req['operator']); - - if ($actualVersion === false || !\version_compare($actualVersion, $req['version'], $operator->asString())) { - $missing[] = \sprintf('Extension %s %s %s is required.', $extension, $operator->asString(), $req['version']); - $hint = $hint ?? 'extension_' . $extension; - } - } - } - - if ($hint && isset($required['__OFFSET'])) { - \array_unshift($missing, '__OFFSET_FILE=' . $required['__OFFSET']['__FILE']); - \array_unshift($missing, '__OFFSET_LINE=' . ($required['__OFFSET'][$hint] ?? 1)); - } - - return $missing; - } - - /** - * Returns the expected exception for a test. - * - * @return array|false - * - * @deprecated - * @codeCoverageIgnore - * @psalm-param class-string $className - */ - public static function getExpectedException(string $className, string $methodName) - { - return Registry::getInstance()->forMethod($className, $methodName)->expectedException(); - } - - /** - * Returns the provided data for a method. - * - * @throws Exception - * @psalm-param class-string $className - */ - public static function getProvidedData(string $className, string $methodName): ?array - { - return Registry::getInstance()->forMethod($className, $methodName)->getProvidedData(); - } - - /** - * @psalm-param class-string $className - */ - public static function parseTestMethodAnnotations(string $className, ?string $methodName = ''): array - { - $registry = Registry::getInstance(); - - if ($methodName !== null) { - try { - return [ - 'method' => $registry->forMethod($className, $methodName)->symbolAnnotations(), - 'class' => $registry->forClassName($className)->symbolAnnotations(), - ]; - } catch (Exception $methodNotFound) { - // ignored - } - } - - return [ - 'method' => null, - 'class' => $registry->forClassName($className)->symbolAnnotations(), - ]; - } - - /** - * @psalm-param class-string $className - */ - public static function getInlineAnnotations(string $className, string $methodName): array - { - return Registry::getInstance()->forMethod($className, $methodName)->getInlineAnnotations(); - } - - /** @psalm-param class-string $className */ - public static function getBackupSettings(string $className, string $methodName): array - { - return [ - 'backupGlobals' => self::getBooleanAnnotationSetting( - $className, - $methodName, - 'backupGlobals' - ), - 'backupStaticAttributes' => self::getBooleanAnnotationSetting( - $className, - $methodName, - 'backupStaticAttributes' - ), - ]; - } - - /** @psalm-param class-string $className */ - public static function getDependencies(string $className, string $methodName): array - { - $annotations = self::parseTestMethodAnnotations( - $className, - $methodName - ); - - $dependencies = $annotations['class']['depends'] ?? []; - - if (isset($annotations['method']['depends'])) { - $dependencies = \array_merge( - $dependencies, - $annotations['method']['depends'] - ); - } - - return \array_unique($dependencies); - } - - /** @psalm-param class-string $className */ - public static function getGroups(string $className, ?string $methodName = ''): array - { - $annotations = self::parseTestMethodAnnotations( - $className, - $methodName - ); - - $groups = []; - - if (isset($annotations['method']['author'])) { - $groups[] = $annotations['method']['author']; - } elseif (isset($annotations['class']['author'])) { - $groups[] = $annotations['class']['author']; - } - - if (isset($annotations['class']['group'])) { - $groups[] = $annotations['class']['group']; - } - - if (isset($annotations['method']['group'])) { - $groups[] = $annotations['method']['group']; - } - - if (isset($annotations['class']['ticket'])) { - $groups[] = $annotations['class']['ticket']; - } - - if (isset($annotations['method']['ticket'])) { - $groups[] = $annotations['method']['ticket']; - } - - foreach (['method', 'class'] as $element) { - foreach (['small', 'medium', 'large'] as $size) { - if (isset($annotations[$element][$size])) { - $groups[] = [$size]; - - break 2; - } - } - } - - return \array_unique(\array_merge([], ...$groups)); - } - - /** @psalm-param class-string $className */ - public static function getSize(string $className, ?string $methodName): int - { - $groups = \array_flip(self::getGroups($className, $methodName)); - - if (isset($groups['large'])) { - return self::LARGE; - } - - if (isset($groups['medium'])) { - return self::MEDIUM; - } - - if (isset($groups['small'])) { - return self::SMALL; - } - - return self::UNKNOWN; - } - - /** @psalm-param class-string $className */ - public static function getProcessIsolationSettings(string $className, string $methodName): bool - { - $annotations = self::parseTestMethodAnnotations( - $className, - $methodName - ); - - return isset($annotations['class']['runTestsInSeparateProcesses']) || isset($annotations['method']['runInSeparateProcess']); - } - - /** @psalm-param class-string $className */ - public static function getClassProcessIsolationSettings(string $className, string $methodName): bool - { - $annotations = self::parseTestMethodAnnotations( - $className, - $methodName - ); - - return isset($annotations['class']['runClassInSeparateProcess']); - } - - /** @psalm-param class-string $className */ - public static function getPreserveGlobalStateSettings(string $className, string $methodName): ?bool - { - return self::getBooleanAnnotationSetting( - $className, - $methodName, - 'preserveGlobalState' - ); - } - - /** @psalm-param class-string $className */ - public static function getHookMethods(string $className): array - { - if (!\class_exists($className, false)) { - return self::emptyHookMethodsArray(); - } - - if (!isset(self::$hookMethods[$className])) { - self::$hookMethods[$className] = self::emptyHookMethodsArray(); - - try { - foreach ((new \ReflectionClass($className))->getMethods() as $method) { - if ($method->getDeclaringClass()->getName() === Assert::class) { - continue; - } - - if ($method->getDeclaringClass()->getName() === TestCase::class) { - continue; - } - - $docBlock = Registry::getInstance()->forMethod($className, $method->getName()); - - if ($method->isStatic()) { - if ($docBlock->isHookToBeExecutedBeforeClass()) { - \array_unshift( - self::$hookMethods[$className]['beforeClass'], - $method->getName() - ); - } - - if ($docBlock->isHookToBeExecutedAfterClass()) { - self::$hookMethods[$className]['afterClass'][] = $method->getName(); - } - } - - if ($docBlock->isToBeExecutedBeforeTest()) { - \array_unshift( - self::$hookMethods[$className]['before'], - $method->getName() - ); - } - - if ($docBlock->isToBeExecutedAfterTest()) { - self::$hookMethods[$className]['after'][] = $method->getName(); - } - } - } catch (\ReflectionException $e) { - } - } - - return self::$hookMethods[$className]; - } - - public static function isTestMethod(\ReflectionMethod $method): bool - { - if (\strpos($method->getName(), 'test') === 0) { - return true; - } - - return \array_key_exists( - 'test', - Registry::getInstance()->forMethod( - $method->getDeclaringClass()->getName(), - $method->getName() - ) - ->symbolAnnotations() - ); - } - - /** - * @throws CodeCoverageException - * @psalm-param class-string $className - */ - private static function getLinesToBeCoveredOrUsed(string $className, string $methodName, string $mode): array - { - $annotations = self::parseTestMethodAnnotations( - $className, - $methodName - ); - - $classShortcut = null; - - if (!empty($annotations['class'][$mode . 'DefaultClass'])) { - if (\count($annotations['class'][$mode . 'DefaultClass']) > 1) { - throw new CodeCoverageException( - \sprintf( - 'More than one @%sClass annotation in class or interface "%s".', - $mode, - $className - ) - ); - } - - $classShortcut = $annotations['class'][$mode . 'DefaultClass'][0]; - } - - $list = $annotations['class'][$mode] ?? []; - - if (isset($annotations['method'][$mode])) { - $list = \array_merge($list, $annotations['method'][$mode]); - } - - $codeList = []; - - foreach (\array_unique($list) as $element) { - if ($classShortcut && \strncmp($element, '::', 2) === 0) { - $element = $classShortcut . $element; - } - - $element = \preg_replace('/[\s()]+$/', '', $element); - $element = \explode(' ', $element); - $element = $element[0]; - - if ($mode === 'covers' && \interface_exists($element)) { - throw new InvalidCoversTargetException( - \sprintf( - 'Trying to @cover interface "%s".', - $element - ) - ); - } - - $codeList[] = self::resolveElementToReflectionObjects($element); - } - - return self::resolveReflectionObjectsToLines(\array_merge([], ...$codeList)); - } - - private static function emptyHookMethodsArray(): array - { - return [ - 'beforeClass' => ['setUpBeforeClass'], - 'before' => ['setUp'], - 'after' => ['tearDown'], - 'afterClass' => ['tearDownAfterClass'], - ]; - } - - /** @psalm-param class-string $className */ - private static function getBooleanAnnotationSetting(string $className, ?string $methodName, string $settingName): ?bool - { - $annotations = self::parseTestMethodAnnotations( - $className, - $methodName - ); - - if (isset($annotations['method'][$settingName])) { - if ($annotations['method'][$settingName][0] === 'enabled') { - return true; - } - - if ($annotations['method'][$settingName][0] === 'disabled') { - return false; - } - } - - if (isset($annotations['class'][$settingName])) { - if ($annotations['class'][$settingName][0] === 'enabled') { - return true; - } - - if ($annotations['class'][$settingName][0] === 'disabled') { - return false; - } - } - - return null; - } - - /** - * @throws InvalidCoversTargetException - */ - private static function resolveElementToReflectionObjects(string $element): array - { - $codeToCoverList = []; - - if (\function_exists($element) && \strpos($element, '\\') !== false) { - try { - $codeToCoverList[] = new \ReflectionFunction($element); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } elseif (\strpos($element, '::') !== false) { - [$className, $methodName] = \explode('::', $element); - - if (isset($methodName[0]) && $methodName[0] === '<') { - $classes = [$className]; - - foreach ($classes as $className) { - if (!\class_exists($className) && - !\interface_exists($className) && - !\trait_exists($className)) { - throw new InvalidCoversTargetException( - \sprintf( - 'Trying to @cover or @use not existing class or ' . - 'interface "%s".', - $className - ) - ); - } - - try { - $methods = (new \ReflectionClass($className))->getMethods(); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - - $inverse = isset($methodName[1]) && $methodName[1] === '!'; - $visibility = 'isPublic'; - - if (\strpos($methodName, 'protected')) { - $visibility = 'isProtected'; - } elseif (\strpos($methodName, 'private')) { - $visibility = 'isPrivate'; - } - - foreach ($methods as $method) { - if ($inverse && !$method->$visibility()) { - $codeToCoverList[] = $method; - } elseif (!$inverse && $method->$visibility()) { - $codeToCoverList[] = $method; - } - } - } - } else { - $classes = [$className]; - - foreach ($classes as $className) { - if ($className === '' && \function_exists($methodName)) { - try { - $codeToCoverList[] = new \ReflectionFunction( - $methodName - ); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } else { - if (!((\class_exists($className) || \interface_exists($className) || \trait_exists($className)) && - \method_exists($className, $methodName))) { - throw new InvalidCoversTargetException( - \sprintf( - 'Trying to @cover or @use not existing method "%s::%s".', - $className, - $methodName - ) - ); - } - - try { - $codeToCoverList[] = new \ReflectionMethod( - $className, - $methodName - ); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - } - } - } else { - $extended = false; - - if (\strpos($element, '') !== false) { - $element = \str_replace('', '', $element); - $extended = true; - } - - $classes = [$element]; - - if ($extended) { - $classes = \array_merge( - $classes, - \class_implements($element), - \class_parents($element) - ); - } - - foreach ($classes as $className) { - if (!\class_exists($className) && - !\interface_exists($className) && - !\trait_exists($className)) { - throw new InvalidCoversTargetException( - \sprintf( - 'Trying to @cover or @use not existing class or ' . - 'interface "%s".', - $className - ) - ); - } - - try { - $codeToCoverList[] = new \ReflectionClass($className); - // @codeCoverageIgnoreStart - } catch (\ReflectionException $e) { - throw new Exception( - $e->getMessage(), - (int) $e->getCode(), - $e - ); - } - // @codeCoverageIgnoreEnd - } - } - - return $codeToCoverList; - } - - private static function resolveReflectionObjectsToLines(array $reflectors): array - { - $result = []; - - foreach ($reflectors as $reflector) { - if ($reflector instanceof \ReflectionClass) { - foreach ($reflector->getTraits() as $trait) { - $reflectors[] = $trait; - } - } - } - - foreach ($reflectors as $reflector) { - $filename = $reflector->getFileName(); - - if (!isset($result[$filename])) { - $result[$filename] = []; - } - - $result[$filename] = \array_merge( - $result[$filename], - \range($reflector->getStartLine(), $reflector->getEndLine()) - ); - } - - foreach ($result as $filename => $lineNumbers) { - $result[$filename] = \array_keys(\array_flip($lineNumbers)); - } - - return $result; - } - - /** - * Trims any extensions from version string that follows after - * the .[.] format - */ - private static function sanitizeVersionNumber(string $version) - { - return \preg_replace( - '/^(\d+\.\d+(?:.\d+)?).*$/', - '$1', - $version - ); - } - - private static function shouldCoversAnnotationBeUsed(array $annotations): bool - { - if (isset($annotations['method']['coversNothing'])) { - return false; - } - - if (isset($annotations['method']['covers'])) { - return true; - } - - if (isset($annotations['class']['coversNothing'])) { - return false; - } - - return true; - } - - /** - * Merge two arrays together. - * - * If an integer key exists in both arrays and preserveNumericKeys is false, the value - * from the second array will be appended to the first array. If both values are arrays, they - * are merged together, else the value of the second array overwrites the one of the first array. - * - * This implementation is copied from https://github.com/zendframework/zend-stdlib/blob/76b653c5e99b40eccf5966e3122c90615134ae46/src/ArrayUtils.php - * - * Zend Framework (http://framework.zend.com/) - * - * @link http://github.com/zendframework/zf2 for the canonical source repository - * - * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) - * @license http://framework.zend.com/license/new-bsd New BSD License - */ - private static function mergeArraysRecursively(array $a, array $b): array - { - foreach ($b as $key => $value) { - if (\array_key_exists($key, $a)) { - if (\is_int($key)) { - $a[] = $value; - } elseif (\is_array($value) && \is_array($a[$key])) { - $a[$key] = self::mergeArraysRecursively($a[$key], $value); - } else { - $a[$key] = $value; - } - } else { - $a[$key] = $value; - } - } - - return $a; - } -} diff --git a/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php b/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php deleted file mode 100644 index b76d223..0000000 --- a/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php +++ /dev/null @@ -1,352 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\TestDox; - -use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; -use PHPUnit\Framework\TestResult; -use PHPUnit\Runner\BaseTestRunner; -use PHPUnit\Runner\PhptTestCase; -use PHPUnit\Util\Color; -use SebastianBergmann\Timer\Timer; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -class CliTestDoxPrinter extends TestDoxPrinter -{ - /** - * The default Testdox left margin for messages is a vertical line - */ - private const PREFIX_SIMPLE = [ - 'default' => '│', - 'start' => '│', - 'message' => '│', - 'diff' => '│', - 'trace' => '│', - 'last' => '│', - ]; - - /** - * Colored Testdox use box-drawing for a more textured map of the message - */ - private const PREFIX_DECORATED = [ - 'default' => '│', - 'start' => '┐', - 'message' => 'ā”œ', - 'diff' => 'ā”Š', - 'trace' => '╵', - 'last' => '┓', - ]; - - private const SPINNER_ICONS = [ - " \e[36m◐\e[0m running tests", - " \e[36mā—“\e[0m running tests", - " \e[36mā—‘\e[0m running tests", - " \e[36mā—’\e[0m running tests", - ]; - - private const STATUS_STYLES = [ - BaseTestRunner::STATUS_PASSED => [ - 'symbol' => 'āœ”', - 'color' => 'fg-green', - ], - BaseTestRunner::STATUS_ERROR => [ - 'symbol' => '✘', - 'color' => 'fg-yellow', - 'message' => 'bg-yellow,fg-black', - ], - BaseTestRunner::STATUS_FAILURE => [ - 'symbol' => '✘', - 'color' => 'fg-red', - 'message' => 'bg-red,fg-white', - ], - BaseTestRunner::STATUS_SKIPPED => [ - 'symbol' => '↩', - 'color' => 'fg-cyan', - 'message' => 'fg-cyan', - ], - BaseTestRunner::STATUS_RISKY => [ - 'symbol' => '☢', - 'color' => 'fg-yellow', - 'message' => 'fg-yellow', - ], - BaseTestRunner::STATUS_INCOMPLETE => [ - 'symbol' => 'āˆ…', - 'color' => 'fg-yellow', - 'message' => 'fg-yellow', - ], - BaseTestRunner::STATUS_WARNING => [ - 'symbol' => '⚠', - 'color' => 'fg-yellow', - 'message' => 'fg-yellow', - ], - BaseTestRunner::STATUS_UNKNOWN => [ - 'symbol' => '?', - 'color' => 'fg-blue', - 'message' => 'fg-white,bg-blue', - ], - ]; - - /** - * @var int[] - */ - private $nonSuccessfulTestResults = []; - - /** - * @throws \SebastianBergmann\Timer\RuntimeException - */ - public function printResult(TestResult $result): void - { - $this->printHeader($result); - - $this->printNonSuccessfulTestsSummary($result->count()); - - $this->printFooter($result); - } - - /** - * @throws \SebastianBergmann\Timer\RuntimeException - */ - protected function printHeader(TestResult $result): void - { - $this->write("\n" . Timer::resourceUsage() . "\n\n"); - } - - protected function formatClassName(Test $test): string - { - if ($test instanceof TestCase) { - return $this->prettifier->prettifyTestClass(\get_class($test)); - } - - return \get_class($test); - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function registerTestResult(Test $test, ?\Throwable $t, int $status, float $time, bool $verbose): void - { - if ($status !== BaseTestRunner::STATUS_PASSED) { - $this->nonSuccessfulTestResults[] = $this->testIndex; - } - - parent::registerTestResult($test, $t, $status, $time, $verbose); - } - - /** - * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException - */ - protected function formatTestName(Test $test): string - { - if ($test instanceof TestCase) { - return $this->prettifier->prettifyTestCase($test); - } - - return parent::formatTestName($test); - } - - protected function writeTestResult(array $prevResult, array $result): void - { - // spacer line for new suite headers and after verbose messages - if ($prevResult['testName'] !== '' && - (!empty($prevResult['message']) || $prevResult['className'] !== $result['className'])) { - $this->write(\PHP_EOL); - } - - // suite header - if ($prevResult['className'] !== $result['className']) { - $this->write($this->colorizeTextBox('underlined', $result['className']) . \PHP_EOL); - } - - // test result line - if ($this->colors && $result['className'] === PhptTestCase::class) { - $testName = Color::colorizePath($result['testName'], $prevResult['testName'], true); - } else { - $testName = $result['testMethod']; - } - - $style = self::STATUS_STYLES[$result['status']]; - $line = \sprintf( - ' %s %s%s' . \PHP_EOL, - $this->colorizeTextBox($style['color'], $style['symbol']), - $testName, - $this->verbose ? ' ' . $this->formatRuntime($result['time'], $style['color']) : '' - ); - - $this->write($line); - - // additional information when verbose - $this->write($result['message']); - } - - protected function formatThrowable(\Throwable $t, ?int $status = null): string - { - return \trim(\PHPUnit\Framework\TestFailure::exceptionToString($t)); - } - - protected function colorizeMessageAndDiff(string $style, string $buffer): array - { - $lines = $buffer ? \array_map('\rtrim', \explode(\PHP_EOL, $buffer)) : []; - $message = []; - $diff = []; - $insideDiff = false; - - foreach ($lines as $line) { - if ($line === '--- Expected') { - $insideDiff = true; - } - - if (!$insideDiff) { - $message[] = $line; - } else { - if (\strpos($line, '-') === 0) { - $line = Color::colorize('fg-red', Color::visualizeWhitespace($line, true)); - } elseif (\strpos($line, '+') === 0) { - $line = Color::colorize('fg-green', Color::visualizeWhitespace($line, true)); - } elseif ($line === '@@ @@') { - $line = Color::colorize('fg-cyan', $line); - } - $diff[] = $line; - } - } - $diff = \implode(\PHP_EOL, $diff); - - if (!empty($message)) { - $message = $this->colorizeTextBox($style, \implode(\PHP_EOL, $message)); - } - - return [$message, $diff]; - } - - protected function formatStacktrace(\Throwable $t): string - { - $trace = \PHPUnit\Util\Filter::getFilteredStacktrace($t); - - if (!$this->colors) { - return $trace; - } - - $lines = []; - $prevPath = ''; - - foreach (\explode(\PHP_EOL, $trace) as $line) { - if (\preg_match('/^(.*):(\d+)$/', $line, $matches)) { - $lines[] = Color::colorizePath($matches[1], $prevPath) . - Color::dim(':') . - Color::colorize('fg-blue', $matches[2]) . - "\n"; - $prevPath = $matches[1]; - } else { - $lines[] = $line; - $prevPath = ''; - } - } - - return \implode('', $lines); - } - - protected function formatTestResultMessage(\Throwable $t, array $result, ?string $prefix = null): string - { - $message = $this->formatThrowable($t, $result['status']); - $diff = ''; - - if (!($this->verbose || $result['verbose'])) { - return ''; - } - - if ($message && $this->colors) { - $style = self::STATUS_STYLES[$result['status']]['message'] ?? ''; - [$message, $diff] = $this->colorizeMessageAndDiff($style, $message); - } - - if ($prefix === null || !$this->colors) { - $prefix = self::PREFIX_SIMPLE; - } - - if ($this->colors) { - $color = self::STATUS_STYLES[$result['status']]['color'] ?? ''; - $prefix = \array_map(static function ($p) use ($color) { - return Color::colorize($color, $p); - }, self::PREFIX_DECORATED); - } - - $trace = $this->formatStacktrace($t); - $out = $this->prefixLines($prefix['start'], \PHP_EOL) . \PHP_EOL; - - if ($message) { - $out .= $this->prefixLines($prefix['message'], $message . \PHP_EOL) . \PHP_EOL; - } - - if ($diff) { - $out .= $this->prefixLines($prefix['diff'], $diff . \PHP_EOL) . \PHP_EOL; - } - - if ($trace) { - if ($message || $diff) { - $out .= $this->prefixLines($prefix['default'], \PHP_EOL) . \PHP_EOL; - } - $out .= $this->prefixLines($prefix['trace'], $trace . \PHP_EOL) . \PHP_EOL; - } - $out .= $this->prefixLines($prefix['last'], \PHP_EOL) . \PHP_EOL; - - return $out; - } - - protected function drawSpinner(): void - { - if ($this->colors) { - $id = $this->spinState % \count(self::SPINNER_ICONS); - $this->write(self::SPINNER_ICONS[$id]); - } - } - - protected function undrawSpinner(): void - { - if ($this->colors) { - $id = $this->spinState % \count(self::SPINNER_ICONS); - $this->write("\e[1K\e[" . \strlen(self::SPINNER_ICONS[$id]) . 'D'); - } - } - - private function formatRuntime(float $time, string $color = ''): string - { - if (!$this->colors) { - return \sprintf('[%.2f ms]', $time * 1000); - } - - if ($time > 1) { - $color = 'fg-magenta'; - } - - return Color::colorize($color, ' ' . (int) \ceil($time * 1000) . ' ' . Color::dim('ms')); - } - - private function printNonSuccessfulTestsSummary(int $numberOfExecutedTests): void - { - if (empty($this->nonSuccessfulTestResults)) { - return; - } - - if ((\count($this->nonSuccessfulTestResults) / $numberOfExecutedTests) >= 0.7) { - return; - } - - $this->write("Summary of non-successful tests:\n\n"); - - $prevResult = $this->getEmptyTestResult(); - - foreach ($this->nonSuccessfulTestResults as $testIndex) { - $result = $this->testResults[$testIndex]; - $this->writeTestResult($prevResult, $result); - $prevResult = $result; - } - } -} diff --git a/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php b/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php deleted file mode 100644 index 1beb8be..0000000 --- a/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php +++ /dev/null @@ -1,131 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ -namespace PHPUnit\Util\TestDox; - -/** - * @internal This class is not covered by the backward compatibility promise for PHPUnit - */ -final class HtmlResultPrinter extends ResultPrinter -{ - /** - * @var string - */ - private const PAGE_HEADER = << - - - - Test Documentation - - - -EOT; - - /** - * @var string - */ - private const CLASS_HEADER = <<%s -